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"
34 #include "plist_int.h"
36 DEFINE_MTYPE_STATIC(LIB
, PREFIX_LIST
, "Prefix List")
37 DEFINE_MTYPE_STATIC(LIB
, MPREFIX_LIST_STR
, "Prefix List Str")
38 DEFINE_MTYPE_STATIC(LIB
, PREFIX_LIST_ENTRY
, "Prefix List Entry")
39 DEFINE_MTYPE_STATIC(LIB
, PREFIX_LIST_TRIE
, "Prefix List Trie Table")
41 /* not currently changeable, code assumes bytes further down */
43 #define PLC_LEN (1 << PLC_BITS)
44 #define PLC_MAXLEVELV4 2 /* /24 for IPv4 */
45 #define PLC_MAXLEVELV6 4 /* /48 for IPv6 */
46 #define PLC_MAXLEVEL 4 /* max(v4,v6) */
50 struct pltrie_table
*next_table
;
51 struct prefix_list_entry
*final_chain
;
54 struct prefix_list_entry
*up_chain
;
58 struct pltrie_entry entries
[PLC_LEN
];
61 /* List of struct prefix_list. */
62 struct prefix_list_list
64 struct prefix_list
*head
;
65 struct prefix_list
*tail
;
68 /* Master structure of prefix_list. */
71 /* List of prefix_list which name is number. */
72 struct prefix_list_list num
;
74 /* List of prefix_list which name is string. */
75 struct prefix_list_list str
;
77 /* Whether sequential number is used. */
80 /* The latest update. */
81 struct prefix_list
*recent
;
83 /* Hook function which is executed when new prefix_list is added. */
84 void (*add_hook
) (struct prefix_list
*);
86 /* Hook function which is executed when prefix_list is deleted. */
87 void (*delete_hook
) (struct prefix_list
*);
89 /* number of bytes that have a trie level */
93 /* Static structure of IPv4 prefix_list's master. */
94 static struct prefix_master prefix_master_ipv4
=
105 /* Static structure of IPv6 prefix-list's master. */
106 static struct prefix_master prefix_master_ipv6
=
117 /* Static structure of BGP ORF prefix_list's master. */
118 static struct prefix_master prefix_master_orf_v4
=
129 /* Static structure of BGP ORF prefix_list's master. */
130 static struct prefix_master prefix_master_orf_v6
=
141 static struct prefix_master
*
142 prefix_master_get (afi_t afi
, int orf
)
145 return orf
? &prefix_master_orf_v4
: &prefix_master_ipv4
;
147 return orf
? &prefix_master_orf_v6
: &prefix_master_ipv6
;
151 const char *prefix_list_name (struct prefix_list
*plist
)
156 /* Lookup prefix_list from list of prefix_list by name. */
157 static struct prefix_list
*
158 prefix_list_lookup_do (afi_t afi
, int orf
, const char *name
)
160 struct prefix_list
*plist
;
161 struct prefix_master
*master
;
166 master
= prefix_master_get (afi
, orf
);
170 for (plist
= master
->num
.head
; plist
; plist
= plist
->next
)
171 if (strcmp (plist
->name
, name
) == 0)
174 for (plist
= master
->str
.head
; plist
; plist
= plist
->next
)
175 if (strcmp (plist
->name
, name
) == 0)
182 prefix_list_lookup (afi_t afi
, const char *name
)
184 return prefix_list_lookup_do (afi
, 0, name
);
188 prefix_bgp_orf_lookup (afi_t afi
, const char *name
)
190 return prefix_list_lookup_do (afi
, 1, name
);
193 static struct prefix_list
*
194 prefix_list_new (void)
196 struct prefix_list
*new;
198 new = XCALLOC (MTYPE_PREFIX_LIST
, sizeof (struct prefix_list
));
203 prefix_list_free (struct prefix_list
*plist
)
205 XFREE (MTYPE_PREFIX_LIST
, plist
);
208 static struct prefix_list_entry
*
209 prefix_list_entry_new (void)
211 struct prefix_list_entry
*new;
213 new = XCALLOC (MTYPE_PREFIX_LIST_ENTRY
, sizeof (struct prefix_list_entry
));
218 prefix_list_entry_free (struct prefix_list_entry
*pentry
)
220 XFREE (MTYPE_PREFIX_LIST_ENTRY
, pentry
);
223 /* Insert new prefix list to list of prefix_list. Each prefix_list
224 is sorted by the name. */
225 static struct prefix_list
*
226 prefix_list_insert (afi_t afi
, int orf
, const char *name
)
230 struct prefix_list
*plist
;
231 struct prefix_list
*point
;
232 struct prefix_list_list
*list
;
233 struct prefix_master
*master
;
235 master
= prefix_master_get (afi
, orf
);
239 /* Allocate new prefix_list and copy given name. */
240 plist
= prefix_list_new ();
241 plist
->name
= XSTRDUP (MTYPE_MPREFIX_LIST_STR
, name
);
242 plist
->master
= master
;
243 plist
->trie
= XCALLOC (MTYPE_PREFIX_LIST_TRIE
, sizeof (struct pltrie_table
));
245 /* If name is made by all digit character. We treat it as
247 for (number
= 0, i
= 0; i
< strlen (name
); i
++)
249 if (isdigit ((int) name
[i
]))
250 number
= (number
* 10) + (name
[i
] - '0');
255 /* In case of name is all digit character */
256 if (i
== strlen (name
))
258 plist
->type
= PREFIX_TYPE_NUMBER
;
260 /* Set prefix_list to number list. */
263 for (point
= list
->head
; point
; point
= point
->next
)
264 if (atol (point
->name
) >= number
)
269 plist
->type
= PREFIX_TYPE_STRING
;
271 /* Set prefix_list to string list. */
274 /* Set point to insertion point. */
275 for (point
= list
->head
; point
; point
= point
->next
)
276 if (strcmp (point
->name
, name
) >= 0)
280 /* In case of this is the first element of master. */
281 if (list
->head
== NULL
)
283 list
->head
= list
->tail
= plist
;
287 /* In case of insertion is made at the tail of access_list. */
290 plist
->prev
= list
->tail
;
291 list
->tail
->next
= plist
;
296 /* In case of insertion is made at the head of access_list. */
297 if (point
== list
->head
)
299 plist
->next
= list
->head
;
300 list
->head
->prev
= plist
;
305 /* Insertion is made at middle of the access_list. */
307 plist
->prev
= point
->prev
;
310 point
->prev
->next
= plist
;
316 static struct prefix_list
*
317 prefix_list_get (afi_t afi
, int orf
, const char *name
)
319 struct prefix_list
*plist
;
321 plist
= prefix_list_lookup_do (afi
, orf
, name
);
324 plist
= prefix_list_insert (afi
, orf
, name
);
328 static void prefix_list_trie_del (struct prefix_list
*plist
,
329 struct prefix_list_entry
*pentry
);
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_trie_del (plist
, pentry
);
345 prefix_list_entry_free (pentry
);
349 master
= plist
->master
;
351 if (plist
->type
== PREFIX_TYPE_NUMBER
)
357 plist
->next
->prev
= plist
->prev
;
359 list
->tail
= plist
->prev
;
362 plist
->prev
->next
= plist
->next
;
364 list
->head
= plist
->next
;
367 XFREE (MTYPE_TMP
, plist
->desc
);
369 /* Make sure master's recent changed prefix-list information is
371 master
->recent
= NULL
;
373 route_map_notify_dependencies(plist
->name
, RMAP_EVENT_PLIST_DELETED
);
375 if (master
->delete_hook
)
376 (*master
->delete_hook
) (plist
);
379 XFREE (MTYPE_MPREFIX_LIST_STR
, plist
->name
);
381 XFREE (MTYPE_PREFIX_LIST_TRIE
, plist
->trie
);
383 prefix_list_free (plist
);
387 static struct prefix_list_entry
*
388 prefix_list_entry_make (struct prefix
*prefix
, enum prefix_list_type type
,
389 int seq
, int le
, int ge
, int any
)
391 struct prefix_list_entry
*pentry
;
393 pentry
= prefix_list_entry_new ();
398 prefix_copy (&pentry
->prefix
, prefix
);
407 /* Add hook function. */
409 prefix_list_add_hook (void (*func
) (struct prefix_list
*plist
))
411 prefix_master_ipv4
.add_hook
= func
;
412 prefix_master_ipv6
.add_hook
= func
;
415 /* Delete hook function. */
417 prefix_list_delete_hook (void (*func
) (struct prefix_list
*plist
))
419 prefix_master_ipv4
.delete_hook
= func
;
420 prefix_master_ipv6
.delete_hook
= func
;
423 /* Calculate new sequential number. */
425 prefix_new_seq_get (struct prefix_list
*plist
)
429 struct prefix_list_entry
*pentry
;
433 for (pentry
= plist
->head
; pentry
; pentry
= pentry
->next
)
435 if (maxseq
< pentry
->seq
)
436 maxseq
= pentry
->seq
;
439 newseq
= ((maxseq
/ 5) * 5) + 5;
444 /* Return prefix list entry which has same seq number. */
445 static struct prefix_list_entry
*
446 prefix_seq_check (struct prefix_list
*plist
, int seq
)
448 struct prefix_list_entry
*pentry
;
450 for (pentry
= plist
->head
; pentry
; pentry
= pentry
->next
)
451 if (pentry
->seq
== seq
)
456 static struct prefix_list_entry
*
457 prefix_list_entry_lookup (struct prefix_list
*plist
, struct prefix
*prefix
,
458 enum prefix_list_type type
, int seq
, int le
, int ge
)
460 struct prefix_list_entry
*pentry
;
462 for (pentry
= plist
->head
; pentry
; pentry
= pentry
->next
)
463 if (prefix_same (&pentry
->prefix
, prefix
) && pentry
->type
== type
)
465 if (seq
>= 0 && pentry
->seq
!= seq
)
468 if (pentry
->le
!= le
)
470 if (pentry
->ge
!= ge
)
480 trie_walk_affected (size_t validbits
, struct pltrie_table
*table
, uint8_t byte
,
481 struct prefix_list_entry
*object
,
482 void (*fn
)(struct prefix_list_entry
*object
,
483 struct prefix_list_entry
**updptr
))
488 if (validbits
> PLC_BITS
)
490 fn (object
, &table
->entries
[byte
].final_chain
);
494 mask
= (1 << (8 - validbits
)) - 1;
495 for (bwalk
= byte
& ~mask
; bwalk
<= byte
+ mask
; bwalk
++)
497 fn (object
, &table
->entries
[bwalk
].up_chain
);
501 static void trie_uninstall_fn (struct prefix_list_entry
*object
,
502 struct prefix_list_entry
**updptr
)
504 for (; *updptr
; updptr
= &(*updptr
)->next_best
)
505 if (*updptr
== object
)
507 *updptr
= object
->next_best
;
513 trie_table_empty (struct pltrie_table
*table
)
516 for (i
= 0; i
< PLC_LEN
; i
++)
517 if (table
->entries
[i
].next_table
|| table
->entries
[i
].up_chain
)
523 prefix_list_trie_del (struct prefix_list
*plist
,
524 struct prefix_list_entry
*pentry
)
526 size_t depth
, maxdepth
= plist
->master
->trie_depth
;
527 uint8_t *bytes
= &pentry
->prefix
.u
.prefix
;
528 size_t validbits
= pentry
->prefix
.prefixlen
;
529 struct pltrie_table
*table
, **tables
[PLC_MAXLEVEL
];
532 for (depth
= 0; validbits
> PLC_BITS
&& depth
< maxdepth
- 1; depth
++)
534 uint8_t byte
= bytes
[depth
];
535 assert (table
->entries
[byte
].next_table
);
537 tables
[depth
+ 1] = &table
->entries
[byte
].next_table
;
538 table
= table
->entries
[byte
].next_table
;
540 validbits
-= PLC_BITS
;
543 trie_walk_affected (validbits
, table
, bytes
[depth
], pentry
, trie_uninstall_fn
);
545 for (; depth
> 0; depth
--)
546 if (trie_table_empty (*tables
[depth
]))
548 XFREE (MTYPE_PREFIX_LIST_TRIE
, *tables
[depth
]);
549 *tables
[depth
] = NULL
;
555 prefix_list_entry_delete (struct prefix_list
*plist
,
556 struct prefix_list_entry
*pentry
,
559 if (plist
== NULL
|| pentry
== NULL
)
562 prefix_list_trie_del (plist
, pentry
);
565 pentry
->prev
->next
= pentry
->next
;
567 plist
->head
= pentry
->next
;
569 pentry
->next
->prev
= pentry
->prev
;
571 plist
->tail
= pentry
->prev
;
573 prefix_list_entry_free (pentry
);
579 route_map_notify_dependencies(plist
->name
, RMAP_EVENT_PLIST_DELETED
);
580 if (plist
->master
->delete_hook
)
581 (*plist
->master
->delete_hook
) (plist
);
583 if (plist
->head
== NULL
&& plist
->tail
== NULL
&& plist
->desc
== NULL
)
584 prefix_list_delete (plist
);
586 plist
->master
->recent
= plist
;
590 static void trie_install_fn (struct prefix_list_entry
*object
,
591 struct prefix_list_entry
**updptr
)
595 if (*updptr
== object
)
597 if ((*updptr
)->prefix
.prefixlen
< object
->prefix
.prefixlen
)
599 if ((*updptr
)->seq
> object
->seq
)
601 updptr
= &(*updptr
)->next_best
;
604 if (!object
->next_best
)
605 object
->next_best
= *updptr
;
607 assert (object
->next_best
== *updptr
|| !*updptr
);
613 prefix_list_trie_add (struct prefix_list
*plist
,
614 struct prefix_list_entry
*pentry
)
616 size_t depth
= plist
->master
->trie_depth
;
617 uint8_t *bytes
= &pentry
->prefix
.u
.prefix
;
618 size_t validbits
= pentry
->prefix
.prefixlen
;
619 struct pltrie_table
*table
;
622 while (validbits
> PLC_BITS
&& depth
> 1)
624 if (!table
->entries
[*bytes
].next_table
)
625 table
->entries
[*bytes
].next_table
= XCALLOC (MTYPE_PREFIX_LIST_TRIE
,
626 sizeof(struct pltrie_table
));
627 table
= table
->entries
[*bytes
].next_table
;
630 validbits
-= PLC_BITS
;
633 trie_walk_affected (validbits
, table
, *bytes
, pentry
, trie_install_fn
);
637 prefix_list_entry_add (struct prefix_list
*plist
,
638 struct prefix_list_entry
*pentry
)
640 struct prefix_list_entry
*replace
;
641 struct prefix_list_entry
*point
;
643 /* Automatic asignment of seq no. */
644 if (pentry
->seq
== -1)
645 pentry
->seq
= prefix_new_seq_get (plist
);
647 if (plist
->tail
&& pentry
->seq
> plist
->tail
->seq
)
651 /* Is there any same seq prefix list entry? */
652 replace
= prefix_seq_check (plist
, pentry
->seq
);
654 prefix_list_entry_delete (plist
, replace
, 0);
656 /* Check insert point. */
657 for (point
= plist
->head
; point
; point
= point
->next
)
658 if (point
->seq
>= pentry
->seq
)
662 /* In case of this is the first element of the list. */
663 pentry
->next
= point
;
668 point
->prev
->next
= pentry
;
670 plist
->head
= pentry
;
672 pentry
->prev
= point
->prev
;
673 point
->prev
= pentry
;
678 plist
->tail
->next
= pentry
;
680 plist
->head
= pentry
;
682 pentry
->prev
= plist
->tail
;
683 plist
->tail
= pentry
;
686 prefix_list_trie_add (plist
, pentry
);
688 /* Increment count. */
691 /* Run hook function. */
692 if (plist
->master
->add_hook
)
693 (*plist
->master
->add_hook
) (plist
);
695 route_map_notify_dependencies(plist
->name
, RMAP_EVENT_PLIST_ADDED
);
696 plist
->master
->recent
= plist
;
699 /* Return string of prefix_list_type. */
701 prefix_list_type_str (struct prefix_list_entry
*pentry
)
703 switch (pentry
->type
)
715 prefix_list_entry_match (struct prefix_list_entry
*pentry
, struct prefix
*p
)
719 ret
= prefix_match (&pentry
->prefix
, p
);
723 /* In case of le nor ge is specified, exact match is performed. */
724 if (! pentry
->le
&& ! pentry
->ge
)
726 if (pentry
->prefix
.prefixlen
!= p
->prefixlen
)
732 if (p
->prefixlen
> pentry
->le
)
736 if (p
->prefixlen
< pentry
->ge
)
742 enum prefix_list_type
743 prefix_list_apply (struct prefix_list
*plist
, void *object
)
745 struct prefix_list_entry
*pentry
, *pbest
= NULL
;
747 struct prefix
*p
= (struct prefix
*) object
;
748 uint8_t *byte
= &p
->u
.prefix
;
750 size_t validbits
= p
->prefixlen
;
751 struct pltrie_table
*table
;
756 if (plist
->count
== 0)
757 return PREFIX_PERMIT
;
759 depth
= plist
->master
->trie_depth
;
763 for (pentry
= table
->entries
[*byte
].up_chain
; pentry
; pentry
= pentry
->next_best
)
765 if (pbest
&& pbest
->seq
< pentry
->seq
)
767 if (prefix_list_entry_match (pentry
, p
))
771 if (validbits
<= PLC_BITS
)
773 validbits
-= PLC_BITS
;
777 if (!table
->entries
[*byte
].next_table
)
780 table
= table
->entries
[*byte
].next_table
;
785 for (pentry
= table
->entries
[*byte
].final_chain
; pentry
; pentry
= pentry
->next_best
)
787 if (pbest
&& pbest
->seq
< pentry
->seq
)
789 if (prefix_list_entry_match (pentry
, p
))
801 static void __attribute__ ((unused
))
802 prefix_list_print (struct prefix_list
*plist
)
804 struct prefix_list_entry
*pentry
;
809 printf ("ip prefix-list %s: %d entries\n", plist
->name
, plist
->count
);
811 for (pentry
= plist
->head
; pentry
; pentry
= pentry
->next
)
814 printf ("any %s\n", prefix_list_type_str (pentry
));
822 printf (" seq %u %s %s/%d",
824 prefix_list_type_str (pentry
),
825 inet_ntop (p
->family
, &p
->u
.prefix
, buf
, BUFSIZ
),
828 printf (" ge %d", pentry
->ge
);
830 printf (" le %d", pentry
->le
);
836 /* Retrun 1 when plist already include pentry policy. */
837 static struct prefix_list_entry
*
838 prefix_entry_dup_check (struct prefix_list
*plist
,
839 struct prefix_list_entry
*new)
841 size_t depth
, maxdepth
= plist
->master
->trie_depth
;
842 uint8_t byte
, *bytes
= &new->prefix
.u
.prefix
;
843 size_t validbits
= new->prefix
.prefixlen
;
844 struct pltrie_table
*table
;
845 struct prefix_list_entry
*pentry
;
849 seq
= prefix_new_seq_get (plist
);
854 for (depth
= 0; validbits
> PLC_BITS
&& depth
< maxdepth
- 1; depth
++)
857 if (!table
->entries
[byte
].next_table
)
860 table
= table
->entries
[byte
].next_table
;
861 validbits
-= PLC_BITS
;
865 if (validbits
> PLC_BITS
)
866 pentry
= table
->entries
[byte
].final_chain
;
868 pentry
= table
->entries
[byte
].up_chain
;
870 for (; pentry
; pentry
= pentry
->next_best
)
872 if (prefix_same (&pentry
->prefix
, &new->prefix
)
873 && pentry
->type
== new->type
874 && pentry
->le
== new->le
875 && pentry
->ge
== new->ge
876 && pentry
->seq
!= seq
)
883 vty_invalid_prefix_range (struct vty
*vty
, const char *prefix
)
885 vty_out (vty
, "%% Invalid prefix range for %s, make sure: len < ge-value <= le-value%s",
886 prefix
, VTY_NEWLINE
);
891 vty_prefix_list_install (struct vty
*vty
, afi_t afi
, const char *name
,
892 const char *seq
, const char *typestr
,
893 const char *prefix
, const char *ge
, const char *le
)
896 enum prefix_list_type type
;
897 struct prefix_list
*plist
;
898 struct prefix_list_entry
*pentry
;
899 struct prefix_list_entry
*dup
;
900 struct prefix p
, p_tmp
;
906 /* Sequential number. */
910 /* ge and le number */
916 /* Check filter type. */
917 if (strncmp ("permit", typestr
, 1) == 0)
918 type
= PREFIX_PERMIT
;
919 else if (strncmp ("deny", typestr
, 1) == 0)
923 vty_out (vty
, "%% prefix type must be permit or deny%s", VTY_NEWLINE
);
927 /* "any" is special token for matching any IPv4 addresses. */
931 if (strncmp ("any", prefix
, strlen (prefix
)) == 0)
933 ret
= str2prefix_ipv4 ("0.0.0.0/0", (struct prefix_ipv4
*) &p
);
935 lenum
= IPV4_MAX_BITLEN
;
939 ret
= str2prefix_ipv4 (prefix
, (struct prefix_ipv4
*) &p
);
943 vty_out (vty
, "%% Malformed IPv4 prefix%s", VTY_NEWLINE
);
947 /* make a copy to verify prefix matches mask length */
948 prefix_copy (&p_tmp
, &p
);
949 apply_mask_ipv4 ((struct prefix_ipv4
*) &p_tmp
);
953 if (strncmp ("any", prefix
, strlen (prefix
)) == 0)
955 ret
= str2prefix_ipv6 ("::/0", (struct prefix_ipv6
*) &p
);
957 lenum
= IPV6_MAX_BITLEN
;
961 ret
= str2prefix_ipv6 (prefix
, (struct prefix_ipv6
*) &p
);
965 vty_out (vty
, "%% Malformed IPv6 prefix%s", VTY_NEWLINE
);
969 /* make a copy to verify prefix matches mask length */
970 prefix_copy (&p_tmp
, &p
);
971 apply_mask_ipv6 ((struct prefix_ipv6
*) &p_tmp
);
976 vty_out (vty
, "%% Unrecognized AFI (%d)%s", afi
, VTY_NEWLINE
);
981 /* If prefix has bits not under the mask, adjust it to fit */
982 if (!prefix_same (&p_tmp
, &p
))
984 char buf
[PREFIX2STR_BUFFER
];
985 char buf_tmp
[PREFIX2STR_BUFFER
];
986 prefix2str(&p
, buf
, sizeof(buf
));
987 prefix2str(&p_tmp
, buf_tmp
, sizeof(buf_tmp
));
988 zlog_warn ("Prefix-list %s prefix changed from %s to %s to match length",
993 /* ge and le check. */
994 if (genum
&& (genum
<= p
.prefixlen
))
995 return vty_invalid_prefix_range (vty
, prefix
);
997 if (lenum
&& (lenum
<= p
.prefixlen
))
998 return vty_invalid_prefix_range (vty
, prefix
);
1000 if (lenum
&& (genum
> lenum
))
1001 return vty_invalid_prefix_range (vty
, prefix
);
1003 if (genum
&& (lenum
== (afi
== AFI_IP
? 32 : 128)))
1006 /* Get prefix_list with name. */
1007 plist
= prefix_list_get (afi
, 0, name
);
1009 /* Make prefix entry. */
1010 pentry
= prefix_list_entry_make (&p
, type
, seqnum
, lenum
, genum
, any
);
1012 /* Check same policy. */
1013 dup
= prefix_entry_dup_check (plist
, pentry
);
1017 prefix_list_entry_free (pentry
);
1021 /* Install new filter to the access_list. */
1022 prefix_list_entry_add (plist
, pentry
);
1028 vty_prefix_list_uninstall (struct vty
*vty
, afi_t afi
, const char *name
,
1029 const char *seq
, const char *typestr
,
1030 const char *prefix
, const char *ge
, const char *le
)
1033 enum prefix_list_type type
;
1034 struct prefix_list
*plist
;
1035 struct prefix_list_entry
*pentry
;
1041 /* Check prefix list name. */
1042 plist
= prefix_list_lookup (afi
, name
);
1045 vty_out (vty
, "%% Can't find specified prefix-list%s", VTY_NEWLINE
);
1049 /* Only prefix-list name specified, delete the entire prefix-list. */
1050 if (seq
== NULL
&& typestr
== NULL
&& prefix
== NULL
&&
1051 ge
== NULL
&& le
== NULL
)
1053 prefix_list_delete (plist
);
1057 /* We must have, at a minimum, both the type and prefix here */
1058 if ((typestr
== NULL
) || (prefix
== NULL
))
1060 vty_out (vty
, "%% Both prefix and type required%s", VTY_NEWLINE
);
1064 /* Check sequence number. */
1066 seqnum
= atoi (seq
);
1068 /* ge and le number */
1074 /* Check of filter type. */
1075 if (strncmp ("permit", typestr
, 1) == 0)
1076 type
= PREFIX_PERMIT
;
1077 else if (strncmp ("deny", typestr
, 1) == 0)
1081 vty_out (vty
, "%% prefix type must be permit or deny%s", VTY_NEWLINE
);
1085 /* "any" is special token for matching any IPv4 addresses. */
1088 if (strncmp ("any", prefix
, strlen (prefix
)) == 0)
1090 ret
= str2prefix_ipv4 ("0.0.0.0/0", (struct prefix_ipv4
*) &p
);
1092 lenum
= IPV4_MAX_BITLEN
;
1095 ret
= str2prefix_ipv4 (prefix
, (struct prefix_ipv4
*) &p
);
1099 vty_out (vty
, "%% Malformed IPv4 prefix%s", VTY_NEWLINE
);
1103 else if (afi
== AFI_IP6
)
1105 if (strncmp ("any", prefix
, strlen (prefix
)) == 0)
1107 ret
= str2prefix_ipv6 ("::/0", (struct prefix_ipv6
*) &p
);
1109 lenum
= IPV6_MAX_BITLEN
;
1112 ret
= str2prefix_ipv6 (prefix
, (struct prefix_ipv6
*) &p
);
1116 vty_out (vty
, "%% Malformed IPv6 prefix%s", VTY_NEWLINE
);
1121 /* Lookup prefix entry. */
1122 pentry
= prefix_list_entry_lookup(plist
, &p
, type
, seqnum
, lenum
, genum
);
1126 vty_out (vty
, "%% Can't find specified prefix-list%s", VTY_NEWLINE
);
1130 /* Install new filter to the access_list. */
1131 prefix_list_entry_delete (plist
, pentry
, 1);
1137 vty_prefix_list_desc_unset (struct vty
*vty
, afi_t afi
, const char *name
)
1139 struct prefix_list
*plist
;
1141 plist
= prefix_list_lookup (afi
, name
);
1144 vty_out (vty
, "%% Can't find specified prefix-list%s", VTY_NEWLINE
);
1150 XFREE (MTYPE_TMP
, plist
->desc
);
1154 if (plist
->head
== NULL
&& plist
->tail
== NULL
&& plist
->desc
== NULL
)
1155 prefix_list_delete (plist
);
1171 vty_show_prefix_entry (struct vty
*vty
, afi_t afi
, struct prefix_list
*plist
,
1172 struct prefix_master
*master
, enum display_type dtype
,
1175 struct prefix_list_entry
*pentry
;
1177 /* Print the name of the protocol */
1178 vty_out(vty
, "%s: ", zlog_protoname());
1180 if (dtype
== normal_display
)
1182 vty_out (vty
, "ip%s prefix-list %s: %d entries%s",
1183 afi
== AFI_IP
? "" : "v6",
1184 plist
->name
, plist
->count
, VTY_NEWLINE
);
1186 vty_out (vty
, " Description: %s%s", plist
->desc
, VTY_NEWLINE
);
1188 else if (dtype
== summary_display
|| dtype
== detail_display
)
1190 vty_out (vty
, "ip%s prefix-list %s:%s",
1191 afi
== AFI_IP
? "" : "v6", plist
->name
, VTY_NEWLINE
);
1194 vty_out (vty
, " Description: %s%s", plist
->desc
, VTY_NEWLINE
);
1196 vty_out (vty
, " count: %d, range entries: %d, sequences: %u - %u%s",
1197 plist
->count
, plist
->rangecount
,
1198 plist
->head
? plist
->head
->seq
: 0,
1199 plist
->tail
? plist
->tail
->seq
: 0,
1203 if (dtype
!= summary_display
)
1205 for (pentry
= plist
->head
; pentry
; pentry
= pentry
->next
)
1207 if (dtype
== sequential_display
&& pentry
->seq
!= seqnum
)
1213 vty_out (vty
, "seq %u ", pentry
->seq
);
1215 vty_out (vty
, "%s ", prefix_list_type_str (pentry
));
1218 vty_out (vty
, "any");
1221 struct prefix
*p
= &pentry
->prefix
;
1224 vty_out (vty
, "%s/%d",
1225 inet_ntop (p
->family
, &p
->u
.prefix
, buf
, BUFSIZ
),
1229 vty_out (vty
, " ge %d", pentry
->ge
);
1231 vty_out (vty
, " le %d", pentry
->le
);
1234 if (dtype
== detail_display
|| dtype
== sequential_display
)
1235 vty_out (vty
, " (hit count: %ld, refcount: %ld)",
1236 pentry
->hitcnt
, pentry
->refcnt
);
1238 vty_out (vty
, "%s", VTY_NEWLINE
);
1244 vty_show_prefix_list (struct vty
*vty
, afi_t afi
, const char *name
,
1245 const char *seq
, enum display_type dtype
)
1247 struct prefix_list
*plist
;
1248 struct prefix_master
*master
;
1251 master
= prefix_master_get (afi
, 0);
1256 seqnum
= atoi (seq
);
1260 plist
= prefix_list_lookup (afi
, name
);
1263 vty_out (vty
, "%% Can't find specified prefix-list%s", VTY_NEWLINE
);
1266 vty_show_prefix_entry (vty
, afi
, plist
, master
, dtype
, seqnum
);
1270 if (dtype
== detail_display
|| dtype
== summary_display
)
1273 vty_out (vty
, "Prefix-list with the last deletion/insertion: %s%s",
1274 master
->recent
->name
, VTY_NEWLINE
);
1277 for (plist
= master
->num
.head
; plist
; plist
= plist
->next
)
1278 vty_show_prefix_entry (vty
, afi
, plist
, master
, dtype
, seqnum
);
1280 for (plist
= master
->str
.head
; plist
; plist
= plist
->next
)
1281 vty_show_prefix_entry (vty
, afi
, plist
, master
, dtype
, seqnum
);
1288 vty_show_prefix_list_prefix (struct vty
*vty
, afi_t afi
, const char *name
,
1289 const char *prefix
, enum display_type type
)
1291 struct prefix_list
*plist
;
1292 struct prefix_list_entry
*pentry
;
1297 plist
= prefix_list_lookup (afi
, name
);
1300 vty_out (vty
, "%% Can't find specified prefix-list%s", VTY_NEWLINE
);
1304 ret
= str2prefix (prefix
, &p
);
1307 vty_out (vty
, "%% prefix is malformed%s", VTY_NEWLINE
);
1311 for (pentry
= plist
->head
; pentry
; pentry
= pentry
->next
)
1315 if (type
== normal_display
|| type
== first_match_display
)
1316 if (prefix_same (&p
, &pentry
->prefix
))
1319 if (type
== longer_display
)
1320 if (prefix_match (&p
, &pentry
->prefix
))
1325 vty_out (vty
, " seq %u %s ",
1327 prefix_list_type_str (pentry
));
1330 vty_out (vty
, "any");
1333 struct prefix
*p
= &pentry
->prefix
;
1336 vty_out (vty
, "%s/%d",
1337 inet_ntop (p
->family
, &p
->u
.prefix
, buf
, BUFSIZ
),
1341 vty_out (vty
, " ge %d", pentry
->ge
);
1343 vty_out (vty
, " le %d", pentry
->le
);
1346 if (type
== normal_display
|| type
== first_match_display
)
1347 vty_out (vty
, " (hit count: %ld, refcount: %ld)",
1348 pentry
->hitcnt
, pentry
->refcnt
);
1350 vty_out (vty
, "%s", VTY_NEWLINE
);
1352 if (type
== first_match_display
)
1360 vty_clear_prefix_list (struct vty
*vty
, afi_t afi
, const char *name
,
1363 struct prefix_master
*master
;
1364 struct prefix_list
*plist
;
1365 struct prefix_list_entry
*pentry
;
1369 master
= prefix_master_get (afi
, 0);
1373 if (name
== NULL
&& prefix
== NULL
)
1375 for (plist
= master
->num
.head
; plist
; plist
= plist
->next
)
1376 for (pentry
= plist
->head
; pentry
; pentry
= pentry
->next
)
1379 for (plist
= master
->str
.head
; plist
; plist
= plist
->next
)
1380 for (pentry
= plist
->head
; pentry
; pentry
= pentry
->next
)
1385 plist
= prefix_list_lookup (afi
, name
);
1388 vty_out (vty
, "%% Can't find specified prefix-list%s", VTY_NEWLINE
);
1394 ret
= str2prefix (prefix
, &p
);
1397 vty_out (vty
, "%% prefix is malformed%s", VTY_NEWLINE
);
1402 for (pentry
= plist
->head
; pentry
; pentry
= pentry
->next
)
1406 if (prefix_match (&pentry
->prefix
, &p
))
1416 DEFUN (ip_prefix_list
,
1418 "ip prefix-list WORD <deny|permit> <A.B.C.D/M|any>",
1421 "Name of a prefix list\n"
1422 "Specify packets to reject\n"
1423 "Specify packets to forward\n"
1424 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
1425 "Any prefix match. Same as \"0.0.0.0/0 le 32\"\n")
1428 int idx_permit_deny
= 3;
1429 int idx_ipv4_any
= 4;
1430 return vty_prefix_list_install (vty
, AFI_IP
, argv
[idx_word
]->arg
, NULL
,
1431 argv
[idx_permit_deny
]->arg
, argv
[idx_ipv4_any
]->arg
, NULL
, NULL
);
1434 DEFUN (ip_prefix_list_ge
,
1435 ip_prefix_list_ge_cmd
,
1436 "ip prefix-list WORD <deny|permit> A.B.C.D/M ge (0-32)",
1439 "Name of a prefix list\n"
1440 "Specify packets to reject\n"
1441 "Specify packets to forward\n"
1442 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
1443 "Minimum prefix length to be matched\n"
1444 "Minimum prefix length\n")
1447 int idx_permit_deny
= 3;
1448 int idx_ipv4_prefixlen
= 4;
1450 return vty_prefix_list_install (vty
, AFI_IP
, argv
[idx_word
]->arg
, NULL
, argv
[idx_permit_deny
]->arg
,
1451 argv
[idx_ipv4_prefixlen
]->arg
, argv
[idx_number
]->arg
, NULL
);
1454 DEFUN (ip_prefix_list_ge_le
,
1455 ip_prefix_list_ge_le_cmd
,
1456 "ip prefix-list WORD <deny|permit> A.B.C.D/M ge (0-32) le (0-32)",
1459 "Name of a prefix list\n"
1460 "Specify packets to reject\n"
1461 "Specify packets to forward\n"
1462 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
1463 "Minimum prefix length to be matched\n"
1464 "Minimum prefix length\n"
1465 "Maximum prefix length to be matched\n"
1466 "Maximum prefix length\n")
1469 int idx_permit_deny
= 3;
1470 int idx_ipv4_prefixlen
= 4;
1472 int idx_number_2
= 8;
1473 return vty_prefix_list_install (vty
, AFI_IP
, argv
[idx_word
]->arg
, NULL
, argv
[idx_permit_deny
]->arg
,
1474 argv
[idx_ipv4_prefixlen
]->arg
, argv
[idx_number
]->arg
, argv
[idx_number_2
]->arg
);
1477 DEFUN (ip_prefix_list_le
,
1478 ip_prefix_list_le_cmd
,
1479 "ip prefix-list WORD <deny|permit> A.B.C.D/M le (0-32)",
1482 "Name of a prefix list\n"
1483 "Specify packets to reject\n"
1484 "Specify packets to forward\n"
1485 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
1486 "Maximum prefix length to be matched\n"
1487 "Maximum prefix length\n")
1490 int idx_permit_deny
= 3;
1491 int idx_ipv4_prefixlen
= 4;
1493 return vty_prefix_list_install (vty
, AFI_IP
, argv
[idx_word
]->arg
, NULL
, argv
[idx_permit_deny
]->arg
,
1494 argv
[idx_ipv4_prefixlen
]->arg
, NULL
, argv
[idx_number
]->arg
);
1497 DEFUN (ip_prefix_list_le_ge
,
1498 ip_prefix_list_le_ge_cmd
,
1499 "ip prefix-list WORD <deny|permit> A.B.C.D/M le (0-32) ge (0-32)",
1502 "Name of a prefix list\n"
1503 "Specify packets to reject\n"
1504 "Specify packets to forward\n"
1505 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
1506 "Maximum prefix length to be matched\n"
1507 "Maximum prefix length\n"
1508 "Minimum prefix length to be matched\n"
1509 "Minimum prefix length\n")
1512 int idx_permit_deny
= 3;
1513 int idx_ipv4_prefixlen
= 4;
1515 int idx_number_2
= 8;
1516 return vty_prefix_list_install (vty
, AFI_IP
, argv
[idx_word
]->arg
, NULL
, argv
[idx_permit_deny
]->arg
,
1517 argv
[idx_ipv4_prefixlen
]->arg
, argv
[idx_number_2
]->arg
, argv
[idx_number
]->arg
);
1520 DEFUN (ip_prefix_list_seq
,
1521 ip_prefix_list_seq_cmd
,
1522 "ip prefix-list WORD seq (1-4294967295) <deny|permit> <A.B.C.D/M|any>",
1525 "Name of a prefix list\n"
1526 "sequence number of an entry\n"
1528 "Specify packets to reject\n"
1529 "Specify packets to forward\n"
1530 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
1531 "Any prefix match. Same as \"0.0.0.0/0 le 32\"\n")
1535 int idx_permit_deny
= 5;
1536 int idx_ipv4_any
= 6;
1537 return vty_prefix_list_install (vty
, AFI_IP
, argv
[idx_word
]->arg
, argv
[idx_number
]->arg
, argv
[idx_permit_deny
]->arg
,
1538 argv
[idx_ipv4_any
]->arg
, NULL
, NULL
);
1541 DEFUN (ip_prefix_list_seq_ge
,
1542 ip_prefix_list_seq_ge_cmd
,
1543 "ip prefix-list WORD seq (1-4294967295) <deny|permit> A.B.C.D/M ge (0-32)",
1546 "Name of a prefix list\n"
1547 "sequence number of an entry\n"
1549 "Specify packets to reject\n"
1550 "Specify packets to forward\n"
1551 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
1552 "Minimum prefix length to be matched\n"
1553 "Minimum prefix length\n")
1557 int idx_permit_deny
= 5;
1558 int idx_ipv4_prefixlen
= 6;
1559 int idx_number_2
= 8;
1560 return vty_prefix_list_install (vty
, AFI_IP
, argv
[idx_word
]->arg
, argv
[idx_number
]->arg
, argv
[idx_permit_deny
]->arg
,
1561 argv
[idx_ipv4_prefixlen
]->arg
, argv
[idx_number_2
]->arg
, NULL
);
1564 DEFUN (ip_prefix_list_seq_ge_le
,
1565 ip_prefix_list_seq_ge_le_cmd
,
1566 "ip prefix-list WORD seq (1-4294967295) <deny|permit> A.B.C.D/M ge (0-32) le (0-32)",
1569 "Name of a prefix list\n"
1570 "sequence number of an entry\n"
1572 "Specify packets to reject\n"
1573 "Specify packets to forward\n"
1574 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
1575 "Minimum prefix length to be matched\n"
1576 "Minimum prefix length\n"
1577 "Maximum prefix length to be matched\n"
1578 "Maximum prefix length\n")
1582 int idx_permit_deny
= 5;
1583 int idx_ipv4_prefixlen
= 6;
1584 int idx_number_2
= 8;
1585 int idx_number_3
= 10;
1586 return vty_prefix_list_install (vty
, AFI_IP
, argv
[idx_word
]->arg
, argv
[idx_number
]->arg
, argv
[idx_permit_deny
]->arg
,
1587 argv
[idx_ipv4_prefixlen
]->arg
, argv
[idx_number_2
]->arg
, argv
[idx_number_3
]->arg
);
1590 DEFUN (ip_prefix_list_seq_le
,
1591 ip_prefix_list_seq_le_cmd
,
1592 "ip prefix-list WORD seq (1-4294967295) <deny|permit> A.B.C.D/M le (0-32)",
1595 "Name of a prefix list\n"
1596 "sequence number of an entry\n"
1598 "Specify packets to reject\n"
1599 "Specify packets to forward\n"
1600 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
1601 "Maximum prefix length to be matched\n"
1602 "Maximum prefix length\n")
1606 int idx_permit_deny
= 5;
1607 int idx_ipv4_prefixlen
= 6;
1608 int idx_number_2
= 8;
1609 return vty_prefix_list_install (vty
, AFI_IP
, argv
[idx_word
]->arg
, argv
[idx_number
]->arg
, argv
[idx_permit_deny
]->arg
,
1610 argv
[idx_ipv4_prefixlen
]->arg
, NULL
, argv
[idx_number_2
]->arg
);
1613 DEFUN (ip_prefix_list_seq_le_ge
,
1614 ip_prefix_list_seq_le_ge_cmd
,
1615 "ip prefix-list WORD seq (1-4294967295) <deny|permit> A.B.C.D/M le (0-32) ge (0-32)",
1618 "Name of a prefix list\n"
1619 "sequence number of an entry\n"
1621 "Specify packets to reject\n"
1622 "Specify packets to forward\n"
1623 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
1624 "Maximum prefix length to be matched\n"
1625 "Maximum prefix length\n"
1626 "Minimum prefix length to be matched\n"
1627 "Minimum prefix length\n")
1631 int idx_permit_deny
= 5;
1632 int idx_ipv4_prefixlen
= 6;
1633 int idx_number_2
= 8;
1634 int idx_number_3
= 10;
1635 return vty_prefix_list_install (vty
, AFI_IP
, argv
[idx_word
]->arg
, argv
[idx_number
]->arg
, argv
[idx_permit_deny
]->arg
,
1636 argv
[idx_ipv4_prefixlen
]->arg
, argv
[idx_number_3
]->arg
, argv
[idx_number_2
]->arg
);
1639 DEFUN (no_ip_prefix_list
,
1640 no_ip_prefix_list_cmd
,
1641 "no ip prefix-list WORD",
1645 "Name of a prefix list\n")
1648 return vty_prefix_list_uninstall (vty
, AFI_IP
, argv
[idx_word
]->arg
, NULL
, NULL
,
1652 DEFUN (no_ip_prefix_list_prefix
,
1653 no_ip_prefix_list_prefix_cmd
,
1654 "no ip prefix-list WORD <deny|permit> <A.B.C.D/M|any>",
1658 "Name of a prefix list\n"
1659 "Specify packets to reject\n"
1660 "Specify packets to forward\n"
1661 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
1662 "Any prefix match. Same as \"0.0.0.0/0 le 32\"\n")
1665 int idx_permit_deny
= 4;
1666 int idx_ipv4_any
= 5;
1667 return vty_prefix_list_uninstall (vty
, AFI_IP
, argv
[idx_word
]->arg
, NULL
, argv
[idx_permit_deny
]->arg
,
1668 argv
[idx_ipv4_any
]->arg
, NULL
, NULL
);
1671 DEFUN (no_ip_prefix_list_ge
,
1672 no_ip_prefix_list_ge_cmd
,
1673 "no ip prefix-list WORD <deny|permit> A.B.C.D/M ge (0-32)",
1677 "Name of a prefix list\n"
1678 "Specify packets to reject\n"
1679 "Specify packets to forward\n"
1680 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
1681 "Minimum prefix length to be matched\n"
1682 "Minimum prefix length\n")
1685 int idx_permit_deny
= 4;
1686 int idx_ipv4_prefixlen
= 5;
1688 return vty_prefix_list_uninstall (vty
, AFI_IP
, argv
[idx_word
]->arg
, NULL
, argv
[idx_permit_deny
]->arg
,
1689 argv
[idx_ipv4_prefixlen
]->arg
, argv
[idx_number
]->arg
, NULL
);
1692 DEFUN (no_ip_prefix_list_ge_le
,
1693 no_ip_prefix_list_ge_le_cmd
,
1694 "no ip prefix-list WORD <deny|permit> A.B.C.D/M ge (0-32) le (0-32)",
1698 "Name of a prefix list\n"
1699 "Specify packets to reject\n"
1700 "Specify packets to forward\n"
1701 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
1702 "Minimum prefix length to be matched\n"
1703 "Minimum prefix length\n"
1704 "Maximum prefix length to be matched\n"
1705 "Maximum prefix length\n")
1708 int idx_permit_deny
= 4;
1709 int idx_ipv4_prefixlen
= 5;
1711 int idx_number_2
= 9;
1712 return vty_prefix_list_uninstall (vty
, AFI_IP
, argv
[idx_word
]->arg
, NULL
, argv
[idx_permit_deny
]->arg
,
1713 argv
[idx_ipv4_prefixlen
]->arg
, argv
[idx_number
]->arg
, argv
[idx_number_2
]->arg
);
1716 DEFUN (no_ip_prefix_list_le
,
1717 no_ip_prefix_list_le_cmd
,
1718 "no ip prefix-list WORD <deny|permit> A.B.C.D/M le (0-32)",
1722 "Name of a prefix list\n"
1723 "Specify packets to reject\n"
1724 "Specify packets to forward\n"
1725 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
1726 "Maximum prefix length to be matched\n"
1727 "Maximum prefix length\n")
1730 int idx_permit_deny
= 4;
1731 int idx_ipv4_prefixlen
= 5;
1733 return vty_prefix_list_uninstall (vty
, AFI_IP
, argv
[idx_word
]->arg
, NULL
, argv
[idx_permit_deny
]->arg
,
1734 argv
[idx_ipv4_prefixlen
]->arg
, NULL
, argv
[idx_number
]->arg
);
1737 DEFUN (no_ip_prefix_list_le_ge
,
1738 no_ip_prefix_list_le_ge_cmd
,
1739 "no ip prefix-list WORD <deny|permit> A.B.C.D/M le (0-32) ge (0-32)",
1743 "Name of a prefix list\n"
1744 "Specify packets to reject\n"
1745 "Specify packets to forward\n"
1746 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
1747 "Maximum prefix length to be matched\n"
1748 "Maximum prefix length\n"
1749 "Minimum prefix length to be matched\n"
1750 "Minimum prefix length\n")
1753 int idx_permit_deny
= 4;
1754 int idx_ipv4_prefixlen
= 5;
1756 int idx_number_2
= 9;
1757 return vty_prefix_list_uninstall (vty
, AFI_IP
, argv
[idx_word
]->arg
, NULL
, argv
[idx_permit_deny
]->arg
,
1758 argv
[idx_ipv4_prefixlen
]->arg
, argv
[idx_number_2
]->arg
, argv
[idx_number
]->arg
);
1761 DEFUN (no_ip_prefix_list_seq
,
1762 no_ip_prefix_list_seq_cmd
,
1763 "no ip prefix-list WORD seq (1-4294967295) <deny|permit> <A.B.C.D/M|any>",
1767 "Name of a prefix list\n"
1768 "sequence number of an entry\n"
1770 "Specify packets to reject\n"
1771 "Specify packets to forward\n"
1772 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
1773 "Any prefix match. Same as \"0.0.0.0/0 le 32\"\n")
1777 int idx_permit_deny
= 6;
1778 int idx_ipv4_any
= 7;
1779 return vty_prefix_list_uninstall (vty
, AFI_IP
, argv
[idx_word
]->arg
, argv
[idx_number
]->arg
, argv
[idx_permit_deny
]->arg
,
1780 argv
[idx_ipv4_any
]->arg
, NULL
, NULL
);
1783 DEFUN (no_ip_prefix_list_seq_ge
,
1784 no_ip_prefix_list_seq_ge_cmd
,
1785 "no ip prefix-list WORD seq (1-4294967295) <deny|permit> A.B.C.D/M ge (0-32)",
1789 "Name of a prefix list\n"
1790 "sequence number of an entry\n"
1792 "Specify packets to reject\n"
1793 "Specify packets to forward\n"
1794 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
1795 "Minimum prefix length to be matched\n"
1796 "Minimum prefix length\n")
1800 int idx_permit_deny
= 6;
1801 int idx_ipv4_prefixlen
= 7;
1802 int idx_number_2
= 9;
1803 return vty_prefix_list_uninstall (vty
, AFI_IP
, argv
[idx_word
]->arg
, argv
[idx_number
]->arg
, argv
[idx_permit_deny
]->arg
,
1804 argv
[idx_ipv4_prefixlen
]->arg
, argv
[idx_number_2
]->arg
, NULL
);
1807 DEFUN (no_ip_prefix_list_seq_ge_le
,
1808 no_ip_prefix_list_seq_ge_le_cmd
,
1809 "no ip prefix-list WORD seq (1-4294967295) <deny|permit> A.B.C.D/M ge (0-32) le (0-32)",
1813 "Name of a prefix list\n"
1814 "sequence number of an entry\n"
1816 "Specify packets to reject\n"
1817 "Specify packets to forward\n"
1818 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
1819 "Minimum prefix length to be matched\n"
1820 "Minimum prefix length\n"
1821 "Maximum prefix length to be matched\n"
1822 "Maximum prefix length\n")
1826 int idx_permit_deny
= 6;
1827 int idx_ipv4_prefixlen
= 7;
1828 int idx_number_2
= 9;
1829 int idx_number_3
= 11;
1830 return vty_prefix_list_uninstall (vty
, AFI_IP
, argv
[idx_word
]->arg
, argv
[idx_number
]->arg
, argv
[idx_permit_deny
]->arg
,
1831 argv
[idx_ipv4_prefixlen
]->arg
, argv
[idx_number_2
]->arg
, argv
[idx_number_3
]->arg
);
1834 DEFUN (no_ip_prefix_list_seq_le
,
1835 no_ip_prefix_list_seq_le_cmd
,
1836 "no ip prefix-list WORD seq (1-4294967295) <deny|permit> A.B.C.D/M le (0-32)",
1840 "Name of a prefix list\n"
1841 "sequence number of an entry\n"
1843 "Specify packets to reject\n"
1844 "Specify packets to forward\n"
1845 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
1846 "Maximum prefix length to be matched\n"
1847 "Maximum prefix length\n")
1851 int idx_permit_deny
= 6;
1852 int idx_ipv4_prefixlen
= 7;
1853 int idx_number_2
= 9;
1854 return vty_prefix_list_uninstall (vty
, AFI_IP
, argv
[idx_word
]->arg
, argv
[idx_number
]->arg
, argv
[idx_permit_deny
]->arg
,
1855 argv
[idx_ipv4_prefixlen
]->arg
, NULL
, argv
[idx_number_2
]->arg
);
1858 DEFUN (no_ip_prefix_list_seq_le_ge
,
1859 no_ip_prefix_list_seq_le_ge_cmd
,
1860 "no ip prefix-list WORD seq (1-4294967295) <deny|permit> A.B.C.D/M le (0-32) ge (0-32)",
1864 "Name of a prefix list\n"
1865 "sequence number of an entry\n"
1867 "Specify packets to reject\n"
1868 "Specify packets to forward\n"
1869 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
1870 "Maximum prefix length to be matched\n"
1871 "Maximum prefix length\n"
1872 "Minimum prefix length to be matched\n"
1873 "Minimum prefix length\n")
1877 int idx_permit_deny
= 6;
1878 int idx_ipv4_prefixlen
= 7;
1879 int idx_number_2
= 9;
1880 int idx_number_3
= 11;
1881 return vty_prefix_list_uninstall (vty
, AFI_IP
, argv
[idx_word
]->arg
, argv
[idx_number
]->arg
, argv
[idx_permit_deny
]->arg
,
1882 argv
[idx_ipv4_prefixlen
]->arg
, argv
[idx_number_3
]->arg
, argv
[idx_number_2
]->arg
);
1885 DEFUN (ip_prefix_list_sequence_number
,
1886 ip_prefix_list_sequence_number_cmd
,
1887 "ip prefix-list sequence-number",
1890 "Include/exclude sequence numbers in NVGEN\n")
1892 prefix_master_ipv4
.seqnum
= 1;
1896 DEFUN (no_ip_prefix_list_sequence_number
,
1897 no_ip_prefix_list_sequence_number_cmd
,
1898 "no ip prefix-list sequence-number",
1902 "Include/exclude sequence numbers in NVGEN\n")
1904 prefix_master_ipv4
.seqnum
= 0;
1908 DEFUN (ip_prefix_list_description
,
1909 ip_prefix_list_description_cmd
,
1910 "ip prefix-list WORD description LINE...",
1913 "Name of a prefix list\n"
1914 "Prefix-list specific description\n"
1915 "Up to 80 characters describing this prefix-list\n")
1919 struct prefix_list
*plist
;
1921 plist
= prefix_list_get (AFI_IP
, 0, argv
[idx_word
]->arg
);
1925 XFREE (MTYPE_TMP
, plist
->desc
);
1928 plist
->desc
= argv_concat(argv
, argc
, idx_line
);
1933 DEFUN (no_ip_prefix_list_description
,
1934 no_ip_prefix_list_description_cmd
,
1935 "no ip prefix-list WORD description",
1939 "Name of a prefix list\n"
1940 "Prefix-list specific description\n")
1943 return vty_prefix_list_desc_unset (vty
, AFI_IP
, argv
[idx_word
]->arg
);
1947 DEFUN (no_ip_prefix_list_description_comment
,
1948 no_ip_prefix_list_description_comment_cmd
,
1949 "no ip prefix-list WORD description LINE...",
1953 "Name of a prefix list\n"
1954 "Prefix-list specific description\n"
1955 "Up to 80 characters describing this prefix-list\n")
1957 return no_ip_prefix_list_description (self
, vty
, argc
, argv
);
1960 DEFUN (show_ip_prefix_list
,
1961 show_ip_prefix_list_cmd
,
1962 "show ip prefix-list",
1967 return vty_show_prefix_list (vty
, AFI_IP
, NULL
, NULL
, normal_display
);
1970 DEFUN (show_ip_prefix_list_name
,
1971 show_ip_prefix_list_name_cmd
,
1972 "show ip prefix-list WORD",
1976 "Name of a prefix list\n")
1979 return vty_show_prefix_list (vty
, AFI_IP
, argv
[idx_word
]->arg
, NULL
, normal_display
);
1982 DEFUN (show_ip_prefix_list_name_seq
,
1983 show_ip_prefix_list_name_seq_cmd
,
1984 "show ip prefix-list WORD seq (1-4294967295)",
1988 "Name of a prefix list\n"
1989 "sequence number of an entry\n"
1990 "Sequence number\n")
1994 return vty_show_prefix_list (vty
, AFI_IP
, argv
[idx_word
]->arg
, argv
[idx_number
]->arg
, sequential_display
);
1997 DEFUN (show_ip_prefix_list_prefix
,
1998 show_ip_prefix_list_prefix_cmd
,
1999 "show ip prefix-list WORD A.B.C.D/M",
2003 "Name of a prefix list\n"
2004 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n")
2007 int idx_ipv4_prefixlen
= 4;
2008 return vty_show_prefix_list_prefix (vty
, AFI_IP
, argv
[idx_word
]->arg
, argv
[idx_ipv4_prefixlen
]->arg
, normal_display
);
2011 DEFUN (show_ip_prefix_list_prefix_longer
,
2012 show_ip_prefix_list_prefix_longer_cmd
,
2013 "show ip prefix-list WORD A.B.C.D/M longer",
2017 "Name of a prefix list\n"
2018 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
2019 "Lookup longer prefix\n")
2022 int idx_ipv4_prefixlen
= 4;
2023 return vty_show_prefix_list_prefix (vty
, AFI_IP
, argv
[idx_word
]->arg
, argv
[idx_ipv4_prefixlen
]->arg
, longer_display
);
2026 DEFUN (show_ip_prefix_list_prefix_first_match
,
2027 show_ip_prefix_list_prefix_first_match_cmd
,
2028 "show ip prefix-list WORD A.B.C.D/M first-match",
2032 "Name of a prefix list\n"
2033 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
2034 "First matched prefix\n")
2037 int idx_ipv4_prefixlen
= 4;
2038 return vty_show_prefix_list_prefix (vty
, AFI_IP
, argv
[idx_word
]->arg
, argv
[idx_ipv4_prefixlen
]->arg
, first_match_display
);
2041 DEFUN (show_ip_prefix_list_summary
,
2042 show_ip_prefix_list_summary_cmd
,
2043 "show ip prefix-list summary",
2047 "Summary of prefix lists\n")
2049 return vty_show_prefix_list (vty
, AFI_IP
, NULL
, NULL
, summary_display
);
2052 DEFUN (show_ip_prefix_list_summary_name
,
2053 show_ip_prefix_list_summary_name_cmd
,
2054 "show ip prefix-list summary WORD",
2058 "Summary of prefix lists\n"
2059 "Name of a prefix list\n")
2062 return vty_show_prefix_list (vty
, AFI_IP
, argv
[idx_word
]->arg
, NULL
, summary_display
);
2066 DEFUN (show_ip_prefix_list_detail
,
2067 show_ip_prefix_list_detail_cmd
,
2068 "show ip prefix-list detail",
2072 "Detail of prefix lists\n")
2074 return vty_show_prefix_list (vty
, AFI_IP
, NULL
, NULL
, detail_display
);
2077 DEFUN (show_ip_prefix_list_detail_name
,
2078 show_ip_prefix_list_detail_name_cmd
,
2079 "show ip prefix-list detail WORD",
2083 "Detail of prefix lists\n"
2084 "Name of a prefix list\n")
2087 return vty_show_prefix_list (vty
, AFI_IP
, argv
[idx_word
]->arg
, NULL
, detail_display
);
2090 DEFUN (clear_ip_prefix_list
,
2091 clear_ip_prefix_list_cmd
,
2092 "clear ip prefix-list",
2097 return vty_clear_prefix_list (vty
, AFI_IP
, NULL
, NULL
);
2100 DEFUN (clear_ip_prefix_list_name
,
2101 clear_ip_prefix_list_name_cmd
,
2102 "clear ip prefix-list WORD",
2106 "Name of a prefix list\n")
2109 return vty_clear_prefix_list (vty
, AFI_IP
, argv
[idx_word
]->arg
, NULL
);
2112 DEFUN (clear_ip_prefix_list_name_prefix
,
2113 clear_ip_prefix_list_name_prefix_cmd
,
2114 "clear ip prefix-list WORD A.B.C.D/M",
2118 "Name of a prefix list\n"
2119 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n")
2122 int idx_ipv4_prefixlen
= 4;
2123 return vty_clear_prefix_list (vty
, AFI_IP
, argv
[idx_word
]->arg
, argv
[idx_ipv4_prefixlen
]->arg
);
2126 DEFUN (ipv6_prefix_list
,
2127 ipv6_prefix_list_cmd
,
2128 "ipv6 prefix-list WORD <deny|permit> <X:X::X:X/M|any>",
2131 "Name of a prefix list\n"
2132 "Specify packets to reject\n"
2133 "Specify packets to forward\n"
2134 "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n"
2135 "Any prefix match. Same as \"::0/0 le 128\"\n")
2138 int idx_permit_deny
= 3;
2139 int idx_ipv6_any
= 4;
2140 return vty_prefix_list_install (vty
, AFI_IP6
, argv
[idx_word
]->arg
, NULL
,
2141 argv
[idx_permit_deny
]->arg
, argv
[idx_ipv6_any
]->arg
, NULL
, NULL
);
2144 DEFUN (ipv6_prefix_list_ge
,
2145 ipv6_prefix_list_ge_cmd
,
2146 "ipv6 prefix-list WORD <deny|permit> X:X::X:X/M ge (0-128)",
2149 "Name of a prefix list\n"
2150 "Specify packets to reject\n"
2151 "Specify packets to forward\n"
2152 "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n"
2153 "Minimum prefix length to be matched\n"
2154 "Minimum prefix length\n")
2157 int idx_permit_deny
= 3;
2158 int idx_ipv6_prefixlen
= 4;
2160 return vty_prefix_list_install (vty
, AFI_IP6
, argv
[idx_word
]->arg
, NULL
, argv
[idx_permit_deny
]->arg
,
2161 argv
[idx_ipv6_prefixlen
]->arg
, argv
[idx_number
]->arg
, NULL
);
2164 DEFUN (ipv6_prefix_list_ge_le
,
2165 ipv6_prefix_list_ge_le_cmd
,
2166 "ipv6 prefix-list WORD <deny|permit> X:X::X:X/M ge (0-128) le (0-128)",
2169 "Name of a prefix list\n"
2170 "Specify packets to reject\n"
2171 "Specify packets to forward\n"
2172 "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n"
2173 "Minimum prefix length to be matched\n"
2174 "Minimum prefix length\n"
2175 "Maximum prefix length to be matched\n"
2176 "Maximum prefix length\n")
2180 int idx_permit_deny
= 3;
2181 int idx_ipv6_prefixlen
= 4;
2183 int idx_number_2
= 8;
2184 return vty_prefix_list_install (vty
, AFI_IP6
, argv
[idx_word
]->arg
, NULL
, argv
[idx_permit_deny
]->arg
,
2185 argv
[idx_ipv6_prefixlen
]->arg
, argv
[idx_number
]->arg
, argv
[idx_number_2
]->arg
);
2188 DEFUN (ipv6_prefix_list_le
,
2189 ipv6_prefix_list_le_cmd
,
2190 "ipv6 prefix-list WORD <deny|permit> X:X::X:X/M le (0-128)",
2193 "Name of a prefix list\n"
2194 "Specify packets to reject\n"
2195 "Specify packets to forward\n"
2196 "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n"
2197 "Maximum prefix length to be matched\n"
2198 "Maximum prefix length\n")
2201 int idx_permit_deny
= 3;
2202 int idx_ipv6_prefixlen
= 4;
2204 return vty_prefix_list_install (vty
, AFI_IP6
, argv
[idx_word
]->arg
, NULL
, argv
[idx_permit_deny
]->arg
,
2205 argv
[idx_ipv6_prefixlen
]->arg
, NULL
, argv
[idx_number
]->arg
);
2208 DEFUN (ipv6_prefix_list_le_ge
,
2209 ipv6_prefix_list_le_ge_cmd
,
2210 "ipv6 prefix-list WORD <deny|permit> X:X::X:X/M le (0-128) ge (0-128)",
2213 "Name of a prefix list\n"
2214 "Specify packets to reject\n"
2215 "Specify packets to forward\n"
2216 "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n"
2217 "Maximum prefix length to be matched\n"
2218 "Maximum prefix length\n"
2219 "Minimum prefix length to be matched\n"
2220 "Minimum prefix length\n")
2223 int idx_permit_deny
= 3;
2224 int idx_ipv6_prefixlen
= 4;
2226 int idx_number_2
= 8;
2227 return vty_prefix_list_install (vty
, AFI_IP6
, argv
[idx_word
]->arg
, NULL
, argv
[idx_permit_deny
]->arg
,
2228 argv
[idx_ipv6_prefixlen
]->arg
, argv
[idx_number_2
]->arg
, argv
[idx_number
]->arg
);
2231 DEFUN (ipv6_prefix_list_seq
,
2232 ipv6_prefix_list_seq_cmd
,
2233 "ipv6 prefix-list WORD seq (1-4294967295) <deny|permit> <X:X::X:X/M|any>",
2236 "Name of a prefix list\n"
2237 "sequence number of an entry\n"
2239 "Specify packets to reject\n"
2240 "Specify packets to forward\n"
2241 "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n"
2242 "Any prefix match. Same as \"::0/0 le 128\"\n")
2246 int idx_permit_deny
= 5;
2247 int idx_ipv6_any
= 6;
2248 return vty_prefix_list_install (vty
, AFI_IP6
, argv
[idx_word
]->arg
, argv
[idx_number
]->arg
, argv
[idx_permit_deny
]->arg
,
2249 argv
[idx_ipv6_any
]->arg
, NULL
, NULL
);
2252 DEFUN (ipv6_prefix_list_seq_ge
,
2253 ipv6_prefix_list_seq_ge_cmd
,
2254 "ipv6 prefix-list WORD seq (1-4294967295) <deny|permit> X:X::X:X/M ge (0-128)",
2257 "Name of a prefix list\n"
2258 "sequence number of an entry\n"
2260 "Specify packets to reject\n"
2261 "Specify packets to forward\n"
2262 "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n"
2263 "Minimum prefix length to be matched\n"
2264 "Minimum prefix length\n")
2268 int idx_permit_deny
= 5;
2269 int idx_ipv6_prefixlen
= 6;
2270 int idx_number_2
= 8;
2271 return vty_prefix_list_install (vty
, AFI_IP6
, argv
[idx_word
]->arg
, argv
[idx_number
]->arg
, argv
[idx_permit_deny
]->arg
,
2272 argv
[idx_ipv6_prefixlen
]->arg
, argv
[idx_number_2
]->arg
, NULL
);
2275 DEFUN (ipv6_prefix_list_seq_ge_le
,
2276 ipv6_prefix_list_seq_ge_le_cmd
,
2277 "ipv6 prefix-list WORD seq (1-4294967295) <deny|permit> X:X::X:X/M ge (0-128) le (0-128)",
2280 "Name of a prefix list\n"
2281 "sequence number of an entry\n"
2283 "Specify packets to reject\n"
2284 "Specify packets to forward\n"
2285 "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n"
2286 "Minimum prefix length to be matched\n"
2287 "Minimum prefix length\n"
2288 "Maximum prefix length to be matched\n"
2289 "Maximum prefix length\n")
2293 int idx_permit_deny
= 5;
2294 int idx_ipv6_prefixlen
= 6;
2295 int idx_number_2
= 8;
2296 int idx_number_3
= 10;
2297 return vty_prefix_list_install (vty
, AFI_IP6
, argv
[idx_word
]->arg
, argv
[idx_number
]->arg
, argv
[idx_permit_deny
]->arg
,
2298 argv
[idx_ipv6_prefixlen
]->arg
, argv
[idx_number_2
]->arg
, argv
[idx_number_3
]->arg
);
2301 DEFUN (ipv6_prefix_list_seq_le
,
2302 ipv6_prefix_list_seq_le_cmd
,
2303 "ipv6 prefix-list WORD seq (1-4294967295) <deny|permit> X:X::X:X/M le (0-128)",
2306 "Name of a prefix list\n"
2307 "sequence number of an entry\n"
2309 "Specify packets to reject\n"
2310 "Specify packets to forward\n"
2311 "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n"
2312 "Maximum prefix length to be matched\n"
2313 "Maximum prefix length\n")
2317 int idx_permit_deny
= 5;
2318 int idx_ipv6_prefixlen
= 6;
2319 int idx_number_2
= 8;
2320 return vty_prefix_list_install (vty
, AFI_IP6
, argv
[idx_word
]->arg
, argv
[idx_number
]->arg
, argv
[idx_permit_deny
]->arg
,
2321 argv
[idx_ipv6_prefixlen
]->arg
, NULL
, argv
[idx_number_2
]->arg
);
2324 DEFUN (ipv6_prefix_list_seq_le_ge
,
2325 ipv6_prefix_list_seq_le_ge_cmd
,
2326 "ipv6 prefix-list WORD seq (1-4294967295) <deny|permit> X:X::X:X/M le (0-128) ge (0-128)",
2329 "Name of a prefix list\n"
2330 "sequence number of an entry\n"
2332 "Specify packets to reject\n"
2333 "Specify packets to forward\n"
2334 "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n"
2335 "Maximum prefix length to be matched\n"
2336 "Maximum prefix length\n"
2337 "Minimum prefix length to be matched\n"
2338 "Minimum prefix length\n")
2342 int idx_permit_deny
= 5;
2343 int idx_ipv6_prefixlen
= 6;
2344 int idx_number_2
= 8;
2345 int idx_number_3
= 10;
2346 return vty_prefix_list_install (vty
, AFI_IP6
, argv
[idx_word
]->arg
, argv
[idx_number
]->arg
, argv
[idx_permit_deny
]->arg
,
2347 argv
[idx_ipv6_prefixlen
]->arg
, argv
[idx_number_3
]->arg
, argv
[idx_number_2
]->arg
);
2350 DEFUN (no_ipv6_prefix_list
,
2351 no_ipv6_prefix_list_cmd
,
2352 "no ipv6 prefix-list WORD",
2356 "Name of a prefix list\n")
2359 return vty_prefix_list_uninstall (vty
, AFI_IP6
, argv
[idx_word
]->arg
, NULL
, NULL
,
2363 DEFUN (no_ipv6_prefix_list_prefix
,
2364 no_ipv6_prefix_list_prefix_cmd
,
2365 "no ipv6 prefix-list WORD <deny|permit> <X:X::X:X/M|any>",
2369 "Name of a prefix list\n"
2370 "Specify packets to reject\n"
2371 "Specify packets to forward\n"
2372 "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n"
2373 "Any prefix match. Same as \"::0/0 le 128\"\n")
2376 int idx_permit_deny
= 4;
2377 int idx_ipv6_any
= 5;
2378 return vty_prefix_list_uninstall (vty
, AFI_IP6
, argv
[idx_word
]->arg
, NULL
, argv
[idx_permit_deny
]->arg
,
2379 argv
[idx_ipv6_any
]->arg
, NULL
, NULL
);
2382 DEFUN (no_ipv6_prefix_list_ge
,
2383 no_ipv6_prefix_list_ge_cmd
,
2384 "no ipv6 prefix-list WORD <deny|permit> X:X::X:X/M ge (0-128)",
2388 "Name of a prefix list\n"
2389 "Specify packets to reject\n"
2390 "Specify packets to forward\n"
2391 "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n"
2392 "Minimum prefix length to be matched\n"
2393 "Minimum prefix length\n")
2396 int idx_permit_deny
= 4;
2397 int idx_ipv6_prefixlen
= 5;
2399 return vty_prefix_list_uninstall (vty
, AFI_IP6
, argv
[idx_word
]->arg
, NULL
, argv
[idx_permit_deny
]->arg
,
2400 argv
[idx_ipv6_prefixlen
]->arg
, argv
[idx_number
]->arg
, NULL
);
2403 DEFUN (no_ipv6_prefix_list_ge_le
,
2404 no_ipv6_prefix_list_ge_le_cmd
,
2405 "no ipv6 prefix-list WORD <deny|permit> X:X::X:X/M ge (0-128) le (0-128)",
2409 "Name of a prefix list\n"
2410 "Specify packets to reject\n"
2411 "Specify packets to forward\n"
2412 "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n"
2413 "Minimum prefix length to be matched\n"
2414 "Minimum prefix length\n"
2415 "Maximum prefix length to be matched\n"
2416 "Maximum prefix length\n")
2419 int idx_permit_deny
= 4;
2420 int idx_ipv6_prefixlen
= 5;
2422 int idx_number_2
= 9;
2423 return vty_prefix_list_uninstall (vty
, AFI_IP6
, argv
[idx_word
]->arg
, NULL
, argv
[idx_permit_deny
]->arg
,
2424 argv
[idx_ipv6_prefixlen
]->arg
, argv
[idx_number
]->arg
, argv
[idx_number_2
]->arg
);
2427 DEFUN (no_ipv6_prefix_list_le
,
2428 no_ipv6_prefix_list_le_cmd
,
2429 "no ipv6 prefix-list WORD <deny|permit> X:X::X:X/M le (0-128)",
2433 "Name of a prefix list\n"
2434 "Specify packets to reject\n"
2435 "Specify packets to forward\n"
2436 "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n"
2437 "Maximum prefix length to be matched\n"
2438 "Maximum prefix length\n")
2441 int idx_permit_deny
= 4;
2442 int idx_ipv6_prefixlen
= 5;
2444 return vty_prefix_list_uninstall (vty
, AFI_IP6
, argv
[idx_word
]->arg
, NULL
, argv
[idx_permit_deny
]->arg
,
2445 argv
[idx_ipv6_prefixlen
]->arg
, NULL
, argv
[idx_number
]->arg
);
2448 DEFUN (no_ipv6_prefix_list_le_ge
,
2449 no_ipv6_prefix_list_le_ge_cmd
,
2450 "no ipv6 prefix-list WORD <deny|permit> X:X::X:X/M le (0-128) ge (0-128)",
2454 "Name of a prefix list\n"
2455 "Specify packets to reject\n"
2456 "Specify packets to forward\n"
2457 "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n"
2458 "Maximum prefix length to be matched\n"
2459 "Maximum prefix length\n"
2460 "Minimum prefix length to be matched\n"
2461 "Minimum prefix length\n")
2464 int idx_permit_deny
= 4;
2465 int idx_ipv6_prefixlen
= 5;
2467 int idx_number_2
= 9;
2468 return vty_prefix_list_uninstall (vty
, AFI_IP6
, argv
[idx_word
]->arg
, NULL
, argv
[idx_permit_deny
]->arg
,
2469 argv
[idx_ipv6_prefixlen
]->arg
, argv
[idx_number_2
]->arg
, argv
[idx_number
]->arg
);
2472 DEFUN (no_ipv6_prefix_list_seq
,
2473 no_ipv6_prefix_list_seq_cmd
,
2474 "no ipv6 prefix-list WORD seq (1-4294967295) <deny|permit> <X:X::X:X/M|any>",
2478 "Name of a prefix list\n"
2479 "sequence number of an entry\n"
2481 "Specify packets to reject\n"
2482 "Specify packets to forward\n"
2483 "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n"
2484 "Any prefix match. Same as \"::0/0 le 128\"\n")
2488 int idx_permit_deny
= 6;
2489 int idx_ipv6_any
= 7;
2490 return vty_prefix_list_uninstall (vty
, AFI_IP6
, argv
[idx_word
]->arg
, argv
[idx_number
]->arg
, argv
[idx_permit_deny
]->arg
,
2491 argv
[idx_ipv6_any
]->arg
, NULL
, NULL
);
2494 DEFUN (no_ipv6_prefix_list_seq_ge
,
2495 no_ipv6_prefix_list_seq_ge_cmd
,
2496 "no ipv6 prefix-list WORD seq (1-4294967295) <deny|permit> X:X::X:X/M ge (0-128)",
2500 "Name of a prefix list\n"
2501 "sequence number of an entry\n"
2503 "Specify packets to reject\n"
2504 "Specify packets to forward\n"
2505 "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n"
2506 "Minimum prefix length to be matched\n"
2507 "Minimum prefix length\n")
2511 int idx_permit_deny
= 6;
2512 int idx_ipv6_prefixlen
= 7;
2513 int idx_number_2
= 9;
2514 return vty_prefix_list_uninstall (vty
, AFI_IP6
, argv
[idx_word
]->arg
, argv
[idx_number
]->arg
, argv
[idx_permit_deny
]->arg
,
2515 argv
[idx_ipv6_prefixlen
]->arg
, argv
[idx_number_2
]->arg
, NULL
);
2518 DEFUN (no_ipv6_prefix_list_seq_ge_le
,
2519 no_ipv6_prefix_list_seq_ge_le_cmd
,
2520 "no ipv6 prefix-list WORD seq (1-4294967295) <deny|permit> X:X::X:X/M ge (0-128) le (0-128)",
2524 "Name of a prefix list\n"
2525 "sequence number of an entry\n"
2527 "Specify packets to reject\n"
2528 "Specify packets to forward\n"
2529 "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n"
2530 "Minimum prefix length to be matched\n"
2531 "Minimum prefix length\n"
2532 "Maximum prefix length to be matched\n"
2533 "Maximum prefix length\n")
2537 int idx_permit_deny
= 6;
2538 int idx_ipv6_prefixlen
= 7;
2539 int idx_number_2
= 9;
2540 int idx_number_3
= 11;
2541 return vty_prefix_list_uninstall (vty
, AFI_IP6
, argv
[idx_word
]->arg
, argv
[idx_number
]->arg
, argv
[idx_permit_deny
]->arg
,
2542 argv
[idx_ipv6_prefixlen
]->arg
, argv
[idx_number_2
]->arg
, argv
[idx_number_3
]->arg
);
2545 DEFUN (no_ipv6_prefix_list_seq_le
,
2546 no_ipv6_prefix_list_seq_le_cmd
,
2547 "no ipv6 prefix-list WORD seq (1-4294967295) <deny|permit> X:X::X:X/M le (0-128)",
2551 "Name of a prefix list\n"
2552 "sequence number of an entry\n"
2554 "Specify packets to reject\n"
2555 "Specify packets to forward\n"
2556 "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n"
2557 "Maximum prefix length to be matched\n"
2558 "Maximum prefix length\n")
2562 int idx_permit_deny
= 6;
2563 int idx_ipv6_prefixlen
= 7;
2564 int idx_number_2
= 9;
2565 return vty_prefix_list_uninstall (vty
, AFI_IP6
, argv
[idx_word
]->arg
, argv
[idx_number
]->arg
, argv
[idx_permit_deny
]->arg
,
2566 argv
[idx_ipv6_prefixlen
]->arg
, NULL
, argv
[idx_number_2
]->arg
);
2569 DEFUN (no_ipv6_prefix_list_seq_le_ge
,
2570 no_ipv6_prefix_list_seq_le_ge_cmd
,
2571 "no ipv6 prefix-list WORD seq (1-4294967295) <deny|permit> X:X::X:X/M le (0-128) ge (0-128)",
2575 "Name of a prefix list\n"
2576 "sequence number of an entry\n"
2578 "Specify packets to reject\n"
2579 "Specify packets to forward\n"
2580 "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n"
2581 "Maximum prefix length to be matched\n"
2582 "Maximum prefix length\n"
2583 "Minimum prefix length to be matched\n"
2584 "Minimum prefix length\n")
2588 int idx_permit_deny
= 6;
2589 int idx_ipv6_prefixlen
= 7;
2590 int idx_number_2
= 9;
2591 int idx_number_3
= 11;
2592 return vty_prefix_list_uninstall (vty
, AFI_IP6
, argv
[idx_word
]->arg
, argv
[idx_number
]->arg
, argv
[idx_permit_deny
]->arg
,
2593 argv
[idx_ipv6_prefixlen
]->arg
, argv
[idx_number_3
]->arg
, argv
[idx_number_2
]->arg
);
2596 DEFUN (ipv6_prefix_list_sequence_number
,
2597 ipv6_prefix_list_sequence_number_cmd
,
2598 "ipv6 prefix-list sequence-number",
2601 "Include/exclude sequence numbers in NVGEN\n")
2603 prefix_master_ipv6
.seqnum
= 1;
2607 DEFUN (no_ipv6_prefix_list_sequence_number
,
2608 no_ipv6_prefix_list_sequence_number_cmd
,
2609 "no ipv6 prefix-list sequence-number",
2613 "Include/exclude sequence numbers in NVGEN\n")
2615 prefix_master_ipv6
.seqnum
= 0;
2619 DEFUN (ipv6_prefix_list_description
,
2620 ipv6_prefix_list_description_cmd
,
2621 "ipv6 prefix-list WORD description LINE...",
2624 "Name of a prefix list\n"
2625 "Prefix-list specific description\n"
2626 "Up to 80 characters describing this prefix-list\n")
2630 struct prefix_list
*plist
;
2632 plist
= prefix_list_get (AFI_IP6
, 0, argv
[idx_word
]->arg
);
2636 XFREE (MTYPE_TMP
, plist
->desc
);
2639 plist
->desc
= argv_concat(argv
, argc
, iddx_line
);
2644 DEFUN (no_ipv6_prefix_list_description
,
2645 no_ipv6_prefix_list_description_cmd
,
2646 "no ipv6 prefix-list WORD description",
2650 "Name of a prefix list\n"
2651 "Prefix-list specific description\n")
2654 return vty_prefix_list_desc_unset (vty
, AFI_IP6
, argv
[idx_word
]->arg
);
2658 DEFUN (no_ipv6_prefix_list_description_comment
,
2659 no_ipv6_prefix_list_description_comment_cmd
,
2660 "no ipv6 prefix-list WORD description LINE...",
2664 "Name of a prefix list\n"
2665 "Prefix-list specific description\n"
2666 "Up to 80 characters describing this prefix-list\n")
2668 return no_ipv6_prefix_list_description (self
, vty
, argc
, argv
);
2672 DEFUN (show_ipv6_prefix_list
,
2673 show_ipv6_prefix_list_cmd
,
2674 "show ipv6 prefix-list",
2679 return vty_show_prefix_list (vty
, AFI_IP6
, NULL
, NULL
, normal_display
);
2682 DEFUN (show_ipv6_prefix_list_name
,
2683 show_ipv6_prefix_list_name_cmd
,
2684 "show ipv6 prefix-list WORD",
2688 "Name of a prefix list\n")
2691 return vty_show_prefix_list (vty
, AFI_IP6
, argv
[idx_word
]->arg
, NULL
, normal_display
);
2694 DEFUN (show_ipv6_prefix_list_name_seq
,
2695 show_ipv6_prefix_list_name_seq_cmd
,
2696 "show ipv6 prefix-list WORD seq (1-4294967295)",
2700 "Name of a prefix list\n"
2701 "sequence number of an entry\n"
2702 "Sequence number\n")
2706 return vty_show_prefix_list (vty
, AFI_IP6
, argv
[idx_word
]->arg
, argv
[idx_number
]->arg
, sequential_display
);
2709 DEFUN (show_ipv6_prefix_list_prefix
,
2710 show_ipv6_prefix_list_prefix_cmd
,
2711 "show ipv6 prefix-list WORD X:X::X:X/M",
2715 "Name of a prefix list\n"
2716 "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n")
2719 int idx_ipv6_prefixlen
= 4;
2720 return vty_show_prefix_list_prefix (vty
, AFI_IP6
, argv
[idx_word
]->arg
, argv
[idx_ipv6_prefixlen
]->arg
, normal_display
);
2723 DEFUN (show_ipv6_prefix_list_prefix_longer
,
2724 show_ipv6_prefix_list_prefix_longer_cmd
,
2725 "show ipv6 prefix-list WORD X:X::X:X/M longer",
2729 "Name of a prefix list\n"
2730 "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n"
2731 "Lookup longer prefix\n")
2734 int idx_ipv6_prefixlen
= 4;
2735 return vty_show_prefix_list_prefix (vty
, AFI_IP6
, argv
[idx_word
]->arg
, argv
[idx_ipv6_prefixlen
]->arg
, longer_display
);
2738 DEFUN (show_ipv6_prefix_list_prefix_first_match
,
2739 show_ipv6_prefix_list_prefix_first_match_cmd
,
2740 "show ipv6 prefix-list WORD X:X::X:X/M first-match",
2744 "Name of a prefix list\n"
2745 "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n"
2746 "First matched prefix\n")
2749 int idx_ipv6_prefixlen
= 4;
2750 return vty_show_prefix_list_prefix (vty
, AFI_IP6
, argv
[idx_word
]->arg
, argv
[idx_ipv6_prefixlen
]->arg
, first_match_display
);
2753 DEFUN (show_ipv6_prefix_list_summary
,
2754 show_ipv6_prefix_list_summary_cmd
,
2755 "show ipv6 prefix-list summary",
2759 "Summary of prefix lists\n")
2761 return vty_show_prefix_list (vty
, AFI_IP6
, NULL
, NULL
, summary_display
);
2764 DEFUN (show_ipv6_prefix_list_summary_name
,
2765 show_ipv6_prefix_list_summary_name_cmd
,
2766 "show ipv6 prefix-list summary WORD",
2770 "Summary of prefix lists\n"
2771 "Name of a prefix list\n")
2774 return vty_show_prefix_list (vty
, AFI_IP6
, argv
[idx_word
]->arg
, NULL
, summary_display
);
2777 DEFUN (show_ipv6_prefix_list_detail
,
2778 show_ipv6_prefix_list_detail_cmd
,
2779 "show ipv6 prefix-list detail",
2783 "Detail of prefix lists\n")
2785 return vty_show_prefix_list (vty
, AFI_IP6
, NULL
, NULL
, detail_display
);
2788 DEFUN (show_ipv6_prefix_list_detail_name
,
2789 show_ipv6_prefix_list_detail_name_cmd
,
2790 "show ipv6 prefix-list detail WORD",
2794 "Detail of prefix lists\n"
2795 "Name of a prefix list\n")
2798 return vty_show_prefix_list (vty
, AFI_IP6
, argv
[idx_word
]->arg
, NULL
, detail_display
);
2801 DEFUN (clear_ipv6_prefix_list
,
2802 clear_ipv6_prefix_list_cmd
,
2803 "clear ipv6 prefix-list",
2808 return vty_clear_prefix_list (vty
, AFI_IP6
, NULL
, NULL
);
2811 DEFUN (clear_ipv6_prefix_list_name
,
2812 clear_ipv6_prefix_list_name_cmd
,
2813 "clear ipv6 prefix-list WORD",
2817 "Name of a prefix list\n")
2820 return vty_clear_prefix_list (vty
, AFI_IP6
, argv
[idx_word
]->arg
, NULL
);
2823 DEFUN (clear_ipv6_prefix_list_name_prefix
,
2824 clear_ipv6_prefix_list_name_prefix_cmd
,
2825 "clear ipv6 prefix-list WORD X:X::X:X/M",
2829 "Name of a prefix list\n"
2830 "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n")
2833 int idx_ipv6_prefixlen
= 4;
2834 return vty_clear_prefix_list (vty
, AFI_IP6
, argv
[idx_word
]->arg
, argv
[idx_ipv6_prefixlen
]->arg
);
2837 /* Configuration write function. */
2839 config_write_prefix_afi (afi_t afi
, struct vty
*vty
)
2841 struct prefix_list
*plist
;
2842 struct prefix_list_entry
*pentry
;
2843 struct prefix_master
*master
;
2846 master
= prefix_master_get (afi
, 0);
2850 if (! master
->seqnum
)
2852 vty_out (vty
, "no ip%s prefix-list sequence-number%s",
2853 afi
== AFI_IP
? "" : "v6", VTY_NEWLINE
);
2854 vty_out (vty
, "!%s", VTY_NEWLINE
);
2857 for (plist
= master
->num
.head
; plist
; plist
= plist
->next
)
2861 vty_out (vty
, "ip%s prefix-list %s description %s%s",
2862 afi
== AFI_IP
? "" : "v6",
2863 plist
->name
, plist
->desc
, VTY_NEWLINE
);
2867 for (pentry
= plist
->head
; pentry
; pentry
= pentry
->next
)
2869 vty_out (vty
, "ip%s prefix-list %s ",
2870 afi
== AFI_IP
? "" : "v6",
2874 vty_out (vty
, "seq %u ", pentry
->seq
);
2876 vty_out (vty
, "%s ", prefix_list_type_str (pentry
));
2879 vty_out (vty
, "any");
2882 struct prefix
*p
= &pentry
->prefix
;
2885 vty_out (vty
, "%s/%d",
2886 inet_ntop (p
->family
, &p
->u
.prefix
, buf
, BUFSIZ
),
2890 vty_out (vty
, " ge %d", pentry
->ge
);
2892 vty_out (vty
, " le %d", pentry
->le
);
2894 vty_out (vty
, "%s", VTY_NEWLINE
);
2897 /* vty_out (vty, "!%s", VTY_NEWLINE); */
2900 for (plist
= master
->str
.head
; plist
; plist
= plist
->next
)
2904 vty_out (vty
, "ip%s prefix-list %s description %s%s",
2905 afi
== AFI_IP
? "" : "v6",
2906 plist
->name
, plist
->desc
, VTY_NEWLINE
);
2910 for (pentry
= plist
->head
; pentry
; pentry
= pentry
->next
)
2912 vty_out (vty
, "ip%s prefix-list %s ",
2913 afi
== AFI_IP
? "" : "v6",
2917 vty_out (vty
, "seq %u ", pentry
->seq
);
2919 vty_out (vty
, "%s", prefix_list_type_str (pentry
));
2922 vty_out (vty
, " any");
2925 struct prefix
*p
= &pentry
->prefix
;
2928 vty_out (vty
, " %s/%d",
2929 inet_ntop (p
->family
, &p
->u
.prefix
, buf
, BUFSIZ
),
2933 vty_out (vty
, " ge %d", pentry
->ge
);
2935 vty_out (vty
, " le %d", pentry
->le
);
2937 vty_out (vty
, "%s", VTY_NEWLINE
);
2946 prefix_bgp_orf_entry (struct stream
*s
, struct prefix_list
*plist
,
2947 u_char init_flag
, u_char permit_flag
, u_char deny_flag
)
2949 struct prefix_list_entry
*pentry
;
2954 for (pentry
= plist
->head
; pentry
; pentry
= pentry
->next
)
2956 u_char flag
= init_flag
;
2957 struct prefix
*p
= &pentry
->prefix
;
2959 flag
|= (pentry
->type
== PREFIX_PERMIT
?
2960 permit_flag
: deny_flag
);
2961 stream_putc (s
, flag
);
2962 stream_putl (s
, (u_int32_t
)pentry
->seq
);
2963 stream_putc (s
, (u_char
)pentry
->ge
);
2964 stream_putc (s
, (u_char
)pentry
->le
);
2965 stream_put_prefix (s
, p
);
2972 prefix_bgp_orf_set (char *name
, afi_t afi
, struct orf_prefix
*orfp
,
2973 int permit
, int set
)
2975 struct prefix_list
*plist
;
2976 struct prefix_list_entry
*pentry
;
2978 /* ge and le value check */
2979 if (orfp
->ge
&& orfp
->ge
<= orfp
->p
.prefixlen
)
2981 if (orfp
->le
&& orfp
->le
<= orfp
->p
.prefixlen
)
2983 if (orfp
->le
&& orfp
->ge
> orfp
->le
)
2986 if (orfp
->ge
&& orfp
->le
== (afi
== AFI_IP
? 32 : 128))
2989 plist
= prefix_list_get (afi
, 1, name
);
2995 pentry
= prefix_list_entry_make (&orfp
->p
,
2996 (permit
? PREFIX_PERMIT
: PREFIX_DENY
),
2997 orfp
->seq
, orfp
->le
, orfp
->ge
, 0);
2999 if (prefix_entry_dup_check (plist
, pentry
))
3001 prefix_list_entry_free (pentry
);
3005 prefix_list_entry_add (plist
, pentry
);
3009 pentry
= prefix_list_entry_lookup (plist
, &orfp
->p
,
3010 (permit
? PREFIX_PERMIT
: PREFIX_DENY
),
3011 orfp
->seq
, orfp
->le
, orfp
->ge
);
3016 prefix_list_entry_delete (plist
, pentry
, 1);
3023 prefix_bgp_orf_remove_all (afi_t afi
, char *name
)
3025 struct prefix_list
*plist
;
3027 plist
= prefix_bgp_orf_lookup (afi
, name
);
3029 prefix_list_delete (plist
);
3032 /* return prefix count */
3034 prefix_bgp_show_prefix_list (struct vty
*vty
, afi_t afi
, char *name
, u_char use_json
)
3036 struct prefix_list
*plist
;
3037 struct prefix_list_entry
*pentry
;
3038 json_object
*json
= NULL
;
3039 json_object
*json_prefix
= NULL
;
3040 json_object
*json_list
= NULL
;
3042 plist
= prefix_bgp_orf_lookup (afi
, name
);
3047 return plist
->count
;
3051 json
= json_object_new_object();
3052 json_prefix
= json_object_new_object();
3053 json_list
= json_object_new_object();
3055 json_object_int_add(json_prefix
, "prefixListCounter", plist
->count
);
3056 json_object_string_add(json_prefix
, "prefixListName", plist
->name
);
3058 for (pentry
= plist
->head
; pentry
; pentry
= pentry
->next
)
3060 struct prefix
*p
= &pentry
->prefix
;
3064 sprintf(buf_a
, "%s/%d", inet_ntop (p
->family
, &p
->u
.prefix
, buf_b
, BUFSIZ
),
3067 json_object_int_add(json_list
, "seq", pentry
->seq
);
3068 json_object_string_add(json_list
, "seqPrefixListType", prefix_list_type_str (pentry
));
3071 json_object_int_add(json_list
, "ge", pentry
->ge
);
3073 json_object_int_add(json_list
, "le", pentry
->le
);
3075 json_object_object_add(json_prefix
, buf_a
, json_list
);
3078 json_object_object_add(json
, "ipPrefixList", json_prefix
);
3080 json_object_object_add(json
, "ipv6PrefixList", json_prefix
);
3082 vty_out (vty
, "%s%s", json_object_to_json_string_ext(json
, JSON_C_TO_STRING_PRETTY
), VTY_NEWLINE
);
3083 json_object_free(json
);
3087 vty_out (vty
, "ip%s prefix-list %s: %d entries%s",
3088 afi
== AFI_IP
? "" : "v6",
3089 plist
->name
, plist
->count
, VTY_NEWLINE
);
3091 for (pentry
= plist
->head
; pentry
; pentry
= pentry
->next
)
3093 struct prefix
*p
= &pentry
->prefix
;
3096 vty_out (vty
, " seq %u %s %s/%d", pentry
->seq
,
3097 prefix_list_type_str (pentry
),
3098 inet_ntop (p
->family
, &p
->u
.prefix
, buf
, BUFSIZ
),
3102 vty_out (vty
, " ge %d", pentry
->ge
);
3104 vty_out (vty
, " le %d", pentry
->le
);
3106 vty_out (vty
, "%s", VTY_NEWLINE
);
3109 return plist
->count
;
3113 prefix_list_reset_afi (afi_t afi
, int orf
)
3115 struct prefix_list
*plist
;
3116 struct prefix_list
*next
;
3117 struct prefix_master
*master
;
3119 master
= prefix_master_get (afi
, orf
);
3123 for (plist
= master
->num
.head
; plist
; plist
= next
)
3126 prefix_list_delete (plist
);
3128 for (plist
= master
->str
.head
; plist
; plist
= next
)
3131 prefix_list_delete (plist
);
3134 assert (master
->num
.head
== NULL
);
3135 assert (master
->num
.tail
== NULL
);
3137 assert (master
->str
.head
== NULL
);
3138 assert (master
->str
.tail
== NULL
);
3141 master
->recent
= NULL
;
3145 /* Prefix-list node. */
3146 static struct cmd_node prefix_node
=
3149 "", /* Prefix list has no interface. */
3154 config_write_prefix_ipv4 (struct vty
*vty
)
3156 return config_write_prefix_afi (AFI_IP
, vty
);
3160 prefix_list_init_ipv4 (void)
3162 install_node (&prefix_node
, config_write_prefix_ipv4
);
3164 install_element (CONFIG_NODE
, &ip_prefix_list_cmd
);
3165 install_element (CONFIG_NODE
, &ip_prefix_list_ge_cmd
);
3166 install_element (CONFIG_NODE
, &ip_prefix_list_ge_le_cmd
);
3167 install_element (CONFIG_NODE
, &ip_prefix_list_le_cmd
);
3168 install_element (CONFIG_NODE
, &ip_prefix_list_le_ge_cmd
);
3169 install_element (CONFIG_NODE
, &ip_prefix_list_seq_cmd
);
3170 install_element (CONFIG_NODE
, &ip_prefix_list_seq_ge_cmd
);
3171 install_element (CONFIG_NODE
, &ip_prefix_list_seq_ge_le_cmd
);
3172 install_element (CONFIG_NODE
, &ip_prefix_list_seq_le_cmd
);
3173 install_element (CONFIG_NODE
, &ip_prefix_list_seq_le_ge_cmd
);
3175 install_element (CONFIG_NODE
, &no_ip_prefix_list_cmd
);
3176 install_element (CONFIG_NODE
, &no_ip_prefix_list_prefix_cmd
);
3177 install_element (CONFIG_NODE
, &no_ip_prefix_list_ge_cmd
);
3178 install_element (CONFIG_NODE
, &no_ip_prefix_list_ge_le_cmd
);
3179 install_element (CONFIG_NODE
, &no_ip_prefix_list_le_cmd
);
3180 install_element (CONFIG_NODE
, &no_ip_prefix_list_le_ge_cmd
);
3181 install_element (CONFIG_NODE
, &no_ip_prefix_list_seq_cmd
);
3182 install_element (CONFIG_NODE
, &no_ip_prefix_list_seq_ge_cmd
);
3183 install_element (CONFIG_NODE
, &no_ip_prefix_list_seq_ge_le_cmd
);
3184 install_element (CONFIG_NODE
, &no_ip_prefix_list_seq_le_cmd
);
3185 install_element (CONFIG_NODE
, &no_ip_prefix_list_seq_le_ge_cmd
);
3187 install_element (CONFIG_NODE
, &ip_prefix_list_description_cmd
);
3188 install_element (CONFIG_NODE
, &no_ip_prefix_list_description_cmd
);
3189 install_element (CONFIG_NODE
, &no_ip_prefix_list_description_comment_cmd
);
3191 install_element (CONFIG_NODE
, &ip_prefix_list_sequence_number_cmd
);
3192 install_element (CONFIG_NODE
, &no_ip_prefix_list_sequence_number_cmd
);
3194 install_element (VIEW_NODE
, &show_ip_prefix_list_cmd
);
3195 install_element (VIEW_NODE
, &show_ip_prefix_list_name_cmd
);
3196 install_element (VIEW_NODE
, &show_ip_prefix_list_name_seq_cmd
);
3197 install_element (VIEW_NODE
, &show_ip_prefix_list_prefix_cmd
);
3198 install_element (VIEW_NODE
, &show_ip_prefix_list_prefix_longer_cmd
);
3199 install_element (VIEW_NODE
, &show_ip_prefix_list_prefix_first_match_cmd
);
3200 install_element (VIEW_NODE
, &show_ip_prefix_list_summary_cmd
);
3201 install_element (VIEW_NODE
, &show_ip_prefix_list_summary_name_cmd
);
3202 install_element (VIEW_NODE
, &show_ip_prefix_list_detail_cmd
);
3203 install_element (VIEW_NODE
, &show_ip_prefix_list_detail_name_cmd
);
3205 install_element (ENABLE_NODE
, &clear_ip_prefix_list_cmd
);
3206 install_element (ENABLE_NODE
, &clear_ip_prefix_list_name_cmd
);
3207 install_element (ENABLE_NODE
, &clear_ip_prefix_list_name_prefix_cmd
);
3210 /* Prefix-list node. */
3211 static struct cmd_node prefix_ipv6_node
=
3214 "", /* Prefix list has no interface. */
3219 config_write_prefix_ipv6 (struct vty
*vty
)
3221 return config_write_prefix_afi (AFI_IP6
, vty
);
3225 prefix_list_init_ipv6 (void)
3227 install_node (&prefix_ipv6_node
, config_write_prefix_ipv6
);
3229 install_element (CONFIG_NODE
, &ipv6_prefix_list_cmd
);
3230 install_element (CONFIG_NODE
, &ipv6_prefix_list_ge_cmd
);
3231 install_element (CONFIG_NODE
, &ipv6_prefix_list_ge_le_cmd
);
3232 install_element (CONFIG_NODE
, &ipv6_prefix_list_le_cmd
);
3233 install_element (CONFIG_NODE
, &ipv6_prefix_list_le_ge_cmd
);
3234 install_element (CONFIG_NODE
, &ipv6_prefix_list_seq_cmd
);
3235 install_element (CONFIG_NODE
, &ipv6_prefix_list_seq_ge_cmd
);
3236 install_element (CONFIG_NODE
, &ipv6_prefix_list_seq_ge_le_cmd
);
3237 install_element (CONFIG_NODE
, &ipv6_prefix_list_seq_le_cmd
);
3238 install_element (CONFIG_NODE
, &ipv6_prefix_list_seq_le_ge_cmd
);
3240 install_element (CONFIG_NODE
, &no_ipv6_prefix_list_cmd
);
3241 install_element (CONFIG_NODE
, &no_ipv6_prefix_list_prefix_cmd
);
3242 install_element (CONFIG_NODE
, &no_ipv6_prefix_list_ge_cmd
);
3243 install_element (CONFIG_NODE
, &no_ipv6_prefix_list_ge_le_cmd
);
3244 install_element (CONFIG_NODE
, &no_ipv6_prefix_list_le_cmd
);
3245 install_element (CONFIG_NODE
, &no_ipv6_prefix_list_le_ge_cmd
);
3246 install_element (CONFIG_NODE
, &no_ipv6_prefix_list_seq_cmd
);
3247 install_element (CONFIG_NODE
, &no_ipv6_prefix_list_seq_ge_cmd
);
3248 install_element (CONFIG_NODE
, &no_ipv6_prefix_list_seq_ge_le_cmd
);
3249 install_element (CONFIG_NODE
, &no_ipv6_prefix_list_seq_le_cmd
);
3250 install_element (CONFIG_NODE
, &no_ipv6_prefix_list_seq_le_ge_cmd
);
3252 install_element (CONFIG_NODE
, &ipv6_prefix_list_description_cmd
);
3253 install_element (CONFIG_NODE
, &no_ipv6_prefix_list_description_cmd
);
3254 install_element (CONFIG_NODE
, &no_ipv6_prefix_list_description_comment_cmd
);
3256 install_element (CONFIG_NODE
, &ipv6_prefix_list_sequence_number_cmd
);
3257 install_element (CONFIG_NODE
, &no_ipv6_prefix_list_sequence_number_cmd
);
3259 install_element (VIEW_NODE
, &show_ipv6_prefix_list_cmd
);
3260 install_element (VIEW_NODE
, &show_ipv6_prefix_list_name_cmd
);
3261 install_element (VIEW_NODE
, &show_ipv6_prefix_list_name_seq_cmd
);
3262 install_element (VIEW_NODE
, &show_ipv6_prefix_list_prefix_cmd
);
3263 install_element (VIEW_NODE
, &show_ipv6_prefix_list_prefix_longer_cmd
);
3264 install_element (VIEW_NODE
, &show_ipv6_prefix_list_prefix_first_match_cmd
);
3265 install_element (VIEW_NODE
, &show_ipv6_prefix_list_summary_cmd
);
3266 install_element (VIEW_NODE
, &show_ipv6_prefix_list_summary_name_cmd
);
3267 install_element (VIEW_NODE
, &show_ipv6_prefix_list_detail_cmd
);
3268 install_element (VIEW_NODE
, &show_ipv6_prefix_list_detail_name_cmd
);
3270 install_element (ENABLE_NODE
, &clear_ipv6_prefix_list_cmd
);
3271 install_element (ENABLE_NODE
, &clear_ipv6_prefix_list_name_cmd
);
3272 install_element (ENABLE_NODE
, &clear_ipv6_prefix_list_name_prefix_cmd
);
3278 prefix_list_init_ipv4 ();
3279 prefix_list_init_ipv6 ();
3283 prefix_list_reset ()
3285 prefix_list_reset_afi (AFI_IP
, 0);
3286 prefix_list_reset_afi (AFI_IP6
, 0);
3287 prefix_list_reset_afi (AFI_IP
, 1);
3288 prefix_list_reset_afi (AFI_IP6
, 1);