> On 17 Mar 2016, at 12:10, Andrey V. Elsukov <a...@freebsd.org> wrote:
> 
> Author: ae
> Date: Thu Mar 17 11:10:44 2016
> New Revision: 296986
> URL: https://svnweb.freebsd.org/changeset/base/296986
> 
> Log:
>  Reduce the number of local variables. Remove redundant check that inp
>  pointer isn't NULL, it is safe, because we are handling IPV6_PKTINFO
>  socket option in this block of code. Also, use in6ifa_withaddr() instead
>  of ifa_withaddr().
...
>  in6_selectsrc(uint32_t fibnum, struct so
>                * the interface must be specified; otherwise, ifa_ifwithaddr()
>                * will fail matching the address.
>                */
> -             bzero(&srcsock, sizeof(srcsock));
> -             srcsock.sin6_family = AF_INET6;
> -             srcsock.sin6_len = sizeof(srcsock);
> -             srcsock.sin6_addr = pi->ipi6_addr;
> +             tmp = pi->ipi6_addr;
>               if (ifp) {
> -                     error = in6_setscope(&srcsock.sin6_addr, ifp, NULL);
> +                     error = in6_setscope(&tmp, ifp, &odstzone);
>                       if (error)
>                               return (error);
>               }
>               if (cred != NULL && (error = prison_local_ip6(cred,
> -                 &srcsock.sin6_addr, (inp != NULL &&
> -                 (inp->inp_flags & IN6P_IPV6_V6ONLY) != 0))) != 0)
> +                 &tmp, (inp->inp_flags & IN6P_IPV6_V6ONLY) != 0)) != 0)
>                       return (error);
> 
>               /*
> @@ -262,19 +255,18 @@ in6_selectsrc(uint32_t fibnum, struct so
>                * ancillary data.
>                */
>               if ((inp->inp_flags & INP_BINDANY) == 0) {
> -                     ia6 = (struct in6_ifaddr *)ifa_ifwithaddr(
> -                         (struct sockaddr *)&srcsock);
> -                     if (ia6 == NULL || (ia6->ia6_flags & (IN6_IFF_ANYCAST |
> +                     ia = in6ifa_ifwithaddr(&tmp, odstzone);

I believe this breaks radvd. It tries to send out RAs with a link-local source 
address.
These fail with 'ERR#49 'Can't assign requested address’’.

Note that ‘tmp’ has had the zoneid embedded into it already (in6_setscope() 
above), so the address comparison in in6ifa_ifwithaddr() fails to match.
That leads to the EADDRNOTAVAIL error.

I don’t think this is the specific commit that broke things (at least, I don’t 
see how it worked before),
but I’m hoping you’ll have a better idea of what went wrong.

Regards,
Kristof
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to