mbuf: add Tx side tunneling type
[dpdk.git] / lib / librte_mbuf / rte_mbuf.h
index 23b7bf8..002e86b 100644 (file)
@@ -128,6 +128,18 @@ extern "C" {
 
 /* add new TX flags here */
 
+/**
+ * Bits 45:48 used for the tunnel type.
+ * When doing Tx offload like TSO or checksum, the HW needs to configure the
+ * tunnel type into the HW descriptors.
+ */
+#define PKT_TX_TUNNEL_VXLAN   (0x1ULL << 45)
+#define PKT_TX_TUNNEL_GRE     (0x2ULL << 45)
+#define PKT_TX_TUNNEL_IPIP    (0x3ULL << 45)
+#define PKT_TX_TUNNEL_GENEVE  (0x4ULL << 45)
+/* add new TX TUNNEL type here */
+#define PKT_TX_TUNNEL_MASK    (0xFULL << 45)
+
 /**
  * Second VLAN insertion (QinQ) flag.
  */
@@ -872,7 +884,10 @@ struct rte_mbuf {
                uint64_t tx_offload;       /**< combined for easy fetch */
                __extension__
                struct {
-                       uint64_t l2_len:7; /**< L2 (MAC) Header Length. */
+                       uint64_t l2_len:7;
+                       /**< L2 (MAC) Header Length for non-tunneling pkt.
+                        * Outer_L4_len + ... + Inner_L2_len for tunneling pkt.
+                        */
                        uint64_t l3_len:9; /**< L3 (IP) Header Length. */
                        uint64_t l4_len:8; /**< L4 (TCP/UDP) Header Length. */
                        uint64_t tso_segsz:16; /**< TCP TSO segment size */
@@ -1386,6 +1401,19 @@ rte_pktmbuf_priv_size(struct rte_mempool *mp)
        return mbp_priv->mbuf_priv_size;
 }
 
+/**
+ * Reset the data_off field of a packet mbuf to its default value.
+ *
+ * The given mbuf must have only one segment, which should be empty.
+ *
+ * @param m
+ *   The packet mbuf's data_off field has to be reset.
+ */
+static inline void rte_pktmbuf_reset_headroom(struct rte_mbuf *m)
+{
+       m->data_off = RTE_MIN(RTE_PKTMBUF_HEADROOM, (uint16_t)m->buf_len);
+}
+
 /**
  * Reset the fields of a packet mbuf to their default values.
  *
@@ -1406,8 +1434,7 @@ static inline void rte_pktmbuf_reset(struct rte_mbuf *m)
 
        m->ol_flags = 0;
        m->packet_type = 0;
-       m->data_off = (RTE_PKTMBUF_HEADROOM <= m->buf_len) ?
-                       RTE_PKTMBUF_HEADROOM : m->buf_len;
+       rte_pktmbuf_reset_headroom(m);
 
        m->data_len = 0;
        __rte_mbuf_sanity_check(m, 1);
@@ -1571,7 +1598,7 @@ static inline void rte_pktmbuf_detach(struct rte_mbuf *m)
        m->buf_addr = (char *)m + mbuf_size;
        m->buf_physaddr = rte_mempool_virt2phy(mp, m) + mbuf_size;
        m->buf_len = (uint16_t)buf_len;
-       m->data_off = RTE_MIN(RTE_PKTMBUF_HEADROOM, (uint16_t)m->buf_len);
+       rte_pktmbuf_reset_headroom(m);
        m->data_len = 0;
        m->ol_flags = 0;