DPDK
20.05.0
|
#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_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) |
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_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) |
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_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) |
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) |
RTE IP Fragmentation and Reassembly
Implementation of IP packet fragmentation and reassembly.
Definition in file rte_ip_frag.h.
#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.
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.
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.
bucket_num | Number of buckets in the hash table. |
bucket_entries | Number of entries per bucket (e.g. hash associativity). Should be power of two. |
max_entries | Maximum number of entries that could be stored in the table. The value should be less or equal then bucket_num * bucket_entries. |
max_cycles | Maximum TTL in cycles for each fragmented packet. |
socket_id | The 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. |
void rte_ip_frag_table_destroy | ( | struct rte_ip_frag_tbl * | tbl | ) |
Free allocated IP fragmentation table.
tbl | Fragmentation 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.
pkt_in | The input packet. |
pkts_out | Array storing the output fragments. |
nb_pkts_out | Number of fragments. |
mtu_size | Size in bytes of the Maximum Transfer Unit (MTU) for the outgoing IPv6 datagrams. This value includes the size of the IPv6 header. |
pool_direct | MBUF pool used for allocating direct buffers for the output fragments. |
pool_indirect | MBUF pool used for allocating indirect buffers for the output fragments. |
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.
tbl | Table where to lookup/add the fragmented packet. |
dr | Death row to free buffers to |
mb | Incoming mbuf with IPv6 fragment. |
tms | Fragment arrival timestamp. |
ip_hdr | Pointer to the IPv6 header. |
frag_hdr | Pointer to the IPv6 fragment extension header. |
|
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.
hdr | Pointer to the IPv6 header. |
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.
pkt_in | The input packet. |
pkts_out | Array storing the output fragments. |
nb_pkts_out | Number of fragments. |
mtu_size | Size in bytes of the Maximum Transfer Unit (MTU) for the outgoing IPv4 datagrams. This value includes the size of the IPv4 header. |
pool_direct | MBUF pool used for allocating direct buffers for the output fragments. |
pool_indirect | MBUF pool used for allocating indirect buffers for the output fragments. |
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.
tbl | Table where to lookup/add the fragmented packet. |
dr | Death row to free buffers to |
mb | Incoming mbuf with IPv4 fragment. |
tms | Fragment arrival timestamp. |
ip_hdr | Pointer to the IPV4 header inside the fragment. |
|
inlinestatic |
Check if the IPv4 packet is fragmented
hdr | IPv4 header of the packet |
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.
dr | Death row to free mbufs in. |
prefetch | How many buffers to prefetch before freeing. |
void rte_ip_frag_table_statistics_dump | ( | FILE * | f, |
const struct rte_ip_frag_tbl * | tbl | ||
) |
Dump fragmentation table statistics to file.
f | File to dump statistics to |
tbl | Fragmentation table to dump statistics from |
__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
tbl | Table to delete expired fragments from |
dr | Death row to free buffers to |
tms | Current timestamp |