From 8455d5b56db239751d85f5c4a6a244f8463be47d Mon Sep 17 00:00:00 2001 From: Byron Lathi Date: Thu, 12 Sep 2024 08:25:26 -0700 Subject: [PATCH] Handle ack in synack, write to pcap --- .../network_processor/sim/cocotb/tb/tb_top.sv | 2 +- .../sim/cocotb/tests/tcp_test.py | 23 ++++++++++- .../sub/network_processor/src/tcp_rx_ctrl.sv | 39 +++++++++++++------ .../sub/network_processor/src/tcp_stream.sv | 6 ++- 4 files changed, 53 insertions(+), 17 deletions(-) diff --git a/hw/super6502_fpga/src/sub/network_processor/sim/cocotb/tb/tb_top.sv b/hw/super6502_fpga/src/sub/network_processor/sim/cocotb/tb/tb_top.sv index 5a27636..ab18621 100644 --- a/hw/super6502_fpga/src/sub/network_processor/sim/cocotb/tb/tb_top.sv +++ b/hw/super6502_fpga/src/sub/network_processor/sim/cocotb/tb/tb_top.sv @@ -99,7 +99,7 @@ assign s_regs_axil_rresp = regs_axil.rresp; network_processor #( - .NUM_TCP(8) + .NUM_TCP(4) ) u_network_processor ( .i_clk (clk), .i_rst (rst), diff --git a/hw/super6502_fpga/src/sub/network_processor/sim/cocotb/tests/tcp_test.py b/hw/super6502_fpga/src/sub/network_processor/sim/cocotb/tests/tcp_test.py index c48c9be..7eaeaf5 100644 --- a/hw/super6502_fpga/src/sub/network_processor/sim/cocotb/tests/tcp_test.py +++ b/hw/super6502_fpga/src/sub/network_processor/sim/cocotb/tests/tcp_test.py @@ -8,6 +8,8 @@ import struct from scapy.layers.inet import Ether, IP, TCP from scapy.layers.l2 import ARP +from scapy.utils import PcapWriter + import logging from decimal import Decimal @@ -55,6 +57,9 @@ def ip_to_hex(ip: str) -> int: @cocotb.test() async def test_simple(dut): + pktdump = PcapWriter("tcp.pcap", append=True, sync=True) + + tb = TB(dut) await tb.cycle_reset() @@ -78,6 +83,7 @@ async def test_simple(dut): resp = await tb.mii_phy.tx.recv() # type: GmiiFrame packet = Ether(resp.get_payload()) + pktdump.write(packet) tb.log.info(f"Packet Type: {packet.type:x}") @@ -106,10 +112,15 @@ async def test_simple(dut): arp_response /= ARP(op="is-at", hwsrc=tb_mac, hwdst=dut_mac, psrc=tb_ip, pdst=dut_ip) arp_response = arp_response.build() + pktdump.write(arp_response) + await tb.mii_phy.rx.send(GmiiFrame.from_payload(arp_response)) + # 1. DUT sends syn with seq number + resp = await tb.mii_phy.tx.recv() # type: GmiiFrame packet = Ether(resp.get_payload()) + pktdump.write(packet) tb.log.info(f"Packet Type: {packet.type:x}") ip_packet = packet.payload @@ -129,17 +140,23 @@ async def test_simple(dut): dut_seq = tcp_packet.seq - tb_seq = 0x11111111 + tb_seq = 11111111 + + # 2. Send SYNACK with seq as our sequence number, and ACK as their sequence number plus 1 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() + pktdump.write(tcp_synack) await tb.mii_phy.rx.send(GmiiFrame.from_payload(tcp_synack)) + # 3. Receieve ACK with our sequence number plus 1 + resp = await tb.mii_phy.tx.recv() # type: GmiiFrame packet = Ether(resp.get_payload()) + pktdump.write(packet) tb.log.info(f"Packet Type: {packet.type:x}") @@ -156,4 +173,6 @@ async def test_simple(dut): 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}") \ No newline at end of file + tb.log.info(f"Checksum: {tcp_packet.chksum}") + + assert tcp_packet.ack == tb_seq + 1 \ No newline at end of file diff --git a/hw/super6502_fpga/src/sub/network_processor/src/tcp_rx_ctrl.sv b/hw/super6502_fpga/src/sub/network_processor/src/tcp_rx_ctrl.sv index c8ac1d9..84641d8 100644 --- a/hw/super6502_fpga/src/sub/network_processor/src/tcp_rx_ctrl.sv +++ b/hw/super6502_fpga/src/sub/network_processor/src/tcp_rx_ctrl.sv @@ -1,27 +1,42 @@ import tcp_pkg::*; module tcp_rx_ctrl ( - input wire i_clk, - input wire i_rst, + input logic i_clk, + input logic i_rst, - output tcp_pkg::rx_msg_t o_rx_msg, - output logic o_rx_msg_valid, - input logic i_rx_msg_ack, + output tcp_pkg::rx_msg_t o_rx_msg, + output logic o_rx_msg_valid, + input logic i_rx_msg_ack, - input wire [31:0] i_seq_number, - input wire [31:0] i_ack_number, - input wire [15:0] i_source_port, - input wire [15:0] i_dest_port, - input wire [7:0] i_flags, - input wire [15:0] i_window_size, - input wire i_hdr_valid + input logic [31:0] i_seq_number, + input logic [31:0] i_ack_number, + input logic [15:0] i_source_port, + input logic [15:0] i_dest_port, + input logic [7:0] i_flags, + input logic [15:0] i_window_size, + input logic i_hdr_valid, + + output logic [31:0] o_ack_number ); +logic [31:0] ack_num, ack_num_next; +assign o_ack_number = ack_num; + always_ff @(posedge i_clk) begin + if (i_rst) begin + ack_num <= '0; + end else begin + ack_num <= ack_num_next; + end +end + +always_comb begin if (i_hdr_valid) begin if (i_flags & 8'h12) begin o_rx_msg = RX_MSG_RECV_SYNACK; o_rx_msg_valid = '1; + + ack_num_next = i_seq_number + 1; end end end diff --git a/hw/super6502_fpga/src/sub/network_processor/src/tcp_stream.sv b/hw/super6502_fpga/src/sub/network_processor/src/tcp_stream.sv index e5aaec8..961c600 100644 --- a/hw/super6502_fpga/src/sub/network_processor/src/tcp_stream.sv +++ b/hw/super6502_fpga/src/sub/network_processor/src/tcp_stream.sv @@ -178,7 +178,7 @@ tcp_tx_ctrl u_tcp_tx_ctrl ( .o_tx_ctrl_ack (tx_ctrl_ack), .o_seq_number (w_tx_seq_number), - .o_ack_number (w_tx_ack_number), + // .o_ack_number (w_tx_ack_number), .o_flags (w_tx_flags), .o_window_size (w_tx_window_size), .o_hdr_valid (w_tx_hdr_valid), @@ -236,7 +236,9 @@ tcp_rx_ctrl u_tcp_rx_ctrl ( .i_ack_number (w_rx_ack_number), .i_flags (w_rx_flags), .i_window_size (w_rx_window_size), - .i_hdr_valid (w_rx_hdr_valid) + .i_hdr_valid (w_rx_hdr_valid), + + .o_ack_number (w_tx_ack_number) ); // rx buffer