python networking automated-tests ethernet

python - ¿Cómo se envía un marco de Ethernet con un FCS corrupto?



networking automated-tests (4)

No estoy seguro de si esto es posible, ya que esto podría manejarse en hardware, pero necesito enviar algunas tramas Ethernet con errores en ellas. Me gustaría poder crear runts, jabber, desalineación y errores FCS incorrectos. Estoy trabajando en Python.


El programa no funcionó según lo previsto para generar errores de FCS.

El controlador de red agregó la suma de comprobación correcta al final del marco generado de nuevo. Por supuesto, es bastante posible que la solución funcione para algunas tarjetas, pero estoy seguro que no con ninguna de Intel. (También funciona sin ningún cambio de ethtool para mí).

Con al menos una tarjeta de red Intel e1000e necesita un pequeño cambio al código anterior: agregue la siguiente línea después de "s = socket (AF_PACKET, SOCK_RAW)":

s.setsockopt(SOL_SOCKET,43,1)

Esto le indica al controlador NIC que use la opción "SO_NOFCS" definida en socket.h y envíe el marco sin calcular ni agregar el FCS.

Puede que también le interese el siguiente C-programme, que sí me mostró cómo hacerlo: http://markmail.org/thread/eoquixklsjgvvaom

Pero tenga en cuenta que el programa no funcionará en kernels recientes sin un pequeño cambio. El SOL_SOCKET parece haber cambiado la ID numérica de 42 a 43 en algún momento del pasado.

Según el autor original, la función debería estar disponible para al menos los siguientes controladores: e100, e1000 y e1000e. Un rápido grep en las fuentes del kernel de 3.16.0 indica que ixgbe igb e i40e también deberían funcionar. Si no está utilizando ninguna de estas tarjetas, esta opción de socket probablemente no estará disponible.


Primero, deshabilita la suma de comprobación de su tarjeta ethernet:

sudo ethtool -K eth1 tx off

Luego, envía los marcos corruptos de 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)

Ver una pregunta similar