summaryrefslogtreecommitdiff
path: root/lib/plist.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/plist.c')
-rw-r--r--lib/plist.c3024
1 files changed, 1437 insertions, 1587 deletions
diff --git a/lib/plist.c b/lib/plist.c
index 96c60a4892..d7a0db6807 100644
--- a/lib/plist.c
+++ b/lib/plist.c
@@ -33,10 +33,10 @@
#include "plist_int.h"
-DEFINE_MTYPE_STATIC(LIB, PREFIX_LIST, "Prefix List")
-DEFINE_MTYPE_STATIC(LIB, MPREFIX_LIST_STR, "Prefix List Str")
+DEFINE_MTYPE_STATIC(LIB, PREFIX_LIST, "Prefix List")
+DEFINE_MTYPE_STATIC(LIB, MPREFIX_LIST_STR, "Prefix List Str")
DEFINE_MTYPE_STATIC(LIB, PREFIX_LIST_ENTRY, "Prefix List Entry")
-DEFINE_MTYPE_STATIC(LIB, PREFIX_LIST_TRIE, "Prefix List Trie Table")
+DEFINE_MTYPE_STATIC(LIB, PREFIX_LIST_TRIE, "Prefix List Trie Table")
/* not currently changeable, code assumes bytes further down */
#define PLC_BITS 8
@@ -59,1357 +59,1235 @@ struct pltrie_table {
};
/* List of struct prefix_list. */
-struct prefix_list_list
-{
- struct prefix_list *head;
- struct prefix_list *tail;
+struct prefix_list_list {
+ struct prefix_list *head;
+ struct prefix_list *tail;
};
/* Master structure of prefix_list. */
-struct prefix_master
-{
- /* List of prefix_list which name is number. */
- struct prefix_list_list num;
+struct prefix_master {
+ /* List of prefix_list which name is number. */
+ struct prefix_list_list num;
- /* List of prefix_list which name is string. */
- struct prefix_list_list str;
+ /* List of prefix_list which name is string. */
+ struct prefix_list_list str;
- /* Whether sequential number is used. */
- int seqnum;
+ /* Whether sequential number is used. */
+ int seqnum;
- /* The latest update. */
- struct prefix_list *recent;
+ /* The latest update. */
+ struct prefix_list *recent;
- /* Hook function which is executed when new prefix_list is added. */
- void (*add_hook) (struct prefix_list *);
+ /* Hook function which is executed when new prefix_list is added. */
+ void (*add_hook)(struct prefix_list *);
- /* Hook function which is executed when prefix_list is deleted. */
- void (*delete_hook) (struct prefix_list *);
+ /* Hook function which is executed when prefix_list is deleted. */
+ void (*delete_hook)(struct prefix_list *);
- /* number of bytes that have a trie level */
- size_t trie_depth;
+ /* number of bytes that have a trie level */
+ size_t trie_depth;
};
/* Static structure of IPv4 prefix_list's master. */
-static struct prefix_master prefix_master_ipv4 =
-{
- {NULL, NULL},
- {NULL, NULL},
- 1,
- NULL,
- NULL,
- NULL,
- PLC_MAXLEVELV4,
+static struct prefix_master prefix_master_ipv4 = {
+ {NULL, NULL}, {NULL, NULL}, 1, NULL, NULL, NULL, PLC_MAXLEVELV4,
};
/* Static structure of IPv6 prefix-list's master. */
-static struct prefix_master prefix_master_ipv6 =
-{
- {NULL, NULL},
- {NULL, NULL},
- 1,
- NULL,
- NULL,
- NULL,
- PLC_MAXLEVELV6,
+static struct prefix_master prefix_master_ipv6 = {
+ {NULL, NULL}, {NULL, NULL}, 1, NULL, NULL, NULL, PLC_MAXLEVELV6,
};
/* Static structure of BGP ORF prefix_list's master. */
-static struct prefix_master prefix_master_orf_v4 =
-{
- {NULL, NULL},
- {NULL, NULL},
- 1,
- NULL,
- NULL,
- NULL,
- PLC_MAXLEVELV4,
+static struct prefix_master prefix_master_orf_v4 = {
+ {NULL, NULL}, {NULL, NULL}, 1, NULL, NULL, NULL, PLC_MAXLEVELV4,
};
/* Static structure of BGP ORF prefix_list's master. */
-static struct prefix_master prefix_master_orf_v6 =
-{
- {NULL, NULL},
- {NULL, NULL},
- 1,
- NULL,
- NULL,
- NULL,
- PLC_MAXLEVELV6,
+static struct prefix_master prefix_master_orf_v6 = {
+ {NULL, NULL}, {NULL, NULL}, 1, NULL, NULL, NULL, PLC_MAXLEVELV6,
};
-static struct prefix_master *
-prefix_master_get (afi_t afi, int orf)
+static struct prefix_master *prefix_master_get(afi_t afi, int orf)
{
- if (afi == AFI_IP)
- return orf ? &prefix_master_orf_v4 : &prefix_master_ipv4;
- if (afi == AFI_IP6)
- return orf ? &prefix_master_orf_v6 : &prefix_master_ipv6;
- return NULL;
+ if (afi == AFI_IP)
+ return orf ? &prefix_master_orf_v4 : &prefix_master_ipv4;
+ if (afi == AFI_IP6)
+ return orf ? &prefix_master_orf_v6 : &prefix_master_ipv6;
+ return NULL;
}
-const char *prefix_list_name (struct prefix_list *plist)
+const char *prefix_list_name(struct prefix_list *plist)
{
- return plist->name;
+ return plist->name;
}
/* Lookup prefix_list from list of prefix_list by name. */
-static struct prefix_list *
-prefix_list_lookup_do (afi_t afi, int orf, const char *name)
+static struct prefix_list *prefix_list_lookup_do(afi_t afi, int orf,
+ const char *name)
{
- struct prefix_list *plist;
- struct prefix_master *master;
+ struct prefix_list *plist;
+ struct prefix_master *master;
- if (name == NULL)
- return NULL;
+ if (name == NULL)
+ return NULL;
- master = prefix_master_get (afi, orf);
- if (master == NULL)
- return NULL;
+ master = prefix_master_get(afi, orf);
+ if (master == NULL)
+ return NULL;
- for (plist = master->num.head; plist; plist = plist->next)
- if (strcmp (plist->name, name) == 0)
- return plist;
+ for (plist = master->num.head; plist; plist = plist->next)
+ if (strcmp(plist->name, name) == 0)
+ return plist;
- for (plist = master->str.head; plist; plist = plist->next)
- if (strcmp (plist->name, name) == 0)
- return plist;
+ for (plist = master->str.head; plist; plist = plist->next)
+ if (strcmp(plist->name, name) == 0)
+ return plist;
- return NULL;
+ return NULL;
}
-struct prefix_list *
-prefix_list_lookup (afi_t afi, const char *name)
+struct prefix_list *prefix_list_lookup(afi_t afi, const char *name)
{
- return prefix_list_lookup_do (afi, 0, name);
+ return prefix_list_lookup_do(afi, 0, name);
}
-struct prefix_list *
-prefix_bgp_orf_lookup (afi_t afi, const char *name)
+struct prefix_list *prefix_bgp_orf_lookup(afi_t afi, const char *name)
{
- return prefix_list_lookup_do (afi, 1, name);
+ return prefix_list_lookup_do(afi, 1, name);
}
-static struct prefix_list *
-prefix_list_new (void)
+static struct prefix_list *prefix_list_new(void)
{
- struct prefix_list *new;
+ struct prefix_list *new;
- new = XCALLOC (MTYPE_PREFIX_LIST, sizeof (struct prefix_list));
- return new;
+ new = XCALLOC(MTYPE_PREFIX_LIST, sizeof(struct prefix_list));
+ return new;
}
-static void
-prefix_list_free (struct prefix_list *plist)
+static void prefix_list_free(struct prefix_list *plist)
{
- XFREE (MTYPE_PREFIX_LIST, plist);
+ XFREE(MTYPE_PREFIX_LIST, plist);
}
-static struct prefix_list_entry *
-prefix_list_entry_new (void)
+static struct prefix_list_entry *prefix_list_entry_new(void)
{
- struct prefix_list_entry *new;
+ struct prefix_list_entry *new;
- new = XCALLOC (MTYPE_PREFIX_LIST_ENTRY, sizeof (struct prefix_list_entry));
- return new;
+ new = XCALLOC(MTYPE_PREFIX_LIST_ENTRY,
+ sizeof(struct prefix_list_entry));
+ return new;
}
-static void
-prefix_list_entry_free (struct prefix_list_entry *pentry)
+static void prefix_list_entry_free(struct prefix_list_entry *pentry)
{
- XFREE (MTYPE_PREFIX_LIST_ENTRY, pentry);
+ XFREE(MTYPE_PREFIX_LIST_ENTRY, pentry);
}
/* Insert new prefix list to list of prefix_list. Each prefix_list
is sorted by the name. */
-static struct prefix_list *
-prefix_list_insert (afi_t afi, int orf, const char *name)
-{
- unsigned int i;
- long number;
- struct prefix_list *plist;
- struct prefix_list *point;
- struct prefix_list_list *list;
- struct prefix_master *master;
-
- master = prefix_master_get (afi, orf);
- if (master == NULL)
- return NULL;
-
- /* Allocate new prefix_list and copy given name. */
- plist = prefix_list_new ();
- plist->name = XSTRDUP (MTYPE_MPREFIX_LIST_STR, name);
- plist->master = master;
- plist->trie = XCALLOC (MTYPE_PREFIX_LIST_TRIE, sizeof (struct pltrie_table));
-
- /* If name is made by all digit character. We treat it as
- number. */
- for (number = 0, i = 0; i < strlen (name); i++)
- {
- if (isdigit ((int) name[i]))
- number = (number * 10) + (name[i] - '0');
- else
- break;
- }
-
- /* In case of name is all digit character */
- if (i == strlen (name))
- {
- plist->type = PREFIX_TYPE_NUMBER;
-
- /* Set prefix_list to number list. */
- list = &master->num;
-
- for (point = list->head; point; point = point->next)
- if (atol (point->name) >= number)
- break;
- }
- else
- {
- plist->type = PREFIX_TYPE_STRING;
-
- /* Set prefix_list to string list. */
- list = &master->str;
-
- /* Set point to insertion point. */
- for (point = list->head; point; point = point->next)
- if (strcmp (point->name, name) >= 0)
- break;
- }
-
- /* In case of this is the first element of master. */
- if (list->head == NULL)
- {
- list->head = list->tail = plist;
- return plist;
- }
-
- /* In case of insertion is made at the tail of access_list. */
- if (point == NULL)
- {
- plist->prev = list->tail;
- list->tail->next = plist;
- list->tail = plist;
- return plist;
- }
-
- /* In case of insertion is made at the head of access_list. */
- if (point == list->head)
- {
- plist->next = list->head;
- list->head->prev = plist;
- list->head = plist;
- return plist;
- }
-
- /* Insertion is made at middle of the access_list. */
- plist->next = point;
- plist->prev = point->prev;
-
- if (point->prev)
- point->prev->next = plist;
- point->prev = plist;
-
- return plist;
-}
-
-static struct prefix_list *
-prefix_list_get (afi_t afi, int orf, const char *name)
-{
- struct prefix_list *plist;
-
- plist = prefix_list_lookup_do (afi, orf, name);
-
- if (plist == NULL)
- plist = prefix_list_insert (afi, orf, name);
- return plist;
-}
-
-static void prefix_list_trie_del (struct prefix_list *plist,
- struct prefix_list_entry *pentry);
+static struct prefix_list *prefix_list_insert(afi_t afi, int orf,
+ const char *name)
+{
+ unsigned int i;
+ long number;
+ struct prefix_list *plist;
+ struct prefix_list *point;
+ struct prefix_list_list *list;
+ struct prefix_master *master;
+
+ master = prefix_master_get(afi, orf);
+ if (master == NULL)
+ return NULL;
+
+ /* Allocate new prefix_list and copy given name. */
+ plist = prefix_list_new();
+ plist->name = XSTRDUP(MTYPE_MPREFIX_LIST_STR, name);
+ plist->master = master;
+ plist->trie =
+ XCALLOC(MTYPE_PREFIX_LIST_TRIE, sizeof(struct pltrie_table));
+
+ /* If name is made by all digit character. We treat it as
+ number. */
+ for (number = 0, i = 0; i < strlen(name); i++) {
+ if (isdigit((int)name[i]))
+ number = (number * 10) + (name[i] - '0');
+ else
+ break;
+ }
-/* Delete prefix-list from prefix_list_master and free it. */
-static void
-prefix_list_delete (struct prefix_list *plist)
+ /* In case of name is all digit character */
+ if (i == strlen(name)) {
+ plist->type = PREFIX_TYPE_NUMBER;
+
+ /* Set prefix_list to number list. */
+ list = &master->num;
+
+ for (point = list->head; point; point = point->next)
+ if (atol(point->name) >= number)
+ break;
+ } else {
+ plist->type = PREFIX_TYPE_STRING;
+
+ /* Set prefix_list to string list. */
+ list = &master->str;
+
+ /* Set point to insertion point. */
+ for (point = list->head; point; point = point->next)
+ if (strcmp(point->name, name) >= 0)
+ break;
+ }
+
+ /* In case of this is the first element of master. */
+ if (list->head == NULL) {
+ list->head = list->tail = plist;
+ return plist;
+ }
+
+ /* In case of insertion is made at the tail of access_list. */
+ if (point == NULL) {
+ plist->prev = list->tail;
+ list->tail->next = plist;
+ list->tail = plist;
+ return plist;
+ }
+
+ /* In case of insertion is made at the head of access_list. */
+ if (point == list->head) {
+ plist->next = list->head;
+ list->head->prev = plist;
+ list->head = plist;
+ return plist;
+ }
+
+ /* Insertion is made at middle of the access_list. */
+ plist->next = point;
+ plist->prev = point->prev;
+
+ if (point->prev)
+ point->prev->next = plist;
+ point->prev = plist;
+
+ return plist;
+}
+
+static struct prefix_list *prefix_list_get(afi_t afi, int orf, const char *name)
{
- struct prefix_list_list *list;
- struct prefix_master *master;
- struct prefix_list_entry *pentry;
- struct prefix_list_entry *next;
+ struct prefix_list *plist;
+
+ plist = prefix_list_lookup_do(afi, orf, name);
- /* If prefix-list contain prefix_list_entry free all of it. */
- for (pentry = plist->head; pentry; pentry = next)
- {
- next = pentry->next;
- prefix_list_trie_del (plist, pentry);
- prefix_list_entry_free (pentry);
- plist->count--;
- }
+ if (plist == NULL)
+ plist = prefix_list_insert(afi, orf, name);
+ return plist;
+}
- master = plist->master;
+static void prefix_list_trie_del(struct prefix_list *plist,
+ struct prefix_list_entry *pentry);
+
+/* Delete prefix-list from prefix_list_master and free it. */
+static void prefix_list_delete(struct prefix_list *plist)
+{
+ struct prefix_list_list *list;
+ struct prefix_master *master;
+ struct prefix_list_entry *pentry;
+ struct prefix_list_entry *next;
+
+ /* If prefix-list contain prefix_list_entry free all of it. */
+ for (pentry = plist->head; pentry; pentry = next) {
+ next = pentry->next;
+ prefix_list_trie_del(plist, pentry);
+ prefix_list_entry_free(pentry);
+ plist->count--;
+ }
- if (plist->type == PREFIX_TYPE_NUMBER)
- list = &master->num;
- else
- list = &master->str;
+ master = plist->master;
- if (plist->next)
- plist->next->prev = plist->prev;
- else
- list->tail = plist->prev;
+ if (plist->type == PREFIX_TYPE_NUMBER)
+ list = &master->num;
+ else
+ list = &master->str;
- if (plist->prev)
- plist->prev->next = plist->next;
- else
- list->head = plist->next;
+ if (plist->next)
+ plist->next->prev = plist->prev;
+ else
+ list->tail = plist->prev;
- if (plist->desc)
- XFREE (MTYPE_TMP, plist->desc);
+ if (plist->prev)
+ plist->prev->next = plist->next;
+ else
+ list->head = plist->next;
- /* Make sure master's recent changed prefix-list information is
- cleared. */
- master->recent = NULL;
+ if (plist->desc)
+ XFREE(MTYPE_TMP, plist->desc);
- route_map_notify_dependencies(plist->name, RMAP_EVENT_PLIST_DELETED);
+ /* Make sure master's recent changed prefix-list information is
+ cleared. */
+ master->recent = NULL;
- if (master->delete_hook)
- (*master->delete_hook) (plist);
+ route_map_notify_dependencies(plist->name, RMAP_EVENT_PLIST_DELETED);
- if (plist->name)
- XFREE (MTYPE_MPREFIX_LIST_STR, plist->name);
+ if (master->delete_hook)
+ (*master->delete_hook)(plist);
- XFREE (MTYPE_PREFIX_LIST_TRIE, plist->trie);
+ if (plist->name)
+ XFREE(MTYPE_MPREFIX_LIST_STR, plist->name);
- prefix_list_free (plist);
+ XFREE(MTYPE_PREFIX_LIST_TRIE, plist->trie);
+ prefix_list_free(plist);
}
static struct prefix_list_entry *
-prefix_list_entry_make (struct prefix *prefix, enum prefix_list_type type,
- int seq, int le, int ge, int any)
+prefix_list_entry_make(struct prefix *prefix, enum prefix_list_type type,
+ int seq, int le, int ge, int any)
{
- struct prefix_list_entry *pentry;
+ struct prefix_list_entry *pentry;
- pentry = prefix_list_entry_new ();
+ pentry = prefix_list_entry_new();
- if (any)
- pentry->any = 1;
+ if (any)
+ pentry->any = 1;
- prefix_copy (&pentry->prefix, prefix);
- pentry->type = type;
- pentry->seq = seq;
- pentry->le = le;
- pentry->ge = ge;
+ prefix_copy(&pentry->prefix, prefix);
+ pentry->type = type;
+ pentry->seq = seq;
+ pentry->le = le;
+ pentry->ge = ge;
- return pentry;
+ return pentry;
}
/* Add hook function. */
-void
-prefix_list_add_hook (void (*func) (struct prefix_list *plist))
+void prefix_list_add_hook(void (*func)(struct prefix_list *plist))
{
- prefix_master_ipv4.add_hook = func;
- prefix_master_ipv6.add_hook = func;
+ prefix_master_ipv4.add_hook = func;
+ prefix_master_ipv6.add_hook = func;
}
/* Delete hook function. */
-void
-prefix_list_delete_hook (void (*func) (struct prefix_list *plist))
+void prefix_list_delete_hook(void (*func)(struct prefix_list *plist))
{
- prefix_master_ipv4.delete_hook = func;
- prefix_master_ipv6.delete_hook = func;
+ prefix_master_ipv4.delete_hook = func;
+ prefix_master_ipv6.delete_hook = func;
}
/* Calculate new sequential number. */
-static int
-prefix_new_seq_get (struct prefix_list *plist)
+static int prefix_new_seq_get(struct prefix_list *plist)
{
- int maxseq;
- int newseq;
- struct prefix_list_entry *pentry;
+ int maxseq;
+ int newseq;
+ struct prefix_list_entry *pentry;
- maxseq = newseq = 0;
+ maxseq = newseq = 0;
- for (pentry = plist->head; pentry; pentry = pentry->next)
- {
- if (maxseq < pentry->seq)
- maxseq = pentry->seq;
- }
+ for (pentry = plist->head; pentry; pentry = pentry->next) {
+ if (maxseq < pentry->seq)
+ maxseq = pentry->seq;
+ }
- newseq = ((maxseq / 5) * 5) + 5;
-
- return newseq;
+ newseq = ((maxseq / 5) * 5) + 5;
+
+ return newseq;
}
/* Return prefix list entry which has same seq number. */
-static struct prefix_list_entry *
-prefix_seq_check (struct prefix_list *plist, int seq)
+static struct prefix_list_entry *prefix_seq_check(struct prefix_list *plist,
+ int seq)
{
- struct prefix_list_entry *pentry;
+ struct prefix_list_entry *pentry;
- for (pentry = plist->head; pentry; pentry = pentry->next)
- if (pentry->seq == seq)
- return pentry;
- return NULL;
+ for (pentry = plist->head; pentry; pentry = pentry->next)
+ if (pentry->seq == seq)
+ return pentry;
+ return NULL;
}
static struct prefix_list_entry *
-prefix_list_entry_lookup (struct prefix_list *plist, struct prefix *prefix,
- enum prefix_list_type type, int seq, int le, int ge)
+prefix_list_entry_lookup(struct prefix_list *plist, struct prefix *prefix,
+ enum prefix_list_type type, int seq, int le, int ge)
{
- struct prefix_list_entry *pentry;
+ struct prefix_list_entry *pentry;
- for (pentry = plist->head; pentry; pentry = pentry->next)
- if (prefix_same (&pentry->prefix, prefix) && pentry->type == type)
- {
- if (seq >= 0 && pentry->seq != seq)
- continue;
+ for (pentry = plist->head; pentry; pentry = pentry->next)
+ if (prefix_same(&pentry->prefix, prefix)
+ && pentry->type == type) {
+ if (seq >= 0 && pentry->seq != seq)
+ continue;
- if (pentry->le != le)
- continue;
- if (pentry->ge != ge)
- continue;
+ if (pentry->le != le)
+ continue;
+ if (pentry->ge != ge)
+ continue;
- return pentry;
- }
+ return pentry;
+ }
- return NULL;
+ return NULL;
}
-static void
-trie_walk_affected (size_t validbits, struct pltrie_table *table, uint8_t byte,
- struct prefix_list_entry *object,
- void (*fn)(struct prefix_list_entry *object,
- struct prefix_list_entry **updptr))
+static void trie_walk_affected(size_t validbits, struct pltrie_table *table,
+ uint8_t byte, struct prefix_list_entry *object,
+ void (*fn)(struct prefix_list_entry *object,
+ struct prefix_list_entry **updptr))
{
- uint8_t mask;
- uint16_t bwalk;
+ uint8_t mask;
+ uint16_t bwalk;
- if (validbits > PLC_BITS)
- {
- fn (object, &table->entries[byte].final_chain);
- return;
- }
+ if (validbits > PLC_BITS) {
+ fn(object, &table->entries[byte].final_chain);
+ return;
+ }
- mask = (1 << (8 - validbits)) - 1;
- for (bwalk = byte & ~mask; bwalk <= byte + mask; bwalk++)
- {
- fn (object, &table->entries[bwalk].up_chain);
- }
+ mask = (1 << (8 - validbits)) - 1;
+ for (bwalk = byte & ~mask; bwalk <= byte + mask; bwalk++) {
+ fn(object, &table->entries[bwalk].up_chain);
+ }
}
-static void trie_uninstall_fn (struct prefix_list_entry *object,
- struct prefix_list_entry **updptr)
+static void trie_uninstall_fn(struct prefix_list_entry *object,
+ struct prefix_list_entry **updptr)
{
- for (; *updptr; updptr = &(*updptr)->next_best)
- if (*updptr == object)
- {
- *updptr = object->next_best;
- break;
- }
+ for (; *updptr; updptr = &(*updptr)->next_best)
+ if (*updptr == object) {
+ *updptr = object->next_best;
+ break;
+ }
}
-static int
-trie_table_empty (struct pltrie_table *table)
+static int trie_table_empty(struct pltrie_table *table)
{
- size_t i;
- for (i = 0; i < PLC_LEN; i++)
- if (table->entries[i].next_table || table->entries[i].up_chain)
- return 0;
- return 1;
+ size_t i;
+ for (i = 0; i < PLC_LEN; i++)
+ if (table->entries[i].next_table || table->entries[i].up_chain)
+ return 0;
+ return 1;
+}
+
+static void prefix_list_trie_del(struct prefix_list *plist,
+ struct prefix_list_entry *pentry)
+{
+ size_t depth, maxdepth = plist->master->trie_depth;
+ uint8_t *bytes = &pentry->prefix.u.prefix;
+ size_t validbits = pentry->prefix.prefixlen;
+ struct pltrie_table *table, **tables[PLC_MAXLEVEL];
+
+ table = plist->trie;
+ for (depth = 0; validbits > PLC_BITS && depth < maxdepth - 1; depth++) {
+ uint8_t byte = bytes[depth];
+ assert(table->entries[byte].next_table);
+
+ tables[depth + 1] = &table->entries[byte].next_table;
+ table = table->entries[byte].next_table;
+
+ validbits -= PLC_BITS;
+ }
+
+ trie_walk_affected(validbits, table, bytes[depth], pentry,
+ trie_uninstall_fn);
+
+ for (; depth > 0; depth--)
+ if (trie_table_empty(*tables[depth])) {
+ XFREE(MTYPE_PREFIX_LIST_TRIE, *tables[depth]);
+ *tables[depth] = NULL;
+ }
}
-static void
-prefix_list_trie_del (struct prefix_list *plist,
- struct prefix_list_entry *pentry)
+
+static void prefix_list_entry_delete(struct prefix_list *plist,
+ struct prefix_list_entry *pentry,
+ int update_list)
{
- size_t depth, maxdepth = plist->master->trie_depth;
- uint8_t *bytes = &pentry->prefix.u.prefix;
- size_t validbits = pentry->prefix.prefixlen;
- struct pltrie_table *table, **tables[PLC_MAXLEVEL];
+ if (plist == NULL || pentry == NULL)
+ return;
+
+ prefix_list_trie_del(plist, pentry);
- table = plist->trie;
- for (depth = 0; validbits > PLC_BITS && depth < maxdepth - 1; depth++)
- {
- uint8_t byte = bytes[depth];
- assert (table->entries[byte].next_table);
+ if (pentry->prev)
+ pentry->prev->next = pentry->next;
+ else
+ plist->head = pentry->next;
+ if (pentry->next)
+ pentry->next->prev = pentry->prev;
+ else
+ plist->tail = pentry->prev;
- tables[depth + 1] = &table->entries[byte].next_table;
- table = table->entries[byte].next_table;
+ prefix_list_entry_free(pentry);
- validbits -= PLC_BITS;
- }
+ plist->count--;
- trie_walk_affected (validbits, table, bytes[depth], pentry, trie_uninstall_fn);
+ if (update_list) {
+ route_map_notify_dependencies(plist->name,
+ RMAP_EVENT_PLIST_DELETED);
+ if (plist->master->delete_hook)
+ (*plist->master->delete_hook)(plist);
- for (; depth > 0; depth--)
- if (trie_table_empty (*tables[depth]))
- {
- XFREE (MTYPE_PREFIX_LIST_TRIE, *tables[depth]);
- *tables[depth] = NULL;
- }
+ if (plist->head == NULL && plist->tail == NULL
+ && plist->desc == NULL)
+ prefix_list_delete(plist);
+ else
+ plist->master->recent = plist;
+ }
}
+static void trie_install_fn(struct prefix_list_entry *object,
+ struct prefix_list_entry **updptr)
+{
+ while (*updptr) {
+ if (*updptr == object)
+ return;
+ if ((*updptr)->prefix.prefixlen < object->prefix.prefixlen)
+ break;
+ if ((*updptr)->seq > object->seq)
+ break;
+ updptr = &(*updptr)->next_best;
+ }
+
+ if (!object->next_best)
+ object->next_best = *updptr;
+ else
+ assert(object->next_best == *updptr || !*updptr);
+
+ *updptr = object;
+}
-static void
-prefix_list_entry_delete (struct prefix_list *plist,
- struct prefix_list_entry *pentry,
- int update_list)
+static void prefix_list_trie_add(struct prefix_list *plist,
+ struct prefix_list_entry *pentry)
{
- if (plist == NULL || pentry == NULL)
- return;
+ size_t depth = plist->master->trie_depth;
+ uint8_t *bytes = &pentry->prefix.u.prefix;
+ size_t validbits = pentry->prefix.prefixlen;
+ struct pltrie_table *table;
+
+ table = plist->trie;
+ while (validbits > PLC_BITS && depth > 1) {
+ if (!table->entries[*bytes].next_table)
+ table->entries[*bytes].next_table =
+ XCALLOC(MTYPE_PREFIX_LIST_TRIE,
+ sizeof(struct pltrie_table));
+ table = table->entries[*bytes].next_table;
+ bytes++;
+ depth--;
+ validbits -= PLC_BITS;
+ }
- prefix_list_trie_del (plist, pentry);
+ trie_walk_affected(validbits, table, *bytes, pentry, trie_install_fn);
+}
- if (pentry->prev)
- pentry->prev->next = pentry->next;
- else
- plist->head = pentry->next;
- if (pentry->next)
- pentry->next->prev = pentry->prev;
- else
- plist->tail = pentry->prev;
+static void prefix_list_entry_add(struct prefix_list *plist,
+ struct prefix_list_entry *pentry)
+{
+ struct prefix_list_entry *replace;
+ struct prefix_list_entry *point;
- prefix_list_entry_free (pentry);
+ /* Automatic asignment of seq no. */
+ if (pentry->seq == -1)
+ pentry->seq = prefix_new_seq_get(plist);
- plist->count--;
+ if (plist->tail && pentry->seq > plist->tail->seq)
+ point = NULL;
+ else {
+ /* Is there any same seq prefix list entry? */
+ replace = prefix_seq_check(plist, pentry->seq);
+ if (replace)
+ prefix_list_entry_delete(plist, replace, 0);
- if (update_list)
- {
- route_map_notify_dependencies(plist->name, RMAP_EVENT_PLIST_DELETED);
- if (plist->master->delete_hook)
- (*plist->master->delete_hook) (plist);
+ /* Check insert point. */
+ for (point = plist->head; point; point = point->next)
+ if (point->seq >= pentry->seq)
+ break;
+ }
+
+ /* In case of this is the first element of the list. */
+ pentry->next = point;
+
+ if (point) {
+ if (point->prev)
+ point->prev->next = pentry;
+ else
+ plist->head = pentry;
+
+ pentry->prev = point->prev;
+ point->prev = pentry;
+ } else {
+ if (plist->tail)
+ plist->tail->next = pentry;
+ else
+ plist->head = pentry;
+
+ pentry->prev = plist->tail;
+ plist->tail = pentry;
+ }
- if (plist->head == NULL && plist->tail == NULL && plist->desc == NULL)
- prefix_list_delete (plist);
- else
+ prefix_list_trie_add(plist, pentry);
+
+ /* Increment count. */
+ plist->count++;
+
+ /* Run hook function. */
+ if (plist->master->add_hook)
+ (*plist->master->add_hook)(plist);
+
+ route_map_notify_dependencies(plist->name, RMAP_EVENT_PLIST_ADDED);
plist->master->recent = plist;
- }
-}
-
-static void trie_install_fn (struct prefix_list_entry *object,
- struct prefix_list_entry **updptr)
-{
- while (*updptr)
- {
- if (*updptr == object)
- return;
- if ((*updptr)->prefix.prefixlen < object->prefix.prefixlen)
- break;
- if ((*updptr)->seq > object->seq)
- break;
- updptr = &(*updptr)->next_best;
- }
-
- if (!object->next_best)
- object->next_best = *updptr;
- else
- assert (object->next_best == *updptr || !*updptr);
-
- *updptr = object;
-}
-
-static void
-prefix_list_trie_add (struct prefix_list *plist,
- struct prefix_list_entry *pentry)
-{
- size_t depth = plist->master->trie_depth;
- uint8_t *bytes = &pentry->prefix.u.prefix;
- size_t validbits = pentry->prefix.prefixlen;
- struct pltrie_table *table;
-
- table = plist->trie;
- while (validbits > PLC_BITS && depth > 1)
- {
- if (!table->entries[*bytes].next_table)
- table->entries[*bytes].next_table = XCALLOC (MTYPE_PREFIX_LIST_TRIE,
- sizeof(struct pltrie_table));
- table = table->entries[*bytes].next_table;
- bytes++;
- depth--;
- validbits -= PLC_BITS;
- }
-
- trie_walk_affected (validbits, table, *bytes, pentry, trie_install_fn);
-}
-
-static void
-prefix_list_entry_add (struct prefix_list *plist,
- struct prefix_list_entry *pentry)
-{
- struct prefix_list_entry *replace;
- struct prefix_list_entry *point;
-
- /* Automatic asignment of seq no. */
- if (pentry->seq == -1)
- pentry->seq = prefix_new_seq_get (plist);
-
- if (plist->tail && pentry->seq > plist->tail->seq)
- point = NULL;
- else
- {
- /* Is there any same seq prefix list entry? */
- replace = prefix_seq_check (plist, pentry->seq);
- if (replace)
- prefix_list_entry_delete (plist, replace, 0);
-
- /* Check insert point. */
- for (point = plist->head; point; point = point->next)
- if (point->seq >= pentry->seq)
- break;
- }
-
- /* In case of this is the first element of the list. */
- pentry->next = point;
-
- if (point)
- {
- if (point->prev)
- point->prev->next = pentry;
- else
- plist->head = pentry;
-
- pentry->prev = point->prev;
- point->prev = pentry;
- }
- else
- {
- if (plist->tail)
- plist->tail->next = pentry;
- else
- plist->head = pentry;
-
- pentry->prev = plist->tail;
- plist->tail = pentry;
- }
-
- prefix_list_trie_add (plist, pentry);
-
- /* Increment count. */
- plist->count++;
-
- /* Run hook function. */
- if (plist->master->add_hook)
- (*plist->master->add_hook) (plist);
-
- route_map_notify_dependencies(plist->name, RMAP_EVENT_PLIST_ADDED);
- plist->master->recent = plist;
}
/* Return string of prefix_list_type. */
-static const char *
-prefix_list_type_str (struct prefix_list_entry *pentry)
-{
- switch (pentry->type)
- {
- case PREFIX_PERMIT:
- return "permit";
- case PREFIX_DENY:
- return "deny";
- default:
- return "";
- }
-}
-
-static int
-prefix_list_entry_match (struct prefix_list_entry *pentry, struct prefix *p)
-{
- int ret;
-
- ret = prefix_match (&pentry->prefix, p);
- if (! ret)
- return 0;
-
- /* In case of le nor ge is specified, exact match is performed. */
- if (! pentry->le && ! pentry->ge)
- {
- if (pentry->prefix.prefixlen != p->prefixlen)
- return 0;
- }
- else
- {
- if (pentry->le)
- if (p->prefixlen > pentry->le)
- return 0;
-
- if (pentry->ge)
- if (p->prefixlen < pentry->ge)
- return 0;
- }
- return 1;
-}
-
-enum prefix_list_type
-prefix_list_apply (struct prefix_list *plist, void *object)
-{
- struct prefix_list_entry *pentry, *pbest = NULL;
-
- struct prefix *p = (struct prefix *) object;
- uint8_t *byte = &p->u.prefix;
- size_t depth;
- size_t validbits = p->prefixlen;
- struct pltrie_table *table;
-
- if (plist == NULL)
- return PREFIX_DENY;
-
- if (plist->count == 0)
- return PREFIX_PERMIT;
-
- depth = plist->master->trie_depth;
- table = plist->trie;
- while (1)
- {
- for (pentry = table->entries[*byte].up_chain; pentry; pentry = pentry->next_best)
- {
- if (pbest && pbest->seq < pentry->seq)
- continue;
- if (prefix_list_entry_match (pentry, p))
- pbest = pentry;
- }
-
- if (validbits <= PLC_BITS)
- break;
- validbits -= PLC_BITS;
-
- if (--depth)
- {
- if (!table->entries[*byte].next_table)
- break;
-
- table = table->entries[*byte].next_table;
- byte++;
- continue;
- }
-
- for (pentry = table->entries[*byte].final_chain; pentry; pentry = pentry->next_best)
- {
- if (pbest && pbest->seq < pentry->seq)
- continue;
- if (prefix_list_entry_match (pentry, p))
- pbest = pentry;
- }
- break;
- }
-
- if (pbest == NULL)
- return PREFIX_DENY;
-
- return pbest->type;
-}
-
-static void __attribute__ ((unused))
-prefix_list_print (struct prefix_list *plist)
-{
- struct prefix_list_entry *pentry;
-
- if (plist == NULL)
- return;
-
- printf ("ip prefix-list %s: %d entries\n", plist->name, plist->count);
-
- for (pentry = plist->head; pentry; pentry = pentry->next)
- {
- if (pentry->any)
- printf ("any %s\n", prefix_list_type_str (pentry));
- else
- {
- struct prefix *p;
- char buf[BUFSIZ];
-
- p = &pentry->prefix;
-
- printf (" seq %u %s %s/%d",
- pentry->seq,
- prefix_list_type_str (pentry),
- inet_ntop (p->family, &p->u.prefix, buf, BUFSIZ),
- p->prefixlen);
- if (pentry->ge)
- printf (" ge %d", pentry->ge);
- if (pentry->le)
- printf (" le %d", pentry->le);
- printf ("\n");
+static const char *prefix_list_type_str(struct prefix_list_entry *pentry)
+{
+ switch (pentry->type) {
+ case PREFIX_PERMIT:
+ return "permit";
+ case PREFIX_DENY:
+ return "deny";
+ default:
+ return "";
+ }
+}
+
+static int prefix_list_entry_match(struct prefix_list_entry *pentry,
+ struct prefix *p)
+{
+ int ret;
+
+ ret = prefix_match(&pentry->prefix, p);
+ if (!ret)
+ return 0;
+
+ /* In case of le nor ge is specified, exact match is performed. */
+ if (!pentry->le && !pentry->ge) {
+ if (pentry->prefix.prefixlen != p->prefixlen)
+ return 0;
+ } else {
+ if (pentry->le)
+ if (p->prefixlen > pentry->le)
+ return 0;
+
+ if (pentry->ge)
+ if (p->prefixlen < pentry->ge)
+ return 0;
+ }
+ return 1;
+}
+
+enum prefix_list_type prefix_list_apply(struct prefix_list *plist, void *object)
+{
+ struct prefix_list_entry *pentry, *pbest = NULL;
+
+ struct prefix *p = (struct prefix *)object;
+ uint8_t *byte = &p->u.prefix;
+ size_t depth;
+ size_t validbits = p->prefixlen;
+ struct pltrie_table *table;
+
+ if (plist == NULL)
+ return PREFIX_DENY;
+
+ if (plist->count == 0)
+ return PREFIX_PERMIT;
+
+ depth = plist->master->trie_depth;
+ table = plist->trie;
+ while (1) {
+ for (pentry = table->entries[*byte].up_chain; pentry;
+ pentry = pentry->next_best) {
+ if (pbest && pbest->seq < pentry->seq)
+ continue;
+ if (prefix_list_entry_match(pentry, p))
+ pbest = pentry;
+ }
+
+ if (validbits <= PLC_BITS)
+ break;
+ validbits -= PLC_BITS;
+
+ if (--depth) {
+ if (!table->entries[*byte].next_table)
+ break;
+
+ table = table->entries[*byte].next_table;
+ byte++;
+ continue;
+ }
+
+ for (pentry = table->entries[*byte].final_chain; pentry;
+ pentry = pentry->next_best) {
+ if (pbest && pbest->seq < pentry->seq)
+ continue;
+ if (prefix_list_entry_match(pentry, p))
+ pbest = pentry;
+ }
+ break;
+ }
+
+ if (pbest == NULL)
+ return PREFIX_DENY;
+
+ return pbest->type;
+}
+
+static void __attribute__((unused)) prefix_list_print(struct prefix_list *plist)
+{
+ struct prefix_list_entry *pentry;
+
+ if (plist == NULL)
+ return;
+
+ printf("ip prefix-list %s: %d entries\n", plist->name, plist->count);
+
+ for (pentry = plist->head; pentry; pentry = pentry->next) {
+ if (pentry->any)
+ printf("any %s\n", prefix_list_type_str(pentry));
+ else {
+ struct prefix *p;
+ char buf[BUFSIZ];
+
+ p = &pentry->prefix;
+
+ printf(" seq %u %s %s/%d", pentry->seq,
+ prefix_list_type_str(pentry),
+ inet_ntop(p->family, &p->u.prefix, buf, BUFSIZ),
+ p->prefixlen);
+ if (pentry->ge)
+ printf(" ge %d", pentry->ge);
+ if (pentry->le)
+ printf(" le %d", pentry->le);
+ printf("\n");
+ }
}
- }
}
/* Retrun 1 when plist already include pentry policy. */
static struct prefix_list_entry *
-prefix_entry_dup_check (struct prefix_list *plist,
- struct prefix_list_entry *new)
-{
- size_t depth, maxdepth = plist->master->trie_depth;
- uint8_t byte, *bytes = &new->prefix.u.prefix;
- size_t validbits = new->prefix.prefixlen;
- struct pltrie_table *table;
- struct prefix_list_entry *pentry;
- int seq = 0;
-
- if (new->seq == -1)
- seq = prefix_new_seq_get (plist);
- else
- seq = new->seq;
-
- table = plist->trie;
- for (depth = 0; validbits > PLC_BITS && depth < maxdepth - 1; depth++)
- {
- byte = bytes[depth];
- if (!table->entries[byte].next_table)
- return NULL;
-
- table = table->entries[byte].next_table;
- validbits -= PLC_BITS;
- }
-
- byte = bytes[depth];
- if (validbits > PLC_BITS)
- pentry = table->entries[byte].final_chain;
- else
- pentry = table->entries[byte].up_chain;
-
- for (; pentry; pentry = pentry->next_best)
- {
- if (prefix_same (&pentry->prefix, &new->prefix)
- && pentry->type == new->type
- && pentry->le == new->le
- && pentry->ge == new->ge
- && pentry->seq != seq)
- return pentry;
- }
- return NULL;
-}
-
-static int
-vty_invalid_prefix_range (struct vty *vty, const char *prefix)
-{
- vty_out (vty, "%% Invalid prefix range for %s, make sure: len < ge-value <= le-value\n",
- prefix);
- return CMD_WARNING_CONFIG_FAILED;
-}
-
-static int
-vty_prefix_list_install (struct vty *vty, afi_t afi, const char *name,
- const char *seq, const char *typestr,
- const char *prefix, const char *ge, const char *le)
-{
- int ret;
- enum prefix_list_type type;
- struct prefix_list *plist;
- struct prefix_list_entry *pentry;
- struct prefix_list_entry *dup;
- struct prefix p, p_tmp;
- int any = 0;
- int seqnum = -1;
- int lenum = 0;
- int genum = 0;
-
- /* Sequential number. */
- if (seq)
- seqnum = atoi (seq);
-
- /* ge and le number */
- if (ge)
- genum = atoi (ge);
- if (le)
- lenum = atoi (le);
-
- /* Check filter type. */
- if (strncmp ("permit", typestr, 1) == 0)
- type = PREFIX_PERMIT;
- else if (strncmp ("deny", typestr, 1) == 0)
- type = PREFIX_DENY;
- else
- {
- vty_out (vty, "%% prefix type must be permit or deny\n");
- return CMD_WARNING_CONFIG_FAILED;
- }
-
- /* "any" is special token for matching any IPv4 addresses. */
- switch (afi)
- {
- case AFI_IP:
- if (strncmp ("any", prefix, strlen (prefix)) == 0)
- {
- ret = str2prefix_ipv4 ("0.0.0.0/0", (struct prefix_ipv4 *) &p);
- genum = 0;
- lenum = IPV4_MAX_BITLEN;
- any = 1;
+prefix_entry_dup_check(struct prefix_list *plist, struct prefix_list_entry *new)
+{
+ size_t depth, maxdepth = plist->master->trie_depth;
+ uint8_t byte, *bytes = &new->prefix.u.prefix;
+ size_t validbits = new->prefix.prefixlen;
+ struct pltrie_table *table;
+ struct prefix_list_entry *pentry;
+ int seq = 0;
+
+ if (new->seq == -1)
+ seq = prefix_new_seq_get(plist);
+ else
+ seq = new->seq;
+
+ table = plist->trie;
+ for (depth = 0; validbits > PLC_BITS && depth < maxdepth - 1; depth++) {
+ byte = bytes[depth];
+ if (!table->entries[byte].next_table)
+ return NULL;
+
+ table = table->entries[byte].next_table;
+ validbits -= PLC_BITS;
}
- else
- ret = str2prefix_ipv4 (prefix, (struct prefix_ipv4 *) &p);
- if (ret <= 0)
- {
- vty_out (vty, "%% Malformed IPv4 prefix\n");
- return CMD_WARNING_CONFIG_FAILED;
+ byte = bytes[depth];
+ if (validbits > PLC_BITS)
+ pentry = table->entries[byte].final_chain;
+ else
+ pentry = table->entries[byte].up_chain;
+
+ for (; pentry; pentry = pentry->next_best) {
+ if (prefix_same(&pentry->prefix, &new->prefix)
+ && pentry->type == new->type && pentry->le == new->le
+ && pentry->ge == new->ge && pentry->seq != seq)
+ return pentry;
+ }
+ return NULL;
+}
+
+static int vty_invalid_prefix_range(struct vty *vty, const char *prefix)
+{
+ vty_out(vty,
+ "%% Invalid prefix range for %s, make sure: len < ge-value <= le-value\n",
+ prefix);
+ return CMD_WARNING_CONFIG_FAILED;
+}
+
+static int vty_prefix_list_install(struct vty *vty, afi_t afi, const char *name,
+ const char *seq, const char *typestr,
+ const char *prefix, const char *ge,
+ const char *le)
+{
+ int ret;
+ enum prefix_list_type type;
+ struct prefix_list *plist;
+ struct prefix_list_entry *pentry;
+ struct prefix_list_entry *dup;
+ struct prefix p, p_tmp;
+ int any = 0;
+ int seqnum = -1;
+ int lenum = 0;
+ int genum = 0;
+
+ /* Sequential number. */
+ if (seq)
+ seqnum = atoi(seq);
+
+ /* ge and le number */
+ if (ge)
+ genum = atoi(ge);
+ if (le)
+ lenum = atoi(le);
+
+ /* Check filter type. */
+ if (strncmp("permit", typestr, 1) == 0)
+ type = PREFIX_PERMIT;
+ else if (strncmp("deny", typestr, 1) == 0)
+ type = PREFIX_DENY;
+ else {
+ vty_out(vty, "%% prefix type must be permit or deny\n");
+ return CMD_WARNING_CONFIG_FAILED;
}
- /* make a copy to verify prefix matches mask length */
- prefix_copy (&p_tmp, &p);
- apply_mask_ipv4 ((struct prefix_ipv4 *) &p_tmp);
-
- break;
- case AFI_IP6:
- if (strncmp ("any", prefix, strlen (prefix)) == 0)
- {
- ret = str2prefix_ipv6 ("::/0", (struct prefix_ipv6 *) &p);
- genum = 0;
- lenum = IPV6_MAX_BITLEN;
- any = 1;
+ /* "any" is special token for matching any IPv4 addresses. */
+ switch (afi) {
+ case AFI_IP:
+ if (strncmp("any", prefix, strlen(prefix)) == 0) {
+ ret = str2prefix_ipv4("0.0.0.0/0",
+ (struct prefix_ipv4 *)&p);
+ genum = 0;
+ lenum = IPV4_MAX_BITLEN;
+ any = 1;
+ } else
+ ret = str2prefix_ipv4(prefix, (struct prefix_ipv4 *)&p);
+
+ if (ret <= 0) {
+ vty_out(vty, "%% Malformed IPv4 prefix\n");
+ return CMD_WARNING_CONFIG_FAILED;
+ }
+
+ /* make a copy to verify prefix matches mask length */
+ prefix_copy(&p_tmp, &p);
+ apply_mask_ipv4((struct prefix_ipv4 *)&p_tmp);
+
+ break;
+ case AFI_IP6:
+ if (strncmp("any", prefix, strlen(prefix)) == 0) {
+ ret = str2prefix_ipv6("::/0", (struct prefix_ipv6 *)&p);
+ genum = 0;
+ lenum = IPV6_MAX_BITLEN;
+ any = 1;
+ } else
+ ret = str2prefix_ipv6(prefix, (struct prefix_ipv6 *)&p);
+
+ if (ret <= 0) {
+ vty_out(vty, "%% Malformed IPv6 prefix\n");
+ return CMD_WARNING_CONFIG_FAILED;
+ }
+
+ /* make a copy to verify prefix matches mask length */
+ prefix_copy(&p_tmp, &p);
+ apply_mask_ipv6((struct prefix_ipv6 *)&p_tmp);
+
+ break;
+ case AFI_L2VPN:
+ default:
+ vty_out(vty, "%% Unrecognized AFI (%d)\n", afi);
+ return CMD_WARNING_CONFIG_FAILED;
+ break;
}
- else
- ret = str2prefix_ipv6 (prefix, (struct prefix_ipv6 *) &p);
- if (ret <= 0)
- {
- vty_out (vty, "%% Malformed IPv6 prefix\n");
- return CMD_WARNING_CONFIG_FAILED;
+ /* If prefix has bits not under the mask, adjust it to fit */
+ if (!prefix_same(&p_tmp, &p)) {
+ char buf[PREFIX2STR_BUFFER];
+ char buf_tmp[PREFIX2STR_BUFFER];
+ prefix2str(&p, buf, sizeof(buf));
+ prefix2str(&p_tmp, buf_tmp, sizeof(buf_tmp));
+ zlog_warn(
+ "Prefix-list %s prefix changed from %s to %s to match length",
+ name, buf, buf_tmp);
+ p = p_tmp;
}
- /* make a copy to verify prefix matches mask length */
- prefix_copy (&p_tmp, &p);
- apply_mask_ipv6 ((struct prefix_ipv6 *) &p_tmp);
-
- break;
- case AFI_L2VPN:
- default:
- vty_out (vty, "%% Unrecognized AFI (%d)\n", afi);
- return CMD_WARNING_CONFIG_FAILED;
- break;
- }
-
- /* If prefix has bits not under the mask, adjust it to fit */
- if (!prefix_same (&p_tmp, &p))
- {
- char buf[PREFIX2STR_BUFFER];
- char buf_tmp[PREFIX2STR_BUFFER];
- prefix2str(&p, buf, sizeof(buf));
- prefix2str(&p_tmp, buf_tmp, sizeof(buf_tmp));
- zlog_warn ("Prefix-list %s prefix changed from %s to %s to match length",
- name, buf, buf_tmp);
- p = p_tmp;
- }
-
- /* ge and le check. */
- if (genum && (genum <= p.prefixlen))
- return vty_invalid_prefix_range (vty, prefix);
-
- if (lenum && (lenum <= p.prefixlen))
- return vty_invalid_prefix_range (vty, prefix);
-
- if (lenum && (genum > lenum))
- return vty_invalid_prefix_range (vty, prefix);
-
- if (genum && (lenum == (afi == AFI_IP ? 32 : 128)))
- lenum = 0;
-
- /* Get prefix_list with name. */
- plist = prefix_list_get (afi, 0, name);
-
- /* Make prefix entry. */
- pentry = prefix_list_entry_make (&p, type, seqnum, lenum, genum, any);
-
- /* Check same policy. */
- dup = prefix_entry_dup_check (plist, pentry);
-
- if (dup)
- {
- prefix_list_entry_free (pentry);
- return CMD_SUCCESS;
- }
-
- /* Install new filter to the access_list. */
- prefix_list_entry_add (plist, pentry);
-
- return CMD_SUCCESS;
-}
-
-static int
-vty_prefix_list_uninstall (struct vty *vty, afi_t afi, const char *name,
- const char *seq, const char *typestr,
- const char *prefix, const char *ge, const char *le)
-{
- int ret;
- enum prefix_list_type type;
- struct prefix_list *plist;
- struct prefix_list_entry *pentry;
- struct prefix p;
- int seqnum = -1;
- int lenum = 0;
- int genum = 0;
-
- /* Check prefix list name. */
- plist = prefix_list_lookup (afi, name);
- if (! plist)
- {
- vty_out (vty, "%% Can't find specified prefix-list\n");
- return CMD_WARNING_CONFIG_FAILED;
- }
-
- /* Only prefix-list name specified, delete the entire prefix-list. */
- if (seq == NULL && typestr == NULL && prefix == NULL &&
- ge == NULL && le == NULL)
- {
- prefix_list_delete (plist);
- return CMD_SUCCESS;
- }
-
- /* We must have, at a minimum, both the type and prefix here */
- if ((typestr == NULL) || (prefix == NULL))
- {
- vty_out (vty, "%% Both prefix and type required\n");
- return CMD_WARNING_CONFIG_FAILED;
- }
-
- /* Check sequence number. */
- if (seq)
- seqnum = atoi (seq);
-
- /* ge and le number */
- if (ge)
- genum = atoi (ge);
- if (le)
- lenum = atoi (le);
-
- /* Check of filter type. */
- if (strncmp ("permit", typestr, 1) == 0)
- type = PREFIX_PERMIT;
- else if (strncmp ("deny", typestr, 1) == 0)
- type = PREFIX_DENY;
- else
- {
- vty_out (vty, "%% prefix type must be permit or deny\n");
- return CMD_WARNING_CONFIG_FAILED;
- }
-
- /* "any" is special token for matching any IPv4 addresses. */
- if (afi == AFI_IP)
- {
- if (strncmp ("any", prefix, strlen (prefix)) == 0)
- {
- ret = str2prefix_ipv4 ("0.0.0.0/0", (struct prefix_ipv4 *) &p);
- genum = 0;
- lenum = IPV4_MAX_BITLEN;
+ /* ge and le check. */
+ if (genum && (genum <= p.prefixlen))
+ return vty_invalid_prefix_range(vty, prefix);
+
+ if (lenum && (lenum <= p.prefixlen))
+ return vty_invalid_prefix_range(vty, prefix);
+
+ if (lenum && (genum > lenum))
+ return vty_invalid_prefix_range(vty, prefix);
+
+ if (genum && (lenum == (afi == AFI_IP ? 32 : 128)))
+ lenum = 0;
+
+ /* Get prefix_list with name. */
+ plist = prefix_list_get(afi, 0, name);
+
+ /* Make prefix entry. */
+ pentry = prefix_list_entry_make(&p, type, seqnum, lenum, genum, any);
+
+ /* Check same policy. */
+ dup = prefix_entry_dup_check(plist, pentry);
+
+ if (dup) {
+ prefix_list_entry_free(pentry);
+ return CMD_SUCCESS;
}
- else
- ret = str2prefix_ipv4 (prefix, (struct prefix_ipv4 *) &p);
- if (ret <= 0)
- {
- vty_out (vty, "%% Malformed IPv4 prefix\n");
- return CMD_WARNING_CONFIG_FAILED;
+ /* Install new filter to the access_list. */
+ prefix_list_entry_add(plist, pentry);
+
+ return CMD_SUCCESS;
+}
+
+static int vty_prefix_list_uninstall(struct vty *vty, afi_t afi,
+ const char *name, const char *seq,
+ const char *typestr, const char *prefix,
+ const char *ge, const char *le)
+{
+ int ret;
+ enum prefix_list_type type;
+ struct prefix_list *plist;
+ struct prefix_list_entry *pentry;
+ struct prefix p;
+ int seqnum = -1;
+ int lenum = 0;
+ int genum = 0;
+
+ /* Check prefix list name. */
+ plist = prefix_list_lookup(afi, name);
+ if (!plist) {
+ vty_out(vty, "%% Can't find specified prefix-list\n");
+ return CMD_WARNING_CONFIG_FAILED;
}
- }
- else if (afi == AFI_IP6)
- {
- if (strncmp ("any", prefix, strlen (prefix)) == 0)
- {
- ret = str2prefix_ipv6 ("::/0", (struct prefix_ipv6 *) &p);
- genum = 0;
- lenum = IPV6_MAX_BITLEN;
+
+ /* Only prefix-list name specified, delete the entire prefix-list. */
+ if (seq == NULL && typestr == NULL && prefix == NULL && ge == NULL
+ && le == NULL) {
+ prefix_list_delete(plist);
+ return CMD_SUCCESS;
}
- else
- ret = str2prefix_ipv6 (prefix, (struct prefix_ipv6 *) &p);
- if (ret <= 0)
- {
- vty_out (vty, "%% Malformed IPv6 prefix\n");
- return CMD_WARNING_CONFIG_FAILED;
+ /* We must have, at a minimum, both the type and prefix here */
+ if ((typestr == NULL) || (prefix == NULL)) {
+ vty_out(vty, "%% Both prefix and type required\n");
+ return CMD_WARNING_CONFIG_FAILED;
}
- }
- /* Lookup prefix entry. */
- pentry = prefix_list_entry_lookup(plist, &p, type, seqnum, lenum, genum);
+ /* Check sequence number. */
+ if (seq)
+ seqnum = atoi(seq);
+
+ /* ge and le number */
+ if (ge)
+ genum = atoi(ge);
+ if (le)
+ lenum = atoi(le);
+
+ /* Check of filter type. */
+ if (strncmp("permit", typestr, 1) == 0)
+ type = PREFIX_PERMIT;
+ else if (strncmp("deny", typestr, 1) == 0)
+ type = PREFIX_DENY;
+ else {
+ vty_out(vty, "%% prefix type must be permit or deny\n");
+ return CMD_WARNING_CONFIG_FAILED;
+ }
- if (pentry == NULL)
- {
- vty_out (vty, "%% Can't find specified prefix-list\n");
- return CMD_WARNING_CONFIG_FAILED;
- }
+ /* "any" is special token for matching any IPv4 addresses. */
+ if (afi == AFI_IP) {
+ if (strncmp("any", prefix, strlen(prefix)) == 0) {
+ ret = str2prefix_ipv4("0.0.0.0/0",
+ (struct prefix_ipv4 *)&p);
+ genum = 0;
+ lenum = IPV4_MAX_BITLEN;
+ } else
+ ret = str2prefix_ipv4(prefix, (struct prefix_ipv4 *)&p);
+
+ if (ret <= 0) {
+ vty_out(vty, "%% Malformed IPv4 prefix\n");
+ return CMD_WARNING_CONFIG_FAILED;
+ }
+ } else if (afi == AFI_IP6) {
+ if (strncmp("any", prefix, strlen(prefix)) == 0) {
+ ret = str2prefix_ipv6("::/0", (struct prefix_ipv6 *)&p);
+ genum = 0;
+ lenum = IPV6_MAX_BITLEN;
+ } else
+ ret = str2prefix_ipv6(prefix, (struct prefix_ipv6 *)&p);
+
+ if (ret <= 0) {
+ vty_out(vty, "%% Malformed IPv6 prefix\n");
+ return CMD_WARNING_CONFIG_FAILED;
+ }
+ }
- /* Install new filter to the access_list. */
- prefix_list_entry_delete (plist, pentry, 1);
+ /* Lookup prefix entry. */
+ pentry =
+ prefix_list_entry_lookup(plist, &p, type, seqnum, lenum, genum);
- return CMD_SUCCESS;
+ if (pentry == NULL) {
+ vty_out(vty, "%% Can't find specified prefix-list\n");
+ return CMD_WARNING_CONFIG_FAILED;
+ }
+
+ /* Install new filter to the access_list. */
+ prefix_list_entry_delete(plist, pentry, 1);
+
+ return CMD_SUCCESS;
}
-static int
-vty_prefix_list_desc_unset (struct vty *vty, afi_t afi, const char *name)
+static int vty_prefix_list_desc_unset(struct vty *vty, afi_t afi,
+ const char *name)
{
- struct prefix_list *plist;
+ struct prefix_list *plist;
- plist = prefix_list_lookup (afi, name);
- if (! plist)
- {
- vty_out (vty, "%% Can't find specified prefix-list\n");
- return CMD_WARNING_CONFIG_FAILED;
- }
+ plist = prefix_list_lookup(afi, name);
+ if (!plist) {
+ vty_out(vty, "%% Can't find specified prefix-list\n");
+ return CMD_WARNING_CONFIG_FAILED;
+ }
- if (plist->desc)
- {
- XFREE (MTYPE_TMP, plist->desc);
- plist->desc = NULL;
- }
+ if (plist->desc) {
+ XFREE(MTYPE_TMP, plist->desc);
+ plist->desc = NULL;
+ }
- if (plist->head == NULL && plist->tail == NULL && plist->desc == NULL)
- prefix_list_delete (plist);
+ if (plist->head == NULL && plist->tail == NULL && plist->desc == NULL)
+ prefix_list_delete(plist);
- return CMD_SUCCESS;
+ return CMD_SUCCESS;
}
-enum display_type
-{
- normal_display,
- summary_display,
- detail_display,
- sequential_display,
- longer_display,
- first_match_display
+enum display_type {
+ normal_display,
+ summary_display,
+ detail_display,
+ sequential_display,
+ longer_display,
+ first_match_display
};
-static void
-vty_show_prefix_entry (struct vty *vty, afi_t afi, struct prefix_list *plist,
- struct prefix_master *master, enum display_type dtype,
- int seqnum)
-{
- struct prefix_list_entry *pentry;
-
- /* Print the name of the protocol */
- vty_out(vty, "%s: ", frr_protoname);
-
- if (dtype == normal_display)
- {
- vty_out (vty, "ip%s prefix-list %s: %d entries\n",
- afi == AFI_IP ? "" : "v6",
- plist->name, plist->count);
- if (plist->desc)
- vty_out (vty, " Description: %s\n", plist->desc);
- }
- else if (dtype == summary_display || dtype == detail_display)
- {
- vty_out (vty, "ip%s prefix-list %s:\n",
- afi == AFI_IP ? "" : "v6", plist->name);
-
- if (plist->desc)
- vty_out (vty, " Description: %s\n", plist->desc);
-
- vty_out (vty, " count: %d, range entries: %d, sequences: %u - %u\n",
- plist->count, plist->rangecount,
- plist->head ? plist->head->seq : 0,
- plist->tail ? plist->tail->seq : 0);
- }
-
- if (dtype != summary_display)
- {
- for (pentry = plist->head; pentry; pentry = pentry->next)
- {
- if (dtype == sequential_display && pentry->seq != seqnum)
- continue;
-
- vty_out (vty, " ");
-
- if (master->seqnum)
- vty_out (vty, "seq %u ", pentry->seq);
-
- vty_out (vty, "%s ", prefix_list_type_str (pentry));
-
- if (pentry->any)
- vty_out (vty, "any");
- else
- {
- struct prefix *p = &pentry->prefix;
- char buf[BUFSIZ];
-
- vty_out (vty, "%s/%d",
- inet_ntop (p->family, &p->u.prefix, buf, BUFSIZ),
- p->prefixlen);
-
- if (pentry->ge)
- vty_out (vty, " ge %d", pentry->ge);
- if (pentry->le)
- vty_out (vty, " le %d", pentry->le);
- }
-
- if (dtype == detail_display || dtype == sequential_display)
- vty_out (vty, " (hit count: %ld, refcount: %ld)",
- pentry->hitcnt, pentry->refcnt);
-
- vty_out (vty, "\n");
+static void vty_show_prefix_entry(struct vty *vty, afi_t afi,
+ struct prefix_list *plist,
+ struct prefix_master *master,
+ enum display_type dtype, int seqnum)
+{
+ struct prefix_list_entry *pentry;
+
+ /* Print the name of the protocol */
+ vty_out(vty, "%s: ", frr_protoname);
+
+ if (dtype == normal_display) {
+ vty_out(vty, "ip%s prefix-list %s: %d entries\n",
+ afi == AFI_IP ? "" : "v6", plist->name, plist->count);
+ if (plist->desc)
+ vty_out(vty, " Description: %s\n", plist->desc);
+ } else if (dtype == summary_display || dtype == detail_display) {
+ vty_out(vty, "ip%s prefix-list %s:\n",
+ afi == AFI_IP ? "" : "v6", plist->name);
+
+ if (plist->desc)
+ vty_out(vty, " Description: %s\n", plist->desc);
+
+ vty_out(vty,
+ " count: %d, range entries: %d, sequences: %u - %u\n",
+ plist->count, plist->rangecount,
+ plist->head ? plist->head->seq : 0,
+ plist->tail ? plist->tail->seq : 0);
}
- }
-}
-static int
-vty_show_prefix_list (struct vty *vty, afi_t afi, const char *name,
- const char *seq, enum display_type dtype)
-{
- struct prefix_list *plist;
- struct prefix_master *master;
- int seqnum = 0;
+ if (dtype != summary_display) {
+ for (pentry = plist->head; pentry; pentry = pentry->next) {
+ if (dtype == sequential_display
+ && pentry->seq != seqnum)
+ continue;
- master = prefix_master_get (afi, 0);
- if (master == NULL)
- return CMD_WARNING;
+ vty_out(vty, " ");
- if (seq)
- seqnum = atoi (seq);
+ if (master->seqnum)
+ vty_out(vty, "seq %u ", pentry->seq);
- if (name)
- {
- plist = prefix_list_lookup (afi, name);
- if (! plist)
- {
- vty_out (vty, "%% Can't find specified prefix-list\n");
- return CMD_WARNING;
- }
- vty_show_prefix_entry (vty, afi, plist, master, dtype, seqnum);
- }
- else
- {
- if (dtype == detail_display || dtype == summary_display)
- {
- if (master->recent)
- vty_out (vty, "Prefix-list with the last deletion/insertion: %s\n",
- master->recent->name);
- }
+ vty_out(vty, "%s ", prefix_list_type_str(pentry));
- for (plist = master->num.head; plist; plist = plist->next)
- vty_show_prefix_entry (vty, afi, plist, master, dtype, seqnum);
-
- for (plist = master->str.head; plist; plist = plist->next)
- vty_show_prefix_entry (vty, afi, plist, master, dtype, seqnum);
- }
-
- return CMD_SUCCESS;
-}
-
-static int
-vty_show_prefix_list_prefix (struct vty *vty, afi_t afi, const char *name,
- const char *prefix, enum display_type type)
-{
- struct prefix_list *plist;
- struct prefix_list_entry *pentry;
- struct prefix p;
- int ret;
- int match;
-
- plist = prefix_list_lookup (afi, name);
- if (! plist)
- {
- vty_out (vty, "%% Can't find specified prefix-list\n");
- return CMD_WARNING;
- }
-
- ret = str2prefix (prefix, &p);
- if (ret <= 0)
- {
- vty_out (vty, "%% prefix is malformed\n");
- return CMD_WARNING;
- }
-
- for (pentry = plist->head; pentry; pentry = pentry->next)
- {
- match = 0;
-
- if (type == normal_display || type == first_match_display)
- if (prefix_same (&p, &pentry->prefix))
- match = 1;
-
- if (type == longer_display)
- if (prefix_match (&p, &pentry->prefix))
- match = 1;
-
- if (match)
- {
- vty_out (vty, " seq %u %s ",
- pentry->seq,
- prefix_list_type_str (pentry));
-
- if (pentry->any)
- vty_out (vty, "any");
- else
- {
- struct prefix *p = &pentry->prefix;
- char buf[BUFSIZ];
-
- vty_out (vty, "%s/%d",
- inet_ntop (p->family, &p->u.prefix, buf, BUFSIZ),
- p->prefixlen);
-
- if (pentry->ge)
- vty_out (vty, " ge %d", pentry->ge);
- if (pentry->le)
- vty_out (vty, " le %d", pentry->le);
- }
-
- if (type == normal_display || type == first_match_display)
- vty_out (vty, " (hit count: %ld, refcount: %ld)",
- pentry->hitcnt, pentry->refcnt);
-
- vty_out (vty, "\n");
-
- if (type == first_match_display)
- return CMD_SUCCESS;
+ if (pentry->any)
+ vty_out(vty, "any");
+ else {
+ struct prefix *p = &pentry->prefix;
+ char buf[BUFSIZ];
+
+ vty_out(vty, "%s/%d",
+ inet_ntop(p->family, &p->u.prefix, buf,
+ BUFSIZ),
+ p->prefixlen);
+
+ if (pentry->ge)
+ vty_out(vty, " ge %d", pentry->ge);
+ if (pentry->le)
+ vty_out(vty, " le %d", pentry->le);
+ }
+
+ if (dtype == detail_display
+ || dtype == sequential_display)
+ vty_out(vty, " (hit count: %ld, refcount: %ld)",
+ pentry->hitcnt, pentry->refcnt);
+
+ vty_out(vty, "\n");
+ }
}
- }
- return CMD_SUCCESS;
}
-static int
-vty_clear_prefix_list (struct vty *vty, afi_t afi, const char *name,
- const char *prefix)
-{
- struct prefix_master *master;
- struct prefix_list *plist;
- struct prefix_list_entry *pentry;
- int ret;
- struct prefix p;
+static int vty_show_prefix_list(struct vty *vty, afi_t afi, const char *name,
+ const char *seq, enum display_type dtype)
+{
+ struct prefix_list *plist;
+ struct prefix_master *master;
+ int seqnum = 0;
+
+ master = prefix_master_get(afi, 0);
+ if (master == NULL)
+ return CMD_WARNING;
+
+ if (seq)
+ seqnum = atoi(seq);
+
+ if (name) {
+ plist = prefix_list_lookup(afi, name);
+ if (!plist) {
+ vty_out(vty, "%% Can't find specified prefix-list\n");
+ return CMD_WARNING;
+ }
+ vty_show_prefix_entry(vty, afi, plist, master, dtype, seqnum);
+ } else {
+ if (dtype == detail_display || dtype == summary_display) {
+ if (master->recent)
+ vty_out(vty,
+ "Prefix-list with the last deletion/insertion: %s\n",
+ master->recent->name);
+ }
+
+ for (plist = master->num.head; plist; plist = plist->next)
+ vty_show_prefix_entry(vty, afi, plist, master, dtype,
+ seqnum);
+
+ for (plist = master->str.head; plist; plist = plist->next)
+ vty_show_prefix_entry(vty, afi, plist, master, dtype,
+ seqnum);
+ }
- master = prefix_master_get (afi, 0);
- if (master == NULL)
- return CMD_WARNING;
+ return CMD_SUCCESS;
+}
- if (name == NULL && prefix == NULL)
- {
- for (plist = master->num.head; plist; plist = plist->next)
- for (pentry = plist->head; pentry; pentry = pentry->next)
- pentry->hitcnt = 0;
+static int vty_show_prefix_list_prefix(struct vty *vty, afi_t afi,
+ const char *name, const char *prefix,
+ enum display_type type)
+{
+ struct prefix_list *plist;
+ struct prefix_list_entry *pentry;
+ struct prefix p;
+ int ret;
+ int match;
- for (plist = master->str.head; plist; plist = plist->next)
- for (pentry = plist->head; pentry; pentry = pentry->next)
- pentry->hitcnt = 0;
- }
- else
- {
- plist = prefix_list_lookup (afi, name);
- if (! plist)
- {
- vty_out (vty, "%% Can't find specified prefix-list\n");
- return CMD_WARNING;
+ plist = prefix_list_lookup(afi, name);
+ if (!plist) {
+ vty_out(vty, "%% Can't find specified prefix-list\n");
+ return CMD_WARNING;
}
- if (prefix)
- {
- ret = str2prefix (prefix, &p);
- if (ret <= 0)
- {
- vty_out (vty, "%% prefix is malformed\n");
- return CMD_WARNING;
- }
+ ret = str2prefix(prefix, &p);
+ if (ret <= 0) {
+ vty_out(vty, "%% prefix is malformed\n");
+ return CMD_WARNING;
}
- for (pentry = plist->head; pentry; pentry = pentry->next)
- {
- if (prefix)
- {
- if (prefix_match (&pentry->prefix, &p))
- pentry->hitcnt = 0;
- }
- else
- pentry->hitcnt = 0;
+ for (pentry = plist->head; pentry; pentry = pentry->next) {
+ match = 0;
+
+ if (type == normal_display || type == first_match_display)
+ if (prefix_same(&p, &pentry->prefix))
+ match = 1;
+
+ if (type == longer_display)
+ if (prefix_match(&p, &pentry->prefix))
+ match = 1;
+
+ if (match) {
+ vty_out(vty, " seq %u %s ", pentry->seq,
+ prefix_list_type_str(pentry));
+
+ if (pentry->any)
+ vty_out(vty, "any");
+ else {
+ struct prefix *p = &pentry->prefix;
+ char buf[BUFSIZ];
+
+ vty_out(vty, "%s/%d",
+ inet_ntop(p->family, &p->u.prefix, buf,
+ BUFSIZ),
+ p->prefixlen);
+
+ if (pentry->ge)
+ vty_out(vty, " ge %d", pentry->ge);
+ if (pentry->le)
+ vty_out(vty, " le %d", pentry->le);
+ }
+
+ if (type == normal_display
+ || type == first_match_display)
+ vty_out(vty, " (hit count: %ld, refcount: %ld)",
+ pentry->hitcnt, pentry->refcnt);
+
+ vty_out(vty, "\n");
+
+ if (type == first_match_display)
+ return CMD_SUCCESS;
+ }
}
- }
- return CMD_SUCCESS;
+ return CMD_SUCCESS;
+}
+
+static int vty_clear_prefix_list(struct vty *vty, afi_t afi, const char *name,
+ const char *prefix)
+{
+ struct prefix_master *master;
+ struct prefix_list *plist;
+ struct prefix_list_entry *pentry;
+ int ret;
+ struct prefix p;
+
+ master = prefix_master_get(afi, 0);
+ if (master == NULL)
+ return CMD_WARNING;
+
+ if (name == NULL && prefix == NULL) {
+ for (plist = master->num.head; plist; plist = plist->next)
+ for (pentry = plist->head; pentry;
+ pentry = pentry->next)
+ pentry->hitcnt = 0;
+
+ for (plist = master->str.head; plist; plist = plist->next)
+ for (pentry = plist->head; pentry;
+ pentry = pentry->next)
+ pentry->hitcnt = 0;
+ } else {
+ plist = prefix_list_lookup(afi, name);
+ if (!plist) {
+ vty_out(vty, "%% Can't find specified prefix-list\n");
+ return CMD_WARNING;
+ }
+
+ if (prefix) {
+ ret = str2prefix(prefix, &p);
+ if (ret <= 0) {
+ vty_out(vty, "%% prefix is malformed\n");
+ return CMD_WARNING;
+ }
+ }
+
+ for (pentry = plist->head; pentry; pentry = pentry->next) {
+ if (prefix) {
+ if (prefix_match(&pentry->prefix, &p))
+ pentry->hitcnt = 0;
+ } else
+ pentry->hitcnt = 0;
+ }
+ }
+ return CMD_SUCCESS;
}
#ifndef VTYSH_EXTRACT_PL
@@ -1433,8 +1311,8 @@ DEFPY (ip_prefix_list,
"Maximum prefix length to be matched\n"
"Maximum prefix length\n")
{
- return vty_prefix_list_install (vty, AFI_IP, prefix_list, seq_str, action,
- dest, ge_str, le_str);
+ return vty_prefix_list_install(vty, AFI_IP, prefix_list, seq_str,
+ action, dest, ge_str, le_str);
}
DEFPY (no_ip_prefix_list,
@@ -1455,8 +1333,8 @@ DEFPY (no_ip_prefix_list,
"Maximum prefix length to be matched\n"
"Maximum prefix length\n")
{
- return vty_prefix_list_uninstall (vty, AFI_IP, prefix_list, seq_str, action,
- dest, ge_str, le_str);
+ return vty_prefix_list_uninstall(vty, AFI_IP, prefix_list, seq_str,
+ action, dest, ge_str, le_str);
}
DEFPY (no_ip_prefix_list_all,
@@ -1467,8 +1345,8 @@ DEFPY (no_ip_prefix_list_all,
PREFIX_LIST_STR
"Name of a prefix list\n")
{
- return vty_prefix_list_uninstall (vty, AFI_IP, prefix_list, NULL, NULL,
- NULL, NULL, NULL);
+ return vty_prefix_list_uninstall(vty, AFI_IP, prefix_list, NULL, NULL,
+ NULL, NULL, NULL);
}
DEFPY (ip_prefix_list_sequence_number,
@@ -1479,8 +1357,8 @@ DEFPY (ip_prefix_list_sequence_number,
PREFIX_LIST_STR
"Include/exclude sequence numbers in NVGEN\n")
{
- prefix_master_ipv4.seqnum = no ? 0 : 1;
- return CMD_SUCCESS;
+ prefix_master_ipv4.seqnum = no ? 0 : 1;
+ return CMD_SUCCESS;
}
DEFUN (ip_prefix_list_description,
@@ -1492,20 +1370,19 @@ DEFUN (ip_prefix_list_description,
"Prefix-list specific description\n"
"Up to 80 characters describing this prefix-list\n")
{
- int idx_word = 2;
- int idx_line = 4;
- struct prefix_list *plist;
+ int idx_word = 2;
+ int idx_line = 4;
+ struct prefix_list *plist;
+
+ plist = prefix_list_get(AFI_IP, 0, argv[idx_word]->arg);
- plist = prefix_list_get (AFI_IP, 0, argv[idx_word]->arg);
-
- if (plist->desc)
- {
- XFREE (MTYPE_TMP, plist->desc);
- plist->desc = NULL;
- }
- plist->desc = argv_concat(argv, argc, idx_line);
+ if (plist->desc) {
+ XFREE(MTYPE_TMP, plist->desc);
+ plist->desc = NULL;
+ }
+ plist->desc = argv_concat(argv, argc, idx_line);
- return CMD_SUCCESS;
+ return CMD_SUCCESS;
}
DEFUN (no_ip_prefix_list_description,
@@ -1517,8 +1394,8 @@ DEFUN (no_ip_prefix_list_description,
"Name of a prefix list\n"
"Prefix-list specific description\n")
{
- int idx_word = 3;
- return vty_prefix_list_desc_unset (vty, AFI_IP, argv[idx_word]->arg);
+ int idx_word = 3;
+ return vty_prefix_list_desc_unset(vty, AFI_IP, argv[idx_word]->arg);
}
/* ALIAS_FIXME */
@@ -1532,7 +1409,7 @@ DEFUN (no_ip_prefix_list_description_comment,
"Prefix-list specific description\n"
"Up to 80 characters describing this prefix-list\n")
{
- return no_ip_prefix_list_description (self, vty, argc, argv);
+ return no_ip_prefix_list_description(self, vty, argc, argv);
}
DEFPY (show_ip_prefix_list,
@@ -1545,11 +1422,11 @@ DEFPY (show_ip_prefix_list,
"sequence number of an entry\n"
"Sequence number\n")
{
- enum display_type dtype = normal_display;
- if (dseq)
- dtype = sequential_display;
+ enum display_type dtype = normal_display;
+ if (dseq)
+ dtype = sequential_display;
- return vty_show_prefix_list (vty, AFI_IP, prefix_list, arg_str, dtype);
+ return vty_show_prefix_list(vty, AFI_IP, prefix_list, arg_str, dtype);
}
DEFPY (show_ip_prefix_list_prefix,
@@ -1563,13 +1440,14 @@ DEFPY (show_ip_prefix_list_prefix,
"Lookup longer prefix\n"
"First matched prefix\n")
{
- enum display_type dtype = normal_display;
- if (dl)
- dtype = longer_display;
- else if (dfm)
- dtype = first_match_display;
+ enum display_type dtype = normal_display;
+ if (dl)
+ dtype = longer_display;
+ else if (dfm)
+ dtype = first_match_display;
- return vty_show_prefix_list_prefix (vty, AFI_IP, prefix_list, prefix_str, dtype);
+ return vty_show_prefix_list_prefix(vty, AFI_IP, prefix_list, prefix_str,
+ dtype);
}
DEFPY (show_ip_prefix_list_summary,
@@ -1581,7 +1459,8 @@ DEFPY (show_ip_prefix_list_summary,
"Summary of prefix lists\n"
"Name of a prefix list\n")
{
- return vty_show_prefix_list (vty, AFI_IP, prefix_list, NULL, summary_display);
+ return vty_show_prefix_list(vty, AFI_IP, prefix_list, NULL,
+ summary_display);
}
DEFPY (show_ip_prefix_list_detail,
@@ -1593,7 +1472,8 @@ DEFPY (show_ip_prefix_list_detail,
"Detail of prefix lists\n"
"Name of a prefix list\n")
{
- return vty_show_prefix_list (vty, AFI_IP, prefix_list, NULL, detail_display);
+ return vty_show_prefix_list(vty, AFI_IP, prefix_list, NULL,
+ detail_display);
}
DEFPY (clear_ip_prefix_list,
@@ -1605,7 +1485,7 @@ DEFPY (clear_ip_prefix_list,
"Name of a prefix list\n"
"IP prefix <network>/<length>, e.g., 35.0.0.0/8\n")
{
- return vty_clear_prefix_list (vty, AFI_IP, prefix_list, prefix_str);
+ return vty_clear_prefix_list(vty, AFI_IP, prefix_list, prefix_str);
}
DEFPY (ipv6_prefix_list,
@@ -1625,8 +1505,8 @@ DEFPY (ipv6_prefix_list,
"Minimum prefix length to be matched\n"
"Minimum prefix length\n")
{
- return vty_prefix_list_install (vty, AFI_IP6, prefix_list, seq_str, action,
- dest, ge_str, le_str);
+ return vty_prefix_list_install(vty, AFI_IP6, prefix_list, seq_str,
+ action, dest, ge_str, le_str);
}
DEFPY (no_ipv6_prefix_list,
@@ -1647,8 +1527,8 @@ DEFPY (no_ipv6_prefix_list,
"Minimum prefix length to be matched\n"
"Minimum prefix length\n")
{
- return vty_prefix_list_uninstall (vty, AFI_IP6, prefix_list, seq_str, action,
- dest, ge_str, le_str);
+ return vty_prefix_list_uninstall(vty, AFI_IP6, prefix_list, seq_str,
+ action, dest, ge_str, le_str);
}
DEFPY (no_ipv6_prefix_list_all,
@@ -1659,8 +1539,8 @@ DEFPY (no_ipv6_prefix_list_all,
PREFIX_LIST_STR
"Name of a prefix list\n")
{
- return vty_prefix_list_uninstall (vty, AFI_IP6, prefix_list, NULL, NULL,
- NULL, NULL, NULL);
+ return vty_prefix_list_uninstall(vty, AFI_IP6, prefix_list, NULL, NULL,
+ NULL, NULL, NULL);
}
DEFPY (ipv6_prefix_list_sequence_number,
@@ -1671,8 +1551,8 @@ DEFPY (ipv6_prefix_list_sequence_number,
PREFIX_LIST_STR
"Include/exclude sequence numbers in NVGEN\n")
{
- prefix_master_ipv6.seqnum = no ? 0 : 1;
- return CMD_SUCCESS;
+ prefix_master_ipv6.seqnum = no ? 0 : 1;
+ return CMD_SUCCESS;
}
DEFUN (ipv6_prefix_list_description,
@@ -1684,20 +1564,19 @@ DEFUN (ipv6_prefix_list_description,
"Prefix-list specific description\n"
"Up to 80 characters describing this prefix-list\n")
{
- int idx_word = 2;
- int iddx_line = 4;
- struct prefix_list *plist;
+ int idx_word = 2;
+ int iddx_line = 4;
+ struct prefix_list *plist;
- plist = prefix_list_get (AFI_IP6, 0, argv[idx_word]->arg);
-
- if (plist->desc)
- {
- XFREE (MTYPE_TMP, plist->desc);
- plist->desc = NULL;
- }
- plist->desc = argv_concat(argv, argc, iddx_line);
+ plist = prefix_list_get(AFI_IP6, 0, argv[idx_word]->arg);
+
+ if (plist->desc) {
+ XFREE(MTYPE_TMP, plist->desc);
+ plist->desc = NULL;
+ }
+ plist->desc = argv_concat(argv, argc, iddx_line);
- return CMD_SUCCESS;
+ return CMD_SUCCESS;
}
DEFUN (no_ipv6_prefix_list_description,
@@ -1709,8 +1588,8 @@ DEFUN (no_ipv6_prefix_list_description,
"Name of a prefix list\n"
"Prefix-list specific description\n")
{
- int idx_word = 3;
- return vty_prefix_list_desc_unset (vty, AFI_IP6, argv[idx_word]->arg);
+ int idx_word = 3;
+ return vty_prefix_list_desc_unset(vty, AFI_IP6, argv[idx_word]->arg);
}
/* ALIAS_FIXME */
@@ -1724,7 +1603,7 @@ DEFUN (no_ipv6_prefix_list_description_comment,
"Prefix-list specific description\n"
"Up to 80 characters describing this prefix-list\n")
{
- return no_ipv6_prefix_list_description (self, vty, argc, argv);
+ return no_ipv6_prefix_list_description(self, vty, argc, argv);
}
@@ -1738,11 +1617,11 @@ DEFPY (show_ipv6_prefix_list,
"sequence number of an entry\n"
"Sequence number\n")
{
- enum display_type dtype = normal_display;
- if (dseq)
- dtype = sequential_display;
+ enum display_type dtype = normal_display;
+ if (dseq)
+ dtype = sequential_display;
- return vty_show_prefix_list (vty, AFI_IP6, prefix_list, arg_str, dtype);
+ return vty_show_prefix_list(vty, AFI_IP6, prefix_list, arg_str, dtype);
}
DEFPY (show_ipv6_prefix_list_prefix,
@@ -1756,13 +1635,14 @@ DEFPY (show_ipv6_prefix_list_prefix,
"Lookup longer prefix\n"
"First matched prefix\n")
{
- enum display_type dtype = normal_display;
- if (dl)
- dtype = longer_display;
- else if (dfm)
- dtype = first_match_display;
+ enum display_type dtype = normal_display;
+ if (dl)
+ dtype = longer_display;
+ else if (dfm)
+ dtype = first_match_display;
- return vty_show_prefix_list_prefix (vty, AFI_IP6, prefix_list, prefix_str, dtype);
+ return vty_show_prefix_list_prefix(vty, AFI_IP6, prefix_list,
+ prefix_str, dtype);
}
DEFPY (show_ipv6_prefix_list_summary,
@@ -1774,7 +1654,8 @@ DEFPY (show_ipv6_prefix_list_summary,
"Summary of prefix lists\n"
"Name of a prefix list\n")
{
- return vty_show_prefix_list (vty, AFI_IP6, prefix_list, NULL, summary_display);
+ return vty_show_prefix_list(vty, AFI_IP6, prefix_list, NULL,
+ summary_display);
}
DEFPY (show_ipv6_prefix_list_detail,
@@ -1786,7 +1667,8 @@ DEFPY (show_ipv6_prefix_list_detail,
"Detail of prefix lists\n"
"Name of a prefix list\n")
{
- return vty_show_prefix_list (vty, AFI_IP6, prefix_list, NULL, detail_display);
+ return vty_show_prefix_list(vty, AFI_IP6, prefix_list, NULL,
+ detail_display);
}
DEFPY (clear_ipv6_prefix_list,
@@ -1798,440 +1680,408 @@ DEFPY (clear_ipv6_prefix_list,
"Name of a prefix list\n"
"IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n")
{
- return vty_clear_prefix_list (vty, AFI_IP6, prefix_list, prefix_str);
+ return vty_clear_prefix_list(vty, AFI_IP6, prefix_list, prefix_str);
}
/* Configuration write function. */
-static int
-config_write_prefix_afi (afi_t afi, struct vty *vty)
-{
- struct prefix_list *plist;
- struct prefix_list_entry *pentry;
- struct prefix_master *master;
- int write = 0;
-
- master = prefix_master_get (afi, 0);
- if (master == NULL)
- return 0;
-
- if (! master->seqnum)
- {
- vty_out (vty, "no ip%s prefix-list sequence-number\n",
- afi == AFI_IP ? "" : "v6");
- vty_out (vty, "!\n");
- }
-
- for (plist = master->num.head; plist; plist = plist->next)
- {
- if (plist->desc)
- {
- vty_out (vty, "ip%s prefix-list %s description %s\n",
- afi == AFI_IP ? "" : "v6",
- plist->name, plist->desc);
- write++;
- }
+static int config_write_prefix_afi(afi_t afi, struct vty *vty)
+{
+ struct prefix_list *plist;
+ struct prefix_list_entry *pentry;
+ struct prefix_master *master;
+ int write = 0;
+
+ master = prefix_master_get(afi, 0);
+ if (master == NULL)
+ return 0;
- for (pentry = plist->head; pentry; pentry = pentry->next)
- {
- vty_out (vty, "ip%s prefix-list %s ",
- afi == AFI_IP ? "" : "v6",
- plist->name);
-
- if (master->seqnum)
- vty_out (vty, "seq %u ", pentry->seq);
-
- vty_out (vty, "%s ", prefix_list_type_str (pentry));
-
- if (pentry->any)
- vty_out (vty, "any");
- else
- {
- struct prefix *p = &pentry->prefix;
- char buf[BUFSIZ];
-
- vty_out (vty, "%s/%d",
- inet_ntop (p->family, &p->u.prefix, buf, BUFSIZ),
- p->prefixlen);
-
- if (pentry->ge)
- vty_out (vty, " ge %d", pentry->ge);
- if (pentry->le)
- vty_out (vty, " le %d", pentry->le);
- }
- vty_out (vty, "\n");
- write++;
+ if (!master->seqnum) {
+ vty_out(vty, "no ip%s prefix-list sequence-number\n",
+ afi == AFI_IP ? "" : "v6");
+ vty_out(vty, "!\n");
}
- /* vty_out (vty, "!\n"); */
- }
-
- for (plist = master->str.head; plist; plist = plist->next)
- {
- if (plist->desc)
- {
- vty_out (vty, "ip%s prefix-list %s description %s\n",
- afi == AFI_IP ? "" : "v6",
- plist->name, plist->desc);
- write++;
+
+ for (plist = master->num.head; plist; plist = plist->next) {
+ if (plist->desc) {
+ vty_out(vty, "ip%s prefix-list %s description %s\n",
+ afi == AFI_IP ? "" : "v6", plist->name,
+ plist->desc);
+ write++;
+ }
+
+ for (pentry = plist->head; pentry; pentry = pentry->next) {
+ vty_out(vty, "ip%s prefix-list %s ",
+ afi == AFI_IP ? "" : "v6", plist->name);
+
+ if (master->seqnum)
+ vty_out(vty, "seq %u ", pentry->seq);
+
+ vty_out(vty, "%s ", prefix_list_type_str(pentry));
+
+ if (pentry->any)
+ vty_out(vty, "any");
+ else {
+ struct prefix *p = &pentry->prefix;
+ char buf[BUFSIZ];
+
+ vty_out(vty, "%s/%d",
+ inet_ntop(p->family, &p->u.prefix, buf,
+ BUFSIZ),
+ p->prefixlen);
+
+ if (pentry->ge)
+ vty_out(vty, " ge %d", pentry->ge);
+ if (pentry->le)
+ vty_out(vty, " le %d", pentry->le);
+ }
+ vty_out(vty, "\n");
+ write++;
+ }
+ /* vty_out (vty, "!\n"); */
}
- for (pentry = plist->head; pentry; pentry = pentry->next)
- {
- vty_out (vty, "ip%s prefix-list %s ",
- afi == AFI_IP ? "" : "v6",
- plist->name);
-
- if (master->seqnum)
- vty_out (vty, "seq %u ", pentry->seq);
-
- vty_out (vty, "%s", prefix_list_type_str (pentry));
-
- if (pentry->any)
- vty_out (vty, " any");
- else
- {
- struct prefix *p = &pentry->prefix;
- char buf[BUFSIZ];
-
- vty_out (vty, " %s/%d",
- inet_ntop (p->family, &p->u.prefix, buf, BUFSIZ),
- p->prefixlen);
-
- if (pentry->ge)
- vty_out (vty, " ge %d", pentry->ge);
- if (pentry->le)
- vty_out (vty, " le %d", pentry->le);
- }
- vty_out (vty, "\n");
- write++;
+ for (plist = master->str.head; plist; plist = plist->next) {
+ if (plist->desc) {
+ vty_out(vty, "ip%s prefix-list %s description %s\n",
+ afi == AFI_IP ? "" : "v6", plist->name,
+ plist->desc);
+ write++;
+ }
+
+ for (pentry = plist->head; pentry; pentry = pentry->next) {
+ vty_out(vty, "ip%s prefix-list %s ",
+ afi == AFI_IP ? "" : "v6", plist->name);
+
+ if (master->seqnum)
+ vty_out(vty, "seq %u ", pentry->seq);
+
+ vty_out(vty, "%s", prefix_list_type_str(pentry));
+
+ if (pentry->any)
+ vty_out(vty, " any");
+ else {
+ struct prefix *p = &pentry->prefix;
+ char buf[BUFSIZ];
+
+ vty_out(vty, " %s/%d",
+ inet_ntop(p->family, &p->u.prefix, buf,
+ BUFSIZ),
+ p->prefixlen);
+
+ if (pentry->ge)
+ vty_out(vty, " ge %d", pentry->ge);
+ if (pentry->le)
+ vty_out(vty, " le %d", pentry->le);
+ }
+ vty_out(vty, "\n");
+ write++;
+ }
}
- }
-
- return write;
+
+ return write;
}
-struct stream *
-prefix_bgp_orf_entry (struct stream *s, struct prefix_list *plist,
- u_char init_flag, u_char permit_flag, u_char deny_flag)
+struct stream *prefix_bgp_orf_entry(struct stream *s, struct prefix_list *plist,
+ u_char init_flag, u_char permit_flag,
+ u_char deny_flag)
{
- struct prefix_list_entry *pentry;
+ struct prefix_list_entry *pentry;
- if (! plist)
- return s;
+ if (!plist)
+ return s;
- for (pentry = plist->head; pentry; pentry = pentry->next)
- {
- u_char flag = init_flag;
- struct prefix *p = &pentry->prefix;
+ for (pentry = plist->head; pentry; pentry = pentry->next) {
+ u_char flag = init_flag;
+ struct prefix *p = &pentry->prefix;
- flag |= (pentry->type == PREFIX_PERMIT ?
- permit_flag : deny_flag);
- stream_putc (s, flag);
- stream_putl (s, (u_int32_t)pentry->seq);
- stream_putc (s, (u_char)pentry->ge);
- stream_putc (s, (u_char)pentry->le);
- stream_put_prefix (s, p);
- }
+ flag |= (pentry->type == PREFIX_PERMIT ? permit_flag
+ : deny_flag);
+ stream_putc(s, flag);
+ stream_putl(s, (u_int32_t)pentry->seq);
+ stream_putc(s, (u_char)pentry->ge);
+ stream_putc(s, (u_char)pentry->le);
+ stream_put_prefix(s, p);
+ }
- return s;
+ return s;
}
-int
-prefix_bgp_orf_set (char *name, afi_t afi, struct orf_prefix *orfp,
- int permit, int set)
+int prefix_bgp_orf_set(char *name, afi_t afi, struct orf_prefix *orfp,
+ int permit, int set)
{
- struct prefix_list *plist;
- struct prefix_list_entry *pentry;
+ struct prefix_list *plist;
+ struct prefix_list_entry *pentry;
- /* ge and le value check */
- if (orfp->ge && orfp->ge <= orfp->p.prefixlen)
- return CMD_WARNING_CONFIG_FAILED;
- if (orfp->le && orfp->le <= orfp->p.prefixlen)
- return CMD_WARNING_CONFIG_FAILED;
- if (orfp->le && orfp->ge > orfp->le)
- return CMD_WARNING_CONFIG_FAILED;
+ /* ge and le value check */
+ if (orfp->ge && orfp->ge <= orfp->p.prefixlen)
+ return CMD_WARNING_CONFIG_FAILED;
+ if (orfp->le && orfp->le <= orfp->p.prefixlen)
+ return CMD_WARNING_CONFIG_FAILED;
+ if (orfp->le && orfp->ge > orfp->le)
+ return CMD_WARNING_CONFIG_FAILED;
- if (orfp->ge && orfp->le == (afi == AFI_IP ? 32 : 128))
- orfp->le = 0;
+ if (orfp->ge && orfp->le == (afi == AFI_IP ? 32 : 128))
+ orfp->le = 0;
- plist = prefix_list_get (afi, 1, name);
- if (! plist)
- return CMD_WARNING_CONFIG_FAILED;
+ plist = prefix_list_get(afi, 1, name);
+ if (!plist)
+ return CMD_WARNING_CONFIG_FAILED;
- if (set)
- {
- pentry = prefix_list_entry_make (&orfp->p,
- (permit ? PREFIX_PERMIT : PREFIX_DENY),
- orfp->seq, orfp->le, orfp->ge, 0);
+ if (set) {
+ pentry = prefix_list_entry_make(
+ &orfp->p, (permit ? PREFIX_PERMIT : PREFIX_DENY),
+ orfp->seq, orfp->le, orfp->ge, 0);
- if (prefix_entry_dup_check (plist, pentry))
- {
- prefix_list_entry_free (pentry);
- return CMD_WARNING_CONFIG_FAILED;
- }
+ if (prefix_entry_dup_check(plist, pentry)) {
+ prefix_list_entry_free(pentry);
+ return CMD_WARNING_CONFIG_FAILED;
+ }
- prefix_list_entry_add (plist, pentry);
- }
- else
- {
- pentry = prefix_list_entry_lookup (plist, &orfp->p,
- (permit ? PREFIX_PERMIT : PREFIX_DENY),
- orfp->seq, orfp->le, orfp->ge);
+ prefix_list_entry_add(plist, pentry);
+ } else {
+ pentry = prefix_list_entry_lookup(
+ plist, &orfp->p, (permit ? PREFIX_PERMIT : PREFIX_DENY),
+ orfp->seq, orfp->le, orfp->ge);
- if (! pentry)
- return CMD_WARNING_CONFIG_FAILED;
+ if (!pentry)
+ return CMD_WARNING_CONFIG_FAILED;
- prefix_list_entry_delete (plist, pentry, 1);
- }
+ prefix_list_entry_delete(plist, pentry, 1);
+ }
- return CMD_SUCCESS;
+ return CMD_SUCCESS;
}
-void
-prefix_bgp_orf_remove_all (afi_t afi, char *name)
+void prefix_bgp_orf_remove_all(afi_t afi, char *name)
{
- struct prefix_list *plist;
+ struct prefix_list *plist;
- plist = prefix_bgp_orf_lookup (afi, name);
- if (plist)
- prefix_list_delete (plist);
+ plist = prefix_bgp_orf_lookup(afi, name);
+ if (plist)
+ prefix_list_delete(plist);
}
/* return prefix count */
-int
-prefix_bgp_show_prefix_list (struct vty *vty, afi_t afi, char *name, u_char use_json)
-{
- struct prefix_list *plist;
- struct prefix_list_entry *pentry;
- json_object *json = NULL;
- json_object *json_prefix = NULL;
- json_object *json_list = NULL;
-
- plist = prefix_bgp_orf_lookup (afi, name);
- if (! plist)
- return 0;
-
- if (! vty)
- return plist->count;
-
- if(use_json)
- {
- json = json_object_new_object();
- json_prefix = json_object_new_object();
- json_list = json_object_new_object();
-
- json_object_int_add(json_prefix, "prefixListCounter", plist->count);
- json_object_string_add(json_prefix, "prefixListName", plist->name);
-
- for (pentry = plist->head; pentry; pentry = pentry->next)
- {
- struct prefix *p = &pentry->prefix;
- char buf_a[BUFSIZ];
- char buf_b[BUFSIZ];
-
- sprintf(buf_a, "%s/%d", inet_ntop (p->family, &p->u.prefix, buf_b, BUFSIZ),
- p->prefixlen);
-
- json_object_int_add(json_list, "seq", pentry->seq);
- json_object_string_add(json_list, "seqPrefixListType", prefix_list_type_str (pentry));
-
- if (pentry->ge)
- json_object_int_add(json_list, "ge", pentry->ge);
- if (pentry->le)
- json_object_int_add(json_list, "le", pentry->le);
-
- json_object_object_add(json_prefix, buf_a, json_list);
- }
- if (afi == AFI_IP)
- json_object_object_add(json, "ipPrefixList", json_prefix);
- else
- json_object_object_add(json, "ipv6PrefixList", json_prefix);
-
- vty_out (vty, "%s\n",
- json_object_to_json_string_ext(json, JSON_C_TO_STRING_PRETTY));
- json_object_free(json);
- }
- else
- {
- vty_out (vty, "ip%s prefix-list %s: %d entries\n",
- afi == AFI_IP ? "" : "v6",
- plist->name, plist->count);
-
- for (pentry = plist->head; pentry; pentry = pentry->next)
- {
- struct prefix *p = &pentry->prefix;
- char buf[BUFSIZ];
-
- vty_out (vty, " seq %u %s %s/%d", pentry->seq,
- prefix_list_type_str (pentry),
- inet_ntop (p->family, &p->u.prefix, buf, BUFSIZ),
- p->prefixlen);
-
- if (pentry->ge)
- vty_out (vty, " ge %d", pentry->ge);
- if (pentry->le)
- vty_out (vty, " le %d", pentry->le);
-
- vty_out (vty, "\n");
- }
- }
- return plist->count;
-}
-
-static void
-prefix_list_reset_afi (afi_t afi, int orf)
-{
- struct prefix_list *plist;
- struct prefix_list *next;
- struct prefix_master *master;
-
- master = prefix_master_get (afi, orf);
- if (master == NULL)
- return;
-
- for (plist = master->num.head; plist; plist = next)
- {
- next = plist->next;
- prefix_list_delete (plist);
- }
- for (plist = master->str.head; plist; plist = next)
- {
- next = plist->next;
- prefix_list_delete (plist);
- }
-
- assert (master->num.head == NULL);
- assert (master->num.tail == NULL);
-
- assert (master->str.head == NULL);
- assert (master->str.tail == NULL);
-
- master->seqnum = 1;
- master->recent = NULL;
+int prefix_bgp_show_prefix_list(struct vty *vty, afi_t afi, char *name,
+ u_char use_json)
+{
+ struct prefix_list *plist;
+ struct prefix_list_entry *pentry;
+ json_object *json = NULL;
+ json_object *json_prefix = NULL;
+ json_object *json_list = NULL;
+
+ plist = prefix_bgp_orf_lookup(afi, name);
+ if (!plist)
+ return 0;
+
+ if (!vty)
+ return plist->count;
+
+ if (use_json) {
+ json = json_object_new_object();
+ json_prefix = json_object_new_object();
+ json_list = json_object_new_object();
+
+ json_object_int_add(json_prefix, "prefixListCounter",
+ plist->count);
+ json_object_string_add(json_prefix, "prefixListName",
+ plist->name);
+
+ for (pentry = plist->head; pentry; pentry = pentry->next) {
+ struct prefix *p = &pentry->prefix;
+ char buf_a[BUFSIZ];
+ char buf_b[BUFSIZ];
+
+ sprintf(buf_a, "%s/%d",
+ inet_ntop(p->family, &p->u.prefix, buf_b,
+ BUFSIZ),
+ p->prefixlen);
+
+ json_object_int_add(json_list, "seq", pentry->seq);
+ json_object_string_add(json_list, "seqPrefixListType",
+ prefix_list_type_str(pentry));
+
+ if (pentry->ge)
+ json_object_int_add(json_list, "ge",
+ pentry->ge);
+ if (pentry->le)
+ json_object_int_add(json_list, "le",
+ pentry->le);
+
+ json_object_object_add(json_prefix, buf_a, json_list);
+ }
+ if (afi == AFI_IP)
+ json_object_object_add(json, "ipPrefixList",
+ json_prefix);
+ else
+ json_object_object_add(json, "ipv6PrefixList",
+ json_prefix);
+
+ vty_out(vty, "%s\n", json_object_to_json_string_ext(
+ json, JSON_C_TO_STRING_PRETTY));
+ json_object_free(json);
+ } else {
+ vty_out(vty, "ip%s prefix-list %s: %d entries\n",
+ afi == AFI_IP ? "" : "v6", plist->name, plist->count);
+
+ for (pentry = plist->head; pentry; pentry = pentry->next) {
+ struct prefix *p = &pentry->prefix;
+ char buf[BUFSIZ];
+
+ vty_out(vty, " seq %u %s %s/%d", pentry->seq,
+ prefix_list_type_str(pentry),
+ inet_ntop(p->family, &p->u.prefix, buf, BUFSIZ),
+ p->prefixlen);
+
+ if (pentry->ge)
+ vty_out(vty, " ge %d", pentry->ge);
+ if (pentry->le)
+ vty_out(vty, " le %d", pentry->le);
+
+ vty_out(vty, "\n");
+ }
+ }
+ return plist->count;
+}
+
+static void prefix_list_reset_afi(afi_t afi, int orf)
+{
+ struct prefix_list *plist;
+ struct prefix_list *next;
+ struct prefix_master *master;
+
+ master = prefix_master_get(afi, orf);
+ if (master == NULL)
+ return;
+
+ for (plist = master->num.head; plist; plist = next) {
+ next = plist->next;
+ prefix_list_delete(plist);
+ }
+ for (plist = master->str.head; plist; plist = next) {
+ next = plist->next;
+ prefix_list_delete(plist);
+ }
+
+ assert(master->num.head == NULL);
+ assert(master->num.tail == NULL);
+
+ assert(master->str.head == NULL);
+ assert(master->str.tail == NULL);
+
+ master->seqnum = 1;
+ master->recent = NULL;
}
/* Prefix-list node. */
-static struct cmd_node prefix_node =
-{
- PREFIX_NODE,
- "", /* Prefix list has no interface. */
- 1
-};
+static struct cmd_node prefix_node = {PREFIX_NODE,
+ "", /* Prefix list has no interface. */
+ 1};
-static int
-config_write_prefix_ipv4 (struct vty *vty)
+static int config_write_prefix_ipv4(struct vty *vty)
{
- return config_write_prefix_afi (AFI_IP, vty);
+ return config_write_prefix_afi(AFI_IP, vty);
}
-static void
-plist_autocomplete_afi (afi_t afi, vector comps, struct cmd_token *token)
+static void plist_autocomplete_afi(afi_t afi, vector comps,
+ struct cmd_token *token)
{
- struct prefix_list *plist;
- struct prefix_master *master;
+ struct prefix_list *plist;
+ struct prefix_master *master;
- master = prefix_master_get (afi, 0);
- if (master == NULL)
- return;
+ master = prefix_master_get(afi, 0);
+ if (master == NULL)
+ return;
- for (plist = master->str.head; plist; plist = plist->next)
- vector_set (comps, XSTRDUP (MTYPE_COMPLETION, plist->name));
- for (plist = master->num.head; plist; plist = plist->next)
- vector_set (comps, XSTRDUP (MTYPE_COMPLETION, plist->name));
+ for (plist = master->str.head; plist; plist = plist->next)
+ vector_set(comps, XSTRDUP(MTYPE_COMPLETION, plist->name));
+ for (plist = master->num.head; plist; plist = plist->next)
+ vector_set(comps, XSTRDUP(MTYPE_COMPLETION, plist->name));
}
-static void
-plist_autocomplete(vector comps, struct cmd_token *token)
+static void plist_autocomplete(vector comps, struct cmd_token *token)
{
- plist_autocomplete_afi (AFI_IP, comps, token);
- plist_autocomplete_afi (AFI_IP6, comps, token);
+ plist_autocomplete_afi(AFI_IP, comps, token);
+ plist_autocomplete_afi(AFI_IP6, comps, token);
}
static const struct cmd_variable_handler plist_var_handlers[] = {
- {
- /* "prefix-list WORD" */
- .varname = "prefix_list",
- .completions = plist_autocomplete
- }, {
- .completions = NULL
- }
-};
+ {/* "prefix-list WORD" */
+ .varname = "prefix_list",
+ .completions = plist_autocomplete},
+ {.completions = NULL}};
-static void
-prefix_list_init_ipv4 (void)
+static void prefix_list_init_ipv4(void)
{
- install_node (&prefix_node, config_write_prefix_ipv4);
+ install_node(&prefix_node, config_write_prefix_ipv4);
- install_element (CONFIG_NODE, &ip_prefix_list_cmd);
- install_element (CONFIG_NODE, &no_ip_prefix_list_cmd);
- install_element (CONFIG_NODE, &no_ip_prefix_list_all_cmd);
+ install_element(CONFIG_NODE, &ip_prefix_list_cmd);
+ install_element(CONFIG_NODE, &no_ip_prefix_list_cmd);
+ install_element(CONFIG_NODE, &no_ip_prefix_list_all_cmd);
- install_element (CONFIG_NODE, &ip_prefix_list_description_cmd);
- install_element (CONFIG_NODE, &no_ip_prefix_list_description_cmd);
- install_element (CONFIG_NODE, &no_ip_prefix_list_description_comment_cmd);
+ install_element(CONFIG_NODE, &ip_prefix_list_description_cmd);
+ install_element(CONFIG_NODE, &no_ip_prefix_list_description_cmd);
+ install_element(CONFIG_NODE,
+ &no_ip_prefix_list_description_comment_cmd);
- install_element (CONFIG_NODE, &ip_prefix_list_sequence_number_cmd);
+ install_element(CONFIG_NODE, &ip_prefix_list_sequence_number_cmd);
- install_element (VIEW_NODE, &show_ip_prefix_list_cmd);
- install_element (VIEW_NODE, &show_ip_prefix_list_prefix_cmd);
- install_element (VIEW_NODE, &show_ip_prefix_list_summary_cmd);
- install_element (VIEW_NODE, &show_ip_prefix_list_detail_cmd);
+ install_element(VIEW_NODE, &show_ip_prefix_list_cmd);
+ install_element(VIEW_NODE, &show_ip_prefix_list_prefix_cmd);
+ install_element(VIEW_NODE, &show_ip_prefix_list_summary_cmd);
+ install_element(VIEW_NODE, &show_ip_prefix_list_detail_cmd);
- install_element (ENABLE_NODE, &clear_ip_prefix_list_cmd);
+ install_element(ENABLE_NODE, &clear_ip_prefix_list_cmd);
}
/* Prefix-list node. */
-static struct cmd_node prefix_ipv6_node =
-{
- PREFIX_IPV6_NODE,
- "", /* Prefix list has no interface. */
- 1
-};
+static struct cmd_node prefix_ipv6_node = {
+ PREFIX_IPV6_NODE, "", /* Prefix list has no interface. */
+ 1};
-static int
-config_write_prefix_ipv6 (struct vty *vty)
+static int config_write_prefix_ipv6(struct vty *vty)
{
- return config_write_prefix_afi (AFI_IP6, vty);
+ return config_write_prefix_afi(AFI_IP6, vty);
}
-static void
-prefix_list_init_ipv6 (void)
+static void prefix_list_init_ipv6(void)
{
- install_node (&prefix_ipv6_node, config_write_prefix_ipv6);
+ install_node(&prefix_ipv6_node, config_write_prefix_ipv6);
- install_element (CONFIG_NODE, &ipv6_prefix_list_cmd);
- install_element (CONFIG_NODE, &no_ipv6_prefix_list_cmd);
- install_element (CONFIG_NODE, &no_ipv6_prefix_list_all_cmd);
+ install_element(CONFIG_NODE, &ipv6_prefix_list_cmd);
+ install_element(CONFIG_NODE, &no_ipv6_prefix_list_cmd);
+ install_element(CONFIG_NODE, &no_ipv6_prefix_list_all_cmd);
- install_element (CONFIG_NODE, &ipv6_prefix_list_description_cmd);
- install_element (CONFIG_NODE, &no_ipv6_prefix_list_description_cmd);
- install_element (CONFIG_NODE, &no_ipv6_prefix_list_description_comment_cmd);
+ install_element(CONFIG_NODE, &ipv6_prefix_list_description_cmd);
+ install_element(CONFIG_NODE, &no_ipv6_prefix_list_description_cmd);
+ install_element(CONFIG_NODE,
+ &no_ipv6_prefix_list_description_comment_cmd);
- install_element (CONFIG_NODE, &ipv6_prefix_list_sequence_number_cmd);
+ install_element(CONFIG_NODE, &ipv6_prefix_list_sequence_number_cmd);
- install_element (VIEW_NODE, &show_ipv6_prefix_list_cmd);
- install_element (VIEW_NODE, &show_ipv6_prefix_list_prefix_cmd);
- install_element (VIEW_NODE, &show_ipv6_prefix_list_summary_cmd);
- install_element (VIEW_NODE, &show_ipv6_prefix_list_detail_cmd);
+ install_element(VIEW_NODE, &show_ipv6_prefix_list_cmd);
+ install_element(VIEW_NODE, &show_ipv6_prefix_list_prefix_cmd);
+ install_element(VIEW_NODE, &show_ipv6_prefix_list_summary_cmd);
+ install_element(VIEW_NODE, &show_ipv6_prefix_list_detail_cmd);
- install_element (ENABLE_NODE, &clear_ipv6_prefix_list_cmd);
+ install_element(ENABLE_NODE, &clear_ipv6_prefix_list_cmd);
}
-void
-prefix_list_init ()
+void prefix_list_init()
{
- cmd_variable_handler_register(plist_var_handlers);
+ cmd_variable_handler_register(plist_var_handlers);
- prefix_list_init_ipv4 ();
- prefix_list_init_ipv6 ();
+ prefix_list_init_ipv4();
+ prefix_list_init_ipv6();
}
-void
-prefix_list_reset ()
+void prefix_list_reset()
{
- prefix_list_reset_afi (AFI_IP, 0);
- prefix_list_reset_afi (AFI_IP6, 0);
- prefix_list_reset_afi (AFI_IP, 1);
- prefix_list_reset_afi (AFI_IP6, 1);
+ prefix_list_reset_afi(AFI_IP, 0);
+ prefix_list_reset_afi(AFI_IP6, 0);
+ prefix_list_reset_afi(AFI_IP, 1);
+ prefix_list_reset_afi(AFI_IP6, 1);
}