If a system is using deterministic interface names, it may be easier in
some cases to use the interface name to blacklist an interface.

Signed-off-by: Chas Williams <3chas3 at gmail.com>
---
 app/test/test_devargs.c                     |  2 ++
 lib/librte_eal/common/eal_common_devargs.c  |  8 ++++++++
 lib/librte_eal/common/eal_common_options.c  | 10 ++++++++++
 lib/librte_eal/common/eal_common_pci.c      | 17 +++++++++++------
 lib/librte_eal/common/eal_options.h         |  2 ++
 lib/librte_eal/common/include/rte_devargs.h |  5 +++++
 lib/librte_eal/common/include/rte_pci.h     |  1 +
 lib/librte_eal/linuxapp/eal/eal_pci.c       | 15 +++++++++++++++
 8 files changed, 54 insertions(+), 6 deletions(-)

diff --git a/app/test/test_devargs.c b/app/test/test_devargs.c
index f7fc59c..c204c49 100644
--- a/app/test/test_devargs.c
+++ b/app/test/test_devargs.c
@@ -85,6 +85,8 @@ test_devargs(void)
                goto fail;
        if (rte_eal_devargs_type_count(RTE_DEVTYPE_VIRTUAL) != 2)
                goto fail;
+       if (rte_eal_devargs_add(RTE_DEVTYPE_BLACKLISTED_NAME, "eth0") < 0)
+               goto fail;
        free_devargs_list();

        /* check virtual device with argument parsing */
diff --git a/lib/librte_eal/common/eal_common_devargs.c 
b/lib/librte_eal/common/eal_common_devargs.c
index ec56165..cac651b 100644
--- a/lib/librte_eal/common/eal_common_devargs.c
+++ b/lib/librte_eal/common/eal_common_devargs.c
@@ -113,6 +113,14 @@ rte_eal_devargs_add(enum rte_devtype devtype, const char 
*devargs_str)
                        goto fail;

                break;
+       case RTE_DEVTYPE_BLACKLISTED_NAME:
+               /* save interface name */
+               ret = snprintf(devargs->name.name,
+                              sizeof(devargs->name.name), "%s", buf);
+               if (ret < 0 || ret >= (int)sizeof(devargs->name.name))
+                       goto fail;
+
+               break;
        }

        free(buf);
diff --git a/lib/librte_eal/common/eal_common_options.c 
b/lib/librte_eal/common/eal_common_options.c
index 1f459ac..c08126d 100644
--- a/lib/librte_eal/common/eal_common_options.c
+++ b/lib/librte_eal/common/eal_common_options.c
@@ -90,6 +90,7 @@ eal_long_options[] = {
        {OPT_VFIO_INTR,         1, NULL, OPT_VFIO_INTR_NUM        },
        {OPT_VMWARE_TSC_MAP,    0, NULL, OPT_VMWARE_TSC_MAP_NUM   },
        {OPT_XEN_DOM0,          0, NULL, OPT_XEN_DOM0_NUM         },
+       {OPT_BLACKLISTED_NAME,  1, NULL, OPT_BLACKLISTED_NAME_NUM },
        {0,                     0, NULL, 0                        }
 };

@@ -785,6 +786,13 @@ eal_parse_common_option(int opt, const char *optarg,
                }
                break;

+       case OPT_BLACKLISTED_NAME_NUM:
+               if (rte_eal_devargs_add(RTE_DEVTYPE_BLACKLISTED_NAME,
+                               optarg) < 0) {
+                       return -1;
+               }
+               break;
+
        /* don't know what to do, leave this to caller */
        default:
                return 1;
@@ -898,6 +906,8 @@ eal_common_usage(void)
               "  --"OPT_VDEV"              Add a virtual device.\n"
               "                      The argument format is 
<driver><id>[,key=val,...]\n"
               "                      (ex: --vdev=eth_pcap0,iface=eth2).\n"
+              "  --"OPT_BLACKLISTED_NAME" Add a device name to the black 
list.\n"
+              "                      Prevent EAL from using this named 
interface.\n"
               "  --"OPT_VMWARE_TSC_MAP"    Use VMware TSC map instead of 
native RDTSC\n"
               "  --"OPT_PROC_TYPE"         Type of this process 
(primary|secondary|auto)\n"
               "  --"OPT_SYSLOG"            Set syslog facility\n"
diff --git a/lib/librte_eal/common/eal_common_pci.c 
b/lib/librte_eal/common/eal_common_pci.c
index dcfe947..41a7690 100644
--- a/lib/librte_eal/common/eal_common_pci.c
+++ b/lib/librte_eal/common/eal_common_pci.c
@@ -90,11 +90,15 @@ static struct rte_devargs *pci_devargs_lookup(struct 
rte_pci_device *dev)
        struct rte_devargs *devargs;

        TAILQ_FOREACH(devargs, &devargs_list, next) {
-               if (devargs->type != RTE_DEVTYPE_BLACKLISTED_PCI &&
-                       devargs->type != RTE_DEVTYPE_WHITELISTED_PCI)
-                       continue;
-               if (!rte_eal_compare_pci_addr(&dev->addr, &devargs->pci.addr))
-                       return devargs;
+               if (devargs->type == RTE_DEVTYPE_BLACKLISTED_PCI ||
+                       devargs->type == RTE_DEVTYPE_WHITELISTED_PCI) {
+                       if (!rte_eal_compare_pci_addr(&dev->addr, 
&devargs->pci.addr))
+                               return devargs;
+               }
+               if (devargs->type == RTE_DEVTYPE_BLACKLISTED_NAME) {
+                       if (strcmp(dev->name, devargs->name.name) == 0)
+                               return devargs;
+               }
        }
        return NULL;
 }
@@ -174,7 +178,8 @@ rte_eal_pci_probe_one_driver(struct rte_pci_driver *dr, 
struct rte_pci_device *d

                /* no initialization when blacklisted, return without error */
                if (dev->devargs != NULL &&
-                       dev->devargs->type == RTE_DEVTYPE_BLACKLISTED_PCI) {
+                       (dev->devargs->type == RTE_DEVTYPE_BLACKLISTED_PCI ||
+                        dev->devargs->type == RTE_DEVTYPE_BLACKLISTED_NAME)) {
                        RTE_LOG(DEBUG, EAL, "  Device is blacklisted, not 
initializing\n");
                        return 1;
                }
diff --git a/lib/librte_eal/common/eal_options.h 
b/lib/librte_eal/common/eal_options.h
index f6714d9..2aea553 100644
--- a/lib/librte_eal/common/eal_options.h
+++ b/lib/librte_eal/common/eal_options.h
@@ -45,6 +45,8 @@ enum {
        /* first long only option value must be >= 256, so that we won't
         * conflict with short options */
        OPT_LONG_MIN_NUM = 256,
+#define OPT_BLACKLISTED_NAME  "blacklisted-name"
+       OPT_BLACKLISTED_NAME_NUM,
 #define OPT_BASE_VIRTADDR     "base-virtaddr"
        OPT_BASE_VIRTADDR_NUM,
 #define OPT_CREATE_UIO_DEV    "create-uio-dev"
diff --git a/lib/librte_eal/common/include/rte_devargs.h 
b/lib/librte_eal/common/include/rte_devargs.h
index 7084ae2..8531405 100644
--- a/lib/librte_eal/common/include/rte_devargs.h
+++ b/lib/librte_eal/common/include/rte_devargs.h
@@ -59,6 +59,7 @@ enum rte_devtype {
        RTE_DEVTYPE_WHITELISTED_PCI,
        RTE_DEVTYPE_BLACKLISTED_PCI,
        RTE_DEVTYPE_VIRTUAL,
+       RTE_DEVTYPE_BLACKLISTED_NAME,
 };

 /**
@@ -87,6 +88,10 @@ struct rte_devargs {
                        /** Driver name. */
                        char drv_name[32];
                } virtual;
+               struct {
+                       /** Interface name. */
+                       char name[32];
+               } name;
        };
        /** Arguments string as given by user or "" for no argument. */
        char *args;
diff --git a/lib/librte_eal/common/include/rte_pci.h 
b/lib/librte_eal/common/include/rte_pci.h
index 83e3c28..852c149 100644
--- a/lib/librte_eal/common/include/rte_pci.h
+++ b/lib/librte_eal/common/include/rte_pci.h
@@ -161,6 +161,7 @@ struct rte_pci_device {
        struct rte_pci_resource mem_resource[PCI_MAX_RESOURCE];   /**< PCI 
Memory Resource */
        struct rte_intr_handle intr_handle;     /**< Interrupt handle */
        struct rte_pci_driver *driver;          /**< Associated driver */
+       char name[32];                          /**< Interface name (if any) */
        uint16_t max_vfs;                       /**< sriov enable if not zero */
        int numa_node;                          /**< NUMA node connection */
        struct rte_devargs *devargs;            /**< Device user arguments */
diff --git a/lib/librte_eal/linuxapp/eal/eal_pci.c 
b/lib/librte_eal/linuxapp/eal/eal_pci.c
index bc5b5be..c417d01 100644
--- a/lib/librte_eal/linuxapp/eal/eal_pci.c
+++ b/lib/librte_eal/linuxapp/eal/eal_pci.c
@@ -260,6 +260,8 @@ pci_scan_one(const char *dirname, uint16_t domain, uint8_t 
bus,
        unsigned long tmp;
        struct rte_pci_device *dev;
        char driver[PATH_MAX];
+       struct dirent *e;
+       DIR *dir;
        int ret;

        dev = malloc(sizeof(*dev));
@@ -352,6 +354,19 @@ pci_scan_one(const char *dirname, uint16_t domain, uint8_t 
bus,
                return -1;
        }

+       /* get network interface name */
+       snprintf(filename, sizeof(filename), "%s/net", dirname);
+       dir = opendir(filename);
+       if (dir) {
+               while ((e = readdir(dir)) != NULL) {
+                       if (e->d_name[0] == '.')
+                               continue;
+
+                       strcpy(dev->name, e->d_name);
+               }
+               closedir(dir);
+       }
+
        if (!ret) {
                if (!strcmp(driver, "vfio-pci"))
                        dev->kdrv = RTE_KDRV_VFIO;
-- 
2.1.0

Reply via email to