summaryrefslogtreecommitdiffstats
path: root/nest
diff options
context:
space:
mode:
Diffstat (limited to 'nest')
-rw-r--r--nest/iface.c42
-rw-r--r--nest/iface.h14
2 files changed, 56 insertions, 0 deletions
diff --git a/nest/iface.c b/nest/iface.c
index 5f356fd..186fbd9 100644
--- a/nest/iface.c
+++ b/nest/iface.c
@@ -12,6 +12,7 @@
#include "nest/iface.h"
#include "nest/protocol.h"
#include "lib/resource.h"
+#include "lib/string.h"
static pool *if_pool;
@@ -353,3 +354,44 @@ if_init(void)
neigh_slab = sl_new(if_pool, sizeof(neighbor));
init_list(&neigh_list);
}
+
+/*
+ * Interface Pattern Lists
+ */
+
+struct iface_patt *
+iface_patt_match(list *l, struct iface *i)
+{
+ struct iface_patt *p;
+
+ WALK_LIST(p, *l)
+ {
+ char *t = p->pattern;
+ int ok = 1;
+ if (*t == '-')
+ {
+ t++;
+ ok = 0;
+ }
+ if (patmatch(t, i->name))
+ return ok ? p : NULL;
+ }
+ return NULL;
+}
+
+int
+iface_patts_equal(list *a, list *b, int (*comp)(struct iface_patt *, struct iface_patt *))
+{
+ struct iface_patt *x, *y;
+
+ x = HEAD(*a);
+ y = HEAD(*b);
+ while (x->n.next && y->n.next)
+ {
+ if (strcmp(x->pattern, y->pattern) || comp && !comp(x, y))
+ return 0;
+ x = (void *) x->n.next;
+ y = (void *) y->n.next;
+ }
+ return (!x->n.next && !y->n.next);
+}
diff --git a/nest/iface.h b/nest/iface.h
index ea93720..62b3f94 100644
--- a/nest/iface.h
+++ b/nest/iface.h
@@ -91,4 +91,18 @@ neighbor *neigh_find(struct proto *, ip_addr *, unsigned flags);
void neigh_dump(neighbor *);
void neigh_dump_all(void);
+/*
+ * Interface Pattern Lists
+ */
+
+struct iface_patt {
+ node n;
+ byte *pattern; /* Interface name pattern */
+
+ /* Protocol-specific data follow */
+};
+
+struct iface_patt *iface_patt_match(list *, struct iface *);
+int iface_patts_equal(list *, list *, int (*)(struct iface_patt *, struct iface_patt *));
+
#endif