From c4eba333e895d03209b60a9e351755159acb87d8 Mon Sep 17 00:00:00 2001 From: Byron Lathi Date: Mon, 5 Aug 2024 20:32:07 -0700 Subject: [PATCH] Add start of tcp docs --- .gitignore | 2 + .../doc/network_processor.drawio | 229 ++++++++++++++++++ .../doc/network_processor.drawio.png | Bin 0 -> 57082 bytes .../doc/network_processor.md | 69 ++++++ .../src/sub/network_processor/doc/tcp.drawio | 122 ++++++++++ .../sub/network_processor/doc/tcp.drawio.png | Bin 0 -> 41637 bytes 6 files changed, 422 insertions(+) create mode 100644 hw/super6502_fpga/src/sub/network_processor/doc/network_processor.drawio create mode 100644 hw/super6502_fpga/src/sub/network_processor/doc/network_processor.drawio.png create mode 100644 hw/super6502_fpga/src/sub/network_processor/doc/network_processor.md create mode 100644 hw/super6502_fpga/src/sub/network_processor/doc/tcp.drawio create mode 100644 hw/super6502_fpga/src/sub/network_processor/doc/tcp.drawio.png diff --git a/.gitignore b/.gitignore index f468ce5..e2c60fc 100644 --- a/.gitignore +++ b/.gitignore @@ -17,6 +17,8 @@ *.gtkw *debug_profile* +# Drawio temp files. +*.bkp *.mem sim_top diff --git a/hw/super6502_fpga/src/sub/network_processor/doc/network_processor.drawio b/hw/super6502_fpga/src/sub/network_processor/doc/network_processor.drawio new file mode 100644 index 0000000..bf3667b --- /dev/null +++ b/hw/super6502_fpga/src/sub/network_processor/doc/network_processor.drawio @@ -0,0 +1,229 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/hw/super6502_fpga/src/sub/network_processor/doc/network_processor.drawio.png b/hw/super6502_fpga/src/sub/network_processor/doc/network_processor.drawio.png new file mode 100644 index 0000000000000000000000000000000000000000..d7c260cc11da299044887381a21a5979c6200b8c GIT binary patch literal 57082 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 literal 0 HcmV?d00001 diff --git a/hw/super6502_fpga/src/sub/network_processor/doc/network_processor.md b/hw/super6502_fpga/src/sub/network_processor/doc/network_processor.md new file mode 100644 index 0000000..c2359a0 --- /dev/null +++ b/hw/super6502_fpga/src/sub/network_processor/doc/network_processor.md @@ -0,0 +1,69 @@ +# Network Processor + +The network processor terminates TCP connections. + +## Theory of Operation + +The idea behind this network processor is that the configuration is stored in +a context buffer rather than being written to device configuration registers. +This like the IP addresses, ports, TCP state, flow control window, congestion +window, sequence numbers, etc. are stored in this context buffer. + +The context buffer can be created once by software when the connection is +created, and is then managed by hardware until the connection is closed. + +The other interface to the core is through the packet DMA interface. The packets +contain a simple header which contains the instruction for the core, the context +pointer, the protocol, and the length of the data. + +## Components + +### TCP State Manager + +The TCP State manager is responsible for maintaining the TCP State. It facilitates +communication between the RX control and TX control. The most important thing that +the TCP State manager does is request the socket structures from memory, and load +these values into the RX and TX control, and vice-versa. + +#### Clock and Reset + + +| Clock Name | Clock Frequency | +|---------------|---------------| +| System Clock | 100MHz | + +| Reset Name | Purpose | +|-----------|------------| +| rst_n | General Reset | + +#### Bus Interfaces + +| Bus Name | Type and Purpose | +| -------------- | ---------------- | +| cfg_apb | APB Configuration | +| ctx_dma_m_axil | Context DMA Master | + +#### Other Signals +| Signal Name | Direction | Description | +| ----------- | --------- | ----------- | +| o_send_syn | O | Tells TX control to send a syn packet. If o_send_ack is also valid, then send a syn_ack packet | +| o_send_ack | O | Tells TX control to send an ack packet | +| o_send_fin | O | Tells TX control to send a fin packet. If o_send_ack is also valid, then send a fin_ack packet | +| o_seq_num | O | Current sequence number | +| i_seq_num | I | Next sequence number | +| i_seq_num_we | I | Write new sequence number | +| o_ack_num | O | Current ack number | +| i_ack_num | I | Next ack number | +| i_ack_num_we | I | Write new ack number | +| i_ctx_addr | I | Context pointer from TX control | +| i_ctx_valid| I | Context pointer is valid | +| o_cam_key | O | Key to write to CAM (port) | +| o_cam_val | O | Value to write to CAM (pointer) | +| i_cam_val | I | Value read from CAM | +| i_cam_hit | I | Value read from CAM is valid | +| o_cam_we | O | Write value to CAM | +| o_cam_re | O | Read value from CAM | +| i_tx_ctx_ptr | I | Context pointer from TX Control | +| i_tx_ctx_ptr_valid | I | Conext pointer is valid | +| i_rx_port | I | RX Port input | +| i_rx_port_valid | I | RX Port Valid | \ No newline at end of file diff --git a/hw/super6502_fpga/src/sub/network_processor/doc/tcp.drawio b/hw/super6502_fpga/src/sub/network_processor/doc/tcp.drawio new file mode 100644 index 0000000..704d280 --- /dev/null +++ b/hw/super6502_fpga/src/sub/network_processor/doc/tcp.drawio @@ -0,0 +1,122 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/hw/super6502_fpga/src/sub/network_processor/doc/tcp.drawio.png b/hw/super6502_fpga/src/sub/network_processor/doc/tcp.drawio.png new file mode 100644 index 0000000000000000000000000000000000000000..775371893bc5eb23b490592279b366dc1f0859b1 GIT binary patch literal 41637 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 literal 0 HcmV?d00001