rte_vhost_driver_enable_features;
        rte_vhost_driver_get_features;
        rte_vhost_driver_set_features;
+       rte_vhost_get_mem_table;
        rte_vhost_get_mtu;
 
 } DPDK_16.07;
 
 /* Enum for virtqueue management. */
 enum {VIRTIO_RXQ, VIRTIO_TXQ, VIRTIO_QNUM};
 
+/**
+ * Information relating to memory regions including offsets to
+ * addresses in QEMUs memory file.
+ */
+struct rte_vhost_mem_region {
+       uint64_t guest_phys_addr;
+       uint64_t guest_user_addr;
+       uint64_t host_user_addr;
+       uint64_t size;
+       void     *mmap_addr;
+       uint64_t mmap_size;
+       int fd;
+};
+
+/**
+ * Memory structure includes region and mapping information.
+ */
+struct rte_vhost_memory {
+       uint32_t nregions;
+       struct rte_vhost_mem_region regions[0];
+};
+
 /**
  * Device and vring operations.
  */
 uint16_t rte_vhost_dequeue_burst(int vid, uint16_t queue_id,
        struct rte_mempool *mbuf_pool, struct rte_mbuf **pkts, uint16_t count);
 
+/**
+ * Get guest mem table: a list of memory regions.
+ *
+ * An rte_vhost_vhost_memory object will be allocated internaly, to hold the
+ * guest memory regions. Application should free it at destroy_device()
+ * callback.
+ *
+ * @param vid
+ *  vhost device ID
+ * @param mem
+ *  To store the returned mem regions
+ * @return
+ *  0 on success, -1 on failure
+ */
+int rte_vhost_get_mem_table(int vid, struct rte_vhost_memory **mem);
+
 #endif /* _VIRTIO_NET_H_ */
 
        return 0;
 }
 
+int
+rte_vhost_get_mem_table(int vid, struct rte_vhost_memory **mem)
+{
+       struct virtio_net *dev;
+       struct rte_vhost_memory *m;
+       size_t size;
+
+       dev = get_device(vid);
+       if (!dev)
+               return -1;
+
+       size = dev->mem->nregions * sizeof(struct rte_vhost_mem_region);
+       m = malloc(size);
+       if (!m)
+               return -1;
+
+       m->nregions = dev->mem->nregions;
+       memcpy(m->regions, dev->mem->regions, size);
+       *mem = m;
+
+       return 0;
+}
+
 uint16_t
 rte_vhost_avail_entries(int vid, uint16_t queue_id)
 {
 
  */
 struct virtio_net {
        /* Frontend (QEMU) memory and memory region information */
-       struct virtio_memory    *mem;
+       struct rte_vhost_memory *mem;
        uint64_t                features;
        uint64_t                protocol_features;
        int                     vid;
        struct guest_page       *guest_pages;
 } __rte_cache_aligned;
 
-/**
- * Information relating to memory regions including offsets to
- * addresses in QEMUs memory file.
- */
-struct virtio_memory_region {
-       uint64_t guest_phys_addr;
-       uint64_t guest_user_addr;
-       uint64_t host_user_addr;
-       uint64_t size;
-       void     *mmap_addr;
-       uint64_t mmap_size;
-       int fd;
-};
-
-
-/**
- * Memory structure includes region and mapping information.
- */
-struct virtio_memory {
-       uint32_t nregions;
-       struct virtio_memory_region regions[0];
-};
-
-
 /* Macros for printing using RTE_LOG */
 #define RTE_LOGTYPE_VHOST_CONFIG RTE_LOGTYPE_USER1
 #define RTE_LOGTYPE_VHOST_DATA   RTE_LOGTYPE_USER1
 static inline uint64_t __attribute__((always_inline))
 gpa_to_vva(struct virtio_net *dev, uint64_t gpa)
 {
-       struct virtio_memory_region *reg;
+       struct rte_vhost_mem_region *reg;
        uint32_t i;
 
        for (i = 0; i < dev->mem->nregions; i++) {
 
 free_mem_region(struct virtio_net *dev)
 {
        uint32_t i;
-       struct virtio_memory_region *reg;
+       struct rte_vhost_mem_region *reg;
 
        if (!dev || !dev->mem)
                return;
 static uint64_t
 qva_to_vva(struct virtio_net *dev, uint64_t qva)
 {
-       struct virtio_memory_region *reg;
+       struct rte_vhost_mem_region *reg;
        uint32_t i;
 
        /* Find the region where the address lives. */
 }
 
 static void
-add_guest_pages(struct virtio_net *dev, struct virtio_memory_region *reg,
+add_guest_pages(struct virtio_net *dev, struct rte_vhost_mem_region *reg,
                uint64_t page_size)
 {
        uint64_t reg_size = reg->size;
 vhost_user_set_mem_table(struct virtio_net *dev, struct VhostUserMsg *pmsg)
 {
        struct VhostUserMemory memory = pmsg->payload.memory;
-       struct virtio_memory_region *reg;
+       struct rte_vhost_mem_region *reg;
        void *mmap_addr;
        uint64_t mmap_size;
        uint64_t mmap_offset;
                                                sizeof(struct guest_page));
        }
 
-       dev->mem = rte_zmalloc("vhost-mem-table", sizeof(struct virtio_memory) +
-               sizeof(struct virtio_memory_region) * memory.nregions, 0);
+       dev->mem = rte_zmalloc("vhost-mem-table", sizeof(struct rte_vhost_memory) +
+               sizeof(struct rte_vhost_mem_region) * memory.nregions, 0);
        if (dev->mem == NULL) {
                RTE_LOG(ERR, VHOST_CONFIG,
                        "(%d) failed to allocate memory for dev->mem\n",