From 785f5332ded199130f83ce5b51edff9c27a55bd6 Mon Sep 17 00:00:00 2001
From: Eric Kooistra <kooistra@astron.nl>
Date: Thu, 29 Sep 2022 14:36:03 +0200
Subject: [PATCH] Clarify use of c_sdp_cep_hdr_field_sel.

---
 .../sdp/src/vhdl/sdp_beamformer_output.vhd    | 59 ++++++++++++++++++-
 1 file changed, 58 insertions(+), 1 deletion(-)

diff --git a/applications/lofar2/libraries/sdp/src/vhdl/sdp_beamformer_output.vhd b/applications/lofar2/libraries/sdp/src/vhdl/sdp_beamformer_output.vhd
index 091abd86db..d41061f0c0 100644
--- a/applications/lofar2/libraries/sdp/src/vhdl/sdp_beamformer_output.vhd
+++ b/applications/lofar2/libraries/sdp/src/vhdl/sdp_beamformer_output.vhd
@@ -64,6 +64,7 @@ ENTITY sdp_beamformer_output IS
     beamlet_scale : IN STD_LOGIC_VECTOR(c_sdp_W_beamlet_scale-1 DOWNTO 0);
     gn_id         : IN STD_LOGIC_VECTOR(c_sdp_W_gn_id-1 DOWNTO 0);
 
+    -- Source MAC/IP/UDP are not used, c_sdp_cep_hdr_field_sel selects MM programmable instead
     eth_src_mac  : IN STD_LOGIC_VECTOR(c_network_eth_mac_addr_w-1 DOWNTO 0);
     ip_src_addr  : IN STD_LOGIC_VECTOR(c_network_ip_addr_w-1 DOWNTO 0);
     udp_src_port : IN STD_LOGIC_VECTOR(c_network_udp_port_w-1 DOWNTO 0);
@@ -204,6 +205,62 @@ BEGIN
   -------------------------------------------------------------------------------
   -- Assemble offload info
   -------------------------------------------------------------------------------
+  -- Whether the dp_offload_tx_hdr_fields value is actually used in the Tx header depends on c_sdp_cep_hdr_field_sel
+  -- . c_sdp_cep_hdr_field_sel = "111"&"111111111011"&"1110"&"1100"&"00000010"&"100110"&"0";
+  --                              eth   ip             udp    app
+  --   where 0 = data path, 1 = MM controlled. The '0' fields are assigned here via dp_offload_tx_hdr_fields.
+  --   in order:
+  --     access   field
+  --     MM       eth_dst_mac
+  --     MM       eth_src_mac
+  --     MM       eth_type
+  --
+  --     MM       ip_version
+  --     MM       ip_header_length
+  --     MM       ip_services
+  --     MM       ip_total_length
+  --     MM       ip_identification
+  --     MM       ip_flags
+  --     MM       ip_fragment_offset
+  --     MM       ip_time_to_live
+  --     MM       ip_protocol
+  --        DP    ip_header_checksum --> added by u_tr_10GbE_ip_checksum
+  --     MM       ip_src_addr
+  --     MM       ip_dst_addr
+  --
+  --     MM       udp_src_port
+  --     MM       udp_dst_port
+  --     MM       udp_total_length
+  --        DP    udp_checksum --> default fixed 0, so not used, not calculated here or in tr_10GbE
+  --                               because would require store and forward
+  --
+  --     MM       sdp_marker
+  --     MM       sdp_version_id
+  --        DP    sdp_observation_id
+  --        DP    sdp_station_id
+  --
+  --        DP    sdp_source_info_antenna_band_id
+  --        DP    sdp_source_info_nyquist_zone_id
+  --        DP    sdp_source_info_f_adc
+  --        DP    sdp_source_info_fsub_type
+  --        DP    sdp_source_info_payload_error
+  --        DP    sdp_source_info_repositioning_flag
+  --     MM       sdp_source_info_beamlet_width
+  --        DP    sdp_source_info_gn_id
+  --
+  --     MM       sdp_reserved
+  --        DP    sdp_beamlet_scale
+  --        DP    sdp_beamlet_index
+  --     MM       sdp_nof_blocks_per_packet
+  --     MM       sdp_nof_beamlets_per_block
+  --        DP    sdp_block_period
+  --
+  --        DP    dp_bsn
+
+  -- Use MM programmable source MAC/IP/UDP instead of source MAC/IP/UDP based on node ID. This is necessary because
+  -- beamlet packets from different stations must have different source MAC/IP/UDP.
+  -- Hence the eth_src_mac, udp_src_port and ip_src_addr are ignored, because c_sdp_cep_hdr_field_sel selects MM control,
+  -- but keep the code to be able to enable using them by just changing the selection bit.
   dp_offload_tx_hdr_fields(field_hi(c_sdp_cep_hdr_field_arr, "eth_src_mac" ) DOWNTO field_lo(c_sdp_cep_hdr_field_arr, "eth_src_mac" )) <= eth_src_mac;
   dp_offload_tx_hdr_fields(field_hi(c_sdp_cep_hdr_field_arr, "udp_src_port") DOWNTO field_lo(c_sdp_cep_hdr_field_arr, "udp_src_port")) <= udp_src_port;
   dp_offload_tx_hdr_fields(field_hi(c_sdp_cep_hdr_field_arr, "ip_src_addr" ) DOWNTO field_lo(c_sdp_cep_hdr_field_arr, "ip_src_addr" )) <= ip_src_addr;
@@ -217,7 +274,7 @@ BEGIN
   dp_offload_tx_hdr_fields(field_hi(c_sdp_cep_hdr_field_arr, "sdp_source_info_payload_error"      ) DOWNTO field_lo(c_sdp_cep_hdr_field_arr,  "sdp_source_info_payload_error"      )) <= payload_err;
   dp_offload_tx_hdr_fields(field_hi(c_sdp_cep_hdr_field_arr, "sdp_source_info_repositioning_flag" ) DOWNTO field_lo(c_sdp_cep_hdr_field_arr,  "sdp_source_info_repositioning_flag" )) <= SLV(sdp_info.beam_repositioning_flag);
   dp_offload_tx_hdr_fields(field_hi(c_sdp_cep_hdr_field_arr, "sdp_source_info_gn_id"              ) DOWNTO field_lo(c_sdp_cep_hdr_field_arr,  "sdp_source_info_gn_id"              )) <= gn_id;
-  dp_offload_tx_hdr_fields(field_hi(c_sdp_cep_hdr_field_arr, "sdp_reserved"                       ) DOWNTO field_lo(c_sdp_cep_hdr_field_arr,  "sdp_reserved"                       )) <= (OTHERS => '0');
+
   dp_offload_tx_hdr_fields(field_hi(c_sdp_cep_hdr_field_arr, "sdp_beamlet_scale"                  ) DOWNTO field_lo(c_sdp_cep_hdr_field_arr,  "sdp_beamlet_scale"                  )) <= beamlet_scale;
   dp_offload_tx_hdr_fields(field_hi(c_sdp_cep_hdr_field_arr, "sdp_beamlet_index"                  ) DOWNTO field_lo(c_sdp_cep_hdr_field_arr,  "sdp_beamlet_index"                  )) <= TO_UVEC(c_beamlet_index, c_halfword_w);
   dp_offload_tx_hdr_fields(field_hi(c_sdp_cep_hdr_field_arr, "sdp_block_period"                   ) DOWNTO field_lo(c_sdp_cep_hdr_field_arr,  "sdp_block_period"                   )) <= sdp_info.block_period;
-- 
GitLab