35 #include <rte_compat.h>
37 #include <rte_config.h>
72 #define PKT_RX_VLAN (1ULL << 0)
74 #define PKT_RX_RSS_HASH (1ULL << 1)
75 #define PKT_RX_FDIR (1ULL << 2)
84 #define PKT_RX_L4_CKSUM_BAD (1ULL << 3)
93 #define PKT_RX_IP_CKSUM_BAD (1ULL << 4)
95 #define PKT_RX_EIP_CKSUM_BAD (1ULL << 5)
103 #define PKT_RX_VLAN_STRIPPED (1ULL << 6)
113 #define PKT_RX_IP_CKSUM_MASK ((1ULL << 4) | (1ULL << 7))
115 #define PKT_RX_IP_CKSUM_UNKNOWN 0
116 #define PKT_RX_IP_CKSUM_BAD (1ULL << 4)
117 #define PKT_RX_IP_CKSUM_GOOD (1ULL << 7)
118 #define PKT_RX_IP_CKSUM_NONE ((1ULL << 4) | (1ULL << 7))
128 #define PKT_RX_L4_CKSUM_MASK ((1ULL << 3) | (1ULL << 8))
130 #define PKT_RX_L4_CKSUM_UNKNOWN 0
131 #define PKT_RX_L4_CKSUM_BAD (1ULL << 3)
132 #define PKT_RX_L4_CKSUM_GOOD (1ULL << 8)
133 #define PKT_RX_L4_CKSUM_NONE ((1ULL << 3) | (1ULL << 8))
135 #define PKT_RX_IEEE1588_PTP (1ULL << 9)
136 #define PKT_RX_IEEE1588_TMST (1ULL << 10)
137 #define PKT_RX_FDIR_ID (1ULL << 13)
138 #define PKT_RX_FDIR_FLX (1ULL << 14)
148 #define PKT_RX_QINQ_STRIPPED (1ULL << 15)
155 #define PKT_RX_LRO (1ULL << 16)
160 #define PKT_RX_TIMESTAMP (1ULL << 17)
165 #define PKT_RX_SEC_OFFLOAD (1ULL << 18)
170 #define PKT_RX_SEC_OFFLOAD_FAILED (1ULL << 19)
180 #define PKT_RX_QINQ (1ULL << 20)
194 #define PKT_RX_OUTER_L4_CKSUM_MASK ((1ULL << 21) | (1ULL << 22))
196 #define PKT_RX_OUTER_L4_CKSUM_UNKNOWN 0
197 #define PKT_RX_OUTER_L4_CKSUM_BAD (1ULL << 21)
198 #define PKT_RX_OUTER_L4_CKSUM_GOOD (1ULL << 22)
199 #define PKT_RX_OUTER_L4_CKSUM_INVALID ((1ULL << 21) | (1ULL << 22))
208 #define PKT_TX_METADATA (1ULL << 40)
219 #define PKT_TX_OUTER_UDP_CKSUM (1ULL << 41)
226 #define PKT_TX_UDP_SEG (1ULL << 42)
231 #define PKT_TX_SEC_OFFLOAD (1ULL << 43)
237 #define PKT_TX_MACSEC (1ULL << 44)
247 #define PKT_TX_TUNNEL_VXLAN (0x1ULL << 45)
248 #define PKT_TX_TUNNEL_GRE (0x2ULL << 45)
249 #define PKT_TX_TUNNEL_IPIP (0x3ULL << 45)
250 #define PKT_TX_TUNNEL_GENEVE (0x4ULL << 45)
252 #define PKT_TX_TUNNEL_MPLSINUDP (0x5ULL << 45)
253 #define PKT_TX_TUNNEL_VXLAN_GPE (0x6ULL << 45)
265 #define PKT_TX_TUNNEL_IP (0xDULL << 45)
278 #define PKT_TX_TUNNEL_UDP (0xEULL << 45)
280 #define PKT_TX_TUNNEL_MASK (0xFULL << 45)
287 #define PKT_TX_QINQ (1ULL << 49)
289 #define PKT_TX_QINQ_PKT PKT_TX_QINQ
300 #define PKT_TX_TCP_SEG (1ULL << 50)
302 #define PKT_TX_IEEE1588_TMST (1ULL << 51)
312 #define PKT_TX_L4_NO_CKSUM (0ULL << 52)
313 #define PKT_TX_TCP_CKSUM (1ULL << 52)
314 #define PKT_TX_SCTP_CKSUM (2ULL << 52)
315 #define PKT_TX_UDP_CKSUM (3ULL << 52)
316 #define PKT_TX_L4_MASK (3ULL << 52)
324 #define PKT_TX_IP_CKSUM (1ULL << 54)
332 #define PKT_TX_IPV4 (1ULL << 55)
340 #define PKT_TX_IPV6 (1ULL << 56)
347 #define PKT_TX_VLAN (1ULL << 57)
349 #define PKT_TX_VLAN_PKT PKT_TX_VLAN
357 #define PKT_TX_OUTER_IP_CKSUM (1ULL << 58)
364 #define PKT_TX_OUTER_IPV4 (1ULL << 59)
371 #define PKT_TX_OUTER_IPV6 (1ULL << 60)
377 #define PKT_TX_OFFLOAD_MASK ( \
378 PKT_TX_OUTER_IPV6 | \
379 PKT_TX_OUTER_IPV4 | \
380 PKT_TX_OUTER_IP_CKSUM | \
386 PKT_TX_IEEE1588_TMST | \
389 PKT_TX_TUNNEL_MASK | \
391 PKT_TX_SEC_OFFLOAD | \
393 PKT_TX_OUTER_UDP_CKSUM | \
399 #define EXT_ATTACHED_MBUF (1ULL << 61)
401 #define IND_ATTACHED_MBUF (1ULL << 62)
404 #define RTE_MBUF_PRIV_ALIGN 8
462 #define RTE_MBUF_DEFAULT_DATAROOM 2048
463 #define RTE_MBUF_DEFAULT_BUF_SIZE \
464 (RTE_MBUF_DEFAULT_DATAROOM + RTE_PKTMBUF_HEADROOM)
492 RTE_MBUF_L2_LEN_BITS = 7,
493 RTE_MBUF_L3_LEN_BITS = 9,
494 RTE_MBUF_L4_LEN_BITS = 8,
495 RTE_MBUF_TSO_SEGSZ_BITS = 16,
496 RTE_MBUF_OUTL3_LEN_BITS = 9,
497 RTE_MBUF_OUTL2_LEN_BITS = 7,
498 RTE_MBUF_TXOFLD_UNUSED_BITS =
sizeof(uint64_t) * CHAR_BIT -
499 RTE_MBUF_L2_LEN_BITS -
500 RTE_MBUF_L3_LEN_BITS -
501 RTE_MBUF_L4_LEN_BITS -
502 RTE_MBUF_TSO_SEGSZ_BITS -
503 RTE_MBUF_OUTL3_LEN_BITS -
504 RTE_MBUF_OUTL2_LEN_BITS,
505 #
if RTE_BYTE_ORDER == RTE_BIG_ENDIAN
506 RTE_MBUF_L2_LEN_OFS =
507 sizeof(uint64_t) * CHAR_BIT - RTE_MBUF_L2_LEN_BITS,
508 RTE_MBUF_L3_LEN_OFS = RTE_MBUF_L2_LEN_OFS - RTE_MBUF_L3_LEN_BITS,
509 RTE_MBUF_L4_LEN_OFS = RTE_MBUF_L3_LEN_OFS - RTE_MBUF_L4_LEN_BITS,
510 RTE_MBUF_TSO_SEGSZ_OFS = RTE_MBUF_L4_LEN_OFS - RTE_MBUF_TSO_SEGSZ_BITS,
511 RTE_MBUF_OUTL3_LEN_OFS =
512 RTE_MBUF_TSO_SEGSZ_OFS - RTE_MBUF_OUTL3_LEN_BITS,
513 RTE_MBUF_OUTL2_LEN_OFS =
514 RTE_MBUF_OUTL3_LEN_OFS - RTE_MBUF_OUTL2_LEN_BITS,
515 RTE_MBUF_TXOFLD_UNUSED_OFS =
516 RTE_MBUF_OUTL2_LEN_OFS - RTE_MBUF_TXOFLD_UNUSED_BITS,
518 RTE_MBUF_L2_LEN_OFS = 0,
519 RTE_MBUF_L3_LEN_OFS = RTE_MBUF_L2_LEN_OFS + RTE_MBUF_L2_LEN_BITS,
520 RTE_MBUF_L4_LEN_OFS = RTE_MBUF_L3_LEN_OFS + RTE_MBUF_L3_LEN_BITS,
521 RTE_MBUF_TSO_SEGSZ_OFS = RTE_MBUF_L4_LEN_OFS + RTE_MBUF_L4_LEN_BITS,
522 RTE_MBUF_OUTL3_LEN_OFS =
523 RTE_MBUF_TSO_SEGSZ_OFS + RTE_MBUF_TSO_SEGSZ_BITS,
524 RTE_MBUF_OUTL2_LEN_OFS =
525 RTE_MBUF_OUTL3_LEN_OFS + RTE_MBUF_OUTL3_LEN_BITS,
526 RTE_MBUF_TXOFLD_UNUSED_OFS =
527 RTE_MBUF_OUTL2_LEN_OFS + RTE_MBUF_OUTL2_LEN_BITS,
578 MARKER rx_descriptor_fields1;
675 MARKER cacheline1 __rte_cache_min_aligned;
692 uint64_t
l2_len:RTE_MBUF_L2_LEN_BITS;
696 uint64_t
l3_len:RTE_MBUF_L3_LEN_BITS;
698 uint64_t
l4_len:RTE_MBUF_L4_LEN_BITS;
700 uint64_t
tso_segsz:RTE_MBUF_TSO_SEGSZ_BITS;
745 #define RTE_MBUF_MAX_NB_SEGS UINT16_MAX
777 #if RTE_CACHE_LINE_SIZE == 64
798 return mb->buf_iova + mb->data_off;
803 rte_mbuf_data_dma_addr(
const struct rte_mbuf *mb)
823 return mb->buf_iova + RTE_PKTMBUF_HEADROOM;
828 rte_mbuf_data_dma_addr_default(
const struct rte_mbuf *mb)
867 static inline char * __rte_experimental
884 static inline char * __rte_experimental
906 #ifdef ALLOW_EXPERIMENTAL_API
927 static inline void * __rte_experimental
940 #define RTE_MBUF_CLONED(mb) ((mb)->ol_flags & IND_ATTACHED_MBUF)
947 #define RTE_MBUF_HAS_EXTBUF(mb) ((mb)->ol_flags & EXT_ATTACHED_MBUF)
955 #define RTE_MBUF_DIRECT(mb) \
956 (!((mb)->ol_flags & (IND_ATTACHED_MBUF | EXT_ATTACHED_MBUF)))
969 #ifdef RTE_LIBRTE_MBUF_DEBUG
972 #define __rte_mbuf_sanity_check(m, is_h) rte_mbuf_sanity_check(m, is_h)
977 #define __rte_mbuf_sanity_check(m, is_h) do { } while (0)
981 #ifdef RTE_MBUF_REFCNT_ATOMIC
990 static inline uint16_t
1010 static inline uint16_t
1011 __rte_mbuf_refcnt_update(
struct rte_mbuf *m, int16_t value)
1025 static inline uint16_t
1038 return (uint16_t)value;
1041 return __rte_mbuf_refcnt_update(m, value);
1047 static inline uint16_t
1048 __rte_mbuf_refcnt_update(
struct rte_mbuf *m, int16_t value)
1057 static inline uint16_t
1060 return __rte_mbuf_refcnt_update(m, value);
1066 static inline uint16_t
1091 static inline uint16_t
1123 static inline uint16_t
1130 return (uint16_t)value;
1137 #define RTE_MBUF_PREFETCH_TO_FREE(m) do { \
1179 const char **reason);
1181 #define MBUF_RAW_ALLOC_CHECK(m) do { \
1182 RTE_ASSERT(rte_mbuf_refcnt_read(m) == 1); \
1183 RTE_ASSERT((m)->next == NULL); \
1184 RTE_ASSERT((m)->nb_segs == 1); \
1185 __rte_mbuf_sanity_check(m, 0); \
1213 MBUF_RAW_ALLOC_CHECK(m);
1236 RTE_ASSERT(m->
next == NULL);
1262 void *m,
unsigned i);
1320 unsigned cache_size, uint16_t priv_size, uint16_t data_room_size,
1362 unsigned int cache_size, uint16_t priv_size, uint16_t data_room_size,
1376 static inline uint16_t
1397 static inline uint16_t
1416 m->data_off = (uint16_t)
RTE_MIN((uint16_t)RTE_PKTMBUF_HEADROOM,
1428 #define MBUF_INVALID_PORT UINT16_MAX
1430 static inline void rte_pktmbuf_reset(
struct rte_mbuf *m)
1465 rte_pktmbuf_reset(m);
1484 struct rte_mbuf **mbufs,
unsigned count)
1498 switch (count % 4) {
1500 while (idx != count) {
1501 MBUF_RAW_ALLOC_CHECK(mbufs[idx]);
1502 rte_pktmbuf_reset(mbufs[idx]);
1506 MBUF_RAW_ALLOC_CHECK(mbufs[idx]);
1507 rte_pktmbuf_reset(mbufs[idx]);
1511 MBUF_RAW_ALLOC_CHECK(mbufs[idx]);
1512 rte_pktmbuf_reset(mbufs[idx]);
1516 MBUF_RAW_ALLOC_CHECK(mbufs[idx]);
1517 rte_pktmbuf_reset(mbufs[idx]);
1567 if (addr <= buf_addr)
1642 RTE_ASSERT(shinfo->
free_cb != NULL);
1645 m->buf_iova = buf_iova;
1662 #define rte_pktmbuf_detach_extbuf(m) rte_pktmbuf_detach(m)
1701 mi->buf_iova = m->buf_iova;
1705 mi->data_off = m->data_off;
1731 __rte_pktmbuf_free_extbuf(
struct rte_mbuf *m)
1734 RTE_ASSERT(m->
shinfo != NULL);
1747 __rte_pktmbuf_free_direct(
struct rte_mbuf *m)
1779 uint32_t mbuf_size, buf_len;
1783 __rte_pktmbuf_free_extbuf(m);
1785 __rte_pktmbuf_free_direct(m);
1788 mbuf_size = (uint32_t)(
sizeof(
struct rte_mbuf) + priv_size);
1792 m->
buf_addr = (
char *)m + mbuf_size;
1794 m->
buf_len = (uint16_t)buf_len;
1824 if (m->
next != NULL) {
1831 }
else if (__rte_mbuf_refcnt_update(m, -1) == 0) {
1836 if (m->
next != NULL) {
1924 }
while ((md = md->
next) != NULL &&
1958 }
while ((m = m->
next) != NULL);
2001 while (m->
next != NULL)
2020 #define rte_pktmbuf_mtod_offset(m, t, o) \
2021 ((t)((char *)(m)->buf_addr + (m)->data_off + (o)))
2035 #define rte_pktmbuf_mtod(m, t) rte_pktmbuf_mtod_offset(m, t, 0)
2046 #define rte_pktmbuf_iova_offset(m, o) \
2047 (rte_iova_t)((m)->buf_iova + (m)->data_off + (o))
2050 #define rte_pktmbuf_mtophys_offset(m, o) \
2051 rte_pktmbuf_iova_offset(m, o)
2060 #define rte_pktmbuf_iova(m) rte_pktmbuf_iova_offset(m, 0)
2063 #define rte_pktmbuf_mtophys(m) rte_pktmbuf_iova(m)
2073 #define rte_pktmbuf_pkt_len(m) ((m)->pkt_len)
2083 #define rte_pktmbuf_data_len(m) ((m)->data_len)
2111 m->data_off = (uint16_t)(m->data_off - len);
2115 return (
char *)m->
buf_addr + m->data_off;
2147 return (
char*) tail;
2175 m->data_off = (uint16_t)(m->data_off + len);
2177 return (
char *)m->
buf_addr + m->data_off;
2227 const void *__rte_pktmbuf_read(
const struct rte_mbuf *m, uint32_t off,
2228 uint32_t len,
void *buf);
2251 uint32_t off, uint32_t len,
void *buf)
2256 return __rte_pktmbuf_read(m, off, len, buf);
2285 cur_tail->
next = tail;
2325 rte_mbuf_tx_offload(uint64_t il2, uint64_t il3, uint64_t il4, uint64_t tso,
2326 uint64_t ol3, uint64_t ol2, uint64_t unused)
2328 return il2 << RTE_MBUF_L2_LEN_OFS |
2329 il3 << RTE_MBUF_L3_LEN_OFS |
2330 il4 << RTE_MBUF_L4_LEN_OFS |
2331 tso << RTE_MBUF_TSO_SEGSZ_OFS |
2332 ol3 << RTE_MBUF_OUTL3_LEN_OFS |
2333 ol2 << RTE_MBUF_OUTL2_LEN_OFS |
2334 unused << RTE_MBUF_TXOFLD_UNUSED_OFS;
2369 !(ol_flags & PKT_TX_IP_CKSUM)))
2395 size_t seg_len, copy_len;
2450 static inline uint32_t
2453 return m->hash.sched.queue_id;
2459 static inline uint8_t
2462 return m->hash.sched.traffic_class;
2468 static inline uint8_t
2471 return m->hash.sched.color;
2488 uint8_t *traffic_class,
2495 *color = sched.
color;
2522 m->hash.sched.color =
color;