diff options
Diffstat (limited to 'nest')
-rw-r--r-- | nest/route.h | 43 | ||||
-rw-r--r-- | nest/rt-fib.c | 8 | ||||
-rw-r--r-- | nest/rt-table.c | 65 |
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 |