2011-06-13 40 views
14

问题:

我正在测试一个电缆故障查找软件的一个部分,并且我想要可靠且可重复地在cat5电缆上生成电缆故障。我正在使用一米长度的无捻电缆,并在电源旁边手动扭动电缆,但我无法检测到应用程序中的任何故障(我正在从以太网中读取以太网故障计数器ASIC)。不管这是因为没有产生故障,还是因为软件/硬件检测有问题,我都不知道。如何在软件中可靠地生成以太网帧错误?

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

我决定写一些更高级的语言,比如Java或者python,并且作为最后的手段会愿意把它放到C中,但我真的不想重写一个以太网驱动程序纯粹是为了修复一个可能的错误。

[编辑]:我想创建电缆故障 - 没有检测到它们。

[编辑]:我已经传送通过FTP和SCP大文件,而与篡改的电缆问题,我没有看到错误上来,同时检查交通使用Wireshark

[编辑]:另请参阅similar question in python

解决方法:

好了,花费超过一天使用C战斗后,这是Python的解决方案。以太网卡的

首先禁用自动校验:

sudo ethtool -K eth1 tx off 

然后,从蟒蛇把你的躲闪框架:

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

+0

你们是不是要检测你的软件如何响应不正确的数据包?或者,你的软件不能识别这种格式不正确的数据包,以及它们的原因是什么? – 2011-06-13 11:17:17

+1

推测“故障检测器”正在执行基于校验和的检查。如果您准备生成您自己的以太网帧,那么您可能会注入错误的校验和? – 2011-06-13 11:17:31

+1

@Oli - 是的,你说得对。这只是基于校验和的检查。你有任何能让我把自己的以太网帧组合在一起的软件吗? – brice 2011-06-13 11:28:06

回答

6

如果你在C工作,您可以发送使用socket(AF_PACKET, SOCK_RAW, ...)原始以太网帧,并(在wikipedia例如,通过下面的框架布局)传递一个指针,你自己产生原始缓冲区。

这是一个很长的时间,因为我已经做到了这一点,所以我不打算尝试写一个代表性的代码片段...

+0

或者,你可以在Python中完成... – brice 2011-06-16 15:49:29