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 *)&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
_______________________________________________
lng-odp mailing list
lng-odp@lists.linaro.org
https://lists.linaro.org/mailman/listinfo/lng-odp

Reply via email to