blob: 9f06538ec3e9051a011b6089fd2cb94705775b38 [file] [log] [blame]
paul718e3742002-12-13 20:15:29 +00001/* MPLS-VPN
2 Copyright (C) 2000 Kunihiro Ishiguro <kunihiro@zebra.org>
3
4This file is part of GNU Zebra.
5
6GNU Zebra is free software; you can redistribute it and/or modify it
7under the terms of the GNU General Public License as published by the
8Free Software Foundation; either version 2, or (at your option) any
9later version.
10
11GNU Zebra is distributed in the hope that it will be useful, but
12WITHOUT ANY WARRANTY; without even the implied warranty of
13MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14General Public License for more details.
15
16You should have received a copy of the GNU General Public License
17along with GNU Zebra; see the file COPYING. If not, write to the Free
18Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
1902111-1307, USA. */
20
21#include <zebra.h>
22
23#include "command.h"
24#include "prefix.h"
25#include "log.h"
26#include "memory.h"
27#include "stream.h"
Donald Sharp04907292016-01-07 10:03:01 -050028#include "filter.h"
paul718e3742002-12-13 20:15:29 +000029
30#include "bgpd/bgpd.h"
31#include "bgpd/bgp_table.h"
32#include "bgpd/bgp_route.h"
33#include "bgpd/bgp_attr.h"
34#include "bgpd/bgp_mplsvpn.h"
35
paul94f2b392005-06-28 12:44:16 +000036static u_int16_t
paul718e3742002-12-13 20:15:29 +000037decode_rd_type (u_char *pnt)
38{
39 u_int16_t v;
40
41 v = ((u_int16_t) *pnt++ << 8);
42 v |= (u_int16_t) *pnt;
43 return v;
44}
45
46u_int32_t
47decode_label (u_char *pnt)
48{
49 u_int32_t l;
50
51 l = ((u_int32_t) *pnt++ << 12);
52 l |= (u_int32_t) *pnt++ << 4;
53 l |= (u_int32_t) ((*pnt & 0xf0) >> 4);
54 return l;
55}
56
Lou Bergera03bd162016-01-12 13:41:54 -050057/* type == RD_TYPE_AS */
paul94f2b392005-06-28 12:44:16 +000058static void
paul718e3742002-12-13 20:15:29 +000059decode_rd_as (u_char *pnt, struct rd_as *rd_as)
60{
61 rd_as->as = (u_int16_t) *pnt++ << 8;
62 rd_as->as |= (u_int16_t) *pnt++;
63
64 rd_as->val = ((u_int32_t) *pnt++ << 24);
65 rd_as->val |= ((u_int32_t) *pnt++ << 16);
66 rd_as->val |= ((u_int32_t) *pnt++ << 8);
67 rd_as->val |= (u_int32_t) *pnt;
68}
69
Lou Bergera03bd162016-01-12 13:41:54 -050070/* type == RD_TYPE_AS4 */
71static void
72decode_rd_as4 (u_char *pnt, struct rd_as *rd_as)
73{
74 rd_as->as = (u_int32_t) *pnt++ << 24;
75 rd_as->as |= (u_int32_t) *pnt++ << 16;
76 rd_as->as |= (u_int32_t) *pnt++ << 8;
77 rd_as->as |= (u_int32_t) *pnt++;
78
79 rd_as->val = ((u_int16_t) *pnt++ << 8);
80 rd_as->val |= (u_int16_t) *pnt;
81}
82
83/* type == RD_TYPE_IP */
paul94f2b392005-06-28 12:44:16 +000084static void
paul718e3742002-12-13 20:15:29 +000085decode_rd_ip (u_char *pnt, struct rd_ip *rd_ip)
86{
87 memcpy (&rd_ip->ip, pnt, 4);
88 pnt += 4;
89
90 rd_ip->val = ((u_int16_t) *pnt++ << 8);
91 rd_ip->val |= (u_int16_t) *pnt;
92}
93
paul718e3742002-12-13 20:15:29 +000094int
Lou Berger9da04bc2016-01-12 13:41:55 -050095bgp_nlri_parse_vpn (struct peer *peer, struct attr *attr,
96 struct bgp_nlri *packet)
paul718e3742002-12-13 20:15:29 +000097{
98 u_char *pnt;
99 u_char *lim;
100 struct prefix p;
Lou Berger9da04bc2016-01-12 13:41:55 -0500101 int psize = 0;
paul718e3742002-12-13 20:15:29 +0000102 int prefixlen;
paul718e3742002-12-13 20:15:29 +0000103 u_int16_t type;
104 struct rd_as rd_as;
105 struct rd_ip rd_ip;
106 struct prefix_rd prd;
107 u_char *tagpnt;
108
109 /* Check peer status. */
110 if (peer->status != Established)
111 return 0;
112
113 /* Make prefix_rd */
114 prd.family = AF_UNSPEC;
115 prd.prefixlen = 64;
116
117 pnt = packet->nlri;
118 lim = pnt + packet->length;
119
Donald Sharpa3bc7e92016-01-27 16:54:45 +0000120#define VPN_PREFIXLEN_MIN_BYTES (3 + 8) /* label + RD */
paul718e3742002-12-13 20:15:29 +0000121 for (; pnt < lim; pnt += psize)
122 {
123 /* Clear prefix structure. */
124 memset (&p, 0, sizeof (struct prefix));
125
126 /* Fetch prefix length. */
127 prefixlen = *pnt++;
Donald Sharpa3bc7e92016-01-27 16:54:45 +0000128 p.family = afi2family (packet->afi);
paul718e3742002-12-13 20:15:29 +0000129 psize = PSIZE (prefixlen);
Donald Sharpa3bc7e92016-01-27 16:54:45 +0000130
131 /* sanity check against packet data */
132 if (prefixlen < VPN_PREFIXLEN_MIN_BYTES*8 || (pnt + psize) > lim)
133 {
134 zlog_err ("prefix length (%d) is less than 88"
135 " or larger than received (%u)",
136 prefixlen, (uint)(lim-pnt));
137 return -1;
138 }
139
140 /* sanity check against storage for the IP address portion */
141 if ((psize - VPN_PREFIXLEN_MIN_BYTES) > (ssize_t) sizeof(p.u))
142 {
143 zlog_err ("prefix length (%d) exceeds prefix storage (%zu)",
144 prefixlen - VPN_PREFIXLEN_MIN_BYTES*8, sizeof(p.u));
145 return -1;
146 }
147
148 /* Sanity check against max bitlen of the address family */
149 if ((psize - VPN_PREFIXLEN_MIN_BYTES) > prefix_blen (&p))
150 {
151 zlog_err ("prefix length (%d) exceeds family (%u) max byte length (%u)",
152 prefixlen - VPN_PREFIXLEN_MIN_BYTES*8,
153 p.family, prefix_blen (&p));
154 return -1;
155
156 }
157
paul718e3742002-12-13 20:15:29 +0000158 /* Copyr label to prefix. */
Donald Sharpa3bc7e92016-01-27 16:54:45 +0000159 tagpnt = pnt;
paul718e3742002-12-13 20:15:29 +0000160
161 /* Copy routing distinguisher to rd. */
162 memcpy (&prd.val, pnt + 3, 8);
163
164 /* Decode RD type. */
165 type = decode_rd_type (pnt + 3);
166
Lou Bergera03bd162016-01-12 13:41:54 -0500167 switch (type)
168 {
169 case RD_TYPE_AS:
170 decode_rd_as (pnt + 5, &rd_as);
171 break;
172
173 case RD_TYPE_AS4:
174 decode_rd_as4 (pnt + 5, &rd_as);
175 break;
176
177 case RD_TYPE_IP:
178 decode_rd_ip (pnt + 5, &rd_ip);
179 break;
180
Lou Berger050defe2016-01-12 13:41:59 -0500181 default:
182 zlog_err ("Unknown RD type %d", type);
183 break; /* just report */
184 }
paul718e3742002-12-13 20:15:29 +0000185
Donald Sharpa3bc7e92016-01-27 16:54:45 +0000186 p.prefixlen = prefixlen - VPN_PREFIXLEN_MIN_BYTES*8;
187 memcpy (&p.u.prefix, pnt + VPN_PREFIXLEN_MIN_BYTES,
188 psize - VPN_PREFIXLEN_MIN_BYTES);
paul718e3742002-12-13 20:15:29 +0000189
paul718e3742002-12-13 20:15:29 +0000190 if (attr)
Lou Berger9da04bc2016-01-12 13:41:55 -0500191 bgp_update (peer, &p, attr, packet->afi, SAFI_MPLS_VPN,
192 ZEBRA_ROUTE_BGP, BGP_ROUTE_NORMAL, &prd, tagpnt, 0);
paul718e3742002-12-13 20:15:29 +0000193 else
Lou Berger9da04bc2016-01-12 13:41:55 -0500194 bgp_withdraw (peer, &p, attr, packet->afi, SAFI_MPLS_VPN,
195 ZEBRA_ROUTE_BGP, BGP_ROUTE_NORMAL, &prd, tagpnt);
paul718e3742002-12-13 20:15:29 +0000196 }
paul718e3742002-12-13 20:15:29 +0000197 /* Packet length consistency check. */
198 if (pnt != lim)
199 return -1;
Donald Sharpa3bc7e92016-01-27 16:54:45 +0000200
paul718e3742002-12-13 20:15:29 +0000201 return 0;
Donald Sharpa3bc7e92016-01-27 16:54:45 +0000202#undef VPN_PREFIXLEN_MIN_BYTES
paul718e3742002-12-13 20:15:29 +0000203}
204
205int
paulfd79ac92004-10-13 05:06:08 +0000206str2prefix_rd (const char *str, struct prefix_rd *prd)
paul718e3742002-12-13 20:15:29 +0000207{
Lou Berger056f3762013-04-10 12:30:04 -0700208 int ret; /* ret of called functions */
209 int lret; /* local ret, of this func */
paul5228ad22004-06-04 17:58:18 +0000210 char *p;
211 char *p2;
Lou Berger056f3762013-04-10 12:30:04 -0700212 struct stream *s = NULL;
213 char *half = NULL;
paul718e3742002-12-13 20:15:29 +0000214 struct in_addr addr;
215
216 s = stream_new (8);
217
218 prd->family = AF_UNSPEC;
219 prd->prefixlen = 64;
220
Lou Berger056f3762013-04-10 12:30:04 -0700221 lret = 0;
paul718e3742002-12-13 20:15:29 +0000222 p = strchr (str, ':');
223 if (! p)
Lou Berger056f3762013-04-10 12:30:04 -0700224 goto out;
paul718e3742002-12-13 20:15:29 +0000225
226 if (! all_digit (p + 1))
Lou Berger056f3762013-04-10 12:30:04 -0700227 goto out;
paul718e3742002-12-13 20:15:29 +0000228
229 half = XMALLOC (MTYPE_TMP, (p - str) + 1);
230 memcpy (half, str, (p - str));
231 half[p - str] = '\0';
232
233 p2 = strchr (str, '.');
234
235 if (! p2)
236 {
237 if (! all_digit (half))
Lou Berger056f3762013-04-10 12:30:04 -0700238 goto out;
239
paul718e3742002-12-13 20:15:29 +0000240 stream_putw (s, RD_TYPE_AS);
241 stream_putw (s, atoi (half));
242 stream_putl (s, atol (p + 1));
243 }
244 else
245 {
246 ret = inet_aton (half, &addr);
247 if (! ret)
Lou Berger056f3762013-04-10 12:30:04 -0700248 goto out;
249
paul718e3742002-12-13 20:15:29 +0000250 stream_putw (s, RD_TYPE_IP);
251 stream_put_in_addr (s, &addr);
252 stream_putw (s, atol (p + 1));
253 }
254 memcpy (prd->val, s->data, 8);
Lou Berger056f3762013-04-10 12:30:04 -0700255 lret = 1;
paul718e3742002-12-13 20:15:29 +0000256
Lou Berger056f3762013-04-10 12:30:04 -0700257out:
258 if (s)
259 stream_free (s);
260 if (half)
261 XFREE(MTYPE_TMP, half);
262 return lret;
paul718e3742002-12-13 20:15:29 +0000263}
264
265int
paulfd79ac92004-10-13 05:06:08 +0000266str2tag (const char *str, u_char *tag)
paul718e3742002-12-13 20:15:29 +0000267{
paulfd79ac92004-10-13 05:06:08 +0000268 unsigned long l;
269 char *endptr;
270 u_int32_t t;
paul718e3742002-12-13 20:15:29 +0000271
Ulrich Weber664711c2011-12-21 02:24:11 +0400272 if (*str == '-')
273 return 0;
paulfd79ac92004-10-13 05:06:08 +0000274
Ulrich Weber664711c2011-12-21 02:24:11 +0400275 errno = 0;
276 l = strtoul (str, &endptr, 10);
277
278 if (*endptr != '\0' || errno || l > UINT32_MAX)
paulfd79ac92004-10-13 05:06:08 +0000279 return 0;
paul718e3742002-12-13 20:15:29 +0000280
paulfd79ac92004-10-13 05:06:08 +0000281 t = (u_int32_t) l;
282
283 tag[0] = (u_char)(t >> 12);
284 tag[1] = (u_char)(t >> 4);
285 tag[2] = (u_char)(t << 4);
paul718e3742002-12-13 20:15:29 +0000286
287 return 1;
288}
289
290char *
291prefix_rd2str (struct prefix_rd *prd, char *buf, size_t size)
292{
293 u_char *pnt;
294 u_int16_t type;
295 struct rd_as rd_as;
296 struct rd_ip rd_ip;
297
298 if (size < RD_ADDRSTRLEN)
299 return NULL;
300
301 pnt = prd->val;
302
303 type = decode_rd_type (pnt);
304
305 if (type == RD_TYPE_AS)
306 {
307 decode_rd_as (pnt + 2, &rd_as);
Denis Ovsienkoaea339f2009-04-30 17:16:22 +0400308 snprintf (buf, size, "%u:%d", rd_as.as, rd_as.val);
paul718e3742002-12-13 20:15:29 +0000309 return buf;
310 }
Lou Bergera03bd162016-01-12 13:41:54 -0500311 else if (type == RD_TYPE_AS4)
312 {
313 decode_rd_as4 (pnt + 2, &rd_as);
314 snprintf (buf, size, "%u:%d", rd_as.as, rd_as.val);
315 return buf;
316 }
paul718e3742002-12-13 20:15:29 +0000317 else if (type == RD_TYPE_IP)
318 {
319 decode_rd_ip (pnt + 2, &rd_ip);
320 snprintf (buf, size, "%s:%d", inet_ntoa (rd_ip.ip), rd_ip.val);
321 return buf;
322 }
paul718e3742002-12-13 20:15:29 +0000323 return NULL;
324}
325
326/* For testing purpose, static route of MPLS-VPN. */
327DEFUN (vpnv4_network,
328 vpnv4_network_cmd,
329 "network A.B.C.D/M rd ASN:nn_or_IP-address:nn tag WORD",
330 "Specify a network to announce via BGP\n"
331 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
332 "Specify Route Distinguisher\n"
333 "VPN Route Distinguisher\n"
334 "BGP tag\n"
335 "tag value\n")
336{
Lou Bergera76d9ca2016-01-12 13:41:53 -0500337 return bgp_static_set_safi (SAFI_MPLS_VPN, vty, argv[0], argv[1], argv[2], NULL);
338}
339
340DEFUN (vpnv4_network_route_map,
341 vpnv4_network_route_map_cmd,
342 "network A.B.C.D/M rd ASN:nn_or_IP-address:nn tag WORD route-map WORD",
343 "Specify a network to announce via BGP\n"
344 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
345 "Specify Route Distinguisher\n"
346 "VPN Route Distinguisher\n"
347 "BGP tag\n"
348 "tag value\n"
349 "route map\n"
350 "route map name\n")
351{
352 return bgp_static_set_safi (SAFI_MPLS_VPN, vty, argv[0], argv[1], argv[2], argv[3]);
paul718e3742002-12-13 20:15:29 +0000353}
354
355/* For testing purpose, static route of MPLS-VPN. */
356DEFUN (no_vpnv4_network,
357 no_vpnv4_network_cmd,
358 "no network A.B.C.D/M rd ASN:nn_or_IP-address:nn tag WORD",
359 NO_STR
360 "Specify a network to announce via BGP\n"
361 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
362 "Specify Route Distinguisher\n"
363 "VPN Route Distinguisher\n"
364 "BGP tag\n"
365 "tag value\n")
366{
Lou Bergera76d9ca2016-01-12 13:41:53 -0500367 return bgp_static_unset_safi (SAFI_MPLS_VPN, vty, argv[0], argv[1], argv[2]);
paul718e3742002-12-13 20:15:29 +0000368}
369
paul94f2b392005-06-28 12:44:16 +0000370static int
paul718e3742002-12-13 20:15:29 +0000371show_adj_route_vpn (struct vty *vty, struct peer *peer, struct prefix_rd *prd)
372{
373 struct bgp *bgp;
374 struct bgp_table *table;
375 struct bgp_node *rn;
376 struct bgp_node *rm;
377 struct attr *attr;
378 int rd_header;
379 int header = 1;
380 char v4_header[] = " Network Next Hop Metric LocPrf Weight Path%s";
381
382 bgp = bgp_get_default ();
383 if (bgp == NULL)
384 {
385 vty_out (vty, "No BGP process is configured%s", VTY_NEWLINE);
386 return CMD_WARNING;
387 }
388
389 for (rn = bgp_table_top (bgp->rib[AFI_IP][SAFI_MPLS_VPN]); rn;
390 rn = bgp_route_next (rn))
391 {
392 if (prd && memcmp (rn->p.u.val, prd->val, 8) != 0)
393 continue;
394
395 if ((table = rn->info) != NULL)
396 {
397 rd_header = 1;
398
399 for (rm = bgp_table_top (table); rm; rm = bgp_route_next (rm))
400 if ((attr = rm->info) != NULL)
401 {
402 if (header)
403 {
404 vty_out (vty, "BGP table version is 0, local router ID is %s%s",
405 inet_ntoa (bgp->router_id), VTY_NEWLINE);
406 vty_out (vty, "Status codes: s suppressed, d damped, h history, * valid, > best, i - internal%s",
407 VTY_NEWLINE);
408 vty_out (vty, "Origin codes: i - IGP, e - EGP, ? - incomplete%s%s",
409 VTY_NEWLINE, VTY_NEWLINE);
410 vty_out (vty, v4_header, VTY_NEWLINE);
411 header = 0;
412 }
413
414 if (rd_header)
415 {
416 u_int16_t type;
417 struct rd_as rd_as;
418 struct rd_ip rd_ip;
419 u_char *pnt;
420
421 pnt = rn->p.u.val;
422
423 /* Decode RD type. */
424 type = decode_rd_type (pnt);
425 /* Decode RD value. */
426 if (type == RD_TYPE_AS)
427 decode_rd_as (pnt + 2, &rd_as);
Lou Bergera03bd162016-01-12 13:41:54 -0500428 else if (type == RD_TYPE_AS4)
429 decode_rd_as4 (pnt + 2, &rd_as);
paul718e3742002-12-13 20:15:29 +0000430 else if (type == RD_TYPE_IP)
431 decode_rd_ip (pnt + 2, &rd_ip);
432
433 vty_out (vty, "Route Distinguisher: ");
434
435 if (type == RD_TYPE_AS)
Denis Ovsienkoaea339f2009-04-30 17:16:22 +0400436 vty_out (vty, "%u:%d", rd_as.as, rd_as.val);
Lou Bergera03bd162016-01-12 13:41:54 -0500437 else if (type == RD_TYPE_AS4)
438 vty_out (vty, "%u:%d", rd_as.as, rd_as.val);
paul718e3742002-12-13 20:15:29 +0000439 else if (type == RD_TYPE_IP)
440 vty_out (vty, "%s:%d", inet_ntoa (rd_ip.ip), rd_ip.val);
441
442 vty_out (vty, "%s", VTY_NEWLINE);
443 rd_header = 0;
444 }
445 route_vty_out_tmp (vty, &rm->p, attr, SAFI_MPLS_VPN);
446 }
447 }
448 }
449 return CMD_SUCCESS;
450}
451
452enum bgp_show_type
453{
454 bgp_show_type_normal,
455 bgp_show_type_regexp,
456 bgp_show_type_prefix_list,
457 bgp_show_type_filter_list,
458 bgp_show_type_neighbor,
459 bgp_show_type_cidr_only,
460 bgp_show_type_prefix_longer,
461 bgp_show_type_community_all,
462 bgp_show_type_community,
463 bgp_show_type_community_exact,
464 bgp_show_type_community_list,
465 bgp_show_type_community_list_exact
466};
467
paul94f2b392005-06-28 12:44:16 +0000468static int
Lou Berger35c36862016-01-12 13:42:06 -0500469bgp_show_mpls_vpn(
470 struct vty *vty,
471 afi_t afi,
472 struct prefix_rd *prd,
473 enum bgp_show_type type,
474 void *output_arg,
475 int tags)
paul718e3742002-12-13 20:15:29 +0000476{
477 struct bgp *bgp;
478 struct bgp_table *table;
479 struct bgp_node *rn;
480 struct bgp_node *rm;
481 struct bgp_info *ri;
482 int rd_header;
483 int header = 1;
484 char v4_header[] = " Network Next Hop Metric LocPrf Weight Path%s";
485 char v4_header_tag[] = " Network Next Hop In tag/Out tag%s";
486
487 bgp = bgp_get_default ();
488 if (bgp == NULL)
489 {
490 vty_out (vty, "No BGP process is configured%s", VTY_NEWLINE);
491 return CMD_WARNING;
492 }
493
Lou Berger9da04bc2016-01-12 13:41:55 -0500494 if ((afi != AFI_IP) && (afi != AFI_IP6))
495 {
496 vty_out (vty, "Afi %d not supported%s", afi, VTY_NEWLINE);
497 return CMD_WARNING;
498 }
499
500 for (rn = bgp_table_top (bgp->rib[afi][SAFI_MPLS_VPN]); rn; rn = bgp_route_next (rn))
paul718e3742002-12-13 20:15:29 +0000501 {
502 if (prd && memcmp (rn->p.u.val, prd->val, 8) != 0)
503 continue;
504
505 if ((table = rn->info) != NULL)
506 {
507 rd_header = 1;
508
509 for (rm = bgp_table_top (table); rm; rm = bgp_route_next (rm))
510 for (ri = rm->info; ri; ri = ri->next)
511 {
512 if (type == bgp_show_type_neighbor)
513 {
514 union sockunion *su = output_arg;
515
516 if (ri->peer->su_remote == NULL || ! sockunion_same(ri->peer->su_remote, su))
517 continue;
518 }
519 if (header)
520 {
521 if (tags)
522 vty_out (vty, v4_header_tag, VTY_NEWLINE);
523 else
524 {
525 vty_out (vty, "BGP table version is 0, local router ID is %s%s",
526 inet_ntoa (bgp->router_id), VTY_NEWLINE);
527 vty_out (vty, "Status codes: s suppressed, d damped, h history, * valid, > best, i - internal%s",
528 VTY_NEWLINE);
529 vty_out (vty, "Origin codes: i - IGP, e - EGP, ? - incomplete%s%s",
530 VTY_NEWLINE, VTY_NEWLINE);
531 vty_out (vty, v4_header, VTY_NEWLINE);
532 }
533 header = 0;
534 }
535
536 if (rd_header)
537 {
538 u_int16_t type;
539 struct rd_as rd_as;
540 struct rd_ip rd_ip;
541 u_char *pnt;
542
543 pnt = rn->p.u.val;
544
545 /* Decode RD type. */
546 type = decode_rd_type (pnt);
547 /* Decode RD value. */
548 if (type == RD_TYPE_AS)
549 decode_rd_as (pnt + 2, &rd_as);
Lou Bergera03bd162016-01-12 13:41:54 -0500550 else if (type == RD_TYPE_AS4)
551 decode_rd_as4 (pnt + 2, &rd_as);
paul718e3742002-12-13 20:15:29 +0000552 else if (type == RD_TYPE_IP)
553 decode_rd_ip (pnt + 2, &rd_ip);
554
555 vty_out (vty, "Route Distinguisher: ");
556
557 if (type == RD_TYPE_AS)
Lou Bergera03bd162016-01-12 13:41:54 -0500558 vty_out (vty, "as2 %u:%d", rd_as.as, rd_as.val);
559 else if (type == RD_TYPE_AS4)
560 vty_out (vty, "as4 %u:%d", rd_as.as, rd_as.val);
paul718e3742002-12-13 20:15:29 +0000561 else if (type == RD_TYPE_IP)
Lou Bergera03bd162016-01-12 13:41:54 -0500562 vty_out (vty, "ip %s:%d", inet_ntoa (rd_ip.ip), rd_ip.val);
paul718e3742002-12-13 20:15:29 +0000563
564 vty_out (vty, "%s", VTY_NEWLINE);
565 rd_header = 0;
566 }
567 if (tags)
568 route_vty_out_tag (vty, &rm->p, ri, 0, SAFI_MPLS_VPN);
569 else
570 route_vty_out (vty, &rm->p, ri, 0, SAFI_MPLS_VPN);
571 }
572 }
573 }
574 return CMD_SUCCESS;
575}
576
Lou Berger35c36862016-01-12 13:42:06 -0500577DEFUN (show_bgp_ipv4_vpn,
578 show_bgp_ipv4_vpn_cmd,
579 "show bgp ipv4 vpn",
paul718e3742002-12-13 20:15:29 +0000580 SHOW_STR
paul718e3742002-12-13 20:15:29 +0000581 BGP_STR
Lou Berger35c36862016-01-12 13:42:06 -0500582 "Address Family\n"
583 "Display VPN NLRI specific information\n")
paul718e3742002-12-13 20:15:29 +0000584{
Lou Berger35c36862016-01-12 13:42:06 -0500585 return bgp_show_mpls_vpn (vty, AFI_IP, NULL, bgp_show_type_normal, NULL, 0);
paul718e3742002-12-13 20:15:29 +0000586}
587
Lou Berger35c36862016-01-12 13:42:06 -0500588#ifdef HAVE_IPV6
589DEFUN (show_bgp_ipv6_vpn,
590 show_bgp_ipv6_vpn_cmd,
591 "show bgp ipv6 vpn",
paul718e3742002-12-13 20:15:29 +0000592 SHOW_STR
paul718e3742002-12-13 20:15:29 +0000593 BGP_STR
Lou Berger35c36862016-01-12 13:42:06 -0500594 "Address Family\n"
595 "Display VPN NLRI specific information\n")
596{
597 return bgp_show_mpls_vpn (vty, AFI_IP6, NULL, bgp_show_type_normal, NULL, 0);
598}
599#endif
600
601DEFUN (show_bgp_ipv4_vpn_rd,
602 show_bgp_ipv4_vpn_rd_cmd,
603 "show bgp ipv4 vpn rd ASN:nn_or_IP-address:nn",
604 SHOW_STR
605 BGP_STR
606 "Address Family\n"
607 "Display VPN NLRI specific information\n"
paul718e3742002-12-13 20:15:29 +0000608 "Display information for a route distinguisher\n"
609 "VPN Route Distinguisher\n")
610{
611 int ret;
612 struct prefix_rd prd;
613
614 ret = str2prefix_rd (argv[0], &prd);
615 if (! ret)
616 {
617 vty_out (vty, "%% Malformed Route Distinguisher%s", VTY_NEWLINE);
618 return CMD_WARNING;
619 }
Lou Berger35c36862016-01-12 13:42:06 -0500620 return bgp_show_mpls_vpn (vty, AFI_IP, &prd, bgp_show_type_normal, NULL, 0);
paul718e3742002-12-13 20:15:29 +0000621}
622
Lou Berger35c36862016-01-12 13:42:06 -0500623DEFUN (show_bgp_ipv6_vpn_rd,
624 show_bgp_ipv6_vpn_rd_cmd,
625 "show bgp ipv6 vpn rd ASN:nn_or_IP-address:nn",
paul718e3742002-12-13 20:15:29 +0000626 SHOW_STR
paul718e3742002-12-13 20:15:29 +0000627 BGP_STR
Lou Berger35c36862016-01-12 13:42:06 -0500628 "Address Family\n"
629 "Display VPN NLRI specific information\n"
630 "Display information for a route distinguisher\n"
631 "VPN Route Distinguisher\n")
632{
633 int ret;
634 struct prefix_rd prd;
635
636 ret = str2prefix_rd (argv[0], &prd);
637 if (! ret)
638 {
639 vty_out (vty, "%% Malformed Route Distinguisher%s", VTY_NEWLINE);
640 return CMD_WARNING;
641 }
642 return bgp_show_mpls_vpn (vty, AFI_IP6, &prd, bgp_show_type_normal, NULL, 0);
643}
644
645
646DEFUN (show_bgp_ipv4_vpn_tags,
647 show_bgp_ipv4_vpn_tags_cmd,
648 "show bgp ipv4 vpn tags",
649 SHOW_STR
650 BGP_STR
651 "Address Family\n"
652 "Display VPN NLRI specific information\n"
paul718e3742002-12-13 20:15:29 +0000653 "Display BGP tags for prefixes\n")
654{
Lou Berger35c36862016-01-12 13:42:06 -0500655 return bgp_show_mpls_vpn (vty, AFI_IP, NULL, bgp_show_type_normal, NULL, 1);
656}
657DEFUN (show_bgp_ipv6_vpn_tags,
658 show_bgp_ipv6_vpn_tags_cmd,
659 "show bgp ipv6 vpn tags",
660 SHOW_STR
661 BGP_STR
662 "Address Family\n"
663 "Display VPN NLRI specific information\n"
664 "Display BGP tags for prefixes\n")
665{
666 return bgp_show_mpls_vpn (vty, AFI_IP6, NULL, bgp_show_type_normal, NULL, 1);
paul718e3742002-12-13 20:15:29 +0000667}
668
Lou Berger35c36862016-01-12 13:42:06 -0500669DEFUN (show_bgp_ipv4_vpn_rd_tags,
670 show_bgp_ipv4_vpn_rd_tags_cmd,
671 "show bgp ipv4 vpn rd ASN:nn_or_IP-address:nn tags",
paul718e3742002-12-13 20:15:29 +0000672 SHOW_STR
paul718e3742002-12-13 20:15:29 +0000673 BGP_STR
Lou Berger35c36862016-01-12 13:42:06 -0500674 "Address Family\n"
675 "Display VPN NLRI specific information\n"
paul718e3742002-12-13 20:15:29 +0000676 "Display information for a route distinguisher\n"
677 "VPN Route Distinguisher\n"
678 "Display BGP tags for prefixes\n")
679{
680 int ret;
681 struct prefix_rd prd;
682
683 ret = str2prefix_rd (argv[0], &prd);
684 if (! ret)
685 {
686 vty_out (vty, "%% Malformed Route Distinguisher%s", VTY_NEWLINE);
687 return CMD_WARNING;
688 }
Lou Berger35c36862016-01-12 13:42:06 -0500689 return bgp_show_mpls_vpn (vty, AFI_IP, &prd, bgp_show_type_normal, NULL, 1);
690}
691DEFUN (show_bgp_ipv6_vpn_rd_tags,
692 show_bgp_ipv6_vpn_rd_tags_cmd,
693 "show bgp ipv6 vpn rd ASN:nn_or_IP-address:nn tags",
694 SHOW_STR
695 BGP_STR
696 "Address Family\n"
697 "Display VPN NLRI specific information\n"
698 "Display information for a route distinguisher\n"
699 "VPN Route Distinguisher\n"
700 "Display BGP tags for prefixes\n")
701{
702 int ret;
703 struct prefix_rd prd;
704
705 ret = str2prefix_rd (argv[0], &prd);
706 if (! ret)
707 {
708 vty_out (vty, "%% Malformed Route Distinguisher%s", VTY_NEWLINE);
709 return CMD_WARNING;
710 }
711 return bgp_show_mpls_vpn (vty, AFI_IP6, &prd, bgp_show_type_normal, NULL, 1);
paul718e3742002-12-13 20:15:29 +0000712}
713
Lou Berger35c36862016-01-12 13:42:06 -0500714DEFUN (show_bgp_ipv4_vpn_neighbor_routes,
715 show_bgp_ipv4_vpn_neighbor_routes_cmd,
716 "show bgp ipv4 vpn neighbors (A.B.C.D|X:X::X:X) routes",
paul718e3742002-12-13 20:15:29 +0000717 SHOW_STR
paul718e3742002-12-13 20:15:29 +0000718 BGP_STR
Lou Berger35c36862016-01-12 13:42:06 -0500719 "Address Family\n"
720 "Display VPN NLRI specific information\n"
paul718e3742002-12-13 20:15:29 +0000721 "Detailed information on TCP and BGP neighbor connections\n"
722 "Neighbor to display information about\n"
Lou Berger35c36862016-01-12 13:42:06 -0500723 "Neighbor to display information about\n"
paul718e3742002-12-13 20:15:29 +0000724 "Display routes learned from neighbor\n")
725{
Jorge Boncompte [DTI2]c63b83f2012-04-10 16:57:24 +0200726 union sockunion su;
paul718e3742002-12-13 20:15:29 +0000727 struct peer *peer;
Jorge Boncompte [DTI2]c63b83f2012-04-10 16:57:24 +0200728 int ret;
729
730 ret = str2sockunion (argv[0], &su);
731 if (ret < 0)
paul718e3742002-12-13 20:15:29 +0000732 {
733 vty_out (vty, "Malformed address: %s%s", argv[0], VTY_NEWLINE);
Jorge Boncompte [DTI2]c63b83f2012-04-10 16:57:24 +0200734 return CMD_WARNING;
paul718e3742002-12-13 20:15:29 +0000735 }
736
Jorge Boncompte [DTI2]c63b83f2012-04-10 16:57:24 +0200737 peer = peer_lookup (NULL, &su);
paul718e3742002-12-13 20:15:29 +0000738 if (! peer || ! peer->afc[AFI_IP][SAFI_MPLS_VPN])
739 {
740 vty_out (vty, "%% No such neighbor or address family%s", VTY_NEWLINE);
741 return CMD_WARNING;
742 }
743
Lou Berger35c36862016-01-12 13:42:06 -0500744 return bgp_show_mpls_vpn (vty, AFI_IP, NULL, bgp_show_type_neighbor, &su, 0);
paul718e3742002-12-13 20:15:29 +0000745}
746
Lou Berger35c36862016-01-12 13:42:06 -0500747#ifdef HAVE_IPV6
748DEFUN (show_bgp_ipv6_vpn_neighbor_routes,
749 show_bgp_ipv6_vpn_neighbor_routes_cmd,
750 "show bgp ipv6 vpn neighbors (A.B.C.D|X:X::X:X) routes",
paul718e3742002-12-13 20:15:29 +0000751 SHOW_STR
paul718e3742002-12-13 20:15:29 +0000752 BGP_STR
Lou Berger35c36862016-01-12 13:42:06 -0500753 "Address Family\n"
754 "Display VPN NLRI specific information\n"
paul718e3742002-12-13 20:15:29 +0000755 "Detailed information on TCP and BGP neighbor connections\n"
756 "Neighbor to display information about\n"
Lou Berger35c36862016-01-12 13:42:06 -0500757 "Neighbor to display information about\n"
paul718e3742002-12-13 20:15:29 +0000758 "Display routes learned from neighbor\n")
759{
Jorge Boncompte [DTI2]c63b83f2012-04-10 16:57:24 +0200760 union sockunion su;
paul718e3742002-12-13 20:15:29 +0000761 struct peer *peer;
paul718e3742002-12-13 20:15:29 +0000762
Lou Berger35c36862016-01-12 13:42:06 -0500763 int ret;
paul718e3742002-12-13 20:15:29 +0000764
Lou Berger35c36862016-01-12 13:42:06 -0500765 ret = str2sockunion (argv[0], &su);
Jorge Boncompte [DTI2]c63b83f2012-04-10 16:57:24 +0200766 if (ret < 0)
paul718e3742002-12-13 20:15:29 +0000767 {
768 vty_out (vty, "Malformed address: %s%s", argv[0], VTY_NEWLINE);
Jorge Boncompte [DTI2]c63b83f2012-04-10 16:57:24 +0200769 return CMD_WARNING;
paul718e3742002-12-13 20:15:29 +0000770 }
771
Jorge Boncompte [DTI2]c63b83f2012-04-10 16:57:24 +0200772 peer = peer_lookup (NULL, &su);
Lou Berger35c36862016-01-12 13:42:06 -0500773 if (! peer || ! peer->afc[AFI_IP6][SAFI_MPLS_VPN])
paul718e3742002-12-13 20:15:29 +0000774 {
775 vty_out (vty, "%% No such neighbor or address family%s", VTY_NEWLINE);
776 return CMD_WARNING;
777 }
778
Lou Berger35c36862016-01-12 13:42:06 -0500779 return bgp_show_mpls_vpn (vty, AFI_IP6, NULL, bgp_show_type_neighbor, &su, 0);
paul718e3742002-12-13 20:15:29 +0000780}
Lou Berger35c36862016-01-12 13:42:06 -0500781#endif
paul718e3742002-12-13 20:15:29 +0000782
Lou Berger35c36862016-01-12 13:42:06 -0500783DEFUN (show_bgp_ipv4_vpn_neighbor_advertised_routes,
784 show_bgp_ipv4_vpn_neighbor_advertised_routes_cmd,
785 "show bgp ipv4 vpn neighbors (A.B.C.D|X:X::X:X) advertised-routes",
paul718e3742002-12-13 20:15:29 +0000786 SHOW_STR
paul718e3742002-12-13 20:15:29 +0000787 BGP_STR
Lou Berger35c36862016-01-12 13:42:06 -0500788 "Address Family\n"
789 "Display VPN NLRI specific information\n"
paul718e3742002-12-13 20:15:29 +0000790 "Detailed information on TCP and BGP neighbor connections\n"
791 "Neighbor to display information about\n"
792 "Display the routes advertised to a BGP neighbor\n")
793{
794 int ret;
795 struct peer *peer;
796 union sockunion su;
797
798 ret = str2sockunion (argv[0], &su);
799 if (ret < 0)
800 {
801 vty_out (vty, "%% Malformed address: %s%s", argv[0], VTY_NEWLINE);
802 return CMD_WARNING;
803 }
804 peer = peer_lookup (NULL, &su);
805 if (! peer || ! peer->afc[AFI_IP][SAFI_MPLS_VPN])
806 {
807 vty_out (vty, "%% No such neighbor or address family%s", VTY_NEWLINE);
808 return CMD_WARNING;
809 }
810
811 return show_adj_route_vpn (vty, peer, NULL);
812}
Lou Berger35c36862016-01-12 13:42:06 -0500813DEFUN (show_bgp_ipv6_vpn_neighbor_advertised_routes,
814 show_bgp_ipv6_vpn_neighbor_advertised_routes_cmd,
815 "show bgp ipv6 vpn neighbors (A.B.C.D|X:X::X:X) advertised-routes",
816 SHOW_STR
817 BGP_STR
818 "Address Family\n"
819 "Display VPN NLRI specific information\n"
820 "Detailed information on TCP and BGP neighbor connections\n"
821 "Neighbor to display information about\n"
822 "Display the routes advertised to a BGP neighbor\n")
823{
824 int ret;
825 struct peer *peer;
826 union sockunion su;
827
828 ret = str2sockunion (argv[0], &su);
829 if (ret < 0)
830 {
831 vty_out (vty, "%% Malformed address: %s%s", argv[0], VTY_NEWLINE);
832 return CMD_WARNING;
833 }
834 peer = peer_lookup (NULL, &su);
835 if (! peer || ! peer->afc[AFI_IP6][SAFI_MPLS_VPN])
836 {
837 vty_out (vty, "%% No such neighbor or address family%s", VTY_NEWLINE);
838 return CMD_WARNING;
839 }
840
841 return show_adj_route_vpn (vty, peer, NULL);
842}
paul718e3742002-12-13 20:15:29 +0000843
844DEFUN (show_ip_bgp_vpnv4_rd_neighbor_advertised_routes,
Lou Berger35c36862016-01-12 13:42:06 -0500845 show_bgp_ipv4_vpn_rd_neighbor_advertised_routes_cmd,
846 "show bgp ipv4 vpn rd ASN:nn_or_IP-address:nn neighbors (A.B.C.D|X:X::X:X) advertised-routes",
paul718e3742002-12-13 20:15:29 +0000847 SHOW_STR
paul718e3742002-12-13 20:15:29 +0000848 BGP_STR
Lou Berger35c36862016-01-12 13:42:06 -0500849 "Address Family\n"
850 "Display VPN NLRI specific information\n"
paul718e3742002-12-13 20:15:29 +0000851 "Display information for a route distinguisher\n"
852 "VPN Route Distinguisher\n"
853 "Detailed information on TCP and BGP neighbor connections\n"
854 "Neighbor to display information about\n"
Lou Berger35c36862016-01-12 13:42:06 -0500855 "Neighbor to display information about\n"
paul718e3742002-12-13 20:15:29 +0000856 "Display the routes advertised to a BGP neighbor\n")
857{
858 int ret;
859 struct peer *peer;
860 struct prefix_rd prd;
861 union sockunion su;
paul718e3742002-12-13 20:15:29 +0000862 ret = str2sockunion (argv[1], &su);
863 if (ret < 0)
864 {
Lou Berger35c36862016-01-12 13:42:06 -0500865 vty_out (vty, "%% Malformed address: %s%s", argv[1], VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +0000866 return CMD_WARNING;
867 }
868 peer = peer_lookup (NULL, &su);
869 if (! peer || ! peer->afc[AFI_IP][SAFI_MPLS_VPN])
870 {
871 vty_out (vty, "%% No such neighbor or address family%s", VTY_NEWLINE);
872 return CMD_WARNING;
873 }
874
875 ret = str2prefix_rd (argv[0], &prd);
876 if (! ret)
877 {
878 vty_out (vty, "%% Malformed Route Distinguisher%s", VTY_NEWLINE);
879 return CMD_WARNING;
880 }
881
882 return show_adj_route_vpn (vty, peer, &prd);
883}
Lou Berger35c36862016-01-12 13:42:06 -0500884DEFUN (show_ip_bgp_vpnv6_rd_neighbor_advertised_routes,
885 show_bgp_ipv6_vpn_rd_neighbor_advertised_routes_cmd,
886 "show bgp ipv6 vpn rd ASN:nn_or_IP-address:nn neighbors (A.B.C.D|X:X::X:X) advertised-routes",
887 SHOW_STR
888 BGP_STR
889 "Address Family\n"
890 "Display VPN NLRI specific information\n"
891 "Display information for a route distinguisher\n"
892 "VPN Route Distinguisher\n"
893 "Detailed information on TCP and BGP neighbor connections\n"
894 "Neighbor to display information about\n"
895 "Neighbor to display information about\n"
896 "Display the routes advertised to a BGP neighbor\n")
897{
898 int ret;
899 struct peer *peer;
900 struct prefix_rd prd;
901 union sockunion su;
902 ret = str2sockunion (argv[1], &su);
903 if (ret < 0)
904 {
905 vty_out (vty, "%% Malformed address: %s%s", argv[1], VTY_NEWLINE);
906 return CMD_WARNING;
907 }
908 peer = peer_lookup (NULL, &su);
909 if (! peer || ! peer->afc[AFI_IP6][SAFI_MPLS_VPN])
910 {
911 vty_out (vty, "%% No such neighbor or address family%s", VTY_NEWLINE);
912 return CMD_WARNING;
913 }
914
915 ret = str2prefix_rd (argv[0], &prd);
916 if (! ret)
917 {
918 vty_out (vty, "%% Malformed Route Distinguisher%s", VTY_NEWLINE);
919 return CMD_WARNING;
920 }
921
922 return show_adj_route_vpn (vty, peer, &prd);
923}
924
925DEFUN (show_bgp_ipv4_vpn_rd_neighbor_routes,
926 show_bgp_ipv4_vpn_rd_neighbor_routes_cmd,
927 "show bgp ipv4 vpn rd ASN:nn_or_IP-address:nn neighbors (A.B.C.D|X:X::X:X) routes",
928 SHOW_STR
929 BGP_STR
930 "Address Family\n"
931 "Address Family modifier\n"
932 "Display information for a route distinguisher\n"
933 "VPN Route Distinguisher\n"
934 "Detailed information on TCP and BGP neighbor connections\n"
935 "Neighbor to display information about\n"
936 "Display routes learned from neighbor\n")
937{
938 int ret;
939 union sockunion *su;
940 struct peer *peer;
941 struct prefix_rd prd;
942
943 ret = str2prefix_rd (argv[0], &prd);
944 if (! ret)
945 {
946 vty_out (vty, "%% Malformed Route Distinguisher%s", VTY_NEWLINE);
947 return CMD_WARNING;
948 }
949
950 su = sockunion_str2su (argv[1]);
951 if (su == NULL)
952 {
953 vty_out (vty, "Malformed address: %s%s", argv[1], VTY_NEWLINE);
954 return CMD_WARNING;
955 }
956
957 peer = peer_lookup (NULL, su);
958 if (! peer || ! peer->afc[AFI_IP][SAFI_MPLS_VPN])
959 {
960 vty_out (vty, "%% No such neighbor or address family%s", VTY_NEWLINE);
961 return CMD_WARNING;
962 }
963
964 return bgp_show_mpls_vpn (vty, AFI_IP, &prd, bgp_show_type_neighbor, su, 0);
965}
966DEFUN (show_bgp_ipv6_vpn_rd_neighbor_routes,
967 show_bgp_ipv6_vpn_rd_neighbor_routes_cmd,
968 "show bgp ipv6 vpn rd ASN:nn_or_IP-address:nn neighbors (A.B.C.D|X:X::X:X) routes",
969 SHOW_STR
970 BGP_STR
971 "Address Family\n"
972 "Address Family modifier\n"
973 "Display information for a route distinguisher\n"
974 "VPN Route Distinguisher\n"
975 "Detailed information on TCP and BGP neighbor connections\n"
976 "Neighbor to display information about\n"
977 "Display routes learned from neighbor\n")
978{
979 int ret;
980 union sockunion *su;
981 struct peer *peer;
982 struct prefix_rd prd;
983
984 ret = str2prefix_rd (argv[0], &prd);
985 if (! ret)
986 {
987 vty_out (vty, "%% Malformed Route Distinguisher%s", VTY_NEWLINE);
988 return CMD_WARNING;
989 }
990
991 su = sockunion_str2su (argv[1]);
992 if (su == NULL)
993 {
994 vty_out (vty, "Malformed address: %s%s", argv[1], VTY_NEWLINE);
995 return CMD_WARNING;
996 }
997
998 peer = peer_lookup (NULL, su);
999 if (! peer || ! peer->afc[AFI_IP6][SAFI_MPLS_VPN])
1000 {
1001 vty_out (vty, "%% No such neighbor or address family%s", VTY_NEWLINE);
1002 return CMD_WARNING;
1003 }
1004
1005 return bgp_show_mpls_vpn (vty, AFI_IP6, &prd, bgp_show_type_neighbor, su, 0);
1006}
paul718e3742002-12-13 20:15:29 +00001007
1008void
paul94f2b392005-06-28 12:44:16 +00001009bgp_mplsvpn_init (void)
paul718e3742002-12-13 20:15:29 +00001010{
1011 install_element (BGP_VPNV4_NODE, &vpnv4_network_cmd);
Lou Bergera76d9ca2016-01-12 13:41:53 -05001012 install_element (BGP_VPNV4_NODE, &vpnv4_network_route_map_cmd);
paul718e3742002-12-13 20:15:29 +00001013 install_element (BGP_VPNV4_NODE, &no_vpnv4_network_cmd);
1014
Lou Berger35c36862016-01-12 13:42:06 -05001015 install_element (VIEW_NODE, &show_bgp_ipv4_vpn_cmd);
1016 install_element (VIEW_NODE, &show_bgp_ipv4_vpn_rd_cmd);
1017 install_element (VIEW_NODE, &show_bgp_ipv4_vpn_tags_cmd);
1018 install_element (VIEW_NODE, &show_bgp_ipv4_vpn_rd_tags_cmd);
1019 install_element (VIEW_NODE, &show_bgp_ipv4_vpn_neighbor_routes_cmd);
1020 install_element (VIEW_NODE, &show_bgp_ipv4_vpn_neighbor_advertised_routes_cmd);
1021 install_element (VIEW_NODE, &show_bgp_ipv4_vpn_rd_neighbor_advertised_routes_cmd);
1022 install_element (VIEW_NODE, &show_bgp_ipv4_vpn_rd_neighbor_routes_cmd);
paul718e3742002-12-13 20:15:29 +00001023
Lou Berger35c36862016-01-12 13:42:06 -05001024#ifdef HAVE_IPV6
1025 install_element (VIEW_NODE, &show_bgp_ipv6_vpn_cmd);
1026 install_element (VIEW_NODE, &show_bgp_ipv6_vpn_rd_cmd);
1027 install_element (VIEW_NODE, &show_bgp_ipv6_vpn_tags_cmd);
1028 install_element (VIEW_NODE, &show_bgp_ipv6_vpn_rd_tags_cmd);
1029 install_element (VIEW_NODE, &show_bgp_ipv6_vpn_neighbor_routes_cmd);
1030 install_element (VIEW_NODE, &show_bgp_ipv6_vpn_neighbor_advertised_routes_cmd);
1031 install_element (VIEW_NODE, &show_bgp_ipv6_vpn_rd_neighbor_advertised_routes_cmd);
1032 install_element (VIEW_NODE, &show_bgp_ipv6_vpn_rd_neighbor_routes_cmd);
1033#endif
paul718e3742002-12-13 20:15:29 +00001034
Lou Berger35c36862016-01-12 13:42:06 -05001035 install_element (ENABLE_NODE, &show_bgp_ipv4_vpn_cmd);
1036 install_element (ENABLE_NODE, &show_bgp_ipv4_vpn_rd_cmd);
1037 install_element (ENABLE_NODE, &show_bgp_ipv4_vpn_tags_cmd);
1038 install_element (ENABLE_NODE, &show_bgp_ipv4_vpn_rd_tags_cmd);
1039 install_element (ENABLE_NODE, &show_bgp_ipv4_vpn_neighbor_routes_cmd);
1040 install_element (ENABLE_NODE, &show_bgp_ipv4_vpn_neighbor_advertised_routes_cmd);
1041 install_element (ENABLE_NODE, &show_bgp_ipv4_vpn_rd_neighbor_advertised_routes_cmd);
1042 install_element (ENABLE_NODE, &show_bgp_ipv4_vpn_rd_neighbor_routes_cmd);
1043
1044#ifdef HAVE_IPV6
1045 install_element (ENABLE_NODE, &show_bgp_ipv6_vpn_cmd);
1046 install_element (ENABLE_NODE, &show_bgp_ipv6_vpn_rd_cmd);
1047 install_element (ENABLE_NODE, &show_bgp_ipv6_vpn_tags_cmd);
1048 install_element (ENABLE_NODE, &show_bgp_ipv6_vpn_rd_tags_cmd);
1049 install_element (ENABLE_NODE, &show_bgp_ipv6_vpn_neighbor_routes_cmd);
1050 install_element (ENABLE_NODE, &show_bgp_ipv6_vpn_neighbor_advertised_routes_cmd);
1051 install_element (ENABLE_NODE, &show_bgp_ipv6_vpn_rd_neighbor_advertised_routes_cmd);
1052 install_element (ENABLE_NODE, &show_bgp_ipv6_vpn_rd_neighbor_routes_cmd);
1053#endif
paul718e3742002-12-13 20:15:29 +00001054}