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