Optimize and simplify packet parsing. Fill in L2 metadata
allways in packet input. Perform full packet parsing only
if other than L2 metadata is requested. Perform parsing only
for packets received from the network (disable parsing of
user created packets).

Signed-off-by: Petri Savolainen <petri.savolai...@nokia.com>
---
 .../linux-generic/include/odp_packet_internal.h    |  61 ++-----
 platform/linux-generic/odp_classification.c        |   4 +-
 platform/linux-generic/odp_packet.c                | 184 ++++++++++++++-------
 platform/linux-generic/odp_packet_flags.c          |  24 ++-
 platform/linux-generic/odp_pool.c                  |   3 -
 platform/linux-generic/pktio/loop.c                |   8 +-
 platform/linux-generic/pktio/netmap.c              |  10 +-
 platform/linux-generic/pktio/socket.c              |  10 +-
 platform/linux-generic/pktio/socket_mmap.c         |  11 +-
 9 files changed, 186 insertions(+), 129 deletions(-)

diff --git a/platform/linux-generic/include/odp_packet_internal.h 
b/platform/linux-generic/include/odp_packet_internal.h
index 8c41491..7c42bcb 100644
--- a/platform/linux-generic/include/odp_packet_internal.h
+++ b/platform/linux-generic/include/odp_packet_internal.h
@@ -36,7 +36,8 @@ typedef union {
        uint32_t all;
 
        struct {
-               uint32_t unparsed:1;  /**< Set to inticate parse needed */
+               uint32_t parsed_l2:1; /**< L2 parsed */
+               uint32_t parsed_all:1;/**< Parsing complite */
 
                uint32_t l2:1;        /**< known L2 protocol present */
                uint32_t l3:1;        /**< known L3 protocol present */
@@ -152,43 +153,6 @@ static inline odp_packet_hdr_t 
*odp_packet_hdr(odp_packet_t pkt)
        return (odp_packet_hdr_t *)odp_buf_to_hdr((odp_buffer_t)pkt);
 }
 
-/**
- * Initialize packet buffer
- */
-static inline void packet_init(pool_entry_t *pool,
-                              odp_packet_hdr_t *pkt_hdr,
-                              size_t size)
-{
-       /*
-       * Reset parser metadata.  Note that we clear via memset to make
-       * this routine indepenent of any additional adds to packet metadata.
-       */
-       const size_t start_offset = ODP_FIELD_SIZEOF(odp_packet_hdr_t, buf_hdr);
-       uint8_t *start;
-       size_t len;
-
-       start = (uint8_t *)pkt_hdr + start_offset;
-       len = sizeof(odp_packet_hdr_t) - start_offset;
-       memset(start, 0, len);
-
-       /* Set metadata items that initialize to non-zero values */
-       pkt_hdr->l2_offset = ODP_PACKET_OFFSET_INVALID;
-       pkt_hdr->l3_offset = ODP_PACKET_OFFSET_INVALID;
-       pkt_hdr->l4_offset = ODP_PACKET_OFFSET_INVALID;
-       pkt_hdr->payload_offset = ODP_PACKET_OFFSET_INVALID;
-
-       /*
-       * Packet headroom is set from the pool's headroom
-       * Packet tailroom is rounded up to fill the last
-       * segment occupied by the allocated length.
-       */
-       pkt_hdr->frame_len = size;
-       pkt_hdr->headroom  = pool->s.headroom;
-       pkt_hdr->tailroom  =
-               (pool->s.seg_size * pkt_hdr->buf_hdr.segcount) -
-               (pool->s.headroom + size);
-}
-
 static inline void copy_packet_parser_metadata(odp_packet_hdr_t *src_hdr,
                                               odp_packet_hdr_t *dst_hdr)
 {
@@ -250,12 +214,14 @@ static inline void packet_set_len(odp_packet_t pkt, 
uint32_t len)
        odp_packet_hdr(pkt)->frame_len = len;
 }
 
-#define ODP_PACKET_UNPARSED ~0
+static inline int packet_parse_l2_not_done(odp_packet_hdr_t *pkt_hdr)
+{
+       return !pkt_hdr->input_flags.parsed_l2;
+}
 
-static inline void _odp_packet_reset_parse(odp_packet_t pkt)
+static inline int packet_parse_not_complete(odp_packet_hdr_t *pkt_hdr)
 {
-       odp_packet_hdr_t *pkt_hdr = odp_packet_hdr(pkt);
-       pkt_hdr->input_flags.all = ODP_PACKET_UNPARSED;
+       return !pkt_hdr->input_flags.parsed_all;
 }
 
 /* Forward declarations */
@@ -265,9 +231,16 @@ int _odp_packet_copy_to_packet(odp_packet_t srcpkt, 
uint32_t srcoffset,
 
 void _odp_packet_copy_md_to_packet(odp_packet_t srcpkt, odp_packet_t dstpkt);
 
-odp_packet_t _odp_packet_alloc(odp_pool_t pool_hdl);
+odp_packet_t packet_alloc(odp_pool_t pool_hdl, uint32_t len, int parse);
 
-int _odp_packet_parse(odp_packet_hdr_t *pkt_hdr);
+/* Fill in parser metadata for L2 */
+void packet_parse_l2(odp_packet_hdr_t *pkt_hdr);
+
+/* Perform full packet parse */
+int packet_parse_full(odp_packet_hdr_t *pkt_hdr);
+
+/* Reset parser metadata for a new parse */
+void packet_parse_reset(odp_packet_t pkt);
 
 /* Convert a packet handle to a buffer handle */
 odp_buffer_t _odp_packet_to_buffer(odp_packet_t pkt);
diff --git a/platform/linux-generic/odp_classification.c 
b/platform/linux-generic/odp_classification.c
index fb1b019..28d1d50 100644
--- a/platform/linux-generic/odp_classification.c
+++ b/platform/linux-generic/odp_classification.c
@@ -829,8 +829,8 @@ cos_t *pktio_select_cos(pktio_entry_t *entry, uint8_t 
*pkt_addr,
        cls = &entry->s.cls;
 
        /* Check for lazy parse needed */
-       if (pkt_hdr->input_flags.unparsed)
-               _odp_packet_parse(pkt_hdr);
+       if (packet_parse_not_complete(pkt_hdr))
+               packet_parse_full(pkt_hdr);
 
        /* Return error cos for error packet */
        if (pkt_hdr->error_flags.all)
diff --git a/platform/linux-generic/odp_packet.c 
b/platform/linux-generic/odp_packet.c
index 5581cc4..002723f 100644
--- a/platform/linux-generic/odp_packet.c
+++ b/platform/linux-generic/odp_packet.c
@@ -25,8 +25,74 @@
  *
  */
 
-odp_packet_t odp_packet_alloc(odp_pool_t pool_hdl, uint32_t len)
+static inline void packet_parse_disable(odp_packet_hdr_t *pkt_hdr)
 {
+       pkt_hdr->input_flags.parsed_l2  = 1;
+       pkt_hdr->input_flags.parsed_all = 1;
+}
+
+void packet_parse_reset(odp_packet_t pkt)
+{
+       odp_packet_hdr_t *pkt_hdr = odp_packet_hdr(pkt);
+
+       /* Reset parser metadata before new parse */
+       pkt_hdr->error_flags.all  = 0;
+       pkt_hdr->input_flags.all  = 0;
+       pkt_hdr->output_flags.all = 0;
+       pkt_hdr->l2_offset        = ODP_PACKET_OFFSET_INVALID;
+       pkt_hdr->l3_offset        = ODP_PACKET_OFFSET_INVALID;
+       pkt_hdr->l4_offset        = ODP_PACKET_OFFSET_INVALID;
+       pkt_hdr->payload_offset   = ODP_PACKET_OFFSET_INVALID;
+       pkt_hdr->vlan_s_tag       = 0;
+       pkt_hdr->vlan_c_tag       = 0;
+       pkt_hdr->l3_protocol      = 0;
+       pkt_hdr->l4_protocol      = 0;
+}
+
+/**
+ * Initialize packet
+ */
+static void packet_init(pool_entry_t *pool, odp_packet_hdr_t *pkt_hdr,
+                       size_t size, int parse)
+{
+       /*
+       * Reset parser metadata.  Note that we clear via memset to make
+       * this routine indepenent of any additional adds to packet metadata.
+       */
+       const size_t start_offset = ODP_FIELD_SIZEOF(odp_packet_hdr_t, buf_hdr);
+       uint8_t *start;
+       size_t len;
+
+       start = (uint8_t *)pkt_hdr + start_offset;
+       len = sizeof(odp_packet_hdr_t) - start_offset;
+       memset(start, 0, len);
+
+       /* Set metadata items that initialize to non-zero values */
+       pkt_hdr->l2_offset = ODP_PACKET_OFFSET_INVALID;
+       pkt_hdr->l3_offset = ODP_PACKET_OFFSET_INVALID;
+       pkt_hdr->l4_offset = ODP_PACKET_OFFSET_INVALID;
+       pkt_hdr->payload_offset = ODP_PACKET_OFFSET_INVALID;
+
+       /* Disable lazy parsing on user allocated packets */
+       if (!parse)
+               packet_parse_disable(pkt_hdr);
+
+       /*
+       * Packet headroom is set from the pool's headroom
+       * Packet tailroom is rounded up to fill the last
+       * segment occupied by the allocated length.
+       */
+       pkt_hdr->frame_len = size;
+       pkt_hdr->headroom  = pool->s.headroom;
+       pkt_hdr->tailroom  =
+               (pool->s.seg_size * pkt_hdr->buf_hdr.segcount) -
+               (pool->s.headroom + size);
+}
+
+odp_packet_t packet_alloc(odp_pool_t pool_hdl, uint32_t len, int parse)
+{
+       odp_packet_t pkt;
+       odp_packet_hdr_t *pkt_hdr;
        pool_entry_t *pool = odp_pool_to_entry(pool_hdl);
 
        if (pool->s.params.type != ODP_POOL_PACKET)
@@ -34,17 +100,29 @@ odp_packet_t odp_packet_alloc(odp_pool_t pool_hdl, 
uint32_t len)
 
        /* Handle special case for zero-length packets */
        if (len == 0) {
-               odp_packet_t pkt =
-                       (odp_packet_t)buffer_alloc(pool_hdl,
-                                                  pool->s.params.buf.size);
-               if (pkt != ODP_PACKET_INVALID)
-                       pull_tail(odp_packet_hdr(pkt),
-                                 pool->s.params.buf.size);
+               pkt = (odp_packet_t)buffer_alloc(pool_hdl,
+                                                pool->s.params.buf.size);
+               if (pkt == ODP_PACKET_INVALID)
+                       return ODP_PACKET_INVALID;
 
-               return pkt;
+               pull_tail(odp_packet_hdr(pkt), pool->s.params.buf.size);
+       } else {
+               pkt = (odp_packet_t)buffer_alloc(pool_hdl, len);
+
+               if (pkt == ODP_PACKET_INVALID)
+                       return ODP_PACKET_INVALID;
        }
 
-       return (odp_packet_t)buffer_alloc(pool_hdl, len);
+       pkt_hdr = odp_packet_hdr(pkt);
+
+       packet_init(pool, pkt_hdr, len, parse);
+
+       return pkt;
+}
+
+odp_packet_t odp_packet_alloc(odp_pool_t pool_hdl, uint32_t len)
+{
+       return packet_alloc(pool_hdl, len, 0);
 }
 
 void odp_packet_free(odp_packet_t pkt)
@@ -61,7 +139,8 @@ int odp_packet_reset(odp_packet_t pkt, uint32_t len)
        if (totsize > pkt_hdr->buf_hdr.size)
                return -1;
 
-       packet_init(pool, pkt_hdr, len);
+       packet_init(pool, pkt_hdr, len, 0);
+
        return 0;
 }
 
@@ -242,16 +321,12 @@ uint32_t odp_packet_user_area_size(odp_packet_t pkt)
 void *odp_packet_l2_ptr(odp_packet_t pkt, uint32_t *len)
 {
        odp_packet_hdr_t *pkt_hdr = odp_packet_hdr(pkt);
-       if (pkt_hdr->input_flags.unparsed)
-               _odp_packet_parse(pkt_hdr);
        return packet_map(pkt_hdr, pkt_hdr->l2_offset, len);
 }
 
 uint32_t odp_packet_l2_offset(odp_packet_t pkt)
 {
        odp_packet_hdr_t *pkt_hdr = odp_packet_hdr(pkt);
-       if (pkt_hdr->input_flags.unparsed)
-               _odp_packet_parse(pkt_hdr);
        return pkt_hdr->l2_offset;
 }
 
@@ -262,8 +337,6 @@ int odp_packet_l2_offset_set(odp_packet_t pkt, uint32_t 
offset)
        if (offset >= pkt_hdr->frame_len)
                return -1;
 
-       if (pkt_hdr->input_flags.unparsed)
-               _odp_packet_parse(pkt_hdr);
        pkt_hdr->l2_offset = offset;
        return 0;
 }
@@ -271,16 +344,16 @@ int odp_packet_l2_offset_set(odp_packet_t pkt, uint32_t 
offset)
 void *odp_packet_l3_ptr(odp_packet_t pkt, uint32_t *len)
 {
        odp_packet_hdr_t *pkt_hdr = odp_packet_hdr(pkt);
-       if (pkt_hdr->input_flags.unparsed)
-               _odp_packet_parse(pkt_hdr);
+       if (packet_parse_not_complete(pkt_hdr))
+               packet_parse_full(pkt_hdr);
        return packet_map(pkt_hdr, pkt_hdr->l3_offset, len);
 }
 
 uint32_t odp_packet_l3_offset(odp_packet_t pkt)
 {
        odp_packet_hdr_t *pkt_hdr = odp_packet_hdr(pkt);
-       if (pkt_hdr->input_flags.unparsed)
-               _odp_packet_parse(pkt_hdr);
+       if (packet_parse_not_complete(pkt_hdr))
+               packet_parse_full(pkt_hdr);
        return pkt_hdr->l3_offset;
 }
 
@@ -291,8 +364,8 @@ int odp_packet_l3_offset_set(odp_packet_t pkt, uint32_t 
offset)
        if (offset >= pkt_hdr->frame_len)
                return -1;
 
-       if (pkt_hdr->input_flags.unparsed)
-               _odp_packet_parse(pkt_hdr);
+       if (packet_parse_not_complete(pkt_hdr))
+               packet_parse_full(pkt_hdr);
        pkt_hdr->l3_offset = offset;
        return 0;
 }
@@ -300,16 +373,16 @@ int odp_packet_l3_offset_set(odp_packet_t pkt, uint32_t 
offset)
 void *odp_packet_l4_ptr(odp_packet_t pkt, uint32_t *len)
 {
        odp_packet_hdr_t *pkt_hdr = odp_packet_hdr(pkt);
-       if (pkt_hdr->input_flags.unparsed)
-               _odp_packet_parse(pkt_hdr);
+       if (packet_parse_not_complete(pkt_hdr))
+               packet_parse_full(pkt_hdr);
        return packet_map(pkt_hdr, pkt_hdr->l4_offset, len);
 }
 
 uint32_t odp_packet_l4_offset(odp_packet_t pkt)
 {
        odp_packet_hdr_t *pkt_hdr = odp_packet_hdr(pkt);
-       if (pkt_hdr->input_flags.unparsed)
-               _odp_packet_parse(pkt_hdr);
+       if (packet_parse_not_complete(pkt_hdr))
+               packet_parse_full(pkt_hdr);
        return pkt_hdr->l4_offset;
 }
 
@@ -320,8 +393,8 @@ int odp_packet_l4_offset_set(odp_packet_t pkt, uint32_t 
offset)
        if (offset >= pkt_hdr->frame_len)
                return -1;
 
-       if (pkt_hdr->input_flags.unparsed)
-               _odp_packet_parse(pkt_hdr);
+       if (packet_parse_not_complete(pkt_hdr))
+               packet_parse_full(pkt_hdr);
        pkt_hdr->l4_offset = offset;
        return 0;
 }
@@ -684,17 +757,6 @@ int _odp_packet_copy_to_packet(odp_packet_t srcpkt, 
uint32_t srcoffset,
        return 0;
 }
 
-odp_packet_t _odp_packet_alloc(odp_pool_t pool_hdl)
-{
-       pool_entry_t *pool = odp_pool_to_entry(pool_hdl);
-
-       if (pool->s.params.type != ODP_POOL_PACKET)
-               return ODP_PACKET_INVALID;
-
-       return (odp_packet_t)buffer_alloc(pool_hdl,
-                                         pool->s.params.buf.size);
-}
-
 /**
  * Parser helper function for IPv4
  */
@@ -832,30 +894,13 @@ static inline void parse_udp(odp_packet_hdr_t *pkt_hdr,
 }
 
 /**
- * Simple packet parser
+ * Initialize L2 related parser flags and metadata
  */
-
-int _odp_packet_parse(odp_packet_hdr_t *pkt_hdr)
+void packet_parse_l2(odp_packet_hdr_t *pkt_hdr)
 {
-       odph_ethhdr_t *eth;
-       odph_vlanhdr_t *vlan;
-       uint16_t ethtype;
-       uint8_t *parseptr;
-       uint32_t offset, seglen;
-       uint8_t ip_proto = 0;
+       /* Packet alloc or reset have already init offsets and flags */
 
-       /* Reset parser metadata for new parse */
-       pkt_hdr->error_flags.all  = 0;
-       pkt_hdr->input_flags.all  = 0;
-       pkt_hdr->output_flags.all = 0;
-       pkt_hdr->l2_offset        = 0;
-       pkt_hdr->l3_offset        = ODP_PACKET_OFFSET_INVALID;
-       pkt_hdr->l4_offset        = ODP_PACKET_OFFSET_INVALID;
-       pkt_hdr->payload_offset   = ODP_PACKET_OFFSET_INVALID;
-       pkt_hdr->vlan_s_tag       = 0;
-       pkt_hdr->vlan_c_tag       = 0;
-       pkt_hdr->l3_protocol      = 0;
-       pkt_hdr->l4_protocol      = 0;
+       pkt_hdr->l2_offset = 0;
 
        /* We only support Ethernet for now */
        pkt_hdr->input_flags.eth = 1;
@@ -867,6 +912,24 @@ int _odp_packet_parse(odp_packet_hdr_t *pkt_hdr)
        /* Assume valid L2 header, no CRC/FCS check in SW */
        pkt_hdr->input_flags.l2 = 1;
 
+       pkt_hdr->input_flags.parsed_l2 = 1;
+}
+
+/**
+ * Simple packet parser
+ */
+int packet_parse_full(odp_packet_hdr_t *pkt_hdr)
+{
+       odph_ethhdr_t *eth;
+       odph_vlanhdr_t *vlan;
+       uint16_t ethtype;
+       uint8_t *parseptr;
+       uint32_t offset, seglen;
+       uint8_t ip_proto = 0;
+
+       if (packet_parse_l2_not_done(pkt_hdr))
+               packet_parse_l2(pkt_hdr);
+
        eth = (odph_ethhdr_t *)packet_map(pkt_hdr, 0, &seglen);
        offset = sizeof(odph_ethhdr_t);
        parseptr = (uint8_t *)&eth->type;
@@ -978,5 +1041,6 @@ int _odp_packet_parse(odp_packet_hdr_t *pkt_hdr)
        pkt_hdr->payload_offset = offset;
 
 parse_exit:
+       pkt_hdr->input_flags.parsed_all = 1;
        return pkt_hdr->error_flags.all != 0;
 }
diff --git a/platform/linux-generic/odp_packet_flags.c 
b/platform/linux-generic/odp_packet_flags.c
index 4f680a1..41d6fdc 100644
--- a/platform/linux-generic/odp_packet_flags.c
+++ b/platform/linux-generic/odp_packet_flags.c
@@ -9,23 +9,23 @@
 
 #define retflag(p, x) do {                            \
        odp_packet_hdr_t *pkt_hdr = odp_packet_hdr(p); \
-       if (pkt_hdr->input_flags.unparsed)             \
-               _odp_packet_parse(pkt_hdr);            \
+       if (packet_parse_not_complete(pkt_hdr))        \
+               packet_parse_full(pkt_hdr);            \
        return pkt_hdr->x;                             \
        } while (0)
 
 #define setflag(p, x, v) do {                         \
        odp_packet_hdr_t *pkt_hdr = odp_packet_hdr(p); \
-       if (pkt_hdr->input_flags.unparsed)             \
-               _odp_packet_parse(pkt_hdr);            \
+       if (packet_parse_not_complete(pkt_hdr))        \
+               packet_parse_full(pkt_hdr);            \
        pkt_hdr->x = v & 1;                            \
        } while (0)
 
 int odp_packet_has_error(odp_packet_t pkt)
 {
        odp_packet_hdr_t *pkt_hdr = odp_packet_hdr(pkt);
-       if (pkt_hdr->input_flags.unparsed)
-               _odp_packet_parse(pkt_hdr);
+       if (packet_parse_not_complete(pkt_hdr))
+               packet_parse_full(pkt_hdr);
        return odp_packet_hdr(pkt)->error_flags.all != 0;
 }
 
@@ -33,7 +33,9 @@ int odp_packet_has_error(odp_packet_t pkt)
 
 int odp_packet_has_l2(odp_packet_t pkt)
 {
-       retflag(pkt, input_flags.l2);
+       odp_packet_hdr_t *pkt_hdr = odp_packet_hdr(pkt);
+
+       return pkt_hdr->input_flags.l2;
 }
 
 int odp_packet_has_l3(odp_packet_t pkt)
@@ -48,12 +50,16 @@ int odp_packet_has_l4(odp_packet_t pkt)
 
 int odp_packet_has_eth(odp_packet_t pkt)
 {
-       retflag(pkt, input_flags.eth);
+       odp_packet_hdr_t *pkt_hdr = odp_packet_hdr(pkt);
+
+       return pkt_hdr->input_flags.eth;
 }
 
 int odp_packet_has_jumbo(odp_packet_t pkt)
 {
-       retflag(pkt, input_flags.jumbo);
+       odp_packet_hdr_t *pkt_hdr = odp_packet_hdr(pkt);
+
+       return pkt_hdr->input_flags.jumbo;
 }
 
 int odp_packet_has_vlan(odp_packet_t pkt)
diff --git a/platform/linux-generic/odp_pool.c 
b/platform/linux-generic/odp_pool.c
index 30d4b2b..5bf2474 100644
--- a/platform/linux-generic/odp_pool.c
+++ b/platform/linux-generic/odp_pool.c
@@ -517,9 +517,6 @@ odp_buffer_t buffer_alloc(odp_pool_t pool_hdl, size_t size)
        /* By default, buffers are not associated with an ordered queue */
        buf->buf.origin_qe = NULL;
 
-       if (buf->buf.type == ODP_EVENT_PACKET)
-               packet_init(pool, &buf->pkt, size);
-
        return odp_hdr_to_buf(&buf->buf);
 }
 
diff --git a/platform/linux-generic/pktio/loop.c 
b/platform/linux-generic/pktio/loop.c
index 22f0475..2b1653e 100644
--- a/platform/linux-generic/pktio/loop.c
+++ b/platform/linux-generic/pktio/loop.c
@@ -55,13 +55,19 @@ static int loopback_recv(pktio_entry_t *pktio_entry, 
odp_packet_t pkts[],
        int nbr, i;
        odp_buffer_hdr_t *hdr_tbl[QUEUE_MULTI_MAX];
        queue_entry_t *qentry;
+       odp_packet_hdr_t *pkt_hdr;
 
        qentry = queue_to_qentry(pktio_entry->s.pkt_loop.loopq);
        nbr = queue_deq_multi(qentry, hdr_tbl, len);
 
        for (i = 0; i < nbr; ++i) {
                pkts[i] = _odp_packet_from_buffer(odp_hdr_to_buf(hdr_tbl[i]));
-               _odp_packet_reset_parse(pkts[i]);
+               packet_parse_reset(pkts[i]);
+
+               pkt_hdr = odp_packet_hdr(pkts[i]);
+
+               /* Fill in L2 metadata and flags */
+               packet_parse_l2(pkt_hdr);
        }
 
        return nbr;
diff --git a/platform/linux-generic/pktio/netmap.c 
b/platform/linux-generic/pktio/netmap.c
index 54e7043..a63d9de 100644
--- a/platform/linux-generic/pktio/netmap.c
+++ b/platform/linux-generic/pktio/netmap.c
@@ -180,6 +180,7 @@ static void netmap_recv_cb(u_char *arg, const struct 
nm_pkthdr *hdr,
        struct dispatch_args *args = (struct dispatch_args *)arg;
        pkt_netmap_t *pkt_nm = &args->pktio_entry->s.pkt_nm;
        odp_packet_t pkt;
+       odp_packet_hdr_t *pkt_hdr;
        size_t frame_len = (size_t)hdr->len;
 
        if (odp_unlikely(frame_len > pkt_nm->max_frame_len)) {
@@ -193,10 +194,15 @@ static void netmap_recv_cb(u_char *arg, const struct 
nm_pkthdr *hdr,
                return;
        }
 
-       pkt = odp_packet_alloc(pkt_nm->pool, frame_len);
+       pkt = packet_alloc(pkt_nm->pool, frame_len, 1);
        if (pkt == ODP_PACKET_INVALID)
                return;
 
+       pkt_hdr = odp_packet_hdr(pkt);
+
+       /* Fill in L2 metadata and flags */
+       packet_parse_l2(pkt_hdr);
+
        /* For now copy the data in the mbuf,
           worry about zero-copy later */
        if (odp_packet_copydata_in(pkt, 0, frame_len, buf) != 0) {
@@ -204,8 +210,6 @@ static void netmap_recv_cb(u_char *arg, const struct 
nm_pkthdr *hdr,
                return;
        }
 
-       _odp_packet_reset_parse(pkt);
-
        args->pkt_table[args->nb_rx++] = pkt;
 }
 
diff --git a/platform/linux-generic/pktio/socket.c 
b/platform/linux-generic/pktio/socket.c
index a95b9a8..e8f2ef6 100644
--- a/platform/linux-generic/pktio/socket.c
+++ b/platform/linux-generic/pktio/socket.c
@@ -322,7 +322,7 @@ static int sock_mmsg_recv(pktio_entry_t *pktio_entry,
        memset(msgvec, 0, sizeof(msgvec));
 
        for (i = 0; i < (int)len; i++) {
-               pkt_table[i] = _odp_packet_alloc(pkt_sock->pool);
+               pkt_table[i] = packet_alloc(pkt_sock->pool, 0 /*default*/, 1);
                if (odp_unlikely(pkt_table[i] == ODP_PACKET_INVALID))
                        break;
 
@@ -336,6 +336,7 @@ static int sock_mmsg_recv(pktio_entry_t *pktio_entry,
        recv_msgs = recvmmsg(sockfd, msgvec, msgvec_len, MSG_DONTWAIT, NULL);
 
        for (i = 0; i < recv_msgs; i++) {
+               odp_packet_hdr_t *pkt_hdr;
                void *base = msgvec[i].msg_hdr.msg_iov->iov_base;
                struct ethhdr *eth_hdr = base;
 
@@ -346,11 +347,14 @@ static int sock_mmsg_recv(pktio_entry_t *pktio_entry,
                        continue;
                }
 
-               /* Parse and set packet header data */
+               pkt_hdr = odp_packet_hdr(pkt_table[i]);
+
+               /* Fill in L2 metadata and flags */
+               packet_parse_l2(pkt_hdr);
+
                odp_packet_pull_tail(pkt_table[i],
                                     odp_packet_len(pkt_table[i]) -
                                     msgvec[i].msg_len);
-               _odp_packet_reset_parse(pkt_table[i]);
 
                pkt_table[nb_rx] = pkt_table[i];
                nb_rx++;
diff --git a/platform/linux-generic/pktio/socket_mmap.c 
b/platform/linux-generic/pktio/socket_mmap.c
index ba773a3..c20d645 100644
--- a/platform/linux-generic/pktio/socket_mmap.c
+++ b/platform/linux-generic/pktio/socket_mmap.c
@@ -118,6 +118,7 @@ static inline unsigned pkt_mmap_v2_rx(int sock, struct ring 
*ring,
        uint8_t *pkt_buf;
        int pkt_len;
        struct ethhdr *eth_hdr;
+       odp_packet_hdr_t *pkt_hdr;
        unsigned i = 0;
 
        (void)sock;
@@ -142,10 +143,15 @@ static inline unsigned pkt_mmap_v2_rx(int sock, struct 
ring *ring,
                                continue;
                        }
 
-                       pkt_table[i] = odp_packet_alloc(pool, pkt_len);
+                       pkt_table[i] = packet_alloc(pool, pkt_len, 1);
                        if (odp_unlikely(pkt_table[i] == ODP_PACKET_INVALID))
                                break;
 
+                       pkt_hdr = odp_packet_hdr(pkt_table[i]);
+
+                       /* Fill in L2 metadata and flags */
+                       packet_parse_l2(pkt_hdr);
+
                        if (odp_packet_copydata_in(pkt_table[i], 0,
                                                   pkt_len, pkt_buf) != 0) {
                                odp_packet_free(pkt_table[i]);
@@ -154,9 +160,6 @@ static inline unsigned pkt_mmap_v2_rx(int sock, struct ring 
*ring,
 
                        mmap_rx_user_ready(ppd.raw);
 
-                       /* Parse and set packet header data */
-                       _odp_packet_reset_parse(pkt_table[i]);
-
                        frame_num = next_frame_num;
                        i++;
                } else {
-- 
2.6.0

_______________________________________________
lng-odp mailing list
lng-odp@lists.linaro.org
https://lists.linaro.org/mailman/listinfo/lng-odp

Reply via email to