diff --git a/proto/ospf/iface.c b/proto/ospf/iface.c index e6ae91bd..25a98224 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 1a02c00e..ce9739e0 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 31a6a1fd..8b88d663 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) {