diff options
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.h | 21 |
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; |