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

Added network header functions

Added network header functions for headers without align field.
parent b4ed464b
No related branches found
No related tags found
2 merge requests!10Update branch to latest revision,!9Resolve L2SDP-23
......@@ -223,6 +223,18 @@ PACKAGE common_network_total_header_pkg IS
FUNCTION func_network_total_header_extract_udp( hdr_arr : t_network_total_header_32b_arr) RETURN t_network_udp_header;
FUNCTION func_network_total_header_extract_udp( hdr_arr : t_network_total_header_64b_arr) RETURN t_network_udp_header;
-- Combinatorial map just as above but for network packets without word align field.
FUNCTION func_network_total_header_no_align_extract_eth( hdr_arr : t_network_total_header_32b_arr) RETURN t_network_eth_header;
FUNCTION func_network_total_header_no_align_extract_eth( hdr_arr : t_network_total_header_64b_arr) RETURN t_network_eth_header;
FUNCTION func_network_total_header_no_align_extract_ip( hdr_arr : t_network_total_header_32b_arr) RETURN t_network_ip_header;
FUNCTION func_network_total_header_no_align_extract_ip( hdr_arr : t_network_total_header_64b_arr) RETURN t_network_ip_header;
FUNCTION func_network_total_header_no_align_extract_arp( hdr_arr : t_network_total_header_32b_arr) RETURN t_network_arp_packet;
FUNCTION func_network_total_header_no_align_extract_arp( hdr_arr : t_network_total_header_64b_arr) RETURN t_network_arp_packet;
FUNCTION func_network_total_header_no_align_extract_icmp(hdr_arr : t_network_total_header_32b_arr) RETURN t_network_icmp_header;
FUNCTION func_network_total_header_no_align_extract_icmp(hdr_arr : t_network_total_header_64b_arr) RETURN t_network_icmp_header;
FUNCTION func_network_total_header_no_align_extract_udp( hdr_arr : t_network_total_header_32b_arr) RETURN t_network_udp_header;
FUNCTION func_network_total_header_no_align_extract_udp( hdr_arr : t_network_total_header_64b_arr) RETURN t_network_udp_header;
-- Construct the total header array from the individual header records
FUNCTION func_network_total_header_construct_eth( eth : t_network_eth_header) RETURN t_network_total_header_32b_arr; -- sets unused words to zero
FUNCTION func_network_total_header_construct_eth( eth : t_network_eth_header) RETURN t_network_total_header_64b_arr; -- sets unused words to zero
......@@ -251,6 +263,25 @@ PACKAGE common_network_total_header_pkg IS
FUNCTION func_network_total_header_response_udp( udp_arr : t_network_total_header_32b_arr; mac_addr : STD_LOGIC_VECTOR(c_network_eth_mac_addr_w-1 DOWNTO 0)) RETURN t_network_total_header_32b_arr;
FUNCTION func_network_total_header_response_udp( udp_arr : t_network_total_header_64b_arr; mac_addr : STD_LOGIC_VECTOR(c_network_eth_mac_addr_w-1 DOWNTO 0)) RETURN t_network_total_header_64b_arr;
-- Construct the response total header array for a total header array without alignment bytes
FUNCTION func_network_total_header_no_align_response_eth( eth_arr : t_network_total_header_32b_arr; mac_addr : STD_LOGIC_VECTOR(c_network_eth_mac_addr_w-1 DOWNTO 0)) RETURN t_network_total_header_32b_arr;
FUNCTION func_network_total_header_no_align_response_eth( eth_arr : t_network_total_header_64b_arr; mac_addr : STD_LOGIC_VECTOR(c_network_eth_mac_addr_w-1 DOWNTO 0)) RETURN t_network_total_header_64b_arr;
FUNCTION func_network_total_header_no_align_response_arp( arp_arr : t_network_total_header_32b_arr; mac_addr : STD_LOGIC_VECTOR(c_network_eth_mac_addr_w-1 DOWNTO 0);
ip_addr : STD_LOGIC_VECTOR(c_network_ip_addr_w-1 DOWNTO 0))
RETURN t_network_total_header_32b_arr;
FUNCTION func_network_total_header_no_align_response_arp( arp_arr : t_network_total_header_64b_arr; mac_addr : STD_LOGIC_VECTOR(c_network_eth_mac_addr_w-1 DOWNTO 0);
ip_addr : STD_LOGIC_VECTOR(c_network_ip_addr_w-1 DOWNTO 0))
RETURN t_network_total_header_64b_arr;
FUNCTION func_network_total_header_no_align_response_ip( ip_arr : t_network_total_header_32b_arr; mac_addr : STD_LOGIC_VECTOR(c_network_eth_mac_addr_w-1 DOWNTO 0)) RETURN t_network_total_header_32b_arr;
FUNCTION func_network_total_header_no_align_response_ip( ip_arr : t_network_total_header_64b_arr; mac_addr : STD_LOGIC_VECTOR(c_network_eth_mac_addr_w-1 DOWNTO 0)) RETURN t_network_total_header_64b_arr;
FUNCTION func_network_total_header_no_align_response_icmp(icmp_arr : t_network_total_header_32b_arr; mac_addr : STD_LOGIC_VECTOR(c_network_eth_mac_addr_w-1 DOWNTO 0)) RETURN t_network_total_header_32b_arr;
FUNCTION func_network_total_header_no_align_response_icmp(icmp_arr : t_network_total_header_64b_arr; mac_addr : STD_LOGIC_VECTOR(c_network_eth_mac_addr_w-1 DOWNTO 0)) RETURN t_network_total_header_64b_arr;
FUNCTION func_network_total_header_no_align_response_udp( udp_arr : t_network_total_header_32b_arr; mac_addr : STD_LOGIC_VECTOR(c_network_eth_mac_addr_w-1 DOWNTO 0)) RETURN t_network_total_header_32b_arr;
FUNCTION func_network_total_header_no_align_response_udp( udp_arr : t_network_total_header_64b_arr; mac_addr : STD_LOGIC_VECTOR(c_network_eth_mac_addr_w-1 DOWNTO 0)) RETURN t_network_total_header_64b_arr;
END common_network_total_header_pkg;
......@@ -397,6 +428,146 @@ PACKAGE BODY common_network_total_header_pkg IS
RETURN v_hdr;
END;
-- Assume the total header has NOT been padded with the word align field
-- Map the 11 32b words or 6 64b longwords from the total header to the header field records
FUNCTION func_network_total_header_no_align_extract_eth(hdr_arr : t_network_total_header_32b_arr) RETURN t_network_eth_header IS
VARIABLE v_hdr : t_network_eth_header;
BEGIN
v_hdr.dst_mac(47 DOWNTO 16) := hdr_arr(0);
v_hdr.dst_mac(15 DOWNTO 0) := hdr_arr(1)(31 DOWNTO 16);
v_hdr.src_mac(47 DOWNTO 32) := hdr_arr(1)(15 DOWNTO 0);
v_hdr.src_mac(31 DOWNTO 0) := hdr_arr(2);
v_hdr.eth_type := hdr_arr(3)(31 DOWNTO 16);
RETURN v_hdr;
END;
FUNCTION func_network_total_header_no_align_extract_eth(hdr_arr : t_network_total_header_64b_arr) RETURN t_network_eth_header IS
VARIABLE v_hdr : t_network_eth_header;
BEGIN
v_hdr.dst_mac := hdr_arr(0)(63 DOWNTO 16);
v_hdr.src_mac(47 DOWNTO 32) := hdr_arr(0)(15 DOWNTO 0);
v_hdr.src_mac(31 DOWNTO 0) := hdr_arr(1)(63 DOWNTO 32);
v_hdr.eth_type := hdr_arr(1)(31 DOWNTO 16);
RETURN v_hdr;
END;
FUNCTION func_network_total_header_no_align_extract_ip(hdr_arr : t_network_total_header_32b_arr) RETURN t_network_ip_header IS
VARIABLE v_hdr : t_network_ip_header;
BEGIN
v_hdr.version := hdr_arr(3)(15 DOWNTO 12);
v_hdr.header_length := hdr_arr(3)(11 DOWNTO 8);
v_hdr.services := hdr_arr(3)( 7 DOWNTO 0);
v_hdr.total_length := hdr_arr(4)(31 DOWNTO 16);
v_hdr.identification := hdr_arr(4)(15 DOWNTO 0);
v_hdr.flags := hdr_arr(5)(31 DOWNTO 29);
v_hdr.fragment_offset := hdr_arr(5)(28 DOWNTO 16);
v_hdr.time_to_live := hdr_arr(5)(15 DOWNTO 8);
v_hdr.protocol := hdr_arr(5)( 7 DOWNTO 0);
v_hdr.header_checksum := hdr_arr(6)(31 DOWNTO 16);
v_hdr.src_ip_addr(31 DOWNTO 16) := hdr_arr(6)(15 DOWNTO 0);
v_hdr.src_ip_addr(15 DOWNTO 0) := hdr_arr(7)(31 DOWNTO 16);
v_hdr.dst_ip_addr(31 DOWNTO 16) := hdr_arr(7)(15 DOWNTO 0);
v_hdr.dst_ip_addr(15 DOWNTO 0) := hdr_arr(8)(31 DOWNTO 16);
RETURN v_hdr;
END;
FUNCTION func_network_total_header_no_align_extract_ip(hdr_arr : t_network_total_header_64b_arr) RETURN t_network_ip_header IS
VARIABLE v_hdr : t_network_ip_header;
BEGIN
v_hdr.version := hdr_arr(1)(15 DOWNTO 12);
v_hdr.header_length := hdr_arr(1)(11 DOWNTO 8);
v_hdr.services := hdr_arr(1)( 7 DOWNTO 0);
v_hdr.total_length := hdr_arr(2)(63 DOWNTO 48);
v_hdr.identification := hdr_arr(2)(47 DOWNTO 32);
v_hdr.flags := hdr_arr(2)(31 DOWNTO 29);
v_hdr.fragment_offset := hdr_arr(2)(28 DOWNTO 16);
v_hdr.time_to_live := hdr_arr(2)(15 DOWNTO 8);
v_hdr.protocol := hdr_arr(2)( 7 DOWNTO 0);
v_hdr.header_checksum := hdr_arr(3)(63 DOWNTO 48);
v_hdr.src_ip_addr := hdr_arr(3)(47 DOWNTO 16);
v_hdr.dst_ip_addr(31 DOWNTO 16) := hdr_arr(3)(15 DOWNTO 0);
v_hdr.dst_ip_addr(15 DOWNTO 0) := hdr_arr(4)(63 DOWNTO 48);
RETURN v_hdr;
END;
FUNCTION func_network_total_header_no_align_extract_arp(hdr_arr : t_network_total_header_32b_arr) RETURN t_network_arp_packet IS
VARIABLE v_arp : t_network_arp_packet;
BEGIN
v_arp.htype := hdr_arr(3)(15 DOWNTO 0);
v_arp.ptype := hdr_arr(4)(31 DOWNTO 16);
v_arp.hlen := hdr_arr(4)(15 DOWNTO 8);
v_arp.plen := hdr_arr(4)( 7 DOWNTO 0);
v_arp.oper := hdr_arr(5)(31 DOWNTO 16);
v_arp.sha(47 DOWNTO 32) := hdr_arr(5)(15 DOWNTO 0);
v_arp.sha(31 DOWNTO 0) := hdr_arr(6);
v_arp.spa := hdr_arr(7);
v_arp.tha(47 DOWNTO 16) := hdr_arr(8);
v_arp.tha(15 DOWNTO 0) := hdr_arr(9)(31 DOWNTO 16);
v_arp.tpa(31 DOWNTO 16) := hdr_arr(9)(15 DOWNTO 0);
v_arp.tpa(15 DOWNTO 0) := hdr_arr(9)(31 DOWNTO 16);
RETURN v_arp;
END;
FUNCTION func_network_total_header_no_align_extract_arp(hdr_arr : t_network_total_header_64b_arr) RETURN t_network_arp_packet IS
VARIABLE v_arp : t_network_arp_packet;
BEGIN
v_arp.htype := hdr_arr(1)(15 DOWNTO 0);
v_arp.ptype := hdr_arr(2)(63 DOWNTO 48);
v_arp.hlen := hdr_arr(2)(47 DOWNTO 40);
v_arp.plen := hdr_arr(2)(39 DOWNTO 32);
v_arp.oper := hdr_arr(2)(31 DOWNTO 16);
v_arp.sha(47 DOWNTO 32) := hdr_arr(2)(15 DOWNTO 0);
v_arp.sha(31 DOWNTO 0) := hdr_arr(3)(63 DOWNTO 32);
v_arp.spa := hdr_arr(3)(31 DOWNTO 0);
v_arp.tha := hdr_arr(4)(63 DOWNTO 16);
v_arp.tpa(31 DOWNTO 16) := hdr_arr(4)(15 DOWNTO 0);
v_arp.tpa(15 DOWNTO 0) := hdr_arr(5)(63 DOWNTO 48);
RETURN v_arp;
END;
FUNCTION func_network_total_header_no_align_extract_icmp(hdr_arr : t_network_total_header_32b_arr) RETURN t_network_icmp_header IS
VARIABLE v_hdr : t_network_icmp_header;
BEGIN
v_hdr.msg_type := hdr_arr(8)(15 DOWNTO 8);
v_hdr.code := hdr_arr(8)( 7 DOWNTO 0);
v_hdr.checksum := hdr_arr(9)(31 DOWNTO 16);
v_hdr.id := hdr_arr(9)(15 DOWNTO 0);
v_hdr.sequence := hdr_arr(10)(31 DOWNTO 16);
RETURN v_hdr;
END;
FUNCTION func_network_total_header_no_align_extract_icmp(hdr_arr : t_network_total_header_64b_arr) RETURN t_network_icmp_header IS
VARIABLE v_hdr : t_network_icmp_header;
BEGIN
v_hdr.msg_type := hdr_arr(4)(47 DOWNTO 40);
v_hdr.code := hdr_arr(4)(39 DOWNTO 32);
v_hdr.checksum := hdr_arr(4)(31 DOWNTO 16);
v_hdr.id := hdr_arr(4)(15 DOWNTO 0);
v_hdr.sequence := hdr_arr(5)(63 DOWNTO 48);
RETURN v_hdr;
END;
FUNCTION func_network_total_header_no_align_extract_udp(hdr_arr : t_network_total_header_32b_arr) RETURN t_network_udp_header IS
VARIABLE v_hdr : t_network_udp_header;
BEGIN
v_hdr.src_port := hdr_arr(8)(15 DOWNTO 0);
v_hdr.dst_port := hdr_arr(9)(31 DOWNTO 16);
v_hdr.total_length := hdr_arr(9)(15 DOWNTO 0);
v_hdr.checksum := hdr_arr(10)(31 DOWNTO 16);
RETURN v_hdr;
END;
FUNCTION func_network_total_header_no_align_extract_udp(hdr_arr : t_network_total_header_64b_arr) RETURN t_network_udp_header IS
VARIABLE v_hdr : t_network_udp_header;
BEGIN
v_hdr.src_port := hdr_arr(4)(47 DOWNTO 32);
v_hdr.dst_port := hdr_arr(4)(31 DOWNTO 16);
v_hdr.total_length := hdr_arr(4)(15 DOWNTO 0);
v_hdr.checksum := hdr_arr(5)(63 DOWNTO 48);
RETURN v_hdr;
END;
-- Construct the total header array from the individual header records
FUNCTION func_network_total_header_construct_eth( eth : t_network_eth_header) RETURN t_network_total_header_32b_arr IS
VARIABLE v_total : t_network_total_header_32b_arr := (OTHERS=>(OTHERS=>'0'));
......@@ -713,4 +884,173 @@ PACKAGE BODY common_network_total_header_pkg IS
RETURN v_response;
END;
-- Construct the response headers for headers without word align padding
FUNCTION func_network_total_header_no_align_response_eth(eth_arr : t_network_total_header_32b_arr;
mac_addr : STD_LOGIC_VECTOR(c_network_eth_mac_addr_w-1 DOWNTO 0)) RETURN t_network_total_header_32b_arr IS
VARIABLE v_response : t_network_total_header_32b_arr;
BEGIN
-- Default
v_response := eth_arr;
-- ETH
-- . use input src mac for dst mac
v_response(0) := eth_arr(1)(15 DOWNTO 0) & eth_arr(2)(31 DOWNTO 16);
v_response(1)(31 DOWNTO 16) := eth_arr(2)(15 DOWNTO 0);
-- . force eth src mac to this node mac address (because the input dst_mac can be via eth broadcast mac)
v_response(1)(15 DOWNTO 0) := mac_addr(47 DOWNTO 32);
v_response(2) := mac_addr(31 DOWNTO 0);
RETURN v_response;
END;
FUNCTION func_network_total_header_no_align_response_eth(eth_arr : t_network_total_header_64b_arr;
mac_addr : STD_LOGIC_VECTOR(c_network_eth_mac_addr_w-1 DOWNTO 0)) RETURN t_network_total_header_64b_arr IS
VARIABLE v_response : t_network_total_header_64b_arr;
BEGIN
-- Default
v_response := eth_arr;
-- ETH
-- . use input src mac for dst mac
v_response(0)(63 DOWNTO 16) := eth_arr(0)(15 DOWNTO 0) & eth_arr(1)(63 DOWNTO 32);
-- . force eth src mac to this node mac address (because the input dst_mac can be via eth broadcast mac)
v_response(0)(15 DOWNTO 0) := mac_addr(47 DOWNTO 32);
v_response(1)(63 DOWNTO 32) := mac_addr(31 DOWNTO 0);
RETURN v_response;
END;
FUNCTION func_network_total_header_no_align_response_arp(arp_arr : t_network_total_header_32b_arr;
mac_addr : STD_LOGIC_VECTOR(c_network_eth_mac_addr_w-1 DOWNTO 0);
ip_addr : STD_LOGIC_VECTOR(c_network_ip_addr_w-1 DOWNTO 0)) RETURN t_network_total_header_32b_arr IS
VARIABLE v_response : t_network_total_header_32b_arr;
BEGIN
-- ETH
v_response := func_network_total_header_no_align_response_eth(arp_arr, mac_addr);
-- ARP
-- . force operation arp reply
v_response(5)(15 DOWNTO 0) := TO_UVEC(c_network_arp_oper_reply, 16);
-- . force sha to this node mac address
v_response(6) := mac_addr(47 DOWNTO 16);
v_response(7)(31 DOWNTO 16) := mac_addr(15 DOWNTO 0);
-- . force spa to this node ip address
v_response(7)(15 DOWNTO 0) := ip_addr(31 DOWNTO 16);
v_response(8)(31 DOWNTO 16) := ip_addr(15 DOWNTO 0);
-- . use input sha for tha
v_response(8)(15 DOWNTO 0) := arp_arr(6)(31 DOWNTO 16);
v_response(9) := arp_arr(6)(15 DOWNTO 0) & arp_arr(7)(31 DOWNTO 16);
-- . use input spa for tpa
v_response(10) := arp_arr(7)(15 DOWNTO 0) & arp_arr(8)(31 DOWNTO 16);
RETURN v_response;
END;
FUNCTION func_network_total_header_no_align_response_arp(arp_arr : t_network_total_header_64b_arr;
mac_addr : STD_LOGIC_VECTOR(c_network_eth_mac_addr_w-1 DOWNTO 0);
ip_addr : STD_LOGIC_VECTOR(c_network_ip_addr_w-1 DOWNTO 0)) RETURN t_network_total_header_64b_arr IS
VARIABLE v_response : t_network_total_header_64b_arr;
BEGIN
-- ETH
v_response := func_network_total_header_no_align_response_eth(arp_arr, mac_addr);
-- ARP
-- . force operation arp reply
v_response(3)(47 DOWNTO 32) := TO_UVEC(c_network_arp_oper_reply, 16);
-- . force sha to this node mac address
v_response(3)(31 DOWNTO 0) := mac_addr(47 DOWNTO 16);
v_response(4)(63 DOWNTO 48) := mac_addr(15 DOWNTO 0);
-- . force spa to this node ip address
v_response(4)(47 DOWNTO 16) := ip_addr(31 DOWNTO 0);
-- . use input sha for tha
v_response(4)(15 DOWNTO 0) := arp_arr(3)(31 DOWNTO 16);
v_response(5)(63 DOWNTO 32) := arp_arr(3)(15 DOWNTO 0) & arp_arr(4)(63 DOWNTO 48);
-- . use input spa for tpa
v_response(5)(31 DOWNTO 0) := arp_arr(4)(47 DOWNTO 16);
RETURN v_response;
END;
FUNCTION func_network_total_header_no_align_response_ip(ip_arr : t_network_total_header_32b_arr;
mac_addr : STD_LOGIC_VECTOR(c_network_eth_mac_addr_w-1 DOWNTO 0)) RETURN t_network_total_header_32b_arr IS
VARIABLE v_response : t_network_total_header_32b_arr;
BEGIN
-- ETH
v_response := func_network_total_header_no_align_response_eth(ip_arr, mac_addr);
-- IP
-- . force ip header checksum to 0
v_response(6)(31 DOWNTO 16) := TO_UVEC(0, 16);
-- . swap ip dst_addr and ip src_addr
v_response(6)(15 DOWNTO 0) := ip_arr(7)(15 DOWNTO 0);
v_response(7)(31 DOWNTO 16) := ip_arr(8)(31 DOWNTO 16);
v_response(7)(15 DOWNTO 0) := ip_arr(6)(15 DOWNTO 0);
v_response(8)(31 DOWNTO 16) := ip_arr(7)(31 DOWNTO 16);
RETURN v_response;
END;
FUNCTION func_network_total_header_no_align_response_ip(ip_arr : t_network_total_header_64b_arr;
mac_addr : STD_LOGIC_VECTOR(c_network_eth_mac_addr_w-1 DOWNTO 0)) RETURN t_network_total_header_64b_arr IS
VARIABLE v_response : t_network_total_header_64b_arr;
BEGIN
-- ETH
v_response := func_network_total_header_no_align_response_eth(ip_arr, mac_addr);
-- IP
-- . force ip header checksum to 0
v_response(3)(63 DOWNTO 48) := TO_UVEC(0, 16);
-- . swap ip dst_addr and ip src_addr
v_response(3)(47 DOWNTO 16) := ip_arr(3)(15 DOWNTO 0) & ip_arr(4)(63 DOWNTO 48);
v_response(3)(15 DOWNTO 0) := ip_arr(3)(47 DOWNTO 32);
v_response(4)(63 DOWNTO 48) := ip_arr(3)(31 DOWNTO 16);
RETURN v_response;
END;
FUNCTION func_network_total_header_no_align_response_icmp(icmp_arr : t_network_total_header_32b_arr;
mac_addr : STD_LOGIC_VECTOR(c_network_eth_mac_addr_w-1 DOWNTO 0)) RETURN t_network_total_header_32b_arr IS
VARIABLE v_response : t_network_total_header_32b_arr;
BEGIN
-- ETH, IP
v_response := func_network_total_header_no_align_response_ip(icmp_arr, mac_addr);
-- ICMP : force type to icmp reply
v_response(8)(15 DOWNTO 8) := TO_UVEC(c_network_icmp_msg_type_reply, 8);
-- ICMP : force icmp checksum to 0
v_response(9)(31 DOWNTO 16) := TO_UVEC(0, 16);
RETURN v_response;
END;
FUNCTION func_network_total_header_no_align_response_icmp(icmp_arr : t_network_total_header_64b_arr;
mac_addr : STD_LOGIC_VECTOR(c_network_eth_mac_addr_w-1 DOWNTO 0)) RETURN t_network_total_header_64b_arr IS
VARIABLE v_response : t_network_total_header_64b_arr;
BEGIN
-- ETH, IP
v_response := func_network_total_header_no_align_response_ip(icmp_arr, mac_addr);
-- ICMP : force type to icmp reply
v_response(4)(47 DOWNTO 40) := TO_UVEC(c_network_icmp_msg_type_reply, 8);
-- ICMP : force icmp checksum to 0
v_response(4)(31 DOWNTO 16) := TO_UVEC(0, 16);
RETURN v_response;
END;
FUNCTION func_network_total_header_no_align_response_udp(udp_arr : t_network_total_header_32b_arr;
mac_addr : STD_LOGIC_VECTOR(c_network_eth_mac_addr_w-1 DOWNTO 0)) RETURN t_network_total_header_32b_arr IS
VARIABLE v_response : t_network_total_header_32b_arr;
BEGIN
-- ETH, IP
v_response := func_network_total_header_no_align_response_ip(udp_arr, mac_addr);
-- UDP : swap udp dst port and udp src port
v_response(9) := udp_arr(9)(15 DOWNTO 0) & udp_arr(9)(31 DOWNTO 16);
-- UDP : force udp checksum to 0
v_response(10)(15 DOWNTO 0) := TO_UVEC(0, 16);
RETURN v_response;
END;
FUNCTION func_network_total_header_no_align_response_udp(udp_arr : t_network_total_header_64b_arr;
mac_addr : STD_LOGIC_VECTOR(c_network_eth_mac_addr_w-1 DOWNTO 0)) RETURN t_network_total_header_64b_arr IS
VARIABLE v_response : t_network_total_header_64b_arr;
BEGIN
-- ETH, IP
v_response := func_network_total_header_no_align_response_ip(udp_arr, mac_addr);
-- UDP : swap udp dst port and udp src port
v_response(5)(63 DOWNTO 32) := udp_arr(5)(47 DOWNTO 32) & udp_arr(5)(63 DOWNTO 48);
-- UDP : force udp checksum to 0
v_response(5)(15 DOWNTO 0) := TO_UVEC(0, 16);
RETURN v_response;
END;
END common_network_total_header_pkg;
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment