From 4210aeaca1a021c72b95eba3ba3008952b15d371 Mon Sep 17 00:00:00 2001 From: Petri Savolainen Date: Thu, 15 Apr 2021 13:10:25 +0300 Subject: linux-gen: pool: prepare pool type usage with pool_ext Save pool type into pool struct. Both current and the new external memory pool parameters have pool type. Initialize pool struct with memset() during pool create. Signed-off-by: Petri Savolainen Reviewed-by: Matias Elo --- platform/linux-generic/odp_packet.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'platform/linux-generic/odp_packet.c') diff --git a/platform/linux-generic/odp_packet.c b/platform/linux-generic/odp_packet.c index fdf711735..4da15baa4 100644 --- a/platform/linux-generic/odp_packet.c +++ b/platform/linux-generic/odp_packet.c @@ -690,7 +690,7 @@ odp_packet_t odp_packet_alloc(odp_pool_t pool_hdl, uint32_t len) odp_packet_t pkt; int num, num_seg; - if (odp_unlikely(pool->params.type != ODP_POOL_PACKET)) { + if (odp_unlikely(pool->type != ODP_POOL_PACKET)) { _odp_errno = EINVAL; return ODP_PACKET_INVALID; } @@ -713,7 +713,7 @@ int odp_packet_alloc_multi(odp_pool_t pool_hdl, uint32_t len, pool_t *pool = pool_entry_from_hdl(pool_hdl); int num, num_seg; - if (odp_unlikely(pool->params.type != ODP_POOL_PACKET)) { + if (odp_unlikely(pool->type != ODP_POOL_PACKET)) { _odp_errno = EINVAL; return -1; } -- cgit v1.2.3 From d3b7ea2bed95bee8de8fa0a13e3bf8739a845ff0 Mon Sep 17 00:00:00 2001 From: Petri Savolainen Date: Tue, 20 Apr 2021 17:19:32 +0300 Subject: linux-gen: pool: reusable pool create functions Split portions of pool create to separate functions. These can be reused in external memory pool implementation. Signed-off-by: Petri Savolainen Reviewed-by: Matias Elo --- platform/linux-generic/odp_packet.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'platform/linux-generic/odp_packet.c') diff --git a/platform/linux-generic/odp_packet.c b/platform/linux-generic/odp_packet.c index 4da15baa4..811a51602 100644 --- a/platform/linux-generic/odp_packet.c +++ b/platform/linux-generic/odp_packet.c @@ -1747,8 +1747,8 @@ int _odp_packet_copy_md_to_packet(odp_packet_t srcpkt, odp_packet_t dstpkt) odp_packet_hdr_t *dsthdr = packet_hdr(dstpkt); pool_t *src_pool = srchdr->buf_hdr.pool_ptr; pool_t *dst_pool = dsthdr->buf_hdr.pool_ptr; - uint32_t src_uarea_size = src_pool->params.pkt.uarea_size; - uint32_t dst_uarea_size = dst_pool->params.pkt.uarea_size; + uint32_t src_uarea_size = src_pool->param_uarea_size; + uint32_t dst_uarea_size = dst_pool->param_uarea_size; dsthdr->input = srchdr->input; dsthdr->dst_queue = srchdr->dst_queue; -- cgit v1.2.3 From d586855b52a70964fc5d4d3a916a03ccdbcae3bb Mon Sep 17 00:00:00 2001 From: Petri Savolainen Date: Fri, 23 Apr 2021 15:26:15 +0300 Subject: linux-gen: packet: read packet headroom from pool Read packet head- and tailroom from pool. This allows head- and tailroom to be smaller than the maximums. Signed-off-by: Petri Savolainen Reviewed-by: Matias Elo --- platform/linux-generic/odp_packet.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'platform/linux-generic/odp_packet.c') diff --git a/platform/linux-generic/odp_packet.c b/platform/linux-generic/odp_packet.c index 811a51602..533080c48 100644 --- a/platform/linux-generic/odp_packet.c +++ b/platform/linux-generic/odp_packet.c @@ -134,10 +134,11 @@ static inline void *packet_tail(odp_packet_hdr_t *pkt_hdr) static inline uint32_t seg_headroom(odp_packet_hdr_t *pkt_seg) { odp_buffer_hdr_t *hdr = &pkt_seg->buf_hdr; + pool_t *pool = hdr->pool_ptr; uint8_t *base = hdr->base_data; uint8_t *head = pkt_seg->seg_data; - return CONFIG_PACKET_HEADROOM + (head - base); + return pool->headroom + (head - base); } static inline uint32_t seg_tailroom(odp_packet_hdr_t *pkt_seg) -- cgit v1.2.3 From 297af3a32e1fab0516d37520591bc7d2801c0b63 Mon Sep 17 00:00:00 2001 From: Petri Savolainen Date: Thu, 20 May 2021 11:00:04 +0300 Subject: linux-gen: packet: implement packet disassemble and reassemble Implemented the new packet disassemble and reassemble functions, and related packet buffer accessor functions. Signed-off-by: Petri Savolainen Reviewed-by: Matias Elo --- platform/linux-generic/odp_packet.c | 156 ++++++++++++++++++++++++++++++++++++ 1 file changed, 156 insertions(+) (limited to 'platform/linux-generic/odp_packet.c') diff --git a/platform/linux-generic/odp_packet.c b/platform/linux-generic/odp_packet.c index 533080c48..65b2210d8 100644 --- a/platform/linux-generic/odp_packet.c +++ b/platform/linux-generic/odp_packet.c @@ -2950,3 +2950,159 @@ odp_packet_reass_partial_state(odp_packet_t pkt, odp_packet_t frags[], (void)res; return -ENOTSUP; } + +static inline odp_packet_hdr_t *packet_buf_to_hdr(odp_packet_buf_t pkt_buf) +{ + return (odp_packet_hdr_t *)(uintptr_t)pkt_buf; +} + +void *odp_packet_buf_head(odp_packet_buf_t pkt_buf) +{ + odp_packet_hdr_t *pkt_hdr = packet_buf_to_hdr(pkt_buf); + pool_t *pool = pkt_hdr->buf_hdr.pool_ptr; + uint32_t head_offset = sizeof(odp_packet_hdr_t) + pool->ext_param.pkt.app_header_size; + + if (odp_unlikely(pool->pool_ext == 0)) { + ODP_ERR("Not an external memory pool\n"); + return NULL; + } + + return (uint8_t *)pkt_hdr + head_offset; +} + +uint32_t odp_packet_buf_size(odp_packet_buf_t pkt_buf) +{ + odp_packet_hdr_t *pkt_hdr = packet_buf_to_hdr(pkt_buf); + pool_t *pool = pkt_hdr->buf_hdr.pool_ptr; + uint32_t head_offset = sizeof(odp_packet_hdr_t) + pool->ext_param.pkt.app_header_size; + + return pool->ext_param.pkt.buf_size - head_offset; +} + +uint32_t odp_packet_buf_data_offset(odp_packet_buf_t pkt_buf) +{ + odp_packet_hdr_t *pkt_hdr = packet_buf_to_hdr(pkt_buf); + + return (uintptr_t)pkt_hdr->seg_data - (uintptr_t)odp_packet_buf_head(pkt_buf); +} + +uint32_t odp_packet_buf_data_len(odp_packet_buf_t pkt_buf) +{ + odp_packet_hdr_t *pkt_hdr = packet_buf_to_hdr(pkt_buf); + + return pkt_hdr->seg_len; +} + +void odp_packet_buf_data_set(odp_packet_buf_t pkt_buf, uint32_t data_offset, uint32_t data_len) +{ + odp_packet_hdr_t *pkt_hdr = packet_buf_to_hdr(pkt_buf); + uint8_t *head = odp_packet_buf_head(pkt_buf); + + pkt_hdr->seg_len = data_len; + pkt_hdr->seg_data = head + data_offset; +} + +odp_packet_buf_t odp_packet_buf_from_head(odp_pool_t pool_hdl, void *head) +{ + pool_t *pool = pool_entry_from_hdl(pool_hdl); + uint32_t head_offset = sizeof(odp_packet_hdr_t) + pool->ext_param.pkt.app_header_size; + + if (odp_unlikely(pool->type != ODP_POOL_PACKET)) { + ODP_ERR("Not a packet pool\n"); + return ODP_PACKET_BUF_INVALID; + } + + if (odp_unlikely(pool->pool_ext == 0)) { + ODP_ERR("Not an external memory pool\n"); + return ODP_PACKET_BUF_INVALID; + } + + return (odp_packet_buf_t)((uintptr_t)head - head_offset); +} + +uint32_t odp_packet_disassemble(odp_packet_t pkt, odp_packet_buf_t pkt_buf[], uint32_t num) +{ + uint32_t i; + odp_packet_seg_t seg; + odp_packet_hdr_t *pkt_hdr = packet_hdr(pkt); + pool_t *pool = pkt_hdr->buf_hdr.pool_ptr; + uint32_t num_segs = odp_packet_num_segs(pkt); + + if (odp_unlikely(pool->type != ODP_POOL_PACKET)) { + ODP_ERR("Not a packet pool\n"); + return 0; + } + + if (odp_unlikely(pool->pool_ext == 0)) { + ODP_ERR("Not an external memory pool\n"); + return 0; + } + + if (odp_unlikely(num < num_segs)) { + ODP_ERR("Not enough buffer handles %u. Packet has %u segments.\n", num, num_segs); + return 0; + } + + seg = odp_packet_first_seg(pkt); + + for (i = 0; i < num_segs; i++) { + pkt_buf[i] = (odp_packet_buf_t)(uintptr_t)packet_seg_to_hdr(seg); + seg = odp_packet_next_seg(pkt, seg); + } + + return num_segs; +} + +odp_packet_t odp_packet_reassemble(odp_pool_t pool_hdl, odp_packet_buf_t pkt_buf[], uint32_t num) +{ + uint32_t i, data_len, tailroom; + odp_packet_hdr_t *cur_seg, *next_seg; + odp_packet_hdr_t *pkt_hdr = (odp_packet_hdr_t *)(uintptr_t)pkt_buf[0]; + uint32_t headroom = odp_packet_buf_data_offset(pkt_buf[0]); + + pool_t *pool = pool_entry_from_hdl(pool_hdl); + + if (odp_unlikely(pool->type != ODP_POOL_PACKET)) { + ODP_ERR("Not a packet pool\n"); + return ODP_PACKET_INVALID; + } + + if (odp_unlikely(pool->pool_ext == 0)) { + ODP_ERR("Not an external memory pool\n"); + return ODP_PACKET_INVALID; + } + + if (odp_unlikely(num == 0)) { + ODP_ERR("Bad number of buffers: %u\n", num); + return ODP_PACKET_INVALID; + } + + cur_seg = pkt_hdr; + data_len = 0; + + for (i = 0; i < num; i++) { + next_seg = NULL; + if (i < num - 1) + next_seg = (odp_packet_hdr_t *)(uintptr_t)pkt_buf[i + 1]; + + data_len += cur_seg->seg_len; + cur_seg->seg_next = next_seg; + cur_seg = next_seg; + } + + tailroom = pool->ext_param.pkt.buf_size - sizeof(odp_packet_hdr_t); + tailroom -= pool->ext_param.pkt.app_header_size; + tailroom -= odp_packet_buf_data_len(pkt_buf[num - 1]); + + pkt_hdr->seg_count = num; + pkt_hdr->frame_len = data_len; + pkt_hdr->headroom = headroom; + pkt_hdr->tailroom = tailroom; + + /* Reset metadata */ + pkt_hdr->subtype = ODP_EVENT_PACKET_BASIC; + pkt_hdr->input = ODP_PKTIO_INVALID; + packet_parse_reset(pkt_hdr, 1); + + return packet_handle(pkt_hdr); +} -- cgit v1.2.3 From fbaef1a71312b0ff75b2af5fc5ce0199ef52cfa1 Mon Sep 17 00:00:00 2001 From: Satha Rao Date: Fri, 16 Jul 2021 06:56:31 -0400 Subject: linux-gen: add implementation for Tx proto stats New Tx protocol statistics are hardware specific, so added stubs for linux generic platform. Signed-off-by: Satha Rao Reviewed-by: Janne Peltonen --- platform/linux-generic/odp_packet.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) (limited to 'platform/linux-generic/odp_packet.c') diff --git a/platform/linux-generic/odp_packet.c b/platform/linux-generic/odp_packet.c index 65b2210d8..0986056e6 100644 --- a/platform/linux-generic/odp_packet.c +++ b/platform/linux-generic/odp_packet.c @@ -18,6 +18,7 @@ #include #include #include +#include /* Inlined API functions */ #include @@ -3106,3 +3107,16 @@ odp_packet_t odp_packet_reassemble(odp_pool_t pool_hdl, odp_packet_buf_t pkt_buf return packet_handle(pkt_hdr); } + +void odp_packet_proto_stats_request(odp_packet_t pkt, odp_packet_proto_stats_opt_t *opt) +{ + (void)pkt; + (void)opt; +} + +odp_proto_stats_t odp_packet_proto_stats(odp_packet_t pkt) +{ + (void)pkt; + + return ODP_PROTO_STATS_INVALID; +} -- cgit v1.2.3