A partial vlink fix.
This commit is contained in:
parent
fc33143f02
commit
99f5fc14cd
3 changed files with 19 additions and 7 deletions
|
@ -69,8 +69,11 @@ ospf_open_socket(struct ospf_iface *ifa, int mc)
|
||||||
ipsk->dport = OSPF_PROTO;
|
ipsk->dport = OSPF_PROTO;
|
||||||
|
|
||||||
#ifdef OSPFv2
|
#ifdef OSPFv2
|
||||||
// ipsk->saddr = ifa->iface->addr->ip;
|
/* FIXME - why there is IPA_NONE on multicast sockets ? */
|
||||||
|
if (mc)
|
||||||
ipsk->saddr = IPA_NONE;
|
ipsk->saddr = IPA_NONE;
|
||||||
|
else
|
||||||
|
ipsk->saddr = ifa->iface->addr->ip;
|
||||||
#else /* OSPFv3 */
|
#else /* OSPFv3 */
|
||||||
ipsk->saddr = ifa->lladdr;
|
ipsk->saddr = ifa->lladdr;
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -287,7 +287,7 @@ ospf_rx_hook(sock * sk, int size)
|
||||||
return 1;
|
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))
|
if ((ifa->oa->areaid != 0) && (ntohl(ps->areaid) == 0))
|
||||||
{
|
{
|
||||||
WALK_LIST(iff, po->iface_list)
|
WALK_LIST(iff, po->iface_list)
|
||||||
|
|
|
@ -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
|
static void
|
||||||
ospf_rt_spfa(struct ospf_area *oa)
|
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;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* 16.3 examining summary-LSAs in transit areas */
|
||||||
static void
|
static void
|
||||||
ospf_rt_sum_tr(struct ospf_area *oa)
|
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)
|
if (en->domain != oa->areaid)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
/* 16.3 (1a) */
|
||||||
if (en->lsa.age == LSA_MAXAGE)
|
if (en->lsa.age == LSA_MAXAGE)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (en->dist == LSINFINITY)
|
// if (en->dist == LSINFINITY)
|
||||||
continue;
|
// continue;
|
||||||
|
|
||||||
|
/* 16.3 (2) */
|
||||||
if (en->lsa.rt == po->router_id)
|
if (en->lsa.rt == po->router_id)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
@ -583,12 +587,17 @@ ospf_rt_sum_tr(struct ospf_area *oa)
|
||||||
re = (ort *) fib_find(&bb->rtr, &ip, pxlen);
|
re = (ort *) fib_find(&bb->rtr, &ip, pxlen);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* 16.3 (1b) */
|
||||||
|
if (metric == LSINFINITY)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
/* 16.3 (3) */
|
||||||
if (!re) continue;
|
if (!re) continue;
|
||||||
if (re->n.oa->areaid != 0) continue;
|
if (re->n.oa->areaid != 0) continue;
|
||||||
if ((re->n.type != RTS_OSPF) && (re->n.type != RTS_OSPF_IA)) continue;
|
if ((re->n.type != RTS_OSPF) && (re->n.type != RTS_OSPF_IA)) continue;
|
||||||
|
|
||||||
|
/* 16.3. (4) */
|
||||||
abrip = ipa_from_rid(en->lsa.rt);
|
abrip = ipa_from_rid(en->lsa.rt);
|
||||||
|
|
||||||
abr = fib_find(&oa->rtr, &abrip, MAX_PREFIX_LENGTH);
|
abr = fib_find(&oa->rtr, &abrip, MAX_PREFIX_LENGTH);
|
||||||
if (!abr) continue;
|
if (!abr) continue;
|
||||||
|
|
||||||
|
@ -605,7 +614,7 @@ ospf_rt_sum_tr(struct ospf_area *oa)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* 16.2 calculating inter-area routes */
|
||||||
static void
|
static void
|
||||||
ospf_rt_sum(struct ospf_area *oa)
|
ospf_rt_sum(struct ospf_area *oa)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in a new issue