Frage

Wir haben in ein heikles Problem laufen. Wir schreiben ein c ++ Programm, das Multicast-UDP-Datenverkehr empfängt. Wir sind dabei, unsere Anwendungen zu einer anderen Netzwerkumgebung zu bewegen und unser Betriebsteam hat darum gebeten, dass wir IGMPv3- Mitgliedschaft Ankündigungen von unseren Anwendungen unterstützen. Erste Untersuchungen zeigen, dass Linux 2.6-Kernel IGMPv3- unterstützen. Deshalb bin ich verwirrt, dass, wenn wir tcpdump laufen wir folgende Ausgangs Spuren zu sehen:

[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

Mein Verständnis ist, dass man den Kernel zwingen könnte, eine niedrigere Version von IGMP zu verwenden, indem Sie einen Wert ungleich Null in der Datei /proc/sys/net/ipv4/conf/eth1.22/force_igmp_version angibt; aber ich habe bestätigt, dass die Datei einen Nullwert Konfiguration hat.

Unsere Anwendung wird mit dem folgenden Code, um die Multicast-Gruppe beizutreten:

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

Gibt es etwas Besonderes, dass wir im Quellprogramm enthalten müssen IGMPv3- zwingen?

War es hilfreich?

Lösung

Ein paar Dinge zu beachten.

Die erste ist, dass (wie ich es verstehe) die /proc/sys/net/ipv4/conf/eth1.22/force_igmp_version auf 0 gesetzt wird, bedeutet nicht, „Verwendung v3“, aber eigentlich setzt es auf „auto“. Ich glaube, dass Sie es auf 3 einstellen können, dass er IGMP v3 verwenden zu erzwingen.

Um jedoch die andere Sache bewusst ist, dass das Verhalten des IGMP-Stack von der Umgebung bestimmt wird, dass es findet sich in. Wenn Ihr Linux-Box ist IGMP v2 Mitgliedschaft Abfragen von einem Upstream-IGMP-Router empfängt, dann glaube ich, dass das Standard-linux-Verhalten (wie von dem IGMP v3 rfc beauftragt) ist nur IGMP v2 für Berichte zu verwenden.

Wie ich es verstehe, wenn Sie /proc/sys/net/ipv4/conf/eth1.22/force_igmp_version auf 0 nutzt dieses Verhalten gesetzt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top