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>