diff mbox

[PATCHv2] linux-generic: packet: streamline packet add/rem data

Message ID 1418781448-20711-1-git-send-email-bill.fischofer@linaro.org
State New
Headers show

Commit Message

Bill Fischofer Dec. 17, 2014, 1:57 a.m. UTC
Ensure packet perser metadata is copied from old to new packet as part of
add/rem data operations that omit packet reparsing.

Signed-off-by: Bill Fischofer <bill.fischofer@linaro.org>
---
v2 Ensures that parser metadata is copied if we're not reparsing

 platform/linux-generic/include/odp_packet_internal.h | 20 ++++++++++++++++++++
 platform/linux-generic/odp_packet.c                  | 12 ++++++++++--
 2 files changed, 30 insertions(+), 2 deletions(-)

Comments

Bill Fischofer Dec. 18, 2014, 11:16 a.m. UTC | #1
OK, v3 sent with requested changes.

On Thu, Dec 18, 2014 at 3:24 AM, Savolainen, Petri (NSN - FI/Espoo) <
petri.savolainen@nsn.com> wrote:
>
>
>
> > -----Original Message-----
> > From: lng-odp-bounces@lists.linaro.org [mailto:lng-odp-
> > bounces@lists.linaro.org] On Behalf Of ext Bill Fischofer
> > Sent: Wednesday, December 17, 2014 3:57 AM
> > To: lng-odp@lists.linaro.org
> > Subject: [lng-odp] [PATCHv2] linux-generic: packet: streamline packet
> > add/rem data
> >
> > Ensure packet perser metadata is copied from old to new packet as part of
> > add/rem data operations that omit packet reparsing.
> >
> > Signed-off-by: Bill Fischofer <bill.fischofer@linaro.org>
> > ---
> > v2 Ensures that parser metadata is copied if we're not reparsing
> >
> >  platform/linux-generic/include/odp_packet_internal.h | 20
> > ++++++++++++++++++++
> >  platform/linux-generic/odp_packet.c                  | 12 ++++++++++--
> >  2 files changed, 30 insertions(+), 2 deletions(-)
> >
> > diff --git a/platform/linux-generic/include/odp_packet_internal.h
> > b/platform/linux-generic/include/odp_packet_internal.h
> > index 068f969..54a12b5 100644
> > --- a/platform/linux-generic/include/odp_packet_internal.h
> > +++ b/platform/linux-generic/include/odp_packet_internal.h
> > @@ -187,6 +187,26 @@ static inline void packet_init(pool_entry_t *pool,
> >               (pool->s.headroom + size);
> >  }
> >
> > +static inline void copy_packet_parser_metadata(odp_packet_hdr_t
> *src_hdr,
> > +                                            odp_packet_hdr_t *dst_hdr)
> > +{
> > +     dst_hdr->input_flags    = src_hdr->input_flags;
> > +     dst_hdr->error_flags    = src_hdr->error_flags;
> > +     dst_hdr->output_flags   = src_hdr->output_flags;
> > +
> > +     dst_hdr->l2_offset      = src_hdr->l2_offset;
> > +     dst_hdr->l3_offset      = src_hdr->l3_offset;
> > +     dst_hdr->l4_offset      = src_hdr->l4_offset;
> > +     dst_hdr->payload_offset = src_hdr->payload_offset;
> > +
> > +     dst_hdr->vlan_s_tag     = src_hdr->vlan_s_tag;
> > +     dst_hdr->vlan_c_tag     = src_hdr->vlan_c_tag;
> > +     dst_hdr->l3_protocol    = src_hdr->l3_protocol;
> > +     dst_hdr->l3_len         = src_hdr->l3_len;
> > +     dst_hdr->l4_protocol    = src_hdr->l4_protocol;
> > +     dst_hdr->l4_len         = src_hdr->l4_len;
> > +}
> > +
> >  static inline void *packet_map(odp_packet_hdr_t *pkt_hdr,
> >                              uint32_t offset, uint32_t *seglen)
> >  {
> > diff --git a/platform/linux-generic/odp_packet.c b/platform/linux-
> > generic/odp_packet.c
> > index 65e6288..43a9419 100644
> > --- a/platform/linux-generic/odp_packet.c
> > +++ b/platform/linux-generic/odp_packet.c
> > @@ -396,12 +396,16 @@ odp_packet_t odp_packet_add_data(odp_packet_t pkt,
> > uint32_t offset,
> >                       newpkt = ODP_PACKET_INVALID;
> >               } else {
> >                       odp_packet_hdr_t *new_hdr = odp_packet_hdr(newpkt);
> > +                     new_hdr->input = pkt_hdr->input;
> >                       new_hdr->buf_hdr.buf_u64 =
> pkt_hdr->buf_hdr.buf_u64;
> >                       odp_atomic_store_u32(
> >                               &new_hdr->buf_hdr.ref_count,
> >                               odp_atomic_load_u32(
> >                                       &pkt_hdr->buf_hdr.ref_count));
> > -                     _odp_packet_parse(newpkt);
> > +                     if (offset < pkt_hdr->payload_offset)
> > +                             _odp_packet_parse(newpkt);
>
> " Handles and pointers must be updated
>   after the operation. User is responsible to update packet meta-data
> offsets
>   when needed."
>
> The operation must not parse the packet again and thus overwrite existing
> meta-data. E.g. application may have removed all the headers from the
> packet at this point.
>
> Just copy old meta-data to the new packet. From application point of view
> this operation just added packet length at the offset and returned a new
> handle to the same packet. Application will update offsets/flags as needed.
>
> -Petri
>
>
> > +                     else
> > +                             copy_packet_parser_metadata(pkt_hdr,
> new_hdr);
> >                       odp_packet_free(pkt);
> >               }
> >       }
> > @@ -431,12 +435,16 @@ odp_packet_t odp_packet_rem_data(odp_packet_t pkt,
> > uint32_t offset,
> >                       newpkt = ODP_PACKET_INVALID;
> >               } else {
> >                       odp_packet_hdr_t *new_hdr = odp_packet_hdr(newpkt);
> > +                     new_hdr->input = pkt_hdr->input;
> >                       new_hdr->buf_hdr.buf_u64 =
> pkt_hdr->buf_hdr.buf_u64;
> >                       odp_atomic_store_u32(
> >                               &new_hdr->buf_hdr.ref_count,
> >                               odp_atomic_load_u32(
> >                                       &pkt_hdr->buf_hdr.ref_count));
> > -                     _odp_packet_parse(newpkt);
> > +                     if (offset < pkt_hdr->payload_offset)
> > +                             _odp_packet_parse(newpkt);
> > +                     else
> > +                             copy_packet_parser_metadata(pkt_hdr,
> new_hdr);
> >                       odp_packet_free(pkt);
> >               }
> >       }
> > --
> > 1.8.3.2
> >
> >
> > _______________________________________________
> > lng-odp mailing list
> > lng-odp@lists.linaro.org
> > http://lists.linaro.org/mailman/listinfo/lng-odp
>
diff mbox

Patch

diff --git a/platform/linux-generic/include/odp_packet_internal.h b/platform/linux-generic/include/odp_packet_internal.h
index 068f969..54a12b5 100644
--- a/platform/linux-generic/include/odp_packet_internal.h
+++ b/platform/linux-generic/include/odp_packet_internal.h
@@ -187,6 +187,26 @@  static inline void packet_init(pool_entry_t *pool,
 		(pool->s.headroom + size);
 }
 
+static inline void copy_packet_parser_metadata(odp_packet_hdr_t *src_hdr,
+					       odp_packet_hdr_t *dst_hdr)
+{
+	dst_hdr->input_flags    = src_hdr->input_flags;
+	dst_hdr->error_flags    = src_hdr->error_flags;
+	dst_hdr->output_flags   = src_hdr->output_flags;
+
+	dst_hdr->l2_offset      = src_hdr->l2_offset;
+	dst_hdr->l3_offset      = src_hdr->l3_offset;
+	dst_hdr->l4_offset      = src_hdr->l4_offset;
+	dst_hdr->payload_offset = src_hdr->payload_offset;
+
+	dst_hdr->vlan_s_tag     = src_hdr->vlan_s_tag;
+	dst_hdr->vlan_c_tag     = src_hdr->vlan_c_tag;
+	dst_hdr->l3_protocol    = src_hdr->l3_protocol;
+	dst_hdr->l3_len         = src_hdr->l3_len;
+	dst_hdr->l4_protocol    = src_hdr->l4_protocol;
+	dst_hdr->l4_len         = src_hdr->l4_len;
+}
+
 static inline void *packet_map(odp_packet_hdr_t *pkt_hdr,
 			       uint32_t offset, uint32_t *seglen)
 {
diff --git a/platform/linux-generic/odp_packet.c b/platform/linux-generic/odp_packet.c
index 65e6288..43a9419 100644
--- a/platform/linux-generic/odp_packet.c
+++ b/platform/linux-generic/odp_packet.c
@@ -396,12 +396,16 @@  odp_packet_t odp_packet_add_data(odp_packet_t pkt, uint32_t offset,
 			newpkt = ODP_PACKET_INVALID;
 		} else {
 			odp_packet_hdr_t *new_hdr = odp_packet_hdr(newpkt);
+			new_hdr->input = pkt_hdr->input;
 			new_hdr->buf_hdr.buf_u64 = pkt_hdr->buf_hdr.buf_u64;
 			odp_atomic_store_u32(
 				&new_hdr->buf_hdr.ref_count,
 				odp_atomic_load_u32(
 					&pkt_hdr->buf_hdr.ref_count));
-			_odp_packet_parse(newpkt);
+			if (offset < pkt_hdr->payload_offset)
+				_odp_packet_parse(newpkt);
+			else
+				copy_packet_parser_metadata(pkt_hdr, new_hdr);
 			odp_packet_free(pkt);
 		}
 	}
@@ -431,12 +435,16 @@  odp_packet_t odp_packet_rem_data(odp_packet_t pkt, uint32_t offset,
 			newpkt = ODP_PACKET_INVALID;
 		} else {
 			odp_packet_hdr_t *new_hdr = odp_packet_hdr(newpkt);
+			new_hdr->input = pkt_hdr->input;
 			new_hdr->buf_hdr.buf_u64 = pkt_hdr->buf_hdr.buf_u64;
 			odp_atomic_store_u32(
 				&new_hdr->buf_hdr.ref_count,
 				odp_atomic_load_u32(
 					&pkt_hdr->buf_hdr.ref_count));
-			_odp_packet_parse(newpkt);
+			if (offset < pkt_hdr->payload_offset)
+				_odp_packet_parse(newpkt);
+			else
+				copy_packet_parser_metadata(pkt_hdr, new_hdr);
 			odp_packet_free(pkt);
 		}
 	}