Signed-off-by: Yuanhan Liu <yuanhan....@linux.intel.com>
---
 lib/librte_vhost/rte_vhost_version.map |  1 +
 lib/librte_vhost/rte_virtio_net.h      | 13 +++++++++++++
 lib/librte_vhost/vhost.c               | 30 ++++++++++++++++++++++++++++++
 lib/librte_vhost/vhost.h               |  2 ++
 4 files changed, 46 insertions(+)

diff --git a/lib/librte_vhost/rte_vhost_version.map 
b/lib/librte_vhost/rte_vhost_version.map
index 85a2796..efde936 100644
--- a/lib/librte_vhost/rte_vhost_version.map
+++ b/lib/librte_vhost/rte_vhost_version.map
@@ -37,5 +37,6 @@ DPDK_17.05 {
        rte_vhost_driver_set_features;
        rte_vhost_get_negotiated_features
        rte_vhost_get_vhost_memory;
+       rte_vhost_get_vhost_vring;
 
 } DPDK_16.07;
diff --git a/lib/librte_vhost/rte_virtio_net.h 
b/lib/librte_vhost/rte_virtio_net.h
index e7b1599..80209ad 100644
--- a/lib/librte_vhost/rte_virtio_net.h
+++ b/lib/librte_vhost/rte_virtio_net.h
@@ -80,6 +80,17 @@ struct rte_vhost_memory {
        struct rte_vhost_mem_region regions[0];
 };
 
+struct rte_vhost_vring {
+       struct vring_desc       *desc;
+       struct vring_avail      *avail;
+       struct vring_used       *used;
+       uint64_t                log_guest_addr;
+
+       int                     callfd;
+       int                     kickfd;
+       uint16_t                size;
+};
+
 /**
  * Device and vring operations.
  */
@@ -211,5 +222,7 @@ uint16_t rte_vhost_dequeue_burst(int vid, uint16_t queue_id,
 
 int rte_vhost_get_vhost_memory(int vid, struct rte_vhost_memory **mem);
 uint64_t rte_vhost_get_negotiated_features(int vid);
+int rte_vhost_get_vhost_vring(int vid, uint16_t vring_idx,
+                             struct rte_vhost_vring *vring);
 
 #endif /* _VIRTIO_NET_H_ */
diff --git a/lib/librte_vhost/vhost.c b/lib/librte_vhost/vhost.c
index 8046aef..b175f0e 100644
--- a/lib/librte_vhost/vhost.c
+++ b/lib/librte_vhost/vhost.c
@@ -375,6 +375,36 @@ struct virtio_net *
        return 0;
 }
 
+int
+rte_vhost_get_vhost_vring(int vid, uint16_t vring_idx,
+                         struct rte_vhost_vring *vring)
+{
+       struct virtio_net *dev;
+       struct vhost_virtqueue *vq;
+
+       dev = get_device(vid);
+       if (!dev)
+               return -1;
+
+       if (vring_idx > VHOST_MAX_VRING)
+               return -1;
+
+       vq = dev->virtqueue[vring_idx];
+       if (!vq)
+               return -1;
+
+       vring->desc  = vq->desc;
+       vring->avail = vq->avail;
+       vring->used  = vq->used;
+       vring->log_guest_addr  = vq->log_guest_addr;
+
+       vring->callfd  = vq->callfd;
+       vring->kickfd  = vq->kickfd;
+       vring->size    = vq->size;
+
+       return 0;
+}
+
 uint16_t
 rte_vhost_avail_entries(int vid, uint16_t queue_id)
 {
diff --git a/lib/librte_vhost/vhost.h b/lib/librte_vhost/vhost.h
index ed7b2c9..b0ef0cc 100644
--- a/lib/librte_vhost/vhost.h
+++ b/lib/librte_vhost/vhost.h
@@ -138,6 +138,8 @@ struct vhost_virtqueue {
 #ifndef VIRTIO_NET_F_MQ
  #define VIRTIO_NET_F_MQ               22
 #endif
+
+#define VHOST_MAX_VRING                        0x100
 #define VHOST_MAX_QUEUE_PAIRS          0x80
 
 /*
-- 
1.9.0

Reply via email to