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 #(
.NUM_TCP(8)
.NUM_TCP(4)
) u_network_processor (
.i_clk (clk),
.i_rst (rst),

View File

@@ -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}")
tb.log.info(f"Checksum: {tcp_packet.chksum}")
assert tcp_packet.ack == tb_seq + 1

View File

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

View File

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