rte_ip_frag.h(3)
π rte_ip_frag.h β like, the manual page, bestie π
Ok so this is rte_ip_frag.h(3), and it lives in the Library Functions Manual section of your friendly neighborhood man pages (section 3, functions, you know the vibe). Grab a snack, we're doing IP fragmentation and reassembly πΈ
β¨ NAME β¨
rte_ip_frag.h β that's it, that's the name, no cap π
β¨ SYNOPSIS β¨
First off, you gotta pull in the squad:
#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>
π Data Structures
struct rte_ip_frag_death_rowβ yes it's really called that, and yes it's iconic, we'll get to it π
π Macros
#define RTE_IP_FRAG_DEATH_ROW_LEN 32#define RTE_IP_FRAG_DEATH_ROW_MBUF_LEN (RTE_IP_FRAG_DEATH_ROW_LEN * (RTE_LIBRTE_IP_FRAG_MAX_FRAG + 1))
Obsolete macros, kept here for compatibility reasons. Will be deprecated/removed in future DPDK releases.
bestie. these are on the way out. do not build your whole personality around them π«Ά
#define IP_FRAG_DEATH_ROW_LEN RTE_IP_FRAG_DEATH_ROW_LEN
#define IP_FRAG_DEATH_ROW_MBUF_LEN RTE_IP_FRAG_DEATH_ROW_MBUF_LEN
#define ipv6_extension_fragment rte_ipv6_fragment_ext
π 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
rte_ipv6_fragment_ext *frag_hdr)
static struct rte_ipv6_fragment_ext *
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)
int32_t rte_ipv4_fragment_copy_nonseg_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_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)
void rte_ip_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 β that's the whole thing, that's the assignment π
Implementation of IP packet fragmentation and reassembly. Basically: you have one big packet, the wire says "no β that's too thicc for me", so you chop it up, send the pieces, and glue them back together on the other side. It's giving arts and crafts but for networking π
Definition in file rte_ip_frag.h.
π§ Macro Definition Documentation π§
#define RTE_IP_FRAG_DEATH_ROW_LEN 32
death row size (in packets)
Definition at line 31 of file rte_ip_frag.h.
#define RTE_IP_FRAG_DEATH_ROW_MBUF_LEN (RTE_IP_FRAG_DEATH_ROW_LEN * (RTE_LIBRTE_IP_FRAG_MAX_FRAG + 1))
death row size in mbufs
Definition at line 34 of file rte_ip_frag.h.
#define IP_FRAG_DEATH_ROW_LEN RTE_IP_FRAG_DEATH_ROW_LEN
Obsolete π (we π said π what π we π said)
Definition at line 298 of file rte_ip_frag.h.
#define IP_FRAG_DEATH_ROW_MBUF_LEN RTE_IP_FRAG_DEATH_ROW_MBUF_LEN
Obsolete π
Definition at line 300 of file rte_ip_frag.h.
#define ipv6_extension_fragment rte_ipv6_fragment_ext
Obsolete π
Definition at line 302 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. Fresh table, fresh start, main character energy β¨
Parameters
- 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. (bestie. a power of two. we're serious.)
- 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_idargument is the socket identifier in the case of NUMA. The value can beSOCKET_ID_ANYif there is no NUMA constraints.
Returns
- The pointer to the new allocated fragmentation table, on success.
NULLon error. (sad girl hours π)
void rte_ip_frag_table_destroy (struct rte_ip_frag_tbl * tbl)
Free allocated IP fragmentation table. Let it go, let it gooo π¦
Parameters
- 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. Chop chop πͺβ¨
Parameters
- 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. (yes, the header is part of the math, don't come for me π)
- 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.
Returns
- Upon successful completion β number of output fragments placed in the
pkts_outarray. - Otherwise β
(-1) * errno. π
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 rte_ipv6_fragment_ext * frag_hdr)
This function implements reassembly of fragmented IPv6 packets. Incoming mbuf should have its l2_len/l3_len fields setup correctly. (lowkey non-negotiable, set them up bestie π«Ά)
Parameters
- 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.
Returns
Pointer to mbuf for reassembled packet, or NULL if:
- an error occurred.
- not all fragments of the packet are collected yet. (the group chat is still typingβ¦ β³)
struct rte_ipv6_fragment_ext * rte_ipv6_frag_get_ipv6_fragment_header (struct rte_ipv6_hdr * hdr) [inline], [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. (it's a one-glance girl, not a deep-dive girl π )
Parameters
- hdr β Pointer to the IPv6 header.
Returns
Pointer to the IPv6 fragment extension header, or NULL if it's not present.
Definition at line 143 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_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.
Returns
- Upon successful completion β number of output fragments placed in the
pkts_outarray. - Otherwise β
(-1) * errno. π
int32_t rte_ipv4_fragment_copy_nonseg_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)
IPv4 fragmentation by copy. (we're copying, we're not sharing, ok?)
This function implements the fragmentation of IPv4 packets by copy non-segmented mbuf. This function is mainly used to adapt Tx MBUF_FAST_FREE offload. MBUF_FAST_FREE: Device supports optimization for fast release of mbufs. When set, application must guarantee that per-queue all mbufs comes from the same mempool, has refcnt = 1, direct and non-segmented.
note the missing pool_indirect in this one's signature β that's not a typo, that's just how she is π
Parameters
- 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.
Returns
- Upon successful completion β number of output fragments placed in the
pkts_outarray. - Otherwise β
(-1) * errno. π
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
- 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
IPV4header inside the fragment. (spelled exactly like that in the source, and we respect it π)
Returns
Pointer to mbuf for reassembled packet, or NULL if:
- an error occurred.
- not all fragments of the packet are collected yet.
int rte_ipv4_frag_pkt_is_fragmented (const struct rte_ipv4_hdr * hdr) [inline], [static]
Check if the IPv4 packet is fragmented. Vibe check but for fragments β¨
Parameters
- hdr β IPv4 header of the packet
Returns
1 if fragmented, 0 if not fragmented
Definition at line 246 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. Yeah. Death row. It's a queue of doomed mbufs and honestly the naming is a whole mood π
Parameters
- 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. Receipts, bestie, we love receipts π§Ύπ
Parameters
- f β File to dump statistics to
- tbl β Fragmentation table to dump statistics from
void rte_ip_frag_table_del_expired_entries (struct rte_ip_frag_tbl * tbl, struct rte_ip_frag_death_row * dr, uint64_t tms)
Delete expired fragments. If they ghosted, they're gone π
Parameters
- tbl β Table to delete expired fragments from
- dr β Death row to free buffers to
- tms β Current timestamp
πΈ Author πΈ
Generated automatically by Doxygen for DPDK from the source code. (not a human, not a girlie, just a doc generator doing its lil thing π)
And that's a wrap on rte_ip_frag.h(3) π
big love to the DPDK squad, Version 25.11.3 β go fragment responsibly, reassemble your friendships, and never forget to set your l2_len/l3_len properly. mwah π«Άβ¨
π¦ where this page comes from
- ubuntu resolute: dpdk-doc 25.11.3-0ubuntu0.26.04.1 Β· BSD-3-Clause
- ubuntu stonking: dpdk-doc 25.11.3-1 Β· BSD-3-Clause
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash on : a language model's rewrite of the original, under its terms