Многоадресная адресация IPv6: все ли «идентификаторы групп» считаются действительными / назначаемыми пользователем? - PullRequest
2 голосов
/ 22 сентября 2009

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

Более подробная информация приведена ниже:

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

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

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

ff02 :: 666 работ ff02: 0: ffff :: 666 работ ff02: 1 :: 666 не работает ff02: 8000 :: 666 не работает
  • В случаях «не работает» WireShark, работающий на Mac, показывает, что Mac получил многоадресные пакеты, но эти пакеты никогда не передаются принимающим приложениям на Mac. Означает ли это, что в сетевом стеке Mac есть ошибка или есть какая-то более глубокая магия для многоадресной адресации, о которой я не знаю?

1 Ответ

1 голос
/ 05 октября 2009

Вы сначала присоединяетесь к группе многоадресной рассылки? Вы должны явно указать ОС группу, к которой хотите присоединиться, прежде чем она доставит вам сообщения группы. Есть команда, к которой вы можете обратиться с помощью 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));

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

...