2009-04-06 11 views
7

Non sono sicuro che sia possibile anche perché potrebbe essere gestito nell'hardware, ma ho bisogno di inviare alcuni frame Ethernet con errori. Mi piacerebbe essere in grado di creare rottami, jabber, disallineamento e errori FCS errati. Sto lavorando in Python.Come si invia un frame Ethernet con un FCS corrotto?

risposta

4

In primo luogo, si disattiva checksum della scheda ethernet:

sudo ethtool -K eth1 tx off 

Poi, si inviano i fotogrammi corrotti in pitone:

#!/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) 

Vedi A similar question

1

Il programma non ha funzionato come previsto per generare errori FCS.

Il driver di rete ha aggiunto nuovamente il checksum corretto alla fine del frame generato. Naturalmente è abbastanza probabile che la soluzione stia funzionando per alcune carte, ma sono sicuro che non con Intel. (Funziona anche senza modifiche ethtool per me.)

Con almeno una scheda di rete Intel e1000e è necessaria una piccola modifica al codice sopra: Aggiungere la seguente riga dopo "s = socket (AF_PACKET, SOCK_RAW)" :

s.setsockopt(SOL_SOCKET,43,1) 

Questa dire al driver NIC per utilizzare l'opzione "SO_NOFCS" definito nella socket.h e inviare il telaio senza calcolare e aggiungere il FCS.

Potresti essere interessato al seguente C-programma, che ha Mostrami come farlo: http://markmail.org/thread/eoquixklsjgvvaom

ma essere consapevoli che il programma non funzionerà sui recenti kernel senza un piccolo cambiamento. Il SOL_SOCKET sembra aver cambiato l'ID numerico da 42 a 43 in qualche momento nel passato.

Secondo l'autore originale, la funzionalità dovrebbe essere disponibile per almeno i seguenti driver: e100, e1000 e e1000e. Un rapido grep nelle sorgenti del kernel di 3.16.0 indica che anche ixgbe igb e i40e dovrebbero funzionare. Se non si utilizza alcuna di queste schede, questa opzione del socket probabilmente non sarà disponibile.

Problemi correlati