diff options
author | Ondrej Zajicek <santiago@crfreenet.org> | 2010-01-08 22:19:41 +0100 |
---|---|---|
committer | Ondrej Zajicek <santiago@crfreenet.org> | 2010-01-08 22:19:41 +0100 |
commit | 99f5fc14cd457f71973bc2264566284049ccfb2c (patch) | |
tree | a9448b1b462934b64ff0350f787036bd892da3eb /proto | |
parent | fc33143f02642cc775a704dec37446e0b4343a43 (diff) | |
download | bird-99f5fc14cd457f71973bc2264566284049ccfb2c.tar bird-99f5fc14cd457f71973bc2264566284049ccfb2c.zip |
A partial vlink fix.
Diffstat (limited to 'proto')
-rw-r--r-- | proto/ospf/iface.c | 7 | ||||
-rw-r--r-- | proto/ospf/packet.c | 2 | ||||
-rw-r--r-- | proto/ospf/rt.c | 17 |
3 files changed, 19 insertions, 7 deletions
diff --git a/proto/ospf/iface.c b/proto/ospf/iface.c index e6ae91b..25a9822 100644 --- a/proto/ospf/iface.c +++ b/proto/ospf/iface.c @@ -69,8 +69,11 @@ ospf_open_socket(struct ospf_iface *ifa, int mc) ipsk->dport = OSPF_PROTO; #ifdef OSPFv2 - // ipsk->saddr = ifa->iface->addr->ip; - ipsk->saddr = IPA_NONE; + /* FIXME - why there is IPA_NONE on multicast sockets ? */ + if (mc) + ipsk->saddr = IPA_NONE; + else + ipsk->saddr = ifa->iface->addr->ip; #else /* OSPFv3 */ ipsk->saddr = ifa->lladdr; #endif diff --git a/proto/ospf/packet.c b/proto/ospf/packet.c index 1a02c00..ce9739e 100644 --- a/proto/ospf/packet.c +++ b/proto/ospf/packet.c @@ -287,7 +287,7 @@ ospf_rx_hook(sock * sk, int size) return 1; } - /* This is strange! */ + /* We receive packets related to vlinks even on non-vlink sockets */ if ((ifa->oa->areaid != 0) && (ntohl(ps->areaid) == 0)) { WALK_LIST(iff, po->iface_list) diff --git a/proto/ospf/rt.c b/proto/ospf/rt.c index 31a6a1f..8b88d66 100644 --- a/proto/ospf/rt.c +++ b/proto/ospf/rt.c @@ -310,6 +310,7 @@ ospf_rt_spfa_rtlinks(struct ospf_area *oa, struct top_hash_entry *act, struct to } } +/* 16.1 calculating shortest paths for an area */ static void ospf_rt_spfa(struct ospf_area *oa) { @@ -510,6 +511,7 @@ link_back(struct ospf_area *oa, struct top_hash_entry *en, struct top_hash_entry return 0; } +/* 16.3 examining summary-LSAs in transit areas */ static void ospf_rt_sum_tr(struct ospf_area *oa) { @@ -533,12 +535,14 @@ ospf_rt_sum_tr(struct ospf_area *oa) if (en->domain != oa->areaid) continue; + /* 16.3 (1a) */ if (en->lsa.age == LSA_MAXAGE) continue; - if (en->dist == LSINFINITY) - continue; + // if (en->dist == LSINFINITY) + // continue; + /* 16.3 (2) */ if (en->lsa.rt == po->router_id) continue; @@ -583,12 +587,17 @@ ospf_rt_sum_tr(struct ospf_area *oa) re = (ort *) fib_find(&bb->rtr, &ip, pxlen); } + /* 16.3 (1b) */ + if (metric == LSINFINITY) + continue; + + /* 16.3 (3) */ if (!re) continue; if (re->n.oa->areaid != 0) continue; if ((re->n.type != RTS_OSPF) && (re->n.type != RTS_OSPF_IA)) continue; + /* 16.3. (4) */ abrip = ipa_from_rid(en->lsa.rt); - abr = fib_find(&oa->rtr, &abrip, MAX_PREFIX_LENGTH); if (!abr) continue; @@ -605,7 +614,7 @@ ospf_rt_sum_tr(struct ospf_area *oa) } } - +/* 16.2 calculating inter-area routes */ static void ospf_rt_sum(struct ospf_area *oa) { |