Am 01/23/17 um 09:16 schrieb Jeremie Courreges-Anglas: > > Cc'ing Brad (maintainer), > > Marc Peters <m...@mpeters.org> writes: > >> Am 01/23/17 um 00:34 schrieb Jeremie Courreges-Anglas: >>> Stuart Henderson <s...@spacehopper.org> writes: >>> >>>> >>>> Here is the upstream code with more context. >>>> >>>> 789 /* >>>> 790 * Set the target address we're sending to. >>>> 791 * Enforce the scope ID for bogus BSDs. >>>> 792 */ >>>> 793 memcpy(&dst, to, sizeof(dst)); >>>> 794 m.msg_name = &dst; >>>> 795 m.msg_namelen = sizeof(dst); >>>> 796 ifindex = if_nametoindex(interface->name); >>>> 797 if (no_global_v6_socket) >>>> 798 dst.sin6_scope_id = ifindex; >>>> >>>> So, setting the scope ID is exactly what they are already trying to do. >>>> I don't really want to spend much time understanding code which they >>>> have marked as "XXX: this is gross. we need to go back and overhaul the >>>> API for socket handling". But it looks like they'd be expecting >>>> no_global_v6_socket to be set on a BSD which needs the scope id. >>> >>> Whether no_global_v6_socket is true doesn't seem to depend on the OS: it >>> appears true when running dhclient, false when running dhcpd/dhcrelay; >>> see if_register_linklocal6(). This looks more like a lack of testing, >>> as it appears safe to set sin6_scope_id everywhere. >>> >>>> Better if someone who already knows the code looks at it - can you >>>> bring this up on dhcp-users or somewhere similar? >>> >>> I don't volunteer to move this to dhcp-users... yet. Maybe the actual >>> fix is in our base system. It *looks like* our kernel has indeed a bug, >>> it should use the ifindex in the cmsg. >>> >> >> Ok, i already prepared a mail i was going to send later today, but if >> the bug is in our base system, it won't do any good. >> >> Maybe someone with knowledge of the network stack can have a look? I >> would help in testing patches. > > I took a look and I feel dirty. > > The patch below works around the issue by always setting sin6_scope_id. > In the dhclient case, all platforms both set sin6_scope_id and use the > cmsg API. So there shouldn't be breakage on other platforms. > > Thoughts? > > > Index: Makefile > =================================================================== > RCS file: /d/cvs/ports/net/isc-dhcp/Makefile,v > retrieving revision 1.43 > diff -u -p -r1.43 Makefile > --- Makefile 24 Oct 2016 12:24:13 -0000 1.43 > +++ Makefile 22 Jan 2017 23:34:03 -0000 > @@ -5,6 +5,7 @@ COMMENT-client= ISC DHCP Client > COMMENT-omapi= ISC DHCP OMAPI > > VERSION= 4.3.5 > +REVISION= 0 > DISTNAME= isc-dhcp-${VERSION} > PKGNAME= isc-dhcp-${VERSION:S/-P/./} > PKGNAME-main= isc-dhcp-server-${VERSION:S/-P/./} > Index: patches/patch-common_socket_c > =================================================================== > RCS file: patches/patch-common_socket_c > diff -N patches/patch-common_socket_c > --- /dev/null 1 Jan 1970 00:00:00 -0000 > +++ patches/patch-common_socket_c 22 Jan 2017 23:16:05 -0000 > @@ -0,0 +1,13 @@ > +$OpenBSD$ > +--- common/socket.c.orig Mon Jan 23 00:15:45 2017 > ++++ common/socket.c Mon Jan 23 00:15:51 2017 > +@@ -794,8 +794,7 @@ ssize_t send_packet6(struct interface_info *interface, > + m.msg_name = &dst; > + m.msg_namelen = sizeof(dst); > + ifindex = if_nametoindex(interface->name); > +- if (no_global_v6_socket) > +- dst.sin6_scope_id = ifindex; > ++ dst.sin6_scope_id = ifindex; > + > + /* > + * Set the data buffer we're sending. (Using this wacky > >
Works here (backported to 4.3.4 for -stable, though).