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
=
106 /* Static structure of IPv6 prefix-list's master. */
107 static struct prefix_master prefix_master_ipv6
=
118 /* Static structure of BGP ORF prefix_list's master. */
119 static struct prefix_master prefix_master_orf_v4
=
130 /* Static structure of BGP ORF prefix_list's master. */
131 static struct prefix_master prefix_master_orf_v6
=
142 static struct prefix_master
*
143 prefix_master_get (afi_t afi
, int orf
)
146 return orf
? &prefix_master_orf_v4
: &prefix_master_ipv4
;
148 return orf
? &prefix_master_orf_v6
: &prefix_master_ipv6
;
152 const char *prefix_list_name (struct prefix_list
*plist
)
157 /* Lookup prefix_list from list of prefix_list by name. */
158 static struct prefix_list
*
159 prefix_list_lookup_do (afi_t afi
, int orf
, const char *name
)
161 struct prefix_list
*plist
;
162 struct prefix_master
*master
;
167 master
= prefix_master_get (afi
, orf
);
171 for (plist
= master
->num
.head
; plist
; plist
= plist
->next
)
172 if (strcmp (plist
->name
, name
) == 0)
175 for (plist
= master
->str
.head
; plist
; plist
= plist
->next
)
176 if (strcmp (plist
->name
, name
) == 0)
183 prefix_list_lookup (afi_t afi
, const char *name
)
185 return prefix_list_lookup_do (afi
, 0, name
);
189 prefix_bgp_orf_lookup (afi_t afi
, const char *name
)
191 return prefix_list_lookup_do (afi
, 1, name
);
194 static struct prefix_list
*
195 prefix_list_new (void)
197 struct prefix_list
*new;
199 new = XCALLOC (MTYPE_PREFIX_LIST
, sizeof (struct prefix_list
));
204 prefix_list_free (struct prefix_list
*plist
)
206 XFREE (MTYPE_PREFIX_LIST
, plist
);
209 static struct prefix_list_entry
*
210 prefix_list_entry_new (void)
212 struct prefix_list_entry
*new;
214 new = XCALLOC (MTYPE_PREFIX_LIST_ENTRY
, sizeof (struct prefix_list_entry
));
219 prefix_list_entry_free (struct prefix_list_entry
*pentry
)
221 XFREE (MTYPE_PREFIX_LIST_ENTRY
, pentry
);
224 /* Insert new prefix list to list of prefix_list. Each prefix_list
225 is sorted by the name. */
226 static struct prefix_list
*
227 prefix_list_insert (afi_t afi
, int orf
, const char *name
)
231 struct prefix_list
*plist
;
232 struct prefix_list
*point
;
233 struct prefix_list_list
*list
;
234 struct prefix_master
*master
;
236 master
= prefix_master_get (afi
, orf
);
240 /* Allocate new prefix_list and copy given name. */
241 plist
= prefix_list_new ();
242 plist
->name
= XSTRDUP (MTYPE_MPREFIX_LIST_STR
, name
);
243 plist
->master
= master
;
244 plist
->trie
= XCALLOC (MTYPE_PREFIX_LIST_TRIE
, sizeof (struct pltrie_table
));
246 /* If name is made by all digit character. We treat it as
248 for (number
= 0, i
= 0; i
< strlen (name
); i
++)
250 if (isdigit ((int) name
[i
]))
251 number
= (number
* 10) + (name
[i
] - '0');
256 /* In case of name is all digit character */
257 if (i
== strlen (name
))
259 plist
->type
= PREFIX_TYPE_NUMBER
;
261 /* Set prefix_list to number list. */
264 for (point
= list
->head
; point
; point
= point
->next
)
265 if (atol (point
->name
) >= number
)
270 plist
->type
= PREFIX_TYPE_STRING
;
272 /* Set prefix_list to string list. */
275 /* Set point to insertion point. */
276 for (point
= list
->head
; point
; point
= point
->next
)
277 if (strcmp (point
->name
, name
) >= 0)
281 /* In case of this is the first element of master. */
282 if (list
->head
== NULL
)
284 list
->head
= list
->tail
= plist
;
288 /* In case of insertion is made at the tail of access_list. */
291 plist
->prev
= list
->tail
;
292 list
->tail
->next
= plist
;
297 /* In case of insertion is made at the head of access_list. */
298 if (point
== list
->head
)
300 plist
->next
= list
->head
;
301 list
->head
->prev
= plist
;
306 /* Insertion is made at middle of the access_list. */
308 plist
->prev
= point
->prev
;
311 point
->prev
->next
= plist
;
317 static struct prefix_list
*
318 prefix_list_get (afi_t afi
, int orf
, const char *name
)
320 struct prefix_list
*plist
;
322 plist
= prefix_list_lookup_do (afi
, orf
, name
);
325 plist
= prefix_list_insert (afi
, orf
, name
);
329 /* Delete prefix-list from prefix_list_master and free it. */
331 prefix_list_delete (struct prefix_list
*plist
)
333 struct prefix_list_list
*list
;
334 struct prefix_master
*master
;
335 struct prefix_list_entry
*pentry
;
336 struct prefix_list_entry
*next
;
338 /* If prefix-list contain prefix_list_entry free all of it. */
339 for (pentry
= plist
->head
; pentry
; pentry
= next
)
342 prefix_list_entry_free (pentry
);
346 master
= plist
->master
;
348 if (plist
->type
== PREFIX_TYPE_NUMBER
)
354 plist
->next
->prev
= plist
->prev
;
356 list
->tail
= plist
->prev
;
359 plist
->prev
->next
= plist
->next
;
361 list
->head
= plist
->next
;
364 XFREE (MTYPE_TMP
, plist
->desc
);
366 /* Make sure master's recent changed prefix-list information is
368 master
->recent
= NULL
;
370 route_map_notify_dependencies(plist
->name
, RMAP_EVENT_PLIST_DELETED
);
372 if (master
->delete_hook
)
373 (*master
->delete_hook
) (plist
);
376 XFREE (MTYPE_MPREFIX_LIST_STR
, plist
->name
);
378 XFREE (MTYPE_PREFIX_LIST_TRIE
, plist
->trie
);
380 prefix_list_free (plist
);
384 static struct prefix_list_entry
*
385 prefix_list_entry_make (struct prefix
*prefix
, enum prefix_list_type type
,
386 int seq
, int le
, int ge
, int any
)
388 struct prefix_list_entry
*pentry
;
390 pentry
= prefix_list_entry_new ();
395 prefix_copy (&pentry
->prefix
, prefix
);
404 /* Add hook function. */
406 prefix_list_add_hook (void (*func
) (struct prefix_list
*plist
))
408 prefix_master_ipv4
.add_hook
= func
;
409 prefix_master_ipv6
.add_hook
= func
;
412 /* Delete hook function. */
414 prefix_list_delete_hook (void (*func
) (struct prefix_list
*plist
))
416 prefix_master_ipv4
.delete_hook
= func
;
417 prefix_master_ipv6
.delete_hook
= func
;
420 /* Calculate new sequential number. */
422 prefix_new_seq_get (struct prefix_list
*plist
)
426 struct prefix_list_entry
*pentry
;
430 for (pentry
= plist
->head
; pentry
; pentry
= pentry
->next
)
432 if (maxseq
< pentry
->seq
)
433 maxseq
= pentry
->seq
;
436 newseq
= ((maxseq
/ 5) * 5) + 5;
441 /* Return prefix list entry which has same seq number. */
442 static struct prefix_list_entry
*
443 prefix_seq_check (struct prefix_list
*plist
, int seq
)
445 struct prefix_list_entry
*pentry
;
447 for (pentry
= plist
->head
; pentry
; pentry
= pentry
->next
)
448 if (pentry
->seq
== seq
)
453 static struct prefix_list_entry
*
454 prefix_list_entry_lookup (struct prefix_list
*plist
, struct prefix
*prefix
,
455 enum prefix_list_type type
, int seq
, int le
, int ge
)
457 struct prefix_list_entry
*pentry
;
459 for (pentry
= plist
->head
; pentry
; pentry
= pentry
->next
)
460 if (prefix_same (&pentry
->prefix
, prefix
) && pentry
->type
== type
)
462 if (seq
>= 0 && pentry
->seq
!= seq
)
465 if (pentry
->le
!= le
)
467 if (pentry
->ge
!= ge
)
477 trie_walk_affected (size_t validbits
, struct pltrie_table
*table
, uint8_t byte
,
478 struct prefix_list_entry
*object
,
479 void (*fn
)(struct prefix_list_entry
*object
,
480 struct prefix_list_entry
**updptr
))
485 if (validbits
> PLC_BITS
)
487 fn (object
, &table
->entries
[byte
].final_chain
);
491 mask
= (1 << (8 - validbits
)) - 1;
492 for (bwalk
= byte
& ~mask
; bwalk
<= byte
+ mask
; bwalk
++)
494 fn (object
, &table
->entries
[bwalk
].up_chain
);
498 static void trie_uninstall_fn (struct prefix_list_entry
*object
,
499 struct prefix_list_entry
**updptr
)
501 for (; *updptr
; updptr
= &(*updptr
)->next_best
)
502 if (*updptr
== object
)
504 *updptr
= object
->next_best
;
510 trie_table_empty (struct pltrie_table
*table
)
513 for (i
= 0; i
< PLC_LEN
; i
++)
514 if (table
->entries
[i
].next_table
|| table
->entries
[i
].up_chain
)
520 prefix_list_trie_del (struct prefix_list
*plist
,
521 struct prefix_list_entry
*pentry
)
523 size_t depth
, maxdepth
= plist
->master
->trie_depth
;
524 uint8_t *bytes
= &pentry
->prefix
.u
.prefix
;
525 size_t validbits
= pentry
->prefix
.prefixlen
;
526 struct pltrie_table
*table
, **tables
[PLC_MAXLEVEL
];
529 for (depth
= 0; validbits
> PLC_BITS
&& depth
< maxdepth
- 1; depth
++)
531 uint8_t byte
= bytes
[depth
];
532 assert (table
->entries
[byte
].next_table
);
534 tables
[depth
+ 1] = &table
->entries
[byte
].next_table
;
535 table
= table
->entries
[byte
].next_table
;
537 validbits
-= PLC_BITS
;
540 trie_walk_affected (validbits
, table
, bytes
[depth
], pentry
, trie_uninstall_fn
);
542 for (; depth
> 0; depth
--)
543 if (trie_table_empty (*tables
[depth
]))
545 XFREE (MTYPE_PREFIX_LIST_TRIE
, *tables
[depth
]);
546 *tables
[depth
] = NULL
;
552 prefix_list_entry_delete (struct prefix_list
*plist
,
553 struct prefix_list_entry
*pentry
,
556 prefix_list_trie_del (plist
, pentry
);
558 if (plist
== NULL
|| pentry
== NULL
)
561 pentry
->prev
->next
= pentry
->next
;
563 plist
->head
= pentry
->next
;
565 pentry
->next
->prev
= pentry
->prev
;
567 plist
->tail
= pentry
->prev
;
569 prefix_list_entry_free (pentry
);
575 route_map_notify_dependencies(plist
->name
, RMAP_EVENT_PLIST_DELETED
);
576 if (plist
->master
->delete_hook
)
577 (*plist
->master
->delete_hook
) (plist
);
579 if (plist
->head
== NULL
&& plist
->tail
== NULL
&& plist
->desc
== NULL
)
580 prefix_list_delete (plist
);
582 plist
->master
->recent
= plist
;
586 static void trie_install_fn (struct prefix_list_entry
*object
,
587 struct prefix_list_entry
**updptr
)
591 if (*updptr
== object
)
593 if ((*updptr
)->prefix
.prefixlen
< object
->prefix
.prefixlen
)
595 if ((*updptr
)->seq
> object
->seq
)
597 updptr
= &(*updptr
)->next_best
;
600 if (!object
->next_best
)
601 object
->next_best
= *updptr
;
603 assert (object
->next_best
== *updptr
|| !*updptr
);
609 prefix_list_trie_add (struct prefix_list
*plist
,
610 struct prefix_list_entry
*pentry
)
612 size_t depth
= plist
->master
->trie_depth
;
613 uint8_t *bytes
= &pentry
->prefix
.u
.prefix
;
614 size_t validbits
= pentry
->prefix
.prefixlen
;
615 struct pltrie_table
*table
;
618 while (validbits
> PLC_BITS
&& depth
> 1)
620 if (!table
->entries
[*bytes
].next_table
)
621 table
->entries
[*bytes
].next_table
= XCALLOC (MTYPE_PREFIX_LIST_TRIE
,
622 sizeof(struct pltrie_table
));
623 table
= table
->entries
[*bytes
].next_table
;
626 validbits
-= PLC_BITS
;
629 trie_walk_affected (validbits
, table
, *bytes
, pentry
, trie_install_fn
);
633 prefix_list_entry_add (struct prefix_list
*plist
,
634 struct prefix_list_entry
*pentry
)
636 struct prefix_list_entry
*replace
;
637 struct prefix_list_entry
*point
;
639 /* Automatic asignment of seq no. */
640 if (pentry
->seq
== -1)
641 pentry
->seq
= prefix_new_seq_get (plist
);
643 if (plist
->tail
&& pentry
->seq
> plist
->tail
->seq
)
647 /* Is there any same seq prefix list entry? */
648 replace
= prefix_seq_check (plist
, pentry
->seq
);
650 prefix_list_entry_delete (plist
, replace
, 0);
652 /* Check insert point. */
653 for (point
= plist
->head
; point
; point
= point
->next
)
654 if (point
->seq
>= pentry
->seq
)
658 /* In case of this is the first element of the list. */
659 pentry
->next
= point
;
664 point
->prev
->next
= pentry
;
666 plist
->head
= pentry
;
668 pentry
->prev
= point
->prev
;
669 point
->prev
= pentry
;
674 plist
->tail
->next
= pentry
;
676 plist
->head
= pentry
;
678 pentry
->prev
= plist
->tail
;
679 plist
->tail
= pentry
;
682 prefix_list_trie_add (plist
, pentry
);
684 /* Increment count. */
687 /* Run hook function. */
688 if (plist
->master
->add_hook
)
689 (*plist
->master
->add_hook
) (plist
);
691 route_map_notify_dependencies(plist
->name
, RMAP_EVENT_PLIST_ADDED
);
692 plist
->master
->recent
= plist
;
695 /* Return string of prefix_list_type. */
697 prefix_list_type_str (struct prefix_list_entry
*pentry
)
699 switch (pentry
->type
)
711 prefix_list_entry_match (struct prefix_list_entry
*pentry
, struct prefix
*p
)
715 ret
= prefix_match (&pentry
->prefix
, p
);
719 /* In case of le nor ge is specified, exact match is performed. */
720 if (! pentry
->le
&& ! pentry
->ge
)
722 if (pentry
->prefix
.prefixlen
!= p
->prefixlen
)
728 if (p
->prefixlen
> pentry
->le
)
732 if (p
->prefixlen
< pentry
->ge
)
738 enum prefix_list_type
739 prefix_list_apply (struct prefix_list
*plist
, void *object
)
741 struct prefix_list_entry
*pentry
, *pbest
= NULL
;
743 struct prefix
*p
= (struct prefix
*) object
;
744 uint8_t *byte
= &p
->u
.prefix
;
746 size_t validbits
= p
->prefixlen
;
747 struct pltrie_table
*table
;
752 if (plist
->count
== 0)
753 return PREFIX_PERMIT
;
755 depth
= plist
->master
->trie_depth
;
759 for (pentry
= table
->entries
[*byte
].up_chain
; pentry
; pentry
= pentry
->next_best
)
761 if (pbest
&& pbest
->seq
< pentry
->seq
)
763 if (prefix_list_entry_match (pentry
, p
))
767 if (validbits
<= PLC_BITS
)
769 validbits
-= PLC_BITS
;
773 if (!table
->entries
[*byte
].next_table
)
776 table
= table
->entries
[*byte
].next_table
;
781 for (pentry
= table
->entries
[*byte
].final_chain
; pentry
; pentry
= pentry
->next_best
)
783 if (pbest
&& pbest
->seq
< pentry
->seq
)
785 if (prefix_list_entry_match (pentry
, p
))
797 static void __attribute__ ((unused
))
798 prefix_list_print (struct prefix_list
*plist
)
800 struct prefix_list_entry
*pentry
;
805 printf ("ip prefix-list %s: %d entries\n", plist
->name
, plist
->count
);
807 for (pentry
= plist
->head
; pentry
; pentry
= pentry
->next
)
810 printf ("any %s\n", prefix_list_type_str (pentry
));
818 printf (" seq %u %s %s/%d",
820 prefix_list_type_str (pentry
),
821 inet_ntop (p
->family
, &p
->u
.prefix
, buf
, BUFSIZ
),
824 printf (" ge %d", pentry
->ge
);
826 printf (" le %d", pentry
->le
);
832 /* Retrun 1 when plist already include pentry policy. */
833 static struct prefix_list_entry
*
834 prefix_entry_dup_check (struct prefix_list
*plist
,
835 struct prefix_list_entry
*new)
837 size_t depth
, maxdepth
= plist
->master
->trie_depth
;
838 uint8_t byte
, *bytes
= &new->prefix
.u
.prefix
;
839 size_t validbits
= new->prefix
.prefixlen
;
840 struct pltrie_table
*table
;
841 struct prefix_list_entry
*pentry
;
845 seq
= prefix_new_seq_get (plist
);
850 for (depth
= 0; validbits
> PLC_BITS
&& depth
< maxdepth
- 1; depth
++)
853 if (!table
->entries
[byte
].next_table
)
856 table
= table
->entries
[byte
].next_table
;
857 validbits
-= PLC_BITS
;
861 if (validbits
> PLC_BITS
)
862 pentry
= table
->entries
[byte
].final_chain
;
864 pentry
= table
->entries
[byte
].up_chain
;
866 for (; pentry
; pentry
= pentry
->next_best
)
868 if (prefix_same (&pentry
->prefix
, &new->prefix
)
869 && pentry
->type
== new->type
870 && pentry
->le
== new->le
871 && pentry
->ge
== new->ge
872 && pentry
->seq
!= seq
)
879 vty_invalid_prefix_range (struct vty
*vty
, const char *prefix
)
881 vty_out (vty
, "%% Invalid prefix range for %s, make sure: len < ge-value <= le-value%s",
882 prefix
, VTY_NEWLINE
);
887 vty_prefix_list_install (struct vty
*vty
, afi_t afi
, const char *name
,
888 const char *seq
, const char *typestr
,
889 const char *prefix
, const char *ge
, const char *le
)
892 enum prefix_list_type type
;
893 struct prefix_list
*plist
;
894 struct prefix_list_entry
*pentry
;
895 struct prefix_list_entry
*dup
;
896 struct prefix p
, p_tmp
;
902 /* Sequential number. */
906 /* ge and le number */
912 /* Check filter type. */
913 if (strncmp ("permit", typestr
, 1) == 0)
914 type
= PREFIX_PERMIT
;
915 else if (strncmp ("deny", typestr
, 1) == 0)
919 vty_out (vty
, "%% prefix type must be permit or deny%s", VTY_NEWLINE
);
923 /* "any" is special token for matching any IPv4 addresses. */
927 if (strncmp ("any", prefix
, strlen (prefix
)) == 0)
929 ret
= str2prefix_ipv4 ("0.0.0.0/0", (struct prefix_ipv4
*) &p
);
931 lenum
= IPV4_MAX_BITLEN
;
935 ret
= str2prefix_ipv4 (prefix
, (struct prefix_ipv4
*) &p
);
939 vty_out (vty
, "%% Malformed IPv4 prefix%s", VTY_NEWLINE
);
943 /* make a copy to verify prefix matches mask length */
944 prefix_copy (&p_tmp
, &p
);
945 apply_mask_ipv4 ((struct prefix_ipv4
*) &p_tmp
);
949 if (strncmp ("any", prefix
, strlen (prefix
)) == 0)
951 ret
= str2prefix_ipv6 ("::/0", (struct prefix_ipv6
*) &p
);
953 lenum
= IPV6_MAX_BITLEN
;
957 ret
= str2prefix_ipv6 (prefix
, (struct prefix_ipv6
*) &p
);
961 vty_out (vty
, "%% Malformed IPv6 prefix%s", VTY_NEWLINE
);
965 /* make a copy to verify prefix matches mask length */
966 prefix_copy (&p_tmp
, &p
);
967 apply_mask_ipv6 ((struct prefix_ipv6
*) &p_tmp
);
972 vty_out (vty
, "%% Unrecognized AFI (%d)%s", afi
, VTY_NEWLINE
);
977 /* If prefix has bits not under the mask, adjust it to fit */
978 if (!prefix_same (&p_tmp
, &p
))
980 char buf
[PREFIX2STR_BUFFER
];
981 char buf_tmp
[PREFIX2STR_BUFFER
];
982 prefix2str(&p
, buf
, sizeof(buf
));
983 prefix2str(&p_tmp
, buf_tmp
, sizeof(buf_tmp
));
984 zlog_warn ("Prefix-list %s prefix changed from %s to %s to match length",
989 /* ge and le check. */
990 if (genum
&& (genum
<= p
.prefixlen
))
991 return vty_invalid_prefix_range (vty
, prefix
);
993 if (lenum
&& (lenum
<= p
.prefixlen
))
994 return vty_invalid_prefix_range (vty
, prefix
);
996 if (lenum
&& (genum
> lenum
))
997 return vty_invalid_prefix_range (vty
, prefix
);
999 if (genum
&& (lenum
== (afi
== AFI_IP
? 32 : 128)))
1002 /* Get prefix_list with name. */
1003 plist
= prefix_list_get (afi
, 0, name
);
1005 /* Make prefix entry. */
1006 pentry
= prefix_list_entry_make (&p
, type
, seqnum
, lenum
, genum
, any
);
1008 /* Check same policy. */
1009 dup
= prefix_entry_dup_check (plist
, pentry
);
1013 prefix_list_entry_free (pentry
);
1017 /* Install new filter to the access_list. */
1018 prefix_list_entry_add (plist
, pentry
);
1024 vty_prefix_list_uninstall (struct vty
*vty
, afi_t afi
, const char *name
,
1025 const char *seq
, const char *typestr
,
1026 const char *prefix
, const char *ge
, const char *le
)
1029 enum prefix_list_type type
;
1030 struct prefix_list
*plist
;
1031 struct prefix_list_entry
*pentry
;
1037 /* Check prefix list name. */
1038 plist
= prefix_list_lookup (afi
, name
);
1041 vty_out (vty
, "%% Can't find specified prefix-list%s", VTY_NEWLINE
);
1045 /* Only prefix-list name specified, delete the entire prefix-list. */
1046 if (seq
== NULL
&& typestr
== NULL
&& prefix
== NULL
&&
1047 ge
== NULL
&& le
== NULL
)
1049 prefix_list_delete (plist
);
1053 /* We must have, at a minimum, both the type and prefix here */
1054 if ((typestr
== NULL
) || (prefix
== NULL
))
1056 vty_out (vty
, "%% Both prefix and type required%s", VTY_NEWLINE
);
1060 /* Check sequence number. */
1062 seqnum
= atoi (seq
);
1064 /* ge and le number */
1070 /* Check of filter type. */
1071 if (strncmp ("permit", typestr
, 1) == 0)
1072 type
= PREFIX_PERMIT
;
1073 else if (strncmp ("deny", typestr
, 1) == 0)
1077 vty_out (vty
, "%% prefix type must be permit or deny%s", VTY_NEWLINE
);
1081 /* "any" is special token for matching any IPv4 addresses. */
1084 if (strncmp ("any", prefix
, strlen (prefix
)) == 0)
1086 ret
= str2prefix_ipv4 ("0.0.0.0/0", (struct prefix_ipv4
*) &p
);
1088 lenum
= IPV4_MAX_BITLEN
;
1091 ret
= str2prefix_ipv4 (prefix
, (struct prefix_ipv4
*) &p
);
1095 vty_out (vty
, "%% Malformed IPv4 prefix%s", VTY_NEWLINE
);
1099 else if (afi
== AFI_IP6
)
1101 if (strncmp ("any", prefix
, strlen (prefix
)) == 0)
1103 ret
= str2prefix_ipv6 ("::/0", (struct prefix_ipv6
*) &p
);
1105 lenum
= IPV6_MAX_BITLEN
;
1108 ret
= str2prefix_ipv6 (prefix
, (struct prefix_ipv6
*) &p
);
1112 vty_out (vty
, "%% Malformed IPv6 prefix%s", VTY_NEWLINE
);
1117 /* Lookup prefix entry. */
1118 pentry
= prefix_list_entry_lookup(plist
, &p
, type
, seqnum
, lenum
, genum
);
1122 vty_out (vty
, "%% Can't find specified prefix-list%s", VTY_NEWLINE
);
1126 /* Install new filter to the access_list. */
1127 prefix_list_entry_delete (plist
, pentry
, 1);
1133 vty_prefix_list_desc_unset (struct vty
*vty
, afi_t afi
, const char *name
)
1135 struct prefix_list
*plist
;
1137 plist
= prefix_list_lookup (afi
, name
);
1140 vty_out (vty
, "%% Can't find specified prefix-list%s", VTY_NEWLINE
);
1146 XFREE (MTYPE_TMP
, plist
->desc
);
1150 if (plist
->head
== NULL
&& plist
->tail
== NULL
&& plist
->desc
== NULL
)
1151 prefix_list_delete (plist
);
1167 vty_show_prefix_entry (struct vty
*vty
, afi_t afi
, struct prefix_list
*plist
,
1168 struct prefix_master
*master
, enum display_type dtype
,
1171 struct prefix_list_entry
*pentry
;
1173 /* Print the name of the protocol */
1175 vty_out (vty
, "%s: ", zlog_proto_names
[zlog_default
->protocol
]);
1177 if (dtype
== normal_display
)
1179 vty_out (vty
, "ip%s prefix-list %s: %d entries%s",
1180 afi
== AFI_IP
? "" : "v6",
1181 plist
->name
, plist
->count
, VTY_NEWLINE
);
1183 vty_out (vty
, " Description: %s%s", plist
->desc
, VTY_NEWLINE
);
1185 else if (dtype
== summary_display
|| dtype
== detail_display
)
1187 vty_out (vty
, "ip%s prefix-list %s:%s",
1188 afi
== AFI_IP
? "" : "v6", plist
->name
, VTY_NEWLINE
);
1191 vty_out (vty
, " Description: %s%s", plist
->desc
, VTY_NEWLINE
);
1193 vty_out (vty
, " count: %d, range entries: %d, sequences: %u - %u%s",
1194 plist
->count
, plist
->rangecount
,
1195 plist
->head
? plist
->head
->seq
: 0,
1196 plist
->tail
? plist
->tail
->seq
: 0,
1200 if (dtype
!= summary_display
)
1202 for (pentry
= plist
->head
; pentry
; pentry
= pentry
->next
)
1204 if (dtype
== sequential_display
&& pentry
->seq
!= seqnum
)
1210 vty_out (vty
, "seq %u ", pentry
->seq
);
1212 vty_out (vty
, "%s ", prefix_list_type_str (pentry
));
1215 vty_out (vty
, "any");
1218 struct prefix
*p
= &pentry
->prefix
;
1221 vty_out (vty
, "%s/%d",
1222 inet_ntop (p
->family
, &p
->u
.prefix
, buf
, BUFSIZ
),
1226 vty_out (vty
, " ge %d", pentry
->ge
);
1228 vty_out (vty
, " le %d", pentry
->le
);
1231 if (dtype
== detail_display
|| dtype
== sequential_display
)
1232 vty_out (vty
, " (hit count: %ld, refcount: %ld)",
1233 pentry
->hitcnt
, pentry
->refcnt
);
1235 vty_out (vty
, "%s", VTY_NEWLINE
);
1241 vty_show_prefix_list (struct vty
*vty
, afi_t afi
, const char *name
,
1242 const char *seq
, enum display_type dtype
)
1244 struct prefix_list
*plist
;
1245 struct prefix_master
*master
;
1248 master
= prefix_master_get (afi
, 0);
1253 seqnum
= atoi (seq
);
1257 plist
= prefix_list_lookup (afi
, name
);
1260 vty_out (vty
, "%% Can't find specified prefix-list%s", VTY_NEWLINE
);
1263 vty_show_prefix_entry (vty
, afi
, plist
, master
, dtype
, seqnum
);
1267 if (dtype
== detail_display
|| dtype
== summary_display
)
1270 vty_out (vty
, "Prefix-list with the last deletion/insertion: %s%s",
1271 master
->recent
->name
, VTY_NEWLINE
);
1274 for (plist
= master
->num
.head
; plist
; plist
= plist
->next
)
1275 vty_show_prefix_entry (vty
, afi
, plist
, master
, dtype
, seqnum
);
1277 for (plist
= master
->str
.head
; plist
; plist
= plist
->next
)
1278 vty_show_prefix_entry (vty
, afi
, plist
, master
, dtype
, seqnum
);
1285 vty_show_prefix_list_prefix (struct vty
*vty
, afi_t afi
, const char *name
,
1286 const char *prefix
, enum display_type type
)
1288 struct prefix_list
*plist
;
1289 struct prefix_list_entry
*pentry
;
1294 plist
= prefix_list_lookup (afi
, name
);
1297 vty_out (vty
, "%% Can't find specified prefix-list%s", VTY_NEWLINE
);
1301 ret
= str2prefix (prefix
, &p
);
1304 vty_out (vty
, "%% prefix is malformed%s", VTY_NEWLINE
);
1308 for (pentry
= plist
->head
; pentry
; pentry
= pentry
->next
)
1312 if (type
== normal_display
|| type
== first_match_display
)
1313 if (prefix_same (&p
, &pentry
->prefix
))
1316 if (type
== longer_display
)
1317 if (prefix_match (&p
, &pentry
->prefix
))
1322 vty_out (vty
, " seq %u %s ",
1324 prefix_list_type_str (pentry
));
1327 vty_out (vty
, "any");
1330 struct prefix
*p
= &pentry
->prefix
;
1333 vty_out (vty
, "%s/%d",
1334 inet_ntop (p
->family
, &p
->u
.prefix
, buf
, BUFSIZ
),
1338 vty_out (vty
, " ge %d", pentry
->ge
);
1340 vty_out (vty
, " le %d", pentry
->le
);
1343 if (type
== normal_display
|| type
== first_match_display
)
1344 vty_out (vty
, " (hit count: %ld, refcount: %ld)",
1345 pentry
->hitcnt
, pentry
->refcnt
);
1347 vty_out (vty
, "%s", VTY_NEWLINE
);
1349 if (type
== first_match_display
)
1357 vty_clear_prefix_list (struct vty
*vty
, afi_t afi
, const char *name
,
1360 struct prefix_master
*master
;
1361 struct prefix_list
*plist
;
1362 struct prefix_list_entry
*pentry
;
1366 master
= prefix_master_get (afi
, 0);
1370 if (name
== NULL
&& prefix
== NULL
)
1372 for (plist
= master
->num
.head
; plist
; plist
= plist
->next
)
1373 for (pentry
= plist
->head
; pentry
; pentry
= pentry
->next
)
1376 for (plist
= master
->str
.head
; plist
; plist
= plist
->next
)
1377 for (pentry
= plist
->head
; pentry
; pentry
= pentry
->next
)
1382 plist
= prefix_list_lookup (afi
, name
);
1385 vty_out (vty
, "%% Can't find specified prefix-list%s", VTY_NEWLINE
);
1391 ret
= str2prefix (prefix
, &p
);
1394 vty_out (vty
, "%% prefix is malformed%s", VTY_NEWLINE
);
1399 for (pentry
= plist
->head
; pentry
; pentry
= pentry
->next
)
1403 if (prefix_match (&pentry
->prefix
, &p
))
1413 DEFUN (ip_prefix_list
,
1415 "ip prefix-list WORD <deny|permit> <A.B.C.D/M|any>",
1418 "Name of a prefix list\n"
1419 "Specify packets to reject\n"
1420 "Specify packets to forward\n"
1421 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
1422 "Any prefix match. Same as \"0.0.0.0/0 le 32\"\n")
1425 int idx_permit_deny
= 3;
1426 int idx_ipv4_any
= 4;
1427 return vty_prefix_list_install (vty
, AFI_IP
, argv
[idx_word
]->arg
, NULL
,
1428 argv
[idx_permit_deny
]->arg
, argv
[idx_ipv4_any
]->arg
, NULL
, NULL
);
1431 DEFUN (ip_prefix_list_ge
,
1432 ip_prefix_list_ge_cmd
,
1433 "ip prefix-list WORD <deny|permit> A.B.C.D/M ge (0-32)",
1436 "Name of a prefix list\n"
1437 "Specify packets to reject\n"
1438 "Specify packets to forward\n"
1439 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
1440 "Minimum prefix length to be matched\n"
1441 "Minimum prefix length\n")
1444 int idx_permit_deny
= 3;
1445 int idx_ipv4_prefixlen
= 4;
1447 return vty_prefix_list_install (vty
, AFI_IP
, argv
[idx_word
]->arg
, NULL
, argv
[idx_permit_deny
]->arg
,
1448 argv
[idx_ipv4_prefixlen
]->arg
, argv
[idx_number
]->arg
, NULL
);
1451 DEFUN (ip_prefix_list_ge_le
,
1452 ip_prefix_list_ge_le_cmd
,
1453 "ip prefix-list WORD <deny|permit> A.B.C.D/M ge (0-32) le (0-32)",
1456 "Name of a prefix list\n"
1457 "Specify packets to reject\n"
1458 "Specify packets to forward\n"
1459 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
1460 "Minimum prefix length to be matched\n"
1461 "Minimum prefix length\n"
1462 "Maximum prefix length to be matched\n"
1463 "Maximum prefix length\n")
1466 int idx_permit_deny
= 3;
1467 int idx_ipv4_prefixlen
= 4;
1469 int idx_number_2
= 8;
1470 return vty_prefix_list_install (vty
, AFI_IP
, argv
[idx_word
]->arg
, NULL
, argv
[idx_permit_deny
]->arg
,
1471 argv
[idx_ipv4_prefixlen
]->arg
, argv
[idx_number
]->arg
, argv
[idx_number_2
]->arg
);
1474 DEFUN (ip_prefix_list_le
,
1475 ip_prefix_list_le_cmd
,
1476 "ip prefix-list WORD <deny|permit> A.B.C.D/M le (0-32)",
1479 "Name of a prefix list\n"
1480 "Specify packets to reject\n"
1481 "Specify packets to forward\n"
1482 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
1483 "Maximum prefix length to be matched\n"
1484 "Maximum prefix length\n")
1487 int idx_permit_deny
= 3;
1488 int idx_ipv4_prefixlen
= 4;
1490 return vty_prefix_list_install (vty
, AFI_IP
, argv
[idx_word
]->arg
, NULL
, argv
[idx_permit_deny
]->arg
,
1491 argv
[idx_ipv4_prefixlen
]->arg
, NULL
, argv
[idx_number
]->arg
);
1494 DEFUN (ip_prefix_list_le_ge
,
1495 ip_prefix_list_le_ge_cmd
,
1496 "ip prefix-list WORD <deny|permit> A.B.C.D/M le (0-32) ge (0-32)",
1499 "Name of a prefix list\n"
1500 "Specify packets to reject\n"
1501 "Specify packets to forward\n"
1502 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
1503 "Maximum prefix length to be matched\n"
1504 "Maximum prefix length\n"
1505 "Minimum prefix length to be matched\n"
1506 "Minimum prefix length\n")
1509 int idx_permit_deny
= 3;
1510 int idx_ipv4_prefixlen
= 4;
1512 int idx_number_2
= 8;
1513 return vty_prefix_list_install (vty
, AFI_IP
, argv
[idx_word
]->arg
, NULL
, argv
[idx_permit_deny
]->arg
,
1514 argv
[idx_ipv4_prefixlen
]->arg
, argv
[idx_number_2
]->arg
, argv
[idx_number
]->arg
);
1517 DEFUN (ip_prefix_list_seq
,
1518 ip_prefix_list_seq_cmd
,
1519 "ip prefix-list WORD seq (1-4294967295) <deny|permit> <A.B.C.D/M|any>",
1522 "Name of a prefix list\n"
1523 "sequence number of an entry\n"
1525 "Specify packets to reject\n"
1526 "Specify packets to forward\n"
1527 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
1528 "Any prefix match. Same as \"0.0.0.0/0 le 32\"\n")
1532 int idx_permit_deny
= 5;
1533 int idx_ipv4_any
= 6;
1534 return vty_prefix_list_install (vty
, AFI_IP
, argv
[idx_word
]->arg
, argv
[idx_number
]->arg
, argv
[idx_permit_deny
]->arg
,
1535 argv
[idx_ipv4_any
]->arg
, NULL
, NULL
);
1538 DEFUN (ip_prefix_list_seq_ge
,
1539 ip_prefix_list_seq_ge_cmd
,
1540 "ip prefix-list WORD seq (1-4294967295) <deny|permit> A.B.C.D/M ge (0-32)",
1543 "Name of a prefix list\n"
1544 "sequence number of an entry\n"
1546 "Specify packets to reject\n"
1547 "Specify packets to forward\n"
1548 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
1549 "Minimum prefix length to be matched\n"
1550 "Minimum prefix length\n")
1554 int idx_permit_deny
= 5;
1555 int idx_ipv4_prefixlen
= 6;
1556 int idx_number_2
= 8;
1557 return vty_prefix_list_install (vty
, AFI_IP
, argv
[idx_word
]->arg
, argv
[idx_number
]->arg
, argv
[idx_permit_deny
]->arg
,
1558 argv
[idx_ipv4_prefixlen
]->arg
, argv
[idx_number_2
]->arg
, NULL
);
1561 DEFUN (ip_prefix_list_seq_ge_le
,
1562 ip_prefix_list_seq_ge_le_cmd
,
1563 "ip prefix-list WORD seq (1-4294967295) <deny|permit> A.B.C.D/M ge (0-32) le (0-32)",
1566 "Name of a prefix list\n"
1567 "sequence number of an entry\n"
1569 "Specify packets to reject\n"
1570 "Specify packets to forward\n"
1571 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
1572 "Minimum prefix length to be matched\n"
1573 "Minimum prefix length\n"
1574 "Maximum prefix length to be matched\n"
1575 "Maximum prefix length\n")
1579 int idx_permit_deny
= 5;
1580 int idx_ipv4_prefixlen
= 6;
1581 int idx_number_2
= 8;
1582 int idx_number_3
= 10;
1583 return vty_prefix_list_install (vty
, AFI_IP
, argv
[idx_word
]->arg
, argv
[idx_number
]->arg
, argv
[idx_permit_deny
]->arg
,
1584 argv
[idx_ipv4_prefixlen
]->arg
, argv
[idx_number_2
]->arg
, argv
[idx_number_3
]->arg
);
1587 DEFUN (ip_prefix_list_seq_le
,
1588 ip_prefix_list_seq_le_cmd
,
1589 "ip prefix-list WORD seq (1-4294967295) <deny|permit> A.B.C.D/M le (0-32)",
1592 "Name of a prefix list\n"
1593 "sequence number of an entry\n"
1595 "Specify packets to reject\n"
1596 "Specify packets to forward\n"
1597 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
1598 "Maximum prefix length to be matched\n"
1599 "Maximum prefix length\n")
1603 int idx_permit_deny
= 5;
1604 int idx_ipv4_prefixlen
= 6;
1605 int idx_number_2
= 8;
1606 return vty_prefix_list_install (vty
, AFI_IP
, argv
[idx_word
]->arg
, argv
[idx_number
]->arg
, argv
[idx_permit_deny
]->arg
,
1607 argv
[idx_ipv4_prefixlen
]->arg
, NULL
, argv
[idx_number_2
]->arg
);
1610 DEFUN (ip_prefix_list_seq_le_ge
,
1611 ip_prefix_list_seq_le_ge_cmd
,
1612 "ip prefix-list WORD seq (1-4294967295) <deny|permit> A.B.C.D/M le (0-32) ge (0-32)",
1615 "Name of a prefix list\n"
1616 "sequence number of an entry\n"
1618 "Specify packets to reject\n"
1619 "Specify packets to forward\n"
1620 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
1621 "Maximum prefix length to be matched\n"
1622 "Maximum prefix length\n"
1623 "Minimum prefix length to be matched\n"
1624 "Minimum prefix length\n")
1628 int idx_permit_deny
= 5;
1629 int idx_ipv4_prefixlen
= 6;
1630 int idx_number_2
= 8;
1631 int idx_number_3
= 10;
1632 return vty_prefix_list_install (vty
, AFI_IP
, argv
[idx_word
]->arg
, argv
[idx_number
]->arg
, argv
[idx_permit_deny
]->arg
,
1633 argv
[idx_ipv4_prefixlen
]->arg
, argv
[idx_number_3
]->arg
, argv
[idx_number_2
]->arg
);
1636 DEFUN (no_ip_prefix_list
,
1637 no_ip_prefix_list_cmd
,
1638 "no ip prefix-list WORD",
1642 "Name of a prefix list\n")
1645 return vty_prefix_list_uninstall (vty
, AFI_IP
, argv
[idx_word
]->arg
, NULL
, NULL
,
1649 DEFUN (no_ip_prefix_list_prefix
,
1650 no_ip_prefix_list_prefix_cmd
,
1651 "no ip prefix-list WORD <deny|permit> <A.B.C.D/M|any>",
1655 "Name of a prefix list\n"
1656 "Specify packets to reject\n"
1657 "Specify packets to forward\n"
1658 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
1659 "Any prefix match. Same as \"0.0.0.0/0 le 32\"\n")
1662 int idx_permit_deny
= 4;
1663 int idx_ipv4_any
= 5;
1664 return vty_prefix_list_uninstall (vty
, AFI_IP
, argv
[idx_word
]->arg
, NULL
, argv
[idx_permit_deny
]->arg
,
1665 argv
[idx_ipv4_any
]->arg
, NULL
, NULL
);
1668 DEFUN (no_ip_prefix_list_ge
,
1669 no_ip_prefix_list_ge_cmd
,
1670 "no ip prefix-list WORD <deny|permit> A.B.C.D/M ge (0-32)",
1674 "Name of a prefix list\n"
1675 "Specify packets to reject\n"
1676 "Specify packets to forward\n"
1677 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
1678 "Minimum prefix length to be matched\n"
1679 "Minimum prefix length\n")
1682 int idx_permit_deny
= 4;
1683 int idx_ipv4_prefixlen
= 5;
1685 return vty_prefix_list_uninstall (vty
, AFI_IP
, argv
[idx_word
]->arg
, NULL
, argv
[idx_permit_deny
]->arg
,
1686 argv
[idx_ipv4_prefixlen
]->arg
, argv
[idx_number
]->arg
, NULL
);
1689 DEFUN (no_ip_prefix_list_ge_le
,
1690 no_ip_prefix_list_ge_le_cmd
,
1691 "no ip prefix-list WORD <deny|permit> A.B.C.D/M ge (0-32) le (0-32)",
1695 "Name of a prefix list\n"
1696 "Specify packets to reject\n"
1697 "Specify packets to forward\n"
1698 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
1699 "Minimum prefix length to be matched\n"
1700 "Minimum prefix length\n"
1701 "Maximum prefix length to be matched\n"
1702 "Maximum prefix length\n")
1705 int idx_permit_deny
= 4;
1706 int idx_ipv4_prefixlen
= 5;
1708 int idx_number_2
= 9;
1709 return vty_prefix_list_uninstall (vty
, AFI_IP
, argv
[idx_word
]->arg
, NULL
, argv
[idx_permit_deny
]->arg
,
1710 argv
[idx_ipv4_prefixlen
]->arg
, argv
[idx_number
]->arg
, argv
[idx_number_2
]->arg
);
1713 DEFUN (no_ip_prefix_list_le
,
1714 no_ip_prefix_list_le_cmd
,
1715 "no ip prefix-list WORD <deny|permit> A.B.C.D/M le (0-32)",
1719 "Name of a prefix list\n"
1720 "Specify packets to reject\n"
1721 "Specify packets to forward\n"
1722 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
1723 "Maximum prefix length to be matched\n"
1724 "Maximum prefix length\n")
1727 int idx_permit_deny
= 4;
1728 int idx_ipv4_prefixlen
= 5;
1730 return vty_prefix_list_uninstall (vty
, AFI_IP
, argv
[idx_word
]->arg
, NULL
, argv
[idx_permit_deny
]->arg
,
1731 argv
[idx_ipv4_prefixlen
]->arg
, NULL
, argv
[idx_number
]->arg
);
1734 DEFUN (no_ip_prefix_list_le_ge
,
1735 no_ip_prefix_list_le_ge_cmd
,
1736 "no ip prefix-list WORD <deny|permit> A.B.C.D/M le (0-32) ge (0-32)",
1740 "Name of a prefix list\n"
1741 "Specify packets to reject\n"
1742 "Specify packets to forward\n"
1743 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
1744 "Maximum prefix length to be matched\n"
1745 "Maximum prefix length\n"
1746 "Minimum prefix length to be matched\n"
1747 "Minimum prefix length\n")
1750 int idx_permit_deny
= 4;
1751 int idx_ipv4_prefixlen
= 5;
1753 int idx_number_2
= 9;
1754 return vty_prefix_list_uninstall (vty
, AFI_IP
, argv
[idx_word
]->arg
, NULL
, argv
[idx_permit_deny
]->arg
,
1755 argv
[idx_ipv4_prefixlen
]->arg
, argv
[idx_number_2
]->arg
, argv
[idx_number
]->arg
);
1758 DEFUN (no_ip_prefix_list_seq
,
1759 no_ip_prefix_list_seq_cmd
,
1760 "no ip prefix-list WORD seq (1-4294967295) <deny|permit> <A.B.C.D/M|any>",
1764 "Name of a prefix list\n"
1765 "sequence number of an entry\n"
1767 "Specify packets to reject\n"
1768 "Specify packets to forward\n"
1769 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
1770 "Any prefix match. Same as \"0.0.0.0/0 le 32\"\n")
1774 int idx_permit_deny
= 6;
1775 int idx_ipv4_any
= 7;
1776 return vty_prefix_list_uninstall (vty
, AFI_IP
, argv
[idx_word
]->arg
, argv
[idx_number
]->arg
, argv
[idx_permit_deny
]->arg
,
1777 argv
[idx_ipv4_any
]->arg
, NULL
, NULL
);
1780 DEFUN (no_ip_prefix_list_seq_ge
,
1781 no_ip_prefix_list_seq_ge_cmd
,
1782 "no ip prefix-list WORD seq (1-4294967295) <deny|permit> A.B.C.D/M ge (0-32)",
1786 "Name of a prefix list\n"
1787 "sequence number of an entry\n"
1789 "Specify packets to reject\n"
1790 "Specify packets to forward\n"
1791 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
1792 "Minimum prefix length to be matched\n"
1793 "Minimum prefix length\n")
1797 int idx_permit_deny
= 6;
1798 int idx_ipv4_prefixlen
= 7;
1799 int idx_number_2
= 9;
1800 return vty_prefix_list_uninstall (vty
, AFI_IP
, argv
[idx_word
]->arg
, argv
[idx_number
]->arg
, argv
[idx_permit_deny
]->arg
,
1801 argv
[idx_ipv4_prefixlen
]->arg
, argv
[idx_number_2
]->arg
, NULL
);
1804 DEFUN (no_ip_prefix_list_seq_ge_le
,
1805 no_ip_prefix_list_seq_ge_le_cmd
,
1806 "no ip prefix-list WORD seq (1-4294967295) <deny|permit> A.B.C.D/M ge (0-32) le (0-32)",
1810 "Name of a prefix list\n"
1811 "sequence number of an entry\n"
1813 "Specify packets to reject\n"
1814 "Specify packets to forward\n"
1815 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
1816 "Minimum prefix length to be matched\n"
1817 "Minimum prefix length\n"
1818 "Maximum prefix length to be matched\n"
1819 "Maximum prefix length\n")
1823 int idx_permit_deny
= 6;
1824 int idx_ipv4_prefixlen
= 7;
1825 int idx_number_2
= 9;
1826 int idx_number_3
= 11;
1827 return vty_prefix_list_uninstall (vty
, AFI_IP
, argv
[idx_word
]->arg
, argv
[idx_number
]->arg
, argv
[idx_permit_deny
]->arg
,
1828 argv
[idx_ipv4_prefixlen
]->arg
, argv
[idx_number_2
]->arg
, argv
[idx_number_3
]->arg
);
1831 DEFUN (no_ip_prefix_list_seq_le
,
1832 no_ip_prefix_list_seq_le_cmd
,
1833 "no ip prefix-list WORD seq (1-4294967295) <deny|permit> A.B.C.D/M le (0-32)",
1837 "Name of a prefix list\n"
1838 "sequence number of an entry\n"
1840 "Specify packets to reject\n"
1841 "Specify packets to forward\n"
1842 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
1843 "Maximum prefix length to be matched\n"
1844 "Maximum prefix length\n")
1848 int idx_permit_deny
= 6;
1849 int idx_ipv4_prefixlen
= 7;
1850 int idx_number_2
= 9;
1851 return vty_prefix_list_uninstall (vty
, AFI_IP
, argv
[idx_word
]->arg
, argv
[idx_number
]->arg
, argv
[idx_permit_deny
]->arg
,
1852 argv
[idx_ipv4_prefixlen
]->arg
, NULL
, argv
[idx_number_2
]->arg
);
1855 DEFUN (no_ip_prefix_list_seq_le_ge
,
1856 no_ip_prefix_list_seq_le_ge_cmd
,
1857 "no ip prefix-list WORD seq (1-4294967295) <deny|permit> A.B.C.D/M le (0-32) ge (0-32)",
1861 "Name of a prefix list\n"
1862 "sequence number of an entry\n"
1864 "Specify packets to reject\n"
1865 "Specify packets to forward\n"
1866 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
1867 "Maximum prefix length to be matched\n"
1868 "Maximum prefix length\n"
1869 "Minimum prefix length to be matched\n"
1870 "Minimum prefix length\n")
1874 int idx_permit_deny
= 6;
1875 int idx_ipv4_prefixlen
= 7;
1876 int idx_number_2
= 9;
1877 int idx_number_3
= 11;
1878 return vty_prefix_list_uninstall (vty
, AFI_IP
, argv
[idx_word
]->arg
, argv
[idx_number
]->arg
, argv
[idx_permit_deny
]->arg
,
1879 argv
[idx_ipv4_prefixlen
]->arg
, argv
[idx_number_3
]->arg
, argv
[idx_number_2
]->arg
);
1882 DEFUN (ip_prefix_list_sequence_number
,
1883 ip_prefix_list_sequence_number_cmd
,
1884 "ip prefix-list sequence-number",
1887 "Include/exclude sequence numbers in NVGEN\n")
1889 prefix_master_ipv4
.seqnum
= 1;
1893 DEFUN (no_ip_prefix_list_sequence_number
,
1894 no_ip_prefix_list_sequence_number_cmd
,
1895 "no ip prefix-list sequence-number",
1899 "Include/exclude sequence numbers in NVGEN\n")
1901 prefix_master_ipv4
.seqnum
= 0;
1905 DEFUN (ip_prefix_list_description
,
1906 ip_prefix_list_description_cmd
,
1907 "ip prefix-list WORD description LINE...",
1910 "Name of a prefix list\n"
1911 "Prefix-list specific description\n"
1912 "Up to 80 characters describing this prefix-list\n")
1916 struct prefix_list
*plist
;
1918 plist
= prefix_list_get (AFI_IP
, 0, argv
[idx_word
]->arg
);
1922 XFREE (MTYPE_TMP
, plist
->desc
);
1925 plist
->desc
= argv_concat(argv
, argc
, idx_line
);
1930 DEFUN (no_ip_prefix_list_description
,
1931 no_ip_prefix_list_description_cmd
,
1932 "no ip prefix-list WORD description",
1936 "Name of a prefix list\n"
1937 "Prefix-list specific description\n")
1940 return vty_prefix_list_desc_unset (vty
, AFI_IP
, argv
[idx_word
]->arg
);
1944 DEFUN (no_ip_prefix_list_description_comment
,
1945 no_ip_prefix_list_description_comment_cmd
,
1946 "no ip prefix-list WORD description LINE...",
1950 "Name of a prefix list\n"
1951 "Prefix-list specific description\n"
1952 "Up to 80 characters describing this prefix-list\n")
1954 return no_ip_prefix_list_description (self
, vty
, argc
, argv
);
1957 DEFUN (show_ip_prefix_list
,
1958 show_ip_prefix_list_cmd
,
1959 "show ip prefix-list",
1964 return vty_show_prefix_list (vty
, AFI_IP
, NULL
, NULL
, normal_display
);
1967 DEFUN (show_ip_prefix_list_name
,
1968 show_ip_prefix_list_name_cmd
,
1969 "show ip prefix-list WORD",
1973 "Name of a prefix list\n")
1976 return vty_show_prefix_list (vty
, AFI_IP
, argv
[idx_word
]->arg
, NULL
, normal_display
);
1979 DEFUN (show_ip_prefix_list_name_seq
,
1980 show_ip_prefix_list_name_seq_cmd
,
1981 "show ip prefix-list WORD seq (1-4294967295)",
1985 "Name of a prefix list\n"
1986 "sequence number of an entry\n"
1987 "Sequence number\n")
1991 return vty_show_prefix_list (vty
, AFI_IP
, argv
[idx_word
]->arg
, argv
[idx_number
]->arg
, sequential_display
);
1994 DEFUN (show_ip_prefix_list_prefix
,
1995 show_ip_prefix_list_prefix_cmd
,
1996 "show ip prefix-list WORD A.B.C.D/M",
2000 "Name of a prefix list\n"
2001 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n")
2004 int idx_ipv4_prefixlen
= 4;
2005 return vty_show_prefix_list_prefix (vty
, AFI_IP
, argv
[idx_word
]->arg
, argv
[idx_ipv4_prefixlen
]->arg
, normal_display
);
2008 DEFUN (show_ip_prefix_list_prefix_longer
,
2009 show_ip_prefix_list_prefix_longer_cmd
,
2010 "show ip prefix-list WORD A.B.C.D/M longer",
2014 "Name of a prefix list\n"
2015 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
2016 "Lookup longer prefix\n")
2019 int idx_ipv4_prefixlen
= 4;
2020 return vty_show_prefix_list_prefix (vty
, AFI_IP
, argv
[idx_word
]->arg
, argv
[idx_ipv4_prefixlen
]->arg
, longer_display
);
2023 DEFUN (show_ip_prefix_list_prefix_first_match
,
2024 show_ip_prefix_list_prefix_first_match_cmd
,
2025 "show ip prefix-list WORD A.B.C.D/M first-match",
2029 "Name of a prefix list\n"
2030 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
2031 "First matched prefix\n")
2034 int idx_ipv4_prefixlen
= 4;
2035 return vty_show_prefix_list_prefix (vty
, AFI_IP
, argv
[idx_word
]->arg
, argv
[idx_ipv4_prefixlen
]->arg
, first_match_display
);
2038 DEFUN (show_ip_prefix_list_summary
,
2039 show_ip_prefix_list_summary_cmd
,
2040 "show ip prefix-list summary",
2044 "Summary of prefix lists\n")
2046 return vty_show_prefix_list (vty
, AFI_IP
, NULL
, NULL
, summary_display
);
2049 DEFUN (show_ip_prefix_list_summary_name
,
2050 show_ip_prefix_list_summary_name_cmd
,
2051 "show ip prefix-list summary WORD",
2055 "Summary of prefix lists\n"
2056 "Name of a prefix list\n")
2059 return vty_show_prefix_list (vty
, AFI_IP
, argv
[idx_word
]->arg
, NULL
, summary_display
);
2063 DEFUN (show_ip_prefix_list_detail
,
2064 show_ip_prefix_list_detail_cmd
,
2065 "show ip prefix-list detail",
2069 "Detail of prefix lists\n")
2071 return vty_show_prefix_list (vty
, AFI_IP
, NULL
, NULL
, detail_display
);
2074 DEFUN (show_ip_prefix_list_detail_name
,
2075 show_ip_prefix_list_detail_name_cmd
,
2076 "show ip prefix-list detail WORD",
2080 "Detail of prefix lists\n"
2081 "Name of a prefix list\n")
2084 return vty_show_prefix_list (vty
, AFI_IP
, argv
[idx_word
]->arg
, NULL
, detail_display
);
2087 DEFUN (clear_ip_prefix_list
,
2088 clear_ip_prefix_list_cmd
,
2089 "clear ip prefix-list",
2094 return vty_clear_prefix_list (vty
, AFI_IP
, NULL
, NULL
);
2097 DEFUN (clear_ip_prefix_list_name
,
2098 clear_ip_prefix_list_name_cmd
,
2099 "clear ip prefix-list WORD",
2103 "Name of a prefix list\n")
2106 return vty_clear_prefix_list (vty
, AFI_IP
, argv
[idx_word
]->arg
, NULL
);
2109 DEFUN (clear_ip_prefix_list_name_prefix
,
2110 clear_ip_prefix_list_name_prefix_cmd
,
2111 "clear ip prefix-list WORD A.B.C.D/M",
2115 "Name of a prefix list\n"
2116 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n")
2119 int idx_ipv4_prefixlen
= 4;
2120 return vty_clear_prefix_list (vty
, AFI_IP
, argv
[idx_word
]->arg
, argv
[idx_ipv4_prefixlen
]->arg
);
2123 DEFUN (ipv6_prefix_list
,
2124 ipv6_prefix_list_cmd
,
2125 "ipv6 prefix-list WORD <deny|permit> <X:X::X:X/M|any>",
2128 "Name of a prefix list\n"
2129 "Specify packets to reject\n"
2130 "Specify packets to forward\n"
2131 "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n"
2132 "Any prefix match. Same as \"::0/0 le 128\"\n")
2135 int idx_permit_deny
= 3;
2136 int idx_ipv6_any
= 4;
2137 return vty_prefix_list_install (vty
, AFI_IP6
, argv
[idx_word
]->arg
, NULL
,
2138 argv
[idx_permit_deny
]->arg
, argv
[idx_ipv6_any
]->arg
, NULL
, NULL
);
2141 DEFUN (ipv6_prefix_list_ge
,
2142 ipv6_prefix_list_ge_cmd
,
2143 "ipv6 prefix-list WORD <deny|permit> X:X::X:X/M ge (0-128)",
2146 "Name of a prefix list\n"
2147 "Specify packets to reject\n"
2148 "Specify packets to forward\n"
2149 "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n"
2150 "Minimum prefix length to be matched\n"
2151 "Minimum prefix length\n")
2154 int idx_permit_deny
= 3;
2155 int idx_ipv6_prefixlen
= 4;
2157 return vty_prefix_list_install (vty
, AFI_IP6
, argv
[idx_word
]->arg
, NULL
, argv
[idx_permit_deny
]->arg
,
2158 argv
[idx_ipv6_prefixlen
]->arg
, argv
[idx_number
]->arg
, NULL
);
2161 DEFUN (ipv6_prefix_list_ge_le
,
2162 ipv6_prefix_list_ge_le_cmd
,
2163 "ipv6 prefix-list WORD <deny|permit> X:X::X:X/M ge (0-128) le (0-128)",
2166 "Name of a prefix list\n"
2167 "Specify packets to reject\n"
2168 "Specify packets to forward\n"
2169 "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n"
2170 "Minimum prefix length to be matched\n"
2171 "Minimum prefix length\n"
2172 "Maximum prefix length to be matched\n"
2173 "Maximum prefix length\n")
2177 int idx_permit_deny
= 3;
2178 int idx_ipv6_prefixlen
= 4;
2180 int idx_number_2
= 8;
2181 return vty_prefix_list_install (vty
, AFI_IP6
, argv
[idx_word
]->arg
, NULL
, argv
[idx_permit_deny
]->arg
,
2182 argv
[idx_ipv6_prefixlen
]->arg
, argv
[idx_number
]->arg
, argv
[idx_number_2
]->arg
);
2185 DEFUN (ipv6_prefix_list_le
,
2186 ipv6_prefix_list_le_cmd
,
2187 "ipv6 prefix-list WORD <deny|permit> X:X::X:X/M le (0-128)",
2190 "Name of a prefix list\n"
2191 "Specify packets to reject\n"
2192 "Specify packets to forward\n"
2193 "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n"
2194 "Maximum prefix length to be matched\n"
2195 "Maximum prefix length\n")
2198 int idx_permit_deny
= 3;
2199 int idx_ipv6_prefixlen
= 4;
2201 return vty_prefix_list_install (vty
, AFI_IP6
, argv
[idx_word
]->arg
, NULL
, argv
[idx_permit_deny
]->arg
,
2202 argv
[idx_ipv6_prefixlen
]->arg
, NULL
, argv
[idx_number
]->arg
);
2205 DEFUN (ipv6_prefix_list_le_ge
,
2206 ipv6_prefix_list_le_ge_cmd
,
2207 "ipv6 prefix-list WORD <deny|permit> X:X::X:X/M le (0-128) ge (0-128)",
2210 "Name of a prefix list\n"
2211 "Specify packets to reject\n"
2212 "Specify packets to forward\n"
2213 "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n"
2214 "Maximum prefix length to be matched\n"
2215 "Maximum prefix length\n"
2216 "Minimum prefix length to be matched\n"
2217 "Minimum prefix length\n")
2220 int idx_permit_deny
= 3;
2221 int idx_ipv6_prefixlen
= 4;
2223 int idx_number_2
= 8;
2224 return vty_prefix_list_install (vty
, AFI_IP6
, argv
[idx_word
]->arg
, NULL
, argv
[idx_permit_deny
]->arg
,
2225 argv
[idx_ipv6_prefixlen
]->arg
, argv
[idx_number_2
]->arg
, argv
[idx_number
]->arg
);
2228 DEFUN (ipv6_prefix_list_seq
,
2229 ipv6_prefix_list_seq_cmd
,
2230 "ipv6 prefix-list WORD seq (1-4294967295) <deny|permit> <X:X::X:X/M|any>",
2233 "Name of a prefix list\n"
2234 "sequence number of an entry\n"
2236 "Specify packets to reject\n"
2237 "Specify packets to forward\n"
2238 "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n"
2239 "Any prefix match. Same as \"::0/0 le 128\"\n")
2243 int idx_permit_deny
= 5;
2244 int idx_ipv6_any
= 6;
2245 return vty_prefix_list_install (vty
, AFI_IP6
, argv
[idx_word
]->arg
, argv
[idx_number
]->arg
, argv
[idx_permit_deny
]->arg
,
2246 argv
[idx_ipv6_any
]->arg
, NULL
, NULL
);
2249 DEFUN (ipv6_prefix_list_seq_ge
,
2250 ipv6_prefix_list_seq_ge_cmd
,
2251 "ipv6 prefix-list WORD seq (1-4294967295) <deny|permit> X:X::X:X/M ge (0-128)",
2254 "Name of a prefix list\n"
2255 "sequence number of an entry\n"
2257 "Specify packets to reject\n"
2258 "Specify packets to forward\n"
2259 "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n"
2260 "Minimum prefix length to be matched\n"
2261 "Minimum prefix length\n")
2265 int idx_permit_deny
= 5;
2266 int idx_ipv6_prefixlen
= 6;
2267 int idx_number_2
= 8;
2268 return vty_prefix_list_install (vty
, AFI_IP6
, argv
[idx_word
]->arg
, argv
[idx_number
]->arg
, argv
[idx_permit_deny
]->arg
,
2269 argv
[idx_ipv6_prefixlen
]->arg
, argv
[idx_number_2
]->arg
, NULL
);
2272 DEFUN (ipv6_prefix_list_seq_ge_le
,
2273 ipv6_prefix_list_seq_ge_le_cmd
,
2274 "ipv6 prefix-list WORD seq (1-4294967295) <deny|permit> X:X::X:X/M ge (0-128) le (0-128)",
2277 "Name of a prefix list\n"
2278 "sequence number of an entry\n"
2280 "Specify packets to reject\n"
2281 "Specify packets to forward\n"
2282 "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n"
2283 "Minimum prefix length to be matched\n"
2284 "Minimum prefix length\n"
2285 "Maximum prefix length to be matched\n"
2286 "Maximum prefix length\n")
2290 int idx_permit_deny
= 5;
2291 int idx_ipv6_prefixlen
= 6;
2292 int idx_number_2
= 8;
2293 int idx_number_3
= 10;
2294 return vty_prefix_list_install (vty
, AFI_IP6
, argv
[idx_word
]->arg
, argv
[idx_number
]->arg
, argv
[idx_permit_deny
]->arg
,
2295 argv
[idx_ipv6_prefixlen
]->arg
, argv
[idx_number_2
]->arg
, argv
[idx_number_3
]->arg
);
2298 DEFUN (ipv6_prefix_list_seq_le
,
2299 ipv6_prefix_list_seq_le_cmd
,
2300 "ipv6 prefix-list WORD seq (1-4294967295) <deny|permit> X:X::X:X/M le (0-128)",
2303 "Name of a prefix list\n"
2304 "sequence number of an entry\n"
2306 "Specify packets to reject\n"
2307 "Specify packets to forward\n"
2308 "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n"
2309 "Maximum prefix length to be matched\n"
2310 "Maximum prefix length\n")
2314 int idx_permit_deny
= 5;
2315 int idx_ipv6_prefixlen
= 6;
2316 int idx_number_2
= 8;
2317 return vty_prefix_list_install (vty
, AFI_IP6
, argv
[idx_word
]->arg
, argv
[idx_number
]->arg
, argv
[idx_permit_deny
]->arg
,
2318 argv
[idx_ipv6_prefixlen
]->arg
, NULL
, argv
[idx_number_2
]->arg
);
2321 DEFUN (ipv6_prefix_list_seq_le_ge
,
2322 ipv6_prefix_list_seq_le_ge_cmd
,
2323 "ipv6 prefix-list WORD seq (1-4294967295) <deny|permit> X:X::X:X/M le (0-128) ge (0-128)",
2326 "Name of a prefix list\n"
2327 "sequence number of an entry\n"
2329 "Specify packets to reject\n"
2330 "Specify packets to forward\n"
2331 "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n"
2332 "Maximum prefix length to be matched\n"
2333 "Maximum prefix length\n"
2334 "Minimum prefix length to be matched\n"
2335 "Minimum prefix length\n")
2339 int idx_permit_deny
= 5;
2340 int idx_ipv6_prefixlen
= 6;
2341 int idx_number_2
= 8;
2342 int idx_number_3
= 10;
2343 return vty_prefix_list_install (vty
, AFI_IP6
, argv
[idx_word
]->arg
, argv
[idx_number
]->arg
, argv
[idx_permit_deny
]->arg
,
2344 argv
[idx_ipv6_prefixlen
]->arg
, argv
[idx_number_3
]->arg
, argv
[idx_number_2
]->arg
);
2347 DEFUN (no_ipv6_prefix_list
,
2348 no_ipv6_prefix_list_cmd
,
2349 "no ipv6 prefix-list WORD",
2353 "Name of a prefix list\n")
2356 return vty_prefix_list_uninstall (vty
, AFI_IP6
, argv
[idx_word
]->arg
, NULL
, NULL
,
2360 DEFUN (no_ipv6_prefix_list_prefix
,
2361 no_ipv6_prefix_list_prefix_cmd
,
2362 "no ipv6 prefix-list WORD <deny|permit> <X:X::X:X/M|any>",
2366 "Name of a prefix list\n"
2367 "Specify packets to reject\n"
2368 "Specify packets to forward\n"
2369 "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n"
2370 "Any prefix match. Same as \"::0/0 le 128\"\n")
2373 int idx_permit_deny
= 4;
2374 int idx_ipv6_any
= 5;
2375 return vty_prefix_list_uninstall (vty
, AFI_IP6
, argv
[idx_word
]->arg
, NULL
, argv
[idx_permit_deny
]->arg
,
2376 argv
[idx_ipv6_any
]->arg
, NULL
, NULL
);
2379 DEFUN (no_ipv6_prefix_list_ge
,
2380 no_ipv6_prefix_list_ge_cmd
,
2381 "no ipv6 prefix-list WORD <deny|permit> X:X::X:X/M ge (0-128)",
2385 "Name of a prefix list\n"
2386 "Specify packets to reject\n"
2387 "Specify packets to forward\n"
2388 "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n"
2389 "Minimum prefix length to be matched\n"
2390 "Minimum prefix length\n")
2393 int idx_permit_deny
= 4;
2394 int idx_ipv6_prefixlen
= 5;
2396 return vty_prefix_list_uninstall (vty
, AFI_IP6
, argv
[idx_word
]->arg
, NULL
, argv
[idx_permit_deny
]->arg
,
2397 argv
[idx_ipv6_prefixlen
]->arg
, argv
[idx_number
]->arg
, NULL
);
2400 DEFUN (no_ipv6_prefix_list_ge_le
,
2401 no_ipv6_prefix_list_ge_le_cmd
,
2402 "no ipv6 prefix-list WORD <deny|permit> X:X::X:X/M ge (0-128) le (0-128)",
2406 "Name of a prefix list\n"
2407 "Specify packets to reject\n"
2408 "Specify packets to forward\n"
2409 "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n"
2410 "Minimum prefix length to be matched\n"
2411 "Minimum prefix length\n"
2412 "Maximum prefix length to be matched\n"
2413 "Maximum prefix length\n")
2416 int idx_permit_deny
= 4;
2417 int idx_ipv6_prefixlen
= 5;
2419 int idx_number_2
= 9;
2420 return vty_prefix_list_uninstall (vty
, AFI_IP6
, argv
[idx_word
]->arg
, NULL
, argv
[idx_permit_deny
]->arg
,
2421 argv
[idx_ipv6_prefixlen
]->arg
, argv
[idx_number
]->arg
, argv
[idx_number_2
]->arg
);
2424 DEFUN (no_ipv6_prefix_list_le
,
2425 no_ipv6_prefix_list_le_cmd
,
2426 "no ipv6 prefix-list WORD <deny|permit> X:X::X:X/M le (0-128)",
2430 "Name of a prefix list\n"
2431 "Specify packets to reject\n"
2432 "Specify packets to forward\n"
2433 "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n"
2434 "Maximum prefix length to be matched\n"
2435 "Maximum prefix length\n")
2438 int idx_permit_deny
= 4;
2439 int idx_ipv6_prefixlen
= 5;
2441 return vty_prefix_list_uninstall (vty
, AFI_IP6
, argv
[idx_word
]->arg
, NULL
, argv
[idx_permit_deny
]->arg
,
2442 argv
[idx_ipv6_prefixlen
]->arg
, NULL
, argv
[idx_number
]->arg
);
2445 DEFUN (no_ipv6_prefix_list_le_ge
,
2446 no_ipv6_prefix_list_le_ge_cmd
,
2447 "no ipv6 prefix-list WORD <deny|permit> X:X::X:X/M le (0-128) ge (0-128)",
2451 "Name of a prefix list\n"
2452 "Specify packets to reject\n"
2453 "Specify packets to forward\n"
2454 "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n"
2455 "Maximum prefix length to be matched\n"
2456 "Maximum prefix length\n"
2457 "Minimum prefix length to be matched\n"
2458 "Minimum prefix length\n")
2461 int idx_permit_deny
= 4;
2462 int idx_ipv6_prefixlen
= 5;
2464 int idx_number_2
= 9;
2465 return vty_prefix_list_uninstall (vty
, AFI_IP6
, argv
[idx_word
]->arg
, NULL
, argv
[idx_permit_deny
]->arg
,
2466 argv
[idx_ipv6_prefixlen
]->arg
, argv
[idx_number_2
]->arg
, argv
[idx_number
]->arg
);
2469 DEFUN (no_ipv6_prefix_list_seq
,
2470 no_ipv6_prefix_list_seq_cmd
,
2471 "no ipv6 prefix-list WORD seq (1-4294967295) <deny|permit> <X:X::X:X/M|any>",
2475 "Name of a prefix list\n"
2476 "sequence number of an entry\n"
2478 "Specify packets to reject\n"
2479 "Specify packets to forward\n"
2480 "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n"
2481 "Any prefix match. Same as \"::0/0 le 128\"\n")
2485 int idx_permit_deny
= 6;
2486 int idx_ipv6_any
= 7;
2487 return vty_prefix_list_uninstall (vty
, AFI_IP6
, argv
[idx_word
]->arg
, argv
[idx_number
]->arg
, argv
[idx_permit_deny
]->arg
,
2488 argv
[idx_ipv6_any
]->arg
, NULL
, NULL
);
2491 DEFUN (no_ipv6_prefix_list_seq_ge
,
2492 no_ipv6_prefix_list_seq_ge_cmd
,
2493 "no ipv6 prefix-list WORD seq (1-4294967295) <deny|permit> X:X::X:X/M ge (0-128)",
2497 "Name of a prefix list\n"
2498 "sequence number of an entry\n"
2500 "Specify packets to reject\n"
2501 "Specify packets to forward\n"
2502 "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n"
2503 "Minimum prefix length to be matched\n"
2504 "Minimum prefix length\n")
2508 int idx_permit_deny
= 6;
2509 int idx_ipv6_prefixlen
= 7;
2510 int idx_number_2
= 9;
2511 return vty_prefix_list_uninstall (vty
, AFI_IP6
, argv
[idx_word
]->arg
, argv
[idx_number
]->arg
, argv
[idx_permit_deny
]->arg
,
2512 argv
[idx_ipv6_prefixlen
]->arg
, argv
[idx_number_2
]->arg
, NULL
);
2515 DEFUN (no_ipv6_prefix_list_seq_ge_le
,
2516 no_ipv6_prefix_list_seq_ge_le_cmd
,
2517 "no ipv6 prefix-list WORD seq (1-4294967295) <deny|permit> X:X::X:X/M ge (0-128) le (0-128)",
2521 "Name of a prefix list\n"
2522 "sequence number of an entry\n"
2524 "Specify packets to reject\n"
2525 "Specify packets to forward\n"
2526 "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n"
2527 "Minimum prefix length to be matched\n"
2528 "Minimum prefix length\n"
2529 "Maximum prefix length to be matched\n"
2530 "Maximum prefix length\n")
2534 int idx_permit_deny
= 6;
2535 int idx_ipv6_prefixlen
= 7;
2536 int idx_number_2
= 9;
2537 int idx_number_3
= 11;
2538 return vty_prefix_list_uninstall (vty
, AFI_IP6
, argv
[idx_word
]->arg
, argv
[idx_number
]->arg
, argv
[idx_permit_deny
]->arg
,
2539 argv
[idx_ipv6_prefixlen
]->arg
, argv
[idx_number_2
]->arg
, argv
[idx_number_3
]->arg
);
2542 DEFUN (no_ipv6_prefix_list_seq_le
,
2543 no_ipv6_prefix_list_seq_le_cmd
,
2544 "no ipv6 prefix-list WORD seq (1-4294967295) <deny|permit> X:X::X:X/M le (0-128)",
2548 "Name of a prefix list\n"
2549 "sequence number of an entry\n"
2551 "Specify packets to reject\n"
2552 "Specify packets to forward\n"
2553 "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n"
2554 "Maximum prefix length to be matched\n"
2555 "Maximum prefix length\n")
2559 int idx_permit_deny
= 6;
2560 int idx_ipv6_prefixlen
= 7;
2561 int idx_number_2
= 9;
2562 return vty_prefix_list_uninstall (vty
, AFI_IP6
, argv
[idx_word
]->arg
, argv
[idx_number
]->arg
, argv
[idx_permit_deny
]->arg
,
2563 argv
[idx_ipv6_prefixlen
]->arg
, NULL
, argv
[idx_number_2
]->arg
);
2566 DEFUN (no_ipv6_prefix_list_seq_le_ge
,
2567 no_ipv6_prefix_list_seq_le_ge_cmd
,
2568 "no ipv6 prefix-list WORD seq (1-4294967295) <deny|permit> X:X::X:X/M le (0-128) ge (0-128)",
2572 "Name of a prefix list\n"
2573 "sequence number of an entry\n"
2575 "Specify packets to reject\n"
2576 "Specify packets to forward\n"
2577 "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n"
2578 "Maximum prefix length to be matched\n"
2579 "Maximum prefix length\n"
2580 "Minimum prefix length to be matched\n"
2581 "Minimum prefix length\n")
2585 int idx_permit_deny
= 6;
2586 int idx_ipv6_prefixlen
= 7;
2587 int idx_number_2
= 9;
2588 int idx_number_3
= 11;
2589 return vty_prefix_list_uninstall (vty
, AFI_IP6
, argv
[idx_word
]->arg
, argv
[idx_number
]->arg
, argv
[idx_permit_deny
]->arg
,
2590 argv
[idx_ipv6_prefixlen
]->arg
, argv
[idx_number_3
]->arg
, argv
[idx_number_2
]->arg
);
2593 DEFUN (ipv6_prefix_list_sequence_number
,
2594 ipv6_prefix_list_sequence_number_cmd
,
2595 "ipv6 prefix-list sequence-number",
2598 "Include/exclude sequence numbers in NVGEN\n")
2600 prefix_master_ipv6
.seqnum
= 1;
2604 DEFUN (no_ipv6_prefix_list_sequence_number
,
2605 no_ipv6_prefix_list_sequence_number_cmd
,
2606 "no ipv6 prefix-list sequence-number",
2610 "Include/exclude sequence numbers in NVGEN\n")
2612 prefix_master_ipv6
.seqnum
= 0;
2616 DEFUN (ipv6_prefix_list_description
,
2617 ipv6_prefix_list_description_cmd
,
2618 "ipv6 prefix-list WORD description LINE...",
2621 "Name of a prefix list\n"
2622 "Prefix-list specific description\n"
2623 "Up to 80 characters describing this prefix-list\n")
2627 struct prefix_list
*plist
;
2629 plist
= prefix_list_get (AFI_IP6
, 0, argv
[idx_word
]->arg
);
2633 XFREE (MTYPE_TMP
, plist
->desc
);
2636 plist
->desc
= argv_concat(argv
, argc
, iddx_line
);
2641 DEFUN (no_ipv6_prefix_list_description
,
2642 no_ipv6_prefix_list_description_cmd
,
2643 "no ipv6 prefix-list WORD description",
2647 "Name of a prefix list\n"
2648 "Prefix-list specific description\n")
2651 return vty_prefix_list_desc_unset (vty
, AFI_IP6
, argv
[idx_word
]->arg
);
2655 DEFUN (no_ipv6_prefix_list_description_comment
,
2656 no_ipv6_prefix_list_description_comment_cmd
,
2657 "no ipv6 prefix-list WORD description LINE...",
2661 "Name of a prefix list\n"
2662 "Prefix-list specific description\n"
2663 "Up to 80 characters describing this prefix-list\n")
2665 return no_ipv6_prefix_list_description (self
, vty
, argc
, argv
);
2669 DEFUN (show_ipv6_prefix_list
,
2670 show_ipv6_prefix_list_cmd
,
2671 "show ipv6 prefix-list",
2676 return vty_show_prefix_list (vty
, AFI_IP6
, NULL
, NULL
, normal_display
);
2679 DEFUN (show_ipv6_prefix_list_name
,
2680 show_ipv6_prefix_list_name_cmd
,
2681 "show ipv6 prefix-list WORD",
2685 "Name of a prefix list\n")
2688 return vty_show_prefix_list (vty
, AFI_IP6
, argv
[idx_word
]->arg
, NULL
, normal_display
);
2691 DEFUN (show_ipv6_prefix_list_name_seq
,
2692 show_ipv6_prefix_list_name_seq_cmd
,
2693 "show ipv6 prefix-list WORD seq (1-4294967295)",
2697 "Name of a prefix list\n"
2698 "sequence number of an entry\n"
2699 "Sequence number\n")
2703 return vty_show_prefix_list (vty
, AFI_IP6
, argv
[idx_word
]->arg
, argv
[idx_number
]->arg
, sequential_display
);
2706 DEFUN (show_ipv6_prefix_list_prefix
,
2707 show_ipv6_prefix_list_prefix_cmd
,
2708 "show ipv6 prefix-list WORD X:X::X:X/M",
2712 "Name of a prefix list\n"
2713 "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n")
2716 int idx_ipv6_prefixlen
= 4;
2717 return vty_show_prefix_list_prefix (vty
, AFI_IP6
, argv
[idx_word
]->arg
, argv
[idx_ipv6_prefixlen
]->arg
, normal_display
);
2720 DEFUN (show_ipv6_prefix_list_prefix_longer
,
2721 show_ipv6_prefix_list_prefix_longer_cmd
,
2722 "show ipv6 prefix-list WORD X:X::X:X/M longer",
2726 "Name of a prefix list\n"
2727 "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n"
2728 "Lookup longer prefix\n")
2731 int idx_ipv6_prefixlen
= 4;
2732 return vty_show_prefix_list_prefix (vty
, AFI_IP6
, argv
[idx_word
]->arg
, argv
[idx_ipv6_prefixlen
]->arg
, longer_display
);
2735 DEFUN (show_ipv6_prefix_list_prefix_first_match
,
2736 show_ipv6_prefix_list_prefix_first_match_cmd
,
2737 "show ipv6 prefix-list WORD X:X::X:X/M first-match",
2741 "Name of a prefix list\n"
2742 "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n"
2743 "First matched prefix\n")
2746 int idx_ipv6_prefixlen
= 4;
2747 return vty_show_prefix_list_prefix (vty
, AFI_IP6
, argv
[idx_word
]->arg
, argv
[idx_ipv6_prefixlen
]->arg
, first_match_display
);
2750 DEFUN (show_ipv6_prefix_list_summary
,
2751 show_ipv6_prefix_list_summary_cmd
,
2752 "show ipv6 prefix-list summary",
2756 "Summary of prefix lists\n")
2758 return vty_show_prefix_list (vty
, AFI_IP6
, NULL
, NULL
, summary_display
);
2761 DEFUN (show_ipv6_prefix_list_summary_name
,
2762 show_ipv6_prefix_list_summary_name_cmd
,
2763 "show ipv6 prefix-list summary WORD",
2767 "Summary of prefix lists\n"
2768 "Name of a prefix list\n")
2771 return vty_show_prefix_list (vty
, AFI_IP6
, argv
[idx_word
]->arg
, NULL
, summary_display
);
2774 DEFUN (show_ipv6_prefix_list_detail
,
2775 show_ipv6_prefix_list_detail_cmd
,
2776 "show ipv6 prefix-list detail",
2780 "Detail of prefix lists\n")
2782 return vty_show_prefix_list (vty
, AFI_IP6
, NULL
, NULL
, detail_display
);
2785 DEFUN (show_ipv6_prefix_list_detail_name
,
2786 show_ipv6_prefix_list_detail_name_cmd
,
2787 "show ipv6 prefix-list detail WORD",
2791 "Detail of prefix lists\n"
2792 "Name of a prefix list\n")
2795 return vty_show_prefix_list (vty
, AFI_IP6
, argv
[idx_word
]->arg
, NULL
, detail_display
);
2798 DEFUN (clear_ipv6_prefix_list
,
2799 clear_ipv6_prefix_list_cmd
,
2800 "clear ipv6 prefix-list",
2805 return vty_clear_prefix_list (vty
, AFI_IP6
, NULL
, NULL
);
2808 DEFUN (clear_ipv6_prefix_list_name
,
2809 clear_ipv6_prefix_list_name_cmd
,
2810 "clear ipv6 prefix-list WORD",
2814 "Name of a prefix list\n")
2817 return vty_clear_prefix_list (vty
, AFI_IP6
, argv
[idx_word
]->arg
, NULL
);
2820 DEFUN (clear_ipv6_prefix_list_name_prefix
,
2821 clear_ipv6_prefix_list_name_prefix_cmd
,
2822 "clear ipv6 prefix-list WORD X:X::X:X/M",
2826 "Name of a prefix list\n"
2827 "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n")
2830 int idx_ipv6_prefixlen
= 4;
2831 return vty_clear_prefix_list (vty
, AFI_IP6
, argv
[idx_word
]->arg
, argv
[idx_ipv6_prefixlen
]->arg
);
2834 /* Configuration write function. */
2836 config_write_prefix_afi (afi_t afi
, struct vty
*vty
)
2838 struct prefix_list
*plist
;
2839 struct prefix_list_entry
*pentry
;
2840 struct prefix_master
*master
;
2843 master
= prefix_master_get (afi
, 0);
2847 if (! master
->seqnum
)
2849 vty_out (vty
, "no ip%s prefix-list sequence-number%s",
2850 afi
== AFI_IP
? "" : "v6", VTY_NEWLINE
);
2851 vty_out (vty
, "!%s", VTY_NEWLINE
);
2854 for (plist
= master
->num
.head
; plist
; plist
= plist
->next
)
2858 vty_out (vty
, "ip%s prefix-list %s description %s%s",
2859 afi
== AFI_IP
? "" : "v6",
2860 plist
->name
, plist
->desc
, VTY_NEWLINE
);
2864 for (pentry
= plist
->head
; pentry
; pentry
= pentry
->next
)
2866 vty_out (vty
, "ip%s prefix-list %s ",
2867 afi
== AFI_IP
? "" : "v6",
2871 vty_out (vty
, "seq %u ", pentry
->seq
);
2873 vty_out (vty
, "%s ", prefix_list_type_str (pentry
));
2876 vty_out (vty
, "any");
2879 struct prefix
*p
= &pentry
->prefix
;
2882 vty_out (vty
, "%s/%d",
2883 inet_ntop (p
->family
, &p
->u
.prefix
, buf
, BUFSIZ
),
2887 vty_out (vty
, " ge %d", pentry
->ge
);
2889 vty_out (vty
, " le %d", pentry
->le
);
2891 vty_out (vty
, "%s", VTY_NEWLINE
);
2894 /* vty_out (vty, "!%s", VTY_NEWLINE); */
2897 for (plist
= master
->str
.head
; plist
; plist
= plist
->next
)
2901 vty_out (vty
, "ip%s prefix-list %s description %s%s",
2902 afi
== AFI_IP
? "" : "v6",
2903 plist
->name
, plist
->desc
, VTY_NEWLINE
);
2907 for (pentry
= plist
->head
; pentry
; pentry
= pentry
->next
)
2909 vty_out (vty
, "ip%s prefix-list %s ",
2910 afi
== AFI_IP
? "" : "v6",
2914 vty_out (vty
, "seq %u ", pentry
->seq
);
2916 vty_out (vty
, "%s", prefix_list_type_str (pentry
));
2919 vty_out (vty
, " any");
2922 struct prefix
*p
= &pentry
->prefix
;
2925 vty_out (vty
, " %s/%d",
2926 inet_ntop (p
->family
, &p
->u
.prefix
, buf
, BUFSIZ
),
2930 vty_out (vty
, " ge %d", pentry
->ge
);
2932 vty_out (vty
, " le %d", pentry
->le
);
2934 vty_out (vty
, "%s", VTY_NEWLINE
);
2943 prefix_bgp_orf_entry (struct stream
*s
, struct prefix_list
*plist
,
2944 u_char init_flag
, u_char permit_flag
, u_char deny_flag
)
2946 struct prefix_list_entry
*pentry
;
2951 for (pentry
= plist
->head
; pentry
; pentry
= pentry
->next
)
2953 u_char flag
= init_flag
;
2954 struct prefix
*p
= &pentry
->prefix
;
2956 flag
|= (pentry
->type
== PREFIX_PERMIT
?
2957 permit_flag
: deny_flag
);
2958 stream_putc (s
, flag
);
2959 stream_putl (s
, (u_int32_t
)pentry
->seq
);
2960 stream_putc (s
, (u_char
)pentry
->ge
);
2961 stream_putc (s
, (u_char
)pentry
->le
);
2962 stream_put_prefix (s
, p
);
2969 prefix_bgp_orf_set (char *name
, afi_t afi
, struct orf_prefix
*orfp
,
2970 int permit
, int set
)
2972 struct prefix_list
*plist
;
2973 struct prefix_list_entry
*pentry
;
2975 /* ge and le value check */
2976 if (orfp
->ge
&& orfp
->ge
<= orfp
->p
.prefixlen
)
2978 if (orfp
->le
&& orfp
->le
<= orfp
->p
.prefixlen
)
2980 if (orfp
->le
&& orfp
->ge
> orfp
->le
)
2983 if (orfp
->ge
&& orfp
->le
== (afi
== AFI_IP
? 32 : 128))
2986 plist
= prefix_list_get (afi
, 1, name
);
2992 pentry
= prefix_list_entry_make (&orfp
->p
,
2993 (permit
? PREFIX_PERMIT
: PREFIX_DENY
),
2994 orfp
->seq
, orfp
->le
, orfp
->ge
, 0);
2996 if (prefix_entry_dup_check (plist
, pentry
))
2998 prefix_list_entry_free (pentry
);
3002 prefix_list_entry_add (plist
, pentry
);
3006 pentry
= prefix_list_entry_lookup (plist
, &orfp
->p
,
3007 (permit
? PREFIX_PERMIT
: PREFIX_DENY
),
3008 orfp
->seq
, orfp
->le
, orfp
->ge
);
3013 prefix_list_entry_delete (plist
, pentry
, 1);
3020 prefix_bgp_orf_remove_all (afi_t afi
, char *name
)
3022 struct prefix_list
*plist
;
3024 plist
= prefix_bgp_orf_lookup (afi
, name
);
3026 prefix_list_delete (plist
);
3029 /* return prefix count */
3031 prefix_bgp_show_prefix_list (struct vty
*vty
, afi_t afi
, char *name
, u_char use_json
)
3033 struct prefix_list
*plist
;
3034 struct prefix_list_entry
*pentry
;
3035 json_object
*json
= NULL
;
3036 json_object
*json_prefix
= NULL
;
3037 json_object
*json_list
= NULL
;
3039 plist
= prefix_bgp_orf_lookup (afi
, name
);
3044 return plist
->count
;
3048 json
= json_object_new_object();
3049 json_prefix
= json_object_new_object();
3050 json_list
= json_object_new_object();
3052 json_object_int_add(json_prefix
, "prefixListCounter", plist
->count
);
3053 json_object_string_add(json_prefix
, "prefixListName", plist
->name
);
3055 for (pentry
= plist
->head
; pentry
; pentry
= pentry
->next
)
3057 struct prefix
*p
= &pentry
->prefix
;
3061 sprintf(buf_a
, "%s/%d", inet_ntop (p
->family
, &p
->u
.prefix
, buf_b
, BUFSIZ
),
3064 json_object_int_add(json_list
, "seq", pentry
->seq
);
3065 json_object_string_add(json_list
, "seqPrefixListType", prefix_list_type_str (pentry
));
3068 json_object_int_add(json_list
, "ge", pentry
->ge
);
3070 json_object_int_add(json_list
, "le", pentry
->le
);
3072 json_object_object_add(json_prefix
, buf_a
, json_list
);
3075 json_object_object_add(json
, "ipPrefixList", json_prefix
);
3077 json_object_object_add(json
, "ipv6PrefixList", json_prefix
);
3079 vty_out (vty
, "%s%s", json_object_to_json_string_ext(json
, JSON_C_TO_STRING_PRETTY
), VTY_NEWLINE
);
3080 json_object_free(json
);
3084 vty_out (vty
, "ip%s prefix-list %s: %d entries%s",
3085 afi
== AFI_IP
? "" : "v6",
3086 plist
->name
, plist
->count
, VTY_NEWLINE
);
3088 for (pentry
= plist
->head
; pentry
; pentry
= pentry
->next
)
3090 struct prefix
*p
= &pentry
->prefix
;
3093 vty_out (vty
, " seq %u %s %s/%d", pentry
->seq
,
3094 prefix_list_type_str (pentry
),
3095 inet_ntop (p
->family
, &p
->u
.prefix
, buf
, BUFSIZ
),
3099 vty_out (vty
, " ge %d", pentry
->ge
);
3101 vty_out (vty
, " le %d", pentry
->le
);
3103 vty_out (vty
, "%s", VTY_NEWLINE
);
3106 return plist
->count
;
3110 prefix_list_reset_afi (afi_t afi
, int orf
)
3112 struct prefix_list
*plist
;
3113 struct prefix_list
*next
;
3114 struct prefix_master
*master
;
3116 master
= prefix_master_get (afi
, orf
);
3120 for (plist
= master
->num
.head
; plist
; plist
= next
)
3123 prefix_list_delete (plist
);
3125 for (plist
= master
->str
.head
; plist
; plist
= next
)
3128 prefix_list_delete (plist
);
3131 assert (master
->num
.head
== NULL
);
3132 assert (master
->num
.tail
== NULL
);
3134 assert (master
->str
.head
== NULL
);
3135 assert (master
->str
.tail
== NULL
);
3138 master
->recent
= NULL
;
3142 /* Prefix-list node. */
3143 static struct cmd_node prefix_node
=
3146 "", /* Prefix list has no interface. */
3151 config_write_prefix_ipv4 (struct vty
*vty
)
3153 return config_write_prefix_afi (AFI_IP
, vty
);
3157 prefix_list_init_ipv4 (void)
3159 install_node (&prefix_node
, config_write_prefix_ipv4
);
3161 install_element (CONFIG_NODE
, &ip_prefix_list_cmd
);
3162 install_element (CONFIG_NODE
, &ip_prefix_list_ge_cmd
);
3163 install_element (CONFIG_NODE
, &ip_prefix_list_ge_le_cmd
);
3164 install_element (CONFIG_NODE
, &ip_prefix_list_le_cmd
);
3165 install_element (CONFIG_NODE
, &ip_prefix_list_le_ge_cmd
);
3166 install_element (CONFIG_NODE
, &ip_prefix_list_seq_cmd
);
3167 install_element (CONFIG_NODE
, &ip_prefix_list_seq_ge_cmd
);
3168 install_element (CONFIG_NODE
, &ip_prefix_list_seq_ge_le_cmd
);
3169 install_element (CONFIG_NODE
, &ip_prefix_list_seq_le_cmd
);
3170 install_element (CONFIG_NODE
, &ip_prefix_list_seq_le_ge_cmd
);
3172 install_element (CONFIG_NODE
, &no_ip_prefix_list_cmd
);
3173 install_element (CONFIG_NODE
, &no_ip_prefix_list_prefix_cmd
);
3174 install_element (CONFIG_NODE
, &no_ip_prefix_list_ge_cmd
);
3175 install_element (CONFIG_NODE
, &no_ip_prefix_list_ge_le_cmd
);
3176 install_element (CONFIG_NODE
, &no_ip_prefix_list_le_cmd
);
3177 install_element (CONFIG_NODE
, &no_ip_prefix_list_le_ge_cmd
);
3178 install_element (CONFIG_NODE
, &no_ip_prefix_list_seq_cmd
);
3179 install_element (CONFIG_NODE
, &no_ip_prefix_list_seq_ge_cmd
);
3180 install_element (CONFIG_NODE
, &no_ip_prefix_list_seq_ge_le_cmd
);
3181 install_element (CONFIG_NODE
, &no_ip_prefix_list_seq_le_cmd
);
3182 install_element (CONFIG_NODE
, &no_ip_prefix_list_seq_le_ge_cmd
);
3184 install_element (CONFIG_NODE
, &ip_prefix_list_description_cmd
);
3185 install_element (CONFIG_NODE
, &no_ip_prefix_list_description_cmd
);
3186 install_element (CONFIG_NODE
, &no_ip_prefix_list_description_comment_cmd
);
3188 install_element (CONFIG_NODE
, &ip_prefix_list_sequence_number_cmd
);
3189 install_element (CONFIG_NODE
, &no_ip_prefix_list_sequence_number_cmd
);
3191 install_element (VIEW_NODE
, &show_ip_prefix_list_cmd
);
3192 install_element (VIEW_NODE
, &show_ip_prefix_list_name_cmd
);
3193 install_element (VIEW_NODE
, &show_ip_prefix_list_name_seq_cmd
);
3194 install_element (VIEW_NODE
, &show_ip_prefix_list_prefix_cmd
);
3195 install_element (VIEW_NODE
, &show_ip_prefix_list_prefix_longer_cmd
);
3196 install_element (VIEW_NODE
, &show_ip_prefix_list_prefix_first_match_cmd
);
3197 install_element (VIEW_NODE
, &show_ip_prefix_list_summary_cmd
);
3198 install_element (VIEW_NODE
, &show_ip_prefix_list_summary_name_cmd
);
3199 install_element (VIEW_NODE
, &show_ip_prefix_list_detail_cmd
);
3200 install_element (VIEW_NODE
, &show_ip_prefix_list_detail_name_cmd
);
3202 install_element (ENABLE_NODE
, &clear_ip_prefix_list_cmd
);
3203 install_element (ENABLE_NODE
, &clear_ip_prefix_list_name_cmd
);
3204 install_element (ENABLE_NODE
, &clear_ip_prefix_list_name_prefix_cmd
);
3207 /* Prefix-list node. */
3208 static struct cmd_node prefix_ipv6_node
=
3211 "", /* Prefix list has no interface. */
3216 config_write_prefix_ipv6 (struct vty
*vty
)
3218 return config_write_prefix_afi (AFI_IP6
, vty
);
3222 prefix_list_init_ipv6 (void)
3224 install_node (&prefix_ipv6_node
, config_write_prefix_ipv6
);
3226 install_element (CONFIG_NODE
, &ipv6_prefix_list_cmd
);
3227 install_element (CONFIG_NODE
, &ipv6_prefix_list_ge_cmd
);
3228 install_element (CONFIG_NODE
, &ipv6_prefix_list_ge_le_cmd
);
3229 install_element (CONFIG_NODE
, &ipv6_prefix_list_le_cmd
);
3230 install_element (CONFIG_NODE
, &ipv6_prefix_list_le_ge_cmd
);
3231 install_element (CONFIG_NODE
, &ipv6_prefix_list_seq_cmd
);
3232 install_element (CONFIG_NODE
, &ipv6_prefix_list_seq_ge_cmd
);
3233 install_element (CONFIG_NODE
, &ipv6_prefix_list_seq_ge_le_cmd
);
3234 install_element (CONFIG_NODE
, &ipv6_prefix_list_seq_le_cmd
);
3235 install_element (CONFIG_NODE
, &ipv6_prefix_list_seq_le_ge_cmd
);
3237 install_element (CONFIG_NODE
, &no_ipv6_prefix_list_cmd
);
3238 install_element (CONFIG_NODE
, &no_ipv6_prefix_list_prefix_cmd
);
3239 install_element (CONFIG_NODE
, &no_ipv6_prefix_list_ge_cmd
);
3240 install_element (CONFIG_NODE
, &no_ipv6_prefix_list_ge_le_cmd
);
3241 install_element (CONFIG_NODE
, &no_ipv6_prefix_list_le_cmd
);
3242 install_element (CONFIG_NODE
, &no_ipv6_prefix_list_le_ge_cmd
);
3243 install_element (CONFIG_NODE
, &no_ipv6_prefix_list_seq_cmd
);
3244 install_element (CONFIG_NODE
, &no_ipv6_prefix_list_seq_ge_cmd
);
3245 install_element (CONFIG_NODE
, &no_ipv6_prefix_list_seq_ge_le_cmd
);
3246 install_element (CONFIG_NODE
, &no_ipv6_prefix_list_seq_le_cmd
);
3247 install_element (CONFIG_NODE
, &no_ipv6_prefix_list_seq_le_ge_cmd
);
3249 install_element (CONFIG_NODE
, &ipv6_prefix_list_description_cmd
);
3250 install_element (CONFIG_NODE
, &no_ipv6_prefix_list_description_cmd
);
3251 install_element (CONFIG_NODE
, &no_ipv6_prefix_list_description_comment_cmd
);
3253 install_element (CONFIG_NODE
, &ipv6_prefix_list_sequence_number_cmd
);
3254 install_element (CONFIG_NODE
, &no_ipv6_prefix_list_sequence_number_cmd
);
3256 install_element (VIEW_NODE
, &show_ipv6_prefix_list_cmd
);
3257 install_element (VIEW_NODE
, &show_ipv6_prefix_list_name_cmd
);
3258 install_element (VIEW_NODE
, &show_ipv6_prefix_list_name_seq_cmd
);
3259 install_element (VIEW_NODE
, &show_ipv6_prefix_list_prefix_cmd
);
3260 install_element (VIEW_NODE
, &show_ipv6_prefix_list_prefix_longer_cmd
);
3261 install_element (VIEW_NODE
, &show_ipv6_prefix_list_prefix_first_match_cmd
);
3262 install_element (VIEW_NODE
, &show_ipv6_prefix_list_summary_cmd
);
3263 install_element (VIEW_NODE
, &show_ipv6_prefix_list_summary_name_cmd
);
3264 install_element (VIEW_NODE
, &show_ipv6_prefix_list_detail_cmd
);
3265 install_element (VIEW_NODE
, &show_ipv6_prefix_list_detail_name_cmd
);
3267 install_element (ENABLE_NODE
, &clear_ipv6_prefix_list_cmd
);
3268 install_element (ENABLE_NODE
, &clear_ipv6_prefix_list_name_cmd
);
3269 install_element (ENABLE_NODE
, &clear_ipv6_prefix_list_name_prefix_cmd
);
3275 prefix_list_init_ipv4 ();
3276 prefix_list_init_ipv6 ();
3280 prefix_list_reset ()
3282 prefix_list_reset_afi (AFI_IP
, 0);
3283 prefix_list_reset_afi (AFI_IP6
, 0);
3284 prefix_list_reset_afi (AFI_IP
, 1);
3285 prefix_list_reset_afi (AFI_IP6
, 1);