Allows other than IA_PEER addresses on PtP ifaces on BSD.
Also fixes a potential problem with link-local dest_addrs for IA_PEER addresses. Thanks to Alexander V. Chernikov for the suggestion.
This commit is contained in:
parent
e550a37206
commit
f515e22924
1 changed files with 15 additions and 11 deletions
|
@ -676,22 +676,18 @@ krt_read_addr(struct ks_msg *msg)
|
||||||
|
|
||||||
#ifdef IPV6
|
#ifdef IPV6
|
||||||
/* Clean up embedded interface ID returned in link-local address */
|
/* Clean up embedded interface ID returned in link-local address */
|
||||||
|
|
||||||
if (ipa_has_link_scope(ifa.ip))
|
if (ipa_has_link_scope(ifa.ip))
|
||||||
_I0(ifa.ip) = 0xfe800000;
|
_I0(ifa.ip) = 0xfe800000;
|
||||||
|
|
||||||
|
if (ipa_has_link_scope(ifa.brd))
|
||||||
|
_I0(ifa.brd) = 0xfe800000;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef IPV6
|
if (masklen < BITS_PER_IP_ADDRESS)
|
||||||
/* Why not the same check also for IPv4? */
|
|
||||||
if ((iface->flags & IF_MULTIACCESS) || (masklen != BITS_PER_IP_ADDRESS))
|
|
||||||
#else
|
|
||||||
if (iface->flags & IF_MULTIACCESS)
|
|
||||||
#endif
|
|
||||||
{
|
{
|
||||||
ifa.prefix = ipa_and(ifa.ip, ipa_mkmask(masklen));
|
ifa.prefix = ipa_and(ifa.ip, ipa_mkmask(masklen));
|
||||||
|
|
||||||
if (masklen == BITS_PER_IP_ADDRESS)
|
|
||||||
ifa.flags |= IA_HOST;
|
|
||||||
|
|
||||||
if (masklen == (BITS_PER_IP_ADDRESS - 1))
|
if (masklen == (BITS_PER_IP_ADDRESS - 1))
|
||||||
ifa.opposite = ipa_opposite_m1(ifa.ip);
|
ifa.opposite = ipa_opposite_m1(ifa.ip);
|
||||||
|
|
||||||
|
@ -699,11 +695,19 @@ krt_read_addr(struct ks_msg *msg)
|
||||||
if (masklen == (BITS_PER_IP_ADDRESS - 2))
|
if (masklen == (BITS_PER_IP_ADDRESS - 2))
|
||||||
ifa.opposite = ipa_opposite_m2(ifa.ip);
|
ifa.opposite = ipa_opposite_m2(ifa.ip);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
if (!(iface->flags & IF_MULTIACCESS))
|
||||||
|
ifa.opposite = ifa.brd;
|
||||||
}
|
}
|
||||||
else /* PtP iface */
|
else if (!(iface->flags & IF_MULTIACCESS) && ipa_nonzero(ifa.brd))
|
||||||
{
|
{
|
||||||
ifa.flags |= IA_PEER;
|
|
||||||
ifa.prefix = ifa.opposite = ifa.brd;
|
ifa.prefix = ifa.opposite = ifa.brd;
|
||||||
|
ifa.flags |= IA_PEER;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ifa.prefix = ifa.ip;
|
||||||
|
ifa.flags |= IA_HOST;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (new)
|
if (new)
|
||||||
|
|
Loading…
Reference in a new issue