From 02a9a4bf3fb189979eef6424be25e009e0cce211 Mon Sep 17 00:00:00 2001
From: Reinier van der Walle <walle@astron.nl>
Date: Wed, 5 Jul 2023 15:32:56 +0200
Subject: [PATCH] added ip checksum calculation to ethernet tester

---
 .../src/vhdl/rdma_demo_eth_tester_wrapper.vhd |  7 ++--
 .../vhdl/rdma_demo_roce_tester_wrapper.vhd    |  5 +--
 libraries/io/eth/src/vhdl/eth_tester.vhd      |  2 ++
 libraries/io/eth/src/vhdl/eth_tester_tx.vhd   | 35 +++++++++++++++++--
 4 files changed, 42 insertions(+), 7 deletions(-)

diff --git a/applications/rdma_demo/src/vhdl/rdma_demo_eth_tester_wrapper.vhd b/applications/rdma_demo/src/vhdl/rdma_demo_eth_tester_wrapper.vhd
index e617ef70a6..a8639774e0 100644
--- a/applications/rdma_demo/src/vhdl/rdma_demo_eth_tester_wrapper.vhd
+++ b/applications/rdma_demo/src/vhdl/rdma_demo_eth_tester_wrapper.vhd
@@ -189,10 +189,11 @@ begin
   generic map (
     g_nof_octet_generate => c_rdma_demo_nof_octet_generate_100gbe,
     g_nof_octet_output   => c_rdma_demo_nof_octet_output_100gbe,
-    g_use_network_header => false,
+    g_use_eth_header     => false,
+    g_use_ip_udp_header  => false,
     g_use_dp_header      => true,
-    g_hdr_field_arr      => c_rdma_demo_hdr_field_arr,
-    g_hdr_field_sel      => c_rdma_demo_hdr_field_sel,
+    g_hdr_field_arr      => c_rdma_demo_dp_hdr_field_arr,
+    g_hdr_field_sel      => c_rdma_demo_dp_hdr_field_sel,
     g_remove_crc         => false
   )
   port map (
diff --git a/applications/rdma_demo/src/vhdl/rdma_demo_roce_tester_wrapper.vhd b/applications/rdma_demo/src/vhdl/rdma_demo_roce_tester_wrapper.vhd
index ff99cf172b..c5d6cd43b5 100644
--- a/applications/rdma_demo/src/vhdl/rdma_demo_roce_tester_wrapper.vhd
+++ b/applications/rdma_demo/src/vhdl/rdma_demo_roce_tester_wrapper.vhd
@@ -192,8 +192,9 @@ begin
     g_use_eth_header     => false,
     g_use_ip_udp_header  => true,
     g_use_dp_header      => false,
-    g_hdr_field_arr      => c_rdma_demo_dp_hdr_field_arr,
-    g_hdr_field_sel      => c_rdma_demo_dp_hdr_field_sel,
+    g_hdr_calc_ip_crc    => true,
+    g_hdr_field_arr      => c_rdma_demo_roce_hdr_field_arr,
+    g_hdr_field_sel      => c_rdma_demo_roce_hdr_field_sel,
     g_hdr_app_len        => c_rdma_demo_roce_hdr_len + c_rdma_demo_roce_icrc_len, -- Add icrc length here as this generic is used to calculate the total packet length.
     g_remove_crc         => false
   )
diff --git a/libraries/io/eth/src/vhdl/eth_tester.vhd b/libraries/io/eth/src/vhdl/eth_tester.vhd
index 8f103fe663..51aeb7a357 100644
--- a/libraries/io/eth/src/vhdl/eth_tester.vhd
+++ b/libraries/io/eth/src/vhdl/eth_tester.vhd
@@ -45,6 +45,7 @@ entity eth_tester is
     g_use_eth_header     : boolean  := true;
     g_use_ip_udp_header  : boolean  := true;
     g_use_dp_header      : boolean  := true;
+    g_hdr_calc_ip_crc    : boolean  := false;
     g_hdr_field_arr      : t_common_field_arr := c_eth_tester_hdr_field_arr;
     g_hdr_field_sel      : std_logic_vector   := c_eth_tester_hdr_field_sel;
     g_hdr_app_len        : natural := c_eth_tester_app_hdr_len;
@@ -130,6 +131,7 @@ begin
       g_use_eth_header     => g_use_eth_header,
       g_use_ip_udp_header  => g_use_ip_udp_header,
       g_use_dp_header      => g_use_dp_header,
+      g_hdr_calc_ip_crc    => g_hdr_calc_ip_crc,
       g_hdr_field_arr      => g_hdr_field_arr,
       g_hdr_field_sel      => g_hdr_field_sel,
       g_hdr_app_len        => g_hdr_app_len
diff --git a/libraries/io/eth/src/vhdl/eth_tester_tx.vhd b/libraries/io/eth/src/vhdl/eth_tester_tx.vhd
index d7d42c170b..43d049dcd8 100644
--- a/libraries/io/eth/src/vhdl/eth_tester_tx.vhd
+++ b/libraries/io/eth/src/vhdl/eth_tester_tx.vhd
@@ -51,6 +51,7 @@ entity eth_tester_tx is
     g_use_eth_header      : boolean  := true;
     g_use_ip_udp_header   : boolean  := true;
     g_use_dp_header       : boolean  := true;
+    g_hdr_calc_ip_crc     : boolean  := false;
     g_hdr_field_arr       : t_common_field_arr := c_eth_tester_hdr_field_arr;
     g_hdr_field_sel       : std_logic_vector   := c_eth_tester_hdr_field_sel;
     g_hdr_app_len         : natural := c_eth_tester_app_hdr_len
@@ -110,6 +111,7 @@ architecture str of eth_tester_tx is
   constant c_out_data_w           : natural := g_nof_octet_output * c_octet_w;
   constant c_nof_symbols_max      : natural := c_network_eth_payload_jumbo_max;
   constant c_use_split            : boolean := sel_a_b(g_nof_octet_generate > 1, true, false);
+  constant c_hdr_calc_ip_crc      : boolean := g_use_ip_udp_header and g_hdr_calc_ip_crc;
 
   signal ip_total_length          : natural;
   signal udp_total_length         : natural;
@@ -135,6 +137,8 @@ architecture str of eth_tester_tx is
   signal i_tx_fifo_rd_emp         : std_logic;
   signal tx_offload_siso          : t_dp_siso;
   signal tx_offload_sosi          : t_dp_sosi;
+  signal tx_offload_frame_siso    : t_dp_siso;
+  signal tx_offload_frame_sosi    : t_dp_sosi;
 
   signal i_ref_sync               : std_logic := '0';
   signal in_strobe_arr            : std_logic_vector(c_nof_total_counts - 1 downto 0);
@@ -391,6 +395,33 @@ begin
   hdr_fields_rec_in <= func_eth_tester_map_header(hdr_fields_slv_in);
   hdr_fields_rec_tx <= func_eth_tester_map_header(hdr_fields_slv_tx);
 
+  -------------------------------------------------------------------------------
+  -- IP header checksum
+  -------------------------------------------------------------------------------
+  gen_ip_crc : if c_hdr_calc_ip_crc generate
+    u_eth_ip_header_checksum : entity work.eth_ip_header_checksum
+    generic map (
+      g_data_w        => c_out_data_w,
+      g_hdr_field_arr => g_hdr_field_arr
+    )
+    port map (
+      rst               => st_rst,
+      clk               => st_clk,
+  
+      snk_in            => tx_offload_sosi,
+      snk_out           => tx_offload_siso, 
+  
+      src_out           => tx_offload_frame_sosi,
+      src_in            => tx_offload_frame_siso, 
+  
+      hdr_fields_slv_in => hdr_fields_slv_tx
+    );
+  end generate;
+
+  gen_no_ip_crc : if not c_hdr_calc_ip_crc generate
+    tx_offload_frame_sosi <= tx_offload_sosi;
+    tx_offload_siso       <= tx_offload_frame_siso;
+  end generate;
 
   -------------------------------------------------------------------------------
   -- dp_pipeline_ready to ease timing closure
@@ -400,8 +431,8 @@ begin
     rst     => st_rst,
     clk     => st_clk,
 
-    snk_out => tx_offload_siso,
-    snk_in  => tx_offload_sosi,
+    snk_out => tx_offload_frame_siso,
+    snk_in  => tx_offload_frame_sosi,
     src_in  => tx_udp_siso,
     src_out => i_tx_udp_sosi
   );
-- 
GitLab