Annotation of embedaddon/quagga/bgpd/bgp_encap.c, revision 1.1.1.1

1.1       misho       1: 
                      2: /*
                      3:  * This file created by LabN Consulting, L.L.C.
                      4:  *
                      5:  *
                      6:  * This file is based on bgp_mplsvpn.c which is Copyright (C) 2000
                      7:  * Kunihiro Ishiguro <kunihiro@zebra.org>
                      8:  *
                      9:  */
                     10: 
                     11: /* 
                     12: 
                     13: This file is part of GNU Zebra.
                     14: 
                     15: GNU Zebra is free software; you can redistribute it and/or modify it
                     16: under the terms of the GNU General Public License as published by the
                     17: Free Software Foundation; either version 2, or (at your option) any
                     18: later version.
                     19: 
                     20: GNU Zebra is distributed in the hope that it will be useful, but
                     21: WITHOUT ANY WARRANTY; without even the implied warranty of
                     22: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
                     23: General Public License for more details.
                     24: 
                     25: You should have received a copy of the GNU General Public License
                     26: along with GNU Zebra; see the file COPYING.  If not, write to the Free
                     27: Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
                     28: 02111-1307, USA.  */
                     29: 
                     30: #include <zebra.h>
                     31: 
                     32: #include "command.h"
                     33: #include "prefix.h"
                     34: #include "log.h"
                     35: #include "memory.h"
                     36: #include "stream.h"
                     37: #include "filter.h"
                     38: 
                     39: #include "bgpd/bgpd.h"
                     40: #include "bgpd/bgp_table.h"
                     41: #include "bgpd/bgp_route.h"
                     42: #include "bgpd/bgp_attr.h"
                     43: #include "bgpd/bgp_ecommunity.h"
                     44: #include "bgpd/bgp_mplsvpn.h"
                     45: #include "bgpd/bgp_vty.h"
                     46: #include "bgpd/bgp_encap.h"
                     47: 
                     48: static u_int16_t
                     49: decode_rd_type (u_char *pnt)
                     50: {
                     51:   u_int16_t v;
                     52:   
                     53:   v = ((u_int16_t) *pnt++ << 8);
                     54:   v |= (u_int16_t) *pnt;
                     55:   return v;
                     56: }
                     57: 
                     58: 
                     59: static void
                     60: decode_rd_as (u_char *pnt, struct rd_as *rd_as)
                     61: {
                     62:   rd_as->as  = (u_int16_t) *pnt++ << 8;
                     63:   rd_as->as |= (u_int16_t) *pnt++;
                     64:   
                     65:   rd_as->val  = ((u_int32_t) *pnt++) << 24;
                     66:   rd_as->val |= ((u_int32_t) *pnt++) << 16;
                     67:   rd_as->val |= ((u_int32_t) *pnt++) << 8;
                     68:   rd_as->val |= (u_int32_t) *pnt;
                     69: }
                     70: 
                     71: static void
                     72: decode_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_int32_t) *pnt++ << 8);
                     80:   rd_as->val |= (u_int32_t) *pnt;
                     81: }
                     82: 
                     83: static void
                     84: decode_rd_ip (u_char *pnt, struct rd_ip *rd_ip)
                     85: {
                     86:   memcpy (&rd_ip->ip, pnt, 4);
                     87:   pnt += 4;
                     88:   
                     89:   rd_ip->val = ((u_int16_t) *pnt++ << 8);
                     90:   rd_ip->val |= (u_int16_t) *pnt;
                     91: }
                     92: 
                     93: static void
                     94: ecom2prd(struct ecommunity *ecom, struct prefix_rd *prd)
                     95: {
                     96:     int        i;
                     97: 
                     98:     memset(prd, 0, sizeof(struct prefix_rd));
                     99:     prd->family = AF_UNSPEC;
                    100:     prd->prefixlen = 64;
                    101: 
                    102:     if (!ecom)
                    103:        return;
                    104: 
                    105:     for (i = 0; i < (ecom->size * ECOMMUNITY_SIZE); i += ECOMMUNITY_SIZE) {
                    106: 
                    107:        uint8_t *ep;
                    108: 
                    109:        ep = ecom->val + i;
                    110: 
                    111:        switch (ep[0]) {
                    112:            default:
                    113:                continue;
                    114: 
                    115:            case 0x80:
                    116:            case 0x81:
                    117:            case 0x82:
                    118:                if (ep[1] == 0x0) {
                    119:                    prd->val[1] = ep[0] & 0x03;
                    120:                    memcpy(prd->val + 2, ep + 2, 6);
                    121:                    return;
                    122:                }
                    123:        }
                    124:     }
                    125: }
                    126: 
                    127: int
                    128: bgp_nlri_parse_encap(
                    129:     struct peer                *peer,
                    130:     struct attr                *attr,          /* Need even for withdraw */
                    131:     struct bgp_nlri    *packet)
                    132: {
                    133:   u_char *pnt;
                    134:   u_char *lim;
                    135:   afi_t afi = packet->afi;
                    136:   struct prefix p;
                    137:   int psize = 0;
                    138:   int prefixlen;
                    139:   struct rd_as rd_as;
                    140:   struct rd_ip rd_ip;
                    141:   struct prefix_rd prd;
                    142:   struct ecommunity *pEcom = NULL;
                    143:   u_int16_t rdtype = 0xffff;
                    144:   char buf[BUFSIZ];
                    145: 
                    146:   /* Check peer status. */
                    147:   if (peer->status != Established)
                    148:     return 0;
                    149:   
                    150:   /* Make prefix_rd */
                    151:   if (attr && attr->extra && attr->extra->ecommunity)
                    152:       pEcom = attr->extra->ecommunity;
                    153: 
                    154:   ecom2prd(pEcom, &prd);
                    155:   memset(&rd_as, 0, sizeof(rd_as));
                    156:   memset(&rd_ip, 0, sizeof(rd_ip));
                    157: 
                    158:   if (pEcom) {
                    159: 
                    160:       rdtype = (prd.val[0] << 8) | prd.val[1];
                    161: 
                    162:       /* Decode RD value. */
                    163:       if (rdtype == RD_TYPE_AS)
                    164:        decode_rd_as (prd.val + 2, &rd_as);
                    165:       else if (rdtype == RD_TYPE_IP)
                    166:        decode_rd_ip (prd.val + 2, &rd_ip);
                    167:       else if (rdtype == RD_TYPE_AS4)
                    168:        decode_rd_as4 (prd.val + 2, &rd_as);
                    169:       else
                    170:        {
                    171:          zlog_err ("Invalid RD type %d", rdtype);
                    172:        }
                    173: 
                    174:   }
                    175: 
                    176:   /*
                    177:    * NB: this code was based on the MPLS VPN code, which supported RDs.
                    178:    * For the moment we are retaining the underlying RIB structure that
                    179:    * keeps a per-RD radix tree, but since the RDs are not carried over
                    180:    * the wire, we set the RD internally to 0.
                    181:    */
                    182:   prd.family = AF_UNSPEC;
                    183:   prd.prefixlen = 64;
                    184:   memset(prd.val, 0, sizeof(prd.val));
                    185: 
                    186:   pnt = packet->nlri;
                    187:   lim = pnt + packet->length;
                    188: 
                    189:   for (; pnt < lim; pnt += psize)
                    190:     {
                    191:       /* Clear prefix structure. */
                    192:       memset (&p, 0, sizeof (struct prefix));
                    193: 
                    194:       /* Fetch prefix length. */
                    195:       prefixlen = *pnt++;
                    196:       p.family = afi2family(afi);
                    197:       if (p.family == 0) {
                    198:        /* bad afi, shouldn't happen */
                    199:        zlog_warn("%s: bad afi %d, dropping incoming route", __func__, afi);
                    200:        continue;
                    201:       }
                    202:       psize = PSIZE (prefixlen);
                    203: 
                    204:       p.prefixlen = prefixlen;
                    205:       memcpy (&p.u.prefix, pnt, psize);
                    206: 
                    207:       if (pnt + psize > lim)
                    208:        return -1;
                    209: 
                    210: 
                    211:       if (rdtype == RD_TYPE_AS)
                    212:        zlog_info ("rd-as %u:%u prefix %s/%d", rd_as.as, rd_as.val,
                    213:                   inet_ntop (p.family, &p.u.prefix, buf, BUFSIZ),
                    214:                   p.prefixlen);
                    215:       else if (rdtype == RD_TYPE_IP)
                    216:        zlog_info ("rd-ip %s:%u prefix %s/%d", inet_ntoa (rd_ip.ip),
                    217:                   rd_ip.val,
                    218:                   inet_ntop (p.family, &p.u.prefix, buf, BUFSIZ),
                    219:                   p.prefixlen);
                    220:       else if (rdtype == RD_TYPE_AS4)
                    221:        zlog_info ("rd-as4 %u:%u prefix %s/%d", rd_as.as, rd_as.val,
                    222:                   inet_ntop (p.family, &p.u.prefix, buf, BUFSIZ),
                    223:                   p.prefixlen);
                    224:       else
                    225:        zlog_info ("rd unknown, default to 0:0 prefix %s/%d",
                    226:            inet_ntop (p.family, &p.u.prefix, buf, BUFSIZ),
                    227:            p.prefixlen);
                    228: 
                    229:       if (attr) {
                    230:        bgp_update (peer, &p, attr, afi, SAFI_ENCAP,
                    231:                    ZEBRA_ROUTE_BGP, BGP_ROUTE_NORMAL, &prd, NULL, 0);
                    232:       } else {
                    233:        bgp_withdraw (peer, &p, attr, afi, SAFI_ENCAP,
                    234:                      ZEBRA_ROUTE_BGP, BGP_ROUTE_NORMAL, &prd, NULL);
                    235:       }
                    236:     }
                    237: 
                    238:   /* Packet length consistency check. */
                    239:   if (pnt != lim)
                    240:     return -1;
                    241: 
                    242:   return 0;
                    243: }
                    244: 
                    245: 
                    246: /* TBD: these routes should probably all be host routes */
                    247: 
                    248: /* For testing purpose, static route of ENCAP. */
                    249: DEFUN (encap_network,
                    250:        encap_network_cmd,
                    251:        "network A.B.C.D/M rd ASN:nn_or_IP-address:nn tag WORD",
                    252:        "Specify a network to announce via BGP\n"
                    253:        "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
                    254:        "Specify Route Distinguisher\n"
                    255:        "ENCAP Route Distinguisher\n"
                    256:        "BGP tag\n"
                    257:        "tag value\n")
                    258: {
                    259:   return bgp_static_set_safi (SAFI_ENCAP, vty, argv[0], argv[1], argv[2], NULL);
                    260: }
                    261: 
                    262: /* For testing purpose, static route of ENCAP. */
                    263: DEFUN (no_encap_network,
                    264:        no_encap_network_cmd,
                    265:        "no network A.B.C.D/M rd ASN:nn_or_IP-address:nn tag WORD",
                    266:        NO_STR
                    267:        "Specify a network to announce via BGP\n"
                    268:        "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
                    269:        "Specify Route Distinguisher\n"
                    270:        "ENCAP Route Distinguisher\n"
                    271:        "BGP tag\n"
                    272:        "tag value\n")
                    273: {
                    274:   return bgp_static_unset_safi (SAFI_ENCAP, vty, argv[0], argv[1], argv[2]);
                    275: }
                    276: 
                    277: static int
                    278: show_adj_route_encap (struct vty *vty, struct peer *peer, struct prefix_rd *prd)
                    279: {
                    280:   struct bgp *bgp;
                    281:   struct bgp_table *table;
                    282:   struct bgp_node *rn;
                    283:   struct bgp_node *rm;
                    284:   struct attr *attr;
                    285:   int rd_header;
                    286:   int header = 1;
                    287:   char v4_header[] = "   Network          Next Hop            Metric LocPrf Weight Path%s";
                    288: 
                    289:   bgp = bgp_get_default ();
                    290:   if (bgp == NULL)
                    291:     {
                    292:       vty_out (vty, "No BGP process is configured%s", VTY_NEWLINE);
                    293:       return CMD_WARNING;
                    294:     }
                    295: 
                    296:   for (rn = bgp_table_top (bgp->rib[AFI_IP][SAFI_ENCAP]); rn;
                    297:        rn = bgp_route_next (rn))
                    298:     {
                    299:       if (prd && memcmp (rn->p.u.val, prd->val, 8) != 0)
                    300:         continue;
                    301: 
                    302:       if ((table = rn->info) != NULL)
                    303:         {
                    304:           rd_header = 1;
                    305: 
                    306:           for (rm = bgp_table_top (table); rm; rm = bgp_route_next (rm))
                    307:             if ((attr = rm->info) != NULL)
                    308:               {
                    309:                 if (header)
                    310:                   {
                    311:                     vty_out (vty, "BGP table version is 0, local router ID is %s%s",
                    312:                              inet_ntoa (bgp->router_id), VTY_NEWLINE);
                    313:                     vty_out (vty, "Status codes: s suppressed, d damped, h history, * valid, > best, i - internal%s",
                    314:                              VTY_NEWLINE);
                    315:                     vty_out (vty, "Origin codes: i - IGP, e - EGP, ? - incomplete%s%s",
                    316:                              VTY_NEWLINE, VTY_NEWLINE);
                    317:                     vty_out (vty, v4_header, VTY_NEWLINE);
                    318:                     header = 0;
                    319:                   }
                    320: 
                    321:                 if (rd_header)
                    322:                   {
                    323:                     u_int16_t type;
                    324:                     struct rd_as rd_as;
                    325:                     struct rd_ip rd_ip;
                    326:                     u_char *pnt;
                    327: 
                    328:                     pnt = rn->p.u.val;
                    329: 
                    330:                     vty_out (vty, "Route Distinguisher: ");
                    331: 
                    332:                     /* Decode RD type. */
                    333:                     type = decode_rd_type (pnt);
                    334: 
                    335:                    switch (type) {
                    336: 
                    337:                    case RD_TYPE_AS:
                    338:                       decode_rd_as (pnt + 2, &rd_as);
                    339:                       vty_out (vty, "%u:%d", rd_as.as, rd_as.val);
                    340:                      break;
                    341: 
                    342:                    case RD_TYPE_IP:
                    343:                       decode_rd_ip (pnt + 2, &rd_ip);
                    344:                       vty_out (vty, "%s:%d", inet_ntoa (rd_ip.ip), rd_ip.val);
                    345:                      break;
                    346: 
                    347:                    default:
                    348:                       vty_out (vty, "unknown RD type");
                    349:                    }
                    350: 
                    351: 
                    352:                     vty_out (vty, "%s", VTY_NEWLINE);
                    353:                     rd_header = 0;
                    354:                   }
                    355:                 route_vty_out_tmp (vty, &rm->p, attr, SAFI_ENCAP);
                    356:               }
                    357:         }
                    358:     }
                    359:   return CMD_SUCCESS;
                    360: }
                    361: 
                    362: enum bgp_show_type
                    363: {
                    364:   bgp_show_type_normal,
                    365:   bgp_show_type_regexp,
                    366:   bgp_show_type_prefix_list,
                    367:   bgp_show_type_filter_list,
                    368:   bgp_show_type_neighbor,
                    369:   bgp_show_type_cidr_only,
                    370:   bgp_show_type_prefix_longer,
                    371:   bgp_show_type_community_all,
                    372:   bgp_show_type_community,
                    373:   bgp_show_type_community_exact,
                    374:   bgp_show_type_community_list,
                    375:   bgp_show_type_community_list_exact
                    376: };
                    377: 
                    378: static int
                    379: bgp_show_encap (
                    380:     struct vty *vty,
                    381:     afi_t afi,
                    382:     struct prefix_rd *prd,
                    383:     enum bgp_show_type type,
                    384:     void *output_arg,
                    385:     int tags)
                    386: {
                    387:   struct bgp *bgp;
                    388:   struct bgp_table *table;
                    389:   struct bgp_node *rn;
                    390:   struct bgp_node *rm;
                    391:   struct bgp_info *ri;
                    392:   int rd_header;
                    393:   int header = 1;
                    394:   char v4_header[] = "   Network          Next Hop            Metric LocPrf Weight Path%s";
                    395:   char v4_header_tag[] = "   Network          Next Hop      In tag/Out tag%s";
                    396: 
                    397:   unsigned long output_count = 0;
                    398:   unsigned long total_count  = 0;
                    399: 
                    400:   bgp = bgp_get_default ();
                    401:   if (bgp == NULL)
                    402:     {
                    403:       vty_out (vty, "No BGP process is configured%s", VTY_NEWLINE);
                    404:       return CMD_WARNING;
                    405:     }
                    406: 
                    407:   if ((afi != AFI_IP) && (afi != AFI_IP6)) {
                    408:       vty_out (vty, "Afi %d not supported%s", afi, VTY_NEWLINE);
                    409:       return CMD_WARNING;
                    410:   }
                    411:   
                    412:   for (rn = bgp_table_top (bgp->rib[afi][SAFI_ENCAP]); rn; rn = bgp_route_next (rn))
                    413:     {
                    414:       if (prd && memcmp (rn->p.u.val, prd->val, 8) != 0)
                    415:        continue;
                    416: 
                    417:       if ((table = rn->info) != NULL)
                    418:        {
                    419:          rd_header = 1;
                    420: 
                    421:          for (rm = bgp_table_top (table); rm; rm = bgp_route_next (rm))
                    422:            for (ri = rm->info; ri; ri = ri->next)
                    423:              {
                    424:                 total_count++;
                    425:                if (type == bgp_show_type_neighbor)
                    426:                  {
                    427:                    union sockunion *su = output_arg;
                    428: 
                    429:                    if (ri->peer->su_remote == NULL || ! sockunion_same(ri->peer->su_remote, su))
                    430:                      continue;
                    431:                  }
                    432:                if (header)
                    433:                  {
                    434:                    if (tags)
                    435:                      vty_out (vty, v4_header_tag, VTY_NEWLINE);
                    436:                    else
                    437:                      {
                    438:                        vty_out (vty, "BGP table version is 0, local router ID is %s%s",
                    439:                                 inet_ntoa (bgp->router_id), VTY_NEWLINE);
                    440:                        vty_out (vty, "Status codes: s suppressed, d damped, h history, * valid, > best, i - internal%s",
                    441:                                 VTY_NEWLINE);
                    442:                        vty_out (vty, "Origin codes: i - IGP, e - EGP, ? - incomplete%s%s",
                    443:                                 VTY_NEWLINE, VTY_NEWLINE);
                    444:                        vty_out (vty, v4_header, VTY_NEWLINE);
                    445:                      }
                    446:                    header = 0;
                    447:                  }
                    448: 
                    449:                if (rd_header)
                    450:                  {
                    451:                    u_int16_t type;
                    452:                    struct rd_as rd_as;
                    453:                    struct rd_ip rd_ip;
                    454:                    u_char *pnt;
                    455: 
                    456:                    pnt = rn->p.u.val;
                    457: 
                    458:                    /* Decode RD type. */
                    459:                    type = decode_rd_type (pnt);
                    460: 
                    461:                    vty_out (vty, "Route Distinguisher: ");
                    462: 
                    463:                    switch (type) {
                    464: 
                    465:                    case RD_TYPE_AS:
                    466:                      decode_rd_as (pnt + 2, &rd_as);
                    467:                      vty_out (vty, "%u:%d", rd_as.as, rd_as.val);
                    468:                      break;
                    469: 
                    470:                    case RD_TYPE_IP:
                    471:                      decode_rd_ip (pnt + 2, &rd_ip);
                    472:                      vty_out (vty, "%s:%d", inet_ntoa (rd_ip.ip), rd_ip.val);
                    473:                      break;
                    474: 
                    475:                    default:
                    476:                      vty_out (vty, "Unknown RD type");
                    477:                      break;
                    478:                    }
                    479: 
                    480:                    vty_out (vty, "%s", VTY_NEWLINE);             
                    481:                    rd_header = 0;
                    482:                  }
                    483:                if (tags)
                    484:                  route_vty_out_tag (vty, &rm->p, ri, 0, SAFI_ENCAP);
                    485:                else
                    486:                  route_vty_out (vty, &rm->p, ri, 0, SAFI_ENCAP);
                    487:                 output_count++;
                    488:              }
                    489:         }
                    490:     }
                    491: 
                    492:   if (output_count == 0)
                    493:     {
                    494:         vty_out (vty, "No prefixes displayed, %ld exist%s", total_count, VTY_NEWLINE);
                    495:     }
                    496:   else
                    497:     vty_out (vty, "%sDisplayed %ld out of %ld total prefixes%s",
                    498:             VTY_NEWLINE, output_count, total_count, VTY_NEWLINE);
                    499: 
                    500:   return CMD_SUCCESS;
                    501: }
                    502: 
                    503: DEFUN (show_bgp_ipv4_encap,
                    504:        show_bgp_ipv4_encap_cmd,
                    505:        "show bgp ipv4 encap",
                    506:        SHOW_STR
                    507:        BGP_STR
                    508:        "Address Family\n"
                    509:        "Display ENCAP NLRI specific information\n")
                    510: {
                    511:   return bgp_show_encap (vty, AFI_IP, NULL, bgp_show_type_normal, NULL, 0);
                    512: }
                    513: 
                    514: DEFUN (show_bgp_ipv6_encap,
                    515:        show_bgp_ipv6_encap_cmd,
                    516:        "show bgp ipv6 encap",
                    517:        SHOW_STR
                    518:        BGP_STR
                    519:        "Address Family\n"
                    520:        "Display ENCAP NLRI specific information\n")
                    521: {
                    522:   return bgp_show_encap (vty, AFI_IP6, NULL, bgp_show_type_normal, NULL, 0);
                    523: }
                    524: 
                    525: DEFUN (show_bgp_ipv4_encap_rd,
                    526:        show_bgp_ipv4_encap_rd_cmd,
                    527:        "show bgp ipv4 encap rd ASN:nn_or_IP-address:nn",
                    528:        SHOW_STR
                    529:        BGP_STR
                    530:        "Address Family\n"
                    531:        "Display ENCAP NLRI specific information\n"
                    532:        "Display information for a route distinguisher\n"
                    533:        "ENCAP Route Distinguisher\n")
                    534: {
                    535:   int ret;
                    536:   struct prefix_rd prd;
                    537: 
                    538:   ret = str2prefix_rd (argv[0], &prd);
                    539:   if (! ret)
                    540:     {
                    541:       vty_out (vty, "%% Malformed Route Distinguisher%s", VTY_NEWLINE);
                    542:       return CMD_WARNING;
                    543:     }
                    544:   return bgp_show_encap (vty, AFI_IP, &prd, bgp_show_type_normal, NULL, 0);
                    545: }
                    546: 
                    547: DEFUN (show_bgp_ipv6_encap_rd,
                    548:        show_bgp_ipv6_encap_rd_cmd,
                    549:        "show bgp ipv6 encap rd ASN:nn_or_IP-address:nn",
                    550:        SHOW_STR
                    551:        BGP_STR
                    552:        "Address Family\n"
                    553:        "Display ENCAP NLRI specific information\n"
                    554:        "Display information for a route distinguisher\n"
                    555:        "ENCAP Route Distinguisher\n"
                    556:        "Display BGP tags for prefixes\n")
                    557: {
                    558:   int ret;
                    559:   struct prefix_rd prd;
                    560: 
                    561:   ret = str2prefix_rd (argv[0], &prd);
                    562:   if (! ret)
                    563:     {
                    564:       vty_out (vty, "%% Malformed Route Distinguisher%s", VTY_NEWLINE);
                    565:       return CMD_WARNING;
                    566:     }
                    567:   return bgp_show_encap (vty, AFI_IP6, &prd, bgp_show_type_normal, NULL, 0);
                    568: }
                    569: 
                    570: DEFUN (show_bgp_ipv4_encap_tags,
                    571:        show_bgp_ipv4_encap_tags_cmd,
                    572:        "show bgp ipv4 encap tags",
                    573:        SHOW_STR
                    574:        BGP_STR
                    575:        "Address Family\n"
                    576:        "Display ENCAP NLRI specific information\n"
                    577:        "Display BGP tags for prefixes\n")
                    578: {
                    579:   return bgp_show_encap (vty, AFI_IP, NULL, bgp_show_type_normal, NULL,  1);
                    580: }
                    581: 
                    582: DEFUN (show_bgp_ipv6_encap_tags,
                    583:        show_bgp_ipv6_encap_tags_cmd,
                    584:        "show bgp ipv6 encap tags",
                    585:        SHOW_STR
                    586:        BGP_STR
                    587:        "Address Family\n"
                    588:        "Display ENCAP NLRI specific information\n"
                    589:        "Display BGP tags for prefixes\n")
                    590: {
                    591:   return bgp_show_encap (vty, AFI_IP6, NULL, bgp_show_type_normal, NULL,  1);
                    592: }
                    593: 
                    594: 
                    595: DEFUN (show_bgp_ipv4_encap_rd_tags,
                    596:        show_bgp_ipv4_encap_rd_tags_cmd,
                    597:        "show bgp ipv4 encap rd ASN:nn_or_IP-address:nn tags",
                    598:        SHOW_STR
                    599:        BGP_STR
                    600:        "Address Family\n"
                    601:        "Display ENCAP NLRI specific information\n"
                    602:        "Display information for a route distinguisher\n"
                    603:        "ENCAP Route Distinguisher\n"
                    604:        "Display BGP tags for prefixes\n")
                    605: {
                    606:   int ret;
                    607:   struct prefix_rd prd;
                    608: 
                    609:   ret = str2prefix_rd (argv[0], &prd);
                    610:   if (! ret)
                    611:     {
                    612:       vty_out (vty, "%% Malformed Route Distinguisher%s", VTY_NEWLINE);
                    613:       return CMD_WARNING;
                    614:     }
                    615:   return bgp_show_encap (vty, AFI_IP, &prd, bgp_show_type_normal, NULL, 1);
                    616: }
                    617: 
                    618: DEFUN (show_bgp_ipv6_encap_rd_tags,
                    619:        show_bgp_ipv6_encap_rd_tags_cmd,
                    620:        "show bgp ipv6 encap rd ASN:nn_or_IP-address:nn tags",
                    621:        SHOW_STR
                    622:        BGP_STR
                    623:        "Address Family\n"
                    624:        "Display ENCAP NLRI specific information\n"
                    625:        "Display information for a route distinguisher\n"
                    626:        "ENCAP Route Distinguisher\n"
                    627:        "Display BGP tags for prefixes\n")
                    628: {
                    629:   int ret;
                    630:   struct prefix_rd prd;
                    631: 
                    632:   ret = str2prefix_rd (argv[0], &prd);
                    633:   if (! ret)
                    634:     {
                    635:       vty_out (vty, "%% Malformed Route Distinguisher%s", VTY_NEWLINE);
                    636:       return CMD_WARNING;
                    637:     }
                    638:   return bgp_show_encap (vty, AFI_IP6, &prd, bgp_show_type_normal, NULL, 1);
                    639: }
                    640: 
                    641: DEFUN (show_bgp_ipv4_encap_neighbor_routes,
                    642:        show_bgp_ipv4_encap_neighbor_routes_cmd,
                    643:        "show bgp ipv4 encap neighbors A.B.C.D routes",
                    644:        SHOW_STR
                    645:        BGP_STR
                    646:        "Address Family\n"
                    647:        "Display ENCAP NLRI specific information\n"
                    648:        "Detailed information on TCP and BGP neighbor connections\n"
                    649:        "Neighbor to display information about\n"
                    650:        "Display routes learned from neighbor\n")
                    651: {
                    652:   union sockunion *su;
                    653:   struct peer *peer;
                    654:   
                    655:   su = sockunion_str2su (argv[0]);
                    656:   if (su == NULL)
                    657:     {
                    658:       vty_out (vty, "Malformed address: %s%s", argv[0], VTY_NEWLINE);
                    659:                return CMD_WARNING;
                    660:     }
                    661: 
                    662:   peer = peer_lookup (NULL, su);
                    663:   if (! peer || ! peer->afc[AFI_IP][SAFI_ENCAP])
                    664:     {
                    665:       vty_out (vty, "%% No such neighbor or address family%s", VTY_NEWLINE);
                    666:       return CMD_WARNING;
                    667:     }
                    668: 
                    669:   return bgp_show_encap (vty, AFI_IP, NULL, bgp_show_type_neighbor, su, 0);
                    670: }
                    671: 
                    672: DEFUN (show_bgp_ipv6_encap_neighbor_routes,
                    673:        show_bgp_ipv6_encap_neighbor_routes_cmd,
                    674:        "show bgp ipv6 encap neighbors A.B.C.D routes",
                    675:        SHOW_STR
                    676:        BGP_STR
                    677:        "Address Family\n"
                    678:        "Display ENCAP NLRI specific information\n"
                    679:        "Detailed information on TCP and BGP neighbor connections\n"
                    680:        "Neighbor to display information about\n"
                    681:        "Display routes learned from neighbor\n")
                    682: {
                    683:   union sockunion *su;
                    684:   struct peer *peer;
                    685:   
                    686:   su = sockunion_str2su (argv[0]);
                    687:   if (su == NULL)
                    688:     {
                    689:       vty_out (vty, "Malformed address: %s%s", argv[0], VTY_NEWLINE);
                    690:                return CMD_WARNING;
                    691:     }
                    692: 
                    693:   peer = peer_lookup (NULL, su);
                    694:   if (! peer || ! peer->afc[AFI_IP6][SAFI_ENCAP])
                    695:     {
                    696:       vty_out (vty, "%% No such neighbor or address family%s", VTY_NEWLINE);
                    697:       return CMD_WARNING;
                    698:     }
                    699: 
                    700:   return bgp_show_encap (vty, AFI_IP6, NULL, bgp_show_type_neighbor, su, 0);
                    701: }
                    702: 
                    703: DEFUN (show_bgp_ipv4_encap_rd_neighbor_routes,
                    704:        show_bgp_ipv4_encap_rd_neighbor_routes_cmd,
                    705:        "show bgp ipv4 encap rd ASN:nn_or_IP-address:nn neighbors (A.B.C.D|X:X::X:X) routes",
                    706:        SHOW_STR
                    707:        BGP_STR
                    708:        "Address Family\n"
                    709:        "Display ENCAP NLRI specific information\n"
                    710:        "Display information for a route distinguisher\n"
                    711:        "ENCAP Route Distinguisher\n"
                    712:        "Detailed information on TCP and BGP neighbor connections\n"
                    713:        "Neighbor to display information about\n"
                    714:        "Neighbor to display information about\n"
                    715:        "Display routes learned from neighbor\n")
                    716: {
                    717:   int ret;
                    718:   union sockunion *su;
                    719:   struct peer *peer;
                    720:   struct prefix_rd prd;
                    721: 
                    722:   ret = str2prefix_rd (argv[0], &prd);
                    723:   if (! ret)
                    724:     {
                    725:       vty_out (vty, "%% Malformed Route Distinguisher%s", VTY_NEWLINE);
                    726:       return CMD_WARNING;
                    727:     }
                    728: 
                    729:   su = sockunion_str2su (argv[1]);
                    730:   if (su == NULL)
                    731:     {
                    732:       vty_out (vty, "Malformed address: %s%s", argv[1], VTY_NEWLINE);
                    733:                return CMD_WARNING;
                    734:     }
                    735: 
                    736:   peer = peer_lookup (NULL, su);
                    737:   if (! peer || ! peer->afc[AFI_IP][SAFI_ENCAP])
                    738:     {
                    739:       vty_out (vty, "%% No such neighbor or address family%s", VTY_NEWLINE);
                    740:       return CMD_WARNING;
                    741:     }
                    742: 
                    743:   return bgp_show_encap (vty, AFI_IP, &prd, bgp_show_type_neighbor, su, 0);
                    744: }
                    745: 
                    746: DEFUN (show_bgp_ipv6_encap_rd_neighbor_routes,
                    747:        show_bgp_ipv6_encap_rd_neighbor_routes_cmd,
                    748:        "show bgp ipv6 encap rd ASN:nn_or_IP-address:nn neighbors (A.B.C.D|X:X::X:X) routes",
                    749:        SHOW_STR
                    750:        BGP_STR
                    751:        "Address Family\n"
                    752:        "Display ENCAP NLRI specific information\n"
                    753:        "Display information for a route distinguisher\n"
                    754:        "ENCAP Route Distinguisher\n"
                    755:        "Detailed information on TCP and BGP neighbor connections\n"
                    756:        "Neighbor to display information about\n"
                    757:        "Neighbor to display information about\n"
                    758:        "Display routes learned from neighbor\n")
                    759: {
                    760:   int ret;
                    761:   union sockunion *su;
                    762:   struct peer *peer;
                    763:   struct prefix_rd prd;
                    764: 
                    765:   ret = str2prefix_rd (argv[0], &prd);
                    766:   if (! ret)
                    767:     {
                    768:       vty_out (vty, "%% Malformed Route Distinguisher%s", VTY_NEWLINE);
                    769:       return CMD_WARNING;
                    770:     }
                    771: 
                    772:   su = sockunion_str2su (argv[1]);
                    773:   if (su == NULL)
                    774:     {
                    775:       vty_out (vty, "Malformed address: %s%s", argv[1], VTY_NEWLINE);
                    776:                return CMD_WARNING;
                    777:     }
                    778: 
                    779:   peer = peer_lookup (NULL, su);
                    780:   if (! peer || ! peer->afc[AFI_IP6][SAFI_ENCAP])
                    781:     {
                    782:       vty_out (vty, "%% No such neighbor or address family%s", VTY_NEWLINE);
                    783:       return CMD_WARNING;
                    784:     }
                    785: 
                    786:   return bgp_show_encap (vty, AFI_IP6, &prd, bgp_show_type_neighbor, su, 0);
                    787: }
                    788: 
                    789: DEFUN (show_bgp_ipv4_encap_neighbor_advertised_routes,
                    790:        show_bgp_ipv4_encap_neighbor_advertised_routes_cmd,
                    791:        "show bgp ipv4 encap neighbors A.B.C.D advertised-routes",
                    792:        SHOW_STR
                    793:        BGP_STR
                    794:        "Address Family\n"
                    795:        "Display ENCAP NLRI specific information\n"
                    796:        "Detailed information on TCP and BGP neighbor connections\n"
                    797:        "Neighbor to display information about\n"
                    798:        "Display the routes advertised to a BGP neighbor\n")
                    799: {
                    800:   int ret;
                    801:   struct peer *peer;
                    802:   union sockunion su;
                    803: 
                    804:   ret = str2sockunion (argv[0], &su);
                    805:   if (ret < 0)
                    806:     {
                    807:       vty_out (vty, "%% Malformed address: %s%s", argv[0], VTY_NEWLINE);
                    808:       return CMD_WARNING;
                    809:     }
                    810:   peer = peer_lookup (NULL, &su);
                    811:   if (! peer || ! peer->afc[AFI_IP][SAFI_ENCAP])
                    812:     {
                    813:       vty_out (vty, "%% No such neighbor or address family%s", VTY_NEWLINE);
                    814:       return CMD_WARNING;
                    815:     }
                    816: 
                    817:   return show_adj_route_encap (vty, peer, NULL);
                    818: }
                    819: 
                    820: DEFUN (show_bgp_ipv6_encap_neighbor_advertised_routes,
                    821:        show_bgp_ipv6_encap_neighbor_advertised_routes_cmd,
                    822:        "show bgp ipv6 encap neighbors A.B.C.D advertised-routes",
                    823:        SHOW_STR
                    824:        BGP_STR
                    825:        "Address Family\n"
                    826:        "Display ENCAP NLRI specific information\n"
                    827:        "Detailed information on TCP and BGP neighbor connections\n"
                    828:        "Neighbor to display information about\n"
                    829:        "Display the routes advertised to a BGP neighbor\n")
                    830: {
                    831:   int ret;
                    832:   struct peer *peer;
                    833:   union sockunion su;
                    834: 
                    835:   ret = str2sockunion (argv[0], &su);
                    836:   if (ret < 0)
                    837:     {
                    838:       vty_out (vty, "%% Malformed address: %s%s", argv[0], VTY_NEWLINE);
                    839:       return CMD_WARNING;
                    840:     }
                    841:   peer = peer_lookup (NULL, &su);
                    842:   if (! peer || ! peer->afc[AFI_IP6][SAFI_ENCAP])
                    843:     {
                    844:       vty_out (vty, "%% No such neighbor or address family%s", VTY_NEWLINE);
                    845:       return CMD_WARNING;
                    846:     }
                    847: 
                    848:   return show_adj_route_encap (vty, peer, NULL);
                    849: }
                    850: 
                    851: DEFUN (show_bgp_ipv4_encap_rd_neighbor_advertised_routes,
                    852:        show_bgp_ipv4_encap_rd_neighbor_advertised_routes_cmd,
                    853:        "show bgp ipv4 encap rd ASN:nn_or_IP-address:nn neighbors (A.B.C.D|X:X::X:X) advertised-routes",
                    854:        SHOW_STR
                    855:        BGP_STR
                    856:        "Address Family\n"
                    857:        "Display ENCAP NLRI specific information\n"
                    858:        "Display information for a route distinguisher\n"
                    859:        "ENCAP Route Distinguisher\n"
                    860:        "Detailed information on TCP and BGP neighbor connections\n"
                    861:        "Neighbor to display information about\n"
                    862:        "Neighbor to display information about\n"
                    863:        "Display the routes advertised to a BGP neighbor\n")
                    864: {
                    865:   int ret;
                    866:   struct peer *peer;
                    867:   struct prefix_rd prd;
                    868:   union sockunion su;
                    869: 
                    870:   ret = str2sockunion (argv[1], &su);
                    871:   if (ret < 0)
                    872:     {
                    873:       vty_out (vty, "%% Malformed address: %s%s", argv[1], VTY_NEWLINE);
                    874:       return CMD_WARNING;
                    875:     }
                    876:   peer = peer_lookup (NULL, &su);
                    877:   if (! peer || ! peer->afc[AFI_IP][SAFI_ENCAP])
                    878:     {
                    879:       vty_out (vty, "%% No such neighbor or address family%s", VTY_NEWLINE);
                    880:       return CMD_WARNING;
                    881:     }
                    882: 
                    883:   ret = str2prefix_rd (argv[0], &prd);
                    884:   if (! ret)
                    885:     {
                    886:       vty_out (vty, "%% Malformed Route Distinguisher%s", VTY_NEWLINE);
                    887:       return CMD_WARNING;
                    888:     }
                    889: 
                    890:   return show_adj_route_encap (vty, peer, &prd);
                    891: }
                    892: 
                    893: DEFUN (show_bgp_ipv6_encap_rd_neighbor_advertised_routes,
                    894:        show_bgp_ipv6_encap_rd_neighbor_advertised_routes_cmd,
                    895:        "show bgp ipv6 encap rd ASN:nn_or_IP-address:nn neighbors (A.B.C.D|X:X::X:X) advertised-routes",
                    896:        SHOW_STR
                    897:        BGP_STR
                    898:        "Address Family\n"
                    899:        "Display ENCAP NLRI specific information\n"
                    900:        "Display information for a route distinguisher\n"
                    901:        "ENCAP Route Distinguisher\n"
                    902:        "Detailed information on TCP and BGP neighbor connections\n"
                    903:        "Neighbor to display information about\n"
                    904:        "Neighbor to display information about\n"
                    905:        "Display the routes advertised to a BGP neighbor\n")
                    906: {
                    907:   int ret;
                    908:   struct peer *peer;
                    909:   struct prefix_rd prd;
                    910:   union sockunion su;
                    911: 
                    912:   ret = str2sockunion (argv[1], &su);
                    913:   if (ret < 0)
                    914:     {
                    915:       vty_out (vty, "%% Malformed address: %s%s", argv[1], VTY_NEWLINE);
                    916:       return CMD_WARNING;
                    917:     }
                    918:   peer = peer_lookup (NULL, &su);
                    919:   if (! peer || ! peer->afc[AFI_IP6][SAFI_ENCAP])
                    920:     {
                    921:       vty_out (vty, "%% No such neighbor or address family%s", VTY_NEWLINE);
                    922:       return CMD_WARNING;
                    923:     }
                    924: 
                    925:   ret = str2prefix_rd (argv[0], &prd);
                    926:   if (! ret)
                    927:     {
                    928:       vty_out (vty, "%% Malformed Route Distinguisher%s", VTY_NEWLINE);
                    929:       return CMD_WARNING;
                    930:     }
                    931: 
                    932:   return show_adj_route_encap (vty, peer, &prd);
                    933: }
                    934: 
                    935: void
                    936: bgp_encap_init (void)
                    937: {
                    938:   install_element (BGP_ENCAP_NODE, &encap_network_cmd);
                    939:   install_element (BGP_ENCAP_NODE, &no_encap_network_cmd);
                    940: 
                    941:   install_element (VIEW_NODE, &show_bgp_ipv4_encap_cmd);
                    942:   install_element (VIEW_NODE, &show_bgp_ipv4_encap_rd_cmd);
                    943:   install_element (VIEW_NODE, &show_bgp_ipv4_encap_tags_cmd);
                    944:   install_element (VIEW_NODE, &show_bgp_ipv4_encap_rd_tags_cmd);
                    945:   install_element (VIEW_NODE, &show_bgp_ipv4_encap_neighbor_routes_cmd);
                    946:   install_element (VIEW_NODE, &show_bgp_ipv4_encap_rd_neighbor_routes_cmd);
                    947:   install_element (VIEW_NODE, &show_bgp_ipv4_encap_neighbor_advertised_routes_cmd);
                    948:   install_element (VIEW_NODE, &show_bgp_ipv4_encap_rd_neighbor_advertised_routes_cmd);
                    949: 
                    950:   install_element (VIEW_NODE, &show_bgp_ipv6_encap_cmd);
                    951:   install_element (VIEW_NODE, &show_bgp_ipv6_encap_rd_cmd);
                    952:   install_element (VIEW_NODE, &show_bgp_ipv6_encap_tags_cmd);
                    953:   install_element (VIEW_NODE, &show_bgp_ipv6_encap_rd_tags_cmd);
                    954:   install_element (VIEW_NODE, &show_bgp_ipv6_encap_neighbor_routes_cmd);
                    955:   install_element (VIEW_NODE, &show_bgp_ipv6_encap_rd_neighbor_routes_cmd);
                    956:   install_element (VIEW_NODE, &show_bgp_ipv6_encap_neighbor_advertised_routes_cmd);
                    957:   install_element (VIEW_NODE, &show_bgp_ipv6_encap_rd_neighbor_advertised_routes_cmd);
                    958: 
                    959:   install_element (ENABLE_NODE, &show_bgp_ipv4_encap_cmd);
                    960:   install_element (ENABLE_NODE, &show_bgp_ipv4_encap_rd_cmd);
                    961:   install_element (ENABLE_NODE, &show_bgp_ipv4_encap_tags_cmd);
                    962:   install_element (ENABLE_NODE, &show_bgp_ipv4_encap_rd_tags_cmd);
                    963:   install_element (ENABLE_NODE, &show_bgp_ipv4_encap_neighbor_routes_cmd);
                    964:   install_element (ENABLE_NODE, &show_bgp_ipv4_encap_rd_neighbor_routes_cmd);
                    965:   install_element (ENABLE_NODE, &show_bgp_ipv4_encap_neighbor_advertised_routes_cmd);
                    966:   install_element (ENABLE_NODE, &show_bgp_ipv4_encap_rd_neighbor_advertised_routes_cmd);
                    967: 
                    968:   install_element (ENABLE_NODE, &show_bgp_ipv6_encap_cmd);
                    969:   install_element (ENABLE_NODE, &show_bgp_ipv6_encap_rd_cmd);
                    970:   install_element (ENABLE_NODE, &show_bgp_ipv6_encap_tags_cmd);
                    971:   install_element (ENABLE_NODE, &show_bgp_ipv6_encap_rd_tags_cmd);
                    972:   install_element (ENABLE_NODE, &show_bgp_ipv6_encap_neighbor_routes_cmd);
                    973:   install_element (ENABLE_NODE, &show_bgp_ipv6_encap_rd_neighbor_routes_cmd);
                    974:   install_element (ENABLE_NODE, &show_bgp_ipv6_encap_neighbor_advertised_routes_cmd);
                    975:   install_element (ENABLE_NODE, &show_bgp_ipv6_encap_rd_neighbor_advertised_routes_cmd);
                    976: 
                    977: }

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