Forum: PC Hard- und Software Ethernet Frames mit fehlerhafter Prüfsumme erzeugen


von Thomas W. (thomas_v2)


Lesenswert?

Hallo,

ich möchte zur Fehlerdiagnose an einem Netzwerkgerät über SNMP die 
Fehlerzähler der Netzwerkschnittstelle (ifInErrors) abfragen. Ich wollte 
die Funktionalität vorab einmal testen, und dementsprechend 
Ethernet-Frames mit fehlerhafter Prüfsumme generieren.

Das sollte unter Linux anscheinend so funktionieren:

https://stackoverflow.com/questions/6329583/how-to-reliably-generate-ethernet-frame-errors-in-software

Ich nutze einen Raspberry Pi 4 zum Testen. Über:
sudo ethtool -K eth0 tx off
kann ich das tx-checksumming angeblich auch erfolgreich deaktivieren. 
Die Mac-Adressen habe ich im Code entsprechend angepasst. Wenn ich die 
Frames absende, bleint der ifInErrors Zähler bei der Gegenstelle jedoch 
konstant auf 0. Der Wert von fInUnknownProtos aber beispielsweise zeigt 
aber schon entsprechende Werte und zählt entsprechend der Anzahl der von 
mir abgeschickten Frames hoch, d.h. es wird von der Gegenstelle schon 
erkannt, dass dort etwas nicht sinnvolles eingetroffen ist.

Ich habe leider keinen richtigen TAP zur Verfügung, um zu prüfen ob dort 
wirklich die fehlerhafte Prüfsumme abgeschickt wird und nicht doch die 
korrekte von der Hardware eingesetzt wird, oder ob der ifInError Zähler 
der Gegenstelle nicht wie von mir erwartet funktioniert. Andere über 
SNMP abfragbare Werte wie ifInDiscards die auf einen Fehler hindeuten 
könnten, bleiben auch konstant auf 0.

Hat jemand Erfahrungen damit, ob das a) mit dem Deaktivieren des 
checksumming zuverlässig funktioniert, oder b) ob die über SNMP 
abfragbaren Error-Counter sinnvolle Werte zeigen?

von Hmmm (hmmm)


Lesenswert?

Thomas W. schrieb:
> Wenn ich die
> Frames absende, bleint der ifInErrors Zähler bei der Gegenstelle jedoch
> konstant auf 0.

Hast Du bei der Gegenstelle das RX-Checksum-Offloading abgeschaltet?

von Thomas W. (thomas_v2)


Lesenswert?

Hmmm schrieb:
> Hast Du bei der Gegenstelle das RX-Checksum-Offloading abgeschaltet?

Meine "Gegenstelle" ist aktuell eine Siemens SPS (mit integriertem 
3-Port Switch), wo ich nichts dahingehend anpassen kann. Später wird es 
ein managebarer Switch sein dessen Ports ich so abfragen möchte, und 
zusätzlich auch die Ports der SPS.
Nach meinem Verständnis verwirft ein Switch Pakete mit falscher 
Prüfsumme direkt, ohne sie weiterzuleiten. Und dann sollte der 
Error-Counter hochzählen.

In Wireshark bekomme ich im Normalfall die Ethernet FCS nicht zu sehen. 
Bei meinem Test auf dem Raspberry sehe ich in Wireshark zwar die 
angeblichen 4 Bytes falscher Checksumme, aber ich weiß eben nicht, ob 
nicht die Hardware doch noch die korrekte Prüfsumme anhängt und somit 
für die Gegenstelle alles in Ordnung aussieht.

In der MIB steht zu ifInErrors:

"For packet-oriented interfaces, the number of inbound
packets that contained errors preventing them from being
deliverable to a higher-layer protocol.  For character-
oriented or fixed-length interfaces, the number of inbound
transmission units that contained errors preventing them
from being deliverable to a higher-layer protocol."

von Hmmm (hmmm)


Lesenswert?

Thomas W. schrieb:
> Meine "Gegenstelle" ist aktuell eine Siemens SPS (mit integriertem
> 3-Port Switch), wo ich nichts dahingehend anpassen kann.

Also kann sowohl der Switch-Baustein als auch der Ethernet-Controller 
der SPS (sofern er Checksum-Offloading beherrscht und es genutzt wird) 
verhindern, dass die SPS das Paket überhaupt sieht.

Wie verhält sich der Zähler, wenn Du korrekte Ethernet-Frames, aber 
falsche IP-Header-Checksums verwendest?

Thomas W. schrieb:
> ich weiß eben nicht, ob
> nicht die Hardware doch noch die korrekte Prüfsumme anhängt

Vielleicht mal mit einer anderen Gegenstelle (z.B. weiterer RPi) testen?

von Thomas W. (thomas_v2)


Lesenswert?

Hmmm schrieb:
> Vielleicht mal mit einer anderen Gegenstelle (z.B. weiterer RPi) testen?

Ich habe mir die Frames an einen Windows PC über einen Router geschickt, 
und die Frames kommen fehlerfrei an. Ich kann sie unter Windows in 
Wireshark sehen, inkl. der eigentlich falschen 4 Null-Bytes FCS. Unter 
Windows lassen sich die verworfenen Frames mit netstat -e auch direkt 
abfragen.

Bedeutet für mich, dass im Raspberry das tx-checksumming doch noch aktiv 
ist, obwohl ethtool sagt es wäre off. Ist jetzt die Frage, ob das an der 
Netzwerkschnittstelle des Raspberry liegt, dass das Deaktivieren nicht 
funktioniert. Bzw. welche Voraussetzungen gegeben sein müssen 
(Hardware?), damit sich das auch wirklich deaktivieren lässt.

von Thomas W. (thomas_v2)


Lesenswert?

Hmmm schrieb:
> Wie verhält sich der Zähler, wenn Du korrekte Ethernet-Frames, aber
> falsche IP-Header-Checksums verwendest?

Habe ich nicht getestet, weil das Protokoll was hier zum Einsatz kommt 
und dessen Fehler ich analysieren möchte, auch kein IP verwendet 
(Profinet).
Zum An-/Abwählen der IP Checksum besitzt ethtool einen eigenen Parameter 
(tx-checksum-ip-generic).

von Foobar (asdfasd)


Lesenswert?

Die FCS ist Teil des Ethernetstandards.  Sie wird vom MAC automatisch 
generiert/überprüft (vergleichbar mit der Parity bei RS232, nur dass sie 
bei Ethernet Pflicht ist, gibt kein "n").

Bei kaum einem MAC kann man das für TX abschalten (gibt wohl ein paar 
von Intel die das "können").  Bei RX wird ein fahlerhaftes Paket 
weggeschmissen und ein Fehlerzähler erhöht.  Bei einigen kann man das 
umstellen, so dass auch kaputte Frames zur Anwendung weitergeleitet 
werden.  Kaputte Frames werden aber durch keinen Switch/Router 
durchkommen.

Was ethtool angeht: der schwindelt gerne mal ... (bzw der Kartentreiber 
und ethtool gibt das nur weiter).

Ich würde versuchen, das Signal wirklich zu stören.

Nachtrag: im Gegensatz zu den ganzen anderen Off-load Features ist die 
FCS-Behandlung bei allen MACs (in Hardware) vorhanden.

: Bearbeitet durch User
von Thomas W. (thomas_v2)


Lesenswert?

Foobar schrieb:

> Was ethtool angeht: der schwindelt gerne mal ... (bzw der Kartentreiber
> und ethtool gibt das nur weiter).

Ist das denn nicht ein Bug der zu melden wäre, wenn es nur in 
Ausnahmefällen überhaupt funktioniert? Es gibt einige Artikel zu 
ethtool, die Optionen werden erläutert, aber nicht, dass das nur in 
Ausnahmefällen funktioniert, auch wenn die Funktion Erfolg zurückmeldet.

> Ich würde versuchen, das Signal wirklich zu stören.

Erfahrungen damit? Das müsste dann ja wirklich nur 2-3 Bits kippen 
lassen, d.h. Störung von ein paar 100 ns bei 100 MBit/s Ethernet. Schirm 
öffnen, ent-twisten, und dann mit irgendwas stören. Möglichst ohne 
großen Elektronikaufwand.

von Frank E. (Firma: Q3) (qualidat)


Lesenswert?

Ich glaube, da musst du noch mindestens eine Ebene tiefer gehen.

Es gab vor Jahren mal ein AVR-Projekt, wo jemand UDP-Messages 
buchstäblich "zu Fuß" zusammensetzt und sendet. Dort hättest du jede 
Gelegenheit, falsche Prüfsummen zu produzieren. Guck' mal hier:

https://www.modding.kh.ua/a/IgorPlug-UDP%20(AVR)_eng.htm

von Mario M. (thelonging)


Lesenswert?

Wenn offloading abgeschaltet wird, kann der Treiber die Prüfsumme selbst 
berechnen.
https://stackoverflow.com/questions/723635/how-do-you-send-an-ethernet-frame-with-a-corrupt-fcs

von Foobar (asdfasd)


Lesenswert?

>> Ich würde versuchen, das Signal wirklich zu stören.
>
> Erfahrungen damit?

Nein.  Könntest mit nem langen Kabel anfangen ;-)

Mir fällt gerade noch ein, dass man es evtl hierrüber provozieren 
könnte:
  https://en.wikipedia.org/wiki/Duplex_mismatch

Damit solltest du zumindest deine Fehlerzähler checken können.

von Thomas W. (thomas_v2)


Lesenswert?

Foobar schrieb:
> Mir fällt gerade noch ein, dass man es evtl hierrüber provozieren
> könnte:
>   https://en.wikipedia.org/wiki/Duplex_mismatch
>
> Damit solltest du zumindest deine Fehlerzähler checken können.

Das ist interessant, danke. Das ist gerade im industriellen Umfeld wo 
teils sehr exotische und alte Geräte unterwegs sind, auch durchaus eine 
mögliche Fehlerquelle. Und vor allem eine die überhaupt nicht auffällt, 
und man sucht nach Kabeldefekten oder dergleichen. Schreibe ich mir auf 
jeden Fall mit auf die Checkliste.

Fehlerzähler zählt auf jeden Fall, nach 10 Minuten ifInErrors auf 40 
sowie ifOutErrors auf 5.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.