mbuf: promote check helper to stable
[dpdk.git] / lib / mbuf / rte_mbuf.h
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(c) 2010-2014 Intel Corporation.
3  * Copyright 2014 6WIND S.A.
4  */
5
6 #ifndef _RTE_MBUF_H_
7 #define _RTE_MBUF_H_
8
9 /**
10  * @file
11  * RTE Mbuf
12  *
13  * The mbuf library provides the ability to create and destroy buffers
14  * that may be used by the RTE application to store message
15  * buffers. The message buffers are stored in a mempool, using the
16  * RTE mempool library.
17  *
18  * The preferred way to create a mbuf pool is to use
19  * rte_pktmbuf_pool_create(). However, in some situations, an
20  * application may want to have more control (ex: populate the pool with
21  * specific memory), in this case it is possible to use functions from
22  * rte_mempool. See how rte_pktmbuf_pool_create() is implemented for
23  * details.
24  *
25  * This library provides an API to allocate/free packet mbufs, which are
26  * used to carry network packets.
27  *
28  * To understand the concepts of packet buffers or mbufs, you
29  * should read "TCP/IP Illustrated, Volume 2: The Implementation,
30  * Addison-Wesley, 1995, ISBN 0-201-63354-X from Richard Stevens"
31  * http://www.kohala.com/start/tcpipiv2.html
32  */
33
34 #include <stdint.h>
35 #include <rte_compat.h>
36 #include <rte_common.h>
37 #include <rte_config.h>
38 #include <rte_mempool.h>
39 #include <rte_memory.h>
40 #include <rte_prefetch.h>
41 #include <rte_branch_prediction.h>
42 #include <rte_byteorder.h>
43 #include <rte_mbuf_ptype.h>
44 #include <rte_mbuf_core.h>
45
46 #ifdef __cplusplus
47 extern "C" {
48 #endif
49
50 /**
51  * Get the name of a RX offload flag
52  *
53  * @param mask
54  *   The mask describing the flag.
55  * @return
56  *   The name of this flag, or NULL if it's not a valid RX flag.
57  */
58 const char *rte_get_rx_ol_flag_name(uint64_t mask);
59
60 /**
61  * Dump the list of RX offload flags in a buffer
62  *
63  * @param mask
64  *   The mask describing the RX flags.
65  * @param buf
66  *   The output buffer.
67  * @param buflen
68  *   The length of the buffer.
69  * @return
70  *   0 on success, (-1) on error.
71  */
72 int rte_get_rx_ol_flag_list(uint64_t mask, char *buf, size_t buflen);
73
74 /**
75  * Get the name of a TX offload flag
76  *
77  * @param mask
78  *   The mask describing the flag. Usually only one bit must be set.
79  *   Several bits can be given if they belong to the same mask.
80  *   Ex: PKT_TX_L4_MASK.
81  * @return
82  *   The name of this flag, or NULL if it's not a valid TX flag.
83  */
84 const char *rte_get_tx_ol_flag_name(uint64_t mask);
85
86 /**
87  * Dump the list of TX offload flags in a buffer
88  *
89  * @param mask
90  *   The mask describing the TX flags.
91  * @param buf
92  *   The output buffer.
93  * @param buflen
94  *   The length of the buffer.
95  * @return
96  *   0 on success, (-1) on error.
97  */
98 int rte_get_tx_ol_flag_list(uint64_t mask, char *buf, size_t buflen);
99
100 /**
101  * Prefetch the first part of the mbuf
102  *
103  * The first 64 bytes of the mbuf corresponds to fields that are used early
104  * in the receive path. If the cache line of the architecture is higher than
105  * 64B, the second part will also be prefetched.
106  *
107  * @param m
108  *   The pointer to the mbuf.
109  */
110 static inline void
111 rte_mbuf_prefetch_part1(struct rte_mbuf *m)
112 {
113         rte_prefetch0(&m->cacheline0);
114 }
115
116 /**
117  * Prefetch the second part of the mbuf
118  *
119  * The next 64 bytes of the mbuf corresponds to fields that are used in the
120  * transmit path. If the cache line of the architecture is higher than 64B,
121  * this function does nothing as it is expected that the full mbuf is
122  * already in cache.
123  *
124  * @param m
125  *   The pointer to the mbuf.
126  */
127 static inline void
128 rte_mbuf_prefetch_part2(struct rte_mbuf *m)
129 {
130 #if RTE_CACHE_LINE_SIZE == 64
131         rte_prefetch0(&m->cacheline1);
132 #else
133         RTE_SET_USED(m);
134 #endif
135 }
136
137
138 static inline uint16_t rte_pktmbuf_priv_size(struct rte_mempool *mp);
139
140 /**
141  * Return the IO address of the beginning of the mbuf data
142  *
143  * @param mb
144  *   The pointer to the mbuf.
145  * @return
146  *   The IO address of the beginning of the mbuf data
147  */
148 static inline rte_iova_t
149 rte_mbuf_data_iova(const struct rte_mbuf *mb)
150 {
151         return mb->buf_iova + mb->data_off;
152 }
153
154 /**
155  * Return the default IO address of the beginning of the mbuf data
156  *
157  * This function is used by drivers in their receive function, as it
158  * returns the location where data should be written by the NIC, taking
159  * the default headroom in account.
160  *
161  * @param mb
162  *   The pointer to the mbuf.
163  * @return
164  *   The IO address of the beginning of the mbuf data
165  */
166 static inline rte_iova_t
167 rte_mbuf_data_iova_default(const struct rte_mbuf *mb)
168 {
169         return mb->buf_iova + RTE_PKTMBUF_HEADROOM;
170 }
171
172 /**
173  * Return the mbuf owning the data buffer address of an indirect mbuf.
174  *
175  * @param mi
176  *   The pointer to the indirect mbuf.
177  * @return
178  *   The address of the direct mbuf corresponding to buffer_addr.
179  */
180 static inline struct rte_mbuf *
181 rte_mbuf_from_indirect(struct rte_mbuf *mi)
182 {
183         return (struct rte_mbuf *)RTE_PTR_SUB(mi->buf_addr, sizeof(*mi) + mi->priv_size);
184 }
185
186 /**
187  * Return address of buffer embedded in the given mbuf.
188  *
189  * The return value shall be same as mb->buf_addr if the mbuf is already
190  * initialized and direct. However, this API is useful if mempool of the
191  * mbuf is already known because it doesn't need to access mbuf contents in
192  * order to get the mempool pointer.
193  *
194  * @param mb
195  *   The pointer to the mbuf.
196  * @param mp
197  *   The pointer to the mempool of the mbuf.
198  * @return
199  *   The pointer of the mbuf buffer.
200  */
201 static inline char *
202 rte_mbuf_buf_addr(struct rte_mbuf *mb, struct rte_mempool *mp)
203 {
204         return (char *)mb + sizeof(*mb) + rte_pktmbuf_priv_size(mp);
205 }
206
207 /**
208  * Return the default address of the beginning of the mbuf data.
209  *
210  * @param mb
211  *   The pointer to the mbuf.
212  * @return
213  *   The pointer of the beginning of the mbuf data.
214  */
215 static inline char *
216 rte_mbuf_data_addr_default(struct rte_mbuf *mb)
217 {
218         return rte_mbuf_buf_addr(mb, mb->pool) + RTE_PKTMBUF_HEADROOM;
219 }
220
221 /**
222  * Return address of buffer embedded in the given mbuf.
223  *
224  * @note: Accessing mempool pointer of a mbuf is expensive because the
225  * pointer is stored in the 2nd cache line of mbuf. If mempool is known, it
226  * is better not to reference the mempool pointer in mbuf but calling
227  * rte_mbuf_buf_addr() would be more efficient.
228  *
229  * @param md
230  *   The pointer to the mbuf.
231  * @return
232  *   The address of the data buffer owned by the mbuf.
233  */
234 static inline char *
235 rte_mbuf_to_baddr(struct rte_mbuf *md)
236 {
237         return rte_mbuf_buf_addr(md, md->pool);
238 }
239
240 /**
241  * Return the starting address of the private data area embedded in
242  * the given mbuf.
243  *
244  * Note that no check is made to ensure that a private data area
245  * actually exists in the supplied mbuf.
246  *
247  * @param m
248  *   The pointer to the mbuf.
249  * @return
250  *   The starting address of the private data area of the given mbuf.
251  */
252 static inline void *
253 rte_mbuf_to_priv(struct rte_mbuf *m)
254 {
255         return RTE_PTR_ADD(m, sizeof(struct rte_mbuf));
256 }
257
258 /**
259  * Private data in case of pktmbuf pool.
260  *
261  * A structure that contains some pktmbuf_pool-specific data that are
262  * appended after the mempool structure (in private data).
263  */
264 struct rte_pktmbuf_pool_private {
265         uint16_t mbuf_data_room_size; /**< Size of data space in each mbuf. */
266         uint16_t mbuf_priv_size;      /**< Size of private area in each mbuf. */
267         uint32_t flags; /**< reserved for future use. */
268 };
269
270 /**
271  * Return the flags from private data in an mempool structure.
272  *
273  * @param mp
274  *   A pointer to the mempool structure.
275  * @return
276  *   The flags from the private data structure.
277  */
278 static inline uint32_t
279 rte_pktmbuf_priv_flags(struct rte_mempool *mp)
280 {
281         struct rte_pktmbuf_pool_private *mbp_priv;
282
283         mbp_priv = (struct rte_pktmbuf_pool_private *)rte_mempool_get_priv(mp);
284         return mbp_priv->flags;
285 }
286
287 /**
288  * When set, pktmbuf mempool will hold only mbufs with pinned external
289  * buffer. The external buffer will be attached to the mbuf at the
290  * memory pool creation and will never be detached by the mbuf free calls.
291  * mbuf should not contain any room for data after the mbuf structure.
292  */
293 #define RTE_PKTMBUF_POOL_F_PINNED_EXT_BUF (1 << 0)
294
295 /**
296  * Returns non zero if given mbuf has a pinned external buffer, or zero
297  * otherwise. The pinned external buffer is allocated at pool creation
298  * time and should not be freed on mbuf freeing.
299  *
300  * External buffer is a user-provided anonymous buffer.
301  */
302 #define RTE_MBUF_HAS_PINNED_EXTBUF(mb) \
303         (rte_pktmbuf_priv_flags(mb->pool) & RTE_PKTMBUF_POOL_F_PINNED_EXT_BUF)
304
305 #ifdef RTE_LIBRTE_MBUF_DEBUG
306
307 /**  check mbuf type in debug mode */
308 #define __rte_mbuf_sanity_check(m, is_h) rte_mbuf_sanity_check(m, is_h)
309
310 #else /*  RTE_LIBRTE_MBUF_DEBUG */
311
312 /**  check mbuf type in debug mode */
313 #define __rte_mbuf_sanity_check(m, is_h) do { } while (0)
314
315 #endif /*  RTE_LIBRTE_MBUF_DEBUG */
316
317 #ifdef RTE_MBUF_REFCNT_ATOMIC
318
319 /**
320  * Reads the value of an mbuf's refcnt.
321  * @param m
322  *   Mbuf to read
323  * @return
324  *   Reference count number.
325  */
326 static inline uint16_t
327 rte_mbuf_refcnt_read(const struct rte_mbuf *m)
328 {
329         return __atomic_load_n(&m->refcnt, __ATOMIC_RELAXED);
330 }
331
332 /**
333  * Sets an mbuf's refcnt to a defined value.
334  * @param m
335  *   Mbuf to update
336  * @param new_value
337  *   Value set
338  */
339 static inline void
340 rte_mbuf_refcnt_set(struct rte_mbuf *m, uint16_t new_value)
341 {
342         __atomic_store_n(&m->refcnt, new_value, __ATOMIC_RELAXED);
343 }
344
345 /* internal */
346 static inline uint16_t
347 __rte_mbuf_refcnt_update(struct rte_mbuf *m, int16_t value)
348 {
349         return __atomic_add_fetch(&m->refcnt, (uint16_t)value,
350                                  __ATOMIC_ACQ_REL);
351 }
352
353 /**
354  * Adds given value to an mbuf's refcnt and returns its new value.
355  * @param m
356  *   Mbuf to update
357  * @param value
358  *   Value to add/subtract
359  * @return
360  *   Updated value
361  */
362 static inline uint16_t
363 rte_mbuf_refcnt_update(struct rte_mbuf *m, int16_t value)
364 {
365         /*
366          * The atomic_add is an expensive operation, so we don't want to
367          * call it in the case where we know we are the unique holder of
368          * this mbuf (i.e. ref_cnt == 1). Otherwise, an atomic
369          * operation has to be used because concurrent accesses on the
370          * reference counter can occur.
371          */
372         if (likely(rte_mbuf_refcnt_read(m) == 1)) {
373                 ++value;
374                 rte_mbuf_refcnt_set(m, (uint16_t)value);
375                 return (uint16_t)value;
376         }
377
378         return __rte_mbuf_refcnt_update(m, value);
379 }
380
381 #else /* ! RTE_MBUF_REFCNT_ATOMIC */
382
383 /* internal */
384 static inline uint16_t
385 __rte_mbuf_refcnt_update(struct rte_mbuf *m, int16_t value)
386 {
387         m->refcnt = (uint16_t)(m->refcnt + value);
388         return m->refcnt;
389 }
390
391 /**
392  * Adds given value to an mbuf's refcnt and returns its new value.
393  */
394 static inline uint16_t
395 rte_mbuf_refcnt_update(struct rte_mbuf *m, int16_t value)
396 {
397         return __rte_mbuf_refcnt_update(m, value);
398 }
399
400 /**
401  * Reads the value of an mbuf's refcnt.
402  */
403 static inline uint16_t
404 rte_mbuf_refcnt_read(const struct rte_mbuf *m)
405 {
406         return m->refcnt;
407 }
408
409 /**
410  * Sets an mbuf's refcnt to the defined value.
411  */
412 static inline void
413 rte_mbuf_refcnt_set(struct rte_mbuf *m, uint16_t new_value)
414 {
415         m->refcnt = new_value;
416 }
417
418 #endif /* RTE_MBUF_REFCNT_ATOMIC */
419
420 /**
421  * Reads the refcnt of an external buffer.
422  *
423  * @param shinfo
424  *   Shared data of the external buffer.
425  * @return
426  *   Reference count number.
427  */
428 static inline uint16_t
429 rte_mbuf_ext_refcnt_read(const struct rte_mbuf_ext_shared_info *shinfo)
430 {
431         return __atomic_load_n(&shinfo->refcnt, __ATOMIC_RELAXED);
432 }
433
434 /**
435  * Set refcnt of an external buffer.
436  *
437  * @param shinfo
438  *   Shared data of the external buffer.
439  * @param new_value
440  *   Value set
441  */
442 static inline void
443 rte_mbuf_ext_refcnt_set(struct rte_mbuf_ext_shared_info *shinfo,
444         uint16_t new_value)
445 {
446         __atomic_store_n(&shinfo->refcnt, new_value, __ATOMIC_RELAXED);
447 }
448
449 /**
450  * Add given value to refcnt of an external buffer and return its new
451  * value.
452  *
453  * @param shinfo
454  *   Shared data of the external buffer.
455  * @param value
456  *   Value to add/subtract
457  * @return
458  *   Updated value
459  */
460 static inline uint16_t
461 rte_mbuf_ext_refcnt_update(struct rte_mbuf_ext_shared_info *shinfo,
462         int16_t value)
463 {
464         if (likely(rte_mbuf_ext_refcnt_read(shinfo) == 1)) {
465                 ++value;
466                 rte_mbuf_ext_refcnt_set(shinfo, (uint16_t)value);
467                 return (uint16_t)value;
468         }
469
470         return __atomic_add_fetch(&shinfo->refcnt, (uint16_t)value,
471                                  __ATOMIC_ACQ_REL);
472 }
473
474 /** Mbuf prefetch */
475 #define RTE_MBUF_PREFETCH_TO_FREE(m) do {       \
476         if ((m) != NULL)                        \
477                 rte_prefetch0(m);               \
478 } while (0)
479
480
481 /**
482  * Sanity checks on an mbuf.
483  *
484  * Check the consistency of the given mbuf. The function will cause a
485  * panic if corruption is detected.
486  *
487  * @param m
488  *   The mbuf to be checked.
489  * @param is_header
490  *   True if the mbuf is a packet header, false if it is a sub-segment
491  *   of a packet (in this case, some fields like nb_segs are not checked)
492  */
493 void
494 rte_mbuf_sanity_check(const struct rte_mbuf *m, int is_header);
495
496 /**
497  * Sanity checks on a mbuf.
498  *
499  * Almost like rte_mbuf_sanity_check(), but this function gives the reason
500  * if corruption is detected rather than panic.
501  *
502  * @param m
503  *   The mbuf to be checked.
504  * @param is_header
505  *   True if the mbuf is a packet header, false if it is a sub-segment
506  *   of a packet (in this case, some fields like nb_segs are not checked)
507  * @param reason
508  *   A reference to a string pointer where to store the reason why a mbuf is
509  *   considered invalid.
510  * @return
511  *   - 0 if no issue has been found, reason is left untouched.
512  *   - -1 if a problem is detected, reason then points to a string describing
513  *     the reason why the mbuf is deemed invalid.
514  */
515 int rte_mbuf_check(const struct rte_mbuf *m, int is_header,
516                    const char **reason);
517
518 /**
519  * Sanity checks on a reinitialized mbuf in debug mode.
520  *
521  * Check the consistency of the given reinitialized mbuf.
522  * The function will cause a panic if corruption is detected.
523  *
524  * Check that the mbuf is properly reinitialized (refcnt=1, next=NULL,
525  * nb_segs=1), as done by rte_pktmbuf_prefree_seg().
526  *
527  * @param m
528  *   The mbuf to be checked.
529  */
530 static __rte_always_inline void
531 __rte_mbuf_raw_sanity_check(__rte_unused const struct rte_mbuf *m)
532 {
533         RTE_ASSERT(rte_mbuf_refcnt_read(m) == 1);
534         RTE_ASSERT(m->next == NULL);
535         RTE_ASSERT(m->nb_segs == 1);
536         __rte_mbuf_sanity_check(m, 0);
537 }
538
539 /** For backwards compatibility. */
540 #define MBUF_RAW_ALLOC_CHECK(m) __rte_mbuf_raw_sanity_check(m)
541
542 /**
543  * Allocate an uninitialized mbuf from mempool *mp*.
544  *
545  * This function can be used by PMDs (especially in RX functions) to
546  * allocate an uninitialized mbuf. The driver is responsible of
547  * initializing all the required fields. See rte_pktmbuf_reset().
548  * For standard needs, prefer rte_pktmbuf_alloc().
549  *
550  * The caller can expect that the following fields of the mbuf structure
551  * are initialized: buf_addr, buf_iova, buf_len, refcnt=1, nb_segs=1,
552  * next=NULL, pool, priv_size. The other fields must be initialized
553  * by the caller.
554  *
555  * @param mp
556  *   The mempool from which mbuf is allocated.
557  * @return
558  *   - The pointer to the new mbuf on success.
559  *   - NULL if allocation failed.
560  */
561 static inline struct rte_mbuf *rte_mbuf_raw_alloc(struct rte_mempool *mp)
562 {
563         struct rte_mbuf *m;
564
565         if (rte_mempool_get(mp, (void **)&m) < 0)
566                 return NULL;
567         __rte_mbuf_raw_sanity_check(m);
568         return m;
569 }
570
571 /**
572  * Put mbuf back into its original mempool.
573  *
574  * The caller must ensure that the mbuf is direct and properly
575  * reinitialized (refcnt=1, next=NULL, nb_segs=1), as done by
576  * rte_pktmbuf_prefree_seg().
577  *
578  * This function should be used with care, when optimization is
579  * required. For standard needs, prefer rte_pktmbuf_free() or
580  * rte_pktmbuf_free_seg().
581  *
582  * @param m
583  *   The mbuf to be freed.
584  */
585 static __rte_always_inline void
586 rte_mbuf_raw_free(struct rte_mbuf *m)
587 {
588         RTE_ASSERT(!RTE_MBUF_CLONED(m) &&
589                   (!RTE_MBUF_HAS_EXTBUF(m) || RTE_MBUF_HAS_PINNED_EXTBUF(m)));
590         __rte_mbuf_raw_sanity_check(m);
591         rte_mempool_put(m->pool, m);
592 }
593
594 /**
595  * The packet mbuf constructor.
596  *
597  * This function initializes some fields in the mbuf structure that are
598  * not modified by the user once created (origin pool, buffer start
599  * address, and so on). This function is given as a callback function to
600  * rte_mempool_obj_iter() or rte_mempool_create() at pool creation time.
601  *
602  * This function expects that the mempool private area was previously
603  * initialized with rte_pktmbuf_pool_init().
604  *
605  * @param mp
606  *   The mempool from which mbufs originate.
607  * @param opaque_arg
608  *   A pointer that can be used by the user to retrieve useful information
609  *   for mbuf initialization. This pointer is the opaque argument passed to
610  *   rte_mempool_obj_iter() or rte_mempool_create().
611  * @param m
612  *   The mbuf to initialize.
613  * @param i
614  *   The index of the mbuf in the pool table.
615  */
616 void rte_pktmbuf_init(struct rte_mempool *mp, void *opaque_arg,
617                       void *m, unsigned i);
618
619 /**
620  * A packet mbuf pool constructor.
621  *
622  * This function initializes the mempool private data in the case of a
623  * pktmbuf pool. This private data is needed by the driver. The
624  * function must be called on the mempool before it is used, or it
625  * can be given as a callback function to rte_mempool_create() at
626  * pool creation. It can be extended by the user, for example, to
627  * provide another packet size.
628  *
629  * The mempool private area size must be at least equal to
630  * sizeof(struct rte_pktmbuf_pool_private).
631  *
632  * @param mp
633  *   The mempool from which mbufs originate.
634  * @param opaque_arg
635  *   A pointer that can be used by the user to retrieve useful information
636  *   for mbuf initialization. This pointer is the opaque argument passed to
637  *   rte_mempool_create().
638  */
639 void rte_pktmbuf_pool_init(struct rte_mempool *mp, void *opaque_arg);
640
641 /**
642  * Create a mbuf pool.
643  *
644  * This function creates and initializes a packet mbuf pool. It is
645  * a wrapper to rte_mempool functions.
646  *
647  * @param name
648  *   The name of the mbuf pool.
649  * @param n
650  *   The number of elements in the mbuf pool. The optimum size (in terms
651  *   of memory usage) for a mempool is when n is a power of two minus one:
652  *   n = (2^q - 1).
653  * @param cache_size
654  *   Size of the per-core object cache. See rte_mempool_create() for
655  *   details.
656  * @param priv_size
657  *   Size of application private are between the rte_mbuf structure
658  *   and the data buffer. This value must be aligned to RTE_MBUF_PRIV_ALIGN.
659  * @param data_room_size
660  *   Size of data buffer in each mbuf, including RTE_PKTMBUF_HEADROOM.
661  * @param socket_id
662  *   The socket identifier where the memory should be allocated. The
663  *   value can be *SOCKET_ID_ANY* if there is no NUMA constraint for the
664  *   reserved zone.
665  * @return
666  *   The pointer to the new allocated mempool, on success. NULL on error
667  *   with rte_errno set appropriately. Possible rte_errno values include:
668  *    - E_RTE_NO_CONFIG - function could not get pointer to rte_config structure
669  *    - E_RTE_SECONDARY - function was called from a secondary process instance
670  *    - EINVAL - cache size provided is too large, or priv_size is not aligned.
671  *    - ENOSPC - the maximum number of memzones has already been allocated
672  *    - EEXIST - a memzone with the same name already exists
673  *    - ENOMEM - no appropriate memory area found in which to create memzone
674  */
675 struct rte_mempool *
676 rte_pktmbuf_pool_create(const char *name, unsigned n,
677         unsigned cache_size, uint16_t priv_size, uint16_t data_room_size,
678         int socket_id);
679
680 /**
681  * Create a mbuf pool with a given mempool ops name
682  *
683  * This function creates and initializes a packet mbuf pool. It is
684  * a wrapper to rte_mempool functions.
685  *
686  * @param name
687  *   The name of the mbuf pool.
688  * @param n
689  *   The number of elements in the mbuf pool. The optimum size (in terms
690  *   of memory usage) for a mempool is when n is a power of two minus one:
691  *   n = (2^q - 1).
692  * @param cache_size
693  *   Size of the per-core object cache. See rte_mempool_create() for
694  *   details.
695  * @param priv_size
696  *   Size of application private are between the rte_mbuf structure
697  *   and the data buffer. This value must be aligned to RTE_MBUF_PRIV_ALIGN.
698  * @param data_room_size
699  *   Size of data buffer in each mbuf, including RTE_PKTMBUF_HEADROOM.
700  * @param socket_id
701  *   The socket identifier where the memory should be allocated. The
702  *   value can be *SOCKET_ID_ANY* if there is no NUMA constraint for the
703  *   reserved zone.
704  * @param ops_name
705  *   The mempool ops name to be used for this mempool instead of
706  *   default mempool. The value can be *NULL* to use default mempool.
707  * @return
708  *   The pointer to the new allocated mempool, on success. NULL on error
709  *   with rte_errno set appropriately. Possible rte_errno values include:
710  *    - E_RTE_NO_CONFIG - function could not get pointer to rte_config structure
711  *    - E_RTE_SECONDARY - function was called from a secondary process instance
712  *    - EINVAL - cache size provided is too large, or priv_size is not aligned.
713  *    - ENOSPC - the maximum number of memzones has already been allocated
714  *    - EEXIST - a memzone with the same name already exists
715  *    - ENOMEM - no appropriate memory area found in which to create memzone
716  */
717 struct rte_mempool *
718 rte_pktmbuf_pool_create_by_ops(const char *name, unsigned int n,
719         unsigned int cache_size, uint16_t priv_size, uint16_t data_room_size,
720         int socket_id, const char *ops_name);
721
722 /** A structure that describes the pinned external buffer segment. */
723 struct rte_pktmbuf_extmem {
724         void *buf_ptr;          /**< The virtual address of data buffer. */
725         rte_iova_t buf_iova;    /**< The IO address of the data buffer. */
726         size_t buf_len;         /**< External buffer length in bytes. */
727         uint16_t elt_size;      /**< mbuf element size in bytes. */
728 };
729
730 /**
731  * Create a mbuf pool with external pinned data buffers.
732  *
733  * This function creates and initializes a packet mbuf pool that contains
734  * only mbufs with external buffer. It is a wrapper to rte_mempool functions.
735  *
736  * @param name
737  *   The name of the mbuf pool.
738  * @param n
739  *   The number of elements in the mbuf pool. The optimum size (in terms
740  *   of memory usage) for a mempool is when n is a power of two minus one:
741  *   n = (2^q - 1).
742  * @param cache_size
743  *   Size of the per-core object cache. See rte_mempool_create() for
744  *   details.
745  * @param priv_size
746  *   Size of application private are between the rte_mbuf structure
747  *   and the data buffer. This value must be aligned to RTE_MBUF_PRIV_ALIGN.
748  * @param data_room_size
749  *   Size of data buffer in each mbuf, including RTE_PKTMBUF_HEADROOM.
750  * @param socket_id
751  *   The socket identifier where the memory should be allocated. The
752  *   value can be *SOCKET_ID_ANY* if there is no NUMA constraint for the
753  *   reserved zone.
754  * @param ext_mem
755  *   Pointer to the array of structures describing the external memory
756  *   for data buffers. It is caller responsibility to register this memory
757  *   with rte_extmem_register() (if needed), map this memory to appropriate
758  *   physical device, etc.
759  * @param ext_num
760  *   Number of elements in the ext_mem array.
761  * @return
762  *   The pointer to the new allocated mempool, on success. NULL on error
763  *   with rte_errno set appropriately. Possible rte_errno values include:
764  *    - E_RTE_NO_CONFIG - function could not get pointer to rte_config structure
765  *    - E_RTE_SECONDARY - function was called from a secondary process instance
766  *    - EINVAL - cache size provided is too large, or priv_size is not aligned.
767  *    - ENOSPC - the maximum number of memzones has already been allocated
768  *    - EEXIST - a memzone with the same name already exists
769  *    - ENOMEM - no appropriate memory area found in which to create memzone
770  */
771 __rte_experimental
772 struct rte_mempool *
773 rte_pktmbuf_pool_create_extbuf(const char *name, unsigned int n,
774         unsigned int cache_size, uint16_t priv_size,
775         uint16_t data_room_size, int socket_id,
776         const struct rte_pktmbuf_extmem *ext_mem,
777         unsigned int ext_num);
778
779 /**
780  * Get the data room size of mbufs stored in a pktmbuf_pool
781  *
782  * The data room size is the amount of data that can be stored in a
783  * mbuf including the headroom (RTE_PKTMBUF_HEADROOM).
784  *
785  * @param mp
786  *   The packet mbuf pool.
787  * @return
788  *   The data room size of mbufs stored in this mempool.
789  */
790 static inline uint16_t
791 rte_pktmbuf_data_room_size(struct rte_mempool *mp)
792 {
793         struct rte_pktmbuf_pool_private *mbp_priv;
794
795         mbp_priv = (struct rte_pktmbuf_pool_private *)rte_mempool_get_priv(mp);
796         return mbp_priv->mbuf_data_room_size;
797 }
798
799 /**
800  * Get the application private size of mbufs stored in a pktmbuf_pool
801  *
802  * The private size of mbuf is a zone located between the rte_mbuf
803  * structure and the data buffer where an application can store data
804  * associated to a packet.
805  *
806  * @param mp
807  *   The packet mbuf pool.
808  * @return
809  *   The private size of mbufs stored in this mempool.
810  */
811 static inline uint16_t
812 rte_pktmbuf_priv_size(struct rte_mempool *mp)
813 {
814         struct rte_pktmbuf_pool_private *mbp_priv;
815
816         mbp_priv = (struct rte_pktmbuf_pool_private *)rte_mempool_get_priv(mp);
817         return mbp_priv->mbuf_priv_size;
818 }
819
820 /**
821  * Reset the data_off field of a packet mbuf to its default value.
822  *
823  * The given mbuf must have only one segment, which should be empty.
824  *
825  * @param m
826  *   The packet mbuf's data_off field has to be reset.
827  */
828 static inline void rte_pktmbuf_reset_headroom(struct rte_mbuf *m)
829 {
830         m->data_off = (uint16_t)RTE_MIN((uint16_t)RTE_PKTMBUF_HEADROOM,
831                                         (uint16_t)m->buf_len);
832 }
833
834 /**
835  * Reset the fields of a packet mbuf to their default values.
836  *
837  * The given mbuf must have only one segment.
838  *
839  * @param m
840  *   The packet mbuf to be reset.
841  */
842 static inline void rte_pktmbuf_reset(struct rte_mbuf *m)
843 {
844         m->next = NULL;
845         m->pkt_len = 0;
846         m->tx_offload = 0;
847         m->vlan_tci = 0;
848         m->vlan_tci_outer = 0;
849         m->nb_segs = 1;
850         m->port = RTE_MBUF_PORT_INVALID;
851
852         m->ol_flags &= EXT_ATTACHED_MBUF;
853         m->packet_type = 0;
854         rte_pktmbuf_reset_headroom(m);
855
856         m->data_len = 0;
857         __rte_mbuf_sanity_check(m, 1);
858 }
859
860 /**
861  * Allocate a new mbuf from a mempool.
862  *
863  * This new mbuf contains one segment, which has a length of 0. The pointer
864  * to data is initialized to have some bytes of headroom in the buffer
865  * (if buffer size allows).
866  *
867  * @param mp
868  *   The mempool from which the mbuf is allocated.
869  * @return
870  *   - The pointer to the new mbuf on success.
871  *   - NULL if allocation failed.
872  */
873 static inline struct rte_mbuf *rte_pktmbuf_alloc(struct rte_mempool *mp)
874 {
875         struct rte_mbuf *m;
876         if ((m = rte_mbuf_raw_alloc(mp)) != NULL)
877                 rte_pktmbuf_reset(m);
878         return m;
879 }
880
881 /**
882  * Allocate a bulk of mbufs, initialize refcnt and reset the fields to default
883  * values.
884  *
885  *  @param pool
886  *    The mempool from which mbufs are allocated.
887  *  @param mbufs
888  *    Array of pointers to mbufs
889  *  @param count
890  *    Array size
891  *  @return
892  *   - 0: Success
893  *   - -ENOENT: Not enough entries in the mempool; no mbufs are retrieved.
894  */
895 static inline int rte_pktmbuf_alloc_bulk(struct rte_mempool *pool,
896          struct rte_mbuf **mbufs, unsigned count)
897 {
898         unsigned idx = 0;
899         int rc;
900
901         rc = rte_mempool_get_bulk(pool, (void **)mbufs, count);
902         if (unlikely(rc))
903                 return rc;
904
905         /* To understand duff's device on loop unwinding optimization, see
906          * https://en.wikipedia.org/wiki/Duff's_device.
907          * Here while() loop is used rather than do() while{} to avoid extra
908          * check if count is zero.
909          */
910         switch (count % 4) {
911         case 0:
912                 while (idx != count) {
913                         __rte_mbuf_raw_sanity_check(mbufs[idx]);
914                         rte_pktmbuf_reset(mbufs[idx]);
915                         idx++;
916                         /* fall-through */
917         case 3:
918                         __rte_mbuf_raw_sanity_check(mbufs[idx]);
919                         rte_pktmbuf_reset(mbufs[idx]);
920                         idx++;
921                         /* fall-through */
922         case 2:
923                         __rte_mbuf_raw_sanity_check(mbufs[idx]);
924                         rte_pktmbuf_reset(mbufs[idx]);
925                         idx++;
926                         /* fall-through */
927         case 1:
928                         __rte_mbuf_raw_sanity_check(mbufs[idx]);
929                         rte_pktmbuf_reset(mbufs[idx]);
930                         idx++;
931                         /* fall-through */
932                 }
933         }
934         return 0;
935 }
936
937 /**
938  * Initialize shared data at the end of an external buffer before attaching
939  * to a mbuf by ``rte_pktmbuf_attach_extbuf()``. This is not a mandatory
940  * initialization but a helper function to simply spare a few bytes at the
941  * end of the buffer for shared data. If shared data is allocated
942  * separately, this should not be called but application has to properly
943  * initialize the shared data according to its need.
944  *
945  * Free callback and its argument is saved and the refcnt is set to 1.
946  *
947  * @warning
948  * The value of buf_len will be reduced to RTE_PTR_DIFF(shinfo, buf_addr)
949  * after this initialization. This shall be used for
950  * ``rte_pktmbuf_attach_extbuf()``
951  *
952  * @param buf_addr
953  *   The pointer to the external buffer.
954  * @param [in,out] buf_len
955  *   The pointer to length of the external buffer. Input value must be
956  *   larger than the size of ``struct rte_mbuf_ext_shared_info`` and
957  *   padding for alignment. If not enough, this function will return NULL.
958  *   Adjusted buffer length will be returned through this pointer.
959  * @param free_cb
960  *   Free callback function to call when the external buffer needs to be
961  *   freed.
962  * @param fcb_opaque
963  *   Argument for the free callback function.
964  *
965  * @return
966  *   A pointer to the initialized shared data on success, return NULL
967  *   otherwise.
968  */
969 static inline struct rte_mbuf_ext_shared_info *
970 rte_pktmbuf_ext_shinfo_init_helper(void *buf_addr, uint16_t *buf_len,
971         rte_mbuf_extbuf_free_callback_t free_cb, void *fcb_opaque)
972 {
973         struct rte_mbuf_ext_shared_info *shinfo;
974         void *buf_end = RTE_PTR_ADD(buf_addr, *buf_len);
975         void *addr;
976
977         addr = RTE_PTR_ALIGN_FLOOR(RTE_PTR_SUB(buf_end, sizeof(*shinfo)),
978                                    sizeof(uintptr_t));
979         if (addr <= buf_addr)
980                 return NULL;
981
982         shinfo = (struct rte_mbuf_ext_shared_info *)addr;
983         shinfo->free_cb = free_cb;
984         shinfo->fcb_opaque = fcb_opaque;
985         rte_mbuf_ext_refcnt_set(shinfo, 1);
986
987         *buf_len = (uint16_t)RTE_PTR_DIFF(shinfo, buf_addr);
988         return shinfo;
989 }
990
991 /**
992  * Attach an external buffer to a mbuf.
993  *
994  * User-managed anonymous buffer can be attached to an mbuf. When attaching
995  * it, corresponding free callback function and its argument should be
996  * provided via shinfo. This callback function will be called once all the
997  * mbufs are detached from the buffer (refcnt becomes zero).
998  *
999  * The headroom length of the attaching mbuf will be set to zero and this
1000  * can be properly adjusted after attachment. For example, ``rte_pktmbuf_adj()``
1001  * or ``rte_pktmbuf_reset_headroom()`` might be used.
1002  *
1003  * Similarly, the packet length is initialized to 0. If the buffer contains
1004  * data, the user has to adjust ``data_len`` and the ``pkt_len`` field of
1005  * the mbuf accordingly.
1006  *
1007  * More mbufs can be attached to the same external buffer by
1008  * ``rte_pktmbuf_attach()`` once the external buffer has been attached by
1009  * this API.
1010  *
1011  * Detachment can be done by either ``rte_pktmbuf_detach_extbuf()`` or
1012  * ``rte_pktmbuf_detach()``.
1013  *
1014  * Memory for shared data must be provided and user must initialize all of
1015  * the content properly, especially free callback and refcnt. The pointer
1016  * of shared data will be stored in m->shinfo.
1017  * ``rte_pktmbuf_ext_shinfo_init_helper`` can help to simply spare a few
1018  * bytes at the end of buffer for the shared data, store free callback and
1019  * its argument and set the refcnt to 1. The following is an example:
1020  *
1021  *   struct rte_mbuf_ext_shared_info *shinfo =
1022  *          rte_pktmbuf_ext_shinfo_init_helper(buf_addr, &buf_len,
1023  *                                             free_cb, fcb_arg);
1024  *   rte_pktmbuf_attach_extbuf(m, buf_addr, buf_iova, buf_len, shinfo);
1025  *   rte_pktmbuf_reset_headroom(m);
1026  *   rte_pktmbuf_adj(m, data_len);
1027  *
1028  * Attaching an external buffer is quite similar to mbuf indirection in
1029  * replacing buffer addresses and length of a mbuf, but a few differences:
1030  * - When an indirect mbuf is attached, refcnt of the direct mbuf would be
1031  *   2 as long as the direct mbuf itself isn't freed after the attachment.
1032  *   In such cases, the buffer area of a direct mbuf must be read-only. But
1033  *   external buffer has its own refcnt and it starts from 1. Unless
1034  *   multiple mbufs are attached to a mbuf having an external buffer, the
1035  *   external buffer is writable.
1036  * - There's no need to allocate buffer from a mempool. Any buffer can be
1037  *   attached with appropriate free callback and its IO address.
1038  * - Smaller metadata is required to maintain shared data such as refcnt.
1039  *
1040  * @param m
1041  *   The pointer to the mbuf.
1042  * @param buf_addr
1043  *   The pointer to the external buffer.
1044  * @param buf_iova
1045  *   IO address of the external buffer.
1046  * @param buf_len
1047  *   The size of the external buffer.
1048  * @param shinfo
1049  *   User-provided memory for shared data of the external buffer.
1050  */
1051 static inline void
1052 rte_pktmbuf_attach_extbuf(struct rte_mbuf *m, void *buf_addr,
1053         rte_iova_t buf_iova, uint16_t buf_len,
1054         struct rte_mbuf_ext_shared_info *shinfo)
1055 {
1056         /* mbuf should not be read-only */
1057         RTE_ASSERT(RTE_MBUF_DIRECT(m) && rte_mbuf_refcnt_read(m) == 1);
1058         RTE_ASSERT(shinfo->free_cb != NULL);
1059
1060         m->buf_addr = buf_addr;
1061         m->buf_iova = buf_iova;
1062         m->buf_len = buf_len;
1063
1064         m->data_len = 0;
1065         m->data_off = 0;
1066
1067         m->ol_flags |= EXT_ATTACHED_MBUF;
1068         m->shinfo = shinfo;
1069 }
1070
1071 /**
1072  * Detach the external buffer attached to a mbuf, same as
1073  * ``rte_pktmbuf_detach()``
1074  *
1075  * @param m
1076  *   The mbuf having external buffer.
1077  */
1078 #define rte_pktmbuf_detach_extbuf(m) rte_pktmbuf_detach(m)
1079
1080 /**
1081  * Copy dynamic fields from msrc to mdst.
1082  *
1083  * @param mdst
1084  *   The destination mbuf.
1085  * @param msrc
1086  *   The source mbuf.
1087  */
1088 static inline void
1089 rte_mbuf_dynfield_copy(struct rte_mbuf *mdst, const struct rte_mbuf *msrc)
1090 {
1091         memcpy(&mdst->dynfield1, msrc->dynfield1, sizeof(mdst->dynfield1));
1092 }
1093
1094 /* internal */
1095 static inline void
1096 __rte_pktmbuf_copy_hdr(struct rte_mbuf *mdst, const struct rte_mbuf *msrc)
1097 {
1098         mdst->port = msrc->port;
1099         mdst->vlan_tci = msrc->vlan_tci;
1100         mdst->vlan_tci_outer = msrc->vlan_tci_outer;
1101         mdst->tx_offload = msrc->tx_offload;
1102         mdst->hash = msrc->hash;
1103         mdst->packet_type = msrc->packet_type;
1104         rte_mbuf_dynfield_copy(mdst, msrc);
1105 }
1106
1107 /**
1108  * Attach packet mbuf to another packet mbuf.
1109  *
1110  * If the mbuf we are attaching to isn't a direct buffer and is attached to
1111  * an external buffer, the mbuf being attached will be attached to the
1112  * external buffer instead of mbuf indirection.
1113  *
1114  * Otherwise, the mbuf will be indirectly attached. After attachment we
1115  * refer the mbuf we attached as 'indirect', while mbuf we attached to as
1116  * 'direct'.  The direct mbuf's reference counter is incremented.
1117  *
1118  * Right now, not supported:
1119  *  - attachment for already indirect mbuf (e.g. - mi has to be direct).
1120  *  - mbuf we trying to attach (mi) is used by someone else
1121  *    e.g. it's reference counter is greater then 1.
1122  *
1123  * @param mi
1124  *   The indirect packet mbuf.
1125  * @param m
1126  *   The packet mbuf we're attaching to.
1127  */
1128 static inline void rte_pktmbuf_attach(struct rte_mbuf *mi, struct rte_mbuf *m)
1129 {
1130         RTE_ASSERT(RTE_MBUF_DIRECT(mi) &&
1131             rte_mbuf_refcnt_read(mi) == 1);
1132
1133         if (RTE_MBUF_HAS_EXTBUF(m)) {
1134                 rte_mbuf_ext_refcnt_update(m->shinfo, 1);
1135                 mi->ol_flags = m->ol_flags;
1136                 mi->shinfo = m->shinfo;
1137         } else {
1138                 /* if m is not direct, get the mbuf that embeds the data */
1139                 rte_mbuf_refcnt_update(rte_mbuf_from_indirect(m), 1);
1140                 mi->priv_size = m->priv_size;
1141                 mi->ol_flags = m->ol_flags | IND_ATTACHED_MBUF;
1142         }
1143
1144         __rte_pktmbuf_copy_hdr(mi, m);
1145
1146         mi->data_off = m->data_off;
1147         mi->data_len = m->data_len;
1148         mi->buf_iova = m->buf_iova;
1149         mi->buf_addr = m->buf_addr;
1150         mi->buf_len = m->buf_len;
1151
1152         mi->next = NULL;
1153         mi->pkt_len = mi->data_len;
1154         mi->nb_segs = 1;
1155
1156         __rte_mbuf_sanity_check(mi, 1);
1157         __rte_mbuf_sanity_check(m, 0);
1158 }
1159
1160 /**
1161  * @internal used by rte_pktmbuf_detach().
1162  *
1163  * Decrement the reference counter of the external buffer. When the
1164  * reference counter becomes 0, the buffer is freed by pre-registered
1165  * callback.
1166  */
1167 static inline void
1168 __rte_pktmbuf_free_extbuf(struct rte_mbuf *m)
1169 {
1170         RTE_ASSERT(RTE_MBUF_HAS_EXTBUF(m));
1171         RTE_ASSERT(m->shinfo != NULL);
1172
1173         if (rte_mbuf_ext_refcnt_update(m->shinfo, -1) == 0)
1174                 m->shinfo->free_cb(m->buf_addr, m->shinfo->fcb_opaque);
1175 }
1176
1177 /**
1178  * @internal used by rte_pktmbuf_detach().
1179  *
1180  * Decrement the direct mbuf's reference counter. When the reference
1181  * counter becomes 0, the direct mbuf is freed.
1182  */
1183 static inline void
1184 __rte_pktmbuf_free_direct(struct rte_mbuf *m)
1185 {
1186         struct rte_mbuf *md;
1187
1188         RTE_ASSERT(RTE_MBUF_CLONED(m));
1189
1190         md = rte_mbuf_from_indirect(m);
1191
1192         if (rte_mbuf_refcnt_update(md, -1) == 0) {
1193                 md->next = NULL;
1194                 md->nb_segs = 1;
1195                 rte_mbuf_refcnt_set(md, 1);
1196                 rte_mbuf_raw_free(md);
1197         }
1198 }
1199
1200 /**
1201  * Detach a packet mbuf from external buffer or direct buffer.
1202  *
1203  *  - decrement refcnt and free the external/direct buffer if refcnt
1204  *    becomes zero.
1205  *  - restore original mbuf address and length values.
1206  *  - reset pktmbuf data and data_len to their default values.
1207  *
1208  * All other fields of the given packet mbuf will be left intact.
1209  *
1210  * If the packet mbuf was allocated from the pool with pinned
1211  * external buffers the rte_pktmbuf_detach does nothing with the
1212  * mbuf of this kind, because the pinned buffers are not supposed
1213  * to be detached.
1214  *
1215  * @param m
1216  *   The indirect attached packet mbuf.
1217  */
1218 static inline void rte_pktmbuf_detach(struct rte_mbuf *m)
1219 {
1220         struct rte_mempool *mp = m->pool;
1221         uint32_t mbuf_size, buf_len;
1222         uint16_t priv_size;
1223
1224         if (RTE_MBUF_HAS_EXTBUF(m)) {
1225                 /*
1226                  * The mbuf has the external attached buffer,
1227                  * we should check the type of the memory pool where
1228                  * the mbuf was allocated from to detect the pinned
1229                  * external buffer.
1230                  */
1231                 uint32_t flags = rte_pktmbuf_priv_flags(mp);
1232
1233                 if (flags & RTE_PKTMBUF_POOL_F_PINNED_EXT_BUF) {
1234                         /*
1235                          * The pinned external buffer should not be
1236                          * detached from its backing mbuf, just exit.
1237                          */
1238                         return;
1239                 }
1240                 __rte_pktmbuf_free_extbuf(m);
1241         } else {
1242                 __rte_pktmbuf_free_direct(m);
1243         }
1244         priv_size = rte_pktmbuf_priv_size(mp);
1245         mbuf_size = (uint32_t)(sizeof(struct rte_mbuf) + priv_size);
1246         buf_len = rte_pktmbuf_data_room_size(mp);
1247
1248         m->priv_size = priv_size;
1249         m->buf_addr = (char *)m + mbuf_size;
1250         m->buf_iova = rte_mempool_virt2iova(m) + mbuf_size;
1251         m->buf_len = (uint16_t)buf_len;
1252         rte_pktmbuf_reset_headroom(m);
1253         m->data_len = 0;
1254         m->ol_flags = 0;
1255 }
1256
1257 /**
1258  * @internal Handle the packet mbufs with attached pinned external buffer
1259  * on the mbuf freeing:
1260  *
1261  *  - return zero if reference counter in shinfo is one. It means there is
1262  *  no more reference to this pinned buffer and mbuf can be returned to
1263  *  the pool
1264  *
1265  *  - otherwise (if reference counter is not one), decrement reference
1266  *  counter and return non-zero value to prevent freeing the backing mbuf.
1267  *
1268  * Returns non zero if mbuf should not be freed.
1269  */
1270 static inline int __rte_pktmbuf_pinned_extbuf_decref(struct rte_mbuf *m)
1271 {
1272         struct rte_mbuf_ext_shared_info *shinfo;
1273
1274         /* Clear flags, mbuf is being freed. */
1275         m->ol_flags = EXT_ATTACHED_MBUF;
1276         shinfo = m->shinfo;
1277
1278         /* Optimize for performance - do not dec/reinit */
1279         if (likely(rte_mbuf_ext_refcnt_read(shinfo) == 1))
1280                 return 0;
1281
1282         /*
1283          * Direct usage of add primitive to avoid
1284          * duplication of comparing with one.
1285          */
1286         if (likely(__atomic_add_fetch(&shinfo->refcnt, (uint16_t)-1,
1287                                      __ATOMIC_ACQ_REL)))
1288                 return 1;
1289
1290         /* Reinitialize counter before mbuf freeing. */
1291         rte_mbuf_ext_refcnt_set(shinfo, 1);
1292         return 0;
1293 }
1294
1295 /**
1296  * Decrease reference counter and unlink a mbuf segment
1297  *
1298  * This function does the same than a free, except that it does not
1299  * return the segment to its pool.
1300  * It decreases the reference counter, and if it reaches 0, it is
1301  * detached from its parent for an indirect mbuf.
1302  *
1303  * @param m
1304  *   The mbuf to be unlinked
1305  * @return
1306  *   - (m) if it is the last reference. It can be recycled or freed.
1307  *   - (NULL) if the mbuf still has remaining references on it.
1308  */
1309 static __rte_always_inline struct rte_mbuf *
1310 rte_pktmbuf_prefree_seg(struct rte_mbuf *m)
1311 {
1312         __rte_mbuf_sanity_check(m, 0);
1313
1314         if (likely(rte_mbuf_refcnt_read(m) == 1)) {
1315
1316                 if (!RTE_MBUF_DIRECT(m)) {
1317                         rte_pktmbuf_detach(m);
1318                         if (RTE_MBUF_HAS_EXTBUF(m) &&
1319                             RTE_MBUF_HAS_PINNED_EXTBUF(m) &&
1320                             __rte_pktmbuf_pinned_extbuf_decref(m))
1321                                 return NULL;
1322                 }
1323
1324                 if (m->next != NULL) {
1325                         m->next = NULL;
1326                         m->nb_segs = 1;
1327                 }
1328
1329                 return m;
1330
1331         } else if (__rte_mbuf_refcnt_update(m, -1) == 0) {
1332
1333                 if (!RTE_MBUF_DIRECT(m)) {
1334                         rte_pktmbuf_detach(m);
1335                         if (RTE_MBUF_HAS_EXTBUF(m) &&
1336                             RTE_MBUF_HAS_PINNED_EXTBUF(m) &&
1337                             __rte_pktmbuf_pinned_extbuf_decref(m))
1338                                 return NULL;
1339                 }
1340
1341                 if (m->next != NULL) {
1342                         m->next = NULL;
1343                         m->nb_segs = 1;
1344                 }
1345                 rte_mbuf_refcnt_set(m, 1);
1346
1347                 return m;
1348         }
1349         return NULL;
1350 }
1351
1352 /**
1353  * Free a segment of a packet mbuf into its original mempool.
1354  *
1355  * Free an mbuf, without parsing other segments in case of chained
1356  * buffers.
1357  *
1358  * @param m
1359  *   The packet mbuf segment to be freed.
1360  */
1361 static __rte_always_inline void
1362 rte_pktmbuf_free_seg(struct rte_mbuf *m)
1363 {
1364         m = rte_pktmbuf_prefree_seg(m);
1365         if (likely(m != NULL))
1366                 rte_mbuf_raw_free(m);
1367 }
1368
1369 /**
1370  * Free a packet mbuf back into its original mempool.
1371  *
1372  * Free an mbuf, and all its segments in case of chained buffers. Each
1373  * segment is added back into its original mempool.
1374  *
1375  * @param m
1376  *   The packet mbuf to be freed. If NULL, the function does nothing.
1377  */
1378 static inline void rte_pktmbuf_free(struct rte_mbuf *m)
1379 {
1380         struct rte_mbuf *m_next;
1381
1382         if (m != NULL)
1383                 __rte_mbuf_sanity_check(m, 1);
1384
1385         while (m != NULL) {
1386                 m_next = m->next;
1387                 rte_pktmbuf_free_seg(m);
1388                 m = m_next;
1389         }
1390 }
1391
1392 /**
1393  * Free a bulk of packet mbufs back into their original mempools.
1394  *
1395  * Free a bulk of mbufs, and all their segments in case of chained buffers.
1396  * Each segment is added back into its original mempool.
1397  *
1398  *  @param mbufs
1399  *    Array of pointers to packet mbufs.
1400  *    The array may contain NULL pointers.
1401  *  @param count
1402  *    Array size.
1403  */
1404 void rte_pktmbuf_free_bulk(struct rte_mbuf **mbufs, unsigned int count);
1405
1406 /**
1407  * Create a "clone" of the given packet mbuf.
1408  *
1409  * Walks through all segments of the given packet mbuf, and for each of them:
1410  *  - Creates a new packet mbuf from the given pool.
1411  *  - Attaches newly created mbuf to the segment.
1412  * Then updates pkt_len and nb_segs of the "clone" packet mbuf to match values
1413  * from the original packet mbuf.
1414  *
1415  * @param md
1416  *   The packet mbuf to be cloned.
1417  * @param mp
1418  *   The mempool from which the "clone" mbufs are allocated.
1419  * @return
1420  *   - The pointer to the new "clone" mbuf on success.
1421  *   - NULL if allocation fails.
1422  */
1423 struct rte_mbuf *
1424 rte_pktmbuf_clone(struct rte_mbuf *md, struct rte_mempool *mp);
1425
1426 /**
1427  * Create a full copy of a given packet mbuf.
1428  *
1429  * Copies all the data from a given packet mbuf to a newly allocated
1430  * set of mbufs. The private data are is not copied.
1431  *
1432  * @param m
1433  *   The packet mbuf to be copiedd.
1434  * @param mp
1435  *   The mempool from which the "clone" mbufs are allocated.
1436  * @param offset
1437  *   The number of bytes to skip before copying.
1438  *   If the mbuf does not have that many bytes, it is an error
1439  *   and NULL is returned.
1440  * @param length
1441  *   The upper limit on bytes to copy.  Passing UINT32_MAX
1442  *   means all data (after offset).
1443  * @return
1444  *   - The pointer to the new "clone" mbuf on success.
1445  *   - NULL if allocation fails.
1446  */
1447 struct rte_mbuf *
1448 rte_pktmbuf_copy(const struct rte_mbuf *m, struct rte_mempool *mp,
1449                  uint32_t offset, uint32_t length);
1450
1451 /**
1452  * Adds given value to the refcnt of all packet mbuf segments.
1453  *
1454  * Walks through all segments of given packet mbuf and for each of them
1455  * invokes rte_mbuf_refcnt_update().
1456  *
1457  * @param m
1458  *   The packet mbuf whose refcnt to be updated.
1459  * @param v
1460  *   The value to add to the mbuf's segments refcnt.
1461  */
1462 static inline void rte_pktmbuf_refcnt_update(struct rte_mbuf *m, int16_t v)
1463 {
1464         __rte_mbuf_sanity_check(m, 1);
1465
1466         do {
1467                 rte_mbuf_refcnt_update(m, v);
1468         } while ((m = m->next) != NULL);
1469 }
1470
1471 /**
1472  * Get the headroom in a packet mbuf.
1473  *
1474  * @param m
1475  *   The packet mbuf.
1476  * @return
1477  *   The length of the headroom.
1478  */
1479 static inline uint16_t rte_pktmbuf_headroom(const struct rte_mbuf *m)
1480 {
1481         __rte_mbuf_sanity_check(m, 0);
1482         return m->data_off;
1483 }
1484
1485 /**
1486  * Get the tailroom of a packet mbuf.
1487  *
1488  * @param m
1489  *   The packet mbuf.
1490  * @return
1491  *   The length of the tailroom.
1492  */
1493 static inline uint16_t rte_pktmbuf_tailroom(const struct rte_mbuf *m)
1494 {
1495         __rte_mbuf_sanity_check(m, 0);
1496         return (uint16_t)(m->buf_len - rte_pktmbuf_headroom(m) -
1497                           m->data_len);
1498 }
1499
1500 /**
1501  * Get the last segment of the packet.
1502  *
1503  * @param m
1504  *   The packet mbuf.
1505  * @return
1506  *   The last segment of the given mbuf.
1507  */
1508 static inline struct rte_mbuf *rte_pktmbuf_lastseg(struct rte_mbuf *m)
1509 {
1510         __rte_mbuf_sanity_check(m, 1);
1511         while (m->next != NULL)
1512                 m = m->next;
1513         return m;
1514 }
1515
1516 /**
1517  * A macro that returns the length of the packet.
1518  *
1519  * The value can be read or assigned.
1520  *
1521  * @param m
1522  *   The packet mbuf.
1523  */
1524 #define rte_pktmbuf_pkt_len(m) ((m)->pkt_len)
1525
1526 /**
1527  * A macro that returns the length of the segment.
1528  *
1529  * The value can be read or assigned.
1530  *
1531  * @param m
1532  *   The packet mbuf.
1533  */
1534 #define rte_pktmbuf_data_len(m) ((m)->data_len)
1535
1536 /**
1537  * Prepend len bytes to an mbuf data area.
1538  *
1539  * Returns a pointer to the new
1540  * data start address. If there is not enough headroom in the first
1541  * segment, the function will return NULL, without modifying the mbuf.
1542  *
1543  * @param m
1544  *   The pkt mbuf.
1545  * @param len
1546  *   The amount of data to prepend (in bytes).
1547  * @return
1548  *   A pointer to the start of the newly prepended data, or
1549  *   NULL if there is not enough headroom space in the first segment
1550  */
1551 static inline char *rte_pktmbuf_prepend(struct rte_mbuf *m,
1552                                         uint16_t len)
1553 {
1554         __rte_mbuf_sanity_check(m, 1);
1555
1556         if (unlikely(len > rte_pktmbuf_headroom(m)))
1557                 return NULL;
1558
1559         /* NB: elaborating the subtraction like this instead of using
1560          *     -= allows us to ensure the result type is uint16_t
1561          *     avoiding compiler warnings on gcc 8.1 at least */
1562         m->data_off = (uint16_t)(m->data_off - len);
1563         m->data_len = (uint16_t)(m->data_len + len);
1564         m->pkt_len  = (m->pkt_len + len);
1565
1566         return (char *)m->buf_addr + m->data_off;
1567 }
1568
1569 /**
1570  * Append len bytes to an mbuf.
1571  *
1572  * Append len bytes to an mbuf and return a pointer to the start address
1573  * of the added data. If there is not enough tailroom in the last
1574  * segment, the function will return NULL, without modifying the mbuf.
1575  *
1576  * @param m
1577  *   The packet mbuf.
1578  * @param len
1579  *   The amount of data to append (in bytes).
1580  * @return
1581  *   A pointer to the start of the newly appended data, or
1582  *   NULL if there is not enough tailroom space in the last segment
1583  */
1584 static inline char *rte_pktmbuf_append(struct rte_mbuf *m, uint16_t len)
1585 {
1586         void *tail;
1587         struct rte_mbuf *m_last;
1588
1589         __rte_mbuf_sanity_check(m, 1);
1590
1591         m_last = rte_pktmbuf_lastseg(m);
1592         if (unlikely(len > rte_pktmbuf_tailroom(m_last)))
1593                 return NULL;
1594
1595         tail = (char *)m_last->buf_addr + m_last->data_off + m_last->data_len;
1596         m_last->data_len = (uint16_t)(m_last->data_len + len);
1597         m->pkt_len  = (m->pkt_len + len);
1598         return (char*) tail;
1599 }
1600
1601 /**
1602  * Remove len bytes at the beginning of an mbuf.
1603  *
1604  * Returns a pointer to the start address of the new data area. If the
1605  * length is greater than the length of the first segment, then the
1606  * function will fail and return NULL, without modifying the mbuf.
1607  *
1608  * @param m
1609  *   The packet mbuf.
1610  * @param len
1611  *   The amount of data to remove (in bytes).
1612  * @return
1613  *   A pointer to the new start of the data.
1614  */
1615 static inline char *rte_pktmbuf_adj(struct rte_mbuf *m, uint16_t len)
1616 {
1617         __rte_mbuf_sanity_check(m, 1);
1618
1619         if (unlikely(len > m->data_len))
1620                 return NULL;
1621
1622         /* NB: elaborating the addition like this instead of using
1623          *     += allows us to ensure the result type is uint16_t
1624          *     avoiding compiler warnings on gcc 8.1 at least */
1625         m->data_len = (uint16_t)(m->data_len - len);
1626         m->data_off = (uint16_t)(m->data_off + len);
1627         m->pkt_len  = (m->pkt_len - len);
1628         return (char *)m->buf_addr + m->data_off;
1629 }
1630
1631 /**
1632  * Remove len bytes of data at the end of the mbuf.
1633  *
1634  * If the length is greater than the length of the last segment, the
1635  * function will fail and return -1 without modifying the mbuf.
1636  *
1637  * @param m
1638  *   The packet mbuf.
1639  * @param len
1640  *   The amount of data to remove (in bytes).
1641  * @return
1642  *   - 0: On success.
1643  *   - -1: On error.
1644  */
1645 static inline int rte_pktmbuf_trim(struct rte_mbuf *m, uint16_t len)
1646 {
1647         struct rte_mbuf *m_last;
1648
1649         __rte_mbuf_sanity_check(m, 1);
1650
1651         m_last = rte_pktmbuf_lastseg(m);
1652         if (unlikely(len > m_last->data_len))
1653                 return -1;
1654
1655         m_last->data_len = (uint16_t)(m_last->data_len - len);
1656         m->pkt_len  = (m->pkt_len - len);
1657         return 0;
1658 }
1659
1660 /**
1661  * Test if mbuf data is contiguous.
1662  *
1663  * @param m
1664  *   The packet mbuf.
1665  * @return
1666  *   - 1, if all data is contiguous (one segment).
1667  *   - 0, if there is several segments.
1668  */
1669 static inline int rte_pktmbuf_is_contiguous(const struct rte_mbuf *m)
1670 {
1671         __rte_mbuf_sanity_check(m, 1);
1672         return m->nb_segs == 1;
1673 }
1674
1675 /**
1676  * @internal used by rte_pktmbuf_read().
1677  */
1678 const void *__rte_pktmbuf_read(const struct rte_mbuf *m, uint32_t off,
1679         uint32_t len, void *buf);
1680
1681 /**
1682  * Read len data bytes in a mbuf at specified offset.
1683  *
1684  * If the data is contiguous, return the pointer in the mbuf data, else
1685  * copy the data in the buffer provided by the user and return its
1686  * pointer.
1687  *
1688  * @param m
1689  *   The pointer to the mbuf.
1690  * @param off
1691  *   The offset of the data in the mbuf.
1692  * @param len
1693  *   The amount of bytes to read.
1694  * @param buf
1695  *   The buffer where data is copied if it is not contiguous in mbuf
1696  *   data. Its length should be at least equal to the len parameter.
1697  * @return
1698  *   The pointer to the data, either in the mbuf if it is contiguous,
1699  *   or in the user buffer. If mbuf is too small, NULL is returned.
1700  */
1701 static inline const void *rte_pktmbuf_read(const struct rte_mbuf *m,
1702         uint32_t off, uint32_t len, void *buf)
1703 {
1704         if (likely(off + len <= rte_pktmbuf_data_len(m)))
1705                 return rte_pktmbuf_mtod_offset(m, char *, off);
1706         else
1707                 return __rte_pktmbuf_read(m, off, len, buf);
1708 }
1709
1710 /**
1711  * Chain an mbuf to another, thereby creating a segmented packet.
1712  *
1713  * Note: The implementation will do a linear walk over the segments to find
1714  * the tail entry. For cases when there are many segments, it's better to
1715  * chain the entries manually.
1716  *
1717  * @param head
1718  *   The head of the mbuf chain (the first packet)
1719  * @param tail
1720  *   The mbuf to put last in the chain
1721  *
1722  * @return
1723  *   - 0, on success.
1724  *   - -EOVERFLOW, if the chain segment limit exceeded
1725  */
1726 static inline int rte_pktmbuf_chain(struct rte_mbuf *head, struct rte_mbuf *tail)
1727 {
1728         struct rte_mbuf *cur_tail;
1729
1730         /* Check for number-of-segments-overflow */
1731         if (head->nb_segs + tail->nb_segs > RTE_MBUF_MAX_NB_SEGS)
1732                 return -EOVERFLOW;
1733
1734         /* Chain 'tail' onto the old tail */
1735         cur_tail = rte_pktmbuf_lastseg(head);
1736         cur_tail->next = tail;
1737
1738         /* accumulate number of segments and total length.
1739          * NB: elaborating the addition like this instead of using
1740          *     -= allows us to ensure the result type is uint16_t
1741          *     avoiding compiler warnings on gcc 8.1 at least */
1742         head->nb_segs = (uint16_t)(head->nb_segs + tail->nb_segs);
1743         head->pkt_len += tail->pkt_len;
1744
1745         /* pkt_len is only set in the head */
1746         tail->pkt_len = tail->data_len;
1747
1748         return 0;
1749 }
1750
1751 /*
1752  * @warning
1753  * @b EXPERIMENTAL: This API may change without prior notice.
1754  *
1755  * For given input values generate raw tx_offload value.
1756  * Note that it is caller responsibility to make sure that input parameters
1757  * don't exceed maximum bit-field values.
1758  * @param il2
1759  *   l2_len value.
1760  * @param il3
1761  *   l3_len value.
1762  * @param il4
1763  *   l4_len value.
1764  * @param tso
1765  *   tso_segsz value.
1766  * @param ol3
1767  *   outer_l3_len value.
1768  * @param ol2
1769  *   outer_l2_len value.
1770  * @param unused
1771  *   unused value.
1772  * @return
1773  *   raw tx_offload value.
1774  */
1775 static __rte_always_inline uint64_t
1776 rte_mbuf_tx_offload(uint64_t il2, uint64_t il3, uint64_t il4, uint64_t tso,
1777         uint64_t ol3, uint64_t ol2, uint64_t unused)
1778 {
1779         return il2 << RTE_MBUF_L2_LEN_OFS |
1780                 il3 << RTE_MBUF_L3_LEN_OFS |
1781                 il4 << RTE_MBUF_L4_LEN_OFS |
1782                 tso << RTE_MBUF_TSO_SEGSZ_OFS |
1783                 ol3 << RTE_MBUF_OUTL3_LEN_OFS |
1784                 ol2 << RTE_MBUF_OUTL2_LEN_OFS |
1785                 unused << RTE_MBUF_TXOFLD_UNUSED_OFS;
1786 }
1787
1788 /**
1789  * Validate general requirements for Tx offload in mbuf.
1790  *
1791  * This function checks correctness and completeness of Tx offload settings.
1792  *
1793  * @param m
1794  *   The packet mbuf to be validated.
1795  * @return
1796  *   0 if packet is valid
1797  */
1798 static inline int
1799 rte_validate_tx_offload(const struct rte_mbuf *m)
1800 {
1801         uint64_t ol_flags = m->ol_flags;
1802
1803         /* Does packet set any of available offloads? */
1804         if (!(ol_flags & PKT_TX_OFFLOAD_MASK))
1805                 return 0;
1806
1807         /* IP checksum can be counted only for IPv4 packet */
1808         if ((ol_flags & PKT_TX_IP_CKSUM) && (ol_flags & PKT_TX_IPV6))
1809                 return -EINVAL;
1810
1811         /* IP type not set when required */
1812         if (ol_flags & (PKT_TX_L4_MASK | PKT_TX_TCP_SEG))
1813                 if (!(ol_flags & (PKT_TX_IPV4 | PKT_TX_IPV6)))
1814                         return -EINVAL;
1815
1816         /* Check requirements for TSO packet */
1817         if (ol_flags & PKT_TX_TCP_SEG)
1818                 if ((m->tso_segsz == 0) ||
1819                                 ((ol_flags & PKT_TX_IPV4) &&
1820                                 !(ol_flags & PKT_TX_IP_CKSUM)))
1821                         return -EINVAL;
1822
1823         /* PKT_TX_OUTER_IP_CKSUM set for non outer IPv4 packet. */
1824         if ((ol_flags & PKT_TX_OUTER_IP_CKSUM) &&
1825                         !(ol_flags & PKT_TX_OUTER_IPV4))
1826                 return -EINVAL;
1827
1828         return 0;
1829 }
1830
1831 /**
1832  * @internal used by rte_pktmbuf_linearize().
1833  */
1834 int __rte_pktmbuf_linearize(struct rte_mbuf *mbuf);
1835
1836 /**
1837  * Linearize data in mbuf.
1838  *
1839  * This function moves the mbuf data in the first segment if there is enough
1840  * tailroom. The subsequent segments are unchained and freed.
1841  *
1842  * @param mbuf
1843  *   mbuf to linearize
1844  * @return
1845  *   - 0, on success
1846  *   - -1, on error
1847  */
1848 static inline int
1849 rte_pktmbuf_linearize(struct rte_mbuf *mbuf)
1850 {
1851         if (rte_pktmbuf_is_contiguous(mbuf))
1852                 return 0;
1853         return __rte_pktmbuf_linearize(mbuf);
1854 }
1855
1856 /**
1857  * Dump an mbuf structure to a file.
1858  *
1859  * Dump all fields for the given packet mbuf and all its associated
1860  * segments (in the case of a chained buffer).
1861  *
1862  * @param f
1863  *   A pointer to a file for output
1864  * @param m
1865  *   The packet mbuf.
1866  * @param dump_len
1867  *   If dump_len != 0, also dump the "dump_len" first data bytes of
1868  *   the packet.
1869  */
1870 void rte_pktmbuf_dump(FILE *f, const struct rte_mbuf *m, unsigned dump_len);
1871
1872 /**
1873  * Get the value of mbuf sched queue_id field.
1874  */
1875 static inline uint32_t
1876 rte_mbuf_sched_queue_get(const struct rte_mbuf *m)
1877 {
1878         return m->hash.sched.queue_id;
1879 }
1880
1881 /**
1882  * Get the value of mbuf sched traffic_class field.
1883  */
1884 static inline uint8_t
1885 rte_mbuf_sched_traffic_class_get(const struct rte_mbuf *m)
1886 {
1887         return m->hash.sched.traffic_class;
1888 }
1889
1890 /**
1891  * Get the value of mbuf sched color field.
1892  */
1893 static inline uint8_t
1894 rte_mbuf_sched_color_get(const struct rte_mbuf *m)
1895 {
1896         return m->hash.sched.color;
1897 }
1898
1899 /**
1900  * Get the values of mbuf sched queue_id, traffic_class and color.
1901  *
1902  * @param m
1903  *   Mbuf to read
1904  * @param queue_id
1905  *  Returns the queue id
1906  * @param traffic_class
1907  *  Returns the traffic class id
1908  * @param color
1909  *  Returns the colour id
1910  */
1911 static inline void
1912 rte_mbuf_sched_get(const struct rte_mbuf *m, uint32_t *queue_id,
1913                         uint8_t *traffic_class,
1914                         uint8_t *color)
1915 {
1916         struct rte_mbuf_sched sched = m->hash.sched;
1917
1918         *queue_id = sched.queue_id;
1919         *traffic_class = sched.traffic_class;
1920         *color = sched.color;
1921 }
1922
1923 /**
1924  * Set the mbuf sched queue_id to the defined value.
1925  */
1926 static inline void
1927 rte_mbuf_sched_queue_set(struct rte_mbuf *m, uint32_t queue_id)
1928 {
1929         m->hash.sched.queue_id = queue_id;
1930 }
1931
1932 /**
1933  * Set the mbuf sched traffic_class id to the defined value.
1934  */
1935 static inline void
1936 rte_mbuf_sched_traffic_class_set(struct rte_mbuf *m, uint8_t traffic_class)
1937 {
1938         m->hash.sched.traffic_class = traffic_class;
1939 }
1940
1941 /**
1942  * Set the mbuf sched color id to the defined value.
1943  */
1944 static inline void
1945 rte_mbuf_sched_color_set(struct rte_mbuf *m, uint8_t color)
1946 {
1947         m->hash.sched.color = color;
1948 }
1949
1950 /**
1951  * Set the mbuf sched queue_id, traffic_class and color.
1952  *
1953  * @param m
1954  *   Mbuf to set
1955  * @param queue_id
1956  *  Queue id value to be set
1957  * @param traffic_class
1958  *  Traffic class id value to be set
1959  * @param color
1960  *  Color id to be set
1961  */
1962 static inline void
1963 rte_mbuf_sched_set(struct rte_mbuf *m, uint32_t queue_id,
1964                         uint8_t traffic_class,
1965                         uint8_t color)
1966 {
1967         m->hash.sched = (struct rte_mbuf_sched){
1968                                 .queue_id = queue_id,
1969                                 .traffic_class = traffic_class,
1970                                 .color = color,
1971                                 .reserved = 0,
1972                         };
1973 }
1974
1975 #ifdef __cplusplus
1976 }
1977 #endif
1978
1979 #endif /* _RTE_MBUF_H_ */