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.

È stato utile?

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 ...

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top