-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathethernet.py
More file actions
67 lines (55 loc) · 2.22 KB
/
ethernet.py
File metadata and controls
67 lines (55 loc) · 2.22 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
from struct import pack, unpack, calcsize
import struct
from netaddr import EUI
ETH_HDR_FMT = '!6s6sH'
'''
Simple Python model for an Ethernet Frame
'''
class EthernetFrame:
def __init__(self, dest_mac='', src_mac='', tcode=0x0800, data=''):
self.eth_dest_addr = dest_mac
self.eth_src_addr = src_mac
self.eth_tcode = tcode # Transaction Code, 0x0800 is DOD Internet Protocol (IP) others can refer
# http://www.cavebear.com/archive/cavebear/Ethernet/type.html
self.data = data
def __repr__(self):
repr = ('EthernetFrame: ' +
'[dest_mac: %s, src_mac: %s, tcode: 0x%04x,' +
' len(data): %d]') \
% (self.eth_addr(self.eth_dest_addr),
self.eth_addr(self.eth_src_addr),
self.eth_tcode, len(self.data))
return repr
def pack(self):
eth_header = pack(ETH_HDR_FMT,
self.eth_dest_addr, self.eth_src_addr,
self.eth_tcode)
eth_frame = ''.join([eth_header, self.data])
return eth_frame
def unpack(self, eth_frame):
hdr_len = calcsize(ETH_HDR_FMT)
eth_headers = eth_frame[:hdr_len]
eth_fields = unpack(ETH_HDR_FMT, eth_headers)
self.eth_dest_addr = eth_fields[0]
self.eth_src_addr = eth_fields[1]
self.eth_tcode = eth_fields[2]
self.data = eth_frame[hdr_len:]
@staticmethod
def eth_addr(raw):
hex = '%.2x:%.2x:%.2x:%.2x:%.2x:%.2x' \
% (ord(raw[0]), ord(raw[1]), ord(raw[2]),
ord(raw[3]), ord(raw[4]), ord(raw[5]))
return hex
if __name__ == "__main__":
# 7b-4c-95-23-e8-89
test_mac = struct.pack('!6B',
int('7b', 16), int('4c', 16), int('95', 16),
int('23', 16), int('e8', 16), int('89', 16))
print test_mac
print unpack('!6B', test_mac)
e = EthernetFrame(test_mac, test_mac, data="test data Frame")
print e.__repr__()
test_mac = struct.pack('!6B',
int('7b', 16), int('4c', 16), int('95', 16),
int('23', 16), int('e8', 16), int('88', 16))
print EUI(e.eth_addr(test_mac))