Annotation of embedaddon/quagga/lib/plist.c, revision 1.1.1.2

1.1       misho       1: /* Prefix list functions.
                      2:  * Copyright (C) 1999 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
                      7:  * it under the terms of the GNU General Public License as published
                      8:  * by the Free Software Foundation; either version 2, or (at your
                      9:  * option) any 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
                     18:  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
                     19:  * Boston, MA 02111-1307, USA.
                     20:  */
                     21: 
                     22: #include <zebra.h>
                     23: 
                     24: #include "prefix.h"
                     25: #include "command.h"
                     26: #include "memory.h"
                     27: #include "plist.h"
                     28: #include "sockunion.h"
                     29: #include "buffer.h"
                     30: #include "stream.h"
                     31: #include "log.h"
                     32: 
1.1.1.2 ! misho      33: #include "plist_int.h"
1.1       misho      34: 
                     35: /* List of struct prefix_list. */
                     36: struct prefix_list_list
                     37: {
                     38:   struct prefix_list *head;
                     39:   struct prefix_list *tail;
                     40: };
                     41: 
                     42: /* Master structure of prefix_list. */
                     43: struct prefix_master
                     44: {
                     45:   /* List of prefix_list which name is number. */
                     46:   struct prefix_list_list num;
                     47: 
                     48:   /* List of prefix_list which name is string. */
                     49:   struct prefix_list_list str;
                     50: 
                     51:   /* Whether sequential number is used. */
                     52:   int seqnum;
                     53: 
                     54:   /* The latest update. */
                     55:   struct prefix_list *recent;
                     56: 
                     57:   /* Hook function which is executed when new prefix_list is added. */
                     58:   void (*add_hook) (struct prefix_list *);
                     59: 
                     60:   /* Hook function which is executed when prefix_list is deleted. */
                     61:   void (*delete_hook) (struct prefix_list *);
                     62: };
                     63: 
                     64: /* Static structure of IPv4 prefix_list's master. */
                     65: static struct prefix_master prefix_master_ipv4 = 
                     66: { 
                     67:   {NULL, NULL},
                     68:   {NULL, NULL},
                     69:   1,
                     70:   NULL,
                     71:   NULL,
                     72: };
                     73: 
                     74: #ifdef HAVE_IPV6
                     75: /* Static structure of IPv6 prefix-list's master. */
                     76: static struct prefix_master prefix_master_ipv6 = 
                     77: { 
                     78:   {NULL, NULL},
                     79:   {NULL, NULL},
                     80:   1,
                     81:   NULL,
                     82:   NULL,
                     83: };
                     84: #endif /* HAVE_IPV6*/
                     85: 
                     86: /* Static structure of BGP ORF prefix_list's master. */
1.1.1.2 ! misho      87: static struct prefix_master prefix_master_orf_v4 =
        !            88: {
1.1       misho      89:   {NULL, NULL},
                     90:   {NULL, NULL},
                     91:   1,
                     92:   NULL,
                     93:   NULL,
                     94: };
1.1.1.2 ! misho      95: 
        !            96: /* Static structure of BGP ORF prefix_list's master. */
        !            97: static struct prefix_master prefix_master_orf_v6 =
        !            98: {
        !            99:   {NULL, NULL},
        !           100:   {NULL, NULL},
        !           101:   1,
        !           102:   NULL,
        !           103:   NULL,
        !           104: };
        !           105: 
1.1       misho     106: static struct prefix_master *
1.1.1.2 ! misho     107: prefix_master_get (afi_t afi, int orf)
1.1       misho     108: {
                    109:   if (afi == AFI_IP)
1.1.1.2 ! misho     110:     return orf ? &prefix_master_orf_v4 : &prefix_master_ipv4;
        !           111:   if (afi == AFI_IP6)
        !           112:     return orf ? &prefix_master_orf_v6 : &prefix_master_ipv6;
1.1       misho     113:   return NULL;
                    114: }
                    115: 
1.1.1.2 ! misho     116: const char *prefix_list_name (struct prefix_list *plist)
        !           117: {
        !           118:   return plist->name;
        !           119: }
        !           120: 
1.1       misho     121: /* Lookup prefix_list from list of prefix_list by name. */
1.1.1.2 ! misho     122: static struct prefix_list *
        !           123: prefix_list_lookup_do (afi_t afi, int orf, const char *name)
1.1       misho     124: {
                    125:   struct prefix_list *plist;
                    126:   struct prefix_master *master;
                    127: 
                    128:   if (name == NULL)
                    129:     return NULL;
                    130: 
1.1.1.2 ! misho     131:   master = prefix_master_get (afi, orf);
1.1       misho     132:   if (master == NULL)
                    133:     return NULL;
                    134: 
                    135:   for (plist = master->num.head; plist; plist = plist->next)
                    136:     if (strcmp (plist->name, name) == 0)
                    137:       return plist;
                    138: 
                    139:   for (plist = master->str.head; plist; plist = plist->next)
                    140:     if (strcmp (plist->name, name) == 0)
                    141:       return plist;
                    142: 
                    143:   return NULL;
                    144: }
                    145: 
1.1.1.2 ! misho     146: struct prefix_list *
        !           147: prefix_list_lookup (afi_t afi, const char *name)
        !           148: {
        !           149:   return prefix_list_lookup_do (afi, 0, name);
        !           150: }
        !           151: 
        !           152: struct prefix_list *
        !           153: prefix_bgp_orf_lookup (afi_t afi, const char *name)
        !           154: {
        !           155:   return prefix_list_lookup_do (afi, 1, name);
        !           156: }
        !           157: 
1.1       misho     158: static struct prefix_list *
                    159: prefix_list_new (void)
                    160: {
                    161:   struct prefix_list *new;
                    162: 
                    163:   new = XCALLOC (MTYPE_PREFIX_LIST, sizeof (struct prefix_list));
                    164:   return new;
                    165: }
                    166: 
                    167: static void
                    168: prefix_list_free (struct prefix_list *plist)
                    169: {
                    170:   XFREE (MTYPE_PREFIX_LIST, plist);
                    171: }
                    172: 
                    173: static struct prefix_list_entry *
                    174: prefix_list_entry_new (void)
                    175: {
                    176:   struct prefix_list_entry *new;
                    177: 
                    178:   new = XCALLOC (MTYPE_PREFIX_LIST_ENTRY, sizeof (struct prefix_list_entry));
                    179:   return new;
                    180: }
                    181: 
                    182: static void
                    183: prefix_list_entry_free (struct prefix_list_entry *pentry)
                    184: {
                    185:   XFREE (MTYPE_PREFIX_LIST_ENTRY, pentry);
                    186: }
                    187: 
                    188: /* Insert new prefix list to list of prefix_list.  Each prefix_list
                    189:    is sorted by the name. */
                    190: static struct prefix_list *
1.1.1.2 ! misho     191: prefix_list_insert (afi_t afi, int orf, const char *name)
1.1       misho     192: {
                    193:   unsigned int i;
                    194:   long number;
                    195:   struct prefix_list *plist;
                    196:   struct prefix_list *point;
                    197:   struct prefix_list_list *list;
                    198:   struct prefix_master *master;
                    199: 
1.1.1.2 ! misho     200:   master = prefix_master_get (afi, orf);
1.1       misho     201:   if (master == NULL)
                    202:     return NULL;
                    203: 
                    204:   /* Allocate new prefix_list and copy given name. */
                    205:   plist = prefix_list_new ();
                    206:   plist->name = XSTRDUP (MTYPE_PREFIX_LIST_STR, name);
                    207:   plist->master = master;
                    208: 
                    209:   /* If name is made by all digit character.  We treat it as
                    210:      number. */
                    211:   for (number = 0, i = 0; i < strlen (name); i++)
                    212:     {
                    213:       if (isdigit ((int) name[i]))
                    214:        number = (number * 10) + (name[i] - '0');
                    215:       else
                    216:        break;
                    217:     }
                    218: 
                    219:   /* In case of name is all digit character */
                    220:   if (i == strlen (name))
                    221:     {
                    222:       plist->type = PREFIX_TYPE_NUMBER;
                    223: 
                    224:       /* Set prefix_list to number list. */
                    225:       list = &master->num;
                    226: 
                    227:       for (point = list->head; point; point = point->next)
                    228:        if (atol (point->name) >= number)
                    229:          break;
                    230:     }
                    231:   else
                    232:     {
                    233:       plist->type = PREFIX_TYPE_STRING;
                    234: 
                    235:       /* Set prefix_list to string list. */
                    236:       list = &master->str;
                    237:   
                    238:       /* Set point to insertion point. */
                    239:       for (point = list->head; point; point = point->next)
                    240:        if (strcmp (point->name, name) >= 0)
                    241:          break;
                    242:     }
                    243: 
                    244:   /* In case of this is the first element of master. */
                    245:   if (list->head == NULL)
                    246:     {
                    247:       list->head = list->tail = plist;
                    248:       return plist;
                    249:     }
                    250: 
                    251:   /* In case of insertion is made at the tail of access_list. */
                    252:   if (point == NULL)
                    253:     {
                    254:       plist->prev = list->tail;
                    255:       list->tail->next = plist;
                    256:       list->tail = plist;
                    257:       return plist;
                    258:     }
                    259: 
                    260:   /* In case of insertion is made at the head of access_list. */
                    261:   if (point == list->head)
                    262:     {
                    263:       plist->next = list->head;
                    264:       list->head->prev = plist;
                    265:       list->head = plist;
                    266:       return plist;
                    267:     }
                    268: 
                    269:   /* Insertion is made at middle of the access_list. */
                    270:   plist->next = point;
                    271:   plist->prev = point->prev;
                    272: 
                    273:   if (point->prev)
                    274:     point->prev->next = plist;
                    275:   point->prev = plist;
                    276: 
                    277:   return plist;
                    278: }
                    279: 
                    280: static struct prefix_list *
1.1.1.2 ! misho     281: prefix_list_get (afi_t afi, int orf, const char *name)
1.1       misho     282: {
                    283:   struct prefix_list *plist;
                    284: 
1.1.1.2 ! misho     285:   plist = prefix_list_lookup_do (afi, orf, name);
1.1       misho     286: 
                    287:   if (plist == NULL)
1.1.1.2 ! misho     288:     plist = prefix_list_insert (afi, orf, name);
1.1       misho     289:   return plist;
                    290: }
                    291: 
                    292: /* Delete prefix-list from prefix_list_master and free it. */
                    293: static void
                    294: prefix_list_delete (struct prefix_list *plist)
                    295: {
                    296:   struct prefix_list_list *list;
                    297:   struct prefix_master *master;
                    298:   struct prefix_list_entry *pentry;
                    299:   struct prefix_list_entry *next;
                    300: 
                    301:   /* If prefix-list contain prefix_list_entry free all of it. */
                    302:   for (pentry = plist->head; pentry; pentry = next)
                    303:     {
                    304:       next = pentry->next;
                    305:       prefix_list_entry_free (pentry);
                    306:       plist->count--;
                    307:     }
                    308: 
                    309:   master = plist->master;
                    310: 
                    311:   if (plist->type == PREFIX_TYPE_NUMBER)
                    312:     list = &master->num;
                    313:   else
                    314:     list = &master->str;
                    315: 
                    316:   if (plist->next)
                    317:     plist->next->prev = plist->prev;
                    318:   else
                    319:     list->tail = plist->prev;
                    320: 
                    321:   if (plist->prev)
                    322:     plist->prev->next = plist->next;
                    323:   else
                    324:     list->head = plist->next;
                    325: 
                    326:   if (plist->desc)
                    327:     XFREE (MTYPE_TMP, plist->desc);
                    328: 
                    329:   /* Make sure master's recent changed prefix-list information is
                    330:      cleared. */
                    331:   master->recent = NULL;
                    332: 
                    333:   if (plist->name)
                    334:     XFREE (MTYPE_PREFIX_LIST_STR, plist->name);
                    335:   
                    336:   prefix_list_free (plist);
                    337:   
                    338:   if (master->delete_hook)
                    339:     (*master->delete_hook) (NULL);
                    340: }
                    341: 
                    342: static struct prefix_list_entry *
                    343: prefix_list_entry_make (struct prefix *prefix, enum prefix_list_type type,
                    344:                        int seq, int le, int ge, int any)
                    345: {
                    346:   struct prefix_list_entry *pentry;
                    347: 
                    348:   pentry = prefix_list_entry_new ();
                    349: 
                    350:   if (any)
                    351:     pentry->any = 1;
                    352: 
                    353:   prefix_copy (&pentry->prefix, prefix);
                    354:   pentry->type = type;
                    355:   pentry->seq = seq;
                    356:   pentry->le = le;
                    357:   pentry->ge = ge;
                    358: 
                    359:   return pentry;
                    360: }
                    361: 
                    362: /* Add hook function. */
                    363: void
                    364: prefix_list_add_hook (void (*func) (struct prefix_list *plist))
                    365: {
                    366:   prefix_master_ipv4.add_hook = func;
                    367: #ifdef HAVE_IPV6
                    368:   prefix_master_ipv6.add_hook = func;
                    369: #endif /* HAVE_IPV6 */
                    370: }
                    371: 
                    372: /* Delete hook function. */
                    373: void
                    374: prefix_list_delete_hook (void (*func) (struct prefix_list *plist))
                    375: {
                    376:   prefix_master_ipv4.delete_hook = func;
                    377: #ifdef HAVE_IPV6
                    378:   prefix_master_ipv6.delete_hook = func;
                    379: #endif /* HAVE_IPVt6 */
                    380: }
                    381: 
                    382: /* Calculate new sequential number. */
                    383: static int
                    384: prefix_new_seq_get (struct prefix_list *plist)
                    385: {
                    386:   int maxseq;
                    387:   int newseq;
                    388:   struct prefix_list_entry *pentry;
                    389: 
                    390:   maxseq = newseq = 0;
                    391: 
                    392:   for (pentry = plist->head; pentry; pentry = pentry->next)
                    393:     {
                    394:       if (maxseq < pentry->seq)
                    395:        maxseq = pentry->seq;
                    396:     }
                    397: 
                    398:   newseq = ((maxseq / 5) * 5) + 5;
                    399:   
                    400:   return newseq;
                    401: }
                    402: 
                    403: /* Return prefix list entry which has same seq number. */
                    404: static struct prefix_list_entry *
                    405: prefix_seq_check (struct prefix_list *plist, int seq)
                    406: {
                    407:   struct prefix_list_entry *pentry;
                    408: 
                    409:   for (pentry = plist->head; pentry; pentry = pentry->next)
                    410:     if (pentry->seq == seq)
                    411:       return pentry;
                    412:   return NULL;
                    413: }
                    414: 
                    415: static struct prefix_list_entry *
                    416: prefix_list_entry_lookup (struct prefix_list *plist, struct prefix *prefix,
                    417:                          enum prefix_list_type type, int seq, int le, int ge)
                    418: {
                    419:   struct prefix_list_entry *pentry;
                    420: 
                    421:   for (pentry = plist->head; pentry; pentry = pentry->next)
                    422:     if (prefix_same (&pentry->prefix, prefix) && pentry->type == type)
                    423:       {
                    424:        if (seq >= 0 && pentry->seq != seq)
                    425:          continue;
                    426: 
                    427:        if (pentry->le != le)
                    428:          continue;
                    429:        if (pentry->ge != ge)
                    430:          continue;
                    431: 
                    432:        return pentry;
                    433:       }
                    434: 
                    435:   return NULL;
                    436: }
                    437: 
                    438: static void
                    439: prefix_list_entry_delete (struct prefix_list *plist, 
                    440:                          struct prefix_list_entry *pentry,
                    441:                          int update_list)
                    442: {
                    443:   if (plist == NULL || pentry == NULL)
                    444:     return;
                    445:   if (pentry->prev)
                    446:     pentry->prev->next = pentry->next;
                    447:   else
                    448:     plist->head = pentry->next;
                    449:   if (pentry->next)
                    450:     pentry->next->prev = pentry->prev;
                    451:   else
                    452:     plist->tail = pentry->prev;
                    453: 
                    454:   prefix_list_entry_free (pentry);
                    455: 
                    456:   plist->count--;
                    457: 
                    458:   if (update_list)
                    459:     {
                    460:       if (plist->master->delete_hook)
                    461:        (*plist->master->delete_hook) (plist);
                    462: 
                    463:       if (plist->head == NULL && plist->tail == NULL && plist->desc == NULL)
                    464:        prefix_list_delete (plist);
                    465:       else
                    466:        plist->master->recent = plist;
                    467:     }
                    468: }
                    469: 
                    470: static void
                    471: prefix_list_entry_add (struct prefix_list *plist,
                    472:                       struct prefix_list_entry *pentry)
                    473: {
                    474:   struct prefix_list_entry *replace;
                    475:   struct prefix_list_entry *point;
                    476: 
                    477:   /* Automatic asignment of seq no. */
                    478:   if (pentry->seq == -1)
                    479:     pentry->seq = prefix_new_seq_get (plist);
                    480: 
                    481:   /* Is there any same seq prefix list entry? */
                    482:   replace = prefix_seq_check (plist, pentry->seq);
                    483:   if (replace)
                    484:     prefix_list_entry_delete (plist, replace, 0);
                    485: 
                    486:   /* Check insert point. */
                    487:   for (point = plist->head; point; point = point->next)
                    488:     if (point->seq >= pentry->seq)
                    489:       break;
                    490: 
                    491:   /* In case of this is the first element of the list. */
                    492:   pentry->next = point;
                    493: 
                    494:   if (point)
                    495:     {
                    496:       if (point->prev)
                    497:        point->prev->next = pentry;
                    498:       else
                    499:        plist->head = pentry;
                    500: 
                    501:       pentry->prev = point->prev;
                    502:       point->prev = pentry;
                    503:     }
                    504:   else
                    505:     {
                    506:       if (plist->tail)
                    507:        plist->tail->next = pentry;
                    508:       else
                    509:        plist->head = pentry;
                    510: 
                    511:       pentry->prev = plist->tail;
                    512:       plist->tail = pentry;
                    513:     }
                    514: 
                    515:   /* Increment count. */
                    516:   plist->count++;
                    517: 
                    518:   /* Run hook function. */
                    519:   if (plist->master->add_hook)
                    520:     (*plist->master->add_hook) (plist);
                    521: 
                    522:   plist->master->recent = plist;
                    523: }
                    524: 
                    525: /* Return string of prefix_list_type. */
                    526: static const char *
                    527: prefix_list_type_str (struct prefix_list_entry *pentry)
                    528: {
                    529:   switch (pentry->type)
                    530:     {
                    531:     case PREFIX_PERMIT:
                    532:       return "permit";
                    533:     case PREFIX_DENY:
                    534:       return "deny";
                    535:     default:
                    536:       return "";
                    537:     }
                    538: }
                    539: 
                    540: static int
                    541: prefix_list_entry_match (struct prefix_list_entry *pentry, struct prefix *p)
                    542: {
                    543:   int ret;
                    544: 
                    545:   ret = prefix_match (&pentry->prefix, p);
                    546:   if (! ret)
                    547:     return 0;
                    548:   
                    549:   /* In case of le nor ge is specified, exact match is performed. */
                    550:   if (! pentry->le && ! pentry->ge)
                    551:     {
                    552:       if (pentry->prefix.prefixlen != p->prefixlen)
                    553:        return 0;
                    554:     }
                    555:   else
                    556:     {  
                    557:       if (pentry->le)
                    558:        if (p->prefixlen > pentry->le)
                    559:          return 0;
                    560: 
                    561:       if (pentry->ge)
                    562:        if (p->prefixlen < pentry->ge)
                    563:          return 0;
                    564:     }
                    565:   return 1;
                    566: }
                    567: 
                    568: enum prefix_list_type
                    569: prefix_list_apply (struct prefix_list *plist, void *object)
                    570: {
                    571:   struct prefix_list_entry *pentry;
                    572:   struct prefix *p;
                    573: 
                    574:   p = (struct prefix *) object;
                    575: 
                    576:   if (plist == NULL)
                    577:     return PREFIX_DENY;
                    578: 
                    579:   if (plist->count == 0)
                    580:     return PREFIX_PERMIT;
                    581: 
                    582:   for (pentry = plist->head; pentry; pentry = pentry->next)
                    583:     {
                    584:       pentry->refcnt++;
                    585:       if (prefix_list_entry_match (pentry, p))
                    586:        {
                    587:          pentry->hitcnt++;
                    588:          return pentry->type;
                    589:        }
                    590:     }
                    591: 
                    592:   return PREFIX_DENY;
                    593: }
                    594: 
                    595: static void __attribute__ ((unused))
                    596: prefix_list_print (struct prefix_list *plist)
                    597: {
                    598:   struct prefix_list_entry *pentry;
                    599: 
                    600:   if (plist == NULL)
                    601:     return;
                    602: 
                    603:   printf ("ip prefix-list %s: %d entries\n", plist->name, plist->count);
                    604: 
                    605:   for (pentry = plist->head; pentry; pentry = pentry->next)
                    606:     {
                    607:       if (pentry->any)
                    608:        printf ("any %s\n", prefix_list_type_str (pentry));
                    609:       else
                    610:        {
                    611:          struct prefix *p;
                    612:          char buf[BUFSIZ];
                    613:          
                    614:          p = &pentry->prefix;
                    615:          
                    616:          printf ("  seq %d %s %s/%d", 
                    617:                  pentry->seq,
                    618:                  prefix_list_type_str (pentry),
                    619:                  inet_ntop (p->family, &p->u.prefix, buf, BUFSIZ),
                    620:                  p->prefixlen);
                    621:          if (pentry->ge)
                    622:            printf (" ge %d", pentry->ge);
                    623:          if (pentry->le)
                    624:            printf (" le %d", pentry->le);
                    625:          printf ("\n");
                    626:        }
                    627:     }
                    628: }
1.1.1.2 ! misho     629: 
1.1       misho     630: /* Retrun 1 when plist already include pentry policy. */
                    631: static struct prefix_list_entry *
                    632: prefix_entry_dup_check (struct prefix_list *plist,
                    633:                        struct prefix_list_entry *new)
                    634: {
                    635:   struct prefix_list_entry *pentry;
                    636:   int seq = 0;
                    637: 
                    638:   if (new->seq == -1)
                    639:     seq = prefix_new_seq_get (plist);
                    640:   else
                    641:     seq = new->seq;
                    642: 
                    643:   for (pentry = plist->head; pentry; pentry = pentry->next)
                    644:     {
                    645:       if (prefix_same (&pentry->prefix, &new->prefix)
                    646:          && pentry->type == new->type
                    647:          && pentry->le == new->le
                    648:          && pentry->ge == new->ge
                    649:          && pentry->seq != seq)
                    650:        return pentry;
                    651:     }
                    652:   return NULL;
                    653: }
                    654: 
                    655: static int
                    656: vty_invalid_prefix_range (struct vty *vty, const char *prefix)
                    657: {
                    658:   vty_out (vty, "%% Invalid prefix range for %s, make sure: len < ge-value <= le-value%s",
                    659:            prefix, VTY_NEWLINE);
                    660:   return CMD_WARNING;
                    661: }
                    662: 
                    663: static int
                    664: vty_prefix_list_install (struct vty *vty, afi_t afi, const char *name, 
                    665:                          const char *seq, const char *typestr,
                    666:                         const char *prefix, const char *ge, const char *le)
                    667: {
                    668:   int ret;
                    669:   enum prefix_list_type type;
                    670:   struct prefix_list *plist;
                    671:   struct prefix_list_entry *pentry;
                    672:   struct prefix_list_entry *dup;
                    673:   struct prefix p;
                    674:   int any = 0;
                    675:   int seqnum = -1;
                    676:   int lenum = 0;
                    677:   int genum = 0;
                    678: 
                    679:   /* Sequential number. */
                    680:   if (seq)
                    681:     seqnum = atoi (seq);
                    682: 
                    683:   /* ge and le number */
                    684:   if (ge)
                    685:     genum = atoi (ge);
                    686:   if (le)
                    687:     lenum = atoi (le);
                    688: 
                    689:   /* Check filter type. */
                    690:   if (strncmp ("permit", typestr, 1) == 0)
                    691:     type = PREFIX_PERMIT;
                    692:   else if (strncmp ("deny", typestr, 1) == 0)
                    693:     type = PREFIX_DENY;
                    694:   else
                    695:     {
                    696:       vty_out (vty, "%% prefix type must be permit or deny%s", VTY_NEWLINE);
                    697:       return CMD_WARNING;
                    698:     }
                    699: 
                    700:   /* "any" is special token for matching any IPv4 addresses.  */
1.1.1.2 ! misho     701:   switch (afi)
1.1       misho     702:     {
1.1.1.2 ! misho     703:     case AFI_IP:
1.1       misho     704:       if (strncmp ("any", prefix, strlen (prefix)) == 0)
                    705:        {
                    706:          ret = str2prefix_ipv4 ("0.0.0.0/0", (struct prefix_ipv4 *) &p);
                    707:          genum = 0;
                    708:          lenum = IPV4_MAX_BITLEN;
                    709:          any = 1;
                    710:        }
                    711:       else
                    712:        ret = str2prefix_ipv4 (prefix, (struct prefix_ipv4 *) &p);
                    713: 
                    714:       if (ret <= 0)
                    715:        {
                    716:          vty_out (vty, "%% Malformed IPv4 prefix%s", VTY_NEWLINE);
                    717:          return CMD_WARNING;
                    718:        }
1.1.1.2 ! misho     719:       break;
        !           720:     case AFI_IP6:
1.1       misho     721:       if (strncmp ("any", prefix, strlen (prefix)) == 0)
                    722:        {
                    723:          ret = str2prefix_ipv6 ("::/0", (struct prefix_ipv6 *) &p);
                    724:          genum = 0;
                    725:          lenum = IPV6_MAX_BITLEN;
                    726:          any = 1;
                    727:        }
                    728:       else
                    729:        ret = str2prefix_ipv6 (prefix, (struct prefix_ipv6 *) &p);
                    730: 
                    731:       if (ret <= 0)
                    732:        {
                    733:          vty_out (vty, "%% Malformed IPv6 prefix%s", VTY_NEWLINE);
                    734:          return CMD_WARNING;
                    735:        }
1.1.1.2 ! misho     736:       break;
1.1       misho     737:     }
                    738: 
                    739:   /* ge and le check. */
1.1.1.2 ! misho     740:   if (genum && (genum <= p.prefixlen))
1.1       misho     741:     return vty_invalid_prefix_range (vty, prefix);
                    742: 
1.1.1.2 ! misho     743:   if (lenum && (lenum <= p.prefixlen))
1.1       misho     744:     return vty_invalid_prefix_range (vty, prefix);
                    745: 
1.1.1.2 ! misho     746:   if (lenum && (genum > lenum))
1.1       misho     747:     return vty_invalid_prefix_range (vty, prefix);
                    748: 
1.1.1.2 ! misho     749:   if (genum && (lenum == (afi == AFI_IP ? 32 : 128)))
1.1       misho     750:     lenum = 0;
                    751: 
                    752:   /* Get prefix_list with name. */
1.1.1.2 ! misho     753:   plist = prefix_list_get (afi, 0, name);
1.1       misho     754: 
                    755:   /* Make prefix entry. */
                    756:   pentry = prefix_list_entry_make (&p, type, seqnum, lenum, genum, any);
                    757:     
                    758:   /* Check same policy. */
                    759:   dup = prefix_entry_dup_check (plist, pentry);
                    760: 
                    761:   if (dup)
                    762:     {
                    763:       prefix_list_entry_free (pentry);
                    764:       vty_out (vty, "%% Insertion failed - prefix-list entry exists:%s",
                    765:               VTY_NEWLINE);
                    766:       vty_out (vty, "   seq %d %s %s", dup->seq, typestr, prefix);
                    767:       if (! any && genum)
                    768:        vty_out (vty, " ge %d", genum);
                    769:       if (! any && lenum)
                    770:        vty_out (vty, " le %d", lenum);
                    771:       vty_out (vty, "%s", VTY_NEWLINE);
                    772:       return CMD_WARNING;
                    773:     }
                    774: 
                    775:   /* Install new filter to the access_list. */
                    776:   prefix_list_entry_add (plist, pentry);
                    777: 
                    778:   return CMD_SUCCESS;
                    779: }
                    780: 
                    781: static int
                    782: vty_prefix_list_uninstall (struct vty *vty, afi_t afi, const char *name, 
                    783:                            const char *seq, const char *typestr,
                    784:                           const char *prefix, const char *ge, const char *le)
                    785: {
                    786:   int ret;
                    787:   enum prefix_list_type type;
                    788:   struct prefix_list *plist;
                    789:   struct prefix_list_entry *pentry;
                    790:   struct prefix p;
                    791:   int seqnum = -1;
                    792:   int lenum = 0;
                    793:   int genum = 0;
                    794: 
                    795:   /* Check prefix list name. */
                    796:   plist = prefix_list_lookup (afi, name);
                    797:   if (! plist)
                    798:     {
                    799:       vty_out (vty, "%% Can't find specified prefix-list%s", VTY_NEWLINE);
                    800:       return CMD_WARNING;
                    801:     }
                    802: 
                    803:   /* Only prefix-list name specified, delete the entire prefix-list. */
                    804:   if (seq == NULL && typestr == NULL && prefix == NULL && 
                    805:       ge == NULL && le == NULL)
                    806:     {
                    807:       prefix_list_delete (plist);
                    808:       return CMD_SUCCESS;
                    809:     }
                    810: 
                    811:   /* We must have, at a minimum, both the type and prefix here */
                    812:   if ((typestr == NULL) || (prefix == NULL))
                    813:     {
                    814:       vty_out (vty, "%% Both prefix and type required%s", VTY_NEWLINE);
                    815:       return CMD_WARNING;
                    816:     }
                    817: 
                    818:   /* Check sequence number. */
                    819:   if (seq)
                    820:     seqnum = atoi (seq);
                    821: 
                    822:   /* ge and le number */
                    823:   if (ge)
                    824:     genum = atoi (ge);
                    825:   if (le)
                    826:     lenum = atoi (le);
                    827: 
                    828:   /* Check of filter type. */
                    829:   if (strncmp ("permit", typestr, 1) == 0)
                    830:     type = PREFIX_PERMIT;
                    831:   else if (strncmp ("deny", typestr, 1) == 0)
                    832:     type = PREFIX_DENY;
                    833:   else
                    834:     {
                    835:       vty_out (vty, "%% prefix type must be permit or deny%s", VTY_NEWLINE);
                    836:       return CMD_WARNING;
                    837:     }
                    838: 
                    839:   /* "any" is special token for matching any IPv4 addresses.  */
                    840:   if (afi == AFI_IP)
                    841:     {
                    842:       if (strncmp ("any", prefix, strlen (prefix)) == 0)
                    843:        {
                    844:          ret = str2prefix_ipv4 ("0.0.0.0/0", (struct prefix_ipv4 *) &p);
                    845:          genum = 0;
                    846:          lenum = IPV4_MAX_BITLEN;
                    847:        }
                    848:       else
                    849:        ret = str2prefix_ipv4 (prefix, (struct prefix_ipv4 *) &p);
                    850: 
                    851:       if (ret <= 0)
                    852:        {
                    853:          vty_out (vty, "%% Malformed IPv4 prefix%s", VTY_NEWLINE);
                    854:          return CMD_WARNING;
                    855:        }
                    856:     }
                    857: #ifdef HAVE_IPV6
                    858:   else if (afi == AFI_IP6)
                    859:     {
                    860:       if (strncmp ("any", prefix, strlen (prefix)) == 0)
                    861:        {
                    862:          ret = str2prefix_ipv6 ("::/0", (struct prefix_ipv6 *) &p);
                    863:          genum = 0;
                    864:          lenum = IPV6_MAX_BITLEN;
                    865:        }
                    866:       else
                    867:        ret = str2prefix_ipv6 (prefix, (struct prefix_ipv6 *) &p);
                    868: 
                    869:       if (ret <= 0)
                    870:        {
                    871:          vty_out (vty, "%% Malformed IPv6 prefix%s", VTY_NEWLINE);
                    872:          return CMD_WARNING;
                    873:        }
                    874:     }
                    875: #endif /* HAVE_IPV6 */
                    876: 
                    877:   /* Lookup prefix entry. */
                    878:   pentry = prefix_list_entry_lookup(plist, &p, type, seqnum, lenum, genum);
                    879: 
                    880:   if (pentry == NULL)
                    881:     {
                    882:       vty_out (vty, "%% Can't find specified prefix-list%s", VTY_NEWLINE);
                    883:       return CMD_WARNING;
                    884:     }
                    885: 
                    886:   /* Install new filter to the access_list. */
                    887:   prefix_list_entry_delete (plist, pentry, 1);
                    888: 
                    889:   return CMD_SUCCESS;
                    890: }
                    891: 
                    892: static int
                    893: vty_prefix_list_desc_unset (struct vty *vty, afi_t afi, const char *name)
                    894: {
                    895:   struct prefix_list *plist;
                    896: 
                    897:   plist = prefix_list_lookup (afi, name);
                    898:   if (! plist)
                    899:     {
                    900:       vty_out (vty, "%% Can't find specified prefix-list%s", VTY_NEWLINE);
                    901:       return CMD_WARNING;
                    902:     }
                    903: 
                    904:   if (plist->desc)
                    905:     {
                    906:       XFREE (MTYPE_TMP, plist->desc);
                    907:       plist->desc = NULL;
                    908:     }
                    909: 
                    910:   if (plist->head == NULL && plist->tail == NULL && plist->desc == NULL)
                    911:     prefix_list_delete (plist);
                    912: 
                    913:   return CMD_SUCCESS;
                    914: }
                    915: 
                    916: enum display_type
                    917: {
                    918:   normal_display,
                    919:   summary_display,
                    920:   detail_display,
                    921:   sequential_display,
                    922:   longer_display,
                    923:   first_match_display
                    924: };
                    925: 
                    926: static void
                    927: vty_show_prefix_entry (struct vty *vty, afi_t afi, struct prefix_list *plist,
                    928:                       struct prefix_master *master, enum display_type dtype,
                    929:                       int seqnum)
                    930: {
                    931:   struct prefix_list_entry *pentry;
                    932: 
                    933:   /* Print the name of the protocol */
                    934:   if (zlog_default)
                    935:       vty_out (vty, "%s: ", zlog_proto_names[zlog_default->protocol]);
                    936:                                                                            
                    937:   if (dtype == normal_display)
                    938:     {
                    939:       vty_out (vty, "ip%s prefix-list %s: %d entries%s",
                    940:               afi == AFI_IP ? "" : "v6",
                    941:               plist->name, plist->count, VTY_NEWLINE);
                    942:       if (plist->desc)
                    943:        vty_out (vty, "   Description: %s%s", plist->desc, VTY_NEWLINE);
                    944:     }
                    945:   else if (dtype == summary_display || dtype == detail_display)
                    946:     {
                    947:       vty_out (vty, "ip%s prefix-list %s:%s",
                    948:               afi == AFI_IP ? "" : "v6", plist->name, VTY_NEWLINE);
                    949: 
                    950:       if (plist->desc)
                    951:        vty_out (vty, "   Description: %s%s", plist->desc, VTY_NEWLINE);
                    952: 
                    953:       vty_out (vty, "   count: %d, range entries: %d, sequences: %d - %d%s",
                    954:               plist->count, plist->rangecount, 
                    955:               plist->head ? plist->head->seq : 0, 
                    956:               plist->tail ? plist->tail->seq : 0,
                    957:               VTY_NEWLINE);
                    958:     }
                    959: 
                    960:   if (dtype != summary_display)
                    961:     {
                    962:       for (pentry = plist->head; pentry; pentry = pentry->next)
                    963:        {
                    964:          if (dtype == sequential_display && pentry->seq != seqnum)
                    965:            continue;
                    966:            
                    967:          vty_out (vty, "   ");
                    968: 
                    969:          if (master->seqnum)
                    970:            vty_out (vty, "seq %d ", pentry->seq);
                    971: 
                    972:          vty_out (vty, "%s ", prefix_list_type_str (pentry));
                    973: 
                    974:          if (pentry->any)
                    975:            vty_out (vty, "any");
                    976:          else
                    977:            {
                    978:              struct prefix *p = &pentry->prefix;
                    979:              char buf[BUFSIZ];
                    980: 
                    981:              vty_out (vty, "%s/%d",
                    982:                       inet_ntop (p->family, &p->u.prefix, buf, BUFSIZ),
                    983:                       p->prefixlen);
                    984: 
                    985:              if (pentry->ge)
                    986:                vty_out (vty, " ge %d", pentry->ge);
                    987:              if (pentry->le)
                    988:                vty_out (vty, " le %d", pentry->le);
                    989:            }
                    990: 
                    991:          if (dtype == detail_display || dtype == sequential_display)
                    992:            vty_out (vty, " (hit count: %ld, refcount: %ld)", 
                    993:                     pentry->hitcnt, pentry->refcnt);
                    994:          
                    995:          vty_out (vty, "%s", VTY_NEWLINE);
                    996:        }
                    997:     }
                    998: }
                    999: 
                   1000: static int
                   1001: vty_show_prefix_list (struct vty *vty, afi_t afi, const char *name,
                   1002:                      const char *seq, enum display_type dtype)
                   1003: {
                   1004:   struct prefix_list *plist;
                   1005:   struct prefix_master *master;
                   1006:   int seqnum = 0;
                   1007: 
1.1.1.2 ! misho    1008:   master = prefix_master_get (afi, 0);
1.1       misho    1009:   if (master == NULL)
                   1010:     return CMD_WARNING;
                   1011: 
                   1012:   if (seq)
                   1013:     seqnum = atoi (seq);
                   1014: 
                   1015:   if (name)
                   1016:     {
                   1017:       plist = prefix_list_lookup (afi, name);
                   1018:       if (! plist)
                   1019:        {
                   1020:          vty_out (vty, "%% Can't find specified prefix-list%s", VTY_NEWLINE);
                   1021:          return CMD_WARNING;
                   1022:        }
                   1023:       vty_show_prefix_entry (vty, afi, plist, master, dtype, seqnum);
                   1024:     }
                   1025:   else
                   1026:     {
                   1027:       if (dtype == detail_display || dtype == summary_display)
                   1028:        {
                   1029:          if (master->recent)
                   1030:            vty_out (vty, "Prefix-list with the last deletion/insertion: %s%s",
                   1031:                     master->recent->name, VTY_NEWLINE);
                   1032:        }
                   1033: 
                   1034:       for (plist = master->num.head; plist; plist = plist->next)
                   1035:        vty_show_prefix_entry (vty, afi, plist, master, dtype, seqnum);
                   1036: 
                   1037:       for (plist = master->str.head; plist; plist = plist->next)
                   1038:        vty_show_prefix_entry (vty, afi, plist, master, dtype, seqnum);
                   1039:     }
                   1040: 
                   1041:   return CMD_SUCCESS;
                   1042: }
                   1043: 
                   1044: static int
                   1045: vty_show_prefix_list_prefix (struct vty *vty, afi_t afi, const char *name, 
                   1046:                             const char *prefix, enum display_type type)
                   1047: {
                   1048:   struct prefix_list *plist;
                   1049:   struct prefix_list_entry *pentry;
                   1050:   struct prefix p;
                   1051:   int ret;
                   1052:   int match;
                   1053: 
                   1054:   plist = prefix_list_lookup (afi, name);
                   1055:   if (! plist)
                   1056:     {
                   1057:       vty_out (vty, "%% Can't find specified prefix-list%s", VTY_NEWLINE);
                   1058:       return CMD_WARNING;
                   1059:     }
                   1060: 
                   1061:   ret = str2prefix (prefix, &p);
                   1062:   if (ret <= 0)
                   1063:     {
                   1064:       vty_out (vty, "%% prefix is malformed%s", VTY_NEWLINE);
                   1065:       return CMD_WARNING;
                   1066:     }
                   1067: 
                   1068:   for (pentry = plist->head; pentry; pentry = pentry->next)
                   1069:     {
                   1070:       match = 0;
                   1071: 
                   1072:       if (type == normal_display || type == first_match_display)
                   1073:        if (prefix_same (&p, &pentry->prefix))
                   1074:          match = 1;
                   1075: 
                   1076:       if (type == longer_display)
                   1077:        if (prefix_match (&p, &pentry->prefix))
                   1078:          match = 1;
                   1079: 
                   1080:       if (match)
                   1081:        {
                   1082:          vty_out (vty, "   seq %d %s ", 
                   1083:                   pentry->seq,
                   1084:                   prefix_list_type_str (pentry));
                   1085: 
                   1086:          if (pentry->any)
                   1087:            vty_out (vty, "any");
                   1088:          else
                   1089:            {
                   1090:              struct prefix *p = &pentry->prefix;
                   1091:              char buf[BUFSIZ];
                   1092:              
                   1093:              vty_out (vty, "%s/%d",
                   1094:                       inet_ntop (p->family, &p->u.prefix, buf, BUFSIZ),
                   1095:                       p->prefixlen);
                   1096: 
                   1097:              if (pentry->ge)
                   1098:                vty_out (vty, " ge %d", pentry->ge);
                   1099:              if (pentry->le)
                   1100:                vty_out (vty, " le %d", pentry->le);
                   1101:            }
                   1102:          
                   1103:          if (type == normal_display || type == first_match_display)
                   1104:            vty_out (vty, " (hit count: %ld, refcount: %ld)", 
                   1105:                     pentry->hitcnt, pentry->refcnt);
                   1106: 
                   1107:          vty_out (vty, "%s", VTY_NEWLINE);
                   1108: 
                   1109:          if (type == first_match_display)
                   1110:            return CMD_SUCCESS;
                   1111:        }
                   1112:     }
                   1113:   return CMD_SUCCESS;
                   1114: }
                   1115: 
                   1116: static int
                   1117: vty_clear_prefix_list (struct vty *vty, afi_t afi, const char *name, 
                   1118:                        const char *prefix)
                   1119: {
                   1120:   struct prefix_master *master;
                   1121:   struct prefix_list *plist;
                   1122:   struct prefix_list_entry *pentry;
                   1123:   int ret;
                   1124:   struct prefix p;
                   1125: 
1.1.1.2 ! misho    1126:   master = prefix_master_get (afi, 0);
1.1       misho    1127:   if (master == NULL)
                   1128:     return CMD_WARNING;
                   1129: 
                   1130:   if (name == NULL && prefix == NULL)
                   1131:     {
                   1132:       for (plist = master->num.head; plist; plist = plist->next)
                   1133:        for (pentry = plist->head; pentry; pentry = pentry->next)
                   1134:          pentry->hitcnt = 0;
                   1135: 
                   1136:       for (plist = master->str.head; plist; plist = plist->next)
                   1137:        for (pentry = plist->head; pentry; pentry = pentry->next)
                   1138:          pentry->hitcnt = 0;
                   1139:     }
                   1140:   else
                   1141:     {
                   1142:       plist = prefix_list_lookup (afi, name);
                   1143:       if (! plist)
                   1144:        {
                   1145:          vty_out (vty, "%% Can't find specified prefix-list%s", VTY_NEWLINE);
                   1146:          return CMD_WARNING;
                   1147:        }
                   1148: 
                   1149:       if (prefix)
                   1150:        {
                   1151:          ret = str2prefix (prefix, &p);
                   1152:          if (ret <= 0)
                   1153:            {
                   1154:              vty_out (vty, "%% prefix is malformed%s", VTY_NEWLINE);
                   1155:              return CMD_WARNING;
                   1156:            }
                   1157:        }
                   1158: 
                   1159:       for (pentry = plist->head; pentry; pentry = pentry->next)
                   1160:        {
                   1161:          if (prefix)
                   1162:            {
                   1163:              if (prefix_match (&pentry->prefix, &p))
                   1164:                pentry->hitcnt = 0;
                   1165:            }
                   1166:          else
                   1167:            pentry->hitcnt = 0;
                   1168:        }
                   1169:     }
                   1170:   return CMD_SUCCESS;
                   1171: }
1.1.1.2 ! misho    1172: 
1.1       misho    1173: DEFUN (ip_prefix_list,
                   1174:        ip_prefix_list_cmd,
                   1175:        "ip prefix-list WORD (deny|permit) (A.B.C.D/M|any)",
                   1176:        IP_STR
                   1177:        PREFIX_LIST_STR
                   1178:        "Name of a prefix list\n"
                   1179:        "Specify packets to reject\n"
                   1180:        "Specify packets to forward\n"
                   1181:        "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
                   1182:        "Any prefix match. Same as \"0.0.0.0/0 le 32\"\n")
                   1183: {
                   1184:   return vty_prefix_list_install (vty, AFI_IP, argv[0], NULL, 
                   1185:                                  argv[1], argv[2], NULL, NULL);
                   1186: }
                   1187: 
                   1188: DEFUN (ip_prefix_list_ge,
                   1189:        ip_prefix_list_ge_cmd,
                   1190:        "ip prefix-list WORD (deny|permit) A.B.C.D/M ge <0-32>",
                   1191:        IP_STR
                   1192:        PREFIX_LIST_STR
                   1193:        "Name of a prefix list\n"
                   1194:        "Specify packets to reject\n"
                   1195:        "Specify packets to forward\n"
                   1196:        "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
                   1197:        "Minimum prefix length to be matched\n"
                   1198:        "Minimum prefix length\n")
                   1199: {
                   1200:   return vty_prefix_list_install (vty, AFI_IP, argv[0], NULL, argv[1], 
                   1201:                                 argv[2], argv[3], NULL);
                   1202: }
                   1203: 
                   1204: DEFUN (ip_prefix_list_ge_le,
                   1205:        ip_prefix_list_ge_le_cmd,
                   1206:        "ip prefix-list WORD (deny|permit) A.B.C.D/M ge <0-32> le <0-32>",
                   1207:        IP_STR
                   1208:        PREFIX_LIST_STR
                   1209:        "Name of a prefix list\n"
                   1210:        "Specify packets to reject\n"
                   1211:        "Specify packets to forward\n"
                   1212:        "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
                   1213:        "Minimum prefix length to be matched\n"
                   1214:        "Minimum prefix length\n"
                   1215:        "Maximum prefix length to be matched\n"
                   1216:        "Maximum prefix length\n")
                   1217: {
                   1218:   return vty_prefix_list_install (vty, AFI_IP, argv[0], NULL, argv[1], 
                   1219:                                  argv[2], argv[3], argv[4]);
                   1220: }
                   1221: 
                   1222: DEFUN (ip_prefix_list_le,
                   1223:        ip_prefix_list_le_cmd,
                   1224:        "ip prefix-list WORD (deny|permit) A.B.C.D/M le <0-32>",
                   1225:        IP_STR
                   1226:        PREFIX_LIST_STR
                   1227:        "Name of a prefix list\n"
                   1228:        "Specify packets to reject\n"
                   1229:        "Specify packets to forward\n"
                   1230:        "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
                   1231:        "Maximum prefix length to be matched\n"
                   1232:        "Maximum prefix length\n")
                   1233: {
                   1234:   return vty_prefix_list_install (vty, AFI_IP, argv[0], NULL, argv[1],
                   1235:                                  argv[2], NULL, argv[3]);
                   1236: }
                   1237: 
                   1238: DEFUN (ip_prefix_list_le_ge,
                   1239:        ip_prefix_list_le_ge_cmd,
                   1240:        "ip prefix-list WORD (deny|permit) A.B.C.D/M le <0-32> ge <0-32>",
                   1241:        IP_STR
                   1242:        PREFIX_LIST_STR
                   1243:        "Name of a prefix list\n"
                   1244:        "Specify packets to reject\n"
                   1245:        "Specify packets to forward\n"
                   1246:        "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
                   1247:        "Maximum prefix length to be matched\n"
                   1248:        "Maximum prefix length\n"
                   1249:        "Minimum prefix length to be matched\n"
                   1250:        "Minimum prefix length\n")
                   1251: {
                   1252:   return vty_prefix_list_install (vty, AFI_IP, argv[0], NULL, argv[1],
                   1253:                                  argv[2], argv[4], argv[3]);
                   1254: }
                   1255: 
                   1256: DEFUN (ip_prefix_list_seq,
                   1257:        ip_prefix_list_seq_cmd,
                   1258:        "ip prefix-list WORD seq <1-4294967295> (deny|permit) (A.B.C.D/M|any)",
                   1259:        IP_STR
                   1260:        PREFIX_LIST_STR
                   1261:        "Name of a prefix list\n"
                   1262:        "sequence number of an entry\n"
                   1263:        "Sequence number\n"
                   1264:        "Specify packets to reject\n"
                   1265:        "Specify packets to forward\n"
                   1266:        "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
                   1267:        "Any prefix match. Same as \"0.0.0.0/0 le 32\"\n")
                   1268: {
                   1269:   return vty_prefix_list_install (vty, AFI_IP, argv[0], argv[1], argv[2],
                   1270:                                  argv[3], NULL, NULL);
                   1271: }
                   1272: 
                   1273: DEFUN (ip_prefix_list_seq_ge,
                   1274:        ip_prefix_list_seq_ge_cmd,
                   1275:        "ip prefix-list WORD seq <1-4294967295> (deny|permit) A.B.C.D/M ge <0-32>",
                   1276:        IP_STR
                   1277:        PREFIX_LIST_STR
                   1278:        "Name of a prefix list\n"
                   1279:        "sequence number of an entry\n"
                   1280:        "Sequence number\n"
                   1281:        "Specify packets to reject\n"
                   1282:        "Specify packets to forward\n"
                   1283:        "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
                   1284:        "Minimum prefix length to be matched\n"
                   1285:        "Minimum prefix length\n")
                   1286: {
                   1287:   return vty_prefix_list_install (vty, AFI_IP, argv[0], argv[1], argv[2],
                   1288:                                  argv[3], argv[4], NULL);
                   1289: }
                   1290: 
                   1291: DEFUN (ip_prefix_list_seq_ge_le,
                   1292:        ip_prefix_list_seq_ge_le_cmd,
                   1293:        "ip prefix-list WORD seq <1-4294967295> (deny|permit) A.B.C.D/M ge <0-32> le <0-32>",
                   1294:        IP_STR
                   1295:        PREFIX_LIST_STR
                   1296:        "Name of a prefix list\n"
                   1297:        "sequence number of an entry\n"
                   1298:        "Sequence number\n"
                   1299:        "Specify packets to reject\n"
                   1300:        "Specify packets to forward\n"
                   1301:        "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
                   1302:        "Minimum prefix length to be matched\n"
                   1303:        "Minimum prefix length\n"
                   1304:        "Maximum prefix length to be matched\n"
                   1305:        "Maximum prefix length\n")
                   1306: {
                   1307:   return vty_prefix_list_install (vty, AFI_IP, argv[0], argv[1], argv[2],
                   1308:                                  argv[3], argv[4], argv[5]);
                   1309: }
                   1310: 
                   1311: DEFUN (ip_prefix_list_seq_le,
                   1312:        ip_prefix_list_seq_le_cmd,
                   1313:        "ip prefix-list WORD seq <1-4294967295> (deny|permit) A.B.C.D/M le <0-32>",
                   1314:        IP_STR
                   1315:        PREFIX_LIST_STR
                   1316:        "Name of a prefix list\n"
                   1317:        "sequence number of an entry\n"
                   1318:        "Sequence number\n"
                   1319:        "Specify packets to reject\n"
                   1320:        "Specify packets to forward\n"
                   1321:        "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
                   1322:        "Maximum prefix length to be matched\n"
                   1323:        "Maximum prefix length\n")
                   1324: {
                   1325:   return vty_prefix_list_install (vty, AFI_IP, argv[0], argv[1], argv[2],
                   1326:                                  argv[3], NULL, argv[4]);
                   1327: }
                   1328: 
                   1329: DEFUN (ip_prefix_list_seq_le_ge,
                   1330:        ip_prefix_list_seq_le_ge_cmd,
                   1331:        "ip prefix-list WORD seq <1-4294967295> (deny|permit) A.B.C.D/M le <0-32> ge <0-32>",
                   1332:        IP_STR
                   1333:        PREFIX_LIST_STR
                   1334:        "Name of a prefix list\n"
                   1335:        "sequence number of an entry\n"
                   1336:        "Sequence number\n"
                   1337:        "Specify packets to reject\n"
                   1338:        "Specify packets to forward\n"
                   1339:        "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
                   1340:        "Maximum prefix length to be matched\n"
                   1341:        "Maximum prefix length\n"
                   1342:        "Minimum prefix length to be matched\n"
                   1343:        "Minimum prefix length\n")
                   1344: {
                   1345:   return vty_prefix_list_install (vty, AFI_IP, argv[0], argv[1], argv[2],
                   1346:                                  argv[3], argv[5], argv[4]);
                   1347: }
                   1348: 
                   1349: DEFUN (no_ip_prefix_list,
                   1350:        no_ip_prefix_list_cmd,
                   1351:        "no ip prefix-list WORD",
                   1352:        NO_STR
                   1353:        IP_STR
                   1354:        PREFIX_LIST_STR
                   1355:        "Name of a prefix list\n")
                   1356: {
                   1357:   return vty_prefix_list_uninstall (vty, AFI_IP, argv[0], NULL, NULL,
                   1358:                                    NULL, NULL, NULL);
                   1359: }
                   1360: 
                   1361: DEFUN (no_ip_prefix_list_prefix,
                   1362:        no_ip_prefix_list_prefix_cmd,
                   1363:        "no ip prefix-list WORD (deny|permit) (A.B.C.D/M|any)",
                   1364:        NO_STR
                   1365:        IP_STR
                   1366:        PREFIX_LIST_STR
                   1367:        "Name of a prefix list\n"
                   1368:        "Specify packets to reject\n"
                   1369:        "Specify packets to forward\n"
                   1370:        "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
                   1371:        "Any prefix match.  Same as \"0.0.0.0/0 le 32\"\n")
                   1372: {
                   1373:   return vty_prefix_list_uninstall (vty, AFI_IP, argv[0], NULL, argv[1],
                   1374:                                    argv[2], NULL, NULL);
                   1375: }
                   1376: 
                   1377: DEFUN (no_ip_prefix_list_ge,
                   1378:        no_ip_prefix_list_ge_cmd,
                   1379:        "no ip prefix-list WORD (deny|permit) A.B.C.D/M ge <0-32>",
                   1380:        NO_STR
                   1381:        IP_STR
                   1382:        PREFIX_LIST_STR
                   1383:        "Name of a prefix list\n"
                   1384:        "Specify packets to reject\n"
                   1385:        "Specify packets to forward\n"
                   1386:        "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
                   1387:        "Minimum prefix length to be matched\n"
                   1388:        "Minimum prefix length\n")
                   1389: {
                   1390:   return vty_prefix_list_uninstall (vty, AFI_IP, argv[0], NULL, argv[1],
                   1391:                                    argv[2], argv[3], NULL);
                   1392: }
                   1393: 
                   1394: DEFUN (no_ip_prefix_list_ge_le,
                   1395:        no_ip_prefix_list_ge_le_cmd,
                   1396:        "no ip prefix-list WORD (deny|permit) A.B.C.D/M ge <0-32> le <0-32>",
                   1397:        NO_STR
                   1398:        IP_STR
                   1399:        PREFIX_LIST_STR
                   1400:        "Name of a prefix list\n"
                   1401:        "Specify packets to reject\n"
                   1402:        "Specify packets to forward\n"
                   1403:        "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
                   1404:        "Minimum prefix length to be matched\n"
                   1405:        "Minimum prefix length\n"
                   1406:        "Maximum prefix length to be matched\n"
                   1407:        "Maximum prefix length\n")
                   1408: {
                   1409:   return vty_prefix_list_uninstall (vty, AFI_IP, argv[0], NULL, argv[1],
                   1410:                                    argv[2], argv[3], argv[4]);
                   1411: }
                   1412: 
                   1413: DEFUN (no_ip_prefix_list_le,
                   1414:        no_ip_prefix_list_le_cmd,
                   1415:        "no ip prefix-list WORD (deny|permit) A.B.C.D/M le <0-32>",
                   1416:        NO_STR
                   1417:        IP_STR
                   1418:        PREFIX_LIST_STR
                   1419:        "Name of a prefix list\n"
                   1420:        "Specify packets to reject\n"
                   1421:        "Specify packets to forward\n"
                   1422:        "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
                   1423:        "Maximum prefix length to be matched\n"
                   1424:        "Maximum prefix length\n")
                   1425: {
                   1426:   return vty_prefix_list_uninstall (vty, AFI_IP, argv[0], NULL, argv[1],
                   1427:                                    argv[2], NULL, argv[3]);
                   1428: }
                   1429: 
                   1430: DEFUN (no_ip_prefix_list_le_ge,
                   1431:        no_ip_prefix_list_le_ge_cmd,
                   1432:        "no ip prefix-list WORD (deny|permit) A.B.C.D/M le <0-32> ge <0-32>",
                   1433:        NO_STR
                   1434:        IP_STR
                   1435:        PREFIX_LIST_STR
                   1436:        "Name of a prefix list\n"
                   1437:        "Specify packets to reject\n"
                   1438:        "Specify packets to forward\n"
                   1439:        "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
                   1440:        "Maximum prefix length to be matched\n"
                   1441:        "Maximum prefix length\n"
                   1442:        "Minimum prefix length to be matched\n"
                   1443:        "Minimum prefix length\n")
                   1444: {
                   1445:   return vty_prefix_list_uninstall (vty, AFI_IP, argv[0], NULL, argv[1],
                   1446:                                    argv[2], argv[4], argv[3]);
                   1447: }
                   1448: 
                   1449: DEFUN (no_ip_prefix_list_seq,
                   1450:        no_ip_prefix_list_seq_cmd,
                   1451:        "no ip prefix-list WORD seq <1-4294967295> (deny|permit) (A.B.C.D/M|any)",
                   1452:        NO_STR
                   1453:        IP_STR
                   1454:        PREFIX_LIST_STR
                   1455:        "Name of a prefix list\n"
                   1456:        "sequence number of an entry\n"
                   1457:        "Sequence number\n"
                   1458:        "Specify packets to reject\n"
                   1459:        "Specify packets to forward\n"
                   1460:        "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
                   1461:        "Any prefix match.  Same as \"0.0.0.0/0 le 32\"\n")
                   1462: {
                   1463:   return vty_prefix_list_uninstall (vty, AFI_IP, argv[0], argv[1], argv[2],
                   1464:                                    argv[3], NULL, NULL);
                   1465: }
                   1466: 
                   1467: DEFUN (no_ip_prefix_list_seq_ge,
                   1468:        no_ip_prefix_list_seq_ge_cmd,
                   1469:        "no ip prefix-list WORD seq <1-4294967295> (deny|permit) A.B.C.D/M ge <0-32>",
                   1470:        NO_STR
                   1471:        IP_STR
                   1472:        PREFIX_LIST_STR
                   1473:        "Name of a prefix list\n"
                   1474:        "sequence number of an entry\n"
                   1475:        "Sequence number\n"
                   1476:        "Specify packets to reject\n"
                   1477:        "Specify packets to forward\n"
                   1478:        "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
                   1479:        "Minimum prefix length to be matched\n"
                   1480:        "Minimum prefix length\n")
                   1481: {
                   1482:   return vty_prefix_list_uninstall (vty, AFI_IP, argv[0], argv[1], argv[2],
                   1483:                                    argv[3], argv[4], NULL);
                   1484: }
                   1485: 
                   1486: DEFUN (no_ip_prefix_list_seq_ge_le,
                   1487:        no_ip_prefix_list_seq_ge_le_cmd,
                   1488:        "no ip prefix-list WORD seq <1-4294967295> (deny|permit) A.B.C.D/M ge <0-32> le <0-32>",
                   1489:        NO_STR
                   1490:        IP_STR
                   1491:        PREFIX_LIST_STR
                   1492:        "Name of a prefix list\n"
                   1493:        "sequence number of an entry\n"
                   1494:        "Sequence number\n"
                   1495:        "Specify packets to reject\n"
                   1496:        "Specify packets to forward\n"
                   1497:        "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
                   1498:        "Minimum prefix length to be matched\n"
                   1499:        "Minimum prefix length\n"
                   1500:        "Maximum prefix length to be matched\n"
                   1501:        "Maximum prefix length\n")
                   1502: {
                   1503:   return vty_prefix_list_uninstall (vty, AFI_IP, argv[0], argv[1], argv[2],
                   1504:                                    argv[3], argv[4], argv[5]);
                   1505: }
                   1506: 
                   1507: DEFUN (no_ip_prefix_list_seq_le,
                   1508:        no_ip_prefix_list_seq_le_cmd,
                   1509:        "no ip prefix-list WORD seq <1-4294967295> (deny|permit) A.B.C.D/M le <0-32>",
                   1510:        NO_STR
                   1511:        IP_STR
                   1512:        PREFIX_LIST_STR
                   1513:        "Name of a prefix list\n"
                   1514:        "sequence number of an entry\n"
                   1515:        "Sequence number\n"
                   1516:        "Specify packets to reject\n"
                   1517:        "Specify packets to forward\n"
                   1518:        "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
                   1519:        "Maximum prefix length to be matched\n"
                   1520:        "Maximum prefix length\n")
                   1521: {
                   1522:   return vty_prefix_list_uninstall (vty, AFI_IP, argv[0], argv[1], argv[2],
                   1523:                                    argv[3], NULL, argv[4]);
                   1524: }
                   1525: 
                   1526: DEFUN (no_ip_prefix_list_seq_le_ge,
                   1527:        no_ip_prefix_list_seq_le_ge_cmd,
                   1528:        "no ip prefix-list WORD seq <1-4294967295> (deny|permit) A.B.C.D/M le <0-32> ge <0-32>",
                   1529:        NO_STR
                   1530:        IP_STR
                   1531:        PREFIX_LIST_STR
                   1532:        "Name of a prefix list\n"
                   1533:        "sequence number of an entry\n"
                   1534:        "Sequence number\n"
                   1535:        "Specify packets to reject\n"
                   1536:        "Specify packets to forward\n"
                   1537:        "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
                   1538:        "Maximum prefix length to be matched\n"
                   1539:        "Maximum prefix length\n"
                   1540:        "Minimum prefix length to be matched\n"
                   1541:        "Minimum prefix length\n")
                   1542: {
                   1543:   return vty_prefix_list_uninstall (vty, AFI_IP, argv[0], argv[1], argv[2],
                   1544:                                    argv[3], argv[5], argv[4]);
                   1545: }
                   1546: 
                   1547: DEFUN (ip_prefix_list_sequence_number,
                   1548:        ip_prefix_list_sequence_number_cmd,
                   1549:        "ip prefix-list sequence-number",
                   1550:        IP_STR
                   1551:        PREFIX_LIST_STR
                   1552:        "Include/exclude sequence numbers in NVGEN\n")
                   1553: {
                   1554:   prefix_master_ipv4.seqnum = 1;
                   1555:   return CMD_SUCCESS;
                   1556: }
                   1557: 
                   1558: DEFUN (no_ip_prefix_list_sequence_number,
                   1559:        no_ip_prefix_list_sequence_number_cmd,
                   1560:        "no ip prefix-list sequence-number",
                   1561:        NO_STR
                   1562:        IP_STR
                   1563:        PREFIX_LIST_STR
                   1564:        "Include/exclude sequence numbers in NVGEN\n")
                   1565: {
                   1566:   prefix_master_ipv4.seqnum = 0;
                   1567:   return CMD_SUCCESS;
                   1568: }
                   1569: 
                   1570: DEFUN (ip_prefix_list_description,
                   1571:        ip_prefix_list_description_cmd,
                   1572:        "ip prefix-list WORD description .LINE",
                   1573:        IP_STR
                   1574:        PREFIX_LIST_STR
                   1575:        "Name of a prefix list\n"
                   1576:        "Prefix-list specific description\n"
                   1577:        "Up to 80 characters describing this prefix-list\n")
                   1578: {
                   1579:   struct prefix_list *plist;
                   1580: 
1.1.1.2 ! misho    1581:   plist = prefix_list_get (AFI_IP, 0, argv[0]);
1.1       misho    1582:   
                   1583:   if (plist->desc)
                   1584:     {
                   1585:       XFREE (MTYPE_TMP, plist->desc);
                   1586:       plist->desc = NULL;
                   1587:     }
                   1588:   plist->desc = argv_concat(argv, argc, 1);
                   1589: 
                   1590:   return CMD_SUCCESS;
                   1591: }       
                   1592: 
                   1593: DEFUN (no_ip_prefix_list_description,
                   1594:        no_ip_prefix_list_description_cmd,
                   1595:        "no ip prefix-list WORD description",
                   1596:        NO_STR
                   1597:        IP_STR
                   1598:        PREFIX_LIST_STR
                   1599:        "Name of a prefix list\n"
                   1600:        "Prefix-list specific description\n")
                   1601: {
                   1602:   return vty_prefix_list_desc_unset (vty, AFI_IP, argv[0]);
                   1603: }
                   1604: 
                   1605: ALIAS (no_ip_prefix_list_description,
                   1606:        no_ip_prefix_list_description_arg_cmd,
                   1607:        "no ip prefix-list WORD description .LINE",
                   1608:        NO_STR
                   1609:        IP_STR
                   1610:        PREFIX_LIST_STR
                   1611:        "Name of a prefix list\n"
                   1612:        "Prefix-list specific description\n"
                   1613:        "Up to 80 characters describing this prefix-list\n")
                   1614: 
                   1615: DEFUN (show_ip_prefix_list,
                   1616:        show_ip_prefix_list_cmd,
                   1617:        "show ip prefix-list",
                   1618:        SHOW_STR
                   1619:        IP_STR
                   1620:        PREFIX_LIST_STR)
                   1621: {
                   1622:   return vty_show_prefix_list (vty, AFI_IP, NULL, NULL, normal_display);
                   1623: }
                   1624: 
                   1625: DEFUN (show_ip_prefix_list_name,
                   1626:        show_ip_prefix_list_name_cmd,
                   1627:        "show ip prefix-list WORD",
                   1628:        SHOW_STR
                   1629:        IP_STR
                   1630:        PREFIX_LIST_STR
                   1631:        "Name of a prefix list\n")
                   1632: {
                   1633:   return vty_show_prefix_list (vty, AFI_IP, argv[0], NULL, normal_display);
                   1634: }
                   1635: 
                   1636: DEFUN (show_ip_prefix_list_name_seq,
                   1637:        show_ip_prefix_list_name_seq_cmd,
                   1638:        "show ip prefix-list WORD seq <1-4294967295>",
                   1639:        SHOW_STR
                   1640:        IP_STR
                   1641:        PREFIX_LIST_STR
                   1642:        "Name of a prefix list\n"
                   1643:        "sequence number of an entry\n"
                   1644:        "Sequence number\n")
                   1645: {
                   1646:   return vty_show_prefix_list (vty, AFI_IP, argv[0], argv[1], sequential_display);
                   1647: }
                   1648: 
                   1649: DEFUN (show_ip_prefix_list_prefix,
                   1650:        show_ip_prefix_list_prefix_cmd,
                   1651:        "show ip prefix-list WORD A.B.C.D/M",
                   1652:        SHOW_STR
                   1653:        IP_STR
                   1654:        PREFIX_LIST_STR
                   1655:        "Name of a prefix list\n"
                   1656:        "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n")
                   1657: {
                   1658:   return vty_show_prefix_list_prefix (vty, AFI_IP, argv[0], argv[1], normal_display);
                   1659: }
                   1660: 
                   1661: DEFUN (show_ip_prefix_list_prefix_longer,
                   1662:        show_ip_prefix_list_prefix_longer_cmd,
                   1663:        "show ip prefix-list WORD A.B.C.D/M longer",
                   1664:        SHOW_STR
                   1665:        IP_STR
                   1666:        PREFIX_LIST_STR
                   1667:        "Name of a prefix list\n"
                   1668:        "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
                   1669:        "Lookup longer prefix\n")
                   1670: {
                   1671:   return vty_show_prefix_list_prefix (vty, AFI_IP, argv[0], argv[1], longer_display);
                   1672: }
                   1673: 
                   1674: DEFUN (show_ip_prefix_list_prefix_first_match,
                   1675:        show_ip_prefix_list_prefix_first_match_cmd,
                   1676:        "show ip prefix-list WORD A.B.C.D/M first-match",
                   1677:        SHOW_STR
                   1678:        IP_STR
                   1679:        PREFIX_LIST_STR
                   1680:        "Name of a prefix list\n"
                   1681:        "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
                   1682:        "First matched prefix\n")
                   1683: {
                   1684:   return vty_show_prefix_list_prefix (vty, AFI_IP, argv[0], argv[1], first_match_display);
                   1685: }
                   1686: 
                   1687: DEFUN (show_ip_prefix_list_summary,
                   1688:        show_ip_prefix_list_summary_cmd,
                   1689:        "show ip prefix-list summary",
                   1690:        SHOW_STR
                   1691:        IP_STR
                   1692:        PREFIX_LIST_STR
                   1693:        "Summary of prefix lists\n")
                   1694: {
                   1695:   return vty_show_prefix_list (vty, AFI_IP, NULL, NULL, summary_display);
                   1696: }
                   1697: 
                   1698: DEFUN (show_ip_prefix_list_summary_name,
                   1699:        show_ip_prefix_list_summary_name_cmd,
                   1700:        "show ip prefix-list summary WORD",
                   1701:        SHOW_STR
                   1702:        IP_STR
                   1703:        PREFIX_LIST_STR
                   1704:        "Summary of prefix lists\n"
                   1705:        "Name of a prefix list\n")
                   1706: {
                   1707:   return vty_show_prefix_list (vty, AFI_IP, argv[0], NULL, summary_display);
                   1708: }
                   1709: 
                   1710: 
                   1711: DEFUN (show_ip_prefix_list_detail,
                   1712:        show_ip_prefix_list_detail_cmd,
                   1713:        "show ip prefix-list detail",
                   1714:        SHOW_STR
                   1715:        IP_STR
                   1716:        PREFIX_LIST_STR
                   1717:        "Detail of prefix lists\n")
                   1718: {
                   1719:   return vty_show_prefix_list (vty, AFI_IP, NULL, NULL, detail_display);
                   1720: }
                   1721: 
                   1722: DEFUN (show_ip_prefix_list_detail_name,
                   1723:        show_ip_prefix_list_detail_name_cmd,
                   1724:        "show ip prefix-list detail WORD",
                   1725:        SHOW_STR
                   1726:        IP_STR
                   1727:        PREFIX_LIST_STR
                   1728:        "Detail of prefix lists\n"
                   1729:        "Name of a prefix list\n")
                   1730: {
                   1731:   return vty_show_prefix_list (vty, AFI_IP, argv[0], NULL, detail_display);
                   1732: }
                   1733: 
                   1734: DEFUN (clear_ip_prefix_list,
                   1735:        clear_ip_prefix_list_cmd,
                   1736:        "clear ip prefix-list",
                   1737:        CLEAR_STR
                   1738:        IP_STR
                   1739:        PREFIX_LIST_STR)
                   1740: {
                   1741:   return vty_clear_prefix_list (vty, AFI_IP, NULL, NULL);
                   1742: }
                   1743: 
                   1744: DEFUN (clear_ip_prefix_list_name,
                   1745:        clear_ip_prefix_list_name_cmd,
                   1746:        "clear ip prefix-list WORD",
                   1747:        CLEAR_STR
                   1748:        IP_STR
                   1749:        PREFIX_LIST_STR
                   1750:        "Name of a prefix list\n")
                   1751: {
                   1752:   return vty_clear_prefix_list (vty, AFI_IP, argv[0], NULL);
                   1753: }
                   1754: 
                   1755: DEFUN (clear_ip_prefix_list_name_prefix,
                   1756:        clear_ip_prefix_list_name_prefix_cmd,
                   1757:        "clear ip prefix-list WORD A.B.C.D/M",
                   1758:        CLEAR_STR
                   1759:        IP_STR
                   1760:        PREFIX_LIST_STR
                   1761:        "Name of a prefix list\n"
                   1762:        "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n")
                   1763: {
                   1764:   return vty_clear_prefix_list (vty, AFI_IP, argv[0], argv[1]);
                   1765: }
1.1.1.2 ! misho    1766: 
1.1       misho    1767: #ifdef HAVE_IPV6
                   1768: DEFUN (ipv6_prefix_list,
                   1769:        ipv6_prefix_list_cmd,
                   1770:        "ipv6 prefix-list WORD (deny|permit) (X:X::X:X/M|any)",
                   1771:        IPV6_STR
                   1772:        PREFIX_LIST_STR
                   1773:        "Name of a prefix list\n"
                   1774:        "Specify packets to reject\n"
                   1775:        "Specify packets to forward\n"
                   1776:        "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n"
                   1777:        "Any prefix match.  Same as \"::0/0 le 128\"\n")
                   1778: {
                   1779:   return vty_prefix_list_install (vty, AFI_IP6, argv[0], NULL, 
                   1780:                                  argv[1], argv[2], NULL, NULL);
                   1781: }
                   1782: 
                   1783: DEFUN (ipv6_prefix_list_ge,
                   1784:        ipv6_prefix_list_ge_cmd,
                   1785:        "ipv6 prefix-list WORD (deny|permit) X:X::X:X/M ge <0-128>",
                   1786:        IPV6_STR
                   1787:        PREFIX_LIST_STR
                   1788:        "Name of a prefix list\n"
                   1789:        "Specify packets to reject\n"
                   1790:        "Specify packets to forward\n"
                   1791:        "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n"
                   1792:        "Minimum prefix length to be matched\n"
                   1793:        "Minimum prefix length\n")
                   1794: {
                   1795:   return vty_prefix_list_install (vty, AFI_IP6, argv[0], NULL, argv[1], 
                   1796:                                 argv[2], argv[3], NULL);
                   1797: }
                   1798: 
                   1799: DEFUN (ipv6_prefix_list_ge_le,
                   1800:        ipv6_prefix_list_ge_le_cmd,
                   1801:        "ipv6 prefix-list WORD (deny|permit) X:X::X:X/M ge <0-128> le <0-128>",
                   1802:        IPV6_STR
                   1803:        PREFIX_LIST_STR
                   1804:        "Name of a prefix list\n"
                   1805:        "Specify packets to reject\n"
                   1806:        "Specify packets to forward\n"
                   1807:        "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n"
                   1808:        "Minimum prefix length to be matched\n"
                   1809:        "Minimum prefix length\n"
                   1810:        "Maximum prefix length to be matched\n"
                   1811:        "Maximum prefix length\n")
                   1812: 
                   1813: {
                   1814:   return vty_prefix_list_install (vty, AFI_IP6, argv[0], NULL, argv[1], 
                   1815:                                  argv[2], argv[3], argv[4]);
                   1816: }
                   1817: 
                   1818: DEFUN (ipv6_prefix_list_le,
                   1819:        ipv6_prefix_list_le_cmd,
                   1820:        "ipv6 prefix-list WORD (deny|permit) X:X::X:X/M le <0-128>",
                   1821:        IPV6_STR
                   1822:        PREFIX_LIST_STR
                   1823:        "Name of a prefix list\n"
                   1824:        "Specify packets to reject\n"
                   1825:        "Specify packets to forward\n"
                   1826:        "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n"
                   1827:        "Maximum prefix length to be matched\n"
                   1828:        "Maximum prefix length\n")
                   1829: {
                   1830:   return vty_prefix_list_install (vty, AFI_IP6, argv[0], NULL, argv[1],
                   1831:                                  argv[2], NULL, argv[3]);
                   1832: }
                   1833: 
                   1834: DEFUN (ipv6_prefix_list_le_ge,
                   1835:        ipv6_prefix_list_le_ge_cmd,
                   1836:        "ipv6 prefix-list WORD (deny|permit) X:X::X:X/M le <0-128> ge <0-128>",
                   1837:        IPV6_STR
                   1838:        PREFIX_LIST_STR
                   1839:        "Name of a prefix list\n"
                   1840:        "Specify packets to reject\n"
                   1841:        "Specify packets to forward\n"
                   1842:        "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n"
                   1843:        "Maximum prefix length to be matched\n"
                   1844:        "Maximum prefix length\n"
                   1845:        "Minimum prefix length to be matched\n"
                   1846:        "Minimum prefix length\n")
                   1847: {
                   1848:   return vty_prefix_list_install (vty, AFI_IP6, argv[0], NULL, argv[1],
                   1849:                                  argv[2], argv[4], argv[3]);
                   1850: }
                   1851: 
                   1852: DEFUN (ipv6_prefix_list_seq,
                   1853:        ipv6_prefix_list_seq_cmd,
                   1854:        "ipv6 prefix-list WORD seq <1-4294967295> (deny|permit) (X:X::X:X/M|any)",
                   1855:        IPV6_STR
                   1856:        PREFIX_LIST_STR
                   1857:        "Name of a prefix list\n"
                   1858:        "sequence number of an entry\n"
                   1859:        "Sequence number\n"
                   1860:        "Specify packets to reject\n"
                   1861:        "Specify packets to forward\n"
                   1862:        "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n"
                   1863:        "Any prefix match.  Same as \"::0/0 le 128\"\n")
                   1864: {
                   1865:   return vty_prefix_list_install (vty, AFI_IP6, argv[0], argv[1], argv[2],
                   1866:                                  argv[3], NULL, NULL);
                   1867: }
                   1868: 
                   1869: DEFUN (ipv6_prefix_list_seq_ge,
                   1870:        ipv6_prefix_list_seq_ge_cmd,
                   1871:        "ipv6 prefix-list WORD seq <1-4294967295> (deny|permit) X:X::X:X/M ge <0-128>",
                   1872:        IPV6_STR
                   1873:        PREFIX_LIST_STR
                   1874:        "Name of a prefix list\n"
                   1875:        "sequence number of an entry\n"
                   1876:        "Sequence number\n"
                   1877:        "Specify packets to reject\n"
                   1878:        "Specify packets to forward\n"
                   1879:        "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n"
                   1880:        "Minimum prefix length to be matched\n"
                   1881:        "Minimum prefix length\n")
                   1882: {
                   1883:   return vty_prefix_list_install (vty, AFI_IP6, argv[0], argv[1], argv[2],
                   1884:                                  argv[3], argv[4], NULL);
                   1885: }
                   1886: 
                   1887: DEFUN (ipv6_prefix_list_seq_ge_le,
                   1888:        ipv6_prefix_list_seq_ge_le_cmd,
                   1889:        "ipv6 prefix-list WORD seq <1-4294967295> (deny|permit) X:X::X:X/M ge <0-128> le <0-128>",
                   1890:        IPV6_STR
                   1891:        PREFIX_LIST_STR
                   1892:        "Name of a prefix list\n"
                   1893:        "sequence number of an entry\n"
                   1894:        "Sequence number\n"
                   1895:        "Specify packets to reject\n"
                   1896:        "Specify packets to forward\n"
                   1897:        "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n"
                   1898:        "Minimum prefix length to be matched\n"
                   1899:        "Minimum prefix length\n"
                   1900:        "Maximum prefix length to be matched\n"
                   1901:        "Maximum prefix length\n")
                   1902: {
                   1903:   return vty_prefix_list_install (vty, AFI_IP6, argv[0], argv[1], argv[2],
                   1904:                                  argv[3], argv[4], argv[5]);
                   1905: }
                   1906: 
                   1907: DEFUN (ipv6_prefix_list_seq_le,
                   1908:        ipv6_prefix_list_seq_le_cmd,
                   1909:        "ipv6 prefix-list WORD seq <1-4294967295> (deny|permit) X:X::X:X/M le <0-128>",
                   1910:        IPV6_STR
                   1911:        PREFIX_LIST_STR
                   1912:        "Name of a prefix list\n"
                   1913:        "sequence number of an entry\n"
                   1914:        "Sequence number\n"
                   1915:        "Specify packets to reject\n"
                   1916:        "Specify packets to forward\n"
                   1917:        "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n"
                   1918:        "Maximum prefix length to be matched\n"
                   1919:        "Maximum prefix length\n")
                   1920: {
                   1921:   return vty_prefix_list_install (vty, AFI_IP6, argv[0], argv[1], argv[2],
                   1922:                                  argv[3], NULL, argv[4]);
                   1923: }
                   1924: 
                   1925: DEFUN (ipv6_prefix_list_seq_le_ge,
                   1926:        ipv6_prefix_list_seq_le_ge_cmd,
                   1927:        "ipv6 prefix-list WORD seq <1-4294967295> (deny|permit) X:X::X:X/M le <0-128> ge <0-128>",
                   1928:        IPV6_STR
                   1929:        PREFIX_LIST_STR
                   1930:        "Name of a prefix list\n"
                   1931:        "sequence number of an entry\n"
                   1932:        "Sequence number\n"
                   1933:        "Specify packets to reject\n"
                   1934:        "Specify packets to forward\n"
                   1935:        "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n"
                   1936:        "Maximum prefix length to be matched\n"
                   1937:        "Maximum prefix length\n"
                   1938:        "Minimum prefix length to be matched\n"
                   1939:        "Minimum prefix length\n")
                   1940: {
                   1941:   return vty_prefix_list_install (vty, AFI_IP6, argv[0], argv[1], argv[2],
                   1942:                                  argv[3], argv[5], argv[4]);
                   1943: }
                   1944: 
                   1945: DEFUN (no_ipv6_prefix_list,
                   1946:        no_ipv6_prefix_list_cmd,
                   1947:        "no ipv6 prefix-list WORD",
                   1948:        NO_STR
                   1949:        IPV6_STR
                   1950:        PREFIX_LIST_STR
                   1951:        "Name of a prefix list\n")
                   1952: {
                   1953:   return vty_prefix_list_uninstall (vty, AFI_IP6, argv[0], NULL, NULL,
                   1954:                                    NULL, NULL, NULL);
                   1955: }
                   1956: 
                   1957: DEFUN (no_ipv6_prefix_list_prefix,
                   1958:        no_ipv6_prefix_list_prefix_cmd,
                   1959:        "no ipv6 prefix-list WORD (deny|permit) (X:X::X:X/M|any)",
                   1960:        NO_STR
                   1961:        IPV6_STR
                   1962:        PREFIX_LIST_STR
                   1963:        "Name of a prefix list\n"
                   1964:        "Specify packets to reject\n"
                   1965:        "Specify packets to forward\n"
                   1966:        "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n"
                   1967:        "Any prefix match.  Same as \"::0/0 le 128\"\n")
                   1968: {
                   1969:   return vty_prefix_list_uninstall (vty, AFI_IP6, argv[0], NULL, argv[1],
                   1970:                                    argv[2], NULL, NULL);
                   1971: }
                   1972: 
                   1973: DEFUN (no_ipv6_prefix_list_ge,
                   1974:        no_ipv6_prefix_list_ge_cmd,
                   1975:        "no ipv6 prefix-list WORD (deny|permit) X:X::X:X/M ge <0-128>",
                   1976:        NO_STR
                   1977:        IPV6_STR
                   1978:        PREFIX_LIST_STR
                   1979:        "Name of a prefix list\n"
                   1980:        "Specify packets to reject\n"
                   1981:        "Specify packets to forward\n"
                   1982:        "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n"
                   1983:        "Minimum prefix length to be matched\n"
                   1984:        "Minimum prefix length\n")
                   1985: {
                   1986:   return vty_prefix_list_uninstall (vty, AFI_IP6, argv[0], NULL, argv[1],
                   1987:                                    argv[2], argv[3], NULL);
                   1988: }
                   1989: 
                   1990: DEFUN (no_ipv6_prefix_list_ge_le,
                   1991:        no_ipv6_prefix_list_ge_le_cmd,
                   1992:        "no ipv6 prefix-list WORD (deny|permit) X:X::X:X/M ge <0-128> le <0-128>",
                   1993:        NO_STR
                   1994:        IPV6_STR
                   1995:        PREFIX_LIST_STR
                   1996:        "Name of a prefix list\n"
                   1997:        "Specify packets to reject\n"
                   1998:        "Specify packets to forward\n"
                   1999:        "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n"
                   2000:        "Minimum prefix length to be matched\n"
                   2001:        "Minimum prefix length\n"
                   2002:        "Maximum prefix length to be matched\n"
                   2003:        "Maximum prefix length\n")
                   2004: {
                   2005:   return vty_prefix_list_uninstall (vty, AFI_IP6, argv[0], NULL, argv[1],
                   2006:                                    argv[2], argv[3], argv[4]);
                   2007: }
                   2008: 
                   2009: DEFUN (no_ipv6_prefix_list_le,
                   2010:        no_ipv6_prefix_list_le_cmd,
                   2011:        "no ipv6 prefix-list WORD (deny|permit) X:X::X:X/M le <0-128>",
                   2012:        NO_STR
                   2013:        IPV6_STR
                   2014:        PREFIX_LIST_STR
                   2015:        "Name of a prefix list\n"
                   2016:        "Specify packets to reject\n"
                   2017:        "Specify packets to forward\n"
                   2018:        "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n"
                   2019:        "Maximum prefix length to be matched\n"
                   2020:        "Maximum prefix length\n")
                   2021: {
                   2022:   return vty_prefix_list_uninstall (vty, AFI_IP6, argv[0], NULL, argv[1],
                   2023:                                    argv[2], NULL, argv[3]);
                   2024: }
                   2025: 
                   2026: DEFUN (no_ipv6_prefix_list_le_ge,
                   2027:        no_ipv6_prefix_list_le_ge_cmd,
                   2028:        "no ipv6 prefix-list WORD (deny|permit) X:X::X:X/M le <0-128> ge <0-128>",
                   2029:        NO_STR
                   2030:        IPV6_STR
                   2031:        PREFIX_LIST_STR
                   2032:        "Name of a prefix list\n"
                   2033:        "Specify packets to reject\n"
                   2034:        "Specify packets to forward\n"
                   2035:        "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n"
                   2036:        "Maximum prefix length to be matched\n"
                   2037:        "Maximum prefix length\n"
                   2038:        "Minimum prefix length to be matched\n"
                   2039:        "Minimum prefix length\n")
                   2040: {
                   2041:   return vty_prefix_list_uninstall (vty, AFI_IP6, argv[0], NULL, argv[1],
                   2042:                                    argv[2], argv[4], argv[3]);
                   2043: }
                   2044: 
                   2045: DEFUN (no_ipv6_prefix_list_seq,
                   2046:        no_ipv6_prefix_list_seq_cmd,
                   2047:        "no ipv6 prefix-list WORD seq <1-4294967295> (deny|permit) (X:X::X:X/M|any)",
                   2048:        NO_STR
                   2049:        IPV6_STR
                   2050:        PREFIX_LIST_STR
                   2051:        "Name of a prefix list\n"
                   2052:        "sequence number of an entry\n"
                   2053:        "Sequence number\n"
                   2054:        "Specify packets to reject\n"
                   2055:        "Specify packets to forward\n"
                   2056:        "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n"
                   2057:        "Any prefix match.  Same as \"::0/0 le 128\"\n")
                   2058: {
                   2059:   return vty_prefix_list_uninstall (vty, AFI_IP6, argv[0], argv[1], argv[2],
                   2060:                                    argv[3], NULL, NULL);
                   2061: }
                   2062: 
                   2063: DEFUN (no_ipv6_prefix_list_seq_ge,
                   2064:        no_ipv6_prefix_list_seq_ge_cmd,
                   2065:        "no ipv6 prefix-list WORD seq <1-4294967295> (deny|permit) X:X::X:X/M ge <0-128>",
                   2066:        NO_STR
                   2067:        IPV6_STR
                   2068:        PREFIX_LIST_STR
                   2069:        "Name of a prefix list\n"
                   2070:        "sequence number of an entry\n"
                   2071:        "Sequence number\n"
                   2072:        "Specify packets to reject\n"
                   2073:        "Specify packets to forward\n"
                   2074:        "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n"
                   2075:        "Minimum prefix length to be matched\n"
                   2076:        "Minimum prefix length\n")
                   2077: {
                   2078:   return vty_prefix_list_uninstall (vty, AFI_IP6, argv[0], argv[1], argv[2],
                   2079:                                    argv[3], argv[4], NULL);
                   2080: }
                   2081: 
                   2082: DEFUN (no_ipv6_prefix_list_seq_ge_le,
                   2083:        no_ipv6_prefix_list_seq_ge_le_cmd,
                   2084:        "no ipv6 prefix-list WORD seq <1-4294967295> (deny|permit) X:X::X:X/M ge <0-128> le <0-128>",
                   2085:        NO_STR
                   2086:        IPV6_STR
                   2087:        PREFIX_LIST_STR
                   2088:        "Name of a prefix list\n"
                   2089:        "sequence number of an entry\n"
                   2090:        "Sequence number\n"
                   2091:        "Specify packets to reject\n"
                   2092:        "Specify packets to forward\n"
                   2093:        "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n"
                   2094:        "Minimum prefix length to be matched\n"
                   2095:        "Minimum prefix length\n"
                   2096:        "Maximum prefix length to be matched\n"
                   2097:        "Maximum prefix length\n")
                   2098: {
                   2099:   return vty_prefix_list_uninstall (vty, AFI_IP6, argv[0], argv[1], argv[2],
                   2100:                                    argv[3], argv[4], argv[5]);
                   2101: }
                   2102: 
                   2103: DEFUN (no_ipv6_prefix_list_seq_le,
                   2104:        no_ipv6_prefix_list_seq_le_cmd,
                   2105:        "no ipv6 prefix-list WORD seq <1-4294967295> (deny|permit) X:X::X:X/M le <0-128>",
                   2106:        NO_STR
                   2107:        IPV6_STR
                   2108:        PREFIX_LIST_STR
                   2109:        "Name of a prefix list\n"
                   2110:        "sequence number of an entry\n"
                   2111:        "Sequence number\n"
                   2112:        "Specify packets to reject\n"
                   2113:        "Specify packets to forward\n"
                   2114:        "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n"
                   2115:        "Maximum prefix length to be matched\n"
                   2116:        "Maximum prefix length\n")
                   2117: {
                   2118:   return vty_prefix_list_uninstall (vty, AFI_IP6, argv[0], argv[1], argv[2],
                   2119:                                    argv[3], NULL, argv[4]);
                   2120: }
                   2121: 
                   2122: DEFUN (no_ipv6_prefix_list_seq_le_ge,
                   2123:        no_ipv6_prefix_list_seq_le_ge_cmd,
                   2124:        "no ipv6 prefix-list WORD seq <1-4294967295> (deny|permit) X:X::X:X/M le <0-128> ge <0-128>",
                   2125:        NO_STR
                   2126:        IPV6_STR
                   2127:        PREFIX_LIST_STR
                   2128:        "Name of a prefix list\n"
                   2129:        "sequence number of an entry\n"
                   2130:        "Sequence number\n"
                   2131:        "Specify packets to reject\n"
                   2132:        "Specify packets to forward\n"
                   2133:        "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n"
                   2134:        "Maximum prefix length to be matched\n"
                   2135:        "Maximum prefix length\n"
                   2136:        "Minimum prefix length to be matched\n"
                   2137:        "Minimum prefix length\n")
                   2138: {
                   2139:   return vty_prefix_list_uninstall (vty, AFI_IP6, argv[0], argv[1], argv[2],
                   2140:                                    argv[3], argv[5], argv[4]);
                   2141: }
                   2142: 
                   2143: DEFUN (ipv6_prefix_list_sequence_number,
                   2144:        ipv6_prefix_list_sequence_number_cmd,
                   2145:        "ipv6 prefix-list sequence-number",
                   2146:        IPV6_STR
                   2147:        PREFIX_LIST_STR
                   2148:        "Include/exclude sequence numbers in NVGEN\n")
                   2149: {
                   2150:   prefix_master_ipv6.seqnum = 1;
                   2151:   return CMD_SUCCESS;
                   2152: }
                   2153: 
                   2154: DEFUN (no_ipv6_prefix_list_sequence_number,
                   2155:        no_ipv6_prefix_list_sequence_number_cmd,
                   2156:        "no ipv6 prefix-list sequence-number",
                   2157:        NO_STR
                   2158:        IPV6_STR
                   2159:        PREFIX_LIST_STR
                   2160:        "Include/exclude sequence numbers in NVGEN\n")
                   2161: {
                   2162:   prefix_master_ipv6.seqnum = 0;
                   2163:   return CMD_SUCCESS;
                   2164: }
                   2165: 
                   2166: DEFUN (ipv6_prefix_list_description,
                   2167:        ipv6_prefix_list_description_cmd,
                   2168:        "ipv6 prefix-list WORD description .LINE",
                   2169:        IPV6_STR
                   2170:        PREFIX_LIST_STR
                   2171:        "Name of a prefix list\n"
                   2172:        "Prefix-list specific description\n"
                   2173:        "Up to 80 characters describing this prefix-list\n")
                   2174: {
                   2175:   struct prefix_list *plist;
                   2176: 
1.1.1.2 ! misho    2177:   plist = prefix_list_get (AFI_IP6, 0, argv[0]);
1.1       misho    2178:   
                   2179:   if (plist->desc)
                   2180:     {
                   2181:       XFREE (MTYPE_TMP, plist->desc);
                   2182:       plist->desc = NULL;
                   2183:     }
                   2184:   plist->desc = argv_concat(argv, argc, 1);
                   2185: 
                   2186:   return CMD_SUCCESS;
                   2187: }       
                   2188: 
                   2189: DEFUN (no_ipv6_prefix_list_description,
                   2190:        no_ipv6_prefix_list_description_cmd,
                   2191:        "no ipv6 prefix-list WORD description",
                   2192:        NO_STR
                   2193:        IPV6_STR
                   2194:        PREFIX_LIST_STR
                   2195:        "Name of a prefix list\n"
                   2196:        "Prefix-list specific description\n")
                   2197: {
                   2198:   return vty_prefix_list_desc_unset (vty, AFI_IP6, argv[0]);
                   2199: }
                   2200: 
                   2201: ALIAS (no_ipv6_prefix_list_description,
                   2202:        no_ipv6_prefix_list_description_arg_cmd,
                   2203:        "no ipv6 prefix-list WORD description .LINE",
                   2204:        NO_STR
                   2205:        IPV6_STR
                   2206:        PREFIX_LIST_STR
                   2207:        "Name of a prefix list\n"
                   2208:        "Prefix-list specific description\n"
                   2209:        "Up to 80 characters describing this prefix-list\n")
                   2210: 
                   2211: DEFUN (show_ipv6_prefix_list,
                   2212:        show_ipv6_prefix_list_cmd,
                   2213:        "show ipv6 prefix-list",
                   2214:        SHOW_STR
                   2215:        IPV6_STR
                   2216:        PREFIX_LIST_STR)
                   2217: {
                   2218:   return vty_show_prefix_list (vty, AFI_IP6, NULL, NULL, normal_display);
                   2219: }
                   2220: 
                   2221: DEFUN (show_ipv6_prefix_list_name,
                   2222:        show_ipv6_prefix_list_name_cmd,
                   2223:        "show ipv6 prefix-list WORD",
                   2224:        SHOW_STR
                   2225:        IPV6_STR
                   2226:        PREFIX_LIST_STR
                   2227:        "Name of a prefix list\n")
                   2228: {
                   2229:   return vty_show_prefix_list (vty, AFI_IP6, argv[0], NULL, normal_display);
                   2230: }
                   2231: 
                   2232: DEFUN (show_ipv6_prefix_list_name_seq,
                   2233:        show_ipv6_prefix_list_name_seq_cmd,
                   2234:        "show ipv6 prefix-list WORD seq <1-4294967295>",
                   2235:        SHOW_STR
                   2236:        IPV6_STR
                   2237:        PREFIX_LIST_STR
                   2238:        "Name of a prefix list\n"
                   2239:        "sequence number of an entry\n"
                   2240:        "Sequence number\n")
                   2241: {
                   2242:   return vty_show_prefix_list (vty, AFI_IP6, argv[0], argv[1], sequential_display);
                   2243: }
                   2244: 
                   2245: DEFUN (show_ipv6_prefix_list_prefix,
                   2246:        show_ipv6_prefix_list_prefix_cmd,
                   2247:        "show ipv6 prefix-list WORD X:X::X:X/M",
                   2248:        SHOW_STR
                   2249:        IPV6_STR
                   2250:        PREFIX_LIST_STR
                   2251:        "Name of a prefix list\n"
                   2252:        "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n")
                   2253: {
                   2254:   return vty_show_prefix_list_prefix (vty, AFI_IP6, argv[0], argv[1], normal_display);
                   2255: }
                   2256: 
                   2257: DEFUN (show_ipv6_prefix_list_prefix_longer,
                   2258:        show_ipv6_prefix_list_prefix_longer_cmd,
                   2259:        "show ipv6 prefix-list WORD X:X::X:X/M longer",
                   2260:        SHOW_STR
                   2261:        IPV6_STR
                   2262:        PREFIX_LIST_STR
                   2263:        "Name of a prefix list\n"
                   2264:        "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n"
                   2265:        "Lookup longer prefix\n")
                   2266: {
                   2267:   return vty_show_prefix_list_prefix (vty, AFI_IP6, argv[0], argv[1], longer_display);
                   2268: }
                   2269: 
                   2270: DEFUN (show_ipv6_prefix_list_prefix_first_match,
                   2271:        show_ipv6_prefix_list_prefix_first_match_cmd,
                   2272:        "show ipv6 prefix-list WORD X:X::X:X/M first-match",
                   2273:        SHOW_STR
                   2274:        IPV6_STR
                   2275:        PREFIX_LIST_STR
                   2276:        "Name of a prefix list\n"
                   2277:        "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n"
                   2278:        "First matched prefix\n")
                   2279: {
                   2280:   return vty_show_prefix_list_prefix (vty, AFI_IP6, argv[0], argv[1], first_match_display);
                   2281: }
                   2282: 
                   2283: DEFUN (show_ipv6_prefix_list_summary,
                   2284:        show_ipv6_prefix_list_summary_cmd,
                   2285:        "show ipv6 prefix-list summary",
                   2286:        SHOW_STR
                   2287:        IPV6_STR
                   2288:        PREFIX_LIST_STR
                   2289:        "Summary of prefix lists\n")
                   2290: {
                   2291:   return vty_show_prefix_list (vty, AFI_IP6, NULL, NULL, summary_display);
                   2292: }
                   2293: 
                   2294: DEFUN (show_ipv6_prefix_list_summary_name,
                   2295:        show_ipv6_prefix_list_summary_name_cmd,
                   2296:        "show ipv6 prefix-list summary WORD",
                   2297:        SHOW_STR
                   2298:        IPV6_STR
                   2299:        PREFIX_LIST_STR
                   2300:        "Summary of prefix lists\n"
                   2301:        "Name of a prefix list\n")
                   2302: {
                   2303:   return vty_show_prefix_list (vty, AFI_IP6, argv[0], NULL, summary_display);
                   2304: }
                   2305: 
                   2306: DEFUN (show_ipv6_prefix_list_detail,
                   2307:        show_ipv6_prefix_list_detail_cmd,
                   2308:        "show ipv6 prefix-list detail",
                   2309:        SHOW_STR
                   2310:        IPV6_STR
                   2311:        PREFIX_LIST_STR
                   2312:        "Detail of prefix lists\n")
                   2313: {
                   2314:   return vty_show_prefix_list (vty, AFI_IP6, NULL, NULL, detail_display);
                   2315: }
                   2316: 
                   2317: DEFUN (show_ipv6_prefix_list_detail_name,
                   2318:        show_ipv6_prefix_list_detail_name_cmd,
                   2319:        "show ipv6 prefix-list detail WORD",
                   2320:        SHOW_STR
                   2321:        IPV6_STR
                   2322:        PREFIX_LIST_STR
                   2323:        "Detail of prefix lists\n"
                   2324:        "Name of a prefix list\n")
                   2325: {
                   2326:   return vty_show_prefix_list (vty, AFI_IP6, argv[0], NULL, detail_display);
                   2327: }
                   2328: 
                   2329: DEFUN (clear_ipv6_prefix_list,
                   2330:        clear_ipv6_prefix_list_cmd,
                   2331:        "clear ipv6 prefix-list",
                   2332:        CLEAR_STR
                   2333:        IPV6_STR
                   2334:        PREFIX_LIST_STR)
                   2335: {
                   2336:   return vty_clear_prefix_list (vty, AFI_IP6, NULL, NULL);
                   2337: }
                   2338: 
                   2339: DEFUN (clear_ipv6_prefix_list_name,
                   2340:        clear_ipv6_prefix_list_name_cmd,
                   2341:        "clear ipv6 prefix-list WORD",
                   2342:        CLEAR_STR
                   2343:        IPV6_STR
                   2344:        PREFIX_LIST_STR
                   2345:        "Name of a prefix list\n")
                   2346: {
                   2347:   return vty_clear_prefix_list (vty, AFI_IP6, argv[0], NULL);
                   2348: }
                   2349: 
                   2350: DEFUN (clear_ipv6_prefix_list_name_prefix,
                   2351:        clear_ipv6_prefix_list_name_prefix_cmd,
                   2352:        "clear ipv6 prefix-list WORD X:X::X:X/M",
                   2353:        CLEAR_STR
                   2354:        IPV6_STR
                   2355:        PREFIX_LIST_STR
                   2356:        "Name of a prefix list\n"
                   2357:        "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n")
                   2358: {
                   2359:   return vty_clear_prefix_list (vty, AFI_IP6, argv[0], argv[1]);
                   2360: }
                   2361: #endif /* HAVE_IPV6 */
1.1.1.2 ! misho    2362: 
1.1       misho    2363: /* Configuration write function. */
                   2364: static int
                   2365: config_write_prefix_afi (afi_t afi, struct vty *vty)
                   2366: {
                   2367:   struct prefix_list *plist;
                   2368:   struct prefix_list_entry *pentry;
                   2369:   struct prefix_master *master;
                   2370:   int write = 0;
                   2371: 
1.1.1.2 ! misho    2372:   master = prefix_master_get (afi, 0);
1.1       misho    2373:   if (master == NULL)
                   2374:     return 0;
                   2375: 
                   2376:   if (! master->seqnum)
                   2377:     {
                   2378:       vty_out (vty, "no ip%s prefix-list sequence-number%s", 
                   2379:               afi == AFI_IP ? "" : "v6", VTY_NEWLINE);
                   2380:       vty_out (vty, "!%s", VTY_NEWLINE);
                   2381:     }
                   2382: 
                   2383:   for (plist = master->num.head; plist; plist = plist->next)
                   2384:     {
                   2385:       if (plist->desc)
                   2386:        {
                   2387:          vty_out (vty, "ip%s prefix-list %s description %s%s",
                   2388:                   afi == AFI_IP ? "" : "v6",
                   2389:                   plist->name, plist->desc, VTY_NEWLINE);
                   2390:          write++;
                   2391:        }
                   2392: 
                   2393:       for (pentry = plist->head; pentry; pentry = pentry->next)
                   2394:        {
                   2395:          vty_out (vty, "ip%s prefix-list %s ",
                   2396:                   afi == AFI_IP ? "" : "v6",
                   2397:                   plist->name);
                   2398: 
                   2399:          if (master->seqnum)
                   2400:            vty_out (vty, "seq %d ", pentry->seq);
                   2401:        
                   2402:          vty_out (vty, "%s ", prefix_list_type_str (pentry));
                   2403: 
                   2404:          if (pentry->any)
                   2405:            vty_out (vty, "any");
                   2406:          else
                   2407:            {
                   2408:              struct prefix *p = &pentry->prefix;
                   2409:              char buf[BUFSIZ];
                   2410: 
                   2411:              vty_out (vty, "%s/%d",
                   2412:                       inet_ntop (p->family, &p->u.prefix, buf, BUFSIZ),
                   2413:                       p->prefixlen);
                   2414: 
                   2415:              if (pentry->ge)
                   2416:                vty_out (vty, " ge %d", pentry->ge);
                   2417:              if (pentry->le)
                   2418:                vty_out (vty, " le %d", pentry->le);
                   2419:            }
                   2420:          vty_out (vty, "%s", VTY_NEWLINE);
                   2421:          write++;
                   2422:        }
                   2423:       /* vty_out (vty, "!%s", VTY_NEWLINE); */
                   2424:     }
                   2425: 
                   2426:   for (plist = master->str.head; plist; plist = plist->next)
                   2427:     {
                   2428:       if (plist->desc)
                   2429:        {
                   2430:          vty_out (vty, "ip%s prefix-list %s description %s%s",
                   2431:                   afi == AFI_IP ? "" : "v6",
                   2432:                   plist->name, plist->desc, VTY_NEWLINE);
                   2433:          write++;
                   2434:        }
                   2435: 
                   2436:       for (pentry = plist->head; pentry; pentry = pentry->next)
                   2437:        {
                   2438:          vty_out (vty, "ip%s prefix-list %s ",
                   2439:                   afi == AFI_IP ? "" : "v6",
                   2440:                   plist->name);
                   2441: 
                   2442:          if (master->seqnum)
                   2443:            vty_out (vty, "seq %d ", pentry->seq);
                   2444: 
                   2445:          vty_out (vty, "%s", prefix_list_type_str (pentry));
                   2446: 
                   2447:          if (pentry->any)
                   2448:            vty_out (vty, " any");
                   2449:          else
                   2450:            {
                   2451:              struct prefix *p = &pentry->prefix;
                   2452:              char buf[BUFSIZ];
                   2453: 
                   2454:              vty_out (vty, " %s/%d",
                   2455:                       inet_ntop (p->family, &p->u.prefix, buf, BUFSIZ),
                   2456:                       p->prefixlen);
                   2457: 
                   2458:              if (pentry->ge)
                   2459:                vty_out (vty, " ge %d", pentry->ge);
                   2460:              if (pentry->le)
                   2461:                vty_out (vty, " le %d", pentry->le);
                   2462:            }
                   2463:          vty_out (vty, "%s", VTY_NEWLINE);
                   2464:          write++;
                   2465:        }
                   2466:     }
                   2467:   
                   2468:   return write;
                   2469: }
                   2470: 
                   2471: struct stream *
                   2472: prefix_bgp_orf_entry (struct stream *s, struct prefix_list *plist,
                   2473:                      u_char init_flag, u_char permit_flag, u_char deny_flag)
                   2474: {
                   2475:   struct prefix_list_entry *pentry;
                   2476: 
                   2477:   if (! plist)
                   2478:     return s;
                   2479: 
                   2480:   for (pentry = plist->head; pentry; pentry = pentry->next)
                   2481:     {
                   2482:       u_char flag = init_flag;
                   2483:       struct prefix *p = &pentry->prefix;
                   2484: 
                   2485:       flag |= (pentry->type == PREFIX_PERMIT ?
                   2486:                permit_flag : deny_flag);
                   2487:       stream_putc (s, flag);
                   2488:       stream_putl (s, (u_int32_t)pentry->seq);
                   2489:       stream_putc (s, (u_char)pentry->ge);
                   2490:       stream_putc (s, (u_char)pentry->le);
                   2491:       stream_put_prefix (s, p);
                   2492:     }
                   2493: 
                   2494:   return s;
                   2495: }
                   2496: 
                   2497: int
                   2498: prefix_bgp_orf_set (char *name, afi_t afi, struct orf_prefix *orfp,
                   2499:                    int permit, int set)
                   2500: {
                   2501:   struct prefix_list *plist;
                   2502:   struct prefix_list_entry *pentry;
                   2503: 
                   2504:   /* ge and le value check */ 
                   2505:   if (orfp->ge && orfp->ge <= orfp->p.prefixlen)
                   2506:     return CMD_WARNING;
                   2507:   if (orfp->le && orfp->le <= orfp->p.prefixlen)
                   2508:     return CMD_WARNING;
                   2509:   if (orfp->le && orfp->ge > orfp->le)
                   2510:     return CMD_WARNING;
                   2511: 
                   2512:   if (orfp->ge && orfp->le == (afi == AFI_IP ? 32 : 128))
                   2513:     orfp->le = 0;
                   2514: 
1.1.1.2 ! misho    2515:   plist = prefix_list_get (afi, 1, name);
1.1       misho    2516:   if (! plist)
                   2517:     return CMD_WARNING;
                   2518: 
                   2519:   if (set)
                   2520:     {
                   2521:       pentry = prefix_list_entry_make (&orfp->p,
                   2522:                                       (permit ? PREFIX_PERMIT : PREFIX_DENY),
                   2523:                                       orfp->seq, orfp->le, orfp->ge, 0);
                   2524: 
                   2525:       if (prefix_entry_dup_check (plist, pentry))
                   2526:        {
                   2527:          prefix_list_entry_free (pentry);
                   2528:          return CMD_WARNING;
                   2529:        }
                   2530: 
                   2531:       prefix_list_entry_add (plist, pentry);
                   2532:     }
                   2533:   else
                   2534:     {
                   2535:       pentry = prefix_list_entry_lookup (plist, &orfp->p,
                   2536:                                         (permit ? PREFIX_PERMIT : PREFIX_DENY),
                   2537:                                         orfp->seq, orfp->le, orfp->ge);
                   2538: 
                   2539:       if (! pentry)
                   2540:        return CMD_WARNING;
                   2541: 
                   2542:       prefix_list_entry_delete (plist, pentry, 1);
                   2543:     }
                   2544: 
                   2545:   return CMD_SUCCESS;
                   2546: }
                   2547: 
                   2548: void
1.1.1.2 ! misho    2549: prefix_bgp_orf_remove_all (afi_t afi, char *name)
1.1       misho    2550: {
                   2551:   struct prefix_list *plist;
                   2552: 
1.1.1.2 ! misho    2553:   plist = prefix_bgp_orf_lookup (afi, name);
1.1       misho    2554:   if (plist)
                   2555:     prefix_list_delete (plist);
                   2556: }
                   2557: 
                   2558: /* return prefix count */
                   2559: int
                   2560: prefix_bgp_show_prefix_list (struct vty *vty, afi_t afi, char *name)
                   2561: {
                   2562:   struct prefix_list *plist;
                   2563:   struct prefix_list_entry *pentry;
                   2564: 
1.1.1.2 ! misho    2565:   plist = prefix_bgp_orf_lookup (afi, name);
1.1       misho    2566:   if (! plist)
                   2567:     return 0;
                   2568: 
                   2569:   if (! vty)
                   2570:     return plist->count;
                   2571: 
                   2572:   vty_out (vty, "ip%s prefix-list %s: %d entries%s",
                   2573:           afi == AFI_IP ? "" : "v6",
                   2574:           plist->name, plist->count, VTY_NEWLINE);
                   2575: 
                   2576:   for (pentry = plist->head; pentry; pentry = pentry->next)
                   2577:     {
                   2578:       struct prefix *p = &pentry->prefix;
                   2579:       char buf[BUFSIZ];
                   2580: 
                   2581:       vty_out (vty, "   seq %d %s %s/%d", pentry->seq,
                   2582:               prefix_list_type_str (pentry),
                   2583:               inet_ntop (p->family, &p->u.prefix, buf, BUFSIZ),
                   2584:               p->prefixlen);
                   2585: 
                   2586:       if (pentry->ge)
                   2587:        vty_out (vty, " ge %d", pentry->ge);
                   2588:       if (pentry->le)
                   2589:        vty_out (vty, " le %d", pentry->le);
                   2590: 
                   2591:       vty_out (vty, "%s", VTY_NEWLINE);
                   2592:     }
                   2593:   return plist->count;
                   2594: }
                   2595: 
                   2596: static void
1.1.1.2 ! misho    2597: prefix_list_reset_afi (afi_t afi, int orf)
1.1       misho    2598: {
                   2599:   struct prefix_list *plist;
                   2600:   struct prefix_list *next;
                   2601:   struct prefix_master *master;
                   2602: 
1.1.1.2 ! misho    2603:   master = prefix_master_get (afi, orf);
1.1       misho    2604:   if (master == NULL)
                   2605:     return;
                   2606: 
                   2607:   for (plist = master->num.head; plist; plist = next)
                   2608:     {
                   2609:       next = plist->next;
                   2610:       prefix_list_delete (plist);
                   2611:     }
                   2612:   for (plist = master->str.head; plist; plist = next)
                   2613:     {
                   2614:       next = plist->next;
                   2615:       prefix_list_delete (plist);
                   2616:     }
                   2617: 
                   2618:   assert (master->num.head == NULL);
                   2619:   assert (master->num.tail == NULL);
                   2620: 
                   2621:   assert (master->str.head == NULL);
                   2622:   assert (master->str.tail == NULL);
                   2623: 
                   2624:   master->seqnum = 1;
                   2625:   master->recent = NULL;
                   2626: }
                   2627: 
                   2628: 
                   2629: /* Prefix-list node. */
                   2630: static struct cmd_node prefix_node =
                   2631: {
                   2632:   PREFIX_NODE,
                   2633:   "",                          /* Prefix list has no interface. */
                   2634:   1
                   2635: };
                   2636: 
                   2637: static int
                   2638: config_write_prefix_ipv4 (struct vty *vty)
                   2639: {
                   2640:   return config_write_prefix_afi (AFI_IP, vty);
                   2641: }
                   2642: 
                   2643: static void
                   2644: prefix_list_init_ipv4 (void)
                   2645: {
                   2646:   install_node (&prefix_node, config_write_prefix_ipv4);
                   2647: 
                   2648:   install_element (CONFIG_NODE, &ip_prefix_list_cmd);
                   2649:   install_element (CONFIG_NODE, &ip_prefix_list_ge_cmd);
                   2650:   install_element (CONFIG_NODE, &ip_prefix_list_ge_le_cmd);
                   2651:   install_element (CONFIG_NODE, &ip_prefix_list_le_cmd);
                   2652:   install_element (CONFIG_NODE, &ip_prefix_list_le_ge_cmd);
                   2653:   install_element (CONFIG_NODE, &ip_prefix_list_seq_cmd);
                   2654:   install_element (CONFIG_NODE, &ip_prefix_list_seq_ge_cmd);
                   2655:   install_element (CONFIG_NODE, &ip_prefix_list_seq_ge_le_cmd);
                   2656:   install_element (CONFIG_NODE, &ip_prefix_list_seq_le_cmd);
                   2657:   install_element (CONFIG_NODE, &ip_prefix_list_seq_le_ge_cmd);
                   2658: 
                   2659:   install_element (CONFIG_NODE, &no_ip_prefix_list_cmd);
                   2660:   install_element (CONFIG_NODE, &no_ip_prefix_list_prefix_cmd);
                   2661:   install_element (CONFIG_NODE, &no_ip_prefix_list_ge_cmd);
                   2662:   install_element (CONFIG_NODE, &no_ip_prefix_list_ge_le_cmd);
                   2663:   install_element (CONFIG_NODE, &no_ip_prefix_list_le_cmd);
                   2664:   install_element (CONFIG_NODE, &no_ip_prefix_list_le_ge_cmd);
                   2665:   install_element (CONFIG_NODE, &no_ip_prefix_list_seq_cmd);
                   2666:   install_element (CONFIG_NODE, &no_ip_prefix_list_seq_ge_cmd);
                   2667:   install_element (CONFIG_NODE, &no_ip_prefix_list_seq_ge_le_cmd);
                   2668:   install_element (CONFIG_NODE, &no_ip_prefix_list_seq_le_cmd);
                   2669:   install_element (CONFIG_NODE, &no_ip_prefix_list_seq_le_ge_cmd);
                   2670: 
                   2671:   install_element (CONFIG_NODE, &ip_prefix_list_description_cmd);
                   2672:   install_element (CONFIG_NODE, &no_ip_prefix_list_description_cmd);
                   2673:   install_element (CONFIG_NODE, &no_ip_prefix_list_description_arg_cmd);
                   2674: 
                   2675:   install_element (CONFIG_NODE, &ip_prefix_list_sequence_number_cmd);
                   2676:   install_element (CONFIG_NODE, &no_ip_prefix_list_sequence_number_cmd);
                   2677: 
                   2678:   install_element (VIEW_NODE, &show_ip_prefix_list_cmd);
                   2679:   install_element (VIEW_NODE, &show_ip_prefix_list_name_cmd);
                   2680:   install_element (VIEW_NODE, &show_ip_prefix_list_name_seq_cmd);
                   2681:   install_element (VIEW_NODE, &show_ip_prefix_list_prefix_cmd);
                   2682:   install_element (VIEW_NODE, &show_ip_prefix_list_prefix_longer_cmd);
                   2683:   install_element (VIEW_NODE, &show_ip_prefix_list_prefix_first_match_cmd);
                   2684:   install_element (VIEW_NODE, &show_ip_prefix_list_summary_cmd);
                   2685:   install_element (VIEW_NODE, &show_ip_prefix_list_summary_name_cmd);
                   2686:   install_element (VIEW_NODE, &show_ip_prefix_list_detail_cmd);
                   2687:   install_element (VIEW_NODE, &show_ip_prefix_list_detail_name_cmd);
                   2688: 
                   2689:   install_element (ENABLE_NODE, &show_ip_prefix_list_cmd);
                   2690:   install_element (ENABLE_NODE, &show_ip_prefix_list_name_cmd);
                   2691:   install_element (ENABLE_NODE, &show_ip_prefix_list_name_seq_cmd);
                   2692:   install_element (ENABLE_NODE, &show_ip_prefix_list_prefix_cmd);
                   2693:   install_element (ENABLE_NODE, &show_ip_prefix_list_prefix_longer_cmd);
                   2694:   install_element (ENABLE_NODE, &show_ip_prefix_list_prefix_first_match_cmd);
                   2695:   install_element (ENABLE_NODE, &show_ip_prefix_list_summary_cmd);
                   2696:   install_element (ENABLE_NODE, &show_ip_prefix_list_summary_name_cmd);
                   2697:   install_element (ENABLE_NODE, &show_ip_prefix_list_detail_cmd);
                   2698:   install_element (ENABLE_NODE, &show_ip_prefix_list_detail_name_cmd);
                   2699: 
                   2700:   install_element (ENABLE_NODE, &clear_ip_prefix_list_cmd);
                   2701:   install_element (ENABLE_NODE, &clear_ip_prefix_list_name_cmd);
                   2702:   install_element (ENABLE_NODE, &clear_ip_prefix_list_name_prefix_cmd);
                   2703: }
                   2704: 
                   2705: #ifdef HAVE_IPV6
                   2706: /* Prefix-list node. */
                   2707: static struct cmd_node prefix_ipv6_node =
                   2708: {
                   2709:   PREFIX_IPV6_NODE,
                   2710:   "",                          /* Prefix list has no interface. */
                   2711:   1
                   2712: };
                   2713: 
                   2714: static int
                   2715: config_write_prefix_ipv6 (struct vty *vty)
                   2716: {
                   2717:   return config_write_prefix_afi (AFI_IP6, vty);
                   2718: }
                   2719: 
                   2720: static void
                   2721: prefix_list_init_ipv6 (void)
                   2722: {
                   2723:   install_node (&prefix_ipv6_node, config_write_prefix_ipv6);
                   2724: 
                   2725:   install_element (CONFIG_NODE, &ipv6_prefix_list_cmd);
                   2726:   install_element (CONFIG_NODE, &ipv6_prefix_list_ge_cmd);
                   2727:   install_element (CONFIG_NODE, &ipv6_prefix_list_ge_le_cmd);
                   2728:   install_element (CONFIG_NODE, &ipv6_prefix_list_le_cmd);
                   2729:   install_element (CONFIG_NODE, &ipv6_prefix_list_le_ge_cmd);
                   2730:   install_element (CONFIG_NODE, &ipv6_prefix_list_seq_cmd);
                   2731:   install_element (CONFIG_NODE, &ipv6_prefix_list_seq_ge_cmd);
                   2732:   install_element (CONFIG_NODE, &ipv6_prefix_list_seq_ge_le_cmd);
                   2733:   install_element (CONFIG_NODE, &ipv6_prefix_list_seq_le_cmd);
                   2734:   install_element (CONFIG_NODE, &ipv6_prefix_list_seq_le_ge_cmd);
                   2735: 
                   2736:   install_element (CONFIG_NODE, &no_ipv6_prefix_list_cmd);
                   2737:   install_element (CONFIG_NODE, &no_ipv6_prefix_list_prefix_cmd);
                   2738:   install_element (CONFIG_NODE, &no_ipv6_prefix_list_ge_cmd);
                   2739:   install_element (CONFIG_NODE, &no_ipv6_prefix_list_ge_le_cmd);
                   2740:   install_element (CONFIG_NODE, &no_ipv6_prefix_list_le_cmd);
                   2741:   install_element (CONFIG_NODE, &no_ipv6_prefix_list_le_ge_cmd);
                   2742:   install_element (CONFIG_NODE, &no_ipv6_prefix_list_seq_cmd);
                   2743:   install_element (CONFIG_NODE, &no_ipv6_prefix_list_seq_ge_cmd);
                   2744:   install_element (CONFIG_NODE, &no_ipv6_prefix_list_seq_ge_le_cmd);
                   2745:   install_element (CONFIG_NODE, &no_ipv6_prefix_list_seq_le_cmd);
                   2746:   install_element (CONFIG_NODE, &no_ipv6_prefix_list_seq_le_ge_cmd);
                   2747: 
                   2748:   install_element (CONFIG_NODE, &ipv6_prefix_list_description_cmd);
                   2749:   install_element (CONFIG_NODE, &no_ipv6_prefix_list_description_cmd);
                   2750:   install_element (CONFIG_NODE, &no_ipv6_prefix_list_description_arg_cmd);
                   2751: 
                   2752:   install_element (CONFIG_NODE, &ipv6_prefix_list_sequence_number_cmd);
                   2753:   install_element (CONFIG_NODE, &no_ipv6_prefix_list_sequence_number_cmd);
                   2754: 
                   2755:   install_element (VIEW_NODE, &show_ipv6_prefix_list_cmd);
                   2756:   install_element (VIEW_NODE, &show_ipv6_prefix_list_name_cmd);
                   2757:   install_element (VIEW_NODE, &show_ipv6_prefix_list_name_seq_cmd);
                   2758:   install_element (VIEW_NODE, &show_ipv6_prefix_list_prefix_cmd);
                   2759:   install_element (VIEW_NODE, &show_ipv6_prefix_list_prefix_longer_cmd);
                   2760:   install_element (VIEW_NODE, &show_ipv6_prefix_list_prefix_first_match_cmd);
                   2761:   install_element (VIEW_NODE, &show_ipv6_prefix_list_summary_cmd);
                   2762:   install_element (VIEW_NODE, &show_ipv6_prefix_list_summary_name_cmd);
                   2763:   install_element (VIEW_NODE, &show_ipv6_prefix_list_detail_cmd);
                   2764:   install_element (VIEW_NODE, &show_ipv6_prefix_list_detail_name_cmd);
                   2765: 
                   2766:   install_element (ENABLE_NODE, &show_ipv6_prefix_list_cmd);
                   2767:   install_element (ENABLE_NODE, &show_ipv6_prefix_list_name_cmd);
                   2768:   install_element (ENABLE_NODE, &show_ipv6_prefix_list_name_seq_cmd);
                   2769:   install_element (ENABLE_NODE, &show_ipv6_prefix_list_prefix_cmd);
                   2770:   install_element (ENABLE_NODE, &show_ipv6_prefix_list_prefix_longer_cmd);
                   2771:   install_element (ENABLE_NODE, &show_ipv6_prefix_list_prefix_first_match_cmd);
                   2772:   install_element (ENABLE_NODE, &show_ipv6_prefix_list_summary_cmd);
                   2773:   install_element (ENABLE_NODE, &show_ipv6_prefix_list_summary_name_cmd);
                   2774:   install_element (ENABLE_NODE, &show_ipv6_prefix_list_detail_cmd);
                   2775:   install_element (ENABLE_NODE, &show_ipv6_prefix_list_detail_name_cmd);
                   2776: 
                   2777:   install_element (ENABLE_NODE, &clear_ipv6_prefix_list_cmd);
                   2778:   install_element (ENABLE_NODE, &clear_ipv6_prefix_list_name_cmd);
                   2779:   install_element (ENABLE_NODE, &clear_ipv6_prefix_list_name_prefix_cmd);
                   2780: }
                   2781: #endif /* HAVE_IPV6 */
                   2782: 
                   2783: void
                   2784: prefix_list_init ()
                   2785: {
                   2786:   prefix_list_init_ipv4 ();
                   2787: #ifdef HAVE_IPV6
                   2788:   prefix_list_init_ipv6 ();
                   2789: #endif /* HAVE_IPV6 */
                   2790: }
                   2791: 
                   2792: void
                   2793: prefix_list_reset ()
                   2794: {
1.1.1.2 ! misho    2795:   prefix_list_reset_afi (AFI_IP,  0);
        !          2796:   prefix_list_reset_afi (AFI_IP6, 0);
        !          2797:   prefix_list_reset_afi (AFI_IP,  1);
        !          2798:   prefix_list_reset_afi (AFI_IP6, 1);
1.1       misho    2799: }

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