[dpdk-dev,v6,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(-)
@@ -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) {