Subject: Re: regression: bind interface and transmit to ff02::2
To: JINMEI Tatuya / ?$B?@L@C#:H <jinmei@isl.rdc.toshiba.co.jp>
From: David Young <dyoung@pobox.com>
List: tech-net
Date: 04/04/2006 11:15:00
On Thu, Mar 23, 2006 at 04:39:24PM +0900, JINMEI Tatuya / ?$B?@L@C#:H wrote:
> >>>>> On Thu, 23 Mar 2006 16:33:47 +0900,
> >>>>> JINMEI Tatuya <jinmei@isl.rdc.toshiba.co.jp> said:
>
> >> Correct.
>
> > Okay, then it's not the intended behavior, sorry for the mess. Please
> > try the attached patch.
>
> Oops, sorry, that patch was incorrect. Please use this one (below).
The patch didn't fix the bug; sendto(2) still fails with "No route
to host."
Dave
> JINMEI, Tatuya
> Communication Platform Lab.
> Corporate R&D Center, Toshiba Corp.
> jinmei@isl.rdc.toshiba.co.jp
>
> --- in6_src.c.orig Thu Mar 23 16:20:31 2006
> +++ in6_src.c Thu Mar 23 16:36:25 2006
> @@ -201,6 +201,7 @@
> int dst_scope = -1, best_scope = -1, best_matchlen = -1;
> struct in6_addrpolicy *dst_policy = NULL, *best_policy = NULL;
> u_int32_t odstzone;
> + int error;
> #ifdef notyet /* until introducing ND extensions and address selection */
> int prefer_tempaddr;
> #endif
> @@ -260,18 +261,31 @@
> }
>
> /*
> - * Otherwise, if the socket has already bound the source, just use it.
> + * Choose the best one based on the outgoing interface and the
> + * destination address. We do this regardless of whether the socket
> + * is bound, since the caller may need this information as a side
> + * effect of the call to this function (e.g., for identifying the
> + * appropriate scope zone ID).
> + */
> + /* get the outgoing interface */
> + error = in6_selectif(dstsock, opts, mopts, ro, &ifp);
> +
> + /*
> + * If the socket has already bound the source, just use it. We don't
> + * care at the moment whether in6_selectif() succeeded, even though it
> + * would eventually cause an error.
> */
> if (laddr && !IN6_IS_ADDR_UNSPECIFIED(laddr))
> return (laddr);
>
> /*
> - * If the address is not specified, choose the best one based on
> - * the outgoing interface and the destination address.
> + * The outgoing interface is crucial in the general selection procedure
> + * below. If it is not known at this point, we fail.
> */
> - /* get the outgoing interface */
> - if ((*errorp = in6_selectif(dstsock, opts, mopts, ro, &ifp)) != 0)
> + if (ifp == NULL) {
> + *errorp = error;
> return (NULL);
> + }
>
> #if defined(MIP6) && NMIP > 0
> /*
--
David Young OJC Technologies
dyoung@ojctech.com Urbana, IL * (217) 278-3933