DPDK теперь поддерживает шины не-PCI, так что это немного сложнее. Но все же примеров мало. Вот фрагмент из Ethtool :
struct rte_pci_device *pci_dev;
rte_eth_dev_info_get(port_id, &dev_info);
if (dev_info.device)
bus = rte_bus_find_by_device(dev_info.device);
if (bus && !strcmp(bus->name, "pci")) {
pci_dev = RTE_DEV_TO_PCI(dev_info.device);
snprintf(drvinfo->bus_info, sizeof(drvinfo->bus_info),
"%04x:%02x:%02x.%x",
pci_dev->addr.domain, pci_dev->addr.bus,
pci_dev->addr.devid, pci_dev->addr.function);
}
По сути, мы получаем шину порта DPDK. Если это PCI, можно безопасно использовать макрос RTE_DEV_TO_PCI()
. Макрос возвращает указатель на struct rte_pci_device
, который имеет адрес PCI.