Pregunta

Pregunta:

Estoy probando una sección del software de detección de fallas de cables y me gustaría generar fallas de cable de manera confiable y reproducible en un cable cat5.

En este momento estoy usando un metro de longitud de cable sin trenzar y muevo el cable manualmente junto a una fuente de alimentación, pero no puedo detectar ninguna falla en la aplicación (estoy leyendo los contadores de fallas de Ethernet del ASIC de Ethernet .) Si esto se debe a que no se generan fallas, o porque la detección de software / hardware es defectuosa, no puedo decirlo.

¿Hay alguna forma de hacer esto en el software?

Me conformaría con escribir algo en un lenguaje de nivel superior, como Java o Python, y como último recurso estaría dispuesto a ponerlo junto en C, pero realmente prefiero no volver a escribir un controlador Ethernet puramente para corregir un posible error.

[EDITAR]: quiero crear fallas de cable, no detectarlas.

[EDITAR]: He transferido archivos grandes a través de FTP y SCP sin problemas con el cable manipulado, y no veo ningún error al inspeccionar el tráfico con Wireshark

[EDITAR]: Consulte también pregunta similar en Python .

Solución:

Bueno, después de pasar más de un día peleando con C, esta es la solución de Python.

Primero deshabilite la suma de verificación automática de la tarjeta ethernet:

sudo ethtool -K eth1 tx off

Luego, envíe su marco dudoso desde 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)

Quién dijo que tenía que ser complicado ...

PD: Me encanta Python.

¿Fue útil?

Solución

Si está trabajando en C, puede enviar una trama Ethernet sin procesar utilizando socket(AF_PACKET, SOCK_RAW, ...) y pasarle un puntero a un búfer sin procesar que haya generado usted mismo (por ejemplo, siguiendo el diseño de la trama en wikipedia ).

Ha pasado mucho tiempo desde que hice esto, así que no intentaré escribir un fragmento de código representativo ...

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top