2 * Copyright (C) 2000 Kunihiro Ishiguro <kunihiro@zebra.org>
4 * This file is part of GNU Zebra.
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
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.
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
32 #include "bgpd/bgpd.h"
33 #include "bgpd/bgp_table.h"
34 #include "bgpd/bgp_route.h"
35 #include "bgpd/bgp_attr.h"
36 #include "bgpd/bgp_label.h"
37 #include "bgpd/bgp_mplsvpn.h"
38 #include "bgpd/bgp_packet.h"
39 #include "bgpd/bgp_vty.h"
40 #include "bgpd/bgp_vpn.h"
43 #include "bgpd/rfapi/rfapi_backend.h"
46 extern int argv_find_and_parse_vpnvx(struct cmd_token
**argv
, int argc
,
47 int *index
, afi_t
*afi
)
50 if (argv_find(argv
, argc
, "vpnv4", index
)) {
54 } else if (argv_find(argv
, argc
, "vpnv6", index
)) {
62 u_int32_t
decode_label(mpls_label_t
*label_pnt
)
65 u_char
*pnt
= (u_char
*)label_pnt
;
67 l
= ((u_int32_t
)*pnt
++ << 12);
68 l
|= (u_int32_t
)*pnt
++ << 4;
69 l
|= (u_int32_t
)((*pnt
& 0xf0) >> 4);
73 void encode_label(mpls_label_t label
, mpls_label_t
*label_pnt
)
75 u_char
*pnt
= (u_char
*)label_pnt
;
78 *pnt
++ = (label
>> 12) & 0xff;
79 *pnt
++ = (label
>> 4) & 0xff;
80 *pnt
++ = ((label
<< 4) + 1) & 0xff; /* S=1 */
83 int bgp_nlri_parse_vpn(struct peer
*peer
, struct attr
*attr
,
84 struct bgp_nlri
*packet
)
101 /* Check peer status. */
102 if (peer
->status
!= Established
)
106 prd
.family
= AF_UNSPEC
;
110 lim
= pnt
+ packet
->length
;
116 (CHECK_FLAG(peer
->af_cap
[afi
][safi
], PEER_CAP_ADDPATH_AF_RX_ADV
)
117 && CHECK_FLAG(peer
->af_cap
[afi
][safi
],
118 PEER_CAP_ADDPATH_AF_TX_RCV
));
120 #define VPN_PREFIXLEN_MIN_BYTES (3 + 8) /* label + RD */
121 for (; pnt
< lim
; pnt
+= psize
) {
122 /* Clear prefix structure. */
123 memset(&p
, 0, sizeof(struct prefix
));
125 if (addpath_encoded
) {
127 /* When packet overflow occurs return immediately. */
128 if (pnt
+ BGP_ADDPATH_ID_LEN
> lim
)
131 addpath_id
= ntohl(*((uint32_t *)pnt
));
132 pnt
+= BGP_ADDPATH_ID_LEN
;
135 /* Fetch prefix length. */
137 p
.family
= afi2family(packet
->afi
);
138 psize
= PSIZE(prefixlen
);
140 if (prefixlen
< VPN_PREFIXLEN_MIN_BYTES
* 8) {
142 "%s [Error] Update packet error / VPN (prefix length %d less than VPN min length)",
143 peer
->host
, prefixlen
);
147 /* sanity check against packet data */
148 if ((pnt
+ psize
) > lim
) {
150 "%s [Error] Update packet error / VPN (prefix length %d exceeds packet size %u)",
151 peer
->host
, prefixlen
, (uint
)(lim
- pnt
));
155 /* sanity check against storage for the IP address portion */
156 if ((psize
- VPN_PREFIXLEN_MIN_BYTES
) > (ssize_t
)sizeof(p
.u
)) {
158 "%s [Error] Update packet error / VPN (psize %d exceeds storage size %zu)",
160 prefixlen
- VPN_PREFIXLEN_MIN_BYTES
* 8,
165 /* Sanity check against max bitlen of the address family */
166 if ((psize
- VPN_PREFIXLEN_MIN_BYTES
) > prefix_blen(&p
)) {
168 "%s [Error] Update packet error / VPN (psize %d exceeds family (%u) max byte len %u)",
170 prefixlen
- VPN_PREFIXLEN_MIN_BYTES
* 8,
171 p
.family
, prefix_blen(&p
));
175 /* Copy label to prefix. */
176 memcpy(&label
, pnt
, BGP_LABEL_BYTES
);
177 bgp_set_valid_label(&label
);
179 /* Copy routing distinguisher to rd. */
180 memcpy(&prd
.val
, pnt
+ BGP_LABEL_BYTES
, 8);
182 /* Decode RD type. */
183 type
= decode_rd_type(pnt
+ BGP_LABEL_BYTES
);
187 decode_rd_as(pnt
+ 5, &rd_as
);
191 decode_rd_as4(pnt
+ 5, &rd_as
);
195 decode_rd_ip(pnt
+ 5, &rd_ip
);
199 case RD_TYPE_VNC_ETH
:
204 zlog_err("Unknown RD type %d", type
);
205 break; /* just report */
210 - VPN_PREFIXLEN_MIN_BYTES
* 8; /* exclude label & RD */
211 memcpy(&p
.u
.prefix
, pnt
+ VPN_PREFIXLEN_MIN_BYTES
,
212 psize
- VPN_PREFIXLEN_MIN_BYTES
);
215 bgp_update(peer
, &p
, addpath_id
, attr
, packet
->afi
,
216 SAFI_MPLS_VPN
, ZEBRA_ROUTE_BGP
,
217 BGP_ROUTE_NORMAL
, &prd
, &label
, 0, NULL
);
219 bgp_withdraw(peer
, &p
, addpath_id
, attr
, packet
->afi
,
220 SAFI_MPLS_VPN
, ZEBRA_ROUTE_BGP
,
221 BGP_ROUTE_NORMAL
, &prd
, &label
, NULL
);
224 /* Packet length consistency check. */
227 "%s [Error] Update packet error / VPN (%zu data remaining after parsing)",
228 peer
->host
, lim
- pnt
);
233 #undef VPN_PREFIXLEN_MIN_BYTES
236 /* For testing purpose, static route of MPLS-VPN. */
237 DEFUN (vpnv4_network
,
239 "network A.B.C.D/M rd ASN:NN_OR_IP-ADDRESS:NN <tag|label> (0-1048575)",
240 "Specify a network to announce via BGP\n"
242 "Specify Route Distinguisher\n"
243 "VPN Route Distinguisher\n"
244 "VPN NLRI label (tag)\n"
245 "VPN NLRI label (tag)\n"
248 int idx_ipv4_prefixlen
= 1;
249 int idx_ext_community
= 3;
251 return bgp_static_set_safi(
252 AFI_IP
, SAFI_MPLS_VPN
, vty
, argv
[idx_ipv4_prefixlen
]->arg
,
253 argv
[idx_ext_community
]->arg
, argv
[idx_label
]->arg
, NULL
, 0,
254 NULL
, NULL
, NULL
, NULL
);
257 DEFUN (vpnv4_network_route_map
,
258 vpnv4_network_route_map_cmd
,
259 "network A.B.C.D/M rd ASN:NN_OR_IP-ADDRESS:NN <tag|label> (0-1048575) route-map WORD",
260 "Specify a network to announce via BGP\n"
262 "Specify Route Distinguisher\n"
263 "VPN Route Distinguisher\n"
264 "VPN NLRI label (tag)\n"
265 "VPN NLRI label (tag)\n"
270 int idx_ipv4_prefixlen
= 1;
271 int idx_ext_community
= 3;
274 return bgp_static_set_safi(
275 AFI_IP
, SAFI_MPLS_VPN
, vty
, argv
[idx_ipv4_prefixlen
]->arg
,
276 argv
[idx_ext_community
]->arg
, argv
[idx_label
]->arg
,
277 argv
[idx_word_2
]->arg
, 0, NULL
, NULL
, NULL
, NULL
);
280 /* For testing purpose, static route of MPLS-VPN. */
281 DEFUN (no_vpnv4_network
,
282 no_vpnv4_network_cmd
,
283 "no network A.B.C.D/M rd ASN:NN_OR_IP-ADDRESS:NN <tag|label> (0-1048575)",
285 "Specify a network to announce via BGP\n"
287 "Specify Route Distinguisher\n"
288 "VPN Route Distinguisher\n"
289 "VPN NLRI label (tag)\n"
290 "VPN NLRI label (tag)\n"
293 int idx_ipv4_prefixlen
= 2;
294 int idx_ext_community
= 4;
296 return bgp_static_unset_safi(AFI_IP
, SAFI_MPLS_VPN
, vty
,
297 argv
[idx_ipv4_prefixlen
]->arg
,
298 argv
[idx_ext_community
]->arg
,
299 argv
[idx_label
]->arg
, 0, NULL
, NULL
, NULL
);
302 DEFUN (vpnv6_network
,
304 "network X:X::X:X/M rd ASN:NN_OR_IP-ADDRESS:NN <tag|label> (0-1048575) [route-map WORD]",
305 "Specify a network to announce via BGP\n"
306 "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n"
307 "Specify Route Distinguisher\n"
308 "VPN Route Distinguisher\n"
309 "VPN NLRI label (tag)\n"
310 "VPN NLRI label (tag)\n"
315 int idx_ipv6_prefix
= 1;
316 int idx_ext_community
= 3;
320 return bgp_static_set_safi(
321 AFI_IP6
, SAFI_MPLS_VPN
, vty
, argv
[idx_ipv6_prefix
]->arg
,
322 argv
[idx_ext_community
]->arg
, argv
[idx_label
]->arg
,
323 argv
[idx_word_2
]->arg
, 0, NULL
, NULL
, NULL
, NULL
);
325 return bgp_static_set_safi(
326 AFI_IP6
, SAFI_MPLS_VPN
, vty
, argv
[idx_ipv6_prefix
]->arg
,
327 argv
[idx_ext_community
]->arg
, argv
[idx_label
]->arg
,
328 NULL
, 0, NULL
, NULL
, NULL
, NULL
);
331 /* For testing purpose, static route of MPLS-VPN. */
332 DEFUN (no_vpnv6_network
,
333 no_vpnv6_network_cmd
,
334 "no network X:X::X:X/M rd ASN:NN_OR_IP-ADDRESS:NN <tag|label> (0-1048575)",
336 "Specify a network to announce via BGP\n"
337 "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n"
338 "Specify Route Distinguisher\n"
339 "VPN Route Distinguisher\n"
340 "VPN NLRI label (tag)\n"
341 "VPN NLRI label (tag)\n"
344 int idx_ipv6_prefix
= 2;
345 int idx_ext_community
= 4;
347 return bgp_static_unset_safi(AFI_IP6
, SAFI_MPLS_VPN
, vty
,
348 argv
[idx_ipv6_prefix
]->arg
,
349 argv
[idx_ext_community
]->arg
,
350 argv
[idx_label
]->arg
, 0, NULL
, NULL
, NULL
);
353 int bgp_show_mpls_vpn(struct vty
*vty
, afi_t afi
, struct prefix_rd
*prd
,
354 enum bgp_show_type type
, void *output_arg
, int tags
,
358 struct bgp_table
*table
;
360 bgp
= bgp_get_default();
363 vty_out(vty
, "No BGP process is configured\n");
365 vty_out(vty
, "{}\n");
368 table
= bgp
->rib
[afi
][SAFI_MPLS_VPN
];
369 return bgp_show_table_rd(vty
, bgp
, SAFI_MPLS_VPN
,
370 table
, prd
, type
, output_arg
, use_json
);
373 DEFUN (show_bgp_ip_vpn_all_rd
,
374 show_bgp_ip_vpn_all_rd_cmd
,
375 "show bgp "BGP_AFI_CMD_STR
" vpn all [rd ASN:NN_OR_IP-ADDRESS:NN] [json]",
379 "Display VPN NLRI specific information\n"
380 "Display VPN NLRI specific information\n"
381 "Display information for a route distinguisher\n"
382 "VPN Route Distinguisher\n"
386 struct prefix_rd prd
;
390 if (argv_find_and_parse_afi(argv
, argc
, &idx
, &afi
)) {
391 if (argv_find(argv
, argc
, "rd", &idx
)) {
392 ret
= str2prefix_rd(argv
[idx
+1]->arg
, &prd
);
395 "%% Malformed Route Distinguisher\n");
398 return bgp_show_mpls_vpn(vty
, afi
, &prd
,
399 bgp_show_type_normal
, NULL
, 0,
400 use_json(argc
, argv
));
402 return bgp_show_mpls_vpn(vty
, afi
, NULL
,
403 bgp_show_type_normal
, NULL
, 0,
404 use_json(argc
, argv
));
410 ALIAS(show_bgp_ip_vpn_all_rd
,
411 show_bgp_ip_vpn_rd_cmd
,
412 "show bgp "BGP_AFI_CMD_STR
" vpn rd ASN:NN_OR_IP-ADDRESS:NN [json]",
416 "Display VPN NLRI specific information\n"
417 "Display information for a route distinguisher\n"
418 "VPN Route Distinguisher\n"
421 #ifdef KEEP_OLD_VPN_COMMANDS
422 DEFUN (show_ip_bgp_vpn_rd
,
423 show_ip_bgp_vpn_rd_cmd
,
424 "show ip bgp "BGP_AFI_CMD_STR
" vpn rd ASN:NN_OR_IP-ADDRESS:NN",
429 "Address Family modifier\n"
430 "Display information for a route distinguisher\n"
431 "VPN Route Distinguisher\n")
433 int idx_ext_community
= argc
- 1;
435 struct prefix_rd prd
;
439 if (argv_find_and_parse_vpnvx(argv
, argc
, &idx
, &afi
)) {
440 ret
= str2prefix_rd(argv
[idx_ext_community
]->arg
, &prd
);
442 vty_out(vty
, "%% Malformed Route Distinguisher\n");
445 return bgp_show_mpls_vpn(vty
, afi
, &prd
, bgp_show_type_normal
,
451 DEFUN (show_ip_bgp_vpn_all
,
452 show_ip_bgp_vpn_all_cmd
,
453 "show [ip] bgp <vpnv4|vpnv6>",
462 if (argv_find_and_parse_vpnvx(argv
, argc
, &idx
, &afi
))
463 return bgp_show_mpls_vpn(vty
, afi
, NULL
, bgp_show_type_normal
,
468 DEFUN (show_ip_bgp_vpn_all_tags
,
469 show_ip_bgp_vpn_all_tags_cmd
,
470 "show [ip] bgp <vpnv4|vpnv6> all tags",
475 "Display information about all VPNv4/VPNV6 NLRIs\n"
476 "Display BGP tags for prefixes\n")
481 if (argv_find_and_parse_vpnvx(argv
, argc
, &idx
, &afi
))
482 return bgp_show_mpls_vpn(vty
, afi
, NULL
, bgp_show_type_normal
,
487 DEFUN (show_ip_bgp_vpn_rd_tags
,
488 show_ip_bgp_vpn_rd_tags_cmd
,
489 "show [ip] bgp <vpnv4|vpnv6> rd ASN:NN_OR_IP-ADDRESS:NN tags",
494 "Display information for a route distinguisher\n"
495 "VPN Route Distinguisher\n"
496 "Display BGP tags for prefixes\n")
498 int idx_ext_community
= 5;
500 struct prefix_rd prd
;
504 if (argv_find_and_parse_vpnvx(argv
, argc
, &idx
, &afi
)) {
505 ret
= str2prefix_rd(argv
[idx_ext_community
]->arg
, &prd
);
507 vty_out(vty
, "%% Malformed Route Distinguisher\n");
510 return bgp_show_mpls_vpn(vty
, afi
, &prd
, bgp_show_type_normal
,
516 DEFUN (show_ip_bgp_vpn_all_neighbor_routes
,
517 show_ip_bgp_vpn_all_neighbor_routes_cmd
,
518 "show [ip] bgp <vpnv4|vpnv6> all neighbors A.B.C.D routes [json]",
523 "Display information about all VPNv4/VPNv6 NLRIs\n"
524 "Detailed information on TCP and BGP neighbor connections\n"
525 "Neighbor to display information about\n"
526 "Display routes learned from neighbor\n"
533 u_char uj
= use_json(argc
, argv
);
537 if (argv_find_and_parse_vpnvx(argv
, argc
, &idx
, &afi
)) {
538 ret
= str2sockunion(argv
[idx_ipv4
]->arg
, &su
);
541 json_object
*json_no
= NULL
;
542 json_no
= json_object_new_object();
543 json_object_string_add(json_no
, "warning",
544 "Malformed address");
546 json_object_to_json_string(json_no
));
547 json_object_free(json_no
);
549 vty_out(vty
, "Malformed address: %s\n",
550 argv
[idx_ipv4
]->arg
);
554 peer
= peer_lookup(NULL
, &su
);
555 if (!peer
|| !peer
->afc
[afi
][SAFI_MPLS_VPN
]) {
557 json_object
*json_no
= NULL
;
558 json_no
= json_object_new_object();
559 json_object_string_add(
561 "No such neighbor or address family");
563 json_object_to_json_string(json_no
));
564 json_object_free(json_no
);
567 "%% No such neighbor or address family\n");
571 return bgp_show_mpls_vpn(vty
, afi
, NULL
, bgp_show_type_neighbor
,
577 DEFUN (show_ip_bgp_vpn_rd_neighbor_routes
,
578 show_ip_bgp_vpn_rd_neighbor_routes_cmd
,
579 "show [ip] bgp <vpnv4|vpnv6> rd ASN:NN_OR_IP-ADDRESS:NN neighbors A.B.C.D routes [json]",
584 "Display information for a route distinguisher\n"
585 "VPN Route Distinguisher\n"
586 "Detailed information on TCP and BGP neighbor connections\n"
587 "Neighbor to display information about\n"
588 "Display routes learned from neighbor\n"
591 int idx_ext_community
= 5;
596 struct prefix_rd prd
;
597 u_char uj
= use_json(argc
, argv
);
601 if (argv_find_and_parse_vpnvx(argv
, argc
, &idx
, &afi
)) {
602 ret
= str2prefix_rd(argv
[idx_ext_community
]->arg
, &prd
);
605 json_object
*json_no
= NULL
;
606 json_no
= json_object_new_object();
607 json_object_string_add(
609 "Malformed Route Distinguisher");
611 json_object_to_json_string(json_no
));
612 json_object_free(json_no
);
615 "%% Malformed Route Distinguisher\n");
619 ret
= str2sockunion(argv
[idx_ipv4
]->arg
, &su
);
622 json_object
*json_no
= NULL
;
623 json_no
= json_object_new_object();
624 json_object_string_add(json_no
, "warning",
625 "Malformed address");
627 json_object_to_json_string(json_no
));
628 json_object_free(json_no
);
630 vty_out(vty
, "Malformed address: %s\n",
631 argv
[idx_ext_community
]->arg
);
635 peer
= peer_lookup(NULL
, &su
);
636 if (!peer
|| !peer
->afc
[afi
][SAFI_MPLS_VPN
]) {
638 json_object
*json_no
= NULL
;
639 json_no
= json_object_new_object();
640 json_object_string_add(
642 "No such neighbor or address family");
644 json_object_to_json_string(json_no
));
645 json_object_free(json_no
);
648 "%% No such neighbor or address family\n");
652 return bgp_show_mpls_vpn(vty
, afi
, &prd
, bgp_show_type_neighbor
,
658 DEFUN (show_ip_bgp_vpn_all_neighbor_advertised_routes
,
659 show_ip_bgp_vpn_all_neighbor_advertised_routes_cmd
,
660 "show [ip] bgp <vpnv4|vpnv6> all neighbors A.B.C.D advertised-routes [json]",
665 "Display information about all VPNv4/VPNv6 NLRIs\n"
666 "Detailed information on TCP and BGP neighbor connections\n"
667 "Neighbor to display information about\n"
668 "Display the routes advertised to a BGP neighbor\n"
675 u_char uj
= use_json(argc
, argv
);
679 if (argv_find_and_parse_vpnvx(argv
, argc
, &idx
, &afi
)) {
680 ret
= str2sockunion(argv
[idx_ipv4
]->arg
, &su
);
683 json_object
*json_no
= NULL
;
684 json_no
= json_object_new_object();
685 json_object_string_add(json_no
, "warning",
686 "Malformed address");
688 json_object_to_json_string(json_no
));
689 json_object_free(json_no
);
691 vty_out(vty
, "Malformed address: %s\n",
692 argv
[idx_ipv4
]->arg
);
695 peer
= peer_lookup(NULL
, &su
);
696 if (!peer
|| !peer
->afc
[afi
][SAFI_MPLS_VPN
]) {
698 json_object
*json_no
= NULL
;
699 json_no
= json_object_new_object();
700 json_object_string_add(
702 "No such neighbor or address family");
704 json_object_to_json_string(json_no
));
705 json_object_free(json_no
);
708 "%% No such neighbor or address family\n");
711 return show_adj_route_vpn(vty
, peer
, NULL
, AFI_IP
,
717 DEFUN (show_ip_bgp_vpn_rd_neighbor_advertised_routes
,
718 show_ip_bgp_vpn_rd_neighbor_advertised_routes_cmd
,
719 "show [ip] bgp <vpnv4|vpnv6> rd ASN:NN_OR_IP-ADDRESS:NN neighbors A.B.C.D advertised-routes [json]",
724 "Display information for a route distinguisher\n"
725 "VPN Route Distinguisher\n"
726 "Detailed information on TCP and BGP neighbor connections\n"
727 "Neighbor to display information about\n"
728 "Display the routes advertised to a BGP neighbor\n"
731 int idx_ext_community
= 5;
735 struct prefix_rd prd
;
737 u_char uj
= use_json(argc
, argv
);
741 if (argv_find_and_parse_vpnvx(argv
, argc
, &idx
, &afi
)) {
742 ret
= str2sockunion(argv
[idx_ipv4
]->arg
, &su
);
745 json_object
*json_no
= NULL
;
746 json_no
= json_object_new_object();
747 json_object_string_add(json_no
, "warning",
748 "Malformed address");
750 json_object_to_json_string(json_no
));
751 json_object_free(json_no
);
753 vty_out(vty
, "Malformed address: %s\n",
754 argv
[idx_ext_community
]->arg
);
757 peer
= peer_lookup(NULL
, &su
);
758 if (!peer
|| !peer
->afc
[afi
][SAFI_MPLS_VPN
]) {
760 json_object
*json_no
= NULL
;
761 json_no
= json_object_new_object();
762 json_object_string_add(
764 "No such neighbor or address family");
766 json_object_to_json_string(json_no
));
767 json_object_free(json_no
);
770 "%% No such neighbor or address family\n");
774 ret
= str2prefix_rd(argv
[idx_ext_community
]->arg
, &prd
);
777 json_object
*json_no
= NULL
;
778 json_no
= json_object_new_object();
779 json_object_string_add(
781 "Malformed Route Distinguisher");
783 json_object_to_json_string(json_no
));
784 json_object_free(json_no
);
787 "%% Malformed Route Distinguisher\n");
791 return show_adj_route_vpn(vty
, peer
, &prd
, AFI_IP
,
796 #endif /* KEEP_OLD_VPN_COMMANDS */
798 void bgp_mplsvpn_init(void)
800 install_element(BGP_VPNV4_NODE
, &vpnv4_network_cmd
);
801 install_element(BGP_VPNV4_NODE
, &vpnv4_network_route_map_cmd
);
802 install_element(BGP_VPNV4_NODE
, &no_vpnv4_network_cmd
);
804 install_element(BGP_VPNV6_NODE
, &vpnv6_network_cmd
);
805 install_element(BGP_VPNV6_NODE
, &no_vpnv6_network_cmd
);
807 install_element(VIEW_NODE
, &show_bgp_ip_vpn_all_rd_cmd
);
808 install_element(VIEW_NODE
, &show_bgp_ip_vpn_rd_cmd
);
809 #ifdef KEEP_OLD_VPN_COMMANDS
810 install_element(VIEW_NODE
, &show_ip_bgp_vpn_rd_cmd
);
811 install_element(VIEW_NODE
, &show_ip_bgp_vpn_all_cmd
);
812 install_element(VIEW_NODE
, &show_ip_bgp_vpn_all_tags_cmd
);
813 install_element(VIEW_NODE
, &show_ip_bgp_vpn_rd_tags_cmd
);
814 install_element(VIEW_NODE
, &show_ip_bgp_vpn_all_neighbor_routes_cmd
);
815 install_element(VIEW_NODE
, &show_ip_bgp_vpn_rd_neighbor_routes_cmd
);
816 install_element(VIEW_NODE
,
817 &show_ip_bgp_vpn_all_neighbor_advertised_routes_cmd
);
818 install_element(VIEW_NODE
,
819 &show_ip_bgp_vpn_rd_neighbor_advertised_routes_cmd
);
820 #endif /* KEEP_OLD_VPN_COMMANDS */