diff --git a/libraries/base/common/src/vhdl/common_network_total_header_pkg.vhd b/libraries/base/common/src/vhdl/common_network_total_header_pkg.vhd index 9b4d2ef5dc03eebc44fe63d7ec552e4aa4fd0d6c..8212c0edaec24764c83ede03f2fecaaa3fe9605f 100644 --- a/libraries/base/common/src/vhdl/common_network_total_header_pkg.vhd +++ b/libraries/base/common/src/vhdl/common_network_total_header_pkg.vhd @@ -21,7 +21,28 @@ ------------------------------------------------------------------------------- -- Purpose: Map the fields of network headers on to a total header array of words - +-- Description: +-- +-- * 32b, word align = 2 octets +-- wi: |0 1 2 3 |4 5 6 7 8 | 9 10 | ... +-- octet: |---------------------------------|--------- +-- 0 |x | | | +-- 1 |x eth | ipv4 | udp | udp payload +-- 2 | 14 | 20 | 8 | +-- 3 | | | | +-- +-- * 64b, word align = 6 octets +-- wi: |0 1 2 |3 4 |5 | ... +-- octet: |-----------------|--------- +-- 0 |x | | | +-- 1 |x eth |ipv4 |u | udp payload +-- 2 |x 14 | 20 |d | +-- 3 |x ___| |p | +-- 4 |x | |8 | +-- 5 |x | | | +-- 6 | | | | +-- 7 | | | | +-- LIBRARY IEEE; USE IEEE.std_logic_1164.ALL; USE IEEE.numeric_std.ALL; @@ -30,24 +51,101 @@ USE work.common_network_layers_pkg.ALL; PACKAGE common_network_total_header_pkg IS - -- All relevant packets in common_network_layers_pkg (arp, ipv4/icmp, ipv4/udp) have the same total header length - CONSTANT c_network_total_header_len : NATURAL := 42; + -- Define total network header that fits all relevant packets in common_network_layers_pkg, because they have the same total header length + CONSTANT c_network_total_header_arp_len : NATURAL := c_network_eth_header_len + c_network_arp_data_len; -- = 14 + 28 = 42 + CONSTANT c_network_total_header_icmp_len : NATURAL := c_network_eth_header_len + c_network_ip_header_len + c_network_icmp_header_len; -- = 14 + 20 + 8 = 42 + CONSTANT c_network_total_header_udp_len : NATURAL := c_network_eth_header_len + c_network_ip_header_len + c_network_udp_header_len; -- = 14 + 20 + 8 = 42 + + CONSTANT c_network_total_header_len : NATURAL := 42; + + ----------------------------------------------------------------------------- + -- Aggregate all supported network headers into one record + ----------------------------------------------------------------------------- + + TYPE t_network_total_header IS RECORD + eth : t_network_eth_header; + arp : t_network_arp_packet; + ip : t_network_ip_header; + icmp : t_network_icmp_header; + udp : t_network_udp_header; + END RECORD; + - -- Map total network header in 32b or 64b words - CONSTANT c_network_total_header_32b_align_len : NATURAL := 2; -- c_network_eth_header_len + 2 = 16, to align eth, ip and udp payload to 32 bit boundaries + ----------------------------------------------------------------------------- + -- Map total network header in words array + ----------------------------------------------------------------------------- + + CONSTANT c_network_total_header_32b_align_len : NATURAL := 2; -- to align eth, ip and udp payload to 32 bit boundaries CONSTANT c_network_total_header_32b_align_w : NATURAL := c_network_total_header_32b_align_len*c_8; - CONSTANT c_network_total_header_64b_align_len : NATURAL := 6; -- c_network_eth_header_len + 2 = 16, to align eth, ip and udp payload to 32 bit boundaries and - CONSTANT c_network_total_header_64b_align_w : NATURAL := c_network_total_header_64b_align_len*c_8; -- udp payload to 64 bit boundaries + CONSTANT c_network_total_header_64b_align_len : NATURAL := 6; -- to align eth, ip and udp payload to 32 bit boundaries and + CONSTANT c_network_total_header_64b_align_w : NATURAL := c_network_total_header_64b_align_len*c_8; -- udp payload to 64 bit boundaries + + CONSTANT c_network_total_header_32b_nof_words : NATURAL := (c_network_total_header_32b_align_len + c_network_total_header_len)/4; -- = 44 / c_word_sz = 11 + CONSTANT c_network_total_header_64b_nof_words : NATURAL := (c_network_total_header_64b_align_len + c_network_total_header_len)/8; -- = 48 / c_longword_sz = 6 - CONSTANT c_network_total_header_nof_32b : NATURAL := (c_network_total_header_32b_align_len + c_network_total_header_len)/4; -- = 44 / c_word_sz = 11 - CONSTANT c_network_total_header_nof_64b : NATURAL := (c_network_total_header_64b_align_len + c_network_total_header_len)/8; -- = 48 / c_longword_sz = 6 + TYPE t_network_total_header_32b_arr IS ARRAY(0 TO c_network_total_header_32b_nof_words-1) OF STD_LOGIC_VECTOR(c_32-1 DOWNTO 0); + TYPE t_network_total_header_64b_arr IS ARRAY(0 TO c_network_total_header_64b_nof_words-1) OF STD_LOGIC_VECTOR(c_64-1 DOWNTO 0); - TYPE t_network_total_header_32b_arr IS ARRAY(0 TO c_network_total_header_nof_32b-1) OF STD_LOGIC_VECTOR(c_32-1 DOWNTO 0); - TYPE t_network_total_header_64b_arr IS ARRAY(0 TO c_network_total_header_nof_64b-1) OF STD_LOGIC_VECTOR(c_64-1 DOWNTO 0); + -- Word indices in the total header array to know when the field in the mapped record is valid + CONSTANT c_network_total_header_32b_eth_lo_wi : NATURAL := 0; -- first word index + CONSTANT c_network_total_header_32b_eth_dst_mac_wi : NATURAL := 1; + CONSTANT c_network_total_header_32b_eth_src_mac_wi : NATURAL := 3; + CONSTANT c_network_total_header_32b_eth_type_wi : NATURAL := 3; + CONSTANT c_network_total_header_32b_eth_hi_wi : NATURAL := 3; -- last word index + CONSTANT c_network_total_header_32b_eth_nof_words : NATURAL := c_network_total_header_32b_eth_hi_wi - c_network_total_header_32b_eth_lo_wi + 1; + + CONSTANT c_network_total_header_32b_ip_lo_wi : NATURAL := 4; -- first word index + CONSTANT c_network_total_header_32b_ip_version_wi : NATURAL := 4; + CONSTANT c_network_total_header_32b_ip_header_length_wi : NATURAL := 4; + CONSTANT c_network_total_header_32b_ip_services_wi : NATURAL := 4; + CONSTANT c_network_total_header_32b_ip_total_length_wi : NATURAL := 4; + CONSTANT c_network_total_header_32b_ip_identification_wi : NATURAL := 5; + CONSTANT c_network_total_header_32b_ip_flags_wi : NATURAL := 5; + CONSTANT c_network_total_header_32b_ip_fragment_offset_wi : NATURAL := 5; + CONSTANT c_network_total_header_32b_ip_time_to_live_wi : NATURAL := 6; + CONSTANT c_network_total_header_32b_ip_protocol_wi : NATURAL := 6; + CONSTANT c_network_total_header_32b_ip_header_checksum_wi : NATURAL := 6; + CONSTANT c_network_total_header_32b_ip_src_ip_addr_wi : NATURAL := 7; + CONSTANT c_network_total_header_32b_ip_dst_ip_addr_wi : NATURAL := 8; + CONSTANT c_network_total_header_32b_ip_hi_wi : NATURAL := 8; -- last word index + CONSTANT c_network_total_header_32b_ip_nof_words : NATURAL := c_network_total_header_32b_ip_hi_wi - c_network_total_header_32b_ip_lo_wi + 1; + + CONSTANT c_network_total_header_32b_arp_lo_wi : NATURAL := 4; -- first word index + CONSTANT c_network_total_header_32b_arp_htype_wi : NATURAL := 4; + CONSTANT c_network_total_header_32b_arp_ptype_wi : NATURAL := 4; + CONSTANT c_network_total_header_32b_arp_hlen_wi : NATURAL := 5; + CONSTANT c_network_total_header_32b_arp_plen_wi : NATURAL := 5; + CONSTANT c_network_total_header_32b_arp_oper_wi : NATURAL := 5; + CONSTANT c_network_total_header_32b_arp_sha_wi : NATURAL := 7; + CONSTANT c_network_total_header_32b_arp_spa_wi : NATURAL := 8; + CONSTANT c_network_total_header_32b_arp_tha_wi : NATURAL := 9; + CONSTANT c_network_total_header_32b_arp_tpa_wi : NATURAL := 10; + CONSTANT c_network_total_header_32b_arp_hi_wi : NATURAL := 10; -- last word index + CONSTANT c_network_total_header_32b_arp_nof_words : NATURAL := c_network_total_header_32b_arp_hi_wi - c_network_total_header_32b_arp_lo_wi + 1; + + CONSTANT c_network_total_header_32b_icmp_lo_wi : NATURAL := 9; -- first word index + CONSTANT c_network_total_header_32b_icmp_msg_type_wi : NATURAL := 9; + CONSTANT c_network_total_header_32b_icmp_code_wi : NATURAL := 9; + CONSTANT c_network_total_header_32b_icmp_checksum_wi : NATURAL := 9; + CONSTANT c_network_total_header_32b_icmp_id_wi : NATURAL := 10; + CONSTANT c_network_total_header_32b_icmp_sequence_wi : NATURAL := 10; + CONSTANT c_network_total_header_32b_icmp_hi_wi : NATURAL := 10; -- last word index + CONSTANT c_network_total_header_32b_icmp_nof_words : NATURAL := c_network_total_header_32b_icmp_hi_wi - c_network_total_header_32b_icmp_lo_wi + 1; + + CONSTANT c_network_total_header_32b_udp_lo_wi : NATURAL := 9; -- first word index + CONSTANT c_network_total_header_32b_udp_src_port_wi : NATURAL := 9; + CONSTANT c_network_total_header_32b_udp_dst_port_wi : NATURAL := 9; + CONSTANT c_network_total_header_32b_udp_total_length_wi : NATURAL := 10; + CONSTANT c_network_total_header_32b_udp_checksum_wi : NATURAL := 10; + CONSTANT c_network_total_header_32b_udp_hi_wi : NATURAL := 10; -- last word index + CONSTANT c_network_total_header_32b_udp_nof_words : NATURAL := c_network_total_header_32b_udp_hi_wi - c_network_total_header_32b_udp_lo_wi + 1; + + ----------------------------------------------------------------------------- + -- Functions to map between header record fields and header words array + ----------------------------------------------------------------------------- - -- Combinatorial map of the total header array on to a network header record - -- Type casting an array to a record is not possible, so therefore we need these functions + -- Combinatorial map of the total header array on to a network header record (type casting an array to a record is not possible, so therefore we need these functions) FUNCTION func_network_total_header_extract_eth( hdr_arr : t_network_total_header_32b_arr) RETURN t_network_eth_header; FUNCTION func_network_total_header_extract_ip( hdr_arr : t_network_total_header_32b_arr) RETURN t_network_ip_header; FUNCTION func_network_total_header_extract_arp( hdr_arr : t_network_total_header_32b_arr) RETURN t_network_arp_packet;