Unir Multicast en Linux e IGMPv3
-
03-07-2019 - |
Pregunta
Nos hemos encontrado con un problema espinoso. Estamos escribiendo un programa c ++ que recibe tráfico UDP de multidifusión. Estamos en el proceso de trasladar nuestras aplicaciones a un entorno de red diferente y nuestro equipo de operaciones nos ha solicitado que admitamos los anuncios de membresía IGMPv3 desde nuestras aplicaciones. Las investigaciones iniciales indican que los kernels de Linux 2.6 son compatibles con IGMPv3. Por lo tanto, me sorprende que cuando ejecutamos tcpdump veamos las siguientes trazas de salida:
[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
Mi entendimiento es que uno podría forzar al kernel a usar una versión inferior de IGMP especificando un valor distinto de cero en el archivo /proc/sys/net/ipv4/conf/eth1.22/force_igmp_version; sin embargo, he confirmado que el archivo tiene una configuración de valor cero.
Nuestra aplicación está utilizando el siguiente código para unirse al grupo de multidifusión:
... 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.
// ...
}
¿Hay algo adicional que debamos incluir en el programa fuente para forzar IGMPv3?
Solución
Un par de cosas a tener en cuenta.
Lo primero es que (como yo lo entiendo) establecer /proc/sys/net/ipv4/conf/eth1.22/force_igmp_version
no significa que "use v3", pero en realidad lo establece en " auto " ;. Creo que puedes configurarlo en 3 para forzarlo a usar igmp v3.
Sin embargo, la otra cosa a tener en cuenta es que el comportamiento de la pila igmp está determinado por el entorno en el que se encuentra. Si su caja de Linux está recibiendo consultas de membresía igmp v2 de un enrutador igmp ascendente, creo que que el comportamiento predeterminado de Linux (como lo exige igmp v3 rfc) es usar solo igmp v2 para informes.
Como lo entiendo cuando configuras /proc/sys/net/ipv4/conf/eth1.22/force_igmp_version
en 0 usa este comportamiento.