Подтвердить что ты не робот

Как надежно генерировать ошибки фрейма Ethernet в программном обеспечении?

Вопрос:

Я тестирую раздел программного обеспечения для поиска неисправностей кабеля, и я хотел бы надежно и воспроизводимо генерировать ошибки кабеля на кабеле cat5.

В настоящий момент я использую длину раскрученного кабеля метра и извиняю кабель вручную рядом с источником питания, но я не могу обнаружить какие-либо ошибки в приложении (я читаю счетчики сбоев Ethernet с Ethernet ASIC.) Является ли это тем, что никаких сбоев не генерируется или из-за неисправности программного обеспечения/аппаратного обеспечения я не могу сказать.

Есть ли способ сделать это в программном обеспечении?

Я бы согласился написать что-то на языке более высокого уровня, например Java или python, и, как последнее средство, вы захотите собрать его на C, но я бы предпочел не переписывать драйвер Ethernet исключительно чтобы исправить возможную ошибку.

[EDIT]: Я хочу создать ошибки кабеля - не обнаруживать их.

[EDIT]: Я передал большие файлы через FTP и SCP без проблем с укомплектованным кабелем, и я не вижу ошибок при проверке трафика с помощью wirehark

[EDIT]: См. также аналогичный вопрос в python.

Решение:

Хорошо, потратив на день борьбу с C, это решение python.

Сначала отключите автоматическую проверку карты Ethernet:

sudo ethtool -K eth1 tx off

Затем отправьте свой изворотливый фрейм из 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)

Кто сказал, что это должно быть сложно...

PS: Я люблю Python.

4b9b3361

Ответ 1

Если вы работаете на C, вы можете отправить необработанный Ethernet-фрейм с помощью socket(AF_PACKET, SOCK_RAW, ...) и передать ему указатель на необработанный буфер, который вы создали самостоятельно (например, следуя схеме кадра в wikipedia).

Прошло много времени с тех пор, как я это сделал, поэтому я не собираюсь писать репрезентативный фрагмент кода...