1 /* Prefix list functions.
2 * Copyright (C) 1999 Kunihiro Ishiguro
4 * This file is part of GNU Zebra.
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.
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.
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.
28 #include "sockunion.h"
35 #include "plist_int.h"
37 DEFINE_MTYPE_STATIC(LIB
, PREFIX_LIST
, "Prefix List")
38 DEFINE_MTYPE_STATIC(LIB
, MPREFIX_LIST_STR
, "Prefix List Str")
39 DEFINE_MTYPE_STATIC(LIB
, PREFIX_LIST_ENTRY
, "Prefix List Entry")
40 DEFINE_MTYPE_STATIC(LIB
, PREFIX_LIST_TRIE
, "Prefix List Trie Table")
42 /* not currently changeable, code assumes bytes further down */
44 #define PLC_LEN (1 << PLC_BITS)
45 #define PLC_MAXLEVELV4 2 /* /24 for IPv4 */
46 #define PLC_MAXLEVELV6 4 /* /48 for IPv6 */
47 #define PLC_MAXLEVEL 4 /* max(v4,v6) */
51 struct pltrie_table
*next_table
;
52 struct prefix_list_entry
*final_chain
;
55 struct prefix_list_entry
*up_chain
;
59 struct pltrie_entry entries
[PLC_LEN
];
62 /* List of struct prefix_list. */
63 struct prefix_list_list
65 struct prefix_list
*head
;
66 struct prefix_list
*tail
;
69 /* Master structure of prefix_list. */
72 /* List of prefix_list which name is number. */
73 struct prefix_list_list num
;
75 /* List of prefix_list which name is string. */
76 struct prefix_list_list str
;
78 /* Whether sequential number is used. */
81 /* The latest update. */
82 struct prefix_list
*recent
;
84 /* Hook function which is executed when new prefix_list is added. */
85 void (*add_hook
) (struct prefix_list
*);
87 /* Hook function which is executed when prefix_list is deleted. */
88 void (*delete_hook
) (struct prefix_list
*);
90 /* number of bytes that have a trie level */
94 /* Static structure of IPv4 prefix_list's master. */
95 static struct prefix_master prefix_master_ipv4
=
107 /* Static structure of IPv6 prefix-list's master. */
108 static struct prefix_master prefix_master_ipv6
=
118 #endif /* HAVE_IPV6*/
120 /* Static structure of BGP ORF prefix_list's master. */
121 static struct prefix_master prefix_master_orf_v4
=
132 /* Static structure of BGP ORF prefix_list's master. */
133 static struct prefix_master prefix_master_orf_v6
=
144 static struct prefix_master
*
145 prefix_master_get (afi_t afi
, int orf
)
148 return orf
? &prefix_master_orf_v4
: &prefix_master_ipv4
;
150 return orf
? &prefix_master_orf_v6
: &prefix_master_ipv6
;
154 const char *prefix_list_name (struct prefix_list
*plist
)
159 /* Lookup prefix_list from list of prefix_list by name. */
160 static struct prefix_list
*
161 prefix_list_lookup_do (afi_t afi
, int orf
, const char *name
)
163 struct prefix_list
*plist
;
164 struct prefix_master
*master
;
169 master
= prefix_master_get (afi
, orf
);
173 for (plist
= master
->num
.head
; plist
; plist
= plist
->next
)
174 if (strcmp (plist
->name
, name
) == 0)
177 for (plist
= master
->str
.head
; plist
; plist
= plist
->next
)
178 if (strcmp (plist
->name
, name
) == 0)
185 prefix_list_lookup (afi_t afi
, const char *name
)
187 return prefix_list_lookup_do (afi
, 0, name
);
191 prefix_bgp_orf_lookup (afi_t afi
, const char *name
)
193 return prefix_list_lookup_do (afi
, 1, name
);
196 static struct prefix_list
*
197 prefix_list_new (void)
199 struct prefix_list
*new;
201 new = XCALLOC (MTYPE_PREFIX_LIST
, sizeof (struct prefix_list
));
206 prefix_list_free (struct prefix_list
*plist
)
208 XFREE (MTYPE_PREFIX_LIST
, plist
);
211 static struct prefix_list_entry
*
212 prefix_list_entry_new (void)
214 struct prefix_list_entry
*new;
216 new = XCALLOC (MTYPE_PREFIX_LIST_ENTRY
, sizeof (struct prefix_list_entry
));
221 prefix_list_entry_free (struct prefix_list_entry
*pentry
)
223 XFREE (MTYPE_PREFIX_LIST_ENTRY
, pentry
);
226 /* Insert new prefix list to list of prefix_list. Each prefix_list
227 is sorted by the name. */
228 static struct prefix_list
*
229 prefix_list_insert (afi_t afi
, int orf
, const char *name
)
233 struct prefix_list
*plist
;
234 struct prefix_list
*point
;
235 struct prefix_list_list
*list
;
236 struct prefix_master
*master
;
238 master
= prefix_master_get (afi
, orf
);
242 /* Allocate new prefix_list and copy given name. */
243 plist
= prefix_list_new ();
244 plist
->name
= XSTRDUP (MTYPE_MPREFIX_LIST_STR
, name
);
245 plist
->master
= master
;
246 plist
->trie
= XCALLOC (MTYPE_PREFIX_LIST_TRIE
, sizeof (struct pltrie_table
));
248 /* If name is made by all digit character. We treat it as
250 for (number
= 0, i
= 0; i
< strlen (name
); i
++)
252 if (isdigit ((int) name
[i
]))
253 number
= (number
* 10) + (name
[i
] - '0');
258 /* In case of name is all digit character */
259 if (i
== strlen (name
))
261 plist
->type
= PREFIX_TYPE_NUMBER
;
263 /* Set prefix_list to number list. */
266 for (point
= list
->head
; point
; point
= point
->next
)
267 if (atol (point
->name
) >= number
)
272 plist
->type
= PREFIX_TYPE_STRING
;
274 /* Set prefix_list to string list. */
277 /* Set point to insertion point. */
278 for (point
= list
->head
; point
; point
= point
->next
)
279 if (strcmp (point
->name
, name
) >= 0)
283 /* In case of this is the first element of master. */
284 if (list
->head
== NULL
)
286 list
->head
= list
->tail
= plist
;
290 /* In case of insertion is made at the tail of access_list. */
293 plist
->prev
= list
->tail
;
294 list
->tail
->next
= plist
;
299 /* In case of insertion is made at the head of access_list. */
300 if (point
== list
->head
)
302 plist
->next
= list
->head
;
303 list
->head
->prev
= plist
;
308 /* Insertion is made at middle of the access_list. */
310 plist
->prev
= point
->prev
;
313 point
->prev
->next
= plist
;
319 static struct prefix_list
*
320 prefix_list_get (afi_t afi
, int orf
, const char *name
)
322 struct prefix_list
*plist
;
324 plist
= prefix_list_lookup_do (afi
, orf
, name
);
327 plist
= prefix_list_insert (afi
, orf
, name
);
331 /* Delete prefix-list from prefix_list_master and free it. */
333 prefix_list_delete (struct prefix_list
*plist
)
335 struct prefix_list_list
*list
;
336 struct prefix_master
*master
;
337 struct prefix_list_entry
*pentry
;
338 struct prefix_list_entry
*next
;
340 /* If prefix-list contain prefix_list_entry free all of it. */
341 for (pentry
= plist
->head
; pentry
; pentry
= next
)
344 prefix_list_entry_free (pentry
);
348 master
= plist
->master
;
350 if (plist
->type
== PREFIX_TYPE_NUMBER
)
356 plist
->next
->prev
= plist
->prev
;
358 list
->tail
= plist
->prev
;
361 plist
->prev
->next
= plist
->next
;
363 list
->head
= plist
->next
;
366 XFREE (MTYPE_TMP
, plist
->desc
);
368 /* Make sure master's recent changed prefix-list information is
370 master
->recent
= NULL
;
372 route_map_notify_dependencies(plist
->name
, RMAP_EVENT_PLIST_DELETED
);
374 if (master
->delete_hook
)
375 (*master
->delete_hook
) (plist
);
378 XFREE (MTYPE_MPREFIX_LIST_STR
, plist
->name
);
380 XFREE (MTYPE_PREFIX_LIST_TRIE
, plist
->trie
);
382 prefix_list_free (plist
);
386 static struct prefix_list_entry
*
387 prefix_list_entry_make (struct prefix
*prefix
, enum prefix_list_type type
,
388 int seq
, int le
, int ge
, int any
)
390 struct prefix_list_entry
*pentry
;
392 pentry
= prefix_list_entry_new ();
397 prefix_copy (&pentry
->prefix
, prefix
);
406 /* Add hook function. */
408 prefix_list_add_hook (void (*func
) (struct prefix_list
*plist
))
410 prefix_master_ipv4
.add_hook
= func
;
412 prefix_master_ipv6
.add_hook
= func
;
413 #endif /* HAVE_IPV6 */
416 /* Delete hook function. */
418 prefix_list_delete_hook (void (*func
) (struct prefix_list
*plist
))
420 prefix_master_ipv4
.delete_hook
= func
;
422 prefix_master_ipv6
.delete_hook
= func
;
423 #endif /* HAVE_IPVt6 */
426 /* Calculate new sequential number. */
428 prefix_new_seq_get (struct prefix_list
*plist
)
432 struct prefix_list_entry
*pentry
;
436 for (pentry
= plist
->head
; pentry
; pentry
= pentry
->next
)
438 if (maxseq
< pentry
->seq
)
439 maxseq
= pentry
->seq
;
442 newseq
= ((maxseq
/ 5) * 5) + 5;
447 /* Return prefix list entry which has same seq number. */
448 static struct prefix_list_entry
*
449 prefix_seq_check (struct prefix_list
*plist
, int seq
)
451 struct prefix_list_entry
*pentry
;
453 for (pentry
= plist
->head
; pentry
; pentry
= pentry
->next
)
454 if (pentry
->seq
== seq
)
459 static struct prefix_list_entry
*
460 prefix_list_entry_lookup (struct prefix_list
*plist
, struct prefix
*prefix
,
461 enum prefix_list_type type
, int seq
, int le
, int ge
)
463 struct prefix_list_entry
*pentry
;
465 for (pentry
= plist
->head
; pentry
; pentry
= pentry
->next
)
466 if (prefix_same (&pentry
->prefix
, prefix
) && pentry
->type
== type
)
468 if (seq
>= 0 && pentry
->seq
!= seq
)
471 if (pentry
->le
!= le
)
473 if (pentry
->ge
!= ge
)
483 trie_walk_affected (size_t validbits
, struct pltrie_table
*table
, uint8_t byte
,
484 struct prefix_list_entry
*object
,
485 void (*fn
)(struct prefix_list_entry
*object
,
486 struct prefix_list_entry
**updptr
))
491 if (validbits
> PLC_BITS
)
493 fn (object
, &table
->entries
[byte
].final_chain
);
497 mask
= (1 << (8 - validbits
)) - 1;
498 for (bwalk
= byte
& ~mask
; bwalk
<= byte
+ mask
; bwalk
++)
500 fn (object
, &table
->entries
[bwalk
].up_chain
);
504 static void trie_uninstall_fn (struct prefix_list_entry
*object
,
505 struct prefix_list_entry
**updptr
)
507 for (; *updptr
; updptr
= &(*updptr
)->next_best
)
508 if (*updptr
== object
)
510 *updptr
= object
->next_best
;
516 trie_table_empty (struct pltrie_table
*table
)
519 for (i
= 0; i
< PLC_LEN
; i
++)
520 if (table
->entries
[i
].next_table
|| table
->entries
[i
].up_chain
)
526 prefix_list_trie_del (struct prefix_list
*plist
,
527 struct prefix_list_entry
*pentry
)
529 size_t depth
, maxdepth
= plist
->master
->trie_depth
;
530 uint8_t *bytes
= &pentry
->prefix
.u
.prefix
;
531 size_t validbits
= pentry
->prefix
.prefixlen
;
532 struct pltrie_table
*table
, **tables
[PLC_MAXLEVEL
];
535 for (depth
= 0; validbits
> PLC_BITS
&& depth
< maxdepth
- 1; depth
++)
537 uint8_t byte
= bytes
[depth
];
538 assert (table
->entries
[byte
].next_table
);
540 tables
[depth
+ 1] = &table
->entries
[byte
].next_table
;
541 table
= table
->entries
[byte
].next_table
;
543 validbits
-= PLC_BITS
;
546 trie_walk_affected (validbits
, table
, bytes
[depth
], pentry
, trie_uninstall_fn
);
548 for (; depth
> 0; depth
--)
549 if (trie_table_empty (*tables
[depth
]))
551 XFREE (MTYPE_PREFIX_LIST_TRIE
, *tables
[depth
]);
552 *tables
[depth
] = NULL
;
558 prefix_list_entry_delete (struct prefix_list
*plist
,
559 struct prefix_list_entry
*pentry
,
562 prefix_list_trie_del (plist
, pentry
);
564 if (plist
== NULL
|| pentry
== NULL
)
567 pentry
->prev
->next
= pentry
->next
;
569 plist
->head
= pentry
->next
;
571 pentry
->next
->prev
= pentry
->prev
;
573 plist
->tail
= pentry
->prev
;
575 prefix_list_entry_free (pentry
);
581 route_map_notify_dependencies(plist
->name
, RMAP_EVENT_PLIST_DELETED
);
582 if (plist
->master
->delete_hook
)
583 (*plist
->master
->delete_hook
) (plist
);
585 if (plist
->head
== NULL
&& plist
->tail
== NULL
&& plist
->desc
== NULL
)
586 prefix_list_delete (plist
);
588 plist
->master
->recent
= plist
;
592 static void trie_install_fn (struct prefix_list_entry
*object
,
593 struct prefix_list_entry
**updptr
)
597 if (*updptr
== object
)
599 if ((*updptr
)->prefix
.prefixlen
< object
->prefix
.prefixlen
)
601 if ((*updptr
)->seq
> object
->seq
)
603 updptr
= &(*updptr
)->next_best
;
606 if (!object
->next_best
)
607 object
->next_best
= *updptr
;
609 assert (object
->next_best
== *updptr
|| !*updptr
);
615 prefix_list_trie_add (struct prefix_list
*plist
,
616 struct prefix_list_entry
*pentry
)
618 size_t depth
= plist
->master
->trie_depth
;
619 uint8_t *bytes
= &pentry
->prefix
.u
.prefix
;
620 size_t validbits
= pentry
->prefix
.prefixlen
;
621 struct pltrie_table
*table
;
624 while (validbits
> PLC_BITS
&& depth
> 1)
626 if (!table
->entries
[*bytes
].next_table
)
627 table
->entries
[*bytes
].next_table
= XCALLOC (MTYPE_PREFIX_LIST_TRIE
,
628 sizeof(struct pltrie_table
));
629 table
= table
->entries
[*bytes
].next_table
;
632 validbits
-= PLC_BITS
;
635 trie_walk_affected (validbits
, table
, *bytes
, pentry
, trie_install_fn
);
639 prefix_list_entry_add (struct prefix_list
*plist
,
640 struct prefix_list_entry
*pentry
)
642 struct prefix_list_entry
*replace
;
643 struct prefix_list_entry
*point
;
645 /* Automatic asignment of seq no. */
646 if (pentry
->seq
== -1)
647 pentry
->seq
= prefix_new_seq_get (plist
);
649 if (plist
->tail
&& pentry
->seq
> plist
->tail
->seq
)
653 /* Is there any same seq prefix list entry? */
654 replace
= prefix_seq_check (plist
, pentry
->seq
);
656 prefix_list_entry_delete (plist
, replace
, 0);
658 /* Check insert point. */
659 for (point
= plist
->head
; point
; point
= point
->next
)
660 if (point
->seq
>= pentry
->seq
)
664 /* In case of this is the first element of the list. */
665 pentry
->next
= point
;
670 point
->prev
->next
= pentry
;
672 plist
->head
= pentry
;
674 pentry
->prev
= point
->prev
;
675 point
->prev
= pentry
;
680 plist
->tail
->next
= pentry
;
682 plist
->head
= pentry
;
684 pentry
->prev
= plist
->tail
;
685 plist
->tail
= pentry
;
688 prefix_list_trie_add (plist
, pentry
);
690 /* Increment count. */
693 /* Run hook function. */
694 if (plist
->master
->add_hook
)
695 (*plist
->master
->add_hook
) (plist
);
697 route_map_notify_dependencies(plist
->name
, RMAP_EVENT_PLIST_ADDED
);
698 plist
->master
->recent
= plist
;
701 /* Return string of prefix_list_type. */
703 prefix_list_type_str (struct prefix_list_entry
*pentry
)
705 switch (pentry
->type
)
717 prefix_list_entry_match (struct prefix_list_entry
*pentry
, struct prefix
*p
)
721 ret
= prefix_match (&pentry
->prefix
, p
);
725 /* In case of le nor ge is specified, exact match is performed. */
726 if (! pentry
->le
&& ! pentry
->ge
)
728 if (pentry
->prefix
.prefixlen
!= p
->prefixlen
)
734 if (p
->prefixlen
> pentry
->le
)
738 if (p
->prefixlen
< pentry
->ge
)
744 enum prefix_list_type
745 prefix_list_apply (struct prefix_list
*plist
, void *object
)
747 struct prefix_list_entry
*pentry
, *pbest
= NULL
;
749 struct prefix
*p
= (struct prefix
*) object
;
750 uint8_t *byte
= &p
->u
.prefix
;
752 size_t validbits
= p
->prefixlen
;
753 struct pltrie_table
*table
;
758 if (plist
->count
== 0)
759 return PREFIX_PERMIT
;
761 depth
= plist
->master
->trie_depth
;
765 for (pentry
= table
->entries
[*byte
].up_chain
; pentry
; pentry
= pentry
->next_best
)
767 if (pbest
&& pbest
->seq
< pentry
->seq
)
769 if (prefix_list_entry_match (pentry
, p
))
773 if (validbits
<= PLC_BITS
)
775 validbits
-= PLC_BITS
;
779 if (!table
->entries
[*byte
].next_table
)
782 table
= table
->entries
[*byte
].next_table
;
787 for (pentry
= table
->entries
[*byte
].final_chain
; pentry
; pentry
= pentry
->next_best
)
789 if (pbest
&& pbest
->seq
< pentry
->seq
)
791 if (prefix_list_entry_match (pentry
, p
))
803 static void __attribute__ ((unused
))
804 prefix_list_print (struct prefix_list
*plist
)
806 struct prefix_list_entry
*pentry
;
811 printf ("ip prefix-list %s: %d entries\n", plist
->name
, plist
->count
);
813 for (pentry
= plist
->head
; pentry
; pentry
= pentry
->next
)
816 printf ("any %s\n", prefix_list_type_str (pentry
));
824 printf (" seq %u %s %s/%d",
826 prefix_list_type_str (pentry
),
827 inet_ntop (p
->family
, &p
->u
.prefix
, buf
, BUFSIZ
),
830 printf (" ge %d", pentry
->ge
);
832 printf (" le %d", pentry
->le
);
838 /* Retrun 1 when plist already include pentry policy. */
839 static struct prefix_list_entry
*
840 prefix_entry_dup_check (struct prefix_list
*plist
,
841 struct prefix_list_entry
*new)
843 size_t depth
, maxdepth
= plist
->master
->trie_depth
;
844 uint8_t byte
, *bytes
= &new->prefix
.u
.prefix
;
845 size_t validbits
= new->prefix
.prefixlen
;
846 struct pltrie_table
*table
;
847 struct prefix_list_entry
*pentry
;
851 seq
= prefix_new_seq_get (plist
);
856 for (depth
= 0; validbits
> PLC_BITS
&& depth
< maxdepth
- 1; depth
++)
859 if (!table
->entries
[byte
].next_table
)
862 table
= table
->entries
[byte
].next_table
;
863 validbits
-= PLC_BITS
;
867 if (validbits
> PLC_BITS
)
868 pentry
= table
->entries
[byte
].final_chain
;
870 pentry
= table
->entries
[byte
].up_chain
;
872 for (; pentry
; pentry
= pentry
->next_best
)
874 if (prefix_same (&pentry
->prefix
, &new->prefix
)
875 && pentry
->type
== new->type
876 && pentry
->le
== new->le
877 && pentry
->ge
== new->ge
878 && pentry
->seq
!= seq
)
885 vty_invalid_prefix_range (struct vty
*vty
, const char *prefix
)
887 vty_out (vty
, "%% Invalid prefix range for %s, make sure: len < ge-value <= le-value%s",
888 prefix
, VTY_NEWLINE
);
893 vty_prefix_list_install (struct vty
*vty
, afi_t afi
, const char *name
,
894 const char *seq
, const char *typestr
,
895 const char *prefix
, const char *ge
, const char *le
)
898 enum prefix_list_type type
;
899 struct prefix_list
*plist
;
900 struct prefix_list_entry
*pentry
;
901 struct prefix_list_entry
*dup
;
908 /* Sequential number. */
912 /* ge and le number */
918 /* Check filter type. */
919 if (strncmp ("permit", typestr
, 1) == 0)
920 type
= PREFIX_PERMIT
;
921 else if (strncmp ("deny", typestr
, 1) == 0)
925 vty_out (vty
, "%% prefix type must be permit or deny%s", VTY_NEWLINE
);
929 /* "any" is special token for matching any IPv4 addresses. */
933 if (strncmp ("any", prefix
, strlen (prefix
)) == 0)
935 ret
= str2prefix_ipv4 ("0.0.0.0/0", (struct prefix_ipv4
*) &p
);
937 lenum
= IPV4_MAX_BITLEN
;
941 ret
= str2prefix_ipv4 (prefix
, (struct prefix_ipv4
*) &p
);
945 vty_out (vty
, "%% Malformed IPv4 prefix%s", VTY_NEWLINE
);
950 if (strncmp ("any", prefix
, strlen (prefix
)) == 0)
952 ret
= str2prefix_ipv6 ("::/0", (struct prefix_ipv6
*) &p
);
954 lenum
= IPV6_MAX_BITLEN
;
958 ret
= str2prefix_ipv6 (prefix
, (struct prefix_ipv6
*) &p
);
962 vty_out (vty
, "%% Malformed IPv6 prefix%s", VTY_NEWLINE
);
968 vty_out (vty
, "%% Unrecognized AFI (%d)%s", afi
, VTY_NEWLINE
);
973 /* ge and le check. */
974 if (genum
&& (genum
<= p
.prefixlen
))
975 return vty_invalid_prefix_range (vty
, prefix
);
977 if (lenum
&& (lenum
<= p
.prefixlen
))
978 return vty_invalid_prefix_range (vty
, prefix
);
980 if (lenum
&& (genum
> lenum
))
981 return vty_invalid_prefix_range (vty
, prefix
);
983 if (genum
&& (lenum
== (afi
== AFI_IP
? 32 : 128)))
986 /* Get prefix_list with name. */
987 plist
= prefix_list_get (afi
, 0, name
);
989 /* Make prefix entry. */
990 pentry
= prefix_list_entry_make (&p
, type
, seqnum
, lenum
, genum
, any
);
992 /* Check same policy. */
993 dup
= prefix_entry_dup_check (plist
, pentry
);
997 prefix_list_entry_free (pentry
);
998 vty_out (vty
, "%% Insertion failed - prefix-list entry exists:%s",
1000 vty_out (vty
, " seq %u %s %s", dup
->seq
, typestr
, prefix
);
1002 vty_out (vty
, " ge %d", genum
);
1004 vty_out (vty
, " le %d", lenum
);
1005 vty_out (vty
, "%s", VTY_NEWLINE
);
1009 /* Install new filter to the access_list. */
1010 prefix_list_entry_add (plist
, pentry
);
1016 vty_prefix_list_uninstall (struct vty
*vty
, afi_t afi
, const char *name
,
1017 const char *seq
, const char *typestr
,
1018 const char *prefix
, const char *ge
, const char *le
)
1021 enum prefix_list_type type
;
1022 struct prefix_list
*plist
;
1023 struct prefix_list_entry
*pentry
;
1029 /* Check prefix list name. */
1030 plist
= prefix_list_lookup (afi
, name
);
1033 vty_out (vty
, "%% Can't find specified prefix-list%s", VTY_NEWLINE
);
1037 /* Only prefix-list name specified, delete the entire prefix-list. */
1038 if (seq
== NULL
&& typestr
== NULL
&& prefix
== NULL
&&
1039 ge
== NULL
&& le
== NULL
)
1041 prefix_list_delete (plist
);
1045 /* We must have, at a minimum, both the type and prefix here */
1046 if ((typestr
== NULL
) || (prefix
== NULL
))
1048 vty_out (vty
, "%% Both prefix and type required%s", VTY_NEWLINE
);
1052 /* Check sequence number. */
1054 seqnum
= atoi (seq
);
1056 /* ge and le number */
1062 /* Check of filter type. */
1063 if (strncmp ("permit", typestr
, 1) == 0)
1064 type
= PREFIX_PERMIT
;
1065 else if (strncmp ("deny", typestr
, 1) == 0)
1069 vty_out (vty
, "%% prefix type must be permit or deny%s", VTY_NEWLINE
);
1073 /* "any" is special token for matching any IPv4 addresses. */
1076 if (strncmp ("any", prefix
, strlen (prefix
)) == 0)
1078 ret
= str2prefix_ipv4 ("0.0.0.0/0", (struct prefix_ipv4
*) &p
);
1080 lenum
= IPV4_MAX_BITLEN
;
1083 ret
= str2prefix_ipv4 (prefix
, (struct prefix_ipv4
*) &p
);
1087 vty_out (vty
, "%% Malformed IPv4 prefix%s", VTY_NEWLINE
);
1092 else if (afi
== AFI_IP6
)
1094 if (strncmp ("any", prefix
, strlen (prefix
)) == 0)
1096 ret
= str2prefix_ipv6 ("::/0", (struct prefix_ipv6
*) &p
);
1098 lenum
= IPV6_MAX_BITLEN
;
1101 ret
= str2prefix_ipv6 (prefix
, (struct prefix_ipv6
*) &p
);
1105 vty_out (vty
, "%% Malformed IPv6 prefix%s", VTY_NEWLINE
);
1109 #endif /* HAVE_IPV6 */
1111 /* Lookup prefix entry. */
1112 pentry
= prefix_list_entry_lookup(plist
, &p
, type
, seqnum
, lenum
, genum
);
1116 vty_out (vty
, "%% Can't find specified prefix-list%s", VTY_NEWLINE
);
1120 /* Install new filter to the access_list. */
1121 prefix_list_entry_delete (plist
, pentry
, 1);
1127 vty_prefix_list_desc_unset (struct vty
*vty
, afi_t afi
, const char *name
)
1129 struct prefix_list
*plist
;
1131 plist
= prefix_list_lookup (afi
, name
);
1134 vty_out (vty
, "%% Can't find specified prefix-list%s", VTY_NEWLINE
);
1140 XFREE (MTYPE_TMP
, plist
->desc
);
1144 if (plist
->head
== NULL
&& plist
->tail
== NULL
&& plist
->desc
== NULL
)
1145 prefix_list_delete (plist
);
1161 vty_show_prefix_entry (struct vty
*vty
, afi_t afi
, struct prefix_list
*plist
,
1162 struct prefix_master
*master
, enum display_type dtype
,
1165 struct prefix_list_entry
*pentry
;
1167 /* Print the name of the protocol */
1169 vty_out (vty
, "%s: ", zlog_proto_names
[zlog_default
->protocol
]);
1171 if (dtype
== normal_display
)
1173 vty_out (vty
, "ip%s prefix-list %s: %d entries%s",
1174 afi
== AFI_IP
? "" : "v6",
1175 plist
->name
, plist
->count
, VTY_NEWLINE
);
1177 vty_out (vty
, " Description: %s%s", plist
->desc
, VTY_NEWLINE
);
1179 else if (dtype
== summary_display
|| dtype
== detail_display
)
1181 vty_out (vty
, "ip%s prefix-list %s:%s",
1182 afi
== AFI_IP
? "" : "v6", plist
->name
, VTY_NEWLINE
);
1185 vty_out (vty
, " Description: %s%s", plist
->desc
, VTY_NEWLINE
);
1187 vty_out (vty
, " count: %d, range entries: %d, sequences: %u - %u%s",
1188 plist
->count
, plist
->rangecount
,
1189 plist
->head
? plist
->head
->seq
: 0,
1190 plist
->tail
? plist
->tail
->seq
: 0,
1194 if (dtype
!= summary_display
)
1196 for (pentry
= plist
->head
; pentry
; pentry
= pentry
->next
)
1198 if (dtype
== sequential_display
&& pentry
->seq
!= seqnum
)
1204 vty_out (vty
, "seq %u ", pentry
->seq
);
1206 vty_out (vty
, "%s ", prefix_list_type_str (pentry
));
1209 vty_out (vty
, "any");
1212 struct prefix
*p
= &pentry
->prefix
;
1215 vty_out (vty
, "%s/%d",
1216 inet_ntop (p
->family
, &p
->u
.prefix
, buf
, BUFSIZ
),
1220 vty_out (vty
, " ge %d", pentry
->ge
);
1222 vty_out (vty
, " le %d", pentry
->le
);
1225 if (dtype
== detail_display
|| dtype
== sequential_display
)
1226 vty_out (vty
, " (hit count: %ld, refcount: %ld)",
1227 pentry
->hitcnt
, pentry
->refcnt
);
1229 vty_out (vty
, "%s", VTY_NEWLINE
);
1235 vty_show_prefix_list (struct vty
*vty
, afi_t afi
, const char *name
,
1236 const char *seq
, enum display_type dtype
)
1238 struct prefix_list
*plist
;
1239 struct prefix_master
*master
;
1242 master
= prefix_master_get (afi
, 0);
1247 seqnum
= atoi (seq
);
1251 plist
= prefix_list_lookup (afi
, name
);
1254 vty_out (vty
, "%% Can't find specified prefix-list%s", VTY_NEWLINE
);
1257 vty_show_prefix_entry (vty
, afi
, plist
, master
, dtype
, seqnum
);
1261 if (dtype
== detail_display
|| dtype
== summary_display
)
1264 vty_out (vty
, "Prefix-list with the last deletion/insertion: %s%s",
1265 master
->recent
->name
, VTY_NEWLINE
);
1268 for (plist
= master
->num
.head
; plist
; plist
= plist
->next
)
1269 vty_show_prefix_entry (vty
, afi
, plist
, master
, dtype
, seqnum
);
1271 for (plist
= master
->str
.head
; plist
; plist
= plist
->next
)
1272 vty_show_prefix_entry (vty
, afi
, plist
, master
, dtype
, seqnum
);
1279 vty_show_prefix_list_prefix (struct vty
*vty
, afi_t afi
, const char *name
,
1280 const char *prefix
, enum display_type type
)
1282 struct prefix_list
*plist
;
1283 struct prefix_list_entry
*pentry
;
1288 plist
= prefix_list_lookup (afi
, name
);
1291 vty_out (vty
, "%% Can't find specified prefix-list%s", VTY_NEWLINE
);
1295 ret
= str2prefix (prefix
, &p
);
1298 vty_out (vty
, "%% prefix is malformed%s", VTY_NEWLINE
);
1302 for (pentry
= plist
->head
; pentry
; pentry
= pentry
->next
)
1306 if (type
== normal_display
|| type
== first_match_display
)
1307 if (prefix_same (&p
, &pentry
->prefix
))
1310 if (type
== longer_display
)
1311 if (prefix_match (&p
, &pentry
->prefix
))
1316 vty_out (vty
, " seq %u %s ",
1318 prefix_list_type_str (pentry
));
1321 vty_out (vty
, "any");
1324 struct prefix
*p
= &pentry
->prefix
;
1327 vty_out (vty
, "%s/%d",
1328 inet_ntop (p
->family
, &p
->u
.prefix
, buf
, BUFSIZ
),
1332 vty_out (vty
, " ge %d", pentry
->ge
);
1334 vty_out (vty
, " le %d", pentry
->le
);
1337 if (type
== normal_display
|| type
== first_match_display
)
1338 vty_out (vty
, " (hit count: %ld, refcount: %ld)",
1339 pentry
->hitcnt
, pentry
->refcnt
);
1341 vty_out (vty
, "%s", VTY_NEWLINE
);
1343 if (type
== first_match_display
)
1351 vty_clear_prefix_list (struct vty
*vty
, afi_t afi
, const char *name
,
1354 struct prefix_master
*master
;
1355 struct prefix_list
*plist
;
1356 struct prefix_list_entry
*pentry
;
1360 master
= prefix_master_get (afi
, 0);
1364 if (name
== NULL
&& prefix
== NULL
)
1366 for (plist
= master
->num
.head
; plist
; plist
= plist
->next
)
1367 for (pentry
= plist
->head
; pentry
; pentry
= pentry
->next
)
1370 for (plist
= master
->str
.head
; plist
; plist
= plist
->next
)
1371 for (pentry
= plist
->head
; pentry
; pentry
= pentry
->next
)
1376 plist
= prefix_list_lookup (afi
, name
);
1379 vty_out (vty
, "%% Can't find specified prefix-list%s", VTY_NEWLINE
);
1385 ret
= str2prefix (prefix
, &p
);
1388 vty_out (vty
, "%% prefix is malformed%s", VTY_NEWLINE
);
1393 for (pentry
= plist
->head
; pentry
; pentry
= pentry
->next
)
1397 if (prefix_match (&pentry
->prefix
, &p
))
1407 DEFUN (ip_prefix_list
,
1409 "ip prefix-list WORD <deny|permit> <A.B.C.D/M|any>",
1412 "Name of a prefix list\n"
1413 "Specify packets to reject\n"
1414 "Specify packets to forward\n"
1415 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
1416 "Any prefix match. Same as \"0.0.0.0/0 le 32\"\n")
1418 return vty_prefix_list_install (vty
, AFI_IP
, argv
[2]->arg
, NULL
,
1419 argv
[3]->arg
, argv
[4]->arg
, NULL
, NULL
);
1422 DEFUN (ip_prefix_list_ge
,
1423 ip_prefix_list_ge_cmd
,
1424 "ip prefix-list WORD <deny|permit> A.B.C.D/M ge (0-32)",
1427 "Name of a prefix list\n"
1428 "Specify packets to reject\n"
1429 "Specify packets to forward\n"
1430 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
1431 "Minimum prefix length to be matched\n"
1432 "Minimum prefix length\n")
1434 return vty_prefix_list_install (vty
, AFI_IP
, argv
[2]->arg
, NULL
, argv
[3]->arg
,
1435 argv
[4]->arg
, argv
[6]->arg
, NULL
);
1438 DEFUN (ip_prefix_list_ge_le
,
1439 ip_prefix_list_ge_le_cmd
,
1440 "ip prefix-list WORD <deny|permit> A.B.C.D/M ge (0-32) le (0-32)",
1443 "Name of a prefix list\n"
1444 "Specify packets to reject\n"
1445 "Specify packets to forward\n"
1446 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
1447 "Minimum prefix length to be matched\n"
1448 "Minimum prefix length\n"
1449 "Maximum prefix length to be matched\n"
1450 "Maximum prefix length\n")
1452 return vty_prefix_list_install (vty
, AFI_IP
, argv
[2]->arg
, NULL
, argv
[3]->arg
,
1453 argv
[4]->arg
, argv
[6]->arg
, argv
[8]->arg
);
1456 DEFUN (ip_prefix_list_le
,
1457 ip_prefix_list_le_cmd
,
1458 "ip prefix-list WORD <deny|permit> A.B.C.D/M le (0-32)",
1461 "Name of a prefix list\n"
1462 "Specify packets to reject\n"
1463 "Specify packets to forward\n"
1464 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
1465 "Maximum prefix length to be matched\n"
1466 "Maximum prefix length\n")
1468 return vty_prefix_list_install (vty
, AFI_IP
, argv
[2]->arg
, NULL
, argv
[3]->arg
,
1469 argv
[4]->arg
, NULL
, argv
[6]->arg
);
1472 DEFUN (ip_prefix_list_le_ge
,
1473 ip_prefix_list_le_ge_cmd
,
1474 "ip prefix-list WORD <deny|permit> A.B.C.D/M le (0-32) ge (0-32)",
1477 "Name of a prefix list\n"
1478 "Specify packets to reject\n"
1479 "Specify packets to forward\n"
1480 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
1481 "Maximum prefix length to be matched\n"
1482 "Maximum prefix length\n"
1483 "Minimum prefix length to be matched\n"
1484 "Minimum prefix length\n")
1486 return vty_prefix_list_install (vty
, AFI_IP
, argv
[2]->arg
, NULL
, argv
[3]->arg
,
1487 argv
[4]->arg
, argv
[8]->arg
, argv
[6]->arg
);
1490 DEFUN (ip_prefix_list_seq
,
1491 ip_prefix_list_seq_cmd
,
1492 "ip prefix-list WORD seq (1-4294967295) <deny|permit> <A.B.C.D/M|any>",
1495 "Name of a prefix list\n"
1496 "sequence number of an entry\n"
1498 "Specify packets to reject\n"
1499 "Specify packets to forward\n"
1500 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
1501 "Any prefix match. Same as \"0.0.0.0/0 le 32\"\n")
1503 return vty_prefix_list_install (vty
, AFI_IP
, argv
[2]->arg
, argv
[4]->arg
, argv
[5]->arg
,
1504 argv
[6]->arg
, NULL
, NULL
);
1507 DEFUN (ip_prefix_list_seq_ge
,
1508 ip_prefix_list_seq_ge_cmd
,
1509 "ip prefix-list WORD seq (1-4294967295) <deny|permit> A.B.C.D/M ge (0-32)",
1512 "Name of a prefix list\n"
1513 "sequence number of an entry\n"
1515 "Specify packets to reject\n"
1516 "Specify packets to forward\n"
1517 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
1518 "Minimum prefix length to be matched\n"
1519 "Minimum prefix length\n")
1521 return vty_prefix_list_install (vty
, AFI_IP
, argv
[2]->arg
, argv
[4]->arg
, argv
[5]->arg
,
1522 argv
[6]->arg
, argv
[8]->arg
, NULL
);
1525 DEFUN (ip_prefix_list_seq_ge_le
,
1526 ip_prefix_list_seq_ge_le_cmd
,
1527 "ip prefix-list WORD seq (1-4294967295) <deny|permit> A.B.C.D/M ge (0-32) le (0-32)",
1530 "Name of a prefix list\n"
1531 "sequence number of an entry\n"
1533 "Specify packets to reject\n"
1534 "Specify packets to forward\n"
1535 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
1536 "Minimum prefix length to be matched\n"
1537 "Minimum prefix length\n"
1538 "Maximum prefix length to be matched\n"
1539 "Maximum prefix length\n")
1541 return vty_prefix_list_install (vty
, AFI_IP
, argv
[2]->arg
, argv
[4]->arg
, argv
[5]->arg
,
1542 argv
[6]->arg
, argv
[8]->arg
, argv
[10]->arg
);
1545 DEFUN (ip_prefix_list_seq_le
,
1546 ip_prefix_list_seq_le_cmd
,
1547 "ip prefix-list WORD seq (1-4294967295) <deny|permit> A.B.C.D/M le (0-32)",
1550 "Name of a prefix list\n"
1551 "sequence number of an entry\n"
1553 "Specify packets to reject\n"
1554 "Specify packets to forward\n"
1555 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
1556 "Maximum prefix length to be matched\n"
1557 "Maximum prefix length\n")
1559 return vty_prefix_list_install (vty
, AFI_IP
, argv
[2]->arg
, argv
[4]->arg
, argv
[5]->arg
,
1560 argv
[6]->arg
, NULL
, argv
[8]->arg
);
1563 DEFUN (ip_prefix_list_seq_le_ge
,
1564 ip_prefix_list_seq_le_ge_cmd
,
1565 "ip prefix-list WORD seq (1-4294967295) <deny|permit> A.B.C.D/M le (0-32) ge (0-32)",
1568 "Name of a prefix list\n"
1569 "sequence number of an entry\n"
1571 "Specify packets to reject\n"
1572 "Specify packets to forward\n"
1573 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
1574 "Maximum prefix length to be matched\n"
1575 "Maximum prefix length\n"
1576 "Minimum prefix length to be matched\n"
1577 "Minimum prefix length\n")
1579 return vty_prefix_list_install (vty
, AFI_IP
, argv
[2]->arg
, argv
[4]->arg
, argv
[5]->arg
,
1580 argv
[6]->arg
, argv
[10]->arg
, argv
[8]->arg
);
1583 DEFUN (no_ip_prefix_list
,
1584 no_ip_prefix_list_cmd
,
1585 "no ip prefix-list WORD",
1589 "Name of a prefix list\n")
1591 return vty_prefix_list_uninstall (vty
, AFI_IP
, argv
[3]->arg
, NULL
, NULL
,
1595 DEFUN (no_ip_prefix_list_prefix
,
1596 no_ip_prefix_list_prefix_cmd
,
1597 "no ip prefix-list WORD <deny|permit> <A.B.C.D/M|any>",
1601 "Name of a prefix list\n"
1602 "Specify packets to reject\n"
1603 "Specify packets to forward\n"
1604 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
1605 "Any prefix match. Same as \"0.0.0.0/0 le 32\"\n")
1607 return vty_prefix_list_uninstall (vty
, AFI_IP
, argv
[3]->arg
, NULL
, argv
[4]->arg
,
1608 argv
[5]->arg
, NULL
, NULL
);
1611 DEFUN (no_ip_prefix_list_ge
,
1612 no_ip_prefix_list_ge_cmd
,
1613 "no ip prefix-list WORD <deny|permit> A.B.C.D/M ge (0-32)",
1617 "Name of a prefix list\n"
1618 "Specify packets to reject\n"
1619 "Specify packets to forward\n"
1620 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
1621 "Minimum prefix length to be matched\n"
1622 "Minimum prefix length\n")
1624 return vty_prefix_list_uninstall (vty
, AFI_IP
, argv
[3]->arg
, NULL
, argv
[4]->arg
,
1625 argv
[5]->arg
, argv
[7]->arg
, NULL
);
1628 DEFUN (no_ip_prefix_list_ge_le
,
1629 no_ip_prefix_list_ge_le_cmd
,
1630 "no ip prefix-list WORD <deny|permit> A.B.C.D/M ge (0-32) le (0-32)",
1634 "Name of a prefix list\n"
1635 "Specify packets to reject\n"
1636 "Specify packets to forward\n"
1637 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
1638 "Minimum prefix length to be matched\n"
1639 "Minimum prefix length\n"
1640 "Maximum prefix length to be matched\n"
1641 "Maximum prefix length\n")
1643 return vty_prefix_list_uninstall (vty
, AFI_IP
, argv
[3]->arg
, NULL
, argv
[4]->arg
,
1644 argv
[5]->arg
, argv
[7]->arg
, argv
[9]->arg
);
1647 DEFUN (no_ip_prefix_list_le
,
1648 no_ip_prefix_list_le_cmd
,
1649 "no ip prefix-list WORD <deny|permit> A.B.C.D/M le (0-32)",
1653 "Name of a prefix list\n"
1654 "Specify packets to reject\n"
1655 "Specify packets to forward\n"
1656 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
1657 "Maximum prefix length to be matched\n"
1658 "Maximum prefix length\n")
1660 return vty_prefix_list_uninstall (vty
, AFI_IP
, argv
[3]->arg
, NULL
, argv
[4]->arg
,
1661 argv
[5]->arg
, NULL
, argv
[7]->arg
);
1664 DEFUN (no_ip_prefix_list_le_ge
,
1665 no_ip_prefix_list_le_ge_cmd
,
1666 "no ip prefix-list WORD <deny|permit> A.B.C.D/M le (0-32) ge (0-32)",
1670 "Name of a prefix list\n"
1671 "Specify packets to reject\n"
1672 "Specify packets to forward\n"
1673 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
1674 "Maximum prefix length to be matched\n"
1675 "Maximum prefix length\n"
1676 "Minimum prefix length to be matched\n"
1677 "Minimum prefix length\n")
1679 return vty_prefix_list_uninstall (vty
, AFI_IP
, argv
[3]->arg
, NULL
, argv
[4]->arg
,
1680 argv
[5]->arg
, argv
[9]->arg
, argv
[7]->arg
);
1683 DEFUN (no_ip_prefix_list_seq
,
1684 no_ip_prefix_list_seq_cmd
,
1685 "no ip prefix-list WORD seq (1-4294967295) <deny|permit> <A.B.C.D/M|any>",
1689 "Name of a prefix list\n"
1690 "sequence number of an entry\n"
1692 "Specify packets to reject\n"
1693 "Specify packets to forward\n"
1694 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
1695 "Any prefix match. Same as \"0.0.0.0/0 le 32\"\n")
1697 return vty_prefix_list_uninstall (vty
, AFI_IP
, argv
[3]->arg
, argv
[5]->arg
, argv
[6]->arg
,
1698 argv
[7]->arg
, NULL
, NULL
);
1701 DEFUN (no_ip_prefix_list_seq_ge
,
1702 no_ip_prefix_list_seq_ge_cmd
,
1703 "no ip prefix-list WORD seq (1-4294967295) <deny|permit> A.B.C.D/M ge (0-32)",
1707 "Name of a prefix list\n"
1708 "sequence number of an entry\n"
1710 "Specify packets to reject\n"
1711 "Specify packets to forward\n"
1712 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
1713 "Minimum prefix length to be matched\n"
1714 "Minimum prefix length\n")
1716 return vty_prefix_list_uninstall (vty
, AFI_IP
, argv
[3]->arg
, argv
[5]->arg
, argv
[6]->arg
,
1717 argv
[7]->arg
, argv
[9]->arg
, NULL
);
1720 DEFUN (no_ip_prefix_list_seq_ge_le
,
1721 no_ip_prefix_list_seq_ge_le_cmd
,
1722 "no ip prefix-list WORD seq (1-4294967295) <deny|permit> A.B.C.D/M ge (0-32) le (0-32)",
1726 "Name of a prefix list\n"
1727 "sequence number of an entry\n"
1729 "Specify packets to reject\n"
1730 "Specify packets to forward\n"
1731 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
1732 "Minimum prefix length to be matched\n"
1733 "Minimum prefix length\n"
1734 "Maximum prefix length to be matched\n"
1735 "Maximum prefix length\n")
1737 return vty_prefix_list_uninstall (vty
, AFI_IP
, argv
[3]->arg
, argv
[5]->arg
, argv
[6]->arg
,
1738 argv
[7]->arg
, argv
[9]->arg
, argv
[11]->arg
);
1741 DEFUN (no_ip_prefix_list_seq_le
,
1742 no_ip_prefix_list_seq_le_cmd
,
1743 "no ip prefix-list WORD seq (1-4294967295) <deny|permit> A.B.C.D/M le (0-32)",
1747 "Name of a prefix list\n"
1748 "sequence number of an entry\n"
1750 "Specify packets to reject\n"
1751 "Specify packets to forward\n"
1752 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
1753 "Maximum prefix length to be matched\n"
1754 "Maximum prefix length\n")
1756 return vty_prefix_list_uninstall (vty
, AFI_IP
, argv
[3]->arg
, argv
[5]->arg
, argv
[6]->arg
,
1757 argv
[7]->arg
, NULL
, argv
[9]->arg
);
1760 DEFUN (no_ip_prefix_list_seq_le_ge
,
1761 no_ip_prefix_list_seq_le_ge_cmd
,
1762 "no ip prefix-list WORD seq (1-4294967295) <deny|permit> A.B.C.D/M le (0-32) ge (0-32)",
1766 "Name of a prefix list\n"
1767 "sequence number of an entry\n"
1769 "Specify packets to reject\n"
1770 "Specify packets to forward\n"
1771 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
1772 "Maximum prefix length to be matched\n"
1773 "Maximum prefix length\n"
1774 "Minimum prefix length to be matched\n"
1775 "Minimum prefix length\n")
1777 return vty_prefix_list_uninstall (vty
, AFI_IP
, argv
[3]->arg
, argv
[5]->arg
, argv
[6]->arg
,
1778 argv
[7]->arg
, argv
[11]->arg
, argv
[9]->arg
);
1781 DEFUN (ip_prefix_list_sequence_number
,
1782 ip_prefix_list_sequence_number_cmd
,
1783 "ip prefix-list sequence-number",
1786 "Include/exclude sequence numbers in NVGEN\n")
1788 prefix_master_ipv4
.seqnum
= 1;
1792 DEFUN (no_ip_prefix_list_sequence_number
,
1793 no_ip_prefix_list_sequence_number_cmd
,
1794 "no ip prefix-list sequence-number",
1798 "Include/exclude sequence numbers in NVGEN\n")
1800 prefix_master_ipv4
.seqnum
= 0;
1804 DEFUN (ip_prefix_list_description
,
1805 ip_prefix_list_description_cmd
,
1806 "ip prefix-list WORD description .LINE",
1809 "Name of a prefix list\n"
1810 "Prefix-list specific description\n"
1811 "Up to 80 characters describing this prefix-list\n")
1813 struct prefix_list
*plist
;
1815 plist
= prefix_list_get (AFI_IP
, 0, argv
[2]->arg
);
1819 XFREE (MTYPE_TMP
, plist
->desc
);
1822 plist
->desc
= argv_concat(argv
, argc
, 1);
1828 * CHECK ME - The following ALIASes need to be implemented in this DEFUN
1829 * "no ip prefix-list WORD description .LINE",
1833 * "Name of a prefix list\n"
1834 * "Prefix-list specific description\n"
1835 * "Up to 80 characters describing this prefix-list\n"
1838 DEFUN (no_ip_prefix_list_description
,
1839 no_ip_prefix_list_description_cmd
,
1840 "no ip prefix-list WORD description",
1844 "Name of a prefix list\n"
1845 "Prefix-list specific description\n")
1847 return vty_prefix_list_desc_unset (vty
, AFI_IP
, argv
[3]->arg
);
1851 DEFUN (show_ip_prefix_list
,
1852 show_ip_prefix_list_cmd
,
1853 "show ip prefix-list",
1858 return vty_show_prefix_list (vty
, AFI_IP
, NULL
, NULL
, normal_display
);
1861 DEFUN (show_ip_prefix_list_name
,
1862 show_ip_prefix_list_name_cmd
,
1863 "show ip prefix-list WORD",
1867 "Name of a prefix list\n")
1869 return vty_show_prefix_list (vty
, AFI_IP
, argv
[3]->arg
, NULL
, normal_display
);
1872 DEFUN (show_ip_prefix_list_name_seq
,
1873 show_ip_prefix_list_name_seq_cmd
,
1874 "show ip prefix-list WORD seq (1-4294967295)",
1878 "Name of a prefix list\n"
1879 "sequence number of an entry\n"
1880 "Sequence number\n")
1882 return vty_show_prefix_list (vty
, AFI_IP
, argv
[3]->arg
, argv
[5]->arg
, sequential_display
);
1885 DEFUN (show_ip_prefix_list_prefix
,
1886 show_ip_prefix_list_prefix_cmd
,
1887 "show ip prefix-list WORD A.B.C.D/M",
1891 "Name of a prefix list\n"
1892 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n")
1894 return vty_show_prefix_list_prefix (vty
, AFI_IP
, argv
[3]->arg
, argv
[4]->arg
, normal_display
);
1897 DEFUN (show_ip_prefix_list_prefix_longer
,
1898 show_ip_prefix_list_prefix_longer_cmd
,
1899 "show ip prefix-list WORD A.B.C.D/M longer",
1903 "Name of a prefix list\n"
1904 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
1905 "Lookup longer prefix\n")
1907 return vty_show_prefix_list_prefix (vty
, AFI_IP
, argv
[3]->arg
, argv
[4]->arg
, longer_display
);
1910 DEFUN (show_ip_prefix_list_prefix_first_match
,
1911 show_ip_prefix_list_prefix_first_match_cmd
,
1912 "show ip prefix-list WORD A.B.C.D/M first-match",
1916 "Name of a prefix list\n"
1917 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
1918 "First matched prefix\n")
1920 return vty_show_prefix_list_prefix (vty
, AFI_IP
, argv
[3]->arg
, argv
[4]->arg
, first_match_display
);
1923 DEFUN (show_ip_prefix_list_summary
,
1924 show_ip_prefix_list_summary_cmd
,
1925 "show ip prefix-list summary",
1929 "Summary of prefix lists\n")
1931 return vty_show_prefix_list (vty
, AFI_IP
, NULL
, NULL
, summary_display
);
1934 DEFUN (show_ip_prefix_list_summary_name
,
1935 show_ip_prefix_list_summary_name_cmd
,
1936 "show ip prefix-list summary WORD",
1940 "Summary of prefix lists\n"
1941 "Name of a prefix list\n")
1943 return vty_show_prefix_list (vty
, AFI_IP
, argv
[4]->arg
, NULL
, summary_display
);
1947 DEFUN (show_ip_prefix_list_detail
,
1948 show_ip_prefix_list_detail_cmd
,
1949 "show ip prefix-list detail",
1953 "Detail of prefix lists\n")
1955 return vty_show_prefix_list (vty
, AFI_IP
, NULL
, NULL
, detail_display
);
1958 DEFUN (show_ip_prefix_list_detail_name
,
1959 show_ip_prefix_list_detail_name_cmd
,
1960 "show ip prefix-list detail WORD",
1964 "Detail of prefix lists\n"
1965 "Name of a prefix list\n")
1967 return vty_show_prefix_list (vty
, AFI_IP
, argv
[4]->arg
, NULL
, detail_display
);
1970 DEFUN (clear_ip_prefix_list
,
1971 clear_ip_prefix_list_cmd
,
1972 "clear ip prefix-list",
1977 return vty_clear_prefix_list (vty
, AFI_IP
, NULL
, NULL
);
1980 DEFUN (clear_ip_prefix_list_name
,
1981 clear_ip_prefix_list_name_cmd
,
1982 "clear ip prefix-list WORD",
1986 "Name of a prefix list\n")
1988 return vty_clear_prefix_list (vty
, AFI_IP
, argv
[3]->arg
, NULL
);
1991 DEFUN (clear_ip_prefix_list_name_prefix
,
1992 clear_ip_prefix_list_name_prefix_cmd
,
1993 "clear ip prefix-list WORD A.B.C.D/M",
1997 "Name of a prefix list\n"
1998 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n")
2000 return vty_clear_prefix_list (vty
, AFI_IP
, argv
[3]->arg
, argv
[4]->arg
);
2004 DEFUN (ipv6_prefix_list
,
2005 ipv6_prefix_list_cmd
,
2006 "ipv6 prefix-list WORD <deny|permit> <X:X::X:X/M|any>",
2009 "Name of a prefix list\n"
2010 "Specify packets to reject\n"
2011 "Specify packets to forward\n"
2012 "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n"
2013 "Any prefix match. Same as \"::0/0 le 128\"\n")
2015 return vty_prefix_list_install (vty
, AFI_IP6
, argv
[2]->arg
, NULL
,
2016 argv
[3]->arg
, argv
[4]->arg
, NULL
, NULL
);
2019 DEFUN (ipv6_prefix_list_ge
,
2020 ipv6_prefix_list_ge_cmd
,
2021 "ipv6 prefix-list WORD <deny|permit> X:X::X:X/M ge (0-128)",
2024 "Name of a prefix list\n"
2025 "Specify packets to reject\n"
2026 "Specify packets to forward\n"
2027 "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n"
2028 "Minimum prefix length to be matched\n"
2029 "Minimum prefix length\n")
2031 return vty_prefix_list_install (vty
, AFI_IP6
, argv
[2]->arg
, NULL
, argv
[3]->arg
,
2032 argv
[4]->arg
, argv
[6]->arg
, NULL
);
2035 DEFUN (ipv6_prefix_list_ge_le
,
2036 ipv6_prefix_list_ge_le_cmd
,
2037 "ipv6 prefix-list WORD <deny|permit> X:X::X:X/M ge (0-128) le (0-128)",
2040 "Name of a prefix list\n"
2041 "Specify packets to reject\n"
2042 "Specify packets to forward\n"
2043 "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n"
2044 "Minimum prefix length to be matched\n"
2045 "Minimum prefix length\n"
2046 "Maximum prefix length to be matched\n"
2047 "Maximum prefix length\n")
2050 return vty_prefix_list_install (vty
, AFI_IP6
, argv
[2]->arg
, NULL
, argv
[3]->arg
,
2051 argv
[4]->arg
, argv
[6]->arg
, argv
[8]->arg
);
2054 DEFUN (ipv6_prefix_list_le
,
2055 ipv6_prefix_list_le_cmd
,
2056 "ipv6 prefix-list WORD <deny|permit> X:X::X:X/M le (0-128)",
2059 "Name of a prefix list\n"
2060 "Specify packets to reject\n"
2061 "Specify packets to forward\n"
2062 "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n"
2063 "Maximum prefix length to be matched\n"
2064 "Maximum prefix length\n")
2066 return vty_prefix_list_install (vty
, AFI_IP6
, argv
[2]->arg
, NULL
, argv
[3]->arg
,
2067 argv
[4]->arg
, NULL
, argv
[6]->arg
);
2070 DEFUN (ipv6_prefix_list_le_ge
,
2071 ipv6_prefix_list_le_ge_cmd
,
2072 "ipv6 prefix-list WORD <deny|permit> X:X::X:X/M le (0-128) ge (0-128)",
2075 "Name of a prefix list\n"
2076 "Specify packets to reject\n"
2077 "Specify packets to forward\n"
2078 "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n"
2079 "Maximum prefix length to be matched\n"
2080 "Maximum prefix length\n"
2081 "Minimum prefix length to be matched\n"
2082 "Minimum prefix length\n")
2084 return vty_prefix_list_install (vty
, AFI_IP6
, argv
[2]->arg
, NULL
, argv
[3]->arg
,
2085 argv
[4]->arg
, argv
[8]->arg
, argv
[6]->arg
);
2088 DEFUN (ipv6_prefix_list_seq
,
2089 ipv6_prefix_list_seq_cmd
,
2090 "ipv6 prefix-list WORD seq (1-4294967295) <deny|permit> <X:X::X:X/M|any>",
2093 "Name of a prefix list\n"
2094 "sequence number of an entry\n"
2096 "Specify packets to reject\n"
2097 "Specify packets to forward\n"
2098 "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n"
2099 "Any prefix match. Same as \"::0/0 le 128\"\n")
2101 return vty_prefix_list_install (vty
, AFI_IP6
, argv
[2]->arg
, argv
[4]->arg
, argv
[5]->arg
,
2102 argv
[6]->arg
, NULL
, NULL
);
2105 DEFUN (ipv6_prefix_list_seq_ge
,
2106 ipv6_prefix_list_seq_ge_cmd
,
2107 "ipv6 prefix-list WORD seq (1-4294967295) <deny|permit> X:X::X:X/M ge (0-128)",
2110 "Name of a prefix list\n"
2111 "sequence number of an entry\n"
2113 "Specify packets to reject\n"
2114 "Specify packets to forward\n"
2115 "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n"
2116 "Minimum prefix length to be matched\n"
2117 "Minimum prefix length\n")
2119 return vty_prefix_list_install (vty
, AFI_IP6
, argv
[2]->arg
, argv
[4]->arg
, argv
[5]->arg
,
2120 argv
[6]->arg
, argv
[8]->arg
, NULL
);
2123 DEFUN (ipv6_prefix_list_seq_ge_le
,
2124 ipv6_prefix_list_seq_ge_le_cmd
,
2125 "ipv6 prefix-list WORD seq (1-4294967295) <deny|permit> X:X::X:X/M ge (0-128) le (0-128)",
2128 "Name of a prefix list\n"
2129 "sequence number of an entry\n"
2131 "Specify packets to reject\n"
2132 "Specify packets to forward\n"
2133 "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n"
2134 "Minimum prefix length to be matched\n"
2135 "Minimum prefix length\n"
2136 "Maximum prefix length to be matched\n"
2137 "Maximum prefix length\n")
2139 return vty_prefix_list_install (vty
, AFI_IP6
, argv
[2]->arg
, argv
[4]->arg
, argv
[5]->arg
,
2140 argv
[6]->arg
, argv
[8]->arg
, argv
[10]->arg
);
2143 DEFUN (ipv6_prefix_list_seq_le
,
2144 ipv6_prefix_list_seq_le_cmd
,
2145 "ipv6 prefix-list WORD seq (1-4294967295) <deny|permit> X:X::X:X/M le (0-128)",
2148 "Name of a prefix list\n"
2149 "sequence number of an entry\n"
2151 "Specify packets to reject\n"
2152 "Specify packets to forward\n"
2153 "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n"
2154 "Maximum prefix length to be matched\n"
2155 "Maximum prefix length\n")
2157 return vty_prefix_list_install (vty
, AFI_IP6
, argv
[2]->arg
, argv
[4]->arg
, argv
[5]->arg
,
2158 argv
[6]->arg
, NULL
, argv
[8]->arg
);
2161 DEFUN (ipv6_prefix_list_seq_le_ge
,
2162 ipv6_prefix_list_seq_le_ge_cmd
,
2163 "ipv6 prefix-list WORD seq (1-4294967295) <deny|permit> X:X::X:X/M le (0-128) ge (0-128)",
2166 "Name of a prefix list\n"
2167 "sequence number of an entry\n"
2169 "Specify packets to reject\n"
2170 "Specify packets to forward\n"
2171 "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n"
2172 "Maximum prefix length to be matched\n"
2173 "Maximum prefix length\n"
2174 "Minimum prefix length to be matched\n"
2175 "Minimum prefix length\n")
2177 return vty_prefix_list_install (vty
, AFI_IP6
, argv
[2]->arg
, argv
[4]->arg
, argv
[5]->arg
,
2178 argv
[6]->arg
, argv
[10]->arg
, argv
[8]->arg
);
2181 DEFUN (no_ipv6_prefix_list
,
2182 no_ipv6_prefix_list_cmd
,
2183 "no ipv6 prefix-list WORD",
2187 "Name of a prefix list\n")
2189 return vty_prefix_list_uninstall (vty
, AFI_IP6
, argv
[3]->arg
, NULL
, NULL
,
2193 DEFUN (no_ipv6_prefix_list_prefix
,
2194 no_ipv6_prefix_list_prefix_cmd
,
2195 "no ipv6 prefix-list WORD <deny|permit> <X:X::X:X/M|any>",
2199 "Name of a prefix list\n"
2200 "Specify packets to reject\n"
2201 "Specify packets to forward\n"
2202 "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n"
2203 "Any prefix match. Same as \"::0/0 le 128\"\n")
2205 return vty_prefix_list_uninstall (vty
, AFI_IP6
, argv
[3]->arg
, NULL
, argv
[4]->arg
,
2206 argv
[5]->arg
, NULL
, NULL
);
2209 DEFUN (no_ipv6_prefix_list_ge
,
2210 no_ipv6_prefix_list_ge_cmd
,
2211 "no ipv6 prefix-list WORD <deny|permit> X:X::X:X/M ge (0-128)",
2215 "Name of a prefix list\n"
2216 "Specify packets to reject\n"
2217 "Specify packets to forward\n"
2218 "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n"
2219 "Minimum prefix length to be matched\n"
2220 "Minimum prefix length\n")
2222 return vty_prefix_list_uninstall (vty
, AFI_IP6
, argv
[3]->arg
, NULL
, argv
[4]->arg
,
2223 argv
[5]->arg
, argv
[7]->arg
, NULL
);
2226 DEFUN (no_ipv6_prefix_list_ge_le
,
2227 no_ipv6_prefix_list_ge_le_cmd
,
2228 "no ipv6 prefix-list WORD <deny|permit> X:X::X:X/M ge (0-128) le (0-128)",
2232 "Name of a prefix list\n"
2233 "Specify packets to reject\n"
2234 "Specify packets to forward\n"
2235 "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n"
2236 "Minimum prefix length to be matched\n"
2237 "Minimum prefix length\n"
2238 "Maximum prefix length to be matched\n"
2239 "Maximum prefix length\n")
2241 return vty_prefix_list_uninstall (vty
, AFI_IP6
, argv
[3]->arg
, NULL
, argv
[4]->arg
,
2242 argv
[5]->arg
, argv
[7]->arg
, argv
[9]->arg
);
2245 DEFUN (no_ipv6_prefix_list_le
,
2246 no_ipv6_prefix_list_le_cmd
,
2247 "no ipv6 prefix-list WORD <deny|permit> X:X::X:X/M le (0-128)",
2251 "Name of a prefix list\n"
2252 "Specify packets to reject\n"
2253 "Specify packets to forward\n"
2254 "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n"
2255 "Maximum prefix length to be matched\n"
2256 "Maximum prefix length\n")
2258 return vty_prefix_list_uninstall (vty
, AFI_IP6
, argv
[3]->arg
, NULL
, argv
[4]->arg
,
2259 argv
[5]->arg
, NULL
, argv
[7]->arg
);
2262 DEFUN (no_ipv6_prefix_list_le_ge
,
2263 no_ipv6_prefix_list_le_ge_cmd
,
2264 "no ipv6 prefix-list WORD <deny|permit> X:X::X:X/M le (0-128) ge (0-128)",
2268 "Name of a prefix list\n"
2269 "Specify packets to reject\n"
2270 "Specify packets to forward\n"
2271 "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n"
2272 "Maximum prefix length to be matched\n"
2273 "Maximum prefix length\n"
2274 "Minimum prefix length to be matched\n"
2275 "Minimum prefix length\n")
2277 return vty_prefix_list_uninstall (vty
, AFI_IP6
, argv
[3]->arg
, NULL
, argv
[4]->arg
,
2278 argv
[5]->arg
, argv
[9]->arg
, argv
[7]->arg
);
2281 DEFUN (no_ipv6_prefix_list_seq
,
2282 no_ipv6_prefix_list_seq_cmd
,
2283 "no ipv6 prefix-list WORD seq (1-4294967295) <deny|permit> <X:X::X:X/M|any>",
2287 "Name of a prefix list\n"
2288 "sequence number of an entry\n"
2290 "Specify packets to reject\n"
2291 "Specify packets to forward\n"
2292 "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n"
2293 "Any prefix match. Same as \"::0/0 le 128\"\n")
2295 return vty_prefix_list_uninstall (vty
, AFI_IP6
, argv
[3]->arg
, argv
[5]->arg
, argv
[6]->arg
,
2296 argv
[7]->arg
, NULL
, NULL
);
2299 DEFUN (no_ipv6_prefix_list_seq_ge
,
2300 no_ipv6_prefix_list_seq_ge_cmd
,
2301 "no ipv6 prefix-list WORD seq (1-4294967295) <deny|permit> X:X::X:X/M ge (0-128)",
2305 "Name of a prefix list\n"
2306 "sequence number of an entry\n"
2308 "Specify packets to reject\n"
2309 "Specify packets to forward\n"
2310 "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n"
2311 "Minimum prefix length to be matched\n"
2312 "Minimum prefix length\n")
2314 return vty_prefix_list_uninstall (vty
, AFI_IP6
, argv
[3]->arg
, argv
[5]->arg
, argv
[6]->arg
,
2315 argv
[7]->arg
, argv
[9]->arg
, NULL
);
2318 DEFUN (no_ipv6_prefix_list_seq_ge_le
,
2319 no_ipv6_prefix_list_seq_ge_le_cmd
,
2320 "no ipv6 prefix-list WORD seq (1-4294967295) <deny|permit> X:X::X:X/M ge (0-128) le (0-128)",
2324 "Name of a prefix list\n"
2325 "sequence number of an entry\n"
2327 "Specify packets to reject\n"
2328 "Specify packets to forward\n"
2329 "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n"
2330 "Minimum prefix length to be matched\n"
2331 "Minimum prefix length\n"
2332 "Maximum prefix length to be matched\n"
2333 "Maximum prefix length\n")
2335 return vty_prefix_list_uninstall (vty
, AFI_IP6
, argv
[3]->arg
, argv
[5]->arg
, argv
[6]->arg
,
2336 argv
[7]->arg
, argv
[9]->arg
, argv
[11]->arg
);
2339 DEFUN (no_ipv6_prefix_list_seq_le
,
2340 no_ipv6_prefix_list_seq_le_cmd
,
2341 "no ipv6 prefix-list WORD seq (1-4294967295) <deny|permit> X:X::X:X/M le (0-128)",
2345 "Name of a prefix list\n"
2346 "sequence number of an entry\n"
2348 "Specify packets to reject\n"
2349 "Specify packets to forward\n"
2350 "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n"
2351 "Maximum prefix length to be matched\n"
2352 "Maximum prefix length\n")
2354 return vty_prefix_list_uninstall (vty
, AFI_IP6
, argv
[3]->arg
, argv
[5]->arg
, argv
[6]->arg
,
2355 argv
[7]->arg
, NULL
, argv
[9]->arg
);
2358 DEFUN (no_ipv6_prefix_list_seq_le_ge
,
2359 no_ipv6_prefix_list_seq_le_ge_cmd
,
2360 "no ipv6 prefix-list WORD seq (1-4294967295) <deny|permit> X:X::X:X/M le (0-128) ge (0-128)",
2364 "Name of a prefix list\n"
2365 "sequence number of an entry\n"
2367 "Specify packets to reject\n"
2368 "Specify packets to forward\n"
2369 "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n"
2370 "Maximum prefix length to be matched\n"
2371 "Maximum prefix length\n"
2372 "Minimum prefix length to be matched\n"
2373 "Minimum prefix length\n")
2375 return vty_prefix_list_uninstall (vty
, AFI_IP6
, argv
[3]->arg
, argv
[5]->arg
, argv
[6]->arg
,
2376 argv
[7]->arg
, argv
[11]->arg
, argv
[9]->arg
);
2379 DEFUN (ipv6_prefix_list_sequence_number
,
2380 ipv6_prefix_list_sequence_number_cmd
,
2381 "ipv6 prefix-list sequence-number",
2384 "Include/exclude sequence numbers in NVGEN\n")
2386 prefix_master_ipv6
.seqnum
= 1;
2390 DEFUN (no_ipv6_prefix_list_sequence_number
,
2391 no_ipv6_prefix_list_sequence_number_cmd
,
2392 "no ipv6 prefix-list sequence-number",
2396 "Include/exclude sequence numbers in NVGEN\n")
2398 prefix_master_ipv6
.seqnum
= 0;
2402 DEFUN (ipv6_prefix_list_description
,
2403 ipv6_prefix_list_description_cmd
,
2404 "ipv6 prefix-list WORD description .LINE",
2407 "Name of a prefix list\n"
2408 "Prefix-list specific description\n"
2409 "Up to 80 characters describing this prefix-list\n")
2411 struct prefix_list
*plist
;
2413 plist
= prefix_list_get (AFI_IP6
, 0, argv
[2]->arg
);
2417 XFREE (MTYPE_TMP
, plist
->desc
);
2420 plist
->desc
= argv_concat(argv
, argc
, 1);
2426 * CHECK ME - The following ALIASes need to be implemented in this DEFUN
2427 * "no ipv6 prefix-list WORD description .LINE",
2431 * "Name of a prefix list\n"
2432 * "Prefix-list specific description\n"
2433 * "Up to 80 characters describing this prefix-list\n"
2436 DEFUN (no_ipv6_prefix_list_description
,
2437 no_ipv6_prefix_list_description_cmd
,
2438 "no ipv6 prefix-list WORD description",
2442 "Name of a prefix list\n"
2443 "Prefix-list specific description\n")
2445 return vty_prefix_list_desc_unset (vty
, AFI_IP6
, argv
[3]->arg
);
2449 DEFUN (show_ipv6_prefix_list
,
2450 show_ipv6_prefix_list_cmd
,
2451 "show ipv6 prefix-list",
2456 return vty_show_prefix_list (vty
, AFI_IP6
, NULL
, NULL
, normal_display
);
2459 DEFUN (show_ipv6_prefix_list_name
,
2460 show_ipv6_prefix_list_name_cmd
,
2461 "show ipv6 prefix-list WORD",
2465 "Name of a prefix list\n")
2467 return vty_show_prefix_list (vty
, AFI_IP6
, argv
[3]->arg
, NULL
, normal_display
);
2470 DEFUN (show_ipv6_prefix_list_name_seq
,
2471 show_ipv6_prefix_list_name_seq_cmd
,
2472 "show ipv6 prefix-list WORD seq (1-4294967295)",
2476 "Name of a prefix list\n"
2477 "sequence number of an entry\n"
2478 "Sequence number\n")
2480 return vty_show_prefix_list (vty
, AFI_IP6
, argv
[3]->arg
, argv
[5]->arg
, sequential_display
);
2483 DEFUN (show_ipv6_prefix_list_prefix
,
2484 show_ipv6_prefix_list_prefix_cmd
,
2485 "show ipv6 prefix-list WORD X:X::X:X/M",
2489 "Name of a prefix list\n"
2490 "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n")
2492 return vty_show_prefix_list_prefix (vty
, AFI_IP6
, argv
[3]->arg
, argv
[4]->arg
, normal_display
);
2495 DEFUN (show_ipv6_prefix_list_prefix_longer
,
2496 show_ipv6_prefix_list_prefix_longer_cmd
,
2497 "show ipv6 prefix-list WORD X:X::X:X/M longer",
2501 "Name of a prefix list\n"
2502 "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n"
2503 "Lookup longer prefix\n")
2505 return vty_show_prefix_list_prefix (vty
, AFI_IP6
, argv
[3]->arg
, argv
[4]->arg
, longer_display
);
2508 DEFUN (show_ipv6_prefix_list_prefix_first_match
,
2509 show_ipv6_prefix_list_prefix_first_match_cmd
,
2510 "show ipv6 prefix-list WORD X:X::X:X/M first-match",
2514 "Name of a prefix list\n"
2515 "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n"
2516 "First matched prefix\n")
2518 return vty_show_prefix_list_prefix (vty
, AFI_IP6
, argv
[3]->arg
, argv
[4]->arg
, first_match_display
);
2521 DEFUN (show_ipv6_prefix_list_summary
,
2522 show_ipv6_prefix_list_summary_cmd
,
2523 "show ipv6 prefix-list summary",
2527 "Summary of prefix lists\n")
2529 return vty_show_prefix_list (vty
, AFI_IP6
, NULL
, NULL
, summary_display
);
2532 DEFUN (show_ipv6_prefix_list_summary_name
,
2533 show_ipv6_prefix_list_summary_name_cmd
,
2534 "show ipv6 prefix-list summary WORD",
2538 "Summary of prefix lists\n"
2539 "Name of a prefix list\n")
2541 return vty_show_prefix_list (vty
, AFI_IP6
, argv
[4]->arg
, NULL
, summary_display
);
2544 DEFUN (show_ipv6_prefix_list_detail
,
2545 show_ipv6_prefix_list_detail_cmd
,
2546 "show ipv6 prefix-list detail",
2550 "Detail of prefix lists\n")
2552 return vty_show_prefix_list (vty
, AFI_IP6
, NULL
, NULL
, detail_display
);
2555 DEFUN (show_ipv6_prefix_list_detail_name
,
2556 show_ipv6_prefix_list_detail_name_cmd
,
2557 "show ipv6 prefix-list detail WORD",
2561 "Detail of prefix lists\n"
2562 "Name of a prefix list\n")
2564 return vty_show_prefix_list (vty
, AFI_IP6
, argv
[4]->arg
, NULL
, detail_display
);
2567 DEFUN (clear_ipv6_prefix_list
,
2568 clear_ipv6_prefix_list_cmd
,
2569 "clear ipv6 prefix-list",
2574 return vty_clear_prefix_list (vty
, AFI_IP6
, NULL
, NULL
);
2577 DEFUN (clear_ipv6_prefix_list_name
,
2578 clear_ipv6_prefix_list_name_cmd
,
2579 "clear ipv6 prefix-list WORD",
2583 "Name of a prefix list\n")
2585 return vty_clear_prefix_list (vty
, AFI_IP6
, argv
[3]->arg
, NULL
);
2588 DEFUN (clear_ipv6_prefix_list_name_prefix
,
2589 clear_ipv6_prefix_list_name_prefix_cmd
,
2590 "clear ipv6 prefix-list WORD X:X::X:X/M",
2594 "Name of a prefix list\n"
2595 "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n")
2597 return vty_clear_prefix_list (vty
, AFI_IP6
, argv
[3]->arg
, argv
[4]->arg
);
2599 #endif /* HAVE_IPV6 */
2601 /* Configuration write function. */
2603 config_write_prefix_afi (afi_t afi
, struct vty
*vty
)
2605 struct prefix_list
*plist
;
2606 struct prefix_list_entry
*pentry
;
2607 struct prefix_master
*master
;
2610 master
= prefix_master_get (afi
, 0);
2614 if (! master
->seqnum
)
2616 vty_out (vty
, "no ip%s prefix-list sequence-number%s",
2617 afi
== AFI_IP
? "" : "v6", VTY_NEWLINE
);
2618 vty_out (vty
, "!%s", VTY_NEWLINE
);
2621 for (plist
= master
->num
.head
; plist
; plist
= plist
->next
)
2625 vty_out (vty
, "ip%s prefix-list %s description %s%s",
2626 afi
== AFI_IP
? "" : "v6",
2627 plist
->name
, plist
->desc
, VTY_NEWLINE
);
2631 for (pentry
= plist
->head
; pentry
; pentry
= pentry
->next
)
2633 vty_out (vty
, "ip%s prefix-list %s ",
2634 afi
== AFI_IP
? "" : "v6",
2638 vty_out (vty
, "seq %u ", pentry
->seq
);
2640 vty_out (vty
, "%s ", prefix_list_type_str (pentry
));
2643 vty_out (vty
, "any");
2646 struct prefix
*p
= &pentry
->prefix
;
2649 vty_out (vty
, "%s/%d",
2650 inet_ntop (p
->family
, &p
->u
.prefix
, buf
, BUFSIZ
),
2654 vty_out (vty
, " ge %d", pentry
->ge
);
2656 vty_out (vty
, " le %d", pentry
->le
);
2658 vty_out (vty
, "%s", VTY_NEWLINE
);
2661 /* vty_out (vty, "!%s", VTY_NEWLINE); */
2664 for (plist
= master
->str
.head
; plist
; plist
= plist
->next
)
2668 vty_out (vty
, "ip%s prefix-list %s description %s%s",
2669 afi
== AFI_IP
? "" : "v6",
2670 plist
->name
, plist
->desc
, VTY_NEWLINE
);
2674 for (pentry
= plist
->head
; pentry
; pentry
= pentry
->next
)
2676 vty_out (vty
, "ip%s prefix-list %s ",
2677 afi
== AFI_IP
? "" : "v6",
2681 vty_out (vty
, "seq %u ", pentry
->seq
);
2683 vty_out (vty
, "%s", prefix_list_type_str (pentry
));
2686 vty_out (vty
, " any");
2689 struct prefix
*p
= &pentry
->prefix
;
2692 vty_out (vty
, " %s/%d",
2693 inet_ntop (p
->family
, &p
->u
.prefix
, buf
, BUFSIZ
),
2697 vty_out (vty
, " ge %d", pentry
->ge
);
2699 vty_out (vty
, " le %d", pentry
->le
);
2701 vty_out (vty
, "%s", VTY_NEWLINE
);
2710 prefix_bgp_orf_entry (struct stream
*s
, struct prefix_list
*plist
,
2711 u_char init_flag
, u_char permit_flag
, u_char deny_flag
)
2713 struct prefix_list_entry
*pentry
;
2718 for (pentry
= plist
->head
; pentry
; pentry
= pentry
->next
)
2720 u_char flag
= init_flag
;
2721 struct prefix
*p
= &pentry
->prefix
;
2723 flag
|= (pentry
->type
== PREFIX_PERMIT
?
2724 permit_flag
: deny_flag
);
2725 stream_putc (s
, flag
);
2726 stream_putl (s
, (u_int32_t
)pentry
->seq
);
2727 stream_putc (s
, (u_char
)pentry
->ge
);
2728 stream_putc (s
, (u_char
)pentry
->le
);
2729 stream_put_prefix (s
, p
);
2736 prefix_bgp_orf_set (char *name
, afi_t afi
, struct orf_prefix
*orfp
,
2737 int permit
, int set
)
2739 struct prefix_list
*plist
;
2740 struct prefix_list_entry
*pentry
;
2742 /* ge and le value check */
2743 if (orfp
->ge
&& orfp
->ge
<= orfp
->p
.prefixlen
)
2745 if (orfp
->le
&& orfp
->le
<= orfp
->p
.prefixlen
)
2747 if (orfp
->le
&& orfp
->ge
> orfp
->le
)
2750 if (orfp
->ge
&& orfp
->le
== (afi
== AFI_IP
? 32 : 128))
2753 plist
= prefix_list_get (afi
, 1, name
);
2759 pentry
= prefix_list_entry_make (&orfp
->p
,
2760 (permit
? PREFIX_PERMIT
: PREFIX_DENY
),
2761 orfp
->seq
, orfp
->le
, orfp
->ge
, 0);
2763 if (prefix_entry_dup_check (plist
, pentry
))
2765 prefix_list_entry_free (pentry
);
2769 prefix_list_entry_add (plist
, pentry
);
2773 pentry
= prefix_list_entry_lookup (plist
, &orfp
->p
,
2774 (permit
? PREFIX_PERMIT
: PREFIX_DENY
),
2775 orfp
->seq
, orfp
->le
, orfp
->ge
);
2780 prefix_list_entry_delete (plist
, pentry
, 1);
2787 prefix_bgp_orf_remove_all (afi_t afi
, char *name
)
2789 struct prefix_list
*plist
;
2791 plist
= prefix_bgp_orf_lookup (afi
, name
);
2793 prefix_list_delete (plist
);
2796 /* return prefix count */
2798 prefix_bgp_show_prefix_list (struct vty
*vty
, afi_t afi
, char *name
, u_char use_json
)
2800 struct prefix_list
*plist
;
2801 struct prefix_list_entry
*pentry
;
2802 json_object
*json
= NULL
;
2803 json_object
*json_prefix
= NULL
;
2804 json_object
*json_list
= NULL
;
2806 plist
= prefix_bgp_orf_lookup (afi
, name
);
2811 return plist
->count
;
2815 json
= json_object_new_object();
2816 json_prefix
= json_object_new_object();
2817 json_list
= json_object_new_object();
2819 json_object_int_add(json_prefix
, "prefixListCounter", plist
->count
);
2820 json_object_string_add(json_prefix
, "prefixListName", plist
->name
);
2822 for (pentry
= plist
->head
; pentry
; pentry
= pentry
->next
)
2824 struct prefix
*p
= &pentry
->prefix
;
2828 sprintf(buf_a
, "%s/%d", inet_ntop (p
->family
, &p
->u
.prefix
, buf_b
, BUFSIZ
),
2831 json_object_int_add(json_list
, "seq", pentry
->seq
);
2832 json_object_string_add(json_list
, "seqPrefixListType", prefix_list_type_str (pentry
));
2835 json_object_int_add(json_list
, "ge", pentry
->ge
);
2837 json_object_int_add(json_list
, "le", pentry
->le
);
2839 json_object_object_add(json_prefix
, buf_a
, json_list
);
2842 json_object_object_add(json
, "ipPrefixList", json_prefix
);
2844 json_object_object_add(json
, "ipv6PrefixList", json_prefix
);
2846 vty_out (vty
, "%s%s", json_object_to_json_string(json
), VTY_NEWLINE
);
2847 json_object_free(json
);
2851 vty_out (vty
, "ip%s prefix-list %s: %d entries%s",
2852 afi
== AFI_IP
? "" : "v6",
2853 plist
->name
, plist
->count
, VTY_NEWLINE
);
2855 for (pentry
= plist
->head
; pentry
; pentry
= pentry
->next
)
2857 struct prefix
*p
= &pentry
->prefix
;
2860 vty_out (vty
, " seq %u %s %s/%d", pentry
->seq
,
2861 prefix_list_type_str (pentry
),
2862 inet_ntop (p
->family
, &p
->u
.prefix
, buf
, BUFSIZ
),
2866 vty_out (vty
, " ge %d", pentry
->ge
);
2868 vty_out (vty
, " le %d", pentry
->le
);
2870 vty_out (vty
, "%s", VTY_NEWLINE
);
2873 return plist
->count
;
2877 prefix_list_reset_afi (afi_t afi
, int orf
)
2879 struct prefix_list
*plist
;
2880 struct prefix_list
*next
;
2881 struct prefix_master
*master
;
2883 master
= prefix_master_get (afi
, orf
);
2887 for (plist
= master
->num
.head
; plist
; plist
= next
)
2890 prefix_list_delete (plist
);
2892 for (plist
= master
->str
.head
; plist
; plist
= next
)
2895 prefix_list_delete (plist
);
2898 assert (master
->num
.head
== NULL
);
2899 assert (master
->num
.tail
== NULL
);
2901 assert (master
->str
.head
== NULL
);
2902 assert (master
->str
.tail
== NULL
);
2905 master
->recent
= NULL
;
2909 /* Prefix-list node. */
2910 static struct cmd_node prefix_node
=
2913 "", /* Prefix list has no interface. */
2918 config_write_prefix_ipv4 (struct vty
*vty
)
2920 return config_write_prefix_afi (AFI_IP
, vty
);
2924 prefix_list_init_ipv4 (void)
2926 install_node (&prefix_node
, config_write_prefix_ipv4
);
2928 install_element (CONFIG_NODE
, &ip_prefix_list_cmd
);
2929 install_element (CONFIG_NODE
, &ip_prefix_list_ge_cmd
);
2930 install_element (CONFIG_NODE
, &ip_prefix_list_ge_le_cmd
);
2931 install_element (CONFIG_NODE
, &ip_prefix_list_le_cmd
);
2932 install_element (CONFIG_NODE
, &ip_prefix_list_le_ge_cmd
);
2933 install_element (CONFIG_NODE
, &ip_prefix_list_seq_cmd
);
2934 install_element (CONFIG_NODE
, &ip_prefix_list_seq_ge_cmd
);
2935 install_element (CONFIG_NODE
, &ip_prefix_list_seq_ge_le_cmd
);
2936 install_element (CONFIG_NODE
, &ip_prefix_list_seq_le_cmd
);
2937 install_element (CONFIG_NODE
, &ip_prefix_list_seq_le_ge_cmd
);
2939 install_element (CONFIG_NODE
, &no_ip_prefix_list_cmd
);
2940 install_element (CONFIG_NODE
, &no_ip_prefix_list_prefix_cmd
);
2941 install_element (CONFIG_NODE
, &no_ip_prefix_list_ge_cmd
);
2942 install_element (CONFIG_NODE
, &no_ip_prefix_list_ge_le_cmd
);
2943 install_element (CONFIG_NODE
, &no_ip_prefix_list_le_cmd
);
2944 install_element (CONFIG_NODE
, &no_ip_prefix_list_le_ge_cmd
);
2945 install_element (CONFIG_NODE
, &no_ip_prefix_list_seq_cmd
);
2946 install_element (CONFIG_NODE
, &no_ip_prefix_list_seq_ge_cmd
);
2947 install_element (CONFIG_NODE
, &no_ip_prefix_list_seq_ge_le_cmd
);
2948 install_element (CONFIG_NODE
, &no_ip_prefix_list_seq_le_cmd
);
2949 install_element (CONFIG_NODE
, &no_ip_prefix_list_seq_le_ge_cmd
);
2951 install_element (CONFIG_NODE
, &ip_prefix_list_description_cmd
);
2952 install_element (CONFIG_NODE
, &no_ip_prefix_list_description_cmd
);
2954 install_element (CONFIG_NODE
, &ip_prefix_list_sequence_number_cmd
);
2955 install_element (CONFIG_NODE
, &no_ip_prefix_list_sequence_number_cmd
);
2957 install_element (VIEW_NODE
, &show_ip_prefix_list_cmd
);
2958 install_element (VIEW_NODE
, &show_ip_prefix_list_name_cmd
);
2959 install_element (VIEW_NODE
, &show_ip_prefix_list_name_seq_cmd
);
2960 install_element (VIEW_NODE
, &show_ip_prefix_list_prefix_cmd
);
2961 install_element (VIEW_NODE
, &show_ip_prefix_list_prefix_longer_cmd
);
2962 install_element (VIEW_NODE
, &show_ip_prefix_list_prefix_first_match_cmd
);
2963 install_element (VIEW_NODE
, &show_ip_prefix_list_summary_cmd
);
2964 install_element (VIEW_NODE
, &show_ip_prefix_list_summary_name_cmd
);
2965 install_element (VIEW_NODE
, &show_ip_prefix_list_detail_cmd
);
2966 install_element (VIEW_NODE
, &show_ip_prefix_list_detail_name_cmd
);
2968 install_element (ENABLE_NODE
, &show_ip_prefix_list_cmd
);
2969 install_element (ENABLE_NODE
, &show_ip_prefix_list_name_cmd
);
2970 install_element (ENABLE_NODE
, &show_ip_prefix_list_name_seq_cmd
);
2971 install_element (ENABLE_NODE
, &show_ip_prefix_list_prefix_cmd
);
2972 install_element (ENABLE_NODE
, &show_ip_prefix_list_prefix_longer_cmd
);
2973 install_element (ENABLE_NODE
, &show_ip_prefix_list_prefix_first_match_cmd
);
2974 install_element (ENABLE_NODE
, &show_ip_prefix_list_summary_cmd
);
2975 install_element (ENABLE_NODE
, &show_ip_prefix_list_summary_name_cmd
);
2976 install_element (ENABLE_NODE
, &show_ip_prefix_list_detail_cmd
);
2977 install_element (ENABLE_NODE
, &show_ip_prefix_list_detail_name_cmd
);
2979 install_element (ENABLE_NODE
, &clear_ip_prefix_list_cmd
);
2980 install_element (ENABLE_NODE
, &clear_ip_prefix_list_name_cmd
);
2981 install_element (ENABLE_NODE
, &clear_ip_prefix_list_name_prefix_cmd
);
2985 /* Prefix-list node. */
2986 static struct cmd_node prefix_ipv6_node
=
2989 "", /* Prefix list has no interface. */
2994 config_write_prefix_ipv6 (struct vty
*vty
)
2996 return config_write_prefix_afi (AFI_IP6
, vty
);
3000 prefix_list_init_ipv6 (void)
3002 install_node (&prefix_ipv6_node
, config_write_prefix_ipv6
);
3004 install_element (CONFIG_NODE
, &ipv6_prefix_list_cmd
);
3005 install_element (CONFIG_NODE
, &ipv6_prefix_list_ge_cmd
);
3006 install_element (CONFIG_NODE
, &ipv6_prefix_list_ge_le_cmd
);
3007 install_element (CONFIG_NODE
, &ipv6_prefix_list_le_cmd
);
3008 install_element (CONFIG_NODE
, &ipv6_prefix_list_le_ge_cmd
);
3009 install_element (CONFIG_NODE
, &ipv6_prefix_list_seq_cmd
);
3010 install_element (CONFIG_NODE
, &ipv6_prefix_list_seq_ge_cmd
);
3011 install_element (CONFIG_NODE
, &ipv6_prefix_list_seq_ge_le_cmd
);
3012 install_element (CONFIG_NODE
, &ipv6_prefix_list_seq_le_cmd
);
3013 install_element (CONFIG_NODE
, &ipv6_prefix_list_seq_le_ge_cmd
);
3015 install_element (CONFIG_NODE
, &no_ipv6_prefix_list_cmd
);
3016 install_element (CONFIG_NODE
, &no_ipv6_prefix_list_prefix_cmd
);
3017 install_element (CONFIG_NODE
, &no_ipv6_prefix_list_ge_cmd
);
3018 install_element (CONFIG_NODE
, &no_ipv6_prefix_list_ge_le_cmd
);
3019 install_element (CONFIG_NODE
, &no_ipv6_prefix_list_le_cmd
);
3020 install_element (CONFIG_NODE
, &no_ipv6_prefix_list_le_ge_cmd
);
3021 install_element (CONFIG_NODE
, &no_ipv6_prefix_list_seq_cmd
);
3022 install_element (CONFIG_NODE
, &no_ipv6_prefix_list_seq_ge_cmd
);
3023 install_element (CONFIG_NODE
, &no_ipv6_prefix_list_seq_ge_le_cmd
);
3024 install_element (CONFIG_NODE
, &no_ipv6_prefix_list_seq_le_cmd
);
3025 install_element (CONFIG_NODE
, &no_ipv6_prefix_list_seq_le_ge_cmd
);
3027 install_element (CONFIG_NODE
, &ipv6_prefix_list_description_cmd
);
3028 install_element (CONFIG_NODE
, &no_ipv6_prefix_list_description_cmd
);
3030 install_element (CONFIG_NODE
, &ipv6_prefix_list_sequence_number_cmd
);
3031 install_element (CONFIG_NODE
, &no_ipv6_prefix_list_sequence_number_cmd
);
3033 install_element (VIEW_NODE
, &show_ipv6_prefix_list_cmd
);
3034 install_element (VIEW_NODE
, &show_ipv6_prefix_list_name_cmd
);
3035 install_element (VIEW_NODE
, &show_ipv6_prefix_list_name_seq_cmd
);
3036 install_element (VIEW_NODE
, &show_ipv6_prefix_list_prefix_cmd
);
3037 install_element (VIEW_NODE
, &show_ipv6_prefix_list_prefix_longer_cmd
);
3038 install_element (VIEW_NODE
, &show_ipv6_prefix_list_prefix_first_match_cmd
);
3039 install_element (VIEW_NODE
, &show_ipv6_prefix_list_summary_cmd
);
3040 install_element (VIEW_NODE
, &show_ipv6_prefix_list_summary_name_cmd
);
3041 install_element (VIEW_NODE
, &show_ipv6_prefix_list_detail_cmd
);
3042 install_element (VIEW_NODE
, &show_ipv6_prefix_list_detail_name_cmd
);
3044 install_element (ENABLE_NODE
, &show_ipv6_prefix_list_cmd
);
3045 install_element (ENABLE_NODE
, &show_ipv6_prefix_list_name_cmd
);
3046 install_element (ENABLE_NODE
, &show_ipv6_prefix_list_name_seq_cmd
);
3047 install_element (ENABLE_NODE
, &show_ipv6_prefix_list_prefix_cmd
);
3048 install_element (ENABLE_NODE
, &show_ipv6_prefix_list_prefix_longer_cmd
);
3049 install_element (ENABLE_NODE
, &show_ipv6_prefix_list_prefix_first_match_cmd
);
3050 install_element (ENABLE_NODE
, &show_ipv6_prefix_list_summary_cmd
);
3051 install_element (ENABLE_NODE
, &show_ipv6_prefix_list_summary_name_cmd
);
3052 install_element (ENABLE_NODE
, &show_ipv6_prefix_list_detail_cmd
);
3053 install_element (ENABLE_NODE
, &show_ipv6_prefix_list_detail_name_cmd
);
3055 install_element (ENABLE_NODE
, &clear_ipv6_prefix_list_cmd
);
3056 install_element (ENABLE_NODE
, &clear_ipv6_prefix_list_name_cmd
);
3057 install_element (ENABLE_NODE
, &clear_ipv6_prefix_list_name_prefix_cmd
);
3059 #endif /* HAVE_IPV6 */
3064 prefix_list_init_ipv4 ();
3066 prefix_list_init_ipv6 ();
3067 #endif /* HAVE_IPV6 */
3071 prefix_list_reset ()
3073 prefix_list_reset_afi (AFI_IP
, 0);
3074 prefix_list_reset_afi (AFI_IP6
, 0);
3075 prefix_list_reset_afi (AFI_IP
, 1);
3076 prefix_list_reset_afi (AFI_IP6
, 1);