mbuf: increase port initialization value
[dpdk.git] / lib / librte_mbuf / rte_mbuf.h
index 4ef27f9..cc38040 100644 (file)
@@ -184,6 +184,11 @@ extern "C" {
  */
 #define PKT_RX_LRO           (1ULL << 16)
 
+/**
+ * Indicate that the timestamp field in the mbuf is valid.
+ */
+#define PKT_RX_TIMESTAMP     (1ULL << 17)
+
 /* add new RX flags here */
 
 /* add new TX flags here */
@@ -203,6 +208,8 @@ extern "C" {
 #define PKT_TX_TUNNEL_GRE     (0x2ULL << 45)
 #define PKT_TX_TUNNEL_IPIP    (0x3ULL << 45)
 #define PKT_TX_TUNNEL_GENEVE  (0x4ULL << 45)
+/**< TX packet with MPLS-in-UDP RFC 7510 header. */
+#define PKT_TX_TUNNEL_MPLSINUDP (0x5ULL << 45)
 /* add new TX TUNNEL type here */
 #define PKT_TX_TUNNEL_MASK    (0xFULL << 45)
 
@@ -398,14 +405,21 @@ struct rte_mbuf {
        MARKER cacheline0;
 
        void *buf_addr;           /**< Virtual address of segment buffer. */
-       phys_addr_t buf_physaddr; /**< Physical address of segment buffer. */
+       /**
+        * Physical address of segment buffer.
+        * Force alignment to 8-bytes, so as to ensure we have the exact
+        * same mbuf cacheline0 layout for 32-bit and 64-bit. This makes
+        * working on vector drivers easier.
+        */
+       phys_addr_t buf_physaddr __rte_aligned(sizeof(phys_addr_t));
 
-       /* next 6 bytes are initialised on RX descriptor rearm */
+       /* next 8 bytes are initialised on RX descriptor rearm */
        MARKER64 rearm_data;
        uint16_t data_off;
 
        /**
-        * 16-bit Reference counter.
+        * Reference counter. Its size should at least equal to the size
+        * of port field (16 bits), to support zero-copy broadcast.
         * It should only be accessed using the following functions:
         * rte_mbuf_refcnt_update(), rte_mbuf_refcnt_read(), and
         * rte_mbuf_refcnt_set(). The functionality of these functions (atomic,
@@ -417,9 +431,10 @@ struct rte_mbuf {
                rte_atomic16_t refcnt_atomic; /**< Atomically accessed refcnt */
                uint16_t refcnt;              /**< Non-atomically accessed refcnt */
        };
-       uint8_t nb_segs;          /**< Number of segments. */
-       uint8_t port;             /**< Input port. */
-       uint16_t pad;             /**< 2B pad for naturally aligned ol_flags */
+       uint16_t nb_segs;         /**< Number of segments. */
+
+       /** Input port (16 bits to support more than 256 virtual ports). */
+       uint16_t port;
 
        uint64_t ol_flags;        /**< Offload features. */
 
@@ -475,12 +490,16 @@ struct rte_mbuf {
                uint32_t usr;     /**< User defined tags. See rte_distributor_process() */
        } hash;                   /**< hash information */
 
-       uint32_t seqn; /**< Sequence number. See also rte_reorder_insert() */
-
        /** Outer VLAN TCI (CPU order), valid if PKT_RX_QINQ_STRIPPED is set. */
        uint16_t vlan_tci_outer;
 
        uint16_t buf_len;         /**< Length of segment buffer. */
+
+       /** Valid if PKT_RX_TIMESTAMP is set. The unit and time reference
+        * are not normalized but are always the same for a given port.
+        */
+       uint64_t timestamp;
+
        /* second cache line - fields only used in slow path or on TX */
        MARKER cacheline1 __rte_cache_min_aligned;
 
@@ -521,6 +540,10 @@ struct rte_mbuf {
 
        /** Timesync flags for use with IEEE1588. */
        uint16_t timesync;
+
+       /** Sequence number. See also rte_reorder_insert(). */
+       uint32_t seqn;
+
 } __rte_cache_aligned;
 
 /**
@@ -767,6 +790,13 @@ rte_mbuf_refcnt_set(struct rte_mbuf *m, uint16_t new_value)
 void
 rte_mbuf_sanity_check(const struct rte_mbuf *m, int is_header);
 
+#define MBUF_RAW_ALLOC_CHECK(m) do {                           \
+       RTE_ASSERT(rte_mbuf_refcnt_read(m) == 1);               \
+       RTE_ASSERT((m)->next == NULL);                          \
+       RTE_ASSERT((m)->nb_segs == 1);                          \
+       __rte_mbuf_sanity_check(m, 0);                          \
+} while (0)
+
 /**
  * Allocate an unitialized mbuf from mempool *mp*.
  *
@@ -794,11 +824,7 @@ static inline struct rte_mbuf *rte_mbuf_raw_alloc(struct rte_mempool *mp)
        if (rte_mempool_get(mp, &mb) < 0)
                return NULL;
        m = (struct rte_mbuf *)mb;
-       RTE_ASSERT(rte_mbuf_refcnt_read(m) == 1);
-       RTE_ASSERT(m->next == NULL);
-       RTE_ASSERT(m->nb_segs == 1);
-       __rte_mbuf_sanity_check(m, 0);
-
+       MBUF_RAW_ALLOC_CHECK(m);
        return m;
 }
 
@@ -816,7 +842,7 @@ static inline struct rte_mbuf *rte_mbuf_raw_alloc(struct rte_mempool *mp)
  * @param m
  *   The mbuf to be freed.
  */
-static inline void __attribute__((always_inline))
+static __rte_always_inline void
 rte_mbuf_raw_free(struct rte_mbuf *m)
 {
        RTE_ASSERT(RTE_MBUF_DIRECT(m));
@@ -1061,6 +1087,8 @@ static inline void rte_pktmbuf_reset_headroom(struct rte_mbuf *m)
  * @param m
  *   The packet mbuf to be resetted.
  */
+#define MBUF_INVALID_PORT UINT16_MAX
+
 static inline void rte_pktmbuf_reset(struct rte_mbuf *m)
 {
        m->next = NULL;
@@ -1069,7 +1097,7 @@ static inline void rte_pktmbuf_reset(struct rte_mbuf *m)
        m->vlan_tci = 0;
        m->vlan_tci_outer = 0;
        m->nb_segs = 1;
-       m->port = 0xff;
+       m->port = MBUF_INVALID_PORT;
 
        m->ol_flags = 0;
        m->packet_type = 0;
@@ -1112,6 +1140,7 @@ static inline struct rte_mbuf *rte_pktmbuf_alloc(struct rte_mempool *mp)
  *    Array size
  *  @return
  *   - 0: Success
+ *   - -ENOENT: Not enough entries in the mempool; no mbufs are retrieved.
  */
 static inline int rte_pktmbuf_alloc_bulk(struct rte_mempool *pool,
         struct rte_mbuf **mbufs, unsigned count)
@@ -1131,25 +1160,25 @@ static inline int rte_pktmbuf_alloc_bulk(struct rte_mempool *pool,
        switch (count % 4) {
        case 0:
                while (idx != count) {
-                       RTE_ASSERT(rte_mbuf_refcnt_read(mbufs[idx]) == 0);
-                       rte_mbuf_refcnt_set(mbufs[idx], 1);
+                       MBUF_RAW_ALLOC_CHECK(mbufs[idx]);
                        rte_pktmbuf_reset(mbufs[idx]);
                        idx++;
+                       /* fall-through */
        case 3:
-                       RTE_ASSERT(rte_mbuf_refcnt_read(mbufs[idx]) == 0);
-                       rte_mbuf_refcnt_set(mbufs[idx], 1);
+                       MBUF_RAW_ALLOC_CHECK(mbufs[idx]);
                        rte_pktmbuf_reset(mbufs[idx]);
                        idx++;
+                       /* fall-through */
        case 2:
-                       RTE_ASSERT(rte_mbuf_refcnt_read(mbufs[idx]) == 0);
-                       rte_mbuf_refcnt_set(mbufs[idx], 1);
+                       MBUF_RAW_ALLOC_CHECK(mbufs[idx]);
                        rte_pktmbuf_reset(mbufs[idx]);
                        idx++;
+                       /* fall-through */
        case 1:
-                       RTE_ASSERT(rte_mbuf_refcnt_read(mbufs[idx]) == 0);
-                       rte_mbuf_refcnt_set(mbufs[idx], 1);
+                       MBUF_RAW_ALLOC_CHECK(mbufs[idx]);
                        rte_pktmbuf_reset(mbufs[idx]);
                        idx++;
+                       /* fall-through */
                }
        }
        return 0;
@@ -1204,6 +1233,7 @@ static inline void rte_pktmbuf_attach(struct rte_mbuf *mi, struct rte_mbuf *m)
        mi->nb_segs = 1;
        mi->ol_flags = m->ol_flags | IND_ATTACHED_MBUF;
        mi->packet_type = m->packet_type;
+       mi->timestamp = m->timestamp;
 
        __rte_mbuf_sanity_check(mi, 1);
        __rte_mbuf_sanity_check(m, 0);
@@ -1262,8 +1292,7 @@ static inline void rte_pktmbuf_detach(struct rte_mbuf *m)
  *   - (m) if it is the last reference. It can be recycled or freed.
  *   - (NULL) if the mbuf still has remaining references on it.
  */
-__attribute__((always_inline))
-static inline struct rte_mbuf *
+static __rte_always_inline struct rte_mbuf *
 rte_pktmbuf_prefree_seg(struct rte_mbuf *m)
 {
        __rte_mbuf_sanity_check(m, 0);
@@ -1314,7 +1343,7 @@ __rte_pktmbuf_prefree_seg(struct rte_mbuf *m)
  * @param m
  *   The packet mbuf segment to be freed.
  */
-static inline void __attribute__((always_inline))
+static __rte_always_inline void
 rte_pktmbuf_free_seg(struct rte_mbuf *m)
 {
        m = rte_pktmbuf_prefree_seg(m);
@@ -1428,7 +1457,7 @@ static inline void rte_pktmbuf_refcnt_update(struct rte_mbuf *m, int16_t v)
  */
 static inline uint16_t rte_pktmbuf_headroom(const struct rte_mbuf *m)
 {
-       __rte_mbuf_sanity_check(m, 1);
+       __rte_mbuf_sanity_check(m, 0);
        return m->data_off;
 }
 
@@ -1442,7 +1471,7 @@ static inline uint16_t rte_pktmbuf_headroom(const struct rte_mbuf *m)
  */
 static inline uint16_t rte_pktmbuf_tailroom(const struct rte_mbuf *m)
 {
-       __rte_mbuf_sanity_check(m, 1);
+       __rte_mbuf_sanity_check(m, 0);
        return (uint16_t)(m->buf_len - rte_pktmbuf_headroom(m) -
                          m->data_len);
 }