mbuf: extend flow director field
[dpdk.git] / lib / librte_mbuf / rte_mbuf.h
index 5fb0951..5899e5c 100644 (file)
@@ -77,7 +77,7 @@ extern "C" {
  */
 #define PKT_RX_VLAN_PKT      (1ULL << 0)  /**< RX packet is a 802.1q VLAN packet. */
 #define PKT_RX_RSS_HASH      (1ULL << 1)  /**< RX packet with RSS hash result. */
-#define PKT_RX_FDIR          (1ULL << 2)  /**< RX packet with FDIR infos. */
+#define PKT_RX_FDIR          (1ULL << 2)  /**< RX packet with FDIR match indicate. */
 #define PKT_RX_L4_CKSUM_BAD  (1ULL << 3)  /**< L4 cksum of RX pkt. is not OK. */
 #define PKT_RX_IP_CKSUM_BAD  (1ULL << 4)  /**< IP cksum of RX pkt. is not OK. */
 #define PKT_RX_EIP_CKSUM_BAD (0ULL << 0)  /**< External IP header checksum error. */
@@ -91,9 +91,14 @@ extern "C" {
 #define PKT_RX_IPV6_HDR_EXT  (1ULL << 8)  /**< RX packet with extended IPv6 header. */
 #define PKT_RX_IEEE1588_PTP  (1ULL << 9)  /**< RX IEEE1588 L2 Ethernet PT Packet. */
 #define PKT_RX_IEEE1588_TMST (1ULL << 10) /**< RX IEEE1588 L2/L4 timestamped packet.*/
+#define PKT_RX_TUNNEL_IPV4_HDR (1ULL << 11) /**< RX tunnel packet with IPv4 header.*/
+#define PKT_RX_TUNNEL_IPV6_HDR (1ULL << 12) /**< RX tunnel packet with IPv6 header. */
+#define PKT_RX_FDIR_ID       (1ULL << 13) /**< FD id reported if FDIR match. */
+#define PKT_RX_FDIR_FLX      (1ULL << 14) /**< Flexible bytes reported if FDIR match. */
 
 #define PKT_TX_VLAN_PKT      (1ULL << 55) /**< TX packet is a 802.1q VLAN packet. */
 #define PKT_TX_IP_CKSUM      (1ULL << 54) /**< IP cksum of TX pkt. computed by NIC. */
+#define PKT_TX_VXLAN_CKSUM   (1ULL << 50) /**< TX checksum of VXLAN computed by NIC */
 #define PKT_TX_IPV4_CSUM     PKT_TX_IP_CKSUM /**< Alias of PKT_TX_IP_CKSUM. */
 #define PKT_TX_IPV4          PKT_RX_IPV4_HDR /**< IPv4 with no IP checksum offload. */
 #define PKT_TX_IPV6          PKT_RX_IPV6_HDR /**< IPv6 packet */
@@ -115,7 +120,7 @@ extern "C" {
 #define PKT_TX_IEEE1588_TMST (1ULL << 51) /**< TX IEEE1588 packet to timestamp. */
 
 /* Use final bit of flags to indicate a control mbuf */
-#define CTRL_MBUF_FLAG       (1ULL << 63)
+#define CTRL_MBUF_FLAG       (1ULL << 63) /**< Mbuf contains control data */
 
 /**
  * Bit Mask to indicate what bits required for building TX context
@@ -163,7 +168,14 @@ struct rte_mbuf {
 
        /* remaining bytes are set on RX when pulling packet from descriptor */
        MARKER rx_descriptor_fields1;
-       uint16_t reserved2;       /**< Unused field. Required for padding */
+
+       /**
+        * The packet type, which is used to indicate ordinary packet and also
+        * tunneled packet format, i.e. each number is represented a type of
+        * packet.
+        */
+       uint16_t packet_type;
+
        uint16_t data_len;        /**< Amount of data in segment buffer. */
        uint32_t pkt_len;         /**< Total pkt len: sum of all segments. */
        uint16_t vlan_tci;        /**< VLAN Tag Control Identifier (CPU order) */
@@ -171,10 +183,20 @@ struct rte_mbuf {
        union {
                uint32_t rss;     /**< RSS hash result if RSS enabled */
                struct {
-                       uint16_t hash;
-                       uint16_t id;
+                       union {
+                               struct {
+                                       uint16_t hash;
+                                       uint16_t id;
+                               };
+                               uint32_t lo;
+                               /**< Second 4 flexible bytes */
+                       };
+                       uint32_t hi;
+                       /**< First 4 flexible bytes or FD ID, dependent on
+                            PKT_RX_FDIR_* flag in ol_flags. */
                } fdir;           /**< Filter identifier if FDIR enabled */
                uint32_t sched;   /**< Hierarchical scheduler */
+               uint32_t usr;     /**< User defined tags. See @rte_distributor_process */
        } hash;                   /**< hash information */
 
        /* second cache line - fields only used in slow path or on TX */
@@ -196,6 +218,18 @@ struct rte_mbuf {
                        uint16_t l2_len:7;      /**< L2 (MAC) Header Length. */
                };
        };
+
+       /* fields for TX offloading of tunnels */
+       union {
+               uint16_t inner_l2_l3_len;
+               /**< combined inner l2/l3 lengths as single var */
+               struct {
+                       uint16_t inner_l3_len:9;
+                       /**< inner L3 (IP) Header Length. */
+                       uint16_t inner_l2_len:7;
+                       /**< inner L2 (MAC) Header Length. */
+               };
+       };
 } __rte_cache_aligned;
 
 /**
@@ -546,11 +580,13 @@ static inline void rte_pktmbuf_reset(struct rte_mbuf *m)
        m->next = NULL;
        m->pkt_len = 0;
        m->l2_l3_len = 0;
+       m->inner_l2_l3_len = 0;
        m->vlan_tci = 0;
        m->nb_segs = 1;
        m->port = 0xff;
 
        m->ol_flags = 0;
+       m->packet_type = 0;
        m->data_off = (RTE_PKTMBUF_HEADROOM <= m->buf_len) ?
                        RTE_PKTMBUF_HEADROOM : m->buf_len;
 
@@ -614,12 +650,14 @@ static inline void rte_pktmbuf_attach(struct rte_mbuf *mi, struct rte_mbuf *md)
        mi->port = md->port;
        mi->vlan_tci = md->vlan_tci;
        mi->l2_l3_len = md->l2_l3_len;
+       mi->inner_l2_l3_len = md->inner_l2_l3_len;
        mi->hash = md->hash;
 
        mi->next = NULL;
        mi->pkt_len = mi->data_len;
        mi->nb_segs = 1;
        mi->ol_flags = md->ol_flags;
+       mi->packet_type = md->packet_type;
 
        __rte_mbuf_sanity_check(mi, 1);
        __rte_mbuf_sanity_check(md, 0);