diff options
author | Zoltan Kiss <zoltan.kiss@linaro.org> | 2015-04-23 18:14:04 +0100 |
---|---|---|
committer | Zoltan Kiss <zoltan.kiss@linaro.org> | 2015-04-23 21:08:32 +0100 |
commit | 3d15173910838683b24a0c26ded856a11f0e7695 (patch) | |
tree | e5aeaf2715d6308061bf17b4e98302e6f9ea8c44 | |
parent | d64ef4d1ff60c9863d91ee4f339d7ce09dc05702 (diff) |
packet: implement odp_packet_copydata_in
Based on the linux-generic implementation.
Signed-off-by: Zoltan Kiss <zoltan.kiss@linaro.org>
-rw-r--r-- | platform/linux-dpdk/odp_packet.c | 22 |
1 files changed, 13 insertions, 9 deletions
diff --git a/platform/linux-dpdk/odp_packet.c b/platform/linux-dpdk/odp_packet.c index 1cb861a76..f5f28126d 100644 --- a/platform/linux-dpdk/odp_packet.c +++ b/platform/linux-dpdk/odp_packet.c @@ -694,19 +694,23 @@ int odp_packet_copydata_out(odp_packet_t pkt, uint32_t offset, int odp_packet_copydata_in(odp_packet_t pkt, uint32_t offset, uint32_t len, const void *src) { - struct rte_mbuf *mb; - - if (pkt == ODP_PACKET_INVALID) - return _odp_typeval(ODP_PACKET_INVALID); - - mb = &(odp_packet_hdr(pkt)->buf_hdr.mb); + void *mapaddr; + uint32_t seglen = 0; /* GCC */ + uint32_t cpylen; + const uint8_t *srcaddr = (const uint8_t *)src; - if (offset + len > mb->buf_len) { - ODP_ERR("Not enough room to copy"); + if (offset + len > odp_packet_len(pkt)) return -1; + + while (len > 0) { + mapaddr = odp_packet_offset(pkt, offset, &seglen, NULL); + cpylen = len > seglen ? seglen : len; + memcpy(mapaddr, srcaddr, cpylen); + offset += cpylen; + srcaddr += cpylen; + len -= cpylen; } - memcpy((char *)mb->buf_addr + offset, src, len); return 0; } |