2008-10-22 6 views
8

Nous avons rencontré un problème épineux. Nous écrivons un programme C++ qui reçoit le trafic UDP multicast. Nous sommes en train de déplacer nos applications vers un environnement réseau différent et notre équipe des opérations nous a demandé de prendre en charge les annonces d'adhésion IGMPv3 de nos applications. Les premières investigations indiquent que les noyaux Linux 2.6 supportent IGMPv3. Par conséquent, je suis perplexe que lorsque nous courons tcpdump, nous voyons les traces de sortie suivantes:Multicast Rejoignez Linux et IGMPv3

[[email protected]]$ 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 pourrait forcer le noyau à utiliser une version inférieure de IGMP en spécifiant une valeur non nulle dans la fichier /proc/sys/net/ipv4/conf/eth1.22/force_igmp_version; cependant, j'ai confirmé que le fichier a une configuration de valeur nulle.

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

Y at-il quelque chose de plus que nous devons inclure dans le programme source pour forcer IGMPv3?

Répondre

12

Quelques éléments à prendre en compte. Le premier est que (si je comprends bien) en réglant le /proc/sys/net/ipv4/conf/eth1.22/force_igmp_version à 0 ne signifie pas "utiliser v3", mais le met en "auto". Je crois que vous pouvez le mettre à 3 pour le forcer à utiliser igmp v3. Cependant, l'autre chose à savoir est que le comportement de la pile igmp est déterminé par l'environnement dans lequel elle se trouve. Si votre machine Linux reçoit des requêtes d'adhésion igmp v2 d'un routeur igmp en amont, alors je Je crois que le comportement linux par défaut (tel que mandaté par le igmp v3 rfc) est d'utiliser seulement igmp v2 pour les rapports. Comme je le comprends lorsque vous définissez /proc/sys/net/ipv4/conf/eth1.22/force_igmp_version à 0, il utilise ce comportement.

+0

Intéressant. Oui, le réglage de la force à 3 fait que le serveur utilise igmp v3. Par conséquent, je crois que la prochaine étape est de s'assurer que le réseau utilise igmpv3. Merci! – terson