Hi All,

FOREACH_DEVICE_ON_VMBUS needs rte_vmbus_bus to work on

If static link to libdpdk.a : no issues

If dynamic link to *.so: linker issue, global variable not found.

 

I suggest this patch to get a current rte_vmbus_bus struct:

Thanks.

 

 

diff --git a/dpdk-20.11/drivers/bus/vmbus/rte_bus_vmbus.h b/dpdk-20.11/drivers/bus/vmbus/rte_bus_vmbus.h

--- a/dpdk-20.11/drivers/bus/vmbus/rte_bus_vmbus.h

+++ b/dpdk-20.11/drivers/bus/vmbus/rte_bus_vmbus.h

@@ -414,6 +414,16 @@

               }                                                                                              \

               RTE_PMD_EXPORT_NAME(nm, __COUNTER__)

+/**

+ * Gets the global rte_vmbus_bus struct

+ *

+ * @param bus

+ *          Pointer to rte_vmbus_bus structure.

+ * @return

+ *          Return 0 if success.

+ */

+int rte_vmbus_get_bus(struct rte_vmbus_bus *bus);

+

#ifdef __cplusplus

}

#endif

diff --git a/dpdk-20.11/drivers/bus/vmbus/version.map b/dpdk-20.11/drivers/bus/vmbus/version.map

--- a/dpdk-20.11/drivers/bus/vmbus/version.map

+++ b/dpdk-20.11/drivers/bus/vmbus/version.map

@@ -23,6 +23,7 @@

               rte_vmbus_subchan_open;

               rte_vmbus_unmap_device;

               rte_vmbus_unregister;

+             rte_vmbus_get_bus;

                local: *;

};

diff --git a/dpdk-20.11/drivers/bus/vmbus/vmbus_common.c b/dpdk-20.11/drivers/bus/vmbus/vmbus_common.c

--- a/dpdk-20.11/drivers/bus/vmbus/vmbus_common.c

+++ b/dpdk-20.11/drivers/bus/vmbus/vmbus_common.c

@@ -25,6 +25,17 @@

 extern struct rte_vmbus_bus rte_vmbus_bus;

+/* Gets the global rte_vmbus_bus struct*/

+int rte_vmbus_get_bus(struct rte_vmbus_bus *bus){

+

+  if (!bus)

+    return 1;

+

+  memcpy(bus, &rte_vmbus_bus, sizeof(struct rte_vmbus_bus));

+

+  return 0;

+}

+

/* map a particular resource from a file */

void *

vmbus_map_resource(void *requested_addr, int fd, off_t offset, size_t size,