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).

Reply via email to