diff options
author | Ondrej Zajicek <santiago@crfreenet.org> | 2010-05-03 00:10:48 +0200 |
---|---|---|
committer | Ondrej Zajicek <santiago@crfreenet.org> | 2010-05-03 00:10:48 +0200 |
commit | 54818e9beb6bfcbcb5dcc2b175dca9d174012e6c (patch) | |
tree | ea76466b42f840f934631a01d3bcb6e3e4a8f2ab /proto/ospf | |
parent | 506fa1a73eab0c6426f68cd7784c6712898b88f3 (diff) | |
download | bird-54818e9beb6bfcbcb5dcc2b175dca9d174012e6c.tar bird-54818e9beb6bfcbcb5dcc2b175dca9d174012e6c.zip |
A minor bugfix in OSPF ext-LSA processing.
Diffstat (limited to 'proto/ospf')
-rw-r--r-- | proto/ospf/rt.c | 22 |
1 files changed, 19 insertions, 3 deletions
diff --git a/proto/ospf/rt.c b/proto/ospf/rt.c index 81eca56..8332ffa 100644 --- a/proto/ospf/rt.c +++ b/proto/ospf/rt.c @@ -1024,6 +1024,23 @@ ospf_rt_abr(struct proto_ospf *po) ospf_check_vlinks(po); } +/* Like fib_route(), but ignores dummy rt entries */ +static void * +ospf_fib_route(struct fib *f, ip_addr a, int len) +{ + ip_addr a0; + ort *nf; + + while (len >= 0) + { + a0 = ipa_and(a, ipa_mkmask(len)); + nf = fib_find(f, &a0, len); + if (nf && nf->n.type) + return nf; + len--; + } + return NULL; +} /* RFC 2328 16.4. calculating external routes */ static void @@ -1124,9 +1141,8 @@ ospf_ext_spf(struct proto_ospf *po) } else { - /* FIXME: what about more specific dummy route? */ - nf2 = fib_route(&po->rtf, rt_fwaddr, MAX_PREFIX_LENGTH); - if (!nf2) /* nf2->n.type is checked later */ + nf2 = ospf_fib_route(&po->rtf, rt_fwaddr, MAX_PREFIX_LENGTH); + if (!nf2) continue; if ((nf2->n.type != RTS_OSPF) && (nf2->n.type != RTS_OSPF_IA)) |