Ethernet-Schnittstelle unter Linux verwirft Pakete
Ich versuche einige Ethernet-Frames mit Linux zu erfassen. Einige dieser Pakete / Frames sind ungültig und enthalten beschädigte Daten.
Ein Ethernet-Frame enthält zum Beispiel den Typ 0x0800 (IPv4), die folgenden Daten enthalten jedoch nur zufällige Bytes. Außerdem sind Quell- und Ziel-MAC unbekannt und nicht vorhersagbar.
Um diese Frames zu erhalten, habe ich ein C-Programm geschrieben, das zuerst Raw-Sockets verwendete. Dies funktionierte nicht wie erwartet, also wechselte ich zu libpcap.
Ich öffne das Ethernet-Gerät im Promiscuous-Modus, um alle Frames zu empfangen und MAC-seitiges Filtern zu verhindern. Das funktioniert gut. Ich kann Frames mit jeder Ziel-MAC-Adresse empfangen.
Nun kommen wir zum großen Problem:
Ich sende einen Ethernet-Frame mit zufälligem Ziel und Quell-MAC. Das Type-Feld ist 0x1234 und die Daten sind nur wenige Bytes, sagen wir 0xdeadbeef. Dies wird auf die minimale Nutzlast aufgefüllt. Dieser Frame wird von meinem Programm mit libpcap gut empfangen.
Wenn ich denselben Frame mit einem "bekannten" Ethernet-Feldwert wie 0x0800 sende, wird der Frame gelöscht und mein Programm kann ihn nicht empfangen.
Die Software läuft auf einer Embedded-Plattform, einem Altera Cyclone V-SoC mit einem STMMAC-Ethernet-Modul. Auf einem normalen PC / Notebook usw. läuft das Programm einwandfrei und kann sogar diese ungültigen IPv4-Frames empfangen.
Um herauszufinden, wo die Pakete abgelegt werden, habe ich mir die /sy/class/net/eth0/statistics/rx_*
Dateien angesehen. Es gibt Dateien, die die Anzahl der empfangenen Pakete und Bytes sowie die Anzahl der verworfenen Pakete zählen. Diese Statistiken funktionieren gut mit normalem Ethernet-Verkehr. Das Senden eines ungültigen Frames wie oben beschrieben führt jedoch nicht zu einer Änderung der Statistiken. Der Treiber zählt nicht einmal den Zähler für "Droped Frames" auf. Ich kann das nicht verstehen, denn soweit ich weiß, wird die Statistik der Netzwerkschnittstelle beeinflusst, sobald ein Paket von der Hardware empfangen wird. Der Filterungs- und Auswertungsprozess des Netzwerkstacks sollte nichts damit zu tun haben. Habe ich recht? Daher scheint mir, dass ein sehr niedriger Treibercode diese Pakete oder vielleicht sogar die Hardware selbst filtert.
Nochmals: Mit einem normalen PC auf der anderen Seite können die Pakete mit dem Programm, das ich geschrieben habe, empfangen werden.
Das zweite Problem betrifft gültige TCP-Pakete:
Obwohl ich libpcap verwende, das rohen Datenverkehr für mich bereitstellt, werden empfangene TCP-Pakete zu großen Paketen zusammengefügt, die sogar noch größer sind als die MTU der empfangenden Netzwerkschnittstelle. Diese Pakete werden normalerweise auch mit einem PC empfangen.
Kann mir jemand helfen? Ich muss rohen Ethernet-Verkehr "so wie er ist" unter Verwendung von Linux auf der Altera SoC-FPGA-Plattform empfangen.
0 Antworten auf die Frage
Verwandte Probleme
-
9
Was ist der Unterschied zwischen den Befehlen "su -s" und "sudo -s"?
-
4
Gutes freies Ubuntu Server-VMWare-Image benötigt
-
4
Was sind die Unterschiede zwischen den großen Linux-Distributionen? Werde ich es merken
-
2
Begrenzung der CPU-Auslastung für Flash in Firefox?
-
2
Wie kann ich mein Mikrofon unter Debian GNOME zum Laufen bringen?
-
2
Conky-Setups - Beispiele / Ideen?
-
3
Was sind die Unterschiede zwischen Linux Window Managern?
-
2
ThunderBird / Lichtsynchronisation mit SE k770i
-
4
Linux-Dateisystem
-
6
Vollbild-Flash langsam in KDE 4