]>
Commit | Line | Data |
---|---|---|
11fdf7f2 TL |
1 | /* SPDX-License-Identifier: BSD-3-Clause |
2 | * Copyright(c) 2010-2014 Intel Corporation. | |
3 | * Copyright 2014 6WIND S.A. | |
4 | */ | |
5 | ||
f67539c2 TL |
6 | #ifndef _RTE_MBUF_CORE_H_ |
7 | #define _RTE_MBUF_CORE_H_ | |
11fdf7f2 | 8 | |
f67539c2 TL |
9 | /** |
10 | * @file | |
11 | * This file contains definion of RTE mbuf structure itself, | |
12 | * packet offload flags and some related macros. | |
13 | * For majority of DPDK entities, it is not recommended to include | |
14 | * this file directly, use include <rte_mbuf.h> instead. | |
15 | */ | |
11fdf7f2 TL |
16 | |
17 | #include <stdint.h> | |
f67539c2 TL |
18 | #include <rte_compat.h> |
19 | #include <generic/rte_atomic.h> | |
11fdf7f2 TL |
20 | |
21 | #ifdef __cplusplus | |
22 | extern "C" { | |
23 | #endif | |
24 | ||
25 | /* | |
26 | * Packet Offload Features Flags. It also carry packet type information. | |
27 | * Critical resources. Both rx/tx shared these bits. Be cautious on any change | |
28 | * | |
29 | * - RX flags start at bit position zero, and get added to the left of previous | |
30 | * flags. | |
31 | * - The most-significant 3 bits are reserved for generic mbuf flags | |
32 | * - TX flags therefore start at bit position 60 (i.e. 63-3), and new flags get | |
33 | * added to the right of the previously defined flags i.e. they should count | |
34 | * downwards, not upwards. | |
35 | * | |
36 | * Keep these flags synchronized with rte_get_rx_ol_flag_name() and | |
37 | * rte_get_tx_ol_flag_name(). | |
38 | */ | |
39 | ||
40 | /** | |
f67539c2 TL |
41 | * The RX packet is a 802.1q VLAN packet, and the tci has been |
42 | * saved in in mbuf->vlan_tci. | |
43 | * If the flag PKT_RX_VLAN_STRIPPED is also present, the VLAN | |
44 | * header has been stripped from mbuf data, else it is still | |
45 | * present. | |
11fdf7f2 | 46 | */ |
f67539c2 | 47 | #define PKT_RX_VLAN (1ULL << 0) |
11fdf7f2 | 48 | |
f67539c2 | 49 | /** RX packet with RSS hash result. */ |
11fdf7f2 | 50 | #define PKT_RX_RSS_HASH (1ULL << 1) |
f67539c2 TL |
51 | |
52 | /** RX packet with FDIR match indicate. */ | |
11fdf7f2 | 53 | #define PKT_RX_FDIR (1ULL << 2) |
11fdf7f2 TL |
54 | |
55 | /** | |
56 | * Deprecated. | |
57 | * Checking this flag alone is deprecated: check the 2 bits of | |
58 | * PKT_RX_L4_CKSUM_MASK. | |
59 | * This flag was set when the L4 checksum of a packet was detected as | |
60 | * wrong by the hardware. | |
61 | */ | |
62 | #define PKT_RX_L4_CKSUM_BAD (1ULL << 3) | |
63 | ||
64 | /** | |
65 | * Deprecated. | |
66 | * Checking this flag alone is deprecated: check the 2 bits of | |
67 | * PKT_RX_IP_CKSUM_MASK. | |
68 | * This flag was set when the IP checksum of a packet was detected as | |
69 | * wrong by the hardware. | |
70 | */ | |
71 | #define PKT_RX_IP_CKSUM_BAD (1ULL << 4) | |
72 | ||
f67539c2 | 73 | /** External IP header checksum error. */ |
11fdf7f2 | 74 | #define PKT_RX_EIP_CKSUM_BAD (1ULL << 5) |
11fdf7f2 TL |
75 | |
76 | /** | |
77 | * A vlan has been stripped by the hardware and its tci is saved in | |
78 | * mbuf->vlan_tci. This can only happen if vlan stripping is enabled | |
79 | * in the RX configuration of the PMD. | |
f67539c2 | 80 | * When PKT_RX_VLAN_STRIPPED is set, PKT_RX_VLAN must also be set. |
11fdf7f2 TL |
81 | */ |
82 | #define PKT_RX_VLAN_STRIPPED (1ULL << 6) | |
83 | ||
84 | /** | |
85 | * Mask of bits used to determine the status of RX IP checksum. | |
86 | * - PKT_RX_IP_CKSUM_UNKNOWN: no information about the RX IP checksum | |
87 | * - PKT_RX_IP_CKSUM_BAD: the IP checksum in the packet is wrong | |
88 | * - PKT_RX_IP_CKSUM_GOOD: the IP checksum in the packet is valid | |
89 | * - PKT_RX_IP_CKSUM_NONE: the IP checksum is not correct in the packet | |
90 | * data, but the integrity of the IP header is verified. | |
91 | */ | |
92 | #define PKT_RX_IP_CKSUM_MASK ((1ULL << 4) | (1ULL << 7)) | |
93 | ||
94 | #define PKT_RX_IP_CKSUM_UNKNOWN 0 | |
95 | #define PKT_RX_IP_CKSUM_BAD (1ULL << 4) | |
96 | #define PKT_RX_IP_CKSUM_GOOD (1ULL << 7) | |
97 | #define PKT_RX_IP_CKSUM_NONE ((1ULL << 4) | (1ULL << 7)) | |
98 | ||
99 | /** | |
100 | * Mask of bits used to determine the status of RX L4 checksum. | |
101 | * - PKT_RX_L4_CKSUM_UNKNOWN: no information about the RX L4 checksum | |
102 | * - PKT_RX_L4_CKSUM_BAD: the L4 checksum in the packet is wrong | |
103 | * - PKT_RX_L4_CKSUM_GOOD: the L4 checksum in the packet is valid | |
104 | * - PKT_RX_L4_CKSUM_NONE: the L4 checksum is not correct in the packet | |
105 | * data, but the integrity of the L4 data is verified. | |
106 | */ | |
107 | #define PKT_RX_L4_CKSUM_MASK ((1ULL << 3) | (1ULL << 8)) | |
108 | ||
109 | #define PKT_RX_L4_CKSUM_UNKNOWN 0 | |
110 | #define PKT_RX_L4_CKSUM_BAD (1ULL << 3) | |
111 | #define PKT_RX_L4_CKSUM_GOOD (1ULL << 8) | |
112 | #define PKT_RX_L4_CKSUM_NONE ((1ULL << 3) | (1ULL << 8)) | |
113 | ||
f67539c2 | 114 | /** RX IEEE1588 L2 Ethernet PT Packet. */ |
11fdf7f2 | 115 | #define PKT_RX_IEEE1588_PTP (1ULL << 9) |
f67539c2 TL |
116 | |
117 | /** RX IEEE1588 L2/L4 timestamped packet.*/ | |
11fdf7f2 | 118 | #define PKT_RX_IEEE1588_TMST (1ULL << 10) |
f67539c2 TL |
119 | |
120 | /** FD id reported if FDIR match. */ | |
11fdf7f2 | 121 | #define PKT_RX_FDIR_ID (1ULL << 13) |
f67539c2 TL |
122 | |
123 | /** Flexible bytes reported if FDIR match. */ | |
11fdf7f2 | 124 | #define PKT_RX_FDIR_FLX (1ULL << 14) |
11fdf7f2 TL |
125 | |
126 | /** | |
127 | * The 2 vlans have been stripped by the hardware and their tci are | |
128 | * saved in mbuf->vlan_tci (inner) and mbuf->vlan_tci_outer (outer). | |
129 | * This can only happen if vlan stripping is enabled in the RX | |
f67539c2 TL |
130 | * configuration of the PMD. |
131 | * When PKT_RX_QINQ_STRIPPED is set, the flags (PKT_RX_VLAN | | |
132 | * PKT_RX_VLAN_STRIPPED | PKT_RX_QINQ) must also be set. | |
11fdf7f2 TL |
133 | */ |
134 | #define PKT_RX_QINQ_STRIPPED (1ULL << 15) | |
135 | ||
11fdf7f2 TL |
136 | /** |
137 | * When packets are coalesced by a hardware or virtual driver, this flag | |
138 | * can be set in the RX mbuf, meaning that the m->tso_segsz field is | |
139 | * valid and is set to the segment size of original packets. | |
140 | */ | |
141 | #define PKT_RX_LRO (1ULL << 16) | |
142 | ||
143 | /** | |
144 | * Indicate that the timestamp field in the mbuf is valid. | |
145 | */ | |
146 | #define PKT_RX_TIMESTAMP (1ULL << 17) | |
147 | ||
f67539c2 TL |
148 | /** |
149 | * Indicate that security offload processing was applied on the RX packet. | |
150 | */ | |
151 | #define PKT_RX_SEC_OFFLOAD (1ULL << 18) | |
11fdf7f2 | 152 | |
f67539c2 TL |
153 | /** |
154 | * Indicate that security offload processing failed on the RX packet. | |
155 | */ | |
156 | #define PKT_RX_SEC_OFFLOAD_FAILED (1ULL << 19) | |
157 | ||
158 | /** | |
159 | * The RX packet is a double VLAN, and the outer tci has been | |
160 | * saved in in mbuf->vlan_tci_outer. If PKT_RX_QINQ set, PKT_RX_VLAN | |
161 | * also should be set and inner tci should be saved to mbuf->vlan_tci. | |
162 | * If the flag PKT_RX_QINQ_STRIPPED is also present, both VLANs | |
163 | * headers have been stripped from mbuf data, else they are still | |
164 | * present. | |
165 | */ | |
166 | #define PKT_RX_QINQ (1ULL << 20) | |
167 | ||
168 | /** | |
169 | * Mask of bits used to determine the status of outer RX L4 checksum. | |
170 | * - PKT_RX_OUTER_L4_CKSUM_UNKNOWN: no info about the outer RX L4 checksum | |
171 | * - PKT_RX_OUTER_L4_CKSUM_BAD: the outer L4 checksum in the packet is wrong | |
172 | * - PKT_RX_OUTER_L4_CKSUM_GOOD: the outer L4 checksum in the packet is valid | |
173 | * - PKT_RX_OUTER_L4_CKSUM_INVALID: invalid outer L4 checksum state. | |
174 | * | |
175 | * The detection of PKT_RX_OUTER_L4_CKSUM_GOOD shall be based on the given | |
176 | * HW capability, At minimum, the PMD should support | |
177 | * PKT_RX_OUTER_L4_CKSUM_UNKNOWN and PKT_RX_OUTER_L4_CKSUM_BAD states | |
178 | * if the DEV_RX_OFFLOAD_OUTER_UDP_CKSUM offload is available. | |
179 | */ | |
180 | #define PKT_RX_OUTER_L4_CKSUM_MASK ((1ULL << 21) | (1ULL << 22)) | |
181 | ||
182 | #define PKT_RX_OUTER_L4_CKSUM_UNKNOWN 0 | |
183 | #define PKT_RX_OUTER_L4_CKSUM_BAD (1ULL << 21) | |
184 | #define PKT_RX_OUTER_L4_CKSUM_GOOD (1ULL << 22) | |
185 | #define PKT_RX_OUTER_L4_CKSUM_INVALID ((1ULL << 21) | (1ULL << 22)) | |
186 | ||
187 | /* add new RX flags here, don't forget to update PKT_FIRST_FREE */ | |
188 | ||
189 | #define PKT_FIRST_FREE (1ULL << 23) | |
190 | #define PKT_LAST_FREE (1ULL << 40) | |
191 | ||
192 | /* add new TX flags here, don't forget to update PKT_LAST_FREE */ | |
193 | ||
194 | /** | |
195 | * Outer UDP checksum offload flag. This flag is used for enabling | |
196 | * outer UDP checksum in PMD. To use outer UDP checksum, the user needs to | |
197 | * 1) Enable the following in mbuf, | |
198 | * a) Fill outer_l2_len and outer_l3_len in mbuf. | |
199 | * b) Set the PKT_TX_OUTER_UDP_CKSUM flag. | |
200 | * c) Set the PKT_TX_OUTER_IPV4 or PKT_TX_OUTER_IPV6 flag. | |
201 | * 2) Configure DEV_TX_OFFLOAD_OUTER_UDP_CKSUM offload flag. | |
202 | */ | |
203 | #define PKT_TX_OUTER_UDP_CKSUM (1ULL << 41) | |
204 | ||
205 | /** | |
206 | * UDP Fragmentation Offload flag. This flag is used for enabling UDP | |
207 | * fragmentation in SW or in HW. When use UFO, mbuf->tso_segsz is used | |
208 | * to store the MSS of UDP fragments. | |
209 | */ | |
210 | #define PKT_TX_UDP_SEG (1ULL << 42) | |
211 | ||
212 | /** | |
213 | * Request security offload processing on the TX packet. | |
214 | */ | |
215 | #define PKT_TX_SEC_OFFLOAD (1ULL << 43) | |
11fdf7f2 TL |
216 | |
217 | /** | |
218 | * Offload the MACsec. This flag must be set by the application to enable | |
219 | * this offload feature for a packet to be transmitted. | |
220 | */ | |
221 | #define PKT_TX_MACSEC (1ULL << 44) | |
222 | ||
223 | /** | |
224 | * Bits 45:48 used for the tunnel type. | |
f67539c2 TL |
225 | * The tunnel type must be specified for TSO or checksum on the inner part |
226 | * of tunnel packets. | |
227 | * These flags can be used with PKT_TX_TCP_SEG for TSO, or PKT_TX_xxx_CKSUM. | |
228 | * The mbuf fields for inner and outer header lengths are required: | |
229 | * outer_l2_len, outer_l3_len, l2_len, l3_len, l4_len and tso_segsz for TSO. | |
11fdf7f2 TL |
230 | */ |
231 | #define PKT_TX_TUNNEL_VXLAN (0x1ULL << 45) | |
232 | #define PKT_TX_TUNNEL_GRE (0x2ULL << 45) | |
233 | #define PKT_TX_TUNNEL_IPIP (0x3ULL << 45) | |
234 | #define PKT_TX_TUNNEL_GENEVE (0x4ULL << 45) | |
f67539c2 | 235 | /** TX packet with MPLS-in-UDP RFC 7510 header. */ |
11fdf7f2 | 236 | #define PKT_TX_TUNNEL_MPLSINUDP (0x5ULL << 45) |
f67539c2 TL |
237 | #define PKT_TX_TUNNEL_VXLAN_GPE (0x6ULL << 45) |
238 | #define PKT_TX_TUNNEL_GTP (0x7ULL << 45) | |
239 | /** | |
240 | * Generic IP encapsulated tunnel type, used for TSO and checksum offload. | |
241 | * It can be used for tunnels which are not standards or listed above. | |
242 | * It is preferred to use specific tunnel flags like PKT_TX_TUNNEL_GRE | |
243 | * or PKT_TX_TUNNEL_IPIP if possible. | |
244 | * The ethdev must be configured with DEV_TX_OFFLOAD_IP_TNL_TSO. | |
245 | * Outer and inner checksums are done according to the existing flags like | |
246 | * PKT_TX_xxx_CKSUM. | |
247 | * Specific tunnel headers that contain payload length, sequence id | |
248 | * or checksum are not expected to be updated. | |
249 | */ | |
250 | #define PKT_TX_TUNNEL_IP (0xDULL << 45) | |
251 | /** | |
252 | * Generic UDP encapsulated tunnel type, used for TSO and checksum offload. | |
253 | * UDP tunnel type implies outer IP layer. | |
254 | * It can be used for tunnels which are not standards or listed above. | |
255 | * It is preferred to use specific tunnel flags like PKT_TX_TUNNEL_VXLAN | |
256 | * if possible. | |
257 | * The ethdev must be configured with DEV_TX_OFFLOAD_UDP_TNL_TSO. | |
258 | * Outer and inner checksums are done according to the existing flags like | |
259 | * PKT_TX_xxx_CKSUM. | |
260 | * Specific tunnel headers that contain payload length, sequence id | |
261 | * or checksum are not expected to be updated. | |
262 | */ | |
263 | #define PKT_TX_TUNNEL_UDP (0xEULL << 45) | |
11fdf7f2 TL |
264 | /* add new TX TUNNEL type here */ |
265 | #define PKT_TX_TUNNEL_MASK (0xFULL << 45) | |
266 | ||
267 | /** | |
f67539c2 TL |
268 | * Double VLAN insertion (QinQ) request to driver, driver may offload the |
269 | * insertion based on device capability. | |
270 | * mbuf 'vlan_tci' & 'vlan_tci_outer' must be valid when this flag is set. | |
11fdf7f2 | 271 | */ |
f67539c2 TL |
272 | #define PKT_TX_QINQ (1ULL << 49) |
273 | /* this old name is deprecated */ | |
274 | #define PKT_TX_QINQ_PKT PKT_TX_QINQ | |
11fdf7f2 TL |
275 | |
276 | /** | |
277 | * TCP segmentation offload. To enable this offload feature for a | |
278 | * packet to be transmitted on hardware supporting TSO: | |
279 | * - set the PKT_TX_TCP_SEG flag in mbuf->ol_flags (this flag implies | |
280 | * PKT_TX_TCP_CKSUM) | |
281 | * - set the flag PKT_TX_IPV4 or PKT_TX_IPV6 | |
f67539c2 | 282 | * - if it's IPv4, set the PKT_TX_IP_CKSUM flag |
11fdf7f2 | 283 | * - fill the mbuf offload information: l2_len, l3_len, l4_len, tso_segsz |
11fdf7f2 TL |
284 | */ |
285 | #define PKT_TX_TCP_SEG (1ULL << 50) | |
286 | ||
f67539c2 | 287 | /** TX IEEE1588 packet to timestamp. */ |
11fdf7f2 | 288 | #define PKT_TX_IEEE1588_TMST (1ULL << 51) |
11fdf7f2 TL |
289 | |
290 | /** | |
291 | * Bits 52+53 used for L4 packet type with checksum enabled: 00: Reserved, | |
292 | * 01: TCP checksum, 10: SCTP checksum, 11: UDP checksum. To use hardware | |
293 | * L4 checksum offload, the user needs to: | |
294 | * - fill l2_len and l3_len in mbuf | |
295 | * - set the flags PKT_TX_TCP_CKSUM, PKT_TX_SCTP_CKSUM or PKT_TX_UDP_CKSUM | |
296 | * - set the flag PKT_TX_IPV4 or PKT_TX_IPV6 | |
11fdf7f2 | 297 | */ |
f67539c2 TL |
298 | #define PKT_TX_L4_NO_CKSUM (0ULL << 52) /**< Disable L4 cksum of TX pkt. */ |
299 | ||
300 | /** TCP cksum of TX pkt. computed by NIC. */ | |
11fdf7f2 | 301 | #define PKT_TX_TCP_CKSUM (1ULL << 52) |
f67539c2 TL |
302 | |
303 | /** SCTP cksum of TX pkt. computed by NIC. */ | |
11fdf7f2 | 304 | #define PKT_TX_SCTP_CKSUM (2ULL << 52) |
f67539c2 TL |
305 | |
306 | /** UDP cksum of TX pkt. computed by NIC. */ | |
11fdf7f2 | 307 | #define PKT_TX_UDP_CKSUM (3ULL << 52) |
f67539c2 TL |
308 | |
309 | /** Mask for L4 cksum offload request. */ | |
11fdf7f2 | 310 | #define PKT_TX_L4_MASK (3ULL << 52) |
11fdf7f2 TL |
311 | |
312 | /** | |
313 | * Offload the IP checksum in the hardware. The flag PKT_TX_IPV4 should | |
314 | * also be set by the application, although a PMD will only check | |
315 | * PKT_TX_IP_CKSUM. | |
11fdf7f2 TL |
316 | * - fill the mbuf offload information: l2_len, l3_len |
317 | */ | |
318 | #define PKT_TX_IP_CKSUM (1ULL << 54) | |
319 | ||
320 | /** | |
321 | * Packet is IPv4. This flag must be set when using any offload feature | |
322 | * (TSO, L3 or L4 checksum) to tell the NIC that the packet is an IPv4 | |
323 | * packet. If the packet is a tunneled packet, this flag is related to | |
324 | * the inner headers. | |
325 | */ | |
326 | #define PKT_TX_IPV4 (1ULL << 55) | |
327 | ||
328 | /** | |
329 | * Packet is IPv6. This flag must be set when using an offload feature | |
330 | * (TSO or L4 checksum) to tell the NIC that the packet is an IPv6 | |
331 | * packet. If the packet is a tunneled packet, this flag is related to | |
332 | * the inner headers. | |
333 | */ | |
334 | #define PKT_TX_IPV6 (1ULL << 56) | |
335 | ||
f67539c2 TL |
336 | /** |
337 | * VLAN tag insertion request to driver, driver may offload the insertion | |
338 | * based on the device capability. | |
339 | * mbuf 'vlan_tci' field must be valid when this flag is set. | |
340 | */ | |
341 | #define PKT_TX_VLAN (1ULL << 57) | |
342 | /* this old name is deprecated */ | |
343 | #define PKT_TX_VLAN_PKT PKT_TX_VLAN | |
11fdf7f2 TL |
344 | |
345 | /** | |
346 | * Offload the IP checksum of an external header in the hardware. The | |
f67539c2 TL |
347 | * flag PKT_TX_OUTER_IPV4 should also be set by the application, although |
348 | * a PMD will only check PKT_TX_OUTER_IP_CKSUM. | |
11fdf7f2 TL |
349 | * - fill the mbuf offload information: outer_l2_len, outer_l3_len |
350 | */ | |
351 | #define PKT_TX_OUTER_IP_CKSUM (1ULL << 58) | |
352 | ||
353 | /** | |
354 | * Packet outer header is IPv4. This flag must be set when using any | |
355 | * outer offload feature (L3 or L4 checksum) to tell the NIC that the | |
356 | * outer header of the tunneled packet is an IPv4 packet. | |
357 | */ | |
358 | #define PKT_TX_OUTER_IPV4 (1ULL << 59) | |
359 | ||
360 | /** | |
361 | * Packet outer header is IPv6. This flag must be set when using any | |
362 | * outer offload feature (L4 checksum) to tell the NIC that the outer | |
363 | * header of the tunneled packet is an IPv6 packet. | |
364 | */ | |
365 | #define PKT_TX_OUTER_IPV6 (1ULL << 60) | |
366 | ||
367 | /** | |
368 | * Bitmask of all supported packet Tx offload features flags, | |
369 | * which can be set for packet. | |
370 | */ | |
371 | #define PKT_TX_OFFLOAD_MASK ( \ | |
f67539c2 TL |
372 | PKT_TX_OUTER_IPV6 | \ |
373 | PKT_TX_OUTER_IPV4 | \ | |
374 | PKT_TX_OUTER_IP_CKSUM | \ | |
375 | PKT_TX_VLAN_PKT | \ | |
376 | PKT_TX_IPV6 | \ | |
377 | PKT_TX_IPV4 | \ | |
11fdf7f2 TL |
378 | PKT_TX_IP_CKSUM | \ |
379 | PKT_TX_L4_MASK | \ | |
11fdf7f2 | 380 | PKT_TX_IEEE1588_TMST | \ |
f67539c2 | 381 | PKT_TX_TCP_SEG | \ |
11fdf7f2 | 382 | PKT_TX_QINQ_PKT | \ |
11fdf7f2 | 383 | PKT_TX_TUNNEL_MASK | \ |
f67539c2 TL |
384 | PKT_TX_MACSEC | \ |
385 | PKT_TX_SEC_OFFLOAD | \ | |
386 | PKT_TX_UDP_SEG | \ | |
387 | PKT_TX_OUTER_UDP_CKSUM) | |
11fdf7f2 | 388 | |
f67539c2 TL |
389 | /** |
390 | * Mbuf having an external buffer attached. shinfo in mbuf must be filled. | |
391 | */ | |
392 | #define EXT_ATTACHED_MBUF (1ULL << 61) | |
11fdf7f2 TL |
393 | |
394 | #define IND_ATTACHED_MBUF (1ULL << 62) /**< Indirect attached mbuf */ | |
395 | ||
11fdf7f2 TL |
396 | /** Alignment constraint of mbuf private area. */ |
397 | #define RTE_MBUF_PRIV_ALIGN 8 | |
398 | ||
11fdf7f2 TL |
399 | /** |
400 | * Some NICs need at least 2KB buffer to RX standard Ethernet frame without | |
401 | * splitting it into multiple segments. | |
402 | * So, for mbufs that planned to be involved into RX/TX, the recommended | |
403 | * minimal buffer length is 2KB + RTE_PKTMBUF_HEADROOM. | |
404 | */ | |
405 | #define RTE_MBUF_DEFAULT_DATAROOM 2048 | |
406 | #define RTE_MBUF_DEFAULT_BUF_SIZE \ | |
407 | (RTE_MBUF_DEFAULT_DATAROOM + RTE_PKTMBUF_HEADROOM) | |
408 | ||
f67539c2 TL |
409 | struct rte_mbuf_sched { |
410 | uint32_t queue_id; /**< Queue ID. */ | |
411 | uint8_t traffic_class; | |
412 | /**< Traffic class ID. Traffic class 0 | |
413 | * is the highest priority traffic class. | |
414 | */ | |
415 | uint8_t color; | |
416 | /**< Color. @see enum rte_color.*/ | |
417 | uint16_t reserved; /**< Reserved. */ | |
418 | }; /**< Hierarchical scheduler */ | |
419 | ||
420 | /** | |
421 | * enum for the tx_offload bit-fields lengths and offsets. | |
422 | * defines the layout of rte_mbuf tx_offload field. | |
423 | */ | |
424 | enum { | |
425 | RTE_MBUF_L2_LEN_BITS = 7, | |
426 | RTE_MBUF_L3_LEN_BITS = 9, | |
427 | RTE_MBUF_L4_LEN_BITS = 8, | |
428 | RTE_MBUF_TSO_SEGSZ_BITS = 16, | |
429 | RTE_MBUF_OUTL3_LEN_BITS = 9, | |
430 | RTE_MBUF_OUTL2_LEN_BITS = 7, | |
431 | RTE_MBUF_TXOFLD_UNUSED_BITS = sizeof(uint64_t) * CHAR_BIT - | |
432 | RTE_MBUF_L2_LEN_BITS - | |
433 | RTE_MBUF_L3_LEN_BITS - | |
434 | RTE_MBUF_L4_LEN_BITS - | |
435 | RTE_MBUF_TSO_SEGSZ_BITS - | |
436 | RTE_MBUF_OUTL3_LEN_BITS - | |
437 | RTE_MBUF_OUTL2_LEN_BITS, | |
438 | #if RTE_BYTE_ORDER == RTE_BIG_ENDIAN | |
439 | RTE_MBUF_L2_LEN_OFS = | |
440 | sizeof(uint64_t) * CHAR_BIT - RTE_MBUF_L2_LEN_BITS, | |
441 | RTE_MBUF_L3_LEN_OFS = RTE_MBUF_L2_LEN_OFS - RTE_MBUF_L3_LEN_BITS, | |
442 | RTE_MBUF_L4_LEN_OFS = RTE_MBUF_L3_LEN_OFS - RTE_MBUF_L4_LEN_BITS, | |
443 | RTE_MBUF_TSO_SEGSZ_OFS = RTE_MBUF_L4_LEN_OFS - RTE_MBUF_TSO_SEGSZ_BITS, | |
444 | RTE_MBUF_OUTL3_LEN_OFS = | |
445 | RTE_MBUF_TSO_SEGSZ_OFS - RTE_MBUF_OUTL3_LEN_BITS, | |
446 | RTE_MBUF_OUTL2_LEN_OFS = | |
447 | RTE_MBUF_OUTL3_LEN_OFS - RTE_MBUF_OUTL2_LEN_BITS, | |
448 | RTE_MBUF_TXOFLD_UNUSED_OFS = | |
449 | RTE_MBUF_OUTL2_LEN_OFS - RTE_MBUF_TXOFLD_UNUSED_BITS, | |
450 | #else | |
451 | RTE_MBUF_L2_LEN_OFS = 0, | |
452 | RTE_MBUF_L3_LEN_OFS = RTE_MBUF_L2_LEN_OFS + RTE_MBUF_L2_LEN_BITS, | |
453 | RTE_MBUF_L4_LEN_OFS = RTE_MBUF_L3_LEN_OFS + RTE_MBUF_L3_LEN_BITS, | |
454 | RTE_MBUF_TSO_SEGSZ_OFS = RTE_MBUF_L4_LEN_OFS + RTE_MBUF_L4_LEN_BITS, | |
455 | RTE_MBUF_OUTL3_LEN_OFS = | |
456 | RTE_MBUF_TSO_SEGSZ_OFS + RTE_MBUF_TSO_SEGSZ_BITS, | |
457 | RTE_MBUF_OUTL2_LEN_OFS = | |
458 | RTE_MBUF_OUTL3_LEN_OFS + RTE_MBUF_OUTL3_LEN_BITS, | |
459 | RTE_MBUF_TXOFLD_UNUSED_OFS = | |
460 | RTE_MBUF_OUTL2_LEN_OFS + RTE_MBUF_OUTL2_LEN_BITS, | |
461 | #endif | |
462 | }; | |
11fdf7f2 TL |
463 | |
464 | /** | |
465 | * The generic rte_mbuf, containing a packet mbuf. | |
466 | */ | |
467 | struct rte_mbuf { | |
f67539c2 | 468 | RTE_MARKER cacheline0; |
11fdf7f2 TL |
469 | |
470 | void *buf_addr; /**< Virtual address of segment buffer. */ | |
471 | /** | |
472 | * Physical address of segment buffer. | |
473 | * Force alignment to 8-bytes, so as to ensure we have the exact | |
474 | * same mbuf cacheline0 layout for 32-bit and 64-bit. This makes | |
475 | * working on vector drivers easier. | |
476 | */ | |
f67539c2 TL |
477 | RTE_STD_C11 |
478 | union { | |
479 | rte_iova_t buf_iova; | |
480 | rte_iova_t buf_physaddr; /**< deprecated */ | |
481 | } __rte_aligned(sizeof(rte_iova_t)); | |
11fdf7f2 TL |
482 | |
483 | /* next 8 bytes are initialised on RX descriptor rearm */ | |
f67539c2 | 484 | RTE_MARKER64 rearm_data; |
11fdf7f2 TL |
485 | uint16_t data_off; |
486 | ||
487 | /** | |
488 | * Reference counter. Its size should at least equal to the size | |
489 | * of port field (16 bits), to support zero-copy broadcast. | |
490 | * It should only be accessed using the following functions: | |
491 | * rte_mbuf_refcnt_update(), rte_mbuf_refcnt_read(), and | |
492 | * rte_mbuf_refcnt_set(). The functionality of these functions (atomic, | |
493 | * or non-atomic) is controlled by the CONFIG_RTE_MBUF_REFCNT_ATOMIC | |
494 | * config option. | |
495 | */ | |
496 | RTE_STD_C11 | |
497 | union { | |
498 | rte_atomic16_t refcnt_atomic; /**< Atomically accessed refcnt */ | |
f67539c2 | 499 | /** Non-atomically accessed refcnt */ |
11fdf7f2 | 500 | uint16_t refcnt; |
11fdf7f2 TL |
501 | }; |
502 | uint16_t nb_segs; /**< Number of segments. */ | |
503 | ||
f67539c2 TL |
504 | /** Input port (16 bits to support more than 256 virtual ports). |
505 | * The event eth Tx adapter uses this field to specify the output port. | |
506 | */ | |
11fdf7f2 TL |
507 | uint16_t port; |
508 | ||
509 | uint64_t ol_flags; /**< Offload features. */ | |
510 | ||
511 | /* remaining bytes are set on RX when pulling packet from descriptor */ | |
f67539c2 | 512 | RTE_MARKER rx_descriptor_fields1; |
11fdf7f2 TL |
513 | |
514 | /* | |
515 | * The packet type, which is the combination of outer/inner L2, L3, L4 | |
516 | * and tunnel types. The packet_type is about data really present in the | |
517 | * mbuf. Example: if vlan stripping is enabled, a received vlan packet | |
518 | * would have RTE_PTYPE_L2_ETHER and not RTE_PTYPE_L2_VLAN because the | |
519 | * vlan is stripped from the data. | |
520 | */ | |
521 | RTE_STD_C11 | |
522 | union { | |
523 | uint32_t packet_type; /**< L2/L3/L4 and tunnel information. */ | |
524 | struct { | |
525 | uint32_t l2_type:4; /**< (Outer) L2 type. */ | |
526 | uint32_t l3_type:4; /**< (Outer) L3 type. */ | |
527 | uint32_t l4_type:4; /**< (Outer) L4 type. */ | |
528 | uint32_t tun_type:4; /**< Tunnel type. */ | |
f67539c2 TL |
529 | RTE_STD_C11 |
530 | union { | |
531 | uint8_t inner_esp_next_proto; | |
532 | /**< ESP next protocol type, valid if | |
533 | * RTE_PTYPE_TUNNEL_ESP tunnel type is set | |
534 | * on both Tx and Rx. | |
535 | */ | |
536 | __extension__ | |
537 | struct { | |
538 | uint8_t inner_l2_type:4; | |
539 | /**< Inner L2 type. */ | |
540 | uint8_t inner_l3_type:4; | |
541 | /**< Inner L3 type. */ | |
542 | }; | |
543 | }; | |
11fdf7f2 TL |
544 | uint32_t inner_l4_type:4; /**< Inner L4 type. */ |
545 | }; | |
546 | }; | |
547 | ||
548 | uint32_t pkt_len; /**< Total pkt len: sum of all segments. */ | |
549 | uint16_t data_len; /**< Amount of data in segment buffer. */ | |
f67539c2 | 550 | /** VLAN TCI (CPU order), valid if PKT_RX_VLAN is set. */ |
11fdf7f2 TL |
551 | uint16_t vlan_tci; |
552 | ||
f67539c2 | 553 | RTE_STD_C11 |
11fdf7f2 | 554 | union { |
f67539c2 TL |
555 | union { |
556 | uint32_t rss; /**< RSS hash result if RSS enabled */ | |
557 | struct { | |
558 | union { | |
559 | struct { | |
560 | uint16_t hash; | |
561 | uint16_t id; | |
562 | }; | |
563 | uint32_t lo; | |
564 | /**< Second 4 flexible bytes */ | |
11fdf7f2 | 565 | }; |
f67539c2 TL |
566 | uint32_t hi; |
567 | /**< First 4 flexible bytes or FD ID, dependent | |
568 | * on PKT_RX_FDIR_* flag in ol_flags. | |
569 | */ | |
570 | } fdir; /**< Filter identifier if FDIR enabled */ | |
571 | struct rte_mbuf_sched sched; | |
572 | /**< Hierarchical scheduler : 8 bytes */ | |
573 | struct { | |
574 | uint32_t reserved1; | |
575 | uint16_t reserved2; | |
576 | uint16_t txq; | |
577 | /**< The event eth Tx adapter uses this field | |
578 | * to store Tx queue id. | |
579 | * @see rte_event_eth_tx_adapter_txq_set() | |
580 | */ | |
581 | } txadapter; /**< Eventdev ethdev Tx adapter */ | |
582 | /**< User defined tags. See rte_distributor_process() */ | |
583 | uint32_t usr; | |
584 | } hash; /**< hash information */ | |
585 | }; | |
586 | ||
587 | /** Outer VLAN TCI (CPU order), valid if PKT_RX_QINQ is set. */ | |
11fdf7f2 TL |
588 | uint16_t vlan_tci_outer; |
589 | ||
590 | uint16_t buf_len; /**< Length of segment buffer. */ | |
591 | ||
592 | /** Valid if PKT_RX_TIMESTAMP is set. The unit and time reference | |
593 | * are not normalized but are always the same for a given port. | |
f67539c2 TL |
594 | * Some devices allow to query rte_eth_read_clock that will return the |
595 | * current device timestamp. | |
11fdf7f2 TL |
596 | */ |
597 | uint64_t timestamp; | |
598 | ||
599 | /* second cache line - fields only used in slow path or on TX */ | |
f67539c2 | 600 | RTE_MARKER cacheline1 __rte_cache_min_aligned; |
11fdf7f2 TL |
601 | |
602 | RTE_STD_C11 | |
603 | union { | |
604 | void *userdata; /**< Can be used for external metadata */ | |
605 | uint64_t udata64; /**< Allow 8-byte userdata on 32-bit */ | |
606 | }; | |
607 | ||
608 | struct rte_mempool *pool; /**< Pool from which mbuf was allocated. */ | |
609 | struct rte_mbuf *next; /**< Next segment of scattered packet. */ | |
610 | ||
611 | /* fields to support TX offloads */ | |
612 | RTE_STD_C11 | |
613 | union { | |
614 | uint64_t tx_offload; /**< combined for easy fetch */ | |
615 | __extension__ | |
616 | struct { | |
f67539c2 | 617 | uint64_t l2_len:RTE_MBUF_L2_LEN_BITS; |
11fdf7f2 TL |
618 | /**< L2 (MAC) Header Length for non-tunneling pkt. |
619 | * Outer_L4_len + ... + Inner_L2_len for tunneling pkt. | |
620 | */ | |
f67539c2 TL |
621 | uint64_t l3_len:RTE_MBUF_L3_LEN_BITS; |
622 | /**< L3 (IP) Header Length. */ | |
623 | uint64_t l4_len:RTE_MBUF_L4_LEN_BITS; | |
624 | /**< L4 (TCP/UDP) Header Length. */ | |
625 | uint64_t tso_segsz:RTE_MBUF_TSO_SEGSZ_BITS; | |
626 | /**< TCP TSO segment size */ | |
627 | ||
628 | /* | |
629 | * Fields for Tx offloading of tunnels. | |
630 | * These are undefined for packets which don't request | |
631 | * any tunnel offloads (outer IP or UDP checksum, | |
632 | * tunnel TSO). | |
633 | * | |
634 | * PMDs should not use these fields unconditionally | |
635 | * when calculating offsets. | |
636 | * | |
637 | * Applications are expected to set appropriate tunnel | |
638 | * offload flags when they fill in these fields. | |
639 | */ | |
640 | uint64_t outer_l3_len:RTE_MBUF_OUTL3_LEN_BITS; | |
11fdf7f2 | 641 | /**< Outer L3 (IP) Hdr Length. */ |
f67539c2 | 642 | uint64_t outer_l2_len:RTE_MBUF_OUTL2_LEN_BITS; |
11fdf7f2 TL |
643 | /**< Outer L2 (MAC) Hdr Length. */ |
644 | ||
f67539c2 | 645 | /* uint64_t unused:RTE_MBUF_TXOFLD_UNUSED_BITS; */ |
11fdf7f2 TL |
646 | }; |
647 | }; | |
648 | ||
649 | /** Size of the application private data. In case of an indirect | |
650 | * mbuf, it stores the direct mbuf private data size. | |
651 | */ | |
652 | uint16_t priv_size; | |
653 | ||
654 | /** Timesync flags for use with IEEE1588. */ | |
655 | uint16_t timesync; | |
656 | ||
657 | /** Sequence number. See also rte_reorder_insert(). */ | |
658 | uint32_t seqn; | |
659 | ||
f67539c2 TL |
660 | /** Shared data for external buffer attached to mbuf. See |
661 | * rte_pktmbuf_attach_extbuf(). | |
662 | */ | |
663 | struct rte_mbuf_ext_shared_info *shinfo; | |
664 | ||
665 | uint64_t dynfield1[2]; /**< Reserved for dynamic fields. */ | |
11fdf7f2 TL |
666 | } __rte_cache_aligned; |
667 | ||
f67539c2 TL |
668 | /** |
669 | * Function typedef of callback to free externally attached buffer. | |
670 | */ | |
671 | typedef void (*rte_mbuf_extbuf_free_callback_t)(void *addr, void *opaque); | |
672 | ||
673 | /** | |
674 | * Shared data at the end of an external buffer. | |
675 | */ | |
676 | struct rte_mbuf_ext_shared_info { | |
677 | rte_mbuf_extbuf_free_callback_t free_cb; /**< Free callback function */ | |
678 | void *fcb_opaque; /**< Free callback argument */ | |
679 | rte_atomic16_t refcnt_atomic; /**< Atomically accessed refcnt */ | |
680 | }; | |
681 | ||
682 | /**< Maximum number of nb_segs allowed. */ | |
683 | #define RTE_MBUF_MAX_NB_SEGS UINT16_MAX | |
11fdf7f2 TL |
684 | |
685 | /** | |
9f95a23c TL |
686 | * Returns TRUE if given mbuf is cloned by mbuf indirection, or FALSE |
687 | * otherwise. | |
688 | * | |
689 | * If a mbuf has its data in another mbuf and references it by mbuf | |
690 | * indirection, this mbuf can be defined as a cloned mbuf. | |
11fdf7f2 | 691 | */ |
9f95a23c | 692 | #define RTE_MBUF_CLONED(mb) ((mb)->ol_flags & IND_ATTACHED_MBUF) |
11fdf7f2 TL |
693 | |
694 | /** | |
f67539c2 | 695 | * Returns TRUE if given mbuf has an external buffer, or FALSE otherwise. |
9f95a23c | 696 | * |
f67539c2 | 697 | * External buffer is a user-provided anonymous buffer. |
11fdf7f2 | 698 | */ |
f67539c2 | 699 | #define RTE_MBUF_HAS_EXTBUF(mb) ((mb)->ol_flags & EXT_ATTACHED_MBUF) |
11fdf7f2 TL |
700 | |
701 | /** | |
f67539c2 | 702 | * Returns TRUE if given mbuf is direct, or FALSE otherwise. |
11fdf7f2 | 703 | * |
f67539c2 TL |
704 | * If a mbuf embeds its own data after the rte_mbuf structure, this mbuf |
705 | * can be defined as a direct mbuf. | |
11fdf7f2 | 706 | */ |
f67539c2 TL |
707 | #define RTE_MBUF_DIRECT(mb) \ |
708 | (!((mb)->ol_flags & (IND_ATTACHED_MBUF | EXT_ATTACHED_MBUF))) | |
709 | ||
710 | #define MBUF_INVALID_PORT UINT16_MAX | |
11fdf7f2 TL |
711 | |
712 | /** | |
713 | * A macro that points to an offset into the data in the mbuf. | |
714 | * | |
715 | * The returned pointer is cast to type t. Before using this | |
716 | * function, the user must ensure that the first segment is large | |
717 | * enough to accommodate its data. | |
718 | * | |
719 | * @param m | |
720 | * The packet mbuf. | |
721 | * @param o | |
722 | * The offset into the mbuf data. | |
723 | * @param t | |
724 | * The type to cast the result into. | |
725 | */ | |
726 | #define rte_pktmbuf_mtod_offset(m, t, o) \ | |
727 | ((t)((char *)(m)->buf_addr + (m)->data_off + (o))) | |
728 | ||
729 | /** | |
730 | * A macro that points to the start of the data in the mbuf. | |
731 | * | |
732 | * The returned pointer is cast to type t. Before using this | |
733 | * function, the user must ensure that the first segment is large | |
734 | * enough to accommodate its data. | |
735 | * | |
736 | * @param m | |
737 | * The packet mbuf. | |
738 | * @param t | |
739 | * The type to cast the result into. | |
740 | */ | |
741 | #define rte_pktmbuf_mtod(m, t) rte_pktmbuf_mtod_offset(m, t, 0) | |
742 | ||
f67539c2 TL |
743 | /** |
744 | * A macro that returns the IO address that points to an offset of the | |
745 | * start of the data in the mbuf | |
746 | * | |
747 | * @param m | |
748 | * The packet mbuf. | |
749 | * @param o | |
750 | * The offset into the data to calculate address from. | |
751 | */ | |
752 | #define rte_pktmbuf_iova_offset(m, o) \ | |
753 | (rte_iova_t)((m)->buf_iova + (m)->data_off + (o)) | |
754 | ||
755 | /** | |
756 | * A macro that returns the IO address that points to the start of the | |
757 | * data in the mbuf | |
758 | * | |
759 | * @param m | |
760 | * The packet mbuf. | |
761 | */ | |
762 | #define rte_pktmbuf_iova(m) rte_pktmbuf_iova_offset(m, 0) | |
763 | ||
11fdf7f2 TL |
764 | #ifdef __cplusplus |
765 | } | |
766 | #endif | |
767 | ||
f67539c2 | 768 | #endif /* _RTE_MBUF_CORE_H_ */ |