diff options
author | Zoltan Kiss <zoltan.kiss@linaro.org> | 2015-04-23 18:25:59 +0100 |
---|---|---|
committer | Zoltan Kiss <zoltan.kiss@linaro.org> | 2015-04-23 21:08:32 +0100 |
commit | df701a032847bbce7f58713c237a0c3001d774a5 (patch) | |
tree | 4a865d2f4b87c1f174a4da100382abdd772bf310 | |
parent | 3d15173910838683b24a0c26ded856a11f0e7695 (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.c | 62 |
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; } /** |