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 #(
|
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),
|
||||||
|
|||||||
@@ -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
|
||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user