aboutsummaryrefslogtreecommitdiff
path: root/platform/linux-generic
diff options
context:
space:
mode:
authorBill Fischofer <bill.fischofer@linaro.org>2014-12-18 05:15:29 -0600
committerMaxim Uvarov <maxim.uvarov@linaro.org>2014-12-22 18:14:43 +0300
commitd0b70558a1ed73f57e407c71f706c25990069c19 (patch)
tree6cae7fc7501078c830b78603fb79aba00bd89208 /platform/linux-generic
parent798031917802eeba232a9a1cde7bc92e791b0e64 (diff)
linux-generic: packet: streamline packet add/rem data
Ensure packet parser metadata is copied from old to new packet as part of add/rem data operations. Signed-off-by: Bill Fischofer <bill.fischofer@linaro.org> Reviewed-by: Petri Savolainen <petri.savolainen@linaro.org> Signed-off-by: Maxim Uvarov <maxim.uvarov@linaro.org>
Diffstat (limited to 'platform/linux-generic')
-rw-r--r--platform/linux-generic/include/odp_packet_internal.h20
-rw-r--r--platform/linux-generic/odp_packet.c6
2 files changed, 24 insertions, 2 deletions
diff --git a/platform/linux-generic/include/odp_packet_internal.h b/platform/linux-generic/include/odp_packet_internal.h
index a0eff3094..10226a947 100644
--- a/platform/linux-generic/include/odp_packet_internal.h
+++ b/platform/linux-generic/include/odp_packet_internal.h
@@ -181,6 +181,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 0ab98662e..e40bdb18f 100644
--- a/platform/linux-generic/odp_packet.c
+++ b/platform/linux-generic/odp_packet.c
@@ -396,12 +396,13 @@ 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);
+ copy_packet_parser_metadata(pkt_hdr, new_hdr);
odp_packet_free(pkt);
}
}
@@ -431,12 +432,13 @@ 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);
+ copy_packet_parser_metadata(pkt_hdr, new_hdr);
odp_packet_free(pkt);
}
}