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?

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top