IPv6 endereçamento multicast: são todos “Grupo IDs” considerados válidos / usuário-assignable?

StackOverflow https://stackoverflow.com/questions/1461872

  •  13-09-2019
  •  | 
  •  

Pergunta

Eu estou vendo algum comportamento "interessante" em IPv6 rotinas multicast link-local do meu programa. Parece que se eu definir qualquer um dos 16 bits superiores do campo Grupo ID 112-bit, em seguida, MacOS / X não vai aceitar esses pacotes multicast. A minha pergunta é, isso é um erro na pilha MacOS / X rede, ou se há alguma razão para definir os 16 bits superiores do campo Grupo ID iria afetar o comportamento de roteamento?

Mais informações específicas seguintes:

  • O multicasting de um Mac para outro Mac sempre funciona (testado em 10.5 e 10.6)

  • multicast a partir do Linux para o Windows sempre funciona

  • Multicasting do Mac para o Windows ou Windows para o Mac ou Linux para Mac, só funciona se os 16 bits superiores a ID de grupo no endereço multicast são definidos para zero. Por exemplo:

  • FF02 :: 666 obras
  • ff02: 0: ffff :: 666 obras
  • ff02: 1 :: 666 não funciona
  • ff02: 8000 :: 666 não funciona

    • No "não funciona" casos, WireShark executado nos shows de Mac que o Mac tem recebido os pacotes multicast, mas esses pacotes nunca são passados ??para o aplicativo de recebimento (s) no Mac. Será que isso significa que a pilha de rede Mac tem um bug, ou há alguma magia mais profunda para endereçamento multicast que eu não estou ciente de?
  • Foi útil?

    Solução

    Você se juntar ao grupo multicast em primeiro lugar? Você tem que dizer explicitamente o OS o grupo que você quer se juntar antes que ele vai entregar mensagens de um grupo. Há um comando que você pode acessar com setsockopt() para se juntar a um grupo multicast. Do Darwin ip6 manpage :

    IPV6_JOIN_GROUP struct ipv6_mreq *
        Join a multicast group.  A host must become a member of a multicast group before it can receive
        datagrams sent to the group.
    
        struct ipv6_mreq {
                struct in6_addr ipv6mr_multiaddr;
                unsigned int    ipv6mr_interface;
        };
    
        ipv6mr_interface may be set to zeroes to choose the default multicast interface or to the index
        of a particular multicast-capable interface if the host is multihomed.  Membership is associ-
        ated with a single interface; programs running on multihomed hosts may need to join the same
        group on more than one interface.
    
        If the multicast address is unspecified (i.e., all zeroes), messages from all multicast
        addresses will be accepted by this group.  Note that setting to this value requires superuser
        privileges.
    

    Eu encontrei alguns códigos de exemplo aqui :

    struct ipv6_mreq mreq6;
    memcpy(&mreq6.ipv6mr_multiaddr, &(((struct sockaddr_in6 *)addr)->sin6_addr),
           sizeof(struct in6_addr));
    mreq6.ipv6mr_interface= 0;
    
    err = setsockopt(sockfd, IPPROTO_IPV6, IPV6_JOIN_GROUP, &mreq6, sizeof(mreq6));
    if (err) fprintf(stderr, "setsockopt IPV6_JOIN_GROUP: %s\n", strerror (errno));
    

    Mas talvez você está fazendo isso já?

    Licenciado em: CC-BY-SA com atribuição
    Não afiliado a StackOverflow
    scroll top