Многоадресная адресация IPv6: все ли идентификаторы групп считаются действительными/назначаемыми пользователем?

Я наблюдаю некоторое «интересное» поведение в процедурах многоадресной рассылки IPv6 для локальной ссылки в моей программе. Кажется, что если я установлю любой из старших 16 бит 112-битного поля идентификатора группы, то MacOS/X больше не будет принимать эти многоадресные пакеты. Мой вопрос: это ошибка в сетевом стеке MacOS/X или есть какая-то причина, по которой установка старших 16 бит поля идентификатора группы повлияет на поведение маршрутизации?

Далее следует более конкретная информация:

  • Многоадресная рассылка с одного Mac на другой Mac всегда работает (проверено на 10.5 и 10.6)

  • Многоадресная рассылка из Linux в Windows всегда работает

  • Многоадресная рассылка с Mac на Windows, с Windows на Mac или с Linux на Mac работает только в том случае, если старшие 16 бит идентификатора группы в многоадресном адресе установлены на ноль. Например:

  • ff02::666 works
  • ff02:0:ffff::666 works
  • ff02:1::666 doesn't work
  • ff02:8000::666 doesn't work

    • In the "doesn't work" cases, WireShark running on the Mac shows that the Mac has received the multicast packets, but those packets are never passed on to the receiving application(s) on the Mac. Does this mean that the Mac networking stack has a bug, or is there some deeper magic to multicast addressing that I'm not aware of?

  • person Jeremy Friesner    schedule 22.09.2009    source источник


    Ответы (1)


    Вы сначала присоединяетесь к многоадресной группе? Вы должны явно указать ОС группу, к которой вы хотите присоединиться, прежде чем она доставит вам сообщения группы. Есть команда, к которой вы можете получить доступ с помощью setsockopt(), чтобы присоединиться к группе многоадресной рассылки. Из справочной страницы Darwin ip6:

    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.
    

    Я нашел пример кода здесь:

    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));
    

    Но, может быть, вы уже делаете это?

    person cce    schedule 04.10.2009
    comment
    Увы, я... это один и тот же код во всех случаях, просто заменяемый на другой многоадресный IP-адрес. - person Jeremy Friesner; 07.10.2009