]> git.proxmox.com Git - mirror_frr.git/blame - bgpd/bgp_vty.c
Merge pull request #292 from donaldsharp/sgrpt_prune
[mirror_frr.git] / bgpd / bgp_vty.c
CommitLineData
718e3744 1/* BGP VTY interface.
2 Copyright (C) 1996, 97, 98, 99, 2000 Kunihiro Ishiguro
3
4This file is part of GNU Zebra.
5
6GNU Zebra is free software; you can redistribute it and/or modify it
7under the terms of the GNU General Public License as published by the
8Free Software Foundation; either version 2, or (at your option) any
9later version.
10
11GNU Zebra is distributed in the hope that it will be useful, but
12WITHOUT ANY WARRANTY; without even the implied warranty of
13MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14General Public License for more details.
15
16You should have received a copy of the GNU General Public License
17along with GNU Zebra; see the file COPYING. If not, write to the Free
18Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
1902111-1307, USA. */
20
21#include <zebra.h>
22
23#include "command.h"
afec25d9 24#include "lib/json.h"
718e3744 25#include "prefix.h"
26#include "plist.h"
27#include "buffer.h"
28#include "linklist.h"
29#include "stream.h"
30#include "thread.h"
31#include "log.h"
3b8b1855 32#include "memory.h"
fc7948fa 33#include "memory_vty.h"
4bf6a362 34#include "hash.h"
3f9c7369 35#include "queue.h"
039f3a34 36#include "filter.h"
718e3744 37
38#include "bgpd/bgpd.h"
4bf6a362 39#include "bgpd/bgp_advertise.h"
718e3744 40#include "bgpd/bgp_attr.h"
41#include "bgpd/bgp_aspath.h"
42#include "bgpd/bgp_community.h"
4bf6a362 43#include "bgpd/bgp_ecommunity.h"
57d187bc 44#include "bgpd/bgp_lcommunity.h"
4bf6a362 45#include "bgpd/bgp_damp.h"
718e3744 46#include "bgpd/bgp_debug.h"
e0701b79 47#include "bgpd/bgp_fsm.h"
4bf6a362 48#include "bgpd/bgp_nexthop.h"
718e3744 49#include "bgpd/bgp_open.h"
4bf6a362 50#include "bgpd/bgp_regex.h"
718e3744 51#include "bgpd/bgp_route.h"
c016b6c7 52#include "bgpd/bgp_mplsvpn.h"
718e3744 53#include "bgpd/bgp_zebra.h"
fee0f4c6 54#include "bgpd/bgp_table.h"
94f2b392 55#include "bgpd/bgp_vty.h"
165b5fff 56#include "bgpd/bgp_mpath.h"
cb1faec9 57#include "bgpd/bgp_packet.h"
3f9c7369 58#include "bgpd/bgp_updgrp.h"
c43ed2e4 59#include "bgpd/bgp_bfd.h"
718e3744 60
20eb8864 61static struct peer_group *
62listen_range_exists (struct bgp *bgp, struct prefix *range, int exact);
63
718e3744 64/* Utility function to get address family from current node. */
65afi_t
66bgp_node_afi (struct vty *vty)
67{
4e851f1f
LB
68 afi_t afi;
69 switch (vty->node)
70 {
71 case BGP_IPV6_NODE:
72 case BGP_IPV6M_NODE:
73 case BGP_VPNV6_NODE:
74 case BGP_ENCAPV6_NODE:
75 afi = AFI_IP6;
76 break;
4e0b7b6d
PG
77 case BGP_EVPN_NODE:
78 afi = AFI_L2VPN;
79 break;
4e851f1f
LB
80 default:
81 afi = AFI_IP;
82 break;
83 }
84 return afi;
718e3744 85}
86
87/* Utility function to get subsequent address family from current
88 node. */
89safi_t
90bgp_node_safi (struct vty *vty)
91{
4e851f1f
LB
92 safi_t safi;
93 switch (vty->node)
94 {
95 case BGP_ENCAP_NODE:
96 case BGP_ENCAPV6_NODE:
97 safi = SAFI_ENCAP;
98 break;
99 case BGP_VPNV4_NODE:
100 case BGP_VPNV6_NODE:
101 safi = SAFI_MPLS_VPN;
102 break;
103 case BGP_IPV4M_NODE:
104 case BGP_IPV6M_NODE:
105 safi = SAFI_MULTICAST;
106 break;
4e0b7b6d
PG
107 case BGP_EVPN_NODE:
108 safi = SAFI_EVPN;
109 break;
4e851f1f
LB
110 default:
111 safi = SAFI_UNICAST;
112 break;
113 }
114 return safi;
718e3744 115}
116
46f296b4
LB
117/* supports <ipv4|ipv6> */
118afi_t
119bgp_vty_afi_from_arg(const char *afi_str)
8b1fb8be 120{
46f296b4
LB
121 afi_t afi = AFI_MAX; /* unknown */
122 if (!strcmp(afi_str, "ipv4")) {
123 afi = AFI_IP;
8b1fb8be 124 }
46f296b4
LB
125 else if (!strcmp(afi_str, "ipv6")) {
126 afi = AFI_IP6;
127 }
4e0b7b6d
PG
128 else if (!strcmp(afi_str, "l2vpn")) {
129 afi = AFI_L2VPN;
130 }
46f296b4
LB
131 return afi;
132}
133
134int
135bgp_parse_afi(const char *str, afi_t *afi)
136{
137 *afi = bgp_vty_afi_from_arg(str);
138 if (*afi != AFI_MAX)
139 return 0;
140 else
8b1fb8be
LB
141 return -1;
142}
143
46f296b4
LB
144int
145argv_find_and_parse_afi(struct cmd_token **argv, int argc, int *index, afi_t *afi)
146{
147 int ret = 0;
148 if (argv_find (argv, argc, "ipv4", index))
149 {
150 ret = 1;
151 if (afi)
152 *afi = AFI_IP;
153 }
154 else if (argv_find (argv, argc, "ipv6", index))
155 {
156 ret = 1;
157 if (afi)
158 *afi = AFI_IP6;
159 }
160 return ret;
161}
162
163/* supports <unicast|multicast|vpn|encap> */
ccbb332a 164safi_t
3b14d86e 165bgp_vty_safi_from_arg(const char *safi_str)
ccbb332a
LB
166{
167 safi_t safi = SAFI_MAX; /* unknown */
168 if (strncmp (safi_str, "m", 1) == 0)
169 safi = SAFI_MULTICAST;
170 else if (strncmp (safi_str, "u", 1) == 0)
171 safi = SAFI_UNICAST;
172 else if (strncmp (safi_str, "e", 1) == 0)
173 safi = SAFI_ENCAP;
174 else if (strncmp (safi_str, "v", 1) == 0)
46f296b4 175 safi = SAFI_MPLS_VPN;
ccbb332a
LB
176 return safi;
177}
178
8b1fb8be 179int
3289141f 180argv_find_and_parse_safi (struct cmd_token **argv, int argc, int *index, safi_t *safi)
46f296b4
LB
181{
182 int ret = 0;
183 if (argv_find (argv, argc, "unicast", index))
184 {
185 ret = 1;
186 if (safi)
187 *safi = SAFI_UNICAST;
188 }
189 else if (argv_find (argv, argc, "multicast", index))
190 {
191 ret = 1;
192 if (safi)
193 *safi = SAFI_MULTICAST;
194 }
195 else if (argv_find (argv, argc, "vpn", index))
196 {
197 ret = 1;
198 if (safi)
199 *safi = SAFI_MPLS_VPN;
200 }
201 else if (argv_find (argv, argc, "encap", index))
202 {
203 ret = 1;
204 if (safi)
205 *safi = SAFI_ENCAP;
206 }
4e0b7b6d
PG
207 else if (argv_find (argv, argc, "evpn", index))
208 {
209 ret = 1;
210 if (safi)
211 *safi = SAFI_EVPN;
212 }
46f296b4
LB
213 return ret;
214}
215
7eeee51e 216/*
f212a857 217 * bgp_vty_find_and_parse_afi_safi_bgp
7eeee51e 218 *
f212a857
DS
219 * For a given 'show ...' command, correctly parse the afi/safi/bgp out from it
220 * This function *assumes* that the calling function pre-sets the afi/safi/bgp
7eeee51e
DS
221 * to appropriate values for the calling function. This is to allow the
222 * calling function to make decisions appropriate for the show command
223 * that is being parsed.
224 *
225 * The show commands are generally of the form:
226 * "show [ip] bgp [<view|vrf> WORD] [<ipv4|ipv6> [<unicast|multicast|vpn|encap>]] ..."
227 *
228 * Since we use argv_find if the show command in particular doesn't have:
229 * [ip]
230 * [<view|vrf> WORD]
231 * [<ipv4|ipv6> [<unicast|multicast|vpn|encap>]]
232 * The command parsing should still be ok.
233 *
234 * vty -> The vty for the command so we can output some useful data in
235 * the event of a parse error in the vrf.
236 * argv -> The command tokens
237 * argc -> How many command tokens we have
238 * idx -> The current place in the command, generally should be 0 for this function
239 * afi -> The parsed afi if it was included in the show command, returned here
240 * safi -> The parsed safi if it was included in the show command, returned here
f212a857 241 * bgp -> Pointer to the bgp data structure we need to fill in.
7eeee51e
DS
242 *
243 * The function returns the correct location in the parse tree for the
244 * last token found.
0e37c258
DS
245 *
246 * Returns 0 for failure to parse correctly, else the idx position of where
247 * it found the last token.
7eeee51e 248 */
af462945 249int
f212a857
DS
250bgp_vty_find_and_parse_afi_safi_bgp (struct vty *vty, struct cmd_token **argv, int argc, int *idx,
251 afi_t *afi, safi_t *safi, struct bgp **bgp)
af462945
DS
252{
253 char *vrf_name = NULL;
254
b4898a38
DS
255 assert (afi);
256 assert (safi);
f212a857 257 assert (bgp);
b4898a38 258
9317e17d 259 if (argv_find (argv, argc, "ip", idx))
af462945
DS
260 *afi = AFI_IP;
261
9317e17d 262 if (argv_find (argv, argc, "view", idx) || argv_find (argv, argc, "vrf", idx))
af462945 263 {
9317e17d
DS
264 vrf_name = argv[*idx + 1]->arg;
265 *idx += 2;
af462945 266
f212a857
DS
267 if (strmatch (vrf_name, "all"))
268 *bgp = NULL;
af462945 269 else
f212a857
DS
270 {
271 *bgp = bgp_lookup_by_name (vrf_name);
272 if (!*bgp)
273 {
274 vty_out (vty, "View/Vrf specified is unknown: %s%s", vrf_name, VTY_NEWLINE);
275 *idx = 0;
276 return 0;
277 }
278 }
af462945 279 }
f212a857 280 else
af462945 281 {
f212a857
DS
282 *bgp = bgp_get_default ();
283 if (!*bgp)
284 {
285 vty_out (vty, "Unable to find default BGP instance%s", VTY_NEWLINE);
286 *idx = 0;
287 return 0;
288 }
af462945 289 }
9317e17d 290
f212a857
DS
291 if (argv_find_and_parse_afi (argv, argc, idx, afi))
292 argv_find_and_parse_safi (argv, argc, idx, safi);
293
9317e17d
DS
294 *idx += 1;
295 return *idx;
af462945
DS
296}
297
94f2b392 298static int
6aeb9e78 299peer_address_self_check (struct bgp *bgp, union sockunion *su)
718e3744 300{
301 struct interface *ifp = NULL;
302
303 if (su->sa.sa_family == AF_INET)
6aeb9e78 304 ifp = if_lookup_by_ipv4_exact (&su->sin.sin_addr, bgp->vrf_id);
718e3744 305 else if (su->sa.sa_family == AF_INET6)
f2345335 306 ifp = if_lookup_by_ipv6_exact (&su->sin6.sin6_addr,
6aeb9e78 307 su->sin6.sin6_scope_id, bgp->vrf_id);
718e3744 308
309 if (ifp)
310 return 1;
311
312 return 0;
313}
314
315/* Utility function for looking up peer from VTY. */
f14e6fdb
DS
316/* This is used only for configuration, so disallow if attempted on
317 * a dynamic neighbor.
318 */
94f2b392 319static struct peer *
fd79ac91 320peer_lookup_vty (struct vty *vty, const char *ip_str)
718e3744 321{
cdc2d765 322 struct bgp *bgp = VTY_GET_CONTEXT(bgp);
718e3744 323 int ret;
718e3744 324 union sockunion su;
325 struct peer *peer;
326
cdc2d765
DL
327 if (!bgp) {
328 return NULL;
329 }
718e3744 330
331 ret = str2sockunion (ip_str, &su);
332 if (ret < 0)
333 {
a80beece
DS
334 peer = peer_lookup_by_conf_if (bgp, ip_str);
335 if (!peer)
336 {
04b6bdc0
DW
337 if ((peer = peer_lookup_by_hostname(bgp, ip_str)) == NULL)
338 {
339 vty_out (vty, "%% Malformed address or name: %s%s", ip_str, VTY_NEWLINE);
340 return NULL;
341 }
a80beece 342 }
718e3744 343 }
a80beece 344 else
718e3744 345 {
a80beece
DS
346 peer = peer_lookup (bgp, &su);
347 if (! peer)
348 {
349 vty_out (vty, "%% Specify remote-as or peer-group commands first%s",
350 VTY_NEWLINE);
351 return NULL;
352 }
f14e6fdb
DS
353 if (peer_dynamic_neighbor (peer))
354 {
355 vty_out (vty, "%% Operation not allowed on a dynamic neighbor%s",
356 VTY_NEWLINE);
357 return NULL;
358 }
359
718e3744 360 }
361 return peer;
362}
363
364/* Utility function for looking up peer or peer group. */
f14e6fdb
DS
365/* This is used only for configuration, so disallow if attempted on
366 * a dynamic neighbor.
367 */
c43ed2e4 368struct peer *
fd79ac91 369peer_and_group_lookup_vty (struct vty *vty, const char *peer_str)
718e3744 370{
cdc2d765 371 struct bgp *bgp = VTY_GET_CONTEXT(bgp);
718e3744 372 int ret;
718e3744 373 union sockunion su;
f14e6fdb
DS
374 struct peer *peer = NULL;
375 struct peer_group *group = NULL;
718e3744 376
cdc2d765
DL
377 if (!bgp) {
378 return NULL;
379 }
718e3744 380
381 ret = str2sockunion (peer_str, &su);
382 if (ret == 0)
383 {
f14e6fdb 384 /* IP address, locate peer. */
718e3744 385 peer = peer_lookup (bgp, &su);
718e3744 386 }
387 else
388 {
f14e6fdb 389 /* Not IP, could match either peer configured on interface or a group. */
a80beece 390 peer = peer_lookup_by_conf_if (bgp, peer_str);
f14e6fdb
DS
391 if (!peer)
392 group = peer_group_lookup (bgp, peer_str);
393 }
a80beece 394
f14e6fdb
DS
395 if (peer)
396 {
397 if (peer_dynamic_neighbor (peer))
398 {
399 vty_out (vty, "%% Operation not allowed on a dynamic neighbor%s",
400 VTY_NEWLINE);
401 return NULL;
402 }
403
404 return peer;
718e3744 405 }
406
f14e6fdb
DS
407 if (group)
408 return group->conf;
409
718e3744 410 vty_out (vty, "%% Specify remote-as or peer-group commands first%s",
411 VTY_NEWLINE);
412
413 return NULL;
414}
415
c43ed2e4 416int
718e3744 417bgp_vty_return (struct vty *vty, int ret)
418{
fd79ac91 419 const char *str = NULL;
718e3744 420
421 switch (ret)
422 {
423 case BGP_ERR_INVALID_VALUE:
424 str = "Invalid value";
425 break;
426 case BGP_ERR_INVALID_FLAG:
427 str = "Invalid flag";
428 break;
718e3744 429 case BGP_ERR_PEER_GROUP_SHUTDOWN:
430 str = "Peer-group has been shutdown. Activate the peer-group first";
431 break;
718e3744 432 case BGP_ERR_PEER_FLAG_CONFLICT:
433 str = "Can't set override-capability and strict-capability-match at the same time";
434 break;
718e3744 435 case BGP_ERR_PEER_GROUP_NO_REMOTE_AS:
436 str = "Specify remote-as or peer-group remote AS first";
437 break;
438 case BGP_ERR_PEER_GROUP_CANT_CHANGE:
439 str = "Cannot change the peer-group. Deconfigure first";
440 break;
441 case BGP_ERR_PEER_GROUP_MISMATCH:
4c48cf63 442 str = "Peer is not a member of this peer-group";
718e3744 443 break;
444 case BGP_ERR_PEER_FILTER_CONFLICT:
445 str = "Prefix/distribute list can not co-exist";
446 break;
447 case BGP_ERR_NOT_INTERNAL_PEER:
448 str = "Invalid command. Not an internal neighbor";
449 break;
450 case BGP_ERR_REMOVE_PRIVATE_AS:
5000f21c 451 str = "remove-private-AS cannot be configured for IBGP peers";
718e3744 452 break;
453 case BGP_ERR_LOCAL_AS_ALLOWED_ONLY_FOR_EBGP:
454 str = "Local-AS allowed only for EBGP peers";
455 break;
456 case BGP_ERR_CANNOT_HAVE_LOCAL_AS_SAME_AS:
457 str = "Cannot have local-as same as BGP AS number";
458 break;
0df7c91f
PJ
459 case BGP_ERR_TCPSIG_FAILED:
460 str = "Error while applying TCP-Sig to session(s)";
461 break;
fa411a21
NH
462 case BGP_ERR_NO_EBGP_MULTIHOP_WITH_TTLHACK:
463 str = "ebgp-multihop and ttl-security cannot be configured together";
464 break;
f5a4827d
SH
465 case BGP_ERR_NO_IBGP_WITH_TTLHACK:
466 str = "ttl-security only allowed for EBGP peers";
467 break;
c7122e14
DS
468 case BGP_ERR_AS_OVERRIDE:
469 str = "as-override cannot be configured for IBGP peers";
470 break;
f14e6fdb
DS
471 case BGP_ERR_INVALID_DYNAMIC_NEIGHBORS_LIMIT:
472 str = "Invalid limit for number of dynamic neighbors";
473 break;
474 case BGP_ERR_DYNAMIC_NEIGHBORS_RANGE_EXISTS:
475 str = "Dynamic neighbor listen range already exists";
476 break;
477 case BGP_ERR_INVALID_FOR_DYNAMIC_PEER:
478 str = "Operation not allowed on a dynamic neighbor";
479 break;
63fa10b5
QY
480 case BGP_ERR_INVALID_FOR_DIRECT_PEER:
481 str = "Operation not allowed on a directly connected neighbor";
482 break;
718e3744 483 }
484 if (str)
485 {
486 vty_out (vty, "%% %s%s", str, VTY_NEWLINE);
487 return CMD_WARNING;
488 }
489 return CMD_SUCCESS;
490}
491
7aafcaca
DS
492/* BGP clear sort. */
493enum clear_sort
494{
495 clear_all,
496 clear_peer,
497 clear_group,
498 clear_external,
499 clear_as
500};
501
7aafcaca
DS
502static void
503bgp_clear_vty_error (struct vty *vty, struct peer *peer, afi_t afi,
504 safi_t safi, int error)
505{
506 switch (error)
507 {
508 case BGP_ERR_AF_UNCONFIGURED:
509 vty_out (vty,
46f296b4
LB
510 "%%BGP: Enable %s address family for the neighbor %s%s",
511 afi_safi_print(afi, safi), peer->host, VTY_NEWLINE);
7aafcaca
DS
512 break;
513 case BGP_ERR_SOFT_RECONFIG_UNCONFIGURED:
514 vty_out (vty, "%%BGP: Inbound soft reconfig for %s not possible as it%s has neither refresh capability, nor inbound soft reconfig%s", peer->host, VTY_NEWLINE, VTY_NEWLINE);
515 break;
516 default:
517 break;
518 }
519}
520
521/* `clear ip bgp' functions. */
522static int
523bgp_clear (struct vty *vty, struct bgp *bgp, afi_t afi, safi_t safi,
524 enum clear_sort sort,enum bgp_clear_type stype, const char *arg)
525{
526 int ret;
527 struct peer *peer;
528 struct listnode *node, *nnode;
529
530 /* Clear all neighbors. */
531 /*
532 * Pass along pointer to next node to peer_clear() when walking all nodes
533 * on the BGP instance as that may get freed if it is a doppelganger
534 */
535 if (sort == clear_all)
536 {
537 for (ALL_LIST_ELEMENTS (bgp->peer, node, nnode, peer))
538 {
539 if (stype == BGP_CLEAR_SOFT_NONE)
540 ret = peer_clear (peer, &nnode);
541 else if (peer->afc[afi][safi])
542 ret = peer_clear_soft (peer, afi, safi, stype);
543 else
544 ret = 0;
545
546 if (ret < 0)
547 bgp_clear_vty_error (vty, peer, afi, safi, ret);
548 }
549
550 /* This is to apply read-only mode on this clear. */
551 if (stype == BGP_CLEAR_SOFT_NONE)
552 bgp->update_delay_over = 0;
553
554 return CMD_SUCCESS;
555 }
556
557 /* Clear specified neighbors. */
558 if (sort == clear_peer)
559 {
560 union sockunion su;
561 int ret;
562
563 /* Make sockunion for lookup. */
564 ret = str2sockunion (arg, &su);
565 if (ret < 0)
566 {
567 peer = peer_lookup_by_conf_if (bgp, arg);
568 if (!peer)
569 {
04b6bdc0
DW
570 peer = peer_lookup_by_hostname(bgp, arg);
571 if (!peer)
572 {
573 vty_out (vty, "Malformed address or name: %s%s", arg, VTY_NEWLINE);
574 return CMD_WARNING;
575 }
7aafcaca
DS
576 }
577 }
578 else
579 {
580 peer = peer_lookup (bgp, &su);
581 if (! peer)
582 {
583 vty_out (vty, "%%BGP: Unknown neighbor - \"%s\"%s", arg, VTY_NEWLINE);
584 return CMD_WARNING;
585 }
586 }
587
588 if (stype == BGP_CLEAR_SOFT_NONE)
589 ret = peer_clear (peer, NULL);
590 else
591 ret = peer_clear_soft (peer, afi, safi, stype);
592
593 if (ret < 0)
594 bgp_clear_vty_error (vty, peer, afi, safi, ret);
595
596 return CMD_SUCCESS;
597 }
598
599 /* Clear all peer-group members. */
600 if (sort == clear_group)
601 {
602 struct peer_group *group;
603
604 group = peer_group_lookup (bgp, arg);
605 if (! group)
606 {
607 vty_out (vty, "%%BGP: No such peer-group %s%s", arg, VTY_NEWLINE);
608 return CMD_WARNING;
609 }
610
611 for (ALL_LIST_ELEMENTS (group->peer, node, nnode, peer))
612 {
613 if (stype == BGP_CLEAR_SOFT_NONE)
614 {
18f1dc06 615 peer_clear (peer, NULL);
7aafcaca
DS
616 continue;
617 }
618
c8560b44 619 if (! peer->afc[afi][safi])
7aafcaca
DS
620 continue;
621
622 ret = peer_clear_soft (peer, afi, safi, stype);
623
624 if (ret < 0)
625 bgp_clear_vty_error (vty, peer, afi, safi, ret);
626 }
627 return CMD_SUCCESS;
628 }
629
630 if (sort == clear_external)
631 {
632 for (ALL_LIST_ELEMENTS (bgp->peer, node, nnode, peer))
633 {
634 if (peer->sort == BGP_PEER_IBGP)
635 continue;
636
637 if (stype == BGP_CLEAR_SOFT_NONE)
638 ret = peer_clear (peer, &nnode);
639 else
640 ret = peer_clear_soft (peer, afi, safi, stype);
641
642 if (ret < 0)
643 bgp_clear_vty_error (vty, peer, afi, safi, ret);
644 }
645 return CMD_SUCCESS;
646 }
647
648 if (sort == clear_as)
649 {
650 as_t as;
651 int find = 0;
652
653 VTY_GET_INTEGER_RANGE ("AS", as, arg, 1, BGP_AS4_MAX);
654
655 for (ALL_LIST_ELEMENTS (bgp->peer, node, nnode, peer))
656 {
657 if (peer->as != as)
658 continue;
659
660 find = 1;
661 if (stype == BGP_CLEAR_SOFT_NONE)
662 ret = peer_clear (peer, &nnode);
663 else
664 ret = peer_clear_soft (peer, afi, safi, stype);
665
666 if (ret < 0)
667 bgp_clear_vty_error (vty, peer, afi, safi, ret);
668 }
669 if (! find)
670 vty_out (vty, "%%BGP: No peer is configured with AS %s%s", arg,
671 VTY_NEWLINE);
672 return CMD_SUCCESS;
673 }
674
675 return CMD_SUCCESS;
676}
677
678static int
679bgp_clear_vty (struct vty *vty, const char *name, afi_t afi, safi_t safi,
680 enum clear_sort sort, enum bgp_clear_type stype,
681 const char *arg)
682{
683 struct bgp *bgp;
684
685 /* BGP structure lookup. */
686 if (name)
687 {
688 bgp = bgp_lookup_by_name (name);
689 if (bgp == NULL)
690 {
6aeb9e78 691 vty_out (vty, "Can't find BGP instance %s%s", name, VTY_NEWLINE);
7aafcaca
DS
692 return CMD_WARNING;
693 }
694 }
695 else
696 {
f31fa004 697 bgp = bgp_get_default ();
7aafcaca
DS
698 if (bgp == NULL)
699 {
700 vty_out (vty, "No BGP process is configured%s", VTY_NEWLINE);
701 return CMD_WARNING;
702 }
703 }
704
705 return bgp_clear (vty, bgp, afi, safi, sort, stype, arg);
706}
707
708/* clear soft inbound */
709static void
f31fa004 710bgp_clear_star_soft_in (struct vty *vty, const char *name)
7aafcaca 711{
b09b5ae0 712 bgp_clear_vty (vty, name, AFI_IP, SAFI_UNICAST, clear_all,
7aafcaca 713 BGP_CLEAR_SOFT_IN, NULL);
f31fa004 714 bgp_clear_vty (vty, name, AFI_IP6, SAFI_UNICAST, clear_all,
7aafcaca 715 BGP_CLEAR_SOFT_IN, NULL);
7aafcaca
DS
716}
717
718/* clear soft outbound */
719static void
f31fa004 720bgp_clear_star_soft_out (struct vty *vty, const char *name)
7aafcaca 721{
f31fa004 722 bgp_clear_vty (vty, name, AFI_IP, SAFI_UNICAST, clear_all,
7aafcaca 723 BGP_CLEAR_SOFT_OUT, NULL);
f31fa004 724 bgp_clear_vty (vty, name, AFI_IP6, SAFI_UNICAST, clear_all,
7aafcaca 725 BGP_CLEAR_SOFT_OUT, NULL);
7aafcaca
DS
726}
727
728
718e3744 729/* BGP global configuration. */
730
731DEFUN (bgp_multiple_instance_func,
732 bgp_multiple_instance_cmd,
733 "bgp multiple-instance",
734 BGP_STR
735 "Enable bgp multiple instance\n")
736{
737 bgp_option_set (BGP_OPT_MULTIPLE_INSTANCE);
738 return CMD_SUCCESS;
739}
740
741DEFUN (no_bgp_multiple_instance,
742 no_bgp_multiple_instance_cmd,
743 "no bgp multiple-instance",
744 NO_STR
745 BGP_STR
746 "BGP multiple instance\n")
747{
748 int ret;
749
750 ret = bgp_option_unset (BGP_OPT_MULTIPLE_INSTANCE);
751 if (ret < 0)
752 {
753 vty_out (vty, "%% There are more than two BGP instances%s", VTY_NEWLINE);
754 return CMD_WARNING;
755 }
756 return CMD_SUCCESS;
757}
758
759DEFUN (bgp_config_type,
760 bgp_config_type_cmd,
6147e2c6 761 "bgp config-type <cisco|zebra>",
718e3744 762 BGP_STR
763 "Configuration type\n"
764 "cisco\n"
765 "zebra\n")
766{
c500ae40
DW
767 int idx_vendor = 2;
768 if (strncmp (argv[idx_vendor]->arg, "c", 1) == 0)
718e3744 769 bgp_option_set (BGP_OPT_CONFIG_CISCO);
770 else
771 bgp_option_unset (BGP_OPT_CONFIG_CISCO);
772
773 return CMD_SUCCESS;
774}
775
776DEFUN (no_bgp_config_type,
777 no_bgp_config_type_cmd,
c7178fe7 778 "no bgp config-type [<cisco|zebra>]",
718e3744 779 NO_STR
780 BGP_STR
838758ac
DW
781 "Display configuration type\n"
782 "cisco\n"
783 "zebra\n")
718e3744 784{
785 bgp_option_unset (BGP_OPT_CONFIG_CISCO);
786 return CMD_SUCCESS;
787}
788
813d4307 789
718e3744 790DEFUN (no_synchronization,
791 no_synchronization_cmd,
792 "no synchronization",
793 NO_STR
794 "Perform IGP synchronization\n")
795{
796 return CMD_SUCCESS;
797}
798
799DEFUN (no_auto_summary,
800 no_auto_summary_cmd,
801 "no auto-summary",
802 NO_STR
803 "Enable automatic network number summarization\n")
804{
805 return CMD_SUCCESS;
806}
3d515fd9 807
718e3744 808/* "router bgp" commands. */
f412b39a
DW
809DEFUN (router_bgp,
810 router_bgp_cmd,
31500417 811 "router bgp [(1-4294967295) [<view|vrf> WORD]]",
718e3744 812 ROUTER_STR
813 BGP_STR
31500417
DW
814 AS_STR
815 BGP_INSTANCE_HELP_STR)
718e3744 816{
31500417
DW
817 int idx_asn = 2;
818 int idx_view_vrf = 3;
819 int idx_vrf = 4;
718e3744 820 int ret;
821 as_t as;
822 struct bgp *bgp;
fd79ac91 823 const char *name = NULL;
ad4cbda1 824 enum bgp_instance_type inst_type;
718e3744 825
2385a876 826 // "router bgp" without an ASN
31500417 827 if (argc == 2)
2385a876 828 {
6aeb9e78 829 //Pending: Make VRF option available for ASN less config
2385a876 830 bgp = bgp_get_default();
718e3744 831
2385a876
DW
832 if (bgp == NULL)
833 {
834 vty_out (vty, "%% No BGP process is configured%s", VTY_NEWLINE);
835 return CMD_WARNING;
836 }
718e3744 837
2385a876
DW
838 if (listcount(bm->bgp) > 1)
839 {
840 vty_out (vty, "%% Multiple BGP processes are configured%s", VTY_NEWLINE);
841 return CMD_WARNING;
842 }
843 }
844
845 // "router bgp X"
846 else
718e3744 847 {
31500417 848 VTY_GET_INTEGER_RANGE ("AS", as, argv[idx_asn]->arg, 1, BGP_AS4_MAX);
2385a876 849
ad4cbda1 850 inst_type = BGP_INSTANCE_TYPE_DEFAULT;
31500417 851 if (argc > 3)
ad4cbda1 852 {
31500417
DW
853 name = argv[idx_vrf]->arg;
854
e52702f2 855 if (!strcmp(argv[idx_view_vrf]->text, "vrf"))
ad4cbda1 856 inst_type = BGP_INSTANCE_TYPE_VRF;
e52702f2 857 else if (!strcmp(argv[idx_view_vrf]->text, "view"))
ad4cbda1 858 inst_type = BGP_INSTANCE_TYPE_VIEW;
859 }
2385a876 860
ad4cbda1 861 ret = bgp_get (&bgp, &as, name, inst_type);
2385a876
DW
862 switch (ret)
863 {
864 case BGP_ERR_MULTIPLE_INSTANCE_NOT_SET:
865 vty_out (vty, "Please specify 'bgp multiple-instance' first%s",
866 VTY_NEWLINE);
867 return CMD_WARNING;
868 case BGP_ERR_AS_MISMATCH:
869 vty_out (vty, "BGP is already running; AS is %u%s", as, VTY_NEWLINE);
870 return CMD_WARNING;
871 case BGP_ERR_INSTANCE_MISMATCH:
6aeb9e78 872 vty_out (vty, "BGP instance name and AS number mismatch%s", VTY_NEWLINE);
2385a876
DW
873 vty_out (vty, "BGP instance is already running; AS is %u%s",
874 as, VTY_NEWLINE);
875 return CMD_WARNING;
876 }
6aeb9e78
DS
877
878 /* Pending: handle when user tries to change a view to vrf n vv. */
718e3744 879 }
880
cdc2d765 881 VTY_PUSH_CONTEXT(BGP_NODE, bgp);
718e3744 882
883 return CMD_SUCCESS;
884}
885
718e3744 886/* "no router bgp" commands. */
887DEFUN (no_router_bgp,
888 no_router_bgp_cmd,
31500417 889 "no router bgp [(1-4294967295) [<view|vrf> WORD]]",
718e3744 890 NO_STR
891 ROUTER_STR
892 BGP_STR
31500417
DW
893 AS_STR
894 BGP_INSTANCE_HELP_STR)
718e3744 895{
31500417 896 int idx_asn = 3;
31500417 897 int idx_vrf = 5;
718e3744 898 as_t as;
899 struct bgp *bgp;
fd79ac91 900 const char *name = NULL;
718e3744 901
7fb21a9f 902 // "no router bgp" without an ASN
31500417 903 if (argc == 3)
7fb21a9f
QY
904 {
905 //Pending: Make VRF option available for ASN less config
906 bgp = bgp_get_default();
718e3744 907
7fb21a9f
QY
908 if (bgp == NULL)
909 {
910 vty_out (vty, "%% No BGP process is configured%s", VTY_NEWLINE);
911 return CMD_WARNING;
912 }
913
914 if (listcount(bm->bgp) > 1)
915 {
916 vty_out (vty, "%% Multiple BGP processes are configured%s", VTY_NEWLINE);
917 return CMD_WARNING;
918 }
919 }
920 else
718e3744 921 {
31500417 922 VTY_GET_INTEGER_RANGE ("AS", as, argv[idx_asn]->arg, 1, BGP_AS4_MAX);
7fb21a9f 923
31500417
DW
924 if (argc > 4)
925 name = argv[idx_vrf]->arg;
7fb21a9f
QY
926
927 /* Lookup bgp structure. */
928 bgp = bgp_lookup (as, name);
929 if (! bgp)
930 {
931 vty_out (vty, "%% Can't find BGP instance%s", VTY_NEWLINE);
932 return CMD_WARNING;
933 }
718e3744 934 }
935
936 bgp_delete (bgp);
937
938 return CMD_SUCCESS;
939}
940
6b0655a2 941
7fb21a9f 942
718e3744 943/* BGP router-id. */
944
945DEFUN (bgp_router_id,
946 bgp_router_id_cmd,
947 "bgp router-id A.B.C.D",
948 BGP_STR
949 "Override configured router identifier\n"
950 "Manually configured router identifier\n")
951{
cdc2d765 952 VTY_DECLVAR_CONTEXT(bgp, bgp);
c500ae40 953 int idx_ipv4 = 2;
718e3744 954 int ret;
955 struct in_addr id;
718e3744 956
c500ae40 957 ret = inet_aton (argv[idx_ipv4]->arg, &id);
718e3744 958 if (! ret)
959 {
960 vty_out (vty, "%% Malformed bgp router identifier%s", VTY_NEWLINE);
961 return CMD_WARNING;
962 }
963
0e6cb743 964 bgp_router_id_static_set (bgp, id);
718e3744 965
966 return CMD_SUCCESS;
967}
968
969DEFUN (no_bgp_router_id,
970 no_bgp_router_id_cmd,
31500417 971 "no bgp router-id [A.B.C.D]",
718e3744 972 NO_STR
973 BGP_STR
31500417
DW
974 "Override configured router identifier\n"
975 "Manually configured router identifier\n")
718e3744 976{
cdc2d765 977 VTY_DECLVAR_CONTEXT(bgp, bgp);
31500417 978 int idx_router_id = 3;
718e3744 979 int ret;
980 struct in_addr id;
718e3744 981
31500417 982 if (argc > idx_router_id)
718e3744 983 {
31500417 984 ret = inet_aton (argv[idx_router_id]->arg, &id);
718e3744 985 if (! ret)
e018c7cc
SK
986 {
987 vty_out (vty, "%% Malformed BGP router identifier%s", VTY_NEWLINE);
988 return CMD_WARNING;
989 }
718e3744 990
18a6dce6 991 if (! IPV4_ADDR_SAME (&bgp->router_id_static, &id))
e018c7cc
SK
992 {
993 vty_out (vty, "%% BGP router-id doesn't match%s", VTY_NEWLINE);
994 return CMD_WARNING;
995 }
718e3744 996 }
997
0e6cb743
DL
998 id.s_addr = 0;
999 bgp_router_id_static_set (bgp, id);
718e3744 1000
1001 return CMD_SUCCESS;
1002}
1003
6b0655a2 1004
718e3744 1005/* BGP Cluster ID. */
718e3744 1006DEFUN (bgp_cluster_id,
1007 bgp_cluster_id_cmd,
838758ac 1008 "bgp cluster-id <A.B.C.D|(1-4294967295)>",
718e3744 1009 BGP_STR
1010 "Configure Route-Reflector Cluster-id\n"
838758ac
DW
1011 "Route-Reflector Cluster-id in IP address format\n"
1012 "Route-Reflector Cluster-id as 32 bit quantity\n")
718e3744 1013{
cdc2d765 1014 VTY_DECLVAR_CONTEXT(bgp, bgp);
c500ae40 1015 int idx_ipv4 = 2;
718e3744 1016 int ret;
718e3744 1017 struct in_addr cluster;
1018
c500ae40 1019 ret = inet_aton (argv[idx_ipv4]->arg, &cluster);
718e3744 1020 if (! ret)
1021 {
1022 vty_out (vty, "%% Malformed bgp cluster identifier%s", VTY_NEWLINE);
1023 return CMD_WARNING;
1024 }
1025
1026 bgp_cluster_id_set (bgp, &cluster);
f31fa004 1027 bgp_clear_star_soft_out (vty, bgp->name);
718e3744 1028
1029 return CMD_SUCCESS;
1030}
1031
718e3744 1032DEFUN (no_bgp_cluster_id,
1033 no_bgp_cluster_id_cmd,
c7178fe7 1034 "no bgp cluster-id [<A.B.C.D|(1-4294967295)>]",
718e3744 1035 NO_STR
1036 BGP_STR
838758ac
DW
1037 "Configure Route-Reflector Cluster-id\n"
1038 "Route-Reflector Cluster-id in IP address format\n"
1039 "Route-Reflector Cluster-id as 32 bit quantity\n")
718e3744 1040{
cdc2d765 1041 VTY_DECLVAR_CONTEXT(bgp, bgp);
718e3744 1042 bgp_cluster_id_unset (bgp);
f31fa004 1043 bgp_clear_star_soft_out (vty, bgp->name);
718e3744 1044
1045 return CMD_SUCCESS;
1046}
1047
718e3744 1048DEFUN (bgp_confederation_identifier,
1049 bgp_confederation_identifier_cmd,
9ccf14f7 1050 "bgp confederation identifier (1-4294967295)",
718e3744 1051 "BGP specific commands\n"
1052 "AS confederation parameters\n"
1053 "AS number\n"
1054 "Set routing domain confederation AS\n")
1055{
cdc2d765 1056 VTY_DECLVAR_CONTEXT(bgp, bgp);
c500ae40 1057 int idx_number = 3;
718e3744 1058 as_t as;
1059
c500ae40 1060 VTY_GET_INTEGER_RANGE ("AS", as, argv[idx_number]->arg, 1, BGP_AS4_MAX);
718e3744 1061
1062 bgp_confederation_id_set (bgp, as);
1063
1064 return CMD_SUCCESS;
1065}
1066
1067DEFUN (no_bgp_confederation_identifier,
1068 no_bgp_confederation_identifier_cmd,
838758ac 1069 "no bgp confederation identifier [(1-4294967295)]",
718e3744 1070 NO_STR
1071 "BGP specific commands\n"
1072 "AS confederation parameters\n"
3a2d747c
QY
1073 "AS number\n"
1074 "Set routing domain confederation AS\n")
718e3744 1075{
cdc2d765 1076 VTY_DECLVAR_CONTEXT(bgp, bgp);
718e3744 1077 bgp_confederation_id_unset (bgp);
1078
1079 return CMD_SUCCESS;
1080}
1081
718e3744 1082DEFUN (bgp_confederation_peers,
1083 bgp_confederation_peers_cmd,
12dcf78e 1084 "bgp confederation peers (1-4294967295)...",
718e3744 1085 "BGP specific commands\n"
1086 "AS confederation parameters\n"
1087 "Peer ASs in BGP confederation\n"
1088 AS_STR)
1089{
cdc2d765 1090 VTY_DECLVAR_CONTEXT(bgp, bgp);
58749582 1091 int idx_asn = 3;
718e3744 1092 as_t as;
1093 int i;
1094
58749582 1095 for (i = idx_asn; i < argc; i++)
718e3744 1096 {
afec25d9 1097 VTY_GET_INTEGER_RANGE ("AS", as, argv[i]->arg, 1, BGP_AS4_MAX);
718e3744 1098
1099 if (bgp->as == as)
1100 {
1101 vty_out (vty, "%% Local member-AS not allowed in confed peer list%s",
1102 VTY_NEWLINE);
1103 continue;
1104 }
1105
1106 bgp_confederation_peers_add (bgp, as);
1107 }
1108 return CMD_SUCCESS;
1109}
1110
1111DEFUN (no_bgp_confederation_peers,
1112 no_bgp_confederation_peers_cmd,
e83a9414 1113 "no bgp confederation peers (1-4294967295)...",
718e3744 1114 NO_STR
1115 "BGP specific commands\n"
1116 "AS confederation parameters\n"
1117 "Peer ASs in BGP confederation\n"
1118 AS_STR)
1119{
cdc2d765 1120 VTY_DECLVAR_CONTEXT(bgp, bgp);
58749582 1121 int idx_asn = 4;
718e3744 1122 as_t as;
1123 int i;
1124
58749582 1125 for (i = idx_asn; i < argc; i++)
718e3744 1126 {
afec25d9 1127 VTY_GET_INTEGER_RANGE ("AS", as, argv[i]->arg, 1, BGP_AS4_MAX);
0b2aa3a0 1128
718e3744 1129 bgp_confederation_peers_remove (bgp, as);
1130 }
1131 return CMD_SUCCESS;
1132}
6b0655a2 1133
5e242b0d
DS
1134/**
1135 * Central routine for maximum-paths configuration.
1136 * @peer_type: BGP_PEER_EBGP or BGP_PEER_IBGP
1137 * @set: 1 for setting values, 0 for removing the max-paths config.
1138 */
ffd0c037
DS
1139static int
1140bgp_maxpaths_config_vty (struct vty *vty, int peer_type, const char *mpaths,
5e242b0d 1141 u_int16_t options, int set)
165b5fff 1142{
cdc2d765 1143 VTY_DECLVAR_CONTEXT(bgp, bgp);
4c9dee98 1144 u_int16_t maxpaths = 0;
165b5fff 1145 int ret;
5e242b0d
DS
1146 afi_t afi;
1147 safi_t safi;
165b5fff 1148
5e242b0d
DS
1149 afi = bgp_node_afi (vty);
1150 safi = bgp_node_safi (vty);
165b5fff 1151
5e242b0d 1152 if (set)
4c9dee98 1153 {
c59f2066 1154 maxpaths = strtol(mpaths, NULL, 10);
37fe7731
DS
1155 if (maxpaths > multipath_num)
1156 {
1157 vty_out (vty,
1158 "%% Maxpaths Specified: %d is > than multipath num specified on bgp command line %d",
1159 maxpaths, multipath_num);
1160 return CMD_WARNING;
1161 }
dff6764a 1162 ret = bgp_maximum_paths_set (bgp, afi, safi, peer_type, maxpaths, options);
4c9dee98 1163 }
5e242b0d
DS
1164 else
1165 ret = bgp_maximum_paths_unset (bgp, afi, safi, peer_type);
165b5fff 1166
165b5fff
JB
1167 if (ret < 0)
1168 {
1169 vty_out (vty,
5e242b0d
DS
1170 "%% Failed to %sset maximum-paths %s %u for afi %u, safi %u%s",
1171 (set == 1) ? "" : "un",
1172 (peer_type == BGP_PEER_EBGP) ? "ebgp" : "ibgp",
1173 maxpaths, afi, safi, VTY_NEWLINE);
165b5fff
JB
1174 return CMD_WARNING;
1175 }
1176
7aafcaca
DS
1177 bgp_recalculate_all_bestpaths (bgp);
1178
165b5fff
JB
1179 return CMD_SUCCESS;
1180}
1181
abc920f8
DS
1182DEFUN (bgp_maxmed_admin,
1183 bgp_maxmed_admin_cmd,
1184 "bgp max-med administrative ",
1185 BGP_STR
1186 "Advertise routes with max-med\n"
1187 "Administratively applied, for an indefinite period\n")
1188{
cdc2d765 1189 VTY_DECLVAR_CONTEXT(bgp, bgp);
abc920f8
DS
1190
1191 bgp->v_maxmed_admin = 1;
1192 bgp->maxmed_admin_value = BGP_MAXMED_VALUE_DEFAULT;
1193
1194 bgp_maxmed_update(bgp);
1195
1196 return CMD_SUCCESS;
1197}
1198
1199DEFUN (bgp_maxmed_admin_medv,
1200 bgp_maxmed_admin_medv_cmd,
6147e2c6 1201 "bgp max-med administrative (0-4294967294)",
abc920f8
DS
1202 BGP_STR
1203 "Advertise routes with max-med\n"
1204 "Administratively applied, for an indefinite period\n"
1205 "Max MED value to be used\n")
1206{
cdc2d765 1207 VTY_DECLVAR_CONTEXT(bgp, bgp);
c500ae40 1208 int idx_number = 3;
abc920f8
DS
1209
1210 bgp->v_maxmed_admin = 1;
c500ae40 1211 VTY_GET_INTEGER ("max-med admin med-value", bgp->maxmed_admin_value, argv[idx_number]->arg);
abc920f8
DS
1212
1213 bgp_maxmed_update(bgp);
1214
1215 return CMD_SUCCESS;
1216}
1217
1218DEFUN (no_bgp_maxmed_admin,
1219 no_bgp_maxmed_admin_cmd,
8334fd5a 1220 "no bgp max-med administrative [(0-4294967294)]",
abc920f8
DS
1221 NO_STR
1222 BGP_STR
1223 "Advertise routes with max-med\n"
838758ac
DW
1224 "Administratively applied, for an indefinite period\n"
1225 "Max MED value to be used\n")
abc920f8 1226{
cdc2d765 1227 VTY_DECLVAR_CONTEXT(bgp, bgp);
abc920f8
DS
1228 bgp->v_maxmed_admin = BGP_MAXMED_ADMIN_UNCONFIGURED;
1229 bgp->maxmed_admin_value = BGP_MAXMED_VALUE_DEFAULT;
abc920f8
DS
1230 bgp_maxmed_update(bgp);
1231
1232 return CMD_SUCCESS;
1233}
1234
abc920f8
DS
1235DEFUN (bgp_maxmed_onstartup,
1236 bgp_maxmed_onstartup_cmd,
6147e2c6 1237 "bgp max-med on-startup (5-86400)",
abc920f8
DS
1238 BGP_STR
1239 "Advertise routes with max-med\n"
1240 "Effective on a startup\n"
1241 "Time (seconds) period for max-med\n")
1242{
cdc2d765 1243 VTY_DECLVAR_CONTEXT(bgp, bgp);
c500ae40 1244 int idx_number = 3;
c500ae40 1245 VTY_GET_INTEGER ("max-med on-startup period", bgp->v_maxmed_onstartup, argv[idx_number]->arg);
abc920f8 1246 bgp->maxmed_onstartup_value = BGP_MAXMED_VALUE_DEFAULT;
abc920f8
DS
1247 bgp_maxmed_update(bgp);
1248
1249 return CMD_SUCCESS;
1250}
1251
1252DEFUN (bgp_maxmed_onstartup_medv,
1253 bgp_maxmed_onstartup_medv_cmd,
6147e2c6 1254 "bgp max-med on-startup (5-86400) (0-4294967294)",
abc920f8
DS
1255 BGP_STR
1256 "Advertise routes with max-med\n"
1257 "Effective on a startup\n"
1258 "Time (seconds) period for max-med\n"
1259 "Max MED value to be used\n")
1260{
cdc2d765 1261 VTY_DECLVAR_CONTEXT(bgp, bgp);
c500ae40
DW
1262 int idx_number = 3;
1263 int idx_number_2 = 4;
c500ae40
DW
1264 VTY_GET_INTEGER ("max-med on-startup period", bgp->v_maxmed_onstartup, argv[idx_number]->arg);
1265 VTY_GET_INTEGER ("max-med on-startup med-value", bgp->maxmed_onstartup_value, argv[idx_number_2]->arg);
abc920f8
DS
1266 bgp_maxmed_update(bgp);
1267
1268 return CMD_SUCCESS;
1269}
1270
1271DEFUN (no_bgp_maxmed_onstartup,
1272 no_bgp_maxmed_onstartup_cmd,
8334fd5a 1273 "no bgp max-med on-startup [(5-86400) [(0-4294967294)]]",
abc920f8
DS
1274 NO_STR
1275 BGP_STR
1276 "Advertise routes with max-med\n"
838758ac
DW
1277 "Effective on a startup\n"
1278 "Time (seconds) period for max-med\n"
1279 "Max MED value to be used\n")
abc920f8 1280{
cdc2d765 1281 VTY_DECLVAR_CONTEXT(bgp, bgp);
abc920f8
DS
1282
1283 /* Cancel max-med onstartup if its on */
1284 if (bgp->t_maxmed_onstartup)
1285 {
1286 THREAD_TIMER_OFF (bgp->t_maxmed_onstartup);
1287 bgp->maxmed_onstartup_over = 1;
1288 }
1289
1290 bgp->v_maxmed_onstartup = BGP_MAXMED_ONSTARTUP_UNCONFIGURED;
1291 bgp->maxmed_onstartup_value = BGP_MAXMED_VALUE_DEFAULT;
1292
1293 bgp_maxmed_update(bgp);
1294
1295 return CMD_SUCCESS;
1296}
1297
f188f2c4
DS
1298static int
1299bgp_update_delay_config_vty (struct vty *vty, const char *delay,
1300 const char *wait)
1301{
cdc2d765 1302 VTY_DECLVAR_CONTEXT(bgp, bgp);
f188f2c4
DS
1303 u_int16_t update_delay;
1304 u_int16_t establish_wait;
1305
f188f2c4
DS
1306 VTY_GET_INTEGER_RANGE ("update-delay", update_delay, delay,
1307 BGP_UPDATE_DELAY_MIN, BGP_UPDATE_DELAY_MAX);
1308
1309 if (!wait) /* update-delay <delay> */
1310 {
1311 bgp->v_update_delay = update_delay;
1312 bgp->v_establish_wait = bgp->v_update_delay;
1313 return CMD_SUCCESS;
1314 }
1315
1316 /* update-delay <delay> <establish-wait> */
1317 establish_wait = atoi (wait);
1318 if (update_delay < establish_wait)
1319 {
1320 vty_out (vty, "%%Failed: update-delay less than the establish-wait!%s",
1321 VTY_NEWLINE);
1322 return CMD_WARNING;
1323 }
1324
1325 bgp->v_update_delay = update_delay;
1326 bgp->v_establish_wait = establish_wait;
1327
1328 return CMD_SUCCESS;
1329}
1330
1331static int
1332bgp_update_delay_deconfig_vty (struct vty *vty)
1333{
cdc2d765 1334 VTY_DECLVAR_CONTEXT(bgp, bgp);
f188f2c4
DS
1335
1336 bgp->v_update_delay = BGP_UPDATE_DELAY_DEF;
1337 bgp->v_establish_wait = bgp->v_update_delay;
1338
1339 return CMD_SUCCESS;
1340}
1341
1342int
1343bgp_config_write_update_delay (struct vty *vty, struct bgp *bgp)
1344{
1345 if (bgp->v_update_delay != BGP_UPDATE_DELAY_DEF)
1346 {
1347 vty_out (vty, " update-delay %d", bgp->v_update_delay);
1348 if (bgp->v_update_delay != bgp->v_establish_wait)
1349 vty_out (vty, " %d", bgp->v_establish_wait);
1350 vty_out (vty, "%s", VTY_NEWLINE);
1351 }
1352
1353 return 0;
1354}
1355
1356
1357/* Update-delay configuration */
1358DEFUN (bgp_update_delay,
1359 bgp_update_delay_cmd,
6147e2c6 1360 "update-delay (0-3600)",
f188f2c4
DS
1361 "Force initial delay for best-path and updates\n"
1362 "Seconds\n")
1363{
c500ae40
DW
1364 int idx_number = 1;
1365 return bgp_update_delay_config_vty(vty, argv[idx_number]->arg, NULL);
f188f2c4
DS
1366}
1367
1368DEFUN (bgp_update_delay_establish_wait,
1369 bgp_update_delay_establish_wait_cmd,
6147e2c6 1370 "update-delay (0-3600) (1-3600)",
f188f2c4
DS
1371 "Force initial delay for best-path and updates\n"
1372 "Seconds\n"
1373 "Wait for peers to be established\n"
1374 "Seconds\n")
1375{
c500ae40
DW
1376 int idx_number = 1;
1377 int idx_number_2 = 2;
1378 return bgp_update_delay_config_vty(vty, argv[idx_number]->arg, argv[idx_number_2]->arg);
f188f2c4
DS
1379}
1380
1381/* Update-delay deconfiguration */
1382DEFUN (no_bgp_update_delay,
1383 no_bgp_update_delay_cmd,
838758ac
DW
1384 "no update-delay [(0-3600) [(1-3600)]]",
1385 NO_STR
f188f2c4 1386 "Force initial delay for best-path and updates\n"
838758ac
DW
1387 "Seconds\n"
1388 "Wait for peers to be established\n")
f188f2c4
DS
1389{
1390 return bgp_update_delay_deconfig_vty(vty);
1391}
1392
5e242b0d 1393
ffd0c037
DS
1394static int
1395bgp_wpkt_quanta_config_vty (struct vty *vty, const char *num, char set)
cb1faec9 1396{
cdc2d765 1397 VTY_DECLVAR_CONTEXT(bgp, bgp);
cb1faec9
DS
1398
1399 if (set)
1400 VTY_GET_INTEGER_RANGE ("write-quanta", bgp->wpkt_quanta, num,
4543bbb4 1401 1, 10000);
cb1faec9
DS
1402 else
1403 bgp->wpkt_quanta = BGP_WRITE_PACKET_MAX;
1404
1405 return CMD_SUCCESS;
1406}
1407
1408int
1409bgp_config_write_wpkt_quanta (struct vty *vty, struct bgp *bgp)
1410{
1411 if (bgp->wpkt_quanta != BGP_WRITE_PACKET_MAX)
1412 vty_out (vty, " write-quanta %d%s",
1413 bgp->wpkt_quanta, VTY_NEWLINE);
1414
1415 return 0;
1416}
1417
1418
1419/* Update-delay configuration */
1420DEFUN (bgp_wpkt_quanta,
1421 bgp_wpkt_quanta_cmd,
6147e2c6 1422 "write-quanta (1-10000)",
cb1faec9
DS
1423 "How many packets to write to peer socket per run\n"
1424 "Number of packets\n")
1425{
c500ae40
DW
1426 int idx_number = 1;
1427 return bgp_wpkt_quanta_config_vty(vty, argv[idx_number]->arg, 1);
cb1faec9
DS
1428}
1429
1430/* Update-delay deconfiguration */
1431DEFUN (no_bgp_wpkt_quanta,
1432 no_bgp_wpkt_quanta_cmd,
6147e2c6 1433 "no write-quanta (1-10000)",
d7fa34c1 1434 NO_STR
cb1faec9
DS
1435 "How many packets to write to peer socket per run\n"
1436 "Number of packets\n")
1437{
c500ae40
DW
1438 int idx_number = 2;
1439 return bgp_wpkt_quanta_config_vty(vty, argv[idx_number]->arg, 0);
cb1faec9
DS
1440}
1441
ffd0c037 1442static int
3f9c7369
DS
1443bgp_coalesce_config_vty (struct vty *vty, const char *num, char set)
1444{
cdc2d765 1445 VTY_DECLVAR_CONTEXT(bgp, bgp);
3f9c7369
DS
1446
1447 if (set)
1448 VTY_GET_INTEGER_RANGE ("coalesce-time", bgp->coalesce_time, num,
1449 0, 4294967295);
1450 else
1451 bgp->coalesce_time = BGP_DEFAULT_SUBGROUP_COALESCE_TIME;
1452
1453 return CMD_SUCCESS;
1454}
1455
1456int
1457bgp_config_write_coalesce_time (struct vty *vty, struct bgp *bgp)
1458{
1459 if (bgp->coalesce_time != BGP_DEFAULT_SUBGROUP_COALESCE_TIME)
1460 vty_out (vty, " coalesce-time %d%s",
1461 bgp->coalesce_time, VTY_NEWLINE);
1462
1463 return 0;
1464}
1465
1466
1467DEFUN (bgp_coalesce_time,
1468 bgp_coalesce_time_cmd,
6147e2c6 1469 "coalesce-time (0-4294967295)",
3f9c7369
DS
1470 "Subgroup coalesce timer\n"
1471 "Subgroup coalesce timer value (in ms)\n")
1472{
c500ae40
DW
1473 int idx_number = 1;
1474 return bgp_coalesce_config_vty(vty, argv[idx_number]->arg, 1);
3f9c7369
DS
1475}
1476
1477DEFUN (no_bgp_coalesce_time,
1478 no_bgp_coalesce_time_cmd,
6147e2c6 1479 "no coalesce-time (0-4294967295)",
3a2d747c 1480 NO_STR
3f9c7369
DS
1481 "Subgroup coalesce timer\n"
1482 "Subgroup coalesce timer value (in ms)\n")
1483{
c500ae40
DW
1484 int idx_number = 2;
1485 return bgp_coalesce_config_vty(vty, argv[idx_number]->arg, 0);
3f9c7369
DS
1486}
1487
5e242b0d
DS
1488/* Maximum-paths configuration */
1489DEFUN (bgp_maxpaths,
1490 bgp_maxpaths_cmd,
9ccf14f7 1491 "maximum-paths (1-255)",
5e242b0d
DS
1492 "Forward packets over multiple paths\n"
1493 "Number of paths\n")
1494{
c500ae40
DW
1495 int idx_number = 1;
1496 return bgp_maxpaths_config_vty(vty, BGP_PEER_EBGP, argv[idx_number]->arg, 0, 1);
5e242b0d
DS
1497}
1498
165b5fff
JB
1499DEFUN (bgp_maxpaths_ibgp,
1500 bgp_maxpaths_ibgp_cmd,
9ccf14f7 1501 "maximum-paths ibgp (1-255)",
165b5fff
JB
1502 "Forward packets over multiple paths\n"
1503 "iBGP-multipath\n"
1504 "Number of paths\n")
1505{
c500ae40
DW
1506 int idx_number = 2;
1507 return bgp_maxpaths_config_vty(vty, BGP_PEER_IBGP, argv[idx_number]->arg, 0, 1);
5e242b0d 1508}
165b5fff 1509
5e242b0d
DS
1510DEFUN (bgp_maxpaths_ibgp_cluster,
1511 bgp_maxpaths_ibgp_cluster_cmd,
9ccf14f7 1512 "maximum-paths ibgp (1-255) equal-cluster-length",
5e242b0d
DS
1513 "Forward packets over multiple paths\n"
1514 "iBGP-multipath\n"
1515 "Number of paths\n"
1516 "Match the cluster length\n")
1517{
c500ae40
DW
1518 int idx_number = 2;
1519 return bgp_maxpaths_config_vty(vty, BGP_PEER_IBGP, argv[idx_number]->arg,
5e242b0d 1520 BGP_FLAG_IBGP_MULTIPATH_SAME_CLUSTERLEN, 1);
165b5fff
JB
1521}
1522
1523DEFUN (no_bgp_maxpaths,
1524 no_bgp_maxpaths_cmd,
9ccf14f7 1525 "no maximum-paths [(1-255)]",
165b5fff
JB
1526 NO_STR
1527 "Forward packets over multiple paths\n"
1528 "Number of paths\n")
1529{
5e242b0d 1530 return bgp_maxpaths_config_vty(vty, BGP_PEER_EBGP, NULL, 0, 0);
165b5fff
JB
1531}
1532
165b5fff
JB
1533DEFUN (no_bgp_maxpaths_ibgp,
1534 no_bgp_maxpaths_ibgp_cmd,
9ccf14f7 1535 "no maximum-paths ibgp [(1-255) [equal-cluster-length]]",
165b5fff
JB
1536 NO_STR
1537 "Forward packets over multiple paths\n"
1538 "iBGP-multipath\n"
838758ac
DW
1539 "Number of paths\n"
1540 "Match the cluster length\n")
165b5fff 1541{
5e242b0d 1542 return bgp_maxpaths_config_vty(vty, BGP_PEER_IBGP, NULL, 0, 0);
165b5fff
JB
1543}
1544
165b5fff
JB
1545int
1546bgp_config_write_maxpaths (struct vty *vty, struct bgp *bgp, afi_t afi,
1547 safi_t safi, int *write)
1548{
d5b77cc2 1549 if (bgp->maxpaths[afi][safi].maxpaths_ebgp != MULTIPATH_NUM)
165b5fff
JB
1550 {
1551 bgp_config_write_family_header (vty, afi, safi, write);
0b960b4d 1552 vty_out (vty, " maximum-paths %d%s",
165b5fff
JB
1553 bgp->maxpaths[afi][safi].maxpaths_ebgp, VTY_NEWLINE);
1554 }
1555
d5b77cc2 1556 if (bgp->maxpaths[afi][safi].maxpaths_ibgp != MULTIPATH_NUM)
165b5fff
JB
1557 {
1558 bgp_config_write_family_header (vty, afi, safi, write);
0b960b4d 1559 vty_out (vty, " maximum-paths ibgp %d",
5e242b0d
DS
1560 bgp->maxpaths[afi][safi].maxpaths_ibgp);
1561 if (CHECK_FLAG (bgp->maxpaths[afi][safi].ibgp_flags,
1562 BGP_FLAG_IBGP_MULTIPATH_SAME_CLUSTERLEN))
1563 vty_out (vty, " equal-cluster-length");
1564 vty_out (vty, "%s", VTY_NEWLINE);
165b5fff
JB
1565 }
1566
1567 return 0;
1568}
6b0655a2 1569
718e3744 1570/* BGP timers. */
1571
1572DEFUN (bgp_timers,
1573 bgp_timers_cmd,
6147e2c6 1574 "timers bgp (0-65535) (0-65535)",
718e3744 1575 "Adjust routing timers\n"
1576 "BGP timers\n"
1577 "Keepalive interval\n"
1578 "Holdtime\n")
1579{
cdc2d765 1580 VTY_DECLVAR_CONTEXT(bgp, bgp);
c500ae40
DW
1581 int idx_number = 2;
1582 int idx_number_2 = 3;
718e3744 1583 unsigned long keepalive = 0;
1584 unsigned long holdtime = 0;
1585
c500ae40
DW
1586 VTY_GET_INTEGER ("keepalive", keepalive, argv[idx_number]->arg);
1587 VTY_GET_INTEGER ("holdtime", holdtime, argv[idx_number_2]->arg);
718e3744 1588
1589 /* Holdtime value check. */
1590 if (holdtime < 3 && holdtime != 0)
1591 {
1592 vty_out (vty, "%% hold time value must be either 0 or greater than 3%s",
1593 VTY_NEWLINE);
1594 return CMD_WARNING;
1595 }
1596
1597 bgp_timers_set (bgp, keepalive, holdtime);
1598
1599 return CMD_SUCCESS;
1600}
1601
1602DEFUN (no_bgp_timers,
1603 no_bgp_timers_cmd,
838758ac 1604 "no timers bgp [(0-65535) (0-65535)]",
718e3744 1605 NO_STR
1606 "Adjust routing timers\n"
838758ac
DW
1607 "BGP timers\n"
1608 "Keepalive interval\n"
1609 "Holdtime\n")
718e3744 1610{
cdc2d765 1611 VTY_DECLVAR_CONTEXT(bgp, bgp);
718e3744 1612 bgp_timers_unset (bgp);
1613
1614 return CMD_SUCCESS;
1615}
1616
6b0655a2 1617
718e3744 1618DEFUN (bgp_client_to_client_reflection,
1619 bgp_client_to_client_reflection_cmd,
1620 "bgp client-to-client reflection",
1621 "BGP specific commands\n"
1622 "Configure client to client route reflection\n"
1623 "reflection of routes allowed\n")
1624{
cdc2d765 1625 VTY_DECLVAR_CONTEXT(bgp, bgp);
718e3744 1626 bgp_flag_unset (bgp, BGP_FLAG_NO_CLIENT_TO_CLIENT);
f31fa004 1627 bgp_clear_star_soft_out (vty, bgp->name);
7aafcaca 1628
718e3744 1629 return CMD_SUCCESS;
1630}
1631
1632DEFUN (no_bgp_client_to_client_reflection,
1633 no_bgp_client_to_client_reflection_cmd,
1634 "no bgp client-to-client reflection",
1635 NO_STR
1636 "BGP specific commands\n"
1637 "Configure client to client route reflection\n"
1638 "reflection of routes allowed\n")
1639{
cdc2d765 1640 VTY_DECLVAR_CONTEXT(bgp, bgp);
718e3744 1641 bgp_flag_set (bgp, BGP_FLAG_NO_CLIENT_TO_CLIENT);
f31fa004 1642 bgp_clear_star_soft_out (vty, bgp->name);
7aafcaca 1643
718e3744 1644 return CMD_SUCCESS;
1645}
1646
1647/* "bgp always-compare-med" configuration. */
1648DEFUN (bgp_always_compare_med,
1649 bgp_always_compare_med_cmd,
1650 "bgp always-compare-med",
1651 "BGP specific commands\n"
1652 "Allow comparing MED from different neighbors\n")
1653{
cdc2d765 1654 VTY_DECLVAR_CONTEXT(bgp, bgp);
718e3744 1655 bgp_flag_set (bgp, BGP_FLAG_ALWAYS_COMPARE_MED);
7aafcaca
DS
1656 bgp_recalculate_all_bestpaths (bgp);
1657
718e3744 1658 return CMD_SUCCESS;
1659}
1660
1661DEFUN (no_bgp_always_compare_med,
1662 no_bgp_always_compare_med_cmd,
1663 "no bgp always-compare-med",
1664 NO_STR
1665 "BGP specific commands\n"
1666 "Allow comparing MED from different neighbors\n")
1667{
cdc2d765 1668 VTY_DECLVAR_CONTEXT(bgp, bgp);
718e3744 1669 bgp_flag_unset (bgp, BGP_FLAG_ALWAYS_COMPARE_MED);
7aafcaca
DS
1670 bgp_recalculate_all_bestpaths (bgp);
1671
718e3744 1672 return CMD_SUCCESS;
1673}
6b0655a2 1674
718e3744 1675/* "bgp deterministic-med" configuration. */
1676DEFUN (bgp_deterministic_med,
1677 bgp_deterministic_med_cmd,
1678 "bgp deterministic-med",
1679 "BGP specific commands\n"
1680 "Pick the best-MED path among paths advertised from the neighboring AS\n")
1681{
cdc2d765 1682 VTY_DECLVAR_CONTEXT(bgp, bgp);
1475ac87
DW
1683
1684 if (!bgp_flag_check(bgp, BGP_FLAG_DETERMINISTIC_MED))
1685 {
1686 bgp_flag_set (bgp, BGP_FLAG_DETERMINISTIC_MED);
1687 bgp_recalculate_all_bestpaths (bgp);
1688 }
7aafcaca 1689
718e3744 1690 return CMD_SUCCESS;
1691}
1692
1693DEFUN (no_bgp_deterministic_med,
1694 no_bgp_deterministic_med_cmd,
1695 "no bgp deterministic-med",
1696 NO_STR
1697 "BGP specific commands\n"
1698 "Pick the best-MED path among paths advertised from the neighboring AS\n")
1699{
cdc2d765 1700 VTY_DECLVAR_CONTEXT(bgp, bgp);
06370dac
DW
1701 int bestpath_per_as_used;
1702 afi_t afi;
1703 safi_t safi;
1704 struct peer *peer;
1705 struct listnode *node, *nnode;
718e3744 1706
1475ac87
DW
1707 if (bgp_flag_check(bgp, BGP_FLAG_DETERMINISTIC_MED))
1708 {
06370dac
DW
1709 bestpath_per_as_used = 0;
1710
1711 for (ALL_LIST_ELEMENTS (bgp->peer, node, nnode, peer))
1712 {
1713 for (afi = AFI_IP; afi < AFI_MAX; afi++)
1714 for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++)
1715 if (CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_ADDPATH_TX_BESTPATH_PER_AS))
1716 {
1717 bestpath_per_as_used = 1;
1718 break;
1719 }
1720
1721 if (bestpath_per_as_used)
1722 break;
1723 }
1724
1725 if (bestpath_per_as_used)
1726 {
1727 vty_out (vty, "bgp deterministic-med cannot be disabled while addpath-tx-bestpath-per-AS is in use%s",
1728 VTY_NEWLINE);
1729 return CMD_WARNING;
1730 }
1731 else
1732 {
1733 bgp_flag_unset (bgp, BGP_FLAG_DETERMINISTIC_MED);
1734 bgp_recalculate_all_bestpaths (bgp);
1735 }
1475ac87 1736 }
7aafcaca 1737
718e3744 1738 return CMD_SUCCESS;
1739}
538621f2 1740
1741/* "bgp graceful-restart" configuration. */
1742DEFUN (bgp_graceful_restart,
1743 bgp_graceful_restart_cmd,
1744 "bgp graceful-restart",
1745 "BGP specific commands\n"
1746 "Graceful restart capability parameters\n")
1747{
cdc2d765 1748 VTY_DECLVAR_CONTEXT(bgp, bgp);
538621f2 1749 bgp_flag_set (bgp, BGP_FLAG_GRACEFUL_RESTART);
1750 return CMD_SUCCESS;
1751}
1752
1753DEFUN (no_bgp_graceful_restart,
1754 no_bgp_graceful_restart_cmd,
1755 "no bgp graceful-restart",
1756 NO_STR
1757 "BGP specific commands\n"
1758 "Graceful restart capability parameters\n")
1759{
cdc2d765 1760 VTY_DECLVAR_CONTEXT(bgp, bgp);
538621f2 1761 bgp_flag_unset (bgp, BGP_FLAG_GRACEFUL_RESTART);
1762 return CMD_SUCCESS;
1763}
1764
93406d87 1765DEFUN (bgp_graceful_restart_stalepath_time,
1766 bgp_graceful_restart_stalepath_time_cmd,
6147e2c6 1767 "bgp graceful-restart stalepath-time (1-3600)",
93406d87 1768 "BGP specific commands\n"
1769 "Graceful restart capability parameters\n"
1770 "Set the max time to hold onto restarting peer's stale paths\n"
1771 "Delay value (seconds)\n")
1772{
cdc2d765 1773 VTY_DECLVAR_CONTEXT(bgp, bgp);
c500ae40 1774 int idx_number = 3;
93406d87 1775 u_int32_t stalepath;
1776
c500ae40 1777 VTY_GET_INTEGER_RANGE ("stalepath-time", stalepath, argv[idx_number]->arg, 1, 3600);
93406d87 1778 bgp->stalepath_time = stalepath;
1779 return CMD_SUCCESS;
1780}
1781
eb6f1b41
PG
1782DEFUN (bgp_graceful_restart_restart_time,
1783 bgp_graceful_restart_restart_time_cmd,
6147e2c6 1784 "bgp graceful-restart restart-time (1-3600)",
eb6f1b41
PG
1785 "BGP specific commands\n"
1786 "Graceful restart capability parameters\n"
1787 "Set the time to wait to delete stale routes before a BGP open message is received\n"
1788 "Delay value (seconds)\n")
1789{
cdc2d765 1790 VTY_DECLVAR_CONTEXT(bgp, bgp);
c500ae40 1791 int idx_number = 3;
eb6f1b41
PG
1792 u_int32_t restart;
1793
c500ae40 1794 VTY_GET_INTEGER_RANGE ("restart-time", restart, argv[idx_number]->arg, 1, 3600);
eb6f1b41
PG
1795 bgp->restart_time = restart;
1796 return CMD_SUCCESS;
1797}
1798
93406d87 1799DEFUN (no_bgp_graceful_restart_stalepath_time,
1800 no_bgp_graceful_restart_stalepath_time_cmd,
838758ac 1801 "no bgp graceful-restart stalepath-time [(1-3600)]",
93406d87 1802 NO_STR
1803 "BGP specific commands\n"
1804 "Graceful restart capability parameters\n"
838758ac
DW
1805 "Set the max time to hold onto restarting peer's stale paths\n"
1806 "Delay value (seconds)\n")
93406d87 1807{
cdc2d765 1808 VTY_DECLVAR_CONTEXT(bgp, bgp);
93406d87 1809
1810 bgp->stalepath_time = BGP_DEFAULT_STALEPATH_TIME;
1811 return CMD_SUCCESS;
1812}
1813
eb6f1b41
PG
1814DEFUN (no_bgp_graceful_restart_restart_time,
1815 no_bgp_graceful_restart_restart_time_cmd,
838758ac 1816 "no bgp graceful-restart restart-time [(1-3600)]",
eb6f1b41
PG
1817 NO_STR
1818 "BGP specific commands\n"
1819 "Graceful restart capability parameters\n"
838758ac
DW
1820 "Set the time to wait to delete stale routes before a BGP open message is received\n"
1821 "Delay value (seconds)\n")
eb6f1b41 1822{
cdc2d765 1823 VTY_DECLVAR_CONTEXT(bgp, bgp);
eb6f1b41
PG
1824
1825 bgp->restart_time = BGP_DEFAULT_RESTART_TIME;
1826 return CMD_SUCCESS;
1827}
1828
43fc21b3
JC
1829DEFUN (bgp_graceful_restart_preserve_fw,
1830 bgp_graceful_restart_preserve_fw_cmd,
1831 "bgp graceful-restart preserve-fw-state",
1832 "BGP specific commands\n"
1833 "Graceful restart capability parameters\n"
1834 "Sets F-bit indication that fib is preserved while doing Graceful Restart\n")
1835{
1836 VTY_DECLVAR_CONTEXT(bgp, bgp);
1837 bgp_flag_set(bgp, BGP_FLAG_GR_PRESERVE_FWD);
1838 return CMD_SUCCESS;
1839}
1840
1841DEFUN (no_bgp_graceful_restart_preserve_fw,
1842 no_bgp_graceful_restart_preserve_fw_cmd,
1843 "no bgp graceful-restart preserve-fw-state",
1844 NO_STR
1845 "BGP specific commands\n"
1846 "Graceful restart capability parameters\n"
1847 "Unsets F-bit indication that fib is preserved while doing Graceful Restart\n")
1848{
1849 VTY_DECLVAR_CONTEXT(bgp, bgp);
1850 bgp_flag_unset(bgp, BGP_FLAG_GR_PRESERVE_FWD);
1851 return CMD_SUCCESS;
1852}
1853
718e3744 1854/* "bgp fast-external-failover" configuration. */
1855DEFUN (bgp_fast_external_failover,
1856 bgp_fast_external_failover_cmd,
1857 "bgp fast-external-failover",
1858 BGP_STR
1859 "Immediately reset session if a link to a directly connected external peer goes down\n")
1860{
cdc2d765 1861 VTY_DECLVAR_CONTEXT(bgp, bgp);
718e3744 1862 bgp_flag_unset (bgp, BGP_FLAG_NO_FAST_EXT_FAILOVER);
1863 return CMD_SUCCESS;
1864}
1865
1866DEFUN (no_bgp_fast_external_failover,
1867 no_bgp_fast_external_failover_cmd,
1868 "no bgp fast-external-failover",
1869 NO_STR
1870 BGP_STR
1871 "Immediately reset session if a link to a directly connected external peer goes down\n")
1872{
cdc2d765 1873 VTY_DECLVAR_CONTEXT(bgp, bgp);
718e3744 1874 bgp_flag_set (bgp, BGP_FLAG_NO_FAST_EXT_FAILOVER);
1875 return CMD_SUCCESS;
1876}
6b0655a2 1877
718e3744 1878/* "bgp enforce-first-as" configuration. */
1879DEFUN (bgp_enforce_first_as,
1880 bgp_enforce_first_as_cmd,
1881 "bgp enforce-first-as",
1882 BGP_STR
1883 "Enforce the first AS for EBGP routes\n")
1884{
cdc2d765 1885 VTY_DECLVAR_CONTEXT(bgp, bgp);
718e3744 1886 bgp_flag_set (bgp, BGP_FLAG_ENFORCE_FIRST_AS);
f31fa004 1887 bgp_clear_star_soft_in (vty, bgp->name);
7aafcaca 1888
718e3744 1889 return CMD_SUCCESS;
1890}
1891
1892DEFUN (no_bgp_enforce_first_as,
1893 no_bgp_enforce_first_as_cmd,
1894 "no bgp enforce-first-as",
1895 NO_STR
1896 BGP_STR
1897 "Enforce the first AS for EBGP routes\n")
1898{
cdc2d765 1899 VTY_DECLVAR_CONTEXT(bgp, bgp);
718e3744 1900 bgp_flag_unset (bgp, BGP_FLAG_ENFORCE_FIRST_AS);
f31fa004 1901 bgp_clear_star_soft_in (vty, bgp->name);
7aafcaca 1902
718e3744 1903 return CMD_SUCCESS;
1904}
6b0655a2 1905
718e3744 1906/* "bgp bestpath compare-routerid" configuration. */
1907DEFUN (bgp_bestpath_compare_router_id,
1908 bgp_bestpath_compare_router_id_cmd,
1909 "bgp bestpath compare-routerid",
1910 "BGP specific commands\n"
1911 "Change the default bestpath selection\n"
1912 "Compare router-id for identical EBGP paths\n")
1913{
cdc2d765 1914 VTY_DECLVAR_CONTEXT(bgp, bgp);
718e3744 1915 bgp_flag_set (bgp, BGP_FLAG_COMPARE_ROUTER_ID);
7aafcaca
DS
1916 bgp_recalculate_all_bestpaths (bgp);
1917
718e3744 1918 return CMD_SUCCESS;
1919}
1920
1921DEFUN (no_bgp_bestpath_compare_router_id,
1922 no_bgp_bestpath_compare_router_id_cmd,
1923 "no bgp bestpath compare-routerid",
1924 NO_STR
1925 "BGP specific commands\n"
1926 "Change the default bestpath selection\n"
1927 "Compare router-id for identical EBGP paths\n")
1928{
cdc2d765 1929 VTY_DECLVAR_CONTEXT(bgp, bgp);
718e3744 1930 bgp_flag_unset (bgp, BGP_FLAG_COMPARE_ROUTER_ID);
7aafcaca
DS
1931 bgp_recalculate_all_bestpaths (bgp);
1932
718e3744 1933 return CMD_SUCCESS;
1934}
6b0655a2 1935
718e3744 1936/* "bgp bestpath as-path ignore" configuration. */
1937DEFUN (bgp_bestpath_aspath_ignore,
1938 bgp_bestpath_aspath_ignore_cmd,
1939 "bgp bestpath as-path ignore",
1940 "BGP specific commands\n"
1941 "Change the default bestpath selection\n"
1942 "AS-path attribute\n"
1943 "Ignore as-path length in selecting a route\n")
1944{
cdc2d765 1945 VTY_DECLVAR_CONTEXT(bgp, bgp);
718e3744 1946 bgp_flag_set (bgp, BGP_FLAG_ASPATH_IGNORE);
7aafcaca
DS
1947 bgp_recalculate_all_bestpaths (bgp);
1948
718e3744 1949 return CMD_SUCCESS;
1950}
1951
1952DEFUN (no_bgp_bestpath_aspath_ignore,
1953 no_bgp_bestpath_aspath_ignore_cmd,
1954 "no bgp bestpath as-path ignore",
1955 NO_STR
1956 "BGP specific commands\n"
1957 "Change the default bestpath selection\n"
1958 "AS-path attribute\n"
1959 "Ignore as-path length in selecting a route\n")
1960{
cdc2d765 1961 VTY_DECLVAR_CONTEXT(bgp, bgp);
718e3744 1962 bgp_flag_unset (bgp, BGP_FLAG_ASPATH_IGNORE);
7aafcaca
DS
1963 bgp_recalculate_all_bestpaths (bgp);
1964
718e3744 1965 return CMD_SUCCESS;
1966}
6b0655a2 1967
6811845b 1968/* "bgp bestpath as-path confed" configuration. */
1969DEFUN (bgp_bestpath_aspath_confed,
1970 bgp_bestpath_aspath_confed_cmd,
1971 "bgp bestpath as-path confed",
1972 "BGP specific commands\n"
1973 "Change the default bestpath selection\n"
1974 "AS-path attribute\n"
1975 "Compare path lengths including confederation sets & sequences in selecting a route\n")
1976{
cdc2d765 1977 VTY_DECLVAR_CONTEXT(bgp, bgp);
6811845b 1978 bgp_flag_set (bgp, BGP_FLAG_ASPATH_CONFED);
7aafcaca
DS
1979 bgp_recalculate_all_bestpaths (bgp);
1980
6811845b 1981 return CMD_SUCCESS;
1982}
1983
1984DEFUN (no_bgp_bestpath_aspath_confed,
1985 no_bgp_bestpath_aspath_confed_cmd,
1986 "no bgp bestpath as-path confed",
1987 NO_STR
1988 "BGP specific commands\n"
1989 "Change the default bestpath selection\n"
1990 "AS-path attribute\n"
1991 "Compare path lengths including confederation sets & sequences in selecting a route\n")
1992{
cdc2d765 1993 VTY_DECLVAR_CONTEXT(bgp, bgp);
6811845b 1994 bgp_flag_unset (bgp, BGP_FLAG_ASPATH_CONFED);
7aafcaca
DS
1995 bgp_recalculate_all_bestpaths (bgp);
1996
6811845b 1997 return CMD_SUCCESS;
1998}
6b0655a2 1999
2fdd455c
PM
2000/* "bgp bestpath as-path multipath-relax" configuration. */
2001DEFUN (bgp_bestpath_aspath_multipath_relax,
2002 bgp_bestpath_aspath_multipath_relax_cmd,
c7178fe7 2003 "bgp bestpath as-path multipath-relax [<as-set|no-as-set>]",
16fc1eec
DS
2004 "BGP specific commands\n"
2005 "Change the default bestpath selection\n"
2006 "AS-path attribute\n"
2007 "Allow load sharing across routes that have different AS paths (but same length)\n"
219178b6 2008 "Generate an AS_SET\n"
16fc1eec
DS
2009 "Do not generate an AS_SET\n")
2010{
cdc2d765 2011 VTY_DECLVAR_CONTEXT(bgp, bgp);
4c4ff4c1 2012 int idx = 0;
16fc1eec 2013 bgp_flag_set (bgp, BGP_FLAG_ASPATH_MULTIPATH_RELAX);
219178b6
DW
2014
2015 /* no-as-set is now the default behavior so we can silently
2016 * ignore it */
4c4ff4c1 2017 if (argv_find (argv, argc, "as-set", &idx))
219178b6
DW
2018 bgp_flag_set (bgp, BGP_FLAG_MULTIPATH_RELAX_AS_SET);
2019 else
2020 bgp_flag_unset (bgp, BGP_FLAG_MULTIPATH_RELAX_AS_SET) ;
2021
7aafcaca
DS
2022 bgp_recalculate_all_bestpaths (bgp);
2023
16fc1eec
DS
2024 return CMD_SUCCESS;
2025}
2026
219178b6
DW
2027DEFUN (no_bgp_bestpath_aspath_multipath_relax,
2028 no_bgp_bestpath_aspath_multipath_relax_cmd,
c7178fe7 2029 "no bgp bestpath as-path multipath-relax [<as-set|no-as-set>]",
16fc1eec
DS
2030 NO_STR
2031 "BGP specific commands\n"
2032 "Change the default bestpath selection\n"
2033 "AS-path attribute\n"
2034 "Allow load sharing across routes that have different AS paths (but same length)\n"
219178b6 2035 "Generate an AS_SET\n"
16fc1eec
DS
2036 "Do not generate an AS_SET\n")
2037{
cdc2d765 2038 VTY_DECLVAR_CONTEXT(bgp, bgp);
16fc1eec 2039 bgp_flag_unset (bgp, BGP_FLAG_ASPATH_MULTIPATH_RELAX);
219178b6 2040 bgp_flag_unset (bgp, BGP_FLAG_MULTIPATH_RELAX_AS_SET);
7aafcaca
DS
2041 bgp_recalculate_all_bestpaths (bgp);
2042
2fdd455c
PM
2043 return CMD_SUCCESS;
2044}
6b0655a2 2045
848973c7 2046/* "bgp log-neighbor-changes" configuration. */
2047DEFUN (bgp_log_neighbor_changes,
2048 bgp_log_neighbor_changes_cmd,
2049 "bgp log-neighbor-changes",
2050 "BGP specific commands\n"
2051 "Log neighbor up/down and reset reason\n")
2052{
cdc2d765 2053 VTY_DECLVAR_CONTEXT(bgp, bgp);
848973c7 2054 bgp_flag_set (bgp, BGP_FLAG_LOG_NEIGHBOR_CHANGES);
2055 return CMD_SUCCESS;
2056}
2057
2058DEFUN (no_bgp_log_neighbor_changes,
2059 no_bgp_log_neighbor_changes_cmd,
2060 "no bgp log-neighbor-changes",
2061 NO_STR
2062 "BGP specific commands\n"
2063 "Log neighbor up/down and reset reason\n")
2064{
cdc2d765 2065 VTY_DECLVAR_CONTEXT(bgp, bgp);
848973c7 2066 bgp_flag_unset (bgp, BGP_FLAG_LOG_NEIGHBOR_CHANGES);
2067 return CMD_SUCCESS;
2068}
6b0655a2 2069
718e3744 2070/* "bgp bestpath med" configuration. */
2071DEFUN (bgp_bestpath_med,
2072 bgp_bestpath_med_cmd,
2d8c1a4d 2073 "bgp bestpath med <confed [missing-as-worst]|missing-as-worst [confed]>",
718e3744 2074 "BGP specific commands\n"
2075 "Change the default bestpath selection\n"
2076 "MED attribute\n"
2077 "Compare MED among confederation paths\n"
838758ac
DW
2078 "Treat missing MED as the least preferred one\n"
2079 "Treat missing MED as the least preferred one\n"
2080 "Compare MED among confederation paths\n")
718e3744 2081{
cdc2d765 2082 VTY_DECLVAR_CONTEXT(bgp, bgp);
6cbd1915
QY
2083
2084 int idx = 0;
2085 if (argv_find (argv, argc, "confed", &idx))
2086 bgp_flag_set (bgp, BGP_FLAG_MED_CONFED);
2087 idx = 0;
2088 if (argv_find (argv, argc, "missing-as-worst", &idx))
2089 bgp_flag_set (bgp, BGP_FLAG_MED_MISSING_AS_WORST);
e52702f2 2090
7aafcaca
DS
2091 bgp_recalculate_all_bestpaths (bgp);
2092
718e3744 2093 return CMD_SUCCESS;
2094}
2095
718e3744 2096DEFUN (no_bgp_bestpath_med,
2097 no_bgp_bestpath_med_cmd,
2d8c1a4d 2098 "no bgp bestpath med <confed [missing-as-worst]|missing-as-worst [confed]>",
718e3744 2099 NO_STR
2100 "BGP specific commands\n"
2101 "Change the default bestpath selection\n"
2102 "MED attribute\n"
2103 "Compare MED among confederation paths\n"
3a2d747c
QY
2104 "Treat missing MED as the least preferred one\n"
2105 "Treat missing MED as the least preferred one\n"
2106 "Compare MED among confederation paths\n")
718e3744 2107{
cdc2d765 2108 VTY_DECLVAR_CONTEXT(bgp, bgp);
e52702f2 2109
6cbd1915
QY
2110 int idx = 0;
2111 if (argv_find (argv, argc, "confed", &idx))
718e3744 2112 bgp_flag_unset (bgp, BGP_FLAG_MED_CONFED);
6cbd1915
QY
2113 idx = 0;
2114 if (argv_find (argv, argc, "missing-as-worst", &idx))
718e3744 2115 bgp_flag_unset (bgp, BGP_FLAG_MED_MISSING_AS_WORST);
2116
7aafcaca
DS
2117 bgp_recalculate_all_bestpaths (bgp);
2118
718e3744 2119 return CMD_SUCCESS;
2120}
2121
718e3744 2122/* "no bgp default ipv4-unicast". */
2123DEFUN (no_bgp_default_ipv4_unicast,
2124 no_bgp_default_ipv4_unicast_cmd,
2125 "no bgp default ipv4-unicast",
2126 NO_STR
2127 "BGP specific commands\n"
2128 "Configure BGP defaults\n"
2129 "Activate ipv4-unicast for a peer by default\n")
2130{
cdc2d765 2131 VTY_DECLVAR_CONTEXT(bgp, bgp);
718e3744 2132 bgp_flag_set (bgp, BGP_FLAG_NO_DEFAULT_IPV4);
2133 return CMD_SUCCESS;
2134}
2135
2136DEFUN (bgp_default_ipv4_unicast,
2137 bgp_default_ipv4_unicast_cmd,
2138 "bgp default ipv4-unicast",
2139 "BGP specific commands\n"
2140 "Configure BGP defaults\n"
2141 "Activate ipv4-unicast for a peer by default\n")
2142{
cdc2d765 2143 VTY_DECLVAR_CONTEXT(bgp, bgp);
718e3744 2144 bgp_flag_unset (bgp, BGP_FLAG_NO_DEFAULT_IPV4);
2145 return CMD_SUCCESS;
2146}
6b0655a2 2147
04b6bdc0
DW
2148/* Display hostname in certain command outputs */
2149DEFUN (bgp_default_show_hostname,
2150 bgp_default_show_hostname_cmd,
2151 "bgp default show-hostname",
2152 "BGP specific commands\n"
2153 "Configure BGP defaults\n"
2154 "Show hostname in certain command ouputs\n")
2155{
cdc2d765 2156 VTY_DECLVAR_CONTEXT(bgp, bgp);
04b6bdc0
DW
2157 bgp_flag_set (bgp, BGP_FLAG_SHOW_HOSTNAME);
2158 return CMD_SUCCESS;
2159}
2160
2161DEFUN (no_bgp_default_show_hostname,
2162 no_bgp_default_show_hostname_cmd,
2163 "no bgp default show-hostname",
2164 NO_STR
2165 "BGP specific commands\n"
2166 "Configure BGP defaults\n"
2167 "Show hostname in certain command ouputs\n")
2168{
cdc2d765 2169 VTY_DECLVAR_CONTEXT(bgp, bgp);
04b6bdc0
DW
2170 bgp_flag_unset (bgp, BGP_FLAG_SHOW_HOSTNAME);
2171 return CMD_SUCCESS;
2172}
2173
8233ef81 2174/* "bgp network import-check" configuration. */
718e3744 2175DEFUN (bgp_network_import_check,
2176 bgp_network_import_check_cmd,
5623e905 2177 "bgp network import-check",
718e3744 2178 "BGP specific commands\n"
2179 "BGP network command\n"
5623e905 2180 "Check BGP network route exists in IGP\n")
718e3744 2181{
cdc2d765 2182 VTY_DECLVAR_CONTEXT(bgp, bgp);
078430f6
DS
2183 if (!bgp_flag_check(bgp, BGP_FLAG_IMPORT_CHECK))
2184 {
2185 bgp_flag_set (bgp, BGP_FLAG_IMPORT_CHECK);
5623e905 2186 bgp_static_redo_import_check(bgp);
078430f6
DS
2187 }
2188
718e3744 2189 return CMD_SUCCESS;
2190}
2191
8233ef81
DW
2192ALIAS_HIDDEN (bgp_network_import_check,
2193 bgp_network_import_check_exact_cmd,
2194 "bgp network import-check exact",
2195 "BGP specific commands\n"
2196 "BGP network command\n"
2197 "Check BGP network route exists in IGP\n"
2198 "Match route precisely\n")
2199
718e3744 2200DEFUN (no_bgp_network_import_check,
2201 no_bgp_network_import_check_cmd,
5623e905 2202 "no bgp network import-check",
718e3744 2203 NO_STR
2204 "BGP specific commands\n"
2205 "BGP network command\n"
2206 "Check BGP network route exists in IGP\n")
2207{
cdc2d765 2208 VTY_DECLVAR_CONTEXT(bgp, bgp);
078430f6
DS
2209 if (bgp_flag_check(bgp, BGP_FLAG_IMPORT_CHECK))
2210 {
2211 bgp_flag_unset (bgp, BGP_FLAG_IMPORT_CHECK);
078430f6
DS
2212 bgp_static_redo_import_check(bgp);
2213 }
5623e905 2214
718e3744 2215 return CMD_SUCCESS;
2216}
6b0655a2 2217
718e3744 2218DEFUN (bgp_default_local_preference,
2219 bgp_default_local_preference_cmd,
6147e2c6 2220 "bgp default local-preference (0-4294967295)",
718e3744 2221 "BGP specific commands\n"
2222 "Configure BGP defaults\n"
2223 "local preference (higher=more preferred)\n"
2224 "Configure default local preference value\n")
2225{
cdc2d765 2226 VTY_DECLVAR_CONTEXT(bgp, bgp);
c500ae40 2227 int idx_number = 3;
718e3744 2228 u_int32_t local_pref;
2229
c500ae40 2230 VTY_GET_INTEGER ("local preference", local_pref, argv[idx_number]->arg);
718e3744 2231
2232 bgp_default_local_preference_set (bgp, local_pref);
f31fa004 2233 bgp_clear_star_soft_in (vty, bgp->name);
718e3744 2234
2235 return CMD_SUCCESS;
2236}
2237
2238DEFUN (no_bgp_default_local_preference,
2239 no_bgp_default_local_preference_cmd,
838758ac 2240 "no bgp default local-preference [(0-4294967295)]",
718e3744 2241 NO_STR
2242 "BGP specific commands\n"
2243 "Configure BGP defaults\n"
838758ac
DW
2244 "local preference (higher=more preferred)\n"
2245 "Configure default local preference value\n")
718e3744 2246{
cdc2d765 2247 VTY_DECLVAR_CONTEXT(bgp, bgp);
718e3744 2248 bgp_default_local_preference_unset (bgp);
f31fa004 2249 bgp_clear_star_soft_in (vty, bgp->name);
7aafcaca 2250
718e3744 2251 return CMD_SUCCESS;
2252}
2253
6b0655a2 2254
3f9c7369
DS
2255DEFUN (bgp_default_subgroup_pkt_queue_max,
2256 bgp_default_subgroup_pkt_queue_max_cmd,
6147e2c6 2257 "bgp default subgroup-pkt-queue-max (20-100)",
3f9c7369
DS
2258 "BGP specific commands\n"
2259 "Configure BGP defaults\n"
2260 "subgroup-pkt-queue-max\n"
2261 "Configure subgroup packet queue max\n")
8bd9d948 2262{
cdc2d765 2263 VTY_DECLVAR_CONTEXT(bgp, bgp);
c500ae40 2264 int idx_number = 3;
3f9c7369 2265 u_int32_t max_size;
8bd9d948 2266
c500ae40 2267 VTY_GET_INTEGER ("subgroup packet queue max", max_size, argv[idx_number]->arg);
3f9c7369
DS
2268
2269 bgp_default_subgroup_pkt_queue_max_set (bgp, max_size);
2270
2271 return CMD_SUCCESS;
2272}
2273
2274DEFUN (no_bgp_default_subgroup_pkt_queue_max,
2275 no_bgp_default_subgroup_pkt_queue_max_cmd,
838758ac 2276 "no bgp default subgroup-pkt-queue-max [(20-100)]",
3f9c7369
DS
2277 NO_STR
2278 "BGP specific commands\n"
2279 "Configure BGP defaults\n"
838758ac
DW
2280 "subgroup-pkt-queue-max\n"
2281 "Configure subgroup packet queue max\n")
3f9c7369 2282{
cdc2d765 2283 VTY_DECLVAR_CONTEXT(bgp, bgp);
3f9c7369
DS
2284 bgp_default_subgroup_pkt_queue_max_unset (bgp);
2285 return CMD_SUCCESS;
8bd9d948
DS
2286}
2287
813d4307 2288
8bd9d948
DS
2289DEFUN (bgp_rr_allow_outbound_policy,
2290 bgp_rr_allow_outbound_policy_cmd,
2291 "bgp route-reflector allow-outbound-policy",
2292 "BGP specific commands\n"
2293 "Allow modifications made by out route-map\n"
2294 "on ibgp neighbors\n")
2295{
cdc2d765 2296 VTY_DECLVAR_CONTEXT(bgp, bgp);
8bd9d948
DS
2297
2298 if (!bgp_flag_check(bgp, BGP_FLAG_RR_ALLOW_OUTBOUND_POLICY))
2299 {
2300 bgp_flag_set(bgp, BGP_FLAG_RR_ALLOW_OUTBOUND_POLICY);
3f9c7369 2301 update_group_announce_rrclients(bgp);
f31fa004 2302 bgp_clear_star_soft_out (vty, bgp->name);
8bd9d948
DS
2303 }
2304
2305 return CMD_SUCCESS;
2306}
2307
2308DEFUN (no_bgp_rr_allow_outbound_policy,
2309 no_bgp_rr_allow_outbound_policy_cmd,
2310 "no bgp route-reflector allow-outbound-policy",
2311 NO_STR
2312 "BGP specific commands\n"
2313 "Allow modifications made by out route-map\n"
2314 "on ibgp neighbors\n")
2315{
cdc2d765 2316 VTY_DECLVAR_CONTEXT(bgp, bgp);
8bd9d948
DS
2317
2318 if (bgp_flag_check(bgp, BGP_FLAG_RR_ALLOW_OUTBOUND_POLICY))
2319 {
2320 bgp_flag_unset(bgp, BGP_FLAG_RR_ALLOW_OUTBOUND_POLICY);
3f9c7369 2321 update_group_announce_rrclients(bgp);
f31fa004 2322 bgp_clear_star_soft_out (vty, bgp->name);
8bd9d948
DS
2323 }
2324
2325 return CMD_SUCCESS;
2326}
2327
f14e6fdb
DS
2328DEFUN (bgp_listen_limit,
2329 bgp_listen_limit_cmd,
9ccf14f7 2330 "bgp listen limit (1-5000)",
f14e6fdb
DS
2331 "BGP specific commands\n"
2332 "Configure BGP defaults\n"
2333 "maximum number of BGP Dynamic Neighbors that can be created\n"
2334 "Configure Dynamic Neighbors listen limit value\n")
2335{
cdc2d765 2336 VTY_DECLVAR_CONTEXT(bgp, bgp);
c500ae40 2337 int idx_number = 3;
f14e6fdb
DS
2338 int listen_limit;
2339
c500ae40 2340 VTY_GET_INTEGER_RANGE ("listen limit", listen_limit, argv[idx_number]->arg,
f14e6fdb
DS
2341 BGP_DYNAMIC_NEIGHBORS_LIMIT_MIN,
2342 BGP_DYNAMIC_NEIGHBORS_LIMIT_MAX);
2343
2344 bgp_listen_limit_set (bgp, listen_limit);
2345
2346 return CMD_SUCCESS;
2347}
2348
2349DEFUN (no_bgp_listen_limit,
2350 no_bgp_listen_limit_cmd,
838758ac 2351 "no bgp listen limit [(1-5000)]",
f14e6fdb
DS
2352 "BGP specific commands\n"
2353 "Configure BGP defaults\n"
2354 "unset maximum number of BGP Dynamic Neighbors that can be created\n"
838758ac
DW
2355 "Configure Dynamic Neighbors listen limit value to default\n"
2356 "Configure Dynamic Neighbors listen limit value\n")
f14e6fdb 2357{
cdc2d765 2358 VTY_DECLVAR_CONTEXT(bgp, bgp);
f14e6fdb
DS
2359 bgp_listen_limit_unset (bgp);
2360 return CMD_SUCCESS;
2361}
2362
2363
20eb8864 2364/*
2365 * Check if this listen range is already configured. Check for exact
2366 * match or overlap based on input.
2367 */
2368static struct peer_group *
2369listen_range_exists (struct bgp *bgp, struct prefix *range, int exact)
2370{
2371 struct listnode *node, *nnode;
2372 struct listnode *node1, *nnode1;
2373 struct peer_group *group;
2374 struct prefix *lr;
2375 afi_t afi;
2376 int match;
2377
2378 afi = family2afi(range->family);
2379 for (ALL_LIST_ELEMENTS (bgp->group, node, nnode, group))
2380 {
2381 for (ALL_LIST_ELEMENTS (group->listen_range[afi], node1,
2382 nnode1, lr))
2383 {
2384 if (exact)
2385 match = prefix_same (range, lr);
2386 else
2387 match = (prefix_match (range, lr) || prefix_match (lr, range));
2388 if (match)
2389 return group;
2390 }
2391 }
2392
2393 return NULL;
2394}
2395
f14e6fdb
DS
2396DEFUN (bgp_listen_range,
2397 bgp_listen_range_cmd,
9ccf14f7 2398 "bgp listen range <A.B.C.D/M|X:X::X:X/M> peer-group WORD",
f14e6fdb 2399 "BGP specific commands\n"
d7fa34c1
QY
2400 "Configure BGP dynamic neighbors listen range\n"
2401 "Configure BGP dynamic neighbors listen range\n"
16cedbb0
QY
2402 NEIGHBOR_ADDR_STR
2403 "Member of the peer-group\n"
2404 "Peer-group name\n")
f14e6fdb 2405{
cdc2d765 2406 VTY_DECLVAR_CONTEXT(bgp, bgp);
f14e6fdb 2407 struct prefix range;
20eb8864 2408 struct peer_group *group, *existing_group;
f14e6fdb
DS
2409 afi_t afi;
2410 int ret;
d7fa34c1 2411 int idx = 0;
f14e6fdb 2412
d7fa34c1
QY
2413 argv_find (argv, argc, "A.B.C.D/M", &idx);
2414 argv_find (argv, argc, "X:X::X:X/M", &idx);
2415 char *prefix = argv[idx]->arg;
2416 argv_find (argv, argc, "WORD", &idx);
2417 char *peergroup = argv[idx]->arg;
f14e6fdb 2418
f14e6fdb 2419 /* Convert IP prefix string to struct prefix. */
d7fa34c1 2420 ret = str2prefix (prefix, &range);
f14e6fdb
DS
2421 if (! ret)
2422 {
2423 vty_out (vty, "%% Malformed listen range%s", VTY_NEWLINE);
2424 return CMD_WARNING;
2425 }
2426
2427 afi = family2afi(range.family);
2428
f14e6fdb
DS
2429 if (afi == AFI_IP6 && IN6_IS_ADDR_LINKLOCAL (&range.u.prefix6))
2430 {
2431 vty_out (vty, "%% Malformed listen range (link-local address)%s",
2432 VTY_NEWLINE);
2433 return CMD_WARNING;
2434 }
f14e6fdb
DS
2435
2436 apply_mask (&range);
2437
20eb8864 2438 /* Check if same listen range is already configured. */
2439 existing_group = listen_range_exists (bgp, &range, 1);
2440 if (existing_group)
2441 {
d7fa34c1 2442 if (strcmp (existing_group->name, peergroup) == 0)
20eb8864 2443 return CMD_SUCCESS;
2444 else
2445 {
2446 vty_out (vty, "%% Same listen range is attached to peer-group %s%s",
2447 existing_group->name, VTY_NEWLINE);
2448 return CMD_WARNING;
2449 }
2450 }
2451
2452 /* Check if an overlapping listen range exists. */
2453 if (listen_range_exists (bgp, &range, 0))
2454 {
2455 vty_out (vty, "%% Listen range overlaps with existing listen range%s",
2456 VTY_NEWLINE);
2457 return CMD_WARNING;
2458 }
f14e6fdb 2459
d7fa34c1 2460 group = peer_group_lookup (bgp, peergroup);
f14e6fdb
DS
2461 if (! group)
2462 {
2463 vty_out (vty, "%% Configure the peer-group first%s", VTY_NEWLINE);
2464 return CMD_WARNING;
2465 }
2466
2467 ret = peer_group_listen_range_add(group, &range);
2468 return bgp_vty_return (vty, ret);
2469}
2470
2471DEFUN (no_bgp_listen_range,
2472 no_bgp_listen_range_cmd,
d7fa34c1
QY
2473 "no bgp listen range <A.B.C.D/M|X:X::X:X/M> peer-group WORD",
2474 NO_STR
f14e6fdb 2475 "BGP specific commands\n"
d7fa34c1
QY
2476 "Unconfigure BGP dynamic neighbors listen range\n"
2477 "Unconfigure BGP dynamic neighbors listen range\n"
2478 NEIGHBOR_ADDR_STR
2479 "Member of the peer-group\n"
2480 "Peer-group name\n")
f14e6fdb 2481{
cdc2d765 2482 VTY_DECLVAR_CONTEXT(bgp, bgp);
f14e6fdb
DS
2483 struct prefix range;
2484 struct peer_group *group;
2485 afi_t afi;
2486 int ret;
d7fa34c1
QY
2487 int idx = 0;
2488
2489 argv_find (argv, argc, "A.B.C.D/M", &idx);
2490 argv_find (argv, argc, "X:X::X:X/M", &idx);
2491 char *prefix = argv[idx]->arg;
2492 argv_find (argv, argc, "WORD", &idx);
2493 char *peergroup = argv[idx]->arg;
f14e6fdb 2494
c500ae40 2495 // VTY_GET_IPV4_PREFIX ("listen range", range, argv[idx_ipv4_prefixlen]->arg);
f14e6fdb
DS
2496
2497 /* Convert IP prefix string to struct prefix. */
d7fa34c1 2498 ret = str2prefix (prefix, &range);
f14e6fdb
DS
2499 if (! ret)
2500 {
2501 vty_out (vty, "%% Malformed listen range%s", VTY_NEWLINE);
2502 return CMD_WARNING;
2503 }
2504
2505 afi = family2afi(range.family);
2506
f14e6fdb
DS
2507 if (afi == AFI_IP6 && IN6_IS_ADDR_LINKLOCAL (&range.u.prefix6))
2508 {
2509 vty_out (vty, "%% Malformed listen range (link-local address)%s",
2510 VTY_NEWLINE);
2511 return CMD_WARNING;
2512 }
f14e6fdb
DS
2513
2514 apply_mask (&range);
2515
d7fa34c1 2516 group = peer_group_lookup (bgp, peergroup);
f14e6fdb
DS
2517 if (! group)
2518 {
2519 vty_out (vty, "%% Peer-group does not exist%s", VTY_NEWLINE);
2520 return CMD_WARNING;
2521 }
2522
2523 ret = peer_group_listen_range_del(group, &range);
2524 return bgp_vty_return (vty, ret);
2525}
2526
2527int
2528bgp_config_write_listen (struct vty *vty, struct bgp *bgp)
2529{
2530 struct peer_group *group;
2531 struct listnode *node, *nnode, *rnode, *nrnode;
2532 struct prefix *range;
2533 afi_t afi;
4690c7d7 2534 char buf[PREFIX2STR_BUFFER];
f14e6fdb
DS
2535
2536 if (bgp->dynamic_neighbors_limit != BGP_DYNAMIC_NEIGHBORS_LIMIT_DEFAULT)
2537 vty_out (vty, " bgp listen limit %d%s",
2538 bgp->dynamic_neighbors_limit, VTY_NEWLINE);
2539
2540 for (ALL_LIST_ELEMENTS (bgp->group, node, nnode, group))
2541 {
2542 for (afi = AFI_IP; afi < AFI_MAX; afi++)
2543 {
2544 for (ALL_LIST_ELEMENTS (group->listen_range[afi], rnode, nrnode, range))
2545 {
2546 prefix2str(range, buf, sizeof(buf));
2547 vty_out(vty, " bgp listen range %s peer-group %s%s",
2548 buf, group->name, VTY_NEWLINE);
2549 }
2550 }
2551 }
2552
2553 return 0;
2554}
2555
2556
907f92c8
DS
2557DEFUN (bgp_disable_connected_route_check,
2558 bgp_disable_connected_route_check_cmd,
2559 "bgp disable-ebgp-connected-route-check",
2560 "BGP specific commands\n"
2561 "Disable checking if nexthop is connected on ebgp sessions\n")
2562{
cdc2d765 2563 VTY_DECLVAR_CONTEXT(bgp, bgp);
907f92c8 2564 bgp_flag_set (bgp, BGP_FLAG_DISABLE_NH_CONNECTED_CHK);
f31fa004 2565 bgp_clear_star_soft_in (vty, bgp->name);
7aafcaca 2566
907f92c8
DS
2567 return CMD_SUCCESS;
2568}
2569
2570DEFUN (no_bgp_disable_connected_route_check,
2571 no_bgp_disable_connected_route_check_cmd,
2572 "no bgp disable-ebgp-connected-route-check",
2573 NO_STR
2574 "BGP specific commands\n"
2575 "Disable checking if nexthop is connected on ebgp sessions\n")
2576{
cdc2d765 2577 VTY_DECLVAR_CONTEXT(bgp, bgp);
907f92c8 2578 bgp_flag_unset (bgp, BGP_FLAG_DISABLE_NH_CONNECTED_CHK);
f31fa004 2579 bgp_clear_star_soft_in (vty, bgp->name);
7aafcaca 2580
907f92c8
DS
2581 return CMD_SUCCESS;
2582}
2583
2584
718e3744 2585static int
e52702f2 2586peer_remote_as_vty (struct vty *vty, const char *peer_str,
fd79ac91 2587 const char *as_str, afi_t afi, safi_t safi)
718e3744 2588{
cdc2d765 2589 VTY_DECLVAR_CONTEXT(bgp, bgp);
718e3744 2590 int ret;
718e3744 2591 as_t as;
0299c004 2592 int as_type = AS_SPECIFIED;
718e3744 2593 union sockunion su;
2594
7ae5fc81 2595 if (as_str[0] == 'i')
0299c004
DS
2596 {
2597 as = 0;
2598 as_type = AS_INTERNAL;
2599 }
7ae5fc81 2600 else if (as_str[0] == 'e')
0299c004
DS
2601 {
2602 as = 0;
2603 as_type = AS_EXTERNAL;
2604 }
2605 else
2606 {
2607 /* Get AS number. */
2608 VTY_GET_INTEGER_RANGE ("AS", as, as_str, 1, BGP_AS4_MAX);
2609 }
718e3744 2610
2611 /* If peer is peer group, call proper function. */
2612 ret = str2sockunion (peer_str, &su);
2613 if (ret < 0)
2614 {
a80beece 2615 /* Check for peer by interface */
0299c004 2616 ret = peer_remote_as (bgp, NULL, peer_str, &as, as_type, afi, safi);
718e3744 2617 if (ret < 0)
a80beece 2618 {
0299c004 2619 ret = peer_group_remote_as (bgp, peer_str, &as, as_type);
a80beece
DS
2620 if (ret < 0)
2621 {
2622 vty_out (vty, "%% Create the peer-group or interface first%s",
2623 VTY_NEWLINE);
2624 return CMD_WARNING;
2625 }
2626 return CMD_SUCCESS;
2627 }
718e3744 2628 }
a80beece 2629 else
718e3744 2630 {
6aeb9e78 2631 if (peer_address_self_check (bgp, &su))
a80beece
DS
2632 {
2633 vty_out (vty, "%% Can not configure the local system as neighbor%s",
2634 VTY_NEWLINE);
2635 return CMD_WARNING;
2636 }
0299c004 2637 ret = peer_remote_as (bgp, &su, NULL, &as, as_type, afi, safi);
718e3744 2638 }
2639
718e3744 2640 /* This peer belongs to peer group. */
2641 switch (ret)
2642 {
2643 case BGP_ERR_PEER_GROUP_MEMBER:
aea339f7 2644 vty_out (vty, "%% Peer-group AS %u. Cannot configure remote-as for member%s", as, VTY_NEWLINE);
718e3744 2645 return CMD_WARNING;
718e3744 2646 case BGP_ERR_PEER_GROUP_PEER_TYPE_DIFFERENT:
aea339f7 2647 vty_out (vty, "%% The AS# can not be changed from %u to %s, peer-group members must be all internal or all external%s", as, as_str, VTY_NEWLINE);
718e3744 2648 return CMD_WARNING;
718e3744 2649 }
2650 return bgp_vty_return (vty, ret);
2651}
2652
2653DEFUN (neighbor_remote_as,
2654 neighbor_remote_as_cmd,
3a2d747c 2655 "neighbor <A.B.C.D|X:X::X:X|WORD> remote-as <(1-4294967295)|internal|external>",
718e3744 2656 NEIGHBOR_STR
2657 NEIGHBOR_ADDR_STR2
2658 "Specify a BGP neighbor\n"
d7fa34c1 2659 AS_STR
3a2d747c
QY
2660 "Internal BGP peer\n"
2661 "External BGP peer\n")
718e3744 2662{
c500ae40
DW
2663 int idx_peer = 1;
2664 int idx_remote_as = 3;
2665 return peer_remote_as_vty (vty, argv[idx_peer]->arg, argv[idx_remote_as]->arg, AFI_IP, SAFI_UNICAST);
718e3744 2666}
6b0655a2 2667
4c48cf63
DW
2668static int
2669peer_conf_interface_get (struct vty *vty, const char *conf_if, afi_t afi,
b3a39dc5
DD
2670 safi_t safi, int v6only, const char *peer_group_name,
2671 const char *as_str)
a80beece 2672{
cdc2d765 2673 VTY_DECLVAR_CONTEXT(bgp, bgp);
b3a39dc5
DD
2674 as_t as = 0;
2675 int as_type = AS_UNSPECIFIED;
a80beece
DS
2676 struct peer *peer;
2677 struct peer_group *group;
4c48cf63
DW
2678 int ret = 0;
2679 union sockunion su;
a80beece 2680
4c48cf63
DW
2681 group = peer_group_lookup (bgp, conf_if);
2682
a80beece
DS
2683 if (group)
2684 {
2685 vty_out (vty, "%% Name conflict with peer-group %s", VTY_NEWLINE);
2686 return CMD_WARNING;
2687 }
2688
b3a39dc5
DD
2689 if (as_str)
2690 {
7ae5fc81 2691 if (as_str[0] == 'i')
b3a39dc5
DD
2692 {
2693 as_type = AS_INTERNAL;
2694 }
7ae5fc81 2695 else if (as_str[0] == 'e')
b3a39dc5
DD
2696 {
2697 as_type = AS_EXTERNAL;
2698 }
2699 else
2700 {
2701 /* Get AS number. */
2702 VTY_GET_INTEGER_RANGE ("AS", as, as_str, 1, BGP_AS4_MAX);
2703 as_type = AS_SPECIFIED;
2704 }
2705 }
2706
4c48cf63
DW
2707 peer = peer_lookup_by_conf_if (bgp, conf_if);
2708 if (!peer)
2709 {
2710 if (bgp_flag_check (bgp, BGP_FLAG_NO_DEFAULT_IPV4)
2711 && afi == AFI_IP && safi == SAFI_UNICAST)
b3a39dc5
DD
2712 peer = peer_create (NULL, conf_if, bgp, bgp->as, as, as_type, 0, 0,
2713 NULL);
4c48cf63 2714 else
b3a39dc5
DD
2715 peer = peer_create (NULL, conf_if, bgp, bgp->as, as, as_type, afi, safi,
2716 NULL);
4c48cf63
DW
2717
2718 if (peer && v6only)
2719 SET_FLAG(peer->flags, PEER_FLAG_IFPEER_V6ONLY);
4a04e5f7 2720
2721 /* Request zebra to initiate IPv6 RAs on this interface. We do this
2722 * any unnumbered peer in order to not worry about run-time transitions
2723 * (e.g., peering is initially IPv4, but the IPv4 /30 or /31 address
2724 * gets deleted later etc.)
2725 */
2726 if (peer->ifp)
b3a39dc5
DD
2727 {
2728 bgp_zebra_initiate_radv (bgp, peer);
2729 }
2730 peer_flag_set (peer, PEER_FLAG_CAPABILITY_ENHE);
4c48cf63
DW
2731 }
2732 else if ((v6only && !CHECK_FLAG(peer->flags, PEER_FLAG_IFPEER_V6ONLY)) ||
2733 (!v6only && CHECK_FLAG(peer->flags, PEER_FLAG_IFPEER_V6ONLY)))
2734 {
2735 if (v6only)
2736 SET_FLAG(peer->flags, PEER_FLAG_IFPEER_V6ONLY);
2737 else
2738 UNSET_FLAG(peer->flags, PEER_FLAG_IFPEER_V6ONLY);
2739
2740 /* v6only flag changed. Reset bgp seesion */
2741 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->status))
2742 {
2743 peer->last_reset = PEER_DOWN_V6ONLY_CHANGE;
2744 bgp_notify_send (peer, BGP_NOTIFY_CEASE,
2745 BGP_NOTIFY_CEASE_CONFIG_CHANGE);
2746 }
2747 else
2748 bgp_session_reset(peer);
2749 }
2750
a80beece
DS
2751 if (!peer)
2752 return CMD_WARNING;
2753
4c48cf63
DW
2754 if (peer_group_name)
2755 {
2756 group = peer_group_lookup (bgp, peer_group_name);
2757 if (! group)
2758 {
2759 vty_out (vty, "%% Configure the peer-group first%s", VTY_NEWLINE);
2760 return CMD_WARNING;
2761 }
2762
2763 ret = peer_group_bind (bgp, &su, peer, group, &as);
2764 }
2765
2766 return bgp_vty_return (vty, ret);
a80beece
DS
2767}
2768
4c48cf63
DW
2769DEFUN (neighbor_interface_config,
2770 neighbor_interface_config_cmd,
31500417 2771 "neighbor WORD interface [peer-group WORD]",
4c48cf63
DW
2772 NEIGHBOR_STR
2773 "Interface name or neighbor tag\n"
31500417
DW
2774 "Enable BGP on interface\n"
2775 "Member of the peer-group\n"
16cedbb0 2776 "Peer-group name\n")
4c48cf63 2777{
c500ae40 2778 int idx_word = 1;
31500417
DW
2779 int idx_peer_group_word = 4;
2780
2781 if (argc > idx_peer_group_word)
c500ae40 2782 return peer_conf_interface_get (vty, argv[idx_word]->arg, AFI_IP, SAFI_UNICAST, 0,
31500417 2783 argv[idx_peer_group_word]->arg, NULL);
4c48cf63 2784 else
c500ae40 2785 return peer_conf_interface_get (vty, argv[idx_word]->arg, AFI_IP, SAFI_UNICAST, 0,
b3a39dc5 2786 NULL, NULL);
4c48cf63
DW
2787}
2788
4c48cf63
DW
2789DEFUN (neighbor_interface_config_v6only,
2790 neighbor_interface_config_v6only_cmd,
31500417 2791 "neighbor WORD interface v6only [peer-group WORD]",
4c48cf63
DW
2792 NEIGHBOR_STR
2793 "Interface name or neighbor tag\n"
2794 "Enable BGP on interface\n"
31500417
DW
2795 "Enable BGP with v6 link-local only\n"
2796 "Member of the peer-group\n"
16cedbb0 2797 "Peer-group name\n")
4c48cf63 2798{
c500ae40 2799 int idx_word = 1;
31500417
DW
2800 int idx_peer_group_word = 5;
2801
2802 if (argc > idx_peer_group_word)
2803 return peer_conf_interface_get (vty, argv[idx_word]->arg, AFI_IP, SAFI_UNICAST, 1,
2804 argv[idx_peer_group_word]->arg, NULL);
2805
c500ae40 2806 return peer_conf_interface_get (vty, argv[idx_word]->arg, AFI_IP, SAFI_UNICAST, 1,
31500417 2807 NULL, NULL);
4c48cf63
DW
2808}
2809
a80beece 2810
b3a39dc5
DD
2811DEFUN (neighbor_interface_config_remote_as,
2812 neighbor_interface_config_remote_as_cmd,
3a2d747c 2813 "neighbor WORD interface remote-as <(1-4294967295)|internal|external>",
b3a39dc5
DD
2814 NEIGHBOR_STR
2815 "Interface name or neighbor tag\n"
2816 "Enable BGP on interface\n"
3a2d747c 2817 "Specify a BGP neighbor\n"
d7fa34c1 2818 AS_STR
3a2d747c
QY
2819 "Internal BGP peer\n"
2820 "External BGP peer\n")
b3a39dc5 2821{
c500ae40
DW
2822 int idx_word = 1;
2823 int idx_remote_as = 4;
2824 return peer_conf_interface_get (vty, argv[idx_word]->arg, AFI_IP, SAFI_UNICAST, 0,
2825 NULL, argv[idx_remote_as]->arg);
b3a39dc5
DD
2826}
2827
2828DEFUN (neighbor_interface_v6only_config_remote_as,
2829 neighbor_interface_v6only_config_remote_as_cmd,
3a2d747c 2830 "neighbor WORD interface v6only remote-as <(1-4294967295)|internal|external>",
b3a39dc5
DD
2831 NEIGHBOR_STR
2832 "Interface name or neighbor tag\n"
3a2d747c 2833 "Enable BGP with v6 link-local only\n"
b3a39dc5 2834 "Enable BGP on interface\n"
3a2d747c 2835 "Specify a BGP neighbor\n"
d7fa34c1 2836 AS_STR
3a2d747c
QY
2837 "Internal BGP peer\n"
2838 "External BGP peer\n")
b3a39dc5 2839{
c500ae40
DW
2840 int idx_word = 1;
2841 int idx_remote_as = 5;
2842 return peer_conf_interface_get (vty, argv[idx_word]->arg, AFI_IP, SAFI_UNICAST, 1,
2843 NULL, argv[idx_remote_as]->arg);
b3a39dc5
DD
2844}
2845
718e3744 2846DEFUN (neighbor_peer_group,
2847 neighbor_peer_group_cmd,
2848 "neighbor WORD peer-group",
2849 NEIGHBOR_STR
a80beece 2850 "Interface name or neighbor tag\n"
718e3744 2851 "Configure peer-group\n")
2852{
cdc2d765 2853 VTY_DECLVAR_CONTEXT(bgp, bgp);
c500ae40 2854 int idx_word = 1;
a80beece 2855 struct peer *peer;
718e3744 2856 struct peer_group *group;
2857
c500ae40 2858 peer = peer_lookup_by_conf_if (bgp, argv[idx_word]->arg);
a80beece
DS
2859 if (peer)
2860 {
2861 vty_out (vty, "%% Name conflict with interface: %s", VTY_NEWLINE);
2862 return CMD_WARNING;
2863 }
718e3744 2864
c500ae40 2865 group = peer_group_get (bgp, argv[idx_word]->arg);
718e3744 2866 if (! group)
2867 return CMD_WARNING;
2868
2869 return CMD_SUCCESS;
2870}
2871
2872DEFUN (no_neighbor,
2873 no_neighbor_cmd,
dab8cd00 2874 "no neighbor <WORD|<A.B.C.D|X:X::X:X> [remote-as <(1-4294967295)|internal|external>]>",
718e3744 2875 NO_STR
2876 NEIGHBOR_STR
3a2d747c
QY
2877 NEIGHBOR_ADDR_STR2
2878 "Specify a BGP neighbor\n"
2879 AS_STR
2880 "Internal BGP peer\n"
2881 "External BGP peer\n")
718e3744 2882{
cdc2d765 2883 VTY_DECLVAR_CONTEXT(bgp, bgp);
c500ae40 2884 int idx_peer = 2;
718e3744 2885 int ret;
2886 union sockunion su;
2887 struct peer_group *group;
2888 struct peer *peer;
1ff9a340 2889 struct peer *other;
718e3744 2890
c500ae40 2891 ret = str2sockunion (argv[idx_peer]->arg, &su);
718e3744 2892 if (ret < 0)
2893 {
a80beece 2894 /* look up for neighbor by interface name config. */
cdc2d765 2895 peer = peer_lookup_by_conf_if (bgp, argv[idx_peer]->arg);
a80beece
DS
2896 if (peer)
2897 {
4a04e5f7 2898 /* Request zebra to terminate IPv6 RAs on this interface. */
2899 if (peer->ifp)
2900 bgp_zebra_terminate_radv (peer->bgp, peer);
a80beece
DS
2901 peer_delete (peer);
2902 return CMD_SUCCESS;
2903 }
2904
cdc2d765 2905 group = peer_group_lookup (bgp, argv[idx_peer]->arg);
718e3744 2906 if (group)
2907 peer_group_delete (group);
2908 else
2909 {
2910 vty_out (vty, "%% Create the peer-group first%s", VTY_NEWLINE);
2911 return CMD_WARNING;
2912 }
2913 }
2914 else
2915 {
cdc2d765 2916 peer = peer_lookup (bgp, &su);
718e3744 2917 if (peer)
1ff9a340 2918 {
f14e6fdb
DS
2919 if (peer_dynamic_neighbor (peer))
2920 {
2921 vty_out (vty, "%% Operation not allowed on a dynamic neighbor%s",
2922 VTY_NEWLINE);
2923 return CMD_WARNING;
2924 }
2925
1ff9a340
DS
2926 other = peer->doppelganger;
2927 peer_delete (peer);
2928 if (other && other->status != Deleted)
2929 peer_delete(other);
2930 }
718e3744 2931 }
2932
2933 return CMD_SUCCESS;
2934}
2935
a80beece
DS
2936DEFUN (no_neighbor_interface_config,
2937 no_neighbor_interface_config_cmd,
31500417 2938 "no neighbor WORD interface [v6only] [peer-group WORD] [remote-as <(1-4294967295)|internal|external>]",
a80beece
DS
2939 NO_STR
2940 NEIGHBOR_STR
2941 "Interface name\n"
31500417
DW
2942 "Configure BGP on interface\n"
2943 "Enable BGP with v6 link-local only\n"
2944 "Member of the peer-group\n"
16cedbb0 2945 "Peer-group name\n"
3a2d747c
QY
2946 "Specify a BGP neighbor\n"
2947 AS_STR
2948 "Internal BGP peer\n"
2949 "External BGP peer\n")
a80beece 2950{
cdc2d765 2951 VTY_DECLVAR_CONTEXT(bgp, bgp);
c500ae40 2952 int idx_word = 2;
a80beece
DS
2953 struct peer *peer;
2954
2955 /* look up for neighbor by interface name config. */
cdc2d765 2956 peer = peer_lookup_by_conf_if (bgp, argv[idx_word]->arg);
a80beece
DS
2957 if (peer)
2958 {
4a04e5f7 2959 /* Request zebra to terminate IPv6 RAs on this interface. */
2960 if (peer->ifp)
2961 bgp_zebra_terminate_radv (peer->bgp, peer);
a80beece
DS
2962 peer_delete (peer);
2963 }
2964 else
2965 {
2966 vty_out (vty, "%% Create the bgp interface first%s", VTY_NEWLINE);
2967 return CMD_WARNING;
2968 }
2969 return CMD_SUCCESS;
2970}
2971
718e3744 2972DEFUN (no_neighbor_peer_group,
2973 no_neighbor_peer_group_cmd,
2974 "no neighbor WORD peer-group",
2975 NO_STR
2976 NEIGHBOR_STR
2977 "Neighbor tag\n"
2978 "Configure peer-group\n")
2979{
cdc2d765 2980 VTY_DECLVAR_CONTEXT(bgp, bgp);
c500ae40 2981 int idx_word = 2;
718e3744 2982 struct peer_group *group;
2983
cdc2d765 2984 group = peer_group_lookup (bgp, argv[idx_word]->arg);
718e3744 2985 if (group)
2986 peer_group_delete (group);
2987 else
2988 {
2989 vty_out (vty, "%% Create the peer-group first%s", VTY_NEWLINE);
2990 return CMD_WARNING;
2991 }
2992 return CMD_SUCCESS;
2993}
2994
a80beece
DS
2995DEFUN (no_neighbor_interface_peer_group_remote_as,
2996 no_neighbor_interface_peer_group_remote_as_cmd,
9ccf14f7 2997 "no neighbor WORD remote-as <(1-4294967295)|internal|external>",
718e3744 2998 NO_STR
2999 NEIGHBOR_STR
a80beece 3000 "Interface name or neighbor tag\n"
718e3744 3001 "Specify a BGP neighbor\n"
3a2d747c
QY
3002 AS_STR
3003 "Internal BGP peer\n"
3004 "External BGP peer\n")
718e3744 3005{
cdc2d765 3006 VTY_DECLVAR_CONTEXT(bgp, bgp);
c500ae40 3007 int idx_word = 2;
718e3744 3008 struct peer_group *group;
a80beece
DS
3009 struct peer *peer;
3010
3011 /* look up for neighbor by interface name config. */
cdc2d765 3012 peer = peer_lookup_by_conf_if (bgp, argv[idx_word]->arg);
a80beece
DS
3013 if (peer)
3014 {
0299c004 3015 peer_as_change (peer, 0, AS_SPECIFIED);
a80beece
DS
3016 return CMD_SUCCESS;
3017 }
718e3744 3018
cdc2d765 3019 group = peer_group_lookup (bgp, argv[idx_word]->arg);
718e3744 3020 if (group)
3021 peer_group_remote_as_delete (group);
3022 else
3023 {
a80beece 3024 vty_out (vty, "%% Create the peer-group or interface first%s", VTY_NEWLINE);
718e3744 3025 return CMD_WARNING;
3026 }
3027 return CMD_SUCCESS;
3028}
6b0655a2 3029
718e3744 3030DEFUN (neighbor_local_as,
3031 neighbor_local_as_cmd,
9ccf14f7 3032 "neighbor <A.B.C.D|X:X::X:X|WORD> local-as (1-4294967295)",
718e3744 3033 NEIGHBOR_STR
3034 NEIGHBOR_ADDR_STR2
3035 "Specify a local-as number\n"
3036 "AS number used as local AS\n")
3037{
c500ae40
DW
3038 int idx_peer = 1;
3039 int idx_number = 3;
718e3744 3040 struct peer *peer;
3041 int ret;
e14fda0f 3042 as_t as;
718e3744 3043
c500ae40 3044 peer = peer_and_group_lookup_vty (vty, argv[idx_peer]->arg);
718e3744 3045 if (! peer)
3046 return CMD_WARNING;
3047
b6f1faf0 3048 VTY_GET_INTEGER_RANGE ("Local AS", as, argv[idx_number]->arg, 1, BGP_AS4_MAX);
e14fda0f 3049 ret = peer_local_as_set (peer, as, 0, 0);
718e3744 3050 return bgp_vty_return (vty, ret);
3051}
3052
3053DEFUN (neighbor_local_as_no_prepend,
3054 neighbor_local_as_no_prepend_cmd,
9ccf14f7 3055 "neighbor <A.B.C.D|X:X::X:X|WORD> local-as (1-4294967295) no-prepend",
718e3744 3056 NEIGHBOR_STR
3057 NEIGHBOR_ADDR_STR2
3058 "Specify a local-as number\n"
3059 "AS number used as local AS\n"
3060 "Do not prepend local-as to updates from ebgp peers\n")
3061{
c500ae40
DW
3062 int idx_peer = 1;
3063 int idx_number = 3;
718e3744 3064 struct peer *peer;
3065 int ret;
e14fda0f 3066 as_t as;
718e3744 3067
c500ae40 3068 peer = peer_and_group_lookup_vty (vty, argv[idx_peer]->arg);
718e3744 3069 if (! peer)
3070 return CMD_WARNING;
3071
b6f1faf0 3072 VTY_GET_INTEGER_RANGE ("Local AS", as, argv[idx_number]->arg, 1, BGP_AS4_MAX);
e14fda0f 3073 ret = peer_local_as_set (peer, as, 1, 0);
718e3744 3074 return bgp_vty_return (vty, ret);
3075}
3076
9d3f9705
AC
3077DEFUN (neighbor_local_as_no_prepend_replace_as,
3078 neighbor_local_as_no_prepend_replace_as_cmd,
9ccf14f7 3079 "neighbor <A.B.C.D|X:X::X:X|WORD> local-as (1-4294967295) no-prepend replace-as",
9d3f9705
AC
3080 NEIGHBOR_STR
3081 NEIGHBOR_ADDR_STR2
3082 "Specify a local-as number\n"
3083 "AS number used as local AS\n"
3084 "Do not prepend local-as to updates from ebgp peers\n"
3085 "Do not prepend local-as to updates from ibgp peers\n")
3086{
c500ae40
DW
3087 int idx_peer = 1;
3088 int idx_number = 3;
9d3f9705
AC
3089 struct peer *peer;
3090 int ret;
e14fda0f 3091 as_t as;
9d3f9705 3092
c500ae40 3093 peer = peer_and_group_lookup_vty (vty, argv[idx_peer]->arg);
9d3f9705
AC
3094 if (! peer)
3095 return CMD_WARNING;
3096
b6f1faf0 3097 VTY_GET_INTEGER_RANGE ("Local AS", as, argv[idx_number]->arg, 1, BGP_AS4_MAX);
e14fda0f 3098 ret = peer_local_as_set (peer, as, 1, 1);
9d3f9705
AC
3099 return bgp_vty_return (vty, ret);
3100}
3101
718e3744 3102DEFUN (no_neighbor_local_as,
3103 no_neighbor_local_as_cmd,
a636c635 3104 "no neighbor <A.B.C.D|X:X::X:X|WORD> local-as [(1-4294967295) [no-prepend [replace-as]]]",
718e3744 3105 NO_STR
3106 NEIGHBOR_STR
3107 NEIGHBOR_ADDR_STR2
a636c635
DW
3108 "Specify a local-as number\n"
3109 "AS number used as local AS\n"
3110 "Do not prepend local-as to updates from ebgp peers\n"
3111 "Do not prepend local-as to updates from ibgp peers\n")
718e3744 3112{
c500ae40 3113 int idx_peer = 2;
718e3744 3114 struct peer *peer;
3115 int ret;
3116
c500ae40 3117 peer = peer_and_group_lookup_vty (vty, argv[idx_peer]->arg);
718e3744 3118 if (! peer)
3119 return CMD_WARNING;
3120
3121 ret = peer_local_as_unset (peer);
3122 return bgp_vty_return (vty, ret);
3123}
3124
718e3744 3125
9d3f9705 3126
6b0655a2 3127
3f9c7369
DS
3128DEFUN (neighbor_solo,
3129 neighbor_solo_cmd,
9ccf14f7 3130 "neighbor <A.B.C.D|X:X::X:X|WORD> solo",
3f9c7369
DS
3131 NEIGHBOR_STR
3132 NEIGHBOR_ADDR_STR2
3133 "Solo peer - part of its own update group\n")
3134{
c500ae40 3135 int idx_peer = 1;
3f9c7369
DS
3136 struct peer *peer;
3137 int ret;
3138
c500ae40 3139 peer = peer_and_group_lookup_vty (vty, argv[idx_peer]->arg);
3f9c7369
DS
3140 if (! peer)
3141 return CMD_WARNING;
3142
3143 ret = update_group_adjust_soloness(peer, 1);
3144 return bgp_vty_return (vty, ret);
3145}
3146
3147DEFUN (no_neighbor_solo,
3148 no_neighbor_solo_cmd,
9ccf14f7 3149 "no neighbor <A.B.C.D|X:X::X:X|WORD> solo",
3f9c7369
DS
3150 NO_STR
3151 NEIGHBOR_STR
3152 NEIGHBOR_ADDR_STR2
3153 "Solo peer - part of its own update group\n")
3154{
c500ae40 3155 int idx_peer = 2;
3f9c7369
DS
3156 struct peer *peer;
3157 int ret;
3158
c500ae40 3159 peer = peer_and_group_lookup_vty (vty, argv[idx_peer]->arg);
3f9c7369
DS
3160 if (! peer)
3161 return CMD_WARNING;
3162
3163 ret = update_group_adjust_soloness(peer, 0);
3164 return bgp_vty_return (vty, ret);
3165}
3166
0df7c91f
PJ
3167DEFUN (neighbor_password,
3168 neighbor_password_cmd,
9ccf14f7 3169 "neighbor <A.B.C.D|X:X::X:X|WORD> password LINE",
0df7c91f
PJ
3170 NEIGHBOR_STR
3171 NEIGHBOR_ADDR_STR2
3172 "Set a password\n"
3173 "The password\n")
3174{
c500ae40
DW
3175 int idx_peer = 1;
3176 int idx_line = 3;
0df7c91f
PJ
3177 struct peer *peer;
3178 int ret;
3179
c500ae40 3180 peer = peer_and_group_lookup_vty (vty, argv[idx_peer]->arg);
0df7c91f
PJ
3181 if (! peer)
3182 return CMD_WARNING;
3183
c500ae40 3184 ret = peer_password_set (peer, argv[idx_line]->arg);
0df7c91f
PJ
3185 return bgp_vty_return (vty, ret);
3186}
3187
3188DEFUN (no_neighbor_password,
3189 no_neighbor_password_cmd,
a636c635 3190 "no neighbor <A.B.C.D|X:X::X:X|WORD> password [LINE]",
0df7c91f
PJ
3191 NO_STR
3192 NEIGHBOR_STR
3193 NEIGHBOR_ADDR_STR2
16cedbb0
QY
3194 "Set a password\n"
3195 "The password\n")
0df7c91f 3196{
c500ae40 3197 int idx_peer = 2;
0df7c91f
PJ
3198 struct peer *peer;
3199 int ret;
3200
c500ae40 3201 peer = peer_and_group_lookup_vty (vty, argv[idx_peer]->arg);
0df7c91f
PJ
3202 if (! peer)
3203 return CMD_WARNING;
3204
3205 ret = peer_password_unset (peer);
3206 return bgp_vty_return (vty, ret);
3207}
6b0655a2 3208
813d4307 3209
718e3744 3210DEFUN (neighbor_activate,
3211 neighbor_activate_cmd,
9ccf14f7 3212 "neighbor <A.B.C.D|X:X::X:X|WORD> activate",
718e3744 3213 NEIGHBOR_STR
3214 NEIGHBOR_ADDR_STR2
3215 "Enable the Address Family for this Neighbor\n")
3216{
c500ae40 3217 int idx_peer = 1;
c8560b44 3218 int ret;
718e3744 3219 struct peer *peer;
3220
c500ae40 3221 peer = peer_and_group_lookup_vty (vty, argv[idx_peer]->arg);
718e3744 3222 if (! peer)
3223 return CMD_WARNING;
3224
c8560b44 3225 ret = peer_activate (peer, bgp_node_afi (vty), bgp_node_safi (vty));
718e3744 3226
c8560b44
DW
3227 if (ret)
3228 return CMD_WARNING;
718e3744 3229 return CMD_SUCCESS;
3230}
3231
3232DEFUN (no_neighbor_activate,
3233 no_neighbor_activate_cmd,
9ccf14f7 3234 "no neighbor <A.B.C.D|X:X::X:X|WORD> activate",
718e3744 3235 NO_STR
3236 NEIGHBOR_STR
3237 NEIGHBOR_ADDR_STR2
3238 "Enable the Address Family for this Neighbor\n")
3239{
c500ae40 3240 int idx_peer = 2;
718e3744 3241 int ret;
3242 struct peer *peer;
3243
3244 /* Lookup peer. */
c500ae40 3245 peer = peer_and_group_lookup_vty (vty, argv[idx_peer]->arg);
718e3744 3246 if (! peer)
3247 return CMD_WARNING;
3248
3249 ret = peer_deactivate (peer, bgp_node_afi (vty), bgp_node_safi (vty));
3250
c8560b44
DW
3251 if (ret)
3252 return CMD_WARNING;
3253 return CMD_SUCCESS;
718e3744 3254}
6b0655a2 3255
718e3744 3256DEFUN (neighbor_set_peer_group,
3257 neighbor_set_peer_group_cmd,
9ccf14f7 3258 "neighbor <A.B.C.D|X:X::X:X|WORD> peer-group WORD",
718e3744 3259 NEIGHBOR_STR
a80beece 3260 NEIGHBOR_ADDR_STR2
718e3744 3261 "Member of the peer-group\n"
16cedbb0 3262 "Peer-group name\n")
718e3744 3263{
cdc2d765 3264 VTY_DECLVAR_CONTEXT(bgp, bgp);
c500ae40
DW
3265 int idx_peer = 1;
3266 int idx_word = 3;
718e3744 3267 int ret;
3268 as_t as;
3269 union sockunion su;
a80beece 3270 struct peer *peer;
718e3744 3271 struct peer_group *group;
3272
a80beece 3273 peer = NULL;
718e3744 3274
c500ae40 3275 ret = str2sockunion (argv[idx_peer]->arg, &su);
718e3744 3276 if (ret < 0)
3277 {
c500ae40 3278 peer = peer_lookup_by_conf_if (bgp, argv[idx_peer]->arg);
a80beece
DS
3279 if (!peer)
3280 {
c500ae40 3281 vty_out (vty, "%% Malformed address or name: %s%s", argv[idx_peer]->arg, VTY_NEWLINE);
a80beece
DS
3282 return CMD_WARNING;
3283 }
3284 }
3285 else
3286 {
6aeb9e78 3287 if (peer_address_self_check (bgp, &su))
a80beece
DS
3288 {
3289 vty_out (vty, "%% Can not configure the local system as neighbor%s",
3290 VTY_NEWLINE);
3291 return CMD_WARNING;
3292 }
f14e6fdb
DS
3293
3294 /* Disallow for dynamic neighbor. */
3295 peer = peer_lookup (bgp, &su);
3296 if (peer && peer_dynamic_neighbor (peer))
3297 {
3298 vty_out (vty, "%% Operation not allowed on a dynamic neighbor%s",
3299 VTY_NEWLINE);
3300 return CMD_WARNING;
3301 }
718e3744 3302 }
3303
c500ae40 3304 group = peer_group_lookup (bgp, argv[idx_word]->arg);
718e3744 3305 if (! group)
3306 {
3307 vty_out (vty, "%% Configure the peer-group first%s", VTY_NEWLINE);
3308 return CMD_WARNING;
3309 }
3310
c8560b44 3311 ret = peer_group_bind (bgp, &su, peer, group, &as);
718e3744 3312
3313 if (ret == BGP_ERR_PEER_GROUP_PEER_TYPE_DIFFERENT)
3314 {
aea339f7 3315 vty_out (vty, "%% Peer with AS %u cannot be in this peer-group, members must be all internal or all external%s", as, VTY_NEWLINE);
718e3744 3316 return CMD_WARNING;
3317 }
3318
3319 return bgp_vty_return (vty, ret);
3320}
3321
3322DEFUN (no_neighbor_set_peer_group,
3323 no_neighbor_set_peer_group_cmd,
9ccf14f7 3324 "no neighbor <A.B.C.D|X:X::X:X|WORD> peer-group WORD",
718e3744 3325 NO_STR
3326 NEIGHBOR_STR
a80beece 3327 NEIGHBOR_ADDR_STR2
718e3744 3328 "Member of the peer-group\n"
16cedbb0 3329 "Peer-group name\n")
718e3744 3330{
cdc2d765 3331 VTY_DECLVAR_CONTEXT(bgp, bgp);
c500ae40
DW
3332 int idx_peer = 2;
3333 int idx_word = 4;
718e3744 3334 int ret;
718e3744 3335 struct peer *peer;
3336 struct peer_group *group;
3337
c500ae40 3338 peer = peer_lookup_vty (vty, argv[idx_peer]->arg);
718e3744 3339 if (! peer)
3340 return CMD_WARNING;
3341
c500ae40 3342 group = peer_group_lookup (bgp, argv[idx_word]->arg);
718e3744 3343 if (! group)
3344 {
3345 vty_out (vty, "%% Configure the peer-group first%s", VTY_NEWLINE);
3346 return CMD_WARNING;
3347 }
3348
c8560b44 3349 ret = peer_group_unbind (bgp, peer, group);
718e3744 3350
3351 return bgp_vty_return (vty, ret);
3352}
6b0655a2 3353
94f2b392 3354static int
e52702f2 3355peer_flag_modify_vty (struct vty *vty, const char *ip_str,
fd79ac91 3356 u_int16_t flag, int set)
718e3744 3357{
3358 int ret;
3359 struct peer *peer;
3360
3361 peer = peer_and_group_lookup_vty (vty, ip_str);
3362 if (! peer)
3363 return CMD_WARNING;
3364
8cdabf90
SK
3365 /*
3366 * If 'neighbor <interface>', then this is for directly connected peers,
3367 * we should not accept disable-connected-check.
3368 */
3369 if (peer->conf_if && (flag == PEER_FLAG_DISABLE_CONNECTED_CHECK)) {
3370 vty_out (vty, "%s is directly connected peer, cannot accept disable-"
3371 "connected-check%s", ip_str, VTY_NEWLINE);
3372 return CMD_WARNING;
3373 }
3374
718e3744 3375 if (set)
3376 ret = peer_flag_set (peer, flag);
3377 else
3378 ret = peer_flag_unset (peer, flag);
3379
3380 return bgp_vty_return (vty, ret);
3381}
3382
94f2b392 3383static int
fd79ac91 3384peer_flag_set_vty (struct vty *vty, const char *ip_str, u_int16_t flag)
718e3744 3385{
3386 return peer_flag_modify_vty (vty, ip_str, flag, 1);
3387}
3388
94f2b392 3389static int
fd79ac91 3390peer_flag_unset_vty (struct vty *vty, const char *ip_str, u_int16_t flag)
718e3744 3391{
3392 return peer_flag_modify_vty (vty, ip_str, flag, 0);
3393}
3394
3395/* neighbor passive. */
3396DEFUN (neighbor_passive,
3397 neighbor_passive_cmd,
9ccf14f7 3398 "neighbor <A.B.C.D|X:X::X:X|WORD> passive",
718e3744 3399 NEIGHBOR_STR
3400 NEIGHBOR_ADDR_STR2
3401 "Don't send open messages to this neighbor\n")
3402{
c500ae40
DW
3403 int idx_peer = 1;
3404 return peer_flag_set_vty (vty, argv[idx_peer]->arg, PEER_FLAG_PASSIVE);
718e3744 3405}
3406
3407DEFUN (no_neighbor_passive,
3408 no_neighbor_passive_cmd,
9ccf14f7 3409 "no neighbor <A.B.C.D|X:X::X:X|WORD> passive",
718e3744 3410 NO_STR
3411 NEIGHBOR_STR
3412 NEIGHBOR_ADDR_STR2
3413 "Don't send open messages to this neighbor\n")
3414{
c500ae40
DW
3415 int idx_peer = 2;
3416 return peer_flag_unset_vty (vty, argv[idx_peer]->arg, PEER_FLAG_PASSIVE);
718e3744 3417}
6b0655a2 3418
718e3744 3419/* neighbor shutdown. */
73d70fa6
DL
3420DEFUN (neighbor_shutdown_msg,
3421 neighbor_shutdown_msg_cmd,
3422 "neighbor <A.B.C.D|X:X::X:X|WORD> shutdown message MSG...",
718e3744 3423 NEIGHBOR_STR
3424 NEIGHBOR_ADDR_STR2
73d70fa6
DL
3425 "Administratively shut down this neighbor\n"
3426 "Add a shutdown message (draft-ietf-idr-shutdown-06)\n"
3427 "Shutdown message\n")
718e3744 3428{
c500ae40 3429 int idx_peer = 1;
73d70fa6
DL
3430
3431 if (argc >= 5)
3432 {
3433 struct peer *peer = peer_lookup_vty (vty, argv[idx_peer]->arg);
3434 char *message;
3435
3436 message = argv_concat (argv, argc, 4);
3437 peer_tx_shutdown_message_set (peer, message);
3438 XFREE (MTYPE_TMP, message);
3439 }
3440
c500ae40 3441 return peer_flag_set_vty (vty, argv[idx_peer]->arg, PEER_FLAG_SHUTDOWN);
718e3744 3442}
3443
73d70fa6
DL
3444ALIAS (neighbor_shutdown_msg,
3445 neighbor_shutdown_cmd,
3446 "neighbor <A.B.C.D|X:X::X:X|WORD> shutdown",
718e3744 3447 NEIGHBOR_STR
3448 NEIGHBOR_ADDR_STR2
3449 "Administratively shut down this neighbor\n")
73d70fa6
DL
3450
3451DEFUN (no_neighbor_shutdown_msg,
3452 no_neighbor_shutdown_msg_cmd,
3453 "no neighbor <A.B.C.D|X:X::X:X|WORD> shutdown message MSG...",
3454 NO_STR
3455 NEIGHBOR_STR
3456 NEIGHBOR_ADDR_STR2
3457 "Administratively shut down this neighbor\n"
3458 "Remove a shutdown message (draft-ietf-idr-shutdown-06)\n"
3459 "Shutdown message\n")
718e3744 3460{
c500ae40 3461 int idx_peer = 2;
73d70fa6
DL
3462
3463 struct peer *peer = peer_lookup_vty (vty, argv[idx_peer]->arg);
3464 peer_tx_shutdown_message_unset (peer);
3465
c500ae40 3466 return peer_flag_unset_vty (vty, argv[idx_peer]->arg, PEER_FLAG_SHUTDOWN);
718e3744 3467}
6b0655a2 3468
73d70fa6
DL
3469ALIAS (no_neighbor_shutdown_msg,
3470 no_neighbor_shutdown_cmd,
3471 "no neighbor <A.B.C.D|X:X::X:X|WORD> shutdown",
3472 NO_STR
3473 NEIGHBOR_STR
3474 NEIGHBOR_ADDR_STR2
3475 "Administratively shut down this neighbor\n")
3476
718e3744 3477/* neighbor capability dynamic. */
3478DEFUN (neighbor_capability_dynamic,
3479 neighbor_capability_dynamic_cmd,
9ccf14f7 3480 "neighbor <A.B.C.D|X:X::X:X|WORD> capability dynamic",
718e3744 3481 NEIGHBOR_STR
3482 NEIGHBOR_ADDR_STR2
3483 "Advertise capability to the peer\n"
3484 "Advertise dynamic capability to this neighbor\n")
3485{
c500ae40
DW
3486 int idx_peer = 1;
3487 return peer_flag_set_vty (vty, argv[idx_peer]->arg, PEER_FLAG_DYNAMIC_CAPABILITY);
718e3744 3488}
3489
3490DEFUN (no_neighbor_capability_dynamic,
3491 no_neighbor_capability_dynamic_cmd,
9ccf14f7 3492 "no neighbor <A.B.C.D|X:X::X:X|WORD> capability dynamic",
718e3744 3493 NO_STR
3494 NEIGHBOR_STR
3495 NEIGHBOR_ADDR_STR2
3496 "Advertise capability to the peer\n"
3497 "Advertise dynamic capability to this neighbor\n")
3498{
c500ae40
DW
3499 int idx_peer = 2;
3500 return peer_flag_unset_vty (vty, argv[idx_peer]->arg, PEER_FLAG_DYNAMIC_CAPABILITY);
718e3744 3501}
6b0655a2 3502
718e3744 3503/* neighbor dont-capability-negotiate */
3504DEFUN (neighbor_dont_capability_negotiate,
3505 neighbor_dont_capability_negotiate_cmd,
9ccf14f7 3506 "neighbor <A.B.C.D|X:X::X:X|WORD> dont-capability-negotiate",
718e3744 3507 NEIGHBOR_STR
3508 NEIGHBOR_ADDR_STR2
3509 "Do not perform capability negotiation\n")
3510{
c500ae40
DW
3511 int idx_peer = 1;
3512 return peer_flag_set_vty (vty, argv[idx_peer]->arg, PEER_FLAG_DONT_CAPABILITY);
718e3744 3513}
3514
3515DEFUN (no_neighbor_dont_capability_negotiate,
3516 no_neighbor_dont_capability_negotiate_cmd,
9ccf14f7 3517 "no neighbor <A.B.C.D|X:X::X:X|WORD> dont-capability-negotiate",
718e3744 3518 NO_STR
3519 NEIGHBOR_STR
3520 NEIGHBOR_ADDR_STR2
3521 "Do not perform capability negotiation\n")
3522{
c500ae40
DW
3523 int idx_peer = 2;
3524 return peer_flag_unset_vty (vty, argv[idx_peer]->arg, PEER_FLAG_DONT_CAPABILITY);
718e3744 3525}
6b0655a2 3526
8a92a8a0
DS
3527/* neighbor capability extended next hop encoding */
3528DEFUN (neighbor_capability_enhe,
3529 neighbor_capability_enhe_cmd,
9ccf14f7 3530 "neighbor <A.B.C.D|X:X::X:X|WORD> capability extended-nexthop",
8a92a8a0
DS
3531 NEIGHBOR_STR
3532 NEIGHBOR_ADDR_STR2
3533 "Advertise capability to the peer\n"
3534 "Advertise extended next-hop capability to the peer\n")
3535{
c500ae40
DW
3536 int idx_peer = 1;
3537 return peer_flag_set_vty (vty, argv[idx_peer]->arg, PEER_FLAG_CAPABILITY_ENHE);
8a92a8a0
DS
3538}
3539
3540DEFUN (no_neighbor_capability_enhe,
3541 no_neighbor_capability_enhe_cmd,
9ccf14f7 3542 "no neighbor <A.B.C.D|X:X::X:X|WORD> capability extended-nexthop",
8a92a8a0
DS
3543 NO_STR
3544 NEIGHBOR_STR
3545 NEIGHBOR_ADDR_STR2
3546 "Advertise capability to the peer\n"
3547 "Advertise extended next-hop capability to the peer\n")
3548{
c500ae40
DW
3549 int idx_peer = 2;
3550 return peer_flag_unset_vty (vty, argv[idx_peer]->arg, PEER_FLAG_CAPABILITY_ENHE);
8a92a8a0
DS
3551}
3552
94f2b392 3553static int
fd79ac91 3554peer_af_flag_modify_vty (struct vty *vty, const char *peer_str, afi_t afi,
fee0f4c6 3555 safi_t safi, u_int32_t flag, int set)
718e3744 3556{
3557 int ret;
3558 struct peer *peer;
3559
3560 peer = peer_and_group_lookup_vty (vty, peer_str);
3561 if (! peer)
3562 return CMD_WARNING;
3563
3564 if (set)
3565 ret = peer_af_flag_set (peer, afi, safi, flag);
3566 else
3567 ret = peer_af_flag_unset (peer, afi, safi, flag);
3568
3569 return bgp_vty_return (vty, ret);
3570}
3571
94f2b392 3572static int
fd79ac91 3573peer_af_flag_set_vty (struct vty *vty, const char *peer_str, afi_t afi,
fee0f4c6 3574 safi_t safi, u_int32_t flag)
718e3744 3575{
3576 return peer_af_flag_modify_vty (vty, peer_str, afi, safi, flag, 1);
3577}
3578
94f2b392 3579static int
fd79ac91 3580peer_af_flag_unset_vty (struct vty *vty, const char *peer_str, afi_t afi,
fee0f4c6 3581 safi_t safi, u_int32_t flag)
718e3744 3582{
3583 return peer_af_flag_modify_vty (vty, peer_str, afi, safi, flag, 0);
3584}
6b0655a2 3585
718e3744 3586/* neighbor capability orf prefix-list. */
3587DEFUN (neighbor_capability_orf_prefix,
3588 neighbor_capability_orf_prefix_cmd,
9ccf14f7 3589 "neighbor <A.B.C.D|X:X::X:X|WORD> capability orf prefix-list <both|send|receive>",
718e3744 3590 NEIGHBOR_STR
3591 NEIGHBOR_ADDR_STR2
3592 "Advertise capability to the peer\n"
3593 "Advertise ORF capability to the peer\n"
3594 "Advertise prefixlist ORF capability to this neighbor\n"
3595 "Capability to SEND and RECEIVE the ORF to/from this neighbor\n"
3596 "Capability to RECEIVE the ORF from this neighbor\n"
3597 "Capability to SEND the ORF to this neighbor\n")
3598{
c500ae40
DW
3599 int idx_peer = 1;
3600 int idx_send_recv = 5;
718e3744 3601 u_int16_t flag = 0;
3602
c500ae40 3603 if (strncmp (argv[idx_send_recv]->arg, "s", 1) == 0)
718e3744 3604 flag = PEER_FLAG_ORF_PREFIX_SM;
c500ae40 3605 else if (strncmp (argv[idx_send_recv]->arg, "r", 1) == 0)
718e3744 3606 flag = PEER_FLAG_ORF_PREFIX_RM;
c500ae40 3607 else if (strncmp (argv[idx_send_recv]->arg, "b", 1) == 0)
718e3744 3608 flag = PEER_FLAG_ORF_PREFIX_SM|PEER_FLAG_ORF_PREFIX_RM;
3609 else
3610 return CMD_WARNING;
3611
c500ae40 3612 return peer_af_flag_set_vty (vty, argv[idx_peer]->arg, bgp_node_afi (vty),
718e3744 3613 bgp_node_safi (vty), flag);
3614}
3615
3616DEFUN (no_neighbor_capability_orf_prefix,
3617 no_neighbor_capability_orf_prefix_cmd,
9ccf14f7 3618 "no neighbor <A.B.C.D|X:X::X:X|WORD> capability orf prefix-list <both|send|receive>",
718e3744 3619 NO_STR
3620 NEIGHBOR_STR
3621 NEIGHBOR_ADDR_STR2
3622 "Advertise capability to the peer\n"
3623 "Advertise ORF capability to the peer\n"
3624 "Advertise prefixlist ORF capability to this neighbor\n"
3625 "Capability to SEND and RECEIVE the ORF to/from this neighbor\n"
3626 "Capability to RECEIVE the ORF from this neighbor\n"
3627 "Capability to SEND the ORF to this neighbor\n")
3628{
c500ae40
DW
3629 int idx_peer = 2;
3630 int idx_send_recv = 6;
718e3744 3631 u_int16_t flag = 0;
3632
c500ae40 3633 if (strncmp (argv[idx_send_recv]->arg, "s", 1) == 0)
718e3744 3634 flag = PEER_FLAG_ORF_PREFIX_SM;
c500ae40 3635 else if (strncmp (argv[idx_send_recv]->arg, "r", 1) == 0)
718e3744 3636 flag = PEER_FLAG_ORF_PREFIX_RM;
c500ae40 3637 else if (strncmp (argv[idx_send_recv]->arg, "b", 1) == 0)
718e3744 3638 flag = PEER_FLAG_ORF_PREFIX_SM|PEER_FLAG_ORF_PREFIX_RM;
3639 else
3640 return CMD_WARNING;
3641
c500ae40 3642 return peer_af_flag_unset_vty (vty, argv[idx_peer]->arg, bgp_node_afi (vty),
718e3744 3643 bgp_node_safi (vty), flag);
3644}
6b0655a2 3645
718e3744 3646/* neighbor next-hop-self. */
3647DEFUN (neighbor_nexthop_self,
3648 neighbor_nexthop_self_cmd,
9ccf14f7 3649 "neighbor <A.B.C.D|X:X::X:X|WORD> next-hop-self",
718e3744 3650 NEIGHBOR_STR
3651 NEIGHBOR_ADDR_STR2
a538debe 3652 "Disable the next hop calculation for this neighbor\n")
718e3744 3653{
c500ae40
DW
3654 int idx_peer = 1;
3655 return peer_af_flag_set_vty (vty, argv[idx_peer]->arg, bgp_node_afi (vty),
a538debe
DS
3656 bgp_node_safi (vty), PEER_FLAG_NEXTHOP_SELF);
3657}
9e7a53c1 3658
a538debe
DS
3659/* neighbor next-hop-self. */
3660DEFUN (neighbor_nexthop_self_force,
3661 neighbor_nexthop_self_force_cmd,
9ccf14f7 3662 "neighbor <A.B.C.D|X:X::X:X|WORD> next-hop-self force",
a538debe
DS
3663 NEIGHBOR_STR
3664 NEIGHBOR_ADDR_STR2
3665 "Disable the next hop calculation for this neighbor\n"
3666 "Set the next hop to self for reflected routes\n")
3667{
c500ae40
DW
3668 int idx_peer = 1;
3669 return peer_af_flag_set_vty (vty, argv[idx_peer]->arg, bgp_node_afi (vty),
a538debe 3670 bgp_node_safi (vty),
88b8ed8d 3671 PEER_FLAG_FORCE_NEXTHOP_SELF);
718e3744 3672}
3673
3674DEFUN (no_neighbor_nexthop_self,
3675 no_neighbor_nexthop_self_cmd,
9ccf14f7 3676 "no neighbor <A.B.C.D|X:X::X:X|WORD> next-hop-self",
718e3744 3677 NO_STR
3678 NEIGHBOR_STR
3679 NEIGHBOR_ADDR_STR2
a538debe 3680 "Disable the next hop calculation for this neighbor\n")
718e3744 3681{
c500ae40
DW
3682 int idx_peer = 2;
3683 return peer_af_flag_unset_vty (vty, argv[idx_peer]->arg, bgp_node_afi (vty),
9e7a53c1 3684 bgp_node_safi (vty),
88b8ed8d 3685 PEER_FLAG_NEXTHOP_SELF);
718e3744 3686}
6b0655a2 3687
88b8ed8d 3688DEFUN (no_neighbor_nexthop_self_force,
a538debe 3689 no_neighbor_nexthop_self_force_cmd,
9ccf14f7 3690 "no neighbor <A.B.C.D|X:X::X:X|WORD> next-hop-self force",
a538debe
DS
3691 NO_STR
3692 NEIGHBOR_STR
3693 NEIGHBOR_ADDR_STR2
3694 "Disable the next hop calculation for this neighbor\n"
3695 "Set the next hop to self for reflected routes\n")
88b8ed8d 3696{
c500ae40
DW
3697 int idx_peer = 2;
3698 return peer_af_flag_unset_vty (vty, argv[idx_peer]->arg, bgp_node_afi (vty),
88b8ed8d
DW
3699 bgp_node_safi (vty),
3700 PEER_FLAG_FORCE_NEXTHOP_SELF);
3701}
a538debe 3702
c7122e14
DS
3703/* neighbor as-override */
3704DEFUN (neighbor_as_override,
3705 neighbor_as_override_cmd,
9ccf14f7 3706 "neighbor <A.B.C.D|X:X::X:X|WORD> as-override",
c7122e14
DS
3707 NEIGHBOR_STR
3708 NEIGHBOR_ADDR_STR2
3709 "Override ASNs in outbound updates if aspath equals remote-as\n")
3710{
c500ae40
DW
3711 int idx_peer = 1;
3712 return peer_af_flag_set_vty (vty, argv[idx_peer]->arg, bgp_node_afi (vty),
c7122e14
DS
3713 bgp_node_safi (vty),
3714 PEER_FLAG_AS_OVERRIDE);
3715}
3716
3717DEFUN (no_neighbor_as_override,
3718 no_neighbor_as_override_cmd,
9ccf14f7 3719 "no neighbor <A.B.C.D|X:X::X:X|WORD> as-override",
c7122e14
DS
3720 NO_STR
3721 NEIGHBOR_STR
3722 NEIGHBOR_ADDR_STR2
3723 "Override ASNs in outbound updates if aspath equals remote-as\n")
3724{
c500ae40
DW
3725 int idx_peer = 2;
3726 return peer_af_flag_unset_vty (vty, argv[idx_peer]->arg, bgp_node_afi (vty),
c7122e14
DS
3727 bgp_node_safi (vty),
3728 PEER_FLAG_AS_OVERRIDE);
3729}
3730
718e3744 3731/* neighbor remove-private-AS. */
3732DEFUN (neighbor_remove_private_as,
3733 neighbor_remove_private_as_cmd,
9ccf14f7 3734 "neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS",
718e3744 3735 NEIGHBOR_STR
3736 NEIGHBOR_ADDR_STR2
5000f21c 3737 "Remove private ASNs in outbound updates\n")
718e3744 3738{
c500ae40
DW
3739 int idx_peer = 1;
3740 return peer_af_flag_set_vty (vty, argv[idx_peer]->arg, bgp_node_afi (vty),
718e3744 3741 bgp_node_safi (vty),
3742 PEER_FLAG_REMOVE_PRIVATE_AS);
3743}
3744
5000f21c
DS
3745DEFUN (neighbor_remove_private_as_all,
3746 neighbor_remove_private_as_all_cmd,
9ccf14f7 3747 "neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS all",
5000f21c
DS
3748 NEIGHBOR_STR
3749 NEIGHBOR_ADDR_STR2
3750 "Remove private ASNs in outbound updates\n"
3751 "Apply to all AS numbers")
3752{
c500ae40
DW
3753 int idx_peer = 1;
3754 return peer_af_flag_set_vty (vty, argv[idx_peer]->arg, bgp_node_afi (vty),
5000f21c 3755 bgp_node_safi (vty),
5000f21c
DS
3756 PEER_FLAG_REMOVE_PRIVATE_AS_ALL);
3757}
3758
3759DEFUN (neighbor_remove_private_as_replace_as,
3760 neighbor_remove_private_as_replace_as_cmd,
9ccf14f7 3761 "neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS replace-AS",
5000f21c
DS
3762 NEIGHBOR_STR
3763 NEIGHBOR_ADDR_STR2
3764 "Remove private ASNs in outbound updates\n"
3765 "Replace private ASNs with our ASN in outbound updates\n")
3766{
c500ae40
DW
3767 int idx_peer = 1;
3768 return peer_af_flag_set_vty (vty, argv[idx_peer]->arg, bgp_node_afi (vty),
5000f21c 3769 bgp_node_safi (vty),
5000f21c
DS
3770 PEER_FLAG_REMOVE_PRIVATE_AS_REPLACE);
3771}
3772
3773DEFUN (neighbor_remove_private_as_all_replace_as,
3774 neighbor_remove_private_as_all_replace_as_cmd,
9ccf14f7 3775 "neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS all replace-AS",
5000f21c
DS
3776 NEIGHBOR_STR
3777 NEIGHBOR_ADDR_STR2
3778 "Remove private ASNs in outbound updates\n"
16cedbb0 3779 "Apply to all AS numbers\n"
5000f21c
DS
3780 "Replace private ASNs with our ASN in outbound updates\n")
3781{
c500ae40
DW
3782 int idx_peer = 1;
3783 return peer_af_flag_set_vty (vty, argv[idx_peer]->arg, bgp_node_afi (vty),
5000f21c 3784 bgp_node_safi (vty),
88b8ed8d 3785 PEER_FLAG_REMOVE_PRIVATE_AS_ALL_REPLACE);
5000f21c
DS
3786}
3787
718e3744 3788DEFUN (no_neighbor_remove_private_as,
3789 no_neighbor_remove_private_as_cmd,
9ccf14f7 3790 "no neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS",
718e3744 3791 NO_STR
3792 NEIGHBOR_STR
3793 NEIGHBOR_ADDR_STR2
5000f21c 3794 "Remove private ASNs in outbound updates\n")
718e3744 3795{
c500ae40
DW
3796 int idx_peer = 2;
3797 return peer_af_flag_unset_vty (vty, argv[idx_peer]->arg, bgp_node_afi (vty),
718e3744 3798 bgp_node_safi (vty),
88b8ed8d 3799 PEER_FLAG_REMOVE_PRIVATE_AS);
718e3744 3800}
6b0655a2 3801
88b8ed8d 3802DEFUN (no_neighbor_remove_private_as_all,
5000f21c 3803 no_neighbor_remove_private_as_all_cmd,
9ccf14f7 3804 "no neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS all",
5000f21c
DS
3805 NO_STR
3806 NEIGHBOR_STR
3807 NEIGHBOR_ADDR_STR2
3808 "Remove private ASNs in outbound updates\n"
16cedbb0 3809 "Apply to all AS numbers\n")
88b8ed8d 3810{
c500ae40
DW
3811 int idx_peer = 2;
3812 return peer_af_flag_unset_vty (vty, argv[idx_peer]->arg, bgp_node_afi (vty),
88b8ed8d
DW
3813 bgp_node_safi (vty),
3814 PEER_FLAG_REMOVE_PRIVATE_AS_ALL);
3815}
5000f21c 3816
88b8ed8d 3817DEFUN (no_neighbor_remove_private_as_replace_as,
5000f21c 3818 no_neighbor_remove_private_as_replace_as_cmd,
9ccf14f7 3819 "no neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS replace-AS",
5000f21c
DS
3820 NO_STR
3821 NEIGHBOR_STR
3822 NEIGHBOR_ADDR_STR2
3823 "Remove private ASNs in outbound updates\n"
3824 "Replace private ASNs with our ASN in outbound updates\n")
88b8ed8d 3825{
c500ae40
DW
3826 int idx_peer = 2;
3827 return peer_af_flag_unset_vty (vty, argv[idx_peer]->arg, bgp_node_afi (vty),
88b8ed8d
DW
3828 bgp_node_safi (vty),
3829 PEER_FLAG_REMOVE_PRIVATE_AS_REPLACE);
3830}
5000f21c 3831
88b8ed8d 3832DEFUN (no_neighbor_remove_private_as_all_replace_as,
5000f21c 3833 no_neighbor_remove_private_as_all_replace_as_cmd,
9ccf14f7 3834 "no neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS all replace-AS",
5000f21c
DS
3835 NO_STR
3836 NEIGHBOR_STR
3837 NEIGHBOR_ADDR_STR2
3838 "Remove private ASNs in outbound updates\n"
16cedbb0 3839 "Apply to all AS numbers\n"
5000f21c 3840 "Replace private ASNs with our ASN in outbound updates\n")
88b8ed8d 3841{
c500ae40
DW
3842 int idx_peer = 2;
3843 return peer_af_flag_unset_vty (vty, argv[idx_peer]->arg, bgp_node_afi (vty),
88b8ed8d
DW
3844 bgp_node_safi (vty),
3845 PEER_FLAG_REMOVE_PRIVATE_AS_ALL_REPLACE);
3846}
5000f21c
DS
3847
3848
718e3744 3849/* neighbor send-community. */
3850DEFUN (neighbor_send_community,
3851 neighbor_send_community_cmd,
9ccf14f7 3852 "neighbor <A.B.C.D|X:X::X:X|WORD> send-community",
718e3744 3853 NEIGHBOR_STR
3854 NEIGHBOR_ADDR_STR2
3855 "Send Community attribute to this neighbor\n")
3856{
c500ae40
DW
3857 int idx_peer = 1;
3858 return peer_af_flag_set_vty (vty, argv[idx_peer]->arg, bgp_node_afi (vty),
718e3744 3859 bgp_node_safi (vty),
3860 PEER_FLAG_SEND_COMMUNITY);
3861}
3862
3863DEFUN (no_neighbor_send_community,
3864 no_neighbor_send_community_cmd,
9ccf14f7 3865 "no neighbor <A.B.C.D|X:X::X:X|WORD> send-community",
718e3744 3866 NO_STR
3867 NEIGHBOR_STR
3868 NEIGHBOR_ADDR_STR2
3869 "Send Community attribute to this neighbor\n")
3870{
c500ae40
DW
3871 int idx_peer = 2;
3872 return peer_af_flag_unset_vty (vty, argv[idx_peer]->arg, bgp_node_afi (vty),
718e3744 3873 bgp_node_safi (vty),
3874 PEER_FLAG_SEND_COMMUNITY);
3875}
6b0655a2 3876
718e3744 3877/* neighbor send-community extended. */
3878DEFUN (neighbor_send_community_type,
3879 neighbor_send_community_type_cmd,
57d187bc 3880 "neighbor <A.B.C.D|X:X::X:X|WORD> send-community <both|all|extended|standard|large>",
718e3744 3881 NEIGHBOR_STR
3882 NEIGHBOR_ADDR_STR2
3883 "Send Community attribute to this neighbor\n"
3884 "Send Standard and Extended Community attributes\n"
57d187bc 3885 "Send Standard, Large and Extended Community attributes\n"
718e3744 3886 "Send Extended Community attributes\n"
57d187bc
JS
3887 "Send Standard Community attributes\n"
3888 "Send Large Community attributes\n")
718e3744 3889{
4c4ff4c1
QY
3890 int idx = 0;
3891 u_int32_t flag = 0;
718e3744 3892
4c4ff4c1
QY
3893 char *peer = argv[1]->arg;
3894
3895 if (argv_find (argv, argc, "standard", &idx))
3896 SET_FLAG (flag, PEER_FLAG_SEND_COMMUNITY);
3897 else if (argv_find (argv, argc, "extended", &idx))
3898 SET_FLAG (flag, PEER_FLAG_SEND_EXT_COMMUNITY);
57d187bc
JS
3899 else if (argv_find (argv, argc, "large", &idx))
3900 SET_FLAG (flag, PEER_FLAG_SEND_LARGE_COMMUNITY);
3901 else if (argv_find (argv, argc, "both", &idx))
3902 {
3903 SET_FLAG (flag, PEER_FLAG_SEND_COMMUNITY);
3904 SET_FLAG (flag, PEER_FLAG_SEND_EXT_COMMUNITY);
3905 }
4c4ff4c1 3906 else
57d187bc
JS
3907 {
3908 SET_FLAG (flag, PEER_FLAG_SEND_COMMUNITY);
3909 SET_FLAG (flag, PEER_FLAG_SEND_EXT_COMMUNITY);
3910 SET_FLAG (flag, PEER_FLAG_SEND_LARGE_COMMUNITY);
3911 }
4c4ff4c1
QY
3912
3913 return peer_af_flag_set_vty (vty, peer, bgp_node_afi (vty), bgp_node_safi (vty), flag);
718e3744 3914}
3915
3916DEFUN (no_neighbor_send_community_type,
3917 no_neighbor_send_community_type_cmd,
57d187bc 3918 "no neighbor <A.B.C.D|X:X::X:X|WORD> send-community <both|all|extended|standard|large>",
718e3744 3919 NO_STR
3920 NEIGHBOR_STR
3921 NEIGHBOR_ADDR_STR2
3922 "Send Community attribute to this neighbor\n"
3923 "Send Standard and Extended Community attributes\n"
57d187bc 3924 "Send Standard, Large and Extended Community attributes\n"
718e3744 3925 "Send Extended Community attributes\n"
57d187bc
JS
3926 "Send Standard Community attributes\n"
3927 "Send Large Community attributes\n")
718e3744 3928{
c500ae40
DW
3929 int idx_peer = 2;
3930 int idx_type = 4;
3931 if (strncmp (argv[idx_type]->arg, "s", 1) == 0)
3932 return peer_af_flag_unset_vty (vty, argv[idx_peer]->arg, bgp_node_afi (vty),
718e3744 3933 bgp_node_safi (vty),
3934 PEER_FLAG_SEND_COMMUNITY);
c500ae40
DW
3935 if (strncmp (argv[idx_type]->arg, "e", 1) == 0)
3936 return peer_af_flag_unset_vty (vty, argv[idx_peer]->arg, bgp_node_afi (vty),
718e3744 3937 bgp_node_safi (vty),
3938 PEER_FLAG_SEND_EXT_COMMUNITY);
57d187bc
JS
3939 if (strncmp (argv[idx_type]->arg, "l", 1) == 0)
3940 return peer_af_flag_unset_vty (vty, argv[idx_peer]->arg, bgp_node_afi (vty),
3941 bgp_node_safi (vty),
3942 PEER_FLAG_SEND_LARGE_COMMUNITY);
3943 if (strncmp (argv[idx_type]->arg, "b", 1) == 0)
3944 return peer_af_flag_unset_vty (vty, argv[idx_peer]->arg, bgp_node_afi (vty),
3945 bgp_node_safi (vty),
3946 PEER_FLAG_SEND_COMMUNITY |
3947 PEER_FLAG_SEND_EXT_COMMUNITY);
718e3744 3948
c500ae40 3949 return peer_af_flag_unset_vty (vty, argv[idx_peer]->arg, bgp_node_afi (vty),
718e3744 3950 bgp_node_safi (vty),
3951 (PEER_FLAG_SEND_COMMUNITY |
57d187bc
JS
3952 PEER_FLAG_SEND_EXT_COMMUNITY|
3953 PEER_FLAG_SEND_LARGE_COMMUNITY));
718e3744 3954}
6b0655a2 3955
718e3744 3956/* neighbor soft-reconfig. */
3957DEFUN (neighbor_soft_reconfiguration,
3958 neighbor_soft_reconfiguration_cmd,
9ccf14f7 3959 "neighbor <A.B.C.D|X:X::X:X|WORD> soft-reconfiguration inbound",
718e3744 3960 NEIGHBOR_STR
3961 NEIGHBOR_ADDR_STR2
3962 "Per neighbor soft reconfiguration\n"
3963 "Allow inbound soft reconfiguration for this neighbor\n")
3964{
c500ae40
DW
3965 int idx_peer = 1;
3966 return peer_af_flag_set_vty (vty, argv[idx_peer]->arg,
718e3744 3967 bgp_node_afi (vty), bgp_node_safi (vty),
3968 PEER_FLAG_SOFT_RECONFIG);
3969}
3970
3971DEFUN (no_neighbor_soft_reconfiguration,
3972 no_neighbor_soft_reconfiguration_cmd,
9ccf14f7 3973 "no neighbor <A.B.C.D|X:X::X:X|WORD> soft-reconfiguration inbound",
718e3744 3974 NO_STR
3975 NEIGHBOR_STR
3976 NEIGHBOR_ADDR_STR2
3977 "Per neighbor soft reconfiguration\n"
3978 "Allow inbound soft reconfiguration for this neighbor\n")
3979{
c500ae40
DW
3980 int idx_peer = 2;
3981 return peer_af_flag_unset_vty (vty, argv[idx_peer]->arg,
718e3744 3982 bgp_node_afi (vty), bgp_node_safi (vty),
3983 PEER_FLAG_SOFT_RECONFIG);
3984}
6b0655a2 3985
718e3744 3986DEFUN (neighbor_route_reflector_client,
3987 neighbor_route_reflector_client_cmd,
9ccf14f7 3988 "neighbor <A.B.C.D|X:X::X:X|WORD> route-reflector-client",
718e3744 3989 NEIGHBOR_STR
3990 NEIGHBOR_ADDR_STR2
3991 "Configure a neighbor as Route Reflector client\n")
3992{
c500ae40 3993 int idx_peer = 1;
718e3744 3994 struct peer *peer;
3995
3996
c500ae40 3997 peer = peer_and_group_lookup_vty (vty, argv[idx_peer]->arg);
718e3744 3998 if (! peer)
3999 return CMD_WARNING;
4000
c500ae40 4001 return peer_af_flag_set_vty (vty, argv[idx_peer]->arg, bgp_node_afi (vty),
718e3744 4002 bgp_node_safi (vty),
4003 PEER_FLAG_REFLECTOR_CLIENT);
4004}
4005
4006DEFUN (no_neighbor_route_reflector_client,
4007 no_neighbor_route_reflector_client_cmd,
9ccf14f7 4008 "no neighbor <A.B.C.D|X:X::X:X|WORD> route-reflector-client",
718e3744 4009 NO_STR
4010 NEIGHBOR_STR
4011 NEIGHBOR_ADDR_STR2
4012 "Configure a neighbor as Route Reflector client\n")
4013{
c500ae40
DW
4014 int idx_peer = 2;
4015 return peer_af_flag_unset_vty (vty, argv[idx_peer]->arg, bgp_node_afi (vty),
718e3744 4016 bgp_node_safi (vty),
4017 PEER_FLAG_REFLECTOR_CLIENT);
4018}
6b0655a2 4019
718e3744 4020/* neighbor route-server-client. */
4021DEFUN (neighbor_route_server_client,
4022 neighbor_route_server_client_cmd,
9ccf14f7 4023 "neighbor <A.B.C.D|X:X::X:X|WORD> route-server-client",
718e3744 4024 NEIGHBOR_STR
4025 NEIGHBOR_ADDR_STR2
4026 "Configure a neighbor as Route Server client\n")
4027{
c500ae40 4028 int idx_peer = 1;
2a3d5731
DW
4029 struct peer *peer;
4030
c500ae40 4031 peer = peer_and_group_lookup_vty (vty, argv[idx_peer]->arg);
2a3d5731
DW
4032 if (! peer)
4033 return CMD_WARNING;
c500ae40 4034 return peer_af_flag_set_vty (vty, argv[idx_peer]->arg, bgp_node_afi (vty),
2a3d5731
DW
4035 bgp_node_safi (vty),
4036 PEER_FLAG_RSERVER_CLIENT);
718e3744 4037}
4038
4039DEFUN (no_neighbor_route_server_client,
4040 no_neighbor_route_server_client_cmd,
9ccf14f7 4041 "no neighbor <A.B.C.D|X:X::X:X|WORD> route-server-client",
718e3744 4042 NO_STR
4043 NEIGHBOR_STR
4044 NEIGHBOR_ADDR_STR2
4045 "Configure a neighbor as Route Server client\n")
fee0f4c6 4046{
c500ae40
DW
4047 int idx_peer = 2;
4048 return peer_af_flag_unset_vty (vty, argv[idx_peer]->arg, bgp_node_afi (vty),
2a3d5731
DW
4049 bgp_node_safi (vty),
4050 PEER_FLAG_RSERVER_CLIENT);
fee0f4c6 4051}
6b0655a2 4052
fee0f4c6 4053DEFUN (neighbor_nexthop_local_unchanged,
4054 neighbor_nexthop_local_unchanged_cmd,
9ccf14f7 4055 "neighbor <A.B.C.D|X:X::X:X|WORD> nexthop-local unchanged",
fee0f4c6 4056 NEIGHBOR_STR
4057 NEIGHBOR_ADDR_STR2
4058 "Configure treatment of outgoing link-local nexthop attribute\n"
4059 "Leave link-local nexthop unchanged for this peer\n")
4060{
c500ae40
DW
4061 int idx_peer = 1;
4062 return peer_af_flag_set_vty (vty, argv[idx_peer]->arg, bgp_node_afi (vty),
fee0f4c6 4063 bgp_node_safi (vty),
4064 PEER_FLAG_NEXTHOP_LOCAL_UNCHANGED );
4065}
6b0655a2 4066
fee0f4c6 4067DEFUN (no_neighbor_nexthop_local_unchanged,
4068 no_neighbor_nexthop_local_unchanged_cmd,
9ccf14f7 4069 "no neighbor <A.B.C.D|X:X::X:X|WORD> nexthop-local unchanged",
fee0f4c6 4070 NO_STR
4071 NEIGHBOR_STR
4072 NEIGHBOR_ADDR_STR2
4073 "Configure treatment of outgoing link-local-nexthop attribute\n"
4074 "Leave link-local nexthop unchanged for this peer\n")
718e3744 4075{
c500ae40
DW
4076 int idx_peer = 2;
4077 return peer_af_flag_unset_vty (vty, argv[idx_peer]->arg, bgp_node_afi (vty),
718e3744 4078 bgp_node_safi (vty),
fee0f4c6 4079 PEER_FLAG_NEXTHOP_LOCAL_UNCHANGED );
718e3744 4080}
6b0655a2 4081
718e3744 4082DEFUN (neighbor_attr_unchanged,
4083 neighbor_attr_unchanged_cmd,
1084263f
QY
4084 "neighbor <A.B.C.D|X:X::X:X|WORD> attribute-unchanged\
4085 [<\
ddbaf941
QY
4086 as-path [<next-hop [med]|med [next-hop]>]|\
4087 next-hop [<as-path [med]|med [as-path]>]|\
4088 med [<as-path [next-hop]|next-hop [as-path]>]\
1084263f 4089 >]",
718e3744 4090 NEIGHBOR_STR
4091 NEIGHBOR_ADDR_STR2
4092 "BGP attribute is propagated unchanged to this neighbor\n"
4093 "As-path attribute\n"
4094 "Nexthop attribute\n"
40e718b5 4095 "Med attribute\n"
1084263f
QY
4096 "Med attribute\n"
4097 "Nexthop attribute\n"
4098 "Nexthop attribute\n"
4099 "As-path attribute\n"
4100 "Med attribute\n"
40e718b5 4101 "Med attribute\n"
718e3744 4102 "As-path attribute\n"
1084263f
QY
4103 "Med attribute\n"
4104 "As-path attribute\n"
4105 "Nexthop attribute\n"
40e718b5 4106 "Nexthop attribute\n"
1084263f 4107 "As-path attribute\n")
718e3744 4108{
40e718b5
QY
4109 int idx = 0;
4110 char *peer = argv[1]->arg;
4111 u_int16_t flags = 0;
718e3744 4112
40e718b5 4113 if (argv_find (argv, argc, "as-path", &idx))
718e3744 4114 SET_FLAG (flags, PEER_FLAG_AS_PATH_UNCHANGED);
40e718b5
QY
4115 idx = 0;
4116 if (argv_find (argv, argc, "next-hop", &idx))
4117 SET_FLAG (flags, PEER_FLAG_NEXTHOP_UNCHANGED);
4118 idx = 0;
4119 if (argv_find (argv, argc, "med", &idx))
718e3744 4120 SET_FLAG (flags, PEER_FLAG_MED_UNCHANGED);
4121
40e718b5
QY
4122 if (!flags) // no flags means all of them!
4123 {
718e3744 4124 SET_FLAG (flags, PEER_FLAG_AS_PATH_UNCHANGED);
718e3744 4125 SET_FLAG (flags, PEER_FLAG_NEXTHOP_UNCHANGED);
40e718b5
QY
4126 SET_FLAG (flags, PEER_FLAG_MED_UNCHANGED);
4127 }
718e3744 4128
40e718b5 4129 return peer_af_flag_set_vty (vty, peer, bgp_node_afi (vty), bgp_node_safi (vty), flags);
718e3744 4130}
4131
718e3744 4132DEFUN (no_neighbor_attr_unchanged,
4133 no_neighbor_attr_unchanged_cmd,
1084263f
QY
4134 "no neighbor <A.B.C.D|X:X::X:X|WORD> attribute-unchanged\
4135 [<\
ddbaf941
QY
4136 as-path [<next-hop [med]|med [next-hop]>]|\
4137 next-hop [<as-path [med]|med [as-path]>]|\
4138 med [<as-path [next-hop]|next-hop [as-path]>]\
1084263f 4139 >]",
e52702f2 4140 NO_STR
718e3744 4141 NEIGHBOR_STR
4142 NEIGHBOR_ADDR_STR2
31500417
DW
4143 "BGP attribute is propagated unchanged to this neighbor\n"
4144 "As-path attribute\n"
40e718b5 4145 "Nexthop attribute\n"
31500417 4146 "Med attribute\n"
1084263f
QY
4147 "Med attribute\n"
4148 "Nexthop attribute\n"
4149 "Nexthop attribute\n"
4150 "As-path attribute\n"
4151 "Med attribute\n"
40e718b5 4152 "Med attribute\n"
718e3744 4153 "As-path attribute\n"
1084263f
QY
4154 "Med attribute\n"
4155 "As-path attribute\n"
4156 "Nexthop attribute\n"
718e3744 4157 "Nexthop attribute\n"
1084263f 4158 "As-path attribute\n")
718e3744 4159{
40e718b5
QY
4160 int idx = 0;
4161 char *peer = argv[2]->arg;
4162 u_int16_t flags = 0;
718e3744 4163
40e718b5 4164 if (argv_find (argv, argc, "as-path", &idx))
718e3744 4165 SET_FLAG (flags, PEER_FLAG_AS_PATH_UNCHANGED);
40e718b5
QY
4166 idx = 0;
4167 if (argv_find (argv, argc, "next-hop", &idx))
4168 SET_FLAG (flags, PEER_FLAG_NEXTHOP_UNCHANGED);
4169 idx = 0;
4170 if (argv_find (argv, argc, "med", &idx))
718e3744 4171 SET_FLAG (flags, PEER_FLAG_MED_UNCHANGED);
4172
40e718b5
QY
4173 if (!flags) // no flags means all of them!
4174 {
718e3744 4175 SET_FLAG (flags, PEER_FLAG_AS_PATH_UNCHANGED);
718e3744 4176 SET_FLAG (flags, PEER_FLAG_NEXTHOP_UNCHANGED);
40e718b5
QY
4177 SET_FLAG (flags, PEER_FLAG_MED_UNCHANGED);
4178 }
718e3744 4179
40e718b5 4180 return peer_af_flag_unset_vty (vty, peer, bgp_node_afi (vty), bgp_node_safi (vty), flags);
718e3744 4181}
4182
718e3744 4183
718e3744 4184/* EBGP multihop configuration. */
94f2b392 4185static int
e52702f2 4186peer_ebgp_multihop_set_vty (struct vty *vty, const char *ip_str,
fd79ac91 4187 const char *ttl_str)
718e3744 4188{
4189 struct peer *peer;
fd79ac91 4190 unsigned int ttl;
718e3744 4191
4192 peer = peer_and_group_lookup_vty (vty, ip_str);
4193 if (! peer)
4194 return CMD_WARNING;
4195
63fa10b5
QY
4196 if (peer->conf_if)
4197 return bgp_vty_return (vty, BGP_ERR_INVALID_FOR_DIRECT_PEER);
4198
718e3744 4199 if (! ttl_str)
9b1be336 4200 ttl = MAXTTL;
718e3744 4201 else
9b1be336 4202 VTY_GET_INTEGER_RANGE ("TTL", ttl, ttl_str, 1, MAXTTL);
718e3744 4203
89b6d1f8 4204 return bgp_vty_return (vty, peer_ebgp_multihop_set (peer, ttl));
718e3744 4205}
4206
94f2b392 4207static int
e52702f2 4208peer_ebgp_multihop_unset_vty (struct vty *vty, const char *ip_str)
718e3744 4209{
4210 struct peer *peer;
4211
4212 peer = peer_and_group_lookup_vty (vty, ip_str);
4213 if (! peer)
4214 return CMD_WARNING;
4215
89b6d1f8 4216 return bgp_vty_return (vty, peer_ebgp_multihop_unset (peer));
718e3744 4217}
4218
4219/* neighbor ebgp-multihop. */
4220DEFUN (neighbor_ebgp_multihop,
4221 neighbor_ebgp_multihop_cmd,
9ccf14f7 4222 "neighbor <A.B.C.D|X:X::X:X|WORD> ebgp-multihop",
718e3744 4223 NEIGHBOR_STR
4224 NEIGHBOR_ADDR_STR2
4225 "Allow EBGP neighbors not on directly connected networks\n")
4226{
c500ae40
DW
4227 int idx_peer = 1;
4228 return peer_ebgp_multihop_set_vty (vty, argv[idx_peer]->arg, NULL);
718e3744 4229}
4230
4231DEFUN (neighbor_ebgp_multihop_ttl,
4232 neighbor_ebgp_multihop_ttl_cmd,
9ccf14f7 4233 "neighbor <A.B.C.D|X:X::X:X|WORD> ebgp-multihop (1-255)",
718e3744 4234 NEIGHBOR_STR
4235 NEIGHBOR_ADDR_STR2
4236 "Allow EBGP neighbors not on directly connected networks\n"
4237 "maximum hop count\n")
4238{
c500ae40
DW
4239 int idx_peer = 1;
4240 int idx_number = 3;
4241 return peer_ebgp_multihop_set_vty (vty, argv[idx_peer]->arg, argv[idx_number]->arg);
718e3744 4242}
4243
4244DEFUN (no_neighbor_ebgp_multihop,
4245 no_neighbor_ebgp_multihop_cmd,
a636c635 4246 "no neighbor <A.B.C.D|X:X::X:X|WORD> ebgp-multihop [(1-255)]",
718e3744 4247 NO_STR
4248 NEIGHBOR_STR
4249 NEIGHBOR_ADDR_STR2
a636c635
DW
4250 "Allow EBGP neighbors not on directly connected networks\n"
4251 "maximum hop count\n")
718e3744 4252{
c500ae40
DW
4253 int idx_peer = 2;
4254 return peer_ebgp_multihop_unset_vty (vty, argv[idx_peer]->arg);
718e3744 4255}
4256
6b0655a2 4257
6ffd2079 4258/* disable-connected-check */
4259DEFUN (neighbor_disable_connected_check,
4260 neighbor_disable_connected_check_cmd,
a636c635 4261 "neighbor <A.B.C.D|X:X::X:X|WORD> <disable-connected-check|enforce-multihop>",
6ffd2079 4262 NEIGHBOR_STR
4263 NEIGHBOR_ADDR_STR2
a636c635
DW
4264 "one-hop away EBGP peer using loopback address\n"
4265 "Enforce EBGP neighbors perform multihop\n")
6ffd2079 4266{
c500ae40
DW
4267 int idx_peer = 1;
4268 return peer_flag_set_vty (vty, argv[idx_peer]->arg, PEER_FLAG_DISABLE_CONNECTED_CHECK);
6ffd2079 4269}
4270
4271DEFUN (no_neighbor_disable_connected_check,
4272 no_neighbor_disable_connected_check_cmd,
a636c635 4273 "no neighbor <A.B.C.D|X:X::X:X|WORD> <disable-connected-check|enforce-multihop>",
6ffd2079 4274 NO_STR
4275 NEIGHBOR_STR
4276 NEIGHBOR_ADDR_STR2
a636c635
DW
4277 "one-hop away EBGP peer using loopback address\n"
4278 "Enforce EBGP neighbors perform multihop\n")
6ffd2079 4279{
c500ae40
DW
4280 int idx_peer = 2;
4281 return peer_flag_unset_vty (vty, argv[idx_peer]->arg, PEER_FLAG_DISABLE_CONNECTED_CHECK);
6ffd2079 4282}
4283
718e3744 4284DEFUN (neighbor_description,
4285 neighbor_description_cmd,
e961923c 4286 "neighbor <A.B.C.D|X:X::X:X|WORD> description LINE...",
718e3744 4287 NEIGHBOR_STR
4288 NEIGHBOR_ADDR_STR2
4289 "Neighbor specific description\n"
4290 "Up to 80 characters describing this neighbor\n")
4291{
c500ae40 4292 int idx_peer = 1;
58749582 4293 int idx_line = 3;
718e3744 4294 struct peer *peer;
718e3744 4295 char *str;
718e3744 4296
c500ae40 4297 peer = peer_and_group_lookup_vty (vty, argv[idx_peer]->arg);
718e3744 4298 if (! peer)
4299 return CMD_WARNING;
4300
58749582 4301 str = argv_concat(argv, argc, idx_line);
718e3744 4302
4303 peer_description_set (peer, str);
4304
3b8b1855 4305 XFREE (MTYPE_TMP, str);
718e3744 4306
4307 return CMD_SUCCESS;
4308}
4309
4310DEFUN (no_neighbor_description,
4311 no_neighbor_description_cmd,
a636c635 4312 "no neighbor <A.B.C.D|X:X::X:X|WORD> description [LINE]",
718e3744 4313 NO_STR
4314 NEIGHBOR_STR
4315 NEIGHBOR_ADDR_STR2
a636c635
DW
4316 "Neighbor specific description\n"
4317 "Up to 80 characters describing this neighbor\n")
718e3744 4318{
c500ae40 4319 int idx_peer = 2;
718e3744 4320 struct peer *peer;
4321
c500ae40 4322 peer = peer_and_group_lookup_vty (vty, argv[idx_peer]->arg);
718e3744 4323 if (! peer)
4324 return CMD_WARNING;
4325
4326 peer_description_unset (peer);
4327
4328 return CMD_SUCCESS;
4329}
4330
6b0655a2 4331
718e3744 4332/* Neighbor update-source. */
94f2b392 4333static int
e52702f2 4334peer_update_source_vty (struct vty *vty, const char *peer_str,
fd79ac91 4335 const char *source_str)
718e3744 4336{
4337 struct peer *peer;
3b69fd51 4338 struct prefix p;
718e3744 4339
4340 peer = peer_and_group_lookup_vty (vty, peer_str);
4341 if (! peer)
4342 return CMD_WARNING;
4343
a80beece
DS
4344 if (peer->conf_if)
4345 return CMD_WARNING;
4346
718e3744 4347 if (source_str)
4348 {
c63b83fe
JBD
4349 union sockunion su;
4350 int ret = str2sockunion (source_str, &su);
4351
4352 if (ret == 0)
4353 peer_update_source_addr_set (peer, &su);
718e3744 4354 else
3b69fd51
DS
4355 {
4356 if (str2prefix (source_str, &p))
4357 {
4358 vty_out (vty, "%% Invalid update-source, remove prefix length %s",
4359 VTY_NEWLINE);
4360 return CMD_WARNING;
4361 }
4362 else
4363 peer_update_source_if_set (peer, source_str);
4364 }
718e3744 4365 }
4366 else
4367 peer_update_source_unset (peer);
4368
4369 return CMD_SUCCESS;
4370}
4371
369688c0
PJ
4372#define BGP_UPDATE_SOURCE_HELP_STR \
4373 "IPv4 address\n" \
9a1a331d
PJ
4374 "IPv6 address\n" \
4375 "Interface name (requires zebra to be running)\n"
369688c0 4376
718e3744 4377DEFUN (neighbor_update_source,
4378 neighbor_update_source_cmd,
9ccf14f7 4379 "neighbor <A.B.C.D|X:X::X:X|WORD> update-source <A.B.C.D|X:X::X:X|WORD>",
718e3744 4380 NEIGHBOR_STR
4381 NEIGHBOR_ADDR_STR2
4382 "Source of routing updates\n"
369688c0 4383 BGP_UPDATE_SOURCE_HELP_STR)
718e3744 4384{
c500ae40
DW
4385 int idx_peer = 1;
4386 int idx_peer_2 = 3;
4387 return peer_update_source_vty (vty, argv[idx_peer]->arg, argv[idx_peer_2]->arg);
718e3744 4388}
4389
4390DEFUN (no_neighbor_update_source,
4391 no_neighbor_update_source_cmd,
c7178fe7 4392 "no neighbor <A.B.C.D|X:X::X:X|WORD> update-source [<A.B.C.D|X:X::X:X|WORD>]",
718e3744 4393 NO_STR
4394 NEIGHBOR_STR
4395 NEIGHBOR_ADDR_STR2
dcb52bd5
DS
4396 "Source of routing updates\n"
4397 BGP_UPDATE_SOURCE_HELP_STR)
718e3744 4398{
c500ae40
DW
4399 int idx_peer = 2;
4400 return peer_update_source_vty (vty, argv[idx_peer]->arg, NULL);
718e3744 4401}
6b0655a2 4402
94f2b392 4403static int
e52702f2
QY
4404peer_default_originate_set_vty (struct vty *vty, const char *peer_str,
4405 afi_t afi, safi_t safi,
fd79ac91 4406 const char *rmap, int set)
718e3744 4407{
4408 int ret;
4409 struct peer *peer;
4410
4411 peer = peer_and_group_lookup_vty (vty, peer_str);
4412 if (! peer)
4413 return CMD_WARNING;
4414
4415 if (set)
4416 ret = peer_default_originate_set (peer, afi, safi, rmap);
4417 else
4418 ret = peer_default_originate_unset (peer, afi, safi);
4419
4420 return bgp_vty_return (vty, ret);
4421}
4422
4423/* neighbor default-originate. */
4424DEFUN (neighbor_default_originate,
4425 neighbor_default_originate_cmd,
9ccf14f7 4426 "neighbor <A.B.C.D|X:X::X:X|WORD> default-originate",
718e3744 4427 NEIGHBOR_STR
4428 NEIGHBOR_ADDR_STR2
4429 "Originate default route to this neighbor\n")
4430{
c500ae40
DW
4431 int idx_peer = 1;
4432 return peer_default_originate_set_vty (vty, argv[idx_peer]->arg, bgp_node_afi (vty),
718e3744 4433 bgp_node_safi (vty), NULL, 1);
4434}
4435
4436DEFUN (neighbor_default_originate_rmap,
4437 neighbor_default_originate_rmap_cmd,
9ccf14f7 4438 "neighbor <A.B.C.D|X:X::X:X|WORD> default-originate route-map WORD",
718e3744 4439 NEIGHBOR_STR
4440 NEIGHBOR_ADDR_STR2
4441 "Originate default route to this neighbor\n"
4442 "Route-map to specify criteria to originate default\n"
4443 "route-map name\n")
4444{
c500ae40
DW
4445 int idx_peer = 1;
4446 int idx_word = 4;
4447 return peer_default_originate_set_vty (vty, argv[idx_peer]->arg, bgp_node_afi (vty),
4448 bgp_node_safi (vty), argv[idx_word]->arg, 1);
718e3744 4449}
4450
4451DEFUN (no_neighbor_default_originate,
4452 no_neighbor_default_originate_cmd,
a636c635 4453 "no neighbor <A.B.C.D|X:X::X:X|WORD> default-originate [route-map WORD]",
718e3744 4454 NO_STR
4455 NEIGHBOR_STR
4456 NEIGHBOR_ADDR_STR2
a636c635
DW
4457 "Originate default route to this neighbor\n"
4458 "Route-map to specify criteria to originate default\n"
4459 "route-map name\n")
718e3744 4460{
c500ae40
DW
4461 int idx_peer = 2;
4462 return peer_default_originate_set_vty (vty, argv[idx_peer]->arg, bgp_node_afi (vty),
718e3744 4463 bgp_node_safi (vty), NULL, 0);
4464}
4465
6b0655a2 4466
718e3744 4467/* Set neighbor's BGP port. */
94f2b392 4468static int
e52702f2 4469peer_port_vty (struct vty *vty, const char *ip_str, int afi,
fd79ac91 4470 const char *port_str)
718e3744 4471{
4472 struct peer *peer;
4473 u_int16_t port;
4474 struct servent *sp;
4475
4476 peer = peer_lookup_vty (vty, ip_str);
4477 if (! peer)
4478 return CMD_WARNING;
4479
4480 if (! port_str)
e52702f2 4481 {
718e3744 4482 sp = getservbyname ("bgp", "tcp");
4483 port = (sp == NULL) ? BGP_PORT_DEFAULT : ntohs (sp->s_port);
4484 }
4485 else
4486 {
4487 VTY_GET_INTEGER("port", port, port_str);
4488 }
4489
4490 peer_port_set (peer, port);
4491
4492 return CMD_SUCCESS;
4493}
4494
f418446b 4495/* Set specified peer's BGP port. */
718e3744 4496DEFUN (neighbor_port,
4497 neighbor_port_cmd,
9ccf14f7 4498 "neighbor <A.B.C.D|X:X::X:X> port (0-65535)",
718e3744 4499 NEIGHBOR_STR
4500 NEIGHBOR_ADDR_STR
4501 "Neighbor's BGP port\n"
4502 "TCP port number\n")
4503{
c500ae40
DW
4504 int idx_ip = 1;
4505 int idx_number = 3;
4506 return peer_port_vty (vty, argv[idx_ip]->arg, AFI_IP, argv[idx_number]->arg);
718e3744 4507}
4508
4509DEFUN (no_neighbor_port,
4510 no_neighbor_port_cmd,
9ccf14f7 4511 "no neighbor <A.B.C.D|X:X::X:X> port [(0-65535)]",
718e3744 4512 NO_STR
4513 NEIGHBOR_STR
4514 NEIGHBOR_ADDR_STR
8334fd5a
DW
4515 "Neighbor's BGP port\n"
4516 "TCP port number\n")
718e3744 4517{
c500ae40
DW
4518 int idx_ip = 2;
4519 return peer_port_vty (vty, argv[idx_ip]->arg, AFI_IP, NULL);
718e3744 4520}
4521
6b0655a2 4522
718e3744 4523/* neighbor weight. */
94f2b392 4524static int
e52702f2 4525peer_weight_set_vty (struct vty *vty, const char *ip_str,
d93f7ffc 4526 afi_t afi, safi_t safi,
fd79ac91 4527 const char *weight_str)
718e3744 4528{
1f9a9fff 4529 int ret;
718e3744 4530 struct peer *peer;
4531 unsigned long weight;
4532
4533 peer = peer_and_group_lookup_vty (vty, ip_str);
4534 if (! peer)
4535 return CMD_WARNING;
4536
4537 VTY_GET_INTEGER_RANGE("weight", weight, weight_str, 0, 65535);
4538
d93f7ffc 4539 ret = peer_weight_set (peer, afi, safi, weight);
1f9a9fff 4540 return bgp_vty_return (vty, ret);
718e3744 4541}
4542
94f2b392 4543static int
d93f7ffc
DW
4544peer_weight_unset_vty (struct vty *vty, const char *ip_str,
4545 afi_t afi, safi_t safi)
718e3744 4546{
1f9a9fff 4547 int ret;
718e3744 4548 struct peer *peer;
4549
4550 peer = peer_and_group_lookup_vty (vty, ip_str);
4551 if (! peer)
4552 return CMD_WARNING;
4553
d93f7ffc 4554 ret = peer_weight_unset (peer, afi, safi);
1f9a9fff 4555 return bgp_vty_return (vty, ret);
718e3744 4556}
4557
4558DEFUN (neighbor_weight,
4559 neighbor_weight_cmd,
9ccf14f7 4560 "neighbor <A.B.C.D|X:X::X:X|WORD> weight (0-65535)",
718e3744 4561 NEIGHBOR_STR
4562 NEIGHBOR_ADDR_STR2
4563 "Set default weight for routes from this neighbor\n"
4564 "default weight\n")
4565{
c500ae40
DW
4566 int idx_peer = 1;
4567 int idx_number = 3;
e52702f2
QY
4568 return peer_weight_set_vty (vty,
4569 argv[idx_peer]->arg,
4570 bgp_node_afi (vty),
4571 bgp_node_safi (vty),
4572 argv[idx_number]->arg);
718e3744 4573}
4574
4575DEFUN (no_neighbor_weight,
4576 no_neighbor_weight_cmd,
9ccf14f7 4577 "no neighbor <A.B.C.D|X:X::X:X|WORD> weight [(0-65535)]",
718e3744 4578 NO_STR
4579 NEIGHBOR_STR
4580 NEIGHBOR_ADDR_STR2
8334fd5a
DW
4581 "Set default weight for routes from this neighbor\n"
4582 "default weight\n")
718e3744 4583{
c500ae40 4584 int idx_peer = 2;
e52702f2 4585 return peer_weight_unset_vty (vty, argv[idx_peer]->arg, bgp_node_afi (vty), bgp_node_safi (vty));
718e3744 4586}
4587
6b0655a2 4588
718e3744 4589/* Override capability negotiation. */
4590DEFUN (neighbor_override_capability,
4591 neighbor_override_capability_cmd,
9ccf14f7 4592 "neighbor <A.B.C.D|X:X::X:X|WORD> override-capability",
718e3744 4593 NEIGHBOR_STR
4594 NEIGHBOR_ADDR_STR2
4595 "Override capability negotiation result\n")
4596{
c500ae40
DW
4597 int idx_peer = 1;
4598 return peer_flag_set_vty (vty, argv[idx_peer]->arg, PEER_FLAG_OVERRIDE_CAPABILITY);
718e3744 4599}
4600
4601DEFUN (no_neighbor_override_capability,
4602 no_neighbor_override_capability_cmd,
9ccf14f7 4603 "no neighbor <A.B.C.D|X:X::X:X|WORD> override-capability",
718e3744 4604 NO_STR
4605 NEIGHBOR_STR
4606 NEIGHBOR_ADDR_STR2
4607 "Override capability negotiation result\n")
4608{
c500ae40
DW
4609 int idx_peer = 2;
4610 return peer_flag_unset_vty (vty, argv[idx_peer]->arg, PEER_FLAG_OVERRIDE_CAPABILITY);
718e3744 4611}
6b0655a2 4612
718e3744 4613DEFUN (neighbor_strict_capability,
4614 neighbor_strict_capability_cmd,
9ccf14f7 4615 "neighbor <A.B.C.D|X:X::X:X> strict-capability-match",
718e3744 4616 NEIGHBOR_STR
4617 NEIGHBOR_ADDR_STR
4618 "Strict capability negotiation match\n")
4619{
c500ae40
DW
4620 int idx_ip = 1;
4621 return peer_flag_set_vty (vty, argv[idx_ip]->arg, PEER_FLAG_STRICT_CAP_MATCH);
718e3744 4622}
4623
4624DEFUN (no_neighbor_strict_capability,
4625 no_neighbor_strict_capability_cmd,
9ccf14f7 4626 "no neighbor <A.B.C.D|X:X::X:X> strict-capability-match",
718e3744 4627 NO_STR
4628 NEIGHBOR_STR
4629 NEIGHBOR_ADDR_STR
4630 "Strict capability negotiation match\n")
4631{
c500ae40
DW
4632 int idx_ip = 2;
4633 return peer_flag_unset_vty (vty, argv[idx_ip]->arg, PEER_FLAG_STRICT_CAP_MATCH);
718e3744 4634}
6b0655a2 4635
94f2b392 4636static int
e52702f2 4637peer_timers_set_vty (struct vty *vty, const char *ip_str,
fd79ac91 4638 const char *keep_str, const char *hold_str)
718e3744 4639{
4640 int ret;
4641 struct peer *peer;
4642 u_int32_t keepalive;
4643 u_int32_t holdtime;
4644
4645 peer = peer_and_group_lookup_vty (vty, ip_str);
4646 if (! peer)
4647 return CMD_WARNING;
4648
4649 VTY_GET_INTEGER_RANGE ("Keepalive", keepalive, keep_str, 0, 65535);
4650 VTY_GET_INTEGER_RANGE ("Holdtime", holdtime, hold_str, 0, 65535);
4651
4652 ret = peer_timers_set (peer, keepalive, holdtime);
4653
4654 return bgp_vty_return (vty, ret);
4655}
6b0655a2 4656
94f2b392 4657static int
fd79ac91 4658peer_timers_unset_vty (struct vty *vty, const char *ip_str)
718e3744 4659{
4660 int ret;
4661 struct peer *peer;
4662
0c412461 4663 peer = peer_and_group_lookup_vty (vty, ip_str);
718e3744 4664 if (! peer)
4665 return CMD_WARNING;
4666
4667 ret = peer_timers_unset (peer);
4668
4669 return bgp_vty_return (vty, ret);
4670}
4671
4672DEFUN (neighbor_timers,
4673 neighbor_timers_cmd,
9ccf14f7 4674 "neighbor <A.B.C.D|X:X::X:X|WORD> timers (0-65535) (0-65535)",
718e3744 4675 NEIGHBOR_STR
4676 NEIGHBOR_ADDR_STR2
4677 "BGP per neighbor timers\n"
4678 "Keepalive interval\n"
4679 "Holdtime\n")
4680{
c500ae40
DW
4681 int idx_peer = 1;
4682 int idx_number = 3;
4683 int idx_number_2 = 4;
4684 return peer_timers_set_vty (vty, argv[idx_peer]->arg, argv[idx_number]->arg, argv[idx_number_2]->arg);
718e3744 4685}
4686
4687DEFUN (no_neighbor_timers,
4688 no_neighbor_timers_cmd,
9ccf14f7 4689 "no neighbor <A.B.C.D|X:X::X:X|WORD> timers [(0-65535) (0-65535)]",
718e3744 4690 NO_STR
4691 NEIGHBOR_STR
4692 NEIGHBOR_ADDR_STR2
8334fd5a
DW
4693 "BGP per neighbor timers\n"
4694 "Keepalive interval\n"
4695 "Holdtime\n")
718e3744 4696{
c500ae40
DW
4697 int idx_peer = 2;
4698 return peer_timers_unset_vty (vty, argv[idx_peer]->arg);
718e3744 4699}
6b0655a2 4700
813d4307 4701
94f2b392 4702static int
e52702f2 4703peer_timers_connect_set_vty (struct vty *vty, const char *ip_str,
fd79ac91 4704 const char *time_str)
718e3744 4705{
4706 int ret;
4707 struct peer *peer;
4708 u_int32_t connect;
4709
966f821c 4710 peer = peer_and_group_lookup_vty (vty, ip_str);
718e3744 4711 if (! peer)
4712 return CMD_WARNING;
4713
4714 VTY_GET_INTEGER_RANGE ("Connect time", connect, time_str, 0, 65535);
4715
4716 ret = peer_timers_connect_set (peer, connect);
4717
966f821c 4718 return bgp_vty_return (vty, ret);
718e3744 4719}
4720
94f2b392 4721static int
fd79ac91 4722peer_timers_connect_unset_vty (struct vty *vty, const char *ip_str)
718e3744 4723{
4724 int ret;
4725 struct peer *peer;
4726
4727 peer = peer_and_group_lookup_vty (vty, ip_str);
4728 if (! peer)
4729 return CMD_WARNING;
4730
4731 ret = peer_timers_connect_unset (peer);
4732
966f821c 4733 return bgp_vty_return (vty, ret);
718e3744 4734}
4735
4736DEFUN (neighbor_timers_connect,
4737 neighbor_timers_connect_cmd,
9ccf14f7 4738 "neighbor <A.B.C.D|X:X::X:X|WORD> timers connect (1-65535)",
718e3744 4739 NEIGHBOR_STR
966f821c 4740 NEIGHBOR_ADDR_STR2
718e3744 4741 "BGP per neighbor timers\n"
4742 "BGP connect timer\n"
4743 "Connect timer\n")
4744{
c500ae40
DW
4745 int idx_peer = 1;
4746 int idx_number = 4;
4747 return peer_timers_connect_set_vty (vty, argv[idx_peer]->arg, argv[idx_number]->arg);
718e3744 4748}
4749
4750DEFUN (no_neighbor_timers_connect,
4751 no_neighbor_timers_connect_cmd,
9ccf14f7 4752 "no neighbor <A.B.C.D|X:X::X:X|WORD> timers connect [(1-65535)]",
718e3744 4753 NO_STR
4754 NEIGHBOR_STR
966f821c 4755 NEIGHBOR_ADDR_STR2
718e3744 4756 "BGP per neighbor timers\n"
8334fd5a
DW
4757 "BGP connect timer\n"
4758 "Connect timer\n")
718e3744 4759{
c500ae40
DW
4760 int idx_peer = 2;
4761 return peer_timers_connect_unset_vty (vty, argv[idx_peer]->arg);
718e3744 4762}
4763
6b0655a2 4764
94f2b392 4765static int
e52702f2
QY
4766peer_advertise_interval_vty (struct vty *vty, const char *ip_str,
4767 const char *time_str, int set)
718e3744 4768{
4769 int ret;
4770 struct peer *peer;
4771 u_int32_t routeadv = 0;
4772
966f821c 4773 peer = peer_and_group_lookup_vty (vty, ip_str);
718e3744 4774 if (! peer)
4775 return CMD_WARNING;
4776
4777 if (time_str)
4778 VTY_GET_INTEGER_RANGE ("advertise interval", routeadv, time_str, 0, 600);
4779
4780 if (set)
4781 ret = peer_advertise_interval_set (peer, routeadv);
4782 else
4783 ret = peer_advertise_interval_unset (peer);
4784
966f821c 4785 return bgp_vty_return (vty, ret);
718e3744 4786}
4787
4788DEFUN (neighbor_advertise_interval,
4789 neighbor_advertise_interval_cmd,
9ccf14f7 4790 "neighbor <A.B.C.D|X:X::X:X|WORD> advertisement-interval (0-600)",
718e3744 4791 NEIGHBOR_STR
966f821c 4792 NEIGHBOR_ADDR_STR2
718e3744 4793 "Minimum interval between sending BGP routing updates\n"
4794 "time in seconds\n")
4795{
c500ae40
DW
4796 int idx_peer = 1;
4797 int idx_number = 3;
4798 return peer_advertise_interval_vty (vty, argv[idx_peer]->arg, argv[idx_number]->arg, 1);
718e3744 4799}
4800
4801DEFUN (no_neighbor_advertise_interval,
4802 no_neighbor_advertise_interval_cmd,
9ccf14f7 4803 "no neighbor <A.B.C.D|X:X::X:X|WORD> advertisement-interval [(0-600)]",
718e3744 4804 NO_STR
4805 NEIGHBOR_STR
966f821c 4806 NEIGHBOR_ADDR_STR2
8334fd5a
DW
4807 "Minimum interval between sending BGP routing updates\n"
4808 "time in seconds\n")
718e3744 4809{
c500ae40
DW
4810 int idx_peer = 2;
4811 return peer_advertise_interval_vty (vty, argv[idx_peer]->arg, NULL, 0);
718e3744 4812}
4813
6b0655a2 4814
518f0eb1
DS
4815/* Time to wait before processing route-map updates */
4816DEFUN (bgp_set_route_map_delay_timer,
4817 bgp_set_route_map_delay_timer_cmd,
6147e2c6 4818 "bgp route-map delay-timer (0-600)",
518f0eb1
DS
4819 SET_STR
4820 "BGP route-map delay timer\n"
4821 "Time in secs to wait before processing route-map changes\n"
f414725f 4822 "0 disables the timer, no route updates happen when route-maps change\n")
518f0eb1 4823{
c500ae40 4824 int idx_number = 3;
518f0eb1 4825 u_int32_t rmap_delay_timer;
518f0eb1 4826
c500ae40 4827 if (argv[idx_number]->arg)
518f0eb1 4828 {
c500ae40 4829 VTY_GET_INTEGER_RANGE ("delay-timer", rmap_delay_timer, argv[idx_number]->arg, 0, 600);
5fe9f963 4830 bm->rmap_update_timer = rmap_delay_timer;
518f0eb1
DS
4831
4832 /* if the dynamic update handling is being disabled, and a timer is
4833 * running, stop the timer and act as if the timer has already fired.
4834 */
5fe9f963 4835 if (!rmap_delay_timer && bm->t_rmap_update )
518f0eb1 4836 {
5fe9f963 4837 BGP_TIMER_OFF(bm->t_rmap_update);
4838 thread_execute (bm->master, bgp_route_map_update_timer, NULL, 0);
518f0eb1
DS
4839 }
4840 return CMD_SUCCESS;
4841 }
4842 else
ffd0c037 4843 return CMD_WARNING;
518f0eb1
DS
4844}
4845
4846DEFUN (no_bgp_set_route_map_delay_timer,
4847 no_bgp_set_route_map_delay_timer_cmd,
8334fd5a 4848 "no bgp route-map delay-timer [(0-600)]",
518f0eb1 4849 NO_STR
3a2d747c 4850 BGP_STR
518f0eb1 4851 "Default BGP route-map delay timer\n"
8334fd5a
DW
4852 "Reset to default time to wait for processing route-map changes\n"
4853 "0 disables the timer, no route updates happen when route-maps change\n")
518f0eb1 4854{
518f0eb1 4855
5fe9f963 4856 bm->rmap_update_timer = RMAP_DEFAULT_UPDATE_TIMER;
518f0eb1
DS
4857
4858 return CMD_SUCCESS;
4859}
4860
f414725f 4861
718e3744 4862/* neighbor interface */
94f2b392 4863static int
fd79ac91 4864peer_interface_vty (struct vty *vty, const char *ip_str, const char *str)
718e3744 4865{
718e3744 4866 struct peer *peer;
4867
4868 peer = peer_lookup_vty (vty, ip_str);
a80beece 4869 if (! peer || peer->conf_if)
718e3744 4870 return CMD_WARNING;
4871
4872 if (str)
ffd0c037 4873 peer_interface_set (peer, str);
718e3744 4874 else
ffd0c037 4875 peer_interface_unset (peer);
718e3744 4876
4877 return CMD_SUCCESS;
4878}
4879
4880DEFUN (neighbor_interface,
4881 neighbor_interface_cmd,
9ccf14f7 4882 "neighbor <A.B.C.D|X:X::X:X> interface WORD",
718e3744 4883 NEIGHBOR_STR
4884 NEIGHBOR_ADDR_STR
4885 "Interface\n"
4886 "Interface name\n")
4887{
c500ae40
DW
4888 int idx_ip = 1;
4889 int idx_word = 3;
00d7d2d3 4890 return peer_interface_vty (vty, argv[idx_ip]->arg, argv[idx_word]->arg);
718e3744 4891}
4892
4893DEFUN (no_neighbor_interface,
4894 no_neighbor_interface_cmd,
9ccf14f7 4895 "no neighbor <A.B.C.D|X:X::X:X|WORD> interface WORD",
718e3744 4896 NO_STR
4897 NEIGHBOR_STR
16cedbb0 4898 NEIGHBOR_ADDR_STR2
718e3744 4899 "Interface\n"
4900 "Interface name\n")
4901{
c500ae40
DW
4902 int idx_peer = 2;
4903 return peer_interface_vty (vty, argv[idx_peer]->arg, NULL);
718e3744 4904}
6b0655a2 4905
718e3744 4906/* Set distribute list to the peer. */
94f2b392 4907static int
e52702f2 4908peer_distribute_set_vty (struct vty *vty, const char *ip_str,
fd79ac91 4909 afi_t afi, safi_t safi,
4910 const char *name_str, const char *direct_str)
718e3744 4911{
4912 int ret;
4913 struct peer *peer;
4914 int direct = FILTER_IN;
4915
4916 peer = peer_and_group_lookup_vty (vty, ip_str);
4917 if (! peer)
4918 return CMD_WARNING;
4919
4920 /* Check filter direction. */
4921 if (strncmp (direct_str, "i", 1) == 0)
4922 direct = FILTER_IN;
4923 else if (strncmp (direct_str, "o", 1) == 0)
4924 direct = FILTER_OUT;
4925
4926 ret = peer_distribute_set (peer, afi, safi, direct, name_str);
4927
4928 return bgp_vty_return (vty, ret);
4929}
4930
94f2b392 4931static int
fd79ac91 4932peer_distribute_unset_vty (struct vty *vty, const char *ip_str, afi_t afi,
4933 safi_t safi, const char *direct_str)
718e3744 4934{
4935 int ret;
4936 struct peer *peer;
4937 int direct = FILTER_IN;
4938
4939 peer = peer_and_group_lookup_vty (vty, ip_str);
4940 if (! peer)
4941 return CMD_WARNING;
4942
4943 /* Check filter direction. */
4944 if (strncmp (direct_str, "i", 1) == 0)
4945 direct = FILTER_IN;
4946 else if (strncmp (direct_str, "o", 1) == 0)
4947 direct = FILTER_OUT;
4948
4949 ret = peer_distribute_unset (peer, afi, safi, direct);
4950
4951 return bgp_vty_return (vty, ret);
4952}
4953
4954DEFUN (neighbor_distribute_list,
4955 neighbor_distribute_list_cmd,
9ccf14f7 4956 "neighbor <A.B.C.D|X:X::X:X|WORD> distribute-list <(1-199)|(1300-2699)|WORD> <in|out>",
718e3744 4957 NEIGHBOR_STR
4958 NEIGHBOR_ADDR_STR2
4959 "Filter updates to/from this neighbor\n"
4960 "IP access-list number\n"
4961 "IP access-list number (expanded range)\n"
4962 "IP Access-list name\n"
4963 "Filter incoming updates\n"
4964 "Filter outgoing updates\n")
4965{
c500ae40
DW
4966 int idx_peer = 1;
4967 int idx_acl = 3;
4968 int idx_in_out = 4;
4969 return peer_distribute_set_vty (vty, argv[idx_peer]->arg, bgp_node_afi (vty),
4970 bgp_node_safi (vty), argv[idx_acl]->arg, argv[idx_in_out]->arg);
718e3744 4971}
4972
4973DEFUN (no_neighbor_distribute_list,
4974 no_neighbor_distribute_list_cmd,
9ccf14f7 4975 "no neighbor <A.B.C.D|X:X::X:X|WORD> distribute-list <(1-199)|(1300-2699)|WORD> <in|out>",
718e3744 4976 NO_STR
4977 NEIGHBOR_STR
4978 NEIGHBOR_ADDR_STR2
4979 "Filter updates to/from this neighbor\n"
4980 "IP access-list number\n"
4981 "IP access-list number (expanded range)\n"
4982 "IP Access-list name\n"
4983 "Filter incoming updates\n"
4984 "Filter outgoing updates\n")
4985{
c500ae40
DW
4986 int idx_peer = 2;
4987 int idx_in_out = 5;
4988 return peer_distribute_unset_vty (vty, argv[idx_peer]->arg, bgp_node_afi (vty),
4989 bgp_node_safi (vty), argv[idx_in_out]->arg);
718e3744 4990}
6b0655a2 4991
718e3744 4992/* Set prefix list to the peer. */
94f2b392 4993static int
fd79ac91 4994peer_prefix_list_set_vty (struct vty *vty, const char *ip_str, afi_t afi,
e52702f2 4995 safi_t safi, const char *name_str,
fd79ac91 4996 const char *direct_str)
718e3744 4997{
4998 int ret;
4999 struct peer *peer;
5000 int direct = FILTER_IN;
5001
5002 peer = peer_and_group_lookup_vty (vty, ip_str);
5003 if (! peer)
5004 return CMD_WARNING;
5005
5006 /* Check filter direction. */
5007 if (strncmp (direct_str, "i", 1) == 0)
5008 direct = FILTER_IN;
5009 else if (strncmp (direct_str, "o", 1) == 0)
5010 direct = FILTER_OUT;
5011
5012 ret = peer_prefix_list_set (peer, afi, safi, direct, name_str);
5013
5014 return bgp_vty_return (vty, ret);
5015}
5016
94f2b392 5017static int
fd79ac91 5018peer_prefix_list_unset_vty (struct vty *vty, const char *ip_str, afi_t afi,
5019 safi_t safi, const char *direct_str)
718e3744 5020{
5021 int ret;
5022 struct peer *peer;
5023 int direct = FILTER_IN;
5024
5025 peer = peer_and_group_lookup_vty (vty, ip_str);
5026 if (! peer)
5027 return CMD_WARNING;
e52702f2 5028
718e3744 5029 /* Check filter direction. */
5030 if (strncmp (direct_str, "i", 1) == 0)
5031 direct = FILTER_IN;
5032 else if (strncmp (direct_str, "o", 1) == 0)
5033 direct = FILTER_OUT;
5034
5035 ret = peer_prefix_list_unset (peer, afi, safi, direct);
5036
5037 return bgp_vty_return (vty, ret);
5038}
5039
5040DEFUN (neighbor_prefix_list,
5041 neighbor_prefix_list_cmd,
9ccf14f7 5042 "neighbor <A.B.C.D|X:X::X:X|WORD> prefix-list WORD <in|out>",
718e3744 5043 NEIGHBOR_STR
5044 NEIGHBOR_ADDR_STR2
5045 "Filter updates to/from this neighbor\n"
5046 "Name of a prefix list\n"
5047 "Filter incoming updates\n"
5048 "Filter outgoing updates\n")
5049{
c500ae40
DW
5050 int idx_peer = 1;
5051 int idx_word = 3;
5052 int idx_in_out = 4;
5053 return peer_prefix_list_set_vty (vty, argv[idx_peer]->arg, bgp_node_afi (vty),
5054 bgp_node_safi (vty), argv[idx_word]->arg, argv[idx_in_out]->arg);
718e3744 5055}
5056
5057DEFUN (no_neighbor_prefix_list,
5058 no_neighbor_prefix_list_cmd,
9ccf14f7 5059 "no neighbor <A.B.C.D|X:X::X:X|WORD> prefix-list WORD <in|out>",
718e3744 5060 NO_STR
5061 NEIGHBOR_STR
5062 NEIGHBOR_ADDR_STR2
5063 "Filter updates to/from this neighbor\n"
5064 "Name of a prefix list\n"
5065 "Filter incoming updates\n"
5066 "Filter outgoing updates\n")
5067{
c500ae40
DW
5068 int idx_peer = 2;
5069 int idx_in_out = 5;
5070 return peer_prefix_list_unset_vty (vty, argv[idx_peer]->arg, bgp_node_afi (vty),
5071 bgp_node_safi (vty), argv[idx_in_out]->arg);
718e3744 5072}
6b0655a2 5073
94f2b392 5074static int
e52702f2 5075peer_aslist_set_vty (struct vty *vty, const char *ip_str,
fd79ac91 5076 afi_t afi, safi_t safi,
5077 const char *name_str, const char *direct_str)
718e3744 5078{
5079 int ret;
5080 struct peer *peer;
5081 int direct = FILTER_IN;
5082
5083 peer = peer_and_group_lookup_vty (vty, ip_str);
5084 if (! peer)
5085 return CMD_WARNING;
5086
5087 /* Check filter direction. */
5088 if (strncmp (direct_str, "i", 1) == 0)
5089 direct = FILTER_IN;
5090 else if (strncmp (direct_str, "o", 1) == 0)
5091 direct = FILTER_OUT;
5092
5093 ret = peer_aslist_set (peer, afi, safi, direct, name_str);
5094
5095 return bgp_vty_return (vty, ret);
5096}
5097
94f2b392 5098static int
e52702f2 5099peer_aslist_unset_vty (struct vty *vty, const char *ip_str,
fd79ac91 5100 afi_t afi, safi_t safi,
5101 const char *direct_str)
718e3744 5102{
5103 int ret;
5104 struct peer *peer;
5105 int direct = FILTER_IN;
5106
5107 peer = peer_and_group_lookup_vty (vty, ip_str);
5108 if (! peer)
5109 return CMD_WARNING;
5110
5111 /* Check filter direction. */
5112 if (strncmp (direct_str, "i", 1) == 0)
5113 direct = FILTER_IN;
5114 else if (strncmp (direct_str, "o", 1) == 0)
5115 direct = FILTER_OUT;
5116
5117 ret = peer_aslist_unset (peer, afi, safi, direct);
5118
5119 return bgp_vty_return (vty, ret);
5120}
5121
5122DEFUN (neighbor_filter_list,
5123 neighbor_filter_list_cmd,
9ccf14f7 5124 "neighbor <A.B.C.D|X:X::X:X|WORD> filter-list WORD <in|out>",
718e3744 5125 NEIGHBOR_STR
5126 NEIGHBOR_ADDR_STR2
5127 "Establish BGP filters\n"
5128 "AS path access-list name\n"
5129 "Filter incoming routes\n"
5130 "Filter outgoing routes\n")
5131{
c500ae40
DW
5132 int idx_peer = 1;
5133 int idx_word = 3;
5134 int idx_in_out = 4;
5135 return peer_aslist_set_vty (vty, argv[idx_peer]->arg, bgp_node_afi (vty),
5136 bgp_node_safi (vty), argv[idx_word]->arg, argv[idx_in_out]->arg);
718e3744 5137}
5138
5139DEFUN (no_neighbor_filter_list,
5140 no_neighbor_filter_list_cmd,
9ccf14f7 5141 "no neighbor <A.B.C.D|X:X::X:X|WORD> filter-list WORD <in|out>",
718e3744 5142 NO_STR
5143 NEIGHBOR_STR
5144 NEIGHBOR_ADDR_STR2
5145 "Establish BGP filters\n"
5146 "AS path access-list name\n"
5147 "Filter incoming routes\n"
5148 "Filter outgoing routes\n")
5149{
c500ae40
DW
5150 int idx_peer = 2;
5151 int idx_in_out = 5;
5152 return peer_aslist_unset_vty (vty, argv[idx_peer]->arg, bgp_node_afi (vty),
5153 bgp_node_safi (vty), argv[idx_in_out]->arg);
718e3744 5154}
6b0655a2 5155
718e3744 5156/* Set route-map to the peer. */
94f2b392 5157static int
e52702f2 5158peer_route_map_set_vty (struct vty *vty, const char *ip_str,
fd79ac91 5159 afi_t afi, safi_t safi,
5160 const char *name_str, const char *direct_str)
718e3744 5161{
5162 int ret;
5163 struct peer *peer;
fee0f4c6 5164 int direct = RMAP_IN;
718e3744 5165
5166 peer = peer_and_group_lookup_vty (vty, ip_str);
5167 if (! peer)
5168 return CMD_WARNING;
5169
5170 /* Check filter direction. */
fee0f4c6 5171 if (strncmp (direct_str, "in", 2) == 0)
5172 direct = RMAP_IN;
718e3744 5173 else if (strncmp (direct_str, "o", 1) == 0)
fee0f4c6 5174 direct = RMAP_OUT;
718e3744 5175
5176 ret = peer_route_map_set (peer, afi, safi, direct, name_str);
5177
5178 return bgp_vty_return (vty, ret);
5179}
5180
94f2b392 5181static int
fd79ac91 5182peer_route_map_unset_vty (struct vty *vty, const char *ip_str, afi_t afi,
5183 safi_t safi, const char *direct_str)
718e3744 5184{
5185 int ret;
5186 struct peer *peer;
fee0f4c6 5187 int direct = RMAP_IN;
718e3744 5188
5189 peer = peer_and_group_lookup_vty (vty, ip_str);
5190 if (! peer)
5191 return CMD_WARNING;
5192
5193 /* Check filter direction. */
fee0f4c6 5194 if (strncmp (direct_str, "in", 2) == 0)
5195 direct = RMAP_IN;
718e3744 5196 else if (strncmp (direct_str, "o", 1) == 0)
fee0f4c6 5197 direct = RMAP_OUT;
718e3744 5198
5199 ret = peer_route_map_unset (peer, afi, safi, direct);
5200
5201 return bgp_vty_return (vty, ret);
5202}
5203
5204DEFUN (neighbor_route_map,
5205 neighbor_route_map_cmd,
9ccf14f7 5206 "neighbor <A.B.C.D|X:X::X:X|WORD> route-map WORD <in|out>",
718e3744 5207 NEIGHBOR_STR
5208 NEIGHBOR_ADDR_STR2
5209 "Apply route map to neighbor\n"
5210 "Name of route map\n"
5211 "Apply map to incoming routes\n"
2a3d5731 5212 "Apply map to outbound routes\n")
718e3744 5213{
c500ae40
DW
5214 int idx_peer = 1;
5215 int idx_word = 3;
5216 int idx_in_out = 4;
5217 return peer_route_map_set_vty (vty, argv[idx_peer]->arg, bgp_node_afi (vty),
5218 bgp_node_safi (vty), argv[idx_word]->arg, argv[idx_in_out]->arg);
718e3744 5219}
5220
5221DEFUN (no_neighbor_route_map,
5222 no_neighbor_route_map_cmd,
9ccf14f7 5223 "no neighbor <A.B.C.D|X:X::X:X|WORD> route-map WORD <in|out>",
718e3744 5224 NO_STR
5225 NEIGHBOR_STR
5226 NEIGHBOR_ADDR_STR2
5227 "Apply route map to neighbor\n"
5228 "Name of route map\n"
5229 "Apply map to incoming routes\n"
2a3d5731 5230 "Apply map to outbound routes\n")
718e3744 5231{
c500ae40
DW
5232 int idx_peer = 2;
5233 int idx_in_out = 5;
5234 return peer_route_map_unset_vty (vty, argv[idx_peer]->arg, bgp_node_afi (vty),
5235 bgp_node_safi (vty), argv[idx_in_out]->arg);
718e3744 5236}
6b0655a2 5237
718e3744 5238/* Set unsuppress-map to the peer. */
94f2b392 5239static int
fd79ac91 5240peer_unsuppress_map_set_vty (struct vty *vty, const char *ip_str, afi_t afi,
5241 safi_t safi, const char *name_str)
718e3744 5242{
5243 int ret;
5244 struct peer *peer;
5245
5246 peer = peer_and_group_lookup_vty (vty, ip_str);
5247 if (! peer)
5248 return CMD_WARNING;
5249
5250 ret = peer_unsuppress_map_set (peer, afi, safi, name_str);
5251
5252 return bgp_vty_return (vty, ret);
5253}
5254
5255/* Unset route-map from the peer. */
94f2b392 5256static int
fd79ac91 5257peer_unsuppress_map_unset_vty (struct vty *vty, const char *ip_str, afi_t afi,
718e3744 5258 safi_t safi)
5259{
5260 int ret;
5261 struct peer *peer;
5262
5263 peer = peer_and_group_lookup_vty (vty, ip_str);
5264 if (! peer)
5265 return CMD_WARNING;
5266
5267 ret = peer_unsuppress_map_unset (peer, afi, safi);
5268
5269 return bgp_vty_return (vty, ret);
5270}
5271
5272DEFUN (neighbor_unsuppress_map,
5273 neighbor_unsuppress_map_cmd,
9ccf14f7 5274 "neighbor <A.B.C.D|X:X::X:X|WORD> unsuppress-map WORD",
718e3744 5275 NEIGHBOR_STR
5276 NEIGHBOR_ADDR_STR2
5277 "Route-map to selectively unsuppress suppressed routes\n"
5278 "Name of route map\n")
5279{
c500ae40
DW
5280 int idx_peer = 1;
5281 int idx_word = 3;
5282 return peer_unsuppress_map_set_vty (vty, argv[idx_peer]->arg, bgp_node_afi (vty),
5283 bgp_node_safi (vty), argv[idx_word]->arg);
718e3744 5284}
5285
5286DEFUN (no_neighbor_unsuppress_map,
5287 no_neighbor_unsuppress_map_cmd,
9ccf14f7 5288 "no neighbor <A.B.C.D|X:X::X:X|WORD> unsuppress-map WORD",
718e3744 5289 NO_STR
5290 NEIGHBOR_STR
5291 NEIGHBOR_ADDR_STR2
5292 "Route-map to selectively unsuppress suppressed routes\n"
5293 "Name of route map\n")
5294{
c500ae40
DW
5295 int idx_peer = 2;
5296 return peer_unsuppress_map_unset_vty (vty, argv[idx_peer]->arg, bgp_node_afi (vty),
718e3744 5297 bgp_node_safi (vty));
5298}
6b0655a2 5299
94f2b392 5300static int
fd79ac91 5301peer_maximum_prefix_set_vty (struct vty *vty, const char *ip_str, afi_t afi,
e52702f2 5302 safi_t safi, const char *num_str,
0a486e5f 5303 const char *threshold_str, int warning,
5304 const char *restart_str)
718e3744 5305{
5306 int ret;
5307 struct peer *peer;
5308 u_int32_t max;
e0701b79 5309 u_char threshold;
0a486e5f 5310 u_int16_t restart;
718e3744 5311
5312 peer = peer_and_group_lookup_vty (vty, ip_str);
5313 if (! peer)
5314 return CMD_WARNING;
5315
e6ec1c36 5316 VTY_GET_INTEGER ("maximum number", max, num_str);
e0701b79 5317 if (threshold_str)
5318 threshold = atoi (threshold_str);
5319 else
5320 threshold = MAXIMUM_PREFIX_THRESHOLD_DEFAULT;
718e3744 5321
0a486e5f 5322 if (restart_str)
5323 restart = atoi (restart_str);
5324 else
5325 restart = 0;
5326
5327 ret = peer_maximum_prefix_set (peer, afi, safi, max, threshold, warning, restart);
718e3744 5328
5329 return bgp_vty_return (vty, ret);
5330}
5331
94f2b392 5332static int
fd79ac91 5333peer_maximum_prefix_unset_vty (struct vty *vty, const char *ip_str, afi_t afi,
718e3744 5334 safi_t safi)
5335{
5336 int ret;
5337 struct peer *peer;
5338
5339 peer = peer_and_group_lookup_vty (vty, ip_str);
5340 if (! peer)
5341 return CMD_WARNING;
5342
5343 ret = peer_maximum_prefix_unset (peer, afi, safi);
5344
5345 return bgp_vty_return (vty, ret);
5346}
5347
5348/* Maximum number of prefix configuration. prefix count is different
5349 for each peer configuration. So this configuration can be set for
5350 each peer configuration. */
5351DEFUN (neighbor_maximum_prefix,
5352 neighbor_maximum_prefix_cmd,
9ccf14f7 5353 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix (1-4294967295)",
718e3744 5354 NEIGHBOR_STR
5355 NEIGHBOR_ADDR_STR2
5356 "Maximum number of prefix accept from this peer\n"
5357 "maximum no. of prefix limit\n")
5358{
c500ae40
DW
5359 int idx_peer = 1;
5360 int idx_number = 3;
5361 return peer_maximum_prefix_set_vty (vty, argv[idx_peer]->arg, bgp_node_afi (vty),
5362 bgp_node_safi (vty), argv[idx_number]->arg, NULL, 0,
0a486e5f 5363 NULL);
718e3744 5364}
5365
e0701b79 5366DEFUN (neighbor_maximum_prefix_threshold,
5367 neighbor_maximum_prefix_threshold_cmd,
9ccf14f7 5368 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix (1-4294967295) (1-100)",
e0701b79 5369 NEIGHBOR_STR
5370 NEIGHBOR_ADDR_STR2
5371 "Maximum number of prefix accept from this peer\n"
5372 "maximum no. of prefix limit\n"
5373 "Threshold value (%) at which to generate a warning msg\n")
5374{
c500ae40
DW
5375 int idx_peer = 1;
5376 int idx_number = 3;
5377 int idx_number_2 = 4;
5378 return peer_maximum_prefix_set_vty (vty, argv[idx_peer]->arg, bgp_node_afi (vty),
5379 bgp_node_safi (vty), argv[idx_number]->arg, argv[idx_number_2]->arg, 0,
0a486e5f 5380 NULL);
5381}
e0701b79 5382
718e3744 5383DEFUN (neighbor_maximum_prefix_warning,
5384 neighbor_maximum_prefix_warning_cmd,
9ccf14f7 5385 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix (1-4294967295) warning-only",
718e3744 5386 NEIGHBOR_STR
5387 NEIGHBOR_ADDR_STR2
5388 "Maximum number of prefix accept from this peer\n"
5389 "maximum no. of prefix limit\n"
5390 "Only give warning message when limit is exceeded\n")
5391{
c500ae40
DW
5392 int idx_peer = 1;
5393 int idx_number = 3;
5394 return peer_maximum_prefix_set_vty (vty, argv[idx_peer]->arg, bgp_node_afi (vty),
5395 bgp_node_safi (vty), argv[idx_number]->arg, NULL, 1,
0a486e5f 5396 NULL);
718e3744 5397}
5398
e0701b79 5399DEFUN (neighbor_maximum_prefix_threshold_warning,
5400 neighbor_maximum_prefix_threshold_warning_cmd,
9ccf14f7 5401 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix (1-4294967295) (1-100) warning-only",
e0701b79 5402 NEIGHBOR_STR
5403 NEIGHBOR_ADDR_STR2
5404 "Maximum number of prefix accept from this peer\n"
5405 "maximum no. of prefix limit\n"
5406 "Threshold value (%) at which to generate a warning msg\n"
5407 "Only give warning message when limit is exceeded\n")
5408{
c500ae40
DW
5409 int idx_peer = 1;
5410 int idx_number = 3;
5411 int idx_number_2 = 4;
5412 return peer_maximum_prefix_set_vty (vty, argv[idx_peer]->arg, bgp_node_afi (vty),
5413 bgp_node_safi (vty), argv[idx_number]->arg, argv[idx_number_2]->arg, 1, NULL);
0a486e5f 5414}
5415
5416DEFUN (neighbor_maximum_prefix_restart,
5417 neighbor_maximum_prefix_restart_cmd,
9ccf14f7 5418 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix (1-4294967295) restart (1-65535)",
0a486e5f 5419 NEIGHBOR_STR
5420 NEIGHBOR_ADDR_STR2
5421 "Maximum number of prefix accept from this peer\n"
5422 "maximum no. of prefix limit\n"
5423 "Restart bgp connection after limit is exceeded\n"
5424 "Restart interval in minutes")
5425{
c500ae40
DW
5426 int idx_peer = 1;
5427 int idx_number = 3;
5428 int idx_number_2 = 5;
5429 return peer_maximum_prefix_set_vty (vty, argv[idx_peer]->arg, bgp_node_afi (vty),
5430 bgp_node_safi (vty), argv[idx_number]->arg, NULL, 0, argv[idx_number_2]->arg);
0a486e5f 5431}
5432
5433DEFUN (neighbor_maximum_prefix_threshold_restart,
5434 neighbor_maximum_prefix_threshold_restart_cmd,
9ccf14f7 5435 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix (1-4294967295) (1-100) restart (1-65535)",
0a486e5f 5436 NEIGHBOR_STR
5437 NEIGHBOR_ADDR_STR2
16cedbb0 5438 "Maximum number of prefixes to accept from this peer\n"
0a486e5f 5439 "maximum no. of prefix limit\n"
5440 "Threshold value (%) at which to generate a warning msg\n"
5441 "Restart bgp connection after limit is exceeded\n"
16cedbb0 5442 "Restart interval in minutes\n")
0a486e5f 5443{
c500ae40
DW
5444 int idx_peer = 1;
5445 int idx_number = 3;
5446 int idx_number_2 = 4;
5447 int idx_number_3 = 6;
5448 return peer_maximum_prefix_set_vty (vty, argv[idx_peer]->arg, bgp_node_afi (vty),
5449 bgp_node_safi (vty), argv[idx_number]->arg, argv[idx_number_2]->arg, 0, argv[idx_number_3]->arg);
0a486e5f 5450}
e0701b79 5451
718e3744 5452DEFUN (no_neighbor_maximum_prefix,
5453 no_neighbor_maximum_prefix_cmd,
d04c479d 5454 "no neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix [(1-4294967295) [(1-100)] [restart (1-65535)] [warning-only]]",
718e3744 5455 NO_STR
5456 NEIGHBOR_STR
5457 NEIGHBOR_ADDR_STR2
16cedbb0 5458 "Maximum number of prefixes to accept from this peer\n"
31500417
DW
5459 "maximum no. of prefix limit\n"
5460 "Threshold value (%) at which to generate a warning msg\n"
5461 "Restart bgp connection after limit is exceeded\n"
16cedbb0 5462 "Restart interval in minutes\n"
31500417 5463 "Only give warning message when limit is exceeded\n")
718e3744 5464{
c500ae40
DW
5465 int idx_peer = 2;
5466 return peer_maximum_prefix_unset_vty (vty, argv[idx_peer]->arg, bgp_node_afi (vty),
718e3744 5467 bgp_node_safi (vty));
5468}
e52702f2 5469
718e3744 5470
718e3744 5471/* "neighbor allowas-in" */
5472DEFUN (neighbor_allowas_in,
5473 neighbor_allowas_in_cmd,
fd8503f5 5474 "neighbor <A.B.C.D|X:X::X:X|WORD> allowas-in [<(1-10)|origin>]",
718e3744 5475 NEIGHBOR_STR
5476 NEIGHBOR_ADDR_STR2
31500417 5477 "Accept as-path with my AS present in it\n"
fd8503f5
QY
5478 "Number of occurances of AS number\n"
5479 "Only accept my AS in the as-path if the route was originated in my AS\n")
718e3744 5480{
c500ae40 5481 int idx_peer = 1;
fd8503f5 5482 int idx_number_origin = 3;
718e3744 5483 int ret;
aac9ef6c 5484 int origin = 0;
718e3744 5485 struct peer *peer;
aac9ef6c 5486 int allow_num = 0;
718e3744 5487
c500ae40 5488 peer = peer_and_group_lookup_vty (vty, argv[idx_peer]->arg);
718e3744 5489 if (! peer)
5490 return CMD_WARNING;
5491
fd8503f5 5492 if (argc <= idx_number_origin)
718e3744 5493 allow_num = 3;
5494 else
aac9ef6c 5495 {
fd8503f5 5496 if (argv[idx_number_origin]->type == WORD_TKN)
aac9ef6c
DW
5497 origin = 1;
5498 else
fd8503f5 5499 allow_num = atoi (argv[idx_number_origin]->arg);
aac9ef6c 5500 }
718e3744 5501
5502 ret = peer_allowas_in_set (peer, bgp_node_afi (vty), bgp_node_safi (vty),
aac9ef6c 5503 allow_num, origin);
718e3744 5504
5505 return bgp_vty_return (vty, ret);
5506}
5507
718e3744 5508DEFUN (no_neighbor_allowas_in,
5509 no_neighbor_allowas_in_cmd,
fd8503f5 5510 "no neighbor <A.B.C.D|X:X::X:X|WORD> allowas-in [<(1-10)|origin>]",
718e3744 5511 NO_STR
5512 NEIGHBOR_STR
5513 NEIGHBOR_ADDR_STR2
8334fd5a 5514 "allow local ASN appears in aspath attribute\n"
fd8503f5
QY
5515 "Number of occurances of AS number\n"
5516 "Only accept my AS in the as-path if the route was originated in my AS\n")
718e3744 5517{
c500ae40 5518 int idx_peer = 2;
718e3744 5519 int ret;
5520 struct peer *peer;
5521
c500ae40 5522 peer = peer_and_group_lookup_vty (vty, argv[idx_peer]->arg);
718e3744 5523 if (! peer)
5524 return CMD_WARNING;
5525
5526 ret = peer_allowas_in_unset (peer, bgp_node_afi (vty), bgp_node_safi (vty));
5527
5528 return bgp_vty_return (vty, ret);
5529}
6b0655a2 5530
fa411a21
NH
5531DEFUN (neighbor_ttl_security,
5532 neighbor_ttl_security_cmd,
9ccf14f7 5533 "neighbor <A.B.C.D|X:X::X:X|WORD> ttl-security hops (1-254)",
fa411a21
NH
5534 NEIGHBOR_STR
5535 NEIGHBOR_ADDR_STR2
16cedbb0 5536 "BGP ttl-security parameters\n"
d7fa34c1
QY
5537 "Specify the maximum number of hops to the BGP peer\n"
5538 "Number of hops to BGP peer\n")
fa411a21 5539{
c500ae40
DW
5540 int idx_peer = 1;
5541 int idx_number = 4;
fa411a21 5542 struct peer *peer;
89b6d1f8 5543 int gtsm_hops;
fa411a21 5544
c500ae40 5545 peer = peer_and_group_lookup_vty (vty, argv[idx_peer]->arg);
fa411a21
NH
5546 if (! peer)
5547 return CMD_WARNING;
e52702f2 5548
c500ae40 5549 VTY_GET_INTEGER_RANGE ("", gtsm_hops, argv[idx_number]->arg, 1, 254);
fa411a21 5550
8cdabf90
SK
5551 /*
5552 * If 'neighbor swpX', then this is for directly connected peers,
5553 * we should not accept a ttl-security hops value greater than 1.
5554 */
5555 if (peer->conf_if && (gtsm_hops > 1)) {
5556 vty_out (vty, "%s is directly connected peer, hops cannot exceed 1%s",
c500ae40 5557 argv[idx_peer]->arg, VTY_NEWLINE);
8cdabf90
SK
5558 return CMD_WARNING;
5559 }
5560
89b6d1f8 5561 return bgp_vty_return (vty, peer_ttl_security_hops_set (peer, gtsm_hops));
fa411a21
NH
5562}
5563
5564DEFUN (no_neighbor_ttl_security,
5565 no_neighbor_ttl_security_cmd,
9ccf14f7 5566 "no neighbor <A.B.C.D|X:X::X:X|WORD> ttl-security hops (1-254)",
fa411a21
NH
5567 NO_STR
5568 NEIGHBOR_STR
5569 NEIGHBOR_ADDR_STR2
16cedbb0 5570 "BGP ttl-security parameters\n"
3a2d747c
QY
5571 "Specify the maximum number of hops to the BGP peer\n"
5572 "Number of hops to BGP peer\n")
fa411a21 5573{
c500ae40 5574 int idx_peer = 2;
fa411a21 5575 struct peer *peer;
fa411a21 5576
c500ae40 5577 peer = peer_and_group_lookup_vty (vty, argv[idx_peer]->arg);
fa411a21
NH
5578 if (! peer)
5579 return CMD_WARNING;
5580
89b6d1f8 5581 return bgp_vty_return (vty, peer_ttl_security_hops_unset (peer));
fa411a21 5582}
6b0655a2 5583
adbac85e
DW
5584DEFUN (neighbor_addpath_tx_all_paths,
5585 neighbor_addpath_tx_all_paths_cmd,
9ccf14f7 5586 "neighbor <A.B.C.D|X:X::X:X|WORD> addpath-tx-all-paths",
adbac85e
DW
5587 NEIGHBOR_STR
5588 NEIGHBOR_ADDR_STR2
5589 "Use addpath to advertise all paths to a neighbor\n")
5590{
c500ae40 5591 int idx_peer = 1;
adbac85e
DW
5592 struct peer *peer;
5593
c500ae40 5594 peer = peer_and_group_lookup_vty (vty, argv[idx_peer]->arg);
adbac85e
DW
5595 if (! peer)
5596 return CMD_WARNING;
5597
c500ae40 5598 return peer_af_flag_set_vty (vty, argv[idx_peer]->arg, bgp_node_afi (vty),
adbac85e
DW
5599 bgp_node_safi (vty),
5600 PEER_FLAG_ADDPATH_TX_ALL_PATHS);
5601}
5602
5603DEFUN (no_neighbor_addpath_tx_all_paths,
5604 no_neighbor_addpath_tx_all_paths_cmd,
9ccf14f7 5605 "no neighbor <A.B.C.D|X:X::X:X|WORD> addpath-tx-all-paths",
adbac85e
DW
5606 NO_STR
5607 NEIGHBOR_STR
5608 NEIGHBOR_ADDR_STR2
5609 "Use addpath to advertise all paths to a neighbor\n")
5610{
c500ae40
DW
5611 int idx_peer = 2;
5612 return peer_af_flag_unset_vty (vty, argv[idx_peer]->arg, bgp_node_afi (vty),
adbac85e
DW
5613 bgp_node_safi (vty),
5614 PEER_FLAG_ADDPATH_TX_ALL_PATHS);
5615}
5616
06370dac
DW
5617DEFUN (neighbor_addpath_tx_bestpath_per_as,
5618 neighbor_addpath_tx_bestpath_per_as_cmd,
9ccf14f7 5619 "neighbor <A.B.C.D|X:X::X:X|WORD> addpath-tx-bestpath-per-AS",
06370dac
DW
5620 NEIGHBOR_STR
5621 NEIGHBOR_ADDR_STR2
5622 "Use addpath to advertise the bestpath per each neighboring AS\n")
5623{
c500ae40 5624 int idx_peer = 1;
06370dac
DW
5625 struct peer *peer;
5626
c500ae40 5627 peer = peer_and_group_lookup_vty (vty, argv[idx_peer]->arg);
06370dac
DW
5628 if (! peer)
5629 return CMD_WARNING;
5630
c500ae40 5631 return peer_af_flag_set_vty (vty, argv[idx_peer]->arg, bgp_node_afi (vty),
06370dac
DW
5632 bgp_node_safi (vty),
5633 PEER_FLAG_ADDPATH_TX_BESTPATH_PER_AS);
5634}
5635
5636DEFUN (no_neighbor_addpath_tx_bestpath_per_as,
5637 no_neighbor_addpath_tx_bestpath_per_as_cmd,
9ccf14f7 5638 "no neighbor <A.B.C.D|X:X::X:X|WORD> addpath-tx-bestpath-per-AS",
06370dac
DW
5639 NO_STR
5640 NEIGHBOR_STR
5641 NEIGHBOR_ADDR_STR2
5642 "Use addpath to advertise the bestpath per each neighboring AS\n")
5643{
c500ae40
DW
5644 int idx_peer = 2;
5645 return peer_af_flag_unset_vty (vty, argv[idx_peer]->arg, bgp_node_afi (vty),
06370dac
DW
5646 bgp_node_safi (vty),
5647 PEER_FLAG_ADDPATH_TX_BESTPATH_PER_AS);
5648}
5649
718e3744 5650DEFUN (address_family_ipv4_safi,
5651 address_family_ipv4_safi_cmd,
c7f1274b 5652 "address-family ipv4 [<unicast|multicast|vpn|encap>]",
718e3744 5653 "Enter Address Family command mode\n"
8c3deaae 5654 "Address Family\n"
46f296b4 5655 BGP_SAFI_HELP_STR)
718e3744 5656{
c500ae40 5657 int idx_safi = 2;
af155bb6 5658 if (argc == (idx_safi + 1))
ccbb332a 5659 {
c7f1274b
DS
5660 switch (bgp_vty_safi_from_arg(argv[idx_safi]->arg))
5661 {
5662 case SAFI_MULTICAST:
5663 vty->node = BGP_IPV4M_NODE;
5664 break;
5665 case SAFI_ENCAP:
5666 vty->node = BGP_ENCAP_NODE;
5667 break;
5668 case SAFI_MPLS_VPN:
5669 vty->node = BGP_VPNV4_NODE;
5670 break;
5671 case SAFI_UNICAST:
5672 default:
5673 vty->node = BGP_IPV4_NODE;
5674 break;
5675 }
ccbb332a 5676 }
c7f1274b
DS
5677 else
5678 vty->node = BGP_IPV4_NODE;
718e3744 5679
5680 return CMD_SUCCESS;
5681}
5682
25ffbdc1 5683DEFUN (address_family_ipv6_safi,
5684 address_family_ipv6_safi_cmd,
c7f1274b 5685 "address-family ipv6 [<unicast|multicast|vpn|encap>]",
718e3744 5686 "Enter Address Family command mode\n"
8c3deaae 5687 "Address Family\n"
46f296b4 5688 BGP_SAFI_HELP_STR)
25ffbdc1 5689{
c500ae40 5690 int idx_safi = 2;
af155bb6 5691 if (argc == (idx_safi + 1))
46f296b4 5692 {
c7f1274b
DS
5693 switch (bgp_vty_safi_from_arg(argv[idx_safi]->arg))
5694 {
5695 case SAFI_MULTICAST:
5696 vty->node = BGP_IPV6M_NODE;
5697 break;
5698 case SAFI_ENCAP:
5699 vty->node = BGP_ENCAPV6_NODE;
5700 break;
5701 case SAFI_MPLS_VPN:
5702 vty->node = BGP_VPNV6_NODE;
5703 break;
5704 case SAFI_UNICAST:
5705 default:
5706 vty->node = BGP_IPV6_NODE;
5707 break;
5708 }
46f296b4 5709 }
c7f1274b
DS
5710 else
5711 vty->node = BGP_IPV6_NODE;
25ffbdc1 5712
5713 return CMD_SUCCESS;
5714}
718e3744 5715
d6902373 5716#ifdef KEEP_OLD_VPN_COMMANDS
718e3744 5717DEFUN (address_family_vpnv4,
5718 address_family_vpnv4_cmd,
8334fd5a 5719 "address-family vpnv4 [unicast]",
718e3744 5720 "Enter Address Family command mode\n"
8c3deaae 5721 "Address Family\n"
3a2d747c 5722 "Address Family modifier\n")
718e3744 5723{
5724 vty->node = BGP_VPNV4_NODE;
5725 return CMD_SUCCESS;
5726}
5727
8ecd3266 5728DEFUN (address_family_vpnv6,
5729 address_family_vpnv6_cmd,
8334fd5a 5730 "address-family vpnv6 [unicast]",
8ecd3266 5731 "Enter Address Family command mode\n"
8c3deaae 5732 "Address Family\n"
3a2d747c 5733 "Address Family modifier\n")
8ecd3266 5734{
5735 vty->node = BGP_VPNV6_NODE;
5736 return CMD_SUCCESS;
5737}
c016b6c7 5738#endif
d6902373 5739
8b1fb8be
LB
5740DEFUN (address_family_encap,
5741 address_family_encap_cmd,
8334fd5a 5742 "address-family <encap|encapv4>",
8b1fb8be 5743 "Enter Address Family command mode\n"
8c3deaae
QY
5744 "Address Family\n"
5745 "Address Family\n")
8b1fb8be
LB
5746{
5747 vty->node = BGP_ENCAP_NODE;
5748 return CMD_SUCCESS;
5749}
5750
8b1fb8be
LB
5751
5752DEFUN (address_family_encapv6,
5753 address_family_encapv6_cmd,
5754 "address-family encapv6",
5755 "Enter Address Family command mode\n"
8c3deaae 5756 "Address Family\n")
8b1fb8be
LB
5757{
5758 vty->node = BGP_ENCAPV6_NODE;
5759 return CMD_SUCCESS;
5760}
5761
4e0b7b6d
PG
5762DEFUN (address_family_evpn,
5763 address_family_evpn_cmd,
b194703e 5764 "address-family <l2vpn evpn>",
4e0b7b6d 5765 "Enter Address Family command mode\n"
61a51962
PG
5766 "EVPN Address family\n"
5767 "Layer2 VPN Address family\n"
5768 "Ethernet Virtual Private Network Subsequent Address Family\n")
4e0b7b6d 5769{
4e0b7b6d 5770 vty->node = BGP_EVPN_NODE;
4e0b7b6d
PG
5771 return CMD_SUCCESS;
5772}
5773
718e3744 5774DEFUN (exit_address_family,
5775 exit_address_family_cmd,
5776 "exit-address-family",
5777 "Exit from Address Family configuration mode\n")
5778{
a8a80d53 5779 if (vty->node == BGP_IPV4_NODE
5780 || vty->node == BGP_IPV4M_NODE
718e3744 5781 || vty->node == BGP_VPNV4_NODE
25ffbdc1 5782 || vty->node == BGP_IPV6_NODE
8ecd3266 5783 || vty->node == BGP_IPV6M_NODE
8b1fb8be
LB
5784 || vty->node == BGP_VPNV6_NODE
5785 || vty->node == BGP_ENCAP_NODE
4e0b7b6d
PG
5786 || vty->node == BGP_ENCAPV6_NODE
5787 || vty->node == BGP_EVPN_NODE)
718e3744 5788 vty->node = BGP_NODE;
5789 return CMD_SUCCESS;
5790}
6b0655a2 5791
8ad7271d
DS
5792/* Recalculate bestpath and re-advertise a prefix */
5793static int
01080f7c 5794bgp_clear_prefix (struct vty *vty, const char *view_name, const char *ip_str,
8ad7271d
DS
5795 afi_t afi, safi_t safi, struct prefix_rd *prd)
5796{
5797 int ret;
5798 struct prefix match;
5799 struct bgp_node *rn;
5800 struct bgp_node *rm;
8ad7271d
DS
5801 struct bgp *bgp;
5802 struct bgp_table *table;
5803 struct bgp_table *rib;
5804
5805 /* BGP structure lookup. */
5806 if (view_name)
5807 {
5808 bgp = bgp_lookup_by_name (view_name);
5809 if (bgp == NULL)
5810 {
6aeb9e78 5811 vty_out (vty, "%% Can't find BGP instance %s%s", view_name, VTY_NEWLINE);
8ad7271d
DS
5812 return CMD_WARNING;
5813 }
5814 }
5815 else
5816 {
5817 bgp = bgp_get_default ();
5818 if (bgp == NULL)
5819 {
5820 vty_out (vty, "%% No BGP process is configured%s", VTY_NEWLINE);
5821 return CMD_WARNING;
5822 }
5823 }
5824
5825 /* Check IP address argument. */
5826 ret = str2prefix (ip_str, &match);
5827 if (! ret)
5828 {
5829 vty_out (vty, "%% address is malformed%s", VTY_NEWLINE);
5830 return CMD_WARNING;
5831 }
5832
5833 match.family = afi2family (afi);
5834 rib = bgp->rib[afi][safi];
5835
5836 if (safi == SAFI_MPLS_VPN)
5837 {
5838 for (rn = bgp_table_top (rib); rn; rn = bgp_route_next (rn))
5839 {
5840 if (prd && memcmp (rn->p.u.val, prd->val, 8) != 0)
5841 continue;
5842
5843 if ((table = rn->info) != NULL)
5844 {
5845 if ((rm = bgp_node_match (table, &match)) != NULL)
5846 {
5847 if (rm->p.prefixlen == match.prefixlen)
5848 {
5849 SET_FLAG (rn->flags, BGP_NODE_USER_CLEAR);
5850 bgp_process (bgp, rm, afi, safi);
5851 }
5852 bgp_unlock_node (rm);
5853 }
5854 }
5855 }
5856 }
5857 else
5858 {
5859 if ((rn = bgp_node_match (rib, &match)) != NULL)
5860 {
5861 if (rn->p.prefixlen == match.prefixlen)
5862 {
5863 SET_FLAG (rn->flags, BGP_NODE_USER_CLEAR);
5864 bgp_process (bgp, rn, afi, safi);
5865 }
5866 bgp_unlock_node (rn);
5867 }
5868 }
5869
5870 return CMD_SUCCESS;
5871}
5872
b09b5ae0 5873/* one clear bgp command to rule them all */
718e3744 5874DEFUN (clear_ip_bgp_all,
5875 clear_ip_bgp_all_cmd,
46f296b4 5876 "clear [ip] bgp [<view|vrf> WORD] ["BGP_AFI_CMD_STR" ["BGP_SAFI_CMD_STR"]] <*|A.B.C.D|X:X::X:X|WORD|(1-4294967295)|external|peer-group WORD> [<soft [<in|out>]|in [prefix-filter]|out>]",
718e3744 5877 CLEAR_STR
5878 IP_STR
5879 BGP_STR
838758ac 5880 BGP_INSTANCE_HELP_STR
b09b5ae0
DW
5881 "Clear all peers\n"
5882 "BGP neighbor address to clear\n"
a80beece 5883 "BGP IPv6 neighbor to clear\n"
838758ac 5884 "BGP neighbor on interface to clear\n"
b09b5ae0
DW
5885 "Clear peers with the AS number\n"
5886 "Clear all external peers\n"
718e3744 5887 "Clear all members of peer-group\n"
b09b5ae0 5888 "BGP peer-group name\n"
46f296b4
LB
5889 BGP_AFI_HELP_STR
5890 BGP_SAFI_HELP_STR
b09b5ae0
DW
5891 BGP_SOFT_STR
5892 BGP_SOFT_IN_STR
b09b5ae0
DW
5893 BGP_SOFT_OUT_STR
5894 BGP_SOFT_IN_STR
5895 "Push out prefix-list ORF and do inbound soft reconfig\n"
b09b5ae0 5896 BGP_SOFT_OUT_STR)
718e3744 5897{
cdc2d765 5898 VTY_DECLVAR_CONTEXT(bgp, bgp);
8334fd5a 5899 char *vrf = NULL;
630a298c 5900
ae19d7dd
QY
5901 afi_t afi = AFI_IP6;
5902 safi_t safi = SAFI_UNICAST;
5bf15956 5903 enum clear_sort clr_sort = clear_peer;
b09b5ae0
DW
5904 enum bgp_clear_type clr_type;
5905 char *clr_arg = NULL;
718e3744 5906
ae19d7dd 5907 int idx = 0;
01080f7c 5908
ae19d7dd
QY
5909 /* clear [ip] bgp */
5910 if (argv_find (argv, argc, "ip", &idx))
5911 afi = AFI_IP;
5912 /* [<view|vrf> WORD] */
5913 if (argv_find (argv, argc, "view", &idx) || argv_find (argv, argc, "vrf", &idx))
838758ac 5914 {
ae19d7dd
QY
5915 vrf = argv[idx + 1]->arg;
5916 idx += 2;
838758ac 5917 }
ae19d7dd
QY
5918 /* <*|A.B.C.D|X:X::X:X|WORD|(1-4294967295)|external|peer-group WORD> */
5919 if (argv_find (argv, argc, "*", &idx))
b09b5ae0 5920 {
ae19d7dd 5921 clr_sort = clear_all;
b09b5ae0 5922 }
ae19d7dd 5923 else if (argv_find (argv, argc, "A.B.C.D", &idx))
b09b5ae0
DW
5924 {
5925 clr_sort = clear_peer;
ae19d7dd 5926 clr_arg = argv[idx]->arg;
b09b5ae0 5927 }
ae19d7dd 5928 else if (argv_find (argv, argc, "X:X::X:X", &idx))
b09b5ae0 5929 {
ae19d7dd
QY
5930 clr_sort = clear_peer;
5931 clr_arg = argv[idx]->arg;
838758ac 5932 }
ae19d7dd 5933 else if (argv_find (argv, argc, "peer-group", &idx))
b09b5ae0
DW
5934 {
5935 clr_sort = clear_group;
ae19d7dd
QY
5936 idx++;
5937 clr_arg = argv[idx]->arg;
718e3744 5938
cdc2d765 5939 if (! peer_group_lookup (bgp, clr_arg))
b09b5ae0
DW
5940 {
5941 vty_out (vty, "%% No such peer-group%s", VTY_NEWLINE);
ae19d7dd 5942 return CMD_WARNING;
b09b5ae0
DW
5943 }
5944 }
ae19d7dd 5945 else if (argv_find (argv, argc, "WORD", &idx))
b09b5ae0 5946 {
cdc2d765 5947 if (peer_lookup_by_conf_if (bgp, argv[idx]->arg))
b09b5ae0
DW
5948 {
5949 clr_sort = clear_peer;
ae19d7dd 5950 clr_arg = argv[idx]->arg;
b09b5ae0
DW
5951 }
5952 else
5953 {
5954 vty_out (vty, "%% No such neighbor%s", VTY_NEWLINE);
5955 return CMD_WARNING;
5956 }
5957 }
ae19d7dd
QY
5958 else if (argv_find (argv, argc, "(1-4294967295)", &idx))
5959 {
5960 clr_sort = clear_as;
5961 clr_arg = argv[idx]->arg;
5962 }
5963 else if (argv_find (argv, argc, "external", &idx))
5964 {
5965 clr_sort = clear_external;
5966 }
46f296b4
LB
5967 /* ["BGP_AFI_CMD_STR" ["BGP_SAFI_CMD_STR"]] */
5968 if (argv_find_and_parse_afi (argv, argc, &idx, &afi))
ae19d7dd 5969 {
46f296b4 5970 argv_find_and_parse_safi (argv, argc, &idx, &safi);
ae19d7dd
QY
5971 }
5972 /* [<soft [<in|out>]|in [prefix-filter]|out>] */
5973 if (argv_find (argv, argc, "soft", &idx))
5974 {
5975 if (argv_find (argv, argc, "in", &idx) || argv_find (argv, argc, "out", &idx))
5976 clr_type = strmatch (argv[idx]->text, "in") ? BGP_CLEAR_SOFT_IN : BGP_CLEAR_SOFT_OUT;
5977 else
5978 clr_type = BGP_CLEAR_SOFT_BOTH;
5979 }
5980 else if (argv_find (argv, argc, "in", &idx))
5981 {
5982 clr_type = argv_find (argv, argc, "prefix-filter", &idx) ? BGP_CLEAR_SOFT_IN_ORF_PREFIX : BGP_CLEAR_SOFT_IN;
5983 }
5984 else if (argv_find (argv, argc, "out", &idx))
5985 {
5daa3e5e 5986 clr_type = BGP_CLEAR_SOFT_OUT;
ae19d7dd
QY
5987 }
5988 else
5989 clr_type = BGP_CLEAR_SOFT_NONE;
718e3744 5990
b09b5ae0 5991 return bgp_clear_vty (vty, vrf, afi, safi, clr_sort, clr_type, clr_arg);
838758ac 5992}
01080f7c 5993
8ad7271d
DS
5994DEFUN (clear_ip_bgp_prefix,
5995 clear_ip_bgp_prefix_cmd,
838758ac 5996 "clear [ip] bgp [<view|vrf> WORD] prefix A.B.C.D/M",
8ad7271d
DS
5997 CLEAR_STR
5998 IP_STR
5999 BGP_STR
838758ac 6000 BGP_INSTANCE_HELP_STR
8ad7271d 6001 "Clear bestpath and re-advertise\n"
0c7b1b01 6002 "IPv4 prefix\n")
8ad7271d 6003{
8334fd5a 6004 char *vrf = NULL;
630a298c 6005 char *prefix = NULL;
8ad7271d 6006
630a298c 6007 int idx = 0;
01080f7c 6008
630a298c
QY
6009 /* [<view|vrf> WORD] */
6010 if (argv_find (argv, argc, "WORD", &idx))
6011 vrf = argv[idx]->arg;
0c7b1b01 6012
630a298c 6013 prefix = argv[argc-1]->arg;
8ad7271d 6014
630a298c 6015 return bgp_clear_prefix (vty, vrf, prefix, AFI_IP, SAFI_UNICAST, NULL);
838758ac 6016}
8ad7271d 6017
b09b5ae0
DW
6018DEFUN (clear_bgp_ipv6_safi_prefix,
6019 clear_bgp_ipv6_safi_prefix_cmd,
46f296b4 6020 "clear [ip] bgp ipv6 "BGP_SAFI_CMD_STR" prefix X:X::X:X/M",
718e3744 6021 CLEAR_STR
3a2d747c 6022 IP_STR
718e3744 6023 BGP_STR
8c3deaae 6024 "Address Family\n"
46f296b4 6025 BGP_SAFI_HELP_STR
b09b5ae0 6026 "Clear bestpath and re-advertise\n"
0c7b1b01 6027 "IPv6 prefix\n")
718e3744 6028{
b09b5ae0
DW
6029 int idx_safi = 3;
6030 int idx_ipv6_prefixlen = 5;
46f296b4
LB
6031 return bgp_clear_prefix (vty, NULL, argv[idx_ipv6_prefixlen]->arg, AFI_IP6,
6032 bgp_vty_safi_from_arg(argv[idx_safi]->arg), NULL);
838758ac 6033}
01080f7c 6034
b09b5ae0
DW
6035DEFUN (clear_bgp_instance_ipv6_safi_prefix,
6036 clear_bgp_instance_ipv6_safi_prefix_cmd,
46f296b4 6037 "clear [ip] bgp <view|vrf> WORD ipv6 "BGP_SAFI_CMD_STR" prefix X:X::X:X/M",
718e3744 6038 CLEAR_STR
3a2d747c 6039 IP_STR
718e3744 6040 BGP_STR
838758ac 6041 BGP_INSTANCE_HELP_STR
8c3deaae 6042 "Address Family\n"
46f296b4 6043 BGP_SAFI_HELP_STR
b09b5ae0 6044 "Clear bestpath and re-advertise\n"
0c7b1b01 6045 "IPv6 prefix\n")
718e3744 6046{
b09b5ae0 6047 int idx_word = 3;
c500ae40 6048 int idx_safi = 5;
b09b5ae0 6049 int idx_ipv6_prefixlen = 7;
46f296b4
LB
6050 return bgp_clear_prefix (vty, argv[idx_word]->arg, argv[idx_ipv6_prefixlen]->arg, AFI_IP6,
6051 bgp_vty_safi_from_arg(argv[idx_safi]->arg), NULL);
718e3744 6052}
6053
b09b5ae0
DW
6054DEFUN (show_bgp_views,
6055 show_bgp_views_cmd,
d6e3c605 6056 "show [ip] bgp views",
b09b5ae0 6057 SHOW_STR
d6e3c605 6058 IP_STR
01080f7c 6059 BGP_STR
b09b5ae0 6060 "Show the defined BGP views\n")
01080f7c 6061{
b09b5ae0
DW
6062 struct list *inst = bm->bgp;
6063 struct listnode *node;
6064 struct bgp *bgp;
01080f7c 6065
b09b5ae0
DW
6066 if (!bgp_option_check (BGP_OPT_MULTIPLE_INSTANCE))
6067 {
6068 vty_out (vty, "BGP Multiple Instance is not enabled%s", VTY_NEWLINE);
6069 return CMD_WARNING;
6070 }
e52702f2 6071
b09b5ae0
DW
6072 vty_out (vty, "Defined BGP views:%s", VTY_NEWLINE);
6073 for (ALL_LIST_ELEMENTS_RO(inst, node, bgp))
6074 {
6075 /* Skip VRFs. */
6076 if (bgp->inst_type == BGP_INSTANCE_TYPE_VRF)
6077 continue;
6078 vty_out (vty, "\t%s (AS%u)%s",
6079 bgp->name ? bgp->name : "(null)",
6080 bgp->as, VTY_NEWLINE);
6081 }
e52702f2 6082
b09b5ae0 6083 return CMD_SUCCESS;
e0081f70
ML
6084}
6085
8386ac43 6086DEFUN (show_bgp_vrfs,
6087 show_bgp_vrfs_cmd,
d6e3c605 6088 "show [ip] bgp vrfs [json]",
8386ac43 6089 SHOW_STR
d6e3c605 6090 IP_STR
8386ac43 6091 BGP_STR
6092 "Show BGP VRFs\n"
9973d184 6093 JSON_STR)
8386ac43 6094{
6095 struct list *inst = bm->bgp;
6096 struct listnode *node;
6097 struct bgp *bgp;
6098 u_char uj = use_json(argc, argv);
6099 json_object *json = NULL;
6100 json_object *json_vrfs = NULL;
6101 int count = 0;
6102 static char header[] = "Type Id RouterId #PeersCfg #PeersEstb Name";
6103
6104 if (!bgp_option_check (BGP_OPT_MULTIPLE_INSTANCE))
6105 {
6106 vty_out (vty, "BGP Multiple Instance is not enabled%s", VTY_NEWLINE);
6107 return CMD_WARNING;
6108 }
6109
6110 if (uj)
6111 {
6112 json = json_object_new_object();
6113 json_vrfs = json_object_new_object();
6114 }
6115
6116 for (ALL_LIST_ELEMENTS_RO(inst, node, bgp))
6117 {
6118 const char *name, *type;
6119 struct peer *peer;
6120 struct listnode *node, *nnode;
6121 int peers_cfg, peers_estb;
6122 json_object *json_vrf = NULL;
5c81a5f3 6123 int vrf_id_ui;
8386ac43 6124
6125 /* Skip Views. */
6126 if (bgp->inst_type == BGP_INSTANCE_TYPE_VIEW)
6127 continue;
6128
6129 count++;
6130 if (!uj && count == 1)
6131 vty_out (vty, "%s%s", header, VTY_NEWLINE);
6132
6133 peers_cfg = peers_estb = 0;
6134 if (uj)
6135 json_vrf = json_object_new_object();
6136
6137
6138 for (ALL_LIST_ELEMENTS (bgp->peer, node, nnode, peer))
6139 {
6140 if (!CHECK_FLAG(peer->flags, PEER_FLAG_CONFIG_NODE))
6141 continue;
6142 peers_cfg++;
6143 if (peer->status == Established)
6144 peers_estb++;
6145 }
6146
6147 if (bgp->inst_type == BGP_INSTANCE_TYPE_DEFAULT)
6148 {
6149 name = "Default";
6150 type = "DFLT";
6151 }
6152 else
6153 {
6154 name = bgp->name;
6155 type = "VRF";
6156 }
6157
5c81a5f3 6158 vrf_id_ui = (bgp->vrf_id == VRF_UNKNOWN) ? -1 : bgp->vrf_id;
8386ac43 6159 if (uj)
6160 {
6161 json_object_string_add(json_vrf, "type", type);
5c81a5f3 6162 json_object_int_add(json_vrf, "vrfId", vrf_id_ui);
8386ac43 6163 json_object_string_add(json_vrf, "routerId", inet_ntoa (bgp->router_id));
6164 json_object_int_add(json_vrf, "numConfiguredPeers", peers_cfg);
6165 json_object_int_add(json_vrf, "numEstablishedPeers", peers_estb);
6166
6167 json_object_object_add(json_vrfs, name, json_vrf);
6168 }
6169 else
5c81a5f3 6170 vty_out (vty, "%4s %-5d %-16s %9u %10u %s%s",
6171 type, vrf_id_ui, inet_ntoa (bgp->router_id),
8386ac43 6172 peers_cfg, peers_estb, name,
6173 VTY_NEWLINE);
6174 }
6175
6176 if (uj)
6177 {
6178 json_object_object_add(json, "vrfs", json_vrfs);
6179
6180 json_object_int_add(json, "totalVrfs", count);
6181
2aac5767 6182 vty_out (vty, "%s%s", json_object_to_json_string_ext(json, JSON_C_TO_STRING_PRETTY), VTY_NEWLINE);
8386ac43 6183 json_object_free(json);
6184 }
6185 else
6186 {
6187 if (count)
6188 vty_out (vty, "%sTotal number of VRFs (including default): %d%s",
6189 VTY_NEWLINE, count, VTY_NEWLINE);
6190 }
6191
6192 return CMD_SUCCESS;
6193}
6194
f412b39a 6195DEFUN (show_bgp_memory,
4bf6a362 6196 show_bgp_memory_cmd,
7fa12b13 6197 "show [ip] bgp memory",
4bf6a362 6198 SHOW_STR
3a2d747c 6199 IP_STR
4bf6a362
PJ
6200 BGP_STR
6201 "Global BGP memory statistics\n")
6202{
6203 char memstrbuf[MTYPE_MEMSTR_LEN];
6204 unsigned long count;
e52702f2 6205
4bf6a362
PJ
6206 /* RIB related usage stats */
6207 count = mtype_stats_alloc (MTYPE_BGP_NODE);
6208 vty_out (vty, "%ld RIB nodes, using %s of memory%s", count,
6209 mtype_memstr (memstrbuf, sizeof (memstrbuf),
6210 count * sizeof (struct bgp_node)),
6211 VTY_NEWLINE);
e52702f2 6212
4bf6a362
PJ
6213 count = mtype_stats_alloc (MTYPE_BGP_ROUTE);
6214 vty_out (vty, "%ld BGP routes, using %s of memory%s", count,
6215 mtype_memstr (memstrbuf, sizeof (memstrbuf),
6216 count * sizeof (struct bgp_info)),
6217 VTY_NEWLINE);
fb982c25
PJ
6218 if ((count = mtype_stats_alloc (MTYPE_BGP_ROUTE_EXTRA)))
6219 vty_out (vty, "%ld BGP route ancillaries, using %s of memory%s", count,
6220 mtype_memstr (memstrbuf, sizeof (memstrbuf),
6221 count * sizeof (struct bgp_info_extra)),
6222 VTY_NEWLINE);
e52702f2 6223
4bf6a362
PJ
6224 if ((count = mtype_stats_alloc (MTYPE_BGP_STATIC)))
6225 vty_out (vty, "%ld Static routes, using %s of memory%s", count,
6226 mtype_memstr (memstrbuf, sizeof (memstrbuf),
6227 count * sizeof (struct bgp_static)),
6228 VTY_NEWLINE);
3f9c7369
DS
6229
6230 if ((count = mtype_stats_alloc (MTYPE_BGP_PACKET)))
6231 vty_out (vty, "%ld Packets, using %s of memory%s", count,
6232 mtype_memstr (memstrbuf, sizeof (memstrbuf),
6233 count * sizeof (struct bpacket)),
6234 VTY_NEWLINE);
e52702f2 6235
4bf6a362
PJ
6236 /* Adj-In/Out */
6237 if ((count = mtype_stats_alloc (MTYPE_BGP_ADJ_IN)))
6238 vty_out (vty, "%ld Adj-In entries, using %s of memory%s", count,
6239 mtype_memstr (memstrbuf, sizeof (memstrbuf),
6240 count * sizeof (struct bgp_adj_in)),
6241 VTY_NEWLINE);
6242 if ((count = mtype_stats_alloc (MTYPE_BGP_ADJ_OUT)))
6243 vty_out (vty, "%ld Adj-Out entries, using %s of memory%s", count,
6244 mtype_memstr (memstrbuf, sizeof (memstrbuf),
6245 count * sizeof (struct bgp_adj_out)),
6246 VTY_NEWLINE);
e52702f2 6247
4bf6a362
PJ
6248 if ((count = mtype_stats_alloc (MTYPE_BGP_NEXTHOP_CACHE)))
6249 vty_out (vty, "%ld Nexthop cache entries, using %s of memory%s", count,
6250 mtype_memstr (memstrbuf, sizeof (memstrbuf),
6251 count * sizeof (struct bgp_nexthop_cache)),
6252 VTY_NEWLINE);
6253
6254 if ((count = mtype_stats_alloc (MTYPE_BGP_DAMP_INFO)))
6255 vty_out (vty, "%ld Dampening entries, using %s of memory%s", count,
6256 mtype_memstr (memstrbuf, sizeof (memstrbuf),
6257 count * sizeof (struct bgp_damp_info)),
6258 VTY_NEWLINE);
6259
6260 /* Attributes */
6261 count = attr_count();
e52702f2
QY
6262 vty_out (vty, "%ld BGP attributes, using %s of memory%s", count,
6263 mtype_memstr (memstrbuf, sizeof (memstrbuf),
6264 count * sizeof(struct attr)),
4bf6a362 6265 VTY_NEWLINE);
fb982c25 6266 if ((count = mtype_stats_alloc (MTYPE_ATTR_EXTRA)))
e52702f2
QY
6267 vty_out (vty, "%ld BGP extra attributes, using %s of memory%s", count,
6268 mtype_memstr (memstrbuf, sizeof (memstrbuf),
6269 count * sizeof(struct attr_extra)),
fb982c25 6270 VTY_NEWLINE);
e52702f2 6271
4bf6a362
PJ
6272 if ((count = attr_unknown_count()))
6273 vty_out (vty, "%ld unknown attributes%s", count, VTY_NEWLINE);
e52702f2 6274
4bf6a362
PJ
6275 /* AS_PATH attributes */
6276 count = aspath_count ();
6277 vty_out (vty, "%ld BGP AS-PATH entries, using %s of memory%s", count,
6278 mtype_memstr (memstrbuf, sizeof (memstrbuf),
6279 count * sizeof (struct aspath)),
6280 VTY_NEWLINE);
e52702f2 6281
4bf6a362
PJ
6282 count = mtype_stats_alloc (MTYPE_AS_SEG);
6283 vty_out (vty, "%ld BGP AS-PATH segments, using %s of memory%s", count,
6284 mtype_memstr (memstrbuf, sizeof (memstrbuf),
6285 count * sizeof (struct assegment)),
6286 VTY_NEWLINE);
e52702f2 6287
4bf6a362
PJ
6288 /* Other attributes */
6289 if ((count = community_count ()))
6290 vty_out (vty, "%ld BGP community entries, using %s of memory%s", count,
6291 mtype_memstr (memstrbuf, sizeof (memstrbuf),
6292 count * sizeof (struct community)),
6293 VTY_NEWLINE);
6294 if ((count = mtype_stats_alloc (MTYPE_ECOMMUNITY)))
6295 vty_out (vty, "%ld BGP community entries, using %s of memory%s", count,
6296 mtype_memstr (memstrbuf, sizeof (memstrbuf),
6297 count * sizeof (struct ecommunity)),
6298 VTY_NEWLINE);
57d187bc
JS
6299 if ((count = mtype_stats_alloc (MTYPE_LCOMMUNITY)))
6300 vty_out (vty, "%ld BGP large-community entries, using %s of memory%s",
2acb4ac2 6301 count,
57d187bc
JS
6302 mtype_memstr (memstrbuf, sizeof (memstrbuf),
6303 count * sizeof (struct lcommunity)),
6304 VTY_NEWLINE);
e52702f2 6305
4bf6a362
PJ
6306 if ((count = mtype_stats_alloc (MTYPE_CLUSTER)))
6307 vty_out (vty, "%ld Cluster lists, using %s of memory%s", count,
6308 mtype_memstr (memstrbuf, sizeof (memstrbuf),
6309 count * sizeof (struct cluster_list)),
6310 VTY_NEWLINE);
e52702f2 6311
4bf6a362
PJ
6312 /* Peer related usage */
6313 count = mtype_stats_alloc (MTYPE_BGP_PEER);
6314 vty_out (vty, "%ld peers, using %s of memory%s", count,
6315 mtype_memstr (memstrbuf, sizeof (memstrbuf),
6316 count * sizeof (struct peer)),
6317 VTY_NEWLINE);
e52702f2 6318
4a1ab8e4 6319 if ((count = mtype_stats_alloc (MTYPE_PEER_GROUP)))
4bf6a362
PJ
6320 vty_out (vty, "%ld peer groups, using %s of memory%s", count,
6321 mtype_memstr (memstrbuf, sizeof (memstrbuf),
6322 count * sizeof (struct peer_group)),
6323 VTY_NEWLINE);
e52702f2 6324
4bf6a362
PJ
6325 /* Other */
6326 if ((count = mtype_stats_alloc (MTYPE_HASH)))
6327 vty_out (vty, "%ld hash tables, using %s of memory%s", count,
6328 mtype_memstr (memstrbuf, sizeof (memstrbuf),
6329 count * sizeof (struct hash)),
6330 VTY_NEWLINE);
6331 if ((count = mtype_stats_alloc (MTYPE_HASH_BACKET)))
6332 vty_out (vty, "%ld hash buckets, using %s of memory%s", count,
6333 mtype_memstr (memstrbuf, sizeof (memstrbuf),
6334 count * sizeof (struct hash_backet)),
6335 VTY_NEWLINE);
6336 if ((count = mtype_stats_alloc (MTYPE_BGP_REGEXP)))
6337 vty_out (vty, "%ld compiled regexes, using %s of memory%s", count,
6338 mtype_memstr (memstrbuf, sizeof (memstrbuf),
6339 count * sizeof (regex_t)),
6340 VTY_NEWLINE);
6341 return CMD_SUCCESS;
6342}
fee0f4c6 6343
718e3744 6344/* Show BGP peer's summary information. */
94f2b392 6345static int
b05a1c8b 6346bgp_show_summary (struct vty *vty, struct bgp *bgp, int afi, int safi,
9f689658 6347 u_char use_json, json_object *json)
718e3744 6348{
6349 struct peer *peer;
1eb8ef25 6350 struct listnode *node, *nnode;
f14e6fdb
DS
6351 unsigned int count = 0, dn_count = 0;
6352 char timebuf[BGP_UPTIME_LEN], dn_flag[2];
f933309e
DW
6353 char neighbor_buf[VTY_BUFSIZ];
6354 int neighbor_col_default_width = 16;
718e3744 6355 int len;
f933309e 6356 int max_neighbor_width = 0;
ffd0c037
DS
6357 json_object *json_peer = NULL;
6358 json_object *json_peers = NULL;
718e3744 6359
b05a1c8b
DS
6360 if (use_json)
6361 {
9f689658
DD
6362 if (json == NULL)
6363 json = json_object_new_object();
6364
f1aa5d8a 6365 json_peers = json_object_new_object();
b05a1c8b 6366 }
f933309e
DW
6367 else
6368 {
6369 /* Loop over all neighbors that will be displayed to determine how many
6370 * characters are needed for the Neighbor column
6371 */
6372 for (ALL_LIST_ELEMENTS (bgp->peer, node, nnode, peer))
6373 {
6374 if (!CHECK_FLAG(peer->flags, PEER_FLAG_CONFIG_NODE))
6375 continue;
6376
6377 if (peer->afc[afi][safi])
6378 {
c9d5bd27
DS
6379 memset(dn_flag, '\0', sizeof(dn_flag));
6380 if (peer_dynamic_neighbor(peer))
6381 dn_flag[0] = '*';
6382
f933309e
DW
6383 if (peer->hostname && bgp_flag_check(bgp, BGP_FLAG_SHOW_HOSTNAME))
6384 sprintf(neighbor_buf, "%s%s(%s) ", dn_flag, peer->hostname, peer->host);
6385 else
6386 sprintf(neighbor_buf, "%s%s ", dn_flag, peer->host);
6387
6388 len = strlen(neighbor_buf);
6389
6390 if (len > max_neighbor_width)
6391 max_neighbor_width = len;
6392 }
6393 }
6394
6395 /* Originally we displayed the Neighbor column as 16
6396 * characters wide so make that the default
6397 */
6398 if (max_neighbor_width < neighbor_col_default_width)
6399 max_neighbor_width = neighbor_col_default_width;
6400 }
b05a1c8b 6401
1eb8ef25 6402 for (ALL_LIST_ELEMENTS (bgp->peer, node, nnode, peer))
718e3744 6403 {
1ff9a340
DS
6404 if (!CHECK_FLAG(peer->flags, PEER_FLAG_CONFIG_NODE))
6405 continue;
6406
718e3744 6407 if (peer->afc[afi][safi])
6408 {
b05a1c8b 6409 if (!count)
4bf6a362
PJ
6410 {
6411 unsigned long ents;
6412 char memstrbuf[MTYPE_MEMSTR_LEN];
5c81a5f3 6413 int vrf_id_ui;
6414
6415 vrf_id_ui = (bgp->vrf_id == VRF_UNKNOWN) ? -1 : bgp->vrf_id;
b05a1c8b 6416
4bf6a362 6417 /* Usage summary and header */
b05a1c8b
DS
6418 if (use_json)
6419 {
62d6dca0 6420 json_object_string_add(json, "routerId", inet_ntoa (bgp->router_id));
f1aa5d8a 6421 json_object_int_add(json, "as", bgp->as);
9f689658
DD
6422 json_object_int_add(json, "vrfId", vrf_id_ui);
6423 json_object_string_add(json, "vrfName",
6424 (bgp->inst_type == BGP_INSTANCE_TYPE_DEFAULT)
6425 ? "Default" : bgp->name);
b05a1c8b
DS
6426 }
6427 else
6428 {
6429 vty_out (vty,
5c81a5f3 6430 "BGP router identifier %s, local AS number %u vrf-id %d",
6431 inet_ntoa (bgp->router_id), bgp->as, vrf_id_ui);
6aeb9e78 6432 vty_out (vty, "%s", VTY_NEWLINE);
b05a1c8b
DS
6433 }
6434
f188f2c4
DS
6435 if (bgp_update_delay_configured(bgp))
6436 {
b05a1c8b 6437 if (use_json)
f188f2c4 6438 {
62d6dca0 6439 json_object_int_add(json, "updateDelayLimit", bgp->v_update_delay);
b05a1c8b
DS
6440
6441 if (bgp->v_update_delay != bgp->v_establish_wait)
62d6dca0 6442 json_object_int_add(json, "updateDelayEstablishWait", bgp->v_establish_wait);
b05a1c8b
DS
6443
6444 if (bgp_update_delay_active(bgp))
6445 {
62d6dca0
DS
6446 json_object_string_add(json, "updateDelayFirstNeighbor", bgp->update_delay_begin_time);
6447 json_object_boolean_true_add(json, "updateDelayInProgress");
b05a1c8b
DS
6448 }
6449 else
6450 {
6451 if (bgp->update_delay_over)
6452 {
62d6dca0 6453 json_object_string_add(json, "updateDelayFirstNeighbor",
f1aa5d8a 6454 bgp->update_delay_begin_time);
62d6dca0 6455 json_object_string_add(json, "updateDelayBestpathResumed",
f1aa5d8a 6456 bgp->update_delay_end_time);
62d6dca0 6457 json_object_string_add(json, "updateDelayZebraUpdateResume",
f1aa5d8a 6458 bgp->update_delay_zebra_resume_time);
62d6dca0 6459 json_object_string_add(json, "updateDelayPeerUpdateResume",
f1aa5d8a 6460 bgp->update_delay_peers_resume_time);
b05a1c8b
DS
6461 }
6462 }
f188f2c4
DS
6463 }
6464 else
6465 {
b05a1c8b
DS
6466 vty_out (vty, "Read-only mode update-delay limit: %d seconds%s",
6467 bgp->v_update_delay, VTY_NEWLINE);
6468 if (bgp->v_update_delay != bgp->v_establish_wait)
6469 vty_out (vty, " Establish wait: %d seconds%s",
6470 bgp->v_establish_wait, VTY_NEWLINE);
6471
6472 if (bgp_update_delay_active(bgp))
f188f2c4
DS
6473 {
6474 vty_out (vty, " First neighbor established: %s%s",
6475 bgp->update_delay_begin_time, VTY_NEWLINE);
b05a1c8b
DS
6476 vty_out (vty, " Delay in progress%s", VTY_NEWLINE);
6477 }
6478 else
6479 {
6480 if (bgp->update_delay_over)
6481 {
6482 vty_out (vty, " First neighbor established: %s%s",
6483 bgp->update_delay_begin_time, VTY_NEWLINE);
6484 vty_out (vty, " Best-paths resumed: %s%s",
6485 bgp->update_delay_end_time, VTY_NEWLINE);
6486 vty_out (vty, " zebra update resumed: %s%s",
6487 bgp->update_delay_zebra_resume_time, VTY_NEWLINE);
6488 vty_out (vty, " peers update resumed: %s%s",
6489 bgp->update_delay_peers_resume_time, VTY_NEWLINE);
6490 }
f188f2c4
DS
6491 }
6492 }
6493 }
4bf6a362 6494
b05a1c8b
DS
6495 if (use_json)
6496 {
6497 if (bgp_maxmed_onstartup_configured(bgp) && bgp->maxmed_active)
62d6dca0 6498 json_object_boolean_true_add(json, "maxMedOnStartup");
b05a1c8b 6499 if (bgp->v_maxmed_admin)
62d6dca0 6500 json_object_boolean_true_add(json, "maxMedAdministrative");
b05a1c8b 6501
62d6dca0 6502 json_object_int_add(json, "tableVersion", bgp_table_version(bgp->rib[afi][safi]));
b05a1c8b
DS
6503
6504 ents = bgp_table_count (bgp->rib[afi][safi]);
62d6dca0
DS
6505 json_object_int_add(json, "ribCount", ents);
6506 json_object_int_add(json, "ribMemory", ents * sizeof (struct bgp_node));
b05a1c8b
DS
6507
6508 ents = listcount (bgp->peer);
62d6dca0
DS
6509 json_object_int_add(json, "peerCount", ents);
6510 json_object_int_add(json, "peerMemory", ents * sizeof (struct peer));
b05a1c8b 6511
b05a1c8b
DS
6512 if ((ents = listcount (bgp->group)))
6513 {
62d6dca0
DS
6514 json_object_int_add(json, "peerGroupCount", ents);
6515 json_object_int_add(json, "peerGroupMemory", ents * sizeof (struct peer_group));
b05a1c8b 6516 }
3f9c7369 6517
b05a1c8b 6518 if (CHECK_FLAG (bgp->af_flags[afi][safi], BGP_CONFIG_DAMPENING))
62d6dca0 6519 json_object_boolean_true_add(json, "dampeningEnabled");
b05a1c8b
DS
6520 }
6521 else
6522 {
6523 if (bgp_maxmed_onstartup_configured(bgp) && bgp->maxmed_active)
6524 vty_out (vty, "Max-med on-startup active%s", VTY_NEWLINE);
6525 if (bgp->v_maxmed_admin)
6526 vty_out (vty, "Max-med administrative active%s", VTY_NEWLINE);
6527
ffd0c037 6528 vty_out(vty, "BGP table version %" PRIu64 "%s",
b05a1c8b
DS
6529 bgp_table_version(bgp->rib[afi][safi]), VTY_NEWLINE);
6530
6531 ents = bgp_table_count (bgp->rib[afi][safi]);
6532 vty_out (vty, "RIB entries %ld, using %s of memory%s", ents,
6533 mtype_memstr (memstrbuf, sizeof (memstrbuf),
6534 ents * sizeof (struct bgp_node)),
6535 VTY_NEWLINE);
6536
6537 /* Peer related usage */
6538 ents = listcount (bgp->peer);
6539 vty_out (vty, "Peers %ld, using %s of memory%s",
6540 ents,
6541 mtype_memstr (memstrbuf, sizeof (memstrbuf),
6542 ents * sizeof (struct peer)),
6543 VTY_NEWLINE);
6544
b05a1c8b
DS
6545 if ((ents = listcount (bgp->group)))
6546 vty_out (vty, "Peer groups %ld, using %s of memory%s", ents,
6547 mtype_memstr (memstrbuf, sizeof (memstrbuf),
6548 ents * sizeof (struct peer_group)),
6549 VTY_NEWLINE);
6550
6551 if (CHECK_FLAG (bgp->af_flags[afi][safi], BGP_CONFIG_DAMPENING))
6552 vty_out (vty, "Dampening enabled.%s", VTY_NEWLINE);
6553 vty_out (vty, "%s", VTY_NEWLINE);
f933309e
DW
6554
6555 /* Subtract 8 here because 'Neighbor' is 8 characters */
6556 vty_out (vty, "Neighbor");
6557 vty_out (vty, "%*s", max_neighbor_width - 8, " ");
6558 vty_out (vty, "V AS MsgRcvd MsgSent TblVer InQ OutQ Up/Down State/PfxRcd%s", VTY_NEWLINE);
b05a1c8b 6559 }
4bf6a362 6560 }
e52702f2 6561
b05a1c8b 6562 count++;
718e3744 6563
b05a1c8b
DS
6564 if (use_json)
6565 {
6566 json_peer = json_object_new_object();
f14e6fdb 6567
b05a1c8b 6568 if (peer_dynamic_neighbor(peer))
62d6dca0 6569 json_object_boolean_true_add(json_peer, "dynamicPeer");
b05a1c8b 6570
04b6bdc0
DW
6571 if (peer->hostname)
6572 json_object_string_add(json_peer, "hostname", peer->hostname);
6573
6574 if (peer->domainname)
6575 json_object_string_add(json_peer, "domainname", peer->domainname);
6576
62d6dca0 6577 json_object_int_add(json_peer, "remoteAs", peer->as);
f1aa5d8a 6578 json_object_int_add(json_peer, "version", 4);
62d6dca0 6579 json_object_int_add(json_peer, "msgRcvd",
f1aa5d8a
DS
6580 peer->open_in + peer->update_in + peer->keepalive_in
6581 + peer->notify_in + peer->refresh_in
6582 + peer->dynamic_cap_in);
62d6dca0 6583 json_object_int_add(json_peer, "msgSent",
f1aa5d8a
DS
6584 peer->open_out + peer->update_out + peer->keepalive_out
6585 + peer->notify_out + peer->refresh_out
6586 + peer->dynamic_cap_out);
6587
62d6dca0 6588 json_object_int_add(json_peer, "tableVersion", peer->version[afi][safi]);
f1aa5d8a
DS
6589 json_object_int_add(json_peer, "outq", peer->obuf->count);
6590 json_object_int_add(json_peer, "inq", 0);
856ca177 6591 peer_uptime (peer->uptime, timebuf, BGP_UPTIME_LEN, use_json, json_peer);
62d6dca0 6592 json_object_int_add(json_peer, "prefixReceivedCount", peer->pcount[afi][safi]);
b05a1c8b
DS
6593
6594 if (CHECK_FLAG (peer->flags, PEER_FLAG_SHUTDOWN))
f1aa5d8a 6595 json_object_string_add(json_peer, "state", "Idle (Admin)");
b05a1c8b 6596 else if (CHECK_FLAG (peer->sflags, PEER_STATUS_PREFIX_OVERFLOW))
f1aa5d8a 6597 json_object_string_add(json_peer, "state", "Idle (PfxCt)");
b05a1c8b 6598 else
f1aa5d8a 6599 json_object_string_add(json_peer, "state", LOOKUP(bgp_status_msg, peer->status));
b05a1c8b 6600
f1aa5d8a 6601 if (peer->conf_if)
62d6dca0 6602 json_object_string_add(json_peer, "idType", "interface");
f1aa5d8a 6603 else if (peer->su.sa.sa_family == AF_INET)
62d6dca0 6604 json_object_string_add(json_peer, "idType", "ipv4");
f1aa5d8a 6605 else if (peer->su.sa.sa_family == AF_INET6)
62d6dca0 6606 json_object_string_add(json_peer, "idType", "ipv6");
b05a1c8b 6607
f1aa5d8a 6608 json_object_object_add(json_peers, peer->host, json_peer);
b05a1c8b
DS
6609 }
6610 else
6611 {
6612 memset(dn_flag, '\0', sizeof(dn_flag));
6613 if (peer_dynamic_neighbor(peer))
6614 {
6615 dn_count++;
6616 dn_flag[0] = '*';
6617 }
6618
04b6bdc0
DW
6619 if (peer->hostname && bgp_flag_check(bgp, BGP_FLAG_SHOW_HOSTNAME))
6620 len = vty_out (vty, "%s%s(%s)", dn_flag, peer->hostname,
6621 peer->host);
6622 else
6623 len = vty_out (vty, "%s%s", dn_flag, peer->host);
b05a1c8b 6624
f933309e
DW
6625 /* pad the neighbor column with spaces */
6626 if (len < max_neighbor_width)
6627 vty_out (vty, "%*s", max_neighbor_width - len, " ");
b05a1c8b 6628
f933309e 6629 vty_out (vty, "4 %10u %7d %7d %8" PRIu64 " %4d %4zd %8s",
b05a1c8b
DS
6630 peer->as,
6631 peer->open_in + peer->update_in + peer->keepalive_in
6632 + peer->notify_in + peer->refresh_in
6633 + peer->dynamic_cap_in,
6634 peer->open_out + peer->update_out + peer->keepalive_out
6635 + peer->notify_out + peer->refresh_out
6636 + peer->dynamic_cap_out,
6637 peer->version[afi][safi],
6638 0,
f933309e 6639 peer->obuf->count,
856ca177 6640 peer_uptime (peer->uptime, timebuf, BGP_UPTIME_LEN, 0, NULL));
b05a1c8b
DS
6641
6642 if (peer->status == Established)
46f8c104 6643 vty_out (vty, " %12ld", peer->pcount[afi][safi]);
b05a1c8b
DS
6644 else
6645 {
6646 if (CHECK_FLAG (peer->flags, PEER_FLAG_SHUTDOWN))
6647 vty_out (vty, " Idle (Admin)");
6648 else if (CHECK_FLAG (peer->sflags, PEER_STATUS_PREFIX_OVERFLOW))
6649 vty_out (vty, " Idle (PfxCt)");
6650 else
f933309e 6651 vty_out (vty, " %12s", LOOKUP(bgp_status_msg, peer->status));
b05a1c8b
DS
6652 }
6653 vty_out (vty, "%s", VTY_NEWLINE);
6654 }
718e3744 6655 }
6656 }
6657
b05a1c8b
DS
6658 if (use_json)
6659 {
6660 json_object_object_add(json, "peers", json_peers);
14151a32 6661
62d6dca0
DS
6662 json_object_int_add(json, "totalPeers", count);
6663 json_object_int_add(json, "dynamicPeers", dn_count);
14151a32 6664
2aac5767 6665 vty_out (vty, "%s%s", json_object_to_json_string_ext(json, JSON_C_TO_STRING_PRETTY), VTY_NEWLINE);
f1aa5d8a 6666 json_object_free(json);
b05a1c8b
DS
6667 }
6668 else
f14e6fdb 6669 {
b05a1c8b
DS
6670 if (count)
6671 vty_out (vty, "%sTotal number of neighbors %d%s", VTY_NEWLINE,
6672 count, VTY_NEWLINE);
6673 else
9f689658
DD
6674 {
6675 if (use_json)
6676 vty_out(vty, "{\"error\": {\"message\": \"No %s neighbor configured\"}}%s",
46f296b4 6677 afi_safi_print(afi, safi), VTY_NEWLINE);
9f689658
DD
6678 else
6679 vty_out (vty, "No %s neighbor is configured%s",
46f296b4 6680 afi_safi_print(afi, safi), VTY_NEWLINE);
9f689658 6681 }
b05a1c8b 6682
9f689658 6683 if (dn_count && ! use_json)
b05a1c8b
DS
6684 {
6685 vty_out(vty, "* - dynamic neighbor%s", VTY_NEWLINE);
6686 vty_out(vty,
6687 "%d dynamic neighbor(s), limit %d%s",
6688 dn_count, bgp->dynamic_neighbors_limit, VTY_NEWLINE);
6689 }
f14e6fdb
DS
6690 }
6691
718e3744 6692 return CMD_SUCCESS;
6693}
6694
27162734
LB
6695static void
6696bgp_show_summary_afi_safi (struct vty *vty, struct bgp *bgp, int afi, int safi,
6697 u_char use_json, json_object *json)
6698{
6699 int is_first = 1;
6700 int afi_wildcard = (afi == AFI_MAX);
6701 int safi_wildcard = (safi == SAFI_MAX);
6702 int is_wildcard = (afi_wildcard || safi_wildcard);
6703 if (use_json && is_wildcard)
6704 vty_out (vty, "{%s", VTY_NEWLINE);
6705 if (afi_wildcard)
6706 afi = 1; /* AFI_IP */
6707 while (afi < AFI_MAX)
6708 {
6709 if (safi_wildcard)
6710 safi = 1; /* SAFI_UNICAST */
6711 while (safi < SAFI_MAX)
6712 {
6713 if (is_wildcard)
6714 {
6715 if (use_json)
6716 {
6717 json = json_object_new_object();
6718
6719 if (! is_first)
6720 vty_out (vty, ",%s", VTY_NEWLINE);
6721 else
6722 is_first = 0;
6723
6724 vty_out(vty, "\"%s\":", afi_safi_json(afi, safi));
6725 }
6726 else
6727 {
6728 vty_out (vty, "%s%s Summary:%s",
6729 VTY_NEWLINE, afi_safi_print(afi, safi), VTY_NEWLINE);
6730 }
6731 }
6732 bgp_show_summary (vty, bgp, afi, safi, use_json, json);
f62a5c33
LB
6733 safi++;
6734 if (safi == SAFI_RESERVED_4 ||
6735 safi == SAFI_RESERVED_5) /* handle special cases to match zebra.h */
6736 safi++;
27162734
LB
6737 if (! safi_wildcard)
6738 safi = SAFI_MAX;
6739 }
6740 afi++;
6741 if (! afi_wildcard ||
5ef6cd69 6742 afi == AFI_L2VPN) /* special case, not handled yet */
27162734
LB
6743 afi = AFI_MAX;
6744 }
6745
6746 if (use_json && is_wildcard)
6747 vty_out (vty, "}%s", VTY_NEWLINE);
6748
6749}
6750
f186de26 6751static void
6752bgp_show_all_instances_summary_vty (struct vty *vty, afi_t afi, safi_t safi,
6753 u_char use_json)
6754{
6755 struct listnode *node, *nnode;
6756 struct bgp *bgp;
9f689658
DD
6757 json_object *json = NULL;
6758 int is_first = 1;
6759
6760 if (use_json)
6761 vty_out (vty, "{%s", VTY_NEWLINE);
f186de26 6762
6763 for (ALL_LIST_ELEMENTS (bm->bgp, node, nnode, bgp))
6764 {
9f689658
DD
6765 if (use_json)
6766 {
4fb25c53 6767 json = json_object_new_object();
9f689658
DD
6768
6769 if (! is_first)
6770 vty_out (vty, ",%s", VTY_NEWLINE);
6771 else
6772 is_first = 0;
6773
6774 vty_out(vty, "\"%s\":", (bgp->inst_type == BGP_INSTANCE_TYPE_DEFAULT)
6775 ? "Default" : bgp->name);
6776 }
6777 else
6778 {
6779 vty_out (vty, "%sInstance %s:%s",
6780 VTY_NEWLINE,
6781 (bgp->inst_type == BGP_INSTANCE_TYPE_DEFAULT)
6782 ? "Default" : bgp->name, VTY_NEWLINE);
6783 }
27162734 6784 bgp_show_summary_afi_safi (vty, bgp, afi, safi, use_json, json);
f186de26 6785 }
9f689658
DD
6786
6787 if (use_json)
6788 vty_out (vty, "}%s", VTY_NEWLINE);
6789
f186de26 6790}
6791
4fb25c53
DW
6792static int
6793bgp_show_summary_vty (struct vty *vty, const char *name,
6794 afi_t afi, safi_t safi, u_char use_json)
6795{
6796 struct bgp *bgp;
6797
6798 if (name)
6799 {
6800 if (strmatch(name, "all"))
6801 {
6802 bgp_show_all_instances_summary_vty (vty, afi, safi, use_json);
6803 return CMD_SUCCESS;
6804 }
6805 else
6806 {
6807 bgp = bgp_lookup_by_name (name);
6808
6809 if (! bgp)
6810 {
6811 if (use_json)
6812 vty_out (vty, "{}%s", VTY_NEWLINE);
6813 else
6814 vty_out (vty, "%% No such BGP instance exist%s", VTY_NEWLINE);
6815 return CMD_WARNING;
6816 }
6817
27162734 6818 bgp_show_summary_afi_safi (vty, bgp, afi, safi, use_json, NULL);
4fb25c53
DW
6819 return CMD_SUCCESS;
6820 }
6821 }
6822
6823 bgp = bgp_get_default ();
6824
6825 if (bgp)
27162734 6826 bgp_show_summary_afi_safi (vty, bgp, afi, safi, use_json, NULL);
4fb25c53
DW
6827
6828 return CMD_SUCCESS;
6829}
6830
716b2d8a 6831/* `show [ip] bgp summary' commands. */
47fc97cc 6832DEFUN (show_ip_bgp_summary,
718e3744 6833 show_ip_bgp_summary_cmd,
46f296b4 6834 "show [ip] bgp [<view|vrf> WORD] ["BGP_AFI_CMD_STR" ["BGP_SAFI_CMD_STR"]] summary [json]",
718e3744 6835 SHOW_STR
6836 IP_STR
6837 BGP_STR
8386ac43 6838 BGP_INSTANCE_HELP_STR
46f296b4
LB
6839 BGP_AFI_HELP_STR
6840 BGP_SAFI_HELP_STR
b05a1c8b 6841 "Summary of BGP neighbor status\n"
9973d184 6842 JSON_STR)
718e3744 6843{
74ca3d33 6844 char *vrf = NULL;
27162734
LB
6845 afi_t afi = AFI_MAX;
6846 safi_t safi = SAFI_MAX;
ae19d7dd
QY
6847
6848 int idx = 0;
6849
6850 /* show [ip] bgp */
6851 if (argv_find (argv, argc, "ip", &idx))
6852 afi = AFI_IP;
6853 /* [<view|vrf> WORD] */
6854 if (argv_find (argv, argc, "view", &idx) || argv_find (argv, argc, "vrf", &idx))
6855 vrf = argv[++idx]->arg;
46f296b4
LB
6856 /* ["BGP_AFI_CMD_STR" ["BGP_SAFI_CMD_STR"]] */
6857 if (argv_find_and_parse_afi (argv, argc, &idx, &afi))
ae19d7dd 6858 {
46f296b4 6859 argv_find_and_parse_safi (argv, argc, &idx, &safi);
91d37724
QY
6860 }
6861
ae19d7dd 6862 int uj = use_json (argc, argv);
74ca3d33
DW
6863
6864 return bgp_show_summary_vty (vty, vrf, afi, safi, uj);
718e3744 6865}
6866
fd79ac91 6867const char *
538621f2 6868afi_safi_print (afi_t afi, safi_t safi)
6869{
6870 if (afi == AFI_IP && safi == SAFI_UNICAST)
6871 return "IPv4 Unicast";
6872 else if (afi == AFI_IP && safi == SAFI_MULTICAST)
6873 return "IPv4 Multicast";
6874 else if (afi == AFI_IP && safi == SAFI_MPLS_VPN)
46f296b4 6875 return "IPv4 VPN";
8b1fb8be 6876 else if (afi == AFI_IP && safi == SAFI_ENCAP)
46f296b4 6877 return "IPv4 Encap";
538621f2 6878 else if (afi == AFI_IP6 && safi == SAFI_UNICAST)
6879 return "IPv6 Unicast";
6880 else if (afi == AFI_IP6 && safi == SAFI_MULTICAST)
6881 return "IPv6 Multicast";
945c8fe9 6882 else if (afi == AFI_IP6 && safi == SAFI_MPLS_VPN)
46f296b4 6883 return "IPv6 VPN";
8b1fb8be 6884 else if (afi == AFI_IP6 && safi == SAFI_ENCAP)
46f296b4 6885 return "IPv6 Encap";
3d6c0dfa
PG
6886 else if (afi == AFI_L2VPN && safi == SAFI_EVPN)
6887 return "L2VPN EVPN";
538621f2 6888 else
6889 return "Unknown";
6890}
6891
27162734
LB
6892const char *
6893afi_safi_json (afi_t afi, safi_t safi)
6894{
6895 if (afi == AFI_IP && safi == SAFI_UNICAST)
6896 return "IPv4Unicast";
6897 else if (afi == AFI_IP && safi == SAFI_MULTICAST)
6898 return "IPv4Multicast";
6899 else if (afi == AFI_IP && safi == SAFI_MPLS_VPN)
6900 return "IPv4VPN";
6901 else if (afi == AFI_IP && safi == SAFI_ENCAP)
6902 return "IPv4Encap";
6903 else if (afi == AFI_IP6 && safi == SAFI_UNICAST)
6904 return "IPv6Unicast";
6905 else if (afi == AFI_IP6 && safi == SAFI_MULTICAST)
6906 return "IPv6Multicast";
6907 else if (afi == AFI_IP6 && safi == SAFI_MPLS_VPN)
6908 return "IPv6VPN";
6909 else if (afi == AFI_IP6 && safi == SAFI_ENCAP)
6910 return "IPv6Encap";
3d6c0dfa
PG
6911 else if (afi == AFI_L2VPN && safi == SAFI_EVPN)
6912 return "L2VPN EVPN";
27162734
LB
6913 else
6914 return "Unknown";
6915}
6916
718e3744 6917/* Show BGP peer's information. */
6918enum show_type
6919{
6920 show_all,
6921 show_peer
6922};
6923
94f2b392 6924static void
856ca177
MS
6925bgp_show_peer_afi_orf_cap (struct vty *vty, struct peer *p, afi_t afi, safi_t safi,
6926 u_int16_t adv_smcap, u_int16_t adv_rmcap, u_int16_t rcv_smcap,
6927 u_int16_t rcv_rmcap, u_char use_json, json_object *json_pref)
718e3744 6928{
6929 /* Send-Mode */
6930 if (CHECK_FLAG (p->af_cap[afi][safi], adv_smcap)
6931 || CHECK_FLAG (p->af_cap[afi][safi], rcv_smcap))
6932 {
856ca177
MS
6933 if (use_json)
6934 {
6935 if (CHECK_FLAG (p->af_cap[afi][safi], adv_smcap) && CHECK_FLAG (p->af_cap[afi][safi], rcv_smcap))
6936 json_object_string_add(json_pref, "sendMode", "advertisedAndReceived");
6937 else if (CHECK_FLAG (p->af_cap[afi][safi], adv_smcap))
6938 json_object_string_add(json_pref, "sendMode", "advertised");
6939 else if (CHECK_FLAG (p->af_cap[afi][safi], rcv_smcap))
6940 json_object_string_add(json_pref, "sendMode", "received");
6941 }
6942 else
6943 {
6944 vty_out (vty, " Send-mode: ");
6945 if (CHECK_FLAG (p->af_cap[afi][safi], adv_smcap))
6946 vty_out (vty, "advertised");
6947 if (CHECK_FLAG (p->af_cap[afi][safi], rcv_smcap))
6948 vty_out (vty, "%sreceived",
6949 CHECK_FLAG (p->af_cap[afi][safi], adv_smcap) ?
6950 ", " : "");
6951 vty_out (vty, "%s", VTY_NEWLINE);
6952 }
718e3744 6953 }
6954
6955 /* Receive-Mode */
6956 if (CHECK_FLAG (p->af_cap[afi][safi], adv_rmcap)
6957 || CHECK_FLAG (p->af_cap[afi][safi], rcv_rmcap))
6958 {
856ca177
MS
6959 if (use_json)
6960 {
6961 if (CHECK_FLAG (p->af_cap[afi][safi], adv_rmcap) && CHECK_FLAG (p->af_cap[afi][safi], rcv_rmcap))
6962 json_object_string_add(json_pref, "recvMode", "advertisedAndReceived");
6963 else if (CHECK_FLAG (p->af_cap[afi][safi], adv_rmcap))
6964 json_object_string_add(json_pref, "recvMode", "advertised");
6965 else if (CHECK_FLAG (p->af_cap[afi][safi], rcv_rmcap))
6966 json_object_string_add(json_pref, "recvMode", "received");
6967 }
6968 else
6969 {
6970 vty_out (vty, " Receive-mode: ");
6971 if (CHECK_FLAG (p->af_cap[afi][safi], adv_rmcap))
6972 vty_out (vty, "advertised");
6973 if (CHECK_FLAG (p->af_cap[afi][safi], rcv_rmcap))
6974 vty_out (vty, "%sreceived",
6975 CHECK_FLAG (p->af_cap[afi][safi], adv_rmcap) ?
6976 ", " : "");
6977 vty_out (vty, "%s", VTY_NEWLINE);
6978 }
718e3744 6979 }
6980}
6981
94f2b392 6982static void
856ca177
MS
6983bgp_show_peer_afi (struct vty *vty, struct peer *p, afi_t afi, safi_t safi,
6984 u_char use_json, json_object *json_neigh)
718e3744 6985{
6986 struct bgp_filter *filter;
3f9c7369 6987 struct peer_af *paf;
718e3744 6988 char orf_pfx_name[BUFSIZ];
6989 int orf_pfx_count;
856ca177
MS
6990 json_object *json_af = NULL;
6991 json_object *json_prefA = NULL;
6992 json_object *json_prefB = NULL;
6993 json_object *json_addr = NULL;
718e3744 6994
856ca177
MS
6995 if (use_json)
6996 {
6997 json_addr = json_object_new_object();
6998 json_af = json_object_new_object();
856ca177 6999 filter = &p->filter[afi][safi];
718e3744 7000
c8560b44 7001 if (peer_group_active(p))
856ca177 7002 json_object_string_add(json_addr, "peerGroupMember", p->group->name);
538621f2 7003
856ca177
MS
7004 paf = peer_af_find(p, afi, safi);
7005 if (paf && PAF_SUBGRP(paf))
7006 {
7007 json_object_int_add(json_addr, "updateGroupId", PAF_UPDGRP(paf)->id);
7008 json_object_int_add(json_addr, "subGroupId", PAF_SUBGRP(paf)->id);
7009 json_object_int_add(json_addr, "packetQueueLength", bpacket_queue_virtual_length(paf));
7010 }
7011
7012 if (CHECK_FLAG (p->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_SM_ADV)
7013 || CHECK_FLAG (p->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_SM_RCV)
7014 || CHECK_FLAG (p->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_RM_ADV)
7015 || CHECK_FLAG (p->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_RM_RCV))
7016 {
7017 json_object_int_add(json_af, "orfType", ORF_TYPE_PREFIX);
b6df4090 7018 json_prefA = json_object_new_object();
856ca177
MS
7019 bgp_show_peer_afi_orf_cap (vty, p, afi, safi,
7020 PEER_CAP_ORF_PREFIX_SM_ADV,
7021 PEER_CAP_ORF_PREFIX_RM_ADV,
7022 PEER_CAP_ORF_PREFIX_SM_RCV,
7023 PEER_CAP_ORF_PREFIX_RM_RCV, use_json, json_prefA);
7024 json_object_object_add(json_af, "orfPrefixList", json_prefA);
7025 }
7026
7027 if (CHECK_FLAG (p->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_SM_ADV)
7028 || CHECK_FLAG (p->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_SM_OLD_RCV)
7029 || CHECK_FLAG (p->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_RM_ADV)
7030 || CHECK_FLAG (p->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_RM_OLD_RCV))
7031 {
7032 json_object_int_add(json_af, "orfOldType", ORF_TYPE_PREFIX_OLD);
b6df4090 7033 json_prefB = json_object_new_object();
856ca177
MS
7034 bgp_show_peer_afi_orf_cap (vty, p, afi, safi,
7035 PEER_CAP_ORF_PREFIX_SM_ADV,
7036 PEER_CAP_ORF_PREFIX_RM_ADV,
7037 PEER_CAP_ORF_PREFIX_SM_OLD_RCV,
7038 PEER_CAP_ORF_PREFIX_RM_OLD_RCV, use_json, json_prefB);
7039 json_object_object_add(json_af, "orfOldPrefixList", json_prefB);
7040 }
7041
7042 if (CHECK_FLAG (p->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_SM_ADV)
7043 || CHECK_FLAG (p->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_SM_RCV)
7044 || CHECK_FLAG (p->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_SM_OLD_RCV)
7045 || CHECK_FLAG (p->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_RM_ADV)
7046 || CHECK_FLAG (p->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_RM_RCV)
7047 || CHECK_FLAG (p->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_RM_OLD_RCV))
7048 json_object_object_add(json_addr, "afDependentCap", json_af);
b6df4090
DS
7049 else
7050 json_object_free(json_af);
856ca177
MS
7051
7052 sprintf (orf_pfx_name, "%s.%d.%d", p->host, afi, safi);
7053 orf_pfx_count = prefix_bgp_show_prefix_list (NULL, afi, orf_pfx_name, use_json);
7054
7055 if (CHECK_FLAG (p->af_sflags[afi][safi], PEER_STATUS_ORF_PREFIX_SEND)
7056 || orf_pfx_count)
7057 {
7058 if (CHECK_FLAG (p->af_sflags[afi][safi], PEER_STATUS_ORF_PREFIX_SEND))
7059 json_object_boolean_true_add(json_neigh, "orfSent");
7060 if (orf_pfx_count)
7061 json_object_int_add(json_addr, "orfRecvCounter", orf_pfx_count);
7062 }
7063 if (CHECK_FLAG (p->af_sflags[afi][safi], PEER_STATUS_ORF_WAIT_REFRESH))
7064 json_object_string_add(json_addr, "orfFirstUpdate", "deferredUntilORFOrRouteRefreshRecvd");
7065
7066 if (CHECK_FLAG (p->af_flags[afi][safi], PEER_FLAG_REFLECTOR_CLIENT))
7067 json_object_boolean_true_add(json_addr, "routeReflectorClient");
7068 if (CHECK_FLAG (p->af_flags[afi][safi], PEER_FLAG_RSERVER_CLIENT))
7069 json_object_boolean_true_add(json_addr, "routeServerClient");
7070 if (CHECK_FLAG (p->af_flags[afi][safi], PEER_FLAG_SOFT_RECONFIG))
7071 json_object_boolean_true_add(json_addr, "inboundSoftConfigPermit");
7072
88b8ed8d
DW
7073 if (CHECK_FLAG (p->af_flags[afi][safi], PEER_FLAG_REMOVE_PRIVATE_AS_ALL_REPLACE))
7074 json_object_boolean_true_add(json_addr, "privateAsNumsAllReplacedInUpdatesToNbr");
7075 else if (CHECK_FLAG (p->af_flags[afi][safi], PEER_FLAG_REMOVE_PRIVATE_AS_REPLACE))
856ca177 7076 json_object_boolean_true_add(json_addr, "privateAsNumsReplacedInUpdatesToNbr");
88b8ed8d
DW
7077 else if (CHECK_FLAG (p->af_flags[afi][safi], PEER_FLAG_REMOVE_PRIVATE_AS_ALL))
7078 json_object_boolean_true_add(json_addr, "privateAsNumsAllRemovedInUpdatesToNbr");
856ca177
MS
7079 else if (CHECK_FLAG (p->af_flags[afi][safi], PEER_FLAG_REMOVE_PRIVATE_AS))
7080 json_object_boolean_true_add(json_addr, "privateAsNumsRemovedInUpdatesToNbr");
7081
adbac85e
DW
7082 if (CHECK_FLAG (p->af_flags[afi][safi], PEER_FLAG_ADDPATH_TX_ALL_PATHS))
7083 json_object_boolean_true_add(json_addr, "addpathTxAllPaths");
7084
06370dac
DW
7085 if (CHECK_FLAG (p->af_flags[afi][safi], PEER_FLAG_ADDPATH_TX_BESTPATH_PER_AS))
7086 json_object_boolean_true_add(json_addr, "addpathTxBestpathPerAS");
7087
856ca177
MS
7088 if (CHECK_FLAG (p->af_flags[afi][safi], PEER_FLAG_AS_OVERRIDE))
7089 json_object_string_add(json_addr, "overrideASNsInOutboundUpdates", "ifAspathEqualRemoteAs");
7090
7091 if (CHECK_FLAG (p->af_flags[afi][safi], PEER_FLAG_NEXTHOP_SELF) ||
7092 CHECK_FLAG (p->af_flags[afi][safi], PEER_FLAG_FORCE_NEXTHOP_SELF))
7093 json_object_boolean_true_add(json_addr, "routerAlwaysNextHop");
7094 if (CHECK_FLAG (p->af_flags[afi][safi], PEER_FLAG_AS_PATH_UNCHANGED))
7095 json_object_boolean_true_add(json_addr, "unchangedAsPathPropogatedToNbr");
7096 if (CHECK_FLAG (p->af_flags[afi][safi], PEER_FLAG_NEXTHOP_UNCHANGED))
7097 json_object_boolean_true_add(json_addr, "unchangedNextHopPropogatedToNbr");
7098 if (CHECK_FLAG (p->af_flags[afi][safi], PEER_FLAG_MED_UNCHANGED))
7099 json_object_boolean_true_add(json_addr, "unchangedMedPropogatedToNbr");
718e3744 7100 if (CHECK_FLAG (p->af_flags[afi][safi], PEER_FLAG_SEND_COMMUNITY)
856ca177
MS
7101 || CHECK_FLAG (p->af_flags[afi][safi], PEER_FLAG_SEND_EXT_COMMUNITY))
7102 {
7103 if (CHECK_FLAG (p->af_flags[afi][safi], PEER_FLAG_SEND_COMMUNITY)
7104 && CHECK_FLAG (p->af_flags[afi][safi], PEER_FLAG_SEND_EXT_COMMUNITY))
7105 json_object_string_add(json_addr, "commAttriSentToNbr", "extendedAndStandard");
7106 else if (CHECK_FLAG (p->af_flags[afi][safi], PEER_FLAG_SEND_EXT_COMMUNITY))
7107 json_object_string_add(json_addr, "commAttriSentToNbr", "extended");
7108 else
7109 json_object_string_add(json_addr, "commAttriSentToNbr", "standard");
7110 }
7111 if (CHECK_FLAG (p->af_flags[afi][safi], PEER_FLAG_DEFAULT_ORIGINATE))
7112 {
7113 if (p->default_rmap[afi][safi].name)
7114 json_object_string_add(json_addr, "defaultRouteMap", p->default_rmap[afi][safi].name);
7115
7116 if (paf && PAF_SUBGRP(paf) && CHECK_FLAG(PAF_SUBGRP(paf)->sflags, SUBGRP_STATUS_DEFAULT_ORIGINATE))
7117 json_object_boolean_true_add(json_addr, "defaultSent");
7118 else
7119 json_object_boolean_true_add(json_addr, "defaultNotSent");
7120 }
7121
7122 if (filter->plist[FILTER_IN].name
7123 || filter->dlist[FILTER_IN].name
7124 || filter->aslist[FILTER_IN].name
7125 || filter->map[RMAP_IN].name)
7126 json_object_boolean_true_add(json_addr, "inboundPathPolicyConfig");
7127 if (filter->plist[FILTER_OUT].name
7128 || filter->dlist[FILTER_OUT].name
7129 || filter->aslist[FILTER_OUT].name
7130 || filter->map[RMAP_OUT].name
7131 || filter->usmap.name)
7132 json_object_boolean_true_add(json_addr, "outboundPathPolicyConfig");
856ca177
MS
7133
7134 /* prefix-list */
7135 if (filter->plist[FILTER_IN].name)
7136 json_object_string_add(json_addr, "incomingUpdatePrefixFilterList", filter->plist[FILTER_IN].name);
7137 if (filter->plist[FILTER_OUT].name)
7138 json_object_string_add(json_addr, "outgoingUpdatePrefixFilterList", filter->plist[FILTER_OUT].name);
7139
7140 /* distribute-list */
7141 if (filter->dlist[FILTER_IN].name)
7142 json_object_string_add(json_addr, "incomingUpdateNetworkFilterList", filter->dlist[FILTER_IN].name);
7143 if (filter->dlist[FILTER_OUT].name)
7144 json_object_string_add(json_addr, "outgoingUpdateNetworkFilterList", filter->dlist[FILTER_OUT].name);
7145
7146 /* filter-list. */
7147 if (filter->aslist[FILTER_IN].name)
7148 json_object_string_add(json_addr, "incomingUpdateAsPathFilterList", filter->aslist[FILTER_IN].name);
7149 if (filter->aslist[FILTER_OUT].name)
7150 json_object_string_add(json_addr, "outgoingUpdateAsPathFilterList", filter->aslist[FILTER_OUT].name);
7151
7152 /* route-map. */
7153 if (filter->map[RMAP_IN].name)
7154 json_object_string_add(json_addr, "routeMapForIncomingAdvertisements", filter->map[RMAP_IN].name);
7155 if (filter->map[RMAP_OUT].name)
7156 json_object_string_add(json_addr, "routeMapForOutgoingAdvertisements", filter->map[RMAP_OUT].name);
856ca177
MS
7157
7158 /* unsuppress-map */
7159 if (filter->usmap.name)
7160 json_object_string_add(json_addr, "selectiveUnsuppressRouteMap", filter->usmap.name);
7161
7162 /* Receive prefix count */
7163 json_object_int_add(json_addr, "acceptedPrefixCounter", p->pcount[afi][safi]);
7164
7165 /* Maximum prefix */
7166 if (CHECK_FLAG (p->af_flags[afi][safi], PEER_FLAG_MAX_PREFIX))
7167 {
7168 json_object_int_add(json_addr, "prefixAllowedMax", p->pmax[afi][safi]);
7169 if (CHECK_FLAG (p->af_flags[afi][safi], PEER_FLAG_MAX_PREFIX_WARNING))
7170 json_object_boolean_true_add(json_addr, "prefixAllowedMaxWarning");
7171 json_object_int_add(json_addr, "prefixAllowedWarningThresh", p->pmax_threshold[afi][safi]);
7172 if (p->pmax_restart[afi][safi])
7173 json_object_int_add(json_addr, "prefixAllowedRestartIntervalMsecs", p->pmax_restart[afi][safi] * 60000);
7174 }
7175 json_object_object_add(json_neigh, afi_safi_print (afi, safi), json_addr);
7176
7177 }
7178 else
7179 {
7180 filter = &p->filter[afi][safi];
7181
7182 vty_out (vty, " For address family: %s%s", afi_safi_print (afi, safi),
7183 VTY_NEWLINE);
7184
c8560b44 7185 if (peer_group_active(p))
856ca177
MS
7186 vty_out (vty, " %s peer-group member%s", p->group->name, VTY_NEWLINE);
7187
7188 paf = peer_af_find(p, afi, safi);
7189 if (paf && PAF_SUBGRP(paf))
7190 {
7191 vty_out (vty, " Update group %" PRIu64 ", subgroup %" PRIu64 "%s",
7192 PAF_UPDGRP(paf)->id, PAF_SUBGRP(paf)->id, VTY_NEWLINE);
7193 vty_out (vty, " Packet Queue length %d%s",
7194 bpacket_queue_virtual_length(paf), VTY_NEWLINE);
7195 }
718e3744 7196 else
856ca177
MS
7197 {
7198 vty_out(vty, " Not part of any update group%s", VTY_NEWLINE);
7199 }
7200 if (CHECK_FLAG (p->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_SM_ADV)
7201 || CHECK_FLAG (p->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_SM_RCV)
7202 || CHECK_FLAG (p->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_SM_OLD_RCV)
7203 || CHECK_FLAG (p->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_RM_ADV)
7204 || CHECK_FLAG (p->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_RM_RCV)
7205 || CHECK_FLAG (p->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_RM_OLD_RCV))
7206 vty_out (vty, " AF-dependant capabilities:%s", VTY_NEWLINE);
7207
7208 if (CHECK_FLAG (p->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_SM_ADV)
7209 || CHECK_FLAG (p->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_SM_RCV)
7210 || CHECK_FLAG (p->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_RM_ADV)
7211 || CHECK_FLAG (p->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_RM_RCV))
7212 {
7213 vty_out (vty, " Outbound Route Filter (ORF) type (%d) Prefix-list:%s",
7214 ORF_TYPE_PREFIX, VTY_NEWLINE);
7215 bgp_show_peer_afi_orf_cap (vty, p, afi, safi,
7216 PEER_CAP_ORF_PREFIX_SM_ADV,
7217 PEER_CAP_ORF_PREFIX_RM_ADV,
7218 PEER_CAP_ORF_PREFIX_SM_RCV,
7219 PEER_CAP_ORF_PREFIX_RM_RCV, use_json, NULL);
7220 }
7221 if (CHECK_FLAG (p->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_SM_ADV)
7222 || CHECK_FLAG (p->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_SM_OLD_RCV)
7223 || CHECK_FLAG (p->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_RM_ADV)
7224 || CHECK_FLAG (p->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_RM_OLD_RCV))
7225 {
7226 vty_out (vty, " Outbound Route Filter (ORF) type (%d) Prefix-list:%s",
7227 ORF_TYPE_PREFIX_OLD, VTY_NEWLINE);
7228 bgp_show_peer_afi_orf_cap (vty, p, afi, safi,
7229 PEER_CAP_ORF_PREFIX_SM_ADV,
7230 PEER_CAP_ORF_PREFIX_RM_ADV,
7231 PEER_CAP_ORF_PREFIX_SM_OLD_RCV,
7232 PEER_CAP_ORF_PREFIX_RM_OLD_RCV, use_json, NULL);
7233 }
718e3744 7234
856ca177
MS
7235 sprintf (orf_pfx_name, "%s.%d.%d", p->host, afi, safi);
7236 orf_pfx_count = prefix_bgp_show_prefix_list (NULL, afi, orf_pfx_name, use_json);
718e3744 7237
856ca177
MS
7238 if (CHECK_FLAG (p->af_sflags[afi][safi], PEER_STATUS_ORF_PREFIX_SEND)
7239 || orf_pfx_count)
7240 {
7241 vty_out (vty, " Outbound Route Filter (ORF):");
7242 if (CHECK_FLAG (p->af_sflags[afi][safi], PEER_STATUS_ORF_PREFIX_SEND))
7243 vty_out (vty, " sent;");
7244 if (orf_pfx_count)
7245 vty_out (vty, " received (%d entries)", orf_pfx_count);
7246 vty_out (vty, "%s", VTY_NEWLINE);
7247 }
7248 if (CHECK_FLAG (p->af_sflags[afi][safi], PEER_STATUS_ORF_WAIT_REFRESH))
7249 vty_out (vty, " First update is deferred until ORF or ROUTE-REFRESH is received%s", VTY_NEWLINE);
7250
7251 if (CHECK_FLAG (p->af_flags[afi][safi], PEER_FLAG_REFLECTOR_CLIENT))
7252 vty_out (vty, " Route-Reflector Client%s", VTY_NEWLINE);
7253 if (CHECK_FLAG (p->af_flags[afi][safi], PEER_FLAG_RSERVER_CLIENT))
7254 vty_out (vty, " Route-Server Client%s", VTY_NEWLINE);
7255 if (CHECK_FLAG (p->af_flags[afi][safi], PEER_FLAG_SOFT_RECONFIG))
7256 vty_out (vty, " Inbound soft reconfiguration allowed%s", VTY_NEWLINE);
7257
88b8ed8d
DW
7258 if (CHECK_FLAG (p->af_flags[afi][safi], PEER_FLAG_REMOVE_PRIVATE_AS_ALL_REPLACE))
7259 vty_out (vty, " Private AS numbers (all) replaced in updates to this neighbor%s", VTY_NEWLINE);
7260 else if (CHECK_FLAG (p->af_flags[afi][safi], PEER_FLAG_REMOVE_PRIVATE_AS_REPLACE))
856ca177 7261 vty_out (vty, " Private AS numbers replaced in updates to this neighbor%s", VTY_NEWLINE);
88b8ed8d
DW
7262 else if (CHECK_FLAG (p->af_flags[afi][safi], PEER_FLAG_REMOVE_PRIVATE_AS_ALL))
7263 vty_out (vty, " Private AS numbers (all) removed in updates to this neighbor%s", VTY_NEWLINE);
856ca177
MS
7264 else if (CHECK_FLAG (p->af_flags[afi][safi], PEER_FLAG_REMOVE_PRIVATE_AS))
7265 vty_out (vty, " Private AS numbers removed in updates to this neighbor%s", VTY_NEWLINE);
7266
adbac85e
DW
7267 if (CHECK_FLAG (p->af_flags[afi][safi], PEER_FLAG_ADDPATH_TX_ALL_PATHS))
7268 vty_out (vty, " Advertise all paths via addpath%s", VTY_NEWLINE);
7269
06370dac
DW
7270 if (CHECK_FLAG (p->af_flags[afi][safi], PEER_FLAG_ADDPATH_TX_BESTPATH_PER_AS))
7271 vty_out (vty, " Advertise bestpath per AS via addpath%s", VTY_NEWLINE);
7272
856ca177
MS
7273 if (CHECK_FLAG (p->af_flags[afi][safi], PEER_FLAG_AS_OVERRIDE))
7274 vty_out (vty, " Override ASNs in outbound updates if aspath equals remote-as%s", VTY_NEWLINE);
7275
7276 if (CHECK_FLAG (p->af_flags[afi][safi], PEER_FLAG_NEXTHOP_SELF) ||
7277 CHECK_FLAG (p->af_flags[afi][safi], PEER_FLAG_FORCE_NEXTHOP_SELF))
7278 vty_out (vty, " NEXT_HOP is always this router%s", VTY_NEWLINE);
7279 if (CHECK_FLAG (p->af_flags[afi][safi], PEER_FLAG_AS_PATH_UNCHANGED))
7280 vty_out (vty, " AS_PATH is propagated unchanged to this neighbor%s", VTY_NEWLINE);
7281 if (CHECK_FLAG (p->af_flags[afi][safi], PEER_FLAG_NEXTHOP_UNCHANGED))
7282 vty_out (vty, " NEXT_HOP is propagated unchanged to this neighbor%s", VTY_NEWLINE);
7283 if (CHECK_FLAG (p->af_flags[afi][safi], PEER_FLAG_MED_UNCHANGED))
7284 vty_out (vty, " MED is propagated unchanged to this neighbor%s", VTY_NEWLINE);
7285 if (CHECK_FLAG (p->af_flags[afi][safi], PEER_FLAG_SEND_COMMUNITY)
57d187bc
JS
7286 || CHECK_FLAG (p->af_flags[afi][safi], PEER_FLAG_SEND_EXT_COMMUNITY)
7287 || CHECK_FLAG (p->af_flags[afi][safi], PEER_FLAG_SEND_LARGE_COMMUNITY))
856ca177
MS
7288 {
7289 vty_out (vty, " Community attribute sent to this neighbor");
7290 if (CHECK_FLAG (p->af_flags[afi][safi], PEER_FLAG_SEND_COMMUNITY)
57d187bc
JS
7291 && CHECK_FLAG (p->af_flags[afi][safi], PEER_FLAG_SEND_EXT_COMMUNITY)
7292 && CHECK_FLAG (p->af_flags[afi][safi], PEER_FLAG_SEND_LARGE_COMMUNITY))
7293 vty_out (vty, "(all)%s", VTY_NEWLINE);
7294 else if (CHECK_FLAG (p->af_flags[afi][safi], PEER_FLAG_SEND_LARGE_COMMUNITY))
7295 vty_out (vty, "(large)%s", VTY_NEWLINE);
856ca177
MS
7296 else if (CHECK_FLAG (p->af_flags[afi][safi], PEER_FLAG_SEND_EXT_COMMUNITY))
7297 vty_out (vty, "(extended)%s", VTY_NEWLINE);
7298 else
7299 vty_out (vty, "(standard)%s", VTY_NEWLINE);
7300 }
7301 if (CHECK_FLAG (p->af_flags[afi][safi], PEER_FLAG_DEFAULT_ORIGINATE))
7302 {
7303 vty_out (vty, " Default information originate,");
7304
7305 if (p->default_rmap[afi][safi].name)
7306 vty_out (vty, " default route-map %s%s,",
7307 p->default_rmap[afi][safi].map ? "*" : "",
7308 p->default_rmap[afi][safi].name);
7309 if (paf && PAF_SUBGRP(paf) && CHECK_FLAG(PAF_SUBGRP(paf)->sflags, SUBGRP_STATUS_DEFAULT_ORIGINATE))
7310 vty_out (vty, " default sent%s", VTY_NEWLINE);
7311 else
7312 vty_out (vty, " default not sent%s", VTY_NEWLINE);
7313 }
718e3744 7314
856ca177
MS
7315 if (filter->plist[FILTER_IN].name
7316 || filter->dlist[FILTER_IN].name
7317 || filter->aslist[FILTER_IN].name
7318 || filter->map[RMAP_IN].name)
7319 vty_out (vty, " Inbound path policy configured%s", VTY_NEWLINE);
7320 if (filter->plist[FILTER_OUT].name
7321 || filter->dlist[FILTER_OUT].name
7322 || filter->aslist[FILTER_OUT].name
7323 || filter->map[RMAP_OUT].name
7324 || filter->usmap.name)
7325 vty_out (vty, " Outbound path policy configured%s", VTY_NEWLINE);
856ca177
MS
7326
7327 /* prefix-list */
7328 if (filter->plist[FILTER_IN].name)
7329 vty_out (vty, " Incoming update prefix filter list is %s%s%s",
7330 filter->plist[FILTER_IN].plist ? "*" : "",
7331 filter->plist[FILTER_IN].name,
7332 VTY_NEWLINE);
7333 if (filter->plist[FILTER_OUT].name)
7334 vty_out (vty, " Outgoing update prefix filter list is %s%s%s",
7335 filter->plist[FILTER_OUT].plist ? "*" : "",
7336 filter->plist[FILTER_OUT].name,
7337 VTY_NEWLINE);
7338
7339 /* distribute-list */
7340 if (filter->dlist[FILTER_IN].name)
7341 vty_out (vty, " Incoming update network filter list is %s%s%s",
7342 filter->dlist[FILTER_IN].alist ? "*" : "",
7343 filter->dlist[FILTER_IN].name,
7344 VTY_NEWLINE);
7345 if (filter->dlist[FILTER_OUT].name)
7346 vty_out (vty, " Outgoing update network filter list is %s%s%s",
7347 filter->dlist[FILTER_OUT].alist ? "*" : "",
7348 filter->dlist[FILTER_OUT].name,
7349 VTY_NEWLINE);
7350
7351 /* filter-list. */
7352 if (filter->aslist[FILTER_IN].name)
7353 vty_out (vty, " Incoming update AS path filter list is %s%s%s",
7354 filter->aslist[FILTER_IN].aslist ? "*" : "",
7355 filter->aslist[FILTER_IN].name,
7356 VTY_NEWLINE);
7357 if (filter->aslist[FILTER_OUT].name)
7358 vty_out (vty, " Outgoing update AS path filter list is %s%s%s",
7359 filter->aslist[FILTER_OUT].aslist ? "*" : "",
7360 filter->aslist[FILTER_OUT].name,
7361 VTY_NEWLINE);
7362
7363 /* route-map. */
7364 if (filter->map[RMAP_IN].name)
7365 vty_out (vty, " Route map for incoming advertisements is %s%s%s",
7366 filter->map[RMAP_IN].map ? "*" : "",
7367 filter->map[RMAP_IN].name,
7368 VTY_NEWLINE);
7369 if (filter->map[RMAP_OUT].name)
7370 vty_out (vty, " Route map for outgoing advertisements is %s%s%s",
7371 filter->map[RMAP_OUT].map ? "*" : "",
7372 filter->map[RMAP_OUT].name,
7373 VTY_NEWLINE);
856ca177
MS
7374
7375 /* unsuppress-map */
7376 if (filter->usmap.name)
7377 vty_out (vty, " Route map for selective unsuppress is %s%s%s",
7378 filter->usmap.map ? "*" : "",
7379 filter->usmap.name, VTY_NEWLINE);
7380
7381 /* Receive prefix count */
7382 vty_out (vty, " %ld accepted prefixes%s", p->pcount[afi][safi], VTY_NEWLINE);
7383
7384 /* Maximum prefix */
7385 if (CHECK_FLAG (p->af_flags[afi][safi], PEER_FLAG_MAX_PREFIX))
7386 {
7387 vty_out (vty, " Maximum prefixes allowed %ld%s%s", p->pmax[afi][safi],
7388 CHECK_FLAG (p->af_flags[afi][safi], PEER_FLAG_MAX_PREFIX_WARNING)
7389 ? " (warning-only)" : "", VTY_NEWLINE);
7390 vty_out (vty, " Threshold for warning message %d%%",
7391 p->pmax_threshold[afi][safi]);
7392 if (p->pmax_restart[afi][safi])
7393 vty_out (vty, ", restart interval %d min", p->pmax_restart[afi][safi]);
7394 vty_out (vty, "%s", VTY_NEWLINE);
7395 }
718e3744 7396
0a486e5f 7397 vty_out (vty, "%s", VTY_NEWLINE);
718e3744 7398 }
718e3744 7399}
7400
94f2b392 7401static void
e8f7da3a 7402bgp_show_peer (struct vty *vty, struct peer *p, u_char use_json, json_object *json)
718e3744 7403{
7404 struct bgp *bgp;
4690c7d7 7405 char buf1[PREFIX2STR_BUFFER], buf[SU_ADDRSTRLEN];
718e3744 7406 char timebuf[BGP_UPTIME_LEN];
f14e6fdb 7407 char dn_flag[2];
3a8c7ba1
DW
7408 const char *subcode_str;
7409 const char *code_str;
538621f2 7410 afi_t afi;
7411 safi_t safi;
d6661008
DS
7412 u_int16_t i;
7413 u_char *msg;
e8f7da3a 7414 json_object *json_neigh = NULL;
718e3744 7415
7416 bgp = p->bgp;
7417
e8f7da3a
DW
7418 if (use_json)
7419 json_neigh = json_object_new_object();
7420
517cd68a
DS
7421 memset (dn_flag, '\0', sizeof (dn_flag));
7422 if (!p->conf_if && peer_dynamic_neighbor (p))
7423 dn_flag[0] = '*';
7424
856ca177 7425 if (!use_json)
f14e6fdb 7426 {
856ca177
MS
7427 if (p->conf_if) /* Configured interface name. */
7428 vty_out (vty, "BGP neighbor on %s: %s, ", p->conf_if,
7429 BGP_PEER_SU_UNSPEC(p) ? "None" :
7430 sockunion2str (&p->su, buf, SU_ADDRSTRLEN));
7431 else /* Configured IP address. */
74ef1672 7432 vty_out (vty, "BGP neighbor is %s%s, ", dn_flag, p->host);
f14e6fdb
DS
7433 }
7434
856ca177
MS
7435 if (use_json)
7436 {
7437 if (p->conf_if && BGP_PEER_SU_UNSPEC(p))
7438 json_object_string_add(json_neigh, "bgpNeighborAddr", "none");
7439 else if (p->conf_if && !BGP_PEER_SU_UNSPEC(p))
7440 json_object_string_add(json_neigh, "bgpNeighborAddr", sockunion2str (&p->su, buf, SU_ADDRSTRLEN));
7441
7442 json_object_int_add(json_neigh, "remoteAs", p->as);
7443
7444 if (p->change_local_as)
7445 json_object_int_add(json_neigh, "localAs", p->change_local_as);
7446 else
7447 json_object_int_add(json_neigh, "localAs", p->local_as);
7448
7449 if (CHECK_FLAG (p->flags, PEER_FLAG_LOCAL_AS_NO_PREPEND))
7450 json_object_boolean_true_add(json_neigh, "localAsNoPrepend");
66b199b2 7451
856ca177
MS
7452 if (CHECK_FLAG (p->flags, PEER_FLAG_LOCAL_AS_REPLACE_AS))
7453 json_object_boolean_true_add(json_neigh, "localAsReplaceAs");
7454 }
7455 else
7456 {
f8cfafda
DS
7457 if ((p->as_type == AS_SPECIFIED) ||
7458 (p->as_type == AS_EXTERNAL) ||
7459 (p->as_type == AS_INTERNAL))
7460 vty_out (vty, "remote AS %u, ", p->as);
7461 else
7462 vty_out (vty, "remote AS Unspecified, ");
856ca177
MS
7463 vty_out (vty, "local AS %u%s%s, ",
7464 p->change_local_as ? p->change_local_as : p->local_as,
7465 CHECK_FLAG (p->flags, PEER_FLAG_LOCAL_AS_NO_PREPEND) ?
7466 " no-prepend" : "",
7467 CHECK_FLAG (p->flags, PEER_FLAG_LOCAL_AS_REPLACE_AS) ?
7468 " replace-as" : "");
7469 }
66b199b2
DS
7470 /* peer type internal, external, confed-internal or confed-external */
7471 if (p->as == p->local_as)
7472 {
856ca177
MS
7473 if (use_json)
7474 {
7475 if (CHECK_FLAG(bgp->config, BGP_CONFIG_CONFEDERATION))
7476 json_object_boolean_true_add(json_neigh, "nbrConfedInternalLink");
7477 else
7478 json_object_boolean_true_add(json_neigh, "nbrInternalLink");
7479 }
66b199b2 7480 else
856ca177
MS
7481 {
7482 if (CHECK_FLAG(bgp->config, BGP_CONFIG_CONFEDERATION))
7483 vty_out (vty, "confed-internal link%s", VTY_NEWLINE);
7484 else
7485 vty_out (vty, "internal link%s", VTY_NEWLINE);
7486 }
66b199b2
DS
7487 }
7488 else
7489 {
856ca177
MS
7490 if (use_json)
7491 {
7492 if (CHECK_FLAG(bgp->config, BGP_CONFIG_CONFEDERATION))
7493 json_object_boolean_true_add(json_neigh, "nbrConfedExternalLink");
7494 else
7495 json_object_boolean_true_add(json_neigh, "nbrExternalLink");
7496 }
66b199b2 7497 else
856ca177
MS
7498 {
7499 if (bgp_confederation_peers_check(bgp, p->as))
7500 vty_out (vty, "confed-external link%s", VTY_NEWLINE);
7501 else
7502 vty_out (vty, "external link%s", VTY_NEWLINE);
7503 }
66b199b2 7504 }
718e3744 7505
7506 /* Description. */
7507 if (p->desc)
856ca177
MS
7508 {
7509 if (use_json)
7510 json_object_string_add(json_neigh, "nbrDesc", p->desc);
7511 else
7512 vty_out (vty, " Description: %s%s", p->desc, VTY_NEWLINE);
7513 }
6410e93a 7514
04b6bdc0
DW
7515 if (p->hostname)
7516 {
d1570739
DW
7517 if (use_json)
7518 {
7519 if (p->hostname)
7520 json_object_string_add(json_neigh, "hostname", p->hostname);
7521
7522 if (p->domainname)
7523 json_object_string_add(json_neigh, "domainname", p->domainname);
7524 }
04b6bdc0 7525 else
d1570739
DW
7526 {
7527 if (p->domainname && (p->domainname[0] != '\0'))
7528 vty_out(vty, "Hostname: %s.%s%s", p->hostname, p->domainname,
7529 VTY_NEWLINE);
7530 else
7531 vty_out(vty, "Hostname: %s%s", p->hostname, VTY_NEWLINE);
7532 }
7533
04b6bdc0
DW
7534 }
7535
c744aa9f 7536 /* Peer-group */
718e3744 7537 if (p->group)
f14e6fdb 7538 {
856ca177
MS
7539 if (use_json)
7540 {
7541 json_object_string_add(json_neigh, "peerGroup", p->group->name);
7542
7543 if (dn_flag[0])
7544 {
40ee54a7 7545 struct prefix prefix, *range = NULL;
f14e6fdb 7546
40ee54a7
TT
7547 sockunion2hostprefix(&(p->su), &prefix);
7548 range = peer_group_lookup_dynamic_neighbor_range (p->group, &prefix);
856ca177
MS
7549
7550 if (range)
7551 {
7552 prefix2str(range, buf1, sizeof(buf1));
7553 json_object_string_add(json_neigh, "peerSubnetRangeGroup", buf1);
7554 }
7555 }
7556 }
7557 else
f14e6fdb 7558 {
856ca177
MS
7559 vty_out (vty, " Member of peer-group %s for session parameters%s",
7560 p->group->name, VTY_NEWLINE);
f14e6fdb 7561
856ca177 7562 if (dn_flag[0])
f14e6fdb 7563 {
40ee54a7 7564 struct prefix prefix, *range = NULL;
856ca177 7565
40ee54a7
TT
7566 sockunion2hostprefix(&(p->su), &prefix);
7567 range = peer_group_lookup_dynamic_neighbor_range (p->group, &prefix);
856ca177
MS
7568
7569 if (range)
7570 {
7571 prefix2str(range, buf1, sizeof(buf1));
7572 vty_out (vty, " Belongs to the subnet range group: %s%s", buf1, VTY_NEWLINE);
7573 }
f14e6fdb
DS
7574 }
7575 }
7576 }
718e3744 7577
856ca177
MS
7578 if (use_json)
7579 {
7580 /* Administrative shutdown. */
7581 if (CHECK_FLAG (p->flags, PEER_FLAG_SHUTDOWN))
7582 json_object_boolean_true_add(json_neigh, "adminShutDown");
718e3744 7583
856ca177
MS
7584 /* BGP Version. */
7585 json_object_int_add(json_neigh, "bgpVersion", 4);
389e3fe0 7586 json_object_string_add(json_neigh, "remoteRouterId",
44b8cd53 7587 inet_ntop (AF_INET, &p->remote_id, buf1, sizeof(buf1)));
718e3744 7588
856ca177
MS
7589 /* Confederation */
7590 if (CHECK_FLAG (bgp->config, BGP_CONFIG_CONFEDERATION) && bgp_confederation_peers_check (bgp, p->as))
7591 json_object_boolean_true_add(json_neigh, "nbrCommonAdmin");
7592
7593 /* Status. */
7594 json_object_string_add(json_neigh, "bgpState", LOOKUP (bgp_status_msg, p->status));
7595
7596 if (p->status == Established)
7597 {
7598 time_t uptime;
7599 struct tm *tm;
7600
7601 uptime = bgp_clock();
7602 uptime -= p->uptime;
7603 tm = gmtime(&uptime);
7604
7605 json_object_int_add(json_neigh, "bgpTimerUp", (tm->tm_sec * 1000) + (tm->tm_min * 60000) + (tm->tm_hour * 3600000));
7606 }
7607
7608 else if (p->status == Active)
7609 {
7610 if (CHECK_FLAG (p->flags, PEER_FLAG_PASSIVE))
7611 json_object_string_add(json_neigh, "bgpStateIs", "passive");
7612 else if (CHECK_FLAG (p->sflags, PEER_STATUS_NSF_WAIT))
7613 json_object_string_add(json_neigh, "bgpStateIs", "passiveNSF");
7614 }
7615
7616 /* read timer */
7617 time_t uptime;
7618 struct tm *tm;
7619
7620 uptime = bgp_clock();
7621 uptime -= p->readtime;
7622 tm = gmtime(&uptime);
7623 json_object_int_add(json_neigh, "bgpTimerLastRead", (tm->tm_sec * 1000) + (tm->tm_min * 60000) + (tm->tm_hour * 3600000));
7624
7625 uptime = bgp_clock();
7626 uptime -= p->last_write;
7627 tm = gmtime(&uptime);
39e871e6
ST
7628 json_object_int_add(json_neigh, "bgpTimerLastWrite", (tm->tm_sec * 1000) + (tm->tm_min * 60000) + (tm->tm_hour * 3600000));
7629
7630 uptime = bgp_clock();
7631 uptime -= p->update_time;
7632 tm = gmtime(&uptime);
7633 json_object_int_add(json_neigh, "bgpInUpdateElapsedTimeMsecs",
7634 (tm->tm_sec * 1000) + (tm->tm_min * 60000) + (tm->tm_hour * 3600000));
856ca177
MS
7635
7636 /* Configured timer values. */
7637 json_object_int_add(json_neigh, "bgpTimerHoldTimeMsecs", p->v_holdtime * 1000);
7638 json_object_int_add(json_neigh, "bgpTimerKeepAliveIntervalMsecs", p->v_keepalive * 1000);
7639
7640 if (CHECK_FLAG (p->config, PEER_CONFIG_TIMER))
7641 {
7642 json_object_int_add(json_neigh, "bgpTimerConfiguredHoldTimeMsecs", p->holdtime * 1000);
7643 json_object_int_add(json_neigh, "bgpTimerConfiguredKeepAliveIntervalMsecs", p->keepalive * 1000);
7644 }
93406d87 7645 }
856ca177
MS
7646 else
7647 {
7648 /* Administrative shutdown. */
7649 if (CHECK_FLAG (p->flags, PEER_FLAG_SHUTDOWN))
7650 vty_out (vty, " Administratively shut down%s", VTY_NEWLINE);
7651
7652 /* BGP Version. */
7653 vty_out (vty, " BGP version 4");
389e3fe0 7654 vty_out (vty, ", remote router ID %s%s",
44b8cd53 7655 inet_ntop (AF_INET, &p->remote_id, buf1, sizeof(buf1)),
856ca177
MS
7656 VTY_NEWLINE);
7657
7658 /* Confederation */
7659 if (CHECK_FLAG (bgp->config, BGP_CONFIG_CONFEDERATION)
7660 && bgp_confederation_peers_check (bgp, p->as))
7661 vty_out (vty, " Neighbor under common administration%s", VTY_NEWLINE);
e52702f2 7662
856ca177
MS
7663 /* Status. */
7664 vty_out (vty, " BGP state = %s", LOOKUP (bgp_status_msg, p->status));
718e3744 7665
856ca177
MS
7666 if (p->status == Established)
7667 vty_out (vty, ", up for %8s", peer_uptime (p->uptime, timebuf, BGP_UPTIME_LEN, 0, NULL));
7668
7669 else if (p->status == Active)
7670 {
7671 if (CHECK_FLAG (p->flags, PEER_FLAG_PASSIVE))
7672 vty_out (vty, " (passive)");
7673 else if (CHECK_FLAG (p->sflags, PEER_STATUS_NSF_WAIT))
7674 vty_out (vty, " (NSF passive)");
7675 }
7676 vty_out (vty, "%s", VTY_NEWLINE);
93406d87 7677
856ca177
MS
7678 /* read timer */
7679 vty_out (vty, " Last read %s", peer_uptime (p->readtime, timebuf, BGP_UPTIME_LEN, 0, NULL));
7680 vty_out (vty, ", Last write %s%s",
7681 peer_uptime (p->last_write, timebuf, BGP_UPTIME_LEN, 0, NULL), VTY_NEWLINE);
7682
7683 /* Configured timer values. */
7684 vty_out (vty, " Hold time is %d, keepalive interval is %d seconds%s",
7685 p->v_holdtime, p->v_keepalive, VTY_NEWLINE);
7686 if (CHECK_FLAG (p->config, PEER_CONFIG_TIMER))
7687 {
7688 vty_out (vty, " Configured hold time is %d", p->holdtime);
7689 vty_out (vty, ", keepalive interval is %d seconds%s",
7690 p->keepalive, VTY_NEWLINE);
7691 }
7692 }
718e3744 7693 /* Capability. */
e52702f2 7694 if (p->status == Established)
718e3744 7695 {
538621f2 7696 if (p->cap
718e3744 7697 || p->afc_adv[AFI_IP][SAFI_UNICAST]
7698 || p->afc_recv[AFI_IP][SAFI_UNICAST]
7699 || p->afc_adv[AFI_IP][SAFI_MULTICAST]
7700 || p->afc_recv[AFI_IP][SAFI_MULTICAST]
718e3744 7701 || p->afc_adv[AFI_IP6][SAFI_UNICAST]
7702 || p->afc_recv[AFI_IP6][SAFI_UNICAST]
7703 || p->afc_adv[AFI_IP6][SAFI_MULTICAST]
7704 || p->afc_recv[AFI_IP6][SAFI_MULTICAST]
945c8fe9
LB
7705 || p->afc_adv[AFI_IP6][SAFI_MPLS_VPN]
7706 || p->afc_recv[AFI_IP6][SAFI_MPLS_VPN]
8b1fb8be
LB
7707 || p->afc_adv[AFI_IP6][SAFI_ENCAP]
7708 || p->afc_recv[AFI_IP6][SAFI_ENCAP]
8b1fb8be
LB
7709 || p->afc_adv[AFI_IP][SAFI_ENCAP]
7710 || p->afc_recv[AFI_IP][SAFI_ENCAP]
718e3744 7711 || p->afc_adv[AFI_IP][SAFI_MPLS_VPN]
7712 || p->afc_recv[AFI_IP][SAFI_MPLS_VPN])
7713 {
856ca177
MS
7714 if (use_json)
7715 {
7716 json_object *json_cap = NULL;
7717
7718 json_cap = json_object_new_object();
7719
7720 /* AS4 */
7721 if (CHECK_FLAG (p->cap, PEER_CAP_AS4_RCV)
7722 || CHECK_FLAG (p->cap, PEER_CAP_AS4_ADV))
7723 {
7724 if (CHECK_FLAG (p->cap, PEER_CAP_AS4_ADV) && CHECK_FLAG (p->cap, PEER_CAP_AS4_RCV))
7725 json_object_string_add(json_cap, "4byteAs", "advertisedAndReceived");
7726 else if (CHECK_FLAG (p->cap, PEER_CAP_AS4_ADV))
7727 json_object_string_add(json_cap, "4byteAs", "advertised");
7728 else if (CHECK_FLAG (p->cap, PEER_CAP_AS4_RCV))
7729 json_object_string_add(json_cap, "4byteAs", "received");
7730 }
7731
7732 /* AddPath */
7733 if (CHECK_FLAG (p->cap, PEER_CAP_ADDPATH_RCV)
7734 || CHECK_FLAG (p->cap, PEER_CAP_ADDPATH_ADV))
7735 {
7736 json_object *json_add = NULL;
7737 const char *print_store;
718e3744 7738
856ca177 7739 json_add = json_object_new_object();
a82478b9 7740
856ca177
MS
7741 for (afi = AFI_IP ; afi < AFI_MAX ; afi++)
7742 for (safi = SAFI_UNICAST ; safi < SAFI_MAX ; safi++)
7743 {
7744 json_object *json_sub = NULL;
7745 json_sub = json_object_new_object();
7746 print_store = afi_safi_print (afi, safi);
7747
7748 if (CHECK_FLAG (p->af_cap[afi][safi], PEER_CAP_ADDPATH_AF_TX_ADV) ||
7749 CHECK_FLAG (p->af_cap[afi][safi], PEER_CAP_ADDPATH_AF_TX_RCV))
7750 {
7751 if (CHECK_FLAG (p->af_cap[afi][safi], PEER_CAP_ADDPATH_AF_TX_ADV) && CHECK_FLAG (p->af_cap[afi][safi], PEER_CAP_ADDPATH_AF_TX_RCV))
7752 json_object_boolean_true_add(json_sub, "txAdvertisedAndReceived");
7753 else if (CHECK_FLAG (p->af_cap[afi][safi], PEER_CAP_ADDPATH_AF_TX_ADV))
7754 json_object_boolean_true_add(json_sub, "txAdvertised");
7755 else if (CHECK_FLAG (p->af_cap[afi][safi], PEER_CAP_ADDPATH_AF_TX_RCV))
7756 json_object_boolean_true_add(json_sub, "txReceived");
7757 }
7758
7759 if (CHECK_FLAG (p->af_cap[afi][safi], PEER_CAP_ADDPATH_AF_RX_ADV) ||
7760 CHECK_FLAG (p->af_cap[afi][safi], PEER_CAP_ADDPATH_AF_RX_RCV))
7761 {
7762 if (CHECK_FLAG (p->af_cap[afi][safi], PEER_CAP_ADDPATH_AF_RX_ADV) && CHECK_FLAG (p->af_cap[afi][safi], PEER_CAP_ADDPATH_AF_RX_RCV))
7763 json_object_boolean_true_add(json_sub, "rxAdvertisedAndReceived");
7764 else if (CHECK_FLAG (p->af_cap[afi][safi], PEER_CAP_ADDPATH_AF_RX_ADV))
7765 json_object_boolean_true_add(json_sub, "rxAdvertised");
7766 else if (CHECK_FLAG (p->af_cap[afi][safi], PEER_CAP_ADDPATH_AF_RX_RCV))
7767 json_object_boolean_true_add(json_sub, "rxReceived");
7768 }
7769
7770 if (CHECK_FLAG (p->af_cap[afi][safi], PEER_CAP_ADDPATH_AF_TX_ADV) ||
7771 CHECK_FLAG (p->af_cap[afi][safi], PEER_CAP_ADDPATH_AF_TX_RCV) ||
7772 CHECK_FLAG (p->af_cap[afi][safi], PEER_CAP_ADDPATH_AF_RX_ADV) ||
7773 CHECK_FLAG (p->af_cap[afi][safi], PEER_CAP_ADDPATH_AF_RX_RCV))
7774 json_object_object_add(json_add, print_store, json_sub);
b6df4090
DS
7775 else
7776 json_object_free(json_sub);
856ca177 7777 }
a82478b9 7778
856ca177
MS
7779 json_object_object_add(json_cap, "addPath", json_add);
7780 }
7781
7782 /* Dynamic */
7783 if (CHECK_FLAG (p->cap, PEER_CAP_DYNAMIC_RCV)
7784 || CHECK_FLAG (p->cap, PEER_CAP_DYNAMIC_ADV))
7785 {
7786 if (CHECK_FLAG (p->cap, PEER_CAP_DYNAMIC_ADV) && CHECK_FLAG (p->cap, PEER_CAP_DYNAMIC_RCV))
7787 json_object_string_add(json_cap, "dynamic", "advertisedAndReceived");
7788 else if (CHECK_FLAG (p->cap, PEER_CAP_DYNAMIC_ADV))
7789 json_object_string_add(json_cap, "dynamic", "advertised");
7790 else if (CHECK_FLAG (p->cap, PEER_CAP_DYNAMIC_RCV))
7791 json_object_string_add(json_cap, "dynamic", "received");
7792 }
7793
7794 /* Extended nexthop */
7795 if (CHECK_FLAG (p->cap, PEER_CAP_ENHE_RCV)
7796 || CHECK_FLAG (p->cap, PEER_CAP_ENHE_ADV))
7797 {
7798 json_object *json_nxt = NULL;
7799 const char *print_store;
7800
856ca177
MS
7801
7802 if (CHECK_FLAG (p->cap, PEER_CAP_ENHE_ADV) && CHECK_FLAG (p->cap, PEER_CAP_ENHE_RCV))
7803 json_object_string_add(json_cap, "extendedNexthop", "advertisedAndReceived");
7804 else if (CHECK_FLAG (p->cap, PEER_CAP_ENHE_ADV))
7805 json_object_string_add(json_cap, "extendedNexthop", "advertised");
7806 else if (CHECK_FLAG (p->cap, PEER_CAP_ENHE_RCV))
7807 json_object_string_add(json_cap, "extendedNexthop", "received");
7808
7809 if (CHECK_FLAG (p->cap, PEER_CAP_ENHE_RCV))
7810 {
b6df4090
DS
7811 json_nxt = json_object_new_object();
7812
856ca177
MS
7813 for (safi = SAFI_UNICAST ; safi < SAFI_MAX ; safi++)
7814 {
7815 if (CHECK_FLAG (p->af_cap[AFI_IP][safi], PEER_CAP_ENHE_AF_RCV))
7816 {
7817 print_store = afi_safi_print (AFI_IP, safi);
7818 json_object_string_add(json_nxt, print_store, "recieved");
7819 }
7820 }
7821 json_object_object_add(json_cap, "extendedNexthopFamililesByPeer", json_nxt);
7822 }
7823 }
7824
7825 /* Route Refresh */
7826 if (CHECK_FLAG (p->cap, PEER_CAP_REFRESH_ADV)
7827 || CHECK_FLAG (p->cap, PEER_CAP_REFRESH_NEW_RCV)
7828 || CHECK_FLAG (p->cap, PEER_CAP_REFRESH_OLD_RCV))
7829 {
7830 if (CHECK_FLAG (p->cap, PEER_CAP_REFRESH_ADV) && (CHECK_FLAG (p->cap, PEER_CAP_REFRESH_NEW_RCV) || CHECK_FLAG (p->cap, PEER_CAP_REFRESH_OLD_RCV)))
7831 {
7832 if (CHECK_FLAG (p->cap, PEER_CAP_REFRESH_OLD_RCV) && CHECK_FLAG (p->cap, PEER_CAP_REFRESH_NEW_RCV))
7833 json_object_string_add(json_cap, "routeRefresh", "advertisedAndReceivedOldNew");
7834 else
7835 {
7836 if (CHECK_FLAG (p->cap, PEER_CAP_REFRESH_OLD_RCV))
7837 json_object_string_add(json_cap, "routeRefresh", "advertisedAndReceivedOld");
7838 else
7839 json_object_string_add(json_cap, "routeRefresh", "advertisedAndReceivedNew");
7840 }
7841 }
7842 else if (CHECK_FLAG (p->cap, PEER_CAP_REFRESH_ADV))
7843 json_object_string_add(json_cap, "routeRefresh", "advertised");
7844 else if (CHECK_FLAG (p->cap, PEER_CAP_REFRESH_NEW_RCV) || CHECK_FLAG (p->cap, PEER_CAP_REFRESH_OLD_RCV))
7845 json_object_string_add(json_cap, "routeRefresh", "received");
7846 }
7847
7848 /* Multiprotocol Extensions */
7849 json_object *json_multi = NULL;
7850 json_multi = json_object_new_object();
7851
7852 for (afi = AFI_IP ; afi < AFI_MAX ; afi++)
7853 {
7854 for (safi = SAFI_UNICAST ; safi < SAFI_MAX ; safi++)
7855 {
7856 if (p->afc_adv[afi][safi] || p->afc_recv[afi][safi])
7857 {
7858 json_object *json_exten = NULL;
7859 json_exten = json_object_new_object();
7860
7861 if (p->afc_adv[afi][safi] && p->afc_recv[afi][safi])
7862 json_object_boolean_true_add(json_exten, "advertisedAndReceived");
7863 else if (p->afc_adv[afi][safi])
7864 json_object_boolean_true_add(json_exten, "advertised");
7865 else if (p->afc_recv[afi][safi])
7866 json_object_boolean_true_add(json_exten, "received");
7867
7868 json_object_object_add(json_multi, afi_safi_print (afi, safi), json_exten);
7869 }
7870 }
7871 }
7872 json_object_object_add(json_cap, "multiprotocolExtensions", json_multi);
7873
7874 /* Gracefull Restart */
7875 if (CHECK_FLAG (p->cap, PEER_CAP_RESTART_RCV)
7876 || CHECK_FLAG (p->cap, PEER_CAP_RESTART_ADV))
7877 {
7878 if (CHECK_FLAG (p->cap, PEER_CAP_RESTART_ADV) && CHECK_FLAG (p->cap, PEER_CAP_RESTART_RCV))
7879 json_object_string_add(json_cap, "gracefulRestart", "advertisedAndReceived");
7880 else if (CHECK_FLAG (p->cap, PEER_CAP_RESTART_ADV))
7881 json_object_string_add(json_cap, "gracefulRestartCapability", "advertised");
7882 else if (CHECK_FLAG (p->cap, PEER_CAP_RESTART_RCV))
7883 json_object_string_add(json_cap, "gracefulRestartCapability", "received");
7884
7885 if (CHECK_FLAG (p->cap, PEER_CAP_RESTART_RCV))
7886 {
7887 int restart_af_count = 0;
7888 json_object *json_restart = NULL;
7889 json_restart = json_object_new_object();
7890
7891 json_object_int_add(json_cap, "gracefulRestartRemoteTimerMsecs", p->v_gr_restart * 1000);
7892
7893 for (afi = AFI_IP ; afi < AFI_MAX ; afi++)
7894 {
7895 for (safi = SAFI_UNICAST ; safi < SAFI_MAX ; safi++)
7896 {
7897 if (CHECK_FLAG (p->af_cap[afi][safi], PEER_CAP_RESTART_AF_RCV))
7898 {
7899 json_object *json_sub = NULL;
7900 json_sub = json_object_new_object();
7901
7902 if (CHECK_FLAG (p->af_cap[afi][safi], PEER_CAP_RESTART_AF_PRESERVE_RCV))
7903 json_object_boolean_true_add(json_sub, "preserved");
7904 restart_af_count++;
7905 json_object_object_add(json_restart, afi_safi_print (afi, safi), json_sub);
7906 }
7907 }
7908 }
7909 if (! restart_af_count)
b6df4090 7910 {
856ca177 7911 json_object_string_add(json_cap, "addressFamiliesByPeer", "none");
b6df4090
DS
7912 json_object_free(json_restart);
7913 }
856ca177
MS
7914 else
7915 json_object_object_add(json_cap, "addressFamiliesByPeer", json_restart);
7916 }
7917 }
7918 json_object_object_add(json_neigh, "neighborCapabilities", json_cap);
7919 }
7920 else
7921 {
7922 vty_out (vty, " Neighbor capabilities:%s", VTY_NEWLINE);
7923
7924 /* AS4 */
7925 if (CHECK_FLAG (p->cap, PEER_CAP_AS4_RCV)
7926 || CHECK_FLAG (p->cap, PEER_CAP_AS4_ADV))
7927 {
7928 vty_out (vty, " 4 Byte AS:");
7929 if (CHECK_FLAG (p->cap, PEER_CAP_AS4_ADV))
7930 vty_out (vty, " advertised");
7931 if (CHECK_FLAG (p->cap, PEER_CAP_AS4_RCV))
7932 vty_out (vty, " %sreceived",
7933 CHECK_FLAG (p->cap, PEER_CAP_AS4_ADV) ? "and " : "");
7934 vty_out (vty, "%s", VTY_NEWLINE);
7935 }
7936
7937 /* AddPath */
7938 if (CHECK_FLAG (p->cap, PEER_CAP_ADDPATH_RCV)
7939 || CHECK_FLAG (p->cap, PEER_CAP_ADDPATH_ADV))
7940 {
7941 vty_out (vty, " AddPath:%s", VTY_NEWLINE);
a82478b9 7942
856ca177
MS
7943 for (afi = AFI_IP ; afi < AFI_MAX ; afi++)
7944 for (safi = SAFI_UNICAST ; safi < SAFI_MAX ; safi++)
a82478b9 7945 {
856ca177
MS
7946 if (CHECK_FLAG (p->af_cap[afi][safi], PEER_CAP_ADDPATH_AF_TX_ADV) ||
7947 CHECK_FLAG (p->af_cap[afi][safi], PEER_CAP_ADDPATH_AF_TX_RCV))
7948 {
7949 vty_out (vty, " %s: TX ", afi_safi_print (afi, safi));
a82478b9 7950
856ca177
MS
7951 if (CHECK_FLAG (p->af_cap[afi][safi], PEER_CAP_ADDPATH_AF_TX_ADV))
7952 vty_out (vty, "advertised %s", afi_safi_print (afi, safi));
a82478b9 7953
856ca177
MS
7954 if (CHECK_FLAG (p->af_cap[afi][safi], PEER_CAP_ADDPATH_AF_TX_RCV))
7955 vty_out (vty, "%sreceived", CHECK_FLAG (p->af_cap[afi][safi], PEER_CAP_ADDPATH_AF_TX_ADV) ? " and " : "" );
a82478b9 7956
856ca177
MS
7957 vty_out (vty, "%s", VTY_NEWLINE);
7958 }
a82478b9 7959
856ca177 7960 if (CHECK_FLAG (p->af_cap[afi][safi], PEER_CAP_ADDPATH_AF_RX_ADV) ||
a82478b9 7961 CHECK_FLAG (p->af_cap[afi][safi], PEER_CAP_ADDPATH_AF_RX_RCV))
856ca177
MS
7962 {
7963 vty_out (vty, " %s: RX ", afi_safi_print (afi, safi));
a82478b9 7964
856ca177
MS
7965 if (CHECK_FLAG (p->af_cap[afi][safi], PEER_CAP_ADDPATH_AF_RX_ADV))
7966 vty_out (vty, "advertised %s", afi_safi_print (afi, safi));
a82478b9 7967
856ca177
MS
7968 if (CHECK_FLAG (p->af_cap[afi][safi], PEER_CAP_ADDPATH_AF_RX_RCV))
7969 vty_out (vty, "%sreceived", CHECK_FLAG (p->af_cap[afi][safi], PEER_CAP_ADDPATH_AF_RX_ADV) ? " and " : "" );
a82478b9 7970
856ca177
MS
7971 vty_out (vty, "%s", VTY_NEWLINE);
7972 }
a82478b9 7973 }
856ca177 7974 }
a82478b9 7975
856ca177
MS
7976 /* Dynamic */
7977 if (CHECK_FLAG (p->cap, PEER_CAP_DYNAMIC_RCV)
7978 || CHECK_FLAG (p->cap, PEER_CAP_DYNAMIC_ADV))
7979 {
7980 vty_out (vty, " Dynamic:");
7981 if (CHECK_FLAG (p->cap, PEER_CAP_DYNAMIC_ADV))
7982 vty_out (vty, " advertised");
7983 if (CHECK_FLAG (p->cap, PEER_CAP_DYNAMIC_RCV))
7984 vty_out (vty, " %sreceived",
7985 CHECK_FLAG (p->cap, PEER_CAP_DYNAMIC_ADV) ? "and " : "");
7986 vty_out (vty, "%s", VTY_NEWLINE);
7987 }
7988
7989 /* Extended nexthop */
7990 if (CHECK_FLAG (p->cap, PEER_CAP_ENHE_RCV)
7991 || CHECK_FLAG (p->cap, PEER_CAP_ENHE_ADV))
7992 {
7993 vty_out (vty, " Extended nexthop:");
7994 if (CHECK_FLAG (p->cap, PEER_CAP_ENHE_ADV))
7995 vty_out (vty, " advertised");
7996 if (CHECK_FLAG (p->cap, PEER_CAP_ENHE_RCV))
7997 vty_out (vty, " %sreceived",
7998 CHECK_FLAG (p->cap, PEER_CAP_ENHE_ADV) ? "and " : "");
7999 vty_out (vty, "%s", VTY_NEWLINE);
718e3744 8000
856ca177
MS
8001 if (CHECK_FLAG (p->cap, PEER_CAP_ENHE_RCV))
8002 {
8003 vty_out (vty, " Address families by peer:%s ", VTY_NEWLINE);
8004 for (safi = SAFI_UNICAST ; safi < SAFI_MAX ; safi++)
8005 if (CHECK_FLAG (p->af_cap[AFI_IP][safi], PEER_CAP_ENHE_AF_RCV))
8006 vty_out (vty, " %s%s",
8007 afi_safi_print (AFI_IP, safi), VTY_NEWLINE);
8008 }
8009 }
8a92a8a0 8010
856ca177
MS
8011 /* Route Refresh */
8012 if (CHECK_FLAG (p->cap, PEER_CAP_REFRESH_ADV)
8013 || CHECK_FLAG (p->cap, PEER_CAP_REFRESH_NEW_RCV)
8014 || CHECK_FLAG (p->cap, PEER_CAP_REFRESH_OLD_RCV))
8015 {
8016 vty_out (vty, " Route refresh:");
8017 if (CHECK_FLAG (p->cap, PEER_CAP_REFRESH_ADV))
8018 vty_out (vty, " advertised");
8019 if (CHECK_FLAG (p->cap, PEER_CAP_REFRESH_NEW_RCV)
8020 || CHECK_FLAG (p->cap, PEER_CAP_REFRESH_OLD_RCV))
8021 vty_out (vty, " %sreceived(%s)",
8022 CHECK_FLAG (p->cap, PEER_CAP_REFRESH_ADV) ? "and " : "",
8023 (CHECK_FLAG (p->cap, PEER_CAP_REFRESH_OLD_RCV)
8024 && CHECK_FLAG (p->cap, PEER_CAP_REFRESH_NEW_RCV)) ?
8025 "old & new" : CHECK_FLAG (p->cap, PEER_CAP_REFRESH_OLD_RCV) ? "old" : "new");
8a92a8a0 8026
856ca177
MS
8027 vty_out (vty, "%s", VTY_NEWLINE);
8028 }
718e3744 8029
856ca177
MS
8030 /* Multiprotocol Extensions */
8031 for (afi = AFI_IP ; afi < AFI_MAX ; afi++)
8032 for (safi = SAFI_UNICAST ; safi < SAFI_MAX ; safi++)
8033 if (p->afc_adv[afi][safi] || p->afc_recv[afi][safi])
8034 {
8c3deaae 8035 vty_out (vty, " Address Family %s:", afi_safi_print (afi, safi));
856ca177
MS
8036 if (p->afc_adv[afi][safi])
8037 vty_out (vty, " advertised");
8038 if (p->afc_recv[afi][safi])
8039 vty_out (vty, " %sreceived", p->afc_adv[afi][safi] ? "and " : "");
8040 vty_out (vty, "%s", VTY_NEWLINE);
8041 }
538621f2 8042
04b6bdc0
DW
8043 /* Hostname capability */
8044 if (CHECK_FLAG(p->cap, PEER_CAP_HOSTNAME_ADV) ||
8045 CHECK_FLAG(p->cap, PEER_CAP_HOSTNAME_RCV))
8046 {
8047 vty_out (vty, " Hostname Capability:");
8048 if (CHECK_FLAG (p->cap, PEER_CAP_HOSTNAME_ADV))
8049 vty_out (vty, " advertised");
8050 if (CHECK_FLAG (p->cap, PEER_CAP_HOSTNAME_RCV))
8051 vty_out (vty, " %sreceived",
8052 CHECK_FLAG (p->cap, PEER_CAP_HOSTNAME_ADV) ? "and " : "");
8053 vty_out (vty, "%s", VTY_NEWLINE);
8054 }
8055
856ca177
MS
8056 /* Gracefull Restart */
8057 if (CHECK_FLAG (p->cap, PEER_CAP_RESTART_RCV)
8058 || CHECK_FLAG (p->cap, PEER_CAP_RESTART_ADV))
8059 {
8060 vty_out (vty, " Graceful Restart Capabilty:");
8061 if (CHECK_FLAG (p->cap, PEER_CAP_RESTART_ADV))
538621f2 8062 vty_out (vty, " advertised");
856ca177
MS
8063 if (CHECK_FLAG (p->cap, PEER_CAP_RESTART_RCV))
8064 vty_out (vty, " %sreceived",
8065 CHECK_FLAG (p->cap, PEER_CAP_RESTART_ADV) ? "and " : "");
8066 vty_out (vty, "%s", VTY_NEWLINE);
538621f2 8067
856ca177
MS
8068 if (CHECK_FLAG (p->cap, PEER_CAP_RESTART_RCV))
8069 {
8070 int restart_af_count = 0;
8071
8072 vty_out (vty, " Remote Restart timer is %d seconds%s",
8073 p->v_gr_restart, VTY_NEWLINE);
8074 vty_out (vty, " Address families by peer:%s ", VTY_NEWLINE);
8075
8076 for (afi = AFI_IP ; afi < AFI_MAX ; afi++)
8077 for (safi = SAFI_UNICAST ; safi < SAFI_MAX ; safi++)
8078 if (CHECK_FLAG (p->af_cap[afi][safi], PEER_CAP_RESTART_AF_RCV))
8079 {
8080 vty_out (vty, "%s%s(%s)", restart_af_count ? ", " : "",
8081 afi_safi_print (afi, safi),
8082 CHECK_FLAG (p->af_cap[afi][safi], PEER_CAP_RESTART_AF_PRESERVE_RCV) ?
8083 "preserved" : "not preserved");
8084 restart_af_count++;
8085 }
8086 if (! restart_af_count)
8087 vty_out (vty, "none");
8088 vty_out (vty, "%s", VTY_NEWLINE);
8089 }
8090 }
8091 }
718e3744 8092 }
8093 }
8094
93406d87 8095 /* graceful restart information */
8096 if (CHECK_FLAG (p->cap, PEER_CAP_RESTART_RCV)
8097 || p->t_gr_restart
8098 || p->t_gr_stale)
8099 {
856ca177
MS
8100 json_object *json_grace = NULL;
8101 json_object *json_grace_send = NULL;
8102 json_object *json_grace_recv = NULL;
93406d87 8103 int eor_send_af_count = 0;
8104 int eor_receive_af_count = 0;
8105
856ca177
MS
8106 if (use_json)
8107 {
8108 json_grace = json_object_new_object();
8109 json_grace_send = json_object_new_object();
8110 json_grace_recv = json_object_new_object();
8111
8112 if (p->status == Established)
8113 {
8114 for (afi = AFI_IP ; afi < AFI_MAX ; afi++)
8115 {
8116 for (safi = SAFI_UNICAST ; safi < SAFI_MAX ; safi++)
8117 {
8118 if (CHECK_FLAG (p->af_sflags[afi][safi], PEER_STATUS_EOR_SEND))
8119 {
8120 json_object_boolean_true_add(json_grace_send, afi_safi_print (afi, safi));
8121 eor_send_af_count++;
8122 }
8123 }
8124 }
8125 for (afi = AFI_IP ; afi < AFI_MAX ; afi++)
8126 {
8127 for (safi = SAFI_UNICAST ; safi < SAFI_MAX ; safi++)
8128 {
8129 if (CHECK_FLAG (p->af_sflags[afi][safi], PEER_STATUS_EOR_RECEIVED))
8130 {
8131 json_object_boolean_true_add(json_grace_recv, afi_safi_print (afi, safi));
8132 eor_receive_af_count++;
8133 }
8134 }
8135 }
8136 }
8137
8138 json_object_object_add(json_grace, "endOfRibSend", json_grace_send);
8139 json_object_object_add(json_grace, "endOfRibRecv", json_grace_recv);
8140
8141 if (p->t_gr_restart)
8142 json_object_int_add(json_grace, "gracefulRestartTimerMsecs", thread_timer_remain_second (p->t_gr_restart) * 1000);
8143
8144 if (p->t_gr_stale)
8145 json_object_int_add(json_grace, "gracefulStalepathTimerMsecs", thread_timer_remain_second (p->t_gr_stale) * 1000);
8146
8147 json_object_object_add(json_neigh, "gracefulRestartInfo", json_grace);
8148 }
8149 else
8150 {
8151 vty_out (vty, " Graceful restart informations:%s", VTY_NEWLINE);
8152 if (p->status == Established)
8153 {
8154 vty_out (vty, " End-of-RIB send: ");
8155 for (afi = AFI_IP ; afi < AFI_MAX ; afi++)
8156 {
8157 for (safi = SAFI_UNICAST ; safi < SAFI_MAX ; safi++)
8158 {
8159 if (CHECK_FLAG (p->af_sflags[afi][safi], PEER_STATUS_EOR_SEND))
8160 {
8161 vty_out (vty, "%s%s", eor_send_af_count ? ", " : "",
8162 afi_safi_print (afi, safi));
8163 eor_send_af_count++;
8164 }
8165 }
8166 }
8167 vty_out (vty, "%s", VTY_NEWLINE);
8168 vty_out (vty, " End-of-RIB received: ");
8169 for (afi = AFI_IP ; afi < AFI_MAX ; afi++)
8170 {
8171 for (safi = SAFI_UNICAST ; safi < SAFI_MAX ; safi++)
8172 {
8173 if (CHECK_FLAG (p->af_sflags[afi][safi], PEER_STATUS_EOR_RECEIVED))
8174 {
8175 vty_out (vty, "%s%s", eor_receive_af_count ? ", " : "",
8176 afi_safi_print (afi, safi));
8177 eor_receive_af_count++;
8178 }
8179 }
8180 }
8181 vty_out (vty, "%s", VTY_NEWLINE);
8182 }
93406d87 8183
856ca177
MS
8184 if (p->t_gr_restart)
8185 vty_out (vty, " The remaining time of restart timer is %ld%s",
8186 thread_timer_remain_second (p->t_gr_restart), VTY_NEWLINE);
e52702f2 8187
856ca177
MS
8188 if (p->t_gr_stale)
8189 vty_out (vty, " The remaining time of stalepath timer is %ld%s",
8190 thread_timer_remain_second (p->t_gr_stale), VTY_NEWLINE);
8191 }
8192 }
8193 if (use_json)
8194 {
8195 json_object *json_stat = NULL;
8196 json_stat = json_object_new_object();
8197 /* Packet counts. */
8198 json_object_int_add(json_stat, "depthInq", 0);
8199 json_object_int_add(json_stat, "depthOutq", (unsigned long) p->obuf->count);
8200 json_object_int_add(json_stat, "opensSent", p->open_out);
8201 json_object_int_add(json_stat, "opensRecv", p->open_in);
8202 json_object_int_add(json_stat, "notificationsSent", p->notify_out);
8203 json_object_int_add(json_stat, "notificationsRecv", p->notify_in);
8204 json_object_int_add(json_stat, "updatesSent", p->update_out);
8205 json_object_int_add(json_stat, "updatesRecv", p->update_in);
8206 json_object_int_add(json_stat, "keepalivesSent", p->keepalive_out);
8207 json_object_int_add(json_stat, "keepalivesRecv", p->keepalive_in);
8208 json_object_int_add(json_stat, "routeRefreshSent", p->refresh_out);
8209 json_object_int_add(json_stat, "routeRefreshRecv", p->refresh_in);
8210 json_object_int_add(json_stat, "capabilitySent", p->dynamic_cap_out);
8211 json_object_int_add(json_stat, "capabilityRecv", p->dynamic_cap_in);
8212 json_object_int_add(json_stat, "totalSent", p->open_out + p->notify_out + p->update_out + p->keepalive_out + p->refresh_out + p->dynamic_cap_out);
8213 json_object_int_add(json_stat, "totalRecv", p->open_in + p->notify_in + p->update_in + p->keepalive_in + p->refresh_in + p->dynamic_cap_in);
8214 json_object_object_add(json_neigh, "messageStats", json_stat);
8215 }
8216 else
8217 {
8218 /* Packet counts. */
8219 vty_out (vty, " Message statistics:%s", VTY_NEWLINE);
8220 vty_out (vty, " Inq depth is 0%s", VTY_NEWLINE);
8221 vty_out (vty, " Outq depth is %lu%s", (unsigned long) p->obuf->count, VTY_NEWLINE);
8222 vty_out (vty, " Sent Rcvd%s", VTY_NEWLINE);
8223 vty_out (vty, " Opens: %10d %10d%s", p->open_out, p->open_in, VTY_NEWLINE);
8224 vty_out (vty, " Notifications: %10d %10d%s", p->notify_out, p->notify_in, VTY_NEWLINE);
8225 vty_out (vty, " Updates: %10d %10d%s", p->update_out, p->update_in, VTY_NEWLINE);
8226 vty_out (vty, " Keepalives: %10d %10d%s", p->keepalive_out, p->keepalive_in, VTY_NEWLINE);
8227 vty_out (vty, " Route Refresh: %10d %10d%s", p->refresh_out, p->refresh_in, VTY_NEWLINE);
8228 vty_out (vty, " Capability: %10d %10d%s", p->dynamic_cap_out, p->dynamic_cap_in, VTY_NEWLINE);
8229 vty_out (vty, " Total: %10d %10d%s", p->open_out + p->notify_out +
8230 p->update_out + p->keepalive_out + p->refresh_out + p->dynamic_cap_out,
8231 p->open_in + p->notify_in + p->update_in + p->keepalive_in + p->refresh_in +
8232 p->dynamic_cap_in, VTY_NEWLINE);
718e3744 8233 }
8234
856ca177
MS
8235 if (use_json)
8236 {
8237 /* advertisement-interval */
8238 json_object_int_add(json_neigh, "minBtwnAdvertisementRunsTimerMsecs", p->v_routeadv * 1000);
718e3744 8239
856ca177
MS
8240 /* Update-source. */
8241 if (p->update_if || p->update_source)
8242 {
8243 if (p->update_if)
8244 json_object_string_add(json_neigh, "updateSource", p->update_if);
8245 else if (p->update_source)
8246 json_object_string_add(json_neigh, "updateSource", sockunion2str (p->update_source, buf1, SU_ADDRSTRLEN));
8247 }
856ca177
MS
8248 }
8249 else
8250 {
8251 /* advertisement-interval */
8252 vty_out (vty, " Minimum time between advertisement runs is %d seconds%s",
8253 p->v_routeadv, VTY_NEWLINE);
8254
8255 /* Update-source. */
8256 if (p->update_if || p->update_source)
8257 {
8258 vty_out (vty, " Update source is ");
8259 if (p->update_if)
8260 vty_out (vty, "%s", p->update_if);
8261 else if (p->update_source)
8262 vty_out (vty, "%s", sockunion2str (p->update_source, buf1, SU_ADDRSTRLEN));
8263 vty_out (vty, "%s", VTY_NEWLINE);
8264 }
8265
856ca177
MS
8266 vty_out (vty, "%s", VTY_NEWLINE);
8267 }
718e3744 8268
8269 /* Address Family Information */
856ca177
MS
8270 json_object *json_hold = NULL;
8271
8272 if (use_json)
8273 json_hold = json_object_new_object();
8274
538621f2 8275 for (afi = AFI_IP ; afi < AFI_MAX ; afi++)
8276 for (safi = SAFI_UNICAST ; safi < SAFI_MAX ; safi++)
8277 if (p->afc[afi][safi])
856ca177 8278 bgp_show_peer_afi (vty, p, afi, safi, use_json, json_hold);
718e3744 8279
856ca177
MS
8280 if (use_json)
8281 {
58433ae6 8282 json_object_object_add(json_neigh, "addressFamilyInfo", json_hold);
e08ac8b7
DW
8283 json_object_int_add(json_neigh, "connectionsEstablished", p->established);
8284 json_object_int_add(json_neigh, "connectionsDropped", p->dropped);
856ca177
MS
8285 }
8286 else
8287 vty_out (vty, " Connections established %d; dropped %d%s", p->established, p->dropped,
8288 VTY_NEWLINE);
718e3744 8289
d6661008 8290 if (! p->last_reset)
856ca177
MS
8291 {
8292 if (use_json)
e08ac8b7 8293 json_object_string_add(json_neigh, "lastReset", "never");
856ca177
MS
8294 else
8295 vty_out (vty, " Last reset never%s", VTY_NEWLINE);
8296 }
e0701b79 8297 else
d6661008 8298 {
856ca177
MS
8299 if (use_json)
8300 {
8301 time_t uptime;
8302 struct tm *tm;
8303
8304 uptime = bgp_clock();
8305 uptime -= p->resettime;
8306 tm = gmtime(&uptime);
e08ac8b7
DW
8307 json_object_int_add(json_neigh, "lastResetTimerMsecs", (tm->tm_sec * 1000) + (tm->tm_min * 60000) + (tm->tm_hour * 3600000));
8308 json_object_string_add(json_neigh, "lastResetDueTo", peer_down_str[(int) p->last_reset]);
cca1dda8
DD
8309 if (p->last_reset == PEER_DOWN_NOTIFY_SEND ||
8310 p->last_reset == PEER_DOWN_NOTIFY_RECEIVED)
856ca177 8311 {
39e871e6 8312 char errorcodesubcode_hexstr[5];
cca1dda8
DD
8313 char errorcodesubcode_str[256];
8314
8315 code_str = bgp_notify_code_str(p->notify.code);
8316 subcode_str = bgp_notify_subcode_str(p->notify.code, p->notify.subcode);
8317
39e871e6 8318 sprintf(errorcodesubcode_hexstr, "%02X%02X", p->notify.code, p->notify.subcode);
e08ac8b7 8319 json_object_string_add(json_neigh, "lastErrorCodeSubcode", errorcodesubcode_hexstr);
cca1dda8
DD
8320 snprintf(errorcodesubcode_str, 255, "%s%s", code_str, subcode_str);
8321 json_object_string_add(json_neigh, "lastNotificationReason", errorcodesubcode_str);
652b9429
DS
8322 if (p->last_reset == PEER_DOWN_NOTIFY_RECEIVED
8323 && p->notify.code == BGP_NOTIFY_CEASE
8324 && (p->notify.subcode == BGP_NOTIFY_CEASE_ADMIN_SHUTDOWN
8325 || p->notify.subcode == BGP_NOTIFY_CEASE_ADMIN_RESET)
8326 && p->notify.length)
8327 {
8328 char msgbuf[1024];
8329 const char *msg_str;
8330
8331 msg_str = bgp_notify_admin_message(msgbuf, sizeof(msgbuf),
8332 (u_char*)p->notify.data, p->notify.length);
8333 if (msg_str)
8334 json_object_string_add(json_neigh, "lastShutdownDescription", msg_str);
8335 }
856ca177
MS
8336 }
8337 }
8338 else
d6661008 8339 {
3a8c7ba1
DW
8340 vty_out (vty, " Last reset %s, ",
8341 peer_uptime (p->resettime, timebuf, BGP_UPTIME_LEN, 0, NULL));
8342
8343 if (p->last_reset == PEER_DOWN_NOTIFY_SEND ||
8344 p->last_reset == PEER_DOWN_NOTIFY_RECEIVED)
8345 {
8346 code_str = bgp_notify_code_str(p->notify.code);
8347 subcode_str = bgp_notify_subcode_str(p->notify.code, p->notify.subcode);
8348 vty_out (vty, "due to NOTIFICATION %s (%s%s)%s",
8349 p->last_reset == PEER_DOWN_NOTIFY_SEND ? "sent" : "received",
8350 code_str, subcode_str, VTY_NEWLINE);
38de8d02
DL
8351 if (p->last_reset == PEER_DOWN_NOTIFY_RECEIVED
8352 && p->notify.code == BGP_NOTIFY_CEASE
8353 && (p->notify.subcode == BGP_NOTIFY_CEASE_ADMIN_SHUTDOWN
8354 || p->notify.subcode == BGP_NOTIFY_CEASE_ADMIN_RESET)
8355 && p->notify.length)
8356 {
8357 char msgbuf[1024];
8358 const char *msg_str;
8359
8360 msg_str = bgp_notify_admin_message(msgbuf, sizeof(msgbuf),
8361 (u_char*)p->notify.data, p->notify.length);
8362 if (msg_str)
8363 vty_out (vty, " Message: \"%s\"%s", msg_str, VTY_NEWLINE);
8364 }
3a8c7ba1
DW
8365 }
8366 else
8367 {
8368 vty_out (vty, "due to %s%s",
8369 peer_down_str[(int) p->last_reset], VTY_NEWLINE);
8370 }
856ca177
MS
8371
8372 if (p->last_reset_cause_size)
d6661008 8373 {
856ca177
MS
8374 msg = p->last_reset_cause;
8375 vty_out(vty, " Message received that caused BGP to send a NOTIFICATION:%s ", VTY_NEWLINE);
8376 for (i = 1; i <= p->last_reset_cause_size; i++)
8377 {
8378 vty_out(vty, "%02X", *msg++);
d6661008 8379
856ca177
MS
8380 if (i != p->last_reset_cause_size)
8381 {
8382 if (i % 16 == 0)
8383 {
8384 vty_out(vty, "%s ", VTY_NEWLINE);
8385 }
8386 else if (i % 4 == 0)
8387 {
8388 vty_out(vty, " ");
8389 }
8390 }
8391 }
8392 vty_out(vty, "%s", VTY_NEWLINE);
d6661008 8393 }
d6661008
DS
8394 }
8395 }
848973c7 8396
718e3744 8397 if (CHECK_FLAG (p->sflags, PEER_STATUS_PREFIX_OVERFLOW))
8398 {
856ca177 8399 if (use_json)
e08ac8b7 8400 json_object_boolean_true_add(json_neigh, "prefixesConfigExceedMax");
856ca177
MS
8401 else
8402 vty_out (vty, " Peer had exceeded the max. no. of prefixes configured.%s", VTY_NEWLINE);
0a486e5f 8403
8404 if (p->t_pmax_restart)
856ca177
MS
8405 {
8406 if (use_json)
8407 {
e08ac8b7
DW
8408 json_object_boolean_true_add(json_neigh, "reducePrefixNumFrom");
8409 json_object_int_add(json_neigh, "restartInTimerMsec", thread_timer_remain_second (p->t_pmax_restart) * 1000);
856ca177
MS
8410 }
8411 else
8412 vty_out (vty, " Reduce the no. of prefix from %s, will restart in %ld seconds%s",
8413 p->host, thread_timer_remain_second (p->t_pmax_restart),
8414 VTY_NEWLINE);
8415 }
0a486e5f 8416 else
856ca177
MS
8417 {
8418 if (use_json)
e08ac8b7 8419 json_object_boolean_true_add(json_neigh, "reducePrefixNumAndClearIpBgp");
856ca177
MS
8420 else
8421 vty_out (vty, " Reduce the no. of prefix and clear ip bgp %s to restore peering%s",
8422 p->host, VTY_NEWLINE);
8423 }
718e3744 8424 }
8425
f5a4827d 8426 /* EBGP Multihop and GTSM */
6d85b15b 8427 if (p->sort != BGP_PEER_IBGP)
f5a4827d 8428 {
856ca177
MS
8429 if (use_json)
8430 {
8431 if (p->gtsm_hops > 0)
8432 json_object_int_add(json_neigh, "externalBgpNbrMaxHopsAway", p->gtsm_hops);
8433 else if (p->ttl > 1)
8434 json_object_int_add(json_neigh, "externalBgpNbrMaxHopsAway", p->ttl);
8435 }
8436 else
8437 {
8438 if (p->gtsm_hops > 0)
8439 vty_out (vty, " External BGP neighbor may be up to %d hops away.%s",
8440 p->gtsm_hops, VTY_NEWLINE);
8441 else if (p->ttl > 1)
8442 vty_out (vty, " External BGP neighbor may be up to %d hops away.%s",
8443 p->ttl, VTY_NEWLINE);
8444 }
f5a4827d 8445 }
5d804b43
PM
8446 else
8447 {
8448 if (p->gtsm_hops > 0)
856ca177
MS
8449 {
8450 if (use_json)
8451 json_object_int_add(json_neigh, "internalBgpNbrMaxHopsAway", p->gtsm_hops);
8452 else
8453 vty_out (vty, " Internal BGP neighbor may be up to %d hops away.%s",
8454 p->gtsm_hops, VTY_NEWLINE);
8455 }
5d804b43 8456 }
718e3744 8457
8458 /* Local address. */
8459 if (p->su_local)
8460 {
856ca177
MS
8461 if (use_json)
8462 {
8463 json_object_string_add(json_neigh, "hostLocal", sockunion2str (p->su_local, buf1, SU_ADDRSTRLEN));
8464 json_object_int_add(json_neigh, "portLocal", ntohs (p->su_local->sin.sin_port));
8465 }
8466 else
8467 vty_out (vty, "Local host: %s, Local port: %d%s",
8468 sockunion2str (p->su_local, buf1, SU_ADDRSTRLEN),
8469 ntohs (p->su_local->sin.sin_port),
8470 VTY_NEWLINE);
718e3744 8471 }
e52702f2 8472
718e3744 8473 /* Remote address. */
8474 if (p->su_remote)
8475 {
856ca177
MS
8476 if (use_json)
8477 {
8478 json_object_string_add(json_neigh, "hostForeign", sockunion2str (p->su_remote, buf1, SU_ADDRSTRLEN));
8479 json_object_int_add(json_neigh, "portForeign", ntohs (p->su_remote->sin.sin_port));
8480 }
8481 else
8482 vty_out (vty, "Foreign host: %s, Foreign port: %d%s",
718e3744 8483 sockunion2str (p->su_remote, buf1, SU_ADDRSTRLEN),
8484 ntohs (p->su_remote->sin.sin_port),
8485 VTY_NEWLINE);
8486 }
8487
8488 /* Nexthop display. */
8489 if (p->su_local)
8490 {
856ca177
MS
8491 if (use_json)
8492 {
389e3fe0 8493 json_object_string_add(json_neigh, "nexthop",
44b8cd53 8494 inet_ntop (AF_INET, &p->nexthop.v4, buf1, sizeof(buf1)));
389e3fe0 8495 json_object_string_add(json_neigh, "nexthopGlobal",
44b8cd53 8496 inet_ntop (AF_INET6, &p->nexthop.v6_global, buf1, sizeof(buf1)));
389e3fe0 8497 json_object_string_add(json_neigh, "nexthopLocal",
44b8cd53 8498 inet_ntop (AF_INET6, &p->nexthop.v6_local, buf1, sizeof(buf1)));
856ca177
MS
8499 if (p->shared_network)
8500 json_object_string_add(json_neigh, "bgpConnection", "sharedNetwork");
8501 else
8502 json_object_string_add(json_neigh, "bgpConnection", "nonSharedNetwork");
856ca177
MS
8503 }
8504 else
8505 {
8506 vty_out (vty, "Nexthop: %s%s",
44b8cd53
DL
8507 inet_ntop (AF_INET, &p->nexthop.v4, buf1, sizeof(buf1)),
8508 VTY_NEWLINE);
856ca177 8509 vty_out (vty, "Nexthop global: %s%s",
44b8cd53
DL
8510 inet_ntop (AF_INET6, &p->nexthop.v6_global, buf1, sizeof(buf1)),
8511 VTY_NEWLINE);
856ca177 8512 vty_out (vty, "Nexthop local: %s%s",
44b8cd53
DL
8513 inet_ntop (AF_INET6, &p->nexthop.v6_local, buf1, sizeof(buf1)),
8514 VTY_NEWLINE);
856ca177 8515 vty_out (vty, "BGP connection: %s%s",
44b8cd53
DL
8516 p->shared_network ? "shared network" : "non shared network",
8517 VTY_NEWLINE);
856ca177 8518 }
718e3744 8519 }
8520
8521 /* Timer information. */
856ca177
MS
8522 if (use_json)
8523 {
39e871e6 8524 json_object_int_add(json_neigh, "connectRetryTimer", p->v_connect);
dd9275d6
ST
8525 if (p->status == Established && p->rtt)
8526 json_object_int_add(json_neigh, "estimatedRttInMsecs", p->rtt);
856ca177
MS
8527 if (p->t_start)
8528 json_object_int_add(json_neigh, "nextStartTimerDueInMsecs", thread_timer_remain_second (p->t_start) * 1000);
8529 if (p->t_connect)
8530 json_object_int_add(json_neigh, "nextConnectTimerDueInMsecs", thread_timer_remain_second (p->t_connect) * 1000);
8531 if (p->t_routeadv)
8532 {
8533 json_object_int_add(json_neigh, "mraiInterval", p->v_routeadv);
8534 json_object_int_add(json_neigh, "mraiTimerExpireInMsecs", thread_timer_remain_second (p->t_routeadv) * 1000);
8535 }
cb1faec9 8536
856ca177
MS
8537 if (p->t_read)
8538 json_object_string_add(json_neigh, "readThread", "on");
8539 else
8540 json_object_string_add(json_neigh, "readThread", "off");
8541 if (p->t_write)
8542 json_object_string_add(json_neigh, "writeThread", "on");
8543 else
8544 json_object_string_add(json_neigh, "writeThread", "off");
8545 }
8546 else
8547 {
39e871e6
ST
8548 vty_out (vty, "BGP Connect Retry Timer in Seconds: %d%s",
8549 p->v_connect, VTY_NEWLINE);
dd9275d6
ST
8550 if (p->status == Established && p->rtt)
8551 vty_out (vty, "Estimated round trip time: %d ms%s",
8552 p->rtt, VTY_NEWLINE);
856ca177
MS
8553 if (p->t_start)
8554 vty_out (vty, "Next start timer due in %ld seconds%s",
8555 thread_timer_remain_second (p->t_start), VTY_NEWLINE);
8556 if (p->t_connect)
8557 vty_out (vty, "Next connect timer due in %ld seconds%s",
8558 thread_timer_remain_second (p->t_connect), VTY_NEWLINE);
8559 if (p->t_routeadv)
8560 vty_out (vty, "MRAI (interval %u) timer expires in %ld seconds%s",
8561 p->v_routeadv, thread_timer_remain_second (p->t_routeadv),
8562 VTY_NEWLINE);
8563
8564 vty_out (vty, "Read thread: %s Write thread: %s%s",
8565 p->t_read ? "on" : "off",
8566 p->t_write ? "on" : "off",
8567 VTY_NEWLINE);
8568 }
718e3744 8569
8570 if (p->notify.code == BGP_NOTIFY_OPEN_ERR
8571 && p->notify.subcode == BGP_NOTIFY_OPEN_UNSUP_CAPBL)
856ca177
MS
8572 bgp_capability_vty_out (vty, p, use_json, json_neigh);
8573
8574 if (!use_json)
8575 vty_out (vty, "%s", VTY_NEWLINE);
c43ed2e4
DS
8576
8577 /* BFD information. */
856ca177
MS
8578 bgp_bfd_show_info(vty, p, use_json, json_neigh);
8579
8580 if (use_json)
8581 {
8582 if (p->conf_if) /* Configured interface name. */
8583 json_object_object_add(json, p->conf_if, json_neigh);
8584 else /* Configured IP address. */
8585 json_object_object_add(json, p->host, json_neigh);
8586 }
718e3744 8587}
8588
94f2b392 8589static int
856ca177
MS
8590bgp_show_neighbor (struct vty *vty, struct bgp *bgp, enum show_type type,
8591 union sockunion *su, const char *conf_if, u_char use_json, json_object *json)
718e3744 8592{
1eb8ef25 8593 struct listnode *node, *nnode;
718e3744 8594 struct peer *peer;
8595 int find = 0;
8596
1eb8ef25 8597 for (ALL_LIST_ELEMENTS (bgp->peer, node, nnode, peer))
718e3744 8598 {
1ff9a340
DS
8599 if (!CHECK_FLAG(peer->flags, PEER_FLAG_CONFIG_NODE))
8600 continue;
8601
718e3744 8602 switch (type)
856ca177
MS
8603 {
8604 case show_all:
e8f7da3a 8605 bgp_show_peer (vty, peer, use_json, json);
856ca177
MS
8606 break;
8607 case show_peer:
8608 if (conf_if)
8609 {
4873b3b9
DW
8610 if ((peer->conf_if && !strcmp(peer->conf_if, conf_if)) ||
8611 (peer->hostname && !strcmp(peer->hostname, conf_if)))
856ca177
MS
8612 {
8613 find = 1;
e8f7da3a 8614 bgp_show_peer (vty, peer, use_json, json);
856ca177
MS
8615 }
8616 }
8617 else
8618 {
8619 if (sockunion_same (&peer->su, su))
8620 {
8621 find = 1;
e8f7da3a 8622 bgp_show_peer (vty, peer, use_json, json);
856ca177
MS
8623 }
8624 }
8625 break;
718e3744 8626 }
8627 }
8628
8629 if (type == show_peer && ! find)
856ca177
MS
8630 {
8631 if (use_json)
8632 json_object_boolean_true_add(json, "bgpNoSuchNeighbor");
8633 else
8634 vty_out (vty, "%% No such neighbor%s", VTY_NEWLINE);
8635 }
8636
8637 if (use_json)
8638 {
2aac5767 8639 vty_out (vty, "%s%s", json_object_to_json_string_ext(json, JSON_C_TO_STRING_PRETTY), VTY_NEWLINE);
856ca177
MS
8640 json_object_free(json);
8641 }
8642 else
8643 {
8644 vty_out (vty, "%s", VTY_NEWLINE);
8645 }
8646
718e3744 8647 return CMD_SUCCESS;
8648}
8649
f186de26 8650static void
8651bgp_show_all_instances_neighbors_vty (struct vty *vty, u_char use_json)
8652{
8653 struct listnode *node, *nnode;
8654 struct bgp *bgp;
8655 json_object *json = NULL;
9f689658
DD
8656 int is_first = 1;
8657
8658 if (use_json)
8659 vty_out (vty, "{%s", VTY_NEWLINE);
f186de26 8660
8661 for (ALL_LIST_ELEMENTS (bm->bgp, node, nnode, bgp))
8662 {
f186de26 8663 if (use_json)
9f689658
DD
8664 {
8665 if (!(json = json_object_new_object()))
8666 {
8667 zlog_err("Unable to allocate memory for JSON object");
8668 vty_out (vty,
8669 "{\"error\": {\"message:\": \"Unable to allocate memory for JSON object\"}}}%s",
8670 VTY_NEWLINE);
8671 return;
8672 }
8673
8674 json_object_int_add(json, "vrfId",
8675 (bgp->vrf_id == VRF_UNKNOWN)
8676 ? -1 : bgp->vrf_id);
8677 json_object_string_add(json, "vrfName",
8678 (bgp->inst_type == BGP_INSTANCE_TYPE_DEFAULT)
8679 ? "Default" : bgp->name);
8680
8681 if (! is_first)
8682 vty_out (vty, ",%s", VTY_NEWLINE);
8683 else
8684 is_first = 0;
8685
8686 vty_out(vty, "\"%s\":", (bgp->inst_type == BGP_INSTANCE_TYPE_DEFAULT)
8687 ? "Default" : bgp->name);
8688 }
8689 else
8690 {
8691 vty_out (vty, "%sInstance %s:%s",
8692 VTY_NEWLINE,
8693 (bgp->inst_type == BGP_INSTANCE_TYPE_DEFAULT)
8694 ? "Default" : bgp->name,
8695 VTY_NEWLINE);
8696 }
f186de26 8697 bgp_show_neighbor (vty, bgp, show_all, NULL, NULL, use_json, json);
8698 }
9f689658
DD
8699
8700 if (use_json)
8701 vty_out (vty, "}%s", VTY_NEWLINE);
f186de26 8702}
8703
4fb25c53
DW
8704static int
8705bgp_show_neighbor_vty (struct vty *vty, const char *name,
8706 enum show_type type, const char *ip_str, u_char use_json)
8707{
8708 int ret;
8709 struct bgp *bgp;
8710 union sockunion su;
8711 json_object *json = NULL;
8712
8713 if (use_json)
8714 json = json_object_new_object();
8715
8716 if (name)
8717 {
8718 if (strmatch(name, "all"))
8719 {
8720 bgp_show_all_instances_neighbors_vty (vty, use_json);
8721 return CMD_SUCCESS;
8722 }
8723 else
8724 {
8725 bgp = bgp_lookup_by_name (name);
8726 if (! bgp)
8727 {
8728 if (use_json)
8729 {
8730 json_object_boolean_true_add(json, "bgpNoSuchInstance");
e52702f2 8731 vty_out (vty, "%s%s", json_object_to_json_string_ext(json, JSON_C_TO_STRING_PRETTY), VTY_NEWLINE);
4fb25c53
DW
8732 json_object_free(json);
8733 }
8734 else
8735 vty_out (vty, "%% No such BGP instance exist%s", VTY_NEWLINE);
8736
8737 return CMD_WARNING;
8738 }
8739 }
8740 }
8741 else
8742 {
8743 bgp = bgp_get_default ();
8744 }
8745
8746 if (bgp)
8747 {
8748 if (ip_str)
8749 {
8750 ret = str2sockunion (ip_str, &su);
8751 if (ret < 0)
8752 bgp_show_neighbor (vty, bgp, type, NULL, ip_str, use_json, json);
8753 else
8754 bgp_show_neighbor (vty, bgp, type, &su, NULL, use_json, json);
8755 }
8756 else
8757 {
8758 bgp_show_neighbor (vty, bgp, type, NULL, NULL, use_json, json);
8759 }
8760 }
8761
8762 return CMD_SUCCESS;
8763}
8764
716b2d8a 8765/* "show [ip] bgp neighbors" commands. */
718e3744 8766DEFUN (show_ip_bgp_neighbors,
8767 show_ip_bgp_neighbors_cmd,
91d37724 8768 "show [ip] bgp [<view|vrf> WORD] [<ipv4|ipv6|vpnv4 <all|rd ASN:nn_or_IP-address:nn>>] neighbors [<A.B.C.D|X:X::X:X|WORD>] [json]",
718e3744 8769 SHOW_STR
8770 IP_STR
8771 BGP_STR
f2a8972b 8772 BGP_INSTANCE_HELP_STR
8c3deaae
QY
8773 "Address Family\n"
8774 "Address Family\n"
91d37724
QY
8775 "Address Family\n"
8776 "Display information about all VPNv4 NLRIs\n"
8777 "Display information for a route distinguisher\n"
8778 "VPN Route Distinguisher\n"
718e3744 8779 "Detailed information on TCP and BGP neighbor connections\n"
8780 "Neighbor to display information about\n"
a80beece 8781 "Neighbor to display information about\n"
91d37724 8782 "Neighbor on BGP configured interface\n"
9973d184 8783 JSON_STR)
718e3744 8784{
5bf15956
DW
8785 char *vrf = NULL;
8786 char *sh_arg = NULL;
8787 enum show_type sh_type;
718e3744 8788
5bf15956 8789 u_char uj = use_json(argc, argv);
718e3744 8790
630a298c 8791 int idx = 0;
718e3744 8792
630a298c
QY
8793 if (argv_find (argv, argc, "WORD", &idx))
8794 vrf = argv[idx]->arg;
718e3744 8795
91d37724
QY
8796 if (argv_find (argv, argc, "A.B.C.D", &idx) ||
8797 argv_find (argv, argc, "X:X::X:X", &idx) ||
630a298c
QY
8798 argv_find (argv, argc, "WORD", &idx))
8799 {
8800 sh_type = show_peer;
8801 sh_arg = argv[idx]->arg;
8802 }
5bf15956 8803 else
630a298c 8804 sh_type = show_all;
856ca177 8805
5bf15956 8806 return bgp_show_neighbor_vty (vty, vrf, sh_type, sh_arg, uj);
718e3744 8807}
8808
716b2d8a 8809/* Show BGP's AS paths internal data. There are both `show [ip] bgp
718e3744 8810 paths' and `show ip mbgp paths'. Those functions results are the
8811 same.*/
f412b39a 8812DEFUN (show_ip_bgp_paths,
718e3744 8813 show_ip_bgp_paths_cmd,
46f296b4 8814 "show [ip] bgp ["BGP_SAFI_CMD_STR"] paths",
718e3744 8815 SHOW_STR
8816 IP_STR
8817 BGP_STR
46f296b4 8818 BGP_SAFI_HELP_STR
718e3744 8819 "Path information\n")
8820{
8821 vty_out (vty, "Address Refcnt Path%s", VTY_NEWLINE);
8822 aspath_print_all_vty (vty);
8823 return CMD_SUCCESS;
8824}
8825
718e3744 8826#include "hash.h"
8827
94f2b392 8828static void
718e3744 8829community_show_all_iterator (struct hash_backet *backet, struct vty *vty)
8830{
8831 struct community *com;
8832
8833 com = (struct community *) backet->data;
6c4f4e6e 8834 vty_out (vty, "[%p] (%ld) %s%s", (void *)backet, com->refcnt,
718e3744 8835 community_str (com), VTY_NEWLINE);
8836}
8837
8838/* Show BGP's community internal data. */
f412b39a 8839DEFUN (show_ip_bgp_community_info,
718e3744 8840 show_ip_bgp_community_info_cmd,
bec37ba5 8841 "show [ip] bgp community-info",
718e3744 8842 SHOW_STR
8843 IP_STR
8844 BGP_STR
8845 "List all bgp community information\n")
8846{
8847 vty_out (vty, "Address Refcnt Community%s", VTY_NEWLINE);
8848
e52702f2 8849 hash_iterate (community_hash (),
718e3744 8850 (void (*) (struct hash_backet *, void *))
8851 community_show_all_iterator,
8852 vty);
8853
8854 return CMD_SUCCESS;
8855}
8856
57d187bc
JS
8857static void
8858lcommunity_show_all_iterator (struct hash_backet *backet, struct vty *vty)
8859{
8860 struct lcommunity *lcom;
8861
8862 lcom = (struct lcommunity *) backet->data;
8863 vty_out (vty, "[%p] (%ld) %s%s", (void *)backet, lcom->refcnt,
2acb4ac2 8864 lcommunity_str (lcom), VTY_NEWLINE);
57d187bc
JS
8865}
8866
8867/* Show BGP's community internal data. */
8868DEFUN (show_ip_bgp_lcommunity_info,
8869 show_ip_bgp_lcommunity_info_cmd,
8870 "show ip bgp large-community-info",
8871 SHOW_STR
8872 IP_STR
8873 BGP_STR
8874 "List all bgp large-community information\n")
8875{
8876 vty_out (vty, "Address Refcnt Large-community%s", VTY_NEWLINE);
8877
8878 hash_iterate (lcommunity_hash (),
2acb4ac2
DL
8879 (void (*) (struct hash_backet *, void *))
8880 lcommunity_show_all_iterator,
8881 vty);
57d187bc
JS
8882
8883 return CMD_SUCCESS;
8884}
8885
8886
f412b39a 8887DEFUN (show_ip_bgp_attr_info,
718e3744 8888 show_ip_bgp_attr_info_cmd,
bec37ba5 8889 "show [ip] bgp attribute-info",
718e3744 8890 SHOW_STR
8891 IP_STR
8892 BGP_STR
8893 "List all bgp attribute information\n")
8894{
8895 attr_show_all (vty);
8896 return CMD_SUCCESS;
8897}
6b0655a2 8898
f186de26 8899static void
8900bgp_show_all_instances_updgrps_vty (struct vty *vty, afi_t afi, safi_t safi)
8901{
8902 struct listnode *node, *nnode;
8903 struct bgp *bgp;
8904
8905 for (ALL_LIST_ELEMENTS (bm->bgp, node, nnode, bgp))
8906 {
8907 vty_out (vty, "%sInstance %s:%s",
8908 VTY_NEWLINE,
8909 (bgp->inst_type == BGP_INSTANCE_TYPE_DEFAULT) ? "Default" : bgp->name,
8910 VTY_NEWLINE);
8911 update_group_show(bgp, afi, safi, vty, 0);
8912 }
8913}
8914
4fb25c53
DW
8915static int
8916bgp_show_update_groups(struct vty *vty, const char *name,
8917 int afi, int safi,
8918 uint64_t subgrp_id)
8919{
8920 struct bgp *bgp;
8921
8922 if (name)
8923 {
8924 if (strmatch (name, "all"))
8925 {
8926 bgp_show_all_instances_updgrps_vty (vty, afi, safi);
8927 return CMD_SUCCESS;
8928 }
8929 else
8930 {
8931 bgp = bgp_lookup_by_name (name);
8932 }
8933 }
8934 else
8935 {
8936 bgp = bgp_get_default ();
8937 }
8938
8939 if (bgp)
8940 update_group_show(bgp, afi, safi, vty, subgrp_id);
8941 return CMD_SUCCESS;
8942}
8943
8fe8a7f6
DS
8944DEFUN (show_ip_bgp_updgrps,
8945 show_ip_bgp_updgrps_cmd,
c9e571b4 8946 "show [ip] bgp [<view|vrf> WORD] ["BGP_AFI_CMD_STR" ["BGP_SAFI_CMD_STR"]] update-groups [SUBGROUP-ID]",
8386ac43 8947 SHOW_STR
8948 IP_STR
8949 BGP_STR
8950 BGP_INSTANCE_HELP_STR
c9e571b4 8951 BGP_AFI_HELP_STR
46f296b4 8952 BGP_SAFI_HELP_STR
5bf15956
DW
8953 "Detailed info about dynamic update groups\n"
8954 "Specific subgroup to display detailed info for\n")
8386ac43 8955{
5bf15956 8956 char *vrf = NULL;
ae19d7dd
QY
8957 afi_t afi = AFI_IP6;
8958 safi_t safi = SAFI_UNICAST;
5bf15956
DW
8959 uint64_t subgrp_id = 0;
8960
ae19d7dd
QY
8961 int idx = 0;
8962
8963 /* show [ip] bgp */
8964 if (argv_find (argv, argc, "ip", &idx))
8965 afi = AFI_IP;
8966 /* [<view|vrf> WORD] */
8967 if (argv_find (argv, argc, "view", &idx) || argv_find (argv, argc, "vrf", &idx))
8968 vrf = argv[++idx]->arg;
c9e571b4
LB
8969 /* ["BGP_AFI_CMD_STR" ["BGP_SAFI_CMD_STR"]] */
8970 if (argv_find_and_parse_afi (argv, argc, &idx, &afi))
8971 {
8972 argv_find_and_parse_safi (argv, argc, &idx, &safi);
8973 }
5bf15956 8974
ae19d7dd
QY
8975 /* get subgroup id, if provided */
8976 idx = argc - 1;
8977 if (argv[idx]->type == VARIABLE_TKN)
8978 VTY_GET_ULL("subgroup-id", subgrp_id, argv[idx]->arg);
5bf15956
DW
8979
8980 return (bgp_show_update_groups(vty, vrf, afi, safi, subgrp_id));
8fe8a7f6
DS
8981}
8982
f186de26 8983DEFUN (show_bgp_instance_all_ipv6_updgrps,
8984 show_bgp_instance_all_ipv6_updgrps_cmd,
716b2d8a 8985 "show [ip] bgp <view|vrf> all update-groups",
f186de26 8986 SHOW_STR
716b2d8a 8987 IP_STR
f186de26 8988 BGP_STR
8989 BGP_INSTANCE_ALL_HELP_STR
0c7b1b01 8990 "Detailed info about dynamic update groups\n")
f186de26 8991{
8992 bgp_show_all_instances_updgrps_vty (vty, AFI_IP6, SAFI_UNICAST);
8993 return CMD_SUCCESS;
8994}
8995
5bf15956
DW
8996DEFUN (show_bgp_updgrps_stats,
8997 show_bgp_updgrps_stats_cmd,
716b2d8a 8998 "show [ip] bgp update-groups statistics",
3f9c7369 8999 SHOW_STR
716b2d8a 9000 IP_STR
3f9c7369 9001 BGP_STR
0c7b1b01 9002 "Detailed info about dynamic update groups\n"
3f9c7369
DS
9003 "Statistics\n")
9004{
9005 struct bgp *bgp;
9006
9007 bgp = bgp_get_default();
9008 if (bgp)
9009 update_group_show_stats(bgp, vty);
9010
9011 return CMD_SUCCESS;
9012}
9013
8386ac43 9014DEFUN (show_bgp_instance_updgrps_stats,
9015 show_bgp_instance_updgrps_stats_cmd,
716b2d8a 9016 "show [ip] bgp <view|vrf> WORD update-groups statistics",
8386ac43 9017 SHOW_STR
716b2d8a 9018 IP_STR
8386ac43 9019 BGP_STR
9020 BGP_INSTANCE_HELP_STR
0c7b1b01 9021 "Detailed info about dynamic update groups\n"
8386ac43 9022 "Statistics\n")
9023{
c500ae40 9024 int idx_word = 3;
8386ac43 9025 struct bgp *bgp;
9026
c500ae40 9027 bgp = bgp_lookup_by_name (argv[idx_word]->arg);
8386ac43 9028 if (bgp)
9029 update_group_show_stats(bgp, vty);
9030
9031 return CMD_SUCCESS;
9032}
9033
3f9c7369 9034static void
8386ac43 9035show_bgp_updgrps_adj_info_aux (struct vty *vty, const char *name,
9036 afi_t afi, safi_t safi,
f43e655e 9037 const char *what, uint64_t subgrp_id)
3f9c7369
DS
9038{
9039 struct bgp *bgp;
8386ac43 9040
9041 if (name)
9042 bgp = bgp_lookup_by_name (name);
9043 else
9044 bgp = bgp_get_default ();
9045
3f9c7369
DS
9046 if (bgp)
9047 {
9048 if (!strcmp(what, "advertise-queue"))
9049 update_group_show_adj_queue(bgp, afi, safi, vty, subgrp_id);
9050 else if (!strcmp(what, "advertised-routes"))
9051 update_group_show_advertised(bgp, afi, safi, vty, subgrp_id);
9052 else if (!strcmp(what, "packet-queue"))
9053 update_group_show_packet_queue(bgp, afi, safi, vty, subgrp_id);
9054 }
9055}
9056
9057DEFUN (show_ip_bgp_updgrps_adj,
9058 show_ip_bgp_updgrps_adj_cmd,
716b2d8a 9059 "show [ip] bgp update-groups <advertise-queue|advertised-routes|packet-queue>",
3f9c7369
DS
9060 SHOW_STR
9061 IP_STR
9062 BGP_STR
0c7b1b01 9063 "Detailed info about dynamic update groups\n"
3f9c7369
DS
9064 "Advertisement queue\n"
9065 "Announced routes\n"
9066 "Packet queue\n")
8fe8a7f6 9067
3f9c7369 9068{
c500ae40
DW
9069 int idx_type = 4;
9070 show_bgp_updgrps_adj_info_aux(vty, NULL, AFI_IP, SAFI_UNICAST, argv[idx_type]->arg, 0);
8386ac43 9071 return CMD_SUCCESS;
9072}
9073
9074DEFUN (show_ip_bgp_instance_updgrps_adj,
9075 show_ip_bgp_instance_updgrps_adj_cmd,
716b2d8a 9076 "show [ip] bgp <view|vrf> WORD update-groups <advertise-queue|advertised-routes|packet-queue>",
8386ac43 9077 SHOW_STR
9078 IP_STR
9079 BGP_STR
9080 BGP_INSTANCE_HELP_STR
0c7b1b01 9081 "Detailed info about dynamic update groups\n"
8386ac43 9082 "Advertisement queue\n"
9083 "Announced routes\n"
9084 "Packet queue\n")
9085
9086{
c500ae40
DW
9087 int idx_word = 4;
9088 int idx_type = 6;
9089 show_bgp_updgrps_adj_info_aux(vty, argv[idx_word]->arg, AFI_IP, SAFI_UNICAST, argv[idx_type]->arg, 0);
3f9c7369
DS
9090 return CMD_SUCCESS;
9091}
9092
9093DEFUN (show_bgp_updgrps_afi_adj,
9094 show_bgp_updgrps_afi_adj_cmd,
46f296b4 9095 "show [ip] bgp "BGP_AFI_SAFI_CMD_STR" update-groups <advertise-queue|advertised-routes|packet-queue>",
3f9c7369 9096 SHOW_STR
716b2d8a 9097 IP_STR
3f9c7369 9098 BGP_STR
46f296b4 9099 BGP_AFI_SAFI_HELP_STR
0c7b1b01 9100 "Detailed info about dynamic update groups\n"
3f9c7369
DS
9101 "Advertisement queue\n"
9102 "Announced routes\n"
8fe8a7f6
DS
9103 "Packet queue\n"
9104 "Specific subgroup info wanted for\n")
3f9c7369 9105{
c500ae40
DW
9106 int idx_afi = 2;
9107 int idx_safi = 3;
9108 int idx_type = 5;
46f296b4
LB
9109 show_bgp_updgrps_adj_info_aux(vty, NULL,
9110 bgp_vty_afi_from_arg(argv[idx_afi]->arg),
9111 bgp_vty_safi_from_arg(argv[idx_safi]->arg),
9112 argv[idx_type]->arg, 0);
8fe8a7f6 9113 return CMD_SUCCESS;
3f9c7369
DS
9114}
9115
9116DEFUN (show_bgp_updgrps_adj,
9117 show_bgp_updgrps_adj_cmd,
716b2d8a 9118 "show [ip] bgp update-groups <advertise-queue|advertised-routes|packet-queue>",
3f9c7369 9119 SHOW_STR
716b2d8a 9120 IP_STR
3f9c7369 9121 BGP_STR
0c7b1b01 9122 "Detailed info about dynamic update groups\n"
3f9c7369
DS
9123 "Advertisement queue\n"
9124 "Announced routes\n"
9125 "Packet queue\n")
9126{
c500ae40
DW
9127 int idx_type = 3;
9128 show_bgp_updgrps_adj_info_aux(vty, NULL, AFI_IP6, SAFI_UNICAST, argv[idx_type]->arg, 0);
8386ac43 9129 return CMD_SUCCESS;
9130}
9131
9132DEFUN (show_bgp_instance_updgrps_adj,
9133 show_bgp_instance_updgrps_adj_cmd,
716b2d8a 9134 "show [ip] bgp <view|vrf> WORD update-groups <advertise-queue|advertised-routes|packet-queue>",
8386ac43 9135 SHOW_STR
716b2d8a 9136 IP_STR
8386ac43 9137 BGP_STR
9138 BGP_INSTANCE_HELP_STR
0c7b1b01 9139 "Detailed info about dynamic update groups\n"
8386ac43 9140 "Advertisement queue\n"
9141 "Announced routes\n"
9142 "Packet queue\n")
9143{
c500ae40
DW
9144 int idx_word = 3;
9145 int idx_type = 5;
9146 show_bgp_updgrps_adj_info_aux(vty, argv[idx_word]->arg, AFI_IP6, SAFI_UNICAST, argv[idx_type]->arg, 0);
3f9c7369
DS
9147 return CMD_SUCCESS;
9148}
9149
9150DEFUN (show_ip_bgp_updgrps_adj_s,
8fe8a7f6 9151 show_ip_bgp_updgrps_adj_s_cmd,
716b2d8a 9152 "show [ip] bgp update-groups SUBGROUP-ID <advertise-queue|advertised-routes|packet-queue>",
3f9c7369
DS
9153 SHOW_STR
9154 IP_STR
9155 BGP_STR
0c7b1b01 9156 "Detailed info about dynamic update groups\n"
8fe8a7f6 9157 "Specific subgroup to display info for\n"
3f9c7369
DS
9158 "Advertisement queue\n"
9159 "Announced routes\n"
9160 "Packet queue\n")
3f9c7369 9161
3f9c7369 9162{
5bf15956 9163 int idx_subgroup_id = 4;
c500ae40 9164 int idx_type = 5;
f43e655e 9165 uint64_t subgrp_id;
8fe8a7f6 9166
5bf15956 9167 VTY_GET_ULL("subgroup-id", subgrp_id, argv[idx_subgroup_id]->arg);
8fe8a7f6 9168
5bf15956 9169 show_bgp_updgrps_adj_info_aux(vty, NULL, AFI_IP, SAFI_UNICAST, argv[idx_type]->arg, subgrp_id);
8386ac43 9170 return CMD_SUCCESS;
9171}
9172
9173DEFUN (show_ip_bgp_instance_updgrps_adj_s,
9174 show_ip_bgp_instance_updgrps_adj_s_cmd,
716b2d8a 9175 "show [ip] bgp <view|vrf> WORD update-groups SUBGROUP-ID <advertise-queue|advertised-routes|packet-queue>",
8386ac43 9176 SHOW_STR
9177 IP_STR
9178 BGP_STR
9179 BGP_INSTANCE_HELP_STR
0c7b1b01 9180 "Detailed info about dynamic update groups\n"
8386ac43 9181 "Specific subgroup to display info for\n"
9182 "Advertisement queue\n"
9183 "Announced routes\n"
9184 "Packet queue\n")
9185
9186{
5bf15956
DW
9187 int idx_vrf = 4;
9188 int idx_subgroup_id = 6;
c500ae40 9189 int idx_type = 7;
f43e655e 9190 uint64_t subgrp_id;
8386ac43 9191
5bf15956 9192 VTY_GET_ULL("subgroup-id", subgrp_id, argv[idx_subgroup_id]->arg);
8386ac43 9193
5bf15956 9194 show_bgp_updgrps_adj_info_aux(vty, argv[idx_vrf]->arg, AFI_IP, SAFI_UNICAST, argv[idx_type]->arg, subgrp_id);
3f9c7369
DS
9195 return CMD_SUCCESS;
9196}
9197
8fe8a7f6
DS
9198DEFUN (show_bgp_updgrps_afi_adj_s,
9199 show_bgp_updgrps_afi_adj_s_cmd,
46f296b4 9200 "show [ip] bgp "BGP_AFI_SAFI_CMD_STR" update-groups SUBGROUP-ID <advertise-queue|advertised-routes|packet-queue>",
3f9c7369 9201 SHOW_STR
716b2d8a 9202 IP_STR
3f9c7369 9203 BGP_STR
46f296b4 9204 BGP_AFI_SAFI_HELP_STR
0c7b1b01 9205 "Detailed info about dynamic update groups\n"
8fe8a7f6 9206 "Specific subgroup to display info for\n"
3f9c7369
DS
9207 "Advertisement queue\n"
9208 "Announced routes\n"
8fe8a7f6
DS
9209 "Packet queue\n"
9210 "Specific subgroup info wanted for\n")
3f9c7369 9211{
c500ae40
DW
9212 int idx_afi = 2;
9213 int idx_safi = 3;
5bf15956 9214 int idx_subgroup_id = 5;
c500ae40 9215 int idx_type = 6;
f43e655e 9216 uint64_t subgrp_id;
3f9c7369 9217
5bf15956 9218 VTY_GET_ULL("subgroup-id", subgrp_id, argv[idx_subgroup_id]->arg);
8fe8a7f6 9219
46f296b4
LB
9220 show_bgp_updgrps_adj_info_aux(vty, NULL,
9221 bgp_vty_afi_from_arg(argv[idx_afi]->arg),
9222 bgp_vty_safi_from_arg(argv[idx_safi]->arg),
9223 argv[idx_type]->arg, subgrp_id);
8fe8a7f6 9224 return CMD_SUCCESS;
3f9c7369
DS
9225}
9226
8fe8a7f6
DS
9227DEFUN (show_bgp_updgrps_adj_s,
9228 show_bgp_updgrps_adj_s_cmd,
716b2d8a 9229 "show [ip] bgp update-groups SUBGROUP-ID <advertise-queue|advertised-routes|packet-queue>",
8fe8a7f6 9230 SHOW_STR
716b2d8a 9231 IP_STR
8fe8a7f6 9232 BGP_STR
0c7b1b01 9233 "Detailed info about dynamic update groups\n"
8fe8a7f6
DS
9234 "Specific subgroup to display info for\n"
9235 "Advertisement queue\n"
9236 "Announced routes\n"
9237 "Packet queue\n")
9238{
5bf15956 9239 int idx_subgroup_id = 3;
c500ae40 9240 int idx_type = 4;
f43e655e 9241 uint64_t subgrp_id;
8fe8a7f6 9242
5bf15956 9243 VTY_GET_ULL("subgroup-id", subgrp_id, argv[idx_subgroup_id]->arg);
8fe8a7f6 9244
5bf15956 9245 show_bgp_updgrps_adj_info_aux(vty, NULL, AFI_IP6, SAFI_UNICAST, argv[idx_type]->arg, subgrp_id);
8fe8a7f6
DS
9246 return CMD_SUCCESS;
9247}
9248
8386ac43 9249DEFUN (show_bgp_instance_updgrps_adj_s,
9250 show_bgp_instance_updgrps_adj_s_cmd,
716b2d8a 9251 "show [ip] bgp <view|vrf> WORD update-groups SUBGROUP-ID <advertise-queue|advertised-routes|packet-queue>",
8386ac43 9252 SHOW_STR
716b2d8a 9253 IP_STR
8386ac43 9254 BGP_STR
9255 BGP_INSTANCE_HELP_STR
0c7b1b01 9256 "Detailed info about dynamic update groups\n"
8386ac43 9257 "Specific subgroup to display info for\n"
9258 "Advertisement queue\n"
9259 "Announced routes\n"
9260 "Packet queue\n")
9261{
5bf15956
DW
9262 int idx_vrf = 3;
9263 int idx_subgroup_id = 5;
c500ae40 9264 int idx_type = 6;
f43e655e 9265 uint64_t subgrp_id;
8386ac43 9266
5bf15956 9267 VTY_GET_ULL("subgroup-id", subgrp_id, argv[idx_subgroup_id]->arg);
8386ac43 9268
5bf15956 9269 show_bgp_updgrps_adj_info_aux(vty, argv[idx_vrf]->arg, AFI_IP6, SAFI_UNICAST, argv[idx_type]->arg, subgrp_id);
8386ac43 9270 return CMD_SUCCESS;
9271}
9272
9273
8fe8a7f6 9274
f14e6fdb
DS
9275static int
9276bgp_show_one_peer_group (struct vty *vty, struct peer_group *group)
9277{
9278 struct listnode *node, *nnode;
9279 struct prefix *range;
9280 struct peer *conf;
9281 struct peer *peer;
4690c7d7 9282 char buf[PREFIX2STR_BUFFER];
f14e6fdb
DS
9283 afi_t afi;
9284 safi_t safi;
ffd0c037
DS
9285 const char *peer_status;
9286 const char *af_str;
f14e6fdb
DS
9287 int lr_count;
9288 int dynamic;
9289 int af_cfgd;
9290
9291 conf = group->conf;
9292
0299c004
DS
9293 if (conf->as_type == AS_SPECIFIED ||
9294 conf->as_type == AS_EXTERNAL) {
66b199b2 9295 vty_out (vty, "%sBGP peer-group %s, remote AS %d%s",
f14e6fdb 9296 VTY_NEWLINE, group->name, conf->as, VTY_NEWLINE);
0299c004 9297 } else if (conf->as_type == AS_INTERNAL) {
66b199b2 9298 vty_out (vty, "%sBGP peer-group %s, remote AS %d%s",
0299c004 9299 VTY_NEWLINE, group->name, group->bgp->as, VTY_NEWLINE);
66b199b2
DS
9300 } else {
9301 vty_out (vty, "%sBGP peer-group %s%s",
9302 VTY_NEWLINE, group->name, VTY_NEWLINE);
0299c004 9303 }
f14e6fdb 9304
0299c004 9305 if ((group->bgp->as == conf->as) || (conf->as_type == AS_INTERNAL))
f14e6fdb
DS
9306 vty_out (vty, " Peer-group type is internal%s", VTY_NEWLINE);
9307 else
9308 vty_out (vty, " Peer-group type is external%s", VTY_NEWLINE);
9309
9310 /* Display AFs configured. */
9311 vty_out (vty, " Configured address-families:");
9312 for (afi = AFI_IP; afi < AFI_MAX; afi++)
9313 for (safi = SAFI_UNICAST ; safi < SAFI_MAX ; safi++)
9314 {
9315 if (conf->afc[afi][safi])
9316 {
9317 af_cfgd = 1;
9318 vty_out (vty, " %s;", afi_safi_print(afi, safi));
9319 }
9320 }
9321 if (!af_cfgd)
9322 vty_out (vty, " none%s", VTY_NEWLINE);
9323 else
9324 vty_out (vty, "%s", VTY_NEWLINE);
9325
9326 /* Display listen ranges (for dynamic neighbors), if any */
9327 for (afi = AFI_IP; afi < AFI_MAX; afi++)
9328 {
9329 if (afi == AFI_IP)
9330 af_str = "IPv4";
9331 else if (afi == AFI_IP6)
9332 af_str = "IPv6";
45ef4300
DL
9333 else
9334 af_str = "???";
f14e6fdb
DS
9335 lr_count = listcount(group->listen_range[afi]);
9336 if (lr_count)
9337 {
9338 vty_out(vty,
9339 " %d %s listen range(s)%s",
9340 lr_count, af_str, VTY_NEWLINE);
9341
9342
9343 for (ALL_LIST_ELEMENTS (group->listen_range[afi], node,
9344 nnode, range))
9345 {
9346 prefix2str(range, buf, sizeof(buf));
9347 vty_out(vty, " %s%s", buf, VTY_NEWLINE);
9348 }
9349 }
9350 }
9351
9352 /* Display group members and their status */
9353 if (listcount(group->peer))
9354 {
9355 vty_out (vty, " Peer-group members:%s", VTY_NEWLINE);
9356 for (ALL_LIST_ELEMENTS (group->peer, node, nnode, peer))
9357 {
9358 if (CHECK_FLAG (peer->flags, PEER_FLAG_SHUTDOWN))
9359 peer_status = "Idle (Admin)";
9360 else if (CHECK_FLAG (peer->sflags, PEER_STATUS_PREFIX_OVERFLOW))
9361 peer_status = "Idle (PfxCt)";
9362 else
9363 peer_status = LOOKUP(bgp_status_msg, peer->status);
9364
9365 dynamic = peer_dynamic_neighbor(peer);
9366 vty_out (vty, " %s %s %s %s",
9367 peer->host, dynamic ? "(dynamic)" : "",
9368 peer_status, VTY_NEWLINE);
9369 }
9370 }
9371
9372 return CMD_SUCCESS;
9373}
9374
9375/* Show BGP peer group's information. */
9376enum show_group_type
9377{
9378 show_all_groups,
9379 show_peer_group
9380};
9381
9382static int
9383bgp_show_peer_group (struct vty *vty, struct bgp *bgp,
9384 enum show_group_type type, const char *group_name)
9385{
9386 struct listnode *node, *nnode;
9387 struct peer_group *group;
9388 int find = 0;
9389
9390 for (ALL_LIST_ELEMENTS (bgp->group, node, nnode, group))
9391 {
9392 switch (type)
9393 {
9394 case show_all_groups:
9395 bgp_show_one_peer_group (vty, group);
9396 break;
9397 case show_peer_group:
9398 if (group_name && (strcmp(group->name, group_name) == 0))
9399 {
9400 find = 1;
9401 bgp_show_one_peer_group (vty, group);
9402 }
9403 break;
9404 }
9405 }
9406
9407 if (type == show_peer_group && ! find)
6d9e66dc 9408 vty_out (vty, "%% No such peer-group%s", VTY_NEWLINE);
f14e6fdb
DS
9409
9410 return CMD_SUCCESS;
9411}
9412
9413static int
9414bgp_show_peer_group_vty (struct vty *vty, const char *name,
9415 enum show_group_type type, const char *group_name)
9416{
9417 struct bgp *bgp;
9418 int ret = CMD_SUCCESS;
9419
9420 if (name)
8386ac43 9421 bgp = bgp_lookup_by_name (name);
9422 else
9423 bgp = bgp_get_default ();
f14e6fdb 9424
8386ac43 9425 if (! bgp)
9426 {
9427 vty_out (vty, "%% No such BGP instance exist%s", VTY_NEWLINE);
9428 return CMD_WARNING;
f14e6fdb
DS
9429 }
9430
8386ac43 9431 ret = bgp_show_peer_group (vty, bgp, type, group_name);
f14e6fdb
DS
9432
9433 return ret;
9434}
9435
9436DEFUN (show_ip_bgp_peer_groups,
9437 show_ip_bgp_peer_groups_cmd,
f2a8972b 9438 "show [ip] bgp [<view|vrf> WORD] peer-group [PGNAME]",
f14e6fdb
DS
9439 SHOW_STR
9440 IP_STR
9441 BGP_STR
8386ac43 9442 BGP_INSTANCE_HELP_STR
d6e3c605
QY
9443 "Detailed information on BGP peer groups\n"
9444 "Peer group name\n")
f14e6fdb 9445{
d6e3c605
QY
9446 char *vrf, *pg;
9447 vrf = pg = NULL;
9448 int idx = 0;
f14e6fdb 9449
f2a8972b 9450 vrf = argv_find (argv, argc, "WORD", &idx) ? argv[idx]->arg : NULL;
d6e3c605 9451 pg = argv_find (argv, argc, "PGNAME", &idx) ? argv[idx]->arg : NULL;
f14e6fdb 9452
d6e3c605 9453 return bgp_show_peer_group_vty (vty, vrf, show_all_groups, pg);
f14e6fdb 9454}
3f9c7369 9455
d6e3c605 9456
718e3744 9457/* Redistribute VTY commands. */
9458
718e3744 9459DEFUN (bgp_redistribute_ipv4,
9460 bgp_redistribute_ipv4_cmd,
40d1cbfb 9461 "redistribute " FRR_IP_REDIST_STR_BGPD,
718e3744 9462 "Redistribute information from another routing protocol\n"
ab0181ee 9463 FRR_IP_REDIST_HELP_STR_BGPD)
718e3744 9464{
cdc2d765 9465 VTY_DECLVAR_CONTEXT(bgp, bgp);
c500ae40 9466 int idx_protocol = 1;
718e3744 9467 int type;
9468
6d681bd8
QY
9469 type = proto_redistnum (AFI_IP, argv[idx_protocol]->text);
9470 if (type < 0)
718e3744 9471 {
9472 vty_out (vty, "%% Invalid route type%s", VTY_NEWLINE);
9473 return CMD_WARNING;
9474 }
cdc2d765
DL
9475 bgp_redist_add(bgp, AFI_IP, type, 0);
9476 return bgp_redistribute_set (bgp, AFI_IP, type, 0);
718e3744 9477}
9478
9479DEFUN (bgp_redistribute_ipv4_rmap,
9480 bgp_redistribute_ipv4_rmap_cmd,
40d1cbfb 9481 "redistribute " FRR_IP_REDIST_STR_BGPD " route-map WORD",
718e3744 9482 "Redistribute information from another routing protocol\n"
ab0181ee 9483 FRR_IP_REDIST_HELP_STR_BGPD
718e3744 9484 "Route map reference\n"
9485 "Pointer to route-map entries\n")
9486{
cdc2d765 9487 VTY_DECLVAR_CONTEXT(bgp, bgp);
c500ae40
DW
9488 int idx_protocol = 1;
9489 int idx_word = 3;
718e3744 9490 int type;
7c8ff89e 9491 struct bgp_redist *red;
718e3744 9492
6d681bd8
QY
9493 type = proto_redistnum (AFI_IP, argv[idx_protocol]->text);
9494 if (type < 0)
718e3744 9495 {
9496 vty_out (vty, "%% Invalid route type%s", VTY_NEWLINE);
9497 return CMD_WARNING;
9498 }
9499
cdc2d765 9500 red = bgp_redist_add(bgp, AFI_IP, type, 0);
c500ae40 9501 bgp_redistribute_rmap_set (red, argv[idx_word]->arg);
cdc2d765 9502 return bgp_redistribute_set (bgp, AFI_IP, type, 0);
718e3744 9503}
9504
9505DEFUN (bgp_redistribute_ipv4_metric,
9506 bgp_redistribute_ipv4_metric_cmd,
40d1cbfb 9507 "redistribute " FRR_IP_REDIST_STR_BGPD " metric (0-4294967295)",
718e3744 9508 "Redistribute information from another routing protocol\n"
ab0181ee 9509 FRR_IP_REDIST_HELP_STR_BGPD
718e3744 9510 "Metric for redistributed routes\n"
9511 "Default metric\n")
9512{
cdc2d765 9513 VTY_DECLVAR_CONTEXT(bgp, bgp);
c500ae40
DW
9514 int idx_protocol = 1;
9515 int idx_number = 3;
718e3744 9516 int type;
9517 u_int32_t metric;
7c8ff89e 9518 struct bgp_redist *red;
718e3744 9519
6d681bd8
QY
9520 type = proto_redistnum (AFI_IP, argv[idx_protocol]->text);
9521 if (type < 0)
718e3744 9522 {
9523 vty_out (vty, "%% Invalid route type%s", VTY_NEWLINE);
9524 return CMD_WARNING;
9525 }
c500ae40 9526 VTY_GET_INTEGER ("metric", metric, argv[idx_number]->arg);
718e3744 9527
cdc2d765
DL
9528 red = bgp_redist_add(bgp, AFI_IP, type, 0);
9529 bgp_redistribute_metric_set(bgp, red, AFI_IP, type, metric);
9530 return bgp_redistribute_set (bgp, AFI_IP, type, 0);
718e3744 9531}
9532
9533DEFUN (bgp_redistribute_ipv4_rmap_metric,
9534 bgp_redistribute_ipv4_rmap_metric_cmd,
40d1cbfb 9535 "redistribute " FRR_IP_REDIST_STR_BGPD " route-map WORD metric (0-4294967295)",
718e3744 9536 "Redistribute information from another routing protocol\n"
ab0181ee 9537 FRR_IP_REDIST_HELP_STR_BGPD
718e3744 9538 "Route map reference\n"
9539 "Pointer to route-map entries\n"
9540 "Metric for redistributed routes\n"
9541 "Default metric\n")
9542{
cdc2d765 9543 VTY_DECLVAR_CONTEXT(bgp, bgp);
c500ae40
DW
9544 int idx_protocol = 1;
9545 int idx_word = 3;
9546 int idx_number = 5;
718e3744 9547 int type;
9548 u_int32_t metric;
7c8ff89e 9549 struct bgp_redist *red;
718e3744 9550
6d681bd8
QY
9551 type = proto_redistnum (AFI_IP, argv[idx_protocol]->text);
9552 if (type < 0)
718e3744 9553 {
9554 vty_out (vty, "%% Invalid route type%s", VTY_NEWLINE);
9555 return CMD_WARNING;
9556 }
c500ae40 9557 VTY_GET_INTEGER ("metric", metric, argv[idx_number]->arg);
718e3744 9558
cdc2d765 9559 red = bgp_redist_add(bgp, AFI_IP, type, 0);
c500ae40 9560 bgp_redistribute_rmap_set (red, argv[idx_word]->arg);
cdc2d765
DL
9561 bgp_redistribute_metric_set(bgp, red, AFI_IP, type, metric);
9562 return bgp_redistribute_set (bgp, AFI_IP, type, 0);
718e3744 9563}
9564
9565DEFUN (bgp_redistribute_ipv4_metric_rmap,
9566 bgp_redistribute_ipv4_metric_rmap_cmd,
40d1cbfb 9567 "redistribute " FRR_IP_REDIST_STR_BGPD " metric (0-4294967295) route-map WORD",
718e3744 9568 "Redistribute information from another routing protocol\n"
ab0181ee 9569 FRR_IP_REDIST_HELP_STR_BGPD
718e3744 9570 "Metric for redistributed routes\n"
9571 "Default metric\n"
9572 "Route map reference\n"
9573 "Pointer to route-map entries\n")
9574{
cdc2d765 9575 VTY_DECLVAR_CONTEXT(bgp, bgp);
c500ae40
DW
9576 int idx_protocol = 1;
9577 int idx_number = 3;
9578 int idx_word = 5;
718e3744 9579 int type;
9580 u_int32_t metric;
7c8ff89e 9581 struct bgp_redist *red;
718e3744 9582
6d681bd8
QY
9583 type = proto_redistnum (AFI_IP, argv[idx_protocol]->text);
9584 if (type < 0)
718e3744 9585 {
9586 vty_out (vty, "%% Invalid route type%s", VTY_NEWLINE);
9587 return CMD_WARNING;
9588 }
c500ae40 9589 VTY_GET_INTEGER ("metric", metric, argv[idx_number]->arg);
718e3744 9590
cdc2d765
DL
9591 red = bgp_redist_add(bgp, AFI_IP, type, 0);
9592 bgp_redistribute_metric_set(bgp, red, AFI_IP, type, metric);
c500ae40 9593 bgp_redistribute_rmap_set (red, argv[idx_word]->arg);
cdc2d765 9594 return bgp_redistribute_set (bgp, AFI_IP, type, 0);
718e3744 9595}
9596
7c8ff89e
DS
9597DEFUN (bgp_redistribute_ipv4_ospf,
9598 bgp_redistribute_ipv4_ospf_cmd,
6147e2c6 9599 "redistribute <ospf|table> (1-65535)",
7c8ff89e
DS
9600 "Redistribute information from another routing protocol\n"
9601 "Open Shortest Path First (OSPFv2)\n"
2d627ff5
DS
9602 "Non-main Kernel Routing Table\n"
9603 "Instance ID/Table ID\n")
7c8ff89e 9604{
cdc2d765 9605 VTY_DECLVAR_CONTEXT(bgp, bgp);
c500ae40
DW
9606 int idx_ospf_table = 1;
9607 int idx_number = 2;
7c8ff89e 9608 u_short instance;
7a4bb9c5 9609 u_short protocol;
7c8ff89e 9610
c500ae40 9611 VTY_GET_INTEGER ("Instance ID", instance, argv[idx_number]->arg);
7a4bb9c5 9612
c500ae40 9613 if (strncmp(argv[idx_ospf_table]->arg, "o", 1) == 0)
7a4bb9c5
DS
9614 protocol = ZEBRA_ROUTE_OSPF;
9615 else
9616 protocol = ZEBRA_ROUTE_TABLE;
9617
cdc2d765
DL
9618 bgp_redist_add(bgp, AFI_IP, protocol, instance);
9619 return bgp_redistribute_set (bgp, AFI_IP, protocol, instance);
7c8ff89e
DS
9620}
9621
9622DEFUN (bgp_redistribute_ipv4_ospf_rmap,
9623 bgp_redistribute_ipv4_ospf_rmap_cmd,
6147e2c6 9624 "redistribute <ospf|table> (1-65535) route-map WORD",
7c8ff89e
DS
9625 "Redistribute information from another routing protocol\n"
9626 "Open Shortest Path First (OSPFv2)\n"
2d627ff5
DS
9627 "Non-main Kernel Routing Table\n"
9628 "Instance ID/Table ID\n"
7c8ff89e
DS
9629 "Route map reference\n"
9630 "Pointer to route-map entries\n")
9631{
cdc2d765 9632 VTY_DECLVAR_CONTEXT(bgp, bgp);
c500ae40
DW
9633 int idx_ospf_table = 1;
9634 int idx_number = 2;
9635 int idx_word = 4;
7c8ff89e
DS
9636 struct bgp_redist *red;
9637 u_short instance;
7a4bb9c5 9638 int protocol;
7c8ff89e 9639
c500ae40 9640 if (strncmp(argv[idx_ospf_table]->arg, "o", 1) == 0)
7a4bb9c5
DS
9641 protocol = ZEBRA_ROUTE_OSPF;
9642 else
9643 protocol = ZEBRA_ROUTE_TABLE;
9644
c500ae40 9645 VTY_GET_INTEGER ("Instance ID", instance, argv[idx_number]->arg);
cdc2d765 9646 red = bgp_redist_add(bgp, AFI_IP, protocol, instance);
c500ae40 9647 bgp_redistribute_rmap_set (red, argv[idx_word]->arg);
cdc2d765 9648 return bgp_redistribute_set (bgp, AFI_IP, protocol, instance);
7c8ff89e
DS
9649}
9650
9651DEFUN (bgp_redistribute_ipv4_ospf_metric,
9652 bgp_redistribute_ipv4_ospf_metric_cmd,
6147e2c6 9653 "redistribute <ospf|table> (1-65535) metric (0-4294967295)",
7c8ff89e
DS
9654 "Redistribute information from another routing protocol\n"
9655 "Open Shortest Path First (OSPFv2)\n"
2d627ff5
DS
9656 "Non-main Kernel Routing Table\n"
9657 "Instance ID/Table ID\n"
7c8ff89e
DS
9658 "Metric for redistributed routes\n"
9659 "Default metric\n")
9660{
cdc2d765 9661 VTY_DECLVAR_CONTEXT(bgp, bgp);
c500ae40
DW
9662 int idx_ospf_table = 1;
9663 int idx_number = 2;
9664 int idx_number_2 = 4;
7c8ff89e
DS
9665 u_int32_t metric;
9666 struct bgp_redist *red;
9667 u_short instance;
7a4bb9c5 9668 int protocol;
7c8ff89e 9669
c500ae40 9670 if (strncmp(argv[idx_ospf_table]->arg, "o", 1) == 0)
7a4bb9c5
DS
9671 protocol = ZEBRA_ROUTE_OSPF;
9672 else
9673 protocol = ZEBRA_ROUTE_TABLE;
7c8ff89e 9674
c500ae40
DW
9675 VTY_GET_INTEGER ("Instance ID", instance, argv[idx_number]->arg);
9676 VTY_GET_INTEGER ("metric", metric, argv[idx_number_2]->arg);
7a4bb9c5 9677
cdc2d765
DL
9678 red = bgp_redist_add(bgp, AFI_IP, protocol, instance);
9679 bgp_redistribute_metric_set(bgp, red, AFI_IP, protocol, metric);
9680 return bgp_redistribute_set (bgp, AFI_IP, protocol, instance);
7c8ff89e
DS
9681}
9682
9683DEFUN (bgp_redistribute_ipv4_ospf_rmap_metric,
9684 bgp_redistribute_ipv4_ospf_rmap_metric_cmd,
6147e2c6 9685 "redistribute <ospf|table> (1-65535) route-map WORD metric (0-4294967295)",
7c8ff89e
DS
9686 "Redistribute information from another routing protocol\n"
9687 "Open Shortest Path First (OSPFv2)\n"
2d627ff5
DS
9688 "Non-main Kernel Routing Table\n"
9689 "Instance ID/Table ID\n"
7c8ff89e
DS
9690 "Route map reference\n"
9691 "Pointer to route-map entries\n"
9692 "Metric for redistributed routes\n"
9693 "Default metric\n")
9694{
cdc2d765 9695 VTY_DECLVAR_CONTEXT(bgp, bgp);
c500ae40
DW
9696 int idx_ospf_table = 1;
9697 int idx_number = 2;
9698 int idx_word = 4;
9699 int idx_number_2 = 6;
7c8ff89e
DS
9700 u_int32_t metric;
9701 struct bgp_redist *red;
9702 u_short instance;
7a4bb9c5 9703 int protocol;
7c8ff89e 9704
c500ae40 9705 if (strncmp(argv[idx_ospf_table]->arg, "o", 1) == 0)
7a4bb9c5
DS
9706 protocol = ZEBRA_ROUTE_OSPF;
9707 else
9708 protocol = ZEBRA_ROUTE_TABLE;
7c8ff89e 9709
c500ae40
DW
9710 VTY_GET_INTEGER ("Instance ID", instance, argv[idx_number]->arg);
9711 VTY_GET_INTEGER ("metric", metric, argv[idx_number_2]->arg);
7a4bb9c5 9712
cdc2d765 9713 red = bgp_redist_add(bgp, AFI_IP, protocol, instance);
c500ae40 9714 bgp_redistribute_rmap_set (red, argv[idx_word]->arg);
cdc2d765
DL
9715 bgp_redistribute_metric_set(bgp, red, AFI_IP, protocol, metric);
9716 return bgp_redistribute_set (bgp, AFI_IP, protocol, instance);
7c8ff89e
DS
9717}
9718
9719DEFUN (bgp_redistribute_ipv4_ospf_metric_rmap,
9720 bgp_redistribute_ipv4_ospf_metric_rmap_cmd,
6147e2c6 9721 "redistribute <ospf|table> (1-65535) metric (0-4294967295) route-map WORD",
7c8ff89e
DS
9722 "Redistribute information from another routing protocol\n"
9723 "Open Shortest Path First (OSPFv2)\n"
2d627ff5
DS
9724 "Non-main Kernel Routing Table\n"
9725 "Instance ID/Table ID\n"
7c8ff89e
DS
9726 "Metric for redistributed routes\n"
9727 "Default metric\n"
9728 "Route map reference\n"
9729 "Pointer to route-map entries\n")
9730{
cdc2d765 9731 VTY_DECLVAR_CONTEXT(bgp, bgp);
c500ae40
DW
9732 int idx_ospf_table = 1;
9733 int idx_number = 2;
9734 int idx_number_2 = 4;
9735 int idx_word = 6;
7c8ff89e
DS
9736 u_int32_t metric;
9737 struct bgp_redist *red;
9738 u_short instance;
7a4bb9c5 9739 int protocol;
7c8ff89e 9740
c500ae40 9741 if (strncmp(argv[idx_ospf_table]->arg, "o", 1) == 0)
7a4bb9c5
DS
9742 protocol = ZEBRA_ROUTE_OSPF;
9743 else
9744 protocol = ZEBRA_ROUTE_TABLE;
7c8ff89e 9745
c500ae40
DW
9746 VTY_GET_INTEGER ("Instance ID", instance, argv[idx_number]->arg);
9747 VTY_GET_INTEGER ("metric", metric, argv[idx_number_2]->arg);
7a4bb9c5 9748
cdc2d765
DL
9749 red = bgp_redist_add(bgp, AFI_IP, protocol, instance);
9750 bgp_redistribute_metric_set(bgp, red, AFI_IP, protocol, metric);
c500ae40 9751 bgp_redistribute_rmap_set (red, argv[idx_word]->arg);
cdc2d765 9752 return bgp_redistribute_set (bgp, AFI_IP, protocol, instance);
7c8ff89e
DS
9753}
9754
9755DEFUN (no_bgp_redistribute_ipv4_ospf,
9756 no_bgp_redistribute_ipv4_ospf_cmd,
d04c479d 9757 "no redistribute <ospf|table> (1-65535) [metric (0-4294967295)] [route-map WORD]",
7c8ff89e
DS
9758 NO_STR
9759 "Redistribute information from another routing protocol\n"
9760 "Open Shortest Path First (OSPFv2)\n"
2d627ff5 9761 "Non-main Kernel Routing Table\n"
31500417
DW
9762 "Instance ID/Table ID\n"
9763 "Metric for redistributed routes\n"
9764 "Default metric\n"
9765 "Route map reference\n"
9766 "Pointer to route-map entries\n")
7c8ff89e 9767{
cdc2d765 9768 VTY_DECLVAR_CONTEXT(bgp, bgp);
c500ae40
DW
9769 int idx_ospf_table = 2;
9770 int idx_number = 3;
7c8ff89e 9771 u_short instance;
7a4bb9c5
DS
9772 int protocol;
9773
c500ae40 9774 if (strncmp(argv[idx_ospf_table]->arg, "o", 1) == 0)
7a4bb9c5
DS
9775 protocol = ZEBRA_ROUTE_OSPF;
9776 else
9777 protocol = ZEBRA_ROUTE_TABLE;
7c8ff89e 9778
c500ae40 9779 VTY_GET_INTEGER ("Instance ID", instance, argv[idx_number]->arg);
cdc2d765 9780 return bgp_redistribute_unset (bgp, AFI_IP, protocol, instance);
7c8ff89e
DS
9781}
9782
718e3744 9783DEFUN (no_bgp_redistribute_ipv4,
9784 no_bgp_redistribute_ipv4_cmd,
40d1cbfb 9785 "no redistribute " FRR_IP_REDIST_STR_BGPD " [metric (0-4294967295)] [route-map WORD]",
718e3744 9786 NO_STR
9787 "Redistribute information from another routing protocol\n"
3b14d86e 9788 FRR_IP_REDIST_HELP_STR_BGPD
31500417
DW
9789 "Metric for redistributed routes\n"
9790 "Default metric\n"
9791 "Route map reference\n"
9792 "Pointer to route-map entries\n")
718e3744 9793{
cdc2d765 9794 VTY_DECLVAR_CONTEXT(bgp, bgp);
c500ae40 9795 int idx_protocol = 2;
718e3744 9796 int type;
9797
6d681bd8
QY
9798 type = proto_redistnum (AFI_IP, argv[idx_protocol]->text);
9799 if (type < 0)
718e3744 9800 {
9801 vty_out (vty, "%% Invalid route type%s", VTY_NEWLINE);
9802 return CMD_WARNING;
9803 }
cdc2d765 9804 return bgp_redistribute_unset (bgp, AFI_IP, type, 0);
718e3744 9805}
9806
718e3744 9807DEFUN (bgp_redistribute_ipv6,
9808 bgp_redistribute_ipv6_cmd,
40d1cbfb 9809 "redistribute " FRR_IP6_REDIST_STR_BGPD,
718e3744 9810 "Redistribute information from another routing protocol\n"
ab0181ee 9811 FRR_IP6_REDIST_HELP_STR_BGPD)
718e3744 9812{
cdc2d765 9813 VTY_DECLVAR_CONTEXT(bgp, bgp);
c500ae40 9814 int idx_protocol = 1;
718e3744 9815 int type;
9816
6d681bd8
QY
9817 type = proto_redistnum (AFI_IP6, argv[idx_protocol]->text);
9818 if (type < 0)
718e3744 9819 {
9820 vty_out (vty, "%% Invalid route type%s", VTY_NEWLINE);
9821 return CMD_WARNING;
9822 }
9823
cdc2d765
DL
9824 bgp_redist_add(bgp, AFI_IP6, type, 0);
9825 return bgp_redistribute_set (bgp, AFI_IP6, type, 0);
718e3744 9826}
9827
9828DEFUN (bgp_redistribute_ipv6_rmap,
9829 bgp_redistribute_ipv6_rmap_cmd,
40d1cbfb 9830 "redistribute " FRR_IP6_REDIST_STR_BGPD " route-map WORD",
718e3744 9831 "Redistribute information from another routing protocol\n"
ab0181ee 9832 FRR_IP6_REDIST_HELP_STR_BGPD
718e3744 9833 "Route map reference\n"
9834 "Pointer to route-map entries\n")
9835{
cdc2d765 9836 VTY_DECLVAR_CONTEXT(bgp, bgp);
c500ae40
DW
9837 int idx_protocol = 1;
9838 int idx_word = 3;
718e3744 9839 int type;
7c8ff89e 9840 struct bgp_redist *red;
718e3744 9841
6d681bd8
QY
9842 type = proto_redistnum (AFI_IP6, argv[idx_protocol]->text);
9843 if (type < 0)
718e3744 9844 {
9845 vty_out (vty, "%% Invalid route type%s", VTY_NEWLINE);
9846 return CMD_WARNING;
9847 }
9848
cdc2d765 9849 red = bgp_redist_add(bgp, AFI_IP6, type, 0);
c500ae40 9850 bgp_redistribute_rmap_set (red, argv[idx_word]->arg);
cdc2d765 9851 return bgp_redistribute_set (bgp, AFI_IP6, type, 0);
718e3744 9852}
9853
9854DEFUN (bgp_redistribute_ipv6_metric,
9855 bgp_redistribute_ipv6_metric_cmd,
40d1cbfb 9856 "redistribute " FRR_IP6_REDIST_STR_BGPD " metric (0-4294967295)",
718e3744 9857 "Redistribute information from another routing protocol\n"
ab0181ee 9858 FRR_IP6_REDIST_HELP_STR_BGPD
718e3744 9859 "Metric for redistributed routes\n"
9860 "Default metric\n")
9861{
cdc2d765 9862 VTY_DECLVAR_CONTEXT(bgp, bgp);
c500ae40
DW
9863 int idx_protocol = 1;
9864 int idx_number = 3;
718e3744 9865 int type;
9866 u_int32_t metric;
7c8ff89e 9867 struct bgp_redist *red;
718e3744 9868
6d681bd8
QY
9869 type = proto_redistnum (AFI_IP6, argv[idx_protocol]->text);
9870 if (type < 0)
718e3744 9871 {
9872 vty_out (vty, "%% Invalid route type%s", VTY_NEWLINE);
9873 return CMD_WARNING;
9874 }
c500ae40 9875 VTY_GET_INTEGER ("metric", metric, argv[idx_number]->arg);
718e3744 9876
cdc2d765
DL
9877 red = bgp_redist_add(bgp, AFI_IP6, type, 0);
9878 bgp_redistribute_metric_set(bgp, red, AFI_IP6, type, metric);
9879 return bgp_redistribute_set (bgp, AFI_IP6, type, 0);
718e3744 9880}
9881
9882DEFUN (bgp_redistribute_ipv6_rmap_metric,
9883 bgp_redistribute_ipv6_rmap_metric_cmd,
40d1cbfb 9884 "redistribute " FRR_IP6_REDIST_STR_BGPD " route-map WORD metric (0-4294967295)",
718e3744 9885 "Redistribute information from another routing protocol\n"
ab0181ee 9886 FRR_IP6_REDIST_HELP_STR_BGPD
718e3744 9887 "Route map reference\n"
9888 "Pointer to route-map entries\n"
9889 "Metric for redistributed routes\n"
9890 "Default metric\n")
9891{
cdc2d765 9892 VTY_DECLVAR_CONTEXT(bgp, bgp);
c500ae40
DW
9893 int idx_protocol = 1;
9894 int idx_word = 3;
9895 int idx_number = 5;
718e3744 9896 int type;
9897 u_int32_t metric;
7c8ff89e 9898 struct bgp_redist *red;
718e3744 9899
6d681bd8
QY
9900 type = proto_redistnum (AFI_IP6, argv[idx_protocol]->text);
9901 if (type < 0)
718e3744 9902 {
9903 vty_out (vty, "%% Invalid route type%s", VTY_NEWLINE);
9904 return CMD_WARNING;
9905 }
c500ae40 9906 VTY_GET_INTEGER ("metric", metric, argv[idx_number]->arg);
718e3744 9907
cdc2d765 9908 red = bgp_redist_add(bgp, AFI_IP6, type, 0);
c500ae40 9909 bgp_redistribute_rmap_set (red, argv[idx_word]->arg);
cdc2d765
DL
9910 bgp_redistribute_metric_set(bgp, red, AFI_IP6, type, metric);
9911 return bgp_redistribute_set (bgp, AFI_IP6, type, 0);
718e3744 9912}
9913
9914DEFUN (bgp_redistribute_ipv6_metric_rmap,
9915 bgp_redistribute_ipv6_metric_rmap_cmd,
40d1cbfb 9916 "redistribute " FRR_IP6_REDIST_STR_BGPD " metric (0-4294967295) route-map WORD",
718e3744 9917 "Redistribute information from another routing protocol\n"
ab0181ee 9918 FRR_IP6_REDIST_HELP_STR_BGPD
718e3744 9919 "Metric for redistributed routes\n"
9920 "Default metric\n"
9921 "Route map reference\n"
9922 "Pointer to route-map entries\n")
9923{
cdc2d765 9924 VTY_DECLVAR_CONTEXT(bgp, bgp);
c500ae40
DW
9925 int idx_protocol = 1;
9926 int idx_number = 3;
9927 int idx_word = 5;
718e3744 9928 int type;
9929 u_int32_t metric;
7c8ff89e 9930 struct bgp_redist *red;
718e3744 9931
6d681bd8
QY
9932 type = proto_redistnum (AFI_IP6, argv[idx_protocol]->text);
9933 if (type < 0)
718e3744 9934 {
9935 vty_out (vty, "%% Invalid route type%s", VTY_NEWLINE);
9936 return CMD_WARNING;
9937 }
c500ae40 9938 VTY_GET_INTEGER ("metric", metric, argv[idx_number]->arg);
718e3744 9939
cdc2d765
DL
9940 red = bgp_redist_add(bgp, AFI_IP6, type, 0);
9941 bgp_redistribute_metric_set(bgp, red, AFI_IP6, SAFI_UNICAST, metric);
c500ae40 9942 bgp_redistribute_rmap_set (red, argv[idx_word]->arg);
cdc2d765 9943 return bgp_redistribute_set (bgp, AFI_IP6, type, 0);
718e3744 9944}
9945
9946DEFUN (no_bgp_redistribute_ipv6,
9947 no_bgp_redistribute_ipv6_cmd,
40d1cbfb 9948 "no redistribute " FRR_IP6_REDIST_STR_BGPD " [metric (0-4294967295)] [route-map WORD]",
718e3744 9949 NO_STR
9950 "Redistribute information from another routing protocol\n"
3b14d86e 9951 FRR_IP6_REDIST_HELP_STR_BGPD
31500417
DW
9952 "Metric for redistributed routes\n"
9953 "Default metric\n"
9954 "Route map reference\n"
9955 "Pointer to route-map entries\n")
718e3744 9956{
cdc2d765 9957 VTY_DECLVAR_CONTEXT(bgp, bgp);
c500ae40 9958 int idx_protocol = 2;
718e3744 9959 int type;
9960
6d681bd8
QY
9961 type = proto_redistnum (AFI_IP6, argv[idx_protocol]->text);
9962 if (type < 0)
718e3744 9963 {
9964 vty_out (vty, "%% Invalid route type%s", VTY_NEWLINE);
9965 return CMD_WARNING;
9966 }
9967
cdc2d765 9968 return bgp_redistribute_unset (bgp, AFI_IP6, type, 0);
718e3744 9969}
6b0655a2 9970
718e3744 9971int
9972bgp_config_write_redistribute (struct vty *vty, struct bgp *bgp, afi_t afi,
9973 safi_t safi, int *write)
9974{
9975 int i;
718e3744 9976
9977 /* Unicast redistribution only. */
9978 if (safi != SAFI_UNICAST)
9979 return 0;
9980
9981 for (i = 0; i < ZEBRA_ROUTE_MAX; i++)
9982 {
9983 /* Redistribute BGP does not make sense. */
7c8ff89e 9984 if (i != ZEBRA_ROUTE_BGP)
718e3744 9985 {
7c8ff89e
DS
9986 struct list *red_list;
9987 struct listnode *node;
9988 struct bgp_redist *red;
718e3744 9989
7c8ff89e
DS
9990 red_list = bgp->redist[afi][i];
9991 if (!red_list)
9992 continue;
718e3744 9993
7c8ff89e
DS
9994 for (ALL_LIST_ELEMENTS_RO(red_list, node, red))
9995 {
9996 /* Display "address-family" when it is not yet diplayed. */
9997 bgp_config_write_family_header (vty, afi, safi, write);
9998
9999 /* "redistribute" configuration. */
0b960b4d 10000 vty_out (vty, " redistribute %s", zebra_route_string(i));
7c8ff89e
DS
10001 if (red->instance)
10002 vty_out (vty, " %d", red->instance);
10003 if (red->redist_metric_flag)
10004 vty_out (vty, " metric %u", red->redist_metric);
10005 if (red->rmap.name)
10006 vty_out (vty, " route-map %s", red->rmap.name);
10007 vty_out (vty, "%s", VTY_NEWLINE);
10008 }
718e3744 10009 }
10010 }
10011 return *write;
10012}
6b0655a2 10013
718e3744 10014/* BGP node structure. */
7fc626de 10015static struct cmd_node bgp_node =
718e3744 10016{
10017 BGP_NODE,
10018 "%s(config-router)# ",
10019 1,
10020};
10021
7fc626de 10022static struct cmd_node bgp_ipv4_unicast_node =
718e3744 10023{
10024 BGP_IPV4_NODE,
10025 "%s(config-router-af)# ",
10026 1,
10027};
10028
7fc626de 10029static struct cmd_node bgp_ipv4_multicast_node =
718e3744 10030{
10031 BGP_IPV4M_NODE,
10032 "%s(config-router-af)# ",
10033 1,
10034};
10035
7fc626de 10036static struct cmd_node bgp_ipv6_unicast_node =
718e3744 10037{
10038 BGP_IPV6_NODE,
10039 "%s(config-router-af)# ",
10040 1,
10041};
10042
7fc626de 10043static struct cmd_node bgp_ipv6_multicast_node =
25ffbdc1 10044{
10045 BGP_IPV6M_NODE,
10046 "%s(config-router-af)# ",
10047 1,
10048};
10049
7fc626de 10050static struct cmd_node bgp_vpnv4_node =
718e3744 10051{
10052 BGP_VPNV4_NODE,
10053 "%s(config-router-af)# ",
10054 1
10055};
6b0655a2 10056
8ecd3266 10057static struct cmd_node bgp_vpnv6_node =
10058{
10059 BGP_VPNV6_NODE,
10060 "%s(config-router-af-vpnv6)# ",
10061 1
10062};
10063
8b1fb8be
LB
10064static struct cmd_node bgp_encap_node =
10065{
10066 BGP_ENCAP_NODE,
10067 "%s(config-router-af-encap)# ",
10068 1
10069};
10070
10071static struct cmd_node bgp_encapv6_node =
10072{
10073 BGP_ENCAPV6_NODE,
10074 "%s(config-router-af-encapv6)# ",
10075 1
10076};
10077
4e0b7b6d
PG
10078static struct cmd_node bgp_evpn_node =
10079{
10080 BGP_EVPN_NODE,
10081 "%s(config-router-evpn)# ",
10082 1
10083};
10084
1f8ae70b 10085static void community_list_vty (void);
10086
718e3744 10087void
94f2b392 10088bgp_vty_init (void)
718e3744 10089{
718e3744 10090 /* Install bgp top node. */
10091 install_node (&bgp_node, bgp_config_write);
10092 install_node (&bgp_ipv4_unicast_node, NULL);
10093 install_node (&bgp_ipv4_multicast_node, NULL);
10094 install_node (&bgp_ipv6_unicast_node, NULL);
25ffbdc1 10095 install_node (&bgp_ipv6_multicast_node, NULL);
718e3744 10096 install_node (&bgp_vpnv4_node, NULL);
8ecd3266 10097 install_node (&bgp_vpnv6_node, NULL);
8b1fb8be
LB
10098 install_node (&bgp_encap_node, NULL);
10099 install_node (&bgp_encapv6_node, NULL);
4e0b7b6d 10100 install_node (&bgp_evpn_node, NULL);
718e3744 10101
10102 /* Install default VTY commands to new nodes. */
10103 install_default (BGP_NODE);
10104 install_default (BGP_IPV4_NODE);
10105 install_default (BGP_IPV4M_NODE);
10106 install_default (BGP_IPV6_NODE);
25ffbdc1 10107 install_default (BGP_IPV6M_NODE);
718e3744 10108 install_default (BGP_VPNV4_NODE);
8ecd3266 10109 install_default (BGP_VPNV6_NODE);
8b1fb8be
LB
10110 install_default (BGP_ENCAP_NODE);
10111 install_default (BGP_ENCAPV6_NODE);
4e0b7b6d 10112 install_default (BGP_EVPN_NODE);
e52702f2 10113
718e3744 10114 /* "bgp multiple-instance" commands. */
10115 install_element (CONFIG_NODE, &bgp_multiple_instance_cmd);
10116 install_element (CONFIG_NODE, &no_bgp_multiple_instance_cmd);
10117
10118 /* "bgp config-type" commands. */
10119 install_element (CONFIG_NODE, &bgp_config_type_cmd);
8c3deaae 10120 install_element (CONFIG_NODE, &no_bgp_config_type_cmd);
718e3744 10121
5fe9f963 10122 /* bgp route-map delay-timer commands. */
10123 install_element (CONFIG_NODE, &bgp_set_route_map_delay_timer_cmd);
10124 install_element (CONFIG_NODE, &no_bgp_set_route_map_delay_timer_cmd);
5fe9f963 10125
718e3744 10126 /* Dummy commands (Currently not supported) */
10127 install_element (BGP_NODE, &no_synchronization_cmd);
10128 install_element (BGP_NODE, &no_auto_summary_cmd);
10129
10130 /* "router bgp" commands. */
10131 install_element (CONFIG_NODE, &router_bgp_cmd);
718e3744 10132
10133 /* "no router bgp" commands. */
10134 install_element (CONFIG_NODE, &no_router_bgp_cmd);
718e3744 10135
10136 /* "bgp router-id" commands. */
10137 install_element (BGP_NODE, &bgp_router_id_cmd);
10138 install_element (BGP_NODE, &no_bgp_router_id_cmd);
718e3744 10139
10140 /* "bgp cluster-id" commands. */
10141 install_element (BGP_NODE, &bgp_cluster_id_cmd);
718e3744 10142 install_element (BGP_NODE, &no_bgp_cluster_id_cmd);
718e3744 10143
10144 /* "bgp confederation" commands. */
10145 install_element (BGP_NODE, &bgp_confederation_identifier_cmd);
10146 install_element (BGP_NODE, &no_bgp_confederation_identifier_cmd);
718e3744 10147
10148 /* "bgp confederation peers" commands. */
10149 install_element (BGP_NODE, &bgp_confederation_peers_cmd);
10150 install_element (BGP_NODE, &no_bgp_confederation_peers_cmd);
10151
abc920f8
DS
10152 /* bgp max-med command */
10153 install_element (BGP_NODE, &bgp_maxmed_admin_cmd);
10154 install_element (BGP_NODE, &no_bgp_maxmed_admin_cmd);
10155 install_element (BGP_NODE, &bgp_maxmed_admin_medv_cmd);
abc920f8
DS
10156 install_element (BGP_NODE, &bgp_maxmed_onstartup_cmd);
10157 install_element (BGP_NODE, &no_bgp_maxmed_onstartup_cmd);
abc920f8 10158 install_element (BGP_NODE, &bgp_maxmed_onstartup_medv_cmd);
abc920f8 10159
907f92c8
DS
10160 /* bgp disable-ebgp-connected-nh-check */
10161 install_element (BGP_NODE, &bgp_disable_connected_route_check_cmd);
10162 install_element (BGP_NODE, &no_bgp_disable_connected_route_check_cmd);
10163
f188f2c4
DS
10164 /* bgp update-delay command */
10165 install_element (BGP_NODE, &bgp_update_delay_cmd);
10166 install_element (BGP_NODE, &no_bgp_update_delay_cmd);
10167 install_element (BGP_NODE, &bgp_update_delay_establish_wait_cmd);
f188f2c4 10168
cb1faec9
DS
10169 install_element (BGP_NODE, &bgp_wpkt_quanta_cmd);
10170 install_element (BGP_NODE, &no_bgp_wpkt_quanta_cmd);
10171
3f9c7369
DS
10172 install_element (BGP_NODE, &bgp_coalesce_time_cmd);
10173 install_element (BGP_NODE, &no_bgp_coalesce_time_cmd);
10174
165b5fff
JB
10175 /* "maximum-paths" commands. */
10176 install_element (BGP_NODE, &bgp_maxpaths_cmd);
10177 install_element (BGP_NODE, &no_bgp_maxpaths_cmd);
165b5fff
JB
10178 install_element (BGP_IPV4_NODE, &bgp_maxpaths_cmd);
10179 install_element (BGP_IPV4_NODE, &no_bgp_maxpaths_cmd);
431aa9f9
DS
10180 install_element (BGP_IPV6_NODE, &bgp_maxpaths_cmd);
10181 install_element (BGP_IPV6_NODE, &no_bgp_maxpaths_cmd);
165b5fff 10182 install_element (BGP_NODE, &bgp_maxpaths_ibgp_cmd);
5e242b0d 10183 install_element(BGP_NODE, &bgp_maxpaths_ibgp_cluster_cmd);
165b5fff 10184 install_element (BGP_NODE, &no_bgp_maxpaths_ibgp_cmd);
165b5fff 10185 install_element (BGP_IPV4_NODE, &bgp_maxpaths_ibgp_cmd);
5e242b0d 10186 install_element(BGP_IPV4_NODE, &bgp_maxpaths_ibgp_cluster_cmd);
165b5fff 10187 install_element (BGP_IPV4_NODE, &no_bgp_maxpaths_ibgp_cmd);
431aa9f9 10188 install_element (BGP_IPV6_NODE, &bgp_maxpaths_ibgp_cmd);
5e242b0d 10189 install_element(BGP_IPV6_NODE, &bgp_maxpaths_ibgp_cluster_cmd);
431aa9f9 10190 install_element (BGP_IPV6_NODE, &no_bgp_maxpaths_ibgp_cmd);
165b5fff 10191
718e3744 10192 /* "timers bgp" commands. */
10193 install_element (BGP_NODE, &bgp_timers_cmd);
10194 install_element (BGP_NODE, &no_bgp_timers_cmd);
718e3744 10195
5fe9f963 10196 /* route-map delay-timer commands - per instance for backwards compat. */
518f0eb1
DS
10197 install_element (BGP_NODE, &bgp_set_route_map_delay_timer_cmd);
10198 install_element (BGP_NODE, &no_bgp_set_route_map_delay_timer_cmd);
10199
718e3744 10200 /* "bgp client-to-client reflection" commands */
10201 install_element (BGP_NODE, &no_bgp_client_to_client_reflection_cmd);
10202 install_element (BGP_NODE, &bgp_client_to_client_reflection_cmd);
10203
10204 /* "bgp always-compare-med" commands */
10205 install_element (BGP_NODE, &bgp_always_compare_med_cmd);
10206 install_element (BGP_NODE, &no_bgp_always_compare_med_cmd);
e52702f2 10207
718e3744 10208 /* "bgp deterministic-med" commands */
10209 install_element (BGP_NODE, &bgp_deterministic_med_cmd);
10210 install_element (BGP_NODE, &no_bgp_deterministic_med_cmd);
538621f2 10211
538621f2 10212 /* "bgp graceful-restart" commands */
10213 install_element (BGP_NODE, &bgp_graceful_restart_cmd);
10214 install_element (BGP_NODE, &no_bgp_graceful_restart_cmd);
93406d87 10215 install_element (BGP_NODE, &bgp_graceful_restart_stalepath_time_cmd);
10216 install_element (BGP_NODE, &no_bgp_graceful_restart_stalepath_time_cmd);
eb6f1b41
PG
10217 install_element (BGP_NODE, &bgp_graceful_restart_restart_time_cmd);
10218 install_element (BGP_NODE, &no_bgp_graceful_restart_restart_time_cmd);
e52702f2 10219
43fc21b3
JC
10220 install_element (BGP_NODE, &bgp_graceful_restart_preserve_fw_cmd);
10221 install_element (BGP_NODE, &no_bgp_graceful_restart_preserve_fw_cmd);
10222
718e3744 10223 /* "bgp fast-external-failover" commands */
10224 install_element (BGP_NODE, &bgp_fast_external_failover_cmd);
10225 install_element (BGP_NODE, &no_bgp_fast_external_failover_cmd);
10226
10227 /* "bgp enforce-first-as" commands */
10228 install_element (BGP_NODE, &bgp_enforce_first_as_cmd);
10229 install_element (BGP_NODE, &no_bgp_enforce_first_as_cmd);
10230
10231 /* "bgp bestpath compare-routerid" commands */
10232 install_element (BGP_NODE, &bgp_bestpath_compare_router_id_cmd);
10233 install_element (BGP_NODE, &no_bgp_bestpath_compare_router_id_cmd);
10234
10235 /* "bgp bestpath as-path ignore" commands */
10236 install_element (BGP_NODE, &bgp_bestpath_aspath_ignore_cmd);
10237 install_element (BGP_NODE, &no_bgp_bestpath_aspath_ignore_cmd);
10238
6811845b 10239 /* "bgp bestpath as-path confed" commands */
10240 install_element (BGP_NODE, &bgp_bestpath_aspath_confed_cmd);
10241 install_element (BGP_NODE, &no_bgp_bestpath_aspath_confed_cmd);
10242
2fdd455c
PM
10243 /* "bgp bestpath as-path multipath-relax" commands */
10244 install_element (BGP_NODE, &bgp_bestpath_aspath_multipath_relax_cmd);
10245 install_element (BGP_NODE, &no_bgp_bestpath_aspath_multipath_relax_cmd);
10246
848973c7 10247 /* "bgp log-neighbor-changes" commands */
10248 install_element (BGP_NODE, &bgp_log_neighbor_changes_cmd);
10249 install_element (BGP_NODE, &no_bgp_log_neighbor_changes_cmd);
10250
718e3744 10251 /* "bgp bestpath med" commands */
10252 install_element (BGP_NODE, &bgp_bestpath_med_cmd);
718e3744 10253 install_element (BGP_NODE, &no_bgp_bestpath_med_cmd);
718e3744 10254
10255 /* "no bgp default ipv4-unicast" commands. */
10256 install_element (BGP_NODE, &no_bgp_default_ipv4_unicast_cmd);
10257 install_element (BGP_NODE, &bgp_default_ipv4_unicast_cmd);
e52702f2 10258
718e3744 10259 /* "bgp network import-check" commands. */
10260 install_element (BGP_NODE, &bgp_network_import_check_cmd);
8233ef81 10261 install_element (BGP_NODE, &bgp_network_import_check_exact_cmd);
718e3744 10262 install_element (BGP_NODE, &no_bgp_network_import_check_cmd);
10263
10264 /* "bgp default local-preference" commands. */
10265 install_element (BGP_NODE, &bgp_default_local_preference_cmd);
10266 install_element (BGP_NODE, &no_bgp_default_local_preference_cmd);
718e3744 10267
04b6bdc0
DW
10268 /* bgp default show-hostname */
10269 install_element (BGP_NODE, &bgp_default_show_hostname_cmd);
10270 install_element (BGP_NODE, &no_bgp_default_show_hostname_cmd);
10271
3f9c7369
DS
10272 /* "bgp default subgroup-pkt-queue-max" commands. */
10273 install_element (BGP_NODE, &bgp_default_subgroup_pkt_queue_max_cmd);
10274 install_element (BGP_NODE, &no_bgp_default_subgroup_pkt_queue_max_cmd);
10275
8bd9d948
DS
10276 /* bgp ibgp-allow-policy-mods command */
10277 install_element (BGP_NODE, &bgp_rr_allow_outbound_policy_cmd);
10278 install_element (BGP_NODE, &no_bgp_rr_allow_outbound_policy_cmd);
10279
f14e6fdb
DS
10280 /* "bgp listen limit" commands. */
10281 install_element (BGP_NODE, &bgp_listen_limit_cmd);
10282 install_element (BGP_NODE, &no_bgp_listen_limit_cmd);
10283
10284 /* "bgp listen range" commands. */
10285 install_element (BGP_NODE, &bgp_listen_range_cmd);
10286 install_element (BGP_NODE, &no_bgp_listen_range_cmd);
10287
718e3744 10288 /* "neighbor remote-as" commands. */
10289 install_element (BGP_NODE, &neighbor_remote_as_cmd);
a80beece 10290 install_element (BGP_NODE, &neighbor_interface_config_cmd);
4c48cf63 10291 install_element (BGP_NODE, &neighbor_interface_config_v6only_cmd);
b3a39dc5
DD
10292 install_element (BGP_NODE, &neighbor_interface_config_remote_as_cmd);
10293 install_element (BGP_NODE, &neighbor_interface_v6only_config_remote_as_cmd);
718e3744 10294 install_element (BGP_NODE, &no_neighbor_cmd);
a80beece 10295 install_element (BGP_NODE, &no_neighbor_interface_config_cmd);
718e3744 10296
10297 /* "neighbor peer-group" commands. */
10298 install_element (BGP_NODE, &neighbor_peer_group_cmd);
10299 install_element (BGP_NODE, &no_neighbor_peer_group_cmd);
a80beece 10300 install_element (BGP_NODE, &no_neighbor_interface_peer_group_remote_as_cmd);
718e3744 10301
10302 /* "neighbor local-as" commands. */
10303 install_element (BGP_NODE, &neighbor_local_as_cmd);
10304 install_element (BGP_NODE, &neighbor_local_as_no_prepend_cmd);
9d3f9705 10305 install_element (BGP_NODE, &neighbor_local_as_no_prepend_replace_as_cmd);
718e3744 10306 install_element (BGP_NODE, &no_neighbor_local_as_cmd);
718e3744 10307
3f9c7369
DS
10308 /* "neighbor solo" commands. */
10309 install_element (BGP_NODE, &neighbor_solo_cmd);
10310 install_element (BGP_NODE, &no_neighbor_solo_cmd);
10311
0df7c91f
PJ
10312 /* "neighbor password" commands. */
10313 install_element (BGP_NODE, &neighbor_password_cmd);
10314 install_element (BGP_NODE, &no_neighbor_password_cmd);
10315
718e3744 10316 /* "neighbor activate" commands. */
10317 install_element (BGP_NODE, &neighbor_activate_cmd);
10318 install_element (BGP_IPV4_NODE, &neighbor_activate_cmd);
10319 install_element (BGP_IPV4M_NODE, &neighbor_activate_cmd);
10320 install_element (BGP_IPV6_NODE, &neighbor_activate_cmd);
25ffbdc1 10321 install_element (BGP_IPV6M_NODE, &neighbor_activate_cmd);
718e3744 10322 install_element (BGP_VPNV4_NODE, &neighbor_activate_cmd);
8ecd3266 10323 install_element (BGP_VPNV6_NODE, &neighbor_activate_cmd);
8b1fb8be
LB
10324 install_element (BGP_ENCAP_NODE, &neighbor_activate_cmd);
10325 install_element (BGP_ENCAPV6_NODE, &neighbor_activate_cmd);
4e0b7b6d 10326 install_element (BGP_EVPN_NODE, &neighbor_activate_cmd);
718e3744 10327
10328 /* "no neighbor activate" commands. */
10329 install_element (BGP_NODE, &no_neighbor_activate_cmd);
10330 install_element (BGP_IPV4_NODE, &no_neighbor_activate_cmd);
10331 install_element (BGP_IPV4M_NODE, &no_neighbor_activate_cmd);
10332 install_element (BGP_IPV6_NODE, &no_neighbor_activate_cmd);
25ffbdc1 10333 install_element (BGP_IPV6M_NODE, &no_neighbor_activate_cmd);
718e3744 10334 install_element (BGP_VPNV4_NODE, &no_neighbor_activate_cmd);
8ecd3266 10335 install_element (BGP_VPNV6_NODE, &no_neighbor_activate_cmd);
8b1fb8be
LB
10336 install_element (BGP_ENCAP_NODE, &no_neighbor_activate_cmd);
10337 install_element (BGP_ENCAPV6_NODE, &no_neighbor_activate_cmd);
4e0b7b6d 10338 install_element (BGP_EVPN_NODE, &no_neighbor_activate_cmd);
718e3744 10339
c8560b44
DW
10340 /* "neighbor peer-group" set commands.
10341 * Long term we should only accept this command under BGP_NODE and not all of
10342 * the afi/safi sub-contexts. For now though we need to accept it for backwards
10343 * compatibility. This changed when we stopped requiring that peers be assigned
10344 * to their peer-group under each address-family sub-context.
10345 */
718e3744 10346 install_element (BGP_NODE, &neighbor_set_peer_group_cmd);
10347 install_element (BGP_IPV4_NODE, &neighbor_set_peer_group_cmd);
10348 install_element (BGP_IPV4M_NODE, &neighbor_set_peer_group_cmd);
10349 install_element (BGP_IPV6_NODE, &neighbor_set_peer_group_cmd);
25ffbdc1 10350 install_element (BGP_IPV6M_NODE, &neighbor_set_peer_group_cmd);
a58545bb 10351 install_element (BGP_VPNV4_NODE, &neighbor_set_peer_group_cmd);
8ecd3266 10352 install_element (BGP_VPNV6_NODE, &neighbor_set_peer_group_cmd);
8b1fb8be
LB
10353 install_element (BGP_ENCAP_NODE, &neighbor_set_peer_group_cmd);
10354 install_element (BGP_ENCAPV6_NODE, &neighbor_set_peer_group_cmd);
c8560b44 10355
718e3744 10356 /* "no neighbor peer-group unset" commands. */
10357 install_element (BGP_NODE, &no_neighbor_set_peer_group_cmd);
10358 install_element (BGP_IPV4_NODE, &no_neighbor_set_peer_group_cmd);
10359 install_element (BGP_IPV4M_NODE, &no_neighbor_set_peer_group_cmd);
10360 install_element (BGP_IPV6_NODE, &no_neighbor_set_peer_group_cmd);
25ffbdc1 10361 install_element (BGP_IPV6M_NODE, &no_neighbor_set_peer_group_cmd);
a58545bb 10362 install_element (BGP_VPNV4_NODE, &no_neighbor_set_peer_group_cmd);
8ecd3266 10363 install_element (BGP_VPNV6_NODE, &no_neighbor_set_peer_group_cmd);
8b1fb8be
LB
10364 install_element (BGP_ENCAP_NODE, &no_neighbor_set_peer_group_cmd);
10365 install_element (BGP_ENCAPV6_NODE, &no_neighbor_set_peer_group_cmd);
e52702f2 10366
718e3744 10367 /* "neighbor softreconfiguration inbound" commands.*/
10368 install_element (BGP_NODE, &neighbor_soft_reconfiguration_cmd);
10369 install_element (BGP_NODE, &no_neighbor_soft_reconfiguration_cmd);
10370 install_element (BGP_IPV4_NODE, &neighbor_soft_reconfiguration_cmd);
10371 install_element (BGP_IPV4_NODE, &no_neighbor_soft_reconfiguration_cmd);
10372 install_element (BGP_IPV4M_NODE, &neighbor_soft_reconfiguration_cmd);
10373 install_element (BGP_IPV4M_NODE, &no_neighbor_soft_reconfiguration_cmd);
10374 install_element (BGP_IPV6_NODE, &neighbor_soft_reconfiguration_cmd);
10375 install_element (BGP_IPV6_NODE, &no_neighbor_soft_reconfiguration_cmd);
25ffbdc1 10376 install_element (BGP_IPV6M_NODE, &neighbor_soft_reconfiguration_cmd);
10377 install_element (BGP_IPV6M_NODE, &no_neighbor_soft_reconfiguration_cmd);
a58545bb 10378 install_element (BGP_VPNV4_NODE, &neighbor_soft_reconfiguration_cmd);
10379 install_element (BGP_VPNV4_NODE, &no_neighbor_soft_reconfiguration_cmd);
8ecd3266 10380 install_element (BGP_VPNV6_NODE, &neighbor_soft_reconfiguration_cmd);
10381 install_element (BGP_VPNV6_NODE, &no_neighbor_soft_reconfiguration_cmd);
8b1fb8be
LB
10382 install_element (BGP_ENCAP_NODE, &neighbor_soft_reconfiguration_cmd);
10383 install_element (BGP_ENCAP_NODE, &no_neighbor_soft_reconfiguration_cmd);
10384 install_element (BGP_ENCAPV6_NODE, &neighbor_soft_reconfiguration_cmd);
10385 install_element (BGP_ENCAPV6_NODE, &no_neighbor_soft_reconfiguration_cmd);
718e3744 10386
10387 /* "neighbor attribute-unchanged" commands. */
10388 install_element (BGP_NODE, &neighbor_attr_unchanged_cmd);
718e3744 10389 install_element (BGP_NODE, &no_neighbor_attr_unchanged_cmd);
718e3744 10390 install_element (BGP_IPV4_NODE, &neighbor_attr_unchanged_cmd);
718e3744 10391 install_element (BGP_IPV4_NODE, &no_neighbor_attr_unchanged_cmd);
718e3744 10392 install_element (BGP_IPV4M_NODE, &neighbor_attr_unchanged_cmd);
718e3744 10393 install_element (BGP_IPV4M_NODE, &no_neighbor_attr_unchanged_cmd);
718e3744 10394 install_element (BGP_IPV6_NODE, &neighbor_attr_unchanged_cmd);
718e3744 10395 install_element (BGP_IPV6_NODE, &no_neighbor_attr_unchanged_cmd);
25ffbdc1 10396 install_element (BGP_IPV6M_NODE, &neighbor_attr_unchanged_cmd);
25ffbdc1 10397 install_element (BGP_IPV6M_NODE, &no_neighbor_attr_unchanged_cmd);
718e3744 10398 install_element (BGP_VPNV4_NODE, &neighbor_attr_unchanged_cmd);
718e3744 10399 install_element (BGP_VPNV4_NODE, &no_neighbor_attr_unchanged_cmd);
8ecd3266 10400 install_element (BGP_VPNV6_NODE, &neighbor_attr_unchanged_cmd);
8ecd3266 10401 install_element (BGP_VPNV6_NODE, &no_neighbor_attr_unchanged_cmd);
8ecd3266 10402
8b1fb8be 10403 install_element (BGP_ENCAP_NODE, &neighbor_attr_unchanged_cmd);
8b1fb8be 10404 install_element (BGP_ENCAP_NODE, &no_neighbor_attr_unchanged_cmd);
8b1fb8be
LB
10405
10406 install_element (BGP_ENCAPV6_NODE, &neighbor_attr_unchanged_cmd);
8b1fb8be 10407 install_element (BGP_ENCAPV6_NODE, &no_neighbor_attr_unchanged_cmd);
718e3744 10408
4e0b7b6d
PG
10409 install_element (BGP_EVPN_NODE, &neighbor_attr_unchanged_cmd);
10410 install_element (BGP_EVPN_NODE, &no_neighbor_attr_unchanged_cmd);
10411
fee0f4c6 10412 /* "nexthop-local unchanged" commands */
10413 install_element (BGP_IPV6_NODE, &neighbor_nexthop_local_unchanged_cmd);
10414 install_element (BGP_IPV6_NODE, &no_neighbor_nexthop_local_unchanged_cmd);
10415
718e3744 10416 /* "neighbor next-hop-self" commands. */
10417 install_element (BGP_NODE, &neighbor_nexthop_self_cmd);
10418 install_element (BGP_NODE, &no_neighbor_nexthop_self_cmd);
10419 install_element (BGP_IPV4_NODE, &neighbor_nexthop_self_cmd);
10420 install_element (BGP_IPV4_NODE, &no_neighbor_nexthop_self_cmd);
10421 install_element (BGP_IPV4M_NODE, &neighbor_nexthop_self_cmd);
10422 install_element (BGP_IPV4M_NODE, &no_neighbor_nexthop_self_cmd);
10423 install_element (BGP_IPV6_NODE, &neighbor_nexthop_self_cmd);
10424 install_element (BGP_IPV6_NODE, &no_neighbor_nexthop_self_cmd);
25ffbdc1 10425 install_element (BGP_IPV6M_NODE, &neighbor_nexthop_self_cmd);
10426 install_element (BGP_IPV6M_NODE, &no_neighbor_nexthop_self_cmd);
718e3744 10427 install_element (BGP_VPNV4_NODE, &neighbor_nexthop_self_cmd);
10428 install_element (BGP_VPNV4_NODE, &no_neighbor_nexthop_self_cmd);
8ecd3266 10429 install_element (BGP_VPNV6_NODE, &neighbor_nexthop_self_cmd);
10430 install_element (BGP_VPNV6_NODE, &no_neighbor_nexthop_self_cmd);
8b1fb8be
LB
10431 install_element (BGP_ENCAP_NODE, &neighbor_nexthop_self_cmd);
10432 install_element (BGP_ENCAP_NODE, &no_neighbor_nexthop_self_cmd);
10433 install_element (BGP_ENCAPV6_NODE, &neighbor_nexthop_self_cmd);
10434 install_element (BGP_ENCAPV6_NODE, &no_neighbor_nexthop_self_cmd);
718e3744 10435
a538debe
DS
10436 /* "neighbor next-hop-self force" commands. */
10437 install_element (BGP_NODE, &neighbor_nexthop_self_force_cmd);
10438 install_element (BGP_NODE, &no_neighbor_nexthop_self_force_cmd);
10439 install_element (BGP_IPV4_NODE, &neighbor_nexthop_self_force_cmd);
10440 install_element (BGP_IPV4_NODE, &no_neighbor_nexthop_self_force_cmd);
10441 install_element (BGP_IPV4M_NODE, &neighbor_nexthop_self_force_cmd);
10442 install_element (BGP_IPV4M_NODE, &no_neighbor_nexthop_self_force_cmd);
10443 install_element (BGP_IPV6_NODE, &neighbor_nexthop_self_force_cmd);
10444 install_element (BGP_IPV6_NODE, &no_neighbor_nexthop_self_force_cmd);
10445 install_element (BGP_IPV6M_NODE, &neighbor_nexthop_self_force_cmd);
10446 install_element (BGP_IPV6M_NODE, &no_neighbor_nexthop_self_force_cmd);
10447 install_element (BGP_VPNV4_NODE, &neighbor_nexthop_self_force_cmd);
10448 install_element (BGP_VPNV4_NODE, &no_neighbor_nexthop_self_force_cmd);
8ecd3266 10449 install_element (BGP_VPNV6_NODE, &neighbor_nexthop_self_force_cmd);
10450 install_element (BGP_VPNV6_NODE, &no_neighbor_nexthop_self_force_cmd);
a538debe 10451
c7122e14
DS
10452 /* "neighbor as-override" commands. */
10453 install_element (BGP_NODE, &neighbor_as_override_cmd);
10454 install_element (BGP_NODE, &no_neighbor_as_override_cmd);
10455 install_element (BGP_IPV4_NODE, &neighbor_as_override_cmd);
10456 install_element (BGP_IPV4_NODE, &no_neighbor_as_override_cmd);
10457 install_element (BGP_IPV4M_NODE, &neighbor_as_override_cmd);
10458 install_element (BGP_IPV4M_NODE, &no_neighbor_as_override_cmd);
10459 install_element (BGP_IPV6_NODE, &neighbor_as_override_cmd);
10460 install_element (BGP_IPV6_NODE, &no_neighbor_as_override_cmd);
10461 install_element (BGP_IPV6M_NODE, &neighbor_as_override_cmd);
10462 install_element (BGP_IPV6M_NODE, &no_neighbor_as_override_cmd);
10463 install_element (BGP_VPNV4_NODE, &neighbor_as_override_cmd);
10464 install_element (BGP_VPNV4_NODE, &no_neighbor_as_override_cmd);
8ecd3266 10465 install_element (BGP_VPNV6_NODE, &neighbor_as_override_cmd);
10466 install_element (BGP_VPNV6_NODE, &no_neighbor_as_override_cmd);
c7122e14 10467
718e3744 10468 /* "neighbor remove-private-AS" commands. */
10469 install_element (BGP_NODE, &neighbor_remove_private_as_cmd);
10470 install_element (BGP_NODE, &no_neighbor_remove_private_as_cmd);
5000f21c
DS
10471 install_element (BGP_NODE, &neighbor_remove_private_as_all_cmd);
10472 install_element (BGP_NODE, &no_neighbor_remove_private_as_all_cmd);
10473 install_element (BGP_NODE, &neighbor_remove_private_as_replace_as_cmd);
10474 install_element (BGP_NODE, &no_neighbor_remove_private_as_replace_as_cmd);
10475 install_element (BGP_NODE, &neighbor_remove_private_as_all_replace_as_cmd);
10476 install_element (BGP_NODE, &no_neighbor_remove_private_as_all_replace_as_cmd);
718e3744 10477 install_element (BGP_IPV4_NODE, &neighbor_remove_private_as_cmd);
10478 install_element (BGP_IPV4_NODE, &no_neighbor_remove_private_as_cmd);
5000f21c
DS
10479 install_element (BGP_IPV4_NODE, &neighbor_remove_private_as_all_cmd);
10480 install_element (BGP_IPV4_NODE, &no_neighbor_remove_private_as_all_cmd);
10481 install_element (BGP_IPV4_NODE, &neighbor_remove_private_as_replace_as_cmd);
10482 install_element (BGP_IPV4_NODE, &no_neighbor_remove_private_as_replace_as_cmd);
10483 install_element (BGP_IPV4_NODE, &neighbor_remove_private_as_all_replace_as_cmd);
10484 install_element (BGP_IPV4_NODE, &no_neighbor_remove_private_as_all_replace_as_cmd);
718e3744 10485 install_element (BGP_IPV4M_NODE, &neighbor_remove_private_as_cmd);
10486 install_element (BGP_IPV4M_NODE, &no_neighbor_remove_private_as_cmd);
5000f21c
DS
10487 install_element (BGP_IPV4M_NODE, &neighbor_remove_private_as_all_cmd);
10488 install_element (BGP_IPV4M_NODE, &no_neighbor_remove_private_as_all_cmd);
10489 install_element (BGP_IPV4M_NODE, &neighbor_remove_private_as_replace_as_cmd);
10490 install_element (BGP_IPV4M_NODE, &no_neighbor_remove_private_as_replace_as_cmd);
10491 install_element (BGP_IPV4M_NODE, &neighbor_remove_private_as_all_replace_as_cmd);
10492 install_element (BGP_IPV4M_NODE, &no_neighbor_remove_private_as_all_replace_as_cmd);
718e3744 10493 install_element (BGP_IPV6_NODE, &neighbor_remove_private_as_cmd);
10494 install_element (BGP_IPV6_NODE, &no_neighbor_remove_private_as_cmd);
5000f21c
DS
10495 install_element (BGP_IPV6_NODE, &neighbor_remove_private_as_all_cmd);
10496 install_element (BGP_IPV6_NODE, &no_neighbor_remove_private_as_all_cmd);
10497 install_element (BGP_IPV6_NODE, &neighbor_remove_private_as_replace_as_cmd);
10498 install_element (BGP_IPV6_NODE, &no_neighbor_remove_private_as_replace_as_cmd);
10499 install_element (BGP_IPV6_NODE, &neighbor_remove_private_as_all_replace_as_cmd);
10500 install_element (BGP_IPV6_NODE, &no_neighbor_remove_private_as_all_replace_as_cmd);
25ffbdc1 10501 install_element (BGP_IPV6M_NODE, &neighbor_remove_private_as_cmd);
10502 install_element (BGP_IPV6M_NODE, &no_neighbor_remove_private_as_cmd);
5000f21c
DS
10503 install_element (BGP_IPV6M_NODE, &neighbor_remove_private_as_all_cmd);
10504 install_element (BGP_IPV6M_NODE, &no_neighbor_remove_private_as_all_cmd);
10505 install_element (BGP_IPV6M_NODE, &neighbor_remove_private_as_replace_as_cmd);
10506 install_element (BGP_IPV6M_NODE, &no_neighbor_remove_private_as_replace_as_cmd);
10507 install_element (BGP_IPV6M_NODE, &neighbor_remove_private_as_all_replace_as_cmd);
10508 install_element (BGP_IPV6M_NODE, &no_neighbor_remove_private_as_all_replace_as_cmd);
718e3744 10509 install_element (BGP_VPNV4_NODE, &neighbor_remove_private_as_cmd);
10510 install_element (BGP_VPNV4_NODE, &no_neighbor_remove_private_as_cmd);
5000f21c
DS
10511 install_element (BGP_VPNV4_NODE, &neighbor_remove_private_as_all_cmd);
10512 install_element (BGP_VPNV4_NODE, &no_neighbor_remove_private_as_all_cmd);
10513 install_element (BGP_VPNV4_NODE, &neighbor_remove_private_as_replace_as_cmd);
10514 install_element (BGP_VPNV4_NODE, &no_neighbor_remove_private_as_replace_as_cmd);
10515 install_element (BGP_VPNV4_NODE, &neighbor_remove_private_as_all_replace_as_cmd);
10516 install_element (BGP_VPNV4_NODE, &no_neighbor_remove_private_as_all_replace_as_cmd);
8ecd3266 10517 install_element (BGP_VPNV6_NODE, &neighbor_remove_private_as_cmd);
10518 install_element (BGP_VPNV6_NODE, &no_neighbor_remove_private_as_cmd);
10519 install_element (BGP_VPNV6_NODE, &neighbor_remove_private_as_all_cmd);
10520 install_element (BGP_VPNV6_NODE, &no_neighbor_remove_private_as_all_cmd);
10521 install_element (BGP_VPNV6_NODE, &neighbor_remove_private_as_replace_as_cmd);
10522 install_element (BGP_VPNV6_NODE, &no_neighbor_remove_private_as_replace_as_cmd);
10523 install_element (BGP_VPNV6_NODE, &neighbor_remove_private_as_all_replace_as_cmd);
10524 install_element (BGP_VPNV6_NODE, &no_neighbor_remove_private_as_all_replace_as_cmd);
8b1fb8be
LB
10525 install_element (BGP_ENCAP_NODE, &neighbor_remove_private_as_cmd);
10526 install_element (BGP_ENCAP_NODE, &no_neighbor_remove_private_as_cmd);
10527 install_element (BGP_ENCAPV6_NODE, &neighbor_remove_private_as_cmd);
10528 install_element (BGP_ENCAPV6_NODE, &no_neighbor_remove_private_as_cmd);
718e3744 10529
10530 /* "neighbor send-community" commands.*/
10531 install_element (BGP_NODE, &neighbor_send_community_cmd);
10532 install_element (BGP_NODE, &neighbor_send_community_type_cmd);
10533 install_element (BGP_NODE, &no_neighbor_send_community_cmd);
10534 install_element (BGP_NODE, &no_neighbor_send_community_type_cmd);
10535 install_element (BGP_IPV4_NODE, &neighbor_send_community_cmd);
10536 install_element (BGP_IPV4_NODE, &neighbor_send_community_type_cmd);
10537 install_element (BGP_IPV4_NODE, &no_neighbor_send_community_cmd);
10538 install_element (BGP_IPV4_NODE, &no_neighbor_send_community_type_cmd);
10539 install_element (BGP_IPV4M_NODE, &neighbor_send_community_cmd);
10540 install_element (BGP_IPV4M_NODE, &neighbor_send_community_type_cmd);
10541 install_element (BGP_IPV4M_NODE, &no_neighbor_send_community_cmd);
10542 install_element (BGP_IPV4M_NODE, &no_neighbor_send_community_type_cmd);
10543 install_element (BGP_IPV6_NODE, &neighbor_send_community_cmd);
10544 install_element (BGP_IPV6_NODE, &neighbor_send_community_type_cmd);
10545 install_element (BGP_IPV6_NODE, &no_neighbor_send_community_cmd);
10546 install_element (BGP_IPV6_NODE, &no_neighbor_send_community_type_cmd);
25ffbdc1 10547 install_element (BGP_IPV6M_NODE, &neighbor_send_community_cmd);
10548 install_element (BGP_IPV6M_NODE, &neighbor_send_community_type_cmd);
10549 install_element (BGP_IPV6M_NODE, &no_neighbor_send_community_cmd);
10550 install_element (BGP_IPV6M_NODE, &no_neighbor_send_community_type_cmd);
718e3744 10551 install_element (BGP_VPNV4_NODE, &neighbor_send_community_cmd);
10552 install_element (BGP_VPNV4_NODE, &neighbor_send_community_type_cmd);
10553 install_element (BGP_VPNV4_NODE, &no_neighbor_send_community_cmd);
10554 install_element (BGP_VPNV4_NODE, &no_neighbor_send_community_type_cmd);
8ecd3266 10555 install_element (BGP_VPNV6_NODE, &neighbor_send_community_cmd);
10556 install_element (BGP_VPNV6_NODE, &neighbor_send_community_type_cmd);
10557 install_element (BGP_VPNV6_NODE, &no_neighbor_send_community_cmd);
10558 install_element (BGP_VPNV6_NODE, &no_neighbor_send_community_type_cmd);
8b1fb8be
LB
10559 install_element (BGP_ENCAP_NODE, &neighbor_send_community_cmd);
10560 install_element (BGP_ENCAP_NODE, &neighbor_send_community_type_cmd);
10561 install_element (BGP_ENCAP_NODE, &no_neighbor_send_community_cmd);
10562 install_element (BGP_ENCAP_NODE, &no_neighbor_send_community_type_cmd);
10563 install_element (BGP_ENCAPV6_NODE, &neighbor_send_community_cmd);
10564 install_element (BGP_ENCAPV6_NODE, &neighbor_send_community_type_cmd);
10565 install_element (BGP_ENCAPV6_NODE, &no_neighbor_send_community_cmd);
10566 install_element (BGP_ENCAPV6_NODE, &no_neighbor_send_community_type_cmd);
718e3744 10567
10568 /* "neighbor route-reflector" commands.*/
10569 install_element (BGP_NODE, &neighbor_route_reflector_client_cmd);
10570 install_element (BGP_NODE, &no_neighbor_route_reflector_client_cmd);
10571 install_element (BGP_IPV4_NODE, &neighbor_route_reflector_client_cmd);
10572 install_element (BGP_IPV4_NODE, &no_neighbor_route_reflector_client_cmd);
10573 install_element (BGP_IPV4M_NODE, &neighbor_route_reflector_client_cmd);
10574 install_element (BGP_IPV4M_NODE, &no_neighbor_route_reflector_client_cmd);
10575 install_element (BGP_IPV6_NODE, &neighbor_route_reflector_client_cmd);
10576 install_element (BGP_IPV6_NODE, &no_neighbor_route_reflector_client_cmd);
25ffbdc1 10577 install_element (BGP_IPV6M_NODE, &neighbor_route_reflector_client_cmd);
10578 install_element (BGP_IPV6M_NODE, &no_neighbor_route_reflector_client_cmd);
718e3744 10579 install_element (BGP_VPNV4_NODE, &neighbor_route_reflector_client_cmd);
10580 install_element (BGP_VPNV4_NODE, &no_neighbor_route_reflector_client_cmd);
8ecd3266 10581 install_element (BGP_VPNV6_NODE, &neighbor_route_reflector_client_cmd);
10582 install_element (BGP_VPNV6_NODE, &no_neighbor_route_reflector_client_cmd);
8b1fb8be
LB
10583 install_element (BGP_ENCAP_NODE, &neighbor_route_reflector_client_cmd);
10584 install_element (BGP_ENCAP_NODE, &no_neighbor_route_reflector_client_cmd);
10585 install_element (BGP_ENCAPV6_NODE, &neighbor_route_reflector_client_cmd);
10586 install_element (BGP_ENCAPV6_NODE, &no_neighbor_route_reflector_client_cmd);
718e3744 10587
10588 /* "neighbor route-server" commands.*/
10589 install_element (BGP_NODE, &neighbor_route_server_client_cmd);
10590 install_element (BGP_NODE, &no_neighbor_route_server_client_cmd);
10591 install_element (BGP_IPV4_NODE, &neighbor_route_server_client_cmd);
10592 install_element (BGP_IPV4_NODE, &no_neighbor_route_server_client_cmd);
10593 install_element (BGP_IPV4M_NODE, &neighbor_route_server_client_cmd);
10594 install_element (BGP_IPV4M_NODE, &no_neighbor_route_server_client_cmd);
10595 install_element (BGP_IPV6_NODE, &neighbor_route_server_client_cmd);
10596 install_element (BGP_IPV6_NODE, &no_neighbor_route_server_client_cmd);
25ffbdc1 10597 install_element (BGP_IPV6M_NODE, &neighbor_route_server_client_cmd);
10598 install_element (BGP_IPV6M_NODE, &no_neighbor_route_server_client_cmd);
718e3744 10599 install_element (BGP_VPNV4_NODE, &neighbor_route_server_client_cmd);
10600 install_element (BGP_VPNV4_NODE, &no_neighbor_route_server_client_cmd);
8ecd3266 10601 install_element (BGP_VPNV6_NODE, &neighbor_route_server_client_cmd);
10602 install_element (BGP_VPNV6_NODE, &no_neighbor_route_server_client_cmd);
8b1fb8be
LB
10603 install_element (BGP_ENCAP_NODE, &neighbor_route_server_client_cmd);
10604 install_element (BGP_ENCAP_NODE, &no_neighbor_route_server_client_cmd);
10605 install_element (BGP_ENCAPV6_NODE, &neighbor_route_server_client_cmd);
10606 install_element (BGP_ENCAPV6_NODE, &no_neighbor_route_server_client_cmd);
718e3744 10607
adbac85e
DW
10608 /* "neighbor addpath-tx-all-paths" commands.*/
10609 install_element (BGP_NODE, &neighbor_addpath_tx_all_paths_cmd);
10610 install_element (BGP_NODE, &no_neighbor_addpath_tx_all_paths_cmd);
10611 install_element (BGP_IPV4_NODE, &neighbor_addpath_tx_all_paths_cmd);
10612 install_element (BGP_IPV4_NODE, &no_neighbor_addpath_tx_all_paths_cmd);
10613 install_element (BGP_IPV4M_NODE, &neighbor_addpath_tx_all_paths_cmd);
10614 install_element (BGP_IPV4M_NODE, &no_neighbor_addpath_tx_all_paths_cmd);
10615 install_element (BGP_IPV6_NODE, &neighbor_addpath_tx_all_paths_cmd);
10616 install_element (BGP_IPV6_NODE, &no_neighbor_addpath_tx_all_paths_cmd);
10617 install_element (BGP_IPV6M_NODE, &neighbor_addpath_tx_all_paths_cmd);
10618 install_element (BGP_IPV6M_NODE, &no_neighbor_addpath_tx_all_paths_cmd);
10619 install_element (BGP_VPNV4_NODE, &neighbor_addpath_tx_all_paths_cmd);
10620 install_element (BGP_VPNV4_NODE, &no_neighbor_addpath_tx_all_paths_cmd);
8ecd3266 10621 install_element (BGP_VPNV6_NODE, &neighbor_addpath_tx_all_paths_cmd);
10622 install_element (BGP_VPNV6_NODE, &no_neighbor_addpath_tx_all_paths_cmd);
adbac85e 10623
06370dac
DW
10624 /* "neighbor addpath-tx-bestpath-per-AS" commands.*/
10625 install_element (BGP_NODE, &neighbor_addpath_tx_bestpath_per_as_cmd);
10626 install_element (BGP_NODE, &no_neighbor_addpath_tx_bestpath_per_as_cmd);
10627 install_element (BGP_IPV4_NODE, &neighbor_addpath_tx_bestpath_per_as_cmd);
10628 install_element (BGP_IPV4_NODE, &no_neighbor_addpath_tx_bestpath_per_as_cmd);
10629 install_element (BGP_IPV4M_NODE, &neighbor_addpath_tx_bestpath_per_as_cmd);
10630 install_element (BGP_IPV4M_NODE, &no_neighbor_addpath_tx_bestpath_per_as_cmd);
10631 install_element (BGP_IPV6_NODE, &neighbor_addpath_tx_bestpath_per_as_cmd);
10632 install_element (BGP_IPV6_NODE, &no_neighbor_addpath_tx_bestpath_per_as_cmd);
10633 install_element (BGP_IPV6M_NODE, &neighbor_addpath_tx_bestpath_per_as_cmd);
10634 install_element (BGP_IPV6M_NODE, &no_neighbor_addpath_tx_bestpath_per_as_cmd);
10635 install_element (BGP_VPNV4_NODE, &neighbor_addpath_tx_bestpath_per_as_cmd);
10636 install_element (BGP_VPNV4_NODE, &no_neighbor_addpath_tx_bestpath_per_as_cmd);
8ecd3266 10637 install_element (BGP_VPNV6_NODE, &neighbor_addpath_tx_bestpath_per_as_cmd);
10638 install_element (BGP_VPNV6_NODE, &no_neighbor_addpath_tx_bestpath_per_as_cmd);
06370dac 10639
718e3744 10640 /* "neighbor passive" commands. */
10641 install_element (BGP_NODE, &neighbor_passive_cmd);
10642 install_element (BGP_NODE, &no_neighbor_passive_cmd);
10643
d5a5c8f0 10644
718e3744 10645 /* "neighbor shutdown" commands. */
10646 install_element (BGP_NODE, &neighbor_shutdown_cmd);
10647 install_element (BGP_NODE, &no_neighbor_shutdown_cmd);
73d70fa6
DL
10648 install_element (BGP_NODE, &neighbor_shutdown_msg_cmd);
10649 install_element (BGP_NODE, &no_neighbor_shutdown_msg_cmd);
718e3744 10650
8a92a8a0
DS
10651 /* "neighbor capability extended-nexthop" commands.*/
10652 install_element (BGP_NODE, &neighbor_capability_enhe_cmd);
10653 install_element (BGP_NODE, &no_neighbor_capability_enhe_cmd);
10654
718e3744 10655 /* "neighbor capability orf prefix-list" commands.*/
10656 install_element (BGP_NODE, &neighbor_capability_orf_prefix_cmd);
10657 install_element (BGP_NODE, &no_neighbor_capability_orf_prefix_cmd);
10658 install_element (BGP_IPV4_NODE, &neighbor_capability_orf_prefix_cmd);
10659 install_element (BGP_IPV4_NODE, &no_neighbor_capability_orf_prefix_cmd);
10660 install_element (BGP_IPV4M_NODE, &neighbor_capability_orf_prefix_cmd);
10661 install_element (BGP_IPV4M_NODE, &no_neighbor_capability_orf_prefix_cmd);
10662 install_element (BGP_IPV6_NODE, &neighbor_capability_orf_prefix_cmd);
10663 install_element (BGP_IPV6_NODE, &no_neighbor_capability_orf_prefix_cmd);
25ffbdc1 10664 install_element (BGP_IPV6M_NODE, &neighbor_capability_orf_prefix_cmd);
10665 install_element (BGP_IPV6M_NODE, &no_neighbor_capability_orf_prefix_cmd);
718e3744 10666
10667 /* "neighbor capability dynamic" commands.*/
10668 install_element (BGP_NODE, &neighbor_capability_dynamic_cmd);
10669 install_element (BGP_NODE, &no_neighbor_capability_dynamic_cmd);
10670
10671 /* "neighbor dont-capability-negotiate" commands. */
10672 install_element (BGP_NODE, &neighbor_dont_capability_negotiate_cmd);
10673 install_element (BGP_NODE, &no_neighbor_dont_capability_negotiate_cmd);
10674
10675 /* "neighbor ebgp-multihop" commands. */
10676 install_element (BGP_NODE, &neighbor_ebgp_multihop_cmd);
10677 install_element (BGP_NODE, &neighbor_ebgp_multihop_ttl_cmd);
10678 install_element (BGP_NODE, &no_neighbor_ebgp_multihop_cmd);
718e3744 10679
6ffd2079 10680 /* "neighbor disable-connected-check" commands. */
10681 install_element (BGP_NODE, &neighbor_disable_connected_check_cmd);
10682 install_element (BGP_NODE, &no_neighbor_disable_connected_check_cmd);
718e3744 10683
10684 /* "neighbor description" commands. */
10685 install_element (BGP_NODE, &neighbor_description_cmd);
10686 install_element (BGP_NODE, &no_neighbor_description_cmd);
718e3744 10687
10688 /* "neighbor update-source" commands. "*/
10689 install_element (BGP_NODE, &neighbor_update_source_cmd);
10690 install_element (BGP_NODE, &no_neighbor_update_source_cmd);
10691
10692 /* "neighbor default-originate" commands. */
10693 install_element (BGP_NODE, &neighbor_default_originate_cmd);
10694 install_element (BGP_NODE, &neighbor_default_originate_rmap_cmd);
10695 install_element (BGP_NODE, &no_neighbor_default_originate_cmd);
718e3744 10696 install_element (BGP_IPV4_NODE, &neighbor_default_originate_cmd);
10697 install_element (BGP_IPV4_NODE, &neighbor_default_originate_rmap_cmd);
10698 install_element (BGP_IPV4_NODE, &no_neighbor_default_originate_cmd);
718e3744 10699 install_element (BGP_IPV4M_NODE, &neighbor_default_originate_cmd);
10700 install_element (BGP_IPV4M_NODE, &neighbor_default_originate_rmap_cmd);
10701 install_element (BGP_IPV4M_NODE, &no_neighbor_default_originate_cmd);
718e3744 10702 install_element (BGP_IPV6_NODE, &neighbor_default_originate_cmd);
10703 install_element (BGP_IPV6_NODE, &neighbor_default_originate_rmap_cmd);
10704 install_element (BGP_IPV6_NODE, &no_neighbor_default_originate_cmd);
25ffbdc1 10705 install_element (BGP_IPV6M_NODE, &neighbor_default_originate_cmd);
10706 install_element (BGP_IPV6M_NODE, &neighbor_default_originate_rmap_cmd);
10707 install_element (BGP_IPV6M_NODE, &no_neighbor_default_originate_cmd);
718e3744 10708
10709 /* "neighbor port" commands. */
10710 install_element (BGP_NODE, &neighbor_port_cmd);
10711 install_element (BGP_NODE, &no_neighbor_port_cmd);
718e3744 10712
10713 /* "neighbor weight" commands. */
10714 install_element (BGP_NODE, &neighbor_weight_cmd);
10715 install_element (BGP_NODE, &no_neighbor_weight_cmd);
718e3744 10716
d93f7ffc
DW
10717 install_element (BGP_IPV4_NODE, &neighbor_weight_cmd);
10718 install_element (BGP_IPV4_NODE, &no_neighbor_weight_cmd);
d93f7ffc
DW
10719 install_element (BGP_IPV4M_NODE, &neighbor_weight_cmd);
10720 install_element (BGP_IPV4M_NODE, &no_neighbor_weight_cmd);
d93f7ffc
DW
10721 install_element (BGP_IPV6_NODE, &neighbor_weight_cmd);
10722 install_element (BGP_IPV6_NODE, &no_neighbor_weight_cmd);
d93f7ffc
DW
10723 install_element (BGP_IPV6M_NODE, &neighbor_weight_cmd);
10724 install_element (BGP_IPV6M_NODE, &no_neighbor_weight_cmd);
d93f7ffc
DW
10725 install_element (BGP_VPNV4_NODE, &neighbor_weight_cmd);
10726 install_element (BGP_VPNV4_NODE, &no_neighbor_weight_cmd);
d93f7ffc
DW
10727 install_element (BGP_VPNV6_NODE, &neighbor_weight_cmd);
10728 install_element (BGP_VPNV6_NODE, &no_neighbor_weight_cmd);
d93f7ffc
DW
10729 install_element (BGP_ENCAP_NODE, &neighbor_weight_cmd);
10730 install_element (BGP_ENCAP_NODE, &no_neighbor_weight_cmd);
d93f7ffc
DW
10731 install_element (BGP_ENCAPV6_NODE, &neighbor_weight_cmd);
10732 install_element (BGP_ENCAPV6_NODE, &no_neighbor_weight_cmd);
718e3744 10733
10734 /* "neighbor override-capability" commands. */
10735 install_element (BGP_NODE, &neighbor_override_capability_cmd);
10736 install_element (BGP_NODE, &no_neighbor_override_capability_cmd);
10737
10738 /* "neighbor strict-capability-match" commands. */
10739 install_element (BGP_NODE, &neighbor_strict_capability_cmd);
10740 install_element (BGP_NODE, &no_neighbor_strict_capability_cmd);
10741
10742 /* "neighbor timers" commands. */
10743 install_element (BGP_NODE, &neighbor_timers_cmd);
10744 install_element (BGP_NODE, &no_neighbor_timers_cmd);
10745
10746 /* "neighbor timers connect" commands. */
10747 install_element (BGP_NODE, &neighbor_timers_connect_cmd);
10748 install_element (BGP_NODE, &no_neighbor_timers_connect_cmd);
718e3744 10749
10750 /* "neighbor advertisement-interval" commands. */
10751 install_element (BGP_NODE, &neighbor_advertise_interval_cmd);
10752 install_element (BGP_NODE, &no_neighbor_advertise_interval_cmd);
718e3744 10753
718e3744 10754 /* "neighbor interface" commands. */
10755 install_element (BGP_NODE, &neighbor_interface_cmd);
10756 install_element (BGP_NODE, &no_neighbor_interface_cmd);
10757
10758 /* "neighbor distribute" commands. */
10759 install_element (BGP_NODE, &neighbor_distribute_list_cmd);
10760 install_element (BGP_NODE, &no_neighbor_distribute_list_cmd);
10761 install_element (BGP_IPV4_NODE, &neighbor_distribute_list_cmd);
10762 install_element (BGP_IPV4_NODE, &no_neighbor_distribute_list_cmd);
10763 install_element (BGP_IPV4M_NODE, &neighbor_distribute_list_cmd);
10764 install_element (BGP_IPV4M_NODE, &no_neighbor_distribute_list_cmd);
10765 install_element (BGP_IPV6_NODE, &neighbor_distribute_list_cmd);
10766 install_element (BGP_IPV6_NODE, &no_neighbor_distribute_list_cmd);
25ffbdc1 10767 install_element (BGP_IPV6M_NODE, &neighbor_distribute_list_cmd);
10768 install_element (BGP_IPV6M_NODE, &no_neighbor_distribute_list_cmd);
718e3744 10769 install_element (BGP_VPNV4_NODE, &neighbor_distribute_list_cmd);
10770 install_element (BGP_VPNV4_NODE, &no_neighbor_distribute_list_cmd);
8ecd3266 10771 install_element (BGP_VPNV6_NODE, &neighbor_distribute_list_cmd);
10772 install_element (BGP_VPNV6_NODE, &no_neighbor_distribute_list_cmd);
8b1fb8be
LB
10773 install_element (BGP_ENCAP_NODE, &neighbor_distribute_list_cmd);
10774 install_element (BGP_ENCAP_NODE, &no_neighbor_distribute_list_cmd);
10775 install_element (BGP_ENCAPV6_NODE, &neighbor_distribute_list_cmd);
10776 install_element (BGP_ENCAPV6_NODE, &no_neighbor_distribute_list_cmd);
718e3744 10777
10778 /* "neighbor prefix-list" commands. */
10779 install_element (BGP_NODE, &neighbor_prefix_list_cmd);
10780 install_element (BGP_NODE, &no_neighbor_prefix_list_cmd);
10781 install_element (BGP_IPV4_NODE, &neighbor_prefix_list_cmd);
10782 install_element (BGP_IPV4_NODE, &no_neighbor_prefix_list_cmd);
10783 install_element (BGP_IPV4M_NODE, &neighbor_prefix_list_cmd);
10784 install_element (BGP_IPV4M_NODE, &no_neighbor_prefix_list_cmd);
10785 install_element (BGP_IPV6_NODE, &neighbor_prefix_list_cmd);
10786 install_element (BGP_IPV6_NODE, &no_neighbor_prefix_list_cmd);
25ffbdc1 10787 install_element (BGP_IPV6M_NODE, &neighbor_prefix_list_cmd);
10788 install_element (BGP_IPV6M_NODE, &no_neighbor_prefix_list_cmd);
718e3744 10789 install_element (BGP_VPNV4_NODE, &neighbor_prefix_list_cmd);
10790 install_element (BGP_VPNV4_NODE, &no_neighbor_prefix_list_cmd);
8ecd3266 10791 install_element (BGP_VPNV6_NODE, &neighbor_prefix_list_cmd);
10792 install_element (BGP_VPNV6_NODE, &no_neighbor_prefix_list_cmd);
8b1fb8be
LB
10793 install_element (BGP_ENCAP_NODE, &neighbor_prefix_list_cmd);
10794 install_element (BGP_ENCAP_NODE, &no_neighbor_prefix_list_cmd);
10795 install_element (BGP_ENCAPV6_NODE, &neighbor_prefix_list_cmd);
10796 install_element (BGP_ENCAPV6_NODE, &no_neighbor_prefix_list_cmd);
718e3744 10797
10798 /* "neighbor filter-list" commands. */
10799 install_element (BGP_NODE, &neighbor_filter_list_cmd);
10800 install_element (BGP_NODE, &no_neighbor_filter_list_cmd);
10801 install_element (BGP_IPV4_NODE, &neighbor_filter_list_cmd);
10802 install_element (BGP_IPV4_NODE, &no_neighbor_filter_list_cmd);
10803 install_element (BGP_IPV4M_NODE, &neighbor_filter_list_cmd);
10804 install_element (BGP_IPV4M_NODE, &no_neighbor_filter_list_cmd);
10805 install_element (BGP_IPV6_NODE, &neighbor_filter_list_cmd);
10806 install_element (BGP_IPV6_NODE, &no_neighbor_filter_list_cmd);
25ffbdc1 10807 install_element (BGP_IPV6M_NODE, &neighbor_filter_list_cmd);
10808 install_element (BGP_IPV6M_NODE, &no_neighbor_filter_list_cmd);
718e3744 10809 install_element (BGP_VPNV4_NODE, &neighbor_filter_list_cmd);
10810 install_element (BGP_VPNV4_NODE, &no_neighbor_filter_list_cmd);
8ecd3266 10811 install_element (BGP_VPNV6_NODE, &neighbor_filter_list_cmd);
10812 install_element (BGP_VPNV6_NODE, &no_neighbor_filter_list_cmd);
8b1fb8be
LB
10813 install_element (BGP_ENCAP_NODE, &neighbor_filter_list_cmd);
10814 install_element (BGP_ENCAP_NODE, &no_neighbor_filter_list_cmd);
10815 install_element (BGP_ENCAPV6_NODE, &neighbor_filter_list_cmd);
10816 install_element (BGP_ENCAPV6_NODE, &no_neighbor_filter_list_cmd);
718e3744 10817
10818 /* "neighbor route-map" commands. */
10819 install_element (BGP_NODE, &neighbor_route_map_cmd);
10820 install_element (BGP_NODE, &no_neighbor_route_map_cmd);
10821 install_element (BGP_IPV4_NODE, &neighbor_route_map_cmd);
10822 install_element (BGP_IPV4_NODE, &no_neighbor_route_map_cmd);
10823 install_element (BGP_IPV4M_NODE, &neighbor_route_map_cmd);
10824 install_element (BGP_IPV4M_NODE, &no_neighbor_route_map_cmd);
10825 install_element (BGP_IPV6_NODE, &neighbor_route_map_cmd);
10826 install_element (BGP_IPV6_NODE, &no_neighbor_route_map_cmd);
25ffbdc1 10827 install_element (BGP_IPV6M_NODE, &neighbor_route_map_cmd);
10828 install_element (BGP_IPV6M_NODE, &no_neighbor_route_map_cmd);
718e3744 10829 install_element (BGP_VPNV4_NODE, &neighbor_route_map_cmd);
10830 install_element (BGP_VPNV4_NODE, &no_neighbor_route_map_cmd);
8ecd3266 10831 install_element (BGP_VPNV6_NODE, &neighbor_route_map_cmd);
10832 install_element (BGP_VPNV6_NODE, &no_neighbor_route_map_cmd);
8b1fb8be
LB
10833 install_element (BGP_ENCAP_NODE, &neighbor_route_map_cmd);
10834 install_element (BGP_ENCAP_NODE, &no_neighbor_route_map_cmd);
10835 install_element (BGP_ENCAPV6_NODE, &neighbor_route_map_cmd);
10836 install_element (BGP_ENCAPV6_NODE, &no_neighbor_route_map_cmd);
718e3744 10837
10838 /* "neighbor unsuppress-map" commands. */
10839 install_element (BGP_NODE, &neighbor_unsuppress_map_cmd);
10840 install_element (BGP_NODE, &no_neighbor_unsuppress_map_cmd);
10841 install_element (BGP_IPV4_NODE, &neighbor_unsuppress_map_cmd);
10842 install_element (BGP_IPV4_NODE, &no_neighbor_unsuppress_map_cmd);
10843 install_element (BGP_IPV4M_NODE, &neighbor_unsuppress_map_cmd);
10844 install_element (BGP_IPV4M_NODE, &no_neighbor_unsuppress_map_cmd);
10845 install_element (BGP_IPV6_NODE, &neighbor_unsuppress_map_cmd);
10846 install_element (BGP_IPV6_NODE, &no_neighbor_unsuppress_map_cmd);
25ffbdc1 10847 install_element (BGP_IPV6M_NODE, &neighbor_unsuppress_map_cmd);
10848 install_element (BGP_IPV6M_NODE, &no_neighbor_unsuppress_map_cmd);
a58545bb 10849 install_element (BGP_VPNV4_NODE, &neighbor_unsuppress_map_cmd);
bb86c601 10850 install_element (BGP_VPNV4_NODE, &no_neighbor_unsuppress_map_cmd);
8ecd3266 10851 install_element (BGP_VPNV6_NODE, &neighbor_unsuppress_map_cmd);
bb86c601 10852 install_element (BGP_VPNV6_NODE, &no_neighbor_unsuppress_map_cmd);
8b1fb8be
LB
10853 install_element (BGP_ENCAP_NODE, &neighbor_unsuppress_map_cmd);
10854 install_element (BGP_ENCAP_NODE, &no_neighbor_unsuppress_map_cmd);
10855 install_element (BGP_ENCAPV6_NODE, &neighbor_unsuppress_map_cmd);
10856 install_element (BGP_ENCAPV6_NODE, &no_neighbor_unsuppress_map_cmd);
718e3744 10857
10858 /* "neighbor maximum-prefix" commands. */
10859 install_element (BGP_NODE, &neighbor_maximum_prefix_cmd);
e0701b79 10860 install_element (BGP_NODE, &neighbor_maximum_prefix_threshold_cmd);
718e3744 10861 install_element (BGP_NODE, &neighbor_maximum_prefix_warning_cmd);
e0701b79 10862 install_element (BGP_NODE, &neighbor_maximum_prefix_threshold_warning_cmd);
0a486e5f 10863 install_element (BGP_NODE, &neighbor_maximum_prefix_restart_cmd);
10864 install_element (BGP_NODE, &neighbor_maximum_prefix_threshold_restart_cmd);
718e3744 10865 install_element (BGP_NODE, &no_neighbor_maximum_prefix_cmd);
718e3744 10866 install_element (BGP_IPV4_NODE, &neighbor_maximum_prefix_cmd);
e0701b79 10867 install_element (BGP_IPV4_NODE, &neighbor_maximum_prefix_threshold_cmd);
718e3744 10868 install_element (BGP_IPV4_NODE, &neighbor_maximum_prefix_warning_cmd);
e0701b79 10869 install_element (BGP_IPV4_NODE, &neighbor_maximum_prefix_threshold_warning_cmd);
0a486e5f 10870 install_element (BGP_IPV4_NODE, &neighbor_maximum_prefix_restart_cmd);
10871 install_element (BGP_IPV4_NODE, &neighbor_maximum_prefix_threshold_restart_cmd);
718e3744 10872 install_element (BGP_IPV4_NODE, &no_neighbor_maximum_prefix_cmd);
718e3744 10873 install_element (BGP_IPV4M_NODE, &neighbor_maximum_prefix_cmd);
e0701b79 10874 install_element (BGP_IPV4M_NODE, &neighbor_maximum_prefix_threshold_cmd);
718e3744 10875 install_element (BGP_IPV4M_NODE, &neighbor_maximum_prefix_warning_cmd);
e0701b79 10876 install_element (BGP_IPV4M_NODE, &neighbor_maximum_prefix_threshold_warning_cmd);
0a486e5f 10877 install_element (BGP_IPV4M_NODE, &neighbor_maximum_prefix_restart_cmd);
10878 install_element (BGP_IPV4M_NODE, &neighbor_maximum_prefix_threshold_restart_cmd);
718e3744 10879 install_element (BGP_IPV4M_NODE, &no_neighbor_maximum_prefix_cmd);
718e3744 10880 install_element (BGP_IPV6_NODE, &neighbor_maximum_prefix_cmd);
e0701b79 10881 install_element (BGP_IPV6_NODE, &neighbor_maximum_prefix_threshold_cmd);
718e3744 10882 install_element (BGP_IPV6_NODE, &neighbor_maximum_prefix_warning_cmd);
e0701b79 10883 install_element (BGP_IPV6_NODE, &neighbor_maximum_prefix_threshold_warning_cmd);
0a486e5f 10884 install_element (BGP_IPV6_NODE, &neighbor_maximum_prefix_restart_cmd);
10885 install_element (BGP_IPV6_NODE, &neighbor_maximum_prefix_threshold_restart_cmd);
718e3744 10886 install_element (BGP_IPV6_NODE, &no_neighbor_maximum_prefix_cmd);
25ffbdc1 10887 install_element (BGP_IPV6M_NODE, &neighbor_maximum_prefix_cmd);
10888 install_element (BGP_IPV6M_NODE, &neighbor_maximum_prefix_threshold_cmd);
10889 install_element (BGP_IPV6M_NODE, &neighbor_maximum_prefix_warning_cmd);
10890 install_element (BGP_IPV6M_NODE, &neighbor_maximum_prefix_threshold_warning_cmd);
10891 install_element (BGP_IPV6M_NODE, &neighbor_maximum_prefix_restart_cmd);
10892 install_element (BGP_IPV6M_NODE, &neighbor_maximum_prefix_threshold_restart_cmd);
10893 install_element (BGP_IPV6M_NODE, &no_neighbor_maximum_prefix_cmd);
718e3744 10894 install_element (BGP_VPNV4_NODE, &neighbor_maximum_prefix_cmd);
e0701b79 10895 install_element (BGP_VPNV4_NODE, &neighbor_maximum_prefix_threshold_cmd);
718e3744 10896 install_element (BGP_VPNV4_NODE, &neighbor_maximum_prefix_warning_cmd);
e0701b79 10897 install_element (BGP_VPNV4_NODE, &neighbor_maximum_prefix_threshold_warning_cmd);
0a486e5f 10898 install_element (BGP_VPNV4_NODE, &neighbor_maximum_prefix_restart_cmd);
10899 install_element (BGP_VPNV4_NODE, &neighbor_maximum_prefix_threshold_restart_cmd);
718e3744 10900 install_element (BGP_VPNV4_NODE, &no_neighbor_maximum_prefix_cmd);
8ecd3266 10901 install_element (BGP_VPNV6_NODE, &neighbor_maximum_prefix_cmd);
10902 install_element (BGP_VPNV6_NODE, &neighbor_maximum_prefix_threshold_cmd);
10903 install_element (BGP_VPNV6_NODE, &neighbor_maximum_prefix_warning_cmd);
10904 install_element (BGP_VPNV6_NODE, &neighbor_maximum_prefix_threshold_warning_cmd);
10905 install_element (BGP_VPNV6_NODE, &neighbor_maximum_prefix_restart_cmd);
10906 install_element (BGP_VPNV6_NODE, &neighbor_maximum_prefix_threshold_restart_cmd);
10907 install_element (BGP_VPNV6_NODE, &no_neighbor_maximum_prefix_cmd);
718e3744 10908
8b1fb8be
LB
10909 install_element (BGP_ENCAP_NODE, &neighbor_maximum_prefix_cmd);
10910 install_element (BGP_ENCAP_NODE, &neighbor_maximum_prefix_threshold_cmd);
10911 install_element (BGP_ENCAP_NODE, &neighbor_maximum_prefix_warning_cmd);
10912 install_element (BGP_ENCAP_NODE, &neighbor_maximum_prefix_threshold_warning_cmd);
10913 install_element (BGP_ENCAP_NODE, &neighbor_maximum_prefix_restart_cmd);
10914 install_element (BGP_ENCAP_NODE, &neighbor_maximum_prefix_threshold_restart_cmd);
10915 install_element (BGP_ENCAP_NODE, &no_neighbor_maximum_prefix_cmd);
8b1fb8be
LB
10916
10917 install_element (BGP_ENCAPV6_NODE, &neighbor_maximum_prefix_cmd);
10918 install_element (BGP_ENCAPV6_NODE, &neighbor_maximum_prefix_threshold_cmd);
10919 install_element (BGP_ENCAPV6_NODE, &neighbor_maximum_prefix_warning_cmd);
10920 install_element (BGP_ENCAPV6_NODE, &neighbor_maximum_prefix_threshold_warning_cmd);
10921 install_element (BGP_ENCAPV6_NODE, &neighbor_maximum_prefix_restart_cmd);
10922 install_element (BGP_ENCAPV6_NODE, &neighbor_maximum_prefix_threshold_restart_cmd);
10923 install_element (BGP_ENCAPV6_NODE, &no_neighbor_maximum_prefix_cmd);
8b1fb8be 10924
718e3744 10925 /* "neighbor allowas-in" */
10926 install_element (BGP_NODE, &neighbor_allowas_in_cmd);
718e3744 10927 install_element (BGP_NODE, &no_neighbor_allowas_in_cmd);
10928 install_element (BGP_IPV4_NODE, &neighbor_allowas_in_cmd);
718e3744 10929 install_element (BGP_IPV4_NODE, &no_neighbor_allowas_in_cmd);
10930 install_element (BGP_IPV4M_NODE, &neighbor_allowas_in_cmd);
718e3744 10931 install_element (BGP_IPV4M_NODE, &no_neighbor_allowas_in_cmd);
10932 install_element (BGP_IPV6_NODE, &neighbor_allowas_in_cmd);
718e3744 10933 install_element (BGP_IPV6_NODE, &no_neighbor_allowas_in_cmd);
25ffbdc1 10934 install_element (BGP_IPV6M_NODE, &neighbor_allowas_in_cmd);
25ffbdc1 10935 install_element (BGP_IPV6M_NODE, &no_neighbor_allowas_in_cmd);
718e3744 10936 install_element (BGP_VPNV4_NODE, &neighbor_allowas_in_cmd);
718e3744 10937 install_element (BGP_VPNV4_NODE, &no_neighbor_allowas_in_cmd);
8ecd3266 10938 install_element (BGP_VPNV6_NODE, &neighbor_allowas_in_cmd);
8ecd3266 10939 install_element (BGP_VPNV6_NODE, &no_neighbor_allowas_in_cmd);
8b1fb8be 10940 install_element (BGP_ENCAP_NODE, &neighbor_allowas_in_cmd);
8b1fb8be
LB
10941 install_element (BGP_ENCAP_NODE, &no_neighbor_allowas_in_cmd);
10942 install_element (BGP_ENCAPV6_NODE, &neighbor_allowas_in_cmd);
8b1fb8be 10943 install_element (BGP_ENCAPV6_NODE, &no_neighbor_allowas_in_cmd);
718e3744 10944
10945 /* address-family commands. */
718e3744 10946 install_element (BGP_NODE, &address_family_ipv4_safi_cmd);
25ffbdc1 10947 install_element (BGP_NODE, &address_family_ipv6_safi_cmd);
d6902373 10948#ifdef KEEP_OLD_VPN_COMMANDS
718e3744 10949 install_element (BGP_NODE, &address_family_vpnv4_cmd);
8b1fb8be 10950 install_element (BGP_NODE, &address_family_vpnv6_cmd);
d6902373 10951#endif /* KEEP_OLD_VPN_COMMANDS */
8b1fb8be
LB
10952
10953 install_element (BGP_NODE, &address_family_encap_cmd);
8b1fb8be 10954 install_element (BGP_NODE, &address_family_encapv6_cmd);
8b1fb8be 10955
4e0b7b6d
PG
10956 install_element (BGP_NODE, &address_family_evpn_cmd);
10957
718e3744 10958 /* "exit-address-family" command. */
10959 install_element (BGP_IPV4_NODE, &exit_address_family_cmd);
10960 install_element (BGP_IPV4M_NODE, &exit_address_family_cmd);
10961 install_element (BGP_IPV6_NODE, &exit_address_family_cmd);
25ffbdc1 10962 install_element (BGP_IPV6M_NODE, &exit_address_family_cmd);
718e3744 10963 install_element (BGP_VPNV4_NODE, &exit_address_family_cmd);
8ecd3266 10964 install_element (BGP_VPNV6_NODE, &exit_address_family_cmd);
8b1fb8be
LB
10965 install_element (BGP_ENCAP_NODE, &exit_address_family_cmd);
10966 install_element (BGP_ENCAPV6_NODE, &exit_address_family_cmd);
4e0b7b6d 10967 install_element (BGP_EVPN_NODE, &exit_address_family_cmd);
718e3744 10968
10969 /* "clear ip bgp commands" */
10970 install_element (ENABLE_NODE, &clear_ip_bgp_all_cmd);
718e3744 10971
8ad7271d
DS
10972 /* clear ip bgp prefix */
10973 install_element (ENABLE_NODE, &clear_ip_bgp_prefix_cmd);
10974 install_element (ENABLE_NODE, &clear_bgp_ipv6_safi_prefix_cmd);
01080f7c 10975 install_element (ENABLE_NODE, &clear_bgp_instance_ipv6_safi_prefix_cmd);
8ad7271d 10976
716b2d8a 10977 /* "show [ip] bgp summary" commands. */
f186de26 10978 install_element (VIEW_NODE, &show_bgp_instance_all_ipv6_updgrps_cmd);
8386ac43 10979 install_element (VIEW_NODE, &show_bgp_instance_updgrps_adj_cmd);
8386ac43 10980 install_element (VIEW_NODE, &show_bgp_instance_updgrps_adj_s_cmd);
271ad8d5 10981 install_element (VIEW_NODE, &show_bgp_instance_updgrps_stats_cmd);
e52702f2 10982 install_element (VIEW_NODE, &show_bgp_updgrps_adj_cmd);
e52702f2 10983 install_element (VIEW_NODE, &show_bgp_updgrps_adj_s_cmd);
271ad8d5 10984 install_element (VIEW_NODE, &show_bgp_updgrps_afi_adj_cmd);
e52702f2 10985 install_element (VIEW_NODE, &show_bgp_updgrps_afi_adj_s_cmd);
8c3deaae 10986 install_element (VIEW_NODE, &show_bgp_updgrps_stats_cmd);
271ad8d5
QY
10987 install_element (VIEW_NODE, &show_ip_bgp_instance_updgrps_adj_cmd);
10988 install_element (VIEW_NODE, &show_ip_bgp_instance_updgrps_adj_s_cmd);
10989 install_element (VIEW_NODE, &show_ip_bgp_summary_cmd);
10990 install_element (VIEW_NODE, &show_ip_bgp_updgrps_adj_cmd);
10991 install_element (VIEW_NODE, &show_ip_bgp_updgrps_adj_s_cmd);
10992 install_element (VIEW_NODE, &show_ip_bgp_updgrps_cmd);
e3e29b32 10993
716b2d8a 10994 /* "show [ip] bgp neighbors" commands. */
718e3744 10995 install_element (VIEW_NODE, &show_ip_bgp_neighbors_cmd);
718e3744 10996
716b2d8a 10997 /* "show [ip] bgp peer-group" commands. */
f14e6fdb 10998 install_element (VIEW_NODE, &show_ip_bgp_peer_groups_cmd);
f14e6fdb 10999
716b2d8a 11000 /* "show [ip] bgp paths" commands. */
718e3744 11001 install_element (VIEW_NODE, &show_ip_bgp_paths_cmd);
718e3744 11002
716b2d8a 11003 /* "show [ip] bgp community" commands. */
718e3744 11004 install_element (VIEW_NODE, &show_ip_bgp_community_info_cmd);
718e3744 11005
57d187bc
JS
11006 /* "show ip bgp large-community" commands. */
11007 install_element (VIEW_NODE, &show_ip_bgp_lcommunity_info_cmd);
716b2d8a 11008 /* "show [ip] bgp attribute-info" commands. */
718e3744 11009 install_element (VIEW_NODE, &show_ip_bgp_attr_info_cmd);
718e3744 11010
11011 /* "redistribute" commands. */
11012 install_element (BGP_NODE, &bgp_redistribute_ipv4_cmd);
11013 install_element (BGP_NODE, &no_bgp_redistribute_ipv4_cmd);
11014 install_element (BGP_NODE, &bgp_redistribute_ipv4_rmap_cmd);
718e3744 11015 install_element (BGP_NODE, &bgp_redistribute_ipv4_metric_cmd);
718e3744 11016 install_element (BGP_NODE, &bgp_redistribute_ipv4_rmap_metric_cmd);
11017 install_element (BGP_NODE, &bgp_redistribute_ipv4_metric_rmap_cmd);
7c8ff89e
DS
11018 install_element (BGP_NODE, &bgp_redistribute_ipv4_ospf_cmd);
11019 install_element (BGP_NODE, &no_bgp_redistribute_ipv4_ospf_cmd);
11020 install_element (BGP_NODE, &bgp_redistribute_ipv4_ospf_rmap_cmd);
7c8ff89e 11021 install_element (BGP_NODE, &bgp_redistribute_ipv4_ospf_metric_cmd);
7c8ff89e 11022 install_element (BGP_NODE, &bgp_redistribute_ipv4_ospf_rmap_metric_cmd);
7c8ff89e 11023 install_element (BGP_NODE, &bgp_redistribute_ipv4_ospf_metric_rmap_cmd);
919e0666
DW
11024 install_element (BGP_IPV4_NODE, &bgp_redistribute_ipv4_cmd);
11025 install_element (BGP_IPV4_NODE, &no_bgp_redistribute_ipv4_cmd);
11026 install_element (BGP_IPV4_NODE, &bgp_redistribute_ipv4_rmap_cmd);
919e0666 11027 install_element (BGP_IPV4_NODE, &bgp_redistribute_ipv4_metric_cmd);
919e0666
DW
11028 install_element (BGP_IPV4_NODE, &bgp_redistribute_ipv4_rmap_metric_cmd);
11029 install_element (BGP_IPV4_NODE, &bgp_redistribute_ipv4_metric_rmap_cmd);
919e0666
DW
11030 install_element (BGP_IPV4_NODE, &bgp_redistribute_ipv4_ospf_cmd);
11031 install_element (BGP_IPV4_NODE, &no_bgp_redistribute_ipv4_ospf_cmd);
11032 install_element (BGP_IPV4_NODE, &bgp_redistribute_ipv4_ospf_rmap_cmd);
919e0666 11033 install_element (BGP_IPV4_NODE, &bgp_redistribute_ipv4_ospf_metric_cmd);
919e0666 11034 install_element (BGP_IPV4_NODE, &bgp_redistribute_ipv4_ospf_rmap_metric_cmd);
919e0666 11035 install_element (BGP_IPV4_NODE, &bgp_redistribute_ipv4_ospf_metric_rmap_cmd);
718e3744 11036 install_element (BGP_IPV6_NODE, &bgp_redistribute_ipv6_cmd);
11037 install_element (BGP_IPV6_NODE, &no_bgp_redistribute_ipv6_cmd);
11038 install_element (BGP_IPV6_NODE, &bgp_redistribute_ipv6_rmap_cmd);
718e3744 11039 install_element (BGP_IPV6_NODE, &bgp_redistribute_ipv6_metric_cmd);
718e3744 11040 install_element (BGP_IPV6_NODE, &bgp_redistribute_ipv6_rmap_metric_cmd);
11041 install_element (BGP_IPV6_NODE, &bgp_redistribute_ipv6_metric_rmap_cmd);
718e3744 11042
fa411a21
NH
11043 /* ttl_security commands */
11044 install_element (BGP_NODE, &neighbor_ttl_security_cmd);
11045 install_element (BGP_NODE, &no_neighbor_ttl_security_cmd);
11046
716b2d8a 11047 /* "show [ip] bgp memory" commands. */
4bf6a362 11048 install_element (VIEW_NODE, &show_bgp_memory_cmd);
e52702f2 11049
716b2d8a 11050 /* "show [ip] bgp views" commands. */
e0081f70 11051 install_element (VIEW_NODE, &show_bgp_views_cmd);
e52702f2 11052
716b2d8a 11053 /* "show [ip] bgp vrfs" commands. */
8386ac43 11054 install_element (VIEW_NODE, &show_bgp_vrfs_cmd);
e52702f2 11055
718e3744 11056 /* Community-list. */
11057 community_list_vty ();
11058}
6b0655a2 11059
718e3744 11060#include "memory.h"
11061#include "bgp_regex.h"
11062#include "bgp_clist.h"
11063#include "bgp_ecommunity.h"
11064
11065/* VTY functions. */
11066
11067/* Direction value to string conversion. */
94f2b392 11068static const char *
718e3744 11069community_direct_str (int direct)
11070{
11071 switch (direct)
11072 {
11073 case COMMUNITY_DENY:
11074 return "deny";
718e3744 11075 case COMMUNITY_PERMIT:
11076 return "permit";
718e3744 11077 default:
11078 return "unknown";
718e3744 11079 }
11080}
11081
11082/* Display error string. */
94f2b392 11083static void
718e3744 11084community_list_perror (struct vty *vty, int ret)
11085{
11086 switch (ret)
11087 {
11088 case COMMUNITY_LIST_ERR_CANT_FIND_LIST:
b729294c 11089 vty_out (vty, "%% Can't find community-list%s", VTY_NEWLINE);
718e3744 11090 break;
11091 case COMMUNITY_LIST_ERR_MALFORMED_VAL:
11092 vty_out (vty, "%% Malformed community-list value%s", VTY_NEWLINE);
11093 break;
11094 case COMMUNITY_LIST_ERR_STANDARD_CONFLICT:
11095 vty_out (vty, "%% Community name conflict, previously defined as standard community%s", VTY_NEWLINE);
11096 break;
11097 case COMMUNITY_LIST_ERR_EXPANDED_CONFLICT:
11098 vty_out (vty, "%% Community name conflict, previously defined as expanded community%s", VTY_NEWLINE);
11099 break;
11100 }
11101}
11102
5bf15956
DW
11103/* "community-list" keyword help string. */
11104#define COMMUNITY_LIST_STR "Add a community list entry\n"
11105
718e3744 11106
5bf15956 11107/* ip community-list standard */
718e3744 11108DEFUN (ip_community_list_standard,
11109 ip_community_list_standard_cmd,
e961923c 11110 "ip community-list <(1-99)|standard WORD> <deny|permit> AA:NN...",
718e3744 11111 IP_STR
11112 COMMUNITY_LIST_STR
11113 "Community list number (standard)\n"
5bf15956 11114 "Add an standard community-list entry\n"
718e3744 11115 "Community list name\n"
11116 "Specify community to reject\n"
11117 "Specify community to accept\n"
11118 COMMUNITY_VAL_STR)
11119{
42f914d4
QY
11120 char *cl_name_or_number = NULL;
11121 int direct = 0;
11122 int style = COMMUNITY_LIST_STANDARD;
11123
11124 int idx = 0;
11125 argv_find (argv, argc, "(1-99)", &idx);
11126 argv_find (argv, argc, "WORD", &idx);
11127 cl_name_or_number = argv[idx]->arg;
11128 direct = argv_find (argv, argc, "permit", &idx) ? COMMUNITY_PERMIT : COMMUNITY_DENY;
11129 argv_find (argv, argc, "AA:NN", &idx);
11130 char *str = argv_concat (argv, argc, idx);
11131
11132 int ret = community_list_set (bgp_clist, cl_name_or_number, str, direct, style);
11133
11134 XFREE (MTYPE_TMP, str);
11135
11136 if (ret < 0)
11137 {
11138 /* Display error string. */
11139 community_list_perror (vty, ret);
11140 return CMD_WARNING;
11141 }
11142
11143 return CMD_SUCCESS;
718e3744 11144}
11145
fee6e4e4 11146DEFUN (no_ip_community_list_standard_all,
11147 no_ip_community_list_standard_all_cmd,
e961923c 11148 "no ip community-list <(1-99)|standard WORD> <deny|permit> AA:NN...",
718e3744 11149 NO_STR
11150 IP_STR
11151 COMMUNITY_LIST_STR
11152 "Community list number (standard)\n"
5bf15956
DW
11153 "Add an standard community-list entry\n"
11154 "Community list name\n"
718e3744 11155 "Specify community to reject\n"
11156 "Specify community to accept\n"
11157 COMMUNITY_VAL_STR)
11158{
42f914d4
QY
11159 int delete_all = 0;
11160
11161 char *cl_name_or_number = NULL;
11162 int direct = 0;
11163 int style = COMMUNITY_LIST_STANDARD;
11164
11165 int idx = 0;
11166 argv_find (argv, argc, "(1-99)", &idx);
11167 argv_find (argv, argc, "WORD", &idx);
11168 cl_name_or_number = argv[idx]->arg;
11169 direct = argv_find (argv, argc, "permit", &idx) ? COMMUNITY_PERMIT : COMMUNITY_DENY;
11170 argv_find (argv, argc, "AA:NN", &idx);
11171 char *str = argv_concat (argv, argc, idx);
11172
11173 int ret = community_list_unset (bgp_clist, cl_name_or_number, str, direct, style, delete_all);
11174
daf9ddbb
DS
11175 XFREE (MTYPE_TMP, str);
11176
42f914d4
QY
11177 if (ret < 0)
11178 {
11179 community_list_perror (vty, ret);
11180 return CMD_WARNING;
11181 }
11182
11183 return CMD_SUCCESS;
718e3744 11184}
11185
5bf15956
DW
11186/* ip community-list expanded */
11187DEFUN (ip_community_list_expanded_all,
11188 ip_community_list_expanded_all_cmd,
42f914d4 11189 "ip community-list <(100-500)|expanded WORD> <deny|permit> AA:NN...",
718e3744 11190 IP_STR
11191 COMMUNITY_LIST_STR
11192 "Community list number (expanded)\n"
5bf15956 11193 "Add an expanded community-list entry\n"
718e3744 11194 "Community list name\n"
11195 "Specify community to reject\n"
11196 "Specify community to accept\n"
11197 COMMUNITY_VAL_STR)
11198{
42f914d4
QY
11199 char *cl_name_or_number = NULL;
11200 int direct = 0;
11201 int style = COMMUNITY_LIST_EXPANDED;
11202
11203 int idx = 0;
11204 argv_find (argv, argc, "(100-500)", &idx);
11205 argv_find (argv, argc, "WORD", &idx);
11206 cl_name_or_number = argv[idx]->arg;
11207 direct = argv_find (argv, argc, "permit", &idx) ? COMMUNITY_PERMIT : COMMUNITY_DENY;
11208 argv_find (argv, argc, "AA:NN", &idx);
11209 char *str = argv_concat (argv, argc, idx);
11210
11211 int ret = community_list_set (bgp_clist, cl_name_or_number, str, direct, style);
11212
11213 XFREE (MTYPE_TMP, str);
11214
11215 if (ret < 0)
11216 {
11217 /* Display error string. */
11218 community_list_perror (vty, ret);
11219 return CMD_WARNING;
11220 }
11221
11222 return CMD_SUCCESS;
718e3744 11223}
11224
5bf15956
DW
11225DEFUN (no_ip_community_list_expanded_all,
11226 no_ip_community_list_expanded_all_cmd,
42f914d4 11227 "no ip community-list <(100-500)|expanded WORD> <deny|permit> AA:NN...",
718e3744 11228 NO_STR
11229 IP_STR
11230 COMMUNITY_LIST_STR
5bf15956
DW
11231 "Community list number (expanded)\n"
11232 "Add an expanded community-list entry\n"
718e3744 11233 "Community list name\n"
11234 "Specify community to reject\n"
11235 "Specify community to accept\n"
5bf15956 11236 COMMUNITY_VAL_STR)
718e3744 11237{
42f914d4
QY
11238 int delete_all = 0;
11239
11240 char *cl_name_or_number = NULL;
11241 int direct = 0;
11242 int style = COMMUNITY_LIST_EXPANDED;
11243
11244 int idx = 0;
11245 argv_find (argv, argc, "(100-500)", &idx);
11246 argv_find (argv, argc, "WORD", &idx);
11247 cl_name_or_number = argv[idx]->arg;
11248 direct = argv_find (argv, argc, "permit", &idx) ? COMMUNITY_PERMIT : COMMUNITY_DENY;
11249 argv_find (argv, argc, "AA:NN", &idx);
11250 char *str = argv_concat (argv, argc, idx);
11251
11252 int ret = community_list_unset (bgp_clist, cl_name_or_number, str, direct, style, delete_all);
11253
daf9ddbb
DS
11254 XFREE (MTYPE_TMP, str);
11255
42f914d4
QY
11256 if (ret < 0)
11257 {
11258 community_list_perror (vty, ret);
11259 return CMD_WARNING;
11260 }
11261
11262 return CMD_SUCCESS;
718e3744 11263}
11264
94f2b392 11265static void
718e3744 11266community_list_show (struct vty *vty, struct community_list *list)
11267{
11268 struct community_entry *entry;
11269
11270 for (entry = list->head; entry; entry = entry->next)
11271 {
11272 if (entry == list->head)
11273 {
11274 if (all_digit (list->name))
11275 vty_out (vty, "Community %s list %s%s",
11276 entry->style == COMMUNITY_LIST_STANDARD ?
11277 "standard" : "(expanded) access",
11278 list->name, VTY_NEWLINE);
11279 else
11280 vty_out (vty, "Named Community %s list %s%s",
11281 entry->style == COMMUNITY_LIST_STANDARD ?
11282 "standard" : "expanded",
11283 list->name, VTY_NEWLINE);
11284 }
11285 if (entry->any)
11286 vty_out (vty, " %s%s",
11287 community_direct_str (entry->direct), VTY_NEWLINE);
11288 else
11289 vty_out (vty, " %s %s%s",
11290 community_direct_str (entry->direct),
11291 entry->style == COMMUNITY_LIST_STANDARD
11292 ? community_str (entry->u.com) : entry->config,
11293 VTY_NEWLINE);
11294 }
11295}
11296
11297DEFUN (show_ip_community_list,
11298 show_ip_community_list_cmd,
11299 "show ip community-list",
11300 SHOW_STR
11301 IP_STR
11302 "List community-list\n")
11303{
11304 struct community_list *list;
11305 struct community_list_master *cm;
11306
fee6e4e4 11307 cm = community_list_master_lookup (bgp_clist, COMMUNITY_LIST_MASTER);
718e3744 11308 if (! cm)
11309 return CMD_SUCCESS;
11310
11311 for (list = cm->num.head; list; list = list->next)
11312 community_list_show (vty, list);
11313
11314 for (list = cm->str.head; list; list = list->next)
11315 community_list_show (vty, list);
11316
11317 return CMD_SUCCESS;
11318}
11319
11320DEFUN (show_ip_community_list_arg,
11321 show_ip_community_list_arg_cmd,
6147e2c6 11322 "show ip community-list <(1-500)|WORD>",
718e3744 11323 SHOW_STR
11324 IP_STR
11325 "List community-list\n"
11326 "Community-list number\n"
11327 "Community-list name\n")
11328{
c500ae40 11329 int idx_comm_list = 3;
718e3744 11330 struct community_list *list;
11331
c500ae40 11332 list = community_list_lookup (bgp_clist, argv[idx_comm_list]->arg, COMMUNITY_LIST_MASTER);
718e3744 11333 if (! list)
11334 {
b729294c 11335 vty_out (vty, "%% Can't find community-list%s", VTY_NEWLINE);
718e3744 11336 return CMD_WARNING;
11337 }
11338
11339 community_list_show (vty, list);
11340
11341 return CMD_SUCCESS;
11342}
6b0655a2 11343
57d187bc
JS
11344/*
11345 * Large Community code.
11346 */
11347static int
11348lcommunity_list_set_vty (struct vty *vty, int argc, struct cmd_token **argv,
2acb4ac2 11349 int style, int reject_all_digit_name)
57d187bc
JS
11350{
11351 int ret;
11352 int direct;
11353 char *str;
11354 int idx = 0;
11355 char *cl_name;
11356
11357 direct = argv_find (argv, argc, "permit", &idx) ? COMMUNITY_PERMIT : COMMUNITY_DENY;
11358
11359 /* All digit name check. */
11360 idx = 0;
11361 argv_find (argv, argc, "WORD", &idx);
11362 argv_find (argv, argc, "(1-99)", &idx);
11363 argv_find (argv, argc, "(100-500)", &idx);
11364 cl_name = argv[idx]->arg;
11365 if (reject_all_digit_name && all_digit (cl_name))
11366 {
11367 vty_out (vty, "%% Community name cannot have all digits%s", VTY_NEWLINE);
11368 return CMD_WARNING;
11369 }
11370
11371 argv_find (argv, argc, "AA:BB:CC", &idx);
11372 argv_find (argv, argc, "LINE", &idx);
11373 /* Concat community string argument. */
11374 if (idx)
11375 str = argv_concat (argv, argc, idx);
11376 else
11377 str = NULL;
11378
11379 ret = lcommunity_list_set (bgp_clist, cl_name, str, direct, style);
11380
11381 /* Free temporary community list string allocated by
11382 argv_concat(). */
11383 if (str)
11384 XFREE (MTYPE_TMP, str);
11385
11386 if (ret < 0)
11387 {
11388 community_list_perror (vty, ret);
11389 return CMD_WARNING;
11390 }
11391 return CMD_SUCCESS;
11392}
11393
11394static int
11395lcommunity_list_unset_vty (struct vty *vty, int argc, struct cmd_token **argv,
2acb4ac2 11396 int style)
57d187bc
JS
11397{
11398 int ret;
11399 int direct = 0;
11400 char *str = NULL;
11401 int idx = 0;
11402
11403 argv_find (argv, argc, "permit", &idx);
11404 argv_find (argv, argc, "deny", &idx);
11405
11406 if (idx)
11407 {
11408 /* Check the list direct. */
11409 if (strncmp (argv[idx]->arg, "p", 1) == 0)
2acb4ac2 11410 direct = COMMUNITY_PERMIT;
57d187bc 11411 else
2acb4ac2 11412 direct = COMMUNITY_DENY;
57d187bc
JS
11413
11414 idx = 0;
11415 argv_find (argv, argc, "LINE", &idx);
11416 argv_find (argv, argc, "AA:AA:NN", &idx);
11417 /* Concat community string argument. */
11418 str = argv_concat (argv, argc, idx);
11419 }
11420
11421 idx = 0;
11422 argv_find (argv, argc, "(1-99)", &idx);
11423 argv_find (argv, argc, "(100-500)", &idx);
11424 argv_find (argv, argc, "WORD", &idx);
11425
11426 /* Unset community list. */
11427 ret = lcommunity_list_unset (bgp_clist, argv[idx]->arg, str, direct, style);
11428
11429 /* Free temporary community list string allocated by
11430 argv_concat(). */
11431 if (str)
11432 XFREE (MTYPE_TMP, str);
11433
11434 if (ret < 0)
11435 {
11436 community_list_perror (vty, ret);
11437 return CMD_WARNING;
11438 }
11439
11440 return CMD_SUCCESS;
11441}
11442
11443/* "large-community-list" keyword help string. */
11444#define LCOMMUNITY_LIST_STR "Add a large community list entry\n"
11445#define LCOMMUNITY_VAL_STR "large community in 'aa:bb:cc' format\n"
11446
11447DEFUN (ip_lcommunity_list_standard,
11448 ip_lcommunity_list_standard_cmd,
52951b63
DS
11449 "ip large-community-list (1-99) <deny|permit>",
11450 IP_STR
11451 LCOMMUNITY_LIST_STR
11452 "Large Community list number (standard)\n"
11453 "Specify large community to reject\n"
11454 "Specify large community to accept\n"
11455 LCOMMUNITY_VAL_STR)
11456{
11457 return lcommunity_list_set_vty (vty, argc, argv, LARGE_COMMUNITY_LIST_STANDARD, 0);
11458}
11459
11460DEFUN (ip_lcommunity_list_standard1,
11461 ip_lcommunity_list_standard1_cmd,
11462 "ip large-community-list (1-99) <deny|permit> AA:BB:CC...",
57d187bc
JS
11463 IP_STR
11464 LCOMMUNITY_LIST_STR
11465 "Large Community list number (standard)\n"
11466 "Specify large community to reject\n"
11467 "Specify large community to accept\n"
11468 LCOMMUNITY_VAL_STR)
11469{
11470 return lcommunity_list_set_vty (vty, argc, argv, LARGE_COMMUNITY_LIST_STANDARD, 0);
11471}
11472
11473DEFUN (ip_lcommunity_list_expanded,
11474 ip_lcommunity_list_expanded_cmd,
11475 "ip large-community-list (100-500) <deny|permit> LINE...",
11476 IP_STR
11477 LCOMMUNITY_LIST_STR
11478 "Large Community list number (expanded)\n"
11479 "Specify large community to reject\n"
11480 "Specify large community to accept\n"
11481 "An ordered list as a regular-expression\n")
11482{
11483 return lcommunity_list_set_vty (vty, argc, argv, LARGE_COMMUNITY_LIST_EXPANDED, 0);
11484}
11485
11486DEFUN (ip_lcommunity_list_name_standard,
11487 ip_lcommunity_list_name_standard_cmd,
52951b63
DS
11488 "ip large-community-list standard WORD <deny|permit>",
11489 IP_STR
11490 LCOMMUNITY_LIST_STR
11491 "Specify standard large-community-list\n"
11492 "Large Community list name\n"
11493 "Specify large community to reject\n"
11494 "Specify large community to accept\n")
11495{
11496 return lcommunity_list_set_vty (vty, argc, argv, LARGE_COMMUNITY_LIST_STANDARD, 1);
11497}
11498
11499DEFUN (ip_lcommunity_list_name_standard1,
11500 ip_lcommunity_list_name_standard1_cmd,
11501 "ip large-community-list standard WORD <deny|permit> AA:BB:CC...",
57d187bc
JS
11502 IP_STR
11503 LCOMMUNITY_LIST_STR
11504 "Specify standard large-community-list\n"
11505 "Large Community list name\n"
11506 "Specify large community to reject\n"
11507 "Specify large community to accept\n"
11508 LCOMMUNITY_VAL_STR)
11509{
11510 return lcommunity_list_set_vty (vty, argc, argv, LARGE_COMMUNITY_LIST_STANDARD, 1);
11511}
11512
11513DEFUN (ip_lcommunity_list_name_expanded,
11514 ip_lcommunity_list_name_expanded_cmd,
11515 "ip large-community-list expanded WORD <deny|permit> LINE...",
11516 IP_STR
11517 LCOMMUNITY_LIST_STR
11518 "Specify expanded large-community-list\n"
11519 "Large Community list name\n"
11520 "Specify large community to reject\n"
11521 "Specify large community to accept\n"
11522 "An ordered list as a regular-expression\n")
11523{
11524 return lcommunity_list_set_vty (vty, argc, argv, LARGE_COMMUNITY_LIST_EXPANDED, 1);
11525}
11526
11527DEFUN (no_ip_lcommunity_list_standard_all,
11528 no_ip_lcommunity_list_standard_all_cmd,
11529 "no ip large-community-list <(1-99)|(100-500)|WORD>",
11530 NO_STR
11531 IP_STR
11532 LCOMMUNITY_LIST_STR
11533 "Large Community list number (standard)\n"
11534 "Large Community list number (expanded)\n"
11535 "Large Community list name\n")
11536{
11537 return lcommunity_list_unset_vty (vty, argc, argv, LARGE_COMMUNITY_LIST_STANDARD);
11538}
11539
11540DEFUN (no_ip_lcommunity_list_name_expanded_all,
11541 no_ip_lcommunity_list_name_expanded_all_cmd,
11542 "no ip large-community-list expanded WORD",
11543 NO_STR
11544 IP_STR
11545 LCOMMUNITY_LIST_STR
11546 "Specify expanded large-community-list\n"
11547 "Large Community list name\n")
11548{
11549 return lcommunity_list_unset_vty (vty, argc, argv, LARGE_COMMUNITY_LIST_EXPANDED);
11550}
11551
11552DEFUN (no_ip_lcommunity_list_standard,
11553 no_ip_lcommunity_list_standard_cmd,
11554 "no ip large-community-list (1-99) <deny|permit> AA:AA:NN...",
11555 NO_STR
11556 IP_STR
11557 LCOMMUNITY_LIST_STR
11558 "Large Community list number (standard)\n"
11559 "Specify large community to reject\n"
11560 "Specify large community to accept\n"
11561 LCOMMUNITY_VAL_STR)
11562{
11563 return lcommunity_list_unset_vty (vty, argc, argv, LARGE_COMMUNITY_LIST_STANDARD);
11564}
11565
11566DEFUN (no_ip_lcommunity_list_expanded,
11567 no_ip_lcommunity_list_expanded_cmd,
11568 "no ip large-community-list (100-500) <deny|permit> LINE...",
11569 NO_STR
11570 IP_STR
11571 LCOMMUNITY_LIST_STR
11572 "Large Community list number (expanded)\n"
11573 "Specify large community to reject\n"
11574 "Specify large community to accept\n"
11575 "An ordered list as a regular-expression\n")
11576{
11577 return lcommunity_list_unset_vty (vty, argc, argv, LARGE_COMMUNITY_LIST_EXPANDED);
11578}
11579
11580DEFUN (no_ip_lcommunity_list_name_standard,
11581 no_ip_lcommunity_list_name_standard_cmd,
11582 "no ip large-community-list standard WORD <deny|permit> AA:AA:NN...",
11583 NO_STR
11584 IP_STR
11585 LCOMMUNITY_LIST_STR
11586 "Specify standard large-community-list\n"
11587 "Large Community list name\n"
11588 "Specify large community to reject\n"
11589 "Specify large community to accept\n"
11590 LCOMMUNITY_VAL_STR)
11591{
11592 return lcommunity_list_unset_vty (vty, argc, argv, LARGE_COMMUNITY_LIST_STANDARD);
11593}
11594
11595DEFUN (no_ip_lcommunity_list_name_expanded,
11596 no_ip_lcommunity_list_name_expanded_cmd,
11597 "no ip large-community-list expanded WORD <deny|permit> LINE...",
11598 NO_STR
11599 IP_STR
11600 LCOMMUNITY_LIST_STR
11601 "Specify expanded large-community-list\n"
11602 "Large community list name\n"
11603 "Specify large community to reject\n"
11604 "Specify large community to accept\n"
11605 "An ordered list as a regular-expression\n")
11606{
11607 return lcommunity_list_unset_vty (vty, argc, argv, LARGE_COMMUNITY_LIST_EXPANDED);
11608}
11609
11610static void
11611lcommunity_list_show (struct vty *vty, struct community_list *list)
11612{
11613 struct community_entry *entry;
11614
11615 for (entry = list->head; entry; entry = entry->next)
11616 {
11617 if (entry == list->head)
2acb4ac2
DL
11618 {
11619 if (all_digit (list->name))
11620 vty_out (vty, "Large community %s list %s%s",
11621 entry->style == EXTCOMMUNITY_LIST_STANDARD ?
11622 "standard" : "(expanded) access",
11623 list->name, VTY_NEWLINE);
11624 else
11625 vty_out (vty, "Named large community %s list %s%s",
11626 entry->style == EXTCOMMUNITY_LIST_STANDARD ?
11627 "standard" : "expanded",
11628 list->name, VTY_NEWLINE);
11629 }
57d187bc 11630 if (entry->any)
2acb4ac2
DL
11631 vty_out (vty, " %s%s",
11632 community_direct_str (entry->direct), VTY_NEWLINE);
57d187bc 11633 else
2acb4ac2
DL
11634 vty_out (vty, " %s %s%s",
11635 community_direct_str (entry->direct),
11636 entry->style == EXTCOMMUNITY_LIST_STANDARD ?
11637 entry->u.ecom->str : entry->config,
11638 VTY_NEWLINE);
57d187bc
JS
11639 }
11640}
11641
11642DEFUN (show_ip_lcommunity_list,
11643 show_ip_lcommunity_list_cmd,
11644 "show ip large-community-list",
11645 SHOW_STR
11646 IP_STR
11647 "List large-community list\n")
11648{
11649 struct community_list *list;
11650 struct community_list_master *cm;
11651
11652 cm = community_list_master_lookup (bgp_clist, LARGE_COMMUNITY_LIST_MASTER);
11653 if (! cm)
11654 return CMD_SUCCESS;
11655
11656 for (list = cm->num.head; list; list = list->next)
11657 lcommunity_list_show (vty, list);
11658
11659 for (list = cm->str.head; list; list = list->next)
11660 lcommunity_list_show (vty, list);
11661
11662 return CMD_SUCCESS;
11663}
11664
11665DEFUN (show_ip_lcommunity_list_arg,
11666 show_ip_lcommunity_list_arg_cmd,
11667 "show ip large-community-list <(1-500)|WORD>",
11668 SHOW_STR
11669 IP_STR
11670 "List large-community list\n"
11671 "large-community-list number\n"
11672 "large-community-list name\n")
11673{
11674 struct community_list *list;
11675
11676 list = community_list_lookup (bgp_clist, argv[3]->arg, LARGE_COMMUNITY_LIST_MASTER);
11677 if (! list)
11678 {
11679 vty_out (vty, "%% Can't find extcommunity-list%s", VTY_NEWLINE);
11680 return CMD_WARNING;
11681 }
11682
11683 lcommunity_list_show (vty, list);
11684
11685 return CMD_SUCCESS;
11686}
11687
718e3744 11688/* "extcommunity-list" keyword help string. */
11689#define EXTCOMMUNITY_LIST_STR "Add a extended community list entry\n"
11690#define EXTCOMMUNITY_VAL_STR "Extended community attribute in 'rt aa:nn_or_IPaddr:nn' OR 'soo aa:nn_or_IPaddr:nn' format\n"
11691
11692DEFUN (ip_extcommunity_list_standard,
11693 ip_extcommunity_list_standard_cmd,
e961923c 11694 "ip extcommunity-list <(1-99)|standard WORD> <deny|permit> AA:NN...",
718e3744 11695 IP_STR
11696 EXTCOMMUNITY_LIST_STR
11697 "Extended Community list number (standard)\n"
718e3744 11698 "Specify standard extcommunity-list\n"
5bf15956 11699 "Community list name\n"
718e3744 11700 "Specify community to reject\n"
11701 "Specify community to accept\n"
11702 EXTCOMMUNITY_VAL_STR)
11703{
42f914d4
QY
11704 int style = EXTCOMMUNITY_LIST_STANDARD;
11705 int direct = 0;
11706 char *cl_number_or_name = NULL;
11707
11708 int idx = 0;
11709 argv_find (argv, argc, "(1-99)", &idx);
11710 argv_find (argv, argc, "WORD", &idx);
11711 cl_number_or_name = argv[idx]->arg;
11712 direct = argv_find (argv, argc, "permit", &idx) ? COMMUNITY_PERMIT : COMMUNITY_DENY;
11713 argv_find (argv, argc, "AA:NN", &idx);
11714 char *str = argv_concat (argv, argc, idx);
11715
11716 int ret = extcommunity_list_set (bgp_clist, cl_number_or_name, str, direct, style);
11717
11718 XFREE (MTYPE_TMP, str);
11719
11720 if (ret < 0)
11721 {
11722 community_list_perror (vty, ret);
11723 return CMD_WARNING;
11724 }
11725
11726 return CMD_SUCCESS;
718e3744 11727}
11728
718e3744 11729DEFUN (ip_extcommunity_list_name_expanded,
11730 ip_extcommunity_list_name_expanded_cmd,
e961923c 11731 "ip extcommunity-list <(100-500)|expanded WORD> <deny|permit> LINE...",
718e3744 11732 IP_STR
11733 EXTCOMMUNITY_LIST_STR
5bf15956 11734 "Extended Community list number (expanded)\n"
718e3744 11735 "Specify expanded extcommunity-list\n"
11736 "Extended Community list name\n"
11737 "Specify community to reject\n"
11738 "Specify community to accept\n"
11739 "An ordered list as a regular-expression\n")
11740{
42f914d4
QY
11741 int style = EXTCOMMUNITY_LIST_EXPANDED;
11742 int direct = 0;
11743 char *cl_number_or_name = NULL;
11744
11745 int idx = 0;
11746 argv_find (argv, argc, "(100-500)", &idx);
11747 argv_find (argv, argc, "WORD", &idx);
11748 cl_number_or_name = argv[idx]->arg;
11749 direct = argv_find (argv, argc, "permit", &idx) ? COMMUNITY_PERMIT : COMMUNITY_DENY;
11750 argv_find (argv, argc, "LINE", &idx);
11751 char *str = argv_concat (argv, argc, idx);
11752
11753 int ret = extcommunity_list_set (bgp_clist, cl_number_or_name, str, direct, style);
11754
11755 XFREE (MTYPE_TMP, str);
11756
11757 if (ret < 0)
11758 {
11759 community_list_perror (vty, ret);
11760 return CMD_WARNING;
11761 }
11762
11763 return CMD_SUCCESS;
718e3744 11764}
11765
fee6e4e4 11766DEFUN (no_ip_extcommunity_list_standard_all,
11767 no_ip_extcommunity_list_standard_all_cmd,
e961923c 11768 "no ip extcommunity-list <(1-99)|standard WORD> <deny|permit> AA:NN...",
813d4307
DW
11769 NO_STR
11770 IP_STR
11771 EXTCOMMUNITY_LIST_STR
11772 "Extended Community list number (standard)\n"
718e3744 11773 "Specify standard extcommunity-list\n"
5bf15956 11774 "Community list name\n"
718e3744 11775 "Specify community to reject\n"
11776 "Specify community to accept\n"
11777 EXTCOMMUNITY_VAL_STR)
11778{
42f914d4
QY
11779 int deleteall = 0;
11780
11781 int style = EXTCOMMUNITY_LIST_STANDARD;
11782 int direct = 0;
11783 char *cl_number_or_name = NULL;
11784
11785 int idx = 0;
11786 argv_find (argv, argc, "(1-99)", &idx);
11787 argv_find (argv, argc, "WORD", &idx);
11788 cl_number_or_name = argv[idx]->arg;
11789 direct = argv_find (argv, argc, "permit", &idx) ? COMMUNITY_PERMIT : COMMUNITY_DENY;
11790 argv_find (argv, argc, "AA:NN", &idx);
11791 char *str = argv_concat (argv, argc, idx);
11792
11793 int ret = extcommunity_list_unset (bgp_clist, cl_number_or_name, str, direct, style, deleteall);
11794
11795 XFREE (MTYPE_TMP, str);
11796
11797 if (ret < 0)
11798 {
11799 community_list_perror (vty, ret);
11800 return CMD_WARNING;
11801 }
11802
11803 return CMD_SUCCESS;
718e3744 11804}
11805
5bf15956
DW
11806DEFUN (no_ip_extcommunity_list_expanded_all,
11807 no_ip_extcommunity_list_expanded_all_cmd,
e961923c 11808 "no ip extcommunity-list <(100-500)|expanded WORD> <deny|permit> LINE...",
718e3744 11809 NO_STR
11810 IP_STR
11811 EXTCOMMUNITY_LIST_STR
11812 "Extended Community list number (expanded)\n"
718e3744 11813 "Specify expanded extcommunity-list\n"
5bf15956 11814 "Extended Community list name\n"
718e3744 11815 "Specify community to reject\n"
11816 "Specify community to accept\n"
11817 "An ordered list as a regular-expression\n")
11818{
42f914d4
QY
11819 int deleteall = 0;
11820
11821 int style = EXTCOMMUNITY_LIST_EXPANDED;
11822 int direct = 0;
11823 char *cl_number_or_name = NULL;
11824
11825 int idx = 0;
11826 argv_find (argv, argc, "(100-500)", &idx);
11827 argv_find (argv, argc, "WORD", &idx);
11828 cl_number_or_name = argv[idx]->arg;
11829 direct = argv_find (argv, argc, "permit", &idx) ? COMMUNITY_PERMIT : COMMUNITY_DENY;
11830 argv_find (argv, argc, "LINE", &idx);
11831 char *str = argv_concat (argv, argc, idx);
11832
11833 int ret = extcommunity_list_unset (bgp_clist, cl_number_or_name, str, direct, style, deleteall);
11834
11835 XFREE (MTYPE_TMP, str);
11836
11837 if (ret < 0)
11838 {
11839 community_list_perror (vty, ret);
11840 return CMD_WARNING;
11841 }
11842
11843 return CMD_SUCCESS;
718e3744 11844}
11845
94f2b392 11846static void
718e3744 11847extcommunity_list_show (struct vty *vty, struct community_list *list)
11848{
11849 struct community_entry *entry;
11850
11851 for (entry = list->head; entry; entry = entry->next)
11852 {
11853 if (entry == list->head)
11854 {
11855 if (all_digit (list->name))
11856 vty_out (vty, "Extended community %s list %s%s",
11857 entry->style == EXTCOMMUNITY_LIST_STANDARD ?
11858 "standard" : "(expanded) access",
11859 list->name, VTY_NEWLINE);
11860 else
11861 vty_out (vty, "Named extended community %s list %s%s",
11862 entry->style == EXTCOMMUNITY_LIST_STANDARD ?
11863 "standard" : "expanded",
11864 list->name, VTY_NEWLINE);
11865 }
11866 if (entry->any)
11867 vty_out (vty, " %s%s",
11868 community_direct_str (entry->direct), VTY_NEWLINE);
11869 else
11870 vty_out (vty, " %s %s%s",
11871 community_direct_str (entry->direct),
11872 entry->style == EXTCOMMUNITY_LIST_STANDARD ?
11873 entry->u.ecom->str : entry->config,
11874 VTY_NEWLINE);
11875 }
11876}
11877
11878DEFUN (show_ip_extcommunity_list,
11879 show_ip_extcommunity_list_cmd,
11880 "show ip extcommunity-list",
11881 SHOW_STR
11882 IP_STR
11883 "List extended-community list\n")
11884{
11885 struct community_list *list;
11886 struct community_list_master *cm;
11887
fee6e4e4 11888 cm = community_list_master_lookup (bgp_clist, EXTCOMMUNITY_LIST_MASTER);
718e3744 11889 if (! cm)
11890 return CMD_SUCCESS;
11891
11892 for (list = cm->num.head; list; list = list->next)
11893 extcommunity_list_show (vty, list);
11894
11895 for (list = cm->str.head; list; list = list->next)
11896 extcommunity_list_show (vty, list);
11897
11898 return CMD_SUCCESS;
11899}
11900
11901DEFUN (show_ip_extcommunity_list_arg,
11902 show_ip_extcommunity_list_arg_cmd,
6147e2c6 11903 "show ip extcommunity-list <(1-500)|WORD>",
718e3744 11904 SHOW_STR
11905 IP_STR
11906 "List extended-community list\n"
11907 "Extcommunity-list number\n"
11908 "Extcommunity-list name\n")
11909{
c500ae40 11910 int idx_comm_list = 3;
718e3744 11911 struct community_list *list;
11912
c500ae40 11913 list = community_list_lookup (bgp_clist, argv[idx_comm_list]->arg, EXTCOMMUNITY_LIST_MASTER);
718e3744 11914 if (! list)
11915 {
b729294c 11916 vty_out (vty, "%% Can't find extcommunity-list%s", VTY_NEWLINE);
718e3744 11917 return CMD_WARNING;
11918 }
11919
11920 extcommunity_list_show (vty, list);
11921
11922 return CMD_SUCCESS;
11923}
6b0655a2 11924
718e3744 11925/* Return configuration string of community-list entry. */
fd79ac91 11926static const char *
718e3744 11927community_list_config_str (struct community_entry *entry)
11928{
fd79ac91 11929 const char *str;
718e3744 11930
11931 if (entry->any)
11932 str = "";
11933 else
11934 {
11935 if (entry->style == COMMUNITY_LIST_STANDARD)
11936 str = community_str (entry->u.com);
11937 else
11938 str = entry->config;
11939 }
11940 return str;
11941}
11942
11943/* Display community-list and extcommunity-list configuration. */
94f2b392 11944static int
718e3744 11945community_list_config_write (struct vty *vty)
11946{
11947 struct community_list *list;
11948 struct community_entry *entry;
11949 struct community_list_master *cm;
11950 int write = 0;
11951
11952 /* Community-list. */
fee6e4e4 11953 cm = community_list_master_lookup (bgp_clist, COMMUNITY_LIST_MASTER);
718e3744 11954
11955 for (list = cm->num.head; list; list = list->next)
11956 for (entry = list->head; entry; entry = entry->next)
11957 {
fee6e4e4 11958 vty_out (vty, "ip community-list %s %s %s%s",
11959 list->name, community_direct_str (entry->direct),
11960 community_list_config_str (entry),
11961 VTY_NEWLINE);
718e3744 11962 write++;
11963 }
11964 for (list = cm->str.head; list; list = list->next)
11965 for (entry = list->head; entry; entry = entry->next)
11966 {
11967 vty_out (vty, "ip community-list %s %s %s %s%s",
11968 entry->style == COMMUNITY_LIST_STANDARD
11969 ? "standard" : "expanded",
11970 list->name, community_direct_str (entry->direct),
11971 community_list_config_str (entry),
11972 VTY_NEWLINE);
11973 write++;
11974 }
11975
11976 /* Extcommunity-list. */
fee6e4e4 11977 cm = community_list_master_lookup (bgp_clist, EXTCOMMUNITY_LIST_MASTER);
718e3744 11978
11979 for (list = cm->num.head; list; list = list->next)
11980 for (entry = list->head; entry; entry = entry->next)
11981 {
fee6e4e4 11982 vty_out (vty, "ip extcommunity-list %s %s %s%s",
11983 list->name, community_direct_str (entry->direct),
11984 community_list_config_str (entry), VTY_NEWLINE);
718e3744 11985 write++;
11986 }
11987 for (list = cm->str.head; list; list = list->next)
11988 for (entry = list->head; entry; entry = entry->next)
11989 {
11990 vty_out (vty, "ip extcommunity-list %s %s %s %s%s",
11991 entry->style == EXTCOMMUNITY_LIST_STANDARD
11992 ? "standard" : "expanded",
11993 list->name, community_direct_str (entry->direct),
11994 community_list_config_str (entry), VTY_NEWLINE);
11995 write++;
11996 }
57d187bc
JS
11997
11998
11999 /* lcommunity-list. */
12000 cm = community_list_master_lookup (bgp_clist, LARGE_COMMUNITY_LIST_MASTER);
12001
12002 for (list = cm->num.head; list; list = list->next)
12003 for (entry = list->head; entry; entry = entry->next)
12004 {
2acb4ac2
DL
12005 vty_out (vty, "ip large-community-list %s %s %s%s",
12006 list->name, community_direct_str (entry->direct),
12007 community_list_config_str (entry), VTY_NEWLINE);
12008 write++;
57d187bc
JS
12009 }
12010 for (list = cm->str.head; list; list = list->next)
12011 for (entry = list->head; entry; entry = entry->next)
12012 {
2acb4ac2
DL
12013 vty_out (vty, "ip large-community-list %s %s %s %s%s",
12014 entry->style == LARGE_COMMUNITY_LIST_STANDARD
12015 ? "standard" : "expanded",
12016 list->name, community_direct_str (entry->direct),
12017 community_list_config_str (entry), VTY_NEWLINE);
12018 write++;
57d187bc
JS
12019 }
12020
718e3744 12021 return write;
12022}
12023
7fc626de 12024static struct cmd_node community_list_node =
718e3744 12025{
12026 COMMUNITY_LIST_NODE,
12027 "",
12028 1 /* Export to vtysh. */
12029};
12030
94f2b392 12031static void
12032community_list_vty (void)
718e3744 12033{
12034 install_node (&community_list_node, community_list_config_write);
12035
12036 /* Community-list. */
718e3744 12037 install_element (CONFIG_NODE, &ip_community_list_standard_cmd);
d7d73ffc 12038 install_element (CONFIG_NODE, &ip_community_list_expanded_all_cmd);
fee6e4e4 12039 install_element (CONFIG_NODE, &no_ip_community_list_standard_all_cmd);
12040 install_element (CONFIG_NODE, &no_ip_community_list_expanded_all_cmd);
718e3744 12041 install_element (VIEW_NODE, &show_ip_community_list_cmd);
12042 install_element (VIEW_NODE, &show_ip_community_list_arg_cmd);
718e3744 12043
12044 /* Extcommunity-list. */
12045 install_element (CONFIG_NODE, &ip_extcommunity_list_standard_cmd);
718e3744 12046 install_element (CONFIG_NODE, &ip_extcommunity_list_name_expanded_cmd);
fee6e4e4 12047 install_element (CONFIG_NODE, &no_ip_extcommunity_list_standard_all_cmd);
12048 install_element (CONFIG_NODE, &no_ip_extcommunity_list_expanded_all_cmd);
718e3744 12049 install_element (VIEW_NODE, &show_ip_extcommunity_list_cmd);
12050 install_element (VIEW_NODE, &show_ip_extcommunity_list_arg_cmd);
57d187bc
JS
12051
12052 /* Large Community List */
12053 install_element (CONFIG_NODE, &ip_lcommunity_list_standard_cmd);
52951b63 12054 install_element (CONFIG_NODE, &ip_lcommunity_list_standard1_cmd);
57d187bc
JS
12055 install_element (CONFIG_NODE, &ip_lcommunity_list_expanded_cmd);
12056 install_element (CONFIG_NODE, &ip_lcommunity_list_name_standard_cmd);
52951b63 12057 install_element (CONFIG_NODE, &ip_lcommunity_list_name_standard1_cmd);
57d187bc
JS
12058 install_element (CONFIG_NODE, &ip_lcommunity_list_name_expanded_cmd);
12059 install_element (CONFIG_NODE, &no_ip_lcommunity_list_standard_all_cmd);
12060 install_element (CONFIG_NODE, &no_ip_lcommunity_list_name_expanded_all_cmd);
12061 install_element (CONFIG_NODE, &no_ip_lcommunity_list_standard_cmd);
12062 install_element (CONFIG_NODE, &no_ip_lcommunity_list_expanded_cmd);
12063 install_element (CONFIG_NODE, &no_ip_lcommunity_list_name_standard_cmd);
12064 install_element (CONFIG_NODE, &no_ip_lcommunity_list_name_expanded_cmd);
12065 install_element (VIEW_NODE, &show_ip_lcommunity_list_cmd);
12066 install_element (VIEW_NODE, &show_ip_lcommunity_list_arg_cmd);
5bf15956 12067}