Add a new public API function, and two internal wrapper functions so we can use ring as a pktdev. --- lib/librte_ring/rte_ring.c | 41 +++++++++++++++++++++++++++++++++++++++++ lib/librte_ring/rte_ring.h | 3 +++ 2 files changed, 44 insertions(+)
diff --git a/lib/librte_ring/Makefile b/lib/librte_ring/Makefile index 84ad3d3..bc5dd09 100644 --- a/lib/librte_ring/Makefile +++ b/lib/librte_ring/Makefile @@ -47,6 +47,6 @@ SRCS-$(CONFIG_RTE_LIBRTE_RING) := rte_ring.c SYMLINK-$(CONFIG_RTE_LIBRTE_RING)-include := rte_ring.h # this lib needs eal and rte_malloc -DEPDIRS-$(CONFIG_RTE_LIBRTE_RING) += lib/librte_eal lib/librte_malloc +DEPDIRS-$(CONFIG_RTE_LIBRTE_RING) += lib/librte_eal lib/librte_malloc lib/librte_pktdev include $(RTE_SDK)/mk/rte.lib.mk diff --git a/lib/librte_ring/rte_ring.c b/lib/librte_ring/rte_ring.c index c9e59d4..424da20 100644 --- a/lib/librte_ring/rte_ring.c +++ b/lib/librte_ring/rte_ring.c @@ -86,6 +86,7 @@ #include <rte_errno.h> #include <rte_string_fns.h> #include <rte_spinlock.h> +#include <rte_pktdev.h> #include "rte_ring.h" @@ -208,6 +208,47 @@ rte_ring_create(const char *name, unsigned count, int socket_id, return r; } +static uint16_t +dev_rx(void *r, struct rte_mbuf **pkts, uint16_t max_pkts) +{ + return rte_ring_dequeue_burst(r, (void *)pkts, max_pkts); +} + +static uint16_t +dev_tx(void *r, struct rte_mbuf **pkts, uint16_t max_pkts) +{ + return rte_ring_enqueue_burst(r, (void *)pkts, max_pkts); +} + +#define rte_ring_dev_data rte_pkt_dev_data + +struct rte_pkt_dev * +rte_ring_get_dev(struct rte_ring *r) +{ + struct ring_as_pktdev { + RTE_PKT_DEV_HDR(rte_ring_dev); + struct rte_ring_dev_data dev_data; + void *ring; + } *p; + if (r == NULL || + (p = rte_zmalloc(NULL, sizeof(*p), 0)) == NULL) + return NULL; + + p->ring = r; + p->rx_pkt_burst = dev_rx; + p->tx_pkt_burst = dev_tx; + p->data = &p->dev_data; + + snprintf(p->dev_data.name, sizeof(p->dev_data.name), "%s", r->name); + p->dev_data.nb_rx_queues = 1; + p->dev_data.nb_tx_queues = 1; + p->dev_data.rx_queues = &p->ring; + p->dev_data.tx_queues = &p->ring; + + return (void *)p; +} + + /* * change the high water mark. If *count* is 0, water marking is * disabled diff --git a/lib/librte_ring/rte_ring.h b/lib/librte_ring/rte_ring.h index af68888..c2f28be 100644 --- a/lib/librte_ring/rte_ring.h +++ b/lib/librte_ring/rte_ring.h @@ -301,6 +302,10 @@ int rte_ring_init(struct rte_ring *r, const char *name, unsigned count, struct rte_ring *rte_ring_create(const char *name, unsigned count, int socket_id, unsigned flags); +struct rte_pkt_dev; + +struct rte_pkt_dev *rte_ring_get_dev(struct rte_ring *r); + /** * Change the high water mark. * -- 2.1.0