- u8 * s;
- int fd;
-
- fd = open (file_name, O_WRONLY);
- if (fd < 0)
- return clib_error_return_unix (0, "open `%s'", file_name);
-
- va_list va;
- va_start (va, fmt);
- s = va_format (0, fmt, &va);
- va_end (va);
- vec_add1 (s, 0); // terminate c string
-
- if (write (fd, s, vec_len (s)) < 0)
- return clib_error_return_unix (0, "write '%s' to '%s'", s, file_name);
-
- vec_free (s);
- close (fd);
- return 0;
-}
-
-#define VIRTIO_PCI_NAME "virtio-pci"
-
-static clib_error_t * dpdk_bind_eth_kernel_drivers (vlib_main_t * vm,
- char * pci_dev_id,
- char * kernel_driver)
-{
- dpdk_main_t * dm = &dpdk_main;
- unformat_input_t _in;
- unformat_input_t * in = &_in;
- clib_error_t * error = 0;
- u8 * line = 0, * modcmd = 0, * path = 0;
- u8 * pci_vid = 0, *pci_did = 0, * devname = 0;
- char *driver_name = kernel_driver;
- FILE * fp;
-
- /*
- * Bail out now if we're not running as root.
- * This allows non-privileged use of the packet generator, etc.
- */
- if (geteuid() != 0)
- return 0;
-
- /*
- * Get all ethernet pci device numbers for the device type specified.
- */
- modcmd = format (0, "lspci -nDd %s | grep 0200 | "
- "awk '{ print $1, $3 }'%c", pci_dev_id, 0);
- if ((fp = popen ((const char *)modcmd, "r")) == NULL)
- {
- error = clib_error_return_unix (0,
- "Unable to get %s ethernet pci devices.",
- pci_dev_id);
- goto done;
- }
-
- vec_validate (line, BUFSIZ);
- vec_validate (path, BUFSIZ);
- while (fgets ((char *)line, BUFSIZ, fp) != NULL)
- {
- struct stat st;
- u8 bind_uio = 1;
- line[strlen ((char *)line) - 1] = 0; // chomp trailing newline.
-
- unformat_init_string (in, (char *)line, strlen((char *)line) + 1);
- unformat(in, "%s %s:%s", &devname, &pci_vid, &pci_did);
- unformat_free (in);
-
- /*
- * Blacklist all ethernet interfaces in the
- * linux IP routing tables (route --inet --inet6)
- */
- if (strstr ((char *)dm->eth_if_blacklist, (char *)devname))
- continue;
-
- /*
- * If there are any devices whitelisted, then blacklist all devices
- * which are not explicitly whitelisted.
- */
- if (dm->eth_if_whitelist &&
- !strstr ((char *)dm->eth_if_whitelist, (char *)devname))
- continue;
-
-#ifdef NETMAP
- /*
- * Optimistically open the device as a netmap device.
- */
- if (eth_nm_open((char *)devname))
+ vlib_pci_main_t * pm = &pci_main;
+ clib_error_t * error;
+ vlib_pci_device_t * d;
+ pci_config_header_t * c;
+ u8 * pci_addr = 0;
+
+ pool_foreach (d, pm->pci_devs, ({
+ c = &d->config0.header;
+ vec_reset_length (pci_addr);
+ pci_addr = format (pci_addr, "%U%c", format_vlib_pci_addr, &d->bus_address, 0);
+
+ if (c->device_class != PCI_CLASS_NETWORK_ETHERNET)
+ continue;
+
+ /* if whitelist exists process only whitelisted devices */
+ if (dm->eth_if_whitelist &&
+ !strstr ((char *) dm->eth_if_whitelist, (char *) pci_addr))
+ continue;
+
+ /* virtio */
+ if (c->vendor_id == 0x1af4 && c->device_id == 0x1000)
+ ;
+ /* vmxnet3 */
+ else if (c->vendor_id == 0x15ad && c->device_id == 0x07b0)
+ ;
+ /* all Intel devices */
+ else if (c->vendor_id == 0x8086)
+ ;
+ /* Cisco VIC */
+ else if (c->vendor_id == 0x1137 && c->device_id == 0x0043)
+ ;
+ /* Chelsio T4/T5 */
+ else if (c->vendor_id == 0x1425 && (c->device_id & 0xe000) == 0x4000)
+ ;
+ else
+ {
+ clib_warning ("Unsupported Ethernet PCI device 0x%04x:0x%04x found "
+ "at PCI address %s\n", (u16) c->vendor_id, (u16) c->device_id,
+ pci_addr);