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