tech-net archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: bind() to IPv6 link-local multicast group gives EADDRNOTAVAIL



On 2014-07-23 07:11, Christos Zoulas wrote:
> In article <53CF5BF8.4000402%bbn.com@localhost>, Richard Hansen  
> <rhansen%bbn.com@localhost> wrote:
>> Hi all,
>>
>> It seems to me like in6_pcbbind_addr() should have another 'else if'
>> condition before line 241:
>>
>>    } else if (IN6_IS_ADDR_MULTICAST(&sin6->sin6_addr)) {
>>        ...
>>
>> Or am I doing something wrong?
> 
> Does this work for you? (similar to in_pcbbind_addr())...

Thanks for the patch.  I'll try it out in a bit, but before I do I have
some questions.  Some of these will be answered by my testing, but I
wanted to ask them anyway in case you already know the answer and would
like to update the patch:

  * With this patch, in6_pcbind_addr() will set in6p->in6p_laddr to the
    multicast group address.  Will this cause an outgoing packet sent
    via the socket to have the source address set to the multicast
    address (which would violate RFC4291)?

  * Shouldn't in6_pcbind_addr() ensure that sin6->sin6_scope_id is
    non-0 if the multicast address is link-local?  (or perhaps
    non-global?)

  * How does sin6->sin6_scope_id affect the binding?  Suppose I have two
    interfaces, wm0 and wm1.  I create two sockets and bind one to
    ff02::101%wm0 port 123 and the other to ff02:101%wm1 port 123.
    Each should only receive packets that arrive on the specified
    interface, but with this patch I'm guessing one of the following
    will happen:
      - the second bind() will fail (the call to in6_pcblookup_port()
        in in6_pcbbind_port() doesn't consider sin6_scope_id, so I
        think NetBSD will return EADDRINUSE)
      - both sockets will receive packets destined to either interface
      - one socket will receive packets destined to both interfaces
        while the other socket receives nothing

  * Should in6_pcbind_addr() reject the bind to the multicast address
    if the socket type is SOCK_STREAM?

Thanks,
Richard

> 
> christos
> 
> Index: in6_pcb.c
> ===================================================================
> RCS file: /cvsroot/src/sys/netinet6/in6_pcb.c,v
> retrieving revision 1.125
> diff -u -p -u -r1.125 in6_pcb.c
> --- in6_pcb.c 30 May 2014 01:39:03 -0000      1.125
> +++ in6_pcb.c 23 Jul 2014 11:10:23 -0000
> @@ -218,7 +218,9 @@ in6_pcbbind_addr(struct in6pcb *in6p, st
>       if ((error = sa6_embedscope(sin6, ip6_use_defzone)) != 0)
>               return (error);
>  
> -     if (IN6_IS_ADDR_V4MAPPED(&sin6->sin6_addr)) {
> +     if (IN6_IS_ADDR_MULTICAST(&sin6->sin6_addr)) {
> +             /* always succeed */
> +     } else if (IN6_IS_ADDR_V4MAPPED(&sin6->sin6_addr)) {
>               if ((in6p->in6p_flags & IN6P_IPV6_V6ONLY) != 0)
>                       return (EINVAL);
>               if (sin6->sin6_addr.s6_addr32[3]) {


Home | Main Index | Thread Index | Old Index