rte_ip6.h - Man Page
Synopsis
#include <stdint.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netinet/ip6.h>
#include <rte_byteorder.h>
#include <rte_cksum.h>
#include <rte_ether.h>
#include <rte_mbuf.h>
Data Structures
struct rte_ipv6_addr
Macros
#define RTE_IPV6_ADDR_SIZE 16
#define RTE_IPV6_MAX_DEPTH (RTE_IPV6_ADDR_SIZE * CHAR_BIT)
#define RTE_IPV6_U16_SPLIT(x)
#define RTE_IPV6(a, b, c, d, e, f, g, h)
#define RTE_IPV6_ADDR_FMT '%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x'
#define RTE_IPV6_ADDR_SPLIT(ip)
#define RTE_IPV6_MASK_FULL RTE_IPV6(0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff)
#define RTE_IPV6_ADDR_UNSPEC RTE_IPV6(0, 0, 0, 0, 0, 0, 0, 0)
#define RTE_IPV6_ADDR_LOOPBACK RTE_IPV6(0, 0, 0, 0, 0, 0, 0, 1)
#define RTE_IPV6_MIN_MTU 1280
#define RTE_IPV6_EHDR_MF_SHIFT 0
Well known multicast addresses
#define RTE_IPV6_ADDR_ALLNODES_IFACE_LOCAL RTE_IPV6(0xff01, 0, 0, 0, 0, 0, 0, 1)
#define RTE_IPV6_ADDR_ALLNODES_LINK_LOCAL RTE_IPV6(0xff02, 0, 0, 0, 0, 0, 0, 1)
#define RTE_IPV6_ADDR_ALLROUTERS_IFACE_LOCAL RTE_IPV6(0xff01, 0, 0, 0, 0, 0, 0, 2)
#define RTE_IPV6_ADDR_ALLROUTERS_LINK_LOCAL RTE_IPV6(0xff02, 0, 0, 0, 0, 0, 0, 2)
#define RTE_IPV6_ADDR_ALLROUTERS_SITE_LOCAL RTE_IPV6(0xff05, 0, 0, 0, 0, 0, 0, 2)
Enumerations
enum rte_ipv6_mc_scope { RTE_IPV6_MC_SCOPE_NONE = 0x00, RTE_IPV6_MC_SCOPE_IFACELOCAL = 0x01, RTE_IPV6_MC_SCOPE_LINKLOCAL = 0x02, RTE_IPV6_MC_SCOPE_SITELOCAL = 0x05, RTE_IPV6_MC_SCOPE_ORGLOCAL = 0x08, RTE_IPV6_MC_SCOPE_GLOBAL = 0x0e }
Functions
static bool rte_ipv6_addr_eq (const struct rte_ipv6_addr *a, const struct rte_ipv6_addr *b)
static void rte_ipv6_addr_mask (struct rte_ipv6_addr *ip, uint8_t depth)
static bool rte_ipv6_addr_eq_prefix (const struct rte_ipv6_addr *a, const struct rte_ipv6_addr *b, uint8_t depth)
static uint8_t rte_ipv6_mask_depth (const struct rte_ipv6_addr *mask)
static bool rte_ipv6_addr_is_unspec (const struct rte_ipv6_addr *ip)
static bool rte_ipv6_addr_is_loopback (const struct rte_ipv6_addr *ip)
static bool rte_ipv6_addr_is_linklocal (const struct rte_ipv6_addr *ip)
static bool rte_ipv6_addr_is_sitelocal (const struct rte_ipv6_addr *ip)
static bool rte_ipv6_addr_is_v4compat (const struct rte_ipv6_addr *ip)
static bool rte_ipv6_addr_is_v4mapped (const struct rte_ipv6_addr *ip)
static bool rte_ipv6_addr_is_mcast (const struct rte_ipv6_addr *ip)
static enum rte_ipv6_mc_scope rte_ipv6_mc_scope (const struct rte_ipv6_addr *ip)
static void rte_ipv6_solnode_from_addr (struct rte_ipv6_addr *sol, const struct rte_ipv6_addr *ip)
static void rte_ether_mcast_from_ipv6 (struct rte_ether_addr *mac, const struct rte_ipv6_addr *ip)
struct __rte_aligned (2) rte_ipv6_hdr
static int rte_ipv6_check_version (const struct rte_ipv6_hdr *ip)
static uint16_t rte_ipv6_phdr_cksum (const struct rte_ipv6_hdr *ipv6_hdr, uint64_t ol_flags)
static uint16_t rte_ipv6_udptcp_cksum (const struct rte_ipv6_hdr *ipv6_hdr, const void *l4_hdr)
static uint16_t rte_ipv6_udptcp_cksum_mbuf (const struct rte_mbuf *m, const struct rte_ipv6_hdr *ipv6_hdr, uint16_t l4_off)
static int rte_ipv6_udptcp_cksum_verify (const struct rte_ipv6_hdr *ipv6_hdr, const void *l4_hdr)
static int rte_ipv6_udptcp_cksum_mbuf_verify (const struct rte_mbuf *m, const struct rte_ipv6_hdr *ipv6_hdr, uint16_t l4_off)
static int rte_ipv6_get_next_ext (const uint8_t *p, int proto, size_t *ext_len)
Detailed Description
IPv6-related defines
Definition in file rte_ip6.h.
Macro Definition Documentation
#define RTE_IPV6_ADDR_SIZE 16
Maximum IPv6 address size in bytes.
Definition at line 43 of file rte_ip6.h.
#define RTE_IPV6_MAX_DEPTH (RTE_IPV6_ADDR_SIZE * CHAR_BIT)
Maximum IPv6 address size in bits.
Definition at line 48 of file rte_ip6.h.
#define RTE_IPV6_U16_SPLIT( x)
Value:
(uint8_t)((uint16_t)(x) & UINT16_C(0xff)), \ (uint8_t)(((uint16_t)(x) >> 8) & UINT16_C(0xff))
Split a literal 16 bit unsigned integer into two bytes separated by a comma according to the platform endianness.
- Parameters
x A uint16_t literal value.
- Returns
Two uint8_t literals separated by a coma.
Definition at line 162 of file rte_ip6.h.
#define RTE_IPV6( a, b, c, d, e, f, g, h)
Value:
{{ \ RTE_IPV6_U16_SPLIT(a), \ RTE_IPV6_U16_SPLIT(b), \ RTE_IPV6_U16_SPLIT(c), \ RTE_IPV6_U16_SPLIT(d), \ RTE_IPV6_U16_SPLIT(e), \ RTE_IPV6_U16_SPLIT(f), \ RTE_IPV6_U16_SPLIT(g), \ RTE_IPV6_U16_SPLIT(h) \ }}
Shorthand to define a literal IPv6 address based on 16bit unsigned integers.
- Parameters
a,b,c,d,e,f,g,h uint8_t literals that will be passed to RTE_IPV6_U16_SPLIT(x).
- Returns
A literal rte_ipv6_addr value suitable for static initialization.
Definition at line 179 of file rte_ip6.h.
#define RTE_IPV6_ADDR_FMT '%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x'
printf() format element for rte_ipv6_addr structures. To be used along with RTE_IPV6_ADDR_SPLIT(ip).
Definition at line 195 of file rte_ip6.h.
#define RTE_IPV6_ADDR_SPLIT( ip)
Value:
((uint8_t)(ip)->a[0]), \ ((uint8_t)(ip)->a[1]), \ ((uint8_t)(ip)->a[2]), \ ((uint8_t)(ip)->a[3]), \ ((uint8_t)(ip)->a[4]), \ ((uint8_t)(ip)->a[5]), \ ((uint8_t)(ip)->a[6]), \ ((uint8_t)(ip)->a[7]), \ ((uint8_t)(ip)->a[8]), \ ((uint8_t)(ip)->a[9]), \ ((uint8_t)(ip)->a[10]), \ ((uint8_t)(ip)->a[11]), \ ((uint8_t)(ip)->a[12]), \ ((uint8_t)(ip)->a[13]), \ ((uint8_t)(ip)->a[14]), \ ((uint8_t)(ip)->a[15])
For use with RTE_IPV6_ADDR_FMT. E.g.:
printf(RTE_IPV6_ADDR_FMT "\n", RTE_IPV6_ADDR_SPLIT(&ip));
- Parameters
ip A struct rte_ipv6_addr pointer.
- Returns
A set of 16 uint8_t values separated by comas for use in printf().
Definition at line 210 of file rte_ip6.h.
#define RTE_IPV6_MASK_FULL RTE_IPV6(0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff)
Full IPv6 mask. NB: this is not a valid/routable IPv6 address.
Definition at line 229 of file rte_ip6.h.
#define RTE_IPV6_ADDR_UNSPEC RTE_IPV6(0, 0, 0, 0, 0, 0, 0, 0)
Unspecified IPv6 address as defined in RFC 4291, section 2.5.2.
Definition at line 233 of file rte_ip6.h.
#define RTE_IPV6_ADDR_LOOPBACK RTE_IPV6(0, 0, 0, 0, 0, 0, 0, 1)
Loopback IPv6 address as defined in RFC 4291, section 2.5.3.
Definition at line 251 of file rte_ip6.h.
#define RTE_IPV6_ADDR_ALLNODES_IFACE_LOCAL RTE_IPV6(0xff01, 0, 0, 0, 0, 0, 0, 1)
Interface-local all-nodes multicast address as defined in RFC 4291, section 2.7.1.
Definition at line 383 of file rte_ip6.h.
#define RTE_IPV6_ADDR_ALLNODES_LINK_LOCAL RTE_IPV6(0xff02, 0, 0, 0, 0, 0, 0, 1)
Link-local all-nodes multicast address as defined in RFC 4291, section 2.7.1.
Definition at line 385 of file rte_ip6.h.
#define RTE_IPV6_ADDR_ALLROUTERS_IFACE_LOCAL RTE_IPV6(0xff01, 0, 0, 0, 0, 0, 0, 2)
Interface-local all-routers multicast address as defined in RFC 4291, section 2.7.1.
Definition at line 387 of file rte_ip6.h.
#define RTE_IPV6_ADDR_ALLROUTERS_LINK_LOCAL RTE_IPV6(0xff02, 0, 0, 0, 0, 0, 0, 2)
Link-local all-routers multicast address as defined in RFC 4291, section 2.7.1.
Definition at line 389 of file rte_ip6.h.
#define RTE_IPV6_ADDR_ALLROUTERS_SITE_LOCAL RTE_IPV6(0xff05, 0, 0, 0, 0, 0, 0, 2)
Site-local all-routers multicast address as defined in RFC 4291, section 2.7.1.
Definition at line 391 of file rte_ip6.h.
#define RTE_IPV6_MIN_MTU 1280
Minimum MTU for IPv6, see RFC 8200.
Definition at line 537 of file rte_ip6.h.
#define RTE_IPV6_EHDR_MF_SHIFT 0
IPv6 fragment extension header.
Definition at line 741 of file rte_ip6.h.
Enumeration Type Documentation
enum rte_ipv6_mc_scope
IPv6 multicast scope values as defined in RFC 4291, section 2.7.
Enumerator
- RTE_IPV6_MC_SCOPE_NONE
Invalid multicast scope.
- RTE_IPV6_MC_SCOPE_IFACELOCAL
Interface-local multicast scope.
- RTE_IPV6_MC_SCOPE_LINKLOCAL
Link-local multicast scope.
- RTE_IPV6_MC_SCOPE_SITELOCAL
Site-local multicast scope.
- RTE_IPV6_MC_SCOPE_ORGLOCAL
Organizational-local multicast scope.
- RTE_IPV6_MC_SCOPE_GLOBAL
Global multicast scope.
Definition at line 348 of file rte_ip6.h.
Function Documentation
static bool rte_ipv6_addr_eq (const struct rte_ipv6_addr * a, const struct rte_ipv6_addr * b) [inline], [static]
Check if two IPv6 Addresses are equal.
- Parameters
a The first address.
b The second address.- Returns
true if both addresses are identical.
Definition at line 68 of file rte_ip6.h.
static void rte_ipv6_addr_mask (struct rte_ipv6_addr * ip, uint8_t depth) [inline], [static]
Mask an IPv6 address using the specified depth.
Leave untouched one bit per unit in the depth variable and set the rest to 0.
- Parameters
ip The address to mask.
depth All bits starting from this bit number will be set to zero.
Definition at line 84 of file rte_ip6.h.
static bool rte_ipv6_addr_eq_prefix (const struct rte_ipv6_addr * a, const struct rte_ipv6_addr * b, uint8_t depth) [inline], [static]
Check if two IPv6 addresses belong to the same network prefix.
- Parameters
a The first address or network.
b The second address or network.
depth The network prefix length.- Returns
true if the first depth bits of both addresses are identical.
Definition at line 109 of file rte_ip6.h.
static uint8_t rte_ipv6_mask_depth (const struct rte_ipv6_addr * mask) [inline], [static]
Get the depth of a given IPv6 address mask.
- Parameters
mask The address mask.
- Returns
The number of consecutive bits set to 1 starting from the beginning of the mask.
Definition at line 132 of file rte_ip6.h.
static bool rte_ipv6_addr_is_unspec (const struct rte_ipv6_addr * ip) [inline], [static]
Check if an IPv6 address is unspecified as defined in RFC 4291, section 2.5.2.
- Parameters
ip The address to check.
- Returns
true if the address is the unspecified address (all zeroes).
Definition at line 244 of file rte_ip6.h.
static bool rte_ipv6_addr_is_loopback (const struct rte_ipv6_addr * ip) [inline], [static]
Check if an IPv6 address is the loopback address as defined in RFC 4291, section 2.5.3.
- Parameters
ip The address to check.
- Returns
true if the address is the loopback address (all zeroes except the last bit).
Definition at line 263 of file rte_ip6.h.
static bool rte_ipv6_addr_is_linklocal (const struct rte_ipv6_addr * ip) [inline], [static]
Check if an IPv6 address is link-local as defined in RFC 4291, section 2.5.6.
- Parameters
ip The address to check.
- Returns
true if the address is a link-local address.
Definition at line 278 of file rte_ip6.h.
static bool rte_ipv6_addr_is_sitelocal (const struct rte_ipv6_addr * ip) [inline], [static]
Check if an IPv6 address is site-local as defined in RFC 4291, section 2.5.7.
- Parameters
ip The address to check.
- Returns
true if the address is a site-local address.
Definition at line 292 of file rte_ip6.h.
static bool rte_ipv6_addr_is_v4compat (const struct rte_ipv6_addr * ip) [inline], [static]
Check if an IPv6 address is an IPv4-compatible address as defined in RFC 4291, section 2.5.5.1.
- Parameters
ip The address to check.
- Returns
true if the address is an IPv4-compatible address.
Definition at line 307 of file rte_ip6.h.
static bool rte_ipv6_addr_is_v4mapped (const struct rte_ipv6_addr * ip) [inline], [static]
Check if an IPv6 address is an IPv4-mapped address as defined in RFC 4291, section 2.5.5.2.
- Parameters
ip The address to check.
- Returns
true if the address is an IPv4-mapped address.
Definition at line 325 of file rte_ip6.h.
static bool rte_ipv6_addr_is_mcast (const struct rte_ipv6_addr * ip) [inline], [static]
Check if an IPv6 address is multicast as defined in RFC 4291, section 2.7.
- Parameters
ip The address to check.
- Returns
true if the address is multicast.
Definition at line 340 of file rte_ip6.h.
static enum rte_ipv6_mc_scope rte_ipv6_mc_scope (const struct rte_ipv6_addr * ip) [inline], [static]
Extract the IPv6 multicast scope value as defined in RFC 4291, section 2.7.
- Parameters
ip The address from which to get the multicast scope.
- Returns
The multicast scope of the address, or RTE_IPV6_MC_SCOPE_NONE if the address is not multicast.
Definition at line 373 of file rte_ip6.h.
static void rte_ipv6_solnode_from_addr (struct rte_ipv6_addr * sol, const struct rte_ipv6_addr * ip) [inline], [static]
Convert a unicast or anycast IPv6 address to a solicited-node multicast address as defined in RFC 4291, section 2.7.1.
- Parameters
sol The IPv6 solicited-node multicast address to generate.
ip A unicast or anycast address.
Definition at line 429 of file rte_ip6.h.
static void rte_ether_mcast_from_ipv6 (struct rte_ether_addr * mac, const struct rte_ipv6_addr * ip) [inline], [static]
Generate a multicast Ethernet address from a multicast IPv6 address as defined in RFC 2464, section 7.
- Parameters
mac The multicast Ethernet address to generate.
ip A multicast IPv6 address.
Definition at line 451 of file rte_ip6.h.
struct __rte_aligned (2 )
IPv6 Header
IPv6 Routing Extension Header < IP version, traffic class & flow label.
< Flow label
< ECN
< Differentiated services
< Version
< IP payload size, including ext. headers
< Protocol, next header.
< Hop limits.
< IP address of source host.
< IP address of destination host(s).
< Protocol, next header.
< Header length.
< Extension header type.
< Valid segments number.
< Packet control data per type.
< The last_entry field of SRH
< Packet flag.
< Packet tag.
< Next header type
< Reserved
< All fragmentation data
< Packet ID
Definition at line 451 of file rte_ip6.h.
static int rte_ipv6_check_version (const struct rte_ipv6_hdr * ip) [inline], [static]
Check that the IPv6 header version field is valid according to RFC 8200 section 3.
- Parameters
ip The IPv6 header.
Returns
0 if the version field is valid. -EINVAL otherwise.
Definition at line 497 of file rte_ip6.h.
static uint16_t rte_ipv6_phdr_cksum (const struct rte_ipv6_hdr * ipv6_hdr, uint64_t ol_flags) [inline], [static]
Process the pseudo-header checksum of an IPv6 header.
Depending on the ol_flags, the pseudo-header checksum expected by the drivers is not the same. For instance, when TSO is enabled, the IPv6 payload length must not be included in the packet.
When ol_flags is 0, it computes the standard pseudo-header checksum.
- Parameters
ipv6_hdr The pointer to the contiguous IPv6 header.
ol_flags The ol_flags of the associated mbuf.- Returns
The non-complemented checksum to set in the L4 header.
Definition at line 556 of file rte_ip6.h.
static uint16_t rte_ipv6_udptcp_cksum (const struct rte_ipv6_hdr * ipv6_hdr, const void * l4_hdr) [inline], [static]
Process the IPv6 UDP or TCP checksum.
The IPv6 header must not be followed by extension headers. The layer 4 checksum must be set to 0 in the L4 header by the caller.
- Parameters
ipv6_hdr The pointer to the contiguous IPv6 header.
l4_hdr The pointer to the beginning of the L4 header.- Returns
The complemented checksum to set in the L4 header.
Definition at line 610 of file rte_ip6.h.
static uint16_t rte_ipv6_udptcp_cksum_mbuf (const struct rte_mbuf * m, const struct rte_ipv6_hdr * ipv6_hdr, uint16_t l4_off) [inline], [static]
Process the IPv6 UDP or TCP checksum of a packet.
The IPv6 header must not be followed by extension headers. The layer 4 checksum must be set to 0 in the L4 header by the caller.
- Parameters
m The pointer to the mbuf.
ipv6_hdr The pointer to the contiguous IPv6 header.
l4_off The offset in bytes to start L4 checksum.- Returns
The complemented checksum to set in the L4 header.
Definition at line 667 of file rte_ip6.h.
static int rte_ipv6_udptcp_cksum_verify (const struct rte_ipv6_hdr * ipv6_hdr, const void * l4_hdr) [inline], [static]
Validate the IPv6 UDP or TCP checksum.
In case of UDP, the caller must first check if udp_hdr->dgram_cksum is 0: this is either invalid or means no checksum in some situations. See 8.1 (Upper-Layer Checksums) in RFC 8200.
- Parameters
ipv6_hdr The pointer to the contiguous IPv6 header.
l4_hdr The pointer to the beginning of the L4 header.- Returns
Return 0 if the checksum is correct, else -1.
Definition at line 700 of file rte_ip6.h.
static int rte_ipv6_udptcp_cksum_mbuf_verify (const struct rte_mbuf * m, const struct rte_ipv6_hdr * ipv6_hdr, uint16_t l4_off) [inline], [static]
Validate the IPv6 UDP or TCP checksum of a packet.
In case of UDP, the caller must first check if udp_hdr->dgram_cksum is 0: this is either invalid or means no checksum in some situations. See 8.1 (Upper-Layer Checksums) in RFC 8200.
- Parameters
m The pointer to the mbuf.
ipv6_hdr The pointer to the contiguous IPv6 header.
l4_off The offset in bytes to start L4 checksum.- Returns
Return 0 if the checksum is correct, else -1.
Definition at line 728 of file rte_ip6.h.
static int rte_ipv6_get_next_ext (const uint8_t * p, int proto, size_t * ext_len) [inline], [static]
Parse next IPv6 header extension
This function checks if proto number is an IPv6 extensions and parses its data if so, providing information on next header and extension length.
- Parameters
p Pointer to an extension raw data.
proto Protocol number extracted from the "next header" field from the IPv6 header or the previous extension.
ext_len Extension data length.- Returns
next protocol number if proto is an IPv6 extension, -EINVAL otherwise
Definition at line 782 of file rte_ip6.h.
Author
Generated automatically by Doxygen for DPDK from the source code.