aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZoltan Kiss <zoltan.kiss@linaro.org>2015-01-24 19:09:14 +0000
committerZoltan Kiss <zoltan.kiss@linaro.org>2015-01-24 19:09:14 +0000
commit3f40c345f7527df2b2133f141294cb96f3d5db0a (patch)
tree21644054298b9ce30691b607001fe4fe0e80dc11
parent89feaa1171ce25b267fab64af57d3e3df23f4453 (diff)
api: packet: add segmentation and copy APIv0.5.0-dpdk
Porting commit from linux-generic (f2804)
-rw-r--r--platform/linux-dpdk/include/api/odp_packet.h33
-rw-r--r--platform/linux-dpdk/odp_packet.c39
2 files changed, 26 insertions, 46 deletions
diff --git a/platform/linux-dpdk/include/api/odp_packet.h b/platform/linux-dpdk/include/api/odp_packet.h
index 4040c06a0..253f38f93 100644
--- a/platform/linux-dpdk/include/api/odp_packet.h
+++ b/platform/linux-dpdk/include/api/odp_packet.h
@@ -109,23 +109,6 @@ odp_packet_t odp_packet_from_buffer(odp_buffer_t buf);
odp_buffer_t odp_buffer_from_packet(odp_packet_t pkt);
/**
- * Set the packet length
- *
- * @param pkt Packet handle
- * @param len Length of packet in bytes
- */
-void odp_packet_set_len(odp_packet_t pkt, size_t len);
-
-/**
- * Get the packet length
- *
- * @param pkt Packet handle
- *
- * @return Packet length in bytes
- */
-size_t odp_packet_get_len(odp_packet_t pkt);
-
-/**
* User context pointer
*
* Return previously stored user context pointer.
@@ -375,16 +358,18 @@ int odp_packet_l4_offset_set(odp_packet_t pkt, uint32_t offset);
void odp_packet_print(odp_packet_t pkt);
/**
- * Copy contents and metadata from pkt_src to pkt_dst
- * Useful when creating copies of packets
+ * Copy packet
+ *
+ * Create a new copy of the packet. The new packet is exact copy of the source
+ * packet (incl. data and meta-data). The pool must have been created with
+ * buffer type ODP_BUFFER_TYPE_PACKET.
*
- * @param pkt_dst Destination packet
- * @param pkt_src Source packet
+ * @param pkt Packet handle
+ * @param pool Buffer pool for allocation of the new packet.
*
- * @return 0 if successful
+ * @return Handle to the copy of the packet, or ODP_PACKET_INVALID
*/
-int odp_packet_copy(odp_packet_t pkt_dst, odp_packet_t pkt_src);
-
+odp_packet_t odp_packet_copy(odp_packet_t pkt, odp_buffer_pool_t pool);
/**
* Tests if packet is valid
*
diff --git a/platform/linux-dpdk/odp_packet.c b/platform/linux-dpdk/odp_packet.c
index 5a96627aa..04ba3c7b0 100644
--- a/platform/linux-dpdk/odp_packet.c
+++ b/platform/linux-dpdk/odp_packet.c
@@ -106,17 +106,6 @@ static int odp_packet_set_offset_len(odp_packet_t pkt, size_t frame_offset,
return 0;
}
-void odp_packet_set_len(odp_packet_t pkt, size_t len)
-{
- (void)odp_packet_set_offset_len(pkt, 0, len);
-}
-
-size_t odp_packet_get_len(odp_packet_t pkt)
-{
- struct rte_mbuf *mb = &(odp_packet_hdr(pkt)->buf_hdr.mb);
- return mb->pkt.pkt_len;
-}
-
void *odp_packet_head(odp_packet_t pkt)
{
return odp_buffer_addr(odp_packet_to_buffer(pkt));
@@ -430,43 +419,49 @@ void odp_packet_print(odp_packet_t pkt)
/* For now we can only copy between packets of the same segment size
* We should probably refine this API, maybe introduce a clone API */
-int odp_packet_copy(odp_packet_t pkt_dst, odp_packet_t pkt_src)
+odp_packet_t odp_packet_copy(odp_packet_t pkt_src, odp_buffer_pool_t pool)
{
+ odp_packet_t pkt_dst;
struct rte_mbuf *mb_dst, *mb_src;
uint8_t nb_segs, i;
- ODP_ASSERT(odp_buffer_type(pkt_dst) == ODP_BUFFER_TYPE_PACKET &&
- odp_buffer_type(pkt_src) == ODP_BUFFER_TYPE_PACKET,
- "dst_pkt or src_pkt not of type ODP_BUFFER_TYPE_PACKET");
+ ODP_ASSERT(odp_buffer_type(pkt_src) == ODP_BUFFER_TYPE_PACKET,
+ "pkt not of type ODP_BUFFER_TYPE_PACKET");
- if (pkt_dst == ODP_PACKET_INVALID || pkt_src == ODP_PACKET_INVALID)
- return -1;
+ if (pkt_src == ODP_PACKET_INVALID)
+ return ODP_PACKET_INVALID;
- mb_dst = &(odp_packet_hdr(pkt_dst)->buf_hdr.mb);
mb_src = &(odp_packet_hdr(pkt_src)->buf_hdr.mb);
+ pkt_dst = odp_packet_alloc(pool, mb_src->buf_len);
+
+ if (pkt_dst == ODP_PACKET_INVALID)
+ return ODP_PACKET_INVALID;
+
+ mb_dst = &(odp_packet_hdr(pkt_dst)->buf_hdr.mb);
+
if (mb_dst->pkt.nb_segs != mb_src->pkt.nb_segs) {
ODP_ERR("Different nb_segs in pkt_dst and pkt_src");
- return -1;
+ return ODP_PACKET_INVALID;
}
nb_segs = mb_src->pkt.nb_segs;
if (mb_dst->buf_len < mb_src->buf_len) {
ODP_ERR("dst_pkt smaller than src_pkt");
- return -1;
+ return ODP_PACKET_INVALID;
}
for (i = 0; i < nb_segs; i++) {
if (mb_src == NULL || mb_dst == NULL) {
ODP_ERR("Corrupted packets");
- return -1;
+ return ODP_PACKET_INVALID;
}
memcpy(mb_dst->buf_addr, mb_src->buf_addr, mb_src->buf_len);
mb_dst = mb_dst->pkt.next;
mb_src = mb_src->pkt.next;
}
- return 0;
+ return pkt_dst;
}
void odp_packet_user_ptr_set(odp_packet_t pkt, const void *ctx)