2009-04-06 11 views
7

मुझे यकीन नहीं है कि यह हार्डवेयर से भी संभाला जा सकता है, लेकिन मुझे इन्हें त्रुटियों के साथ कुछ ईथरनेट फ्रेम भेजने की आवश्यकता है। मैं रन्स, जैबर, मिसाइलमेंट, और खराब एफसीएस त्रुटियों को बनाने में सक्षम होना चाहता हूं। मैं पायथन में काम कर रहा हूँ।आप भ्रष्ट एफसीएस के साथ ईथरनेट फ्रेम कैसे भेजते हैं?

उत्तर

9

यह हार्डवेयर में संभाला जा सकता है, लेकिन हमेशा नहीं होता है - और यहां तक ​​कि यदि यह भी है, तो आप इसे बंद कर सकते हैं; ethtool ऑफलोड पैरामीटर देखें।

आपके द्वारा बनाए गए फ्रेम पर पूर्ण नियंत्रण प्राप्त करने के संबंध में - PF_PACKET (एक दृष्टिकोण के लिए) या the tap driver (दूसरे के लिए) देखें।

यहां using PF_PACKET to send hand-crafted frames from Python पर एक लेख है। तब

sudo ethtool -K eth1 tx off 

, आप अजगर से भ्रष्ट फ्रेम भेजें::

4

पहले, आप अपने ईथरनेट कार्ड की checksumming को निष्क्रिय

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

अजगर के लिए Scapy का उपयोग करके देखें, वहाँ जंबो फ्रेम, एक रनट फ्रेम भी उत्पन्न करने के लिए उदाहरण हैं। http://www.dirk-loss.de/scapy-doc/usage.html

1

प्रोग्राम मेरे लिए एफसीएस त्रुटियों को उत्पन्न करने के लिए काम नहीं करता था।

नेटवर्क चालक ने जेनरेट फ्रेम के अंत में सही चेकसम जोड़ा। बेशक यह काफी संभव है कि समाधान कुछ कार्ड के लिए काम कर रहा है, लेकिन मुझे यकीन है कि इंटेल से किसी के साथ नहीं। (यह भी मेरे लिए किसी भी ethtool बदलाव के बिना काम कर रहा है।)

कम से कम एक इंटेल e1000e नेटवर्क कार्ड के साथ

आप उपरोक्त कोड में कुछ बदलाव करने की जरूरत है: के बाद निम्न पंक्ति जोड़ें "s = सॉकेट (AF_PACKET, SOCK_RAW)" :

s.setsockopt(SOL_SOCKET,43,1) 

यह "SO_NOFCS" विकल्प socket.h में परिभाषित का उपयोग करें और गणना और FCS जोड़े बिना फ्रेम बाहर भेजने के लिए एनआईसी चालक बताओ।

आप निम्न सी programm, जो मुझे यह करने के लिए कैसे दिखा था में रुचि हो सकती: http://markmail.org/thread/eoquixklsjgvvaom

लेकिन ध्यान रखें कि कार्यक्रम एक छोटा सा परिवर्तन के बिना हाल ही में कर्नेल पर काम नहीं करेगा हो। SOL_SOCKET ने कुछ समय में संख्यात्मक आईडी को 42 से 43 तक बदल दिया है।

मूल लेखक के अनुसार यह सुविधा कम से कम निम्न ड्राइवरों के लिए उपलब्ध होनी चाहिए: ई 100, ई 1000, और ई 1000e। 3.16.0 के कर्नेल स्रोतों में एक त्वरित grep यह इंगित कर रहा है कि ixgbe igb और i40e भी काम करना चाहिए। यदि आप इनमें से किसी भी कार्ड का उपयोग नहीं कर रहे हैं तो यह सॉकेट विकल्प शायद उपलब्ध नहीं होगा।

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^