[dpdk-dev,v4,6/8] net/vdev_netvsc: skip routed netvsc probing
Checks
Commit Message
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
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.
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.
@@ -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.
@@ -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) {