Multidiffusion Rejoindre sur Linux et IGMPv3

Nous avons exécuté dans un problème épineux. Nous sommes à l'écriture d'un programme c++ qui reçoit de multidiffusion UDP. Nous sommes dans le processus de l'évolution de nos applications sur un réseau différent de l'environnement et de notre équipe des opérations a demandé que nous soutenons IGMPv3 adhésion des annonces de nos applications. Des enquêtes initiales indiquent que les noyaux Linux 2.6 ne soutien IGMPv3. Donc, je suis intrigué par le fait que lorsque nous tcpdump, nous voyons le résultat suivant des traces:

[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

Ma compréhension est que l'on peut forcer le noyau à utiliser une version inférieure de IGMP en spécifiant une valeur non nulle dans le fichier /proc/sys/net/ipv4/conf/eth1.22/force_igmp_version; cependant, j'ai confirmé que le fichier a une valeur de zéro configuration.

Notre application utilise le code suivant pour rejoindre le groupe de multidiffusion:

... 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.
  //...
}

Est-il quelque chose de plus que nous devons inclure dans le programme source de force IGMPv3?

OriginalL'auteur terson | 2008-10-22