]> git.proxmox.com Git - mirror_frr.git/blame - bgpd/bgp_vty.c
doc: Add documentation for AIGP
[mirror_frr.git] / bgpd / bgp_vty.c
CommitLineData
718e3744 1/* BGP VTY interface.
896014f4
DL
2 * Copyright (C) 1996, 97, 98, 99, 2000 Kunihiro Ishiguro
3 *
4 * This file is part of GNU Zebra.
5 *
6 * GNU Zebra is free software; you can redistribute it and/or modify it
7 * under the terms of the GNU General Public License as published by the
8 * Free Software Foundation; either version 2, or (at your option) any
9 * later version.
10 *
11 * GNU Zebra is distributed in the hope that it will be useful, but
12 * WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License along
17 * with this program; see the file COPYING; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
19 */
718e3744 20
21#include <zebra.h>
22
23#include "command.h"
afec25d9 24#include "lib/json.h"
4ab46701 25#include "lib/sockopt.h"
5cb5f4d0 26#include "lib_errors.h"
ec0ab544 27#include "lib/zclient.h"
6f4eacf3 28#include "lib/printfrr.h"
718e3744 29#include "prefix.h"
30#include "plist.h"
31#include "buffer.h"
32#include "linklist.h"
33#include "stream.h"
34#include "thread.h"
35#include "log.h"
3b8b1855 36#include "memory.h"
1c0d8808 37#include "lib_vty.h"
4bf6a362 38#include "hash.h"
3f9c7369 39#include "queue.h"
039f3a34 40#include "filter.h"
5d5ba018 41#include "frrstr.h"
718e3744 42
43#include "bgpd/bgpd.h"
48ecf8f5 44#include "bgpd/bgp_attr_evpn.h"
4bf6a362 45#include "bgpd/bgp_advertise.h"
718e3744 46#include "bgpd/bgp_attr.h"
47#include "bgpd/bgp_aspath.h"
48#include "bgpd/bgp_community.h"
ed0e57e3 49#include "bgpd/bgp_community_alias.h"
4bf6a362 50#include "bgpd/bgp_ecommunity.h"
57d187bc 51#include "bgpd/bgp_lcommunity.h"
4bf6a362 52#include "bgpd/bgp_damp.h"
718e3744 53#include "bgpd/bgp_debug.h"
14454c9f 54#include "bgpd/bgp_errors.h"
e0701b79 55#include "bgpd/bgp_fsm.h"
4cd690ae 56#include "bgpd/bgp_nht.h"
4bf6a362 57#include "bgpd/bgp_nexthop.h"
4122b697 58#include "bgpd/bgp_network.h"
718e3744 59#include "bgpd/bgp_open.h"
4bf6a362 60#include "bgpd/bgp_regex.h"
718e3744 61#include "bgpd/bgp_route.h"
c016b6c7 62#include "bgpd/bgp_mplsvpn.h"
718e3744 63#include "bgpd/bgp_zebra.h"
fee0f4c6 64#include "bgpd/bgp_table.h"
94f2b392 65#include "bgpd/bgp_vty.h"
165b5fff 66#include "bgpd/bgp_mpath.h"
cb1faec9 67#include "bgpd/bgp_packet.h"
3f9c7369 68#include "bgpd/bgp_updgrp.h"
c43ed2e4 69#include "bgpd/bgp_bfd.h"
555e09d4 70#include "bgpd/bgp_io.h"
94c2f693 71#include "bgpd/bgp_evpn.h"
dd65f45e 72#include "bgpd/bgp_evpn_vty.h"
b5e140c8 73#include "bgpd/bgp_evpn_mh.h"
dcc68b5e 74#include "bgpd/bgp_addpath.h"
48ecf8f5 75#include "bgpd/bgp_mac.h"
dd65f45e 76#include "bgpd/bgp_flowspec.h"
389e4f92 77#include "bgpd/bgp_conditional_adv.h"
49e5a4a0 78#ifdef ENABLE_BGP_VNC
dd65f45e
DL
79#include "bgpd/rfapi/bgp_rfapi_cfg.h"
80#endif
70cd87ca
MK
81#include "bgpd/bgp_orr.h"
82
dd65f45e 83
5d5393b9 84FRR_CFG_DEFAULT_BOOL(BGP_IMPORT_CHECK,
62282e83
DS
85 {
86 .val_bool = false,
87 .match_profile = "traditional",
88 .match_version = "< 7.4",
89 },
90 { .val_bool = true },
67b0f40c 91);
5d5393b9 92FRR_CFG_DEFAULT_BOOL(BGP_SHOW_HOSTNAME,
4c1458b5
DL
93 { .val_bool = true, .match_profile = "datacenter", },
94 { .val_bool = false },
67b0f40c 95);
aef999a2
DA
96FRR_CFG_DEFAULT_BOOL(BGP_SHOW_NEXTHOP_HOSTNAME,
97 { .val_bool = true, .match_profile = "datacenter", },
98 { .val_bool = false },
67b0f40c 99);
5d5393b9 100FRR_CFG_DEFAULT_BOOL(BGP_LOG_NEIGHBOR_CHANGES,
4c1458b5
DL
101 { .val_bool = true, .match_profile = "datacenter", },
102 { .val_bool = false },
67b0f40c 103);
5d5393b9 104FRR_CFG_DEFAULT_BOOL(BGP_DETERMINISTIC_MED,
4c1458b5
DL
105 { .val_bool = true, .match_profile = "datacenter", },
106 { .val_bool = false },
67b0f40c 107);
5d5393b9
DL
108FRR_CFG_DEFAULT_ULONG(BGP_CONNECT_RETRY,
109 { .val_ulong = 10, .match_profile = "datacenter", },
110 { .val_ulong = 120 },
67b0f40c 111);
5d5393b9
DL
112FRR_CFG_DEFAULT_ULONG(BGP_HOLDTIME,
113 { .val_ulong = 9, .match_profile = "datacenter", },
114 { .val_ulong = 180 },
67b0f40c 115);
5d5393b9
DL
116FRR_CFG_DEFAULT_ULONG(BGP_KEEPALIVE,
117 { .val_ulong = 3, .match_profile = "datacenter", },
118 { .val_ulong = 60 },
67b0f40c 119);
1d3fdccf
DA
120FRR_CFG_DEFAULT_BOOL(BGP_EBGP_REQUIRES_POLICY,
121 { .val_bool = false, .match_profile = "datacenter", },
122 { .val_bool = false, .match_version = "< 7.4", },
123 { .val_bool = true },
67b0f40c 124);
2adac256
DA
125FRR_CFG_DEFAULT_BOOL(BGP_SUPPRESS_DUPLICATES,
126 { .val_bool = false, .match_version = "< 7.6", },
127 { .val_bool = true },
67b0f40c 128);
f2ca5c5b
DA
129FRR_CFG_DEFAULT_BOOL(BGP_GRACEFUL_NOTIFICATION,
130 { .val_bool = false, .match_version = "< 8.3", },
131 { .val_bool = true },
132);
1ae314be
DA
133FRR_CFG_DEFAULT_BOOL(BGP_HARD_ADMIN_RESET,
134 { .val_bool = false, .match_version = "< 8.3", },
135 { .val_bool = true },
136);
5d5393b9 137
dd65f45e
DL
138DEFINE_HOOK(bgp_inst_config_write,
139 (struct bgp *bgp, struct vty *vty),
8451921b
DL
140 (bgp, vty));
141DEFINE_HOOK(bgp_snmp_update_last_changed, (struct bgp *bgp), (bgp));
1ca2fd11 142DEFINE_HOOK(bgp_snmp_init_stats, (struct bgp *bgp), (bgp));
718e3744 143
d62a17ae 144static struct peer_group *listen_range_exists(struct bgp *bgp,
145 struct prefix *range, int exact);
146
055679e9 147/* Show BGP peer's information. */
148enum show_type {
149 show_all,
150 show_peer,
151 show_ipv4_all,
152 show_ipv6_all,
153 show_ipv4_peer,
154 show_ipv6_peer
155};
156
36235319
QY
157static struct peer_group *listen_range_exists(struct bgp *bgp,
158 struct prefix *range, int exact);
2986cac2 159
36235319
QY
160static void bgp_show_global_graceful_restart_mode_vty(struct vty *vty,
161 struct bgp *bgp,
162 bool use_json,
163 json_object *json);
2986cac2 164
36235319
QY
165static int bgp_show_neighbor_graceful_restart_afi_all(struct vty *vty,
166 enum show_type type,
167 const char *ip_str,
168 afi_t afi, bool use_json);
2986cac2 169
d62a17ae 170static enum node_type bgp_node_type(afi_t afi, safi_t safi)
171{
172 switch (afi) {
173 case AFI_IP:
174 switch (safi) {
175 case SAFI_UNICAST:
176 return BGP_IPV4_NODE;
d62a17ae 177 case SAFI_MULTICAST:
178 return BGP_IPV4M_NODE;
d62a17ae 179 case SAFI_LABELED_UNICAST:
180 return BGP_IPV4L_NODE;
d62a17ae 181 case SAFI_MPLS_VPN:
182 return BGP_VPNV4_NODE;
7c40bf39 183 case SAFI_FLOWSPEC:
184 return BGP_FLOWSPECV4_NODE;
5c525538
RW
185 default:
186 /* not expected */
187 return BGP_IPV4_NODE;
d62a17ae 188 }
d62a17ae 189 case AFI_IP6:
190 switch (safi) {
191 case SAFI_UNICAST:
192 return BGP_IPV6_NODE;
d62a17ae 193 case SAFI_MULTICAST:
194 return BGP_IPV6M_NODE;
d62a17ae 195 case SAFI_LABELED_UNICAST:
196 return BGP_IPV6L_NODE;
d62a17ae 197 case SAFI_MPLS_VPN:
198 return BGP_VPNV6_NODE;
7c40bf39 199 case SAFI_FLOWSPEC:
200 return BGP_FLOWSPECV6_NODE;
5c525538
RW
201 default:
202 /* not expected */
203 return BGP_IPV4_NODE;
d62a17ae 204 }
d62a17ae 205 case AFI_L2VPN:
206 return BGP_EVPN_NODE;
b26f891d 207 case AFI_UNSPEC:
d62a17ae 208 case AFI_MAX:
209 // We should never be here but to clarify the switch statement..
210 return BGP_IPV4_NODE;
d62a17ae 211 }
212
213 // Impossible to happen
214 return BGP_IPV4_NODE;
f51bae9c 215}
20eb8864 216
5cb5f4d0
DD
217static const char *get_afi_safi_vty_str(afi_t afi, safi_t safi)
218{
7d0d37de
DS
219 if (afi == AFI_IP) {
220 if (safi == SAFI_UNICAST)
221 return "IPv4 Unicast";
222 if (safi == SAFI_MULTICAST)
223 return "IPv4 Multicast";
224 if (safi == SAFI_LABELED_UNICAST)
225 return "IPv4 Labeled Unicast";
226 if (safi == SAFI_MPLS_VPN)
227 return "IPv4 VPN";
228 if (safi == SAFI_ENCAP)
229 return "IPv4 Encap";
230 if (safi == SAFI_FLOWSPEC)
231 return "IPv4 Flowspec";
232 } else if (afi == AFI_IP6) {
233 if (safi == SAFI_UNICAST)
234 return "IPv6 Unicast";
235 if (safi == SAFI_MULTICAST)
236 return "IPv6 Multicast";
237 if (safi == SAFI_LABELED_UNICAST)
238 return "IPv6 Labeled Unicast";
239 if (safi == SAFI_MPLS_VPN)
240 return "IPv6 VPN";
241 if (safi == SAFI_ENCAP)
242 return "IPv6 Encap";
243 if (safi == SAFI_FLOWSPEC)
244 return "IPv6 Flowspec";
245 } else if (afi == AFI_L2VPN) {
246 if (safi == SAFI_EVPN)
247 return "L2VPN EVPN";
248 }
249
250 return "Unknown";
5cb5f4d0
DD
251}
252
253/*
254 * Please note that we have intentionally camelCased
255 * the return strings here. So if you want
256 * to use this function, please ensure you
257 * are doing this within json output
258 */
259static const char *get_afi_safi_json_str(afi_t afi, safi_t safi)
260{
7d0d37de
DS
261 if (afi == AFI_IP) {
262 if (safi == SAFI_UNICAST)
263 return "ipv4Unicast";
264 if (safi == SAFI_MULTICAST)
265 return "ipv4Multicast";
266 if (safi == SAFI_LABELED_UNICAST)
267 return "ipv4LabeledUnicast";
268 if (safi == SAFI_MPLS_VPN)
269 return "ipv4Vpn";
270 if (safi == SAFI_ENCAP)
271 return "ipv4Encap";
272 if (safi == SAFI_FLOWSPEC)
273 return "ipv4Flowspec";
274 } else if (afi == AFI_IP6) {
275 if (safi == SAFI_UNICAST)
276 return "ipv6Unicast";
277 if (safi == SAFI_MULTICAST)
278 return "ipv6Multicast";
279 if (safi == SAFI_LABELED_UNICAST)
280 return "ipv6LabeledUnicast";
281 if (safi == SAFI_MPLS_VPN)
282 return "ipv6Vpn";
283 if (safi == SAFI_ENCAP)
284 return "ipv6Encap";
285 if (safi == SAFI_FLOWSPEC)
286 return "ipv6Flowspec";
287 } else if (afi == AFI_L2VPN) {
288 if (safi == SAFI_EVPN)
289 return "l2VpnEvpn";
290 }
291
292 return "Unknown";
5cb5f4d0
DD
293}
294
0249b8b6
HS
295/* unset srv6 locator */
296static int bgp_srv6_locator_unset(struct bgp *bgp)
297{
298 int ret;
299 struct listnode *node, *nnode;
bee2e7d0 300 struct srv6_locator_chunk *chunk, *tovpn_sid_locator;
0249b8b6
HS
301 struct bgp_srv6_function *func;
302 struct bgp *bgp_vrf;
0249b8b6
HS
303
304 /* release chunk notification via ZAPI */
305 ret = bgp_zebra_srv6_manager_release_locator_chunk(
306 bgp->srv6_locator_name);
307 if (ret < 0)
308 return -1;
309
310 /* refresh chunks */
03852f67 311 for (ALL_LIST_ELEMENTS(bgp->srv6_locator_chunks, node, nnode, chunk)) {
0249b8b6 312 listnode_delete(bgp->srv6_locator_chunks, chunk);
03852f67
CS
313 srv6_locator_chunk_free(chunk);
314 }
0249b8b6
HS
315
316 /* refresh functions */
bda15542 317 for (ALL_LIST_ELEMENTS(bgp->srv6_functions, node, nnode, func)) {
0249b8b6 318 listnode_delete(bgp->srv6_functions, func);
bda15542
CS
319 XFREE(MTYPE_BGP_SRV6_FUNCTION, func);
320 }
0249b8b6
HS
321
322 /* refresh tovpn_sid */
323 for (ALL_LIST_ELEMENTS_RO(bm->bgp, node, bgp_vrf)) {
324 if (bgp_vrf->inst_type != BGP_INSTANCE_TYPE_VRF)
325 continue;
326
327 /* refresh vpnv4 tovpn_sid */
944909f4
CS
328 XFREE(MTYPE_BGP_SRV6_SID,
329 bgp_vrf->vpn_policy[AFI_IP].tovpn_sid);
0249b8b6
HS
330
331 /* refresh vpnv6 tovpn_sid */
944909f4
CS
332 XFREE(MTYPE_BGP_SRV6_SID,
333 bgp_vrf->vpn_policy[AFI_IP6].tovpn_sid);
527588aa
CS
334
335 /* refresh per-vrf tovpn_sid */
336 XFREE(MTYPE_BGP_SRV6_SID, bgp_vrf->tovpn_sid);
0249b8b6
HS
337 }
338
339 /* update vpn bgp processes */
340 vpn_leak_postchange_all();
341
f8e9c702
CS
342 /* refresh tovpn_sid_locator */
343 for (ALL_LIST_ELEMENTS_RO(bm->bgp, node, bgp_vrf)) {
344 if (bgp_vrf->inst_type != BGP_INSTANCE_TYPE_VRF)
345 continue;
346
347 /* refresh vpnv4 tovpn_sid_locator */
bee2e7d0
RS
348 tovpn_sid_locator =
349 bgp_vrf->vpn_policy[AFI_IP].tovpn_sid_locator;
350 if (tovpn_sid_locator) {
351 srv6_locator_chunk_free(tovpn_sid_locator);
352 bgp_vrf->vpn_policy[AFI_IP].tovpn_sid_locator = NULL;
353 }
f8e9c702
CS
354
355 /* refresh vpnv6 tovpn_sid_locator */
bee2e7d0
RS
356 tovpn_sid_locator =
357 bgp_vrf->vpn_policy[AFI_IP6].tovpn_sid_locator;
358 if (tovpn_sid_locator) {
359 srv6_locator_chunk_free(tovpn_sid_locator);
360 bgp_vrf->vpn_policy[AFI_IP6].tovpn_sid_locator = NULL;
361 }
527588aa
CS
362
363 /* refresh per-vrf tovpn_sid_locator */
364 srv6_locator_chunk_free(bgp_vrf->tovpn_sid_locator);
f8e9c702
CS
365 }
366
0249b8b6
HS
367 /* clear locator name */
368 memset(bgp->srv6_locator_name, 0, sizeof(bgp->srv6_locator_name));
369
370 return 0;
371}
372
718e3744 373/* Utility function to get address family from current node. */
d62a17ae 374afi_t bgp_node_afi(struct vty *vty)
375{
376 afi_t afi;
377 switch (vty->node) {
378 case BGP_IPV6_NODE:
379 case BGP_IPV6M_NODE:
380 case BGP_IPV6L_NODE:
381 case BGP_VPNV6_NODE:
7c40bf39 382 case BGP_FLOWSPECV6_NODE:
d62a17ae 383 afi = AFI_IP6;
384 break;
385 case BGP_EVPN_NODE:
386 afi = AFI_L2VPN;
387 break;
388 default:
389 afi = AFI_IP;
390 break;
391 }
392 return afi;
718e3744 393}
394
395/* Utility function to get subsequent address family from current
396 node. */
d62a17ae 397safi_t bgp_node_safi(struct vty *vty)
398{
399 safi_t safi;
400 switch (vty->node) {
401 case BGP_VPNV4_NODE:
402 case BGP_VPNV6_NODE:
403 safi = SAFI_MPLS_VPN;
404 break;
405 case BGP_IPV4M_NODE:
406 case BGP_IPV6M_NODE:
407 safi = SAFI_MULTICAST;
408 break;
409 case BGP_EVPN_NODE:
410 safi = SAFI_EVPN;
411 break;
412 case BGP_IPV4L_NODE:
413 case BGP_IPV6L_NODE:
414 safi = SAFI_LABELED_UNICAST;
415 break;
7c40bf39 416 case BGP_FLOWSPECV4_NODE:
417 case BGP_FLOWSPECV6_NODE:
418 safi = SAFI_FLOWSPEC;
419 break;
d62a17ae 420 default:
421 safi = SAFI_UNICAST;
422 break;
423 }
424 return safi;
718e3744 425}
426
55f91488
QY
427/**
428 * Converts an AFI in string form to afi_t
429 *
430 * @param afi string, one of
431 * - "ipv4"
432 * - "ipv6"
81cf0de5 433 * - "l2vpn"
55f91488
QY
434 * @return the corresponding afi_t
435 */
d62a17ae 436afi_t bgp_vty_afi_from_str(const char *afi_str)
437{
438 afi_t afi = AFI_MAX; /* unknown */
439 if (strmatch(afi_str, "ipv4"))
440 afi = AFI_IP;
441 else if (strmatch(afi_str, "ipv6"))
442 afi = AFI_IP6;
81cf0de5
CS
443 else if (strmatch(afi_str, "l2vpn"))
444 afi = AFI_L2VPN;
d62a17ae 445 return afi;
446}
447
448int argv_find_and_parse_afi(struct cmd_token **argv, int argc, int *index,
449 afi_t *afi)
450{
451 int ret = 0;
452 if (argv_find(argv, argc, "ipv4", index)) {
453 ret = 1;
454 if (afi)
455 *afi = AFI_IP;
456 } else if (argv_find(argv, argc, "ipv6", index)) {
457 ret = 1;
458 if (afi)
459 *afi = AFI_IP6;
8688b3e7
DS
460 } else if (argv_find(argv, argc, "l2vpn", index)) {
461 ret = 1;
462 if (afi)
463 *afi = AFI_L2VPN;
d62a17ae 464 }
465 return ret;
46f296b4
LB
466}
467
375a2e67 468/* supports <unicast|multicast|vpn|labeled-unicast> */
d62a17ae 469safi_t bgp_vty_safi_from_str(const char *safi_str)
470{
471 safi_t safi = SAFI_MAX; /* unknown */
472 if (strmatch(safi_str, "multicast"))
473 safi = SAFI_MULTICAST;
474 else if (strmatch(safi_str, "unicast"))
475 safi = SAFI_UNICAST;
476 else if (strmatch(safi_str, "vpn"))
477 safi = SAFI_MPLS_VPN;
81cf0de5
CS
478 else if (strmatch(safi_str, "evpn"))
479 safi = SAFI_EVPN;
d62a17ae 480 else if (strmatch(safi_str, "labeled-unicast"))
481 safi = SAFI_LABELED_UNICAST;
7c40bf39 482 else if (strmatch(safi_str, "flowspec"))
483 safi = SAFI_FLOWSPEC;
d62a17ae 484 return safi;
485}
486
487int argv_find_and_parse_safi(struct cmd_token **argv, int argc, int *index,
488 safi_t *safi)
489{
490 int ret = 0;
491 if (argv_find(argv, argc, "unicast", index)) {
492 ret = 1;
493 if (safi)
494 *safi = SAFI_UNICAST;
495 } else if (argv_find(argv, argc, "multicast", index)) {
496 ret = 1;
497 if (safi)
498 *safi = SAFI_MULTICAST;
499 } else if (argv_find(argv, argc, "labeled-unicast", index)) {
500 ret = 1;
501 if (safi)
502 *safi = SAFI_LABELED_UNICAST;
503 } else if (argv_find(argv, argc, "vpn", index)) {
504 ret = 1;
505 if (safi)
506 *safi = SAFI_MPLS_VPN;
8688b3e7
DS
507 } else if (argv_find(argv, argc, "evpn", index)) {
508 ret = 1;
509 if (safi)
510 *safi = SAFI_EVPN;
7c40bf39 511 } else if (argv_find(argv, argc, "flowspec", index)) {
512 ret = 1;
513 if (safi)
514 *safi = SAFI_FLOWSPEC;
d62a17ae 515 }
516 return ret;
46f296b4
LB
517}
518
b16bcbba
TA
519/*
520 * Convert an afi_t/safi_t pair to matching BGP_DEFAULT_AF* flag.
521 *
522 * afi
523 * address-family identifier
524 *
525 * safi
526 * subsequent address-family identifier
527 *
528 * Returns:
529 * default_af string corresponding to the supplied afi/safi pair.
530 * If afi/safi is invalid or if flag for afi/safi doesn't exist,
531 * return -1.
532 */
533static const char *get_bgp_default_af_flag(afi_t afi, safi_t safi)
534{
535 switch (afi) {
536 case AFI_IP:
537 switch (safi) {
538 case SAFI_UNICAST:
539 return "ipv4-unicast";
540 case SAFI_MULTICAST:
541 return "ipv4-multicast";
542 case SAFI_MPLS_VPN:
543 return "ipv4-vpn";
544 case SAFI_ENCAP:
545 return "ipv4-encap";
546 case SAFI_LABELED_UNICAST:
547 return "ipv4-labeled-unicast";
548 case SAFI_FLOWSPEC:
549 return "ipv4-flowspec";
550 default:
551 return "unknown-afi/safi";
552 }
553 break;
554 case AFI_IP6:
555 switch (safi) {
556 case SAFI_UNICAST:
557 return "ipv6-unicast";
558 case SAFI_MULTICAST:
559 return "ipv6-multicast";
560 case SAFI_MPLS_VPN:
561 return "ipv6-vpn";
562 case SAFI_ENCAP:
563 return "ipv6-encap";
564 case SAFI_LABELED_UNICAST:
565 return "ipv6-labeled-unicast";
566 case SAFI_FLOWSPEC:
567 return "ipv6-flowspec";
568 default:
569 return "unknown-afi/safi";
570 }
571 break;
572 case AFI_L2VPN:
573 switch (safi) {
574 case SAFI_EVPN:
575 return "l2vpn-evpn";
576 default:
577 return "unknown-afi/safi";
578 }
579 case AFI_UNSPEC:
580 case AFI_MAX:
581 return "unknown-afi/safi";
582 }
583 /* all AFIs are accounted for above, so this shouldn't happen */
584 return "unknown-afi/safi";
585}
586
5d5393b9
DL
587int bgp_get_vty(struct bgp **bgp, as_t *as, const char *name,
588 enum bgp_instance_type inst_type)
589{
590 int ret = bgp_get(bgp, as, name, inst_type);
591
592 if (ret == BGP_CREATED) {
593 bgp_timers_set(*bgp, DFLT_BGP_KEEPALIVE, DFLT_BGP_HOLDTIME,
d43114f3 594 DFLT_BGP_CONNECT_RETRY, BGP_DEFAULT_DELAYOPEN);
5d5393b9
DL
595
596 if (DFLT_BGP_IMPORT_CHECK)
892fedb6 597 SET_FLAG((*bgp)->flags, BGP_FLAG_IMPORT_CHECK);
5d5393b9 598 if (DFLT_BGP_SHOW_HOSTNAME)
892fedb6 599 SET_FLAG((*bgp)->flags, BGP_FLAG_SHOW_HOSTNAME);
aef999a2
DA
600 if (DFLT_BGP_SHOW_NEXTHOP_HOSTNAME)
601 SET_FLAG((*bgp)->flags, BGP_FLAG_SHOW_NEXTHOP_HOSTNAME);
5d5393b9 602 if (DFLT_BGP_LOG_NEIGHBOR_CHANGES)
892fedb6 603 SET_FLAG((*bgp)->flags, BGP_FLAG_LOG_NEIGHBOR_CHANGES);
5d5393b9 604 if (DFLT_BGP_DETERMINISTIC_MED)
892fedb6 605 SET_FLAG((*bgp)->flags, BGP_FLAG_DETERMINISTIC_MED);
1d3fdccf
DA
606 if (DFLT_BGP_EBGP_REQUIRES_POLICY)
607 SET_FLAG((*bgp)->flags, BGP_FLAG_EBGP_REQUIRES_POLICY);
2adac256
DA
608 if (DFLT_BGP_SUPPRESS_DUPLICATES)
609 SET_FLAG((*bgp)->flags, BGP_FLAG_SUPPRESS_DUPLICATES);
f2ca5c5b
DA
610 if (DFLT_BGP_GRACEFUL_NOTIFICATION)
611 SET_FLAG((*bgp)->flags, BGP_FLAG_GRACEFUL_NOTIFICATION);
1ae314be
DA
612 if (DFLT_BGP_HARD_ADMIN_RESET)
613 SET_FLAG((*bgp)->flags, BGP_FLAG_HARD_ADMIN_RESET);
5d5393b9
DL
614
615 ret = BGP_SUCCESS;
616 }
617 return ret;
618}
619
7eeee51e 620/*
f212a857 621 * bgp_vty_find_and_parse_afi_safi_bgp
7eeee51e 622 *
f212a857
DS
623 * For a given 'show ...' command, correctly parse the afi/safi/bgp out from it
624 * This function *assumes* that the calling function pre-sets the afi/safi/bgp
7eeee51e
DS
625 * to appropriate values for the calling function. This is to allow the
626 * calling function to make decisions appropriate for the show command
627 * that is being parsed.
628 *
629 * The show commands are generally of the form:
d62a17ae 630 * "show [ip] bgp [<view|vrf> VIEWVRFNAME] [<ipv4|ipv6>
631 * [<unicast|multicast|vpn|labeled-unicast>]] ..."
7eeee51e
DS
632 *
633 * Since we use argv_find if the show command in particular doesn't have:
634 * [ip]
18c57037 635 * [<view|vrf> VIEWVRFNAME]
375a2e67 636 * [<ipv4|ipv6> [<unicast|multicast|vpn|labeled-unicast>]]
7eeee51e
DS
637 * The command parsing should still be ok.
638 *
639 * vty -> The vty for the command so we can output some useful data in
640 * the event of a parse error in the vrf.
641 * argv -> The command tokens
642 * argc -> How many command tokens we have
d62a17ae 643 * idx -> The current place in the command, generally should be 0 for this
644 * function
7eeee51e
DS
645 * afi -> The parsed afi if it was included in the show command, returned here
646 * safi -> The parsed safi if it was included in the show command, returned here
f212a857 647 * bgp -> Pointer to the bgp data structure we need to fill in.
52e5b8c4 648 * use_json -> json is configured or not
7eeee51e
DS
649 *
650 * The function returns the correct location in the parse tree for the
651 * last token found.
0e37c258
DS
652 *
653 * Returns 0 for failure to parse correctly, else the idx position of where
654 * it found the last token.
7eeee51e 655 */
d62a17ae 656int bgp_vty_find_and_parse_afi_safi_bgp(struct vty *vty,
657 struct cmd_token **argv, int argc,
658 int *idx, afi_t *afi, safi_t *safi,
9f049418 659 struct bgp **bgp, bool use_json)
d62a17ae 660{
661 char *vrf_name = NULL;
662
663 assert(afi);
664 assert(safi);
665 assert(bgp);
666
667 if (argv_find(argv, argc, "ip", idx))
668 *afi = AFI_IP;
669
9a8bdf1c 670 if (argv_find(argv, argc, "view", idx))
d62a17ae 671 vrf_name = argv[*idx + 1]->arg;
9a8bdf1c
PG
672 else if (argv_find(argv, argc, "vrf", idx)) {
673 vrf_name = argv[*idx + 1]->arg;
674 if (strmatch(vrf_name, VRF_DEFAULT_NAME))
675 vrf_name = NULL;
676 }
677 if (vrf_name) {
d62a17ae 678 if (strmatch(vrf_name, "all"))
679 *bgp = NULL;
680 else {
681 *bgp = bgp_lookup_by_name(vrf_name);
682 if (!*bgp) {
52e5b8c4
SP
683 if (use_json) {
684 json_object *json = NULL;
685 json = json_object_new_object();
686 json_object_string_add(
687 json, "warning",
688 "View/Vrf is unknown");
75eeda93 689 vty_json(vty, json);
52e5b8c4 690 }
ca61fd25
DS
691 else
692 vty_out(vty, "View/Vrf %s is unknown\n",
693 vrf_name);
d62a17ae 694 *idx = 0;
695 return 0;
696 }
697 }
698 } else {
699 *bgp = bgp_get_default();
700 if (!*bgp) {
52e5b8c4
SP
701 if (use_json) {
702 json_object *json = NULL;
703 json = json_object_new_object();
704 json_object_string_add(
705 json, "warning",
706 "Default BGP instance not found");
75eeda93 707 vty_json(vty, json);
52e5b8c4 708 }
ca61fd25
DS
709 else
710 vty_out(vty,
711 "Default BGP instance not found\n");
d62a17ae 712 *idx = 0;
713 return 0;
714 }
715 }
716
717 if (argv_find_and_parse_afi(argv, argc, idx, afi))
718 argv_find_and_parse_safi(argv, argc, idx, safi);
719
720 *idx += 1;
721 return *idx;
722}
723
28c6e247 724static bool peer_address_self_check(struct bgp *bgp, union sockunion *su)
d62a17ae 725{
726 struct interface *ifp = NULL;
4122b697
DA
727 struct listnode *node;
728 struct bgp_listener *listener;
729 union sockunion all_su;
d62a17ae 730
4122b697 731 if (su->sa.sa_family == AF_INET) {
3d2a2725 732 (void)str2sockunion("0.0.0.0", &all_su);
d62a17ae 733 ifp = if_lookup_by_ipv4_exact(&su->sin.sin_addr, bgp->vrf_id);
4122b697 734 } else if (su->sa.sa_family == AF_INET6) {
3d2a2725 735 (void)str2sockunion("::", &all_su);
d62a17ae 736 ifp = if_lookup_by_ipv6_exact(&su->sin6.sin6_addr,
737 su->sin6.sin6_scope_id,
738 bgp->vrf_id);
4122b697 739 }
d62a17ae 740
4122b697
DA
741 if (ifp) {
742 for (ALL_LIST_ELEMENTS_RO(bm->listen_sockets, node, listener)) {
743 if (sockunion_family(su) !=
744 sockunion_family(&listener->su))
745 continue;
746
747 /* If 0.0.0.0/:: is a listener, then treat as self and
748 * reject.
749 */
750 if (!sockunion_cmp(&listener->su, su) ||
751 !sockunion_cmp(&listener->su, &all_su))
752 return true;
753 }
754 }
d62a17ae 755
3dc339cd 756 return false;
718e3744 757}
758
28c6e247
IR
759/* Utility function for looking up peer from VTY. */
760/* This is used only for configuration, so disallow if attempted on
761 * a dynamic neighbor.
762 */
763static struct peer *peer_lookup_vty(struct vty *vty, const char *ip_str)
764{
765 struct bgp *bgp = VTY_GET_CONTEXT(bgp);
766 int ret;
767 union sockunion su;
768 struct peer *peer;
769
770 if (!bgp) {
771 return NULL;
772 }
773
774 ret = str2sockunion(ip_str, &su);
775 if (ret < 0) {
776 peer = peer_lookup_by_conf_if(bgp, ip_str);
777 if (!peer) {
778 if ((peer = peer_lookup_by_hostname(bgp, ip_str))
779 == NULL) {
780 vty_out(vty,
781 "%% Malformed address or name: %s\n",
782 ip_str);
783 return NULL;
784 }
785 }
786 } else {
787 peer = peer_lookup(bgp, &su);
788 if (!peer) {
789 vty_out(vty,
790 "%% Specify remote-as or peer-group commands first\n");
791 return NULL;
792 }
793 if (peer_dynamic_neighbor(peer)) {
794 vty_out(vty,
795 "%% Operation not allowed on a dynamic neighbor\n");
796 return NULL;
797 }
798 }
799 return peer;
800}
801
718e3744 802/* Utility function for looking up peer or peer group. */
f14e6fdb
DS
803/* This is used only for configuration, so disallow if attempted on
804 * a dynamic neighbor.
805 */
d62a17ae 806struct peer *peer_and_group_lookup_vty(struct vty *vty, const char *peer_str)
807{
808 struct bgp *bgp = VTY_GET_CONTEXT(bgp);
809 int ret;
810 union sockunion su;
811 struct peer *peer = NULL;
812 struct peer_group *group = NULL;
813
814 if (!bgp) {
815 return NULL;
816 }
817
818 ret = str2sockunion(peer_str, &su);
819 if (ret == 0) {
820 /* IP address, locate peer. */
821 peer = peer_lookup(bgp, &su);
822 } else {
823 /* Not IP, could match either peer configured on interface or a
824 * group. */
825 peer = peer_lookup_by_conf_if(bgp, peer_str);
826 if (!peer)
827 group = peer_group_lookup(bgp, peer_str);
828 }
829
830 if (peer) {
831 if (peer_dynamic_neighbor(peer)) {
832 vty_out(vty,
833 "%% Operation not allowed on a dynamic neighbor\n");
834 return NULL;
835 }
836
837 return peer;
838 }
839
840 if (group)
841 return group->conf;
842
843 vty_out(vty, "%% Specify remote-as or peer-group commands first\n");
844
845 return NULL;
846}
847
4b7e23e9 848int bgp_vty_return(struct vty *vty, enum bgp_create_error_code ret)
d62a17ae 849{
850 const char *str = NULL;
851
852 switch (ret) {
4b7e23e9
DS
853 case BGP_SUCCESS:
854 case BGP_CREATED:
855 case BGP_GR_NO_OPERATION:
856 break;
d62a17ae 857 case BGP_ERR_INVALID_VALUE:
858 str = "Invalid value";
859 break;
860 case BGP_ERR_INVALID_FLAG:
861 str = "Invalid flag";
862 break;
863 case BGP_ERR_PEER_GROUP_SHUTDOWN:
864 str = "Peer-group has been shutdown. Activate the peer-group first";
865 break;
866 case BGP_ERR_PEER_FLAG_CONFLICT:
867 str = "Can't set override-capability and strict-capability-match at the same time";
868 break;
869 case BGP_ERR_PEER_GROUP_NO_REMOTE_AS:
870 str = "Specify remote-as or peer-group remote AS first";
871 break;
872 case BGP_ERR_PEER_GROUP_CANT_CHANGE:
873 str = "Cannot change the peer-group. Deconfigure first";
874 break;
875 case BGP_ERR_PEER_GROUP_MISMATCH:
876 str = "Peer is not a member of this peer-group";
877 break;
878 case BGP_ERR_PEER_FILTER_CONFLICT:
879 str = "Prefix/distribute list can not co-exist";
880 break;
881 case BGP_ERR_NOT_INTERNAL_PEER:
882 str = "Invalid command. Not an internal neighbor";
883 break;
884 case BGP_ERR_REMOVE_PRIVATE_AS:
885 str = "remove-private-AS cannot be configured for IBGP peers";
886 break;
d62a17ae 887 case BGP_ERR_CANNOT_HAVE_LOCAL_AS_SAME_AS:
888 str = "Cannot have local-as same as BGP AS number";
889 break;
890 case BGP_ERR_TCPSIG_FAILED:
891 str = "Error while applying TCP-Sig to session(s)";
892 break;
893 case BGP_ERR_NO_EBGP_MULTIHOP_WITH_TTLHACK:
894 str = "ebgp-multihop and ttl-security cannot be configured together";
895 break;
896 case BGP_ERR_NO_IBGP_WITH_TTLHACK:
897 str = "ttl-security only allowed for EBGP peers";
898 break;
899 case BGP_ERR_AS_OVERRIDE:
900 str = "as-override cannot be configured for IBGP peers";
901 break;
902 case BGP_ERR_INVALID_DYNAMIC_NEIGHBORS_LIMIT:
903 str = "Invalid limit for number of dynamic neighbors";
904 break;
905 case BGP_ERR_DYNAMIC_NEIGHBORS_RANGE_EXISTS:
906 str = "Dynamic neighbor listen range already exists";
907 break;
908 case BGP_ERR_INVALID_FOR_DYNAMIC_PEER:
909 str = "Operation not allowed on a dynamic neighbor";
910 break;
911 case BGP_ERR_INVALID_FOR_DIRECT_PEER:
912 str = "Operation not allowed on a directly connected neighbor";
913 break;
914 case BGP_ERR_PEER_SAFI_CONFLICT:
a59803d0 915 str = "Cannot activate peer for both 'ipv4 unicast' and 'ipv4 labeled-unicast'";
055679e9 916 break;
917 case BGP_ERR_GR_INVALID_CMD:
918 str = "The Graceful Restart command used is not valid at this moment.";
919 break;
920 case BGP_ERR_GR_OPERATION_FAILED:
921 str = "The Graceful Restart Operation failed due to an err.";
922 break;
6dcea6fe
DS
923 case BGP_ERR_PEER_GROUP_MEMBER:
924 str = "Peer-group member cannot override remote-as of peer-group.";
925 break;
926 case BGP_ERR_PEER_GROUP_PEER_TYPE_DIFFERENT:
927 str = "Peer-group members must be all internal or all external.";
928 break;
4b7e23e9
DS
929 case BGP_ERR_DYNAMIC_NEIGHBORS_RANGE_NOT_FOUND:
930 str = "Range specified cannot be deleted because it is not part of current config.";
931 break;
932 case BGP_ERR_INSTANCE_MISMATCH:
933 str = "Instance specified does not match the current instance.";
934 break;
935 case BGP_ERR_NO_INTERFACE_CONFIG:
936 str = "Interface specified is not being used for interface based peer.";
937 break;
938 case BGP_ERR_SOFT_RECONFIG_UNCONFIGURED:
939 str = "No configuration already specified for soft reconfiguration.";
940 break;
941 case BGP_ERR_AS_MISMATCH:
942 str = "BGP is already running.";
943 break;
944 case BGP_ERR_AF_UNCONFIGURED:
945 str = "AFI/SAFI specified is not currently configured.";
946 break;
4b7e23e9
DS
947 case BGP_ERR_INVALID_AS:
948 str = "Confederation AS specified is the same AS as our AS.";
949 break;
d864dd9e
EB
950 case BGP_ERR_INVALID_ROLE_NAME:
951 str = "Invalid role name";
952 break;
953 case BGP_ERR_INVALID_INTERNAL_ROLE:
8f2d6021 954 str = "External roles can be set only on eBGP session";
d864dd9e 955 break;
70cd87ca 956 case BGP_ERR_PEER_ORR_CONFIGURED:
d6b27611 957 str = "Deconfigure optimal-route-reflection on this peer first";
70cd87ca 958 break;
d62a17ae 959 }
960 if (str) {
961 vty_out(vty, "%% %s\n", str);
962 return CMD_WARNING_CONFIG_FAILED;
963 }
964 return CMD_SUCCESS;
718e3744 965}
966
7aafcaca 967/* BGP clear sort. */
d62a17ae 968enum clear_sort {
969 clear_all,
970 clear_peer,
971 clear_group,
972 clear_external,
973 clear_as
7aafcaca
DS
974};
975
1ca2fd11
IR
976static void bgp_clear_vty_error(struct vty *vty, struct peer *peer, afi_t afi,
977 safi_t safi, int error)
d62a17ae 978{
979 switch (error) {
980 case BGP_ERR_AF_UNCONFIGURED:
a486300b
PG
981 if (vty)
982 vty_out(vty,
983 "%% BGP: Enable %s address family for the neighbor %s\n",
984 get_afi_safi_str(afi, safi, false), peer->host);
985 else
986 zlog_warn(
1af6e82b 987 "%% BGP: Enable %s address family for the neighbor %s",
a486300b 988 get_afi_safi_str(afi, safi, false), peer->host);
d62a17ae 989 break;
990 case BGP_ERR_SOFT_RECONFIG_UNCONFIGURED:
a486300b
PG
991 if (vty)
992 vty_out(vty,
993 "%% BGP: Inbound soft reconfig for %s not possible as it\n has neither refresh capability, nor inbound soft reconfig\n",
994 peer->host);
995 else
996 zlog_warn(
1af6e82b 997 "%% BGP: Inbound soft reconfig for %s not possible as it has neither refresh capability, nor inbound soft reconfig",
a486300b 998 peer->host);
d62a17ae 999 break;
1000 default:
1001 break;
1002 }
7aafcaca
DS
1003}
1004
dc912615 1005static int bgp_peer_clear(struct peer *peer, afi_t afi, safi_t safi,
c368171c 1006 struct listnode **nnode, enum bgp_clear_type stype)
dc912615
DS
1007{
1008 int ret = 0;
2adac256 1009 struct peer_af *paf;
dc912615
DS
1010
1011 /* if afi/.safi not specified, spin thru all of them */
1012 if ((afi == AFI_UNSPEC) && (safi == SAFI_UNSPEC)) {
1013 afi_t tmp_afi;
1014 safi_t tmp_safi;
0e5cdd59
DS
1015 enum bgp_af_index index;
1016
1017 for (index = BGP_AF_START; index < BGP_AF_MAX; index++) {
1018 paf = peer->peer_af_array[index];
1019 if (!paf)
1020 continue;
dc912615 1021
2adac256
DA
1022 if (paf && paf->subgroup)
1023 SET_FLAG(paf->subgroup->sflags,
1024 SUBGRP_STATUS_FORCE_UPDATES);
1025
0e5cdd59
DS
1026 tmp_afi = paf->afi;
1027 tmp_safi = paf->safi;
dc912615
DS
1028 if (!peer->afc[tmp_afi][tmp_safi])
1029 continue;
1030
1031 if (stype == BGP_CLEAR_SOFT_NONE)
c368171c 1032 ret = peer_clear(peer, nnode);
dc912615
DS
1033 else
1034 ret = peer_clear_soft(peer, tmp_afi, tmp_safi,
1035 stype);
1036 }
1037 /* if afi specified and safi not, spin thru safis on this afi */
1038 } else if (safi == SAFI_UNSPEC) {
1039 safi_t tmp_safi;
1040
1041 for (tmp_safi = SAFI_UNICAST;
1042 tmp_safi < SAFI_MAX; tmp_safi++) {
1043 if (!peer->afc[afi][tmp_safi])
1044 continue;
1045
2adac256
DA
1046 paf = peer_af_find(peer, afi, tmp_safi);
1047 if (paf && paf->subgroup)
1048 SET_FLAG(paf->subgroup->sflags,
1049 SUBGRP_STATUS_FORCE_UPDATES);
1050
dc912615 1051 if (stype == BGP_CLEAR_SOFT_NONE)
c368171c 1052 ret = peer_clear(peer, nnode);
dc912615
DS
1053 else
1054 ret = peer_clear_soft(peer, afi,
1055 tmp_safi, stype);
1056 }
1057 /* both afi/safi specified, let the caller know if not defined */
1058 } else {
1059 if (!peer->afc[afi][safi])
1060 return 1;
1061
2adac256
DA
1062 paf = peer_af_find(peer, afi, safi);
1063 if (paf && paf->subgroup)
1064 SET_FLAG(paf->subgroup->sflags,
1065 SUBGRP_STATUS_FORCE_UPDATES);
1066
dc912615 1067 if (stype == BGP_CLEAR_SOFT_NONE)
c368171c 1068 ret = peer_clear(peer, nnode);
dc912615
DS
1069 else
1070 ret = peer_clear_soft(peer, afi, safi, stype);
1071 }
1072
1073 return ret;
1074}
1075
7aafcaca 1076/* `clear ip bgp' functions. */
1ca2fd11 1077static int bgp_clear(struct vty *vty, struct bgp *bgp, afi_t afi, safi_t safi,
d62a17ae 1078 enum clear_sort sort, enum bgp_clear_type stype,
1ca2fd11 1079 const char *arg)
d62a17ae 1080{
dc912615 1081 int ret = 0;
3ae8bfa5 1082 bool found = false;
d62a17ae 1083 struct peer *peer;
dc95985f 1084
1085 VTY_BGP_GR_DEFINE_LOOP_VARIABLE;
d62a17ae 1086
1087 /* Clear all neighbors. */
1088 /*
1089 * Pass along pointer to next node to peer_clear() when walking all
3ae8bfa5
PM
1090 * nodes on the BGP instance as that may get freed if it is a
1091 * doppelganger
d62a17ae 1092 */
1093 if (sort == clear_all) {
1094 for (ALL_LIST_ELEMENTS(bgp->peer, node, nnode, peer)) {
dc95985f 1095
1096 bgp_peer_gr_flags_update(peer);
1097
36235319 1098 if (CHECK_FLAG(peer->flags, PEER_FLAG_GRACEFUL_RESTART))
dc95985f 1099 gr_router_detected = true;
1100
c368171c 1101 ret = bgp_peer_clear(peer, afi, safi, &nnode,
dc912615 1102 stype);
d62a17ae 1103
1104 if (ret < 0)
1ca2fd11 1105 bgp_clear_vty_error(vty, peer, afi, safi, ret);
dc95985f 1106 }
1107
36235319
QY
1108 if (gr_router_detected
1109 && bgp->present_zebra_gr_state == ZEBRA_GR_DISABLE) {
dc95985f 1110 bgp_zebra_send_capabilities(bgp, false);
36235319
QY
1111 } else if (!gr_router_detected
1112 && bgp->present_zebra_gr_state == ZEBRA_GR_ENABLE) {
dc95985f 1113 bgp_zebra_send_capabilities(bgp, true);
04b6bdc0 1114 }
d62a17ae 1115
1116 /* This is to apply read-only mode on this clear. */
1117 if (stype == BGP_CLEAR_SOFT_NONE)
1118 bgp->update_delay_over = 0;
1119
1120 return CMD_SUCCESS;
7aafcaca
DS
1121 }
1122
3ae8bfa5 1123 /* Clear specified neighbor. */
d62a17ae 1124 if (sort == clear_peer) {
1125 union sockunion su;
d62a17ae 1126
1127 /* Make sockunion for lookup. */
1128 ret = str2sockunion(arg, &su);
1129 if (ret < 0) {
1130 peer = peer_lookup_by_conf_if(bgp, arg);
1131 if (!peer) {
1132 peer = peer_lookup_by_hostname(bgp, arg);
1133 if (!peer) {
1ca2fd11
IR
1134 vty_out(vty,
1135 "Malformed address or name: %s\n",
d62a17ae 1136 arg);
1137 return CMD_WARNING;
1138 }
1139 }
1140 } else {
1141 peer = peer_lookup(bgp, &su);
1142 if (!peer) {
1ca2fd11 1143 vty_out(vty,
664b6f18 1144 "%% BGP: Unknown neighbor - \"%s\"\n",
1ca2fd11 1145 arg);
d62a17ae 1146 return CMD_WARNING;
1147 }
1148 }
7aafcaca 1149
dc95985f 1150 VTY_BGP_GR_ROUTER_DETECT(bgp, peer, peer->bgp->peer);
1151 VTY_SEND_BGP_GR_CAPABILITY_TO_ZEBRA(peer->bgp, ret);
1152
dc912615
DS
1153 ret = bgp_peer_clear(peer, afi, safi, NULL, stype);
1154
1155 /* if afi/safi not defined for this peer, let caller know */
1156 if (ret == 1)
3ae8bfa5 1157 ret = BGP_ERR_AF_UNCONFIGURED;
7aafcaca 1158
d62a17ae 1159 if (ret < 0)
1ca2fd11 1160 bgp_clear_vty_error(vty, peer, afi, safi, ret);
7aafcaca 1161
d62a17ae 1162 return CMD_SUCCESS;
7aafcaca 1163 }
7aafcaca 1164
3ae8bfa5 1165 /* Clear all neighbors belonging to a specific peer-group. */
d62a17ae 1166 if (sort == clear_group) {
1167 struct peer_group *group;
7aafcaca 1168
d62a17ae 1169 group = peer_group_lookup(bgp, arg);
1170 if (!group) {
664b6f18 1171 vty_out(vty, "%% BGP: No such peer-group %s\n", arg);
d62a17ae 1172 return CMD_WARNING;
1173 }
1174
1175 for (ALL_LIST_ELEMENTS(group->peer, node, nnode, peer)) {
c368171c 1176 ret = bgp_peer_clear(peer, afi, safi, &nnode, stype);
7aafcaca 1177
d62a17ae 1178 if (ret < 0)
1ca2fd11 1179 bgp_clear_vty_error(vty, peer, afi, safi, ret);
3ae8bfa5
PM
1180 else
1181 found = true;
d62a17ae 1182 }
3ae8bfa5
PM
1183
1184 if (!found)
1ca2fd11 1185 vty_out(vty,
664b6f18 1186 "%% BGP: No %s peer belonging to peer-group %s is configured\n",
5cb5f4d0 1187 get_afi_safi_str(afi, safi, false), arg);
3ae8bfa5 1188
d62a17ae 1189 return CMD_SUCCESS;
7aafcaca 1190 }
7aafcaca 1191
3ae8bfa5 1192 /* Clear all external (eBGP) neighbors. */
d62a17ae 1193 if (sort == clear_external) {
1194 for (ALL_LIST_ELEMENTS(bgp->peer, node, nnode, peer)) {
1195 if (peer->sort == BGP_PEER_IBGP)
1196 continue;
7aafcaca 1197
dc95985f 1198 bgp_peer_gr_flags_update(peer);
1199
36235319 1200 if (CHECK_FLAG(peer->flags, PEER_FLAG_GRACEFUL_RESTART))
2ba1fe69 1201 gr_router_detected = true;
dc95985f 1202
c368171c 1203 ret = bgp_peer_clear(peer, afi, safi, &nnode, stype);
7aafcaca 1204
d62a17ae 1205 if (ret < 0)
1ca2fd11 1206 bgp_clear_vty_error(vty, peer, afi, safi, ret);
3ae8bfa5
PM
1207 else
1208 found = true;
d62a17ae 1209 }
3ae8bfa5 1210
36235319
QY
1211 if (gr_router_detected
1212 && bgp->present_zebra_gr_state == ZEBRA_GR_DISABLE) {
dc95985f 1213 bgp_zebra_send_capabilities(bgp, false);
36235319
QY
1214 } else if (!gr_router_detected
1215 && bgp->present_zebra_gr_state == ZEBRA_GR_ENABLE) {
dc95985f 1216 bgp_zebra_send_capabilities(bgp, true);
1217 }
1218
3ae8bfa5 1219 if (!found)
1ca2fd11 1220 vty_out(vty,
664b6f18 1221 "%% BGP: No external %s peer is configured\n",
1ca2fd11 1222 get_afi_safi_str(afi, safi, false));
3ae8bfa5 1223
d62a17ae 1224 return CMD_SUCCESS;
1225 }
1226
3ae8bfa5 1227 /* Clear all neighbors belonging to a specific AS. */
d62a17ae 1228 if (sort == clear_as) {
3ae8bfa5 1229 as_t as = strtoul(arg, NULL, 10);
d62a17ae 1230
1231 for (ALL_LIST_ELEMENTS(bgp->peer, node, nnode, peer)) {
1232 if (peer->as != as)
1233 continue;
1234
dc95985f 1235 bgp_peer_gr_flags_update(peer);
1236
36235319 1237 if (CHECK_FLAG(peer->flags, PEER_FLAG_GRACEFUL_RESTART))
2ba1fe69 1238 gr_router_detected = true;
dc95985f 1239
c368171c 1240 ret = bgp_peer_clear(peer, afi, safi, &nnode, stype);
d62a17ae 1241
1242 if (ret < 0)
1ca2fd11 1243 bgp_clear_vty_error(vty, peer, afi, safi, ret);
3ae8bfa5
PM
1244 else
1245 found = true;
d62a17ae 1246 }
3ae8bfa5 1247
36235319
QY
1248 if (gr_router_detected
1249 && bgp->present_zebra_gr_state == ZEBRA_GR_DISABLE) {
dc95985f 1250 bgp_zebra_send_capabilities(bgp, false);
36235319
QY
1251 } else if (!gr_router_detected
1252 && bgp->present_zebra_gr_state == ZEBRA_GR_ENABLE) {
dc95985f 1253 bgp_zebra_send_capabilities(bgp, true);
1254 }
1255
3ae8bfa5 1256 if (!found)
1ca2fd11 1257 vty_out(vty,
664b6f18 1258 "%% BGP: No %s peer is configured with AS %s\n",
1ca2fd11 1259 get_afi_safi_str(afi, safi, false), arg);
3ae8bfa5 1260
d62a17ae 1261 return CMD_SUCCESS;
1262 }
1263
1264 return CMD_SUCCESS;
1265}
1266
1ca2fd11
IR
1267static int bgp_clear_vty(struct vty *vty, const char *name, afi_t afi,
1268 safi_t safi, enum clear_sort sort,
1269 enum bgp_clear_type stype, const char *arg)
d62a17ae 1270{
1271 struct bgp *bgp;
1272
1273 /* BGP structure lookup. */
1274 if (name) {
1275 bgp = bgp_lookup_by_name(name);
1276 if (bgp == NULL) {
1ca2fd11 1277 vty_out(vty, "Can't find BGP instance %s\n", name);
d62a17ae 1278 return CMD_WARNING;
1279 }
1280 } else {
1281 bgp = bgp_get_default();
1282 if (bgp == NULL) {
1ca2fd11 1283 vty_out(vty, "No BGP process is configured\n");
d62a17ae 1284 return CMD_WARNING;
1285 }
1286 }
1287
1ca2fd11 1288 return bgp_clear(vty, bgp, afi, safi, sort, stype, arg);
7aafcaca
DS
1289}
1290
1291/* clear soft inbound */
1ca2fd11 1292static void bgp_clear_star_soft_in(struct vty *vty, const char *name)
7aafcaca 1293{
99b3ebd3
NS
1294 afi_t afi;
1295 safi_t safi;
1296
1ca2fd11
IR
1297 FOREACH_AFI_SAFI (afi, safi)
1298 bgp_clear_vty(vty, name, afi, safi, clear_all,
1299 BGP_CLEAR_SOFT_IN, NULL);
7aafcaca
DS
1300}
1301
1302/* clear soft outbound */
1ca2fd11 1303static void bgp_clear_star_soft_out(struct vty *vty, const char *name)
7aafcaca 1304{
99b3ebd3
NS
1305 afi_t afi;
1306 safi_t safi;
1307
1ca2fd11
IR
1308 FOREACH_AFI_SAFI (afi, safi)
1309 bgp_clear_vty(vty, name, afi, safi, clear_all,
1310 BGP_CLEAR_SOFT_OUT, NULL);
7aafcaca
DS
1311}
1312
1313
a486300b
PG
1314void bgp_clear_soft_in(struct bgp *bgp, afi_t afi, safi_t safi)
1315{
1316 bgp_clear(NULL, bgp, afi, safi, clear_all, BGP_CLEAR_SOFT_IN, NULL);
1317}
1318
f787d7a0 1319#ifndef VTYSH_EXTRACT_PL
2e4c2296 1320#include "bgpd/bgp_vty_clippy.c"
f787d7a0
DL
1321#endif
1322
8029b216
AK
1323DEFUN_HIDDEN (bgp_local_mac,
1324 bgp_local_mac_cmd,
093e3f23 1325 "bgp local-mac vni " CMD_VNI_RANGE " mac WORD seq (0-4294967295)",
8029b216
AK
1326 BGP_STR
1327 "Local MAC config\n"
1328 "VxLAN Network Identifier\n"
1329 "VNI number\n"
1330 "local mac\n"
1331 "mac address\n"
1332 "mac-mobility sequence\n"
1333 "seq number\n")
1334{
1335 int rv;
1336 vni_t vni;
1337 struct ethaddr mac;
1338 struct ipaddr ip;
1339 uint32_t seq;
1340 struct bgp *bgp;
1341
1342 vni = strtoul(argv[3]->arg, NULL, 10);
1343 if (!prefix_str2mac(argv[5]->arg, &mac)) {
1344 vty_out(vty, "%% Malformed MAC address\n");
1345 return CMD_WARNING;
1346 }
1347 memset(&ip, 0, sizeof(ip));
1348 seq = strtoul(argv[7]->arg, NULL, 10);
1349
1350 bgp = bgp_get_default();
1351 if (!bgp) {
1352 vty_out(vty, "Default BGP instance is not there\n");
1353 return CMD_WARNING;
1354 }
1355
b5e140c8
AK
1356 rv = bgp_evpn_local_macip_add(bgp, vni, &mac, &ip, 0 /* flags */, seq,
1357 zero_esi);
8029b216
AK
1358 if (rv < 0) {
1359 vty_out(vty, "Internal error\n");
1360 return CMD_WARNING;
1361 }
1362
1363 return CMD_SUCCESS;
1364}
1365
1366DEFUN_HIDDEN (no_bgp_local_mac,
1367 no_bgp_local_mac_cmd,
093e3f23 1368 "no bgp local-mac vni " CMD_VNI_RANGE " mac WORD",
8029b216
AK
1369 NO_STR
1370 BGP_STR
1371 "Local MAC config\n"
1372 "VxLAN Network Identifier\n"
1373 "VNI number\n"
1374 "local mac\n"
1375 "mac address\n")
1376{
1377 int rv;
1378 vni_t vni;
1379 struct ethaddr mac;
1380 struct ipaddr ip;
1381 struct bgp *bgp;
1382
1383 vni = strtoul(argv[4]->arg, NULL, 10);
1384 if (!prefix_str2mac(argv[6]->arg, &mac)) {
1385 vty_out(vty, "%% Malformed MAC address\n");
1386 return CMD_WARNING;
1387 }
1388 memset(&ip, 0, sizeof(ip));
1389
1390 bgp = bgp_get_default();
1391 if (!bgp) {
1392 vty_out(vty, "Default BGP instance is not there\n");
1393 return CMD_WARNING;
1394 }
1395
ec0ab544 1396 rv = bgp_evpn_local_macip_del(bgp, vni, &mac, &ip, ZEBRA_NEIGH_ACTIVE);
8029b216
AK
1397 if (rv < 0) {
1398 vty_out(vty, "Internal error\n");
1399 return CMD_WARNING;
1400 }
1401
1402 return CMD_SUCCESS;
1403}
1404
718e3744 1405DEFUN (no_synchronization,
1406 no_synchronization_cmd,
1407 "no synchronization",
1408 NO_STR
1409 "Perform IGP synchronization\n")
1410{
d62a17ae 1411 return CMD_SUCCESS;
718e3744 1412}
1413
1414DEFUN (no_auto_summary,
1415 no_auto_summary_cmd,
1416 "no auto-summary",
1417 NO_STR
1418 "Enable automatic network number summarization\n")
1419{
d62a17ae 1420 return CMD_SUCCESS;
718e3744 1421}
3d515fd9 1422
718e3744 1423/* "router bgp" commands. */
1ca2fd11
IR
1424DEFUN_NOSH (router_bgp,
1425 router_bgp_cmd,
1426 "router bgp [(1-4294967295)$instasn [<view|vrf> VIEWVRFNAME]]",
1427 ROUTER_STR
1428 BGP_STR
1429 AS_STR
1430 BGP_INSTANCE_HELP_STR)
718e3744 1431{
d62a17ae 1432 int idx_asn = 2;
1433 int idx_view_vrf = 3;
1434 int idx_vrf = 4;
1ca2fd11
IR
1435 int is_new_bgp = 0;
1436 int ret;
d62a17ae 1437 as_t as;
1438 struct bgp *bgp;
1439 const char *name = NULL;
1440 enum bgp_instance_type inst_type;
1441
1442 // "router bgp" without an ASN
1443 if (argc == 2) {
1444 // Pending: Make VRF option available for ASN less config
1abef40f 1445 bgp = bgp_get_default();
d62a17ae 1446
1abef40f 1447 if (bgp == NULL) {
d62a17ae 1448 vty_out(vty, "%% No BGP process is configured\n");
1449 return CMD_WARNING_CONFIG_FAILED;
1450 }
1451
1452 if (listcount(bm->bgp) > 1) {
996c9314 1453 vty_out(vty, "%% Please specify ASN and VRF\n");
d62a17ae 1454 return CMD_WARNING_CONFIG_FAILED;
1455 }
1456 }
1457
1458 // "router bgp X"
1459 else {
ff8a8a7a 1460 as = strtoul(argv[idx_asn]->arg, NULL, 10);
1ca2fd11 1461
cc413e2a
DA
1462 if (as == BGP_PRIVATE_AS_MAX || as == BGP_AS4_MAX)
1463 vty_out(vty, "Reserved AS used (%u|%u); AS is %u\n",
1464 BGP_PRIVATE_AS_MAX, BGP_AS4_MAX, as);
1465
d62a17ae 1466 inst_type = BGP_INSTANCE_TYPE_DEFAULT;
1467 if (argc > 3) {
1468 name = argv[idx_vrf]->arg;
1469
9a8bdf1c
PG
1470 if (!strcmp(argv[idx_view_vrf]->text, "vrf")) {
1471 if (strmatch(name, VRF_DEFAULT_NAME))
1472 name = NULL;
1473 else
1474 inst_type = BGP_INSTANCE_TYPE_VRF;
1ca2fd11 1475 } else if (!strcmp(argv[idx_view_vrf]->text, "view"))
d62a17ae 1476 inst_type = BGP_INSTANCE_TYPE_VIEW;
d62a17ae 1477 }
1478
1ca2fd11
IR
1479 if (inst_type == BGP_INSTANCE_TYPE_DEFAULT)
1480 is_new_bgp = (bgp_lookup(as, name) == NULL);
3bd70bf8 1481
1ca2fd11
IR
1482 ret = bgp_get_vty(&bgp, &as, name, inst_type);
1483 switch (ret) {
1484 case BGP_ERR_AS_MISMATCH:
1485 vty_out(vty, "BGP is already running; AS is %u\n", as);
1486 return CMD_WARNING_CONFIG_FAILED;
1487 case BGP_ERR_INSTANCE_MISMATCH:
1488 vty_out(vty,
1489 "BGP instance name and AS number mismatch\n");
1490 vty_out(vty,
1491 "BGP instance is already running; AS is %u\n",
1492 as);
1493 return CMD_WARNING_CONFIG_FAILED;
ff8a8a7a 1494 }
1ca2fd11
IR
1495
1496 /*
1497 * If we just instantiated the default instance, complete
1498 * any pending VRF-VPN leaking that was configured via
1499 * earlier "router bgp X vrf FOO" blocks.
1500 */
1501 if (is_new_bgp && inst_type == BGP_INSTANCE_TYPE_DEFAULT)
1502 vpn_leak_postchange_all();
1503
1504 if (inst_type == BGP_INSTANCE_TYPE_VRF)
1505 bgp_vpn_leak_export(bgp);
1506 /* Pending: handle when user tries to change a view to vrf n vv.
1507 */
d62a17ae 1508 }
1509
1ca2fd11
IR
1510 /* unset the auto created flag as the user config is now present */
1511 UNSET_FLAG(bgp->vrf_flags, BGP_VRF_AUTO);
1512 VTY_PUSH_CONTEXT(BGP_NODE, bgp);
1513
1514 return CMD_SUCCESS;
718e3744 1515}
1516
718e3744 1517/* "no router bgp" commands. */
1ca2fd11
IR
1518DEFUN (no_router_bgp,
1519 no_router_bgp_cmd,
1520 "no router bgp [(1-4294967295)$instasn [<view|vrf> VIEWVRFNAME]]",
1521 NO_STR
1522 ROUTER_STR
1523 BGP_STR
1524 AS_STR
1525 BGP_INSTANCE_HELP_STR)
718e3744 1526{
4fd9919e 1527 int idx_asn = 3;
d62a17ae 1528 int idx_vrf = 5;
1ca2fd11 1529 as_t as;
4fd9919e 1530 struct bgp *bgp;
d62a17ae 1531 const char *name = NULL;
718e3744 1532
d62a17ae 1533 // "no router bgp" without an ASN
1534 if (argc == 3) {
1535 // Pending: Make VRF option available for ASN less config
8382083a 1536 bgp = bgp_get_default();
718e3744 1537
8382083a 1538 if (bgp == NULL) {
d62a17ae 1539 vty_out(vty, "%% No BGP process is configured\n");
1540 return CMD_WARNING_CONFIG_FAILED;
1541 }
7fb21a9f 1542
d62a17ae 1543 if (listcount(bm->bgp) > 1) {
996c9314 1544 vty_out(vty, "%% Please specify ASN and VRF\n");
d62a17ae 1545 return CMD_WARNING_CONFIG_FAILED;
1546 }
4fd9919e 1547
4fd9919e 1548 if (bgp->l3vni) {
be125e6f 1549 vty_out(vty, "%% Please unconfigure l3vni %u\n",
4fd9919e
IR
1550 bgp->l3vni);
1551 return CMD_WARNING_CONFIG_FAILED;
1552 }
d62a17ae 1553 } else {
4fd9919e
IR
1554 as = strtoul(argv[idx_asn]->arg, NULL, 10);
1555
1ca42c8d 1556 if (argc > 4) {
d62a17ae 1557 name = argv[idx_vrf]->arg;
1ca42c8d
IR
1558 if (strmatch(argv[idx_vrf - 1]->text, "vrf")
1559 && strmatch(name, VRF_DEFAULT_NAME))
1560 name = NULL;
1561 }
7fb21a9f 1562
4fd9919e
IR
1563 /* Lookup bgp structure. */
1564 bgp = bgp_lookup(as, name);
1565 if (!bgp) {
1566 vty_out(vty, "%% Can't find BGP instance\n");
1567 return CMD_WARNING_CONFIG_FAILED;
1568 }
1569
1570 if (bgp->l3vni) {
1571 vty_out(vty, "%% Please unconfigure l3vni %u\n",
1572 bgp->l3vni);
1573 return CMD_WARNING_CONFIG_FAILED;
1574 }
1575
1576 /* Cannot delete default instance if vrf instances exist */
1577 if (bgp->inst_type == BGP_INSTANCE_TYPE_DEFAULT) {
1578 struct listnode *node;
1579 struct bgp *tmp_bgp;
1580
1581 for (ALL_LIST_ELEMENTS_RO(bm->bgp, node, tmp_bgp)) {
1582 if (tmp_bgp->inst_type != BGP_INSTANCE_TYPE_VRF)
1583 continue;
1584 if (CHECK_FLAG(tmp_bgp->af_flags[AFI_IP][SAFI_UNICAST],
1585 BGP_CONFIG_MPLSVPN_TO_VRF_IMPORT) ||
1586 CHECK_FLAG(tmp_bgp->af_flags[AFI_IP6][SAFI_UNICAST],
1587 BGP_CONFIG_MPLSVPN_TO_VRF_IMPORT) ||
1588 CHECK_FLAG(tmp_bgp->af_flags[AFI_IP][SAFI_UNICAST],
1589 BGP_CONFIG_VRF_TO_MPLSVPN_EXPORT) ||
1590 CHECK_FLAG(tmp_bgp->af_flags[AFI_IP6][SAFI_UNICAST],
1591 BGP_CONFIG_VRF_TO_MPLSVPN_EXPORT) ||
1592 CHECK_FLAG(tmp_bgp->af_flags[AFI_IP][SAFI_UNICAST],
1593 BGP_CONFIG_VRF_TO_VRF_EXPORT) ||
1594 CHECK_FLAG(tmp_bgp->af_flags[AFI_IP6][SAFI_UNICAST],
1595 BGP_CONFIG_VRF_TO_VRF_EXPORT) ||
1596 (bgp == bgp_get_evpn() &&
1597 (CHECK_FLAG(tmp_bgp->af_flags[AFI_L2VPN][SAFI_EVPN],
1598 BGP_L2VPN_EVPN_ADV_IPV4_UNICAST) ||
1599 CHECK_FLAG(tmp_bgp->af_flags[AFI_L2VPN][SAFI_EVPN],
1600 BGP_L2VPN_EVPN_ADV_IPV4_UNICAST_GW_IP) ||
1601 CHECK_FLAG(tmp_bgp->af_flags[AFI_L2VPN][SAFI_EVPN],
1602 BGP_L2VPN_EVPN_ADV_IPV6_UNICAST) ||
1603 CHECK_FLAG(tmp_bgp->af_flags[AFI_L2VPN][SAFI_EVPN],
1604 BGP_L2VPN_EVPN_ADV_IPV6_UNICAST_GW_IP))) ||
f33bf7c0 1605 (hashcount(tmp_bgp->vnihash))) {
4fd9919e
IR
1606 vty_out(vty,
1607 "%% Cannot delete default BGP instance. Dependent VRF instances exist\n");
1608 return CMD_WARNING_CONFIG_FAILED;
1609 }
1610 }
1611 }
d62a17ae 1612 }
718e3744 1613
1ca2fd11 1614 bgp_delete(bgp);
718e3744 1615
1ca2fd11 1616 return CMD_SUCCESS;
718e3744 1617}
1618
425bd64b
PS
1619/* bgp session-dscp */
1620
1621DEFPY (bgp_session_dscp,
1622 bgp_session_dscp_cmd,
1623 "bgp session-dscp (0-63)$dscp",
1624 BGP_STR
1625 "Override default (C6) bgp TCP session DSCP value\n"
1626 "Manually configured dscp parameter\n")
1627{
1628 bm->tcp_dscp = dscp << 2;
1629
1630 return CMD_SUCCESS;
1631}
1632
1633DEFPY (no_bgp_session_dscp,
1634 no_bgp_session_dscp_cmd,
1635 "no bgp session-dscp [(0-63)]",
1636 NO_STR
1637 BGP_STR
1638 "Override default (C6) bgp TCP session DSCP value\n"
1639 "Manually configured dscp parameter\n")
1640{
1641 bm->tcp_dscp = IPTOS_PREC_INTERNETCONTROL;
1642
1643 return CMD_SUCCESS;
1644}
718e3744 1645
ff8a8a7a
CS
1646/* BGP router-id. */
1647
1ca2fd11
IR
1648DEFPY (bgp_router_id,
1649 bgp_router_id_cmd,
1650 "bgp router-id A.B.C.D",
1651 BGP_STR
1652 "Override configured router identifier\n"
1653 "Manually configured router identifier\n")
718e3744 1654{
1ca2fd11
IR
1655 VTY_DECLVAR_CONTEXT(bgp, bgp);
1656 bgp_router_id_static_set(bgp, router_id);
1657 return CMD_SUCCESS;
ff8a8a7a 1658}
718e3744 1659
1ca2fd11
IR
1660DEFPY (no_bgp_router_id,
1661 no_bgp_router_id_cmd,
1662 "no bgp router-id [A.B.C.D]",
1663 NO_STR
1664 BGP_STR
1665 "Override configured router identifier\n"
1666 "Manually configured router identifier\n")
ff8a8a7a 1667{
1ca2fd11 1668 VTY_DECLVAR_CONTEXT(bgp, bgp);
718e3744 1669
1ca2fd11
IR
1670 if (router_id_str) {
1671 if (!IPV4_ADDR_SAME(&bgp->router_id_static, &router_id)) {
1672 vty_out(vty, "%% BGP router-id doesn't match\n");
1673 return CMD_WARNING_CONFIG_FAILED;
1674 }
1675 }
718e3744 1676
1ca2fd11
IR
1677 router_id.s_addr = 0;
1678 bgp_router_id_static_set(bgp, router_id);
1679
1680 return CMD_SUCCESS;
ff8a8a7a 1681}
6b0655a2 1682
ed0e57e3 1683DEFPY(bgp_community_alias, bgp_community_alias_cmd,
b4ad2fae 1684 "[no$no] bgp community alias WORD$community ALIAS_NAME$alias_name",
ed0e57e3
DA
1685 NO_STR BGP_STR
1686 "Add community specific parameters\n"
1687 "Create an alias for a community\n"
1688 "Community (AA:BB or AA:BB:CC)\n"
1689 "Alias name\n")
1690{
8cfa1e78 1691 struct community_alias ca = {};
ed0e57e3
DA
1692 struct community_alias *lookup_community;
1693 struct community_alias *lookup_alias;
d13d137a
DA
1694 struct community *comm;
1695 struct lcommunity *lcomm;
1696 uint8_t invalid = 0;
ed0e57e3 1697
d13d137a
DA
1698 comm = community_str2com(community);
1699 if (!comm)
1700 invalid++;
1701 community_free(&comm);
1702
1703 lcomm = lcommunity_str2com(community);
1704 if (!lcomm)
1705 invalid++;
1706 lcommunity_free(&lcomm);
1707
1708 if (invalid > 1) {
ed0e57e3
DA
1709 vty_out(vty, "Invalid community format\n");
1710 return CMD_WARNING;
1711 }
1712
8cfa1e78
DA
1713 strlcpy(ca.community, community, sizeof(ca.community));
1714 strlcpy(ca.alias, alias_name, sizeof(ca.alias));
ed0e57e3 1715
8cfa1e78
DA
1716 lookup_community = bgp_ca_community_lookup(&ca);
1717 lookup_alias = bgp_ca_alias_lookup(&ca);
ed0e57e3
DA
1718
1719 if (no) {
8cfa1e78
DA
1720 bgp_ca_alias_delete(&ca);
1721 bgp_ca_community_delete(&ca);
ed0e57e3
DA
1722 } else {
1723 if (lookup_alias) {
1724 /* Lookup if community hash table has an item
1725 * with the same alias name.
1726 */
8cfa1e78
DA
1727 strlcpy(ca.community, lookup_alias->community,
1728 sizeof(ca.community));
1729 if (bgp_ca_community_lookup(&ca)) {
ed0e57e3
DA
1730 vty_out(vty,
1731 "community (%s) already has this alias (%s)\n",
1732 lookup_alias->community,
1733 lookup_alias->alias);
1734 return CMD_WARNING;
1735 }
8cfa1e78 1736 bgp_ca_alias_delete(&ca);
ed0e57e3
DA
1737 }
1738
8cfa1e78
DA
1739 if (lookup_community) {
1740 /* Lookup if alias hash table has an item
1741 * with the same community.
1742 */
1743 strlcpy(ca.alias, lookup_community->alias,
1744 sizeof(ca.alias));
1745 if (bgp_ca_alias_lookup(&ca)) {
1746 vty_out(vty,
1747 "alias (%s) already has this community (%s)\n",
1748 lookup_community->alias,
1749 lookup_community->community);
1750 return CMD_WARNING;
1751 }
1752 bgp_ca_community_delete(&ca);
1753 }
ed0e57e3 1754
8cfa1e78
DA
1755 bgp_ca_alias_insert(&ca);
1756 bgp_ca_community_insert(&ca);
ed0e57e3
DA
1757 }
1758
1759 return CMD_SUCCESS;
1760}
1761
9acb67cb
DS
1762DEFPY (bgp_global_suppress_fib_pending,
1763 bgp_global_suppress_fib_pending_cmd,
1764 "[no] bgp suppress-fib-pending",
1765 NO_STR
1766 BGP_STR
1767 "Advertise only routes that are programmed in kernel to peers globally\n")
1768{
1769 bm_wait_for_fib_set(!no);
1770
1771 return CMD_SUCCESS;
1772}
1773
c208c586
S
1774DEFPY (bgp_suppress_fib_pending,
1775 bgp_suppress_fib_pending_cmd,
1776 "[no] bgp suppress-fib-pending",
1777 NO_STR
1778 BGP_STR
1779 "Advertise only routes that are programmed in kernel to peers\n")
1780{
1781 VTY_DECLVAR_CONTEXT(bgp, bgp);
1782
1783 bgp_suppress_fib_pending_set(bgp, !no);
1784 return CMD_SUCCESS;
1785}
1786
1787
718e3744 1788/* BGP Cluster ID. */
1ca2fd11
IR
1789DEFUN (bgp_cluster_id,
1790 bgp_cluster_id_cmd,
1791 "bgp cluster-id <A.B.C.D|(1-4294967295)>",
1792 BGP_STR
1793 "Configure Route-Reflector Cluster-id\n"
1794 "Route-Reflector Cluster-id in IP address format\n"
1795 "Route-Reflector Cluster-id as 32 bit quantity\n")
718e3744 1796{
1ca2fd11 1797 VTY_DECLVAR_CONTEXT(bgp, bgp);
d62a17ae 1798 int idx_ipv4 = 2;
1ca2fd11
IR
1799 int ret;
1800 struct in_addr cluster;
1801
1802 ret = inet_aton(argv[idx_ipv4]->arg, &cluster);
1803 if (!ret) {
1804 vty_out(vty, "%% Malformed bgp cluster identifier\n");
1805 return CMD_WARNING_CONFIG_FAILED;
1806 }
718e3744 1807
1ca2fd11
IR
1808 bgp_cluster_id_set(bgp, &cluster);
1809 bgp_clear_star_soft_out(vty, bgp->name);
718e3744 1810
1ca2fd11 1811 return CMD_SUCCESS;
718e3744 1812}
1813
1ca2fd11
IR
1814DEFUN (no_bgp_cluster_id,
1815 no_bgp_cluster_id_cmd,
1816 "no bgp cluster-id [<A.B.C.D|(1-4294967295)>]",
1817 NO_STR
1818 BGP_STR
1819 "Configure Route-Reflector Cluster-id\n"
1820 "Route-Reflector Cluster-id in IP address format\n"
1821 "Route-Reflector Cluster-id as 32 bit quantity\n")
718e3744 1822{
1ca2fd11
IR
1823 VTY_DECLVAR_CONTEXT(bgp, bgp);
1824 bgp_cluster_id_unset(bgp);
1825 bgp_clear_star_soft_out(vty, bgp->name);
718e3744 1826
1ca2fd11 1827 return CMD_SUCCESS;
718e3744 1828}
1829
c163f297
DS
1830DEFPY (bgp_norib,
1831 bgp_norib_cmd,
1832 "bgp no-rib",
1833 BGP_STR
1834 "Disable BGP route installation to RIB (Zebra)\n")
1835{
1836 if (bgp_option_check(BGP_OPT_NO_FIB)) {
1837 vty_out(vty,
1838 "%% No-RIB option is already set, nothing to do here.\n");
1839 return CMD_SUCCESS;
1840 }
1841
1842 bgp_option_norib_set_runtime();
1843
1844 return CMD_SUCCESS;
1845}
1846
1847DEFPY (no_bgp_norib,
1848 no_bgp_norib_cmd,
1849 "no bgp no-rib",
1850 NO_STR
1851 BGP_STR
1852 "Disable BGP route installation to RIB (Zebra)\n")
1853{
1854 if (!bgp_option_check(BGP_OPT_NO_FIB)) {
1855 vty_out(vty,
1856 "%% No-RIB option is not set, nothing to do here.\n");
1857 return CMD_SUCCESS;
1858 }
1859
1860 bgp_option_norib_unset_runtime();
1861
1862 return CMD_SUCCESS;
1863}
1864
e46723a5
DS
1865DEFPY (no_bgp_send_extra_data,
1866 no_bgp_send_extra_data_cmd,
1867 "[no] bgp send-extra-data zebra",
1868 NO_STR
1869 BGP_STR
1870 "Extra data to Zebra for display/use\n"
1871 "To zebra\n")
1872{
ec0acb80
DA
1873 if (no)
1874 UNSET_FLAG(bm->flags, BM_FLAG_SEND_EXTRA_DATA_TO_ZEBRA);
1875 else
1876 SET_FLAG(bm->flags, BM_FLAG_SEND_EXTRA_DATA_TO_ZEBRA);
e46723a5
DS
1877
1878 return CMD_SUCCESS;
1879}
1880
1ca2fd11
IR
1881DEFUN (bgp_confederation_identifier,
1882 bgp_confederation_identifier_cmd,
1883 "bgp confederation identifier (1-4294967295)",
e9273987 1884 BGP_STR
1ca2fd11
IR
1885 "AS confederation parameters\n"
1886 "AS number\n"
1887 "Set routing domain confederation AS\n")
718e3744 1888{
1ca2fd11 1889 VTY_DECLVAR_CONTEXT(bgp, bgp);
d62a17ae 1890 int idx_number = 3;
1ca2fd11 1891 as_t as;
718e3744 1892
1ca2fd11 1893 as = strtoul(argv[idx_number]->arg, NULL, 10);
718e3744 1894
1ca2fd11 1895 bgp_confederation_id_set(bgp, as);
718e3744 1896
1ca2fd11 1897 return CMD_SUCCESS;
718e3744 1898}
1899
1ca2fd11
IR
1900DEFUN (no_bgp_confederation_identifier,
1901 no_bgp_confederation_identifier_cmd,
1902 "no bgp confederation identifier [(1-4294967295)]",
1903 NO_STR
e9273987 1904 BGP_STR
1ca2fd11
IR
1905 "AS confederation parameters\n"
1906 "AS number\n"
1907 "Set routing domain confederation AS\n")
ff8a8a7a 1908{
1ca2fd11
IR
1909 VTY_DECLVAR_CONTEXT(bgp, bgp);
1910 bgp_confederation_id_unset(bgp);
1911
1912 return CMD_SUCCESS;
ff8a8a7a
CS
1913}
1914
1ca2fd11
IR
1915DEFUN (bgp_confederation_peers,
1916 bgp_confederation_peers_cmd,
1917 "bgp confederation peers (1-4294967295)...",
e9273987 1918 BGP_STR
1ca2fd11
IR
1919 "AS confederation parameters\n"
1920 "Peer ASs in BGP confederation\n"
1921 AS_STR)
718e3744 1922{
1ca2fd11 1923 VTY_DECLVAR_CONTEXT(bgp, bgp);
d62a17ae 1924 int idx_asn = 3;
1ca2fd11 1925 as_t as;
d62a17ae 1926 int i;
718e3744 1927
1ca2fd11
IR
1928 for (i = idx_asn; i < argc; i++) {
1929 as = strtoul(argv[i]->arg, NULL, 10);
718e3744 1930
1ca2fd11
IR
1931 if (bgp->as == as) {
1932 vty_out(vty,
1933 "%% Local member-AS not allowed in confed peer list\n");
1934 continue;
1935 }
1936
1937 bgp_confederation_peers_add(bgp, as);
1938 }
1939 return CMD_SUCCESS;
718e3744 1940}
1941
1ca2fd11
IR
1942DEFUN (no_bgp_confederation_peers,
1943 no_bgp_confederation_peers_cmd,
1944 "no bgp confederation peers (1-4294967295)...",
1945 NO_STR
e9273987 1946 BGP_STR
1ca2fd11
IR
1947 "AS confederation parameters\n"
1948 "Peer ASs in BGP confederation\n"
1949 AS_STR)
718e3744 1950{
1ca2fd11 1951 VTY_DECLVAR_CONTEXT(bgp, bgp);
d62a17ae 1952 int idx_asn = 4;
1ca2fd11 1953 as_t as;
d62a17ae 1954 int i;
718e3744 1955
1ca2fd11
IR
1956 for (i = idx_asn; i < argc; i++) {
1957 as = strtoul(argv[i]->arg, NULL, 10);
ff8a8a7a 1958
1ca2fd11
IR
1959 bgp_confederation_peers_remove(bgp, as);
1960 }
1961 return CMD_SUCCESS;
718e3744 1962}
6b0655a2 1963
5e242b0d
DS
1964/**
1965 * Central routine for maximum-paths configuration.
1966 * @peer_type: BGP_PEER_EBGP or BGP_PEER_IBGP
1967 * @set: 1 for setting values, 0 for removing the max-paths config.
1968 */
585f1adc
IR
1969static int bgp_maxpaths_config_vty(struct vty *vty, int peer_type,
1970 const char *mpaths, uint16_t options,
1971 int set)
d62a17ae 1972{
585f1adc
IR
1973 VTY_DECLVAR_CONTEXT(bgp, bgp);
1974 uint16_t maxpaths = 0;
d62a17ae 1975 int ret;
585f1adc
IR
1976 afi_t afi;
1977 safi_t safi;
1978
1979 afi = bgp_node_afi(vty);
1980 safi = bgp_node_safi(vty);
d62a17ae 1981
1982 if (set) {
585f1adc 1983 maxpaths = strtol(mpaths, NULL, 10);
d62a17ae 1984 if (maxpaths > multipath_num) {
585f1adc 1985 vty_out(vty,
d62a17ae 1986 "%% Maxpaths Specified: %d is > than multipath num specified on bgp command line %d",
1987 maxpaths, multipath_num);
1988 return CMD_WARNING_CONFIG_FAILED;
1989 }
1990 ret = bgp_maximum_paths_set(bgp, afi, safi, peer_type, maxpaths,
1991 options);
1992 } else
1993 ret = bgp_maximum_paths_unset(bgp, afi, safi, peer_type);
1994
1995 if (ret < 0) {
585f1adc 1996 vty_out(vty,
d62a17ae 1997 "%% Failed to %sset maximum-paths %s %u for afi %u, safi %u\n",
1998 (set == 1) ? "" : "un",
1999 (peer_type == BGP_PEER_EBGP) ? "ebgp" : "ibgp",
2000 maxpaths, afi, safi);
2001 return CMD_WARNING_CONFIG_FAILED;
2002 }
2003
2004 bgp_recalculate_all_bestpaths(bgp);
2005
2006 return CMD_SUCCESS;
165b5fff
JB
2007}
2008
1ca2fd11
IR
2009DEFUN (bgp_maxmed_admin,
2010 bgp_maxmed_admin_cmd,
2011 "bgp max-med administrative ",
2012 BGP_STR
2013 "Advertise routes with max-med\n"
2014 "Administratively applied, for an indefinite period\n")
abc920f8 2015{
1ca2fd11 2016 VTY_DECLVAR_CONTEXT(bgp, bgp);
abc920f8 2017
1ca2fd11
IR
2018 bgp->v_maxmed_admin = 1;
2019 bgp->maxmed_admin_value = BGP_MAXMED_VALUE_DEFAULT;
ff8a8a7a 2020
1ca2fd11 2021 bgp_maxmed_update(bgp);
abc920f8 2022
1ca2fd11 2023 return CMD_SUCCESS;
ff8a8a7a
CS
2024}
2025
1ca2fd11
IR
2026DEFUN (bgp_maxmed_admin_medv,
2027 bgp_maxmed_admin_medv_cmd,
2028 "bgp max-med administrative (0-4294967295)",
2029 BGP_STR
2030 "Advertise routes with max-med\n"
2031 "Administratively applied, for an indefinite period\n"
2032 "Max MED value to be used\n")
abc920f8 2033{
1ca2fd11 2034 VTY_DECLVAR_CONTEXT(bgp, bgp);
d62a17ae 2035 int idx_number = 3;
abc920f8 2036
1ca2fd11
IR
2037 bgp->v_maxmed_admin = 1;
2038 bgp->maxmed_admin_value = strtoul(argv[idx_number]->arg, NULL, 10);
abc920f8 2039
1ca2fd11 2040 bgp_maxmed_update(bgp);
abc920f8 2041
1ca2fd11 2042 return CMD_SUCCESS;
abc920f8
DS
2043}
2044
1ca2fd11
IR
2045DEFUN (no_bgp_maxmed_admin,
2046 no_bgp_maxmed_admin_cmd,
2047 "no bgp max-med administrative [(0-4294967295)]",
2048 NO_STR
2049 BGP_STR
2050 "Advertise routes with max-med\n"
2051 "Administratively applied, for an indefinite period\n"
2052 "Max MED value to be used\n")
abc920f8 2053{
1ca2fd11
IR
2054 VTY_DECLVAR_CONTEXT(bgp, bgp);
2055 bgp->v_maxmed_admin = BGP_MAXMED_ADMIN_UNCONFIGURED;
2056 bgp->maxmed_admin_value = BGP_MAXMED_VALUE_DEFAULT;
2057 bgp_maxmed_update(bgp);
ff8a8a7a 2058
1ca2fd11 2059 return CMD_SUCCESS;
abc920f8
DS
2060}
2061
1ca2fd11
IR
2062DEFUN (bgp_maxmed_onstartup,
2063 bgp_maxmed_onstartup_cmd,
2064 "bgp max-med on-startup (5-86400) [(0-4294967295)]",
2065 BGP_STR
2066 "Advertise routes with max-med\n"
2067 "Effective on a startup\n"
2068 "Time (seconds) period for max-med\n"
2069 "Max MED value to be used\n")
abc920f8 2070{
1ca2fd11 2071 VTY_DECLVAR_CONTEXT(bgp, bgp);
d62a17ae 2072 int idx = 0;
4668a151 2073
9b01d289
DA
2074 if (argv_find(argv, argc, "(5-86400)", &idx))
2075 bgp->v_maxmed_onstartup = strtoul(argv[idx]->arg, NULL, 10);
d62a17ae 2076 if (argv_find(argv, argc, "(0-4294967295)", &idx))
1ca2fd11 2077 bgp->maxmed_onstartup_value = strtoul(argv[idx]->arg, NULL, 10);
d62a17ae 2078 else
1ca2fd11 2079 bgp->maxmed_onstartup_value = BGP_MAXMED_VALUE_DEFAULT;
abc920f8 2080
1ca2fd11
IR
2081 bgp_maxmed_update(bgp);
2082
2083 return CMD_SUCCESS;
abc920f8
DS
2084}
2085
1ca2fd11
IR
2086DEFUN (no_bgp_maxmed_onstartup,
2087 no_bgp_maxmed_onstartup_cmd,
2088 "no bgp max-med on-startup [(5-86400) [(0-4294967295)]]",
2089 NO_STR
2090 BGP_STR
2091 "Advertise routes with max-med\n"
2092 "Effective on a startup\n"
2093 "Time (seconds) period for max-med\n"
2094 "Max MED value to be used\n")
abc920f8 2095{
1ca2fd11
IR
2096 VTY_DECLVAR_CONTEXT(bgp, bgp);
2097
2098 /* Cancel max-med onstartup if its on */
2099 if (bgp->t_maxmed_onstartup) {
c3aaa89a 2100 THREAD_OFF(bgp->t_maxmed_onstartup);
1ca2fd11
IR
2101 bgp->maxmed_onstartup_over = 1;
2102 }
abc920f8 2103
1ca2fd11
IR
2104 bgp->v_maxmed_onstartup = BGP_MAXMED_ONSTARTUP_UNCONFIGURED;
2105 bgp->maxmed_onstartup_value = BGP_MAXMED_VALUE_DEFAULT;
abc920f8 2106
1ca2fd11
IR
2107 bgp_maxmed_update(bgp);
2108
2109 return CMD_SUCCESS;
abc920f8
DS
2110}
2111
d70583f7
D
2112static int bgp_global_update_delay_config_vty(struct vty *vty,
2113 uint16_t update_delay,
2114 uint16_t establish_wait)
2115{
2116 struct listnode *node, *nnode;
2117 struct bgp *bgp;
2118 bool vrf_cfg = false;
2119
2120 /*
2121 * See if update-delay is set per-vrf and warn user to delete it
2122 * Note that we only need to check this if this is the first time
2123 * setting the global config.
2124 */
2125 if (bm->v_update_delay == BGP_UPDATE_DELAY_DEF) {
2126 for (ALL_LIST_ELEMENTS(bm->bgp, node, nnode, bgp)) {
2127 if (bgp->v_update_delay != BGP_UPDATE_DELAY_DEF) {
2128 vty_out(vty,
2129 "%% update-delay configuration found in vrf %s\n",
2130 bgp->inst_type == BGP_INSTANCE_TYPE_DEFAULT
2131 ? VRF_DEFAULT_NAME
2132 : bgp->name);
2133 vrf_cfg = true;
2134 }
2135 }
2136 }
2137
2138 if (vrf_cfg) {
2139 vty_out(vty,
2140 "%%Failed: global update-delay config not permitted\n");
2141 return CMD_WARNING;
2142 }
2143
2144 if (!establish_wait) { /* update-delay <delay> */
2145 bm->v_update_delay = update_delay;
2146 bm->v_establish_wait = bm->v_update_delay;
2147 } else {
2148 /* update-delay <delay> <establish-wait> */
2149 if (update_delay < establish_wait) {
2150 vty_out(vty,
2151 "%%Failed: update-delay less than the establish-wait!\n");
2152 return CMD_WARNING_CONFIG_FAILED;
2153 }
2154
2155 bm->v_update_delay = update_delay;
2156 bm->v_establish_wait = establish_wait;
2157 }
2158
2159 for (ALL_LIST_ELEMENTS(bm->bgp, node, nnode, bgp)) {
2160 bgp->v_update_delay = bm->v_update_delay;
2161 bgp->v_establish_wait = bm->v_establish_wait;
2162 }
2163
2164 return CMD_SUCCESS;
2165}
2166
2167static int bgp_global_update_delay_deconfig_vty(struct vty *vty)
2168{
2169 struct listnode *node, *nnode;
2170 struct bgp *bgp;
2171
2172 bm->v_update_delay = BGP_UPDATE_DELAY_DEF;
2173 bm->v_establish_wait = bm->v_update_delay;
2174
2175 for (ALL_LIST_ELEMENTS(bm->bgp, node, nnode, bgp)) {
2176 bgp->v_update_delay = bm->v_update_delay;
2177 bgp->v_establish_wait = bm->v_establish_wait;
2178 }
2179
2180 return CMD_SUCCESS;
2181}
2182
2183static int bgp_update_delay_config_vty(struct vty *vty, uint16_t update_delay,
2184 uint16_t establish_wait)
f188f2c4 2185{
d62a17ae 2186 VTY_DECLVAR_CONTEXT(bgp, bgp);
f188f2c4 2187
d70583f7
D
2188 /* if configured globally, per-instance config is not allowed */
2189 if (bm->v_update_delay) {
2190 vty_out(vty,
2191 "%%Failed: per-vrf update-delay config not permitted with global update-delay\n");
2192 return CMD_WARNING_CONFIG_FAILED;
2193 }
2194
f188f2c4 2195
d70583f7 2196 if (!establish_wait) /* update-delay <delay> */
d62a17ae 2197 {
2198 bgp->v_update_delay = update_delay;
2199 bgp->v_establish_wait = bgp->v_update_delay;
2200 return CMD_SUCCESS;
2201 }
f188f2c4 2202
d62a17ae 2203 /* update-delay <delay> <establish-wait> */
d62a17ae 2204 if (update_delay < establish_wait) {
2205 vty_out(vty,
2206 "%%Failed: update-delay less than the establish-wait!\n");
2207 return CMD_WARNING_CONFIG_FAILED;
2208 }
f188f2c4 2209
d62a17ae 2210 bgp->v_update_delay = update_delay;
2211 bgp->v_establish_wait = establish_wait;
f188f2c4 2212
d62a17ae 2213 return CMD_SUCCESS;
f188f2c4
DS
2214}
2215
d62a17ae 2216static int bgp_update_delay_deconfig_vty(struct vty *vty)
f188f2c4 2217{
d62a17ae 2218 VTY_DECLVAR_CONTEXT(bgp, bgp);
f188f2c4 2219
d70583f7
D
2220 /* If configured globally, cannot remove from one bgp instance */
2221 if (bm->v_update_delay) {
2222 vty_out(vty,
2223 "%%Failed: bgp update-delay configured globally. Delete per-vrf not permitted\n");
2224 return CMD_WARNING_CONFIG_FAILED;
2225 }
d62a17ae 2226 bgp->v_update_delay = BGP_UPDATE_DELAY_DEF;
2227 bgp->v_establish_wait = bgp->v_update_delay;
f188f2c4 2228
d62a17ae 2229 return CMD_SUCCESS;
f188f2c4
DS
2230}
2231
2b791107 2232void bgp_config_write_update_delay(struct vty *vty, struct bgp *bgp)
f188f2c4 2233{
d70583f7
D
2234 /* If configured globally, no need to display per-instance value */
2235 if (bgp->v_update_delay != bm->v_update_delay) {
d62a17ae 2236 vty_out(vty, " update-delay %d", bgp->v_update_delay);
2237 if (bgp->v_update_delay != bgp->v_establish_wait)
2238 vty_out(vty, " %d", bgp->v_establish_wait);
2239 vty_out(vty, "\n");
2240 }
f188f2c4
DS
2241}
2242
d70583f7
D
2243/* Global update-delay configuration */
2244DEFPY (bgp_global_update_delay,
2245 bgp_global_update_delay_cmd,
2246 "bgp update-delay (0-3600)$delay [(1-3600)$wait]",
2247 BGP_STR
2248 "Force initial delay for best-path and updates for all bgp instances\n"
2249 "Max delay in seconds\n"
2250 "Establish wait in seconds\n")
2251{
2252 return bgp_global_update_delay_config_vty(vty, delay, wait);
2253}
f188f2c4 2254
d70583f7
D
2255/* Global update-delay deconfiguration */
2256DEFPY (no_bgp_global_update_delay,
2257 no_bgp_global_update_delay_cmd,
2258 "no bgp update-delay [(0-3600) [(1-3600)]]",
2259 NO_STR
2260 BGP_STR
f188f2c4 2261 "Force initial delay for best-path and updates\n"
d70583f7
D
2262 "Max delay in seconds\n"
2263 "Establish wait in seconds\n")
f188f2c4 2264{
d70583f7 2265 return bgp_global_update_delay_deconfig_vty(vty);
f188f2c4
DS
2266}
2267
d70583f7
D
2268/* Update-delay configuration */
2269
2270DEFPY (bgp_update_delay,
2271 bgp_update_delay_cmd,
2272 "update-delay (0-3600)$delay [(1-3600)$wait]",
f188f2c4 2273 "Force initial delay for best-path and updates\n"
d70583f7
D
2274 "Max delay in seconds\n"
2275 "Establish wait in seconds\n")
f188f2c4 2276{
d70583f7 2277 return bgp_update_delay_config_vty(vty, delay, wait);
f188f2c4
DS
2278}
2279
2280/* Update-delay deconfiguration */
d70583f7 2281DEFPY (no_bgp_update_delay,
f188f2c4 2282 no_bgp_update_delay_cmd,
838758ac
DW
2283 "no update-delay [(0-3600) [(1-3600)]]",
2284 NO_STR
f188f2c4 2285 "Force initial delay for best-path and updates\n"
d70583f7
D
2286 "Max delay in seconds\n"
2287 "Establish wait in seconds\n")
f188f2c4 2288{
d62a17ae 2289 return bgp_update_delay_deconfig_vty(vty);
f188f2c4
DS
2290}
2291
5e242b0d 2292
1ca2fd11
IR
2293static int bgp_wpkt_quanta_config_vty(struct vty *vty, uint32_t quanta,
2294 bool set)
cb1faec9 2295{
1ca2fd11
IR
2296 VTY_DECLVAR_CONTEXT(bgp, bgp);
2297
8fa7732f
QY
2298 quanta = set ? quanta : BGP_WRITE_PACKET_MAX;
2299 atomic_store_explicit(&bgp->wpkt_quanta, quanta, memory_order_relaxed);
555e09d4
QY
2300
2301 return CMD_SUCCESS;
2302}
2303
1ca2fd11
IR
2304static int bgp_rpkt_quanta_config_vty(struct vty *vty, uint32_t quanta,
2305 bool set)
555e09d4 2306{
1ca2fd11
IR
2307 VTY_DECLVAR_CONTEXT(bgp, bgp);
2308
8fa7732f
QY
2309 quanta = set ? quanta : BGP_READ_PACKET_MAX;
2310 atomic_store_explicit(&bgp->rpkt_quanta, quanta, memory_order_relaxed);
cb1faec9 2311
d62a17ae 2312 return CMD_SUCCESS;
cb1faec9
DS
2313}
2314
2b791107 2315void bgp_config_write_wpkt_quanta(struct vty *vty, struct bgp *bgp)
cb1faec9 2316{
555e09d4
QY
2317 uint32_t quanta =
2318 atomic_load_explicit(&bgp->wpkt_quanta, memory_order_relaxed);
2319 if (quanta != BGP_WRITE_PACKET_MAX)
152456fe 2320 vty_out(vty, " write-quanta %d\n", quanta);
cb1faec9
DS
2321}
2322
555e09d4
QY
2323void bgp_config_write_rpkt_quanta(struct vty *vty, struct bgp *bgp)
2324{
2325 uint32_t quanta =
2326 atomic_load_explicit(&bgp->rpkt_quanta, memory_order_relaxed);
2327 if (quanta != BGP_READ_PACKET_MAX)
152456fe 2328 vty_out(vty, " read-quanta %d\n", quanta);
555e09d4 2329}
cb1faec9 2330
8fa7732f
QY
2331/* Packet quanta configuration
2332 *
2333 * XXX: The value set here controls the size of a stack buffer in the IO
2334 * thread. When changing these limits be careful to prevent stack overflow.
2335 *
2336 * Furthermore, the maximums used here should correspond to
2337 * BGP_WRITE_PACKET_MAX and BGP_READ_PACKET_MAX.
2338 */
1ca2fd11
IR
2339DEFPY (bgp_wpkt_quanta,
2340 bgp_wpkt_quanta_cmd,
2341 "[no] write-quanta (1-64)$quanta",
2342 NO_STR
2343 "How many packets to write to peer socket per run\n"
2344 "Number of packets\n")
2345{
2346 return bgp_wpkt_quanta_config_vty(vty, quanta, !no);
2347}
cb1faec9 2348
1ca2fd11
IR
2349DEFPY (bgp_rpkt_quanta,
2350 bgp_rpkt_quanta_cmd,
2351 "[no] read-quanta (1-10)$quanta",
2352 NO_STR
2353 "How many packets to read from peer socket per I/O cycle\n"
2354 "Number of packets\n")
2355{
2356 return bgp_rpkt_quanta_config_vty(vty, quanta, !no);
555e09d4
QY
2357}
2358
2b791107 2359void bgp_config_write_coalesce_time(struct vty *vty, struct bgp *bgp)
3f9c7369 2360{
37a333fe 2361 if (!bgp->heuristic_coalesce)
d62a17ae 2362 vty_out(vty, " coalesce-time %u\n", bgp->coalesce_time);
3f9c7369
DS
2363}
2364
d1adb448
PG
2365/* BGP TCP keepalive */
2366static void bgp_config_tcp_keepalive(struct vty *vty, struct bgp *bgp)
2367{
2368 if (bgp->tcp_keepalive_idle) {
2369 vty_out(vty, " bgp tcp-keepalive %u %u %u\n",
2370 bgp->tcp_keepalive_idle, bgp->tcp_keepalive_intvl,
2371 bgp->tcp_keepalive_probes);
2372 }
2373}
4668a151 2374
1ca2fd11
IR
2375DEFUN (bgp_coalesce_time,
2376 bgp_coalesce_time_cmd,
2377 "coalesce-time (0-4294967295)",
2378 "Subgroup coalesce timer\n"
2379 "Subgroup coalesce timer value (in ms)\n")
ff8a8a7a 2380{
1ca2fd11 2381 VTY_DECLVAR_CONTEXT(bgp, bgp);
ff8a8a7a 2382
1ca2fd11 2383 int idx = 0;
9b01d289 2384
1ca2fd11 2385 bgp->heuristic_coalesce = false;
9b01d289
DA
2386
2387 if (argv_find(argv, argc, "(0-4294967295)", &idx))
2388 bgp->coalesce_time = strtoul(argv[idx]->arg, NULL, 10);
2389
1ca2fd11 2390 return CMD_SUCCESS;
3f9c7369
DS
2391}
2392
1ca2fd11
IR
2393DEFUN (no_bgp_coalesce_time,
2394 no_bgp_coalesce_time_cmd,
2395 "no coalesce-time (0-4294967295)",
2396 NO_STR
2397 "Subgroup coalesce timer\n"
2398 "Subgroup coalesce timer value (in ms)\n")
3f9c7369 2399{
1ca2fd11 2400 VTY_DECLVAR_CONTEXT(bgp, bgp);
4668a151 2401
1ca2fd11
IR
2402 bgp->heuristic_coalesce = true;
2403 bgp->coalesce_time = BGP_DEFAULT_SUBGROUP_COALESCE_TIME;
2404 return CMD_SUCCESS;
3f9c7369
DS
2405}
2406
5e242b0d 2407/* Maximum-paths configuration */
585f1adc
IR
2408DEFUN (bgp_maxpaths,
2409 bgp_maxpaths_cmd,
2410 "maximum-paths " CMD_RANGE_STR(1, MULTIPATH_NUM),
2411 "Forward packets over multiple paths\n"
2412 "Number of paths\n")
5e242b0d 2413{
d62a17ae 2414 int idx_number = 1;
585f1adc
IR
2415 return bgp_maxpaths_config_vty(vty, BGP_PEER_EBGP,
2416 argv[idx_number]->arg, 0, 1);
5e242b0d
DS
2417}
2418
d62a17ae 2419ALIAS_HIDDEN(bgp_maxpaths, bgp_maxpaths_hidden_cmd,
2420 "maximum-paths " CMD_RANGE_STR(1, MULTIPATH_NUM),
2421 "Forward packets over multiple paths\n"
2422 "Number of paths\n")
596c17ba 2423
585f1adc
IR
2424DEFUN (bgp_maxpaths_ibgp,
2425 bgp_maxpaths_ibgp_cmd,
2426 "maximum-paths ibgp " CMD_RANGE_STR(1, MULTIPATH_NUM),
2427 "Forward packets over multiple paths\n"
2428 "iBGP-multipath\n"
2429 "Number of paths\n")
165b5fff 2430{
d62a17ae 2431 int idx_number = 2;
585f1adc
IR
2432 return bgp_maxpaths_config_vty(vty, BGP_PEER_IBGP,
2433 argv[idx_number]->arg, 0, 1);
5e242b0d 2434}
165b5fff 2435
d62a17ae 2436ALIAS_HIDDEN(bgp_maxpaths_ibgp, bgp_maxpaths_ibgp_hidden_cmd,
2437 "maximum-paths ibgp " CMD_RANGE_STR(1, MULTIPATH_NUM),
2438 "Forward packets over multiple paths\n"
2439 "iBGP-multipath\n"
2440 "Number of paths\n")
596c17ba 2441
585f1adc
IR
2442DEFUN (bgp_maxpaths_ibgp_cluster,
2443 bgp_maxpaths_ibgp_cluster_cmd,
2444 "maximum-paths ibgp " CMD_RANGE_STR(1, MULTIPATH_NUM) " equal-cluster-length",
2445 "Forward packets over multiple paths\n"
2446 "iBGP-multipath\n"
2447 "Number of paths\n"
2448 "Match the cluster length\n")
5e242b0d 2449{
d62a17ae 2450 int idx_number = 2;
aa53c036
DS
2451 return bgp_maxpaths_config_vty(vty, BGP_PEER_IBGP,
2452 argv[idx_number]->arg, true, 1);
165b5fff
JB
2453}
2454
d62a17ae 2455ALIAS_HIDDEN(bgp_maxpaths_ibgp_cluster, bgp_maxpaths_ibgp_cluster_hidden_cmd,
2456 "maximum-paths ibgp " CMD_RANGE_STR(
2457 1, MULTIPATH_NUM) " equal-cluster-length",
2458 "Forward packets over multiple paths\n"
2459 "iBGP-multipath\n"
2460 "Number of paths\n"
2461 "Match the cluster length\n")
596c17ba 2462
585f1adc
IR
2463DEFUN (no_bgp_maxpaths,
2464 no_bgp_maxpaths_cmd,
2465 "no maximum-paths [" CMD_RANGE_STR(1, MULTIPATH_NUM) "]",
2466 NO_STR
2467 "Forward packets over multiple paths\n"
2468 "Number of paths\n")
165b5fff 2469{
585f1adc 2470 return bgp_maxpaths_config_vty(vty, BGP_PEER_EBGP, NULL, 0, 0);
165b5fff
JB
2471}
2472
d62a17ae 2473ALIAS_HIDDEN(no_bgp_maxpaths, no_bgp_maxpaths_hidden_cmd,
996c9314 2474 "no maximum-paths [" CMD_RANGE_STR(1, MULTIPATH_NUM) "]", NO_STR
d62a17ae 2475 "Forward packets over multiple paths\n"
2476 "Number of paths\n")
596c17ba 2477
585f1adc
IR
2478DEFUN (no_bgp_maxpaths_ibgp,
2479 no_bgp_maxpaths_ibgp_cmd,
2480 "no maximum-paths ibgp [" CMD_RANGE_STR(1, MULTIPATH_NUM) " [equal-cluster-length]]",
2481 NO_STR
2482 "Forward packets over multiple paths\n"
2483 "iBGP-multipath\n"
2484 "Number of paths\n"
2485 "Match the cluster length\n")
165b5fff 2486{
585f1adc 2487 return bgp_maxpaths_config_vty(vty, BGP_PEER_IBGP, NULL, 0, 0);
165b5fff
JB
2488}
2489
d62a17ae 2490ALIAS_HIDDEN(no_bgp_maxpaths_ibgp, no_bgp_maxpaths_ibgp_hidden_cmd,
2491 "no maximum-paths ibgp [" CMD_RANGE_STR(
2492 1, MULTIPATH_NUM) " [equal-cluster-length]]",
2493 NO_STR
2494 "Forward packets over multiple paths\n"
2495 "iBGP-multipath\n"
2496 "Number of paths\n"
2497 "Match the cluster length\n")
596c17ba 2498
dd65f45e
DL
2499static void bgp_config_write_maxpaths(struct vty *vty, struct bgp *bgp,
2500 afi_t afi, safi_t safi)
165b5fff 2501{
00908b7a 2502 if (bgp->maxpaths[afi][safi].maxpaths_ebgp != multipath_num) {
d62a17ae 2503 vty_out(vty, " maximum-paths %d\n",
2504 bgp->maxpaths[afi][safi].maxpaths_ebgp);
2505 }
165b5fff 2506
00908b7a 2507 if (bgp->maxpaths[afi][safi].maxpaths_ibgp != multipath_num) {
d62a17ae 2508 vty_out(vty, " maximum-paths ibgp %d",
2509 bgp->maxpaths[afi][safi].maxpaths_ibgp);
aa53c036 2510 if (bgp->maxpaths[afi][safi].same_clusterlen)
d62a17ae 2511 vty_out(vty, " equal-cluster-length");
2512 vty_out(vty, "\n");
2513 }
165b5fff 2514}
6b0655a2 2515
718e3744 2516/* BGP timers. */
2517
1ca2fd11
IR
2518DEFUN (bgp_timers,
2519 bgp_timers_cmd,
2520 "timers bgp (0-65535) (0-65535)",
2521 "Adjust routing timers\n"
2522 "BGP timers\n"
2523 "Keepalive interval\n"
2524 "Holdtime\n")
718e3744 2525{
1ca2fd11 2526 VTY_DECLVAR_CONTEXT(bgp, bgp);
d62a17ae 2527 int idx_number = 2;
2528 int idx_number_2 = 3;
1ca2fd11
IR
2529 unsigned long keepalive = 0;
2530 unsigned long holdtime = 0;
718e3744 2531
1ca2fd11
IR
2532 keepalive = strtoul(argv[idx_number]->arg, NULL, 10);
2533 holdtime = strtoul(argv[idx_number_2]->arg, NULL, 10);
718e3744 2534
1ca2fd11
IR
2535 /* Holdtime value check. */
2536 if (holdtime < 3 && holdtime != 0) {
2537 vty_out(vty,
2538 "%% hold time value must be either 0 or greater than 3\n");
2539 return CMD_WARNING_CONFIG_FAILED;
2540 }
718e3744 2541
1ca2fd11
IR
2542 bgp_timers_set(bgp, keepalive, holdtime, DFLT_BGP_CONNECT_RETRY,
2543 BGP_DEFAULT_DELAYOPEN);
718e3744 2544
1ca2fd11 2545 return CMD_SUCCESS;
718e3744 2546}
2547
1ca2fd11
IR
2548DEFUN (no_bgp_timers,
2549 no_bgp_timers_cmd,
2550 "no timers bgp [(0-65535) (0-65535)]",
2551 NO_STR
2552 "Adjust routing timers\n"
2553 "BGP timers\n"
2554 "Keepalive interval\n"
2555 "Holdtime\n")
718e3744 2556{
1ca2fd11
IR
2557 VTY_DECLVAR_CONTEXT(bgp, bgp);
2558 bgp_timers_set(bgp, DFLT_BGP_KEEPALIVE, DFLT_BGP_HOLDTIME,
2559 DFLT_BGP_CONNECT_RETRY, BGP_DEFAULT_DELAYOPEN);
ff8a8a7a 2560
1ca2fd11 2561 return CMD_SUCCESS;
718e3744 2562}
2563
b042667a
TI
2564/* BGP minimum holdtime. */
2565
2566DEFUN(bgp_minimum_holdtime, bgp_minimum_holdtime_cmd,
2567 "bgp minimum-holdtime (1-65535)",
2568 "BGP specific commands\n"
2569 "BGP minimum holdtime\n"
2570 "Seconds\n")
2571{
2572 VTY_DECLVAR_CONTEXT(bgp, bgp);
2573 int idx_number = 2;
2574 unsigned long min_holdtime;
2575
2576 min_holdtime = strtoul(argv[idx_number]->arg, NULL, 10);
2577
2578 bgp->default_min_holdtime = min_holdtime;
2579
2580 return CMD_SUCCESS;
2581}
2582
2583DEFUN(no_bgp_minimum_holdtime, no_bgp_minimum_holdtime_cmd,
2584 "no bgp minimum-holdtime [(1-65535)]",
2585 NO_STR
2586 "BGP specific commands\n"
2587 "BGP minimum holdtime\n"
2588 "Seconds\n")
2589{
2590 VTY_DECLVAR_CONTEXT(bgp, bgp);
2591
2592 bgp->default_min_holdtime = 0;
2593
2594 return CMD_SUCCESS;
2595}
ff8a8a7a 2596
d1adb448
PG
2597DEFPY(bgp_tcp_keepalive, bgp_tcp_keepalive_cmd,
2598 "bgp tcp-keepalive (1-65535)$idle (1-65535)$intvl (1-30)$probes",
2599 BGP_STR
2600 "TCP keepalive parameters\n"
2601 "TCP keepalive idle time (seconds)\n"
2602 "TCP keepalive interval (seconds)\n"
2603 "TCP keepalive maximum probes\n")
2604{
2605 VTY_DECLVAR_CONTEXT(bgp, bgp);
2606
2607 bgp_tcp_keepalive_set(bgp, (uint16_t)idle, (uint16_t)intvl,
2608 (uint16_t)probes);
2609
2610 return CMD_SUCCESS;
2611}
2612
2613DEFPY(no_bgp_tcp_keepalive, no_bgp_tcp_keepalive_cmd,
2614 "no bgp tcp-keepalive [(1-65535) (1-65535) (1-30)]",
2615 NO_STR
2616 BGP_STR
2617 "TCP keepalive parameters\n"
2618 "TCP keepalive idle time (seconds)\n"
2619 "TCP keepalive interval (seconds)\n"
2620 "TCP keepalive maximum probes\n")
2621{
2622 VTY_DECLVAR_CONTEXT(bgp, bgp);
2623
2624 bgp_tcp_keepalive_unset(bgp);
2625
2626 return CMD_SUCCESS;
2627}
2628
1ca2fd11
IR
2629DEFUN (bgp_client_to_client_reflection,
2630 bgp_client_to_client_reflection_cmd,
2631 "bgp client-to-client reflection",
e9273987 2632 BGP_STR
1ca2fd11
IR
2633 "Configure client to client route reflection\n"
2634 "reflection of routes allowed\n")
718e3744 2635{
1ca2fd11
IR
2636 VTY_DECLVAR_CONTEXT(bgp, bgp);
2637 UNSET_FLAG(bgp->flags, BGP_FLAG_NO_CLIENT_TO_CLIENT);
2638 bgp_clear_star_soft_out(vty, bgp->name);
7aafcaca 2639
1ca2fd11 2640 return CMD_SUCCESS;
718e3744 2641}
2642
1ca2fd11
IR
2643DEFUN (no_bgp_client_to_client_reflection,
2644 no_bgp_client_to_client_reflection_cmd,
2645 "no bgp client-to-client reflection",
2646 NO_STR
e9273987 2647 BGP_STR
1ca2fd11
IR
2648 "Configure client to client route reflection\n"
2649 "reflection of routes allowed\n")
718e3744 2650{
1ca2fd11
IR
2651 VTY_DECLVAR_CONTEXT(bgp, bgp);
2652 SET_FLAG(bgp->flags, BGP_FLAG_NO_CLIENT_TO_CLIENT);
2653 bgp_clear_star_soft_out(vty, bgp->name);
7aafcaca 2654
1ca2fd11 2655 return CMD_SUCCESS;
718e3744 2656}
2657
2658/* "bgp always-compare-med" configuration. */
1ca2fd11
IR
2659DEFUN (bgp_always_compare_med,
2660 bgp_always_compare_med_cmd,
2661 "bgp always-compare-med",
e9273987 2662 BGP_STR
1ca2fd11 2663 "Allow comparing MED from different neighbors\n")
718e3744 2664{
1ca2fd11
IR
2665 VTY_DECLVAR_CONTEXT(bgp, bgp);
2666 SET_FLAG(bgp->flags, BGP_FLAG_ALWAYS_COMPARE_MED);
2667 bgp_recalculate_all_bestpaths(bgp);
7aafcaca 2668
1ca2fd11 2669 return CMD_SUCCESS;
718e3744 2670}
2671
1ca2fd11
IR
2672DEFUN (no_bgp_always_compare_med,
2673 no_bgp_always_compare_med_cmd,
2674 "no bgp always-compare-med",
2675 NO_STR
e9273987 2676 BGP_STR
1ca2fd11 2677 "Allow comparing MED from different neighbors\n")
718e3744 2678{
1ca2fd11
IR
2679 VTY_DECLVAR_CONTEXT(bgp, bgp);
2680 UNSET_FLAG(bgp->flags, BGP_FLAG_ALWAYS_COMPARE_MED);
2681 bgp_recalculate_all_bestpaths(bgp);
6b0655a2 2682
1ca2fd11 2683 return CMD_SUCCESS;
2adac256
DA
2684}
2685
2adac256 2686
1ca2fd11
IR
2687DEFUN(bgp_ebgp_requires_policy, bgp_ebgp_requires_policy_cmd,
2688 "bgp ebgp-requires-policy",
e9273987 2689 BGP_STR
1ca2fd11 2690 "Require in and out policy for eBGP peers (RFC8212)\n")
2adac256 2691{
1ca2fd11
IR
2692 VTY_DECLVAR_CONTEXT(bgp, bgp);
2693 SET_FLAG(bgp->flags, BGP_FLAG_EBGP_REQUIRES_POLICY);
2694 return CMD_SUCCESS;
2adac256
DA
2695}
2696
1ca2fd11
IR
2697DEFUN(no_bgp_ebgp_requires_policy, no_bgp_ebgp_requires_policy_cmd,
2698 "no bgp ebgp-requires-policy",
2699 NO_STR
e9273987 2700 BGP_STR
1ca2fd11 2701 "Require in and out policy for eBGP peers (RFC8212)\n")
ff8a8a7a 2702{
1ca2fd11
IR
2703 VTY_DECLVAR_CONTEXT(bgp, bgp);
2704 UNSET_FLAG(bgp->flags, BGP_FLAG_EBGP_REQUIRES_POLICY);
2705 return CMD_SUCCESS;
ff8a8a7a 2706}
9dac9fc8 2707
1ca2fd11
IR
2708DEFUN(bgp_suppress_duplicates, bgp_suppress_duplicates_cmd,
2709 "bgp suppress-duplicates",
e9273987 2710 BGP_STR
1ca2fd11 2711 "Suppress duplicate updates if the route actually not changed\n")
9dac9fc8 2712{
1ca2fd11
IR
2713 VTY_DECLVAR_CONTEXT(bgp, bgp);
2714 SET_FLAG(bgp->flags, BGP_FLAG_SUPPRESS_DUPLICATES);
2715 return CMD_SUCCESS;
9dac9fc8
DA
2716}
2717
1ca2fd11
IR
2718DEFUN(no_bgp_suppress_duplicates, no_bgp_suppress_duplicates_cmd,
2719 "no bgp suppress-duplicates",
2720 NO_STR
e9273987 2721 BGP_STR
1ca2fd11 2722 "Suppress duplicate updates if the route actually not changed\n")
9dac9fc8 2723{
1ca2fd11
IR
2724 VTY_DECLVAR_CONTEXT(bgp, bgp);
2725 UNSET_FLAG(bgp->flags, BGP_FLAG_SUPPRESS_DUPLICATES);
2726 return CMD_SUCCESS;
9dac9fc8
DA
2727}
2728
fb29348a
DA
2729DEFUN(bgp_reject_as_sets, bgp_reject_as_sets_cmd,
2730 "bgp reject-as-sets",
e9273987 2731 BGP_STR
fb29348a
DA
2732 "Reject routes with AS_SET or AS_CONFED_SET flag\n")
2733{
2734 VTY_DECLVAR_CONTEXT(bgp, bgp);
2735 struct listnode *node, *nnode;
2736 struct peer *peer;
2737
7f972cd8 2738 bgp->reject_as_sets = true;
fb29348a
DA
2739
2740 /* Reset existing BGP sessions to reject routes
2741 * with aspath containing AS_SET or AS_CONFED_SET.
2742 */
2743 for (ALL_LIST_ELEMENTS(bgp->peer, node, nnode, peer)) {
2744 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->status)) {
2745 peer->last_reset = PEER_DOWN_AS_SETS_REJECT;
2746 bgp_notify_send(peer, BGP_NOTIFY_CEASE,
2747 BGP_NOTIFY_CEASE_CONFIG_CHANGE);
2748 }
2749 }
2750
2751 return CMD_SUCCESS;
2752}
2753
2754DEFUN(no_bgp_reject_as_sets, no_bgp_reject_as_sets_cmd,
2755 "no bgp reject-as-sets",
2756 NO_STR
e9273987 2757 BGP_STR
fb29348a
DA
2758 "Reject routes with AS_SET or AS_CONFED_SET flag\n")
2759{
2760 VTY_DECLVAR_CONTEXT(bgp, bgp);
2761 struct listnode *node, *nnode;
2762 struct peer *peer;
2763
7f972cd8 2764 bgp->reject_as_sets = false;
fb29348a
DA
2765
2766 /* Reset existing BGP sessions to reject routes
2767 * with aspath containing AS_SET or AS_CONFED_SET.
2768 */
2769 for (ALL_LIST_ELEMENTS(bgp->peer, node, nnode, peer)) {
2770 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->status)) {
2771 peer->last_reset = PEER_DOWN_AS_SETS_REJECT;
2772 bgp_notify_send(peer, BGP_NOTIFY_CEASE,
2773 BGP_NOTIFY_CEASE_CONFIG_CHANGE);
2774 }
2775 }
2776
2777 return CMD_SUCCESS;
2778}
9dac9fc8 2779
718e3744 2780/* "bgp deterministic-med" configuration. */
1ca2fd11 2781DEFUN (bgp_deterministic_med,
718e3744 2782 bgp_deterministic_med_cmd,
2783 "bgp deterministic-med",
e9273987 2784 BGP_STR
718e3744 2785 "Pick the best-MED path among paths advertised from the neighboring AS\n")
2786{
1ca2fd11
IR
2787 VTY_DECLVAR_CONTEXT(bgp, bgp);
2788
2789 if (!CHECK_FLAG(bgp->flags, BGP_FLAG_DETERMINISTIC_MED)) {
2790 SET_FLAG(bgp->flags, BGP_FLAG_DETERMINISTIC_MED);
2791 bgp_recalculate_all_bestpaths(bgp);
2792 }
7aafcaca 2793
1ca2fd11 2794 return CMD_SUCCESS;
718e3744 2795}
2796
1ca2fd11 2797DEFUN (no_bgp_deterministic_med,
718e3744 2798 no_bgp_deterministic_med_cmd,
2799 "no bgp deterministic-med",
2800 NO_STR
e9273987 2801 BGP_STR
718e3744 2802 "Pick the best-MED path among paths advertised from the neighboring AS\n")
2803{
1ca2fd11
IR
2804 VTY_DECLVAR_CONTEXT(bgp, bgp);
2805 int bestpath_per_as_used;
2806 afi_t afi;
2807 safi_t safi;
2808 struct peer *peer;
2809 struct listnode *node, *nnode;
2810
2811 if (CHECK_FLAG(bgp->flags, BGP_FLAG_DETERMINISTIC_MED)) {
2812 bestpath_per_as_used = 0;
2813
2814 for (ALL_LIST_ELEMENTS(bgp->peer, node, nnode, peer)) {
2815 FOREACH_AFI_SAFI (afi, safi)
2816 if (bgp_addpath_dmed_required(
2817 peer->addpath_type[afi][safi])) {
2818 bestpath_per_as_used = 1;
2819 break;
2820 }
2821
2822 if (bestpath_per_as_used)
2823 break;
2824 }
2825
2826 if (bestpath_per_as_used) {
2827 vty_out(vty,
2828 "bgp deterministic-med cannot be disabled while addpath-tx-bestpath-per-AS is in use\n");
2829 return CMD_WARNING_CONFIG_FAILED;
2830 } else {
2831 UNSET_FLAG(bgp->flags, BGP_FLAG_DETERMINISTIC_MED);
2832 bgp_recalculate_all_bestpaths(bgp);
2833 }
2834 }
d62a17ae 2835
1ca2fd11 2836 return CMD_SUCCESS;
718e3744 2837}
538621f2 2838
055679e9 2839/* "bgp graceful-restart mode" configuration. */
538621f2 2840DEFUN (bgp_graceful_restart,
2ba1fe69 2841 bgp_graceful_restart_cmd,
2842 "bgp graceful-restart",
e9273987 2843 BGP_STR
2ba1fe69 2844 GR_CMD
055679e9 2845 )
538621f2 2846{
055679e9 2847 int ret = BGP_GR_FAILURE;
2848
2849 if (BGP_DEBUG(graceful_restart, GRACEFUL_RESTART))
2ba1fe69 2850 zlog_debug("[BGP_GR] bgp_graceful_restart_cmd : START ");
dc95985f 2851
d62a17ae 2852 VTY_DECLVAR_CONTEXT(bgp, bgp);
055679e9 2853
2854 ret = bgp_gr_update_all(bgp, GLOBAL_GR_CMD);
2855
36235319
QY
2856 VTY_BGP_GR_ROUTER_DETECT_AND_SEND_CAPABILITY_TO_ZEBRA(bgp, bgp->peer,
2857 ret);
5cce3f05 2858
055679e9 2859 if (BGP_DEBUG(graceful_restart, GRACEFUL_RESTART))
2ba1fe69 2860 zlog_debug("[BGP_GR] bgp_graceful_restart_cmd : END ");
dc95985f 2861 vty_out(vty,
2862 "Graceful restart configuration changed, reset all peers to take effect\n");
055679e9 2863 return bgp_vty_return(vty, ret);
538621f2 2864}
2865
2866DEFUN (no_bgp_graceful_restart,
2ba1fe69 2867 no_bgp_graceful_restart_cmd,
2868 "no bgp graceful-restart",
2869 NO_STR
e9273987 2870 BGP_STR
2ba1fe69 2871 NO_GR_CMD
055679e9 2872 )
538621f2 2873{
d62a17ae 2874 VTY_DECLVAR_CONTEXT(bgp, bgp);
055679e9 2875
2876 if (BGP_DEBUG(graceful_restart, GRACEFUL_RESTART))
2ba1fe69 2877 zlog_debug("[BGP_GR] no_bgp_graceful_restart_cmd : START ");
055679e9 2878
2879 int ret = BGP_GR_FAILURE;
2880
2881 ret = bgp_gr_update_all(bgp, NO_GLOBAL_GR_CMD);
2882
36235319
QY
2883 VTY_BGP_GR_ROUTER_DETECT_AND_SEND_CAPABILITY_TO_ZEBRA(bgp, bgp->peer,
2884 ret);
5cce3f05 2885
055679e9 2886 if (BGP_DEBUG(graceful_restart, GRACEFUL_RESTART))
2ba1fe69 2887 zlog_debug("[BGP_GR] no_bgp_graceful_restart_cmd : END ");
dc95985f 2888 vty_out(vty,
2889 "Graceful restart configuration changed, reset all peers to take effect\n");
055679e9 2890
2891 return bgp_vty_return(vty, ret);
538621f2 2892}
2893
93406d87 2894DEFUN (bgp_graceful_restart_stalepath_time,
2ba1fe69 2895 bgp_graceful_restart_stalepath_time_cmd,
2896 "bgp graceful-restart stalepath-time (1-4095)",
e9273987 2897 BGP_STR
2ba1fe69 2898 "Graceful restart capability parameters\n"
2899 "Set the max time to hold onto restarting peer's stale paths\n"
2900 "Delay value (seconds)\n")
93406d87 2901{
d62a17ae 2902 VTY_DECLVAR_CONTEXT(bgp, bgp);
2903 int idx_number = 3;
d7c0a89a 2904 uint32_t stalepath;
93406d87 2905
d62a17ae 2906 stalepath = strtoul(argv[idx_number]->arg, NULL, 10);
2907 bgp->stalepath_time = stalepath;
2908 return CMD_SUCCESS;
93406d87 2909}
2910
eb6f1b41 2911DEFUN (bgp_graceful_restart_restart_time,
2ba1fe69 2912 bgp_graceful_restart_restart_time_cmd,
dcbebfd3 2913 "bgp graceful-restart restart-time (0-4095)",
e9273987 2914 BGP_STR
2ba1fe69 2915 "Graceful restart capability parameters\n"
2916 "Set the time to wait to delete stale routes before a BGP open message is received\n"
2917 "Delay value (seconds)\n")
eb6f1b41 2918{
d62a17ae 2919 VTY_DECLVAR_CONTEXT(bgp, bgp);
2920 int idx_number = 3;
d7c0a89a 2921 uint32_t restart;
eb6f1b41 2922
d62a17ae 2923 restart = strtoul(argv[idx_number]->arg, NULL, 10);
2924 bgp->restart_time = restart;
2925 return CMD_SUCCESS;
eb6f1b41
PG
2926}
2927
cfd47646 2928DEFUN (bgp_graceful_restart_select_defer_time,
2929 bgp_graceful_restart_select_defer_time_cmd,
2930 "bgp graceful-restart select-defer-time (0-3600)",
e9273987 2931 BGP_STR
cfd47646 2932 "Graceful restart capability parameters\n"
2933 "Set the time to defer the BGP route selection after restart\n"
2934 "Delay value (seconds, 0 - disable)\n")
2935{
2936 VTY_DECLVAR_CONTEXT(bgp, bgp);
2937 int idx_number = 3;
2938 uint32_t defer_time;
2939
2940 defer_time = strtoul(argv[idx_number]->arg, NULL, 10);
2941 bgp->select_defer_time = defer_time;
2942 if (defer_time == 0)
892fedb6 2943 SET_FLAG(bgp->flags, BGP_FLAG_SELECT_DEFER_DISABLE);
cfd47646 2944 else
892fedb6 2945 UNSET_FLAG(bgp->flags, BGP_FLAG_SELECT_DEFER_DISABLE);
cfd47646 2946
2947 return CMD_SUCCESS;
2948}
2949
93406d87 2950DEFUN (no_bgp_graceful_restart_stalepath_time,
2ba1fe69 2951 no_bgp_graceful_restart_stalepath_time_cmd,
2952 "no bgp graceful-restart stalepath-time [(1-4095)]",
2953 NO_STR
e9273987 2954 BGP_STR
2ba1fe69 2955 "Graceful restart capability parameters\n"
2956 "Set the max time to hold onto restarting peer's stale paths\n"
2957 "Delay value (seconds)\n")
93406d87 2958{
d62a17ae 2959 VTY_DECLVAR_CONTEXT(bgp, bgp);
93406d87 2960
d62a17ae 2961 bgp->stalepath_time = BGP_DEFAULT_STALEPATH_TIME;
2962 return CMD_SUCCESS;
93406d87 2963}
2964
eb6f1b41 2965DEFUN (no_bgp_graceful_restart_restart_time,
2ba1fe69 2966 no_bgp_graceful_restart_restart_time_cmd,
dcbebfd3 2967 "no bgp graceful-restart restart-time [(0-4095)]",
2ba1fe69 2968 NO_STR
e9273987 2969 BGP_STR
2ba1fe69 2970 "Graceful restart capability parameters\n"
2971 "Set the time to wait to delete stale routes before a BGP open message is received\n"
2972 "Delay value (seconds)\n")
eb6f1b41 2973{
d62a17ae 2974 VTY_DECLVAR_CONTEXT(bgp, bgp);
eb6f1b41 2975
d62a17ae 2976 bgp->restart_time = BGP_DEFAULT_RESTART_TIME;
2977 return CMD_SUCCESS;
eb6f1b41
PG
2978}
2979
cfd47646 2980DEFUN (no_bgp_graceful_restart_select_defer_time,
2981 no_bgp_graceful_restart_select_defer_time_cmd,
2982 "no bgp graceful-restart select-defer-time [(0-3600)]",
2983 NO_STR
e9273987 2984 BGP_STR
cfd47646 2985 "Graceful restart capability parameters\n"
2986 "Set the time to defer the BGP route selection after restart\n"
2987 "Delay value (seconds)\n")
2988{
2989 VTY_DECLVAR_CONTEXT(bgp, bgp);
2990
2991 bgp->select_defer_time = BGP_DEFAULT_SELECT_DEFERRAL_TIME;
892fedb6 2992 UNSET_FLAG(bgp->flags, BGP_FLAG_SELECT_DEFER_DISABLE);
cfd47646 2993
2994 return CMD_SUCCESS;
2995}
2996
43fc21b3 2997DEFUN (bgp_graceful_restart_preserve_fw,
2ba1fe69 2998 bgp_graceful_restart_preserve_fw_cmd,
2999 "bgp graceful-restart preserve-fw-state",
e9273987 3000 BGP_STR
2ba1fe69 3001 "Graceful restart capability parameters\n"
3002 "Sets F-bit indication that fib is preserved while doing Graceful Restart\n")
43fc21b3 3003{
d62a17ae 3004 VTY_DECLVAR_CONTEXT(bgp, bgp);
892fedb6 3005 SET_FLAG(bgp->flags, BGP_FLAG_GR_PRESERVE_FWD);
d62a17ae 3006 return CMD_SUCCESS;
43fc21b3
JC
3007}
3008
3009DEFUN (no_bgp_graceful_restart_preserve_fw,
2ba1fe69 3010 no_bgp_graceful_restart_preserve_fw_cmd,
3011 "no bgp graceful-restart preserve-fw-state",
3012 NO_STR
e9273987 3013 BGP_STR
2ba1fe69 3014 "Graceful restart capability parameters\n"
3015 "Unsets F-bit indication that fib is preserved while doing Graceful Restart\n")
43fc21b3 3016{
d62a17ae 3017 VTY_DECLVAR_CONTEXT(bgp, bgp);
892fedb6 3018 UNSET_FLAG(bgp->flags, BGP_FLAG_GR_PRESERVE_FWD);
d62a17ae 3019 return CMD_SUCCESS;
43fc21b3
JC
3020}
3021
f2ca5c5b
DA
3022DEFPY (bgp_graceful_restart_notification,
3023 bgp_graceful_restart_notification_cmd,
3024 "[no$no] bgp graceful-restart notification",
3025 NO_STR
3026 BGP_STR
3027 "Graceful restart capability parameters\n"
3028 "Indicate Graceful Restart support for BGP NOTIFICATION messages\n")
3029{
3030 VTY_DECLVAR_CONTEXT(bgp, bgp);
3031
3032 if (no)
3033 UNSET_FLAG(bgp->flags, BGP_FLAG_GRACEFUL_NOTIFICATION);
3034 else
3035 SET_FLAG(bgp->flags, BGP_FLAG_GRACEFUL_NOTIFICATION);
3036
3037 return CMD_SUCCESS;
3038}
3039
1ae314be
DA
3040DEFPY (bgp_administrative_reset,
3041 bgp_administrative_reset_cmd,
3042 "[no$no] bgp hard-administrative-reset",
3043 NO_STR
3044 BGP_STR
3045 "Send Hard Reset CEASE Notification for 'Administrative Reset'\n")
3046{
3047 VTY_DECLVAR_CONTEXT(bgp, bgp);
3048
3049 if (no)
3050 UNSET_FLAG(bgp->flags, BGP_FLAG_HARD_ADMIN_RESET);
3051 else
3052 SET_FLAG(bgp->flags, BGP_FLAG_HARD_ADMIN_RESET);
3053
3054 return CMD_SUCCESS;
3055}
3056
055679e9 3057DEFUN (bgp_graceful_restart_disable,
2ba1fe69 3058 bgp_graceful_restart_disable_cmd,
3059 "bgp graceful-restart-disable",
e9273987 3060 BGP_STR
2ba1fe69 3061 GR_DISABLE)
055679e9 3062{
3063 int ret = BGP_GR_FAILURE;
3064
3065 if (BGP_DEBUG(graceful_restart, GRACEFUL_RESTART))
3066 zlog_debug(
2ba1fe69 3067 "[BGP_GR] bgp_graceful_restart_disable_cmd : START ");
dc95985f 3068
055679e9 3069 VTY_DECLVAR_CONTEXT(bgp, bgp);
3070
3071 ret = bgp_gr_update_all(bgp, GLOBAL_DISABLE_CMD);
3072
dc95985f 3073 VTY_BGP_GR_ROUTER_DETECT_AND_SEND_CAPABILITY_TO_ZEBRA(bgp,
3074 bgp->peer, ret);
5cce3f05 3075
055679e9 3076 if (BGP_DEBUG(graceful_restart, GRACEFUL_RESTART))
3077 zlog_debug(
2ba1fe69 3078 "[BGP_GR] bgp_graceful_restart_disable_cmd : END ");
dc95985f 3079 vty_out(vty,
3080 "Graceful restart configuration changed, reset all peers to take effect\n");
3081
055679e9 3082 return bgp_vty_return(vty, ret);
3083}
3084
3085DEFUN (no_bgp_graceful_restart_disable,
2ba1fe69 3086 no_bgp_graceful_restart_disable_cmd,
3087 "no bgp graceful-restart-disable",
3088 NO_STR
e9273987 3089 BGP_STR
2ba1fe69 3090 NO_GR_DISABLE
055679e9 3091 )
3092{
3093 VTY_DECLVAR_CONTEXT(bgp, bgp);
3094
3095 if (BGP_DEBUG(graceful_restart, GRACEFUL_RESTART))
3096 zlog_debug(
2ba1fe69 3097 "[BGP_GR] no_bgp_graceful_restart_disable_cmd : START ");
055679e9 3098
3099 int ret = BGP_GR_FAILURE;
3100
3101 ret = bgp_gr_update_all(bgp, NO_GLOBAL_DISABLE_CMD);
3102
36235319
QY
3103 VTY_BGP_GR_ROUTER_DETECT_AND_SEND_CAPABILITY_TO_ZEBRA(bgp, bgp->peer,
3104 ret);
5cce3f05 3105
055679e9 3106 if (BGP_DEBUG(graceful_restart, GRACEFUL_RESTART))
3107 zlog_debug(
2ba1fe69 3108 "[BGP_GR] no_bgp_graceful_restart_disable_cmd : END ");
dc95985f 3109 vty_out(vty,
3110 "Graceful restart configuration changed, reset all peers to take effect\n");
055679e9 3111
3112 return bgp_vty_return(vty, ret);
3113}
3114
3115DEFUN (bgp_neighbor_graceful_restart_set,
2ba1fe69 3116 bgp_neighbor_graceful_restart_set_cmd,
3117 "neighbor <A.B.C.D|X:X::X:X|WORD> graceful-restart",
3118 NEIGHBOR_STR
3119 NEIGHBOR_ADDR_STR2
3120 GR_NEIGHBOR_CMD
055679e9 3121 )
3122{
3123 int idx_peer = 1;
3124 struct peer *peer;
3125 int ret = BGP_GR_FAILURE;
3126
dc95985f 3127 VTY_BGP_GR_DEFINE_LOOP_VARIABLE;
3128
055679e9 3129 if (BGP_DEBUG(graceful_restart, GRACEFUL_RESTART))
3130 zlog_debug(
2ba1fe69 3131 "[BGP_GR] bgp_neighbor_graceful_restart_set_cmd : START ");
dc95985f 3132
055679e9 3133 peer = peer_and_group_lookup_vty(vty, argv[idx_peer]->arg);
3134 if (!peer)
3135 return CMD_WARNING_CONFIG_FAILED;
3136
3137 ret = bgp_neighbor_graceful_restart(peer, PEER_GR_CMD);
3138
dc95985f 3139 VTY_BGP_GR_ROUTER_DETECT(bgp, peer, peer->bgp->peer);
3140 VTY_SEND_BGP_GR_CAPABILITY_TO_ZEBRA(peer->bgp, ret);
055679e9 3141
3142 if (BGP_DEBUG(graceful_restart, GRACEFUL_RESTART))
3143 zlog_debug(
2ba1fe69 3144 "[BGP_GR] bgp_neighbor_graceful_restart_set_cmd : END ");
dc95985f 3145 vty_out(vty,
3146 "Graceful restart configuration changed, reset this peer to take effect\n");
055679e9 3147
3148 return bgp_vty_return(vty, ret);
3149}
3150
3151DEFUN (no_bgp_neighbor_graceful_restart,
2ba1fe69 3152 no_bgp_neighbor_graceful_restart_set_cmd,
3153 "no neighbor <A.B.C.D|X:X::X:X|WORD> graceful-restart",
3154 NO_STR
3155 NEIGHBOR_STR
3156 NEIGHBOR_ADDR_STR2
3157 NO_GR_NEIGHBOR_CMD
055679e9 3158 )
3159{
3160 int idx_peer = 2;
3161 int ret = BGP_GR_FAILURE;
3162 struct peer *peer;
3163
dc95985f 3164 VTY_BGP_GR_DEFINE_LOOP_VARIABLE;
3165
055679e9 3166 peer = peer_and_group_lookup_vty(vty, argv[idx_peer]->arg);
3167 if (!peer)
3168 return CMD_WARNING_CONFIG_FAILED;
3169
3170 if (BGP_DEBUG(graceful_restart, GRACEFUL_RESTART))
3171 zlog_debug(
2ba1fe69 3172 "[BGP_GR] no_bgp_neighbor_graceful_restart_set_cmd : START ");
055679e9 3173
3174 ret = bgp_neighbor_graceful_restart(peer, NO_PEER_GR_CMD);
3175
dc95985f 3176 VTY_BGP_GR_ROUTER_DETECT(bgp, peer, peer->bgp->peer);
3177 VTY_SEND_BGP_GR_CAPABILITY_TO_ZEBRA(peer->bgp, ret);
055679e9 3178
3179 if (BGP_DEBUG(graceful_restart, GRACEFUL_RESTART))
3180 zlog_debug(
2ba1fe69 3181 "[BGP_GR] no_bgp_neighbor_graceful_restart_set_cmd : END ");
dc95985f 3182 vty_out(vty,
3183 "Graceful restart configuration changed, reset this peer to take effect\n");
055679e9 3184
3185 return bgp_vty_return(vty, ret);
3186}
3187
3188DEFUN (bgp_neighbor_graceful_restart_helper_set,
2ba1fe69 3189 bgp_neighbor_graceful_restart_helper_set_cmd,
3190 "neighbor <A.B.C.D|X:X::X:X|WORD> graceful-restart-helper",
3191 NEIGHBOR_STR
3192 NEIGHBOR_ADDR_STR2
3193 GR_NEIGHBOR_HELPER_CMD
055679e9 3194 )
3195{
3196 int idx_peer = 1;
3197 struct peer *peer;
3198 int ret = BGP_GR_FAILURE;
3199
dc95985f 3200 VTY_BGP_GR_DEFINE_LOOP_VARIABLE;
3201
055679e9 3202 if (BGP_DEBUG(graceful_restart, GRACEFUL_RESTART))
3203 zlog_debug(
2ba1fe69 3204 "[BGP_GR] bgp_neighbor_graceful_restart_helper_set_cmd : START ");
dc95985f 3205
055679e9 3206 peer = peer_and_group_lookup_vty(vty, argv[idx_peer]->arg);
3207
055679e9 3208 if (!peer)
3209 return CMD_WARNING_CONFIG_FAILED;
3210
3211
3212 ret = bgp_neighbor_graceful_restart(peer, PEER_HELPER_CMD);
5cce3f05 3213
dc95985f 3214 VTY_BGP_GR_ROUTER_DETECT(bgp, peer, peer->bgp->peer);
3215 VTY_SEND_BGP_GR_CAPABILITY_TO_ZEBRA(peer->bgp, ret);
5cce3f05 3216
055679e9 3217 if (BGP_DEBUG(graceful_restart, GRACEFUL_RESTART))
3218 zlog_debug(
2ba1fe69 3219 "[BGP_GR] bgp_neighbor_graceful_restart_helper_set_cmd : END ");
dc95985f 3220 vty_out(vty,
3221 "Graceful restart configuration changed, reset this peer to take effect\n");
055679e9 3222
3223 return bgp_vty_return(vty, ret);
3224}
3225
3226DEFUN (no_bgp_neighbor_graceful_restart_helper,
2ba1fe69 3227 no_bgp_neighbor_graceful_restart_helper_set_cmd,
3228 "no neighbor <A.B.C.D|X:X::X:X|WORD> graceful-restart-helper",
3229 NO_STR
3230 NEIGHBOR_STR
3231 NEIGHBOR_ADDR_STR2
3232 NO_GR_NEIGHBOR_HELPER_CMD
055679e9 3233 )
3234{
3235 int idx_peer = 2;
3236 int ret = BGP_GR_FAILURE;
3237 struct peer *peer;
3238
dc95985f 3239 VTY_BGP_GR_DEFINE_LOOP_VARIABLE;
3240
055679e9 3241 peer = peer_and_group_lookup_vty(vty, argv[idx_peer]->arg);
3242 if (!peer)
3243 return CMD_WARNING_CONFIG_FAILED;
3244
3245 if (BGP_DEBUG(graceful_restart, GRACEFUL_RESTART))
3246 zlog_debug(
2ba1fe69 3247 "[BGP_GR] no_bgp_neighbor_graceful_restart_helper_set_cmd : START ");
055679e9 3248
36235319 3249 ret = bgp_neighbor_graceful_restart(peer, NO_PEER_HELPER_CMD);
055679e9 3250
dc95985f 3251 VTY_BGP_GR_ROUTER_DETECT(bgp, peer, peer->bgp->peer);
3252 VTY_SEND_BGP_GR_CAPABILITY_TO_ZEBRA(peer->bgp, ret);
055679e9 3253
3254 if (BGP_DEBUG(graceful_restart, GRACEFUL_RESTART))
3255 zlog_debug(
2ba1fe69 3256 "[BGP_GR] no_bgp_neighbor_graceful_restart_helper_set_cmd : END ");
dc95985f 3257 vty_out(vty,
3258 "Graceful restart configuration changed, reset this peer to take effect\n");
055679e9 3259
3260 return bgp_vty_return(vty, ret);
3261}
3262
3263DEFUN (bgp_neighbor_graceful_restart_disable_set,
2ba1fe69 3264 bgp_neighbor_graceful_restart_disable_set_cmd,
3265 "neighbor <A.B.C.D|X:X::X:X|WORD> graceful-restart-disable",
3266 NEIGHBOR_STR
3267 NEIGHBOR_ADDR_STR2
3268 GR_NEIGHBOR_DISABLE_CMD
055679e9 3269 )
3270{
3271 int idx_peer = 1;
3272 struct peer *peer;
3273 int ret = BGP_GR_FAILURE;
3274
dc95985f 3275 VTY_BGP_GR_DEFINE_LOOP_VARIABLE;
3276
055679e9 3277 if (BGP_DEBUG(graceful_restart, GRACEFUL_RESTART))
3278 zlog_debug(
2ba1fe69 3279 "[BGP_GR] bgp_neighbor_graceful_restart_disable_set_cmd : START ");
055679e9 3280
3281 peer = peer_and_group_lookup_vty(vty, argv[idx_peer]->arg);
3282 if (!peer)
3283 return CMD_WARNING_CONFIG_FAILED;
3284
36235319 3285 ret = bgp_neighbor_graceful_restart(peer, PEER_DISABLE_CMD);
055679e9 3286
3287 if (peer->bgp->t_startup)
3288 bgp_peer_gr_flags_update(peer);
3289
dc95985f 3290 VTY_BGP_GR_ROUTER_DETECT(bgp, peer, peer->bgp->peer);
3291 VTY_SEND_BGP_GR_CAPABILITY_TO_ZEBRA(peer->bgp, ret);
3292
055679e9 3293 if (BGP_DEBUG(graceful_restart, GRACEFUL_RESTART))
3294 zlog_debug(
2ba1fe69 3295 "[BGP_GR]bgp_neighbor_graceful_restart_disable_set_cmd : END ");
dc95985f 3296 vty_out(vty,
3297 "Graceful restart configuration changed, reset this peer to take effect\n");
055679e9 3298
3299 return bgp_vty_return(vty, ret);
3300}
3301
3302DEFUN (no_bgp_neighbor_graceful_restart_disable,
2ba1fe69 3303 no_bgp_neighbor_graceful_restart_disable_set_cmd,
3304 "no neighbor <A.B.C.D|X:X::X:X|WORD> graceful-restart-disable",
3305 NO_STR
3306 NEIGHBOR_STR
3307 NEIGHBOR_ADDR_STR2
3308 NO_GR_NEIGHBOR_DISABLE_CMD
055679e9 3309 )
3310{
3311 int idx_peer = 2;
3312 int ret = BGP_GR_FAILURE;
3313 struct peer *peer;
3314
dc95985f 3315 VTY_BGP_GR_DEFINE_LOOP_VARIABLE;
3316
055679e9 3317 peer = peer_and_group_lookup_vty(vty, argv[idx_peer]->arg);
3318 if (!peer)
3319 return CMD_WARNING_CONFIG_FAILED;
3320
3321 if (BGP_DEBUG(graceful_restart, GRACEFUL_RESTART))
3322 zlog_debug(
2ba1fe69 3323 "[BGP_GR] no_bgp_neighbor_graceful_restart_disable_set_cmd : START ");
055679e9 3324
3325 ret = bgp_neighbor_graceful_restart(peer, NO_PEER_DISABLE_CMD);
3326
dc95985f 3327 VTY_BGP_GR_ROUTER_DETECT(bgp, peer, peer->bgp->peer);
3328 VTY_SEND_BGP_GR_CAPABILITY_TO_ZEBRA(peer->bgp, ret);
055679e9 3329
3330 if (BGP_DEBUG(graceful_restart, GRACEFUL_RESTART))
3331 zlog_debug(
2ba1fe69 3332 "[BGP_GR] no_bgp_neighbor_graceful_restart_disable_set_cmd : END ");
dc95985f 3333 vty_out(vty,
3334 "Graceful restart configuration changed, reset this peer to take effect\n");
055679e9 3335
3336 return bgp_vty_return(vty, ret);
3337}
3338
d6e3c15b 3339DEFUN_HIDDEN (bgp_graceful_restart_disable_eor,
3340 bgp_graceful_restart_disable_eor_cmd,
3341 "bgp graceful-restart disable-eor",
e9273987 3342 BGP_STR
d6e3c15b 3343 "Graceful restart configuration parameters\n"
3344 "Disable EOR Check\n")
3345{
3346 VTY_DECLVAR_CONTEXT(bgp, bgp);
892fedb6 3347 SET_FLAG(bgp->flags, BGP_FLAG_GR_DISABLE_EOR);
dc95985f 3348
d6e3c15b 3349 return CMD_SUCCESS;
3350}
3351
3352DEFUN_HIDDEN (no_bgp_graceful_restart_disable_eor,
3353 no_bgp_graceful_restart_disable_eor_cmd,
3354 "no bgp graceful-restart disable-eor",
3355 NO_STR
e9273987 3356 BGP_STR
d6e3c15b 3357 "Graceful restart configuration parameters\n"
3358 "Disable EOR Check\n")
3359{
3360 VTY_DECLVAR_CONTEXT(bgp, bgp);
892fedb6 3361 UNSET_FLAG(bgp->flags, BGP_FLAG_GR_DISABLE_EOR);
dc95985f 3362
3363 return CMD_SUCCESS;
3364}
3365
3366DEFUN (bgp_graceful_restart_rib_stale_time,
3367 bgp_graceful_restart_rib_stale_time_cmd,
3368 "bgp graceful-restart rib-stale-time (1-3600)",
e9273987 3369 BGP_STR
dc95985f 3370 "Graceful restart configuration parameters\n"
3371 "Specify the stale route removal timer in rib\n"
3372 "Delay value (seconds)\n")
3373{
3374 VTY_DECLVAR_CONTEXT(bgp, bgp);
3375 int idx_number = 3;
3376 uint32_t stale_time;
3377
3378 stale_time = strtoul(argv[idx_number]->arg, NULL, 10);
3379 bgp->rib_stale_time = stale_time;
3380 /* Send the stale timer update message to RIB */
3381 if (bgp_zebra_stale_timer_update(bgp))
3382 return CMD_WARNING;
3383
3384 return CMD_SUCCESS;
3385}
3386
3387DEFUN (no_bgp_graceful_restart_rib_stale_time,
3388 no_bgp_graceful_restart_rib_stale_time_cmd,
3389 "no bgp graceful-restart rib-stale-time [(1-3600)]",
3390 NO_STR
e9273987 3391 BGP_STR
dc95985f 3392 "Graceful restart configuration parameters\n"
3393 "Specify the stale route removal timer in rib\n"
3394 "Delay value (seconds)\n")
3395{
3396 VTY_DECLVAR_CONTEXT(bgp, bgp);
3397
3398 bgp->rib_stale_time = BGP_DEFAULT_RIB_STALE_TIME;
3399 /* Send the stale timer update message to RIB */
3400 if (bgp_zebra_stale_timer_update(bgp))
3401 return CMD_WARNING;
3402
d6e3c15b 3403 return CMD_SUCCESS;
3404}
3405
8606be87 3406DEFUN(bgp_llgr_stalepath_time, bgp_llgr_stalepath_time_cmd,
7f8a9a24
DA
3407 "bgp long-lived-graceful-restart stale-time (1-4294967295)",
3408 BGP_STR
8606be87
DA
3409 "Enable Long-lived Graceful Restart\n"
3410 "Specifies maximum time to wait before purging long-lived stale routes\n"
3411 "Stale time value (seconds)\n")
3412{
3413 VTY_DECLVAR_CONTEXT(bgp, bgp);
3414
3415 uint32_t llgr_stale_time;
3416
3417 llgr_stale_time = strtoul(argv[3]->arg, NULL, 10);
3418 bgp->llgr_stale_time = llgr_stale_time;
3419
3420 return CMD_SUCCESS;
3421}
3422
3423DEFUN(no_bgp_llgr_stalepath_time, no_bgp_llgr_stalepath_time_cmd,
7f8a9a24 3424 "no bgp long-lived-graceful-restart stale-time [(1-4294967295)]",
8606be87
DA
3425 NO_STR BGP_STR
3426 "Enable Long-lived Graceful Restart\n"
3427 "Specifies maximum time to wait before purging long-lived stale routes\n"
3428 "Stale time value (seconds)\n")
3429{
3430 VTY_DECLVAR_CONTEXT(bgp, bgp);
3431
3432 bgp->llgr_stale_time = BGP_DEFAULT_LLGR_STALE_TIME;
3433
3434 return CMD_SUCCESS;
3435}
3436
1ca2fd11
IR
3437static inline void bgp_initiate_graceful_shut_unshut(struct vty *vty,
3438 struct bgp *bgp)
05bd726c 3439{
3440 bgp_static_redo_import_check(bgp);
3441 bgp_redistribute_redo(bgp);
1ca2fd11
IR
3442 bgp_clear_star_soft_out(vty, bgp->name);
3443 bgp_clear_star_soft_in(vty, bgp->name);
05bd726c 3444}
3445
3446static int bgp_global_graceful_shutdown_config_vty(struct vty *vty)
3447{
3448 struct listnode *node, *nnode;
3449 struct bgp *bgp;
3450 bool vrf_cfg = false;
3451
3452 if (CHECK_FLAG(bm->flags, BM_FLAG_GRACEFUL_SHUTDOWN))
3453 return CMD_SUCCESS;
3454
3455 /* See if graceful-shutdown is set per-vrf and warn user to delete */
3456 for (ALL_LIST_ELEMENTS(bm->bgp, node, nnode, bgp)) {
3457 if (CHECK_FLAG(bgp->flags, BGP_FLAG_GRACEFUL_SHUTDOWN)) {
3458 vty_out(vty,
3459 "%% graceful-shutdown configuration found in vrf %s\n",
3460 bgp->inst_type == BGP_INSTANCE_TYPE_DEFAULT ?
3461 VRF_DEFAULT_NAME : bgp->name);
3462 vrf_cfg = true;
3463 }
3464 }
3465
3466 if (vrf_cfg) {
3467 vty_out(vty,
3468 "%%Failed: global graceful-shutdown not permitted\n");
3469 return CMD_WARNING;
3470 }
3471
3472 /* Set flag globally */
3473 SET_FLAG(bm->flags, BM_FLAG_GRACEFUL_SHUTDOWN);
3474
3475 /* Initiate processing for all BGP instances. */
1ca2fd11
IR
3476 for (ALL_LIST_ELEMENTS(bm->bgp, node, nnode, bgp))
3477 bgp_initiate_graceful_shut_unshut(vty, bgp);
05bd726c 3478
3479 return CMD_SUCCESS;
3480}
3481
3482static int bgp_global_graceful_shutdown_deconfig_vty(struct vty *vty)
3483{
3484 struct listnode *node, *nnode;
3485 struct bgp *bgp;
3486
3487 if (!CHECK_FLAG(bm->flags, BM_FLAG_GRACEFUL_SHUTDOWN))
3488 return CMD_SUCCESS;
3489
3490 /* Unset flag globally */
3491 UNSET_FLAG(bm->flags, BM_FLAG_GRACEFUL_SHUTDOWN);
3492
3493 /* Initiate processing for all BGP instances. */
1ca2fd11
IR
3494 for (ALL_LIST_ELEMENTS(bm->bgp, node, nnode, bgp))
3495 bgp_initiate_graceful_shut_unshut(vty, bgp);
05bd726c 3496
3497 return CMD_SUCCESS;
3498}
3499
7f323236
DW
3500/* "bgp graceful-shutdown" configuration */
3501DEFUN (bgp_graceful_shutdown,
3502 bgp_graceful_shutdown_cmd,
3503 "bgp graceful-shutdown",
3504 BGP_STR
3505 "Graceful shutdown parameters\n")
3506{
05bd726c 3507 if (vty->node == CONFIG_NODE)
3508 return bgp_global_graceful_shutdown_config_vty(vty);
3509
1ca2fd11 3510 VTY_DECLVAR_CONTEXT(bgp, bgp);
7f323236 3511
1ca2fd11
IR
3512 /* if configured globally, per-instance config is not allowed */
3513 if (CHECK_FLAG(bm->flags, BM_FLAG_GRACEFUL_SHUTDOWN)) {
3514 vty_out(vty,
3515 "%%Failed: per-vrf graceful-shutdown config not permitted with global graceful-shutdown\n");
3516 return CMD_WARNING_CONFIG_FAILED;
3517 }
3518
3519 if (!CHECK_FLAG(bgp->flags, BGP_FLAG_GRACEFUL_SHUTDOWN)) {
3520 SET_FLAG(bgp->flags, BGP_FLAG_GRACEFUL_SHUTDOWN);
3521 bgp_initiate_graceful_shut_unshut(vty, bgp);
3522 }
3523
3524 return CMD_SUCCESS;
7f323236
DW
3525}
3526
1ca2fd11 3527DEFUN (no_bgp_graceful_shutdown,
7f323236
DW
3528 no_bgp_graceful_shutdown_cmd,
3529 "no bgp graceful-shutdown",
3530 NO_STR
3531 BGP_STR
3532 "Graceful shutdown parameters\n")
3533{
05bd726c 3534 if (vty->node == CONFIG_NODE)
3535 return bgp_global_graceful_shutdown_deconfig_vty(vty);
3536
1ca2fd11 3537 VTY_DECLVAR_CONTEXT(bgp, bgp);
05bd726c 3538
1ca2fd11
IR
3539 /* If configured globally, cannot remove from one bgp instance */
3540 if (CHECK_FLAG(bm->flags, BM_FLAG_GRACEFUL_SHUTDOWN)) {
3541 vty_out(vty,
3542 "%%Failed: bgp graceful-shutdown configured globally. Delete per-vrf not permitted\n");
3543 return CMD_WARNING_CONFIG_FAILED;
3544 }
7f323236 3545
1ca2fd11
IR
3546 if (CHECK_FLAG(bgp->flags, BGP_FLAG_GRACEFUL_SHUTDOWN)) {
3547 UNSET_FLAG(bgp->flags, BGP_FLAG_GRACEFUL_SHUTDOWN);
3548 bgp_initiate_graceful_shut_unshut(vty, bgp);
3549 }
3550
3551 return CMD_SUCCESS;
7f323236
DW
3552}
3553
718e3744 3554/* "bgp fast-external-failover" configuration. */
1ca2fd11 3555DEFUN (bgp_fast_external_failover,
718e3744 3556 bgp_fast_external_failover_cmd,
3557 "bgp fast-external-failover",
3558 BGP_STR
3559 "Immediately reset session if a link to a directly connected external peer goes down\n")
3560{
1ca2fd11
IR
3561 VTY_DECLVAR_CONTEXT(bgp, bgp);
3562 UNSET_FLAG(bgp->flags, BGP_FLAG_NO_FAST_EXT_FAILOVER);
3563 return CMD_SUCCESS;
718e3744 3564}
3565
1ca2fd11 3566DEFUN (no_bgp_fast_external_failover,
718e3744 3567 no_bgp_fast_external_failover_cmd,
3568 "no bgp fast-external-failover",
3569 NO_STR
3570 BGP_STR
3571 "Immediately reset session if a link to a directly connected external peer goes down\n")
3572{
1ca2fd11
IR
3573 VTY_DECLVAR_CONTEXT(bgp, bgp);
3574 SET_FLAG(bgp->flags, BGP_FLAG_NO_FAST_EXT_FAILOVER);
3575 return CMD_SUCCESS;
718e3744 3576}
6b0655a2 3577
718e3744 3578/* "bgp bestpath compare-routerid" configuration. */
1ca2fd11
IR
3579DEFUN (bgp_bestpath_compare_router_id,
3580 bgp_bestpath_compare_router_id_cmd,
3581 "bgp bestpath compare-routerid",
e9273987 3582 BGP_STR
1ca2fd11
IR
3583 "Change the default bestpath selection\n"
3584 "Compare router-id for identical EBGP paths\n")
718e3744 3585{
1ca2fd11
IR
3586 VTY_DECLVAR_CONTEXT(bgp, bgp);
3587 SET_FLAG(bgp->flags, BGP_FLAG_COMPARE_ROUTER_ID);
3588 bgp_recalculate_all_bestpaths(bgp);
7aafcaca 3589
1ca2fd11 3590 return CMD_SUCCESS;
718e3744 3591}
3592
1ca2fd11
IR
3593DEFUN (no_bgp_bestpath_compare_router_id,
3594 no_bgp_bestpath_compare_router_id_cmd,
3595 "no bgp bestpath compare-routerid",
3596 NO_STR
e9273987 3597 BGP_STR
1ca2fd11
IR
3598 "Change the default bestpath selection\n"
3599 "Compare router-id for identical EBGP paths\n")
718e3744 3600{
1ca2fd11
IR
3601 VTY_DECLVAR_CONTEXT(bgp, bgp);
3602 UNSET_FLAG(bgp->flags, BGP_FLAG_COMPARE_ROUTER_ID);
3603 bgp_recalculate_all_bestpaths(bgp);
7aafcaca 3604
1ca2fd11 3605 return CMD_SUCCESS;
718e3744 3606}
6b0655a2 3607
718e3744 3608/* "bgp bestpath as-path ignore" configuration. */
1ca2fd11
IR
3609DEFUN (bgp_bestpath_aspath_ignore,
3610 bgp_bestpath_aspath_ignore_cmd,
3611 "bgp bestpath as-path ignore",
e9273987 3612 BGP_STR
1ca2fd11
IR
3613 "Change the default bestpath selection\n"
3614 "AS-path attribute\n"
3615 "Ignore as-path length in selecting a route\n")
718e3744 3616{
1ca2fd11
IR
3617 VTY_DECLVAR_CONTEXT(bgp, bgp);
3618 SET_FLAG(bgp->flags, BGP_FLAG_ASPATH_IGNORE);
3619 bgp_recalculate_all_bestpaths(bgp);
7aafcaca 3620
1ca2fd11 3621 return CMD_SUCCESS;
718e3744 3622}
3623
1ca2fd11
IR
3624DEFUN (no_bgp_bestpath_aspath_ignore,
3625 no_bgp_bestpath_aspath_ignore_cmd,
3626 "no bgp bestpath as-path ignore",
3627 NO_STR
e9273987 3628 BGP_STR
1ca2fd11
IR
3629 "Change the default bestpath selection\n"
3630 "AS-path attribute\n"
3631 "Ignore as-path length in selecting a route\n")
718e3744 3632{
1ca2fd11
IR
3633 VTY_DECLVAR_CONTEXT(bgp, bgp);
3634 UNSET_FLAG(bgp->flags, BGP_FLAG_ASPATH_IGNORE);
3635 bgp_recalculate_all_bestpaths(bgp);
7aafcaca 3636
1ca2fd11 3637 return CMD_SUCCESS;
718e3744 3638}
6b0655a2 3639
6811845b 3640/* "bgp bestpath as-path confed" configuration. */
1ca2fd11 3641DEFUN (bgp_bestpath_aspath_confed,
6811845b 3642 bgp_bestpath_aspath_confed_cmd,
3643 "bgp bestpath as-path confed",
e9273987 3644 BGP_STR
6811845b 3645 "Change the default bestpath selection\n"
3646 "AS-path attribute\n"
3647 "Compare path lengths including confederation sets & sequences in selecting a route\n")
3648{
1ca2fd11
IR
3649 VTY_DECLVAR_CONTEXT(bgp, bgp);
3650 SET_FLAG(bgp->flags, BGP_FLAG_ASPATH_CONFED);
3651 bgp_recalculate_all_bestpaths(bgp);
7aafcaca 3652
1ca2fd11 3653 return CMD_SUCCESS;
6811845b 3654}
3655
1ca2fd11 3656DEFUN (no_bgp_bestpath_aspath_confed,
6811845b 3657 no_bgp_bestpath_aspath_confed_cmd,
3658 "no bgp bestpath as-path confed",
3659 NO_STR
e9273987 3660 BGP_STR
6811845b 3661 "Change the default bestpath selection\n"
3662 "AS-path attribute\n"
3663 "Compare path lengths including confederation sets & sequences in selecting a route\n")
3664{
1ca2fd11
IR
3665 VTY_DECLVAR_CONTEXT(bgp, bgp);
3666 UNSET_FLAG(bgp->flags, BGP_FLAG_ASPATH_CONFED);
3667 bgp_recalculate_all_bestpaths(bgp);
7aafcaca 3668
1ca2fd11 3669 return CMD_SUCCESS;
6811845b 3670}
6b0655a2 3671
2fdd455c 3672/* "bgp bestpath as-path multipath-relax" configuration. */
1ca2fd11 3673DEFUN (bgp_bestpath_aspath_multipath_relax,
2fdd455c 3674 bgp_bestpath_aspath_multipath_relax_cmd,
c7178fe7 3675 "bgp bestpath as-path multipath-relax [<as-set|no-as-set>]",
e9273987 3676 BGP_STR
16fc1eec
DS
3677 "Change the default bestpath selection\n"
3678 "AS-path attribute\n"
3679 "Allow load sharing across routes that have different AS paths (but same length)\n"
219178b6 3680 "Generate an AS_SET\n"
16fc1eec
DS
3681 "Do not generate an AS_SET\n")
3682{
1ca2fd11 3683 VTY_DECLVAR_CONTEXT(bgp, bgp);
d62a17ae 3684 int idx = 0;
1ca2fd11 3685 SET_FLAG(bgp->flags, BGP_FLAG_ASPATH_MULTIPATH_RELAX);
219178b6 3686
1ca2fd11
IR
3687 /* no-as-set is now the default behavior so we can silently
3688 * ignore it */
d62a17ae 3689 if (argv_find(argv, argc, "as-set", &idx))
1ca2fd11 3690 SET_FLAG(bgp->flags, BGP_FLAG_MULTIPATH_RELAX_AS_SET);
d62a17ae 3691 else
1ca2fd11 3692 UNSET_FLAG(bgp->flags, BGP_FLAG_MULTIPATH_RELAX_AS_SET);
7aafcaca 3693
1ca2fd11
IR
3694 bgp_recalculate_all_bestpaths(bgp);
3695
3696 return CMD_SUCCESS;
16fc1eec
DS
3697}
3698
1ca2fd11 3699DEFUN (no_bgp_bestpath_aspath_multipath_relax,
219178b6 3700 no_bgp_bestpath_aspath_multipath_relax_cmd,
c7178fe7 3701 "no bgp bestpath as-path multipath-relax [<as-set|no-as-set>]",
16fc1eec 3702 NO_STR
e9273987 3703 BGP_STR
16fc1eec
DS
3704 "Change the default bestpath selection\n"
3705 "AS-path attribute\n"
3706 "Allow load sharing across routes that have different AS paths (but same length)\n"
219178b6 3707 "Generate an AS_SET\n"
16fc1eec
DS
3708 "Do not generate an AS_SET\n")
3709{
1ca2fd11
IR
3710 VTY_DECLVAR_CONTEXT(bgp, bgp);
3711 UNSET_FLAG(bgp->flags, BGP_FLAG_ASPATH_MULTIPATH_RELAX);
3712 UNSET_FLAG(bgp->flags, BGP_FLAG_MULTIPATH_RELAX_AS_SET);
3713 bgp_recalculate_all_bestpaths(bgp);
7aafcaca 3714
1ca2fd11 3715 return CMD_SUCCESS;
2fdd455c 3716}
6b0655a2 3717
ee88563a
JM
3718/* "bgp bestpath peer-type multipath-relax" configuration. */
3719DEFUN(bgp_bestpath_peer_type_multipath_relax,
3720 bgp_bestpath_peer_type_multipath_relax_cmd,
3721 "bgp bestpath peer-type multipath-relax",
3722 BGP_STR
3723 "Change the default bestpath selection\n"
3724 "Peer type\n"
3725 "Allow load sharing across routes learned from different peer types\n")
3726{
3727 VTY_DECLVAR_CONTEXT(bgp, bgp);
3728 SET_FLAG(bgp->flags, BGP_FLAG_PEERTYPE_MULTIPATH_RELAX);
3729 bgp_recalculate_all_bestpaths(bgp);
3730
3731 return CMD_SUCCESS;
3732}
3733
3734DEFUN(no_bgp_bestpath_peer_type_multipath_relax,
3735 no_bgp_bestpath_peer_type_multipath_relax_cmd,
3736 "no bgp bestpath peer-type multipath-relax",
3737 NO_STR BGP_STR
3738 "Change the default bestpath selection\n"
3739 "Peer type\n"
3740 "Allow load sharing across routes learned from different peer types\n")
3741{
3742 VTY_DECLVAR_CONTEXT(bgp, bgp);
3743 UNSET_FLAG(bgp->flags, BGP_FLAG_PEERTYPE_MULTIPATH_RELAX);
3744 bgp_recalculate_all_bestpaths(bgp);
3745
3746 return CMD_SUCCESS;
3747}
3748
848973c7 3749/* "bgp log-neighbor-changes" configuration. */
1ca2fd11
IR
3750DEFUN (bgp_log_neighbor_changes,
3751 bgp_log_neighbor_changes_cmd,
3752 "bgp log-neighbor-changes",
e9273987 3753 BGP_STR
1ca2fd11 3754 "Log neighbor up/down and reset reason\n")
848973c7 3755{
1ca2fd11
IR
3756 VTY_DECLVAR_CONTEXT(bgp, bgp);
3757 SET_FLAG(bgp->flags, BGP_FLAG_LOG_NEIGHBOR_CHANGES);
3758 return CMD_SUCCESS;
848973c7 3759}
3760
1ca2fd11
IR
3761DEFUN (no_bgp_log_neighbor_changes,
3762 no_bgp_log_neighbor_changes_cmd,
3763 "no bgp log-neighbor-changes",
3764 NO_STR
e9273987 3765 BGP_STR
1ca2fd11 3766 "Log neighbor up/down and reset reason\n")
848973c7 3767{
1ca2fd11
IR
3768 VTY_DECLVAR_CONTEXT(bgp, bgp);
3769 UNSET_FLAG(bgp->flags, BGP_FLAG_LOG_NEIGHBOR_CHANGES);
3770 return CMD_SUCCESS;
848973c7 3771}
6b0655a2 3772
718e3744 3773/* "bgp bestpath med" configuration. */
1ca2fd11 3774DEFUN (bgp_bestpath_med,
718e3744 3775 bgp_bestpath_med_cmd,
2d8c1a4d 3776 "bgp bestpath med <confed [missing-as-worst]|missing-as-worst [confed]>",
e9273987 3777 BGP_STR
718e3744 3778 "Change the default bestpath selection\n"
3779 "MED attribute\n"
3780 "Compare MED among confederation paths\n"
838758ac
DW
3781 "Treat missing MED as the least preferred one\n"
3782 "Treat missing MED as the least preferred one\n"
3783 "Compare MED among confederation paths\n")
718e3744 3784{
1ca2fd11 3785 VTY_DECLVAR_CONTEXT(bgp, bgp);
ff8a8a7a 3786
1ca2fd11 3787 int idx = 0;
d62a17ae 3788 if (argv_find(argv, argc, "confed", &idx))
1ca2fd11 3789 SET_FLAG(bgp->flags, BGP_FLAG_MED_CONFED);
d62a17ae 3790 idx = 0;
3791 if (argv_find(argv, argc, "missing-as-worst", &idx))
1ca2fd11 3792 SET_FLAG(bgp->flags, BGP_FLAG_MED_MISSING_AS_WORST);
e52702f2 3793
1ca2fd11 3794 bgp_recalculate_all_bestpaths(bgp);
7aafcaca 3795
1ca2fd11 3796 return CMD_SUCCESS;
718e3744 3797}
3798
1ca2fd11 3799DEFUN (no_bgp_bestpath_med,
718e3744 3800 no_bgp_bestpath_med_cmd,
2d8c1a4d 3801 "no bgp bestpath med <confed [missing-as-worst]|missing-as-worst [confed]>",
718e3744 3802 NO_STR
e9273987 3803 BGP_STR
718e3744 3804 "Change the default bestpath selection\n"
3805 "MED attribute\n"
3806 "Compare MED among confederation paths\n"
3a2d747c
QY
3807 "Treat missing MED as the least preferred one\n"
3808 "Treat missing MED as the least preferred one\n"
3809 "Compare MED among confederation paths\n")
718e3744 3810{
1ca2fd11 3811 VTY_DECLVAR_CONTEXT(bgp, bgp);
ff8a8a7a 3812
1ca2fd11 3813 int idx = 0;
d62a17ae 3814 if (argv_find(argv, argc, "confed", &idx))
1ca2fd11 3815 UNSET_FLAG(bgp->flags, BGP_FLAG_MED_CONFED);
d62a17ae 3816 idx = 0;
3817 if (argv_find(argv, argc, "missing-as-worst", &idx))
1ca2fd11
IR
3818 UNSET_FLAG(bgp->flags, BGP_FLAG_MED_MISSING_AS_WORST);
3819
3820 bgp_recalculate_all_bestpaths(bgp);
718e3744 3821
1ca2fd11 3822 return CMD_SUCCESS;
718e3744 3823}
3824
f7e1c681 3825/* "bgp bestpath bandwidth" configuration. */
3826DEFPY (bgp_bestpath_bw,
3827 bgp_bestpath_bw_cmd,
ad36d216 3828 "bgp bestpath bandwidth <ignore|skip-missing|default-weight-for-missing>$bw_cfg",
e9273987 3829 BGP_STR
f7e1c681 3830 "Change the default bestpath selection\n"
3831 "Link Bandwidth attribute\n"
3832 "Ignore link bandwidth (i.e., do regular ECMP, not weighted)\n"
3833 "Ignore paths without link bandwidth for ECMP (if other paths have it)\n"
3834 "Assign a low default weight (value 1) to paths not having link bandwidth\n")
3835{
3836 VTY_DECLVAR_CONTEXT(bgp, bgp);
3837 afi_t afi;
3838 safi_t safi;
3839
ad36d216
DS
3840 if (!bw_cfg) {
3841 vty_out(vty, "%% Bandwidth configuration must be specified\n");
3842 return CMD_ERR_INCOMPLETE;
f7e1c681 3843 }
ad36d216
DS
3844 if (!strcmp(bw_cfg, "ignore"))
3845 bgp->lb_handling = BGP_LINK_BW_IGNORE_BW;
3846 else if (!strcmp(bw_cfg, "skip-missing"))
3847 bgp->lb_handling = BGP_LINK_BW_SKIP_MISSING;
3848 else if (!strcmp(bw_cfg, "default-weight-for-missing"))
3849 bgp->lb_handling = BGP_LINK_BW_DEFWT_4_MISSING;
3850 else
3851 return CMD_ERR_NO_MATCH;
f7e1c681 3852
3853 /* This config is used in route install, so redo that. */
3854 FOREACH_AFI_SAFI (afi, safi) {
3855 if (!bgp_fibupd_safi(safi))
3856 continue;
3857 bgp_zebra_announce_table(bgp, afi, safi);
3858 }
3859
3860 return CMD_SUCCESS;
3861}
3862
ad36d216
DS
3863DEFPY (no_bgp_bestpath_bw,
3864 no_bgp_bestpath_bw_cmd,
3865 "no bgp bestpath bandwidth [<ignore|skip-missing|default-weight-for-missing>$bw_cfg]",
3866 NO_STR
e9273987 3867 BGP_STR
ad36d216
DS
3868 "Change the default bestpath selection\n"
3869 "Link Bandwidth attribute\n"
3870 "Ignore link bandwidth (i.e., do regular ECMP, not weighted)\n"
3871 "Ignore paths without link bandwidth for ECMP (if other paths have it)\n"
3872 "Assign a low default weight (value 1) to paths not having link bandwidth\n")
3873{
3874 VTY_DECLVAR_CONTEXT(bgp, bgp);
3875 afi_t afi;
3876 safi_t safi;
3877
3878 bgp->lb_handling = BGP_LINK_BW_ECMP;
3879
3880 /* This config is used in route install, so redo that. */
3881 FOREACH_AFI_SAFI (afi, safi) {
3882 if (!bgp_fibupd_safi(safi))
3883 continue;
3884 bgp_zebra_announce_table(bgp, afi, safi);
3885 }
3886 return CMD_SUCCESS;
3887}
3888
b16bcbba 3889DEFPY(bgp_default_afi_safi, bgp_default_afi_safi_cmd,
38d11af5
TA
3890 "[no] bgp default <ipv4-unicast|"
3891 "ipv4-multicast|"
3892 "ipv4-vpn|"
3893 "ipv4-labeled-unicast|"
3894 "ipv4-flowspec|"
3895 "ipv6-unicast|"
3896 "ipv6-multicast|"
3897 "ipv6-vpn|"
3898 "ipv6-labeled-unicast|"
3899 "ipv6-flowspec|"
3900 "l2vpn-evpn>$afi_safi",
b16bcbba 3901 NO_STR
e9273987 3902 BGP_STR
e84c59af 3903 "Configure BGP defaults\n"
b16bcbba 3904 "Activate ipv4-unicast for a peer by default\n"
38d11af5
TA
3905 "Activate ipv4-multicast for a peer by default\n"
3906 "Activate ipv4-vpn for a peer by default\n"
3907 "Activate ipv4-labeled-unicast for a peer by default\n"
3908 "Activate ipv4-flowspec for a peer by default\n"
3909 "Activate ipv6-unicast for a peer by default\n"
3910 "Activate ipv6-multicast for a peer by default\n"
3911 "Activate ipv6-vpn for a peer by default\n"
3912 "Activate ipv6-labeled-unicast for a peer by default\n"
3913 "Activate ipv6-flowspec for a peer by default\n"
3914 "Activate l2vpn-evpn for a peer by default\n")
e84c59af
DA
3915{
3916 VTY_DECLVAR_CONTEXT(bgp, bgp);
b16bcbba
TA
3917 char afi_safi_str[strlen(afi_safi) + 1];
3918 char *afi_safi_str_tok;
e84c59af 3919
b16bcbba
TA
3920 strlcpy(afi_safi_str, afi_safi, sizeof(afi_safi_str));
3921 char *afi_str = strtok_r(afi_safi_str, "-", &afi_safi_str_tok);
3922 char *safi_str = strtok_r(NULL, "-", &afi_safi_str_tok);
3923 afi_t afi = bgp_vty_afi_from_str(afi_str);
38d11af5 3924 safi_t safi;
e84c59af 3925
d880a643
DS
3926 /*
3927 * Impossible situation but making coverity happy
3928 */
3929 assert(afi != AFI_MAX);
3930
38d11af5
TA
3931 if (strmatch(safi_str, "labeled"))
3932 safi = bgp_vty_safi_from_str("labeled-unicast");
3933 else
3934 safi = bgp_vty_safi_from_str(safi_str);
b16bcbba 3935
f609bcd6 3936 assert(safi != SAFI_MAX);
b16bcbba
TA
3937 if (no)
3938 bgp->default_af[afi][safi] = false;
38d11af5
TA
3939 else {
3940 if ((safi == SAFI_LABELED_UNICAST
3941 && bgp->default_af[afi][SAFI_UNICAST])
3942 || (safi == SAFI_UNICAST
3943 && bgp->default_af[afi][SAFI_LABELED_UNICAST]))
3944 bgp_vty_return(vty, BGP_ERR_PEER_SAFI_CONFLICT);
3945 else
3946 bgp->default_af[afi][safi] = true;
3947 }
718e3744 3948
d62a17ae 3949 return CMD_SUCCESS;
718e3744 3950}
6b0655a2 3951
04b6bdc0 3952/* Display hostname in certain command outputs */
1ca2fd11 3953DEFUN (bgp_default_show_hostname,
04b6bdc0
DW
3954 bgp_default_show_hostname_cmd,
3955 "bgp default show-hostname",
e9273987 3956 BGP_STR
04b6bdc0 3957 "Configure BGP defaults\n"
0437e105 3958 "Show hostname in certain command outputs\n")
04b6bdc0 3959{
1ca2fd11
IR
3960 VTY_DECLVAR_CONTEXT(bgp, bgp);
3961 SET_FLAG(bgp->flags, BGP_FLAG_SHOW_HOSTNAME);
3962 return CMD_SUCCESS;
ff8a8a7a
CS
3963}
3964
1ca2fd11
IR
3965DEFUN (no_bgp_default_show_hostname,
3966 no_bgp_default_show_hostname_cmd,
3967 "no bgp default show-hostname",
3968 NO_STR
e9273987 3969 BGP_STR
1ca2fd11
IR
3970 "Configure BGP defaults\n"
3971 "Show hostname in certain command outputs\n")
ff8a8a7a 3972{
1ca2fd11
IR
3973 VTY_DECLVAR_CONTEXT(bgp, bgp);
3974 UNSET_FLAG(bgp->flags, BGP_FLAG_SHOW_HOSTNAME);
3975 return CMD_SUCCESS;
04b6bdc0
DW
3976}
3977
aef999a2 3978/* Display hostname in certain command outputs */
1d80f243
IR
3979DEFUN (bgp_default_show_nexthop_hostname,
3980 bgp_default_show_nexthop_hostname_cmd,
3981 "bgp default show-nexthop-hostname",
e9273987 3982 BGP_STR
1d80f243
IR
3983 "Configure BGP defaults\n"
3984 "Show hostname for nexthop in certain command outputs\n")
aef999a2 3985{
1ca2fd11
IR
3986 VTY_DECLVAR_CONTEXT(bgp, bgp);
3987 SET_FLAG(bgp->flags, BGP_FLAG_SHOW_NEXTHOP_HOSTNAME);
3988 return CMD_SUCCESS;
aef999a2
DA
3989}
3990
3991DEFUN (no_bgp_default_show_nexthop_hostname,
3992 no_bgp_default_show_nexthop_hostname_cmd,
3993 "no bgp default show-nexthop-hostname",
3994 NO_STR
e9273987 3995 BGP_STR
aef999a2
DA
3996 "Configure BGP defaults\n"
3997 "Show hostname for nexthop in certain command outputs\n")
3998{
1ca2fd11
IR
3999 VTY_DECLVAR_CONTEXT(bgp, bgp);
4000 UNSET_FLAG(bgp->flags, BGP_FLAG_SHOW_NEXTHOP_HOSTNAME);
4001 return CMD_SUCCESS;
aef999a2
DA
4002}
4003
8233ef81 4004/* "bgp network import-check" configuration. */
1ca2fd11
IR
4005DEFUN (bgp_network_import_check,
4006 bgp_network_import_check_cmd,
4007 "bgp network import-check",
e9273987 4008 BGP_STR
1ca2fd11
IR
4009 "BGP network command\n"
4010 "Check BGP network route exists in IGP\n")
718e3744 4011{
1ca2fd11
IR
4012 VTY_DECLVAR_CONTEXT(bgp, bgp);
4013 if (!CHECK_FLAG(bgp->flags, BGP_FLAG_IMPORT_CHECK)) {
4014 SET_FLAG(bgp->flags, BGP_FLAG_IMPORT_CHECK);
4015 bgp_static_redo_import_check(bgp);
4016 }
078430f6 4017
1ca2fd11 4018 return CMD_SUCCESS;
718e3744 4019}
4020
d62a17ae 4021ALIAS_HIDDEN(bgp_network_import_check, bgp_network_import_check_exact_cmd,
4022 "bgp network import-check exact",
e9273987 4023 BGP_STR
d62a17ae 4024 "BGP network command\n"
4025 "Check BGP network route exists in IGP\n"
4026 "Match route precisely\n")
8233ef81 4027
1ca2fd11
IR
4028DEFUN (no_bgp_network_import_check,
4029 no_bgp_network_import_check_cmd,
4030 "no bgp network import-check",
4031 NO_STR
e9273987 4032 BGP_STR
1ca2fd11
IR
4033 "BGP network command\n"
4034 "Check BGP network route exists in IGP\n")
718e3744 4035{
1ca2fd11
IR
4036 VTY_DECLVAR_CONTEXT(bgp, bgp);
4037 if (CHECK_FLAG(bgp->flags, BGP_FLAG_IMPORT_CHECK)) {
4038 UNSET_FLAG(bgp->flags, BGP_FLAG_IMPORT_CHECK);
4039 bgp_static_redo_import_check(bgp);
4040 }
6b0655a2 4041
1ca2fd11 4042 return CMD_SUCCESS;
ff8a8a7a 4043}
718e3744 4044
1ca2fd11
IR
4045DEFUN (bgp_default_local_preference,
4046 bgp_default_local_preference_cmd,
4047 "bgp default local-preference (0-4294967295)",
e9273987 4048 BGP_STR
1ca2fd11
IR
4049 "Configure BGP defaults\n"
4050 "local preference (higher=more preferred)\n"
4051 "Configure default local preference value\n")
ff8a8a7a 4052{
1ca2fd11 4053 VTY_DECLVAR_CONTEXT(bgp, bgp);
ff8a8a7a 4054 int idx_number = 3;
1ca2fd11 4055 uint32_t local_pref;
718e3744 4056
1ca2fd11 4057 local_pref = strtoul(argv[idx_number]->arg, NULL, 10);
718e3744 4058
1ca2fd11
IR
4059 bgp_default_local_preference_set(bgp, local_pref);
4060 bgp_clear_star_soft_in(vty, bgp->name);
718e3744 4061
1ca2fd11 4062 return CMD_SUCCESS;
718e3744 4063}
4064
1ca2fd11
IR
4065DEFUN (no_bgp_default_local_preference,
4066 no_bgp_default_local_preference_cmd,
4067 "no bgp default local-preference [(0-4294967295)]",
4068 NO_STR
e9273987 4069 BGP_STR
1ca2fd11
IR
4070 "Configure BGP defaults\n"
4071 "local preference (higher=more preferred)\n"
4072 "Configure default local preference value\n")
ff8a8a7a 4073{
1ca2fd11
IR
4074 VTY_DECLVAR_CONTEXT(bgp, bgp);
4075 bgp_default_local_preference_unset(bgp);
4076 bgp_clear_star_soft_in(vty, bgp->name);
4077
4078 return CMD_SUCCESS;
ff8a8a7a 4079}
6b0655a2 4080
ff8a8a7a 4081
1ca2fd11
IR
4082DEFUN (bgp_default_subgroup_pkt_queue_max,
4083 bgp_default_subgroup_pkt_queue_max_cmd,
4084 "bgp default subgroup-pkt-queue-max (20-100)",
e9273987 4085 BGP_STR
1ca2fd11
IR
4086 "Configure BGP defaults\n"
4087 "subgroup-pkt-queue-max\n"
4088 "Configure subgroup packet queue max\n")
8bd9d948 4089{
1ca2fd11 4090 VTY_DECLVAR_CONTEXT(bgp, bgp);
d62a17ae 4091 int idx_number = 3;
1ca2fd11 4092 uint32_t max_size;
3f9c7369 4093
1ca2fd11 4094 max_size = strtoul(argv[idx_number]->arg, NULL, 10);
3f9c7369 4095
1ca2fd11 4096 bgp_default_subgroup_pkt_queue_max_set(bgp, max_size);
ff8a8a7a 4097
1ca2fd11 4098 return CMD_SUCCESS;
8bd9d948
DS
4099}
4100
1ca2fd11
IR
4101DEFUN (no_bgp_default_subgroup_pkt_queue_max,
4102 no_bgp_default_subgroup_pkt_queue_max_cmd,
4103 "no bgp default subgroup-pkt-queue-max [(20-100)]",
4104 NO_STR
e9273987 4105 BGP_STR
1ca2fd11
IR
4106 "Configure BGP defaults\n"
4107 "subgroup-pkt-queue-max\n"
4108 "Configure subgroup packet queue max\n")
ff8a8a7a 4109{
1ca2fd11
IR
4110 VTY_DECLVAR_CONTEXT(bgp, bgp);
4111 bgp_default_subgroup_pkt_queue_max_unset(bgp);
4112 return CMD_SUCCESS;
ff8a8a7a 4113}
813d4307 4114
8bd9d948 4115
1ca2fd11
IR
4116DEFUN (bgp_rr_allow_outbound_policy,
4117 bgp_rr_allow_outbound_policy_cmd,
4118 "bgp route-reflector allow-outbound-policy",
e9273987 4119 BGP_STR
1ca2fd11
IR
4120 "Allow modifications made by out route-map\n"
4121 "on ibgp neighbors\n")
ff8a8a7a 4122{
1ca2fd11 4123 VTY_DECLVAR_CONTEXT(bgp, bgp);
ff8a8a7a 4124
1ca2fd11
IR
4125 if (!CHECK_FLAG(bgp->flags, BGP_FLAG_RR_ALLOW_OUTBOUND_POLICY)) {
4126 SET_FLAG(bgp->flags, BGP_FLAG_RR_ALLOW_OUTBOUND_POLICY);
4127 update_group_announce_rrclients(bgp);
4128 bgp_clear_star_soft_out(vty, bgp->name);
4129 }
8bd9d948 4130
1ca2fd11
IR
4131 return CMD_SUCCESS;
4132}
ff8a8a7a 4133
1ca2fd11
IR
4134DEFUN (no_bgp_rr_allow_outbound_policy,
4135 no_bgp_rr_allow_outbound_policy_cmd,
4136 "no bgp route-reflector allow-outbound-policy",
4137 NO_STR
e9273987 4138 BGP_STR
1ca2fd11
IR
4139 "Allow modifications made by out route-map\n"
4140 "on ibgp neighbors\n")
8bd9d948 4141{
1ca2fd11 4142 VTY_DECLVAR_CONTEXT(bgp, bgp);
8bd9d948 4143
1ca2fd11
IR
4144 if (CHECK_FLAG(bgp->flags, BGP_FLAG_RR_ALLOW_OUTBOUND_POLICY)) {
4145 UNSET_FLAG(bgp->flags, BGP_FLAG_RR_ALLOW_OUTBOUND_POLICY);
4146 update_group_announce_rrclients(bgp);
4147 bgp_clear_star_soft_out(vty, bgp->name);
d62a17ae 4148 }
8bd9d948 4149
1ca2fd11 4150 return CMD_SUCCESS;
8bd9d948
DS
4151}
4152
1ca2fd11
IR
4153DEFUN (bgp_listen_limit,
4154 bgp_listen_limit_cmd,
4155 "bgp listen limit (1-65535)",
e9273987 4156 BGP_STR
1ca2fd11
IR
4157 "BGP Dynamic Neighbors listen commands\n"
4158 "Maximum number of BGP Dynamic Neighbors that can be created\n"
4159 "Configure Dynamic Neighbors listen limit value\n")
f14e6fdb 4160{
1ca2fd11 4161 VTY_DECLVAR_CONTEXT(bgp, bgp);
d62a17ae 4162 int idx_number = 3;
1ca2fd11
IR
4163 int listen_limit;
4164
4165 listen_limit = strtoul(argv[idx_number]->arg, NULL, 10);
f14e6fdb 4166
1ca2fd11 4167 bgp_listen_limit_set(bgp, listen_limit);
f14e6fdb 4168
1ca2fd11 4169 return CMD_SUCCESS;
f14e6fdb
DS
4170}
4171
1ca2fd11
IR
4172DEFUN (no_bgp_listen_limit,
4173 no_bgp_listen_limit_cmd,
4174 "no bgp listen limit [(1-65535)]",
4175 NO_STR
e9273987 4176 BGP_STR
1ca2fd11
IR
4177 "BGP Dynamic Neighbors listen commands\n"
4178 "Maximum number of BGP Dynamic Neighbors that can be created\n"
4179 "Configure Dynamic Neighbors listen limit value\n")
f14e6fdb 4180{
1ca2fd11
IR
4181 VTY_DECLVAR_CONTEXT(bgp, bgp);
4182 bgp_listen_limit_unset(bgp);
4183 return CMD_SUCCESS;
f14e6fdb
DS
4184}
4185
4186
20eb8864 4187/*
4188 * Check if this listen range is already configured. Check for exact
4189 * match or overlap based on input.
4190 */
d62a17ae 4191static struct peer_group *listen_range_exists(struct bgp *bgp,
4192 struct prefix *range, int exact)
4193{
4194 struct listnode *node, *nnode;
4195 struct listnode *node1, *nnode1;
4196 struct peer_group *group;
4197 struct prefix *lr;
4198 afi_t afi;
4199 int match;
4200
4201 afi = family2afi(range->family);
4202 for (ALL_LIST_ELEMENTS(bgp->group, node, nnode, group)) {
4203 for (ALL_LIST_ELEMENTS(group->listen_range[afi], node1, nnode1,
4204 lr)) {
4205 if (exact)
4206 match = prefix_same(range, lr);
4207 else
4208 match = (prefix_match(range, lr)
4209 || prefix_match(lr, range));
4210 if (match)
4211 return group;
4212 }
4213 }
4214
4215 return NULL;
20eb8864 4216}
4217
f14e6fdb
DS
4218DEFUN (bgp_listen_range,
4219 bgp_listen_range_cmd,
d7b9898c 4220 "bgp listen range <A.B.C.D/M|X:X::X:X/M> peer-group PGNAME",
e9273987 4221 BGP_STR
d7fa34c1
QY
4222 "Configure BGP dynamic neighbors listen range\n"
4223 "Configure BGP dynamic neighbors listen range\n"
16cedbb0
QY
4224 NEIGHBOR_ADDR_STR
4225 "Member of the peer-group\n"
4226 "Peer-group name\n")
f14e6fdb 4227{
d62a17ae 4228 VTY_DECLVAR_CONTEXT(bgp, bgp);
4229 struct prefix range;
4230 struct peer_group *group, *existing_group;
4231 afi_t afi;
4232 int ret;
4233 int idx = 0;
4234
4235 argv_find(argv, argc, "A.B.C.D/M", &idx);
4236 argv_find(argv, argc, "X:X::X:X/M", &idx);
4237 char *prefix = argv[idx]->arg;
d7b9898c 4238 argv_find(argv, argc, "PGNAME", &idx);
d62a17ae 4239 char *peergroup = argv[idx]->arg;
4240
4241 /* Convert IP prefix string to struct prefix. */
4242 ret = str2prefix(prefix, &range);
4243 if (!ret) {
4244 vty_out(vty, "%% Malformed listen range\n");
4245 return CMD_WARNING_CONFIG_FAILED;
4246 }
4247
4248 afi = family2afi(range.family);
4249
4250 if (afi == AFI_IP6 && IN6_IS_ADDR_LINKLOCAL(&range.u.prefix6)) {
4251 vty_out(vty,
4252 "%% Malformed listen range (link-local address)\n");
4253 return CMD_WARNING_CONFIG_FAILED;
4254 }
4255
4256 apply_mask(&range);
4257
4258 /* Check if same listen range is already configured. */
4259 existing_group = listen_range_exists(bgp, &range, 1);
4260 if (existing_group) {
4261 if (strcmp(existing_group->name, peergroup) == 0)
4262 return CMD_SUCCESS;
4263 else {
4264 vty_out(vty,
4265 "%% Same listen range is attached to peer-group %s\n",
4266 existing_group->name);
4267 return CMD_WARNING_CONFIG_FAILED;
4268 }
4269 }
4270
4271 /* Check if an overlapping listen range exists. */
4272 if (listen_range_exists(bgp, &range, 0)) {
4273 vty_out(vty,
4274 "%% Listen range overlaps with existing listen range\n");
4275 return CMD_WARNING_CONFIG_FAILED;
4276 }
4277
4278 group = peer_group_lookup(bgp, peergroup);
4279 if (!group) {
4280 vty_out(vty, "%% Configure the peer-group first\n");
4281 return CMD_WARNING_CONFIG_FAILED;
4282 }
4283
4284 ret = peer_group_listen_range_add(group, &range);
4285 return bgp_vty_return(vty, ret);
f14e6fdb
DS
4286}
4287
4288DEFUN (no_bgp_listen_range,
4289 no_bgp_listen_range_cmd,
d7b9898c 4290 "no bgp listen range <A.B.C.D/M|X:X::X:X/M> peer-group PGNAME",
d7fa34c1 4291 NO_STR
e9273987 4292 BGP_STR
d7fa34c1
QY
4293 "Unconfigure BGP dynamic neighbors listen range\n"
4294 "Unconfigure BGP dynamic neighbors listen range\n"
4295 NEIGHBOR_ADDR_STR
4296 "Member of the peer-group\n"
4297 "Peer-group name\n")
f14e6fdb 4298{
d62a17ae 4299 VTY_DECLVAR_CONTEXT(bgp, bgp);
4300 struct prefix range;
4301 struct peer_group *group;
4302 afi_t afi;
4303 int ret;
4304 int idx = 0;
4305
4306 argv_find(argv, argc, "A.B.C.D/M", &idx);
4307 argv_find(argv, argc, "X:X::X:X/M", &idx);
4308 char *prefix = argv[idx]->arg;
21d88a71 4309 argv_find(argv, argc, "PGNAME", &idx);
d62a17ae 4310 char *peergroup = argv[idx]->arg;
4311
4312 /* Convert IP prefix string to struct prefix. */
4313 ret = str2prefix(prefix, &range);
4314 if (!ret) {
4315 vty_out(vty, "%% Malformed listen range\n");
4316 return CMD_WARNING_CONFIG_FAILED;
4317 }
4318
4319 afi = family2afi(range.family);
4320
4321 if (afi == AFI_IP6 && IN6_IS_ADDR_LINKLOCAL(&range.u.prefix6)) {
4322 vty_out(vty,
4323 "%% Malformed listen range (link-local address)\n");
4324 return CMD_WARNING_CONFIG_FAILED;
4325 }
4326
4327 apply_mask(&range);
4328
4329 group = peer_group_lookup(bgp, peergroup);
4330 if (!group) {
4331 vty_out(vty, "%% Peer-group does not exist\n");
4332 return CMD_WARNING_CONFIG_FAILED;
4333 }
4334
4335 ret = peer_group_listen_range_del(group, &range);
4336 return bgp_vty_return(vty, ret);
4337}
4338
2b791107 4339void bgp_config_write_listen(struct vty *vty, struct bgp *bgp)
d62a17ae 4340{
4341 struct peer_group *group;
4342 struct listnode *node, *nnode, *rnode, *nrnode;
4343 struct prefix *range;
4344 afi_t afi;
d62a17ae 4345
4346 if (bgp->dynamic_neighbors_limit != BGP_DYNAMIC_NEIGHBORS_LIMIT_DEFAULT)
4347 vty_out(vty, " bgp listen limit %d\n",
4348 bgp->dynamic_neighbors_limit);
4349
4350 for (ALL_LIST_ELEMENTS(bgp->group, node, nnode, group)) {
4351 for (afi = AFI_IP; afi < AFI_MAX; afi++) {
4352 for (ALL_LIST_ELEMENTS(group->listen_range[afi], rnode,
4353 nrnode, range)) {
d62a17ae 4354 vty_out(vty,
2dbe669b
DA
4355 " bgp listen range %pFX peer-group %s\n",
4356 range, group->name);
d62a17ae 4357 }
4358 }
4359 }
f14e6fdb
DS
4360}
4361
4362
1ca2fd11
IR
4363DEFUN (bgp_disable_connected_route_check,
4364 bgp_disable_connected_route_check_cmd,
4365 "bgp disable-ebgp-connected-route-check",
e9273987 4366 BGP_STR
1ca2fd11 4367 "Disable checking if nexthop is connected on ebgp sessions\n")
907f92c8 4368{
1ca2fd11
IR
4369 VTY_DECLVAR_CONTEXT(bgp, bgp);
4370 SET_FLAG(bgp->flags, BGP_FLAG_DISABLE_NH_CONNECTED_CHK);
4371 bgp_clear_star_soft_in(vty, bgp->name);
7aafcaca 4372
1ca2fd11 4373 return CMD_SUCCESS;
907f92c8
DS
4374}
4375
1ca2fd11
IR
4376DEFUN (no_bgp_disable_connected_route_check,
4377 no_bgp_disable_connected_route_check_cmd,
4378 "no bgp disable-ebgp-connected-route-check",
4379 NO_STR
e9273987 4380 BGP_STR
1ca2fd11 4381 "Disable checking if nexthop is connected on ebgp sessions\n")
907f92c8 4382{
1ca2fd11
IR
4383 VTY_DECLVAR_CONTEXT(bgp, bgp);
4384 UNSET_FLAG(bgp->flags, BGP_FLAG_DISABLE_NH_CONNECTED_CHK);
4385 bgp_clear_star_soft_in(vty, bgp->name);
d62a17ae 4386
1ca2fd11 4387 return CMD_SUCCESS;
d62a17ae 4388}
4389
4390
28c6e247
IR
4391static int peer_remote_as_vty(struct vty *vty, const char *peer_str,
4392 const char *as_str)
4393{
4394 VTY_DECLVAR_CONTEXT(bgp, bgp);
4395 int ret;
4396 as_t as;
4397 int as_type = AS_SPECIFIED;
4398 union sockunion su;
4399
4400 if (as_str[0] == 'i') {
4401 as = 0;
4402 as_type = AS_INTERNAL;
4403 } else if (as_str[0] == 'e') {
4404 as = 0;
4405 as_type = AS_EXTERNAL;
4406 } else {
4407 /* Get AS number. */
4408 as = strtoul(as_str, NULL, 10);
4409 }
4410
4411 /* If peer is peer group or interface peer, call proper function. */
4412 ret = str2sockunion(peer_str, &su);
4413 if (ret < 0) {
4414 struct peer *peer;
4415
4416 /* Check if existing interface peer */
4417 peer = peer_lookup_by_conf_if(bgp, peer_str);
4418
4419 ret = peer_remote_as(bgp, NULL, peer_str, &as, as_type);
4420
4421 /* if not interface peer, check peer-group settings */
4422 if (ret < 0 && !peer) {
4423 ret = peer_group_remote_as(bgp, peer_str, &as, as_type);
4424 if (ret < 0) {
4425 vty_out(vty,
4426 "%% Create the peer-group or interface first\n");
4427 return CMD_WARNING_CONFIG_FAILED;
4428 }
4429 return CMD_SUCCESS;
4430 }
4431 } else {
4432 if (peer_address_self_check(bgp, &su)) {
4433 vty_out(vty,
4434 "%% Can not configure the local system as neighbor\n");
4435 return CMD_WARNING_CONFIG_FAILED;
4436 }
4437 ret = peer_remote_as(bgp, &su, NULL, &as, as_type);
4438 }
4439
28c6e247
IR
4440 return bgp_vty_return(vty, ret);
4441}
4442
1ca2fd11
IR
4443DEFUN (bgp_default_shutdown,
4444 bgp_default_shutdown_cmd,
4445 "[no] bgp default shutdown",
4446 NO_STR
4447 BGP_STR
4448 "Configure BGP defaults\n"
4449 "Apply administrative shutdown to newly configured peers\n")
ff8a8a7a 4450{
1ca2fd11
IR
4451 VTY_DECLVAR_CONTEXT(bgp, bgp);
4452 bgp->autoshutdown = !strmatch(argv[0]->text, "no");
4453 return CMD_SUCCESS;
f26845f9
QY
4454}
4455
736b68f3
DS
4456DEFPY(bgp_shutdown_msg, bgp_shutdown_msg_cmd, "bgp shutdown message MSG...",
4457 BGP_STR
9ddf4b81 4458 "Administrative shutdown of the BGP instance\n"
736b68f3
DS
4459 "Add a shutdown message (RFC 8203)\n"
4460 "Shutdown message\n")
9cf59432 4461{
736b68f3 4462 char *msgstr = NULL;
8389c83a 4463
9cf59432
DS
4464 VTY_DECLVAR_CONTEXT(bgp, bgp);
4465
8389c83a 4466 if (argc > 3)
f80e35b6 4467 msgstr = argv_concat(argv, argc, 3);
8389c83a 4468
b776f48c
DA
4469 if (msgstr && strlen(msgstr) > BGP_ADMIN_SHUTDOWN_MSG_LEN) {
4470 vty_out(vty, "%% Shutdown message size exceeded %d\n",
4471 BGP_ADMIN_SHUTDOWN_MSG_LEN);
4472 return CMD_WARNING_CONFIG_FAILED;
4473 }
4474
8389c83a
DS
4475 bgp_shutdown_enable(bgp, msgstr);
4476 XFREE(MTYPE_TMP, msgstr);
9cf59432
DS
4477
4478 return CMD_SUCCESS;
4479}
4480
736b68f3 4481DEFPY(bgp_shutdown, bgp_shutdown_cmd, "bgp shutdown",
9ddf4b81 4482 BGP_STR "Administrative shutdown of the BGP instance\n")
1e12ebbc
DS
4483{
4484 VTY_DECLVAR_CONTEXT(bgp, bgp);
4485
4486 bgp_shutdown_enable(bgp, NULL);
4487
4488 return CMD_SUCCESS;
4489}
8389c83a 4490
736b68f3 4491DEFPY(no_bgp_shutdown, no_bgp_shutdown_cmd, "no bgp shutdown",
9ddf4b81 4492 NO_STR BGP_STR "Administrative shutdown of the BGP instance\n")
9cf59432
DS
4493{
4494 VTY_DECLVAR_CONTEXT(bgp, bgp);
4495
4496 bgp_shutdown_disable(bgp);
4497
4498 return CMD_SUCCESS;
4499}
4500
9ddf4b81 4501ALIAS(no_bgp_shutdown, no_bgp_shutdown_msg_cmd,
1b6e7a88 4502 "no bgp shutdown message MSG...", NO_STR BGP_STR
9ddf4b81 4503 "Administrative shutdown of the BGP instance\n"
1b6e7a88 4504 "Add a shutdown message (RFC 8203)\n" "Shutdown message\n")
1b6e7a88 4505
28c6e247
IR
4506DEFUN (neighbor_remote_as,
4507 neighbor_remote_as_cmd,
4508 "neighbor <A.B.C.D|X:X::X:X|WORD> remote-as <(1-4294967295)|internal|external>",
4509 NEIGHBOR_STR
4510 NEIGHBOR_ADDR_STR2
4511 "Specify a BGP neighbor\n"
4512 AS_STR
4513 "Internal BGP peer\n"
4514 "External BGP peer\n")
718e3744 4515{
d62a17ae 4516 int idx_peer = 1;
4517 int idx_remote_as = 3;
28c6e247
IR
4518 return peer_remote_as_vty(vty, argv[idx_peer]->arg,
4519 argv[idx_remote_as]->arg);
d62a17ae 4520}
8666265e
DS
4521
4522DEFPY (bgp_allow_martian,
4523 bgp_allow_martian_cmd,
4524 "[no]$no bgp allow-martian-nexthop",
4525 NO_STR
4526 BGP_STR
4527 "Allow Martian nexthops to be received in the NLRI from a peer\n")
4528{
4529 VTY_DECLVAR_CONTEXT(bgp, bgp);
4530
4531 if (no)
4532 bgp->allow_martian = false;
4533 else
4534 bgp->allow_martian = true;
4535
4536 return CMD_SUCCESS;
4537}
4538
f852eb98
PG
4539/* Enable fast convergence of bgp sessions. If this is enabled, bgp
4540 * sessions do not wait for hold timer expiry to bring down the sessions
4541 * when nexthop becomes unreachable
4542 */
4543DEFUN(bgp_fast_convergence, bgp_fast_convergence_cmd, "bgp fast-convergence",
4544 BGP_STR "Fast convergence for bgp sessions\n")
4545{
4546 VTY_DECLVAR_CONTEXT(bgp, bgp);
4547 bgp->fast_convergence = true;
4548
4549 return CMD_SUCCESS;
4550}
4551
4552DEFUN(no_bgp_fast_convergence, no_bgp_fast_convergence_cmd,
4553 "no bgp fast-convergence",
4554 NO_STR BGP_STR "Fast convergence for bgp sessions\n")
4555{
4556 VTY_DECLVAR_CONTEXT(bgp, bgp);
4557 bgp->fast_convergence = false;
4558
4559 return CMD_SUCCESS;
4560}
d62a17ae 4561
28c6e247
IR
4562static int peer_conf_interface_get(struct vty *vty, const char *conf_if,
4563 int v6only,
4564 const char *peer_group_name,
4565 const char *as_str)
d62a17ae 4566{
28c6e247
IR
4567 VTY_DECLVAR_CONTEXT(bgp, bgp);
4568 as_t as = 0;
4569 int as_type = AS_UNSPECIFIED;
d62a17ae 4570 struct peer *peer;
4571 struct peer_group *group;
4572 int ret = 0;
d62a17ae 4573
4574 group = peer_group_lookup(bgp, conf_if);
4575
4576 if (group) {
28c6e247
IR
4577 vty_out(vty, "%% Name conflict with peer-group \n");
4578 return CMD_WARNING_CONFIG_FAILED;
4579 }
4580
4581 if (as_str) {
4582 if (as_str[0] == 'i') {
4583 as_type = AS_INTERNAL;
4584 } else if (as_str[0] == 'e') {
4585 as_type = AS_EXTERNAL;
4586 } else {
4587 /* Get AS number. */
4588 as = strtoul(as_str, NULL, 10);
4589 as_type = AS_SPECIFIED;
4590 }
d62a17ae 4591 }
4592
4593 peer = peer_lookup_by_conf_if(bgp, conf_if);
4594 if (peer) {
28c6e247 4595 if (as_str)
e84c59af 4596 ret = peer_remote_as(bgp, NULL, conf_if, &as, as_type);
d62a17ae 4597 } else {
e84c59af
DA
4598 peer = peer_create(NULL, conf_if, bgp, bgp->as, as, as_type,
4599 NULL);
d62a17ae 4600
4601 if (!peer) {
28c6e247
IR
4602 vty_out(vty, "%% BGP failed to create peer\n");
4603 return CMD_WARNING_CONFIG_FAILED;
d62a17ae 4604 }
4605
4606 if (v6only)
527de3dc 4607 peer_flag_set(peer, PEER_FLAG_IFPEER_V6ONLY);
d62a17ae 4608
4609 /* Request zebra to initiate IPv6 RAs on this interface. We do
4610 * this
4611 * any unnumbered peer in order to not worry about run-time
4612 * transitions
4613 * (e.g., peering is initially IPv4, but the IPv4 /30 or /31
4614 * address
4615 * gets deleted later etc.)
4616 */
4617 if (peer->ifp)
4618 bgp_zebra_initiate_radv(bgp, peer);
4619 }
4620
4621 if ((v6only && !CHECK_FLAG(peer->flags, PEER_FLAG_IFPEER_V6ONLY))
4622 || (!v6only && CHECK_FLAG(peer->flags, PEER_FLAG_IFPEER_V6ONLY))) {
4623 if (v6only)
527de3dc 4624 peer_flag_set(peer, PEER_FLAG_IFPEER_V6ONLY);
d62a17ae 4625 else
527de3dc 4626 peer_flag_unset(peer, PEER_FLAG_IFPEER_V6ONLY);
d62a17ae 4627
4628 /* v6only flag changed. Reset bgp seesion */
4629 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->status)) {
4630 peer->last_reset = PEER_DOWN_V6ONLY_CHANGE;
4631 bgp_notify_send(peer, BGP_NOTIFY_CEASE,
4632 BGP_NOTIFY_CEASE_CONFIG_CHANGE);
4633 } else
4634 bgp_session_reset(peer);
4635 }
4636
9fb964de
PM
4637 if (!CHECK_FLAG(peer->flags_invert, PEER_FLAG_CAPABILITY_ENHE)) {
4638 SET_FLAG(peer->flags, PEER_FLAG_CAPABILITY_ENHE);
4639 SET_FLAG(peer->flags_invert, PEER_FLAG_CAPABILITY_ENHE);
dc2f50f3 4640 SET_FLAG(peer->flags_override, PEER_FLAG_CAPABILITY_ENHE);
9fb964de 4641 }
d62a17ae 4642
4643 if (peer_group_name) {
4644 group = peer_group_lookup(bgp, peer_group_name);
4645 if (!group) {
28c6e247
IR
4646 vty_out(vty, "%% Configure the peer-group first\n");
4647 return CMD_WARNING_CONFIG_FAILED;
d62a17ae 4648 }
4649
8395c1f8 4650 ret = peer_group_bind(bgp, NULL, peer, group, &as);
d62a17ae 4651 }
4652
28c6e247 4653 return bgp_vty_return(vty, ret);
a80beece
DS
4654}
4655
28c6e247
IR
4656DEFUN (neighbor_interface_config,
4657 neighbor_interface_config_cmd,
4658 "neighbor WORD interface [peer-group PGNAME]",
4659 NEIGHBOR_STR
4660 "Interface name or neighbor tag\n"
4661 "Enable BGP on interface\n"
4662 "Member of the peer-group\n"
4663 "Peer-group name\n")
4c48cf63 4664{
d62a17ae 4665 int idx_word = 1;
4666 int idx_peer_group_word = 4;
f4b8ec07 4667
d62a17ae 4668 if (argc > idx_peer_group_word)
28c6e247
IR
4669 return peer_conf_interface_get(
4670 vty, argv[idx_word]->arg, 0,
4671 argv[idx_peer_group_word]->arg, NULL);
4672 else
4673 return peer_conf_interface_get(vty, argv[idx_word]->arg, 0,
4674 NULL, NULL);
4c48cf63
DW
4675}
4676
28c6e247
IR
4677DEFUN (neighbor_interface_config_v6only,
4678 neighbor_interface_config_v6only_cmd,
4679 "neighbor WORD interface v6only [peer-group PGNAME]",
4680 NEIGHBOR_STR
4681 "Interface name or neighbor tag\n"
4682 "Enable BGP on interface\n"
4683 "Enable BGP with v6 link-local only\n"
4684 "Member of the peer-group\n"
4685 "Peer-group name\n")
4c48cf63 4686{
d62a17ae 4687 int idx_word = 1;
4688 int idx_peer_group_word = 5;
31500417 4689
d62a17ae 4690 if (argc > idx_peer_group_word)
28c6e247
IR
4691 return peer_conf_interface_get(
4692 vty, argv[idx_word]->arg, 1,
4693 argv[idx_peer_group_word]->arg, NULL);
31500417 4694
28c6e247 4695 return peer_conf_interface_get(vty, argv[idx_word]->arg, 1, NULL, NULL);
4c48cf63
DW
4696}
4697
a80beece 4698
28c6e247
IR
4699DEFUN (neighbor_interface_config_remote_as,
4700 neighbor_interface_config_remote_as_cmd,
4701 "neighbor WORD interface remote-as <(1-4294967295)|internal|external>",
4702 NEIGHBOR_STR
4703 "Interface name or neighbor tag\n"
4704 "Enable BGP on interface\n"
4705 "Specify a BGP neighbor\n"
4706 AS_STR
4707 "Internal BGP peer\n"
4708 "External BGP peer\n")
b3a39dc5 4709{
d62a17ae 4710 int idx_word = 1;
4711 int idx_remote_as = 4;
28c6e247
IR
4712 return peer_conf_interface_get(vty, argv[idx_word]->arg, 0, NULL,
4713 argv[idx_remote_as]->arg);
b3a39dc5
DD
4714}
4715
28c6e247
IR
4716DEFUN (neighbor_interface_v6only_config_remote_as,
4717 neighbor_interface_v6only_config_remote_as_cmd,
4718 "neighbor WORD interface v6only remote-as <(1-4294967295)|internal|external>",
4719 NEIGHBOR_STR
4720 "Interface name or neighbor tag\n"
4721 "Enable BGP with v6 link-local only\n"
4722 "Enable BGP on interface\n"
4723 "Specify a BGP neighbor\n"
4724 AS_STR
4725 "Internal BGP peer\n"
4726 "External BGP peer\n")
b3a39dc5 4727{
d62a17ae 4728 int idx_word = 1;
4729 int idx_remote_as = 5;
28c6e247
IR
4730 return peer_conf_interface_get(vty, argv[idx_word]->arg, 1, NULL,
4731 argv[idx_remote_as]->arg);
b3a39dc5
DD
4732}
4733
28c6e247
IR
4734DEFUN (neighbor_peer_group,
4735 neighbor_peer_group_cmd,
4736 "neighbor WORD peer-group",
4737 NEIGHBOR_STR
4738 "Interface name or neighbor tag\n"
4739 "Configure peer-group\n")
718e3744 4740{
28c6e247 4741 VTY_DECLVAR_CONTEXT(bgp, bgp);
d62a17ae 4742 int idx_word = 1;
28c6e247
IR
4743 struct peer *peer;
4744 struct peer_group *group;
718e3744 4745
28c6e247
IR
4746 peer = peer_lookup_by_conf_if(bgp, argv[idx_word]->arg);
4747 if (peer) {
4748 vty_out(vty, "%% Name conflict with interface: \n");
4749 return CMD_WARNING_CONFIG_FAILED;
4750 }
718e3744 4751
28c6e247
IR
4752 group = peer_group_get(bgp, argv[idx_word]->arg);
4753 if (!group) {
4754 vty_out(vty, "%% BGP failed to find or create peer-group\n");
4755 return CMD_WARNING_CONFIG_FAILED;
4756 }
718e3744 4757
28c6e247 4758 return CMD_SUCCESS;
718e3744 4759}
4760
1d80f243
IR
4761DEFUN (no_neighbor,
4762 no_neighbor_cmd,
4763 "no neighbor <WORD|<A.B.C.D|X:X::X:X> [remote-as <(1-4294967295)|internal|external>]>",
4764 NO_STR
4765 NEIGHBOR_STR
4766 NEIGHBOR_ADDR_STR2
4767 "Specify a BGP neighbor\n"
4768 AS_STR
4769 "Internal BGP peer\n"
4770 "External BGP peer\n")
718e3744 4771{
28c6e247 4772 VTY_DECLVAR_CONTEXT(bgp, bgp);
d62a17ae 4773 int idx_peer = 2;
28c6e247 4774 int ret;
d62a17ae 4775 union sockunion su;
28c6e247
IR
4776 struct peer_group *group;
4777 struct peer *peer;
4778 struct peer *other;
d62a17ae 4779
28c6e247
IR
4780 ret = str2sockunion(argv[idx_peer]->arg, &su);
4781 if (ret < 0) {
4782 /* look up for neighbor by interface name config. */
4783 peer = peer_lookup_by_conf_if(bgp, argv[idx_peer]->arg);
4784 if (peer) {
4785 /* Request zebra to terminate IPv6 RAs on this
4786 * interface. */
4787 if (peer->ifp)
4788 bgp_zebra_terminate_radv(peer->bgp, peer);
4789 peer_notify_unconfig(peer);
4790 peer_delete(peer);
4791 return CMD_SUCCESS;
d62a17ae 4792 }
28c6e247
IR
4793
4794 group = peer_group_lookup(bgp, argv[idx_peer]->arg);
4795 if (group) {
4796 peer_group_notify_unconfig(group);
4797 peer_group_delete(group);
4e2786df 4798 } else {
28c6e247 4799 vty_out(vty, "%% Create the peer-group first\n");
d62a17ae 4800 return CMD_WARNING_CONFIG_FAILED;
4801 }
28c6e247
IR
4802 } else {
4803 peer = peer_lookup(bgp, &su);
4804 if (peer) {
4805 if (peer_dynamic_neighbor(peer)) {
4806 vty_out(vty,
4807 "%% Operation not allowed on a dynamic neighbor\n");
4808 return CMD_WARNING_CONFIG_FAILED;
4809 }
d62a17ae 4810
28c6e247 4811 other = peer->doppelganger;
f4b8ec07 4812
28c6e247
IR
4813 if (CHECK_FLAG(peer->flags, PEER_FLAG_CAPABILITY_ENHE))
4814 bgp_zebra_terminate_radv(peer->bgp, peer);
f4b8ec07 4815
28c6e247
IR
4816 peer_notify_unconfig(peer);
4817 peer_delete(peer);
4818 if (other && other->status != Deleted) {
4819 peer_notify_unconfig(other);
4820 peer_delete(other);
4821 }
4822 }
4823 }
4824
4825 return CMD_SUCCESS;
a80beece
DS
4826}
4827
28c6e247
IR
4828DEFUN (no_neighbor_interface_config,
4829 no_neighbor_interface_config_cmd,
4830 "no neighbor WORD interface [v6only] [peer-group PGNAME] [remote-as <(1-4294967295)|internal|external>]",
4831 NO_STR
4832 NEIGHBOR_STR
4833 "Interface name\n"
4834 "Configure BGP on interface\n"
4835 "Enable BGP with v6 link-local only\n"
4836 "Member of the peer-group\n"
4837 "Peer-group name\n"
4838 "Specify a BGP neighbor\n"
4839 AS_STR
4840 "Internal BGP peer\n"
4841 "External BGP peer\n")
718e3744 4842{
28c6e247 4843 VTY_DECLVAR_CONTEXT(bgp, bgp);
d62a17ae 4844 int idx_word = 2;
28c6e247 4845 struct peer *peer;
718e3744 4846
28c6e247
IR
4847 /* look up for neighbor by interface name config. */
4848 peer = peer_lookup_by_conf_if(bgp, argv[idx_word]->arg);
4849 if (peer) {
4850 /* Request zebra to terminate IPv6 RAs on this interface. */
4851 if (peer->ifp)
4852 bgp_zebra_terminate_radv(peer->bgp, peer);
4853 peer_notify_unconfig(peer);
4854 peer_delete(peer);
4855 } else {
4856 vty_out(vty, "%% Create the bgp interface first\n");
4857 return CMD_WARNING_CONFIG_FAILED;
4858 }
4859 return CMD_SUCCESS;
718e3744 4860}
4861
28c6e247
IR
4862DEFUN (no_neighbor_peer_group,
4863 no_neighbor_peer_group_cmd,
4864 "no neighbor WORD peer-group",
4865 NO_STR
4866 NEIGHBOR_STR
4867 "Neighbor tag\n"
4868 "Configure peer-group\n")
718e3744 4869{
28c6e247
IR
4870 VTY_DECLVAR_CONTEXT(bgp, bgp);
4871 int idx_word = 2;
4872 struct peer_group *group;
f4b8ec07 4873
28c6e247
IR
4874 group = peer_group_lookup(bgp, argv[idx_word]->arg);
4875 if (group) {
4876 peer_group_notify_unconfig(group);
4877 peer_group_delete(group);
f4b8ec07 4878 } else {
28c6e247 4879 vty_out(vty, "%% Create the peer-group first\n");
d62a17ae 4880 return CMD_WARNING_CONFIG_FAILED;
4881 }
28c6e247
IR
4882 return CMD_SUCCESS;
4883}
f4b8ec07 4884
28c6e247
IR
4885DEFUN (no_neighbor_interface_peer_group_remote_as,
4886 no_neighbor_interface_peer_group_remote_as_cmd,
4887 "no neighbor WORD remote-as <(1-4294967295)|internal|external>",
4888 NO_STR
4889 NEIGHBOR_STR
4890 "Interface name or neighbor tag\n"
4891 "Specify a BGP neighbor\n"
4892 AS_STR
4893 "Internal BGP peer\n"
4894 "External BGP peer\n")
4895{
4896 VTY_DECLVAR_CONTEXT(bgp, bgp);
4897 int idx_word = 2;
4898 struct peer_group *group;
4899 struct peer *peer;
f4b8ec07 4900
28c6e247
IR
4901 /* look up for neighbor by interface name config. */
4902 peer = peer_lookup_by_conf_if(bgp, argv[idx_word]->arg);
4903 if (peer) {
4904 peer_as_change(peer, 0, AS_UNSPECIFIED);
4905 return CMD_SUCCESS;
4906 }
f4b8ec07 4907
28c6e247
IR
4908 group = peer_group_lookup(bgp, argv[idx_word]->arg);
4909 if (group)
4910 peer_group_remote_as_delete(group);
4911 else {
4912 vty_out(vty, "%% Create the peer-group or interface first\n");
4913 return CMD_WARNING_CONFIG_FAILED;
4914 }
4915 return CMD_SUCCESS;
718e3744 4916}
6b0655a2 4917
28c6e247
IR
4918DEFUN (neighbor_local_as,
4919 neighbor_local_as_cmd,
4920 "neighbor <A.B.C.D|X:X::X:X|WORD> local-as (1-4294967295)",
4921 NEIGHBOR_STR
4922 NEIGHBOR_ADDR_STR2
4923 "Specify a local-as number\n"
4924 "AS number used as local AS\n")
718e3744 4925{
d62a17ae 4926 int idx_peer = 1;
4927 int idx_number = 3;
28c6e247
IR
4928 struct peer *peer;
4929 int ret;
4930 as_t as;
718e3744 4931
28c6e247
IR
4932 peer = peer_and_group_lookup_vty(vty, argv[idx_peer]->arg);
4933 if (!peer)
d62a17ae 4934 return CMD_WARNING_CONFIG_FAILED;
718e3744 4935
28c6e247
IR
4936 as = strtoul(argv[idx_number]->arg, NULL, 10);
4937 ret = peer_local_as_set(peer, as, 0, 0);
4938 return bgp_vty_return(vty, ret);
718e3744 4939}
4940
28c6e247
IR
4941DEFUN (neighbor_local_as_no_prepend,
4942 neighbor_local_as_no_prepend_cmd,
4943 "neighbor <A.B.C.D|X:X::X:X|WORD> local-as (1-4294967295) no-prepend",
4944 NEIGHBOR_STR
4945 NEIGHBOR_ADDR_STR2
4946 "Specify a local-as number\n"
4947 "AS number used as local AS\n"
4948 "Do not prepend local-as to updates from ebgp peers\n")
718e3744 4949{
d62a17ae 4950 int idx_peer = 1;
4951 int idx_number = 3;
28c6e247
IR
4952 struct peer *peer;
4953 int ret;
4954 as_t as;
718e3744 4955
28c6e247
IR
4956 peer = peer_and_group_lookup_vty(vty, argv[idx_peer]->arg);
4957 if (!peer)
d62a17ae 4958 return CMD_WARNING_CONFIG_FAILED;
718e3744 4959
28c6e247
IR
4960 as = strtoul(argv[idx_number]->arg, NULL, 10);
4961 ret = peer_local_as_set(peer, as, 1, 0);
4962 return bgp_vty_return(vty, ret);
718e3744 4963}
4964
28c6e247
IR
4965DEFUN (neighbor_local_as_no_prepend_replace_as,
4966 neighbor_local_as_no_prepend_replace_as_cmd,
4967 "neighbor <A.B.C.D|X:X::X:X|WORD> local-as (1-4294967295) no-prepend replace-as",
4968 NEIGHBOR_STR
4969 NEIGHBOR_ADDR_STR2
4970 "Specify a local-as number\n"
4971 "AS number used as local AS\n"
4972 "Do not prepend local-as to updates from ebgp peers\n"
4973 "Do not prepend local-as to updates from ibgp peers\n")
9d3f9705 4974{
d62a17ae 4975 int idx_peer = 1;
4976 int idx_number = 3;
28c6e247
IR
4977 struct peer *peer;
4978 int ret;
4979 as_t as;
9d3f9705 4980
28c6e247
IR
4981 peer = peer_and_group_lookup_vty(vty, argv[idx_peer]->arg);
4982 if (!peer)
d62a17ae 4983 return CMD_WARNING_CONFIG_FAILED;
9d3f9705 4984
28c6e247
IR
4985 as = strtoul(argv[idx_number]->arg, NULL, 10);
4986 ret = peer_local_as_set(peer, as, 1, 1);
4987 return bgp_vty_return(vty, ret);
9d3f9705
AC
4988}
4989
28c6e247
IR
4990DEFUN (no_neighbor_local_as,
4991 no_neighbor_local_as_cmd,
4992 "no neighbor <A.B.C.D|X:X::X:X|WORD> local-as [(1-4294967295) [no-prepend [replace-as]]]",
4993 NO_STR
4994 NEIGHBOR_STR
4995 NEIGHBOR_ADDR_STR2
4996 "Specify a local-as number\n"
4997 "AS number used as local AS\n"
4998 "Do not prepend local-as to updates from ebgp peers\n"
4999 "Do not prepend local-as to updates from ibgp peers\n")
718e3744 5000{
d62a17ae 5001 int idx_peer = 2;
28c6e247
IR
5002 struct peer *peer;
5003 int ret;
718e3744 5004
28c6e247
IR
5005 peer = peer_and_group_lookup_vty(vty, argv[idx_peer]->arg);
5006 if (!peer)
d62a17ae 5007 return CMD_WARNING_CONFIG_FAILED;
718e3744 5008
28c6e247
IR
5009 ret = peer_local_as_unset(peer);
5010 return bgp_vty_return(vty, ret);
718e3744 5011}
5012
718e3744 5013
3f9c7369
DS
5014DEFUN (neighbor_solo,
5015 neighbor_solo_cmd,
9ccf14f7 5016 "neighbor <A.B.C.D|X:X::X:X|WORD> solo",
3f9c7369
DS
5017 NEIGHBOR_STR
5018 NEIGHBOR_ADDR_STR2
5019 "Solo peer - part of its own update group\n")
5020{
d62a17ae 5021 int idx_peer = 1;
5022 struct peer *peer;
5023 int ret;
3f9c7369 5024
d62a17ae 5025 peer = peer_and_group_lookup_vty(vty, argv[idx_peer]->arg);
5026 if (!peer)
5027 return CMD_WARNING_CONFIG_FAILED;
3f9c7369 5028
d62a17ae 5029 ret = update_group_adjust_soloness(peer, 1);
5030 return bgp_vty_return(vty, ret);
3f9c7369
DS
5031}
5032
5033DEFUN (no_neighbor_solo,
5034 no_neighbor_solo_cmd,
9ccf14f7 5035 "no neighbor <A.B.C.D|X:X::X:X|WORD> solo",
3f9c7369
DS
5036 NO_STR
5037 NEIGHBOR_STR
5038 NEIGHBOR_ADDR_STR2
5039 "Solo peer - part of its own update group\n")
5040{
d62a17ae 5041 int idx_peer = 2;
5042 struct peer *peer;
5043 int ret;
3f9c7369 5044
d62a17ae 5045 peer = peer_and_group_lookup_vty(vty, argv[idx_peer]->arg);
5046 if (!peer)
5047 return CMD_WARNING_CONFIG_FAILED;
3f9c7369 5048
d62a17ae 5049 ret = update_group_adjust_soloness(peer, 0);
5050 return bgp_vty_return(vty, ret);
3f9c7369
DS
5051}
5052
28c6e247
IR
5053DEFUN (neighbor_password,
5054 neighbor_password_cmd,
5055 "neighbor <A.B.C.D|X:X::X:X|WORD> password LINE",
5056 NEIGHBOR_STR
5057 NEIGHBOR_ADDR_STR2
5058 "Set a password\n"
5059 "The password\n")
0df7c91f 5060{
d62a17ae 5061 int idx_peer = 1;
5062 int idx_line = 3;
28c6e247
IR
5063 struct peer *peer;
5064 int ret;
0df7c91f 5065
28c6e247
IR
5066 peer = peer_and_group_lookup_vty(vty, argv[idx_peer]->arg);
5067 if (!peer)
d62a17ae 5068 return CMD_WARNING_CONFIG_FAILED;
0df7c91f 5069
28c6e247
IR
5070 ret = peer_password_set(peer, argv[idx_line]->arg);
5071 return bgp_vty_return(vty, ret);
0df7c91f
PJ
5072}
5073
28c6e247
IR
5074DEFUN (no_neighbor_password,
5075 no_neighbor_password_cmd,
5076 "no neighbor <A.B.C.D|X:X::X:X|WORD> password [LINE]",
5077 NO_STR
5078 NEIGHBOR_STR
5079 NEIGHBOR_ADDR_STR2
5080 "Set a password\n"
5081 "The password\n")
0df7c91f 5082{
d62a17ae 5083 int idx_peer = 2;
28c6e247
IR
5084 struct peer *peer;
5085 int ret;
0df7c91f 5086
28c6e247
IR
5087 peer = peer_and_group_lookup_vty(vty, argv[idx_peer]->arg);
5088 if (!peer)
d62a17ae 5089 return CMD_WARNING_CONFIG_FAILED;
0df7c91f 5090
28c6e247
IR
5091 ret = peer_password_unset(peer);
5092 return bgp_vty_return(vty, ret);
0df7c91f 5093}
6b0655a2 5094
28c6e247
IR
5095DEFUN (neighbor_activate,
5096 neighbor_activate_cmd,
5097 "neighbor <A.B.C.D|X:X::X:X|WORD> activate",
5098 NEIGHBOR_STR
5099 NEIGHBOR_ADDR_STR2
5100 "Enable the Address Family for this Neighbor\n")
718e3744 5101{
d62a17ae 5102 int idx_peer = 1;
28c6e247
IR
5103 int ret;
5104 struct peer *peer;
56ceae84 5105
28c6e247
IR
5106 peer = peer_and_group_lookup_vty(vty, argv[idx_peer]->arg);
5107 if (!peer)
d62a17ae 5108 return CMD_WARNING_CONFIG_FAILED;
718e3744 5109
28c6e247
IR
5110 ret = peer_activate(peer, bgp_node_afi(vty), bgp_node_safi(vty));
5111 return bgp_vty_return(vty, ret);
718e3744 5112}
5113
d62a17ae 5114ALIAS_HIDDEN(neighbor_activate, neighbor_activate_hidden_cmd,
5115 "neighbor <A.B.C.D|X:X::X:X|WORD> activate",
5116 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5117 "Enable the Address Family for this Neighbor\n")
596c17ba 5118
28c6e247
IR
5119DEFUN (no_neighbor_activate,
5120 no_neighbor_activate_cmd,
5121 "no neighbor <A.B.C.D|X:X::X:X|WORD> activate",
5122 NO_STR
5123 NEIGHBOR_STR
5124 NEIGHBOR_ADDR_STR2
5125 "Enable the Address Family for this Neighbor\n")
718e3744 5126{
d62a17ae 5127 int idx_peer = 2;
28c6e247
IR
5128 int ret;
5129 struct peer *peer;
f4b8ec07 5130
28c6e247
IR
5131 /* Lookup peer. */
5132 peer = peer_and_group_lookup_vty(vty, argv[idx_peer]->arg);
5133 if (!peer)
d62a17ae 5134 return CMD_WARNING_CONFIG_FAILED;
718e3744 5135
28c6e247
IR
5136 ret = peer_deactivate(peer, bgp_node_afi(vty), bgp_node_safi(vty));
5137 return bgp_vty_return(vty, ret);
718e3744 5138}
6b0655a2 5139
d62a17ae 5140ALIAS_HIDDEN(no_neighbor_activate, no_neighbor_activate_hidden_cmd,
5141 "no neighbor <A.B.C.D|X:X::X:X|WORD> activate",
5142 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5143 "Enable the Address Family for this Neighbor\n")
596c17ba 5144
28c6e247
IR
5145DEFUN (neighbor_set_peer_group,
5146 neighbor_set_peer_group_cmd,
5147 "neighbor <A.B.C.D|X:X::X:X|WORD> peer-group PGNAME",
5148 NEIGHBOR_STR
5149 NEIGHBOR_ADDR_STR2
5150 "Member of the peer-group\n"
5151 "Peer-group name\n")
718e3744 5152{
28c6e247 5153 VTY_DECLVAR_CONTEXT(bgp, bgp);
d62a17ae 5154 int idx_peer = 1;
5155 int idx_word = 3;
28c6e247
IR
5156 int ret;
5157 as_t as;
5158 union sockunion su;
5159 struct peer *peer;
5160 struct peer_group *group;
5161
5162 ret = str2sockunion(argv[idx_peer]->arg, &su);
5163 if (ret < 0) {
5164 peer = peer_lookup_by_conf_if(bgp, argv[idx_peer]->arg);
5165 if (!peer) {
5166 vty_out(vty, "%% Malformed address or name: %s\n",
5167 argv[idx_peer]->arg);
5168 return CMD_WARNING_CONFIG_FAILED;
5169 }
5170 } else {
5171 if (peer_address_self_check(bgp, &su)) {
5172 vty_out(vty,
5173 "%% Can not configure the local system as neighbor\n");
5174 return CMD_WARNING_CONFIG_FAILED;
5175 }
2a059a54 5176
28c6e247
IR
5177 /* Disallow for dynamic neighbor. */
5178 peer = peer_lookup(bgp, &su);
5179 if (peer && peer_dynamic_neighbor(peer)) {
5180 vty_out(vty,
5181 "%% Operation not allowed on a dynamic neighbor\n");
5182 return CMD_WARNING_CONFIG_FAILED;
5183 }
5184 }
5185
5186 group = peer_group_lookup(bgp, argv[idx_word]->arg);
5187 if (!group) {
5188 vty_out(vty, "%% Configure the peer-group first\n");
d62a17ae 5189 return CMD_WARNING_CONFIG_FAILED;
28c6e247 5190 }
d62a17ae 5191
28c6e247 5192 ret = peer_group_bind(bgp, &su, peer, group, &as);
2a059a54 5193
28c6e247 5194 return bgp_vty_return(vty, ret);
d62a17ae 5195}
5196
5197ALIAS_HIDDEN(neighbor_set_peer_group, neighbor_set_peer_group_hidden_cmd,
d7b9898c 5198 "neighbor <A.B.C.D|X:X::X:X|WORD> peer-group PGNAME",
d62a17ae 5199 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5200 "Member of the peer-group\n"
5201 "Peer-group name\n")
596c17ba 5202
28c6e247
IR
5203DEFUN (no_neighbor_set_peer_group,
5204 no_neighbor_set_peer_group_cmd,
5205 "no neighbor <A.B.C.D|X:X::X:X|WORD> peer-group PGNAME",
5206 NO_STR
5207 NEIGHBOR_STR
5208 NEIGHBOR_ADDR_STR2
5209 "Member of the peer-group\n"
5210 "Peer-group name\n")
718e3744 5211{
28c6e247 5212 VTY_DECLVAR_CONTEXT(bgp, bgp);
d62a17ae 5213 int idx_peer = 2;
28c6e247
IR
5214 int idx_word = 4;
5215 int ret;
5216 struct peer *peer;
5217 struct peer_group *group;
d62a17ae 5218
28c6e247
IR
5219 peer = peer_lookup_vty(vty, argv[idx_peer]->arg);
5220 if (!peer)
d62a17ae 5221 return CMD_WARNING_CONFIG_FAILED;
b3a3290e 5222
28c6e247
IR
5223 group = peer_group_lookup(bgp, argv[idx_word]->arg);
5224 if (!group) {
5225 vty_out(vty, "%% Configure the peer-group first\n");
5226 return CMD_WARNING_CONFIG_FAILED;
5227 }
718e3744 5228
28c6e247
IR
5229 if (CHECK_FLAG(peer->flags, PEER_FLAG_CAPABILITY_ENHE))
5230 bgp_zebra_terminate_radv(peer->bgp, peer);
5231
5232 peer_notify_unconfig(peer);
5233 ret = peer_delete(peer);
5234
5235 return bgp_vty_return(vty, ret);
718e3744 5236}
6b0655a2 5237
d62a17ae 5238ALIAS_HIDDEN(no_neighbor_set_peer_group, no_neighbor_set_peer_group_hidden_cmd,
71cc0c88 5239 "no neighbor <A.B.C.D|X:X::X:X|WORD> peer-group PGNAME",
d62a17ae 5240 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5241 "Member of the peer-group\n"
5242 "Peer-group name\n")
596c17ba 5243
d62a17ae 5244static int peer_flag_modify_vty(struct vty *vty, const char *ip_str,
83194f39 5245 uint64_t flag, int set)
718e3744 5246{
d62a17ae 5247 int ret;
5248 struct peer *peer;
718e3744 5249
d62a17ae 5250 peer = peer_and_group_lookup_vty(vty, ip_str);
5251 if (!peer)
5252 return CMD_WARNING_CONFIG_FAILED;
718e3744 5253
7ebe625c
QY
5254 /*
5255 * If 'neighbor <interface>', then this is for directly connected peers,
5256 * we should not accept disable-connected-check.
5257 */
5258 if (peer->conf_if && (flag == PEER_FLAG_DISABLE_CONNECTED_CHECK)) {
5259 vty_out(vty,
3efd0893 5260 "%s is directly connected peer, cannot accept disable-connected-check\n",
7ebe625c
QY
5261 ip_str);
5262 return CMD_WARNING_CONFIG_FAILED;
5263 }
5264
d62a17ae 5265 if (!set && flag == PEER_FLAG_SHUTDOWN)
5266 peer_tx_shutdown_message_unset(peer);
ae9b0e11 5267
d62a17ae 5268 if (set)
5269 ret = peer_flag_set(peer, flag);
5270 else
5271 ret = peer_flag_unset(peer, flag);
718e3744 5272
d62a17ae 5273 return bgp_vty_return(vty, ret);
718e3744 5274}
5275
83194f39 5276static int peer_flag_set_vty(struct vty *vty, const char *ip_str, uint64_t flag)
718e3744 5277{
d62a17ae 5278 return peer_flag_modify_vty(vty, ip_str, flag, 1);
718e3744 5279}
5280
d62a17ae 5281static int peer_flag_unset_vty(struct vty *vty, const char *ip_str,
83194f39 5282 uint64_t flag)
718e3744 5283{
d62a17ae 5284 return peer_flag_modify_vty(vty, ip_str, flag, 0);
718e3744 5285}
5286
5287/* neighbor passive. */
28c6e247
IR
5288DEFUN (neighbor_passive,
5289 neighbor_passive_cmd,
5290 "neighbor <A.B.C.D|X:X::X:X|WORD> passive",
5291 NEIGHBOR_STR
5292 NEIGHBOR_ADDR_STR2
5293 "Don't send open messages to this neighbor\n")
718e3744 5294{
d62a17ae 5295 int idx_peer = 1;
28c6e247 5296 return peer_flag_set_vty(vty, argv[idx_peer]->arg, PEER_FLAG_PASSIVE);
718e3744 5297}
5298
28c6e247
IR
5299DEFUN (no_neighbor_passive,
5300 no_neighbor_passive_cmd,
5301 "no neighbor <A.B.C.D|X:X::X:X|WORD> passive",
5302 NO_STR
5303 NEIGHBOR_STR
5304 NEIGHBOR_ADDR_STR2
5305 "Don't send open messages to this neighbor\n")
718e3744 5306{
d62a17ae 5307 int idx_peer = 2;
28c6e247 5308 return peer_flag_unset_vty(vty, argv[idx_peer]->arg, PEER_FLAG_PASSIVE);
718e3744 5309}
6b0655a2 5310
718e3744 5311/* neighbor shutdown. */
28c6e247
IR
5312DEFUN (neighbor_shutdown_msg,
5313 neighbor_shutdown_msg_cmd,
5314 "neighbor <A.B.C.D|X:X::X:X|WORD> shutdown message MSG...",
5315 NEIGHBOR_STR
5316 NEIGHBOR_ADDR_STR2
5317 "Administratively shut down this neighbor\n"
5318 "Add a shutdown message (RFC 8203)\n"
5319 "Shutdown message\n")
718e3744 5320{
d62a17ae 5321 int idx_peer = 1;
73d70fa6 5322
d62a17ae 5323 if (argc >= 5) {
28c6e247
IR
5324 struct peer *peer =
5325 peer_and_group_lookup_vty(vty, argv[idx_peer]->arg);
d62a17ae 5326 char *message;
73d70fa6 5327
28c6e247
IR
5328 if (!peer)
5329 return CMD_WARNING_CONFIG_FAILED;
d62a17ae 5330 message = argv_concat(argv, argc, 4);
28c6e247
IR
5331 peer_tx_shutdown_message_set(peer, message);
5332 XFREE(MTYPE_TMP, message);
d62a17ae 5333 }
73d70fa6 5334
28c6e247 5335 return peer_flag_set_vty(vty, argv[idx_peer]->arg, PEER_FLAG_SHUTDOWN);
718e3744 5336}
5337
1d80f243 5338ALIAS(neighbor_shutdown_msg, neighbor_shutdown_cmd,
d62a17ae 5339 "neighbor <A.B.C.D|X:X::X:X|WORD> shutdown",
5340 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5341 "Administratively shut down this neighbor\n")
73d70fa6 5342
28c6e247
IR
5343DEFUN (no_neighbor_shutdown_msg,
5344 no_neighbor_shutdown_msg_cmd,
5345 "no neighbor <A.B.C.D|X:X::X:X|WORD> shutdown message MSG...",
5346 NO_STR
5347 NEIGHBOR_STR
5348 NEIGHBOR_ADDR_STR2
5349 "Administratively shut down this neighbor\n"
5350 "Remove a shutdown message (RFC 8203)\n"
5351 "Shutdown message\n")
718e3744 5352{
d62a17ae 5353 int idx_peer = 2;
73d70fa6 5354
28c6e247
IR
5355 return peer_flag_unset_vty(vty, argv[idx_peer]->arg,
5356 PEER_FLAG_SHUTDOWN);
718e3744 5357}
6b0655a2 5358
1d80f243 5359ALIAS(no_neighbor_shutdown_msg, no_neighbor_shutdown_cmd,
d62a17ae 5360 "no neighbor <A.B.C.D|X:X::X:X|WORD> shutdown",
5361 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5362 "Administratively shut down this neighbor\n")
73d70fa6 5363
8336c896
DA
5364DEFUN(neighbor_shutdown_rtt,
5365 neighbor_shutdown_rtt_cmd,
5366 "neighbor <A.B.C.D|X:X::X:X|WORD> shutdown rtt (1-65535) [count (1-255)]",
5367 NEIGHBOR_STR
5368 NEIGHBOR_ADDR_STR2
5369 "Administratively shut down this neighbor\n"
5370 "Shutdown if round-trip-time is higher than expected\n"
5371 "Round-trip-time in milliseconds\n"
5372 "Specify the number of keepalives before shutdown\n"
5373 "The number of keepalives with higher RTT to shutdown\n")
5374{
5375 int idx_peer = 1;
5376 int idx_rtt = 4;
5377 int idx_count = 0;
5378 struct peer *peer;
5379
5380 peer = peer_and_group_lookup_vty(vty, argv[idx_peer]->arg);
5381
5382 if (!peer)
5383 return CMD_WARNING_CONFIG_FAILED;
5384
5385 peer->rtt_expected = strtol(argv[idx_rtt]->arg, NULL, 10);
5386
5387 if (argv_find(argv, argc, "count", &idx_count))
5388 peer->rtt_keepalive_conf =
5389 strtol(argv[idx_count + 1]->arg, NULL, 10);
5390
5391 return peer_flag_set_vty(vty, argv[idx_peer]->arg,
5392 PEER_FLAG_RTT_SHUTDOWN);
5393}
5394
5395DEFUN(no_neighbor_shutdown_rtt,
5396 no_neighbor_shutdown_rtt_cmd,
5397 "no neighbor <A.B.C.D|X:X::X:X|WORD> shutdown rtt [(1-65535) [count (1-255)]]",
5398 NO_STR
5399 NEIGHBOR_STR
5400 NEIGHBOR_ADDR_STR2
5401 "Administratively shut down this neighbor\n"
5402 "Shutdown if round-trip-time is higher than expected\n"
5403 "Round-trip-time in milliseconds\n"
5404 "Specify the number of keepalives before shutdown\n"
5405 "The number of keepalives with higher RTT to shutdown\n")
5406{
5407 int idx_peer = 2;
5408 struct peer *peer;
5409
5410 peer = peer_and_group_lookup_vty(vty, argv[idx_peer]->arg);
5411
5412 if (!peer)
5413 return CMD_WARNING_CONFIG_FAILED;
5414
5415 peer->rtt_expected = 0;
5416 peer->rtt_keepalive_conf = 1;
5417
5418 return peer_flag_unset_vty(vty, argv[idx_peer]->arg,
5419 PEER_FLAG_RTT_SHUTDOWN);
5420}
5421
718e3744 5422/* neighbor capability dynamic. */
28c6e247
IR
5423DEFUN (neighbor_capability_dynamic,
5424 neighbor_capability_dynamic_cmd,
5425 "neighbor <A.B.C.D|X:X::X:X|WORD> capability dynamic",
5426 NEIGHBOR_STR
5427 NEIGHBOR_ADDR_STR2
5428 "Advertise capability to the peer\n"
5429 "Advertise dynamic capability to this neighbor\n")
718e3744 5430{
d62a17ae 5431 int idx_peer = 1;
28c6e247
IR
5432 return peer_flag_set_vty(vty, argv[idx_peer]->arg,
5433 PEER_FLAG_DYNAMIC_CAPABILITY);
718e3744 5434}
5435
28c6e247
IR
5436DEFUN (no_neighbor_capability_dynamic,
5437 no_neighbor_capability_dynamic_cmd,
5438 "no neighbor <A.B.C.D|X:X::X:X|WORD> capability dynamic",
5439 NO_STR
5440 NEIGHBOR_STR
5441 NEIGHBOR_ADDR_STR2
5442 "Advertise capability to the peer\n"
5443 "Advertise dynamic capability to this neighbor\n")
718e3744 5444{
d62a17ae 5445 int idx_peer = 2;
28c6e247
IR
5446 return peer_flag_unset_vty(vty, argv[idx_peer]->arg,
5447 PEER_FLAG_DYNAMIC_CAPABILITY);
718e3744 5448}
6b0655a2 5449
718e3744 5450/* neighbor dont-capability-negotiate */
5451DEFUN (neighbor_dont_capability_negotiate,
5452 neighbor_dont_capability_negotiate_cmd,
9ccf14f7 5453 "neighbor <A.B.C.D|X:X::X:X|WORD> dont-capability-negotiate",
718e3744 5454 NEIGHBOR_STR
5455 NEIGHBOR_ADDR_STR2
5456 "Do not perform capability negotiation\n")
5457{
d62a17ae 5458 int idx_peer = 1;
5459 return peer_flag_set_vty(vty, argv[idx_peer]->arg,
5460 PEER_FLAG_DONT_CAPABILITY);
718e3744 5461}
5462
5463DEFUN (no_neighbor_dont_capability_negotiate,
5464 no_neighbor_dont_capability_negotiate_cmd,
9ccf14f7 5465 "no neighbor <A.B.C.D|X:X::X:X|WORD> dont-capability-negotiate",
718e3744 5466 NO_STR
5467 NEIGHBOR_STR
5468 NEIGHBOR_ADDR_STR2
5469 "Do not perform capability negotiation\n")
5470{
28c6e247
IR
5471 int idx_peer = 2;
5472 return peer_flag_unset_vty(vty, argv[idx_peer]->arg,
5473 PEER_FLAG_DONT_CAPABILITY);
f4b8ec07
CS
5474}
5475
28c6e247
IR
5476/* neighbor capability extended next hop encoding */
5477DEFUN (neighbor_capability_enhe,
5478 neighbor_capability_enhe_cmd,
5479 "neighbor <A.B.C.D|X:X::X:X|WORD> capability extended-nexthop",
5480 NEIGHBOR_STR
5481 NEIGHBOR_ADDR_STR2
5482 "Advertise capability to the peer\n"
5483 "Advertise extended next-hop capability to the peer\n")
f4b8ec07 5484{
28c6e247 5485 int idx_peer = 1;
c4786405
DS
5486 struct peer *peer;
5487
5488 peer = peer_and_group_lookup_vty(vty, argv[idx_peer]->arg);
5489 if (peer && peer->conf_if)
5490 return CMD_SUCCESS;
5491
28c6e247
IR
5492 return peer_flag_set_vty(vty, argv[idx_peer]->arg,
5493 PEER_FLAG_CAPABILITY_ENHE);
5494}
f4b8ec07 5495
28c6e247
IR
5496DEFUN (no_neighbor_capability_enhe,
5497 no_neighbor_capability_enhe_cmd,
5498 "no neighbor <A.B.C.D|X:X::X:X|WORD> capability extended-nexthop",
5499 NO_STR
5500 NEIGHBOR_STR
5501 NEIGHBOR_ADDR_STR2
5502 "Advertise capability to the peer\n"
5503 "Advertise extended next-hop capability to the peer\n")
5504{
5505 int idx_peer = 2;
c4786405
DS
5506 struct peer *peer;
5507
5508 peer = peer_and_group_lookup_vty(vty, argv[idx_peer]->arg);
5509 if (peer && peer->conf_if) {
5510 vty_out(vty,
5511 "Peer %s cannot have capability extended-nexthop turned off\n",
5512 argv[idx_peer]->arg);
5513 return CMD_WARNING_CONFIG_FAILED;
5514 }
5515
28c6e247
IR
5516 return peer_flag_unset_vty(vty, argv[idx_peer]->arg,
5517 PEER_FLAG_CAPABILITY_ENHE);
8a92a8a0
DS
5518}
5519
d62a17ae 5520static int peer_af_flag_modify_vty(struct vty *vty, const char *peer_str,
d7c0a89a 5521 afi_t afi, safi_t safi, uint32_t flag,
d62a17ae 5522 int set)
718e3744 5523{
d62a17ae 5524 int ret;
5525 struct peer *peer;
718e3744 5526
d62a17ae 5527 peer = peer_and_group_lookup_vty(vty, peer_str);
5528 if (!peer)
5529 return CMD_WARNING_CONFIG_FAILED;
718e3744 5530
d62a17ae 5531 if (set)
5532 ret = peer_af_flag_set(peer, afi, safi, flag);
5533 else
5534 ret = peer_af_flag_unset(peer, afi, safi, flag);
718e3744 5535
d62a17ae 5536 return bgp_vty_return(vty, ret);
718e3744 5537}
5538
d62a17ae 5539static int peer_af_flag_set_vty(struct vty *vty, const char *peer_str,
d7c0a89a 5540 afi_t afi, safi_t safi, uint32_t flag)
718e3744 5541{
d62a17ae 5542 return peer_af_flag_modify_vty(vty, peer_str, afi, safi, flag, 1);
718e3744 5543}
5544
d62a17ae 5545static int peer_af_flag_unset_vty(struct vty *vty, const char *peer_str,
d7c0a89a 5546 afi_t afi, safi_t safi, uint32_t flag)
718e3744 5547{
d62a17ae 5548 return peer_af_flag_modify_vty(vty, peer_str, afi, safi, flag, 0);
718e3744 5549}
6b0655a2 5550
718e3744 5551/* neighbor capability orf prefix-list. */
5552DEFUN (neighbor_capability_orf_prefix,
5553 neighbor_capability_orf_prefix_cmd,
9ccf14f7 5554 "neighbor <A.B.C.D|X:X::X:X|WORD> capability orf prefix-list <both|send|receive>",
718e3744 5555 NEIGHBOR_STR
5556 NEIGHBOR_ADDR_STR2
5557 "Advertise capability to the peer\n"
5558 "Advertise ORF capability to the peer\n"
5559 "Advertise prefixlist ORF capability to this neighbor\n"
5560 "Capability to SEND and RECEIVE the ORF to/from this neighbor\n"
5561 "Capability to RECEIVE the ORF from this neighbor\n"
5562 "Capability to SEND the ORF to this neighbor\n")
5563{
d62a17ae 5564 int idx_send_recv = 5;
db45f64d
DS
5565 char *peer_str = argv[1]->arg;
5566 struct peer *peer;
5567 afi_t afi = bgp_node_afi(vty);
5568 safi_t safi = bgp_node_safi(vty);
d62a17ae 5569
db45f64d
DS
5570 peer = peer_and_group_lookup_vty(vty, peer_str);
5571 if (!peer)
d62a17ae 5572 return CMD_WARNING_CONFIG_FAILED;
d62a17ae 5573
db45f64d
DS
5574 if (strmatch(argv[idx_send_recv]->text, "send"))
5575 return peer_af_flag_set_vty(vty, peer_str, afi, safi,
5576 PEER_FLAG_ORF_PREFIX_SM);
5577
5578 if (strmatch(argv[idx_send_recv]->text, "receive"))
5579 return peer_af_flag_set_vty(vty, peer_str, afi, safi,
5580 PEER_FLAG_ORF_PREFIX_RM);
5581
5582 if (strmatch(argv[idx_send_recv]->text, "both"))
5583 return peer_af_flag_set_vty(vty, peer_str, afi, safi,
5584 PEER_FLAG_ORF_PREFIX_SM)
5585 | peer_af_flag_set_vty(vty, peer_str, afi, safi,
5586 PEER_FLAG_ORF_PREFIX_RM);
5587
5588 return CMD_WARNING_CONFIG_FAILED;
d62a17ae 5589}
5590
5591ALIAS_HIDDEN(
5592 neighbor_capability_orf_prefix,
5593 neighbor_capability_orf_prefix_hidden_cmd,
5594 "neighbor <A.B.C.D|X:X::X:X|WORD> capability orf prefix-list <both|send|receive>",
5595 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5596 "Advertise capability to the peer\n"
5597 "Advertise ORF capability to the peer\n"
5598 "Advertise prefixlist ORF capability to this neighbor\n"
5599 "Capability to SEND and RECEIVE the ORF to/from this neighbor\n"
5600 "Capability to RECEIVE the ORF from this neighbor\n"
5601 "Capability to SEND the ORF to this neighbor\n")
596c17ba 5602
718e3744 5603DEFUN (no_neighbor_capability_orf_prefix,
5604 no_neighbor_capability_orf_prefix_cmd,
9ccf14f7 5605 "no neighbor <A.B.C.D|X:X::X:X|WORD> capability orf prefix-list <both|send|receive>",
718e3744 5606 NO_STR
5607 NEIGHBOR_STR
5608 NEIGHBOR_ADDR_STR2
5609 "Advertise capability to the peer\n"
5610 "Advertise ORF capability to the peer\n"
5611 "Advertise prefixlist ORF capability to this neighbor\n"
5612 "Capability to SEND and RECEIVE the ORF to/from this neighbor\n"
5613 "Capability to RECEIVE the ORF from this neighbor\n"
5614 "Capability to SEND the ORF to this neighbor\n")
5615{
d62a17ae 5616 int idx_send_recv = 6;
db45f64d
DS
5617 char *peer_str = argv[2]->arg;
5618 struct peer *peer;
5619 afi_t afi = bgp_node_afi(vty);
5620 safi_t safi = bgp_node_safi(vty);
d62a17ae 5621
db45f64d
DS
5622 peer = peer_and_group_lookup_vty(vty, peer_str);
5623 if (!peer)
d62a17ae 5624 return CMD_WARNING_CONFIG_FAILED;
d62a17ae 5625
db45f64d
DS
5626 if (strmatch(argv[idx_send_recv]->text, "send"))
5627 return peer_af_flag_unset_vty(vty, peer_str, afi, safi,
5628 PEER_FLAG_ORF_PREFIX_SM);
5629
5630 if (strmatch(argv[idx_send_recv]->text, "receive"))
5631 return peer_af_flag_unset_vty(vty, peer_str, afi, safi,
5632 PEER_FLAG_ORF_PREFIX_RM);
5633
5634 if (strmatch(argv[idx_send_recv]->text, "both"))
5635 return peer_af_flag_unset_vty(vty, peer_str, afi, safi,
5636 PEER_FLAG_ORF_PREFIX_SM)
5637 | peer_af_flag_unset_vty(vty, peer_str, afi, safi,
5638 PEER_FLAG_ORF_PREFIX_RM);
5639
5640 return CMD_WARNING_CONFIG_FAILED;
d62a17ae 5641}
5642
5643ALIAS_HIDDEN(
5644 no_neighbor_capability_orf_prefix,
5645 no_neighbor_capability_orf_prefix_hidden_cmd,
5646 "no neighbor <A.B.C.D|X:X::X:X|WORD> capability orf prefix-list <both|send|receive>",
5647 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5648 "Advertise capability to the peer\n"
5649 "Advertise ORF capability to the peer\n"
5650 "Advertise prefixlist ORF capability to this neighbor\n"
5651 "Capability to SEND and RECEIVE the ORF to/from this neighbor\n"
5652 "Capability to RECEIVE the ORF from this neighbor\n"
5653 "Capability to SEND the ORF to this neighbor\n")
596c17ba 5654
718e3744 5655/* neighbor next-hop-self. */
28c6e247
IR
5656DEFUN (neighbor_nexthop_self,
5657 neighbor_nexthop_self_cmd,
5658 "neighbor <A.B.C.D|X:X::X:X|WORD> next-hop-self",
5659 NEIGHBOR_STR
5660 NEIGHBOR_ADDR_STR2
5661 "Disable the next hop calculation for this neighbor\n")
718e3744 5662{
d62a17ae 5663 int idx_peer = 1;
28c6e247
IR
5664 return peer_af_flag_set_vty(vty, argv[idx_peer]->arg, bgp_node_afi(vty),
5665 bgp_node_safi(vty), PEER_FLAG_NEXTHOP_SELF);
a538debe 5666}
9e7a53c1 5667
d62a17ae 5668ALIAS_HIDDEN(neighbor_nexthop_self, neighbor_nexthop_self_hidden_cmd,
5669 "neighbor <A.B.C.D|X:X::X:X|WORD> next-hop-self",
5670 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5671 "Disable the next hop calculation for this neighbor\n")
596c17ba 5672
f4b8ec07 5673/* neighbor next-hop-self. */
28c6e247
IR
5674DEFUN (neighbor_nexthop_self_force,
5675 neighbor_nexthop_self_force_cmd,
5676 "neighbor <A.B.C.D|X:X::X:X|WORD> next-hop-self force",
5677 NEIGHBOR_STR
5678 NEIGHBOR_ADDR_STR2
5679 "Disable the next hop calculation for this neighbor\n"
5680 "Set the next hop to self for reflected routes\n")
f4b8ec07
CS
5681{
5682 int idx_peer = 1;
28c6e247
IR
5683 return peer_af_flag_set_vty(vty, argv[idx_peer]->arg, bgp_node_afi(vty),
5684 bgp_node_safi(vty),
5685 PEER_FLAG_FORCE_NEXTHOP_SELF);
718e3744 5686}
5687
d62a17ae 5688ALIAS_HIDDEN(neighbor_nexthop_self_force,
5689 neighbor_nexthop_self_force_hidden_cmd,
5690 "neighbor <A.B.C.D|X:X::X:X|WORD> next-hop-self force",
5691 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5692 "Disable the next hop calculation for this neighbor\n"
5693 "Set the next hop to self for reflected routes\n")
596c17ba 5694
1bc4e531
DA
5695ALIAS_HIDDEN(neighbor_nexthop_self_force,
5696 neighbor_nexthop_self_all_hidden_cmd,
5697 "neighbor <A.B.C.D|X:X::X:X|WORD> next-hop-self all",
5698 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5699 "Disable the next hop calculation for this neighbor\n"
5700 "Set the next hop to self for reflected routes\n")
5701
28c6e247
IR
5702DEFUN (no_neighbor_nexthop_self,
5703 no_neighbor_nexthop_self_cmd,
5704 "no neighbor <A.B.C.D|X:X::X:X|WORD> next-hop-self",
5705 NO_STR
5706 NEIGHBOR_STR
5707 NEIGHBOR_ADDR_STR2
5708 "Disable the next hop calculation for this neighbor\n")
718e3744 5709{
d62a17ae 5710 int idx_peer = 2;
28c6e247
IR
5711 return peer_af_flag_unset_vty(vty, argv[idx_peer]->arg,
5712 bgp_node_afi(vty), bgp_node_safi(vty),
5713 PEER_FLAG_NEXTHOP_SELF);
718e3744 5714}
6b0655a2 5715
d62a17ae 5716ALIAS_HIDDEN(no_neighbor_nexthop_self, no_neighbor_nexthop_self_hidden_cmd,
5717 "no neighbor <A.B.C.D|X:X::X:X|WORD> next-hop-self",
5718 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5719 "Disable the next hop calculation for this neighbor\n")
596c17ba 5720
28c6e247
IR
5721DEFUN (no_neighbor_nexthop_self_force,
5722 no_neighbor_nexthop_self_force_cmd,
5723 "no neighbor <A.B.C.D|X:X::X:X|WORD> next-hop-self force",
5724 NO_STR
5725 NEIGHBOR_STR
5726 NEIGHBOR_ADDR_STR2
5727 "Disable the next hop calculation for this neighbor\n"
5728 "Set the next hop to self for reflected routes\n")
88b8ed8d 5729{
d62a17ae 5730 int idx_peer = 2;
28c6e247
IR
5731 return peer_af_flag_unset_vty(vty, argv[idx_peer]->arg,
5732 bgp_node_afi(vty), bgp_node_safi(vty),
5733 PEER_FLAG_FORCE_NEXTHOP_SELF);
88b8ed8d 5734}
a538debe 5735
d62a17ae 5736ALIAS_HIDDEN(no_neighbor_nexthop_self_force,
5737 no_neighbor_nexthop_self_force_hidden_cmd,
5738 "no neighbor <A.B.C.D|X:X::X:X|WORD> next-hop-self force",
5739 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5740 "Disable the next hop calculation for this neighbor\n"
5741 "Set the next hop to self for reflected routes\n")
596c17ba 5742
1bc4e531
DA
5743ALIAS_HIDDEN(no_neighbor_nexthop_self_force,
5744 no_neighbor_nexthop_self_all_hidden_cmd,
5745 "no neighbor <A.B.C.D|X:X::X:X|WORD> next-hop-self all",
5746 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5747 "Disable the next hop calculation for this neighbor\n"
5748 "Set the next hop to self for reflected routes\n")
5749
c7122e14 5750/* neighbor as-override */
28c6e247
IR
5751DEFUN (neighbor_as_override,
5752 neighbor_as_override_cmd,
5753 "neighbor <A.B.C.D|X:X::X:X|WORD> as-override",
5754 NEIGHBOR_STR
5755 NEIGHBOR_ADDR_STR2
5756 "Override ASNs in outbound updates if aspath equals remote-as\n")
c7122e14 5757{
d62a17ae 5758 int idx_peer = 1;
28c6e247
IR
5759 return peer_af_flag_set_vty(vty, argv[idx_peer]->arg, bgp_node_afi(vty),
5760 bgp_node_safi(vty), PEER_FLAG_AS_OVERRIDE);
c7122e14
DS
5761}
5762
d62a17ae 5763ALIAS_HIDDEN(neighbor_as_override, neighbor_as_override_hidden_cmd,
5764 "neighbor <A.B.C.D|X:X::X:X|WORD> as-override",
5765 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5766 "Override ASNs in outbound updates if aspath equals remote-as\n")
596c17ba 5767
28c6e247
IR
5768DEFUN (no_neighbor_as_override,
5769 no_neighbor_as_override_cmd,
5770 "no neighbor <A.B.C.D|X:X::X:X|WORD> as-override",
5771 NO_STR
5772 NEIGHBOR_STR
5773 NEIGHBOR_ADDR_STR2
5774 "Override ASNs in outbound updates if aspath equals remote-as\n")
c7122e14 5775{
d62a17ae 5776 int idx_peer = 2;
28c6e247
IR
5777 return peer_af_flag_unset_vty(vty, argv[idx_peer]->arg,
5778 bgp_node_afi(vty), bgp_node_safi(vty),
5779 PEER_FLAG_AS_OVERRIDE);
c7122e14
DS
5780}
5781
d62a17ae 5782ALIAS_HIDDEN(no_neighbor_as_override, no_neighbor_as_override_hidden_cmd,
5783 "no neighbor <A.B.C.D|X:X::X:X|WORD> as-override",
5784 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5785 "Override ASNs in outbound updates if aspath equals remote-as\n")
596c17ba 5786
718e3744 5787/* neighbor remove-private-AS. */
28c6e247
IR
5788DEFUN (neighbor_remove_private_as,
5789 neighbor_remove_private_as_cmd,
5790 "neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS",
5791 NEIGHBOR_STR
5792 NEIGHBOR_ADDR_STR2
5793 "Remove private ASNs in outbound updates\n")
718e3744 5794{
d62a17ae 5795 int idx_peer = 1;
28c6e247
IR
5796 return peer_af_flag_set_vty(vty, argv[idx_peer]->arg, bgp_node_afi(vty),
5797 bgp_node_safi(vty),
5798 PEER_FLAG_REMOVE_PRIVATE_AS);
718e3744 5799}
5800
d62a17ae 5801ALIAS_HIDDEN(neighbor_remove_private_as, neighbor_remove_private_as_hidden_cmd,
5802 "neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS",
5803 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5804 "Remove private ASNs in outbound updates\n")
596c17ba 5805
28c6e247
IR
5806DEFUN (neighbor_remove_private_as_all,
5807 neighbor_remove_private_as_all_cmd,
5808 "neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS all",
5809 NEIGHBOR_STR
5810 NEIGHBOR_ADDR_STR2
5811 "Remove private ASNs in outbound updates\n"
5812 "Apply to all AS numbers\n")
5000f21c 5813{
d62a17ae 5814 int idx_peer = 1;
28c6e247
IR
5815 return peer_af_flag_set_vty(vty, argv[idx_peer]->arg, bgp_node_afi(vty),
5816 bgp_node_safi(vty),
5817 PEER_FLAG_REMOVE_PRIVATE_AS_ALL);
5000f21c
DS
5818}
5819
d62a17ae 5820ALIAS_HIDDEN(neighbor_remove_private_as_all,
5821 neighbor_remove_private_as_all_hidden_cmd,
5822 "neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS all",
5823 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5824 "Remove private ASNs in outbound updates\n"
a0dfca37 5825 "Apply to all AS numbers\n")
596c17ba 5826
28c6e247
IR
5827DEFUN (neighbor_remove_private_as_replace_as,
5828 neighbor_remove_private_as_replace_as_cmd,
5829 "neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS replace-AS",
5830 NEIGHBOR_STR
5831 NEIGHBOR_ADDR_STR2
5832 "Remove private ASNs in outbound updates\n"
5833 "Replace private ASNs with our ASN in outbound updates\n")
5000f21c 5834{
d62a17ae 5835 int idx_peer = 1;
28c6e247
IR
5836 return peer_af_flag_set_vty(vty, argv[idx_peer]->arg, bgp_node_afi(vty),
5837 bgp_node_safi(vty),
5838 PEER_FLAG_REMOVE_PRIVATE_AS_REPLACE);
5000f21c
DS
5839}
5840
d62a17ae 5841ALIAS_HIDDEN(neighbor_remove_private_as_replace_as,
5842 neighbor_remove_private_as_replace_as_hidden_cmd,
5843 "neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS replace-AS",
5844 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5845 "Remove private ASNs in outbound updates\n"
5846 "Replace private ASNs with our ASN in outbound updates\n")
596c17ba 5847
28c6e247
IR
5848DEFUN (neighbor_remove_private_as_all_replace_as,
5849 neighbor_remove_private_as_all_replace_as_cmd,
5850 "neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS all replace-AS",
5851 NEIGHBOR_STR
5852 NEIGHBOR_ADDR_STR2
5853 "Remove private ASNs in outbound updates\n"
5854 "Apply to all AS numbers\n"
5855 "Replace private ASNs with our ASN in outbound updates\n")
5000f21c 5856{
d62a17ae 5857 int idx_peer = 1;
28c6e247
IR
5858 return peer_af_flag_set_vty(vty, argv[idx_peer]->arg, bgp_node_afi(vty),
5859 bgp_node_safi(vty),
5860 PEER_FLAG_REMOVE_PRIVATE_AS_ALL_REPLACE);
5000f21c
DS
5861}
5862
d62a17ae 5863ALIAS_HIDDEN(
5864 neighbor_remove_private_as_all_replace_as,
5865 neighbor_remove_private_as_all_replace_as_hidden_cmd,
5866 "neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS all replace-AS",
5867 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5868 "Remove private ASNs in outbound updates\n"
5869 "Apply to all AS numbers\n"
5870 "Replace private ASNs with our ASN in outbound updates\n")
596c17ba 5871
28c6e247
IR
5872DEFUN (no_neighbor_remove_private_as,
5873 no_neighbor_remove_private_as_cmd,
5874 "no neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS",
5875 NO_STR
5876 NEIGHBOR_STR
5877 NEIGHBOR_ADDR_STR2
5878 "Remove private ASNs in outbound updates\n")
718e3744 5879{
d62a17ae 5880 int idx_peer = 2;
28c6e247
IR
5881 return peer_af_flag_unset_vty(vty, argv[idx_peer]->arg,
5882 bgp_node_afi(vty), bgp_node_safi(vty),
5883 PEER_FLAG_REMOVE_PRIVATE_AS);
718e3744 5884}
6b0655a2 5885
d62a17ae 5886ALIAS_HIDDEN(no_neighbor_remove_private_as,
5887 no_neighbor_remove_private_as_hidden_cmd,
5888 "no neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS",
5889 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5890 "Remove private ASNs in outbound updates\n")
596c17ba 5891
28c6e247
IR
5892DEFUN (no_neighbor_remove_private_as_all,
5893 no_neighbor_remove_private_as_all_cmd,
5894 "no neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS all",
5895 NO_STR
5896 NEIGHBOR_STR
5897 NEIGHBOR_ADDR_STR2
5898 "Remove private ASNs in outbound updates\n"
5899 "Apply to all AS numbers\n")
88b8ed8d 5900{
d62a17ae 5901 int idx_peer = 2;
28c6e247
IR
5902 return peer_af_flag_unset_vty(vty, argv[idx_peer]->arg,
5903 bgp_node_afi(vty), bgp_node_safi(vty),
5904 PEER_FLAG_REMOVE_PRIVATE_AS_ALL);
88b8ed8d 5905}
5000f21c 5906
d62a17ae 5907ALIAS_HIDDEN(no_neighbor_remove_private_as_all,
5908 no_neighbor_remove_private_as_all_hidden_cmd,
5909 "no neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS all",
5910 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5911 "Remove private ASNs in outbound updates\n"
5912 "Apply to all AS numbers\n")
596c17ba 5913
28c6e247
IR
5914DEFUN (no_neighbor_remove_private_as_replace_as,
5915 no_neighbor_remove_private_as_replace_as_cmd,
5916 "no neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS replace-AS",
5917 NO_STR
5918 NEIGHBOR_STR
5919 NEIGHBOR_ADDR_STR2
5920 "Remove private ASNs in outbound updates\n"
5921 "Replace private ASNs with our ASN in outbound updates\n")
88b8ed8d 5922{
d62a17ae 5923 int idx_peer = 2;
28c6e247
IR
5924 return peer_af_flag_unset_vty(vty, argv[idx_peer]->arg,
5925 bgp_node_afi(vty), bgp_node_safi(vty),
5926 PEER_FLAG_REMOVE_PRIVATE_AS_REPLACE);
88b8ed8d 5927}
5000f21c 5928
d62a17ae 5929ALIAS_HIDDEN(no_neighbor_remove_private_as_replace_as,
5930 no_neighbor_remove_private_as_replace_as_hidden_cmd,
5931 "no neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS replace-AS",
5932 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5933 "Remove private ASNs in outbound updates\n"
5934 "Replace private ASNs with our ASN in outbound updates\n")
596c17ba 5935
28c6e247
IR
5936DEFUN (no_neighbor_remove_private_as_all_replace_as,
5937 no_neighbor_remove_private_as_all_replace_as_cmd,
5938 "no neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS all replace-AS",
5939 NO_STR
5940 NEIGHBOR_STR
5941 NEIGHBOR_ADDR_STR2
5942 "Remove private ASNs in outbound updates\n"
5943 "Apply to all AS numbers\n"
5944 "Replace private ASNs with our ASN in outbound updates\n")
88b8ed8d 5945{
d62a17ae 5946 int idx_peer = 2;
28c6e247
IR
5947 return peer_af_flag_unset_vty(vty, argv[idx_peer]->arg,
5948 bgp_node_afi(vty), bgp_node_safi(vty),
5949 PEER_FLAG_REMOVE_PRIVATE_AS_ALL_REPLACE);
88b8ed8d 5950}
5000f21c 5951
d62a17ae 5952ALIAS_HIDDEN(
5953 no_neighbor_remove_private_as_all_replace_as,
5954 no_neighbor_remove_private_as_all_replace_as_hidden_cmd,
5955 "no neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS all replace-AS",
5956 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5957 "Remove private ASNs in outbound updates\n"
5958 "Apply to all AS numbers\n"
5959 "Replace private ASNs with our ASN in outbound updates\n")
596c17ba 5960
5000f21c 5961
718e3744 5962/* neighbor send-community. */
28c6e247
IR
5963DEFUN (neighbor_send_community,
5964 neighbor_send_community_cmd,
5965 "neighbor <A.B.C.D|X:X::X:X|WORD> send-community",
5966 NEIGHBOR_STR
5967 NEIGHBOR_ADDR_STR2
5968 "Send Community attribute to this neighbor\n")
718e3744 5969{
d62a17ae 5970 int idx_peer = 1;
27c05d4d 5971
f63d4054
IR
5972 return peer_af_flag_set_vty(vty, argv[idx_peer]->arg, bgp_node_afi(vty),
5973 bgp_node_safi(vty),
5974 PEER_FLAG_SEND_COMMUNITY);
718e3744 5975}
5976
d62a17ae 5977ALIAS_HIDDEN(neighbor_send_community, neighbor_send_community_hidden_cmd,
5978 "neighbor <A.B.C.D|X:X::X:X|WORD> send-community",
5979 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5980 "Send Community attribute to this neighbor\n")
596c17ba 5981
28c6e247
IR
5982DEFUN (no_neighbor_send_community,
5983 no_neighbor_send_community_cmd,
5984 "no neighbor <A.B.C.D|X:X::X:X|WORD> send-community",
5985 NO_STR
5986 NEIGHBOR_STR
5987 NEIGHBOR_ADDR_STR2
5988 "Send Community attribute to this neighbor\n")
718e3744 5989{
d62a17ae 5990 int idx_peer = 2;
27c05d4d 5991
f63d4054
IR
5992 return peer_af_flag_unset_vty(vty, argv[idx_peer]->arg,
5993 bgp_node_afi(vty), bgp_node_safi(vty),
5994 PEER_FLAG_SEND_COMMUNITY);
718e3744 5995}
6b0655a2 5996
d62a17ae 5997ALIAS_HIDDEN(no_neighbor_send_community, no_neighbor_send_community_hidden_cmd,
5998 "no neighbor <A.B.C.D|X:X::X:X|WORD> send-community",
5999 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
6000 "Send Community attribute to this neighbor\n")
596c17ba 6001
718e3744 6002/* neighbor send-community extended. */
28c6e247
IR
6003DEFUN (neighbor_send_community_type,
6004 neighbor_send_community_type_cmd,
6005 "neighbor <A.B.C.D|X:X::X:X|WORD> send-community <both|all|extended|standard|large>",
6006 NEIGHBOR_STR
6007 NEIGHBOR_ADDR_STR2
6008 "Send Community attribute to this neighbor\n"
6009 "Send Standard and Extended Community attributes\n"
6010 "Send Standard, Large and Extended Community attributes\n"
6011 "Send Extended Community attributes\n"
6012 "Send Standard Community attributes\n"
6013 "Send Large Community attributes\n")
718e3744 6014{
27c05d4d 6015 const char *type = argv[argc - 1]->text;
db45f64d 6016 char *peer_str = argv[1]->arg;
28c6e247 6017 struct peer *peer;
db45f64d 6018 afi_t afi = bgp_node_afi(vty);
28c6e247 6019 safi_t safi = bgp_node_safi(vty);
f4b8ec07 6020
28c6e247
IR
6021 peer = peer_and_group_lookup_vty(vty, peer_str);
6022 if (!peer)
6023 return CMD_WARNING_CONFIG_FAILED;
f4b8ec07 6024
28c6e247
IR
6025 if (strmatch(type, "standard"))
6026 return peer_af_flag_set_vty(vty, peer_str, afi, safi,
6027 PEER_FLAG_SEND_COMMUNITY);
f4b8ec07 6028
28c6e247
IR
6029 if (strmatch(type, "extended"))
6030 return peer_af_flag_set_vty(vty, peer_str, afi, safi,
6031 PEER_FLAG_SEND_EXT_COMMUNITY);
f4b8ec07 6032
28c6e247
IR
6033 if (strmatch(type, "large"))
6034 return peer_af_flag_set_vty(vty, peer_str, afi, safi,
6035 PEER_FLAG_SEND_LARGE_COMMUNITY);
f4b8ec07 6036
28c6e247
IR
6037 if (strmatch(type, "both")) {
6038 return peer_af_flag_set_vty(vty, peer_str, afi, safi,
6039 PEER_FLAG_SEND_COMMUNITY)
6040 | peer_af_flag_set_vty(vty, peer_str, afi, safi,
6041 PEER_FLAG_SEND_EXT_COMMUNITY);
f4b8ec07 6042 }
28c6e247
IR
6043 return peer_af_flag_set_vty(vty, peer_str, afi, safi,
6044 PEER_FLAG_SEND_COMMUNITY)
6045 | peer_af_flag_set_vty(vty, peer_str, afi, safi,
6046 PEER_FLAG_SEND_EXT_COMMUNITY)
6047 | peer_af_flag_set_vty(vty, peer_str, afi, safi,
6048 PEER_FLAG_SEND_LARGE_COMMUNITY);
d62a17ae 6049}
6050
6051ALIAS_HIDDEN(
6052 neighbor_send_community_type, neighbor_send_community_type_hidden_cmd,
6053 "neighbor <A.B.C.D|X:X::X:X|WORD> send-community <both|all|extended|standard|large>",
6054 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
6055 "Send Community attribute to this neighbor\n"
6056 "Send Standard and Extended Community attributes\n"
6057 "Send Standard, Large and Extended Community attributes\n"
6058 "Send Extended Community attributes\n"
6059 "Send Standard Community attributes\n"
6060 "Send Large Community attributes\n")
596c17ba 6061
28c6e247
IR
6062DEFUN (no_neighbor_send_community_type,
6063 no_neighbor_send_community_type_cmd,
6064 "no neighbor <A.B.C.D|X:X::X:X|WORD> send-community <both|all|extended|standard|large>",
6065 NO_STR
6066 NEIGHBOR_STR
6067 NEIGHBOR_ADDR_STR2
6068 "Send Community attribute to this neighbor\n"
6069 "Send Standard and Extended Community attributes\n"
6070 "Send Standard, Large and Extended Community attributes\n"
6071 "Send Extended Community attributes\n"
6072 "Send Standard Community attributes\n"
6073 "Send Large Community attributes\n")
718e3744 6074{
d62a17ae 6075 const char *type = argv[argc - 1]->text;
db45f64d 6076 char *peer_str = argv[2]->arg;
28c6e247 6077 struct peer *peer;
db45f64d
DS
6078 afi_t afi = bgp_node_afi(vty);
6079 safi_t safi = bgp_node_safi(vty);
6080
28c6e247
IR
6081 peer = peer_and_group_lookup_vty(vty, peer_str);
6082 if (!peer)
f4b8ec07
CS
6083 return CMD_WARNING_CONFIG_FAILED;
6084
28c6e247
IR
6085 if (strmatch(type, "standard"))
6086 return peer_af_flag_unset_vty(vty, peer_str, afi, safi,
6087 PEER_FLAG_SEND_COMMUNITY);
f4b8ec07 6088
28c6e247
IR
6089 if (strmatch(type, "extended"))
6090 return peer_af_flag_unset_vty(vty, peer_str, afi, safi,
6091 PEER_FLAG_SEND_EXT_COMMUNITY);
f4b8ec07 6092
28c6e247
IR
6093 if (strmatch(type, "large"))
6094 return peer_af_flag_unset_vty(vty, peer_str, afi, safi,
6095 PEER_FLAG_SEND_LARGE_COMMUNITY);
f4b8ec07
CS
6096
6097 if (strmatch(type, "both")) {
db45f64d 6098
28c6e247
IR
6099 return peer_af_flag_unset_vty(vty, peer_str, afi, safi,
6100 PEER_FLAG_SEND_COMMUNITY)
6101 | peer_af_flag_unset_vty(vty, peer_str, afi, safi,
6102 PEER_FLAG_SEND_EXT_COMMUNITY);
27c05d4d
PM
6103 }
6104
28c6e247
IR
6105 return peer_af_flag_unset_vty(vty, peer_str, afi, safi,
6106 PEER_FLAG_SEND_COMMUNITY)
6107 | peer_af_flag_unset_vty(vty, peer_str, afi, safi,
6108 PEER_FLAG_SEND_EXT_COMMUNITY)
6109 | peer_af_flag_unset_vty(vty, peer_str, afi, safi,
6110 PEER_FLAG_SEND_LARGE_COMMUNITY);
d62a17ae 6111}
6112
6113ALIAS_HIDDEN(
6114 no_neighbor_send_community_type,
6115 no_neighbor_send_community_type_hidden_cmd,
6116 "no neighbor <A.B.C.D|X:X::X:X|WORD> send-community <both|all|extended|standard|large>",
6117 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
6118 "Send Community attribute to this neighbor\n"
6119 "Send Standard and Extended Community attributes\n"
6120 "Send Standard, Large and Extended Community attributes\n"
6121 "Send Extended Community attributes\n"
6122 "Send Standard Community attributes\n"
6123 "Send Large Community attributes\n")
596c17ba 6124
718e3744 6125/* neighbor soft-reconfig. */
28c6e247
IR
6126DEFUN (neighbor_soft_reconfiguration,
6127 neighbor_soft_reconfiguration_cmd,
6128 "neighbor <A.B.C.D|X:X::X:X|WORD> soft-reconfiguration inbound",
6129 NEIGHBOR_STR
6130 NEIGHBOR_ADDR_STR2
6131 "Per neighbor soft reconfiguration\n"
6132 "Allow inbound soft reconfiguration for this neighbor\n")
718e3744 6133{
d62a17ae 6134 int idx_peer = 1;
28c6e247
IR
6135 return peer_af_flag_set_vty(vty, argv[idx_peer]->arg, bgp_node_afi(vty),
6136 bgp_node_safi(vty),
6137 PEER_FLAG_SOFT_RECONFIG);
718e3744 6138}
6139
d62a17ae 6140ALIAS_HIDDEN(neighbor_soft_reconfiguration,
6141 neighbor_soft_reconfiguration_hidden_cmd,
6142 "neighbor <A.B.C.D|X:X::X:X|WORD> soft-reconfiguration inbound",
6143 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
6144 "Per neighbor soft reconfiguration\n"
6145 "Allow inbound soft reconfiguration for this neighbor\n")
596c17ba 6146
28c6e247
IR
6147DEFUN (no_neighbor_soft_reconfiguration,
6148 no_neighbor_soft_reconfiguration_cmd,
6149 "no neighbor <A.B.C.D|X:X::X:X|WORD> soft-reconfiguration inbound",
6150 NO_STR
6151 NEIGHBOR_STR
6152 NEIGHBOR_ADDR_STR2
6153 "Per neighbor soft reconfiguration\n"
6154 "Allow inbound soft reconfiguration for this neighbor\n")
718e3744 6155{
d62a17ae 6156 int idx_peer = 2;
28c6e247
IR
6157 return peer_af_flag_unset_vty(vty, argv[idx_peer]->arg,
6158 bgp_node_afi(vty), bgp_node_safi(vty),
6159 PEER_FLAG_SOFT_RECONFIG);
718e3744 6160}
6b0655a2 6161
d62a17ae 6162ALIAS_HIDDEN(no_neighbor_soft_reconfiguration,
6163 no_neighbor_soft_reconfiguration_hidden_cmd,
6164 "no neighbor <A.B.C.D|X:X::X:X|WORD> soft-reconfiguration inbound",
6165 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
6166 "Per neighbor soft reconfiguration\n"
6167 "Allow inbound soft reconfiguration for this neighbor\n")
596c17ba 6168
28c6e247
IR
6169DEFUN (neighbor_route_reflector_client,
6170 neighbor_route_reflector_client_cmd,
6171 "neighbor <A.B.C.D|X:X::X:X|WORD> route-reflector-client",
6172 NEIGHBOR_STR
6173 NEIGHBOR_ADDR_STR2
6174 "Configure a neighbor as Route Reflector client\n")
718e3744 6175{
d62a17ae 6176 int idx_peer = 1;
28c6e247 6177 struct peer *peer;
718e3744 6178
6179
28c6e247
IR
6180 peer = peer_and_group_lookup_vty(vty, argv[idx_peer]->arg);
6181 if (!peer)
d62a17ae 6182 return CMD_WARNING_CONFIG_FAILED;
718e3744 6183
28c6e247
IR
6184 return peer_af_flag_set_vty(vty, argv[idx_peer]->arg, bgp_node_afi(vty),
6185 bgp_node_safi(vty),
6186 PEER_FLAG_REFLECTOR_CLIENT);
718e3744 6187}
6188
d62a17ae 6189ALIAS_HIDDEN(neighbor_route_reflector_client,
6190 neighbor_route_reflector_client_hidden_cmd,
6191 "neighbor <A.B.C.D|X:X::X:X|WORD> route-reflector-client",
6192 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
6193 "Configure a neighbor as Route Reflector client\n")
596c17ba 6194
28c6e247
IR
6195DEFUN (no_neighbor_route_reflector_client,
6196 no_neighbor_route_reflector_client_cmd,
6197 "no neighbor <A.B.C.D|X:X::X:X|WORD> route-reflector-client",
6198 NO_STR
6199 NEIGHBOR_STR
6200 NEIGHBOR_ADDR_STR2
6201 "Configure a neighbor as Route Reflector client\n")
718e3744 6202{
d62a17ae 6203 int idx_peer = 2;
28c6e247
IR
6204 return peer_af_flag_unset_vty(vty, argv[idx_peer]->arg,
6205 bgp_node_afi(vty), bgp_node_safi(vty),
6206 PEER_FLAG_REFLECTOR_CLIENT);
718e3744 6207}
6b0655a2 6208
d62a17ae 6209ALIAS_HIDDEN(no_neighbor_route_reflector_client,
6210 no_neighbor_route_reflector_client_hidden_cmd,
6211 "no neighbor <A.B.C.D|X:X::X:X|WORD> route-reflector-client",
6212 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
6213 "Configure a neighbor as Route Reflector client\n")
596c17ba 6214
70cd87ca
MK
6215/* optimal-route-reflection Root Routers configuration */
6216DEFPY (optimal_route_reflection,
6217 optimal_route_reflection_cmd,
6218 "[no$no] optimal-route-reflection WORD$orr_group [<A.B.C.D|X:X::X:X>$primary [<A.B.C.D|X:X::X:X>$secondary [<A.B.C.D|X:X::X:X>$tertiary]]]",
6219 NO_STR
6220 "Create ORR group and assign root router(s)\n"
6221 "ORR Group name\n"
6222 "Primary Root address\n"
6223 "Primary Root IPv6 address\n"
6224 "Secondary Root address\n"
6225 "Secondary Root IPv6 address\n"
6226 "Tertiary Root address\n"
6227 "Tertiary Root IPv6 address\n")
6228{
6229 if (!no && !primary) {
6230 vty_out(vty, "%% Specify Primary Root address\n");
6231 return CMD_WARNING_CONFIG_FAILED;
6232 }
6233 return bgp_afi_safi_orr_group_set_vty(
6234 vty, bgp_node_afi(vty), bgp_node_safi(vty), orr_group,
80f6ea8b 6235 primary_str, secondary_str, tertiary_str, !!no);
70cd87ca
MK
6236}
6237
6238/* neighbor optimal-route-reflection group*/
6239DEFPY (neighbor_optimal_route_reflection,
6240 neighbor_optimal_route_reflection_cmd,
6241 "[no$no] neighbor <A.B.C.D|X:X::X:X|WORD>$neighbor optimal-route-reflection WORD$orr_group",
6242 NO_STR
6243 NEIGHBOR_STR
6244 NEIGHBOR_ADDR_STR2
6245 "Apply ORR group configuration to the neighbor\n"
6246 "ORR group name\n")
6247{
6248 return peer_orr_group_set_vty(vty, neighbor, bgp_node_afi(vty),
80f6ea8b 6249 bgp_node_safi(vty), orr_group, !!no);
70cd87ca
MK
6250}
6251
718e3744 6252/* neighbor route-server-client. */
28c6e247
IR
6253DEFUN (neighbor_route_server_client,
6254 neighbor_route_server_client_cmd,
6255 "neighbor <A.B.C.D|X:X::X:X|WORD> route-server-client",
6256 NEIGHBOR_STR
6257 NEIGHBOR_ADDR_STR2
6258 "Configure a neighbor as Route Server client\n")
718e3744 6259{
d62a17ae 6260 int idx_peer = 1;
28c6e247 6261 struct peer *peer;
f4b8ec07 6262
28c6e247
IR
6263 peer = peer_and_group_lookup_vty(vty, argv[idx_peer]->arg);
6264 if (!peer)
d62a17ae 6265 return CMD_WARNING_CONFIG_FAILED;
28c6e247
IR
6266 return peer_af_flag_set_vty(vty, argv[idx_peer]->arg, bgp_node_afi(vty),
6267 bgp_node_safi(vty),
6268 PEER_FLAG_RSERVER_CLIENT);
718e3744 6269}
6270
d62a17ae 6271ALIAS_HIDDEN(neighbor_route_server_client,
6272 neighbor_route_server_client_hidden_cmd,
6273 "neighbor <A.B.C.D|X:X::X:X|WORD> route-server-client",
6274 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
6275 "Configure a neighbor as Route Server client\n")
596c17ba 6276
28c6e247
IR
6277DEFUN (no_neighbor_route_server_client,
6278 no_neighbor_route_server_client_cmd,
6279 "no neighbor <A.B.C.D|X:X::X:X|WORD> route-server-client",
6280 NO_STR
6281 NEIGHBOR_STR
6282 NEIGHBOR_ADDR_STR2
6283 "Configure a neighbor as Route Server client\n")
fee0f4c6 6284{
d62a17ae 6285 int idx_peer = 2;
28c6e247
IR
6286 return peer_af_flag_unset_vty(vty, argv[idx_peer]->arg,
6287 bgp_node_afi(vty), bgp_node_safi(vty),
6288 PEER_FLAG_RSERVER_CLIENT);
fee0f4c6 6289}
6b0655a2 6290
d62a17ae 6291ALIAS_HIDDEN(no_neighbor_route_server_client,
6292 no_neighbor_route_server_client_hidden_cmd,
6293 "no neighbor <A.B.C.D|X:X::X:X|WORD> route-server-client",
6294 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
6295 "Configure a neighbor as Route Server client\n")
596c17ba 6296
fee0f4c6 6297DEFUN (neighbor_nexthop_local_unchanged,
6298 neighbor_nexthop_local_unchanged_cmd,
9ccf14f7 6299 "neighbor <A.B.C.D|X:X::X:X|WORD> nexthop-local unchanged",
fee0f4c6 6300 NEIGHBOR_STR
6301 NEIGHBOR_ADDR_STR2
6302 "Configure treatment of outgoing link-local nexthop attribute\n"
6303 "Leave link-local nexthop unchanged for this peer\n")
6304{
d62a17ae 6305 int idx_peer = 1;
6306 return peer_af_flag_set_vty(vty, argv[idx_peer]->arg, bgp_node_afi(vty),
6307 bgp_node_safi(vty),
6308 PEER_FLAG_NEXTHOP_LOCAL_UNCHANGED);
fee0f4c6 6309}
6b0655a2 6310
fee0f4c6 6311DEFUN (no_neighbor_nexthop_local_unchanged,
6312 no_neighbor_nexthop_local_unchanged_cmd,
9ccf14f7 6313 "no neighbor <A.B.C.D|X:X::X:X|WORD> nexthop-local unchanged",
fee0f4c6 6314 NO_STR
6315 NEIGHBOR_STR
6316 NEIGHBOR_ADDR_STR2
6317 "Configure treatment of outgoing link-local-nexthop attribute\n"
6318 "Leave link-local nexthop unchanged for this peer\n")
718e3744 6319{
d62a17ae 6320 int idx_peer = 2;
6321 return peer_af_flag_unset_vty(vty, argv[idx_peer]->arg,
6322 bgp_node_afi(vty), bgp_node_safi(vty),
6323 PEER_FLAG_NEXTHOP_LOCAL_UNCHANGED);
718e3744 6324}
6b0655a2 6325
28c6e247
IR
6326DEFUN (neighbor_attr_unchanged,
6327 neighbor_attr_unchanged_cmd,
6328 "neighbor <A.B.C.D|X:X::X:X|WORD> attribute-unchanged [{as-path|next-hop|med}]",
6329 NEIGHBOR_STR
6330 NEIGHBOR_ADDR_STR2
6331 "BGP attribute is propagated unchanged to this neighbor\n"
6332 "As-path attribute\n"
6333 "Nexthop attribute\n"
6334 "Med attribute\n")
718e3744 6335{
d62a17ae 6336 int idx = 0;
8eeb0335 6337 char *peer_str = argv[1]->arg;
28c6e247 6338 struct peer *peer;
db45f64d
DS
6339 bool aspath = false;
6340 bool nexthop = false;
6341 bool med = false;
8eeb0335
DW
6342 afi_t afi = bgp_node_afi(vty);
6343 safi_t safi = bgp_node_safi(vty);
28c6e247 6344 int ret = 0;
f4b8ec07 6345
28c6e247
IR
6346 peer = peer_and_group_lookup_vty(vty, peer_str);
6347 if (!peer)
8eeb0335 6348 return CMD_WARNING_CONFIG_FAILED;
d62a17ae 6349
6350 if (argv_find(argv, argc, "as-path", &idx))
db45f64d
DS
6351 aspath = true;
6352
d62a17ae 6353 idx = 0;
6354 if (argv_find(argv, argc, "next-hop", &idx))
db45f64d
DS
6355 nexthop = true;
6356
d62a17ae 6357 idx = 0;
6358 if (argv_find(argv, argc, "med", &idx))
db45f64d 6359 med = true;
d62a17ae 6360
8eeb0335 6361 /* no flags means all of them! */
db45f64d 6362 if (!aspath && !nexthop && !med) {
28c6e247
IR
6363 ret = peer_af_flag_set_vty(vty, peer_str, afi, safi,
6364 PEER_FLAG_AS_PATH_UNCHANGED);
6365 ret |= peer_af_flag_set_vty(vty, peer_str, afi, safi,
6366 PEER_FLAG_NEXTHOP_UNCHANGED);
6367 ret |= peer_af_flag_set_vty(vty, peer_str, afi, safi,
6368 PEER_FLAG_MED_UNCHANGED);
8eeb0335 6369 } else {
28c6e247
IR
6370 if (!aspath) {
6371 if (peer_af_flag_check(peer, afi, safi,
6372 PEER_FLAG_AS_PATH_UNCHANGED)) {
6373 ret |= peer_af_flag_unset_vty(
6374 vty, peer_str, afi, safi,
6375 PEER_FLAG_AS_PATH_UNCHANGED);
6376 }
6377 } else
6378 ret |= peer_af_flag_set_vty(
6379 vty, peer_str, afi, safi,
6380 PEER_FLAG_AS_PATH_UNCHANGED);
6381
6382 if (!nexthop) {
6383 if (peer_af_flag_check(peer, afi, safi,
6384 PEER_FLAG_NEXTHOP_UNCHANGED)) {
6385 ret |= peer_af_flag_unset_vty(
6386 vty, peer_str, afi, safi,
6387 PEER_FLAG_NEXTHOP_UNCHANGED);
6388 }
6389 } else
6390 ret |= peer_af_flag_set_vty(
6391 vty, peer_str, afi, safi,
6392 PEER_FLAG_NEXTHOP_UNCHANGED);
6393
6394 if (!med) {
6395 if (peer_af_flag_check(peer, afi, safi,
6396 PEER_FLAG_MED_UNCHANGED)) {
6397 ret |= peer_af_flag_unset_vty(
6398 vty, peer_str, afi, safi,
6399 PEER_FLAG_MED_UNCHANGED);
6400 }
6401 } else
6402 ret |= peer_af_flag_set_vty(vty, peer_str, afi, safi,
6403 PEER_FLAG_MED_UNCHANGED);
d62a17ae 6404 }
6405
28c6e247 6406 return ret;
d62a17ae 6407}
6408
6409ALIAS_HIDDEN(
6410 neighbor_attr_unchanged, neighbor_attr_unchanged_hidden_cmd,
6411 "neighbor <A.B.C.D|X:X::X:X|WORD> attribute-unchanged [{as-path|next-hop|med}]",
6412 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
6413 "BGP attribute is propagated unchanged to this neighbor\n"
6414 "As-path attribute\n"
6415 "Nexthop attribute\n"
6416 "Med attribute\n")
596c17ba 6417
28c6e247
IR
6418DEFUN (no_neighbor_attr_unchanged,
6419 no_neighbor_attr_unchanged_cmd,
6420 "no neighbor <A.B.C.D|X:X::X:X|WORD> attribute-unchanged [{as-path|next-hop|med}]",
6421 NO_STR
6422 NEIGHBOR_STR
6423 NEIGHBOR_ADDR_STR2
6424 "BGP attribute is propagated unchanged to this neighbor\n"
6425 "As-path attribute\n"
6426 "Nexthop attribute\n"
6427 "Med attribute\n")
718e3744 6428{
d62a17ae 6429 int idx = 0;
db45f64d 6430 char *peer_str = argv[2]->arg;
28c6e247 6431 struct peer *peer;
db45f64d
DS
6432 bool aspath = false;
6433 bool nexthop = false;
6434 bool med = false;
6435 afi_t afi = bgp_node_afi(vty);
6436 safi_t safi = bgp_node_safi(vty);
28c6e247 6437 int ret = 0;
f4b8ec07 6438
28c6e247
IR
6439 peer = peer_and_group_lookup_vty(vty, peer_str);
6440 if (!peer)
db45f64d 6441 return CMD_WARNING_CONFIG_FAILED;
d62a17ae 6442
6443 if (argv_find(argv, argc, "as-path", &idx))
db45f64d
DS
6444 aspath = true;
6445
d62a17ae 6446 idx = 0;
6447 if (argv_find(argv, argc, "next-hop", &idx))
db45f64d
DS
6448 nexthop = true;
6449
d62a17ae 6450 idx = 0;
6451 if (argv_find(argv, argc, "med", &idx))
db45f64d 6452 med = true;
d62a17ae 6453
28c6e247
IR
6454 if (!aspath && !nexthop && !med) // no flags means all of them!
6455 return peer_af_flag_unset_vty(vty, peer_str, afi, safi,
6456 PEER_FLAG_AS_PATH_UNCHANGED)
6457 | peer_af_flag_unset_vty(vty, peer_str, afi, safi,
6458 PEER_FLAG_NEXTHOP_UNCHANGED)
6459 | peer_af_flag_unset_vty(vty, peer_str, afi, safi,
6460 PEER_FLAG_MED_UNCHANGED);
db45f64d
DS
6461
6462 if (aspath)
28c6e247
IR
6463 ret |= peer_af_flag_unset_vty(vty, peer_str, afi, safi,
6464 PEER_FLAG_AS_PATH_UNCHANGED);
db45f64d
DS
6465
6466 if (nexthop)
28c6e247
IR
6467 ret |= peer_af_flag_unset_vty(vty, peer_str, afi, safi,
6468 PEER_FLAG_NEXTHOP_UNCHANGED);
d62a17ae 6469
db45f64d 6470 if (med)
28c6e247
IR
6471 ret |= peer_af_flag_unset_vty(vty, peer_str, afi, safi,
6472 PEER_FLAG_MED_UNCHANGED);
db45f64d 6473
28c6e247 6474 return ret;
d62a17ae 6475}
6476
6477ALIAS_HIDDEN(
6478 no_neighbor_attr_unchanged, no_neighbor_attr_unchanged_hidden_cmd,
6479 "no neighbor <A.B.C.D|X:X::X:X|WORD> attribute-unchanged [{as-path|next-hop|med}]",
6480 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
6481 "BGP attribute is propagated unchanged to this neighbor\n"
6482 "As-path attribute\n"
6483 "Nexthop attribute\n"
6484 "Med attribute\n")
718e3744 6485
28c6e247
IR
6486/* EBGP multihop configuration. */
6487static int peer_ebgp_multihop_set_vty(struct vty *vty, const char *ip_str,
6488 const char *ttl_str)
718e3744 6489{
28c6e247
IR
6490 struct peer *peer;
6491 unsigned int ttl;
718e3744 6492
28c6e247
IR
6493 peer = peer_and_group_lookup_vty(vty, ip_str);
6494 if (!peer)
d62a17ae 6495 return CMD_WARNING_CONFIG_FAILED;
718e3744 6496
28c6e247
IR
6497 if (peer->conf_if)
6498 return bgp_vty_return(vty, BGP_ERR_INVALID_FOR_DIRECT_PEER);
6499
6500 if (!ttl_str)
6501 ttl = MAXTTL;
6502 else
6503 ttl = strtoul(ttl_str, NULL, 10);
718e3744 6504
28c6e247 6505 return bgp_vty_return(vty, peer_ebgp_multihop_set(peer, ttl));
718e3744 6506}
6507
28c6e247 6508static int peer_ebgp_multihop_unset_vty(struct vty *vty, const char *ip_str)
718e3744 6509{
28c6e247 6510 struct peer *peer;
718e3744 6511
28c6e247
IR
6512 peer = peer_and_group_lookup_vty(vty, ip_str);
6513 if (!peer)
d62a17ae 6514 return CMD_WARNING_CONFIG_FAILED;
718e3744 6515
28c6e247 6516 return bgp_vty_return(vty, peer_ebgp_multihop_unset(peer));
718e3744 6517}
6518
28c6e247
IR
6519/* neighbor ebgp-multihop. */
6520DEFUN (neighbor_ebgp_multihop,
6521 neighbor_ebgp_multihop_cmd,
6522 "neighbor <A.B.C.D|X:X::X:X|WORD> ebgp-multihop",
6523 NEIGHBOR_STR
6524 NEIGHBOR_ADDR_STR2
6525 "Allow EBGP neighbors not on directly connected networks\n")
718e3744 6526{
28c6e247
IR
6527 int idx_peer = 1;
6528 return peer_ebgp_multihop_set_vty(vty, argv[idx_peer]->arg, NULL);
6529}
f4b8ec07 6530
28c6e247
IR
6531DEFUN (neighbor_ebgp_multihop_ttl,
6532 neighbor_ebgp_multihop_ttl_cmd,
6533 "neighbor <A.B.C.D|X:X::X:X|WORD> ebgp-multihop (1-255)",
6534 NEIGHBOR_STR
6535 NEIGHBOR_ADDR_STR2
6536 "Allow EBGP neighbors not on directly connected networks\n"
6537 "maximum hop count\n")
6538{
6539 int idx_peer = 1;
6540 int idx_number = 3;
6541 return peer_ebgp_multihop_set_vty(vty, argv[idx_peer]->arg,
6542 argv[idx_number]->arg);
6543}
f4b8ec07 6544
28c6e247
IR
6545DEFUN (no_neighbor_ebgp_multihop,
6546 no_neighbor_ebgp_multihop_cmd,
6547 "no neighbor <A.B.C.D|X:X::X:X|WORD> ebgp-multihop [(1-255)]",
6548 NO_STR
6549 NEIGHBOR_STR
6550 NEIGHBOR_ADDR_STR2
6551 "Allow EBGP neighbors not on directly connected networks\n"
6552 "maximum hop count\n")
6553{
6554 int idx_peer = 2;
6555 return peer_ebgp_multihop_unset_vty(vty, argv[idx_peer]->arg);
718e3744 6556}
6557
d864dd9e
EB
6558static uint8_t get_role_by_name(const char *role_str)
6559{
6560 if (strncmp(role_str, "peer", 2) == 0)
6561 return ROLE_PEER;
6562 if (strncmp(role_str, "provider", 2) == 0)
6563 return ROLE_PROVIDER;
6564 if (strncmp(role_str, "customer", 2) == 0)
6565 return ROLE_CUSTOMER;
6566 if (strncmp(role_str, "rs-server", 4) == 0)
6567 return ROLE_RS_SERVER;
6568 if (strncmp(role_str, "rs-client", 4) == 0)
6569 return ROLE_RS_CLIENT;
8f2d6021 6570 return ROLE_UNDEFINED;
d864dd9e
EB
6571}
6572
6573static int peer_role_set_vty(struct vty *vty, const char *ip_str,
8f2d6021 6574 const char *role_str, bool strict_mode)
d864dd9e
EB
6575{
6576 struct peer *peer;
6577
7dddd1f7 6578 peer = peer_and_group_lookup_vty(vty, ip_str);
d864dd9e
EB
6579 if (!peer)
6580 return CMD_WARNING_CONFIG_FAILED;
6581 uint8_t role = get_role_by_name(role_str);
6582
8f2d6021 6583 if (role == ROLE_UNDEFINED)
d864dd9e
EB
6584 return bgp_vty_return(vty, BGP_ERR_INVALID_ROLE_NAME);
6585 return bgp_vty_return(vty, peer_role_set(peer, role, strict_mode));
6586}
6587
6588static int peer_role_unset_vty(struct vty *vty, const char *ip_str)
6589{
6590 struct peer *peer;
6591
7dddd1f7 6592 peer = peer_and_group_lookup_vty(vty, ip_str);
d864dd9e
EB
6593 if (!peer)
6594 return CMD_WARNING_CONFIG_FAILED;
6595 return bgp_vty_return(vty, peer_role_unset(peer));
6596}
6597
8f2d6021 6598DEFPY(neighbor_role,
d864dd9e
EB
6599 neighbor_role_cmd,
6600 "neighbor <A.B.C.D|X:X::X:X|WORD> local-role <provider|rs-server|rs-client|customer|peer>",
6601 NEIGHBOR_STR
6602 NEIGHBOR_ADDR_STR2
6603 "Set session role\n"
6604 ROLE_STR)
6605{
6606 int idx_peer = 1;
6607 int idx_role = 3;
6608
6609 return peer_role_set_vty(vty, argv[idx_peer]->arg, argv[idx_role]->arg,
8f2d6021 6610 false);
d864dd9e
EB
6611}
6612
8f2d6021 6613DEFPY(neighbor_role_strict,
d864dd9e
EB
6614 neighbor_role_strict_cmd,
6615 "neighbor <A.B.C.D|X:X::X:X|WORD> local-role <provider|rs-server|rs-client|customer|peer> strict-mode",
6616 NEIGHBOR_STR
6617 NEIGHBOR_ADDR_STR2
6618 "Set session role\n"
6619 ROLE_STR
6620 "Use additional restriction on peer\n")
6621{
6622 int idx_peer = 1;
6623 int idx_role = 3;
6624
6625 return peer_role_set_vty(vty, argv[idx_peer]->arg, argv[idx_role]->arg,
8f2d6021 6626 true);
d864dd9e
EB
6627}
6628
8f2d6021 6629DEFPY(no_neighbor_role,
d864dd9e
EB
6630 no_neighbor_role_cmd,
6631 "no neighbor <A.B.C.D|X:X::X:X|WORD> local-role <provider|rs-server|rs-client|customer|peer> [strict-mode]",
6632 NO_STR
6633 NEIGHBOR_STR
6634 NEIGHBOR_ADDR_STR2
8f2d6021 6635 "Set session role\n"
d864dd9e 6636 ROLE_STR
8f2d6021 6637 "Use additional restriction on peer\n")
d864dd9e
EB
6638{
6639 int idx_peer = 2;
6640
6641 return peer_role_unset_vty(vty, argv[idx_peer]->arg);
6642}
6b0655a2 6643
6ffd2079 6644/* disable-connected-check */
28c6e247
IR
6645DEFUN (neighbor_disable_connected_check,
6646 neighbor_disable_connected_check_cmd,
6647 "neighbor <A.B.C.D|X:X::X:X|WORD> <disable-connected-check|enforce-multihop>",
6648 NEIGHBOR_STR
6649 NEIGHBOR_ADDR_STR2
6650 "one-hop away EBGP peer using loopback address\n"
6651 "Enforce EBGP neighbors perform multihop\n")
6ffd2079 6652{
d62a17ae 6653 int idx_peer = 1;
28c6e247
IR
6654 return peer_flag_set_vty(vty, argv[idx_peer]->arg,
6655 PEER_FLAG_DISABLE_CONNECTED_CHECK);
6ffd2079 6656}
6657
28c6e247
IR
6658DEFUN (no_neighbor_disable_connected_check,
6659 no_neighbor_disable_connected_check_cmd,
6660 "no neighbor <A.B.C.D|X:X::X:X|WORD> <disable-connected-check|enforce-multihop>",
6661 NO_STR
6662 NEIGHBOR_STR
6663 NEIGHBOR_ADDR_STR2
6664 "one-hop away EBGP peer using loopback address\n"
6665 "Enforce EBGP neighbors perform multihop\n")
6ffd2079 6666{
d62a17ae 6667 int idx_peer = 2;
28c6e247
IR
6668 return peer_flag_unset_vty(vty, argv[idx_peer]->arg,
6669 PEER_FLAG_DISABLE_CONNECTED_CHECK);
6ffd2079 6670}
6671
7ab294ea
DA
6672/* disable-link-bw-encoding-ieee */
6673DEFUN(neighbor_disable_link_bw_encoding_ieee,
6674 neighbor_disable_link_bw_encoding_ieee_cmd,
27aa23a4
DA
6675 "neighbor <A.B.C.D|X:X::X:X|WORD> disable-link-bw-encoding-ieee",
6676 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
7ab294ea 6677 "Disable IEEE floating-point encoding for extended community bandwidth\n")
27aa23a4
DA
6678{
6679 int idx_peer = 1;
6680
6681 return peer_flag_set_vty(vty, argv[idx_peer]->arg,
6682 PEER_FLAG_DISABLE_LINK_BW_ENCODING_IEEE);
6683}
6684
7ab294ea
DA
6685DEFUN(no_neighbor_disable_link_bw_encoding_ieee,
6686 no_neighbor_disable_link_bw_encoding_ieee_cmd,
27aa23a4
DA
6687 "no neighbor <A.B.C.D|X:X::X:X|WORD> disable-link-bw-encoding-ieee",
6688 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
7ab294ea 6689 "Disable IEEE floating-point encoding for extended community bandwidth\n")
27aa23a4
DA
6690{
6691 int idx_peer = 2;
6692
6693 return peer_flag_unset_vty(vty, argv[idx_peer]->arg,
6694 PEER_FLAG_DISABLE_LINK_BW_ENCODING_IEEE);
6695}
6696
d08c0c80
DA
6697/* extended-optional-parameters */
6698DEFUN(neighbor_extended_optional_parameters,
6699 neighbor_extended_optional_parameters_cmd,
6700 "neighbor <A.B.C.D|X:X::X:X|WORD> extended-optional-parameters",
6701 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
6702 "Force the extended optional parameters format for OPEN messages\n")
6703{
6704 int idx_peer = 1;
6705
6706 return peer_flag_set_vty(vty, argv[idx_peer]->arg,
6707 PEER_FLAG_EXTENDED_OPT_PARAMS);
6708}
6709
6710DEFUN(no_neighbor_extended_optional_parameters,
6711 no_neighbor_extended_optional_parameters_cmd,
6712 "no neighbor <A.B.C.D|X:X::X:X|WORD> extended-optional-parameters",
6713 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
6714 "Force the extended optional parameters format for OPEN messages\n")
6715{
6716 int idx_peer = 2;
6717
6718 return peer_flag_unset_vty(vty, argv[idx_peer]->arg,
6719 PEER_FLAG_EXTENDED_OPT_PARAMS);
6720}
47cbc09b
PM
6721
6722/* enforce-first-as */
28c6e247
IR
6723DEFUN (neighbor_enforce_first_as,
6724 neighbor_enforce_first_as_cmd,
6725 "neighbor <A.B.C.D|X:X::X:X|WORD> enforce-first-as",
6726 NEIGHBOR_STR
6727 NEIGHBOR_ADDR_STR2
6728 "Enforce the first AS for EBGP routes\n")
47cbc09b
PM
6729{
6730 int idx_peer = 1;
f4b8ec07 6731
28c6e247
IR
6732 return peer_flag_set_vty(vty, argv[idx_peer]->arg,
6733 PEER_FLAG_ENFORCE_FIRST_AS);
47cbc09b
PM
6734}
6735
28c6e247
IR
6736DEFUN (no_neighbor_enforce_first_as,
6737 no_neighbor_enforce_first_as_cmd,
6738 "no neighbor <A.B.C.D|X:X::X:X|WORD> enforce-first-as",
6739 NO_STR
6740 NEIGHBOR_STR
6741 NEIGHBOR_ADDR_STR2
6742 "Enforce the first AS for EBGP routes\n")
47cbc09b
PM
6743{
6744 int idx_peer = 2;
f4b8ec07 6745
28c6e247
IR
6746 return peer_flag_unset_vty(vty, argv[idx_peer]->arg,
6747 PEER_FLAG_ENFORCE_FIRST_AS);
47cbc09b
PM
6748}
6749
6750
28c6e247
IR
6751DEFUN (neighbor_description,
6752 neighbor_description_cmd,
6753 "neighbor <A.B.C.D|X:X::X:X|WORD> description LINE...",
6754 NEIGHBOR_STR
6755 NEIGHBOR_ADDR_STR2
6756 "Neighbor specific description\n"
6757 "Up to 80 characters describing this neighbor\n")
718e3744 6758{
d62a17ae 6759 int idx_peer = 1;
6760 int idx_line = 3;
28c6e247 6761 struct peer *peer;
d62a17ae 6762 char *str;
718e3744 6763
28c6e247
IR
6764 peer = peer_and_group_lookup_vty(vty, argv[idx_peer]->arg);
6765 if (!peer)
d62a17ae 6766 return CMD_WARNING_CONFIG_FAILED;
718e3744 6767
d62a17ae 6768 str = argv_concat(argv, argc, idx_line);
718e3744 6769
28c6e247 6770 peer_description_set(peer, str);
718e3744 6771
d62a17ae 6772 XFREE(MTYPE_TMP, str);
718e3744 6773
28c6e247 6774 return CMD_SUCCESS;
718e3744 6775}
6776
28c6e247
IR
6777DEFUN (no_neighbor_description,
6778 no_neighbor_description_cmd,
6779 "no neighbor <A.B.C.D|X:X::X:X|WORD> description",
6780 NO_STR
6781 NEIGHBOR_STR
6782 NEIGHBOR_ADDR_STR2
6783 "Neighbor specific description\n")
718e3744 6784{
d62a17ae 6785 int idx_peer = 2;
28c6e247 6786 struct peer *peer;
f4b8ec07 6787
28c6e247
IR
6788 peer = peer_and_group_lookup_vty(vty, argv[idx_peer]->arg);
6789 if (!peer)
d62a17ae 6790 return CMD_WARNING_CONFIG_FAILED;
718e3744 6791
28c6e247 6792 peer_description_unset(peer);
718e3744 6793
28c6e247 6794 return CMD_SUCCESS;
718e3744 6795}
6796
1d80f243 6797ALIAS(no_neighbor_description, no_neighbor_description_comment_cmd,
a14810f4
PM
6798 "no neighbor <A.B.C.D|X:X::X:X|WORD> description LINE...",
6799 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
6800 "Neighbor specific description\n"
6801 "Up to 80 characters describing this neighbor\n")
6b0655a2 6802
28c6e247
IR
6803/* Neighbor update-source. */
6804static int peer_update_source_vty(struct vty *vty, const char *peer_str,
6805 const char *source_str)
6806{
6807 struct peer *peer;
6808 struct prefix p;
6809 union sockunion su;
6810
6811 peer = peer_and_group_lookup_vty(vty, peer_str);
6812 if (!peer)
6813 return CMD_WARNING_CONFIG_FAILED;
6814
6815 if (peer->conf_if)
6816 return CMD_WARNING;
6817
6818 if (source_str) {
6819 if (str2sockunion(source_str, &su) == 0)
6820 peer_update_source_addr_set(peer, &su);
6821 else {
6822 if (str2prefix(source_str, &p)) {
6823 vty_out(vty,
6824 "%% Invalid update-source, remove prefix length \n");
6825 return CMD_WARNING_CONFIG_FAILED;
6826 } else
6827 peer_update_source_if_set(peer, source_str);
6828 }
6829 } else
6830 peer_update_source_unset(peer);
6831
6832 return CMD_SUCCESS;
6833}
6834
d62a17ae 6835#define BGP_UPDATE_SOURCE_HELP_STR \
6836 "IPv4 address\n" \
6837 "IPv6 address\n" \
6838 "Interface name (requires zebra to be running)\n"
369688c0 6839
28c6e247
IR
6840DEFUN (neighbor_update_source,
6841 neighbor_update_source_cmd,
6842 "neighbor <A.B.C.D|X:X::X:X|WORD> update-source <A.B.C.D|X:X::X:X|WORD>",
6843 NEIGHBOR_STR
6844 NEIGHBOR_ADDR_STR2
6845 "Source of routing updates\n"
6846 BGP_UPDATE_SOURCE_HELP_STR)
718e3744 6847{
d62a17ae 6848 int idx_peer = 1;
6849 int idx_peer_2 = 3;
28c6e247 6850 return peer_update_source_vty(vty, argv[idx_peer]->arg,
d62a17ae 6851 argv[idx_peer_2]->arg);
718e3744 6852}
6853
28c6e247
IR
6854DEFUN (no_neighbor_update_source,
6855 no_neighbor_update_source_cmd,
6856 "no neighbor <A.B.C.D|X:X::X:X|WORD> update-source [<A.B.C.D|X:X::X:X|WORD>]",
6857 NO_STR
6858 NEIGHBOR_STR
6859 NEIGHBOR_ADDR_STR2
6860 "Source of routing updates\n"
6861 BGP_UPDATE_SOURCE_HELP_STR)
718e3744 6862{
d62a17ae 6863 int idx_peer = 2;
28c6e247 6864 return peer_update_source_vty(vty, argv[idx_peer]->arg, NULL);
718e3744 6865}
6b0655a2 6866
d62a17ae 6867static int peer_default_originate_set_vty(struct vty *vty, const char *peer_str,
6868 afi_t afi, safi_t safi,
6869 const char *rmap, int set)
718e3744 6870{
d62a17ae 6871 int ret;
6872 struct peer *peer;
80912664 6873 struct route_map *route_map = NULL;
718e3744 6874
d62a17ae 6875 peer = peer_and_group_lookup_vty(vty, peer_str);
6876 if (!peer)
6877 return CMD_WARNING_CONFIG_FAILED;
718e3744 6878
1de27621 6879 if (set) {
80912664
DS
6880 if (rmap)
6881 route_map = route_map_lookup_warn_noexist(vty, rmap);
1de27621
DA
6882 ret = peer_default_originate_set(peer, afi, safi,
6883 rmap, route_map);
6884 } else
d62a17ae 6885 ret = peer_default_originate_unset(peer, afi, safi);
718e3744 6886
d62a17ae 6887 return bgp_vty_return(vty, ret);
718e3744 6888}
6889
6890/* neighbor default-originate. */
6891DEFUN (neighbor_default_originate,
6892 neighbor_default_originate_cmd,
9ccf14f7 6893 "neighbor <A.B.C.D|X:X::X:X|WORD> default-originate",
718e3744 6894 NEIGHBOR_STR
6895 NEIGHBOR_ADDR_STR2
6896 "Originate default route to this neighbor\n")
6897{
d62a17ae 6898 int idx_peer = 1;
6899 return peer_default_originate_set_vty(vty, argv[idx_peer]->arg,
6900 bgp_node_afi(vty),
6901 bgp_node_safi(vty), NULL, 1);
718e3744 6902}
6903
d62a17ae 6904ALIAS_HIDDEN(neighbor_default_originate, neighbor_default_originate_hidden_cmd,
6905 "neighbor <A.B.C.D|X:X::X:X|WORD> default-originate",
6906 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
6907 "Originate default route to this neighbor\n")
596c17ba 6908
718e3744 6909DEFUN (neighbor_default_originate_rmap,
6910 neighbor_default_originate_rmap_cmd,
70dd370f 6911 "neighbor <A.B.C.D|X:X::X:X|WORD> default-originate route-map RMAP_NAME",
718e3744 6912 NEIGHBOR_STR
6913 NEIGHBOR_ADDR_STR2
6914 "Originate default route to this neighbor\n"
6915 "Route-map to specify criteria to originate default\n"
6916 "route-map name\n")
6917{
d62a17ae 6918 int idx_peer = 1;
6919 int idx_word = 4;
6920 return peer_default_originate_set_vty(
6921 vty, argv[idx_peer]->arg, bgp_node_afi(vty), bgp_node_safi(vty),
6922 argv[idx_word]->arg, 1);
718e3744 6923}
6924
d62a17ae 6925ALIAS_HIDDEN(
6926 neighbor_default_originate_rmap,
6927 neighbor_default_originate_rmap_hidden_cmd,
70dd370f 6928 "neighbor <A.B.C.D|X:X::X:X|WORD> default-originate route-map RMAP_NAME",
d62a17ae 6929 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
6930 "Originate default route to this neighbor\n"
6931 "Route-map to specify criteria to originate default\n"
6932 "route-map name\n")
596c17ba 6933
718e3744 6934DEFUN (no_neighbor_default_originate,
6935 no_neighbor_default_originate_cmd,
70dd370f 6936 "no neighbor <A.B.C.D|X:X::X:X|WORD> default-originate [route-map RMAP_NAME]",
718e3744 6937 NO_STR
6938 NEIGHBOR_STR
6939 NEIGHBOR_ADDR_STR2
a636c635
DW
6940 "Originate default route to this neighbor\n"
6941 "Route-map to specify criteria to originate default\n"
6942 "route-map name\n")
718e3744 6943{
d62a17ae 6944 int idx_peer = 2;
6945 return peer_default_originate_set_vty(vty, argv[idx_peer]->arg,
6946 bgp_node_afi(vty),
6947 bgp_node_safi(vty), NULL, 0);
718e3744 6948}
6949
d62a17ae 6950ALIAS_HIDDEN(
6951 no_neighbor_default_originate, no_neighbor_default_originate_hidden_cmd,
70dd370f 6952 "no neighbor <A.B.C.D|X:X::X:X|WORD> default-originate [route-map RMAP_NAME]",
d62a17ae 6953 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
6954 "Originate default route to this neighbor\n"
6955 "Route-map to specify criteria to originate default\n"
6956 "route-map name\n")
596c17ba 6957
6b0655a2 6958
28c6e247
IR
6959/* Set neighbor's BGP port. */
6960static int peer_port_vty(struct vty *vty, const char *ip_str, int afi,
6961 const char *port_str)
718e3744 6962{
28c6e247
IR
6963 struct peer *peer;
6964 uint16_t port;
6965 struct servent *sp;
6966
a3aecc99 6967 peer = peer_and_group_lookup_vty(vty, ip_str);
28c6e247
IR
6968 if (!peer)
6969 return CMD_WARNING_CONFIG_FAILED;
6970
6971 if (!port_str) {
6972 sp = getservbyname("bgp", "tcp");
6973 port = (sp == NULL) ? BGP_PORT_DEFAULT : ntohs(sp->s_port);
6974 } else {
6975 port = strtoul(port_str, NULL, 10);
6976 }
718e3744 6977
28c6e247 6978 peer_port_set(peer, port);
718e3744 6979
28c6e247
IR
6980 return CMD_SUCCESS;
6981}
f4b8ec07 6982
28c6e247
IR
6983/* Set specified peer's BGP port. */
6984DEFUN (neighbor_port,
6985 neighbor_port_cmd,
a3aecc99 6986 "neighbor <A.B.C.D|X:X::X:X|WORD> port (0-65535)",
28c6e247 6987 NEIGHBOR_STR
a3aecc99 6988 NEIGHBOR_ADDR_STR2
28c6e247
IR
6989 "Neighbor's BGP port\n"
6990 "TCP port number\n")
6991{
6992 int idx_ip = 1;
6993 int idx_number = 3;
6994 return peer_port_vty(vty, argv[idx_ip]->arg, AFI_IP,
6995 argv[idx_number]->arg);
f4b8ec07 6996}
6b0655a2 6997
28c6e247
IR
6998DEFUN (no_neighbor_port,
6999 no_neighbor_port_cmd,
a3aecc99 7000 "no neighbor <A.B.C.D|X:X::X:X|WORD> port [(0-65535)]",
28c6e247
IR
7001 NO_STR
7002 NEIGHBOR_STR
a3aecc99 7003 NEIGHBOR_ADDR_STR2
28c6e247
IR
7004 "Neighbor's BGP port\n"
7005 "TCP port number\n")
718e3744 7006{
f4b8ec07 7007 int idx_ip = 2;
28c6e247
IR
7008 return peer_port_vty(vty, argv[idx_ip]->arg, AFI_IP, NULL);
7009}
7010
7011
7012/* neighbor weight. */
7013static int peer_weight_set_vty(struct vty *vty, const char *ip_str, afi_t afi,
7014 safi_t safi, const char *weight_str)
7015{
7016 int ret;
7017 struct peer *peer;
7018 unsigned long weight;
718e3744 7019
28c6e247
IR
7020 peer = peer_and_group_lookup_vty(vty, ip_str);
7021 if (!peer)
7022 return CMD_WARNING_CONFIG_FAILED;
718e3744 7023
28c6e247 7024 weight = strtoul(weight_str, NULL, 10);
718e3744 7025
28c6e247
IR
7026 ret = peer_weight_set(peer, afi, safi, weight);
7027 return bgp_vty_return(vty, ret);
718e3744 7028}
7029
28c6e247
IR
7030static int peer_weight_unset_vty(struct vty *vty, const char *ip_str, afi_t afi,
7031 safi_t safi)
718e3744 7032{
28c6e247
IR
7033 int ret;
7034 struct peer *peer;
f4b8ec07 7035
28c6e247
IR
7036 peer = peer_and_group_lookup_vty(vty, ip_str);
7037 if (!peer)
d62a17ae 7038 return CMD_WARNING_CONFIG_FAILED;
718e3744 7039
28c6e247
IR
7040 ret = peer_weight_unset(peer, afi, safi);
7041 return bgp_vty_return(vty, ret);
7042}
f4b8ec07 7043
28c6e247
IR
7044DEFUN (neighbor_weight,
7045 neighbor_weight_cmd,
7046 "neighbor <A.B.C.D|X:X::X:X|WORD> weight (0-65535)",
7047 NEIGHBOR_STR
7048 NEIGHBOR_ADDR_STR2
7049 "Set default weight for routes from this neighbor\n"
7050 "default weight\n")
7051{
7052 int idx_peer = 1;
7053 int idx_number = 3;
7054 return peer_weight_set_vty(vty, argv[idx_peer]->arg, bgp_node_afi(vty),
7055 bgp_node_safi(vty), argv[idx_number]->arg);
718e3744 7056}
7057
d62a17ae 7058ALIAS_HIDDEN(neighbor_weight, neighbor_weight_hidden_cmd,
7059 "neighbor <A.B.C.D|X:X::X:X|WORD> weight (0-65535)",
7060 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
7061 "Set default weight for routes from this neighbor\n"
7062 "default weight\n")
596c17ba 7063
28c6e247
IR
7064DEFUN (no_neighbor_weight,
7065 no_neighbor_weight_cmd,
7066 "no neighbor <A.B.C.D|X:X::X:X|WORD> weight [(0-65535)]",
7067 NO_STR
7068 NEIGHBOR_STR
7069 NEIGHBOR_ADDR_STR2
7070 "Set default weight for routes from this neighbor\n"
7071 "default weight\n")
718e3744 7072{
d62a17ae 7073 int idx_peer = 2;
28c6e247
IR
7074 return peer_weight_unset_vty(vty, argv[idx_peer]->arg,
7075 bgp_node_afi(vty), bgp_node_safi(vty));
718e3744 7076}
7077
d62a17ae 7078ALIAS_HIDDEN(no_neighbor_weight, no_neighbor_weight_hidden_cmd,
7079 "no neighbor <A.B.C.D|X:X::X:X|WORD> weight [(0-65535)]",
7080 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
7081 "Set default weight for routes from this neighbor\n"
7082 "default weight\n")
596c17ba 7083
6b0655a2 7084
718e3744 7085/* Override capability negotiation. */
c36bc05f
IR
7086DEFUN (neighbor_override_capability,
7087 neighbor_override_capability_cmd,
7088 "neighbor <A.B.C.D|X:X::X:X|WORD> override-capability",
7089 NEIGHBOR_STR
7090 NEIGHBOR_ADDR_STR2
7091 "Override capability negotiation result\n")
718e3744 7092{
d62a17ae 7093 int idx_peer = 1;
c36bc05f
IR
7094 return peer_flag_set_vty(vty, argv[idx_peer]->arg,
7095 PEER_FLAG_OVERRIDE_CAPABILITY);
718e3744 7096}
7097
c36bc05f
IR
7098DEFUN (no_neighbor_override_capability,
7099 no_neighbor_override_capability_cmd,
7100 "no neighbor <A.B.C.D|X:X::X:X|WORD> override-capability",
7101 NO_STR
7102 NEIGHBOR_STR
7103 NEIGHBOR_ADDR_STR2
7104 "Override capability negotiation result\n")
718e3744 7105{
d62a17ae 7106 int idx_peer = 2;
c36bc05f
IR
7107 return peer_flag_unset_vty(vty, argv[idx_peer]->arg,
7108 PEER_FLAG_OVERRIDE_CAPABILITY);
718e3744 7109}
6b0655a2 7110
c36bc05f
IR
7111DEFUN (neighbor_strict_capability,
7112 neighbor_strict_capability_cmd,
7113 "neighbor <A.B.C.D|X:X::X:X|WORD> strict-capability-match",
7114 NEIGHBOR_STR
7115 NEIGHBOR_ADDR_STR2
7116 "Strict capability negotiation match\n")
718e3744 7117{
9fb964de
PM
7118 int idx_peer = 1;
7119
c36bc05f
IR
7120 return peer_flag_set_vty(vty, argv[idx_peer]->arg,
7121 PEER_FLAG_STRICT_CAP_MATCH);
718e3744 7122}
7123
c36bc05f
IR
7124DEFUN (no_neighbor_strict_capability,
7125 no_neighbor_strict_capability_cmd,
7126 "no neighbor <A.B.C.D|X:X::X:X|WORD> strict-capability-match",
7127 NO_STR
7128 NEIGHBOR_STR
7129 NEIGHBOR_ADDR_STR2
7130 "Strict capability negotiation match\n")
718e3744 7131{
9fb964de 7132 int idx_peer = 2;
8611c7f3 7133
c36bc05f
IR
7134 return peer_flag_unset_vty(vty, argv[idx_peer]->arg,
7135 PEER_FLAG_STRICT_CAP_MATCH);
718e3744 7136}
6b0655a2 7137
28c6e247
IR
7138static int peer_timers_set_vty(struct vty *vty, const char *ip_str,
7139 const char *keep_str, const char *hold_str)
718e3744 7140{
28c6e247
IR
7141 int ret;
7142 struct peer *peer;
7143 uint32_t keepalive;
7144 uint32_t holdtime;
718e3744 7145
28c6e247
IR
7146 peer = peer_and_group_lookup_vty(vty, ip_str);
7147 if (!peer)
d62a17ae 7148 return CMD_WARNING_CONFIG_FAILED;
718e3744 7149
28c6e247
IR
7150 keepalive = strtoul(keep_str, NULL, 10);
7151 holdtime = strtoul(hold_str, NULL, 10);
718e3744 7152
28c6e247 7153 ret = peer_timers_set(peer, keepalive, holdtime);
718e3744 7154
28c6e247 7155 return bgp_vty_return(vty, ret);
718e3744 7156}
6b0655a2 7157
28c6e247 7158static int peer_timers_unset_vty(struct vty *vty, const char *ip_str)
718e3744 7159{
28c6e247
IR
7160 int ret;
7161 struct peer *peer;
718e3744 7162
28c6e247
IR
7163 peer = peer_and_group_lookup_vty(vty, ip_str);
7164 if (!peer)
d62a17ae 7165 return CMD_WARNING_CONFIG_FAILED;
718e3744 7166
28c6e247 7167 ret = peer_timers_unset(peer);
718e3744 7168
28c6e247 7169 return bgp_vty_return(vty, ret);
718e3744 7170}
6b0655a2 7171
28c6e247
IR
7172DEFUN (neighbor_timers,
7173 neighbor_timers_cmd,
7174 "neighbor <A.B.C.D|X:X::X:X|WORD> timers (0-65535) (0-65535)",
7175 NEIGHBOR_STR
7176 NEIGHBOR_ADDR_STR2
7177 "BGP per neighbor timers\n"
7178 "Keepalive interval\n"
7179 "Holdtime\n")
718e3744 7180{
f4b8ec07 7181 int idx_peer = 1;
28c6e247
IR
7182 int idx_number = 3;
7183 int idx_number_2 = 4;
7184 return peer_timers_set_vty(vty, argv[idx_peer]->arg,
7185 argv[idx_number]->arg,
7186 argv[idx_number_2]->arg);
7187}
7188
7189DEFUN (no_neighbor_timers,
7190 no_neighbor_timers_cmd,
7191 "no neighbor <A.B.C.D|X:X::X:X|WORD> timers [(0-65535) (0-65535)]",
7192 NO_STR
7193 NEIGHBOR_STR
7194 NEIGHBOR_ADDR_STR2
7195 "BGP per neighbor timers\n"
7196 "Keepalive interval\n"
7197 "Holdtime\n")
7198{
7199 int idx_peer = 2;
7200 return peer_timers_unset_vty(vty, argv[idx_peer]->arg);
7201}
7202
7203
7204static int peer_timers_connect_set_vty(struct vty *vty, const char *ip_str,
7205 const char *time_str)
7206{
7207 int ret;
7208 struct peer *peer;
7209 uint32_t connect;
718e3744 7210
28c6e247
IR
7211 peer = peer_and_group_lookup_vty(vty, ip_str);
7212 if (!peer)
d62a17ae 7213 return CMD_WARNING_CONFIG_FAILED;
718e3744 7214
28c6e247
IR
7215 connect = strtoul(time_str, NULL, 10);
7216
7217 ret = peer_timers_connect_set(peer, connect);
718e3744 7218
28c6e247 7219 return bgp_vty_return(vty, ret);
718e3744 7220}
7221
28c6e247 7222static int peer_timers_connect_unset_vty(struct vty *vty, const char *ip_str)
718e3744 7223{
28c6e247
IR
7224 int ret;
7225 struct peer *peer;
718e3744 7226
28c6e247
IR
7227 peer = peer_and_group_lookup_vty(vty, ip_str);
7228 if (!peer)
d62a17ae 7229 return CMD_WARNING_CONFIG_FAILED;
718e3744 7230
28c6e247
IR
7231 ret = peer_timers_connect_unset(peer);
7232
7233 return bgp_vty_return(vty, ret);
7234}
7235
7236DEFUN (neighbor_timers_connect,
7237 neighbor_timers_connect_cmd,
7238 "neighbor <A.B.C.D|X:X::X:X|WORD> timers connect (1-65535)",
7239 NEIGHBOR_STR
7240 NEIGHBOR_ADDR_STR2
7241 "BGP per neighbor timers\n"
7242 "BGP connect timer\n"
7243 "Connect timer\n")
7244{
7245 int idx_peer = 1;
7246 int idx_number = 4;
7247 return peer_timers_connect_set_vty(vty, argv[idx_peer]->arg,
7248 argv[idx_number]->arg);
7249}
718e3744 7250
28c6e247
IR
7251DEFUN (no_neighbor_timers_connect,
7252 no_neighbor_timers_connect_cmd,
7253 "no neighbor <A.B.C.D|X:X::X:X|WORD> timers connect [(1-65535)]",
7254 NO_STR
7255 NEIGHBOR_STR
7256 NEIGHBOR_ADDR_STR2
7257 "BGP per neighbor timers\n"
7258 "BGP connect timer\n"
7259 "Connect timer\n")
7260{
7261 int idx_peer = 2;
7262 return peer_timers_connect_unset_vty(vty, argv[idx_peer]->arg);
718e3744 7263}
7264
d43114f3
DS
7265DEFPY (neighbor_timers_delayopen,
7266 neighbor_timers_delayopen_cmd,
7267 "neighbor <A.B.C.D|X:X::X:X|WORD>$neighbor timers delayopen (1-240)$interval",
7268 NEIGHBOR_STR
7269 NEIGHBOR_ADDR_STR2
7270 "BGP per neighbor timers\n"
7271 "RFC 4271 DelayOpenTimer\n"
7272 "DelayOpenTime timer interval\n")
7273{
7274 struct peer *peer;
7275
7276 peer = peer_and_group_lookup_vty(vty, neighbor);
7277 if (!peer)
7278 return CMD_WARNING_CONFIG_FAILED;
7279
7280 if (!interval) {
7281 if (peer_timers_delayopen_unset(peer))
7282 return CMD_WARNING_CONFIG_FAILED;
7283 } else {
7284 if (peer_timers_delayopen_set(peer, interval))
7285 return CMD_WARNING_CONFIG_FAILED;
7286 }
7287
7288 return CMD_SUCCESS;
7289}
7290
7291DEFPY (no_neighbor_timers_delayopen,
7292 no_neighbor_timers_delayopen_cmd,
7293 "no neighbor <A.B.C.D|X:X::X:X|WORD>$neighbor timers delayopen [(0-65535)]",
7294 NO_STR
7295 NEIGHBOR_STR
7296 NEIGHBOR_ADDR_STR2
7297 "BGP per neighbor timers\n"
7298 "RFC 4271 DelayOpenTimer\n"
7299 "DelayOpenTime timer interval\n")
7300{
7301 struct peer *peer;
7302
7303 peer = peer_and_group_lookup_vty(vty, neighbor);
7304 if (!peer)
7305 return CMD_WARNING_CONFIG_FAILED;
7306
7307 if (peer_timers_delayopen_unset(peer))
7308 return CMD_WARNING_CONFIG_FAILED;
7309
7310 return CMD_SUCCESS;
7311}
7312
28c6e247
IR
7313static int peer_advertise_interval_vty(struct vty *vty, const char *ip_str,
7314 const char *time_str, int set)
718e3744 7315{
28c6e247
IR
7316 int ret;
7317 struct peer *peer;
7318 uint32_t routeadv = 0;
718e3744 7319
28c6e247
IR
7320 peer = peer_and_group_lookup_vty(vty, ip_str);
7321 if (!peer)
d62a17ae 7322 return CMD_WARNING_CONFIG_FAILED;
718e3744 7323
28c6e247
IR
7324 if (time_str)
7325 routeadv = strtoul(time_str, NULL, 10);
7326
7327 if (set)
7328 ret = peer_advertise_interval_set(peer, routeadv);
7329 else
7330 ret = peer_advertise_interval_unset(peer);
718e3744 7331
28c6e247 7332 return bgp_vty_return(vty, ret);
718e3744 7333}
7334
28c6e247
IR
7335DEFUN (neighbor_advertise_interval,
7336 neighbor_advertise_interval_cmd,
7337 "neighbor <A.B.C.D|X:X::X:X|WORD> advertisement-interval (0-600)",
7338 NEIGHBOR_STR
7339 NEIGHBOR_ADDR_STR2
7340 "Minimum interval between sending BGP routing updates\n"
7341 "time in seconds\n")
718e3744 7342{
28c6e247
IR
7343 int idx_peer = 1;
7344 int idx_number = 3;
7345 return peer_advertise_interval_vty(vty, argv[idx_peer]->arg,
7346 argv[idx_number]->arg, 1);
7347}
f4b8ec07 7348
28c6e247
IR
7349DEFUN (no_neighbor_advertise_interval,
7350 no_neighbor_advertise_interval_cmd,
7351 "no neighbor <A.B.C.D|X:X::X:X|WORD> advertisement-interval [(0-600)]",
7352 NO_STR
7353 NEIGHBOR_STR
7354 NEIGHBOR_ADDR_STR2
7355 "Minimum interval between sending BGP routing updates\n"
7356 "time in seconds\n")
7357{
7358 int idx_peer = 2;
7359 return peer_advertise_interval_vty(vty, argv[idx_peer]->arg, NULL, 0);
718e3744 7360}
7361
6b0655a2 7362
518f0eb1
DS
7363/* Time to wait before processing route-map updates */
7364DEFUN (bgp_set_route_map_delay_timer,
7365 bgp_set_route_map_delay_timer_cmd,
6147e2c6 7366 "bgp route-map delay-timer (0-600)",
518f0eb1
DS
7367 SET_STR
7368 "BGP route-map delay timer\n"
7369 "Time in secs to wait before processing route-map changes\n"
f414725f 7370 "0 disables the timer, no route updates happen when route-maps change\n")
518f0eb1 7371{
d62a17ae 7372 int idx_number = 3;
d7c0a89a 7373 uint32_t rmap_delay_timer;
d62a17ae 7374
7375 if (argv[idx_number]->arg) {
7376 rmap_delay_timer = strtoul(argv[idx_number]->arg, NULL, 10);
7377 bm->rmap_update_timer = rmap_delay_timer;
7378
7379 /* if the dynamic update handling is being disabled, and a timer
7380 * is
7381 * running, stop the timer and act as if the timer has already
7382 * fired.
7383 */
7384 if (!rmap_delay_timer && bm->t_rmap_update) {
fa5806c3 7385 THREAD_OFF(bm->t_rmap_update);
d62a17ae 7386 thread_execute(bm->master, bgp_route_map_update_timer,
7387 NULL, 0);
7388 }
7389 return CMD_SUCCESS;
7390 } else {
7391 vty_out(vty, "%% BGP invalid route-map delay-timer\n");
7392 return CMD_WARNING_CONFIG_FAILED;
518f0eb1 7393 }
518f0eb1
DS
7394}
7395
7396DEFUN (no_bgp_set_route_map_delay_timer,
7397 no_bgp_set_route_map_delay_timer_cmd,
8334fd5a 7398 "no bgp route-map delay-timer [(0-600)]",
518f0eb1 7399 NO_STR
3a2d747c 7400 BGP_STR
518f0eb1 7401 "Default BGP route-map delay timer\n"
8334fd5a
DW
7402 "Reset to default time to wait for processing route-map changes\n"
7403 "0 disables the timer, no route updates happen when route-maps change\n")
518f0eb1 7404{
518f0eb1 7405
d62a17ae 7406 bm->rmap_update_timer = RMAP_DEFAULT_UPDATE_TIMER;
518f0eb1 7407
d62a17ae 7408 return CMD_SUCCESS;
518f0eb1
DS
7409}
7410
28c6e247
IR
7411/* neighbor interface */
7412static int peer_interface_vty(struct vty *vty, const char *ip_str,
7413 const char *str)
718e3744 7414{
28c6e247 7415 struct peer *peer;
718e3744 7416
28c6e247
IR
7417 peer = peer_lookup_vty(vty, ip_str);
7418 if (!peer || peer->conf_if) {
7419 vty_out(vty, "%% BGP invalid peer %s\n", ip_str);
7420 return CMD_WARNING_CONFIG_FAILED;
7421 }
718e3744 7422
28c6e247
IR
7423 if (str)
7424 peer_interface_set(peer, str);
7425 else
7426 peer_interface_unset(peer);
718e3744 7427
28c6e247 7428 return CMD_SUCCESS;
718e3744 7429}
7430
28c6e247
IR
7431DEFUN (neighbor_interface,
7432 neighbor_interface_cmd,
7433 "neighbor <A.B.C.D|X:X::X:X> interface WORD",
7434 NEIGHBOR_STR
7435 NEIGHBOR_ADDR_STR
7436 "Interface\n"
7437 "Interface name\n")
718e3744 7438{
28c6e247
IR
7439 int idx_ip = 1;
7440 int idx_word = 3;
294d8425 7441
28c6e247
IR
7442 return peer_interface_vty(vty, argv[idx_ip]->arg, argv[idx_word]->arg);
7443}
f4b8ec07 7444
28c6e247
IR
7445DEFUN (no_neighbor_interface,
7446 no_neighbor_interface_cmd,
294d8425 7447 "no neighbor <A.B.C.D|X:X::X:X> interface WORD",
28c6e247
IR
7448 NO_STR
7449 NEIGHBOR_STR
294d8425 7450 NEIGHBOR_ADDR_STR
28c6e247
IR
7451 "Interface\n"
7452 "Interface name\n")
7453{
7454 int idx_peer = 2;
294d8425 7455
28c6e247 7456 return peer_interface_vty(vty, argv[idx_peer]->arg, NULL);
718e3744 7457}
6b0655a2 7458
718e3744 7459DEFUN (neighbor_distribute_list,
7460 neighbor_distribute_list_cmd,
c60dec36 7461 "neighbor <A.B.C.D|X:X::X:X|WORD> distribute-list ACCESSLIST_NAME <in|out>",
718e3744 7462 NEIGHBOR_STR
7463 NEIGHBOR_ADDR_STR2
7464 "Filter updates to/from this neighbor\n"
718e3744 7465 "IP Access-list name\n"
7466 "Filter incoming updates\n"
7467 "Filter outgoing updates\n")
7468{
d62a17ae 7469 int idx_peer = 1;
7470 int idx_acl = 3;
7471 int direct, ret;
7472 struct peer *peer;
a8206004 7473
d62a17ae 7474 const char *pstr = argv[idx_peer]->arg;
7475 const char *acl = argv[idx_acl]->arg;
7476 const char *inout = argv[argc - 1]->text;
a8206004 7477
d62a17ae 7478 peer = peer_and_group_lookup_vty(vty, pstr);
7479 if (!peer)
7480 return CMD_WARNING_CONFIG_FAILED;
a8206004 7481
d62a17ae 7482 /* Check filter direction. */
7483 direct = strmatch(inout, "in") ? FILTER_IN : FILTER_OUT;
7484 ret = peer_distribute_set(peer, bgp_node_afi(vty), bgp_node_safi(vty),
7485 direct, acl);
a8206004 7486
d62a17ae 7487 return bgp_vty_return(vty, ret);
718e3744 7488}
7489
d62a17ae 7490ALIAS_HIDDEN(
7491 neighbor_distribute_list, neighbor_distribute_list_hidden_cmd,
c60dec36 7492 "neighbor <A.B.C.D|X:X::X:X|WORD> distribute-list ACCESSLIST_NAME <in|out>",
d62a17ae 7493 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
7494 "Filter updates to/from this neighbor\n"
d62a17ae 7495 "IP Access-list name\n"
7496 "Filter incoming updates\n"
7497 "Filter outgoing updates\n")
596c17ba 7498
718e3744 7499DEFUN (no_neighbor_distribute_list,
7500 no_neighbor_distribute_list_cmd,
c60dec36 7501 "no neighbor <A.B.C.D|X:X::X:X|WORD> distribute-list ACCESSLIST_NAME <in|out>",
718e3744 7502 NO_STR
7503 NEIGHBOR_STR
7504 NEIGHBOR_ADDR_STR2
7505 "Filter updates to/from this neighbor\n"
718e3744 7506 "IP Access-list name\n"
7507 "Filter incoming updates\n"
7508 "Filter outgoing updates\n")
7509{
d62a17ae 7510 int idx_peer = 2;
7511 int direct, ret;
7512 struct peer *peer;
a8206004 7513
d62a17ae 7514 const char *pstr = argv[idx_peer]->arg;
7515 const char *inout = argv[argc - 1]->text;
a8206004 7516
d62a17ae 7517 peer = peer_and_group_lookup_vty(vty, pstr);
7518 if (!peer)
7519 return CMD_WARNING_CONFIG_FAILED;
a8206004 7520
d62a17ae 7521 /* Check filter direction. */
7522 direct = strmatch(inout, "in") ? FILTER_IN : FILTER_OUT;
7523 ret = peer_distribute_unset(peer, bgp_node_afi(vty), bgp_node_safi(vty),
7524 direct);
a8206004 7525
d62a17ae 7526 return bgp_vty_return(vty, ret);
718e3744 7527}
6b0655a2 7528
d62a17ae 7529ALIAS_HIDDEN(
7530 no_neighbor_distribute_list, no_neighbor_distribute_list_hidden_cmd,
c60dec36 7531 "no neighbor <A.B.C.D|X:X::X:X|WORD> distribute-list ACCESSLIST_NAME <in|out>",
d62a17ae 7532 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
7533 "Filter updates to/from this neighbor\n"
d62a17ae 7534 "IP Access-list name\n"
7535 "Filter incoming updates\n"
7536 "Filter outgoing updates\n")
596c17ba 7537
718e3744 7538/* Set prefix list to the peer. */
642ef664
IR
7539static int peer_prefix_list_set_vty(struct vty *vty, const char *ip_str,
7540 afi_t afi, safi_t safi,
7541 const char *name_str,
7542 const char *direct_str)
718e3744 7543{
642ef664
IR
7544 int ret;
7545 int direct = FILTER_IN;
7546 struct peer *peer;
718e3744 7547
642ef664
IR
7548 peer = peer_and_group_lookup_vty(vty, ip_str);
7549 if (!peer)
d62a17ae 7550 return CMD_WARNING_CONFIG_FAILED;
e52702f2 7551
642ef664
IR
7552 /* Check filter direction. */
7553 if (strncmp(direct_str, "i", 1) == 0)
7554 direct = FILTER_IN;
7555 else if (strncmp(direct_str, "o", 1) == 0)
7556 direct = FILTER_OUT;
718e3744 7557
642ef664 7558 ret = peer_prefix_list_set(peer, afi, safi, direct, name_str);
718e3744 7559
642ef664
IR
7560 return bgp_vty_return(vty, ret);
7561}
7562
7563static int peer_prefix_list_unset_vty(struct vty *vty, const char *ip_str,
7564 afi_t afi, safi_t safi,
7565 const char *direct_str)
7566{
7567 int ret;
7568 struct peer *peer;
7569 int direct = FILTER_IN;
7570
7571 peer = peer_and_group_lookup_vty(vty, ip_str);
7572 if (!peer)
7573 return CMD_WARNING_CONFIG_FAILED;
7574
7575 /* Check filter direction. */
7576 if (strncmp(direct_str, "i", 1) == 0)
7577 direct = FILTER_IN;
7578 else if (strncmp(direct_str, "o", 1) == 0)
7579 direct = FILTER_OUT;
7580
7581 ret = peer_prefix_list_unset(peer, afi, safi, direct);
7582
7583 return bgp_vty_return(vty, ret);
7584}
7585
7586DEFUN (neighbor_prefix_list,
7587 neighbor_prefix_list_cmd,
7588 "neighbor <A.B.C.D|X:X::X:X|WORD> prefix-list WORD <in|out>",
7589 NEIGHBOR_STR
7590 NEIGHBOR_ADDR_STR2
7591 "Filter updates to/from this neighbor\n"
7592 "Name of a prefix list\n"
7593 "Filter incoming updates\n"
7594 "Filter outgoing updates\n")
7595{
7596 int idx_peer = 1;
7597 int idx_word = 3;
7598 int idx_in_out = 4;
7599 return peer_prefix_list_set_vty(
7600 vty, argv[idx_peer]->arg, bgp_node_afi(vty), bgp_node_safi(vty),
7601 argv[idx_word]->arg, argv[idx_in_out]->arg);
718e3744 7602}
7603
d62a17ae 7604ALIAS_HIDDEN(neighbor_prefix_list, neighbor_prefix_list_hidden_cmd,
7605 "neighbor <A.B.C.D|X:X::X:X|WORD> prefix-list WORD <in|out>",
7606 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
7607 "Filter updates to/from this neighbor\n"
7608 "Name of a prefix list\n"
7609 "Filter incoming updates\n"
7610 "Filter outgoing updates\n")
596c17ba 7611
642ef664
IR
7612DEFUN (no_neighbor_prefix_list,
7613 no_neighbor_prefix_list_cmd,
7614 "no neighbor <A.B.C.D|X:X::X:X|WORD> prefix-list WORD <in|out>",
7615 NO_STR
7616 NEIGHBOR_STR
7617 NEIGHBOR_ADDR_STR2
7618 "Filter updates to/from this neighbor\n"
7619 "Name of a prefix list\n"
7620 "Filter incoming updates\n"
7621 "Filter outgoing updates\n")
7622{
7623 int idx_peer = 2;
7624 int idx_in_out = 5;
7625 return peer_prefix_list_unset_vty(vty, argv[idx_peer]->arg,
7626 bgp_node_afi(vty), bgp_node_safi(vty),
7627 argv[idx_in_out]->arg);
7628}
7629
7630ALIAS_HIDDEN(no_neighbor_prefix_list, no_neighbor_prefix_list_hidden_cmd,
7631 "no neighbor <A.B.C.D|X:X::X:X|WORD> prefix-list WORD <in|out>",
7632 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
7633 "Filter updates to/from this neighbor\n"
7634 "Name of a prefix list\n"
7635 "Filter incoming updates\n"
7636 "Filter outgoing updates\n")
7637
d62a17ae 7638static int peer_aslist_set_vty(struct vty *vty, const char *ip_str, afi_t afi,
7639 safi_t safi, const char *name_str,
7640 const char *direct_str)
718e3744 7641{
d62a17ae 7642 int ret;
7643 struct peer *peer;
7644 int direct = FILTER_IN;
718e3744 7645
d62a17ae 7646 peer = peer_and_group_lookup_vty(vty, ip_str);
7647 if (!peer)
7648 return CMD_WARNING_CONFIG_FAILED;
718e3744 7649
d62a17ae 7650 /* Check filter direction. */
7651 if (strncmp(direct_str, "i", 1) == 0)
7652 direct = FILTER_IN;
7653 else if (strncmp(direct_str, "o", 1) == 0)
7654 direct = FILTER_OUT;
718e3744 7655
d62a17ae 7656 ret = peer_aslist_set(peer, afi, safi, direct, name_str);
718e3744 7657
d62a17ae 7658 return bgp_vty_return(vty, ret);
718e3744 7659}
7660
d62a17ae 7661static int peer_aslist_unset_vty(struct vty *vty, const char *ip_str, afi_t afi,
7662 safi_t safi, const char *direct_str)
718e3744 7663{
d62a17ae 7664 int ret;
7665 struct peer *peer;
7666 int direct = FILTER_IN;
718e3744 7667
d62a17ae 7668 peer = peer_and_group_lookup_vty(vty, ip_str);
7669 if (!peer)
7670 return CMD_WARNING_CONFIG_FAILED;
718e3744 7671
d62a17ae 7672 /* Check filter direction. */
7673 if (strncmp(direct_str, "i", 1) == 0)
7674 direct = FILTER_IN;
7675 else if (strncmp(direct_str, "o", 1) == 0)
7676 direct = FILTER_OUT;
718e3744 7677
d62a17ae 7678 ret = peer_aslist_unset(peer, afi, safi, direct);
718e3744 7679
d62a17ae 7680 return bgp_vty_return(vty, ret);
718e3744 7681}
7682
7683DEFUN (neighbor_filter_list,
7684 neighbor_filter_list_cmd,
de71d43e 7685 "neighbor <A.B.C.D|X:X::X:X|WORD> filter-list AS_PATH_FILTER_NAME <in|out>",
718e3744 7686 NEIGHBOR_STR
7687 NEIGHBOR_ADDR_STR2
7688 "Establish BGP filters\n"
7689 "AS path access-list name\n"
7690 "Filter incoming routes\n"
7691 "Filter outgoing routes\n")
7692{
d62a17ae 7693 int idx_peer = 1;
7694 int idx_word = 3;
7695 int idx_in_out = 4;
7696 return peer_aslist_set_vty(vty, argv[idx_peer]->arg, bgp_node_afi(vty),
7697 bgp_node_safi(vty), argv[idx_word]->arg,
7698 argv[idx_in_out]->arg);
718e3744 7699}
7700
d62a17ae 7701ALIAS_HIDDEN(neighbor_filter_list, neighbor_filter_list_hidden_cmd,
de71d43e 7702 "neighbor <A.B.C.D|X:X::X:X|WORD> filter-list AS_PATH_FILTER_NAME <in|out>",
d62a17ae 7703 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
7704 "Establish BGP filters\n"
7705 "AS path access-list name\n"
7706 "Filter incoming routes\n"
7707 "Filter outgoing routes\n")
596c17ba 7708
718e3744 7709DEFUN (no_neighbor_filter_list,
7710 no_neighbor_filter_list_cmd,
de71d43e 7711 "no neighbor <A.B.C.D|X:X::X:X|WORD> filter-list AS_PATH_FILTER_NAME <in|out>",
718e3744 7712 NO_STR
7713 NEIGHBOR_STR
7714 NEIGHBOR_ADDR_STR2
7715 "Establish BGP filters\n"
7716 "AS path access-list name\n"
7717 "Filter incoming routes\n"
7718 "Filter outgoing routes\n")
7719{
d62a17ae 7720 int idx_peer = 2;
7721 int idx_in_out = 5;
7722 return peer_aslist_unset_vty(vty, argv[idx_peer]->arg,
7723 bgp_node_afi(vty), bgp_node_safi(vty),
7724 argv[idx_in_out]->arg);
718e3744 7725}
6b0655a2 7726
d62a17ae 7727ALIAS_HIDDEN(no_neighbor_filter_list, no_neighbor_filter_list_hidden_cmd,
de71d43e 7728 "no neighbor <A.B.C.D|X:X::X:X|WORD> filter-list AS_PATH_FILTER_NAME <in|out>",
d62a17ae 7729 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
7730 "Establish BGP filters\n"
7731 "AS path access-list name\n"
7732 "Filter incoming routes\n"
7733 "Filter outgoing routes\n")
596c17ba 7734
7f7940e6
MK
7735/* Set advertise-map to the peer. */
7736static int peer_advertise_map_set_vty(struct vty *vty, const char *ip_str,
7737 afi_t afi, safi_t safi,
cf2ad4d8
MK
7738 const char *advertise_str,
7739 const char *condition_str, bool condition,
7740 bool set)
7f7940e6
MK
7741{
7742 int ret = CMD_WARNING_CONFIG_FAILED;
7743 struct peer *peer;
7744 struct route_map *advertise_map;
7745 struct route_map *condition_map;
7746
7747 peer = peer_and_group_lookup_vty(vty, ip_str);
7748 if (!peer)
7749 return ret;
7750
7751 condition_map = route_map_lookup_warn_noexist(vty, condition_str);
7752 advertise_map = route_map_lookup_warn_noexist(vty, advertise_str);
7753
cf2ad4d8
MK
7754 if (set)
7755 ret = peer_advertise_map_set(peer, afi, safi, advertise_str,
7756 advertise_map, condition_str,
7757 condition_map, condition);
7758 else
7759 ret = peer_advertise_map_unset(peer, afi, safi, advertise_str,
7760 advertise_map, condition_str,
7761 condition_map, condition);
7f7940e6
MK
7762
7763 return bgp_vty_return(vty, ret);
7764}
7765
389e4f92
QY
7766DEFPY (bgp_condadv_period,
7767 bgp_condadv_period_cmd,
7768 "[no$no] bgp conditional-advertisement timer (5-240)$period",
7769 NO_STR
7770 BGP_STR
7771 "Conditional advertisement settings\n"
7772 "Set period to rescan BGP table to check if condition is met\n"
7773 "Period between BGP table scans, in seconds; default 60\n")
7774{
7775 VTY_DECLVAR_CONTEXT(bgp, bgp);
7776
7777 bgp->condition_check_period =
7778 no ? DEFAULT_CONDITIONAL_ROUTES_POLL_TIME : period;
7779
7780 return CMD_SUCCESS;
7781}
7782
cf2ad4d8 7783DEFPY (neighbor_advertise_map,
7f7940e6 7784 neighbor_advertise_map_cmd,
3ccddc25 7785 "[no$no] neighbor <A.B.C.D|X:X::X:X|WORD>$neighbor advertise-map RMAP_NAME$advertise_str <exist-map|non-exist-map>$exist RMAP_NAME$condition_str",
cf2ad4d8 7786 NO_STR
7f7940e6
MK
7787 NEIGHBOR_STR
7788 NEIGHBOR_ADDR_STR2
7789 "Route-map to conditionally advertise routes\n"
7790 "Name of advertise map\n"
7791 "Advertise routes only if prefixes in exist-map are installed in BGP table\n"
7f7940e6 7792 "Advertise routes only if prefixes in non-exist-map are not installed in BGP table\n"
52b84062 7793 "Name of the exist or non exist map\n")
7f7940e6 7794{
7f7940e6
MK
7795 bool condition = CONDITION_EXIST;
7796
52b84062 7797 if (!strcmp(exist, "non-exist-map"))
7f7940e6
MK
7798 condition = CONDITION_NON_EXIST;
7799
52b84062
MK
7800 return peer_advertise_map_set_vty(vty, neighbor, bgp_node_afi(vty),
7801 bgp_node_safi(vty), advertise_str,
7802 condition_str, condition, !no);
7f7940e6
MK
7803}
7804
7805ALIAS_HIDDEN(neighbor_advertise_map, neighbor_advertise_map_hidden_cmd,
3ccddc25 7806 "[no$no] neighbor <A.B.C.D|X:X::X:X|WORD>$neighbor advertise-map RMAP_NAME$advertise_str <exist-map|non-exist-map>$exist RMAP_NAME$condition_str",
7f7940e6
MK
7807 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
7808 "Route-map to conditionally advertise routes\n"
7809 "Name of advertise map\n"
7810 "Advertise routes only if prefixes in exist-map are installed in BGP table\n"
7f7940e6 7811 "Advertise routes only if prefixes in non-exist-map are not installed in BGP table\n"
52b84062 7812 "Name of the exist or non exist map\n")
7f7940e6 7813
718e3744 7814/* Set route-map to the peer. */
0ea8d871
IR
7815static int peer_route_map_set_vty(struct vty *vty, const char *ip_str,
7816 afi_t afi, safi_t safi, const char *name_str,
7817 const char *direct_str)
718e3744 7818{
0ea8d871
IR
7819 int ret;
7820 struct peer *peer;
7821 int direct = RMAP_IN;
7822 struct route_map *route_map;
718e3744 7823
0ea8d871
IR
7824 peer = peer_and_group_lookup_vty(vty, ip_str);
7825 if (!peer)
d62a17ae 7826 return CMD_WARNING_CONFIG_FAILED;
718e3744 7827
0ea8d871
IR
7828 /* Check filter direction. */
7829 if (strncmp(direct_str, "in", 2) == 0)
7830 direct = RMAP_IN;
7831 else if (strncmp(direct_str, "o", 1) == 0)
7832 direct = RMAP_OUT;
718e3744 7833
0ea8d871
IR
7834 route_map = route_map_lookup_warn_noexist(vty, name_str);
7835 ret = peer_route_map_set(peer, afi, safi, direct, name_str, route_map);
718e3744 7836
0ea8d871
IR
7837 return bgp_vty_return(vty, ret);
7838}
7839
7840static int peer_route_map_unset_vty(struct vty *vty, const char *ip_str,
7841 afi_t afi, safi_t safi,
7842 const char *direct_str)
7843{
7844 int ret;
7845 struct peer *peer;
7846 int direct = RMAP_IN;
7847
7848 peer = peer_and_group_lookup_vty(vty, ip_str);
7849 if (!peer)
7850 return CMD_WARNING_CONFIG_FAILED;
7851
7852 /* Check filter direction. */
7853 if (strncmp(direct_str, "in", 2) == 0)
7854 direct = RMAP_IN;
7855 else if (strncmp(direct_str, "o", 1) == 0)
7856 direct = RMAP_OUT;
7857
7858 ret = peer_route_map_unset(peer, afi, safi, direct);
7859
7860 return bgp_vty_return(vty, ret);
7861}
7862
7863DEFUN (neighbor_route_map,
7864 neighbor_route_map_cmd,
70dd370f 7865 "neighbor <A.B.C.D|X:X::X:X|WORD> route-map RMAP_NAME <in|out>",
0ea8d871
IR
7866 NEIGHBOR_STR
7867 NEIGHBOR_ADDR_STR2
7868 "Apply route map to neighbor\n"
7869 "Name of route map\n"
7870 "Apply map to incoming routes\n"
7871 "Apply map to outbound routes\n")
7872{
7873 int idx_peer = 1;
7874 int idx_word = 3;
7875 int idx_in_out = 4;
7876 return peer_route_map_set_vty(
7877 vty, argv[idx_peer]->arg, bgp_node_afi(vty), bgp_node_safi(vty),
7878 argv[idx_word]->arg, argv[idx_in_out]->arg);
718e3744 7879}
7880
d6d7ed37 7881ALIAS_HIDDEN(neighbor_route_map, neighbor_route_map_hidden_cmd,
70dd370f 7882 "neighbor <A.B.C.D|X:X::X:X|WORD> route-map RMAP_NAME <in|out>",
d6d7ed37
IR
7883 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
7884 "Apply route map to neighbor\n"
7885 "Name of route map\n"
7886 "Apply map to incoming routes\n"
7887 "Apply map to outbound routes\n")
7888
0ea8d871
IR
7889DEFUN (no_neighbor_route_map,
7890 no_neighbor_route_map_cmd,
70dd370f 7891 "no neighbor <A.B.C.D|X:X::X:X|WORD> route-map RMAP_NAME <in|out>",
0ea8d871
IR
7892 NO_STR
7893 NEIGHBOR_STR
7894 NEIGHBOR_ADDR_STR2
7895 "Apply route map to neighbor\n"
7896 "Name of route map\n"
7897 "Apply map to incoming routes\n"
7898 "Apply map to outbound routes\n")
7899{
7900 int idx_peer = 2;
7901 int idx_in_out = 5;
7902 return peer_route_map_unset_vty(vty, argv[idx_peer]->arg,
7903 bgp_node_afi(vty), bgp_node_safi(vty),
7904 argv[idx_in_out]->arg);
7905}
7906
7907ALIAS_HIDDEN(no_neighbor_route_map, no_neighbor_route_map_hidden_cmd,
70dd370f 7908 "no neighbor <A.B.C.D|X:X::X:X|WORD> route-map RMAP_NAME <in|out>",
d6d7ed37
IR
7909 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
7910 "Apply route map to neighbor\n"
7911 "Name of route map\n"
7912 "Apply map to incoming routes\n"
7913 "Apply map to outbound routes\n")
7914
718e3744 7915/* Set unsuppress-map to the peer. */
d62a17ae 7916static int peer_unsuppress_map_set_vty(struct vty *vty, const char *ip_str,
7917 afi_t afi, safi_t safi,
7918 const char *name_str)
718e3744 7919{
d62a17ae 7920 int ret;
7921 struct peer *peer;
1de27621 7922 struct route_map *route_map;
718e3744 7923
d62a17ae 7924 peer = peer_and_group_lookup_vty(vty, ip_str);
7925 if (!peer)
7926 return CMD_WARNING_CONFIG_FAILED;
718e3744 7927
1de27621
DA
7928 route_map = route_map_lookup_warn_noexist(vty, name_str);
7929 ret = peer_unsuppress_map_set(peer, afi, safi, name_str, route_map);
718e3744 7930
d62a17ae 7931 return bgp_vty_return(vty, ret);
718e3744 7932}
7933
7934/* Unset route-map from the peer. */
d62a17ae 7935static int peer_unsuppress_map_unset_vty(struct vty *vty, const char *ip_str,
7936 afi_t afi, safi_t safi)
718e3744 7937{
d62a17ae 7938 int ret;
7939 struct peer *peer;
718e3744 7940
d62a17ae 7941 peer = peer_and_group_lookup_vty(vty, ip_str);
7942 if (!peer)
7943 return CMD_WARNING_CONFIG_FAILED;
718e3744 7944
d62a17ae 7945 ret = peer_unsuppress_map_unset(peer, afi, safi);
718e3744 7946
d62a17ae 7947 return bgp_vty_return(vty, ret);
718e3744 7948}
7949
7950DEFUN (neighbor_unsuppress_map,
7951 neighbor_unsuppress_map_cmd,
9ccf14f7 7952 "neighbor <A.B.C.D|X:X::X:X|WORD> unsuppress-map WORD",
718e3744 7953 NEIGHBOR_STR
7954 NEIGHBOR_ADDR_STR2
7955 "Route-map to selectively unsuppress suppressed routes\n"
7956 "Name of route map\n")
7957{
d62a17ae 7958 int idx_peer = 1;
7959 int idx_word = 3;
7960 return peer_unsuppress_map_set_vty(
7961 vty, argv[idx_peer]->arg, bgp_node_afi(vty), bgp_node_safi(vty),
7962 argv[idx_word]->arg);
718e3744 7963}
7964
d62a17ae 7965ALIAS_HIDDEN(neighbor_unsuppress_map, neighbor_unsuppress_map_hidden_cmd,
7966 "neighbor <A.B.C.D|X:X::X:X|WORD> unsuppress-map WORD",
7967 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
7968 "Route-map to selectively unsuppress suppressed routes\n"
7969 "Name of route map\n")
596c17ba 7970
718e3744 7971DEFUN (no_neighbor_unsuppress_map,
7972 no_neighbor_unsuppress_map_cmd,
9ccf14f7 7973 "no neighbor <A.B.C.D|X:X::X:X|WORD> unsuppress-map WORD",
718e3744 7974 NO_STR
7975 NEIGHBOR_STR
7976 NEIGHBOR_ADDR_STR2
7977 "Route-map to selectively unsuppress suppressed routes\n"
7978 "Name of route map\n")
7979{
d62a17ae 7980 int idx_peer = 2;
7981 return peer_unsuppress_map_unset_vty(vty, argv[idx_peer]->arg,
7982 bgp_node_afi(vty),
7983 bgp_node_safi(vty));
718e3744 7984}
6b0655a2 7985
d62a17ae 7986ALIAS_HIDDEN(no_neighbor_unsuppress_map, no_neighbor_unsuppress_map_hidden_cmd,
7987 "no neighbor <A.B.C.D|X:X::X:X|WORD> unsuppress-map WORD",
7988 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
7989 "Route-map to selectively unsuppress suppressed routes\n"
7990 "Name of route map\n")
596c17ba 7991
7e62b792
IR
7992static int peer_maximum_prefix_set_vty(struct vty *vty, const char *ip_str,
7993 afi_t afi, safi_t safi,
7994 const char *num_str,
7995 const char *threshold_str, int warning,
7996 const char *restart_str,
7997 const char *force_str)
7998{
7999 int ret;
8000 struct peer *peer;
8001 uint32_t max;
8002 uint8_t threshold;
8003 uint16_t restart;
8004
8005 peer = peer_and_group_lookup_vty(vty, ip_str);
8006 if (!peer)
8007 return CMD_WARNING_CONFIG_FAILED;
8008
8009 max = strtoul(num_str, NULL, 10);
8010 if (threshold_str)
8011 threshold = atoi(threshold_str);
8012 else
8013 threshold = MAXIMUM_PREFIX_THRESHOLD_DEFAULT;
8014
8015 if (restart_str)
8016 restart = atoi(restart_str);
8017 else
8018 restart = 0;
8019
8020 ret = peer_maximum_prefix_set(peer, afi, safi, max, threshold, warning,
8021 restart, force_str ? true : false);
8022
8023 return bgp_vty_return(vty, ret);
8024}
8025
8026static int peer_maximum_prefix_unset_vty(struct vty *vty, const char *ip_str,
8027 afi_t afi, safi_t safi)
8028{
8029 int ret;
8030 struct peer *peer;
8031
8032 peer = peer_and_group_lookup_vty(vty, ip_str);
8033 if (!peer)
8034 return CMD_WARNING_CONFIG_FAILED;
8035
8036 ret = peer_maximum_prefix_unset(peer, afi, safi);
8037
8038 return bgp_vty_return(vty, ret);
8039}
8040
fde246e8 8041/* Maximum number of prefix to be sent to the neighbor. */
1d80f243
IR
8042DEFUN(neighbor_maximum_prefix_out,
8043 neighbor_maximum_prefix_out_cmd,
8044 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix-out (1-4294967295)",
8045 NEIGHBOR_STR
8046 NEIGHBOR_ADDR_STR2
8047 "Maximum number of prefixes to be sent to this peer\n"
8048 "Maximum no. of prefix limit\n")
fde246e8 8049{
80444d30 8050 int ret;
fde246e8
DA
8051 int idx_peer = 1;
8052 int idx_number = 3;
7e62b792
IR
8053 struct peer *peer;
8054 uint32_t max;
fde246e8
DA
8055 afi_t afi = bgp_node_afi(vty);
8056 safi_t safi = bgp_node_safi(vty);
8057
7e62b792
IR
8058 peer = peer_and_group_lookup_vty(vty, argv[idx_peer]->arg);
8059 if (!peer)
fde246e8
DA
8060 return CMD_WARNING_CONFIG_FAILED;
8061
7e62b792 8062 max = strtoul(argv[idx_number]->arg, NULL, 10);
fde246e8 8063
80444d30 8064 ret = peer_maximum_prefix_out_set(peer, afi, safi, max);
fde246e8 8065
80444d30 8066 return bgp_vty_return(vty, ret);
fde246e8
DA
8067}
8068
1d80f243
IR
8069DEFUN(no_neighbor_maximum_prefix_out,
8070 no_neighbor_maximum_prefix_out_cmd,
bc03c622 8071 "no neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix-out [(1-4294967295)]",
1d80f243
IR
8072 NO_STR
8073 NEIGHBOR_STR
8074 NEIGHBOR_ADDR_STR2
bc03c622
LS
8075 "Maximum number of prefixes to be sent to this peer\n"
8076 "Maximum no. of prefix limit\n")
fde246e8 8077{
80444d30 8078 int ret;
fde246e8 8079 int idx_peer = 2;
7e62b792 8080 struct peer *peer;
fde246e8
DA
8081 afi_t afi = bgp_node_afi(vty);
8082 safi_t safi = bgp_node_safi(vty);
8083
7e62b792
IR
8084 peer = peer_and_group_lookup_vty(vty, argv[idx_peer]->arg);
8085 if (!peer)
fde246e8
DA
8086 return CMD_WARNING_CONFIG_FAILED;
8087
80444d30 8088 ret = peer_maximum_prefix_out_unset(peer, afi, safi);
fde246e8 8089
80444d30 8090 return bgp_vty_return(vty, ret);
fde246e8
DA
8091}
8092
9cbd06e0
DA
8093/* Maximum number of prefix configuration. Prefix count is different
8094 for each peer configuration. So this configuration can be set for
718e3744 8095 each peer configuration. */
1d80f243
IR
8096DEFUN (neighbor_maximum_prefix,
8097 neighbor_maximum_prefix_cmd,
8098 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix (1-4294967295) [force]",
8099 NEIGHBOR_STR
8100 NEIGHBOR_ADDR_STR2
8101 "Maximum number of prefix accept from this peer\n"
8102 "maximum no. of prefix limit\n"
8103 "Force checking all received routes not only accepted\n")
718e3744 8104{
d62a17ae 8105 int idx_peer = 1;
8106 int idx_number = 3;
9cbd06e0 8107 int idx_force = 0;
7e62b792 8108 char *force = NULL;
9cbd06e0
DA
8109
8110 if (argv_find(argv, argc, "force", &idx_force))
7e62b792 8111 force = argv[idx_force]->arg;
9cbd06e0 8112
7e62b792
IR
8113 return peer_maximum_prefix_set_vty(
8114 vty, argv[idx_peer]->arg, bgp_node_afi(vty), bgp_node_safi(vty),
8115 argv[idx_number]->arg, NULL, 0, NULL, force);
718e3744 8116}
8117
d62a17ae 8118ALIAS_HIDDEN(neighbor_maximum_prefix, neighbor_maximum_prefix_hidden_cmd,
9cbd06e0 8119 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix (1-4294967295) [force]",
d62a17ae 8120 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
8121 "Maximum number of prefix accept from this peer\n"
9cbd06e0
DA
8122 "maximum no. of prefix limit\n"
8123 "Force checking all received routes not only accepted\n")
596c17ba 8124
1d80f243
IR
8125DEFUN (neighbor_maximum_prefix_threshold,
8126 neighbor_maximum_prefix_threshold_cmd,
8127 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix (1-4294967295) (1-100) [force]",
8128 NEIGHBOR_STR
8129 NEIGHBOR_ADDR_STR2
8130 "Maximum number of prefix accept from this peer\n"
8131 "maximum no. of prefix limit\n"
8132 "Threshold value (%) at which to generate a warning msg\n"
8133 "Force checking all received routes not only accepted\n")
e0701b79 8134{
d62a17ae 8135 int idx_peer = 1;
8136 int idx_number = 3;
8137 int idx_number_2 = 4;
9cbd06e0 8138 int idx_force = 0;
7e62b792 8139 char *force = NULL;
9cbd06e0
DA
8140
8141 if (argv_find(argv, argc, "force", &idx_force))
7e62b792 8142 force = argv[idx_force]->arg;
9cbd06e0 8143
7e62b792
IR
8144 return peer_maximum_prefix_set_vty(
8145 vty, argv[idx_peer]->arg, bgp_node_afi(vty), bgp_node_safi(vty),
8146 argv[idx_number]->arg, argv[idx_number_2]->arg, 0, NULL, force);
0a486e5f 8147}
e0701b79 8148
d62a17ae 8149ALIAS_HIDDEN(
8150 neighbor_maximum_prefix_threshold,
8151 neighbor_maximum_prefix_threshold_hidden_cmd,
9cbd06e0 8152 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix (1-4294967295) (1-100) [force]",
d62a17ae 8153 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
8154 "Maximum number of prefix accept from this peer\n"
8155 "maximum no. of prefix limit\n"
9cbd06e0
DA
8156 "Threshold value (%) at which to generate a warning msg\n"
8157 "Force checking all received routes not only accepted\n")
596c17ba 8158
1d80f243
IR
8159DEFUN (neighbor_maximum_prefix_warning,
8160 neighbor_maximum_prefix_warning_cmd,
8161 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix (1-4294967295) warning-only [force]",
8162 NEIGHBOR_STR
8163 NEIGHBOR_ADDR_STR2
8164 "Maximum number of prefix accept from this peer\n"
8165 "maximum no. of prefix limit\n"
8166 "Only give warning message when limit is exceeded\n"
8167 "Force checking all received routes not only accepted\n")
718e3744 8168{
d62a17ae 8169 int idx_peer = 1;
8170 int idx_number = 3;
9cbd06e0 8171 int idx_force = 0;
7e62b792 8172 char *force = NULL;
9cbd06e0
DA
8173
8174 if (argv_find(argv, argc, "force", &idx_force))
7e62b792 8175 force = argv[idx_force]->arg;
9cbd06e0 8176
7e62b792
IR
8177 return peer_maximum_prefix_set_vty(
8178 vty, argv[idx_peer]->arg, bgp_node_afi(vty), bgp_node_safi(vty),
8179 argv[idx_number]->arg, NULL, 1, NULL, force);
718e3744 8180}
8181
d62a17ae 8182ALIAS_HIDDEN(
8183 neighbor_maximum_prefix_warning,
8184 neighbor_maximum_prefix_warning_hidden_cmd,
9cbd06e0 8185 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix (1-4294967295) warning-only [force]",
d62a17ae 8186 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
8187 "Maximum number of prefix accept from this peer\n"
8188 "maximum no. of prefix limit\n"
9cbd06e0
DA
8189 "Only give warning message when limit is exceeded\n"
8190 "Force checking all received routes not only accepted\n")
596c17ba 8191
1d80f243
IR
8192DEFUN (neighbor_maximum_prefix_threshold_warning,
8193 neighbor_maximum_prefix_threshold_warning_cmd,
8194 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix (1-4294967295) (1-100) warning-only [force]",
8195 NEIGHBOR_STR
8196 NEIGHBOR_ADDR_STR2
8197 "Maximum number of prefix accept from this peer\n"
8198 "maximum no. of prefix limit\n"
8199 "Threshold value (%) at which to generate a warning msg\n"
8200 "Only give warning message when limit is exceeded\n"
8201 "Force checking all received routes not only accepted\n")
e0701b79 8202{
d62a17ae 8203 int idx_peer = 1;
8204 int idx_number = 3;
8205 int idx_number_2 = 4;
9cbd06e0 8206 int idx_force = 0;
7e62b792 8207 char *force = NULL;
9cbd06e0
DA
8208
8209 if (argv_find(argv, argc, "force", &idx_force))
7e62b792 8210 force = argv[idx_force]->arg;
9cbd06e0 8211
7e62b792
IR
8212 return peer_maximum_prefix_set_vty(
8213 vty, argv[idx_peer]->arg, bgp_node_afi(vty), bgp_node_safi(vty),
8214 argv[idx_number]->arg, argv[idx_number_2]->arg, 1, NULL, force);
0a486e5f 8215}
8216
d62a17ae 8217ALIAS_HIDDEN(
8218 neighbor_maximum_prefix_threshold_warning,
8219 neighbor_maximum_prefix_threshold_warning_hidden_cmd,
9cbd06e0 8220 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix (1-4294967295) (1-100) warning-only [force]",
d62a17ae 8221 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
8222 "Maximum number of prefix accept from this peer\n"
8223 "maximum no. of prefix limit\n"
8224 "Threshold value (%) at which to generate a warning msg\n"
9cbd06e0
DA
8225 "Only give warning message when limit is exceeded\n"
8226 "Force checking all received routes not only accepted\n")
596c17ba 8227
1d80f243
IR
8228DEFUN (neighbor_maximum_prefix_restart,
8229 neighbor_maximum_prefix_restart_cmd,
8230 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix (1-4294967295) restart (1-65535) [force]",
8231 NEIGHBOR_STR
8232 NEIGHBOR_ADDR_STR2
8233 "Maximum number of prefix accept from this peer\n"
8234 "maximum no. of prefix limit\n"
8235 "Restart bgp connection after limit is exceeded\n"
8236 "Restart interval in minutes\n"
8237 "Force checking all received routes not only accepted\n")
0a486e5f 8238{
d62a17ae 8239 int idx_peer = 1;
8240 int idx_number = 3;
8241 int idx_number_2 = 5;
9cbd06e0 8242 int idx_force = 0;
7e62b792 8243 char *force = NULL;
9cbd06e0
DA
8244
8245 if (argv_find(argv, argc, "force", &idx_force))
7e62b792 8246 force = argv[idx_force]->arg;
9cbd06e0 8247
7e62b792
IR
8248 return peer_maximum_prefix_set_vty(
8249 vty, argv[idx_peer]->arg, bgp_node_afi(vty), bgp_node_safi(vty),
8250 argv[idx_number]->arg, NULL, 0, argv[idx_number_2]->arg, force);
0a486e5f 8251}
8252
d62a17ae 8253ALIAS_HIDDEN(
8254 neighbor_maximum_prefix_restart,
8255 neighbor_maximum_prefix_restart_hidden_cmd,
9cbd06e0 8256 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix (1-4294967295) restart (1-65535) [force]",
d62a17ae 8257 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
8258 "Maximum number of prefix accept from this peer\n"
8259 "maximum no. of prefix limit\n"
8260 "Restart bgp connection after limit is exceeded\n"
9cbd06e0
DA
8261 "Restart interval in minutes\n"
8262 "Force checking all received routes not only accepted\n")
596c17ba 8263
1d80f243
IR
8264DEFUN (neighbor_maximum_prefix_threshold_restart,
8265 neighbor_maximum_prefix_threshold_restart_cmd,
8266 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix (1-4294967295) (1-100) restart (1-65535) [force]",
8267 NEIGHBOR_STR
8268 NEIGHBOR_ADDR_STR2
8269 "Maximum number of prefixes to accept from this peer\n"
8270 "maximum no. of prefix limit\n"
8271 "Threshold value (%) at which to generate a warning msg\n"
8272 "Restart bgp connection after limit is exceeded\n"
8273 "Restart interval in minutes\n"
8274 "Force checking all received routes not only accepted\n")
0a486e5f 8275{
d62a17ae 8276 int idx_peer = 1;
8277 int idx_number = 3;
8278 int idx_number_2 = 4;
8279 int idx_number_3 = 6;
9cbd06e0 8280 int idx_force = 0;
7e62b792 8281 char *force = NULL;
9cbd06e0
DA
8282
8283 if (argv_find(argv, argc, "force", &idx_force))
7e62b792 8284 force = argv[idx_force]->arg;
9cbd06e0 8285
7e62b792
IR
8286 return peer_maximum_prefix_set_vty(
8287 vty, argv[idx_peer]->arg, bgp_node_afi(vty), bgp_node_safi(vty),
8288 argv[idx_number]->arg, argv[idx_number_2]->arg, 0,
8289 argv[idx_number_3]->arg, force);
d62a17ae 8290}
8291
8292ALIAS_HIDDEN(
8293 neighbor_maximum_prefix_threshold_restart,
8294 neighbor_maximum_prefix_threshold_restart_hidden_cmd,
9cbd06e0 8295 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix (1-4294967295) (1-100) restart (1-65535) [force]",
d62a17ae 8296 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
8297 "Maximum number of prefixes to accept from this peer\n"
8298 "maximum no. of prefix limit\n"
8299 "Threshold value (%) at which to generate a warning msg\n"
8300 "Restart bgp connection after limit is exceeded\n"
9cbd06e0
DA
8301 "Restart interval in minutes\n"
8302 "Force checking all received routes not only accepted\n")
596c17ba 8303
1d80f243
IR
8304DEFUN (no_neighbor_maximum_prefix,
8305 no_neighbor_maximum_prefix_cmd,
8306 "no neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix [(1-4294967295) [(1-100)] [restart (1-65535)] [warning-only] [force]]",
8307 NO_STR
8308 NEIGHBOR_STR
8309 NEIGHBOR_ADDR_STR2
8310 "Maximum number of prefixes to accept from this peer\n"
8311 "maximum no. of prefix limit\n"
8312 "Threshold value (%) at which to generate a warning msg\n"
8313 "Restart bgp connection after limit is exceeded\n"
8314 "Restart interval in minutes\n"
8315 "Only give warning message when limit is exceeded\n"
8316 "Force checking all received routes not only accepted\n")
718e3744 8317{
d62a17ae 8318 int idx_peer = 2;
7e62b792
IR
8319 return peer_maximum_prefix_unset_vty(vty, argv[idx_peer]->arg,
8320 bgp_node_afi(vty),
8321 bgp_node_safi(vty));
718e3744 8322}
e52702f2 8323
d62a17ae 8324ALIAS_HIDDEN(
8325 no_neighbor_maximum_prefix, no_neighbor_maximum_prefix_hidden_cmd,
9cbd06e0 8326 "no neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix [(1-4294967295) [(1-100)] [restart (1-65535)] [warning-only] [force]]",
d62a17ae 8327 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
8328 "Maximum number of prefixes to accept from this peer\n"
8329 "maximum no. of prefix limit\n"
8330 "Threshold value (%) at which to generate a warning msg\n"
8331 "Restart bgp connection after limit is exceeded\n"
8332 "Restart interval in minutes\n"
9cbd06e0
DA
8333 "Only give warning message when limit is exceeded\n"
8334 "Force checking all received routes not only accepted\n")
596c17ba 8335
46dbf9d0
DA
8336/* "neighbor accept-own" */
8337DEFPY (neighbor_accept_own,
8338 neighbor_accept_own_cmd,
8339 "[no$no] neighbor <A.B.C.D|X:X::X:X|WORD>$neighbor accept-own",
8340 NO_STR
8341 NEIGHBOR_STR
8342 NEIGHBOR_ADDR_STR2
8343 "Enable handling of self-originated VPN routes containing ACCEPT_OWN community\n")
8344{
8345 struct peer *peer;
8346 afi_t afi = bgp_node_afi(vty);
8347 safi_t safi = bgp_node_safi(vty);
8348 int ret;
8349
8350 peer = peer_and_group_lookup_vty(vty, neighbor);
8351 if (!peer)
8352 return CMD_WARNING_CONFIG_FAILED;
8353
8354 if (no)
8355 ret = peer_af_flag_unset(peer, afi, safi, PEER_FLAG_ACCEPT_OWN);
8356 else
8357 ret = peer_af_flag_set(peer, afi, safi, PEER_FLAG_ACCEPT_OWN);
8358
8359 return bgp_vty_return(vty, ret);
8360}
8361
01da2d26
DA
8362/* "neighbor soo" */
8363DEFPY (neighbor_soo,
8364 neighbor_soo_cmd,
8365 "neighbor <A.B.C.D|X:X::X:X|WORD>$neighbor soo ASN:NN_OR_IP-ADDRESS:NN$soo",
8366 NEIGHBOR_STR
8367 NEIGHBOR_ADDR_STR2
8368 "Set the Site-of-Origin (SoO) extended community\n"
8369 "VPN extended community\n")
8370{
8371 struct peer *peer;
8372 afi_t afi = bgp_node_afi(vty);
8373 safi_t safi = bgp_node_safi(vty);
8374 struct ecommunity *ecomm_soo;
8375
8376 peer = peer_and_group_lookup_vty(vty, neighbor);
8377 if (!peer)
8378 return CMD_WARNING_CONFIG_FAILED;
8379
8380 ecomm_soo = ecommunity_str2com(soo, ECOMMUNITY_SITE_ORIGIN, 0);
8381 if (!ecomm_soo) {
8382 vty_out(vty, "%% Malformed SoO extended community\n");
8383 return CMD_WARNING;
8384 }
8385 ecommunity_str(ecomm_soo);
8386
8387 if (!ecommunity_match(peer->soo[afi][safi], ecomm_soo)) {
8388 ecommunity_free(&peer->soo[afi][safi]);
8389 peer->soo[afi][safi] = ecomm_soo;
8390 peer_af_flag_unset(peer, afi, safi, PEER_FLAG_SOO);
8391 }
8392
8393 return bgp_vty_return(vty,
8394 peer_af_flag_set(peer, afi, safi, PEER_FLAG_SOO));
8395}
8396
8397DEFPY (no_neighbor_soo,
8398 no_neighbor_soo_cmd,
8399 "no neighbor <A.B.C.D|X:X::X:X|WORD>$neighbor soo [ASN:NN_OR_IP-ADDRESS:NN$soo]",
8400 NO_STR
8401 NEIGHBOR_STR
8402 NEIGHBOR_ADDR_STR2
8403 "Set the Site-of-Origin (SoO) extended community\n"
8404 "VPN extended community\n")
8405{
8406 struct peer *peer;
8407 afi_t afi = bgp_node_afi(vty);
8408 safi_t safi = bgp_node_safi(vty);
8409
8410 peer = peer_and_group_lookup_vty(vty, neighbor);
8411 if (!peer)
8412 return CMD_WARNING_CONFIG_FAILED;
8413
8414 ecommunity_free(&peer->soo[afi][safi]);
8415
8416 return bgp_vty_return(
8417 vty, peer_af_flag_unset(peer, afi, safi, PEER_FLAG_SOO));
8418}
718e3744 8419
718e3744 8420/* "neighbor allowas-in" */
8421DEFUN (neighbor_allowas_in,
8422 neighbor_allowas_in_cmd,
fd8503f5 8423 "neighbor <A.B.C.D|X:X::X:X|WORD> allowas-in [<(1-10)|origin>]",
718e3744 8424 NEIGHBOR_STR
8425 NEIGHBOR_ADDR_STR2
31500417 8426 "Accept as-path with my AS present in it\n"
f79f7a7b 8427 "Number of occurrences of AS number\n"
fd8503f5 8428 "Only accept my AS in the as-path if the route was originated in my AS\n")
718e3744 8429{
d62a17ae 8430 int idx_peer = 1;
8431 int idx_number_origin = 3;
8432 int ret;
8433 int origin = 0;
8434 struct peer *peer;
8435 int allow_num = 0;
8436
8437 peer = peer_and_group_lookup_vty(vty, argv[idx_peer]->arg);
8438 if (!peer)
8439 return CMD_WARNING_CONFIG_FAILED;
8440
8441 if (argc <= idx_number_origin)
8442 allow_num = 3;
8443 else {
8444 if (argv[idx_number_origin]->type == WORD_TKN)
8445 origin = 1;
8446 else
8447 allow_num = atoi(argv[idx_number_origin]->arg);
8448 }
8449
8450 ret = peer_allowas_in_set(peer, bgp_node_afi(vty), bgp_node_safi(vty),
8451 allow_num, origin);
8452
8453 return bgp_vty_return(vty, ret);
8454}
8455
8456ALIAS_HIDDEN(
8457 neighbor_allowas_in, neighbor_allowas_in_hidden_cmd,
8458 "neighbor <A.B.C.D|X:X::X:X|WORD> allowas-in [<(1-10)|origin>]",
8459 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
8460 "Accept as-path with my AS present in it\n"
f79f7a7b 8461 "Number of occurrences of AS number\n"
d62a17ae 8462 "Only accept my AS in the as-path if the route was originated in my AS\n")
596c17ba 8463
718e3744 8464DEFUN (no_neighbor_allowas_in,
8465 no_neighbor_allowas_in_cmd,
fd8503f5 8466 "no neighbor <A.B.C.D|X:X::X:X|WORD> allowas-in [<(1-10)|origin>]",
718e3744 8467 NO_STR
8468 NEIGHBOR_STR
8469 NEIGHBOR_ADDR_STR2
8334fd5a 8470 "allow local ASN appears in aspath attribute\n"
f79f7a7b 8471 "Number of occurrences of AS number\n"
fd8503f5 8472 "Only accept my AS in the as-path if the route was originated in my AS\n")
718e3744 8473{
d62a17ae 8474 int idx_peer = 2;
8475 int ret;
8476 struct peer *peer;
718e3744 8477
d62a17ae 8478 peer = peer_and_group_lookup_vty(vty, argv[idx_peer]->arg);
8479 if (!peer)
8480 return CMD_WARNING_CONFIG_FAILED;
718e3744 8481
d62a17ae 8482 ret = peer_allowas_in_unset(peer, bgp_node_afi(vty),
8483 bgp_node_safi(vty));
718e3744 8484
d62a17ae 8485 return bgp_vty_return(vty, ret);
718e3744 8486}
6b0655a2 8487
d62a17ae 8488ALIAS_HIDDEN(
8489 no_neighbor_allowas_in, no_neighbor_allowas_in_hidden_cmd,
8490 "no neighbor <A.B.C.D|X:X::X:X|WORD> allowas-in [<(1-10)|origin>]",
8491 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
8492 "allow local ASN appears in aspath attribute\n"
f79f7a7b 8493 "Number of occurrences of AS number\n"
d62a17ae 8494 "Only accept my AS in the as-path if the route was originated in my AS\n")
596c17ba 8495
28c6e247
IR
8496DEFUN (neighbor_ttl_security,
8497 neighbor_ttl_security_cmd,
8498 "neighbor <A.B.C.D|X:X::X:X|WORD> ttl-security hops (1-254)",
8499 NEIGHBOR_STR
8500 NEIGHBOR_ADDR_STR2
8501 "BGP ttl-security parameters\n"
8502 "Specify the maximum number of hops to the BGP peer\n"
8503 "Number of hops to BGP peer\n")
fa411a21 8504{
d62a17ae 8505 int idx_peer = 1;
8506 int idx_number = 4;
28c6e247
IR
8507 struct peer *peer;
8508 int gtsm_hops;
d62a17ae 8509
28c6e247
IR
8510 peer = peer_and_group_lookup_vty(vty, argv[idx_peer]->arg);
8511 if (!peer)
d62a17ae 8512 return CMD_WARNING_CONFIG_FAILED;
8513
28c6e247
IR
8514 gtsm_hops = strtoul(argv[idx_number]->arg, NULL, 10);
8515
8516 /*
8517 * If 'neighbor swpX', then this is for directly connected peers,
8518 * we should not accept a ttl-security hops value greater than 1.
8519 */
8520 if (peer->conf_if && (gtsm_hops > BGP_GTSM_HOPS_CONNECTED)) {
8521 vty_out(vty,
8522 "%s is directly connected peer, hops cannot exceed 1\n",
8523 argv[idx_peer]->arg);
8524 return CMD_WARNING_CONFIG_FAILED;
8525 }
7ebe625c 8526
28c6e247 8527 return bgp_vty_return(vty, peer_ttl_security_hops_set(peer, gtsm_hops));
fa411a21
NH
8528}
8529
1d80f243
IR
8530DEFUN (no_neighbor_ttl_security,
8531 no_neighbor_ttl_security_cmd,
8532 "no neighbor <A.B.C.D|X:X::X:X|WORD> ttl-security hops (1-254)",
8533 NO_STR
8534 NEIGHBOR_STR
8535 NEIGHBOR_ADDR_STR2
8536 "BGP ttl-security parameters\n"
8537 "Specify the maximum number of hops to the BGP peer\n"
8538 "Number of hops to BGP peer\n")
fa411a21 8539{
d62a17ae 8540 int idx_peer = 2;
28c6e247 8541 struct peer *peer;
fa411a21 8542
28c6e247
IR
8543 peer = peer_and_group_lookup_vty(vty, argv[idx_peer]->arg);
8544 if (!peer)
d62a17ae 8545 return CMD_WARNING_CONFIG_FAILED;
fa411a21 8546
28c6e247 8547 return bgp_vty_return(vty, peer_ttl_security_hops_unset(peer));
fa411a21 8548}
6b0655a2 8549
7c0e4312
DA
8550/* disable-addpath-rx */
8551DEFUN(neighbor_disable_addpath_rx,
8552 neighbor_disable_addpath_rx_cmd,
8553 "neighbor <A.B.C.D|X:X::X:X|WORD> disable-addpath-rx",
8554 NEIGHBOR_STR
8555 NEIGHBOR_ADDR_STR2
8556 "Do not accept additional paths\n")
8557{
8558 char *peer_str = argv[1]->arg;
8559 struct peer *peer;
8560 afi_t afi = bgp_node_afi(vty);
8561 safi_t safi = bgp_node_safi(vty);
8562
8563 peer = peer_and_group_lookup_vty(vty, peer_str);
8564 if (!peer)
8565 return CMD_WARNING_CONFIG_FAILED;
8566
8567 return peer_af_flag_set_vty(vty, peer_str, afi, safi,
8568 PEER_FLAG_DISABLE_ADDPATH_RX);
8569}
8570
8571DEFUN(no_neighbor_disable_addpath_rx,
8572 no_neighbor_disable_addpath_rx_cmd,
8573 "no neighbor <A.B.C.D|X:X::X:X|WORD> disable-addpath-rx",
8574 NO_STR
8575 NEIGHBOR_STR
8576 NEIGHBOR_ADDR_STR2
8577 "Do not accept additional paths\n")
8578{
8579 char *peer_str = argv[2]->arg;
8580 struct peer *peer;
8581 afi_t afi = bgp_node_afi(vty);
8582 safi_t safi = bgp_node_safi(vty);
8583
8584 peer = peer_and_group_lookup_vty(vty, peer_str);
8585 if (!peer)
8586 return CMD_WARNING_CONFIG_FAILED;
8587
8588 return peer_af_flag_unset_vty(vty, peer_str, afi, safi,
8589 PEER_FLAG_DISABLE_ADDPATH_RX);
8590}
8591
adbac85e
DW
8592DEFUN (neighbor_addpath_tx_all_paths,
8593 neighbor_addpath_tx_all_paths_cmd,
9ccf14f7 8594 "neighbor <A.B.C.D|X:X::X:X|WORD> addpath-tx-all-paths",
adbac85e
DW
8595 NEIGHBOR_STR
8596 NEIGHBOR_ADDR_STR2
8597 "Use addpath to advertise all paths to a neighbor\n")
8598{
d62a17ae 8599 int idx_peer = 1;
8600 struct peer *peer;
adbac85e 8601
d62a17ae 8602 peer = peer_and_group_lookup_vty(vty, argv[idx_peer]->arg);
8603 if (!peer)
8604 return CMD_WARNING_CONFIG_FAILED;
adbac85e 8605
dcc68b5e
MS
8606 bgp_addpath_set_peer_type(peer, bgp_node_afi(vty), bgp_node_safi(vty),
8607 BGP_ADDPATH_ALL);
8608 return CMD_SUCCESS;
adbac85e
DW
8609}
8610
d62a17ae 8611ALIAS_HIDDEN(neighbor_addpath_tx_all_paths,
8612 neighbor_addpath_tx_all_paths_hidden_cmd,
8613 "neighbor <A.B.C.D|X:X::X:X|WORD> addpath-tx-all-paths",
8614 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
8615 "Use addpath to advertise all paths to a neighbor\n")
596c17ba 8616
adbac85e
DW
8617DEFUN (no_neighbor_addpath_tx_all_paths,
8618 no_neighbor_addpath_tx_all_paths_cmd,
9ccf14f7 8619 "no neighbor <A.B.C.D|X:X::X:X|WORD> addpath-tx-all-paths",
adbac85e
DW
8620 NO_STR
8621 NEIGHBOR_STR
8622 NEIGHBOR_ADDR_STR2
8623 "Use addpath to advertise all paths to a neighbor\n")
8624{
d62a17ae 8625 int idx_peer = 2;
dcc68b5e
MS
8626 struct peer *peer;
8627
8628 peer = peer_and_group_lookup_vty(vty, argv[idx_peer]->arg);
8629 if (!peer)
8630 return CMD_WARNING_CONFIG_FAILED;
8631
8632 if (peer->addpath_type[bgp_node_afi(vty)][bgp_node_safi(vty)]
8633 != BGP_ADDPATH_ALL) {
8634 vty_out(vty,
8635 "%% Peer not currently configured to transmit all paths.");
8636 return CMD_WARNING_CONFIG_FAILED;
8637 }
8638
8639 bgp_addpath_set_peer_type(peer, bgp_node_afi(vty), bgp_node_safi(vty),
8640 BGP_ADDPATH_NONE);
8641
8642 return CMD_SUCCESS;
adbac85e
DW
8643}
8644
d62a17ae 8645ALIAS_HIDDEN(no_neighbor_addpath_tx_all_paths,
8646 no_neighbor_addpath_tx_all_paths_hidden_cmd,
8647 "no neighbor <A.B.C.D|X:X::X:X|WORD> addpath-tx-all-paths",
8648 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
8649 "Use addpath to advertise all paths to a neighbor\n")
596c17ba 8650
06370dac
DW
8651DEFUN (neighbor_addpath_tx_bestpath_per_as,
8652 neighbor_addpath_tx_bestpath_per_as_cmd,
9ccf14f7 8653 "neighbor <A.B.C.D|X:X::X:X|WORD> addpath-tx-bestpath-per-AS",
06370dac
DW
8654 NEIGHBOR_STR
8655 NEIGHBOR_ADDR_STR2
8656 "Use addpath to advertise the bestpath per each neighboring AS\n")
8657{
d62a17ae 8658 int idx_peer = 1;
8659 struct peer *peer;
06370dac 8660
d62a17ae 8661 peer = peer_and_group_lookup_vty(vty, argv[idx_peer]->arg);
8662 if (!peer)
8663 return CMD_WARNING_CONFIG_FAILED;
06370dac 8664
dcc68b5e
MS
8665 bgp_addpath_set_peer_type(peer, bgp_node_afi(vty), bgp_node_safi(vty),
8666 BGP_ADDPATH_BEST_PER_AS);
8667
8668 return CMD_SUCCESS;
06370dac
DW
8669}
8670
d62a17ae 8671ALIAS_HIDDEN(neighbor_addpath_tx_bestpath_per_as,
8672 neighbor_addpath_tx_bestpath_per_as_hidden_cmd,
8673 "neighbor <A.B.C.D|X:X::X:X|WORD> addpath-tx-bestpath-per-AS",
8674 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
8675 "Use addpath to advertise the bestpath per each neighboring AS\n")
596c17ba 8676
06370dac
DW
8677DEFUN (no_neighbor_addpath_tx_bestpath_per_as,
8678 no_neighbor_addpath_tx_bestpath_per_as_cmd,
9ccf14f7 8679 "no neighbor <A.B.C.D|X:X::X:X|WORD> addpath-tx-bestpath-per-AS",
06370dac
DW
8680 NO_STR
8681 NEIGHBOR_STR
8682 NEIGHBOR_ADDR_STR2
8683 "Use addpath to advertise the bestpath per each neighboring AS\n")
8684{
d62a17ae 8685 int idx_peer = 2;
dcc68b5e
MS
8686 struct peer *peer;
8687
8688 peer = peer_and_group_lookup_vty(vty, argv[idx_peer]->arg);
8689 if (!peer)
8690 return CMD_WARNING_CONFIG_FAILED;
8691
8692 if (peer->addpath_type[bgp_node_afi(vty)][bgp_node_safi(vty)]
8693 != BGP_ADDPATH_BEST_PER_AS) {
8694 vty_out(vty,
8695 "%% Peer not currently configured to transmit all best path per as.");
8696 return CMD_WARNING_CONFIG_FAILED;
8697 }
8698
8699 bgp_addpath_set_peer_type(peer, bgp_node_afi(vty), bgp_node_safi(vty),
8700 BGP_ADDPATH_NONE);
8701
8702 return CMD_SUCCESS;
06370dac
DW
8703}
8704
d62a17ae 8705ALIAS_HIDDEN(no_neighbor_addpath_tx_bestpath_per_as,
8706 no_neighbor_addpath_tx_bestpath_per_as_hidden_cmd,
8707 "no neighbor <A.B.C.D|X:X::X:X|WORD> addpath-tx-bestpath-per-AS",
8708 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
8709 "Use addpath to advertise the bestpath per each neighboring AS\n")
596c17ba 8710
2b31007c
RZ
8711DEFPY(
8712 neighbor_aspath_loop_detection, neighbor_aspath_loop_detection_cmd,
8713 "neighbor <A.B.C.D|X:X::X:X|WORD>$neighbor sender-as-path-loop-detection",
8714 NEIGHBOR_STR
8715 NEIGHBOR_ADDR_STR2
8716 "Detect AS loops before sending to neighbor\n")
8717{
8718 struct peer *peer;
8719
8720 peer = peer_and_group_lookup_vty(vty, neighbor);
8721 if (!peer)
8722 return CMD_WARNING_CONFIG_FAILED;
8723
8724 peer->as_path_loop_detection = true;
8725
8726 return CMD_SUCCESS;
8727}
8728
8729DEFPY(
8730 no_neighbor_aspath_loop_detection,
8731 no_neighbor_aspath_loop_detection_cmd,
8732 "no neighbor <A.B.C.D|X:X::X:X|WORD>$neighbor sender-as-path-loop-detection",
8733 NO_STR
8734 NEIGHBOR_STR
8735 NEIGHBOR_ADDR_STR2
8736 "Detect AS loops before sending to neighbor\n")
8737{
8738 struct peer *peer;
8739
8740 peer = peer_and_group_lookup_vty(vty, neighbor);
8741 if (!peer)
8742 return CMD_WARNING_CONFIG_FAILED;
8743
8744 peer->as_path_loop_detection = false;
8745
8746 return CMD_SUCCESS;
8747}
8748
b9c7bc5a 8749static int set_ecom_list(struct vty *vty, int argc, struct cmd_token **argv,
c6423c31 8750 struct ecommunity **list, bool is_rt6)
ddb5b488 8751{
b9c7bc5a
PZ
8752 struct ecommunity *ecom = NULL;
8753 struct ecommunity *ecomadd;
ddb5b488 8754
b9c7bc5a 8755 for (; argc; --argc, ++argv) {
9a659715
PG
8756 if (is_rt6)
8757 ecomadd = ecommunity_str2com_ipv6(argv[0]->arg,
8758 ECOMMUNITY_ROUTE_TARGET,
8759 0);
8760 else
8761 ecomadd = ecommunity_str2com(argv[0]->arg,
8762 ECOMMUNITY_ROUTE_TARGET,
8763 0);
b9c7bc5a
PZ
8764 if (!ecomadd) {
8765 vty_out(vty, "Malformed community-list value\n");
8766 if (ecom)
8767 ecommunity_free(&ecom);
8768 return CMD_WARNING_CONFIG_FAILED;
8769 }
ddb5b488 8770
b9c7bc5a
PZ
8771 if (ecom) {
8772 ecommunity_merge(ecom, ecomadd);
8773 ecommunity_free(&ecomadd);
8774 } else {
8775 ecom = ecomadd;
8776 }
8777 }
8778
8779 if (*list) {
8780 ecommunity_free(&*list);
ddb5b488 8781 }
b9c7bc5a
PZ
8782 *list = ecom;
8783
8784 return CMD_SUCCESS;
ddb5b488
PZ
8785}
8786
0ca70ba5
DS
8787/*
8788 * v2vimport is true if we are handling a `import vrf ...` command
8789 */
8790static afi_t vpn_policy_getafi(struct vty *vty, struct bgp *bgp, bool v2vimport)
ddb5b488 8791{
0ca70ba5
DS
8792 afi_t afi;
8793
ddb5b488 8794 switch (vty->node) {
b9c7bc5a 8795 case BGP_IPV4_NODE:
0ca70ba5
DS
8796 afi = AFI_IP;
8797 break;
b9c7bc5a 8798 case BGP_IPV6_NODE:
0ca70ba5
DS
8799 afi = AFI_IP6;
8800 break;
ddb5b488
PZ
8801 default:
8802 vty_out(vty,
b9c7bc5a 8803 "%% context error: valid only in address-family <ipv4|ipv6> unicast block\n");
69b07479 8804 return AFI_MAX;
ddb5b488 8805 }
69b07479 8806
0ca70ba5
DS
8807 if (!v2vimport) {
8808 if (CHECK_FLAG(bgp->af_flags[afi][SAFI_UNICAST],
8809 BGP_CONFIG_VRF_TO_VRF_IMPORT)
8810 || CHECK_FLAG(bgp->af_flags[afi][SAFI_UNICAST],
8811 BGP_CONFIG_VRF_TO_VRF_EXPORT)) {
8812 vty_out(vty,
8813 "%% error: Please unconfigure import vrf commands before using vpn commands\n");
8814 return AFI_MAX;
8815 }
8816 } else {
8817 if (CHECK_FLAG(bgp->af_flags[afi][SAFI_UNICAST],
8818 BGP_CONFIG_VRF_TO_MPLSVPN_EXPORT)
8819 || CHECK_FLAG(bgp->af_flags[afi][SAFI_UNICAST],
8820 BGP_CONFIG_MPLSVPN_TO_VRF_IMPORT)) {
8821 vty_out(vty,
8822 "%% error: Please unconfigure vpn to vrf commands before using import vrf commands\n");
8823 return AFI_MAX;
8824 }
8825 }
8826 return afi;
ddb5b488
PZ
8827}
8828
585f1adc
IR
8829DEFPY (af_rd_vpn_export,
8830 af_rd_vpn_export_cmd,
8831 "[no] rd vpn export ASN:NN_OR_IP-ADDRESS:NN$rd_str",
8832 NO_STR
8833 "Specify route distinguisher\n"
8834 "Between current address-family and vpn\n"
8835 "For routes leaked from current address-family to vpn\n"
8836 "Route Distinguisher (<as-number>:<number> | <ip-address>:<number>)\n")
ddb5b488 8837{
585f1adc
IR
8838 VTY_DECLVAR_CONTEXT(bgp, bgp);
8839 struct prefix_rd prd;
8840 int ret;
ddb5b488 8841 afi_t afi;
b9c7bc5a 8842 int idx = 0;
585f1adc 8843 bool yes = true;
b9c7bc5a 8844
585f1adc
IR
8845 if (argv_find(argv, argc, "no", &idx))
8846 yes = false;
ddb5b488 8847
585f1adc
IR
8848 if (yes) {
8849 ret = str2prefix_rd(rd_str, &prd);
8850 if (!ret) {
8851 vty_out(vty, "%% Malformed rd\n");
8852 return CMD_WARNING_CONFIG_FAILED;
8853 }
8854 }
ddb5b488 8855
585f1adc
IR
8856 afi = vpn_policy_getafi(vty, bgp, false);
8857 if (afi == AFI_MAX)
8858 return CMD_WARNING_CONFIG_FAILED;
ddb5b488 8859
585f1adc
IR
8860 /*
8861 * pre-change: un-export vpn routes (vpn->vrf routes unaffected)
8862 */
8863 vpn_leak_prechange(BGP_VPN_POLICY_DIR_TOVPN, afi,
8864 bgp_get_default(), bgp);
ddb5b488 8865
585f1adc
IR
8866 if (yes) {
8867 bgp->vpn_policy[afi].tovpn_rd = prd;
8868 SET_FLAG(bgp->vpn_policy[afi].flags,
8869 BGP_VPN_POLICY_TOVPN_RD_SET);
8870 } else {
8871 UNSET_FLAG(bgp->vpn_policy[afi].flags,
8872 BGP_VPN_POLICY_TOVPN_RD_SET);
8873 }
69b07479 8874
585f1adc
IR
8875 /* post-change: re-export vpn routes */
8876 vpn_leak_postchange(BGP_VPN_POLICY_DIR_TOVPN, afi,
8877 bgp_get_default(), bgp);
8878
8879 return CMD_SUCCESS;
ddb5b488
PZ
8880}
8881
b9c7bc5a
PZ
8882ALIAS (af_rd_vpn_export,
8883 af_no_rd_vpn_export_cmd,
8884 "no rd vpn export",
ddb5b488 8885 NO_STR
b9c7bc5a
PZ
8886 "Specify route distinguisher\n"
8887 "Between current address-family and vpn\n"
8888 "For routes leaked from current address-family to vpn\n")
ddb5b488 8889
b9c7bc5a
PZ
8890DEFPY (af_label_vpn_export,
8891 af_label_vpn_export_cmd,
e70e9f8e 8892 "[no] label vpn export <(0-1048575)$label_val|auto$label_auto>",
b9c7bc5a 8893 NO_STR
ddb5b488 8894 "label value for VRF\n"
b9c7bc5a
PZ
8895 "Between current address-family and vpn\n"
8896 "For routes leaked from current address-family to vpn\n"
e70e9f8e
PZ
8897 "Label Value <0-1048575>\n"
8898 "Automatically assign a label\n")
ddb5b488
PZ
8899{
8900 VTY_DECLVAR_CONTEXT(bgp, bgp);
b9c7bc5a 8901 mpls_label_t label = MPLS_LABEL_NONE;
ddb5b488 8902 afi_t afi;
b9c7bc5a 8903 int idx = 0;
c6423c31 8904 bool yes = true;
b9c7bc5a
PZ
8905
8906 if (argv_find(argv, argc, "no", &idx))
c6423c31 8907 yes = false;
ddb5b488 8908
21a16cc2
PZ
8909 /* If "no ...", squash trailing parameter */
8910 if (!yes)
8911 label_auto = NULL;
8912
e70e9f8e
PZ
8913 if (yes) {
8914 if (!label_auto)
8915 label = label_val; /* parser should force unsigned */
8916 }
ddb5b488 8917
0ca70ba5 8918 afi = vpn_policy_getafi(vty, bgp, false);
69b07479
DS
8919 if (afi == AFI_MAX)
8920 return CMD_WARNING_CONFIG_FAILED;
e70e9f8e 8921
e70e9f8e 8922
69b07479
DS
8923 if (label_auto && CHECK_FLAG(bgp->vpn_policy[afi].flags,
8924 BGP_VPN_POLICY_TOVPN_LABEL_AUTO))
8925 /* no change */
8926 return CMD_SUCCESS;
e70e9f8e 8927
69b07479
DS
8928 /*
8929 * pre-change: un-export vpn routes (vpn->vrf routes unaffected)
8930 */
8931 vpn_leak_prechange(BGP_VPN_POLICY_DIR_TOVPN, afi,
8932 bgp_get_default(), bgp);
8933
8934 if (!label_auto && CHECK_FLAG(bgp->vpn_policy[afi].flags,
8935 BGP_VPN_POLICY_TOVPN_LABEL_AUTO)) {
8936
8937 if (bgp->vpn_policy[afi].tovpn_label != MPLS_LABEL_NONE) {
8938
8939 /*
8940 * label has previously been automatically
8941 * assigned by labelpool: release it
8942 *
8943 * NB if tovpn_label == MPLS_LABEL_NONE it
8944 * means the automatic assignment is in flight
8945 * and therefore the labelpool callback must
8946 * detect that the auto label is not needed.
8947 */
8948
8949 bgp_lp_release(LP_TYPE_VRF,
8950 &bgp->vpn_policy[afi],
8951 bgp->vpn_policy[afi].tovpn_label);
e70e9f8e 8952 }
69b07479
DS
8953 UNSET_FLAG(bgp->vpn_policy[afi].flags,
8954 BGP_VPN_POLICY_TOVPN_LABEL_AUTO);
8955 }
ddb5b488 8956
69b07479
DS
8957 bgp->vpn_policy[afi].tovpn_label = label;
8958 if (label_auto) {
8959 SET_FLAG(bgp->vpn_policy[afi].flags,
8960 BGP_VPN_POLICY_TOVPN_LABEL_AUTO);
8961 bgp_lp_get(LP_TYPE_VRF, &bgp->vpn_policy[afi],
8962 vpn_leak_label_callback);
ddb5b488
PZ
8963 }
8964
69b07479
DS
8965 /* post-change: re-export vpn routes */
8966 vpn_leak_postchange(BGP_VPN_POLICY_DIR_TOVPN, afi,
8967 bgp_get_default(), bgp);
8968
0d020cd6 8969 hook_call(bgp_snmp_update_last_changed, bgp);
ddb5b488
PZ
8970 return CMD_SUCCESS;
8971}
8972
b72c9e14
HS
8973DEFPY (af_sid_vpn_export,
8974 af_sid_vpn_export_cmd,
46279a11 8975 "[no] sid vpn export <(1-1048575)$sid_idx|auto$sid_auto>",
b72c9e14
HS
8976 NO_STR
8977 "sid value for VRF\n"
8978 "Between current address-family and vpn\n"
8979 "For routes leaked from current address-family to vpn\n"
8980 "Sid allocation index\n"
8981 "Automatically assign a label\n")
8982{
8983 VTY_DECLVAR_CONTEXT(bgp, bgp);
8984 afi_t afi;
8985 int debug = 0;
8986 int idx = 0;
8987 bool yes = true;
8988
8989 if (argv_find(argv, argc, "no", &idx))
8990 yes = false;
8991 debug = (BGP_DEBUG(vpn, VPN_LEAK_TO_VRF) |
8992 BGP_DEBUG(vpn, VPN_LEAK_FROM_VRF));
8993
8994 afi = vpn_policy_getafi(vty, bgp, false);
8995 if (afi == AFI_MAX)
8996 return CMD_WARNING_CONFIG_FAILED;
8997
8998 if (!yes) {
8999 /* implement me */
4d4c404b 9000 vty_out(vty, "It's not implemented\n");
b72c9e14
HS
9001 return CMD_WARNING_CONFIG_FAILED;
9002 }
9003
527588aa
CS
9004 if (bgp->tovpn_sid_index != 0 ||
9005 CHECK_FLAG(bgp->vrf_flags, BGP_VRF_TOVPN_SID_AUTO)) {
9006 vty_out(vty,
9007 "per-vrf sid and per-af sid are mutually exclusive\n"
9008 "Failed: per-vrf sid is configured. Remove per-vrf sid before configuring per-af sid\n");
9009 return CMD_WARNING_CONFIG_FAILED;
9010 }
9011
b72c9e14
HS
9012 /* skip when it's already configured */
9013 if ((sid_idx != 0 && bgp->vpn_policy[afi].tovpn_sid_index != 0)
9014 || (sid_auto && CHECK_FLAG(bgp->vpn_policy[afi].flags,
9015 BGP_VPN_POLICY_TOVPN_SID_AUTO)))
9016 return CMD_SUCCESS;
9017
7de4c885
HS
9018 /*
9019 * mode change between sid_idx and sid_auto isn't supported.
9020 * user must negate sid vpn export when they want to change the mode
9021 */
b72c9e14
HS
9022 if ((sid_auto && bgp->vpn_policy[afi].tovpn_sid_index != 0)
9023 || (sid_idx != 0 && CHECK_FLAG(bgp->vpn_policy[afi].flags,
9024 BGP_VPN_POLICY_TOVPN_SID_AUTO))) {
9025 vty_out(vty, "it's already configured as %s.\n",
9026 sid_auto ? "auto-mode" : "idx-mode");
9027 return CMD_WARNING_CONFIG_FAILED;
9028 }
9029
9030 /* pre-change */
9031 vpn_leak_prechange(BGP_VPN_POLICY_DIR_TOVPN, afi,
9032 bgp_get_default(), bgp);
9033
9034 if (sid_auto) {
9035 /* SID allocation auto-mode */
9036 if (debug)
9037 zlog_debug("%s: auto sid alloc.", __func__);
9038 SET_FLAG(bgp->vpn_policy[afi].flags,
9039 BGP_VPN_POLICY_TOVPN_SID_AUTO);
9040 } else {
9041 /* SID allocation index-mode */
9042 if (debug)
9043 zlog_debug("%s: idx %ld sid alloc.", __func__, sid_idx);
9044 bgp->vpn_policy[afi].tovpn_sid_index = sid_idx;
9045 }
9046
9047 /* post-change */
9048 vpn_leak_postchange(BGP_VPN_POLICY_DIR_TOVPN, afi,
9049 bgp_get_default(), bgp);
9050 return CMD_SUCCESS;
9051}
9052
527588aa
CS
9053DEFPY (bgp_sid_vpn_export,
9054 bgp_sid_vpn_export_cmd,
9055 "[no] sid vpn per-vrf export <(1-255)$sid_idx|auto$sid_auto>",
9056 NO_STR
9057 "sid value for VRF\n"
9058 "Between current vrf and vpn\n"
9059 "sid per-VRF (both IPv4 and IPv6 address families)\n"
9060 "For routes leaked from current vrf to vpn\n"
9061 "Sid allocation index\n"
9062 "Automatically assign a label\n")
9063{
9064 VTY_DECLVAR_CONTEXT(bgp, bgp);
9065 int debug;
9066
9067 debug = (BGP_DEBUG(vpn, VPN_LEAK_TO_VRF) |
9068 BGP_DEBUG(vpn, VPN_LEAK_FROM_VRF));
9069
9070 if (no) {
e606d8ec
CS
9071 /* when per-VRF SID is not set, do nothing */
9072 if (bgp->tovpn_sid_index == 0 &&
9073 !CHECK_FLAG(bgp->vrf_flags, BGP_VRF_TOVPN_SID_AUTO))
9074 return CMD_SUCCESS;
9075
9076 sid_idx = 0;
9077 sid_auto = false;
9078 bgp->tovpn_sid_index = 0;
9079 UNSET_FLAG(bgp->vrf_flags, BGP_VRF_TOVPN_SID_AUTO);
527588aa
CS
9080 }
9081
9082 if (bgp->vpn_policy[AFI_IP].tovpn_sid_index != 0 ||
9083 CHECK_FLAG(bgp->vpn_policy[AFI_IP].flags,
9084 BGP_VPN_POLICY_TOVPN_SID_AUTO) ||
9085 bgp->vpn_policy[AFI_IP6].tovpn_sid_index != 0 ||
9086 CHECK_FLAG(bgp->vpn_policy[AFI_IP6].flags,
9087 BGP_VPN_POLICY_TOVPN_SID_AUTO)) {
9088 vty_out(vty,
9089 "per-vrf sid and per-af sid are mutually exclusive\n"
9090 "Failed: per-af sid is configured. Remove per-af sid before configuring per-vrf sid\n");
9091 return CMD_WARNING_CONFIG_FAILED;
9092 }
9093
9094 /* skip when it's already configured */
9095 if ((sid_idx != 0 && bgp->tovpn_sid_index != 0) ||
9096 (sid_auto && CHECK_FLAG(bgp->vrf_flags, BGP_VRF_TOVPN_SID_AUTO)))
9097 return CMD_SUCCESS;
9098
9099 /*
9100 * mode change between sid_idx and sid_auto isn't supported.
9101 * user must negate sid vpn export when they want to change the mode
9102 */
9103 if ((sid_auto && bgp->tovpn_sid_index != 0) ||
9104 (sid_idx != 0 &&
9105 CHECK_FLAG(bgp->vrf_flags, BGP_VRF_TOVPN_SID_AUTO))) {
9106 vty_out(vty, "it's already configured as %s.\n",
9107 sid_auto ? "auto-mode" : "idx-mode");
9108 return CMD_WARNING_CONFIG_FAILED;
9109 }
9110
9111 /* pre-change */
9112 vpn_leak_prechange(BGP_VPN_POLICY_DIR_TOVPN, AFI_IP, bgp_get_default(),
9113 bgp);
9114 vpn_leak_prechange(BGP_VPN_POLICY_DIR_TOVPN, AFI_IP6, bgp_get_default(),
9115 bgp);
9116
9117 if (sid_auto) {
9118 /* SID allocation auto-mode */
9119 if (debug)
9120 zlog_debug("%s: auto per-vrf sid alloc.", __func__);
9121 SET_FLAG(bgp->vrf_flags, BGP_VRF_TOVPN_SID_AUTO);
e606d8ec 9122 } else if (sid_idx != 0) {
527588aa
CS
9123 /* SID allocation index-mode */
9124 if (debug)
9125 zlog_debug("%s: idx %ld per-vrf sid alloc.", __func__,
9126 sid_idx);
9127 bgp->tovpn_sid_index = sid_idx;
9128 }
9129
9130 /* post-change */
9131 vpn_leak_postchange(BGP_VPN_POLICY_DIR_TOVPN, AFI_IP, bgp_get_default(),
9132 bgp);
9133 vpn_leak_postchange(BGP_VPN_POLICY_DIR_TOVPN, AFI_IP6,
9134 bgp_get_default(), bgp);
9135
9136 return CMD_SUCCESS;
9137}
9138
b9c7bc5a
PZ
9139ALIAS (af_label_vpn_export,
9140 af_no_label_vpn_export_cmd,
9141 "no label vpn export",
9142 NO_STR
9143 "label value for VRF\n"
9144 "Between current address-family and vpn\n"
9145 "For routes leaked from current address-family to vpn\n")
ddb5b488 9146
e606d8ec
CS
9147ALIAS (bgp_sid_vpn_export,
9148 no_bgp_sid_vpn_export_cmd,
9149 "no$no sid vpn per-vrf export",
9150 NO_STR
9151 "sid value for VRF\n"
9152 "Between current vrf and vpn\n"
9153 "sid per-VRF (both IPv4 and IPv6 address families)\n"
9154 "For routes leaked from current vrf to vpn\n")
9155
585f1adc 9156DEFPY (af_nexthop_vpn_export,
b9c7bc5a 9157 af_nexthop_vpn_export_cmd,
8c85ca28 9158 "[no] nexthop vpn export [<A.B.C.D|X:X::X:X>$nexthop_su]",
b9c7bc5a 9159 NO_STR
ddb5b488 9160 "Specify next hop to use for VRF advertised prefixes\n"
b9c7bc5a
PZ
9161 "Between current address-family and vpn\n"
9162 "For routes leaked from current address-family to vpn\n"
ddb5b488
PZ
9163 "IPv4 prefix\n"
9164 "IPv6 prefix\n")
9165{
585f1adc 9166 VTY_DECLVAR_CONTEXT(bgp, bgp);
ddb5b488 9167 afi_t afi;
ddb5b488
PZ
9168 struct prefix p;
9169
8c85ca28
QY
9170 if (!no) {
9171 if (!nexthop_su) {
9172 vty_out(vty, "%% Nexthop required\n");
9173 return CMD_WARNING_CONFIG_FAILED;
9174 }
8c85ca28 9175 if (!sockunion2hostprefix(nexthop_su, &p))
b9c7bc5a
PZ
9176 return CMD_WARNING_CONFIG_FAILED;
9177 }
ddb5b488 9178
585f1adc
IR
9179 afi = vpn_policy_getafi(vty, bgp, false);
9180 if (afi == AFI_MAX)
9181 return CMD_WARNING_CONFIG_FAILED;
ddb5b488 9182
585f1adc
IR
9183 /*
9184 * pre-change: un-export vpn routes (vpn->vrf routes unaffected)
9185 */
9186 vpn_leak_prechange(BGP_VPN_POLICY_DIR_TOVPN, afi,
9187 bgp_get_default(), bgp);
ddb5b488 9188
585f1adc
IR
9189 if (!no) {
9190 bgp->vpn_policy[afi].tovpn_nexthop = p;
9191 SET_FLAG(bgp->vpn_policy[afi].flags,
9192 BGP_VPN_POLICY_TOVPN_NEXTHOP_SET);
9193 } else {
9194 UNSET_FLAG(bgp->vpn_policy[afi].flags,
9195 BGP_VPN_POLICY_TOVPN_NEXTHOP_SET);
9196 }
69b07479 9197
585f1adc
IR
9198 /* post-change: re-export vpn routes */
9199 vpn_leak_postchange(BGP_VPN_POLICY_DIR_TOVPN, afi,
9200 bgp_get_default(), bgp);
37a87b8f 9201
585f1adc 9202 return CMD_SUCCESS;
ddb5b488
PZ
9203}
9204
b9c7bc5a 9205static int vpn_policy_getdirs(struct vty *vty, const char *dstr, int *dodir)
ddb5b488 9206{
b9c7bc5a
PZ
9207 if (!strcmp(dstr, "import")) {
9208 dodir[BGP_VPN_POLICY_DIR_FROMVPN] = 1;
9209 } else if (!strcmp(dstr, "export")) {
9210 dodir[BGP_VPN_POLICY_DIR_TOVPN] = 1;
9211 } else if (!strcmp(dstr, "both")) {
9212 dodir[BGP_VPN_POLICY_DIR_FROMVPN] = 1;
9213 dodir[BGP_VPN_POLICY_DIR_TOVPN] = 1;
9214 } else {
9215 vty_out(vty, "%% direction parse error\n");
9216 return CMD_WARNING_CONFIG_FAILED;
ddb5b488 9217 }
ddb5b488
PZ
9218 return CMD_SUCCESS;
9219}
9220
b9c7bc5a
PZ
9221DEFPY (af_rt_vpn_imexport,
9222 af_rt_vpn_imexport_cmd,
9223 "[no] <rt|route-target> vpn <import|export|both>$direction_str RTLIST...",
9224 NO_STR
9225 "Specify route target list\n"
ddb5b488 9226 "Specify route target list\n"
b9c7bc5a
PZ
9227 "Between current address-family and vpn\n"
9228 "For routes leaked from vpn to current address-family: match any\n"
9229 "For routes leaked from current address-family to vpn: set\n"
9230 "both import: match any and export: set\n"
ddb5b488
PZ
9231 "Space separated route target list (A.B.C.D:MN|EF:OPQR|GHJK:MN)\n")
9232{
9233 VTY_DECLVAR_CONTEXT(bgp, bgp);
9234 int ret;
9235 struct ecommunity *ecom = NULL;
9236 int dodir[BGP_VPN_POLICY_DIR_MAX] = {0};
9c2fd3fe 9237 enum vpn_policy_direction dir;
ddb5b488
PZ
9238 afi_t afi;
9239 int idx = 0;
c6423c31 9240 bool yes = true;
ddb5b488 9241
b9c7bc5a 9242 if (argv_find(argv, argc, "no", &idx))
c6423c31 9243 yes = false;
b9c7bc5a 9244
0ca70ba5 9245 afi = vpn_policy_getafi(vty, bgp, false);
69b07479
DS
9246 if (afi == AFI_MAX)
9247 return CMD_WARNING_CONFIG_FAILED;
ddb5b488 9248
b9c7bc5a 9249 ret = vpn_policy_getdirs(vty, direction_str, dodir);
ddb5b488
PZ
9250 if (ret != CMD_SUCCESS)
9251 return ret;
9252
b9c7bc5a
PZ
9253 if (yes) {
9254 if (!argv_find(argv, argc, "RTLIST", &idx)) {
9255 vty_out(vty, "%% Missing RTLIST\n");
9256 return CMD_WARNING_CONFIG_FAILED;
9257 }
c6423c31 9258 ret = set_ecom_list(vty, argc - idx, argv + idx, &ecom, false);
b9c7bc5a
PZ
9259 if (ret != CMD_SUCCESS) {
9260 return ret;
9261 }
ddb5b488
PZ
9262 }
9263
69b07479
DS
9264 for (dir = 0; dir < BGP_VPN_POLICY_DIR_MAX; ++dir) {
9265 if (!dodir[dir])
ddb5b488 9266 continue;
ddb5b488 9267
69b07479 9268 vpn_leak_prechange(dir, afi, bgp_get_default(), bgp);
ddb5b488 9269
69b07479
DS
9270 if (yes) {
9271 if (bgp->vpn_policy[afi].rtlist[dir])
9272 ecommunity_free(
9273 &bgp->vpn_policy[afi].rtlist[dir]);
9274 bgp->vpn_policy[afi].rtlist[dir] =
9275 ecommunity_dup(ecom);
9276 } else {
9277 if (bgp->vpn_policy[afi].rtlist[dir])
9278 ecommunity_free(
9279 &bgp->vpn_policy[afi].rtlist[dir]);
9280 bgp->vpn_policy[afi].rtlist[dir] = NULL;
ddb5b488 9281 }
69b07479
DS
9282
9283 vpn_leak_postchange(dir, afi, bgp_get_default(), bgp);
ddb5b488 9284 }
69b07479 9285
d555f3e9
PZ
9286 if (ecom)
9287 ecommunity_free(&ecom);
ddb5b488
PZ
9288
9289 return CMD_SUCCESS;
9290}
9291
b9c7bc5a
PZ
9292ALIAS (af_rt_vpn_imexport,
9293 af_no_rt_vpn_imexport_cmd,
9294 "no <rt|route-target> vpn <import|export|both>$direction_str",
ddb5b488
PZ
9295 NO_STR
9296 "Specify route target list\n"
b9c7bc5a
PZ
9297 "Specify route target list\n"
9298 "Between current address-family and vpn\n"
9299 "For routes leaked from vpn to current address-family\n"
9300 "For routes leaked from current address-family to vpn\n"
9301 "both import and export\n")
9302
585f1adc 9303DEFPY (af_route_map_vpn_imexport,
b9c7bc5a
PZ
9304 af_route_map_vpn_imexport_cmd,
9305/* future: "route-map <vpn|evpn|vrf NAME> <import|export> RMAP" */
9306 "[no] route-map vpn <import|export>$direction_str RMAP$rmap_str",
9307 NO_STR
ddb5b488 9308 "Specify route map\n"
b9c7bc5a
PZ
9309 "Between current address-family and vpn\n"
9310 "For routes leaked from vpn to current address-family\n"
9311 "For routes leaked from current address-family to vpn\n"
ddb5b488
PZ
9312 "name of route-map\n")
9313{
585f1adc
IR
9314 VTY_DECLVAR_CONTEXT(bgp, bgp);
9315 int ret;
9316 int dodir[BGP_VPN_POLICY_DIR_MAX] = {0};
9c2fd3fe 9317 enum vpn_policy_direction dir;
ddb5b488 9318 afi_t afi;
ddb5b488 9319 int idx = 0;
585f1adc 9320 bool yes = true;
ddb5b488 9321
585f1adc
IR
9322 if (argv_find(argv, argc, "no", &idx))
9323 yes = false;
ddb5b488 9324
585f1adc
IR
9325 afi = vpn_policy_getafi(vty, bgp, false);
9326 if (afi == AFI_MAX)
9327 return CMD_WARNING_CONFIG_FAILED;
ddb5b488 9328
585f1adc
IR
9329 ret = vpn_policy_getdirs(vty, direction_str, dodir);
9330 if (ret != CMD_SUCCESS)
9331 return ret;
ddb5b488 9332
585f1adc
IR
9333 for (dir = 0; dir < BGP_VPN_POLICY_DIR_MAX; ++dir) {
9334 if (!dodir[dir])
9335 continue;
69b07479 9336
585f1adc
IR
9337 vpn_leak_prechange(dir, afi, bgp_get_default(), bgp);
9338
9339 if (yes) {
9340 if (bgp->vpn_policy[afi].rmap_name[dir])
9341 XFREE(MTYPE_ROUTE_MAP_NAME,
9342 bgp->vpn_policy[afi].rmap_name[dir]);
9343 bgp->vpn_policy[afi].rmap_name[dir] = XSTRDUP(
9344 MTYPE_ROUTE_MAP_NAME, rmap_str);
9345 bgp->vpn_policy[afi].rmap[dir] =
9346 route_map_lookup_warn_noexist(vty, rmap_str);
9347 if (!bgp->vpn_policy[afi].rmap[dir])
9348 return CMD_SUCCESS;
9349 } else {
9350 if (bgp->vpn_policy[afi].rmap_name[dir])
9351 XFREE(MTYPE_ROUTE_MAP_NAME,
9352 bgp->vpn_policy[afi].rmap_name[dir]);
9353 bgp->vpn_policy[afi].rmap_name[dir] = NULL;
9354 bgp->vpn_policy[afi].rmap[dir] = NULL;
9355 }
9356
9357 vpn_leak_postchange(dir, afi, bgp_get_default(), bgp);
9358 }
ddb5b488 9359
585f1adc 9360 return CMD_SUCCESS;
ddb5b488
PZ
9361}
9362
b9c7bc5a
PZ
9363ALIAS (af_route_map_vpn_imexport,
9364 af_no_route_map_vpn_imexport_cmd,
9365 "no route-map vpn <import|export>$direction_str",
ddb5b488
PZ
9366 NO_STR
9367 "Specify route map\n"
b9c7bc5a
PZ
9368 "Between current address-family and vpn\n"
9369 "For routes leaked from vpn to current address-family\n"
9370 "For routes leaked from current address-family to vpn\n")
9371
bb4f6190 9372DEFPY(af_import_vrf_route_map, af_import_vrf_route_map_cmd,
ae6a6fb4 9373 "import vrf route-map RMAP$rmap_str",
bb4f6190
DS
9374 "Import routes from another VRF\n"
9375 "Vrf routes being filtered\n"
9376 "Specify route map\n"
9377 "name of route-map\n")
9378{
9379 VTY_DECLVAR_CONTEXT(bgp, bgp);
9c2fd3fe 9380 enum vpn_policy_direction dir = BGP_VPN_POLICY_DIR_FROMVPN;
bb4f6190 9381 afi_t afi;
bb4f6190
DS
9382 struct bgp *bgp_default;
9383
0ca70ba5 9384 afi = vpn_policy_getafi(vty, bgp, true);
69b07479
DS
9385 if (afi == AFI_MAX)
9386 return CMD_WARNING_CONFIG_FAILED;
bb4f6190
DS
9387
9388 bgp_default = bgp_get_default();
9389 if (!bgp_default) {
9390 int32_t ret;
9391 as_t as = bgp->as;
9392
9393 /* Auto-create assuming the same AS */
5d5393b9
DL
9394 ret = bgp_get_vty(&bgp_default, &as, NULL,
9395 BGP_INSTANCE_TYPE_DEFAULT);
bb4f6190
DS
9396
9397 if (ret) {
9398 vty_out(vty,
9399 "VRF default is not configured as a bgp instance\n");
9400 return CMD_WARNING;
9401 }
9402 }
9403
69b07479 9404 vpn_leak_prechange(dir, afi, bgp_get_default(), bgp);
bb4f6190 9405
ae6a6fb4
DS
9406 if (bgp->vpn_policy[afi].rmap_name[dir])
9407 XFREE(MTYPE_ROUTE_MAP_NAME,
9408 bgp->vpn_policy[afi].rmap_name[dir]);
9409 bgp->vpn_policy[afi].rmap_name[dir] =
9410 XSTRDUP(MTYPE_ROUTE_MAP_NAME, rmap_str);
9411 bgp->vpn_policy[afi].rmap[dir] =
9412 route_map_lookup_warn_noexist(vty, rmap_str);
9413 if (!bgp->vpn_policy[afi].rmap[dir])
9414 return CMD_SUCCESS;
9415
9416 SET_FLAG(bgp->af_flags[afi][SAFI_UNICAST],
9417 BGP_CONFIG_VRF_TO_VRF_IMPORT);
bb4f6190 9418
69b07479
DS
9419 vpn_leak_postchange(dir, afi, bgp_get_default(), bgp);
9420
bb4f6190
DS
9421 return CMD_SUCCESS;
9422}
9423
ae6a6fb4
DS
9424DEFPY(af_no_import_vrf_route_map, af_no_import_vrf_route_map_cmd,
9425 "no import vrf route-map [RMAP$rmap_str]",
bb4f6190
DS
9426 NO_STR
9427 "Import routes from another VRF\n"
9428 "Vrf routes being filtered\n"
ae6a6fb4
DS
9429 "Specify route map\n"
9430 "name of route-map\n")
9431{
9432 VTY_DECLVAR_CONTEXT(bgp, bgp);
9c2fd3fe 9433 enum vpn_policy_direction dir = BGP_VPN_POLICY_DIR_FROMVPN;
ae6a6fb4
DS
9434 afi_t afi;
9435
9436 afi = vpn_policy_getafi(vty, bgp, true);
9437 if (afi == AFI_MAX)
9438 return CMD_WARNING_CONFIG_FAILED;
9439
9440 vpn_leak_prechange(dir, afi, bgp_get_default(), bgp);
9441
9442 if (bgp->vpn_policy[afi].rmap_name[dir])
9443 XFREE(MTYPE_ROUTE_MAP_NAME,
9444 bgp->vpn_policy[afi].rmap_name[dir]);
9445 bgp->vpn_policy[afi].rmap_name[dir] = NULL;
9446 bgp->vpn_policy[afi].rmap[dir] = NULL;
9447
9448 if (bgp->vpn_policy[afi].import_vrf->count == 0)
9449 UNSET_FLAG(bgp->af_flags[afi][SAFI_UNICAST],
9450 BGP_CONFIG_VRF_TO_VRF_IMPORT);
9451
9452 vpn_leak_postchange(dir, afi, bgp_get_default(), bgp);
9453
9454 return CMD_SUCCESS;
9455}
bb4f6190 9456
585f1adc
IR
9457DEFPY(bgp_imexport_vrf, bgp_imexport_vrf_cmd,
9458 "[no] import vrf VIEWVRFNAME$import_name",
9459 NO_STR
9460 "Import routes from another VRF\n"
9461 "VRF to import from\n"
9462 "The name of the VRF\n")
12a844a5 9463{
585f1adc
IR
9464 VTY_DECLVAR_CONTEXT(bgp, bgp);
9465 struct listnode *node;
9466 struct bgp *vrf_bgp, *bgp_default;
9467 int32_t ret = 0;
9468 as_t as = bgp->as;
9469 bool remove = false;
9470 int32_t idx = 0;
9471 char *vname;
9472 enum bgp_instance_type bgp_type = BGP_INSTANCE_TYPE_VRF;
12a844a5
DS
9473 safi_t safi;
9474 afi_t afi;
9475
867f0cca 9476 if (import_name == NULL) {
9477 vty_out(vty, "%% Missing import name\n");
9478 return CMD_WARNING;
9479 }
9480
ae6a6fb4
DS
9481 if (strcmp(import_name, "route-map") == 0) {
9482 vty_out(vty, "%% Must include route-map name\n");
9483 return CMD_WARNING;
9484 }
9485
585f1adc
IR
9486 if (argv_find(argv, argc, "no", &idx))
9487 remove = true;
9488
9489 afi = vpn_policy_getafi(vty, bgp, true);
9490 if (afi == AFI_MAX)
9491 return CMD_WARNING_CONFIG_FAILED;
9492
12a844a5
DS
9493 safi = bgp_node_safi(vty);
9494
585f1adc
IR
9495 if (((BGP_INSTANCE_TYPE_DEFAULT == bgp->inst_type)
9496 && (strcmp(import_name, VRF_DEFAULT_NAME) == 0))
9497 || (bgp->name && (strcmp(import_name, bgp->name) == 0))) {
9498 vty_out(vty, "%% Cannot %s vrf %s into itself\n",
9499 remove ? "unimport" : "import", import_name);
9500 return CMD_WARNING;
9501 }
25679caa 9502
585f1adc
IR
9503 bgp_default = bgp_get_default();
9504 if (!bgp_default) {
9505 /* Auto-create assuming the same AS */
9506 ret = bgp_get_vty(&bgp_default, &as, NULL,
9507 BGP_INSTANCE_TYPE_DEFAULT);
12a844a5 9508
585f1adc
IR
9509 if (ret) {
9510 vty_out(vty,
9511 "VRF default is not configured as a bgp instance\n");
9512 return CMD_WARNING;
9513 }
9514 }
12a844a5 9515
585f1adc
IR
9516 vrf_bgp = bgp_lookup_by_name(import_name);
9517 if (!vrf_bgp) {
9518 if (strcmp(import_name, VRF_DEFAULT_NAME) == 0)
9519 vrf_bgp = bgp_default;
9520 else
9521 /* Auto-create assuming the same AS */
9522 ret = bgp_get_vty(&vrf_bgp, &as, import_name, bgp_type);
9523
9524 if (ret) {
9525 vty_out(vty,
9526 "VRF %s is not configured as a bgp instance\n",
9527 import_name);
9528 return CMD_WARNING;
9529 }
9530 }
9531
9532 if (remove) {
9533 vrf_unimport_from_vrf(bgp, vrf_bgp, afi, safi);
9534 } else {
9535 /* Already importing from "import_vrf"? */
9536 for (ALL_LIST_ELEMENTS_RO(bgp->vpn_policy[afi].import_vrf, node,
9537 vname)) {
9538 if (strcmp(vname, import_name) == 0)
9539 return CMD_WARNING;
9540 }
9541
9542 vrf_import_from_vrf(bgp, vrf_bgp, afi, safi);
9543 }
9544
9545 return CMD_SUCCESS;
12a844a5
DS
9546}
9547
b9c7bc5a 9548/* This command is valid only in a bgp vrf instance or the default instance */
585f1adc 9549DEFPY (bgp_imexport_vpn,
b9c7bc5a
PZ
9550 bgp_imexport_vpn_cmd,
9551 "[no] <import|export>$direction_str vpn",
c7109e09
PZ
9552 NO_STR
9553 "Import routes to this address-family\n"
9554 "Export routes from this address-family\n"
9555 "to/from default instance VPN RIB\n")
ddb5b488 9556{
585f1adc
IR
9557 VTY_DECLVAR_CONTEXT(bgp, bgp);
9558 int previous_state;
37a87b8f 9559 afi_t afi;
585f1adc
IR
9560 safi_t safi;
9561 int idx = 0;
9562 bool yes = true;
9563 int flag;
9c2fd3fe 9564 enum vpn_policy_direction dir;
585f1adc
IR
9565
9566 if (argv_find(argv, argc, "no", &idx))
9567 yes = false;
9568
9569 if (BGP_INSTANCE_TYPE_VRF != bgp->inst_type &&
9570 BGP_INSTANCE_TYPE_DEFAULT != bgp->inst_type) {
9571
9572 vty_out(vty, "%% import|export vpn valid only for bgp vrf or default instance\n");
9573 return CMD_WARNING_CONFIG_FAILED;
9574 }
ddb5b488 9575
b9c7bc5a
PZ
9576 afi = bgp_node_afi(vty);
9577 safi = bgp_node_safi(vty);
585f1adc
IR
9578 if ((SAFI_UNICAST != safi) || ((AFI_IP != afi) && (AFI_IP6 != afi))) {
9579 vty_out(vty, "%% import|export vpn valid only for unicast ipv4|ipv6\n");
9580 return CMD_WARNING_CONFIG_FAILED;
9581 }
ddb5b488 9582
b9c7bc5a 9583 if (!strcmp(direction_str, "import")) {
585f1adc
IR
9584 flag = BGP_CONFIG_MPLSVPN_TO_VRF_IMPORT;
9585 dir = BGP_VPN_POLICY_DIR_FROMVPN;
b9c7bc5a 9586 } else if (!strcmp(direction_str, "export")) {
585f1adc
IR
9587 flag = BGP_CONFIG_VRF_TO_MPLSVPN_EXPORT;
9588 dir = BGP_VPN_POLICY_DIR_TOVPN;
b9c7bc5a
PZ
9589 } else {
9590 vty_out(vty, "%% unknown direction %s\n", direction_str);
9591 return CMD_WARNING_CONFIG_FAILED;
9592 }
9593
585f1adc 9594 previous_state = CHECK_FLAG(bgp->af_flags[afi][safi], flag);
ddb5b488 9595
585f1adc
IR
9596 if (yes) {
9597 SET_FLAG(bgp->af_flags[afi][safi], flag);
9598 if (!previous_state) {
9599 /* trigger export current vrf */
9600 vpn_leak_postchange(dir, afi, bgp_get_default(), bgp);
9601 }
9602 } else {
9603 if (previous_state) {
9604 /* trigger un-export current vrf */
9605 vpn_leak_prechange(dir, afi, bgp_get_default(), bgp);
9606 }
9607 UNSET_FLAG(bgp->af_flags[afi][safi], flag);
9608 }
37a87b8f 9609
1ca2fd11
IR
9610 hook_call(bgp_snmp_init_stats, bgp);
9611
585f1adc 9612 return CMD_SUCCESS;
ddb5b488
PZ
9613}
9614
301ad80a
PG
9615DEFPY (af_routetarget_import,
9616 af_routetarget_import_cmd,
9a659715 9617 "[no] <rt|route-target|route-target6|rt6> redirect import RTLIST...",
301ad80a
PG
9618 NO_STR
9619 "Specify route target list\n"
9620 "Specify route target list\n"
9a659715
PG
9621 "Specify route target list\n"
9622 "Specify route target list\n"
301ad80a
PG
9623 "Flow-spec redirect type route target\n"
9624 "Import routes to this address-family\n"
9a659715 9625 "Space separated route target list (A.B.C.D:MN|EF:OPQR|GHJK:MN|IPV6:MN)\n")
301ad80a
PG
9626{
9627 VTY_DECLVAR_CONTEXT(bgp, bgp);
9628 int ret;
9629 struct ecommunity *ecom = NULL;
301ad80a 9630 afi_t afi;
9a659715 9631 int idx = 0, idx_unused = 0;
c6423c31
PG
9632 bool yes = true;
9633 bool rt6 = false;
301ad80a
PG
9634
9635 if (argv_find(argv, argc, "no", &idx))
c6423c31 9636 yes = false;
301ad80a 9637
9a659715
PG
9638 if (argv_find(argv, argc, "rt6", &idx_unused) ||
9639 argv_find(argv, argc, "route-target6", &idx_unused))
c6423c31 9640 rt6 = true;
301ad80a 9641
0ca70ba5 9642 afi = vpn_policy_getafi(vty, bgp, false);
69b07479
DS
9643 if (afi == AFI_MAX)
9644 return CMD_WARNING_CONFIG_FAILED;
9645
9a659715
PG
9646 if (rt6 && afi != AFI_IP6)
9647 return CMD_WARNING_CONFIG_FAILED;
9648
301ad80a
PG
9649 if (yes) {
9650 if (!argv_find(argv, argc, "RTLIST", &idx)) {
9651 vty_out(vty, "%% Missing RTLIST\n");
9652 return CMD_WARNING_CONFIG_FAILED;
9653 }
9a659715 9654 ret = set_ecom_list(vty, argc - idx, argv + idx, &ecom, rt6);
301ad80a
PG
9655 if (ret != CMD_SUCCESS)
9656 return ret;
9657 }
69b07479
DS
9658
9659 if (yes) {
9660 if (bgp->vpn_policy[afi].import_redirect_rtlist)
9661 ecommunity_free(&bgp->vpn_policy[afi]
301ad80a 9662 .import_redirect_rtlist);
69b07479
DS
9663 bgp->vpn_policy[afi].import_redirect_rtlist =
9664 ecommunity_dup(ecom);
9665 } else {
9666 if (bgp->vpn_policy[afi].import_redirect_rtlist)
9667 ecommunity_free(&bgp->vpn_policy[afi]
301ad80a 9668 .import_redirect_rtlist);
69b07479 9669 bgp->vpn_policy[afi].import_redirect_rtlist = NULL;
301ad80a 9670 }
69b07479 9671
301ad80a
PG
9672 if (ecom)
9673 ecommunity_free(&ecom);
9674
9675 return CMD_SUCCESS;
9676}
9677
505e5056 9678DEFUN_NOSH (address_family_ipv4_safi,
7c40bf39 9679 address_family_ipv4_safi_cmd,
9680 "address-family ipv4 [<unicast|multicast|vpn|labeled-unicast|flowspec>]",
9681 "Enter Address Family command mode\n"
00e6edb9 9682 BGP_AF_STR
7c40bf39 9683 BGP_SAFI_WITH_LABEL_HELP_STR)
718e3744 9684{
f51bae9c 9685
d62a17ae 9686 if (argc == 3) {
585f1adc
IR
9687 VTY_DECLVAR_CONTEXT(bgp, bgp);
9688 safi_t safi = bgp_vty_safi_from_str(argv[2]->text);
9689 if (bgp->inst_type != BGP_INSTANCE_TYPE_DEFAULT
a4d82a8a 9690 && safi != SAFI_UNICAST && safi != SAFI_MULTICAST
9d00a487 9691 && safi != SAFI_EVPN) {
31947174
MK
9692 vty_out(vty,
9693 "Only Unicast/Multicast/EVPN SAFIs supported in non-core instances.\n");
2131d5cf
LB
9694 return CMD_WARNING_CONFIG_FAILED;
9695 }
585f1adc
IR
9696 vty->node = bgp_node_type(AFI_IP, safi);
9697 } else
9698 vty->node = BGP_IPV4_NODE;
718e3744 9699
d62a17ae 9700 return CMD_SUCCESS;
718e3744 9701}
9702
505e5056 9703DEFUN_NOSH (address_family_ipv6_safi,
7c40bf39 9704 address_family_ipv6_safi_cmd,
9705 "address-family ipv6 [<unicast|multicast|vpn|labeled-unicast|flowspec>]",
9706 "Enter Address Family command mode\n"
00e6edb9 9707 BGP_AF_STR
7c40bf39 9708 BGP_SAFI_WITH_LABEL_HELP_STR)
25ffbdc1 9709{
d62a17ae 9710 if (argc == 3) {
585f1adc
IR
9711 VTY_DECLVAR_CONTEXT(bgp, bgp);
9712 safi_t safi = bgp_vty_safi_from_str(argv[2]->text);
9713 if (bgp->inst_type != BGP_INSTANCE_TYPE_DEFAULT
a4d82a8a 9714 && safi != SAFI_UNICAST && safi != SAFI_MULTICAST
9d00a487 9715 && safi != SAFI_EVPN) {
31947174
MK
9716 vty_out(vty,
9717 "Only Unicast/Multicast/EVPN SAFIs supported in non-core instances.\n");
2131d5cf
LB
9718 return CMD_WARNING_CONFIG_FAILED;
9719 }
585f1adc
IR
9720 vty->node = bgp_node_type(AFI_IP6, safi);
9721 } else
9722 vty->node = BGP_IPV6_NODE;
25ffbdc1 9723
d62a17ae 9724 return CMD_SUCCESS;
25ffbdc1 9725}
718e3744 9726
d6902373 9727#ifdef KEEP_OLD_VPN_COMMANDS
505e5056 9728DEFUN_NOSH (address_family_vpnv4,
718e3744 9729 address_family_vpnv4_cmd,
8334fd5a 9730 "address-family vpnv4 [unicast]",
718e3744 9731 "Enter Address Family command mode\n"
00e6edb9
DA
9732 BGP_AF_STR
9733 BGP_AF_MODIFIER_STR)
718e3744 9734{
d62a17ae 9735 vty->node = BGP_VPNV4_NODE;
9736 return CMD_SUCCESS;
718e3744 9737}
9738
505e5056 9739DEFUN_NOSH (address_family_vpnv6,
8ecd3266 9740 address_family_vpnv6_cmd,
8334fd5a 9741 "address-family vpnv6 [unicast]",
8ecd3266 9742 "Enter Address Family command mode\n"
00e6edb9
DA
9743 BGP_AF_STR
9744 BGP_AF_MODIFIER_STR)
8ecd3266 9745{
d62a17ae 9746 vty->node = BGP_VPNV6_NODE;
9747 return CMD_SUCCESS;
8ecd3266 9748}
64e4a6c5 9749#endif /* KEEP_OLD_VPN_COMMANDS */
d6902373 9750
505e5056 9751DEFUN_NOSH (address_family_evpn,
4e0b7b6d 9752 address_family_evpn_cmd,
7111c1a0 9753 "address-family l2vpn evpn",
4e0b7b6d 9754 "Enter Address Family command mode\n"
00e6edb9
DA
9755 BGP_AF_STR
9756 BGP_AF_MODIFIER_STR)
4e0b7b6d 9757{
2131d5cf 9758 VTY_DECLVAR_CONTEXT(bgp, bgp);
d62a17ae 9759 vty->node = BGP_EVPN_NODE;
9760 return CMD_SUCCESS;
4e0b7b6d
PG
9761}
9762
bfaab44d
HS
9763DEFUN_NOSH (bgp_segment_routing_srv6,
9764 bgp_segment_routing_srv6_cmd,
9765 "segment-routing srv6",
9766 "Segment-Routing configuration\n"
9767 "Segment-Routing SRv6 configuration\n")
9768{
9769 VTY_DECLVAR_CONTEXT(bgp, bgp);
92a9e6f2 9770 bgp->srv6_enabled = true;
bfaab44d
HS
9771 vty->node = BGP_SRV6_NODE;
9772 return CMD_SUCCESS;
9773}
9774
0249b8b6
HS
9775DEFUN (no_bgp_segment_routing_srv6,
9776 no_bgp_segment_routing_srv6_cmd,
9777 "no segment-routing srv6",
9778 NO_STR
9779 "Segment-Routing configuration\n"
9780 "Segment-Routing SRv6 configuration\n")
9781{
9782 VTY_DECLVAR_CONTEXT(bgp, bgp);
9783
9784 if (strlen(bgp->srv6_locator_name) > 0)
9785 if (bgp_srv6_locator_unset(bgp) < 0)
9786 return CMD_WARNING_CONFIG_FAILED;
9787
9788 bgp->srv6_enabled = false;
9789 return CMD_SUCCESS;
9790}
9791
a0281b2e
HS
9792DEFPY (bgp_srv6_locator,
9793 bgp_srv6_locator_cmd,
9794 "locator NAME$name",
9795 "Specify SRv6 locator\n"
9796 "Specify SRv6 locator\n")
9797{
9798 VTY_DECLVAR_CONTEXT(bgp, bgp);
7de4c885 9799 int ret;
a0281b2e
HS
9800
9801 if (strlen(bgp->srv6_locator_name) > 0
9802 && strcmp(name, bgp->srv6_locator_name) != 0) {
9803 vty_out(vty, "srv6 locator is already configured\n");
9804 return CMD_WARNING_CONFIG_FAILED;
7de4c885
HS
9805 }
9806
9807 snprintf(bgp->srv6_locator_name,
9808 sizeof(bgp->srv6_locator_name), "%s", name);
a0281b2e 9809
7de4c885 9810 ret = bgp_zebra_srv6_manager_get_locator_chunk(name);
a0281b2e
HS
9811 if (ret < 0)
9812 return CMD_WARNING_CONFIG_FAILED;
9813
9814 return CMD_SUCCESS;
9815}
9816
0249b8b6
HS
9817DEFPY (no_bgp_srv6_locator,
9818 no_bgp_srv6_locator_cmd,
9819 "no locator NAME$name",
9820 NO_STR
9821 "Specify SRv6 locator\n"
9822 "Specify SRv6 locator\n")
9823{
9824 VTY_DECLVAR_CONTEXT(bgp, bgp);
9825
9826 /* when locator isn't configured, do nothing */
9827 if (strlen(bgp->srv6_locator_name) < 1)
9828 return CMD_SUCCESS;
9829
9830 /* name validation */
9831 if (strcmp(name, bgp->srv6_locator_name) != 0) {
9832 vty_out(vty, "%% No srv6 locator is configured\n");
9833 return CMD_WARNING_CONFIG_FAILED;
9834 }
9835
9836 /* unset locator */
9837 if (bgp_srv6_locator_unset(bgp) < 0)
9838 return CMD_WARNING_CONFIG_FAILED;
9839
9840 return CMD_SUCCESS;
9841}
9842
ea372e81
HS
9843DEFPY (show_bgp_srv6,
9844 show_bgp_srv6_cmd,
9845 "show bgp segment-routing srv6",
9846 SHOW_STR
9847 BGP_STR
9848 "BGP Segment Routing\n"
9849 "BGP Segment Routing SRv6\n")
9850{
9851 struct bgp *bgp;
9852 struct listnode *node;
1c21a234 9853 struct srv6_locator_chunk *chunk;
ea372e81 9854 struct bgp_srv6_function *func;
ea372e81 9855 char buf[256];
ea372e81
HS
9856
9857 bgp = bgp_get_default();
96db4340 9858 if (!bgp)
ea372e81
HS
9859 return CMD_SUCCESS;
9860
9861 vty_out(vty, "locator_name: %s\n", bgp->srv6_locator_name);
9862 vty_out(vty, "locator_chunks:\n");
dccef127 9863 for (ALL_LIST_ELEMENTS_RO(bgp->srv6_locator_chunks, node, chunk)) {
511211bf 9864 vty_out(vty, "- %pFX\n", &chunk->prefix);
dccef127
CS
9865 vty_out(vty, " block-length: %d\n", chunk->block_bits_length);
9866 vty_out(vty, " node-length: %d\n", chunk->node_bits_length);
9867 vty_out(vty, " func-length: %d\n",
9868 chunk->function_bits_length);
9869 vty_out(vty, " arg-length: %d\n", chunk->argument_bits_length);
9870 }
ea372e81
HS
9871
9872 vty_out(vty, "functions:\n");
9873 for (ALL_LIST_ELEMENTS_RO(bgp->srv6_functions, node, func)) {
9874 inet_ntop(AF_INET6, &func->sid, buf, sizeof(buf));
9875 vty_out(vty, "- sid: %s\n", buf);
9876 vty_out(vty, " locator: %s\n", func->locator_name);
9877 }
9878
9879 vty_out(vty, "bgps:\n");
9880 for (ALL_LIST_ELEMENTS_RO(bm->bgp, node, bgp)) {
9881 vty_out(vty, "- name: %s\n",
9882 bgp->name ? bgp->name : "default");
9883
1830895a
CS
9884 vty_out(vty, " vpn_policy[AFI_IP].tovpn_sid: %pI6\n",
9885 bgp->vpn_policy[AFI_IP].tovpn_sid);
9886 vty_out(vty, " vpn_policy[AFI_IP6].tovpn_sid: %pI6\n",
9887 bgp->vpn_policy[AFI_IP6].tovpn_sid);
9f5d4430 9888 vty_out(vty, " per-vrf tovpn_sid: %pI6\n", bgp->tovpn_sid);
ea372e81
HS
9889 }
9890
9891 return CMD_SUCCESS;
9892}
9893
505e5056 9894DEFUN_NOSH (exit_address_family,
718e3744 9895 exit_address_family_cmd,
9896 "exit-address-family",
9897 "Exit from Address Family configuration mode\n")
9898{
d62a17ae 9899 if (vty->node == BGP_IPV4_NODE || vty->node == BGP_IPV4M_NODE
9900 || vty->node == BGP_IPV4L_NODE || vty->node == BGP_VPNV4_NODE
9901 || vty->node == BGP_IPV6_NODE || vty->node == BGP_IPV6M_NODE
9902 || vty->node == BGP_IPV6L_NODE || vty->node == BGP_VPNV6_NODE
925bf671
PG
9903 || vty->node == BGP_EVPN_NODE
9904 || vty->node == BGP_FLOWSPECV4_NODE
9905 || vty->node == BGP_FLOWSPECV6_NODE)
d62a17ae 9906 vty->node = BGP_NODE;
9907 return CMD_SUCCESS;
718e3744 9908}
6b0655a2 9909
8ad7271d 9910/* Recalculate bestpath and re-advertise a prefix */
d62a17ae 9911static int bgp_clear_prefix(struct vty *vty, const char *view_name,
9912 const char *ip_str, afi_t afi, safi_t safi,
9913 struct prefix_rd *prd)
9914{
9915 int ret;
9916 struct prefix match;
9bcb3eef
DS
9917 struct bgp_dest *dest;
9918 struct bgp_dest *rm;
d62a17ae 9919 struct bgp *bgp;
9920 struct bgp_table *table;
9921 struct bgp_table *rib;
9922
9923 /* BGP structure lookup. */
9924 if (view_name) {
9925 bgp = bgp_lookup_by_name(view_name);
9926 if (bgp == NULL) {
9927 vty_out(vty, "%% Can't find BGP instance %s\n",
9928 view_name);
9929 return CMD_WARNING;
9930 }
9931 } else {
9932 bgp = bgp_get_default();
9933 if (bgp == NULL) {
9934 vty_out(vty, "%% No BGP process is configured\n");
9935 return CMD_WARNING;
9936 }
9937 }
9938
9939 /* Check IP address argument. */
9940 ret = str2prefix(ip_str, &match);
9941 if (!ret) {
9942 vty_out(vty, "%% address is malformed\n");
9943 return CMD_WARNING;
9944 }
9945
9946 match.family = afi2family(afi);
9947 rib = bgp->rib[afi][safi];
9948
9949 if (safi == SAFI_MPLS_VPN) {
9bcb3eef
DS
9950 for (dest = bgp_table_top(rib); dest;
9951 dest = bgp_route_next(dest)) {
9952 const struct prefix *dest_p = bgp_dest_get_prefix(dest);
b54892e0 9953
9bcb3eef 9954 if (prd && memcmp(dest_p->u.val, prd->val, 8) != 0)
d62a17ae 9955 continue;
9956
9bcb3eef 9957 table = bgp_dest_get_bgp_table_info(dest);
b54892e0
DS
9958 if (table == NULL)
9959 continue;
9960
4953391b
DA
9961 rm = bgp_node_match(table, &match);
9962 if (rm != NULL) {
b54892e0 9963 const struct prefix *rm_p =
9bcb3eef 9964 bgp_dest_get_prefix(rm);
b54892e0
DS
9965
9966 if (rm_p->prefixlen == match.prefixlen) {
9967 SET_FLAG(rm->flags,
9968 BGP_NODE_USER_CLEAR);
9969 bgp_process(bgp, rm, afi, safi);
d62a17ae 9970 }
9bcb3eef 9971 bgp_dest_unlock_node(rm);
d62a17ae 9972 }
9973 }
9974 } else {
4953391b
DA
9975 dest = bgp_node_match(rib, &match);
9976 if (dest != NULL) {
9bcb3eef 9977 const struct prefix *dest_p = bgp_dest_get_prefix(dest);
b54892e0 9978
9bcb3eef
DS
9979 if (dest_p->prefixlen == match.prefixlen) {
9980 SET_FLAG(dest->flags, BGP_NODE_USER_CLEAR);
9981 bgp_process(bgp, dest, afi, safi);
d62a17ae 9982 }
9bcb3eef 9983 bgp_dest_unlock_node(dest);
d62a17ae 9984 }
9985 }
9986
9987 return CMD_SUCCESS;
8ad7271d
DS
9988}
9989
b09b5ae0 9990/* one clear bgp command to rule them all */
718e3744 9991DEFUN (clear_ip_bgp_all,
9992 clear_ip_bgp_all_cmd,
3cb14f26 9993 "clear [ip] bgp [<view|vrf> VIEWVRFNAME] [<ipv4|ipv6|l2vpn> [<unicast|multicast|vpn|labeled-unicast|flowspec|evpn>]] <*|A.B.C.D$neighbor|X:X::X:X$neighbor|WORD$neighbor|(1-4294967295)|external|peer-group PGNAME> [<soft [<in|out>]|in [prefix-filter]|out|message-stats>]",
718e3744 9994 CLEAR_STR
9995 IP_STR
9996 BGP_STR
838758ac 9997 BGP_INSTANCE_HELP_STR
510afcd6 9998 BGP_AFI_HELP_STR
00e6edb9 9999 BGP_AF_STR
510afcd6 10000 BGP_SAFI_WITH_LABEL_HELP_STR
00e6edb9 10001 BGP_AF_MODIFIER_STR
b09b5ae0 10002 "Clear all peers\n"
453c92f6 10003 "BGP IPv4 neighbor to clear\n"
a80beece 10004 "BGP IPv6 neighbor to clear\n"
838758ac 10005 "BGP neighbor on interface to clear\n"
b09b5ae0
DW
10006 "Clear peers with the AS number\n"
10007 "Clear all external peers\n"
718e3744 10008 "Clear all members of peer-group\n"
b09b5ae0 10009 "BGP peer-group name\n"
b09b5ae0
DW
10010 BGP_SOFT_STR
10011 BGP_SOFT_IN_STR
b09b5ae0
DW
10012 BGP_SOFT_OUT_STR
10013 BGP_SOFT_IN_STR
10014 "Push out prefix-list ORF and do inbound soft reconfig\n"
3cb14f26
DS
10015 BGP_SOFT_OUT_STR
10016 "Reset message statistics\n")
718e3744 10017{
d62a17ae 10018 char *vrf = NULL;
10019
dc912615
DS
10020 afi_t afi = AFI_UNSPEC;
10021 safi_t safi = SAFI_UNSPEC;
d62a17ae 10022 enum clear_sort clr_sort = clear_peer;
10023 enum bgp_clear_type clr_type;
10024 char *clr_arg = NULL;
10025
10026 int idx = 0;
10027
10028 /* clear [ip] bgp */
10029 if (argv_find(argv, argc, "ip", &idx))
10030 afi = AFI_IP;
10031
9a8bdf1c
PG
10032 /* [<vrf> VIEWVRFNAME] */
10033 if (argv_find(argv, argc, "vrf", &idx)) {
10034 vrf = argv[idx + 1]->arg;
10035 idx += 2;
10036 if (vrf && strmatch(vrf, VRF_DEFAULT_NAME))
10037 vrf = NULL;
10038 } else if (argv_find(argv, argc, "view", &idx)) {
10039 /* [<view> VIEWVRFNAME] */
d62a17ae 10040 vrf = argv[idx + 1]->arg;
10041 idx += 2;
10042 }
d62a17ae 10043 /* ["BGP_AFI_CMD_STR" ["BGP_SAFI_CMD_STR"]] */
10044 if (argv_find_and_parse_afi(argv, argc, &idx, &afi))
10045 argv_find_and_parse_safi(argv, argc, &idx, &safi);
10046
d7b9898c 10047 /* <*|A.B.C.D|X:X::X:X|WORD|(1-4294967295)|external|peer-group PGNAME> */
d62a17ae 10048 if (argv_find(argv, argc, "*", &idx)) {
10049 clr_sort = clear_all;
10050 } else if (argv_find(argv, argc, "A.B.C.D", &idx)) {
10051 clr_sort = clear_peer;
10052 clr_arg = argv[idx]->arg;
10053 } else if (argv_find(argv, argc, "X:X::X:X", &idx)) {
10054 clr_sort = clear_peer;
10055 clr_arg = argv[idx]->arg;
10056 } else if (argv_find(argv, argc, "peer-group", &idx)) {
10057 clr_sort = clear_group;
10058 idx++;
10059 clr_arg = argv[idx]->arg;
d7b9898c 10060 } else if (argv_find(argv, argc, "PGNAME", &idx)) {
d62a17ae 10061 clr_sort = clear_peer;
10062 clr_arg = argv[idx]->arg;
8fa7d444
DS
10063 } else if (argv_find(argv, argc, "WORD", &idx)) {
10064 clr_sort = clear_peer;
10065 clr_arg = argv[idx]->arg;
d62a17ae 10066 } else if (argv_find(argv, argc, "(1-4294967295)", &idx)) {
10067 clr_sort = clear_as;
10068 clr_arg = argv[idx]->arg;
10069 } else if (argv_find(argv, argc, "external", &idx)) {
10070 clr_sort = clear_external;
10071 }
10072
3cb14f26 10073 /* [<soft [<in|out>]|in [prefix-filter]|out|message-stats>] */
d62a17ae 10074 if (argv_find(argv, argc, "soft", &idx)) {
10075 if (argv_find(argv, argc, "in", &idx)
10076 || argv_find(argv, argc, "out", &idx))
10077 clr_type = strmatch(argv[idx]->text, "in")
10078 ? BGP_CLEAR_SOFT_IN
10079 : BGP_CLEAR_SOFT_OUT;
10080 else
10081 clr_type = BGP_CLEAR_SOFT_BOTH;
10082 } else if (argv_find(argv, argc, "in", &idx)) {
10083 clr_type = argv_find(argv, argc, "prefix-filter", &idx)
10084 ? BGP_CLEAR_SOFT_IN_ORF_PREFIX
10085 : BGP_CLEAR_SOFT_IN;
10086 } else if (argv_find(argv, argc, "out", &idx)) {
10087 clr_type = BGP_CLEAR_SOFT_OUT;
3cb14f26
DS
10088 } else if (argv_find(argv, argc, "message-stats", &idx)) {
10089 clr_type = BGP_CLEAR_MESSAGE_STATS;
d62a17ae 10090 } else
10091 clr_type = BGP_CLEAR_SOFT_NONE;
10092
1ca2fd11 10093 return bgp_clear_vty(vty, vrf, afi, safi, clr_sort, clr_type, clr_arg);
838758ac 10094}
01080f7c 10095
8ad7271d
DS
10096DEFUN (clear_ip_bgp_prefix,
10097 clear_ip_bgp_prefix_cmd,
18c57037 10098 "clear [ip] bgp [<view|vrf> VIEWVRFNAME] prefix A.B.C.D/M",
8ad7271d
DS
10099 CLEAR_STR
10100 IP_STR
10101 BGP_STR
838758ac 10102 BGP_INSTANCE_HELP_STR
8ad7271d 10103 "Clear bestpath and re-advertise\n"
0c7b1b01 10104 "IPv4 prefix\n")
8ad7271d 10105{
d62a17ae 10106 char *vrf = NULL;
10107 char *prefix = NULL;
8ad7271d 10108
d62a17ae 10109 int idx = 0;
01080f7c 10110
d62a17ae 10111 /* [<view|vrf> VIEWVRFNAME] */
9a8bdf1c
PG
10112 if (argv_find(argv, argc, "vrf", &idx)) {
10113 vrf = argv[idx + 1]->arg;
10114 idx += 2;
10115 if (vrf && strmatch(vrf, VRF_DEFAULT_NAME))
10116 vrf = NULL;
10117 } else if (argv_find(argv, argc, "view", &idx)) {
10118 /* [<view> VIEWVRFNAME] */
10119 vrf = argv[idx + 1]->arg;
10120 idx += 2;
10121 }
0c7b1b01 10122
d62a17ae 10123 prefix = argv[argc - 1]->arg;
8ad7271d 10124
d62a17ae 10125 return bgp_clear_prefix(vty, vrf, prefix, AFI_IP, SAFI_UNICAST, NULL);
838758ac 10126}
8ad7271d 10127
b09b5ae0
DW
10128DEFUN (clear_bgp_ipv6_safi_prefix,
10129 clear_bgp_ipv6_safi_prefix_cmd,
46f296b4 10130 "clear [ip] bgp ipv6 "BGP_SAFI_CMD_STR" prefix X:X::X:X/M",
718e3744 10131 CLEAR_STR
3a2d747c 10132 IP_STR
718e3744 10133 BGP_STR
00e6edb9 10134 BGP_AF_STR
46f296b4 10135 BGP_SAFI_HELP_STR
b09b5ae0 10136 "Clear bestpath and re-advertise\n"
0c7b1b01 10137 "IPv6 prefix\n")
718e3744 10138{
9b475e76
PG
10139 int idx_safi = 0;
10140 int idx_ipv6_prefix = 0;
10141 safi_t safi = SAFI_UNICAST;
10142 char *prefix = argv_find(argv, argc, "X:X::X:X/M", &idx_ipv6_prefix) ?
10143 argv[idx_ipv6_prefix]->arg : NULL;
10144
10145 argv_find_and_parse_safi(argv, argc, &idx_safi, &safi);
d62a17ae 10146 return bgp_clear_prefix(
9b475e76
PG
10147 vty, NULL, prefix, AFI_IP6,
10148 safi, NULL);
838758ac 10149}
01080f7c 10150
b09b5ae0
DW
10151DEFUN (clear_bgp_instance_ipv6_safi_prefix,
10152 clear_bgp_instance_ipv6_safi_prefix_cmd,
18c57037 10153 "clear [ip] bgp <view|vrf> VIEWVRFNAME ipv6 "BGP_SAFI_CMD_STR" prefix X:X::X:X/M",
718e3744 10154 CLEAR_STR
3a2d747c 10155 IP_STR
718e3744 10156 BGP_STR
838758ac 10157 BGP_INSTANCE_HELP_STR
00e6edb9 10158 BGP_AF_STR
46f296b4 10159 BGP_SAFI_HELP_STR
b09b5ae0 10160 "Clear bestpath and re-advertise\n"
0c7b1b01 10161 "IPv6 prefix\n")
718e3744 10162{
9b475e76 10163 int idx_safi = 0;
9a8bdf1c 10164 int idx_vrfview = 0;
9b475e76
PG
10165 int idx_ipv6_prefix = 0;
10166 safi_t safi = SAFI_UNICAST;
10167 char *prefix = argv_find(argv, argc, "X:X::X:X/M", &idx_ipv6_prefix) ?
10168 argv[idx_ipv6_prefix]->arg : NULL;
9a8bdf1c 10169 char *vrfview = NULL;
9b475e76 10170
9a8bdf1c
PG
10171 /* [<view|vrf> VIEWVRFNAME] */
10172 if (argv_find(argv, argc, "vrf", &idx_vrfview)) {
10173 vrfview = argv[idx_vrfview + 1]->arg;
10174 if (vrfview && strmatch(vrfview, VRF_DEFAULT_NAME))
10175 vrfview = NULL;
10176 } else if (argv_find(argv, argc, "view", &idx_vrfview)) {
10177 /* [<view> VIEWVRFNAME] */
10178 vrfview = argv[idx_vrfview + 1]->arg;
10179 }
9b475e76
PG
10180 argv_find_and_parse_safi(argv, argc, &idx_safi, &safi);
10181
d62a17ae 10182 return bgp_clear_prefix(
9b475e76
PG
10183 vty, vrfview, prefix,
10184 AFI_IP6, safi, NULL);
718e3744 10185}
10186
b09b5ae0
DW
10187DEFUN (show_bgp_views,
10188 show_bgp_views_cmd,
d6e3c605 10189 "show [ip] bgp views",
b09b5ae0 10190 SHOW_STR
d6e3c605 10191 IP_STR
01080f7c 10192 BGP_STR
b09b5ae0 10193 "Show the defined BGP views\n")
01080f7c 10194{
d62a17ae 10195 struct list *inst = bm->bgp;
10196 struct listnode *node;
10197 struct bgp *bgp;
01080f7c 10198
d62a17ae 10199 vty_out(vty, "Defined BGP views:\n");
10200 for (ALL_LIST_ELEMENTS_RO(inst, node, bgp)) {
10201 /* Skip VRFs. */
10202 if (bgp->inst_type == BGP_INSTANCE_TYPE_VRF)
10203 continue;
10204 vty_out(vty, "\t%s (AS%u)\n", bgp->name ? bgp->name : "(null)",
10205 bgp->as);
10206 }
e52702f2 10207
d62a17ae 10208 return CMD_SUCCESS;
e0081f70
ML
10209}
10210
8386ac43 10211DEFUN (show_bgp_vrfs,
10212 show_bgp_vrfs_cmd,
d6e3c605 10213 "show [ip] bgp vrfs [json]",
8386ac43 10214 SHOW_STR
d6e3c605 10215 IP_STR
8386ac43 10216 BGP_STR
10217 "Show BGP VRFs\n"
9973d184 10218 JSON_STR)
8386ac43 10219{
fe1dc5a3 10220 char buf[ETHER_ADDR_STRLEN];
d62a17ae 10221 struct list *inst = bm->bgp;
10222 struct listnode *node;
10223 struct bgp *bgp;
9f049418 10224 bool uj = use_json(argc, argv);
d62a17ae 10225 json_object *json = NULL;
10226 json_object *json_vrfs = NULL;
10227 int count = 0;
d62a17ae 10228
d62a17ae 10229 if (uj) {
10230 json = json_object_new_object();
10231 json_vrfs = json_object_new_object();
10232 }
10233
10234 for (ALL_LIST_ELEMENTS_RO(inst, node, bgp)) {
10235 const char *name, *type;
10236 struct peer *peer;
7fe96307 10237 struct listnode *node2, *nnode2;
d62a17ae 10238 int peers_cfg, peers_estb;
10239 json_object *json_vrf = NULL;
d62a17ae 10240
10241 /* Skip Views. */
10242 if (bgp->inst_type == BGP_INSTANCE_TYPE_VIEW)
10243 continue;
10244
10245 count++;
efb4077a 10246 if (!uj && count == 1) {
fe1dc5a3 10247 vty_out(vty,
efb4077a 10248 "%4s %-5s %-16s %9s %10s %-37s\n",
3c0e7aa4 10249 "Type", "Id", "routerId", "#PeersCfg",
efb4077a
CS
10250 "#PeersEstb", "Name");
10251 vty_out(vty, "%11s %-16s %-21s %-6s\n", " ",
10252 "L3-VNI", "RouterMAC", "Interface");
10253 }
d62a17ae 10254
10255 peers_cfg = peers_estb = 0;
10256 if (uj)
10257 json_vrf = json_object_new_object();
10258
10259
7fe96307 10260 for (ALL_LIST_ELEMENTS(bgp->peer, node2, nnode2, peer)) {
d62a17ae 10261 if (!CHECK_FLAG(peer->flags, PEER_FLAG_CONFIG_NODE))
10262 continue;
10263 peers_cfg++;
feb17238 10264 if (peer_established(peer))
d62a17ae 10265 peers_estb++;
10266 }
10267
10268 if (bgp->inst_type == BGP_INSTANCE_TYPE_DEFAULT) {
5742e42b 10269 name = VRF_DEFAULT_NAME;
d62a17ae 10270 type = "DFLT";
10271 } else {
10272 name = bgp->name;
10273 type = "VRF";
10274 }
10275
a8bf7d9c 10276
d62a17ae 10277 if (uj) {
a4d82a8a
PZ
10278 int64_t vrf_id_ui = (bgp->vrf_id == VRF_UNKNOWN)
10279 ? -1
10280 : (int64_t)bgp->vrf_id;
23d0a753
DA
10281 char buf[BUFSIZ] = {0};
10282
d62a17ae 10283 json_object_string_add(json_vrf, "type", type);
10284 json_object_int_add(json_vrf, "vrfId", vrf_id_ui);
c949c771
DA
10285 json_object_string_addf(json_vrf, "routerId", "%pI4",
10286 &bgp->router_id);
d62a17ae 10287 json_object_int_add(json_vrf, "numConfiguredPeers",
10288 peers_cfg);
10289 json_object_int_add(json_vrf, "numEstablishedPeers",
10290 peers_estb);
10291
fe1dc5a3 10292 json_object_int_add(json_vrf, "l3vni", bgp->l3vni);
a4d82a8a
PZ
10293 json_object_string_add(
10294 json_vrf, "rmac",
10295 prefix_mac2str(&bgp->rmac, buf, sizeof(buf)));
efb4077a
CS
10296 json_object_string_add(json_vrf, "interface",
10297 ifindex2ifname(bgp->l3vni_svi_ifindex,
10298 bgp->vrf_id));
d62a17ae 10299 json_object_object_add(json_vrfs, name, json_vrf);
efb4077a 10300 } else {
23d0a753 10301 vty_out(vty, "%4s %-5d %-16pI4 %-9u %-10u %-37s\n",
a4d82a8a
PZ
10302 type,
10303 bgp->vrf_id == VRF_UNKNOWN ? -1
10304 : (int)bgp->vrf_id,
23d0a753 10305 &bgp->router_id, peers_cfg, peers_estb, name);
efb4077a
CS
10306 vty_out(vty,"%11s %-16u %-21s %-20s\n", " ",
10307 bgp->l3vni,
10308 prefix_mac2str(&bgp->rmac, buf, sizeof(buf)),
10309 ifindex2ifname(bgp->l3vni_svi_ifindex,
10310 bgp->vrf_id));
10311 }
d62a17ae 10312 }
10313
10314 if (uj) {
10315 json_object_object_add(json, "vrfs", json_vrfs);
10316
10317 json_object_int_add(json, "totalVrfs", count);
10318
75eeda93 10319 vty_json(vty, json);
d62a17ae 10320 } else {
10321 if (count)
10322 vty_out(vty,
10323 "\nTotal number of VRFs (including default): %d\n",
10324 count);
10325 }
10326
10327 return CMD_SUCCESS;
8386ac43 10328}
10329
48ecf8f5
DS
10330DEFUN (show_bgp_mac_hash,
10331 show_bgp_mac_hash_cmd,
10332 "show bgp mac hash",
10333 SHOW_STR
10334 BGP_STR
10335 "Mac Address\n"
10336 "Mac Address database\n")
10337{
10338 bgp_mac_dump_table(vty);
10339
10340 return CMD_SUCCESS;
10341}
acf71666 10342
e3b78da8 10343static void show_tip_entry(struct hash_bucket *bucket, void *args)
acf71666 10344{
0291c246 10345 struct vty *vty = (struct vty *)args;
e3b78da8 10346 struct tip_addr *tip = (struct tip_addr *)bucket->data;
acf71666 10347
23d0a753 10348 vty_out(vty, "addr: %pI4, count: %d\n", &tip->addr, tip->refcnt);
acf71666
MK
10349}
10350
10351static void bgp_show_martian_nexthops(struct vty *vty, struct bgp *bgp)
10352{
10353 vty_out(vty, "self nexthop database:\n");
af97a18b 10354 bgp_nexthop_show_address_hash(vty, bgp);
acf71666
MK
10355
10356 vty_out(vty, "Tunnel-ip database:\n");
10357 hash_iterate(bgp->tip_hash,
e3b78da8 10358 (void (*)(struct hash_bucket *, void *))show_tip_entry,
acf71666
MK
10359 vty);
10360}
10361
15c81ca4
DS
10362DEFUN(show_bgp_martian_nexthop_db, show_bgp_martian_nexthop_db_cmd,
10363 "show bgp [<view|vrf> VIEWVRFNAME] martian next-hop",
10364 SHOW_STR BGP_STR BGP_INSTANCE_HELP_STR
60466a63
QY
10365 "martian next-hops\n"
10366 "martian next-hop database\n")
acf71666 10367{
0291c246 10368 struct bgp *bgp = NULL;
15c81ca4 10369 int idx = 0;
9a8bdf1c
PG
10370 char *name = NULL;
10371
10372 /* [<vrf> VIEWVRFNAME] */
10373 if (argv_find(argv, argc, "vrf", &idx)) {
10374 name = argv[idx + 1]->arg;
10375 if (name && strmatch(name, VRF_DEFAULT_NAME))
10376 name = NULL;
10377 } else if (argv_find(argv, argc, "view", &idx))
10378 /* [<view> VIEWVRFNAME] */
10379 name = argv[idx + 1]->arg;
10380 if (name)
10381 bgp = bgp_lookup_by_name(name);
15c81ca4
DS
10382 else
10383 bgp = bgp_get_default();
acf71666 10384
acf71666
MK
10385 if (!bgp) {
10386 vty_out(vty, "%% No BGP process is configured\n");
10387 return CMD_WARNING;
10388 }
10389 bgp_show_martian_nexthops(vty, bgp);
10390
10391 return CMD_SUCCESS;
10392}
10393
f412b39a 10394DEFUN (show_bgp_memory,
4bf6a362 10395 show_bgp_memory_cmd,
7fa12b13 10396 "show [ip] bgp memory",
4bf6a362 10397 SHOW_STR
3a2d747c 10398 IP_STR
4bf6a362
PJ
10399 BGP_STR
10400 "Global BGP memory statistics\n")
10401{
d62a17ae 10402 char memstrbuf[MTYPE_MEMSTR_LEN];
10403 unsigned long count;
10404
10405 /* RIB related usage stats */
10406 count = mtype_stats_alloc(MTYPE_BGP_NODE);
10407 vty_out(vty, "%ld RIB nodes, using %s of memory\n", count,
10408 mtype_memstr(memstrbuf, sizeof(memstrbuf),
9bcb3eef 10409 count * sizeof(struct bgp_dest)));
d62a17ae 10410
10411 count = mtype_stats_alloc(MTYPE_BGP_ROUTE);
10412 vty_out(vty, "%ld BGP routes, using %s of memory\n", count,
10413 mtype_memstr(memstrbuf, sizeof(memstrbuf),
4b7e6066 10414 count * sizeof(struct bgp_path_info)));
d62a17ae 10415 if ((count = mtype_stats_alloc(MTYPE_BGP_ROUTE_EXTRA)))
10416 vty_out(vty, "%ld BGP route ancillaries, using %s of memory\n",
10417 count,
4b7e6066
DS
10418 mtype_memstr(
10419 memstrbuf, sizeof(memstrbuf),
10420 count * sizeof(struct bgp_path_info_extra)));
d62a17ae 10421
10422 if ((count = mtype_stats_alloc(MTYPE_BGP_STATIC)))
10423 vty_out(vty, "%ld Static routes, using %s of memory\n", count,
10424 mtype_memstr(memstrbuf, sizeof(memstrbuf),
10425 count * sizeof(struct bgp_static)));
10426
10427 if ((count = mtype_stats_alloc(MTYPE_BGP_PACKET)))
10428 vty_out(vty, "%ld Packets, using %s of memory\n", count,
10429 mtype_memstr(memstrbuf, sizeof(memstrbuf),
10430 count * sizeof(struct bpacket)));
10431
10432 /* Adj-In/Out */
10433 if ((count = mtype_stats_alloc(MTYPE_BGP_ADJ_IN)))
10434 vty_out(vty, "%ld Adj-In entries, using %s of memory\n", count,
10435 mtype_memstr(memstrbuf, sizeof(memstrbuf),
10436 count * sizeof(struct bgp_adj_in)));
10437 if ((count = mtype_stats_alloc(MTYPE_BGP_ADJ_OUT)))
10438 vty_out(vty, "%ld Adj-Out entries, using %s of memory\n", count,
10439 mtype_memstr(memstrbuf, sizeof(memstrbuf),
10440 count * sizeof(struct bgp_adj_out)));
10441
10442 if ((count = mtype_stats_alloc(MTYPE_BGP_NEXTHOP_CACHE)))
10443 vty_out(vty, "%ld Nexthop cache entries, using %s of memory\n",
10444 count,
10445 mtype_memstr(memstrbuf, sizeof(memstrbuf),
10446 count * sizeof(struct bgp_nexthop_cache)));
10447
10448 if ((count = mtype_stats_alloc(MTYPE_BGP_DAMP_INFO)))
10449 vty_out(vty, "%ld Dampening entries, using %s of memory\n",
10450 count,
10451 mtype_memstr(memstrbuf, sizeof(memstrbuf),
10452 count * sizeof(struct bgp_damp_info)));
10453
10454 /* Attributes */
10455 count = attr_count();
10456 vty_out(vty, "%ld BGP attributes, using %s of memory\n", count,
10457 mtype_memstr(memstrbuf, sizeof(memstrbuf),
10458 count * sizeof(struct attr)));
10459
10460 if ((count = attr_unknown_count()))
10461 vty_out(vty, "%ld unknown attributes\n", count);
10462
10463 /* AS_PATH attributes */
10464 count = aspath_count();
10465 vty_out(vty, "%ld BGP AS-PATH entries, using %s of memory\n", count,
10466 mtype_memstr(memstrbuf, sizeof(memstrbuf),
10467 count * sizeof(struct aspath)));
10468
10469 count = mtype_stats_alloc(MTYPE_AS_SEG);
10470 vty_out(vty, "%ld BGP AS-PATH segments, using %s of memory\n", count,
10471 mtype_memstr(memstrbuf, sizeof(memstrbuf),
10472 count * sizeof(struct assegment)));
10473
10474 /* Other attributes */
10475 if ((count = community_count()))
10476 vty_out(vty, "%ld BGP community entries, using %s of memory\n",
996c9314
LB
10477 count, mtype_memstr(memstrbuf, sizeof(memstrbuf),
10478 count * sizeof(struct community)));
d62a17ae 10479 if ((count = mtype_stats_alloc(MTYPE_ECOMMUNITY)))
145f7619
DA
10480 vty_out(vty,
10481 "%ld BGP ext-community entries, using %s of memory\n",
10482 count,
10483 mtype_memstr(memstrbuf, sizeof(memstrbuf),
10484 count * sizeof(struct ecommunity)));
d62a17ae 10485 if ((count = mtype_stats_alloc(MTYPE_LCOMMUNITY)))
10486 vty_out(vty,
10487 "%ld BGP large-community entries, using %s of memory\n",
996c9314
LB
10488 count, mtype_memstr(memstrbuf, sizeof(memstrbuf),
10489 count * sizeof(struct lcommunity)));
d62a17ae 10490
10491 if ((count = mtype_stats_alloc(MTYPE_CLUSTER)))
10492 vty_out(vty, "%ld Cluster lists, using %s of memory\n", count,
10493 mtype_memstr(memstrbuf, sizeof(memstrbuf),
10494 count * sizeof(struct cluster_list)));
10495
10496 /* Peer related usage */
10497 count = mtype_stats_alloc(MTYPE_BGP_PEER);
10498 vty_out(vty, "%ld peers, using %s of memory\n", count,
10499 mtype_memstr(memstrbuf, sizeof(memstrbuf),
10500 count * sizeof(struct peer)));
10501
10502 if ((count = mtype_stats_alloc(MTYPE_PEER_GROUP)))
10503 vty_out(vty, "%ld peer groups, using %s of memory\n", count,
10504 mtype_memstr(memstrbuf, sizeof(memstrbuf),
10505 count * sizeof(struct peer_group)));
10506
10507 /* Other */
d62a17ae 10508 if ((count = mtype_stats_alloc(MTYPE_BGP_REGEXP)))
10509 vty_out(vty, "%ld compiled regexes, using %s of memory\n",
996c9314
LB
10510 count, mtype_memstr(memstrbuf, sizeof(memstrbuf),
10511 count * sizeof(regex_t)));
d62a17ae 10512 return CMD_SUCCESS;
4bf6a362 10513}
fee0f4c6 10514
57a9c8a8
DS
10515static void bgp_show_bestpath_json(struct bgp *bgp, json_object *json)
10516{
10517 json_object *bestpath = json_object_new_object();
10518
892fedb6 10519 if (CHECK_FLAG(bgp->flags, BGP_FLAG_ASPATH_IGNORE))
57a9c8a8
DS
10520 json_object_string_add(bestpath, "asPath", "ignore");
10521
892fedb6 10522 if (CHECK_FLAG(bgp->flags, BGP_FLAG_ASPATH_CONFED))
57a9c8a8
DS
10523 json_object_string_add(bestpath, "asPath", "confed");
10524
892fedb6
DA
10525 if (CHECK_FLAG(bgp->flags, BGP_FLAG_ASPATH_MULTIPATH_RELAX)) {
10526 if (CHECK_FLAG(bgp->flags, BGP_FLAG_MULTIPATH_RELAX_AS_SET))
a4d82a8a 10527 json_object_string_add(bestpath, "multiPathRelax",
57a9c8a8
DS
10528 "as-set");
10529 else
a4d82a8a 10530 json_object_string_add(bestpath, "multiPathRelax",
57a9c8a8
DS
10531 "true");
10532 } else
a4d82a8a 10533 json_object_string_add(bestpath, "multiPathRelax", "false");
57a9c8a8 10534
ee88563a
JM
10535 if (CHECK_FLAG(bgp->flags, BGP_FLAG_PEERTYPE_MULTIPATH_RELAX))
10536 json_object_boolean_true_add(bestpath, "peerTypeRelax");
10537
892fedb6 10538 if (CHECK_FLAG(bgp->flags, BGP_FLAG_COMPARE_ROUTER_ID))
57a9c8a8 10539 json_object_string_add(bestpath, "compareRouterId", "true");
892fedb6
DA
10540 if (CHECK_FLAG(bgp->flags, BGP_FLAG_MED_CONFED)
10541 || CHECK_FLAG(bgp->flags, BGP_FLAG_MED_MISSING_AS_WORST)) {
10542 if (CHECK_FLAG(bgp->flags, BGP_FLAG_MED_CONFED))
a4d82a8a 10543 json_object_string_add(bestpath, "med", "confed");
892fedb6 10544 if (CHECK_FLAG(bgp->flags, BGP_FLAG_MED_MISSING_AS_WORST))
57a9c8a8
DS
10545 json_object_string_add(bestpath, "med",
10546 "missing-as-worst");
10547 else
10548 json_object_string_add(bestpath, "med", "true");
10549 }
10550
10551 json_object_object_add(json, "bestPath", bestpath);
10552}
10553
3577f1c5
DD
10554/* Print the error code/subcode for why the peer is down */
10555static void bgp_show_peer_reset(struct vty * vty, struct peer *peer,
10556 json_object *json_peer, bool use_json)
10557{
10558 const char *code_str;
10559 const char *subcode_str;
10560
10561 if (use_json) {
10562 if (peer->last_reset == PEER_DOWN_NOTIFY_SEND
10563 || peer->last_reset == PEER_DOWN_NOTIFY_RECEIVED) {
10564 char errorcodesubcode_hexstr[5];
10565 char errorcodesubcode_str[256];
10566
10567 code_str = bgp_notify_code_str(peer->notify.code);
10568 subcode_str = bgp_notify_subcode_str(
10569 peer->notify.code,
10570 peer->notify.subcode);
10571
772270f3
QY
10572 snprintf(errorcodesubcode_hexstr,
10573 sizeof(errorcodesubcode_hexstr), "%02X%02X",
10574 peer->notify.code, peer->notify.subcode);
3577f1c5
DD
10575 json_object_string_add(json_peer,
10576 "lastErrorCodeSubcode",
10577 errorcodesubcode_hexstr);
10578 snprintf(errorcodesubcode_str, 255, "%s%s",
10579 code_str, subcode_str);
10580 json_object_string_add(json_peer,
10581 "lastNotificationReason",
10582 errorcodesubcode_str);
eea685b6
DA
10583 json_object_boolean_add(json_peer,
10584 "lastNotificationHardReset",
10585 peer->notify.hard_reset);
3577f1c5
DD
10586 if (peer->last_reset == PEER_DOWN_NOTIFY_RECEIVED
10587 && peer->notify.code == BGP_NOTIFY_CEASE
10588 && (peer->notify.subcode
10589 == BGP_NOTIFY_CEASE_ADMIN_SHUTDOWN
10590 || peer->notify.subcode
10591 == BGP_NOTIFY_CEASE_ADMIN_RESET)
10592 && peer->notify.length) {
10593 char msgbuf[1024];
10594 const char *msg_str;
10595
10596 msg_str = bgp_notify_admin_message(
10597 msgbuf, sizeof(msgbuf),
10598 (uint8_t *)peer->notify.data,
10599 peer->notify.length);
10600 if (msg_str)
10601 json_object_string_add(
10602 json_peer,
10603 "lastShutdownDescription",
10604 msg_str);
10605 }
10606
c258527b 10607 }
3577f1c5
DD
10608 json_object_string_add(json_peer, "lastResetDueTo",
10609 peer_down_str[(int)peer->last_reset]);
05912a17
DD
10610 json_object_int_add(json_peer, "lastResetCode",
10611 peer->last_reset);
3577f1c5
DD
10612 } else {
10613 if (peer->last_reset == PEER_DOWN_NOTIFY_SEND
10614 || peer->last_reset == PEER_DOWN_NOTIFY_RECEIVED) {
10615 code_str = bgp_notify_code_str(peer->notify.code);
10616 subcode_str =
10617 bgp_notify_subcode_str(peer->notify.code,
10618 peer->notify.subcode);
eea685b6 10619 vty_out(vty, " Notification %s (%s%s%s)\n",
3577f1c5 10620 peer->last_reset == PEER_DOWN_NOTIFY_SEND
eea685b6
DA
10621 ? "sent"
10622 : "received",
10623 code_str, subcode_str,
10624 peer->notify.hard_reset
10625 ? bgp_notify_subcode_str(
10626 BGP_NOTIFY_CEASE,
10627 BGP_NOTIFY_CEASE_HARD_RESET)
10628 : "");
3577f1c5 10629 } else {
e91c24c8 10630 vty_out(vty, " %s\n",
3577f1c5
DD
10631 peer_down_str[(int)peer->last_reset]);
10632 }
10633 }
10634}
10635
10636static inline bool bgp_has_peer_failed(struct peer *peer, afi_t afi,
10637 safi_t safi)
10638{
feb17238 10639 return ((!peer_established(peer)) || !peer->afc_recv[afi][safi]);
3577f1c5
DD
10640}
10641
10642static void bgp_show_failed_summary(struct vty *vty, struct bgp *bgp,
10643 struct peer *peer, json_object *json_peer,
10644 int max_neighbor_width, bool use_json)
10645{
10646 char timebuf[BGP_UPTIME_LEN], dn_flag[2];
10647 int len;
10648
10649 if (use_json) {
10650 if (peer_dynamic_neighbor(peer))
10651 json_object_boolean_true_add(json_peer,
10652 "dynamicPeer");
10653 if (peer->hostname)
10654 json_object_string_add(json_peer, "hostname",
10655 peer->hostname);
10656
10657 if (peer->domainname)
10658 json_object_string_add(json_peer, "domainname",
10659 peer->domainname);
10660 json_object_int_add(json_peer, "connectionsEstablished",
10661 peer->established);
10662 json_object_int_add(json_peer, "connectionsDropped",
10663 peer->dropped);
10664 peer_uptime(peer->uptime, timebuf, BGP_UPTIME_LEN,
10665 use_json, json_peer);
feb17238 10666 if (peer_established(peer))
3577f1c5
DD
10667 json_object_string_add(json_peer, "lastResetDueTo",
10668 "AFI/SAFI Not Negotiated");
10669 else
10670 bgp_show_peer_reset(NULL, peer, json_peer, true);
10671 } else {
10672 dn_flag[1] = '\0';
10673 dn_flag[0] = peer_dynamic_neighbor(peer) ? '*' : '\0';
10674 if (peer->hostname
892fedb6 10675 && CHECK_FLAG(bgp->flags, BGP_FLAG_SHOW_HOSTNAME))
3577f1c5
DD
10676 len = vty_out(vty, "%s%s(%s)", dn_flag,
10677 peer->hostname, peer->host);
10678 else
10679 len = vty_out(vty, "%s%s", dn_flag, peer->host);
10680
10681 /* pad the neighbor column with spaces */
10682 if (len < max_neighbor_width)
10683 vty_out(vty, "%*s", max_neighbor_width - len,
10684 " ");
e91c24c8 10685 vty_out(vty, "%7d %7d %9s", peer->established,
3577f1c5
DD
10686 peer->dropped,
10687 peer_uptime(peer->uptime, timebuf,
10688 BGP_UPTIME_LEN, 0, NULL));
feb17238 10689 if (peer_established(peer))
3577f1c5
DD
10690 vty_out(vty, " AFI/SAFI Not Negotiated\n");
10691 else
10692 bgp_show_peer_reset(vty, peer, NULL,
10693 false);
10694 }
10695}
c258527b 10696
565e9ddd 10697/* Strip peer's description to the given size. */
cb75bb31
DA
10698static char *bgp_peer_description_stripped(char *desc, uint32_t size)
10699{
10700 static char stripped[BUFSIZ];
64541ffa
FD
10701 uint32_t i = 0;
10702 uint32_t last_space = 0;
cb75bb31 10703
64541ffa
FD
10704 while (i < size) {
10705 if (*(desc + i) == 0) {
10706 stripped[i] = '\0';
10707 return stripped;
10708 }
10709 if (i != 0 && *(desc + i) == ' ' && last_space != i - 1)
10710 last_space = i;
10711 stripped[i] = *(desc + i);
10712 i++;
10713 }
10714
10715 if (last_space > size)
10716 stripped[size + 1] = '\0';
10717 else
10718 stripped[last_space] = '\0';
cb75bb31
DA
10719
10720 return stripped;
10721}
3577f1c5 10722
8c1d4cd5
LS
10723/* Determine whether var peer should be filtered out of the summary. */
10724static bool bgp_show_summary_is_peer_filtered(struct peer *peer,
10725 struct peer *fpeer, int as_type,
10726 as_t as)
10727{
10728
10729 /* filter neighbor XXXX */
10730 if (fpeer && fpeer != peer)
10731 return true;
10732
10733 /* filter remote-as (internal|external) */
10734 if (as_type != AS_UNSPECIFIED) {
10735 if (peer->as_type == AS_SPECIFIED) {
10736 if (as_type == AS_INTERNAL) {
10737 if (peer->as != peer->local_as)
10738 return true;
10739 } else if (peer->as == peer->local_as)
10740 return true;
10741 } else if (as_type != peer->as_type)
10742 return true;
10743 } else if (as && as != peer->as) /* filter remote-as XXX */
10744 return true;
10745
10746 return false;
10747}
10748
565e9ddd
DA
10749/* Show BGP peer's summary information.
10750 *
10751 * Peer's description is stripped according to if `wide` option is given
10752 * or not.
10753 *
10754 * When adding new columns to `show bgp summary` output, please make
10755 * sure `Desc` is the lastest column to show because it can contain
10756 * whitespaces and the whole output will be tricky.
10757 */
d62a17ae 10758static int bgp_show_summary(struct vty *vty, struct bgp *bgp, int afi, int safi,
8c1d4cd5 10759 struct peer *fpeer, int as_type, as_t as,
96c81f66 10760 uint16_t show_flags)
d62a17ae 10761{
10762 struct peer *peer;
10763 struct listnode *node, *nnode;
10764 unsigned int count = 0, dn_count = 0;
10765 char timebuf[BGP_UPTIME_LEN], dn_flag[2];
10766 char neighbor_buf[VTY_BUFSIZ];
10767 int neighbor_col_default_width = 16;
3577f1c5 10768 int len, failed_count = 0;
ce1944f0 10769 unsigned int filtered_count = 0;
d62a17ae 10770 int max_neighbor_width = 0;
10771 int pfx_rcd_safi;
3c13337d 10772 json_object *json = NULL;
d62a17ae 10773 json_object *json_peer = NULL;
10774 json_object *json_peers = NULL;
50e05855 10775 struct peer_af *paf;
d3ada366 10776 struct bgp_filter *filter;
85eeb029
DA
10777 bool use_json = CHECK_FLAG(show_flags, BGP_SHOW_OPT_JSON);
10778 bool show_failed = CHECK_FLAG(show_flags, BGP_SHOW_OPT_FAILED);
10779 bool show_established =
10780 CHECK_FLAG(show_flags, BGP_SHOW_OPT_ESTABLISHED);
10781 bool show_wide = CHECK_FLAG(show_flags, BGP_SHOW_OPT_WIDE);
96c81f66 10782 bool show_terse = CHECK_FLAG(show_flags, BGP_SHOW_OPT_TERSE);
d62a17ae 10783
10784 /* labeled-unicast routes are installed in the unicast table so in order
10785 * to
10786 * display the correct PfxRcd value we must look at SAFI_UNICAST
10787 */
3577f1c5 10788
d62a17ae 10789 if (safi == SAFI_LABELED_UNICAST)
10790 pfx_rcd_safi = SAFI_UNICAST;
10791 else
10792 pfx_rcd_safi = safi;
10793
10794 if (use_json) {
3c13337d 10795 json = json_object_new_object();
d62a17ae 10796 json_peers = json_object_new_object();
3577f1c5 10797 for (ALL_LIST_ELEMENTS(bgp->peer, node, nnode, peer)) {
8c1d4cd5
LS
10798 if (bgp_show_summary_is_peer_filtered(peer, fpeer,
10799 as_type, as)) {
ce1944f0 10800 filtered_count++;
8c1d4cd5
LS
10801 count++;
10802 continue;
10803 }
10804
3577f1c5
DD
10805 if (!CHECK_FLAG(peer->flags, PEER_FLAG_CONFIG_NODE))
10806 continue;
10807
10808 if (peer->afc[afi][safi]) {
10809 /* See if we have at least a single failed peer */
10810 if (bgp_has_peer_failed(peer, afi, safi))
10811 failed_count++;
10812 count++;
10813 }
10814 if (peer_dynamic_neighbor(peer))
10815 dn_count++;
10816 }
c258527b 10817
d62a17ae 10818 } else {
10819 /* Loop over all neighbors that will be displayed to determine
10820 * how many
10821 * characters are needed for the Neighbor column
10822 */
10823 for (ALL_LIST_ELEMENTS(bgp->peer, node, nnode, peer)) {
8c1d4cd5
LS
10824 if (bgp_show_summary_is_peer_filtered(peer, fpeer,
10825 as_type, as)) {
ce1944f0 10826 filtered_count++;
8c1d4cd5
LS
10827 count++;
10828 continue;
10829 }
10830
d62a17ae 10831 if (!CHECK_FLAG(peer->flags, PEER_FLAG_CONFIG_NODE))
10832 continue;
10833
10834 if (peer->afc[afi][safi]) {
10835 memset(dn_flag, '\0', sizeof(dn_flag));
10836 if (peer_dynamic_neighbor(peer))
10837 dn_flag[0] = '*';
10838
10839 if (peer->hostname
892fedb6
DA
10840 && CHECK_FLAG(bgp->flags,
10841 BGP_FLAG_SHOW_HOSTNAME))
772270f3
QY
10842 snprintf(neighbor_buf,
10843 sizeof(neighbor_buf),
10844 "%s%s(%s) ", dn_flag,
10845 peer->hostname, peer->host);
d62a17ae 10846 else
772270f3
QY
10847 snprintf(neighbor_buf,
10848 sizeof(neighbor_buf), "%s%s ",
10849 dn_flag, peer->host);
d62a17ae 10850
10851 len = strlen(neighbor_buf);
10852
10853 if (len > max_neighbor_width)
10854 max_neighbor_width = len;
c258527b 10855
3577f1c5
DD
10856 /* See if we have at least a single failed peer */
10857 if (bgp_has_peer_failed(peer, afi, safi))
10858 failed_count++;
10859 count++;
d62a17ae 10860 }
10861 }
f933309e 10862
d62a17ae 10863 /* Originally we displayed the Neighbor column as 16
10864 * characters wide so make that the default
10865 */
10866 if (max_neighbor_width < neighbor_col_default_width)
10867 max_neighbor_width = neighbor_col_default_width;
10868 }
f933309e 10869
3577f1c5
DD
10870 if (show_failed && !failed_count) {
10871 if (use_json) {
10872 json_object_int_add(json, "failedPeersCount", 0);
10873 json_object_int_add(json, "dynamicPeers", dn_count);
c258527b 10874 json_object_int_add(json, "totalPeers", count);
3577f1c5 10875
75eeda93 10876 vty_json(vty, json);
3577f1c5
DD
10877 } else {
10878 vty_out(vty, "%% No failed BGP neighbors found\n");
3577f1c5
DD
10879 }
10880 return CMD_SUCCESS;
10881 }
c258527b 10882
3577f1c5 10883 count = 0; /* Reset the value as its used again */
ce1944f0 10884 filtered_count = 0;
800867d8 10885 dn_count = 0;
d62a17ae 10886 for (ALL_LIST_ELEMENTS(bgp->peer, node, nnode, peer)) {
10887 if (!CHECK_FLAG(peer->flags, PEER_FLAG_CONFIG_NODE))
10888 continue;
10889
ea47320b
DL
10890 if (!peer->afc[afi][safi])
10891 continue;
d62a17ae 10892
ea47320b
DL
10893 if (!count) {
10894 unsigned long ents;
10895 char memstrbuf[MTYPE_MEMSTR_LEN];
a8bf7d9c 10896 int64_t vrf_id_ui;
d62a17ae 10897
a4d82a8a
PZ
10898 vrf_id_ui = (bgp->vrf_id == VRF_UNKNOWN)
10899 ? -1
10900 : (int64_t)bgp->vrf_id;
ea47320b
DL
10901
10902 /* Usage summary and header */
10903 if (use_json) {
c949c771
DA
10904 json_object_string_addf(json, "routerId",
10905 "%pI4",
10906 &bgp->router_id);
60466a63
QY
10907 json_object_int_add(json, "as", bgp->as);
10908 json_object_int_add(json, "vrfId", vrf_id_ui);
ea47320b
DL
10909 json_object_string_add(
10910 json, "vrfName",
10911 (bgp->inst_type
10912 == BGP_INSTANCE_TYPE_DEFAULT)
5742e42b 10913 ? VRF_DEFAULT_NAME
ea47320b
DL
10914 : bgp->name);
10915 } else {
10916 vty_out(vty,
23d0a753
DA
10917 "BGP router identifier %pI4, local AS number %u vrf-id %d",
10918 &bgp->router_id, bgp->as,
a4d82a8a
PZ
10919 bgp->vrf_id == VRF_UNKNOWN
10920 ? -1
10921 : (int)bgp->vrf_id);
ea47320b
DL
10922 vty_out(vty, "\n");
10923 }
d62a17ae 10924
ea47320b 10925 if (bgp_update_delay_configured(bgp)) {
d62a17ae 10926 if (use_json) {
ea47320b 10927 json_object_int_add(
60466a63 10928 json, "updateDelayLimit",
ea47320b 10929 bgp->v_update_delay);
d62a17ae 10930
ea47320b
DL
10931 if (bgp->v_update_delay
10932 != bgp->v_establish_wait)
d62a17ae 10933 json_object_int_add(
10934 json,
ea47320b
DL
10935 "updateDelayEstablishWait",
10936 bgp->v_establish_wait);
d62a17ae 10937
60466a63 10938 if (bgp_update_delay_active(bgp)) {
ea47320b
DL
10939 json_object_string_add(
10940 json,
10941 "updateDelayFirstNeighbor",
10942 bgp->update_delay_begin_time);
10943 json_object_boolean_true_add(
10944 json,
10945 "updateDelayInProgress");
10946 } else {
10947 if (bgp->update_delay_over) {
d62a17ae 10948 json_object_string_add(
10949 json,
10950 "updateDelayFirstNeighbor",
10951 bgp->update_delay_begin_time);
ea47320b 10952 json_object_string_add(
d62a17ae 10953 json,
ea47320b
DL
10954 "updateDelayBestpathResumed",
10955 bgp->update_delay_end_time);
10956 json_object_string_add(
d62a17ae 10957 json,
ea47320b
DL
10958 "updateDelayZebraUpdateResume",
10959 bgp->update_delay_zebra_resume_time);
10960 json_object_string_add(
10961 json,
10962 "updateDelayPeerUpdateResume",
10963 bgp->update_delay_peers_resume_time);
d62a17ae 10964 }
ea47320b
DL
10965 }
10966 } else {
10967 vty_out(vty,
10968 "Read-only mode update-delay limit: %d seconds\n",
10969 bgp->v_update_delay);
10970 if (bgp->v_update_delay
10971 != bgp->v_establish_wait)
d62a17ae 10972 vty_out(vty,
ea47320b
DL
10973 " Establish wait: %d seconds\n",
10974 bgp->v_establish_wait);
d62a17ae 10975
60466a63 10976 if (bgp_update_delay_active(bgp)) {
ea47320b
DL
10977 vty_out(vty,
10978 " First neighbor established: %s\n",
10979 bgp->update_delay_begin_time);
10980 vty_out(vty,
10981 " Delay in progress\n");
10982 } else {
10983 if (bgp->update_delay_over) {
d62a17ae 10984 vty_out(vty,
10985 " First neighbor established: %s\n",
10986 bgp->update_delay_begin_time);
10987 vty_out(vty,
ea47320b
DL
10988 " Best-paths resumed: %s\n",
10989 bgp->update_delay_end_time);
10990 vty_out(vty,
10991 " zebra update resumed: %s\n",
10992 bgp->update_delay_zebra_resume_time);
10993 vty_out(vty,
10994 " peers update resumed: %s\n",
10995 bgp->update_delay_peers_resume_time);
d62a17ae 10996 }
10997 }
10998 }
ea47320b 10999 }
d62a17ae 11000
ea47320b
DL
11001 if (use_json) {
11002 if (bgp_maxmed_onstartup_configured(bgp)
11003 && bgp->maxmed_active)
11004 json_object_boolean_true_add(
60466a63 11005 json, "maxMedOnStartup");
ea47320b
DL
11006 if (bgp->v_maxmed_admin)
11007 json_object_boolean_true_add(
60466a63 11008 json, "maxMedAdministrative");
d62a17ae 11009
ea47320b
DL
11010 json_object_int_add(
11011 json, "tableVersion",
60466a63 11012 bgp_table_version(bgp->rib[afi][safi]));
ea47320b 11013
60466a63
QY
11014 ents = bgp_table_count(bgp->rib[afi][safi]);
11015 json_object_int_add(json, "ribCount", ents);
ea47320b
DL
11016 json_object_int_add(
11017 json, "ribMemory",
9bcb3eef 11018 ents * sizeof(struct bgp_dest));
d62a17ae 11019
210ec2a0 11020 ents = bgp->af_peer_count[afi][safi];
60466a63
QY
11021 json_object_int_add(json, "peerCount", ents);
11022 json_object_int_add(json, "peerMemory",
11023 ents * sizeof(struct peer));
d62a17ae 11024
ea47320b
DL
11025 if ((ents = listcount(bgp->group))) {
11026 json_object_int_add(
60466a63 11027 json, "peerGroupCount", ents);
ea47320b
DL
11028 json_object_int_add(
11029 json, "peerGroupMemory",
996c9314
LB
11030 ents * sizeof(struct
11031 peer_group));
ea47320b 11032 }
d62a17ae 11033
ea47320b
DL
11034 if (CHECK_FLAG(bgp->af_flags[afi][safi],
11035 BGP_CONFIG_DAMPENING))
11036 json_object_boolean_true_add(
60466a63 11037 json, "dampeningEnabled");
ea47320b 11038 } else {
96c81f66
LS
11039 if (!show_terse) {
11040 if (bgp_maxmed_onstartup_configured(bgp)
11041 && bgp->maxmed_active)
11042 vty_out(vty,
11043 "Max-med on-startup active\n");
11044 if (bgp->v_maxmed_admin)
11045 vty_out(vty,
11046 "Max-med administrative active\n");
d62a17ae 11047
96c81f66
LS
11048 vty_out(vty,
11049 "BGP table version %" PRIu64
11050 "\n",
11051 bgp_table_version(
11052 bgp->rib[afi][safi]));
ea47320b 11053
96c81f66
LS
11054 ents = bgp_table_count(
11055 bgp->rib[afi][safi]);
d62a17ae 11056 vty_out(vty,
96c81f66 11057 "RIB entries %ld, using %s of memory\n",
d62a17ae 11058 ents,
11059 mtype_memstr(
11060 memstrbuf,
11061 sizeof(memstrbuf),
96c81f66
LS
11062 ents
11063 * sizeof(
11064 struct
11065 bgp_dest)));
d62a17ae 11066
96c81f66
LS
11067 /* Peer related usage */
11068 ents = bgp->af_peer_count[afi][safi];
11069 vty_out(vty,
11070 "Peers %ld, using %s of memory\n",
11071 ents,
11072 mtype_memstr(
11073 memstrbuf,
11074 sizeof(memstrbuf),
11075 ents
11076 * sizeof(
11077 struct
11078 peer)));
d62a17ae 11079
96c81f66
LS
11080 if ((ents = listcount(bgp->group)))
11081 vty_out(vty,
11082 "Peer groups %ld, using %s of memory\n",
11083 ents,
11084 mtype_memstr(
11085 memstrbuf,
11086 sizeof(memstrbuf),
11087 ents
11088 * sizeof(
11089 struct
11090 peer_group)));
11091
11092 if (CHECK_FLAG(bgp->af_flags[afi][safi],
11093 BGP_CONFIG_DAMPENING))
11094 vty_out(vty,
11095 "Dampening enabled.\n");
11096 }
11097 if (show_failed) {
11098 vty_out(vty, "\n");
11099
11100 /* Subtract 8 here because 'Neighbor' is
11101 * 8 characters */
11102 vty_out(vty, "Neighbor");
11103 vty_out(vty, "%*s",
11104 max_neighbor_width - 8, " ");
85eeb029
DA
11105 vty_out(vty,
11106 BGP_SHOW_SUMMARY_HEADER_FAILED);
96c81f66 11107 }
d62a17ae 11108 }
ea47320b 11109 }
d62a17ae 11110
d55811cc 11111 paf = peer_af_find(peer, afi, safi);
d3ada366 11112 filter = &peer->filter[afi][safi];
db92d226 11113
ea47320b 11114 count++;
3577f1c5
DD
11115 /* Works for both failed & successful cases */
11116 if (peer_dynamic_neighbor(peer))
11117 dn_count++;
d62a17ae 11118
ea47320b 11119 if (use_json) {
3577f1c5 11120 json_peer = NULL;
8c1d4cd5 11121 if (bgp_show_summary_is_peer_filtered(peer, fpeer,
ce1944f0
LS
11122 as_type, as)) {
11123 filtered_count++;
8c1d4cd5 11124 continue;
ce1944f0 11125 }
3577f1c5
DD
11126 if (show_failed &&
11127 bgp_has_peer_failed(peer, afi, safi)) {
11128 json_peer = json_object_new_object();
11129 bgp_show_failed_summary(vty, bgp, peer,
11130 json_peer, 0, use_json);
11131 } else if (!show_failed) {
10b49f14 11132 if (show_established
ce1944f0
LS
11133 && bgp_has_peer_failed(peer, afi, safi)) {
11134 filtered_count++;
10b49f14 11135 continue;
ce1944f0 11136 }
10b49f14 11137
3577f1c5
DD
11138 json_peer = json_object_new_object();
11139 if (peer_dynamic_neighbor(peer)) {
11140 json_object_boolean_true_add(json_peer,
11141 "dynamicPeer");
11142 }
d62a17ae 11143
3577f1c5
DD
11144 if (peer->hostname)
11145 json_object_string_add(json_peer, "hostname",
11146 peer->hostname);
11147
11148 if (peer->domainname)
11149 json_object_string_add(json_peer, "domainname",
11150 peer->domainname);
11151
11152 json_object_int_add(json_peer, "remoteAs", peer->as);
c854765f
DA
11153 json_object_int_add(
11154 json_peer, "localAs",
11155 peer->change_local_as
11156 ? peer->change_local_as
11157 : peer->local_as);
3577f1c5
DD
11158 json_object_int_add(json_peer, "version", 4);
11159 json_object_int_add(json_peer, "msgRcvd",
11160 PEER_TOTAL_RX(peer));
11161 json_object_int_add(json_peer, "msgSent",
11162 PEER_TOTAL_TX(peer));
11163
43aa5965
QY
11164 atomic_size_t outq_count, inq_count;
11165 outq_count = atomic_load_explicit(
11166 &peer->obuf->count,
11167 memory_order_relaxed);
11168 inq_count = atomic_load_explicit(
11169 &peer->ibuf->count,
11170 memory_order_relaxed);
11171
3577f1c5
DD
11172 json_object_int_add(json_peer, "tableVersion",
11173 peer->version[afi][safi]);
11174 json_object_int_add(json_peer, "outq",
43aa5965
QY
11175 outq_count);
11176 json_object_int_add(json_peer, "inq",
11177 inq_count);
3577f1c5
DD
11178 peer_uptime(peer->uptime, timebuf, BGP_UPTIME_LEN,
11179 use_json, json_peer);
11180
3577f1c5
DD
11181 json_object_int_add(json_peer, "pfxRcd",
11182 peer->pcount[afi][pfx_rcd_safi]);
11183
3577f1c5 11184 if (paf && PAF_SUBGRP(paf))
a616dd1f
DA
11185 json_object_int_add(
11186 json_peer, "pfxSnt",
11187 (PAF_SUBGRP(paf))->scount);
11188 else
11189 json_object_int_add(json_peer, "pfxSnt",
11190 0);
0e1f8ab5
DA
11191
11192 /* BGP FSM state */
cb9196e7 11193 if (CHECK_FLAG(peer->flags, PEER_FLAG_SHUTDOWN)
736b68f3
DS
11194 || CHECK_FLAG(peer->bgp->flags,
11195 BGP_FLAG_SHUTDOWN))
0e1f8ab5
DA
11196 json_object_string_add(json_peer,
11197 "state",
3577f1c5
DD
11198 "Idle (Admin)");
11199 else if (peer->afc_recv[afi][safi])
11200 json_object_string_add(
0e1f8ab5
DA
11201 json_peer, "state",
11202 lookup_msg(bgp_status_msg,
11203 peer->status, NULL));
11204 else if (CHECK_FLAG(
11205 peer->sflags,
11206 PEER_STATUS_PREFIX_OVERFLOW))
11207 json_object_string_add(json_peer,
11208 "state",
3577f1c5
DD
11209 "Idle (PfxCt)");
11210 else
11211 json_object_string_add(
0e1f8ab5
DA
11212 json_peer, "state",
11213 lookup_msg(bgp_status_msg,
11214 peer->status, NULL));
11215
11216 /* BGP peer state */
11217 if (CHECK_FLAG(peer->flags, PEER_FLAG_SHUTDOWN)
11218 || CHECK_FLAG(peer->bgp->flags,
11219 BGP_FLAG_SHUTDOWN))
11220 json_object_string_add(json_peer,
11221 "peerState",
11222 "Admin");
11223 else if (CHECK_FLAG(
11224 peer->sflags,
11225 PEER_STATUS_PREFIX_OVERFLOW))
11226 json_object_string_add(json_peer,
11227 "peerState",
11228 "PfxCt");
11229 else if (CHECK_FLAG(peer->flags,
11230 PEER_FLAG_PASSIVE))
11231 json_object_string_add(json_peer,
11232 "peerState",
11233 "Passive");
11234 else if (CHECK_FLAG(peer->sflags,
11235 PEER_STATUS_NSF_WAIT))
11236 json_object_string_add(json_peer,
11237 "peerState",
11238 "NSF passive");
11239 else if (CHECK_FLAG(
11240 peer->bgp->flags,
11241 BGP_FLAG_EBGP_REQUIRES_POLICY)
11242 && (!bgp_inbound_policy_exists(peer,
11243 filter)
11244 || !bgp_outbound_policy_exists(
11245 peer, filter)))
11246 json_object_string_add(json_peer,
11247 "peerState",
11248 "Policy");
11249 else
11250 json_object_string_add(
11251 json_peer, "peerState", "OK");
11252
200116db
DD
11253 json_object_int_add(json_peer, "connectionsEstablished",
11254 peer->established);
11255 json_object_int_add(json_peer, "connectionsDropped",
11256 peer->dropped);
aa72bd7e
PG
11257 if (peer->desc)
11258 json_object_string_add(
11259 json_peer, "desc", peer->desc);
b4e9dcba 11260 }
3577f1c5
DD
11261 /* Avoid creating empty peer dicts in JSON */
11262 if (json_peer == NULL)
11263 continue;
ea47320b
DL
11264
11265 if (peer->conf_if)
60466a63 11266 json_object_string_add(json_peer, "idType",
ea47320b
DL
11267 "interface");
11268 else if (peer->su.sa.sa_family == AF_INET)
60466a63
QY
11269 json_object_string_add(json_peer, "idType",
11270 "ipv4");
ea47320b 11271 else if (peer->su.sa.sa_family == AF_INET6)
60466a63
QY
11272 json_object_string_add(json_peer, "idType",
11273 "ipv6");
ea47320b
DL
11274 json_object_object_add(json_peers, peer->host,
11275 json_peer);
11276 } else {
8c1d4cd5 11277 if (bgp_show_summary_is_peer_filtered(peer, fpeer,
ce1944f0
LS
11278 as_type, as)) {
11279 filtered_count++;
8c1d4cd5 11280 continue;
ce1944f0 11281 }
3577f1c5
DD
11282 if (show_failed &&
11283 bgp_has_peer_failed(peer, afi, safi)) {
11284 bgp_show_failed_summary(vty, bgp, peer, NULL,
11285 max_neighbor_width,
11286 use_json);
11287 } else if (!show_failed) {
10b49f14 11288 if (show_established
ce1944f0
LS
11289 && bgp_has_peer_failed(peer, afi, safi)) {
11290 filtered_count++;
10b49f14 11291 continue;
ce1944f0 11292 }
96c81f66
LS
11293
11294 if ((count - filtered_count) == 1) {
11295 /* display headline before the first
11296 * neighbor line */
11297 vty_out(vty, "\n");
11298
11299 /* Subtract 8 here because 'Neighbor' is
11300 * 8 characters */
11301 vty_out(vty, "Neighbor");
11302 vty_out(vty, "%*s",
11303 max_neighbor_width - 8, " ");
11304 vty_out(vty,
11305 show_wide
11306 ? BGP_SHOW_SUMMARY_HEADER_ALL_WIDE
11307 : BGP_SHOW_SUMMARY_HEADER_ALL);
11308 }
11309
3577f1c5
DD
11310 memset(dn_flag, '\0', sizeof(dn_flag));
11311 if (peer_dynamic_neighbor(peer)) {
11312 dn_flag[0] = '*';
11313 }
d62a17ae 11314
3577f1c5 11315 if (peer->hostname
892fedb6
DA
11316 && CHECK_FLAG(bgp->flags,
11317 BGP_FLAG_SHOW_HOSTNAME))
3577f1c5 11318 len = vty_out(vty, "%s%s(%s)", dn_flag,
892fedb6
DA
11319 peer->hostname,
11320 peer->host);
d62a17ae 11321 else
3577f1c5
DD
11322 len = vty_out(vty, "%s%s", dn_flag, peer->host);
11323
11324 /* pad the neighbor column with spaces */
11325 if (len < max_neighbor_width)
11326 vty_out(vty, "%*s", max_neighbor_width - len,
11327 " ");
11328
43aa5965
QY
11329 atomic_size_t outq_count, inq_count;
11330 outq_count = atomic_load_explicit(
11331 &peer->obuf->count,
11332 memory_order_relaxed);
11333 inq_count = atomic_load_explicit(
11334 &peer->ibuf->count,
11335 memory_order_relaxed);
11336
85eeb029
DA
11337 if (show_wide)
11338 vty_out(vty,
11339 "4 %10u %10u %9u %9u %8" PRIu64
11340 " %4zu %4zu %8s",
11341 peer->as,
11342 peer->change_local_as
11343 ? peer->change_local_as
11344 : peer->local_as,
11345 PEER_TOTAL_RX(peer),
11346 PEER_TOTAL_TX(peer),
11347 peer->version[afi][safi],
11348 inq_count, outq_count,
11349 peer_uptime(peer->uptime,
11350 timebuf,
11351 BGP_UPTIME_LEN, 0,
11352 NULL));
11353 else
11354 vty_out(vty, "4 %10u %9u %9u %8" PRIu64
11355 " %4zu %4zu %8s",
11356 peer->as, PEER_TOTAL_RX(peer),
11357 PEER_TOTAL_TX(peer),
11358 peer->version[afi][safi],
11359 inq_count, outq_count,
11360 peer_uptime(peer->uptime,
11361 timebuf,
11362 BGP_UPTIME_LEN, 0,
11363 NULL));
3577f1c5 11364
feb17238 11365 if (peer_established(peer)) {
d3ada366
DA
11366 if (peer->afc_recv[afi][safi]) {
11367 if (CHECK_FLAG(
11368 bgp->flags,
11369 BGP_FLAG_EBGP_REQUIRES_POLICY)
11370 && !bgp_inbound_policy_exists(
11371 peer, filter))
11372 vty_out(vty, " %12s",
11373 "(Policy)");
11374 else
11375 vty_out(vty,
6cde4b45 11376 " %12u",
d3ada366
DA
11377 peer->pcount
11378 [afi]
11379 [pfx_rcd_safi]);
11380 } else {
749d0f27 11381 vty_out(vty, " NoNeg");
d3ada366 11382 }
db92d226 11383
d3ada366
DA
11384 if (paf && PAF_SUBGRP(paf)) {
11385 if (CHECK_FLAG(
11386 bgp->flags,
11387 BGP_FLAG_EBGP_REQUIRES_POLICY)
11388 && !bgp_outbound_policy_exists(
11389 peer, filter))
11390 vty_out(vty, " %8s",
11391 "(Policy)");
11392 else
11393 vty_out(vty,
6cde4b45 11394 " %8u",
d3ada366
DA
11395 (PAF_SUBGRP(
11396 paf))
11397 ->scount);
749d0f27
DA
11398 } else {
11399 vty_out(vty, " NoNeg");
d3ada366 11400 }
db92d226 11401 } else {
736b68f3
DS
11402 if (CHECK_FLAG(peer->flags,
11403 PEER_FLAG_SHUTDOWN)
11404 || CHECK_FLAG(peer->bgp->flags,
11405 BGP_FLAG_SHUTDOWN))
3577f1c5
DD
11406 vty_out(vty, " Idle (Admin)");
11407 else if (CHECK_FLAG(
11408 peer->sflags,
11409 PEER_STATUS_PREFIX_OVERFLOW))
11410 vty_out(vty, " Idle (PfxCt)");
11411 else
11412 vty_out(vty, " %12s",
11413 lookup_msg(bgp_status_msg,
11414 peer->status, NULL));
db92d226 11415
6cde4b45 11416 vty_out(vty, " %8u", 0);
3577f1c5 11417 }
565e9ddd
DA
11418 /* Make sure `Desc` column is the lastest in
11419 * the output.
11420 */
aa72bd7e 11421 if (peer->desc)
cb75bb31
DA
11422 vty_out(vty, " %s",
11423 bgp_peer_description_stripped(
85eeb029
DA
11424 peer->desc,
11425 show_wide ? 64 : 20));
aa72bd7e
PG
11426 else
11427 vty_out(vty, " N/A");
3577f1c5 11428 vty_out(vty, "\n");
d62a17ae 11429 }
3577f1c5 11430
d62a17ae 11431 }
11432 }
f933309e 11433
d62a17ae 11434 if (use_json) {
11435 json_object_object_add(json, "peers", json_peers);
3577f1c5 11436 json_object_int_add(json, "failedPeers", failed_count);
ce1944f0
LS
11437 json_object_int_add(json, "displayedPeers",
11438 count - filtered_count);
d62a17ae 11439 json_object_int_add(json, "totalPeers", count);
11440 json_object_int_add(json, "dynamicPeers", dn_count);
11441
3577f1c5
DD
11442 if (!show_failed)
11443 bgp_show_bestpath_json(bgp, json);
57a9c8a8 11444
75eeda93 11445 vty_json(vty, json);
d62a17ae 11446 } else {
ce1944f0 11447 if (count) {
96c81f66
LS
11448 if (filtered_count == count)
11449 vty_out(vty, "\n%% No matching neighbor\n");
11450 else {
11451 if (show_failed)
11452 vty_out(vty, "\nDisplayed neighbors %d",
11453 failed_count);
11454 else if (as_type != AS_UNSPECIFIED || as
11455 || fpeer || show_established)
ce1944f0
LS
11456 vty_out(vty, "\nDisplayed neighbors %d",
11457 count - filtered_count);
96c81f66
LS
11458
11459 vty_out(vty, "\nTotal number of neighbors %d\n",
11460 count);
ce1944f0 11461 }
ce1944f0 11462 } else {
d6ceaca3 11463 vty_out(vty, "No %s neighbor is configured\n",
5cb5f4d0 11464 get_afi_safi_str(afi, safi, false));
d62a17ae 11465 }
b05a1c8b 11466
d6ceaca3 11467 if (dn_count) {
d62a17ae 11468 vty_out(vty, "* - dynamic neighbor\n");
11469 vty_out(vty, "%d dynamic neighbor(s), limit %d\n",
11470 dn_count, bgp->dynamic_neighbors_limit);
11471 }
11472 }
1ff9a340 11473
d62a17ae 11474 return CMD_SUCCESS;
718e3744 11475}
11476
d62a17ae 11477static void bgp_show_summary_afi_safi(struct vty *vty, struct bgp *bgp, int afi,
8c1d4cd5 11478 int safi, struct peer *fpeer, int as_type,
96c81f66 11479 as_t as, uint16_t show_flags)
d62a17ae 11480{
11481 int is_first = 1;
11482 int afi_wildcard = (afi == AFI_MAX);
11483 int safi_wildcard = (safi == SAFI_MAX);
11484 int is_wildcard = (afi_wildcard || safi_wildcard);
9f049418 11485 bool nbr_output = false;
85eeb029 11486 bool use_json = CHECK_FLAG(show_flags, BGP_SHOW_OPT_JSON);
d62a17ae 11487
11488 if (use_json && is_wildcard)
11489 vty_out(vty, "{\n");
11490 if (afi_wildcard)
11491 afi = 1; /* AFI_IP */
11492 while (afi < AFI_MAX) {
11493 if (safi_wildcard)
11494 safi = 1; /* SAFI_UNICAST */
11495 while (safi < SAFI_MAX) {
318cac96 11496 if (bgp_afi_safi_peer_exists(bgp, afi, safi)) {
9f049418 11497 nbr_output = true;
f86897b9 11498
d62a17ae 11499 if (is_wildcard) {
11500 /*
11501 * So limit output to those afi/safi
11502 * pairs that
11503 * actualy have something interesting in
11504 * them
11505 */
11506 if (use_json) {
d62a17ae 11507 if (!is_first)
11508 vty_out(vty, ",\n");
11509 else
11510 is_first = 0;
11511
11512 vty_out(vty, "\"%s\":",
5cb5f4d0
DD
11513 get_afi_safi_str(afi,
11514 safi,
11515 true));
d62a17ae 11516 } else {
6cac2fcc
LS
11517 vty_out(vty,
11518 "\n%s Summary (%s):\n",
5cb5f4d0
DD
11519 get_afi_safi_str(afi,
11520 safi,
6cac2fcc
LS
11521 false),
11522 bgp->name_pretty);
d62a17ae 11523 }
11524 }
8c1d4cd5
LS
11525 bgp_show_summary(vty, bgp, afi, safi, fpeer,
11526 as_type, as, show_flags);
d62a17ae 11527 }
11528 safi++;
d62a17ae 11529 if (!safi_wildcard)
11530 safi = SAFI_MAX;
11531 }
11532 afi++;
ee851c8c 11533 if (!afi_wildcard)
d62a17ae 11534 afi = AFI_MAX;
11535 }
11536
11537 if (use_json && is_wildcard)
11538 vty_out(vty, "}\n");
ca61fd25
DS
11539 else if (!nbr_output) {
11540 if (use_json)
11541 vty_out(vty, "{}\n");
11542 else
6cac2fcc
LS
11543 vty_out(vty, "%% No BGP neighbors found in %s\n",
11544 bgp->name_pretty);
ca61fd25 11545 }
d62a17ae 11546}
11547
11548static void bgp_show_all_instances_summary_vty(struct vty *vty, afi_t afi,
8c1d4cd5
LS
11549 safi_t safi,
11550 const char *neighbor,
11551 int as_type, as_t as,
96c81f66 11552 uint16_t show_flags)
d62a17ae 11553{
11554 struct listnode *node, *nnode;
11555 struct bgp *bgp;
8c1d4cd5 11556 struct peer *fpeer = NULL;
d62a17ae 11557 int is_first = 1;
9f049418 11558 bool nbr_output = false;
85eeb029 11559 bool use_json = CHECK_FLAG(show_flags, BGP_SHOW_OPT_JSON);
d62a17ae 11560
11561 if (use_json)
11562 vty_out(vty, "{\n");
11563
11564 for (ALL_LIST_ELEMENTS(bm->bgp, node, nnode, bgp)) {
9f049418 11565 nbr_output = true;
d62a17ae 11566 if (use_json) {
d62a17ae 11567 if (!is_first)
11568 vty_out(vty, ",\n");
11569 else
11570 is_first = 0;
11571
11572 vty_out(vty, "\"%s\":",
11573 (bgp->inst_type == BGP_INSTANCE_TYPE_DEFAULT)
5742e42b 11574 ? VRF_DEFAULT_NAME
d62a17ae 11575 : bgp->name);
d62a17ae 11576 }
8c1d4cd5
LS
11577 if (neighbor) {
11578 fpeer = peer_lookup_in_view(vty, bgp, neighbor,
11579 use_json);
11580 if (!fpeer)
11581 continue;
11582 }
11583 bgp_show_summary_afi_safi(vty, bgp, afi, safi, fpeer, as_type,
11584 as, show_flags);
d62a17ae 11585 }
11586
11587 if (use_json)
11588 vty_out(vty, "}\n");
9f049418
DS
11589 else if (!nbr_output)
11590 vty_out(vty, "%% BGP instance not found\n");
d62a17ae 11591}
11592
11593int bgp_show_summary_vty(struct vty *vty, const char *name, afi_t afi,
8c1d4cd5 11594 safi_t safi, const char *neighbor, int as_type,
96c81f66 11595 as_t as, uint16_t show_flags)
d62a17ae 11596{
11597 struct bgp *bgp;
85eeb029 11598 bool use_json = CHECK_FLAG(show_flags, BGP_SHOW_OPT_JSON);
8c1d4cd5 11599 struct peer *fpeer = NULL;
d62a17ae 11600
11601 if (name) {
11602 if (strmatch(name, "all")) {
85eeb029 11603 bgp_show_all_instances_summary_vty(vty, afi, safi,
8c1d4cd5
LS
11604 neighbor, as_type,
11605 as, show_flags);
d62a17ae 11606 return CMD_SUCCESS;
11607 } else {
11608 bgp = bgp_lookup_by_name(name);
11609
11610 if (!bgp) {
11611 if (use_json)
11612 vty_out(vty, "{}\n");
11613 else
11614 vty_out(vty,
ca61fd25 11615 "%% BGP instance not found\n");
d62a17ae 11616 return CMD_WARNING;
11617 }
11618
8c1d4cd5
LS
11619 if (neighbor) {
11620 fpeer = peer_lookup_in_view(vty, bgp, neighbor,
11621 use_json);
11622 if (!fpeer)
11623 return CMD_WARNING;
11624 }
11625 bgp_show_summary_afi_safi(vty, bgp, afi, safi, fpeer,
11626 as_type, as, show_flags);
d62a17ae 11627 return CMD_SUCCESS;
11628 }
11629 }
11630
11631 bgp = bgp_get_default();
11632
8c1d4cd5
LS
11633 if (bgp) {
11634 if (neighbor) {
11635 fpeer = peer_lookup_in_view(vty, bgp, neighbor,
11636 use_json);
11637 if (!fpeer)
11638 return CMD_WARNING;
11639 }
11640 bgp_show_summary_afi_safi(vty, bgp, afi, safi, fpeer, as_type,
11641 as, show_flags);
11642 } else {
ca61fd25
DS
11643 if (use_json)
11644 vty_out(vty, "{}\n");
11645 else
11646 vty_out(vty, "%% BGP instance not found\n");
9f049418
DS
11647 return CMD_WARNING;
11648 }
d62a17ae 11649
11650 return CMD_SUCCESS;
4fb25c53
DW
11651}
11652
716b2d8a 11653/* `show [ip] bgp summary' commands. */
8c1d4cd5
LS
11654DEFPY(show_ip_bgp_summary, show_ip_bgp_summary_cmd,
11655 "show [ip] bgp [<view|vrf> VIEWVRFNAME] [" BGP_AFI_CMD_STR
11656 " [" BGP_SAFI_WITH_LABEL_CMD_STR
96c81f66 11657 "]] [all$all] summary [established|failed] [<neighbor <A.B.C.D|X:X::X:X|WORD>|remote-as <(1-4294967295)|internal|external>>] [terse] [wide] [json$uj]",
8c1d4cd5
LS
11658 SHOW_STR IP_STR BGP_STR BGP_INSTANCE_HELP_STR BGP_AFI_HELP_STR
11659 BGP_SAFI_WITH_LABEL_HELP_STR
11660 "Display the entries for all address families\n"
11661 "Summary of BGP neighbor status\n"
11662 "Show only sessions in Established state\n"
11663 "Show only sessions not in Established state\n"
11664 "Show only the specified neighbor session\n"
11665 "Neighbor to display information about\n"
11666 "Neighbor to display information about\n"
11667 "Neighbor on BGP configured interface\n"
11668 "Show only the specified remote AS sessions\n"
11669 "AS number\n"
11670 "Internal (iBGP) AS sessions\n"
11671 "External (eBGP) AS sessions\n"
96c81f66 11672 "Shorten the information on BGP instances\n"
8c1d4cd5 11673 "Increase table width for longer output\n" JSON_STR)
718e3744 11674{
d62a17ae 11675 char *vrf = NULL;
11676 afi_t afi = AFI_MAX;
11677 safi_t safi = SAFI_MAX;
8c1d4cd5
LS
11678 as_t as = 0; /* 0 means AS filter not set */
11679 int as_type = AS_UNSPECIFIED;
96c81f66 11680 uint16_t show_flags = 0;
d62a17ae 11681
11682 int idx = 0;
11683
11684 /* show [ip] bgp */
96f3485c 11685 if (!all && argv_find(argv, argc, "ip", &idx))
d62a17ae 11686 afi = AFI_IP;
9a8bdf1c
PG
11687 /* [<vrf> VIEWVRFNAME] */
11688 if (argv_find(argv, argc, "vrf", &idx)) {
11689 vrf = argv[idx + 1]->arg;
11690 if (vrf && strmatch(vrf, VRF_DEFAULT_NAME))
11691 vrf = NULL;
11692 } else if (argv_find(argv, argc, "view", &idx))
11693 /* [<view> VIEWVRFNAME] */
11694 vrf = argv[idx + 1]->arg;
d62a17ae 11695 /* ["BGP_AFI_CMD_STR" ["BGP_SAFI_CMD_STR"]] */
11696 if (argv_find_and_parse_afi(argv, argc, &idx, &afi)) {
11697 argv_find_and_parse_safi(argv, argc, &idx, &safi);
11698 }
11699
3577f1c5 11700 if (argv_find(argv, argc, "failed", &idx))
85eeb029
DA
11701 SET_FLAG(show_flags, BGP_SHOW_OPT_FAILED);
11702
10b49f14 11703 if (argv_find(argv, argc, "established", &idx))
85eeb029
DA
11704 SET_FLAG(show_flags, BGP_SHOW_OPT_ESTABLISHED);
11705
8c1d4cd5
LS
11706 if (argv_find(argv, argc, "remote-as", &idx)) {
11707 if (argv[idx + 1]->arg[0] == 'i')
11708 as_type = AS_INTERNAL;
11709 else if (argv[idx + 1]->arg[0] == 'e')
11710 as_type = AS_EXTERNAL;
11711 else
11712 as = (as_t)atoi(argv[idx + 1]->arg);
11713 }
11714
96c81f66
LS
11715 if (argv_find(argv, argc, "terse", &idx))
11716 SET_FLAG(show_flags, BGP_SHOW_OPT_TERSE);
11717
85eeb029
DA
11718 if (argv_find(argv, argc, "wide", &idx))
11719 SET_FLAG(show_flags, BGP_SHOW_OPT_WIDE);
11720
11721 if (argv_find(argv, argc, "json", &idx))
11722 SET_FLAG(show_flags, BGP_SHOW_OPT_JSON);
3577f1c5 11723
8c1d4cd5
LS
11724 return bgp_show_summary_vty(vty, vrf, afi, safi, neighbor, as_type, as,
11725 show_flags);
d62a17ae 11726}
11727
5cb5f4d0 11728const char *get_afi_safi_str(afi_t afi, safi_t safi, bool for_json)
d62a17ae 11729{
5cb5f4d0
DD
11730 if (for_json)
11731 return get_afi_safi_json_str(afi, safi);
d62a17ae 11732 else
5cb5f4d0 11733 return get_afi_safi_vty_str(afi, safi);
27162734
LB
11734}
11735
d62a17ae 11736
11737static void bgp_show_peer_afi_orf_cap(struct vty *vty, struct peer *p,
11738 afi_t afi, safi_t safi,
d7c0a89a
QY
11739 uint16_t adv_smcap, uint16_t adv_rmcap,
11740 uint16_t rcv_smcap, uint16_t rcv_rmcap,
9f049418 11741 bool use_json, json_object *json_pref)
d62a17ae 11742{
11743 /* Send-Mode */
11744 if (CHECK_FLAG(p->af_cap[afi][safi], adv_smcap)
11745 || CHECK_FLAG(p->af_cap[afi][safi], rcv_smcap)) {
11746 if (use_json) {
11747 if (CHECK_FLAG(p->af_cap[afi][safi], adv_smcap)
11748 && CHECK_FLAG(p->af_cap[afi][safi], rcv_smcap))
11749 json_object_string_add(json_pref, "sendMode",
11750 "advertisedAndReceived");
11751 else if (CHECK_FLAG(p->af_cap[afi][safi], adv_smcap))
11752 json_object_string_add(json_pref, "sendMode",
11753 "advertised");
11754 else if (CHECK_FLAG(p->af_cap[afi][safi], rcv_smcap))
11755 json_object_string_add(json_pref, "sendMode",
11756 "received");
11757 } else {
11758 vty_out(vty, " Send-mode: ");
11759 if (CHECK_FLAG(p->af_cap[afi][safi], adv_smcap))
11760 vty_out(vty, "advertised");
11761 if (CHECK_FLAG(p->af_cap[afi][safi], rcv_smcap))
11762 vty_out(vty, "%sreceived",
11763 CHECK_FLAG(p->af_cap[afi][safi],
11764 adv_smcap)
11765 ? ", "
11766 : "");
11767 vty_out(vty, "\n");
11768 }
11769 }
11770
11771 /* Receive-Mode */
11772 if (CHECK_FLAG(p->af_cap[afi][safi], adv_rmcap)
11773 || CHECK_FLAG(p->af_cap[afi][safi], rcv_rmcap)) {
11774 if (use_json) {
11775 if (CHECK_FLAG(p->af_cap[afi][safi], adv_rmcap)
11776 && CHECK_FLAG(p->af_cap[afi][safi], rcv_rmcap))
11777 json_object_string_add(json_pref, "recvMode",
11778 "advertisedAndReceived");
11779 else if (CHECK_FLAG(p->af_cap[afi][safi], adv_rmcap))
11780 json_object_string_add(json_pref, "recvMode",
11781 "advertised");
11782 else if (CHECK_FLAG(p->af_cap[afi][safi], rcv_rmcap))
11783 json_object_string_add(json_pref, "recvMode",
11784 "received");
11785 } else {
11786 vty_out(vty, " Receive-mode: ");
11787 if (CHECK_FLAG(p->af_cap[afi][safi], adv_rmcap))
11788 vty_out(vty, "advertised");
11789 if (CHECK_FLAG(p->af_cap[afi][safi], rcv_rmcap))
11790 vty_out(vty, "%sreceived",
11791 CHECK_FLAG(p->af_cap[afi][safi],
11792 adv_rmcap)
11793 ? ", "
11794 : "");
11795 vty_out(vty, "\n");
11796 }
11797 }
11798}
11799
eea685b6
DA
11800static void bgp_show_neighnor_graceful_restart_flags(struct vty *vty,
11801 struct peer *p,
11802 bool use_json,
11803 json_object *json)
2986cac2 11804{
eea685b6
DA
11805 bool rbit = false;
11806 bool nbit = false;
2986cac2 11807
13909c4f
DS
11808 if (CHECK_FLAG(p->cap, PEER_CAP_RESTART_ADV)
11809 && (CHECK_FLAG(p->cap, PEER_CAP_RESTART_RCV))
feb17238 11810 && (peer_established(p))) {
eea685b6
DA
11811 rbit = CHECK_FLAG(p->cap, PEER_CAP_GRACEFUL_RESTART_R_BIT_RCV);
11812 nbit = CHECK_FLAG(p->cap, PEER_CAP_GRACEFUL_RESTART_N_BIT_RCV);
2986cac2 11813 }
11814
eea685b6
DA
11815 if (use_json) {
11816 json_object_boolean_add(json, "rBit", rbit);
11817 json_object_boolean_add(json, "nBit", nbit);
2986cac2 11818 } else {
eea685b6
DA
11819 vty_out(vty, "\n R bit: %s", rbit ? "True" : "False");
11820 vty_out(vty, "\n N bit: %s\n", nbit ? "True" : "False");
2986cac2 11821 }
11822}
11823
13909c4f
DS
11824static void bgp_show_neighbor_graceful_restart_remote_mode(struct vty *vty,
11825 struct peer *peer,
11826 bool use_json,
11827 json_object *json)
2986cac2 11828{
2bb5d39b 11829 const char *mode = "NotApplicable";
2986cac2 11830
11831 if (!use_json)
a53ca37b 11832 vty_out(vty, "\n Remote GR Mode: ");
2986cac2 11833
13909c4f 11834 if (CHECK_FLAG(peer->cap, PEER_CAP_RESTART_ADV)
feb17238 11835 && (peer_established(peer))) {
2986cac2 11836
13909c4f
DS
11837 if ((peer->nsf_af_count == 0)
11838 && !CHECK_FLAG(peer->cap, PEER_CAP_RESTART_RCV)) {
2986cac2 11839
2986cac2 11840 mode = "Disable";
11841
13909c4f
DS
11842 } else if (peer->nsf_af_count == 0
11843 && CHECK_FLAG(peer->cap, PEER_CAP_RESTART_RCV)) {
2986cac2 11844
2986cac2 11845 mode = "Helper";
11846
13909c4f
DS
11847 } else if (peer->nsf_af_count != 0
11848 && CHECK_FLAG(peer->cap, PEER_CAP_RESTART_RCV)) {
2986cac2 11849
2986cac2 11850 mode = "Restart";
2986cac2 11851 }
11852 }
11853
11854 if (use_json) {
13909c4f 11855 json_object_string_add(json, "remoteGrMode", mode);
2986cac2 11856 } else
11857 vty_out(vty, mode, "\n");
11858}
11859
13909c4f
DS
11860static void bgp_show_neighbor_graceful_restart_local_mode(struct vty *vty,
11861 struct peer *p,
11862 bool use_json,
11863 json_object *json)
2986cac2 11864{
11865 const char *mode = "Invalid";
11866
11867 if (!use_json)
a53ca37b 11868 vty_out(vty, " Local GR Mode: ");
2986cac2 11869
11870 if (bgp_peer_gr_mode_get(p) == PEER_HELPER)
11871 mode = "Helper";
11872 else if (bgp_peer_gr_mode_get(p) == PEER_GR)
11873 mode = "Restart";
11874 else if (bgp_peer_gr_mode_get(p) == PEER_DISABLE)
11875 mode = "Disable";
2ba1fe69 11876 else if (bgp_peer_gr_mode_get(p) == PEER_GLOBAL_INHERIT) {
2986cac2 11877 if (bgp_global_gr_mode_get(p->bgp) == GLOBAL_HELPER)
11878 mode = "Helper*";
11879 else if (bgp_global_gr_mode_get(p->bgp) == GLOBAL_GR)
11880 mode = "Restart*";
11881 else if (bgp_global_gr_mode_get(p->bgp) == GLOBAL_DISABLE)
11882 mode = "Disable*";
11883 else
11884 mode = "Invalid*";
2ba1fe69 11885 }
2986cac2 11886
11887 if (use_json) {
13909c4f 11888 json_object_string_add(json, "localGrMode", mode);
2986cac2 11889 } else {
11890 vty_out(vty, mode, "\n");
11891 }
11892}
11893
13909c4f
DS
11894static void bgp_show_neighbor_graceful_restart_capability_per_afi_safi(
11895 struct vty *vty, struct peer *peer, bool use_json, json_object *json)
2986cac2 11896{
2ba1fe69 11897 afi_t afi;
11898 safi_t safi;
2986cac2 11899 json_object *json_afi_safi = NULL;
11900 json_object *json_timer = NULL;
11901 json_object *json_endofrib_status = NULL;
9e3b51a7 11902 bool eor_flag = false;
2986cac2 11903
df8d723c
DA
11904 FOREACH_AFI_SAFI_NSF (afi, safi) {
11905 if (!peer->afc[afi][safi])
11906 continue;
2986cac2 11907
df8d723c
DA
11908 if (!CHECK_FLAG(peer->cap, PEER_CAP_RESTART_ADV) ||
11909 !CHECK_FLAG(peer->cap, PEER_CAP_RESTART_RCV))
11910 continue;
9e3b51a7 11911
df8d723c
DA
11912 if (use_json) {
11913 json_afi_safi = json_object_new_object();
11914 json_endofrib_status = json_object_new_object();
11915 json_timer = json_object_new_object();
11916 }
2986cac2 11917
df8d723c
DA
11918 if (peer->eor_stime[afi][safi] >= peer->pkt_stime[afi][safi])
11919 eor_flag = true;
11920 else
11921 eor_flag = false;
2986cac2 11922
df8d723c
DA
11923 if (!use_json) {
11924 vty_out(vty, " %s:\n",
11925 get_afi_safi_str(afi, safi, false));
2986cac2 11926
df8d723c
DA
11927 vty_out(vty, " F bit: ");
11928 }
2986cac2 11929
df8d723c
DA
11930 if (peer->nsf[afi][safi] &&
11931 CHECK_FLAG(peer->af_cap[afi][safi],
11932 PEER_CAP_RESTART_AF_PRESERVE_RCV)) {
2986cac2 11933
df8d723c
DA
11934 if (use_json) {
11935 json_object_boolean_true_add(json_afi_safi,
11936 "fBit");
11937 } else
11938 vty_out(vty, "True\n");
11939 } else {
11940 if (use_json)
11941 json_object_boolean_false_add(json_afi_safi,
11942 "fBit");
11943 else
11944 vty_out(vty, "False\n");
11945 }
2986cac2 11946
df8d723c
DA
11947 if (!use_json)
11948 vty_out(vty, " End-of-RIB sent: ");
2986cac2 11949
df8d723c
DA
11950 if (CHECK_FLAG(peer->af_sflags[afi][safi],
11951 PEER_STATUS_EOR_SEND)) {
11952 if (use_json) {
11953 json_object_boolean_true_add(
11954 json_endofrib_status, "endOfRibSend");
9e3b51a7 11955
df8d723c
DA
11956 PRINT_EOR_JSON(eor_flag);
11957 } else {
11958 vty_out(vty, "Yes\n");
11959 vty_out(vty,
11960 " End-of-RIB sent after update: ");
2986cac2 11961
df8d723c
DA
11962 PRINT_EOR(eor_flag);
11963 }
11964 } else {
11965 if (use_json) {
11966 json_object_boolean_false_add(
11967 json_endofrib_status, "endOfRibSend");
11968 json_object_boolean_false_add(
11969 json_endofrib_status,
11970 "endOfRibSentAfterUpdate");
13909c4f 11971 } else {
df8d723c
DA
11972 vty_out(vty, "No\n");
11973 vty_out(vty,
11974 " End-of-RIB sent after update: ");
11975 vty_out(vty, "No\n");
13909c4f 11976 }
df8d723c 11977 }
2986cac2 11978
df8d723c
DA
11979 if (!use_json)
11980 vty_out(vty, " End-of-RIB received: ");
a53ca37b 11981
df8d723c
DA
11982 if (CHECK_FLAG(peer->af_sflags[afi][safi],
11983 PEER_STATUS_EOR_RECEIVED)) {
11984 if (use_json)
11985 json_object_boolean_true_add(
11986 json_endofrib_status, "endOfRibRecv");
11987 else
11988 vty_out(vty, "Yes\n");
11989 } else {
11990 if (use_json)
11991 json_object_boolean_false_add(
11992 json_endofrib_status, "endOfRibRecv");
11993 else
11994 vty_out(vty, "No\n");
11995 }
11996
11997 if (use_json) {
11998 json_object_int_add(json_timer, "stalePathTimer",
11999 peer->bgp->stalepath_time);
12000
12001 if (peer->t_gr_stale != NULL) {
12002 json_object_int_add(json_timer,
12003 "stalePathTimerRemaining",
12004 thread_timer_remain_second(
12005 peer->t_gr_stale));
a53ca37b
DA
12006 }
12007
df8d723c
DA
12008 /* Display Configured Selection
12009 * Deferral only when when
12010 * Gr mode is enabled.
12011 */
12012 if (CHECK_FLAG(peer->flags,
12013 PEER_FLAG_GRACEFUL_RESTART)) {
13909c4f 12014 json_object_int_add(json_timer,
df8d723c 12015 "selectionDeferralTimer",
13909c4f 12016 peer->bgp->stalepath_time);
df8d723c 12017 }
2986cac2 12018
df8d723c
DA
12019 if (peer->bgp->gr_info[afi][safi].t_select_deferral !=
12020 NULL) {
2986cac2 12021
df8d723c
DA
12022 json_object_int_add(
12023 json_timer,
12024 "selectionDeferralTimerRemaining",
12025 thread_timer_remain_second(
12026 peer->bgp->gr_info[afi][safi]
12027 .t_select_deferral));
12028 }
12029 } else {
12030 vty_out(vty, " Timers:\n");
12031 vty_out(vty,
12032 " Configured Stale Path Time(sec): %u\n",
12033 peer->bgp->stalepath_time);
2986cac2 12034
df8d723c 12035 if (peer->t_gr_stale != NULL)
13909c4f 12036 vty_out(vty,
df8d723c
DA
12037 " Stale Path Remaining(sec): %ld\n",
12038 thread_timer_remain_second(
12039 peer->t_gr_stale));
12040 /* Display Configured Selection
12041 * Deferral only when when
12042 * Gr mode is enabled.
12043 */
12044 if (CHECK_FLAG(peer->flags, PEER_FLAG_GRACEFUL_RESTART))
12045 vty_out(vty,
12046 " Configured Selection Deferral Time(sec): %u\n",
12047 peer->bgp->select_defer_time);
2986cac2 12048
df8d723c
DA
12049 if (peer->bgp->gr_info[afi][safi].t_select_deferral !=
12050 NULL)
12051 vty_out(vty,
12052 " Selection Deferral Time Remaining(sec): %ld\n",
12053 thread_timer_remain_second(
12054 peer->bgp->gr_info[afi][safi]
12055 .t_select_deferral));
12056 }
12057 if (use_json) {
12058 json_object_object_add(json_afi_safi, "endOfRibStatus",
12059 json_endofrib_status);
12060 json_object_object_add(json_afi_safi, "timers",
12061 json_timer);
12062 json_object_object_add(
12063 json, get_afi_safi_str(afi, safi, true),
12064 json_afi_safi);
2986cac2 12065 }
12066 }
12067}
12068
36235319
QY
12069static void bgp_show_neighbor_graceful_restart_time(struct vty *vty,
12070 struct peer *p,
12071 bool use_json,
12072 json_object *json)
2986cac2 12073{
12074 if (use_json) {
12075 json_object *json_timer = NULL;
12076
12077 json_timer = json_object_new_object();
12078
13909c4f
DS
12079 json_object_int_add(json_timer, "configuredRestartTimer",
12080 p->bgp->restart_time);
2986cac2 12081
13909c4f
DS
12082 json_object_int_add(json_timer, "receivedRestartTimer",
12083 p->v_gr_restart);
2986cac2 12084
13909c4f
DS
12085 if (p->t_gr_restart != NULL)
12086 json_object_int_add(
12087 json_timer, "restartTimerRemaining",
12088 thread_timer_remain_second(p->t_gr_restart));
2986cac2 12089
12090 json_object_object_add(json, "timers", json_timer);
12091 } else {
12092
a53ca37b
DA
12093 vty_out(vty, " Timers:\n");
12094 vty_out(vty, " Configured Restart Time(sec): %u\n",
13909c4f 12095 p->bgp->restart_time);
2986cac2 12096
a53ca37b 12097 vty_out(vty, " Received Restart Time(sec): %u\n",
13909c4f
DS
12098 p->v_gr_restart);
12099 if (p->t_gr_restart != NULL)
a53ca37b 12100 vty_out(vty, " Restart Time Remaining(sec): %ld\n",
13909c4f 12101 thread_timer_remain_second(p->t_gr_restart));
36235319 12102 if (p->t_gr_restart != NULL) {
a53ca37b 12103 vty_out(vty, " Restart Time Remaining(sec): %ld\n",
36235319
QY
12104 thread_timer_remain_second(p->t_gr_restart));
12105 }
2986cac2 12106 }
12107}
12108
12109static void bgp_show_peer_gr_status(struct vty *vty, struct peer *p,
36235319 12110 bool use_json, json_object *json)
2986cac2 12111{
2986cac2 12112 char dn_flag[2] = {0};
2b7165e7
QY
12113 /* '*' + v6 address of neighbor */
12114 char neighborAddr[INET6_ADDRSTRLEN + 1] = {0};
2986cac2 12115
2986cac2 12116 if (!p->conf_if && peer_dynamic_neighbor(p))
12117 dn_flag[0] = '*';
12118
12119 if (p->conf_if) {
12120 if (use_json)
47e12884
DA
12121 json_object_string_addf(json, "neighborAddr", "%pSU",
12122 &p->su);
2986cac2 12123 else
47e12884
DA
12124 vty_out(vty, "BGP neighbor on %s: %pSU\n", p->conf_if,
12125 &p->su);
2986cac2 12126 } else {
772270f3
QY
12127 snprintf(neighborAddr, sizeof(neighborAddr), "%s%s", dn_flag,
12128 p->host);
2986cac2 12129
12130 if (use_json)
36235319
QY
12131 json_object_string_add(json, "neighborAddr",
12132 neighborAddr);
2986cac2 12133 else
36235319 12134 vty_out(vty, "BGP neighbor is %s\n", neighborAddr);
2986cac2 12135 }
12136
12137 /* more gr info in new format */
12138 BGP_SHOW_PEER_GR_CAPABILITY(vty, p, use_json, json);
12139}
12140
d62a17ae 12141static void bgp_show_peer_afi(struct vty *vty, struct peer *p, afi_t afi,
9f049418 12142 safi_t safi, bool use_json,
d62a17ae 12143 json_object *json_neigh)
12144{
0291c246
MK
12145 struct bgp_filter *filter;
12146 struct peer_af *paf;
12147 char orf_pfx_name[BUFSIZ];
12148 int orf_pfx_count;
12149 json_object *json_af = NULL;
12150 json_object *json_prefA = NULL;
12151 json_object *json_prefB = NULL;
12152 json_object *json_addr = NULL;
fa36596c 12153 json_object *json_advmap = NULL;
d62a17ae 12154
12155 if (use_json) {
12156 json_addr = json_object_new_object();
12157 json_af = json_object_new_object();
12158 filter = &p->filter[afi][safi];
12159
12160 if (peer_group_active(p))
12161 json_object_string_add(json_addr, "peerGroupMember",
12162 p->group->name);
12163
12164 paf = peer_af_find(p, afi, safi);
12165 if (paf && PAF_SUBGRP(paf)) {
12166 json_object_int_add(json_addr, "updateGroupId",
12167 PAF_UPDGRP(paf)->id);
12168 json_object_int_add(json_addr, "subGroupId",
12169 PAF_SUBGRP(paf)->id);
12170 json_object_int_add(json_addr, "packetQueueLength",
12171 bpacket_queue_virtual_length(paf));
12172 }
12173
12174 if (CHECK_FLAG(p->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_SM_ADV)
12175 || CHECK_FLAG(p->af_cap[afi][safi],
12176 PEER_CAP_ORF_PREFIX_SM_RCV)
12177 || CHECK_FLAG(p->af_cap[afi][safi],
12178 PEER_CAP_ORF_PREFIX_RM_ADV)
12179 || CHECK_FLAG(p->af_cap[afi][safi],
12180 PEER_CAP_ORF_PREFIX_RM_RCV)) {
12181 json_object_int_add(json_af, "orfType",
12182 ORF_TYPE_PREFIX);
12183 json_prefA = json_object_new_object();
12184 bgp_show_peer_afi_orf_cap(vty, p, afi, safi,
12185 PEER_CAP_ORF_PREFIX_SM_ADV,
12186 PEER_CAP_ORF_PREFIX_RM_ADV,
12187 PEER_CAP_ORF_PREFIX_SM_RCV,
12188 PEER_CAP_ORF_PREFIX_RM_RCV,
12189 use_json, json_prefA);
12190 json_object_object_add(json_af, "orfPrefixList",
12191 json_prefA);
12192 }
12193
12194 if (CHECK_FLAG(p->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_SM_ADV)
12195 || CHECK_FLAG(p->af_cap[afi][safi],
12196 PEER_CAP_ORF_PREFIX_SM_OLD_RCV)
12197 || CHECK_FLAG(p->af_cap[afi][safi],
12198 PEER_CAP_ORF_PREFIX_RM_ADV)
12199 || CHECK_FLAG(p->af_cap[afi][safi],
12200 PEER_CAP_ORF_PREFIX_RM_OLD_RCV)) {
12201 json_object_int_add(json_af, "orfOldType",
12202 ORF_TYPE_PREFIX_OLD);
12203 json_prefB = json_object_new_object();
12204 bgp_show_peer_afi_orf_cap(
12205 vty, p, afi, safi, PEER_CAP_ORF_PREFIX_SM_ADV,
12206 PEER_CAP_ORF_PREFIX_RM_ADV,
12207 PEER_CAP_ORF_PREFIX_SM_OLD_RCV,
12208 PEER_CAP_ORF_PREFIX_RM_OLD_RCV, use_json,
12209 json_prefB);
12210 json_object_object_add(json_af, "orfOldPrefixList",
12211 json_prefB);
12212 }
12213
12214 if (CHECK_FLAG(p->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_SM_ADV)
12215 || CHECK_FLAG(p->af_cap[afi][safi],
12216 PEER_CAP_ORF_PREFIX_SM_RCV)
12217 || CHECK_FLAG(p->af_cap[afi][safi],
12218 PEER_CAP_ORF_PREFIX_SM_OLD_RCV)
12219 || CHECK_FLAG(p->af_cap[afi][safi],
12220 PEER_CAP_ORF_PREFIX_RM_ADV)
12221 || CHECK_FLAG(p->af_cap[afi][safi],
12222 PEER_CAP_ORF_PREFIX_RM_RCV)
12223 || CHECK_FLAG(p->af_cap[afi][safi],
12224 PEER_CAP_ORF_PREFIX_RM_OLD_RCV))
12225 json_object_object_add(json_addr, "afDependentCap",
12226 json_af);
12227 else
12228 json_object_free(json_af);
12229
772270f3
QY
12230 snprintf(orf_pfx_name, sizeof(orf_pfx_name), "%s.%d.%d",
12231 p->host, afi, safi);
d62a17ae 12232 orf_pfx_count = prefix_bgp_show_prefix_list(
12233 NULL, afi, orf_pfx_name, use_json);
12234
12235 if (CHECK_FLAG(p->af_sflags[afi][safi],
12236 PEER_STATUS_ORF_PREFIX_SEND)
12237 || orf_pfx_count) {
12238 if (CHECK_FLAG(p->af_sflags[afi][safi],
12239 PEER_STATUS_ORF_PREFIX_SEND))
12240 json_object_boolean_true_add(json_neigh,
12241 "orfSent");
12242 if (orf_pfx_count)
12243 json_object_int_add(json_addr, "orfRecvCounter",
12244 orf_pfx_count);
12245 }
12246 if (CHECK_FLAG(p->af_sflags[afi][safi],
12247 PEER_STATUS_ORF_WAIT_REFRESH))
12248 json_object_string_add(
12249 json_addr, "orfFirstUpdate",
12250 "deferredUntilORFOrRouteRefreshRecvd");
12251
12252 if (CHECK_FLAG(p->af_flags[afi][safi],
12253 PEER_FLAG_REFLECTOR_CLIENT))
12254 json_object_boolean_true_add(json_addr,
12255 "routeReflectorClient");
12256 if (CHECK_FLAG(p->af_flags[afi][safi],
12257 PEER_FLAG_RSERVER_CLIENT))
12258 json_object_boolean_true_add(json_addr,
12259 "routeServerClient");
12260 if (CHECK_FLAG(p->af_flags[afi][safi], PEER_FLAG_SOFT_RECONFIG))
12261 json_object_boolean_true_add(json_addr,
12262 "inboundSoftConfigPermit");
12263
12264 if (CHECK_FLAG(p->af_flags[afi][safi],
12265 PEER_FLAG_REMOVE_PRIVATE_AS_ALL_REPLACE))
12266 json_object_boolean_true_add(
12267 json_addr,
12268 "privateAsNumsAllReplacedInUpdatesToNbr");
12269 else if (CHECK_FLAG(p->af_flags[afi][safi],
12270 PEER_FLAG_REMOVE_PRIVATE_AS_REPLACE))
12271 json_object_boolean_true_add(
12272 json_addr,
12273 "privateAsNumsReplacedInUpdatesToNbr");
12274 else if (CHECK_FLAG(p->af_flags[afi][safi],
12275 PEER_FLAG_REMOVE_PRIVATE_AS_ALL))
12276 json_object_boolean_true_add(
12277 json_addr,
12278 "privateAsNumsAllRemovedInUpdatesToNbr");
12279 else if (CHECK_FLAG(p->af_flags[afi][safi],
12280 PEER_FLAG_REMOVE_PRIVATE_AS))
12281 json_object_boolean_true_add(
12282 json_addr,
12283 "privateAsNumsRemovedInUpdatesToNbr");
12284
b2ac1d0d
MS
12285 if (CHECK_FLAG(p->af_flags[afi][safi], PEER_FLAG_ALLOWAS_IN)) {
12286 if (CHECK_FLAG(p->af_flags[afi][safi],
12287 PEER_FLAG_ALLOWAS_IN_ORIGIN))
12288 json_object_boolean_true_add(json_addr,
12289 "allowAsInOrigin");
12290 else
12291 json_object_int_add(json_addr, "allowAsInCount",
12292 p->allowas_in[afi][safi]);
12293 }
12294
dcc68b5e
MS
12295 if (p->addpath_type[afi][safi] != BGP_ADDPATH_NONE)
12296 json_object_boolean_true_add(
12297 json_addr,
12298 bgp_addpath_names(p->addpath_type[afi][safi])
12299 ->type_json_name);
d62a17ae 12300
12301 if (CHECK_FLAG(p->af_flags[afi][safi], PEER_FLAG_AS_OVERRIDE))
12302 json_object_string_add(json_addr,
12303 "overrideASNsInOutboundUpdates",
12304 "ifAspathEqualRemoteAs");
12305
12306 if (CHECK_FLAG(p->af_flags[afi][safi], PEER_FLAG_NEXTHOP_SELF)
12307 || CHECK_FLAG(p->af_flags[afi][safi],
12308 PEER_FLAG_FORCE_NEXTHOP_SELF))
12309 json_object_boolean_true_add(json_addr,
12310 "routerAlwaysNextHop");
12311 if (CHECK_FLAG(p->af_flags[afi][safi],
12312 PEER_FLAG_AS_PATH_UNCHANGED))
12313 json_object_boolean_true_add(
12314 json_addr, "unchangedAsPathPropogatedToNbr");
12315 if (CHECK_FLAG(p->af_flags[afi][safi],
12316 PEER_FLAG_NEXTHOP_UNCHANGED))
12317 json_object_boolean_true_add(
12318 json_addr, "unchangedNextHopPropogatedToNbr");
12319 if (CHECK_FLAG(p->af_flags[afi][safi], PEER_FLAG_MED_UNCHANGED))
12320 json_object_boolean_true_add(
12321 json_addr, "unchangedMedPropogatedToNbr");
12322 if (CHECK_FLAG(p->af_flags[afi][safi], PEER_FLAG_SEND_COMMUNITY)
12323 || CHECK_FLAG(p->af_flags[afi][safi],
12324 PEER_FLAG_SEND_EXT_COMMUNITY)) {
12325 if (CHECK_FLAG(p->af_flags[afi][safi],
12326 PEER_FLAG_SEND_COMMUNITY)
12327 && CHECK_FLAG(p->af_flags[afi][safi],
12328 PEER_FLAG_SEND_EXT_COMMUNITY))
12329 json_object_string_add(json_addr,
12330 "commAttriSentToNbr",
12331 "extendedAndStandard");
12332 else if (CHECK_FLAG(p->af_flags[afi][safi],
12333 PEER_FLAG_SEND_EXT_COMMUNITY))
12334 json_object_string_add(json_addr,
12335 "commAttriSentToNbr",
12336 "extended");
12337 else
12338 json_object_string_add(json_addr,
12339 "commAttriSentToNbr",
12340 "standard");
12341 }
12342 if (CHECK_FLAG(p->af_flags[afi][safi],
12343 PEER_FLAG_DEFAULT_ORIGINATE)) {
12344 if (p->default_rmap[afi][safi].name)
12345 json_object_string_add(
12346 json_addr, "defaultRouteMap",
12347 p->default_rmap[afi][safi].name);
12348
12349 if (paf && PAF_SUBGRP(paf)
12350 && CHECK_FLAG(PAF_SUBGRP(paf)->sflags,
12351 SUBGRP_STATUS_DEFAULT_ORIGINATE))
12352 json_object_boolean_true_add(json_addr,
12353 "defaultSent");
12354 else
12355 json_object_boolean_true_add(json_addr,
12356 "defaultNotSent");
12357 }
12358
dff8f48d 12359 if (afi == AFI_L2VPN && safi == SAFI_EVPN) {
94c2f693 12360 if (is_evpn_enabled())
60466a63
QY
12361 json_object_boolean_true_add(
12362 json_addr, "advertiseAllVnis");
dff8f48d
MK
12363 }
12364
d62a17ae 12365 if (filter->plist[FILTER_IN].name
12366 || filter->dlist[FILTER_IN].name
12367 || filter->aslist[FILTER_IN].name
12368 || filter->map[RMAP_IN].name)
12369 json_object_boolean_true_add(json_addr,
12370 "inboundPathPolicyConfig");
12371 if (filter->plist[FILTER_OUT].name
12372 || filter->dlist[FILTER_OUT].name
12373 || filter->aslist[FILTER_OUT].name
12374 || filter->map[RMAP_OUT].name || filter->usmap.name)
12375 json_object_boolean_true_add(
12376 json_addr, "outboundPathPolicyConfig");
12377
12378 /* prefix-list */
12379 if (filter->plist[FILTER_IN].name)
12380 json_object_string_add(json_addr,
12381 "incomingUpdatePrefixFilterList",
12382 filter->plist[FILTER_IN].name);
12383 if (filter->plist[FILTER_OUT].name)
12384 json_object_string_add(json_addr,
12385 "outgoingUpdatePrefixFilterList",
12386 filter->plist[FILTER_OUT].name);
12387
12388 /* distribute-list */
12389 if (filter->dlist[FILTER_IN].name)
12390 json_object_string_add(
12391 json_addr, "incomingUpdateNetworkFilterList",
12392 filter->dlist[FILTER_IN].name);
12393 if (filter->dlist[FILTER_OUT].name)
12394 json_object_string_add(
12395 json_addr, "outgoingUpdateNetworkFilterList",
12396 filter->dlist[FILTER_OUT].name);
12397
12398 /* filter-list. */
12399 if (filter->aslist[FILTER_IN].name)
12400 json_object_string_add(json_addr,
12401 "incomingUpdateAsPathFilterList",
12402 filter->aslist[FILTER_IN].name);
12403 if (filter->aslist[FILTER_OUT].name)
12404 json_object_string_add(json_addr,
12405 "outgoingUpdateAsPathFilterList",
12406 filter->aslist[FILTER_OUT].name);
12407
12408 /* route-map. */
12409 if (filter->map[RMAP_IN].name)
12410 json_object_string_add(
12411 json_addr, "routeMapForIncomingAdvertisements",
12412 filter->map[RMAP_IN].name);
12413 if (filter->map[RMAP_OUT].name)
12414 json_object_string_add(
12415 json_addr, "routeMapForOutgoingAdvertisements",
12416 filter->map[RMAP_OUT].name);
12417
9dac9fc8 12418 /* ebgp-requires-policy (inbound) */
1d3fdccf 12419 if (CHECK_FLAG(p->bgp->flags, BGP_FLAG_EBGP_REQUIRES_POLICY)
9dac9fc8
DA
12420 && !bgp_inbound_policy_exists(p, filter))
12421 json_object_string_add(
12422 json_addr, "inboundEbgpRequiresPolicy",
12423 "Inbound updates discarded due to missing policy");
12424
12425 /* ebgp-requires-policy (outbound) */
1d3fdccf 12426 if (CHECK_FLAG(p->bgp->flags, BGP_FLAG_EBGP_REQUIRES_POLICY)
9dac9fc8
DA
12427 && (!bgp_outbound_policy_exists(p, filter)))
12428 json_object_string_add(
12429 json_addr, "outboundEbgpRequiresPolicy",
12430 "Outbound updates discarded due to missing policy");
12431
d62a17ae 12432 /* unsuppress-map */
12433 if (filter->usmap.name)
12434 json_object_string_add(json_addr,
12435 "selectiveUnsuppressRouteMap",
12436 filter->usmap.name);
12437
fa36596c
MK
12438 /* advertise-map */
12439 if (filter->advmap.aname) {
12440 json_advmap = json_object_new_object();
12441 json_object_string_add(json_advmap, "condition",
12442 filter->advmap.condition
12443 ? "EXIST"
12444 : "NON_EXIST");
12445 json_object_string_add(json_advmap, "conditionMap",
12446 filter->advmap.cname);
12447 json_object_string_add(json_advmap, "advertiseMap",
12448 filter->advmap.aname);
ecf2b628
QY
12449 json_object_string_add(
12450 json_advmap, "advertiseStatus",
12451 filter->advmap.update_type ==
12452 UPDATE_TYPE_ADVERTISE
12453 ? "Advertise"
12454 : "Withdraw");
fa36596c
MK
12455 json_object_object_add(json_addr, "advertiseMap",
12456 json_advmap);
12457 }
12458
d62a17ae 12459 /* Receive prefix count */
12460 json_object_int_add(json_addr, "acceptedPrefixCounter",
12461 p->pcount[afi][safi]);
50e05855
AD
12462 if (paf && PAF_SUBGRP(paf))
12463 json_object_int_add(json_addr, "sentPrefixCounter",
12464 (PAF_SUBGRP(paf))->scount);
d62a17ae 12465
fde246e8
DA
12466 /* Maximum prefix */
12467 if (CHECK_FLAG(p->af_flags[afi][safi], PEER_FLAG_MAX_PREFIX_OUT))
12468 json_object_int_add(json_addr, "prefixOutAllowedMax",
12469 p->pmax_out[afi][safi]);
12470
d62a17ae 12471 /* Maximum prefix */
12472 if (CHECK_FLAG(p->af_flags[afi][safi], PEER_FLAG_MAX_PREFIX)) {
12473 json_object_int_add(json_addr, "prefixAllowedMax",
12474 p->pmax[afi][safi]);
12475 if (CHECK_FLAG(p->af_flags[afi][safi],
12476 PEER_FLAG_MAX_PREFIX_WARNING))
12477 json_object_boolean_true_add(
12478 json_addr, "prefixAllowedMaxWarning");
12479 json_object_int_add(json_addr,
12480 "prefixAllowedWarningThresh",
12481 p->pmax_threshold[afi][safi]);
12482 if (p->pmax_restart[afi][safi])
12483 json_object_int_add(
12484 json_addr,
12485 "prefixAllowedRestartIntervalMsecs",
12486 p->pmax_restart[afi][safi] * 60000);
12487 }
2986cac2 12488 json_object_object_add(json_neigh,
36235319 12489 get_afi_safi_str(afi, safi, true),
d62a17ae 12490 json_addr);
12491
12492 } else {
12493 filter = &p->filter[afi][safi];
12494
12495 vty_out(vty, " For address family: %s\n",
5cb5f4d0 12496 get_afi_safi_str(afi, safi, false));
d62a17ae 12497
12498 if (peer_group_active(p))
12499 vty_out(vty, " %s peer-group member\n",
12500 p->group->name);
12501
12502 paf = peer_af_find(p, afi, safi);
12503 if (paf && PAF_SUBGRP(paf)) {
6cde4b45 12504 vty_out(vty, " Update group %" PRIu64", subgroup %" PRIu64 "\n",
d62a17ae 12505 PAF_UPDGRP(paf)->id, PAF_SUBGRP(paf)->id);
12506 vty_out(vty, " Packet Queue length %d\n",
12507 bpacket_queue_virtual_length(paf));
12508 } else {
12509 vty_out(vty, " Not part of any update group\n");
12510 }
12511 if (CHECK_FLAG(p->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_SM_ADV)
12512 || CHECK_FLAG(p->af_cap[afi][safi],
12513 PEER_CAP_ORF_PREFIX_SM_RCV)
12514 || CHECK_FLAG(p->af_cap[afi][safi],
12515 PEER_CAP_ORF_PREFIX_SM_OLD_RCV)
12516 || CHECK_FLAG(p->af_cap[afi][safi],
12517 PEER_CAP_ORF_PREFIX_RM_ADV)
12518 || CHECK_FLAG(p->af_cap[afi][safi],
12519 PEER_CAP_ORF_PREFIX_RM_RCV)
12520 || CHECK_FLAG(p->af_cap[afi][safi],
12521 PEER_CAP_ORF_PREFIX_RM_OLD_RCV))
12522 vty_out(vty, " AF-dependant capabilities:\n");
12523
12524 if (CHECK_FLAG(p->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_SM_ADV)
12525 || CHECK_FLAG(p->af_cap[afi][safi],
12526 PEER_CAP_ORF_PREFIX_SM_RCV)
12527 || CHECK_FLAG(p->af_cap[afi][safi],
12528 PEER_CAP_ORF_PREFIX_RM_ADV)
12529 || CHECK_FLAG(p->af_cap[afi][safi],
12530 PEER_CAP_ORF_PREFIX_RM_RCV)) {
12531 vty_out(vty,
12532 " Outbound Route Filter (ORF) type (%d) Prefix-list:\n",
12533 ORF_TYPE_PREFIX);
12534 bgp_show_peer_afi_orf_cap(
12535 vty, p, afi, safi, PEER_CAP_ORF_PREFIX_SM_ADV,
12536 PEER_CAP_ORF_PREFIX_RM_ADV,
12537 PEER_CAP_ORF_PREFIX_SM_RCV,
12538 PEER_CAP_ORF_PREFIX_RM_RCV, use_json, NULL);
12539 }
12540 if (CHECK_FLAG(p->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_SM_ADV)
12541 || CHECK_FLAG(p->af_cap[afi][safi],
12542 PEER_CAP_ORF_PREFIX_SM_OLD_RCV)
12543 || CHECK_FLAG(p->af_cap[afi][safi],
12544 PEER_CAP_ORF_PREFIX_RM_ADV)
12545 || CHECK_FLAG(p->af_cap[afi][safi],
12546 PEER_CAP_ORF_PREFIX_RM_OLD_RCV)) {
12547 vty_out(vty,
12548 " Outbound Route Filter (ORF) type (%d) Prefix-list:\n",
12549 ORF_TYPE_PREFIX_OLD);
12550 bgp_show_peer_afi_orf_cap(
12551 vty, p, afi, safi, PEER_CAP_ORF_PREFIX_SM_ADV,
12552 PEER_CAP_ORF_PREFIX_RM_ADV,
12553 PEER_CAP_ORF_PREFIX_SM_OLD_RCV,
12554 PEER_CAP_ORF_PREFIX_RM_OLD_RCV, use_json, NULL);
12555 }
12556
772270f3
QY
12557 snprintf(orf_pfx_name, sizeof(orf_pfx_name), "%s.%d.%d",
12558 p->host, afi, safi);
d62a17ae 12559 orf_pfx_count = prefix_bgp_show_prefix_list(
12560 NULL, afi, orf_pfx_name, use_json);
12561
12562 if (CHECK_FLAG(p->af_sflags[afi][safi],
12563 PEER_STATUS_ORF_PREFIX_SEND)
12564 || orf_pfx_count) {
12565 vty_out(vty, " Outbound Route Filter (ORF):");
12566 if (CHECK_FLAG(p->af_sflags[afi][safi],
12567 PEER_STATUS_ORF_PREFIX_SEND))
12568 vty_out(vty, " sent;");
12569 if (orf_pfx_count)
12570 vty_out(vty, " received (%d entries)",
12571 orf_pfx_count);
12572 vty_out(vty, "\n");
12573 }
12574 if (CHECK_FLAG(p->af_sflags[afi][safi],
12575 PEER_STATUS_ORF_WAIT_REFRESH))
12576 vty_out(vty,
12577 " First update is deferred until ORF or ROUTE-REFRESH is received\n");
12578
12579 if (CHECK_FLAG(p->af_flags[afi][safi],
12580 PEER_FLAG_REFLECTOR_CLIENT))
12581 vty_out(vty, " Route-Reflector Client\n");
12582 if (CHECK_FLAG(p->af_flags[afi][safi],
12583 PEER_FLAG_RSERVER_CLIENT))
12584 vty_out(vty, " Route-Server Client\n");
70cd87ca
MK
12585
12586 if (peer_af_flag_check(p, afi, safi, PEER_FLAG_ORR_GROUP))
12587 vty_out(vty, " ORR group (configured) : %s\n",
12588 p->orr_group_name[afi][safi]);
12589
d62a17ae 12590 if (CHECK_FLAG(p->af_flags[afi][safi], PEER_FLAG_SOFT_RECONFIG))
12591 vty_out(vty,
12592 " Inbound soft reconfiguration allowed\n");
12593
12594 if (CHECK_FLAG(p->af_flags[afi][safi],
12595 PEER_FLAG_REMOVE_PRIVATE_AS_ALL_REPLACE))
12596 vty_out(vty,
12597 " Private AS numbers (all) replaced in updates to this neighbor\n");
12598 else if (CHECK_FLAG(p->af_flags[afi][safi],
12599 PEER_FLAG_REMOVE_PRIVATE_AS_REPLACE))
12600 vty_out(vty,
12601 " Private AS numbers replaced in updates to this neighbor\n");
12602 else if (CHECK_FLAG(p->af_flags[afi][safi],
12603 PEER_FLAG_REMOVE_PRIVATE_AS_ALL))
12604 vty_out(vty,
12605 " Private AS numbers (all) removed in updates to this neighbor\n");
12606 else if (CHECK_FLAG(p->af_flags[afi][safi],
12607 PEER_FLAG_REMOVE_PRIVATE_AS))
12608 vty_out(vty,
12609 " Private AS numbers removed in updates to this neighbor\n");
12610
b2ac1d0d
MS
12611 if (CHECK_FLAG(p->af_flags[afi][safi], PEER_FLAG_ALLOWAS_IN)) {
12612 if (CHECK_FLAG(p->af_flags[afi][safi],
12613 PEER_FLAG_ALLOWAS_IN_ORIGIN))
12614 vty_out(vty,
12615 " Local AS allowed as path origin\n");
12616 else
12617 vty_out(vty,
12618 " Local AS allowed in path, %d occurrences\n",
12619 p->allowas_in[afi][safi]);
12620 }
12621
dcc68b5e
MS
12622 if (p->addpath_type[afi][safi] != BGP_ADDPATH_NONE)
12623 vty_out(vty, " %s\n",
12624 bgp_addpath_names(p->addpath_type[afi][safi])
12625 ->human_description);
d62a17ae 12626
12627 if (CHECK_FLAG(p->af_flags[afi][safi], PEER_FLAG_AS_OVERRIDE))
12628 vty_out(vty,
12629 " Override ASNs in outbound updates if aspath equals remote-as\n");
12630
12631 if (CHECK_FLAG(p->af_flags[afi][safi], PEER_FLAG_NEXTHOP_SELF)
12632 || CHECK_FLAG(p->af_flags[afi][safi],
12633 PEER_FLAG_FORCE_NEXTHOP_SELF))
12634 vty_out(vty, " NEXT_HOP is always this router\n");
12635 if (CHECK_FLAG(p->af_flags[afi][safi],
12636 PEER_FLAG_AS_PATH_UNCHANGED))
12637 vty_out(vty,
12638 " AS_PATH is propagated unchanged to this neighbor\n");
12639 if (CHECK_FLAG(p->af_flags[afi][safi],
12640 PEER_FLAG_NEXTHOP_UNCHANGED))
12641 vty_out(vty,
12642 " NEXT_HOP is propagated unchanged to this neighbor\n");
12643 if (CHECK_FLAG(p->af_flags[afi][safi], PEER_FLAG_MED_UNCHANGED))
12644 vty_out(vty,
12645 " MED is propagated unchanged to this neighbor\n");
12646 if (CHECK_FLAG(p->af_flags[afi][safi], PEER_FLAG_SEND_COMMUNITY)
12647 || CHECK_FLAG(p->af_flags[afi][safi],
12648 PEER_FLAG_SEND_EXT_COMMUNITY)
12649 || CHECK_FLAG(p->af_flags[afi][safi],
12650 PEER_FLAG_SEND_LARGE_COMMUNITY)) {
12651 vty_out(vty,
12652 " Community attribute sent to this neighbor");
12653 if (CHECK_FLAG(p->af_flags[afi][safi],
12654 PEER_FLAG_SEND_COMMUNITY)
12655 && CHECK_FLAG(p->af_flags[afi][safi],
12656 PEER_FLAG_SEND_EXT_COMMUNITY)
12657 && CHECK_FLAG(p->af_flags[afi][safi],
12658 PEER_FLAG_SEND_LARGE_COMMUNITY))
12659 vty_out(vty, "(all)\n");
12660 else if (CHECK_FLAG(p->af_flags[afi][safi],
12661 PEER_FLAG_SEND_LARGE_COMMUNITY))
12662 vty_out(vty, "(large)\n");
12663 else if (CHECK_FLAG(p->af_flags[afi][safi],
12664 PEER_FLAG_SEND_EXT_COMMUNITY))
12665 vty_out(vty, "(extended)\n");
12666 else
12667 vty_out(vty, "(standard)\n");
12668 }
12669 if (CHECK_FLAG(p->af_flags[afi][safi],
12670 PEER_FLAG_DEFAULT_ORIGINATE)) {
12671 vty_out(vty, " Default information originate,");
12672
12673 if (p->default_rmap[afi][safi].name)
12674 vty_out(vty, " default route-map %s%s,",
12675 p->default_rmap[afi][safi].map ? "*"
12676 : "",
12677 p->default_rmap[afi][safi].name);
12678 if (paf && PAF_SUBGRP(paf)
12679 && CHECK_FLAG(PAF_SUBGRP(paf)->sflags,
12680 SUBGRP_STATUS_DEFAULT_ORIGINATE))
12681 vty_out(vty, " default sent\n");
12682 else
12683 vty_out(vty, " default not sent\n");
12684 }
12685
dff8f48d
MK
12686 /* advertise-vni-all */
12687 if (afi == AFI_L2VPN && safi == SAFI_EVPN) {
94c2f693 12688 if (is_evpn_enabled())
dff8f48d
MK
12689 vty_out(vty, " advertise-all-vni\n");
12690 }
12691
d62a17ae 12692 if (filter->plist[FILTER_IN].name
12693 || filter->dlist[FILTER_IN].name
12694 || filter->aslist[FILTER_IN].name
12695 || filter->map[RMAP_IN].name)
12696 vty_out(vty, " Inbound path policy configured\n");
12697 if (filter->plist[FILTER_OUT].name
12698 || filter->dlist[FILTER_OUT].name
12699 || filter->aslist[FILTER_OUT].name
12700 || filter->map[RMAP_OUT].name || filter->usmap.name)
12701 vty_out(vty, " Outbound path policy configured\n");
12702
12703 /* prefix-list */
12704 if (filter->plist[FILTER_IN].name)
12705 vty_out(vty,
12706 " Incoming update prefix filter list is %s%s\n",
12707 filter->plist[FILTER_IN].plist ? "*" : "",
12708 filter->plist[FILTER_IN].name);
12709 if (filter->plist[FILTER_OUT].name)
12710 vty_out(vty,
12711 " Outgoing update prefix filter list is %s%s\n",
12712 filter->plist[FILTER_OUT].plist ? "*" : "",
12713 filter->plist[FILTER_OUT].name);
12714
12715 /* distribute-list */
12716 if (filter->dlist[FILTER_IN].name)
12717 vty_out(vty,
12718 " Incoming update network filter list is %s%s\n",
12719 filter->dlist[FILTER_IN].alist ? "*" : "",
12720 filter->dlist[FILTER_IN].name);
12721 if (filter->dlist[FILTER_OUT].name)
12722 vty_out(vty,
12723 " Outgoing update network filter list is %s%s\n",
12724 filter->dlist[FILTER_OUT].alist ? "*" : "",
12725 filter->dlist[FILTER_OUT].name);
12726
12727 /* filter-list. */
12728 if (filter->aslist[FILTER_IN].name)
12729 vty_out(vty,
12730 " Incoming update AS path filter list is %s%s\n",
12731 filter->aslist[FILTER_IN].aslist ? "*" : "",
12732 filter->aslist[FILTER_IN].name);
12733 if (filter->aslist[FILTER_OUT].name)
12734 vty_out(vty,
12735 " Outgoing update AS path filter list is %s%s\n",
12736 filter->aslist[FILTER_OUT].aslist ? "*" : "",
12737 filter->aslist[FILTER_OUT].name);
12738
12739 /* route-map. */
12740 if (filter->map[RMAP_IN].name)
12741 vty_out(vty,
12742 " Route map for incoming advertisements is %s%s\n",
12743 filter->map[RMAP_IN].map ? "*" : "",
12744 filter->map[RMAP_IN].name);
12745 if (filter->map[RMAP_OUT].name)
12746 vty_out(vty,
12747 " Route map for outgoing advertisements is %s%s\n",
12748 filter->map[RMAP_OUT].map ? "*" : "",
12749 filter->map[RMAP_OUT].name);
12750
9dac9fc8 12751 /* ebgp-requires-policy (inbound) */
1d3fdccf 12752 if (CHECK_FLAG(p->bgp->flags, BGP_FLAG_EBGP_REQUIRES_POLICY)
9dac9fc8
DA
12753 && !bgp_inbound_policy_exists(p, filter))
12754 vty_out(vty,
12755 " Inbound updates discarded due to missing policy\n");
12756
12757 /* ebgp-requires-policy (outbound) */
1d3fdccf 12758 if (CHECK_FLAG(p->bgp->flags, BGP_FLAG_EBGP_REQUIRES_POLICY)
9dac9fc8
DA
12759 && !bgp_outbound_policy_exists(p, filter))
12760 vty_out(vty,
12761 " Outbound updates discarded due to missing policy\n");
12762
d62a17ae 12763 /* unsuppress-map */
12764 if (filter->usmap.name)
12765 vty_out(vty,
12766 " Route map for selective unsuppress is %s%s\n",
12767 filter->usmap.map ? "*" : "",
12768 filter->usmap.name);
12769
7f7940e6
MK
12770 /* advertise-map */
12771 if (filter->advmap.aname && filter->advmap.cname)
12772 vty_out(vty,
12773 " Condition %s, Condition-map %s%s, Advertise-map %s%s, status: %s\n",
12774 filter->advmap.condition ? "EXIST"
12775 : "NON_EXIST",
12776 filter->advmap.cmap ? "*" : "",
12777 filter->advmap.cname,
12778 filter->advmap.amap ? "*" : "",
12779 filter->advmap.aname,
ecf2b628
QY
12780 filter->advmap.update_type ==
12781 UPDATE_TYPE_ADVERTISE
c385f82a
MK
12782 ? "Advertise"
12783 : "Withdraw");
7f7940e6 12784
d62a17ae 12785 /* Receive prefix count */
6cde4b45 12786 vty_out(vty, " %u accepted prefixes\n",
a0a87037 12787 p->pcount[afi][safi]);
d62a17ae 12788
fde246e8
DA
12789 /* maximum-prefix-out */
12790 if (CHECK_FLAG(p->af_flags[afi][safi],
12791 PEER_FLAG_MAX_PREFIX_OUT))
12792 vty_out(vty,
6cde4b45 12793 " Maximum allowed prefixes sent %u\n",
fde246e8
DA
12794 p->pmax_out[afi][safi]);
12795
d62a17ae 12796 /* Maximum prefix */
12797 if (CHECK_FLAG(p->af_flags[afi][safi], PEER_FLAG_MAX_PREFIX)) {
a0a87037 12798 vty_out(vty,
6cde4b45 12799 " Maximum prefixes allowed %u%s\n",
d62a17ae 12800 p->pmax[afi][safi],
12801 CHECK_FLAG(p->af_flags[afi][safi],
12802 PEER_FLAG_MAX_PREFIX_WARNING)
12803 ? " (warning-only)"
12804 : "");
12805 vty_out(vty, " Threshold for warning message %d%%",
12806 p->pmax_threshold[afi][safi]);
12807 if (p->pmax_restart[afi][safi])
12808 vty_out(vty, ", restart interval %d min",
12809 p->pmax_restart[afi][safi]);
12810 vty_out(vty, "\n");
12811 }
12812
12813 vty_out(vty, "\n");
12814 }
12815}
12816
9f049418 12817static void bgp_show_peer(struct vty *vty, struct peer *p, bool use_json,
d62a17ae 12818 json_object *json)
718e3744 12819{
d62a17ae 12820 struct bgp *bgp;
47e12884 12821 char buf1[PREFIX2STR_BUFFER];
d62a17ae 12822 char timebuf[BGP_UPTIME_LEN];
12823 char dn_flag[2];
d62a17ae 12824 afi_t afi;
12825 safi_t safi;
d7c0a89a
QY
12826 uint16_t i;
12827 uint8_t *msg;
d62a17ae 12828 json_object *json_neigh = NULL;
12829 time_t epoch_tbuf;
4ab46701 12830 uint32_t sync_tcp_mss;
718e3744 12831
d62a17ae 12832 bgp = p->bgp;
12833
12834 if (use_json)
12835 json_neigh = json_object_new_object();
12836
12837 memset(dn_flag, '\0', sizeof(dn_flag));
12838 if (!p->conf_if && peer_dynamic_neighbor(p))
12839 dn_flag[0] = '*';
12840
12841 if (!use_json) {
12842 if (p->conf_if) /* Configured interface name. */
47e12884
DA
12843 vty_out(vty, "BGP neighbor on %s: %pSU, ", p->conf_if,
12844 &p->su);
d62a17ae 12845 else /* Configured IP address. */
12846 vty_out(vty, "BGP neighbor is %s%s, ", dn_flag,
12847 p->host);
12848 }
12849
12850 if (use_json) {
12851 if (p->conf_if && BGP_PEER_SU_UNSPEC(p))
12852 json_object_string_add(json_neigh, "bgpNeighborAddr",
12853 "none");
12854 else if (p->conf_if && !BGP_PEER_SU_UNSPEC(p))
47e12884
DA
12855 json_object_string_addf(json_neigh, "bgpNeighborAddr",
12856 "%pSU", &p->su);
d62a17ae 12857
12858 json_object_int_add(json_neigh, "remoteAs", p->as);
12859
12860 if (p->change_local_as)
12861 json_object_int_add(json_neigh, "localAs",
12862 p->change_local_as);
12863 else
12864 json_object_int_add(json_neigh, "localAs", p->local_as);
12865
12866 if (CHECK_FLAG(p->flags, PEER_FLAG_LOCAL_AS_NO_PREPEND))
12867 json_object_boolean_true_add(json_neigh,
12868 "localAsNoPrepend");
12869
12870 if (CHECK_FLAG(p->flags, PEER_FLAG_LOCAL_AS_REPLACE_AS))
12871 json_object_boolean_true_add(json_neigh,
12872 "localAsReplaceAs");
12873 } else {
12874 if ((p->as_type == AS_SPECIFIED) || (p->as_type == AS_EXTERNAL)
12875 || (p->as_type == AS_INTERNAL))
12876 vty_out(vty, "remote AS %u, ", p->as);
12877 else
12878 vty_out(vty, "remote AS Unspecified, ");
12879 vty_out(vty, "local AS %u%s%s, ",
12880 p->change_local_as ? p->change_local_as : p->local_as,
12881 CHECK_FLAG(p->flags, PEER_FLAG_LOCAL_AS_NO_PREPEND)
12882 ? " no-prepend"
12883 : "",
12884 CHECK_FLAG(p->flags, PEER_FLAG_LOCAL_AS_REPLACE_AS)
12885 ? " replace-as"
12886 : "");
12887 }
faa16034
DS
12888 /* peer type internal or confed-internal */
12889 if ((p->as == p->local_as) || (p->as_type == AS_INTERNAL)) {
d62a17ae 12890 if (use_json) {
12891 if (CHECK_FLAG(bgp->config, BGP_CONFIG_CONFEDERATION))
12892 json_object_boolean_true_add(
12893 json_neigh, "nbrConfedInternalLink");
12894 else
12895 json_object_boolean_true_add(json_neigh,
12896 "nbrInternalLink");
12897 } else {
12898 if (CHECK_FLAG(bgp->config, BGP_CONFIG_CONFEDERATION))
12899 vty_out(vty, "confed-internal link\n");
12900 else
12901 vty_out(vty, "internal link\n");
12902 }
faa16034
DS
12903 /* peer type external or confed-external */
12904 } else if (p->as || (p->as_type == AS_EXTERNAL)) {
d62a17ae 12905 if (use_json) {
12906 if (CHECK_FLAG(bgp->config, BGP_CONFIG_CONFEDERATION))
12907 json_object_boolean_true_add(
12908 json_neigh, "nbrConfedExternalLink");
12909 else
12910 json_object_boolean_true_add(json_neigh,
12911 "nbrExternalLink");
12912 } else {
12913 if (bgp_confederation_peers_check(bgp, p->as))
12914 vty_out(vty, "confed-external link\n");
12915 else
12916 vty_out(vty, "external link\n");
12917 }
faa16034
DS
12918 } else {
12919 if (use_json)
12920 json_object_boolean_true_add(json_neigh,
12921 "nbrUnspecifiedLink");
12922 else
12923 vty_out(vty, "unspecified link\n");
d62a17ae 12924 }
12925
d864dd9e
EB
12926 /* Roles */
12927 if (use_json) {
12928 json_object_string_add(json_neigh, "localRole",
8f2d6021
EB
12929 bgp_get_name_by_role(p->local_role));
12930 json_object_string_add(json_neigh, "remoteRole",
12931 bgp_get_name_by_role(p->remote_role));
d864dd9e
EB
12932 } else {
12933 vty_out(vty, " Local Role: %s\n",
8f2d6021
EB
12934 bgp_get_name_by_role(p->local_role));
12935 vty_out(vty, " Remote Role: %s\n",
12936 bgp_get_name_by_role(p->remote_role));
d864dd9e
EB
12937 }
12938
12939
d62a17ae 12940 /* Description. */
12941 if (p->desc) {
12942 if (use_json)
12943 json_object_string_add(json_neigh, "nbrDesc", p->desc);
12944 else
12945 vty_out(vty, " Description: %s\n", p->desc);
12946 }
12947
12948 if (p->hostname) {
12949 if (use_json) {
12950 if (p->hostname)
12951 json_object_string_add(json_neigh, "hostname",
12952 p->hostname);
12953
12954 if (p->domainname)
12955 json_object_string_add(json_neigh, "domainname",
12956 p->domainname);
12957 } else {
12958 if (p->domainname && (p->domainname[0] != '\0'))
12959 vty_out(vty, "Hostname: %s.%s\n", p->hostname,
12960 p->domainname);
12961 else
12962 vty_out(vty, "Hostname: %s\n", p->hostname);
12963 }
12964 }
12965
12966 /* Peer-group */
12967 if (p->group) {
12968 if (use_json) {
12969 json_object_string_add(json_neigh, "peerGroup",
12970 p->group->name);
12971
12972 if (dn_flag[0]) {
12973 struct prefix prefix, *range = NULL;
12974
0154d8ce
DS
12975 if (sockunion2hostprefix(&(p->su), &prefix))
12976 range = peer_group_lookup_dynamic_neighbor_range(
12977 p->group, &prefix);
d62a17ae 12978
12979 if (range) {
67d7e256 12980 json_object_string_addf(
d62a17ae 12981 json_neigh,
67d7e256
DA
12982 "peerSubnetRangeGroup", "%pFX",
12983 range);
d62a17ae 12984 }
12985 }
12986 } else {
12987 vty_out(vty,
12988 " Member of peer-group %s for session parameters\n",
12989 p->group->name);
12990
12991 if (dn_flag[0]) {
12992 struct prefix prefix, *range = NULL;
12993
0154d8ce
DS
12994 if (sockunion2hostprefix(&(p->su), &prefix))
12995 range = peer_group_lookup_dynamic_neighbor_range(
12996 p->group, &prefix);
d62a17ae 12997
12998 if (range) {
d62a17ae 12999 vty_out(vty,
1b78780b
DL
13000 " Belongs to the subnet range group: %pFX\n",
13001 range);
d62a17ae 13002 }
13003 }
13004 }
13005 }
13006
13007 if (use_json) {
13008 /* Administrative shutdown. */
cb9196e7
DS
13009 if (CHECK_FLAG(p->flags, PEER_FLAG_SHUTDOWN)
13010 || CHECK_FLAG(p->bgp->flags, BGP_FLAG_SHUTDOWN))
d62a17ae 13011 json_object_boolean_true_add(json_neigh,
13012 "adminShutDown");
13013
13014 /* BGP Version. */
13015 json_object_int_add(json_neigh, "bgpVersion", 4);
c949c771
DA
13016 json_object_string_addf(json_neigh, "remoteRouterId", "%pI4",
13017 &p->remote_id);
13018 json_object_string_addf(json_neigh, "localRouterId", "%pI4",
13019 &bgp->router_id);
d62a17ae 13020
13021 /* Confederation */
13022 if (CHECK_FLAG(bgp->config, BGP_CONFIG_CONFEDERATION)
13023 && bgp_confederation_peers_check(bgp, p->as))
13024 json_object_boolean_true_add(json_neigh,
13025 "nbrCommonAdmin");
13026
13027 /* Status. */
13028 json_object_string_add(
13029 json_neigh, "bgpState",
13030 lookup_msg(bgp_status_msg, p->status, NULL));
13031
feb17238 13032 if (peer_established(p)) {
d62a17ae 13033 time_t uptime;
d62a17ae 13034
083ec940 13035 uptime = monotime(NULL);
d62a17ae 13036 uptime -= p->uptime;
d62a17ae 13037 epoch_tbuf = time(NULL) - uptime;
13038
d3c7efed
DS
13039 json_object_int_add(json_neigh, "bgpTimerUpMsec",
13040 uptime * 1000);
d62a17ae 13041 json_object_string_add(json_neigh, "bgpTimerUpString",
13042 peer_uptime(p->uptime, timebuf,
13043 BGP_UPTIME_LEN, 0,
13044 NULL));
13045 json_object_int_add(json_neigh,
13046 "bgpTimerUpEstablishedEpoch",
13047 epoch_tbuf);
13048 }
13049
13050 else if (p->status == Active) {
13051 if (CHECK_FLAG(p->flags, PEER_FLAG_PASSIVE))
13052 json_object_string_add(json_neigh, "bgpStateIs",
13053 "passive");
13054 else if (CHECK_FLAG(p->sflags, PEER_STATUS_NSF_WAIT))
13055 json_object_string_add(json_neigh, "bgpStateIs",
13056 "passiveNSF");
13057 }
13058
13059 /* read timer */
13060 time_t uptime;
a2700b50 13061 struct tm tm;
d62a17ae 13062
083ec940 13063 uptime = monotime(NULL);
d62a17ae 13064 uptime -= p->readtime;
a2700b50
MS
13065 gmtime_r(&uptime, &tm);
13066
d62a17ae 13067 json_object_int_add(json_neigh, "bgpTimerLastRead",
a2700b50
MS
13068 (tm.tm_sec * 1000) + (tm.tm_min * 60000)
13069 + (tm.tm_hour * 3600000));
d62a17ae 13070
083ec940 13071 uptime = monotime(NULL);
d62a17ae 13072 uptime -= p->last_write;
a2700b50
MS
13073 gmtime_r(&uptime, &tm);
13074
d62a17ae 13075 json_object_int_add(json_neigh, "bgpTimerLastWrite",
a2700b50
MS
13076 (tm.tm_sec * 1000) + (tm.tm_min * 60000)
13077 + (tm.tm_hour * 3600000));
d62a17ae 13078
083ec940 13079 uptime = monotime(NULL);
d62a17ae 13080 uptime -= p->update_time;
a2700b50
MS
13081 gmtime_r(&uptime, &tm);
13082
d62a17ae 13083 json_object_int_add(json_neigh, "bgpInUpdateElapsedTimeMsecs",
a2700b50
MS
13084 (tm.tm_sec * 1000) + (tm.tm_min * 60000)
13085 + (tm.tm_hour * 3600000));
d62a17ae 13086
13087 /* Configured timer values. */
9b1b9623
TA
13088 json_object_int_add(json_neigh,
13089 "bgpTimerConfiguredHoldTimeMsecs",
e93d5c29
TA
13090 CHECK_FLAG(p->flags, PEER_FLAG_TIMER)
13091 ? p->holdtime * 1000
13092 : bgp->default_holdtime * 1000);
13093 json_object_int_add(json_neigh,
13094 "bgpTimerConfiguredKeepAliveIntervalMsecs",
13095 CHECK_FLAG(p->flags, PEER_FLAG_TIMER)
13096 ? p->keepalive * 1000
13097 : bgp->default_keepalive * 1000);
d62a17ae 13098 json_object_int_add(json_neigh, "bgpTimerHoldTimeMsecs",
13099 p->v_holdtime * 1000);
13100 json_object_int_add(json_neigh,
13101 "bgpTimerKeepAliveIntervalMsecs",
13102 p->v_keepalive * 1000);
d43114f3
DS
13103 if (CHECK_FLAG(p->flags, PEER_FLAG_TIMER_DELAYOPEN)) {
13104 json_object_int_add(json_neigh,
13105 "bgpTimerDelayOpenTimeMsecs",
13106 p->v_delayopen * 1000);
13107 }
13108
4ab46701
AR
13109 /* Configured and Synced tcp-mss value for peer */
13110 if (CHECK_FLAG(p->flags, PEER_FLAG_TCP_MSS)) {
13111 sync_tcp_mss = sockopt_tcp_mss_get(p->fd);
13112 json_object_int_add(json_neigh, "bgpTcpMssConfigured",
13113 p->tcp_mss);
13114 json_object_int_add(json_neigh, "bgpTcpMssSynced",
13115 sync_tcp_mss);
13116 }
13117
d08c0c80
DA
13118 /* Extended Optional Parameters Length for BGP OPEN Message */
13119 if (BGP_OPEN_EXT_OPT_PARAMS_CAPABLE(p))
13120 json_object_boolean_true_add(
13121 json_neigh, "extendedOptionalParametersLength");
13122 else
13123 json_object_boolean_false_add(
13124 json_neigh, "extendedOptionalParametersLength");
6e37924b
DA
13125
13126 /* Conditional advertisements */
13127 json_object_int_add(
13128 json_neigh,
13129 "bgpTimerConfiguredConditionalAdvertisementsSec",
13130 bgp->condition_check_period);
13131 if (thread_is_scheduled(bgp->t_condition_check))
13132 json_object_int_add(
13133 json_neigh,
13134 "bgpTimerUntilConditionalAdvertisementsSec",
13135 thread_timer_remain_second(
13136 bgp->t_condition_check));
d62a17ae 13137 } else {
13138 /* Administrative shutdown. */
cb9196e7
DS
13139 if (CHECK_FLAG(p->flags, PEER_FLAG_SHUTDOWN)
13140 || CHECK_FLAG(p->bgp->flags, BGP_FLAG_SHUTDOWN))
d62a17ae 13141 vty_out(vty, " Administratively shut down\n");
13142
13143 /* BGP Version. */
13144 vty_out(vty, " BGP version 4");
0e38aeb4 13145 vty_out(vty, ", remote router ID %s",
d62a17ae 13146 inet_ntop(AF_INET, &p->remote_id, buf1, sizeof(buf1)));
0e38aeb4
AD
13147 vty_out(vty, ", local router ID %s\n",
13148 inet_ntop(AF_INET, &bgp->router_id, buf1,
13149 sizeof(buf1)));
d62a17ae 13150
13151 /* Confederation */
13152 if (CHECK_FLAG(bgp->config, BGP_CONFIG_CONFEDERATION)
13153 && bgp_confederation_peers_check(bgp, p->as))
13154 vty_out(vty,
13155 " Neighbor under common administration\n");
13156
13157 /* Status. */
13158 vty_out(vty, " BGP state = %s",
13159 lookup_msg(bgp_status_msg, p->status, NULL));
13160
feb17238 13161 if (peer_established(p))
d62a17ae 13162 vty_out(vty, ", up for %8s",
13163 peer_uptime(p->uptime, timebuf, BGP_UPTIME_LEN,
13164 0, NULL));
13165
13166 else if (p->status == Active) {
13167 if (CHECK_FLAG(p->flags, PEER_FLAG_PASSIVE))
13168 vty_out(vty, " (passive)");
13169 else if (CHECK_FLAG(p->sflags, PEER_STATUS_NSF_WAIT))
13170 vty_out(vty, " (NSF passive)");
13171 }
13172 vty_out(vty, "\n");
13173
13174 /* read timer */
13175 vty_out(vty, " Last read %s",
13176 peer_uptime(p->readtime, timebuf, BGP_UPTIME_LEN, 0,
13177 NULL));
13178 vty_out(vty, ", Last write %s\n",
13179 peer_uptime(p->last_write, timebuf, BGP_UPTIME_LEN, 0,
13180 NULL));
13181
13182 /* Configured timer values. */
13183 vty_out(vty,
e93d5c29 13184 " Hold time is %d seconds, keepalive interval is %d seconds\n",
d62a17ae 13185 p->v_holdtime, p->v_keepalive);
e93d5c29
TA
13186 vty_out(vty, " Configured hold time is %d seconds",
13187 CHECK_FLAG(p->flags, PEER_FLAG_TIMER)
13188 ? p->holdtime
13189 : bgp->default_holdtime);
9b1b9623 13190 vty_out(vty, ", keepalive interval is %d seconds\n",
e93d5c29
TA
13191 CHECK_FLAG(p->flags, PEER_FLAG_TIMER)
13192 ? p->keepalive
13193 : bgp->default_keepalive);
d43114f3
DS
13194 if (CHECK_FLAG(p->flags, PEER_FLAG_TIMER_DELAYOPEN))
13195 vty_out(vty,
13196 " Configured DelayOpenTime is %d seconds\n",
13197 p->delayopen);
4ab46701
AR
13198
13199 /* Configured and synced tcp-mss value for peer */
13200 if (CHECK_FLAG(p->flags, PEER_FLAG_TCP_MSS)) {
13201 sync_tcp_mss = sockopt_tcp_mss_get(p->fd);
13202 vty_out(vty, " Configured tcp-mss is %d", p->tcp_mss);
13203 vty_out(vty, ", synced tcp-mss is %d\n", sync_tcp_mss);
13204 }
d08c0c80
DA
13205
13206 /* Extended Optional Parameters Length for BGP OPEN Message */
13207 if (BGP_OPEN_EXT_OPT_PARAMS_CAPABLE(p))
13208 vty_out(vty,
13209 " Extended Optional Parameters Length is enabled\n");
6e37924b
DA
13210
13211 /* Conditional advertisements */
13212 vty_out(vty,
13213 " Configured conditional advertisements interval is %d seconds\n",
13214 bgp->condition_check_period);
13215 if (thread_is_scheduled(bgp->t_condition_check))
13216 vty_out(vty,
13217 " Time until conditional advertisements begin is %lu seconds\n",
13218 thread_timer_remain_second(
13219 bgp->t_condition_check));
d62a17ae 13220 }
13221 /* Capability. */
10711563
DA
13222 if (peer_established(p) &&
13223 (p->cap || peer_afc_advertised(p) || peer_afc_received(p))) {
13224 if (use_json) {
13225 json_object *json_cap = NULL;
d62a17ae 13226
10711563 13227 json_cap = json_object_new_object();
d62a17ae 13228
10711563
DA
13229 /* AS4 */
13230 if (CHECK_FLAG(p->cap, PEER_CAP_AS4_RCV) ||
13231 CHECK_FLAG(p->cap, PEER_CAP_AS4_ADV)) {
13232 if (CHECK_FLAG(p->cap, PEER_CAP_AS4_ADV) &&
13233 CHECK_FLAG(p->cap, PEER_CAP_AS4_RCV))
ef56aee4 13234 json_object_string_add(
10711563 13235 json_cap, "4byteAs",
ef56aee4 13236 "advertisedAndReceived");
10711563
DA
13237 else if (CHECK_FLAG(p->cap, PEER_CAP_AS4_ADV))
13238 json_object_string_add(json_cap,
13239 "4byteAs",
13240 "advertised");
13241 else if (CHECK_FLAG(p->cap, PEER_CAP_AS4_RCV))
13242 json_object_string_add(json_cap,
13243 "4byteAs",
13244 "received");
13245 }
ef56aee4 13246
10711563
DA
13247 /* Extended Message Support */
13248 if (CHECK_FLAG(p->cap, PEER_CAP_EXTENDED_MESSAGE_ADV) &&
13249 CHECK_FLAG(p->cap, PEER_CAP_EXTENDED_MESSAGE_RCV))
13250 json_object_string_add(json_cap,
13251 "extendedMessage",
13252 "advertisedAndReceived");
13253 else if (CHECK_FLAG(p->cap,
13254 PEER_CAP_EXTENDED_MESSAGE_ADV))
13255 json_object_string_add(json_cap,
13256 "extendedMessage",
13257 "advertised");
13258 else if (CHECK_FLAG(p->cap,
13259 PEER_CAP_EXTENDED_MESSAGE_RCV))
13260 json_object_string_add(json_cap,
13261 "extendedMessage",
13262 "received");
ef56aee4 13263
10711563
DA
13264 /* AddPath */
13265 if (CHECK_FLAG(p->cap, PEER_CAP_ADDPATH_RCV) ||
13266 CHECK_FLAG(p->cap, PEER_CAP_ADDPATH_ADV)) {
13267 json_object *json_add = NULL;
13268 const char *print_store;
d62a17ae 13269
10711563 13270 json_add = json_object_new_object();
d62a17ae 13271
10711563
DA
13272 FOREACH_AFI_SAFI (afi, safi) {
13273 json_object *json_sub = NULL;
13274 json_sub = json_object_new_object();
13275 print_store = get_afi_safi_str(
13276 afi, safi, true);
d62a17ae 13277
10711563
DA
13278 if (CHECK_FLAG(
13279 p->af_cap[afi][safi],
13280 PEER_CAP_ADDPATH_AF_TX_ADV) ||
13281 CHECK_FLAG(
13282 p->af_cap[afi][safi],
13283 PEER_CAP_ADDPATH_AF_TX_RCV)) {
05c7a1cc
QY
13284 if (CHECK_FLAG(
13285 p->af_cap[afi]
13286 [safi],
10711563
DA
13287 PEER_CAP_ADDPATH_AF_TX_ADV) &&
13288 CHECK_FLAG(
05c7a1cc
QY
13289 p->af_cap[afi]
13290 [safi],
10711563
DA
13291 PEER_CAP_ADDPATH_AF_TX_RCV))
13292 json_object_boolean_true_add(
13293 json_sub,
13294 "txAdvertisedAndReceived");
13295 else if (
13296 CHECK_FLAG(
13297 p->af_cap[afi]
13298 [safi],
13299 PEER_CAP_ADDPATH_AF_TX_ADV))
13300 json_object_boolean_true_add(
13301 json_sub,
13302 "txAdvertised");
13303 else if (
13304 CHECK_FLAG(
13305 p->af_cap[afi]
13306 [safi],
13307 PEER_CAP_ADDPATH_AF_TX_RCV))
13308 json_object_boolean_true_add(
13309 json_sub,
13310 "txReceived");
13311 }
d62a17ae 13312
10711563
DA
13313 if (CHECK_FLAG(
13314 p->af_cap[afi][safi],
13315 PEER_CAP_ADDPATH_AF_RX_ADV) ||
13316 CHECK_FLAG(
13317 p->af_cap[afi][safi],
13318 PEER_CAP_ADDPATH_AF_RX_RCV)) {
05c7a1cc
QY
13319 if (CHECK_FLAG(
13320 p->af_cap[afi]
13321 [safi],
10711563
DA
13322 PEER_CAP_ADDPATH_AF_RX_ADV) &&
13323 CHECK_FLAG(
13324 p->af_cap[afi]
13325 [safi],
13326 PEER_CAP_ADDPATH_AF_RX_RCV))
13327 json_object_boolean_true_add(
13328 json_sub,
13329 "rxAdvertisedAndReceived");
13330 else if (
13331 CHECK_FLAG(
13332 p->af_cap[afi]
13333 [safi],
13334 PEER_CAP_ADDPATH_AF_RX_ADV))
13335 json_object_boolean_true_add(
13336 json_sub,
13337 "rxAdvertised");
13338 else if (
13339 CHECK_FLAG(
13340 p->af_cap[afi]
13341 [safi],
13342 PEER_CAP_ADDPATH_AF_RX_RCV))
13343 json_object_boolean_true_add(
13344 json_sub,
13345 "rxReceived");
05c7a1cc
QY
13346 }
13347
10711563
DA
13348 if (CHECK_FLAG(
13349 p->af_cap[afi][safi],
13350 PEER_CAP_ADDPATH_AF_TX_ADV) ||
13351 CHECK_FLAG(
13352 p->af_cap[afi][safi],
13353 PEER_CAP_ADDPATH_AF_TX_RCV) ||
13354 CHECK_FLAG(
13355 p->af_cap[afi][safi],
13356 PEER_CAP_ADDPATH_AF_RX_ADV) ||
13357 CHECK_FLAG(
13358 p->af_cap[afi][safi],
13359 PEER_CAP_ADDPATH_AF_RX_RCV))
13360 json_object_object_add(
13361 json_add, print_store,
13362 json_sub);
13363 else
13364 json_object_free(json_sub);
d62a17ae 13365 }
13366
10711563
DA
13367 json_object_object_add(json_cap, "addPath",
13368 json_add);
13369 }
d62a17ae 13370
10711563
DA
13371 /* Dynamic */
13372 if (CHECK_FLAG(p->cap, PEER_CAP_DYNAMIC_RCV) ||
13373 CHECK_FLAG(p->cap, PEER_CAP_DYNAMIC_ADV)) {
13374 if (CHECK_FLAG(p->cap, PEER_CAP_DYNAMIC_ADV) &&
13375 CHECK_FLAG(p->cap, PEER_CAP_DYNAMIC_RCV))
13376 json_object_string_add(
13377 json_cap, "dynamic",
13378 "advertisedAndReceived");
13379 else if (CHECK_FLAG(p->cap,
13380 PEER_CAP_DYNAMIC_ADV))
13381 json_object_string_add(json_cap,
13382 "dynamic",
13383 "advertised");
13384 else if (CHECK_FLAG(p->cap,
13385 PEER_CAP_DYNAMIC_RCV))
13386 json_object_string_add(json_cap,
13387 "dynamic",
13388 "received");
13389 }
d62a17ae 13390
d864dd9e
EB
13391 /* Role */
13392 if (CHECK_FLAG(p->cap, PEER_CAP_ROLE_RCV) ||
13393 CHECK_FLAG(p->cap, PEER_CAP_ROLE_ADV)) {
13394 if (CHECK_FLAG(p->cap, PEER_CAP_ROLE_ADV) &&
13395 CHECK_FLAG(p->cap, PEER_CAP_ROLE_RCV))
13396 json_object_string_add(
13397 json_cap, "role",
13398 "advertisedAndReceived");
13399 else if (CHECK_FLAG(p->cap, PEER_CAP_ROLE_ADV))
13400 json_object_string_add(json_cap, "role",
13401 "advertised");
13402 else if (CHECK_FLAG(p->cap, PEER_CAP_ROLE_RCV))
13403 json_object_string_add(json_cap, "role",
13404 "received");
13405 }
13406
10711563
DA
13407 /* Extended nexthop */
13408 if (CHECK_FLAG(p->cap, PEER_CAP_ENHE_RCV) ||
13409 CHECK_FLAG(p->cap, PEER_CAP_ENHE_ADV)) {
13410 json_object *json_nxt = NULL;
13411 const char *print_store;
d62a17ae 13412
d62a17ae 13413
10711563
DA
13414 if (CHECK_FLAG(p->cap, PEER_CAP_ENHE_ADV) &&
13415 CHECK_FLAG(p->cap, PEER_CAP_ENHE_RCV))
13416 json_object_string_add(
13417 json_cap, "extendedNexthop",
13418 "advertisedAndReceived");
13419 else if (CHECK_FLAG(p->cap, PEER_CAP_ENHE_ADV))
13420 json_object_string_add(
13421 json_cap, "extendedNexthop",
13422 "advertised");
13423 else if (CHECK_FLAG(p->cap, PEER_CAP_ENHE_RCV))
13424 json_object_string_add(
13425 json_cap, "extendedNexthop",
13426 "received");
d62a17ae 13427
10711563
DA
13428 if (CHECK_FLAG(p->cap, PEER_CAP_ENHE_RCV)) {
13429 json_nxt = json_object_new_object();
d62a17ae 13430
10711563
DA
13431 for (safi = SAFI_UNICAST;
13432 safi < SAFI_MAX; safi++) {
13433 if (CHECK_FLAG(
13434 p->af_cap[AFI_IP]
13435 [safi],
13436 PEER_CAP_ENHE_AF_RCV)) {
13437 print_store =
13438 get_afi_safi_str(
d62a17ae 13439 AFI_IP,
10711563
DA
13440 safi,
13441 true);
13442 json_object_string_add(
13443 json_nxt,
13444 print_store,
13445 "recieved"); /* misspelled for compatibility */
d62a17ae 13446 }
d62a17ae 13447 }
10711563
DA
13448 json_object_object_add(
13449 json_cap,
13450 "extendedNexthopFamililesByPeer",
13451 json_nxt);
d62a17ae 13452 }
10711563 13453 }
d62a17ae 13454
10711563
DA
13455 /* Long-lived Graceful Restart */
13456 if (CHECK_FLAG(p->cap, PEER_CAP_LLGR_RCV) ||
13457 CHECK_FLAG(p->cap, PEER_CAP_LLGR_ADV)) {
13458 json_object *json_llgr = NULL;
13459 const char *afi_safi_str;
8606be87 13460
10711563
DA
13461 if (CHECK_FLAG(p->cap, PEER_CAP_LLGR_ADV) &&
13462 CHECK_FLAG(p->cap, PEER_CAP_LLGR_RCV))
13463 json_object_string_add(
13464 json_cap,
13465 "longLivedGracefulRestart",
13466 "advertisedAndReceived");
13467 else if (CHECK_FLAG(p->cap, PEER_CAP_LLGR_ADV))
13468 json_object_string_add(
13469 json_cap,
13470 "longLivedGracefulRestart",
13471 "advertised");
13472 else if (CHECK_FLAG(p->cap, PEER_CAP_LLGR_RCV))
13473 json_object_string_add(
13474 json_cap,
13475 "longLivedGracefulRestart",
13476 "received");
8606be87 13477
10711563
DA
13478 if (CHECK_FLAG(p->cap, PEER_CAP_LLGR_RCV)) {
13479 json_llgr = json_object_new_object();
8606be87 13480
10711563
DA
13481 FOREACH_AFI_SAFI (afi, safi) {
13482 if (CHECK_FLAG(
13483 p->af_cap[afi]
13484 [safi],
13485 PEER_CAP_ENHE_AF_RCV)) {
13486 afi_safi_str =
13487 get_afi_safi_str(
8606be87
DA
13488 afi,
13489 safi,
13490 true);
10711563
DA
13491 json_object_string_add(
13492 json_llgr,
13493 afi_safi_str,
13494 "received");
8606be87 13495 }
8606be87 13496 }
10711563
DA
13497 json_object_object_add(
13498 json_cap,
13499 "longLivedGracefulRestartByPeer",
13500 json_llgr);
8606be87 13501 }
10711563 13502 }
8606be87 13503
10711563
DA
13504 /* Route Refresh */
13505 if (CHECK_FLAG(p->cap, PEER_CAP_REFRESH_ADV) ||
13506 CHECK_FLAG(p->cap, PEER_CAP_REFRESH_NEW_RCV) ||
13507 CHECK_FLAG(p->cap, PEER_CAP_REFRESH_OLD_RCV)) {
13508 if (CHECK_FLAG(p->cap, PEER_CAP_REFRESH_ADV) &&
13509 (CHECK_FLAG(p->cap,
13510 PEER_CAP_REFRESH_NEW_RCV) ||
13511 CHECK_FLAG(p->cap,
13512 PEER_CAP_REFRESH_OLD_RCV))) {
13513 if (CHECK_FLAG(
13514 p->cap,
13515 PEER_CAP_REFRESH_OLD_RCV) &&
13516 CHECK_FLAG(
13517 p->cap,
13518 PEER_CAP_REFRESH_NEW_RCV))
13519 json_object_string_add(
13520 json_cap,
13521 "routeRefresh",
13522 "advertisedAndReceivedOldNew");
13523 else {
d62a17ae 13524 if (CHECK_FLAG(
13525 p->cap,
10711563 13526 PEER_CAP_REFRESH_OLD_RCV))
d62a17ae 13527 json_object_string_add(
13528 json_cap,
13529 "routeRefresh",
10711563
DA
13530 "advertisedAndReceivedOld");
13531 else
13532 json_object_string_add(
13533 json_cap,
13534 "routeRefresh",
13535 "advertisedAndReceivedNew");
d62a17ae 13536 }
10711563
DA
13537 } else if (CHECK_FLAG(p->cap,
13538 PEER_CAP_REFRESH_ADV))
13539 json_object_string_add(json_cap,
13540 "routeRefresh",
13541 "advertised");
13542 else if (CHECK_FLAG(p->cap,
13543 PEER_CAP_REFRESH_NEW_RCV) ||
13544 CHECK_FLAG(p->cap,
13545 PEER_CAP_REFRESH_OLD_RCV))
13546 json_object_string_add(json_cap,
13547 "routeRefresh",
13548 "received");
13549 }
d62a17ae 13550
10711563
DA
13551 /* Enhanced Route Refresh */
13552 if (CHECK_FLAG(p->cap, PEER_CAP_ENHANCED_RR_ADV) ||
13553 CHECK_FLAG(p->cap, PEER_CAP_ENHANCED_RR_RCV)) {
13554 if (CHECK_FLAG(p->cap,
13555 PEER_CAP_ENHANCED_RR_ADV) &&
13556 CHECK_FLAG(p->cap,
13557 PEER_CAP_ENHANCED_RR_RCV))
d77114b7 13558 json_object_string_add(
10711563
DA
13559 json_cap,
13560 "enhancedRouteRefresh",
13561 "advertisedAndReceived");
13562 else if (CHECK_FLAG(p->cap,
13563 PEER_CAP_ENHANCED_RR_ADV))
d77114b7 13564 json_object_string_add(
10711563
DA
13565 json_cap,
13566 "enhancedRouteRefresh",
13567 "advertised");
13568 else if (CHECK_FLAG(p->cap,
9af52ccf 13569 PEER_CAP_ENHANCED_RR_RCV))
10711563
DA
13570 json_object_string_add(
13571 json_cap,
13572 "enhancedRouteRefresh",
13573 "received");
13574 }
d77114b7 13575
10711563
DA
13576 /* Multiprotocol Extensions */
13577 json_object *json_multi = NULL;
d77114b7 13578
10711563 13579 json_multi = json_object_new_object();
d77114b7 13580
10711563
DA
13581 FOREACH_AFI_SAFI (afi, safi) {
13582 if (p->afc_adv[afi][safi] ||
13583 p->afc_recv[afi][safi]) {
13584 json_object *json_exten = NULL;
13585 json_exten = json_object_new_object();
13586
13587 if (p->afc_adv[afi][safi] &&
13588 p->afc_recv[afi][safi])
13589 json_object_boolean_true_add(
13590 json_exten,
9af52ccf 13591 "advertisedAndReceived");
10711563
DA
13592 else if (p->afc_adv[afi][safi])
13593 json_object_boolean_true_add(
13594 json_exten,
9af52ccf 13595 "advertised");
10711563
DA
13596 else if (p->afc_recv[afi][safi])
13597 json_object_boolean_true_add(
13598 json_exten, "received");
9af52ccf 13599
10711563
DA
13600 json_object_object_add(
13601 json_multi,
13602 get_afi_safi_str(afi, safi,
13603 true),
13604 json_exten);
13605 }
13606 }
13607 json_object_object_add(json_cap,
13608 "multiprotocolExtensions",
13609 json_multi);
d62a17ae 13610
10711563
DA
13611 /* Hostname capabilities */
13612 json_object *json_hname = NULL;
d62a17ae 13613
10711563 13614 json_hname = json_object_new_object();
d62a17ae 13615
10711563
DA
13616 if (CHECK_FLAG(p->cap, PEER_CAP_HOSTNAME_ADV)) {
13617 json_object_string_add(
13618 json_hname, "advHostName",
13619 bgp->peer_self->hostname
13620 ? bgp->peer_self->hostname
13621 : "n/a");
13622 json_object_string_add(
13623 json_hname, "advDomainName",
13624 bgp->peer_self->domainname
13625 ? bgp->peer_self->domainname
13626 : "n/a");
13627 }
d77114b7 13628
d77114b7 13629
10711563
DA
13630 if (CHECK_FLAG(p->cap, PEER_CAP_HOSTNAME_RCV)) {
13631 json_object_string_add(
13632 json_hname, "rcvHostName",
13633 p->hostname ? p->hostname : "n/a");
13634 json_object_string_add(
13635 json_hname, "rcvDomainName",
13636 p->domainname ? p->domainname : "n/a");
13637 }
d77114b7 13638
10711563
DA
13639 json_object_object_add(json_cap, "hostName",
13640 json_hname);
d77114b7 13641
17be83bf 13642 /* Graceful Restart */
10711563
DA
13643 if (CHECK_FLAG(p->cap, PEER_CAP_RESTART_RCV) ||
13644 CHECK_FLAG(p->cap, PEER_CAP_RESTART_ADV)) {
13645 if (CHECK_FLAG(p->cap, PEER_CAP_RESTART_ADV) &&
13646 CHECK_FLAG(p->cap, PEER_CAP_RESTART_RCV))
d77114b7 13647 json_object_string_add(
10711563
DA
13648 json_cap, "gracefulRestart",
13649 "advertisedAndReceived");
13650 else if (CHECK_FLAG(p->cap,
13651 PEER_CAP_RESTART_ADV))
d77114b7 13652 json_object_string_add(
10711563
DA
13653 json_cap,
13654 "gracefulRestartCapability",
13655 "advertised");
13656 else if (CHECK_FLAG(p->cap,
13657 PEER_CAP_RESTART_RCV))
13658 json_object_string_add(
13659 json_cap,
13660 "gracefulRestartCapability",
13661 "received");
d77114b7 13662
10711563
DA
13663 if (CHECK_FLAG(p->cap, PEER_CAP_RESTART_RCV)) {
13664 int restart_af_count = 0;
13665 json_object *json_restart = NULL;
13666 json_restart = json_object_new_object();
d62a17ae 13667
10711563
DA
13668 json_object_int_add(
13669 json_cap,
13670 "gracefulRestartRemoteTimerMsecs",
13671 p->v_gr_restart * 1000);
d62a17ae 13672
10711563 13673 FOREACH_AFI_SAFI (afi, safi) {
05c7a1cc
QY
13674 if (CHECK_FLAG(
13675 p->af_cap[afi]
13676 [safi],
10711563
DA
13677 PEER_CAP_RESTART_AF_RCV)) {
13678 json_object *json_sub =
13679 NULL;
13680 json_sub =
13681 json_object_new_object();
d62a17ae 13682
05c7a1cc
QY
13683 if (CHECK_FLAG(
13684 p->af_cap
13685 [afi]
13686 [safi],
10711563
DA
13687 PEER_CAP_RESTART_AF_PRESERVE_RCV))
13688 json_object_boolean_true_add(
13689 json_sub,
13690 "preserved");
13691 restart_af_count++;
d62a17ae 13692 json_object_object_add(
10711563
DA
13693 json_restart,
13694 get_afi_safi_str(
13695 afi,
13696 safi,
13697 true),
13698 json_sub);
d62a17ae 13699 }
d62a17ae 13700 }
10711563
DA
13701 if (!restart_af_count) {
13702 json_object_string_add(
13703 json_cap,
13704 "addressFamiliesByPeer",
13705 "none");
13706 json_object_free(json_restart);
13707 } else
13708 json_object_object_add(
13709 json_cap,
13710 "addressFamiliesByPeer",
13711 json_restart);
d62a17ae 13712 }
10711563
DA
13713 }
13714 json_object_object_add(
13715 json_neigh, "neighborCapabilities", json_cap);
13716 } else {
13717 vty_out(vty, " Neighbor capabilities:\n");
13718
13719 /* AS4 */
13720 if (CHECK_FLAG(p->cap, PEER_CAP_AS4_RCV) ||
13721 CHECK_FLAG(p->cap, PEER_CAP_AS4_ADV)) {
13722 vty_out(vty, " 4 Byte AS:");
13723 if (CHECK_FLAG(p->cap, PEER_CAP_AS4_ADV))
13724 vty_out(vty, " advertised");
13725 if (CHECK_FLAG(p->cap, PEER_CAP_AS4_RCV))
13726 vty_out(vty, " %sreceived",
13727 CHECK_FLAG(p->cap,
13728 PEER_CAP_AS4_ADV)
13729 ? "and "
13730 : "");
13731 vty_out(vty, "\n");
13732 }
d62a17ae 13733
10711563
DA
13734 /* Extended Message Support */
13735 if (CHECK_FLAG(p->cap, PEER_CAP_EXTENDED_MESSAGE_RCV) ||
13736 CHECK_FLAG(p->cap, PEER_CAP_EXTENDED_MESSAGE_ADV)) {
13737 vty_out(vty, " Extended Message:");
ef56aee4 13738 if (CHECK_FLAG(p->cap,
10711563
DA
13739 PEER_CAP_EXTENDED_MESSAGE_ADV))
13740 vty_out(vty, " advertised");
13741 if (CHECK_FLAG(p->cap,
13742 PEER_CAP_EXTENDED_MESSAGE_RCV))
13743 vty_out(vty, " %sreceived",
13744 CHECK_FLAG(
13745 p->cap,
13746 PEER_CAP_EXTENDED_MESSAGE_ADV)
13747 ? "and "
13748 : "");
13749 vty_out(vty, "\n");
13750 }
d62a17ae 13751
10711563
DA
13752 /* AddPath */
13753 if (CHECK_FLAG(p->cap, PEER_CAP_ADDPATH_RCV) ||
13754 CHECK_FLAG(p->cap, PEER_CAP_ADDPATH_ADV)) {
13755 vty_out(vty, " AddPath:\n");
d62a17ae 13756
10711563 13757 FOREACH_AFI_SAFI (afi, safi) {
ef56aee4 13758 if (CHECK_FLAG(
10711563
DA
13759 p->af_cap[afi][safi],
13760 PEER_CAP_ADDPATH_AF_TX_ADV) ||
13761 CHECK_FLAG(
13762 p->af_cap[afi][safi],
13763 PEER_CAP_ADDPATH_AF_TX_RCV)) {
13764 vty_out(vty, " %s: TX ",
13765 get_afi_safi_str(
13766 afi, safi,
13767 false));
ef56aee4 13768
10711563
DA
13769 if (CHECK_FLAG(
13770 p->af_cap[afi]
13771 [safi],
13772 PEER_CAP_ADDPATH_AF_TX_ADV))
13773 vty_out(vty,
13774 "advertised");
d62a17ae 13775
05c7a1cc
QY
13776 if (CHECK_FLAG(
13777 p->af_cap[afi]
13778 [safi],
10711563 13779 PEER_CAP_ADDPATH_AF_TX_RCV))
05c7a1cc 13780 vty_out(vty,
10711563
DA
13781 "%sreceived",
13782 CHECK_FLAG(
13783 p->af_cap
13784 [afi]
13785 [safi],
13786 PEER_CAP_ADDPATH_AF_TX_ADV)
13787 ? " and "
13788 : "");
05c7a1cc 13789
10711563
DA
13790 vty_out(vty, "\n");
13791 }
d62a17ae 13792
9af52ccf 13793 if (CHECK_FLAG(
10711563
DA
13794 p->af_cap[afi][safi],
13795 PEER_CAP_ADDPATH_AF_RX_ADV) ||
13796 CHECK_FLAG(
13797 p->af_cap[afi][safi],
13798 PEER_CAP_ADDPATH_AF_RX_RCV)) {
13799 vty_out(vty, " %s: RX ",
5cb5f4d0 13800 get_afi_safi_str(
10711563
DA
13801 afi, safi,
13802 false));
d62a17ae 13803
05c7a1cc
QY
13804 if (CHECK_FLAG(
13805 p->af_cap[afi]
13806 [safi],
10711563 13807 PEER_CAP_ADDPATH_AF_RX_ADV))
05c7a1cc 13808 vty_out(vty,
10711563 13809 "advertised");
d62a17ae 13810
10711563
DA
13811 if (CHECK_FLAG(
13812 p->af_cap[afi]
13813 [safi],
13814 PEER_CAP_ADDPATH_AF_RX_RCV))
05c7a1cc 13815 vty_out(vty,
10711563
DA
13816 "%sreceived",
13817 CHECK_FLAG(
13818 p->af_cap
13819 [afi]
13820 [safi],
13821 PEER_CAP_ADDPATH_AF_RX_ADV)
13822 ? " and "
05c7a1cc 13823 : "");
d62a17ae 13824
05c7a1cc 13825 vty_out(vty, "\n");
05c7a1cc 13826 }
d62a17ae 13827 }
10711563 13828 }
d62a17ae 13829
10711563
DA
13830 /* Dynamic */
13831 if (CHECK_FLAG(p->cap, PEER_CAP_DYNAMIC_RCV) ||
13832 CHECK_FLAG(p->cap, PEER_CAP_DYNAMIC_ADV)) {
13833 vty_out(vty, " Dynamic:");
13834 if (CHECK_FLAG(p->cap, PEER_CAP_DYNAMIC_ADV))
13835 vty_out(vty, " advertised");
13836 if (CHECK_FLAG(p->cap, PEER_CAP_DYNAMIC_RCV))
13837 vty_out(vty, " %sreceived",
13838 CHECK_FLAG(p->cap,
13839 PEER_CAP_DYNAMIC_ADV)
13840 ? "and "
13841 : "");
13842 vty_out(vty, "\n");
13843 }
d62a17ae 13844
d864dd9e
EB
13845 /* Role */
13846 if (CHECK_FLAG(p->cap, PEER_CAP_ROLE_RCV) ||
13847 CHECK_FLAG(p->cap, PEER_CAP_ROLE_ADV)) {
13848 vty_out(vty, " Role:");
13849 if (CHECK_FLAG(p->cap, PEER_CAP_ROLE_ADV))
13850 vty_out(vty, " advertised");
13851 if (CHECK_FLAG(p->cap, PEER_CAP_ROLE_RCV))
13852 vty_out(vty, " %sreceived",
13853 CHECK_FLAG(p->cap,
13854 PEER_CAP_ROLE_ADV)
13855 ? "and "
13856 : "");
13857 vty_out(vty, "\n");
13858 }
13859
10711563
DA
13860 /* Extended nexthop */
13861 if (CHECK_FLAG(p->cap, PEER_CAP_ENHE_RCV) ||
13862 CHECK_FLAG(p->cap, PEER_CAP_ENHE_ADV)) {
13863 vty_out(vty, " Extended nexthop:");
13864 if (CHECK_FLAG(p->cap, PEER_CAP_ENHE_ADV))
13865 vty_out(vty, " advertised");
13866 if (CHECK_FLAG(p->cap, PEER_CAP_ENHE_RCV))
13867 vty_out(vty, " %sreceived",
13868 CHECK_FLAG(p->cap,
13869 PEER_CAP_ENHE_ADV)
13870 ? "and "
13871 : "");
13872 vty_out(vty, "\n");
d62a17ae 13873
10711563 13874 if (CHECK_FLAG(p->cap, PEER_CAP_ENHE_RCV)) {
57f7feb6 13875 vty_out(vty,
10711563
DA
13876 " Address families by peer:\n ");
13877 for (safi = SAFI_UNICAST;
13878 safi < SAFI_MAX; safi++)
13879 if (CHECK_FLAG(
13880 p->af_cap[AFI_IP]
13881 [safi],
13882 PEER_CAP_ENHE_AF_RCV))
13883 vty_out(vty,
13884 " %s\n",
13885 get_afi_safi_str(
13886 AFI_IP,
13887 safi,
13888 false));
d62a17ae 13889 }
10711563 13890 }
d62a17ae 13891
10711563
DA
13892 /* Long-lived Graceful Restart */
13893 if (CHECK_FLAG(p->cap, PEER_CAP_LLGR_RCV) ||
13894 CHECK_FLAG(p->cap, PEER_CAP_LLGR_ADV)) {
13895 vty_out(vty,
13896 " Long-lived Graceful Restart:");
13897 if (CHECK_FLAG(p->cap, PEER_CAP_LLGR_ADV))
13898 vty_out(vty, " advertised");
13899 if (CHECK_FLAG(p->cap, PEER_CAP_LLGR_RCV))
13900 vty_out(vty, " %sreceived",
13901 CHECK_FLAG(p->cap,
13902 PEER_CAP_LLGR_ADV)
13903 ? "and "
13904 : "");
13905 vty_out(vty, "\n");
8606be87 13906
10711563 13907 if (CHECK_FLAG(p->cap, PEER_CAP_LLGR_RCV)) {
57f7feb6 13908 vty_out(vty,
10711563
DA
13909 " Address families by peer:\n");
13910 FOREACH_AFI_SAFI (afi, safi)
13911 if (CHECK_FLAG(
13912 p->af_cap[afi]
13913 [safi],
13914 PEER_CAP_LLGR_AF_RCV))
13915 vty_out(vty,
13916 " %s\n",
13917 get_afi_safi_str(
13918 afi,
13919 safi,
13920 false));
8606be87 13921 }
10711563 13922 }
8606be87 13923
10711563
DA
13924 /* Route Refresh */
13925 if (CHECK_FLAG(p->cap, PEER_CAP_REFRESH_ADV) ||
13926 CHECK_FLAG(p->cap, PEER_CAP_REFRESH_NEW_RCV) ||
13927 CHECK_FLAG(p->cap, PEER_CAP_REFRESH_OLD_RCV)) {
13928 vty_out(vty, " Route refresh:");
13929 if (CHECK_FLAG(p->cap, PEER_CAP_REFRESH_ADV))
13930 vty_out(vty, " advertised");
13931 if (CHECK_FLAG(p->cap,
13932 PEER_CAP_REFRESH_NEW_RCV) ||
13933 CHECK_FLAG(p->cap,
13934 PEER_CAP_REFRESH_OLD_RCV))
13935 vty_out(vty, " %sreceived(%s)",
13936 CHECK_FLAG(p->cap,
13937 PEER_CAP_REFRESH_ADV)
13938 ? "and "
13939 : "",
13940 (CHECK_FLAG(
13941 p->cap,
13942 PEER_CAP_REFRESH_OLD_RCV) &&
13943 CHECK_FLAG(
13944 p->cap,
13945 PEER_CAP_REFRESH_NEW_RCV))
13946 ? "old & new"
13947 : CHECK_FLAG(
13948 p->cap,
13949 PEER_CAP_REFRESH_OLD_RCV)
13950 ? "old"
13951 : "new");
d62a17ae 13952
d77114b7 13953 vty_out(vty, "\n");
10711563 13954 }
d62a17ae 13955
10711563
DA
13956 /* Enhanced Route Refresh */
13957 if (CHECK_FLAG(p->cap, PEER_CAP_ENHANCED_RR_ADV) ||
13958 CHECK_FLAG(p->cap, PEER_CAP_ENHANCED_RR_RCV)) {
13959 vty_out(vty, " Enhanced Route Refresh:");
13960 if (CHECK_FLAG(p->cap,
13961 PEER_CAP_ENHANCED_RR_ADV))
13962 vty_out(vty, " advertised");
13963 if (CHECK_FLAG(p->cap,
13964 PEER_CAP_ENHANCED_RR_RCV))
13965 vty_out(vty, " %sreceived",
13966 CHECK_FLAG(p->cap,
13967 PEER_CAP_REFRESH_ADV)
13968 ? "and "
13969 : "");
13970 vty_out(vty, "\n");
13971 }
13972
13973 /* Multiprotocol Extensions */
13974 FOREACH_AFI_SAFI (afi, safi)
13975 if (p->afc_adv[afi][safi] ||
13976 p->afc_recv[afi][safi]) {
13977 vty_out(vty, " Address Family %s:",
13978 get_afi_safi_str(afi, safi,
13979 false));
13980 if (p->afc_adv[afi][safi])
9af52ccf 13981 vty_out(vty, " advertised");
10711563 13982 if (p->afc_recv[afi][safi])
9af52ccf 13983 vty_out(vty, " %sreceived",
10711563 13984 p->afc_adv[afi][safi]
9af52ccf
DA
13985 ? "and "
13986 : "");
13987 vty_out(vty, "\n");
13988 }
13989
10711563
DA
13990 /* Hostname capability */
13991 vty_out(vty, " Hostname Capability:");
d62a17ae 13992
10711563
DA
13993 if (CHECK_FLAG(p->cap, PEER_CAP_HOSTNAME_ADV)) {
13994 vty_out(vty,
13995 " advertised (name: %s,domain name: %s)",
13996 bgp->peer_self->hostname
13997 ? bgp->peer_self->hostname
13998 : "n/a",
13999 bgp->peer_self->domainname
14000 ? bgp->peer_self->domainname
14001 : "n/a");
14002 } else {
14003 vty_out(vty, " not advertised");
14004 }
d77114b7 14005
10711563
DA
14006 if (CHECK_FLAG(p->cap, PEER_CAP_HOSTNAME_RCV)) {
14007 vty_out(vty,
14008 " received (name: %s,domain name: %s)",
14009 p->hostname ? p->hostname : "n/a",
14010 p->domainname ? p->domainname : "n/a");
14011 } else {
14012 vty_out(vty, " not received");
d62a17ae 14013 }
d62a17ae 14014
10711563 14015 vty_out(vty, "\n");
d77114b7 14016
10711563
DA
14017 /* Graceful Restart */
14018 if (CHECK_FLAG(p->cap, PEER_CAP_RESTART_RCV) ||
14019 CHECK_FLAG(p->cap, PEER_CAP_RESTART_ADV)) {
14020 vty_out(vty,
14021 " Graceful Restart Capability:");
14022 if (CHECK_FLAG(p->cap, PEER_CAP_RESTART_ADV))
14023 vty_out(vty, " advertised");
14024 if (CHECK_FLAG(p->cap, PEER_CAP_RESTART_RCV))
14025 vty_out(vty, " %sreceived",
14026 CHECK_FLAG(p->cap,
14027 PEER_CAP_RESTART_ADV)
14028 ? "and "
14029 : "");
d77114b7
MK
14030 vty_out(vty, "\n");
14031
10711563
DA
14032 if (CHECK_FLAG(p->cap, PEER_CAP_RESTART_RCV)) {
14033 int restart_af_count = 0;
d62a17ae 14034
10711563
DA
14035 vty_out(vty,
14036 " Remote Restart timer is %d seconds\n",
14037 p->v_gr_restart);
14038 vty_out(vty,
14039 " Address families by peer:\n ");
d62a17ae 14040
10711563
DA
14041 FOREACH_AFI_SAFI (afi, safi)
14042 if (CHECK_FLAG(
14043 p->af_cap[afi]
14044 [safi],
14045 PEER_CAP_RESTART_AF_RCV)) {
14046 vty_out(vty, "%s%s(%s)",
14047 restart_af_count
14048 ? ", "
14049 : "",
14050 get_afi_safi_str(
14051 afi,
14052 safi,
14053 false),
14054 CHECK_FLAG(
14055 p->af_cap
14056 [afi]
14057 [safi],
14058 PEER_CAP_RESTART_AF_PRESERVE_RCV)
14059 ? "preserved"
14060 : "not preserved");
14061 restart_af_count++;
14062 }
14063 if (!restart_af_count)
14064 vty_out(vty, "none");
14065 vty_out(vty, "\n");
14066 }
17be83bf 14067 } /* Graceful Restart */
d62a17ae 14068 }
14069 }
14070
14071 /* graceful restart information */
10711563
DA
14072 json_object *json_grace = NULL;
14073 json_object *json_grace_send = NULL;
14074 json_object *json_grace_recv = NULL;
14075 int eor_send_af_count = 0;
14076 int eor_receive_af_count = 0;
d62a17ae 14077
10711563
DA
14078 if (use_json) {
14079 json_grace = json_object_new_object();
14080 json_grace_send = json_object_new_object();
14081 json_grace_recv = json_object_new_object();
14082
14083 if ((peer_established(p)) &&
14084 CHECK_FLAG(p->cap, PEER_CAP_RESTART_RCV)) {
14085 FOREACH_AFI_SAFI (afi, safi) {
14086 if (CHECK_FLAG(p->af_sflags[afi][safi],
14087 PEER_STATUS_EOR_SEND)) {
14088 json_object_boolean_true_add(
14089 json_grace_send,
14090 get_afi_safi_str(afi, safi,
14091 true));
14092 eor_send_af_count++;
d62a17ae 14093 }
10711563
DA
14094 }
14095 FOREACH_AFI_SAFI (afi, safi) {
14096 if (CHECK_FLAG(p->af_sflags[afi][safi],
14097 PEER_STATUS_EOR_RECEIVED)) {
14098 json_object_boolean_true_add(
14099 json_grace_recv,
14100 get_afi_safi_str(afi, safi,
14101 true));
14102 eor_receive_af_count++;
d62a17ae 14103 }
14104 }
10711563
DA
14105 }
14106 json_object_object_add(json_grace, "endOfRibSend",
14107 json_grace_send);
14108 json_object_object_add(json_grace, "endOfRibRecv",
14109 json_grace_recv);
d62a17ae 14110
d62a17ae 14111
10711563
DA
14112 if (p->t_gr_restart)
14113 json_object_int_add(
14114 json_grace, "gracefulRestartTimerMsecs",
14115 thread_timer_remain_second(p->t_gr_restart) *
14116 1000);
2986cac2 14117
10711563
DA
14118 if (p->t_gr_stale)
14119 json_object_int_add(
14120 json_grace, "gracefulStalepathTimerMsecs",
14121 thread_timer_remain_second(p->t_gr_stale) *
14122 1000);
14123 /* more gr info in new format */
14124 BGP_SHOW_PEER_GR_CAPABILITY(vty, p, use_json, json_grace);
14125 json_object_object_add(json_neigh, "gracefulRestartInfo",
14126 json_grace);
14127 } else {
14128 vty_out(vty, " Graceful restart information:\n");
14129 if ((peer_established(p)) &&
14130 CHECK_FLAG(p->cap, PEER_CAP_RESTART_RCV)) {
14131
14132 vty_out(vty, " End-of-RIB send: ");
14133 FOREACH_AFI_SAFI (afi, safi) {
14134 if (CHECK_FLAG(p->af_sflags[afi][safi],
14135 PEER_STATUS_EOR_SEND)) {
14136 vty_out(vty, "%s%s",
14137 eor_send_af_count ? ", " : "",
14138 get_afi_safi_str(afi, safi,
14139 false));
14140 eor_send_af_count++;
d62a17ae 14141 }
10711563
DA
14142 }
14143 vty_out(vty, "\n");
14144 vty_out(vty, " End-of-RIB received: ");
14145 FOREACH_AFI_SAFI (afi, safi) {
14146 if (CHECK_FLAG(p->af_sflags[afi][safi],
14147 PEER_STATUS_EOR_RECEIVED)) {
14148 vty_out(vty, "%s%s",
14149 eor_receive_af_count ? ", "
14150 : "",
14151 get_afi_safi_str(afi, safi,
14152 false));
14153 eor_receive_af_count++;
d62a17ae 14154 }
d62a17ae 14155 }
10711563
DA
14156 vty_out(vty, "\n");
14157 }
d62a17ae 14158
10711563
DA
14159 if (p->t_gr_restart)
14160 vty_out(vty,
14161 " The remaining time of restart timer is %ld\n",
14162 thread_timer_remain_second(p->t_gr_restart));
d62a17ae 14163
10711563
DA
14164 if (p->t_gr_stale)
14165 vty_out(vty,
14166 " The remaining time of stalepath timer is %ld\n",
14167 thread_timer_remain_second(p->t_gr_stale));
2986cac2 14168
10711563
DA
14169 /* more gr info in new format */
14170 BGP_SHOW_PEER_GR_CAPABILITY(vty, p, use_json, NULL);
14171 }
2986cac2 14172
d62a17ae 14173 if (use_json) {
14174 json_object *json_stat = NULL;
14175 json_stat = json_object_new_object();
14176 /* Packet counts. */
43aa5965
QY
14177
14178 atomic_size_t outq_count, inq_count;
14179 outq_count = atomic_load_explicit(&p->obuf->count,
14180 memory_order_relaxed);
14181 inq_count = atomic_load_explicit(&p->ibuf->count,
14182 memory_order_relaxed);
14183
14184 json_object_int_add(json_stat, "depthInq",
14185 (unsigned long)inq_count);
d62a17ae 14186 json_object_int_add(json_stat, "depthOutq",
43aa5965 14187 (unsigned long)outq_count);
0112e9e0
QY
14188 json_object_int_add(json_stat, "opensSent",
14189 atomic_load_explicit(&p->open_out,
14190 memory_order_relaxed));
14191 json_object_int_add(json_stat, "opensRecv",
14192 atomic_load_explicit(&p->open_in,
14193 memory_order_relaxed));
d62a17ae 14194 json_object_int_add(json_stat, "notificationsSent",
0112e9e0
QY
14195 atomic_load_explicit(&p->notify_out,
14196 memory_order_relaxed));
d62a17ae 14197 json_object_int_add(json_stat, "notificationsRecv",
0112e9e0
QY
14198 atomic_load_explicit(&p->notify_in,
14199 memory_order_relaxed));
14200 json_object_int_add(json_stat, "updatesSent",
14201 atomic_load_explicit(&p->update_out,
14202 memory_order_relaxed));
14203 json_object_int_add(json_stat, "updatesRecv",
14204 atomic_load_explicit(&p->update_in,
14205 memory_order_relaxed));
d62a17ae 14206 json_object_int_add(json_stat, "keepalivesSent",
0112e9e0
QY
14207 atomic_load_explicit(&p->keepalive_out,
14208 memory_order_relaxed));
d62a17ae 14209 json_object_int_add(json_stat, "keepalivesRecv",
0112e9e0
QY
14210 atomic_load_explicit(&p->keepalive_in,
14211 memory_order_relaxed));
d62a17ae 14212 json_object_int_add(json_stat, "routeRefreshSent",
0112e9e0
QY
14213 atomic_load_explicit(&p->refresh_out,
14214 memory_order_relaxed));
d62a17ae 14215 json_object_int_add(json_stat, "routeRefreshRecv",
0112e9e0
QY
14216 atomic_load_explicit(&p->refresh_in,
14217 memory_order_relaxed));
d62a17ae 14218 json_object_int_add(json_stat, "capabilitySent",
0112e9e0
QY
14219 atomic_load_explicit(&p->dynamic_cap_out,
14220 memory_order_relaxed));
d62a17ae 14221 json_object_int_add(json_stat, "capabilityRecv",
0112e9e0
QY
14222 atomic_load_explicit(&p->dynamic_cap_in,
14223 memory_order_relaxed));
14224 json_object_int_add(json_stat, "totalSent", PEER_TOTAL_TX(p));
14225 json_object_int_add(json_stat, "totalRecv", PEER_TOTAL_RX(p));
d62a17ae 14226 json_object_object_add(json_neigh, "messageStats", json_stat);
14227 } else {
cb93e0a2
IS
14228 atomic_size_t outq_count, inq_count, open_out, open_in,
14229 notify_out, notify_in, update_out, update_in,
14230 keepalive_out, keepalive_in, refresh_out, refresh_in,
14231 dynamic_cap_out, dynamic_cap_in;
43aa5965
QY
14232 outq_count = atomic_load_explicit(&p->obuf->count,
14233 memory_order_relaxed);
14234 inq_count = atomic_load_explicit(&p->ibuf->count,
14235 memory_order_relaxed);
cb93e0a2
IS
14236 open_out = atomic_load_explicit(&p->open_out,
14237 memory_order_relaxed);
14238 open_in =
14239 atomic_load_explicit(&p->open_in, memory_order_relaxed);
14240 notify_out = atomic_load_explicit(&p->notify_out,
14241 memory_order_relaxed);
14242 notify_in = atomic_load_explicit(&p->notify_in,
14243 memory_order_relaxed);
14244 update_out = atomic_load_explicit(&p->update_out,
14245 memory_order_relaxed);
14246 update_in = atomic_load_explicit(&p->update_in,
14247 memory_order_relaxed);
14248 keepalive_out = atomic_load_explicit(&p->keepalive_out,
14249 memory_order_relaxed);
14250 keepalive_in = atomic_load_explicit(&p->keepalive_in,
14251 memory_order_relaxed);
14252 refresh_out = atomic_load_explicit(&p->refresh_out,
14253 memory_order_relaxed);
14254 refresh_in = atomic_load_explicit(&p->refresh_in,
14255 memory_order_relaxed);
14256 dynamic_cap_out = atomic_load_explicit(&p->dynamic_cap_out,
14257 memory_order_relaxed);
14258 dynamic_cap_in = atomic_load_explicit(&p->dynamic_cap_in,
14259 memory_order_relaxed);
43aa5965 14260
d62a17ae 14261 /* Packet counts. */
14262 vty_out(vty, " Message statistics:\n");
43aa5965
QY
14263 vty_out(vty, " Inq depth is %zu\n", inq_count);
14264 vty_out(vty, " Outq depth is %zu\n", outq_count);
d62a17ae 14265 vty_out(vty, " Sent Rcvd\n");
cb93e0a2
IS
14266 vty_out(vty, " Opens: %10zu %10zu\n", open_out,
14267 open_in);
14268 vty_out(vty, " Notifications: %10zu %10zu\n", notify_out,
14269 notify_in);
14270 vty_out(vty, " Updates: %10zu %10zu\n", update_out,
14271 update_in);
14272 vty_out(vty, " Keepalives: %10zu %10zu\n", keepalive_out,
14273 keepalive_in);
14274 vty_out(vty, " Route Refresh: %10zu %10zu\n", refresh_out,
14275 refresh_in);
14276 vty_out(vty, " Capability: %10zu %10zu\n",
14277 dynamic_cap_out, dynamic_cap_in);
14278 vty_out(vty, " Total: %10u %10u\n",
14279 (uint32_t)PEER_TOTAL_TX(p), (uint32_t)PEER_TOTAL_RX(p));
d62a17ae 14280 }
14281
14282 if (use_json) {
14283 /* advertisement-interval */
14284 json_object_int_add(json_neigh,
14285 "minBtwnAdvertisementRunsTimerMsecs",
14286 p->v_routeadv * 1000);
14287
14288 /* Update-source. */
14289 if (p->update_if || p->update_source) {
14290 if (p->update_if)
14291 json_object_string_add(json_neigh,
14292 "updateSource",
14293 p->update_if);
14294 else if (p->update_source)
47e12884
DA
14295 json_object_string_addf(json_neigh,
14296 "updateSource", "%pSU",
14297 p->update_source);
d62a17ae 14298 }
14299 } else {
14300 /* advertisement-interval */
14301 vty_out(vty,
14302 " Minimum time between advertisement runs is %d seconds\n",
14303 p->v_routeadv);
14304
14305 /* Update-source. */
14306 if (p->update_if || p->update_source) {
14307 vty_out(vty, " Update source is ");
14308 if (p->update_if)
14309 vty_out(vty, "%s", p->update_if);
14310 else if (p->update_source)
47e12884 14311 vty_out(vty, "%pSU", p->update_source);
d62a17ae 14312 vty_out(vty, "\n");
14313 }
14314
14315 vty_out(vty, "\n");
14316 }
14317
14318 /* Address Family Information */
14319 json_object *json_hold = NULL;
14320
14321 if (use_json)
14322 json_hold = json_object_new_object();
14323
05c7a1cc
QY
14324 FOREACH_AFI_SAFI (afi, safi)
14325 if (p->afc[afi][safi])
14326 bgp_show_peer_afi(vty, p, afi, safi, use_json,
14327 json_hold);
d62a17ae 14328
14329 if (use_json) {
14330 json_object_object_add(json_neigh, "addressFamilyInfo",
14331 json_hold);
14332 json_object_int_add(json_neigh, "connectionsEstablished",
14333 p->established);
14334 json_object_int_add(json_neigh, "connectionsDropped",
14335 p->dropped);
14336 } else
14337 vty_out(vty, " Connections established %d; dropped %d\n",
14338 p->established, p->dropped);
14339
14340 if (!p->last_reset) {
14341 if (use_json)
14342 json_object_string_add(json_neigh, "lastReset",
14343 "never");
14344 else
14345 vty_out(vty, " Last reset never\n");
14346 } else {
14347 if (use_json) {
14348 time_t uptime;
a2700b50 14349 struct tm tm;
d62a17ae 14350
083ec940 14351 uptime = monotime(NULL);
d62a17ae 14352 uptime -= p->resettime;
a2700b50
MS
14353 gmtime_r(&uptime, &tm);
14354
d62a17ae 14355 json_object_int_add(json_neigh, "lastResetTimerMsecs",
a2700b50
MS
14356 (tm.tm_sec * 1000)
14357 + (tm.tm_min * 60000)
14358 + (tm.tm_hour * 3600000));
3577f1c5 14359 bgp_show_peer_reset(NULL, p, json_neigh, true);
d62a17ae 14360 } else {
14361 vty_out(vty, " Last reset %s, ",
14362 peer_uptime(p->resettime, timebuf,
14363 BGP_UPTIME_LEN, 0, NULL));
14364
3577f1c5 14365 bgp_show_peer_reset(vty, p, NULL, false);
d62a17ae 14366 if (p->last_reset_cause_size) {
14367 msg = p->last_reset_cause;
14368 vty_out(vty,
14369 " Message received that caused BGP to send a NOTIFICATION:\n ");
14370 for (i = 1; i <= p->last_reset_cause_size;
14371 i++) {
14372 vty_out(vty, "%02X", *msg++);
14373
14374 if (i != p->last_reset_cause_size) {
14375 if (i % 16 == 0) {
14376 vty_out(vty, "\n ");
14377 } else if (i % 4 == 0) {
14378 vty_out(vty, " ");
14379 }
14380 }
14381 }
14382 vty_out(vty, "\n");
14383 }
14384 }
14385 }
14386
14387 if (CHECK_FLAG(p->sflags, PEER_STATUS_PREFIX_OVERFLOW)) {
14388 if (use_json)
14389 json_object_boolean_true_add(json_neigh,
14390 "prefixesConfigExceedMax");
14391 else
14392 vty_out(vty,
14393 " Peer had exceeded the max. no. of prefixes configured.\n");
14394
14395 if (p->t_pmax_restart) {
14396 if (use_json) {
14397 json_object_boolean_true_add(
14398 json_neigh, "reducePrefixNumFrom");
14399 json_object_int_add(json_neigh,
14400 "restartInTimerMsec",
14401 thread_timer_remain_second(
14402 p->t_pmax_restart)
14403 * 1000);
14404 } else
14405 vty_out(vty,
14406 " Reduce the no. of prefix from %s, will restart in %ld seconds\n",
996c9314
LB
14407 p->host, thread_timer_remain_second(
14408 p->t_pmax_restart));
d62a17ae 14409 } else {
14410 if (use_json)
14411 json_object_boolean_true_add(
14412 json_neigh,
14413 "reducePrefixNumAndClearIpBgp");
14414 else
14415 vty_out(vty,
14416 " Reduce the no. of prefix and clear ip bgp %s to restore peering\n",
14417 p->host);
14418 }
14419 }
14420
14421 /* EBGP Multihop and GTSM */
14422 if (p->sort != BGP_PEER_IBGP) {
14423 if (use_json) {
e2521429 14424 if (p->gtsm_hops > BGP_GTSM_HOPS_DISABLED)
d62a17ae 14425 json_object_int_add(json_neigh,
14426 "externalBgpNbrMaxHopsAway",
14427 p->gtsm_hops);
be8d1733 14428 else
d62a17ae 14429 json_object_int_add(json_neigh,
14430 "externalBgpNbrMaxHopsAway",
14431 p->ttl);
14432 } else {
e2521429 14433 if (p->gtsm_hops > BGP_GTSM_HOPS_DISABLED)
d62a17ae 14434 vty_out(vty,
14435 " External BGP neighbor may be up to %d hops away.\n",
14436 p->gtsm_hops);
be8d1733 14437 else
d62a17ae 14438 vty_out(vty,
14439 " External BGP neighbor may be up to %d hops away.\n",
14440 p->ttl);
14441 }
14442 } else {
be8d1733
DA
14443 if (use_json) {
14444 if (p->gtsm_hops > BGP_GTSM_HOPS_DISABLED)
d62a17ae 14445 json_object_int_add(json_neigh,
14446 "internalBgpNbrMaxHopsAway",
14447 p->gtsm_hops);
14448 else
be8d1733
DA
14449 json_object_int_add(json_neigh,
14450 "internalBgpNbrMaxHopsAway",
14451 p->ttl);
14452 } else {
14453 if (p->gtsm_hops > BGP_GTSM_HOPS_DISABLED)
d62a17ae 14454 vty_out(vty,
14455 " Internal BGP neighbor may be up to %d hops away.\n",
14456 p->gtsm_hops);
be8d1733
DA
14457 else
14458 vty_out(vty,
14459 " Internal BGP neighbor may be up to %d hops away.\n",
14460 p->ttl);
d62a17ae 14461 }
14462 }
14463
14464 /* Local address. */
14465 if (p->su_local) {
14466 if (use_json) {
47e12884
DA
14467 json_object_string_addf(json_neigh, "hostLocal", "%pSU",
14468 p->su_local);
d62a17ae 14469 json_object_int_add(json_neigh, "portLocal",
14470 ntohs(p->su_local->sin.sin_port));
14471 } else
47e12884
DA
14472 vty_out(vty, "Local host: %pSU, Local port: %d\n",
14473 p->su_local, ntohs(p->su_local->sin.sin_port));
1e592331
DS
14474 } else {
14475 if (use_json) {
14476 json_object_string_add(json_neigh, "hostLocal",
14477 "Unknown");
14478 json_object_int_add(json_neigh, "portLocal", -1);
14479 }
d62a17ae 14480 }
14481
14482 /* Remote address. */
14483 if (p->su_remote) {
14484 if (use_json) {
47e12884
DA
14485 json_object_string_addf(json_neigh, "hostForeign",
14486 "%pSU", p->su_remote);
d62a17ae 14487 json_object_int_add(json_neigh, "portForeign",
14488 ntohs(p->su_remote->sin.sin_port));
14489 } else
47e12884
DA
14490 vty_out(vty, "Foreign host: %pSU, Foreign port: %d\n",
14491 p->su_remote,
d62a17ae 14492 ntohs(p->su_remote->sin.sin_port));
1e592331
DS
14493 } else {
14494 if (use_json) {
14495 json_object_string_add(json_neigh, "hostForeign",
14496 "Unknown");
14497 json_object_int_add(json_neigh, "portForeign", -1);
14498 }
d62a17ae 14499 }
14500
14501 /* Nexthop display. */
14502 if (p->su_local) {
14503 if (use_json) {
c949c771
DA
14504 json_object_string_addf(json_neigh, "nexthop", "%pI4",
14505 &p->nexthop.v4);
14506 json_object_string_addf(json_neigh, "nexthopGlobal",
14507 "%pI6", &p->nexthop.v6_global);
14508 json_object_string_addf(json_neigh, "nexthopLocal",
14509 "%pI6", &p->nexthop.v6_local);
d62a17ae 14510 if (p->shared_network)
14511 json_object_string_add(json_neigh,
14512 "bgpConnection",
14513 "sharedNetwork");
14514 else
14515 json_object_string_add(json_neigh,
14516 "bgpConnection",
14517 "nonSharedNetwork");
14518 } else {
14519 vty_out(vty, "Nexthop: %s\n",
14520 inet_ntop(AF_INET, &p->nexthop.v4, buf1,
14521 sizeof(buf1)));
14522 vty_out(vty, "Nexthop global: %s\n",
14523 inet_ntop(AF_INET6, &p->nexthop.v6_global, buf1,
14524 sizeof(buf1)));
14525 vty_out(vty, "Nexthop local: %s\n",
14526 inet_ntop(AF_INET6, &p->nexthop.v6_local, buf1,
14527 sizeof(buf1)));
14528 vty_out(vty, "BGP connection: %s\n",
14529 p->shared_network ? "shared network"
14530 : "non shared network");
14531 }
14532 }
14533
14534 /* Timer information. */
14535 if (use_json) {
14536 json_object_int_add(json_neigh, "connectRetryTimer",
14537 p->v_connect);
feb17238 14538 if (peer_established(p) && p->rtt)
d62a17ae 14539 json_object_int_add(json_neigh, "estimatedRttInMsecs",
14540 p->rtt);
14541 if (p->t_start)
14542 json_object_int_add(
14543 json_neigh, "nextStartTimerDueInMsecs",
14544 thread_timer_remain_second(p->t_start) * 1000);
14545 if (p->t_connect)
14546 json_object_int_add(
14547 json_neigh, "nextConnectTimerDueInMsecs",
14548 thread_timer_remain_second(p->t_connect)
14549 * 1000);
14550 if (p->t_routeadv) {
14551 json_object_int_add(json_neigh, "mraiInterval",
14552 p->v_routeadv);
14553 json_object_int_add(
14554 json_neigh, "mraiTimerExpireInMsecs",
14555 thread_timer_remain_second(p->t_routeadv)
14556 * 1000);
14557 }
14558 if (p->password)
14559 json_object_int_add(json_neigh, "authenticationEnabled",
14560 1);
14561
14562 if (p->t_read)
14563 json_object_string_add(json_neigh, "readThread", "on");
14564 else
14565 json_object_string_add(json_neigh, "readThread", "off");
49507a6f
QY
14566
14567 if (CHECK_FLAG(p->thread_flags, PEER_THREAD_WRITES_ON))
d62a17ae 14568 json_object_string_add(json_neigh, "writeThread", "on");
14569 else
14570 json_object_string_add(json_neigh, "writeThread",
14571 "off");
14572 } else {
14573 vty_out(vty, "BGP Connect Retry Timer in Seconds: %d\n",
14574 p->v_connect);
feb17238 14575 if (peer_established(p) && p->rtt)
d62a17ae 14576 vty_out(vty, "Estimated round trip time: %d ms\n",
14577 p->rtt);
14578 if (p->t_start)
14579 vty_out(vty, "Next start timer due in %ld seconds\n",
14580 thread_timer_remain_second(p->t_start));
14581 if (p->t_connect)
14582 vty_out(vty, "Next connect timer due in %ld seconds\n",
14583 thread_timer_remain_second(p->t_connect));
14584 if (p->t_routeadv)
14585 vty_out(vty,
14586 "MRAI (interval %u) timer expires in %ld seconds\n",
14587 p->v_routeadv,
14588 thread_timer_remain_second(p->t_routeadv));
14589 if (p->password)
14590 vty_out(vty, "Peer Authentication Enabled\n");
14591
cac9e917 14592 vty_out(vty, "Read thread: %s Write thread: %s FD used: %d\n",
49507a6f
QY
14593 p->t_read ? "on" : "off",
14594 CHECK_FLAG(p->thread_flags, PEER_THREAD_WRITES_ON)
14595 ? "on"
cac9e917 14596 : "off", p->fd);
d62a17ae 14597 }
14598
14599 if (p->notify.code == BGP_NOTIFY_OPEN_ERR
14600 && p->notify.subcode == BGP_NOTIFY_OPEN_UNSUP_CAPBL)
14601 bgp_capability_vty_out(vty, p, use_json, json_neigh);
14602
14603 if (!use_json)
14604 vty_out(vty, "\n");
14605
14606 /* BFD information. */
21bfce98
RZ
14607 if (p->bfd_config)
14608 bgp_bfd_show_info(vty, p, json_neigh);
d62a17ae 14609
14610 if (use_json) {
14611 if (p->conf_if) /* Configured interface name. */
14612 json_object_object_add(json, p->conf_if, json_neigh);
14613 else /* Configured IP address. */
14614 json_object_object_add(json, p->host, json_neigh);
14615 }
14616}
14617
36235319
QY
14618static int bgp_show_neighbor_graceful_restart(struct vty *vty, struct bgp *bgp,
14619 enum show_type type,
14620 union sockunion *su,
14621 const char *conf_if, afi_t afi,
74a630b6 14622 bool use_json)
2986cac2 14623{
14624 struct listnode *node, *nnode;
14625 struct peer *peer;
14626 int find = 0;
14627 safi_t safi = SAFI_UNICAST;
74a630b6 14628 json_object *json = NULL;
2986cac2 14629 json_object *json_neighbor = NULL;
14630
74a630b6
NT
14631 if (use_json) {
14632 json = json_object_new_object();
14633 json_neighbor = json_object_new_object();
14634 }
14635
2986cac2 14636 for (ALL_LIST_ELEMENTS(bgp->peer, node, nnode, peer)) {
14637
14638 if (!CHECK_FLAG(peer->flags, PEER_FLAG_CONFIG_NODE))
14639 continue;
14640
14641 if ((peer->afc[afi][safi]) == 0)
14642 continue;
14643
2ba1fe69 14644 if (type == show_all) {
2986cac2 14645 bgp_show_peer_gr_status(vty, peer, use_json,
13909c4f 14646 json_neighbor);
2986cac2 14647
74a630b6 14648 if (use_json) {
13909c4f
DS
14649 json_object_object_add(json, peer->host,
14650 json_neighbor);
74a630b6
NT
14651 json_neighbor = NULL;
14652 }
2986cac2 14653
2ba1fe69 14654 } else if (type == show_peer) {
2986cac2 14655 if (conf_if) {
14656 if ((peer->conf_if
13909c4f
DS
14657 && !strcmp(peer->conf_if, conf_if))
14658 || (peer->hostname
2986cac2 14659 && !strcmp(peer->hostname, conf_if))) {
14660 find = 1;
13909c4f
DS
14661 bgp_show_peer_gr_status(vty, peer,
14662 use_json,
14663 json_neighbor);
2986cac2 14664 }
14665 } else {
14666 if (sockunion_same(&peer->su, su)) {
14667 find = 1;
13909c4f
DS
14668 bgp_show_peer_gr_status(vty, peer,
14669 use_json,
14670 json_neighbor);
2986cac2 14671 }
14672 }
13909c4f
DS
14673 if (use_json && find)
14674 json_object_object_add(json, peer->host,
14675 json_neighbor);
2986cac2 14676 }
14677
74a630b6
NT
14678 if (find) {
14679 json_neighbor = NULL;
2986cac2 14680 break;
74a630b6 14681 }
2986cac2 14682 }
14683
14684 if (type == show_peer && !find) {
14685 if (use_json)
13909c4f 14686 json_object_boolean_true_add(json, "bgpNoSuchNeighbor");
2986cac2 14687 else
14688 vty_out(vty, "%% No such neighbor\n");
14689 }
14690 if (use_json) {
74a630b6
NT
14691 if (json_neighbor)
14692 json_object_free(json_neighbor);
75eeda93 14693 vty_json(vty, json);
2986cac2 14694 } else {
14695 vty_out(vty, "\n");
14696 }
14697
14698 return CMD_SUCCESS;
14699}
14700
d62a17ae 14701static int bgp_show_neighbor(struct vty *vty, struct bgp *bgp,
14702 enum show_type type, union sockunion *su,
9f049418 14703 const char *conf_if, bool use_json,
d62a17ae 14704 json_object *json)
14705{
14706 struct listnode *node, *nnode;
14707 struct peer *peer;
14708 int find = 0;
9f049418 14709 bool nbr_output = false;
d1927ebe
AS
14710 afi_t afi = AFI_MAX;
14711 safi_t safi = SAFI_MAX;
14712
14713 if (type == show_ipv4_peer || type == show_ipv4_all) {
14714 afi = AFI_IP;
14715 } else if (type == show_ipv6_peer || type == show_ipv6_all) {
14716 afi = AFI_IP6;
14717 }
d62a17ae 14718
14719 for (ALL_LIST_ELEMENTS(bgp->peer, node, nnode, peer)) {
14720 if (!CHECK_FLAG(peer->flags, PEER_FLAG_CONFIG_NODE))
14721 continue;
14722
14723 switch (type) {
14724 case show_all:
14725 bgp_show_peer(vty, peer, use_json, json);
9f049418 14726 nbr_output = true;
d62a17ae 14727 break;
14728 case show_peer:
14729 if (conf_if) {
14730 if ((peer->conf_if
14731 && !strcmp(peer->conf_if, conf_if))
14732 || (peer->hostname
14733 && !strcmp(peer->hostname, conf_if))) {
14734 find = 1;
14735 bgp_show_peer(vty, peer, use_json,
14736 json);
14737 }
14738 } else {
14739 if (sockunion_same(&peer->su, su)) {
14740 find = 1;
14741 bgp_show_peer(vty, peer, use_json,
14742 json);
14743 }
14744 }
14745 break;
d1927ebe
AS
14746 case show_ipv4_peer:
14747 case show_ipv6_peer:
14748 FOREACH_SAFI (safi) {
14749 if (peer->afc[afi][safi]) {
14750 if (conf_if) {
14751 if ((peer->conf_if
14752 && !strcmp(peer->conf_if, conf_if))
14753 || (peer->hostname
14754 && !strcmp(peer->hostname, conf_if))) {
14755 find = 1;
14756 bgp_show_peer(vty, peer, use_json,
14757 json);
14758 break;
14759 }
14760 } else {
14761 if (sockunion_same(&peer->su, su)) {
14762 find = 1;
14763 bgp_show_peer(vty, peer, use_json,
14764 json);
14765 break;
14766 }
14767 }
14768 }
14769 }
14770 break;
14771 case show_ipv4_all:
14772 case show_ipv6_all:
14773 FOREACH_SAFI (safi) {
14774 if (peer->afc[afi][safi]) {
14775 bgp_show_peer(vty, peer, use_json, json);
14776 nbr_output = true;
14777 break;
14778 }
14779 }
14780 break;
d62a17ae 14781 }
14782 }
14783
d1927ebe
AS
14784 if ((type == show_peer || type == show_ipv4_peer ||
14785 type == show_ipv6_peer) && !find) {
d62a17ae 14786 if (use_json)
14787 json_object_boolean_true_add(json, "bgpNoSuchNeighbor");
14788 else
88b7d255 14789 vty_out(vty, "%% No such neighbor in this view/vrf\n");
d62a17ae 14790 }
14791
d1927ebe
AS
14792 if (type != show_peer && type != show_ipv4_peer &&
14793 type != show_ipv6_peer && !nbr_output && !use_json)
94d4c685 14794 vty_out(vty, "%% No BGP neighbors found\n");
9f049418 14795
d62a17ae 14796 if (use_json) {
996c9314
LB
14797 vty_out(vty, "%s\n", json_object_to_json_string_ext(
14798 json, JSON_C_TO_STRING_PRETTY));
d62a17ae 14799 } else {
14800 vty_out(vty, "\n");
14801 }
14802
14803 return CMD_SUCCESS;
14804}
14805
36235319
QY
14806static void bgp_show_neighbor_graceful_restart_vty(struct vty *vty,
14807 enum show_type type,
14808 const char *ip_str,
14809 afi_t afi, bool use_json)
2986cac2 14810{
14811
14812 int ret;
14813 struct bgp *bgp;
14814 union sockunion su;
2986cac2 14815
14816 bgp = bgp_get_default();
14817
13909c4f
DS
14818 if (!bgp)
14819 return;
2986cac2 14820
13909c4f
DS
14821 if (!use_json)
14822 bgp_show_global_graceful_restart_mode_vty(vty, bgp, use_json,
14823 NULL);
2986cac2 14824
13909c4f
DS
14825 if (ip_str) {
14826 ret = str2sockunion(ip_str, &su);
14827 if (ret < 0)
13909c4f 14828 bgp_show_neighbor_graceful_restart(
74a630b6
NT
14829 vty, bgp, type, NULL, ip_str, afi, use_json);
14830 else
14831 bgp_show_neighbor_graceful_restart(vty, bgp, type, &su,
14832 NULL, afi, use_json);
13909c4f
DS
14833 } else
14834 bgp_show_neighbor_graceful_restart(vty, bgp, type, NULL, NULL,
74a630b6 14835 afi, use_json);
2986cac2 14836}
14837
d62a17ae 14838static void bgp_show_all_instances_neighbors_vty(struct vty *vty,
71aedaa3
DS
14839 enum show_type type,
14840 const char *ip_str,
9f049418 14841 bool use_json)
d62a17ae 14842{
0291c246
MK
14843 struct listnode *node, *nnode;
14844 struct bgp *bgp;
71aedaa3 14845 union sockunion su;
0291c246 14846 json_object *json = NULL;
71aedaa3 14847 int ret, is_first = 1;
9f049418 14848 bool nbr_output = false;
d62a17ae 14849
14850 if (use_json)
14851 vty_out(vty, "{\n");
14852
14853 for (ALL_LIST_ELEMENTS(bm->bgp, node, nnode, bgp)) {
9f049418 14854 nbr_output = true;
d62a17ae 14855 if (use_json) {
14856 if (!(json = json_object_new_object())) {
af4c2728 14857 flog_err(
e50f7cfd 14858 EC_BGP_JSON_MEM_ERROR,
d62a17ae 14859 "Unable to allocate memory for JSON object");
14860 vty_out(vty,
14861 "{\"error\": {\"message:\": \"Unable to allocate memory for JSON object\"}}}\n");
14862 return;
14863 }
14864
14865 json_object_int_add(json, "vrfId",
14866 (bgp->vrf_id == VRF_UNKNOWN)
a4d82a8a
PZ
14867 ? -1
14868 : (int64_t)bgp->vrf_id);
d62a17ae 14869 json_object_string_add(
14870 json, "vrfName",
14871 (bgp->inst_type == BGP_INSTANCE_TYPE_DEFAULT)
5742e42b 14872 ? VRF_DEFAULT_NAME
d62a17ae 14873 : bgp->name);
14874
14875 if (!is_first)
14876 vty_out(vty, ",\n");
14877 else
14878 is_first = 0;
14879
14880 vty_out(vty, "\"%s\":",
14881 (bgp->inst_type == BGP_INSTANCE_TYPE_DEFAULT)
5742e42b 14882 ? VRF_DEFAULT_NAME
d62a17ae 14883 : bgp->name);
14884 } else {
14885 vty_out(vty, "\nInstance %s:\n",
14886 (bgp->inst_type == BGP_INSTANCE_TYPE_DEFAULT)
5742e42b 14887 ? VRF_DEFAULT_NAME
d62a17ae 14888 : bgp->name);
14889 }
71aedaa3 14890
d1927ebe
AS
14891 if (type == show_peer || type == show_ipv4_peer ||
14892 type == show_ipv6_peer) {
71aedaa3
DS
14893 ret = str2sockunion(ip_str, &su);
14894 if (ret < 0)
14895 bgp_show_neighbor(vty, bgp, type, NULL, ip_str,
14896 use_json, json);
14897 else
14898 bgp_show_neighbor(vty, bgp, type, &su, NULL,
14899 use_json, json);
14900 } else {
d1927ebe 14901 bgp_show_neighbor(vty, bgp, type, NULL, NULL,
71aedaa3
DS
14902 use_json, json);
14903 }
b77004d6 14904 json_object_free(json);
121067e9 14905 json = NULL;
d62a17ae 14906 }
14907
3e78a6ce 14908 if (use_json)
d62a17ae 14909 vty_out(vty, "}\n");
9f049418
DS
14910 else if (!nbr_output)
14911 vty_out(vty, "%% BGP instance not found\n");
d62a17ae 14912}
14913
14914static int bgp_show_neighbor_vty(struct vty *vty, const char *name,
14915 enum show_type type, const char *ip_str,
9f049418 14916 bool use_json)
d62a17ae 14917{
14918 int ret;
14919 struct bgp *bgp;
14920 union sockunion su;
14921 json_object *json = NULL;
14922
14923 if (name) {
14924 if (strmatch(name, "all")) {
71aedaa3
DS
14925 bgp_show_all_instances_neighbors_vty(vty, type, ip_str,
14926 use_json);
d62a17ae 14927 return CMD_SUCCESS;
14928 } else {
14929 bgp = bgp_lookup_by_name(name);
14930 if (!bgp) {
14931 if (use_json) {
14932 json = json_object_new_object();
75eeda93 14933 vty_json(vty, json);
d62a17ae 14934 } else
14935 vty_out(vty,
9f049418 14936 "%% BGP instance not found\n");
d62a17ae 14937
14938 return CMD_WARNING;
14939 }
14940 }
14941 } else {
14942 bgp = bgp_get_default();
14943 }
14944
14945 if (bgp) {
14946 json = json_object_new_object();
14947 if (ip_str) {
14948 ret = str2sockunion(ip_str, &su);
14949 if (ret < 0)
14950 bgp_show_neighbor(vty, bgp, type, NULL, ip_str,
14951 use_json, json);
14952 else
14953 bgp_show_neighbor(vty, bgp, type, &su, NULL,
14954 use_json, json);
14955 } else {
14956 bgp_show_neighbor(vty, bgp, type, NULL, NULL, use_json,
14957 json);
14958 }
14959 json_object_free(json);
ca61fd25
DS
14960 } else {
14961 if (use_json)
14962 vty_out(vty, "{}\n");
14963 else
14964 vty_out(vty, "%% BGP instance not found\n");
d62a17ae 14965 }
14966
14967 return CMD_SUCCESS;
4fb25c53
DW
14968}
14969
2986cac2 14970
14971
14972/* "show [ip] bgp neighbors graceful-restart" commands. */
dcab9012 14973DEFUN (show_ip_bgp_neighbors_graceful_restart,
2986cac2 14974 show_ip_bgp_neighbors_graceful_restart_cmd,
14975 "show bgp [<ipv4|ipv6>] neighbors [<A.B.C.D|X:X::X:X|WORD>] graceful-restart [json]",
14976 SHOW_STR
14977 BGP_STR
14978 IP_STR
14979 IPV6_STR
14980 NEIGHBOR_STR
14981 "Neighbor to display information about\n"
14982 "Neighbor to display information about\n"
14983 "Neighbor on BGP configured interface\n"
14984 GR_SHOW
14985 JSON_STR)
14986{
14987 char *sh_arg = NULL;
14988 enum show_type sh_type;
14989 int idx = 0;
14990 afi_t afi = AFI_MAX;
2986cac2 14991 bool uj = use_json(argc, argv);
14992
36235319 14993 if (!argv_find_and_parse_afi(argv, argc, &idx, &afi))
2986cac2 14994 afi = AFI_MAX;
14995
14996 idx++;
14997
14998 if (argv_find(argv, argc, "A.B.C.D", &idx)
14999 || argv_find(argv, argc, "X:X::X:X", &idx)
15000 || argv_find(argv, argc, "WORD", &idx)) {
15001 sh_type = show_peer;
15002 sh_arg = argv[idx]->arg;
15003 } else
15004 sh_type = show_all;
15005
15006 if (!argv_find(argv, argc, "graceful-restart", &idx))
15007 return CMD_SUCCESS;
15008
15009
36235319
QY
15010 return bgp_show_neighbor_graceful_restart_afi_all(vty, sh_type, sh_arg,
15011 afi, uj);
2986cac2 15012}
15013
716b2d8a 15014/* "show [ip] bgp neighbors" commands. */
718e3744 15015DEFUN (show_ip_bgp_neighbors,
15016 show_ip_bgp_neighbors_cmd,
24345e82 15017 "show [ip] bgp [<view|vrf> VIEWVRFNAME] [<ipv4|ipv6>] neighbors [<A.B.C.D|X:X::X:X|WORD>] [json]",
718e3744 15018 SHOW_STR
15019 IP_STR
15020 BGP_STR
f2a8972b 15021 BGP_INSTANCE_HELP_STR
00e6edb9
DA
15022 BGP_AF_STR
15023 BGP_AF_STR
718e3744 15024 "Detailed information on TCP and BGP neighbor connections\n"
15025 "Neighbor to display information about\n"
a80beece 15026 "Neighbor to display information about\n"
91d37724 15027 "Neighbor on BGP configured interface\n"
9973d184 15028 JSON_STR)
718e3744 15029{
d62a17ae 15030 char *vrf = NULL;
15031 char *sh_arg = NULL;
15032 enum show_type sh_type;
d1927ebe 15033 afi_t afi = AFI_MAX;
718e3744 15034
9f049418 15035 bool uj = use_json(argc, argv);
718e3744 15036
d62a17ae 15037 int idx = 0;
718e3744 15038
9a8bdf1c
PG
15039 /* [<vrf> VIEWVRFNAME] */
15040 if (argv_find(argv, argc, "vrf", &idx)) {
15041 vrf = argv[idx + 1]->arg;
15042 if (vrf && strmatch(vrf, VRF_DEFAULT_NAME))
15043 vrf = NULL;
15044 } else if (argv_find(argv, argc, "view", &idx))
15045 /* [<view> VIEWVRFNAME] */
d62a17ae 15046 vrf = argv[idx + 1]->arg;
718e3744 15047
d62a17ae 15048 idx++;
d1927ebe
AS
15049
15050 if (argv_find(argv, argc, "ipv4", &idx)) {
15051 sh_type = show_ipv4_all;
15052 afi = AFI_IP;
15053 } else if (argv_find(argv, argc, "ipv6", &idx)) {
15054 sh_type = show_ipv6_all;
15055 afi = AFI_IP6;
15056 } else {
15057 sh_type = show_all;
15058 }
15059
d62a17ae 15060 if (argv_find(argv, argc, "A.B.C.D", &idx)
15061 || argv_find(argv, argc, "X:X::X:X", &idx)
15062 || argv_find(argv, argc, "WORD", &idx)) {
15063 sh_type = show_peer;
15064 sh_arg = argv[idx]->arg;
d1927ebe
AS
15065 }
15066
15067 if (sh_type == show_peer && afi == AFI_IP) {
15068 sh_type = show_ipv4_peer;
15069 } else if (sh_type == show_peer && afi == AFI_IP6) {
15070 sh_type = show_ipv6_peer;
15071 }
856ca177 15072
d62a17ae 15073 return bgp_show_neighbor_vty(vty, vrf, sh_type, sh_arg, uj);
718e3744 15074}
15075
716b2d8a 15076/* Show BGP's AS paths internal data. There are both `show [ip] bgp
718e3744 15077 paths' and `show ip mbgp paths'. Those functions results are the
15078 same.*/
f412b39a 15079DEFUN (show_ip_bgp_paths,
718e3744 15080 show_ip_bgp_paths_cmd,
46f296b4 15081 "show [ip] bgp ["BGP_SAFI_CMD_STR"] paths",
718e3744 15082 SHOW_STR
15083 IP_STR
15084 BGP_STR
46f296b4 15085 BGP_SAFI_HELP_STR
718e3744 15086 "Path information\n")
15087{
d62a17ae 15088 vty_out(vty, "Address Refcnt Path\n");
15089 aspath_print_all_vty(vty);
15090 return CMD_SUCCESS;
718e3744 15091}
15092
718e3744 15093#include "hash.h"
15094
e3b78da8 15095static void community_show_all_iterator(struct hash_bucket *bucket,
d62a17ae 15096 struct vty *vty)
718e3744 15097{
d62a17ae 15098 struct community *com;
718e3744 15099
e3b78da8 15100 com = (struct community *)bucket->data;
3f65c5b1 15101 vty_out(vty, "[%p] (%ld) %s\n", (void *)com, com->refcnt,
c0945b78 15102 community_str(com, false, false));
718e3744 15103}
15104
15105/* Show BGP's community internal data. */
f412b39a 15106DEFUN (show_ip_bgp_community_info,
718e3744 15107 show_ip_bgp_community_info_cmd,
bec37ba5 15108 "show [ip] bgp community-info",
718e3744 15109 SHOW_STR
15110 IP_STR
15111 BGP_STR
15112 "List all bgp community information\n")
15113{
d62a17ae 15114 vty_out(vty, "Address Refcnt Community\n");
718e3744 15115
d62a17ae 15116 hash_iterate(community_hash(),
e3b78da8 15117 (void (*)(struct hash_bucket *,
d62a17ae 15118 void *))community_show_all_iterator,
15119 vty);
718e3744 15120
d62a17ae 15121 return CMD_SUCCESS;
718e3744 15122}
15123
e3b78da8 15124static void lcommunity_show_all_iterator(struct hash_bucket *bucket,
d62a17ae 15125 struct vty *vty)
57d187bc 15126{
d62a17ae 15127 struct lcommunity *lcom;
57d187bc 15128
e3b78da8 15129 lcom = (struct lcommunity *)bucket->data;
3f65c5b1 15130 vty_out(vty, "[%p] (%ld) %s\n", (void *)lcom, lcom->refcnt,
c0945b78 15131 lcommunity_str(lcom, false, false));
57d187bc
JS
15132}
15133
15134/* Show BGP's community internal data. */
15135DEFUN (show_ip_bgp_lcommunity_info,
15136 show_ip_bgp_lcommunity_info_cmd,
15137 "show ip bgp large-community-info",
15138 SHOW_STR
15139 IP_STR
15140 BGP_STR
15141 "List all bgp large-community information\n")
15142{
d62a17ae 15143 vty_out(vty, "Address Refcnt Large-community\n");
57d187bc 15144
d62a17ae 15145 hash_iterate(lcommunity_hash(),
e3b78da8 15146 (void (*)(struct hash_bucket *,
d62a17ae 15147 void *))lcommunity_show_all_iterator,
15148 vty);
57d187bc 15149
d62a17ae 15150 return CMD_SUCCESS;
57d187bc 15151}
2986cac2 15152/* Graceful Restart */
15153
15154static void bgp_show_global_graceful_restart_mode_vty(struct vty *vty,
36235319
QY
15155 struct bgp *bgp,
15156 bool use_json,
15157 json_object *json)
2986cac2 15158{
57d187bc
JS
15159
15160
2986cac2 15161 vty_out(vty, "\n%s", SHOW_GR_HEADER);
15162
7318ae88 15163 enum global_mode bgp_global_gr_mode = bgp_global_gr_mode_get(bgp);
2986cac2 15164
15165 switch (bgp_global_gr_mode) {
15166
15167 case GLOBAL_HELPER:
13909c4f 15168 vty_out(vty, "Global BGP GR Mode : Helper\n");
2986cac2 15169 break;
15170
15171 case GLOBAL_GR:
13909c4f 15172 vty_out(vty, "Global BGP GR Mode : Restart\n");
2986cac2 15173 break;
15174
15175 case GLOBAL_DISABLE:
13909c4f 15176 vty_out(vty, "Global BGP GR Mode : Disable\n");
2986cac2 15177 break;
15178
15179 case GLOBAL_INVALID:
2986cac2 15180 vty_out(vty,
2ba1fe69 15181 "Global BGP GR Mode Invalid\n");
2986cac2 15182 break;
15183 }
15184 vty_out(vty, "\n");
15185}
15186
36235319
QY
15187static int bgp_show_neighbor_graceful_restart_afi_all(struct vty *vty,
15188 enum show_type type,
15189 const char *ip_str,
15190 afi_t afi, bool use_json)
2986cac2 15191{
15192 if ((afi == AFI_MAX) && (ip_str == NULL)) {
15193 afi = AFI_IP;
15194
15195 while ((afi != AFI_L2VPN) && (afi < AFI_MAX)) {
15196
36235319
QY
15197 bgp_show_neighbor_graceful_restart_vty(
15198 vty, type, ip_str, afi, use_json);
2986cac2 15199 afi++;
15200 }
15201 } else if (afi != AFI_MAX) {
36235319
QY
15202 bgp_show_neighbor_graceful_restart_vty(vty, type, ip_str, afi,
15203 use_json);
2986cac2 15204 } else {
15205 return CMD_ERR_INCOMPLETE;
15206 }
15207
15208 return CMD_SUCCESS;
15209}
15210/* Graceful Restart */
15211
f412b39a 15212DEFUN (show_ip_bgp_attr_info,
718e3744 15213 show_ip_bgp_attr_info_cmd,
bec37ba5 15214 "show [ip] bgp attribute-info",
718e3744 15215 SHOW_STR
15216 IP_STR
15217 BGP_STR
15218 "List all bgp attribute information\n")
15219{
d62a17ae 15220 attr_show_all(vty);
15221 return CMD_SUCCESS;
718e3744 15222}
6b0655a2 15223
03915806
CS
15224static int bgp_show_route_leak_vty(struct vty *vty, const char *name,
15225 afi_t afi, safi_t safi,
15226 bool use_json, json_object *json)
53089bec 15227{
15228 struct bgp *bgp;
15229 struct listnode *node;
15230 char *vname;
53089bec 15231 char *ecom_str;
9c2fd3fe 15232 enum vpn_policy_direction dir;
53089bec 15233
03915806 15234 if (json) {
b46dfd20
DS
15235 json_object *json_import_vrfs = NULL;
15236 json_object *json_export_vrfs = NULL;
15237
b46dfd20
DS
15238 bgp = name ? bgp_lookup_by_name(name) : bgp_get_default();
15239
53089bec 15240 if (!bgp) {
75eeda93 15241 vty_json(vty, json);
b46dfd20 15242
53089bec 15243 return CMD_WARNING;
15244 }
b46dfd20 15245
94d4c685
DS
15246 /* Provide context for the block */
15247 json_object_string_add(json, "vrf", name ? name : "default");
15248 json_object_string_add(json, "afiSafi",
5cb5f4d0 15249 get_afi_safi_str(afi, safi, true));
94d4c685 15250
b46dfd20
DS
15251 if (!CHECK_FLAG(bgp->af_flags[afi][safi],
15252 BGP_CONFIG_VRF_TO_VRF_IMPORT)) {
15253 json_object_string_add(json, "importFromVrfs", "none");
15254 json_object_string_add(json, "importRts", "none");
15255 } else {
6ce24e52
DS
15256 json_import_vrfs = json_object_new_array();
15257
b46dfd20
DS
15258 for (ALL_LIST_ELEMENTS_RO(
15259 bgp->vpn_policy[afi].import_vrf,
15260 node, vname))
15261 json_object_array_add(json_import_vrfs,
15262 json_object_new_string(vname));
15263
b20875ea
CS
15264 json_object_object_add(json, "importFromVrfs",
15265 json_import_vrfs);
b46dfd20 15266 dir = BGP_VPN_POLICY_DIR_FROMVPN;
b20875ea
CS
15267 if (bgp->vpn_policy[afi].rtlist[dir]) {
15268 ecom_str = ecommunity_ecom2str(
b46dfd20
DS
15269 bgp->vpn_policy[afi].rtlist[dir],
15270 ECOMMUNITY_FORMAT_ROUTE_MAP, 0);
b20875ea
CS
15271 json_object_string_add(json, "importRts",
15272 ecom_str);
15273 XFREE(MTYPE_ECOMMUNITY_STR, ecom_str);
15274 } else
15275 json_object_string_add(json, "importRts",
15276 "none");
b46dfd20
DS
15277 }
15278
15279 if (!CHECK_FLAG(bgp->af_flags[afi][safi],
15280 BGP_CONFIG_VRF_TO_VRF_EXPORT)) {
15281 json_object_string_add(json, "exportToVrfs", "none");
15282 json_object_string_add(json, "routeDistinguisher",
15283 "none");
15284 json_object_string_add(json, "exportRts", "none");
15285 } else {
6ce24e52
DS
15286 json_export_vrfs = json_object_new_array();
15287
b46dfd20
DS
15288 for (ALL_LIST_ELEMENTS_RO(
15289 bgp->vpn_policy[afi].export_vrf,
15290 node, vname))
15291 json_object_array_add(json_export_vrfs,
15292 json_object_new_string(vname));
15293 json_object_object_add(json, "exportToVrfs",
15294 json_export_vrfs);
c4f64ea9
DA
15295 json_object_string_addf(json, "routeDistinguisher",
15296 "%pRD",
15297 &bgp->vpn_policy[afi].tovpn_rd);
b46dfd20
DS
15298
15299 dir = BGP_VPN_POLICY_DIR_TOVPN;
b20875ea
CS
15300 if (bgp->vpn_policy[afi].rtlist[dir]) {
15301 ecom_str = ecommunity_ecom2str(
b46dfd20
DS
15302 bgp->vpn_policy[afi].rtlist[dir],
15303 ECOMMUNITY_FORMAT_ROUTE_MAP, 0);
b20875ea
CS
15304 json_object_string_add(json, "exportRts",
15305 ecom_str);
15306 XFREE(MTYPE_ECOMMUNITY_STR, ecom_str);
15307 } else
15308 json_object_string_add(json, "exportRts",
15309 "none");
b46dfd20
DS
15310 }
15311
03915806 15312 if (use_json) {
75eeda93 15313 vty_json(vty, json);
03915806 15314 }
53089bec 15315 } else {
b46dfd20
DS
15316 bgp = name ? bgp_lookup_by_name(name) : bgp_get_default();
15317
53089bec 15318 if (!bgp) {
b46dfd20 15319 vty_out(vty, "%% No such BGP instance exist\n");
53089bec 15320 return CMD_WARNING;
15321 }
53089bec 15322
b46dfd20
DS
15323 if (!CHECK_FLAG(bgp->af_flags[afi][safi],
15324 BGP_CONFIG_VRF_TO_VRF_IMPORT))
15325 vty_out(vty,
15326 "This VRF is not importing %s routes from any other VRF\n",
5cb5f4d0 15327 get_afi_safi_str(afi, safi, false));
b46dfd20
DS
15328 else {
15329 vty_out(vty,
15330 "This VRF is importing %s routes from the following VRFs:\n",
5cb5f4d0 15331 get_afi_safi_str(afi, safi, false));
b46dfd20
DS
15332
15333 for (ALL_LIST_ELEMENTS_RO(
15334 bgp->vpn_policy[afi].import_vrf,
15335 node, vname))
15336 vty_out(vty, " %s\n", vname);
15337
15338 dir = BGP_VPN_POLICY_DIR_FROMVPN;
b20875ea
CS
15339 ecom_str = NULL;
15340 if (bgp->vpn_policy[afi].rtlist[dir]) {
15341 ecom_str = ecommunity_ecom2str(
b46dfd20
DS
15342 bgp->vpn_policy[afi].rtlist[dir],
15343 ECOMMUNITY_FORMAT_ROUTE_MAP, 0);
b20875ea 15344 vty_out(vty, "Import RT(s): %s\n", ecom_str);
b46dfd20 15345
b20875ea
CS
15346 XFREE(MTYPE_ECOMMUNITY_STR, ecom_str);
15347 } else
15348 vty_out(vty, "Import RT(s):\n");
53089bec 15349 }
53089bec 15350
b46dfd20
DS
15351 if (!CHECK_FLAG(bgp->af_flags[afi][safi],
15352 BGP_CONFIG_VRF_TO_VRF_EXPORT))
15353 vty_out(vty,
15354 "This VRF is not exporting %s routes to any other VRF\n",
5cb5f4d0 15355 get_afi_safi_str(afi, safi, false));
b46dfd20
DS
15356 else {
15357 vty_out(vty,
04c9077f 15358 "This VRF is exporting %s routes to the following VRFs:\n",
5cb5f4d0 15359 get_afi_safi_str(afi, safi, false));
b46dfd20
DS
15360
15361 for (ALL_LIST_ELEMENTS_RO(
15362 bgp->vpn_policy[afi].export_vrf,
15363 node, vname))
15364 vty_out(vty, " %s\n", vname);
15365
c4f64ea9
DA
15366 vty_out(vty, "RD: %pRD\n",
15367 &bgp->vpn_policy[afi].tovpn_rd);
b46dfd20
DS
15368
15369 dir = BGP_VPN_POLICY_DIR_TOVPN;
b20875ea
CS
15370 if (bgp->vpn_policy[afi].rtlist[dir]) {
15371 ecom_str = ecommunity_ecom2str(
b46dfd20
DS
15372 bgp->vpn_policy[afi].rtlist[dir],
15373 ECOMMUNITY_FORMAT_ROUTE_MAP, 0);
b20875ea
CS
15374 vty_out(vty, "Export RT: %s\n", ecom_str);
15375 XFREE(MTYPE_ECOMMUNITY_STR, ecom_str);
15376 } else
15377 vty_out(vty, "Import RT(s):\n");
53089bec 15378 }
53089bec 15379 }
15380
15381 return CMD_SUCCESS;
15382}
15383
03915806
CS
15384static int bgp_show_all_instance_route_leak_vty(struct vty *vty, afi_t afi,
15385 safi_t safi, bool use_json)
15386{
15387 struct listnode *node, *nnode;
15388 struct bgp *bgp;
15389 char *vrf_name = NULL;
15390 json_object *json = NULL;
15391 json_object *json_vrf = NULL;
15392 json_object *json_vrfs = NULL;
15393
15394 if (use_json) {
15395 json = json_object_new_object();
15396 json_vrfs = json_object_new_object();
15397 }
15398
15399 for (ALL_LIST_ELEMENTS(bm->bgp, node, nnode, bgp)) {
15400
15401 if (bgp->inst_type != BGP_INSTANCE_TYPE_DEFAULT)
15402 vrf_name = bgp->name;
15403
15404 if (use_json) {
15405 json_vrf = json_object_new_object();
15406 } else {
15407 vty_out(vty, "\nInstance %s:\n",
15408 (bgp->inst_type == BGP_INSTANCE_TYPE_DEFAULT)
15409 ? VRF_DEFAULT_NAME : bgp->name);
15410 }
15411 bgp_show_route_leak_vty(vty, vrf_name, afi, safi, 0, json_vrf);
15412 if (use_json) {
15413 if (bgp->inst_type == BGP_INSTANCE_TYPE_DEFAULT)
15414 json_object_object_add(json_vrfs,
15415 VRF_DEFAULT_NAME, json_vrf);
15416 else
15417 json_object_object_add(json_vrfs, vrf_name,
15418 json_vrf);
15419 }
15420 }
15421
15422 if (use_json) {
15423 json_object_object_add(json, "vrfs", json_vrfs);
75eeda93 15424 vty_json(vty, json);
03915806
CS
15425 }
15426
15427 return CMD_SUCCESS;
15428}
15429
53089bec 15430/* "show [ip] bgp route-leak" command. */
15431DEFUN (show_ip_bgp_route_leak,
04c9077f
DS
15432 show_ip_bgp_route_leak_cmd,
15433 "show [ip] bgp [<view|vrf> VIEWVRFNAME] ["BGP_AFI_CMD_STR" ["BGP_SAFI_CMD_STR"]] route-leak [json]",
b46dfd20
DS
15434 SHOW_STR
15435 IP_STR
15436 BGP_STR
15437 BGP_INSTANCE_HELP_STR
15438 BGP_AFI_HELP_STR
15439 BGP_SAFI_HELP_STR
15440 "Route leaking information\n"
15441 JSON_STR)
53089bec 15442{
15443 char *vrf = NULL;
15444 afi_t afi = AFI_MAX;
15445 safi_t safi = SAFI_MAX;
15446
9f049418 15447 bool uj = use_json(argc, argv);
53089bec 15448 int idx = 0;
03915806 15449 json_object *json = NULL;
53089bec 15450
15451 /* show [ip] bgp */
15452 if (argv_find(argv, argc, "ip", &idx)) {
15453 afi = AFI_IP;
15454 safi = SAFI_UNICAST;
15455 }
15456 /* [vrf VIEWVRFNAME] */
15457 if (argv_find(argv, argc, "view", &idx)) {
020a3f60
DS
15458 vty_out(vty,
15459 "%% This command is not applicable to BGP views\n");
53089bec 15460 return CMD_WARNING;
15461 }
15462
9a8bdf1c
PG
15463 if (argv_find(argv, argc, "vrf", &idx)) {
15464 vrf = argv[idx + 1]->arg;
15465 if (vrf && strmatch(vrf, VRF_DEFAULT_NAME))
15466 vrf = NULL;
15467 }
53089bec 15468 /* ["BGP_AFI_CMD_STR" ["BGP_SAFI_CMD_STR"]] */
c48349e3 15469 if (argv_find_and_parse_afi(argv, argc, &idx, &afi))
53089bec 15470 argv_find_and_parse_safi(argv, argc, &idx, &safi);
53089bec 15471
15472 if (!((afi == AFI_IP || afi == AFI_IP6) && safi == SAFI_UNICAST)) {
020a3f60
DS
15473 vty_out(vty,
15474 "%% This command is applicable only for unicast ipv4|ipv6\n");
53089bec 15475 return CMD_WARNING;
15476 }
15477
03915806
CS
15478 if (vrf && strmatch(vrf, "all"))
15479 return bgp_show_all_instance_route_leak_vty(vty, afi, safi, uj);
15480
15481 if (uj)
15482 json = json_object_new_object();
15483
15484 return bgp_show_route_leak_vty(vty, vrf, afi, safi, uj, json);
53089bec 15485}
15486
d62a17ae 15487static void bgp_show_all_instances_updgrps_vty(struct vty *vty, afi_t afi,
15488 safi_t safi)
f186de26 15489{
d62a17ae 15490 struct listnode *node, *nnode;
15491 struct bgp *bgp;
f186de26 15492
d62a17ae 15493 for (ALL_LIST_ELEMENTS(bm->bgp, node, nnode, bgp)) {
15494 vty_out(vty, "\nInstance %s:\n",
15495 (bgp->inst_type == BGP_INSTANCE_TYPE_DEFAULT)
5742e42b 15496 ? VRF_DEFAULT_NAME
d62a17ae 15497 : bgp->name);
15498 update_group_show(bgp, afi, safi, vty, 0);
15499 }
f186de26 15500}
15501
d62a17ae 15502static int bgp_show_update_groups(struct vty *vty, const char *name, int afi,
15503 int safi, uint64_t subgrp_id)
4fb25c53 15504{
d62a17ae 15505 struct bgp *bgp;
4fb25c53 15506
d62a17ae 15507 if (name) {
15508 if (strmatch(name, "all")) {
15509 bgp_show_all_instances_updgrps_vty(vty, afi, safi);
15510 return CMD_SUCCESS;
15511 } else {
15512 bgp = bgp_lookup_by_name(name);
15513 }
15514 } else {
15515 bgp = bgp_get_default();
15516 }
4fb25c53 15517
d62a17ae 15518 if (bgp)
15519 update_group_show(bgp, afi, safi, vty, subgrp_id);
15520 return CMD_SUCCESS;
4fb25c53
DW
15521}
15522
8fe8a7f6
DS
15523DEFUN (show_ip_bgp_updgrps,
15524 show_ip_bgp_updgrps_cmd,
c1a44e43 15525 "show [ip] bgp [<view|vrf> VIEWVRFNAME] ["BGP_AFI_CMD_STR" ["BGP_SAFI_WITH_LABEL_CMD_STR"]] update-groups [SUBGROUP-ID]",
8386ac43 15526 SHOW_STR
15527 IP_STR
15528 BGP_STR
15529 BGP_INSTANCE_HELP_STR
c9e571b4 15530 BGP_AFI_HELP_STR
9bedbb1e 15531 BGP_SAFI_WITH_LABEL_HELP_STR
5bf15956
DW
15532 "Detailed info about dynamic update groups\n"
15533 "Specific subgroup to display detailed info for\n")
8386ac43 15534{
d62a17ae 15535 char *vrf = NULL;
15536 afi_t afi = AFI_IP6;
15537 safi_t safi = SAFI_UNICAST;
15538 uint64_t subgrp_id = 0;
15539
15540 int idx = 0;
15541
15542 /* show [ip] bgp */
15543 if (argv_find(argv, argc, "ip", &idx))
15544 afi = AFI_IP;
9a8bdf1c
PG
15545 /* [<vrf> VIEWVRFNAME] */
15546 if (argv_find(argv, argc, "vrf", &idx)) {
15547 vrf = argv[idx + 1]->arg;
15548 if (vrf && strmatch(vrf, VRF_DEFAULT_NAME))
15549 vrf = NULL;
15550 } else if (argv_find(argv, argc, "view", &idx))
15551 /* [<view> VIEWVRFNAME] */
15552 vrf = argv[idx + 1]->arg;
d62a17ae 15553 /* ["BGP_AFI_CMD_STR" ["BGP_SAFI_CMD_STR"]] */
15554 if (argv_find_and_parse_afi(argv, argc, &idx, &afi)) {
15555 argv_find_and_parse_safi(argv, argc, &idx, &safi);
15556 }
5bf15956 15557
d62a17ae 15558 /* get subgroup id, if provided */
15559 idx = argc - 1;
15560 if (argv[idx]->type == VARIABLE_TKN)
15561 subgrp_id = strtoull(argv[idx]->arg, NULL, 10);
5bf15956 15562
d62a17ae 15563 return (bgp_show_update_groups(vty, vrf, afi, safi, subgrp_id));
8fe8a7f6
DS
15564}
15565
f186de26 15566DEFUN (show_bgp_instance_all_ipv6_updgrps,
15567 show_bgp_instance_all_ipv6_updgrps_cmd,
716b2d8a 15568 "show [ip] bgp <view|vrf> all update-groups",
f186de26 15569 SHOW_STR
716b2d8a 15570 IP_STR
f186de26 15571 BGP_STR
15572 BGP_INSTANCE_ALL_HELP_STR
0c7b1b01 15573 "Detailed info about dynamic update groups\n")
f186de26 15574{
d62a17ae 15575 bgp_show_all_instances_updgrps_vty(vty, AFI_IP6, SAFI_UNICAST);
15576 return CMD_SUCCESS;
f186de26 15577}
15578
43d3f4fc
DS
15579DEFUN (show_bgp_l2vpn_evpn_updgrps,
15580 show_bgp_l2vpn_evpn_updgrps_cmd,
15581 "show [ip] bgp l2vpn evpn update-groups",
15582 SHOW_STR
15583 IP_STR
15584 BGP_STR
15585 "l2vpn address family\n"
15586 "evpn sub-address family\n"
15587 "Detailed info about dynamic update groups\n")
15588{
15589 char *vrf = NULL;
15590 uint64_t subgrp_id = 0;
15591
15592 bgp_show_update_groups(vty, vrf, AFI_L2VPN, SAFI_EVPN, subgrp_id);
15593 return CMD_SUCCESS;
15594}
15595
5bf15956
DW
15596DEFUN (show_bgp_updgrps_stats,
15597 show_bgp_updgrps_stats_cmd,
716b2d8a 15598 "show [ip] bgp update-groups statistics",
3f9c7369 15599 SHOW_STR
716b2d8a 15600 IP_STR
3f9c7369 15601 BGP_STR
0c7b1b01 15602 "Detailed info about dynamic update groups\n"
3f9c7369
DS
15603 "Statistics\n")
15604{
d62a17ae 15605 struct bgp *bgp;
3f9c7369 15606
d62a17ae 15607 bgp = bgp_get_default();
15608 if (bgp)
15609 update_group_show_stats(bgp, vty);
3f9c7369 15610
d62a17ae 15611 return CMD_SUCCESS;
3f9c7369
DS
15612}
15613
8386ac43 15614DEFUN (show_bgp_instance_updgrps_stats,
15615 show_bgp_instance_updgrps_stats_cmd,
18c57037 15616 "show [ip] bgp <view|vrf> VIEWVRFNAME update-groups statistics",
8386ac43 15617 SHOW_STR
716b2d8a 15618 IP_STR
8386ac43 15619 BGP_STR
15620 BGP_INSTANCE_HELP_STR
0c7b1b01 15621 "Detailed info about dynamic update groups\n"
8386ac43 15622 "Statistics\n")
15623{
d62a17ae 15624 int idx_word = 3;
15625 struct bgp *bgp;
8386ac43 15626
d62a17ae 15627 bgp = bgp_lookup_by_name(argv[idx_word]->arg);
15628 if (bgp)
15629 update_group_show_stats(bgp, vty);
8386ac43 15630
d62a17ae 15631 return CMD_SUCCESS;
8386ac43 15632}
15633
d62a17ae 15634static void show_bgp_updgrps_adj_info_aux(struct vty *vty, const char *name,
15635 afi_t afi, safi_t safi,
15636 const char *what, uint64_t subgrp_id)
3f9c7369 15637{
d62a17ae 15638 struct bgp *bgp;
8386ac43 15639
d62a17ae 15640 if (name)
15641 bgp = bgp_lookup_by_name(name);
15642 else
15643 bgp = bgp_get_default();
8386ac43 15644
d62a17ae 15645 if (bgp) {
15646 if (!strcmp(what, "advertise-queue"))
15647 update_group_show_adj_queue(bgp, afi, safi, vty,
15648 subgrp_id);
15649 else if (!strcmp(what, "advertised-routes"))
15650 update_group_show_advertised(bgp, afi, safi, vty,
15651 subgrp_id);
15652 else if (!strcmp(what, "packet-queue"))
15653 update_group_show_packet_queue(bgp, afi, safi, vty,
15654 subgrp_id);
15655 }
3f9c7369
DS
15656}
15657
dc64bdec
QY
15658DEFPY(show_ip_bgp_instance_updgrps_adj_s,
15659 show_ip_bgp_instance_updgrps_adj_s_cmd,
15660 "show [ip]$ip bgp [<view|vrf> VIEWVRFNAME$vrf] [<ipv4|ipv6>$afi <unicast|multicast|vpn>$safi] update-groups [SUBGROUP-ID]$sgid <advertise-queue|advertised-routes|packet-queue>$rtq",
15661 SHOW_STR IP_STR BGP_STR BGP_INSTANCE_HELP_STR BGP_AFI_HELP_STR
15662 BGP_SAFI_HELP_STR
15663 "Detailed info about dynamic update groups\n"
15664 "Specific subgroup to display info for\n"
15665 "Advertisement queue\n"
15666 "Announced routes\n"
15667 "Packet queue\n")
3f9c7369 15668{
dc64bdec
QY
15669 uint64_t subgrp_id = 0;
15670 afi_t afiz;
15671 safi_t safiz;
15672 if (sgid)
15673 subgrp_id = strtoull(sgid, NULL, 10);
15674
15675 if (!ip && !afi)
15676 afiz = AFI_IP6;
15677 if (!ip && afi)
15678 afiz = bgp_vty_afi_from_str(afi);
15679 if (ip && !afi)
15680 afiz = AFI_IP;
15681 if (ip && afi) {
15682 afiz = bgp_vty_afi_from_str(afi);
15683 if (afiz != AFI_IP)
15684 vty_out(vty,
15685 "%% Cannot specify both 'ip' and 'ipv6'\n");
15686 return CMD_WARNING;
15687 }
d62a17ae 15688
dc64bdec 15689 safiz = safi ? bgp_vty_safi_from_str(safi) : SAFI_UNICAST;
d62a17ae 15690
dc64bdec 15691 show_bgp_updgrps_adj_info_aux(vty, vrf, afiz, safiz, rtq, subgrp_id);
d62a17ae 15692 return CMD_SUCCESS;
15693}
15694
6f4eacf3
DA
15695static int bgp_show_one_peer_group(struct vty *vty, struct peer_group *group,
15696 json_object *json)
d62a17ae 15697{
15698 struct listnode *node, *nnode;
15699 struct prefix *range;
15700 struct peer *conf;
15701 struct peer *peer;
d62a17ae 15702 afi_t afi;
15703 safi_t safi;
15704 const char *peer_status;
d62a17ae 15705 int lr_count;
15706 int dynamic;
6f4eacf3
DA
15707 bool af_cfgd;
15708 json_object *json_peer_group = NULL;
15709 json_object *json_peer_group_afc = NULL;
15710 json_object *json_peer_group_members = NULL;
15711 json_object *json_peer_group_dynamic = NULL;
15712 json_object *json_peer_group_dynamic_af = NULL;
15713 json_object *json_peer_group_ranges = NULL;
d62a17ae 15714
15715 conf = group->conf;
15716
6f4eacf3
DA
15717 if (json) {
15718 json_peer_group = json_object_new_object();
15719 json_peer_group_afc = json_object_new_array();
15720 }
15721
d62a17ae 15722 if (conf->as_type == AS_SPECIFIED || conf->as_type == AS_EXTERNAL) {
6f4eacf3
DA
15723 if (json)
15724 json_object_int_add(json_peer_group, "remoteAs",
15725 conf->as);
15726 else
15727 vty_out(vty, "\nBGP peer-group %s, remote AS %u\n",
15728 group->name, conf->as);
d62a17ae 15729 } else if (conf->as_type == AS_INTERNAL) {
6f4eacf3
DA
15730 if (json)
15731 json_object_int_add(json_peer_group, "remoteAs",
15732 group->bgp->as);
15733 else
15734 vty_out(vty, "\nBGP peer-group %s, remote AS %u\n",
15735 group->name, group->bgp->as);
d62a17ae 15736 } else {
6f4eacf3
DA
15737 if (!json)
15738 vty_out(vty, "\nBGP peer-group %s\n", group->name);
d62a17ae 15739 }
f14e6fdb 15740
6f4eacf3
DA
15741 if ((group->bgp->as == conf->as) || (conf->as_type == AS_INTERNAL)) {
15742 if (json)
15743 json_object_string_add(json_peer_group, "type",
15744 "internal");
15745 else
15746 vty_out(vty, " Peer-group type is internal\n");
15747 } else {
15748 if (json)
15749 json_object_string_add(json_peer_group, "type",
15750 "external");
15751 else
15752 vty_out(vty, " Peer-group type is external\n");
15753 }
d62a17ae 15754
15755 /* Display AFs configured. */
6f4eacf3
DA
15756 if (!json)
15757 vty_out(vty, " Configured address-families:");
15758
05c7a1cc
QY
15759 FOREACH_AFI_SAFI (afi, safi) {
15760 if (conf->afc[afi][safi]) {
6f4eacf3
DA
15761 af_cfgd = true;
15762 if (json)
15763 json_object_array_add(
15764 json_peer_group_afc,
15765 json_object_new_string(get_afi_safi_str(
15766 afi, safi, false)));
15767 else
15768 vty_out(vty, " %s;",
15769 get_afi_safi_str(afi, safi, false));
d62a17ae 15770 }
05c7a1cc 15771 }
6f4eacf3
DA
15772
15773 if (json) {
15774 json_object_object_add(json_peer_group,
15775 "addressFamiliesConfigured",
15776 json_peer_group_afc);
15777 } else {
15778 if (!af_cfgd)
15779 vty_out(vty, " none\n");
15780 else
15781 vty_out(vty, "\n");
15782 }
d62a17ae 15783
15784 /* Display listen ranges (for dynamic neighbors), if any */
15785 for (afi = AFI_IP; afi < AFI_MAX; afi++) {
d62a17ae 15786 lr_count = listcount(group->listen_range[afi]);
15787 if (lr_count) {
6f4eacf3
DA
15788 if (json) {
15789 if (!json_peer_group_dynamic)
15790 json_peer_group_dynamic =
15791 json_object_new_object();
15792
15793 json_peer_group_dynamic_af =
15794 json_object_new_object();
15795 json_peer_group_ranges =
15796 json_object_new_array();
15797 json_object_int_add(json_peer_group_dynamic_af,
15798 "count", lr_count);
15799 } else {
15800 vty_out(vty, " %d %s listen range(s)\n",
15801 lr_count, afi2str(afi));
15802 }
d62a17ae 15803
15804 for (ALL_LIST_ELEMENTS(group->listen_range[afi], node,
6f4eacf3
DA
15805 nnode, range)) {
15806 if (json) {
15807 char buf[BUFSIZ];
15808
15809 snprintfrr(buf, sizeof(buf), "%pFX",
15810 range);
15811
15812 json_object_array_add(
15813 json_peer_group_ranges,
15814 json_object_new_string(buf));
15815 } else {
15816 vty_out(vty, " %pFX\n", range);
15817 }
15818 }
15819
15820 if (json) {
15821 json_object_object_add(
15822 json_peer_group_dynamic_af, "ranges",
15823 json_peer_group_ranges);
15824
15825 json_object_object_add(
15826 json_peer_group_dynamic, afi2str(afi),
15827 json_peer_group_dynamic_af);
15828 }
d62a17ae 15829 }
15830 }
f14e6fdb 15831
6f4eacf3
DA
15832 if (json_peer_group_dynamic)
15833 json_object_object_add(json_peer_group, "dynamicRanges",
15834 json_peer_group_dynamic);
15835
d62a17ae 15836 /* Display group members and their status */
15837 if (listcount(group->peer)) {
6f4eacf3
DA
15838 if (json)
15839 json_peer_group_members = json_object_new_object();
15840 else
15841 vty_out(vty, " Peer-group members:\n");
d62a17ae 15842 for (ALL_LIST_ELEMENTS(group->peer, node, nnode, peer)) {
cb9196e7
DS
15843 if (CHECK_FLAG(peer->flags, PEER_FLAG_SHUTDOWN)
15844 || CHECK_FLAG(peer->bgp->flags, BGP_FLAG_SHUTDOWN))
d62a17ae 15845 peer_status = "Idle (Admin)";
15846 else if (CHECK_FLAG(peer->sflags,
15847 PEER_STATUS_PREFIX_OVERFLOW))
15848 peer_status = "Idle (PfxCt)";
15849 else
15850 peer_status = lookup_msg(bgp_status_msg,
15851 peer->status, NULL);
15852
15853 dynamic = peer_dynamic_neighbor(peer);
6f4eacf3
DA
15854
15855 if (json) {
15856 json_object *json_peer_group_member =
15857 json_object_new_object();
15858
15859 json_object_string_add(json_peer_group_member,
15860 "status", peer_status);
15861
15862 if (dynamic)
15863 json_object_boolean_true_add(
15864 json_peer_group_member,
15865 "dynamic");
15866
15867 json_object_object_add(json_peer_group_members,
15868 peer->host,
15869 json_peer_group_member);
15870 } else {
15871 vty_out(vty, " %s %s %s \n", peer->host,
15872 dynamic ? "(dynamic)" : "",
15873 peer_status);
15874 }
d62a17ae 15875 }
6f4eacf3
DA
15876 if (json)
15877 json_object_object_add(json_peer_group, "members",
15878 json_peer_group_members);
d62a17ae 15879 }
f14e6fdb 15880
6f4eacf3
DA
15881 if (json)
15882 json_object_object_add(json, group->name, json_peer_group);
15883
d62a17ae 15884 return CMD_SUCCESS;
15885}
15886
ff9959b0 15887static int bgp_show_peer_group_vty(struct vty *vty, const char *name,
6f4eacf3 15888 const char *group_name, bool uj)
d62a17ae 15889{
ff9959b0 15890 struct bgp *bgp;
d62a17ae 15891 struct listnode *node, *nnode;
15892 struct peer_group *group;
ff9959b0 15893 bool found = false;
6f4eacf3
DA
15894 json_object *json = NULL;
15895
15896 if (uj)
15897 json = json_object_new_object();
ff9959b0
QY
15898
15899 bgp = name ? bgp_lookup_by_name(name) : bgp_get_default();
15900
15901 if (!bgp) {
c48349e3 15902 if (uj)
75eeda93 15903 vty_json(vty, json);
c48349e3 15904 else
6f4eacf3 15905 vty_out(vty, "%% BGP instance not found\n");
6f4eacf3 15906
ff9959b0
QY
15907 return CMD_WARNING;
15908 }
d62a17ae 15909
15910 for (ALL_LIST_ELEMENTS(bgp->group, node, nnode, group)) {
ff9959b0
QY
15911 if (group_name) {
15912 if (strmatch(group->name, group_name)) {
6f4eacf3 15913 bgp_show_one_peer_group(vty, group, json);
ff9959b0
QY
15914 found = true;
15915 break;
d62a17ae 15916 }
ff9959b0 15917 } else {
6f4eacf3 15918 bgp_show_one_peer_group(vty, group, json);
d62a17ae 15919 }
f14e6fdb 15920 }
f14e6fdb 15921
6f4eacf3 15922 if (group_name && !found && !uj)
d62a17ae 15923 vty_out(vty, "%% No such peer-group\n");
f14e6fdb 15924
c48349e3 15925 if (uj)
75eeda93 15926 vty_json(vty, json);
6f4eacf3 15927
d62a17ae 15928 return CMD_SUCCESS;
f14e6fdb
DS
15929}
15930
6f4eacf3
DA
15931DEFUN(show_ip_bgp_peer_groups, show_ip_bgp_peer_groups_cmd,
15932 "show [ip] bgp [<view|vrf> VIEWVRFNAME] peer-group [PGNAME] [json]",
15933 SHOW_STR IP_STR BGP_STR BGP_INSTANCE_HELP_STR
15934 "Detailed information on BGP peer groups\n"
15935 "Peer group name\n" JSON_STR)
f14e6fdb 15936{
d62a17ae 15937 char *vrf, *pg;
d62a17ae 15938 int idx = 0;
6f4eacf3 15939 bool uj = use_json(argc, argv);
f14e6fdb 15940
a4d82a8a
PZ
15941 vrf = argv_find(argv, argc, "VIEWVRFNAME", &idx) ? argv[idx]->arg
15942 : NULL;
d62a17ae 15943 pg = argv_find(argv, argc, "PGNAME", &idx) ? argv[idx]->arg : NULL;
f14e6fdb 15944
6f4eacf3 15945 return bgp_show_peer_group_vty(vty, vrf, pg, uj);
f14e6fdb 15946}
3f9c7369 15947
d6e3c605 15948
718e3744 15949/* Redistribute VTY commands. */
15950
585f1adc
IR
15951DEFUN (bgp_redistribute_ipv4,
15952 bgp_redistribute_ipv4_cmd,
15953 "redistribute " FRR_IP_REDIST_STR_BGPD,
15954 "Redistribute information from another routing protocol\n"
15955 FRR_IP_REDIST_HELP_STR_BGPD)
718e3744 15956{
585f1adc 15957 VTY_DECLVAR_CONTEXT(bgp, bgp);
d62a17ae 15958 int idx_protocol = 1;
585f1adc 15959 int type;
37a87b8f 15960
585f1adc
IR
15961 type = proto_redistnum(AFI_IP, argv[idx_protocol]->text);
15962 if (type < 0) {
15963 vty_out(vty, "%% Invalid route type\n");
15964 return CMD_WARNING_CONFIG_FAILED;
15965 }
7f323236 15966
585f1adc
IR
15967 bgp_redist_add(bgp, AFI_IP, type, 0);
15968 return bgp_redistribute_set(bgp, AFI_IP, type, 0, false);
718e3744 15969}
15970
d62a17ae 15971ALIAS_HIDDEN(
15972 bgp_redistribute_ipv4, bgp_redistribute_ipv4_hidden_cmd,
15973 "redistribute " FRR_IP_REDIST_STR_BGPD,
15974 "Redistribute information from another routing protocol\n" FRR_IP_REDIST_HELP_STR_BGPD)
596c17ba 15975
585f1adc
IR
15976DEFUN (bgp_redistribute_ipv4_rmap,
15977 bgp_redistribute_ipv4_rmap_cmd,
70dd370f 15978 "redistribute " FRR_IP_REDIST_STR_BGPD " route-map RMAP_NAME",
585f1adc
IR
15979 "Redistribute information from another routing protocol\n"
15980 FRR_IP_REDIST_HELP_STR_BGPD
15981 "Route map reference\n"
15982 "Pointer to route-map entries\n")
718e3744 15983{
585f1adc 15984 VTY_DECLVAR_CONTEXT(bgp, bgp);
d62a17ae 15985 int idx_protocol = 1;
15986 int idx_word = 3;
585f1adc
IR
15987 int type;
15988 struct bgp_redist *red;
15989 bool changed;
15990 struct route_map *route_map = route_map_lookup_warn_noexist(
15991 vty, argv[idx_word]->arg);
15992
15993 type = proto_redistnum(AFI_IP, argv[idx_protocol]->text);
15994 if (type < 0) {
15995 vty_out(vty, "%% Invalid route type\n");
15996 return CMD_WARNING_CONFIG_FAILED;
15997 }
37a87b8f 15998
585f1adc
IR
15999 red = bgp_redist_add(bgp, AFI_IP, type, 0);
16000 changed =
16001 bgp_redistribute_rmap_set(red, argv[idx_word]->arg, route_map);
16002 return bgp_redistribute_set(bgp, AFI_IP, type, 0, changed);
718e3744 16003}
16004
d62a17ae 16005ALIAS_HIDDEN(
16006 bgp_redistribute_ipv4_rmap, bgp_redistribute_ipv4_rmap_hidden_cmd,
70dd370f 16007 "redistribute " FRR_IP_REDIST_STR_BGPD " route-map RMAP_NAME",
d62a17ae 16008 "Redistribute information from another routing protocol\n" FRR_IP_REDIST_HELP_STR_BGPD
16009 "Route map reference\n"
16010 "Pointer to route-map entries\n")
596c17ba 16011
585f1adc
IR
16012DEFUN (bgp_redistribute_ipv4_metric,
16013 bgp_redistribute_ipv4_metric_cmd,
16014 "redistribute " FRR_IP_REDIST_STR_BGPD " metric (0-4294967295)",
16015 "Redistribute information from another routing protocol\n"
16016 FRR_IP_REDIST_HELP_STR_BGPD
16017 "Metric for redistributed routes\n"
16018 "Default metric\n")
718e3744 16019{
585f1adc 16020 VTY_DECLVAR_CONTEXT(bgp, bgp);
d62a17ae 16021 int idx_protocol = 1;
16022 int idx_number = 3;
585f1adc
IR
16023 int type;
16024 uint32_t metric;
16025 struct bgp_redist *red;
16026 bool changed;
16027
16028 type = proto_redistnum(AFI_IP, argv[idx_protocol]->text);
16029 if (type < 0) {
16030 vty_out(vty, "%% Invalid route type\n");
16031 return CMD_WARNING_CONFIG_FAILED;
16032 }
16033 metric = strtoul(argv[idx_number]->arg, NULL, 10);
37a87b8f 16034
585f1adc
IR
16035 red = bgp_redist_add(bgp, AFI_IP, type, 0);
16036 changed = bgp_redistribute_metric_set(bgp, red, AFI_IP, type, metric);
16037 return bgp_redistribute_set(bgp, AFI_IP, type, 0, changed);
d62a17ae 16038}
16039
16040ALIAS_HIDDEN(
16041 bgp_redistribute_ipv4_metric, bgp_redistribute_ipv4_metric_hidden_cmd,
16042 "redistribute " FRR_IP_REDIST_STR_BGPD " metric (0-4294967295)",
16043 "Redistribute information from another routing protocol\n" FRR_IP_REDIST_HELP_STR_BGPD
16044 "Metric for redistributed routes\n"
16045 "Default metric\n")
596c17ba 16046
585f1adc
IR
16047DEFUN (bgp_redistribute_ipv4_rmap_metric,
16048 bgp_redistribute_ipv4_rmap_metric_cmd,
70dd370f 16049 "redistribute " FRR_IP_REDIST_STR_BGPD " route-map RMAP_NAME metric (0-4294967295)",
585f1adc
IR
16050 "Redistribute information from another routing protocol\n"
16051 FRR_IP_REDIST_HELP_STR_BGPD
16052 "Route map reference\n"
16053 "Pointer to route-map entries\n"
16054 "Metric for redistributed routes\n"
16055 "Default metric\n")
718e3744 16056{
585f1adc 16057 VTY_DECLVAR_CONTEXT(bgp, bgp);
d62a17ae 16058 int idx_protocol = 1;
16059 int idx_word = 3;
16060 int idx_number = 5;
585f1adc
IR
16061 int type;
16062 uint32_t metric;
16063 struct bgp_redist *red;
16064 bool changed;
16065 struct route_map *route_map =
16066 route_map_lookup_warn_noexist(vty, argv[idx_word]->arg);
16067
16068 type = proto_redistnum(AFI_IP, argv[idx_protocol]->text);
16069 if (type < 0) {
16070 vty_out(vty, "%% Invalid route type\n");
16071 return CMD_WARNING_CONFIG_FAILED;
16072 }
16073 metric = strtoul(argv[idx_number]->arg, NULL, 10);
d62a17ae 16074
585f1adc
IR
16075 red = bgp_redist_add(bgp, AFI_IP, type, 0);
16076 changed =
16077 bgp_redistribute_rmap_set(red, argv[idx_word]->arg, route_map);
16078 changed |= bgp_redistribute_metric_set(bgp, red, AFI_IP, type, metric);
16079 return bgp_redistribute_set(bgp, AFI_IP, type, 0, changed);
d62a17ae 16080}
16081
16082ALIAS_HIDDEN(
16083 bgp_redistribute_ipv4_rmap_metric,
16084 bgp_redistribute_ipv4_rmap_metric_hidden_cmd,
16085 "redistribute " FRR_IP_REDIST_STR_BGPD
70dd370f 16086 " route-map RMAP_NAME metric (0-4294967295)",
d62a17ae 16087 "Redistribute information from another routing protocol\n" FRR_IP_REDIST_HELP_STR_BGPD
16088 "Route map reference\n"
16089 "Pointer to route-map entries\n"
16090 "Metric for redistributed routes\n"
16091 "Default metric\n")
596c17ba 16092
585f1adc
IR
16093DEFUN (bgp_redistribute_ipv4_metric_rmap,
16094 bgp_redistribute_ipv4_metric_rmap_cmd,
70dd370f 16095 "redistribute " FRR_IP_REDIST_STR_BGPD " metric (0-4294967295) route-map RMAP_NAME",
585f1adc
IR
16096 "Redistribute information from another routing protocol\n"
16097 FRR_IP_REDIST_HELP_STR_BGPD
16098 "Metric for redistributed routes\n"
16099 "Default metric\n"
16100 "Route map reference\n"
16101 "Pointer to route-map entries\n")
718e3744 16102{
585f1adc 16103 VTY_DECLVAR_CONTEXT(bgp, bgp);
d62a17ae 16104 int idx_protocol = 1;
37a87b8f 16105 int idx_number = 3;
585f1adc
IR
16106 int idx_word = 5;
16107 int type;
16108 uint32_t metric;
16109 struct bgp_redist *red;
16110 bool changed;
16111 struct route_map *route_map =
16112 route_map_lookup_warn_noexist(vty, argv[idx_word]->arg);
16113
16114 type = proto_redistnum(AFI_IP, argv[idx_protocol]->text);
16115 if (type < 0) {
16116 vty_out(vty, "%% Invalid route type\n");
16117 return CMD_WARNING_CONFIG_FAILED;
16118 }
16119 metric = strtoul(argv[idx_number]->arg, NULL, 10);
d62a17ae 16120
585f1adc
IR
16121 red = bgp_redist_add(bgp, AFI_IP, type, 0);
16122 changed = bgp_redistribute_metric_set(bgp, red, AFI_IP, type, metric);
16123 changed |=
16124 bgp_redistribute_rmap_set(red, argv[idx_word]->arg, route_map);
16125 return bgp_redistribute_set(bgp, AFI_IP, type, 0, changed);
d62a17ae 16126}
16127
16128ALIAS_HIDDEN(
16129 bgp_redistribute_ipv4_metric_rmap,
16130 bgp_redistribute_ipv4_metric_rmap_hidden_cmd,
16131 "redistribute " FRR_IP_REDIST_STR_BGPD
70dd370f 16132 " metric (0-4294967295) route-map RMAP_NAME",
d62a17ae 16133 "Redistribute information from another routing protocol\n" FRR_IP_REDIST_HELP_STR_BGPD
16134 "Metric for redistributed routes\n"
16135 "Default metric\n"
16136 "Route map reference\n"
16137 "Pointer to route-map entries\n")
596c17ba 16138
585f1adc
IR
16139DEFUN (bgp_redistribute_ipv4_ospf,
16140 bgp_redistribute_ipv4_ospf_cmd,
16141 "redistribute <ospf|table> (1-65535)",
16142 "Redistribute information from another routing protocol\n"
16143 "Open Shortest Path First (OSPFv2)\n"
16144 "Non-main Kernel Routing Table\n"
16145 "Instance ID/Table ID\n")
7c8ff89e 16146{
585f1adc
IR
16147 VTY_DECLVAR_CONTEXT(bgp, bgp);
16148 int idx_ospf_table = 1;
d62a17ae 16149 int idx_number = 2;
585f1adc
IR
16150 unsigned short instance;
16151 unsigned short protocol;
7c8ff89e 16152
585f1adc 16153 instance = strtoul(argv[idx_number]->arg, NULL, 10);
7a4bb9c5 16154
585f1adc
IR
16155 if (strncmp(argv[idx_ospf_table]->arg, "o", 1) == 0)
16156 protocol = ZEBRA_ROUTE_OSPF;
16157 else
16158 protocol = ZEBRA_ROUTE_TABLE;
7a4bb9c5 16159
585f1adc
IR
16160 bgp_redist_add(bgp, AFI_IP, protocol, instance);
16161 return bgp_redistribute_set(bgp, AFI_IP, protocol, instance, false);
7c8ff89e
DS
16162}
16163
d62a17ae 16164ALIAS_HIDDEN(bgp_redistribute_ipv4_ospf, bgp_redistribute_ipv4_ospf_hidden_cmd,
16165 "redistribute <ospf|table> (1-65535)",
16166 "Redistribute information from another routing protocol\n"
16167 "Open Shortest Path First (OSPFv2)\n"
16168 "Non-main Kernel Routing Table\n"
16169 "Instance ID/Table ID\n")
596c17ba 16170
585f1adc
IR
16171DEFUN (bgp_redistribute_ipv4_ospf_rmap,
16172 bgp_redistribute_ipv4_ospf_rmap_cmd,
70dd370f 16173 "redistribute <ospf|table> (1-65535) route-map RMAP_NAME",
585f1adc
IR
16174 "Redistribute information from another routing protocol\n"
16175 "Open Shortest Path First (OSPFv2)\n"
16176 "Non-main Kernel Routing Table\n"
16177 "Instance ID/Table ID\n"
16178 "Route map reference\n"
16179 "Pointer to route-map entries\n")
7c8ff89e 16180{
585f1adc
IR
16181 VTY_DECLVAR_CONTEXT(bgp, bgp);
16182 int idx_ospf_table = 1;
d62a17ae 16183 int idx_number = 2;
16184 int idx_word = 4;
585f1adc
IR
16185 struct bgp_redist *red;
16186 unsigned short instance;
16187 int protocol;
16188 bool changed;
16189 struct route_map *route_map =
16190 route_map_lookup_warn_noexist(vty, argv[idx_word]->arg);
16191
16192 if (strncmp(argv[idx_ospf_table]->arg, "o", 1) == 0)
16193 protocol = ZEBRA_ROUTE_OSPF;
16194 else
16195 protocol = ZEBRA_ROUTE_TABLE;
d62a17ae 16196
585f1adc
IR
16197 instance = strtoul(argv[idx_number]->arg, NULL, 10);
16198 red = bgp_redist_add(bgp, AFI_IP, protocol, instance);
16199 changed =
16200 bgp_redistribute_rmap_set(red, argv[idx_word]->arg, route_map);
16201 return bgp_redistribute_set(bgp, AFI_IP, protocol, instance, changed);
d62a17ae 16202}
16203
16204ALIAS_HIDDEN(bgp_redistribute_ipv4_ospf_rmap,
16205 bgp_redistribute_ipv4_ospf_rmap_hidden_cmd,
70dd370f 16206 "redistribute <ospf|table> (1-65535) route-map RMAP_NAME",
d62a17ae 16207 "Redistribute information from another routing protocol\n"
16208 "Open Shortest Path First (OSPFv2)\n"
16209 "Non-main Kernel Routing Table\n"
16210 "Instance ID/Table ID\n"
16211 "Route map reference\n"
16212 "Pointer to route-map entries\n")
596c17ba 16213
585f1adc
IR
16214DEFUN (bgp_redistribute_ipv4_ospf_metric,
16215 bgp_redistribute_ipv4_ospf_metric_cmd,
16216 "redistribute <ospf|table> (1-65535) metric (0-4294967295)",
16217 "Redistribute information from another routing protocol\n"
16218 "Open Shortest Path First (OSPFv2)\n"
16219 "Non-main Kernel Routing Table\n"
16220 "Instance ID/Table ID\n"
16221 "Metric for redistributed routes\n"
16222 "Default metric\n")
7c8ff89e 16223{
585f1adc
IR
16224 VTY_DECLVAR_CONTEXT(bgp, bgp);
16225 int idx_ospf_table = 1;
d62a17ae 16226 int idx_number = 2;
16227 int idx_number_2 = 4;
585f1adc
IR
16228 uint32_t metric;
16229 struct bgp_redist *red;
16230 unsigned short instance;
16231 int protocol;
16232 bool changed;
16233
16234 if (strncmp(argv[idx_ospf_table]->arg, "o", 1) == 0)
16235 protocol = ZEBRA_ROUTE_OSPF;
16236 else
16237 protocol = ZEBRA_ROUTE_TABLE;
d62a17ae 16238
585f1adc
IR
16239 instance = strtoul(argv[idx_number]->arg, NULL, 10);
16240 metric = strtoul(argv[idx_number_2]->arg, NULL, 10);
d62a17ae 16241
585f1adc
IR
16242 red = bgp_redist_add(bgp, AFI_IP, protocol, instance);
16243 changed = bgp_redistribute_metric_set(bgp, red, AFI_IP, protocol,
16244 metric);
16245 return bgp_redistribute_set(bgp, AFI_IP, protocol, instance, changed);
d62a17ae 16246}
16247
16248ALIAS_HIDDEN(bgp_redistribute_ipv4_ospf_metric,
16249 bgp_redistribute_ipv4_ospf_metric_hidden_cmd,
16250 "redistribute <ospf|table> (1-65535) metric (0-4294967295)",
16251 "Redistribute information from another routing protocol\n"
16252 "Open Shortest Path First (OSPFv2)\n"
16253 "Non-main Kernel Routing Table\n"
16254 "Instance ID/Table ID\n"
16255 "Metric for redistributed routes\n"
16256 "Default metric\n")
596c17ba 16257
585f1adc
IR
16258DEFUN (bgp_redistribute_ipv4_ospf_rmap_metric,
16259 bgp_redistribute_ipv4_ospf_rmap_metric_cmd,
70dd370f 16260 "redistribute <ospf|table> (1-65535) route-map RMAP_NAME metric (0-4294967295)",
585f1adc
IR
16261 "Redistribute information from another routing protocol\n"
16262 "Open Shortest Path First (OSPFv2)\n"
16263 "Non-main Kernel Routing Table\n"
16264 "Instance ID/Table ID\n"
16265 "Route map reference\n"
16266 "Pointer to route-map entries\n"
16267 "Metric for redistributed routes\n"
16268 "Default metric\n")
7c8ff89e 16269{
585f1adc
IR
16270 VTY_DECLVAR_CONTEXT(bgp, bgp);
16271 int idx_ospf_table = 1;
d62a17ae 16272 int idx_number = 2;
16273 int idx_word = 4;
16274 int idx_number_2 = 6;
585f1adc
IR
16275 uint32_t metric;
16276 struct bgp_redist *red;
16277 unsigned short instance;
16278 int protocol;
16279 bool changed;
16280 struct route_map *route_map =
16281 route_map_lookup_warn_noexist(vty, argv[idx_word]->arg);
16282
16283 if (strncmp(argv[idx_ospf_table]->arg, "o", 1) == 0)
16284 protocol = ZEBRA_ROUTE_OSPF;
16285 else
16286 protocol = ZEBRA_ROUTE_TABLE;
d62a17ae 16287
585f1adc
IR
16288 instance = strtoul(argv[idx_number]->arg, NULL, 10);
16289 metric = strtoul(argv[idx_number_2]->arg, NULL, 10);
d62a17ae 16290
585f1adc
IR
16291 red = bgp_redist_add(bgp, AFI_IP, protocol, instance);
16292 changed =
16293 bgp_redistribute_rmap_set(red, argv[idx_word]->arg, route_map);
16294 changed |= bgp_redistribute_metric_set(bgp, red, AFI_IP, protocol,
16295 metric);
16296 return bgp_redistribute_set(bgp, AFI_IP, protocol, instance, changed);
d62a17ae 16297}
16298
16299ALIAS_HIDDEN(
16300 bgp_redistribute_ipv4_ospf_rmap_metric,
16301 bgp_redistribute_ipv4_ospf_rmap_metric_hidden_cmd,
70dd370f 16302 "redistribute <ospf|table> (1-65535) route-map RMAP_NAME metric (0-4294967295)",
d62a17ae 16303 "Redistribute information from another routing protocol\n"
16304 "Open Shortest Path First (OSPFv2)\n"
16305 "Non-main Kernel Routing Table\n"
16306 "Instance ID/Table ID\n"
16307 "Route map reference\n"
16308 "Pointer to route-map entries\n"
16309 "Metric for redistributed routes\n"
16310 "Default metric\n")
596c17ba 16311
585f1adc
IR
16312DEFUN (bgp_redistribute_ipv4_ospf_metric_rmap,
16313 bgp_redistribute_ipv4_ospf_metric_rmap_cmd,
70dd370f 16314 "redistribute <ospf|table> (1-65535) metric (0-4294967295) route-map RMAP_NAME",
585f1adc
IR
16315 "Redistribute information from another routing protocol\n"
16316 "Open Shortest Path First (OSPFv2)\n"
16317 "Non-main Kernel Routing Table\n"
16318 "Instance ID/Table ID\n"
16319 "Metric for redistributed routes\n"
16320 "Default metric\n"
16321 "Route map reference\n"
16322 "Pointer to route-map entries\n")
7c8ff89e 16323{
585f1adc
IR
16324 VTY_DECLVAR_CONTEXT(bgp, bgp);
16325 int idx_ospf_table = 1;
d62a17ae 16326 int idx_number = 2;
16327 int idx_number_2 = 4;
16328 int idx_word = 6;
585f1adc
IR
16329 uint32_t metric;
16330 struct bgp_redist *red;
16331 unsigned short instance;
16332 int protocol;
16333 bool changed;
16334 struct route_map *route_map =
16335 route_map_lookup_warn_noexist(vty, argv[idx_word]->arg);
16336
16337 if (strncmp(argv[idx_ospf_table]->arg, "o", 1) == 0)
16338 protocol = ZEBRA_ROUTE_OSPF;
16339 else
16340 protocol = ZEBRA_ROUTE_TABLE;
d62a17ae 16341
585f1adc
IR
16342 instance = strtoul(argv[idx_number]->arg, NULL, 10);
16343 metric = strtoul(argv[idx_number_2]->arg, NULL, 10);
d62a17ae 16344
585f1adc
IR
16345 red = bgp_redist_add(bgp, AFI_IP, protocol, instance);
16346 changed = bgp_redistribute_metric_set(bgp, red, AFI_IP, protocol,
16347 metric);
16348 changed |=
16349 bgp_redistribute_rmap_set(red, argv[idx_word]->arg, route_map);
16350 return bgp_redistribute_set(bgp, AFI_IP, protocol, instance, changed);
d62a17ae 16351}
16352
16353ALIAS_HIDDEN(
16354 bgp_redistribute_ipv4_ospf_metric_rmap,
16355 bgp_redistribute_ipv4_ospf_metric_rmap_hidden_cmd,
70dd370f 16356 "redistribute <ospf|table> (1-65535) metric (0-4294967295) route-map RMAP_NAME",
d62a17ae 16357 "Redistribute information from another routing protocol\n"
16358 "Open Shortest Path First (OSPFv2)\n"
16359 "Non-main Kernel Routing Table\n"
16360 "Instance ID/Table ID\n"
16361 "Metric for redistributed routes\n"
16362 "Default metric\n"
16363 "Route map reference\n"
16364 "Pointer to route-map entries\n")
596c17ba 16365
585f1adc
IR
16366DEFUN (no_bgp_redistribute_ipv4_ospf,
16367 no_bgp_redistribute_ipv4_ospf_cmd,
70dd370f 16368 "no redistribute <ospf|table> (1-65535) [{metric (0-4294967295)|route-map RMAP_NAME}]",
585f1adc
IR
16369 NO_STR
16370 "Redistribute information from another routing protocol\n"
16371 "Open Shortest Path First (OSPFv2)\n"
16372 "Non-main Kernel Routing Table\n"
16373 "Instance ID/Table ID\n"
16374 "Metric for redistributed routes\n"
16375 "Default metric\n"
16376 "Route map reference\n"
16377 "Pointer to route-map entries\n")
7c8ff89e 16378{
585f1adc
IR
16379 VTY_DECLVAR_CONTEXT(bgp, bgp);
16380 int idx_ospf_table = 2;
d62a17ae 16381 int idx_number = 3;
585f1adc
IR
16382 unsigned short instance;
16383 int protocol;
37a87b8f 16384
585f1adc
IR
16385 if (strncmp(argv[idx_ospf_table]->arg, "o", 1) == 0)
16386 protocol = ZEBRA_ROUTE_OSPF;
16387 else
16388 protocol = ZEBRA_ROUTE_TABLE;
d62a17ae 16389
585f1adc
IR
16390 instance = strtoul(argv[idx_number]->arg, NULL, 10);
16391 return bgp_redistribute_unset(bgp, AFI_IP, protocol, instance);
d62a17ae 16392}
16393
16394ALIAS_HIDDEN(
16395 no_bgp_redistribute_ipv4_ospf, no_bgp_redistribute_ipv4_ospf_hidden_cmd,
70dd370f 16396 "no redistribute <ospf|table> (1-65535) [{metric (0-4294967295)|route-map RMAP_NAME}]",
d62a17ae 16397 NO_STR
16398 "Redistribute information from another routing protocol\n"
16399 "Open Shortest Path First (OSPFv2)\n"
16400 "Non-main Kernel Routing Table\n"
16401 "Instance ID/Table ID\n"
16402 "Metric for redistributed routes\n"
16403 "Default metric\n"
16404 "Route map reference\n"
16405 "Pointer to route-map entries\n")
596c17ba 16406
585f1adc
IR
16407DEFUN (no_bgp_redistribute_ipv4,
16408 no_bgp_redistribute_ipv4_cmd,
70dd370f 16409 "no redistribute " FRR_IP_REDIST_STR_BGPD " [{metric (0-4294967295)|route-map RMAP_NAME}]",
585f1adc
IR
16410 NO_STR
16411 "Redistribute information from another routing protocol\n"
16412 FRR_IP_REDIST_HELP_STR_BGPD
16413 "Metric for redistributed routes\n"
16414 "Default metric\n"
16415 "Route map reference\n"
16416 "Pointer to route-map entries\n")
718e3744 16417{
585f1adc 16418 VTY_DECLVAR_CONTEXT(bgp, bgp);
d62a17ae 16419 int idx_protocol = 2;
585f1adc 16420 int type;
d62a17ae 16421
585f1adc
IR
16422 type = proto_redistnum(AFI_IP, argv[idx_protocol]->text);
16423 if (type < 0) {
16424 vty_out(vty, "%% Invalid route type\n");
16425 return CMD_WARNING_CONFIG_FAILED;
16426 }
16427 return bgp_redistribute_unset(bgp, AFI_IP, type, 0);
d62a17ae 16428}
16429
16430ALIAS_HIDDEN(
16431 no_bgp_redistribute_ipv4, no_bgp_redistribute_ipv4_hidden_cmd,
16432 "no redistribute " FRR_IP_REDIST_STR_BGPD
70dd370f 16433 " [{metric (0-4294967295)|route-map RMAP_NAME}]",
d62a17ae 16434 NO_STR
16435 "Redistribute information from another routing protocol\n" FRR_IP_REDIST_HELP_STR_BGPD
16436 "Metric for redistributed routes\n"
16437 "Default metric\n"
16438 "Route map reference\n"
16439 "Pointer to route-map entries\n")
596c17ba 16440
585f1adc
IR
16441DEFUN (bgp_redistribute_ipv6,
16442 bgp_redistribute_ipv6_cmd,
16443 "redistribute " FRR_IP6_REDIST_STR_BGPD,
16444 "Redistribute information from another routing protocol\n"
16445 FRR_IP6_REDIST_HELP_STR_BGPD)
718e3744 16446{
585f1adc 16447 VTY_DECLVAR_CONTEXT(bgp, bgp);
d62a17ae 16448 int idx_protocol = 1;
585f1adc 16449 int type;
718e3744 16450
585f1adc
IR
16451 type = proto_redistnum(AFI_IP6, argv[idx_protocol]->text);
16452 if (type < 0) {
16453 vty_out(vty, "%% Invalid route type\n");
16454 return CMD_WARNING_CONFIG_FAILED;
16455 }
718e3744 16456
585f1adc
IR
16457 bgp_redist_add(bgp, AFI_IP6, type, 0);
16458 return bgp_redistribute_set(bgp, AFI_IP6, type, 0, false);
718e3744 16459}
16460
585f1adc
IR
16461DEFUN (bgp_redistribute_ipv6_rmap,
16462 bgp_redistribute_ipv6_rmap_cmd,
70dd370f 16463 "redistribute " FRR_IP6_REDIST_STR_BGPD " route-map RMAP_NAME",
585f1adc
IR
16464 "Redistribute information from another routing protocol\n"
16465 FRR_IP6_REDIST_HELP_STR_BGPD
16466 "Route map reference\n"
16467 "Pointer to route-map entries\n")
718e3744 16468{
585f1adc 16469 VTY_DECLVAR_CONTEXT(bgp, bgp);
d62a17ae 16470 int idx_protocol = 1;
16471 int idx_word = 3;
585f1adc
IR
16472 int type;
16473 struct bgp_redist *red;
16474 bool changed;
16475 struct route_map *route_map =
16476 route_map_lookup_warn_noexist(vty, argv[idx_word]->arg);
16477
16478 type = proto_redistnum(AFI_IP6, argv[idx_protocol]->text);
16479 if (type < 0) {
16480 vty_out(vty, "%% Invalid route type\n");
16481 return CMD_WARNING_CONFIG_FAILED;
16482 }
37a87b8f 16483
585f1adc
IR
16484 red = bgp_redist_add(bgp, AFI_IP6, type, 0);
16485 changed =
16486 bgp_redistribute_rmap_set(red, argv[idx_word]->arg, route_map);
16487 return bgp_redistribute_set(bgp, AFI_IP6, type, 0, changed);
718e3744 16488}
16489
585f1adc 16490DEFUN (bgp_redistribute_ipv6_metric,
718e3744 16491 bgp_redistribute_ipv6_metric_cmd,
40d1cbfb 16492 "redistribute " FRR_IP6_REDIST_STR_BGPD " metric (0-4294967295)",
718e3744 16493 "Redistribute information from another routing protocol\n"
ab0181ee 16494 FRR_IP6_REDIST_HELP_STR_BGPD
718e3744 16495 "Metric for redistributed routes\n"
16496 "Default metric\n")
16497{
585f1adc 16498 VTY_DECLVAR_CONTEXT(bgp, bgp);
d62a17ae 16499 int idx_protocol = 1;
16500 int idx_number = 3;
585f1adc
IR
16501 int type;
16502 uint32_t metric;
16503 struct bgp_redist *red;
16504 bool changed;
16505
16506 type = proto_redistnum(AFI_IP6, argv[idx_protocol]->text);
16507 if (type < 0) {
16508 vty_out(vty, "%% Invalid route type\n");
16509 return CMD_WARNING_CONFIG_FAILED;
16510 }
16511 metric = strtoul(argv[idx_number]->arg, NULL, 10);
37a87b8f 16512
585f1adc
IR
16513 red = bgp_redist_add(bgp, AFI_IP6, type, 0);
16514 changed = bgp_redistribute_metric_set(bgp, red, AFI_IP6, type, metric);
16515 return bgp_redistribute_set(bgp, AFI_IP6, type, 0, changed);
718e3744 16516}
16517
585f1adc
IR
16518DEFUN (bgp_redistribute_ipv6_rmap_metric,
16519 bgp_redistribute_ipv6_rmap_metric_cmd,
70dd370f 16520 "redistribute " FRR_IP6_REDIST_STR_BGPD " route-map RMAP_NAME metric (0-4294967295)",
585f1adc
IR
16521 "Redistribute information from another routing protocol\n"
16522 FRR_IP6_REDIST_HELP_STR_BGPD
16523 "Route map reference\n"
16524 "Pointer to route-map entries\n"
16525 "Metric for redistributed routes\n"
16526 "Default metric\n")
718e3744 16527{
585f1adc 16528 VTY_DECLVAR_CONTEXT(bgp, bgp);
d62a17ae 16529 int idx_protocol = 1;
16530 int idx_word = 3;
16531 int idx_number = 5;
585f1adc
IR
16532 int type;
16533 uint32_t metric;
16534 struct bgp_redist *red;
16535 bool changed;
16536 struct route_map *route_map =
16537 route_map_lookup_warn_noexist(vty, argv[idx_word]->arg);
16538
16539 type = proto_redistnum(AFI_IP6, argv[idx_protocol]->text);
16540 if (type < 0) {
16541 vty_out(vty, "%% Invalid route type\n");
16542 return CMD_WARNING_CONFIG_FAILED;
16543 }
16544 metric = strtoul(argv[idx_number]->arg, NULL, 10);
37a87b8f 16545
585f1adc
IR
16546 red = bgp_redist_add(bgp, AFI_IP6, type, 0);
16547 changed =
16548 bgp_redistribute_rmap_set(red, argv[idx_word]->arg, route_map);
16549 changed |= bgp_redistribute_metric_set(bgp, red, AFI_IP6, type,
16550 metric);
16551 return bgp_redistribute_set(bgp, AFI_IP6, type, 0, changed);
718e3744 16552}
16553
585f1adc
IR
16554DEFUN (bgp_redistribute_ipv6_metric_rmap,
16555 bgp_redistribute_ipv6_metric_rmap_cmd,
70dd370f 16556 "redistribute " FRR_IP6_REDIST_STR_BGPD " metric (0-4294967295) route-map RMAP_NAME",
585f1adc
IR
16557 "Redistribute information from another routing protocol\n"
16558 FRR_IP6_REDIST_HELP_STR_BGPD
16559 "Metric for redistributed routes\n"
16560 "Default metric\n"
16561 "Route map reference\n"
16562 "Pointer to route-map entries\n")
718e3744 16563{
585f1adc 16564 VTY_DECLVAR_CONTEXT(bgp, bgp);
d62a17ae 16565 int idx_protocol = 1;
37a87b8f 16566 int idx_number = 3;
585f1adc
IR
16567 int idx_word = 5;
16568 int type;
16569 uint32_t metric;
16570 struct bgp_redist *red;
16571 bool changed;
16572 struct route_map *route_map =
16573 route_map_lookup_warn_noexist(vty, argv[idx_word]->arg);
16574
16575 type = proto_redistnum(AFI_IP6, argv[idx_protocol]->text);
16576 if (type < 0) {
16577 vty_out(vty, "%% Invalid route type\n");
16578 return CMD_WARNING_CONFIG_FAILED;
16579 }
16580 metric = strtoul(argv[idx_number]->arg, NULL, 10);
37a87b8f 16581
585f1adc
IR
16582 red = bgp_redist_add(bgp, AFI_IP6, type, 0);
16583 changed = bgp_redistribute_metric_set(bgp, red, AFI_IP6, SAFI_UNICAST,
16584 metric);
16585 changed |=
16586 bgp_redistribute_rmap_set(red, argv[idx_word]->arg, route_map);
16587 return bgp_redistribute_set(bgp, AFI_IP6, type, 0, changed);
718e3744 16588}
16589
585f1adc
IR
16590DEFUN (no_bgp_redistribute_ipv6,
16591 no_bgp_redistribute_ipv6_cmd,
70dd370f 16592 "no redistribute " FRR_IP6_REDIST_STR_BGPD " [{metric (0-4294967295)|route-map RMAP_NAME}]",
585f1adc
IR
16593 NO_STR
16594 "Redistribute information from another routing protocol\n"
16595 FRR_IP6_REDIST_HELP_STR_BGPD
16596 "Metric for redistributed routes\n"
16597 "Default metric\n"
16598 "Route map reference\n"
16599 "Pointer to route-map entries\n")
718e3744 16600{
585f1adc 16601 VTY_DECLVAR_CONTEXT(bgp, bgp);
d62a17ae 16602 int idx_protocol = 2;
585f1adc 16603 int type;
37a87b8f 16604
585f1adc
IR
16605 type = proto_redistnum(AFI_IP6, argv[idx_protocol]->text);
16606 if (type < 0) {
16607 vty_out(vty, "%% Invalid route type\n");
16608 return CMD_WARNING_CONFIG_FAILED;
16609 }
718e3744 16610
585f1adc 16611 return bgp_redistribute_unset(bgp, AFI_IP6, type, 0);
d62a17ae 16612}
16613
4ab46701
AR
16614/* Neighbor update tcp-mss. */
16615static int peer_tcp_mss_vty(struct vty *vty, const char *peer_str,
16616 const char *tcp_mss_str)
16617{
16618 struct peer *peer;
16619 uint32_t tcp_mss_val = 0;
16620
16621 peer = peer_and_group_lookup_vty(vty, peer_str);
16622 if (!peer)
16623 return CMD_WARNING_CONFIG_FAILED;
16624
16625 if (tcp_mss_str) {
16626 tcp_mss_val = strtoul(tcp_mss_str, NULL, 10);
16627 peer_tcp_mss_set(peer, tcp_mss_val);
16628 } else {
16629 peer_tcp_mss_unset(peer);
16630 }
16631
16632 return CMD_SUCCESS;
16633}
16634
16635DEFUN(neighbor_tcp_mss, neighbor_tcp_mss_cmd,
16636 "neighbor <A.B.C.D|X:X::X:X|WORD> tcp-mss (1-65535)",
16637 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
16638 "TCP max segment size\n"
16639 "TCP MSS value\n")
16640{
16641 int peer_index = 1;
16642 int mss_index = 3;
16643
16644 vty_out(vty,
16645 " Warning: Reset BGP session for tcp-mss value to take effect\n");
16646 return peer_tcp_mss_vty(vty, argv[peer_index]->arg,
16647 argv[mss_index]->arg);
16648}
16649
16650DEFUN(no_neighbor_tcp_mss, no_neighbor_tcp_mss_cmd,
16651 "no neighbor <A.B.C.D|X:X::X:X|WORD> tcp-mss [(1-65535)]",
16652 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
16653 "TCP max segment size\n"
16654 "TCP MSS value\n")
16655{
16656 int peer_index = 2;
16657
16658 vty_out(vty,
16659 " Warning: Reset BGP session for tcp-mss value to take effect\n");
16660 return peer_tcp_mss_vty(vty, argv[peer_index]->arg, NULL);
16661}
16662
a486300b
PG
16663DEFPY(bgp_retain_route_target, bgp_retain_route_target_cmd,
16664 "[no$no] bgp retain route-target all",
16665 NO_STR BGP_STR
16666 "Retain BGP updates\n"
16667 "Retain BGP updates based on route-target values\n"
16668 "Retain all BGP updates\n")
16669{
16670 bool check;
16671 struct bgp *bgp = VTY_GET_CONTEXT(bgp);
16672
16673 check = CHECK_FLAG(bgp->af_flags[bgp_node_afi(vty)][bgp_node_safi(vty)],
16674 BGP_VPNVX_RETAIN_ROUTE_TARGET_ALL);
16675 if (check != !no) {
16676 if (!no)
16677 SET_FLAG(bgp->af_flags[bgp_node_afi(vty)]
16678 [bgp_node_safi(vty)],
16679 BGP_VPNVX_RETAIN_ROUTE_TARGET_ALL);
16680 else
16681 UNSET_FLAG(bgp->af_flags[bgp_node_afi(vty)]
16682 [bgp_node_safi(vty)],
16683 BGP_VPNVX_RETAIN_ROUTE_TARGET_ALL);
16684 /* trigger a flush to re-sync with ADJ-RIB-in */
16685 bgp_clear(vty, bgp, bgp_node_afi(vty), bgp_node_safi(vty),
16686 clear_all, BGP_CLEAR_SOFT_IN, NULL);
16687 }
16688 return CMD_SUCCESS;
16689}
16690
dd65f45e
DL
16691static void bgp_config_write_redistribute(struct vty *vty, struct bgp *bgp,
16692 afi_t afi, safi_t safi)
d62a17ae 16693{
16694 int i;
16695
16696 /* Unicast redistribution only. */
16697 if (safi != SAFI_UNICAST)
2b791107 16698 return;
d62a17ae 16699
16700 for (i = 0; i < ZEBRA_ROUTE_MAX; i++) {
16701 /* Redistribute BGP does not make sense. */
16702 if (i != ZEBRA_ROUTE_BGP) {
16703 struct list *red_list;
16704 struct listnode *node;
16705 struct bgp_redist *red;
16706
16707 red_list = bgp->redist[afi][i];
16708 if (!red_list)
16709 continue;
16710
16711 for (ALL_LIST_ELEMENTS_RO(red_list, node, red)) {
d62a17ae 16712 /* "redistribute" configuration. */
16713 vty_out(vty, " redistribute %s",
16714 zebra_route_string(i));
16715 if (red->instance)
16716 vty_out(vty, " %d", red->instance);
16717 if (red->redist_metric_flag)
16718 vty_out(vty, " metric %u",
16719 red->redist_metric);
16720 if (red->rmap.name)
16721 vty_out(vty, " route-map %s",
16722 red->rmap.name);
16723 vty_out(vty, "\n");
16724 }
16725 }
16726 }
718e3744 16727}
6b0655a2 16728
dd65f45e
DL
16729/* peer-group helpers for config-write */
16730
83194f39 16731static bool peergroup_flag_check(struct peer *peer, uint64_t flag)
dd65f45e
DL
16732{
16733 if (!peer_group_active(peer)) {
16734 if (CHECK_FLAG(peer->flags_invert, flag))
16735 return !CHECK_FLAG(peer->flags, flag);
16736 else
16737 return !!CHECK_FLAG(peer->flags, flag);
16738 }
16739
16740 return !!CHECK_FLAG(peer->flags_override, flag);
16741}
16742
16743static bool peergroup_af_flag_check(struct peer *peer, afi_t afi, safi_t safi,
da5e1a58 16744 uint64_t flag)
dd65f45e
DL
16745{
16746 if (!peer_group_active(peer)) {
16747 if (CHECK_FLAG(peer->af_flags_invert[afi][safi], flag))
16748 return !peer_af_flag_check(peer, afi, safi, flag);
16749 else
16750 return !!peer_af_flag_check(peer, afi, safi, flag);
16751 }
16752
16753 return !!CHECK_FLAG(peer->af_flags_override[afi][safi], flag);
16754}
16755
16756static bool peergroup_filter_check(struct peer *peer, afi_t afi, safi_t safi,
16757 uint8_t type, int direct)
16758{
16759 struct bgp_filter *filter;
16760
16761 if (peer_group_active(peer))
16762 return !!CHECK_FLAG(peer->filter_override[afi][safi][direct],
16763 type);
16764
16765 filter = &peer->filter[afi][safi];
16766 switch (type) {
16767 case PEER_FT_DISTRIBUTE_LIST:
16768 return !!(filter->dlist[direct].name);
16769 case PEER_FT_FILTER_LIST:
16770 return !!(filter->aslist[direct].name);
16771 case PEER_FT_PREFIX_LIST:
16772 return !!(filter->plist[direct].name);
16773 case PEER_FT_ROUTE_MAP:
16774 return !!(filter->map[direct].name);
16775 case PEER_FT_UNSUPPRESS_MAP:
16776 return !!(filter->usmap.name);
7f7940e6
MK
16777 case PEER_FT_ADVERTISE_MAP:
16778 return !!(filter->advmap.aname
16779 && ((filter->advmap.condition == direct)
16780 && filter->advmap.cname));
dd65f45e
DL
16781 default:
16782 return false;
16783 }
16784}
16785
16786/* Return true if the addpath type is set for peer and different from
16787 * peer-group.
16788 */
3dc339cd
DA
16789static bool peergroup_af_addpath_check(struct peer *peer, afi_t afi,
16790 safi_t safi)
dd65f45e
DL
16791{
16792 enum bgp_addpath_strat type, g_type;
16793
16794 type = peer->addpath_type[afi][safi];
16795
16796 if (type != BGP_ADDPATH_NONE) {
16797 if (peer_group_active(peer)) {
16798 g_type = peer->group->conf->addpath_type[afi][safi];
16799
16800 if (type != g_type)
3dc339cd 16801 return true;
dd65f45e 16802 else
3dc339cd 16803 return false;
dd65f45e
DL
16804 }
16805
3dc339cd 16806 return true;
dd65f45e
DL
16807 }
16808
3dc339cd 16809 return false;
dd65f45e
DL
16810}
16811
b9c7bc5a 16812/* This is part of the address-family block (unicast only) */
dd65f45e 16813static void bgp_vpn_policy_config_write_afi(struct vty *vty, struct bgp *bgp,
ddb5b488
PZ
16814 afi_t afi)
16815{
b9c7bc5a 16816 int indent = 2;
53970de3 16817 uint32_t tovpn_sid_index = 0;
ddb5b488 16818
8a066a70 16819 if (bgp->vpn_policy[afi].rmap_name[BGP_VPN_POLICY_DIR_FROMVPN]) {
ae6a6fb4
DS
16820 if (CHECK_FLAG(bgp->af_flags[afi][SAFI_UNICAST],
16821 BGP_CONFIG_VRF_TO_VRF_IMPORT))
8a066a70
PG
16822 vty_out(vty, "%*simport vrf route-map %s\n", indent, "",
16823 bgp->vpn_policy[afi]
bb4f6190 16824 .rmap_name[BGP_VPN_POLICY_DIR_FROMVPN]);
8a066a70
PG
16825 else
16826 vty_out(vty, "%*sroute-map vpn import %s\n", indent, "",
16827 bgp->vpn_policy[afi]
16828 .rmap_name[BGP_VPN_POLICY_DIR_FROMVPN]);
16829 }
12a844a5
DS
16830 if (CHECK_FLAG(bgp->af_flags[afi][SAFI_UNICAST],
16831 BGP_CONFIG_VRF_TO_VRF_IMPORT)
16832 || CHECK_FLAG(bgp->af_flags[afi][SAFI_UNICAST],
16833 BGP_CONFIG_VRF_TO_VRF_EXPORT))
16834 return;
16835
e70e9f8e
PZ
16836 if (CHECK_FLAG(bgp->vpn_policy[afi].flags,
16837 BGP_VPN_POLICY_TOVPN_LABEL_AUTO)) {
16838
16839 vty_out(vty, "%*slabel vpn export %s\n", indent, "", "auto");
16840
16841 } else {
16842 if (bgp->vpn_policy[afi].tovpn_label != MPLS_LABEL_NONE) {
16843 vty_out(vty, "%*slabel vpn export %u\n", indent, "",
16844 bgp->vpn_policy[afi].tovpn_label);
16845 }
ddb5b488 16846 }
53970de3
RS
16847
16848 tovpn_sid_index = bgp->vpn_policy[afi].tovpn_sid_index;
16849 if (CHECK_FLAG(bgp->vpn_policy[afi].flags,
16850 BGP_VPN_POLICY_TOVPN_SID_AUTO)) {
16851 vty_out(vty, "%*ssid vpn export %s\n", indent, "", "auto");
16852 } else if (tovpn_sid_index != 0) {
16853 vty_out(vty, "%*ssid vpn export %d\n", indent, "",
16854 tovpn_sid_index);
16855 }
16856
c4f64ea9
DA
16857 if (CHECK_FLAG(bgp->vpn_policy[afi].flags, BGP_VPN_POLICY_TOVPN_RD_SET))
16858 vty_out(vty, "%*srd vpn export %pRD\n", indent, "",
16859 &bgp->vpn_policy[afi].tovpn_rd);
16860
ddb5b488
PZ
16861 if (CHECK_FLAG(bgp->vpn_policy[afi].flags,
16862 BGP_VPN_POLICY_TOVPN_NEXTHOP_SET)) {
16863
16864 char buf[PREFIX_STRLEN];
16865 if (inet_ntop(bgp->vpn_policy[afi].tovpn_nexthop.family,
16866 &bgp->vpn_policy[afi].tovpn_nexthop.u.prefix, buf,
16867 sizeof(buf))) {
16868
b9c7bc5a
PZ
16869 vty_out(vty, "%*snexthop vpn export %s\n",
16870 indent, "", buf);
ddb5b488
PZ
16871 }
16872 }
16873 if (bgp->vpn_policy[afi].rtlist[BGP_VPN_POLICY_DIR_FROMVPN]
16874 && bgp->vpn_policy[afi].rtlist[BGP_VPN_POLICY_DIR_TOVPN]
16875 && ecommunity_cmp(
16876 bgp->vpn_policy[afi].rtlist[BGP_VPN_POLICY_DIR_FROMVPN],
16877 bgp->vpn_policy[afi].rtlist[BGP_VPN_POLICY_DIR_TOVPN])) {
16878
16879 char *b = ecommunity_ecom2str(
16880 bgp->vpn_policy[afi].rtlist[BGP_VPN_POLICY_DIR_TOVPN],
16881 ECOMMUNITY_FORMAT_ROUTE_MAP, ECOMMUNITY_ROUTE_TARGET);
b9c7bc5a 16882 vty_out(vty, "%*srt vpn both %s\n", indent, "", b);
ddb5b488
PZ
16883 XFREE(MTYPE_ECOMMUNITY_STR, b);
16884 } else {
16885 if (bgp->vpn_policy[afi].rtlist[BGP_VPN_POLICY_DIR_FROMVPN]) {
16886 char *b = ecommunity_ecom2str(
16887 bgp->vpn_policy[afi]
16888 .rtlist[BGP_VPN_POLICY_DIR_FROMVPN],
16889 ECOMMUNITY_FORMAT_ROUTE_MAP,
16890 ECOMMUNITY_ROUTE_TARGET);
b9c7bc5a 16891 vty_out(vty, "%*srt vpn import %s\n", indent, "", b);
ddb5b488
PZ
16892 XFREE(MTYPE_ECOMMUNITY_STR, b);
16893 }
16894 if (bgp->vpn_policy[afi].rtlist[BGP_VPN_POLICY_DIR_TOVPN]) {
16895 char *b = ecommunity_ecom2str(
16896 bgp->vpn_policy[afi]
16897 .rtlist[BGP_VPN_POLICY_DIR_TOVPN],
16898 ECOMMUNITY_FORMAT_ROUTE_MAP,
16899 ECOMMUNITY_ROUTE_TARGET);
b9c7bc5a 16900 vty_out(vty, "%*srt vpn export %s\n", indent, "", b);
ddb5b488
PZ
16901 XFREE(MTYPE_ECOMMUNITY_STR, b);
16902 }
16903 }
bb4f6190
DS
16904
16905 if (bgp->vpn_policy[afi].rmap_name[BGP_VPN_POLICY_DIR_TOVPN])
b9c7bc5a 16906 vty_out(vty, "%*sroute-map vpn export %s\n", indent, "",
ddb5b488
PZ
16907 bgp->vpn_policy[afi]
16908 .rmap_name[BGP_VPN_POLICY_DIR_TOVPN]);
bb4f6190 16909
301ad80a
PG
16910 if (bgp->vpn_policy[afi].import_redirect_rtlist) {
16911 char *b = ecommunity_ecom2str(
16912 bgp->vpn_policy[afi]
16913 .import_redirect_rtlist,
16914 ECOMMUNITY_FORMAT_ROUTE_MAP,
16915 ECOMMUNITY_ROUTE_TARGET);
ddb5b488 16916
9a659715
PG
16917 if (bgp->vpn_policy[afi].import_redirect_rtlist->unit_size
16918 != ECOMMUNITY_SIZE)
c6423c31 16919 vty_out(vty, "%*srt6 redirect import %s\n",
9a659715
PG
16920 indent, "", b);
16921 else
16922 vty_out(vty, "%*srt redirect import %s\n",
16923 indent, "", b);
301ad80a
PG
16924 XFREE(MTYPE_ECOMMUNITY_STR, b);
16925 }
ddb5b488
PZ
16926}
16927
dd65f45e
DL
16928static void bgp_config_write_filter(struct vty *vty, struct peer *peer,
16929 afi_t afi, safi_t safi)
16930{
16931 struct bgp_filter *filter;
16932 char *addr;
16933
16934 addr = peer->host;
16935 filter = &peer->filter[afi][safi];
16936
16937 /* distribute-list. */
16938 if (peergroup_filter_check(peer, afi, safi, PEER_FT_DISTRIBUTE_LIST,
16939 FILTER_IN))
16940 vty_out(vty, " neighbor %s distribute-list %s in\n", addr,
16941 filter->dlist[FILTER_IN].name);
16942
16943 if (peergroup_filter_check(peer, afi, safi, PEER_FT_DISTRIBUTE_LIST,
16944 FILTER_OUT))
16945 vty_out(vty, " neighbor %s distribute-list %s out\n", addr,
16946 filter->dlist[FILTER_OUT].name);
16947
16948 /* prefix-list. */
16949 if (peergroup_filter_check(peer, afi, safi, PEER_FT_PREFIX_LIST,
16950 FILTER_IN))
16951 vty_out(vty, " neighbor %s prefix-list %s in\n", addr,
16952 filter->plist[FILTER_IN].name);
16953
16954 if (peergroup_filter_check(peer, afi, safi, PEER_FT_PREFIX_LIST,
16955 FILTER_OUT))
16956 vty_out(vty, " neighbor %s prefix-list %s out\n", addr,
16957 filter->plist[FILTER_OUT].name);
16958
16959 /* route-map. */
16960 if (peergroup_filter_check(peer, afi, safi, PEER_FT_ROUTE_MAP, RMAP_IN))
16961 vty_out(vty, " neighbor %s route-map %s in\n", addr,
16962 filter->map[RMAP_IN].name);
16963
16964 if (peergroup_filter_check(peer, afi, safi, PEER_FT_ROUTE_MAP,
16965 RMAP_OUT))
16966 vty_out(vty, " neighbor %s route-map %s out\n", addr,
16967 filter->map[RMAP_OUT].name);
16968
16969 /* unsuppress-map */
16970 if (peergroup_filter_check(peer, afi, safi, PEER_FT_UNSUPPRESS_MAP, 0))
16971 vty_out(vty, " neighbor %s unsuppress-map %s\n", addr,
16972 filter->usmap.name);
16973
7f7940e6
MK
16974 /* advertise-map : always applied in OUT direction*/
16975 if (peergroup_filter_check(peer, afi, safi, PEER_FT_ADVERTISE_MAP,
16976 CONDITION_NON_EXIST))
16977 vty_out(vty,
16978 " neighbor %s advertise-map %s non-exist-map %s\n",
16979 addr, filter->advmap.aname, filter->advmap.cname);
16980
16981 if (peergroup_filter_check(peer, afi, safi, PEER_FT_ADVERTISE_MAP,
16982 CONDITION_EXIST))
16983 vty_out(vty, " neighbor %s advertise-map %s exist-map %s\n",
16984 addr, filter->advmap.aname, filter->advmap.cname);
16985
dd65f45e
DL
16986 /* filter-list. */
16987 if (peergroup_filter_check(peer, afi, safi, PEER_FT_FILTER_LIST,
16988 FILTER_IN))
16989 vty_out(vty, " neighbor %s filter-list %s in\n", addr,
16990 filter->aslist[FILTER_IN].name);
16991
16992 if (peergroup_filter_check(peer, afi, safi, PEER_FT_FILTER_LIST,
16993 FILTER_OUT))
16994 vty_out(vty, " neighbor %s filter-list %s out\n", addr,
16995 filter->aslist[FILTER_OUT].name);
16996}
16997
16998/* BGP peer configuration display function. */
16999static void bgp_config_write_peer_global(struct vty *vty, struct bgp *bgp,
17000 struct peer *peer)
17001{
17002 struct peer *g_peer = NULL;
dd65f45e
DL
17003 char *addr;
17004 int if_pg_printed = false;
17005 int if_ras_printed = false;
17006
17007 /* Skip dynamic neighbors. */
17008 if (peer_dynamic_neighbor(peer))
17009 return;
17010
17011 if (peer->conf_if)
17012 addr = peer->conf_if;
17013 else
17014 addr = peer->host;
17015
17016 /************************************
17017 ****** Global to the neighbor ******
17018 ************************************/
17019 if (peer->conf_if) {
17020 if (CHECK_FLAG(peer->flags, PEER_FLAG_IFPEER_V6ONLY))
17021 vty_out(vty, " neighbor %s interface v6only", addr);
17022 else
17023 vty_out(vty, " neighbor %s interface", addr);
17024
17025 if (peer_group_active(peer)) {
17026 vty_out(vty, " peer-group %s", peer->group->name);
17027 if_pg_printed = true;
17028 } else if (peer->as_type == AS_SPECIFIED) {
17029 vty_out(vty, " remote-as %u", peer->as);
17030 if_ras_printed = true;
17031 } else if (peer->as_type == AS_INTERNAL) {
17032 vty_out(vty, " remote-as internal");
17033 if_ras_printed = true;
17034 } else if (peer->as_type == AS_EXTERNAL) {
17035 vty_out(vty, " remote-as external");
17036 if_ras_printed = true;
17037 }
17038
17039 vty_out(vty, "\n");
17040 }
17041
17042 /* remote-as and peer-group */
17043 /* peer is a member of a peer-group */
17044 if (peer_group_active(peer)) {
17045 g_peer = peer->group->conf;
17046
17047 if (g_peer->as_type == AS_UNSPECIFIED && !if_ras_printed) {
17048 if (peer->as_type == AS_SPECIFIED) {
17049 vty_out(vty, " neighbor %s remote-as %u\n",
17050 addr, peer->as);
17051 } else if (peer->as_type == AS_INTERNAL) {
17052 vty_out(vty,
17053 " neighbor %s remote-as internal\n",
17054 addr);
17055 } else if (peer->as_type == AS_EXTERNAL) {
17056 vty_out(vty,
17057 " neighbor %s remote-as external\n",
17058 addr);
17059 }
17060 }
17061
17062 /* For swpX peers we displayed the peer-group
17063 * via 'neighbor swpX interface peer-group PGNAME' */
17064 if (!if_pg_printed)
17065 vty_out(vty, " neighbor %s peer-group %s\n", addr,
17066 peer->group->name);
17067 }
17068
17069 /* peer is NOT a member of a peer-group */
17070 else {
17071 /* peer is a peer-group, declare the peer-group */
17072 if (CHECK_FLAG(peer->sflags, PEER_STATUS_GROUP)) {
17073 vty_out(vty, " neighbor %s peer-group\n", addr);
17074 }
17075
17076 if (!if_ras_printed) {
17077 if (peer->as_type == AS_SPECIFIED) {
17078 vty_out(vty, " neighbor %s remote-as %u\n",
17079 addr, peer->as);
17080 } else if (peer->as_type == AS_INTERNAL) {
17081 vty_out(vty,
17082 " neighbor %s remote-as internal\n",
17083 addr);
17084 } else if (peer->as_type == AS_EXTERNAL) {
17085 vty_out(vty,
17086 " neighbor %s remote-as external\n",
17087 addr);
17088 }
17089 }
17090 }
17091
17092 /* local-as */
17093 if (peergroup_flag_check(peer, PEER_FLAG_LOCAL_AS)) {
17094 vty_out(vty, " neighbor %s local-as %u", addr,
17095 peer->change_local_as);
17096 if (peergroup_flag_check(peer, PEER_FLAG_LOCAL_AS_NO_PREPEND))
17097 vty_out(vty, " no-prepend");
17098 if (peergroup_flag_check(peer, PEER_FLAG_LOCAL_AS_REPLACE_AS))
17099 vty_out(vty, " replace-as");
17100 vty_out(vty, "\n");
17101 }
17102
17103 /* description */
17104 if (peer->desc) {
17105 vty_out(vty, " neighbor %s description %s\n", addr, peer->desc);
17106 }
17107
17108 /* shutdown */
17109 if (peergroup_flag_check(peer, PEER_FLAG_SHUTDOWN)) {
17110 if (peer->tx_shutdown_message)
17111 vty_out(vty, " neighbor %s shutdown message %s\n", addr,
17112 peer->tx_shutdown_message);
17113 else
17114 vty_out(vty, " neighbor %s shutdown\n", addr);
17115 }
17116
8336c896
DA
17117 if (peergroup_flag_check(peer, PEER_FLAG_RTT_SHUTDOWN))
17118 vty_out(vty, " neighbor %s shutdown rtt %u count %u\n", addr,
17119 peer->rtt_expected, peer->rtt_keepalive_conf);
17120
dd65f45e 17121 /* bfd */
21bfce98
RZ
17122 if (peer->bfd_config)
17123 bgp_bfd_peer_config_write(vty, peer, addr);
dd65f45e
DL
17124
17125 /* password */
17126 if (peergroup_flag_check(peer, PEER_FLAG_PASSWORD))
17127 vty_out(vty, " neighbor %s password %s\n", addr,
17128 peer->password);
17129
17130 /* neighbor solo */
17131 if (CHECK_FLAG(peer->flags, PEER_FLAG_LONESOUL)) {
17132 if (!peer_group_active(peer)) {
17133 vty_out(vty, " neighbor %s solo\n", addr);
17134 }
17135 }
17136
17137 /* BGP port */
17138 if (peer->port != BGP_PORT_DEFAULT) {
17139 vty_out(vty, " neighbor %s port %d\n", addr, peer->port);
17140 }
17141
17142 /* Local interface name */
17143 if (peer->ifname) {
17144 vty_out(vty, " neighbor %s interface %s\n", addr, peer->ifname);
17145 }
17146
4ab46701
AR
17147 /* TCP max segment size */
17148 if (CHECK_FLAG(peer->flags, PEER_FLAG_TCP_MSS))
17149 vty_out(vty, " neighbor %s tcp-mss %d\n", addr, peer->tcp_mss);
17150
dd65f45e
DL
17151 /* passive */
17152 if (peergroup_flag_check(peer, PEER_FLAG_PASSIVE))
17153 vty_out(vty, " neighbor %s passive\n", addr);
17154
17155 /* ebgp-multihop */
17156 if (peer->sort != BGP_PEER_IBGP && peer->ttl != BGP_DEFAULT_TTL
e2521429
DA
17157 && !(peer->gtsm_hops != BGP_GTSM_HOPS_DISABLED
17158 && peer->ttl == MAXTTL)) {
dd65f45e
DL
17159 if (!peer_group_active(peer) || g_peer->ttl != peer->ttl) {
17160 vty_out(vty, " neighbor %s ebgp-multihop %d\n", addr,
17161 peer->ttl);
17162 }
17163 }
17164
d864dd9e 17165 /* role */
7dddd1f7
DA
17166 if (peergroup_flag_check(peer, PEER_FLAG_ROLE) &&
17167 peer->local_role != ROLE_UNDEFINED)
d864dd9e 17168 vty_out(vty, " neighbor %s local-role %s%s\n", addr,
8f2d6021 17169 bgp_get_name_by_role(peer->local_role),
7dddd1f7 17170 CHECK_FLAG(peer->flags, PEER_FLAG_ROLE_STRICT_MODE)
d864dd9e
EB
17171 ? " strict-mode"
17172 : "");
d864dd9e 17173
dd65f45e 17174 /* ttl-security hops */
e2521429 17175 if (peer->gtsm_hops != BGP_GTSM_HOPS_DISABLED) {
dd65f45e
DL
17176 if (!peer_group_active(peer)
17177 || g_peer->gtsm_hops != peer->gtsm_hops) {
17178 vty_out(vty, " neighbor %s ttl-security hops %d\n",
17179 addr, peer->gtsm_hops);
17180 }
17181 }
17182
17183 /* disable-connected-check */
17184 if (peergroup_flag_check(peer, PEER_FLAG_DISABLE_CONNECTED_CHECK))
17185 vty_out(vty, " neighbor %s disable-connected-check\n", addr);
17186
27aa23a4
DA
17187 /* link-bw-encoding-ieee */
17188 if (peergroup_flag_check(peer, PEER_FLAG_DISABLE_LINK_BW_ENCODING_IEEE))
17189 vty_out(vty, " neighbor %s disable-link-bw-encoding-ieee\n",
17190 addr);
17191
d08c0c80
DA
17192 /* extended-optional-parameters */
17193 if (peergroup_flag_check(peer, PEER_FLAG_EXTENDED_OPT_PARAMS))
17194 vty_out(vty, " neighbor %s extended-optional-parameters\n",
17195 addr);
17196
dd65f45e
DL
17197 /* enforce-first-as */
17198 if (peergroup_flag_check(peer, PEER_FLAG_ENFORCE_FIRST_AS))
17199 vty_out(vty, " neighbor %s enforce-first-as\n", addr);
17200
17201 /* update-source */
17202 if (peergroup_flag_check(peer, PEER_FLAG_UPDATE_SOURCE)) {
17203 if (peer->update_source)
47e12884
DA
17204 vty_out(vty, " neighbor %s update-source %pSU\n", addr,
17205 peer->update_source);
dd65f45e
DL
17206 else if (peer->update_if)
17207 vty_out(vty, " neighbor %s update-source %s\n", addr,
17208 peer->update_if);
17209 }
17210
17211 /* advertisement-interval */
17212 if (peergroup_flag_check(peer, PEER_FLAG_ROUTEADV))
17213 vty_out(vty, " neighbor %s advertisement-interval %u\n", addr,
17214 peer->routeadv);
17215
17216 /* timers */
17217 if (peergroup_flag_check(peer, PEER_FLAG_TIMER))
17218 vty_out(vty, " neighbor %s timers %u %u\n", addr,
17219 peer->keepalive, peer->holdtime);
17220
17221 /* timers connect */
17222 if (peergroup_flag_check(peer, PEER_FLAG_TIMER_CONNECT))
17223 vty_out(vty, " neighbor %s timers connect %u\n", addr,
17224 peer->connect);
5d5393b9
DL
17225 /* need special-case handling for changed default values due to
17226 * config profile / version (because there is no "timers bgp connect"
17227 * command, we need to save this per-peer :/)
17228 */
17229 else if (!peer_group_active(peer) && !peer->connect &&
17230 peer->bgp->default_connect_retry != SAVE_BGP_CONNECT_RETRY)
17231 vty_out(vty, " neighbor %s timers connect %u\n", addr,
17232 peer->bgp->default_connect_retry);
dd65f45e 17233
d43114f3
DS
17234 /* timers delayopen */
17235 if (peergroup_flag_check(peer, PEER_FLAG_TIMER_DELAYOPEN))
17236 vty_out(vty, " neighbor %s timers delayopen %u\n", addr,
17237 peer->delayopen);
17238 /* Save config even though flag is not set if default values have been
17239 * changed
17240 */
17241 else if (!peer_group_active(peer) && !peer->delayopen
17242 && peer->bgp->default_delayopen != BGP_DEFAULT_DELAYOPEN)
17243 vty_out(vty, " neighbor %s timers delayopen %u\n", addr,
17244 peer->bgp->default_delayopen);
17245
dd65f45e
DL
17246 /* capability dynamic */
17247 if (peergroup_flag_check(peer, PEER_FLAG_DYNAMIC_CAPABILITY))
17248 vty_out(vty, " neighbor %s capability dynamic\n", addr);
17249
17250 /* capability extended-nexthop */
17251 if (peergroup_flag_check(peer, PEER_FLAG_CAPABILITY_ENHE)) {
8e89adc1
DS
17252 if (CHECK_FLAG(peer->flags_invert, PEER_FLAG_CAPABILITY_ENHE) &&
17253 !peer->conf_if)
843770f6
DA
17254 vty_out(vty,
17255 " no neighbor %s capability extended-nexthop\n",
17256 addr);
17257 else if (!peer->conf_if)
17258 vty_out(vty,
17259 " neighbor %s capability extended-nexthop\n",
17260 addr);
dd65f45e
DL
17261 }
17262
17263 /* dont-capability-negotiation */
17264 if (peergroup_flag_check(peer, PEER_FLAG_DONT_CAPABILITY))
17265 vty_out(vty, " neighbor %s dont-capability-negotiate\n", addr);
17266
17267 /* override-capability */
17268 if (peergroup_flag_check(peer, PEER_FLAG_OVERRIDE_CAPABILITY))
17269 vty_out(vty, " neighbor %s override-capability\n", addr);
17270
17271 /* strict-capability-match */
17272 if (peergroup_flag_check(peer, PEER_FLAG_STRICT_CAP_MATCH))
17273 vty_out(vty, " neighbor %s strict-capability-match\n", addr);
17274
17275 /* Sender side AS path loop detection. */
17276 if (peer->as_path_loop_detection)
17277 vty_out(vty, " neighbor %s sender-as-path-loop-detection\n",
17278 addr);
cfd47646 17279
17280 if (!CHECK_FLAG(peer->peer_gr_new_status_flag,
13909c4f 17281 PEER_GRACEFUL_RESTART_NEW_STATE_INHERIT)) {
cfd47646 17282
17283 if (CHECK_FLAG(peer->peer_gr_new_status_flag,
13909c4f 17284 PEER_GRACEFUL_RESTART_NEW_STATE_HELPER)) {
cfd47646 17285 vty_out(vty,
17286 " neighbor %s graceful-restart-helper\n", addr);
13909c4f
DS
17287 } else if (CHECK_FLAG(
17288 peer->peer_gr_new_status_flag,
17289 PEER_GRACEFUL_RESTART_NEW_STATE_RESTART)) {
cfd47646 17290 vty_out(vty,
17291 " neighbor %s graceful-restart\n", addr);
13909c4f
DS
17292 } else if (
17293 (!(CHECK_FLAG(peer->peer_gr_new_status_flag,
17294 PEER_GRACEFUL_RESTART_NEW_STATE_HELPER))
17295 && !(CHECK_FLAG(
17296 peer->peer_gr_new_status_flag,
17297 PEER_GRACEFUL_RESTART_NEW_STATE_RESTART)))) {
17298 vty_out(vty, " neighbor %s graceful-restart-disable\n",
17299 addr);
cfd47646 17300 }
17301 }
dd65f45e
DL
17302}
17303
17304/* BGP peer configuration display function. */
17305static void bgp_config_write_peer_af(struct vty *vty, struct bgp *bgp,
17306 struct peer *peer, afi_t afi, safi_t safi)
17307{
17308 struct peer *g_peer = NULL;
17309 char *addr;
17310 bool flag_scomm, flag_secomm, flag_slcomm;
17311
17312 /* Skip dynamic neighbors. */
17313 if (peer_dynamic_neighbor(peer))
17314 return;
17315
17316 if (peer->conf_if)
17317 addr = peer->conf_if;
17318 else
17319 addr = peer->host;
17320
17321 /************************************
17322 ****** Per AF to the neighbor ******
17323 ************************************/
17324 if (peer_group_active(peer)) {
17325 g_peer = peer->group->conf;
17326
17327 /* If the peer-group is active but peer is not, print a 'no
17328 * activate' */
17329 if (g_peer->afc[afi][safi] && !peer->afc[afi][safi]) {
17330 vty_out(vty, " no neighbor %s activate\n", addr);
17331 }
17332
17333 /* If the peer-group is not active but peer is, print an
17334 'activate' */
17335 else if (!g_peer->afc[afi][safi] && peer->afc[afi][safi]) {
17336 vty_out(vty, " neighbor %s activate\n", addr);
17337 }
17338 } else {
17339 if (peer->afc[afi][safi]) {
38d11af5
TA
17340 if (safi == SAFI_ENCAP)
17341 vty_out(vty, " neighbor %s activate\n", addr);
17342 else if (!bgp->default_af[afi][safi])
dd65f45e
DL
17343 vty_out(vty, " neighbor %s activate\n", addr);
17344 } else {
38d11af5
TA
17345 if (bgp->default_af[afi][safi])
17346 vty_out(vty, " no neighbor %s activate\n",
17347 addr);
dd65f45e
DL
17348 }
17349 }
17350
17351 /* addpath TX knobs */
17352 if (peergroup_af_addpath_check(peer, afi, safi)) {
17353 switch (peer->addpath_type[afi][safi]) {
17354 case BGP_ADDPATH_ALL:
17355 vty_out(vty, " neighbor %s addpath-tx-all-paths\n",
17356 addr);
17357 break;
17358 case BGP_ADDPATH_BEST_PER_AS:
17359 vty_out(vty,
17360 " neighbor %s addpath-tx-bestpath-per-AS\n",
17361 addr);
17362 break;
17363 case BGP_ADDPATH_MAX:
17364 case BGP_ADDPATH_NONE:
17365 break;
17366 }
17367 }
17368
7c0e4312
DA
17369 if (CHECK_FLAG(peer->af_flags[afi][safi], PEER_FLAG_DISABLE_ADDPATH_RX))
17370 vty_out(vty, " neighbor %s disable-addpath-rx\n", addr);
17371
dd65f45e
DL
17372 /* ORF capability. */
17373 if (peergroup_af_flag_check(peer, afi, safi, PEER_FLAG_ORF_PREFIX_SM)
17374 || peergroup_af_flag_check(peer, afi, safi,
17375 PEER_FLAG_ORF_PREFIX_RM)) {
17376 vty_out(vty, " neighbor %s capability orf prefix-list", addr);
17377
17378 if (peergroup_af_flag_check(peer, afi, safi,
17379 PEER_FLAG_ORF_PREFIX_SM)
17380 && peergroup_af_flag_check(peer, afi, safi,
17381 PEER_FLAG_ORF_PREFIX_RM))
17382 vty_out(vty, " both");
17383 else if (peergroup_af_flag_check(peer, afi, safi,
17384 PEER_FLAG_ORF_PREFIX_SM))
17385 vty_out(vty, " send");
17386 else
17387 vty_out(vty, " receive");
17388 vty_out(vty, "\n");
17389 }
17390
dd65f45e
DL
17391 /* Route reflector client. */
17392 if (peergroup_af_flag_check(peer, afi, safi,
17393 PEER_FLAG_REFLECTOR_CLIENT)) {
17394 vty_out(vty, " neighbor %s route-reflector-client\n", addr);
17395 }
17396
17397 /* next-hop-self force */
17398 if (peergroup_af_flag_check(peer, afi, safi,
17399 PEER_FLAG_FORCE_NEXTHOP_SELF)) {
17400 vty_out(vty, " neighbor %s next-hop-self force\n", addr);
17401 }
17402
17403 /* next-hop-self */
17404 if (peergroup_af_flag_check(peer, afi, safi, PEER_FLAG_NEXTHOP_SELF)) {
17405 vty_out(vty, " neighbor %s next-hop-self\n", addr);
17406 }
17407
17408 /* remove-private-AS */
17409 if (peergroup_af_flag_check(peer, afi, safi,
17410 PEER_FLAG_REMOVE_PRIVATE_AS_ALL_REPLACE)) {
17411 vty_out(vty, " neighbor %s remove-private-AS all replace-AS\n",
17412 addr);
17413 }
17414
17415 else if (peergroup_af_flag_check(peer, afi, safi,
17416 PEER_FLAG_REMOVE_PRIVATE_AS_REPLACE)) {
17417 vty_out(vty, " neighbor %s remove-private-AS replace-AS\n",
17418 addr);
17419 }
17420
17421 else if (peergroup_af_flag_check(peer, afi, safi,
17422 PEER_FLAG_REMOVE_PRIVATE_AS_ALL)) {
17423 vty_out(vty, " neighbor %s remove-private-AS all\n", addr);
17424 }
17425
17426 else if (peergroup_af_flag_check(peer, afi, safi,
17427 PEER_FLAG_REMOVE_PRIVATE_AS)) {
17428 vty_out(vty, " neighbor %s remove-private-AS\n", addr);
17429 }
17430
17431 /* as-override */
17432 if (peergroup_af_flag_check(peer, afi, safi, PEER_FLAG_AS_OVERRIDE)) {
17433 vty_out(vty, " neighbor %s as-override\n", addr);
17434 }
17435
17436 /* send-community print. */
17437 flag_scomm = peergroup_af_flag_check(peer, afi, safi,
17438 PEER_FLAG_SEND_COMMUNITY);
17439 flag_secomm = peergroup_af_flag_check(peer, afi, safi,
17440 PEER_FLAG_SEND_EXT_COMMUNITY);
17441 flag_slcomm = peergroup_af_flag_check(peer, afi, safi,
17442 PEER_FLAG_SEND_LARGE_COMMUNITY);
17443
17444 if (flag_scomm && flag_secomm && flag_slcomm) {
17445 vty_out(vty, " no neighbor %s send-community all\n", addr);
17446 } else {
17447 if (flag_scomm)
17448 vty_out(vty, " no neighbor %s send-community\n", addr);
17449 if (flag_secomm)
17450 vty_out(vty,
17451 " no neighbor %s send-community extended\n",
17452 addr);
17453
17454 if (flag_slcomm)
17455 vty_out(vty, " no neighbor %s send-community large\n",
17456 addr);
17457 }
17458
17459 /* Default information */
17460 if (peergroup_af_flag_check(peer, afi, safi,
17461 PEER_FLAG_DEFAULT_ORIGINATE)) {
17462 vty_out(vty, " neighbor %s default-originate", addr);
17463
17464 if (peer->default_rmap[afi][safi].name)
17465 vty_out(vty, " route-map %s",
17466 peer->default_rmap[afi][safi].name);
17467
17468 vty_out(vty, "\n");
17469 }
17470
17471 /* Soft reconfiguration inbound. */
17472 if (peergroup_af_flag_check(peer, afi, safi, PEER_FLAG_SOFT_RECONFIG)) {
17473 vty_out(vty, " neighbor %s soft-reconfiguration inbound\n",
17474 addr);
17475 }
17476
17477 /* maximum-prefix. */
17478 if (peergroup_af_flag_check(peer, afi, safi, PEER_FLAG_MAX_PREFIX)) {
6cde4b45 17479 vty_out(vty, " neighbor %s maximum-prefix %u", addr,
dd65f45e
DL
17480 peer->pmax[afi][safi]);
17481
17482 if (peer->pmax_threshold[afi][safi]
17483 != MAXIMUM_PREFIX_THRESHOLD_DEFAULT)
17484 vty_out(vty, " %u", peer->pmax_threshold[afi][safi]);
17485 if (peer_af_flag_check(peer, afi, safi,
17486 PEER_FLAG_MAX_PREFIX_WARNING))
17487 vty_out(vty, " warning-only");
17488 if (peer->pmax_restart[afi][safi])
17489 vty_out(vty, " restart %u",
17490 peer->pmax_restart[afi][safi]);
9cbd06e0
DA
17491 if (peer_af_flag_check(peer, afi, safi,
17492 PEER_FLAG_MAX_PREFIX_FORCE))
17493 vty_out(vty, " force");
dd65f45e
DL
17494
17495 vty_out(vty, "\n");
17496 }
17497
fde246e8
DA
17498 /* maximum-prefix-out */
17499 if (peergroup_af_flag_check(peer, afi, safi, PEER_FLAG_MAX_PREFIX_OUT))
6cde4b45 17500 vty_out(vty, " neighbor %s maximum-prefix-out %u\n",
fde246e8
DA
17501 addr, peer->pmax_out[afi][safi]);
17502
dd65f45e
DL
17503 /* Route server client. */
17504 if (peergroup_af_flag_check(peer, afi, safi,
17505 PEER_FLAG_RSERVER_CLIENT)) {
17506 vty_out(vty, " neighbor %s route-server-client\n", addr);
17507 }
17508
17509 /* Nexthop-local unchanged. */
17510 if (peergroup_af_flag_check(peer, afi, safi,
17511 PEER_FLAG_NEXTHOP_LOCAL_UNCHANGED)) {
17512 vty_out(vty, " neighbor %s nexthop-local unchanged\n", addr);
17513 }
17514
17515 /* allowas-in <1-10> */
17516 if (peergroup_af_flag_check(peer, afi, safi, PEER_FLAG_ALLOWAS_IN)) {
17517 if (peer_af_flag_check(peer, afi, safi,
17518 PEER_FLAG_ALLOWAS_IN_ORIGIN)) {
17519 vty_out(vty, " neighbor %s allowas-in origin\n", addr);
17520 } else if (peer->allowas_in[afi][safi] == 3) {
17521 vty_out(vty, " neighbor %s allowas-in\n", addr);
17522 } else {
17523 vty_out(vty, " neighbor %s allowas-in %d\n", addr,
17524 peer->allowas_in[afi][safi]);
17525 }
17526 }
17527
46dbf9d0
DA
17528 /* accept-own */
17529 if (peergroup_af_flag_check(peer, afi, safi, PEER_FLAG_ACCEPT_OWN))
17530 vty_out(vty, " neighbor %s accept-own\n", addr);
17531
01da2d26
DA
17532 /* soo */
17533 if (peergroup_af_flag_check(peer, afi, safi, PEER_FLAG_SOO)) {
17534 char *soo_str = ecommunity_ecom2str(
17535 peer->soo[afi][safi], ECOMMUNITY_FORMAT_ROUTE_MAP, 0);
17536
17537 vty_out(vty, " neighbor %s soo %s\n", addr, soo_str);
17538 XFREE(MTYPE_ECOMMUNITY_STR, soo_str);
17539 }
17540
dd65f45e
DL
17541 /* weight */
17542 if (peergroup_af_flag_check(peer, afi, safi, PEER_FLAG_WEIGHT))
17543 vty_out(vty, " neighbor %s weight %lu\n", addr,
17544 peer->weight[afi][safi]);
17545
17546 /* Filter. */
17547 bgp_config_write_filter(vty, peer, afi, safi);
17548
17549 /* atribute-unchanged. */
17550 if (peer_af_flag_check(peer, afi, safi, PEER_FLAG_AS_PATH_UNCHANGED)
17551 || (safi != SAFI_EVPN
17552 && peer_af_flag_check(peer, afi, safi,
17553 PEER_FLAG_NEXTHOP_UNCHANGED))
17554 || peer_af_flag_check(peer, afi, safi, PEER_FLAG_MED_UNCHANGED)) {
17555
17556 if (!peer_group_active(peer)
17557 || peergroup_af_flag_check(peer, afi, safi,
17558 PEER_FLAG_AS_PATH_UNCHANGED)
17559 || peergroup_af_flag_check(peer, afi, safi,
17560 PEER_FLAG_NEXTHOP_UNCHANGED)
17561 || peergroup_af_flag_check(peer, afi, safi,
17562 PEER_FLAG_MED_UNCHANGED)) {
17563
17564 vty_out(vty,
17565 " neighbor %s attribute-unchanged%s%s%s\n",
17566 addr,
17567 peer_af_flag_check(peer, afi, safi,
17568 PEER_FLAG_AS_PATH_UNCHANGED)
17569 ? " as-path"
17570 : "",
17571 peer_af_flag_check(peer, afi, safi,
17572 PEER_FLAG_NEXTHOP_UNCHANGED)
17573 ? " next-hop"
17574 : "",
17575 peer_af_flag_check(peer, afi, safi,
17576 PEER_FLAG_MED_UNCHANGED)
17577 ? " med"
17578 : "");
17579 }
17580 }
70cd87ca
MK
17581
17582 if (peer_af_flag_check(peer, afi, safi, PEER_FLAG_ORR_GROUP))
17583 vty_out(vty, " neighbor %s optimal-route-reflection %s\n",
5fcf01c9 17584 addr, peer->orr_group_name[afi][safi]);
dd65f45e
DL
17585}
17586
a486300b
PG
17587static void bgp_vpn_config_write(struct vty *vty, struct bgp *bgp, afi_t afi,
17588 safi_t safi)
17589{
17590 if (!CHECK_FLAG(bgp->af_flags[afi][safi],
17591 BGP_VPNVX_RETAIN_ROUTE_TARGET_ALL))
17592 vty_out(vty, " no bgp retain route-target all\n");
17593}
17594
dd65f45e
DL
17595/* Address family based peer configuration display. */
17596static void bgp_config_write_family(struct vty *vty, struct bgp *bgp, afi_t afi,
17597 safi_t safi)
17598{
17599 struct peer *peer;
17600 struct peer_group *group;
17601 struct listnode *node, *nnode;
17602
17603
17604 vty_frame(vty, " !\n address-family ");
17605 if (afi == AFI_IP) {
17606 if (safi == SAFI_UNICAST)
17607 vty_frame(vty, "ipv4 unicast");
17608 else if (safi == SAFI_LABELED_UNICAST)
17609 vty_frame(vty, "ipv4 labeled-unicast");
17610 else if (safi == SAFI_MULTICAST)
17611 vty_frame(vty, "ipv4 multicast");
17612 else if (safi == SAFI_MPLS_VPN)
17613 vty_frame(vty, "ipv4 vpn");
17614 else if (safi == SAFI_ENCAP)
17615 vty_frame(vty, "ipv4 encap");
17616 else if (safi == SAFI_FLOWSPEC)
17617 vty_frame(vty, "ipv4 flowspec");
17618 } else if (afi == AFI_IP6) {
17619 if (safi == SAFI_UNICAST)
17620 vty_frame(vty, "ipv6 unicast");
17621 else if (safi == SAFI_LABELED_UNICAST)
17622 vty_frame(vty, "ipv6 labeled-unicast");
17623 else if (safi == SAFI_MULTICAST)
17624 vty_frame(vty, "ipv6 multicast");
17625 else if (safi == SAFI_MPLS_VPN)
17626 vty_frame(vty, "ipv6 vpn");
17627 else if (safi == SAFI_ENCAP)
17628 vty_frame(vty, "ipv6 encap");
17629 else if (safi == SAFI_FLOWSPEC)
17630 vty_frame(vty, "ipv6 flowspec");
17631 } else if (afi == AFI_L2VPN) {
17632 if (safi == SAFI_EVPN)
17633 vty_frame(vty, "l2vpn evpn");
17634 }
17635 vty_frame(vty, "\n");
17636
17637 bgp_config_write_distance(vty, bgp, afi, safi);
17638
17639 bgp_config_write_network(vty, bgp, afi, safi);
17640
17641 bgp_config_write_redistribute(vty, bgp, afi, safi);
17642
8a4e7fe6
DA
17643 /* BGP flag dampening. */
17644 if (CHECK_FLAG(bgp->af_flags[afi][safi], BGP_CONFIG_DAMPENING))
6c75f4b3 17645 bgp_config_write_damp(vty, afi, safi);
8a4e7fe6 17646
dd65f45e
DL
17647 for (ALL_LIST_ELEMENTS(bgp->group, node, nnode, group))
17648 bgp_config_write_peer_af(vty, bgp, group->conf, afi, safi);
17649
17650 for (ALL_LIST_ELEMENTS(bgp->peer, node, nnode, peer)) {
dd65f45e
DL
17651 /* Do not display doppelganger peers */
17652 if (CHECK_FLAG(peer->flags, PEER_FLAG_CONFIG_NODE))
17653 bgp_config_write_peer_af(vty, bgp, peer, afi, safi);
17654 }
17655
17656 bgp_config_write_maxpaths(vty, bgp, afi, safi);
17657 bgp_config_write_table_map(vty, bgp, afi, safi);
17658
17659 if (safi == SAFI_EVPN)
17660 bgp_config_write_evpn_info(vty, bgp, afi, safi);
17661
17662 if (safi == SAFI_FLOWSPEC)
17663 bgp_fs_config_write_pbr(vty, bgp, afi, safi);
17664
a486300b
PG
17665 if (safi == SAFI_MPLS_VPN)
17666 bgp_vpn_config_write(vty, bgp, afi, safi);
17667
dd65f45e
DL
17668 if (safi == SAFI_UNICAST) {
17669 bgp_vpn_policy_config_write_afi(vty, bgp, afi);
17670 if (CHECK_FLAG(bgp->af_flags[afi][safi],
17671 BGP_CONFIG_VRF_TO_MPLSVPN_EXPORT)) {
17672
17673 vty_out(vty, " export vpn\n");
17674 }
17675 if (CHECK_FLAG(bgp->af_flags[afi][safi],
17676 BGP_CONFIG_MPLSVPN_TO_VRF_IMPORT)) {
17677
17678 vty_out(vty, " import vpn\n");
17679 }
17680 if (CHECK_FLAG(bgp->af_flags[afi][safi],
17681 BGP_CONFIG_VRF_TO_VRF_IMPORT)) {
17682 char *name;
17683
17684 for (ALL_LIST_ELEMENTS_RO(
17685 bgp->vpn_policy[afi].import_vrf, node,
17686 name))
17687 vty_out(vty, " import vrf %s\n", name);
17688 }
17689 }
17690
70cd87ca
MK
17691 /* Optimal Route Reflection */
17692 bgp_config_write_orr(vty, bgp, afi, safi);
17693
dd65f45e
DL
17694 vty_endframe(vty, " exit-address-family\n");
17695}
17696
17697int bgp_config_write(struct vty *vty)
17698{
17699 struct bgp *bgp;
17700 struct peer_group *group;
17701 struct peer *peer;
17702 struct listnode *node, *nnode;
17703 struct listnode *mnode, *mnnode;
b16bcbba
TA
17704 afi_t afi;
17705 safi_t safi;
efc9b57d 17706 uint32_t tovpn_sid_index = 0;
dd65f45e
DL
17707
17708 if (bm->rmap_update_timer != RMAP_DEFAULT_UPDATE_TIMER)
17709 vty_out(vty, "bgp route-map delay-timer %u\n",
17710 bm->rmap_update_timer);
17711
d70583f7
D
17712 if (bm->v_update_delay != BGP_UPDATE_DELAY_DEF) {
17713 vty_out(vty, "bgp update-delay %d", bm->v_update_delay);
17714 if (bm->v_update_delay != bm->v_establish_wait)
17715 vty_out(vty, " %d", bm->v_establish_wait);
17716 vty_out(vty, "\n");
17717 }
17718
9acb67cb
DS
17719 if (bm->wait_for_fib)
17720 vty_out(vty, "bgp suppress-fib-pending\n");
17721
05bd726c 17722 if (CHECK_FLAG(bm->flags, BM_FLAG_GRACEFUL_SHUTDOWN))
17723 vty_out(vty, "bgp graceful-shutdown\n");
17724
c163f297
DS
17725 /* No-RIB (Zebra) option flag configuration */
17726 if (bgp_option_check(BGP_OPT_NO_FIB))
17727 vty_out(vty, "bgp no-rib\n");
17728
870791a3
IR
17729 if (CHECK_FLAG(bm->flags, BM_FLAG_SEND_EXTRA_DATA_TO_ZEBRA))
17730 vty_out(vty, "bgp send-extra-data zebra\n");
e46723a5 17731
425bd64b
PS
17732 /* BGP session DSCP value */
17733 if (bm->tcp_dscp != IPTOS_PREC_INTERNETCONTROL)
17734 vty_out(vty, "bgp session-dscp %u\n", bm->tcp_dscp >> 2);
17735
dd65f45e
DL
17736 /* BGP configuration. */
17737 for (ALL_LIST_ELEMENTS(bm->bgp, mnode, mnnode, bgp)) {
17738
17739 /* skip all auto created vrf as they dont have user config */
17740 if (CHECK_FLAG(bgp->vrf_flags, BGP_VRF_AUTO))
17741 continue;
17742
17743 /* Router bgp ASN */
17744 vty_out(vty, "router bgp %u", bgp->as);
17745
17746 if (bgp->name)
17747 vty_out(vty, " %s %s",
17748 (bgp->inst_type == BGP_INSTANCE_TYPE_VIEW)
17749 ? "view" : "vrf", bgp->name);
17750 vty_out(vty, "\n");
17751
17752 /* BGP fast-external-failover. */
17753 if (CHECK_FLAG(bgp->flags, BGP_FLAG_NO_FAST_EXT_FAILOVER))
17754 vty_out(vty, " no bgp fast-external-failover\n");
17755
17756 /* BGP router ID. */
3a6290bd 17757 if (bgp->router_id_static.s_addr != INADDR_ANY)
23d0a753
DA
17758 vty_out(vty, " bgp router-id %pI4\n",
17759 &bgp->router_id_static);
dd65f45e 17760
c208c586
S
17761 /* Suppress fib pending */
17762 if (CHECK_FLAG(bgp->flags, BGP_FLAG_SUPPRESS_FIB_PENDING))
17763 vty_out(vty, " bgp suppress-fib-pending\n");
17764
dd65f45e 17765 /* BGP log-neighbor-changes. */
892fedb6 17766 if (!!CHECK_FLAG(bgp->flags, BGP_FLAG_LOG_NEIGHBOR_CHANGES)
5d5393b9 17767 != SAVE_BGP_LOG_NEIGHBOR_CHANGES)
dd65f45e 17768 vty_out(vty, " %sbgp log-neighbor-changes\n",
892fedb6
DA
17769 CHECK_FLAG(bgp->flags,
17770 BGP_FLAG_LOG_NEIGHBOR_CHANGES)
dd65f45e
DL
17771 ? ""
17772 : "no ");
17773
17774 /* BGP configuration. */
892fedb6 17775 if (CHECK_FLAG(bgp->flags, BGP_FLAG_ALWAYS_COMPARE_MED))
dd65f45e
DL
17776 vty_out(vty, " bgp always-compare-med\n");
17777
17778 /* RFC8212 default eBGP policy. */
1d3fdccf
DA
17779 if (!!CHECK_FLAG(bgp->flags, BGP_FLAG_EBGP_REQUIRES_POLICY)
17780 != SAVE_BGP_EBGP_REQUIRES_POLICY)
17781 vty_out(vty, " %sbgp ebgp-requires-policy\n",
17782 CHECK_FLAG(bgp->flags,
17783 BGP_FLAG_EBGP_REQUIRES_POLICY)
17784 ? ""
17785 : "no ");
dd65f45e
DL
17786
17787 /* draft-ietf-idr-deprecate-as-set-confed-set */
7f972cd8 17788 if (bgp->reject_as_sets)
dd65f45e
DL
17789 vty_out(vty, " bgp reject-as-sets\n");
17790
2adac256
DA
17791 /* Suppress duplicate updates if the route actually not changed
17792 */
17793 if (!!CHECK_FLAG(bgp->flags, BGP_FLAG_SUPPRESS_DUPLICATES)
17794 != SAVE_BGP_SUPPRESS_DUPLICATES)
17795 vty_out(vty, " %sbgp suppress-duplicates\n",
17796 CHECK_FLAG(bgp->flags,
17797 BGP_FLAG_SUPPRESS_DUPLICATES)
17798 ? ""
17799 : "no ");
17800
1ae314be
DA
17801 /* Send Hard Reset CEASE Notification for 'Administrative Reset'
17802 */
17803 if (!!CHECK_FLAG(bgp->flags, BGP_FLAG_HARD_ADMIN_RESET) !=
17804 SAVE_BGP_HARD_ADMIN_RESET)
17805 vty_out(vty, " %sbgp hard-administrative-reset\n",
17806 CHECK_FLAG(bgp->flags,
17807 BGP_FLAG_HARD_ADMIN_RESET)
17808 ? ""
17809 : "no ");
17810
b16bcbba
TA
17811 /* BGP default <afi>-<safi> */
17812 FOREACH_AFI_SAFI (afi, safi) {
17813 if (afi == AFI_IP && safi == SAFI_UNICAST) {
17814 if (!bgp->default_af[afi][safi])
17815 vty_out(vty, " no bgp default %s\n",
17816 get_bgp_default_af_flag(afi,
17817 safi));
17818 } else if (bgp->default_af[afi][safi])
17819 vty_out(vty, " bgp default %s\n",
17820 get_bgp_default_af_flag(afi, safi));
17821 }
e84c59af 17822
dd65f45e
DL
17823 /* BGP default local-preference. */
17824 if (bgp->default_local_pref != BGP_DEFAULT_LOCAL_PREF)
17825 vty_out(vty, " bgp default local-preference %u\n",
17826 bgp->default_local_pref);
17827
17828 /* BGP default show-hostname */
892fedb6 17829 if (!!CHECK_FLAG(bgp->flags, BGP_FLAG_SHOW_HOSTNAME)
5d5393b9 17830 != SAVE_BGP_SHOW_HOSTNAME)
dd65f45e 17831 vty_out(vty, " %sbgp default show-hostname\n",
892fedb6 17832 CHECK_FLAG(bgp->flags, BGP_FLAG_SHOW_HOSTNAME)
dd65f45e
DL
17833 ? ""
17834 : "no ");
17835
aef999a2
DA
17836 /* BGP default show-nexthop-hostname */
17837 if (!!CHECK_FLAG(bgp->flags, BGP_FLAG_SHOW_NEXTHOP_HOSTNAME)
17838 != SAVE_BGP_SHOW_HOSTNAME)
17839 vty_out(vty, " %sbgp default show-nexthop-hostname\n",
17840 CHECK_FLAG(bgp->flags,
17841 BGP_FLAG_SHOW_NEXTHOP_HOSTNAME)
17842 ? ""
17843 : "no ");
17844
dd65f45e
DL
17845 /* BGP default subgroup-pkt-queue-max. */
17846 if (bgp->default_subgroup_pkt_queue_max
17847 != BGP_DEFAULT_SUBGROUP_PKT_QUEUE_MAX)
17848 vty_out(vty, " bgp default subgroup-pkt-queue-max %u\n",
17849 bgp->default_subgroup_pkt_queue_max);
17850
17851 /* BGP client-to-client reflection. */
892fedb6 17852 if (CHECK_FLAG(bgp->flags, BGP_FLAG_NO_CLIENT_TO_CLIENT))
dd65f45e
DL
17853 vty_out(vty, " no bgp client-to-client reflection\n");
17854
17855 /* BGP cluster ID. */
17856 if (CHECK_FLAG(bgp->config, BGP_CONFIG_CLUSTER_ID))
23d0a753
DA
17857 vty_out(vty, " bgp cluster-id %pI4\n",
17858 &bgp->cluster_id);
dd65f45e
DL
17859
17860 /* Disable ebgp connected nexthop check */
892fedb6 17861 if (CHECK_FLAG(bgp->flags, BGP_FLAG_DISABLE_NH_CONNECTED_CHK))
dd65f45e
DL
17862 vty_out(vty,
17863 " bgp disable-ebgp-connected-route-check\n");
17864
17865 /* Confederation identifier*/
17866 if (CHECK_FLAG(bgp->config, BGP_CONFIG_CONFEDERATION))
17867 vty_out(vty, " bgp confederation identifier %u\n",
17868 bgp->confed_id);
17869
17870 /* Confederation peer */
17871 if (bgp->confed_peers_cnt > 0) {
17872 int i;
17873
17874 vty_out(vty, " bgp confederation peers");
17875
17876 for (i = 0; i < bgp->confed_peers_cnt; i++)
17877 vty_out(vty, " %u", bgp->confed_peers[i]);
17878
17879 vty_out(vty, "\n");
17880 }
17881
17882 /* BGP deterministic-med. */
892fedb6 17883 if (!!CHECK_FLAG(bgp->flags, BGP_FLAG_DETERMINISTIC_MED)
5d5393b9 17884 != SAVE_BGP_DETERMINISTIC_MED)
dd65f45e 17885 vty_out(vty, " %sbgp deterministic-med\n",
892fedb6
DA
17886 CHECK_FLAG(bgp->flags,
17887 BGP_FLAG_DETERMINISTIC_MED)
dd65f45e
DL
17888 ? ""
17889 : "no ");
17890
17891 /* BGP update-delay. */
17892 bgp_config_write_update_delay(vty, bgp);
17893
17894 if (bgp->v_maxmed_onstartup
17895 != BGP_MAXMED_ONSTARTUP_UNCONFIGURED) {
17896 vty_out(vty, " bgp max-med on-startup %u",
17897 bgp->v_maxmed_onstartup);
17898 if (bgp->maxmed_onstartup_value
17899 != BGP_MAXMED_VALUE_DEFAULT)
17900 vty_out(vty, " %u",
17901 bgp->maxmed_onstartup_value);
17902 vty_out(vty, "\n");
17903 }
17904 if (bgp->v_maxmed_admin != BGP_MAXMED_ADMIN_UNCONFIGURED) {
17905 vty_out(vty, " bgp max-med administrative");
17906 if (bgp->maxmed_admin_value != BGP_MAXMED_VALUE_DEFAULT)
17907 vty_out(vty, " %u", bgp->maxmed_admin_value);
17908 vty_out(vty, "\n");
17909 }
17910
17911 /* write quanta */
17912 bgp_config_write_wpkt_quanta(vty, bgp);
17913 /* read quanta */
17914 bgp_config_write_rpkt_quanta(vty, bgp);
17915
17916 /* coalesce time */
17917 bgp_config_write_coalesce_time(vty, bgp);
17918
05bd726c 17919 /* BGP per-instance graceful-shutdown */
17920 /* BGP-wide settings and per-instance settings are mutually
17921 * exclusive.
17922 */
17923 if (!CHECK_FLAG(bm->flags, BM_FLAG_GRACEFUL_SHUTDOWN))
17924 if (CHECK_FLAG(bgp->flags, BGP_FLAG_GRACEFUL_SHUTDOWN))
17925 vty_out(vty, " bgp graceful-shutdown\n");
17926
8606be87
DA
17927 /* Long-lived Graceful Restart */
17928 if (bgp->llgr_stale_time != BGP_DEFAULT_LLGR_STALE_TIME)
17929 vty_out(vty,
17930 " bgp long-lived-graceful-restart stale-time %u\n",
17931 bgp->llgr_stale_time);
17932
dd65f45e
DL
17933 /* BGP graceful-restart. */
17934 if (bgp->stalepath_time != BGP_DEFAULT_STALEPATH_TIME)
17935 vty_out(vty,
17936 " bgp graceful-restart stalepath-time %u\n",
17937 bgp->stalepath_time);
cfd47646 17938
dd65f45e
DL
17939 if (bgp->restart_time != BGP_DEFAULT_RESTART_TIME)
17940 vty_out(vty, " bgp graceful-restart restart-time %u\n",
17941 bgp->restart_time);
cfd47646 17942
f2ca5c5b
DA
17943 if (!!CHECK_FLAG(bgp->flags, BGP_FLAG_GRACEFUL_NOTIFICATION) !=
17944 SAVE_BGP_GRACEFUL_NOTIFICATION)
17945 vty_out(vty, " %sbgp graceful-restart notification\n",
17946 CHECK_FLAG(bgp->flags,
17947 BGP_FLAG_GRACEFUL_NOTIFICATION)
17948 ? ""
17949 : "no ");
17950
cfd47646 17951 if (bgp->select_defer_time != BGP_DEFAULT_SELECT_DEFERRAL_TIME)
17952 vty_out(vty,
17953 " bgp graceful-restart select-defer-time %u\n",
17954 bgp->select_defer_time);
17955
17956 if (bgp_global_gr_mode_get(bgp) == GLOBAL_GR)
dd65f45e
DL
17957 vty_out(vty, " bgp graceful-restart\n");
17958
cfd47646 17959 if (bgp_global_gr_mode_get(bgp) == GLOBAL_DISABLE)
17960 vty_out(vty, " bgp graceful-restart-disable\n");
17961
dd65f45e 17962 /* BGP graceful-restart Preserve State F bit. */
892fedb6 17963 if (CHECK_FLAG(bgp->flags, BGP_FLAG_GR_PRESERVE_FWD))
dd65f45e
DL
17964 vty_out(vty,
17965 " bgp graceful-restart preserve-fw-state\n");
17966
d1adb448
PG
17967 /* BGP TCP keepalive */
17968 bgp_config_tcp_keepalive(vty, bgp);
17969
dc95985f 17970 /* Stale timer for RIB */
17971 if (bgp->rib_stale_time != BGP_DEFAULT_RIB_STALE_TIME)
17972 vty_out(vty,
17973 " bgp graceful-restart rib-stale-time %u\n",
17974 bgp->rib_stale_time);
17975
dd65f45e 17976 /* BGP bestpath method. */
892fedb6 17977 if (CHECK_FLAG(bgp->flags, BGP_FLAG_ASPATH_IGNORE))
dd65f45e 17978 vty_out(vty, " bgp bestpath as-path ignore\n");
892fedb6 17979 if (CHECK_FLAG(bgp->flags, BGP_FLAG_ASPATH_CONFED))
dd65f45e
DL
17980 vty_out(vty, " bgp bestpath as-path confed\n");
17981
892fedb6
DA
17982 if (CHECK_FLAG(bgp->flags, BGP_FLAG_ASPATH_MULTIPATH_RELAX)) {
17983 if (CHECK_FLAG(bgp->flags,
17984 BGP_FLAG_MULTIPATH_RELAX_AS_SET)) {
dd65f45e
DL
17985 vty_out(vty,
17986 " bgp bestpath as-path multipath-relax as-set\n");
17987 } else {
17988 vty_out(vty,
17989 " bgp bestpath as-path multipath-relax\n");
17990 }
17991 }
17992
892fedb6 17993 if (CHECK_FLAG(bgp->flags, BGP_FLAG_RR_ALLOW_OUTBOUND_POLICY)) {
dd65f45e
DL
17994 vty_out(vty,
17995 " bgp route-reflector allow-outbound-policy\n");
17996 }
892fedb6 17997 if (CHECK_FLAG(bgp->flags, BGP_FLAG_COMPARE_ROUTER_ID))
dd65f45e 17998 vty_out(vty, " bgp bestpath compare-routerid\n");
892fedb6
DA
17999 if (CHECK_FLAG(bgp->flags, BGP_FLAG_MED_CONFED)
18000 || CHECK_FLAG(bgp->flags, BGP_FLAG_MED_MISSING_AS_WORST)) {
dd65f45e 18001 vty_out(vty, " bgp bestpath med");
892fedb6 18002 if (CHECK_FLAG(bgp->flags, BGP_FLAG_MED_CONFED))
dd65f45e 18003 vty_out(vty, " confed");
892fedb6
DA
18004 if (CHECK_FLAG(bgp->flags,
18005 BGP_FLAG_MED_MISSING_AS_WORST))
dd65f45e
DL
18006 vty_out(vty, " missing-as-worst");
18007 vty_out(vty, "\n");
18008 }
18009
ee88563a
JM
18010 if (CHECK_FLAG(bgp->flags, BGP_FLAG_PEERTYPE_MULTIPATH_RELAX))
18011 vty_out(vty,
18012 " bgp bestpath peer-type multipath-relax\n");
18013
f7e1c681 18014 /* Link bandwidth handling. */
18015 if (bgp->lb_handling == BGP_LINK_BW_IGNORE_BW)
18016 vty_out(vty, " bgp bestpath bandwidth ignore\n");
18017 else if (bgp->lb_handling == BGP_LINK_BW_SKIP_MISSING)
18018 vty_out(vty, " bgp bestpath bandwidth skip-missing\n");
18019 else if (bgp->lb_handling == BGP_LINK_BW_DEFWT_4_MISSING)
18020 vty_out(vty, " bgp bestpath bandwidth default-weight-for-missing\n");
18021
dd65f45e 18022 /* BGP network import check. */
892fedb6 18023 if (!!CHECK_FLAG(bgp->flags, BGP_FLAG_IMPORT_CHECK)
5d5393b9 18024 != SAVE_BGP_IMPORT_CHECK)
dd65f45e 18025 vty_out(vty, " %sbgp network import-check\n",
892fedb6 18026 CHECK_FLAG(bgp->flags, BGP_FLAG_IMPORT_CHECK)
dd65f45e
DL
18027 ? ""
18028 : "no ");
18029
18030 /* BGP timers configuration. */
5d5393b9 18031 if (bgp->default_keepalive != SAVE_BGP_KEEPALIVE
9800cfff 18032 || bgp->default_holdtime != SAVE_BGP_HOLDTIME)
dd65f45e
DL
18033 vty_out(vty, " timers bgp %u %u\n",
18034 bgp->default_keepalive, bgp->default_holdtime);
18035
b042667a
TI
18036 /* BGP minimum holdtime configuration. */
18037 if (bgp->default_min_holdtime != SAVE_BGP_HOLDTIME
18038 && bgp->default_min_holdtime != 0)
18039 vty_out(vty, " bgp minimum-holdtime %u\n",
18040 bgp->default_min_holdtime);
18041
389e4f92
QY
18042 /* Conditional advertisement timer configuration */
18043 if (bgp->condition_check_period
18044 != DEFAULT_CONDITIONAL_ROUTES_POLL_TIME)
18045 vty_out(vty,
18046 " bgp conditional-advertisement timer %u\n",
18047 bgp->condition_check_period);
18048
dd65f45e
DL
18049 /* peer-group */
18050 for (ALL_LIST_ELEMENTS(bgp->group, node, nnode, group)) {
18051 bgp_config_write_peer_global(vty, bgp, group->conf);
18052 }
18053
18054 /* Normal neighbor configuration. */
18055 for (ALL_LIST_ELEMENTS(bgp->peer, node, nnode, peer)) {
18056 if (CHECK_FLAG(peer->flags, PEER_FLAG_CONFIG_NODE))
18057 bgp_config_write_peer_global(vty, bgp, peer);
18058 }
18059
18060 /* listen range and limit for dynamic BGP neighbors */
18061 bgp_config_write_listen(vty, bgp);
18062
18063 /*
18064 * BGP default autoshutdown neighbors
18065 *
18066 * This must be placed after any peer and peer-group
18067 * configuration, to avoid setting all peers to shutdown after
18068 * a daemon restart, which is undesired behavior. (see #2286)
18069 */
18070 if (bgp->autoshutdown)
18071 vty_out(vty, " bgp default shutdown\n");
18072
9cf59432
DS
18073 /* BGP instance administrative shutdown */
18074 if (CHECK_FLAG(bgp->flags, BGP_FLAG_SHUTDOWN))
18075 vty_out(vty, " bgp shutdown\n");
18076
8666265e
DS
18077 if (bgp->allow_martian)
18078 vty_out(vty, " bgp allow-martian-nexthop\n");
18079
f852eb98
PG
18080 if (bgp->fast_convergence)
18081 vty_out(vty, " bgp fast-convergence\n");
18082
a0281b2e
HS
18083 if (bgp->srv6_enabled) {
18084 vty_frame(vty, " !\n segment-routing srv6\n");
96db4340 18085 if (strlen(bgp->srv6_locator_name))
a0281b2e
HS
18086 vty_out(vty, " locator %s\n",
18087 bgp->srv6_locator_name);
ff7c3ee1 18088 vty_endframe(vty, " exit\n");
a0281b2e
HS
18089 }
18090
efc9b57d
CS
18091 tovpn_sid_index = bgp->tovpn_sid_index;
18092 if (CHECK_FLAG(bgp->vrf_flags, BGP_VRF_TOVPN_SID_AUTO)) {
18093 vty_out(vty, " sid vpn per-vrf export auto\n");
18094 } else if (tovpn_sid_index != 0) {
18095 vty_out(vty, " sid vpn per-vrf export %d\n",
18096 tovpn_sid_index);
18097 }
a0281b2e 18098
dd65f45e
DL
18099 /* IPv4 unicast configuration. */
18100 bgp_config_write_family(vty, bgp, AFI_IP, SAFI_UNICAST);
18101
18102 /* IPv4 multicast configuration. */
18103 bgp_config_write_family(vty, bgp, AFI_IP, SAFI_MULTICAST);
18104
18105 /* IPv4 labeled-unicast configuration. */
18106 bgp_config_write_family(vty, bgp, AFI_IP, SAFI_LABELED_UNICAST);
18107
18108 /* IPv4 VPN configuration. */
18109 bgp_config_write_family(vty, bgp, AFI_IP, SAFI_MPLS_VPN);
18110
18111 /* ENCAPv4 configuration. */
18112 bgp_config_write_family(vty, bgp, AFI_IP, SAFI_ENCAP);
18113
18114 /* FLOWSPEC v4 configuration. */
18115 bgp_config_write_family(vty, bgp, AFI_IP, SAFI_FLOWSPEC);
18116
18117 /* IPv6 unicast configuration. */
18118 bgp_config_write_family(vty, bgp, AFI_IP6, SAFI_UNICAST);
18119
18120 /* IPv6 multicast configuration. */
18121 bgp_config_write_family(vty, bgp, AFI_IP6, SAFI_MULTICAST);
18122
18123 /* IPv6 labeled-unicast configuration. */
18124 bgp_config_write_family(vty, bgp, AFI_IP6,
18125 SAFI_LABELED_UNICAST);
18126
18127 /* IPv6 VPN configuration. */
18128 bgp_config_write_family(vty, bgp, AFI_IP6, SAFI_MPLS_VPN);
18129
18130 /* ENCAPv6 configuration. */
18131 bgp_config_write_family(vty, bgp, AFI_IP6, SAFI_ENCAP);
18132
18133 /* FLOWSPEC v6 configuration. */
18134 bgp_config_write_family(vty, bgp, AFI_IP6, SAFI_FLOWSPEC);
18135
18136 /* EVPN configuration. */
18137 bgp_config_write_family(vty, bgp, AFI_L2VPN, SAFI_EVPN);
18138
18139 hook_call(bgp_inst_config_write, bgp, vty);
18140
49e5a4a0 18141#ifdef ENABLE_BGP_VNC
dd65f45e
DL
18142 bgp_rfapi_cfg_write(vty, bgp);
18143#endif
18144
07679ad9 18145 vty_out(vty, "exit\n");
dd65f45e
DL
18146 vty_out(vty, "!\n");
18147 }
18148 return 0;
18149}
18150
ddb5b488 18151
718e3744 18152/* BGP node structure. */
d62a17ae 18153static struct cmd_node bgp_node = {
f4b8291f 18154 .name = "bgp",
62b346ee 18155 .node = BGP_NODE,
24389580 18156 .parent_node = CONFIG_NODE,
62b346ee 18157 .prompt = "%s(config-router)# ",
612c2c15 18158 .config_write = bgp_config_write,
718e3744 18159};
18160
d62a17ae 18161static struct cmd_node bgp_ipv4_unicast_node = {
f4b8291f 18162 .name = "bgp ipv4 unicast",
62b346ee 18163 .node = BGP_IPV4_NODE,
24389580 18164 .parent_node = BGP_NODE,
62b346ee 18165 .prompt = "%s(config-router-af)# ",
dd2c81b8 18166 .no_xpath = true,
718e3744 18167};
18168
d62a17ae 18169static struct cmd_node bgp_ipv4_multicast_node = {
f4b8291f 18170 .name = "bgp ipv4 multicast",
62b346ee 18171 .node = BGP_IPV4M_NODE,
24389580 18172 .parent_node = BGP_NODE,
62b346ee 18173 .prompt = "%s(config-router-af)# ",
dd2c81b8 18174 .no_xpath = true,
718e3744 18175};
18176
d62a17ae 18177static struct cmd_node bgp_ipv4_labeled_unicast_node = {
f4b8291f 18178 .name = "bgp ipv4 labeled unicast",
62b346ee 18179 .node = BGP_IPV4L_NODE,
24389580 18180 .parent_node = BGP_NODE,
62b346ee 18181 .prompt = "%s(config-router-af)# ",
dd2c81b8 18182 .no_xpath = true,
f51bae9c
DS
18183};
18184
d62a17ae 18185static struct cmd_node bgp_ipv6_unicast_node = {
a17cfb3f 18186 .name = "bgp ipv6 unicast",
62b346ee 18187 .node = BGP_IPV6_NODE,
24389580 18188 .parent_node = BGP_NODE,
62b346ee 18189 .prompt = "%s(config-router-af)# ",
dd2c81b8 18190 .no_xpath = true,
718e3744 18191};
18192
d62a17ae 18193static struct cmd_node bgp_ipv6_multicast_node = {
f4b8291f 18194 .name = "bgp ipv6 multicast",
62b346ee 18195 .node = BGP_IPV6M_NODE,
24389580 18196 .parent_node = BGP_NODE,
62b346ee 18197 .prompt = "%s(config-router-af)# ",
dd2c81b8 18198 .no_xpath = true,
25ffbdc1 18199};
18200
d62a17ae 18201static struct cmd_node bgp_ipv6_labeled_unicast_node = {
f4b8291f 18202 .name = "bgp ipv6 labeled unicast",
62b346ee 18203 .node = BGP_IPV6L_NODE,
24389580 18204 .parent_node = BGP_NODE,
62b346ee 18205 .prompt = "%s(config-router-af)# ",
dd2c81b8 18206 .no_xpath = true,
f51bae9c
DS
18207};
18208
62b346ee 18209static struct cmd_node bgp_vpnv4_node = {
f4b8291f 18210 .name = "bgp vpnv4",
62b346ee 18211 .node = BGP_VPNV4_NODE,
24389580 18212 .parent_node = BGP_NODE,
62b346ee 18213 .prompt = "%s(config-router-af)# ",
dd2c81b8 18214 .no_xpath = true,
62b346ee 18215};
6b0655a2 18216
62b346ee 18217static struct cmd_node bgp_vpnv6_node = {
f4b8291f 18218 .name = "bgp vpnv6",
62b346ee 18219 .node = BGP_VPNV6_NODE,
24389580 18220 .parent_node = BGP_NODE,
62b346ee 18221 .prompt = "%s(config-router-af-vpnv6)# ",
dd2c81b8 18222 .no_xpath = true,
62b346ee 18223};
8ecd3266 18224
62b346ee 18225static struct cmd_node bgp_evpn_node = {
f4b8291f 18226 .name = "bgp evpn",
62b346ee 18227 .node = BGP_EVPN_NODE,
24389580 18228 .parent_node = BGP_NODE,
62b346ee 18229 .prompt = "%s(config-router-evpn)# ",
dd2c81b8 18230 .no_xpath = true,
62b346ee 18231};
4e0b7b6d 18232
62b346ee 18233static struct cmd_node bgp_evpn_vni_node = {
f4b8291f 18234 .name = "bgp evpn vni",
62b346ee 18235 .node = BGP_EVPN_VNI_NODE,
24389580 18236 .parent_node = BGP_EVPN_NODE,
62b346ee 18237 .prompt = "%s(config-router-af-vni)# ",
62b346ee 18238};
90e60aa7 18239
62b346ee 18240static struct cmd_node bgp_flowspecv4_node = {
f4b8291f 18241 .name = "bgp ipv4 flowspec",
62b346ee 18242 .node = BGP_FLOWSPECV4_NODE,
24389580 18243 .parent_node = BGP_NODE,
62b346ee 18244 .prompt = "%s(config-router-af)# ",
dd2c81b8 18245 .no_xpath = true,
62b346ee 18246};
7c40bf39 18247
62b346ee 18248static struct cmd_node bgp_flowspecv6_node = {
f4b8291f 18249 .name = "bgp ipv6 flowspec",
62b346ee 18250 .node = BGP_FLOWSPECV6_NODE,
24389580 18251 .parent_node = BGP_NODE,
62b346ee 18252 .prompt = "%s(config-router-af-vpnv6)# ",
dd2c81b8 18253 .no_xpath = true,
62b346ee 18254};
7c40bf39 18255
bfaab44d
HS
18256static struct cmd_node bgp_srv6_node = {
18257 .name = "bgp srv6",
18258 .node = BGP_SRV6_NODE,
18259 .parent_node = BGP_NODE,
18260 .prompt = "%s(config-router-srv6)# ",
18261};
18262
d62a17ae 18263static void community_list_vty(void);
1f8ae70b 18264
8c20061f
DA
18265static void bgp_ac_peergroup(vector comps, struct cmd_token *token)
18266{
18267 struct bgp *bgp;
18268 struct peer_group *group;
18269 struct listnode *lnbgp, *lnpeer;
18270
18271 for (ALL_LIST_ELEMENTS_RO(bm->bgp, lnbgp, bgp)) {
18272 for (ALL_LIST_ELEMENTS_RO(bgp->group, lnpeer, group))
18273 vector_set(comps,
18274 XSTRDUP(MTYPE_COMPLETION, group->name));
18275 }
18276}
18277
18278static void bgp_ac_peer(vector comps, struct cmd_token *token)
b8a815e5 18279{
d62a17ae 18280 struct bgp *bgp;
18281 struct peer *peer;
d62a17ae 18282 struct listnode *lnbgp, *lnpeer;
b8a815e5 18283
d62a17ae 18284 for (ALL_LIST_ELEMENTS_RO(bm->bgp, lnbgp, bgp)) {
18285 for (ALL_LIST_ELEMENTS_RO(bgp->peer, lnpeer, peer)) {
18286 /* only provide suggestions on the appropriate input
18287 * token type,
18288 * they'll otherwise show up multiple times */
18289 enum cmd_token_type match_type;
18290 char *name = peer->host;
d48ed3e0 18291
d62a17ae 18292 if (peer->conf_if) {
18293 match_type = VARIABLE_TKN;
18294 name = peer->conf_if;
18295 } else if (strchr(peer->host, ':'))
18296 match_type = IPV6_TKN;
18297 else
18298 match_type = IPV4_TKN;
d48ed3e0 18299
d62a17ae 18300 if (token->type != match_type)
18301 continue;
d48ed3e0 18302
d62a17ae 18303 vector_set(comps, XSTRDUP(MTYPE_COMPLETION, name));
18304 }
d62a17ae 18305 }
b8a815e5
DL
18306}
18307
8c20061f
DA
18308static void bgp_ac_neighbor(vector comps, struct cmd_token *token)
18309{
18310 bgp_ac_peer(comps, token);
84de1483
DA
18311
18312 if (token->type == VARIABLE_TKN)
18313 bgp_ac_peergroup(comps, token);
8c20061f
DA
18314}
18315
b8a815e5 18316static const struct cmd_variable_handler bgp_var_neighbor[] = {
d62a17ae 18317 {.varname = "neighbor", .completions = bgp_ac_neighbor},
18318 {.varname = "neighbors", .completions = bgp_ac_neighbor},
7d4aea30 18319 {.varname = "peer", .completions = bgp_ac_neighbor},
d62a17ae 18320 {.completions = NULL}};
18321
47a306a0
DS
18322static const struct cmd_variable_handler bgp_var_peergroup[] = {
18323 {.tokenname = "PGNAME", .completions = bgp_ac_peergroup},
18324 {.completions = NULL} };
18325
aa24a36a
DA
18326DEFINE_HOOK(bgp_config_end, (struct bgp *bgp), (bgp));
18327
18328static struct thread *t_bgp_cfg;
18329
18330bool bgp_config_inprocess(void)
18331{
18332 return thread_is_scheduled(t_bgp_cfg);
18333}
18334
18335static void bgp_config_finish(struct thread *t)
18336{
18337 struct listnode *node;
18338 struct bgp *bgp;
18339
18340 for (ALL_LIST_ELEMENTS_RO(bm->bgp, node, bgp))
18341 hook_call(bgp_config_end, bgp);
18342}
18343
18344static void bgp_config_start(void)
18345{
18346#define BGP_PRE_CONFIG_MAX_WAIT_SECONDS 600
18347 THREAD_OFF(t_bgp_cfg);
18348 thread_add_timer(bm->master, bgp_config_finish, NULL,
18349 BGP_PRE_CONFIG_MAX_WAIT_SECONDS, &t_bgp_cfg);
18350}
18351
18352/* When we receive a hook the configuration is read,
18353 * we start a timer to make sure we postpone sending
18354 * EoR before route-maps are processed.
18355 * This is especially valid if using `bgp route-map delay-timer`.
18356 */
18357static void bgp_config_end(void)
18358{
18359#define BGP_POST_CONFIG_DELAY_SECONDS 1
18360 uint32_t bgp_post_config_delay =
18361 thread_is_scheduled(bm->t_rmap_update)
18362 ? thread_timer_remain_second(bm->t_rmap_update)
18363 : BGP_POST_CONFIG_DELAY_SECONDS;
18364
18365 /* If BGP config processing thread isn't running, then
18366 * we can return and rely it's properly handled.
18367 */
18368 if (!bgp_config_inprocess())
18369 return;
18370
18371 THREAD_OFF(t_bgp_cfg);
18372
18373 /* Start a new timer to make sure we don't send EoR
18374 * before route-maps are processed.
18375 */
18376 thread_add_timer(bm->master, bgp_config_finish, NULL,
18377 bgp_post_config_delay, &t_bgp_cfg);
18378}
18379
4cd690ae
PG
18380static int config_write_interface_one(struct vty *vty, struct vrf *vrf)
18381{
18382 int write = 0;
18383 struct interface *ifp;
18384 struct bgp_interface *iifp;
18385
18386 FOR_ALL_INTERFACES (vrf, ifp) {
18387 iifp = ifp->info;
18388 if (!iifp)
18389 continue;
18390
18391 if_vty_config_start(vty, ifp);
18392
18393 if (CHECK_FLAG(iifp->flags,
18394 BGP_INTERFACE_MPLS_BGP_FORWARDING)) {
18395 vty_out(vty, " mpls bgp forwarding\n");
18396 write++;
18397 }
18398
18399 if_vty_config_end(vty);
18400 }
18401
18402 return write;
18403}
18404
18405/* Configuration write function for bgpd. */
18406static int config_write_interface(struct vty *vty)
18407{
18408 int write = 0;
18409 struct vrf *vrf = NULL;
18410
18411 /* Display all VRF aware OSPF interface configuration */
18412 RB_FOREACH (vrf, vrf_name_head, &vrfs_by_name) {
18413 write += config_write_interface_one(vty, vrf);
18414 }
18415
18416 return write;
18417}
18418
18419DEFPY(mpls_bgp_forwarding, mpls_bgp_forwarding_cmd,
18420 "[no$no] mpls bgp forwarding",
18421 NO_STR MPLS_STR BGP_STR
18422 "Enable MPLS forwarding for eBGP directly connected peers\n")
18423{
18424 bool check;
18425 struct bgp_interface *iifp;
18426
18427 VTY_DECLVAR_CONTEXT(interface, ifp);
18428 iifp = ifp->info;
18429 if (!iifp) {
18430 vty_out(vty, "Interface %s not available\n", ifp->name);
18431 return CMD_WARNING_CONFIG_FAILED;
18432 }
18433 check = CHECK_FLAG(iifp->flags, BGP_INTERFACE_MPLS_BGP_FORWARDING);
18434 if (check != !no) {
18435 if (no)
18436 UNSET_FLAG(iifp->flags,
18437 BGP_INTERFACE_MPLS_BGP_FORWARDING);
18438 else
18439 SET_FLAG(iifp->flags,
18440 BGP_INTERFACE_MPLS_BGP_FORWARDING);
18441 /* trigger a nht update on eBGP sessions */
18442 if (if_is_operative(ifp))
18443 bgp_nht_ifp_up(ifp);
18444 }
18445 return CMD_SUCCESS;
18446}
18447
18448/* Initialization of BGP interface. */
18449static void bgp_vty_if_init(void)
18450{
18451 /* Install interface node. */
18452 if_cmd_init(config_write_interface);
18453
18454 /* "mpls bgp forwarding" commands. */
18455 install_element(INTERFACE_NODE, &mpls_bgp_forwarding_cmd);
18456}
18457
d62a17ae 18458void bgp_vty_init(void)
18459{
18460 cmd_variable_handler_register(bgp_var_neighbor);
47a306a0 18461 cmd_variable_handler_register(bgp_var_peergroup);
d62a17ae 18462
aa24a36a
DA
18463 cmd_init_config_callbacks(bgp_config_start, bgp_config_end);
18464
d62a17ae 18465 /* Install bgp top node. */
612c2c15
DL
18466 install_node(&bgp_node);
18467 install_node(&bgp_ipv4_unicast_node);
18468 install_node(&bgp_ipv4_multicast_node);
18469 install_node(&bgp_ipv4_labeled_unicast_node);
18470 install_node(&bgp_ipv6_unicast_node);
18471 install_node(&bgp_ipv6_multicast_node);
18472 install_node(&bgp_ipv6_labeled_unicast_node);
18473 install_node(&bgp_vpnv4_node);
18474 install_node(&bgp_vpnv6_node);
18475 install_node(&bgp_evpn_node);
18476 install_node(&bgp_evpn_vni_node);
18477 install_node(&bgp_flowspecv4_node);
18478 install_node(&bgp_flowspecv6_node);
bfaab44d 18479 install_node(&bgp_srv6_node);
d62a17ae 18480
18481 /* Install default VTY commands to new nodes. */
18482 install_default(BGP_NODE);
18483 install_default(BGP_IPV4_NODE);
18484 install_default(BGP_IPV4M_NODE);
18485 install_default(BGP_IPV4L_NODE);
18486 install_default(BGP_IPV6_NODE);
18487 install_default(BGP_IPV6M_NODE);
18488 install_default(BGP_IPV6L_NODE);
18489 install_default(BGP_VPNV4_NODE);
18490 install_default(BGP_VPNV6_NODE);
7c40bf39 18491 install_default(BGP_FLOWSPECV4_NODE);
18492 install_default(BGP_FLOWSPECV6_NODE);
d62a17ae 18493 install_default(BGP_EVPN_NODE);
18494 install_default(BGP_EVPN_VNI_NODE);
bfaab44d 18495 install_default(BGP_SRV6_NODE);
d62a17ae 18496
8029b216
AK
18497 /* "bgp local-mac" hidden commands. */
18498 install_element(CONFIG_NODE, &bgp_local_mac_cmd);
18499 install_element(CONFIG_NODE, &no_bgp_local_mac_cmd);
18500
9acb67cb
DS
18501 /* "bgp suppress-fib-pending" global */
18502 install_element(CONFIG_NODE, &bgp_global_suppress_fib_pending_cmd);
18503
d62a17ae 18504 /* bgp route-map delay-timer commands. */
18505 install_element(CONFIG_NODE, &bgp_set_route_map_delay_timer_cmd);
18506 install_element(CONFIG_NODE, &no_bgp_set_route_map_delay_timer_cmd);
18507
8666265e
DS
18508 install_element(BGP_NODE, &bgp_allow_martian_cmd);
18509
f852eb98
PG
18510 /* bgp fast-convergence command */
18511 install_element(BGP_NODE, &bgp_fast_convergence_cmd);
18512 install_element(BGP_NODE, &no_bgp_fast_convergence_cmd);
18513
d70583f7
D
18514 /* global bgp update-delay command */
18515 install_element(CONFIG_NODE, &bgp_global_update_delay_cmd);
18516 install_element(CONFIG_NODE, &no_bgp_global_update_delay_cmd);
18517
05bd726c 18518 /* global bgp graceful-shutdown command */
18519 install_element(CONFIG_NODE, &bgp_graceful_shutdown_cmd);
18520 install_element(CONFIG_NODE, &no_bgp_graceful_shutdown_cmd);
18521
d62a17ae 18522 /* Dummy commands (Currently not supported) */
18523 install_element(BGP_NODE, &no_synchronization_cmd);
18524 install_element(BGP_NODE, &no_auto_summary_cmd);
18525
18526 /* "router bgp" commands. */
18527 install_element(CONFIG_NODE, &router_bgp_cmd);
18528
18529 /* "no router bgp" commands. */
18530 install_element(CONFIG_NODE, &no_router_bgp_cmd);
18531
425bd64b
PS
18532 /* "bgp session-dscp command */
18533 install_element(CONFIG_NODE, &bgp_session_dscp_cmd);
18534 install_element(CONFIG_NODE, &no_bgp_session_dscp_cmd);
18535
d62a17ae 18536 /* "bgp router-id" commands. */
18537 install_element(BGP_NODE, &bgp_router_id_cmd);
18538 install_element(BGP_NODE, &no_bgp_router_id_cmd);
18539
c208c586
S
18540 /* "bgp suppress-fib-pending" command */
18541 install_element(BGP_NODE, &bgp_suppress_fib_pending_cmd);
18542
d62a17ae 18543 /* "bgp cluster-id" commands. */
18544 install_element(BGP_NODE, &bgp_cluster_id_cmd);
18545 install_element(BGP_NODE, &no_bgp_cluster_id_cmd);
18546
c163f297
DS
18547 /* "bgp no-rib" commands. */
18548 install_element(CONFIG_NODE, &bgp_norib_cmd);
18549 install_element(CONFIG_NODE, &no_bgp_norib_cmd);
18550
e46723a5
DS
18551 install_element(CONFIG_NODE, &no_bgp_send_extra_data_cmd);
18552
d62a17ae 18553 /* "bgp confederation" commands. */
18554 install_element(BGP_NODE, &bgp_confederation_identifier_cmd);
18555 install_element(BGP_NODE, &no_bgp_confederation_identifier_cmd);
18556
18557 /* "bgp confederation peers" commands. */
18558 install_element(BGP_NODE, &bgp_confederation_peers_cmd);
18559 install_element(BGP_NODE, &no_bgp_confederation_peers_cmd);
18560
18561 /* bgp max-med command */
18562 install_element(BGP_NODE, &bgp_maxmed_admin_cmd);
18563 install_element(BGP_NODE, &no_bgp_maxmed_admin_cmd);
18564 install_element(BGP_NODE, &bgp_maxmed_admin_medv_cmd);
18565 install_element(BGP_NODE, &bgp_maxmed_onstartup_cmd);
18566 install_element(BGP_NODE, &no_bgp_maxmed_onstartup_cmd);
18567
d864dd9e
EB
18568 /* "neighbor role" commands. */
18569 install_element(BGP_NODE, &neighbor_role_cmd);
18570 install_element(BGP_NODE, &neighbor_role_strict_cmd);
18571 install_element(BGP_NODE, &no_neighbor_role_cmd);
18572
d62a17ae 18573 /* bgp disable-ebgp-connected-nh-check */
18574 install_element(BGP_NODE, &bgp_disable_connected_route_check_cmd);
18575 install_element(BGP_NODE, &no_bgp_disable_connected_route_check_cmd);
18576
18577 /* bgp update-delay command */
18578 install_element(BGP_NODE, &bgp_update_delay_cmd);
18579 install_element(BGP_NODE, &no_bgp_update_delay_cmd);
d62a17ae 18580
18581 install_element(BGP_NODE, &bgp_wpkt_quanta_cmd);
555e09d4 18582 install_element(BGP_NODE, &bgp_rpkt_quanta_cmd);
d62a17ae 18583
18584 install_element(BGP_NODE, &bgp_coalesce_time_cmd);
18585 install_element(BGP_NODE, &no_bgp_coalesce_time_cmd);
18586
18587 /* "maximum-paths" commands. */
18588 install_element(BGP_NODE, &bgp_maxpaths_hidden_cmd);
18589 install_element(BGP_NODE, &no_bgp_maxpaths_hidden_cmd);
18590 install_element(BGP_IPV4_NODE, &bgp_maxpaths_cmd);
18591 install_element(BGP_IPV4_NODE, &no_bgp_maxpaths_cmd);
18592 install_element(BGP_IPV6_NODE, &bgp_maxpaths_cmd);
18593 install_element(BGP_IPV6_NODE, &no_bgp_maxpaths_cmd);
18594 install_element(BGP_NODE, &bgp_maxpaths_ibgp_hidden_cmd);
18595 install_element(BGP_NODE, &bgp_maxpaths_ibgp_cluster_hidden_cmd);
18596 install_element(BGP_NODE, &no_bgp_maxpaths_ibgp_hidden_cmd);
18597 install_element(BGP_IPV4_NODE, &bgp_maxpaths_ibgp_cmd);
18598 install_element(BGP_IPV4_NODE, &bgp_maxpaths_ibgp_cluster_cmd);
18599 install_element(BGP_IPV4_NODE, &no_bgp_maxpaths_ibgp_cmd);
18600 install_element(BGP_IPV6_NODE, &bgp_maxpaths_ibgp_cmd);
18601 install_element(BGP_IPV6_NODE, &bgp_maxpaths_ibgp_cluster_cmd);
18602 install_element(BGP_IPV6_NODE, &no_bgp_maxpaths_ibgp_cmd);
18603
39edabac
PG
18604 install_element(BGP_IPV4L_NODE, &bgp_maxpaths_cmd);
18605 install_element(BGP_IPV4L_NODE, &no_bgp_maxpaths_cmd);
18606 install_element(BGP_IPV4L_NODE, &bgp_maxpaths_ibgp_cmd);
18607 install_element(BGP_IPV4L_NODE, &bgp_maxpaths_ibgp_cluster_cmd);
18608 install_element(BGP_IPV4L_NODE, &no_bgp_maxpaths_ibgp_cmd);
d62a17ae 18609 install_element(BGP_IPV6L_NODE, &bgp_maxpaths_cmd);
18610 install_element(BGP_IPV6L_NODE, &no_bgp_maxpaths_cmd);
18611 install_element(BGP_IPV6L_NODE, &bgp_maxpaths_ibgp_cmd);
18612 install_element(BGP_IPV6L_NODE, &bgp_maxpaths_ibgp_cluster_cmd);
18613 install_element(BGP_IPV6L_NODE, &no_bgp_maxpaths_ibgp_cmd);
18614
18615 /* "timers bgp" commands. */
18616 install_element(BGP_NODE, &bgp_timers_cmd);
18617 install_element(BGP_NODE, &no_bgp_timers_cmd);
18618
b042667a
TI
18619 /* "minimum-holdtime" commands. */
18620 install_element(BGP_NODE, &bgp_minimum_holdtime_cmd);
18621 install_element(BGP_NODE, &no_bgp_minimum_holdtime_cmd);
18622
d62a17ae 18623 /* route-map delay-timer commands - per instance for backwards compat.
18624 */
18625 install_element(BGP_NODE, &bgp_set_route_map_delay_timer_cmd);
18626 install_element(BGP_NODE, &no_bgp_set_route_map_delay_timer_cmd);
18627
18628 /* "bgp client-to-client reflection" commands */
18629 install_element(BGP_NODE, &no_bgp_client_to_client_reflection_cmd);
18630 install_element(BGP_NODE, &bgp_client_to_client_reflection_cmd);
18631
18632 /* "bgp always-compare-med" commands */
18633 install_element(BGP_NODE, &bgp_always_compare_med_cmd);
18634 install_element(BGP_NODE, &no_bgp_always_compare_med_cmd);
18635
9dac9fc8
DA
18636 /* bgp ebgp-requires-policy */
18637 install_element(BGP_NODE, &bgp_ebgp_requires_policy_cmd);
18638 install_element(BGP_NODE, &no_bgp_ebgp_requires_policy_cmd);
18639
2adac256
DA
18640 /* bgp suppress-duplicates */
18641 install_element(BGP_NODE, &bgp_suppress_duplicates_cmd);
18642 install_element(BGP_NODE, &no_bgp_suppress_duplicates_cmd);
18643
fb29348a
DA
18644 /* bgp reject-as-sets */
18645 install_element(BGP_NODE, &bgp_reject_as_sets_cmd);
18646 install_element(BGP_NODE, &no_bgp_reject_as_sets_cmd);
18647
d62a17ae 18648 /* "bgp deterministic-med" commands */
18649 install_element(BGP_NODE, &bgp_deterministic_med_cmd);
18650 install_element(BGP_NODE, &no_bgp_deterministic_med_cmd);
18651
055679e9 18652 /* "bgp graceful-restart" command */
36235319
QY
18653 install_element(BGP_NODE, &bgp_graceful_restart_cmd);
18654 install_element(BGP_NODE, &no_bgp_graceful_restart_cmd);
055679e9 18655
18656 /* "bgp graceful-restart-disable" command */
36235319
QY
18657 install_element(BGP_NODE, &bgp_graceful_restart_disable_cmd);
18658 install_element(BGP_NODE, &no_bgp_graceful_restart_disable_cmd);
055679e9 18659
18660 /* "neighbor a:b:c:d graceful-restart" command */
36235319
QY
18661 install_element(BGP_NODE, &bgp_neighbor_graceful_restart_set_cmd);
18662 install_element(BGP_NODE, &no_bgp_neighbor_graceful_restart_set_cmd);
055679e9 18663
18664 /* "neighbor a:b:c:d graceful-restart-disable" command */
18665 install_element(BGP_NODE,
18666 &bgp_neighbor_graceful_restart_disable_set_cmd);
18667 install_element(BGP_NODE,
18668 &no_bgp_neighbor_graceful_restart_disable_set_cmd);
18669
18670 /* "neighbor a:b:c:d graceful-restart-helper" command */
18671 install_element(BGP_NODE,
18672 &bgp_neighbor_graceful_restart_helper_set_cmd);
18673 install_element(BGP_NODE,
18674 &no_bgp_neighbor_graceful_restart_helper_set_cmd);
18675
d62a17ae 18676 install_element(BGP_NODE, &bgp_graceful_restart_stalepath_time_cmd);
18677 install_element(BGP_NODE, &no_bgp_graceful_restart_stalepath_time_cmd);
18678 install_element(BGP_NODE, &bgp_graceful_restart_restart_time_cmd);
18679 install_element(BGP_NODE, &no_bgp_graceful_restart_restart_time_cmd);
cfd47646 18680 install_element(BGP_NODE, &bgp_graceful_restart_select_defer_time_cmd);
f009ff26 18681 install_element(BGP_NODE,
18682 &no_bgp_graceful_restart_select_defer_time_cmd);
d62a17ae 18683 install_element(BGP_NODE, &bgp_graceful_restart_preserve_fw_cmd);
18684 install_element(BGP_NODE, &no_bgp_graceful_restart_preserve_fw_cmd);
f2ca5c5b 18685 install_element(BGP_NODE, &bgp_graceful_restart_notification_cmd);
d62a17ae 18686
d6e3c15b 18687 install_element(BGP_NODE, &bgp_graceful_restart_disable_eor_cmd);
18688 install_element(BGP_NODE, &no_bgp_graceful_restart_disable_eor_cmd);
dc95985f 18689 install_element(BGP_NODE, &bgp_graceful_restart_rib_stale_time_cmd);
18690 install_element(BGP_NODE, &no_bgp_graceful_restart_rib_stale_time_cmd);
d6e3c15b 18691
7f323236
DW
18692 /* "bgp graceful-shutdown" commands */
18693 install_element(BGP_NODE, &bgp_graceful_shutdown_cmd);
18694 install_element(BGP_NODE, &no_bgp_graceful_shutdown_cmd);
18695
1ae314be
DA
18696 /* "bgp hard-administrative-reset" commands */
18697 install_element(BGP_NODE, &bgp_administrative_reset_cmd);
18698
8606be87
DA
18699 /* "bgp long-lived-graceful-restart" commands */
18700 install_element(BGP_NODE, &bgp_llgr_stalepath_time_cmd);
18701 install_element(BGP_NODE, &no_bgp_llgr_stalepath_time_cmd);
18702
d62a17ae 18703 /* "bgp fast-external-failover" commands */
18704 install_element(BGP_NODE, &bgp_fast_external_failover_cmd);
18705 install_element(BGP_NODE, &no_bgp_fast_external_failover_cmd);
18706
d62a17ae 18707 /* "bgp bestpath compare-routerid" commands */
18708 install_element(BGP_NODE, &bgp_bestpath_compare_router_id_cmd);
18709 install_element(BGP_NODE, &no_bgp_bestpath_compare_router_id_cmd);
18710
18711 /* "bgp bestpath as-path ignore" commands */
18712 install_element(BGP_NODE, &bgp_bestpath_aspath_ignore_cmd);
18713 install_element(BGP_NODE, &no_bgp_bestpath_aspath_ignore_cmd);
18714
18715 /* "bgp bestpath as-path confed" commands */
18716 install_element(BGP_NODE, &bgp_bestpath_aspath_confed_cmd);
18717 install_element(BGP_NODE, &no_bgp_bestpath_aspath_confed_cmd);
18718
18719 /* "bgp bestpath as-path multipath-relax" commands */
18720 install_element(BGP_NODE, &bgp_bestpath_aspath_multipath_relax_cmd);
18721 install_element(BGP_NODE, &no_bgp_bestpath_aspath_multipath_relax_cmd);
18722
ee88563a
JM
18723 /* "bgp bestpath peer-type multipath-relax" commands */
18724 install_element(BGP_NODE, &bgp_bestpath_peer_type_multipath_relax_cmd);
18725 install_element(BGP_NODE,
18726 &no_bgp_bestpath_peer_type_multipath_relax_cmd);
18727
d62a17ae 18728 /* "bgp log-neighbor-changes" commands */
18729 install_element(BGP_NODE, &bgp_log_neighbor_changes_cmd);
18730 install_element(BGP_NODE, &no_bgp_log_neighbor_changes_cmd);
18731
18732 /* "bgp bestpath med" commands */
18733 install_element(BGP_NODE, &bgp_bestpath_med_cmd);
18734 install_element(BGP_NODE, &no_bgp_bestpath_med_cmd);
18735
f7e1c681 18736 /* "bgp bestpath bandwidth" commands */
18737 install_element(BGP_NODE, &bgp_bestpath_bw_cmd);
ad36d216 18738 install_element(BGP_NODE, &no_bgp_bestpath_bw_cmd);
f7e1c681 18739
b16bcbba
TA
18740 /* "no bgp default <afi>-<safi>" commands. */
18741 install_element(BGP_NODE, &bgp_default_afi_safi_cmd);
e84c59af 18742
d62a17ae 18743 /* "bgp network import-check" commands. */
18744 install_element(BGP_NODE, &bgp_network_import_check_cmd);
18745 install_element(BGP_NODE, &bgp_network_import_check_exact_cmd);
18746 install_element(BGP_NODE, &no_bgp_network_import_check_cmd);
18747
18748 /* "bgp default local-preference" commands. */
18749 install_element(BGP_NODE, &bgp_default_local_preference_cmd);
18750 install_element(BGP_NODE, &no_bgp_default_local_preference_cmd);
18751
18752 /* bgp default show-hostname */
18753 install_element(BGP_NODE, &bgp_default_show_hostname_cmd);
18754 install_element(BGP_NODE, &no_bgp_default_show_hostname_cmd);
18755
aef999a2
DA
18756 /* bgp default show-nexthop-hostname */
18757 install_element(BGP_NODE, &bgp_default_show_nexthop_hostname_cmd);
18758 install_element(BGP_NODE, &no_bgp_default_show_nexthop_hostname_cmd);
18759
d62a17ae 18760 /* "bgp default subgroup-pkt-queue-max" commands. */
18761 install_element(BGP_NODE, &bgp_default_subgroup_pkt_queue_max_cmd);
18762 install_element(BGP_NODE, &no_bgp_default_subgroup_pkt_queue_max_cmd);
18763
18764 /* bgp ibgp-allow-policy-mods command */
18765 install_element(BGP_NODE, &bgp_rr_allow_outbound_policy_cmd);
18766 install_element(BGP_NODE, &no_bgp_rr_allow_outbound_policy_cmd);
18767
18768 /* "bgp listen limit" commands. */
18769 install_element(BGP_NODE, &bgp_listen_limit_cmd);
18770 install_element(BGP_NODE, &no_bgp_listen_limit_cmd);
18771
18772 /* "bgp listen range" commands. */
18773 install_element(BGP_NODE, &bgp_listen_range_cmd);
18774 install_element(BGP_NODE, &no_bgp_listen_range_cmd);
18775
8175f54a 18776 /* "bgp default shutdown" command */
f26845f9 18777 install_element(BGP_NODE, &bgp_default_shutdown_cmd);
9cf59432
DS
18778
18779 /* "bgp shutdown" commands */
18780 install_element(BGP_NODE, &bgp_shutdown_cmd);
8389c83a 18781 install_element(BGP_NODE, &bgp_shutdown_msg_cmd);
9cf59432 18782 install_element(BGP_NODE, &no_bgp_shutdown_cmd);
1b6e7a88 18783 install_element(BGP_NODE, &no_bgp_shutdown_msg_cmd);
f26845f9 18784
d62a17ae 18785 /* "neighbor remote-as" commands. */
18786 install_element(BGP_NODE, &neighbor_remote_as_cmd);
18787 install_element(BGP_NODE, &neighbor_interface_config_cmd);
18788 install_element(BGP_NODE, &neighbor_interface_config_v6only_cmd);
18789 install_element(BGP_NODE, &neighbor_interface_config_remote_as_cmd);
18790 install_element(BGP_NODE,
18791 &neighbor_interface_v6only_config_remote_as_cmd);
18792 install_element(BGP_NODE, &no_neighbor_cmd);
18793 install_element(BGP_NODE, &no_neighbor_interface_config_cmd);
18794
18795 /* "neighbor peer-group" commands. */
18796 install_element(BGP_NODE, &neighbor_peer_group_cmd);
18797 install_element(BGP_NODE, &no_neighbor_peer_group_cmd);
18798 install_element(BGP_NODE,
18799 &no_neighbor_interface_peer_group_remote_as_cmd);
18800
18801 /* "neighbor local-as" commands. */
18802 install_element(BGP_NODE, &neighbor_local_as_cmd);
18803 install_element(BGP_NODE, &neighbor_local_as_no_prepend_cmd);
18804 install_element(BGP_NODE, &neighbor_local_as_no_prepend_replace_as_cmd);
18805 install_element(BGP_NODE, &no_neighbor_local_as_cmd);
18806
18807 /* "neighbor solo" commands. */
18808 install_element(BGP_NODE, &neighbor_solo_cmd);
18809 install_element(BGP_NODE, &no_neighbor_solo_cmd);
18810
18811 /* "neighbor password" commands. */
18812 install_element(BGP_NODE, &neighbor_password_cmd);
18813 install_element(BGP_NODE, &no_neighbor_password_cmd);
18814
18815 /* "neighbor activate" commands. */
18816 install_element(BGP_NODE, &neighbor_activate_hidden_cmd);
18817 install_element(BGP_IPV4_NODE, &neighbor_activate_cmd);
18818 install_element(BGP_IPV4M_NODE, &neighbor_activate_cmd);
18819 install_element(BGP_IPV4L_NODE, &neighbor_activate_cmd);
18820 install_element(BGP_IPV6_NODE, &neighbor_activate_cmd);
18821 install_element(BGP_IPV6M_NODE, &neighbor_activate_cmd);
18822 install_element(BGP_IPV6L_NODE, &neighbor_activate_cmd);
18823 install_element(BGP_VPNV4_NODE, &neighbor_activate_cmd);
18824 install_element(BGP_VPNV6_NODE, &neighbor_activate_cmd);
7c40bf39 18825 install_element(BGP_FLOWSPECV4_NODE, &neighbor_activate_cmd);
18826 install_element(BGP_FLOWSPECV6_NODE, &neighbor_activate_cmd);
d62a17ae 18827 install_element(BGP_EVPN_NODE, &neighbor_activate_cmd);
18828
18829 /* "no neighbor activate" commands. */
18830 install_element(BGP_NODE, &no_neighbor_activate_hidden_cmd);
18831 install_element(BGP_IPV4_NODE, &no_neighbor_activate_cmd);
18832 install_element(BGP_IPV4M_NODE, &no_neighbor_activate_cmd);
18833 install_element(BGP_IPV4L_NODE, &no_neighbor_activate_cmd);
18834 install_element(BGP_IPV6_NODE, &no_neighbor_activate_cmd);
18835 install_element(BGP_IPV6M_NODE, &no_neighbor_activate_cmd);
18836 install_element(BGP_IPV6L_NODE, &no_neighbor_activate_cmd);
18837 install_element(BGP_VPNV4_NODE, &no_neighbor_activate_cmd);
18838 install_element(BGP_VPNV6_NODE, &no_neighbor_activate_cmd);
7c40bf39 18839 install_element(BGP_FLOWSPECV4_NODE, &no_neighbor_activate_cmd);
18840 install_element(BGP_FLOWSPECV6_NODE, &no_neighbor_activate_cmd);
d62a17ae 18841 install_element(BGP_EVPN_NODE, &no_neighbor_activate_cmd);
18842
18843 /* "neighbor peer-group" set commands. */
18844 install_element(BGP_NODE, &neighbor_set_peer_group_cmd);
18845 install_element(BGP_IPV4_NODE, &neighbor_set_peer_group_hidden_cmd);
18846 install_element(BGP_IPV4M_NODE, &neighbor_set_peer_group_hidden_cmd);
18847 install_element(BGP_IPV6_NODE, &neighbor_set_peer_group_hidden_cmd);
18848 install_element(BGP_IPV6M_NODE, &neighbor_set_peer_group_hidden_cmd);
18849 install_element(BGP_IPV6L_NODE, &neighbor_set_peer_group_hidden_cmd);
18850 install_element(BGP_VPNV4_NODE, &neighbor_set_peer_group_hidden_cmd);
18851 install_element(BGP_VPNV6_NODE, &neighbor_set_peer_group_hidden_cmd);
7c40bf39 18852 install_element(BGP_FLOWSPECV4_NODE,
18853 &neighbor_set_peer_group_hidden_cmd);
18854 install_element(BGP_FLOWSPECV6_NODE,
18855 &neighbor_set_peer_group_hidden_cmd);
d62a17ae 18856
18857 /* "no neighbor peer-group unset" commands. */
18858 install_element(BGP_NODE, &no_neighbor_set_peer_group_cmd);
18859 install_element(BGP_IPV4_NODE, &no_neighbor_set_peer_group_hidden_cmd);
18860 install_element(BGP_IPV4M_NODE, &no_neighbor_set_peer_group_hidden_cmd);
18861 install_element(BGP_IPV6_NODE, &no_neighbor_set_peer_group_hidden_cmd);
18862 install_element(BGP_IPV6M_NODE, &no_neighbor_set_peer_group_hidden_cmd);
18863 install_element(BGP_IPV6L_NODE, &no_neighbor_set_peer_group_hidden_cmd);
18864 install_element(BGP_VPNV4_NODE, &no_neighbor_set_peer_group_hidden_cmd);
18865 install_element(BGP_VPNV6_NODE, &no_neighbor_set_peer_group_hidden_cmd);
7c40bf39 18866 install_element(BGP_FLOWSPECV4_NODE,
18867 &no_neighbor_set_peer_group_hidden_cmd);
18868 install_element(BGP_FLOWSPECV6_NODE,
18869 &no_neighbor_set_peer_group_hidden_cmd);
d62a17ae 18870
18871 /* "neighbor softreconfiguration inbound" commands.*/
18872 install_element(BGP_NODE, &neighbor_soft_reconfiguration_hidden_cmd);
18873 install_element(BGP_NODE, &no_neighbor_soft_reconfiguration_hidden_cmd);
18874 install_element(BGP_IPV4_NODE, &neighbor_soft_reconfiguration_cmd);
18875 install_element(BGP_IPV4_NODE, &no_neighbor_soft_reconfiguration_cmd);
18876 install_element(BGP_IPV4L_NODE, &neighbor_soft_reconfiguration_cmd);
18877 install_element(BGP_IPV4L_NODE, &no_neighbor_soft_reconfiguration_cmd);
18878 install_element(BGP_IPV4M_NODE, &neighbor_soft_reconfiguration_cmd);
18879 install_element(BGP_IPV4M_NODE, &no_neighbor_soft_reconfiguration_cmd);
18880 install_element(BGP_IPV6_NODE, &neighbor_soft_reconfiguration_cmd);
18881 install_element(BGP_IPV6_NODE, &no_neighbor_soft_reconfiguration_cmd);
18882 install_element(BGP_IPV6M_NODE, &neighbor_soft_reconfiguration_cmd);
18883 install_element(BGP_IPV6M_NODE, &no_neighbor_soft_reconfiguration_cmd);
18884 install_element(BGP_IPV6L_NODE, &neighbor_soft_reconfiguration_cmd);
18885 install_element(BGP_IPV6L_NODE, &no_neighbor_soft_reconfiguration_cmd);
18886 install_element(BGP_VPNV4_NODE, &neighbor_soft_reconfiguration_cmd);
18887 install_element(BGP_VPNV4_NODE, &no_neighbor_soft_reconfiguration_cmd);
18888 install_element(BGP_VPNV6_NODE, &neighbor_soft_reconfiguration_cmd);
18889 install_element(BGP_VPNV6_NODE, &no_neighbor_soft_reconfiguration_cmd);
7c40bf39 18890 install_element(BGP_FLOWSPECV4_NODE,
18891 &neighbor_soft_reconfiguration_cmd);
18892 install_element(BGP_FLOWSPECV4_NODE,
18893 &no_neighbor_soft_reconfiguration_cmd);
18894 install_element(BGP_FLOWSPECV6_NODE,
18895 &neighbor_soft_reconfiguration_cmd);
18896 install_element(BGP_FLOWSPECV6_NODE,
18897 &no_neighbor_soft_reconfiguration_cmd);
616c6ee8
PG
18898 install_element(BGP_EVPN_NODE, &neighbor_soft_reconfiguration_cmd);
18899 install_element(BGP_EVPN_NODE, &no_neighbor_soft_reconfiguration_cmd);
d62a17ae 18900
18901 /* "neighbor attribute-unchanged" commands. */
18902 install_element(BGP_NODE, &neighbor_attr_unchanged_hidden_cmd);
18903 install_element(BGP_NODE, &no_neighbor_attr_unchanged_hidden_cmd);
18904 install_element(BGP_IPV4_NODE, &neighbor_attr_unchanged_cmd);
18905 install_element(BGP_IPV4_NODE, &no_neighbor_attr_unchanged_cmd);
18906 install_element(BGP_IPV4M_NODE, &neighbor_attr_unchanged_cmd);
18907 install_element(BGP_IPV4M_NODE, &no_neighbor_attr_unchanged_cmd);
18908 install_element(BGP_IPV4L_NODE, &neighbor_attr_unchanged_cmd);
18909 install_element(BGP_IPV4L_NODE, &no_neighbor_attr_unchanged_cmd);
18910 install_element(BGP_IPV6_NODE, &neighbor_attr_unchanged_cmd);
18911 install_element(BGP_IPV6_NODE, &no_neighbor_attr_unchanged_cmd);
18912 install_element(BGP_IPV6M_NODE, &neighbor_attr_unchanged_cmd);
18913 install_element(BGP_IPV6M_NODE, &no_neighbor_attr_unchanged_cmd);
18914 install_element(BGP_IPV6L_NODE, &neighbor_attr_unchanged_cmd);
18915 install_element(BGP_IPV6L_NODE, &no_neighbor_attr_unchanged_cmd);
18916 install_element(BGP_VPNV4_NODE, &neighbor_attr_unchanged_cmd);
18917 install_element(BGP_VPNV4_NODE, &no_neighbor_attr_unchanged_cmd);
18918 install_element(BGP_VPNV6_NODE, &neighbor_attr_unchanged_cmd);
18919 install_element(BGP_VPNV6_NODE, &no_neighbor_attr_unchanged_cmd);
18920
18921 install_element(BGP_EVPN_NODE, &neighbor_attr_unchanged_cmd);
18922 install_element(BGP_EVPN_NODE, &no_neighbor_attr_unchanged_cmd);
18923
b8ad84d2
PG
18924 install_element(BGP_FLOWSPECV4_NODE, &neighbor_attr_unchanged_cmd);
18925 install_element(BGP_FLOWSPECV4_NODE, &no_neighbor_attr_unchanged_cmd);
18926 install_element(BGP_FLOWSPECV6_NODE, &neighbor_attr_unchanged_cmd);
18927 install_element(BGP_FLOWSPECV6_NODE, &no_neighbor_attr_unchanged_cmd);
18928
d62a17ae 18929 /* "nexthop-local unchanged" commands */
18930 install_element(BGP_IPV6_NODE, &neighbor_nexthop_local_unchanged_cmd);
18931 install_element(BGP_IPV6_NODE,
18932 &no_neighbor_nexthop_local_unchanged_cmd);
18933
18934 /* "neighbor next-hop-self" commands. */
18935 install_element(BGP_NODE, &neighbor_nexthop_self_hidden_cmd);
18936 install_element(BGP_NODE, &no_neighbor_nexthop_self_hidden_cmd);
18937 install_element(BGP_IPV4_NODE, &neighbor_nexthop_self_cmd);
18938 install_element(BGP_IPV4_NODE, &no_neighbor_nexthop_self_cmd);
18939 install_element(BGP_IPV4M_NODE, &neighbor_nexthop_self_cmd);
18940 install_element(BGP_IPV4M_NODE, &no_neighbor_nexthop_self_cmd);
18941 install_element(BGP_IPV4L_NODE, &neighbor_nexthop_self_cmd);
18942 install_element(BGP_IPV4L_NODE, &no_neighbor_nexthop_self_cmd);
18943 install_element(BGP_IPV6_NODE, &neighbor_nexthop_self_cmd);
18944 install_element(BGP_IPV6_NODE, &no_neighbor_nexthop_self_cmd);
18945 install_element(BGP_IPV6M_NODE, &neighbor_nexthop_self_cmd);
18946 install_element(BGP_IPV6M_NODE, &no_neighbor_nexthop_self_cmd);
18947 install_element(BGP_IPV6L_NODE, &neighbor_nexthop_self_cmd);
18948 install_element(BGP_IPV6L_NODE, &no_neighbor_nexthop_self_cmd);
18949 install_element(BGP_VPNV4_NODE, &neighbor_nexthop_self_cmd);
18950 install_element(BGP_VPNV4_NODE, &no_neighbor_nexthop_self_cmd);
18951 install_element(BGP_VPNV6_NODE, &neighbor_nexthop_self_cmd);
18952 install_element(BGP_VPNV6_NODE, &no_neighbor_nexthop_self_cmd);
ace295a9
MK
18953 install_element(BGP_EVPN_NODE, &neighbor_nexthop_self_cmd);
18954 install_element(BGP_EVPN_NODE, &no_neighbor_nexthop_self_cmd);
d62a17ae 18955
18956 /* "neighbor next-hop-self force" commands. */
18957 install_element(BGP_NODE, &neighbor_nexthop_self_force_hidden_cmd);
18958 install_element(BGP_NODE, &no_neighbor_nexthop_self_force_hidden_cmd);
1bc4e531
DA
18959 install_element(BGP_NODE, &neighbor_nexthop_self_all_hidden_cmd);
18960 install_element(BGP_NODE, &no_neighbor_nexthop_self_all_hidden_cmd);
d62a17ae 18961 install_element(BGP_IPV4_NODE, &neighbor_nexthop_self_force_cmd);
18962 install_element(BGP_IPV4_NODE, &no_neighbor_nexthop_self_force_cmd);
2d94b6d1
DA
18963 install_element(BGP_IPV4_NODE, &neighbor_nexthop_self_all_hidden_cmd);
18964 install_element(BGP_IPV4_NODE,
18965 &no_neighbor_nexthop_self_all_hidden_cmd);
d62a17ae 18966 install_element(BGP_IPV4M_NODE, &neighbor_nexthop_self_force_cmd);
18967 install_element(BGP_IPV4M_NODE, &no_neighbor_nexthop_self_force_cmd);
2d94b6d1
DA
18968 install_element(BGP_IPV4M_NODE, &neighbor_nexthop_self_all_hidden_cmd);
18969 install_element(BGP_IPV4M_NODE,
18970 &no_neighbor_nexthop_self_all_hidden_cmd);
d62a17ae 18971 install_element(BGP_IPV4L_NODE, &neighbor_nexthop_self_force_cmd);
18972 install_element(BGP_IPV4L_NODE, &no_neighbor_nexthop_self_force_cmd);
2d94b6d1
DA
18973 install_element(BGP_IPV4L_NODE, &neighbor_nexthop_self_all_hidden_cmd);
18974 install_element(BGP_IPV4L_NODE,
18975 &no_neighbor_nexthop_self_all_hidden_cmd);
d62a17ae 18976 install_element(BGP_IPV6_NODE, &neighbor_nexthop_self_force_cmd);
18977 install_element(BGP_IPV6_NODE, &no_neighbor_nexthop_self_force_cmd);
2d94b6d1
DA
18978 install_element(BGP_IPV6_NODE, &neighbor_nexthop_self_all_hidden_cmd);
18979 install_element(BGP_IPV6_NODE,
18980 &no_neighbor_nexthop_self_all_hidden_cmd);
d62a17ae 18981 install_element(BGP_IPV6M_NODE, &neighbor_nexthop_self_force_cmd);
18982 install_element(BGP_IPV6M_NODE, &no_neighbor_nexthop_self_force_cmd);
2d94b6d1
DA
18983 install_element(BGP_IPV6M_NODE, &neighbor_nexthop_self_all_hidden_cmd);
18984 install_element(BGP_IPV6M_NODE,
18985 &no_neighbor_nexthop_self_all_hidden_cmd);
d62a17ae 18986 install_element(BGP_IPV6L_NODE, &neighbor_nexthop_self_force_cmd);
18987 install_element(BGP_IPV6L_NODE, &no_neighbor_nexthop_self_force_cmd);
2d94b6d1
DA
18988 install_element(BGP_IPV6L_NODE, &neighbor_nexthop_self_all_hidden_cmd);
18989 install_element(BGP_IPV6L_NODE,
18990 &no_neighbor_nexthop_self_all_hidden_cmd);
d62a17ae 18991 install_element(BGP_VPNV4_NODE, &neighbor_nexthop_self_force_cmd);
18992 install_element(BGP_VPNV4_NODE, &no_neighbor_nexthop_self_force_cmd);
2d94b6d1
DA
18993 install_element(BGP_VPNV4_NODE, &neighbor_nexthop_self_all_hidden_cmd);
18994 install_element(BGP_VPNV4_NODE,
18995 &no_neighbor_nexthop_self_all_hidden_cmd);
d62a17ae 18996 install_element(BGP_VPNV6_NODE, &neighbor_nexthop_self_force_cmd);
18997 install_element(BGP_VPNV6_NODE, &no_neighbor_nexthop_self_force_cmd);
2d94b6d1
DA
18998 install_element(BGP_VPNV6_NODE, &neighbor_nexthop_self_all_hidden_cmd);
18999 install_element(BGP_VPNV6_NODE,
19000 &no_neighbor_nexthop_self_all_hidden_cmd);
be7e1fa3
MS
19001 install_element(BGP_EVPN_NODE, &neighbor_nexthop_self_force_cmd);
19002 install_element(BGP_EVPN_NODE, &no_neighbor_nexthop_self_force_cmd);
d62a17ae 19003
19004 /* "neighbor as-override" commands. */
19005 install_element(BGP_NODE, &neighbor_as_override_hidden_cmd);
19006 install_element(BGP_NODE, &no_neighbor_as_override_hidden_cmd);
19007 install_element(BGP_IPV4_NODE, &neighbor_as_override_cmd);
19008 install_element(BGP_IPV4_NODE, &no_neighbor_as_override_cmd);
19009 install_element(BGP_IPV4M_NODE, &neighbor_as_override_cmd);
19010 install_element(BGP_IPV4M_NODE, &no_neighbor_as_override_cmd);
19011 install_element(BGP_IPV4L_NODE, &neighbor_as_override_cmd);
19012 install_element(BGP_IPV4L_NODE, &no_neighbor_as_override_cmd);
19013 install_element(BGP_IPV6_NODE, &neighbor_as_override_cmd);
19014 install_element(BGP_IPV6_NODE, &no_neighbor_as_override_cmd);
19015 install_element(BGP_IPV6M_NODE, &neighbor_as_override_cmd);
19016 install_element(BGP_IPV6M_NODE, &no_neighbor_as_override_cmd);
19017 install_element(BGP_IPV6L_NODE, &neighbor_as_override_cmd);
19018 install_element(BGP_IPV6L_NODE, &no_neighbor_as_override_cmd);
19019 install_element(BGP_VPNV4_NODE, &neighbor_as_override_cmd);
19020 install_element(BGP_VPNV4_NODE, &no_neighbor_as_override_cmd);
19021 install_element(BGP_VPNV6_NODE, &neighbor_as_override_cmd);
19022 install_element(BGP_VPNV6_NODE, &no_neighbor_as_override_cmd);
19023
19024 /* "neighbor remove-private-AS" commands. */
19025 install_element(BGP_NODE, &neighbor_remove_private_as_hidden_cmd);
19026 install_element(BGP_NODE, &no_neighbor_remove_private_as_hidden_cmd);
19027 install_element(BGP_NODE, &neighbor_remove_private_as_all_hidden_cmd);
19028 install_element(BGP_NODE,
19029 &no_neighbor_remove_private_as_all_hidden_cmd);
19030 install_element(BGP_NODE,
19031 &neighbor_remove_private_as_replace_as_hidden_cmd);
19032 install_element(BGP_NODE,
19033 &no_neighbor_remove_private_as_replace_as_hidden_cmd);
19034 install_element(BGP_NODE,
19035 &neighbor_remove_private_as_all_replace_as_hidden_cmd);
19036 install_element(
19037 BGP_NODE,
19038 &no_neighbor_remove_private_as_all_replace_as_hidden_cmd);
19039 install_element(BGP_IPV4_NODE, &neighbor_remove_private_as_cmd);
19040 install_element(BGP_IPV4_NODE, &no_neighbor_remove_private_as_cmd);
19041 install_element(BGP_IPV4_NODE, &neighbor_remove_private_as_all_cmd);
19042 install_element(BGP_IPV4_NODE, &no_neighbor_remove_private_as_all_cmd);
19043 install_element(BGP_IPV4_NODE,
19044 &neighbor_remove_private_as_replace_as_cmd);
19045 install_element(BGP_IPV4_NODE,
19046 &no_neighbor_remove_private_as_replace_as_cmd);
19047 install_element(BGP_IPV4_NODE,
19048 &neighbor_remove_private_as_all_replace_as_cmd);
19049 install_element(BGP_IPV4_NODE,
19050 &no_neighbor_remove_private_as_all_replace_as_cmd);
19051 install_element(BGP_IPV4M_NODE, &neighbor_remove_private_as_cmd);
19052 install_element(BGP_IPV4M_NODE, &no_neighbor_remove_private_as_cmd);
19053 install_element(BGP_IPV4M_NODE, &neighbor_remove_private_as_all_cmd);
19054 install_element(BGP_IPV4M_NODE, &no_neighbor_remove_private_as_all_cmd);
19055 install_element(BGP_IPV4M_NODE,
19056 &neighbor_remove_private_as_replace_as_cmd);
19057 install_element(BGP_IPV4M_NODE,
19058 &no_neighbor_remove_private_as_replace_as_cmd);
19059 install_element(BGP_IPV4M_NODE,
19060 &neighbor_remove_private_as_all_replace_as_cmd);
19061 install_element(BGP_IPV4M_NODE,
19062 &no_neighbor_remove_private_as_all_replace_as_cmd);
19063 install_element(BGP_IPV4L_NODE, &neighbor_remove_private_as_cmd);
19064 install_element(BGP_IPV4L_NODE, &no_neighbor_remove_private_as_cmd);
19065 install_element(BGP_IPV4L_NODE, &neighbor_remove_private_as_all_cmd);
19066 install_element(BGP_IPV4L_NODE, &no_neighbor_remove_private_as_all_cmd);
19067 install_element(BGP_IPV4L_NODE,
19068 &neighbor_remove_private_as_replace_as_cmd);
19069 install_element(BGP_IPV4L_NODE,
19070 &no_neighbor_remove_private_as_replace_as_cmd);
19071 install_element(BGP_IPV4L_NODE,
19072 &neighbor_remove_private_as_all_replace_as_cmd);
19073 install_element(BGP_IPV4L_NODE,
19074 &no_neighbor_remove_private_as_all_replace_as_cmd);
19075 install_element(BGP_IPV6_NODE, &neighbor_remove_private_as_cmd);
19076 install_element(BGP_IPV6_NODE, &no_neighbor_remove_private_as_cmd);
19077 install_element(BGP_IPV6_NODE, &neighbor_remove_private_as_all_cmd);
19078 install_element(BGP_IPV6_NODE, &no_neighbor_remove_private_as_all_cmd);
19079 install_element(BGP_IPV6_NODE,
19080 &neighbor_remove_private_as_replace_as_cmd);
19081 install_element(BGP_IPV6_NODE,
19082 &no_neighbor_remove_private_as_replace_as_cmd);
19083 install_element(BGP_IPV6_NODE,
19084 &neighbor_remove_private_as_all_replace_as_cmd);
19085 install_element(BGP_IPV6_NODE,
19086 &no_neighbor_remove_private_as_all_replace_as_cmd);
19087 install_element(BGP_IPV6M_NODE, &neighbor_remove_private_as_cmd);
19088 install_element(BGP_IPV6M_NODE, &no_neighbor_remove_private_as_cmd);
19089 install_element(BGP_IPV6M_NODE, &neighbor_remove_private_as_all_cmd);
19090 install_element(BGP_IPV6M_NODE, &no_neighbor_remove_private_as_all_cmd);
19091 install_element(BGP_IPV6M_NODE,
19092 &neighbor_remove_private_as_replace_as_cmd);
19093 install_element(BGP_IPV6M_NODE,
19094 &no_neighbor_remove_private_as_replace_as_cmd);
19095 install_element(BGP_IPV6M_NODE,
19096 &neighbor_remove_private_as_all_replace_as_cmd);
19097 install_element(BGP_IPV6M_NODE,
19098 &no_neighbor_remove_private_as_all_replace_as_cmd);
19099 install_element(BGP_IPV6L_NODE, &neighbor_remove_private_as_cmd);
19100 install_element(BGP_IPV6L_NODE, &no_neighbor_remove_private_as_cmd);
19101 install_element(BGP_IPV6L_NODE, &neighbor_remove_private_as_all_cmd);
19102 install_element(BGP_IPV6L_NODE, &no_neighbor_remove_private_as_all_cmd);
19103 install_element(BGP_IPV6L_NODE,
19104 &neighbor_remove_private_as_replace_as_cmd);
19105 install_element(BGP_IPV6L_NODE,
19106 &no_neighbor_remove_private_as_replace_as_cmd);
19107 install_element(BGP_IPV6L_NODE,
19108 &neighbor_remove_private_as_all_replace_as_cmd);
19109 install_element(BGP_IPV6L_NODE,
19110 &no_neighbor_remove_private_as_all_replace_as_cmd);
19111 install_element(BGP_VPNV4_NODE, &neighbor_remove_private_as_cmd);
19112 install_element(BGP_VPNV4_NODE, &no_neighbor_remove_private_as_cmd);
19113 install_element(BGP_VPNV4_NODE, &neighbor_remove_private_as_all_cmd);
19114 install_element(BGP_VPNV4_NODE, &no_neighbor_remove_private_as_all_cmd);
19115 install_element(BGP_VPNV4_NODE,
19116 &neighbor_remove_private_as_replace_as_cmd);
19117 install_element(BGP_VPNV4_NODE,
19118 &no_neighbor_remove_private_as_replace_as_cmd);
19119 install_element(BGP_VPNV4_NODE,
19120 &neighbor_remove_private_as_all_replace_as_cmd);
19121 install_element(BGP_VPNV4_NODE,
19122 &no_neighbor_remove_private_as_all_replace_as_cmd);
19123 install_element(BGP_VPNV6_NODE, &neighbor_remove_private_as_cmd);
19124 install_element(BGP_VPNV6_NODE, &no_neighbor_remove_private_as_cmd);
19125 install_element(BGP_VPNV6_NODE, &neighbor_remove_private_as_all_cmd);
19126 install_element(BGP_VPNV6_NODE, &no_neighbor_remove_private_as_all_cmd);
19127 install_element(BGP_VPNV6_NODE,
19128 &neighbor_remove_private_as_replace_as_cmd);
19129 install_element(BGP_VPNV6_NODE,
19130 &no_neighbor_remove_private_as_replace_as_cmd);
19131 install_element(BGP_VPNV6_NODE,
19132 &neighbor_remove_private_as_all_replace_as_cmd);
19133 install_element(BGP_VPNV6_NODE,
19134 &no_neighbor_remove_private_as_all_replace_as_cmd);
19135
19136 /* "neighbor send-community" commands.*/
19137 install_element(BGP_NODE, &neighbor_send_community_hidden_cmd);
19138 install_element(BGP_NODE, &neighbor_send_community_type_hidden_cmd);
19139 install_element(BGP_NODE, &no_neighbor_send_community_hidden_cmd);
19140 install_element(BGP_NODE, &no_neighbor_send_community_type_hidden_cmd);
19141 install_element(BGP_IPV4_NODE, &neighbor_send_community_cmd);
19142 install_element(BGP_IPV4_NODE, &neighbor_send_community_type_cmd);
19143 install_element(BGP_IPV4_NODE, &no_neighbor_send_community_cmd);
19144 install_element(BGP_IPV4_NODE, &no_neighbor_send_community_type_cmd);
19145 install_element(BGP_IPV4M_NODE, &neighbor_send_community_cmd);
19146 install_element(BGP_IPV4M_NODE, &neighbor_send_community_type_cmd);
19147 install_element(BGP_IPV4M_NODE, &no_neighbor_send_community_cmd);
19148 install_element(BGP_IPV4M_NODE, &no_neighbor_send_community_type_cmd);
19149 install_element(BGP_IPV4L_NODE, &neighbor_send_community_cmd);
19150 install_element(BGP_IPV4L_NODE, &neighbor_send_community_type_cmd);
19151 install_element(BGP_IPV4L_NODE, &no_neighbor_send_community_cmd);
19152 install_element(BGP_IPV4L_NODE, &no_neighbor_send_community_type_cmd);
19153 install_element(BGP_IPV6_NODE, &neighbor_send_community_cmd);
19154 install_element(BGP_IPV6_NODE, &neighbor_send_community_type_cmd);
19155 install_element(BGP_IPV6_NODE, &no_neighbor_send_community_cmd);
19156 install_element(BGP_IPV6_NODE, &no_neighbor_send_community_type_cmd);
19157 install_element(BGP_IPV6M_NODE, &neighbor_send_community_cmd);
19158 install_element(BGP_IPV6M_NODE, &neighbor_send_community_type_cmd);
19159 install_element(BGP_IPV6M_NODE, &no_neighbor_send_community_cmd);
19160 install_element(BGP_IPV6M_NODE, &no_neighbor_send_community_type_cmd);
19161 install_element(BGP_IPV6L_NODE, &neighbor_send_community_cmd);
19162 install_element(BGP_IPV6L_NODE, &neighbor_send_community_type_cmd);
19163 install_element(BGP_IPV6L_NODE, &no_neighbor_send_community_cmd);
19164 install_element(BGP_IPV6L_NODE, &no_neighbor_send_community_type_cmd);
19165 install_element(BGP_VPNV4_NODE, &neighbor_send_community_cmd);
19166 install_element(BGP_VPNV4_NODE, &neighbor_send_community_type_cmd);
19167 install_element(BGP_VPNV4_NODE, &no_neighbor_send_community_cmd);
19168 install_element(BGP_VPNV4_NODE, &no_neighbor_send_community_type_cmd);
19169 install_element(BGP_VPNV6_NODE, &neighbor_send_community_cmd);
19170 install_element(BGP_VPNV6_NODE, &neighbor_send_community_type_cmd);
19171 install_element(BGP_VPNV6_NODE, &no_neighbor_send_community_cmd);
19172 install_element(BGP_VPNV6_NODE, &no_neighbor_send_community_type_cmd);
19173
19174 /* "neighbor route-reflector" commands.*/
19175 install_element(BGP_NODE, &neighbor_route_reflector_client_hidden_cmd);
19176 install_element(BGP_NODE,
19177 &no_neighbor_route_reflector_client_hidden_cmd);
19178 install_element(BGP_IPV4_NODE, &neighbor_route_reflector_client_cmd);
19179 install_element(BGP_IPV4_NODE, &no_neighbor_route_reflector_client_cmd);
19180 install_element(BGP_IPV4M_NODE, &neighbor_route_reflector_client_cmd);
19181 install_element(BGP_IPV4M_NODE,
19182 &no_neighbor_route_reflector_client_cmd);
19183 install_element(BGP_IPV4L_NODE, &neighbor_route_reflector_client_cmd);
19184 install_element(BGP_IPV4L_NODE,
19185 &no_neighbor_route_reflector_client_cmd);
19186 install_element(BGP_IPV6_NODE, &neighbor_route_reflector_client_cmd);
19187 install_element(BGP_IPV6_NODE, &no_neighbor_route_reflector_client_cmd);
19188 install_element(BGP_IPV6M_NODE, &neighbor_route_reflector_client_cmd);
19189 install_element(BGP_IPV6M_NODE,
19190 &no_neighbor_route_reflector_client_cmd);
19191 install_element(BGP_IPV6L_NODE, &neighbor_route_reflector_client_cmd);
19192 install_element(BGP_IPV6L_NODE,
19193 &no_neighbor_route_reflector_client_cmd);
19194 install_element(BGP_VPNV4_NODE, &neighbor_route_reflector_client_cmd);
19195 install_element(BGP_VPNV4_NODE,
19196 &no_neighbor_route_reflector_client_cmd);
19197 install_element(BGP_VPNV6_NODE, &neighbor_route_reflector_client_cmd);
19198 install_element(BGP_VPNV6_NODE,
19199 &no_neighbor_route_reflector_client_cmd);
7c40bf39 19200 install_element(BGP_FLOWSPECV4_NODE,
19201 &neighbor_route_reflector_client_cmd);
19202 install_element(BGP_FLOWSPECV4_NODE,
19203 &no_neighbor_route_reflector_client_cmd);
19204 install_element(BGP_FLOWSPECV6_NODE,
19205 &neighbor_route_reflector_client_cmd);
19206 install_element(BGP_FLOWSPECV6_NODE,
19207 &no_neighbor_route_reflector_client_cmd);
d62a17ae 19208 install_element(BGP_EVPN_NODE, &neighbor_route_reflector_client_cmd);
19209 install_element(BGP_EVPN_NODE, &no_neighbor_route_reflector_client_cmd);
19210
70cd87ca
MK
19211 /* "optimal-route-reflection" commands */
19212 install_element(BGP_IPV4_NODE, &optimal_route_reflection_cmd);
19213 install_element(BGP_IPV4M_NODE, &optimal_route_reflection_cmd);
19214 install_element(BGP_IPV4L_NODE, &optimal_route_reflection_cmd);
19215 install_element(BGP_IPV6_NODE, &optimal_route_reflection_cmd);
19216 install_element(BGP_IPV6M_NODE, &optimal_route_reflection_cmd);
19217 install_element(BGP_IPV6L_NODE, &optimal_route_reflection_cmd);
19218 install_element(BGP_VPNV4_NODE, &optimal_route_reflection_cmd);
19219 install_element(BGP_VPNV6_NODE, &optimal_route_reflection_cmd);
19220 install_element(BGP_FLOWSPECV4_NODE, &optimal_route_reflection_cmd);
19221 install_element(BGP_FLOWSPECV6_NODE, &optimal_route_reflection_cmd);
19222 install_element(BGP_EVPN_NODE, &optimal_route_reflection_cmd);
19223
19224 /* "neighbor optimal-route-reflection" commands */
19225 install_element(BGP_IPV4_NODE, &neighbor_optimal_route_reflection_cmd);
19226 install_element(BGP_IPV4M_NODE, &neighbor_optimal_route_reflection_cmd);
19227 install_element(BGP_IPV4L_NODE, &neighbor_optimal_route_reflection_cmd);
19228 install_element(BGP_IPV6_NODE, &neighbor_optimal_route_reflection_cmd);
19229 install_element(BGP_IPV6M_NODE, &neighbor_optimal_route_reflection_cmd);
19230 install_element(BGP_IPV6L_NODE, &neighbor_optimal_route_reflection_cmd);
19231 install_element(BGP_VPNV4_NODE, &neighbor_optimal_route_reflection_cmd);
19232 install_element(BGP_VPNV6_NODE, &neighbor_optimal_route_reflection_cmd);
19233 install_element(BGP_FLOWSPECV4_NODE,
19234 &neighbor_optimal_route_reflection_cmd);
19235 install_element(BGP_FLOWSPECV6_NODE,
19236 &neighbor_optimal_route_reflection_cmd);
19237 install_element(BGP_EVPN_NODE, &neighbor_optimal_route_reflection_cmd);
19238
d62a17ae 19239 /* "neighbor route-server" commands.*/
19240 install_element(BGP_NODE, &neighbor_route_server_client_hidden_cmd);
19241 install_element(BGP_NODE, &no_neighbor_route_server_client_hidden_cmd);
19242 install_element(BGP_IPV4_NODE, &neighbor_route_server_client_cmd);
19243 install_element(BGP_IPV4_NODE, &no_neighbor_route_server_client_cmd);
19244 install_element(BGP_IPV4M_NODE, &neighbor_route_server_client_cmd);
19245 install_element(BGP_IPV4M_NODE, &no_neighbor_route_server_client_cmd);
19246 install_element(BGP_IPV4L_NODE, &neighbor_route_server_client_cmd);
19247 install_element(BGP_IPV4L_NODE, &no_neighbor_route_server_client_cmd);
19248 install_element(BGP_IPV6_NODE, &neighbor_route_server_client_cmd);
19249 install_element(BGP_IPV6_NODE, &no_neighbor_route_server_client_cmd);
19250 install_element(BGP_IPV6M_NODE, &neighbor_route_server_client_cmd);
19251 install_element(BGP_IPV6M_NODE, &no_neighbor_route_server_client_cmd);
19252 install_element(BGP_IPV6L_NODE, &neighbor_route_server_client_cmd);
19253 install_element(BGP_IPV6L_NODE, &no_neighbor_route_server_client_cmd);
19254 install_element(BGP_VPNV4_NODE, &neighbor_route_server_client_cmd);
19255 install_element(BGP_VPNV4_NODE, &no_neighbor_route_server_client_cmd);
19256 install_element(BGP_VPNV6_NODE, &neighbor_route_server_client_cmd);
19257 install_element(BGP_VPNV6_NODE, &no_neighbor_route_server_client_cmd);
a6627c99
LK
19258 install_element(BGP_EVPN_NODE, &neighbor_route_server_client_cmd);
19259 install_element(BGP_EVPN_NODE, &no_neighbor_route_server_client_cmd);
7c40bf39 19260 install_element(BGP_FLOWSPECV4_NODE, &neighbor_route_server_client_cmd);
19261 install_element(BGP_FLOWSPECV4_NODE,
19262 &no_neighbor_route_server_client_cmd);
19263 install_element(BGP_FLOWSPECV6_NODE, &neighbor_route_server_client_cmd);
19264 install_element(BGP_FLOWSPECV6_NODE,
19265 &no_neighbor_route_server_client_cmd);
d62a17ae 19266
7c0e4312
DA
19267 /* "neighbor disable-addpath-rx" commands. */
19268 install_element(BGP_IPV4_NODE, &neighbor_disable_addpath_rx_cmd);
19269 install_element(BGP_IPV4_NODE, &no_neighbor_disable_addpath_rx_cmd);
19270 install_element(BGP_IPV4M_NODE, &neighbor_disable_addpath_rx_cmd);
19271 install_element(BGP_IPV4M_NODE, &no_neighbor_disable_addpath_rx_cmd);
19272 install_element(BGP_IPV4L_NODE, &neighbor_disable_addpath_rx_cmd);
19273 install_element(BGP_IPV4L_NODE, &no_neighbor_disable_addpath_rx_cmd);
19274 install_element(BGP_IPV6_NODE, &neighbor_disable_addpath_rx_cmd);
19275 install_element(BGP_IPV6_NODE, &no_neighbor_disable_addpath_rx_cmd);
19276 install_element(BGP_IPV6M_NODE, &neighbor_disable_addpath_rx_cmd);
19277 install_element(BGP_IPV6M_NODE, &no_neighbor_disable_addpath_rx_cmd);
19278 install_element(BGP_IPV6L_NODE, &neighbor_disable_addpath_rx_cmd);
19279 install_element(BGP_IPV6L_NODE, &no_neighbor_disable_addpath_rx_cmd);
19280 install_element(BGP_VPNV4_NODE, &neighbor_disable_addpath_rx_cmd);
19281 install_element(BGP_VPNV4_NODE, &no_neighbor_disable_addpath_rx_cmd);
19282 install_element(BGP_VPNV6_NODE, &neighbor_disable_addpath_rx_cmd);
19283 install_element(BGP_VPNV6_NODE, &no_neighbor_disable_addpath_rx_cmd);
19284
d62a17ae 19285 /* "neighbor addpath-tx-all-paths" commands.*/
19286 install_element(BGP_NODE, &neighbor_addpath_tx_all_paths_hidden_cmd);
19287 install_element(BGP_NODE, &no_neighbor_addpath_tx_all_paths_hidden_cmd);
19288 install_element(BGP_IPV4_NODE, &neighbor_addpath_tx_all_paths_cmd);
19289 install_element(BGP_IPV4_NODE, &no_neighbor_addpath_tx_all_paths_cmd);
19290 install_element(BGP_IPV4M_NODE, &neighbor_addpath_tx_all_paths_cmd);
19291 install_element(BGP_IPV4M_NODE, &no_neighbor_addpath_tx_all_paths_cmd);
19292 install_element(BGP_IPV4L_NODE, &neighbor_addpath_tx_all_paths_cmd);
19293 install_element(BGP_IPV4L_NODE, &no_neighbor_addpath_tx_all_paths_cmd);
19294 install_element(BGP_IPV6_NODE, &neighbor_addpath_tx_all_paths_cmd);
19295 install_element(BGP_IPV6_NODE, &no_neighbor_addpath_tx_all_paths_cmd);
19296 install_element(BGP_IPV6M_NODE, &neighbor_addpath_tx_all_paths_cmd);
19297 install_element(BGP_IPV6M_NODE, &no_neighbor_addpath_tx_all_paths_cmd);
19298 install_element(BGP_IPV6L_NODE, &neighbor_addpath_tx_all_paths_cmd);
19299 install_element(BGP_IPV6L_NODE, &no_neighbor_addpath_tx_all_paths_cmd);
19300 install_element(BGP_VPNV4_NODE, &neighbor_addpath_tx_all_paths_cmd);
19301 install_element(BGP_VPNV4_NODE, &no_neighbor_addpath_tx_all_paths_cmd);
19302 install_element(BGP_VPNV6_NODE, &neighbor_addpath_tx_all_paths_cmd);
19303 install_element(BGP_VPNV6_NODE, &no_neighbor_addpath_tx_all_paths_cmd);
19304
19305 /* "neighbor addpath-tx-bestpath-per-AS" commands.*/
19306 install_element(BGP_NODE,
19307 &neighbor_addpath_tx_bestpath_per_as_hidden_cmd);
19308 install_element(BGP_NODE,
19309 &no_neighbor_addpath_tx_bestpath_per_as_hidden_cmd);
19310 install_element(BGP_IPV4_NODE,
19311 &neighbor_addpath_tx_bestpath_per_as_cmd);
19312 install_element(BGP_IPV4_NODE,
19313 &no_neighbor_addpath_tx_bestpath_per_as_cmd);
19314 install_element(BGP_IPV4M_NODE,
19315 &neighbor_addpath_tx_bestpath_per_as_cmd);
19316 install_element(BGP_IPV4M_NODE,
19317 &no_neighbor_addpath_tx_bestpath_per_as_cmd);
19318 install_element(BGP_IPV4L_NODE,
19319 &neighbor_addpath_tx_bestpath_per_as_cmd);
19320 install_element(BGP_IPV4L_NODE,
19321 &no_neighbor_addpath_tx_bestpath_per_as_cmd);
19322 install_element(BGP_IPV6_NODE,
19323 &neighbor_addpath_tx_bestpath_per_as_cmd);
19324 install_element(BGP_IPV6_NODE,
19325 &no_neighbor_addpath_tx_bestpath_per_as_cmd);
19326 install_element(BGP_IPV6M_NODE,
19327 &neighbor_addpath_tx_bestpath_per_as_cmd);
19328 install_element(BGP_IPV6M_NODE,
19329 &no_neighbor_addpath_tx_bestpath_per_as_cmd);
19330 install_element(BGP_IPV6L_NODE,
19331 &neighbor_addpath_tx_bestpath_per_as_cmd);
19332 install_element(BGP_IPV6L_NODE,
19333 &no_neighbor_addpath_tx_bestpath_per_as_cmd);
19334 install_element(BGP_VPNV4_NODE,
19335 &neighbor_addpath_tx_bestpath_per_as_cmd);
19336 install_element(BGP_VPNV4_NODE,
19337 &no_neighbor_addpath_tx_bestpath_per_as_cmd);
19338 install_element(BGP_VPNV6_NODE,
19339 &neighbor_addpath_tx_bestpath_per_as_cmd);
19340 install_element(BGP_VPNV6_NODE,
19341 &no_neighbor_addpath_tx_bestpath_per_as_cmd);
19342
2b31007c
RZ
19343 /* "neighbor sender-as-path-loop-detection" commands. */
19344 install_element(BGP_NODE, &neighbor_aspath_loop_detection_cmd);
19345 install_element(BGP_NODE, &no_neighbor_aspath_loop_detection_cmd);
19346
d62a17ae 19347 /* "neighbor passive" commands. */
19348 install_element(BGP_NODE, &neighbor_passive_cmd);
19349 install_element(BGP_NODE, &no_neighbor_passive_cmd);
19350
19351
19352 /* "neighbor shutdown" commands. */
19353 install_element(BGP_NODE, &neighbor_shutdown_cmd);
19354 install_element(BGP_NODE, &no_neighbor_shutdown_cmd);
19355 install_element(BGP_NODE, &neighbor_shutdown_msg_cmd);
19356 install_element(BGP_NODE, &no_neighbor_shutdown_msg_cmd);
8336c896
DA
19357 install_element(BGP_NODE, &neighbor_shutdown_rtt_cmd);
19358 install_element(BGP_NODE, &no_neighbor_shutdown_rtt_cmd);
d62a17ae 19359
19360 /* "neighbor capability extended-nexthop" commands.*/
19361 install_element(BGP_NODE, &neighbor_capability_enhe_cmd);
19362 install_element(BGP_NODE, &no_neighbor_capability_enhe_cmd);
19363
19364 /* "neighbor capability orf prefix-list" commands.*/
19365 install_element(BGP_NODE, &neighbor_capability_orf_prefix_hidden_cmd);
19366 install_element(BGP_NODE,
19367 &no_neighbor_capability_orf_prefix_hidden_cmd);
19368 install_element(BGP_IPV4_NODE, &neighbor_capability_orf_prefix_cmd);
19369 install_element(BGP_IPV4_NODE, &no_neighbor_capability_orf_prefix_cmd);
19370 install_element(BGP_IPV4M_NODE, &neighbor_capability_orf_prefix_cmd);
19371 install_element(BGP_IPV4M_NODE, &no_neighbor_capability_orf_prefix_cmd);
19372 install_element(BGP_IPV4L_NODE, &neighbor_capability_orf_prefix_cmd);
19373 install_element(BGP_IPV4L_NODE, &no_neighbor_capability_orf_prefix_cmd);
19374 install_element(BGP_IPV6_NODE, &neighbor_capability_orf_prefix_cmd);
19375 install_element(BGP_IPV6_NODE, &no_neighbor_capability_orf_prefix_cmd);
19376 install_element(BGP_IPV6M_NODE, &neighbor_capability_orf_prefix_cmd);
19377 install_element(BGP_IPV6M_NODE, &no_neighbor_capability_orf_prefix_cmd);
19378 install_element(BGP_IPV6L_NODE, &neighbor_capability_orf_prefix_cmd);
19379 install_element(BGP_IPV6L_NODE, &no_neighbor_capability_orf_prefix_cmd);
19380
19381 /* "neighbor capability dynamic" commands.*/
19382 install_element(BGP_NODE, &neighbor_capability_dynamic_cmd);
19383 install_element(BGP_NODE, &no_neighbor_capability_dynamic_cmd);
19384
19385 /* "neighbor dont-capability-negotiate" commands. */
19386 install_element(BGP_NODE, &neighbor_dont_capability_negotiate_cmd);
19387 install_element(BGP_NODE, &no_neighbor_dont_capability_negotiate_cmd);
19388
19389 /* "neighbor ebgp-multihop" commands. */
19390 install_element(BGP_NODE, &neighbor_ebgp_multihop_cmd);
19391 install_element(BGP_NODE, &neighbor_ebgp_multihop_ttl_cmd);
19392 install_element(BGP_NODE, &no_neighbor_ebgp_multihop_cmd);
19393
19394 /* "neighbor disable-connected-check" commands. */
19395 install_element(BGP_NODE, &neighbor_disable_connected_check_cmd);
19396 install_element(BGP_NODE, &no_neighbor_disable_connected_check_cmd);
19397
7ab294ea
DA
19398 /* "neighbor disable-link-bw-encoding-ieee" commands. */
19399 install_element(BGP_NODE, &neighbor_disable_link_bw_encoding_ieee_cmd);
19400 install_element(BGP_NODE,
19401 &no_neighbor_disable_link_bw_encoding_ieee_cmd);
27aa23a4 19402
d08c0c80
DA
19403 /* "neighbor extended-optional-parameters" commands. */
19404 install_element(BGP_NODE, &neighbor_extended_optional_parameters_cmd);
19405 install_element(BGP_NODE,
19406 &no_neighbor_extended_optional_parameters_cmd);
19407
47cbc09b
PM
19408 /* "neighbor enforce-first-as" commands. */
19409 install_element(BGP_NODE, &neighbor_enforce_first_as_cmd);
19410 install_element(BGP_NODE, &no_neighbor_enforce_first_as_cmd);
19411
d62a17ae 19412 /* "neighbor description" commands. */
19413 install_element(BGP_NODE, &neighbor_description_cmd);
19414 install_element(BGP_NODE, &no_neighbor_description_cmd);
a14810f4 19415 install_element(BGP_NODE, &no_neighbor_description_comment_cmd);
d62a17ae 19416
19417 /* "neighbor update-source" commands. "*/
19418 install_element(BGP_NODE, &neighbor_update_source_cmd);
19419 install_element(BGP_NODE, &no_neighbor_update_source_cmd);
19420
19421 /* "neighbor default-originate" commands. */
19422 install_element(BGP_NODE, &neighbor_default_originate_hidden_cmd);
19423 install_element(BGP_NODE, &neighbor_default_originate_rmap_hidden_cmd);
19424 install_element(BGP_NODE, &no_neighbor_default_originate_hidden_cmd);
19425 install_element(BGP_IPV4_NODE, &neighbor_default_originate_cmd);
19426 install_element(BGP_IPV4_NODE, &neighbor_default_originate_rmap_cmd);
19427 install_element(BGP_IPV4_NODE, &no_neighbor_default_originate_cmd);
19428 install_element(BGP_IPV4M_NODE, &neighbor_default_originate_cmd);
19429 install_element(BGP_IPV4M_NODE, &neighbor_default_originate_rmap_cmd);
19430 install_element(BGP_IPV4M_NODE, &no_neighbor_default_originate_cmd);
19431 install_element(BGP_IPV4L_NODE, &neighbor_default_originate_cmd);
19432 install_element(BGP_IPV4L_NODE, &neighbor_default_originate_rmap_cmd);
19433 install_element(BGP_IPV4L_NODE, &no_neighbor_default_originate_cmd);
19434 install_element(BGP_IPV6_NODE, &neighbor_default_originate_cmd);
19435 install_element(BGP_IPV6_NODE, &neighbor_default_originate_rmap_cmd);
19436 install_element(BGP_IPV6_NODE, &no_neighbor_default_originate_cmd);
19437 install_element(BGP_IPV6M_NODE, &neighbor_default_originate_cmd);
19438 install_element(BGP_IPV6M_NODE, &neighbor_default_originate_rmap_cmd);
19439 install_element(BGP_IPV6M_NODE, &no_neighbor_default_originate_cmd);
19440 install_element(BGP_IPV6L_NODE, &neighbor_default_originate_cmd);
19441 install_element(BGP_IPV6L_NODE, &neighbor_default_originate_rmap_cmd);
19442 install_element(BGP_IPV6L_NODE, &no_neighbor_default_originate_cmd);
19443
19444 /* "neighbor port" commands. */
19445 install_element(BGP_NODE, &neighbor_port_cmd);
19446 install_element(BGP_NODE, &no_neighbor_port_cmd);
19447
19448 /* "neighbor weight" commands. */
19449 install_element(BGP_NODE, &neighbor_weight_hidden_cmd);
19450 install_element(BGP_NODE, &no_neighbor_weight_hidden_cmd);
19451
19452 install_element(BGP_IPV4_NODE, &neighbor_weight_cmd);
19453 install_element(BGP_IPV4_NODE, &no_neighbor_weight_cmd);
19454 install_element(BGP_IPV4M_NODE, &neighbor_weight_cmd);
19455 install_element(BGP_IPV4M_NODE, &no_neighbor_weight_cmd);
19456 install_element(BGP_IPV4L_NODE, &neighbor_weight_cmd);
19457 install_element(BGP_IPV4L_NODE, &no_neighbor_weight_cmd);
19458 install_element(BGP_IPV6_NODE, &neighbor_weight_cmd);
19459 install_element(BGP_IPV6_NODE, &no_neighbor_weight_cmd);
19460 install_element(BGP_IPV6M_NODE, &neighbor_weight_cmd);
19461 install_element(BGP_IPV6M_NODE, &no_neighbor_weight_cmd);
19462 install_element(BGP_IPV6L_NODE, &neighbor_weight_cmd);
19463 install_element(BGP_IPV6L_NODE, &no_neighbor_weight_cmd);
19464 install_element(BGP_VPNV4_NODE, &neighbor_weight_cmd);
19465 install_element(BGP_VPNV4_NODE, &no_neighbor_weight_cmd);
19466 install_element(BGP_VPNV6_NODE, &neighbor_weight_cmd);
19467 install_element(BGP_VPNV6_NODE, &no_neighbor_weight_cmd);
19468
19469 /* "neighbor override-capability" commands. */
19470 install_element(BGP_NODE, &neighbor_override_capability_cmd);
19471 install_element(BGP_NODE, &no_neighbor_override_capability_cmd);
19472
19473 /* "neighbor strict-capability-match" commands. */
19474 install_element(BGP_NODE, &neighbor_strict_capability_cmd);
19475 install_element(BGP_NODE, &no_neighbor_strict_capability_cmd);
19476
19477 /* "neighbor timers" commands. */
19478 install_element(BGP_NODE, &neighbor_timers_cmd);
19479 install_element(BGP_NODE, &no_neighbor_timers_cmd);
19480
19481 /* "neighbor timers connect" commands. */
19482 install_element(BGP_NODE, &neighbor_timers_connect_cmd);
19483 install_element(BGP_NODE, &no_neighbor_timers_connect_cmd);
19484
d43114f3
DS
19485 /* "neighbor timers delayopen" commands. */
19486 install_element(BGP_NODE, &neighbor_timers_delayopen_cmd);
19487 install_element(BGP_NODE, &no_neighbor_timers_delayopen_cmd);
19488
d62a17ae 19489 /* "neighbor advertisement-interval" commands. */
19490 install_element(BGP_NODE, &neighbor_advertise_interval_cmd);
19491 install_element(BGP_NODE, &no_neighbor_advertise_interval_cmd);
19492
19493 /* "neighbor interface" commands. */
19494 install_element(BGP_NODE, &neighbor_interface_cmd);
19495 install_element(BGP_NODE, &no_neighbor_interface_cmd);
19496
19497 /* "neighbor distribute" commands. */
19498 install_element(BGP_NODE, &neighbor_distribute_list_hidden_cmd);
19499 install_element(BGP_NODE, &no_neighbor_distribute_list_hidden_cmd);
19500 install_element(BGP_IPV4_NODE, &neighbor_distribute_list_cmd);
19501 install_element(BGP_IPV4_NODE, &no_neighbor_distribute_list_cmd);
19502 install_element(BGP_IPV4M_NODE, &neighbor_distribute_list_cmd);
19503 install_element(BGP_IPV4M_NODE, &no_neighbor_distribute_list_cmd);
19504 install_element(BGP_IPV4L_NODE, &neighbor_distribute_list_cmd);
19505 install_element(BGP_IPV4L_NODE, &no_neighbor_distribute_list_cmd);
19506 install_element(BGP_IPV6_NODE, &neighbor_distribute_list_cmd);
19507 install_element(BGP_IPV6_NODE, &no_neighbor_distribute_list_cmd);
19508 install_element(BGP_IPV6M_NODE, &neighbor_distribute_list_cmd);
19509 install_element(BGP_IPV6M_NODE, &no_neighbor_distribute_list_cmd);
19510 install_element(BGP_IPV6L_NODE, &neighbor_distribute_list_cmd);
19511 install_element(BGP_IPV6L_NODE, &no_neighbor_distribute_list_cmd);
19512 install_element(BGP_VPNV4_NODE, &neighbor_distribute_list_cmd);
19513 install_element(BGP_VPNV4_NODE, &no_neighbor_distribute_list_cmd);
19514 install_element(BGP_VPNV6_NODE, &neighbor_distribute_list_cmd);
19515 install_element(BGP_VPNV6_NODE, &no_neighbor_distribute_list_cmd);
19516
19517 /* "neighbor prefix-list" commands. */
19518 install_element(BGP_NODE, &neighbor_prefix_list_hidden_cmd);
642ef664 19519 install_element(BGP_NODE, &no_neighbor_prefix_list_hidden_cmd);
d62a17ae 19520 install_element(BGP_IPV4_NODE, &neighbor_prefix_list_cmd);
642ef664 19521 install_element(BGP_IPV4_NODE, &no_neighbor_prefix_list_cmd);
d62a17ae 19522 install_element(BGP_IPV4M_NODE, &neighbor_prefix_list_cmd);
642ef664 19523 install_element(BGP_IPV4M_NODE, &no_neighbor_prefix_list_cmd);
d62a17ae 19524 install_element(BGP_IPV4L_NODE, &neighbor_prefix_list_cmd);
642ef664 19525 install_element(BGP_IPV4L_NODE, &no_neighbor_prefix_list_cmd);
d62a17ae 19526 install_element(BGP_IPV6_NODE, &neighbor_prefix_list_cmd);
642ef664 19527 install_element(BGP_IPV6_NODE, &no_neighbor_prefix_list_cmd);
d62a17ae 19528 install_element(BGP_IPV6M_NODE, &neighbor_prefix_list_cmd);
642ef664 19529 install_element(BGP_IPV6M_NODE, &no_neighbor_prefix_list_cmd);
d62a17ae 19530 install_element(BGP_IPV6L_NODE, &neighbor_prefix_list_cmd);
642ef664 19531 install_element(BGP_IPV6L_NODE, &no_neighbor_prefix_list_cmd);
d62a17ae 19532 install_element(BGP_VPNV4_NODE, &neighbor_prefix_list_cmd);
642ef664 19533 install_element(BGP_VPNV4_NODE, &no_neighbor_prefix_list_cmd);
d62a17ae 19534 install_element(BGP_VPNV6_NODE, &neighbor_prefix_list_cmd);
642ef664 19535 install_element(BGP_VPNV6_NODE, &no_neighbor_prefix_list_cmd);
7c40bf39 19536 install_element(BGP_FLOWSPECV4_NODE, &neighbor_prefix_list_cmd);
642ef664 19537 install_element(BGP_FLOWSPECV4_NODE, &no_neighbor_prefix_list_cmd);
7c40bf39 19538 install_element(BGP_FLOWSPECV6_NODE, &neighbor_prefix_list_cmd);
642ef664 19539 install_element(BGP_FLOWSPECV6_NODE, &no_neighbor_prefix_list_cmd);
d62a17ae 19540
19541 /* "neighbor filter-list" commands. */
19542 install_element(BGP_NODE, &neighbor_filter_list_hidden_cmd);
19543 install_element(BGP_NODE, &no_neighbor_filter_list_hidden_cmd);
19544 install_element(BGP_IPV4_NODE, &neighbor_filter_list_cmd);
19545 install_element(BGP_IPV4_NODE, &no_neighbor_filter_list_cmd);
19546 install_element(BGP_IPV4M_NODE, &neighbor_filter_list_cmd);
19547 install_element(BGP_IPV4M_NODE, &no_neighbor_filter_list_cmd);
19548 install_element(BGP_IPV4L_NODE, &neighbor_filter_list_cmd);
19549 install_element(BGP_IPV4L_NODE, &no_neighbor_filter_list_cmd);
19550 install_element(BGP_IPV6_NODE, &neighbor_filter_list_cmd);
19551 install_element(BGP_IPV6_NODE, &no_neighbor_filter_list_cmd);
19552 install_element(BGP_IPV6M_NODE, &neighbor_filter_list_cmd);
19553 install_element(BGP_IPV6M_NODE, &no_neighbor_filter_list_cmd);
19554 install_element(BGP_IPV6L_NODE, &neighbor_filter_list_cmd);
19555 install_element(BGP_IPV6L_NODE, &no_neighbor_filter_list_cmd);
19556 install_element(BGP_VPNV4_NODE, &neighbor_filter_list_cmd);
19557 install_element(BGP_VPNV4_NODE, &no_neighbor_filter_list_cmd);
19558 install_element(BGP_VPNV6_NODE, &neighbor_filter_list_cmd);
19559 install_element(BGP_VPNV6_NODE, &no_neighbor_filter_list_cmd);
7c40bf39 19560 install_element(BGP_FLOWSPECV4_NODE, &neighbor_filter_list_cmd);
19561 install_element(BGP_FLOWSPECV4_NODE, &no_neighbor_filter_list_cmd);
19562 install_element(BGP_FLOWSPECV6_NODE, &neighbor_filter_list_cmd);
19563 install_element(BGP_FLOWSPECV6_NODE, &no_neighbor_filter_list_cmd);
d62a17ae 19564
19565 /* "neighbor route-map" commands. */
d6d7ed37
IR
19566 install_element(BGP_NODE, &neighbor_route_map_hidden_cmd);
19567 install_element(BGP_NODE, &no_neighbor_route_map_hidden_cmd);
d62a17ae 19568 install_element(BGP_IPV4_NODE, &neighbor_route_map_cmd);
0ea8d871 19569 install_element(BGP_IPV4_NODE, &no_neighbor_route_map_cmd);
d62a17ae 19570 install_element(BGP_IPV4M_NODE, &neighbor_route_map_cmd);
0ea8d871 19571 install_element(BGP_IPV4M_NODE, &no_neighbor_route_map_cmd);
d62a17ae 19572 install_element(BGP_IPV4L_NODE, &neighbor_route_map_cmd);
0ea8d871 19573 install_element(BGP_IPV4L_NODE, &no_neighbor_route_map_cmd);
d62a17ae 19574 install_element(BGP_IPV6_NODE, &neighbor_route_map_cmd);
0ea8d871 19575 install_element(BGP_IPV6_NODE, &no_neighbor_route_map_cmd);
d62a17ae 19576 install_element(BGP_IPV6M_NODE, &neighbor_route_map_cmd);
0ea8d871 19577 install_element(BGP_IPV6M_NODE, &no_neighbor_route_map_cmd);
d62a17ae 19578 install_element(BGP_IPV6L_NODE, &neighbor_route_map_cmd);
0ea8d871 19579 install_element(BGP_IPV6L_NODE, &no_neighbor_route_map_cmd);
d62a17ae 19580 install_element(BGP_VPNV4_NODE, &neighbor_route_map_cmd);
0ea8d871 19581 install_element(BGP_VPNV4_NODE, &no_neighbor_route_map_cmd);
d62a17ae 19582 install_element(BGP_VPNV6_NODE, &neighbor_route_map_cmd);
0ea8d871 19583 install_element(BGP_VPNV6_NODE, &no_neighbor_route_map_cmd);
7c40bf39 19584 install_element(BGP_FLOWSPECV4_NODE, &neighbor_route_map_cmd);
0ea8d871 19585 install_element(BGP_FLOWSPECV4_NODE, &no_neighbor_route_map_cmd);
7c40bf39 19586 install_element(BGP_FLOWSPECV6_NODE, &neighbor_route_map_cmd);
0ea8d871 19587 install_element(BGP_FLOWSPECV6_NODE, &no_neighbor_route_map_cmd);
d37ba549 19588 install_element(BGP_EVPN_NODE, &neighbor_route_map_cmd);
0ea8d871 19589 install_element(BGP_EVPN_NODE, &no_neighbor_route_map_cmd);
d62a17ae 19590
19591 /* "neighbor unsuppress-map" commands. */
19592 install_element(BGP_NODE, &neighbor_unsuppress_map_hidden_cmd);
19593 install_element(BGP_NODE, &no_neighbor_unsuppress_map_hidden_cmd);
19594 install_element(BGP_IPV4_NODE, &neighbor_unsuppress_map_cmd);
19595 install_element(BGP_IPV4_NODE, &no_neighbor_unsuppress_map_cmd);
19596 install_element(BGP_IPV4M_NODE, &neighbor_unsuppress_map_cmd);
19597 install_element(BGP_IPV4M_NODE, &no_neighbor_unsuppress_map_cmd);
19598 install_element(BGP_IPV4L_NODE, &neighbor_unsuppress_map_cmd);
19599 install_element(BGP_IPV4L_NODE, &no_neighbor_unsuppress_map_cmd);
19600 install_element(BGP_IPV6_NODE, &neighbor_unsuppress_map_cmd);
19601 install_element(BGP_IPV6_NODE, &no_neighbor_unsuppress_map_cmd);
19602 install_element(BGP_IPV6M_NODE, &neighbor_unsuppress_map_cmd);
19603 install_element(BGP_IPV6M_NODE, &no_neighbor_unsuppress_map_cmd);
19604 install_element(BGP_IPV6L_NODE, &neighbor_unsuppress_map_cmd);
19605 install_element(BGP_IPV6L_NODE, &no_neighbor_unsuppress_map_cmd);
19606 install_element(BGP_VPNV4_NODE, &neighbor_unsuppress_map_cmd);
19607 install_element(BGP_VPNV4_NODE, &no_neighbor_unsuppress_map_cmd);
19608 install_element(BGP_VPNV6_NODE, &neighbor_unsuppress_map_cmd);
19609 install_element(BGP_VPNV6_NODE, &no_neighbor_unsuppress_map_cmd);
19610
7f7940e6 19611 /* "neighbor advertise-map" commands. */
389e4f92 19612 install_element(BGP_NODE, &bgp_condadv_period_cmd);
7f7940e6 19613 install_element(BGP_NODE, &neighbor_advertise_map_hidden_cmd);
7f7940e6 19614 install_element(BGP_IPV4_NODE, &neighbor_advertise_map_cmd);
7f7940e6 19615 install_element(BGP_IPV4M_NODE, &neighbor_advertise_map_cmd);
7f7940e6 19616 install_element(BGP_IPV4L_NODE, &neighbor_advertise_map_cmd);
7f7940e6 19617 install_element(BGP_IPV6_NODE, &neighbor_advertise_map_cmd);
7f7940e6 19618 install_element(BGP_IPV6M_NODE, &neighbor_advertise_map_cmd);
7f7940e6 19619 install_element(BGP_IPV6L_NODE, &neighbor_advertise_map_cmd);
7f7940e6 19620 install_element(BGP_VPNV4_NODE, &neighbor_advertise_map_cmd);
7f7940e6 19621 install_element(BGP_VPNV6_NODE, &neighbor_advertise_map_cmd);
7f7940e6 19622
fde246e8
DA
19623 /* neighbor maximum-prefix-out commands. */
19624 install_element(BGP_NODE, &neighbor_maximum_prefix_out_cmd);
19625 install_element(BGP_NODE, &no_neighbor_maximum_prefix_out_cmd);
19626 install_element(BGP_IPV4_NODE, &neighbor_maximum_prefix_out_cmd);
19627 install_element(BGP_IPV4_NODE, &no_neighbor_maximum_prefix_out_cmd);
19628 install_element(BGP_IPV4M_NODE, &neighbor_maximum_prefix_out_cmd);
19629 install_element(BGP_IPV4M_NODE, &no_neighbor_maximum_prefix_out_cmd);
19630 install_element(BGP_IPV4L_NODE, &neighbor_maximum_prefix_out_cmd);
19631 install_element(BGP_IPV4L_NODE, &no_neighbor_maximum_prefix_out_cmd);
19632 install_element(BGP_IPV6_NODE, &neighbor_maximum_prefix_out_cmd);
19633 install_element(BGP_IPV6_NODE, &no_neighbor_maximum_prefix_out_cmd);
19634 install_element(BGP_IPV6M_NODE, &neighbor_maximum_prefix_out_cmd);
19635 install_element(BGP_IPV6M_NODE, &no_neighbor_maximum_prefix_out_cmd);
19636 install_element(BGP_IPV6L_NODE, &neighbor_maximum_prefix_out_cmd);
19637 install_element(BGP_IPV6L_NODE, &no_neighbor_maximum_prefix_out_cmd);
19638 install_element(BGP_VPNV4_NODE, &neighbor_maximum_prefix_out_cmd);
19639 install_element(BGP_VPNV4_NODE, &no_neighbor_maximum_prefix_out_cmd);
19640 install_element(BGP_VPNV6_NODE, &neighbor_maximum_prefix_out_cmd);
19641 install_element(BGP_VPNV6_NODE, &no_neighbor_maximum_prefix_out_cmd);
19642
d62a17ae 19643 /* "neighbor maximum-prefix" commands. */
19644 install_element(BGP_NODE, &neighbor_maximum_prefix_hidden_cmd);
19645 install_element(BGP_NODE,
19646 &neighbor_maximum_prefix_threshold_hidden_cmd);
19647 install_element(BGP_NODE, &neighbor_maximum_prefix_warning_hidden_cmd);
19648 install_element(BGP_NODE,
19649 &neighbor_maximum_prefix_threshold_warning_hidden_cmd);
19650 install_element(BGP_NODE, &neighbor_maximum_prefix_restart_hidden_cmd);
19651 install_element(BGP_NODE,
19652 &neighbor_maximum_prefix_threshold_restart_hidden_cmd);
19653 install_element(BGP_NODE, &no_neighbor_maximum_prefix_hidden_cmd);
19654 install_element(BGP_IPV4_NODE, &neighbor_maximum_prefix_cmd);
19655 install_element(BGP_IPV4_NODE, &neighbor_maximum_prefix_threshold_cmd);
19656 install_element(BGP_IPV4_NODE, &neighbor_maximum_prefix_warning_cmd);
19657 install_element(BGP_IPV4_NODE,
19658 &neighbor_maximum_prefix_threshold_warning_cmd);
19659 install_element(BGP_IPV4_NODE, &neighbor_maximum_prefix_restart_cmd);
19660 install_element(BGP_IPV4_NODE,
19661 &neighbor_maximum_prefix_threshold_restart_cmd);
19662 install_element(BGP_IPV4_NODE, &no_neighbor_maximum_prefix_cmd);
19663 install_element(BGP_IPV4M_NODE, &neighbor_maximum_prefix_cmd);
19664 install_element(BGP_IPV4M_NODE, &neighbor_maximum_prefix_threshold_cmd);
19665 install_element(BGP_IPV4M_NODE, &neighbor_maximum_prefix_warning_cmd);
19666 install_element(BGP_IPV4M_NODE,
19667 &neighbor_maximum_prefix_threshold_warning_cmd);
19668 install_element(BGP_IPV4M_NODE, &neighbor_maximum_prefix_restart_cmd);
19669 install_element(BGP_IPV4M_NODE,
19670 &neighbor_maximum_prefix_threshold_restart_cmd);
19671 install_element(BGP_IPV4M_NODE, &no_neighbor_maximum_prefix_cmd);
19672 install_element(BGP_IPV4L_NODE, &neighbor_maximum_prefix_cmd);
19673 install_element(BGP_IPV4L_NODE, &neighbor_maximum_prefix_threshold_cmd);
19674 install_element(BGP_IPV4L_NODE, &neighbor_maximum_prefix_warning_cmd);
19675 install_element(BGP_IPV4L_NODE,
19676 &neighbor_maximum_prefix_threshold_warning_cmd);
19677 install_element(BGP_IPV4L_NODE, &neighbor_maximum_prefix_restart_cmd);
19678 install_element(BGP_IPV4L_NODE,
19679 &neighbor_maximum_prefix_threshold_restart_cmd);
19680 install_element(BGP_IPV4L_NODE, &no_neighbor_maximum_prefix_cmd);
19681 install_element(BGP_IPV6_NODE, &neighbor_maximum_prefix_cmd);
19682 install_element(BGP_IPV6_NODE, &neighbor_maximum_prefix_threshold_cmd);
19683 install_element(BGP_IPV6_NODE, &neighbor_maximum_prefix_warning_cmd);
19684 install_element(BGP_IPV6_NODE,
19685 &neighbor_maximum_prefix_threshold_warning_cmd);
19686 install_element(BGP_IPV6_NODE, &neighbor_maximum_prefix_restart_cmd);
19687 install_element(BGP_IPV6_NODE,
19688 &neighbor_maximum_prefix_threshold_restart_cmd);
19689 install_element(BGP_IPV6_NODE, &no_neighbor_maximum_prefix_cmd);
19690 install_element(BGP_IPV6M_NODE, &neighbor_maximum_prefix_cmd);
19691 install_element(BGP_IPV6M_NODE, &neighbor_maximum_prefix_threshold_cmd);
19692 install_element(BGP_IPV6M_NODE, &neighbor_maximum_prefix_warning_cmd);
19693 install_element(BGP_IPV6M_NODE,
19694 &neighbor_maximum_prefix_threshold_warning_cmd);
19695 install_element(BGP_IPV6M_NODE, &neighbor_maximum_prefix_restart_cmd);
19696 install_element(BGP_IPV6M_NODE,
19697 &neighbor_maximum_prefix_threshold_restart_cmd);
19698 install_element(BGP_IPV6M_NODE, &no_neighbor_maximum_prefix_cmd);
19699 install_element(BGP_IPV6L_NODE, &neighbor_maximum_prefix_cmd);
19700 install_element(BGP_IPV6L_NODE, &neighbor_maximum_prefix_threshold_cmd);
19701 install_element(BGP_IPV6L_NODE, &neighbor_maximum_prefix_warning_cmd);
19702 install_element(BGP_IPV6L_NODE,
19703 &neighbor_maximum_prefix_threshold_warning_cmd);
19704 install_element(BGP_IPV6L_NODE, &neighbor_maximum_prefix_restart_cmd);
19705 install_element(BGP_IPV6L_NODE,
19706 &neighbor_maximum_prefix_threshold_restart_cmd);
19707 install_element(BGP_IPV6L_NODE, &no_neighbor_maximum_prefix_cmd);
19708 install_element(BGP_VPNV4_NODE, &neighbor_maximum_prefix_cmd);
19709 install_element(BGP_VPNV4_NODE, &neighbor_maximum_prefix_threshold_cmd);
19710 install_element(BGP_VPNV4_NODE, &neighbor_maximum_prefix_warning_cmd);
19711 install_element(BGP_VPNV4_NODE,
19712 &neighbor_maximum_prefix_threshold_warning_cmd);
19713 install_element(BGP_VPNV4_NODE, &neighbor_maximum_prefix_restart_cmd);
19714 install_element(BGP_VPNV4_NODE,
19715 &neighbor_maximum_prefix_threshold_restart_cmd);
19716 install_element(BGP_VPNV4_NODE, &no_neighbor_maximum_prefix_cmd);
19717 install_element(BGP_VPNV6_NODE, &neighbor_maximum_prefix_cmd);
19718 install_element(BGP_VPNV6_NODE, &neighbor_maximum_prefix_threshold_cmd);
19719 install_element(BGP_VPNV6_NODE, &neighbor_maximum_prefix_warning_cmd);
19720 install_element(BGP_VPNV6_NODE,
19721 &neighbor_maximum_prefix_threshold_warning_cmd);
19722 install_element(BGP_VPNV6_NODE, &neighbor_maximum_prefix_restart_cmd);
19723 install_element(BGP_VPNV6_NODE,
19724 &neighbor_maximum_prefix_threshold_restart_cmd);
19725 install_element(BGP_VPNV6_NODE, &no_neighbor_maximum_prefix_cmd);
19726
19727 /* "neighbor allowas-in" */
19728 install_element(BGP_NODE, &neighbor_allowas_in_hidden_cmd);
19729 install_element(BGP_NODE, &no_neighbor_allowas_in_hidden_cmd);
19730 install_element(BGP_IPV4_NODE, &neighbor_allowas_in_cmd);
19731 install_element(BGP_IPV4_NODE, &no_neighbor_allowas_in_cmd);
19732 install_element(BGP_IPV4M_NODE, &neighbor_allowas_in_cmd);
19733 install_element(BGP_IPV4M_NODE, &no_neighbor_allowas_in_cmd);
19734 install_element(BGP_IPV4L_NODE, &neighbor_allowas_in_cmd);
19735 install_element(BGP_IPV4L_NODE, &no_neighbor_allowas_in_cmd);
19736 install_element(BGP_IPV6_NODE, &neighbor_allowas_in_cmd);
19737 install_element(BGP_IPV6_NODE, &no_neighbor_allowas_in_cmd);
19738 install_element(BGP_IPV6M_NODE, &neighbor_allowas_in_cmd);
19739 install_element(BGP_IPV6M_NODE, &no_neighbor_allowas_in_cmd);
19740 install_element(BGP_IPV6L_NODE, &neighbor_allowas_in_cmd);
19741 install_element(BGP_IPV6L_NODE, &no_neighbor_allowas_in_cmd);
19742 install_element(BGP_VPNV4_NODE, &neighbor_allowas_in_cmd);
19743 install_element(BGP_VPNV4_NODE, &no_neighbor_allowas_in_cmd);
19744 install_element(BGP_VPNV6_NODE, &neighbor_allowas_in_cmd);
19745 install_element(BGP_VPNV6_NODE, &no_neighbor_allowas_in_cmd);
19746 install_element(BGP_EVPN_NODE, &neighbor_allowas_in_cmd);
19747 install_element(BGP_EVPN_NODE, &no_neighbor_allowas_in_cmd);
19748
46dbf9d0
DA
19749 /* neighbor accept-own */
19750 install_element(BGP_VPNV4_NODE, &neighbor_accept_own_cmd);
19751 install_element(BGP_VPNV6_NODE, &neighbor_accept_own_cmd);
19752
01da2d26
DA
19753 /* "neighbor soo" */
19754 install_element(BGP_IPV4_NODE, &neighbor_soo_cmd);
19755 install_element(BGP_IPV4_NODE, &no_neighbor_soo_cmd);
19756 install_element(BGP_IPV4M_NODE, &neighbor_soo_cmd);
19757 install_element(BGP_IPV4M_NODE, &no_neighbor_soo_cmd);
19758 install_element(BGP_IPV4L_NODE, &neighbor_soo_cmd);
19759 install_element(BGP_IPV4L_NODE, &no_neighbor_soo_cmd);
19760 install_element(BGP_IPV6_NODE, &neighbor_soo_cmd);
19761 install_element(BGP_IPV6_NODE, &no_neighbor_soo_cmd);
19762 install_element(BGP_IPV6M_NODE, &neighbor_soo_cmd);
19763 install_element(BGP_IPV6M_NODE, &no_neighbor_soo_cmd);
19764 install_element(BGP_IPV6L_NODE, &neighbor_soo_cmd);
19765 install_element(BGP_IPV6L_NODE, &no_neighbor_soo_cmd);
19766 install_element(BGP_VPNV4_NODE, &neighbor_soo_cmd);
19767 install_element(BGP_VPNV4_NODE, &no_neighbor_soo_cmd);
19768 install_element(BGP_VPNV6_NODE, &neighbor_soo_cmd);
19769 install_element(BGP_VPNV6_NODE, &no_neighbor_soo_cmd);
19770 install_element(BGP_EVPN_NODE, &neighbor_soo_cmd);
19771 install_element(BGP_EVPN_NODE, &no_neighbor_soo_cmd);
19772
d62a17ae 19773 /* address-family commands. */
19774 install_element(BGP_NODE, &address_family_ipv4_safi_cmd);
19775 install_element(BGP_NODE, &address_family_ipv6_safi_cmd);
d6902373 19776#ifdef KEEP_OLD_VPN_COMMANDS
d62a17ae 19777 install_element(BGP_NODE, &address_family_vpnv4_cmd);
19778 install_element(BGP_NODE, &address_family_vpnv6_cmd);
d6902373 19779#endif /* KEEP_OLD_VPN_COMMANDS */
8b1fb8be 19780
d62a17ae 19781 install_element(BGP_NODE, &address_family_evpn_cmd);
19782
19783 /* "exit-address-family" command. */
19784 install_element(BGP_IPV4_NODE, &exit_address_family_cmd);
19785 install_element(BGP_IPV4M_NODE, &exit_address_family_cmd);
19786 install_element(BGP_IPV4L_NODE, &exit_address_family_cmd);
19787 install_element(BGP_IPV6_NODE, &exit_address_family_cmd);
19788 install_element(BGP_IPV6M_NODE, &exit_address_family_cmd);
19789 install_element(BGP_IPV6L_NODE, &exit_address_family_cmd);
19790 install_element(BGP_VPNV4_NODE, &exit_address_family_cmd);
19791 install_element(BGP_VPNV6_NODE, &exit_address_family_cmd);
7c40bf39 19792 install_element(BGP_FLOWSPECV4_NODE, &exit_address_family_cmd);
19793 install_element(BGP_FLOWSPECV6_NODE, &exit_address_family_cmd);
d62a17ae 19794 install_element(BGP_EVPN_NODE, &exit_address_family_cmd);
19795
a486300b
PG
19796 /* BGP retain all route-target */
19797 install_element(BGP_VPNV4_NODE, &bgp_retain_route_target_cmd);
19798 install_element(BGP_VPNV6_NODE, &bgp_retain_route_target_cmd);
19799
d62a17ae 19800 /* "clear ip bgp commands" */
19801 install_element(ENABLE_NODE, &clear_ip_bgp_all_cmd);
19802
19803 /* clear ip bgp prefix */
19804 install_element(ENABLE_NODE, &clear_ip_bgp_prefix_cmd);
19805 install_element(ENABLE_NODE, &clear_bgp_ipv6_safi_prefix_cmd);
19806 install_element(ENABLE_NODE, &clear_bgp_instance_ipv6_safi_prefix_cmd);
19807
19808 /* "show [ip] bgp summary" commands. */
19809 install_element(VIEW_NODE, &show_bgp_instance_all_ipv6_updgrps_cmd);
43d3f4fc 19810 install_element(VIEW_NODE, &show_bgp_l2vpn_evpn_updgrps_cmd);
d62a17ae 19811 install_element(VIEW_NODE, &show_bgp_instance_updgrps_stats_cmd);
d62a17ae 19812 install_element(VIEW_NODE, &show_bgp_updgrps_stats_cmd);
d62a17ae 19813 install_element(VIEW_NODE, &show_ip_bgp_instance_updgrps_adj_s_cmd);
19814 install_element(VIEW_NODE, &show_ip_bgp_summary_cmd);
d62a17ae 19815 install_element(VIEW_NODE, &show_ip_bgp_updgrps_cmd);
19816
19817 /* "show [ip] bgp neighbors" commands. */
19818 install_element(VIEW_NODE, &show_ip_bgp_neighbors_cmd);
19819
36235319 19820 install_element(VIEW_NODE, &show_ip_bgp_neighbors_graceful_restart_cmd);
2986cac2 19821
d62a17ae 19822 /* "show [ip] bgp peer-group" commands. */
19823 install_element(VIEW_NODE, &show_ip_bgp_peer_groups_cmd);
19824
19825 /* "show [ip] bgp paths" commands. */
19826 install_element(VIEW_NODE, &show_ip_bgp_paths_cmd);
19827
19828 /* "show [ip] bgp community" commands. */
19829 install_element(VIEW_NODE, &show_ip_bgp_community_info_cmd);
19830
19831 /* "show ip bgp large-community" commands. */
19832 install_element(VIEW_NODE, &show_ip_bgp_lcommunity_info_cmd);
19833 /* "show [ip] bgp attribute-info" commands. */
19834 install_element(VIEW_NODE, &show_ip_bgp_attr_info_cmd);
53089bec 19835 /* "show [ip] bgp route-leak" command */
19836 install_element(VIEW_NODE, &show_ip_bgp_route_leak_cmd);
d62a17ae 19837
19838 /* "redistribute" commands. */
19839 install_element(BGP_NODE, &bgp_redistribute_ipv4_hidden_cmd);
19840 install_element(BGP_NODE, &no_bgp_redistribute_ipv4_hidden_cmd);
19841 install_element(BGP_NODE, &bgp_redistribute_ipv4_rmap_hidden_cmd);
19842 install_element(BGP_NODE, &bgp_redistribute_ipv4_metric_hidden_cmd);
19843 install_element(BGP_NODE,
19844 &bgp_redistribute_ipv4_rmap_metric_hidden_cmd);
19845 install_element(BGP_NODE,
19846 &bgp_redistribute_ipv4_metric_rmap_hidden_cmd);
19847 install_element(BGP_NODE, &bgp_redistribute_ipv4_ospf_hidden_cmd);
19848 install_element(BGP_NODE, &no_bgp_redistribute_ipv4_ospf_hidden_cmd);
19849 install_element(BGP_NODE, &bgp_redistribute_ipv4_ospf_rmap_hidden_cmd);
19850 install_element(BGP_NODE,
19851 &bgp_redistribute_ipv4_ospf_metric_hidden_cmd);
19852 install_element(BGP_NODE,
19853 &bgp_redistribute_ipv4_ospf_rmap_metric_hidden_cmd);
19854 install_element(BGP_NODE,
19855 &bgp_redistribute_ipv4_ospf_metric_rmap_hidden_cmd);
19856 install_element(BGP_IPV4_NODE, &bgp_redistribute_ipv4_cmd);
19857 install_element(BGP_IPV4_NODE, &no_bgp_redistribute_ipv4_cmd);
19858 install_element(BGP_IPV4_NODE, &bgp_redistribute_ipv4_rmap_cmd);
19859 install_element(BGP_IPV4_NODE, &bgp_redistribute_ipv4_metric_cmd);
19860 install_element(BGP_IPV4_NODE, &bgp_redistribute_ipv4_rmap_metric_cmd);
19861 install_element(BGP_IPV4_NODE, &bgp_redistribute_ipv4_metric_rmap_cmd);
19862 install_element(BGP_IPV4_NODE, &bgp_redistribute_ipv4_ospf_cmd);
19863 install_element(BGP_IPV4_NODE, &no_bgp_redistribute_ipv4_ospf_cmd);
19864 install_element(BGP_IPV4_NODE, &bgp_redistribute_ipv4_ospf_rmap_cmd);
19865 install_element(BGP_IPV4_NODE, &bgp_redistribute_ipv4_ospf_metric_cmd);
19866 install_element(BGP_IPV4_NODE,
19867 &bgp_redistribute_ipv4_ospf_rmap_metric_cmd);
19868 install_element(BGP_IPV4_NODE,
19869 &bgp_redistribute_ipv4_ospf_metric_rmap_cmd);
19870 install_element(BGP_IPV6_NODE, &bgp_redistribute_ipv6_cmd);
19871 install_element(BGP_IPV6_NODE, &no_bgp_redistribute_ipv6_cmd);
19872 install_element(BGP_IPV6_NODE, &bgp_redistribute_ipv6_rmap_cmd);
19873 install_element(BGP_IPV6_NODE, &bgp_redistribute_ipv6_metric_cmd);
19874 install_element(BGP_IPV6_NODE, &bgp_redistribute_ipv6_rmap_metric_cmd);
19875 install_element(BGP_IPV6_NODE, &bgp_redistribute_ipv6_metric_rmap_cmd);
19876
70dd370f 19877 /* import|export vpn [route-map RMAP_NAME] */
b9c7bc5a
PZ
19878 install_element(BGP_IPV4_NODE, &bgp_imexport_vpn_cmd);
19879 install_element(BGP_IPV6_NODE, &bgp_imexport_vpn_cmd);
ddb5b488 19880
12a844a5
DS
19881 install_element(BGP_IPV4_NODE, &bgp_imexport_vrf_cmd);
19882 install_element(BGP_IPV6_NODE, &bgp_imexport_vrf_cmd);
19883
d62a17ae 19884 /* ttl_security commands */
19885 install_element(BGP_NODE, &neighbor_ttl_security_cmd);
19886 install_element(BGP_NODE, &no_neighbor_ttl_security_cmd);
19887
d1adb448
PG
19888 /* "bgp tcp-keepalive" commands */
19889 install_element(BGP_NODE, &bgp_tcp_keepalive_cmd);
19890 install_element(BGP_NODE, &no_bgp_tcp_keepalive_cmd);
19891
d62a17ae 19892 /* "show [ip] bgp memory" commands. */
19893 install_element(VIEW_NODE, &show_bgp_memory_cmd);
19894
acf71666
MK
19895 /* "show bgp martian next-hop" */
19896 install_element(VIEW_NODE, &show_bgp_martian_nexthop_db_cmd);
19897
48ecf8f5
DS
19898 install_element(VIEW_NODE, &show_bgp_mac_hash_cmd);
19899
d62a17ae 19900 /* "show [ip] bgp views" commands. */
19901 install_element(VIEW_NODE, &show_bgp_views_cmd);
19902
19903 /* "show [ip] bgp vrfs" commands. */
19904 install_element(VIEW_NODE, &show_bgp_vrfs_cmd);
19905
19906 /* Community-list. */
19907 community_list_vty();
ddb5b488 19908
ed0e57e3
DA
19909 community_alias_vty();
19910
ddb5b488 19911 /* vpn-policy commands */
b9c7bc5a
PZ
19912 install_element(BGP_IPV4_NODE, &af_rd_vpn_export_cmd);
19913 install_element(BGP_IPV6_NODE, &af_rd_vpn_export_cmd);
19914 install_element(BGP_IPV4_NODE, &af_label_vpn_export_cmd);
19915 install_element(BGP_IPV6_NODE, &af_label_vpn_export_cmd);
19916 install_element(BGP_IPV4_NODE, &af_nexthop_vpn_export_cmd);
19917 install_element(BGP_IPV6_NODE, &af_nexthop_vpn_export_cmd);
19918 install_element(BGP_IPV4_NODE, &af_rt_vpn_imexport_cmd);
19919 install_element(BGP_IPV6_NODE, &af_rt_vpn_imexport_cmd);
19920 install_element(BGP_IPV4_NODE, &af_route_map_vpn_imexport_cmd);
19921 install_element(BGP_IPV6_NODE, &af_route_map_vpn_imexport_cmd);
bb4f6190
DS
19922 install_element(BGP_IPV4_NODE, &af_import_vrf_route_map_cmd);
19923 install_element(BGP_IPV6_NODE, &af_import_vrf_route_map_cmd);
b9c7bc5a 19924
301ad80a
PG
19925 install_element(BGP_IPV4_NODE, &af_routetarget_import_cmd);
19926 install_element(BGP_IPV6_NODE, &af_routetarget_import_cmd);
19927
b9c7bc5a
PZ
19928 install_element(BGP_IPV4_NODE, &af_no_rd_vpn_export_cmd);
19929 install_element(BGP_IPV6_NODE, &af_no_rd_vpn_export_cmd);
19930 install_element(BGP_IPV4_NODE, &af_no_label_vpn_export_cmd);
19931 install_element(BGP_IPV6_NODE, &af_no_label_vpn_export_cmd);
b9c7bc5a
PZ
19932 install_element(BGP_IPV4_NODE, &af_no_rt_vpn_imexport_cmd);
19933 install_element(BGP_IPV6_NODE, &af_no_rt_vpn_imexport_cmd);
19934 install_element(BGP_IPV4_NODE, &af_no_route_map_vpn_imexport_cmd);
19935 install_element(BGP_IPV6_NODE, &af_no_route_map_vpn_imexport_cmd);
bb4f6190
DS
19936 install_element(BGP_IPV4_NODE, &af_no_import_vrf_route_map_cmd);
19937 install_element(BGP_IPV6_NODE, &af_no_import_vrf_route_map_cmd);
4ab46701
AR
19938
19939 /* tcp-mss command */
19940 install_element(BGP_NODE, &neighbor_tcp_mss_cmd);
19941 install_element(BGP_NODE, &no_neighbor_tcp_mss_cmd);
bfaab44d
HS
19942
19943 /* srv6 commands */
ea372e81 19944 install_element(VIEW_NODE, &show_bgp_srv6_cmd);
bfaab44d 19945 install_element(BGP_NODE, &bgp_segment_routing_srv6_cmd);
0249b8b6 19946 install_element(BGP_NODE, &no_bgp_segment_routing_srv6_cmd);
a0281b2e 19947 install_element(BGP_SRV6_NODE, &bgp_srv6_locator_cmd);
0249b8b6 19948 install_element(BGP_SRV6_NODE, &no_bgp_srv6_locator_cmd);
b72c9e14
HS
19949 install_element(BGP_IPV4_NODE, &af_sid_vpn_export_cmd);
19950 install_element(BGP_IPV6_NODE, &af_sid_vpn_export_cmd);
527588aa 19951 install_element(BGP_NODE, &bgp_sid_vpn_export_cmd);
e606d8ec 19952 install_element(BGP_NODE, &no_bgp_sid_vpn_export_cmd);
4cd690ae
PG
19953
19954 bgp_vty_if_init();
718e3744 19955}
6b0655a2 19956
718e3744 19957#include "memory.h"
19958#include "bgp_regex.h"
19959#include "bgp_clist.h"
19960#include "bgp_ecommunity.h"
19961
19962/* VTY functions. */
19963
19964/* Direction value to string conversion. */
d62a17ae 19965static const char *community_direct_str(int direct)
19966{
19967 switch (direct) {
19968 case COMMUNITY_DENY:
19969 return "deny";
19970 case COMMUNITY_PERMIT:
19971 return "permit";
19972 default:
19973 return "unknown";
19974 }
718e3744 19975}
19976
19977/* Display error string. */
d62a17ae 19978static void community_list_perror(struct vty *vty, int ret)
19979{
19980 switch (ret) {
19981 case COMMUNITY_LIST_ERR_CANT_FIND_LIST:
19982 vty_out(vty, "%% Can't find community-list\n");
19983 break;
19984 case COMMUNITY_LIST_ERR_MALFORMED_VAL:
19985 vty_out(vty, "%% Malformed community-list value\n");
19986 break;
19987 case COMMUNITY_LIST_ERR_STANDARD_CONFLICT:
19988 vty_out(vty,
19989 "%% Community name conflict, previously defined as standard community\n");
19990 break;
19991 case COMMUNITY_LIST_ERR_EXPANDED_CONFLICT:
19992 vty_out(vty,
19993 "%% Community name conflict, previously defined as expanded community\n");
19994 break;
19995 }
718e3744 19996}
19997
5bf15956
DW
19998/* "community-list" keyword help string. */
19999#define COMMUNITY_LIST_STR "Add a community list entry\n"
20000
7336e101
SP
20001/*community-list standard */
20002DEFUN (community_list_standard,
20003 bgp_community_list_standard_cmd,
a2099c1d 20004 "bgp community-list <(1-99)|standard COMMUNITY_LIST_NAME> [seq (0-4294967295)] <deny|permit> AA:NN...",
7336e101 20005 BGP_STR
718e3744 20006 COMMUNITY_LIST_STR
20007 "Community list number (standard)\n"
5bf15956 20008 "Add an standard community-list entry\n"
718e3744 20009 "Community list name\n"
2f8cc0e5
DA
20010 "Sequence number of an entry\n"
20011 "Sequence number\n"
718e3744 20012 "Specify community to reject\n"
20013 "Specify community to accept\n"
20014 COMMUNITY_VAL_STR)
20015{
d62a17ae 20016 char *cl_name_or_number = NULL;
2f8cc0e5 20017 char *seq = NULL;
d62a17ae 20018 int direct = 0;
20019 int style = COMMUNITY_LIST_STANDARD;
d62a17ae 20020 int idx = 0;
7336e101 20021
e34627f9 20022 if (argv_find(argv, argc, "(0-4294967295)", &idx))
2f8cc0e5
DA
20023 seq = argv[idx]->arg;
20024
20025 idx = 0;
d62a17ae 20026 argv_find(argv, argc, "(1-99)", &idx);
a2099c1d 20027 argv_find(argv, argc, "COMMUNITY_LIST_NAME", &idx);
d62a17ae 20028 cl_name_or_number = argv[idx]->arg;
20029 direct = argv_find(argv, argc, "permit", &idx) ? COMMUNITY_PERMIT
20030 : COMMUNITY_DENY;
20031 argv_find(argv, argc, "AA:NN", &idx);
20032 char *str = argv_concat(argv, argc, idx);
42f914d4 20033
2f8cc0e5
DA
20034 int ret = community_list_set(bgp_clist, cl_name_or_number, str, seq,
20035 direct, style);
42f914d4 20036
d62a17ae 20037 XFREE(MTYPE_TMP, str);
42f914d4 20038
d62a17ae 20039 if (ret < 0) {
20040 /* Display error string. */
20041 community_list_perror(vty, ret);
20042 return CMD_WARNING_CONFIG_FAILED;
20043 }
42f914d4 20044
d62a17ae 20045 return CMD_SUCCESS;
718e3744 20046}
20047
7336e101
SP
20048DEFUN (no_community_list_standard_all,
20049 no_bgp_community_list_standard_all_cmd,
a2099c1d 20050 "no bgp community-list <(1-99)|standard COMMUNITY_LIST_NAME> [seq (0-4294967295)] <deny|permit> AA:NN...",
7336e101
SP
20051 NO_STR
20052 BGP_STR
20053 COMMUNITY_LIST_STR
20054 "Community list number (standard)\n"
20055 "Add an standard community-list entry\n"
20056 "Community list name\n"
2f8cc0e5
DA
20057 "Sequence number of an entry\n"
20058 "Sequence number\n"
7336e101
SP
20059 "Specify community to reject\n"
20060 "Specify community to accept\n"
20061 COMMUNITY_VAL_STR)
718e3744 20062{
d62a17ae 20063 char *cl_name_or_number = NULL;
174b5cb9 20064 char *str = NULL;
d62a17ae 20065 int direct = 0;
20066 int style = COMMUNITY_LIST_STANDARD;
2f8cc0e5 20067 char *seq = NULL;
d62a17ae 20068 int idx = 0;
7336e101 20069
e34627f9 20070 if (argv_find(argv, argc, "(0-4294967295)", &idx))
2f8cc0e5
DA
20071 seq = argv[idx]->arg;
20072
20073 idx = 0;
174b5cb9
DA
20074 argv_find(argv, argc, "permit", &idx);
20075 argv_find(argv, argc, "deny", &idx);
20076
20077 if (idx) {
20078 direct = argv_find(argv, argc, "permit", &idx)
20079 ? COMMUNITY_PERMIT
20080 : COMMUNITY_DENY;
20081
20082 idx = 0;
20083 argv_find(argv, argc, "AA:NN", &idx);
20084 str = argv_concat(argv, argc, idx);
20085 }
20086
20087 idx = 0;
d62a17ae 20088 argv_find(argv, argc, "(1-99)", &idx);
a2099c1d 20089 argv_find(argv, argc, "COMMUNITY_LIST_NAME", &idx);
d62a17ae 20090 cl_name_or_number = argv[idx]->arg;
42f914d4 20091
2f8cc0e5 20092 int ret = community_list_unset(bgp_clist, cl_name_or_number, str, seq,
7298a8e1 20093 direct, style);
42f914d4 20094
d62a17ae 20095 XFREE(MTYPE_TMP, str);
daf9ddbb 20096
d62a17ae 20097 if (ret < 0) {
20098 community_list_perror(vty, ret);
20099 return CMD_WARNING_CONFIG_FAILED;
20100 }
42f914d4 20101
d62a17ae 20102 return CMD_SUCCESS;
718e3744 20103}
7336e101 20104
174b5cb9 20105ALIAS(no_community_list_standard_all, no_bgp_community_list_standard_all_list_cmd,
a2099c1d 20106 "no bgp community-list <(1-99)|standard COMMUNITY_LIST_NAME>",
174b5cb9
DA
20107 NO_STR BGP_STR COMMUNITY_LIST_STR
20108 "Community list number (standard)\n"
20109 "Add an standard community-list entry\n"
20110 "Community list name\n")
20111
7336e101
SP
20112/*community-list expanded */
20113DEFUN (community_list_expanded_all,
20114 bgp_community_list_expanded_all_cmd,
a2099c1d 20115 "bgp community-list <(100-500)|expanded COMMUNITY_LIST_NAME> [seq (0-4294967295)] <deny|permit> AA:NN...",
7336e101
SP
20116 BGP_STR
20117 COMMUNITY_LIST_STR
718e3744 20118 "Community list number (expanded)\n"
5bf15956 20119 "Add an expanded community-list entry\n"
718e3744 20120 "Community list name\n"
2f8cc0e5
DA
20121 "Sequence number of an entry\n"
20122 "Sequence number\n"
718e3744 20123 "Specify community to reject\n"
20124 "Specify community to accept\n"
20125 COMMUNITY_VAL_STR)
20126{
d62a17ae 20127 char *cl_name_or_number = NULL;
2f8cc0e5 20128 char *seq = NULL;
d62a17ae 20129 int direct = 0;
20130 int style = COMMUNITY_LIST_EXPANDED;
d62a17ae 20131 int idx = 0;
7b9a4750 20132
e34627f9 20133 if (argv_find(argv, argc, "(0-4294967295)", &idx))
2f8cc0e5
DA
20134 seq = argv[idx]->arg;
20135
20136 idx = 0;
20137
d62a17ae 20138 argv_find(argv, argc, "(100-500)", &idx);
a2099c1d 20139 argv_find(argv, argc, "COMMUNITY_LIST_NAME", &idx);
d62a17ae 20140 cl_name_or_number = argv[idx]->arg;
20141 direct = argv_find(argv, argc, "permit", &idx) ? COMMUNITY_PERMIT
20142 : COMMUNITY_DENY;
20143 argv_find(argv, argc, "AA:NN", &idx);
20144 char *str = argv_concat(argv, argc, idx);
42f914d4 20145
2f8cc0e5
DA
20146 int ret = community_list_set(bgp_clist, cl_name_or_number, str, seq,
20147 direct, style);
42f914d4 20148
d62a17ae 20149 XFREE(MTYPE_TMP, str);
42f914d4 20150
d62a17ae 20151 if (ret < 0) {
20152 /* Display error string. */
20153 community_list_perror(vty, ret);
20154 return CMD_WARNING_CONFIG_FAILED;
20155 }
42f914d4 20156
d62a17ae 20157 return CMD_SUCCESS;
718e3744 20158}
20159
7336e101
SP
20160DEFUN (no_community_list_expanded_all,
20161 no_bgp_community_list_expanded_all_cmd,
a2099c1d 20162 "no bgp community-list <(100-500)|expanded COMMUNITY_LIST_NAME> [seq (0-4294967295)] <deny|permit> AA:NN...",
7336e101
SP
20163 NO_STR
20164 BGP_STR
20165 COMMUNITY_LIST_STR
20166 "Community list number (expanded)\n"
20167 "Add an expanded community-list entry\n"
20168 "Community list name\n"
2f8cc0e5
DA
20169 "Sequence number of an entry\n"
20170 "Sequence number\n"
7336e101
SP
20171 "Specify community to reject\n"
20172 "Specify community to accept\n"
20173 COMMUNITY_VAL_STR)
718e3744 20174{
d62a17ae 20175 char *cl_name_or_number = NULL;
2f8cc0e5 20176 char *seq = NULL;
174b5cb9 20177 char *str = NULL;
d62a17ae 20178 int direct = 0;
20179 int style = COMMUNITY_LIST_EXPANDED;
d62a17ae 20180 int idx = 0;
174b5cb9 20181
e34627f9 20182 if (argv_find(argv, argc, "(0-4294967295)", &idx))
2f8cc0e5
DA
20183 seq = argv[idx]->arg;
20184
20185 idx = 0;
174b5cb9
DA
20186 argv_find(argv, argc, "permit", &idx);
20187 argv_find(argv, argc, "deny", &idx);
20188
20189 if (idx) {
20190 direct = argv_find(argv, argc, "permit", &idx)
20191 ? COMMUNITY_PERMIT
20192 : COMMUNITY_DENY;
20193
20194 idx = 0;
20195 argv_find(argv, argc, "AA:NN", &idx);
20196 str = argv_concat(argv, argc, idx);
7336e101 20197 }
174b5cb9
DA
20198
20199 idx = 0;
d62a17ae 20200 argv_find(argv, argc, "(100-500)", &idx);
a2099c1d 20201 argv_find(argv, argc, "COMMUNITY_LIST_NAME", &idx);
d62a17ae 20202 cl_name_or_number = argv[idx]->arg;
42f914d4 20203
2f8cc0e5 20204 int ret = community_list_unset(bgp_clist, cl_name_or_number, str, seq,
7298a8e1 20205 direct, style);
42f914d4 20206
d62a17ae 20207 XFREE(MTYPE_TMP, str);
daf9ddbb 20208
d62a17ae 20209 if (ret < 0) {
20210 community_list_perror(vty, ret);
20211 return CMD_WARNING_CONFIG_FAILED;
20212 }
42f914d4 20213
d62a17ae 20214 return CMD_SUCCESS;
718e3744 20215}
20216
36d4bb44
EB
20217ALIAS(no_community_list_expanded_all,
20218 no_bgp_community_list_expanded_all_list_cmd,
a2099c1d 20219 "no bgp community-list <(100-500)|expanded COMMUNITY_LIST_NAME>",
36d4bb44 20220 NO_STR BGP_STR COMMUNITY_LIST_STR
174b5cb9
DA
20221 "Community list number (expanded)\n"
20222 "Add an expanded community-list entry\n"
20223 "Community list name\n")
20224
8d9b8ed9
PM
20225/* Return configuration string of community-list entry. */
20226static const char *community_list_config_str(struct community_entry *entry)
20227{
20228 const char *str;
20229
20230 if (entry->any)
20231 str = "";
20232 else {
20233 if (entry->style == COMMUNITY_LIST_STANDARD)
c0945b78 20234 str = community_str(entry->u.com, false, false);
8d9b8ed9 20235 else if (entry->style == LARGE_COMMUNITY_LIST_STANDARD)
c0945b78 20236 str = lcommunity_str(entry->u.lcom, false, false);
8d9b8ed9
PM
20237 else
20238 str = entry->config;
20239 }
20240 return str;
20241}
20242
d62a17ae 20243static void community_list_show(struct vty *vty, struct community_list *list)
718e3744 20244{
d62a17ae 20245 struct community_entry *entry;
718e3744 20246
d62a17ae 20247 for (entry = list->head; entry; entry = entry->next) {
20248 if (entry == list->head) {
20249 if (all_digit(list->name))
20250 vty_out(vty, "Community %s list %s\n",
20251 entry->style == COMMUNITY_LIST_STANDARD
20252 ? "standard"
20253 : "(expanded) access",
20254 list->name);
20255 else
20256 vty_out(vty, "Named Community %s list %s\n",
20257 entry->style == COMMUNITY_LIST_STANDARD
20258 ? "standard"
20259 : "expanded",
20260 list->name);
20261 }
20262 if (entry->any)
20263 vty_out(vty, " %s\n",
20264 community_direct_str(entry->direct));
20265 else
20266 vty_out(vty, " %s %s\n",
20267 community_direct_str(entry->direct),
8d9b8ed9 20268 community_list_config_str(entry));
d62a17ae 20269 }
718e3744 20270}
20271
7336e101
SP
20272DEFUN (show_community_list,
20273 show_bgp_community_list_cmd,
20274 "show bgp community-list",
718e3744 20275 SHOW_STR
7336e101 20276 BGP_STR
718e3744 20277 "List community-list\n")
20278{
d62a17ae 20279 struct community_list *list;
20280 struct community_list_master *cm;
718e3744 20281
d62a17ae 20282 cm = community_list_master_lookup(bgp_clist, COMMUNITY_LIST_MASTER);
20283 if (!cm)
20284 return CMD_SUCCESS;
718e3744 20285
d62a17ae 20286 for (list = cm->num.head; list; list = list->next)
20287 community_list_show(vty, list);
718e3744 20288
d62a17ae 20289 for (list = cm->str.head; list; list = list->next)
20290 community_list_show(vty, list);
718e3744 20291
d62a17ae 20292 return CMD_SUCCESS;
718e3744 20293}
20294
7336e101
SP
20295DEFUN (show_community_list_arg,
20296 show_bgp_community_list_arg_cmd,
a2099c1d 20297 "show bgp community-list <(1-500)|COMMUNITY_LIST_NAME> detail",
7336e101
SP
20298 SHOW_STR
20299 BGP_STR
718e3744 20300 "List community-list\n"
20301 "Community-list number\n"
960b69b9 20302 "Community-list name\n"
20303 "Detailed information on community-list\n")
718e3744 20304{
d62a17ae 20305 int idx_comm_list = 3;
20306 struct community_list *list;
718e3744 20307
e237b0d2 20308 list = community_list_lookup(bgp_clist, argv[idx_comm_list]->arg, 0,
d62a17ae 20309 COMMUNITY_LIST_MASTER);
20310 if (!list) {
20311 vty_out(vty, "%% Can't find community-list\n");
20312 return CMD_WARNING;
20313 }
718e3744 20314
d62a17ae 20315 community_list_show(vty, list);
718e3744 20316
d62a17ae 20317 return CMD_SUCCESS;
718e3744 20318}
6b0655a2 20319
57d187bc
JS
20320/*
20321 * Large Community code.
20322 */
d62a17ae 20323static int lcommunity_list_set_vty(struct vty *vty, int argc,
20324 struct cmd_token **argv, int style,
20325 int reject_all_digit_name)
20326{
20327 int ret;
20328 int direct;
20329 char *str;
20330 int idx = 0;
20331 char *cl_name;
2f8cc0e5
DA
20332 char *seq = NULL;
20333
a08032fe 20334 if (argv_find(argv, argc, "(0-4294967295)", &idx))
2f8cc0e5 20335 seq = argv[idx]->arg;
d62a17ae 20336
2f8cc0e5 20337 idx = 0;
d62a17ae 20338 direct = argv_find(argv, argc, "permit", &idx) ? COMMUNITY_PERMIT
20339 : COMMUNITY_DENY;
20340
20341 /* All digit name check. */
20342 idx = 0;
a2099c1d 20343 argv_find(argv, argc, "LCOMMUNITY_LIST_NAME", &idx);
d62a17ae 20344 argv_find(argv, argc, "(1-99)", &idx);
20345 argv_find(argv, argc, "(100-500)", &idx);
20346 cl_name = argv[idx]->arg;
20347 if (reject_all_digit_name && all_digit(cl_name)) {
20348 vty_out(vty, "%% Community name cannot have all digits\n");
20349 return CMD_WARNING_CONFIG_FAILED;
20350 }
20351
20352 idx = 0;
20353 argv_find(argv, argc, "AA:BB:CC", &idx);
20354 argv_find(argv, argc, "LINE", &idx);
20355 /* Concat community string argument. */
20356 if (idx)
20357 str = argv_concat(argv, argc, idx);
20358 else
20359 str = NULL;
20360
2f8cc0e5 20361 ret = lcommunity_list_set(bgp_clist, cl_name, str, seq, direct, style);
d62a17ae 20362
20363 /* Free temporary community list string allocated by
20364 argv_concat(). */
0a22ddfb 20365 XFREE(MTYPE_TMP, str);
d62a17ae 20366
20367 if (ret < 0) {
20368 community_list_perror(vty, ret);
20369 return CMD_WARNING_CONFIG_FAILED;
20370 }
20371 return CMD_SUCCESS;
20372}
20373
20374static int lcommunity_list_unset_vty(struct vty *vty, int argc,
20375 struct cmd_token **argv, int style)
20376{
20377 int ret;
20378 int direct = 0;
20379 char *str = NULL;
20380 int idx = 0;
2f8cc0e5 20381 char *seq = NULL;
d62a17ae 20382
a08032fe 20383 if (argv_find(argv, argc, "(0-4294967295)", &idx))
2f8cc0e5 20384 seq = argv[idx]->arg;
d62a17ae 20385
2f8cc0e5 20386 idx = 0;
d62a17ae 20387 argv_find(argv, argc, "permit", &idx);
20388 argv_find(argv, argc, "deny", &idx);
20389
20390 if (idx) {
20391 /* Check the list direct. */
20392 if (strncmp(argv[idx]->arg, "p", 1) == 0)
20393 direct = COMMUNITY_PERMIT;
20394 else
20395 direct = COMMUNITY_DENY;
20396
20397 idx = 0;
20398 argv_find(argv, argc, "LINE", &idx);
20399 argv_find(argv, argc, "AA:AA:NN", &idx);
20400 /* Concat community string argument. */
20401 str = argv_concat(argv, argc, idx);
20402 }
20403
20404 idx = 0;
20405 argv_find(argv, argc, "(1-99)", &idx);
20406 argv_find(argv, argc, "(100-500)", &idx);
a2099c1d 20407 argv_find(argv, argc, "LCOMMUNITY_LIST_NAME", &idx);
d62a17ae 20408
20409 /* Unset community list. */
2f8cc0e5 20410 ret = lcommunity_list_unset(bgp_clist, argv[idx]->arg, str, seq, direct,
d62a17ae 20411 style);
20412
20413 /* Free temporary community list string allocated by
20414 argv_concat(). */
0a22ddfb 20415 XFREE(MTYPE_TMP, str);
d62a17ae 20416
20417 if (ret < 0) {
20418 community_list_perror(vty, ret);
20419 return CMD_WARNING_CONFIG_FAILED;
20420 }
20421
20422 return CMD_SUCCESS;
57d187bc
JS
20423}
20424
20425/* "large-community-list" keyword help string. */
20426#define LCOMMUNITY_LIST_STR "Add a large community list entry\n"
20427#define LCOMMUNITY_VAL_STR "large community in 'aa:bb:cc' format\n"
20428
7336e101
SP
20429DEFUN (lcommunity_list_standard,
20430 bgp_lcommunity_list_standard_cmd,
a08032fe 20431 "bgp large-community-list (1-99) [seq (0-4294967295)] <deny|permit> AA:BB:CC...",
7336e101
SP
20432 BGP_STR
20433 LCOMMUNITY_LIST_STR
20434 "Large Community list number (standard)\n"
2f8cc0e5
DA
20435 "Sequence number of an entry\n"
20436 "Sequence number\n"
7336e101
SP
20437 "Specify large community to reject\n"
20438 "Specify large community to accept\n"
20439 LCOMMUNITY_VAL_STR)
52951b63 20440{
d62a17ae 20441 return lcommunity_list_set_vty(vty, argc, argv,
20442 LARGE_COMMUNITY_LIST_STANDARD, 0);
52951b63
DS
20443}
20444
7336e101
SP
20445DEFUN (lcommunity_list_expanded,
20446 bgp_lcommunity_list_expanded_cmd,
a08032fe 20447 "bgp large-community-list (100-500) [seq (0-4294967295)] <deny|permit> LINE...",
7336e101
SP
20448 BGP_STR
20449 LCOMMUNITY_LIST_STR
20450 "Large Community list number (expanded)\n"
2f8cc0e5
DA
20451 "Sequence number of an entry\n"
20452 "Sequence number\n"
7336e101
SP
20453 "Specify large community to reject\n"
20454 "Specify large community to accept\n"
20455 "An ordered list as a regular-expression\n")
57d187bc 20456{
d62a17ae 20457 return lcommunity_list_set_vty(vty, argc, argv,
7336e101 20458 LARGE_COMMUNITY_LIST_EXPANDED, 0);
57d187bc
JS
20459}
20460
7336e101
SP
20461DEFUN (lcommunity_list_name_standard,
20462 bgp_lcommunity_list_name_standard_cmd,
a2099c1d 20463 "bgp large-community-list standard LCOMMUNITY_LIST_NAME [seq (0-4294967295)] <deny|permit> AA:BB:CC...",
7336e101
SP
20464 BGP_STR
20465 LCOMMUNITY_LIST_STR
20466 "Specify standard large-community-list\n"
20467 "Large Community list name\n"
2f8cc0e5
DA
20468 "Sequence number of an entry\n"
20469 "Sequence number\n"
7336e101
SP
20470 "Specify large community to reject\n"
20471 "Specify large community to accept\n"
20472 LCOMMUNITY_VAL_STR)
52951b63 20473{
d62a17ae 20474 return lcommunity_list_set_vty(vty, argc, argv,
20475 LARGE_COMMUNITY_LIST_STANDARD, 1);
52951b63
DS
20476}
20477
7336e101
SP
20478DEFUN (lcommunity_list_name_expanded,
20479 bgp_lcommunity_list_name_expanded_cmd,
a2099c1d 20480 "bgp large-community-list expanded LCOMMUNITY_LIST_NAME [seq (0-4294967295)] <deny|permit> LINE...",
7336e101
SP
20481 BGP_STR
20482 LCOMMUNITY_LIST_STR
20483 "Specify expanded large-community-list\n"
20484 "Large Community list name\n"
2f8cc0e5
DA
20485 "Sequence number of an entry\n"
20486 "Sequence number\n"
7336e101
SP
20487 "Specify large community to reject\n"
20488 "Specify large community to accept\n"
20489 "An ordered list as a regular-expression\n")
57d187bc 20490{
d62a17ae 20491 return lcommunity_list_set_vty(vty, argc, argv,
7336e101 20492 LARGE_COMMUNITY_LIST_EXPANDED, 1);
57d187bc
JS
20493}
20494
4378f57c
DA
20495DEFUN (no_lcommunity_list_all,
20496 no_bgp_lcommunity_list_all_cmd,
a2099c1d 20497 "no bgp large-community-list <(1-99)|(100-500)|LCOMMUNITY_LIST_NAME>",
7336e101
SP
20498 NO_STR
20499 BGP_STR
20500 LCOMMUNITY_LIST_STR
20501 "Large Community list number (standard)\n"
20502 "Large Community list number (expanded)\n"
20503 "Large Community list name\n")
57d187bc 20504{
7336e101
SP
20505 return lcommunity_list_unset_vty(vty, argc, argv,
20506 LARGE_COMMUNITY_LIST_STANDARD);
57d187bc
JS
20507}
20508
4378f57c
DA
20509DEFUN (no_lcommunity_list_name_standard_all,
20510 no_bgp_lcommunity_list_name_standard_all_cmd,
a2099c1d 20511 "no bgp large-community-list standard LCOMMUNITY_LIST_NAME",
4378f57c
DA
20512 NO_STR
20513 BGP_STR
20514 LCOMMUNITY_LIST_STR
20515 "Specify standard large-community-list\n"
20516 "Large Community list name\n")
20517{
20518 return lcommunity_list_unset_vty(vty, argc, argv,
20519 LARGE_COMMUNITY_LIST_STANDARD);
20520}
20521
7336e101
SP
20522DEFUN (no_lcommunity_list_name_expanded_all,
20523 no_bgp_lcommunity_list_name_expanded_all_cmd,
a2099c1d 20524 "no bgp large-community-list expanded LCOMMUNITY_LIST_NAME",
7336e101
SP
20525 NO_STR
20526 BGP_STR
20527 LCOMMUNITY_LIST_STR
20528 "Specify expanded large-community-list\n"
20529 "Large Community list name\n")
57d187bc 20530{
d62a17ae 20531 return lcommunity_list_unset_vty(vty, argc, argv,
7336e101 20532 LARGE_COMMUNITY_LIST_EXPANDED);
57d187bc
JS
20533}
20534
7336e101
SP
20535DEFUN (no_lcommunity_list_standard,
20536 no_bgp_lcommunity_list_standard_cmd,
a08032fe 20537 "no bgp large-community-list (1-99) [seq (0-4294967295)] <deny|permit> AA:AA:NN...",
7336e101
SP
20538 NO_STR
20539 BGP_STR
20540 LCOMMUNITY_LIST_STR
20541 "Large Community list number (standard)\n"
2f8cc0e5
DA
20542 "Sequence number of an entry\n"
20543 "Sequence number\n"
7336e101
SP
20544 "Specify large community to reject\n"
20545 "Specify large community to accept\n"
20546 LCOMMUNITY_VAL_STR)
57d187bc 20547{
d62a17ae 20548 return lcommunity_list_unset_vty(vty, argc, argv,
7336e101 20549 LARGE_COMMUNITY_LIST_STANDARD);
57d187bc
JS
20550}
20551
7336e101
SP
20552DEFUN (no_lcommunity_list_expanded,
20553 no_bgp_lcommunity_list_expanded_cmd,
a08032fe 20554 "no bgp large-community-list (100-500) [seq (0-4294967295)] <deny|permit> LINE...",
7336e101
SP
20555 NO_STR
20556 BGP_STR
20557 LCOMMUNITY_LIST_STR
20558 "Large Community list number (expanded)\n"
2f8cc0e5
DA
20559 "Sequence number of an entry\n"
20560 "Sequence number\n"
7336e101
SP
20561 "Specify large community to reject\n"
20562 "Specify large community to accept\n"
20563 "An ordered list as a regular-expression\n")
57d187bc 20564{
d62a17ae 20565 return lcommunity_list_unset_vty(vty, argc, argv,
7336e101 20566 LARGE_COMMUNITY_LIST_EXPANDED);
57d187bc
JS
20567}
20568
7336e101
SP
20569DEFUN (no_lcommunity_list_name_standard,
20570 no_bgp_lcommunity_list_name_standard_cmd,
a2099c1d 20571 "no bgp large-community-list standard LCOMMUNITY_LIST_NAME [seq (0-4294967295)] <deny|permit> AA:AA:NN...",
7336e101
SP
20572 NO_STR
20573 BGP_STR
20574 LCOMMUNITY_LIST_STR
20575 "Specify standard large-community-list\n"
20576 "Large Community list name\n"
2f8cc0e5
DA
20577 "Sequence number of an entry\n"
20578 "Sequence number\n"
7336e101
SP
20579 "Specify large community to reject\n"
20580 "Specify large community to accept\n"
20581 LCOMMUNITY_VAL_STR)
57d187bc 20582{
d62a17ae 20583 return lcommunity_list_unset_vty(vty, argc, argv,
7336e101 20584 LARGE_COMMUNITY_LIST_STANDARD);
57d187bc
JS
20585}
20586
7336e101
SP
20587DEFUN (no_lcommunity_list_name_expanded,
20588 no_bgp_lcommunity_list_name_expanded_cmd,
a2099c1d 20589 "no bgp large-community-list expanded LCOMMUNITY_LIST_NAME [seq (0-4294967295)] <deny|permit> LINE...",
7336e101
SP
20590 NO_STR
20591 BGP_STR
20592 LCOMMUNITY_LIST_STR
20593 "Specify expanded large-community-list\n"
20594 "Large community list name\n"
2f8cc0e5
DA
20595 "Sequence number of an entry\n"
20596 "Sequence number\n"
7336e101
SP
20597 "Specify large community to reject\n"
20598 "Specify large community to accept\n"
20599 "An ordered list as a regular-expression\n")
57d187bc 20600{
d62a17ae 20601 return lcommunity_list_unset_vty(vty, argc, argv,
7336e101 20602 LARGE_COMMUNITY_LIST_EXPANDED);
57d187bc
JS
20603}
20604
d62a17ae 20605static void lcommunity_list_show(struct vty *vty, struct community_list *list)
20606{
20607 struct community_entry *entry;
20608
20609 for (entry = list->head; entry; entry = entry->next) {
20610 if (entry == list->head) {
20611 if (all_digit(list->name))
20612 vty_out(vty, "Large community %s list %s\n",
169b72c8 20613 entry->style ==
20614 LARGE_COMMUNITY_LIST_STANDARD
d62a17ae 20615 ? "standard"
20616 : "(expanded) access",
20617 list->name);
20618 else
20619 vty_out(vty,
20620 "Named large community %s list %s\n",
169b72c8 20621 entry->style ==
20622 LARGE_COMMUNITY_LIST_STANDARD
d62a17ae 20623 ? "standard"
20624 : "expanded",
20625 list->name);
20626 }
20627 if (entry->any)
20628 vty_out(vty, " %s\n",
20629 community_direct_str(entry->direct));
20630 else
20631 vty_out(vty, " %s %s\n",
20632 community_direct_str(entry->direct),
8d9b8ed9 20633 community_list_config_str(entry));
d62a17ae 20634 }
57d187bc
JS
20635}
20636
7336e101
SP
20637DEFUN (show_lcommunity_list,
20638 show_bgp_lcommunity_list_cmd,
20639 "show bgp large-community-list",
57d187bc 20640 SHOW_STR
7336e101 20641 BGP_STR
57d187bc
JS
20642 "List large-community list\n")
20643{
d62a17ae 20644 struct community_list *list;
20645 struct community_list_master *cm;
57d187bc 20646
d62a17ae 20647 cm = community_list_master_lookup(bgp_clist,
20648 LARGE_COMMUNITY_LIST_MASTER);
20649 if (!cm)
20650 return CMD_SUCCESS;
57d187bc 20651
d62a17ae 20652 for (list = cm->num.head; list; list = list->next)
20653 lcommunity_list_show(vty, list);
57d187bc 20654
d62a17ae 20655 for (list = cm->str.head; list; list = list->next)
20656 lcommunity_list_show(vty, list);
57d187bc 20657
d62a17ae 20658 return CMD_SUCCESS;
57d187bc
JS
20659}
20660
7336e101
SP
20661DEFUN (show_lcommunity_list_arg,
20662 show_bgp_lcommunity_list_arg_cmd,
a2099c1d 20663 "show bgp large-community-list <(1-500)|LCOMMUNITY_LIST_NAME> detail",
7336e101
SP
20664 SHOW_STR
20665 BGP_STR
57d187bc 20666 "List large-community list\n"
960b69b9 20667 "Large-community-list number\n"
20668 "Large-community-list name\n"
20669 "Detailed information on large-community-list\n")
57d187bc 20670{
d62a17ae 20671 struct community_list *list;
57d187bc 20672
e237b0d2 20673 list = community_list_lookup(bgp_clist, argv[3]->arg, 0,
d62a17ae 20674 LARGE_COMMUNITY_LIST_MASTER);
20675 if (!list) {
960b69b9 20676 vty_out(vty, "%% Can't find large-community-list\n");
d62a17ae 20677 return CMD_WARNING;
20678 }
57d187bc 20679
d62a17ae 20680 lcommunity_list_show(vty, list);
57d187bc 20681
d62a17ae 20682 return CMD_SUCCESS;
57d187bc
JS
20683}
20684
718e3744 20685/* "extcommunity-list" keyword help string. */
20686#define EXTCOMMUNITY_LIST_STR "Add a extended community list entry\n"
20687#define EXTCOMMUNITY_VAL_STR "Extended community attribute in 'rt aa:nn_or_IPaddr:nn' OR 'soo aa:nn_or_IPaddr:nn' format\n"
20688
7336e101
SP
20689DEFUN (extcommunity_list_standard,
20690 bgp_extcommunity_list_standard_cmd,
a2099c1d 20691 "bgp extcommunity-list <(1-99)|standard EXTCOMMUNITY_LIST_NAME> [seq (0-4294967295)] <deny|permit> AA:NN...",
7336e101 20692 BGP_STR
718e3744 20693 EXTCOMMUNITY_LIST_STR
20694 "Extended Community list number (standard)\n"
718e3744 20695 "Specify standard extcommunity-list\n"
5bf15956 20696 "Community list name\n"
2f8cc0e5
DA
20697 "Sequence number of an entry\n"
20698 "Sequence number\n"
718e3744 20699 "Specify community to reject\n"
20700 "Specify community to accept\n"
20701 EXTCOMMUNITY_VAL_STR)
20702{
d62a17ae 20703 int style = EXTCOMMUNITY_LIST_STANDARD;
20704 int direct = 0;
20705 char *cl_number_or_name = NULL;
2f8cc0e5 20706 char *seq = NULL;
42f914d4 20707
d62a17ae 20708 int idx = 0;
7b9a4750 20709
d62a17ae 20710 argv_find(argv, argc, "(1-99)", &idx);
a2099c1d 20711 argv_find(argv, argc, "EXTCOMMUNITY_LIST_NAME", &idx);
d62a17ae 20712 cl_number_or_name = argv[idx]->arg;
2f8cc0e5 20713
a08032fe 20714 if (argv_find(argv, argc, "(0-4294967295)", &idx))
2f8cc0e5
DA
20715 seq = argv[idx]->arg;
20716
d62a17ae 20717 direct = argv_find(argv, argc, "permit", &idx) ? COMMUNITY_PERMIT
20718 : COMMUNITY_DENY;
20719 argv_find(argv, argc, "AA:NN", &idx);
20720 char *str = argv_concat(argv, argc, idx);
42f914d4 20721
2f8cc0e5 20722 int ret = extcommunity_list_set(bgp_clist, cl_number_or_name, str, seq,
d62a17ae 20723 direct, style);
42f914d4 20724
d62a17ae 20725 XFREE(MTYPE_TMP, str);
42f914d4 20726
d62a17ae 20727 if (ret < 0) {
20728 community_list_perror(vty, ret);
20729 return CMD_WARNING_CONFIG_FAILED;
20730 }
42f914d4 20731
d62a17ae 20732 return CMD_SUCCESS;
718e3744 20733}
20734
7336e101
SP
20735DEFUN (extcommunity_list_name_expanded,
20736 bgp_extcommunity_list_name_expanded_cmd,
a2099c1d 20737 "bgp extcommunity-list <(100-500)|expanded EXTCOMMUNITY_LIST_NAME> [seq (0-4294967295)] <deny|permit> LINE...",
7336e101
SP
20738 BGP_STR
20739 EXTCOMMUNITY_LIST_STR
5bf15956 20740 "Extended Community list number (expanded)\n"
718e3744 20741 "Specify expanded extcommunity-list\n"
20742 "Extended Community list name\n"
2f8cc0e5
DA
20743 "Sequence number of an entry\n"
20744 "Sequence number\n"
718e3744 20745 "Specify community to reject\n"
20746 "Specify community to accept\n"
20747 "An ordered list as a regular-expression\n")
20748{
d62a17ae 20749 int style = EXTCOMMUNITY_LIST_EXPANDED;
20750 int direct = 0;
20751 char *cl_number_or_name = NULL;
2f8cc0e5 20752 char *seq = NULL;
d62a17ae 20753 int idx = 0;
7336e101 20754
d62a17ae 20755 argv_find(argv, argc, "(100-500)", &idx);
a2099c1d 20756 argv_find(argv, argc, "EXTCOMMUNITY_LIST_NAME", &idx);
d62a17ae 20757 cl_number_or_name = argv[idx]->arg;
2f8cc0e5 20758
a08032fe 20759 if (argv_find(argv, argc, "(0-4294967295)", &idx))
2f8cc0e5
DA
20760 seq = argv[idx]->arg;
20761
d62a17ae 20762 direct = argv_find(argv, argc, "permit", &idx) ? COMMUNITY_PERMIT
20763 : COMMUNITY_DENY;
20764 argv_find(argv, argc, "LINE", &idx);
20765 char *str = argv_concat(argv, argc, idx);
42f914d4 20766
2f8cc0e5 20767 int ret = extcommunity_list_set(bgp_clist, cl_number_or_name, str, seq,
d62a17ae 20768 direct, style);
42f914d4 20769
d62a17ae 20770 XFREE(MTYPE_TMP, str);
42f914d4 20771
d62a17ae 20772 if (ret < 0) {
20773 community_list_perror(vty, ret);
20774 return CMD_WARNING_CONFIG_FAILED;
20775 }
42f914d4 20776
d62a17ae 20777 return CMD_SUCCESS;
718e3744 20778}
20779
7336e101
SP
20780DEFUN (no_extcommunity_list_standard_all,
20781 no_bgp_extcommunity_list_standard_all_cmd,
a2099c1d 20782 "no bgp extcommunity-list <(1-99)|standard EXTCOMMUNITY_LIST_NAME> [seq (0-4294967295)] <deny|permit> AA:NN...",
7336e101
SP
20783 NO_STR
20784 BGP_STR
20785 EXTCOMMUNITY_LIST_STR
813d4307 20786 "Extended Community list number (standard)\n"
718e3744 20787 "Specify standard extcommunity-list\n"
5bf15956 20788 "Community list name\n"
2f8cc0e5
DA
20789 "Sequence number of an entry\n"
20790 "Sequence number\n"
718e3744 20791 "Specify community to reject\n"
20792 "Specify community to accept\n"
20793 EXTCOMMUNITY_VAL_STR)
20794{
d62a17ae 20795 int style = EXTCOMMUNITY_LIST_STANDARD;
20796 int direct = 0;
20797 char *cl_number_or_name = NULL;
d4455c89 20798 char *str = NULL;
2f8cc0e5 20799 char *seq = NULL;
d62a17ae 20800 int idx = 0;
d4455c89 20801
a08032fe 20802 if (argv_find(argv, argc, "(0-4294967295)", &idx))
2f8cc0e5
DA
20803 seq = argv[idx]->arg;
20804
20805 idx = 0;
d4455c89
DA
20806 argv_find(argv, argc, "permit", &idx);
20807 argv_find(argv, argc, "deny", &idx);
d4455c89
DA
20808 if (idx) {
20809 direct = argv_find(argv, argc, "permit", &idx)
20810 ? COMMUNITY_PERMIT
20811 : COMMUNITY_DENY;
20812
20813 idx = 0;
20814 argv_find(argv, argc, "AA:NN", &idx);
20815 str = argv_concat(argv, argc, idx);
20816 }
20817
20818 idx = 0;
d62a17ae 20819 argv_find(argv, argc, "(1-99)", &idx);
a2099c1d 20820 argv_find(argv, argc, "EXTCOMMUNITY_LIST_NAME", &idx);
d62a17ae 20821 cl_number_or_name = argv[idx]->arg;
42f914d4 20822
d62a17ae 20823 int ret = extcommunity_list_unset(bgp_clist, cl_number_or_name, str,
2f8cc0e5 20824 seq, direct, style);
42f914d4 20825
d62a17ae 20826 XFREE(MTYPE_TMP, str);
42f914d4 20827
d62a17ae 20828 if (ret < 0) {
20829 community_list_perror(vty, ret);
20830 return CMD_WARNING_CONFIG_FAILED;
20831 }
42f914d4 20832
d62a17ae 20833 return CMD_SUCCESS;
718e3744 20834}
20835
d4455c89
DA
20836ALIAS(no_extcommunity_list_standard_all,
20837 no_bgp_extcommunity_list_standard_all_list_cmd,
a2099c1d 20838 "no bgp extcommunity-list <(1-99)|standard EXTCOMMUNITY_LIST_NAME>",
36d4bb44 20839 NO_STR BGP_STR EXTCOMMUNITY_LIST_STR
d4455c89
DA
20840 "Extended Community list number (standard)\n"
20841 "Specify standard extcommunity-list\n"
20842 "Community list name\n")
20843
7336e101
SP
20844DEFUN (no_extcommunity_list_expanded_all,
20845 no_bgp_extcommunity_list_expanded_all_cmd,
a2099c1d 20846 "no bgp extcommunity-list <(100-500)|expanded EXTCOMMUNITY_LIST_NAME> [seq (0-4294967295)] <deny|permit> LINE...",
7336e101
SP
20847 NO_STR
20848 BGP_STR
20849 EXTCOMMUNITY_LIST_STR
718e3744 20850 "Extended Community list number (expanded)\n"
718e3744 20851 "Specify expanded extcommunity-list\n"
5bf15956 20852 "Extended Community list name\n"
2f8cc0e5
DA
20853 "Sequence number of an entry\n"
20854 "Sequence number\n"
718e3744 20855 "Specify community to reject\n"
20856 "Specify community to accept\n"
20857 "An ordered list as a regular-expression\n")
20858{
d62a17ae 20859 int style = EXTCOMMUNITY_LIST_EXPANDED;
20860 int direct = 0;
20861 char *cl_number_or_name = NULL;
d4455c89 20862 char *str = NULL;
2f8cc0e5 20863 char *seq = NULL;
d62a17ae 20864 int idx = 0;
d4455c89 20865
a08032fe 20866 if (argv_find(argv, argc, "(0-4294967295)", &idx))
2f8cc0e5
DA
20867 seq = argv[idx]->arg;
20868
20869 idx = 0;
d4455c89
DA
20870 argv_find(argv, argc, "permit", &idx);
20871 argv_find(argv, argc, "deny", &idx);
20872
20873 if (idx) {
20874 direct = argv_find(argv, argc, "permit", &idx)
20875 ? COMMUNITY_PERMIT
20876 : COMMUNITY_DENY;
20877
20878 idx = 0;
20879 argv_find(argv, argc, "LINE", &idx);
20880 str = argv_concat(argv, argc, idx);
20881 }
20882
20883 idx = 0;
d62a17ae 20884 argv_find(argv, argc, "(100-500)", &idx);
a2099c1d 20885 argv_find(argv, argc, "EXTCOMMUNITY_LIST_NAME", &idx);
d62a17ae 20886 cl_number_or_name = argv[idx]->arg;
42f914d4 20887
d62a17ae 20888 int ret = extcommunity_list_unset(bgp_clist, cl_number_or_name, str,
2f8cc0e5 20889 seq, direct, style);
42f914d4 20890
d62a17ae 20891 XFREE(MTYPE_TMP, str);
42f914d4 20892
d62a17ae 20893 if (ret < 0) {
20894 community_list_perror(vty, ret);
20895 return CMD_WARNING_CONFIG_FAILED;
20896 }
42f914d4 20897
d62a17ae 20898 return CMD_SUCCESS;
718e3744 20899}
20900
d4455c89
DA
20901ALIAS(no_extcommunity_list_expanded_all,
20902 no_bgp_extcommunity_list_expanded_all_list_cmd,
a2099c1d 20903 "no bgp extcommunity-list <(100-500)|expanded EXTCOMMUNITY_LIST_NAME>",
36d4bb44 20904 NO_STR BGP_STR EXTCOMMUNITY_LIST_STR
d4455c89
DA
20905 "Extended Community list number (expanded)\n"
20906 "Specify expanded extcommunity-list\n"
20907 "Extended Community list name\n")
20908
d62a17ae 20909static void extcommunity_list_show(struct vty *vty, struct community_list *list)
718e3744 20910{
d62a17ae 20911 struct community_entry *entry;
718e3744 20912
d62a17ae 20913 for (entry = list->head; entry; entry = entry->next) {
20914 if (entry == list->head) {
20915 if (all_digit(list->name))
20916 vty_out(vty, "Extended community %s list %s\n",
20917 entry->style == EXTCOMMUNITY_LIST_STANDARD
20918 ? "standard"
20919 : "(expanded) access",
20920 list->name);
20921 else
20922 vty_out(vty,
20923 "Named extended community %s list %s\n",
20924 entry->style == EXTCOMMUNITY_LIST_STANDARD
20925 ? "standard"
20926 : "expanded",
20927 list->name);
20928 }
20929 if (entry->any)
20930 vty_out(vty, " %s\n",
20931 community_direct_str(entry->direct));
20932 else
20933 vty_out(vty, " %s %s\n",
20934 community_direct_str(entry->direct),
8d9b8ed9 20935 community_list_config_str(entry));
d62a17ae 20936 }
718e3744 20937}
20938
7336e101
SP
20939DEFUN (show_extcommunity_list,
20940 show_bgp_extcommunity_list_cmd,
20941 "show bgp extcommunity-list",
718e3744 20942 SHOW_STR
7336e101 20943 BGP_STR
718e3744 20944 "List extended-community list\n")
20945{
d62a17ae 20946 struct community_list *list;
20947 struct community_list_master *cm;
718e3744 20948
d62a17ae 20949 cm = community_list_master_lookup(bgp_clist, EXTCOMMUNITY_LIST_MASTER);
20950 if (!cm)
20951 return CMD_SUCCESS;
718e3744 20952
d62a17ae 20953 for (list = cm->num.head; list; list = list->next)
20954 extcommunity_list_show(vty, list);
718e3744 20955
d62a17ae 20956 for (list = cm->str.head; list; list = list->next)
20957 extcommunity_list_show(vty, list);
718e3744 20958
d62a17ae 20959 return CMD_SUCCESS;
718e3744 20960}
20961
7336e101
SP
20962DEFUN (show_extcommunity_list_arg,
20963 show_bgp_extcommunity_list_arg_cmd,
a2099c1d 20964 "show bgp extcommunity-list <(1-500)|EXTCOMMUNITY_LIST_NAME> detail",
7336e101
SP
20965 SHOW_STR
20966 BGP_STR
718e3744 20967 "List extended-community list\n"
20968 "Extcommunity-list number\n"
960b69b9 20969 "Extcommunity-list name\n"
20970 "Detailed information on extcommunity-list\n")
718e3744 20971{
d62a17ae 20972 int idx_comm_list = 3;
20973 struct community_list *list;
718e3744 20974
e237b0d2 20975 list = community_list_lookup(bgp_clist, argv[idx_comm_list]->arg, 0,
d62a17ae 20976 EXTCOMMUNITY_LIST_MASTER);
20977 if (!list) {
20978 vty_out(vty, "%% Can't find extcommunity-list\n");
20979 return CMD_WARNING;
20980 }
718e3744 20981
d62a17ae 20982 extcommunity_list_show(vty, list);
718e3744 20983
d62a17ae 20984 return CMD_SUCCESS;
718e3744 20985}
6b0655a2 20986
718e3744 20987/* Display community-list and extcommunity-list configuration. */
d62a17ae 20988static int community_list_config_write(struct vty *vty)
20989{
20990 struct community_list *list;
20991 struct community_entry *entry;
20992 struct community_list_master *cm;
20993 int write = 0;
20994
20995 /* Community-list. */
20996 cm = community_list_master_lookup(bgp_clist, COMMUNITY_LIST_MASTER);
20997
20998 for (list = cm->num.head; list; list = list->next)
20999 for (entry = list->head; entry; entry = entry->next) {
2f8cc0e5
DA
21000 vty_out(vty,
21001 "bgp community-list %s seq %" PRId64 " %s %s\n",
21002 list->name, entry->seq,
d62a17ae 21003 community_direct_str(entry->direct),
21004 community_list_config_str(entry));
21005 write++;
21006 }
21007 for (list = cm->str.head; list; list = list->next)
21008 for (entry = list->head; entry; entry = entry->next) {
2f8cc0e5
DA
21009 vty_out(vty,
21010 "bgp community-list %s %s seq %" PRId64 " %s %s\n",
d62a17ae 21011 entry->style == COMMUNITY_LIST_STANDARD
21012 ? "standard"
21013 : "expanded",
2f8cc0e5
DA
21014 list->name, entry->seq,
21015 community_direct_str(entry->direct),
d62a17ae 21016 community_list_config_str(entry));
21017 write++;
21018 }
21019
21020 /* Extcommunity-list. */
21021 cm = community_list_master_lookup(bgp_clist, EXTCOMMUNITY_LIST_MASTER);
21022
21023 for (list = cm->num.head; list; list = list->next)
21024 for (entry = list->head; entry; entry = entry->next) {
2f8cc0e5
DA
21025 vty_out(vty,
21026 "bgp extcommunity-list %s seq %" PRId64 " %s %s\n",
21027 list->name, entry->seq,
21028 community_direct_str(entry->direct),
d62a17ae 21029 community_list_config_str(entry));
21030 write++;
21031 }
21032 for (list = cm->str.head; list; list = list->next)
21033 for (entry = list->head; entry; entry = entry->next) {
2f8cc0e5 21034 vty_out(vty,
6cde4b45 21035 "bgp extcommunity-list %s %s seq %" PRId64" %s %s\n",
d62a17ae 21036 entry->style == EXTCOMMUNITY_LIST_STANDARD
21037 ? "standard"
21038 : "expanded",
2f8cc0e5
DA
21039 list->name, entry->seq,
21040 community_direct_str(entry->direct),
d62a17ae 21041 community_list_config_str(entry));
21042 write++;
21043 }
21044
21045
21046 /* lcommunity-list. */
21047 cm = community_list_master_lookup(bgp_clist,
21048 LARGE_COMMUNITY_LIST_MASTER);
21049
21050 for (list = cm->num.head; list; list = list->next)
21051 for (entry = list->head; entry; entry = entry->next) {
2f8cc0e5 21052 vty_out(vty,
6cde4b45 21053 "bgp large-community-list %s seq %" PRId64" %s %s\n",
2f8cc0e5
DA
21054 list->name, entry->seq,
21055 community_direct_str(entry->direct),
d62a17ae 21056 community_list_config_str(entry));
21057 write++;
21058 }
21059 for (list = cm->str.head; list; list = list->next)
21060 for (entry = list->head; entry; entry = entry->next) {
2f8cc0e5 21061 vty_out(vty,
6cde4b45 21062 "bgp large-community-list %s %s seq %" PRId64" %s %s\n",
2f8cc0e5 21063
d62a17ae 21064 entry->style == LARGE_COMMUNITY_LIST_STANDARD
21065 ? "standard"
21066 : "expanded",
2f8cc0e5 21067 list->name, entry->seq, community_direct_str(entry->direct),
d62a17ae 21068 community_list_config_str(entry));
21069 write++;
21070 }
21071
21072 return write;
21073}
21074
612c2c15 21075static int community_list_config_write(struct vty *vty);
d62a17ae 21076static struct cmd_node community_list_node = {
f4b8291f 21077 .name = "community list",
62b346ee
DL
21078 .node = COMMUNITY_LIST_NODE,
21079 .prompt = "",
612c2c15 21080 .config_write = community_list_config_write,
718e3744 21081};
21082
d62a17ae 21083static void community_list_vty(void)
21084{
612c2c15 21085 install_node(&community_list_node);
d62a17ae 21086
21087 /* Community-list. */
7336e101
SP
21088 install_element(CONFIG_NODE, &bgp_community_list_standard_cmd);
21089 install_element(CONFIG_NODE, &bgp_community_list_expanded_all_cmd);
21090 install_element(CONFIG_NODE, &no_bgp_community_list_standard_all_cmd);
174b5cb9 21091 install_element(CONFIG_NODE, &no_bgp_community_list_standard_all_list_cmd);
7336e101 21092 install_element(CONFIG_NODE, &no_bgp_community_list_expanded_all_cmd);
174b5cb9 21093 install_element(CONFIG_NODE, &no_bgp_community_list_expanded_all_list_cmd);
7336e101
SP
21094 install_element(VIEW_NODE, &show_bgp_community_list_cmd);
21095 install_element(VIEW_NODE, &show_bgp_community_list_arg_cmd);
d62a17ae 21096
21097 /* Extcommunity-list. */
7336e101
SP
21098 install_element(CONFIG_NODE, &bgp_extcommunity_list_standard_cmd);
21099 install_element(CONFIG_NODE, &bgp_extcommunity_list_name_expanded_cmd);
21100 install_element(CONFIG_NODE, &no_bgp_extcommunity_list_standard_all_cmd);
d4455c89
DA
21101 install_element(CONFIG_NODE,
21102 &no_bgp_extcommunity_list_standard_all_list_cmd);
7336e101 21103 install_element(CONFIG_NODE, &no_bgp_extcommunity_list_expanded_all_cmd);
d4455c89
DA
21104 install_element(CONFIG_NODE,
21105 &no_bgp_extcommunity_list_expanded_all_list_cmd);
7336e101
SP
21106 install_element(VIEW_NODE, &show_bgp_extcommunity_list_cmd);
21107 install_element(VIEW_NODE, &show_bgp_extcommunity_list_arg_cmd);
d62a17ae 21108
21109 /* Large Community List */
7336e101 21110 install_element(CONFIG_NODE, &bgp_lcommunity_list_standard_cmd);
7336e101
SP
21111 install_element(CONFIG_NODE, &bgp_lcommunity_list_expanded_cmd);
21112 install_element(CONFIG_NODE, &bgp_lcommunity_list_name_standard_cmd);
7336e101 21113 install_element(CONFIG_NODE, &bgp_lcommunity_list_name_expanded_cmd);
4378f57c
DA
21114 install_element(CONFIG_NODE, &no_bgp_lcommunity_list_all_cmd);
21115 install_element(CONFIG_NODE,
21116 &no_bgp_lcommunity_list_name_standard_all_cmd);
7336e101
SP
21117 install_element(CONFIG_NODE,
21118 &no_bgp_lcommunity_list_name_expanded_all_cmd);
21119 install_element(CONFIG_NODE, &no_bgp_lcommunity_list_standard_cmd);
21120 install_element(CONFIG_NODE, &no_bgp_lcommunity_list_expanded_cmd);
21121 install_element(CONFIG_NODE, &no_bgp_lcommunity_list_name_standard_cmd);
21122 install_element(CONFIG_NODE, &no_bgp_lcommunity_list_name_expanded_cmd);
21123 install_element(VIEW_NODE, &show_bgp_lcommunity_list_cmd);
21124 install_element(VIEW_NODE, &show_bgp_lcommunity_list_arg_cmd);
225096bc
DA
21125
21126 bgp_community_list_command_completion_setup();
5bf15956 21127}
ed0e57e3
DA
21128
21129static struct cmd_node community_alias_node = {
21130 .name = "community alias",
21131 .node = COMMUNITY_ALIAS_NODE,
21132 .prompt = "",
21133 .config_write = bgp_community_alias_write,
21134};
21135
21136void community_alias_vty(void)
21137{
21138 install_node(&community_alias_node);
21139
21140 /* Community-list. */
21141 install_element(CONFIG_NODE, &bgp_community_alias_cmd);
b4ad2fae
DS
21142
21143 bgp_community_alias_command_completion_setup();
ed0e57e3 21144}