summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/darr.c10
-rw-r--r--lib/plist.c66
-rw-r--r--lib/routemap_cli.c8
3 files changed, 55 insertions, 29 deletions
diff --git a/lib/darr.c b/lib/darr.c
index f0ef5c90be..bef51b8fc4 100644
--- a/lib/darr.c
+++ b/lib/darr.c
@@ -7,8 +7,9 @@
*/
#include <zebra.h>
#include "darr.h"
+#include "memory.h"
-void __dar_resize(void **a, uint count, size_t esize);
+DEFINE_MTYPE_STATIC(LIB, DARR, "Dynamic Array");
static uint _msb(uint count)
{
@@ -56,15 +57,12 @@ void *__darr_resize(void *a, uint count, size_t esize)
uint ncount = darr_next_count(count, esize);
size_t osz = (a == NULL) ? 0 : darr_size(darr_cap(a), esize);
size_t sz = darr_size(ncount, esize);
- struct darr_metadata *dm = realloc(a ? _darr_meta(a) : NULL, sz);
- /* do *not* use a */
+ struct darr_metadata *dm = XREALLOC(MTYPE_DARR,
+ a ? _darr_meta(a) : NULL, sz);
- assert(dm);
if (sz > osz)
memset((char *)dm + osz, 0, sz - osz);
-
dm->cap = ncount;
-
return (void *)(dm + 1);
}
diff --git a/lib/plist.c b/lib/plist.c
index d8ce83d219..2f5827cf43 100644
--- a/lib/plist.c
+++ b/lib/plist.c
@@ -336,22 +336,6 @@ prefix_list_entry_lookup(struct prefix_list *plist, struct prefix *prefix,
return NULL;
}
-static bool
-prefix_list_entry_lookup_prefix(struct prefix_list *plist,
- struct prefix_list_entry *plist_entry)
-{
- struct prefix_list_entry *pentry = NULL;
-
- for (pentry = plist->head; pentry; pentry = pentry->next) {
- if (pentry == plist_entry)
- continue;
- if (prefix_same(&pentry->prefix, &plist_entry->prefix))
- return true;
- }
-
- return false;
-}
-
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,
@@ -418,17 +402,54 @@ static void prefix_list_trie_del(struct prefix_list *plist,
}
}
+/**
+ * Find duplicated prefix entry (same prefix but different entry) in prefix
+ * list.
+ */
+static bool prefix_list_entry_is_duplicated(struct prefix_list *list,
+ struct prefix_list_entry *entry)
+{
+ size_t depth, maxdepth = list->master->trie_depth;
+ uint8_t byte, *bytes = entry->prefix.u.val;
+ size_t validbits = entry->prefix.prefixlen;
+ struct pltrie_table *table = list->trie;
+ struct prefix_list_entry *pentry;
+
+ 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 (pentry == entry)
+ continue;
+ if (prefix_same(&pentry->prefix, &entry->prefix))
+ return true;
+ }
+
+ return false;
+}
void prefix_list_entry_delete(struct prefix_list *plist,
- struct prefix_list_entry *pentry, int update_list)
+ struct prefix_list_entry *pentry,
+ int update_list)
{
- bool duplicate = false;
+ bool duplicate;
if (plist == NULL || pentry == NULL)
return;
- if (prefix_list_entry_lookup_prefix(plist, pentry))
- duplicate = true;
+ duplicate = prefix_list_entry_is_duplicated(plist, pentry);
prefix_list_trie_del(plist, pentry);
@@ -579,14 +600,13 @@ static void prefix_list_entry_add(struct prefix_list *plist,
void prefix_list_entry_update_start(struct prefix_list_entry *ple)
{
struct prefix_list *pl = ple->pl;
- bool duplicate = false;
+ bool duplicate;
/* Not installed, nothing to do. */
if (!ple->installed)
return;
- if (prefix_list_entry_lookup_prefix(pl, ple))
- duplicate = true;
+ duplicate = prefix_list_entry_is_duplicated(pl, ple);
prefix_list_trie_del(pl, ple);
diff --git a/lib/routemap_cli.c b/lib/routemap_cli.c
index a5e66880a7..20a157e955 100644
--- a/lib/routemap_cli.c
+++ b/lib/routemap_cli.c
@@ -729,6 +729,10 @@ void route_map_condition_show(struct vty *vty, const struct lyd_node *dnode,
dnode,
"./rmap-match-condition/frr-bgp-route-map:comm-list/comm-list-name-exact-match"))
vty_out(vty, " exact-match");
+ if (yang_dnode_get_bool(
+ dnode,
+ "./rmap-match-condition/frr-bgp-route-map:comm-list/comm-list-name-any"))
+ vty_out(vty, " any");
vty_out(vty, "\n");
} else if (IS_MATCH_LCOMMUNITY(condition)) {
vty_out(vty, " match large-community %s",
@@ -739,6 +743,10 @@ void route_map_condition_show(struct vty *vty, const struct lyd_node *dnode,
dnode,
"./rmap-match-condition/frr-bgp-route-map:comm-list/comm-list-name-exact-match"))
vty_out(vty, " exact-match");
+ if (yang_dnode_get_bool(
+ dnode,
+ "./rmap-match-condition/frr-bgp-route-map:comm-list/comm-list-name-any"))
+ vty_out(vty, " any");
vty_out(vty, "\n");
} else if (IS_MATCH_EXTCOMMUNITY(condition)) {
vty_out(vty, " match extcommunity %s\n",