[dpdk-dev,v4,6/8] net/vdev_netvsc: skip routed netvsc probing

Message ID 1516265026-6469-7-git-send-email-matan@mellanox.com (mailing list archive)
State Superseded, archived
Headers

Checks

Context Check Description
ci/checkpatch success coding style OK
ci/Intel-compilation fail Compilation issues

Commit Message

Matan Azrad Jan. 18, 2018, 8:43 a.m. UTC
  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 <rasland@mellanox.com>
Signed-off-by: Matan Azrad <matan@mellanox.com>
---
 doc/guides/nics/vdev_netvsc.rst       |  2 +-
 drivers/net/vdev_netvsc/vdev_netvsc.c | 46 +++++++++++++++++++++++++++++++++++
 2 files changed, 47 insertions(+), 1 deletion(-)
  

Comments

Stephen Hemminger Jan. 18, 2018, 6:26 p.m. UTC | #1
On Thu, 18 Jan 2018 08:43:44 +0000
Matan Azrad <matan@mellanox.com> wrote:

> 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 <rasland@mellanox.com>
> Signed-off-by: Matan Azrad <matan@mellanox.com>

Just checking for interface IPv4 or IPv6 (non-link local) is enough.
If device has a L3 address than skip it.

No need to read route table which maybe huge in some environments.
  
Thomas Monjalon Jan. 18, 2018, 6:47 p.m. UTC | #2
18/01/2018 19:26, Stephen Hemminger:
> On Thu, 18 Jan 2018 08:43:44 +0000
> Matan Azrad <matan@mellanox.com> wrote:
> 
> > 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 <rasland@mellanox.com>
> > Signed-off-by: Matan Azrad <matan@mellanox.com>
> 
> Just checking for interface IPv4 or IPv6 (non-link local) is enough.
> If device has a L3 address than skip it.
> 
> No need to read route table which maybe huge in some environments.

Stephen, I think you are in a better position to do this improvement.
Can we accept this patch, so you can send a patch on top of it?
Such PMD improvement may be integrated in RC2.
  

Patch

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 21c3265..0055d0b 100644
--- a/drivers/net/vdev_netvsc/vdev_netvsc.c
+++ b/drivers/net/vdev_netvsc/vdev_netvsc.c
@@ -39,6 +39,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, \
@@ -198,6 +199,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
@@ -459,6 +498,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) {