add working python api for ethernet tx/rx
This commit is contained in:
parent
8e139bba3a
commit
6210e3cc39
|
|
@ -1,20 +1,125 @@
|
|||
from manta import Manta
|
||||
from scapy.all import *
|
||||
|
||||
m = Manta('manta.yaml')
|
||||
src_mac = "00:E0:4C:68:1E:0C" # for manta.mit.edu's ethernet adapter
|
||||
dst_mac = "69:69:5A:06:54:91"
|
||||
ifc = "enx00e04c681e0c"
|
||||
|
||||
src_mac = "00:00:00:00:00:00"
|
||||
dst_mac = "FF:FF:FF:FF:FF:FF"
|
||||
ifc = "en8"
|
||||
def read_register(addr):
|
||||
pkt = Ether()
|
||||
pkt.src = src_mac
|
||||
pkt.dst = dst_mac
|
||||
pkt.type = 0x0002
|
||||
|
||||
mypkt = Ether()
|
||||
mypkt.src = src_mac
|
||||
mypkt.dst = dst_mac
|
||||
mypkt.type = 0x0002
|
||||
# two bytes of address, and 44 of padding
|
||||
# makes the 46 byte minimum length
|
||||
msg = addr.to_bytes(2, 'big') + 44*b'\x00'
|
||||
|
||||
msg = b'\x00\x00'
|
||||
pkt = pkt / msg
|
||||
pkt.load = msg
|
||||
|
||||
sniffer = AsyncSniffer(iface = ifc, filter="ether src 69:69:5a:06:54:91")
|
||||
sniffer.start()
|
||||
from time import sleep
|
||||
time.sleep(0.1)
|
||||
sendp(pkt, iface=ifc)
|
||||
results = sniffer.stop()
|
||||
|
||||
assert len(results) == 1, "Received more packets than expected!"
|
||||
|
||||
for packet in results:
|
||||
raw_response_bytes = bytes(packet.payload)[0:2]
|
||||
data = int.from_bytes(raw_response_bytes, 'big')
|
||||
return data
|
||||
|
||||
def write_register(addr, data):
|
||||
pkt = Ether()
|
||||
pkt.src = src_mac
|
||||
pkt.dst = dst_mac
|
||||
pkt.type = 0x0004
|
||||
|
||||
# two bytes of address, two bytes of
|
||||
# data, and 42 of padding makes the 46 byte
|
||||
# minimum length
|
||||
msg = addr.to_bytes(2, 'big') + data.to_bytes(2, 'big') + 42*b'\x00'
|
||||
|
||||
pkt = pkt / msg
|
||||
pkt.load = msg
|
||||
sendp(pkt, iface=ifc)
|
||||
|
||||
def read_batch(addrs):
|
||||
pkts = []
|
||||
for addr in addrs:
|
||||
pkt = Ether()
|
||||
pkt.src = src_mac
|
||||
pkt.dst = dst_mac
|
||||
pkt.type = 0x0002
|
||||
|
||||
# two bytes of address, and 44 of padding
|
||||
# makes the 46 byte minimum length
|
||||
msg = addr.to_bytes(2, 'big') + 44*b'\x00'
|
||||
|
||||
pkt = pkt / msg
|
||||
pkt.load = msg
|
||||
pkts.append(pkt)
|
||||
|
||||
sniffer = AsyncSniffer(iface = ifc, count = len(addrs), filter="ether src 69:69:5a:06:54:91")
|
||||
sniffer.start()
|
||||
from time import sleep
|
||||
time.sleep(0.1)
|
||||
|
||||
sendp(pkts, iface=ifc)
|
||||
sniffer.join()
|
||||
results = sniffer.results
|
||||
|
||||
assert len(results) == len(addrs), "Received more packets than expected!"
|
||||
|
||||
datas = []
|
||||
for packet in results:
|
||||
raw_response_bytes = bytes(packet.payload)[0:2]
|
||||
data = int.from_bytes(raw_response_bytes, 'big')
|
||||
datas.append(data)
|
||||
|
||||
return datas
|
||||
|
||||
def write_batch(addrs, data):
|
||||
pkts = []
|
||||
for i in range(len(addrs)):
|
||||
pkt = Ether()
|
||||
pkt.src = src_mac
|
||||
pkt.dst = dst_mac
|
||||
pkt.type = 0x0002
|
||||
|
||||
addr = addrs[i]
|
||||
data = datas[i]
|
||||
|
||||
# two bytes of address, two bytes of
|
||||
# data, and 42 of padding makes the 46 byte
|
||||
# minimum length
|
||||
msg = addr.to_bytes(2, 'big') + data.to_bytes(2, 'big') + 42*b'\x00'
|
||||
|
||||
pkt = pkt / msg
|
||||
pkt.load = msg
|
||||
|
||||
sendp(pkts, iface=ifc)
|
||||
|
||||
|
||||
from time import sleep
|
||||
if __name__ == "__main__":
|
||||
# for addr in range(64):
|
||||
# data = addr
|
||||
# write_register(addr, data)
|
||||
|
||||
# retval = read_register(addr)
|
||||
# if retval != addr:
|
||||
# print("oops")
|
||||
|
||||
# else:
|
||||
# print(f"yay addr: {addr} worked!")
|
||||
|
||||
addrs = [i for i in range(64)]
|
||||
datas = addrs
|
||||
write_batch(addrs, datas)
|
||||
print("done")
|
||||
retvals = read_batch(addrs)
|
||||
print(retvals)
|
||||
|
||||
mypkt = mypkt / msg
|
||||
mypkt.load = msg
|
||||
p = srp(mypkt, iface=ifc)
|
||||
p.show()
|
||||
|
|
|
|||
|
|
@ -15,8 +15,8 @@ module mac_tx (
|
|||
// packet magic numbers
|
||||
localparam PREAMBLE = {7{8'b01010101}};
|
||||
localparam SFD = 8'b11010101;
|
||||
parameter SRC_MAC = 48'h69_69_69_69_69_69;
|
||||
parameter DST_MAC = 48'hFF_FF_FF_FF_FF_FF;
|
||||
parameter SRC_MAC = 48'h69_69_5A_06_54_91;
|
||||
parameter DST_MAC = 48'h00_E0_4C_68_1E_0C;
|
||||
|
||||
// all lengths are in units of dibits, hence all the mulitplies by four
|
||||
localparam PREAMBLE_LEN = 7 * 4;
|
||||
|
|
|
|||
Loading…
Reference in New Issue