#include "nest/iface.h"
#include "nest/protocol.h"
#include "nest/cli.h"
+#include "lib/hash.h"
#include "lib/resource.h"
#include "lib/string.h"
#include "conf/conf.h"
list iface_list;
+#define IFH_KEY(n) n->index
+#define IFH_NEXT(n) n->next
+#define IFH_EQ(a,b) a == b
+#define IFH_FN(k) u32_hash(k)
+#define IFH_ORDER 6
+
+#define IFH_REHASH if_rehash
+#define IFH_PARAMS /8, *1, 2, 2, 6, 20
+
+HASH_DEFINE_REHASH_FN(IFH, struct iface)
+
+static HASH(struct iface) iface_hash;
+
+
static void if_recalc_preferred(struct iface *i);
/**
DBG("Interface %s changed too much -- forcing down/up transition\n", i->name);
if_change_flags(i, i->flags | IF_TMP_DOWN);
rem_node(&i->n);
+ HASH_REMOVE2(iface_hash, IFH, if_pool, i);
new->addr4 = i->addr4;
new->addr6 = i->addr6;
new->llv6 = i->llv6;
init_list(&i->neighbors);
i->flags |= IF_UPDATED | IF_TMP_DOWN; /* Tmp down as we don't have addresses yet */
add_tail(&iface_list, &i->n);
+ HASH_INSERT2(iface_hash, IFH, if_pool, i);
return i;
}
struct iface *
if_find_by_index(unsigned idx)
{
- struct iface *i;
-
- WALK_LIST(i, iface_list)
- if (i->index == idx && !(i->flags & IF_SHUTDOWN))
- return i;
- return NULL;
+ struct iface *i = HASH_FIND(iface_hash, IFH, idx);
+ return (i && !(i->flags & IF_SHUTDOWN)) ? i : NULL;
}
/**
init_list(&i->addrs);
init_list(&i->neighbors);
add_tail(&iface_list, &i->n);
+ /* No need to insert dummy nodes to iface_hash */
return i;
}
if (ifa_same(b, a))
{
rem_node(&b->n);
+ HASH_REMOVE2(iface_hash, IFH, if_pool, i);
if (b->flags & IA_PRIMARY)
{
if_init(void)
{
if_pool = rp_new(&root_pool, "Interfaces");
+
init_list(&iface_list);
+ HASH_INIT(iface_hash, if_pool, IFH_ORDER);
+
neigh_init(if_pool);
}