Annotation of embedaddon/quagga/bgpd/bgp_encap.c, revision 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>