mbuf: add fields for tunnels
authorJijiang Liu <jijiang.liu@intel.com>
Thu, 23 Oct 2014 13:18:51 +0000 (21:18 +0800)
committerThomas Monjalon <thomas.monjalon@6wind.com>
Mon, 27 Oct 2014 10:43:51 +0000 (11:43 +0100)
Replace the "reserved2" field with the "packet_type" field
and add the "inner_l2_l3_len" field in the rte_mbuf structure.
The "packet_type" field is used to indicate ordinary packet format and also
tunneling packet format such as IP in IP, IP in GRE, MAC in GRE and MAC in UDP.
The "inner_l2_len" and the "inner_l3_len" fields are added
in the second cache line, they use 2 bytes for TX offloading of tunnels.

Signed-off-by: Jijiang Liu <jijiang.liu@intel.com>
Acked-by: Helin Zhang <helin.zhang@intel.com>
Tested-by: Yong Liu <yong.liu@intel.com>
Acked-by: Thomas Monjalon <thomas.monjalon@6wind.com>
lib/librte_mbuf/rte_mbuf.h

index ddadc21..497d88b 100644 (file)
@@ -163,7 +163,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) */
@@ -196,6 +203,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 +565,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 +635,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);