summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOndrej Zajicek <santiago@crfreenet.org>2013-11-21 13:17:42 +0100
committerOndrej Zajicek <santiago@crfreenet.org>2013-11-21 13:17:42 +0100
commit64534ea2f4361c247d7a0d1b6b14a02e8e3d6d33 (patch)
treeae298c2e4ee93fd917e80c00c6d39186dbb4f667
parentf8f2419d4c5b9028b9b3d2d893fe802f18eb239b (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.
-rw-r--r--sysdep/bsd/krt-sock.c37
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