Question

Nous avons rencontré un problème épineux. Nous écrivons un programme c ++ qui reçoit du trafic UDP en multidiffusion. Nous sommes en train de transférer 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 à partir de nos applications. Les enquêtes initiales indiquent que les noyaux Linux 2.6 prennent en charge IGMPv3. Par conséquent, je suis surpris que lorsque nous exécutons tcpdump, nous voyons les traces de sortie suivantes:

[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

D'après ce que j'ai compris, on pourrait obliger le noyau à utiliser une version inférieure d'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 configuration de valeur zéro.

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 a-t-il quelque chose de supplémentaire que nous devons inclure dans le programme source pour forcer IGMPv3?

Était-ce utile?

La solution

Quelques éléments à connaître.

La première est que (si je comprends bien), régler le /proc/sys/net/ipv4/conf/eth1.22/force_igmp_version sur 0 ne signifie pas que "use v3", mais le définit en fait sur "auto". Je pense que vous pouvez le définir sur 3 pour le forcer à utiliser igmp v3.

Cependant, vous devez également savoir que le comportement de la pile igmp est déterminé par l'environnement dans lequel il se trouve. Si votre machine Linux reçoit des requêtes d'appartenance à igmp v2 émanant d'un routeur igmp en amont, alors, je crois. que le comportement par défaut de Linux (tel que mandaté par la RFC igmp v3) consiste à utiliser uniquement igmp v2 pour les rapports.

Si je comprends bien, lorsque vous définissez /proc/sys/net/ipv4/conf/eth1.22/force_igmp_version sur 0, ce comportement est utilisé.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top