aboutsummaryrefslogtreecommitdiff
path: root/platform/linux-dpdk/include/odp/api/plat/packet_inlines.h
diff options
context:
space:
mode:
Diffstat (limited to 'platform/linux-dpdk/include/odp/api/plat/packet_inlines.h')
-rw-r--r--platform/linux-dpdk/include/odp/api/plat/packet_inlines.h21
1 files changed, 18 insertions, 3 deletions
diff --git a/platform/linux-dpdk/include/odp/api/plat/packet_inlines.h b/platform/linux-dpdk/include/odp/api/plat/packet_inlines.h
index 825cfb5e5..b8116c14f 100644
--- a/platform/linux-dpdk/include/odp/api/plat/packet_inlines.h
+++ b/platform/linux-dpdk/include/odp/api/plat/packet_inlines.h
@@ -336,8 +336,9 @@ _ODP_INLINE int odp_packet_copy_to_mem(odp_packet_t pkt, uint32_t offset,
return 0;
}
-_ODP_INLINE int odp_packet_copy_from_mem(odp_packet_t pkt, uint32_t offset,
- uint32_t len, const void *src)
+static inline int _odp_packet_copy_from_mem_seg(odp_packet_t pkt,
+ uint32_t offset, uint32_t len,
+ const void *src)
{
void *mapaddr;
uint32_t seglen = 0; /* GCC */
@@ -350,7 +351,7 @@ _ODP_INLINE int odp_packet_copy_from_mem(odp_packet_t pkt, uint32_t offset,
while (len > 0) {
mapaddr = odp_packet_offset(pkt, offset, &seglen, NULL);
cpylen = len > seglen ? seglen : len;
- memcpy(mapaddr, srcaddr, cpylen);
+ rte_memcpy(mapaddr, srcaddr, cpylen);
offset += cpylen;
srcaddr += cpylen;
len -= cpylen;
@@ -359,6 +360,20 @@ _ODP_INLINE int odp_packet_copy_from_mem(odp_packet_t pkt, uint32_t offset,
return 0;
}
+_ODP_INLINE int odp_packet_copy_from_mem(odp_packet_t pkt, uint32_t offset,
+ uint32_t len, const void *src)
+{
+ uint32_t seg_len = odp_packet_seg_len(pkt);
+ uint8_t *data = (uint8_t *)odp_packet_data(pkt);
+
+ if (odp_unlikely(offset + len > seg_len))
+ return _odp_packet_copy_from_mem_seg(pkt, offset, len, src);
+
+ rte_memcpy(data + offset, src, len);
+
+ return 0;
+}
+
_ODP_INLINE odp_packet_t odp_packet_from_event(odp_event_t ev)
{
return (odp_packet_t)ev;