diff options
author | Zoltan Kiss <zoltan.kiss@linaro.org> | 2015-04-17 14:29:32 +0100 |
---|---|---|
committer | Zoltan Kiss <zoltan.kiss@linaro.org> | 2015-04-23 21:08:26 +0100 |
commit | 6f454ea25c56ed37963fdaf7ac3a1ff1e4ec8097 (patch) | |
tree | 5e9630cce450ed6a5b8527e8cf26a17c2d28d3e6 | |
parent | 654890f132ce220e661d100c6297c9469e4f96e9 (diff) |
packet: implement odp_packet_pool() and odp_packet_input()
For odp_packet_input() pktio has to be adjusted as well to store the
odp_pktio_t in the pool structure.
A few header file dependencies are also fixed.
Signed-off-by: Zoltan Kiss <zoltan.kiss@linaro.org>
-rw-r--r-- | platform/linux-dpdk/include/odp_packet_io_internal.h | 1 | ||||
-rw-r--r-- | platform/linux-dpdk/include/odp_pool_internal.h | 2 | ||||
-rw-r--r-- | platform/linux-dpdk/odp_packet.c | 14 | ||||
-rw-r--r-- | platform/linux-dpdk/odp_packet_io.c | 13 | ||||
-rw-r--r-- | platform/linux-dpdk/odp_pool.c | 1 |
5 files changed, 28 insertions, 3 deletions
diff --git a/platform/linux-dpdk/include/odp_packet_io_internal.h b/platform/linux-dpdk/include/odp_packet_io_internal.h index eb81fc054..2a8e32633 100644 --- a/platform/linux-dpdk/include/odp_packet_io_internal.h +++ b/platform/linux-dpdk/include/odp_packet_io_internal.h @@ -22,6 +22,7 @@ extern "C" { #include <odp_packet_socket.h> #include <odp_align_internal.h> #include <odp_packet_dpdk.h> +#include <odp/queue.h> /** * Packet IO types diff --git a/platform/linux-dpdk/include/odp_pool_internal.h b/platform/linux-dpdk/include/odp_pool_internal.h index f8d2ee51a..6c95dffdf 100644 --- a/platform/linux-dpdk/include/odp_pool_internal.h +++ b/platform/linux-dpdk/include/odp_pool_internal.h @@ -21,6 +21,7 @@ extern "C" { #include <odp/std_types.h> #include <odp/pool.h> #include <odp_buffer_internal.h> +#include <odp/packet_io.h> #include <odp/align.h> #include <odp/hints.h> #include <odp/config.h> @@ -55,6 +56,7 @@ struct pool_entry_s { odp_pool_param_t params; odp_pool_t pool_hdl; struct rte_mempool *rte_mempool; + odp_pktio_t pktio; }; typedef union pool_entry_u { diff --git a/platform/linux-dpdk/odp_packet.c b/platform/linux-dpdk/odp_packet.c index b4edc8adb..0de573185 100644 --- a/platform/linux-dpdk/odp_packet.c +++ b/platform/linux-dpdk/odp_packet.c @@ -226,6 +226,11 @@ void *odp_packet_offset(odp_packet_t pkt, uint32_t offset, uint32_t *len, } } +odp_pool_t odp_packet_pool(odp_packet_t pkt) +{ + return odp_packet_hdr(pkt)->buf_hdr.pool_hdl; +} + void *odp_packet_l2_ptr(odp_packet_t pkt, uint32_t *len) { const size_t offset = odp_packet_l2_offset(pkt); @@ -740,8 +745,11 @@ int odp_packet_copydata_out(odp_packet_t pkt ODP_UNUSED, ODP_ABORT(""); } -odp_pktio_t odp_packet_input(odp_packet_t pkt ODP_UNUSED) + +odp_pktio_t odp_packet_input(odp_packet_t pkt) { - ODP_UNIMPLEMENTED(); - ODP_ABORT(""); + odp_pool_t pool_hdl = odp_buffer_pool(_odp_packet_to_buffer(pkt)); + uint32_t pool_id = pool_handle_to_index(pool_hdl); + pool_entry_t *pool = get_pool_entry(pool_id); + return pool->s.pktio; } diff --git a/platform/linux-dpdk/odp_packet_io.c b/platform/linux-dpdk/odp_packet_io.c index 3eb888cc6..546f0fd54 100644 --- a/platform/linux-dpdk/odp_packet_io.c +++ b/platform/linux-dpdk/odp_packet_io.c @@ -153,6 +153,8 @@ odp_pktio_t odp_pktio_open(const char *dev, odp_pool_t pool) odp_pktio_t id; pktio_entry_t *pktio_entry; int res; + uint32_t pool_id; + pool_entry_t *pool_entry; ODP_DBG("Allocating dpdk pktio\n"); @@ -172,6 +174,10 @@ odp_pktio_t odp_pktio_open(const char *dev, odp_pool_t pool) id = ODP_PKTIO_INVALID; } + pool_id = pool_handle_to_index(pool); + pool_entry = get_pool_entry(pool_id); + pool_entry->s.pktio = id; + unlock_entry(pktio_entry); return id; } @@ -180,6 +186,8 @@ int odp_pktio_close(odp_pktio_t id) { pktio_entry_t *entry; int res = -1; + uint32_t pool_id; + pool_entry_t *pool_entry; entry = get_entry(id); if (entry == NULL) @@ -190,6 +198,11 @@ int odp_pktio_close(odp_pktio_t id) res = close_pkt_dpdk(&entry->s.pkt_dpdk); res |= free_pktio_entry(id); } + + pool_id = pool_handle_to_index(entry->s.pkt_dpdk.pool); + pool_entry = get_pool_entry(pool_id); + pool_entry->s.pktio = ODP_PKTIO_INVALID; + unlock_entry(entry); if (res != 0) diff --git a/platform/linux-dpdk/odp_pool.c b/platform/linux-dpdk/odp_pool.c index dc84ff49c..f2c8ab7e7 100644 --- a/platform/linux-dpdk/odp_pool.c +++ b/platform/linux-dpdk/odp_pool.c @@ -425,6 +425,7 @@ int odp_pool_destroy(odp_pool_t pool_hdl) uint32_t pool_id = pool_handle_to_index(pool_hdl); pool_entry_t *pool = get_pool_entry(pool_id); pool->s.rte_mempool = NULL; + /* The pktio supposed to be closed by now */ return 0; } |