summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMartin Mares <mj@ucw.cz>2000-05-13 13:42:06 +0200
committerMartin Mares <mj@ucw.cz>2000-05-13 13:42:06 +0200
commit56d6c530eba46dde7280d6743fea7e750f2d5635 (patch)
tree07fdb990d0aab66c5313dee0d9e59c2b80cd3941
parentd3abfbc68d7f921b2547b39a6baa9bee6c89b78d (diff)
downloadbird-56d6c530eba46dde7280d6743fea7e750f2d5635.tar
bird-56d6c530eba46dde7280d6743fea7e750f2d5635.zip
Added fib_route() which does (although very slow) lookup of longest-match
routing in a FIB.
-rw-r--r--nest/route.h3
-rw-r--r--nest/rt-fib.c17
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)
{