DPDK  20.08.0
Data Structures | Macros | Enumerations | Functions
rte_ip_frag.h File Reference
#include <stdint.h>
#include <stdio.h>
#include <rte_config.h>
#include <rte_malloc.h>
#include <rte_memory.h>
#include <rte_ip.h>
#include <rte_byteorder.h>

Go to the source code of this file.

Data Structures

struct  rte_ip_frag_death_row
 
struct  ip_frag_tbl_stat
 
struct  rte_ip_frag_tbl
 

Macros

#define IP_FRAG_DEATH_ROW_LEN   32
 
#define RTE_IPV6_EHDR_MF_SHIFT   0
 

Enumerations

enum  { IP_LAST_FRAG_IDX, IP_FIRST_FRAG_IDX, IP_MIN_FRAG_NUM, IP_MAX_FRAG_NUM = RTE_LIBRTE_IP_FRAG_MAX_FRAG }
 

Functions

struct rte_ip_frag_tblrte_ip_frag_table_create (uint32_t bucket_num, uint32_t bucket_entries, uint32_t max_entries, uint64_t max_cycles, int socket_id)
 
void rte_ip_frag_table_destroy (struct rte_ip_frag_tbl *tbl)
 
int32_t rte_ipv6_fragment_packet (struct rte_mbuf *pkt_in, struct rte_mbuf **pkts_out, uint16_t nb_pkts_out, uint16_t mtu_size, struct rte_mempool *pool_direct, struct rte_mempool *pool_indirect)
 
struct rte_mbufrte_ipv6_frag_reassemble_packet (struct rte_ip_frag_tbl *tbl, struct rte_ip_frag_death_row *dr, struct rte_mbuf *mb, uint64_t tms, struct rte_ipv6_hdr *ip_hdr, struct ipv6_extension_fragment *frag_hdr)
 
static struct ipv6_extension_fragment * rte_ipv6_frag_get_ipv6_fragment_header (struct rte_ipv6_hdr *hdr)
 
int32_t rte_ipv4_fragment_packet (struct rte_mbuf *pkt_in, struct rte_mbuf **pkts_out, uint16_t nb_pkts_out, uint16_t mtu_size, struct rte_mempool *pool_direct, struct rte_mempool *pool_indirect)
 
struct rte_mbufrte_ipv4_frag_reassemble_packet (struct rte_ip_frag_tbl *tbl, struct rte_ip_frag_death_row *dr, struct rte_mbuf *mb, uint64_t tms, struct rte_ipv4_hdr *ip_hdr)
 
static int rte_ipv4_frag_pkt_is_fragmented (const struct rte_ipv4_hdr *hdr)
 
void rte_ip_frag_free_death_row (struct rte_ip_frag_death_row *dr, uint32_t prefetch)
 
void rte_ip_frag_table_statistics_dump (FILE *f, const struct rte_ip_frag_tbl *tbl)
 
__rte_experimental void rte_frag_table_del_expired_entries (struct rte_ip_frag_tbl *tbl, struct rte_ip_frag_death_row *dr, uint64_t tms)
 

Detailed Description

RTE IP Fragmentation and Reassembly

Implementation of IP packet fragmentation and reassembly.

Definition in file rte_ip_frag.h.

Macro Definition Documentation

#define IP_FRAG_DEATH_ROW_LEN   32

death row size (in packets)

Definition at line 74 of file rte_ip_frag.h.

#define RTE_IPV6_EHDR_MF_SHIFT   0

IPv6 fragment extension header

Definition at line 114 of file rte_ip_frag.h.

Enumeration Type Documentation

anonymous enum
Enumerator
IP_LAST_FRAG_IDX 

index of last fragment

IP_FIRST_FRAG_IDX 

index of first fragment

IP_MIN_FRAG_NUM 

minimum number of fragments

IP_MAX_FRAG_NUM 

maximum number of fragments per packet

Definition at line 30 of file rte_ip_frag.h.

Function Documentation

struct rte_ip_frag_tbl* rte_ip_frag_table_create ( uint32_t  bucket_num,
uint32_t  bucket_entries,
uint32_t  max_entries,
uint64_t  max_cycles,
int  socket_id 
)

Create a new IP fragmentation table.

Parameters
bucket_numNumber of buckets in the hash table.
bucket_entriesNumber of entries per bucket (e.g. hash associativity). Should be power of two.
max_entriesMaximum number of entries that could be stored in the table. The value should be less or equal then bucket_num * bucket_entries.
max_cyclesMaximum TTL in cycles for each fragmented packet.
socket_idThe socket_id argument is the socket identifier in the case of NUMA. The value can be SOCKET_ID_ANY if there is no NUMA constraints.
Returns
The pointer to the new allocated fragmentation table, on success. NULL on error.
Examples:
examples/ip_reassembly/main.c, and examples/ipsec-secgw/ipsec-secgw.c.
void rte_ip_frag_table_destroy ( struct rte_ip_frag_tbl tbl)

Free allocated IP fragmentation table.

Parameters
tblFragmentation table to free.
int32_t rte_ipv6_fragment_packet ( struct rte_mbuf pkt_in,
struct rte_mbuf **  pkts_out,
uint16_t  nb_pkts_out,
uint16_t  mtu_size,
struct rte_mempool pool_direct,
struct rte_mempool pool_indirect 
)

This function implements the fragmentation of IPv6 packets.

Parameters
pkt_inThe input packet.
pkts_outArray storing the output fragments.
nb_pkts_outNumber of fragments.
mtu_sizeSize in bytes of the Maximum Transfer Unit (MTU) for the outgoing IPv6 datagrams. This value includes the size of the IPv6 header.
pool_directMBUF pool used for allocating direct buffers for the output fragments.
pool_indirectMBUF pool used for allocating indirect buffers for the output fragments.
Returns
Upon successful completion - number of output fragments placed in the pkts_out array. Otherwise - (-1) * errno.
Examples:
examples/ip_fragmentation/main.c, and examples/ipsec-secgw/ipsec-secgw.c.
struct rte_mbuf* rte_ipv6_frag_reassemble_packet ( struct rte_ip_frag_tbl tbl,
struct rte_ip_frag_death_row dr,
struct rte_mbuf mb,
uint64_t  tms,
struct rte_ipv6_hdr ip_hdr,
struct ipv6_extension_fragment *  frag_hdr 
)

This function implements reassembly of fragmented IPv6 packets. Incoming mbuf should have its l2_len/l3_len fields setup correctly.

Parameters
tblTable where to lookup/add the fragmented packet.
drDeath row to free buffers to
mbIncoming mbuf with IPv6 fragment.
tmsFragment arrival timestamp.
ip_hdrPointer to the IPv6 header.
frag_hdrPointer to the IPv6 fragment extension header.
Returns
Pointer to mbuf for reassembled packet, or NULL if:
  • an error occurred.
  • not all fragments of the packet are collected yet.
Examples:
examples/ip_reassembly/main.c, and examples/ipsec-secgw/ipsec-secgw.c.
static struct ipv6_extension_fragment* rte_ipv6_frag_get_ipv6_fragment_header ( struct rte_ipv6_hdr hdr)
static

Return a pointer to the packet's fragment header, if found. It only looks at the extension header that's right after the fixed IPv6 header, and doesn't follow the whole chain of extension headers.

Parameters
hdrPointer to the IPv6 header.
Returns
Pointer to the IPv6 fragment extension header, or NULL if it's not present.
Examples:
examples/ip_reassembly/main.c, and examples/ipsec-secgw/ipsec-secgw.c.

Definition at line 237 of file rte_ip_frag.h.

int32_t rte_ipv4_fragment_packet ( struct rte_mbuf pkt_in,
struct rte_mbuf **  pkts_out,
uint16_t  nb_pkts_out,
uint16_t  mtu_size,
struct rte_mempool pool_direct,
struct rte_mempool pool_indirect 
)

IPv4 fragmentation.

This function implements the fragmentation of IPv4 packets.

Parameters
pkt_inThe input packet.
pkts_outArray storing the output fragments.
nb_pkts_outNumber of fragments.
mtu_sizeSize in bytes of the Maximum Transfer Unit (MTU) for the outgoing IPv4 datagrams. This value includes the size of the IPv4 header.
pool_directMBUF pool used for allocating direct buffers for the output fragments.
pool_indirectMBUF pool used for allocating indirect buffers for the output fragments.
Returns
Upon successful completion - number of output fragments placed in the pkts_out array. Otherwise - (-1) * errno.
Examples:
examples/ip_fragmentation/main.c, and examples/ipsec-secgw/ipsec-secgw.c.
struct rte_mbuf* rte_ipv4_frag_reassemble_packet ( struct rte_ip_frag_tbl tbl,
struct rte_ip_frag_death_row dr,
struct rte_mbuf mb,
uint64_t  tms,
struct rte_ipv4_hdr ip_hdr 
)

This function implements reassembly of fragmented IPv4 packets. Incoming mbufs should have its l2_len/l3_len fields setup correctly.

Parameters
tblTable where to lookup/add the fragmented packet.
drDeath row to free buffers to
mbIncoming mbuf with IPv4 fragment.
tmsFragment arrival timestamp.
ip_hdrPointer to the IPV4 header inside the fragment.
Returns
Pointer to mbuf for reassembled packet, or NULL if:
  • an error occurred.
  • not all fragments of the packet are collected yet.
Examples:
examples/ip_reassembly/main.c, and examples/ipsec-secgw/ipsec-secgw.c.
static int rte_ipv4_frag_pkt_is_fragmented ( const struct rte_ipv4_hdr hdr)
inlinestatic

Check if the IPv4 packet is fragmented

Parameters
hdrIPv4 header of the packet
Returns
1 if fragmented, 0 if not fragmented
Examples:
examples/ip_reassembly/main.c, and examples/ipsec-secgw/ipsec-secgw.c.

Definition at line 307 of file rte_ip_frag.h.

void rte_ip_frag_free_death_row ( struct rte_ip_frag_death_row dr,
uint32_t  prefetch 
)

Free mbufs on a given death row.

Parameters
drDeath row to free mbufs in.
prefetchHow many buffers to prefetch before freeing.
Examples:
examples/ip_reassembly/main.c, and examples/ipsec-secgw/ipsec-secgw.c.
void rte_ip_frag_table_statistics_dump ( FILE *  f,
const struct rte_ip_frag_tbl tbl 
)

Dump fragmentation table statistics to file.

Parameters
fFile to dump statistics to
tblFragmentation table to dump statistics from
Examples:
examples/ip_reassembly/main.c.
__rte_experimental void rte_frag_table_del_expired_entries ( struct rte_ip_frag_tbl tbl,
struct rte_ip_frag_death_row dr,
uint64_t  tms 
)

Delete expired fragments

Parameters
tblTable to delete expired fragments from
drDeath row to free buffers to
tmsCurrent timestamp