1 /* SPDX-License-Identifier: BSD-3-Clause
2 * Copyright(c) 2017 Intel Corporation
10 * Interface to GRO library
20 #define RTE_GRO_MAX_BURST_ITEM_NUM 128U
21 /**< the max number of packets that rte_gro_reassemble_burst()
22 * can process in each invocation.
24 #define RTE_GRO_TYPE_MAX_NUM 64
25 /**< the max number of supported GRO types */
26 #define RTE_GRO_TYPE_SUPPORT_NUM 2
27 /**< the number of currently supported GRO types */
29 #define RTE_GRO_TCP_IPV4_INDEX 0
30 #define RTE_GRO_TCP_IPV4 (1ULL << RTE_GRO_TCP_IPV4_INDEX)
31 /**< TCP/IPv4 GRO flag */
32 #define RTE_GRO_IPV4_VXLAN_TCP_IPV4_INDEX 1
33 #define RTE_GRO_IPV4_VXLAN_TCP_IPV4 (1ULL << RTE_GRO_IPV4_VXLAN_TCP_IPV4_INDEX)
34 /**< VxLAN TCP/IPv4 GRO flag. */
35 #define RTE_GRO_UDP_IPV4_INDEX 2
36 #define RTE_GRO_UDP_IPV4 (1ULL << RTE_GRO_UDP_IPV4_INDEX)
37 /**< UDP/IPv4 GRO flag */
38 #define RTE_GRO_IPV4_VXLAN_UDP_IPV4_INDEX 3
39 #define RTE_GRO_IPV4_VXLAN_UDP_IPV4 (1ULL << RTE_GRO_IPV4_VXLAN_UDP_IPV4_INDEX)
40 /**< VxLAN UDP/IPv4 GRO flag. */
43 * Structure used to create GRO context objects or used to pass
44 * application-determined parameters to rte_gro_reassemble_burst().
46 struct rte_gro_param {
48 /**< desired GRO types */
49 uint16_t max_flow_num;
50 /**< max flow number */
51 uint16_t max_item_per_flow;
52 /**< max packet number per flow */
54 /**< socket index for allocating GRO related data structures,
55 * like reassembly tables. When use rte_gro_reassemble_burst(),
56 * applications don't need to set this value.
62 * @b EXPERIMENTAL: this API may change without prior notice
64 * This function create a GRO context object, which is used to merge
65 * packets in rte_gro_reassemble().
68 * applications use it to pass needed parameters to create a GRO
72 * if create successfully, return a pointer which points to the GRO
73 * context object. Otherwise, return NULL.
75 void *rte_gro_ctx_create(const struct rte_gro_param *param);
79 * @b EXPERIMENTAL: this API may change without prior notice
81 * This function destroys a GRO context object.
84 * pointer points to a GRO context object.
86 void rte_gro_ctx_destroy(void *ctx);
89 * This is one of the main reassembly APIs, which merges numbers of
90 * packets at a time. It doesn't check if input packets have correct
91 * checksums and doesn't re-calculate checksums for merged packets.
92 * It assumes the packets are complete (i.e., MF==0 && frag_off==0),
93 * when IP fragmentation is possible (i.e., DF==0). The GROed packets
94 * are returned as soon as the function finishes.
97 * Pointer array pointing to the packets to reassemble. Besides, it
98 * keeps MBUF addresses for the GROed packets.
100 * The number of packets to reassemble
102 * Application-determined parameters for reassembling packets.
105 * The number of packets after been GROed. If no packets are merged,
106 * the return value is equals to nb_pkts.
108 uint16_t rte_gro_reassemble_burst(struct rte_mbuf **pkts,
110 const struct rte_gro_param *param);
114 * @b EXPERIMENTAL: this API may change without prior notice
116 * Reassembly function, which tries to merge input packets with the
117 * existed packets in the reassembly tables of a given GRO context.
118 * It doesn't check if input packets have correct checksums and doesn't
119 * re-calculate checksums for merged packets. Additionally, it assumes
120 * the packets are complete (i.e., MF==0 && frag_off==0), when IP
121 * fragmentation is possible (i.e., DF==0).
123 * If the input packets have invalid parameters (e.g. no data payload,
124 * unsupported GRO types), they are returned to applications. Otherwise,
125 * they are either merged or inserted into the table. Applications need
126 * to flush packets from the tables by flush API, if they want to get the
130 * Packets to reassemble. It's also used to store the unprocessed packets.
132 * The number of packets to reassemble
134 * GRO context object pointer
137 * The number of unprocessed packets.
139 uint16_t rte_gro_reassemble(struct rte_mbuf **pkts,
145 * @b EXPERIMENTAL: this API may change without prior notice
147 * This function flushes the timeout packets from the reassembly tables
148 * of desired GRO types. The max number of flushed packets is the
149 * element number of 'out'.
151 * Additionally, the flushed packets may have incorrect checksums, since
152 * this function doesn't re-calculate checksums for merged packets.
155 * GRO context object pointer.
156 * @param timeout_cycles
157 * The max TTL for packets in reassembly tables, measured in nanosecond.
159 * This function flushes packets whose GRO types are specified by
162 * Pointer array used to keep flushed packets.
164 * The element number of 'out'. It's also the max number of timeout
165 * packets that can be flushed finally.
168 * The number of flushed packets.
170 uint16_t rte_gro_timeout_flush(void *ctx,
171 uint64_t timeout_cycles,
173 struct rte_mbuf **out,
174 uint16_t max_nb_out);
178 * @b EXPERIMENTAL: this API may change without prior notice
180 * This function returns the number of packets in all reassembly tables
181 * of a given GRO context.
184 * GRO context object pointer.
187 * The number of packets in the tables.
189 uint64_t rte_gro_get_pkt_count(void *ctx);
195 #endif /* _RTE_GRO_H_ */