diff options
author | Martin Mares <mj@ucw.cz> | 2000-05-13 13:42:06 +0200 |
---|---|---|
committer | Martin Mares <mj@ucw.cz> | 2000-05-13 13:42:06 +0200 |
commit | 56d6c530eba46dde7280d6743fea7e750f2d5635 (patch) | |
tree | 07fdb990d0aab66c5313dee0d9e59c2b80cd3941 /nest | |
parent | d3abfbc68d7f921b2547b39a6baa9bee6c89b78d (diff) | |
download | bird-56d6c530eba46dde7280d6743fea7e750f2d5635.tar bird-56d6c530eba46dde7280d6743fea7e750f2d5635.zip |
Added fib_route() which does (although very slow) lookup of longest-match
routing in a FIB.
Diffstat (limited to 'nest')
-rw-r--r-- | nest/route.h | 3 | ||||
-rw-r--r-- | nest/rt-fib.c | 17 |
2 files changed, 19 insertions, 1 deletions
diff --git a/nest/route.h b/nest/route.h index fac5b38..20709e9 100644 --- a/nest/route.h +++ b/nest/route.h @@ -63,6 +63,7 @@ struct fib { void fib_init(struct fib *, pool *, unsigned node_size, unsigned hash_order, void (*init)(struct fib_node *)); void *fib_find(struct fib *, ip_addr *, int); /* Find or return NULL if doesn't exist */ void *fib_get(struct fib *, ip_addr *, int); /* Find or create new if nonexistent */ +void *fib_route(struct fib *, ip_addr, int); /* Longest-match routing lookup */ void fib_delete(struct fib *, void *); /* Remove fib entry */ void fib_free(struct fib *); /* Destroy the fib */ void fib_check(struct fib *); /* Consistency check for debugging */ @@ -212,7 +213,7 @@ struct rt_show_data { int import_mode, primary_only; struct config *running_on_config; int net_counter, rt_counter, show_counter; - int stats; + int stats, show_for; }; void rt_show(struct rt_show_data *); diff --git a/nest/rt-fib.c b/nest/rt-fib.c index 22ba2ff..6a5d136 100644 --- a/nest/rt-fib.c +++ b/nest/rt-fib.c @@ -152,6 +152,23 @@ fib_get(struct fib *f, ip_addr *a, int len) return e; } +void * +fib_route(struct fib *f, ip_addr a, int len) +{ + ip_addr a0; + void *t; + + while (len >= 0) + { + a0 = ipa_and(a, ipa_mkmask(len)); + t = fib_find(f, &a0, len); + if (t) + return t; + len--; + } + return NULL; +} + static inline void fib_merge_readers(struct fib_iterator *i, struct fib_node *to) { |