DPDK  23.03.0
rte_ip_frag.h
Go to the documentation of this file.
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(c) 2010-2014 Intel Corporation
3  */
4 
5 #ifndef _RTE_IP_FRAG_H_
6 #define _RTE_IP_FRAG_H_
7 
15 #ifdef __cplusplus
16 extern "C" {
17 #endif
18 
19 #include <stdint.h>
20 #include <stdio.h>
21 
22 #include <rte_compat.h>
23 #include <rte_config.h>
24 #include <rte_malloc.h>
25 #include <rte_memory.h>
26 #include <rte_ip.h>
27 #include <rte_byteorder.h>
28 
29 struct rte_mbuf;
30 
32 #define RTE_IP_FRAG_DEATH_ROW_LEN 32
33 
35 #define RTE_IP_FRAG_DEATH_ROW_MBUF_LEN \
36  (RTE_IP_FRAG_DEATH_ROW_LEN * (RTE_LIBRTE_IP_FRAG_MAX_FRAG + 1))
37 
40  uint32_t cnt;
43 };
44 
64 struct rte_ip_frag_tbl * rte_ip_frag_table_create(uint32_t bucket_num,
65  uint32_t bucket_entries, uint32_t max_entries,
66  uint64_t max_cycles, int socket_id);
67 
74 void
75 rte_ip_frag_table_destroy(struct rte_ip_frag_tbl *tbl);
76 
98 int32_t
99 rte_ipv6_fragment_packet(struct rte_mbuf *pkt_in,
100  struct rte_mbuf **pkts_out,
101  uint16_t nb_pkts_out,
102  uint16_t mtu_size,
103  struct rte_mempool *pool_direct,
104  struct rte_mempool *pool_indirect);
105 
127 struct rte_mbuf *rte_ipv6_frag_reassemble_packet(struct rte_ip_frag_tbl *tbl,
128  struct rte_ip_frag_death_row *dr,
129  struct rte_mbuf *mb, uint64_t tms, struct rte_ipv6_hdr *ip_hdr,
130  struct rte_ipv6_fragment_ext *frag_hdr);
131 
143 static inline struct rte_ipv6_fragment_ext *
145 {
146  if (hdr->proto == IPPROTO_FRAGMENT) {
147  return (struct rte_ipv6_fragment_ext *) ++hdr;
148  }
149  else
150  return NULL;
151 }
152 
176 int32_t rte_ipv4_fragment_packet(struct rte_mbuf *pkt_in,
177  struct rte_mbuf **pkts_out,
178  uint16_t nb_pkts_out, uint16_t mtu_size,
179  struct rte_mempool *pool_direct,
180  struct rte_mempool *pool_indirect);
181 
208 __rte_experimental
209 int32_t
211  struct rte_mbuf **pkts_out,
212  uint16_t nb_pkts_out,
213  uint16_t mtu_size,
214  struct rte_mempool *pool_direct);
215 
235 struct rte_mbuf * rte_ipv4_frag_reassemble_packet(struct rte_ip_frag_tbl *tbl,
236  struct rte_ip_frag_death_row *dr,
237  struct rte_mbuf *mb, uint64_t tms, struct rte_ipv4_hdr *ip_hdr);
238 
247 static inline int
249 {
250  uint16_t flag_offset, ip_flag, ip_ofs;
251 
252  flag_offset = rte_be_to_cpu_16(hdr->fragment_offset);
253  ip_ofs = (uint16_t)(flag_offset & RTE_IPV4_HDR_OFFSET_MASK);
254  ip_flag = (uint16_t)(flag_offset & RTE_IPV4_HDR_MF_FLAG);
255 
256  return ip_flag != 0 || ip_ofs != 0;
257 }
258 
268  uint32_t prefetch);
269 
270 
279 void
280 rte_ip_frag_table_statistics_dump(FILE * f, const struct rte_ip_frag_tbl *tbl);
281 
292 __rte_experimental
293 void
294 rte_ip_frag_table_del_expired_entries(struct rte_ip_frag_tbl *tbl,
295  struct rte_ip_frag_death_row *dr, uint64_t tms);
296 
301 #define IP_FRAG_DEATH_ROW_LEN RTE_IP_FRAG_DEATH_ROW_LEN
302 
303 #define IP_FRAG_DEATH_ROW_MBUF_LEN RTE_IP_FRAG_DEATH_ROW_MBUF_LEN
304 
305 #define ipv6_extension_fragment rte_ipv6_fragment_ext
306 
308 #ifdef __cplusplus
309 }
310 #endif
311 
312 #endif /* _RTE_IP_FRAG_H_ */
struct rte_mbuf * row[RTE_IP_FRAG_DEATH_ROW_MBUF_LEN]
Definition: rte_ip_frag.h:41
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)
rte_be16_t fragment_offset
Definition: rte_ip.h:59
static struct rte_ipv6_fragment_ext * rte_ipv6_frag_get_ipv6_fragment_header(struct rte_ipv6_hdr *hdr)
Definition: rte_ip_frag.h:144
void rte_ip_frag_table_destroy(struct rte_ip_frag_tbl *tbl)
void rte_ip_frag_free_death_row(struct rte_ip_frag_death_row *dr, uint32_t prefetch)
__rte_experimental void rte_ip_frag_table_del_expired_entries(struct rte_ip_frag_tbl *tbl, struct rte_ip_frag_death_row *dr, uint64_t tms)
__rte_experimental 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)
uint8_t proto
Definition: rte_ip.h:538
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_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)
static int rte_ipv4_frag_pkt_is_fragmented(const struct rte_ipv4_hdr *hdr)
Definition: rte_ip_frag.h:248
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)
#define RTE_IP_FRAG_DEATH_ROW_MBUF_LEN
Definition: rte_ip_frag.h:35
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)
static uint16_t rte_be_to_cpu_16(rte_be16_t x)
void rte_ip_frag_table_statistics_dump(FILE *f, const struct rte_ip_frag_tbl *tbl)