Annotation of embedaddon/quagga/bgpd/bgp_mplsvpn.c, revision 1.1.1.4

1.1       misho       1: /* MPLS-VPN
                      2:    Copyright (C) 2000 Kunihiro Ishiguro <kunihiro@zebra.org>
                      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
                     17: along with GNU Zebra; see the file COPYING.  If not, write to the Free
                     18: Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
                     19: 02111-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"
1.1.1.4 ! misho      28: #include "filter.h"
1.1       misho      29: 
                     30: #include "bgpd/bgpd.h"
                     31: #include "bgpd/bgp_table.h"
                     32: #include "bgpd/bgp_route.h"
1.1.1.4 ! misho      33: #include "bgpd/bgp_packet.h"
1.1       misho      34: #include "bgpd/bgp_attr.h"
                     35: #include "bgpd/bgp_mplsvpn.h"
1.1.1.4 ! misho      36: #include "bgpd/bgp_packet.h"
1.1       misho      37: 
                     38: static u_int16_t
                     39: decode_rd_type (u_char *pnt)
                     40: {
                     41:   u_int16_t v;
                     42:   
                     43:   v = ((u_int16_t) *pnt++ << 8);
                     44:   v |= (u_int16_t) *pnt;
                     45:   return v;
                     46: }
                     47: 
                     48: u_int32_t
                     49: decode_label (u_char *pnt)
                     50: {
                     51:   u_int32_t l;
                     52: 
                     53:   l = ((u_int32_t) *pnt++ << 12);
                     54:   l |= (u_int32_t) *pnt++ << 4;
                     55:   l |= (u_int32_t) ((*pnt & 0xf0) >> 4);
                     56:   return l;
                     57: }
                     58: 
1.1.1.4 ! misho      59: /* type == RD_TYPE_AS */
1.1       misho      60: static void
                     61: decode_rd_as (u_char *pnt, struct rd_as *rd_as)
                     62: {
                     63:   rd_as->as = (u_int16_t) *pnt++ << 8;
                     64:   rd_as->as |= (u_int16_t) *pnt++;
                     65:   
                     66:   rd_as->val = ((u_int32_t) *pnt++ << 24);
                     67:   rd_as->val |= ((u_int32_t) *pnt++ << 16);
                     68:   rd_as->val |= ((u_int32_t) *pnt++ << 8);
                     69:   rd_as->val |= (u_int32_t) *pnt;
                     70: }
                     71: 
1.1.1.4 ! misho      72: /* type == RD_TYPE_AS4 */
        !            73: static void
        !            74: decode_rd_as4 (u_char *pnt, struct rd_as *rd_as)
        !            75: {
        !            76:   rd_as->as  = (u_int32_t) *pnt++ << 24;
        !            77:   rd_as->as |= (u_int32_t) *pnt++ << 16;
        !            78:   rd_as->as |= (u_int32_t) *pnt++ << 8;
        !            79:   rd_as->as |= (u_int32_t) *pnt++;
        !            80: 
        !            81:   rd_as->val  = ((u_int16_t) *pnt++ << 8);
        !            82:   rd_as->val |= (u_int16_t) *pnt;
        !            83: }
        !            84: 
        !            85: /* type == RD_TYPE_IP */
1.1       misho      86: static void
                     87: decode_rd_ip (u_char *pnt, struct rd_ip *rd_ip)
                     88: {
                     89:   memcpy (&rd_ip->ip, pnt, 4);
                     90:   pnt += 4;
                     91:   
                     92:   rd_ip->val = ((u_int16_t) *pnt++ << 8);
                     93:   rd_ip->val |= (u_int16_t) *pnt;
                     94: }
                     95: 
                     96: int
1.1.1.4 ! misho      97: bgp_nlri_parse_vpn (struct peer *peer, struct attr *attr, 
        !            98:                     struct bgp_nlri *packet)
1.1       misho      99: {
                    100:   u_char *pnt;
                    101:   u_char *lim;
                    102:   struct prefix p;
1.1.1.4 ! misho     103:   int psize = 0;
1.1       misho     104:   int prefixlen;
                    105:   u_int16_t type;
                    106:   struct rd_as rd_as;
                    107:   struct rd_ip rd_ip;
                    108:   struct prefix_rd prd;
                    109:   u_char *tagpnt;
                    110: 
                    111:   /* Check peer status. */
                    112:   if (peer->status != Established)
                    113:     return 0;
                    114:   
                    115:   /* Make prefix_rd */
                    116:   prd.family = AF_UNSPEC;
                    117:   prd.prefixlen = 64;
                    118: 
                    119:   pnt = packet->nlri;
                    120:   lim = pnt + packet->length;
                    121: 
1.1.1.4 ! misho     122: #define VPN_PREFIXLEN_MIN_BYTES (3 + 8) /* label + RD */
1.1       misho     123:   for (; pnt < lim; pnt += psize)
                    124:     {
                    125:       /* Clear prefix structure. */
                    126:       memset (&p, 0, sizeof (struct prefix));
                    127: 
                    128:       /* Fetch prefix length. */
                    129:       prefixlen = *pnt++;
1.1.1.4 ! misho     130:       p.family = afi2family (packet->afi);
1.1       misho     131:       psize = PSIZE (prefixlen);
1.1.1.4 ! misho     132:       
        !           133:       /* sanity check against packet data */
        !           134:       if (prefixlen < VPN_PREFIXLEN_MIN_BYTES*8)
        !           135:         {
        !           136:           plog_err (peer->log, 
        !           137:                     "%s [Error] Update packet error / VPNv4"
        !           138:                      " (prefix length %d less than VPNv4 min length)",
        !           139:                     peer->host, prefixlen);
        !           140:           return -1;
        !           141:         }
        !           142:       if ((pnt + psize) > lim)
        !           143:         {
        !           144:           plog_err (peer->log,
        !           145:                     "%s [Error] Update packet error / VPNv4"
        !           146:                     " (psize %u exceeds packet size (%u)",
        !           147:                     peer->host, 
        !           148:                     prefixlen, (uint)(lim-pnt));
        !           149:           return -1;
        !           150:         }
        !           151:       
        !           152:       /* sanity check against storage for the IP address portion */
        !           153:       if ((psize - VPN_PREFIXLEN_MIN_BYTES) > (ssize_t) sizeof(p.u))
        !           154:         {
        !           155:           plog_err (peer->log,
        !           156:                     "%s [Error] Update packet error / VPNv4"
        !           157:                     " (psize %u exceeds storage size (%zu)",
        !           158:                     peer->host,
        !           159:                     prefixlen - VPN_PREFIXLEN_MIN_BYTES*8, sizeof(p.u));
        !           160:           return -1;
        !           161:         }
        !           162:       
        !           163:       /* Sanity check against max bitlen of the address family */
        !           164:       if ((psize - VPN_PREFIXLEN_MIN_BYTES) > prefix_blen (&p))
        !           165:         {
        !           166:           plog_err (peer->log,
        !           167:                     "%s [Error] Update packet error / VPNv4"
        !           168:                     " (psize %u exceeds family (%u) max byte len %u)",
        !           169:                     peer->host,
        !           170:                     prefixlen - VPN_PREFIXLEN_MIN_BYTES*8, 
        !           171:                     p.family, prefix_blen (&p));
        !           172:           return -1;
        !           173:         }
        !           174:       
1.1       misho     175:       /* Copyr label to prefix. */
1.1.1.4 ! misho     176:       tagpnt = pnt;
1.1       misho     177: 
                    178:       /* Copy routing distinguisher to rd. */
                    179:       memcpy (&prd.val, pnt + 3, 8);
                    180: 
                    181:       /* Decode RD type. */
                    182:       type = decode_rd_type (pnt + 3);
                    183: 
1.1.1.4 ! misho     184:       switch (type)
        !           185:         {
        !           186:         case RD_TYPE_AS:
        !           187:           decode_rd_as (pnt + 5, &rd_as);
        !           188:           break;
        !           189: 
        !           190:         case RD_TYPE_AS4:
        !           191:           decode_rd_as4 (pnt + 5, &rd_as);
        !           192:           break;
        !           193: 
        !           194:         case RD_TYPE_IP:
        !           195:           decode_rd_ip (pnt + 5, &rd_ip);
        !           196:           break;
        !           197: 
        !           198:        default:
        !           199:          zlog_err ("Unknown RD type %d", type);
        !           200:           break;  /* just report */
        !           201:       }
        !           202: 
        !           203:       p.prefixlen = prefixlen - VPN_PREFIXLEN_MIN_BYTES*8;
        !           204:       memcpy (&p.u.prefix, pnt + VPN_PREFIXLEN_MIN_BYTES, 
        !           205:               psize - VPN_PREFIXLEN_MIN_BYTES);
1.1       misho     206: 
                    207:       if (attr)
1.1.1.4 ! misho     208:         bgp_update (peer, &p, attr, packet->afi, SAFI_MPLS_VPN,
        !           209:                     ZEBRA_ROUTE_BGP, BGP_ROUTE_NORMAL, &prd, tagpnt, 0);
1.1       misho     210:       else
1.1.1.4 ! misho     211:         bgp_withdraw (peer, &p, attr, packet->afi, SAFI_MPLS_VPN,
        !           212:                       ZEBRA_ROUTE_BGP, BGP_ROUTE_NORMAL, &prd, tagpnt);
1.1       misho     213:     }
                    214:   /* Packet length consistency check. */
                    215:   if (pnt != lim)
1.1.1.4 ! misho     216:     {
        !           217:       plog_err (peer->log,
        !           218:                 "%s [Error] Update packet error / VPNv4"
        !           219:                 " (%zu data remaining after parsing)",
        !           220:                 peer->host, lim - pnt);
        !           221:       return -1;
        !           222:     }
        !           223:   
1.1       misho     224:   return 0;
1.1.1.4 ! misho     225: #undef VPN_PREFIXLEN_MIN_BYTES
1.1       misho     226: }
                    227: 
                    228: int
                    229: str2prefix_rd (const char *str, struct prefix_rd *prd)
                    230: {
1.1.1.4 ! misho     231:   int ret; /* ret of called functions */
        !           232:   int lret; /* local ret, of this func */
1.1       misho     233:   char *p;
                    234:   char *p2;
1.1.1.4 ! misho     235:   struct stream *s = NULL;
        !           236:   char *half = NULL;
1.1       misho     237:   struct in_addr addr;
                    238: 
                    239:   s = stream_new (8);
                    240: 
                    241:   prd->family = AF_UNSPEC;
                    242:   prd->prefixlen = 64;
                    243: 
1.1.1.4 ! misho     244:   lret = 0;
1.1       misho     245:   p = strchr (str, ':');
                    246:   if (! p)
1.1.1.4 ! misho     247:     goto out;
1.1       misho     248: 
                    249:   if (! all_digit (p + 1))
1.1.1.4 ! misho     250:     goto out;
1.1       misho     251: 
                    252:   half = XMALLOC (MTYPE_TMP, (p - str) + 1);
                    253:   memcpy (half, str, (p - str));
                    254:   half[p - str] = '\0';
                    255: 
                    256:   p2 = strchr (str, '.');
                    257: 
                    258:   if (! p2)
                    259:     {
                    260:       if (! all_digit (half))
1.1.1.4 ! misho     261:         goto out;
        !           262:       
1.1       misho     263:       stream_putw (s, RD_TYPE_AS);
                    264:       stream_putw (s, atoi (half));
                    265:       stream_putl (s, atol (p + 1));
                    266:     }
                    267:   else
                    268:     {
                    269:       ret = inet_aton (half, &addr);
                    270:       if (! ret)
1.1.1.4 ! misho     271:         goto out;
        !           272:       
1.1       misho     273:       stream_putw (s, RD_TYPE_IP);
                    274:       stream_put_in_addr (s, &addr);
                    275:       stream_putw (s, atol (p + 1));
                    276:     }
                    277:   memcpy (prd->val, s->data, 8);
1.1.1.4 ! misho     278:   lret = 1;
1.1       misho     279: 
1.1.1.4 ! misho     280: out:
        !           281:   if (s)
        !           282:     stream_free (s);
        !           283:   if (half)
        !           284:     XFREE(MTYPE_TMP, half);
        !           285:   return lret;
1.1       misho     286: }
                    287: 
                    288: int
                    289: str2tag (const char *str, u_char *tag)
                    290: {
                    291:   unsigned long l;
                    292:   char *endptr;
                    293:   u_int32_t t;
                    294: 
1.1.1.2   misho     295:   if (*str == '-')
                    296:     return 0;
1.1       misho     297:   
1.1.1.2   misho     298:   errno = 0;
                    299:   l = strtoul (str, &endptr, 10);
                    300: 
                    301:   if (*endptr != '\0' || errno || l > UINT32_MAX)
1.1       misho     302:     return 0;
                    303: 
                    304:   t = (u_int32_t) l;
                    305:   
                    306:   tag[0] = (u_char)(t >> 12);
                    307:   tag[1] = (u_char)(t >> 4);
                    308:   tag[2] = (u_char)(t << 4);
                    309: 
                    310:   return 1;
                    311: }
                    312: 
                    313: char *
                    314: prefix_rd2str (struct prefix_rd *prd, char *buf, size_t size)
                    315: {
                    316:   u_char *pnt;
                    317:   u_int16_t type;
                    318:   struct rd_as rd_as;
                    319:   struct rd_ip rd_ip;
                    320: 
                    321:   if (size < RD_ADDRSTRLEN)
                    322:     return NULL;
                    323: 
                    324:   pnt = prd->val;
                    325: 
                    326:   type = decode_rd_type (pnt);
                    327: 
                    328:   if (type == RD_TYPE_AS)
                    329:     {
                    330:       decode_rd_as (pnt + 2, &rd_as);
                    331:       snprintf (buf, size, "%u:%d", rd_as.as, rd_as.val);
                    332:       return buf;
                    333:     }
1.1.1.4 ! misho     334:   else if (type == RD_TYPE_AS4)
        !           335:     {
        !           336:       decode_rd_as4 (pnt + 2, &rd_as);
        !           337:       snprintf (buf, size, "%u:%d", rd_as.as, rd_as.val);
        !           338:       return buf;
        !           339:     }
1.1       misho     340:   else if (type == RD_TYPE_IP)
                    341:     {
                    342:       decode_rd_ip (pnt + 2, &rd_ip);
                    343:       snprintf (buf, size, "%s:%d", inet_ntoa (rd_ip.ip), rd_ip.val);
                    344:       return buf;
                    345:     }
                    346:   return NULL;
                    347: }
                    348: 
                    349: /* For testing purpose, static route of MPLS-VPN. */
                    350: DEFUN (vpnv4_network,
                    351:        vpnv4_network_cmd,
                    352:        "network A.B.C.D/M rd ASN:nn_or_IP-address:nn tag WORD",
                    353:        "Specify a network to announce via BGP\n"
                    354:        "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
                    355:        "Specify Route Distinguisher\n"
                    356:        "VPN Route Distinguisher\n"
                    357:        "BGP tag\n"
                    358:        "tag value\n")
                    359: {
1.1.1.4 ! misho     360:   return bgp_static_set_safi (SAFI_MPLS_VPN, vty, argv[0], argv[1], argv[2], NULL);
        !           361: }
        !           362: 
        !           363: DEFUN (vpnv4_network_route_map,
        !           364:        vpnv4_network_route_map_cmd,
        !           365:        "network A.B.C.D/M rd ASN:nn_or_IP-address:nn tag WORD route-map WORD",
        !           366:        "Specify a network to announce via BGP\n"
        !           367:        "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
        !           368:        "Specify Route Distinguisher\n"
        !           369:        "VPN Route Distinguisher\n"
        !           370:        "BGP tag\n"
        !           371:        "tag value\n"
        !           372:        "route map\n"
        !           373:        "route map name\n")
        !           374: {
        !           375:   return bgp_static_set_safi (SAFI_MPLS_VPN, vty, argv[0], argv[1], argv[2], argv[3]);
1.1       misho     376: }
                    377: 
                    378: /* For testing purpose, static route of MPLS-VPN. */
                    379: DEFUN (no_vpnv4_network,
                    380:        no_vpnv4_network_cmd,
                    381:        "no network A.B.C.D/M rd ASN:nn_or_IP-address:nn tag WORD",
                    382:        NO_STR
                    383:        "Specify a network to announce via BGP\n"
                    384:        "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
                    385:        "Specify Route Distinguisher\n"
                    386:        "VPN Route Distinguisher\n"
                    387:        "BGP tag\n"
                    388:        "tag value\n")
                    389: {
1.1.1.4 ! misho     390:   return bgp_static_unset_safi (SAFI_MPLS_VPN, vty, argv[0], argv[1], argv[2]);
1.1       misho     391: }
                    392: 
                    393: static int
                    394: show_adj_route_vpn (struct vty *vty, struct peer *peer, struct prefix_rd *prd)
                    395: {
                    396:   struct bgp *bgp;
                    397:   struct bgp_table *table;
                    398:   struct bgp_node *rn;
                    399:   struct bgp_node *rm;
                    400:   struct attr *attr;
                    401:   int rd_header;
                    402:   int header = 1;
                    403:   char v4_header[] = "   Network          Next Hop            Metric LocPrf Weight Path%s";
                    404: 
                    405:   bgp = bgp_get_default ();
                    406:   if (bgp == NULL)
                    407:     {
                    408:       vty_out (vty, "No BGP process is configured%s", VTY_NEWLINE);
                    409:       return CMD_WARNING;
                    410:     }
                    411: 
                    412:   for (rn = bgp_table_top (bgp->rib[AFI_IP][SAFI_MPLS_VPN]); rn;
                    413:        rn = bgp_route_next (rn))
                    414:     {
                    415:       if (prd && memcmp (rn->p.u.val, prd->val, 8) != 0)
                    416:         continue;
                    417: 
                    418:       if ((table = rn->info) != NULL)
                    419:         {
                    420:           rd_header = 1;
                    421: 
                    422:           for (rm = bgp_table_top (table); rm; rm = bgp_route_next (rm))
                    423:             if ((attr = rm->info) != NULL)
                    424:               {
                    425:                 if (header)
                    426:                   {
                    427:                     vty_out (vty, "BGP table version is 0, local router ID is %s%s",
                    428:                              inet_ntoa (bgp->router_id), VTY_NEWLINE);
                    429:                     vty_out (vty, "Status codes: s suppressed, d damped, h history, * valid, > best, i - internal%s",
                    430:                              VTY_NEWLINE);
                    431:                     vty_out (vty, "Origin codes: i - IGP, e - EGP, ? - incomplete%s%s",
                    432:                              VTY_NEWLINE, VTY_NEWLINE);
                    433:                     vty_out (vty, v4_header, VTY_NEWLINE);
                    434:                     header = 0;
                    435:                   }
                    436: 
                    437:                 if (rd_header)
                    438:                   {
                    439:                     u_int16_t type;
                    440:                     struct rd_as rd_as;
                    441:                     struct rd_ip rd_ip;
                    442:                     u_char *pnt;
                    443: 
                    444:                     pnt = rn->p.u.val;
                    445: 
                    446:                     /* Decode RD type. */
                    447:                     type = decode_rd_type (pnt);
                    448:                     /* Decode RD value. */
                    449:                     if (type == RD_TYPE_AS)
                    450:                       decode_rd_as (pnt + 2, &rd_as);
1.1.1.4 ! misho     451:                     else if (type == RD_TYPE_AS4)
        !           452:                       decode_rd_as4 (pnt + 2, &rd_as);
1.1       misho     453:                     else if (type == RD_TYPE_IP)
                    454:                       decode_rd_ip (pnt + 2, &rd_ip);
                    455: 
                    456:                     vty_out (vty, "Route Distinguisher: ");
                    457: 
                    458:                     if (type == RD_TYPE_AS)
                    459:                       vty_out (vty, "%u:%d", rd_as.as, rd_as.val);
1.1.1.4 ! misho     460:                     else if (type == RD_TYPE_AS4)
        !           461:                       vty_out (vty, "%u:%d", rd_as.as, rd_as.val);
1.1       misho     462:                     else if (type == RD_TYPE_IP)
                    463:                       vty_out (vty, "%s:%d", inet_ntoa (rd_ip.ip), rd_ip.val);
                    464: 
                    465:                     vty_out (vty, "%s", VTY_NEWLINE);
                    466:                     rd_header = 0;
                    467:                   }
                    468:                 route_vty_out_tmp (vty, &rm->p, attr, SAFI_MPLS_VPN);
                    469:               }
                    470:         }
                    471:     }
                    472:   return CMD_SUCCESS;
                    473: }
                    474: 
                    475: enum bgp_show_type
                    476: {
                    477:   bgp_show_type_normal,
                    478:   bgp_show_type_regexp,
                    479:   bgp_show_type_prefix_list,
                    480:   bgp_show_type_filter_list,
                    481:   bgp_show_type_neighbor,
                    482:   bgp_show_type_cidr_only,
                    483:   bgp_show_type_prefix_longer,
                    484:   bgp_show_type_community_all,
                    485:   bgp_show_type_community,
                    486:   bgp_show_type_community_exact,
                    487:   bgp_show_type_community_list,
                    488:   bgp_show_type_community_list_exact
                    489: };
                    490: 
                    491: static int
1.1.1.4 ! misho     492: bgp_show_mpls_vpn(
        !           493:     struct vty *vty,
        !           494:     afi_t afi,
        !           495:     struct prefix_rd *prd,
        !           496:     enum bgp_show_type type,
        !           497:     void *output_arg,
        !           498:     int tags)
1.1       misho     499: {
                    500:   struct bgp *bgp;
                    501:   struct bgp_table *table;
                    502:   struct bgp_node *rn;
                    503:   struct bgp_node *rm;
                    504:   struct bgp_info *ri;
                    505:   int rd_header;
                    506:   int header = 1;
                    507:   char v4_header[] = "   Network          Next Hop            Metric LocPrf Weight Path%s";
                    508:   char v4_header_tag[] = "   Network          Next Hop      In tag/Out tag%s";
                    509: 
1.1.1.4 ! misho     510:   unsigned long output_count = 0;
        !           511:   unsigned long total_count  = 0;
        !           512: 
1.1       misho     513:   bgp = bgp_get_default ();
                    514:   if (bgp == NULL)
                    515:     {
                    516:       vty_out (vty, "No BGP process is configured%s", VTY_NEWLINE);
                    517:       return CMD_WARNING;
                    518:     }
                    519:   
1.1.1.4 ! misho     520:   if ((afi != AFI_IP) && (afi != AFI_IP6))
        !           521:     {
        !           522:       vty_out (vty, "Afi %d not supported%s", afi, VTY_NEWLINE);
        !           523:       return CMD_WARNING;
        !           524:     }
        !           525: 
        !           526:   for (rn = bgp_table_top (bgp->rib[afi][SAFI_MPLS_VPN]); rn; rn = bgp_route_next (rn))
1.1       misho     527:     {
                    528:       if (prd && memcmp (rn->p.u.val, prd->val, 8) != 0)
                    529:        continue;
                    530: 
                    531:       if ((table = rn->info) != NULL)
                    532:        {
                    533:          rd_header = 1;
                    534: 
                    535:          for (rm = bgp_table_top (table); rm; rm = bgp_route_next (rm))
                    536:            for (ri = rm->info; ri; ri = ri->next)
                    537:              {
1.1.1.4 ! misho     538:                 total_count++;
1.1       misho     539:                if (type == bgp_show_type_neighbor)
                    540:                  {
                    541:                    union sockunion *su = output_arg;
                    542: 
                    543:                    if (ri->peer->su_remote == NULL || ! sockunion_same(ri->peer->su_remote, su))
                    544:                      continue;
                    545:                  }
                    546:                if (header)
                    547:                  {
                    548:                    if (tags)
                    549:                      vty_out (vty, v4_header_tag, VTY_NEWLINE);
                    550:                    else
                    551:                      {
                    552:                        vty_out (vty, "BGP table version is 0, local router ID is %s%s",
                    553:                                 inet_ntoa (bgp->router_id), VTY_NEWLINE);
                    554:                        vty_out (vty, "Status codes: s suppressed, d damped, h history, * valid, > best, i - internal%s",
                    555:                                 VTY_NEWLINE);
                    556:                        vty_out (vty, "Origin codes: i - IGP, e - EGP, ? - incomplete%s%s",
                    557:                                 VTY_NEWLINE, VTY_NEWLINE);
                    558:                        vty_out (vty, v4_header, VTY_NEWLINE);
                    559:                      }
                    560:                    header = 0;
                    561:                  }
                    562: 
                    563:                if (rd_header)
                    564:                  {
                    565:                    u_int16_t type;
                    566:                    struct rd_as rd_as;
                    567:                    struct rd_ip rd_ip;
                    568:                    u_char *pnt;
                    569: 
                    570:                    pnt = rn->p.u.val;
                    571: 
                    572:                    /* Decode RD type. */
                    573:                    type = decode_rd_type (pnt);
                    574:                    /* Decode RD value. */
                    575:                    if (type == RD_TYPE_AS)
                    576:                      decode_rd_as (pnt + 2, &rd_as);
1.1.1.4 ! misho     577:                    else if (type == RD_TYPE_AS4)
        !           578:                      decode_rd_as4 (pnt + 2, &rd_as);
1.1       misho     579:                    else if (type == RD_TYPE_IP)
                    580:                      decode_rd_ip (pnt + 2, &rd_ip);
                    581: 
                    582:                    vty_out (vty, "Route Distinguisher: ");
                    583: 
                    584:                    if (type == RD_TYPE_AS)
1.1.1.4 ! misho     585:                      vty_out (vty, "as2 %u:%d", rd_as.as, rd_as.val);
        !           586:                    else if (type == RD_TYPE_AS4)
        !           587:                      vty_out (vty, "as4 %u:%d", rd_as.as, rd_as.val);
1.1       misho     588:                    else if (type == RD_TYPE_IP)
1.1.1.4 ! misho     589:                      vty_out (vty, "ip %s:%d", inet_ntoa (rd_ip.ip), rd_ip.val);
1.1       misho     590:                  
                    591:                    vty_out (vty, "%s", VTY_NEWLINE);             
                    592:                    rd_header = 0;
                    593:                  }
                    594:                if (tags)
                    595:                  route_vty_out_tag (vty, &rm->p, ri, 0, SAFI_MPLS_VPN);
                    596:                else
                    597:                  route_vty_out (vty, &rm->p, ri, 0, SAFI_MPLS_VPN);
1.1.1.4 ! misho     598:                 output_count++;
1.1       misho     599:              }
                    600:         }
                    601:     }
1.1.1.4 ! misho     602: 
        !           603:   if (output_count == 0)
        !           604:     {
        !           605:       vty_out (vty, "No prefixes displayed, %ld exist%s", total_count, VTY_NEWLINE);
        !           606:     }
        !           607:   else
        !           608:     vty_out (vty, "%sDisplayed %ld out of %ld total prefixes%s",
        !           609:             VTY_NEWLINE, output_count, total_count, VTY_NEWLINE);
        !           610: 
1.1       misho     611:   return CMD_SUCCESS;
                    612: }
                    613: 
1.1.1.4 ! misho     614: DEFUN (show_bgp_ipv4_vpn,
        !           615:        show_bgp_ipv4_vpn_cmd,
        !           616:        "show bgp ipv4 vpn",
1.1       misho     617:        SHOW_STR
                    618:        BGP_STR
1.1.1.4 ! misho     619:        "Address Family\n"
        !           620:        "Display VPN NLRI specific information\n")
1.1       misho     621: {
1.1.1.4 ! misho     622:   return bgp_show_mpls_vpn (vty, AFI_IP, NULL, bgp_show_type_normal, NULL, 0);
1.1       misho     623: }
                    624: 
1.1.1.4 ! misho     625: DEFUN (show_bgp_ipv6_vpn,
        !           626:        show_bgp_ipv6_vpn_cmd,
        !           627:        "show bgp ipv6 vpn",
1.1       misho     628:        SHOW_STR
                    629:        BGP_STR
1.1.1.4 ! misho     630:        "Address Family\n"
        !           631:        "Display VPN NLRI specific information\n")
        !           632: {
        !           633:   return bgp_show_mpls_vpn (vty, AFI_IP6, NULL, bgp_show_type_normal, NULL, 0);
        !           634: }
        !           635: 
        !           636: DEFUN (show_bgp_ipv4_vpn_rd,
        !           637:        show_bgp_ipv4_vpn_rd_cmd,
        !           638:        "show bgp ipv4 vpn rd ASN:nn_or_IP-address:nn",
        !           639:        SHOW_STR
        !           640:        BGP_STR
        !           641:        "Address Family\n"
        !           642:        "Display VPN NLRI specific information\n"
1.1       misho     643:        "Display information for a route distinguisher\n"
                    644:        "VPN Route Distinguisher\n")
                    645: {
                    646:   int ret;
                    647:   struct prefix_rd prd;
                    648: 
                    649:   ret = str2prefix_rd (argv[0], &prd);
                    650:   if (! ret)
                    651:     {
                    652:       vty_out (vty, "%% Malformed Route Distinguisher%s", VTY_NEWLINE);
                    653:       return CMD_WARNING;
                    654:     }
1.1.1.4 ! misho     655:   return bgp_show_mpls_vpn (vty, AFI_IP, &prd, bgp_show_type_normal, NULL, 0);
1.1       misho     656: }
                    657: 
1.1.1.4 ! misho     658: DEFUN (show_bgp_ipv6_vpn_rd,
        !           659:        show_bgp_ipv6_vpn_rd_cmd,
        !           660:        "show bgp ipv6 vpn rd ASN:nn_or_IP-address:nn",
1.1       misho     661:        SHOW_STR
                    662:        BGP_STR
1.1.1.4 ! misho     663:        "Address Family\n"
        !           664:        "Display VPN NLRI specific information\n"
        !           665:        "Display information for a route distinguisher\n"
        !           666:        "VPN Route Distinguisher\n")
        !           667: {
        !           668:   int ret;
        !           669:   struct prefix_rd prd;
        !           670: 
        !           671:   ret = str2prefix_rd (argv[0], &prd);
        !           672:   if (! ret)
        !           673:     {
        !           674:       vty_out (vty, "%% Malformed Route Distinguisher%s", VTY_NEWLINE);
        !           675:       return CMD_WARNING;
        !           676:     }
        !           677:   return bgp_show_mpls_vpn (vty, AFI_IP6, &prd, bgp_show_type_normal, NULL, 0);
        !           678: }
        !           679: 
        !           680: 
        !           681: DEFUN (show_bgp_ipv4_vpn_tags,
        !           682:        show_bgp_ipv4_vpn_tags_cmd,
        !           683:        "show bgp ipv4 vpn tags",
        !           684:        SHOW_STR
        !           685:        BGP_STR
        !           686:        "Address Family\n"
        !           687:        "Display VPN NLRI specific information\n"
        !           688:        "Display BGP tags for prefixes\n")
        !           689: {
        !           690:   return bgp_show_mpls_vpn (vty, AFI_IP, NULL, bgp_show_type_normal, NULL,  1);
        !           691: }
        !           692: DEFUN (show_bgp_ipv6_vpn_tags,
        !           693:        show_bgp_ipv6_vpn_tags_cmd,
        !           694:        "show bgp ipv6 vpn tags",
        !           695:        SHOW_STR
        !           696:        BGP_STR
        !           697:        "Address Family\n"
        !           698:        "Display VPN NLRI specific information\n"
1.1       misho     699:        "Display BGP tags for prefixes\n")
                    700: {
1.1.1.4 ! misho     701:   return bgp_show_mpls_vpn (vty, AFI_IP6, NULL, bgp_show_type_normal, NULL,  1);
1.1       misho     702: }
                    703: 
1.1.1.4 ! misho     704: DEFUN (show_bgp_ipv4_vpn_rd_tags,
        !           705:        show_bgp_ipv4_vpn_rd_tags_cmd,
        !           706:        "show bgp ipv4 vpn rd ASN:nn_or_IP-address:nn tags",
        !           707:        SHOW_STR
        !           708:        BGP_STR
        !           709:        "Address Family\n"
        !           710:        "Display VPN NLRI specific information\n"
        !           711:        "Display information for a route distinguisher\n"
        !           712:        "VPN Route Distinguisher\n"
        !           713:        "Display BGP tags for prefixes\n")
        !           714: {
        !           715:   int ret;
        !           716:   struct prefix_rd prd;
        !           717: 
        !           718:   ret = str2prefix_rd (argv[0], &prd);
        !           719:   if (! ret)
        !           720:     {
        !           721:       vty_out (vty, "%% Malformed Route Distinguisher%s", VTY_NEWLINE);
        !           722:       return CMD_WARNING;
        !           723:     }
        !           724:   return bgp_show_mpls_vpn (vty, AFI_IP, &prd, bgp_show_type_normal, NULL, 1);
        !           725: }
        !           726: DEFUN (show_bgp_ipv6_vpn_rd_tags,
        !           727:        show_bgp_ipv6_vpn_rd_tags_cmd,
        !           728:        "show bgp ipv6 vpn rd ASN:nn_or_IP-address:nn tags",
1.1       misho     729:        SHOW_STR
                    730:        BGP_STR
1.1.1.4 ! misho     731:        "Address Family\n"
        !           732:        "Display VPN NLRI specific information\n"
1.1       misho     733:        "Display information for a route distinguisher\n"
                    734:        "VPN Route Distinguisher\n"
                    735:        "Display BGP tags for prefixes\n")
                    736: {
                    737:   int ret;
                    738:   struct prefix_rd prd;
                    739: 
                    740:   ret = str2prefix_rd (argv[0], &prd);
                    741:   if (! ret)
                    742:     {
                    743:       vty_out (vty, "%% Malformed Route Distinguisher%s", VTY_NEWLINE);
                    744:       return CMD_WARNING;
                    745:     }
1.1.1.4 ! misho     746:   return bgp_show_mpls_vpn (vty, AFI_IP6, &prd, bgp_show_type_normal, NULL, 1);
1.1       misho     747: }
                    748: 
1.1.1.4 ! misho     749: DEFUN (show_bgp_ipv4_vpn_neighbor_routes,
        !           750:        show_bgp_ipv4_vpn_neighbor_routes_cmd,
        !           751:        "show bgp ipv4 vpn neighbors (A.B.C.D|X:X::X:X) routes",
1.1       misho     752:        SHOW_STR
                    753:        BGP_STR
1.1.1.4 ! misho     754:        "Address Family\n"
        !           755:        "Display VPN NLRI specific information\n"
1.1       misho     756:        "Detailed information on TCP and BGP neighbor connections\n"
                    757:        "Neighbor to display information about\n"
1.1.1.4 ! misho     758:        "Neighbor to display information about\n"
1.1       misho     759:        "Display routes learned from neighbor\n")
                    760: {
1.1.1.3   misho     761:   union sockunion su;
1.1       misho     762:   struct peer *peer;
1.1.1.3   misho     763:   int ret;
                    764: 
                    765:   ret = str2sockunion (argv[0], &su);
                    766:   if (ret < 0)
1.1       misho     767:     {
                    768:       vty_out (vty, "Malformed address: %s%s", argv[0], VTY_NEWLINE);
1.1.1.3   misho     769:       return CMD_WARNING;
1.1       misho     770:     }
                    771: 
1.1.1.3   misho     772:   peer = peer_lookup (NULL, &su);
1.1       misho     773:   if (! peer || ! peer->afc[AFI_IP][SAFI_MPLS_VPN])
                    774:     {
                    775:       vty_out (vty, "%% No such neighbor or address family%s", VTY_NEWLINE);
                    776:       return CMD_WARNING;
                    777:     }
                    778: 
1.1.1.4 ! misho     779:   return bgp_show_mpls_vpn (vty, AFI_IP, NULL, bgp_show_type_neighbor, &su, 0);
1.1       misho     780: }
                    781: 
1.1.1.4 ! misho     782: DEFUN (show_bgp_ipv6_vpn_neighbor_routes,
        !           783:        show_bgp_ipv6_vpn_neighbor_routes_cmd,
        !           784:        "show bgp ipv6 vpn neighbors (A.B.C.D|X:X::X:X) routes",
1.1       misho     785:        SHOW_STR
                    786:        BGP_STR
1.1.1.4 ! misho     787:        "Address Family\n"
        !           788:        "Display VPN NLRI specific information\n"
1.1       misho     789:        "Detailed information on TCP and BGP neighbor connections\n"
                    790:        "Neighbor to display information about\n"
1.1.1.4 ! misho     791:        "Neighbor to display information about\n"
1.1       misho     792:        "Display routes learned from neighbor\n")
                    793: {
1.1.1.3   misho     794:   union sockunion su;
1.1       misho     795:   struct peer *peer;
                    796: 
1.1.1.4 ! misho     797:   int ret;
1.1       misho     798: 
1.1.1.4 ! misho     799:   ret = str2sockunion (argv[0], &su);
1.1.1.3   misho     800:   if (ret < 0)
1.1       misho     801:     {
                    802:       vty_out (vty, "Malformed address: %s%s", argv[0], VTY_NEWLINE);
1.1.1.3   misho     803:       return CMD_WARNING;
1.1       misho     804:     }
                    805: 
1.1.1.3   misho     806:   peer = peer_lookup (NULL, &su);
1.1.1.4 ! misho     807:   if (! peer || ! peer->afc[AFI_IP6][SAFI_MPLS_VPN])
1.1       misho     808:     {
                    809:       vty_out (vty, "%% No such neighbor or address family%s", VTY_NEWLINE);
                    810:       return CMD_WARNING;
                    811:     }
                    812: 
1.1.1.4 ! misho     813:   return bgp_show_mpls_vpn (vty, AFI_IP6, NULL, bgp_show_type_neighbor, &su, 0);
1.1       misho     814: }
                    815: 
1.1.1.4 ! misho     816: DEFUN (show_bgp_ipv4_vpn_neighbor_advertised_routes,
        !           817:        show_bgp_ipv4_vpn_neighbor_advertised_routes_cmd,
        !           818:        "show bgp ipv4 vpn neighbors (A.B.C.D|X:X::X:X) advertised-routes",
1.1       misho     819:        SHOW_STR
                    820:        BGP_STR
1.1.1.4 ! misho     821:        "Address Family\n"
        !           822:        "Display VPN NLRI specific information\n"
1.1       misho     823:        "Detailed information on TCP and BGP neighbor connections\n"
                    824:        "Neighbor to display information about\n"
                    825:        "Display the routes advertised to a BGP neighbor\n")
                    826: {
                    827:   int ret;
                    828:   struct peer *peer;
                    829:   union sockunion su;
                    830: 
                    831:   ret = str2sockunion (argv[0], &su);
                    832:   if (ret < 0)
                    833:     {
                    834:       vty_out (vty, "%% Malformed address: %s%s", argv[0], VTY_NEWLINE);
                    835:       return CMD_WARNING;
                    836:     }
                    837:   peer = peer_lookup (NULL, &su);
                    838:   if (! peer || ! peer->afc[AFI_IP][SAFI_MPLS_VPN])
                    839:     {
                    840:       vty_out (vty, "%% No such neighbor or address family%s", VTY_NEWLINE);
                    841:       return CMD_WARNING;
                    842:     }
                    843: 
                    844:   return show_adj_route_vpn (vty, peer, NULL);
                    845: }
1.1.1.4 ! misho     846: DEFUN (show_bgp_ipv6_vpn_neighbor_advertised_routes,
        !           847:        show_bgp_ipv6_vpn_neighbor_advertised_routes_cmd,
        !           848:        "show bgp ipv6 vpn neighbors (A.B.C.D|X:X::X:X) advertised-routes",
        !           849:        SHOW_STR
        !           850:        BGP_STR
        !           851:        "Address Family\n"
        !           852:        "Display VPN NLRI specific information\n"
        !           853:        "Detailed information on TCP and BGP neighbor connections\n"
        !           854:        "Neighbor to display information about\n"
        !           855:        "Display the routes advertised to a BGP neighbor\n")
        !           856: {
        !           857:   int ret;
        !           858:   struct peer *peer;
        !           859:   union sockunion su;
        !           860: 
        !           861:   ret = str2sockunion (argv[0], &su);
        !           862:   if (ret < 0)
        !           863:     {
        !           864:       vty_out (vty, "%% Malformed address: %s%s", argv[0], VTY_NEWLINE);
        !           865:       return CMD_WARNING;
        !           866:     }
        !           867:   peer = peer_lookup (NULL, &su);
        !           868:   if (! peer || ! peer->afc[AFI_IP6][SAFI_MPLS_VPN])
        !           869:     {
        !           870:       vty_out (vty, "%% No such neighbor or address family%s", VTY_NEWLINE);
        !           871:       return CMD_WARNING;
        !           872:     }
        !           873: 
        !           874:   return show_adj_route_vpn (vty, peer, NULL);
        !           875: }
1.1       misho     876: 
                    877: DEFUN (show_ip_bgp_vpnv4_rd_neighbor_advertised_routes,
1.1.1.4 ! misho     878:        show_bgp_ipv4_vpn_rd_neighbor_advertised_routes_cmd,
        !           879:        "show bgp ipv4 vpn rd ASN:nn_or_IP-address:nn neighbors (A.B.C.D|X:X::X:X) advertised-routes",
1.1       misho     880:        SHOW_STR
                    881:        BGP_STR
1.1.1.4 ! misho     882:        "Address Family\n"
        !           883:        "Display VPN NLRI specific information\n"
1.1       misho     884:        "Display information for a route distinguisher\n"
                    885:        "VPN Route Distinguisher\n"
                    886:        "Detailed information on TCP and BGP neighbor connections\n"
                    887:        "Neighbor to display information about\n"
1.1.1.4 ! misho     888:        "Neighbor to display information about\n"
1.1       misho     889:        "Display the routes advertised to a BGP neighbor\n")
                    890: {
                    891:   int ret;
                    892:   struct peer *peer;
                    893:   struct prefix_rd prd;
                    894:   union sockunion su;
                    895:   ret = str2sockunion (argv[1], &su);
                    896:   if (ret < 0)
                    897:     {
1.1.1.4 ! misho     898:       vty_out (vty, "%% Malformed address: %s%s", argv[1], VTY_NEWLINE);
1.1       misho     899:       return CMD_WARNING;
                    900:     }
                    901:   peer = peer_lookup (NULL, &su);
                    902:   if (! peer || ! peer->afc[AFI_IP][SAFI_MPLS_VPN])
                    903:     {
                    904:       vty_out (vty, "%% No such neighbor or address family%s", VTY_NEWLINE);
                    905:       return CMD_WARNING;
                    906:     }
                    907: 
                    908:   ret = str2prefix_rd (argv[0], &prd);
                    909:   if (! ret)
                    910:     {
                    911:       vty_out (vty, "%% Malformed Route Distinguisher%s", VTY_NEWLINE);
                    912:       return CMD_WARNING;
                    913:     }
                    914: 
                    915:   return show_adj_route_vpn (vty, peer, &prd);
                    916: }
1.1.1.4 ! misho     917: DEFUN (show_ip_bgp_vpnv6_rd_neighbor_advertised_routes,
        !           918:        show_bgp_ipv6_vpn_rd_neighbor_advertised_routes_cmd,
        !           919:        "show bgp ipv6 vpn rd ASN:nn_or_IP-address:nn neighbors (A.B.C.D|X:X::X:X) advertised-routes",
        !           920:        SHOW_STR
        !           921:        BGP_STR
        !           922:        "Address Family\n"
        !           923:        "Display VPN NLRI specific information\n"
        !           924:        "Display information for a route distinguisher\n"
        !           925:        "VPN Route Distinguisher\n"
        !           926:        "Detailed information on TCP and BGP neighbor connections\n"
        !           927:        "Neighbor to display information about\n"
        !           928:        "Neighbor to display information about\n"
        !           929:        "Display the routes advertised to a BGP neighbor\n")
        !           930: {
        !           931:   int ret;
        !           932:   struct peer *peer;
        !           933:   struct prefix_rd prd;
        !           934:   union sockunion su;
        !           935:   ret = str2sockunion (argv[1], &su);
        !           936:   if (ret < 0)
        !           937:     {
        !           938:       vty_out (vty, "%% Malformed address: %s%s", argv[1], VTY_NEWLINE);
        !           939:       return CMD_WARNING;
        !           940:     }
        !           941:   peer = peer_lookup (NULL, &su);
        !           942:   if (! peer || ! peer->afc[AFI_IP6][SAFI_MPLS_VPN])
        !           943:     {
        !           944:       vty_out (vty, "%% No such neighbor or address family%s", VTY_NEWLINE);
        !           945:       return CMD_WARNING;
        !           946:     }
        !           947: 
        !           948:   ret = str2prefix_rd (argv[0], &prd);
        !           949:   if (! ret)
        !           950:     {
        !           951:       vty_out (vty, "%% Malformed Route Distinguisher%s", VTY_NEWLINE);
        !           952:       return CMD_WARNING;
        !           953:     }
        !           954: 
        !           955:   return show_adj_route_vpn (vty, peer, &prd);
        !           956: }
        !           957: 
        !           958: DEFUN (show_bgp_ipv4_vpn_rd_neighbor_routes,
        !           959:        show_bgp_ipv4_vpn_rd_neighbor_routes_cmd,
        !           960:        "show bgp ipv4 vpn rd ASN:nn_or_IP-address:nn neighbors (A.B.C.D|X:X::X:X) routes",
        !           961:        SHOW_STR
        !           962:        BGP_STR
        !           963:        "Address Family\n"
        !           964:        "Address Family modifier\n"
        !           965:        "Display information for a route distinguisher\n"
        !           966:        "VPN Route Distinguisher\n"
        !           967:        "Detailed information on TCP and BGP neighbor connections\n"
        !           968:        "Neighbor to display information about\n"
        !           969:        "Display routes learned from neighbor\n")
        !           970: {
        !           971:   int ret;
        !           972:   union sockunion *su;
        !           973:   struct peer *peer;
        !           974:   struct prefix_rd prd;
        !           975: 
        !           976:   ret = str2prefix_rd (argv[0], &prd);
        !           977:   if (! ret)
        !           978:     {
        !           979:       vty_out (vty, "%% Malformed Route Distinguisher%s", VTY_NEWLINE);
        !           980:       return CMD_WARNING;
        !           981:     }
        !           982: 
        !           983:   su = sockunion_str2su (argv[1]);
        !           984:   if (su == NULL)
        !           985:     {
        !           986:       vty_out (vty, "Malformed address: %s%s", argv[1], VTY_NEWLINE);
        !           987:                return CMD_WARNING;
        !           988:     }
        !           989: 
        !           990:   peer = peer_lookup (NULL, su);
        !           991:   if (! peer || ! peer->afc[AFI_IP][SAFI_MPLS_VPN])
        !           992:     {
        !           993:       vty_out (vty, "%% No such neighbor or address family%s", VTY_NEWLINE);
        !           994:       return CMD_WARNING;
        !           995:     }
        !           996: 
        !           997:   return bgp_show_mpls_vpn (vty, AFI_IP, &prd, bgp_show_type_neighbor, su, 0);
        !           998: }
        !           999: DEFUN (show_bgp_ipv6_vpn_rd_neighbor_routes,
        !          1000:        show_bgp_ipv6_vpn_rd_neighbor_routes_cmd,
        !          1001:        "show bgp ipv6 vpn rd ASN:nn_or_IP-address:nn neighbors (A.B.C.D|X:X::X:X) routes",
        !          1002:        SHOW_STR
        !          1003:        BGP_STR
        !          1004:        "Address Family\n"
        !          1005:        "Address Family modifier\n"
        !          1006:        "Display information for a route distinguisher\n"
        !          1007:        "VPN Route Distinguisher\n"
        !          1008:        "Detailed information on TCP and BGP neighbor connections\n"
        !          1009:        "Neighbor to display information about\n"
        !          1010:        "Display routes learned from neighbor\n")
        !          1011: {
        !          1012:   int ret;
        !          1013:   union sockunion *su;
        !          1014:   struct peer *peer;
        !          1015:   struct prefix_rd prd;
        !          1016: 
        !          1017:   ret = str2prefix_rd (argv[0], &prd);
        !          1018:   if (! ret)
        !          1019:     {
        !          1020:       vty_out (vty, "%% Malformed Route Distinguisher%s", VTY_NEWLINE);
        !          1021:       return CMD_WARNING;
        !          1022:     }
        !          1023: 
        !          1024:   su = sockunion_str2su (argv[1]);
        !          1025:   if (su == NULL)
        !          1026:     {
        !          1027:       vty_out (vty, "Malformed address: %s%s", argv[1], VTY_NEWLINE);
        !          1028:                return CMD_WARNING;
        !          1029:     }
        !          1030: 
        !          1031:   peer = peer_lookup (NULL, su);
        !          1032:   if (! peer || ! peer->afc[AFI_IP6][SAFI_MPLS_VPN])
        !          1033:     {
        !          1034:       vty_out (vty, "%% No such neighbor or address family%s", VTY_NEWLINE);
        !          1035:       return CMD_WARNING;
        !          1036:     }
        !          1037: 
        !          1038:   return bgp_show_mpls_vpn (vty, AFI_IP6, &prd, bgp_show_type_neighbor, su, 0);
        !          1039: }
1.1       misho    1040: 
                   1041: void
                   1042: bgp_mplsvpn_init (void)
                   1043: {
                   1044:   install_element (BGP_VPNV4_NODE, &vpnv4_network_cmd);
1.1.1.4 ! misho    1045:   install_element (BGP_VPNV4_NODE, &vpnv4_network_route_map_cmd);
1.1       misho    1046:   install_element (BGP_VPNV4_NODE, &no_vpnv4_network_cmd);
                   1047: 
1.1.1.4 ! misho    1048:   install_element (VIEW_NODE, &show_bgp_ipv4_vpn_cmd);
        !          1049:   install_element (VIEW_NODE, &show_bgp_ipv4_vpn_rd_cmd);
        !          1050:   install_element (VIEW_NODE, &show_bgp_ipv4_vpn_tags_cmd);
        !          1051:   install_element (VIEW_NODE, &show_bgp_ipv4_vpn_rd_tags_cmd);
        !          1052:   install_element (VIEW_NODE, &show_bgp_ipv4_vpn_neighbor_routes_cmd);
        !          1053:   install_element (VIEW_NODE, &show_bgp_ipv4_vpn_neighbor_advertised_routes_cmd);
        !          1054:   install_element (VIEW_NODE, &show_bgp_ipv4_vpn_rd_neighbor_advertised_routes_cmd);
        !          1055:   install_element (VIEW_NODE, &show_bgp_ipv4_vpn_rd_neighbor_routes_cmd);
        !          1056: 
        !          1057:   install_element (VIEW_NODE, &show_bgp_ipv6_vpn_cmd);
        !          1058:   install_element (VIEW_NODE, &show_bgp_ipv6_vpn_rd_cmd);
        !          1059:   install_element (VIEW_NODE, &show_bgp_ipv6_vpn_tags_cmd);
        !          1060:   install_element (VIEW_NODE, &show_bgp_ipv6_vpn_rd_tags_cmd);
        !          1061:   install_element (VIEW_NODE, &show_bgp_ipv6_vpn_neighbor_routes_cmd);
        !          1062:   install_element (VIEW_NODE, &show_bgp_ipv6_vpn_neighbor_advertised_routes_cmd);
        !          1063:   install_element (VIEW_NODE, &show_bgp_ipv6_vpn_rd_neighbor_advertised_routes_cmd);
        !          1064:   install_element (VIEW_NODE, &show_bgp_ipv6_vpn_rd_neighbor_routes_cmd);
        !          1065: 
        !          1066:   install_element (ENABLE_NODE, &show_bgp_ipv4_vpn_cmd);
        !          1067:   install_element (ENABLE_NODE, &show_bgp_ipv4_vpn_rd_cmd);
        !          1068:   install_element (ENABLE_NODE, &show_bgp_ipv4_vpn_tags_cmd);
        !          1069:   install_element (ENABLE_NODE, &show_bgp_ipv4_vpn_rd_tags_cmd);
        !          1070:   install_element (ENABLE_NODE, &show_bgp_ipv4_vpn_neighbor_routes_cmd);
        !          1071:   install_element (ENABLE_NODE, &show_bgp_ipv4_vpn_neighbor_advertised_routes_cmd);
        !          1072:   install_element (ENABLE_NODE, &show_bgp_ipv4_vpn_rd_neighbor_advertised_routes_cmd);
        !          1073:   install_element (ENABLE_NODE, &show_bgp_ipv4_vpn_rd_neighbor_routes_cmd);
        !          1074: 
        !          1075:   install_element (ENABLE_NODE, &show_bgp_ipv6_vpn_cmd);
        !          1076:   install_element (ENABLE_NODE, &show_bgp_ipv6_vpn_rd_cmd);
        !          1077:   install_element (ENABLE_NODE, &show_bgp_ipv6_vpn_tags_cmd);
        !          1078:   install_element (ENABLE_NODE, &show_bgp_ipv6_vpn_rd_tags_cmd);
        !          1079:   install_element (ENABLE_NODE, &show_bgp_ipv6_vpn_neighbor_routes_cmd);
        !          1080:   install_element (ENABLE_NODE, &show_bgp_ipv6_vpn_neighbor_advertised_routes_cmd);
        !          1081:   install_element (ENABLE_NODE, &show_bgp_ipv6_vpn_rd_neighbor_advertised_routes_cmd);
        !          1082:   install_element (ENABLE_NODE, &show_bgp_ipv6_vpn_rd_neighbor_routes_cmd);
1.1       misho    1083: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>