NetVSC netdevices which are already routed should not be probed because
they are used for management purposes by the HyperV.

prevent routed netvsc devices probing.

Signed-off-by: Raslan Darawsheh <rasl...@mellanox.com>
Signed-off-by: Matan Azrad <ma...@mellanox.com>
---
 doc/guides/nics/vdev_netvsc.rst       |  2 +-
 drivers/net/vdev_netvsc/vdev_netvsc.c | 46 +++++++++++++++++++++++++++++++++++
 2 files changed, 47 insertions(+), 1 deletion(-)

diff --git a/doc/guides/nics/vdev_netvsc.rst b/doc/guides/nics/vdev_netvsc.rst
index fde1fb8..f779862 100644
--- a/doc/guides/nics/vdev_netvsc.rst
+++ b/doc/guides/nics/vdev_netvsc.rst
@@ -87,4 +87,4 @@ The following device parameters are supported:
   MAC address.
 
 Not specifying either ``iface`` or ``mac`` makes this driver attach itself to
-all NetVSC interfaces found on the system.
+all unrouted NetVSC interfaces found on the system.
diff --git a/drivers/net/vdev_netvsc/vdev_netvsc.c 
b/drivers/net/vdev_netvsc/vdev_netvsc.c
index 3d8895b..4295b92 100644
--- a/drivers/net/vdev_netvsc/vdev_netvsc.c
+++ b/drivers/net/vdev_netvsc/vdev_netvsc.c
@@ -38,6 +38,7 @@
 #define VDEV_NETVSC_PROBE_MS 1000
 
 #define NETVSC_CLASS_ID "{f8615163-df3e-46c5-913f-f2d2f965ed0e}"
+#define NETVSC_MAX_ROUTE_LINE_SIZE 300
 
 #define DRV_LOG(level, ...) \
        rte_log(RTE_LOG_ ## level, \
@@ -192,6 +193,44 @@ static LIST_HEAD(, vdev_netvsc_ctx) vdev_netvsc_ctx_list =
 }
 
 /**
+ * Determine if a network interface has a route.
+ *
+ * @param[in] name
+ *   Network device name.
+ *
+ * @return
+ *   A nonzero value when interface has an route. In case of error,
+ *   rte_errno is updated and 0 returned.
+ */
+static int
+vdev_netvsc_has_route(const char *name)
+{
+       FILE *fp;
+       int ret = 0;
+       char route[NETVSC_MAX_ROUTE_LINE_SIZE];
+       char *netdev;
+
+       fp = fopen("/proc/net/route", "r");
+       if (!fp) {
+               rte_errno = errno;
+               return 0;
+       }
+       while (fgets(route, NETVSC_MAX_ROUTE_LINE_SIZE, fp) != NULL) {
+               netdev = strtok(route, "\t");
+               if (strcmp(netdev, name) == 0) {
+                       ret = 1;
+                       break;
+               }
+               /* Move file pointer to the next line. */
+               while (strchr(route, '\n') == NULL &&
+                      fgets(route, NETVSC_MAX_ROUTE_LINE_SIZE, fp) != NULL)
+                       ;
+       }
+       fclose(fp);
+       return ret;
+}
+
+/**
  * Retrieve network interface data from sysfs symbolic link.
  *
  * @param[out] buf
@@ -453,6 +492,13 @@ static LIST_HEAD(, vdev_netvsc_ctx) vdev_netvsc_ctx_list =
                        iface->if_name, iface->if_index);
                return 0;
        }
+       /* Routed NetVSC should not be probed. */
+       if (vdev_netvsc_has_route(iface->if_name)) {
+               DRV_LOG(WARNING, "NetVSC interface \"%s\" (index %u) is routed",
+                       iface->if_name, iface->if_index);
+               if (!specified)
+                       return 0;
+       }
        /* Create interface context. */
        ctx = calloc(1, sizeof(*ctx));
        if (!ctx) {
-- 
1.8.3.1

Reply via email to