Come generare in modo affidabile errori di frame Ethernet nel software?
-
27-10-2019 - |
Domanda
Domanda:
Sto testando una sezione del software per la ricerca di guasti nei cavi e vorrei generare in modo affidabile e riproducibile guasti sui cavi su un cavo cat5.
Al momento sto utilizzando un metro di cavo non attorcigliato e agito manualmente il cavo accanto a un alimentatore, ma non riesco a rilevare alcun guasto nell'applicazione (sto leggendo i contatori dei guasti Ethernet dall'ASIC Ethernet .) Non posso dirlo se ciò è dovuto al fatto che non vengono generati errori o perché il rilevamento software / hardware è difettoso.
C'è un modo per farlo nel software?
Mi accontenterei di scrivere qualcosa in un linguaggio di livello superiore, come Java o python, e come ultima risorsa sarei disposto a metterlo insieme in C, ma preferirei davvero non riscrivere un driver Ethernet puramente per correggere un possibile bug.
[MODIFICA]: voglio creare guasti ai cavi, non rilevarli.
[MODIFICA]: ho trasferito file di grandi dimensioni tramite FTP e SCP senza problemi con il cavo modificato e non vedo errori durante l'ispezione del traffico con WireShark
[MODIFICA]: Vedi anche un domanda simile in python .
Soluzione:
Bene, dopo aver passato più di una giornata a combattere con C, questa è la soluzione Python.
Per prima cosa disabilita il checksum automatico della scheda ethernet:
sudo ethtool -K eth1 tx off
Quindi, invia il tuo frame losco da 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)
Chi ha detto che doveva essere complicato ...
PS: Amo Python.
Soluzione
Se stai lavorando in C, puoi inviare un frame Ethernet non elaborato utilizzando socket(AF_PACKET, SOCK_RAW, ...)
e passandogli un puntatore a un buffer non elaborato che hai generato tu stesso (ad es. seguendo il layout del frame in wikipedia ).
È passato molto tempo dall'ultima volta che l'ho fatto, quindi non cercherò di scrivere uno snippet di codice rappresentativo ...