From 3f40c345f7527df2b2133f141294cb96f3d5db0a Mon Sep 17 00:00:00 2001 From: Zoltan Kiss Date: Sat, 24 Jan 2015 19:09:14 +0000 Subject: api: packet: add segmentation and copy API Porting commit from linux-generic (f2804) --- platform/linux-dpdk/include/api/odp_packet.h | 33 +++++++---------------- platform/linux-dpdk/odp_packet.c | 39 ++++++++++++---------------- 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 @@ -108,23 +108,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 * @@ -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) -- cgit v1.2.3