Annotation of embedaddon/quagga/bgpd/bgp_route.c, revision 1.1
1.1 ! misho 1: /* BGP routing information
! 2: Copyright (C) 1996, 97, 98, 99 Kunihiro Ishiguro
! 3:
! 4: This file is part of GNU Zebra.
! 5:
! 6: GNU Zebra is free software; you can redistribute it and/or modify it
! 7: under the terms of the GNU General Public License as published by the
! 8: Free Software Foundation; either version 2, or (at your option) any
! 9: later version.
! 10:
! 11: GNU Zebra is distributed in the hope that it will be useful, but
! 12: WITHOUT ANY WARRANTY; without even the implied warranty of
! 13: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
! 14: General Public License for more details.
! 15:
! 16: You should have received a copy of the GNU General Public License
! 17: along with GNU Zebra; see the file COPYING. If not, write to the Free
! 18: Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
! 19: 02111-1307, USA. */
! 20:
! 21: #include <zebra.h>
! 22:
! 23: #include "prefix.h"
! 24: #include "linklist.h"
! 25: #include "memory.h"
! 26: #include "command.h"
! 27: #include "stream.h"
! 28: #include "filter.h"
! 29: #include "str.h"
! 30: #include "log.h"
! 31: #include "routemap.h"
! 32: #include "buffer.h"
! 33: #include "sockunion.h"
! 34: #include "plist.h"
! 35: #include "thread.h"
! 36: #include "workqueue.h"
! 37:
! 38: #include "bgpd/bgpd.h"
! 39: #include "bgpd/bgp_table.h"
! 40: #include "bgpd/bgp_route.h"
! 41: #include "bgpd/bgp_attr.h"
! 42: #include "bgpd/bgp_debug.h"
! 43: #include "bgpd/bgp_aspath.h"
! 44: #include "bgpd/bgp_regex.h"
! 45: #include "bgpd/bgp_community.h"
! 46: #include "bgpd/bgp_ecommunity.h"
! 47: #include "bgpd/bgp_clist.h"
! 48: #include "bgpd/bgp_packet.h"
! 49: #include "bgpd/bgp_filter.h"
! 50: #include "bgpd/bgp_fsm.h"
! 51: #include "bgpd/bgp_mplsvpn.h"
! 52: #include "bgpd/bgp_nexthop.h"
! 53: #include "bgpd/bgp_damp.h"
! 54: #include "bgpd/bgp_advertise.h"
! 55: #include "bgpd/bgp_zebra.h"
! 56: #include "bgpd/bgp_vty.h"
! 57:
! 58: /* Extern from bgp_dump.c */
! 59: extern const char *bgp_origin_str[];
! 60: extern const char *bgp_origin_long_str[];
! 61:
! 62: static struct bgp_node *
! 63: bgp_afi_node_get (struct bgp_table *table, afi_t afi, safi_t safi, struct prefix *p,
! 64: struct prefix_rd *prd)
! 65: {
! 66: struct bgp_node *rn;
! 67: struct bgp_node *prn = NULL;
! 68:
! 69: assert (table);
! 70: if (!table)
! 71: return NULL;
! 72:
! 73: if (safi == SAFI_MPLS_VPN)
! 74: {
! 75: prn = bgp_node_get (table, (struct prefix *) prd);
! 76:
! 77: if (prn->info == NULL)
! 78: prn->info = bgp_table_init (afi, safi);
! 79: else
! 80: bgp_unlock_node (prn);
! 81: table = prn->info;
! 82: }
! 83:
! 84: rn = bgp_node_get (table, p);
! 85:
! 86: if (safi == SAFI_MPLS_VPN)
! 87: rn->prn = prn;
! 88:
! 89: return rn;
! 90: }
! 91:
! 92: /* Allocate bgp_info_extra */
! 93: static struct bgp_info_extra *
! 94: bgp_info_extra_new (void)
! 95: {
! 96: struct bgp_info_extra *new;
! 97: new = XCALLOC (MTYPE_BGP_ROUTE_EXTRA, sizeof (struct bgp_info_extra));
! 98: return new;
! 99: }
! 100:
! 101: static void
! 102: bgp_info_extra_free (struct bgp_info_extra **extra)
! 103: {
! 104: if (extra && *extra)
! 105: {
! 106: if ((*extra)->damp_info)
! 107: bgp_damp_info_free ((*extra)->damp_info, 0);
! 108:
! 109: (*extra)->damp_info = NULL;
! 110:
! 111: XFREE (MTYPE_BGP_ROUTE_EXTRA, *extra);
! 112:
! 113: *extra = NULL;
! 114: }
! 115: }
! 116:
! 117: /* Get bgp_info extra information for the given bgp_info, lazy allocated
! 118: * if required.
! 119: */
! 120: struct bgp_info_extra *
! 121: bgp_info_extra_get (struct bgp_info *ri)
! 122: {
! 123: if (!ri->extra)
! 124: ri->extra = bgp_info_extra_new();
! 125: return ri->extra;
! 126: }
! 127:
! 128: /* Allocate new bgp info structure. */
! 129: static struct bgp_info *
! 130: bgp_info_new (void)
! 131: {
! 132: return XCALLOC (MTYPE_BGP_ROUTE, sizeof (struct bgp_info));
! 133: }
! 134:
! 135: /* Free bgp route information. */
! 136: static void
! 137: bgp_info_free (struct bgp_info *binfo)
! 138: {
! 139: if (binfo->attr)
! 140: bgp_attr_unintern (&binfo->attr);
! 141:
! 142: bgp_info_extra_free (&binfo->extra);
! 143:
! 144: peer_unlock (binfo->peer); /* bgp_info peer reference */
! 145:
! 146: XFREE (MTYPE_BGP_ROUTE, binfo);
! 147: }
! 148:
! 149: struct bgp_info *
! 150: bgp_info_lock (struct bgp_info *binfo)
! 151: {
! 152: binfo->lock++;
! 153: return binfo;
! 154: }
! 155:
! 156: struct bgp_info *
! 157: bgp_info_unlock (struct bgp_info *binfo)
! 158: {
! 159: assert (binfo && binfo->lock > 0);
! 160: binfo->lock--;
! 161:
! 162: if (binfo->lock == 0)
! 163: {
! 164: #if 0
! 165: zlog_debug ("%s: unlocked and freeing", __func__);
! 166: zlog_backtrace (LOG_DEBUG);
! 167: #endif
! 168: bgp_info_free (binfo);
! 169: return NULL;
! 170: }
! 171:
! 172: #if 0
! 173: if (binfo->lock == 1)
! 174: {
! 175: zlog_debug ("%s: unlocked to 1", __func__);
! 176: zlog_backtrace (LOG_DEBUG);
! 177: }
! 178: #endif
! 179:
! 180: return binfo;
! 181: }
! 182:
! 183: void
! 184: bgp_info_add (struct bgp_node *rn, struct bgp_info *ri)
! 185: {
! 186: struct bgp_info *top;
! 187:
! 188: top = rn->info;
! 189:
! 190: ri->next = rn->info;
! 191: ri->prev = NULL;
! 192: if (top)
! 193: top->prev = ri;
! 194: rn->info = ri;
! 195:
! 196: bgp_info_lock (ri);
! 197: bgp_lock_node (rn);
! 198: peer_lock (ri->peer); /* bgp_info peer reference */
! 199: }
! 200:
! 201: /* Do the actual removal of info from RIB, for use by bgp_process
! 202: completion callback *only* */
! 203: static void
! 204: bgp_info_reap (struct bgp_node *rn, struct bgp_info *ri)
! 205: {
! 206: if (ri->next)
! 207: ri->next->prev = ri->prev;
! 208: if (ri->prev)
! 209: ri->prev->next = ri->next;
! 210: else
! 211: rn->info = ri->next;
! 212:
! 213: bgp_info_unlock (ri);
! 214: bgp_unlock_node (rn);
! 215: }
! 216:
! 217: void
! 218: bgp_info_delete (struct bgp_node *rn, struct bgp_info *ri)
! 219: {
! 220: bgp_info_set_flag (rn, ri, BGP_INFO_REMOVED);
! 221: /* set of previous already took care of pcount */
! 222: UNSET_FLAG (ri->flags, BGP_INFO_VALID);
! 223: }
! 224:
! 225: /* undo the effects of a previous call to bgp_info_delete; typically
! 226: called when a route is deleted and then quickly re-added before the
! 227: deletion has been processed */
! 228: static void
! 229: bgp_info_restore (struct bgp_node *rn, struct bgp_info *ri)
! 230: {
! 231: bgp_info_unset_flag (rn, ri, BGP_INFO_REMOVED);
! 232: /* unset of previous already took care of pcount */
! 233: SET_FLAG (ri->flags, BGP_INFO_VALID);
! 234: }
! 235:
! 236: /* Adjust pcount as required */
! 237: static void
! 238: bgp_pcount_adjust (struct bgp_node *rn, struct bgp_info *ri)
! 239: {
! 240: assert (rn && rn->table);
! 241: assert (ri && ri->peer && ri->peer->bgp);
! 242:
! 243: /* Ignore 'pcount' for RS-client tables */
! 244: if (rn->table->type != BGP_TABLE_MAIN
! 245: || ri->peer == ri->peer->bgp->peer_self)
! 246: return;
! 247:
! 248: if (BGP_INFO_HOLDDOWN (ri)
! 249: && CHECK_FLAG (ri->flags, BGP_INFO_COUNTED))
! 250: {
! 251:
! 252: UNSET_FLAG (ri->flags, BGP_INFO_COUNTED);
! 253:
! 254: /* slight hack, but more robust against errors. */
! 255: if (ri->peer->pcount[rn->table->afi][rn->table->safi])
! 256: ri->peer->pcount[rn->table->afi][rn->table->safi]--;
! 257: else
! 258: {
! 259: zlog_warn ("%s: Asked to decrement 0 prefix count for peer %s",
! 260: __func__, ri->peer->host);
! 261: zlog_backtrace (LOG_WARNING);
! 262: zlog_warn ("%s: Please report to Quagga bugzilla", __func__);
! 263: }
! 264: }
! 265: else if (!BGP_INFO_HOLDDOWN (ri)
! 266: && !CHECK_FLAG (ri->flags, BGP_INFO_COUNTED))
! 267: {
! 268: SET_FLAG (ri->flags, BGP_INFO_COUNTED);
! 269: ri->peer->pcount[rn->table->afi][rn->table->safi]++;
! 270: }
! 271: }
! 272:
! 273:
! 274: /* Set/unset bgp_info flags, adjusting any other state as needed.
! 275: * This is here primarily to keep prefix-count in check.
! 276: */
! 277: void
! 278: bgp_info_set_flag (struct bgp_node *rn, struct bgp_info *ri, u_int32_t flag)
! 279: {
! 280: SET_FLAG (ri->flags, flag);
! 281:
! 282: /* early bath if we know it's not a flag that changes useability state */
! 283: if (!CHECK_FLAG (flag, BGP_INFO_VALID|BGP_INFO_UNUSEABLE))
! 284: return;
! 285:
! 286: bgp_pcount_adjust (rn, ri);
! 287: }
! 288:
! 289: void
! 290: bgp_info_unset_flag (struct bgp_node *rn, struct bgp_info *ri, u_int32_t flag)
! 291: {
! 292: UNSET_FLAG (ri->flags, flag);
! 293:
! 294: /* early bath if we know it's not a flag that changes useability state */
! 295: if (!CHECK_FLAG (flag, BGP_INFO_VALID|BGP_INFO_UNUSEABLE))
! 296: return;
! 297:
! 298: bgp_pcount_adjust (rn, ri);
! 299: }
! 300:
! 301: /* Get MED value. If MED value is missing and "bgp bestpath
! 302: missing-as-worst" is specified, treat it as the worst value. */
! 303: static u_int32_t
! 304: bgp_med_value (struct attr *attr, struct bgp *bgp)
! 305: {
! 306: if (attr->flag & ATTR_FLAG_BIT (BGP_ATTR_MULTI_EXIT_DISC))
! 307: return attr->med;
! 308: else
! 309: {
! 310: if (bgp_flag_check (bgp, BGP_FLAG_MED_MISSING_AS_WORST))
! 311: return BGP_MED_MAX;
! 312: else
! 313: return 0;
! 314: }
! 315: }
! 316:
! 317: /* Compare two bgp route entity. br is preferable then return 1. */
! 318: static int
! 319: bgp_info_cmp (struct bgp *bgp, struct bgp_info *new, struct bgp_info *exist)
! 320: {
! 321: u_int32_t new_pref;
! 322: u_int32_t exist_pref;
! 323: u_int32_t new_med;
! 324: u_int32_t exist_med;
! 325: u_int32_t new_weight = 0;
! 326: u_int32_t exist_weight = 0;
! 327: struct in_addr new_id;
! 328: struct in_addr exist_id;
! 329: int new_cluster;
! 330: int exist_cluster;
! 331: int internal_as_route = 0;
! 332: int confed_as_route = 0;
! 333: int ret;
! 334:
! 335: /* 0. Null check. */
! 336: if (new == NULL)
! 337: return 0;
! 338: if (exist == NULL)
! 339: return 1;
! 340:
! 341: /* 1. Weight check. */
! 342: if (new->attr->extra)
! 343: new_weight = new->attr->extra->weight;
! 344: if (exist->attr->extra)
! 345: exist_weight = exist->attr->extra->weight;
! 346: if (new_weight > exist_weight)
! 347: return 1;
! 348: if (new_weight < exist_weight)
! 349: return 0;
! 350:
! 351: /* 2. Local preference check. */
! 352: if (new->attr->flag & ATTR_FLAG_BIT (BGP_ATTR_LOCAL_PREF))
! 353: new_pref = new->attr->local_pref;
! 354: else
! 355: new_pref = bgp->default_local_pref;
! 356:
! 357: if (exist->attr->flag & ATTR_FLAG_BIT (BGP_ATTR_LOCAL_PREF))
! 358: exist_pref = exist->attr->local_pref;
! 359: else
! 360: exist_pref = bgp->default_local_pref;
! 361:
! 362: if (new_pref > exist_pref)
! 363: return 1;
! 364: if (new_pref < exist_pref)
! 365: return 0;
! 366:
! 367: /* 3. Local route check. */
! 368: if (new->sub_type == BGP_ROUTE_STATIC)
! 369: return 1;
! 370: if (exist->sub_type == BGP_ROUTE_STATIC)
! 371: return 0;
! 372:
! 373: if (new->sub_type == BGP_ROUTE_REDISTRIBUTE)
! 374: return 1;
! 375: if (exist->sub_type == BGP_ROUTE_REDISTRIBUTE)
! 376: return 0;
! 377:
! 378: if (new->sub_type == BGP_ROUTE_AGGREGATE)
! 379: return 1;
! 380: if (exist->sub_type == BGP_ROUTE_AGGREGATE)
! 381: return 0;
! 382:
! 383: /* 4. AS path length check. */
! 384: if (! bgp_flag_check (bgp, BGP_FLAG_ASPATH_IGNORE))
! 385: {
! 386: int exist_hops = aspath_count_hops (exist->attr->aspath);
! 387: int exist_confeds = aspath_count_confeds (exist->attr->aspath);
! 388:
! 389: if (bgp_flag_check (bgp, BGP_FLAG_ASPATH_CONFED))
! 390: {
! 391: int aspath_hops;
! 392:
! 393: aspath_hops = aspath_count_hops (new->attr->aspath);
! 394: aspath_hops += aspath_count_confeds (new->attr->aspath);
! 395:
! 396: if ( aspath_hops < (exist_hops + exist_confeds))
! 397: return 1;
! 398: if ( aspath_hops > (exist_hops + exist_confeds))
! 399: return 0;
! 400: }
! 401: else
! 402: {
! 403: int newhops = aspath_count_hops (new->attr->aspath);
! 404:
! 405: if (newhops < exist_hops)
! 406: return 1;
! 407: if (newhops > exist_hops)
! 408: return 0;
! 409: }
! 410: }
! 411:
! 412: /* 5. Origin check. */
! 413: if (new->attr->origin < exist->attr->origin)
! 414: return 1;
! 415: if (new->attr->origin > exist->attr->origin)
! 416: return 0;
! 417:
! 418: /* 6. MED check. */
! 419: internal_as_route = (aspath_count_hops (new->attr->aspath) == 0
! 420: && aspath_count_hops (exist->attr->aspath) == 0);
! 421: confed_as_route = (aspath_count_confeds (new->attr->aspath) > 0
! 422: && aspath_count_confeds (exist->attr->aspath) > 0
! 423: && aspath_count_hops (new->attr->aspath) == 0
! 424: && aspath_count_hops (exist->attr->aspath) == 0);
! 425:
! 426: if (bgp_flag_check (bgp, BGP_FLAG_ALWAYS_COMPARE_MED)
! 427: || (bgp_flag_check (bgp, BGP_FLAG_MED_CONFED)
! 428: && confed_as_route)
! 429: || aspath_cmp_left (new->attr->aspath, exist->attr->aspath)
! 430: || aspath_cmp_left_confed (new->attr->aspath, exist->attr->aspath)
! 431: || internal_as_route)
! 432: {
! 433: new_med = bgp_med_value (new->attr, bgp);
! 434: exist_med = bgp_med_value (exist->attr, bgp);
! 435:
! 436: if (new_med < exist_med)
! 437: return 1;
! 438: if (new_med > exist_med)
! 439: return 0;
! 440: }
! 441:
! 442: /* 7. Peer type check. */
! 443: if (peer_sort (new->peer) == BGP_PEER_EBGP
! 444: && peer_sort (exist->peer) == BGP_PEER_IBGP)
! 445: return 1;
! 446: if (peer_sort (new->peer) == BGP_PEER_EBGP
! 447: && peer_sort (exist->peer) == BGP_PEER_CONFED)
! 448: return 1;
! 449: if (peer_sort (new->peer) == BGP_PEER_IBGP
! 450: && peer_sort (exist->peer) == BGP_PEER_EBGP)
! 451: return 0;
! 452: if (peer_sort (new->peer) == BGP_PEER_CONFED
! 453: && peer_sort (exist->peer) == BGP_PEER_EBGP)
! 454: return 0;
! 455:
! 456: /* 8. IGP metric check. */
! 457: if (new->extra || exist->extra)
! 458: {
! 459: uint32_t newm = (new->extra ? new->extra->igpmetric : 0);
! 460: uint32_t existm = (exist->extra ? exist->extra->igpmetric : 0);
! 461:
! 462: if (newm < existm)
! 463: return 1;
! 464: if (newm > existm)
! 465: return 0;
! 466: }
! 467:
! 468: /* 9. Maximum path check. */
! 469:
! 470: /* 10. If both paths are external, prefer the path that was received
! 471: first (the oldest one). This step minimizes route-flap, since a
! 472: newer path won't displace an older one, even if it was the
! 473: preferred route based on the additional decision criteria below. */
! 474: if (! bgp_flag_check (bgp, BGP_FLAG_COMPARE_ROUTER_ID)
! 475: && peer_sort (new->peer) == BGP_PEER_EBGP
! 476: && peer_sort (exist->peer) == BGP_PEER_EBGP)
! 477: {
! 478: if (CHECK_FLAG (new->flags, BGP_INFO_SELECTED))
! 479: return 1;
! 480: if (CHECK_FLAG (exist->flags, BGP_INFO_SELECTED))
! 481: return 0;
! 482: }
! 483:
! 484: /* 11. Rourter-ID comparision. */
! 485: if (new->attr->flag & ATTR_FLAG_BIT(BGP_ATTR_ORIGINATOR_ID))
! 486: new_id.s_addr = new->attr->extra->originator_id.s_addr;
! 487: else
! 488: new_id.s_addr = new->peer->remote_id.s_addr;
! 489: if (exist->attr->flag & ATTR_FLAG_BIT(BGP_ATTR_ORIGINATOR_ID))
! 490: exist_id.s_addr = exist->attr->extra->originator_id.s_addr;
! 491: else
! 492: exist_id.s_addr = exist->peer->remote_id.s_addr;
! 493:
! 494: if (ntohl (new_id.s_addr) < ntohl (exist_id.s_addr))
! 495: return 1;
! 496: if (ntohl (new_id.s_addr) > ntohl (exist_id.s_addr))
! 497: return 0;
! 498:
! 499: /* 12. Cluster length comparision. */
! 500: if (new->attr->flag & ATTR_FLAG_BIT(BGP_ATTR_CLUSTER_LIST))
! 501: new_cluster = new->attr->extra->cluster->length;
! 502: else
! 503: new_cluster = 0;
! 504: if (exist->attr->flag & ATTR_FLAG_BIT(BGP_ATTR_CLUSTER_LIST))
! 505: exist_cluster = exist->attr->extra->cluster->length;
! 506: else
! 507: exist_cluster = 0;
! 508:
! 509: if (new_cluster < exist_cluster)
! 510: return 1;
! 511: if (new_cluster > exist_cluster)
! 512: return 0;
! 513:
! 514: /* 13. Neighbor address comparision. */
! 515: ret = sockunion_cmp (new->peer->su_remote, exist->peer->su_remote);
! 516:
! 517: if (ret == 1)
! 518: return 0;
! 519: if (ret == -1)
! 520: return 1;
! 521:
! 522: return 1;
! 523: }
! 524:
! 525: static enum filter_type
! 526: bgp_input_filter (struct peer *peer, struct prefix *p, struct attr *attr,
! 527: afi_t afi, safi_t safi)
! 528: {
! 529: struct bgp_filter *filter;
! 530:
! 531: filter = &peer->filter[afi][safi];
! 532:
! 533: #define FILTER_EXIST_WARN(F,f,filter) \
! 534: if (BGP_DEBUG (update, UPDATE_IN) \
! 535: && !(F ## _IN (filter))) \
! 536: plog_warn (peer->log, "%s: Could not find configured input %s-list %s!", \
! 537: peer->host, #f, F ## _IN_NAME(filter));
! 538:
! 539: if (DISTRIBUTE_IN_NAME (filter)) {
! 540: FILTER_EXIST_WARN(DISTRIBUTE, distribute, filter);
! 541:
! 542: if (access_list_apply (DISTRIBUTE_IN (filter), p) == FILTER_DENY)
! 543: return FILTER_DENY;
! 544: }
! 545:
! 546: if (PREFIX_LIST_IN_NAME (filter)) {
! 547: FILTER_EXIST_WARN(PREFIX_LIST, prefix, filter);
! 548:
! 549: if (prefix_list_apply (PREFIX_LIST_IN (filter), p) == PREFIX_DENY)
! 550: return FILTER_DENY;
! 551: }
! 552:
! 553: if (FILTER_LIST_IN_NAME (filter)) {
! 554: FILTER_EXIST_WARN(FILTER_LIST, as, filter);
! 555:
! 556: if (as_list_apply (FILTER_LIST_IN (filter), attr->aspath)== AS_FILTER_DENY)
! 557: return FILTER_DENY;
! 558: }
! 559:
! 560: return FILTER_PERMIT;
! 561: #undef FILTER_EXIST_WARN
! 562: }
! 563:
! 564: static enum filter_type
! 565: bgp_output_filter (struct peer *peer, struct prefix *p, struct attr *attr,
! 566: afi_t afi, safi_t safi)
! 567: {
! 568: struct bgp_filter *filter;
! 569:
! 570: filter = &peer->filter[afi][safi];
! 571:
! 572: #define FILTER_EXIST_WARN(F,f,filter) \
! 573: if (BGP_DEBUG (update, UPDATE_OUT) \
! 574: && !(F ## _OUT (filter))) \
! 575: plog_warn (peer->log, "%s: Could not find configured output %s-list %s!", \
! 576: peer->host, #f, F ## _OUT_NAME(filter));
! 577:
! 578: if (DISTRIBUTE_OUT_NAME (filter)) {
! 579: FILTER_EXIST_WARN(DISTRIBUTE, distribute, filter);
! 580:
! 581: if (access_list_apply (DISTRIBUTE_OUT (filter), p) == FILTER_DENY)
! 582: return FILTER_DENY;
! 583: }
! 584:
! 585: if (PREFIX_LIST_OUT_NAME (filter)) {
! 586: FILTER_EXIST_WARN(PREFIX_LIST, prefix, filter);
! 587:
! 588: if (prefix_list_apply (PREFIX_LIST_OUT (filter), p) == PREFIX_DENY)
! 589: return FILTER_DENY;
! 590: }
! 591:
! 592: if (FILTER_LIST_OUT_NAME (filter)) {
! 593: FILTER_EXIST_WARN(FILTER_LIST, as, filter);
! 594:
! 595: if (as_list_apply (FILTER_LIST_OUT (filter), attr->aspath) == AS_FILTER_DENY)
! 596: return FILTER_DENY;
! 597: }
! 598:
! 599: return FILTER_PERMIT;
! 600: #undef FILTER_EXIST_WARN
! 601: }
! 602:
! 603: /* If community attribute includes no_export then return 1. */
! 604: static int
! 605: bgp_community_filter (struct peer *peer, struct attr *attr)
! 606: {
! 607: if (attr->community)
! 608: {
! 609: /* NO_ADVERTISE check. */
! 610: if (community_include (attr->community, COMMUNITY_NO_ADVERTISE))
! 611: return 1;
! 612:
! 613: /* NO_EXPORT check. */
! 614: if (peer_sort (peer) == BGP_PEER_EBGP &&
! 615: community_include (attr->community, COMMUNITY_NO_EXPORT))
! 616: return 1;
! 617:
! 618: /* NO_EXPORT_SUBCONFED check. */
! 619: if (peer_sort (peer) == BGP_PEER_EBGP
! 620: || peer_sort (peer) == BGP_PEER_CONFED)
! 621: if (community_include (attr->community, COMMUNITY_NO_EXPORT_SUBCONFED))
! 622: return 1;
! 623: }
! 624: return 0;
! 625: }
! 626:
! 627: /* Route reflection loop check. */
! 628: static int
! 629: bgp_cluster_filter (struct peer *peer, struct attr *attr)
! 630: {
! 631: struct in_addr cluster_id;
! 632:
! 633: if (attr->extra && attr->extra->cluster)
! 634: {
! 635: if (peer->bgp->config & BGP_CONFIG_CLUSTER_ID)
! 636: cluster_id = peer->bgp->cluster_id;
! 637: else
! 638: cluster_id = peer->bgp->router_id;
! 639:
! 640: if (cluster_loop_check (attr->extra->cluster, cluster_id))
! 641: return 1;
! 642: }
! 643: return 0;
! 644: }
! 645:
! 646: static int
! 647: bgp_input_modifier (struct peer *peer, struct prefix *p, struct attr *attr,
! 648: afi_t afi, safi_t safi)
! 649: {
! 650: struct bgp_filter *filter;
! 651: struct bgp_info info;
! 652: route_map_result_t ret;
! 653:
! 654: filter = &peer->filter[afi][safi];
! 655:
! 656: /* Apply default weight value. */
! 657: if (peer->weight)
! 658: (bgp_attr_extra_get (attr))->weight = peer->weight;
! 659:
! 660: /* Route map apply. */
! 661: if (ROUTE_MAP_IN_NAME (filter))
! 662: {
! 663: /* Duplicate current value to new strucutre for modification. */
! 664: info.peer = peer;
! 665: info.attr = attr;
! 666:
! 667: SET_FLAG (peer->rmap_type, PEER_RMAP_TYPE_IN);
! 668:
! 669: /* Apply BGP route map to the attribute. */
! 670: ret = route_map_apply (ROUTE_MAP_IN (filter), p, RMAP_BGP, &info);
! 671:
! 672: peer->rmap_type = 0;
! 673:
! 674: if (ret == RMAP_DENYMATCH)
! 675: {
! 676: /* Free newly generated AS path and community by route-map. */
! 677: bgp_attr_flush (attr);
! 678: return RMAP_DENY;
! 679: }
! 680: }
! 681: return RMAP_PERMIT;
! 682: }
! 683:
! 684: static int
! 685: bgp_export_modifier (struct peer *rsclient, struct peer *peer,
! 686: struct prefix *p, struct attr *attr, afi_t afi, safi_t safi)
! 687: {
! 688: struct bgp_filter *filter;
! 689: struct bgp_info info;
! 690: route_map_result_t ret;
! 691:
! 692: filter = &peer->filter[afi][safi];
! 693:
! 694: /* Route map apply. */
! 695: if (ROUTE_MAP_EXPORT_NAME (filter))
! 696: {
! 697: /* Duplicate current value to new strucutre for modification. */
! 698: info.peer = rsclient;
! 699: info.attr = attr;
! 700:
! 701: SET_FLAG (rsclient->rmap_type, PEER_RMAP_TYPE_EXPORT);
! 702:
! 703: /* Apply BGP route map to the attribute. */
! 704: ret = route_map_apply (ROUTE_MAP_EXPORT (filter), p, RMAP_BGP, &info);
! 705:
! 706: rsclient->rmap_type = 0;
! 707:
! 708: if (ret == RMAP_DENYMATCH)
! 709: {
! 710: /* Free newly generated AS path and community by route-map. */
! 711: bgp_attr_flush (attr);
! 712: return RMAP_DENY;
! 713: }
! 714: }
! 715: return RMAP_PERMIT;
! 716: }
! 717:
! 718: static int
! 719: bgp_import_modifier (struct peer *rsclient, struct peer *peer,
! 720: struct prefix *p, struct attr *attr, afi_t afi, safi_t safi)
! 721: {
! 722: struct bgp_filter *filter;
! 723: struct bgp_info info;
! 724: route_map_result_t ret;
! 725:
! 726: filter = &rsclient->filter[afi][safi];
! 727:
! 728: /* Apply default weight value. */
! 729: if (peer->weight)
! 730: (bgp_attr_extra_get (attr))->weight = peer->weight;
! 731:
! 732: /* Route map apply. */
! 733: if (ROUTE_MAP_IMPORT_NAME (filter))
! 734: {
! 735: /* Duplicate current value to new strucutre for modification. */
! 736: info.peer = peer;
! 737: info.attr = attr;
! 738:
! 739: SET_FLAG (peer->rmap_type, PEER_RMAP_TYPE_IMPORT);
! 740:
! 741: /* Apply BGP route map to the attribute. */
! 742: ret = route_map_apply (ROUTE_MAP_IMPORT (filter), p, RMAP_BGP, &info);
! 743:
! 744: peer->rmap_type = 0;
! 745:
! 746: if (ret == RMAP_DENYMATCH)
! 747: {
! 748: /* Free newly generated AS path and community by route-map. */
! 749: bgp_attr_flush (attr);
! 750: return RMAP_DENY;
! 751: }
! 752: }
! 753: return RMAP_PERMIT;
! 754: }
! 755:
! 756: static int
! 757: bgp_announce_check (struct bgp_info *ri, struct peer *peer, struct prefix *p,
! 758: struct attr *attr, afi_t afi, safi_t safi)
! 759: {
! 760: int ret;
! 761: char buf[SU_ADDRSTRLEN];
! 762: struct bgp_filter *filter;
! 763: struct peer *from;
! 764: struct bgp *bgp;
! 765: int transparent;
! 766: int reflect;
! 767:
! 768: from = ri->peer;
! 769: filter = &peer->filter[afi][safi];
! 770: bgp = peer->bgp;
! 771:
! 772: if (DISABLE_BGP_ANNOUNCE)
! 773: return 0;
! 774:
! 775: /* Do not send announces to RS-clients from the 'normal' bgp_table. */
! 776: if (CHECK_FLAG(peer->af_flags[afi][safi], PEER_FLAG_RSERVER_CLIENT))
! 777: return 0;
! 778:
! 779: /* Do not send back route to sender. */
! 780: if (from == peer)
! 781: return 0;
! 782:
! 783: /* If peer's id and route's nexthop are same. draft-ietf-idr-bgp4-23 5.1.3 */
! 784: if (p->family == AF_INET
! 785: && IPV4_ADDR_SAME(&peer->remote_id, &ri->attr->nexthop))
! 786: return 0;
! 787: #ifdef HAVE_IPV6
! 788: if (p->family == AF_INET6
! 789: && IPV6_ADDR_SAME(&peer->remote_id, &ri->attr->nexthop))
! 790: return 0;
! 791: #endif
! 792:
! 793: /* Aggregate-address suppress check. */
! 794: if (ri->extra && ri->extra->suppress)
! 795: if (! UNSUPPRESS_MAP_NAME (filter))
! 796: return 0;
! 797:
! 798: /* Default route check. */
! 799: if (CHECK_FLAG (peer->af_sflags[afi][safi], PEER_STATUS_DEFAULT_ORIGINATE))
! 800: {
! 801: if (p->family == AF_INET && p->u.prefix4.s_addr == INADDR_ANY)
! 802: return 0;
! 803: #ifdef HAVE_IPV6
! 804: else if (p->family == AF_INET6 && p->prefixlen == 0)
! 805: return 0;
! 806: #endif /* HAVE_IPV6 */
! 807: }
! 808:
! 809: /* Transparency check. */
! 810: if (CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_RSERVER_CLIENT)
! 811: && CHECK_FLAG (from->af_flags[afi][safi], PEER_FLAG_RSERVER_CLIENT))
! 812: transparent = 1;
! 813: else
! 814: transparent = 0;
! 815:
! 816: /* If community is not disabled check the no-export and local. */
! 817: if (! transparent && bgp_community_filter (peer, ri->attr))
! 818: return 0;
! 819:
! 820: /* If the attribute has originator-id and it is same as remote
! 821: peer's id. */
! 822: if (ri->attr->flag & ATTR_FLAG_BIT (BGP_ATTR_ORIGINATOR_ID))
! 823: {
! 824: if (IPV4_ADDR_SAME (&peer->remote_id, &ri->attr->extra->originator_id))
! 825: {
! 826: if (BGP_DEBUG (filter, FILTER))
! 827: zlog (peer->log, LOG_DEBUG,
! 828: "%s [Update:SEND] %s/%d originator-id is same as remote router-id",
! 829: peer->host,
! 830: inet_ntop(p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
! 831: p->prefixlen);
! 832: return 0;
! 833: }
! 834: }
! 835:
! 836: /* ORF prefix-list filter check */
! 837: if (CHECK_FLAG (peer->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_RM_ADV)
! 838: && (CHECK_FLAG (peer->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_SM_RCV)
! 839: || CHECK_FLAG (peer->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_SM_OLD_RCV)))
! 840: if (peer->orf_plist[afi][safi])
! 841: {
! 842: if (prefix_list_apply (peer->orf_plist[afi][safi], p) == PREFIX_DENY)
! 843: return 0;
! 844: }
! 845:
! 846: /* Output filter check. */
! 847: if (bgp_output_filter (peer, p, ri->attr, afi, safi) == FILTER_DENY)
! 848: {
! 849: if (BGP_DEBUG (filter, FILTER))
! 850: zlog (peer->log, LOG_DEBUG,
! 851: "%s [Update:SEND] %s/%d is filtered",
! 852: peer->host,
! 853: inet_ntop(p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
! 854: p->prefixlen);
! 855: return 0;
! 856: }
! 857:
! 858: #ifdef BGP_SEND_ASPATH_CHECK
! 859: /* AS path loop check. */
! 860: if (aspath_loop_check (ri->attr->aspath, peer->as))
! 861: {
! 862: if (BGP_DEBUG (filter, FILTER))
! 863: zlog (peer->log, LOG_DEBUG,
! 864: "%s [Update:SEND] suppress announcement to peer AS %u is AS path.",
! 865: peer->host, peer->as);
! 866: return 0;
! 867: }
! 868: #endif /* BGP_SEND_ASPATH_CHECK */
! 869:
! 870: /* If we're a CONFED we need to loop check the CONFED ID too */
! 871: if (CHECK_FLAG(bgp->config, BGP_CONFIG_CONFEDERATION))
! 872: {
! 873: if (aspath_loop_check(ri->attr->aspath, bgp->confed_id))
! 874: {
! 875: if (BGP_DEBUG (filter, FILTER))
! 876: zlog (peer->log, LOG_DEBUG,
! 877: "%s [Update:SEND] suppress announcement to peer AS %u is AS path.",
! 878: peer->host,
! 879: bgp->confed_id);
! 880: return 0;
! 881: }
! 882: }
! 883:
! 884: /* Route-Reflect check. */
! 885: if (peer_sort (from) == BGP_PEER_IBGP && peer_sort (peer) == BGP_PEER_IBGP)
! 886: reflect = 1;
! 887: else
! 888: reflect = 0;
! 889:
! 890: /* IBGP reflection check. */
! 891: if (reflect)
! 892: {
! 893: /* A route from a Client peer. */
! 894: if (CHECK_FLAG (from->af_flags[afi][safi], PEER_FLAG_REFLECTOR_CLIENT))
! 895: {
! 896: /* Reflect to all the Non-Client peers and also to the
! 897: Client peers other than the originator. Originator check
! 898: is already done. So there is noting to do. */
! 899: /* no bgp client-to-client reflection check. */
! 900: if (bgp_flag_check (bgp, BGP_FLAG_NO_CLIENT_TO_CLIENT))
! 901: if (CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_REFLECTOR_CLIENT))
! 902: return 0;
! 903: }
! 904: else
! 905: {
! 906: /* A route from a Non-client peer. Reflect to all other
! 907: clients. */
! 908: if (! CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_REFLECTOR_CLIENT))
! 909: return 0;
! 910: }
! 911: }
! 912:
! 913: /* For modify attribute, copy it to temporary structure. */
! 914: bgp_attr_dup (attr, ri->attr);
! 915:
! 916: /* If local-preference is not set. */
! 917: if ((peer_sort (peer) == BGP_PEER_IBGP
! 918: || peer_sort (peer) == BGP_PEER_CONFED)
! 919: && (! (attr->flag & ATTR_FLAG_BIT (BGP_ATTR_LOCAL_PREF))))
! 920: {
! 921: attr->flag |= ATTR_FLAG_BIT (BGP_ATTR_LOCAL_PREF);
! 922: attr->local_pref = bgp->default_local_pref;
! 923: }
! 924:
! 925: /* Remove MED if its an EBGP peer - will get overwritten by route-maps */
! 926: if (peer_sort (peer) == BGP_PEER_EBGP
! 927: && attr->flag & ATTR_FLAG_BIT (BGP_ATTR_MULTI_EXIT_DISC))
! 928: {
! 929: if (ri->peer != bgp->peer_self && ! transparent
! 930: && ! CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_MED_UNCHANGED))
! 931: attr->flag &= ~(ATTR_FLAG_BIT (BGP_ATTR_MULTI_EXIT_DISC));
! 932: }
! 933:
! 934: /* next-hop-set */
! 935: if (transparent || reflect
! 936: || (CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_NEXTHOP_UNCHANGED)
! 937: && ((p->family == AF_INET && attr->nexthop.s_addr)
! 938: #ifdef HAVE_IPV6
! 939: || (p->family == AF_INET6 &&
! 940: ! IN6_IS_ADDR_UNSPECIFIED(&attr->extra->mp_nexthop_global))
! 941: #endif /* HAVE_IPV6 */
! 942: )))
! 943: {
! 944: /* NEXT-HOP Unchanged. */
! 945: }
! 946: else if (CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_NEXTHOP_SELF)
! 947: || (p->family == AF_INET && attr->nexthop.s_addr == 0)
! 948: #ifdef HAVE_IPV6
! 949: || (p->family == AF_INET6 &&
! 950: IN6_IS_ADDR_UNSPECIFIED(&attr->extra->mp_nexthop_global))
! 951: #endif /* HAVE_IPV6 */
! 952: || (peer_sort (peer) == BGP_PEER_EBGP
! 953: && bgp_multiaccess_check_v4 (attr->nexthop, peer->host) == 0))
! 954: {
! 955: /* Set IPv4 nexthop. */
! 956: if (p->family == AF_INET)
! 957: {
! 958: if (safi == SAFI_MPLS_VPN)
! 959: memcpy (&attr->extra->mp_nexthop_global_in, &peer->nexthop.v4,
! 960: IPV4_MAX_BYTELEN);
! 961: else
! 962: memcpy (&attr->nexthop, &peer->nexthop.v4, IPV4_MAX_BYTELEN);
! 963: }
! 964: #ifdef HAVE_IPV6
! 965: /* Set IPv6 nexthop. */
! 966: if (p->family == AF_INET6)
! 967: {
! 968: /* IPv6 global nexthop must be included. */
! 969: memcpy (&attr->extra->mp_nexthop_global, &peer->nexthop.v6_global,
! 970: IPV6_MAX_BYTELEN);
! 971: attr->extra->mp_nexthop_len = 16;
! 972: }
! 973: #endif /* HAVE_IPV6 */
! 974: }
! 975:
! 976: #ifdef HAVE_IPV6
! 977: if (p->family == AF_INET6)
! 978: {
! 979: /* Left nexthop_local unchanged if so configured. */
! 980: if ( CHECK_FLAG (peer->af_flags[afi][safi],
! 981: PEER_FLAG_NEXTHOP_LOCAL_UNCHANGED) )
! 982: {
! 983: if ( IN6_IS_ADDR_LINKLOCAL (&attr->extra->mp_nexthop_local) )
! 984: attr->extra->mp_nexthop_len=32;
! 985: else
! 986: attr->extra->mp_nexthop_len=16;
! 987: }
! 988:
! 989: /* Default nexthop_local treatment for non-RS-Clients */
! 990: else
! 991: {
! 992: /* Link-local address should not be transit to different peer. */
! 993: attr->extra->mp_nexthop_len = 16;
! 994:
! 995: /* Set link-local address for shared network peer. */
! 996: if (peer->shared_network
! 997: && ! IN6_IS_ADDR_UNSPECIFIED (&peer->nexthop.v6_local))
! 998: {
! 999: memcpy (&attr->extra->mp_nexthop_local, &peer->nexthop.v6_local,
! 1000: IPV6_MAX_BYTELEN);
! 1001: attr->extra->mp_nexthop_len = 32;
! 1002: }
! 1003:
! 1004: /* If bgpd act as BGP-4+ route-reflector, do not send link-local
! 1005: address.*/
! 1006: if (reflect)
! 1007: attr->extra->mp_nexthop_len = 16;
! 1008:
! 1009: /* If BGP-4+ link-local nexthop is not link-local nexthop. */
! 1010: if (! IN6_IS_ADDR_LINKLOCAL (&peer->nexthop.v6_local))
! 1011: attr->extra->mp_nexthop_len = 16;
! 1012: }
! 1013:
! 1014: }
! 1015: #endif /* HAVE_IPV6 */
! 1016:
! 1017: /* If this is EBGP peer and remove-private-AS is set. */
! 1018: if (peer_sort (peer) == BGP_PEER_EBGP
! 1019: && peer_af_flag_check (peer, afi, safi, PEER_FLAG_REMOVE_PRIVATE_AS)
! 1020: && aspath_private_as_check (attr->aspath))
! 1021: attr->aspath = aspath_empty_get ();
! 1022:
! 1023: /* Route map & unsuppress-map apply. */
! 1024: if (ROUTE_MAP_OUT_NAME (filter)
! 1025: || (ri->extra && ri->extra->suppress) )
! 1026: {
! 1027: struct bgp_info info;
! 1028: struct attr dummy_attr = { 0 };
! 1029:
! 1030: info.peer = peer;
! 1031: info.attr = attr;
! 1032:
! 1033: /* The route reflector is not allowed to modify the attributes
! 1034: of the reflected IBGP routes. */
! 1035: if (peer_sort (from) == BGP_PEER_IBGP
! 1036: && peer_sort (peer) == BGP_PEER_IBGP)
! 1037: {
! 1038: bgp_attr_dup (&dummy_attr, attr);
! 1039: info.attr = &dummy_attr;
! 1040: }
! 1041:
! 1042: SET_FLAG (peer->rmap_type, PEER_RMAP_TYPE_OUT);
! 1043:
! 1044: if (ri->extra && ri->extra->suppress)
! 1045: ret = route_map_apply (UNSUPPRESS_MAP (filter), p, RMAP_BGP, &info);
! 1046: else
! 1047: ret = route_map_apply (ROUTE_MAP_OUT (filter), p, RMAP_BGP, &info);
! 1048:
! 1049: peer->rmap_type = 0;
! 1050:
! 1051: if (dummy_attr.extra)
! 1052: bgp_attr_extra_free (&dummy_attr);
! 1053:
! 1054: if (ret == RMAP_DENYMATCH)
! 1055: {
! 1056: bgp_attr_flush (attr);
! 1057: return 0;
! 1058: }
! 1059: }
! 1060: return 1;
! 1061: }
! 1062:
! 1063: static int
! 1064: bgp_announce_check_rsclient (struct bgp_info *ri, struct peer *rsclient,
! 1065: struct prefix *p, struct attr *attr, afi_t afi, safi_t safi)
! 1066: {
! 1067: int ret;
! 1068: char buf[SU_ADDRSTRLEN];
! 1069: struct bgp_filter *filter;
! 1070: struct bgp_info info;
! 1071: struct peer *from;
! 1072: struct bgp *bgp;
! 1073:
! 1074: from = ri->peer;
! 1075: filter = &rsclient->filter[afi][safi];
! 1076: bgp = rsclient->bgp;
! 1077:
! 1078: if (DISABLE_BGP_ANNOUNCE)
! 1079: return 0;
! 1080:
! 1081: /* Do not send back route to sender. */
! 1082: if (from == rsclient)
! 1083: return 0;
! 1084:
! 1085: /* Aggregate-address suppress check. */
! 1086: if (ri->extra && ri->extra->suppress)
! 1087: if (! UNSUPPRESS_MAP_NAME (filter))
! 1088: return 0;
! 1089:
! 1090: /* Default route check. */
! 1091: if (CHECK_FLAG (rsclient->af_sflags[afi][safi],
! 1092: PEER_STATUS_DEFAULT_ORIGINATE))
! 1093: {
! 1094: if (p->family == AF_INET && p->u.prefix4.s_addr == INADDR_ANY)
! 1095: return 0;
! 1096: #ifdef HAVE_IPV6
! 1097: else if (p->family == AF_INET6 && p->prefixlen == 0)
! 1098: return 0;
! 1099: #endif /* HAVE_IPV6 */
! 1100: }
! 1101:
! 1102: /* If the attribute has originator-id and it is same as remote
! 1103: peer's id. */
! 1104: if (ri->attr->flag & ATTR_FLAG_BIT (BGP_ATTR_ORIGINATOR_ID))
! 1105: {
! 1106: if (IPV4_ADDR_SAME (&rsclient->remote_id,
! 1107: &ri->attr->extra->originator_id))
! 1108: {
! 1109: if (BGP_DEBUG (filter, FILTER))
! 1110: zlog (rsclient->log, LOG_DEBUG,
! 1111: "%s [Update:SEND] %s/%d originator-id is same as remote router-id",
! 1112: rsclient->host,
! 1113: inet_ntop(p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
! 1114: p->prefixlen);
! 1115: return 0;
! 1116: }
! 1117: }
! 1118:
! 1119: /* ORF prefix-list filter check */
! 1120: if (CHECK_FLAG (rsclient->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_RM_ADV)
! 1121: && (CHECK_FLAG (rsclient->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_SM_RCV)
! 1122: || CHECK_FLAG (rsclient->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_SM_OLD_RCV)))
! 1123: if (rsclient->orf_plist[afi][safi])
! 1124: {
! 1125: if (prefix_list_apply (rsclient->orf_plist[afi][safi], p) == PREFIX_DENY)
! 1126: return 0;
! 1127: }
! 1128:
! 1129: /* Output filter check. */
! 1130: if (bgp_output_filter (rsclient, p, ri->attr, afi, safi) == FILTER_DENY)
! 1131: {
! 1132: if (BGP_DEBUG (filter, FILTER))
! 1133: zlog (rsclient->log, LOG_DEBUG,
! 1134: "%s [Update:SEND] %s/%d is filtered",
! 1135: rsclient->host,
! 1136: inet_ntop(p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
! 1137: p->prefixlen);
! 1138: return 0;
! 1139: }
! 1140:
! 1141: #ifdef BGP_SEND_ASPATH_CHECK
! 1142: /* AS path loop check. */
! 1143: if (aspath_loop_check (ri->attr->aspath, rsclient->as))
! 1144: {
! 1145: if (BGP_DEBUG (filter, FILTER))
! 1146: zlog (rsclient->log, LOG_DEBUG,
! 1147: "%s [Update:SEND] suppress announcement to peer AS %u is AS path.",
! 1148: rsclient->host, rsclient->as);
! 1149: return 0;
! 1150: }
! 1151: #endif /* BGP_SEND_ASPATH_CHECK */
! 1152:
! 1153: /* For modify attribute, copy it to temporary structure. */
! 1154: bgp_attr_dup (attr, ri->attr);
! 1155:
! 1156: /* next-hop-set */
! 1157: if ((p->family == AF_INET && attr->nexthop.s_addr == 0)
! 1158: #ifdef HAVE_IPV6
! 1159: || (p->family == AF_INET6 &&
! 1160: IN6_IS_ADDR_UNSPECIFIED(&attr->extra->mp_nexthop_global))
! 1161: #endif /* HAVE_IPV6 */
! 1162: )
! 1163: {
! 1164: /* Set IPv4 nexthop. */
! 1165: if (p->family == AF_INET)
! 1166: {
! 1167: if (safi == SAFI_MPLS_VPN)
! 1168: memcpy (&attr->extra->mp_nexthop_global_in, &rsclient->nexthop.v4,
! 1169: IPV4_MAX_BYTELEN);
! 1170: else
! 1171: memcpy (&attr->nexthop, &rsclient->nexthop.v4, IPV4_MAX_BYTELEN);
! 1172: }
! 1173: #ifdef HAVE_IPV6
! 1174: /* Set IPv6 nexthop. */
! 1175: if (p->family == AF_INET6)
! 1176: {
! 1177: /* IPv6 global nexthop must be included. */
! 1178: memcpy (&attr->extra->mp_nexthop_global, &rsclient->nexthop.v6_global,
! 1179: IPV6_MAX_BYTELEN);
! 1180: attr->extra->mp_nexthop_len = 16;
! 1181: }
! 1182: #endif /* HAVE_IPV6 */
! 1183: }
! 1184:
! 1185: #ifdef HAVE_IPV6
! 1186: if (p->family == AF_INET6)
! 1187: {
! 1188: struct attr_extra *attre = attr->extra;
! 1189:
! 1190: assert (attr->extra);
! 1191:
! 1192: /* Left nexthop_local unchanged if so configured. */
! 1193: if ( CHECK_FLAG (rsclient->af_flags[afi][safi],
! 1194: PEER_FLAG_NEXTHOP_LOCAL_UNCHANGED) )
! 1195: {
! 1196: if ( IN6_IS_ADDR_LINKLOCAL (&attre->mp_nexthop_local) )
! 1197: attre->mp_nexthop_len=32;
! 1198: else
! 1199: attre->mp_nexthop_len=16;
! 1200: }
! 1201:
! 1202: /* Default nexthop_local treatment for RS-Clients */
! 1203: else
! 1204: {
! 1205: /* Announcer and RS-Client are both in the same network */
! 1206: if (rsclient->shared_network && from->shared_network &&
! 1207: (rsclient->ifindex == from->ifindex))
! 1208: {
! 1209: if ( IN6_IS_ADDR_LINKLOCAL (&attre->mp_nexthop_local) )
! 1210: attre->mp_nexthop_len=32;
! 1211: else
! 1212: attre->mp_nexthop_len=16;
! 1213: }
! 1214:
! 1215: /* Set link-local address for shared network peer. */
! 1216: else if (rsclient->shared_network
! 1217: && IN6_IS_ADDR_LINKLOCAL (&rsclient->nexthop.v6_local))
! 1218: {
! 1219: memcpy (&attre->mp_nexthop_local, &rsclient->nexthop.v6_local,
! 1220: IPV6_MAX_BYTELEN);
! 1221: attre->mp_nexthop_len = 32;
! 1222: }
! 1223:
! 1224: else
! 1225: attre->mp_nexthop_len = 16;
! 1226: }
! 1227:
! 1228: }
! 1229: #endif /* HAVE_IPV6 */
! 1230:
! 1231:
! 1232: /* If this is EBGP peer and remove-private-AS is set. */
! 1233: if (peer_sort (rsclient) == BGP_PEER_EBGP
! 1234: && peer_af_flag_check (rsclient, afi, safi, PEER_FLAG_REMOVE_PRIVATE_AS)
! 1235: && aspath_private_as_check (attr->aspath))
! 1236: attr->aspath = aspath_empty_get ();
! 1237:
! 1238: /* Route map & unsuppress-map apply. */
! 1239: if (ROUTE_MAP_OUT_NAME (filter) || (ri->extra && ri->extra->suppress) )
! 1240: {
! 1241: info.peer = rsclient;
! 1242: info.attr = attr;
! 1243:
! 1244: SET_FLAG (rsclient->rmap_type, PEER_RMAP_TYPE_OUT);
! 1245:
! 1246: if (ri->extra && ri->extra->suppress)
! 1247: ret = route_map_apply (UNSUPPRESS_MAP (filter), p, RMAP_BGP, &info);
! 1248: else
! 1249: ret = route_map_apply (ROUTE_MAP_OUT (filter), p, RMAP_BGP, &info);
! 1250:
! 1251: rsclient->rmap_type = 0;
! 1252:
! 1253: if (ret == RMAP_DENYMATCH)
! 1254: {
! 1255: bgp_attr_flush (attr);
! 1256: return 0;
! 1257: }
! 1258: }
! 1259:
! 1260: return 1;
! 1261: }
! 1262:
! 1263: struct bgp_info_pair
! 1264: {
! 1265: struct bgp_info *old;
! 1266: struct bgp_info *new;
! 1267: };
! 1268:
! 1269: static void
! 1270: bgp_best_selection (struct bgp *bgp, struct bgp_node *rn, struct bgp_info_pair *result)
! 1271: {
! 1272: struct bgp_info *new_select;
! 1273: struct bgp_info *old_select;
! 1274: struct bgp_info *ri;
! 1275: struct bgp_info *ri1;
! 1276: struct bgp_info *ri2;
! 1277: struct bgp_info *nextri = NULL;
! 1278:
! 1279: /* bgp deterministic-med */
! 1280: new_select = NULL;
! 1281: if (bgp_flag_check (bgp, BGP_FLAG_DETERMINISTIC_MED))
! 1282: for (ri1 = rn->info; ri1; ri1 = ri1->next)
! 1283: {
! 1284: if (CHECK_FLAG (ri1->flags, BGP_INFO_DMED_CHECK))
! 1285: continue;
! 1286: if (BGP_INFO_HOLDDOWN (ri1))
! 1287: continue;
! 1288:
! 1289: new_select = ri1;
! 1290: if (ri1->next)
! 1291: for (ri2 = ri1->next; ri2; ri2 = ri2->next)
! 1292: {
! 1293: if (CHECK_FLAG (ri2->flags, BGP_INFO_DMED_CHECK))
! 1294: continue;
! 1295: if (BGP_INFO_HOLDDOWN (ri2))
! 1296: continue;
! 1297:
! 1298: if (aspath_cmp_left (ri1->attr->aspath, ri2->attr->aspath)
! 1299: || aspath_cmp_left_confed (ri1->attr->aspath,
! 1300: ri2->attr->aspath))
! 1301: {
! 1302: if (bgp_info_cmp (bgp, ri2, new_select))
! 1303: {
! 1304: bgp_info_unset_flag (rn, new_select, BGP_INFO_DMED_SELECTED);
! 1305: new_select = ri2;
! 1306: }
! 1307:
! 1308: bgp_info_set_flag (rn, ri2, BGP_INFO_DMED_CHECK);
! 1309: }
! 1310: }
! 1311: bgp_info_set_flag (rn, new_select, BGP_INFO_DMED_CHECK);
! 1312: bgp_info_set_flag (rn, new_select, BGP_INFO_DMED_SELECTED);
! 1313: }
! 1314:
! 1315: /* Check old selected route and new selected route. */
! 1316: old_select = NULL;
! 1317: new_select = NULL;
! 1318: for (ri = rn->info; (ri != NULL) && (nextri = ri->next, 1); ri = nextri)
! 1319: {
! 1320: if (CHECK_FLAG (ri->flags, BGP_INFO_SELECTED))
! 1321: old_select = ri;
! 1322:
! 1323: if (BGP_INFO_HOLDDOWN (ri))
! 1324: {
! 1325: /* reap REMOVED routes, if needs be
! 1326: * selected route must stay for a while longer though
! 1327: */
! 1328: if (CHECK_FLAG (ri->flags, BGP_INFO_REMOVED)
! 1329: && (ri != old_select))
! 1330: bgp_info_reap (rn, ri);
! 1331:
! 1332: continue;
! 1333: }
! 1334:
! 1335: if (bgp_flag_check (bgp, BGP_FLAG_DETERMINISTIC_MED)
! 1336: && (! CHECK_FLAG (ri->flags, BGP_INFO_DMED_SELECTED)))
! 1337: {
! 1338: bgp_info_unset_flag (rn, ri, BGP_INFO_DMED_CHECK);
! 1339: continue;
! 1340: }
! 1341: bgp_info_unset_flag (rn, ri, BGP_INFO_DMED_CHECK);
! 1342: bgp_info_unset_flag (rn, ri, BGP_INFO_DMED_SELECTED);
! 1343:
! 1344: if (bgp_info_cmp (bgp, ri, new_select))
! 1345: new_select = ri;
! 1346: }
! 1347:
! 1348: result->old = old_select;
! 1349: result->new = new_select;
! 1350:
! 1351: return;
! 1352: }
! 1353:
! 1354: static int
! 1355: bgp_process_announce_selected (struct peer *peer, struct bgp_info *selected,
! 1356: struct bgp_node *rn, afi_t afi, safi_t safi)
! 1357: {
! 1358: struct prefix *p;
! 1359: struct attr attr = { 0 };
! 1360:
! 1361: p = &rn->p;
! 1362:
! 1363: /* Announce route to Established peer. */
! 1364: if (peer->status != Established)
! 1365: return 0;
! 1366:
! 1367: /* Address family configuration check. */
! 1368: if (! peer->afc_nego[afi][safi])
! 1369: return 0;
! 1370:
! 1371: /* First update is deferred until ORF or ROUTE-REFRESH is received */
! 1372: if (CHECK_FLAG (peer->af_sflags[afi][safi],
! 1373: PEER_STATUS_ORF_WAIT_REFRESH))
! 1374: return 0;
! 1375:
! 1376: switch (rn->table->type)
! 1377: {
! 1378: case BGP_TABLE_MAIN:
! 1379: /* Announcement to peer->conf. If the route is filtered,
! 1380: withdraw it. */
! 1381: if (selected && bgp_announce_check (selected, peer, p, &attr, afi, safi))
! 1382: bgp_adj_out_set (rn, peer, p, &attr, afi, safi, selected);
! 1383: else
! 1384: bgp_adj_out_unset (rn, peer, p, afi, safi);
! 1385: break;
! 1386: case BGP_TABLE_RSCLIENT:
! 1387: /* Announcement to peer->conf. If the route is filtered,
! 1388: withdraw it. */
! 1389: if (selected &&
! 1390: bgp_announce_check_rsclient (selected, peer, p, &attr, afi, safi))
! 1391: bgp_adj_out_set (rn, peer, p, &attr, afi, safi, selected);
! 1392: else
! 1393: bgp_adj_out_unset (rn, peer, p, afi, safi);
! 1394: break;
! 1395: }
! 1396:
! 1397: bgp_attr_extra_free (&attr);
! 1398:
! 1399: return 0;
! 1400: }
! 1401:
! 1402: struct bgp_process_queue
! 1403: {
! 1404: struct bgp *bgp;
! 1405: struct bgp_node *rn;
! 1406: afi_t afi;
! 1407: safi_t safi;
! 1408: };
! 1409:
! 1410: static wq_item_status
! 1411: bgp_process_rsclient (struct work_queue *wq, void *data)
! 1412: {
! 1413: struct bgp_process_queue *pq = data;
! 1414: struct bgp *bgp = pq->bgp;
! 1415: struct bgp_node *rn = pq->rn;
! 1416: afi_t afi = pq->afi;
! 1417: safi_t safi = pq->safi;
! 1418: struct bgp_info *new_select;
! 1419: struct bgp_info *old_select;
! 1420: struct bgp_info_pair old_and_new;
! 1421: struct listnode *node, *nnode;
! 1422: struct peer *rsclient = rn->table->owner;
! 1423:
! 1424: /* Best path selection. */
! 1425: bgp_best_selection (bgp, rn, &old_and_new);
! 1426: new_select = old_and_new.new;
! 1427: old_select = old_and_new.old;
! 1428:
! 1429: if (CHECK_FLAG (rsclient->sflags, PEER_STATUS_GROUP))
! 1430: {
! 1431: if (rsclient->group)
! 1432: for (ALL_LIST_ELEMENTS (rsclient->group->peer, node, nnode, rsclient))
! 1433: {
! 1434: /* Nothing to do. */
! 1435: if (old_select && old_select == new_select)
! 1436: if (!CHECK_FLAG (old_select->flags, BGP_INFO_ATTR_CHANGED))
! 1437: continue;
! 1438:
! 1439: if (old_select)
! 1440: bgp_info_unset_flag (rn, old_select, BGP_INFO_SELECTED);
! 1441: if (new_select)
! 1442: {
! 1443: bgp_info_set_flag (rn, new_select, BGP_INFO_SELECTED);
! 1444: bgp_info_unset_flag (rn, new_select, BGP_INFO_ATTR_CHANGED);
! 1445: }
! 1446:
! 1447: bgp_process_announce_selected (rsclient, new_select, rn,
! 1448: afi, safi);
! 1449: }
! 1450: }
! 1451: else
! 1452: {
! 1453: if (old_select)
! 1454: bgp_info_unset_flag (rn, old_select, BGP_INFO_SELECTED);
! 1455: if (new_select)
! 1456: {
! 1457: bgp_info_set_flag (rn, new_select, BGP_INFO_SELECTED);
! 1458: bgp_info_unset_flag (rn, new_select, BGP_INFO_ATTR_CHANGED);
! 1459: }
! 1460: bgp_process_announce_selected (rsclient, new_select, rn, afi, safi);
! 1461: }
! 1462:
! 1463: if (old_select && CHECK_FLAG (old_select->flags, BGP_INFO_REMOVED))
! 1464: bgp_info_reap (rn, old_select);
! 1465:
! 1466: UNSET_FLAG (rn->flags, BGP_NODE_PROCESS_SCHEDULED);
! 1467: return WQ_SUCCESS;
! 1468: }
! 1469:
! 1470: static wq_item_status
! 1471: bgp_process_main (struct work_queue *wq, void *data)
! 1472: {
! 1473: struct bgp_process_queue *pq = data;
! 1474: struct bgp *bgp = pq->bgp;
! 1475: struct bgp_node *rn = pq->rn;
! 1476: afi_t afi = pq->afi;
! 1477: safi_t safi = pq->safi;
! 1478: struct prefix *p = &rn->p;
! 1479: struct bgp_info *new_select;
! 1480: struct bgp_info *old_select;
! 1481: struct bgp_info_pair old_and_new;
! 1482: struct listnode *node, *nnode;
! 1483: struct peer *peer;
! 1484:
! 1485: /* Best path selection. */
! 1486: bgp_best_selection (bgp, rn, &old_and_new);
! 1487: old_select = old_and_new.old;
! 1488: new_select = old_and_new.new;
! 1489:
! 1490: /* Nothing to do. */
! 1491: if (old_select && old_select == new_select)
! 1492: {
! 1493: if (! CHECK_FLAG (old_select->flags, BGP_INFO_ATTR_CHANGED))
! 1494: {
! 1495: if (CHECK_FLAG (old_select->flags, BGP_INFO_IGP_CHANGED))
! 1496: bgp_zebra_announce (p, old_select, bgp);
! 1497:
! 1498: UNSET_FLAG (rn->flags, BGP_NODE_PROCESS_SCHEDULED);
! 1499: return WQ_SUCCESS;
! 1500: }
! 1501: }
! 1502:
! 1503: if (old_select)
! 1504: bgp_info_unset_flag (rn, old_select, BGP_INFO_SELECTED);
! 1505: if (new_select)
! 1506: {
! 1507: bgp_info_set_flag (rn, new_select, BGP_INFO_SELECTED);
! 1508: bgp_info_unset_flag (rn, new_select, BGP_INFO_ATTR_CHANGED);
! 1509: }
! 1510:
! 1511:
! 1512: /* Check each BGP peer. */
! 1513: for (ALL_LIST_ELEMENTS (bgp->peer, node, nnode, peer))
! 1514: {
! 1515: bgp_process_announce_selected (peer, new_select, rn, afi, safi);
! 1516: }
! 1517:
! 1518: /* FIB update. */
! 1519: if (safi == SAFI_UNICAST && ! bgp->name &&
! 1520: ! bgp_option_check (BGP_OPT_NO_FIB))
! 1521: {
! 1522: if (new_select
! 1523: && new_select->type == ZEBRA_ROUTE_BGP
! 1524: && new_select->sub_type == BGP_ROUTE_NORMAL)
! 1525: bgp_zebra_announce (p, new_select, bgp);
! 1526: else
! 1527: {
! 1528: /* Withdraw the route from the kernel. */
! 1529: if (old_select
! 1530: && old_select->type == ZEBRA_ROUTE_BGP
! 1531: && old_select->sub_type == BGP_ROUTE_NORMAL)
! 1532: bgp_zebra_withdraw (p, old_select);
! 1533: }
! 1534: }
! 1535:
! 1536: /* Reap old select bgp_info, it it has been removed */
! 1537: if (old_select && CHECK_FLAG (old_select->flags, BGP_INFO_REMOVED))
! 1538: bgp_info_reap (rn, old_select);
! 1539:
! 1540: UNSET_FLAG (rn->flags, BGP_NODE_PROCESS_SCHEDULED);
! 1541: return WQ_SUCCESS;
! 1542: }
! 1543:
! 1544: static void
! 1545: bgp_processq_del (struct work_queue *wq, void *data)
! 1546: {
! 1547: struct bgp_process_queue *pq = data;
! 1548: struct bgp_table *table = pq->rn->table;
! 1549:
! 1550: bgp_unlock (pq->bgp);
! 1551: bgp_unlock_node (pq->rn);
! 1552: bgp_table_unlock (table);
! 1553: XFREE (MTYPE_BGP_PROCESS_QUEUE, pq);
! 1554: }
! 1555:
! 1556: static void
! 1557: bgp_process_queue_init (void)
! 1558: {
! 1559: bm->process_main_queue
! 1560: = work_queue_new (bm->master, "process_main_queue");
! 1561: bm->process_rsclient_queue
! 1562: = work_queue_new (bm->master, "process_rsclient_queue");
! 1563:
! 1564: if ( !(bm->process_main_queue && bm->process_rsclient_queue) )
! 1565: {
! 1566: zlog_err ("%s: Failed to allocate work queue", __func__);
! 1567: exit (1);
! 1568: }
! 1569:
! 1570: bm->process_main_queue->spec.workfunc = &bgp_process_main;
! 1571: bm->process_main_queue->spec.del_item_data = &bgp_processq_del;
! 1572: bm->process_main_queue->spec.max_retries = 0;
! 1573: bm->process_main_queue->spec.hold = 50;
! 1574:
! 1575: memcpy (bm->process_rsclient_queue, bm->process_main_queue,
! 1576: sizeof (struct work_queue *));
! 1577: bm->process_rsclient_queue->spec.workfunc = &bgp_process_rsclient;
! 1578: }
! 1579:
! 1580: void
! 1581: bgp_process (struct bgp *bgp, struct bgp_node *rn, afi_t afi, safi_t safi)
! 1582: {
! 1583: struct bgp_process_queue *pqnode;
! 1584:
! 1585: /* already scheduled for processing? */
! 1586: if (CHECK_FLAG (rn->flags, BGP_NODE_PROCESS_SCHEDULED))
! 1587: return;
! 1588:
! 1589: if ( (bm->process_main_queue == NULL) ||
! 1590: (bm->process_rsclient_queue == NULL) )
! 1591: bgp_process_queue_init ();
! 1592:
! 1593: pqnode = XCALLOC (MTYPE_BGP_PROCESS_QUEUE,
! 1594: sizeof (struct bgp_process_queue));
! 1595: if (!pqnode)
! 1596: return;
! 1597:
! 1598: /* all unlocked in bgp_processq_del */
! 1599: bgp_table_lock (rn->table);
! 1600: pqnode->rn = bgp_lock_node (rn);
! 1601: pqnode->bgp = bgp;
! 1602: bgp_lock (bgp);
! 1603: pqnode->afi = afi;
! 1604: pqnode->safi = safi;
! 1605:
! 1606: switch (rn->table->type)
! 1607: {
! 1608: case BGP_TABLE_MAIN:
! 1609: work_queue_add (bm->process_main_queue, pqnode);
! 1610: break;
! 1611: case BGP_TABLE_RSCLIENT:
! 1612: work_queue_add (bm->process_rsclient_queue, pqnode);
! 1613: break;
! 1614: }
! 1615:
! 1616: return;
! 1617: }
! 1618:
! 1619: static int
! 1620: bgp_maximum_prefix_restart_timer (struct thread *thread)
! 1621: {
! 1622: struct peer *peer;
! 1623:
! 1624: peer = THREAD_ARG (thread);
! 1625: peer->t_pmax_restart = NULL;
! 1626:
! 1627: if (BGP_DEBUG (events, EVENTS))
! 1628: zlog_debug ("%s Maximum-prefix restart timer expired, restore peering",
! 1629: peer->host);
! 1630:
! 1631: peer_clear (peer);
! 1632:
! 1633: return 0;
! 1634: }
! 1635:
! 1636: int
! 1637: bgp_maximum_prefix_overflow (struct peer *peer, afi_t afi,
! 1638: safi_t safi, int always)
! 1639: {
! 1640: if (!CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_MAX_PREFIX))
! 1641: return 0;
! 1642:
! 1643: if (peer->pcount[afi][safi] > peer->pmax[afi][safi])
! 1644: {
! 1645: if (CHECK_FLAG (peer->af_sflags[afi][safi], PEER_STATUS_PREFIX_LIMIT)
! 1646: && ! always)
! 1647: return 0;
! 1648:
! 1649: zlog (peer->log, LOG_INFO,
! 1650: "%%MAXPFXEXCEED: No. of %s prefix received from %s %ld exceed, "
! 1651: "limit %ld", afi_safi_print (afi, safi), peer->host,
! 1652: peer->pcount[afi][safi], peer->pmax[afi][safi]);
! 1653: SET_FLAG (peer->af_sflags[afi][safi], PEER_STATUS_PREFIX_LIMIT);
! 1654:
! 1655: if (CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_MAX_PREFIX_WARNING))
! 1656: return 0;
! 1657:
! 1658: {
! 1659: u_int8_t ndata[7];
! 1660:
! 1661: if (safi == SAFI_MPLS_VPN)
! 1662: safi = BGP_SAFI_VPNV4;
! 1663:
! 1664: ndata[0] = (afi >> 8);
! 1665: ndata[1] = afi;
! 1666: ndata[2] = safi;
! 1667: ndata[3] = (peer->pmax[afi][safi] >> 24);
! 1668: ndata[4] = (peer->pmax[afi][safi] >> 16);
! 1669: ndata[5] = (peer->pmax[afi][safi] >> 8);
! 1670: ndata[6] = (peer->pmax[afi][safi]);
! 1671:
! 1672: SET_FLAG (peer->sflags, PEER_STATUS_PREFIX_OVERFLOW);
! 1673: bgp_notify_send_with_data (peer, BGP_NOTIFY_CEASE,
! 1674: BGP_NOTIFY_CEASE_MAX_PREFIX, ndata, 7);
! 1675: }
! 1676:
! 1677: /* restart timer start */
! 1678: if (peer->pmax_restart[afi][safi])
! 1679: {
! 1680: peer->v_pmax_restart = peer->pmax_restart[afi][safi] * 60;
! 1681:
! 1682: if (BGP_DEBUG (events, EVENTS))
! 1683: zlog_debug ("%s Maximum-prefix restart timer started for %d secs",
! 1684: peer->host, peer->v_pmax_restart);
! 1685:
! 1686: BGP_TIMER_ON (peer->t_pmax_restart, bgp_maximum_prefix_restart_timer,
! 1687: peer->v_pmax_restart);
! 1688: }
! 1689:
! 1690: return 1;
! 1691: }
! 1692: else
! 1693: UNSET_FLAG (peer->af_sflags[afi][safi], PEER_STATUS_PREFIX_LIMIT);
! 1694:
! 1695: if (peer->pcount[afi][safi] > (peer->pmax[afi][safi] * peer->pmax_threshold[afi][safi] / 100))
! 1696: {
! 1697: if (CHECK_FLAG (peer->af_sflags[afi][safi], PEER_STATUS_PREFIX_THRESHOLD)
! 1698: && ! always)
! 1699: return 0;
! 1700:
! 1701: zlog (peer->log, LOG_INFO,
! 1702: "%%MAXPFX: No. of %s prefix received from %s reaches %ld, max %ld",
! 1703: afi_safi_print (afi, safi), peer->host, peer->pcount[afi][safi],
! 1704: peer->pmax[afi][safi]);
! 1705: SET_FLAG (peer->af_sflags[afi][safi], PEER_STATUS_PREFIX_THRESHOLD);
! 1706: }
! 1707: else
! 1708: UNSET_FLAG (peer->af_sflags[afi][safi], PEER_STATUS_PREFIX_THRESHOLD);
! 1709: return 0;
! 1710: }
! 1711:
! 1712: /* Unconditionally remove the route from the RIB, without taking
! 1713: * damping into consideration (eg, because the session went down)
! 1714: */
! 1715: static void
! 1716: bgp_rib_remove (struct bgp_node *rn, struct bgp_info *ri, struct peer *peer,
! 1717: afi_t afi, safi_t safi)
! 1718: {
! 1719: bgp_aggregate_decrement (peer->bgp, &rn->p, ri, afi, safi);
! 1720:
! 1721: if (!CHECK_FLAG (ri->flags, BGP_INFO_HISTORY))
! 1722: bgp_info_delete (rn, ri); /* keep historical info */
! 1723:
! 1724: bgp_process (peer->bgp, rn, afi, safi);
! 1725: }
! 1726:
! 1727: static void
! 1728: bgp_rib_withdraw (struct bgp_node *rn, struct bgp_info *ri, struct peer *peer,
! 1729: afi_t afi, safi_t safi)
! 1730: {
! 1731: int status = BGP_DAMP_NONE;
! 1732:
! 1733: /* apply dampening, if result is suppressed, we'll be retaining
! 1734: * the bgp_info in the RIB for historical reference.
! 1735: */
! 1736: if (CHECK_FLAG (peer->bgp->af_flags[afi][safi], BGP_CONFIG_DAMPENING)
! 1737: && peer_sort (peer) == BGP_PEER_EBGP)
! 1738: if ( (status = bgp_damp_withdraw (ri, rn, afi, safi, 0))
! 1739: == BGP_DAMP_SUPPRESSED)
! 1740: {
! 1741: bgp_aggregate_decrement (peer->bgp, &rn->p, ri, afi, safi);
! 1742: return;
! 1743: }
! 1744:
! 1745: bgp_rib_remove (rn, ri, peer, afi, safi);
! 1746: }
! 1747:
! 1748: static void
! 1749: bgp_update_rsclient (struct peer *rsclient, afi_t afi, safi_t safi,
! 1750: struct attr *attr, struct peer *peer, struct prefix *p, int type,
! 1751: int sub_type, struct prefix_rd *prd, u_char *tag)
! 1752: {
! 1753: struct bgp_node *rn;
! 1754: struct bgp *bgp;
! 1755: struct attr new_attr = { 0 };
! 1756: struct attr *attr_new;
! 1757: struct attr *attr_new2;
! 1758: struct bgp_info *ri;
! 1759: struct bgp_info *new;
! 1760: const char *reason;
! 1761: char buf[SU_ADDRSTRLEN];
! 1762:
! 1763: /* Do not insert announces from a rsclient into its own 'bgp_table'. */
! 1764: if (peer == rsclient)
! 1765: return;
! 1766:
! 1767: bgp = peer->bgp;
! 1768: rn = bgp_afi_node_get (rsclient->rib[afi][safi], afi, safi, p, prd);
! 1769:
! 1770: /* Check previously received route. */
! 1771: for (ri = rn->info; ri; ri = ri->next)
! 1772: if (ri->peer == peer && ri->type == type && ri->sub_type == sub_type)
! 1773: break;
! 1774:
! 1775: /* AS path loop check. */
! 1776: if (aspath_loop_check (attr->aspath, rsclient->as) > peer->allowas_in[afi][safi])
! 1777: {
! 1778: reason = "as-path contains our own AS;";
! 1779: goto filtered;
! 1780: }
! 1781:
! 1782: /* Route reflector originator ID check. */
! 1783: if (attr->flag & ATTR_FLAG_BIT (BGP_ATTR_ORIGINATOR_ID)
! 1784: && IPV4_ADDR_SAME (&rsclient->remote_id, &attr->extra->originator_id))
! 1785: {
! 1786: reason = "originator is us;";
! 1787: goto filtered;
! 1788: }
! 1789:
! 1790: bgp_attr_dup (&new_attr, attr);
! 1791:
! 1792: /* Apply export policy. */
! 1793: if (CHECK_FLAG(peer->af_flags[afi][safi], PEER_FLAG_RSERVER_CLIENT) &&
! 1794: bgp_export_modifier (rsclient, peer, p, &new_attr, afi, safi) == RMAP_DENY)
! 1795: {
! 1796: reason = "export-policy;";
! 1797: goto filtered;
! 1798: }
! 1799:
! 1800: attr_new2 = bgp_attr_intern (&new_attr);
! 1801:
! 1802: /* Apply import policy. */
! 1803: if (bgp_import_modifier (rsclient, peer, p, &new_attr, afi, safi) == RMAP_DENY)
! 1804: {
! 1805: bgp_attr_unintern (&attr_new2);
! 1806:
! 1807: reason = "import-policy;";
! 1808: goto filtered;
! 1809: }
! 1810:
! 1811: attr_new = bgp_attr_intern (&new_attr);
! 1812: bgp_attr_unintern (&attr_new2);
! 1813:
! 1814: /* IPv4 unicast next hop check. */
! 1815: if (afi == AFI_IP && safi == SAFI_UNICAST)
! 1816: {
! 1817: /* Next hop must not be 0.0.0.0 nor Class E address. */
! 1818: if (new_attr.nexthop.s_addr == 0
! 1819: || ntohl (new_attr.nexthop.s_addr) >= 0xe0000000)
! 1820: {
! 1821: bgp_attr_unintern (&attr_new);
! 1822:
! 1823: reason = "martian next-hop;";
! 1824: goto filtered;
! 1825: }
! 1826: }
! 1827:
! 1828: /* new_attr isn't passed to any functions after here */
! 1829: bgp_attr_extra_free (&new_attr);
! 1830:
! 1831: /* If the update is implicit withdraw. */
! 1832: if (ri)
! 1833: {
! 1834: ri->uptime = bgp_clock ();
! 1835:
! 1836: /* Same attribute comes in. */
! 1837: if (!CHECK_FLAG(ri->flags, BGP_INFO_REMOVED)
! 1838: && attrhash_cmp (ri->attr, attr_new))
! 1839: {
! 1840:
! 1841: bgp_info_unset_flag (rn, ri, BGP_INFO_ATTR_CHANGED);
! 1842:
! 1843: if (BGP_DEBUG (update, UPDATE_IN))
! 1844: zlog (peer->log, LOG_DEBUG,
! 1845: "%s rcvd %s/%d for RS-client %s...duplicate ignored",
! 1846: peer->host,
! 1847: inet_ntop(p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
! 1848: p->prefixlen, rsclient->host);
! 1849:
! 1850: bgp_unlock_node (rn);
! 1851: bgp_attr_unintern (&attr_new);
! 1852:
! 1853: return;
! 1854: }
! 1855:
! 1856: /* Withdraw/Announce before we fully processed the withdraw */
! 1857: if (CHECK_FLAG(ri->flags, BGP_INFO_REMOVED))
! 1858: bgp_info_restore (rn, ri);
! 1859:
! 1860: /* Received Logging. */
! 1861: if (BGP_DEBUG (update, UPDATE_IN))
! 1862: zlog (peer->log, LOG_DEBUG, "%s rcvd %s/%d for RS-client %s",
! 1863: peer->host,
! 1864: inet_ntop(p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
! 1865: p->prefixlen, rsclient->host);
! 1866:
! 1867: /* The attribute is changed. */
! 1868: bgp_info_set_flag (rn, ri, BGP_INFO_ATTR_CHANGED);
! 1869:
! 1870: /* Update to new attribute. */
! 1871: bgp_attr_unintern (&ri->attr);
! 1872: ri->attr = attr_new;
! 1873:
! 1874: /* Update MPLS tag. */
! 1875: if (safi == SAFI_MPLS_VPN)
! 1876: memcpy ((bgp_info_extra_get (ri))->tag, tag, 3);
! 1877:
! 1878: bgp_info_set_flag (rn, ri, BGP_INFO_VALID);
! 1879:
! 1880: /* Process change. */
! 1881: bgp_process (bgp, rn, afi, safi);
! 1882: bgp_unlock_node (rn);
! 1883:
! 1884: return;
! 1885: }
! 1886:
! 1887: /* Received Logging. */
! 1888: if (BGP_DEBUG (update, UPDATE_IN))
! 1889: {
! 1890: zlog (peer->log, LOG_DEBUG, "%s rcvd %s/%d for RS-client %s",
! 1891: peer->host,
! 1892: inet_ntop(p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
! 1893: p->prefixlen, rsclient->host);
! 1894: }
! 1895:
! 1896: /* Make new BGP info. */
! 1897: new = bgp_info_new ();
! 1898: new->type = type;
! 1899: new->sub_type = sub_type;
! 1900: new->peer = peer;
! 1901: new->attr = attr_new;
! 1902: new->uptime = bgp_clock ();
! 1903:
! 1904: /* Update MPLS tag. */
! 1905: if (safi == SAFI_MPLS_VPN)
! 1906: memcpy ((bgp_info_extra_get (new))->tag, tag, 3);
! 1907:
! 1908: bgp_info_set_flag (rn, new, BGP_INFO_VALID);
! 1909:
! 1910: /* Register new BGP information. */
! 1911: bgp_info_add (rn, new);
! 1912:
! 1913: /* route_node_get lock */
! 1914: bgp_unlock_node (rn);
! 1915:
! 1916: /* Process change. */
! 1917: bgp_process (bgp, rn, afi, safi);
! 1918:
! 1919: bgp_attr_extra_free (&new_attr);
! 1920:
! 1921: return;
! 1922:
! 1923: filtered:
! 1924:
! 1925: /* This BGP update is filtered. Log the reason then update BGP entry. */
! 1926: if (BGP_DEBUG (update, UPDATE_IN))
! 1927: zlog (peer->log, LOG_DEBUG,
! 1928: "%s rcvd UPDATE about %s/%d -- DENIED for RS-client %s due to: %s",
! 1929: peer->host,
! 1930: inet_ntop (p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
! 1931: p->prefixlen, rsclient->host, reason);
! 1932:
! 1933: if (ri)
! 1934: bgp_rib_remove (rn, ri, peer, afi, safi);
! 1935:
! 1936: bgp_unlock_node (rn);
! 1937:
! 1938: if (new_attr.extra)
! 1939: bgp_attr_extra_free (&new_attr);
! 1940:
! 1941: return;
! 1942: }
! 1943:
! 1944: static void
! 1945: bgp_withdraw_rsclient (struct peer *rsclient, afi_t afi, safi_t safi,
! 1946: struct peer *peer, struct prefix *p, int type, int sub_type,
! 1947: struct prefix_rd *prd, u_char *tag)
! 1948: {
! 1949: struct bgp_node *rn;
! 1950: struct bgp_info *ri;
! 1951: char buf[SU_ADDRSTRLEN];
! 1952:
! 1953: if (rsclient == peer)
! 1954: return;
! 1955:
! 1956: rn = bgp_afi_node_get (rsclient->rib[afi][safi], afi, safi, p, prd);
! 1957:
! 1958: /* Lookup withdrawn route. */
! 1959: for (ri = rn->info; ri; ri = ri->next)
! 1960: if (ri->peer == peer && ri->type == type && ri->sub_type == sub_type)
! 1961: break;
! 1962:
! 1963: /* Withdraw specified route from routing table. */
! 1964: if (ri && ! CHECK_FLAG (ri->flags, BGP_INFO_HISTORY))
! 1965: bgp_rib_withdraw (rn, ri, peer, afi, safi);
! 1966: else if (BGP_DEBUG (update, UPDATE_IN))
! 1967: zlog (peer->log, LOG_DEBUG,
! 1968: "%s Can't find the route %s/%d", peer->host,
! 1969: inet_ntop (p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
! 1970: p->prefixlen);
! 1971:
! 1972: /* Unlock bgp_node_get() lock. */
! 1973: bgp_unlock_node (rn);
! 1974: }
! 1975:
! 1976: static int
! 1977: bgp_update_main (struct peer *peer, struct prefix *p, struct attr *attr,
! 1978: afi_t afi, safi_t safi, int type, int sub_type,
! 1979: struct prefix_rd *prd, u_char *tag, int soft_reconfig)
! 1980: {
! 1981: int ret;
! 1982: int aspath_loop_count = 0;
! 1983: struct bgp_node *rn;
! 1984: struct bgp *bgp;
! 1985: struct attr new_attr = { 0 };
! 1986: struct attr *attr_new;
! 1987: struct bgp_info *ri;
! 1988: struct bgp_info *new;
! 1989: const char *reason;
! 1990: char buf[SU_ADDRSTRLEN];
! 1991:
! 1992: bgp = peer->bgp;
! 1993: rn = bgp_afi_node_get (bgp->rib[afi][safi], afi, safi, p, prd);
! 1994:
! 1995: /* When peer's soft reconfiguration enabled. Record input packet in
! 1996: Adj-RIBs-In. */
! 1997: if (CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_SOFT_RECONFIG)
! 1998: && peer != bgp->peer_self && ! soft_reconfig)
! 1999: bgp_adj_in_set (rn, peer, attr);
! 2000:
! 2001: /* Check previously received route. */
! 2002: for (ri = rn->info; ri; ri = ri->next)
! 2003: if (ri->peer == peer && ri->type == type && ri->sub_type == sub_type)
! 2004: break;
! 2005:
! 2006: /* AS path local-as loop check. */
! 2007: if (peer->change_local_as)
! 2008: {
! 2009: if (! CHECK_FLAG (peer->flags, PEER_FLAG_LOCAL_AS_NO_PREPEND))
! 2010: aspath_loop_count = 1;
! 2011:
! 2012: if (aspath_loop_check (attr->aspath, peer->change_local_as) > aspath_loop_count)
! 2013: {
! 2014: reason = "as-path contains our own AS;";
! 2015: goto filtered;
! 2016: }
! 2017: }
! 2018:
! 2019: /* AS path loop check. */
! 2020: if (aspath_loop_check (attr->aspath, bgp->as) > peer->allowas_in[afi][safi]
! 2021: || (CHECK_FLAG(bgp->config, BGP_CONFIG_CONFEDERATION)
! 2022: && aspath_loop_check(attr->aspath, bgp->confed_id)
! 2023: > peer->allowas_in[afi][safi]))
! 2024: {
! 2025: reason = "as-path contains our own AS;";
! 2026: goto filtered;
! 2027: }
! 2028:
! 2029: /* Route reflector originator ID check. */
! 2030: if (attr->flag & ATTR_FLAG_BIT (BGP_ATTR_ORIGINATOR_ID)
! 2031: && IPV4_ADDR_SAME (&bgp->router_id, &attr->extra->originator_id))
! 2032: {
! 2033: reason = "originator is us;";
! 2034: goto filtered;
! 2035: }
! 2036:
! 2037: /* Route reflector cluster ID check. */
! 2038: if (bgp_cluster_filter (peer, attr))
! 2039: {
! 2040: reason = "reflected from the same cluster;";
! 2041: goto filtered;
! 2042: }
! 2043:
! 2044: /* Apply incoming filter. */
! 2045: if (bgp_input_filter (peer, p, attr, afi, safi) == FILTER_DENY)
! 2046: {
! 2047: reason = "filter;";
! 2048: goto filtered;
! 2049: }
! 2050:
! 2051: /* Apply incoming route-map. */
! 2052: bgp_attr_dup (&new_attr, attr);
! 2053:
! 2054: if (bgp_input_modifier (peer, p, &new_attr, afi, safi) == RMAP_DENY)
! 2055: {
! 2056: reason = "route-map;";
! 2057: goto filtered;
! 2058: }
! 2059:
! 2060: /* IPv4 unicast next hop check. */
! 2061: if (afi == AFI_IP && safi == SAFI_UNICAST)
! 2062: {
! 2063: /* If the peer is EBGP and nexthop is not on connected route,
! 2064: discard it. */
! 2065: if (peer_sort (peer) == BGP_PEER_EBGP && peer->ttl == 1
! 2066: && ! bgp_nexthop_check_ebgp (afi, &new_attr)
! 2067: && ! CHECK_FLAG (peer->flags, PEER_FLAG_DISABLE_CONNECTED_CHECK))
! 2068: {
! 2069: reason = "non-connected next-hop;";
! 2070: goto filtered;
! 2071: }
! 2072:
! 2073: /* Next hop must not be 0.0.0.0 nor Class E address. Next hop
! 2074: must not be my own address. */
! 2075: if (bgp_nexthop_self (afi, &new_attr)
! 2076: || new_attr.nexthop.s_addr == 0
! 2077: || ntohl (new_attr.nexthop.s_addr) >= 0xe0000000)
! 2078: {
! 2079: reason = "martian next-hop;";
! 2080: goto filtered;
! 2081: }
! 2082: }
! 2083:
! 2084: attr_new = bgp_attr_intern (&new_attr);
! 2085:
! 2086: /* If the update is implicit withdraw. */
! 2087: if (ri)
! 2088: {
! 2089: ri->uptime = bgp_clock ();
! 2090:
! 2091: /* Same attribute comes in. */
! 2092: if (!CHECK_FLAG (ri->flags, BGP_INFO_REMOVED)
! 2093: && attrhash_cmp (ri->attr, attr_new))
! 2094: {
! 2095: bgp_info_unset_flag (rn, ri, BGP_INFO_ATTR_CHANGED);
! 2096:
! 2097: if (CHECK_FLAG (bgp->af_flags[afi][safi], BGP_CONFIG_DAMPENING)
! 2098: && peer_sort (peer) == BGP_PEER_EBGP
! 2099: && CHECK_FLAG (ri->flags, BGP_INFO_HISTORY))
! 2100: {
! 2101: if (BGP_DEBUG (update, UPDATE_IN))
! 2102: zlog (peer->log, LOG_DEBUG, "%s rcvd %s/%d",
! 2103: peer->host,
! 2104: inet_ntop(p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
! 2105: p->prefixlen);
! 2106:
! 2107: if (bgp_damp_update (ri, rn, afi, safi) != BGP_DAMP_SUPPRESSED)
! 2108: {
! 2109: bgp_aggregate_increment (bgp, p, ri, afi, safi);
! 2110: bgp_process (bgp, rn, afi, safi);
! 2111: }
! 2112: }
! 2113: else /* Duplicate - odd */
! 2114: {
! 2115: if (BGP_DEBUG (update, UPDATE_IN))
! 2116: zlog (peer->log, LOG_DEBUG,
! 2117: "%s rcvd %s/%d...duplicate ignored",
! 2118: peer->host,
! 2119: inet_ntop(p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
! 2120: p->prefixlen);
! 2121:
! 2122: /* graceful restart STALE flag unset. */
! 2123: if (CHECK_FLAG (ri->flags, BGP_INFO_STALE))
! 2124: {
! 2125: bgp_info_unset_flag (rn, ri, BGP_INFO_STALE);
! 2126: bgp_process (bgp, rn, afi, safi);
! 2127: }
! 2128: }
! 2129:
! 2130: bgp_unlock_node (rn);
! 2131: bgp_attr_unintern (&attr_new);
! 2132: bgp_attr_extra_free (&new_attr);
! 2133:
! 2134: return 0;
! 2135: }
! 2136:
! 2137: /* Withdraw/Announce before we fully processed the withdraw */
! 2138: if (CHECK_FLAG(ri->flags, BGP_INFO_REMOVED))
! 2139: {
! 2140: if (BGP_DEBUG (update, UPDATE_IN))
! 2141: zlog (peer->log, LOG_DEBUG, "%s rcvd %s/%d, flapped quicker than processing",
! 2142: peer->host,
! 2143: inet_ntop(p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
! 2144: p->prefixlen);
! 2145: bgp_info_restore (rn, ri);
! 2146: }
! 2147:
! 2148: /* Received Logging. */
! 2149: if (BGP_DEBUG (update, UPDATE_IN))
! 2150: zlog (peer->log, LOG_DEBUG, "%s rcvd %s/%d",
! 2151: peer->host,
! 2152: inet_ntop(p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
! 2153: p->prefixlen);
! 2154:
! 2155: /* graceful restart STALE flag unset. */
! 2156: if (CHECK_FLAG (ri->flags, BGP_INFO_STALE))
! 2157: bgp_info_unset_flag (rn, ri, BGP_INFO_STALE);
! 2158:
! 2159: /* The attribute is changed. */
! 2160: bgp_info_set_flag (rn, ri, BGP_INFO_ATTR_CHANGED);
! 2161:
! 2162: /* implicit withdraw, decrement aggregate and pcount here.
! 2163: * only if update is accepted, they'll increment below.
! 2164: */
! 2165: bgp_aggregate_decrement (bgp, p, ri, afi, safi);
! 2166:
! 2167: /* Update bgp route dampening information. */
! 2168: if (CHECK_FLAG (bgp->af_flags[afi][safi], BGP_CONFIG_DAMPENING)
! 2169: && peer_sort (peer) == BGP_PEER_EBGP)
! 2170: {
! 2171: /* This is implicit withdraw so we should update dampening
! 2172: information. */
! 2173: if (! CHECK_FLAG (ri->flags, BGP_INFO_HISTORY))
! 2174: bgp_damp_withdraw (ri, rn, afi, safi, 1);
! 2175: }
! 2176:
! 2177: /* Update to new attribute. */
! 2178: bgp_attr_unintern (&ri->attr);
! 2179: ri->attr = attr_new;
! 2180:
! 2181: /* Update MPLS tag. */
! 2182: if (safi == SAFI_MPLS_VPN)
! 2183: memcpy ((bgp_info_extra_get (ri))->tag, tag, 3);
! 2184:
! 2185: /* Update bgp route dampening information. */
! 2186: if (CHECK_FLAG (bgp->af_flags[afi][safi], BGP_CONFIG_DAMPENING)
! 2187: && peer_sort (peer) == BGP_PEER_EBGP)
! 2188: {
! 2189: /* Now we do normal update dampening. */
! 2190: ret = bgp_damp_update (ri, rn, afi, safi);
! 2191: if (ret == BGP_DAMP_SUPPRESSED)
! 2192: {
! 2193: bgp_unlock_node (rn);
! 2194: bgp_attr_extra_free (&new_attr);
! 2195: return 0;
! 2196: }
! 2197: }
! 2198:
! 2199: /* Nexthop reachability check. */
! 2200: if ((afi == AFI_IP || afi == AFI_IP6)
! 2201: && safi == SAFI_UNICAST
! 2202: && (peer_sort (peer) == BGP_PEER_IBGP
! 2203: || peer_sort (peer) == BGP_PEER_CONFED
! 2204: || (peer_sort (peer) == BGP_PEER_EBGP && peer->ttl != 1)
! 2205: || CHECK_FLAG (peer->flags, PEER_FLAG_DISABLE_CONNECTED_CHECK)))
! 2206: {
! 2207: if (bgp_nexthop_lookup (afi, peer, ri, NULL, NULL))
! 2208: bgp_info_set_flag (rn, ri, BGP_INFO_VALID);
! 2209: else
! 2210: bgp_info_unset_flag (rn, ri, BGP_INFO_VALID);
! 2211: }
! 2212: else
! 2213: bgp_info_set_flag (rn, ri, BGP_INFO_VALID);
! 2214:
! 2215: /* Process change. */
! 2216: bgp_aggregate_increment (bgp, p, ri, afi, safi);
! 2217:
! 2218: bgp_process (bgp, rn, afi, safi);
! 2219: bgp_unlock_node (rn);
! 2220: bgp_attr_extra_free (&new_attr);
! 2221:
! 2222: return 0;
! 2223: }
! 2224:
! 2225: /* Received Logging. */
! 2226: if (BGP_DEBUG (update, UPDATE_IN))
! 2227: {
! 2228: zlog (peer->log, LOG_DEBUG, "%s rcvd %s/%d",
! 2229: peer->host,
! 2230: inet_ntop(p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
! 2231: p->prefixlen);
! 2232: }
! 2233:
! 2234: /* Make new BGP info. */
! 2235: new = bgp_info_new ();
! 2236: new->type = type;
! 2237: new->sub_type = sub_type;
! 2238: new->peer = peer;
! 2239: new->attr = attr_new;
! 2240: new->uptime = bgp_clock ();
! 2241:
! 2242: /* Update MPLS tag. */
! 2243: if (safi == SAFI_MPLS_VPN)
! 2244: memcpy ((bgp_info_extra_get (new))->tag, tag, 3);
! 2245:
! 2246: /* Nexthop reachability check. */
! 2247: if ((afi == AFI_IP || afi == AFI_IP6)
! 2248: && safi == SAFI_UNICAST
! 2249: && (peer_sort (peer) == BGP_PEER_IBGP
! 2250: || peer_sort (peer) == BGP_PEER_CONFED
! 2251: || (peer_sort (peer) == BGP_PEER_EBGP && peer->ttl != 1)
! 2252: || CHECK_FLAG (peer->flags, PEER_FLAG_DISABLE_CONNECTED_CHECK)))
! 2253: {
! 2254: if (bgp_nexthop_lookup (afi, peer, new, NULL, NULL))
! 2255: bgp_info_set_flag (rn, new, BGP_INFO_VALID);
! 2256: else
! 2257: bgp_info_unset_flag (rn, new, BGP_INFO_VALID);
! 2258: }
! 2259: else
! 2260: bgp_info_set_flag (rn, new, BGP_INFO_VALID);
! 2261:
! 2262: /* Increment prefix */
! 2263: bgp_aggregate_increment (bgp, p, new, afi, safi);
! 2264:
! 2265: /* Register new BGP information. */
! 2266: bgp_info_add (rn, new);
! 2267:
! 2268: /* route_node_get lock */
! 2269: bgp_unlock_node (rn);
! 2270:
! 2271: bgp_attr_extra_free (&new_attr);
! 2272:
! 2273: /* If maximum prefix count is configured and current prefix
! 2274: count exeed it. */
! 2275: if (bgp_maximum_prefix_overflow (peer, afi, safi, 0))
! 2276: return -1;
! 2277:
! 2278: /* Process change. */
! 2279: bgp_process (bgp, rn, afi, safi);
! 2280:
! 2281: return 0;
! 2282:
! 2283: /* This BGP update is filtered. Log the reason then update BGP
! 2284: entry. */
! 2285: filtered:
! 2286: if (BGP_DEBUG (update, UPDATE_IN))
! 2287: zlog (peer->log, LOG_DEBUG,
! 2288: "%s rcvd UPDATE about %s/%d -- DENIED due to: %s",
! 2289: peer->host,
! 2290: inet_ntop (p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
! 2291: p->prefixlen, reason);
! 2292:
! 2293: if (ri)
! 2294: bgp_rib_remove (rn, ri, peer, afi, safi);
! 2295:
! 2296: bgp_unlock_node (rn);
! 2297:
! 2298: bgp_attr_extra_free (&new_attr);
! 2299:
! 2300: return 0;
! 2301: }
! 2302:
! 2303: int
! 2304: bgp_update (struct peer *peer, struct prefix *p, struct attr *attr,
! 2305: afi_t afi, safi_t safi, int type, int sub_type,
! 2306: struct prefix_rd *prd, u_char *tag, int soft_reconfig)
! 2307: {
! 2308: struct peer *rsclient;
! 2309: struct listnode *node, *nnode;
! 2310: struct bgp *bgp;
! 2311: int ret;
! 2312:
! 2313: ret = bgp_update_main (peer, p, attr, afi, safi, type, sub_type, prd, tag,
! 2314: soft_reconfig);
! 2315:
! 2316: bgp = peer->bgp;
! 2317:
! 2318: /* Process the update for each RS-client. */
! 2319: for (ALL_LIST_ELEMENTS (bgp->rsclient, node, nnode, rsclient))
! 2320: {
! 2321: if (CHECK_FLAG (rsclient->af_flags[afi][safi], PEER_FLAG_RSERVER_CLIENT))
! 2322: bgp_update_rsclient (rsclient, afi, safi, attr, peer, p, type,
! 2323: sub_type, prd, tag);
! 2324: }
! 2325:
! 2326: return ret;
! 2327: }
! 2328:
! 2329: int
! 2330: bgp_withdraw (struct peer *peer, struct prefix *p, struct attr *attr,
! 2331: afi_t afi, safi_t safi, int type, int sub_type,
! 2332: struct prefix_rd *prd, u_char *tag)
! 2333: {
! 2334: struct bgp *bgp;
! 2335: char buf[SU_ADDRSTRLEN];
! 2336: struct bgp_node *rn;
! 2337: struct bgp_info *ri;
! 2338: struct peer *rsclient;
! 2339: struct listnode *node, *nnode;
! 2340:
! 2341: bgp = peer->bgp;
! 2342:
! 2343: /* Process the withdraw for each RS-client. */
! 2344: for (ALL_LIST_ELEMENTS (bgp->rsclient, node, nnode, rsclient))
! 2345: {
! 2346: if (CHECK_FLAG (rsclient->af_flags[afi][safi], PEER_FLAG_RSERVER_CLIENT))
! 2347: bgp_withdraw_rsclient (rsclient, afi, safi, peer, p, type, sub_type, prd, tag);
! 2348: }
! 2349:
! 2350: /* Logging. */
! 2351: if (BGP_DEBUG (update, UPDATE_IN))
! 2352: zlog (peer->log, LOG_DEBUG, "%s rcvd UPDATE about %s/%d -- withdrawn",
! 2353: peer->host,
! 2354: inet_ntop(p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
! 2355: p->prefixlen);
! 2356:
! 2357: /* Lookup node. */
! 2358: rn = bgp_afi_node_get (bgp->rib[afi][safi], afi, safi, p, prd);
! 2359:
! 2360: /* If peer is soft reconfiguration enabled. Record input packet for
! 2361: further calculation. */
! 2362: if (CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_SOFT_RECONFIG)
! 2363: && peer != bgp->peer_self)
! 2364: bgp_adj_in_unset (rn, peer);
! 2365:
! 2366: /* Lookup withdrawn route. */
! 2367: for (ri = rn->info; ri; ri = ri->next)
! 2368: if (ri->peer == peer && ri->type == type && ri->sub_type == sub_type)
! 2369: break;
! 2370:
! 2371: /* Withdraw specified route from routing table. */
! 2372: if (ri && ! CHECK_FLAG (ri->flags, BGP_INFO_HISTORY))
! 2373: bgp_rib_withdraw (rn, ri, peer, afi, safi);
! 2374: else if (BGP_DEBUG (update, UPDATE_IN))
! 2375: zlog (peer->log, LOG_DEBUG,
! 2376: "%s Can't find the route %s/%d", peer->host,
! 2377: inet_ntop (p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
! 2378: p->prefixlen);
! 2379:
! 2380: /* Unlock bgp_node_get() lock. */
! 2381: bgp_unlock_node (rn);
! 2382:
! 2383: return 0;
! 2384: }
! 2385:
! 2386: void
! 2387: bgp_default_originate (struct peer *peer, afi_t afi, safi_t safi, int withdraw)
! 2388: {
! 2389: struct bgp *bgp;
! 2390: struct attr attr = { 0 };
! 2391: struct aspath *aspath = { 0 };
! 2392: struct prefix p;
! 2393: struct bgp_info binfo;
! 2394: struct peer *from;
! 2395: int ret = RMAP_DENYMATCH;
! 2396:
! 2397: if (!(afi == AFI_IP || afi == AFI_IP6))
! 2398: return;
! 2399:
! 2400: bgp = peer->bgp;
! 2401: from = bgp->peer_self;
! 2402:
! 2403: bgp_attr_default_set (&attr, BGP_ORIGIN_IGP);
! 2404: aspath = attr.aspath;
! 2405: attr.local_pref = bgp->default_local_pref;
! 2406: memcpy (&attr.nexthop, &peer->nexthop.v4, IPV4_MAX_BYTELEN);
! 2407:
! 2408: if (afi == AFI_IP)
! 2409: str2prefix ("0.0.0.0/0", &p);
! 2410: #ifdef HAVE_IPV6
! 2411: else if (afi == AFI_IP6)
! 2412: {
! 2413: struct attr_extra *ae;
! 2414: attr.extra = NULL;
! 2415:
! 2416: ae = bgp_attr_extra_get (&attr);
! 2417: attr.extra = ae;
! 2418:
! 2419: str2prefix ("::/0", &p);
! 2420:
! 2421: /* IPv6 global nexthop must be included. */
! 2422: memcpy (&ae->mp_nexthop_global, &peer->nexthop.v6_global,
! 2423: IPV6_MAX_BYTELEN);
! 2424: ae->mp_nexthop_len = 16;
! 2425:
! 2426: /* If the peer is on shared nextwork and we have link-local
! 2427: nexthop set it. */
! 2428: if (peer->shared_network
! 2429: && !IN6_IS_ADDR_UNSPECIFIED (&peer->nexthop.v6_local))
! 2430: {
! 2431: memcpy (&ae->mp_nexthop_local, &peer->nexthop.v6_local,
! 2432: IPV6_MAX_BYTELEN);
! 2433: ae->mp_nexthop_len = 32;
! 2434: }
! 2435: }
! 2436: #endif /* HAVE_IPV6 */
! 2437:
! 2438: if (peer->default_rmap[afi][safi].name)
! 2439: {
! 2440: binfo.peer = bgp->peer_self;
! 2441: binfo.attr = &attr;
! 2442:
! 2443: SET_FLAG (bgp->peer_self->rmap_type, PEER_RMAP_TYPE_DEFAULT);
! 2444:
! 2445: ret = route_map_apply (peer->default_rmap[afi][safi].map, &p,
! 2446: RMAP_BGP, &binfo);
! 2447:
! 2448: bgp->peer_self->rmap_type = 0;
! 2449:
! 2450: if (ret == RMAP_DENYMATCH)
! 2451: {
! 2452: bgp_attr_flush (&attr);
! 2453: withdraw = 1;
! 2454: }
! 2455: }
! 2456:
! 2457: if (withdraw)
! 2458: {
! 2459: if (CHECK_FLAG (peer->af_sflags[afi][safi], PEER_STATUS_DEFAULT_ORIGINATE))
! 2460: bgp_default_withdraw_send (peer, afi, safi);
! 2461: UNSET_FLAG (peer->af_sflags[afi][safi], PEER_STATUS_DEFAULT_ORIGINATE);
! 2462: }
! 2463: else
! 2464: {
! 2465: SET_FLAG (peer->af_sflags[afi][safi], PEER_STATUS_DEFAULT_ORIGINATE);
! 2466: bgp_default_update_send (peer, &attr, afi, safi, from);
! 2467: }
! 2468:
! 2469: bgp_attr_extra_free (&attr);
! 2470: aspath_unintern (&aspath);
! 2471: }
! 2472:
! 2473: static void
! 2474: bgp_announce_table (struct peer *peer, afi_t afi, safi_t safi,
! 2475: struct bgp_table *table, int rsclient)
! 2476: {
! 2477: struct bgp_node *rn;
! 2478: struct bgp_info *ri;
! 2479: struct attr attr = { 0 };
! 2480:
! 2481: if (! table)
! 2482: table = (rsclient) ? peer->rib[afi][safi] : peer->bgp->rib[afi][safi];
! 2483:
! 2484: if (safi != SAFI_MPLS_VPN
! 2485: && CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_DEFAULT_ORIGINATE))
! 2486: bgp_default_originate (peer, afi, safi, 0);
! 2487:
! 2488: for (rn = bgp_table_top (table); rn; rn = bgp_route_next(rn))
! 2489: for (ri = rn->info; ri; ri = ri->next)
! 2490: if (CHECK_FLAG (ri->flags, BGP_INFO_SELECTED) && ri->peer != peer)
! 2491: {
! 2492: if ( (rsclient) ?
! 2493: (bgp_announce_check_rsclient (ri, peer, &rn->p, &attr, afi, safi))
! 2494: : (bgp_announce_check (ri, peer, &rn->p, &attr, afi, safi)))
! 2495: bgp_adj_out_set (rn, peer, &rn->p, &attr, afi, safi, ri);
! 2496: else
! 2497: bgp_adj_out_unset (rn, peer, &rn->p, afi, safi);
! 2498:
! 2499: bgp_attr_extra_free (&attr);
! 2500: }
! 2501: }
! 2502:
! 2503: void
! 2504: bgp_announce_route (struct peer *peer, afi_t afi, safi_t safi)
! 2505: {
! 2506: struct bgp_node *rn;
! 2507: struct bgp_table *table;
! 2508:
! 2509: if (peer->status != Established)
! 2510: return;
! 2511:
! 2512: if (! peer->afc_nego[afi][safi])
! 2513: return;
! 2514:
! 2515: /* First update is deferred until ORF or ROUTE-REFRESH is received */
! 2516: if (CHECK_FLAG (peer->af_sflags[afi][safi], PEER_STATUS_ORF_WAIT_REFRESH))
! 2517: return;
! 2518:
! 2519: if (safi != SAFI_MPLS_VPN)
! 2520: bgp_announce_table (peer, afi, safi, NULL, 0);
! 2521: else
! 2522: for (rn = bgp_table_top (peer->bgp->rib[afi][safi]); rn;
! 2523: rn = bgp_route_next(rn))
! 2524: if ((table = (rn->info)) != NULL)
! 2525: bgp_announce_table (peer, afi, safi, table, 0);
! 2526:
! 2527: if (CHECK_FLAG(peer->af_flags[afi][safi], PEER_FLAG_RSERVER_CLIENT))
! 2528: bgp_announce_table (peer, afi, safi, NULL, 1);
! 2529: }
! 2530:
! 2531: void
! 2532: bgp_announce_route_all (struct peer *peer)
! 2533: {
! 2534: afi_t afi;
! 2535: safi_t safi;
! 2536:
! 2537: for (afi = AFI_IP; afi < AFI_MAX; afi++)
! 2538: for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++)
! 2539: bgp_announce_route (peer, afi, safi);
! 2540: }
! 2541:
! 2542: static void
! 2543: bgp_soft_reconfig_table_rsclient (struct peer *rsclient, afi_t afi,
! 2544: safi_t safi, struct bgp_table *table)
! 2545: {
! 2546: struct bgp_node *rn;
! 2547: struct bgp_adj_in *ain;
! 2548:
! 2549: if (! table)
! 2550: table = rsclient->bgp->rib[afi][safi];
! 2551:
! 2552: for (rn = bgp_table_top (table); rn; rn = bgp_route_next (rn))
! 2553: for (ain = rn->adj_in; ain; ain = ain->next)
! 2554: {
! 2555: bgp_update_rsclient (rsclient, afi, safi, ain->attr, ain->peer,
! 2556: &rn->p, ZEBRA_ROUTE_BGP, BGP_ROUTE_NORMAL, NULL, NULL);
! 2557: }
! 2558: }
! 2559:
! 2560: void
! 2561: bgp_soft_reconfig_rsclient (struct peer *rsclient, afi_t afi, safi_t safi)
! 2562: {
! 2563: struct bgp_table *table;
! 2564: struct bgp_node *rn;
! 2565:
! 2566: if (safi != SAFI_MPLS_VPN)
! 2567: bgp_soft_reconfig_table_rsclient (rsclient, afi, safi, NULL);
! 2568:
! 2569: else
! 2570: for (rn = bgp_table_top (rsclient->bgp->rib[afi][safi]); rn;
! 2571: rn = bgp_route_next (rn))
! 2572: if ((table = rn->info) != NULL)
! 2573: bgp_soft_reconfig_table_rsclient (rsclient, afi, safi, table);
! 2574: }
! 2575:
! 2576: static void
! 2577: bgp_soft_reconfig_table (struct peer *peer, afi_t afi, safi_t safi,
! 2578: struct bgp_table *table)
! 2579: {
! 2580: int ret;
! 2581: struct bgp_node *rn;
! 2582: struct bgp_adj_in *ain;
! 2583:
! 2584: if (! table)
! 2585: table = peer->bgp->rib[afi][safi];
! 2586:
! 2587: for (rn = bgp_table_top (table); rn; rn = bgp_route_next (rn))
! 2588: for (ain = rn->adj_in; ain; ain = ain->next)
! 2589: {
! 2590: if (ain->peer == peer)
! 2591: {
! 2592: ret = bgp_update (peer, &rn->p, ain->attr, afi, safi,
! 2593: ZEBRA_ROUTE_BGP, BGP_ROUTE_NORMAL,
! 2594: NULL, NULL, 1);
! 2595: if (ret < 0)
! 2596: {
! 2597: bgp_unlock_node (rn);
! 2598: return;
! 2599: }
! 2600: continue;
! 2601: }
! 2602: }
! 2603: }
! 2604:
! 2605: void
! 2606: bgp_soft_reconfig_in (struct peer *peer, afi_t afi, safi_t safi)
! 2607: {
! 2608: struct bgp_node *rn;
! 2609: struct bgp_table *table;
! 2610:
! 2611: if (peer->status != Established)
! 2612: return;
! 2613:
! 2614: if (safi != SAFI_MPLS_VPN)
! 2615: bgp_soft_reconfig_table (peer, afi, safi, NULL);
! 2616: else
! 2617: for (rn = bgp_table_top (peer->bgp->rib[afi][safi]); rn;
! 2618: rn = bgp_route_next (rn))
! 2619: if ((table = rn->info) != NULL)
! 2620: bgp_soft_reconfig_table (peer, afi, safi, table);
! 2621: }
! 2622:
! 2623:
! 2624: struct bgp_clear_node_queue
! 2625: {
! 2626: struct bgp_node *rn;
! 2627: enum bgp_clear_route_type purpose;
! 2628: };
! 2629:
! 2630: static wq_item_status
! 2631: bgp_clear_route_node (struct work_queue *wq, void *data)
! 2632: {
! 2633: struct bgp_clear_node_queue *cnq = data;
! 2634: struct bgp_node *rn = cnq->rn;
! 2635: struct peer *peer = wq->spec.data;
! 2636: struct bgp_info *ri;
! 2637: afi_t afi = rn->table->afi;
! 2638: safi_t safi = rn->table->safi;
! 2639:
! 2640: assert (rn && peer);
! 2641:
! 2642: for (ri = rn->info; ri; ri = ri->next)
! 2643: if (ri->peer == peer || cnq->purpose == BGP_CLEAR_ROUTE_MY_RSCLIENT)
! 2644: {
! 2645: /* graceful restart STALE flag set. */
! 2646: if (CHECK_FLAG (peer->sflags, PEER_STATUS_NSF_WAIT)
! 2647: && peer->nsf[afi][safi]
! 2648: && ! CHECK_FLAG (ri->flags, BGP_INFO_STALE)
! 2649: && ! CHECK_FLAG (ri->flags, BGP_INFO_UNUSEABLE))
! 2650: bgp_info_set_flag (rn, ri, BGP_INFO_STALE);
! 2651: else
! 2652: bgp_rib_remove (rn, ri, peer, afi, safi);
! 2653: break;
! 2654: }
! 2655: return WQ_SUCCESS;
! 2656: }
! 2657:
! 2658: static void
! 2659: bgp_clear_node_queue_del (struct work_queue *wq, void *data)
! 2660: {
! 2661: struct bgp_clear_node_queue *cnq = data;
! 2662: struct bgp_node *rn = cnq->rn;
! 2663: struct bgp_table *table = rn->table;
! 2664:
! 2665: bgp_unlock_node (rn);
! 2666: bgp_table_unlock (table);
! 2667: XFREE (MTYPE_BGP_CLEAR_NODE_QUEUE, cnq);
! 2668: }
! 2669:
! 2670: static void
! 2671: bgp_clear_node_complete (struct work_queue *wq)
! 2672: {
! 2673: struct peer *peer = wq->spec.data;
! 2674:
! 2675: /* Tickle FSM to start moving again */
! 2676: BGP_EVENT_ADD (peer, Clearing_Completed);
! 2677:
! 2678: peer_unlock (peer); /* bgp_clear_route */
! 2679: }
! 2680:
! 2681: static void
! 2682: bgp_clear_node_queue_init (struct peer *peer)
! 2683: {
! 2684: char wname[sizeof("clear xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx")];
! 2685:
! 2686: snprintf (wname, sizeof(wname), "clear %s", peer->host);
! 2687: #undef CLEAR_QUEUE_NAME_LEN
! 2688:
! 2689: if ( (peer->clear_node_queue = work_queue_new (bm->master, wname)) == NULL)
! 2690: {
! 2691: zlog_err ("%s: Failed to allocate work queue", __func__);
! 2692: exit (1);
! 2693: }
! 2694: peer->clear_node_queue->spec.hold = 10;
! 2695: peer->clear_node_queue->spec.workfunc = &bgp_clear_route_node;
! 2696: peer->clear_node_queue->spec.del_item_data = &bgp_clear_node_queue_del;
! 2697: peer->clear_node_queue->spec.completion_func = &bgp_clear_node_complete;
! 2698: peer->clear_node_queue->spec.max_retries = 0;
! 2699:
! 2700: /* we only 'lock' this peer reference when the queue is actually active */
! 2701: peer->clear_node_queue->spec.data = peer;
! 2702: }
! 2703:
! 2704: static void
! 2705: bgp_clear_route_table (struct peer *peer, afi_t afi, safi_t safi,
! 2706: struct bgp_table *table, struct peer *rsclient,
! 2707: enum bgp_clear_route_type purpose)
! 2708: {
! 2709: struct bgp_node *rn;
! 2710:
! 2711:
! 2712: if (! table)
! 2713: table = (rsclient) ? rsclient->rib[afi][safi] : peer->bgp->rib[afi][safi];
! 2714:
! 2715: /* If still no table => afi/safi isn't configured at all or smth. */
! 2716: if (! table)
! 2717: return;
! 2718:
! 2719: for (rn = bgp_table_top (table); rn; rn = bgp_route_next (rn))
! 2720: {
! 2721: struct bgp_info *ri;
! 2722: struct bgp_adj_in *ain;
! 2723: struct bgp_adj_out *aout;
! 2724:
! 2725: if (rn->info == NULL)
! 2726: continue;
! 2727:
! 2728: /* XXX:TODO: This is suboptimal, every non-empty route_node is
! 2729: * queued for every clearing peer, regardless of whether it is
! 2730: * relevant to the peer at hand.
! 2731: *
! 2732: * Overview: There are 3 different indices which need to be
! 2733: * scrubbed, potentially, when a peer is removed:
! 2734: *
! 2735: * 1 peer's routes visible via the RIB (ie accepted routes)
! 2736: * 2 peer's routes visible by the (optional) peer's adj-in index
! 2737: * 3 other routes visible by the peer's adj-out index
! 2738: *
! 2739: * 3 there is no hurry in scrubbing, once the struct peer is
! 2740: * removed from bgp->peer, we could just GC such deleted peer's
! 2741: * adj-outs at our leisure.
! 2742: *
! 2743: * 1 and 2 must be 'scrubbed' in some way, at least made
! 2744: * invisible via RIB index before peer session is allowed to be
! 2745: * brought back up. So one needs to know when such a 'search' is
! 2746: * complete.
! 2747: *
! 2748: * Ideally:
! 2749: *
! 2750: * - there'd be a single global queue or a single RIB walker
! 2751: * - rather than tracking which route_nodes still need to be
! 2752: * examined on a peer basis, we'd track which peers still
! 2753: * aren't cleared
! 2754: *
! 2755: * Given that our per-peer prefix-counts now should be reliable,
! 2756: * this may actually be achievable. It doesn't seem to be a huge
! 2757: * problem at this time,
! 2758: */
! 2759: for (ri = rn->info; ri; ri = ri->next)
! 2760: if (ri->peer == peer || purpose == BGP_CLEAR_ROUTE_MY_RSCLIENT)
! 2761: {
! 2762: struct bgp_clear_node_queue *cnq;
! 2763:
! 2764: /* both unlocked in bgp_clear_node_queue_del */
! 2765: bgp_table_lock (rn->table);
! 2766: bgp_lock_node (rn);
! 2767: cnq = XCALLOC (MTYPE_BGP_CLEAR_NODE_QUEUE,
! 2768: sizeof (struct bgp_clear_node_queue));
! 2769: cnq->rn = rn;
! 2770: cnq->purpose = purpose;
! 2771: work_queue_add (peer->clear_node_queue, cnq);
! 2772: break;
! 2773: }
! 2774:
! 2775: for (ain = rn->adj_in; ain; ain = ain->next)
! 2776: if (ain->peer == peer || purpose == BGP_CLEAR_ROUTE_MY_RSCLIENT)
! 2777: {
! 2778: bgp_adj_in_remove (rn, ain);
! 2779: bgp_unlock_node (rn);
! 2780: break;
! 2781: }
! 2782: for (aout = rn->adj_out; aout; aout = aout->next)
! 2783: if (aout->peer == peer || purpose == BGP_CLEAR_ROUTE_MY_RSCLIENT)
! 2784: {
! 2785: bgp_adj_out_remove (rn, aout, peer, afi, safi);
! 2786: bgp_unlock_node (rn);
! 2787: break;
! 2788: }
! 2789: }
! 2790: return;
! 2791: }
! 2792:
! 2793: void
! 2794: bgp_clear_route (struct peer *peer, afi_t afi, safi_t safi,
! 2795: enum bgp_clear_route_type purpose)
! 2796: {
! 2797: struct bgp_node *rn;
! 2798: struct bgp_table *table;
! 2799: struct peer *rsclient;
! 2800: struct listnode *node, *nnode;
! 2801:
! 2802: if (peer->clear_node_queue == NULL)
! 2803: bgp_clear_node_queue_init (peer);
! 2804:
! 2805: /* bgp_fsm.c keeps sessions in state Clearing, not transitioning to
! 2806: * Idle until it receives a Clearing_Completed event. This protects
! 2807: * against peers which flap faster than we can we clear, which could
! 2808: * lead to:
! 2809: *
! 2810: * a) race with routes from the new session being installed before
! 2811: * clear_route_node visits the node (to delete the route of that
! 2812: * peer)
! 2813: * b) resource exhaustion, clear_route_node likely leads to an entry
! 2814: * on the process_main queue. Fast-flapping could cause that queue
! 2815: * to grow and grow.
! 2816: */
! 2817: if (!peer->clear_node_queue->thread)
! 2818: peer_lock (peer); /* bgp_clear_node_complete */
! 2819:
! 2820: switch (purpose)
! 2821: {
! 2822: case BGP_CLEAR_ROUTE_NORMAL:
! 2823: if (safi != SAFI_MPLS_VPN)
! 2824: bgp_clear_route_table (peer, afi, safi, NULL, NULL, purpose);
! 2825: else
! 2826: for (rn = bgp_table_top (peer->bgp->rib[afi][safi]); rn;
! 2827: rn = bgp_route_next (rn))
! 2828: if ((table = rn->info) != NULL)
! 2829: bgp_clear_route_table (peer, afi, safi, table, NULL, purpose);
! 2830:
! 2831: for (ALL_LIST_ELEMENTS (peer->bgp->rsclient, node, nnode, rsclient))
! 2832: if (CHECK_FLAG(rsclient->af_flags[afi][safi],
! 2833: PEER_FLAG_RSERVER_CLIENT))
! 2834: bgp_clear_route_table (peer, afi, safi, NULL, rsclient, purpose);
! 2835: break;
! 2836:
! 2837: case BGP_CLEAR_ROUTE_MY_RSCLIENT:
! 2838: bgp_clear_route_table (peer, afi, safi, NULL, peer, purpose);
! 2839: break;
! 2840:
! 2841: default:
! 2842: assert (0);
! 2843: break;
! 2844: }
! 2845:
! 2846: /* If no routes were cleared, nothing was added to workqueue, the
! 2847: * completion function won't be run by workqueue code - call it here.
! 2848: * XXX: Actually, this assumption doesn't hold, see
! 2849: * bgp_clear_route_table(), we queue all non-empty nodes.
! 2850: *
! 2851: * Additionally, there is a presumption in FSM that clearing is only
! 2852: * really needed if peer state is Established - peers in
! 2853: * pre-Established states shouldn't have any route-update state
! 2854: * associated with them (in or out).
! 2855: *
! 2856: * We still can get here in pre-Established though, through
! 2857: * peer_delete -> bgp_fsm_change_status, so this is a useful sanity
! 2858: * check to ensure the assumption above holds.
! 2859: *
! 2860: * At some future point, this check could be move to the top of the
! 2861: * function, and do a quick early-return when state is
! 2862: * pre-Established, avoiding above list and table scans. Once we're
! 2863: * sure it is safe..
! 2864: */
! 2865: if (!peer->clear_node_queue->thread)
! 2866: bgp_clear_node_complete (peer->clear_node_queue);
! 2867: }
! 2868:
! 2869: void
! 2870: bgp_clear_route_all (struct peer *peer)
! 2871: {
! 2872: afi_t afi;
! 2873: safi_t safi;
! 2874:
! 2875: for (afi = AFI_IP; afi < AFI_MAX; afi++)
! 2876: for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++)
! 2877: bgp_clear_route (peer, afi, safi, BGP_CLEAR_ROUTE_NORMAL);
! 2878: }
! 2879:
! 2880: void
! 2881: bgp_clear_adj_in (struct peer *peer, afi_t afi, safi_t safi)
! 2882: {
! 2883: struct bgp_table *table;
! 2884: struct bgp_node *rn;
! 2885: struct bgp_adj_in *ain;
! 2886:
! 2887: table = peer->bgp->rib[afi][safi];
! 2888:
! 2889: for (rn = bgp_table_top (table); rn; rn = bgp_route_next (rn))
! 2890: for (ain = rn->adj_in; ain ; ain = ain->next)
! 2891: if (ain->peer == peer)
! 2892: {
! 2893: bgp_adj_in_remove (rn, ain);
! 2894: bgp_unlock_node (rn);
! 2895: break;
! 2896: }
! 2897: }
! 2898:
! 2899: void
! 2900: bgp_clear_stale_route (struct peer *peer, afi_t afi, safi_t safi)
! 2901: {
! 2902: struct bgp_node *rn;
! 2903: struct bgp_info *ri;
! 2904: struct bgp_table *table;
! 2905:
! 2906: table = peer->bgp->rib[afi][safi];
! 2907:
! 2908: for (rn = bgp_table_top (table); rn; rn = bgp_route_next (rn))
! 2909: {
! 2910: for (ri = rn->info; ri; ri = ri->next)
! 2911: if (ri->peer == peer)
! 2912: {
! 2913: if (CHECK_FLAG (ri->flags, BGP_INFO_STALE))
! 2914: bgp_rib_remove (rn, ri, peer, afi, safi);
! 2915: break;
! 2916: }
! 2917: }
! 2918: }
! 2919:
! 2920: /* Delete all kernel routes. */
! 2921: void
! 2922: bgp_cleanup_routes (void)
! 2923: {
! 2924: struct bgp *bgp;
! 2925: struct listnode *node, *nnode;
! 2926: struct bgp_node *rn;
! 2927: struct bgp_table *table;
! 2928: struct bgp_info *ri;
! 2929:
! 2930: for (ALL_LIST_ELEMENTS (bm->bgp, node, nnode, bgp))
! 2931: {
! 2932: table = bgp->rib[AFI_IP][SAFI_UNICAST];
! 2933:
! 2934: for (rn = bgp_table_top (table); rn; rn = bgp_route_next (rn))
! 2935: for (ri = rn->info; ri; ri = ri->next)
! 2936: if (CHECK_FLAG (ri->flags, BGP_INFO_SELECTED)
! 2937: && ri->type == ZEBRA_ROUTE_BGP
! 2938: && ri->sub_type == BGP_ROUTE_NORMAL)
! 2939: bgp_zebra_withdraw (&rn->p, ri);
! 2940:
! 2941: table = bgp->rib[AFI_IP6][SAFI_UNICAST];
! 2942:
! 2943: for (rn = bgp_table_top (table); rn; rn = bgp_route_next (rn))
! 2944: for (ri = rn->info; ri; ri = ri->next)
! 2945: if (CHECK_FLAG (ri->flags, BGP_INFO_SELECTED)
! 2946: && ri->type == ZEBRA_ROUTE_BGP
! 2947: && ri->sub_type == BGP_ROUTE_NORMAL)
! 2948: bgp_zebra_withdraw (&rn->p, ri);
! 2949: }
! 2950: }
! 2951:
! 2952: void
! 2953: bgp_reset (void)
! 2954: {
! 2955: vty_reset ();
! 2956: bgp_zclient_reset ();
! 2957: access_list_reset ();
! 2958: prefix_list_reset ();
! 2959: }
! 2960:
! 2961: /* Parse NLRI stream. Withdraw NLRI is recognized by NULL attr
! 2962: value. */
! 2963: int
! 2964: bgp_nlri_parse (struct peer *peer, struct attr *attr, struct bgp_nlri *packet)
! 2965: {
! 2966: u_char *pnt;
! 2967: u_char *lim;
! 2968: struct prefix p;
! 2969: int psize;
! 2970: int ret;
! 2971:
! 2972: /* Check peer status. */
! 2973: if (peer->status != Established)
! 2974: return 0;
! 2975:
! 2976: pnt = packet->nlri;
! 2977: lim = pnt + packet->length;
! 2978:
! 2979: for (; pnt < lim; pnt += psize)
! 2980: {
! 2981: /* Clear prefix structure. */
! 2982: memset (&p, 0, sizeof (struct prefix));
! 2983:
! 2984: /* Fetch prefix length. */
! 2985: p.prefixlen = *pnt++;
! 2986: p.family = afi2family (packet->afi);
! 2987:
! 2988: /* Already checked in nlri_sanity_check(). We do double check
! 2989: here. */
! 2990: if ((packet->afi == AFI_IP && p.prefixlen > 32)
! 2991: || (packet->afi == AFI_IP6 && p.prefixlen > 128))
! 2992: return -1;
! 2993:
! 2994: /* Packet size overflow check. */
! 2995: psize = PSIZE (p.prefixlen);
! 2996:
! 2997: /* When packet overflow occur return immediately. */
! 2998: if (pnt + psize > lim)
! 2999: return -1;
! 3000:
! 3001: /* Fetch prefix from NLRI packet. */
! 3002: memcpy (&p.u.prefix, pnt, psize);
! 3003:
! 3004: /* Check address. */
! 3005: if (packet->afi == AFI_IP && packet->safi == SAFI_UNICAST)
! 3006: {
! 3007: if (IN_CLASSD (ntohl (p.u.prefix4.s_addr)))
! 3008: {
! 3009: /*
! 3010: * From draft-ietf-idr-bgp4-22, Section 6.3:
! 3011: * If a BGP router receives an UPDATE message with a
! 3012: * semantically incorrect NLRI field, in which a prefix is
! 3013: * semantically incorrect (eg. an unexpected multicast IP
! 3014: * address), it should ignore the prefix.
! 3015: */
! 3016: zlog (peer->log, LOG_ERR,
! 3017: "IPv4 unicast NLRI is multicast address %s",
! 3018: inet_ntoa (p.u.prefix4));
! 3019:
! 3020: return -1;
! 3021: }
! 3022: }
! 3023:
! 3024: #ifdef HAVE_IPV6
! 3025: /* Check address. */
! 3026: if (packet->afi == AFI_IP6 && packet->safi == SAFI_UNICAST)
! 3027: {
! 3028: if (IN6_IS_ADDR_LINKLOCAL (&p.u.prefix6))
! 3029: {
! 3030: char buf[BUFSIZ];
! 3031:
! 3032: zlog (peer->log, LOG_WARNING,
! 3033: "IPv6 link-local NLRI received %s ignore this NLRI",
! 3034: inet_ntop (AF_INET6, &p.u.prefix6, buf, BUFSIZ));
! 3035:
! 3036: continue;
! 3037: }
! 3038: }
! 3039: #endif /* HAVE_IPV6 */
! 3040:
! 3041: /* Normal process. */
! 3042: if (attr)
! 3043: ret = bgp_update (peer, &p, attr, packet->afi, packet->safi,
! 3044: ZEBRA_ROUTE_BGP, BGP_ROUTE_NORMAL, NULL, NULL, 0);
! 3045: else
! 3046: ret = bgp_withdraw (peer, &p, attr, packet->afi, packet->safi,
! 3047: ZEBRA_ROUTE_BGP, BGP_ROUTE_NORMAL, NULL, NULL);
! 3048:
! 3049: /* Address family configuration mismatch or maximum-prefix count
! 3050: overflow. */
! 3051: if (ret < 0)
! 3052: return -1;
! 3053: }
! 3054:
! 3055: /* Packet length consistency check. */
! 3056: if (pnt != lim)
! 3057: return -1;
! 3058:
! 3059: return 0;
! 3060: }
! 3061:
! 3062: /* NLRI encode syntax check routine. */
! 3063: int
! 3064: bgp_nlri_sanity_check (struct peer *peer, int afi, u_char *pnt,
! 3065: bgp_size_t length)
! 3066: {
! 3067: u_char *end;
! 3068: u_char prefixlen;
! 3069: int psize;
! 3070:
! 3071: end = pnt + length;
! 3072:
! 3073: /* RFC1771 6.3 The NLRI field in the UPDATE message is checked for
! 3074: syntactic validity. If the field is syntactically incorrect,
! 3075: then the Error Subcode is set to Invalid Network Field. */
! 3076:
! 3077: while (pnt < end)
! 3078: {
! 3079: prefixlen = *pnt++;
! 3080:
! 3081: /* Prefix length check. */
! 3082: if ((afi == AFI_IP && prefixlen > 32)
! 3083: || (afi == AFI_IP6 && prefixlen > 128))
! 3084: {
! 3085: plog_err (peer->log,
! 3086: "%s [Error] Update packet error (wrong prefix length %d)",
! 3087: peer->host, prefixlen);
! 3088: bgp_notify_send (peer, BGP_NOTIFY_UPDATE_ERR,
! 3089: BGP_NOTIFY_UPDATE_INVAL_NETWORK);
! 3090: return -1;
! 3091: }
! 3092:
! 3093: /* Packet size overflow check. */
! 3094: psize = PSIZE (prefixlen);
! 3095:
! 3096: if (pnt + psize > end)
! 3097: {
! 3098: plog_err (peer->log,
! 3099: "%s [Error] Update packet error"
! 3100: " (prefix data overflow prefix size is %d)",
! 3101: peer->host, psize);
! 3102: bgp_notify_send (peer, BGP_NOTIFY_UPDATE_ERR,
! 3103: BGP_NOTIFY_UPDATE_INVAL_NETWORK);
! 3104: return -1;
! 3105: }
! 3106:
! 3107: pnt += psize;
! 3108: }
! 3109:
! 3110: /* Packet length consistency check. */
! 3111: if (pnt != end)
! 3112: {
! 3113: plog_err (peer->log,
! 3114: "%s [Error] Update packet error"
! 3115: " (prefix length mismatch with total length)",
! 3116: peer->host);
! 3117: bgp_notify_send (peer, BGP_NOTIFY_UPDATE_ERR,
! 3118: BGP_NOTIFY_UPDATE_INVAL_NETWORK);
! 3119: return -1;
! 3120: }
! 3121: return 0;
! 3122: }
! 3123:
! 3124: static struct bgp_static *
! 3125: bgp_static_new (void)
! 3126: {
! 3127: return XCALLOC (MTYPE_BGP_STATIC, sizeof (struct bgp_static));
! 3128: }
! 3129:
! 3130: static void
! 3131: bgp_static_free (struct bgp_static *bgp_static)
! 3132: {
! 3133: if (bgp_static->rmap.name)
! 3134: free (bgp_static->rmap.name);
! 3135: XFREE (MTYPE_BGP_STATIC, bgp_static);
! 3136: }
! 3137:
! 3138: static void
! 3139: bgp_static_withdraw_rsclient (struct bgp *bgp, struct peer *rsclient,
! 3140: struct prefix *p, afi_t afi, safi_t safi)
! 3141: {
! 3142: struct bgp_node *rn;
! 3143: struct bgp_info *ri;
! 3144:
! 3145: rn = bgp_afi_node_get (rsclient->rib[afi][safi], afi, safi, p, NULL);
! 3146:
! 3147: /* Check selected route and self inserted route. */
! 3148: for (ri = rn->info; ri; ri = ri->next)
! 3149: if (ri->peer == bgp->peer_self
! 3150: && ri->type == ZEBRA_ROUTE_BGP
! 3151: && ri->sub_type == BGP_ROUTE_STATIC)
! 3152: break;
! 3153:
! 3154: /* Withdraw static BGP route from routing table. */
! 3155: if (ri)
! 3156: {
! 3157: bgp_info_delete (rn, ri);
! 3158: bgp_process (bgp, rn, afi, safi);
! 3159: }
! 3160:
! 3161: /* Unlock bgp_node_lookup. */
! 3162: bgp_unlock_node (rn);
! 3163: }
! 3164:
! 3165: static void
! 3166: bgp_static_update_rsclient (struct peer *rsclient, struct prefix *p,
! 3167: struct bgp_static *bgp_static,
! 3168: afi_t afi, safi_t safi)
! 3169: {
! 3170: struct bgp_node *rn;
! 3171: struct bgp_info *ri;
! 3172: struct bgp_info *new;
! 3173: struct bgp_info info;
! 3174: struct attr *attr_new;
! 3175: struct attr attr = {0 };
! 3176: struct attr new_attr = { .extra = 0 };
! 3177: struct bgp *bgp;
! 3178: int ret;
! 3179: char buf[SU_ADDRSTRLEN];
! 3180:
! 3181: bgp = rsclient->bgp;
! 3182:
! 3183: assert (bgp_static);
! 3184: if (!bgp_static)
! 3185: return;
! 3186:
! 3187: rn = bgp_afi_node_get (rsclient->rib[afi][safi], afi, safi, p, NULL);
! 3188:
! 3189: bgp_attr_default_set (&attr, BGP_ORIGIN_IGP);
! 3190:
! 3191: attr.nexthop = bgp_static->igpnexthop;
! 3192: attr.med = bgp_static->igpmetric;
! 3193: attr.flag |= ATTR_FLAG_BIT (BGP_ATTR_MULTI_EXIT_DISC);
! 3194:
! 3195: if (bgp_static->atomic)
! 3196: attr.flag |= ATTR_FLAG_BIT (BGP_ATTR_ATOMIC_AGGREGATE);
! 3197:
! 3198: /* Apply network route-map for export to this rsclient. */
! 3199: if (bgp_static->rmap.name)
! 3200: {
! 3201: struct attr attr_tmp = attr;
! 3202: info.peer = rsclient;
! 3203: info.attr = &attr_tmp;
! 3204:
! 3205: SET_FLAG (rsclient->rmap_type, PEER_RMAP_TYPE_EXPORT);
! 3206: SET_FLAG (rsclient->rmap_type, PEER_RMAP_TYPE_NETWORK);
! 3207:
! 3208: ret = route_map_apply (bgp_static->rmap.map, p, RMAP_BGP, &info);
! 3209:
! 3210: rsclient->rmap_type = 0;
! 3211:
! 3212: if (ret == RMAP_DENYMATCH)
! 3213: {
! 3214: /* Free uninterned attribute. */
! 3215: bgp_attr_flush (&attr_tmp);
! 3216:
! 3217: /* Unintern original. */
! 3218: aspath_unintern (&attr.aspath);
! 3219: bgp_static_withdraw_rsclient (bgp, rsclient, p, afi, safi);
! 3220: bgp_attr_extra_free (&attr);
! 3221:
! 3222: return;
! 3223: }
! 3224: attr_new = bgp_attr_intern (&attr_tmp);
! 3225: }
! 3226: else
! 3227: attr_new = bgp_attr_intern (&attr);
! 3228:
! 3229: bgp_attr_dup(&new_attr, attr_new);
! 3230:
! 3231: SET_FLAG (bgp->peer_self->rmap_type, PEER_RMAP_TYPE_NETWORK);
! 3232:
! 3233: if (bgp_import_modifier (rsclient, bgp->peer_self, p, &new_attr, afi, safi)
! 3234: == RMAP_DENY)
! 3235: {
! 3236: /* This BGP update is filtered. Log the reason then update BGP entry. */
! 3237: if (BGP_DEBUG (update, UPDATE_IN))
! 3238: zlog (rsclient->log, LOG_DEBUG,
! 3239: "Static UPDATE about %s/%d -- DENIED for RS-client %s due to: import-policy",
! 3240: inet_ntop (p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
! 3241: p->prefixlen, rsclient->host);
! 3242:
! 3243: bgp->peer_self->rmap_type = 0;
! 3244:
! 3245: bgp_attr_unintern (&attr_new);
! 3246: aspath_unintern (&attr.aspath);
! 3247: bgp_attr_extra_free (&attr);
! 3248:
! 3249: bgp_static_withdraw_rsclient (bgp, rsclient, p, afi, safi);
! 3250:
! 3251: return;
! 3252: }
! 3253:
! 3254: bgp->peer_self->rmap_type = 0;
! 3255:
! 3256: bgp_attr_unintern (&attr_new);
! 3257: attr_new = bgp_attr_intern (&new_attr);
! 3258: bgp_attr_extra_free (&new_attr);
! 3259:
! 3260: for (ri = rn->info; ri; ri = ri->next)
! 3261: if (ri->peer == bgp->peer_self && ri->type == ZEBRA_ROUTE_BGP
! 3262: && ri->sub_type == BGP_ROUTE_STATIC)
! 3263: break;
! 3264:
! 3265: if (ri)
! 3266: {
! 3267: if (attrhash_cmp (ri->attr, attr_new) &&
! 3268: !CHECK_FLAG(ri->flags, BGP_INFO_REMOVED))
! 3269: {
! 3270: bgp_unlock_node (rn);
! 3271: bgp_attr_unintern (&attr_new);
! 3272: aspath_unintern (&attr.aspath);
! 3273: bgp_attr_extra_free (&attr);
! 3274: return;
! 3275: }
! 3276: else
! 3277: {
! 3278: /* The attribute is changed. */
! 3279: bgp_info_set_flag (rn, ri, BGP_INFO_ATTR_CHANGED);
! 3280:
! 3281: /* Rewrite BGP route information. */
! 3282: if (CHECK_FLAG(ri->flags, BGP_INFO_REMOVED))
! 3283: bgp_info_restore(rn, ri);
! 3284: bgp_attr_unintern (&ri->attr);
! 3285: ri->attr = attr_new;
! 3286: ri->uptime = bgp_clock ();
! 3287:
! 3288: /* Process change. */
! 3289: bgp_process (bgp, rn, afi, safi);
! 3290: bgp_unlock_node (rn);
! 3291: aspath_unintern (&attr.aspath);
! 3292: bgp_attr_extra_free (&attr);
! 3293: return;
! 3294: }
! 3295: }
! 3296:
! 3297: /* Make new BGP info. */
! 3298: new = bgp_info_new ();
! 3299: new->type = ZEBRA_ROUTE_BGP;
! 3300: new->sub_type = BGP_ROUTE_STATIC;
! 3301: new->peer = bgp->peer_self;
! 3302: SET_FLAG (new->flags, BGP_INFO_VALID);
! 3303: new->attr = attr_new;
! 3304: new->uptime = bgp_clock ();
! 3305:
! 3306: /* Register new BGP information. */
! 3307: bgp_info_add (rn, new);
! 3308:
! 3309: /* route_node_get lock */
! 3310: bgp_unlock_node (rn);
! 3311:
! 3312: /* Process change. */
! 3313: bgp_process (bgp, rn, afi, safi);
! 3314:
! 3315: /* Unintern original. */
! 3316: aspath_unintern (&attr.aspath);
! 3317: bgp_attr_extra_free (&attr);
! 3318: }
! 3319:
! 3320: static void
! 3321: bgp_static_update_main (struct bgp *bgp, struct prefix *p,
! 3322: struct bgp_static *bgp_static, afi_t afi, safi_t safi)
! 3323: {
! 3324: struct bgp_node *rn;
! 3325: struct bgp_info *ri;
! 3326: struct bgp_info *new;
! 3327: struct bgp_info info;
! 3328: struct attr attr = { 0 };
! 3329: struct attr *attr_new;
! 3330: int ret;
! 3331:
! 3332: assert (bgp_static);
! 3333: if (!bgp_static)
! 3334: return;
! 3335:
! 3336: rn = bgp_afi_node_get (bgp->rib[afi][safi], afi, safi, p, NULL);
! 3337:
! 3338: bgp_attr_default_set (&attr, BGP_ORIGIN_IGP);
! 3339:
! 3340: attr.nexthop = bgp_static->igpnexthop;
! 3341: attr.med = bgp_static->igpmetric;
! 3342: attr.flag |= ATTR_FLAG_BIT (BGP_ATTR_MULTI_EXIT_DISC);
! 3343:
! 3344: if (bgp_static->atomic)
! 3345: attr.flag |= ATTR_FLAG_BIT (BGP_ATTR_ATOMIC_AGGREGATE);
! 3346:
! 3347: /* Apply route-map. */
! 3348: if (bgp_static->rmap.name)
! 3349: {
! 3350: struct attr attr_tmp = attr;
! 3351: info.peer = bgp->peer_self;
! 3352: info.attr = &attr_tmp;
! 3353:
! 3354: SET_FLAG (bgp->peer_self->rmap_type, PEER_RMAP_TYPE_NETWORK);
! 3355:
! 3356: ret = route_map_apply (bgp_static->rmap.map, p, RMAP_BGP, &info);
! 3357:
! 3358: bgp->peer_self->rmap_type = 0;
! 3359:
! 3360: if (ret == RMAP_DENYMATCH)
! 3361: {
! 3362: /* Free uninterned attribute. */
! 3363: bgp_attr_flush (&attr_tmp);
! 3364:
! 3365: /* Unintern original. */
! 3366: aspath_unintern (&attr.aspath);
! 3367: bgp_attr_extra_free (&attr);
! 3368: bgp_static_withdraw (bgp, p, afi, safi);
! 3369: return;
! 3370: }
! 3371: attr_new = bgp_attr_intern (&attr_tmp);
! 3372: }
! 3373: else
! 3374: attr_new = bgp_attr_intern (&attr);
! 3375:
! 3376: for (ri = rn->info; ri; ri = ri->next)
! 3377: if (ri->peer == bgp->peer_self && ri->type == ZEBRA_ROUTE_BGP
! 3378: && ri->sub_type == BGP_ROUTE_STATIC)
! 3379: break;
! 3380:
! 3381: if (ri)
! 3382: {
! 3383: if (attrhash_cmp (ri->attr, attr_new) &&
! 3384: !CHECK_FLAG(ri->flags, BGP_INFO_REMOVED))
! 3385: {
! 3386: bgp_unlock_node (rn);
! 3387: bgp_attr_unintern (&attr_new);
! 3388: aspath_unintern (&attr.aspath);
! 3389: bgp_attr_extra_free (&attr);
! 3390: return;
! 3391: }
! 3392: else
! 3393: {
! 3394: /* The attribute is changed. */
! 3395: bgp_info_set_flag (rn, ri, BGP_INFO_ATTR_CHANGED);
! 3396:
! 3397: /* Rewrite BGP route information. */
! 3398: if (CHECK_FLAG(ri->flags, BGP_INFO_REMOVED))
! 3399: bgp_info_restore(rn, ri);
! 3400: else
! 3401: bgp_aggregate_decrement (bgp, p, ri, afi, safi);
! 3402: bgp_attr_unintern (&ri->attr);
! 3403: ri->attr = attr_new;
! 3404: ri->uptime = bgp_clock ();
! 3405:
! 3406: /* Process change. */
! 3407: bgp_aggregate_increment (bgp, p, ri, afi, safi);
! 3408: bgp_process (bgp, rn, afi, safi);
! 3409: bgp_unlock_node (rn);
! 3410: aspath_unintern (&attr.aspath);
! 3411: bgp_attr_extra_free (&attr);
! 3412: return;
! 3413: }
! 3414: }
! 3415:
! 3416: /* Make new BGP info. */
! 3417: new = bgp_info_new ();
! 3418: new->type = ZEBRA_ROUTE_BGP;
! 3419: new->sub_type = BGP_ROUTE_STATIC;
! 3420: new->peer = bgp->peer_self;
! 3421: SET_FLAG (new->flags, BGP_INFO_VALID);
! 3422: new->attr = attr_new;
! 3423: new->uptime = bgp_clock ();
! 3424:
! 3425: /* Aggregate address increment. */
! 3426: bgp_aggregate_increment (bgp, p, new, afi, safi);
! 3427:
! 3428: /* Register new BGP information. */
! 3429: bgp_info_add (rn, new);
! 3430:
! 3431: /* route_node_get lock */
! 3432: bgp_unlock_node (rn);
! 3433:
! 3434: /* Process change. */
! 3435: bgp_process (bgp, rn, afi, safi);
! 3436:
! 3437: /* Unintern original. */
! 3438: aspath_unintern (&attr.aspath);
! 3439: bgp_attr_extra_free (&attr);
! 3440: }
! 3441:
! 3442: void
! 3443: bgp_static_update (struct bgp *bgp, struct prefix *p,
! 3444: struct bgp_static *bgp_static, afi_t afi, safi_t safi)
! 3445: {
! 3446: struct peer *rsclient;
! 3447: struct listnode *node, *nnode;
! 3448:
! 3449: bgp_static_update_main (bgp, p, bgp_static, afi, safi);
! 3450:
! 3451: for (ALL_LIST_ELEMENTS (bgp->rsclient, node, nnode, rsclient))
! 3452: {
! 3453: if (CHECK_FLAG (rsclient->af_flags[afi][safi], PEER_FLAG_RSERVER_CLIENT))
! 3454: bgp_static_update_rsclient (rsclient, p, bgp_static, afi, safi);
! 3455: }
! 3456: }
! 3457:
! 3458: static void
! 3459: bgp_static_update_vpnv4 (struct bgp *bgp, struct prefix *p, afi_t afi,
! 3460: safi_t safi, struct prefix_rd *prd, u_char *tag)
! 3461: {
! 3462: struct bgp_node *rn;
! 3463: struct bgp_info *new;
! 3464:
! 3465: rn = bgp_afi_node_get (bgp->rib[afi][safi], afi, safi, p, prd);
! 3466:
! 3467: /* Make new BGP info. */
! 3468: new = bgp_info_new ();
! 3469: new->type = ZEBRA_ROUTE_BGP;
! 3470: new->sub_type = BGP_ROUTE_STATIC;
! 3471: new->peer = bgp->peer_self;
! 3472: new->attr = bgp_attr_default_intern (BGP_ORIGIN_IGP);
! 3473: SET_FLAG (new->flags, BGP_INFO_VALID);
! 3474: new->uptime = bgp_clock ();
! 3475: new->extra = bgp_info_extra_new();
! 3476: memcpy (new->extra->tag, tag, 3);
! 3477:
! 3478: /* Aggregate address increment. */
! 3479: bgp_aggregate_increment (bgp, p, new, afi, safi);
! 3480:
! 3481: /* Register new BGP information. */
! 3482: bgp_info_add (rn, new);
! 3483:
! 3484: /* route_node_get lock */
! 3485: bgp_unlock_node (rn);
! 3486:
! 3487: /* Process change. */
! 3488: bgp_process (bgp, rn, afi, safi);
! 3489: }
! 3490:
! 3491: void
! 3492: bgp_static_withdraw (struct bgp *bgp, struct prefix *p, afi_t afi,
! 3493: safi_t safi)
! 3494: {
! 3495: struct bgp_node *rn;
! 3496: struct bgp_info *ri;
! 3497:
! 3498: rn = bgp_afi_node_get (bgp->rib[afi][safi], afi, safi, p, NULL);
! 3499:
! 3500: /* Check selected route and self inserted route. */
! 3501: for (ri = rn->info; ri; ri = ri->next)
! 3502: if (ri->peer == bgp->peer_self
! 3503: && ri->type == ZEBRA_ROUTE_BGP
! 3504: && ri->sub_type == BGP_ROUTE_STATIC)
! 3505: break;
! 3506:
! 3507: /* Withdraw static BGP route from routing table. */
! 3508: if (ri)
! 3509: {
! 3510: bgp_aggregate_decrement (bgp, p, ri, afi, safi);
! 3511: bgp_info_delete (rn, ri);
! 3512: bgp_process (bgp, rn, afi, safi);
! 3513: }
! 3514:
! 3515: /* Unlock bgp_node_lookup. */
! 3516: bgp_unlock_node (rn);
! 3517: }
! 3518:
! 3519: void
! 3520: bgp_check_local_routes_rsclient (struct peer *rsclient, afi_t afi, safi_t safi)
! 3521: {
! 3522: struct bgp_static *bgp_static;
! 3523: struct bgp *bgp;
! 3524: struct bgp_node *rn;
! 3525: struct prefix *p;
! 3526:
! 3527: bgp = rsclient->bgp;
! 3528:
! 3529: for (rn = bgp_table_top (bgp->route[afi][safi]); rn; rn = bgp_route_next (rn))
! 3530: if ((bgp_static = rn->info) != NULL)
! 3531: {
! 3532: p = &rn->p;
! 3533:
! 3534: bgp_static_update_rsclient (rsclient, p, bgp_static,
! 3535: afi, safi);
! 3536: }
! 3537: }
! 3538:
! 3539: static void
! 3540: bgp_static_withdraw_vpnv4 (struct bgp *bgp, struct prefix *p, afi_t afi,
! 3541: safi_t safi, struct prefix_rd *prd, u_char *tag)
! 3542: {
! 3543: struct bgp_node *rn;
! 3544: struct bgp_info *ri;
! 3545:
! 3546: rn = bgp_afi_node_get (bgp->rib[afi][safi], afi, safi, p, prd);
! 3547:
! 3548: /* Check selected route and self inserted route. */
! 3549: for (ri = rn->info; ri; ri = ri->next)
! 3550: if (ri->peer == bgp->peer_self
! 3551: && ri->type == ZEBRA_ROUTE_BGP
! 3552: && ri->sub_type == BGP_ROUTE_STATIC)
! 3553: break;
! 3554:
! 3555: /* Withdraw static BGP route from routing table. */
! 3556: if (ri)
! 3557: {
! 3558: bgp_aggregate_decrement (bgp, p, ri, afi, safi);
! 3559: bgp_info_delete (rn, ri);
! 3560: bgp_process (bgp, rn, afi, safi);
! 3561: }
! 3562:
! 3563: /* Unlock bgp_node_lookup. */
! 3564: bgp_unlock_node (rn);
! 3565: }
! 3566:
! 3567: /* Configure static BGP network. When user don't run zebra, static
! 3568: route should be installed as valid. */
! 3569: static int
! 3570: bgp_static_set (struct vty *vty, struct bgp *bgp, const char *ip_str,
! 3571: afi_t afi, safi_t safi, const char *rmap, int backdoor)
! 3572: {
! 3573: int ret;
! 3574: struct prefix p;
! 3575: struct bgp_static *bgp_static;
! 3576: struct bgp_node *rn;
! 3577: u_char need_update = 0;
! 3578:
! 3579: /* Convert IP prefix string to struct prefix. */
! 3580: ret = str2prefix (ip_str, &p);
! 3581: if (! ret)
! 3582: {
! 3583: vty_out (vty, "%% Malformed prefix%s", VTY_NEWLINE);
! 3584: return CMD_WARNING;
! 3585: }
! 3586: #ifdef HAVE_IPV6
! 3587: if (afi == AFI_IP6 && IN6_IS_ADDR_LINKLOCAL (&p.u.prefix6))
! 3588: {
! 3589: vty_out (vty, "%% Malformed prefix (link-local address)%s",
! 3590: VTY_NEWLINE);
! 3591: return CMD_WARNING;
! 3592: }
! 3593: #endif /* HAVE_IPV6 */
! 3594:
! 3595: apply_mask (&p);
! 3596:
! 3597: /* Set BGP static route configuration. */
! 3598: rn = bgp_node_get (bgp->route[afi][safi], &p);
! 3599:
! 3600: if (rn->info)
! 3601: {
! 3602: /* Configuration change. */
! 3603: bgp_static = rn->info;
! 3604:
! 3605: /* Check previous routes are installed into BGP. */
! 3606: if (bgp_static->valid && bgp_static->backdoor != backdoor)
! 3607: need_update = 1;
! 3608:
! 3609: bgp_static->backdoor = backdoor;
! 3610:
! 3611: if (rmap)
! 3612: {
! 3613: if (bgp_static->rmap.name)
! 3614: free (bgp_static->rmap.name);
! 3615: bgp_static->rmap.name = strdup (rmap);
! 3616: bgp_static->rmap.map = route_map_lookup_by_name (rmap);
! 3617: }
! 3618: else
! 3619: {
! 3620: if (bgp_static->rmap.name)
! 3621: free (bgp_static->rmap.name);
! 3622: bgp_static->rmap.name = NULL;
! 3623: bgp_static->rmap.map = NULL;
! 3624: bgp_static->valid = 0;
! 3625: }
! 3626: bgp_unlock_node (rn);
! 3627: }
! 3628: else
! 3629: {
! 3630: /* New configuration. */
! 3631: bgp_static = bgp_static_new ();
! 3632: bgp_static->backdoor = backdoor;
! 3633: bgp_static->valid = 0;
! 3634: bgp_static->igpmetric = 0;
! 3635: bgp_static->igpnexthop.s_addr = 0;
! 3636:
! 3637: if (rmap)
! 3638: {
! 3639: if (bgp_static->rmap.name)
! 3640: free (bgp_static->rmap.name);
! 3641: bgp_static->rmap.name = strdup (rmap);
! 3642: bgp_static->rmap.map = route_map_lookup_by_name (rmap);
! 3643: }
! 3644: rn->info = bgp_static;
! 3645: }
! 3646:
! 3647: /* If BGP scan is not enabled, we should install this route here. */
! 3648: if (! bgp_flag_check (bgp, BGP_FLAG_IMPORT_CHECK))
! 3649: {
! 3650: bgp_static->valid = 1;
! 3651:
! 3652: if (need_update)
! 3653: bgp_static_withdraw (bgp, &p, afi, safi);
! 3654:
! 3655: if (! bgp_static->backdoor)
! 3656: bgp_static_update (bgp, &p, bgp_static, afi, safi);
! 3657: }
! 3658:
! 3659: return CMD_SUCCESS;
! 3660: }
! 3661:
! 3662: /* Configure static BGP network. */
! 3663: static int
! 3664: bgp_static_unset (struct vty *vty, struct bgp *bgp, const char *ip_str,
! 3665: afi_t afi, safi_t safi)
! 3666: {
! 3667: int ret;
! 3668: struct prefix p;
! 3669: struct bgp_static *bgp_static;
! 3670: struct bgp_node *rn;
! 3671:
! 3672: /* Convert IP prefix string to struct prefix. */
! 3673: ret = str2prefix (ip_str, &p);
! 3674: if (! ret)
! 3675: {
! 3676: vty_out (vty, "%% Malformed prefix%s", VTY_NEWLINE);
! 3677: return CMD_WARNING;
! 3678: }
! 3679: #ifdef HAVE_IPV6
! 3680: if (afi == AFI_IP6 && IN6_IS_ADDR_LINKLOCAL (&p.u.prefix6))
! 3681: {
! 3682: vty_out (vty, "%% Malformed prefix (link-local address)%s",
! 3683: VTY_NEWLINE);
! 3684: return CMD_WARNING;
! 3685: }
! 3686: #endif /* HAVE_IPV6 */
! 3687:
! 3688: apply_mask (&p);
! 3689:
! 3690: rn = bgp_node_lookup (bgp->route[afi][safi], &p);
! 3691: if (! rn)
! 3692: {
! 3693: vty_out (vty, "%% Can't find specified static route configuration.%s",
! 3694: VTY_NEWLINE);
! 3695: return CMD_WARNING;
! 3696: }
! 3697:
! 3698: bgp_static = rn->info;
! 3699:
! 3700: /* Update BGP RIB. */
! 3701: if (! bgp_static->backdoor)
! 3702: bgp_static_withdraw (bgp, &p, afi, safi);
! 3703:
! 3704: /* Clear configuration. */
! 3705: bgp_static_free (bgp_static);
! 3706: rn->info = NULL;
! 3707: bgp_unlock_node (rn);
! 3708: bgp_unlock_node (rn);
! 3709:
! 3710: return CMD_SUCCESS;
! 3711: }
! 3712:
! 3713: /* Called from bgp_delete(). Delete all static routes from the BGP
! 3714: instance. */
! 3715: void
! 3716: bgp_static_delete (struct bgp *bgp)
! 3717: {
! 3718: afi_t afi;
! 3719: safi_t safi;
! 3720: struct bgp_node *rn;
! 3721: struct bgp_node *rm;
! 3722: struct bgp_table *table;
! 3723: struct bgp_static *bgp_static;
! 3724:
! 3725: for (afi = AFI_IP; afi < AFI_MAX; afi++)
! 3726: for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++)
! 3727: for (rn = bgp_table_top (bgp->route[afi][safi]); rn; rn = bgp_route_next (rn))
! 3728: if (rn->info != NULL)
! 3729: {
! 3730: if (safi == SAFI_MPLS_VPN)
! 3731: {
! 3732: table = rn->info;
! 3733:
! 3734: for (rm = bgp_table_top (table); rm; rm = bgp_route_next (rm))
! 3735: {
! 3736: bgp_static = rn->info;
! 3737: bgp_static_withdraw_vpnv4 (bgp, &rm->p,
! 3738: AFI_IP, SAFI_MPLS_VPN,
! 3739: (struct prefix_rd *)&rn->p,
! 3740: bgp_static->tag);
! 3741: bgp_static_free (bgp_static);
! 3742: rn->info = NULL;
! 3743: bgp_unlock_node (rn);
! 3744: }
! 3745: }
! 3746: else
! 3747: {
! 3748: bgp_static = rn->info;
! 3749: bgp_static_withdraw (bgp, &rn->p, afi, safi);
! 3750: bgp_static_free (bgp_static);
! 3751: rn->info = NULL;
! 3752: bgp_unlock_node (rn);
! 3753: }
! 3754: }
! 3755: }
! 3756:
! 3757: int
! 3758: bgp_static_set_vpnv4 (struct vty *vty, const char *ip_str, const char *rd_str,
! 3759: const char *tag_str)
! 3760: {
! 3761: int ret;
! 3762: struct prefix p;
! 3763: struct prefix_rd prd;
! 3764: struct bgp *bgp;
! 3765: struct bgp_node *prn;
! 3766: struct bgp_node *rn;
! 3767: struct bgp_table *table;
! 3768: struct bgp_static *bgp_static;
! 3769: u_char tag[3];
! 3770:
! 3771: bgp = vty->index;
! 3772:
! 3773: ret = str2prefix (ip_str, &p);
! 3774: if (! ret)
! 3775: {
! 3776: vty_out (vty, "%% Malformed prefix%s", VTY_NEWLINE);
! 3777: return CMD_WARNING;
! 3778: }
! 3779: apply_mask (&p);
! 3780:
! 3781: ret = str2prefix_rd (rd_str, &prd);
! 3782: if (! ret)
! 3783: {
! 3784: vty_out (vty, "%% Malformed rd%s", VTY_NEWLINE);
! 3785: return CMD_WARNING;
! 3786: }
! 3787:
! 3788: ret = str2tag (tag_str, tag);
! 3789: if (! ret)
! 3790: {
! 3791: vty_out (vty, "%% Malformed tag%s", VTY_NEWLINE);
! 3792: return CMD_WARNING;
! 3793: }
! 3794:
! 3795: prn = bgp_node_get (bgp->route[AFI_IP][SAFI_MPLS_VPN],
! 3796: (struct prefix *)&prd);
! 3797: if (prn->info == NULL)
! 3798: prn->info = bgp_table_init (AFI_IP, SAFI_MPLS_VPN);
! 3799: else
! 3800: bgp_unlock_node (prn);
! 3801: table = prn->info;
! 3802:
! 3803: rn = bgp_node_get (table, &p);
! 3804:
! 3805: if (rn->info)
! 3806: {
! 3807: vty_out (vty, "%% Same network configuration exists%s", VTY_NEWLINE);
! 3808: bgp_unlock_node (rn);
! 3809: }
! 3810: else
! 3811: {
! 3812: /* New configuration. */
! 3813: bgp_static = bgp_static_new ();
! 3814: bgp_static->valid = 1;
! 3815: memcpy (bgp_static->tag, tag, 3);
! 3816: rn->info = bgp_static;
! 3817:
! 3818: bgp_static_update_vpnv4 (bgp, &p, AFI_IP, SAFI_MPLS_VPN, &prd, tag);
! 3819: }
! 3820:
! 3821: return CMD_SUCCESS;
! 3822: }
! 3823:
! 3824: /* Configure static BGP network. */
! 3825: int
! 3826: bgp_static_unset_vpnv4 (struct vty *vty, const char *ip_str,
! 3827: const char *rd_str, const char *tag_str)
! 3828: {
! 3829: int ret;
! 3830: struct bgp *bgp;
! 3831: struct prefix p;
! 3832: struct prefix_rd prd;
! 3833: struct bgp_node *prn;
! 3834: struct bgp_node *rn;
! 3835: struct bgp_table *table;
! 3836: struct bgp_static *bgp_static;
! 3837: u_char tag[3];
! 3838:
! 3839: bgp = vty->index;
! 3840:
! 3841: /* Convert IP prefix string to struct prefix. */
! 3842: ret = str2prefix (ip_str, &p);
! 3843: if (! ret)
! 3844: {
! 3845: vty_out (vty, "%% Malformed prefix%s", VTY_NEWLINE);
! 3846: return CMD_WARNING;
! 3847: }
! 3848: apply_mask (&p);
! 3849:
! 3850: ret = str2prefix_rd (rd_str, &prd);
! 3851: if (! ret)
! 3852: {
! 3853: vty_out (vty, "%% Malformed rd%s", VTY_NEWLINE);
! 3854: return CMD_WARNING;
! 3855: }
! 3856:
! 3857: ret = str2tag (tag_str, tag);
! 3858: if (! ret)
! 3859: {
! 3860: vty_out (vty, "%% Malformed tag%s", VTY_NEWLINE);
! 3861: return CMD_WARNING;
! 3862: }
! 3863:
! 3864: prn = bgp_node_get (bgp->route[AFI_IP][SAFI_MPLS_VPN],
! 3865: (struct prefix *)&prd);
! 3866: if (prn->info == NULL)
! 3867: prn->info = bgp_table_init (AFI_IP, SAFI_MPLS_VPN);
! 3868: else
! 3869: bgp_unlock_node (prn);
! 3870: table = prn->info;
! 3871:
! 3872: rn = bgp_node_lookup (table, &p);
! 3873:
! 3874: if (rn)
! 3875: {
! 3876: bgp_static_withdraw_vpnv4 (bgp, &p, AFI_IP, SAFI_MPLS_VPN, &prd, tag);
! 3877:
! 3878: bgp_static = rn->info;
! 3879: bgp_static_free (bgp_static);
! 3880: rn->info = NULL;
! 3881: bgp_unlock_node (rn);
! 3882: bgp_unlock_node (rn);
! 3883: }
! 3884: else
! 3885: vty_out (vty, "%% Can't find the route%s", VTY_NEWLINE);
! 3886:
! 3887: return CMD_SUCCESS;
! 3888: }
! 3889:
! 3890: DEFUN (bgp_network,
! 3891: bgp_network_cmd,
! 3892: "network A.B.C.D/M",
! 3893: "Specify a network to announce via BGP\n"
! 3894: "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n")
! 3895: {
! 3896: return bgp_static_set (vty, vty->index, argv[0],
! 3897: AFI_IP, bgp_node_safi (vty), NULL, 0);
! 3898: }
! 3899:
! 3900: DEFUN (bgp_network_route_map,
! 3901: bgp_network_route_map_cmd,
! 3902: "network A.B.C.D/M route-map WORD",
! 3903: "Specify a network to announce via BGP\n"
! 3904: "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
! 3905: "Route-map to modify the attributes\n"
! 3906: "Name of the route map\n")
! 3907: {
! 3908: return bgp_static_set (vty, vty->index, argv[0],
! 3909: AFI_IP, bgp_node_safi (vty), argv[1], 0);
! 3910: }
! 3911:
! 3912: DEFUN (bgp_network_backdoor,
! 3913: bgp_network_backdoor_cmd,
! 3914: "network A.B.C.D/M backdoor",
! 3915: "Specify a network to announce via BGP\n"
! 3916: "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
! 3917: "Specify a BGP backdoor route\n")
! 3918: {
! 3919: return bgp_static_set (vty, vty->index, argv[0], AFI_IP, SAFI_UNICAST,
! 3920: NULL, 1);
! 3921: }
! 3922:
! 3923: DEFUN (bgp_network_mask,
! 3924: bgp_network_mask_cmd,
! 3925: "network A.B.C.D mask A.B.C.D",
! 3926: "Specify a network to announce via BGP\n"
! 3927: "Network number\n"
! 3928: "Network mask\n"
! 3929: "Network mask\n")
! 3930: {
! 3931: int ret;
! 3932: char prefix_str[BUFSIZ];
! 3933:
! 3934: ret = netmask_str2prefix_str (argv[0], argv[1], prefix_str);
! 3935: if (! ret)
! 3936: {
! 3937: vty_out (vty, "%% Inconsistent address and mask%s", VTY_NEWLINE);
! 3938: return CMD_WARNING;
! 3939: }
! 3940:
! 3941: return bgp_static_set (vty, vty->index, prefix_str,
! 3942: AFI_IP, bgp_node_safi (vty), NULL, 0);
! 3943: }
! 3944:
! 3945: DEFUN (bgp_network_mask_route_map,
! 3946: bgp_network_mask_route_map_cmd,
! 3947: "network A.B.C.D mask A.B.C.D route-map WORD",
! 3948: "Specify a network to announce via BGP\n"
! 3949: "Network number\n"
! 3950: "Network mask\n"
! 3951: "Network mask\n"
! 3952: "Route-map to modify the attributes\n"
! 3953: "Name of the route map\n")
! 3954: {
! 3955: int ret;
! 3956: char prefix_str[BUFSIZ];
! 3957:
! 3958: ret = netmask_str2prefix_str (argv[0], argv[1], prefix_str);
! 3959: if (! ret)
! 3960: {
! 3961: vty_out (vty, "%% Inconsistent address and mask%s", VTY_NEWLINE);
! 3962: return CMD_WARNING;
! 3963: }
! 3964:
! 3965: return bgp_static_set (vty, vty->index, prefix_str,
! 3966: AFI_IP, bgp_node_safi (vty), argv[2], 0);
! 3967: }
! 3968:
! 3969: DEFUN (bgp_network_mask_backdoor,
! 3970: bgp_network_mask_backdoor_cmd,
! 3971: "network A.B.C.D mask A.B.C.D backdoor",
! 3972: "Specify a network to announce via BGP\n"
! 3973: "Network number\n"
! 3974: "Network mask\n"
! 3975: "Network mask\n"
! 3976: "Specify a BGP backdoor route\n")
! 3977: {
! 3978: int ret;
! 3979: char prefix_str[BUFSIZ];
! 3980:
! 3981: ret = netmask_str2prefix_str (argv[0], argv[1], prefix_str);
! 3982: if (! ret)
! 3983: {
! 3984: vty_out (vty, "%% Inconsistent address and mask%s", VTY_NEWLINE);
! 3985: return CMD_WARNING;
! 3986: }
! 3987:
! 3988: return bgp_static_set (vty, vty->index, prefix_str, AFI_IP, SAFI_UNICAST,
! 3989: NULL, 1);
! 3990: }
! 3991:
! 3992: DEFUN (bgp_network_mask_natural,
! 3993: bgp_network_mask_natural_cmd,
! 3994: "network A.B.C.D",
! 3995: "Specify a network to announce via BGP\n"
! 3996: "Network number\n")
! 3997: {
! 3998: int ret;
! 3999: char prefix_str[BUFSIZ];
! 4000:
! 4001: ret = netmask_str2prefix_str (argv[0], NULL, prefix_str);
! 4002: if (! ret)
! 4003: {
! 4004: vty_out (vty, "%% Inconsistent address and mask%s", VTY_NEWLINE);
! 4005: return CMD_WARNING;
! 4006: }
! 4007:
! 4008: return bgp_static_set (vty, vty->index, prefix_str,
! 4009: AFI_IP, bgp_node_safi (vty), NULL, 0);
! 4010: }
! 4011:
! 4012: DEFUN (bgp_network_mask_natural_route_map,
! 4013: bgp_network_mask_natural_route_map_cmd,
! 4014: "network A.B.C.D route-map WORD",
! 4015: "Specify a network to announce via BGP\n"
! 4016: "Network number\n"
! 4017: "Route-map to modify the attributes\n"
! 4018: "Name of the route map\n")
! 4019: {
! 4020: int ret;
! 4021: char prefix_str[BUFSIZ];
! 4022:
! 4023: ret = netmask_str2prefix_str (argv[0], NULL, prefix_str);
! 4024: if (! ret)
! 4025: {
! 4026: vty_out (vty, "%% Inconsistent address and mask%s", VTY_NEWLINE);
! 4027: return CMD_WARNING;
! 4028: }
! 4029:
! 4030: return bgp_static_set (vty, vty->index, prefix_str,
! 4031: AFI_IP, bgp_node_safi (vty), argv[1], 0);
! 4032: }
! 4033:
! 4034: DEFUN (bgp_network_mask_natural_backdoor,
! 4035: bgp_network_mask_natural_backdoor_cmd,
! 4036: "network A.B.C.D backdoor",
! 4037: "Specify a network to announce via BGP\n"
! 4038: "Network number\n"
! 4039: "Specify a BGP backdoor route\n")
! 4040: {
! 4041: int ret;
! 4042: char prefix_str[BUFSIZ];
! 4043:
! 4044: ret = netmask_str2prefix_str (argv[0], NULL, prefix_str);
! 4045: if (! ret)
! 4046: {
! 4047: vty_out (vty, "%% Inconsistent address and mask%s", VTY_NEWLINE);
! 4048: return CMD_WARNING;
! 4049: }
! 4050:
! 4051: return bgp_static_set (vty, vty->index, prefix_str, AFI_IP, SAFI_UNICAST,
! 4052: NULL, 1);
! 4053: }
! 4054:
! 4055: DEFUN (no_bgp_network,
! 4056: no_bgp_network_cmd,
! 4057: "no network A.B.C.D/M",
! 4058: NO_STR
! 4059: "Specify a network to announce via BGP\n"
! 4060: "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n")
! 4061: {
! 4062: return bgp_static_unset (vty, vty->index, argv[0], AFI_IP,
! 4063: bgp_node_safi (vty));
! 4064: }
! 4065:
! 4066: ALIAS (no_bgp_network,
! 4067: no_bgp_network_route_map_cmd,
! 4068: "no network A.B.C.D/M route-map WORD",
! 4069: NO_STR
! 4070: "Specify a network to announce via BGP\n"
! 4071: "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
! 4072: "Route-map to modify the attributes\n"
! 4073: "Name of the route map\n")
! 4074:
! 4075: ALIAS (no_bgp_network,
! 4076: no_bgp_network_backdoor_cmd,
! 4077: "no network A.B.C.D/M backdoor",
! 4078: NO_STR
! 4079: "Specify a network to announce via BGP\n"
! 4080: "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
! 4081: "Specify a BGP backdoor route\n")
! 4082:
! 4083: DEFUN (no_bgp_network_mask,
! 4084: no_bgp_network_mask_cmd,
! 4085: "no network A.B.C.D mask A.B.C.D",
! 4086: NO_STR
! 4087: "Specify a network to announce via BGP\n"
! 4088: "Network number\n"
! 4089: "Network mask\n"
! 4090: "Network mask\n")
! 4091: {
! 4092: int ret;
! 4093: char prefix_str[BUFSIZ];
! 4094:
! 4095: ret = netmask_str2prefix_str (argv[0], argv[1], prefix_str);
! 4096: if (! ret)
! 4097: {
! 4098: vty_out (vty, "%% Inconsistent address and mask%s", VTY_NEWLINE);
! 4099: return CMD_WARNING;
! 4100: }
! 4101:
! 4102: return bgp_static_unset (vty, vty->index, prefix_str, AFI_IP,
! 4103: bgp_node_safi (vty));
! 4104: }
! 4105:
! 4106: ALIAS (no_bgp_network_mask,
! 4107: no_bgp_network_mask_route_map_cmd,
! 4108: "no network A.B.C.D mask A.B.C.D route-map WORD",
! 4109: NO_STR
! 4110: "Specify a network to announce via BGP\n"
! 4111: "Network number\n"
! 4112: "Network mask\n"
! 4113: "Network mask\n"
! 4114: "Route-map to modify the attributes\n"
! 4115: "Name of the route map\n")
! 4116:
! 4117: ALIAS (no_bgp_network_mask,
! 4118: no_bgp_network_mask_backdoor_cmd,
! 4119: "no network A.B.C.D mask A.B.C.D backdoor",
! 4120: NO_STR
! 4121: "Specify a network to announce via BGP\n"
! 4122: "Network number\n"
! 4123: "Network mask\n"
! 4124: "Network mask\n"
! 4125: "Specify a BGP backdoor route\n")
! 4126:
! 4127: DEFUN (no_bgp_network_mask_natural,
! 4128: no_bgp_network_mask_natural_cmd,
! 4129: "no network A.B.C.D",
! 4130: NO_STR
! 4131: "Specify a network to announce via BGP\n"
! 4132: "Network number\n")
! 4133: {
! 4134: int ret;
! 4135: char prefix_str[BUFSIZ];
! 4136:
! 4137: ret = netmask_str2prefix_str (argv[0], NULL, prefix_str);
! 4138: if (! ret)
! 4139: {
! 4140: vty_out (vty, "%% Inconsistent address and mask%s", VTY_NEWLINE);
! 4141: return CMD_WARNING;
! 4142: }
! 4143:
! 4144: return bgp_static_unset (vty, vty->index, prefix_str, AFI_IP,
! 4145: bgp_node_safi (vty));
! 4146: }
! 4147:
! 4148: ALIAS (no_bgp_network_mask_natural,
! 4149: no_bgp_network_mask_natural_route_map_cmd,
! 4150: "no network A.B.C.D route-map WORD",
! 4151: NO_STR
! 4152: "Specify a network to announce via BGP\n"
! 4153: "Network number\n"
! 4154: "Route-map to modify the attributes\n"
! 4155: "Name of the route map\n")
! 4156:
! 4157: ALIAS (no_bgp_network_mask_natural,
! 4158: no_bgp_network_mask_natural_backdoor_cmd,
! 4159: "no network A.B.C.D backdoor",
! 4160: NO_STR
! 4161: "Specify a network to announce via BGP\n"
! 4162: "Network number\n"
! 4163: "Specify a BGP backdoor route\n")
! 4164:
! 4165: #ifdef HAVE_IPV6
! 4166: DEFUN (ipv6_bgp_network,
! 4167: ipv6_bgp_network_cmd,
! 4168: "network X:X::X:X/M",
! 4169: "Specify a network to announce via BGP\n"
! 4170: "IPv6 prefix <network>/<length>\n")
! 4171: {
! 4172: return bgp_static_set (vty, vty->index, argv[0], AFI_IP6, SAFI_UNICAST,
! 4173: NULL, 0);
! 4174: }
! 4175:
! 4176: DEFUN (ipv6_bgp_network_route_map,
! 4177: ipv6_bgp_network_route_map_cmd,
! 4178: "network X:X::X:X/M route-map WORD",
! 4179: "Specify a network to announce via BGP\n"
! 4180: "IPv6 prefix <network>/<length>\n"
! 4181: "Route-map to modify the attributes\n"
! 4182: "Name of the route map\n")
! 4183: {
! 4184: return bgp_static_set (vty, vty->index, argv[0], AFI_IP6,
! 4185: bgp_node_safi (vty), argv[1], 0);
! 4186: }
! 4187:
! 4188: DEFUN (no_ipv6_bgp_network,
! 4189: no_ipv6_bgp_network_cmd,
! 4190: "no network X:X::X:X/M",
! 4191: NO_STR
! 4192: "Specify a network to announce via BGP\n"
! 4193: "IPv6 prefix <network>/<length>\n")
! 4194: {
! 4195: return bgp_static_unset (vty, vty->index, argv[0], AFI_IP6, SAFI_UNICAST);
! 4196: }
! 4197:
! 4198: ALIAS (no_ipv6_bgp_network,
! 4199: no_ipv6_bgp_network_route_map_cmd,
! 4200: "no network X:X::X:X/M route-map WORD",
! 4201: NO_STR
! 4202: "Specify a network to announce via BGP\n"
! 4203: "IPv6 prefix <network>/<length>\n"
! 4204: "Route-map to modify the attributes\n"
! 4205: "Name of the route map\n")
! 4206:
! 4207: ALIAS (ipv6_bgp_network,
! 4208: old_ipv6_bgp_network_cmd,
! 4209: "ipv6 bgp network X:X::X:X/M",
! 4210: IPV6_STR
! 4211: BGP_STR
! 4212: "Specify a network to announce via BGP\n"
! 4213: "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n")
! 4214:
! 4215: ALIAS (no_ipv6_bgp_network,
! 4216: old_no_ipv6_bgp_network_cmd,
! 4217: "no ipv6 bgp network X:X::X:X/M",
! 4218: NO_STR
! 4219: IPV6_STR
! 4220: BGP_STR
! 4221: "Specify a network to announce via BGP\n"
! 4222: "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n")
! 4223: #endif /* HAVE_IPV6 */
! 4224:
! 4225: /* stubs for removed AS-Pathlimit commands, kept for config compatibility */
! 4226: ALIAS_DEPRECATED (bgp_network,
! 4227: bgp_network_ttl_cmd,
! 4228: "network A.B.C.D/M pathlimit <0-255>",
! 4229: "Specify a network to announce via BGP\n"
! 4230: "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
! 4231: "AS-Path hopcount limit attribute\n"
! 4232: "AS-Pathlimit TTL, in number of AS-Path hops\n")
! 4233: ALIAS_DEPRECATED (bgp_network_backdoor,
! 4234: bgp_network_backdoor_ttl_cmd,
! 4235: "network A.B.C.D/M backdoor pathlimit <0-255>",
! 4236: "Specify a network to announce via BGP\n"
! 4237: "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
! 4238: "Specify a BGP backdoor route\n"
! 4239: "AS-Path hopcount limit attribute\n"
! 4240: "AS-Pathlimit TTL, in number of AS-Path hops\n")
! 4241: ALIAS_DEPRECATED (bgp_network_mask,
! 4242: bgp_network_mask_ttl_cmd,
! 4243: "network A.B.C.D mask A.B.C.D pathlimit <0-255>",
! 4244: "Specify a network to announce via BGP\n"
! 4245: "Network number\n"
! 4246: "Network mask\n"
! 4247: "Network mask\n"
! 4248: "AS-Path hopcount limit attribute\n"
! 4249: "AS-Pathlimit TTL, in number of AS-Path hops\n")
! 4250: ALIAS_DEPRECATED (bgp_network_mask_backdoor,
! 4251: bgp_network_mask_backdoor_ttl_cmd,
! 4252: "network A.B.C.D mask A.B.C.D backdoor pathlimit <0-255>",
! 4253: "Specify a network to announce via BGP\n"
! 4254: "Network number\n"
! 4255: "Network mask\n"
! 4256: "Network mask\n"
! 4257: "Specify a BGP backdoor route\n"
! 4258: "AS-Path hopcount limit attribute\n"
! 4259: "AS-Pathlimit TTL, in number of AS-Path hops\n")
! 4260: ALIAS_DEPRECATED (bgp_network_mask_natural,
! 4261: bgp_network_mask_natural_ttl_cmd,
! 4262: "network A.B.C.D pathlimit <0-255>",
! 4263: "Specify a network to announce via BGP\n"
! 4264: "Network number\n"
! 4265: "AS-Path hopcount limit attribute\n"
! 4266: "AS-Pathlimit TTL, in number of AS-Path hops\n")
! 4267: ALIAS_DEPRECATED (bgp_network_mask_natural_backdoor,
! 4268: bgp_network_mask_natural_backdoor_ttl_cmd,
! 4269: "network A.B.C.D backdoor pathlimit (1-255>",
! 4270: "Specify a network to announce via BGP\n"
! 4271: "Network number\n"
! 4272: "Specify a BGP backdoor route\n"
! 4273: "AS-Path hopcount limit attribute\n"
! 4274: "AS-Pathlimit TTL, in number of AS-Path hops\n")
! 4275: ALIAS_DEPRECATED (no_bgp_network,
! 4276: no_bgp_network_ttl_cmd,
! 4277: "no network A.B.C.D/M pathlimit <0-255>",
! 4278: NO_STR
! 4279: "Specify a network to announce via BGP\n"
! 4280: "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
! 4281: "AS-Path hopcount limit attribute\n"
! 4282: "AS-Pathlimit TTL, in number of AS-Path hops\n")
! 4283: ALIAS_DEPRECATED (no_bgp_network,
! 4284: no_bgp_network_backdoor_ttl_cmd,
! 4285: "no network A.B.C.D/M backdoor pathlimit <0-255>",
! 4286: NO_STR
! 4287: "Specify a network to announce via BGP\n"
! 4288: "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
! 4289: "Specify a BGP backdoor route\n"
! 4290: "AS-Path hopcount limit attribute\n"
! 4291: "AS-Pathlimit TTL, in number of AS-Path hops\n")
! 4292: ALIAS_DEPRECATED (no_bgp_network,
! 4293: no_bgp_network_mask_ttl_cmd,
! 4294: "no network A.B.C.D mask A.B.C.D pathlimit <0-255>",
! 4295: NO_STR
! 4296: "Specify a network to announce via BGP\n"
! 4297: "Network number\n"
! 4298: "Network mask\n"
! 4299: "Network mask\n"
! 4300: "AS-Path hopcount limit attribute\n"
! 4301: "AS-Pathlimit TTL, in number of AS-Path hops\n")
! 4302: ALIAS_DEPRECATED (no_bgp_network_mask,
! 4303: no_bgp_network_mask_backdoor_ttl_cmd,
! 4304: "no network A.B.C.D mask A.B.C.D backdoor pathlimit <0-255>",
! 4305: NO_STR
! 4306: "Specify a network to announce via BGP\n"
! 4307: "Network number\n"
! 4308: "Network mask\n"
! 4309: "Network mask\n"
! 4310: "Specify a BGP backdoor route\n"
! 4311: "AS-Path hopcount limit attribute\n"
! 4312: "AS-Pathlimit TTL, in number of AS-Path hops\n")
! 4313: ALIAS_DEPRECATED (no_bgp_network_mask_natural,
! 4314: no_bgp_network_mask_natural_ttl_cmd,
! 4315: "no network A.B.C.D pathlimit <0-255>",
! 4316: NO_STR
! 4317: "Specify a network to announce via BGP\n"
! 4318: "Network number\n"
! 4319: "AS-Path hopcount limit attribute\n"
! 4320: "AS-Pathlimit TTL, in number of AS-Path hops\n")
! 4321: ALIAS_DEPRECATED (no_bgp_network_mask_natural,
! 4322: no_bgp_network_mask_natural_backdoor_ttl_cmd,
! 4323: "no network A.B.C.D backdoor pathlimit <0-255>",
! 4324: NO_STR
! 4325: "Specify a network to announce via BGP\n"
! 4326: "Network number\n"
! 4327: "Specify a BGP backdoor route\n"
! 4328: "AS-Path hopcount limit attribute\n"
! 4329: "AS-Pathlimit TTL, in number of AS-Path hops\n")
! 4330: #ifdef HAVE_IPV6
! 4331: ALIAS_DEPRECATED (ipv6_bgp_network,
! 4332: ipv6_bgp_network_ttl_cmd,
! 4333: "network X:X::X:X/M pathlimit <0-255>",
! 4334: "Specify a network to announce via BGP\n"
! 4335: "IPv6 prefix <network>/<length>\n"
! 4336: "AS-Path hopcount limit attribute\n"
! 4337: "AS-Pathlimit TTL, in number of AS-Path hops\n")
! 4338: ALIAS_DEPRECATED (no_ipv6_bgp_network,
! 4339: no_ipv6_bgp_network_ttl_cmd,
! 4340: "no network X:X::X:X/M pathlimit <0-255>",
! 4341: NO_STR
! 4342: "Specify a network to announce via BGP\n"
! 4343: "IPv6 prefix <network>/<length>\n"
! 4344: "AS-Path hopcount limit attribute\n"
! 4345: "AS-Pathlimit TTL, in number of AS-Path hops\n")
! 4346: #endif /* HAVE_IPV6 */
! 4347:
! 4348: /* Aggreagete address:
! 4349:
! 4350: advertise-map Set condition to advertise attribute
! 4351: as-set Generate AS set path information
! 4352: attribute-map Set attributes of aggregate
! 4353: route-map Set parameters of aggregate
! 4354: summary-only Filter more specific routes from updates
! 4355: suppress-map Conditionally filter more specific routes from updates
! 4356: <cr>
! 4357: */
! 4358: struct bgp_aggregate
! 4359: {
! 4360: /* Summary-only flag. */
! 4361: u_char summary_only;
! 4362:
! 4363: /* AS set generation. */
! 4364: u_char as_set;
! 4365:
! 4366: /* Route-map for aggregated route. */
! 4367: struct route_map *map;
! 4368:
! 4369: /* Suppress-count. */
! 4370: unsigned long count;
! 4371:
! 4372: /* SAFI configuration. */
! 4373: safi_t safi;
! 4374: };
! 4375:
! 4376: static struct bgp_aggregate *
! 4377: bgp_aggregate_new (void)
! 4378: {
! 4379: return XCALLOC (MTYPE_BGP_AGGREGATE, sizeof (struct bgp_aggregate));
! 4380: }
! 4381:
! 4382: static void
! 4383: bgp_aggregate_free (struct bgp_aggregate *aggregate)
! 4384: {
! 4385: XFREE (MTYPE_BGP_AGGREGATE, aggregate);
! 4386: }
! 4387:
! 4388: static void
! 4389: bgp_aggregate_route (struct bgp *bgp, struct prefix *p, struct bgp_info *rinew,
! 4390: afi_t afi, safi_t safi, struct bgp_info *del,
! 4391: struct bgp_aggregate *aggregate)
! 4392: {
! 4393: struct bgp_table *table;
! 4394: struct bgp_node *top;
! 4395: struct bgp_node *rn;
! 4396: u_char origin;
! 4397: struct aspath *aspath = NULL;
! 4398: struct aspath *asmerge = NULL;
! 4399: struct community *community = NULL;
! 4400: struct community *commerge = NULL;
! 4401: struct in_addr nexthop;
! 4402: u_int32_t med = 0;
! 4403: struct bgp_info *ri;
! 4404: struct bgp_info *new;
! 4405: int first = 1;
! 4406: unsigned long match = 0;
! 4407:
! 4408: /* Record adding route's nexthop and med. */
! 4409: if (rinew)
! 4410: {
! 4411: nexthop = rinew->attr->nexthop;
! 4412: med = rinew->attr->med;
! 4413: }
! 4414:
! 4415: /* ORIGIN attribute: If at least one route among routes that are
! 4416: aggregated has ORIGIN with the value INCOMPLETE, then the
! 4417: aggregated route must have the ORIGIN attribute with the value
! 4418: INCOMPLETE. Otherwise, if at least one route among routes that
! 4419: are aggregated has ORIGIN with the value EGP, then the aggregated
! 4420: route must have the origin attribute with the value EGP. In all
! 4421: other case the value of the ORIGIN attribute of the aggregated
! 4422: route is INTERNAL. */
! 4423: origin = BGP_ORIGIN_IGP;
! 4424:
! 4425: table = bgp->rib[afi][safi];
! 4426:
! 4427: top = bgp_node_get (table, p);
! 4428: for (rn = bgp_node_get (table, p); rn; rn = bgp_route_next_until (rn, top))
! 4429: if (rn->p.prefixlen > p->prefixlen)
! 4430: {
! 4431: match = 0;
! 4432:
! 4433: for (ri = rn->info; ri; ri = ri->next)
! 4434: {
! 4435: if (BGP_INFO_HOLDDOWN (ri))
! 4436: continue;
! 4437:
! 4438: if (del && ri == del)
! 4439: continue;
! 4440:
! 4441: if (! rinew && first)
! 4442: {
! 4443: nexthop = ri->attr->nexthop;
! 4444: med = ri->attr->med;
! 4445: first = 0;
! 4446: }
! 4447:
! 4448: #ifdef AGGREGATE_NEXTHOP_CHECK
! 4449: if (! IPV4_ADDR_SAME (&ri->attr->nexthop, &nexthop)
! 4450: || ri->attr->med != med)
! 4451: {
! 4452: if (aspath)
! 4453: aspath_free (aspath);
! 4454: if (community)
! 4455: community_free (community);
! 4456: bgp_unlock_node (rn);
! 4457: bgp_unlock_node (top);
! 4458: return;
! 4459: }
! 4460: #endif /* AGGREGATE_NEXTHOP_CHECK */
! 4461:
! 4462: if (ri->sub_type != BGP_ROUTE_AGGREGATE)
! 4463: {
! 4464: if (aggregate->summary_only)
! 4465: {
! 4466: (bgp_info_extra_get (ri))->suppress++;
! 4467: bgp_info_set_flag (rn, ri, BGP_INFO_ATTR_CHANGED);
! 4468: match++;
! 4469: }
! 4470:
! 4471: aggregate->count++;
! 4472:
! 4473: if (aggregate->as_set)
! 4474: {
! 4475: if (origin < ri->attr->origin)
! 4476: origin = ri->attr->origin;
! 4477:
! 4478: if (aspath)
! 4479: {
! 4480: asmerge = aspath_aggregate (aspath, ri->attr->aspath);
! 4481: aspath_free (aspath);
! 4482: aspath = asmerge;
! 4483: }
! 4484: else
! 4485: aspath = aspath_dup (ri->attr->aspath);
! 4486:
! 4487: if (ri->attr->community)
! 4488: {
! 4489: if (community)
! 4490: {
! 4491: commerge = community_merge (community,
! 4492: ri->attr->community);
! 4493: community = community_uniq_sort (commerge);
! 4494: community_free (commerge);
! 4495: }
! 4496: else
! 4497: community = community_dup (ri->attr->community);
! 4498: }
! 4499: }
! 4500: }
! 4501: }
! 4502: if (match)
! 4503: bgp_process (bgp, rn, afi, safi);
! 4504: }
! 4505: bgp_unlock_node (top);
! 4506:
! 4507: if (rinew)
! 4508: {
! 4509: aggregate->count++;
! 4510:
! 4511: if (aggregate->summary_only)
! 4512: (bgp_info_extra_get (rinew))->suppress++;
! 4513:
! 4514: if (aggregate->as_set)
! 4515: {
! 4516: if (origin < rinew->attr->origin)
! 4517: origin = rinew->attr->origin;
! 4518:
! 4519: if (aspath)
! 4520: {
! 4521: asmerge = aspath_aggregate (aspath, rinew->attr->aspath);
! 4522: aspath_free (aspath);
! 4523: aspath = asmerge;
! 4524: }
! 4525: else
! 4526: aspath = aspath_dup (rinew->attr->aspath);
! 4527:
! 4528: if (rinew->attr->community)
! 4529: {
! 4530: if (community)
! 4531: {
! 4532: commerge = community_merge (community,
! 4533: rinew->attr->community);
! 4534: community = community_uniq_sort (commerge);
! 4535: community_free (commerge);
! 4536: }
! 4537: else
! 4538: community = community_dup (rinew->attr->community);
! 4539: }
! 4540: }
! 4541: }
! 4542:
! 4543: if (aggregate->count > 0)
! 4544: {
! 4545: rn = bgp_node_get (table, p);
! 4546: new = bgp_info_new ();
! 4547: new->type = ZEBRA_ROUTE_BGP;
! 4548: new->sub_type = BGP_ROUTE_AGGREGATE;
! 4549: new->peer = bgp->peer_self;
! 4550: SET_FLAG (new->flags, BGP_INFO_VALID);
! 4551: new->attr = bgp_attr_aggregate_intern (bgp, origin, aspath, community, aggregate->as_set);
! 4552: new->uptime = bgp_clock ();
! 4553:
! 4554: bgp_info_add (rn, new);
! 4555: bgp_unlock_node (rn);
! 4556: bgp_process (bgp, rn, afi, safi);
! 4557: }
! 4558: else
! 4559: {
! 4560: if (aspath)
! 4561: aspath_free (aspath);
! 4562: if (community)
! 4563: community_free (community);
! 4564: }
! 4565: }
! 4566:
! 4567: void bgp_aggregate_delete (struct bgp *, struct prefix *, afi_t, safi_t,
! 4568: struct bgp_aggregate *);
! 4569:
! 4570: void
! 4571: bgp_aggregate_increment (struct bgp *bgp, struct prefix *p,
! 4572: struct bgp_info *ri, afi_t afi, safi_t safi)
! 4573: {
! 4574: struct bgp_node *child;
! 4575: struct bgp_node *rn;
! 4576: struct bgp_aggregate *aggregate;
! 4577:
! 4578: /* MPLS-VPN aggregation is not yet supported. */
! 4579: if (safi == SAFI_MPLS_VPN)
! 4580: return;
! 4581:
! 4582: if (p->prefixlen == 0)
! 4583: return;
! 4584:
! 4585: if (BGP_INFO_HOLDDOWN (ri))
! 4586: return;
! 4587:
! 4588: child = bgp_node_get (bgp->aggregate[afi][safi], p);
! 4589:
! 4590: /* Aggregate address configuration check. */
! 4591: for (rn = child; rn; rn = rn->parent)
! 4592: if ((aggregate = rn->info) != NULL && rn->p.prefixlen < p->prefixlen)
! 4593: {
! 4594: bgp_aggregate_delete (bgp, &rn->p, afi, safi, aggregate);
! 4595: bgp_aggregate_route (bgp, &rn->p, ri, afi, safi, NULL, aggregate);
! 4596: }
! 4597: bgp_unlock_node (child);
! 4598: }
! 4599:
! 4600: void
! 4601: bgp_aggregate_decrement (struct bgp *bgp, struct prefix *p,
! 4602: struct bgp_info *del, afi_t afi, safi_t safi)
! 4603: {
! 4604: struct bgp_node *child;
! 4605: struct bgp_node *rn;
! 4606: struct bgp_aggregate *aggregate;
! 4607:
! 4608: /* MPLS-VPN aggregation is not yet supported. */
! 4609: if (safi == SAFI_MPLS_VPN)
! 4610: return;
! 4611:
! 4612: if (p->prefixlen == 0)
! 4613: return;
! 4614:
! 4615: child = bgp_node_get (bgp->aggregate[afi][safi], p);
! 4616:
! 4617: /* Aggregate address configuration check. */
! 4618: for (rn = child; rn; rn = rn->parent)
! 4619: if ((aggregate = rn->info) != NULL && rn->p.prefixlen < p->prefixlen)
! 4620: {
! 4621: bgp_aggregate_delete (bgp, &rn->p, afi, safi, aggregate);
! 4622: bgp_aggregate_route (bgp, &rn->p, NULL, afi, safi, del, aggregate);
! 4623: }
! 4624: bgp_unlock_node (child);
! 4625: }
! 4626:
! 4627: static void
! 4628: bgp_aggregate_add (struct bgp *bgp, struct prefix *p, afi_t afi, safi_t safi,
! 4629: struct bgp_aggregate *aggregate)
! 4630: {
! 4631: struct bgp_table *table;
! 4632: struct bgp_node *top;
! 4633: struct bgp_node *rn;
! 4634: struct bgp_info *new;
! 4635: struct bgp_info *ri;
! 4636: unsigned long match;
! 4637: u_char origin = BGP_ORIGIN_IGP;
! 4638: struct aspath *aspath = NULL;
! 4639: struct aspath *asmerge = NULL;
! 4640: struct community *community = NULL;
! 4641: struct community *commerge = NULL;
! 4642:
! 4643: table = bgp->rib[afi][safi];
! 4644:
! 4645: /* Sanity check. */
! 4646: if (afi == AFI_IP && p->prefixlen == IPV4_MAX_BITLEN)
! 4647: return;
! 4648: if (afi == AFI_IP6 && p->prefixlen == IPV6_MAX_BITLEN)
! 4649: return;
! 4650:
! 4651: /* If routes exists below this node, generate aggregate routes. */
! 4652: top = bgp_node_get (table, p);
! 4653: for (rn = bgp_node_get (table, p); rn; rn = bgp_route_next_until (rn, top))
! 4654: if (rn->p.prefixlen > p->prefixlen)
! 4655: {
! 4656: match = 0;
! 4657:
! 4658: for (ri = rn->info; ri; ri = ri->next)
! 4659: {
! 4660: if (BGP_INFO_HOLDDOWN (ri))
! 4661: continue;
! 4662:
! 4663: if (ri->sub_type != BGP_ROUTE_AGGREGATE)
! 4664: {
! 4665: /* summary-only aggregate route suppress aggregated
! 4666: route announcement. */
! 4667: if (aggregate->summary_only)
! 4668: {
! 4669: (bgp_info_extra_get (ri))->suppress++;
! 4670: bgp_info_set_flag (rn, ri, BGP_INFO_ATTR_CHANGED);
! 4671: match++;
! 4672: }
! 4673: /* as-set aggregate route generate origin, as path,
! 4674: community aggregation. */
! 4675: if (aggregate->as_set)
! 4676: {
! 4677: if (origin < ri->attr->origin)
! 4678: origin = ri->attr->origin;
! 4679:
! 4680: if (aspath)
! 4681: {
! 4682: asmerge = aspath_aggregate (aspath, ri->attr->aspath);
! 4683: aspath_free (aspath);
! 4684: aspath = asmerge;
! 4685: }
! 4686: else
! 4687: aspath = aspath_dup (ri->attr->aspath);
! 4688:
! 4689: if (ri->attr->community)
! 4690: {
! 4691: if (community)
! 4692: {
! 4693: commerge = community_merge (community,
! 4694: ri->attr->community);
! 4695: community = community_uniq_sort (commerge);
! 4696: community_free (commerge);
! 4697: }
! 4698: else
! 4699: community = community_dup (ri->attr->community);
! 4700: }
! 4701: }
! 4702: aggregate->count++;
! 4703: }
! 4704: }
! 4705:
! 4706: /* If this node is suppressed, process the change. */
! 4707: if (match)
! 4708: bgp_process (bgp, rn, afi, safi);
! 4709: }
! 4710: bgp_unlock_node (top);
! 4711:
! 4712: /* Add aggregate route to BGP table. */
! 4713: if (aggregate->count)
! 4714: {
! 4715: rn = bgp_node_get (table, p);
! 4716:
! 4717: new = bgp_info_new ();
! 4718: new->type = ZEBRA_ROUTE_BGP;
! 4719: new->sub_type = BGP_ROUTE_AGGREGATE;
! 4720: new->peer = bgp->peer_self;
! 4721: SET_FLAG (new->flags, BGP_INFO_VALID);
! 4722: new->attr = bgp_attr_aggregate_intern (bgp, origin, aspath, community, aggregate->as_set);
! 4723: new->uptime = bgp_clock ();
! 4724:
! 4725: bgp_info_add (rn, new);
! 4726: bgp_unlock_node (rn);
! 4727:
! 4728: /* Process change. */
! 4729: bgp_process (bgp, rn, afi, safi);
! 4730: }
! 4731: }
! 4732:
! 4733: void
! 4734: bgp_aggregate_delete (struct bgp *bgp, struct prefix *p, afi_t afi,
! 4735: safi_t safi, struct bgp_aggregate *aggregate)
! 4736: {
! 4737: struct bgp_table *table;
! 4738: struct bgp_node *top;
! 4739: struct bgp_node *rn;
! 4740: struct bgp_info *ri;
! 4741: unsigned long match;
! 4742:
! 4743: table = bgp->rib[afi][safi];
! 4744:
! 4745: if (afi == AFI_IP && p->prefixlen == IPV4_MAX_BITLEN)
! 4746: return;
! 4747: if (afi == AFI_IP6 && p->prefixlen == IPV6_MAX_BITLEN)
! 4748: return;
! 4749:
! 4750: /* If routes exists below this node, generate aggregate routes. */
! 4751: top = bgp_node_get (table, p);
! 4752: for (rn = bgp_node_get (table, p); rn; rn = bgp_route_next_until (rn, top))
! 4753: if (rn->p.prefixlen > p->prefixlen)
! 4754: {
! 4755: match = 0;
! 4756:
! 4757: for (ri = rn->info; ri; ri = ri->next)
! 4758: {
! 4759: if (BGP_INFO_HOLDDOWN (ri))
! 4760: continue;
! 4761:
! 4762: if (ri->sub_type != BGP_ROUTE_AGGREGATE)
! 4763: {
! 4764: if (aggregate->summary_only && ri->extra)
! 4765: {
! 4766: ri->extra->suppress--;
! 4767:
! 4768: if (ri->extra->suppress == 0)
! 4769: {
! 4770: bgp_info_set_flag (rn, ri, BGP_INFO_ATTR_CHANGED);
! 4771: match++;
! 4772: }
! 4773: }
! 4774: aggregate->count--;
! 4775: }
! 4776: }
! 4777:
! 4778: /* If this node was suppressed, process the change. */
! 4779: if (match)
! 4780: bgp_process (bgp, rn, afi, safi);
! 4781: }
! 4782: bgp_unlock_node (top);
! 4783:
! 4784: /* Delete aggregate route from BGP table. */
! 4785: rn = bgp_node_get (table, p);
! 4786:
! 4787: for (ri = rn->info; ri; ri = ri->next)
! 4788: if (ri->peer == bgp->peer_self
! 4789: && ri->type == ZEBRA_ROUTE_BGP
! 4790: && ri->sub_type == BGP_ROUTE_AGGREGATE)
! 4791: break;
! 4792:
! 4793: /* Withdraw static BGP route from routing table. */
! 4794: if (ri)
! 4795: {
! 4796: bgp_info_delete (rn, ri);
! 4797: bgp_process (bgp, rn, afi, safi);
! 4798: }
! 4799:
! 4800: /* Unlock bgp_node_lookup. */
! 4801: bgp_unlock_node (rn);
! 4802: }
! 4803:
! 4804: /* Aggregate route attribute. */
! 4805: #define AGGREGATE_SUMMARY_ONLY 1
! 4806: #define AGGREGATE_AS_SET 1
! 4807:
! 4808: static int
! 4809: bgp_aggregate_unset (struct vty *vty, const char *prefix_str,
! 4810: afi_t afi, safi_t safi)
! 4811: {
! 4812: int ret;
! 4813: struct prefix p;
! 4814: struct bgp_node *rn;
! 4815: struct bgp *bgp;
! 4816: struct bgp_aggregate *aggregate;
! 4817:
! 4818: /* Convert string to prefix structure. */
! 4819: ret = str2prefix (prefix_str, &p);
! 4820: if (!ret)
! 4821: {
! 4822: vty_out (vty, "Malformed prefix%s", VTY_NEWLINE);
! 4823: return CMD_WARNING;
! 4824: }
! 4825: apply_mask (&p);
! 4826:
! 4827: /* Get BGP structure. */
! 4828: bgp = vty->index;
! 4829:
! 4830: /* Old configuration check. */
! 4831: rn = bgp_node_lookup (bgp->aggregate[afi][safi], &p);
! 4832: if (! rn)
! 4833: {
! 4834: vty_out (vty, "%% There is no aggregate-address configuration.%s",
! 4835: VTY_NEWLINE);
! 4836: return CMD_WARNING;
! 4837: }
! 4838:
! 4839: aggregate = rn->info;
! 4840: if (aggregate->safi & SAFI_UNICAST)
! 4841: bgp_aggregate_delete (bgp, &p, afi, SAFI_UNICAST, aggregate);
! 4842: if (aggregate->safi & SAFI_MULTICAST)
! 4843: bgp_aggregate_delete (bgp, &p, afi, SAFI_MULTICAST, aggregate);
! 4844:
! 4845: /* Unlock aggregate address configuration. */
! 4846: rn->info = NULL;
! 4847: bgp_aggregate_free (aggregate);
! 4848: bgp_unlock_node (rn);
! 4849: bgp_unlock_node (rn);
! 4850:
! 4851: return CMD_SUCCESS;
! 4852: }
! 4853:
! 4854: static int
! 4855: bgp_aggregate_set (struct vty *vty, const char *prefix_str,
! 4856: afi_t afi, safi_t safi,
! 4857: u_char summary_only, u_char as_set)
! 4858: {
! 4859: int ret;
! 4860: struct prefix p;
! 4861: struct bgp_node *rn;
! 4862: struct bgp *bgp;
! 4863: struct bgp_aggregate *aggregate;
! 4864:
! 4865: /* Convert string to prefix structure. */
! 4866: ret = str2prefix (prefix_str, &p);
! 4867: if (!ret)
! 4868: {
! 4869: vty_out (vty, "Malformed prefix%s", VTY_NEWLINE);
! 4870: return CMD_WARNING;
! 4871: }
! 4872: apply_mask (&p);
! 4873:
! 4874: /* Get BGP structure. */
! 4875: bgp = vty->index;
! 4876:
! 4877: /* Old configuration check. */
! 4878: rn = bgp_node_get (bgp->aggregate[afi][safi], &p);
! 4879:
! 4880: if (rn->info)
! 4881: {
! 4882: vty_out (vty, "There is already same aggregate network.%s", VTY_NEWLINE);
! 4883: /* try to remove the old entry */
! 4884: ret = bgp_aggregate_unset (vty, prefix_str, afi, safi);
! 4885: if (ret)
! 4886: {
! 4887: vty_out (vty, "Error deleting aggregate.%s", VTY_NEWLINE);
! 4888: bgp_unlock_node (rn);
! 4889: return CMD_WARNING;
! 4890: }
! 4891: }
! 4892:
! 4893: /* Make aggregate address structure. */
! 4894: aggregate = bgp_aggregate_new ();
! 4895: aggregate->summary_only = summary_only;
! 4896: aggregate->as_set = as_set;
! 4897: aggregate->safi = safi;
! 4898: rn->info = aggregate;
! 4899:
! 4900: /* Aggregate address insert into BGP routing table. */
! 4901: if (safi & SAFI_UNICAST)
! 4902: bgp_aggregate_add (bgp, &p, afi, SAFI_UNICAST, aggregate);
! 4903: if (safi & SAFI_MULTICAST)
! 4904: bgp_aggregate_add (bgp, &p, afi, SAFI_MULTICAST, aggregate);
! 4905:
! 4906: return CMD_SUCCESS;
! 4907: }
! 4908:
! 4909: DEFUN (aggregate_address,
! 4910: aggregate_address_cmd,
! 4911: "aggregate-address A.B.C.D/M",
! 4912: "Configure BGP aggregate entries\n"
! 4913: "Aggregate prefix\n")
! 4914: {
! 4915: return bgp_aggregate_set (vty, argv[0], AFI_IP, bgp_node_safi (vty), 0, 0);
! 4916: }
! 4917:
! 4918: DEFUN (aggregate_address_mask,
! 4919: aggregate_address_mask_cmd,
! 4920: "aggregate-address A.B.C.D A.B.C.D",
! 4921: "Configure BGP aggregate entries\n"
! 4922: "Aggregate address\n"
! 4923: "Aggregate mask\n")
! 4924: {
! 4925: int ret;
! 4926: char prefix_str[BUFSIZ];
! 4927:
! 4928: ret = netmask_str2prefix_str (argv[0], argv[1], prefix_str);
! 4929:
! 4930: if (! ret)
! 4931: {
! 4932: vty_out (vty, "%% Inconsistent address and mask%s", VTY_NEWLINE);
! 4933: return CMD_WARNING;
! 4934: }
! 4935:
! 4936: return bgp_aggregate_set (vty, prefix_str, AFI_IP, bgp_node_safi (vty),
! 4937: 0, 0);
! 4938: }
! 4939:
! 4940: DEFUN (aggregate_address_summary_only,
! 4941: aggregate_address_summary_only_cmd,
! 4942: "aggregate-address A.B.C.D/M summary-only",
! 4943: "Configure BGP aggregate entries\n"
! 4944: "Aggregate prefix\n"
! 4945: "Filter more specific routes from updates\n")
! 4946: {
! 4947: return bgp_aggregate_set (vty, argv[0], AFI_IP, bgp_node_safi (vty),
! 4948: AGGREGATE_SUMMARY_ONLY, 0);
! 4949: }
! 4950:
! 4951: DEFUN (aggregate_address_mask_summary_only,
! 4952: aggregate_address_mask_summary_only_cmd,
! 4953: "aggregate-address A.B.C.D A.B.C.D summary-only",
! 4954: "Configure BGP aggregate entries\n"
! 4955: "Aggregate address\n"
! 4956: "Aggregate mask\n"
! 4957: "Filter more specific routes from updates\n")
! 4958: {
! 4959: int ret;
! 4960: char prefix_str[BUFSIZ];
! 4961:
! 4962: ret = netmask_str2prefix_str (argv[0], argv[1], prefix_str);
! 4963:
! 4964: if (! ret)
! 4965: {
! 4966: vty_out (vty, "%% Inconsistent address and mask%s", VTY_NEWLINE);
! 4967: return CMD_WARNING;
! 4968: }
! 4969:
! 4970: return bgp_aggregate_set (vty, prefix_str, AFI_IP, bgp_node_safi (vty),
! 4971: AGGREGATE_SUMMARY_ONLY, 0);
! 4972: }
! 4973:
! 4974: DEFUN (aggregate_address_as_set,
! 4975: aggregate_address_as_set_cmd,
! 4976: "aggregate-address A.B.C.D/M as-set",
! 4977: "Configure BGP aggregate entries\n"
! 4978: "Aggregate prefix\n"
! 4979: "Generate AS set path information\n")
! 4980: {
! 4981: return bgp_aggregate_set (vty, argv[0], AFI_IP, bgp_node_safi (vty),
! 4982: 0, AGGREGATE_AS_SET);
! 4983: }
! 4984:
! 4985: DEFUN (aggregate_address_mask_as_set,
! 4986: aggregate_address_mask_as_set_cmd,
! 4987: "aggregate-address A.B.C.D A.B.C.D as-set",
! 4988: "Configure BGP aggregate entries\n"
! 4989: "Aggregate address\n"
! 4990: "Aggregate mask\n"
! 4991: "Generate AS set path information\n")
! 4992: {
! 4993: int ret;
! 4994: char prefix_str[BUFSIZ];
! 4995:
! 4996: ret = netmask_str2prefix_str (argv[0], argv[1], prefix_str);
! 4997:
! 4998: if (! ret)
! 4999: {
! 5000: vty_out (vty, "%% Inconsistent address and mask%s", VTY_NEWLINE);
! 5001: return CMD_WARNING;
! 5002: }
! 5003:
! 5004: return bgp_aggregate_set (vty, prefix_str, AFI_IP, bgp_node_safi (vty),
! 5005: 0, AGGREGATE_AS_SET);
! 5006: }
! 5007:
! 5008:
! 5009: DEFUN (aggregate_address_as_set_summary,
! 5010: aggregate_address_as_set_summary_cmd,
! 5011: "aggregate-address A.B.C.D/M as-set summary-only",
! 5012: "Configure BGP aggregate entries\n"
! 5013: "Aggregate prefix\n"
! 5014: "Generate AS set path information\n"
! 5015: "Filter more specific routes from updates\n")
! 5016: {
! 5017: return bgp_aggregate_set (vty, argv[0], AFI_IP, bgp_node_safi (vty),
! 5018: AGGREGATE_SUMMARY_ONLY, AGGREGATE_AS_SET);
! 5019: }
! 5020:
! 5021: ALIAS (aggregate_address_as_set_summary,
! 5022: aggregate_address_summary_as_set_cmd,
! 5023: "aggregate-address A.B.C.D/M summary-only as-set",
! 5024: "Configure BGP aggregate entries\n"
! 5025: "Aggregate prefix\n"
! 5026: "Filter more specific routes from updates\n"
! 5027: "Generate AS set path information\n")
! 5028:
! 5029: DEFUN (aggregate_address_mask_as_set_summary,
! 5030: aggregate_address_mask_as_set_summary_cmd,
! 5031: "aggregate-address A.B.C.D A.B.C.D as-set summary-only",
! 5032: "Configure BGP aggregate entries\n"
! 5033: "Aggregate address\n"
! 5034: "Aggregate mask\n"
! 5035: "Generate AS set path information\n"
! 5036: "Filter more specific routes from updates\n")
! 5037: {
! 5038: int ret;
! 5039: char prefix_str[BUFSIZ];
! 5040:
! 5041: ret = netmask_str2prefix_str (argv[0], argv[1], prefix_str);
! 5042:
! 5043: if (! ret)
! 5044: {
! 5045: vty_out (vty, "%% Inconsistent address and mask%s", VTY_NEWLINE);
! 5046: return CMD_WARNING;
! 5047: }
! 5048:
! 5049: return bgp_aggregate_set (vty, prefix_str, AFI_IP, bgp_node_safi (vty),
! 5050: AGGREGATE_SUMMARY_ONLY, AGGREGATE_AS_SET);
! 5051: }
! 5052:
! 5053: ALIAS (aggregate_address_mask_as_set_summary,
! 5054: aggregate_address_mask_summary_as_set_cmd,
! 5055: "aggregate-address A.B.C.D A.B.C.D summary-only as-set",
! 5056: "Configure BGP aggregate entries\n"
! 5057: "Aggregate address\n"
! 5058: "Aggregate mask\n"
! 5059: "Filter more specific routes from updates\n"
! 5060: "Generate AS set path information\n")
! 5061:
! 5062: DEFUN (no_aggregate_address,
! 5063: no_aggregate_address_cmd,
! 5064: "no aggregate-address A.B.C.D/M",
! 5065: NO_STR
! 5066: "Configure BGP aggregate entries\n"
! 5067: "Aggregate prefix\n")
! 5068: {
! 5069: return bgp_aggregate_unset (vty, argv[0], AFI_IP, bgp_node_safi (vty));
! 5070: }
! 5071:
! 5072: ALIAS (no_aggregate_address,
! 5073: no_aggregate_address_summary_only_cmd,
! 5074: "no aggregate-address A.B.C.D/M summary-only",
! 5075: NO_STR
! 5076: "Configure BGP aggregate entries\n"
! 5077: "Aggregate prefix\n"
! 5078: "Filter more specific routes from updates\n")
! 5079:
! 5080: ALIAS (no_aggregate_address,
! 5081: no_aggregate_address_as_set_cmd,
! 5082: "no aggregate-address A.B.C.D/M as-set",
! 5083: NO_STR
! 5084: "Configure BGP aggregate entries\n"
! 5085: "Aggregate prefix\n"
! 5086: "Generate AS set path information\n")
! 5087:
! 5088: ALIAS (no_aggregate_address,
! 5089: no_aggregate_address_as_set_summary_cmd,
! 5090: "no aggregate-address A.B.C.D/M as-set summary-only",
! 5091: NO_STR
! 5092: "Configure BGP aggregate entries\n"
! 5093: "Aggregate prefix\n"
! 5094: "Generate AS set path information\n"
! 5095: "Filter more specific routes from updates\n")
! 5096:
! 5097: ALIAS (no_aggregate_address,
! 5098: no_aggregate_address_summary_as_set_cmd,
! 5099: "no aggregate-address A.B.C.D/M summary-only as-set",
! 5100: NO_STR
! 5101: "Configure BGP aggregate entries\n"
! 5102: "Aggregate prefix\n"
! 5103: "Filter more specific routes from updates\n"
! 5104: "Generate AS set path information\n")
! 5105:
! 5106: DEFUN (no_aggregate_address_mask,
! 5107: no_aggregate_address_mask_cmd,
! 5108: "no aggregate-address A.B.C.D A.B.C.D",
! 5109: NO_STR
! 5110: "Configure BGP aggregate entries\n"
! 5111: "Aggregate address\n"
! 5112: "Aggregate mask\n")
! 5113: {
! 5114: int ret;
! 5115: char prefix_str[BUFSIZ];
! 5116:
! 5117: ret = netmask_str2prefix_str (argv[0], argv[1], prefix_str);
! 5118:
! 5119: if (! ret)
! 5120: {
! 5121: vty_out (vty, "%% Inconsistent address and mask%s", VTY_NEWLINE);
! 5122: return CMD_WARNING;
! 5123: }
! 5124:
! 5125: return bgp_aggregate_unset (vty, prefix_str, AFI_IP, bgp_node_safi (vty));
! 5126: }
! 5127:
! 5128: ALIAS (no_aggregate_address_mask,
! 5129: no_aggregate_address_mask_summary_only_cmd,
! 5130: "no aggregate-address A.B.C.D A.B.C.D summary-only",
! 5131: NO_STR
! 5132: "Configure BGP aggregate entries\n"
! 5133: "Aggregate address\n"
! 5134: "Aggregate mask\n"
! 5135: "Filter more specific routes from updates\n")
! 5136:
! 5137: ALIAS (no_aggregate_address_mask,
! 5138: no_aggregate_address_mask_as_set_cmd,
! 5139: "no aggregate-address A.B.C.D A.B.C.D as-set",
! 5140: NO_STR
! 5141: "Configure BGP aggregate entries\n"
! 5142: "Aggregate address\n"
! 5143: "Aggregate mask\n"
! 5144: "Generate AS set path information\n")
! 5145:
! 5146: ALIAS (no_aggregate_address_mask,
! 5147: no_aggregate_address_mask_as_set_summary_cmd,
! 5148: "no aggregate-address A.B.C.D A.B.C.D as-set summary-only",
! 5149: NO_STR
! 5150: "Configure BGP aggregate entries\n"
! 5151: "Aggregate address\n"
! 5152: "Aggregate mask\n"
! 5153: "Generate AS set path information\n"
! 5154: "Filter more specific routes from updates\n")
! 5155:
! 5156: ALIAS (no_aggregate_address_mask,
! 5157: no_aggregate_address_mask_summary_as_set_cmd,
! 5158: "no aggregate-address A.B.C.D A.B.C.D summary-only as-set",
! 5159: NO_STR
! 5160: "Configure BGP aggregate entries\n"
! 5161: "Aggregate address\n"
! 5162: "Aggregate mask\n"
! 5163: "Filter more specific routes from updates\n"
! 5164: "Generate AS set path information\n")
! 5165:
! 5166: #ifdef HAVE_IPV6
! 5167: DEFUN (ipv6_aggregate_address,
! 5168: ipv6_aggregate_address_cmd,
! 5169: "aggregate-address X:X::X:X/M",
! 5170: "Configure BGP aggregate entries\n"
! 5171: "Aggregate prefix\n")
! 5172: {
! 5173: return bgp_aggregate_set (vty, argv[0], AFI_IP6, SAFI_UNICAST, 0, 0);
! 5174: }
! 5175:
! 5176: DEFUN (ipv6_aggregate_address_summary_only,
! 5177: ipv6_aggregate_address_summary_only_cmd,
! 5178: "aggregate-address X:X::X:X/M summary-only",
! 5179: "Configure BGP aggregate entries\n"
! 5180: "Aggregate prefix\n"
! 5181: "Filter more specific routes from updates\n")
! 5182: {
! 5183: return bgp_aggregate_set (vty, argv[0], AFI_IP6, SAFI_UNICAST,
! 5184: AGGREGATE_SUMMARY_ONLY, 0);
! 5185: }
! 5186:
! 5187: DEFUN (no_ipv6_aggregate_address,
! 5188: no_ipv6_aggregate_address_cmd,
! 5189: "no aggregate-address X:X::X:X/M",
! 5190: NO_STR
! 5191: "Configure BGP aggregate entries\n"
! 5192: "Aggregate prefix\n")
! 5193: {
! 5194: return bgp_aggregate_unset (vty, argv[0], AFI_IP6, SAFI_UNICAST);
! 5195: }
! 5196:
! 5197: DEFUN (no_ipv6_aggregate_address_summary_only,
! 5198: no_ipv6_aggregate_address_summary_only_cmd,
! 5199: "no aggregate-address X:X::X:X/M summary-only",
! 5200: NO_STR
! 5201: "Configure BGP aggregate entries\n"
! 5202: "Aggregate prefix\n"
! 5203: "Filter more specific routes from updates\n")
! 5204: {
! 5205: return bgp_aggregate_unset (vty, argv[0], AFI_IP6, SAFI_UNICAST);
! 5206: }
! 5207:
! 5208: ALIAS (ipv6_aggregate_address,
! 5209: old_ipv6_aggregate_address_cmd,
! 5210: "ipv6 bgp aggregate-address X:X::X:X/M",
! 5211: IPV6_STR
! 5212: BGP_STR
! 5213: "Configure BGP aggregate entries\n"
! 5214: "Aggregate prefix\n")
! 5215:
! 5216: ALIAS (ipv6_aggregate_address_summary_only,
! 5217: old_ipv6_aggregate_address_summary_only_cmd,
! 5218: "ipv6 bgp aggregate-address X:X::X:X/M summary-only",
! 5219: IPV6_STR
! 5220: BGP_STR
! 5221: "Configure BGP aggregate entries\n"
! 5222: "Aggregate prefix\n"
! 5223: "Filter more specific routes from updates\n")
! 5224:
! 5225: ALIAS (no_ipv6_aggregate_address,
! 5226: old_no_ipv6_aggregate_address_cmd,
! 5227: "no ipv6 bgp aggregate-address X:X::X:X/M",
! 5228: NO_STR
! 5229: IPV6_STR
! 5230: BGP_STR
! 5231: "Configure BGP aggregate entries\n"
! 5232: "Aggregate prefix\n")
! 5233:
! 5234: ALIAS (no_ipv6_aggregate_address_summary_only,
! 5235: old_no_ipv6_aggregate_address_summary_only_cmd,
! 5236: "no ipv6 bgp aggregate-address X:X::X:X/M summary-only",
! 5237: NO_STR
! 5238: IPV6_STR
! 5239: BGP_STR
! 5240: "Configure BGP aggregate entries\n"
! 5241: "Aggregate prefix\n"
! 5242: "Filter more specific routes from updates\n")
! 5243: #endif /* HAVE_IPV6 */
! 5244:
! 5245: /* Redistribute route treatment. */
! 5246: void
! 5247: bgp_redistribute_add (struct prefix *p, struct in_addr *nexthop,
! 5248: u_int32_t metric, u_char type)
! 5249: {
! 5250: struct bgp *bgp;
! 5251: struct listnode *node, *nnode;
! 5252: struct bgp_info *new;
! 5253: struct bgp_info *bi;
! 5254: struct bgp_info info;
! 5255: struct bgp_node *bn;
! 5256: struct attr attr = { 0 };
! 5257: struct attr attr_new = { 0 };
! 5258: struct attr *new_attr;
! 5259: afi_t afi;
! 5260: int ret;
! 5261:
! 5262: /* Make default attribute. */
! 5263: bgp_attr_default_set (&attr, BGP_ORIGIN_INCOMPLETE);
! 5264: if (nexthop)
! 5265: attr.nexthop = *nexthop;
! 5266:
! 5267: attr.med = metric;
! 5268: attr.flag |= ATTR_FLAG_BIT (BGP_ATTR_MULTI_EXIT_DISC);
! 5269:
! 5270: for (ALL_LIST_ELEMENTS (bm->bgp, node, nnode, bgp))
! 5271: {
! 5272: afi = family2afi (p->family);
! 5273:
! 5274: if (bgp->redist[afi][type])
! 5275: {
! 5276: /* Copy attribute for modification. */
! 5277: bgp_attr_dup (&attr_new, &attr);
! 5278:
! 5279: if (bgp->redist_metric_flag[afi][type])
! 5280: attr_new.med = bgp->redist_metric[afi][type];
! 5281:
! 5282: /* Apply route-map. */
! 5283: if (bgp->rmap[afi][type].map)
! 5284: {
! 5285: info.peer = bgp->peer_self;
! 5286: info.attr = &attr_new;
! 5287:
! 5288: SET_FLAG (bgp->peer_self->rmap_type, PEER_RMAP_TYPE_REDISTRIBUTE);
! 5289:
! 5290: ret = route_map_apply (bgp->rmap[afi][type].map, p, RMAP_BGP,
! 5291: &info);
! 5292:
! 5293: bgp->peer_self->rmap_type = 0;
! 5294:
! 5295: if (ret == RMAP_DENYMATCH)
! 5296: {
! 5297: /* Free uninterned attribute. */
! 5298: bgp_attr_flush (&attr_new);
! 5299: bgp_attr_extra_free (&attr_new);
! 5300:
! 5301: /* Unintern original. */
! 5302: aspath_unintern (&attr.aspath);
! 5303: bgp_attr_extra_free (&attr);
! 5304: bgp_redistribute_delete (p, type);
! 5305: return;
! 5306: }
! 5307: }
! 5308:
! 5309: bn = bgp_afi_node_get (bgp->rib[afi][SAFI_UNICAST],
! 5310: afi, SAFI_UNICAST, p, NULL);
! 5311:
! 5312: new_attr = bgp_attr_intern (&attr_new);
! 5313: bgp_attr_extra_free (&attr_new);
! 5314:
! 5315: for (bi = bn->info; bi; bi = bi->next)
! 5316: if (bi->peer == bgp->peer_self
! 5317: && bi->sub_type == BGP_ROUTE_REDISTRIBUTE)
! 5318: break;
! 5319:
! 5320: if (bi)
! 5321: {
! 5322: if (attrhash_cmp (bi->attr, new_attr) &&
! 5323: !CHECK_FLAG(bi->flags, BGP_INFO_REMOVED))
! 5324: {
! 5325: bgp_attr_unintern (&new_attr);
! 5326: aspath_unintern (&attr.aspath);
! 5327: bgp_attr_extra_free (&attr);
! 5328: bgp_unlock_node (bn);
! 5329: return;
! 5330: }
! 5331: else
! 5332: {
! 5333: /* The attribute is changed. */
! 5334: bgp_info_set_flag (bn, bi, BGP_INFO_ATTR_CHANGED);
! 5335:
! 5336: /* Rewrite BGP route information. */
! 5337: if (CHECK_FLAG(bi->flags, BGP_INFO_REMOVED))
! 5338: bgp_info_restore(bn, bi);
! 5339: else
! 5340: bgp_aggregate_decrement (bgp, p, bi, afi, SAFI_UNICAST);
! 5341: bgp_attr_unintern (&bi->attr);
! 5342: bi->attr = new_attr;
! 5343: bi->uptime = bgp_clock ();
! 5344:
! 5345: /* Process change. */
! 5346: bgp_aggregate_increment (bgp, p, bi, afi, SAFI_UNICAST);
! 5347: bgp_process (bgp, bn, afi, SAFI_UNICAST);
! 5348: bgp_unlock_node (bn);
! 5349: aspath_unintern (&attr.aspath);
! 5350: bgp_attr_extra_free (&attr);
! 5351: return;
! 5352: }
! 5353: }
! 5354:
! 5355: new = bgp_info_new ();
! 5356: new->type = type;
! 5357: new->sub_type = BGP_ROUTE_REDISTRIBUTE;
! 5358: new->peer = bgp->peer_self;
! 5359: SET_FLAG (new->flags, BGP_INFO_VALID);
! 5360: new->attr = new_attr;
! 5361: new->uptime = bgp_clock ();
! 5362:
! 5363: bgp_aggregate_increment (bgp, p, new, afi, SAFI_UNICAST);
! 5364: bgp_info_add (bn, new);
! 5365: bgp_unlock_node (bn);
! 5366: bgp_process (bgp, bn, afi, SAFI_UNICAST);
! 5367: }
! 5368: }
! 5369:
! 5370: /* Unintern original. */
! 5371: aspath_unintern (&attr.aspath);
! 5372: bgp_attr_extra_free (&attr);
! 5373: }
! 5374:
! 5375: void
! 5376: bgp_redistribute_delete (struct prefix *p, u_char type)
! 5377: {
! 5378: struct bgp *bgp;
! 5379: struct listnode *node, *nnode;
! 5380: afi_t afi;
! 5381: struct bgp_node *rn;
! 5382: struct bgp_info *ri;
! 5383:
! 5384: for (ALL_LIST_ELEMENTS (bm->bgp, node, nnode, bgp))
! 5385: {
! 5386: afi = family2afi (p->family);
! 5387:
! 5388: if (bgp->redist[afi][type])
! 5389: {
! 5390: rn = bgp_afi_node_get (bgp->rib[afi][SAFI_UNICAST], afi, SAFI_UNICAST, p, NULL);
! 5391:
! 5392: for (ri = rn->info; ri; ri = ri->next)
! 5393: if (ri->peer == bgp->peer_self
! 5394: && ri->type == type)
! 5395: break;
! 5396:
! 5397: if (ri)
! 5398: {
! 5399: bgp_aggregate_decrement (bgp, p, ri, afi, SAFI_UNICAST);
! 5400: bgp_info_delete (rn, ri);
! 5401: bgp_process (bgp, rn, afi, SAFI_UNICAST);
! 5402: }
! 5403: bgp_unlock_node (rn);
! 5404: }
! 5405: }
! 5406: }
! 5407:
! 5408: /* Withdraw specified route type's route. */
! 5409: void
! 5410: bgp_redistribute_withdraw (struct bgp *bgp, afi_t afi, int type)
! 5411: {
! 5412: struct bgp_node *rn;
! 5413: struct bgp_info *ri;
! 5414: struct bgp_table *table;
! 5415:
! 5416: table = bgp->rib[afi][SAFI_UNICAST];
! 5417:
! 5418: for (rn = bgp_table_top (table); rn; rn = bgp_route_next (rn))
! 5419: {
! 5420: for (ri = rn->info; ri; ri = ri->next)
! 5421: if (ri->peer == bgp->peer_self
! 5422: && ri->type == type)
! 5423: break;
! 5424:
! 5425: if (ri)
! 5426: {
! 5427: bgp_aggregate_decrement (bgp, &rn->p, ri, afi, SAFI_UNICAST);
! 5428: bgp_info_delete (rn, ri);
! 5429: bgp_process (bgp, rn, afi, SAFI_UNICAST);
! 5430: }
! 5431: }
! 5432: }
! 5433:
! 5434: /* Static function to display route. */
! 5435: static void
! 5436: route_vty_out_route (struct prefix *p, struct vty *vty)
! 5437: {
! 5438: int len;
! 5439: u_int32_t destination;
! 5440: char buf[BUFSIZ];
! 5441:
! 5442: if (p->family == AF_INET)
! 5443: {
! 5444: len = vty_out (vty, "%s", inet_ntop (p->family, &p->u.prefix, buf, BUFSIZ));
! 5445: destination = ntohl (p->u.prefix4.s_addr);
! 5446:
! 5447: if ((IN_CLASSC (destination) && p->prefixlen == 24)
! 5448: || (IN_CLASSB (destination) && p->prefixlen == 16)
! 5449: || (IN_CLASSA (destination) && p->prefixlen == 8)
! 5450: || p->u.prefix4.s_addr == 0)
! 5451: {
! 5452: /* When mask is natural, mask is not displayed. */
! 5453: }
! 5454: else
! 5455: len += vty_out (vty, "/%d", p->prefixlen);
! 5456: }
! 5457: else
! 5458: len = vty_out (vty, "%s/%d", inet_ntop (p->family, &p->u.prefix, buf, BUFSIZ),
! 5459: p->prefixlen);
! 5460:
! 5461: len = 17 - len;
! 5462: if (len < 1)
! 5463: vty_out (vty, "%s%*s", VTY_NEWLINE, 20, " ");
! 5464: else
! 5465: vty_out (vty, "%*s", len, " ");
! 5466: }
! 5467:
! 5468: enum bgp_display_type
! 5469: {
! 5470: normal_list,
! 5471: };
! 5472:
! 5473: /* Print the short form route status for a bgp_info */
! 5474: static void
! 5475: route_vty_short_status_out (struct vty *vty, struct bgp_info *binfo)
! 5476: {
! 5477: /* Route status display. */
! 5478: if (CHECK_FLAG (binfo->flags, BGP_INFO_REMOVED))
! 5479: vty_out (vty, "R");
! 5480: else if (CHECK_FLAG (binfo->flags, BGP_INFO_STALE))
! 5481: vty_out (vty, "S");
! 5482: else if (binfo->extra && binfo->extra->suppress)
! 5483: vty_out (vty, "s");
! 5484: else if (! CHECK_FLAG (binfo->flags, BGP_INFO_HISTORY))
! 5485: vty_out (vty, "*");
! 5486: else
! 5487: vty_out (vty, " ");
! 5488:
! 5489: /* Selected */
! 5490: if (CHECK_FLAG (binfo->flags, BGP_INFO_HISTORY))
! 5491: vty_out (vty, "h");
! 5492: else if (CHECK_FLAG (binfo->flags, BGP_INFO_DAMPED))
! 5493: vty_out (vty, "d");
! 5494: else if (CHECK_FLAG (binfo->flags, BGP_INFO_SELECTED))
! 5495: vty_out (vty, ">");
! 5496: else
! 5497: vty_out (vty, " ");
! 5498:
! 5499: /* Internal route. */
! 5500: if ((binfo->peer->as) && (binfo->peer->as == binfo->peer->local_as))
! 5501: vty_out (vty, "i");
! 5502: else
! 5503: vty_out (vty, " ");
! 5504: }
! 5505:
! 5506: /* called from terminal list command */
! 5507: void
! 5508: route_vty_out (struct vty *vty, struct prefix *p,
! 5509: struct bgp_info *binfo, int display, safi_t safi)
! 5510: {
! 5511: struct attr *attr;
! 5512:
! 5513: /* short status lead text */
! 5514: route_vty_short_status_out (vty, binfo);
! 5515:
! 5516: /* print prefix and mask */
! 5517: if (! display)
! 5518: route_vty_out_route (p, vty);
! 5519: else
! 5520: vty_out (vty, "%*s", 17, " ");
! 5521:
! 5522: /* Print attribute */
! 5523: attr = binfo->attr;
! 5524: if (attr)
! 5525: {
! 5526: if (p->family == AF_INET)
! 5527: {
! 5528: if (safi == SAFI_MPLS_VPN)
! 5529: vty_out (vty, "%-16s",
! 5530: inet_ntoa (attr->extra->mp_nexthop_global_in));
! 5531: else
! 5532: vty_out (vty, "%-16s", inet_ntoa (attr->nexthop));
! 5533: }
! 5534: #ifdef HAVE_IPV6
! 5535: else if (p->family == AF_INET6)
! 5536: {
! 5537: int len;
! 5538: char buf[BUFSIZ];
! 5539:
! 5540: len = vty_out (vty, "%s",
! 5541: inet_ntop (AF_INET6, &attr->extra->mp_nexthop_global,
! 5542: buf, BUFSIZ));
! 5543: len = 16 - len;
! 5544: if (len < 1)
! 5545: vty_out (vty, "%s%*s", VTY_NEWLINE, 36, " ");
! 5546: else
! 5547: vty_out (vty, "%*s", len, " ");
! 5548: }
! 5549: #endif /* HAVE_IPV6 */
! 5550:
! 5551: if (attr->flag & ATTR_FLAG_BIT (BGP_ATTR_MULTI_EXIT_DISC))
! 5552: vty_out (vty, "%10u", attr->med);
! 5553: else
! 5554: vty_out (vty, " ");
! 5555:
! 5556: if (attr->flag & ATTR_FLAG_BIT (BGP_ATTR_LOCAL_PREF))
! 5557: vty_out (vty, "%7u", attr->local_pref);
! 5558: else
! 5559: vty_out (vty, " ");
! 5560:
! 5561: vty_out (vty, "%7u ", (attr->extra ? attr->extra->weight : 0));
! 5562:
! 5563: /* Print aspath */
! 5564: if (attr->aspath)
! 5565: aspath_print_vty (vty, "%s", attr->aspath, " ");
! 5566:
! 5567: /* Print origin */
! 5568: vty_out (vty, "%s", bgp_origin_str[attr->origin]);
! 5569: }
! 5570: vty_out (vty, "%s", VTY_NEWLINE);
! 5571: }
! 5572:
! 5573: /* called from terminal list command */
! 5574: void
! 5575: route_vty_out_tmp (struct vty *vty, struct prefix *p,
! 5576: struct attr *attr, safi_t safi)
! 5577: {
! 5578: /* Route status display. */
! 5579: vty_out (vty, "*");
! 5580: vty_out (vty, ">");
! 5581: vty_out (vty, " ");
! 5582:
! 5583: /* print prefix and mask */
! 5584: route_vty_out_route (p, vty);
! 5585:
! 5586: /* Print attribute */
! 5587: if (attr)
! 5588: {
! 5589: if (p->family == AF_INET)
! 5590: {
! 5591: if (safi == SAFI_MPLS_VPN)
! 5592: vty_out (vty, "%-16s",
! 5593: inet_ntoa (attr->extra->mp_nexthop_global_in));
! 5594: else
! 5595: vty_out (vty, "%-16s", inet_ntoa (attr->nexthop));
! 5596: }
! 5597: #ifdef HAVE_IPV6
! 5598: else if (p->family == AF_INET6)
! 5599: {
! 5600: int len;
! 5601: char buf[BUFSIZ];
! 5602:
! 5603: assert (attr->extra);
! 5604:
! 5605: len = vty_out (vty, "%s",
! 5606: inet_ntop (AF_INET6, &attr->extra->mp_nexthop_global,
! 5607: buf, BUFSIZ));
! 5608: len = 16 - len;
! 5609: if (len < 1)
! 5610: vty_out (vty, "%s%*s", VTY_NEWLINE, 36, " ");
! 5611: else
! 5612: vty_out (vty, "%*s", len, " ");
! 5613: }
! 5614: #endif /* HAVE_IPV6 */
! 5615:
! 5616: if (attr->flag & ATTR_FLAG_BIT (BGP_ATTR_MULTI_EXIT_DISC))
! 5617: vty_out (vty, "%10u", attr->med);
! 5618: else
! 5619: vty_out (vty, " ");
! 5620:
! 5621: if (attr->flag & ATTR_FLAG_BIT (BGP_ATTR_LOCAL_PREF))
! 5622: vty_out (vty, "%7u", attr->local_pref);
! 5623: else
! 5624: vty_out (vty, " ");
! 5625:
! 5626: vty_out (vty, "%7u ", (attr->extra ? attr->extra->weight : 0));
! 5627:
! 5628: /* Print aspath */
! 5629: if (attr->aspath)
! 5630: aspath_print_vty (vty, "%s", attr->aspath, " ");
! 5631:
! 5632: /* Print origin */
! 5633: vty_out (vty, "%s", bgp_origin_str[attr->origin]);
! 5634: }
! 5635:
! 5636: vty_out (vty, "%s", VTY_NEWLINE);
! 5637: }
! 5638:
! 5639: void
! 5640: route_vty_out_tag (struct vty *vty, struct prefix *p,
! 5641: struct bgp_info *binfo, int display, safi_t safi)
! 5642: {
! 5643: struct attr *attr;
! 5644: u_int32_t label = 0;
! 5645:
! 5646: if (!binfo->extra)
! 5647: return;
! 5648:
! 5649: /* short status lead text */
! 5650: route_vty_short_status_out (vty, binfo);
! 5651:
! 5652: /* print prefix and mask */
! 5653: if (! display)
! 5654: route_vty_out_route (p, vty);
! 5655: else
! 5656: vty_out (vty, "%*s", 17, " ");
! 5657:
! 5658: /* Print attribute */
! 5659: attr = binfo->attr;
! 5660: if (attr)
! 5661: {
! 5662: if (p->family == AF_INET)
! 5663: {
! 5664: if (safi == SAFI_MPLS_VPN)
! 5665: vty_out (vty, "%-16s",
! 5666: inet_ntoa (attr->extra->mp_nexthop_global_in));
! 5667: else
! 5668: vty_out (vty, "%-16s", inet_ntoa (attr->nexthop));
! 5669: }
! 5670: #ifdef HAVE_IPV6
! 5671: else if (p->family == AF_INET6)
! 5672: {
! 5673: assert (attr->extra);
! 5674: char buf[BUFSIZ];
! 5675: char buf1[BUFSIZ];
! 5676: if (attr->extra->mp_nexthop_len == 16)
! 5677: vty_out (vty, "%s",
! 5678: inet_ntop (AF_INET6, &attr->extra->mp_nexthop_global,
! 5679: buf, BUFSIZ));
! 5680: else if (attr->extra->mp_nexthop_len == 32)
! 5681: vty_out (vty, "%s(%s)",
! 5682: inet_ntop (AF_INET6, &attr->extra->mp_nexthop_global,
! 5683: buf, BUFSIZ),
! 5684: inet_ntop (AF_INET6, &attr->extra->mp_nexthop_local,
! 5685: buf1, BUFSIZ));
! 5686:
! 5687: }
! 5688: #endif /* HAVE_IPV6 */
! 5689: }
! 5690:
! 5691: label = decode_label (binfo->extra->tag);
! 5692:
! 5693: vty_out (vty, "notag/%d", label);
! 5694:
! 5695: vty_out (vty, "%s", VTY_NEWLINE);
! 5696: }
! 5697:
! 5698: /* dampening route */
! 5699: static void
! 5700: damp_route_vty_out (struct vty *vty, struct prefix *p,
! 5701: struct bgp_info *binfo, int display, safi_t safi)
! 5702: {
! 5703: struct attr *attr;
! 5704: int len;
! 5705: char timebuf[BGP_UPTIME_LEN];
! 5706:
! 5707: /* short status lead text */
! 5708: route_vty_short_status_out (vty, binfo);
! 5709:
! 5710: /* print prefix and mask */
! 5711: if (! display)
! 5712: route_vty_out_route (p, vty);
! 5713: else
! 5714: vty_out (vty, "%*s", 17, " ");
! 5715:
! 5716: len = vty_out (vty, "%s", binfo->peer->host);
! 5717: len = 17 - len;
! 5718: if (len < 1)
! 5719: vty_out (vty, "%s%*s", VTY_NEWLINE, 34, " ");
! 5720: else
! 5721: vty_out (vty, "%*s", len, " ");
! 5722:
! 5723: vty_out (vty, "%s ", bgp_damp_reuse_time_vty (vty, binfo, timebuf, BGP_UPTIME_LEN));
! 5724:
! 5725: /* Print attribute */
! 5726: attr = binfo->attr;
! 5727: if (attr)
! 5728: {
! 5729: /* Print aspath */
! 5730: if (attr->aspath)
! 5731: aspath_print_vty (vty, "%s", attr->aspath, " ");
! 5732:
! 5733: /* Print origin */
! 5734: vty_out (vty, "%s", bgp_origin_str[attr->origin]);
! 5735: }
! 5736: vty_out (vty, "%s", VTY_NEWLINE);
! 5737: }
! 5738:
! 5739: /* flap route */
! 5740: static void
! 5741: flap_route_vty_out (struct vty *vty, struct prefix *p,
! 5742: struct bgp_info *binfo, int display, safi_t safi)
! 5743: {
! 5744: struct attr *attr;
! 5745: struct bgp_damp_info *bdi;
! 5746: char timebuf[BGP_UPTIME_LEN];
! 5747: int len;
! 5748:
! 5749: if (!binfo->extra)
! 5750: return;
! 5751:
! 5752: bdi = binfo->extra->damp_info;
! 5753:
! 5754: /* short status lead text */
! 5755: route_vty_short_status_out (vty, binfo);
! 5756:
! 5757: /* print prefix and mask */
! 5758: if (! display)
! 5759: route_vty_out_route (p, vty);
! 5760: else
! 5761: vty_out (vty, "%*s", 17, " ");
! 5762:
! 5763: len = vty_out (vty, "%s", binfo->peer->host);
! 5764: len = 16 - len;
! 5765: if (len < 1)
! 5766: vty_out (vty, "%s%*s", VTY_NEWLINE, 33, " ");
! 5767: else
! 5768: vty_out (vty, "%*s", len, " ");
! 5769:
! 5770: len = vty_out (vty, "%d", bdi->flap);
! 5771: len = 5 - len;
! 5772: if (len < 1)
! 5773: vty_out (vty, " ");
! 5774: else
! 5775: vty_out (vty, "%*s ", len, " ");
! 5776:
! 5777: vty_out (vty, "%s ", peer_uptime (bdi->start_time,
! 5778: timebuf, BGP_UPTIME_LEN));
! 5779:
! 5780: if (CHECK_FLAG (binfo->flags, BGP_INFO_DAMPED)
! 5781: && ! CHECK_FLAG (binfo->flags, BGP_INFO_HISTORY))
! 5782: vty_out (vty, "%s ", bgp_damp_reuse_time_vty (vty, binfo, timebuf, BGP_UPTIME_LEN));
! 5783: else
! 5784: vty_out (vty, "%*s ", 8, " ");
! 5785:
! 5786: /* Print attribute */
! 5787: attr = binfo->attr;
! 5788: if (attr)
! 5789: {
! 5790: /* Print aspath */
! 5791: if (attr->aspath)
! 5792: aspath_print_vty (vty, "%s", attr->aspath, " ");
! 5793:
! 5794: /* Print origin */
! 5795: vty_out (vty, "%s", bgp_origin_str[attr->origin]);
! 5796: }
! 5797: vty_out (vty, "%s", VTY_NEWLINE);
! 5798: }
! 5799:
! 5800: static void
! 5801: route_vty_out_detail (struct vty *vty, struct bgp *bgp, struct prefix *p,
! 5802: struct bgp_info *binfo, afi_t afi, safi_t safi)
! 5803: {
! 5804: char buf[INET6_ADDRSTRLEN];
! 5805: char buf1[BUFSIZ];
! 5806: struct attr *attr;
! 5807: int sockunion_vty_out (struct vty *, union sockunion *);
! 5808: #ifdef HAVE_CLOCK_MONOTONIC
! 5809: time_t tbuf;
! 5810: #endif
! 5811:
! 5812: attr = binfo->attr;
! 5813:
! 5814: if (attr)
! 5815: {
! 5816: /* Line1 display AS-path, Aggregator */
! 5817: if (attr->aspath)
! 5818: {
! 5819: vty_out (vty, " ");
! 5820: if (aspath_count_hops (attr->aspath) == 0)
! 5821: vty_out (vty, "Local");
! 5822: else
! 5823: aspath_print_vty (vty, "%s", attr->aspath, "");
! 5824: }
! 5825:
! 5826: if (CHECK_FLAG (binfo->flags, BGP_INFO_REMOVED))
! 5827: vty_out (vty, ", (removed)");
! 5828: if (CHECK_FLAG (binfo->flags, BGP_INFO_STALE))
! 5829: vty_out (vty, ", (stale)");
! 5830: if (CHECK_FLAG (attr->flag, ATTR_FLAG_BIT (BGP_ATTR_AGGREGATOR)))
! 5831: vty_out (vty, ", (aggregated by %u %s)",
! 5832: attr->extra->aggregator_as,
! 5833: inet_ntoa (attr->extra->aggregator_addr));
! 5834: if (CHECK_FLAG (binfo->peer->af_flags[afi][safi], PEER_FLAG_REFLECTOR_CLIENT))
! 5835: vty_out (vty, ", (Received from a RR-client)");
! 5836: if (CHECK_FLAG (binfo->peer->af_flags[afi][safi], PEER_FLAG_RSERVER_CLIENT))
! 5837: vty_out (vty, ", (Received from a RS-client)");
! 5838: if (CHECK_FLAG (binfo->flags, BGP_INFO_HISTORY))
! 5839: vty_out (vty, ", (history entry)");
! 5840: else if (CHECK_FLAG (binfo->flags, BGP_INFO_DAMPED))
! 5841: vty_out (vty, ", (suppressed due to dampening)");
! 5842: vty_out (vty, "%s", VTY_NEWLINE);
! 5843:
! 5844: /* Line2 display Next-hop, Neighbor, Router-id */
! 5845: if (p->family == AF_INET)
! 5846: {
! 5847: vty_out (vty, " %s", safi == SAFI_MPLS_VPN ?
! 5848: inet_ntoa (attr->extra->mp_nexthop_global_in) :
! 5849: inet_ntoa (attr->nexthop));
! 5850: }
! 5851: #ifdef HAVE_IPV6
! 5852: else
! 5853: {
! 5854: assert (attr->extra);
! 5855: vty_out (vty, " %s",
! 5856: inet_ntop (AF_INET6, &attr->extra->mp_nexthop_global,
! 5857: buf, INET6_ADDRSTRLEN));
! 5858: }
! 5859: #endif /* HAVE_IPV6 */
! 5860:
! 5861: if (binfo->peer == bgp->peer_self)
! 5862: {
! 5863: vty_out (vty, " from %s ",
! 5864: p->family == AF_INET ? "0.0.0.0" : "::");
! 5865: vty_out (vty, "(%s)", inet_ntoa(bgp->router_id));
! 5866: }
! 5867: else
! 5868: {
! 5869: if (! CHECK_FLAG (binfo->flags, BGP_INFO_VALID))
! 5870: vty_out (vty, " (inaccessible)");
! 5871: else if (binfo->extra && binfo->extra->igpmetric)
! 5872: vty_out (vty, " (metric %d)", binfo->extra->igpmetric);
! 5873: vty_out (vty, " from %s", sockunion2str (&binfo->peer->su, buf, SU_ADDRSTRLEN));
! 5874: if (attr->flag & ATTR_FLAG_BIT(BGP_ATTR_ORIGINATOR_ID))
! 5875: vty_out (vty, " (%s)", inet_ntoa (attr->extra->originator_id));
! 5876: else
! 5877: vty_out (vty, " (%s)", inet_ntop (AF_INET, &binfo->peer->remote_id, buf1, BUFSIZ));
! 5878: }
! 5879: vty_out (vty, "%s", VTY_NEWLINE);
! 5880:
! 5881: #ifdef HAVE_IPV6
! 5882: /* display nexthop local */
! 5883: if (attr->extra && attr->extra->mp_nexthop_len == 32)
! 5884: {
! 5885: vty_out (vty, " (%s)%s",
! 5886: inet_ntop (AF_INET6, &attr->extra->mp_nexthop_local,
! 5887: buf, INET6_ADDRSTRLEN),
! 5888: VTY_NEWLINE);
! 5889: }
! 5890: #endif /* HAVE_IPV6 */
! 5891:
! 5892: /* Line 3 display Origin, Med, Locpref, Weight, valid, Int/Ext/Local, Atomic, best */
! 5893: vty_out (vty, " Origin %s", bgp_origin_long_str[attr->origin]);
! 5894:
! 5895: if (attr->flag & ATTR_FLAG_BIT(BGP_ATTR_MULTI_EXIT_DISC))
! 5896: vty_out (vty, ", metric %u", attr->med);
! 5897:
! 5898: if (attr->flag & ATTR_FLAG_BIT(BGP_ATTR_LOCAL_PREF))
! 5899: vty_out (vty, ", localpref %u", attr->local_pref);
! 5900: else
! 5901: vty_out (vty, ", localpref %u", bgp->default_local_pref);
! 5902:
! 5903: if (attr->extra && attr->extra->weight != 0)
! 5904: vty_out (vty, ", weight %u", attr->extra->weight);
! 5905:
! 5906: if (! CHECK_FLAG (binfo->flags, BGP_INFO_HISTORY))
! 5907: vty_out (vty, ", valid");
! 5908:
! 5909: if (binfo->peer != bgp->peer_self)
! 5910: {
! 5911: if (binfo->peer->as == binfo->peer->local_as)
! 5912: vty_out (vty, ", internal");
! 5913: else
! 5914: vty_out (vty, ", %s",
! 5915: (bgp_confederation_peers_check(bgp, binfo->peer->as) ? "confed-external" : "external"));
! 5916: }
! 5917: else if (binfo->sub_type == BGP_ROUTE_AGGREGATE)
! 5918: vty_out (vty, ", aggregated, local");
! 5919: else if (binfo->type != ZEBRA_ROUTE_BGP)
! 5920: vty_out (vty, ", sourced");
! 5921: else
! 5922: vty_out (vty, ", sourced, local");
! 5923:
! 5924: if (attr->flag & ATTR_FLAG_BIT(BGP_ATTR_ATOMIC_AGGREGATE))
! 5925: vty_out (vty, ", atomic-aggregate");
! 5926:
! 5927: if (CHECK_FLAG (binfo->flags, BGP_INFO_SELECTED))
! 5928: vty_out (vty, ", best");
! 5929:
! 5930: vty_out (vty, "%s", VTY_NEWLINE);
! 5931:
! 5932: /* Line 4 display Community */
! 5933: if (attr->community)
! 5934: vty_out (vty, " Community: %s%s", attr->community->str,
! 5935: VTY_NEWLINE);
! 5936:
! 5937: /* Line 5 display Extended-community */
! 5938: if (attr->flag & ATTR_FLAG_BIT(BGP_ATTR_EXT_COMMUNITIES))
! 5939: vty_out (vty, " Extended Community: %s%s",
! 5940: attr->extra->ecommunity->str, VTY_NEWLINE);
! 5941:
! 5942: /* Line 6 display Originator, Cluster-id */
! 5943: if ((attr->flag & ATTR_FLAG_BIT(BGP_ATTR_ORIGINATOR_ID)) ||
! 5944: (attr->flag & ATTR_FLAG_BIT(BGP_ATTR_CLUSTER_LIST)))
! 5945: {
! 5946: assert (attr->extra);
! 5947: if (attr->flag & ATTR_FLAG_BIT(BGP_ATTR_ORIGINATOR_ID))
! 5948: vty_out (vty, " Originator: %s",
! 5949: inet_ntoa (attr->extra->originator_id));
! 5950:
! 5951: if (attr->flag & ATTR_FLAG_BIT(BGP_ATTR_CLUSTER_LIST))
! 5952: {
! 5953: int i;
! 5954: vty_out (vty, ", Cluster list: ");
! 5955: for (i = 0; i < attr->extra->cluster->length / 4; i++)
! 5956: vty_out (vty, "%s ",
! 5957: inet_ntoa (attr->extra->cluster->list[i]));
! 5958: }
! 5959: vty_out (vty, "%s", VTY_NEWLINE);
! 5960: }
! 5961:
! 5962: if (binfo->extra && binfo->extra->damp_info)
! 5963: bgp_damp_info_vty (vty, binfo);
! 5964:
! 5965: /* Line 7 display Uptime */
! 5966: #ifdef HAVE_CLOCK_MONOTONIC
! 5967: tbuf = time(NULL) - (bgp_clock() - binfo->uptime);
! 5968: vty_out (vty, " Last update: %s", ctime(&tbuf));
! 5969: #else
! 5970: vty_out (vty, " Last update: %s", ctime(&binfo->uptime));
! 5971: #endif /* HAVE_CLOCK_MONOTONIC */
! 5972: }
! 5973: vty_out (vty, "%s", VTY_NEWLINE);
! 5974: }
! 5975:
! 5976: #define BGP_SHOW_SCODE_HEADER "Status codes: s suppressed, d damped, h history, * valid, > best, i - internal,%s r RIB-failure, S Stale, R Removed%s"
! 5977: #define BGP_SHOW_OCODE_HEADER "Origin codes: i - IGP, e - EGP, ? - incomplete%s%s"
! 5978: #define BGP_SHOW_HEADER " Network Next Hop Metric LocPrf Weight Path%s"
! 5979: #define BGP_SHOW_DAMP_HEADER " Network From Reuse Path%s"
! 5980: #define BGP_SHOW_FLAP_HEADER " Network From Flaps Duration Reuse Path%s"
! 5981:
! 5982: enum bgp_show_type
! 5983: {
! 5984: bgp_show_type_normal,
! 5985: bgp_show_type_regexp,
! 5986: bgp_show_type_prefix_list,
! 5987: bgp_show_type_filter_list,
! 5988: bgp_show_type_route_map,
! 5989: bgp_show_type_neighbor,
! 5990: bgp_show_type_cidr_only,
! 5991: bgp_show_type_prefix_longer,
! 5992: bgp_show_type_community_all,
! 5993: bgp_show_type_community,
! 5994: bgp_show_type_community_exact,
! 5995: bgp_show_type_community_list,
! 5996: bgp_show_type_community_list_exact,
! 5997: bgp_show_type_flap_statistics,
! 5998: bgp_show_type_flap_address,
! 5999: bgp_show_type_flap_prefix,
! 6000: bgp_show_type_flap_cidr_only,
! 6001: bgp_show_type_flap_regexp,
! 6002: bgp_show_type_flap_filter_list,
! 6003: bgp_show_type_flap_prefix_list,
! 6004: bgp_show_type_flap_prefix_longer,
! 6005: bgp_show_type_flap_route_map,
! 6006: bgp_show_type_flap_neighbor,
! 6007: bgp_show_type_dampend_paths,
! 6008: bgp_show_type_damp_neighbor
! 6009: };
! 6010:
! 6011: static int
! 6012: bgp_show_table (struct vty *vty, struct bgp_table *table, struct in_addr *router_id,
! 6013: enum bgp_show_type type, void *output_arg)
! 6014: {
! 6015: struct bgp_info *ri;
! 6016: struct bgp_node *rn;
! 6017: int header = 1;
! 6018: int display;
! 6019: unsigned long output_count;
! 6020:
! 6021: /* This is first entry point, so reset total line. */
! 6022: output_count = 0;
! 6023:
! 6024: /* Start processing of routes. */
! 6025: for (rn = bgp_table_top (table); rn; rn = bgp_route_next (rn))
! 6026: if (rn->info != NULL)
! 6027: {
! 6028: display = 0;
! 6029:
! 6030: for (ri = rn->info; ri; ri = ri->next)
! 6031: {
! 6032: if (type == bgp_show_type_flap_statistics
! 6033: || type == bgp_show_type_flap_address
! 6034: || type == bgp_show_type_flap_prefix
! 6035: || type == bgp_show_type_flap_cidr_only
! 6036: || type == bgp_show_type_flap_regexp
! 6037: || type == bgp_show_type_flap_filter_list
! 6038: || type == bgp_show_type_flap_prefix_list
! 6039: || type == bgp_show_type_flap_prefix_longer
! 6040: || type == bgp_show_type_flap_route_map
! 6041: || type == bgp_show_type_flap_neighbor
! 6042: || type == bgp_show_type_dampend_paths
! 6043: || type == bgp_show_type_damp_neighbor)
! 6044: {
! 6045: if (!(ri->extra && ri->extra->damp_info))
! 6046: continue;
! 6047: }
! 6048: if (type == bgp_show_type_regexp
! 6049: || type == bgp_show_type_flap_regexp)
! 6050: {
! 6051: regex_t *regex = output_arg;
! 6052:
! 6053: if (bgp_regexec (regex, ri->attr->aspath) == REG_NOMATCH)
! 6054: continue;
! 6055: }
! 6056: if (type == bgp_show_type_prefix_list
! 6057: || type == bgp_show_type_flap_prefix_list)
! 6058: {
! 6059: struct prefix_list *plist = output_arg;
! 6060:
! 6061: if (prefix_list_apply (plist, &rn->p) != PREFIX_PERMIT)
! 6062: continue;
! 6063: }
! 6064: if (type == bgp_show_type_filter_list
! 6065: || type == bgp_show_type_flap_filter_list)
! 6066: {
! 6067: struct as_list *as_list = output_arg;
! 6068:
! 6069: if (as_list_apply (as_list, ri->attr->aspath) != AS_FILTER_PERMIT)
! 6070: continue;
! 6071: }
! 6072: if (type == bgp_show_type_route_map
! 6073: || type == bgp_show_type_flap_route_map)
! 6074: {
! 6075: struct route_map *rmap = output_arg;
! 6076: struct bgp_info binfo;
! 6077: struct attr dummy_attr = { 0 };
! 6078: int ret;
! 6079:
! 6080: bgp_attr_dup (&dummy_attr, ri->attr);
! 6081: binfo.peer = ri->peer;
! 6082: binfo.attr = &dummy_attr;
! 6083:
! 6084: ret = route_map_apply (rmap, &rn->p, RMAP_BGP, &binfo);
! 6085:
! 6086: bgp_attr_extra_free (&dummy_attr);
! 6087:
! 6088: if (ret == RMAP_DENYMATCH)
! 6089: continue;
! 6090: }
! 6091: if (type == bgp_show_type_neighbor
! 6092: || type == bgp_show_type_flap_neighbor
! 6093: || type == bgp_show_type_damp_neighbor)
! 6094: {
! 6095: union sockunion *su = output_arg;
! 6096:
! 6097: if (ri->peer->su_remote == NULL || ! sockunion_same(ri->peer->su_remote, su))
! 6098: continue;
! 6099: }
! 6100: if (type == bgp_show_type_cidr_only
! 6101: || type == bgp_show_type_flap_cidr_only)
! 6102: {
! 6103: u_int32_t destination;
! 6104:
! 6105: destination = ntohl (rn->p.u.prefix4.s_addr);
! 6106: if (IN_CLASSC (destination) && rn->p.prefixlen == 24)
! 6107: continue;
! 6108: if (IN_CLASSB (destination) && rn->p.prefixlen == 16)
! 6109: continue;
! 6110: if (IN_CLASSA (destination) && rn->p.prefixlen == 8)
! 6111: continue;
! 6112: }
! 6113: if (type == bgp_show_type_prefix_longer
! 6114: || type == bgp_show_type_flap_prefix_longer)
! 6115: {
! 6116: struct prefix *p = output_arg;
! 6117:
! 6118: if (! prefix_match (p, &rn->p))
! 6119: continue;
! 6120: }
! 6121: if (type == bgp_show_type_community_all)
! 6122: {
! 6123: if (! ri->attr->community)
! 6124: continue;
! 6125: }
! 6126: if (type == bgp_show_type_community)
! 6127: {
! 6128: struct community *com = output_arg;
! 6129:
! 6130: if (! ri->attr->community ||
! 6131: ! community_match (ri->attr->community, com))
! 6132: continue;
! 6133: }
! 6134: if (type == bgp_show_type_community_exact)
! 6135: {
! 6136: struct community *com = output_arg;
! 6137:
! 6138: if (! ri->attr->community ||
! 6139: ! community_cmp (ri->attr->community, com))
! 6140: continue;
! 6141: }
! 6142: if (type == bgp_show_type_community_list)
! 6143: {
! 6144: struct community_list *list = output_arg;
! 6145:
! 6146: if (! community_list_match (ri->attr->community, list))
! 6147: continue;
! 6148: }
! 6149: if (type == bgp_show_type_community_list_exact)
! 6150: {
! 6151: struct community_list *list = output_arg;
! 6152:
! 6153: if (! community_list_exact_match (ri->attr->community, list))
! 6154: continue;
! 6155: }
! 6156: if (type == bgp_show_type_flap_address
! 6157: || type == bgp_show_type_flap_prefix)
! 6158: {
! 6159: struct prefix *p = output_arg;
! 6160:
! 6161: if (! prefix_match (&rn->p, p))
! 6162: continue;
! 6163:
! 6164: if (type == bgp_show_type_flap_prefix)
! 6165: if (p->prefixlen != rn->p.prefixlen)
! 6166: continue;
! 6167: }
! 6168: if (type == bgp_show_type_dampend_paths
! 6169: || type == bgp_show_type_damp_neighbor)
! 6170: {
! 6171: if (! CHECK_FLAG (ri->flags, BGP_INFO_DAMPED)
! 6172: || CHECK_FLAG (ri->flags, BGP_INFO_HISTORY))
! 6173: continue;
! 6174: }
! 6175:
! 6176: if (header)
! 6177: {
! 6178: vty_out (vty, "BGP table version is 0, local router ID is %s%s", inet_ntoa (*router_id), VTY_NEWLINE);
! 6179: vty_out (vty, BGP_SHOW_SCODE_HEADER, VTY_NEWLINE, VTY_NEWLINE);
! 6180: vty_out (vty, BGP_SHOW_OCODE_HEADER, VTY_NEWLINE, VTY_NEWLINE);
! 6181: if (type == bgp_show_type_dampend_paths
! 6182: || type == bgp_show_type_damp_neighbor)
! 6183: vty_out (vty, BGP_SHOW_DAMP_HEADER, VTY_NEWLINE);
! 6184: else if (type == bgp_show_type_flap_statistics
! 6185: || type == bgp_show_type_flap_address
! 6186: || type == bgp_show_type_flap_prefix
! 6187: || type == bgp_show_type_flap_cidr_only
! 6188: || type == bgp_show_type_flap_regexp
! 6189: || type == bgp_show_type_flap_filter_list
! 6190: || type == bgp_show_type_flap_prefix_list
! 6191: || type == bgp_show_type_flap_prefix_longer
! 6192: || type == bgp_show_type_flap_route_map
! 6193: || type == bgp_show_type_flap_neighbor)
! 6194: vty_out (vty, BGP_SHOW_FLAP_HEADER, VTY_NEWLINE);
! 6195: else
! 6196: vty_out (vty, BGP_SHOW_HEADER, VTY_NEWLINE);
! 6197: header = 0;
! 6198: }
! 6199:
! 6200: if (type == bgp_show_type_dampend_paths
! 6201: || type == bgp_show_type_damp_neighbor)
! 6202: damp_route_vty_out (vty, &rn->p, ri, display, SAFI_UNICAST);
! 6203: else if (type == bgp_show_type_flap_statistics
! 6204: || type == bgp_show_type_flap_address
! 6205: || type == bgp_show_type_flap_prefix
! 6206: || type == bgp_show_type_flap_cidr_only
! 6207: || type == bgp_show_type_flap_regexp
! 6208: || type == bgp_show_type_flap_filter_list
! 6209: || type == bgp_show_type_flap_prefix_list
! 6210: || type == bgp_show_type_flap_prefix_longer
! 6211: || type == bgp_show_type_flap_route_map
! 6212: || type == bgp_show_type_flap_neighbor)
! 6213: flap_route_vty_out (vty, &rn->p, ri, display, SAFI_UNICAST);
! 6214: else
! 6215: route_vty_out (vty, &rn->p, ri, display, SAFI_UNICAST);
! 6216: display++;
! 6217: }
! 6218: if (display)
! 6219: output_count++;
! 6220: }
! 6221:
! 6222: /* No route is displayed */
! 6223: if (output_count == 0)
! 6224: {
! 6225: if (type == bgp_show_type_normal)
! 6226: vty_out (vty, "No BGP network exists%s", VTY_NEWLINE);
! 6227: }
! 6228: else
! 6229: vty_out (vty, "%sTotal number of prefixes %ld%s",
! 6230: VTY_NEWLINE, output_count, VTY_NEWLINE);
! 6231:
! 6232: return CMD_SUCCESS;
! 6233: }
! 6234:
! 6235: static int
! 6236: bgp_show (struct vty *vty, struct bgp *bgp, afi_t afi, safi_t safi,
! 6237: enum bgp_show_type type, void *output_arg)
! 6238: {
! 6239: struct bgp_table *table;
! 6240:
! 6241: if (bgp == NULL) {
! 6242: bgp = bgp_get_default ();
! 6243: }
! 6244:
! 6245: if (bgp == NULL)
! 6246: {
! 6247: vty_out (vty, "No BGP process is configured%s", VTY_NEWLINE);
! 6248: return CMD_WARNING;
! 6249: }
! 6250:
! 6251:
! 6252: table = bgp->rib[afi][safi];
! 6253:
! 6254: return bgp_show_table (vty, table, &bgp->router_id, type, output_arg);
! 6255: }
! 6256:
! 6257: /* Header of detailed BGP route information */
! 6258: static void
! 6259: route_vty_out_detail_header (struct vty *vty, struct bgp *bgp,
! 6260: struct bgp_node *rn,
! 6261: struct prefix_rd *prd, afi_t afi, safi_t safi)
! 6262: {
! 6263: struct bgp_info *ri;
! 6264: struct prefix *p;
! 6265: struct peer *peer;
! 6266: struct listnode *node, *nnode;
! 6267: char buf1[INET6_ADDRSTRLEN];
! 6268: char buf2[INET6_ADDRSTRLEN];
! 6269: int count = 0;
! 6270: int best = 0;
! 6271: int suppress = 0;
! 6272: int no_export = 0;
! 6273: int no_advertise = 0;
! 6274: int local_as = 0;
! 6275: int first = 0;
! 6276:
! 6277: p = &rn->p;
! 6278: vty_out (vty, "BGP routing table entry for %s%s%s/%d%s",
! 6279: (safi == SAFI_MPLS_VPN ?
! 6280: prefix_rd2str (prd, buf1, RD_ADDRSTRLEN) : ""),
! 6281: safi == SAFI_MPLS_VPN ? ":" : "",
! 6282: inet_ntop (p->family, &p->u.prefix, buf2, INET6_ADDRSTRLEN),
! 6283: p->prefixlen, VTY_NEWLINE);
! 6284:
! 6285: for (ri = rn->info; ri; ri = ri->next)
! 6286: {
! 6287: count++;
! 6288: if (CHECK_FLAG (ri->flags, BGP_INFO_SELECTED))
! 6289: {
! 6290: best = count;
! 6291: if (ri->extra && ri->extra->suppress)
! 6292: suppress = 1;
! 6293: if (ri->attr->community != NULL)
! 6294: {
! 6295: if (community_include (ri->attr->community, COMMUNITY_NO_ADVERTISE))
! 6296: no_advertise = 1;
! 6297: if (community_include (ri->attr->community, COMMUNITY_NO_EXPORT))
! 6298: no_export = 1;
! 6299: if (community_include (ri->attr->community, COMMUNITY_LOCAL_AS))
! 6300: local_as = 1;
! 6301: }
! 6302: }
! 6303: }
! 6304:
! 6305: vty_out (vty, "Paths: (%d available", count);
! 6306: if (best)
! 6307: {
! 6308: vty_out (vty, ", best #%d", best);
! 6309: if (safi == SAFI_UNICAST)
! 6310: vty_out (vty, ", table Default-IP-Routing-Table");
! 6311: }
! 6312: else
! 6313: vty_out (vty, ", no best path");
! 6314: if (no_advertise)
! 6315: vty_out (vty, ", not advertised to any peer");
! 6316: else if (no_export)
! 6317: vty_out (vty, ", not advertised to EBGP peer");
! 6318: else if (local_as)
! 6319: vty_out (vty, ", not advertised outside local AS");
! 6320: if (suppress)
! 6321: vty_out (vty, ", Advertisements suppressed by an aggregate.");
! 6322: vty_out (vty, ")%s", VTY_NEWLINE);
! 6323:
! 6324: /* advertised peer */
! 6325: for (ALL_LIST_ELEMENTS (bgp->peer, node, nnode, peer))
! 6326: {
! 6327: if (bgp_adj_out_lookup (peer, p, afi, safi, rn))
! 6328: {
! 6329: if (! first)
! 6330: vty_out (vty, " Advertised to non peer-group peers:%s ", VTY_NEWLINE);
! 6331: vty_out (vty, " %s", sockunion2str (&peer->su, buf1, SU_ADDRSTRLEN));
! 6332: first = 1;
! 6333: }
! 6334: }
! 6335: if (! first)
! 6336: vty_out (vty, " Not advertised to any peer");
! 6337: vty_out (vty, "%s", VTY_NEWLINE);
! 6338: }
! 6339:
! 6340: /* Display specified route of BGP table. */
! 6341: static int
! 6342: bgp_show_route_in_table (struct vty *vty, struct bgp *bgp,
! 6343: struct bgp_table *rib, const char *ip_str,
! 6344: afi_t afi, safi_t safi, struct prefix_rd *prd,
! 6345: int prefix_check)
! 6346: {
! 6347: int ret;
! 6348: int header;
! 6349: int display = 0;
! 6350: struct prefix match;
! 6351: struct bgp_node *rn;
! 6352: struct bgp_node *rm;
! 6353: struct bgp_info *ri;
! 6354: struct bgp_table *table;
! 6355:
! 6356: /* Check IP address argument. */
! 6357: ret = str2prefix (ip_str, &match);
! 6358: if (! ret)
! 6359: {
! 6360: vty_out (vty, "address is malformed%s", VTY_NEWLINE);
! 6361: return CMD_WARNING;
! 6362: }
! 6363:
! 6364: match.family = afi2family (afi);
! 6365:
! 6366: if (safi == SAFI_MPLS_VPN)
! 6367: {
! 6368: for (rn = bgp_table_top (rib); rn; rn = bgp_route_next (rn))
! 6369: {
! 6370: if (prd && memcmp (rn->p.u.val, prd->val, 8) != 0)
! 6371: continue;
! 6372:
! 6373: if ((table = rn->info) != NULL)
! 6374: {
! 6375: header = 1;
! 6376:
! 6377: if ((rm = bgp_node_match (table, &match)) != NULL)
! 6378: {
! 6379: if (prefix_check && rm->p.prefixlen != match.prefixlen)
! 6380: {
! 6381: bgp_unlock_node (rm);
! 6382: continue;
! 6383: }
! 6384:
! 6385: for (ri = rm->info; ri; ri = ri->next)
! 6386: {
! 6387: if (header)
! 6388: {
! 6389: route_vty_out_detail_header (vty, bgp, rm, (struct prefix_rd *)&rn->p,
! 6390: AFI_IP, SAFI_MPLS_VPN);
! 6391:
! 6392: header = 0;
! 6393: }
! 6394: display++;
! 6395: route_vty_out_detail (vty, bgp, &rm->p, ri, AFI_IP, SAFI_MPLS_VPN);
! 6396: }
! 6397:
! 6398: bgp_unlock_node (rm);
! 6399: }
! 6400: }
! 6401: }
! 6402: }
! 6403: else
! 6404: {
! 6405: header = 1;
! 6406:
! 6407: if ((rn = bgp_node_match (rib, &match)) != NULL)
! 6408: {
! 6409: if (! prefix_check || rn->p.prefixlen == match.prefixlen)
! 6410: {
! 6411: for (ri = rn->info; ri; ri = ri->next)
! 6412: {
! 6413: if (header)
! 6414: {
! 6415: route_vty_out_detail_header (vty, bgp, rn, NULL, afi, safi);
! 6416: header = 0;
! 6417: }
! 6418: display++;
! 6419: route_vty_out_detail (vty, bgp, &rn->p, ri, afi, safi);
! 6420: }
! 6421: }
! 6422:
! 6423: bgp_unlock_node (rn);
! 6424: }
! 6425: }
! 6426:
! 6427: if (! display)
! 6428: {
! 6429: vty_out (vty, "%% Network not in table%s", VTY_NEWLINE);
! 6430: return CMD_WARNING;
! 6431: }
! 6432:
! 6433: return CMD_SUCCESS;
! 6434: }
! 6435:
! 6436: /* Display specified route of Main RIB */
! 6437: static int
! 6438: bgp_show_route (struct vty *vty, const char *view_name, const char *ip_str,
! 6439: afi_t afi, safi_t safi, struct prefix_rd *prd,
! 6440: int prefix_check)
! 6441: {
! 6442: struct bgp *bgp;
! 6443:
! 6444: /* BGP structure lookup. */
! 6445: if (view_name)
! 6446: {
! 6447: bgp = bgp_lookup_by_name (view_name);
! 6448: if (bgp == NULL)
! 6449: {
! 6450: vty_out (vty, "Can't find BGP view %s%s", view_name, VTY_NEWLINE);
! 6451: return CMD_WARNING;
! 6452: }
! 6453: }
! 6454: else
! 6455: {
! 6456: bgp = bgp_get_default ();
! 6457: if (bgp == NULL)
! 6458: {
! 6459: vty_out (vty, "No BGP process is configured%s", VTY_NEWLINE);
! 6460: return CMD_WARNING;
! 6461: }
! 6462: }
! 6463:
! 6464: return bgp_show_route_in_table (vty, bgp, bgp->rib[afi][safi], ip_str,
! 6465: afi, safi, prd, prefix_check);
! 6466: }
! 6467:
! 6468: /* BGP route print out function. */
! 6469: DEFUN (show_ip_bgp,
! 6470: show_ip_bgp_cmd,
! 6471: "show ip bgp",
! 6472: SHOW_STR
! 6473: IP_STR
! 6474: BGP_STR)
! 6475: {
! 6476: return bgp_show (vty, NULL, AFI_IP, SAFI_UNICAST, bgp_show_type_normal, NULL);
! 6477: }
! 6478:
! 6479: DEFUN (show_ip_bgp_ipv4,
! 6480: show_ip_bgp_ipv4_cmd,
! 6481: "show ip bgp ipv4 (unicast|multicast)",
! 6482: SHOW_STR
! 6483: IP_STR
! 6484: BGP_STR
! 6485: "Address family\n"
! 6486: "Address Family modifier\n"
! 6487: "Address Family modifier\n")
! 6488: {
! 6489: if (strncmp (argv[0], "m", 1) == 0)
! 6490: return bgp_show (vty, NULL, AFI_IP, SAFI_MULTICAST, bgp_show_type_normal,
! 6491: NULL);
! 6492:
! 6493: return bgp_show (vty, NULL, AFI_IP, SAFI_UNICAST, bgp_show_type_normal, NULL);
! 6494: }
! 6495:
! 6496: ALIAS (show_ip_bgp_ipv4,
! 6497: show_bgp_ipv4_safi_cmd,
! 6498: "show bgp ipv4 (unicast|multicast)",
! 6499: SHOW_STR
! 6500: BGP_STR
! 6501: "Address family\n"
! 6502: "Address Family modifier\n"
! 6503: "Address Family modifier\n")
! 6504:
! 6505: DEFUN (show_ip_bgp_route,
! 6506: show_ip_bgp_route_cmd,
! 6507: "show ip bgp A.B.C.D",
! 6508: SHOW_STR
! 6509: IP_STR
! 6510: BGP_STR
! 6511: "Network in the BGP routing table to display\n")
! 6512: {
! 6513: return bgp_show_route (vty, NULL, argv[0], AFI_IP, SAFI_UNICAST, NULL, 0);
! 6514: }
! 6515:
! 6516: DEFUN (show_ip_bgp_ipv4_route,
! 6517: show_ip_bgp_ipv4_route_cmd,
! 6518: "show ip bgp ipv4 (unicast|multicast) A.B.C.D",
! 6519: SHOW_STR
! 6520: IP_STR
! 6521: BGP_STR
! 6522: "Address family\n"
! 6523: "Address Family modifier\n"
! 6524: "Address Family modifier\n"
! 6525: "Network in the BGP routing table to display\n")
! 6526: {
! 6527: if (strncmp (argv[0], "m", 1) == 0)
! 6528: return bgp_show_route (vty, NULL, argv[1], AFI_IP, SAFI_MULTICAST, NULL, 0);
! 6529:
! 6530: return bgp_show_route (vty, NULL, argv[1], AFI_IP, SAFI_UNICAST, NULL, 0);
! 6531: }
! 6532:
! 6533: ALIAS (show_ip_bgp_ipv4_route,
! 6534: show_bgp_ipv4_safi_route_cmd,
! 6535: "show bgp ipv4 (unicast|multicast) A.B.C.D",
! 6536: SHOW_STR
! 6537: BGP_STR
! 6538: "Address family\n"
! 6539: "Address Family modifier\n"
! 6540: "Address Family modifier\n"
! 6541: "Network in the BGP routing table to display\n")
! 6542:
! 6543: DEFUN (show_ip_bgp_vpnv4_all_route,
! 6544: show_ip_bgp_vpnv4_all_route_cmd,
! 6545: "show ip bgp vpnv4 all A.B.C.D",
! 6546: SHOW_STR
! 6547: IP_STR
! 6548: BGP_STR
! 6549: "Display VPNv4 NLRI specific information\n"
! 6550: "Display information about all VPNv4 NLRIs\n"
! 6551: "Network in the BGP routing table to display\n")
! 6552: {
! 6553: return bgp_show_route (vty, NULL, argv[0], AFI_IP, SAFI_MPLS_VPN, NULL, 0);
! 6554: }
! 6555:
! 6556: DEFUN (show_ip_bgp_vpnv4_rd_route,
! 6557: show_ip_bgp_vpnv4_rd_route_cmd,
! 6558: "show ip bgp vpnv4 rd ASN:nn_or_IP-address:nn A.B.C.D",
! 6559: SHOW_STR
! 6560: IP_STR
! 6561: BGP_STR
! 6562: "Display VPNv4 NLRI specific information\n"
! 6563: "Display information for a route distinguisher\n"
! 6564: "VPN Route Distinguisher\n"
! 6565: "Network in the BGP routing table to display\n")
! 6566: {
! 6567: int ret;
! 6568: struct prefix_rd prd;
! 6569:
! 6570: ret = str2prefix_rd (argv[0], &prd);
! 6571: if (! ret)
! 6572: {
! 6573: vty_out (vty, "%% Malformed Route Distinguisher%s", VTY_NEWLINE);
! 6574: return CMD_WARNING;
! 6575: }
! 6576: return bgp_show_route (vty, NULL, argv[1], AFI_IP, SAFI_MPLS_VPN, &prd, 0);
! 6577: }
! 6578:
! 6579: DEFUN (show_ip_bgp_prefix,
! 6580: show_ip_bgp_prefix_cmd,
! 6581: "show ip bgp A.B.C.D/M",
! 6582: SHOW_STR
! 6583: IP_STR
! 6584: BGP_STR
! 6585: "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n")
! 6586: {
! 6587: return bgp_show_route (vty, NULL, argv[0], AFI_IP, SAFI_UNICAST, NULL, 1);
! 6588: }
! 6589:
! 6590: DEFUN (show_ip_bgp_ipv4_prefix,
! 6591: show_ip_bgp_ipv4_prefix_cmd,
! 6592: "show ip bgp ipv4 (unicast|multicast) A.B.C.D/M",
! 6593: SHOW_STR
! 6594: IP_STR
! 6595: BGP_STR
! 6596: "Address family\n"
! 6597: "Address Family modifier\n"
! 6598: "Address Family modifier\n"
! 6599: "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n")
! 6600: {
! 6601: if (strncmp (argv[0], "m", 1) == 0)
! 6602: return bgp_show_route (vty, NULL, argv[1], AFI_IP, SAFI_MULTICAST, NULL, 1);
! 6603:
! 6604: return bgp_show_route (vty, NULL, argv[1], AFI_IP, SAFI_UNICAST, NULL, 1);
! 6605: }
! 6606:
! 6607: ALIAS (show_ip_bgp_ipv4_prefix,
! 6608: show_bgp_ipv4_safi_prefix_cmd,
! 6609: "show bgp ipv4 (unicast|multicast) A.B.C.D/M",
! 6610: SHOW_STR
! 6611: BGP_STR
! 6612: "Address family\n"
! 6613: "Address Family modifier\n"
! 6614: "Address Family modifier\n"
! 6615: "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n")
! 6616:
! 6617: DEFUN (show_ip_bgp_vpnv4_all_prefix,
! 6618: show_ip_bgp_vpnv4_all_prefix_cmd,
! 6619: "show ip bgp vpnv4 all A.B.C.D/M",
! 6620: SHOW_STR
! 6621: IP_STR
! 6622: BGP_STR
! 6623: "Display VPNv4 NLRI specific information\n"
! 6624: "Display information about all VPNv4 NLRIs\n"
! 6625: "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n")
! 6626: {
! 6627: return bgp_show_route (vty, NULL, argv[0], AFI_IP, SAFI_MPLS_VPN, NULL, 1);
! 6628: }
! 6629:
! 6630: DEFUN (show_ip_bgp_vpnv4_rd_prefix,
! 6631: show_ip_bgp_vpnv4_rd_prefix_cmd,
! 6632: "show ip bgp vpnv4 rd ASN:nn_or_IP-address:nn A.B.C.D/M",
! 6633: SHOW_STR
! 6634: IP_STR
! 6635: BGP_STR
! 6636: "Display VPNv4 NLRI specific information\n"
! 6637: "Display information for a route distinguisher\n"
! 6638: "VPN Route Distinguisher\n"
! 6639: "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n")
! 6640: {
! 6641: int ret;
! 6642: struct prefix_rd prd;
! 6643:
! 6644: ret = str2prefix_rd (argv[0], &prd);
! 6645: if (! ret)
! 6646: {
! 6647: vty_out (vty, "%% Malformed Route Distinguisher%s", VTY_NEWLINE);
! 6648: return CMD_WARNING;
! 6649: }
! 6650: return bgp_show_route (vty, NULL, argv[1], AFI_IP, SAFI_MPLS_VPN, &prd, 1);
! 6651: }
! 6652:
! 6653: DEFUN (show_ip_bgp_view,
! 6654: show_ip_bgp_view_cmd,
! 6655: "show ip bgp view WORD",
! 6656: SHOW_STR
! 6657: IP_STR
! 6658: BGP_STR
! 6659: "BGP view\n"
! 6660: "BGP view name\n")
! 6661: {
! 6662: struct bgp *bgp;
! 6663:
! 6664: /* BGP structure lookup. */
! 6665: bgp = bgp_lookup_by_name (argv[0]);
! 6666: if (bgp == NULL)
! 6667: {
! 6668: vty_out (vty, "Can't find BGP view %s%s", argv[0], VTY_NEWLINE);
! 6669: return CMD_WARNING;
! 6670: }
! 6671:
! 6672: return bgp_show (vty, bgp, AFI_IP, SAFI_UNICAST, bgp_show_type_normal, NULL);
! 6673: }
! 6674:
! 6675: DEFUN (show_ip_bgp_view_route,
! 6676: show_ip_bgp_view_route_cmd,
! 6677: "show ip bgp view WORD A.B.C.D",
! 6678: SHOW_STR
! 6679: IP_STR
! 6680: BGP_STR
! 6681: "BGP view\n"
! 6682: "BGP view name\n"
! 6683: "Network in the BGP routing table to display\n")
! 6684: {
! 6685: return bgp_show_route (vty, argv[0], argv[1], AFI_IP, SAFI_UNICAST, NULL, 0);
! 6686: }
! 6687:
! 6688: DEFUN (show_ip_bgp_view_prefix,
! 6689: show_ip_bgp_view_prefix_cmd,
! 6690: "show ip bgp view WORD A.B.C.D/M",
! 6691: SHOW_STR
! 6692: IP_STR
! 6693: BGP_STR
! 6694: "BGP view\n"
! 6695: "BGP view name\n"
! 6696: "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n")
! 6697: {
! 6698: return bgp_show_route (vty, argv[0], argv[1], AFI_IP, SAFI_UNICAST, NULL, 1);
! 6699: }
! 6700:
! 6701: #ifdef HAVE_IPV6
! 6702: DEFUN (show_bgp,
! 6703: show_bgp_cmd,
! 6704: "show bgp",
! 6705: SHOW_STR
! 6706: BGP_STR)
! 6707: {
! 6708: return bgp_show (vty, NULL, AFI_IP6, SAFI_UNICAST, bgp_show_type_normal,
! 6709: NULL);
! 6710: }
! 6711:
! 6712: ALIAS (show_bgp,
! 6713: show_bgp_ipv6_cmd,
! 6714: "show bgp ipv6",
! 6715: SHOW_STR
! 6716: BGP_STR
! 6717: "Address family\n")
! 6718:
! 6719: DEFUN (show_bgp_ipv6_safi,
! 6720: show_bgp_ipv6_safi_cmd,
! 6721: "show bgp ipv6 (unicast|multicast)",
! 6722: SHOW_STR
! 6723: BGP_STR
! 6724: "Address family\n"
! 6725: "Address Family modifier\n"
! 6726: "Address Family modifier\n")
! 6727: {
! 6728: if (strncmp (argv[0], "m", 1) == 0)
! 6729: return bgp_show (vty, NULL, AFI_IP6, SAFI_MULTICAST, bgp_show_type_normal,
! 6730: NULL);
! 6731:
! 6732: return bgp_show (vty, NULL, AFI_IP6, SAFI_UNICAST, bgp_show_type_normal, NULL);
! 6733: }
! 6734:
! 6735: /* old command */
! 6736: DEFUN (show_ipv6_bgp,
! 6737: show_ipv6_bgp_cmd,
! 6738: "show ipv6 bgp",
! 6739: SHOW_STR
! 6740: IP_STR
! 6741: BGP_STR)
! 6742: {
! 6743: return bgp_show (vty, NULL, AFI_IP6, SAFI_UNICAST, bgp_show_type_normal,
! 6744: NULL);
! 6745: }
! 6746:
! 6747: DEFUN (show_bgp_route,
! 6748: show_bgp_route_cmd,
! 6749: "show bgp X:X::X:X",
! 6750: SHOW_STR
! 6751: BGP_STR
! 6752: "Network in the BGP routing table to display\n")
! 6753: {
! 6754: return bgp_show_route (vty, NULL, argv[0], AFI_IP6, SAFI_UNICAST, NULL, 0);
! 6755: }
! 6756:
! 6757: ALIAS (show_bgp_route,
! 6758: show_bgp_ipv6_route_cmd,
! 6759: "show bgp ipv6 X:X::X:X",
! 6760: SHOW_STR
! 6761: BGP_STR
! 6762: "Address family\n"
! 6763: "Network in the BGP routing table to display\n")
! 6764:
! 6765: DEFUN (show_bgp_ipv6_safi_route,
! 6766: show_bgp_ipv6_safi_route_cmd,
! 6767: "show bgp ipv6 (unicast|multicast) X:X::X:X",
! 6768: SHOW_STR
! 6769: BGP_STR
! 6770: "Address family\n"
! 6771: "Address Family modifier\n"
! 6772: "Address Family modifier\n"
! 6773: "Network in the BGP routing table to display\n")
! 6774: {
! 6775: if (strncmp (argv[0], "m", 1) == 0)
! 6776: return bgp_show_route (vty, NULL, argv[1], AFI_IP6, SAFI_MULTICAST, NULL, 0);
! 6777:
! 6778: return bgp_show_route (vty, NULL, argv[1], AFI_IP6, SAFI_UNICAST, NULL, 0);
! 6779: }
! 6780:
! 6781: /* old command */
! 6782: DEFUN (show_ipv6_bgp_route,
! 6783: show_ipv6_bgp_route_cmd,
! 6784: "show ipv6 bgp X:X::X:X",
! 6785: SHOW_STR
! 6786: IP_STR
! 6787: BGP_STR
! 6788: "Network in the BGP routing table to display\n")
! 6789: {
! 6790: return bgp_show_route (vty, NULL, argv[0], AFI_IP6, SAFI_UNICAST, NULL, 0);
! 6791: }
! 6792:
! 6793: DEFUN (show_bgp_prefix,
! 6794: show_bgp_prefix_cmd,
! 6795: "show bgp X:X::X:X/M",
! 6796: SHOW_STR
! 6797: BGP_STR
! 6798: "IPv6 prefix <network>/<length>\n")
! 6799: {
! 6800: return bgp_show_route (vty, NULL, argv[0], AFI_IP6, SAFI_UNICAST, NULL, 1);
! 6801: }
! 6802:
! 6803: ALIAS (show_bgp_prefix,
! 6804: show_bgp_ipv6_prefix_cmd,
! 6805: "show bgp ipv6 X:X::X:X/M",
! 6806: SHOW_STR
! 6807: BGP_STR
! 6808: "Address family\n"
! 6809: "IPv6 prefix <network>/<length>\n")
! 6810:
! 6811: DEFUN (show_bgp_ipv6_safi_prefix,
! 6812: show_bgp_ipv6_safi_prefix_cmd,
! 6813: "show bgp ipv6 (unicast|multicast) X:X::X:X/M",
! 6814: SHOW_STR
! 6815: BGP_STR
! 6816: "Address family\n"
! 6817: "Address Family modifier\n"
! 6818: "Address Family modifier\n"
! 6819: "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n")
! 6820: {
! 6821: if (strncmp (argv[0], "m", 1) == 0)
! 6822: return bgp_show_route (vty, NULL, argv[1], AFI_IP6, SAFI_MULTICAST, NULL, 1);
! 6823:
! 6824: return bgp_show_route (vty, NULL, argv[1], AFI_IP6, SAFI_UNICAST, NULL, 1);
! 6825: }
! 6826:
! 6827: /* old command */
! 6828: DEFUN (show_ipv6_bgp_prefix,
! 6829: show_ipv6_bgp_prefix_cmd,
! 6830: "show ipv6 bgp X:X::X:X/M",
! 6831: SHOW_STR
! 6832: IP_STR
! 6833: BGP_STR
! 6834: "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n")
! 6835: {
! 6836: return bgp_show_route (vty, NULL, argv[0], AFI_IP6, SAFI_UNICAST, NULL, 1);
! 6837: }
! 6838:
! 6839: DEFUN (show_bgp_view,
! 6840: show_bgp_view_cmd,
! 6841: "show bgp view WORD",
! 6842: SHOW_STR
! 6843: BGP_STR
! 6844: "BGP view\n"
! 6845: "View name\n")
! 6846: {
! 6847: struct bgp *bgp;
! 6848:
! 6849: /* BGP structure lookup. */
! 6850: bgp = bgp_lookup_by_name (argv[0]);
! 6851: if (bgp == NULL)
! 6852: {
! 6853: vty_out (vty, "Can't find BGP view %s%s", argv[0], VTY_NEWLINE);
! 6854: return CMD_WARNING;
! 6855: }
! 6856:
! 6857: return bgp_show (vty, bgp, AFI_IP6, SAFI_UNICAST, bgp_show_type_normal, NULL);
! 6858: }
! 6859:
! 6860: ALIAS (show_bgp_view,
! 6861: show_bgp_view_ipv6_cmd,
! 6862: "show bgp view WORD ipv6",
! 6863: SHOW_STR
! 6864: BGP_STR
! 6865: "BGP view\n"
! 6866: "View name\n"
! 6867: "Address family\n")
! 6868:
! 6869: DEFUN (show_bgp_view_route,
! 6870: show_bgp_view_route_cmd,
! 6871: "show bgp view WORD X:X::X:X",
! 6872: SHOW_STR
! 6873: BGP_STR
! 6874: "BGP view\n"
! 6875: "View name\n"
! 6876: "Network in the BGP routing table to display\n")
! 6877: {
! 6878: return bgp_show_route (vty, argv[0], argv[1], AFI_IP6, SAFI_UNICAST, NULL, 0);
! 6879: }
! 6880:
! 6881: ALIAS (show_bgp_view_route,
! 6882: show_bgp_view_ipv6_route_cmd,
! 6883: "show bgp view WORD ipv6 X:X::X:X",
! 6884: SHOW_STR
! 6885: BGP_STR
! 6886: "BGP view\n"
! 6887: "View name\n"
! 6888: "Address family\n"
! 6889: "Network in the BGP routing table to display\n")
! 6890:
! 6891: DEFUN (show_bgp_view_prefix,
! 6892: show_bgp_view_prefix_cmd,
! 6893: "show bgp view WORD X:X::X:X/M",
! 6894: SHOW_STR
! 6895: BGP_STR
! 6896: "BGP view\n"
! 6897: "View name\n"
! 6898: "IPv6 prefix <network>/<length>\n")
! 6899: {
! 6900: return bgp_show_route (vty, argv[0], argv[1], AFI_IP6, SAFI_UNICAST, NULL, 1);
! 6901: }
! 6902:
! 6903: ALIAS (show_bgp_view_prefix,
! 6904: show_bgp_view_ipv6_prefix_cmd,
! 6905: "show bgp view WORD ipv6 X:X::X:X/M",
! 6906: SHOW_STR
! 6907: BGP_STR
! 6908: "BGP view\n"
! 6909: "View name\n"
! 6910: "Address family\n"
! 6911: "IPv6 prefix <network>/<length>\n")
! 6912:
! 6913: /* old command */
! 6914: DEFUN (show_ipv6_mbgp,
! 6915: show_ipv6_mbgp_cmd,
! 6916: "show ipv6 mbgp",
! 6917: SHOW_STR
! 6918: IP_STR
! 6919: MBGP_STR)
! 6920: {
! 6921: return bgp_show (vty, NULL, AFI_IP6, SAFI_MULTICAST, bgp_show_type_normal,
! 6922: NULL);
! 6923: }
! 6924:
! 6925: /* old command */
! 6926: DEFUN (show_ipv6_mbgp_route,
! 6927: show_ipv6_mbgp_route_cmd,
! 6928: "show ipv6 mbgp X:X::X:X",
! 6929: SHOW_STR
! 6930: IP_STR
! 6931: MBGP_STR
! 6932: "Network in the MBGP routing table to display\n")
! 6933: {
! 6934: return bgp_show_route (vty, NULL, argv[0], AFI_IP6, SAFI_MULTICAST, NULL, 0);
! 6935: }
! 6936:
! 6937: /* old command */
! 6938: DEFUN (show_ipv6_mbgp_prefix,
! 6939: show_ipv6_mbgp_prefix_cmd,
! 6940: "show ipv6 mbgp X:X::X:X/M",
! 6941: SHOW_STR
! 6942: IP_STR
! 6943: MBGP_STR
! 6944: "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n")
! 6945: {
! 6946: return bgp_show_route (vty, NULL, argv[0], AFI_IP6, SAFI_MULTICAST, NULL, 1);
! 6947: }
! 6948: #endif
! 6949:
! 6950:
! 6951: static int
! 6952: bgp_show_regexp (struct vty *vty, int argc, const char **argv, afi_t afi,
! 6953: safi_t safi, enum bgp_show_type type)
! 6954: {
! 6955: int i;
! 6956: struct buffer *b;
! 6957: char *regstr;
! 6958: int first;
! 6959: regex_t *regex;
! 6960: int rc;
! 6961:
! 6962: first = 0;
! 6963: b = buffer_new (1024);
! 6964: for (i = 0; i < argc; i++)
! 6965: {
! 6966: if (first)
! 6967: buffer_putc (b, ' ');
! 6968: else
! 6969: {
! 6970: if ((strcmp (argv[i], "unicast") == 0) || (strcmp (argv[i], "multicast") == 0))
! 6971: continue;
! 6972: first = 1;
! 6973: }
! 6974:
! 6975: buffer_putstr (b, argv[i]);
! 6976: }
! 6977: buffer_putc (b, '\0');
! 6978:
! 6979: regstr = buffer_getstr (b);
! 6980: buffer_free (b);
! 6981:
! 6982: regex = bgp_regcomp (regstr);
! 6983: XFREE(MTYPE_TMP, regstr);
! 6984: if (! regex)
! 6985: {
! 6986: vty_out (vty, "Can't compile regexp %s%s", argv[0],
! 6987: VTY_NEWLINE);
! 6988: return CMD_WARNING;
! 6989: }
! 6990:
! 6991: rc = bgp_show (vty, NULL, afi, safi, type, regex);
! 6992: bgp_regex_free (regex);
! 6993: return rc;
! 6994: }
! 6995:
! 6996: DEFUN (show_ip_bgp_regexp,
! 6997: show_ip_bgp_regexp_cmd,
! 6998: "show ip bgp regexp .LINE",
! 6999: SHOW_STR
! 7000: IP_STR
! 7001: BGP_STR
! 7002: "Display routes matching the AS path regular expression\n"
! 7003: "A regular-expression to match the BGP AS paths\n")
! 7004: {
! 7005: return bgp_show_regexp (vty, argc, argv, AFI_IP, SAFI_UNICAST,
! 7006: bgp_show_type_regexp);
! 7007: }
! 7008:
! 7009: DEFUN (show_ip_bgp_flap_regexp,
! 7010: show_ip_bgp_flap_regexp_cmd,
! 7011: "show ip bgp flap-statistics regexp .LINE",
! 7012: SHOW_STR
! 7013: IP_STR
! 7014: BGP_STR
! 7015: "Display flap statistics of routes\n"
! 7016: "Display routes matching the AS path regular expression\n"
! 7017: "A regular-expression to match the BGP AS paths\n")
! 7018: {
! 7019: return bgp_show_regexp (vty, argc, argv, AFI_IP, SAFI_UNICAST,
! 7020: bgp_show_type_flap_regexp);
! 7021: }
! 7022:
! 7023: DEFUN (show_ip_bgp_ipv4_regexp,
! 7024: show_ip_bgp_ipv4_regexp_cmd,
! 7025: "show ip bgp ipv4 (unicast|multicast) regexp .LINE",
! 7026: SHOW_STR
! 7027: IP_STR
! 7028: BGP_STR
! 7029: "Address family\n"
! 7030: "Address Family modifier\n"
! 7031: "Address Family modifier\n"
! 7032: "Display routes matching the AS path regular expression\n"
! 7033: "A regular-expression to match the BGP AS paths\n")
! 7034: {
! 7035: if (strncmp (argv[0], "m", 1) == 0)
! 7036: return bgp_show_regexp (vty, argc, argv, AFI_IP, SAFI_MULTICAST,
! 7037: bgp_show_type_regexp);
! 7038:
! 7039: return bgp_show_regexp (vty, argc, argv, AFI_IP, SAFI_UNICAST,
! 7040: bgp_show_type_regexp);
! 7041: }
! 7042:
! 7043: #ifdef HAVE_IPV6
! 7044: DEFUN (show_bgp_regexp,
! 7045: show_bgp_regexp_cmd,
! 7046: "show bgp regexp .LINE",
! 7047: SHOW_STR
! 7048: BGP_STR
! 7049: "Display routes matching the AS path regular expression\n"
! 7050: "A regular-expression to match the BGP AS paths\n")
! 7051: {
! 7052: return bgp_show_regexp (vty, argc, argv, AFI_IP6, SAFI_UNICAST,
! 7053: bgp_show_type_regexp);
! 7054: }
! 7055:
! 7056: ALIAS (show_bgp_regexp,
! 7057: show_bgp_ipv6_regexp_cmd,
! 7058: "show bgp ipv6 regexp .LINE",
! 7059: SHOW_STR
! 7060: BGP_STR
! 7061: "Address family\n"
! 7062: "Display routes matching the AS path regular expression\n"
! 7063: "A regular-expression to match the BGP AS paths\n")
! 7064:
! 7065: /* old command */
! 7066: DEFUN (show_ipv6_bgp_regexp,
! 7067: show_ipv6_bgp_regexp_cmd,
! 7068: "show ipv6 bgp regexp .LINE",
! 7069: SHOW_STR
! 7070: IP_STR
! 7071: BGP_STR
! 7072: "Display routes matching the AS path regular expression\n"
! 7073: "A regular-expression to match the BGP AS paths\n")
! 7074: {
! 7075: return bgp_show_regexp (vty, argc, argv, AFI_IP6, SAFI_UNICAST,
! 7076: bgp_show_type_regexp);
! 7077: }
! 7078:
! 7079: /* old command */
! 7080: DEFUN (show_ipv6_mbgp_regexp,
! 7081: show_ipv6_mbgp_regexp_cmd,
! 7082: "show ipv6 mbgp regexp .LINE",
! 7083: SHOW_STR
! 7084: IP_STR
! 7085: BGP_STR
! 7086: "Display routes matching the AS path regular expression\n"
! 7087: "A regular-expression to match the MBGP AS paths\n")
! 7088: {
! 7089: return bgp_show_regexp (vty, argc, argv, AFI_IP6, SAFI_MULTICAST,
! 7090: bgp_show_type_regexp);
! 7091: }
! 7092: #endif /* HAVE_IPV6 */
! 7093:
! 7094: static int
! 7095: bgp_show_prefix_list (struct vty *vty, const char *prefix_list_str, afi_t afi,
! 7096: safi_t safi, enum bgp_show_type type)
! 7097: {
! 7098: struct prefix_list *plist;
! 7099:
! 7100: plist = prefix_list_lookup (afi, prefix_list_str);
! 7101: if (plist == NULL)
! 7102: {
! 7103: vty_out (vty, "%% %s is not a valid prefix-list name%s",
! 7104: prefix_list_str, VTY_NEWLINE);
! 7105: return CMD_WARNING;
! 7106: }
! 7107:
! 7108: return bgp_show (vty, NULL, afi, safi, type, plist);
! 7109: }
! 7110:
! 7111: DEFUN (show_ip_bgp_prefix_list,
! 7112: show_ip_bgp_prefix_list_cmd,
! 7113: "show ip bgp prefix-list WORD",
! 7114: SHOW_STR
! 7115: IP_STR
! 7116: BGP_STR
! 7117: "Display routes conforming to the prefix-list\n"
! 7118: "IP prefix-list name\n")
! 7119: {
! 7120: return bgp_show_prefix_list (vty, argv[0], AFI_IP, SAFI_UNICAST,
! 7121: bgp_show_type_prefix_list);
! 7122: }
! 7123:
! 7124: DEFUN (show_ip_bgp_flap_prefix_list,
! 7125: show_ip_bgp_flap_prefix_list_cmd,
! 7126: "show ip bgp flap-statistics prefix-list WORD",
! 7127: SHOW_STR
! 7128: IP_STR
! 7129: BGP_STR
! 7130: "Display flap statistics of routes\n"
! 7131: "Display routes conforming to the prefix-list\n"
! 7132: "IP prefix-list name\n")
! 7133: {
! 7134: return bgp_show_prefix_list (vty, argv[0], AFI_IP, SAFI_UNICAST,
! 7135: bgp_show_type_flap_prefix_list);
! 7136: }
! 7137:
! 7138: DEFUN (show_ip_bgp_ipv4_prefix_list,
! 7139: show_ip_bgp_ipv4_prefix_list_cmd,
! 7140: "show ip bgp ipv4 (unicast|multicast) prefix-list WORD",
! 7141: SHOW_STR
! 7142: IP_STR
! 7143: BGP_STR
! 7144: "Address family\n"
! 7145: "Address Family modifier\n"
! 7146: "Address Family modifier\n"
! 7147: "Display routes conforming to the prefix-list\n"
! 7148: "IP prefix-list name\n")
! 7149: {
! 7150: if (strncmp (argv[0], "m", 1) == 0)
! 7151: return bgp_show_prefix_list (vty, argv[1], AFI_IP, SAFI_MULTICAST,
! 7152: bgp_show_type_prefix_list);
! 7153:
! 7154: return bgp_show_prefix_list (vty, argv[1], AFI_IP, SAFI_UNICAST,
! 7155: bgp_show_type_prefix_list);
! 7156: }
! 7157:
! 7158: #ifdef HAVE_IPV6
! 7159: DEFUN (show_bgp_prefix_list,
! 7160: show_bgp_prefix_list_cmd,
! 7161: "show bgp prefix-list WORD",
! 7162: SHOW_STR
! 7163: BGP_STR
! 7164: "Display routes conforming to the prefix-list\n"
! 7165: "IPv6 prefix-list name\n")
! 7166: {
! 7167: return bgp_show_prefix_list (vty, argv[0], AFI_IP6, SAFI_UNICAST,
! 7168: bgp_show_type_prefix_list);
! 7169: }
! 7170:
! 7171: ALIAS (show_bgp_prefix_list,
! 7172: show_bgp_ipv6_prefix_list_cmd,
! 7173: "show bgp ipv6 prefix-list WORD",
! 7174: SHOW_STR
! 7175: BGP_STR
! 7176: "Address family\n"
! 7177: "Display routes conforming to the prefix-list\n"
! 7178: "IPv6 prefix-list name\n")
! 7179:
! 7180: /* old command */
! 7181: DEFUN (show_ipv6_bgp_prefix_list,
! 7182: show_ipv6_bgp_prefix_list_cmd,
! 7183: "show ipv6 bgp prefix-list WORD",
! 7184: SHOW_STR
! 7185: IPV6_STR
! 7186: BGP_STR
! 7187: "Display routes matching the prefix-list\n"
! 7188: "IPv6 prefix-list name\n")
! 7189: {
! 7190: return bgp_show_prefix_list (vty, argv[0], AFI_IP6, SAFI_UNICAST,
! 7191: bgp_show_type_prefix_list);
! 7192: }
! 7193:
! 7194: /* old command */
! 7195: DEFUN (show_ipv6_mbgp_prefix_list,
! 7196: show_ipv6_mbgp_prefix_list_cmd,
! 7197: "show ipv6 mbgp prefix-list WORD",
! 7198: SHOW_STR
! 7199: IPV6_STR
! 7200: MBGP_STR
! 7201: "Display routes matching the prefix-list\n"
! 7202: "IPv6 prefix-list name\n")
! 7203: {
! 7204: return bgp_show_prefix_list (vty, argv[0], AFI_IP6, SAFI_MULTICAST,
! 7205: bgp_show_type_prefix_list);
! 7206: }
! 7207: #endif /* HAVE_IPV6 */
! 7208:
! 7209: static int
! 7210: bgp_show_filter_list (struct vty *vty, const char *filter, afi_t afi,
! 7211: safi_t safi, enum bgp_show_type type)
! 7212: {
! 7213: struct as_list *as_list;
! 7214:
! 7215: as_list = as_list_lookup (filter);
! 7216: if (as_list == NULL)
! 7217: {
! 7218: vty_out (vty, "%% %s is not a valid AS-path access-list name%s", filter, VTY_NEWLINE);
! 7219: return CMD_WARNING;
! 7220: }
! 7221:
! 7222: return bgp_show (vty, NULL, afi, safi, type, as_list);
! 7223: }
! 7224:
! 7225: DEFUN (show_ip_bgp_filter_list,
! 7226: show_ip_bgp_filter_list_cmd,
! 7227: "show ip bgp filter-list WORD",
! 7228: SHOW_STR
! 7229: IP_STR
! 7230: BGP_STR
! 7231: "Display routes conforming to the filter-list\n"
! 7232: "Regular expression access list name\n")
! 7233: {
! 7234: return bgp_show_filter_list (vty, argv[0], AFI_IP, SAFI_UNICAST,
! 7235: bgp_show_type_filter_list);
! 7236: }
! 7237:
! 7238: DEFUN (show_ip_bgp_flap_filter_list,
! 7239: show_ip_bgp_flap_filter_list_cmd,
! 7240: "show ip bgp flap-statistics filter-list WORD",
! 7241: SHOW_STR
! 7242: IP_STR
! 7243: BGP_STR
! 7244: "Display flap statistics of routes\n"
! 7245: "Display routes conforming to the filter-list\n"
! 7246: "Regular expression access list name\n")
! 7247: {
! 7248: return bgp_show_filter_list (vty, argv[0], AFI_IP, SAFI_UNICAST,
! 7249: bgp_show_type_flap_filter_list);
! 7250: }
! 7251:
! 7252: DEFUN (show_ip_bgp_ipv4_filter_list,
! 7253: show_ip_bgp_ipv4_filter_list_cmd,
! 7254: "show ip bgp ipv4 (unicast|multicast) filter-list WORD",
! 7255: SHOW_STR
! 7256: IP_STR
! 7257: BGP_STR
! 7258: "Address family\n"
! 7259: "Address Family modifier\n"
! 7260: "Address Family modifier\n"
! 7261: "Display routes conforming to the filter-list\n"
! 7262: "Regular expression access list name\n")
! 7263: {
! 7264: if (strncmp (argv[0], "m", 1) == 0)
! 7265: return bgp_show_filter_list (vty, argv[1], AFI_IP, SAFI_MULTICAST,
! 7266: bgp_show_type_filter_list);
! 7267:
! 7268: return bgp_show_filter_list (vty, argv[1], AFI_IP, SAFI_UNICAST,
! 7269: bgp_show_type_filter_list);
! 7270: }
! 7271:
! 7272: #ifdef HAVE_IPV6
! 7273: DEFUN (show_bgp_filter_list,
! 7274: show_bgp_filter_list_cmd,
! 7275: "show bgp filter-list WORD",
! 7276: SHOW_STR
! 7277: BGP_STR
! 7278: "Display routes conforming to the filter-list\n"
! 7279: "Regular expression access list name\n")
! 7280: {
! 7281: return bgp_show_filter_list (vty, argv[0], AFI_IP6, SAFI_UNICAST,
! 7282: bgp_show_type_filter_list);
! 7283: }
! 7284:
! 7285: ALIAS (show_bgp_filter_list,
! 7286: show_bgp_ipv6_filter_list_cmd,
! 7287: "show bgp ipv6 filter-list WORD",
! 7288: SHOW_STR
! 7289: BGP_STR
! 7290: "Address family\n"
! 7291: "Display routes conforming to the filter-list\n"
! 7292: "Regular expression access list name\n")
! 7293:
! 7294: /* old command */
! 7295: DEFUN (show_ipv6_bgp_filter_list,
! 7296: show_ipv6_bgp_filter_list_cmd,
! 7297: "show ipv6 bgp filter-list WORD",
! 7298: SHOW_STR
! 7299: IPV6_STR
! 7300: BGP_STR
! 7301: "Display routes conforming to the filter-list\n"
! 7302: "Regular expression access list name\n")
! 7303: {
! 7304: return bgp_show_filter_list (vty, argv[0], AFI_IP6, SAFI_UNICAST,
! 7305: bgp_show_type_filter_list);
! 7306: }
! 7307:
! 7308: /* old command */
! 7309: DEFUN (show_ipv6_mbgp_filter_list,
! 7310: show_ipv6_mbgp_filter_list_cmd,
! 7311: "show ipv6 mbgp filter-list WORD",
! 7312: SHOW_STR
! 7313: IPV6_STR
! 7314: MBGP_STR
! 7315: "Display routes conforming to the filter-list\n"
! 7316: "Regular expression access list name\n")
! 7317: {
! 7318: return bgp_show_filter_list (vty, argv[0], AFI_IP6, SAFI_MULTICAST,
! 7319: bgp_show_type_filter_list);
! 7320: }
! 7321: #endif /* HAVE_IPV6 */
! 7322:
! 7323: static int
! 7324: bgp_show_route_map (struct vty *vty, const char *rmap_str, afi_t afi,
! 7325: safi_t safi, enum bgp_show_type type)
! 7326: {
! 7327: struct route_map *rmap;
! 7328:
! 7329: rmap = route_map_lookup_by_name (rmap_str);
! 7330: if (! rmap)
! 7331: {
! 7332: vty_out (vty, "%% %s is not a valid route-map name%s",
! 7333: rmap_str, VTY_NEWLINE);
! 7334: return CMD_WARNING;
! 7335: }
! 7336:
! 7337: return bgp_show (vty, NULL, afi, safi, type, rmap);
! 7338: }
! 7339:
! 7340: DEFUN (show_ip_bgp_route_map,
! 7341: show_ip_bgp_route_map_cmd,
! 7342: "show ip bgp route-map WORD",
! 7343: SHOW_STR
! 7344: IP_STR
! 7345: BGP_STR
! 7346: "Display routes matching the route-map\n"
! 7347: "A route-map to match on\n")
! 7348: {
! 7349: return bgp_show_route_map (vty, argv[0], AFI_IP, SAFI_UNICAST,
! 7350: bgp_show_type_route_map);
! 7351: }
! 7352:
! 7353: DEFUN (show_ip_bgp_flap_route_map,
! 7354: show_ip_bgp_flap_route_map_cmd,
! 7355: "show ip bgp flap-statistics route-map WORD",
! 7356: SHOW_STR
! 7357: IP_STR
! 7358: BGP_STR
! 7359: "Display flap statistics of routes\n"
! 7360: "Display routes matching the route-map\n"
! 7361: "A route-map to match on\n")
! 7362: {
! 7363: return bgp_show_route_map (vty, argv[0], AFI_IP, SAFI_UNICAST,
! 7364: bgp_show_type_flap_route_map);
! 7365: }
! 7366:
! 7367: DEFUN (show_ip_bgp_ipv4_route_map,
! 7368: show_ip_bgp_ipv4_route_map_cmd,
! 7369: "show ip bgp ipv4 (unicast|multicast) route-map WORD",
! 7370: SHOW_STR
! 7371: IP_STR
! 7372: BGP_STR
! 7373: "Address family\n"
! 7374: "Address Family modifier\n"
! 7375: "Address Family modifier\n"
! 7376: "Display routes matching the route-map\n"
! 7377: "A route-map to match on\n")
! 7378: {
! 7379: if (strncmp (argv[0], "m", 1) == 0)
! 7380: return bgp_show_route_map (vty, argv[1], AFI_IP, SAFI_MULTICAST,
! 7381: bgp_show_type_route_map);
! 7382:
! 7383: return bgp_show_route_map (vty, argv[1], AFI_IP, SAFI_UNICAST,
! 7384: bgp_show_type_route_map);
! 7385: }
! 7386:
! 7387: DEFUN (show_bgp_route_map,
! 7388: show_bgp_route_map_cmd,
! 7389: "show bgp route-map WORD",
! 7390: SHOW_STR
! 7391: BGP_STR
! 7392: "Display routes matching the route-map\n"
! 7393: "A route-map to match on\n")
! 7394: {
! 7395: return bgp_show_route_map (vty, argv[0], AFI_IP6, SAFI_UNICAST,
! 7396: bgp_show_type_route_map);
! 7397: }
! 7398:
! 7399: ALIAS (show_bgp_route_map,
! 7400: show_bgp_ipv6_route_map_cmd,
! 7401: "show bgp ipv6 route-map WORD",
! 7402: SHOW_STR
! 7403: BGP_STR
! 7404: "Address family\n"
! 7405: "Display routes matching the route-map\n"
! 7406: "A route-map to match on\n")
! 7407:
! 7408: DEFUN (show_ip_bgp_cidr_only,
! 7409: show_ip_bgp_cidr_only_cmd,
! 7410: "show ip bgp cidr-only",
! 7411: SHOW_STR
! 7412: IP_STR
! 7413: BGP_STR
! 7414: "Display only routes with non-natural netmasks\n")
! 7415: {
! 7416: return bgp_show (vty, NULL, AFI_IP, SAFI_UNICAST,
! 7417: bgp_show_type_cidr_only, NULL);
! 7418: }
! 7419:
! 7420: DEFUN (show_ip_bgp_flap_cidr_only,
! 7421: show_ip_bgp_flap_cidr_only_cmd,
! 7422: "show ip bgp flap-statistics cidr-only",
! 7423: SHOW_STR
! 7424: IP_STR
! 7425: BGP_STR
! 7426: "Display flap statistics of routes\n"
! 7427: "Display only routes with non-natural netmasks\n")
! 7428: {
! 7429: return bgp_show (vty, NULL, AFI_IP, SAFI_UNICAST,
! 7430: bgp_show_type_flap_cidr_only, NULL);
! 7431: }
! 7432:
! 7433: DEFUN (show_ip_bgp_ipv4_cidr_only,
! 7434: show_ip_bgp_ipv4_cidr_only_cmd,
! 7435: "show ip bgp ipv4 (unicast|multicast) cidr-only",
! 7436: SHOW_STR
! 7437: IP_STR
! 7438: BGP_STR
! 7439: "Address family\n"
! 7440: "Address Family modifier\n"
! 7441: "Address Family modifier\n"
! 7442: "Display only routes with non-natural netmasks\n")
! 7443: {
! 7444: if (strncmp (argv[0], "m", 1) == 0)
! 7445: return bgp_show (vty, NULL, AFI_IP, SAFI_MULTICAST,
! 7446: bgp_show_type_cidr_only, NULL);
! 7447:
! 7448: return bgp_show (vty, NULL, AFI_IP, SAFI_UNICAST,
! 7449: bgp_show_type_cidr_only, NULL);
! 7450: }
! 7451:
! 7452: DEFUN (show_ip_bgp_community_all,
! 7453: show_ip_bgp_community_all_cmd,
! 7454: "show ip bgp community",
! 7455: SHOW_STR
! 7456: IP_STR
! 7457: BGP_STR
! 7458: "Display routes matching the communities\n")
! 7459: {
! 7460: return bgp_show (vty, NULL, AFI_IP, SAFI_UNICAST,
! 7461: bgp_show_type_community_all, NULL);
! 7462: }
! 7463:
! 7464: DEFUN (show_ip_bgp_ipv4_community_all,
! 7465: show_ip_bgp_ipv4_community_all_cmd,
! 7466: "show ip bgp ipv4 (unicast|multicast) community",
! 7467: SHOW_STR
! 7468: IP_STR
! 7469: BGP_STR
! 7470: "Address family\n"
! 7471: "Address Family modifier\n"
! 7472: "Address Family modifier\n"
! 7473: "Display routes matching the communities\n")
! 7474: {
! 7475: if (strncmp (argv[0], "m", 1) == 0)
! 7476: return bgp_show (vty, NULL, AFI_IP, SAFI_MULTICAST,
! 7477: bgp_show_type_community_all, NULL);
! 7478:
! 7479: return bgp_show (vty, NULL, AFI_IP, SAFI_UNICAST,
! 7480: bgp_show_type_community_all, NULL);
! 7481: }
! 7482:
! 7483: #ifdef HAVE_IPV6
! 7484: DEFUN (show_bgp_community_all,
! 7485: show_bgp_community_all_cmd,
! 7486: "show bgp community",
! 7487: SHOW_STR
! 7488: BGP_STR
! 7489: "Display routes matching the communities\n")
! 7490: {
! 7491: return bgp_show (vty, NULL, AFI_IP6, SAFI_UNICAST,
! 7492: bgp_show_type_community_all, NULL);
! 7493: }
! 7494:
! 7495: ALIAS (show_bgp_community_all,
! 7496: show_bgp_ipv6_community_all_cmd,
! 7497: "show bgp ipv6 community",
! 7498: SHOW_STR
! 7499: BGP_STR
! 7500: "Address family\n"
! 7501: "Display routes matching the communities\n")
! 7502:
! 7503: /* old command */
! 7504: DEFUN (show_ipv6_bgp_community_all,
! 7505: show_ipv6_bgp_community_all_cmd,
! 7506: "show ipv6 bgp community",
! 7507: SHOW_STR
! 7508: IPV6_STR
! 7509: BGP_STR
! 7510: "Display routes matching the communities\n")
! 7511: {
! 7512: return bgp_show (vty, NULL, AFI_IP6, SAFI_UNICAST,
! 7513: bgp_show_type_community_all, NULL);
! 7514: }
! 7515:
! 7516: /* old command */
! 7517: DEFUN (show_ipv6_mbgp_community_all,
! 7518: show_ipv6_mbgp_community_all_cmd,
! 7519: "show ipv6 mbgp community",
! 7520: SHOW_STR
! 7521: IPV6_STR
! 7522: MBGP_STR
! 7523: "Display routes matching the communities\n")
! 7524: {
! 7525: return bgp_show (vty, NULL, AFI_IP6, SAFI_MULTICAST,
! 7526: bgp_show_type_community_all, NULL);
! 7527: }
! 7528: #endif /* HAVE_IPV6 */
! 7529:
! 7530: static int
! 7531: bgp_show_community (struct vty *vty, const char *view_name, int argc,
! 7532: const char **argv, int exact, afi_t afi, safi_t safi)
! 7533: {
! 7534: struct community *com;
! 7535: struct buffer *b;
! 7536: struct bgp *bgp;
! 7537: int i;
! 7538: char *str;
! 7539: int first = 0;
! 7540:
! 7541: /* BGP structure lookup */
! 7542: if (view_name)
! 7543: {
! 7544: bgp = bgp_lookup_by_name (view_name);
! 7545: if (bgp == NULL)
! 7546: {
! 7547: vty_out (vty, "Can't find BGP view %s%s", view_name, VTY_NEWLINE);
! 7548: return CMD_WARNING;
! 7549: }
! 7550: }
! 7551: else
! 7552: {
! 7553: bgp = bgp_get_default ();
! 7554: if (bgp == NULL)
! 7555: {
! 7556: vty_out (vty, "No BGP process is configured%s", VTY_NEWLINE);
! 7557: return CMD_WARNING;
! 7558: }
! 7559: }
! 7560:
! 7561: b = buffer_new (1024);
! 7562: for (i = 0; i < argc; i++)
! 7563: {
! 7564: if (first)
! 7565: buffer_putc (b, ' ');
! 7566: else
! 7567: {
! 7568: if ((strcmp (argv[i], "unicast") == 0) || (strcmp (argv[i], "multicast") == 0))
! 7569: continue;
! 7570: first = 1;
! 7571: }
! 7572:
! 7573: buffer_putstr (b, argv[i]);
! 7574: }
! 7575: buffer_putc (b, '\0');
! 7576:
! 7577: str = buffer_getstr (b);
! 7578: buffer_free (b);
! 7579:
! 7580: com = community_str2com (str);
! 7581: XFREE (MTYPE_TMP, str);
! 7582: if (! com)
! 7583: {
! 7584: vty_out (vty, "%% Community malformed: %s", VTY_NEWLINE);
! 7585: return CMD_WARNING;
! 7586: }
! 7587:
! 7588: return bgp_show (vty, bgp, afi, safi,
! 7589: (exact ? bgp_show_type_community_exact :
! 7590: bgp_show_type_community), com);
! 7591: }
! 7592:
! 7593: DEFUN (show_ip_bgp_community,
! 7594: show_ip_bgp_community_cmd,
! 7595: "show ip bgp community (AA:NN|local-AS|no-advertise|no-export)",
! 7596: SHOW_STR
! 7597: IP_STR
! 7598: BGP_STR
! 7599: "Display routes matching the communities\n"
! 7600: "community number\n"
! 7601: "Do not send outside local AS (well-known community)\n"
! 7602: "Do not advertise to any peer (well-known community)\n"
! 7603: "Do not export to next AS (well-known community)\n")
! 7604: {
! 7605: return bgp_show_community (vty, NULL, argc, argv, 0, AFI_IP, SAFI_UNICAST);
! 7606: }
! 7607:
! 7608: ALIAS (show_ip_bgp_community,
! 7609: show_ip_bgp_community2_cmd,
! 7610: "show ip bgp community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export)",
! 7611: SHOW_STR
! 7612: IP_STR
! 7613: BGP_STR
! 7614: "Display routes matching the communities\n"
! 7615: "community number\n"
! 7616: "Do not send outside local AS (well-known community)\n"
! 7617: "Do not advertise to any peer (well-known community)\n"
! 7618: "Do not export to next AS (well-known community)\n"
! 7619: "community number\n"
! 7620: "Do not send outside local AS (well-known community)\n"
! 7621: "Do not advertise to any peer (well-known community)\n"
! 7622: "Do not export to next AS (well-known community)\n")
! 7623:
! 7624: ALIAS (show_ip_bgp_community,
! 7625: show_ip_bgp_community3_cmd,
! 7626: "show ip bgp community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export)",
! 7627: SHOW_STR
! 7628: IP_STR
! 7629: BGP_STR
! 7630: "Display routes matching the communities\n"
! 7631: "community number\n"
! 7632: "Do not send outside local AS (well-known community)\n"
! 7633: "Do not advertise to any peer (well-known community)\n"
! 7634: "Do not export to next AS (well-known community)\n"
! 7635: "community number\n"
! 7636: "Do not send outside local AS (well-known community)\n"
! 7637: "Do not advertise to any peer (well-known community)\n"
! 7638: "Do not export to next AS (well-known community)\n"
! 7639: "community number\n"
! 7640: "Do not send outside local AS (well-known community)\n"
! 7641: "Do not advertise to any peer (well-known community)\n"
! 7642: "Do not export to next AS (well-known community)\n")
! 7643:
! 7644: ALIAS (show_ip_bgp_community,
! 7645: show_ip_bgp_community4_cmd,
! 7646: "show ip bgp community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export)",
! 7647: SHOW_STR
! 7648: IP_STR
! 7649: BGP_STR
! 7650: "Display routes matching the communities\n"
! 7651: "community number\n"
! 7652: "Do not send outside local AS (well-known community)\n"
! 7653: "Do not advertise to any peer (well-known community)\n"
! 7654: "Do not export to next AS (well-known community)\n"
! 7655: "community number\n"
! 7656: "Do not send outside local AS (well-known community)\n"
! 7657: "Do not advertise to any peer (well-known community)\n"
! 7658: "Do not export to next AS (well-known community)\n"
! 7659: "community number\n"
! 7660: "Do not send outside local AS (well-known community)\n"
! 7661: "Do not advertise to any peer (well-known community)\n"
! 7662: "Do not export to next AS (well-known community)\n"
! 7663: "community number\n"
! 7664: "Do not send outside local AS (well-known community)\n"
! 7665: "Do not advertise to any peer (well-known community)\n"
! 7666: "Do not export to next AS (well-known community)\n")
! 7667:
! 7668: DEFUN (show_ip_bgp_ipv4_community,
! 7669: show_ip_bgp_ipv4_community_cmd,
! 7670: "show ip bgp ipv4 (unicast|multicast) community (AA:NN|local-AS|no-advertise|no-export)",
! 7671: SHOW_STR
! 7672: IP_STR
! 7673: BGP_STR
! 7674: "Address family\n"
! 7675: "Address Family modifier\n"
! 7676: "Address Family modifier\n"
! 7677: "Display routes matching the communities\n"
! 7678: "community number\n"
! 7679: "Do not send outside local AS (well-known community)\n"
! 7680: "Do not advertise to any peer (well-known community)\n"
! 7681: "Do not export to next AS (well-known community)\n")
! 7682: {
! 7683: if (strncmp (argv[0], "m", 1) == 0)
! 7684: return bgp_show_community (vty, NULL, argc, argv, 0, AFI_IP, SAFI_MULTICAST);
! 7685:
! 7686: return bgp_show_community (vty, NULL, argc, argv, 0, AFI_IP, SAFI_UNICAST);
! 7687: }
! 7688:
! 7689: ALIAS (show_ip_bgp_ipv4_community,
! 7690: show_ip_bgp_ipv4_community2_cmd,
! 7691: "show ip bgp ipv4 (unicast|multicast) community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export)",
! 7692: SHOW_STR
! 7693: IP_STR
! 7694: BGP_STR
! 7695: "Address family\n"
! 7696: "Address Family modifier\n"
! 7697: "Address Family modifier\n"
! 7698: "Display routes matching the communities\n"
! 7699: "community number\n"
! 7700: "Do not send outside local AS (well-known community)\n"
! 7701: "Do not advertise to any peer (well-known community)\n"
! 7702: "Do not export to next AS (well-known community)\n"
! 7703: "community number\n"
! 7704: "Do not send outside local AS (well-known community)\n"
! 7705: "Do not advertise to any peer (well-known community)\n"
! 7706: "Do not export to next AS (well-known community)\n")
! 7707:
! 7708: ALIAS (show_ip_bgp_ipv4_community,
! 7709: show_ip_bgp_ipv4_community3_cmd,
! 7710: "show ip bgp ipv4 (unicast|multicast) community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export)",
! 7711: SHOW_STR
! 7712: IP_STR
! 7713: BGP_STR
! 7714: "Address family\n"
! 7715: "Address Family modifier\n"
! 7716: "Address Family modifier\n"
! 7717: "Display routes matching the communities\n"
! 7718: "community number\n"
! 7719: "Do not send outside local AS (well-known community)\n"
! 7720: "Do not advertise to any peer (well-known community)\n"
! 7721: "Do not export to next AS (well-known community)\n"
! 7722: "community number\n"
! 7723: "Do not send outside local AS (well-known community)\n"
! 7724: "Do not advertise to any peer (well-known community)\n"
! 7725: "Do not export to next AS (well-known community)\n"
! 7726: "community number\n"
! 7727: "Do not send outside local AS (well-known community)\n"
! 7728: "Do not advertise to any peer (well-known community)\n"
! 7729: "Do not export to next AS (well-known community)\n")
! 7730:
! 7731: ALIAS (show_ip_bgp_ipv4_community,
! 7732: show_ip_bgp_ipv4_community4_cmd,
! 7733: "show ip bgp ipv4 (unicast|multicast) community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export)",
! 7734: SHOW_STR
! 7735: IP_STR
! 7736: BGP_STR
! 7737: "Address family\n"
! 7738: "Address Family modifier\n"
! 7739: "Address Family modifier\n"
! 7740: "Display routes matching the communities\n"
! 7741: "community number\n"
! 7742: "Do not send outside local AS (well-known community)\n"
! 7743: "Do not advertise to any peer (well-known community)\n"
! 7744: "Do not export to next AS (well-known community)\n"
! 7745: "community number\n"
! 7746: "Do not send outside local AS (well-known community)\n"
! 7747: "Do not advertise to any peer (well-known community)\n"
! 7748: "Do not export to next AS (well-known community)\n"
! 7749: "community number\n"
! 7750: "Do not send outside local AS (well-known community)\n"
! 7751: "Do not advertise to any peer (well-known community)\n"
! 7752: "Do not export to next AS (well-known community)\n"
! 7753: "community number\n"
! 7754: "Do not send outside local AS (well-known community)\n"
! 7755: "Do not advertise to any peer (well-known community)\n"
! 7756: "Do not export to next AS (well-known community)\n")
! 7757:
! 7758: DEFUN (show_bgp_view_afi_safi_community_all,
! 7759: show_bgp_view_afi_safi_community_all_cmd,
! 7760: #ifdef HAVE_IPV6
! 7761: "show bgp view WORD (ipv4|ipv6) (unicast|multicast) community",
! 7762: #else
! 7763: "show bgp view WORD ipv4 (unicast|multicast) community",
! 7764: #endif
! 7765: SHOW_STR
! 7766: BGP_STR
! 7767: "BGP view\n"
! 7768: "BGP view name\n"
! 7769: "Address family\n"
! 7770: #ifdef HAVE_IPV6
! 7771: "Address family\n"
! 7772: #endif
! 7773: "Address Family modifier\n"
! 7774: "Address Family modifier\n"
! 7775: "Display routes containing communities\n")
! 7776: {
! 7777: int afi;
! 7778: int safi;
! 7779: struct bgp *bgp;
! 7780:
! 7781: /* BGP structure lookup. */
! 7782: bgp = bgp_lookup_by_name (argv[0]);
! 7783: if (bgp == NULL)
! 7784: {
! 7785: vty_out (vty, "Can't find BGP view %s%s", argv[0], VTY_NEWLINE);
! 7786: return CMD_WARNING;
! 7787: }
! 7788:
! 7789: #ifdef HAVE_IPV6
! 7790: afi = (strncmp (argv[1], "ipv6", 4) == 0) ? AFI_IP6 : AFI_IP;
! 7791: safi = (strncmp (argv[2], "m", 1) == 0) ? SAFI_MULTICAST : SAFI_UNICAST;
! 7792: #else
! 7793: afi = AFI_IP;
! 7794: safi = (strncmp (argv[1], "m", 1) == 0) ? SAFI_MULTICAST : SAFI_UNICAST;
! 7795: #endif
! 7796: return bgp_show (vty, bgp, afi, safi, bgp_show_type_community_all, NULL);
! 7797: }
! 7798:
! 7799: DEFUN (show_bgp_view_afi_safi_community,
! 7800: show_bgp_view_afi_safi_community_cmd,
! 7801: #ifdef HAVE_IPV6
! 7802: "show bgp view WORD (ipv4|ipv6) (unicast|multicast) community (AA:NN|local-AS|no-advertise|no-export)",
! 7803: #else
! 7804: "show bgp view WORD ipv4 (unicast|multicast) community (AA:NN|local-AS|no-advertise|no-export)",
! 7805: #endif
! 7806: SHOW_STR
! 7807: BGP_STR
! 7808: "BGP view\n"
! 7809: "BGP view name\n"
! 7810: "Address family\n"
! 7811: #ifdef HAVE_IPV6
! 7812: "Address family\n"
! 7813: #endif
! 7814: "Address family modifier\n"
! 7815: "Address family modifier\n"
! 7816: "Display routes matching the communities\n"
! 7817: "community number\n"
! 7818: "Do not send outside local AS (well-known community)\n"
! 7819: "Do not advertise to any peer (well-known community)\n"
! 7820: "Do not export to next AS (well-known community)\n")
! 7821: {
! 7822: int afi;
! 7823: int safi;
! 7824:
! 7825: #ifdef HAVE_IPV6
! 7826: afi = (strncmp (argv[1], "ipv6", 4) == 0) ? AFI_IP6 : AFI_IP;
! 7827: safi = (strncmp (argv[2], "m", 1) == 0) ? SAFI_MULTICAST : SAFI_UNICAST;
! 7828: return bgp_show_community (vty, argv[0], argc-3, &argv[3], 0, afi, safi);
! 7829: #else
! 7830: afi = AFI_IP;
! 7831: safi = (strncmp (argv[1], "m", 1) == 0) ? SAFI_MULTICAST : SAFI_UNICAST;
! 7832: return bgp_show_community (vty, argv[0], argc-2, &argv[2], 0, afi, safi);
! 7833: #endif
! 7834: }
! 7835:
! 7836: ALIAS (show_bgp_view_afi_safi_community,
! 7837: show_bgp_view_afi_safi_community2_cmd,
! 7838: #ifdef HAVE_IPV6
! 7839: "show bgp view WORD (ipv4|ipv6) (unicast|multicast) community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export)",
! 7840: #else
! 7841: "show bgp view WORD ipv4 (unicast|multicast) community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export)",
! 7842: #endif
! 7843: SHOW_STR
! 7844: BGP_STR
! 7845: "BGP view\n"
! 7846: "BGP view name\n"
! 7847: "Address family\n"
! 7848: #ifdef HAVE_IPV6
! 7849: "Address family\n"
! 7850: #endif
! 7851: "Address family modifier\n"
! 7852: "Address family modifier\n"
! 7853: "Display routes matching the communities\n"
! 7854: "community number\n"
! 7855: "Do not send outside local AS (well-known community)\n"
! 7856: "Do not advertise to any peer (well-known community)\n"
! 7857: "Do not export to next AS (well-known community)\n"
! 7858: "community number\n"
! 7859: "Do not send outside local AS (well-known community)\n"
! 7860: "Do not advertise to any peer (well-known community)\n"
! 7861: "Do not export to next AS (well-known community)\n")
! 7862:
! 7863: ALIAS (show_bgp_view_afi_safi_community,
! 7864: show_bgp_view_afi_safi_community3_cmd,
! 7865: #ifdef HAVE_IPV6
! 7866: "show bgp view WORD (ipv4|ipv6) (unicast|multicast) community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export)",
! 7867: #else
! 7868: "show bgp view WORD ipv4 (unicast|multicast) community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export)",
! 7869: #endif
! 7870: SHOW_STR
! 7871: BGP_STR
! 7872: "BGP view\n"
! 7873: "BGP view name\n"
! 7874: "Address family\n"
! 7875: #ifdef HAVE_IPV6
! 7876: "Address family\n"
! 7877: #endif
! 7878: "Address family modifier\n"
! 7879: "Address family modifier\n"
! 7880: "Display routes matching the communities\n"
! 7881: "community number\n"
! 7882: "Do not send outside local AS (well-known community)\n"
! 7883: "Do not advertise to any peer (well-known community)\n"
! 7884: "Do not export to next AS (well-known community)\n"
! 7885: "community number\n"
! 7886: "Do not send outside local AS (well-known community)\n"
! 7887: "Do not advertise to any peer (well-known community)\n"
! 7888: "Do not export to next AS (well-known community)\n"
! 7889: "community number\n"
! 7890: "Do not send outside local AS (well-known community)\n"
! 7891: "Do not advertise to any peer (well-known community)\n"
! 7892: "Do not export to next AS (well-known community)\n")
! 7893:
! 7894: ALIAS (show_bgp_view_afi_safi_community,
! 7895: show_bgp_view_afi_safi_community4_cmd,
! 7896: #ifdef HAVE_IPV6
! 7897: "show bgp view WORD (ipv4|ipv6) (unicast|multicast) community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export)",
! 7898: #else
! 7899: "show bgp view WORD ipv4 (unicast|multicast) community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export)",
! 7900: #endif
! 7901: SHOW_STR
! 7902: BGP_STR
! 7903: "BGP view\n"
! 7904: "BGP view name\n"
! 7905: "Address family\n"
! 7906: #ifdef HAVE_IPV6
! 7907: "Address family\n"
! 7908: #endif
! 7909: "Address family modifier\n"
! 7910: "Address family modifier\n"
! 7911: "Display routes matching the communities\n"
! 7912: "community number\n"
! 7913: "Do not send outside local AS (well-known community)\n"
! 7914: "Do not advertise to any peer (well-known community)\n"
! 7915: "Do not export to next AS (well-known community)\n"
! 7916: "community number\n"
! 7917: "Do not send outside local AS (well-known community)\n"
! 7918: "Do not advertise to any peer (well-known community)\n"
! 7919: "Do not export to next AS (well-known community)\n"
! 7920: "community number\n"
! 7921: "Do not send outside local AS (well-known community)\n"
! 7922: "Do not advertise to any peer (well-known community)\n"
! 7923: "Do not export to next AS (well-known community)\n"
! 7924: "community number\n"
! 7925: "Do not send outside local AS (well-known community)\n"
! 7926: "Do not advertise to any peer (well-known community)\n"
! 7927: "Do not export to next AS (well-known community)\n")
! 7928:
! 7929: DEFUN (show_ip_bgp_community_exact,
! 7930: show_ip_bgp_community_exact_cmd,
! 7931: "show ip bgp community (AA:NN|local-AS|no-advertise|no-export) exact-match",
! 7932: SHOW_STR
! 7933: IP_STR
! 7934: BGP_STR
! 7935: "Display routes matching the communities\n"
! 7936: "community number\n"
! 7937: "Do not send outside local AS (well-known community)\n"
! 7938: "Do not advertise to any peer (well-known community)\n"
! 7939: "Do not export to next AS (well-known community)\n"
! 7940: "Exact match of the communities")
! 7941: {
! 7942: return bgp_show_community (vty, NULL, argc, argv, 1, AFI_IP, SAFI_UNICAST);
! 7943: }
! 7944:
! 7945: ALIAS (show_ip_bgp_community_exact,
! 7946: show_ip_bgp_community2_exact_cmd,
! 7947: "show ip bgp community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) exact-match",
! 7948: SHOW_STR
! 7949: IP_STR
! 7950: BGP_STR
! 7951: "Display routes matching the communities\n"
! 7952: "community number\n"
! 7953: "Do not send outside local AS (well-known community)\n"
! 7954: "Do not advertise to any peer (well-known community)\n"
! 7955: "Do not export to next AS (well-known community)\n"
! 7956: "community number\n"
! 7957: "Do not send outside local AS (well-known community)\n"
! 7958: "Do not advertise to any peer (well-known community)\n"
! 7959: "Do not export to next AS (well-known community)\n"
! 7960: "Exact match of the communities")
! 7961:
! 7962: ALIAS (show_ip_bgp_community_exact,
! 7963: show_ip_bgp_community3_exact_cmd,
! 7964: "show ip bgp community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) exact-match",
! 7965: SHOW_STR
! 7966: IP_STR
! 7967: BGP_STR
! 7968: "Display routes matching the communities\n"
! 7969: "community number\n"
! 7970: "Do not send outside local AS (well-known community)\n"
! 7971: "Do not advertise to any peer (well-known community)\n"
! 7972: "Do not export to next AS (well-known community)\n"
! 7973: "community number\n"
! 7974: "Do not send outside local AS (well-known community)\n"
! 7975: "Do not advertise to any peer (well-known community)\n"
! 7976: "Do not export to next AS (well-known community)\n"
! 7977: "community number\n"
! 7978: "Do not send outside local AS (well-known community)\n"
! 7979: "Do not advertise to any peer (well-known community)\n"
! 7980: "Do not export to next AS (well-known community)\n"
! 7981: "Exact match of the communities")
! 7982:
! 7983: ALIAS (show_ip_bgp_community_exact,
! 7984: show_ip_bgp_community4_exact_cmd,
! 7985: "show ip bgp community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) exact-match",
! 7986: SHOW_STR
! 7987: IP_STR
! 7988: BGP_STR
! 7989: "Display routes matching the communities\n"
! 7990: "community number\n"
! 7991: "Do not send outside local AS (well-known community)\n"
! 7992: "Do not advertise to any peer (well-known community)\n"
! 7993: "Do not export to next AS (well-known community)\n"
! 7994: "community number\n"
! 7995: "Do not send outside local AS (well-known community)\n"
! 7996: "Do not advertise to any peer (well-known community)\n"
! 7997: "Do not export to next AS (well-known community)\n"
! 7998: "community number\n"
! 7999: "Do not send outside local AS (well-known community)\n"
! 8000: "Do not advertise to any peer (well-known community)\n"
! 8001: "Do not export to next AS (well-known community)\n"
! 8002: "community number\n"
! 8003: "Do not send outside local AS (well-known community)\n"
! 8004: "Do not advertise to any peer (well-known community)\n"
! 8005: "Do not export to next AS (well-known community)\n"
! 8006: "Exact match of the communities")
! 8007:
! 8008: DEFUN (show_ip_bgp_ipv4_community_exact,
! 8009: show_ip_bgp_ipv4_community_exact_cmd,
! 8010: "show ip bgp ipv4 (unicast|multicast) community (AA:NN|local-AS|no-advertise|no-export) exact-match",
! 8011: SHOW_STR
! 8012: IP_STR
! 8013: BGP_STR
! 8014: "Address family\n"
! 8015: "Address Family modifier\n"
! 8016: "Address Family modifier\n"
! 8017: "Display routes matching the communities\n"
! 8018: "community number\n"
! 8019: "Do not send outside local AS (well-known community)\n"
! 8020: "Do not advertise to any peer (well-known community)\n"
! 8021: "Do not export to next AS (well-known community)\n"
! 8022: "Exact match of the communities")
! 8023: {
! 8024: if (strncmp (argv[0], "m", 1) == 0)
! 8025: return bgp_show_community (vty, NULL, argc, argv, 1, AFI_IP, SAFI_MULTICAST);
! 8026:
! 8027: return bgp_show_community (vty, NULL, argc, argv, 1, AFI_IP, SAFI_UNICAST);
! 8028: }
! 8029:
! 8030: ALIAS (show_ip_bgp_ipv4_community_exact,
! 8031: show_ip_bgp_ipv4_community2_exact_cmd,
! 8032: "show ip bgp ipv4 (unicast|multicast) community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) exact-match",
! 8033: SHOW_STR
! 8034: IP_STR
! 8035: BGP_STR
! 8036: "Address family\n"
! 8037: "Address Family modifier\n"
! 8038: "Address Family modifier\n"
! 8039: "Display routes matching the communities\n"
! 8040: "community number\n"
! 8041: "Do not send outside local AS (well-known community)\n"
! 8042: "Do not advertise to any peer (well-known community)\n"
! 8043: "Do not export to next AS (well-known community)\n"
! 8044: "community number\n"
! 8045: "Do not send outside local AS (well-known community)\n"
! 8046: "Do not advertise to any peer (well-known community)\n"
! 8047: "Do not export to next AS (well-known community)\n"
! 8048: "Exact match of the communities")
! 8049:
! 8050: ALIAS (show_ip_bgp_ipv4_community_exact,
! 8051: show_ip_bgp_ipv4_community3_exact_cmd,
! 8052: "show ip bgp ipv4 (unicast|multicast) community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) exact-match",
! 8053: SHOW_STR
! 8054: IP_STR
! 8055: BGP_STR
! 8056: "Address family\n"
! 8057: "Address Family modifier\n"
! 8058: "Address Family modifier\n"
! 8059: "Display routes matching the communities\n"
! 8060: "community number\n"
! 8061: "Do not send outside local AS (well-known community)\n"
! 8062: "Do not advertise to any peer (well-known community)\n"
! 8063: "Do not export to next AS (well-known community)\n"
! 8064: "community number\n"
! 8065: "Do not send outside local AS (well-known community)\n"
! 8066: "Do not advertise to any peer (well-known community)\n"
! 8067: "Do not export to next AS (well-known community)\n"
! 8068: "community number\n"
! 8069: "Do not send outside local AS (well-known community)\n"
! 8070: "Do not advertise to any peer (well-known community)\n"
! 8071: "Do not export to next AS (well-known community)\n"
! 8072: "Exact match of the communities")
! 8073:
! 8074: ALIAS (show_ip_bgp_ipv4_community_exact,
! 8075: show_ip_bgp_ipv4_community4_exact_cmd,
! 8076: "show ip bgp ipv4 (unicast|multicast) community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) exact-match",
! 8077: SHOW_STR
! 8078: IP_STR
! 8079: BGP_STR
! 8080: "Address family\n"
! 8081: "Address Family modifier\n"
! 8082: "Address Family modifier\n"
! 8083: "Display routes matching the communities\n"
! 8084: "community number\n"
! 8085: "Do not send outside local AS (well-known community)\n"
! 8086: "Do not advertise to any peer (well-known community)\n"
! 8087: "Do not export to next AS (well-known community)\n"
! 8088: "community number\n"
! 8089: "Do not send outside local AS (well-known community)\n"
! 8090: "Do not advertise to any peer (well-known community)\n"
! 8091: "Do not export to next AS (well-known community)\n"
! 8092: "community number\n"
! 8093: "Do not send outside local AS (well-known community)\n"
! 8094: "Do not advertise to any peer (well-known community)\n"
! 8095: "Do not export to next AS (well-known community)\n"
! 8096: "community number\n"
! 8097: "Do not send outside local AS (well-known community)\n"
! 8098: "Do not advertise to any peer (well-known community)\n"
! 8099: "Do not export to next AS (well-known community)\n"
! 8100: "Exact match of the communities")
! 8101:
! 8102: #ifdef HAVE_IPV6
! 8103: DEFUN (show_bgp_community,
! 8104: show_bgp_community_cmd,
! 8105: "show bgp community (AA:NN|local-AS|no-advertise|no-export)",
! 8106: SHOW_STR
! 8107: BGP_STR
! 8108: "Display routes matching the communities\n"
! 8109: "community number\n"
! 8110: "Do not send outside local AS (well-known community)\n"
! 8111: "Do not advertise to any peer (well-known community)\n"
! 8112: "Do not export to next AS (well-known community)\n")
! 8113: {
! 8114: return bgp_show_community (vty, NULL, argc, argv, 0, AFI_IP6, SAFI_UNICAST);
! 8115: }
! 8116:
! 8117: ALIAS (show_bgp_community,
! 8118: show_bgp_ipv6_community_cmd,
! 8119: "show bgp ipv6 community (AA:NN|local-AS|no-advertise|no-export)",
! 8120: SHOW_STR
! 8121: BGP_STR
! 8122: "Address family\n"
! 8123: "Display routes matching the communities\n"
! 8124: "community number\n"
! 8125: "Do not send outside local AS (well-known community)\n"
! 8126: "Do not advertise to any peer (well-known community)\n"
! 8127: "Do not export to next AS (well-known community)\n")
! 8128:
! 8129: ALIAS (show_bgp_community,
! 8130: show_bgp_community2_cmd,
! 8131: "show bgp community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export)",
! 8132: SHOW_STR
! 8133: BGP_STR
! 8134: "Display routes matching the communities\n"
! 8135: "community number\n"
! 8136: "Do not send outside local AS (well-known community)\n"
! 8137: "Do not advertise to any peer (well-known community)\n"
! 8138: "Do not export to next AS (well-known community)\n"
! 8139: "community number\n"
! 8140: "Do not send outside local AS (well-known community)\n"
! 8141: "Do not advertise to any peer (well-known community)\n"
! 8142: "Do not export to next AS (well-known community)\n")
! 8143:
! 8144: ALIAS (show_bgp_community,
! 8145: show_bgp_ipv6_community2_cmd,
! 8146: "show bgp ipv6 community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export)",
! 8147: SHOW_STR
! 8148: BGP_STR
! 8149: "Address family\n"
! 8150: "Display routes matching the communities\n"
! 8151: "community number\n"
! 8152: "Do not send outside local AS (well-known community)\n"
! 8153: "Do not advertise to any peer (well-known community)\n"
! 8154: "Do not export to next AS (well-known community)\n"
! 8155: "community number\n"
! 8156: "Do not send outside local AS (well-known community)\n"
! 8157: "Do not advertise to any peer (well-known community)\n"
! 8158: "Do not export to next AS (well-known community)\n")
! 8159:
! 8160: ALIAS (show_bgp_community,
! 8161: show_bgp_community3_cmd,
! 8162: "show bgp community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export)",
! 8163: SHOW_STR
! 8164: BGP_STR
! 8165: "Display routes matching the communities\n"
! 8166: "community number\n"
! 8167: "Do not send outside local AS (well-known community)\n"
! 8168: "Do not advertise to any peer (well-known community)\n"
! 8169: "Do not export to next AS (well-known community)\n"
! 8170: "community number\n"
! 8171: "Do not send outside local AS (well-known community)\n"
! 8172: "Do not advertise to any peer (well-known community)\n"
! 8173: "Do not export to next AS (well-known community)\n"
! 8174: "community number\n"
! 8175: "Do not send outside local AS (well-known community)\n"
! 8176: "Do not advertise to any peer (well-known community)\n"
! 8177: "Do not export to next AS (well-known community)\n")
! 8178:
! 8179: ALIAS (show_bgp_community,
! 8180: show_bgp_ipv6_community3_cmd,
! 8181: "show bgp ipv6 community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export)",
! 8182: SHOW_STR
! 8183: BGP_STR
! 8184: "Address family\n"
! 8185: "Display routes matching the communities\n"
! 8186: "community number\n"
! 8187: "Do not send outside local AS (well-known community)\n"
! 8188: "Do not advertise to any peer (well-known community)\n"
! 8189: "Do not export to next AS (well-known community)\n"
! 8190: "community number\n"
! 8191: "Do not send outside local AS (well-known community)\n"
! 8192: "Do not advertise to any peer (well-known community)\n"
! 8193: "Do not export to next AS (well-known community)\n"
! 8194: "community number\n"
! 8195: "Do not send outside local AS (well-known community)\n"
! 8196: "Do not advertise to any peer (well-known community)\n"
! 8197: "Do not export to next AS (well-known community)\n")
! 8198:
! 8199: ALIAS (show_bgp_community,
! 8200: show_bgp_community4_cmd,
! 8201: "show bgp community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export)",
! 8202: SHOW_STR
! 8203: BGP_STR
! 8204: "Display routes matching the communities\n"
! 8205: "community number\n"
! 8206: "Do not send outside local AS (well-known community)\n"
! 8207: "Do not advertise to any peer (well-known community)\n"
! 8208: "Do not export to next AS (well-known community)\n"
! 8209: "community number\n"
! 8210: "Do not send outside local AS (well-known community)\n"
! 8211: "Do not advertise to any peer (well-known community)\n"
! 8212: "Do not export to next AS (well-known community)\n"
! 8213: "community number\n"
! 8214: "Do not send outside local AS (well-known community)\n"
! 8215: "Do not advertise to any peer (well-known community)\n"
! 8216: "Do not export to next AS (well-known community)\n"
! 8217: "community number\n"
! 8218: "Do not send outside local AS (well-known community)\n"
! 8219: "Do not advertise to any peer (well-known community)\n"
! 8220: "Do not export to next AS (well-known community)\n")
! 8221:
! 8222: ALIAS (show_bgp_community,
! 8223: show_bgp_ipv6_community4_cmd,
! 8224: "show bgp ipv6 community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export)",
! 8225: SHOW_STR
! 8226: BGP_STR
! 8227: "Address family\n"
! 8228: "Display routes matching the communities\n"
! 8229: "community number\n"
! 8230: "Do not send outside local AS (well-known community)\n"
! 8231: "Do not advertise to any peer (well-known community)\n"
! 8232: "Do not export to next AS (well-known community)\n"
! 8233: "community number\n"
! 8234: "Do not send outside local AS (well-known community)\n"
! 8235: "Do not advertise to any peer (well-known community)\n"
! 8236: "Do not export to next AS (well-known community)\n"
! 8237: "community number\n"
! 8238: "Do not send outside local AS (well-known community)\n"
! 8239: "Do not advertise to any peer (well-known community)\n"
! 8240: "Do not export to next AS (well-known community)\n"
! 8241: "community number\n"
! 8242: "Do not send outside local AS (well-known community)\n"
! 8243: "Do not advertise to any peer (well-known community)\n"
! 8244: "Do not export to next AS (well-known community)\n")
! 8245:
! 8246: /* old command */
! 8247: DEFUN (show_ipv6_bgp_community,
! 8248: show_ipv6_bgp_community_cmd,
! 8249: "show ipv6 bgp community (AA:NN|local-AS|no-advertise|no-export)",
! 8250: SHOW_STR
! 8251: IPV6_STR
! 8252: BGP_STR
! 8253: "Display routes matching the communities\n"
! 8254: "community number\n"
! 8255: "Do not send outside local AS (well-known community)\n"
! 8256: "Do not advertise to any peer (well-known community)\n"
! 8257: "Do not export to next AS (well-known community)\n")
! 8258: {
! 8259: return bgp_show_community (vty, NULL, argc, argv, 0, AFI_IP6, SAFI_UNICAST);
! 8260: }
! 8261:
! 8262: /* old command */
! 8263: ALIAS (show_ipv6_bgp_community,
! 8264: show_ipv6_bgp_community2_cmd,
! 8265: "show ipv6 bgp community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export)",
! 8266: SHOW_STR
! 8267: IPV6_STR
! 8268: BGP_STR
! 8269: "Display routes matching the communities\n"
! 8270: "community number\n"
! 8271: "Do not send outside local AS (well-known community)\n"
! 8272: "Do not advertise to any peer (well-known community)\n"
! 8273: "Do not export to next AS (well-known community)\n"
! 8274: "community number\n"
! 8275: "Do not send outside local AS (well-known community)\n"
! 8276: "Do not advertise to any peer (well-known community)\n"
! 8277: "Do not export to next AS (well-known community)\n")
! 8278:
! 8279: /* old command */
! 8280: ALIAS (show_ipv6_bgp_community,
! 8281: show_ipv6_bgp_community3_cmd,
! 8282: "show ipv6 bgp community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export)",
! 8283: SHOW_STR
! 8284: IPV6_STR
! 8285: BGP_STR
! 8286: "Display routes matching the communities\n"
! 8287: "community number\n"
! 8288: "Do not send outside local AS (well-known community)\n"
! 8289: "Do not advertise to any peer (well-known community)\n"
! 8290: "Do not export to next AS (well-known community)\n"
! 8291: "community number\n"
! 8292: "Do not send outside local AS (well-known community)\n"
! 8293: "Do not advertise to any peer (well-known community)\n"
! 8294: "Do not export to next AS (well-known community)\n"
! 8295: "community number\n"
! 8296: "Do not send outside local AS (well-known community)\n"
! 8297: "Do not advertise to any peer (well-known community)\n"
! 8298: "Do not export to next AS (well-known community)\n")
! 8299:
! 8300: /* old command */
! 8301: ALIAS (show_ipv6_bgp_community,
! 8302: show_ipv6_bgp_community4_cmd,
! 8303: "show ipv6 bgp community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export)",
! 8304: SHOW_STR
! 8305: IPV6_STR
! 8306: BGP_STR
! 8307: "Display routes matching the communities\n"
! 8308: "community number\n"
! 8309: "Do not send outside local AS (well-known community)\n"
! 8310: "Do not advertise to any peer (well-known community)\n"
! 8311: "Do not export to next AS (well-known community)\n"
! 8312: "community number\n"
! 8313: "Do not send outside local AS (well-known community)\n"
! 8314: "Do not advertise to any peer (well-known community)\n"
! 8315: "Do not export to next AS (well-known community)\n"
! 8316: "community number\n"
! 8317: "Do not send outside local AS (well-known community)\n"
! 8318: "Do not advertise to any peer (well-known community)\n"
! 8319: "Do not export to next AS (well-known community)\n"
! 8320: "community number\n"
! 8321: "Do not send outside local AS (well-known community)\n"
! 8322: "Do not advertise to any peer (well-known community)\n"
! 8323: "Do not export to next AS (well-known community)\n")
! 8324:
! 8325: DEFUN (show_bgp_community_exact,
! 8326: show_bgp_community_exact_cmd,
! 8327: "show bgp community (AA:NN|local-AS|no-advertise|no-export) exact-match",
! 8328: SHOW_STR
! 8329: BGP_STR
! 8330: "Display routes matching the communities\n"
! 8331: "community number\n"
! 8332: "Do not send outside local AS (well-known community)\n"
! 8333: "Do not advertise to any peer (well-known community)\n"
! 8334: "Do not export to next AS (well-known community)\n"
! 8335: "Exact match of the communities")
! 8336: {
! 8337: return bgp_show_community (vty, NULL, argc, argv, 1, AFI_IP6, SAFI_UNICAST);
! 8338: }
! 8339:
! 8340: ALIAS (show_bgp_community_exact,
! 8341: show_bgp_ipv6_community_exact_cmd,
! 8342: "show bgp ipv6 community (AA:NN|local-AS|no-advertise|no-export) exact-match",
! 8343: SHOW_STR
! 8344: BGP_STR
! 8345: "Address family\n"
! 8346: "Display routes matching the communities\n"
! 8347: "community number\n"
! 8348: "Do not send outside local AS (well-known community)\n"
! 8349: "Do not advertise to any peer (well-known community)\n"
! 8350: "Do not export to next AS (well-known community)\n"
! 8351: "Exact match of the communities")
! 8352:
! 8353: ALIAS (show_bgp_community_exact,
! 8354: show_bgp_community2_exact_cmd,
! 8355: "show bgp community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) exact-match",
! 8356: SHOW_STR
! 8357: BGP_STR
! 8358: "Display routes matching the communities\n"
! 8359: "community number\n"
! 8360: "Do not send outside local AS (well-known community)\n"
! 8361: "Do not advertise to any peer (well-known community)\n"
! 8362: "Do not export to next AS (well-known community)\n"
! 8363: "community number\n"
! 8364: "Do not send outside local AS (well-known community)\n"
! 8365: "Do not advertise to any peer (well-known community)\n"
! 8366: "Do not export to next AS (well-known community)\n"
! 8367: "Exact match of the communities")
! 8368:
! 8369: ALIAS (show_bgp_community_exact,
! 8370: show_bgp_ipv6_community2_exact_cmd,
! 8371: "show bgp ipv6 community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) exact-match",
! 8372: SHOW_STR
! 8373: BGP_STR
! 8374: "Address family\n"
! 8375: "Display routes matching the communities\n"
! 8376: "community number\n"
! 8377: "Do not send outside local AS (well-known community)\n"
! 8378: "Do not advertise to any peer (well-known community)\n"
! 8379: "Do not export to next AS (well-known community)\n"
! 8380: "community number\n"
! 8381: "Do not send outside local AS (well-known community)\n"
! 8382: "Do not advertise to any peer (well-known community)\n"
! 8383: "Do not export to next AS (well-known community)\n"
! 8384: "Exact match of the communities")
! 8385:
! 8386: ALIAS (show_bgp_community_exact,
! 8387: show_bgp_community3_exact_cmd,
! 8388: "show bgp community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) exact-match",
! 8389: SHOW_STR
! 8390: BGP_STR
! 8391: "Display routes matching the communities\n"
! 8392: "community number\n"
! 8393: "Do not send outside local AS (well-known community)\n"
! 8394: "Do not advertise to any peer (well-known community)\n"
! 8395: "Do not export to next AS (well-known community)\n"
! 8396: "community number\n"
! 8397: "Do not send outside local AS (well-known community)\n"
! 8398: "Do not advertise to any peer (well-known community)\n"
! 8399: "Do not export to next AS (well-known community)\n"
! 8400: "community number\n"
! 8401: "Do not send outside local AS (well-known community)\n"
! 8402: "Do not advertise to any peer (well-known community)\n"
! 8403: "Do not export to next AS (well-known community)\n"
! 8404: "Exact match of the communities")
! 8405:
! 8406: ALIAS (show_bgp_community_exact,
! 8407: show_bgp_ipv6_community3_exact_cmd,
! 8408: "show bgp ipv6 community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) exact-match",
! 8409: SHOW_STR
! 8410: BGP_STR
! 8411: "Address family\n"
! 8412: "Display routes matching the communities\n"
! 8413: "community number\n"
! 8414: "Do not send outside local AS (well-known community)\n"
! 8415: "Do not advertise to any peer (well-known community)\n"
! 8416: "Do not export to next AS (well-known community)\n"
! 8417: "community number\n"
! 8418: "Do not send outside local AS (well-known community)\n"
! 8419: "Do not advertise to any peer (well-known community)\n"
! 8420: "Do not export to next AS (well-known community)\n"
! 8421: "community number\n"
! 8422: "Do not send outside local AS (well-known community)\n"
! 8423: "Do not advertise to any peer (well-known community)\n"
! 8424: "Do not export to next AS (well-known community)\n"
! 8425: "Exact match of the communities")
! 8426:
! 8427: ALIAS (show_bgp_community_exact,
! 8428: show_bgp_community4_exact_cmd,
! 8429: "show bgp community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) exact-match",
! 8430: SHOW_STR
! 8431: BGP_STR
! 8432: "Display routes matching the communities\n"
! 8433: "community number\n"
! 8434: "Do not send outside local AS (well-known community)\n"
! 8435: "Do not advertise to any peer (well-known community)\n"
! 8436: "Do not export to next AS (well-known community)\n"
! 8437: "community number\n"
! 8438: "Do not send outside local AS (well-known community)\n"
! 8439: "Do not advertise to any peer (well-known community)\n"
! 8440: "Do not export to next AS (well-known community)\n"
! 8441: "community number\n"
! 8442: "Do not send outside local AS (well-known community)\n"
! 8443: "Do not advertise to any peer (well-known community)\n"
! 8444: "Do not export to next AS (well-known community)\n"
! 8445: "community number\n"
! 8446: "Do not send outside local AS (well-known community)\n"
! 8447: "Do not advertise to any peer (well-known community)\n"
! 8448: "Do not export to next AS (well-known community)\n"
! 8449: "Exact match of the communities")
! 8450:
! 8451: ALIAS (show_bgp_community_exact,
! 8452: show_bgp_ipv6_community4_exact_cmd,
! 8453: "show bgp ipv6 community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) exact-match",
! 8454: SHOW_STR
! 8455: BGP_STR
! 8456: "Address family\n"
! 8457: "Display routes matching the communities\n"
! 8458: "community number\n"
! 8459: "Do not send outside local AS (well-known community)\n"
! 8460: "Do not advertise to any peer (well-known community)\n"
! 8461: "Do not export to next AS (well-known community)\n"
! 8462: "community number\n"
! 8463: "Do not send outside local AS (well-known community)\n"
! 8464: "Do not advertise to any peer (well-known community)\n"
! 8465: "Do not export to next AS (well-known community)\n"
! 8466: "community number\n"
! 8467: "Do not send outside local AS (well-known community)\n"
! 8468: "Do not advertise to any peer (well-known community)\n"
! 8469: "Do not export to next AS (well-known community)\n"
! 8470: "community number\n"
! 8471: "Do not send outside local AS (well-known community)\n"
! 8472: "Do not advertise to any peer (well-known community)\n"
! 8473: "Do not export to next AS (well-known community)\n"
! 8474: "Exact match of the communities")
! 8475:
! 8476: /* old command */
! 8477: DEFUN (show_ipv6_bgp_community_exact,
! 8478: show_ipv6_bgp_community_exact_cmd,
! 8479: "show ipv6 bgp community (AA:NN|local-AS|no-advertise|no-export) exact-match",
! 8480: SHOW_STR
! 8481: IPV6_STR
! 8482: BGP_STR
! 8483: "Display routes matching the communities\n"
! 8484: "community number\n"
! 8485: "Do not send outside local AS (well-known community)\n"
! 8486: "Do not advertise to any peer (well-known community)\n"
! 8487: "Do not export to next AS (well-known community)\n"
! 8488: "Exact match of the communities")
! 8489: {
! 8490: return bgp_show_community (vty, NULL, argc, argv, 1, AFI_IP6, SAFI_UNICAST);
! 8491: }
! 8492:
! 8493: /* old command */
! 8494: ALIAS (show_ipv6_bgp_community_exact,
! 8495: show_ipv6_bgp_community2_exact_cmd,
! 8496: "show ipv6 bgp community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) exact-match",
! 8497: SHOW_STR
! 8498: IPV6_STR
! 8499: BGP_STR
! 8500: "Display routes matching the communities\n"
! 8501: "community number\n"
! 8502: "Do not send outside local AS (well-known community)\n"
! 8503: "Do not advertise to any peer (well-known community)\n"
! 8504: "Do not export to next AS (well-known community)\n"
! 8505: "community number\n"
! 8506: "Do not send outside local AS (well-known community)\n"
! 8507: "Do not advertise to any peer (well-known community)\n"
! 8508: "Do not export to next AS (well-known community)\n"
! 8509: "Exact match of the communities")
! 8510:
! 8511: /* old command */
! 8512: ALIAS (show_ipv6_bgp_community_exact,
! 8513: show_ipv6_bgp_community3_exact_cmd,
! 8514: "show ipv6 bgp community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) exact-match",
! 8515: SHOW_STR
! 8516: IPV6_STR
! 8517: BGP_STR
! 8518: "Display routes matching the communities\n"
! 8519: "community number\n"
! 8520: "Do not send outside local AS (well-known community)\n"
! 8521: "Do not advertise to any peer (well-known community)\n"
! 8522: "Do not export to next AS (well-known community)\n"
! 8523: "community number\n"
! 8524: "Do not send outside local AS (well-known community)\n"
! 8525: "Do not advertise to any peer (well-known community)\n"
! 8526: "Do not export to next AS (well-known community)\n"
! 8527: "community number\n"
! 8528: "Do not send outside local AS (well-known community)\n"
! 8529: "Do not advertise to any peer (well-known community)\n"
! 8530: "Do not export to next AS (well-known community)\n"
! 8531: "Exact match of the communities")
! 8532:
! 8533: /* old command */
! 8534: ALIAS (show_ipv6_bgp_community_exact,
! 8535: show_ipv6_bgp_community4_exact_cmd,
! 8536: "show ipv6 bgp community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) exact-match",
! 8537: SHOW_STR
! 8538: IPV6_STR
! 8539: BGP_STR
! 8540: "Display routes matching the communities\n"
! 8541: "community number\n"
! 8542: "Do not send outside local AS (well-known community)\n"
! 8543: "Do not advertise to any peer (well-known community)\n"
! 8544: "Do not export to next AS (well-known community)\n"
! 8545: "community number\n"
! 8546: "Do not send outside local AS (well-known community)\n"
! 8547: "Do not advertise to any peer (well-known community)\n"
! 8548: "Do not export to next AS (well-known community)\n"
! 8549: "community number\n"
! 8550: "Do not send outside local AS (well-known community)\n"
! 8551: "Do not advertise to any peer (well-known community)\n"
! 8552: "Do not export to next AS (well-known community)\n"
! 8553: "community number\n"
! 8554: "Do not send outside local AS (well-known community)\n"
! 8555: "Do not advertise to any peer (well-known community)\n"
! 8556: "Do not export to next AS (well-known community)\n"
! 8557: "Exact match of the communities")
! 8558:
! 8559: /* old command */
! 8560: DEFUN (show_ipv6_mbgp_community,
! 8561: show_ipv6_mbgp_community_cmd,
! 8562: "show ipv6 mbgp community (AA:NN|local-AS|no-advertise|no-export)",
! 8563: SHOW_STR
! 8564: IPV6_STR
! 8565: MBGP_STR
! 8566: "Display routes matching the communities\n"
! 8567: "community number\n"
! 8568: "Do not send outside local AS (well-known community)\n"
! 8569: "Do not advertise to any peer (well-known community)\n"
! 8570: "Do not export to next AS (well-known community)\n")
! 8571: {
! 8572: return bgp_show_community (vty, NULL, argc, argv, 0, AFI_IP6, SAFI_MULTICAST);
! 8573: }
! 8574:
! 8575: /* old command */
! 8576: ALIAS (show_ipv6_mbgp_community,
! 8577: show_ipv6_mbgp_community2_cmd,
! 8578: "show ipv6 mbgp community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export)",
! 8579: SHOW_STR
! 8580: IPV6_STR
! 8581: MBGP_STR
! 8582: "Display routes matching the communities\n"
! 8583: "community number\n"
! 8584: "Do not send outside local AS (well-known community)\n"
! 8585: "Do not advertise to any peer (well-known community)\n"
! 8586: "Do not export to next AS (well-known community)\n"
! 8587: "community number\n"
! 8588: "Do not send outside local AS (well-known community)\n"
! 8589: "Do not advertise to any peer (well-known community)\n"
! 8590: "Do not export to next AS (well-known community)\n")
! 8591:
! 8592: /* old command */
! 8593: ALIAS (show_ipv6_mbgp_community,
! 8594: show_ipv6_mbgp_community3_cmd,
! 8595: "show ipv6 mbgp community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export)",
! 8596: SHOW_STR
! 8597: IPV6_STR
! 8598: MBGP_STR
! 8599: "Display routes matching the communities\n"
! 8600: "community number\n"
! 8601: "Do not send outside local AS (well-known community)\n"
! 8602: "Do not advertise to any peer (well-known community)\n"
! 8603: "Do not export to next AS (well-known community)\n"
! 8604: "community number\n"
! 8605: "Do not send outside local AS (well-known community)\n"
! 8606: "Do not advertise to any peer (well-known community)\n"
! 8607: "Do not export to next AS (well-known community)\n"
! 8608: "community number\n"
! 8609: "Do not send outside local AS (well-known community)\n"
! 8610: "Do not advertise to any peer (well-known community)\n"
! 8611: "Do not export to next AS (well-known community)\n")
! 8612:
! 8613: /* old command */
! 8614: ALIAS (show_ipv6_mbgp_community,
! 8615: show_ipv6_mbgp_community4_cmd,
! 8616: "show ipv6 mbgp community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export)",
! 8617: SHOW_STR
! 8618: IPV6_STR
! 8619: MBGP_STR
! 8620: "Display routes matching the communities\n"
! 8621: "community number\n"
! 8622: "Do not send outside local AS (well-known community)\n"
! 8623: "Do not advertise to any peer (well-known community)\n"
! 8624: "Do not export to next AS (well-known community)\n"
! 8625: "community number\n"
! 8626: "Do not send outside local AS (well-known community)\n"
! 8627: "Do not advertise to any peer (well-known community)\n"
! 8628: "Do not export to next AS (well-known community)\n"
! 8629: "community number\n"
! 8630: "Do not send outside local AS (well-known community)\n"
! 8631: "Do not advertise to any peer (well-known community)\n"
! 8632: "Do not export to next AS (well-known community)\n"
! 8633: "community number\n"
! 8634: "Do not send outside local AS (well-known community)\n"
! 8635: "Do not advertise to any peer (well-known community)\n"
! 8636: "Do not export to next AS (well-known community)\n")
! 8637:
! 8638: /* old command */
! 8639: DEFUN (show_ipv6_mbgp_community_exact,
! 8640: show_ipv6_mbgp_community_exact_cmd,
! 8641: "show ipv6 mbgp community (AA:NN|local-AS|no-advertise|no-export) exact-match",
! 8642: SHOW_STR
! 8643: IPV6_STR
! 8644: MBGP_STR
! 8645: "Display routes matching the communities\n"
! 8646: "community number\n"
! 8647: "Do not send outside local AS (well-known community)\n"
! 8648: "Do not advertise to any peer (well-known community)\n"
! 8649: "Do not export to next AS (well-known community)\n"
! 8650: "Exact match of the communities")
! 8651: {
! 8652: return bgp_show_community (vty, NULL, argc, argv, 1, AFI_IP6, SAFI_MULTICAST);
! 8653: }
! 8654:
! 8655: /* old command */
! 8656: ALIAS (show_ipv6_mbgp_community_exact,
! 8657: show_ipv6_mbgp_community2_exact_cmd,
! 8658: "show ipv6 mbgp community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) exact-match",
! 8659: SHOW_STR
! 8660: IPV6_STR
! 8661: MBGP_STR
! 8662: "Display routes matching the communities\n"
! 8663: "community number\n"
! 8664: "Do not send outside local AS (well-known community)\n"
! 8665: "Do not advertise to any peer (well-known community)\n"
! 8666: "Do not export to next AS (well-known community)\n"
! 8667: "community number\n"
! 8668: "Do not send outside local AS (well-known community)\n"
! 8669: "Do not advertise to any peer (well-known community)\n"
! 8670: "Do not export to next AS (well-known community)\n"
! 8671: "Exact match of the communities")
! 8672:
! 8673: /* old command */
! 8674: ALIAS (show_ipv6_mbgp_community_exact,
! 8675: show_ipv6_mbgp_community3_exact_cmd,
! 8676: "show ipv6 mbgp community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) exact-match",
! 8677: SHOW_STR
! 8678: IPV6_STR
! 8679: MBGP_STR
! 8680: "Display routes matching the communities\n"
! 8681: "community number\n"
! 8682: "Do not send outside local AS (well-known community)\n"
! 8683: "Do not advertise to any peer (well-known community)\n"
! 8684: "Do not export to next AS (well-known community)\n"
! 8685: "community number\n"
! 8686: "Do not send outside local AS (well-known community)\n"
! 8687: "Do not advertise to any peer (well-known community)\n"
! 8688: "Do not export to next AS (well-known community)\n"
! 8689: "community number\n"
! 8690: "Do not send outside local AS (well-known community)\n"
! 8691: "Do not advertise to any peer (well-known community)\n"
! 8692: "Do not export to next AS (well-known community)\n"
! 8693: "Exact match of the communities")
! 8694:
! 8695: /* old command */
! 8696: ALIAS (show_ipv6_mbgp_community_exact,
! 8697: show_ipv6_mbgp_community4_exact_cmd,
! 8698: "show ipv6 mbgp community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) exact-match",
! 8699: SHOW_STR
! 8700: IPV6_STR
! 8701: MBGP_STR
! 8702: "Display routes matching the communities\n"
! 8703: "community number\n"
! 8704: "Do not send outside local AS (well-known community)\n"
! 8705: "Do not advertise to any peer (well-known community)\n"
! 8706: "Do not export to next AS (well-known community)\n"
! 8707: "community number\n"
! 8708: "Do not send outside local AS (well-known community)\n"
! 8709: "Do not advertise to any peer (well-known community)\n"
! 8710: "Do not export to next AS (well-known community)\n"
! 8711: "community number\n"
! 8712: "Do not send outside local AS (well-known community)\n"
! 8713: "Do not advertise to any peer (well-known community)\n"
! 8714: "Do not export to next AS (well-known community)\n"
! 8715: "community number\n"
! 8716: "Do not send outside local AS (well-known community)\n"
! 8717: "Do not advertise to any peer (well-known community)\n"
! 8718: "Do not export to next AS (well-known community)\n"
! 8719: "Exact match of the communities")
! 8720: #endif /* HAVE_IPV6 */
! 8721:
! 8722: static int
! 8723: bgp_show_community_list (struct vty *vty, const char *com, int exact,
! 8724: afi_t afi, safi_t safi)
! 8725: {
! 8726: struct community_list *list;
! 8727:
! 8728: list = community_list_lookup (bgp_clist, com, COMMUNITY_LIST_MASTER);
! 8729: if (list == NULL)
! 8730: {
! 8731: vty_out (vty, "%% %s is not a valid community-list name%s", com,
! 8732: VTY_NEWLINE);
! 8733: return CMD_WARNING;
! 8734: }
! 8735:
! 8736: return bgp_show (vty, NULL, afi, safi,
! 8737: (exact ? bgp_show_type_community_list_exact :
! 8738: bgp_show_type_community_list), list);
! 8739: }
! 8740:
! 8741: DEFUN (show_ip_bgp_community_list,
! 8742: show_ip_bgp_community_list_cmd,
! 8743: "show ip bgp community-list (<1-500>|WORD)",
! 8744: SHOW_STR
! 8745: IP_STR
! 8746: BGP_STR
! 8747: "Display routes matching the community-list\n"
! 8748: "community-list number\n"
! 8749: "community-list name\n")
! 8750: {
! 8751: return bgp_show_community_list (vty, argv[0], 0, AFI_IP, SAFI_UNICAST);
! 8752: }
! 8753:
! 8754: DEFUN (show_ip_bgp_ipv4_community_list,
! 8755: show_ip_bgp_ipv4_community_list_cmd,
! 8756: "show ip bgp ipv4 (unicast|multicast) community-list (<1-500>|WORD)",
! 8757: SHOW_STR
! 8758: IP_STR
! 8759: BGP_STR
! 8760: "Address family\n"
! 8761: "Address Family modifier\n"
! 8762: "Address Family modifier\n"
! 8763: "Display routes matching the community-list\n"
! 8764: "community-list number\n"
! 8765: "community-list name\n")
! 8766: {
! 8767: if (strncmp (argv[0], "m", 1) == 0)
! 8768: return bgp_show_community_list (vty, argv[1], 0, AFI_IP, SAFI_MULTICAST);
! 8769:
! 8770: return bgp_show_community_list (vty, argv[1], 0, AFI_IP, SAFI_UNICAST);
! 8771: }
! 8772:
! 8773: DEFUN (show_ip_bgp_community_list_exact,
! 8774: show_ip_bgp_community_list_exact_cmd,
! 8775: "show ip bgp community-list (<1-500>|WORD) exact-match",
! 8776: SHOW_STR
! 8777: IP_STR
! 8778: BGP_STR
! 8779: "Display routes matching the community-list\n"
! 8780: "community-list number\n"
! 8781: "community-list name\n"
! 8782: "Exact match of the communities\n")
! 8783: {
! 8784: return bgp_show_community_list (vty, argv[0], 1, AFI_IP, SAFI_UNICAST);
! 8785: }
! 8786:
! 8787: DEFUN (show_ip_bgp_ipv4_community_list_exact,
! 8788: show_ip_bgp_ipv4_community_list_exact_cmd,
! 8789: "show ip bgp ipv4 (unicast|multicast) community-list (<1-500>|WORD) exact-match",
! 8790: SHOW_STR
! 8791: IP_STR
! 8792: BGP_STR
! 8793: "Address family\n"
! 8794: "Address Family modifier\n"
! 8795: "Address Family modifier\n"
! 8796: "Display routes matching the community-list\n"
! 8797: "community-list number\n"
! 8798: "community-list name\n"
! 8799: "Exact match of the communities\n")
! 8800: {
! 8801: if (strncmp (argv[0], "m", 1) == 0)
! 8802: return bgp_show_community_list (vty, argv[1], 1, AFI_IP, SAFI_MULTICAST);
! 8803:
! 8804: return bgp_show_community_list (vty, argv[1], 1, AFI_IP, SAFI_UNICAST);
! 8805: }
! 8806:
! 8807: #ifdef HAVE_IPV6
! 8808: DEFUN (show_bgp_community_list,
! 8809: show_bgp_community_list_cmd,
! 8810: "show bgp community-list (<1-500>|WORD)",
! 8811: SHOW_STR
! 8812: BGP_STR
! 8813: "Display routes matching the community-list\n"
! 8814: "community-list number\n"
! 8815: "community-list name\n")
! 8816: {
! 8817: return bgp_show_community_list (vty, argv[0], 0, AFI_IP6, SAFI_UNICAST);
! 8818: }
! 8819:
! 8820: ALIAS (show_bgp_community_list,
! 8821: show_bgp_ipv6_community_list_cmd,
! 8822: "show bgp ipv6 community-list (<1-500>|WORD)",
! 8823: SHOW_STR
! 8824: BGP_STR
! 8825: "Address family\n"
! 8826: "Display routes matching the community-list\n"
! 8827: "community-list number\n"
! 8828: "community-list name\n")
! 8829:
! 8830: /* old command */
! 8831: DEFUN (show_ipv6_bgp_community_list,
! 8832: show_ipv6_bgp_community_list_cmd,
! 8833: "show ipv6 bgp community-list WORD",
! 8834: SHOW_STR
! 8835: IPV6_STR
! 8836: BGP_STR
! 8837: "Display routes matching the community-list\n"
! 8838: "community-list name\n")
! 8839: {
! 8840: return bgp_show_community_list (vty, argv[0], 0, AFI_IP6, SAFI_UNICAST);
! 8841: }
! 8842:
! 8843: /* old command */
! 8844: DEFUN (show_ipv6_mbgp_community_list,
! 8845: show_ipv6_mbgp_community_list_cmd,
! 8846: "show ipv6 mbgp community-list WORD",
! 8847: SHOW_STR
! 8848: IPV6_STR
! 8849: MBGP_STR
! 8850: "Display routes matching the community-list\n"
! 8851: "community-list name\n")
! 8852: {
! 8853: return bgp_show_community_list (vty, argv[0], 0, AFI_IP6, SAFI_MULTICAST);
! 8854: }
! 8855:
! 8856: DEFUN (show_bgp_community_list_exact,
! 8857: show_bgp_community_list_exact_cmd,
! 8858: "show bgp community-list (<1-500>|WORD) exact-match",
! 8859: SHOW_STR
! 8860: BGP_STR
! 8861: "Display routes matching the community-list\n"
! 8862: "community-list number\n"
! 8863: "community-list name\n"
! 8864: "Exact match of the communities\n")
! 8865: {
! 8866: return bgp_show_community_list (vty, argv[0], 1, AFI_IP6, SAFI_UNICAST);
! 8867: }
! 8868:
! 8869: ALIAS (show_bgp_community_list_exact,
! 8870: show_bgp_ipv6_community_list_exact_cmd,
! 8871: "show bgp ipv6 community-list (<1-500>|WORD) exact-match",
! 8872: SHOW_STR
! 8873: BGP_STR
! 8874: "Address family\n"
! 8875: "Display routes matching the community-list\n"
! 8876: "community-list number\n"
! 8877: "community-list name\n"
! 8878: "Exact match of the communities\n")
! 8879:
! 8880: /* old command */
! 8881: DEFUN (show_ipv6_bgp_community_list_exact,
! 8882: show_ipv6_bgp_community_list_exact_cmd,
! 8883: "show ipv6 bgp community-list WORD exact-match",
! 8884: SHOW_STR
! 8885: IPV6_STR
! 8886: BGP_STR
! 8887: "Display routes matching the community-list\n"
! 8888: "community-list name\n"
! 8889: "Exact match of the communities\n")
! 8890: {
! 8891: return bgp_show_community_list (vty, argv[0], 1, AFI_IP6, SAFI_UNICAST);
! 8892: }
! 8893:
! 8894: /* old command */
! 8895: DEFUN (show_ipv6_mbgp_community_list_exact,
! 8896: show_ipv6_mbgp_community_list_exact_cmd,
! 8897: "show ipv6 mbgp community-list WORD exact-match",
! 8898: SHOW_STR
! 8899: IPV6_STR
! 8900: MBGP_STR
! 8901: "Display routes matching the community-list\n"
! 8902: "community-list name\n"
! 8903: "Exact match of the communities\n")
! 8904: {
! 8905: return bgp_show_community_list (vty, argv[0], 1, AFI_IP6, SAFI_MULTICAST);
! 8906: }
! 8907: #endif /* HAVE_IPV6 */
! 8908:
! 8909: static int
! 8910: bgp_show_prefix_longer (struct vty *vty, const char *prefix, afi_t afi,
! 8911: safi_t safi, enum bgp_show_type type)
! 8912: {
! 8913: int ret;
! 8914: struct prefix *p;
! 8915:
! 8916: p = prefix_new();
! 8917:
! 8918: ret = str2prefix (prefix, p);
! 8919: if (! ret)
! 8920: {
! 8921: vty_out (vty, "%% Malformed Prefix%s", VTY_NEWLINE);
! 8922: return CMD_WARNING;
! 8923: }
! 8924:
! 8925: ret = bgp_show (vty, NULL, afi, safi, type, p);
! 8926: prefix_free(p);
! 8927: return ret;
! 8928: }
! 8929:
! 8930: DEFUN (show_ip_bgp_prefix_longer,
! 8931: show_ip_bgp_prefix_longer_cmd,
! 8932: "show ip bgp A.B.C.D/M longer-prefixes",
! 8933: SHOW_STR
! 8934: IP_STR
! 8935: BGP_STR
! 8936: "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
! 8937: "Display route and more specific routes\n")
! 8938: {
! 8939: return bgp_show_prefix_longer (vty, argv[0], AFI_IP, SAFI_UNICAST,
! 8940: bgp_show_type_prefix_longer);
! 8941: }
! 8942:
! 8943: DEFUN (show_ip_bgp_flap_prefix_longer,
! 8944: show_ip_bgp_flap_prefix_longer_cmd,
! 8945: "show ip bgp flap-statistics A.B.C.D/M longer-prefixes",
! 8946: SHOW_STR
! 8947: IP_STR
! 8948: BGP_STR
! 8949: "Display flap statistics of routes\n"
! 8950: "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
! 8951: "Display route and more specific routes\n")
! 8952: {
! 8953: return bgp_show_prefix_longer (vty, argv[0], AFI_IP, SAFI_UNICAST,
! 8954: bgp_show_type_flap_prefix_longer);
! 8955: }
! 8956:
! 8957: DEFUN (show_ip_bgp_ipv4_prefix_longer,
! 8958: show_ip_bgp_ipv4_prefix_longer_cmd,
! 8959: "show ip bgp ipv4 (unicast|multicast) A.B.C.D/M longer-prefixes",
! 8960: SHOW_STR
! 8961: IP_STR
! 8962: BGP_STR
! 8963: "Address family\n"
! 8964: "Address Family modifier\n"
! 8965: "Address Family modifier\n"
! 8966: "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
! 8967: "Display route and more specific routes\n")
! 8968: {
! 8969: if (strncmp (argv[0], "m", 1) == 0)
! 8970: return bgp_show_prefix_longer (vty, argv[1], AFI_IP, SAFI_MULTICAST,
! 8971: bgp_show_type_prefix_longer);
! 8972:
! 8973: return bgp_show_prefix_longer (vty, argv[1], AFI_IP, SAFI_UNICAST,
! 8974: bgp_show_type_prefix_longer);
! 8975: }
! 8976:
! 8977: DEFUN (show_ip_bgp_flap_address,
! 8978: show_ip_bgp_flap_address_cmd,
! 8979: "show ip bgp flap-statistics A.B.C.D",
! 8980: SHOW_STR
! 8981: IP_STR
! 8982: BGP_STR
! 8983: "Display flap statistics of routes\n"
! 8984: "Network in the BGP routing table to display\n")
! 8985: {
! 8986: return bgp_show_prefix_longer (vty, argv[0], AFI_IP, SAFI_UNICAST,
! 8987: bgp_show_type_flap_address);
! 8988: }
! 8989:
! 8990: DEFUN (show_ip_bgp_flap_prefix,
! 8991: show_ip_bgp_flap_prefix_cmd,
! 8992: "show ip bgp flap-statistics A.B.C.D/M",
! 8993: SHOW_STR
! 8994: IP_STR
! 8995: BGP_STR
! 8996: "Display flap statistics of routes\n"
! 8997: "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n")
! 8998: {
! 8999: return bgp_show_prefix_longer (vty, argv[0], AFI_IP, SAFI_UNICAST,
! 9000: bgp_show_type_flap_prefix);
! 9001: }
! 9002: #ifdef HAVE_IPV6
! 9003: DEFUN (show_bgp_prefix_longer,
! 9004: show_bgp_prefix_longer_cmd,
! 9005: "show bgp X:X::X:X/M longer-prefixes",
! 9006: SHOW_STR
! 9007: BGP_STR
! 9008: "IPv6 prefix <network>/<length>\n"
! 9009: "Display route and more specific routes\n")
! 9010: {
! 9011: return bgp_show_prefix_longer (vty, argv[0], AFI_IP6, SAFI_UNICAST,
! 9012: bgp_show_type_prefix_longer);
! 9013: }
! 9014:
! 9015: ALIAS (show_bgp_prefix_longer,
! 9016: show_bgp_ipv6_prefix_longer_cmd,
! 9017: "show bgp ipv6 X:X::X:X/M longer-prefixes",
! 9018: SHOW_STR
! 9019: BGP_STR
! 9020: "Address family\n"
! 9021: "IPv6 prefix <network>/<length>\n"
! 9022: "Display route and more specific routes\n")
! 9023:
! 9024: /* old command */
! 9025: DEFUN (show_ipv6_bgp_prefix_longer,
! 9026: show_ipv6_bgp_prefix_longer_cmd,
! 9027: "show ipv6 bgp X:X::X:X/M longer-prefixes",
! 9028: SHOW_STR
! 9029: IPV6_STR
! 9030: BGP_STR
! 9031: "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n"
! 9032: "Display route and more specific routes\n")
! 9033: {
! 9034: return bgp_show_prefix_longer (vty, argv[0], AFI_IP6, SAFI_UNICAST,
! 9035: bgp_show_type_prefix_longer);
! 9036: }
! 9037:
! 9038: /* old command */
! 9039: DEFUN (show_ipv6_mbgp_prefix_longer,
! 9040: show_ipv6_mbgp_prefix_longer_cmd,
! 9041: "show ipv6 mbgp X:X::X:X/M longer-prefixes",
! 9042: SHOW_STR
! 9043: IPV6_STR
! 9044: MBGP_STR
! 9045: "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n"
! 9046: "Display route and more specific routes\n")
! 9047: {
! 9048: return bgp_show_prefix_longer (vty, argv[0], AFI_IP6, SAFI_MULTICAST,
! 9049: bgp_show_type_prefix_longer);
! 9050: }
! 9051: #endif /* HAVE_IPV6 */
! 9052:
! 9053: static struct peer *
! 9054: peer_lookup_in_view (struct vty *vty, const char *view_name,
! 9055: const char *ip_str)
! 9056: {
! 9057: int ret;
! 9058: struct bgp *bgp;
! 9059: struct peer *peer;
! 9060: union sockunion su;
! 9061:
! 9062: /* BGP structure lookup. */
! 9063: if (view_name)
! 9064: {
! 9065: bgp = bgp_lookup_by_name (view_name);
! 9066: if (! bgp)
! 9067: {
! 9068: vty_out (vty, "Can't find BGP view %s%s", view_name, VTY_NEWLINE);
! 9069: return NULL;
! 9070: }
! 9071: }
! 9072: else
! 9073: {
! 9074: bgp = bgp_get_default ();
! 9075: if (! bgp)
! 9076: {
! 9077: vty_out (vty, "No BGP process is configured%s", VTY_NEWLINE);
! 9078: return NULL;
! 9079: }
! 9080: }
! 9081:
! 9082: /* Get peer sockunion. */
! 9083: ret = str2sockunion (ip_str, &su);
! 9084: if (ret < 0)
! 9085: {
! 9086: vty_out (vty, "Malformed address: %s%s", ip_str, VTY_NEWLINE);
! 9087: return NULL;
! 9088: }
! 9089:
! 9090: /* Peer structure lookup. */
! 9091: peer = peer_lookup (bgp, &su);
! 9092: if (! peer)
! 9093: {
! 9094: vty_out (vty, "No such neighbor%s", VTY_NEWLINE);
! 9095: return NULL;
! 9096: }
! 9097:
! 9098: return peer;
! 9099: }
! 9100:
! 9101: enum bgp_stats
! 9102: {
! 9103: BGP_STATS_MAXBITLEN = 0,
! 9104: BGP_STATS_RIB,
! 9105: BGP_STATS_PREFIXES,
! 9106: BGP_STATS_TOTPLEN,
! 9107: BGP_STATS_UNAGGREGATEABLE,
! 9108: BGP_STATS_MAX_AGGREGATEABLE,
! 9109: BGP_STATS_AGGREGATES,
! 9110: BGP_STATS_SPACE,
! 9111: BGP_STATS_ASPATH_COUNT,
! 9112: BGP_STATS_ASPATH_MAXHOPS,
! 9113: BGP_STATS_ASPATH_TOTHOPS,
! 9114: BGP_STATS_ASPATH_MAXSIZE,
! 9115: BGP_STATS_ASPATH_TOTSIZE,
! 9116: BGP_STATS_ASN_HIGHEST,
! 9117: BGP_STATS_MAX,
! 9118: };
! 9119:
! 9120: static const char *table_stats_strs[] =
! 9121: {
! 9122: [BGP_STATS_PREFIXES] = "Total Prefixes",
! 9123: [BGP_STATS_TOTPLEN] = "Average prefix length",
! 9124: [BGP_STATS_RIB] = "Total Advertisements",
! 9125: [BGP_STATS_UNAGGREGATEABLE] = "Unaggregateable prefixes",
! 9126: [BGP_STATS_MAX_AGGREGATEABLE] = "Maximum aggregateable prefixes",
! 9127: [BGP_STATS_AGGREGATES] = "BGP Aggregate advertisements",
! 9128: [BGP_STATS_SPACE] = "Address space advertised",
! 9129: [BGP_STATS_ASPATH_COUNT] = "Advertisements with paths",
! 9130: [BGP_STATS_ASPATH_MAXHOPS] = "Longest AS-Path (hops)",
! 9131: [BGP_STATS_ASPATH_MAXSIZE] = "Largest AS-Path (bytes)",
! 9132: [BGP_STATS_ASPATH_TOTHOPS] = "Average AS-Path length (hops)",
! 9133: [BGP_STATS_ASPATH_TOTSIZE] = "Average AS-Path size (bytes)",
! 9134: [BGP_STATS_ASN_HIGHEST] = "Highest public ASN",
! 9135: [BGP_STATS_MAX] = NULL,
! 9136: };
! 9137:
! 9138: struct bgp_table_stats
! 9139: {
! 9140: struct bgp_table *table;
! 9141: unsigned long long counts[BGP_STATS_MAX];
! 9142: };
! 9143:
! 9144: #if 0
! 9145: #define TALLY_SIGFIG 100000
! 9146: static unsigned long
! 9147: ravg_tally (unsigned long count, unsigned long oldavg, unsigned long newval)
! 9148: {
! 9149: unsigned long newtot = (count-1) * oldavg + (newval * TALLY_SIGFIG);
! 9150: unsigned long res = (newtot * TALLY_SIGFIG) / count;
! 9151: unsigned long ret = newtot / count;
! 9152:
! 9153: if ((res % TALLY_SIGFIG) > (TALLY_SIGFIG/2))
! 9154: return ret + 1;
! 9155: else
! 9156: return ret;
! 9157: }
! 9158: #endif
! 9159:
! 9160: static int
! 9161: bgp_table_stats_walker (struct thread *t)
! 9162: {
! 9163: struct bgp_node *rn;
! 9164: struct bgp_node *top;
! 9165: struct bgp_table_stats *ts = THREAD_ARG (t);
! 9166: unsigned int space = 0;
! 9167:
! 9168: if (!(top = bgp_table_top (ts->table)))
! 9169: return 0;
! 9170:
! 9171: switch (top->p.family)
! 9172: {
! 9173: case AF_INET:
! 9174: space = IPV4_MAX_BITLEN;
! 9175: break;
! 9176: case AF_INET6:
! 9177: space = IPV6_MAX_BITLEN;
! 9178: break;
! 9179: }
! 9180:
! 9181: ts->counts[BGP_STATS_MAXBITLEN] = space;
! 9182:
! 9183: for (rn = top; rn; rn = bgp_route_next (rn))
! 9184: {
! 9185: struct bgp_info *ri;
! 9186: struct bgp_node *prn = rn->parent;
! 9187: unsigned int rinum = 0;
! 9188:
! 9189: if (rn == top)
! 9190: continue;
! 9191:
! 9192: if (!rn->info)
! 9193: continue;
! 9194:
! 9195: ts->counts[BGP_STATS_PREFIXES]++;
! 9196: ts->counts[BGP_STATS_TOTPLEN] += rn->p.prefixlen;
! 9197:
! 9198: #if 0
! 9199: ts->counts[BGP_STATS_AVGPLEN]
! 9200: = ravg_tally (ts->counts[BGP_STATS_PREFIXES],
! 9201: ts->counts[BGP_STATS_AVGPLEN],
! 9202: rn->p.prefixlen);
! 9203: #endif
! 9204:
! 9205: /* check if the prefix is included by any other announcements */
! 9206: while (prn && !prn->info)
! 9207: prn = prn->parent;
! 9208:
! 9209: if (prn == NULL || prn == top)
! 9210: {
! 9211: ts->counts[BGP_STATS_UNAGGREGATEABLE]++;
! 9212: /* announced address space */
! 9213: if (space)
! 9214: ts->counts[BGP_STATS_SPACE] += 1 << (space - rn->p.prefixlen);
! 9215: }
! 9216: else if (prn->info)
! 9217: ts->counts[BGP_STATS_MAX_AGGREGATEABLE]++;
! 9218:
! 9219: for (ri = rn->info; ri; ri = ri->next)
! 9220: {
! 9221: rinum++;
! 9222: ts->counts[BGP_STATS_RIB]++;
! 9223:
! 9224: if (ri->attr &&
! 9225: (CHECK_FLAG (ri->attr->flag,
! 9226: ATTR_FLAG_BIT (BGP_ATTR_ATOMIC_AGGREGATE))))
! 9227: ts->counts[BGP_STATS_AGGREGATES]++;
! 9228:
! 9229: /* as-path stats */
! 9230: if (ri->attr && ri->attr->aspath)
! 9231: {
! 9232: unsigned int hops = aspath_count_hops (ri->attr->aspath);
! 9233: unsigned int size = aspath_size (ri->attr->aspath);
! 9234: as_t highest = aspath_highest (ri->attr->aspath);
! 9235:
! 9236: ts->counts[BGP_STATS_ASPATH_COUNT]++;
! 9237:
! 9238: if (hops > ts->counts[BGP_STATS_ASPATH_MAXHOPS])
! 9239: ts->counts[BGP_STATS_ASPATH_MAXHOPS] = hops;
! 9240:
! 9241: if (size > ts->counts[BGP_STATS_ASPATH_MAXSIZE])
! 9242: ts->counts[BGP_STATS_ASPATH_MAXSIZE] = size;
! 9243:
! 9244: ts->counts[BGP_STATS_ASPATH_TOTHOPS] += hops;
! 9245: ts->counts[BGP_STATS_ASPATH_TOTSIZE] += size;
! 9246: #if 0
! 9247: ts->counts[BGP_STATS_ASPATH_AVGHOPS]
! 9248: = ravg_tally (ts->counts[BGP_STATS_ASPATH_COUNT],
! 9249: ts->counts[BGP_STATS_ASPATH_AVGHOPS],
! 9250: hops);
! 9251: ts->counts[BGP_STATS_ASPATH_AVGSIZE]
! 9252: = ravg_tally (ts->counts[BGP_STATS_ASPATH_COUNT],
! 9253: ts->counts[BGP_STATS_ASPATH_AVGSIZE],
! 9254: size);
! 9255: #endif
! 9256: if (highest > ts->counts[BGP_STATS_ASN_HIGHEST])
! 9257: ts->counts[BGP_STATS_ASN_HIGHEST] = highest;
! 9258: }
! 9259: }
! 9260: }
! 9261: return 0;
! 9262: }
! 9263:
! 9264: static int
! 9265: bgp_table_stats (struct vty *vty, struct bgp *bgp, afi_t afi, safi_t safi)
! 9266: {
! 9267: struct bgp_table_stats ts;
! 9268: unsigned int i;
! 9269:
! 9270: if (!bgp->rib[afi][safi])
! 9271: {
! 9272: vty_out (vty, "%% No RIB exist for the AFI/SAFI%s", VTY_NEWLINE);
! 9273: return CMD_WARNING;
! 9274: }
! 9275:
! 9276: memset (&ts, 0, sizeof (ts));
! 9277: ts.table = bgp->rib[afi][safi];
! 9278: thread_execute (bm->master, bgp_table_stats_walker, &ts, 0);
! 9279:
! 9280: vty_out (vty, "BGP %s RIB statistics%s%s",
! 9281: afi_safi_print (afi, safi), VTY_NEWLINE, VTY_NEWLINE);
! 9282:
! 9283: for (i = 0; i < BGP_STATS_MAX; i++)
! 9284: {
! 9285: if (!table_stats_strs[i])
! 9286: continue;
! 9287:
! 9288: switch (i)
! 9289: {
! 9290: #if 0
! 9291: case BGP_STATS_ASPATH_AVGHOPS:
! 9292: case BGP_STATS_ASPATH_AVGSIZE:
! 9293: case BGP_STATS_AVGPLEN:
! 9294: vty_out (vty, "%-30s: ", table_stats_strs[i]);
! 9295: vty_out (vty, "%12.2f",
! 9296: (float)ts.counts[i] / (float)TALLY_SIGFIG);
! 9297: break;
! 9298: #endif
! 9299: case BGP_STATS_ASPATH_TOTHOPS:
! 9300: case BGP_STATS_ASPATH_TOTSIZE:
! 9301: vty_out (vty, "%-30s: ", table_stats_strs[i]);
! 9302: vty_out (vty, "%12.2f",
! 9303: ts.counts[i] ?
! 9304: (float)ts.counts[i] /
! 9305: (float)ts.counts[BGP_STATS_ASPATH_COUNT]
! 9306: : 0);
! 9307: break;
! 9308: case BGP_STATS_TOTPLEN:
! 9309: vty_out (vty, "%-30s: ", table_stats_strs[i]);
! 9310: vty_out (vty, "%12.2f",
! 9311: ts.counts[i] ?
! 9312: (float)ts.counts[i] /
! 9313: (float)ts.counts[BGP_STATS_PREFIXES]
! 9314: : 0);
! 9315: break;
! 9316: case BGP_STATS_SPACE:
! 9317: vty_out (vty, "%-30s: ", table_stats_strs[i]);
! 9318: vty_out (vty, "%12llu%s", ts.counts[i], VTY_NEWLINE);
! 9319: if (ts.counts[BGP_STATS_MAXBITLEN] < 9)
! 9320: break;
! 9321: vty_out (vty, "%30s: ", "%% announced ");
! 9322: vty_out (vty, "%12.2f%s",
! 9323: 100 * (float)ts.counts[BGP_STATS_SPACE] /
! 9324: (float)((uint64_t)1UL << ts.counts[BGP_STATS_MAXBITLEN]),
! 9325: VTY_NEWLINE);
! 9326: vty_out (vty, "%30s: ", "/8 equivalent ");
! 9327: vty_out (vty, "%12.2f%s",
! 9328: (float)ts.counts[BGP_STATS_SPACE] /
! 9329: (float)(1UL << (ts.counts[BGP_STATS_MAXBITLEN] - 8)),
! 9330: VTY_NEWLINE);
! 9331: if (ts.counts[BGP_STATS_MAXBITLEN] < 25)
! 9332: break;
! 9333: vty_out (vty, "%30s: ", "/24 equivalent ");
! 9334: vty_out (vty, "%12.2f",
! 9335: (float)ts.counts[BGP_STATS_SPACE] /
! 9336: (float)(1UL << (ts.counts[BGP_STATS_MAXBITLEN] - 24)));
! 9337: break;
! 9338: default:
! 9339: vty_out (vty, "%-30s: ", table_stats_strs[i]);
! 9340: vty_out (vty, "%12llu", ts.counts[i]);
! 9341: }
! 9342:
! 9343: vty_out (vty, "%s", VTY_NEWLINE);
! 9344: }
! 9345: return CMD_SUCCESS;
! 9346: }
! 9347:
! 9348: static int
! 9349: bgp_table_stats_vty (struct vty *vty, const char *name,
! 9350: const char *afi_str, const char *safi_str)
! 9351: {
! 9352: struct bgp *bgp;
! 9353: afi_t afi;
! 9354: safi_t safi;
! 9355:
! 9356: if (name)
! 9357: bgp = bgp_lookup_by_name (name);
! 9358: else
! 9359: bgp = bgp_get_default ();
! 9360:
! 9361: if (!bgp)
! 9362: {
! 9363: vty_out (vty, "%% No such BGP instance exist%s", VTY_NEWLINE);
! 9364: return CMD_WARNING;
! 9365: }
! 9366: if (strncmp (afi_str, "ipv", 3) == 0)
! 9367: {
! 9368: if (strncmp (afi_str, "ipv4", 4) == 0)
! 9369: afi = AFI_IP;
! 9370: else if (strncmp (afi_str, "ipv6", 4) == 0)
! 9371: afi = AFI_IP6;
! 9372: else
! 9373: {
! 9374: vty_out (vty, "%% Invalid address family %s%s",
! 9375: afi_str, VTY_NEWLINE);
! 9376: return CMD_WARNING;
! 9377: }
! 9378: if (strncmp (safi_str, "m", 1) == 0)
! 9379: safi = SAFI_MULTICAST;
! 9380: else if (strncmp (safi_str, "u", 1) == 0)
! 9381: safi = SAFI_UNICAST;
! 9382: else if (strncmp (safi_str, "vpnv4", 5) == 0)
! 9383: safi = BGP_SAFI_VPNV4;
! 9384: else if (strncmp (safi_str, "vpnv6", 6) == 0)
! 9385: safi = BGP_SAFI_VPNV6;
! 9386: else
! 9387: {
! 9388: vty_out (vty, "%% Invalid subsequent address family %s%s",
! 9389: safi_str, VTY_NEWLINE);
! 9390: return CMD_WARNING;
! 9391: }
! 9392: }
! 9393: else
! 9394: {
! 9395: vty_out (vty, "%% Invalid address family %s%s",
! 9396: afi_str, VTY_NEWLINE);
! 9397: return CMD_WARNING;
! 9398: }
! 9399:
! 9400: if ((afi == AFI_IP && safi == BGP_SAFI_VPNV6)
! 9401: || (afi == AFI_IP6 && safi == BGP_SAFI_VPNV4))
! 9402: {
! 9403: vty_out (vty, "%% Invalid subsequent address family %s for %s%s",
! 9404: afi_str, safi_str, VTY_NEWLINE);
! 9405: return CMD_WARNING;
! 9406: }
! 9407: return bgp_table_stats (vty, bgp, afi, safi);
! 9408: }
! 9409:
! 9410: DEFUN (show_bgp_statistics,
! 9411: show_bgp_statistics_cmd,
! 9412: "show bgp (ipv4|ipv6) (unicast|multicast) statistics",
! 9413: SHOW_STR
! 9414: BGP_STR
! 9415: "Address family\n"
! 9416: "Address family\n"
! 9417: "Address Family modifier\n"
! 9418: "Address Family modifier\n"
! 9419: "BGP RIB advertisement statistics\n")
! 9420: {
! 9421: return bgp_table_stats_vty (vty, NULL, argv[0], argv[1]);
! 9422: }
! 9423:
! 9424: ALIAS (show_bgp_statistics,
! 9425: show_bgp_statistics_vpnv4_cmd,
! 9426: "show bgp (ipv4) (vpnv4) statistics",
! 9427: SHOW_STR
! 9428: BGP_STR
! 9429: "Address family\n"
! 9430: "Address Family modifier\n"
! 9431: "BGP RIB advertisement statistics\n")
! 9432:
! 9433: DEFUN (show_bgp_statistics_view,
! 9434: show_bgp_statistics_view_cmd,
! 9435: "show bgp view WORD (ipv4|ipv6) (unicast|multicast) statistics",
! 9436: SHOW_STR
! 9437: BGP_STR
! 9438: "BGP view\n"
! 9439: "Address family\n"
! 9440: "Address family\n"
! 9441: "Address Family modifier\n"
! 9442: "Address Family modifier\n"
! 9443: "BGP RIB advertisement statistics\n")
! 9444: {
! 9445: return bgp_table_stats_vty (vty, NULL, argv[0], argv[1]);
! 9446: }
! 9447:
! 9448: ALIAS (show_bgp_statistics_view,
! 9449: show_bgp_statistics_view_vpnv4_cmd,
! 9450: "show bgp view WORD (ipv4) (vpnv4) statistics",
! 9451: SHOW_STR
! 9452: BGP_STR
! 9453: "BGP view\n"
! 9454: "Address family\n"
! 9455: "Address Family modifier\n"
! 9456: "BGP RIB advertisement statistics\n")
! 9457:
! 9458: enum bgp_pcounts
! 9459: {
! 9460: PCOUNT_ADJ_IN = 0,
! 9461: PCOUNT_DAMPED,
! 9462: PCOUNT_REMOVED,
! 9463: PCOUNT_HISTORY,
! 9464: PCOUNT_STALE,
! 9465: PCOUNT_VALID,
! 9466: PCOUNT_ALL,
! 9467: PCOUNT_COUNTED,
! 9468: PCOUNT_PFCNT, /* the figure we display to users */
! 9469: PCOUNT_MAX,
! 9470: };
! 9471:
! 9472: static const char *pcount_strs[] =
! 9473: {
! 9474: [PCOUNT_ADJ_IN] = "Adj-in",
! 9475: [PCOUNT_DAMPED] = "Damped",
! 9476: [PCOUNT_REMOVED] = "Removed",
! 9477: [PCOUNT_HISTORY] = "History",
! 9478: [PCOUNT_STALE] = "Stale",
! 9479: [PCOUNT_VALID] = "Valid",
! 9480: [PCOUNT_ALL] = "All RIB",
! 9481: [PCOUNT_COUNTED] = "PfxCt counted",
! 9482: [PCOUNT_PFCNT] = "Useable",
! 9483: [PCOUNT_MAX] = NULL,
! 9484: };
! 9485:
! 9486: struct peer_pcounts
! 9487: {
! 9488: unsigned int count[PCOUNT_MAX];
! 9489: const struct peer *peer;
! 9490: const struct bgp_table *table;
! 9491: };
! 9492:
! 9493: static int
! 9494: bgp_peer_count_walker (struct thread *t)
! 9495: {
! 9496: struct bgp_node *rn;
! 9497: struct peer_pcounts *pc = THREAD_ARG (t);
! 9498: const struct peer *peer = pc->peer;
! 9499:
! 9500: for (rn = bgp_table_top (pc->table); rn; rn = bgp_route_next (rn))
! 9501: {
! 9502: struct bgp_adj_in *ain;
! 9503: struct bgp_info *ri;
! 9504:
! 9505: for (ain = rn->adj_in; ain; ain = ain->next)
! 9506: if (ain->peer == peer)
! 9507: pc->count[PCOUNT_ADJ_IN]++;
! 9508:
! 9509: for (ri = rn->info; ri; ri = ri->next)
! 9510: {
! 9511: char buf[SU_ADDRSTRLEN];
! 9512:
! 9513: if (ri->peer != peer)
! 9514: continue;
! 9515:
! 9516: pc->count[PCOUNT_ALL]++;
! 9517:
! 9518: if (CHECK_FLAG (ri->flags, BGP_INFO_DAMPED))
! 9519: pc->count[PCOUNT_DAMPED]++;
! 9520: if (CHECK_FLAG (ri->flags, BGP_INFO_HISTORY))
! 9521: pc->count[PCOUNT_HISTORY]++;
! 9522: if (CHECK_FLAG (ri->flags, BGP_INFO_REMOVED))
! 9523: pc->count[PCOUNT_REMOVED]++;
! 9524: if (CHECK_FLAG (ri->flags, BGP_INFO_STALE))
! 9525: pc->count[PCOUNT_STALE]++;
! 9526: if (CHECK_FLAG (ri->flags, BGP_INFO_VALID))
! 9527: pc->count[PCOUNT_VALID]++;
! 9528: if (!CHECK_FLAG (ri->flags, BGP_INFO_UNUSEABLE))
! 9529: pc->count[PCOUNT_PFCNT]++;
! 9530:
! 9531: if (CHECK_FLAG (ri->flags, BGP_INFO_COUNTED))
! 9532: {
! 9533: pc->count[PCOUNT_COUNTED]++;
! 9534: if (CHECK_FLAG (ri->flags, BGP_INFO_UNUSEABLE))
! 9535: plog_warn (peer->log,
! 9536: "%s [pcount] %s/%d is counted but flags 0x%x",
! 9537: peer->host,
! 9538: inet_ntop(rn->p.family, &rn->p.u.prefix,
! 9539: buf, SU_ADDRSTRLEN),
! 9540: rn->p.prefixlen,
! 9541: ri->flags);
! 9542: }
! 9543: else
! 9544: {
! 9545: if (!CHECK_FLAG (ri->flags, BGP_INFO_UNUSEABLE))
! 9546: plog_warn (peer->log,
! 9547: "%s [pcount] %s/%d not counted but flags 0x%x",
! 9548: peer->host,
! 9549: inet_ntop(rn->p.family, &rn->p.u.prefix,
! 9550: buf, SU_ADDRSTRLEN),
! 9551: rn->p.prefixlen,
! 9552: ri->flags);
! 9553: }
! 9554: }
! 9555: }
! 9556: return 0;
! 9557: }
! 9558:
! 9559: static int
! 9560: bgp_peer_counts (struct vty *vty, struct peer *peer, afi_t afi, safi_t safi)
! 9561: {
! 9562: struct peer_pcounts pcounts = { .peer = peer };
! 9563: unsigned int i;
! 9564:
! 9565: if (!peer || !peer->bgp || !peer->afc[afi][safi]
! 9566: || !peer->bgp->rib[afi][safi])
! 9567: {
! 9568: vty_out (vty, "%% No such neighbor or address family%s", VTY_NEWLINE);
! 9569: return CMD_WARNING;
! 9570: }
! 9571:
! 9572: memset (&pcounts, 0, sizeof(pcounts));
! 9573: pcounts.peer = peer;
! 9574: pcounts.table = peer->bgp->rib[afi][safi];
! 9575:
! 9576: /* in-place call via thread subsystem so as to record execution time
! 9577: * stats for the thread-walk (i.e. ensure this can't be blamed on
! 9578: * on just vty_read()).
! 9579: */
! 9580: thread_execute (bm->master, bgp_peer_count_walker, &pcounts, 0);
! 9581:
! 9582: vty_out (vty, "Prefix counts for %s, %s%s",
! 9583: peer->host, afi_safi_print (afi, safi), VTY_NEWLINE);
! 9584: vty_out (vty, "PfxCt: %ld%s", peer->pcount[afi][safi], VTY_NEWLINE);
! 9585: vty_out (vty, "%sCounts from RIB table walk:%s%s",
! 9586: VTY_NEWLINE, VTY_NEWLINE, VTY_NEWLINE);
! 9587:
! 9588: for (i = 0; i < PCOUNT_MAX; i++)
! 9589: vty_out (vty, "%20s: %-10d%s",
! 9590: pcount_strs[i], pcounts.count[i], VTY_NEWLINE);
! 9591:
! 9592: if (pcounts.count[PCOUNT_PFCNT] != peer->pcount[afi][safi])
! 9593: {
! 9594: vty_out (vty, "%s [pcount] PfxCt drift!%s",
! 9595: peer->host, VTY_NEWLINE);
! 9596: vty_out (vty, "Please report this bug, with the above command output%s",
! 9597: VTY_NEWLINE);
! 9598: }
! 9599:
! 9600: return CMD_SUCCESS;
! 9601: }
! 9602:
! 9603: DEFUN (show_ip_bgp_neighbor_prefix_counts,
! 9604: show_ip_bgp_neighbor_prefix_counts_cmd,
! 9605: "show ip bgp neighbors (A.B.C.D|X:X::X:X) prefix-counts",
! 9606: SHOW_STR
! 9607: IP_STR
! 9608: BGP_STR
! 9609: "Detailed information on TCP and BGP neighbor connections\n"
! 9610: "Neighbor to display information about\n"
! 9611: "Neighbor to display information about\n"
! 9612: "Display detailed prefix count information\n")
! 9613: {
! 9614: struct peer *peer;
! 9615:
! 9616: peer = peer_lookup_in_view (vty, NULL, argv[0]);
! 9617: if (! peer)
! 9618: return CMD_WARNING;
! 9619:
! 9620: return bgp_peer_counts (vty, peer, AFI_IP, SAFI_UNICAST);
! 9621: }
! 9622:
! 9623: DEFUN (show_bgp_ipv6_neighbor_prefix_counts,
! 9624: show_bgp_ipv6_neighbor_prefix_counts_cmd,
! 9625: "show bgp ipv6 neighbors (A.B.C.D|X:X::X:X) prefix-counts",
! 9626: SHOW_STR
! 9627: BGP_STR
! 9628: "Address family\n"
! 9629: "Detailed information on TCP and BGP neighbor connections\n"
! 9630: "Neighbor to display information about\n"
! 9631: "Neighbor to display information about\n"
! 9632: "Display detailed prefix count information\n")
! 9633: {
! 9634: struct peer *peer;
! 9635:
! 9636: peer = peer_lookup_in_view (vty, NULL, argv[0]);
! 9637: if (! peer)
! 9638: return CMD_WARNING;
! 9639:
! 9640: return bgp_peer_counts (vty, peer, AFI_IP6, SAFI_UNICAST);
! 9641: }
! 9642:
! 9643: DEFUN (show_ip_bgp_ipv4_neighbor_prefix_counts,
! 9644: show_ip_bgp_ipv4_neighbor_prefix_counts_cmd,
! 9645: "show ip bgp ipv4 (unicast|multicast) neighbors (A.B.C.D|X:X::X:X) prefix-counts",
! 9646: SHOW_STR
! 9647: IP_STR
! 9648: BGP_STR
! 9649: "Address family\n"
! 9650: "Address Family modifier\n"
! 9651: "Address Family modifier\n"
! 9652: "Detailed information on TCP and BGP neighbor connections\n"
! 9653: "Neighbor to display information about\n"
! 9654: "Neighbor to display information about\n"
! 9655: "Display detailed prefix count information\n")
! 9656: {
! 9657: struct peer *peer;
! 9658:
! 9659: peer = peer_lookup_in_view (vty, NULL, argv[1]);
! 9660: if (! peer)
! 9661: return CMD_WARNING;
! 9662:
! 9663: if (strncmp (argv[0], "m", 1) == 0)
! 9664: return bgp_peer_counts (vty, peer, AFI_IP, SAFI_MULTICAST);
! 9665:
! 9666: return bgp_peer_counts (vty, peer, AFI_IP, SAFI_UNICAST);
! 9667: }
! 9668:
! 9669: DEFUN (show_ip_bgp_vpnv4_neighbor_prefix_counts,
! 9670: show_ip_bgp_vpnv4_neighbor_prefix_counts_cmd,
! 9671: "show ip bgp vpnv4 all neighbors (A.B.C.D|X:X::X:X) prefix-counts",
! 9672: SHOW_STR
! 9673: IP_STR
! 9674: BGP_STR
! 9675: "Address family\n"
! 9676: "Address Family modifier\n"
! 9677: "Address Family modifier\n"
! 9678: "Detailed information on TCP and BGP neighbor connections\n"
! 9679: "Neighbor to display information about\n"
! 9680: "Neighbor to display information about\n"
! 9681: "Display detailed prefix count information\n")
! 9682: {
! 9683: struct peer *peer;
! 9684:
! 9685: peer = peer_lookup_in_view (vty, NULL, argv[0]);
! 9686: if (! peer)
! 9687: return CMD_WARNING;
! 9688:
! 9689: return bgp_peer_counts (vty, peer, AFI_IP, SAFI_MPLS_VPN);
! 9690: }
! 9691:
! 9692:
! 9693: static void
! 9694: show_adj_route (struct vty *vty, struct peer *peer, afi_t afi, safi_t safi,
! 9695: int in)
! 9696: {
! 9697: struct bgp_table *table;
! 9698: struct bgp_adj_in *ain;
! 9699: struct bgp_adj_out *adj;
! 9700: unsigned long output_count;
! 9701: struct bgp_node *rn;
! 9702: int header1 = 1;
! 9703: struct bgp *bgp;
! 9704: int header2 = 1;
! 9705:
! 9706: bgp = peer->bgp;
! 9707:
! 9708: if (! bgp)
! 9709: return;
! 9710:
! 9711: table = bgp->rib[afi][safi];
! 9712:
! 9713: output_count = 0;
! 9714:
! 9715: if (! in && CHECK_FLAG (peer->af_sflags[afi][safi],
! 9716: PEER_STATUS_DEFAULT_ORIGINATE))
! 9717: {
! 9718: vty_out (vty, "BGP table version is 0, local router ID is %s%s", inet_ntoa (bgp->router_id), VTY_NEWLINE);
! 9719: vty_out (vty, BGP_SHOW_SCODE_HEADER, VTY_NEWLINE, VTY_NEWLINE);
! 9720: vty_out (vty, BGP_SHOW_OCODE_HEADER, VTY_NEWLINE, VTY_NEWLINE);
! 9721:
! 9722: vty_out (vty, "Originating default network 0.0.0.0%s%s",
! 9723: VTY_NEWLINE, VTY_NEWLINE);
! 9724: header1 = 0;
! 9725: }
! 9726:
! 9727: for (rn = bgp_table_top (table); rn; rn = bgp_route_next (rn))
! 9728: if (in)
! 9729: {
! 9730: for (ain = rn->adj_in; ain; ain = ain->next)
! 9731: if (ain->peer == peer)
! 9732: {
! 9733: if (header1)
! 9734: {
! 9735: vty_out (vty, "BGP table version is 0, local router ID is %s%s", inet_ntoa (bgp->router_id), VTY_NEWLINE);
! 9736: vty_out (vty, BGP_SHOW_SCODE_HEADER, VTY_NEWLINE, VTY_NEWLINE);
! 9737: vty_out (vty, BGP_SHOW_OCODE_HEADER, VTY_NEWLINE, VTY_NEWLINE);
! 9738: header1 = 0;
! 9739: }
! 9740: if (header2)
! 9741: {
! 9742: vty_out (vty, BGP_SHOW_HEADER, VTY_NEWLINE);
! 9743: header2 = 0;
! 9744: }
! 9745: if (ain->attr)
! 9746: {
! 9747: route_vty_out_tmp (vty, &rn->p, ain->attr, safi);
! 9748: output_count++;
! 9749: }
! 9750: }
! 9751: }
! 9752: else
! 9753: {
! 9754: for (adj = rn->adj_out; adj; adj = adj->next)
! 9755: if (adj->peer == peer)
! 9756: {
! 9757: if (header1)
! 9758: {
! 9759: vty_out (vty, "BGP table version is 0, local router ID is %s%s", inet_ntoa (bgp->router_id), VTY_NEWLINE);
! 9760: vty_out (vty, BGP_SHOW_SCODE_HEADER, VTY_NEWLINE, VTY_NEWLINE);
! 9761: vty_out (vty, BGP_SHOW_OCODE_HEADER, VTY_NEWLINE, VTY_NEWLINE);
! 9762: header1 = 0;
! 9763: }
! 9764: if (header2)
! 9765: {
! 9766: vty_out (vty, BGP_SHOW_HEADER, VTY_NEWLINE);
! 9767: header2 = 0;
! 9768: }
! 9769: if (adj->attr)
! 9770: {
! 9771: route_vty_out_tmp (vty, &rn->p, adj->attr, safi);
! 9772: output_count++;
! 9773: }
! 9774: }
! 9775: }
! 9776:
! 9777: if (output_count != 0)
! 9778: vty_out (vty, "%sTotal number of prefixes %ld%s",
! 9779: VTY_NEWLINE, output_count, VTY_NEWLINE);
! 9780: }
! 9781:
! 9782: static int
! 9783: peer_adj_routes (struct vty *vty, struct peer *peer, afi_t afi, safi_t safi, int in)
! 9784: {
! 9785: if (! peer || ! peer->afc[afi][safi])
! 9786: {
! 9787: vty_out (vty, "%% No such neighbor or address family%s", VTY_NEWLINE);
! 9788: return CMD_WARNING;
! 9789: }
! 9790:
! 9791: if (in && ! CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_SOFT_RECONFIG))
! 9792: {
! 9793: vty_out (vty, "%% Inbound soft reconfiguration not enabled%s",
! 9794: VTY_NEWLINE);
! 9795: return CMD_WARNING;
! 9796: }
! 9797:
! 9798: show_adj_route (vty, peer, afi, safi, in);
! 9799:
! 9800: return CMD_SUCCESS;
! 9801: }
! 9802:
! 9803: DEFUN (show_ip_bgp_view_neighbor_advertised_route,
! 9804: show_ip_bgp_view_neighbor_advertised_route_cmd,
! 9805: "show ip bgp view WORD neighbors (A.B.C.D|X:X::X:X) advertised-routes",
! 9806: SHOW_STR
! 9807: IP_STR
! 9808: BGP_STR
! 9809: "BGP view\n"
! 9810: "View name\n"
! 9811: "Detailed information on TCP and BGP neighbor connections\n"
! 9812: "Neighbor to display information about\n"
! 9813: "Neighbor to display information about\n"
! 9814: "Display the routes advertised to a BGP neighbor\n")
! 9815: {
! 9816: struct peer *peer;
! 9817:
! 9818: if (argc == 2)
! 9819: peer = peer_lookup_in_view (vty, argv[0], argv[1]);
! 9820: else
! 9821: peer = peer_lookup_in_view (vty, NULL, argv[0]);
! 9822:
! 9823: if (! peer)
! 9824: return CMD_WARNING;
! 9825:
! 9826: return peer_adj_routes (vty, peer, AFI_IP, SAFI_UNICAST, 0);
! 9827: }
! 9828:
! 9829: ALIAS (show_ip_bgp_view_neighbor_advertised_route,
! 9830: show_ip_bgp_neighbor_advertised_route_cmd,
! 9831: "show ip bgp neighbors (A.B.C.D|X:X::X:X) advertised-routes",
! 9832: SHOW_STR
! 9833: IP_STR
! 9834: BGP_STR
! 9835: "Detailed information on TCP and BGP neighbor connections\n"
! 9836: "Neighbor to display information about\n"
! 9837: "Neighbor to display information about\n"
! 9838: "Display the routes advertised to a BGP neighbor\n")
! 9839:
! 9840: DEFUN (show_ip_bgp_ipv4_neighbor_advertised_route,
! 9841: show_ip_bgp_ipv4_neighbor_advertised_route_cmd,
! 9842: "show ip bgp ipv4 (unicast|multicast) neighbors (A.B.C.D|X:X::X:X) advertised-routes",
! 9843: SHOW_STR
! 9844: IP_STR
! 9845: BGP_STR
! 9846: "Address family\n"
! 9847: "Address Family modifier\n"
! 9848: "Address Family modifier\n"
! 9849: "Detailed information on TCP and BGP neighbor connections\n"
! 9850: "Neighbor to display information about\n"
! 9851: "Neighbor to display information about\n"
! 9852: "Display the routes advertised to a BGP neighbor\n")
! 9853: {
! 9854: struct peer *peer;
! 9855:
! 9856: peer = peer_lookup_in_view (vty, NULL, argv[1]);
! 9857: if (! peer)
! 9858: return CMD_WARNING;
! 9859:
! 9860: if (strncmp (argv[0], "m", 1) == 0)
! 9861: return peer_adj_routes (vty, peer, AFI_IP, SAFI_MULTICAST, 0);
! 9862:
! 9863: return peer_adj_routes (vty, peer, AFI_IP, SAFI_UNICAST, 0);
! 9864: }
! 9865:
! 9866: #ifdef HAVE_IPV6
! 9867: DEFUN (show_bgp_view_neighbor_advertised_route,
! 9868: show_bgp_view_neighbor_advertised_route_cmd,
! 9869: "show bgp view WORD neighbors (A.B.C.D|X:X::X:X) advertised-routes",
! 9870: SHOW_STR
! 9871: BGP_STR
! 9872: "BGP view\n"
! 9873: "View name\n"
! 9874: "Detailed information on TCP and BGP neighbor connections\n"
! 9875: "Neighbor to display information about\n"
! 9876: "Neighbor to display information about\n"
! 9877: "Display the routes advertised to a BGP neighbor\n")
! 9878: {
! 9879: struct peer *peer;
! 9880:
! 9881: if (argc == 2)
! 9882: peer = peer_lookup_in_view (vty, argv[0], argv[1]);
! 9883: else
! 9884: peer = peer_lookup_in_view (vty, NULL, argv[0]);
! 9885:
! 9886: if (! peer)
! 9887: return CMD_WARNING;
! 9888:
! 9889: return peer_adj_routes (vty, peer, AFI_IP6, SAFI_UNICAST, 0);
! 9890: }
! 9891:
! 9892: ALIAS (show_bgp_view_neighbor_advertised_route,
! 9893: show_bgp_view_ipv6_neighbor_advertised_route_cmd,
! 9894: "show bgp view WORD ipv6 neighbors (A.B.C.D|X:X::X:X) advertised-routes",
! 9895: SHOW_STR
! 9896: BGP_STR
! 9897: "BGP view\n"
! 9898: "View name\n"
! 9899: "Address family\n"
! 9900: "Detailed information on TCP and BGP neighbor connections\n"
! 9901: "Neighbor to display information about\n"
! 9902: "Neighbor to display information about\n"
! 9903: "Display the routes advertised to a BGP neighbor\n")
! 9904:
! 9905: DEFUN (show_bgp_view_neighbor_received_routes,
! 9906: show_bgp_view_neighbor_received_routes_cmd,
! 9907: "show bgp view WORD neighbors (A.B.C.D|X:X::X:X) received-routes",
! 9908: SHOW_STR
! 9909: BGP_STR
! 9910: "BGP view\n"
! 9911: "View name\n"
! 9912: "Detailed information on TCP and BGP neighbor connections\n"
! 9913: "Neighbor to display information about\n"
! 9914: "Neighbor to display information about\n"
! 9915: "Display the received routes from neighbor\n")
! 9916: {
! 9917: struct peer *peer;
! 9918:
! 9919: if (argc == 2)
! 9920: peer = peer_lookup_in_view (vty, argv[0], argv[1]);
! 9921: else
! 9922: peer = peer_lookup_in_view (vty, NULL, argv[0]);
! 9923:
! 9924: if (! peer)
! 9925: return CMD_WARNING;
! 9926:
! 9927: return peer_adj_routes (vty, peer, AFI_IP6, SAFI_UNICAST, 1);
! 9928: }
! 9929:
! 9930: ALIAS (show_bgp_view_neighbor_received_routes,
! 9931: show_bgp_view_ipv6_neighbor_received_routes_cmd,
! 9932: "show bgp view WORD ipv6 neighbors (A.B.C.D|X:X::X:X) received-routes",
! 9933: SHOW_STR
! 9934: BGP_STR
! 9935: "BGP view\n"
! 9936: "View name\n"
! 9937: "Address family\n"
! 9938: "Detailed information on TCP and BGP neighbor connections\n"
! 9939: "Neighbor to display information about\n"
! 9940: "Neighbor to display information about\n"
! 9941: "Display the received routes from neighbor\n")
! 9942:
! 9943: ALIAS (show_bgp_view_neighbor_advertised_route,
! 9944: show_bgp_neighbor_advertised_route_cmd,
! 9945: "show bgp neighbors (A.B.C.D|X:X::X:X) advertised-routes",
! 9946: SHOW_STR
! 9947: BGP_STR
! 9948: "Detailed information on TCP and BGP neighbor connections\n"
! 9949: "Neighbor to display information about\n"
! 9950: "Neighbor to display information about\n"
! 9951: "Display the routes advertised to a BGP neighbor\n")
! 9952:
! 9953: ALIAS (show_bgp_view_neighbor_advertised_route,
! 9954: show_bgp_ipv6_neighbor_advertised_route_cmd,
! 9955: "show bgp ipv6 neighbors (A.B.C.D|X:X::X:X) advertised-routes",
! 9956: SHOW_STR
! 9957: BGP_STR
! 9958: "Address family\n"
! 9959: "Detailed information on TCP and BGP neighbor connections\n"
! 9960: "Neighbor to display information about\n"
! 9961: "Neighbor to display information about\n"
! 9962: "Display the routes advertised to a BGP neighbor\n")
! 9963:
! 9964: /* old command */
! 9965: ALIAS (show_bgp_view_neighbor_advertised_route,
! 9966: ipv6_bgp_neighbor_advertised_route_cmd,
! 9967: "show ipv6 bgp neighbors (A.B.C.D|X:X::X:X) advertised-routes",
! 9968: SHOW_STR
! 9969: IPV6_STR
! 9970: BGP_STR
! 9971: "Detailed information on TCP and BGP neighbor connections\n"
! 9972: "Neighbor to display information about\n"
! 9973: "Neighbor to display information about\n"
! 9974: "Display the routes advertised to a BGP neighbor\n")
! 9975:
! 9976: /* old command */
! 9977: DEFUN (ipv6_mbgp_neighbor_advertised_route,
! 9978: ipv6_mbgp_neighbor_advertised_route_cmd,
! 9979: "show ipv6 mbgp neighbors (A.B.C.D|X:X::X:X) advertised-routes",
! 9980: SHOW_STR
! 9981: IPV6_STR
! 9982: MBGP_STR
! 9983: "Detailed information on TCP and BGP neighbor connections\n"
! 9984: "Neighbor to display information about\n"
! 9985: "Neighbor to display information about\n"
! 9986: "Display the routes advertised to a BGP neighbor\n")
! 9987: {
! 9988: struct peer *peer;
! 9989:
! 9990: peer = peer_lookup_in_view (vty, NULL, argv[0]);
! 9991: if (! peer)
! 9992: return CMD_WARNING;
! 9993:
! 9994: return peer_adj_routes (vty, peer, AFI_IP6, SAFI_MULTICAST, 0);
! 9995: }
! 9996: #endif /* HAVE_IPV6 */
! 9997:
! 9998: DEFUN (show_ip_bgp_view_neighbor_received_routes,
! 9999: show_ip_bgp_view_neighbor_received_routes_cmd,
! 10000: "show ip bgp view WORD neighbors (A.B.C.D|X:X::X:X) received-routes",
! 10001: SHOW_STR
! 10002: IP_STR
! 10003: BGP_STR
! 10004: "BGP view\n"
! 10005: "View name\n"
! 10006: "Detailed information on TCP and BGP neighbor connections\n"
! 10007: "Neighbor to display information about\n"
! 10008: "Neighbor to display information about\n"
! 10009: "Display the received routes from neighbor\n")
! 10010: {
! 10011: struct peer *peer;
! 10012:
! 10013: if (argc == 2)
! 10014: peer = peer_lookup_in_view (vty, argv[0], argv[1]);
! 10015: else
! 10016: peer = peer_lookup_in_view (vty, NULL, argv[0]);
! 10017:
! 10018: if (! peer)
! 10019: return CMD_WARNING;
! 10020:
! 10021: return peer_adj_routes (vty, peer, AFI_IP, SAFI_UNICAST, 1);
! 10022: }
! 10023:
! 10024: ALIAS (show_ip_bgp_view_neighbor_received_routes,
! 10025: show_ip_bgp_neighbor_received_routes_cmd,
! 10026: "show ip bgp neighbors (A.B.C.D|X:X::X:X) received-routes",
! 10027: SHOW_STR
! 10028: IP_STR
! 10029: BGP_STR
! 10030: "Detailed information on TCP and BGP neighbor connections\n"
! 10031: "Neighbor to display information about\n"
! 10032: "Neighbor to display information about\n"
! 10033: "Display the received routes from neighbor\n")
! 10034:
! 10035: DEFUN (show_ip_bgp_ipv4_neighbor_received_routes,
! 10036: show_ip_bgp_ipv4_neighbor_received_routes_cmd,
! 10037: "show ip bgp ipv4 (unicast|multicast) neighbors (A.B.C.D|X:X::X:X) received-routes",
! 10038: SHOW_STR
! 10039: IP_STR
! 10040: BGP_STR
! 10041: "Address family\n"
! 10042: "Address Family modifier\n"
! 10043: "Address Family modifier\n"
! 10044: "Detailed information on TCP and BGP neighbor connections\n"
! 10045: "Neighbor to display information about\n"
! 10046: "Neighbor to display information about\n"
! 10047: "Display the received routes from neighbor\n")
! 10048: {
! 10049: struct peer *peer;
! 10050:
! 10051: peer = peer_lookup_in_view (vty, NULL, argv[1]);
! 10052: if (! peer)
! 10053: return CMD_WARNING;
! 10054:
! 10055: if (strncmp (argv[0], "m", 1) == 0)
! 10056: return peer_adj_routes (vty, peer, AFI_IP, SAFI_MULTICAST, 1);
! 10057:
! 10058: return peer_adj_routes (vty, peer, AFI_IP, SAFI_UNICAST, 1);
! 10059: }
! 10060:
! 10061: DEFUN (show_bgp_view_afi_safi_neighbor_adv_recd_routes,
! 10062: show_bgp_view_afi_safi_neighbor_adv_recd_routes_cmd,
! 10063: #ifdef HAVE_IPV6
! 10064: "show bgp view WORD (ipv4|ipv6) (unicast|multicast) neighbors (A.B.C.D|X:X::X:X) (advertised-routes|received-routes)",
! 10065: #else
! 10066: "show bgp view WORD ipv4 (unicast|multicast) neighbors (A.B.C.D|X:X::X:X) (advertised-routes|received-routes)",
! 10067: #endif
! 10068: SHOW_STR
! 10069: BGP_STR
! 10070: "BGP view\n"
! 10071: "BGP view name\n"
! 10072: "Address family\n"
! 10073: #ifdef HAVE_IPV6
! 10074: "Address family\n"
! 10075: #endif
! 10076: "Address family modifier\n"
! 10077: "Address family modifier\n"
! 10078: "Detailed information on TCP and BGP neighbor connections\n"
! 10079: "Neighbor to display information about\n"
! 10080: "Neighbor to display information about\n"
! 10081: "Display the advertised routes to neighbor\n"
! 10082: "Display the received routes from neighbor\n")
! 10083: {
! 10084: int afi;
! 10085: int safi;
! 10086: int in;
! 10087: struct peer *peer;
! 10088:
! 10089: #ifdef HAVE_IPV6
! 10090: peer = peer_lookup_in_view (vty, argv[0], argv[3]);
! 10091: #else
! 10092: peer = peer_lookup_in_view (vty, argv[0], argv[2]);
! 10093: #endif
! 10094:
! 10095: if (! peer)
! 10096: return CMD_WARNING;
! 10097:
! 10098: #ifdef HAVE_IPV6
! 10099: afi = (strncmp (argv[1], "ipv6", 4) == 0) ? AFI_IP6 : AFI_IP;
! 10100: safi = (strncmp (argv[2], "m", 1) == 0) ? SAFI_MULTICAST : SAFI_UNICAST;
! 10101: in = (strncmp (argv[4], "r", 1) == 0) ? 1 : 0;
! 10102: #else
! 10103: afi = AFI_IP;
! 10104: safi = (strncmp (argv[1], "m", 1) == 0) ? SAFI_MULTICAST : SAFI_UNICAST;
! 10105: in = (strncmp (argv[3], "r", 1) == 0) ? 1 : 0;
! 10106: #endif
! 10107:
! 10108: return peer_adj_routes (vty, peer, afi, safi, in);
! 10109: }
! 10110:
! 10111: DEFUN (show_ip_bgp_neighbor_received_prefix_filter,
! 10112: show_ip_bgp_neighbor_received_prefix_filter_cmd,
! 10113: "show ip bgp neighbors (A.B.C.D|X:X::X:X) received prefix-filter",
! 10114: SHOW_STR
! 10115: IP_STR
! 10116: BGP_STR
! 10117: "Detailed information on TCP and BGP neighbor connections\n"
! 10118: "Neighbor to display information about\n"
! 10119: "Neighbor to display information about\n"
! 10120: "Display information received from a BGP neighbor\n"
! 10121: "Display the prefixlist filter\n")
! 10122: {
! 10123: char name[BUFSIZ];
! 10124: union sockunion *su;
! 10125: struct peer *peer;
! 10126: int count;
! 10127:
! 10128: su = sockunion_str2su (argv[0]);
! 10129: if (su == NULL)
! 10130: return CMD_WARNING;
! 10131:
! 10132: peer = peer_lookup (NULL, su);
! 10133: if (! peer)
! 10134: return CMD_WARNING;
! 10135:
! 10136: sprintf (name, "%s.%d.%d", peer->host, AFI_IP, SAFI_UNICAST);
! 10137: count = prefix_bgp_show_prefix_list (NULL, AFI_IP, name);
! 10138: if (count)
! 10139: {
! 10140: vty_out (vty, "Address family: IPv4 Unicast%s", VTY_NEWLINE);
! 10141: prefix_bgp_show_prefix_list (vty, AFI_IP, name);
! 10142: }
! 10143:
! 10144: return CMD_SUCCESS;
! 10145: }
! 10146:
! 10147: DEFUN (show_ip_bgp_ipv4_neighbor_received_prefix_filter,
! 10148: show_ip_bgp_ipv4_neighbor_received_prefix_filter_cmd,
! 10149: "show ip bgp ipv4 (unicast|multicast) neighbors (A.B.C.D|X:X::X:X) received prefix-filter",
! 10150: SHOW_STR
! 10151: IP_STR
! 10152: BGP_STR
! 10153: "Address family\n"
! 10154: "Address Family modifier\n"
! 10155: "Address Family modifier\n"
! 10156: "Detailed information on TCP and BGP neighbor connections\n"
! 10157: "Neighbor to display information about\n"
! 10158: "Neighbor to display information about\n"
! 10159: "Display information received from a BGP neighbor\n"
! 10160: "Display the prefixlist filter\n")
! 10161: {
! 10162: char name[BUFSIZ];
! 10163: union sockunion *su;
! 10164: struct peer *peer;
! 10165: int count;
! 10166:
! 10167: su = sockunion_str2su (argv[1]);
! 10168: if (su == NULL)
! 10169: return CMD_WARNING;
! 10170:
! 10171: peer = peer_lookup (NULL, su);
! 10172: if (! peer)
! 10173: return CMD_WARNING;
! 10174:
! 10175: if (strncmp (argv[0], "m", 1) == 0)
! 10176: {
! 10177: sprintf (name, "%s.%d.%d", peer->host, AFI_IP, SAFI_MULTICAST);
! 10178: count = prefix_bgp_show_prefix_list (NULL, AFI_IP, name);
! 10179: if (count)
! 10180: {
! 10181: vty_out (vty, "Address family: IPv4 Multicast%s", VTY_NEWLINE);
! 10182: prefix_bgp_show_prefix_list (vty, AFI_IP, name);
! 10183: }
! 10184: }
! 10185: else
! 10186: {
! 10187: sprintf (name, "%s.%d.%d", peer->host, AFI_IP, SAFI_UNICAST);
! 10188: count = prefix_bgp_show_prefix_list (NULL, AFI_IP, name);
! 10189: if (count)
! 10190: {
! 10191: vty_out (vty, "Address family: IPv4 Unicast%s", VTY_NEWLINE);
! 10192: prefix_bgp_show_prefix_list (vty, AFI_IP, name);
! 10193: }
! 10194: }
! 10195:
! 10196: return CMD_SUCCESS;
! 10197: }
! 10198:
! 10199:
! 10200: #ifdef HAVE_IPV6
! 10201: ALIAS (show_bgp_view_neighbor_received_routes,
! 10202: show_bgp_neighbor_received_routes_cmd,
! 10203: "show bgp neighbors (A.B.C.D|X:X::X:X) received-routes",
! 10204: SHOW_STR
! 10205: BGP_STR
! 10206: "Detailed information on TCP and BGP neighbor connections\n"
! 10207: "Neighbor to display information about\n"
! 10208: "Neighbor to display information about\n"
! 10209: "Display the received routes from neighbor\n")
! 10210:
! 10211: ALIAS (show_bgp_view_neighbor_received_routes,
! 10212: show_bgp_ipv6_neighbor_received_routes_cmd,
! 10213: "show bgp ipv6 neighbors (A.B.C.D|X:X::X:X) received-routes",
! 10214: SHOW_STR
! 10215: BGP_STR
! 10216: "Address family\n"
! 10217: "Detailed information on TCP and BGP neighbor connections\n"
! 10218: "Neighbor to display information about\n"
! 10219: "Neighbor to display information about\n"
! 10220: "Display the received routes from neighbor\n")
! 10221:
! 10222: DEFUN (show_bgp_neighbor_received_prefix_filter,
! 10223: show_bgp_neighbor_received_prefix_filter_cmd,
! 10224: "show bgp neighbors (A.B.C.D|X:X::X:X) received prefix-filter",
! 10225: SHOW_STR
! 10226: BGP_STR
! 10227: "Detailed information on TCP and BGP neighbor connections\n"
! 10228: "Neighbor to display information about\n"
! 10229: "Neighbor to display information about\n"
! 10230: "Display information received from a BGP neighbor\n"
! 10231: "Display the prefixlist filter\n")
! 10232: {
! 10233: char name[BUFSIZ];
! 10234: union sockunion *su;
! 10235: struct peer *peer;
! 10236: int count;
! 10237:
! 10238: su = sockunion_str2su (argv[0]);
! 10239: if (su == NULL)
! 10240: return CMD_WARNING;
! 10241:
! 10242: peer = peer_lookup (NULL, su);
! 10243: if (! peer)
! 10244: return CMD_WARNING;
! 10245:
! 10246: sprintf (name, "%s.%d.%d", peer->host, AFI_IP6, SAFI_UNICAST);
! 10247: count = prefix_bgp_show_prefix_list (NULL, AFI_IP6, name);
! 10248: if (count)
! 10249: {
! 10250: vty_out (vty, "Address family: IPv6 Unicast%s", VTY_NEWLINE);
! 10251: prefix_bgp_show_prefix_list (vty, AFI_IP6, name);
! 10252: }
! 10253:
! 10254: return CMD_SUCCESS;
! 10255: }
! 10256:
! 10257: ALIAS (show_bgp_neighbor_received_prefix_filter,
! 10258: show_bgp_ipv6_neighbor_received_prefix_filter_cmd,
! 10259: "show bgp ipv6 neighbors (A.B.C.D|X:X::X:X) received prefix-filter",
! 10260: SHOW_STR
! 10261: BGP_STR
! 10262: "Address family\n"
! 10263: "Detailed information on TCP and BGP neighbor connections\n"
! 10264: "Neighbor to display information about\n"
! 10265: "Neighbor to display information about\n"
! 10266: "Display information received from a BGP neighbor\n"
! 10267: "Display the prefixlist filter\n")
! 10268:
! 10269: /* old command */
! 10270: ALIAS (show_bgp_view_neighbor_received_routes,
! 10271: ipv6_bgp_neighbor_received_routes_cmd,
! 10272: "show ipv6 bgp neighbors (A.B.C.D|X:X::X:X) received-routes",
! 10273: SHOW_STR
! 10274: IPV6_STR
! 10275: BGP_STR
! 10276: "Detailed information on TCP and BGP neighbor connections\n"
! 10277: "Neighbor to display information about\n"
! 10278: "Neighbor to display information about\n"
! 10279: "Display the received routes from neighbor\n")
! 10280:
! 10281: /* old command */
! 10282: DEFUN (ipv6_mbgp_neighbor_received_routes,
! 10283: ipv6_mbgp_neighbor_received_routes_cmd,
! 10284: "show ipv6 mbgp neighbors (A.B.C.D|X:X::X:X) received-routes",
! 10285: SHOW_STR
! 10286: IPV6_STR
! 10287: MBGP_STR
! 10288: "Detailed information on TCP and BGP neighbor connections\n"
! 10289: "Neighbor to display information about\n"
! 10290: "Neighbor to display information about\n"
! 10291: "Display the received routes from neighbor\n")
! 10292: {
! 10293: struct peer *peer;
! 10294:
! 10295: peer = peer_lookup_in_view (vty, NULL, argv[0]);
! 10296: if (! peer)
! 10297: return CMD_WARNING;
! 10298:
! 10299: return peer_adj_routes (vty, peer, AFI_IP6, SAFI_MULTICAST, 1);
! 10300: }
! 10301:
! 10302: DEFUN (show_bgp_view_neighbor_received_prefix_filter,
! 10303: show_bgp_view_neighbor_received_prefix_filter_cmd,
! 10304: "show bgp view WORD neighbors (A.B.C.D|X:X::X:X) received prefix-filter",
! 10305: SHOW_STR
! 10306: BGP_STR
! 10307: "BGP view\n"
! 10308: "View name\n"
! 10309: "Detailed information on TCP and BGP neighbor connections\n"
! 10310: "Neighbor to display information about\n"
! 10311: "Neighbor to display information about\n"
! 10312: "Display information received from a BGP neighbor\n"
! 10313: "Display the prefixlist filter\n")
! 10314: {
! 10315: char name[BUFSIZ];
! 10316: union sockunion *su;
! 10317: struct peer *peer;
! 10318: struct bgp *bgp;
! 10319: int count;
! 10320:
! 10321: /* BGP structure lookup. */
! 10322: bgp = bgp_lookup_by_name (argv[0]);
! 10323: if (bgp == NULL)
! 10324: {
! 10325: vty_out (vty, "Can't find BGP view %s%s", argv[0], VTY_NEWLINE);
! 10326: return CMD_WARNING;
! 10327: }
! 10328:
! 10329: su = sockunion_str2su (argv[1]);
! 10330: if (su == NULL)
! 10331: return CMD_WARNING;
! 10332:
! 10333: peer = peer_lookup (bgp, su);
! 10334: if (! peer)
! 10335: return CMD_WARNING;
! 10336:
! 10337: sprintf (name, "%s.%d.%d", peer->host, AFI_IP6, SAFI_UNICAST);
! 10338: count = prefix_bgp_show_prefix_list (NULL, AFI_IP6, name);
! 10339: if (count)
! 10340: {
! 10341: vty_out (vty, "Address family: IPv6 Unicast%s", VTY_NEWLINE);
! 10342: prefix_bgp_show_prefix_list (vty, AFI_IP6, name);
! 10343: }
! 10344:
! 10345: return CMD_SUCCESS;
! 10346: }
! 10347:
! 10348: ALIAS (show_bgp_view_neighbor_received_prefix_filter,
! 10349: show_bgp_view_ipv6_neighbor_received_prefix_filter_cmd,
! 10350: "show bgp view WORD ipv6 neighbors (A.B.C.D|X:X::X:X) received prefix-filter",
! 10351: SHOW_STR
! 10352: BGP_STR
! 10353: "BGP view\n"
! 10354: "View name\n"
! 10355: "Address family\n"
! 10356: "Detailed information on TCP and BGP neighbor connections\n"
! 10357: "Neighbor to display information about\n"
! 10358: "Neighbor to display information about\n"
! 10359: "Display information received from a BGP neighbor\n"
! 10360: "Display the prefixlist filter\n")
! 10361: #endif /* HAVE_IPV6 */
! 10362:
! 10363: static int
! 10364: bgp_show_neighbor_route (struct vty *vty, struct peer *peer, afi_t afi,
! 10365: safi_t safi, enum bgp_show_type type)
! 10366: {
! 10367: if (! peer || ! peer->afc[afi][safi])
! 10368: {
! 10369: vty_out (vty, "%% No such neighbor or address family%s", VTY_NEWLINE);
! 10370: return CMD_WARNING;
! 10371: }
! 10372:
! 10373: return bgp_show (vty, peer->bgp, afi, safi, type, &peer->su);
! 10374: }
! 10375:
! 10376: DEFUN (show_ip_bgp_neighbor_routes,
! 10377: show_ip_bgp_neighbor_routes_cmd,
! 10378: "show ip bgp neighbors (A.B.C.D|X:X::X:X) routes",
! 10379: SHOW_STR
! 10380: IP_STR
! 10381: BGP_STR
! 10382: "Detailed information on TCP and BGP neighbor connections\n"
! 10383: "Neighbor to display information about\n"
! 10384: "Neighbor to display information about\n"
! 10385: "Display routes learned from neighbor\n")
! 10386: {
! 10387: struct peer *peer;
! 10388:
! 10389: peer = peer_lookup_in_view (vty, NULL, argv[0]);
! 10390: if (! peer)
! 10391: return CMD_WARNING;
! 10392:
! 10393: return bgp_show_neighbor_route (vty, peer, AFI_IP, SAFI_UNICAST,
! 10394: bgp_show_type_neighbor);
! 10395: }
! 10396:
! 10397: DEFUN (show_ip_bgp_neighbor_flap,
! 10398: show_ip_bgp_neighbor_flap_cmd,
! 10399: "show ip bgp neighbors (A.B.C.D|X:X::X:X) flap-statistics",
! 10400: SHOW_STR
! 10401: IP_STR
! 10402: BGP_STR
! 10403: "Detailed information on TCP and BGP neighbor connections\n"
! 10404: "Neighbor to display information about\n"
! 10405: "Neighbor to display information about\n"
! 10406: "Display flap statistics of the routes learned from neighbor\n")
! 10407: {
! 10408: struct peer *peer;
! 10409:
! 10410: peer = peer_lookup_in_view (vty, NULL, argv[0]);
! 10411: if (! peer)
! 10412: return CMD_WARNING;
! 10413:
! 10414: return bgp_show_neighbor_route (vty, peer, AFI_IP, SAFI_UNICAST,
! 10415: bgp_show_type_flap_neighbor);
! 10416: }
! 10417:
! 10418: DEFUN (show_ip_bgp_neighbor_damp,
! 10419: show_ip_bgp_neighbor_damp_cmd,
! 10420: "show ip bgp neighbors (A.B.C.D|X:X::X:X) dampened-routes",
! 10421: SHOW_STR
! 10422: IP_STR
! 10423: BGP_STR
! 10424: "Detailed information on TCP and BGP neighbor connections\n"
! 10425: "Neighbor to display information about\n"
! 10426: "Neighbor to display information about\n"
! 10427: "Display the dampened routes received from neighbor\n")
! 10428: {
! 10429: struct peer *peer;
! 10430:
! 10431: peer = peer_lookup_in_view (vty, NULL, argv[0]);
! 10432: if (! peer)
! 10433: return CMD_WARNING;
! 10434:
! 10435: return bgp_show_neighbor_route (vty, peer, AFI_IP, SAFI_UNICAST,
! 10436: bgp_show_type_damp_neighbor);
! 10437: }
! 10438:
! 10439: DEFUN (show_ip_bgp_ipv4_neighbor_routes,
! 10440: show_ip_bgp_ipv4_neighbor_routes_cmd,
! 10441: "show ip bgp ipv4 (unicast|multicast) neighbors (A.B.C.D|X:X::X:X) routes",
! 10442: SHOW_STR
! 10443: IP_STR
! 10444: BGP_STR
! 10445: "Address family\n"
! 10446: "Address Family modifier\n"
! 10447: "Address Family modifier\n"
! 10448: "Detailed information on TCP and BGP neighbor connections\n"
! 10449: "Neighbor to display information about\n"
! 10450: "Neighbor to display information about\n"
! 10451: "Display routes learned from neighbor\n")
! 10452: {
! 10453: struct peer *peer;
! 10454:
! 10455: peer = peer_lookup_in_view (vty, NULL, argv[1]);
! 10456: if (! peer)
! 10457: return CMD_WARNING;
! 10458:
! 10459: if (strncmp (argv[0], "m", 1) == 0)
! 10460: return bgp_show_neighbor_route (vty, peer, AFI_IP, SAFI_MULTICAST,
! 10461: bgp_show_type_neighbor);
! 10462:
! 10463: return bgp_show_neighbor_route (vty, peer, AFI_IP, SAFI_UNICAST,
! 10464: bgp_show_type_neighbor);
! 10465: }
! 10466:
! 10467: DEFUN (show_ip_bgp_view_rsclient,
! 10468: show_ip_bgp_view_rsclient_cmd,
! 10469: "show ip bgp view WORD rsclient (A.B.C.D|X:X::X:X)",
! 10470: SHOW_STR
! 10471: IP_STR
! 10472: BGP_STR
! 10473: "BGP view\n"
! 10474: "BGP view name\n"
! 10475: "Information about Route Server Client\n"
! 10476: NEIGHBOR_ADDR_STR)
! 10477: {
! 10478: struct bgp_table *table;
! 10479: struct peer *peer;
! 10480:
! 10481: if (argc == 2)
! 10482: peer = peer_lookup_in_view (vty, argv[0], argv[1]);
! 10483: else
! 10484: peer = peer_lookup_in_view (vty, NULL, argv[0]);
! 10485:
! 10486: if (! peer)
! 10487: return CMD_WARNING;
! 10488:
! 10489: if (! peer->afc[AFI_IP][SAFI_UNICAST])
! 10490: {
! 10491: vty_out (vty, "%% Activate the neighbor for the address family first%s",
! 10492: VTY_NEWLINE);
! 10493: return CMD_WARNING;
! 10494: }
! 10495:
! 10496: if ( ! CHECK_FLAG (peer->af_flags[AFI_IP][SAFI_UNICAST],
! 10497: PEER_FLAG_RSERVER_CLIENT))
! 10498: {
! 10499: vty_out (vty, "%% Neighbor is not a Route-Server client%s",
! 10500: VTY_NEWLINE);
! 10501: return CMD_WARNING;
! 10502: }
! 10503:
! 10504: table = peer->rib[AFI_IP][SAFI_UNICAST];
! 10505:
! 10506: return bgp_show_table (vty, table, &peer->remote_id, bgp_show_type_normal, NULL);
! 10507: }
! 10508:
! 10509: ALIAS (show_ip_bgp_view_rsclient,
! 10510: show_ip_bgp_rsclient_cmd,
! 10511: "show ip bgp rsclient (A.B.C.D|X:X::X:X)",
! 10512: SHOW_STR
! 10513: IP_STR
! 10514: BGP_STR
! 10515: "Information about Route Server Client\n"
! 10516: NEIGHBOR_ADDR_STR)
! 10517:
! 10518: DEFUN (show_bgp_view_ipv4_safi_rsclient,
! 10519: show_bgp_view_ipv4_safi_rsclient_cmd,
! 10520: "show bgp view WORD ipv4 (unicast|multicast) rsclient (A.B.C.D|X:X::X:X)",
! 10521: SHOW_STR
! 10522: BGP_STR
! 10523: "BGP view\n"
! 10524: "BGP view name\n"
! 10525: "Address family\n"
! 10526: "Address Family modifier\n"
! 10527: "Address Family modifier\n"
! 10528: "Information about Route Server Client\n"
! 10529: NEIGHBOR_ADDR_STR)
! 10530: {
! 10531: struct bgp_table *table;
! 10532: struct peer *peer;
! 10533: safi_t safi;
! 10534:
! 10535: if (argc == 3) {
! 10536: peer = peer_lookup_in_view (vty, argv[0], argv[2]);
! 10537: safi = (strncmp (argv[1], "m", 1) == 0) ? SAFI_MULTICAST : SAFI_UNICAST;
! 10538: } else {
! 10539: peer = peer_lookup_in_view (vty, NULL, argv[1]);
! 10540: safi = (strncmp (argv[0], "m", 1) == 0) ? SAFI_MULTICAST : SAFI_UNICAST;
! 10541: }
! 10542:
! 10543: if (! peer)
! 10544: return CMD_WARNING;
! 10545:
! 10546: if (! peer->afc[AFI_IP][safi])
! 10547: {
! 10548: vty_out (vty, "%% Activate the neighbor for the address family first%s",
! 10549: VTY_NEWLINE);
! 10550: return CMD_WARNING;
! 10551: }
! 10552:
! 10553: if ( ! CHECK_FLAG (peer->af_flags[AFI_IP][safi],
! 10554: PEER_FLAG_RSERVER_CLIENT))
! 10555: {
! 10556: vty_out (vty, "%% Neighbor is not a Route-Server client%s",
! 10557: VTY_NEWLINE);
! 10558: return CMD_WARNING;
! 10559: }
! 10560:
! 10561: table = peer->rib[AFI_IP][safi];
! 10562:
! 10563: return bgp_show_table (vty, table, &peer->remote_id, bgp_show_type_normal, NULL);
! 10564: }
! 10565:
! 10566: ALIAS (show_bgp_view_ipv4_safi_rsclient,
! 10567: show_bgp_ipv4_safi_rsclient_cmd,
! 10568: "show bgp ipv4 (unicast|multicast) rsclient (A.B.C.D|X:X::X:X)",
! 10569: SHOW_STR
! 10570: BGP_STR
! 10571: "Address family\n"
! 10572: "Address Family modifier\n"
! 10573: "Address Family modifier\n"
! 10574: "Information about Route Server Client\n"
! 10575: NEIGHBOR_ADDR_STR)
! 10576:
! 10577: DEFUN (show_ip_bgp_view_rsclient_route,
! 10578: show_ip_bgp_view_rsclient_route_cmd,
! 10579: "show ip bgp view WORD rsclient (A.B.C.D|X:X::X:X) A.B.C.D",
! 10580: SHOW_STR
! 10581: IP_STR
! 10582: BGP_STR
! 10583: "BGP view\n"
! 10584: "BGP view name\n"
! 10585: "Information about Route Server Client\n"
! 10586: NEIGHBOR_ADDR_STR
! 10587: "Network in the BGP routing table to display\n")
! 10588: {
! 10589: struct bgp *bgp;
! 10590: struct peer *peer;
! 10591:
! 10592: /* BGP structure lookup. */
! 10593: if (argc == 3)
! 10594: {
! 10595: bgp = bgp_lookup_by_name (argv[0]);
! 10596: if (bgp == NULL)
! 10597: {
! 10598: vty_out (vty, "Can't find BGP view %s%s", argv[0], VTY_NEWLINE);
! 10599: return CMD_WARNING;
! 10600: }
! 10601: }
! 10602: else
! 10603: {
! 10604: bgp = bgp_get_default ();
! 10605: if (bgp == NULL)
! 10606: {
! 10607: vty_out (vty, "No BGP process is configured%s", VTY_NEWLINE);
! 10608: return CMD_WARNING;
! 10609: }
! 10610: }
! 10611:
! 10612: if (argc == 3)
! 10613: peer = peer_lookup_in_view (vty, argv[0], argv[1]);
! 10614: else
! 10615: peer = peer_lookup_in_view (vty, NULL, argv[0]);
! 10616:
! 10617: if (! peer)
! 10618: return CMD_WARNING;
! 10619:
! 10620: if (! peer->afc[AFI_IP][SAFI_UNICAST])
! 10621: {
! 10622: vty_out (vty, "%% Activate the neighbor for the address family first%s",
! 10623: VTY_NEWLINE);
! 10624: return CMD_WARNING;
! 10625: }
! 10626:
! 10627: if ( ! CHECK_FLAG (peer->af_flags[AFI_IP][SAFI_UNICAST],
! 10628: PEER_FLAG_RSERVER_CLIENT))
! 10629: {
! 10630: vty_out (vty, "%% Neighbor is not a Route-Server client%s",
! 10631: VTY_NEWLINE);
! 10632: return CMD_WARNING;
! 10633: }
! 10634:
! 10635: return bgp_show_route_in_table (vty, bgp, peer->rib[AFI_IP][SAFI_UNICAST],
! 10636: (argc == 3) ? argv[2] : argv[1],
! 10637: AFI_IP, SAFI_UNICAST, NULL, 0);
! 10638: }
! 10639:
! 10640: ALIAS (show_ip_bgp_view_rsclient_route,
! 10641: show_ip_bgp_rsclient_route_cmd,
! 10642: "show ip bgp rsclient (A.B.C.D|X:X::X:X) A.B.C.D",
! 10643: SHOW_STR
! 10644: IP_STR
! 10645: BGP_STR
! 10646: "Information about Route Server Client\n"
! 10647: NEIGHBOR_ADDR_STR
! 10648: "Network in the BGP routing table to display\n")
! 10649:
! 10650: DEFUN (show_bgp_view_ipv4_safi_rsclient_route,
! 10651: show_bgp_view_ipv4_safi_rsclient_route_cmd,
! 10652: "show bgp view WORD ipv4 (unicast|multicast) rsclient (A.B.C.D|X:X::X:X) A.B.C.D",
! 10653: SHOW_STR
! 10654: BGP_STR
! 10655: "BGP view\n"
! 10656: "BGP view name\n"
! 10657: "Address family\n"
! 10658: "Address Family modifier\n"
! 10659: "Address Family modifier\n"
! 10660: "Information about Route Server Client\n"
! 10661: NEIGHBOR_ADDR_STR
! 10662: "Network in the BGP routing table to display\n")
! 10663: {
! 10664: struct bgp *bgp;
! 10665: struct peer *peer;
! 10666: safi_t safi;
! 10667:
! 10668: /* BGP structure lookup. */
! 10669: if (argc == 4)
! 10670: {
! 10671: bgp = bgp_lookup_by_name (argv[0]);
! 10672: if (bgp == NULL)
! 10673: {
! 10674: vty_out (vty, "Can't find BGP view %s%s", argv[0], VTY_NEWLINE);
! 10675: return CMD_WARNING;
! 10676: }
! 10677: }
! 10678: else
! 10679: {
! 10680: bgp = bgp_get_default ();
! 10681: if (bgp == NULL)
! 10682: {
! 10683: vty_out (vty, "No BGP process is configured%s", VTY_NEWLINE);
! 10684: return CMD_WARNING;
! 10685: }
! 10686: }
! 10687:
! 10688: if (argc == 4) {
! 10689: peer = peer_lookup_in_view (vty, argv[0], argv[2]);
! 10690: safi = (strncmp (argv[1], "m", 1) == 0) ? SAFI_MULTICAST : SAFI_UNICAST;
! 10691: } else {
! 10692: peer = peer_lookup_in_view (vty, NULL, argv[1]);
! 10693: safi = (strncmp (argv[0], "m", 1) == 0) ? SAFI_MULTICAST : SAFI_UNICAST;
! 10694: }
! 10695:
! 10696: if (! peer)
! 10697: return CMD_WARNING;
! 10698:
! 10699: if (! peer->afc[AFI_IP][safi])
! 10700: {
! 10701: vty_out (vty, "%% Activate the neighbor for the address family first%s",
! 10702: VTY_NEWLINE);
! 10703: return CMD_WARNING;
! 10704: }
! 10705:
! 10706: if ( ! CHECK_FLAG (peer->af_flags[AFI_IP][safi],
! 10707: PEER_FLAG_RSERVER_CLIENT))
! 10708: {
! 10709: vty_out (vty, "%% Neighbor is not a Route-Server client%s",
! 10710: VTY_NEWLINE);
! 10711: return CMD_WARNING;
! 10712: }
! 10713:
! 10714: return bgp_show_route_in_table (vty, bgp, peer->rib[AFI_IP][safi],
! 10715: (argc == 4) ? argv[3] : argv[2],
! 10716: AFI_IP, safi, NULL, 0);
! 10717: }
! 10718:
! 10719: ALIAS (show_bgp_view_ipv4_safi_rsclient_route,
! 10720: show_bgp_ipv4_safi_rsclient_route_cmd,
! 10721: "show bgp ipv4 (unicast|multicast) rsclient (A.B.C.D|X:X::X:X) A.B.C.D",
! 10722: SHOW_STR
! 10723: BGP_STR
! 10724: "Address family\n"
! 10725: "Address Family modifier\n"
! 10726: "Address Family modifier\n"
! 10727: "Information about Route Server Client\n"
! 10728: NEIGHBOR_ADDR_STR
! 10729: "Network in the BGP routing table to display\n")
! 10730:
! 10731: DEFUN (show_ip_bgp_view_rsclient_prefix,
! 10732: show_ip_bgp_view_rsclient_prefix_cmd,
! 10733: "show ip bgp view WORD rsclient (A.B.C.D|X:X::X:X) A.B.C.D/M",
! 10734: SHOW_STR
! 10735: IP_STR
! 10736: BGP_STR
! 10737: "BGP view\n"
! 10738: "BGP view name\n"
! 10739: "Information about Route Server Client\n"
! 10740: NEIGHBOR_ADDR_STR
! 10741: "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n")
! 10742: {
! 10743: struct bgp *bgp;
! 10744: struct peer *peer;
! 10745:
! 10746: /* BGP structure lookup. */
! 10747: if (argc == 3)
! 10748: {
! 10749: bgp = bgp_lookup_by_name (argv[0]);
! 10750: if (bgp == NULL)
! 10751: {
! 10752: vty_out (vty, "Can't find BGP view %s%s", argv[0], VTY_NEWLINE);
! 10753: return CMD_WARNING;
! 10754: }
! 10755: }
! 10756: else
! 10757: {
! 10758: bgp = bgp_get_default ();
! 10759: if (bgp == NULL)
! 10760: {
! 10761: vty_out (vty, "No BGP process is configured%s", VTY_NEWLINE);
! 10762: return CMD_WARNING;
! 10763: }
! 10764: }
! 10765:
! 10766: if (argc == 3)
! 10767: peer = peer_lookup_in_view (vty, argv[0], argv[1]);
! 10768: else
! 10769: peer = peer_lookup_in_view (vty, NULL, argv[0]);
! 10770:
! 10771: if (! peer)
! 10772: return CMD_WARNING;
! 10773:
! 10774: if (! peer->afc[AFI_IP][SAFI_UNICAST])
! 10775: {
! 10776: vty_out (vty, "%% Activate the neighbor for the address family first%s",
! 10777: VTY_NEWLINE);
! 10778: return CMD_WARNING;
! 10779: }
! 10780:
! 10781: if ( ! CHECK_FLAG (peer->af_flags[AFI_IP][SAFI_UNICAST],
! 10782: PEER_FLAG_RSERVER_CLIENT))
! 10783: {
! 10784: vty_out (vty, "%% Neighbor is not a Route-Server client%s",
! 10785: VTY_NEWLINE);
! 10786: return CMD_WARNING;
! 10787: }
! 10788:
! 10789: return bgp_show_route_in_table (vty, bgp, peer->rib[AFI_IP][SAFI_UNICAST],
! 10790: (argc == 3) ? argv[2] : argv[1],
! 10791: AFI_IP, SAFI_UNICAST, NULL, 1);
! 10792: }
! 10793:
! 10794: ALIAS (show_ip_bgp_view_rsclient_prefix,
! 10795: show_ip_bgp_rsclient_prefix_cmd,
! 10796: "show ip bgp rsclient (A.B.C.D|X:X::X:X) A.B.C.D/M",
! 10797: SHOW_STR
! 10798: IP_STR
! 10799: BGP_STR
! 10800: "Information about Route Server Client\n"
! 10801: NEIGHBOR_ADDR_STR
! 10802: "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n")
! 10803:
! 10804: DEFUN (show_bgp_view_ipv4_safi_rsclient_prefix,
! 10805: show_bgp_view_ipv4_safi_rsclient_prefix_cmd,
! 10806: "show bgp view WORD ipv4 (unicast|multicast) rsclient (A.B.C.D|X:X::X:X) A.B.C.D/M",
! 10807: SHOW_STR
! 10808: BGP_STR
! 10809: "BGP view\n"
! 10810: "BGP view name\n"
! 10811: "Address family\n"
! 10812: "Address Family modifier\n"
! 10813: "Address Family modifier\n"
! 10814: "Information about Route Server Client\n"
! 10815: NEIGHBOR_ADDR_STR
! 10816: "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n")
! 10817: {
! 10818: struct bgp *bgp;
! 10819: struct peer *peer;
! 10820: safi_t safi;
! 10821:
! 10822: /* BGP structure lookup. */
! 10823: if (argc == 4)
! 10824: {
! 10825: bgp = bgp_lookup_by_name (argv[0]);
! 10826: if (bgp == NULL)
! 10827: {
! 10828: vty_out (vty, "Can't find BGP view %s%s", argv[0], VTY_NEWLINE);
! 10829: return CMD_WARNING;
! 10830: }
! 10831: }
! 10832: else
! 10833: {
! 10834: bgp = bgp_get_default ();
! 10835: if (bgp == NULL)
! 10836: {
! 10837: vty_out (vty, "No BGP process is configured%s", VTY_NEWLINE);
! 10838: return CMD_WARNING;
! 10839: }
! 10840: }
! 10841:
! 10842: if (argc == 4) {
! 10843: peer = peer_lookup_in_view (vty, argv[0], argv[2]);
! 10844: safi = (strncmp (argv[1], "m", 1) == 0) ? SAFI_MULTICAST : SAFI_UNICAST;
! 10845: } else {
! 10846: peer = peer_lookup_in_view (vty, NULL, argv[1]);
! 10847: safi = (strncmp (argv[0], "m", 1) == 0) ? SAFI_MULTICAST : SAFI_UNICAST;
! 10848: }
! 10849:
! 10850: if (! peer)
! 10851: return CMD_WARNING;
! 10852:
! 10853: if (! peer->afc[AFI_IP][safi])
! 10854: {
! 10855: vty_out (vty, "%% Activate the neighbor for the address family first%s",
! 10856: VTY_NEWLINE);
! 10857: return CMD_WARNING;
! 10858: }
! 10859:
! 10860: if ( ! CHECK_FLAG (peer->af_flags[AFI_IP][safi],
! 10861: PEER_FLAG_RSERVER_CLIENT))
! 10862: {
! 10863: vty_out (vty, "%% Neighbor is not a Route-Server client%s",
! 10864: VTY_NEWLINE);
! 10865: return CMD_WARNING;
! 10866: }
! 10867:
! 10868: return bgp_show_route_in_table (vty, bgp, peer->rib[AFI_IP][safi],
! 10869: (argc == 4) ? argv[3] : argv[2],
! 10870: AFI_IP, safi, NULL, 1);
! 10871: }
! 10872:
! 10873: ALIAS (show_bgp_view_ipv4_safi_rsclient_prefix,
! 10874: show_bgp_ipv4_safi_rsclient_prefix_cmd,
! 10875: "show bgp ipv4 (unicast|multicast) rsclient (A.B.C.D|X:X::X:X) A.B.C.D/M",
! 10876: SHOW_STR
! 10877: BGP_STR
! 10878: "Address family\n"
! 10879: "Address Family modifier\n"
! 10880: "Address Family modifier\n"
! 10881: "Information about Route Server Client\n"
! 10882: NEIGHBOR_ADDR_STR
! 10883: "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n")
! 10884:
! 10885: #ifdef HAVE_IPV6
! 10886: DEFUN (show_bgp_view_neighbor_routes,
! 10887: show_bgp_view_neighbor_routes_cmd,
! 10888: "show bgp view WORD neighbors (A.B.C.D|X:X::X:X) routes",
! 10889: SHOW_STR
! 10890: BGP_STR
! 10891: "BGP view\n"
! 10892: "BGP view name\n"
! 10893: "Detailed information on TCP and BGP neighbor connections\n"
! 10894: "Neighbor to display information about\n"
! 10895: "Neighbor to display information about\n"
! 10896: "Display routes learned from neighbor\n")
! 10897: {
! 10898: struct peer *peer;
! 10899:
! 10900: if (argc == 2)
! 10901: peer = peer_lookup_in_view (vty, argv[0], argv[1]);
! 10902: else
! 10903: peer = peer_lookup_in_view (vty, NULL, argv[0]);
! 10904:
! 10905: if (! peer)
! 10906: return CMD_WARNING;
! 10907:
! 10908: return bgp_show_neighbor_route (vty, peer, AFI_IP6, SAFI_UNICAST,
! 10909: bgp_show_type_neighbor);
! 10910: }
! 10911:
! 10912: ALIAS (show_bgp_view_neighbor_routes,
! 10913: show_bgp_view_ipv6_neighbor_routes_cmd,
! 10914: "show bgp view WORD ipv6 neighbors (A.B.C.D|X:X::X:X) routes",
! 10915: SHOW_STR
! 10916: BGP_STR
! 10917: "BGP view\n"
! 10918: "BGP view name\n"
! 10919: "Address family\n"
! 10920: "Detailed information on TCP and BGP neighbor connections\n"
! 10921: "Neighbor to display information about\n"
! 10922: "Neighbor to display information about\n"
! 10923: "Display routes learned from neighbor\n")
! 10924:
! 10925: DEFUN (show_bgp_view_neighbor_damp,
! 10926: show_bgp_view_neighbor_damp_cmd,
! 10927: "show bgp view WORD neighbors (A.B.C.D|X:X::X:X) dampened-routes",
! 10928: SHOW_STR
! 10929: BGP_STR
! 10930: "BGP view\n"
! 10931: "BGP view name\n"
! 10932: "Detailed information on TCP and BGP neighbor connections\n"
! 10933: "Neighbor to display information about\n"
! 10934: "Neighbor to display information about\n"
! 10935: "Display the dampened routes received from neighbor\n")
! 10936: {
! 10937: struct peer *peer;
! 10938:
! 10939: if (argc == 2)
! 10940: peer = peer_lookup_in_view (vty, argv[0], argv[1]);
! 10941: else
! 10942: peer = peer_lookup_in_view (vty, NULL, argv[0]);
! 10943:
! 10944: if (! peer)
! 10945: return CMD_WARNING;
! 10946:
! 10947: return bgp_show_neighbor_route (vty, peer, AFI_IP6, SAFI_UNICAST,
! 10948: bgp_show_type_damp_neighbor);
! 10949: }
! 10950:
! 10951: ALIAS (show_bgp_view_neighbor_damp,
! 10952: show_bgp_view_ipv6_neighbor_damp_cmd,
! 10953: "show bgp view WORD ipv6 neighbors (A.B.C.D|X:X::X:X) dampened-routes",
! 10954: SHOW_STR
! 10955: BGP_STR
! 10956: "BGP view\n"
! 10957: "BGP view name\n"
! 10958: "Address family\n"
! 10959: "Detailed information on TCP and BGP neighbor connections\n"
! 10960: "Neighbor to display information about\n"
! 10961: "Neighbor to display information about\n"
! 10962: "Display the dampened routes received from neighbor\n")
! 10963:
! 10964: DEFUN (show_bgp_view_neighbor_flap,
! 10965: show_bgp_view_neighbor_flap_cmd,
! 10966: "show bgp view WORD neighbors (A.B.C.D|X:X::X:X) flap-statistics",
! 10967: SHOW_STR
! 10968: BGP_STR
! 10969: "BGP view\n"
! 10970: "BGP view name\n"
! 10971: "Detailed information on TCP and BGP neighbor connections\n"
! 10972: "Neighbor to display information about\n"
! 10973: "Neighbor to display information about\n"
! 10974: "Display flap statistics of the routes learned from neighbor\n")
! 10975: {
! 10976: struct peer *peer;
! 10977:
! 10978: if (argc == 2)
! 10979: peer = peer_lookup_in_view (vty, argv[0], argv[1]);
! 10980: else
! 10981: peer = peer_lookup_in_view (vty, NULL, argv[0]);
! 10982:
! 10983: if (! peer)
! 10984: return CMD_WARNING;
! 10985:
! 10986: return bgp_show_neighbor_route (vty, peer, AFI_IP6, SAFI_UNICAST,
! 10987: bgp_show_type_flap_neighbor);
! 10988: }
! 10989:
! 10990: ALIAS (show_bgp_view_neighbor_flap,
! 10991: show_bgp_view_ipv6_neighbor_flap_cmd,
! 10992: "show bgp view WORD ipv6 neighbors (A.B.C.D|X:X::X:X) flap-statistics",
! 10993: SHOW_STR
! 10994: BGP_STR
! 10995: "BGP view\n"
! 10996: "BGP view name\n"
! 10997: "Address family\n"
! 10998: "Detailed information on TCP and BGP neighbor connections\n"
! 10999: "Neighbor to display information about\n"
! 11000: "Neighbor to display information about\n"
! 11001: "Display flap statistics of the routes learned from neighbor\n")
! 11002:
! 11003: ALIAS (show_bgp_view_neighbor_routes,
! 11004: show_bgp_neighbor_routes_cmd,
! 11005: "show bgp neighbors (A.B.C.D|X:X::X:X) routes",
! 11006: SHOW_STR
! 11007: BGP_STR
! 11008: "Detailed information on TCP and BGP neighbor connections\n"
! 11009: "Neighbor to display information about\n"
! 11010: "Neighbor to display information about\n"
! 11011: "Display routes learned from neighbor\n")
! 11012:
! 11013:
! 11014: ALIAS (show_bgp_view_neighbor_routes,
! 11015: show_bgp_ipv6_neighbor_routes_cmd,
! 11016: "show bgp ipv6 neighbors (A.B.C.D|X:X::X:X) routes",
! 11017: SHOW_STR
! 11018: BGP_STR
! 11019: "Address family\n"
! 11020: "Detailed information on TCP and BGP neighbor connections\n"
! 11021: "Neighbor to display information about\n"
! 11022: "Neighbor to display information about\n"
! 11023: "Display routes learned from neighbor\n")
! 11024:
! 11025: /* old command */
! 11026: ALIAS (show_bgp_view_neighbor_routes,
! 11027: ipv6_bgp_neighbor_routes_cmd,
! 11028: "show ipv6 bgp neighbors (A.B.C.D|X:X::X:X) routes",
! 11029: SHOW_STR
! 11030: IPV6_STR
! 11031: BGP_STR
! 11032: "Detailed information on TCP and BGP neighbor connections\n"
! 11033: "Neighbor to display information about\n"
! 11034: "Neighbor to display information about\n"
! 11035: "Display routes learned from neighbor\n")
! 11036:
! 11037: /* old command */
! 11038: DEFUN (ipv6_mbgp_neighbor_routes,
! 11039: ipv6_mbgp_neighbor_routes_cmd,
! 11040: "show ipv6 mbgp neighbors (A.B.C.D|X:X::X:X) routes",
! 11041: SHOW_STR
! 11042: IPV6_STR
! 11043: MBGP_STR
! 11044: "Detailed information on TCP and BGP neighbor connections\n"
! 11045: "Neighbor to display information about\n"
! 11046: "Neighbor to display information about\n"
! 11047: "Display routes learned from neighbor\n")
! 11048: {
! 11049: struct peer *peer;
! 11050:
! 11051: peer = peer_lookup_in_view (vty, NULL, argv[0]);
! 11052: if (! peer)
! 11053: return CMD_WARNING;
! 11054:
! 11055: return bgp_show_neighbor_route (vty, peer, AFI_IP6, SAFI_MULTICAST,
! 11056: bgp_show_type_neighbor);
! 11057: }
! 11058:
! 11059: ALIAS (show_bgp_view_neighbor_flap,
! 11060: show_bgp_neighbor_flap_cmd,
! 11061: "show bgp neighbors (A.B.C.D|X:X::X:X) flap-statistics",
! 11062: SHOW_STR
! 11063: BGP_STR
! 11064: "Detailed information on TCP and BGP neighbor connections\n"
! 11065: "Neighbor to display information about\n"
! 11066: "Neighbor to display information about\n"
! 11067: "Display flap statistics of the routes learned from neighbor\n")
! 11068:
! 11069: ALIAS (show_bgp_view_neighbor_flap,
! 11070: show_bgp_ipv6_neighbor_flap_cmd,
! 11071: "show bgp ipv6 neighbors (A.B.C.D|X:X::X:X) flap-statistics",
! 11072: SHOW_STR
! 11073: BGP_STR
! 11074: "Address family\n"
! 11075: "Detailed information on TCP and BGP neighbor connections\n"
! 11076: "Neighbor to display information about\n"
! 11077: "Neighbor to display information about\n"
! 11078: "Display flap statistics of the routes learned from neighbor\n")
! 11079:
! 11080: ALIAS (show_bgp_view_neighbor_damp,
! 11081: show_bgp_neighbor_damp_cmd,
! 11082: "show bgp neighbors (A.B.C.D|X:X::X:X) dampened-routes",
! 11083: SHOW_STR
! 11084: BGP_STR
! 11085: "Detailed information on TCP and BGP neighbor connections\n"
! 11086: "Neighbor to display information about\n"
! 11087: "Neighbor to display information about\n"
! 11088: "Display the dampened routes received from neighbor\n")
! 11089:
! 11090: ALIAS (show_bgp_view_neighbor_damp,
! 11091: show_bgp_ipv6_neighbor_damp_cmd,
! 11092: "show bgp ipv6 neighbors (A.B.C.D|X:X::X:X) dampened-routes",
! 11093: SHOW_STR
! 11094: BGP_STR
! 11095: "Address family\n"
! 11096: "Detailed information on TCP and BGP neighbor connections\n"
! 11097: "Neighbor to display information about\n"
! 11098: "Neighbor to display information about\n"
! 11099: "Display the dampened routes received from neighbor\n")
! 11100:
! 11101: DEFUN (show_bgp_view_rsclient,
! 11102: show_bgp_view_rsclient_cmd,
! 11103: "show bgp view WORD rsclient (A.B.C.D|X:X::X:X)",
! 11104: SHOW_STR
! 11105: BGP_STR
! 11106: "BGP view\n"
! 11107: "BGP view name\n"
! 11108: "Information about Route Server Client\n"
! 11109: NEIGHBOR_ADDR_STR)
! 11110: {
! 11111: struct bgp_table *table;
! 11112: struct peer *peer;
! 11113:
! 11114: if (argc == 2)
! 11115: peer = peer_lookup_in_view (vty, argv[0], argv[1]);
! 11116: else
! 11117: peer = peer_lookup_in_view (vty, NULL, argv[0]);
! 11118:
! 11119: if (! peer)
! 11120: return CMD_WARNING;
! 11121:
! 11122: if (! peer->afc[AFI_IP6][SAFI_UNICAST])
! 11123: {
! 11124: vty_out (vty, "%% Activate the neighbor for the address family first%s",
! 11125: VTY_NEWLINE);
! 11126: return CMD_WARNING;
! 11127: }
! 11128:
! 11129: if ( ! CHECK_FLAG (peer->af_flags[AFI_IP6][SAFI_UNICAST],
! 11130: PEER_FLAG_RSERVER_CLIENT))
! 11131: {
! 11132: vty_out (vty, "%% Neighbor is not a Route-Server client%s",
! 11133: VTY_NEWLINE);
! 11134: return CMD_WARNING;
! 11135: }
! 11136:
! 11137: table = peer->rib[AFI_IP6][SAFI_UNICAST];
! 11138:
! 11139: return bgp_show_table (vty, table, &peer->remote_id, bgp_show_type_normal, NULL);
! 11140: }
! 11141:
! 11142: ALIAS (show_bgp_view_rsclient,
! 11143: show_bgp_rsclient_cmd,
! 11144: "show bgp rsclient (A.B.C.D|X:X::X:X)",
! 11145: SHOW_STR
! 11146: BGP_STR
! 11147: "Information about Route Server Client\n"
! 11148: NEIGHBOR_ADDR_STR)
! 11149:
! 11150: DEFUN (show_bgp_view_ipv6_safi_rsclient,
! 11151: show_bgp_view_ipv6_safi_rsclient_cmd,
! 11152: "show bgp view WORD ipv6 (unicast|multicast) rsclient (A.B.C.D|X:X::X:X)",
! 11153: SHOW_STR
! 11154: BGP_STR
! 11155: "BGP view\n"
! 11156: "BGP view name\n"
! 11157: "Address family\n"
! 11158: "Address Family modifier\n"
! 11159: "Address Family modifier\n"
! 11160: "Information about Route Server Client\n"
! 11161: NEIGHBOR_ADDR_STR)
! 11162: {
! 11163: struct bgp_table *table;
! 11164: struct peer *peer;
! 11165: safi_t safi;
! 11166:
! 11167: if (argc == 3) {
! 11168: peer = peer_lookup_in_view (vty, argv[0], argv[2]);
! 11169: safi = (strncmp (argv[1], "m", 1) == 0) ? SAFI_MULTICAST : SAFI_UNICAST;
! 11170: } else {
! 11171: peer = peer_lookup_in_view (vty, NULL, argv[1]);
! 11172: safi = (strncmp (argv[0], "m", 1) == 0) ? SAFI_MULTICAST : SAFI_UNICAST;
! 11173: }
! 11174:
! 11175: if (! peer)
! 11176: return CMD_WARNING;
! 11177:
! 11178: if (! peer->afc[AFI_IP6][safi])
! 11179: {
! 11180: vty_out (vty, "%% Activate the neighbor for the address family first%s",
! 11181: VTY_NEWLINE);
! 11182: return CMD_WARNING;
! 11183: }
! 11184:
! 11185: if ( ! CHECK_FLAG (peer->af_flags[AFI_IP6][safi],
! 11186: PEER_FLAG_RSERVER_CLIENT))
! 11187: {
! 11188: vty_out (vty, "%% Neighbor is not a Route-Server client%s",
! 11189: VTY_NEWLINE);
! 11190: return CMD_WARNING;
! 11191: }
! 11192:
! 11193: table = peer->rib[AFI_IP6][safi];
! 11194:
! 11195: return bgp_show_table (vty, table, &peer->remote_id, bgp_show_type_normal, NULL);
! 11196: }
! 11197:
! 11198: ALIAS (show_bgp_view_ipv6_safi_rsclient,
! 11199: show_bgp_ipv6_safi_rsclient_cmd,
! 11200: "show bgp ipv6 (unicast|multicast) rsclient (A.B.C.D|X:X::X:X)",
! 11201: SHOW_STR
! 11202: BGP_STR
! 11203: "Address family\n"
! 11204: "Address Family modifier\n"
! 11205: "Address Family modifier\n"
! 11206: "Information about Route Server Client\n"
! 11207: NEIGHBOR_ADDR_STR)
! 11208:
! 11209: DEFUN (show_bgp_view_rsclient_route,
! 11210: show_bgp_view_rsclient_route_cmd,
! 11211: "show bgp view WORD rsclient (A.B.C.D|X:X::X:X) X:X::X:X",
! 11212: SHOW_STR
! 11213: BGP_STR
! 11214: "BGP view\n"
! 11215: "BGP view name\n"
! 11216: "Information about Route Server Client\n"
! 11217: NEIGHBOR_ADDR_STR
! 11218: "Network in the BGP routing table to display\n")
! 11219: {
! 11220: struct bgp *bgp;
! 11221: struct peer *peer;
! 11222:
! 11223: /* BGP structure lookup. */
! 11224: if (argc == 3)
! 11225: {
! 11226: bgp = bgp_lookup_by_name (argv[0]);
! 11227: if (bgp == NULL)
! 11228: {
! 11229: vty_out (vty, "Can't find BGP view %s%s", argv[0], VTY_NEWLINE);
! 11230: return CMD_WARNING;
! 11231: }
! 11232: }
! 11233: else
! 11234: {
! 11235: bgp = bgp_get_default ();
! 11236: if (bgp == NULL)
! 11237: {
! 11238: vty_out (vty, "No BGP process is configured%s", VTY_NEWLINE);
! 11239: return CMD_WARNING;
! 11240: }
! 11241: }
! 11242:
! 11243: if (argc == 3)
! 11244: peer = peer_lookup_in_view (vty, argv[0], argv[1]);
! 11245: else
! 11246: peer = peer_lookup_in_view (vty, NULL, argv[0]);
! 11247:
! 11248: if (! peer)
! 11249: return CMD_WARNING;
! 11250:
! 11251: if (! peer->afc[AFI_IP6][SAFI_UNICAST])
! 11252: {
! 11253: vty_out (vty, "%% Activate the neighbor for the address family first%s",
! 11254: VTY_NEWLINE);
! 11255: return CMD_WARNING;
! 11256: }
! 11257:
! 11258: if ( ! CHECK_FLAG (peer->af_flags[AFI_IP6][SAFI_UNICAST],
! 11259: PEER_FLAG_RSERVER_CLIENT))
! 11260: {
! 11261: vty_out (vty, "%% Neighbor is not a Route-Server client%s",
! 11262: VTY_NEWLINE);
! 11263: return CMD_WARNING;
! 11264: }
! 11265:
! 11266: return bgp_show_route_in_table (vty, bgp, peer->rib[AFI_IP6][SAFI_UNICAST],
! 11267: (argc == 3) ? argv[2] : argv[1],
! 11268: AFI_IP6, SAFI_UNICAST, NULL, 0);
! 11269: }
! 11270:
! 11271: ALIAS (show_bgp_view_rsclient_route,
! 11272: show_bgp_rsclient_route_cmd,
! 11273: "show bgp rsclient (A.B.C.D|X:X::X:X) X:X::X:X",
! 11274: SHOW_STR
! 11275: BGP_STR
! 11276: "Information about Route Server Client\n"
! 11277: NEIGHBOR_ADDR_STR
! 11278: "Network in the BGP routing table to display\n")
! 11279:
! 11280: DEFUN (show_bgp_view_ipv6_safi_rsclient_route,
! 11281: show_bgp_view_ipv6_safi_rsclient_route_cmd,
! 11282: "show bgp view WORD ipv6 (unicast|multicast) rsclient (A.B.C.D|X:X::X:X) X:X::X:X",
! 11283: SHOW_STR
! 11284: BGP_STR
! 11285: "BGP view\n"
! 11286: "BGP view name\n"
! 11287: "Address family\n"
! 11288: "Address Family modifier\n"
! 11289: "Address Family modifier\n"
! 11290: "Information about Route Server Client\n"
! 11291: NEIGHBOR_ADDR_STR
! 11292: "Network in the BGP routing table to display\n")
! 11293: {
! 11294: struct bgp *bgp;
! 11295: struct peer *peer;
! 11296: safi_t safi;
! 11297:
! 11298: /* BGP structure lookup. */
! 11299: if (argc == 4)
! 11300: {
! 11301: bgp = bgp_lookup_by_name (argv[0]);
! 11302: if (bgp == NULL)
! 11303: {
! 11304: vty_out (vty, "Can't find BGP view %s%s", argv[0], VTY_NEWLINE);
! 11305: return CMD_WARNING;
! 11306: }
! 11307: }
! 11308: else
! 11309: {
! 11310: bgp = bgp_get_default ();
! 11311: if (bgp == NULL)
! 11312: {
! 11313: vty_out (vty, "No BGP process is configured%s", VTY_NEWLINE);
! 11314: return CMD_WARNING;
! 11315: }
! 11316: }
! 11317:
! 11318: if (argc == 4) {
! 11319: peer = peer_lookup_in_view (vty, argv[0], argv[2]);
! 11320: safi = (strncmp (argv[1], "m", 1) == 0) ? SAFI_MULTICAST : SAFI_UNICAST;
! 11321: } else {
! 11322: peer = peer_lookup_in_view (vty, NULL, argv[1]);
! 11323: safi = (strncmp (argv[0], "m", 1) == 0) ? SAFI_MULTICAST : SAFI_UNICAST;
! 11324: }
! 11325:
! 11326: if (! peer)
! 11327: return CMD_WARNING;
! 11328:
! 11329: if (! peer->afc[AFI_IP6][safi])
! 11330: {
! 11331: vty_out (vty, "%% Activate the neighbor for the address family first%s",
! 11332: VTY_NEWLINE);
! 11333: return CMD_WARNING;
! 11334: }
! 11335:
! 11336: if ( ! CHECK_FLAG (peer->af_flags[AFI_IP6][safi],
! 11337: PEER_FLAG_RSERVER_CLIENT))
! 11338: {
! 11339: vty_out (vty, "%% Neighbor is not a Route-Server client%s",
! 11340: VTY_NEWLINE);
! 11341: return CMD_WARNING;
! 11342: }
! 11343:
! 11344: return bgp_show_route_in_table (vty, bgp, peer->rib[AFI_IP6][safi],
! 11345: (argc == 4) ? argv[3] : argv[2],
! 11346: AFI_IP6, safi, NULL, 0);
! 11347: }
! 11348:
! 11349: ALIAS (show_bgp_view_ipv6_safi_rsclient_route,
! 11350: show_bgp_ipv6_safi_rsclient_route_cmd,
! 11351: "show bgp ipv6 (unicast|multicast) rsclient (A.B.C.D|X:X::X:X) X:X::X:X",
! 11352: SHOW_STR
! 11353: BGP_STR
! 11354: "Address family\n"
! 11355: "Address Family modifier\n"
! 11356: "Address Family modifier\n"
! 11357: "Information about Route Server Client\n"
! 11358: NEIGHBOR_ADDR_STR
! 11359: "Network in the BGP routing table to display\n")
! 11360:
! 11361: DEFUN (show_bgp_view_rsclient_prefix,
! 11362: show_bgp_view_rsclient_prefix_cmd,
! 11363: "show bgp view WORD rsclient (A.B.C.D|X:X::X:X) X:X::X:X/M",
! 11364: SHOW_STR
! 11365: BGP_STR
! 11366: "BGP view\n"
! 11367: "BGP view name\n"
! 11368: "Information about Route Server Client\n"
! 11369: NEIGHBOR_ADDR_STR
! 11370: "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n")
! 11371: {
! 11372: struct bgp *bgp;
! 11373: struct peer *peer;
! 11374:
! 11375: /* BGP structure lookup. */
! 11376: if (argc == 3)
! 11377: {
! 11378: bgp = bgp_lookup_by_name (argv[0]);
! 11379: if (bgp == NULL)
! 11380: {
! 11381: vty_out (vty, "Can't find BGP view %s%s", argv[0], VTY_NEWLINE);
! 11382: return CMD_WARNING;
! 11383: }
! 11384: }
! 11385: else
! 11386: {
! 11387: bgp = bgp_get_default ();
! 11388: if (bgp == NULL)
! 11389: {
! 11390: vty_out (vty, "No BGP process is configured%s", VTY_NEWLINE);
! 11391: return CMD_WARNING;
! 11392: }
! 11393: }
! 11394:
! 11395: if (argc == 3)
! 11396: peer = peer_lookup_in_view (vty, argv[0], argv[1]);
! 11397: else
! 11398: peer = peer_lookup_in_view (vty, NULL, argv[0]);
! 11399:
! 11400: if (! peer)
! 11401: return CMD_WARNING;
! 11402:
! 11403: if (! peer->afc[AFI_IP6][SAFI_UNICAST])
! 11404: {
! 11405: vty_out (vty, "%% Activate the neighbor for the address family first%s",
! 11406: VTY_NEWLINE);
! 11407: return CMD_WARNING;
! 11408: }
! 11409:
! 11410: if ( ! CHECK_FLAG (peer->af_flags[AFI_IP6][SAFI_UNICAST],
! 11411: PEER_FLAG_RSERVER_CLIENT))
! 11412: {
! 11413: vty_out (vty, "%% Neighbor is not a Route-Server client%s",
! 11414: VTY_NEWLINE);
! 11415: return CMD_WARNING;
! 11416: }
! 11417:
! 11418: return bgp_show_route_in_table (vty, bgp, peer->rib[AFI_IP6][SAFI_UNICAST],
! 11419: (argc == 3) ? argv[2] : argv[1],
! 11420: AFI_IP6, SAFI_UNICAST, NULL, 1);
! 11421: }
! 11422:
! 11423: ALIAS (show_bgp_view_rsclient_prefix,
! 11424: show_bgp_rsclient_prefix_cmd,
! 11425: "show bgp rsclient (A.B.C.D|X:X::X:X) X:X::X:X/M",
! 11426: SHOW_STR
! 11427: BGP_STR
! 11428: "Information about Route Server Client\n"
! 11429: NEIGHBOR_ADDR_STR
! 11430: "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n")
! 11431:
! 11432: DEFUN (show_bgp_view_ipv6_safi_rsclient_prefix,
! 11433: show_bgp_view_ipv6_safi_rsclient_prefix_cmd,
! 11434: "show bgp view WORD ipv6 (unicast|multicast) rsclient (A.B.C.D|X:X::X:X) X:X::X:X/M",
! 11435: SHOW_STR
! 11436: BGP_STR
! 11437: "BGP view\n"
! 11438: "BGP view name\n"
! 11439: "Address family\n"
! 11440: "Address Family modifier\n"
! 11441: "Address Family modifier\n"
! 11442: "Information about Route Server Client\n"
! 11443: NEIGHBOR_ADDR_STR
! 11444: "IP prefix <network>/<length>, e.g., 3ffe::/16\n")
! 11445: {
! 11446: struct bgp *bgp;
! 11447: struct peer *peer;
! 11448: safi_t safi;
! 11449:
! 11450: /* BGP structure lookup. */
! 11451: if (argc == 4)
! 11452: {
! 11453: bgp = bgp_lookup_by_name (argv[0]);
! 11454: if (bgp == NULL)
! 11455: {
! 11456: vty_out (vty, "Can't find BGP view %s%s", argv[0], VTY_NEWLINE);
! 11457: return CMD_WARNING;
! 11458: }
! 11459: }
! 11460: else
! 11461: {
! 11462: bgp = bgp_get_default ();
! 11463: if (bgp == NULL)
! 11464: {
! 11465: vty_out (vty, "No BGP process is configured%s", VTY_NEWLINE);
! 11466: return CMD_WARNING;
! 11467: }
! 11468: }
! 11469:
! 11470: if (argc == 4) {
! 11471: peer = peer_lookup_in_view (vty, argv[0], argv[2]);
! 11472: safi = (strncmp (argv[1], "m", 1) == 0) ? SAFI_MULTICAST : SAFI_UNICAST;
! 11473: } else {
! 11474: peer = peer_lookup_in_view (vty, NULL, argv[1]);
! 11475: safi = (strncmp (argv[0], "m", 1) == 0) ? SAFI_MULTICAST : SAFI_UNICAST;
! 11476: }
! 11477:
! 11478: if (! peer)
! 11479: return CMD_WARNING;
! 11480:
! 11481: if (! peer->afc[AFI_IP6][safi])
! 11482: {
! 11483: vty_out (vty, "%% Activate the neighbor for the address family first%s",
! 11484: VTY_NEWLINE);
! 11485: return CMD_WARNING;
! 11486: }
! 11487:
! 11488: if ( ! CHECK_FLAG (peer->af_flags[AFI_IP6][safi],
! 11489: PEER_FLAG_RSERVER_CLIENT))
! 11490: {
! 11491: vty_out (vty, "%% Neighbor is not a Route-Server client%s",
! 11492: VTY_NEWLINE);
! 11493: return CMD_WARNING;
! 11494: }
! 11495:
! 11496: return bgp_show_route_in_table (vty, bgp, peer->rib[AFI_IP6][safi],
! 11497: (argc == 4) ? argv[3] : argv[2],
! 11498: AFI_IP6, safi, NULL, 1);
! 11499: }
! 11500:
! 11501: ALIAS (show_bgp_view_ipv6_safi_rsclient_prefix,
! 11502: show_bgp_ipv6_safi_rsclient_prefix_cmd,
! 11503: "show bgp ipv6 (unicast|multicast) rsclient (A.B.C.D|X:X::X:X) X:X::X:X/M",
! 11504: SHOW_STR
! 11505: BGP_STR
! 11506: "Address family\n"
! 11507: "Address Family modifier\n"
! 11508: "Address Family modifier\n"
! 11509: "Information about Route Server Client\n"
! 11510: NEIGHBOR_ADDR_STR
! 11511: "IP prefix <network>/<length>, e.g., 3ffe::/16\n")
! 11512:
! 11513: #endif /* HAVE_IPV6 */
! 11514:
! 11515: struct bgp_table *bgp_distance_table;
! 11516:
! 11517: struct bgp_distance
! 11518: {
! 11519: /* Distance value for the IP source prefix. */
! 11520: u_char distance;
! 11521:
! 11522: /* Name of the access-list to be matched. */
! 11523: char *access_list;
! 11524: };
! 11525:
! 11526: static struct bgp_distance *
! 11527: bgp_distance_new (void)
! 11528: {
! 11529: return XCALLOC (MTYPE_BGP_DISTANCE, sizeof (struct bgp_distance));
! 11530: }
! 11531:
! 11532: static void
! 11533: bgp_distance_free (struct bgp_distance *bdistance)
! 11534: {
! 11535: XFREE (MTYPE_BGP_DISTANCE, bdistance);
! 11536: }
! 11537:
! 11538: static int
! 11539: bgp_distance_set (struct vty *vty, const char *distance_str,
! 11540: const char *ip_str, const char *access_list_str)
! 11541: {
! 11542: int ret;
! 11543: struct prefix_ipv4 p;
! 11544: u_char distance;
! 11545: struct bgp_node *rn;
! 11546: struct bgp_distance *bdistance;
! 11547:
! 11548: ret = str2prefix_ipv4 (ip_str, &p);
! 11549: if (ret == 0)
! 11550: {
! 11551: vty_out (vty, "Malformed prefix%s", VTY_NEWLINE);
! 11552: return CMD_WARNING;
! 11553: }
! 11554:
! 11555: distance = atoi (distance_str);
! 11556:
! 11557: /* Get BGP distance node. */
! 11558: rn = bgp_node_get (bgp_distance_table, (struct prefix *) &p);
! 11559: if (rn->info)
! 11560: {
! 11561: bdistance = rn->info;
! 11562: bgp_unlock_node (rn);
! 11563: }
! 11564: else
! 11565: {
! 11566: bdistance = bgp_distance_new ();
! 11567: rn->info = bdistance;
! 11568: }
! 11569:
! 11570: /* Set distance value. */
! 11571: bdistance->distance = distance;
! 11572:
! 11573: /* Reset access-list configuration. */
! 11574: if (bdistance->access_list)
! 11575: {
! 11576: free (bdistance->access_list);
! 11577: bdistance->access_list = NULL;
! 11578: }
! 11579: if (access_list_str)
! 11580: bdistance->access_list = strdup (access_list_str);
! 11581:
! 11582: return CMD_SUCCESS;
! 11583: }
! 11584:
! 11585: static int
! 11586: bgp_distance_unset (struct vty *vty, const char *distance_str,
! 11587: const char *ip_str, const char *access_list_str)
! 11588: {
! 11589: int ret;
! 11590: struct prefix_ipv4 p;
! 11591: u_char distance;
! 11592: struct bgp_node *rn;
! 11593: struct bgp_distance *bdistance;
! 11594:
! 11595: ret = str2prefix_ipv4 (ip_str, &p);
! 11596: if (ret == 0)
! 11597: {
! 11598: vty_out (vty, "Malformed prefix%s", VTY_NEWLINE);
! 11599: return CMD_WARNING;
! 11600: }
! 11601:
! 11602: distance = atoi (distance_str);
! 11603:
! 11604: rn = bgp_node_lookup (bgp_distance_table, (struct prefix *)&p);
! 11605: if (! rn)
! 11606: {
! 11607: vty_out (vty, "Can't find specified prefix%s", VTY_NEWLINE);
! 11608: return CMD_WARNING;
! 11609: }
! 11610:
! 11611: bdistance = rn->info;
! 11612:
! 11613: if (bdistance->access_list)
! 11614: free (bdistance->access_list);
! 11615: bgp_distance_free (bdistance);
! 11616:
! 11617: rn->info = NULL;
! 11618: bgp_unlock_node (rn);
! 11619: bgp_unlock_node (rn);
! 11620:
! 11621: return CMD_SUCCESS;
! 11622: }
! 11623:
! 11624: /* Apply BGP information to distance method. */
! 11625: u_char
! 11626: bgp_distance_apply (struct prefix *p, struct bgp_info *rinfo, struct bgp *bgp)
! 11627: {
! 11628: struct bgp_node *rn;
! 11629: struct prefix_ipv4 q;
! 11630: struct peer *peer;
! 11631: struct bgp_distance *bdistance;
! 11632: struct access_list *alist;
! 11633: struct bgp_static *bgp_static;
! 11634:
! 11635: if (! bgp)
! 11636: return 0;
! 11637:
! 11638: if (p->family != AF_INET)
! 11639: return 0;
! 11640:
! 11641: peer = rinfo->peer;
! 11642:
! 11643: if (peer->su.sa.sa_family != AF_INET)
! 11644: return 0;
! 11645:
! 11646: memset (&q, 0, sizeof (struct prefix_ipv4));
! 11647: q.family = AF_INET;
! 11648: q.prefix = peer->su.sin.sin_addr;
! 11649: q.prefixlen = IPV4_MAX_BITLEN;
! 11650:
! 11651: /* Check source address. */
! 11652: rn = bgp_node_match (bgp_distance_table, (struct prefix *) &q);
! 11653: if (rn)
! 11654: {
! 11655: bdistance = rn->info;
! 11656: bgp_unlock_node (rn);
! 11657:
! 11658: if (bdistance->access_list)
! 11659: {
! 11660: alist = access_list_lookup (AFI_IP, bdistance->access_list);
! 11661: if (alist && access_list_apply (alist, p) == FILTER_PERMIT)
! 11662: return bdistance->distance;
! 11663: }
! 11664: else
! 11665: return bdistance->distance;
! 11666: }
! 11667:
! 11668: /* Backdoor check. */
! 11669: rn = bgp_node_lookup (bgp->route[AFI_IP][SAFI_UNICAST], p);
! 11670: if (rn)
! 11671: {
! 11672: bgp_static = rn->info;
! 11673: bgp_unlock_node (rn);
! 11674:
! 11675: if (bgp_static->backdoor)
! 11676: {
! 11677: if (bgp->distance_local)
! 11678: return bgp->distance_local;
! 11679: else
! 11680: return ZEBRA_IBGP_DISTANCE_DEFAULT;
! 11681: }
! 11682: }
! 11683:
! 11684: if (peer_sort (peer) == BGP_PEER_EBGP)
! 11685: {
! 11686: if (bgp->distance_ebgp)
! 11687: return bgp->distance_ebgp;
! 11688: return ZEBRA_EBGP_DISTANCE_DEFAULT;
! 11689: }
! 11690: else
! 11691: {
! 11692: if (bgp->distance_ibgp)
! 11693: return bgp->distance_ibgp;
! 11694: return ZEBRA_IBGP_DISTANCE_DEFAULT;
! 11695: }
! 11696: }
! 11697:
! 11698: DEFUN (bgp_distance,
! 11699: bgp_distance_cmd,
! 11700: "distance bgp <1-255> <1-255> <1-255>",
! 11701: "Define an administrative distance\n"
! 11702: "BGP distance\n"
! 11703: "Distance for routes external to the AS\n"
! 11704: "Distance for routes internal to the AS\n"
! 11705: "Distance for local routes\n")
! 11706: {
! 11707: struct bgp *bgp;
! 11708:
! 11709: bgp = vty->index;
! 11710:
! 11711: bgp->distance_ebgp = atoi (argv[0]);
! 11712: bgp->distance_ibgp = atoi (argv[1]);
! 11713: bgp->distance_local = atoi (argv[2]);
! 11714: return CMD_SUCCESS;
! 11715: }
! 11716:
! 11717: DEFUN (no_bgp_distance,
! 11718: no_bgp_distance_cmd,
! 11719: "no distance bgp <1-255> <1-255> <1-255>",
! 11720: NO_STR
! 11721: "Define an administrative distance\n"
! 11722: "BGP distance\n"
! 11723: "Distance for routes external to the AS\n"
! 11724: "Distance for routes internal to the AS\n"
! 11725: "Distance for local routes\n")
! 11726: {
! 11727: struct bgp *bgp;
! 11728:
! 11729: bgp = vty->index;
! 11730:
! 11731: bgp->distance_ebgp= 0;
! 11732: bgp->distance_ibgp = 0;
! 11733: bgp->distance_local = 0;
! 11734: return CMD_SUCCESS;
! 11735: }
! 11736:
! 11737: ALIAS (no_bgp_distance,
! 11738: no_bgp_distance2_cmd,
! 11739: "no distance bgp",
! 11740: NO_STR
! 11741: "Define an administrative distance\n"
! 11742: "BGP distance\n")
! 11743:
! 11744: DEFUN (bgp_distance_source,
! 11745: bgp_distance_source_cmd,
! 11746: "distance <1-255> A.B.C.D/M",
! 11747: "Define an administrative distance\n"
! 11748: "Administrative distance\n"
! 11749: "IP source prefix\n")
! 11750: {
! 11751: bgp_distance_set (vty, argv[0], argv[1], NULL);
! 11752: return CMD_SUCCESS;
! 11753: }
! 11754:
! 11755: DEFUN (no_bgp_distance_source,
! 11756: no_bgp_distance_source_cmd,
! 11757: "no distance <1-255> A.B.C.D/M",
! 11758: NO_STR
! 11759: "Define an administrative distance\n"
! 11760: "Administrative distance\n"
! 11761: "IP source prefix\n")
! 11762: {
! 11763: bgp_distance_unset (vty, argv[0], argv[1], NULL);
! 11764: return CMD_SUCCESS;
! 11765: }
! 11766:
! 11767: DEFUN (bgp_distance_source_access_list,
! 11768: bgp_distance_source_access_list_cmd,
! 11769: "distance <1-255> A.B.C.D/M WORD",
! 11770: "Define an administrative distance\n"
! 11771: "Administrative distance\n"
! 11772: "IP source prefix\n"
! 11773: "Access list name\n")
! 11774: {
! 11775: bgp_distance_set (vty, argv[0], argv[1], argv[2]);
! 11776: return CMD_SUCCESS;
! 11777: }
! 11778:
! 11779: DEFUN (no_bgp_distance_source_access_list,
! 11780: no_bgp_distance_source_access_list_cmd,
! 11781: "no distance <1-255> A.B.C.D/M WORD",
! 11782: NO_STR
! 11783: "Define an administrative distance\n"
! 11784: "Administrative distance\n"
! 11785: "IP source prefix\n"
! 11786: "Access list name\n")
! 11787: {
! 11788: bgp_distance_unset (vty, argv[0], argv[1], argv[2]);
! 11789: return CMD_SUCCESS;
! 11790: }
! 11791:
! 11792: DEFUN (bgp_damp_set,
! 11793: bgp_damp_set_cmd,
! 11794: "bgp dampening <1-45> <1-20000> <1-20000> <1-255>",
! 11795: "BGP Specific commands\n"
! 11796: "Enable route-flap dampening\n"
! 11797: "Half-life time for the penalty\n"
! 11798: "Value to start reusing a route\n"
! 11799: "Value to start suppressing a route\n"
! 11800: "Maximum duration to suppress a stable route\n")
! 11801: {
! 11802: struct bgp *bgp;
! 11803: int half = DEFAULT_HALF_LIFE * 60;
! 11804: int reuse = DEFAULT_REUSE;
! 11805: int suppress = DEFAULT_SUPPRESS;
! 11806: int max = 4 * half;
! 11807:
! 11808: if (argc == 4)
! 11809: {
! 11810: half = atoi (argv[0]) * 60;
! 11811: reuse = atoi (argv[1]);
! 11812: suppress = atoi (argv[2]);
! 11813: max = atoi (argv[3]) * 60;
! 11814: }
! 11815: else if (argc == 1)
! 11816: {
! 11817: half = atoi (argv[0]) * 60;
! 11818: max = 4 * half;
! 11819: }
! 11820:
! 11821: bgp = vty->index;
! 11822: return bgp_damp_enable (bgp, bgp_node_afi (vty), bgp_node_safi (vty),
! 11823: half, reuse, suppress, max);
! 11824: }
! 11825:
! 11826: ALIAS (bgp_damp_set,
! 11827: bgp_damp_set2_cmd,
! 11828: "bgp dampening <1-45>",
! 11829: "BGP Specific commands\n"
! 11830: "Enable route-flap dampening\n"
! 11831: "Half-life time for the penalty\n")
! 11832:
! 11833: ALIAS (bgp_damp_set,
! 11834: bgp_damp_set3_cmd,
! 11835: "bgp dampening",
! 11836: "BGP Specific commands\n"
! 11837: "Enable route-flap dampening\n")
! 11838:
! 11839: DEFUN (bgp_damp_unset,
! 11840: bgp_damp_unset_cmd,
! 11841: "no bgp dampening",
! 11842: NO_STR
! 11843: "BGP Specific commands\n"
! 11844: "Enable route-flap dampening\n")
! 11845: {
! 11846: struct bgp *bgp;
! 11847:
! 11848: bgp = vty->index;
! 11849: return bgp_damp_disable (bgp, bgp_node_afi (vty), bgp_node_safi (vty));
! 11850: }
! 11851:
! 11852: ALIAS (bgp_damp_unset,
! 11853: bgp_damp_unset2_cmd,
! 11854: "no bgp dampening <1-45> <1-20000> <1-20000> <1-255>",
! 11855: NO_STR
! 11856: "BGP Specific commands\n"
! 11857: "Enable route-flap dampening\n"
! 11858: "Half-life time for the penalty\n"
! 11859: "Value to start reusing a route\n"
! 11860: "Value to start suppressing a route\n"
! 11861: "Maximum duration to suppress a stable route\n")
! 11862:
! 11863: DEFUN (show_ip_bgp_dampened_paths,
! 11864: show_ip_bgp_dampened_paths_cmd,
! 11865: "show ip bgp dampened-paths",
! 11866: SHOW_STR
! 11867: IP_STR
! 11868: BGP_STR
! 11869: "Display paths suppressed due to dampening\n")
! 11870: {
! 11871: return bgp_show (vty, NULL, AFI_IP, SAFI_UNICAST, bgp_show_type_dampend_paths,
! 11872: NULL);
! 11873: }
! 11874:
! 11875: DEFUN (show_ip_bgp_flap_statistics,
! 11876: show_ip_bgp_flap_statistics_cmd,
! 11877: "show ip bgp flap-statistics",
! 11878: SHOW_STR
! 11879: IP_STR
! 11880: BGP_STR
! 11881: "Display flap statistics of routes\n")
! 11882: {
! 11883: return bgp_show (vty, NULL, AFI_IP, SAFI_UNICAST,
! 11884: bgp_show_type_flap_statistics, NULL);
! 11885: }
! 11886:
! 11887: /* Display specified route of BGP table. */
! 11888: static int
! 11889: bgp_clear_damp_route (struct vty *vty, const char *view_name,
! 11890: const char *ip_str, afi_t afi, safi_t safi,
! 11891: struct prefix_rd *prd, int prefix_check)
! 11892: {
! 11893: int ret;
! 11894: struct prefix match;
! 11895: struct bgp_node *rn;
! 11896: struct bgp_node *rm;
! 11897: struct bgp_info *ri;
! 11898: struct bgp_info *ri_temp;
! 11899: struct bgp *bgp;
! 11900: struct bgp_table *table;
! 11901:
! 11902: /* BGP structure lookup. */
! 11903: if (view_name)
! 11904: {
! 11905: bgp = bgp_lookup_by_name (view_name);
! 11906: if (bgp == NULL)
! 11907: {
! 11908: vty_out (vty, "%% Can't find BGP view %s%s", view_name, VTY_NEWLINE);
! 11909: return CMD_WARNING;
! 11910: }
! 11911: }
! 11912: else
! 11913: {
! 11914: bgp = bgp_get_default ();
! 11915: if (bgp == NULL)
! 11916: {
! 11917: vty_out (vty, "%% No BGP process is configured%s", VTY_NEWLINE);
! 11918: return CMD_WARNING;
! 11919: }
! 11920: }
! 11921:
! 11922: /* Check IP address argument. */
! 11923: ret = str2prefix (ip_str, &match);
! 11924: if (! ret)
! 11925: {
! 11926: vty_out (vty, "%% address is malformed%s", VTY_NEWLINE);
! 11927: return CMD_WARNING;
! 11928: }
! 11929:
! 11930: match.family = afi2family (afi);
! 11931:
! 11932: if (safi == SAFI_MPLS_VPN)
! 11933: {
! 11934: for (rn = bgp_table_top (bgp->rib[AFI_IP][SAFI_MPLS_VPN]); rn; rn = bgp_route_next (rn))
! 11935: {
! 11936: if (prd && memcmp (rn->p.u.val, prd->val, 8) != 0)
! 11937: continue;
! 11938:
! 11939: if ((table = rn->info) != NULL)
! 11940: if ((rm = bgp_node_match (table, &match)) != NULL)
! 11941: {
! 11942: if (! prefix_check || rm->p.prefixlen == match.prefixlen)
! 11943: {
! 11944: ri = rm->info;
! 11945: while (ri)
! 11946: {
! 11947: if (ri->extra && ri->extra->damp_info)
! 11948: {
! 11949: ri_temp = ri->next;
! 11950: bgp_damp_info_free (ri->extra->damp_info, 1);
! 11951: ri = ri_temp;
! 11952: }
! 11953: else
! 11954: ri = ri->next;
! 11955: }
! 11956: }
! 11957:
! 11958: bgp_unlock_node (rm);
! 11959: }
! 11960: }
! 11961: }
! 11962: else
! 11963: {
! 11964: if ((rn = bgp_node_match (bgp->rib[afi][safi], &match)) != NULL)
! 11965: {
! 11966: if (! prefix_check || rn->p.prefixlen == match.prefixlen)
! 11967: {
! 11968: ri = rn->info;
! 11969: while (ri)
! 11970: {
! 11971: if (ri->extra && ri->extra->damp_info)
! 11972: {
! 11973: ri_temp = ri->next;
! 11974: bgp_damp_info_free (ri->extra->damp_info, 1);
! 11975: ri = ri_temp;
! 11976: }
! 11977: else
! 11978: ri = ri->next;
! 11979: }
! 11980: }
! 11981:
! 11982: bgp_unlock_node (rn);
! 11983: }
! 11984: }
! 11985:
! 11986: return CMD_SUCCESS;
! 11987: }
! 11988:
! 11989: DEFUN (clear_ip_bgp_dampening,
! 11990: clear_ip_bgp_dampening_cmd,
! 11991: "clear ip bgp dampening",
! 11992: CLEAR_STR
! 11993: IP_STR
! 11994: BGP_STR
! 11995: "Clear route flap dampening information\n")
! 11996: {
! 11997: bgp_damp_info_clean ();
! 11998: return CMD_SUCCESS;
! 11999: }
! 12000:
! 12001: DEFUN (clear_ip_bgp_dampening_prefix,
! 12002: clear_ip_bgp_dampening_prefix_cmd,
! 12003: "clear ip bgp dampening A.B.C.D/M",
! 12004: CLEAR_STR
! 12005: IP_STR
! 12006: BGP_STR
! 12007: "Clear route flap dampening information\n"
! 12008: "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n")
! 12009: {
! 12010: return bgp_clear_damp_route (vty, NULL, argv[0], AFI_IP,
! 12011: SAFI_UNICAST, NULL, 1);
! 12012: }
! 12013:
! 12014: DEFUN (clear_ip_bgp_dampening_address,
! 12015: clear_ip_bgp_dampening_address_cmd,
! 12016: "clear ip bgp dampening A.B.C.D",
! 12017: CLEAR_STR
! 12018: IP_STR
! 12019: BGP_STR
! 12020: "Clear route flap dampening information\n"
! 12021: "Network to clear damping information\n")
! 12022: {
! 12023: return bgp_clear_damp_route (vty, NULL, argv[0], AFI_IP,
! 12024: SAFI_UNICAST, NULL, 0);
! 12025: }
! 12026:
! 12027: DEFUN (clear_ip_bgp_dampening_address_mask,
! 12028: clear_ip_bgp_dampening_address_mask_cmd,
! 12029: "clear ip bgp dampening A.B.C.D A.B.C.D",
! 12030: CLEAR_STR
! 12031: IP_STR
! 12032: BGP_STR
! 12033: "Clear route flap dampening information\n"
! 12034: "Network to clear damping information\n"
! 12035: "Network mask\n")
! 12036: {
! 12037: int ret;
! 12038: char prefix_str[BUFSIZ];
! 12039:
! 12040: ret = netmask_str2prefix_str (argv[0], argv[1], prefix_str);
! 12041: if (! ret)
! 12042: {
! 12043: vty_out (vty, "%% Inconsistent address and mask%s", VTY_NEWLINE);
! 12044: return CMD_WARNING;
! 12045: }
! 12046:
! 12047: return bgp_clear_damp_route (vty, NULL, prefix_str, AFI_IP,
! 12048: SAFI_UNICAST, NULL, 0);
! 12049: }
! 12050:
! 12051: static int
! 12052: bgp_config_write_network_vpnv4 (struct vty *vty, struct bgp *bgp,
! 12053: afi_t afi, safi_t safi, int *write)
! 12054: {
! 12055: struct bgp_node *prn;
! 12056: struct bgp_node *rn;
! 12057: struct bgp_table *table;
! 12058: struct prefix *p;
! 12059: struct prefix_rd *prd;
! 12060: struct bgp_static *bgp_static;
! 12061: u_int32_t label;
! 12062: char buf[SU_ADDRSTRLEN];
! 12063: char rdbuf[RD_ADDRSTRLEN];
! 12064:
! 12065: /* Network configuration. */
! 12066: for (prn = bgp_table_top (bgp->route[afi][safi]); prn; prn = bgp_route_next (prn))
! 12067: if ((table = prn->info) != NULL)
! 12068: for (rn = bgp_table_top (table); rn; rn = bgp_route_next (rn))
! 12069: if ((bgp_static = rn->info) != NULL)
! 12070: {
! 12071: p = &rn->p;
! 12072: prd = (struct prefix_rd *) &prn->p;
! 12073:
! 12074: /* "address-family" display. */
! 12075: bgp_config_write_family_header (vty, afi, safi, write);
! 12076:
! 12077: /* "network" configuration display. */
! 12078: prefix_rd2str (prd, rdbuf, RD_ADDRSTRLEN);
! 12079: label = decode_label (bgp_static->tag);
! 12080:
! 12081: vty_out (vty, " network %s/%d rd %s tag %d",
! 12082: inet_ntop (p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
! 12083: p->prefixlen,
! 12084: rdbuf, label);
! 12085: vty_out (vty, "%s", VTY_NEWLINE);
! 12086: }
! 12087: return 0;
! 12088: }
! 12089:
! 12090: /* Configuration of static route announcement and aggregate
! 12091: information. */
! 12092: int
! 12093: bgp_config_write_network (struct vty *vty, struct bgp *bgp,
! 12094: afi_t afi, safi_t safi, int *write)
! 12095: {
! 12096: struct bgp_node *rn;
! 12097: struct prefix *p;
! 12098: struct bgp_static *bgp_static;
! 12099: struct bgp_aggregate *bgp_aggregate;
! 12100: char buf[SU_ADDRSTRLEN];
! 12101:
! 12102: if (afi == AFI_IP && safi == SAFI_MPLS_VPN)
! 12103: return bgp_config_write_network_vpnv4 (vty, bgp, afi, safi, write);
! 12104:
! 12105: /* Network configuration. */
! 12106: for (rn = bgp_table_top (bgp->route[afi][safi]); rn; rn = bgp_route_next (rn))
! 12107: if ((bgp_static = rn->info) != NULL)
! 12108: {
! 12109: p = &rn->p;
! 12110:
! 12111: /* "address-family" display. */
! 12112: bgp_config_write_family_header (vty, afi, safi, write);
! 12113:
! 12114: /* "network" configuration display. */
! 12115: if (bgp_option_check (BGP_OPT_CONFIG_CISCO) && afi == AFI_IP)
! 12116: {
! 12117: u_int32_t destination;
! 12118: struct in_addr netmask;
! 12119:
! 12120: destination = ntohl (p->u.prefix4.s_addr);
! 12121: masklen2ip (p->prefixlen, &netmask);
! 12122: vty_out (vty, " network %s",
! 12123: inet_ntop (p->family, &p->u.prefix, buf, SU_ADDRSTRLEN));
! 12124:
! 12125: if ((IN_CLASSC (destination) && p->prefixlen == 24)
! 12126: || (IN_CLASSB (destination) && p->prefixlen == 16)
! 12127: || (IN_CLASSA (destination) && p->prefixlen == 8)
! 12128: || p->u.prefix4.s_addr == 0)
! 12129: {
! 12130: /* Natural mask is not display. */
! 12131: }
! 12132: else
! 12133: vty_out (vty, " mask %s", inet_ntoa (netmask));
! 12134: }
! 12135: else
! 12136: {
! 12137: vty_out (vty, " network %s/%d",
! 12138: inet_ntop (p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
! 12139: p->prefixlen);
! 12140: }
! 12141:
! 12142: if (bgp_static->rmap.name)
! 12143: vty_out (vty, " route-map %s", bgp_static->rmap.name);
! 12144: else
! 12145: {
! 12146: if (bgp_static->backdoor)
! 12147: vty_out (vty, " backdoor");
! 12148: }
! 12149:
! 12150: vty_out (vty, "%s", VTY_NEWLINE);
! 12151: }
! 12152:
! 12153: /* Aggregate-address configuration. */
! 12154: for (rn = bgp_table_top (bgp->aggregate[afi][safi]); rn; rn = bgp_route_next (rn))
! 12155: if ((bgp_aggregate = rn->info) != NULL)
! 12156: {
! 12157: p = &rn->p;
! 12158:
! 12159: /* "address-family" display. */
! 12160: bgp_config_write_family_header (vty, afi, safi, write);
! 12161:
! 12162: if (bgp_option_check (BGP_OPT_CONFIG_CISCO) && afi == AFI_IP)
! 12163: {
! 12164: struct in_addr netmask;
! 12165:
! 12166: masklen2ip (p->prefixlen, &netmask);
! 12167: vty_out (vty, " aggregate-address %s %s",
! 12168: inet_ntop (p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
! 12169: inet_ntoa (netmask));
! 12170: }
! 12171: else
! 12172: {
! 12173: vty_out (vty, " aggregate-address %s/%d",
! 12174: inet_ntop (p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
! 12175: p->prefixlen);
! 12176: }
! 12177:
! 12178: if (bgp_aggregate->as_set)
! 12179: vty_out (vty, " as-set");
! 12180:
! 12181: if (bgp_aggregate->summary_only)
! 12182: vty_out (vty, " summary-only");
! 12183:
! 12184: vty_out (vty, "%s", VTY_NEWLINE);
! 12185: }
! 12186:
! 12187: return 0;
! 12188: }
! 12189:
! 12190: int
! 12191: bgp_config_write_distance (struct vty *vty, struct bgp *bgp)
! 12192: {
! 12193: struct bgp_node *rn;
! 12194: struct bgp_distance *bdistance;
! 12195:
! 12196: /* Distance configuration. */
! 12197: if (bgp->distance_ebgp
! 12198: && bgp->distance_ibgp
! 12199: && bgp->distance_local
! 12200: && (bgp->distance_ebgp != ZEBRA_EBGP_DISTANCE_DEFAULT
! 12201: || bgp->distance_ibgp != ZEBRA_IBGP_DISTANCE_DEFAULT
! 12202: || bgp->distance_local != ZEBRA_IBGP_DISTANCE_DEFAULT))
! 12203: vty_out (vty, " distance bgp %d %d %d%s",
! 12204: bgp->distance_ebgp, bgp->distance_ibgp, bgp->distance_local,
! 12205: VTY_NEWLINE);
! 12206:
! 12207: for (rn = bgp_table_top (bgp_distance_table); rn; rn = bgp_route_next (rn))
! 12208: if ((bdistance = rn->info) != NULL)
! 12209: {
! 12210: vty_out (vty, " distance %d %s/%d %s%s", bdistance->distance,
! 12211: inet_ntoa (rn->p.u.prefix4), rn->p.prefixlen,
! 12212: bdistance->access_list ? bdistance->access_list : "",
! 12213: VTY_NEWLINE);
! 12214: }
! 12215:
! 12216: return 0;
! 12217: }
! 12218:
! 12219: /* Allocate routing table structure and install commands. */
! 12220: void
! 12221: bgp_route_init (void)
! 12222: {
! 12223: /* Init BGP distance table. */
! 12224: bgp_distance_table = bgp_table_init (AFI_IP, SAFI_UNICAST);
! 12225:
! 12226: /* IPv4 BGP commands. */
! 12227: install_element (BGP_NODE, &bgp_network_cmd);
! 12228: install_element (BGP_NODE, &bgp_network_mask_cmd);
! 12229: install_element (BGP_NODE, &bgp_network_mask_natural_cmd);
! 12230: install_element (BGP_NODE, &bgp_network_route_map_cmd);
! 12231: install_element (BGP_NODE, &bgp_network_mask_route_map_cmd);
! 12232: install_element (BGP_NODE, &bgp_network_mask_natural_route_map_cmd);
! 12233: install_element (BGP_NODE, &bgp_network_backdoor_cmd);
! 12234: install_element (BGP_NODE, &bgp_network_mask_backdoor_cmd);
! 12235: install_element (BGP_NODE, &bgp_network_mask_natural_backdoor_cmd);
! 12236: install_element (BGP_NODE, &no_bgp_network_cmd);
! 12237: install_element (BGP_NODE, &no_bgp_network_mask_cmd);
! 12238: install_element (BGP_NODE, &no_bgp_network_mask_natural_cmd);
! 12239: install_element (BGP_NODE, &no_bgp_network_route_map_cmd);
! 12240: install_element (BGP_NODE, &no_bgp_network_mask_route_map_cmd);
! 12241: install_element (BGP_NODE, &no_bgp_network_mask_natural_route_map_cmd);
! 12242: install_element (BGP_NODE, &no_bgp_network_backdoor_cmd);
! 12243: install_element (BGP_NODE, &no_bgp_network_mask_backdoor_cmd);
! 12244: install_element (BGP_NODE, &no_bgp_network_mask_natural_backdoor_cmd);
! 12245:
! 12246: install_element (BGP_NODE, &aggregate_address_cmd);
! 12247: install_element (BGP_NODE, &aggregate_address_mask_cmd);
! 12248: install_element (BGP_NODE, &aggregate_address_summary_only_cmd);
! 12249: install_element (BGP_NODE, &aggregate_address_mask_summary_only_cmd);
! 12250: install_element (BGP_NODE, &aggregate_address_as_set_cmd);
! 12251: install_element (BGP_NODE, &aggregate_address_mask_as_set_cmd);
! 12252: install_element (BGP_NODE, &aggregate_address_as_set_summary_cmd);
! 12253: install_element (BGP_NODE, &aggregate_address_mask_as_set_summary_cmd);
! 12254: install_element (BGP_NODE, &aggregate_address_summary_as_set_cmd);
! 12255: install_element (BGP_NODE, &aggregate_address_mask_summary_as_set_cmd);
! 12256: install_element (BGP_NODE, &no_aggregate_address_cmd);
! 12257: install_element (BGP_NODE, &no_aggregate_address_summary_only_cmd);
! 12258: install_element (BGP_NODE, &no_aggregate_address_as_set_cmd);
! 12259: install_element (BGP_NODE, &no_aggregate_address_as_set_summary_cmd);
! 12260: install_element (BGP_NODE, &no_aggregate_address_summary_as_set_cmd);
! 12261: install_element (BGP_NODE, &no_aggregate_address_mask_cmd);
! 12262: install_element (BGP_NODE, &no_aggregate_address_mask_summary_only_cmd);
! 12263: install_element (BGP_NODE, &no_aggregate_address_mask_as_set_cmd);
! 12264: install_element (BGP_NODE, &no_aggregate_address_mask_as_set_summary_cmd);
! 12265: install_element (BGP_NODE, &no_aggregate_address_mask_summary_as_set_cmd);
! 12266:
! 12267: /* IPv4 unicast configuration. */
! 12268: install_element (BGP_IPV4_NODE, &bgp_network_cmd);
! 12269: install_element (BGP_IPV4_NODE, &bgp_network_mask_cmd);
! 12270: install_element (BGP_IPV4_NODE, &bgp_network_mask_natural_cmd);
! 12271: install_element (BGP_IPV4_NODE, &bgp_network_route_map_cmd);
! 12272: install_element (BGP_IPV4_NODE, &bgp_network_mask_route_map_cmd);
! 12273: install_element (BGP_IPV4_NODE, &bgp_network_mask_natural_route_map_cmd);
! 12274: install_element (BGP_IPV4_NODE, &no_bgp_network_cmd);
! 12275: install_element (BGP_IPV4_NODE, &no_bgp_network_mask_cmd);
! 12276: install_element (BGP_IPV4_NODE, &no_bgp_network_mask_natural_cmd);
! 12277: install_element (BGP_IPV4_NODE, &no_bgp_network_route_map_cmd);
! 12278: install_element (BGP_IPV4_NODE, &no_bgp_network_mask_route_map_cmd);
! 12279: install_element (BGP_IPV4_NODE, &no_bgp_network_mask_natural_route_map_cmd);
! 12280:
! 12281: install_element (BGP_IPV4_NODE, &aggregate_address_cmd);
! 12282: install_element (BGP_IPV4_NODE, &aggregate_address_mask_cmd);
! 12283: install_element (BGP_IPV4_NODE, &aggregate_address_summary_only_cmd);
! 12284: install_element (BGP_IPV4_NODE, &aggregate_address_mask_summary_only_cmd);
! 12285: install_element (BGP_IPV4_NODE, &aggregate_address_as_set_cmd);
! 12286: install_element (BGP_IPV4_NODE, &aggregate_address_mask_as_set_cmd);
! 12287: install_element (BGP_IPV4_NODE, &aggregate_address_as_set_summary_cmd);
! 12288: install_element (BGP_IPV4_NODE, &aggregate_address_mask_as_set_summary_cmd);
! 12289: install_element (BGP_IPV4_NODE, &aggregate_address_summary_as_set_cmd);
! 12290: install_element (BGP_IPV4_NODE, &aggregate_address_mask_summary_as_set_cmd);
! 12291: install_element (BGP_IPV4_NODE, &no_aggregate_address_cmd);
! 12292: install_element (BGP_IPV4_NODE, &no_aggregate_address_summary_only_cmd);
! 12293: install_element (BGP_IPV4_NODE, &no_aggregate_address_as_set_cmd);
! 12294: install_element (BGP_IPV4_NODE, &no_aggregate_address_as_set_summary_cmd);
! 12295: install_element (BGP_IPV4_NODE, &no_aggregate_address_summary_as_set_cmd);
! 12296: install_element (BGP_IPV4_NODE, &no_aggregate_address_mask_cmd);
! 12297: install_element (BGP_IPV4_NODE, &no_aggregate_address_mask_summary_only_cmd);
! 12298: install_element (BGP_IPV4_NODE, &no_aggregate_address_mask_as_set_cmd);
! 12299: install_element (BGP_IPV4_NODE, &no_aggregate_address_mask_as_set_summary_cmd);
! 12300: install_element (BGP_IPV4_NODE, &no_aggregate_address_mask_summary_as_set_cmd);
! 12301:
! 12302: /* IPv4 multicast configuration. */
! 12303: install_element (BGP_IPV4M_NODE, &bgp_network_cmd);
! 12304: install_element (BGP_IPV4M_NODE, &bgp_network_mask_cmd);
! 12305: install_element (BGP_IPV4M_NODE, &bgp_network_mask_natural_cmd);
! 12306: install_element (BGP_IPV4M_NODE, &bgp_network_route_map_cmd);
! 12307: install_element (BGP_IPV4M_NODE, &bgp_network_mask_route_map_cmd);
! 12308: install_element (BGP_IPV4M_NODE, &bgp_network_mask_natural_route_map_cmd);
! 12309: install_element (BGP_IPV4M_NODE, &no_bgp_network_cmd);
! 12310: install_element (BGP_IPV4M_NODE, &no_bgp_network_mask_cmd);
! 12311: install_element (BGP_IPV4M_NODE, &no_bgp_network_mask_natural_cmd);
! 12312: install_element (BGP_IPV4M_NODE, &no_bgp_network_route_map_cmd);
! 12313: install_element (BGP_IPV4M_NODE, &no_bgp_network_mask_route_map_cmd);
! 12314: install_element (BGP_IPV4M_NODE, &no_bgp_network_mask_natural_route_map_cmd);
! 12315: install_element (BGP_IPV4M_NODE, &aggregate_address_cmd);
! 12316: install_element (BGP_IPV4M_NODE, &aggregate_address_mask_cmd);
! 12317: install_element (BGP_IPV4M_NODE, &aggregate_address_summary_only_cmd);
! 12318: install_element (BGP_IPV4M_NODE, &aggregate_address_mask_summary_only_cmd);
! 12319: install_element (BGP_IPV4M_NODE, &aggregate_address_as_set_cmd);
! 12320: install_element (BGP_IPV4M_NODE, &aggregate_address_mask_as_set_cmd);
! 12321: install_element (BGP_IPV4M_NODE, &aggregate_address_as_set_summary_cmd);
! 12322: install_element (BGP_IPV4M_NODE, &aggregate_address_mask_as_set_summary_cmd);
! 12323: install_element (BGP_IPV4M_NODE, &aggregate_address_summary_as_set_cmd);
! 12324: install_element (BGP_IPV4M_NODE, &aggregate_address_mask_summary_as_set_cmd);
! 12325: install_element (BGP_IPV4M_NODE, &no_aggregate_address_cmd);
! 12326: install_element (BGP_IPV4M_NODE, &no_aggregate_address_summary_only_cmd);
! 12327: install_element (BGP_IPV4M_NODE, &no_aggregate_address_as_set_cmd);
! 12328: install_element (BGP_IPV4M_NODE, &no_aggregate_address_as_set_summary_cmd);
! 12329: install_element (BGP_IPV4M_NODE, &no_aggregate_address_summary_as_set_cmd);
! 12330: install_element (BGP_IPV4M_NODE, &no_aggregate_address_mask_cmd);
! 12331: install_element (BGP_IPV4M_NODE, &no_aggregate_address_mask_summary_only_cmd);
! 12332: install_element (BGP_IPV4M_NODE, &no_aggregate_address_mask_as_set_cmd);
! 12333: install_element (BGP_IPV4M_NODE, &no_aggregate_address_mask_as_set_summary_cmd);
! 12334: install_element (BGP_IPV4M_NODE, &no_aggregate_address_mask_summary_as_set_cmd);
! 12335:
! 12336: install_element (VIEW_NODE, &show_ip_bgp_cmd);
! 12337: install_element (VIEW_NODE, &show_ip_bgp_ipv4_cmd);
! 12338: install_element (VIEW_NODE, &show_bgp_ipv4_safi_cmd);
! 12339: install_element (VIEW_NODE, &show_ip_bgp_route_cmd);
! 12340: install_element (VIEW_NODE, &show_ip_bgp_ipv4_route_cmd);
! 12341: install_element (VIEW_NODE, &show_bgp_ipv4_safi_route_cmd);
! 12342: install_element (VIEW_NODE, &show_ip_bgp_vpnv4_all_route_cmd);
! 12343: install_element (VIEW_NODE, &show_ip_bgp_vpnv4_rd_route_cmd);
! 12344: install_element (VIEW_NODE, &show_ip_bgp_prefix_cmd);
! 12345: install_element (VIEW_NODE, &show_ip_bgp_ipv4_prefix_cmd);
! 12346: install_element (VIEW_NODE, &show_bgp_ipv4_safi_prefix_cmd);
! 12347: install_element (VIEW_NODE, &show_ip_bgp_vpnv4_all_prefix_cmd);
! 12348: install_element (VIEW_NODE, &show_ip_bgp_vpnv4_rd_prefix_cmd);
! 12349: install_element (VIEW_NODE, &show_ip_bgp_view_cmd);
! 12350: install_element (VIEW_NODE, &show_ip_bgp_view_route_cmd);
! 12351: install_element (VIEW_NODE, &show_ip_bgp_view_prefix_cmd);
! 12352: install_element (VIEW_NODE, &show_ip_bgp_regexp_cmd);
! 12353: install_element (VIEW_NODE, &show_ip_bgp_ipv4_regexp_cmd);
! 12354: install_element (VIEW_NODE, &show_ip_bgp_prefix_list_cmd);
! 12355: install_element (VIEW_NODE, &show_ip_bgp_ipv4_prefix_list_cmd);
! 12356: install_element (VIEW_NODE, &show_ip_bgp_filter_list_cmd);
! 12357: install_element (VIEW_NODE, &show_ip_bgp_ipv4_filter_list_cmd);
! 12358: install_element (VIEW_NODE, &show_ip_bgp_route_map_cmd);
! 12359: install_element (VIEW_NODE, &show_ip_bgp_ipv4_route_map_cmd);
! 12360: install_element (VIEW_NODE, &show_ip_bgp_cidr_only_cmd);
! 12361: install_element (VIEW_NODE, &show_ip_bgp_ipv4_cidr_only_cmd);
! 12362: install_element (VIEW_NODE, &show_ip_bgp_community_all_cmd);
! 12363: install_element (VIEW_NODE, &show_ip_bgp_ipv4_community_all_cmd);
! 12364: install_element (VIEW_NODE, &show_ip_bgp_community_cmd);
! 12365: install_element (VIEW_NODE, &show_ip_bgp_community2_cmd);
! 12366: install_element (VIEW_NODE, &show_ip_bgp_community3_cmd);
! 12367: install_element (VIEW_NODE, &show_ip_bgp_community4_cmd);
! 12368: install_element (VIEW_NODE, &show_ip_bgp_ipv4_community_cmd);
! 12369: install_element (VIEW_NODE, &show_ip_bgp_ipv4_community2_cmd);
! 12370: install_element (VIEW_NODE, &show_ip_bgp_ipv4_community3_cmd);
! 12371: install_element (VIEW_NODE, &show_ip_bgp_ipv4_community4_cmd);
! 12372: install_element (VIEW_NODE, &show_bgp_view_afi_safi_community_all_cmd);
! 12373: install_element (VIEW_NODE, &show_bgp_view_afi_safi_community_cmd);
! 12374: install_element (VIEW_NODE, &show_bgp_view_afi_safi_community2_cmd);
! 12375: install_element (VIEW_NODE, &show_bgp_view_afi_safi_community3_cmd);
! 12376: install_element (VIEW_NODE, &show_bgp_view_afi_safi_community4_cmd);
! 12377: install_element (VIEW_NODE, &show_ip_bgp_community_exact_cmd);
! 12378: install_element (VIEW_NODE, &show_ip_bgp_community2_exact_cmd);
! 12379: install_element (VIEW_NODE, &show_ip_bgp_community3_exact_cmd);
! 12380: install_element (VIEW_NODE, &show_ip_bgp_community4_exact_cmd);
! 12381: install_element (VIEW_NODE, &show_ip_bgp_ipv4_community_exact_cmd);
! 12382: install_element (VIEW_NODE, &show_ip_bgp_ipv4_community2_exact_cmd);
! 12383: install_element (VIEW_NODE, &show_ip_bgp_ipv4_community3_exact_cmd);
! 12384: install_element (VIEW_NODE, &show_ip_bgp_ipv4_community4_exact_cmd);
! 12385: install_element (VIEW_NODE, &show_ip_bgp_community_list_cmd);
! 12386: install_element (VIEW_NODE, &show_ip_bgp_ipv4_community_list_cmd);
! 12387: install_element (VIEW_NODE, &show_ip_bgp_community_list_exact_cmd);
! 12388: install_element (VIEW_NODE, &show_ip_bgp_ipv4_community_list_exact_cmd);
! 12389: install_element (VIEW_NODE, &show_ip_bgp_prefix_longer_cmd);
! 12390: install_element (VIEW_NODE, &show_ip_bgp_ipv4_prefix_longer_cmd);
! 12391: install_element (VIEW_NODE, &show_ip_bgp_neighbor_advertised_route_cmd);
! 12392: install_element (VIEW_NODE, &show_ip_bgp_ipv4_neighbor_advertised_route_cmd);
! 12393: install_element (VIEW_NODE, &show_ip_bgp_neighbor_received_routes_cmd);
! 12394: install_element (VIEW_NODE, &show_ip_bgp_ipv4_neighbor_received_routes_cmd);
! 12395: install_element (VIEW_NODE, &show_bgp_view_afi_safi_neighbor_adv_recd_routes_cmd);
! 12396: install_element (VIEW_NODE, &show_ip_bgp_neighbor_routes_cmd);
! 12397: install_element (VIEW_NODE, &show_ip_bgp_ipv4_neighbor_routes_cmd);
! 12398: install_element (VIEW_NODE, &show_ip_bgp_neighbor_received_prefix_filter_cmd);
! 12399: install_element (VIEW_NODE, &show_ip_bgp_ipv4_neighbor_received_prefix_filter_cmd);
! 12400: install_element (VIEW_NODE, &show_ip_bgp_dampened_paths_cmd);
! 12401: install_element (VIEW_NODE, &show_ip_bgp_flap_statistics_cmd);
! 12402: install_element (VIEW_NODE, &show_ip_bgp_flap_address_cmd);
! 12403: install_element (VIEW_NODE, &show_ip_bgp_flap_prefix_cmd);
! 12404: install_element (VIEW_NODE, &show_ip_bgp_flap_cidr_only_cmd);
! 12405: install_element (VIEW_NODE, &show_ip_bgp_flap_regexp_cmd);
! 12406: install_element (VIEW_NODE, &show_ip_bgp_flap_filter_list_cmd);
! 12407: install_element (VIEW_NODE, &show_ip_bgp_flap_prefix_list_cmd);
! 12408: install_element (VIEW_NODE, &show_ip_bgp_flap_prefix_longer_cmd);
! 12409: install_element (VIEW_NODE, &show_ip_bgp_flap_route_map_cmd);
! 12410: install_element (VIEW_NODE, &show_ip_bgp_neighbor_flap_cmd);
! 12411: install_element (VIEW_NODE, &show_ip_bgp_neighbor_damp_cmd);
! 12412: install_element (VIEW_NODE, &show_ip_bgp_rsclient_cmd);
! 12413: install_element (VIEW_NODE, &show_bgp_ipv4_safi_rsclient_cmd);
! 12414: install_element (VIEW_NODE, &show_ip_bgp_rsclient_route_cmd);
! 12415: install_element (VIEW_NODE, &show_bgp_ipv4_safi_rsclient_route_cmd);
! 12416: install_element (VIEW_NODE, &show_ip_bgp_rsclient_prefix_cmd);
! 12417: install_element (VIEW_NODE, &show_bgp_ipv4_safi_rsclient_prefix_cmd);
! 12418: install_element (VIEW_NODE, &show_ip_bgp_view_neighbor_advertised_route_cmd);
! 12419: install_element (VIEW_NODE, &show_ip_bgp_view_neighbor_received_routes_cmd);
! 12420: install_element (VIEW_NODE, &show_ip_bgp_view_rsclient_cmd);
! 12421: install_element (VIEW_NODE, &show_bgp_view_ipv4_safi_rsclient_cmd);
! 12422: install_element (VIEW_NODE, &show_ip_bgp_view_rsclient_route_cmd);
! 12423: install_element (VIEW_NODE, &show_bgp_view_ipv4_safi_rsclient_route_cmd);
! 12424: install_element (VIEW_NODE, &show_ip_bgp_view_rsclient_prefix_cmd);
! 12425: install_element (VIEW_NODE, &show_bgp_view_ipv4_safi_rsclient_prefix_cmd);
! 12426:
! 12427: /* Restricted node: VIEW_NODE - (set of dangerous commands) */
! 12428: install_element (RESTRICTED_NODE, &show_ip_bgp_route_cmd);
! 12429: install_element (RESTRICTED_NODE, &show_ip_bgp_ipv4_route_cmd);
! 12430: install_element (RESTRICTED_NODE, &show_bgp_ipv4_safi_route_cmd);
! 12431: install_element (RESTRICTED_NODE, &show_ip_bgp_vpnv4_rd_route_cmd);
! 12432: install_element (RESTRICTED_NODE, &show_ip_bgp_prefix_cmd);
! 12433: install_element (RESTRICTED_NODE, &show_ip_bgp_ipv4_prefix_cmd);
! 12434: install_element (RESTRICTED_NODE, &show_bgp_ipv4_safi_prefix_cmd);
! 12435: install_element (RESTRICTED_NODE, &show_ip_bgp_vpnv4_all_prefix_cmd);
! 12436: install_element (RESTRICTED_NODE, &show_ip_bgp_vpnv4_rd_prefix_cmd);
! 12437: install_element (RESTRICTED_NODE, &show_ip_bgp_view_route_cmd);
! 12438: install_element (RESTRICTED_NODE, &show_ip_bgp_view_prefix_cmd);
! 12439: install_element (RESTRICTED_NODE, &show_ip_bgp_community_cmd);
! 12440: install_element (RESTRICTED_NODE, &show_ip_bgp_community2_cmd);
! 12441: install_element (RESTRICTED_NODE, &show_ip_bgp_community3_cmd);
! 12442: install_element (RESTRICTED_NODE, &show_ip_bgp_community4_cmd);
! 12443: install_element (RESTRICTED_NODE, &show_ip_bgp_ipv4_community_cmd);
! 12444: install_element (RESTRICTED_NODE, &show_ip_bgp_ipv4_community2_cmd);
! 12445: install_element (RESTRICTED_NODE, &show_ip_bgp_ipv4_community3_cmd);
! 12446: install_element (RESTRICTED_NODE, &show_ip_bgp_ipv4_community4_cmd);
! 12447: install_element (RESTRICTED_NODE, &show_bgp_view_afi_safi_community_all_cmd);
! 12448: install_element (RESTRICTED_NODE, &show_bgp_view_afi_safi_community_cmd);
! 12449: install_element (RESTRICTED_NODE, &show_bgp_view_afi_safi_community2_cmd);
! 12450: install_element (RESTRICTED_NODE, &show_bgp_view_afi_safi_community3_cmd);
! 12451: install_element (RESTRICTED_NODE, &show_bgp_view_afi_safi_community4_cmd);
! 12452: install_element (RESTRICTED_NODE, &show_ip_bgp_community_exact_cmd);
! 12453: install_element (RESTRICTED_NODE, &show_ip_bgp_community2_exact_cmd);
! 12454: install_element (RESTRICTED_NODE, &show_ip_bgp_community3_exact_cmd);
! 12455: install_element (RESTRICTED_NODE, &show_ip_bgp_community4_exact_cmd);
! 12456: install_element (RESTRICTED_NODE, &show_ip_bgp_ipv4_community_exact_cmd);
! 12457: install_element (RESTRICTED_NODE, &show_ip_bgp_ipv4_community2_exact_cmd);
! 12458: install_element (RESTRICTED_NODE, &show_ip_bgp_ipv4_community3_exact_cmd);
! 12459: install_element (RESTRICTED_NODE, &show_ip_bgp_ipv4_community4_exact_cmd);
! 12460: install_element (RESTRICTED_NODE, &show_ip_bgp_rsclient_route_cmd);
! 12461: install_element (RESTRICTED_NODE, &show_bgp_ipv4_safi_rsclient_route_cmd);
! 12462: install_element (RESTRICTED_NODE, &show_ip_bgp_rsclient_prefix_cmd);
! 12463: install_element (RESTRICTED_NODE, &show_bgp_ipv4_safi_rsclient_prefix_cmd);
! 12464: install_element (RESTRICTED_NODE, &show_ip_bgp_view_rsclient_route_cmd);
! 12465: install_element (RESTRICTED_NODE, &show_bgp_view_ipv4_safi_rsclient_route_cmd);
! 12466: install_element (RESTRICTED_NODE, &show_ip_bgp_view_rsclient_prefix_cmd);
! 12467: install_element (RESTRICTED_NODE, &show_bgp_view_ipv4_safi_rsclient_prefix_cmd);
! 12468:
! 12469: install_element (ENABLE_NODE, &show_ip_bgp_cmd);
! 12470: install_element (ENABLE_NODE, &show_ip_bgp_ipv4_cmd);
! 12471: install_element (ENABLE_NODE, &show_bgp_ipv4_safi_cmd);
! 12472: install_element (ENABLE_NODE, &show_ip_bgp_route_cmd);
! 12473: install_element (ENABLE_NODE, &show_ip_bgp_ipv4_route_cmd);
! 12474: install_element (ENABLE_NODE, &show_bgp_ipv4_safi_route_cmd);
! 12475: install_element (ENABLE_NODE, &show_ip_bgp_vpnv4_all_route_cmd);
! 12476: install_element (ENABLE_NODE, &show_ip_bgp_vpnv4_rd_route_cmd);
! 12477: install_element (ENABLE_NODE, &show_ip_bgp_prefix_cmd);
! 12478: install_element (ENABLE_NODE, &show_ip_bgp_ipv4_prefix_cmd);
! 12479: install_element (ENABLE_NODE, &show_bgp_ipv4_safi_prefix_cmd);
! 12480: install_element (ENABLE_NODE, &show_ip_bgp_vpnv4_all_prefix_cmd);
! 12481: install_element (ENABLE_NODE, &show_ip_bgp_vpnv4_rd_prefix_cmd);
! 12482: install_element (ENABLE_NODE, &show_ip_bgp_view_cmd);
! 12483: install_element (ENABLE_NODE, &show_ip_bgp_view_route_cmd);
! 12484: install_element (ENABLE_NODE, &show_ip_bgp_view_prefix_cmd);
! 12485: install_element (ENABLE_NODE, &show_ip_bgp_regexp_cmd);
! 12486: install_element (ENABLE_NODE, &show_ip_bgp_ipv4_regexp_cmd);
! 12487: install_element (ENABLE_NODE, &show_ip_bgp_prefix_list_cmd);
! 12488: install_element (ENABLE_NODE, &show_ip_bgp_ipv4_prefix_list_cmd);
! 12489: install_element (ENABLE_NODE, &show_ip_bgp_filter_list_cmd);
! 12490: install_element (ENABLE_NODE, &show_ip_bgp_ipv4_filter_list_cmd);
! 12491: install_element (ENABLE_NODE, &show_ip_bgp_route_map_cmd);
! 12492: install_element (ENABLE_NODE, &show_ip_bgp_ipv4_route_map_cmd);
! 12493: install_element (ENABLE_NODE, &show_ip_bgp_cidr_only_cmd);
! 12494: install_element (ENABLE_NODE, &show_ip_bgp_ipv4_cidr_only_cmd);
! 12495: install_element (ENABLE_NODE, &show_ip_bgp_community_all_cmd);
! 12496: install_element (ENABLE_NODE, &show_ip_bgp_ipv4_community_all_cmd);
! 12497: install_element (ENABLE_NODE, &show_ip_bgp_community_cmd);
! 12498: install_element (ENABLE_NODE, &show_ip_bgp_community2_cmd);
! 12499: install_element (ENABLE_NODE, &show_ip_bgp_community3_cmd);
! 12500: install_element (ENABLE_NODE, &show_ip_bgp_community4_cmd);
! 12501: install_element (ENABLE_NODE, &show_ip_bgp_ipv4_community_cmd);
! 12502: install_element (ENABLE_NODE, &show_ip_bgp_ipv4_community2_cmd);
! 12503: install_element (ENABLE_NODE, &show_ip_bgp_ipv4_community3_cmd);
! 12504: install_element (ENABLE_NODE, &show_ip_bgp_ipv4_community4_cmd);
! 12505: install_element (ENABLE_NODE, &show_bgp_view_afi_safi_community_all_cmd);
! 12506: install_element (ENABLE_NODE, &show_bgp_view_afi_safi_community_cmd);
! 12507: install_element (ENABLE_NODE, &show_bgp_view_afi_safi_community2_cmd);
! 12508: install_element (ENABLE_NODE, &show_bgp_view_afi_safi_community3_cmd);
! 12509: install_element (ENABLE_NODE, &show_bgp_view_afi_safi_community4_cmd);
! 12510: install_element (ENABLE_NODE, &show_ip_bgp_community_exact_cmd);
! 12511: install_element (ENABLE_NODE, &show_ip_bgp_community2_exact_cmd);
! 12512: install_element (ENABLE_NODE, &show_ip_bgp_community3_exact_cmd);
! 12513: install_element (ENABLE_NODE, &show_ip_bgp_community4_exact_cmd);
! 12514: install_element (ENABLE_NODE, &show_ip_bgp_ipv4_community_exact_cmd);
! 12515: install_element (ENABLE_NODE, &show_ip_bgp_ipv4_community2_exact_cmd);
! 12516: install_element (ENABLE_NODE, &show_ip_bgp_ipv4_community3_exact_cmd);
! 12517: install_element (ENABLE_NODE, &show_ip_bgp_ipv4_community4_exact_cmd);
! 12518: install_element (ENABLE_NODE, &show_ip_bgp_community_list_cmd);
! 12519: install_element (ENABLE_NODE, &show_ip_bgp_ipv4_community_list_cmd);
! 12520: install_element (ENABLE_NODE, &show_ip_bgp_community_list_exact_cmd);
! 12521: install_element (ENABLE_NODE, &show_ip_bgp_ipv4_community_list_exact_cmd);
! 12522: install_element (ENABLE_NODE, &show_ip_bgp_prefix_longer_cmd);
! 12523: install_element (ENABLE_NODE, &show_ip_bgp_ipv4_prefix_longer_cmd);
! 12524: install_element (ENABLE_NODE, &show_ip_bgp_neighbor_advertised_route_cmd);
! 12525: install_element (ENABLE_NODE, &show_ip_bgp_ipv4_neighbor_advertised_route_cmd);
! 12526: install_element (ENABLE_NODE, &show_ip_bgp_neighbor_received_routes_cmd);
! 12527: install_element (ENABLE_NODE, &show_ip_bgp_ipv4_neighbor_received_routes_cmd);
! 12528: install_element (ENABLE_NODE, &show_bgp_view_afi_safi_neighbor_adv_recd_routes_cmd);
! 12529: install_element (ENABLE_NODE, &show_ip_bgp_neighbor_routes_cmd);
! 12530: install_element (ENABLE_NODE, &show_ip_bgp_ipv4_neighbor_routes_cmd);
! 12531: install_element (ENABLE_NODE, &show_ip_bgp_neighbor_received_prefix_filter_cmd);
! 12532: install_element (ENABLE_NODE, &show_ip_bgp_ipv4_neighbor_received_prefix_filter_cmd);
! 12533: install_element (ENABLE_NODE, &show_ip_bgp_dampened_paths_cmd);
! 12534: install_element (ENABLE_NODE, &show_ip_bgp_flap_statistics_cmd);
! 12535: install_element (ENABLE_NODE, &show_ip_bgp_flap_address_cmd);
! 12536: install_element (ENABLE_NODE, &show_ip_bgp_flap_prefix_cmd);
! 12537: install_element (ENABLE_NODE, &show_ip_bgp_flap_cidr_only_cmd);
! 12538: install_element (ENABLE_NODE, &show_ip_bgp_flap_regexp_cmd);
! 12539: install_element (ENABLE_NODE, &show_ip_bgp_flap_filter_list_cmd);
! 12540: install_element (ENABLE_NODE, &show_ip_bgp_flap_prefix_list_cmd);
! 12541: install_element (ENABLE_NODE, &show_ip_bgp_flap_prefix_longer_cmd);
! 12542: install_element (ENABLE_NODE, &show_ip_bgp_flap_route_map_cmd);
! 12543: install_element (ENABLE_NODE, &show_ip_bgp_neighbor_flap_cmd);
! 12544: install_element (ENABLE_NODE, &show_ip_bgp_neighbor_damp_cmd);
! 12545: install_element (ENABLE_NODE, &show_ip_bgp_rsclient_cmd);
! 12546: install_element (ENABLE_NODE, &show_bgp_ipv4_safi_rsclient_cmd);
! 12547: install_element (ENABLE_NODE, &show_ip_bgp_rsclient_route_cmd);
! 12548: install_element (ENABLE_NODE, &show_bgp_ipv4_safi_rsclient_route_cmd);
! 12549: install_element (ENABLE_NODE, &show_ip_bgp_rsclient_prefix_cmd);
! 12550: install_element (ENABLE_NODE, &show_bgp_ipv4_safi_rsclient_prefix_cmd);
! 12551: install_element (ENABLE_NODE, &show_ip_bgp_view_neighbor_advertised_route_cmd);
! 12552: install_element (ENABLE_NODE, &show_ip_bgp_view_neighbor_received_routes_cmd);
! 12553: install_element (ENABLE_NODE, &show_ip_bgp_view_rsclient_cmd);
! 12554: install_element (ENABLE_NODE, &show_bgp_view_ipv4_safi_rsclient_cmd);
! 12555: install_element (ENABLE_NODE, &show_ip_bgp_view_rsclient_route_cmd);
! 12556: install_element (ENABLE_NODE, &show_bgp_view_ipv4_safi_rsclient_route_cmd);
! 12557: install_element (ENABLE_NODE, &show_ip_bgp_view_rsclient_prefix_cmd);
! 12558: install_element (ENABLE_NODE, &show_bgp_view_ipv4_safi_rsclient_prefix_cmd);
! 12559:
! 12560: /* BGP dampening clear commands */
! 12561: install_element (ENABLE_NODE, &clear_ip_bgp_dampening_cmd);
! 12562: install_element (ENABLE_NODE, &clear_ip_bgp_dampening_prefix_cmd);
! 12563: install_element (ENABLE_NODE, &clear_ip_bgp_dampening_address_cmd);
! 12564: install_element (ENABLE_NODE, &clear_ip_bgp_dampening_address_mask_cmd);
! 12565:
! 12566: /* prefix count */
! 12567: install_element (ENABLE_NODE, &show_ip_bgp_neighbor_prefix_counts_cmd);
! 12568: install_element (ENABLE_NODE, &show_ip_bgp_ipv4_neighbor_prefix_counts_cmd);
! 12569: install_element (ENABLE_NODE, &show_ip_bgp_vpnv4_neighbor_prefix_counts_cmd);
! 12570: #ifdef HAVE_IPV6
! 12571: install_element (ENABLE_NODE, &show_bgp_ipv6_neighbor_prefix_counts_cmd);
! 12572:
! 12573: /* New config IPv6 BGP commands. */
! 12574: install_element (BGP_IPV6_NODE, &ipv6_bgp_network_cmd);
! 12575: install_element (BGP_IPV6_NODE, &ipv6_bgp_network_route_map_cmd);
! 12576: install_element (BGP_IPV6_NODE, &no_ipv6_bgp_network_cmd);
! 12577: install_element (BGP_IPV6_NODE, &no_ipv6_bgp_network_route_map_cmd);
! 12578:
! 12579: install_element (BGP_IPV6_NODE, &ipv6_aggregate_address_cmd);
! 12580: install_element (BGP_IPV6_NODE, &ipv6_aggregate_address_summary_only_cmd);
! 12581: install_element (BGP_IPV6_NODE, &no_ipv6_aggregate_address_cmd);
! 12582: install_element (BGP_IPV6_NODE, &no_ipv6_aggregate_address_summary_only_cmd);
! 12583:
! 12584: /* Old config IPv6 BGP commands. */
! 12585: install_element (BGP_NODE, &old_ipv6_bgp_network_cmd);
! 12586: install_element (BGP_NODE, &old_no_ipv6_bgp_network_cmd);
! 12587:
! 12588: install_element (BGP_NODE, &old_ipv6_aggregate_address_cmd);
! 12589: install_element (BGP_NODE, &old_ipv6_aggregate_address_summary_only_cmd);
! 12590: install_element (BGP_NODE, &old_no_ipv6_aggregate_address_cmd);
! 12591: install_element (BGP_NODE, &old_no_ipv6_aggregate_address_summary_only_cmd);
! 12592:
! 12593: install_element (VIEW_NODE, &show_bgp_cmd);
! 12594: install_element (VIEW_NODE, &show_bgp_ipv6_cmd);
! 12595: install_element (VIEW_NODE, &show_bgp_ipv6_safi_cmd);
! 12596: install_element (VIEW_NODE, &show_bgp_route_cmd);
! 12597: install_element (VIEW_NODE, &show_bgp_ipv6_route_cmd);
! 12598: install_element (VIEW_NODE, &show_bgp_ipv6_safi_route_cmd);
! 12599: install_element (VIEW_NODE, &show_bgp_prefix_cmd);
! 12600: install_element (VIEW_NODE, &show_bgp_ipv6_prefix_cmd);
! 12601: install_element (VIEW_NODE, &show_bgp_ipv6_safi_prefix_cmd);
! 12602: install_element (VIEW_NODE, &show_bgp_regexp_cmd);
! 12603: install_element (VIEW_NODE, &show_bgp_ipv6_regexp_cmd);
! 12604: install_element (VIEW_NODE, &show_bgp_prefix_list_cmd);
! 12605: install_element (VIEW_NODE, &show_bgp_ipv6_prefix_list_cmd);
! 12606: install_element (VIEW_NODE, &show_bgp_filter_list_cmd);
! 12607: install_element (VIEW_NODE, &show_bgp_ipv6_filter_list_cmd);
! 12608: install_element (VIEW_NODE, &show_bgp_route_map_cmd);
! 12609: install_element (VIEW_NODE, &show_bgp_ipv6_route_map_cmd);
! 12610: install_element (VIEW_NODE, &show_bgp_community_all_cmd);
! 12611: install_element (VIEW_NODE, &show_bgp_ipv6_community_all_cmd);
! 12612: install_element (VIEW_NODE, &show_bgp_community_cmd);
! 12613: install_element (VIEW_NODE, &show_bgp_ipv6_community_cmd);
! 12614: install_element (VIEW_NODE, &show_bgp_community2_cmd);
! 12615: install_element (VIEW_NODE, &show_bgp_ipv6_community2_cmd);
! 12616: install_element (VIEW_NODE, &show_bgp_community3_cmd);
! 12617: install_element (VIEW_NODE, &show_bgp_ipv6_community3_cmd);
! 12618: install_element (VIEW_NODE, &show_bgp_community4_cmd);
! 12619: install_element (VIEW_NODE, &show_bgp_ipv6_community4_cmd);
! 12620: install_element (VIEW_NODE, &show_bgp_community_exact_cmd);
! 12621: install_element (VIEW_NODE, &show_bgp_ipv6_community_exact_cmd);
! 12622: install_element (VIEW_NODE, &show_bgp_community2_exact_cmd);
! 12623: install_element (VIEW_NODE, &show_bgp_ipv6_community2_exact_cmd);
! 12624: install_element (VIEW_NODE, &show_bgp_community3_exact_cmd);
! 12625: install_element (VIEW_NODE, &show_bgp_ipv6_community3_exact_cmd);
! 12626: install_element (VIEW_NODE, &show_bgp_community4_exact_cmd);
! 12627: install_element (VIEW_NODE, &show_bgp_ipv6_community4_exact_cmd);
! 12628: install_element (VIEW_NODE, &show_bgp_community_list_cmd);
! 12629: install_element (VIEW_NODE, &show_bgp_ipv6_community_list_cmd);
! 12630: install_element (VIEW_NODE, &show_bgp_community_list_exact_cmd);
! 12631: install_element (VIEW_NODE, &show_bgp_ipv6_community_list_exact_cmd);
! 12632: install_element (VIEW_NODE, &show_bgp_prefix_longer_cmd);
! 12633: install_element (VIEW_NODE, &show_bgp_ipv6_prefix_longer_cmd);
! 12634: install_element (VIEW_NODE, &show_bgp_neighbor_advertised_route_cmd);
! 12635: install_element (VIEW_NODE, &show_bgp_ipv6_neighbor_advertised_route_cmd);
! 12636: install_element (VIEW_NODE, &show_bgp_neighbor_received_routes_cmd);
! 12637: install_element (VIEW_NODE, &show_bgp_ipv6_neighbor_received_routes_cmd);
! 12638: install_element (VIEW_NODE, &show_bgp_neighbor_routes_cmd);
! 12639: install_element (VIEW_NODE, &show_bgp_ipv6_neighbor_routes_cmd);
! 12640: install_element (VIEW_NODE, &show_bgp_neighbor_received_prefix_filter_cmd);
! 12641: install_element (VIEW_NODE, &show_bgp_ipv6_neighbor_received_prefix_filter_cmd);
! 12642: install_element (VIEW_NODE, &show_bgp_neighbor_flap_cmd);
! 12643: install_element (VIEW_NODE, &show_bgp_ipv6_neighbor_flap_cmd);
! 12644: install_element (VIEW_NODE, &show_bgp_neighbor_damp_cmd);
! 12645: install_element (VIEW_NODE, &show_bgp_ipv6_neighbor_damp_cmd);
! 12646: install_element (VIEW_NODE, &show_bgp_rsclient_cmd);
! 12647: install_element (VIEW_NODE, &show_bgp_ipv6_safi_rsclient_cmd);
! 12648: install_element (VIEW_NODE, &show_bgp_rsclient_route_cmd);
! 12649: install_element (VIEW_NODE, &show_bgp_ipv6_safi_rsclient_route_cmd);
! 12650: install_element (VIEW_NODE, &show_bgp_rsclient_prefix_cmd);
! 12651: install_element (VIEW_NODE, &show_bgp_ipv6_safi_rsclient_prefix_cmd);
! 12652: install_element (VIEW_NODE, &show_bgp_view_cmd);
! 12653: install_element (VIEW_NODE, &show_bgp_view_ipv6_cmd);
! 12654: install_element (VIEW_NODE, &show_bgp_view_route_cmd);
! 12655: install_element (VIEW_NODE, &show_bgp_view_ipv6_route_cmd);
! 12656: install_element (VIEW_NODE, &show_bgp_view_prefix_cmd);
! 12657: install_element (VIEW_NODE, &show_bgp_view_ipv6_prefix_cmd);
! 12658: install_element (VIEW_NODE, &show_bgp_view_neighbor_advertised_route_cmd);
! 12659: install_element (VIEW_NODE, &show_bgp_view_ipv6_neighbor_advertised_route_cmd);
! 12660: install_element (VIEW_NODE, &show_bgp_view_neighbor_received_routes_cmd);
! 12661: install_element (VIEW_NODE, &show_bgp_view_ipv6_neighbor_received_routes_cmd);
! 12662: install_element (VIEW_NODE, &show_bgp_view_neighbor_routes_cmd);
! 12663: install_element (VIEW_NODE, &show_bgp_view_ipv6_neighbor_routes_cmd);
! 12664: install_element (VIEW_NODE, &show_bgp_view_neighbor_received_prefix_filter_cmd);
! 12665: install_element (VIEW_NODE, &show_bgp_view_ipv6_neighbor_received_prefix_filter_cmd);
! 12666: install_element (VIEW_NODE, &show_bgp_view_neighbor_flap_cmd);
! 12667: install_element (VIEW_NODE, &show_bgp_view_ipv6_neighbor_flap_cmd);
! 12668: install_element (VIEW_NODE, &show_bgp_view_neighbor_damp_cmd);
! 12669: install_element (VIEW_NODE, &show_bgp_view_ipv6_neighbor_damp_cmd);
! 12670: install_element (VIEW_NODE, &show_bgp_view_rsclient_cmd);
! 12671: install_element (VIEW_NODE, &show_bgp_view_ipv6_safi_rsclient_cmd);
! 12672: install_element (VIEW_NODE, &show_bgp_view_rsclient_route_cmd);
! 12673: install_element (VIEW_NODE, &show_bgp_view_ipv6_safi_rsclient_route_cmd);
! 12674: install_element (VIEW_NODE, &show_bgp_view_rsclient_prefix_cmd);
! 12675: install_element (VIEW_NODE, &show_bgp_view_ipv6_safi_rsclient_prefix_cmd);
! 12676:
! 12677: /* Restricted:
! 12678: * VIEW_NODE - (set of dangerous commands) - (commands dependent on prev)
! 12679: */
! 12680: install_element (RESTRICTED_NODE, &show_bgp_route_cmd);
! 12681: install_element (RESTRICTED_NODE, &show_bgp_ipv6_route_cmd);
! 12682: install_element (RESTRICTED_NODE, &show_bgp_ipv6_safi_route_cmd);
! 12683: install_element (RESTRICTED_NODE, &show_bgp_prefix_cmd);
! 12684: install_element (RESTRICTED_NODE, &show_bgp_ipv6_prefix_cmd);
! 12685: install_element (RESTRICTED_NODE, &show_bgp_ipv6_safi_prefix_cmd);
! 12686: install_element (RESTRICTED_NODE, &show_bgp_community_cmd);
! 12687: install_element (RESTRICTED_NODE, &show_bgp_ipv6_community_cmd);
! 12688: install_element (RESTRICTED_NODE, &show_bgp_community2_cmd);
! 12689: install_element (RESTRICTED_NODE, &show_bgp_ipv6_community2_cmd);
! 12690: install_element (RESTRICTED_NODE, &show_bgp_community3_cmd);
! 12691: install_element (RESTRICTED_NODE, &show_bgp_ipv6_community3_cmd);
! 12692: install_element (RESTRICTED_NODE, &show_bgp_community4_cmd);
! 12693: install_element (RESTRICTED_NODE, &show_bgp_ipv6_community4_cmd);
! 12694: install_element (RESTRICTED_NODE, &show_bgp_community_exact_cmd);
! 12695: install_element (RESTRICTED_NODE, &show_bgp_ipv6_community_exact_cmd);
! 12696: install_element (RESTRICTED_NODE, &show_bgp_community2_exact_cmd);
! 12697: install_element (RESTRICTED_NODE, &show_bgp_ipv6_community2_exact_cmd);
! 12698: install_element (RESTRICTED_NODE, &show_bgp_community3_exact_cmd);
! 12699: install_element (RESTRICTED_NODE, &show_bgp_ipv6_community3_exact_cmd);
! 12700: install_element (RESTRICTED_NODE, &show_bgp_community4_exact_cmd);
! 12701: install_element (RESTRICTED_NODE, &show_bgp_ipv6_community4_exact_cmd);
! 12702: install_element (RESTRICTED_NODE, &show_bgp_rsclient_route_cmd);
! 12703: install_element (RESTRICTED_NODE, &show_bgp_ipv6_safi_rsclient_route_cmd);
! 12704: install_element (RESTRICTED_NODE, &show_bgp_rsclient_prefix_cmd);
! 12705: install_element (RESTRICTED_NODE, &show_bgp_ipv6_safi_rsclient_prefix_cmd);
! 12706: install_element (RESTRICTED_NODE, &show_bgp_view_route_cmd);
! 12707: install_element (RESTRICTED_NODE, &show_bgp_view_ipv6_route_cmd);
! 12708: install_element (RESTRICTED_NODE, &show_bgp_view_prefix_cmd);
! 12709: install_element (RESTRICTED_NODE, &show_bgp_view_ipv6_prefix_cmd);
! 12710: install_element (RESTRICTED_NODE, &show_bgp_view_neighbor_received_prefix_filter_cmd);
! 12711: install_element (RESTRICTED_NODE, &show_bgp_view_ipv6_neighbor_received_prefix_filter_cmd);
! 12712: install_element (RESTRICTED_NODE, &show_bgp_view_rsclient_route_cmd);
! 12713: install_element (RESTRICTED_NODE, &show_bgp_view_ipv6_safi_rsclient_route_cmd);
! 12714: install_element (RESTRICTED_NODE, &show_bgp_view_rsclient_prefix_cmd);
! 12715: install_element (RESTRICTED_NODE, &show_bgp_view_ipv6_safi_rsclient_prefix_cmd);
! 12716:
! 12717: install_element (ENABLE_NODE, &show_bgp_cmd);
! 12718: install_element (ENABLE_NODE, &show_bgp_ipv6_cmd);
! 12719: install_element (ENABLE_NODE, &show_bgp_ipv6_safi_cmd);
! 12720: install_element (ENABLE_NODE, &show_bgp_route_cmd);
! 12721: install_element (ENABLE_NODE, &show_bgp_ipv6_route_cmd);
! 12722: install_element (ENABLE_NODE, &show_bgp_ipv6_safi_route_cmd);
! 12723: install_element (ENABLE_NODE, &show_bgp_prefix_cmd);
! 12724: install_element (ENABLE_NODE, &show_bgp_ipv6_prefix_cmd);
! 12725: install_element (ENABLE_NODE, &show_bgp_ipv6_safi_prefix_cmd);
! 12726: install_element (ENABLE_NODE, &show_bgp_regexp_cmd);
! 12727: install_element (ENABLE_NODE, &show_bgp_ipv6_regexp_cmd);
! 12728: install_element (ENABLE_NODE, &show_bgp_prefix_list_cmd);
! 12729: install_element (ENABLE_NODE, &show_bgp_ipv6_prefix_list_cmd);
! 12730: install_element (ENABLE_NODE, &show_bgp_filter_list_cmd);
! 12731: install_element (ENABLE_NODE, &show_bgp_ipv6_filter_list_cmd);
! 12732: install_element (ENABLE_NODE, &show_bgp_route_map_cmd);
! 12733: install_element (ENABLE_NODE, &show_bgp_ipv6_route_map_cmd);
! 12734: install_element (ENABLE_NODE, &show_bgp_community_all_cmd);
! 12735: install_element (ENABLE_NODE, &show_bgp_ipv6_community_all_cmd);
! 12736: install_element (ENABLE_NODE, &show_bgp_community_cmd);
! 12737: install_element (ENABLE_NODE, &show_bgp_ipv6_community_cmd);
! 12738: install_element (ENABLE_NODE, &show_bgp_community2_cmd);
! 12739: install_element (ENABLE_NODE, &show_bgp_ipv6_community2_cmd);
! 12740: install_element (ENABLE_NODE, &show_bgp_community3_cmd);
! 12741: install_element (ENABLE_NODE, &show_bgp_ipv6_community3_cmd);
! 12742: install_element (ENABLE_NODE, &show_bgp_community4_cmd);
! 12743: install_element (ENABLE_NODE, &show_bgp_ipv6_community4_cmd);
! 12744: install_element (ENABLE_NODE, &show_bgp_community_exact_cmd);
! 12745: install_element (ENABLE_NODE, &show_bgp_ipv6_community_exact_cmd);
! 12746: install_element (ENABLE_NODE, &show_bgp_community2_exact_cmd);
! 12747: install_element (ENABLE_NODE, &show_bgp_ipv6_community2_exact_cmd);
! 12748: install_element (ENABLE_NODE, &show_bgp_community3_exact_cmd);
! 12749: install_element (ENABLE_NODE, &show_bgp_ipv6_community3_exact_cmd);
! 12750: install_element (ENABLE_NODE, &show_bgp_community4_exact_cmd);
! 12751: install_element (ENABLE_NODE, &show_bgp_ipv6_community4_exact_cmd);
! 12752: install_element (ENABLE_NODE, &show_bgp_community_list_cmd);
! 12753: install_element (ENABLE_NODE, &show_bgp_ipv6_community_list_cmd);
! 12754: install_element (ENABLE_NODE, &show_bgp_community_list_exact_cmd);
! 12755: install_element (ENABLE_NODE, &show_bgp_ipv6_community_list_exact_cmd);
! 12756: install_element (ENABLE_NODE, &show_bgp_prefix_longer_cmd);
! 12757: install_element (ENABLE_NODE, &show_bgp_ipv6_prefix_longer_cmd);
! 12758: install_element (ENABLE_NODE, &show_bgp_neighbor_advertised_route_cmd);
! 12759: install_element (ENABLE_NODE, &show_bgp_ipv6_neighbor_advertised_route_cmd);
! 12760: install_element (ENABLE_NODE, &show_bgp_neighbor_received_routes_cmd);
! 12761: install_element (ENABLE_NODE, &show_bgp_ipv6_neighbor_received_routes_cmd);
! 12762: install_element (ENABLE_NODE, &show_bgp_neighbor_routes_cmd);
! 12763: install_element (ENABLE_NODE, &show_bgp_ipv6_neighbor_routes_cmd);
! 12764: install_element (ENABLE_NODE, &show_bgp_neighbor_received_prefix_filter_cmd);
! 12765: install_element (ENABLE_NODE, &show_bgp_ipv6_neighbor_received_prefix_filter_cmd);
! 12766: install_element (ENABLE_NODE, &show_bgp_neighbor_flap_cmd);
! 12767: install_element (ENABLE_NODE, &show_bgp_ipv6_neighbor_flap_cmd);
! 12768: install_element (ENABLE_NODE, &show_bgp_neighbor_damp_cmd);
! 12769: install_element (ENABLE_NODE, &show_bgp_ipv6_neighbor_damp_cmd);
! 12770: install_element (ENABLE_NODE, &show_bgp_rsclient_cmd);
! 12771: install_element (ENABLE_NODE, &show_bgp_ipv6_safi_rsclient_cmd);
! 12772: install_element (ENABLE_NODE, &show_bgp_rsclient_route_cmd);
! 12773: install_element (ENABLE_NODE, &show_bgp_ipv6_safi_rsclient_route_cmd);
! 12774: install_element (ENABLE_NODE, &show_bgp_rsclient_prefix_cmd);
! 12775: install_element (ENABLE_NODE, &show_bgp_ipv6_safi_rsclient_prefix_cmd);
! 12776: install_element (ENABLE_NODE, &show_bgp_view_cmd);
! 12777: install_element (ENABLE_NODE, &show_bgp_view_ipv6_cmd);
! 12778: install_element (ENABLE_NODE, &show_bgp_view_route_cmd);
! 12779: install_element (ENABLE_NODE, &show_bgp_view_ipv6_route_cmd);
! 12780: install_element (ENABLE_NODE, &show_bgp_view_prefix_cmd);
! 12781: install_element (ENABLE_NODE, &show_bgp_view_ipv6_prefix_cmd);
! 12782: install_element (ENABLE_NODE, &show_bgp_view_neighbor_advertised_route_cmd);
! 12783: install_element (ENABLE_NODE, &show_bgp_view_ipv6_neighbor_advertised_route_cmd);
! 12784: install_element (ENABLE_NODE, &show_bgp_view_neighbor_received_routes_cmd);
! 12785: install_element (ENABLE_NODE, &show_bgp_view_ipv6_neighbor_received_routes_cmd);
! 12786: install_element (ENABLE_NODE, &show_bgp_view_neighbor_routes_cmd);
! 12787: install_element (ENABLE_NODE, &show_bgp_view_ipv6_neighbor_routes_cmd);
! 12788: install_element (ENABLE_NODE, &show_bgp_view_neighbor_received_prefix_filter_cmd);
! 12789: install_element (ENABLE_NODE, &show_bgp_view_ipv6_neighbor_received_prefix_filter_cmd);
! 12790: install_element (ENABLE_NODE, &show_bgp_view_neighbor_flap_cmd);
! 12791: install_element (ENABLE_NODE, &show_bgp_view_ipv6_neighbor_flap_cmd);
! 12792: install_element (ENABLE_NODE, &show_bgp_view_neighbor_damp_cmd);
! 12793: install_element (ENABLE_NODE, &show_bgp_view_ipv6_neighbor_damp_cmd);
! 12794: install_element (ENABLE_NODE, &show_bgp_view_rsclient_cmd);
! 12795: install_element (ENABLE_NODE, &show_bgp_view_ipv6_safi_rsclient_cmd);
! 12796: install_element (ENABLE_NODE, &show_bgp_view_rsclient_route_cmd);
! 12797: install_element (ENABLE_NODE, &show_bgp_view_ipv6_safi_rsclient_route_cmd);
! 12798: install_element (ENABLE_NODE, &show_bgp_view_rsclient_prefix_cmd);
! 12799: install_element (ENABLE_NODE, &show_bgp_view_ipv6_safi_rsclient_prefix_cmd);
! 12800:
! 12801: /* Statistics */
! 12802: install_element (ENABLE_NODE, &show_bgp_statistics_cmd);
! 12803: install_element (ENABLE_NODE, &show_bgp_statistics_vpnv4_cmd);
! 12804: install_element (ENABLE_NODE, &show_bgp_statistics_view_cmd);
! 12805: install_element (ENABLE_NODE, &show_bgp_statistics_view_vpnv4_cmd);
! 12806:
! 12807: /* old command */
! 12808: install_element (VIEW_NODE, &show_ipv6_bgp_cmd);
! 12809: install_element (VIEW_NODE, &show_ipv6_bgp_route_cmd);
! 12810: install_element (VIEW_NODE, &show_ipv6_bgp_prefix_cmd);
! 12811: install_element (VIEW_NODE, &show_ipv6_bgp_regexp_cmd);
! 12812: install_element (VIEW_NODE, &show_ipv6_bgp_prefix_list_cmd);
! 12813: install_element (VIEW_NODE, &show_ipv6_bgp_filter_list_cmd);
! 12814: install_element (VIEW_NODE, &show_ipv6_bgp_community_all_cmd);
! 12815: install_element (VIEW_NODE, &show_ipv6_bgp_community_cmd);
! 12816: install_element (VIEW_NODE, &show_ipv6_bgp_community2_cmd);
! 12817: install_element (VIEW_NODE, &show_ipv6_bgp_community3_cmd);
! 12818: install_element (VIEW_NODE, &show_ipv6_bgp_community4_cmd);
! 12819: install_element (VIEW_NODE, &show_ipv6_bgp_community_exact_cmd);
! 12820: install_element (VIEW_NODE, &show_ipv6_bgp_community2_exact_cmd);
! 12821: install_element (VIEW_NODE, &show_ipv6_bgp_community3_exact_cmd);
! 12822: install_element (VIEW_NODE, &show_ipv6_bgp_community4_exact_cmd);
! 12823: install_element (VIEW_NODE, &show_ipv6_bgp_community_list_cmd);
! 12824: install_element (VIEW_NODE, &show_ipv6_bgp_community_list_exact_cmd);
! 12825: install_element (VIEW_NODE, &show_ipv6_bgp_prefix_longer_cmd);
! 12826: install_element (VIEW_NODE, &show_ipv6_mbgp_cmd);
! 12827: install_element (VIEW_NODE, &show_ipv6_mbgp_route_cmd);
! 12828: install_element (VIEW_NODE, &show_ipv6_mbgp_prefix_cmd);
! 12829: install_element (VIEW_NODE, &show_ipv6_mbgp_regexp_cmd);
! 12830: install_element (VIEW_NODE, &show_ipv6_mbgp_prefix_list_cmd);
! 12831: install_element (VIEW_NODE, &show_ipv6_mbgp_filter_list_cmd);
! 12832: install_element (VIEW_NODE, &show_ipv6_mbgp_community_all_cmd);
! 12833: install_element (VIEW_NODE, &show_ipv6_mbgp_community_cmd);
! 12834: install_element (VIEW_NODE, &show_ipv6_mbgp_community2_cmd);
! 12835: install_element (VIEW_NODE, &show_ipv6_mbgp_community3_cmd);
! 12836: install_element (VIEW_NODE, &show_ipv6_mbgp_community4_cmd);
! 12837: install_element (VIEW_NODE, &show_ipv6_mbgp_community_exact_cmd);
! 12838: install_element (VIEW_NODE, &show_ipv6_mbgp_community2_exact_cmd);
! 12839: install_element (VIEW_NODE, &show_ipv6_mbgp_community3_exact_cmd);
! 12840: install_element (VIEW_NODE, &show_ipv6_mbgp_community4_exact_cmd);
! 12841: install_element (VIEW_NODE, &show_ipv6_mbgp_community_list_cmd);
! 12842: install_element (VIEW_NODE, &show_ipv6_mbgp_community_list_exact_cmd);
! 12843: install_element (VIEW_NODE, &show_ipv6_mbgp_prefix_longer_cmd);
! 12844:
! 12845: /* old command */
! 12846: install_element (ENABLE_NODE, &show_ipv6_bgp_cmd);
! 12847: install_element (ENABLE_NODE, &show_ipv6_bgp_route_cmd);
! 12848: install_element (ENABLE_NODE, &show_ipv6_bgp_prefix_cmd);
! 12849: install_element (ENABLE_NODE, &show_ipv6_bgp_regexp_cmd);
! 12850: install_element (ENABLE_NODE, &show_ipv6_bgp_prefix_list_cmd);
! 12851: install_element (ENABLE_NODE, &show_ipv6_bgp_filter_list_cmd);
! 12852: install_element (ENABLE_NODE, &show_ipv6_bgp_community_all_cmd);
! 12853: install_element (ENABLE_NODE, &show_ipv6_bgp_community_cmd);
! 12854: install_element (ENABLE_NODE, &show_ipv6_bgp_community2_cmd);
! 12855: install_element (ENABLE_NODE, &show_ipv6_bgp_community3_cmd);
! 12856: install_element (ENABLE_NODE, &show_ipv6_bgp_community4_cmd);
! 12857: install_element (ENABLE_NODE, &show_ipv6_bgp_community_exact_cmd);
! 12858: install_element (ENABLE_NODE, &show_ipv6_bgp_community2_exact_cmd);
! 12859: install_element (ENABLE_NODE, &show_ipv6_bgp_community3_exact_cmd);
! 12860: install_element (ENABLE_NODE, &show_ipv6_bgp_community4_exact_cmd);
! 12861: install_element (ENABLE_NODE, &show_ipv6_bgp_community_list_cmd);
! 12862: install_element (ENABLE_NODE, &show_ipv6_bgp_community_list_exact_cmd);
! 12863: install_element (ENABLE_NODE, &show_ipv6_bgp_prefix_longer_cmd);
! 12864: install_element (ENABLE_NODE, &show_ipv6_mbgp_cmd);
! 12865: install_element (ENABLE_NODE, &show_ipv6_mbgp_route_cmd);
! 12866: install_element (ENABLE_NODE, &show_ipv6_mbgp_prefix_cmd);
! 12867: install_element (ENABLE_NODE, &show_ipv6_mbgp_regexp_cmd);
! 12868: install_element (ENABLE_NODE, &show_ipv6_mbgp_prefix_list_cmd);
! 12869: install_element (ENABLE_NODE, &show_ipv6_mbgp_filter_list_cmd);
! 12870: install_element (ENABLE_NODE, &show_ipv6_mbgp_community_all_cmd);
! 12871: install_element (ENABLE_NODE, &show_ipv6_mbgp_community_cmd);
! 12872: install_element (ENABLE_NODE, &show_ipv6_mbgp_community2_cmd);
! 12873: install_element (ENABLE_NODE, &show_ipv6_mbgp_community3_cmd);
! 12874: install_element (ENABLE_NODE, &show_ipv6_mbgp_community4_cmd);
! 12875: install_element (ENABLE_NODE, &show_ipv6_mbgp_community_exact_cmd);
! 12876: install_element (ENABLE_NODE, &show_ipv6_mbgp_community2_exact_cmd);
! 12877: install_element (ENABLE_NODE, &show_ipv6_mbgp_community3_exact_cmd);
! 12878: install_element (ENABLE_NODE, &show_ipv6_mbgp_community4_exact_cmd);
! 12879: install_element (ENABLE_NODE, &show_ipv6_mbgp_community_list_cmd);
! 12880: install_element (ENABLE_NODE, &show_ipv6_mbgp_community_list_exact_cmd);
! 12881: install_element (ENABLE_NODE, &show_ipv6_mbgp_prefix_longer_cmd);
! 12882:
! 12883: /* old command */
! 12884: install_element (VIEW_NODE, &ipv6_bgp_neighbor_advertised_route_cmd);
! 12885: install_element (ENABLE_NODE, &ipv6_bgp_neighbor_advertised_route_cmd);
! 12886: install_element (VIEW_NODE, &ipv6_mbgp_neighbor_advertised_route_cmd);
! 12887: install_element (ENABLE_NODE, &ipv6_mbgp_neighbor_advertised_route_cmd);
! 12888:
! 12889: /* old command */
! 12890: install_element (VIEW_NODE, &ipv6_bgp_neighbor_received_routes_cmd);
! 12891: install_element (ENABLE_NODE, &ipv6_bgp_neighbor_received_routes_cmd);
! 12892: install_element (VIEW_NODE, &ipv6_mbgp_neighbor_received_routes_cmd);
! 12893: install_element (ENABLE_NODE, &ipv6_mbgp_neighbor_received_routes_cmd);
! 12894:
! 12895: /* old command */
! 12896: install_element (VIEW_NODE, &ipv6_bgp_neighbor_routes_cmd);
! 12897: install_element (ENABLE_NODE, &ipv6_bgp_neighbor_routes_cmd);
! 12898: install_element (VIEW_NODE, &ipv6_mbgp_neighbor_routes_cmd);
! 12899: install_element (ENABLE_NODE, &ipv6_mbgp_neighbor_routes_cmd);
! 12900: #endif /* HAVE_IPV6 */
! 12901:
! 12902: install_element (BGP_NODE, &bgp_distance_cmd);
! 12903: install_element (BGP_NODE, &no_bgp_distance_cmd);
! 12904: install_element (BGP_NODE, &no_bgp_distance2_cmd);
! 12905: install_element (BGP_NODE, &bgp_distance_source_cmd);
! 12906: install_element (BGP_NODE, &no_bgp_distance_source_cmd);
! 12907: install_element (BGP_NODE, &bgp_distance_source_access_list_cmd);
! 12908: install_element (BGP_NODE, &no_bgp_distance_source_access_list_cmd);
! 12909:
! 12910: install_element (BGP_NODE, &bgp_damp_set_cmd);
! 12911: install_element (BGP_NODE, &bgp_damp_set2_cmd);
! 12912: install_element (BGP_NODE, &bgp_damp_set3_cmd);
! 12913: install_element (BGP_NODE, &bgp_damp_unset_cmd);
! 12914: install_element (BGP_NODE, &bgp_damp_unset2_cmd);
! 12915: install_element (BGP_IPV4_NODE, &bgp_damp_set_cmd);
! 12916: install_element (BGP_IPV4_NODE, &bgp_damp_set2_cmd);
! 12917: install_element (BGP_IPV4_NODE, &bgp_damp_set3_cmd);
! 12918: install_element (BGP_IPV4_NODE, &bgp_damp_unset_cmd);
! 12919: install_element (BGP_IPV4_NODE, &bgp_damp_unset2_cmd);
! 12920:
! 12921: /* Deprecated AS-Pathlimit commands */
! 12922: install_element (BGP_NODE, &bgp_network_ttl_cmd);
! 12923: install_element (BGP_NODE, &bgp_network_mask_ttl_cmd);
! 12924: install_element (BGP_NODE, &bgp_network_mask_natural_ttl_cmd);
! 12925: install_element (BGP_NODE, &bgp_network_backdoor_ttl_cmd);
! 12926: install_element (BGP_NODE, &bgp_network_mask_backdoor_ttl_cmd);
! 12927: install_element (BGP_NODE, &bgp_network_mask_natural_backdoor_ttl_cmd);
! 12928:
! 12929: install_element (BGP_NODE, &no_bgp_network_ttl_cmd);
! 12930: install_element (BGP_NODE, &no_bgp_network_mask_ttl_cmd);
! 12931: install_element (BGP_NODE, &no_bgp_network_mask_natural_ttl_cmd);
! 12932: install_element (BGP_NODE, &no_bgp_network_backdoor_ttl_cmd);
! 12933: install_element (BGP_NODE, &no_bgp_network_mask_backdoor_ttl_cmd);
! 12934: install_element (BGP_NODE, &no_bgp_network_mask_natural_backdoor_ttl_cmd);
! 12935:
! 12936: install_element (BGP_IPV4_NODE, &bgp_network_ttl_cmd);
! 12937: install_element (BGP_IPV4_NODE, &bgp_network_mask_ttl_cmd);
! 12938: install_element (BGP_IPV4_NODE, &bgp_network_mask_natural_ttl_cmd);
! 12939: install_element (BGP_IPV4_NODE, &bgp_network_backdoor_ttl_cmd);
! 12940: install_element (BGP_IPV4_NODE, &bgp_network_mask_backdoor_ttl_cmd);
! 12941: install_element (BGP_IPV4_NODE, &bgp_network_mask_natural_backdoor_ttl_cmd);
! 12942:
! 12943: install_element (BGP_IPV4_NODE, &no_bgp_network_ttl_cmd);
! 12944: install_element (BGP_IPV4_NODE, &no_bgp_network_mask_ttl_cmd);
! 12945: install_element (BGP_IPV4_NODE, &no_bgp_network_mask_natural_ttl_cmd);
! 12946: install_element (BGP_IPV4_NODE, &no_bgp_network_backdoor_ttl_cmd);
! 12947: install_element (BGP_IPV4_NODE, &no_bgp_network_mask_backdoor_ttl_cmd);
! 12948: install_element (BGP_IPV4_NODE, &no_bgp_network_mask_natural_backdoor_ttl_cmd);
! 12949:
! 12950: install_element (BGP_IPV4M_NODE, &bgp_network_ttl_cmd);
! 12951: install_element (BGP_IPV4M_NODE, &bgp_network_mask_ttl_cmd);
! 12952: install_element (BGP_IPV4M_NODE, &bgp_network_mask_natural_ttl_cmd);
! 12953: install_element (BGP_IPV4M_NODE, &bgp_network_backdoor_ttl_cmd);
! 12954: install_element (BGP_IPV4M_NODE, &bgp_network_mask_backdoor_ttl_cmd);
! 12955: install_element (BGP_IPV4M_NODE, &bgp_network_mask_natural_backdoor_ttl_cmd);
! 12956:
! 12957: install_element (BGP_IPV4M_NODE, &no_bgp_network_ttl_cmd);
! 12958: install_element (BGP_IPV4M_NODE, &no_bgp_network_mask_ttl_cmd);
! 12959: install_element (BGP_IPV4M_NODE, &no_bgp_network_mask_natural_ttl_cmd);
! 12960: install_element (BGP_IPV4M_NODE, &no_bgp_network_backdoor_ttl_cmd);
! 12961: install_element (BGP_IPV4M_NODE, &no_bgp_network_mask_backdoor_ttl_cmd);
! 12962: install_element (BGP_IPV4M_NODE, &no_bgp_network_mask_natural_backdoor_ttl_cmd);
! 12963:
! 12964: #ifdef HAVE_IPV6
! 12965: install_element (BGP_IPV6_NODE, &ipv6_bgp_network_ttl_cmd);
! 12966: install_element (BGP_IPV6_NODE, &no_ipv6_bgp_network_ttl_cmd);
! 12967: #endif
! 12968: }
! 12969:
! 12970: void
! 12971: bgp_route_finish (void)
! 12972: {
! 12973: bgp_table_unlock (bgp_distance_table);
! 12974: bgp_distance_table = NULL;
! 12975: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>