2009-04-06 6 views
7

Tôi không chắc chắn nếu điều này thậm chí có thể vì điều này có thể được xử lý trong phần cứng, nhưng tôi cần phải gửi một số khung Ethernet có lỗi trong đó. Tôi muốn có khả năng tạo các lỗi runts, jabber, misalignment và bad FCS. Tôi đang làm việc bằng Python.Làm cách nào để gửi khung Ethernet với FCS bị hỏng?

Trả lời

9

có thể được xử lý bằng phần cứng nhưng không phải lúc nào - và ngay cả khi có, bạn có thể tắt tính năng đó; xem thông số off2 ethtool.

Để kiểm soát toàn bộ khung hình bạn tạo - hãy xem PF_PACKET (đối với một cách tiếp cận) hoặc the tap driver (cho một phương pháp khác).

Đây là một bài viết trên using PF_PACKET to send hand-crafted frames from Python.

4

Trước tiên, bạn vô hiệu hóa checksumming ethernet card của bạn:

sudo ethtool -K eth1 tx off 

Sau đó, bạn gửi các khung tham nhũng từ 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) 

Xem A similar question

1

Chương trình không hoạt động như dự định để tạo lỗi FCS.

Trình điều khiển mạng đã thêm tổng kiểm tra chính xác vào cuối khung được tạo lại. Tất nhiên nó là khá có thể là giải pháp đang làm việc cho một số thẻ, nhưng tôi chắc chắn không phải với bất kỳ từ Intel. (Nó cũng hoạt động mà không có bất kỳ thay đổi ethtool nào đối với tôi.)

Với ít nhất một card mạng Intel e1000e, bạn cần thay đổi nhỏ mã ở trên: Thêm dòng sau đây sau "s = socket (AF_PACKET, SOCK_RAW)" :

s.setsockopt(SOL_SOCKET,43,1) 

Điều này cho trình điều khiển NIC sử dụng tùy chọn "SO_NOFCS" được xác định trong socket.h và gửi khung mà không tính và thêm FCS.

Bạn cũng có thể quan tâm đến C-programm sau đây, mà đã chỉ cho tôi cách để làm điều đó: http://markmail.org/thread/eoquixklsjgvvaom

Nhưng lưu ý rằng chương trình sẽ không hoạt động trên hạt nhân gần đây mà không có một sự thay đổi nhỏ. SOL_SOCKET dường như đã thay đổi ID số từ 42 thành 43 tại một thời điểm trong quá khứ.

Theo tác giả gốc, tính năng này sẽ khả dụng cho ít nhất các trình điều khiển sau: e100, e1000 và e1000e. Grep nhanh trong các nguồn kernel 3.16.0 chỉ ra rằng ixgbe igb và i40e cũng sẽ hoạt động. Nếu bạn không sử dụng bất kỳ thẻ nào trong số các thẻ này, tùy chọn ổ cắm này có thể sẽ không khả dụng.