Мы столкнулись с острой проблемой. Мы пишем программу на С ++, которая получает многоадресный UDP-трафик. Мы находимся в процессе переноса наших приложений в другую сетевую среду, и наша операционная команда обратилась с просьбой о поддержке объявлений о членстве в IGMPv3 из наших приложений. Первоначальные исследования показывают, что ядра Linux 2.6 поддерживают IGMPv3. Поэтому я озадачен тем, что при запуске tcpdump мы видим следующие выходные трассы:
[rtv@myhost]$ sudo /usr/sbin/tcpdump -i eth1.22 igmp
tcpdump: listening on eth1.22
00:20:09.007094 switch-a.stage > ALL-SYSTEMS.MCAST.NET: igmp query v2 [max resp time 20] [ttl 1]
00:20:09.241946 10.129.22.236 > 232.0.1.10: igmp v2 report 232.0.1.10 (DF) [tos 0xc0] [ttl 1]
00:20:10.472159 10.129.22.236 > 236.0.1.101: igmp v2 report 236.0.1.101 (DF) [tos 0xc0] [ttl 1]
44 packets received by filter
Насколько я понимаю, можно заставить ядро использовать более низкую версию IGMP, указав ненулевое значение в файле /proc/sys/net/ipv4/conf/eth1.22/force_igmp_version; однако я подтвердил, что файл имеет конфигурацию с нулевым значением.
Наше приложение использует следующий код для присоединения к группе многоадресной рассылки:
... joinMulticast(in_addr mcast_addr, in_addr interface_addr)
{
struct ip_mreq mcast_req;
mcast_req.imr_multiaddr.s_addr = mcast_addr;
mcast_req.imr_interface.s_addr = interface_addr;
int err = setsockopt(fFileDesc, IPPROTO_IP, IP_ADD_MEMBERSHIP,
(char*)&theMulti, sizeof(theMulti));
// handle errors etc.
// ...
}
Есть ли что-то еще, что нам нужно включить в исходную программу для принудительного запуска IGMPv3?