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
;
902 struct prefix p
, p_tmp
;
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
);
949 /* make a copy to verify prefix matches mask length */
950 prefix_copy (&p_tmp
, &p
);
951 apply_mask_ipv4 ((struct prefix_ipv4
*) &p_tmp
);
955 if (strncmp ("any", prefix
, strlen (prefix
)) == 0)
957 ret
= str2prefix_ipv6 ("::/0", (struct prefix_ipv6
*) &p
);
959 lenum
= IPV6_MAX_BITLEN
;
963 ret
= str2prefix_ipv6 (prefix
, (struct prefix_ipv6
*) &p
);
967 vty_out (vty
, "%% Malformed IPv6 prefix%s", VTY_NEWLINE
);
971 /* make a copy to verify prefix matches mask length */
972 prefix_copy (&p_tmp
, &p
);
973 apply_mask_ipv6 ((struct prefix_ipv6
*) &p_tmp
);
978 vty_out (vty
, "%% Unrecognized AFI (%d)%s", afi
, VTY_NEWLINE
);
983 /* If prefix has bits not under the mask, adjust it to fit */
984 if (!prefix_same (&p_tmp
, &p
))
986 char buf
[PREFIX2STR_BUFFER
];
987 char buf_tmp
[PREFIX2STR_BUFFER
];
988 prefix2str(&p
, buf
, sizeof(buf
));
989 prefix2str(&p_tmp
, buf_tmp
, sizeof(buf_tmp
));
990 zlog_warn ("Prefix-list %s prefix changed from %s to %s to match length",
995 /* ge and le check. */
996 if (genum
&& (genum
<= p
.prefixlen
))
997 return vty_invalid_prefix_range (vty
, prefix
);
999 if (lenum
&& (lenum
<= p
.prefixlen
))
1000 return vty_invalid_prefix_range (vty
, prefix
);
1002 if (lenum
&& (genum
> lenum
))
1003 return vty_invalid_prefix_range (vty
, prefix
);
1005 if (genum
&& (lenum
== (afi
== AFI_IP
? 32 : 128)))
1008 /* Get prefix_list with name. */
1009 plist
= prefix_list_get (afi
, 0, name
);
1011 /* Make prefix entry. */
1012 pentry
= prefix_list_entry_make (&p
, type
, seqnum
, lenum
, genum
, any
);
1014 /* Check same policy. */
1015 dup
= prefix_entry_dup_check (plist
, pentry
);
1019 prefix_list_entry_free (pentry
);
1023 /* Install new filter to the access_list. */
1024 prefix_list_entry_add (plist
, pentry
);
1030 vty_prefix_list_uninstall (struct vty
*vty
, afi_t afi
, const char *name
,
1031 const char *seq
, const char *typestr
,
1032 const char *prefix
, const char *ge
, const char *le
)
1035 enum prefix_list_type type
;
1036 struct prefix_list
*plist
;
1037 struct prefix_list_entry
*pentry
;
1043 /* Check prefix list name. */
1044 plist
= prefix_list_lookup (afi
, name
);
1047 vty_out (vty
, "%% Can't find specified prefix-list%s", VTY_NEWLINE
);
1051 /* Only prefix-list name specified, delete the entire prefix-list. */
1052 if (seq
== NULL
&& typestr
== NULL
&& prefix
== NULL
&&
1053 ge
== NULL
&& le
== NULL
)
1055 prefix_list_delete (plist
);
1059 /* We must have, at a minimum, both the type and prefix here */
1060 if ((typestr
== NULL
) || (prefix
== NULL
))
1062 vty_out (vty
, "%% Both prefix and type required%s", VTY_NEWLINE
);
1066 /* Check sequence number. */
1068 seqnum
= atoi (seq
);
1070 /* ge and le number */
1076 /* Check of filter type. */
1077 if (strncmp ("permit", typestr
, 1) == 0)
1078 type
= PREFIX_PERMIT
;
1079 else if (strncmp ("deny", typestr
, 1) == 0)
1083 vty_out (vty
, "%% prefix type must be permit or deny%s", VTY_NEWLINE
);
1087 /* "any" is special token for matching any IPv4 addresses. */
1090 if (strncmp ("any", prefix
, strlen (prefix
)) == 0)
1092 ret
= str2prefix_ipv4 ("0.0.0.0/0", (struct prefix_ipv4
*) &p
);
1094 lenum
= IPV4_MAX_BITLEN
;
1097 ret
= str2prefix_ipv4 (prefix
, (struct prefix_ipv4
*) &p
);
1101 vty_out (vty
, "%% Malformed IPv4 prefix%s", VTY_NEWLINE
);
1106 else if (afi
== AFI_IP6
)
1108 if (strncmp ("any", prefix
, strlen (prefix
)) == 0)
1110 ret
= str2prefix_ipv6 ("::/0", (struct prefix_ipv6
*) &p
);
1112 lenum
= IPV6_MAX_BITLEN
;
1115 ret
= str2prefix_ipv6 (prefix
, (struct prefix_ipv6
*) &p
);
1119 vty_out (vty
, "%% Malformed IPv6 prefix%s", VTY_NEWLINE
);
1123 #endif /* HAVE_IPV6 */
1125 /* Lookup prefix entry. */
1126 pentry
= prefix_list_entry_lookup(plist
, &p
, type
, seqnum
, lenum
, genum
);
1130 vty_out (vty
, "%% Can't find specified prefix-list%s", VTY_NEWLINE
);
1134 /* Install new filter to the access_list. */
1135 prefix_list_entry_delete (plist
, pentry
, 1);
1141 vty_prefix_list_desc_unset (struct vty
*vty
, afi_t afi
, const char *name
)
1143 struct prefix_list
*plist
;
1145 plist
= prefix_list_lookup (afi
, name
);
1148 vty_out (vty
, "%% Can't find specified prefix-list%s", VTY_NEWLINE
);
1154 XFREE (MTYPE_TMP
, plist
->desc
);
1158 if (plist
->head
== NULL
&& plist
->tail
== NULL
&& plist
->desc
== NULL
)
1159 prefix_list_delete (plist
);
1175 vty_show_prefix_entry (struct vty
*vty
, afi_t afi
, struct prefix_list
*plist
,
1176 struct prefix_master
*master
, enum display_type dtype
,
1179 struct prefix_list_entry
*pentry
;
1181 /* Print the name of the protocol */
1183 vty_out (vty
, "%s: ", zlog_proto_names
[zlog_default
->protocol
]);
1185 if (dtype
== normal_display
)
1187 vty_out (vty
, "ip%s prefix-list %s: %d entries%s",
1188 afi
== AFI_IP
? "" : "v6",
1189 plist
->name
, plist
->count
, VTY_NEWLINE
);
1191 vty_out (vty
, " Description: %s%s", plist
->desc
, VTY_NEWLINE
);
1193 else if (dtype
== summary_display
|| dtype
== detail_display
)
1195 vty_out (vty
, "ip%s prefix-list %s:%s",
1196 afi
== AFI_IP
? "" : "v6", plist
->name
, VTY_NEWLINE
);
1199 vty_out (vty
, " Description: %s%s", plist
->desc
, VTY_NEWLINE
);
1201 vty_out (vty
, " count: %d, range entries: %d, sequences: %u - %u%s",
1202 plist
->count
, plist
->rangecount
,
1203 plist
->head
? plist
->head
->seq
: 0,
1204 plist
->tail
? plist
->tail
->seq
: 0,
1208 if (dtype
!= summary_display
)
1210 for (pentry
= plist
->head
; pentry
; pentry
= pentry
->next
)
1212 if (dtype
== sequential_display
&& pentry
->seq
!= seqnum
)
1218 vty_out (vty
, "seq %u ", pentry
->seq
);
1220 vty_out (vty
, "%s ", prefix_list_type_str (pentry
));
1223 vty_out (vty
, "any");
1226 struct prefix
*p
= &pentry
->prefix
;
1229 vty_out (vty
, "%s/%d",
1230 inet_ntop (p
->family
, &p
->u
.prefix
, buf
, BUFSIZ
),
1234 vty_out (vty
, " ge %d", pentry
->ge
);
1236 vty_out (vty
, " le %d", pentry
->le
);
1239 if (dtype
== detail_display
|| dtype
== sequential_display
)
1240 vty_out (vty
, " (hit count: %ld, refcount: %ld)",
1241 pentry
->hitcnt
, pentry
->refcnt
);
1243 vty_out (vty
, "%s", VTY_NEWLINE
);
1249 vty_show_prefix_list (struct vty
*vty
, afi_t afi
, const char *name
,
1250 const char *seq
, enum display_type dtype
)
1252 struct prefix_list
*plist
;
1253 struct prefix_master
*master
;
1256 master
= prefix_master_get (afi
, 0);
1261 seqnum
= atoi (seq
);
1265 plist
= prefix_list_lookup (afi
, name
);
1268 vty_out (vty
, "%% Can't find specified prefix-list%s", VTY_NEWLINE
);
1271 vty_show_prefix_entry (vty
, afi
, plist
, master
, dtype
, seqnum
);
1275 if (dtype
== detail_display
|| dtype
== summary_display
)
1278 vty_out (vty
, "Prefix-list with the last deletion/insertion: %s%s",
1279 master
->recent
->name
, VTY_NEWLINE
);
1282 for (plist
= master
->num
.head
; plist
; plist
= plist
->next
)
1283 vty_show_prefix_entry (vty
, afi
, plist
, master
, dtype
, seqnum
);
1285 for (plist
= master
->str
.head
; plist
; plist
= plist
->next
)
1286 vty_show_prefix_entry (vty
, afi
, plist
, master
, dtype
, seqnum
);
1293 vty_show_prefix_list_prefix (struct vty
*vty
, afi_t afi
, const char *name
,
1294 const char *prefix
, enum display_type type
)
1296 struct prefix_list
*plist
;
1297 struct prefix_list_entry
*pentry
;
1302 plist
= prefix_list_lookup (afi
, name
);
1305 vty_out (vty
, "%% Can't find specified prefix-list%s", VTY_NEWLINE
);
1309 ret
= str2prefix (prefix
, &p
);
1312 vty_out (vty
, "%% prefix is malformed%s", VTY_NEWLINE
);
1316 for (pentry
= plist
->head
; pentry
; pentry
= pentry
->next
)
1320 if (type
== normal_display
|| type
== first_match_display
)
1321 if (prefix_same (&p
, &pentry
->prefix
))
1324 if (type
== longer_display
)
1325 if (prefix_match (&p
, &pentry
->prefix
))
1330 vty_out (vty
, " seq %u %s ",
1332 prefix_list_type_str (pentry
));
1335 vty_out (vty
, "any");
1338 struct prefix
*p
= &pentry
->prefix
;
1341 vty_out (vty
, "%s/%d",
1342 inet_ntop (p
->family
, &p
->u
.prefix
, buf
, BUFSIZ
),
1346 vty_out (vty
, " ge %d", pentry
->ge
);
1348 vty_out (vty
, " le %d", pentry
->le
);
1351 if (type
== normal_display
|| type
== first_match_display
)
1352 vty_out (vty
, " (hit count: %ld, refcount: %ld)",
1353 pentry
->hitcnt
, pentry
->refcnt
);
1355 vty_out (vty
, "%s", VTY_NEWLINE
);
1357 if (type
== first_match_display
)
1365 vty_clear_prefix_list (struct vty
*vty
, afi_t afi
, const char *name
,
1368 struct prefix_master
*master
;
1369 struct prefix_list
*plist
;
1370 struct prefix_list_entry
*pentry
;
1374 master
= prefix_master_get (afi
, 0);
1378 if (name
== NULL
&& prefix
== NULL
)
1380 for (plist
= master
->num
.head
; plist
; plist
= plist
->next
)
1381 for (pentry
= plist
->head
; pentry
; pentry
= pentry
->next
)
1384 for (plist
= master
->str
.head
; plist
; plist
= plist
->next
)
1385 for (pentry
= plist
->head
; pentry
; pentry
= pentry
->next
)
1390 plist
= prefix_list_lookup (afi
, name
);
1393 vty_out (vty
, "%% Can't find specified prefix-list%s", VTY_NEWLINE
);
1399 ret
= str2prefix (prefix
, &p
);
1402 vty_out (vty
, "%% prefix is malformed%s", VTY_NEWLINE
);
1407 for (pentry
= plist
->head
; pentry
; pentry
= pentry
->next
)
1411 if (prefix_match (&pentry
->prefix
, &p
))
1421 DEFUN (ip_prefix_list
,
1423 "ip prefix-list WORD <deny|permit> <A.B.C.D/M|any>",
1426 "Name of a prefix list\n"
1427 "Specify packets to reject\n"
1428 "Specify packets to forward\n"
1429 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
1430 "Any prefix match. Same as \"0.0.0.0/0 le 32\"\n")
1433 int idx_permit_deny
= 3;
1434 int idx_ipv4_any
= 4;
1435 return vty_prefix_list_install (vty
, AFI_IP
, argv
[idx_word
]->arg
, NULL
,
1436 argv
[idx_permit_deny
]->arg
, argv
[idx_ipv4_any
]->arg
, NULL
, NULL
);
1439 DEFUN (ip_prefix_list_ge
,
1440 ip_prefix_list_ge_cmd
,
1441 "ip prefix-list WORD <deny|permit> A.B.C.D/M ge (0-32)",
1444 "Name of a prefix list\n"
1445 "Specify packets to reject\n"
1446 "Specify packets to forward\n"
1447 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
1448 "Minimum prefix length to be matched\n"
1449 "Minimum prefix length\n")
1452 int idx_permit_deny
= 3;
1453 int idx_ipv4_prefixlen
= 4;
1455 return vty_prefix_list_install (vty
, AFI_IP
, argv
[idx_word
]->arg
, NULL
, argv
[idx_permit_deny
]->arg
,
1456 argv
[idx_ipv4_prefixlen
]->arg
, argv
[idx_number
]->arg
, NULL
);
1459 DEFUN (ip_prefix_list_ge_le
,
1460 ip_prefix_list_ge_le_cmd
,
1461 "ip prefix-list WORD <deny|permit> A.B.C.D/M ge (0-32) le (0-32)",
1464 "Name of a prefix list\n"
1465 "Specify packets to reject\n"
1466 "Specify packets to forward\n"
1467 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
1468 "Minimum prefix length to be matched\n"
1469 "Minimum prefix length\n"
1470 "Maximum prefix length to be matched\n"
1471 "Maximum prefix length\n")
1474 int idx_permit_deny
= 3;
1475 int idx_ipv4_prefixlen
= 4;
1477 int idx_number_2
= 8;
1478 return vty_prefix_list_install (vty
, AFI_IP
, argv
[idx_word
]->arg
, NULL
, argv
[idx_permit_deny
]->arg
,
1479 argv
[idx_ipv4_prefixlen
]->arg
, argv
[idx_number
]->arg
, argv
[idx_number_2
]->arg
);
1482 DEFUN (ip_prefix_list_le
,
1483 ip_prefix_list_le_cmd
,
1484 "ip prefix-list WORD <deny|permit> A.B.C.D/M le (0-32)",
1487 "Name of a prefix list\n"
1488 "Specify packets to reject\n"
1489 "Specify packets to forward\n"
1490 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
1491 "Maximum prefix length to be matched\n"
1492 "Maximum prefix length\n")
1495 int idx_permit_deny
= 3;
1496 int idx_ipv4_prefixlen
= 4;
1498 return vty_prefix_list_install (vty
, AFI_IP
, argv
[idx_word
]->arg
, NULL
, argv
[idx_permit_deny
]->arg
,
1499 argv
[idx_ipv4_prefixlen
]->arg
, NULL
, argv
[idx_number
]->arg
);
1502 DEFUN (ip_prefix_list_le_ge
,
1503 ip_prefix_list_le_ge_cmd
,
1504 "ip prefix-list WORD <deny|permit> A.B.C.D/M le (0-32) ge (0-32)",
1507 "Name of a prefix list\n"
1508 "Specify packets to reject\n"
1509 "Specify packets to forward\n"
1510 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
1511 "Maximum prefix length to be matched\n"
1512 "Maximum prefix length\n"
1513 "Minimum prefix length to be matched\n"
1514 "Minimum prefix length\n")
1517 int idx_permit_deny
= 3;
1518 int idx_ipv4_prefixlen
= 4;
1520 int idx_number_2
= 8;
1521 return vty_prefix_list_install (vty
, AFI_IP
, argv
[idx_word
]->arg
, NULL
, argv
[idx_permit_deny
]->arg
,
1522 argv
[idx_ipv4_prefixlen
]->arg
, argv
[idx_number_2
]->arg
, argv
[idx_number
]->arg
);
1525 DEFUN (ip_prefix_list_seq
,
1526 ip_prefix_list_seq_cmd
,
1527 "ip prefix-list WORD seq (1-4294967295) <deny|permit> <A.B.C.D/M|any>",
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 "Any prefix match. Same as \"0.0.0.0/0 le 32\"\n")
1540 int idx_permit_deny
= 5;
1541 int idx_ipv4_any
= 6;
1542 return vty_prefix_list_install (vty
, AFI_IP
, argv
[idx_word
]->arg
, argv
[idx_number
]->arg
, argv
[idx_permit_deny
]->arg
,
1543 argv
[idx_ipv4_any
]->arg
, NULL
, NULL
);
1546 DEFUN (ip_prefix_list_seq_ge
,
1547 ip_prefix_list_seq_ge_cmd
,
1548 "ip prefix-list WORD seq (1-4294967295) <deny|permit> A.B.C.D/M ge (0-32)",
1551 "Name of a prefix list\n"
1552 "sequence number of an entry\n"
1554 "Specify packets to reject\n"
1555 "Specify packets to forward\n"
1556 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
1557 "Minimum prefix length to be matched\n"
1558 "Minimum prefix length\n")
1562 int idx_permit_deny
= 5;
1563 int idx_ipv4_prefixlen
= 6;
1564 int idx_number_2
= 8;
1565 return vty_prefix_list_install (vty
, AFI_IP
, argv
[idx_word
]->arg
, argv
[idx_number
]->arg
, argv
[idx_permit_deny
]->arg
,
1566 argv
[idx_ipv4_prefixlen
]->arg
, argv
[idx_number_2
]->arg
, NULL
);
1569 DEFUN (ip_prefix_list_seq_ge_le
,
1570 ip_prefix_list_seq_ge_le_cmd
,
1571 "ip prefix-list WORD seq (1-4294967295) <deny|permit> A.B.C.D/M ge (0-32) le (0-32)",
1574 "Name of a prefix list\n"
1575 "sequence number of an entry\n"
1577 "Specify packets to reject\n"
1578 "Specify packets to forward\n"
1579 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
1580 "Minimum prefix length to be matched\n"
1581 "Minimum prefix length\n"
1582 "Maximum prefix length to be matched\n"
1583 "Maximum prefix length\n")
1587 int idx_permit_deny
= 5;
1588 int idx_ipv4_prefixlen
= 6;
1589 int idx_number_2
= 8;
1590 int idx_number_3
= 10;
1591 return vty_prefix_list_install (vty
, AFI_IP
, argv
[idx_word
]->arg
, argv
[idx_number
]->arg
, argv
[idx_permit_deny
]->arg
,
1592 argv
[idx_ipv4_prefixlen
]->arg
, argv
[idx_number_2
]->arg
, argv
[idx_number_3
]->arg
);
1595 DEFUN (ip_prefix_list_seq_le
,
1596 ip_prefix_list_seq_le_cmd
,
1597 "ip prefix-list WORD seq (1-4294967295) <deny|permit> A.B.C.D/M le (0-32)",
1600 "Name of a prefix list\n"
1601 "sequence number of an entry\n"
1603 "Specify packets to reject\n"
1604 "Specify packets to forward\n"
1605 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
1606 "Maximum prefix length to be matched\n"
1607 "Maximum prefix length\n")
1611 int idx_permit_deny
= 5;
1612 int idx_ipv4_prefixlen
= 6;
1613 int idx_number_2
= 8;
1614 return vty_prefix_list_install (vty
, AFI_IP
, argv
[idx_word
]->arg
, argv
[idx_number
]->arg
, argv
[idx_permit_deny
]->arg
,
1615 argv
[idx_ipv4_prefixlen
]->arg
, NULL
, argv
[idx_number_2
]->arg
);
1618 DEFUN (ip_prefix_list_seq_le_ge
,
1619 ip_prefix_list_seq_le_ge_cmd
,
1620 "ip prefix-list WORD seq (1-4294967295) <deny|permit> A.B.C.D/M le (0-32) ge (0-32)",
1623 "Name of a prefix list\n"
1624 "sequence number of an entry\n"
1626 "Specify packets to reject\n"
1627 "Specify packets to forward\n"
1628 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
1629 "Maximum prefix length to be matched\n"
1630 "Maximum prefix length\n"
1631 "Minimum prefix length to be matched\n"
1632 "Minimum prefix length\n")
1636 int idx_permit_deny
= 5;
1637 int idx_ipv4_prefixlen
= 6;
1638 int idx_number_2
= 8;
1639 int idx_number_3
= 10;
1640 return vty_prefix_list_install (vty
, AFI_IP
, argv
[idx_word
]->arg
, argv
[idx_number
]->arg
, argv
[idx_permit_deny
]->arg
,
1641 argv
[idx_ipv4_prefixlen
]->arg
, argv
[idx_number_3
]->arg
, argv
[idx_number_2
]->arg
);
1644 DEFUN (no_ip_prefix_list
,
1645 no_ip_prefix_list_cmd
,
1646 "no ip prefix-list WORD",
1650 "Name of a prefix list\n")
1653 return vty_prefix_list_uninstall (vty
, AFI_IP
, argv
[idx_word
]->arg
, NULL
, NULL
,
1657 DEFUN (no_ip_prefix_list_prefix
,
1658 no_ip_prefix_list_prefix_cmd
,
1659 "no ip prefix-list WORD <deny|permit> <A.B.C.D/M|any>",
1663 "Name of a prefix list\n"
1664 "Specify packets to reject\n"
1665 "Specify packets to forward\n"
1666 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
1667 "Any prefix match. Same as \"0.0.0.0/0 le 32\"\n")
1670 int idx_permit_deny
= 4;
1671 int idx_ipv4_any
= 5;
1672 return vty_prefix_list_uninstall (vty
, AFI_IP
, argv
[idx_word
]->arg
, NULL
, argv
[idx_permit_deny
]->arg
,
1673 argv
[idx_ipv4_any
]->arg
, NULL
, NULL
);
1676 DEFUN (no_ip_prefix_list_ge
,
1677 no_ip_prefix_list_ge_cmd
,
1678 "no ip prefix-list WORD <deny|permit> A.B.C.D/M ge (0-32)",
1682 "Name of a prefix list\n"
1683 "Specify packets to reject\n"
1684 "Specify packets to forward\n"
1685 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
1686 "Minimum prefix length to be matched\n"
1687 "Minimum prefix length\n")
1690 int idx_permit_deny
= 4;
1691 int idx_ipv4_prefixlen
= 5;
1693 return vty_prefix_list_uninstall (vty
, AFI_IP
, argv
[idx_word
]->arg
, NULL
, argv
[idx_permit_deny
]->arg
,
1694 argv
[idx_ipv4_prefixlen
]->arg
, argv
[idx_number
]->arg
, NULL
);
1697 DEFUN (no_ip_prefix_list_ge_le
,
1698 no_ip_prefix_list_ge_le_cmd
,
1699 "no ip prefix-list WORD <deny|permit> A.B.C.D/M ge (0-32) le (0-32)",
1703 "Name of a prefix list\n"
1704 "Specify packets to reject\n"
1705 "Specify packets to forward\n"
1706 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
1707 "Minimum prefix length to be matched\n"
1708 "Minimum prefix length\n"
1709 "Maximum prefix length to be matched\n"
1710 "Maximum prefix length\n")
1713 int idx_permit_deny
= 4;
1714 int idx_ipv4_prefixlen
= 5;
1716 int idx_number_2
= 9;
1717 return vty_prefix_list_uninstall (vty
, AFI_IP
, argv
[idx_word
]->arg
, NULL
, argv
[idx_permit_deny
]->arg
,
1718 argv
[idx_ipv4_prefixlen
]->arg
, argv
[idx_number
]->arg
, argv
[idx_number_2
]->arg
);
1721 DEFUN (no_ip_prefix_list_le
,
1722 no_ip_prefix_list_le_cmd
,
1723 "no ip prefix-list WORD <deny|permit> A.B.C.D/M le (0-32)",
1727 "Name of a prefix list\n"
1728 "Specify packets to reject\n"
1729 "Specify packets to forward\n"
1730 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
1731 "Maximum prefix length to be matched\n"
1732 "Maximum prefix length\n")
1735 int idx_permit_deny
= 4;
1736 int idx_ipv4_prefixlen
= 5;
1738 return vty_prefix_list_uninstall (vty
, AFI_IP
, argv
[idx_word
]->arg
, NULL
, argv
[idx_permit_deny
]->arg
,
1739 argv
[idx_ipv4_prefixlen
]->arg
, NULL
, argv
[idx_number
]->arg
);
1742 DEFUN (no_ip_prefix_list_le_ge
,
1743 no_ip_prefix_list_le_ge_cmd
,
1744 "no ip prefix-list WORD <deny|permit> A.B.C.D/M le (0-32) ge (0-32)",
1748 "Name of a prefix list\n"
1749 "Specify packets to reject\n"
1750 "Specify packets to forward\n"
1751 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
1752 "Maximum prefix length to be matched\n"
1753 "Maximum prefix length\n"
1754 "Minimum prefix length to be matched\n"
1755 "Minimum prefix length\n")
1758 int idx_permit_deny
= 4;
1759 int idx_ipv4_prefixlen
= 5;
1761 int idx_number_2
= 9;
1762 return vty_prefix_list_uninstall (vty
, AFI_IP
, argv
[idx_word
]->arg
, NULL
, argv
[idx_permit_deny
]->arg
,
1763 argv
[idx_ipv4_prefixlen
]->arg
, argv
[idx_number_2
]->arg
, argv
[idx_number
]->arg
);
1766 DEFUN (no_ip_prefix_list_seq
,
1767 no_ip_prefix_list_seq_cmd
,
1768 "no ip prefix-list WORD seq (1-4294967295) <deny|permit> <A.B.C.D/M|any>",
1772 "Name of a prefix list\n"
1773 "sequence number of an entry\n"
1775 "Specify packets to reject\n"
1776 "Specify packets to forward\n"
1777 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
1778 "Any prefix match. Same as \"0.0.0.0/0 le 32\"\n")
1782 int idx_permit_deny
= 6;
1783 int idx_ipv4_any
= 7;
1784 return vty_prefix_list_uninstall (vty
, AFI_IP
, argv
[idx_word
]->arg
, argv
[idx_number
]->arg
, argv
[idx_permit_deny
]->arg
,
1785 argv
[idx_ipv4_any
]->arg
, NULL
, NULL
);
1788 DEFUN (no_ip_prefix_list_seq_ge
,
1789 no_ip_prefix_list_seq_ge_cmd
,
1790 "no ip prefix-list WORD seq (1-4294967295) <deny|permit> A.B.C.D/M ge (0-32)",
1794 "Name of a prefix list\n"
1795 "sequence number of an entry\n"
1797 "Specify packets to reject\n"
1798 "Specify packets to forward\n"
1799 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
1800 "Minimum prefix length to be matched\n"
1801 "Minimum prefix length\n")
1805 int idx_permit_deny
= 6;
1806 int idx_ipv4_prefixlen
= 7;
1807 int idx_number_2
= 9;
1808 return vty_prefix_list_uninstall (vty
, AFI_IP
, argv
[idx_word
]->arg
, argv
[idx_number
]->arg
, argv
[idx_permit_deny
]->arg
,
1809 argv
[idx_ipv4_prefixlen
]->arg
, argv
[idx_number_2
]->arg
, NULL
);
1812 DEFUN (no_ip_prefix_list_seq_ge_le
,
1813 no_ip_prefix_list_seq_ge_le_cmd
,
1814 "no ip prefix-list WORD seq (1-4294967295) <deny|permit> A.B.C.D/M ge (0-32) le (0-32)",
1818 "Name of a prefix list\n"
1819 "sequence number of an entry\n"
1821 "Specify packets to reject\n"
1822 "Specify packets to forward\n"
1823 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
1824 "Minimum prefix length to be matched\n"
1825 "Minimum prefix length\n"
1826 "Maximum prefix length to be matched\n"
1827 "Maximum prefix length\n")
1831 int idx_permit_deny
= 6;
1832 int idx_ipv4_prefixlen
= 7;
1833 int idx_number_2
= 9;
1834 int idx_number_3
= 11;
1835 return vty_prefix_list_uninstall (vty
, AFI_IP
, argv
[idx_word
]->arg
, argv
[idx_number
]->arg
, argv
[idx_permit_deny
]->arg
,
1836 argv
[idx_ipv4_prefixlen
]->arg
, argv
[idx_number_2
]->arg
, argv
[idx_number_3
]->arg
);
1839 DEFUN (no_ip_prefix_list_seq_le
,
1840 no_ip_prefix_list_seq_le_cmd
,
1841 "no ip prefix-list WORD seq (1-4294967295) <deny|permit> A.B.C.D/M le (0-32)",
1845 "Name of a prefix list\n"
1846 "sequence number of an entry\n"
1848 "Specify packets to reject\n"
1849 "Specify packets to forward\n"
1850 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
1851 "Maximum prefix length to be matched\n"
1852 "Maximum prefix length\n")
1856 int idx_permit_deny
= 6;
1857 int idx_ipv4_prefixlen
= 7;
1858 int idx_number_2
= 9;
1859 return vty_prefix_list_uninstall (vty
, AFI_IP
, argv
[idx_word
]->arg
, argv
[idx_number
]->arg
, argv
[idx_permit_deny
]->arg
,
1860 argv
[idx_ipv4_prefixlen
]->arg
, NULL
, argv
[idx_number_2
]->arg
);
1863 DEFUN (no_ip_prefix_list_seq_le_ge
,
1864 no_ip_prefix_list_seq_le_ge_cmd
,
1865 "no ip prefix-list WORD seq (1-4294967295) <deny|permit> A.B.C.D/M le (0-32) ge (0-32)",
1869 "Name of a prefix list\n"
1870 "sequence number of an entry\n"
1872 "Specify packets to reject\n"
1873 "Specify packets to forward\n"
1874 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
1875 "Maximum prefix length to be matched\n"
1876 "Maximum prefix length\n"
1877 "Minimum prefix length to be matched\n"
1878 "Minimum prefix length\n")
1882 int idx_permit_deny
= 6;
1883 int idx_ipv4_prefixlen
= 7;
1884 int idx_number_2
= 9;
1885 int idx_number_3
= 11;
1886 return vty_prefix_list_uninstall (vty
, AFI_IP
, argv
[idx_word
]->arg
, argv
[idx_number
]->arg
, argv
[idx_permit_deny
]->arg
,
1887 argv
[idx_ipv4_prefixlen
]->arg
, argv
[idx_number_3
]->arg
, argv
[idx_number_2
]->arg
);
1890 DEFUN (ip_prefix_list_sequence_number
,
1891 ip_prefix_list_sequence_number_cmd
,
1892 "ip prefix-list sequence-number",
1895 "Include/exclude sequence numbers in NVGEN\n")
1897 prefix_master_ipv4
.seqnum
= 1;
1901 DEFUN (no_ip_prefix_list_sequence_number
,
1902 no_ip_prefix_list_sequence_number_cmd
,
1903 "no ip prefix-list sequence-number",
1907 "Include/exclude sequence numbers in NVGEN\n")
1909 prefix_master_ipv4
.seqnum
= 0;
1913 DEFUN (ip_prefix_list_description
,
1914 ip_prefix_list_description_cmd
,
1915 "ip prefix-list WORD description LINE...",
1918 "Name of a prefix list\n"
1919 "Prefix-list specific description\n"
1920 "Up to 80 characters describing this prefix-list\n")
1924 struct prefix_list
*plist
;
1926 plist
= prefix_list_get (AFI_IP
, 0, argv
[idx_word
]->arg
);
1930 XFREE (MTYPE_TMP
, plist
->desc
);
1933 plist
->desc
= argv_concat(argv
, argc
, idx_line
);
1938 DEFUN (no_ip_prefix_list_description
,
1939 no_ip_prefix_list_description_cmd
,
1940 "no ip prefix-list WORD description",
1944 "Name of a prefix list\n"
1945 "Prefix-list specific description\n")
1948 return vty_prefix_list_desc_unset (vty
, AFI_IP
, argv
[idx_word
]->arg
);
1952 DEFUN (no_ip_prefix_list_description_comment
,
1953 no_ip_prefix_list_description_comment_cmd
,
1954 "no ip prefix-list WORD description LINE...",
1958 "Name of a prefix list\n"
1959 "Prefix-list specific description\n"
1960 "Up to 80 characters describing this prefix-list\n")
1962 return no_ip_prefix_list_description (self
, vty
, argc
, argv
);
1965 DEFUN (show_ip_prefix_list
,
1966 show_ip_prefix_list_cmd
,
1967 "show ip prefix-list",
1972 return vty_show_prefix_list (vty
, AFI_IP
, NULL
, NULL
, normal_display
);
1975 DEFUN (show_ip_prefix_list_name
,
1976 show_ip_prefix_list_name_cmd
,
1977 "show ip prefix-list WORD",
1981 "Name of a prefix list\n")
1984 return vty_show_prefix_list (vty
, AFI_IP
, argv
[idx_word
]->arg
, NULL
, normal_display
);
1987 DEFUN (show_ip_prefix_list_name_seq
,
1988 show_ip_prefix_list_name_seq_cmd
,
1989 "show ip prefix-list WORD seq (1-4294967295)",
1993 "Name of a prefix list\n"
1994 "sequence number of an entry\n"
1995 "Sequence number\n")
1999 return vty_show_prefix_list (vty
, AFI_IP
, argv
[idx_word
]->arg
, argv
[idx_number
]->arg
, sequential_display
);
2002 DEFUN (show_ip_prefix_list_prefix
,
2003 show_ip_prefix_list_prefix_cmd
,
2004 "show ip prefix-list WORD A.B.C.D/M",
2008 "Name of a prefix list\n"
2009 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n")
2012 int idx_ipv4_prefixlen
= 4;
2013 return vty_show_prefix_list_prefix (vty
, AFI_IP
, argv
[idx_word
]->arg
, argv
[idx_ipv4_prefixlen
]->arg
, normal_display
);
2016 DEFUN (show_ip_prefix_list_prefix_longer
,
2017 show_ip_prefix_list_prefix_longer_cmd
,
2018 "show ip prefix-list WORD A.B.C.D/M longer",
2022 "Name of a prefix list\n"
2023 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
2024 "Lookup longer prefix\n")
2027 int idx_ipv4_prefixlen
= 4;
2028 return vty_show_prefix_list_prefix (vty
, AFI_IP
, argv
[idx_word
]->arg
, argv
[idx_ipv4_prefixlen
]->arg
, longer_display
);
2031 DEFUN (show_ip_prefix_list_prefix_first_match
,
2032 show_ip_prefix_list_prefix_first_match_cmd
,
2033 "show ip prefix-list WORD A.B.C.D/M first-match",
2037 "Name of a prefix list\n"
2038 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
2039 "First matched prefix\n")
2042 int idx_ipv4_prefixlen
= 4;
2043 return vty_show_prefix_list_prefix (vty
, AFI_IP
, argv
[idx_word
]->arg
, argv
[idx_ipv4_prefixlen
]->arg
, first_match_display
);
2046 DEFUN (show_ip_prefix_list_summary
,
2047 show_ip_prefix_list_summary_cmd
,
2048 "show ip prefix-list summary",
2052 "Summary of prefix lists\n")
2054 return vty_show_prefix_list (vty
, AFI_IP
, NULL
, NULL
, summary_display
);
2057 DEFUN (show_ip_prefix_list_summary_name
,
2058 show_ip_prefix_list_summary_name_cmd
,
2059 "show ip prefix-list summary WORD",
2063 "Summary of prefix lists\n"
2064 "Name of a prefix list\n")
2067 return vty_show_prefix_list (vty
, AFI_IP
, argv
[idx_word
]->arg
, NULL
, summary_display
);
2071 DEFUN (show_ip_prefix_list_detail
,
2072 show_ip_prefix_list_detail_cmd
,
2073 "show ip prefix-list detail",
2077 "Detail of prefix lists\n")
2079 return vty_show_prefix_list (vty
, AFI_IP
, NULL
, NULL
, detail_display
);
2082 DEFUN (show_ip_prefix_list_detail_name
,
2083 show_ip_prefix_list_detail_name_cmd
,
2084 "show ip prefix-list detail WORD",
2088 "Detail of prefix lists\n"
2089 "Name of a prefix list\n")
2092 return vty_show_prefix_list (vty
, AFI_IP
, argv
[idx_word
]->arg
, NULL
, detail_display
);
2095 DEFUN (clear_ip_prefix_list
,
2096 clear_ip_prefix_list_cmd
,
2097 "clear ip prefix-list",
2102 return vty_clear_prefix_list (vty
, AFI_IP
, NULL
, NULL
);
2105 DEFUN (clear_ip_prefix_list_name
,
2106 clear_ip_prefix_list_name_cmd
,
2107 "clear ip prefix-list WORD",
2111 "Name of a prefix list\n")
2114 return vty_clear_prefix_list (vty
, AFI_IP
, argv
[idx_word
]->arg
, NULL
);
2117 DEFUN (clear_ip_prefix_list_name_prefix
,
2118 clear_ip_prefix_list_name_prefix_cmd
,
2119 "clear ip prefix-list WORD A.B.C.D/M",
2123 "Name of a prefix list\n"
2124 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n")
2127 int idx_ipv4_prefixlen
= 4;
2128 return vty_clear_prefix_list (vty
, AFI_IP
, argv
[idx_word
]->arg
, argv
[idx_ipv4_prefixlen
]->arg
);
2132 DEFUN (ipv6_prefix_list
,
2133 ipv6_prefix_list_cmd
,
2134 "ipv6 prefix-list WORD <deny|permit> <X:X::X:X/M|any>",
2137 "Name of a prefix list\n"
2138 "Specify packets to reject\n"
2139 "Specify packets to forward\n"
2140 "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n"
2141 "Any prefix match. Same as \"::0/0 le 128\"\n")
2144 int idx_permit_deny
= 3;
2145 int idx_ipv6_any
= 4;
2146 return vty_prefix_list_install (vty
, AFI_IP6
, argv
[idx_word
]->arg
, NULL
,
2147 argv
[idx_permit_deny
]->arg
, argv
[idx_ipv6_any
]->arg
, NULL
, NULL
);
2150 DEFUN (ipv6_prefix_list_ge
,
2151 ipv6_prefix_list_ge_cmd
,
2152 "ipv6 prefix-list WORD <deny|permit> X:X::X:X/M ge (0-128)",
2155 "Name of a prefix list\n"
2156 "Specify packets to reject\n"
2157 "Specify packets to forward\n"
2158 "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n"
2159 "Minimum prefix length to be matched\n"
2160 "Minimum prefix length\n")
2163 int idx_permit_deny
= 3;
2164 int idx_ipv6_prefixlen
= 4;
2166 return vty_prefix_list_install (vty
, AFI_IP6
, argv
[idx_word
]->arg
, NULL
, argv
[idx_permit_deny
]->arg
,
2167 argv
[idx_ipv6_prefixlen
]->arg
, argv
[idx_number
]->arg
, NULL
);
2170 DEFUN (ipv6_prefix_list_ge_le
,
2171 ipv6_prefix_list_ge_le_cmd
,
2172 "ipv6 prefix-list WORD <deny|permit> X:X::X:X/M ge (0-128) le (0-128)",
2175 "Name of a prefix list\n"
2176 "Specify packets to reject\n"
2177 "Specify packets to forward\n"
2178 "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n"
2179 "Minimum prefix length to be matched\n"
2180 "Minimum prefix length\n"
2181 "Maximum prefix length to be matched\n"
2182 "Maximum prefix length\n")
2186 int idx_permit_deny
= 3;
2187 int idx_ipv6_prefixlen
= 4;
2189 int idx_number_2
= 8;
2190 return vty_prefix_list_install (vty
, AFI_IP6
, argv
[idx_word
]->arg
, NULL
, argv
[idx_permit_deny
]->arg
,
2191 argv
[idx_ipv6_prefixlen
]->arg
, argv
[idx_number
]->arg
, argv
[idx_number_2
]->arg
);
2194 DEFUN (ipv6_prefix_list_le
,
2195 ipv6_prefix_list_le_cmd
,
2196 "ipv6 prefix-list WORD <deny|permit> X:X::X:X/M le (0-128)",
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 "Maximum prefix length to be matched\n"
2204 "Maximum prefix length\n")
2207 int idx_permit_deny
= 3;
2208 int idx_ipv6_prefixlen
= 4;
2210 return vty_prefix_list_install (vty
, AFI_IP6
, argv
[idx_word
]->arg
, NULL
, argv
[idx_permit_deny
]->arg
,
2211 argv
[idx_ipv6_prefixlen
]->arg
, NULL
, argv
[idx_number
]->arg
);
2214 DEFUN (ipv6_prefix_list_le_ge
,
2215 ipv6_prefix_list_le_ge_cmd
,
2216 "ipv6 prefix-list WORD <deny|permit> X:X::X:X/M le (0-128) ge (0-128)",
2219 "Name of a prefix list\n"
2220 "Specify packets to reject\n"
2221 "Specify packets to forward\n"
2222 "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n"
2223 "Maximum prefix length to be matched\n"
2224 "Maximum prefix length\n"
2225 "Minimum prefix length to be matched\n"
2226 "Minimum prefix length\n")
2229 int idx_permit_deny
= 3;
2230 int idx_ipv6_prefixlen
= 4;
2232 int idx_number_2
= 8;
2233 return vty_prefix_list_install (vty
, AFI_IP6
, argv
[idx_word
]->arg
, NULL
, argv
[idx_permit_deny
]->arg
,
2234 argv
[idx_ipv6_prefixlen
]->arg
, argv
[idx_number_2
]->arg
, argv
[idx_number
]->arg
);
2237 DEFUN (ipv6_prefix_list_seq
,
2238 ipv6_prefix_list_seq_cmd
,
2239 "ipv6 prefix-list WORD seq (1-4294967295) <deny|permit> <X:X::X:X/M|any>",
2242 "Name of a prefix list\n"
2243 "sequence number of an entry\n"
2245 "Specify packets to reject\n"
2246 "Specify packets to forward\n"
2247 "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n"
2248 "Any prefix match. Same as \"::0/0 le 128\"\n")
2252 int idx_permit_deny
= 5;
2253 int idx_ipv6_any
= 6;
2254 return vty_prefix_list_install (vty
, AFI_IP6
, argv
[idx_word
]->arg
, argv
[idx_number
]->arg
, argv
[idx_permit_deny
]->arg
,
2255 argv
[idx_ipv6_any
]->arg
, NULL
, NULL
);
2258 DEFUN (ipv6_prefix_list_seq_ge
,
2259 ipv6_prefix_list_seq_ge_cmd
,
2260 "ipv6 prefix-list WORD seq (1-4294967295) <deny|permit> X:X::X:X/M ge (0-128)",
2263 "Name of a prefix list\n"
2264 "sequence number of an entry\n"
2266 "Specify packets to reject\n"
2267 "Specify packets to forward\n"
2268 "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n"
2269 "Minimum prefix length to be matched\n"
2270 "Minimum prefix length\n")
2274 int idx_permit_deny
= 5;
2275 int idx_ipv6_prefixlen
= 6;
2276 int idx_number_2
= 8;
2277 return vty_prefix_list_install (vty
, AFI_IP6
, argv
[idx_word
]->arg
, argv
[idx_number
]->arg
, argv
[idx_permit_deny
]->arg
,
2278 argv
[idx_ipv6_prefixlen
]->arg
, argv
[idx_number_2
]->arg
, NULL
);
2281 DEFUN (ipv6_prefix_list_seq_ge_le
,
2282 ipv6_prefix_list_seq_ge_le_cmd
,
2283 "ipv6 prefix-list WORD seq (1-4294967295) <deny|permit> X:X::X:X/M ge (0-128) le (0-128)",
2286 "Name of a prefix list\n"
2287 "sequence number of an entry\n"
2289 "Specify packets to reject\n"
2290 "Specify packets to forward\n"
2291 "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n"
2292 "Minimum prefix length to be matched\n"
2293 "Minimum prefix length\n"
2294 "Maximum prefix length to be matched\n"
2295 "Maximum prefix length\n")
2299 int idx_permit_deny
= 5;
2300 int idx_ipv6_prefixlen
= 6;
2301 int idx_number_2
= 8;
2302 int idx_number_3
= 10;
2303 return vty_prefix_list_install (vty
, AFI_IP6
, argv
[idx_word
]->arg
, argv
[idx_number
]->arg
, argv
[idx_permit_deny
]->arg
,
2304 argv
[idx_ipv6_prefixlen
]->arg
, argv
[idx_number_2
]->arg
, argv
[idx_number_3
]->arg
);
2307 DEFUN (ipv6_prefix_list_seq_le
,
2308 ipv6_prefix_list_seq_le_cmd
,
2309 "ipv6 prefix-list WORD seq (1-4294967295) <deny|permit> X:X::X:X/M le (0-128)",
2312 "Name of a prefix list\n"
2313 "sequence number of an entry\n"
2315 "Specify packets to reject\n"
2316 "Specify packets to forward\n"
2317 "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n"
2318 "Maximum prefix length to be matched\n"
2319 "Maximum prefix length\n")
2323 int idx_permit_deny
= 5;
2324 int idx_ipv6_prefixlen
= 6;
2325 int idx_number_2
= 8;
2326 return vty_prefix_list_install (vty
, AFI_IP6
, argv
[idx_word
]->arg
, argv
[idx_number
]->arg
, argv
[idx_permit_deny
]->arg
,
2327 argv
[idx_ipv6_prefixlen
]->arg
, NULL
, argv
[idx_number_2
]->arg
);
2330 DEFUN (ipv6_prefix_list_seq_le_ge
,
2331 ipv6_prefix_list_seq_le_ge_cmd
,
2332 "ipv6 prefix-list WORD seq (1-4294967295) <deny|permit> X:X::X:X/M le (0-128) ge (0-128)",
2335 "Name of a prefix list\n"
2336 "sequence number of an entry\n"
2338 "Specify packets to reject\n"
2339 "Specify packets to forward\n"
2340 "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n"
2341 "Maximum prefix length to be matched\n"
2342 "Maximum prefix length\n"
2343 "Minimum prefix length to be matched\n"
2344 "Minimum prefix length\n")
2348 int idx_permit_deny
= 5;
2349 int idx_ipv6_prefixlen
= 6;
2350 int idx_number_2
= 8;
2351 int idx_number_3
= 10;
2352 return vty_prefix_list_install (vty
, AFI_IP6
, argv
[idx_word
]->arg
, argv
[idx_number
]->arg
, argv
[idx_permit_deny
]->arg
,
2353 argv
[idx_ipv6_prefixlen
]->arg
, argv
[idx_number_3
]->arg
, argv
[idx_number_2
]->arg
);
2356 DEFUN (no_ipv6_prefix_list
,
2357 no_ipv6_prefix_list_cmd
,
2358 "no ipv6 prefix-list WORD",
2362 "Name of a prefix list\n")
2365 return vty_prefix_list_uninstall (vty
, AFI_IP6
, argv
[idx_word
]->arg
, NULL
, NULL
,
2369 DEFUN (no_ipv6_prefix_list_prefix
,
2370 no_ipv6_prefix_list_prefix_cmd
,
2371 "no ipv6 prefix-list WORD <deny|permit> <X:X::X:X/M|any>",
2375 "Name of a prefix list\n"
2376 "Specify packets to reject\n"
2377 "Specify packets to forward\n"
2378 "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n"
2379 "Any prefix match. Same as \"::0/0 le 128\"\n")
2382 int idx_permit_deny
= 4;
2383 int idx_ipv6_any
= 5;
2384 return vty_prefix_list_uninstall (vty
, AFI_IP6
, argv
[idx_word
]->arg
, NULL
, argv
[idx_permit_deny
]->arg
,
2385 argv
[idx_ipv6_any
]->arg
, NULL
, NULL
);
2388 DEFUN (no_ipv6_prefix_list_ge
,
2389 no_ipv6_prefix_list_ge_cmd
,
2390 "no ipv6 prefix-list WORD <deny|permit> X:X::X:X/M ge (0-128)",
2394 "Name of a prefix list\n"
2395 "Specify packets to reject\n"
2396 "Specify packets to forward\n"
2397 "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n"
2398 "Minimum prefix length to be matched\n"
2399 "Minimum prefix length\n")
2402 int idx_permit_deny
= 4;
2403 int idx_ipv6_prefixlen
= 5;
2405 return vty_prefix_list_uninstall (vty
, AFI_IP6
, argv
[idx_word
]->arg
, NULL
, argv
[idx_permit_deny
]->arg
,
2406 argv
[idx_ipv6_prefixlen
]->arg
, argv
[idx_number
]->arg
, NULL
);
2409 DEFUN (no_ipv6_prefix_list_ge_le
,
2410 no_ipv6_prefix_list_ge_le_cmd
,
2411 "no ipv6 prefix-list WORD <deny|permit> X:X::X:X/M ge (0-128) le (0-128)",
2415 "Name of a prefix list\n"
2416 "Specify packets to reject\n"
2417 "Specify packets to forward\n"
2418 "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n"
2419 "Minimum prefix length to be matched\n"
2420 "Minimum prefix length\n"
2421 "Maximum prefix length to be matched\n"
2422 "Maximum prefix length\n")
2425 int idx_permit_deny
= 4;
2426 int idx_ipv6_prefixlen
= 5;
2428 int idx_number_2
= 9;
2429 return vty_prefix_list_uninstall (vty
, AFI_IP6
, argv
[idx_word
]->arg
, NULL
, argv
[idx_permit_deny
]->arg
,
2430 argv
[idx_ipv6_prefixlen
]->arg
, argv
[idx_number
]->arg
, argv
[idx_number_2
]->arg
);
2433 DEFUN (no_ipv6_prefix_list_le
,
2434 no_ipv6_prefix_list_le_cmd
,
2435 "no ipv6 prefix-list WORD <deny|permit> X:X::X:X/M le (0-128)",
2439 "Name of a prefix list\n"
2440 "Specify packets to reject\n"
2441 "Specify packets to forward\n"
2442 "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n"
2443 "Maximum prefix length to be matched\n"
2444 "Maximum prefix length\n")
2447 int idx_permit_deny
= 4;
2448 int idx_ipv6_prefixlen
= 5;
2450 return vty_prefix_list_uninstall (vty
, AFI_IP6
, argv
[idx_word
]->arg
, NULL
, argv
[idx_permit_deny
]->arg
,
2451 argv
[idx_ipv6_prefixlen
]->arg
, NULL
, argv
[idx_number
]->arg
);
2454 DEFUN (no_ipv6_prefix_list_le_ge
,
2455 no_ipv6_prefix_list_le_ge_cmd
,
2456 "no ipv6 prefix-list WORD <deny|permit> X:X::X:X/M le (0-128) ge (0-128)",
2460 "Name of a prefix list\n"
2461 "Specify packets to reject\n"
2462 "Specify packets to forward\n"
2463 "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n"
2464 "Maximum prefix length to be matched\n"
2465 "Maximum prefix length\n"
2466 "Minimum prefix length to be matched\n"
2467 "Minimum prefix length\n")
2470 int idx_permit_deny
= 4;
2471 int idx_ipv6_prefixlen
= 5;
2473 int idx_number_2
= 9;
2474 return vty_prefix_list_uninstall (vty
, AFI_IP6
, argv
[idx_word
]->arg
, NULL
, argv
[idx_permit_deny
]->arg
,
2475 argv
[idx_ipv6_prefixlen
]->arg
, argv
[idx_number_2
]->arg
, argv
[idx_number
]->arg
);
2478 DEFUN (no_ipv6_prefix_list_seq
,
2479 no_ipv6_prefix_list_seq_cmd
,
2480 "no ipv6 prefix-list WORD seq (1-4294967295) <deny|permit> <X:X::X:X/M|any>",
2484 "Name of a prefix list\n"
2485 "sequence number of an entry\n"
2487 "Specify packets to reject\n"
2488 "Specify packets to forward\n"
2489 "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n"
2490 "Any prefix match. Same as \"::0/0 le 128\"\n")
2494 int idx_permit_deny
= 6;
2495 int idx_ipv6_any
= 7;
2496 return vty_prefix_list_uninstall (vty
, AFI_IP6
, argv
[idx_word
]->arg
, argv
[idx_number
]->arg
, argv
[idx_permit_deny
]->arg
,
2497 argv
[idx_ipv6_any
]->arg
, NULL
, NULL
);
2500 DEFUN (no_ipv6_prefix_list_seq_ge
,
2501 no_ipv6_prefix_list_seq_ge_cmd
,
2502 "no ipv6 prefix-list WORD seq (1-4294967295) <deny|permit> X:X::X:X/M ge (0-128)",
2506 "Name of a prefix list\n"
2507 "sequence number of an entry\n"
2509 "Specify packets to reject\n"
2510 "Specify packets to forward\n"
2511 "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n"
2512 "Minimum prefix length to be matched\n"
2513 "Minimum prefix length\n")
2517 int idx_permit_deny
= 6;
2518 int idx_ipv6_prefixlen
= 7;
2519 int idx_number_2
= 9;
2520 return vty_prefix_list_uninstall (vty
, AFI_IP6
, argv
[idx_word
]->arg
, argv
[idx_number
]->arg
, argv
[idx_permit_deny
]->arg
,
2521 argv
[idx_ipv6_prefixlen
]->arg
, argv
[idx_number_2
]->arg
, NULL
);
2524 DEFUN (no_ipv6_prefix_list_seq_ge_le
,
2525 no_ipv6_prefix_list_seq_ge_le_cmd
,
2526 "no ipv6 prefix-list WORD seq (1-4294967295) <deny|permit> X:X::X:X/M ge (0-128) le (0-128)",
2530 "Name of a prefix list\n"
2531 "sequence number of an entry\n"
2533 "Specify packets to reject\n"
2534 "Specify packets to forward\n"
2535 "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n"
2536 "Minimum prefix length to be matched\n"
2537 "Minimum prefix length\n"
2538 "Maximum prefix length to be matched\n"
2539 "Maximum prefix length\n")
2543 int idx_permit_deny
= 6;
2544 int idx_ipv6_prefixlen
= 7;
2545 int idx_number_2
= 9;
2546 int idx_number_3
= 11;
2547 return vty_prefix_list_uninstall (vty
, AFI_IP6
, argv
[idx_word
]->arg
, argv
[idx_number
]->arg
, argv
[idx_permit_deny
]->arg
,
2548 argv
[idx_ipv6_prefixlen
]->arg
, argv
[idx_number_2
]->arg
, argv
[idx_number_3
]->arg
);
2551 DEFUN (no_ipv6_prefix_list_seq_le
,
2552 no_ipv6_prefix_list_seq_le_cmd
,
2553 "no ipv6 prefix-list WORD seq (1-4294967295) <deny|permit> X:X::X:X/M le (0-128)",
2557 "Name of a prefix list\n"
2558 "sequence number of an entry\n"
2560 "Specify packets to reject\n"
2561 "Specify packets to forward\n"
2562 "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n"
2563 "Maximum prefix length to be matched\n"
2564 "Maximum prefix length\n")
2568 int idx_permit_deny
= 6;
2569 int idx_ipv6_prefixlen
= 7;
2570 int idx_number_2
= 9;
2571 return vty_prefix_list_uninstall (vty
, AFI_IP6
, argv
[idx_word
]->arg
, argv
[idx_number
]->arg
, argv
[idx_permit_deny
]->arg
,
2572 argv
[idx_ipv6_prefixlen
]->arg
, NULL
, argv
[idx_number_2
]->arg
);
2575 DEFUN (no_ipv6_prefix_list_seq_le_ge
,
2576 no_ipv6_prefix_list_seq_le_ge_cmd
,
2577 "no ipv6 prefix-list WORD seq (1-4294967295) <deny|permit> X:X::X:X/M le (0-128) ge (0-128)",
2581 "Name of a prefix list\n"
2582 "sequence number of an entry\n"
2584 "Specify packets to reject\n"
2585 "Specify packets to forward\n"
2586 "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n"
2587 "Maximum prefix length to be matched\n"
2588 "Maximum prefix length\n"
2589 "Minimum prefix length to be matched\n"
2590 "Minimum prefix length\n")
2594 int idx_permit_deny
= 6;
2595 int idx_ipv6_prefixlen
= 7;
2596 int idx_number_2
= 9;
2597 int idx_number_3
= 11;
2598 return vty_prefix_list_uninstall (vty
, AFI_IP6
, argv
[idx_word
]->arg
, argv
[idx_number
]->arg
, argv
[idx_permit_deny
]->arg
,
2599 argv
[idx_ipv6_prefixlen
]->arg
, argv
[idx_number_3
]->arg
, argv
[idx_number_2
]->arg
);
2602 DEFUN (ipv6_prefix_list_sequence_number
,
2603 ipv6_prefix_list_sequence_number_cmd
,
2604 "ipv6 prefix-list sequence-number",
2607 "Include/exclude sequence numbers in NVGEN\n")
2609 prefix_master_ipv6
.seqnum
= 1;
2613 DEFUN (no_ipv6_prefix_list_sequence_number
,
2614 no_ipv6_prefix_list_sequence_number_cmd
,
2615 "no ipv6 prefix-list sequence-number",
2619 "Include/exclude sequence numbers in NVGEN\n")
2621 prefix_master_ipv6
.seqnum
= 0;
2625 DEFUN (ipv6_prefix_list_description
,
2626 ipv6_prefix_list_description_cmd
,
2627 "ipv6 prefix-list WORD description LINE...",
2630 "Name of a prefix list\n"
2631 "Prefix-list specific description\n"
2632 "Up to 80 characters describing this prefix-list\n")
2636 struct prefix_list
*plist
;
2638 plist
= prefix_list_get (AFI_IP6
, 0, argv
[idx_word
]->arg
);
2642 XFREE (MTYPE_TMP
, plist
->desc
);
2645 plist
->desc
= argv_concat(argv
, argc
, iddx_line
);
2650 DEFUN (no_ipv6_prefix_list_description
,
2651 no_ipv6_prefix_list_description_cmd
,
2652 "no ipv6 prefix-list WORD description",
2656 "Name of a prefix list\n"
2657 "Prefix-list specific description\n")
2660 return vty_prefix_list_desc_unset (vty
, AFI_IP6
, argv
[idx_word
]->arg
);
2664 DEFUN (no_ipv6_prefix_list_description_comment
,
2665 no_ipv6_prefix_list_description_comment_cmd
,
2666 "no ipv6 prefix-list WORD description LINE...",
2670 "Name of a prefix list\n"
2671 "Prefix-list specific description\n"
2672 "Up to 80 characters describing this prefix-list\n")
2674 return no_ipv6_prefix_list_description (self
, vty
, argc
, argv
);
2678 DEFUN (show_ipv6_prefix_list
,
2679 show_ipv6_prefix_list_cmd
,
2680 "show ipv6 prefix-list",
2685 return vty_show_prefix_list (vty
, AFI_IP6
, NULL
, NULL
, normal_display
);
2688 DEFUN (show_ipv6_prefix_list_name
,
2689 show_ipv6_prefix_list_name_cmd
,
2690 "show ipv6 prefix-list WORD",
2694 "Name of a prefix list\n")
2697 return vty_show_prefix_list (vty
, AFI_IP6
, argv
[idx_word
]->arg
, NULL
, normal_display
);
2700 DEFUN (show_ipv6_prefix_list_name_seq
,
2701 show_ipv6_prefix_list_name_seq_cmd
,
2702 "show ipv6 prefix-list WORD seq (1-4294967295)",
2706 "Name of a prefix list\n"
2707 "sequence number of an entry\n"
2708 "Sequence number\n")
2712 return vty_show_prefix_list (vty
, AFI_IP6
, argv
[idx_word
]->arg
, argv
[idx_number
]->arg
, sequential_display
);
2715 DEFUN (show_ipv6_prefix_list_prefix
,
2716 show_ipv6_prefix_list_prefix_cmd
,
2717 "show ipv6 prefix-list WORD X:X::X:X/M",
2721 "Name of a prefix list\n"
2722 "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n")
2725 int idx_ipv6_prefixlen
= 4;
2726 return vty_show_prefix_list_prefix (vty
, AFI_IP6
, argv
[idx_word
]->arg
, argv
[idx_ipv6_prefixlen
]->arg
, normal_display
);
2729 DEFUN (show_ipv6_prefix_list_prefix_longer
,
2730 show_ipv6_prefix_list_prefix_longer_cmd
,
2731 "show ipv6 prefix-list WORD X:X::X:X/M longer",
2735 "Name of a prefix list\n"
2736 "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n"
2737 "Lookup longer prefix\n")
2740 int idx_ipv6_prefixlen
= 4;
2741 return vty_show_prefix_list_prefix (vty
, AFI_IP6
, argv
[idx_word
]->arg
, argv
[idx_ipv6_prefixlen
]->arg
, longer_display
);
2744 DEFUN (show_ipv6_prefix_list_prefix_first_match
,
2745 show_ipv6_prefix_list_prefix_first_match_cmd
,
2746 "show ipv6 prefix-list WORD X:X::X:X/M first-match",
2750 "Name of a prefix list\n"
2751 "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n"
2752 "First matched prefix\n")
2755 int idx_ipv6_prefixlen
= 4;
2756 return vty_show_prefix_list_prefix (vty
, AFI_IP6
, argv
[idx_word
]->arg
, argv
[idx_ipv6_prefixlen
]->arg
, first_match_display
);
2759 DEFUN (show_ipv6_prefix_list_summary
,
2760 show_ipv6_prefix_list_summary_cmd
,
2761 "show ipv6 prefix-list summary",
2765 "Summary of prefix lists\n")
2767 return vty_show_prefix_list (vty
, AFI_IP6
, NULL
, NULL
, summary_display
);
2770 DEFUN (show_ipv6_prefix_list_summary_name
,
2771 show_ipv6_prefix_list_summary_name_cmd
,
2772 "show ipv6 prefix-list summary WORD",
2776 "Summary of prefix lists\n"
2777 "Name of a prefix list\n")
2780 return vty_show_prefix_list (vty
, AFI_IP6
, argv
[idx_word
]->arg
, NULL
, summary_display
);
2783 DEFUN (show_ipv6_prefix_list_detail
,
2784 show_ipv6_prefix_list_detail_cmd
,
2785 "show ipv6 prefix-list detail",
2789 "Detail of prefix lists\n")
2791 return vty_show_prefix_list (vty
, AFI_IP6
, NULL
, NULL
, detail_display
);
2794 DEFUN (show_ipv6_prefix_list_detail_name
,
2795 show_ipv6_prefix_list_detail_name_cmd
,
2796 "show ipv6 prefix-list detail WORD",
2800 "Detail of prefix lists\n"
2801 "Name of a prefix list\n")
2804 return vty_show_prefix_list (vty
, AFI_IP6
, argv
[idx_word
]->arg
, NULL
, detail_display
);
2807 DEFUN (clear_ipv6_prefix_list
,
2808 clear_ipv6_prefix_list_cmd
,
2809 "clear ipv6 prefix-list",
2814 return vty_clear_prefix_list (vty
, AFI_IP6
, NULL
, NULL
);
2817 DEFUN (clear_ipv6_prefix_list_name
,
2818 clear_ipv6_prefix_list_name_cmd
,
2819 "clear ipv6 prefix-list WORD",
2823 "Name of a prefix list\n")
2826 return vty_clear_prefix_list (vty
, AFI_IP6
, argv
[idx_word
]->arg
, NULL
);
2829 DEFUN (clear_ipv6_prefix_list_name_prefix
,
2830 clear_ipv6_prefix_list_name_prefix_cmd
,
2831 "clear ipv6 prefix-list WORD X:X::X:X/M",
2835 "Name of a prefix list\n"
2836 "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n")
2839 int idx_ipv6_prefixlen
= 4;
2840 return vty_clear_prefix_list (vty
, AFI_IP6
, argv
[idx_word
]->arg
, argv
[idx_ipv6_prefixlen
]->arg
);
2842 #endif /* HAVE_IPV6 */
2844 /* Configuration write function. */
2846 config_write_prefix_afi (afi_t afi
, struct vty
*vty
)
2848 struct prefix_list
*plist
;
2849 struct prefix_list_entry
*pentry
;
2850 struct prefix_master
*master
;
2853 master
= prefix_master_get (afi
, 0);
2857 if (! master
->seqnum
)
2859 vty_out (vty
, "no ip%s prefix-list sequence-number%s",
2860 afi
== AFI_IP
? "" : "v6", VTY_NEWLINE
);
2861 vty_out (vty
, "!%s", VTY_NEWLINE
);
2864 for (plist
= master
->num
.head
; plist
; plist
= plist
->next
)
2868 vty_out (vty
, "ip%s prefix-list %s description %s%s",
2869 afi
== AFI_IP
? "" : "v6",
2870 plist
->name
, plist
->desc
, VTY_NEWLINE
);
2874 for (pentry
= plist
->head
; pentry
; pentry
= pentry
->next
)
2876 vty_out (vty
, "ip%s prefix-list %s ",
2877 afi
== AFI_IP
? "" : "v6",
2881 vty_out (vty
, "seq %u ", pentry
->seq
);
2883 vty_out (vty
, "%s ", prefix_list_type_str (pentry
));
2886 vty_out (vty
, "any");
2889 struct prefix
*p
= &pentry
->prefix
;
2892 vty_out (vty
, "%s/%d",
2893 inet_ntop (p
->family
, &p
->u
.prefix
, buf
, BUFSIZ
),
2897 vty_out (vty
, " ge %d", pentry
->ge
);
2899 vty_out (vty
, " le %d", pentry
->le
);
2901 vty_out (vty
, "%s", VTY_NEWLINE
);
2904 /* vty_out (vty, "!%s", VTY_NEWLINE); */
2907 for (plist
= master
->str
.head
; plist
; plist
= plist
->next
)
2911 vty_out (vty
, "ip%s prefix-list %s description %s%s",
2912 afi
== AFI_IP
? "" : "v6",
2913 plist
->name
, plist
->desc
, VTY_NEWLINE
);
2917 for (pentry
= plist
->head
; pentry
; pentry
= pentry
->next
)
2919 vty_out (vty
, "ip%s prefix-list %s ",
2920 afi
== AFI_IP
? "" : "v6",
2924 vty_out (vty
, "seq %u ", pentry
->seq
);
2926 vty_out (vty
, "%s", prefix_list_type_str (pentry
));
2929 vty_out (vty
, " any");
2932 struct prefix
*p
= &pentry
->prefix
;
2935 vty_out (vty
, " %s/%d",
2936 inet_ntop (p
->family
, &p
->u
.prefix
, buf
, BUFSIZ
),
2940 vty_out (vty
, " ge %d", pentry
->ge
);
2942 vty_out (vty
, " le %d", pentry
->le
);
2944 vty_out (vty
, "%s", VTY_NEWLINE
);
2953 prefix_bgp_orf_entry (struct stream
*s
, struct prefix_list
*plist
,
2954 u_char init_flag
, u_char permit_flag
, u_char deny_flag
)
2956 struct prefix_list_entry
*pentry
;
2961 for (pentry
= plist
->head
; pentry
; pentry
= pentry
->next
)
2963 u_char flag
= init_flag
;
2964 struct prefix
*p
= &pentry
->prefix
;
2966 flag
|= (pentry
->type
== PREFIX_PERMIT
?
2967 permit_flag
: deny_flag
);
2968 stream_putc (s
, flag
);
2969 stream_putl (s
, (u_int32_t
)pentry
->seq
);
2970 stream_putc (s
, (u_char
)pentry
->ge
);
2971 stream_putc (s
, (u_char
)pentry
->le
);
2972 stream_put_prefix (s
, p
);
2979 prefix_bgp_orf_set (char *name
, afi_t afi
, struct orf_prefix
*orfp
,
2980 int permit
, int set
)
2982 struct prefix_list
*plist
;
2983 struct prefix_list_entry
*pentry
;
2985 /* ge and le value check */
2986 if (orfp
->ge
&& orfp
->ge
<= orfp
->p
.prefixlen
)
2988 if (orfp
->le
&& orfp
->le
<= orfp
->p
.prefixlen
)
2990 if (orfp
->le
&& orfp
->ge
> orfp
->le
)
2993 if (orfp
->ge
&& orfp
->le
== (afi
== AFI_IP
? 32 : 128))
2996 plist
= prefix_list_get (afi
, 1, name
);
3002 pentry
= prefix_list_entry_make (&orfp
->p
,
3003 (permit
? PREFIX_PERMIT
: PREFIX_DENY
),
3004 orfp
->seq
, orfp
->le
, orfp
->ge
, 0);
3006 if (prefix_entry_dup_check (plist
, pentry
))
3008 prefix_list_entry_free (pentry
);
3012 prefix_list_entry_add (plist
, pentry
);
3016 pentry
= prefix_list_entry_lookup (plist
, &orfp
->p
,
3017 (permit
? PREFIX_PERMIT
: PREFIX_DENY
),
3018 orfp
->seq
, orfp
->le
, orfp
->ge
);
3023 prefix_list_entry_delete (plist
, pentry
, 1);
3030 prefix_bgp_orf_remove_all (afi_t afi
, char *name
)
3032 struct prefix_list
*plist
;
3034 plist
= prefix_bgp_orf_lookup (afi
, name
);
3036 prefix_list_delete (plist
);
3039 /* return prefix count */
3041 prefix_bgp_show_prefix_list (struct vty
*vty
, afi_t afi
, char *name
, u_char use_json
)
3043 struct prefix_list
*plist
;
3044 struct prefix_list_entry
*pentry
;
3045 json_object
*json
= NULL
;
3046 json_object
*json_prefix
= NULL
;
3047 json_object
*json_list
= NULL
;
3049 plist
= prefix_bgp_orf_lookup (afi
, name
);
3054 return plist
->count
;
3058 json
= json_object_new_object();
3059 json_prefix
= json_object_new_object();
3060 json_list
= json_object_new_object();
3062 json_object_int_add(json_prefix
, "prefixListCounter", plist
->count
);
3063 json_object_string_add(json_prefix
, "prefixListName", plist
->name
);
3065 for (pentry
= plist
->head
; pentry
; pentry
= pentry
->next
)
3067 struct prefix
*p
= &pentry
->prefix
;
3071 sprintf(buf_a
, "%s/%d", inet_ntop (p
->family
, &p
->u
.prefix
, buf_b
, BUFSIZ
),
3074 json_object_int_add(json_list
, "seq", pentry
->seq
);
3075 json_object_string_add(json_list
, "seqPrefixListType", prefix_list_type_str (pentry
));
3078 json_object_int_add(json_list
, "ge", pentry
->ge
);
3080 json_object_int_add(json_list
, "le", pentry
->le
);
3082 json_object_object_add(json_prefix
, buf_a
, json_list
);
3085 json_object_object_add(json
, "ipPrefixList", json_prefix
);
3087 json_object_object_add(json
, "ipv6PrefixList", json_prefix
);
3089 vty_out (vty
, "%s%s", json_object_to_json_string_ext(json
, JSON_C_TO_STRING_PRETTY
), VTY_NEWLINE
);
3090 json_object_free(json
);
3094 vty_out (vty
, "ip%s prefix-list %s: %d entries%s",
3095 afi
== AFI_IP
? "" : "v6",
3096 plist
->name
, plist
->count
, VTY_NEWLINE
);
3098 for (pentry
= plist
->head
; pentry
; pentry
= pentry
->next
)
3100 struct prefix
*p
= &pentry
->prefix
;
3103 vty_out (vty
, " seq %u %s %s/%d", pentry
->seq
,
3104 prefix_list_type_str (pentry
),
3105 inet_ntop (p
->family
, &p
->u
.prefix
, buf
, BUFSIZ
),
3109 vty_out (vty
, " ge %d", pentry
->ge
);
3111 vty_out (vty
, " le %d", pentry
->le
);
3113 vty_out (vty
, "%s", VTY_NEWLINE
);
3116 return plist
->count
;
3120 prefix_list_reset_afi (afi_t afi
, int orf
)
3122 struct prefix_list
*plist
;
3123 struct prefix_list
*next
;
3124 struct prefix_master
*master
;
3126 master
= prefix_master_get (afi
, orf
);
3130 for (plist
= master
->num
.head
; plist
; plist
= next
)
3133 prefix_list_delete (plist
);
3135 for (plist
= master
->str
.head
; plist
; plist
= next
)
3138 prefix_list_delete (plist
);
3141 assert (master
->num
.head
== NULL
);
3142 assert (master
->num
.tail
== NULL
);
3144 assert (master
->str
.head
== NULL
);
3145 assert (master
->str
.tail
== NULL
);
3148 master
->recent
= NULL
;
3152 /* Prefix-list node. */
3153 static struct cmd_node prefix_node
=
3156 "", /* Prefix list has no interface. */
3161 config_write_prefix_ipv4 (struct vty
*vty
)
3163 return config_write_prefix_afi (AFI_IP
, vty
);
3167 prefix_list_init_ipv4 (void)
3169 install_node (&prefix_node
, config_write_prefix_ipv4
);
3171 install_element (CONFIG_NODE
, &ip_prefix_list_cmd
);
3172 install_element (CONFIG_NODE
, &ip_prefix_list_ge_cmd
);
3173 install_element (CONFIG_NODE
, &ip_prefix_list_ge_le_cmd
);
3174 install_element (CONFIG_NODE
, &ip_prefix_list_le_cmd
);
3175 install_element (CONFIG_NODE
, &ip_prefix_list_le_ge_cmd
);
3176 install_element (CONFIG_NODE
, &ip_prefix_list_seq_cmd
);
3177 install_element (CONFIG_NODE
, &ip_prefix_list_seq_ge_cmd
);
3178 install_element (CONFIG_NODE
, &ip_prefix_list_seq_ge_le_cmd
);
3179 install_element (CONFIG_NODE
, &ip_prefix_list_seq_le_cmd
);
3180 install_element (CONFIG_NODE
, &ip_prefix_list_seq_le_ge_cmd
);
3182 install_element (CONFIG_NODE
, &no_ip_prefix_list_cmd
);
3183 install_element (CONFIG_NODE
, &no_ip_prefix_list_prefix_cmd
);
3184 install_element (CONFIG_NODE
, &no_ip_prefix_list_ge_cmd
);
3185 install_element (CONFIG_NODE
, &no_ip_prefix_list_ge_le_cmd
);
3186 install_element (CONFIG_NODE
, &no_ip_prefix_list_le_cmd
);
3187 install_element (CONFIG_NODE
, &no_ip_prefix_list_le_ge_cmd
);
3188 install_element (CONFIG_NODE
, &no_ip_prefix_list_seq_cmd
);
3189 install_element (CONFIG_NODE
, &no_ip_prefix_list_seq_ge_cmd
);
3190 install_element (CONFIG_NODE
, &no_ip_prefix_list_seq_ge_le_cmd
);
3191 install_element (CONFIG_NODE
, &no_ip_prefix_list_seq_le_cmd
);
3192 install_element (CONFIG_NODE
, &no_ip_prefix_list_seq_le_ge_cmd
);
3194 install_element (CONFIG_NODE
, &ip_prefix_list_description_cmd
);
3195 install_element (CONFIG_NODE
, &no_ip_prefix_list_description_cmd
);
3196 install_element (CONFIG_NODE
, &no_ip_prefix_list_description_comment_cmd
);
3198 install_element (CONFIG_NODE
, &ip_prefix_list_sequence_number_cmd
);
3199 install_element (CONFIG_NODE
, &no_ip_prefix_list_sequence_number_cmd
);
3201 install_element (VIEW_NODE
, &show_ip_prefix_list_cmd
);
3202 install_element (VIEW_NODE
, &show_ip_prefix_list_name_cmd
);
3203 install_element (VIEW_NODE
, &show_ip_prefix_list_name_seq_cmd
);
3204 install_element (VIEW_NODE
, &show_ip_prefix_list_prefix_cmd
);
3205 install_element (VIEW_NODE
, &show_ip_prefix_list_prefix_longer_cmd
);
3206 install_element (VIEW_NODE
, &show_ip_prefix_list_prefix_first_match_cmd
);
3207 install_element (VIEW_NODE
, &show_ip_prefix_list_summary_cmd
);
3208 install_element (VIEW_NODE
, &show_ip_prefix_list_summary_name_cmd
);
3209 install_element (VIEW_NODE
, &show_ip_prefix_list_detail_cmd
);
3210 install_element (VIEW_NODE
, &show_ip_prefix_list_detail_name_cmd
);
3212 install_element (ENABLE_NODE
, &clear_ip_prefix_list_cmd
);
3213 install_element (ENABLE_NODE
, &clear_ip_prefix_list_name_cmd
);
3214 install_element (ENABLE_NODE
, &clear_ip_prefix_list_name_prefix_cmd
);
3218 /* Prefix-list node. */
3219 static struct cmd_node prefix_ipv6_node
=
3222 "", /* Prefix list has no interface. */
3227 config_write_prefix_ipv6 (struct vty
*vty
)
3229 return config_write_prefix_afi (AFI_IP6
, vty
);
3233 prefix_list_init_ipv6 (void)
3235 install_node (&prefix_ipv6_node
, config_write_prefix_ipv6
);
3237 install_element (CONFIG_NODE
, &ipv6_prefix_list_cmd
);
3238 install_element (CONFIG_NODE
, &ipv6_prefix_list_ge_cmd
);
3239 install_element (CONFIG_NODE
, &ipv6_prefix_list_ge_le_cmd
);
3240 install_element (CONFIG_NODE
, &ipv6_prefix_list_le_cmd
);
3241 install_element (CONFIG_NODE
, &ipv6_prefix_list_le_ge_cmd
);
3242 install_element (CONFIG_NODE
, &ipv6_prefix_list_seq_cmd
);
3243 install_element (CONFIG_NODE
, &ipv6_prefix_list_seq_ge_cmd
);
3244 install_element (CONFIG_NODE
, &ipv6_prefix_list_seq_ge_le_cmd
);
3245 install_element (CONFIG_NODE
, &ipv6_prefix_list_seq_le_cmd
);
3246 install_element (CONFIG_NODE
, &ipv6_prefix_list_seq_le_ge_cmd
);
3248 install_element (CONFIG_NODE
, &no_ipv6_prefix_list_cmd
);
3249 install_element (CONFIG_NODE
, &no_ipv6_prefix_list_prefix_cmd
);
3250 install_element (CONFIG_NODE
, &no_ipv6_prefix_list_ge_cmd
);
3251 install_element (CONFIG_NODE
, &no_ipv6_prefix_list_ge_le_cmd
);
3252 install_element (CONFIG_NODE
, &no_ipv6_prefix_list_le_cmd
);
3253 install_element (CONFIG_NODE
, &no_ipv6_prefix_list_le_ge_cmd
);
3254 install_element (CONFIG_NODE
, &no_ipv6_prefix_list_seq_cmd
);
3255 install_element (CONFIG_NODE
, &no_ipv6_prefix_list_seq_ge_cmd
);
3256 install_element (CONFIG_NODE
, &no_ipv6_prefix_list_seq_ge_le_cmd
);
3257 install_element (CONFIG_NODE
, &no_ipv6_prefix_list_seq_le_cmd
);
3258 install_element (CONFIG_NODE
, &no_ipv6_prefix_list_seq_le_ge_cmd
);
3260 install_element (CONFIG_NODE
, &ipv6_prefix_list_description_cmd
);
3261 install_element (CONFIG_NODE
, &no_ipv6_prefix_list_description_cmd
);
3262 install_element (CONFIG_NODE
, &no_ipv6_prefix_list_description_comment_cmd
);
3264 install_element (CONFIG_NODE
, &ipv6_prefix_list_sequence_number_cmd
);
3265 install_element (CONFIG_NODE
, &no_ipv6_prefix_list_sequence_number_cmd
);
3267 install_element (VIEW_NODE
, &show_ipv6_prefix_list_cmd
);
3268 install_element (VIEW_NODE
, &show_ipv6_prefix_list_name_cmd
);
3269 install_element (VIEW_NODE
, &show_ipv6_prefix_list_name_seq_cmd
);
3270 install_element (VIEW_NODE
, &show_ipv6_prefix_list_prefix_cmd
);
3271 install_element (VIEW_NODE
, &show_ipv6_prefix_list_prefix_longer_cmd
);
3272 install_element (VIEW_NODE
, &show_ipv6_prefix_list_prefix_first_match_cmd
);
3273 install_element (VIEW_NODE
, &show_ipv6_prefix_list_summary_cmd
);
3274 install_element (VIEW_NODE
, &show_ipv6_prefix_list_summary_name_cmd
);
3275 install_element (VIEW_NODE
, &show_ipv6_prefix_list_detail_cmd
);
3276 install_element (VIEW_NODE
, &show_ipv6_prefix_list_detail_name_cmd
);
3278 install_element (ENABLE_NODE
, &clear_ipv6_prefix_list_cmd
);
3279 install_element (ENABLE_NODE
, &clear_ipv6_prefix_list_name_cmd
);
3280 install_element (ENABLE_NODE
, &clear_ipv6_prefix_list_name_prefix_cmd
);
3282 #endif /* HAVE_IPV6 */
3287 prefix_list_init_ipv4 ();
3289 prefix_list_init_ipv6 ();
3290 #endif /* HAVE_IPV6 */
3294 prefix_list_reset ()
3296 prefix_list_reset_afi (AFI_IP
, 0);
3297 prefix_list_reset_afi (AFI_IP6
, 0);
3298 prefix_list_reset_afi (AFI_IP
, 1);
3299 prefix_list_reset_afi (AFI_IP6
, 1);