Ping.
> -----Original Message----- > From: Savolainen, Petri (Nokia - FI/Espoo) > Sent: Thursday, October 15, 2015 9:12 AM > To: lng-odp@lists.linaro.org > Subject: RE: [lng-odp] [PATCH] linux-generic: pktio: fill in L2 parse > results by default > > Ping. > > > -----Original Message----- > > From: lng-odp [mailto:lng-odp-boun...@lists.linaro.org] On Behalf Of EXT > > Petri Savolainen > > Sent: Monday, October 12, 2015 11:15 AM > > To: lng-odp@lists.linaro.org > > Subject: [lng-odp] [PATCH] linux-generic: pktio: fill in L2 parse results > > by default > > > > 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 *)ð->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 _______________________________________________ lng-odp mailing list lng-odp@lists.linaro.org https://lists.linaro.org/mailman/listinfo/lng-odp