Added functions for manipulating interface name pattern lists:
o iface_patt_match(list, iface) -- match interface against list o iface_patts_equal(a, b, c) -- compare whether two pattern lists are equal or not. c(x,y) is called for comparison of protocol-dependent data.
This commit is contained in:
parent
49e4a4d1fd
commit
ed45f2e126
2 changed files with 56 additions and 0 deletions
42
nest/iface.c
42
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);
|
||||
}
|
||||
|
|
14
nest/iface.h
14
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
|
||||
|
|
Loading…
Reference in a new issue