簡體   English   中英

如何使用損壞的FCS發送以太網幀?

[英]How do you send an Ethernet frame with a corrupt FCS?

我不確定這是否可能,因為這可能是在硬件中處理的,但我需要發送一些有錯誤的以太網幀。 我希望能夠創建runts,jabber,misalignment和錯誤的FCS錯誤。 我在Python工作。

可以在硬件中處理,但並不總是 - 即使它是,你可以關閉它; 請參閱ethtool卸載參數。

關於完全控制您創建的幀 - 查看PF_PACKET (針對一種方法)或點擊驅動程序 (針對另一種方法)。

這是一篇關於使用PF_PACKET從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)

看到一個類似的問題

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

該程序無法按我的意圖生成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也應該工作。 如果您沒有使用任何這些卡,則可能無法使用此套接字選項。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM