2009-08-12 14 views
4

Dies ist eine etwas obskure Frage, aber ich bin ratlos und ich dachte, dass vielleicht jemand da draußen mehr Ahnung von dem Problem haben könnte.Link-Scope IPv6 Multicast-Pakete plötzlich nicht routbar auf einem MacBook Pro?

Mein Kollege hat mehrere Monate lang erfolgreich eine interne Anwendung ausgeführt, die IPv6-Multicasting auf seinem MacBook Pro verwendet. Heute entschied sich der Mac jedoch dafür, die Multicast-Pakete nicht mehr zu routen. Insbesondere druckt das Programm folgenden Fehler:

SendDataUDP (ff02 :: bead: cede: text: feed @ 4) fehlgeschlagen auf Netzwerkschnittstelle [Name = [en0] Beschreibung = [] IP = [fe80 :: 222: 41ff: fe21: dfd4 @ 4] Netzmaske = [ffff: ffff: ffff: ffff ::] Broadcast = [::]] (errno = 65/Keine Route zum Host).

... was ziemlich gut beschreibt, was schief gelaufen ist ... es versucht zu senden() ein UDP-Paket an die angezeigte IP-Adresse, und send() fehlgeschlagen mit errno = EHOSTUNREACH.

Was ich nicht verstehe ist, was könnte möglicherweise eine IPv6 Link-Scope-Multicast-Adresse "unerreichbar" zu sein? Wenn mein Verständnis von Link-Scope-Multicast korrekt ist, muss das Paket nur den lokalen Ethernet-Port verlassen (en0 in diesem Fall, der auf dem Rechner läuft).

Gibt es einen Aspekt zum Multicasting, den ich vermisse, oder ist seine Maschine gerade geborsten? Er sagt, dass er nichts geändert hat, es hat auf mysteriöse Weise aufgehört zu arbeiten.

+0

Hmm. Können Sie ein minimales Codebeispiel posten? Ich werde es auf meinem Mac testen und sehen, ob ich es hier reproduzieren/debuggen kann. –

Antwort

2

Es könnte helfen, die kernel source zu betrachten. (Insbesondere der Egress-IPv6-Paket-Egress-Pfad, ip6_output.c) Während Sie dort sind, können Sie sich auch die vorgelagerten Socket-Aufrufe ansehen, usw.

Für Multicast, vorausgesetzt, Sie sind Wenn man es auf stellt, sieht es so aus, als ob der einzige mögliche Weg, um diesen Fehler zu bekommen, darin besteht, die Schnittstelle nicht anzugeben, auf die gesendet werden soll. (was ungerade ist, da Ihre Fehlermeldung explizit die Schnittstelle erwähnt)

Ist es möglich, dass die drahtlose Schnittstelle auf diesem MacBook aktiviert wurde, als es vorher war, und jetzt die Idee eines "Link-local" Multicast ist mehrdeutig? Spezifizieren Sie die Schnittstelle explizit, wenn Sie den Socket verwenden? Das @ 4 am Ende der Adresse sieht für mich seltsam aus. (Ist das ein Schnittstellenindex?) Die Konvention lautet normalerweise, % für eine Interface-Bereichs-ID zu verwenden, aber wie in der vorherigen Antwort und ihren Kommentaren erwähnt, wird sie nicht universell unterstützt.

+2

Wir haben das Problem hier endlich herausgefunden ... Unter MacOS/X reicht es zumindest nicht aus, den Schnittstellenindex in die Zieladresse des sendto() - Aufrufs zu setzen. Das Betriebssystem kann und wählt manchmal seinen eigenen zu verwendenden Schnittstellenindex, ignoriert den mitgelieferten und verursacht Probleme.Der Workaround besteht darin, setsockopt (fd, IPPROTO_IPV6, IPV6_MULTICAST_IF, & myIdx, sizeof (myIdx)) bei Bedarf anstelle des Socket() -Adressenarguments (oder zusätzlich dazu) im socket-Adressargument anzugeben. Ich bin mir nicht sicher, ob das ein Fehler oder ein "Feature" ist ... –

2

Um zu testen, ob en0 noch in der Lage ist link-lokale Multicast-Anfragen zu übertragen, versuchen

ping6 ff02::1%en0 

alle Hosts Dieser Kontakte, so dass Sie genügend Antworten erhalten sollten (für Spaß, versuchen -w hinzufügen).

+1

lustig, das hat nicht funktioniert, ich musste die '-I' Option verwenden, um die Ethernet-Adresse zu ping6 angeben. JDKs-MBP: ~ jeffk $ ping6 FF02 :: 1% en0 ping6: UDP Verbindung: Keine Route JDKs-MBP Gastgeber: ~ jeffk $ ping6 -I en0 FF02 :: 1 ping6 (56 = 40 + 8 + 8 Bytes) fe80 :: 21f: f3ff: fed8: 3680% en0 -> ff02 :: 1 16 Bytes von fe80 :: 21f: f3ff: fed8: 3680% en0, icmp_seq = 0 hlim = 64 mal = 0.131 ms – jdkoftinoff