Handle ack in synack, write to pcap

This commit is contained in:
Byron Lathi
2024-09-12 08:25:26 -07:00
parent 812cb6447a
commit 8455d5b56d
4 changed files with 53 additions and 17 deletions

View File

@@ -99,7 +99,7 @@ assign s_regs_axil_rresp = regs_axil.rresp;
network_processor #( network_processor #(
.NUM_TCP(8) .NUM_TCP(4)
) u_network_processor ( ) u_network_processor (
.i_clk (clk), .i_clk (clk),
.i_rst (rst), .i_rst (rst),

View File

@@ -8,6 +8,8 @@ import struct
from scapy.layers.inet import Ether, IP, TCP from scapy.layers.inet import Ether, IP, TCP
from scapy.layers.l2 import ARP from scapy.layers.l2 import ARP
from scapy.utils import PcapWriter
import logging import logging
from decimal import Decimal from decimal import Decimal
@@ -55,6 +57,9 @@ def ip_to_hex(ip: str) -> int:
@cocotb.test() @cocotb.test()
async def test_simple(dut): async def test_simple(dut):
pktdump = PcapWriter("tcp.pcap", append=True, sync=True)
tb = TB(dut) tb = TB(dut)
await tb.cycle_reset() await tb.cycle_reset()
@@ -78,6 +83,7 @@ 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())
pktdump.write(packet)
tb.log.info(f"Packet Type: {packet.type:x}") 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(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()
pktdump.write(arp_response)
await tb.mii_phy.rx.send(GmiiFrame.from_payload(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 resp = await tb.mii_phy.tx.recv() # type: GmiiFrame
packet = Ether(resp.get_payload()) packet = Ether(resp.get_payload())
pktdump.write(packet)
tb.log.info(f"Packet Type: {packet.type:x}") tb.log.info(f"Packet Type: {packet.type:x}")
ip_packet = packet.payload ip_packet = packet.payload
@@ -129,17 +140,23 @@ async def test_simple(dut):
dut_seq = tcp_packet.seq 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 = Ether(dst=dut_mac, src=tb_mac)
tcp_synack /= IP(src=tb_ip, dst=dut_ip) 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(sport=tb_port, dport=dut_port, seq=tb_seq, ack=dut_seq+1, flags="SA")
tcp_synack = tcp_synack.build() tcp_synack = tcp_synack.build()
pktdump.write(tcp_synack)
await tb.mii_phy.rx.send(GmiiFrame.from_payload(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 resp = await tb.mii_phy.tx.recv() # type: GmiiFrame
packet = Ether(resp.get_payload()) packet = Ether(resp.get_payload())
pktdump.write(packet)
tb.log.info(f"Packet Type: {packet.type:x}") 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"Data Offs: {tcp_packet.dataofs}")
tb.log.info(f"flags: {tcp_packet.flags}") tb.log.info(f"flags: {tcp_packet.flags}")
tb.log.info(f"window: {tcp_packet.window}") tb.log.info(f"window: {tcp_packet.window}")
tb.log.info(f"Checksum: {tcp_packet.chksum}") tb.log.info(f"Checksum: {tcp_packet.chksum}")
assert tcp_packet.ack == tb_seq + 1

View File

@@ -1,27 +1,42 @@
import tcp_pkg::*; import tcp_pkg::*;
module tcp_rx_ctrl ( module tcp_rx_ctrl (
input wire i_clk, input logic i_clk,
input wire i_rst, input logic i_rst,
output tcp_pkg::rx_msg_t o_rx_msg, output tcp_pkg::rx_msg_t o_rx_msg,
output logic o_rx_msg_valid, output logic o_rx_msg_valid,
input logic i_rx_msg_ack, input logic i_rx_msg_ack,
input wire [31:0] i_seq_number, input logic [31:0] i_seq_number,
input wire [31:0] i_ack_number, input logic [31:0] i_ack_number,
input wire [15:0] i_source_port, input logic [15:0] i_source_port,
input wire [15:0] i_dest_port, input logic [15:0] i_dest_port,
input wire [7:0] i_flags, input logic [7:0] i_flags,
input wire [15:0] i_window_size, input logic [15:0] i_window_size,
input wire i_hdr_valid 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 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_hdr_valid) begin
if (i_flags & 8'h12) begin if (i_flags & 8'h12) begin
o_rx_msg = RX_MSG_RECV_SYNACK; o_rx_msg = RX_MSG_RECV_SYNACK;
o_rx_msg_valid = '1; o_rx_msg_valid = '1;
ack_num_next = i_seq_number + 1;
end end
end end
end end

View File

@@ -178,7 +178,7 @@ tcp_tx_ctrl u_tcp_tx_ctrl (
.o_tx_ctrl_ack (tx_ctrl_ack), .o_tx_ctrl_ack (tx_ctrl_ack),
.o_seq_number (w_tx_seq_number), .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_flags (w_tx_flags),
.o_window_size (w_tx_window_size), .o_window_size (w_tx_window_size),
.o_hdr_valid (w_tx_hdr_valid), .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_ack_number (w_rx_ack_number),
.i_flags (w_rx_flags), .i_flags (w_rx_flags),
.i_window_size (w_rx_window_size), .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 // rx buffer