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

Added c_network_total_header_32b_*_wi word indices in the total header array...

Added c_network_total_header_32b_*_wi word indices in the total header array to know when the field in the mapped record is valid.
parent 712ed3a9
No related branches found
No related tags found
No related merge requests found
...@@ -21,7 +21,28 @@ ...@@ -21,7 +21,28 @@
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
-- Purpose: Map the fields of network headers on to a total header array of words -- 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; LIBRARY IEEE;
USE IEEE.std_logic_1164.ALL; USE IEEE.std_logic_1164.ALL;
USE IEEE.numeric_std.ALL; USE IEEE.numeric_std.ALL;
...@@ -30,24 +51,101 @@ USE work.common_network_layers_pkg.ALL; ...@@ -30,24 +51,101 @@ USE work.common_network_layers_pkg.ALL;
PACKAGE common_network_total_header_pkg IS 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 -- 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; CONSTANT c_network_total_header_len : NATURAL := 42;
-- 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 -- Aggregate all supported network headers into one record
CONSTANT c_network_total_header_32b_align_w : NATURAL := c_network_total_header_32b_align_len*c_8; -----------------------------------------------------------------------------
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;
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_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 -- Map total network header in words array
-----------------------------------------------------------------------------
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); CONSTANT c_network_total_header_32b_align_len : NATURAL := 2; -- to align eth, ip and udp payload to 32 bit boundaries
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); 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; -- 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
-- Combinatorial map of the total header array on to a network header record 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
-- Type casting an array to a record is not possible, so therefore we need these functions 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
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);
-- 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)
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_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_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; FUNCTION func_network_total_header_extract_arp( hdr_arr : t_network_total_header_32b_arr) RETURN t_network_arp_packet;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment