Skip to content
Snippets Groups Projects
Commit c4495161 authored by Eric Kooistra's avatar Eric Kooistra
Browse files

Removed p_mm_offload because c_udp_src_port, c_ip_src_addr and c_eth_src_mac...

Removed p_mm_offload because c_udp_src_port, c_ip_src_addr and c_eth_src_mac are set via data path. Use func_sdp_verify_stat_header() and exp_sdp_stat_header in p_verify_header. Use func_sdp_get_stat_* to determine header field parameters.
parent 6c6686be
No related branches found
No related tags found
1 merge request!175Added t_sdp_sim. Add func_sdp_get_stat_*() functions to determine the header...
......@@ -44,6 +44,7 @@ USE common_lib.common_field_pkg.ALL;
USE common_lib.common_str_pkg.ALL;
USE dp_lib.dp_stream_pkg.ALL;
USE work.sdp_pkg.ALL;
USE work.tb_sdp_pkg.ALL;
ENTITY tb_sdp_statistics_offload IS
......@@ -73,21 +74,19 @@ ARCHITECTURE tb OF tb_sdp_statistics_offload IS
CONSTANT c_hdr_dat_mm_addr_ip_src_addr : NATURAL := 13;
CONSTANT c_hdr_dat_mm_addr_udp_src_port : NATURAL := 15;
-- Define SST RAM structure.
CONSTANT c_data_size : NATURAL := 2;
CONSTANT c_nof_data_per_step : NATURAL := 2;
CONSTANT c_step_size : NATURAL := sel_a_b(g_statistics_type="BST", c_data_size,
sel_a_b(g_statistics_type="XST", c_data_size,
c_data_size * c_nof_data_per_step)); -- SST
CONSTANT c_nof_data : NATURAL := sel_a_b(g_statistics_type="BST", c_sdp_N_pol_bf * c_sdp_S_sub_bf,
sel_a_b(g_statistics_type="XST", c_sdp_S_pn * c_sdp_S_pn * c_nof_complex,
c_sdp_N_sub)); -- SST
-- header fields
CONSTANT c_nof_statistics_per_packet : NATURAL := func_sdp_get_stat_nof_statistics_per_packet(g_statistics_type);
CONSTANT c_udp_total_length : NATURAL := func_sdp_get_stat_udp_total_length(g_statistics_type);
CONSTANT c_ip_total_length : NATURAL := func_sdp_get_stat_ip_total_length(g_statistics_type);
CONSTANT c_marker : NATURAL := func_sdp_get_stat_marker(g_statistics_type);
CONSTANT c_nof_signal_inputs : NATURAL := func_sdp_get_stat_nof_signal_inputs(g_statistics_type);
CONSTANT c_nof_packets : NATURAL := func_sdp_get_stat_nof_packets(g_statistics_type, c_sdp_S_pn, g_P_sq);
CONSTANT c_nof_packets : NATURAL := sel_a_b(g_statistics_type="BST", 1,
sel_a_b(g_statistics_type="XST", g_P_sq,
c_sdp_S_pn)); -- SST
CONSTANT c_beamlet_id : NATURAL := g_beamset_id * c_sdp_S_sub_bf;
-- payload data
CONSTANT c_data_size : NATURAL := 2;
CONSTANT c_nof_data : NATURAL := c_nof_statistics_per_packet;
-- Define SST RAM size for c_nof_packets.
CONSTANT c_ram_size : NATURAL := c_nof_data * c_data_size * c_nof_packets;
......@@ -96,28 +95,8 @@ ARCHITECTURE tb OF tb_sdp_statistics_offload IS
CONSTANT c_ram_buf : t_c_mem := (1, c_ram_w, 32, 2**c_ram_w, 'X');
-- Define block timing.
CONSTANT c_nof_block_per_sync : NATURAL := 80; -- Sufficient to fit more than c_nof_packets offload packets per sync interval.
CONSTANT c_nof_clk_per_block : NATURAL := c_nof_data * c_data_size;
-- Based on g_statistics_type: 'S'=0x53="SST", 'B'=0x42="BST", 'X'=0x58="XST".
CONSTANT c_marker : NATURAL := sel_a_b(g_statistics_type="BST", c_sdp_marker_bst,
sel_a_b(g_statistics_type="XST", c_sdp_marker_xst,
c_sdp_marker_sst)); -- SST
CONSTANT c_nof_signal_inputs : NATURAL := sel_a_b(g_statistics_type="BST", 0,
sel_a_b(g_statistics_type="XST", c_sdp_S_pn,
1)); -- SST
CONSTANT c_nof_statistics_per_packet : NATURAL := sel_a_b(g_statistics_type="BST", c_sdp_N_pol_bf * c_sdp_S_sub_bf,
sel_a_b(g_statistics_type="XST", (c_sdp_S_pn * c_sdp_S_pn * c_nof_complex),
c_sdp_N_sub)); -- SST
CONSTANT c_beamlet_id : NATURAL := g_beamset_id * c_sdp_S_sub_bf;
CONSTANT c_app_total_length : NATURAL := c_sdp_stat_app_header_len + c_nof_data * c_longword_sz;
CONSTANT c_udp_total_length : NATURAL := c_app_total_length + c_network_udp_header_len;
CONSTANT c_ip_total_length : NATURAL := c_app_total_length + c_network_udp_header_len + c_network_ip_header_len;
CONSTANT c_nof_block_per_sync : NATURAL := 80; -- Sufficient to fit more than c_nof_packets offload packets per sync interval.
CONSTANT c_nof_clk_per_block : NATURAL := c_nof_data * c_data_size;
CONSTANT c_nof_valid_per_block : NATURAL := c_nof_data * c_data_size;
CONSTANT c_nof_sync : NATURAL := 5;
CONSTANT c_nof_clk_per_sync : NATURAL := c_nof_block_per_sync * c_nof_clk_per_block;
......@@ -151,6 +130,8 @@ ARCHITECTURE tb OF tb_sdp_statistics_offload IS
SIGNAL rx_hdr_fields_out : STD_LOGIC_VECTOR(1023 DOWNTO 0);
SIGNAL rx_hdr_fields_raw : STD_LOGIC_VECTOR(1023 DOWNTO 0) := (OTHERS => '0');
SIGNAL rx_sdp_stat_header : t_sdp_stat_header;
SIGNAL exp_sdp_stat_header : t_sdp_stat_header;
-- Signals used to change settings of sdp_info.
SIGNAL gn_index : NATURAL := 1; -- select > 0 to see effect of g_offload_time
......@@ -170,6 +151,8 @@ ARCHITECTURE tb OF tb_sdp_statistics_offload IS
x"1400" -- block_period = 5120
);
SIGNAL subband_calibrated_flag : STD_LOGIC := '0';
-- Signals used for starting processes.
SIGNAL ram_wr_data : STD_LOGIC_VECTOR(c_ram_buf.dat_w-1 DOWNTO 0);
SIGNAL ram_wr_addr : STD_LOGIC_VECTOR(c_ram_buf.adr_w-1 DOWNTO 0);
......@@ -202,11 +185,11 @@ BEGIN
ram_wr_data <= TO_UVEC(i, c_ram_buf.dat_w);
ram_wr_en <= '1';
proc_common_wait_some_cycles(mm_clk, 1);
END LOOP;
END LOOP;
ram_wr_en <= '0';
proc_common_wait_until_high(dp_clk, in_sosi.sync);
init_ram_done <= '1';
init_ram_done <= '1';
WAIT;
END PROCESS;
......@@ -214,7 +197,7 @@ BEGIN
BEGIN
proc_common_wait_until_high(mm_clk, init_ram_done);
-- Enable common variabel delay.
proc_mem_mm_bus_wr(c_reg_enable_mm_addr_enable, 1, mm_clk, enable_miso, enable_mosi);
proc_mem_mm_bus_wr(c_reg_enable_mm_addr_enable, 1, mm_clk, enable_miso, enable_mosi);
proc_common_wait_some_cycles(mm_clk, c_cross_clock_domain_latency);
WAIT;
END PROCESS;
......@@ -245,7 +228,7 @@ BEGIN
END IF;
IF j = c_nof_clk_per_block-1 THEN
in_sosi.eop <= '1';
END IF;
END IF;
proc_common_wait_some_cycles(dp_clk, 1);
END LOOP;
END LOOP;
......@@ -253,10 +236,78 @@ BEGIN
WAIT;
END PROCESS;
p_exp_sdp_stat_header : PROCESS(sdp_info, subband_calibrated_flag, gn_index, rx_block_cnt)
BEGIN
-- eth header
exp_sdp_stat_header.eth.dst_mac <= c_sdp_stat_eth_dst_mac;
exp_sdp_stat_header.eth.src_mac <= c_eth_src_mac;
exp_sdp_stat_header.eth.eth_type <= x"0800";
-- ip header
exp_sdp_stat_header.ip.version <= TO_UVEC( 4, c_network_ip_version_w);
exp_sdp_stat_header.ip.header_length <= TO_UVEC( 5, c_network_ip_header_length_w);
exp_sdp_stat_header.ip.services <= TO_UVEC( 0, c_network_ip_services_w);
exp_sdp_stat_header.ip.total_length <= TO_UVEC(c_ip_total_length, c_network_ip_total_length_w);
exp_sdp_stat_header.ip.identification <= TO_UVEC( 0, c_network_ip_identification_w);
exp_sdp_stat_header.ip.flags <= TO_UVEC( 2, c_network_ip_flags_w);
exp_sdp_stat_header.ip.fragment_offset <= TO_UVEC( 0, c_network_ip_fragment_offset_w);
exp_sdp_stat_header.ip.time_to_live <= TO_UVEC( 127, c_network_ip_time_to_live_w);
exp_sdp_stat_header.ip.protocol <= TO_UVEC( 17, c_network_ip_protocol_w);
exp_sdp_stat_header.ip.header_checksum <= TO_UVEC( 0, c_network_ip_header_checksum_w);
exp_sdp_stat_header.ip.src_ip_addr <= c_ip_src_addr; -- c_network_ip_addr_w
exp_sdp_stat_header.ip.dst_ip_addr <= c_sdp_stat_ip_dst_addr; -- c_network_ip_addr_w
-- udp header
exp_sdp_stat_header.udp.src_port <= c_udp_src_port;
exp_sdp_stat_header.udp.dst_port <= TO_UVEC( 5001, c_network_udp_port_w);
exp_sdp_stat_header.udp.total_length <= TO_UVEC(c_udp_total_length, c_network_udp_port_w);
exp_sdp_stat_header.udp.checksum <= TO_UVEC( 0, c_network_udp_checksum_w);
-- app header
exp_sdp_stat_header.app.sdp_marker <= TO_UVEC(c_marker, 8);
exp_sdp_stat_header.app.sdp_version_id <= TO_UVEC(c_sdp_stat_version_id, 8);
exp_sdp_stat_header.app.sdp_observation_id <= sdp_info.observation_id;
exp_sdp_stat_header.app.sdp_station_id <= sdp_info.station_id;
exp_sdp_stat_header.app.sdp_source_info_antenna_band_id <= slv(sdp_info.antenna_band_index);
exp_sdp_stat_header.app.sdp_source_info_nyquist_zone_id <= sdp_info.nyquist_zone_index;
exp_sdp_stat_header.app.sdp_source_info_f_adc <= slv(sdp_info.f_adc);
exp_sdp_stat_header.app.sdp_source_info_fsub_type <= slv(sdp_info.fsub_type);
exp_sdp_stat_header.app.sdp_source_info_payload_error <= TO_UVEC(0, 1);
exp_sdp_stat_header.app.sdp_source_info_beam_repositioning_flag <= slv(sdp_info.beam_repositioning_flag);
exp_sdp_stat_header.app.sdp_source_info_subband_calibrated_flag <= slv(subband_calibrated_flag);
exp_sdp_stat_header.app.sdp_source_info_reserved <= TO_UVEC(0, 3);
exp_sdp_stat_header.app.sdp_source_info_gn_id <= TO_UVEC(gn_index, 5);
exp_sdp_stat_header.app.sdp_reserved <= TO_UVEC( 0, 8);
exp_sdp_stat_header.app.sdp_integration_interval <= TO_UVEC(c_nof_block_per_sync, 24);
IF g_statistics_type = "SST" THEN
exp_sdp_stat_header.app.sdp_data_id <= TO_UVEC(rx_block_cnt + c_sdp_S_pn * gn_index, 32);
exp_sdp_stat_header.app.sdp_data_id_sst_signal_input_index <= TO_UVEC(rx_block_cnt + c_sdp_S_pn * gn_index, 8);
ELSIF g_statistics_type = "BST" THEN
exp_sdp_stat_header.app.sdp_data_id <= TO_UVEC(c_beamlet_id, 32);
exp_sdp_stat_header.app.sdp_data_id_bst_beamlet_index <= TO_UVEC(c_beamlet_id, 16);
ELSIF g_statistics_type = "XST" THEN
exp_sdp_stat_header.app.sdp_data_id <= TO_UVEC(0, 7) & TO_UVEC(0, 9) & TO_UVEC(0, 8) & TO_UVEC(0, 8); -- TODO
exp_sdp_stat_header.app.sdp_data_id_xst_subband_index <= TO_UVEC(0, 9); -- TODO
exp_sdp_stat_header.app.sdp_data_id_xst_signal_input_A_index <= TO_UVEC(0, 8); -- TODO
exp_sdp_stat_header.app.sdp_data_id_xst_signal_input_B_index <= TO_UVEC(0, 8); -- TODO
END IF;
exp_sdp_stat_header.app.sdp_nof_signal_inputs <= TO_UVEC( c_nof_signal_inputs, 8);
exp_sdp_stat_header.app.sdp_nof_bytes_per_statistics <= TO_UVEC( 8, 8);
exp_sdp_stat_header.app.sdp_nof_statistics_per_packet <= TO_UVEC(c_nof_statistics_per_packet, 16);
exp_sdp_stat_header.app.sdp_block_period <= sdp_info.block_period;
exp_sdp_stat_header.app.dp_bsn <= TO_SVEC(-1, 64);
END PROCESS;
rx_sdp_stat_header <= func_sdp_extract_stat_header(rx_hdr_fields_raw);
p_verify_header : PROCESS(test_offload_sosi)
VARIABLE v_bool : BOOLEAN;
BEGIN
IF test_offload_sosi.eop = '1' THEN
-- bsn is not fully received (bit 0-15 is missing) because 32 bit allignment not working in dp_offload_rx.vhd.
-- bsn is not fully received (bit 0-15 is missing) because 32 bit allignment not working in dp_offload_rx.vhd.
-- Check fixed settings.
ASSERT rx_hdr_fields_raw(field_hi(c_sdp_stat_hdr_field_arr, "eth_dst_mac") DOWNTO field_lo(c_sdp_stat_hdr_field_arr, "eth_dst_mac")) = x"001B217176B9"
REPORT "wrong eth_dst_mac" SEVERITY ERROR;
......@@ -279,24 +330,24 @@ BEGIN
ASSERT rx_hdr_fields_raw(field_hi(c_sdp_stat_hdr_field_arr, "ip_time_to_live") DOWNTO field_lo(c_sdp_stat_hdr_field_arr, "ip_time_to_live")) = TO_UVEC(127, 8)
REPORT "wrong ip_time_to_live" SEVERITY ERROR;
ASSERT rx_hdr_fields_raw(field_hi(c_sdp_stat_hdr_field_arr, "ip_protocol") DOWNTO field_lo(c_sdp_stat_hdr_field_arr, "ip_protocol")) = TO_UVEC(17, 8)
REPORT "wrong ip_protocol" SEVERITY ERROR;
REPORT "wrong ip_protocol" SEVERITY ERROR;
ASSERT rx_hdr_fields_raw(field_hi(c_sdp_stat_hdr_field_arr, "ip_dst_addr") DOWNTO field_lo(c_sdp_stat_hdr_field_arr, "ip_dst_addr")) = x"0A6300FE"
REPORT "wrong ip_dst_addr" SEVERITY ERROR;
ASSERT rx_hdr_fields_raw(field_hi(c_sdp_stat_hdr_field_arr, "udp_dst_port") DOWNTO field_lo(c_sdp_stat_hdr_field_arr, "udp_dst_port")) = TO_UVEC(5001, 16)
REPORT "wrong udp_dst_port" SEVERITY ERROR;
REPORT "wrong udp_dst_port" SEVERITY ERROR;
ASSERT rx_hdr_fields_raw(field_hi(c_sdp_stat_hdr_field_arr, "udp_total_length") DOWNTO field_lo(c_sdp_stat_hdr_field_arr, "udp_total_length")) = TO_UVEC(c_udp_total_length, 16)
REPORT "wrong udp_total_length" SEVERITY ERROR;
REPORT "wrong udp_total_length" SEVERITY ERROR;
ASSERT rx_hdr_fields_raw(field_hi(c_sdp_stat_hdr_field_arr, "sdp_version_id") DOWNTO field_lo(c_sdp_stat_hdr_field_arr, "sdp_version_id")) = TO_UVEC(5, 8)
REPORT "wrong sdp_version_id" SEVERITY ERROR;
REPORT "wrong sdp_version_id" SEVERITY ERROR;
-- Check settings set by mm interface in this test bench.
ASSERT rx_hdr_fields_raw(field_hi(c_sdp_stat_hdr_field_arr, "eth_src_mac") DOWNTO field_lo(c_sdp_stat_hdr_field_arr, "eth_src_mac")) = c_eth_src_mac
REPORT "wrong eth_src_mac" SEVERITY ERROR;
REPORT "wrong eth_src_mac" SEVERITY ERROR;
ASSERT rx_hdr_fields_raw(field_hi(c_sdp_stat_hdr_field_arr, "ip_src_addr") DOWNTO field_lo(c_sdp_stat_hdr_field_arr, "ip_src_addr")) = c_ip_src_addr
REPORT "wrong ip_src_addr" SEVERITY ERROR;
ASSERT rx_hdr_fields_raw(field_hi(c_sdp_stat_hdr_field_arr, "udp_src_port") DOWNTO field_lo(c_sdp_stat_hdr_field_arr, "udp_src_port")) = c_udp_src_port
REPORT "wrong udp_src_port" SEVERITY ERROR;
-- Check g_statistics_type settings set by sdp_statistics_offload.vhd.
ASSERT rx_hdr_fields_raw(field_hi(c_sdp_stat_hdr_field_arr, "sdp_marker") DOWNTO field_lo(c_sdp_stat_hdr_field_arr, "sdp_marker")) = TO_UVEC(c_marker, 8)
REPORT "wrong sdp_marker" SEVERITY ERROR;
......@@ -304,7 +355,7 @@ BEGIN
REPORT "wrong sdp_nof_signal_inputs" SEVERITY ERROR;
ASSERT rx_hdr_fields_raw(field_hi(c_sdp_stat_hdr_field_arr, "sdp_nof_statistics_per_packet") DOWNTO field_lo(c_sdp_stat_hdr_field_arr, "sdp_nof_statistics_per_packet")) = TO_UVEC(c_nof_statistics_per_packet, 16)
REPORT "wrong sdp_nof_statistics_per_packet: " SEVERITY ERROR;
-- Check some values from sdp_source_info.
ASSERT rx_hdr_fields_raw(field_hi(c_sdp_stat_hdr_field_arr, "sdp_observation_id") DOWNTO field_lo(c_sdp_stat_hdr_field_arr, "sdp_observation_id")) = sdp_info.observation_id
REPORT "wrong sdp_observation_id" SEVERITY ERROR;
......@@ -324,7 +375,7 @@ BEGIN
REPORT "wrong sdp_source_info_gn_id" SEVERITY ERROR;
ASSERT rx_hdr_fields_raw(field_hi(c_sdp_stat_hdr_field_arr, "sdp_block_period") DOWNTO field_lo(c_sdp_stat_hdr_field_arr, "sdp_block_period")) = sdp_info.block_period
REPORT "wrong sdp_block_period" SEVERITY ERROR;
-- Check variable header info.
ASSERT rx_hdr_fields_raw(field_hi(c_sdp_stat_hdr_field_arr, "sdp_integration_interval") DOWNTO field_lo(c_sdp_stat_hdr_field_arr, "sdp_integration_interval")) = TO_UVEC(c_nof_block_per_sync, 24)
REPORT "wrong sdp_integration_interval" SEVERITY ERROR;
......@@ -337,17 +388,20 @@ BEGIN
REPORT "wrong BST sdp_data_id" SEVERITY ERROR;
--ELSIF g_statistics_type = "XST" THEN --TODO: RW define check
END IF;
v_bool := func_sdp_verify_stat_header(g_statistics_type, rx_sdp_stat_header, exp_sdp_stat_header, sdp_info, rx_bsn);
END IF;
END PROCESS;
-- Count number of blocks in a sync interval.
-- There is no active test_offload_sosi.sync to restart the count. Therefore capture the in_sosi.sync in in_sync_hold, and
-- There is no active test_offload_sosi.sync to restart the count. Therefore capture the in_sosi.sync in in_sync_hold, and
-- use in_sync_hold with test_offload_sosi.sop to start counting blocks (packets) from 0, at the start of every sync interval.
p_rx_block_cnt : PROCESS(dp_clk)
BEGIN
IF rising_edge(dp_clk) THEN
IF test_offload_sosi.sop = '1' THEN
IF in_sync_hold = '1' THEN
IF in_sync_hold = '1' THEN
rx_block_cnt <= 0;
in_sync_hold <= '0';
ELSE
......@@ -370,11 +424,11 @@ BEGIN
BEGIN
IF rising_edge(dp_clk) THEN
IF init_ram_done = '1' THEN
IF in_sosi.sync = '1' AND rx_block_cnt > 0 THEN
ASSERT rx_block_cnt = c_nof_packets-1 REPORT "wrong number of blocks between 2 sync" SEVERITY ERROR;
END IF;
-- rx_prev_bsn > 0 is needed for the first time, when there is no previous BSN.
-- rx_bsn > rx_prev_bsn is needed to detect a new rx_bsn.
IF rx_prev_bsn > 0 AND rx_bsn > rx_prev_bsn THEN
......@@ -396,22 +450,6 @@ BEGIN
rx_valid_clk_cnt <= rx_valid_clk_cnt + 1;
END IF;
END IF;
END PROCESS;
p_mm_offload : PROCESS
BEGIN
proc_common_wait_until_low(mm_clk, mm_rst);
proc_common_wait_some_cycles(mm_clk, 10);
-- Write ethernet destinations via reg_hdr_dat_mosi.
proc_mem_mm_bus_wr(c_hdr_dat_mm_addr_udp_src_port, TO_UINT(c_udp_src_port), mm_clk, hdr_dat_miso, hdr_dat_mosi);
proc_common_wait_some_cycles(mm_clk, c_cross_clock_domain_latency);
proc_mem_mm_bus_wr(c_hdr_dat_mm_addr_ip_src_addr, TO_UINT(c_ip_src_addr), mm_clk, hdr_dat_miso, hdr_dat_mosi);
proc_common_wait_some_cycles(mm_clk, c_cross_clock_domain_latency);
proc_mem_mm_bus_wr(c_hdr_dat_mm_addr_eth_src_mac, TO_UINT(c_eth_src_mac), mm_clk, hdr_dat_miso, hdr_dat_mosi);
proc_common_wait_some_cycles(mm_clk, c_cross_clock_domain_latency);
WAIT;
END PROCESS;
p_dp_end : PROCESS
......@@ -441,7 +479,7 @@ BEGIN
rd_en_b => master_mosi.rd,
rd_dat_b => master_miso.rddata(c_ram_buf.dat_w-1 DOWNTO 0),
rd_val_b => master_miso.rdval
);
);
u_rx : ENTITY dp_lib.dp_offload_rx
GENERIC MAP (
......@@ -449,24 +487,24 @@ BEGIN
g_data_w => c_word_w,
g_hdr_field_arr => c_sdp_stat_hdr_field_arr,
g_remove_crc => FALSE,
g_crc_nof_words => 0
g_crc_nof_words => 0
)
PORT MAP (
mm_rst => mm_rst,
mm_clk => mm_clk,
dp_rst => dp_rst,
dp_clk => dp_clk,
reg_hdr_dat_mosi => offload_rx_hdr_dat_mosi,
reg_hdr_dat_miso => offload_rx_hdr_dat_miso,
snk_in_arr(0) => offload_sosi,
snk_out_arr(0) => offload_siso,
src_out_arr(0) => test_offload_sosi,
src_in_arr(0) => test_offload_siso,
hdr_fields_out_arr(0) => rx_hdr_fields_out,
hdr_fields_raw_arr(0) => rx_hdr_fields_raw
);
......@@ -495,8 +533,9 @@ BEGIN
reg_hdr_dat_mosi => hdr_dat_mosi,
reg_hdr_dat_miso => hdr_dat_miso,
sdp_info => sdp_info,
gn_index => gn_index,
sdp_info => sdp_info,
subband_calibrated_flag => subband_calibrated_flag,
gn_index => gn_index,
in_sosi => in_sosi,
out_sosi => offload_sosi,
......
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