Fix ip demux wrapper, send a tcp synack

This commit is contained in:
Byron Lathi
2024-09-02 23:44:47 -07:00
parent 0c2f36a2ff
commit ef20f1477d
2 changed files with 54 additions and 13 deletions

View File

@@ -6,7 +6,7 @@ from cocotbext.axi import AxiLiteBus, AxiLiteMaster, AxiLiteRam
from cocotbext.eth import MiiPhy, GmiiFrame from cocotbext.eth import MiiPhy, GmiiFrame
import struct import struct
from scapy.layers.inet import Ether from scapy.layers.inet import Ether, IP, TCP
from scapy.layers.l2 import ARP from scapy.layers.l2 import ARP
import logging import logging
@@ -59,17 +59,20 @@ async def test_simple(dut):
await tb.cycle_reset() await tb.cycle_reset()
src_ip = "172.0.0.2" dut_ip = "172.0.0.2"
dst_ip = "172.0.0.1" tb_ip = "172.0.0.1"
local_mac = "02:00:00:11:22:33" dut_port = 1234
tb_port = 5678
tb_mac = "02:00:00:11:22:33"
await tb.axil_master.write_dword(0x0, 0x1807) await tb.axil_master.write_dword(0x0, 0x1807)
await tb.axil_master.write_dword(0x200, 0x1234) await tb.axil_master.write_dword(0x200, dut_port)
await tb.axil_master.write_dword(0x204, ip_to_hex(src_ip)) await tb.axil_master.write_dword(0x204, ip_to_hex(dut_ip))
await tb.axil_master.write_dword(0x208, 0x5678) await tb.axil_master.write_dword(0x208, tb_port)
await tb.axil_master.write_dword(0x20c, ip_to_hex(dst_ip)) await tb.axil_master.write_dword(0x20c, ip_to_hex(tb_ip))
await tb.axil_master.write_dword(0x210, 0x3) await tb.axil_master.write_dword(0x210, 0x3)
resp = await tb.mii_phy.tx.recv() # type: GmiiFrame resp = await tb.mii_phy.tx.recv() # type: GmiiFrame
@@ -90,14 +93,17 @@ async def test_simple(dut):
tb.log.info(f"Arp psrc: {arp_request.psrc}") tb.log.info(f"Arp psrc: {arp_request.psrc}")
tb.log.info(f"Arp pdst: {arp_request.pdst}") tb.log.info(f"Arp pdst: {arp_request.pdst}")
dut_mac = arp_request.hwsrc
dut_ip = arp_request.psrc
assert arp_request.op == 1, "ARP type is not request!" assert arp_request.op == 1, "ARP type is not request!"
assert arp_request.hwsrc == "02:00:00:aa:bb:cc", "ARP hwsrc does not match expected" assert arp_request.hwsrc == "02:00:00:aa:bb:cc", "ARP hwsrc does not match expected"
assert arp_request.hwdst == "00:00:00:00:00:00", "ARP hwdst does not match expected" assert arp_request.hwdst == "00:00:00:00:00:00", "ARP hwdst does not match expected"
assert arp_request.psrc == src_ip, "ARP psrc does not match expected" assert arp_request.psrc == dut_ip, "ARP psrc does not match expected"
assert arp_request.pdst == dst_ip, "ARP pdst does not match expected" assert arp_request.pdst == tb_ip, "ARP pdst does not match expected"
arp_response = Ether(dst=arp_request.hwsrc, src=local_mac) arp_response = Ether(dst=dut_mac, src=tb_mac)
arp_response /= ARP(op="is-at", hwsrc=local_mac, hwdst=arp_request.hwsrc, psrc=dst_ip, pdst=arp_request.psrc) arp_response /= ARP(op="is-at", hwsrc=tb_mac, hwdst=dut_mac, psrc=tb_ip, pdst=dut_ip)
arp_response = arp_response.build() arp_response = arp_response.build()
await tb.mii_phy.rx.send(GmiiFrame.from_payload(arp_response)) await tb.mii_phy.rx.send(GmiiFrame.from_payload(arp_response))
@@ -105,3 +111,31 @@ async def test_simple(dut):
resp = await tb.mii_phy.tx.recv() # type: GmiiFrame resp = await tb.mii_phy.tx.recv() # type: GmiiFrame
packet = Ether(resp.get_payload()) packet = Ether(resp.get_payload())
tb.log.info(f"Packet Type: {packet.type:x}") tb.log.info(f"Packet Type: {packet.type:x}")
ip_packet = packet.payload
assert isinstance(ip_packet, IP)
tcp_packet = ip_packet.payload
assert isinstance(tcp_packet, TCP)
tb.log.info(f"Source Port: {tcp_packet.sport}")
tb.log.info(f"Dest Port: {tcp_packet.dport}")
tb.log.info(f"Seq: {tcp_packet.seq}")
tb.log.info(f"Ack: {tcp_packet.ack}")
tb.log.info(f"Data Offs: {tcp_packet.dataofs}")
tb.log.info(f"flags: {tcp_packet.flags}")
tb.log.info(f"window: {tcp_packet.window}")
tb.log.info(f"Checksum: {tcp_packet.chksum}")
dut_seq = tcp_packet.seq
tb_seq = 0x12345678
tcp_synack = Ether(dst=dut_mac, src=tb_mac)
tcp_synack /= IP(src=tb_ip, dst=dut_ip)
tcp_synack /= TCP(sport=tb_port, dport=dut_port, seq=tb_seq, ack=dut_seq+1, flags="SA")
tcp_synack = tcp_synack.build()
await tb.mii_phy.rx.send(GmiiFrame.from_payload(tcp_synack))
await Timer(Decimal(CLK_PERIOD_NS * 800), units='ns')

View File

@@ -93,6 +93,9 @@ ip_demux #(
.USER_ENABLE(USER_ENABLE), .USER_ENABLE(USER_ENABLE),
.USER_WIDTH(USER_WIDTH) .USER_WIDTH(USER_WIDTH)
) u_ip_demux ( ) u_ip_demux (
.clk (clk),
.rst (rst),
.s_ip_hdr_valid (s_ip.ip_hdr_valid ), .s_ip_hdr_valid (s_ip.ip_hdr_valid ),
.s_ip_hdr_ready (s_ip.ip_hdr_ready ), .s_ip_hdr_ready (s_ip.ip_hdr_ready ),
.s_eth_dest_mac (s_ip.eth_dest_mac ), .s_eth_dest_mac (s_ip.eth_dest_mac ),
@@ -145,7 +148,11 @@ ip_demux #(
.m_ip_payload_axis_tlast (m_ip_payload_axis_tlast ), .m_ip_payload_axis_tlast (m_ip_payload_axis_tlast ),
.m_ip_payload_axis_tid (m_ip_payload_axis_tid ), .m_ip_payload_axis_tid (m_ip_payload_axis_tid ),
.m_ip_payload_axis_tdest (m_ip_payload_axis_tdest ), .m_ip_payload_axis_tdest (m_ip_payload_axis_tdest ),
.m_ip_payload_axis_tuser (m_ip_payload_axis_tuser ) .m_ip_payload_axis_tuser (m_ip_payload_axis_tuser ),
.enable (enable),
.drop (drop),
.select (select)
); );
endmodule endmodule