Handle ack in synack, write to pcap
This commit is contained in:
@@ -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),
|
||||
|
||||
@@ -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}")
|
||||
|
||||
|
||||
@@ -157,3 +174,5 @@ async def test_simple(dut):
|
||||
tb.log.info(f"flags: {tcp_packet.flags}")
|
||||
tb.log.info(f"window: {tcp_packet.window}")
|
||||
tb.log.info(f"Checksum: {tcp_packet.chksum}")
|
||||
|
||||
assert tcp_packet.ack == tb_seq + 1
|
||||
@@ -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,
|
||||
|
||||
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
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user