diff options
author | Ondrej Zajicek <santiago@crfreenet.org> | 2013-11-21 13:17:42 +0100 |
---|---|---|
committer | Ondrej Zajicek <santiago@crfreenet.org> | 2013-11-21 13:17:42 +0100 |
commit | 64534ea2f4361c247d7a0d1b6b14a02e8e3d6d33 (patch) | |
tree | ae298c2e4ee93fd917e80c00c6d39186dbb4f667 /sysdep/bsd | |
parent | f8f2419d4c5b9028b9b3d2d893fe802f18eb239b (diff) |
Fixes an issue when opposite address is mistaken for broadcast on ptp ifaces on BSDs.
Thanks to Lex van Roon for the bugreport and to Alexander V. Chernikov
for examining it and locating the problem.
Diffstat (limited to 'sysdep/bsd')
-rw-r--r-- | sysdep/bsd/krt-sock.c | 37 |
1 files changed, 19 insertions, 18 deletions
diff --git a/sysdep/bsd/krt-sock.c b/sysdep/bsd/krt-sock.c index 3d300369..0bc29458 100644 --- a/sysdep/bsd/krt-sock.c +++ b/sysdep/bsd/krt-sock.c @@ -654,17 +654,25 @@ krt_read_addr(struct ks_msg *msg) if ((masklen = ipa_mklen(imask)) < 0) { - log("Invalid masklen"); + log(L_ERR "KIF: Invalid masklen %I for %s", imask, iface->name); return; } - bzero(&ifa, sizeof(ifa)); +#ifdef IPV6 + /* Clean up embedded interface ID returned in link-local address */ - ifa.iface = iface; + if (ipa_has_link_scope(iaddr)) + _I0(iaddr) = 0xfe800000; - memcpy(&ifa.ip, &iaddr, sizeof(ip_addr)); + if (ipa_has_link_scope(ibrd)) + _I0(ibrd) = 0xfe800000; +#endif + + + bzero(&ifa, sizeof(ifa)); + ifa.iface = iface; + ifa.ip = iaddr; ifa.pxlen = masklen; - memcpy(&ifa.brd, &ibrd, sizeof(ip_addr)); scope = ipa_classify(ifa.ip); if (scope < 0) @@ -674,16 +682,6 @@ krt_read_addr(struct ks_msg *msg) } ifa.scope = scope & IADDR_SCOPE_MASK; -#ifdef IPV6 - /* Clean up embedded interface ID returned in link-local address */ - - if (ipa_has_link_scope(ifa.ip)) - _I0(ifa.ip) = 0xfe800000; - - if (ipa_has_link_scope(ifa.brd)) - _I0(ifa.brd) = 0xfe800000; -#endif - if (masklen < BITS_PER_IP_ADDRESS) { ifa.prefix = ipa_and(ifa.ip, ipa_mkmask(masklen)); @@ -696,12 +694,15 @@ krt_read_addr(struct ks_msg *msg) ifa.opposite = ipa_opposite_m2(ifa.ip); #endif + if (iface->flags & IF_BROADCAST) + ifa.brd = ibrd; + if (!(iface->flags & IF_MULTIACCESS)) - ifa.opposite = ifa.brd; + ifa.opposite = ibrd; } - else if (!(iface->flags & IF_MULTIACCESS) && ipa_nonzero(ifa.brd)) + else if (!(iface->flags & IF_MULTIACCESS) && ipa_nonzero(ibrd)) { - ifa.prefix = ifa.opposite = ifa.brd; + ifa.prefix = ifa.opposite = ibrd; ifa.flags |= IA_PEER; } else |