add working python api for ethernet tx/rx

This commit is contained in:
Fischer Moseley 2023-04-25 15:38:44 -04:00
parent 8e139bba3a
commit 6210e3cc39
2 changed files with 121 additions and 16 deletions

View File

@ -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()

View File

@ -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;