如何在软件中可靠地生成以太网帧错误?

bri*_*ice 16 c python networking ethernet raw-ethernet

题:

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

目前我正在使用一米长的无线电缆,并在电源旁边手动蠕动电缆,但我无法检测到应用中的任何故障(我正在读取以太网ASIC上的以太网故障计数器.)是否这是因为没有产生故障,或者因为软件/硬件检测有问题,我无法分辨.

有没有办法在软件中执行此操作?

我决定用更高级别的语言编写一些东西,比如Java或python,并且作为最后的手段愿意将它放在C中,但我真的不想重写以太网驱动程序纯粹是为了修复可能的错误.

[编辑]:我想创建电缆故障 - 不检测它们.

[编辑]:我通过FTP和SCP传输大文件而没有使用篡改电缆的问题,我发现在使用wireshark检查流量时没有出现错误

[编辑]:请参阅python中类似问题.

解:

好吧,花了一天时间与C战斗后,这就是python解决方案.

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

sudo ethtool -K eth1 tx off
Run Code Online (Sandbox Code Playgroud)

然后,从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)
Run Code Online (Sandbox Code Playgroud)

谁说它必须复杂......

PS:我喜欢Python.

Oli*_*rth 7

如果你在C中工作,你可以使用原始以太网帧发送socket(AF_PACKET, SOCK_RAW, ...),并将指针传递给你自己生成的原始缓冲区(例如,通过遵循维基百科的帧布局).

我做完这个已经有很长一段时间了,所以我不会尝试编写代表性的代码片段......