diff --git a/examples/nexys_a7/lut_ram_ether/send_packet.py b/examples/nexys_a7/lut_ram_ether/send_packet.py index 243d4ff..11be180 100644 --- a/examples/nexys_a7/lut_ram_ether/send_packet.py +++ b/examples/nexys_a7/lut_ram_ether/send_packet.py @@ -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() diff --git a/examples/nexys_a7/lut_ram_ether/src/mac_tx.v b/examples/nexys_a7/lut_ram_ether/src/mac_tx.v index f7b39f0..5bd7b37 100644 --- a/examples/nexys_a7/lut_ram_ether/src/mac_tx.v +++ b/examples/nexys_a7/lut_ram_ether/src/mac_tx.v @@ -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;