17

问题:

我正在测试一段电缆故障查找软件,我想可靠且可重复地在 cat5 电缆上生成电缆故障。

目前我正在使用一米长的未绞合电缆,并在电源旁边手动扭动电缆,但我无法检测到应用程序中的任何故障(我正在从以太网 ASIC 读取以太网故障计数器。)这是因为没有产生故障,或者是因为软件/硬件检测有故障,我无法判断。

有没有办法在软件中做到这一点?

我会满足于用更高级别的语言编写一些东西,比如 Java 或 python,作为最后的手段,我愿意用 C 把它放在一起,但我真的不想纯粹为了修复一个以太网驱动程序而重新编写一个以太网驱动程序。可能的错误。

[编辑]:我想制造电缆故障 - 不检测它们。

[编辑]:我已经通过 FTP 和 SCP 传输大文件,而修改后的电缆没有问题,并且在使用 Wireshark 检查流量时没有发现任何错误

[编辑]:另见python 中的类似问题

解决方案:

好吧,在与 C 打了一天多之后,这就是 python 解决方案。

首先禁用以太网卡的自动校验和:

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。

4

1 回答 1

7

如果您使用 C 语言工作,您可以使用 发送原始以太网帧socket(AF_PACKET, SOCK_RAW, ...),并将指针传递给您自己生成的原始缓冲区(例如,按照wikipedia上的帧布局)。

自从我这样做以来已经很长时间了,所以我不会尝试编写具有代表性的代码片段......

于 2011-06-13T11:51:33.317 回答