如何使用损坏的FCS发送以太网帧?

时间:2009-04-06 23:30:17

标签: python networking automated-tests ethernet

我不确定这是否可能,因为这可能是在硬件中处理的,但我需要发送一些有错误的以太网帧。我希望能够创建runts,jabber,misalignment和错误的FCS错误。我在Python工作。

4 个答案:

答案 0 :(得分:9)

可以在硬件中处理,但并非总是如此 - 即使它是,你也可以关闭它;请参阅ethtool卸载参数。

关于完全控制您创建的帧 - 请查看PF_PACKET(针对一种方法)或the tap driver(针对其他方法)。

这是关于using PF_PACKET to send hand-crafted frames from Python的文章。

答案 1 :(得分:4)

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

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)

请参阅A similar question

答案 2 :(得分:3)

尝试使用scapy for python,有一些例子可以生成巨型帧,也可以使用runt帧。 http://www.dirk-loss.de/scapy-doc/usage.html

答案 3 :(得分:2)

该程序无法按我的意图生成FCS错误。

网络驱动程序再次在生成的帧的末尾添加了正确的校验和。当然,解决方案很可能适用于某些卡,但我确定不会使用任何来自英​​特尔的卡。 (它也适用于我没有任何ethtool更改。)

至少使用Intel e1000e网卡,您需要对上面的代码进行一些小改动: 在“s = socket(AF_PACKET,SOCK_RAW)”之后添加以下行:

s.setsockopt(SOL_SOCKET,43,1)

这告诉NIC驱动程序使用socket.h中定义的“SO_NOFCS”选项,并在不计算和添加FCS的情况下发送帧。

您可能也对以下C-programm感兴趣,它确实告诉我如何操作:http://markmail.org/thread/eoquixklsjgvvaom

但请注意,如果没有一点小改动,该程序将无法在最近的内核上运行。 SOL_SOCKET似乎在过去的某个时间将数字ID从42更改为43。

根据原作者的说法,该功能至少应该适用于以下驱动程序:e100,e1000和e1000e。 3.16.0的内核源代码中的快速grep表明ixgbe igb和i40e也应该工作。如果您没有使用任何这些卡,则可能无法使用此套接字选项。