Skip to content
Snippets Groups Projects
Commit 43910d1c authored by Reinier van der Walle's avatar Reinier van der Walle
Browse files

added icmp checksum calculation

parent 57a3042b
Branches
No related tags found
1 merge request!208added icmp checksum calculation
Pipeline #25633 failed
......@@ -187,6 +187,8 @@ BEGIN
nxt_hdr_response_arr <= func_network_total_header_response_arp( rcv_hdr_words_arr, reg_config.mac_address, reg_config.ip_address);
ELSIF rcv_hdr_status.is_icmp='1' THEN
nxt_hdr_response_arr <= func_network_total_header_response_icmp(rcv_hdr_words_arr, reg_config.mac_address);
-- Calculate icmp checksum = original checksum + 0x0800.
nxt_hdr_response_arr(9)(c_halfword_w-1 DOWNTO 0) <= TO_UVEC( 2048 + TO_UINT(rcv_hdr_words_arr(9)(c_halfword_w-1 DOWNTO 0)), c_halfword_w);
ELSIF rcv_hdr_status.is_udp='1' THEN
nxt_hdr_response_arr <= func_network_total_header_response_udp( rcv_hdr_words_arr, reg_config.mac_address);
ELSIF rcv_hdr_status.is_ip='1' THEN
......
......@@ -181,9 +181,13 @@ ARCHITECTURE tb OF tb_eth IS
checksum => TO_UVEC(c_network_icmp_checksum, c_network_icmp_checksum_w), -- init value
id => TO_UVEC(c_network_icmp_id, c_network_icmp_id_w),
sequence => TO_UVEC(c_network_icmp_sequence, c_network_icmp_sequence_w));
-- checksum is 0x0800 + original checksum
CONSTANT c_exp_icmp_checksum : STD_LOGIC_VECTOR(c_network_icmp_checksum_w-1 DOWNTO 0) := TO_UVEC( 2048 + TO_UINT(c_tx_icmp_header.checksum), c_network_icmp_checksum_w);
CONSTANT c_exp_icmp_header : t_network_icmp_header := (msg_type => TO_UVEC(c_network_icmp_msg_type_reply, c_network_icmp_msg_type_w), -- ping reply
code => c_tx_icmp_header.code,
checksum => c_tx_icmp_header.checksum, -- init value
checksum => c_exp_icmp_checksum,
id => c_tx_icmp_header.id,
sequence => c_tx_icmp_header.sequence);
......
......@@ -181,9 +181,13 @@ ARCHITECTURE tb OF tb_eth1g IS
checksum => TO_UVEC(c_network_icmp_checksum, c_network_icmp_checksum_w), -- init value
id => TO_UVEC(c_network_icmp_id, c_network_icmp_id_w),
sequence => TO_UVEC(c_network_icmp_sequence, c_network_icmp_sequence_w));
-- checksum is 0x0800 + original checksum
CONSTANT c_exp_icmp_checksum : STD_LOGIC_VECTOR(c_network_icmp_checksum_w-1 DOWNTO 0) := TO_UVEC( 2048 + TO_UINT(c_tx_icmp_header.checksum), c_network_icmp_checksum_w);
CONSTANT c_exp_icmp_header : t_network_icmp_header := (msg_type => TO_UVEC(c_network_icmp_msg_type_reply, c_network_icmp_msg_type_w), -- ping reply
code => c_tx_icmp_header.code,
checksum => c_tx_icmp_header.checksum, -- init value
checksum => c_exp_icmp_checksum,
id => c_tx_icmp_header.id,
sequence => c_tx_icmp_header.sequence);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment