DPDK  22.03.0
Data Structures | Macros | Functions
rte_ip.h File Reference
#include <stdint.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netinet/ip.h>
#include <netinet/ip6.h>
#include <rte_byteorder.h>
#include <rte_mbuf.h>

Go to the source code of this file.

Data Structures

struct  rte_ipv4_hdr
 
struct  rte_ipv6_hdr
 

Macros

#define RTE_IPV4(a, b, c, d)
 
#define RTE_IPV4_MAX_PKT_LEN   65535
 
#define RTE_IPV4_HDR_IHL_MASK   (0x0f)
 
#define RTE_IPV4_IHL_MULTIPLIER   (4)
 
#define RTE_IPV4_ANY   ((uint32_t)0x00000000)
 
#define RTE_IPV4_LOOPBACK   ((uint32_t)0x7f000001)
 
#define RTE_IPV4_BROADCAST   ((uint32_t)0xe0000000)
 
#define RTE_IPV4_ALLHOSTS_GROUP   ((uint32_t)0xe0000001)
 
#define RTE_IPV4_ALLRTRS_GROUP   ((uint32_t)0xe0000002)
 
#define RTE_IPV4_MAX_LOCAL_GROUP   ((uint32_t)0xe00000ff)
 
#define RTE_IPV4_MIN_MCAST   RTE_IPV4(224, 0, 0, 0)
 
#define RTE_IPV4_MAX_MCAST   RTE_IPV4(239, 255, 255, 255)
 
#define RTE_IS_IPV4_MCAST(x)   ((x) >= RTE_IPV4_MIN_MCAST && (x) <= RTE_IPV4_MAX_MCAST)
 
#define RTE_IPV6_MIN_MTU   1280
 
#define RTE_IPV6_EHDR_MF_SHIFT   0
 

Functions

static uint8_t rte_ipv4_hdr_len (const struct rte_ipv4_hdr *ipv4_hdr)
 
static uint16_t rte_raw_cksum (const void *buf, size_t len)
 
static int rte_raw_cksum_mbuf (const struct rte_mbuf *m, uint32_t off, uint32_t len, uint16_t *cksum)
 
static uint16_t rte_ipv4_cksum (const struct rte_ipv4_hdr *ipv4_hdr)
 
static uint16_t rte_ipv4_phdr_cksum (const struct rte_ipv4_hdr *ipv4_hdr, uint64_t ol_flags)
 
static uint16_t rte_ipv4_udptcp_cksum (const struct rte_ipv4_hdr *ipv4_hdr, const void *l4_hdr)
 
static __rte_experimental uint16_t rte_ipv4_udptcp_cksum_mbuf (const struct rte_mbuf *m, const struct rte_ipv4_hdr *ipv4_hdr, uint16_t l4_off)
 
static __rte_experimental int rte_ipv4_udptcp_cksum_verify (const struct rte_ipv4_hdr *ipv4_hdr, const void *l4_hdr)
 
static __rte_experimental uint16_t rte_ipv4_udptcp_cksum_mbuf_verify (const struct rte_mbuf *m, const struct rte_ipv4_hdr *ipv4_hdr, uint16_t l4_off)
 
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 __rte_experimental uint16_t rte_ipv6_udptcp_cksum_mbuf (const struct rte_mbuf *m, const struct rte_ipv6_hdr *ipv6_hdr, uint16_t l4_off)
 
static __rte_experimental int rte_ipv6_udptcp_cksum_verify (const struct rte_ipv6_hdr *ipv6_hdr, const void *l4_hdr)
 
static __rte_experimental int rte_ipv6_udptcp_cksum_mbuf_verify (const struct rte_mbuf *m, const struct rte_ipv6_hdr *ipv6_hdr, uint16_t l4_off)
 
static __rte_experimental int rte_ipv6_get_next_ext (const uint8_t *p, int proto, size_t *ext_len)
 

Detailed Description

IP-related defines

Definition in file rte_ip.h.

Macro Definition Documentation

◆ RTE_IPV4

#define RTE_IPV4 (   a,
  b,
  c,
 
)
Value:
((uint32_t)(((a) & 0xff) << 24) | \
(((b) & 0xff) << 16) | \
(((c) & 0xff) << 8) | \
((d) & 0xff))

Create IPv4 address

Examples:
examples/flow_classify/flow_classify.c, examples/ip_fragmentation/main.c, examples/ip_reassembly/main.c, examples/ipv4_multicast/main.c, examples/l3fwd-acl/main.c, examples/l3fwd-graph/main.c, examples/l3fwd-power/main.c, examples/l3fwd/l3fwd_em.c, and examples/l3fwd/main.c.

Definition at line 67 of file rte_ip.h.

◆ RTE_IPV4_MAX_PKT_LEN

#define RTE_IPV4_MAX_PKT_LEN   65535

Maximal IPv4 packet length (including a header)

Examples:
examples/ipsec-secgw/ipsec-secgw.c.

Definition at line 73 of file rte_ip.h.

◆ RTE_IPV4_HDR_IHL_MASK

#define RTE_IPV4_HDR_IHL_MASK   (0x0f)

Internet header length mask for version_ihl field

Examples:
examples/ipsec-secgw/ipsec-secgw.c, and examples/l2fwd-crypto/main.c.

Definition at line 76 of file rte_ip.h.

◆ RTE_IPV4_IHL_MULTIPLIER

#define RTE_IPV4_IHL_MULTIPLIER   (4)

Internet header length field multiplier (IHL field specifies overall header length in number of 4-byte words)

Examples:
examples/ipsec-secgw/ipsec-secgw.c, examples/ipsec-secgw/sa.c, and examples/l2fwd-crypto/main.c.

Definition at line 81 of file rte_ip.h.

◆ RTE_IPV4_ANY

#define RTE_IPV4_ANY   ((uint32_t)0x00000000)

0.0.0.0

Definition at line 103 of file rte_ip.h.

◆ RTE_IPV4_LOOPBACK

#define RTE_IPV4_LOOPBACK   ((uint32_t)0x7f000001)

127.0.0.1

Definition at line 104 of file rte_ip.h.

◆ RTE_IPV4_BROADCAST

#define RTE_IPV4_BROADCAST   ((uint32_t)0xe0000000)

224.0.0.0

Definition at line 105 of file rte_ip.h.

◆ RTE_IPV4_ALLHOSTS_GROUP

#define RTE_IPV4_ALLHOSTS_GROUP   ((uint32_t)0xe0000001)

224.0.0.1

Definition at line 106 of file rte_ip.h.

◆ RTE_IPV4_ALLRTRS_GROUP

#define RTE_IPV4_ALLRTRS_GROUP   ((uint32_t)0xe0000002)

224.0.0.2

Definition at line 107 of file rte_ip.h.

◆ RTE_IPV4_MAX_LOCAL_GROUP

#define RTE_IPV4_MAX_LOCAL_GROUP   ((uint32_t)0xe00000ff)

224.0.0.255

Definition at line 108 of file rte_ip.h.

◆ RTE_IPV4_MIN_MCAST

#define RTE_IPV4_MIN_MCAST   RTE_IPV4(224, 0, 0, 0)

Minimal IPv4-multicast address

Definition at line 113 of file rte_ip.h.

◆ RTE_IPV4_MAX_MCAST

#define RTE_IPV4_MAX_MCAST   RTE_IPV4(239, 255, 255, 255)

Maximum IPv4 multicast address

Definition at line 115 of file rte_ip.h.

◆ RTE_IS_IPV4_MCAST

#define RTE_IS_IPV4_MCAST (   x)    ((x) >= RTE_IPV4_MIN_MCAST && (x) <= RTE_IPV4_MAX_MCAST)

check if IPv4 address is multicast

Examples:
examples/ipv4_multicast/main.c.

Definition at line 118 of file rte_ip.h.

◆ RTE_IPV6_MIN_MTU

#define RTE_IPV6_MIN_MTU   1280

Minimum MTU for IPv6, see RFC 8200.

Definition at line 543 of file rte_ip.h.

◆ RTE_IPV6_EHDR_MF_SHIFT

#define RTE_IPV6_EHDR_MF_SHIFT   0

IPv6 fragment extension header.

Definition at line 757 of file rte_ip.h.

Function Documentation

◆ rte_ipv4_hdr_len()

static uint8_t rte_ipv4_hdr_len ( const struct rte_ipv4_hdr ipv4_hdr)
inlinestatic

Get the length of an IPv4 header.

Parameters
ipv4_hdrPointer to the IPv4 header.
Returns
The length of the IPv4 header (with options if present) in bytes.
Examples:
examples/l3fwd/l3fwd_em.c.

Definition at line 137 of file rte_ip.h.

◆ rte_raw_cksum()

static uint16_t rte_raw_cksum ( const void *  buf,
size_t  len 
)
inlinestatic

Process the non-complemented checksum of a buffer.

Parameters
bufPointer to the buffer.
lenLength of the buffer.
Returns
The non-complemented checksum.

Definition at line 205 of file rte_ip.h.

◆ rte_raw_cksum_mbuf()

static int rte_raw_cksum_mbuf ( const struct rte_mbuf m,
uint32_t  off,
uint32_t  len,
uint16_t *  cksum 
)
inlinestatic

Compute the raw (non complemented) checksum of a packet.

Parameters
mThe pointer to the mbuf.
offThe offset in bytes to start the checksum.
lenThe length in bytes of the data to checksum.
cksumA pointer to the checksum, filled on success.
Returns
0 on success, -1 on error (bad length or offset).

Definition at line 228 of file rte_ip.h.

◆ rte_ipv4_cksum()

static uint16_t rte_ipv4_cksum ( const struct rte_ipv4_hdr ipv4_hdr)
inlinestatic

Process the IPv4 checksum of an IPv4 header.

The checksum field must be set to 0 by the caller.

Parameters
ipv4_hdrThe pointer to the contiguous IPv4 header.
Returns
The complemented checksum to set in the IP packet.
Examples:
examples/ipsec-secgw/ipsec-secgw.c, and examples/l3fwd-power/main.c.

Definition at line 298 of file rte_ip.h.

◆ rte_ipv4_phdr_cksum()

static uint16_t rte_ipv4_phdr_cksum ( const struct rte_ipv4_hdr ipv4_hdr,
uint64_t  ol_flags 
)
inlinestatic

Process the pseudo-header checksum of an IPv4 header.

The checksum field must be set to 0 by the caller.

Depending on the ol_flags, the pseudo-header checksum expected by the drivers is not the same. For instance, when TSO is enabled, the IP payload length must not be included in the packet.

When ol_flags is 0, it computes the standard pseudo-header checksum.

Parameters
ipv4_hdrThe pointer to the contiguous IPv4 header.
ol_flagsThe ol_flags of the associated mbuf.
Returns
The non-complemented checksum to set in the L4 header.
Examples:
examples/vhost/main.c.

Definition at line 324 of file rte_ip.h.

◆ rte_ipv4_udptcp_cksum()

static uint16_t rte_ipv4_udptcp_cksum ( const struct rte_ipv4_hdr ipv4_hdr,
const void *  l4_hdr 
)
inlinestatic

Process the IPv4 UDP or TCP checksum.

The layer 4 checksum must be set to 0 in the L4 header by the caller.

Parameters
ipv4_hdrThe pointer to the contiguous IPv4 header.
l4_hdrThe pointer to the beginning of the L4 header.
Returns
The complemented checksum to set in the L4 header.

Definition at line 388 of file rte_ip.h.

◆ rte_ipv4_udptcp_cksum_mbuf()

static __rte_experimental uint16_t rte_ipv4_udptcp_cksum_mbuf ( const struct rte_mbuf m,
const struct rte_ipv4_hdr ipv4_hdr,
uint16_t  l4_off 
)
inlinestatic
Warning
EXPERIMENTAL: this API may change without prior notice.

Compute the IPv4 UDP/TCP checksum of a packet.

Parameters
mThe pointer to the mbuf.
ipv4_hdrThe pointer to the contiguous IPv4 header.
l4_offThe offset in bytes to start L4 checksum.
Returns
The complemented checksum to set in the L4 header.

Definition at line 446 of file rte_ip.h.

◆ rte_ipv4_udptcp_cksum_verify()

static __rte_experimental int rte_ipv4_udptcp_cksum_verify ( const struct rte_ipv4_hdr ipv4_hdr,
const void *  l4_hdr 
)
inlinestatic

Validate the IPv4 UDP or TCP checksum.

In case of UDP, the caller must first check if udp_hdr->dgram_cksum is 0 (i.e. no checksum).

Parameters
ipv4_hdrThe pointer to the contiguous IPv4 header.
l4_hdrThe pointer to the beginning of the L4 header.
Returns
Return 0 if the checksum is correct, else -1.

Definition at line 479 of file rte_ip.h.

◆ rte_ipv4_udptcp_cksum_mbuf_verify()

static __rte_experimental uint16_t rte_ipv4_udptcp_cksum_mbuf_verify ( const struct rte_mbuf m,
const struct rte_ipv4_hdr ipv4_hdr,
uint16_t  l4_off 
)
inlinestatic
Warning
EXPERIMENTAL: this API may change without prior notice.

Verify the IPv4 UDP/TCP checksum of a packet.

In case of UDP, the caller must first check if udp_hdr->dgram_cksum is 0 (i.e. no checksum).

Parameters
mThe pointer to the mbuf.
ipv4_hdrThe pointer to the contiguous IPv4 header.
l4_offThe offset in bytes to start L4 checksum.
Returns
Return 0 if the checksum is correct, else -1.

Definition at line 510 of file rte_ip.h.

◆ rte_ipv6_phdr_cksum()

static uint16_t rte_ipv6_phdr_cksum ( const struct rte_ipv6_hdr ipv6_hdr,
uint64_t  ol_flags 
)
inlinestatic

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_hdrThe pointer to the contiguous IPv6 header.
ol_flagsThe ol_flags of the associated mbuf.
Returns
The non-complemented checksum to set in the L4 header.
Examples:
examples/vhost/main.c.

Definition at line 562 of file rte_ip.h.

◆ rte_ipv6_udptcp_cksum()

static uint16_t rte_ipv6_udptcp_cksum ( const struct rte_ipv6_hdr ipv6_hdr,
const void *  l4_hdr 
)
inlinestatic

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_hdrThe pointer to the contiguous IPv6 header.
l4_hdrThe pointer to the beginning of the L4 header.
Returns
The complemented checksum to set in the L4 header.

Definition at line 617 of file rte_ip.h.

◆ rte_ipv6_udptcp_cksum_mbuf()

static __rte_experimental uint16_t rte_ipv6_udptcp_cksum_mbuf ( const struct rte_mbuf m,
const struct rte_ipv6_hdr ipv6_hdr,
uint16_t  l4_off 
)
inlinestatic
Warning
EXPERIMENTAL: this API may change without prior notice.

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
mThe pointer to the mbuf.
ipv6_hdrThe pointer to the contiguous IPv6 header.
l4_offThe offset in bytes to start L4 checksum.
Returns
The complemented checksum to set in the L4 header.

Definition at line 678 of file rte_ip.h.

◆ rte_ipv6_udptcp_cksum_verify()

static __rte_experimental int rte_ipv6_udptcp_cksum_verify ( const struct rte_ipv6_hdr ipv6_hdr,
const void *  l4_hdr 
)
inlinestatic

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_hdrThe pointer to the contiguous IPv6 header.
l4_hdrThe pointer to the beginning of the L4 header.
Returns
Return 0 if the checksum is correct, else -1.

Definition at line 712 of file rte_ip.h.

◆ rte_ipv6_udptcp_cksum_mbuf_verify()

static __rte_experimental int rte_ipv6_udptcp_cksum_mbuf_verify ( const struct rte_mbuf m,
const struct rte_ipv6_hdr ipv6_hdr,
uint16_t  l4_off 
)
inlinestatic
Warning
EXPERIMENTAL: this API may change without prior notice.

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
mThe pointer to the mbuf.
ipv6_hdrThe pointer to the contiguous IPv6 header.
l4_offThe offset in bytes to start L4 checksum.
Returns
Return 0 if the checksum is correct, else -1.

Definition at line 744 of file rte_ip.h.

◆ rte_ipv6_get_next_ext()

static __rte_experimental int rte_ipv6_get_next_ext ( const uint8_t *  p,
int  proto,
size_t *  ext_len 
)
inlinestatic

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
pPointer to an extension raw data.
protoProtocol number extracted from the "next header" field from the IPv6 header or the previous extension.
ext_lenExtension data length.
Returns
next protocol number if proto is an IPv6 extension, -EINVAL otherwise
Examples:
examples/ipsec-secgw/ipsec-secgw.c.

Definition at line 799 of file rte_ip.h.