IPv6
The IPv6 library provides functions for creating and manipulation IPv6 packets.
Functionality
- Create IPv6 packets of any length
- Create and extract IPv6 headers including extension headers
- Verify checksum of IPv6 packets
Other libraries in IPv6 are:
More details in nw_ipv6_pkg
Example use
Include the libraries:
library nw_util;
context nw_util.nw_util_context;
library nw_ipv6;
context nw_ipv6.nw_ipv6_context;
Assume the variable v_payload contains the IPv6 payload, for example an UDP packet. The variables are defined:
variable v_header : t_ipv6_header;
variable v_ipv6_pkt : t_slv_arr(0 to 1500)(7 downto 0);
variable v_len : natural;
First setup the header, then calculate the total IPv6 packet length before creating the packet.
v_header := C_DEFAULT_IPV6_HEADER;
v_header.src_addr := f_ipv6_addr_2_slv_arr("2102:ec7::2");
v_len := f_ipv6_create_pkt_len(v_header, v_payload);
v_ipv6_pkt(0 to v_len - 1) := f_ipv6_create_pkt(v_header, v_payload);
Extension headers are used by first defining a variable holding a list of extension headers, then adding individual extension headers to this list.
v_ext_header_list : t_ext_header_list := C_DEFAULT_EXT_HEADER_LIST;
v_ext_header : t_extension_header;
Extension headers can added to the list in any order (note that RFC 2460 recommends a specific order).
Add Hop-by-Hop Options Header:
v_ext_header := C_DEFAULT_EXT_HEADER;
v_ext_header.header_type := C_HOPOPT;
v_ext_header.hdr_ext_len := 1;
v_ext_header.data(0 to 1) := (x"01", x"0c");
v_ext_header_list := f_ipv6_add_ext_header(v_ext_header_list, v_ext_header);
Add Routing Header:
v_ext_header := C_DEFAULT_EXT_HEADER;
v_ext_header.header_type := C_IPV6_ROUTE;
v_ext_header.routing_type := x"00";
v_ext_header.segments_left := x"01";
v_ext_header.hdr_ext_len := 1;
v_ext_header.data(0 to 7) := f_ipv6_addr_2_slv_arr("4200:8a::44");
v_ext_header_list := f_ipv6_add_ext_header(v_ext_header_list, v_ext_header);
Add Fragment Header:
v_ext_header := C_DEFAULT_EXT_HEADER;
v_ext_header.header_type := C_IPV6_FRAG;
v_ext_header.framgment_offset := "0011001000000";
v_ext_header.m_flag := '0';
v_ext_header.identification := x"00000042";
v_ext_header.hdr_ext_len := 0;
v_ext_header_list := f_ipv6_add_ext_header(v_ext_header_list, v_ext_header);
Add Destination Options Header:
v_ext_header := C_DEFAULT_EXT_HEADER;
v_ext_header.header_type := C_IPV6_OPTS;
v_ext_header.hdr_ext_len := 0;
v_ext_header.data(0 to 3) := (x"01", x"02");
v_ext_header_list := f_ipv6_add_ext_header(v_ext_header_list, v_ext_header);
Add Authentication Header (RFC 2402):
v_ext_header := C_DEFAULT_EXT_HEADER;
v_ext_header.header_type := C_AH;
v_ext_header.hdr_ext_len := 4;
v_ext_header.spi := x"12345678";
v_ext_header.seq_no := x"000000f4";
v_ext_header.data(0 to 11) := f_gen_prbs(C_POLY_X16_X15_X13_X4_1, 8, 12);
v_ext_header_list := f_ipv6_add_ext_header(v_ext_header_list, v_ext_header);
Finally create the IPv6 packet with extension headers:
v_len := f_ipv6_create_pkt_len(v_header, v_payload, v_ext_header_list);
v_ipv6_pkt(0 to v_len - 1) := f_ipv6_create_pkt(v_header, v_payload, v_ext_header_list);
See further examples in the test bench nw_ipv6_tb.vhd.