Skip to content
Snippets Groups Projects
Verified Commit 8455d5b5 authored by Byron Lathi's avatar Byron Lathi
Browse files

Handle ack in synack, write to pcap

parent 812cb644
No related branches found
No related tags found
1 merge request!74Resolve "Network Processor"
Pipeline #704 passed
......@@ -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}")
......@@ -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
import tcp_pkg::*;
module tcp_rx_ctrl (
input wire i_clk,
input wire 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 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 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
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment