aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZoltan Kiss <zoltan.kiss@linaro.org>2015-04-23 18:14:04 +0100
committerZoltan Kiss <zoltan.kiss@linaro.org>2015-04-23 21:08:32 +0100
commit3d15173910838683b24a0c26ded856a11f0e7695 (patch)
treee5aeaf2715d6308061bf17b4e98302e6f9ea8c44
parentd64ef4d1ff60c9863d91ee4f339d7ce09dc05702 (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.c22
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;
}