Frage

Frage:

Ich teste einen Abschnitt der Software zur Suche nach Kabelfehlern und möchte zuverlässig und reproduzierbar Kabelfehler auf einem Cat5-Kabel erzeugen.

Im Moment verwende ich ein Meter langes, nicht verdrilltes Kabel und wickle das Kabel manuell neben einem Netzteil, kann jedoch keine Fehler in der Anwendung erkennen (ich lese die Ethernet-Fehlerzähler vom Ethernet-ASIC .) Ob dies daran liegt, dass keine Fehler generiert werden oder dass die Software- / Hardwareerkennung fehlerhaft ist, kann ich nicht sagen.

Gibt es eine Möglichkeit, dies in Software zu tun?

Ich würde mich damit zufrieden geben, etwas in einer höheren Sprache wie Java oder Python zu schreiben, und als letztes Mittel wäre ich bereit, es in C zusammenzustellen, aber ich würde wirklich lieber keinen reinen Ethernet-Treiber neu schreiben um einen möglichen Fehler zu beheben.

[BEARBEITEN]: Ich möchte Kabelfehler erstellen - nicht erkennen.

[BEARBEITEN]: Ich habe große Dateien ohne Probleme mit dem behandelten Kabel über FTP und SCP übertragen und sehe keine Fehler bei der Überprüfung des Datenverkehrs mit Wireshark

[BEARBEITEN]: Siehe auch ähnliche Frage in Python .

Lösung:

Nun, nachdem Sie über einen Tag mit C gekämpft haben, ist dies die Python-Lösung.

Deaktivieren Sie zuerst die automatische Prüfsumme der Ethernet-Karte:

sudo ethtool -K eth1 tx off

Dann senden Sie Ihren zwielichtigen Frame von Python:

#!/usr/bin/env python

from socket import *

#
# Ethernet Frame:
# [
#   [ Destination address, 6 bytes ]
#   [ Source address, 6 bytes      ]
#   [ Ethertype, 2 bytes           ]
#   [ Payload, 40 to 1500 bytes    ]
#   [ 32 bit CRC chcksum, 4 bytes  ]
# ]
#

s = socket(AF_PACKET, SOCK_RAW)
s.bind(("eth1", 0))
src_addr = "\x01\x02\x03\x04\x05\x06"
dst_addr = "\x01\x02\x03\x04\x05\x06"
payload = ("["*30)+"PAYLOAD"+("]"*30)
checksum = "\x00\x00\x00\x00"
ethertype = "\x08\x01"
s.send(dst_addr+src_addr+ethertype+payload+checksum)

Wer hat gesagt, dass es kompliziert sein muss ...

PS: Ich liebe Python.

War es hilfreich?

Lösung

Wenn Sie in C arbeiten, können Sie einen unformatierten Ethernet-Frame mit socket(AF_PACKET, SOCK_RAW, ...) senden und ihm einen Zeiger auf einen rohen Puffer übergeben, den Sie selbst generiert haben (z. B. indem Sie dem Frame-Layout unter wikipedia ).

Es ist lange her, dass ich das getan habe, also werde ich nicht versuchen, ein repräsentatives Code-Snippet zu schreiben ...

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