@@ -23,11 +23,19 @@
#include <odp/api/plat/packet_inline_types.h>
#include <odp/api/plat/pool_inline_types.h>
+#include <string.h>
+
/** @cond _ODP_HIDE_FROM_DOXYGEN_ */
void *_odp_packet_map(void *pkt_ptr, uint32_t offset, uint32_t *seg_len,
int *seg_idx);
+int _odp_packet_copy_from_mem_seg(odp_packet_t pkt, uint32_t offset,
+ uint32_t len, const void *src);
+
+int _odp_packet_copy_to_mem_seg(odp_packet_t pkt, uint32_t offset,
+ uint32_t len, void *dst);
+
extern const _odp_packet_inline_offset_t _odp_packet_inline;
extern const _odp_pool_inline_offset_t _odp_pool_inline;
@@ -225,6 +233,34 @@ static inline odp_buffer_t packet_to_buffer(odp_packet_t pkt)
return (odp_buffer_t)pkt;
}
+static 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);
+
+ memcpy(data + offset, src, len);
+
+ return 0;
+}
+
+static inline int _odp_packet_copy_to_mem(odp_packet_t pkt, uint32_t offset,
+ uint32_t len, void *dst)
+{
+ 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_to_mem_seg(pkt, offset, len, dst);
+
+ memcpy(dst, data + offset, len);
+
+ return 0;
+}
+
/** @endcond */
#endif
@@ -140,4 +140,16 @@ _ODP_INLINE void odp_packet_prefetch(odp_packet_t pkt, uint32_t offset,
return _odp_packet_prefetch(pkt, offset, len);
}
+_ODP_INLINE int odp_packet_copy_from_mem(odp_packet_t pkt, uint32_t offset,
+ uint32_t len, const void *src)
+{
+ return _odp_packet_copy_from_mem(pkt, offset, len, src);
+}
+
+_ODP_INLINE int odp_packet_copy_to_mem(odp_packet_t pkt, uint32_t offset,
+ uint32_t len, void *dst)
+{
+ return _odp_packet_copy_to_mem(pkt, offset, len, dst);
+}
+
#endif
@@ -334,6 +334,54 @@ void *_odp_packet_map(void *pkt_ptr, uint32_t offset, uint32_t *seg_len,
return packet_map(pkt_ptr, offset, seg_len, seg_idx);
}
+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 */
+ uint32_t cpylen;
+ const uint8_t *srcaddr = (const uint8_t *)src;
+ odp_packet_hdr_t *pkt_hdr = packet_hdr(pkt);
+
+ if (offset + len > pkt_hdr->frame_len)
+ return -1;
+
+ while (len > 0) {
+ mapaddr = packet_map(pkt_hdr, offset, &seglen, NULL);
+ cpylen = len > seglen ? seglen : len;
+ memcpy(mapaddr, srcaddr, cpylen);
+ offset += cpylen;
+ srcaddr += cpylen;
+ len -= cpylen;
+ }
+
+ return 0;
+}
+
+int _odp_packet_copy_to_mem_seg(odp_packet_t pkt, uint32_t offset,
+ uint32_t len, void *dst)
+{
+ void *mapaddr;
+ uint32_t seglen = 0; /* GCC */
+ uint32_t cpylen;
+ uint8_t *dstaddr = (uint8_t *)dst;
+ odp_packet_hdr_t *pkt_hdr = packet_hdr(pkt);
+
+ if (offset + len > pkt_hdr->frame_len)
+ return -1;
+
+ while (len > 0) {
+ mapaddr = packet_map(pkt_hdr, offset, &seglen, NULL);
+ cpylen = len > seglen ? seglen : len;
+ memcpy(dstaddr, mapaddr, cpylen);
+ offset += cpylen;
+ dstaddr += cpylen;
+ len -= cpylen;
+ }
+
+ return 0;
+}
+
#include <odp/visibility_end.h>
void packet_parse_reset(odp_packet_hdr_t *pkt_hdr)
@@ -1595,54 +1643,6 @@ odp_packet_t odp_packet_copy_part(odp_packet_t pkt, uint32_t offset,
return newpkt;
}
-int odp_packet_copy_to_mem(odp_packet_t pkt, uint32_t offset,
- uint32_t len, void *dst)
-{
- void *mapaddr;
- uint32_t seglen = 0; /* GCC */
- uint32_t cpylen;
- uint8_t *dstaddr = (uint8_t *)dst;
- odp_packet_hdr_t *pkt_hdr = packet_hdr(pkt);
-
- if (offset + len > pkt_hdr->frame_len)
- return -1;
-
- while (len > 0) {
- mapaddr = packet_map(pkt_hdr, offset, &seglen, NULL);
- cpylen = len > seglen ? seglen : len;
- memcpy(dstaddr, mapaddr, cpylen);
- offset += cpylen;
- dstaddr += cpylen;
- len -= cpylen;
- }
-
- return 0;
-}
-
-int odp_packet_copy_from_mem(odp_packet_t pkt, uint32_t offset,
- uint32_t len, const void *src)
-{
- void *mapaddr;
- uint32_t seglen = 0; /* GCC */
- uint32_t cpylen;
- const uint8_t *srcaddr = (const uint8_t *)src;
- odp_packet_hdr_t *pkt_hdr = packet_hdr(pkt);
-
- if (offset + len > pkt_hdr->frame_len)
- return -1;
-
- while (len > 0) {
- mapaddr = packet_map(pkt_hdr, offset, &seglen, NULL);
- cpylen = len > seglen ? seglen : len;
- memcpy(mapaddr, srcaddr, cpylen);
- offset += cpylen;
- srcaddr += cpylen;
- len -= cpylen;
- }
-
- return 0;
-}
-
int odp_packet_copy_from_pkt(odp_packet_t dst, uint32_t dst_offset,
odp_packet_t src, uint32_t src_offset,
uint32_t len)