aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZoltan Kiss <zoltan.kiss@linaro.org>2015-04-23 18:25:59 +0100
committerZoltan Kiss <zoltan.kiss@linaro.org>2015-04-23 21:08:32 +0100
commitdf701a032847bbce7f58713c237a0c3001d774a5 (patch)
tree4a865d2f4b87c1f174a4da100382abdd772bf310
parent3d15173910838683b24a0c26ded856a11f0e7695 (diff)
packet: implement odp_packet_add/rem_data
Based on the linux-generic implementation. Signed-off-by: Zoltan Kiss <zoltan.kiss@linaro.org>
-rw-r--r--platform/linux-dpdk/odp_packet.c62
1 files changed, 52 insertions, 10 deletions
diff --git a/platform/linux-dpdk/odp_packet.c b/platform/linux-dpdk/odp_packet.c
index f5f28126d..03bd3b0a8 100644
--- a/platform/linux-dpdk/odp_packet.c
+++ b/platform/linux-dpdk/odp_packet.c
@@ -372,20 +372,62 @@ uint32_t odp_packet_seg_data_len(odp_packet_t pkt ODP_UNUSED,
*
*/
-odp_packet_t odp_packet_add_data(odp_packet_t pkt ODP_UNUSED,
- uint32_t offset ODP_UNUSED,
- uint32_t len ODP_UNUSED)
+odp_packet_t odp_packet_add_data(odp_packet_t pkt, uint32_t offset,
+ uint32_t len)
{
- ODP_UNIMPLEMENTED();
- ODP_ABORT("");
+ odp_packet_hdr_t *pkt_hdr = odp_packet_hdr(pkt);
+ uint32_t pktlen = odp_packet_len(pkt);
+ odp_packet_t newpkt;
+
+ if (offset > pktlen)
+ return ODP_PACKET_INVALID;
+
+ newpkt = odp_packet_alloc(pkt_hdr->buf_hdr.pool_hdl, pktlen + len);
+
+ if (newpkt != ODP_PACKET_INVALID) {
+ if (_odp_packet_copy_to_packet(pkt, 0,
+ newpkt, 0, offset) != 0 ||
+ _odp_packet_copy_to_packet(pkt, offset, newpkt,
+ offset + len,
+ pktlen - offset) != 0) {
+ odp_packet_free(newpkt);
+ newpkt = ODP_PACKET_INVALID;
+ } else {
+ _odp_packet_copy_md_to_packet(pkt, newpkt);
+ odp_packet_free(pkt);
+ }
+ }
+
+ return newpkt;
}
-odp_packet_t odp_packet_rem_data(odp_packet_t pkt ODP_UNUSED,
- uint32_t offset ODP_UNUSED,
- uint32_t len ODP_UNUSED)
+odp_packet_t odp_packet_rem_data(odp_packet_t pkt, uint32_t offset,
+ uint32_t len)
{
- ODP_UNIMPLEMENTED();
- ODP_ABORT("");
+ odp_packet_hdr_t *pkt_hdr = odp_packet_hdr(pkt);
+ uint32_t pktlen = odp_packet_len(pkt);
+ odp_packet_t newpkt;
+
+ if (offset > pktlen || offset + len > pktlen)
+ return ODP_PACKET_INVALID;
+
+ newpkt = odp_packet_alloc(pkt_hdr->buf_hdr.pool_hdl, pktlen - len);
+
+ if (newpkt != ODP_PACKET_INVALID) {
+ if (_odp_packet_copy_to_packet(pkt, 0,
+ newpkt, 0, offset) != 0 ||
+ _odp_packet_copy_to_packet(pkt, offset + len,
+ newpkt, offset,
+ pktlen - offset - len) != 0) {
+ odp_packet_free(newpkt);
+ newpkt = ODP_PACKET_INVALID;
+ } else {
+ _odp_packet_copy_md_to_packet(pkt, newpkt);
+ odp_packet_free(pkt);
+ }
+ }
+
+ return newpkt;
}
/**