summaryrefslogtreecommitdiff
path: root/nest
diff options
context:
space:
mode:
authorOndrej Zajicek (work) <santiago@crfreenet.org>2015-12-21 20:16:05 +0100
committerOndrej Zajicek (work) <santiago@crfreenet.org>2015-12-21 20:28:44 +0100
commit600998fcb1a1d155215ab32644982e9b78767e3e (patch)
tree987193a992951f8a543d3473441202b6b26f0f08 /nest
parent67aa88336a91e635753ba42df45d7de5e191ed35 (diff)
Modify FIB_WALK() and FIB_ITERATE() to work with new FIB code
Returned user data pointers have offset relative to fib_node.
Diffstat (limited to 'nest')
-rw-r--r--nest/route.h43
-rw-r--r--nest/rt-fib.c8
-rw-r--r--nest/rt-table.c65
3 files changed, 54 insertions, 62 deletions
diff --git a/nest/route.h b/nest/route.h
index 5db84650..a30a3880 100644
--- a/nest/route.h
+++ b/nest/route.h
@@ -65,6 +65,12 @@ struct fib {
fib_init_fn init; /* Constructor */
};
+static inline void * fib_node_to_user(struct fib *f, struct fib_node *e)
+{ return e ? (void *) ((char *) e - f->node_offset) : NULL; }
+
+static inline struct fib_node * fib_user_to_node(struct fib *f, void *e)
+{ return e ? (void *) ((char *) e + f->node_offset) : NULL; }
+
void fib_init(struct fib *f, pool *p, uint addr_type, uint node_size, uint node_offset, uint hash_order, fib_init_fn init);
void *fib_find(struct fib *, const net_addr *); /* Find or return NULL if doesn't exist */
void *fib_get(struct fib *, const net_addr *); /* Find or create new if nonexistent */
@@ -78,35 +84,38 @@ struct fib_node *fit_get(struct fib *, struct fib_iterator *);
void fit_put(struct fib_iterator *, struct fib_node *);
void fit_put_next(struct fib *f, struct fib_iterator *i, struct fib_node *n, uint hpos);
-/* XXXX: return user entries */
-#define FIB_WALK(fib, z) do { \
- struct fib_node *z, **ff = (fib)->hash_table; \
- uint count = (fib)->hash_size; \
- while (count--) \
- for(z = *ff++; z; z=z->next)
+
+#define FIB_WALK(fib, type, z) do { \
+ struct fib_node *fn_, **ff_ = (fib)->hash_table; \
+ uint count_ = (fib)->hash_size; \
+ type *z; \
+ while (count_--) \
+ for (fn_ = *ff_++; z = fib_node_to_user(fib, fn_); fn_=fn_->next)
#define FIB_WALK_END } while (0)
#define FIB_ITERATE_INIT(it, fib) fit_init(it, fib)
-#define FIB_ITERATE_START(fib, it, z) do { \
- struct fib_node *z = fit_get(fib, it); \
- uint count = (fib)->hash_size; \
- uint hpos = (it)->hash; \
+#define FIB_ITERATE_START(fib, it, type, z) do { \
+ struct fib_node *fn_ = fit_get(fib, it); \
+ uint count_ = (fib)->hash_size; \
+ uint hpos_ = (it)->hash; \
+ type *z; \
for(;;) { \
- if (!z) \
+ if (!fn_) \
{ \
- if (++hpos >= count) \
+ if (++hpos_ >= count_) \
break; \
- z = (fib)->hash_table[hpos]; \
+ fn_ = (fib)->hash_table[hpos_]; \
continue; \
- }
+ } \
+ z = fib_node_to_user(fib, fn_);
-#define FIB_ITERATE_END(z) z = z->next; } } while(0)
+#define FIB_ITERATE_END fn_ = fn_->next; } } while(0)
-#define FIB_ITERATE_PUT(it, z) fit_put(it, z)
+#define FIB_ITERATE_PUT(it) fit_put(it, fn_)
-#define FIB_ITERATE_PUT_NEXT(it, fib, z) fit_put_next(fib, it, z, hpos)
+#define FIB_ITERATE_PUT_NEXT(it, fib) fit_put_next(fib, it, fn_, hpos_)
#define FIB_ITERATE_UNLINK(it, fib) fit_get(fib, it)
diff --git a/nest/rt-fib.c b/nest/rt-fib.c
index 474236e0..c12d0519 100644
--- a/nest/rt-fib.c
+++ b/nest/rt-fib.c
@@ -49,12 +49,6 @@
#define HASH_LO_MIN 10
-static inline void * fib_node_to_user(struct fib *f, struct fib_node *e)
-{ return (void *) ((char *) e - f->node_offset); }
-
-static inline struct fib_node * fib_user_to_node(struct fib *f, void *e)
-{ return (void *) ((char *) e + f->node_offset); }
-
static void
fib_ht_alloc(struct fib *f)
{
@@ -168,7 +162,7 @@ fib_rehash(struct fib *f, int step)
struct fib_node *e = f->hash_table[FIB_HASH(f, a, t)]; \
while (e && !net_equal_##t(CAST(t) e->addr, CAST(t) a)) \
e = e->next; \
- e ? fib_node_to_user(f, e) : NULL; \
+ fib_node_to_user(f, e); \
})
#define FIB_INSERT(f,a,e,t) \
diff --git a/nest/rt-table.c b/nest/rt-table.c
index 7eedec41..963c8fbd 100644
--- a/nest/rt-table.c
+++ b/nest/rt-table.c
@@ -1315,12 +1315,9 @@ rt_examine(rtable *t, net_addr *a, struct proto *p, struct filter *filter)
void
rt_refresh_begin(rtable *t, struct announce_hook *ah)
{
- net *n;
- rte *e;
-
- FIB_WALK(&t->fib, fn)
+ FIB_WALK(&t->fib, net, n)
{
- n = (net *) fn;
+ rte *e;
for (e = n->routes; e; e = e->next)
if (e->sender == ah)
e->flags |= REF_STALE;
@@ -1340,12 +1337,10 @@ void
rt_refresh_end(rtable *t, struct announce_hook *ah)
{
int prune = 0;
- net *n;
- rte *e;
- FIB_WALK(&t->fib, fn)
+ FIB_WALK(&t->fib, net, n)
{
- n = (net *) fn;
+ rte *e;
for (e = n->routes; e; e = e->next)
if ((e->sender == ah) && (e->flags & REF_STALE))
{
@@ -1387,21 +1382,19 @@ rte_dump(rte *e)
void
rt_dump(rtable *t)
{
- rte *e;
- net *n;
- struct announce_hook *a;
-
debug("Dump of routing table <%s>\n", t->name);
#ifdef DEBUGGING
fib_check(&t->fib);
#endif
- FIB_WALK(&t->fib, fn)
+ FIB_WALK(&t->fib, net, n)
{
- n = (net *) fn;
+ rte *e;
for(e=n->routes; e; e=e->next)
rte_dump(e);
}
FIB_WALK_END;
+
+ struct announce_hook *a;
WALK_LIST(a, t->hooks)
debug("\tAnnounces routes to protocol %s\n", a->proto->name);
debug("\n");
@@ -1471,19 +1464,18 @@ rt_prune_nets(rtable *tab)
FIB_ITERATE_INIT(&fit, &tab->fib);
again:
- FIB_ITERATE_START(&tab->fib, &fit, f)
+ FIB_ITERATE_START(&tab->fib, &fit, net, n)
{
- net *n = (net *) f;
ncnt++;
if (!n->routes) /* Orphaned FIB entry */
{
- FIB_ITERATE_PUT(&fit, f);
- fib_delete(&tab->fib, f);
+ FIB_ITERATE_PUT(&fit);
+ fib_delete(&tab->fib, n);
ndel++;
goto again;
}
}
- FIB_ITERATE_END(f);
+ FIB_ITERATE_END;
DBG("Pruned %d of %d networks\n", ndel, ncnt);
tab->gc_counter = 0;
@@ -1572,9 +1564,8 @@ rt_prune_step(rtable *tab, int *limit)
}
again:
- FIB_ITERATE_START(&tab->fib, fit, fn)
+ FIB_ITERATE_START(&tab->fib, fit, net, n)
{
- net *n = (net *) fn;
rte *e;
rescan:
@@ -1583,7 +1574,7 @@ again:
{
if (*limit <= 0)
{
- FIB_ITERATE_PUT(fit, fn);
+ FIB_ITERATE_PUT(fit);
return 0;
}
@@ -1594,12 +1585,12 @@ again:
}
if (!n->routes) /* Orphaned FIB entry */
{
- FIB_ITERATE_PUT(fit, fn);
- fib_delete(&tab->fib, fn);
+ FIB_ITERATE_PUT(fit);
+ fib_delete(&tab->fib, n);
goto again;
}
}
- FIB_ITERATE_END(fn);
+ FIB_ITERATE_END;
#ifdef DEBUGGING
fib_check(&tab->fib);
@@ -1791,17 +1782,17 @@ rt_next_hop_update(rtable *tab)
tab->nhu_state = 2;
}
- FIB_ITERATE_START(&tab->fib, fit, fn)
+ FIB_ITERATE_START(&tab->fib, fit, net, n)
{
if (max_feed <= 0)
{
- FIB_ITERATE_PUT(fit, fn);
+ FIB_ITERATE_PUT(fit);
ev_schedule(tab->rt_event);
return;
}
- max_feed -= rt_next_hop_update_net(tab, (net *) fn);
+ max_feed -= rt_next_hop_update_net(tab, n);
}
- FIB_ITERATE_END(fn);
+ FIB_ITERATE_END;
/* state change 2->0, 3->1 */
tab->nhu_state &= 1;
@@ -1971,13 +1962,12 @@ rt_feed_baby(struct proto *p)
again:
h = p->feed_ahook;
- FIB_ITERATE_START(&h->table->fib, fit, fn)
+ FIB_ITERATE_START(&h->table->fib, fit, net, n)
{
- net *n = (net *) fn;
rte *e = n->routes;
if (max_feed <= 0)
{
- FIB_ITERATE_PUT(fit, fn);
+ FIB_ITERATE_PUT(fit);
return 0;
}
@@ -2008,7 +1998,7 @@ again:
max_feed--;
}
}
- FIB_ITERATE_END(fn);
+ FIB_ITERATE_END;
p->feed_ahook = h->next;
if (!p->feed_ahook)
{
@@ -2534,9 +2524,8 @@ rt_show_cont(struct cli *c)
struct fib *fib = &d->table->fib;
struct fib_iterator *it = &d->fit;
- FIB_ITERATE_START(fib, it, f)
+ FIB_ITERATE_START(fib, it, net, n)
{
- net *n = (net *) f;
if (d->running_on_config && d->running_on_config != config)
{
cli_printf(c, 8004, "Stopped due to reconfiguration");
@@ -2549,12 +2538,12 @@ rt_show_cont(struct cli *c)
}
if (!max--)
{
- FIB_ITERATE_PUT(it, f);
+ FIB_ITERATE_PUT(it);
return;
}
rt_show_net(c, n, d);
}
- FIB_ITERATE_END(f);
+ FIB_ITERATE_END;
if (d->stats)
cli_printf(c, 14, "%d of %d routes for %d networks", d->show_counter, d->rt_counter, d->net_counter);
else