pure ipv6 interface not accepted by samba (3 & 4)

Jeremy Allison jra at samba.org
Fri Oct 14 15:13:32 MDT 2011


On Fri, Oct 14, 2011 at 08:41:47PM +0200, Matthieu Patou wrote:
> Hello,
> 
> I tried today to start samba4 on one of my computer it has a 6to4
> IPv6 interface and samba was not binding.
> 
> Most of the problem is in lib/socket/interfaces.c, in this code:
> 
>                 if (ifaces[total].flags & (IFF_BROADCAST|IFF_LOOPBACK)) {
>                         make_bcast(&ifaces[total].bcast,
> &ifaces[total].ip,
> &ifaces[total].netmask);
>                 } else if ((ifaces[total].flags & IFF_POINTOPOINT) &&
>                                ifptr->ifa_dstaddr ) {
>                         memcpy(&ifaces[total].bcast,
>                                 ifptr->ifa_dstaddr,
>                                 copy_size);
>                 }
> 
> The 6to4 interface has the flags IFF_POINTTOPOINT interface but no
> ifa_dstaddr as it's not at the IPv6 level a point to point interface
> (at least from my understanding), as we don't have a IFF_BROADCAST
> flag set (I have the impression that this flag is only set on a
> interface that has also an IPv4 address) the first test is not valid
> also, which result in a skipped interface.
> 
> I made the following patch in my repo: http://bit.ly/rl0DCs, it's
> basically this:
> 
>                         memcpy(&ifaces[total].bcast,
>                                 ifptr->ifa_dstaddr,
>                                 copy_size);
> +#if defined(HAVE_IPV6)
> +               } else if (ifptr->ifa_addr->sa_family == AF_INET6) {
> +                       const struct sockaddr_in6 *sin6 = (const
> struct sockaddr_in6*)(ifptr->ifa_addr);
> +                       const struct in6_addr *in6 = (const struct
> in6_addr *)&sin6->sin6_addr;
> +
> +                       if (IN6_IS_ADDR_LINKLOCAL(in6) ||
> IN6_IS_ADDR_V4COMPAT(in6)) {
> +                               continue;
> +                       }
> +                       /* IPv6 do not have broadcast bydefault
> there is special broadcast address for it*/
> +                       memset(&ifaces[total].bcast, 0, copy_size);
> +#endif
>                 } else {
>                         continue;
>                 }
> 
> My idea is to say we don't care about broadcast when we do IPv6
> because this exact notion do not exists, and in order not to have
> the local link nor the V4compat address we skip this kind of
> addresses.
> 
> The result: on my computer I'm now able to start samba4 and have it
> running as a domain controller and listenning on my 6to4 interface.

Thanks Matthieu, looks good to me. Pushed (something similar)
to master.

Log a bug if you need this in 3.6.next.

Jeremy.


More information about the samba-technical mailing list