[dpdk-dev] [PATCH v3 7/8] net/vdev_netvsc: add "force" parameter

Matan Azrad matan at mellanox.com
Tue Jan 9 15:47:32 CET 2018


This parameter allows specifying any non-NetVSC interface or routed
NetVSC interfaces to use with tap sub-devices for development purposes.

Signed-off-by: Adrien Mazarguil <adrien.mazarguil at 6wind.com>
Signed-off-by: Matan Azrad <matan at mellanox.com>
---
 doc/guides/nics/vdev_netvsc.rst       |  5 +++++
 drivers/net/vdev_netvsc/vdev_netvsc.c | 30 +++++++++++++++++++-----------
 2 files changed, 24 insertions(+), 11 deletions(-)

diff --git a/doc/guides/nics/vdev_netvsc.rst b/doc/guides/nics/vdev_netvsc.rst
index f779862..3c26990 100644
--- a/doc/guides/nics/vdev_netvsc.rst
+++ b/doc/guides/nics/vdev_netvsc.rst
@@ -86,5 +86,10 @@ The following device parameters are supported:
   Same as ``iface`` except a suitable NetVSC interface is located using its
   MAC address.
 
+- ``force`` [int]
+
+  If nonzero, forces the use of specified interfaces even if not detected as
+  NetVSC or detected as routed NETVSC.
+
 Not specifying either ``iface`` or ``mac`` makes this driver attach itself to
 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 4295b92..301f9b6 100644
--- a/drivers/net/vdev_netvsc/vdev_netvsc.c
+++ b/drivers/net/vdev_netvsc/vdev_netvsc.c
@@ -35,6 +35,7 @@
 #define VDEV_NETVSC_DRIVER net_vdev_netvsc
 #define VDEV_NETVSC_ARG_IFACE "iface"
 #define VDEV_NETVSC_ARG_MAC "mac"
+#define VDEV_NETVSC_ARG_FORCE "force"
 #define VDEV_NETVSC_PROBE_MS 1000
 
 #define NETVSC_CLASS_ID "{f8615163-df3e-46c5-913f-f2d2f965ed0e}"
@@ -413,6 +414,9 @@ static LIST_HEAD(, vdev_netvsc_ctx) vdev_netvsc_ctx_list =
  *   - struct rte_kvargs *kvargs:
  *     Device arguments provided to current driver instance.
  *
+ *   - int force:
+ *     Accept specified interface even if not detected as NetVSC.
+ *
  *   - unsigned int specified:
  *     Number of specific netdevices provided as device arguments.
  *
@@ -430,6 +434,7 @@ static LIST_HEAD(, vdev_netvsc_ctx) vdev_netvsc_ctx_list =
 {
 	const char *name = va_arg(ap, const char *);
 	struct rte_kvargs *kvargs = va_arg(ap, struct rte_kvargs *);
+	int force = va_arg(ap, int);
 	unsigned int specified = va_arg(ap, unsigned int);
 	unsigned int *matched = va_arg(ap, unsigned int *);
 	unsigned int i;
@@ -484,20 +489,18 @@ static LIST_HEAD(, vdev_netvsc_ctx) vdev_netvsc_ctx_list =
 		return 0;
 	}
 	if (!vdev_netvsc_iface_is_netvsc(iface)) {
-		if (!specified)
+		if (!specified || !force)
 			return 0;
 		DRV_LOG(WARNING,
-			"interface \"%s\" (index %u) is not NetVSC,"
-			" skipping",
+			"using non-NetVSC interface \"%s\" (index %u)",
 			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)
+		if (!specified || !force)
 			return 0;
+		DRV_LOG(WARNING, "using routed NetVSC interface \"%s\""
+			" (index %u)", iface->if_name, iface->if_index);
 	}
 	/* Create interface context. */
 	ctx = calloc(1, sizeof(*ctx));
@@ -591,6 +594,7 @@ static LIST_HEAD(, vdev_netvsc_ctx) vdev_netvsc_ctx_list =
 	static const char *const vdev_netvsc_arg[] = {
 		VDEV_NETVSC_ARG_IFACE,
 		VDEV_NETVSC_ARG_MAC,
+		VDEV_NETVSC_ARG_FORCE,
 		NULL,
 	};
 	const char *name = rte_vdev_device_name(dev);
@@ -599,6 +603,7 @@ static LIST_HEAD(, vdev_netvsc_ctx) vdev_netvsc_ctx_list =
 						     vdev_netvsc_arg);
 	unsigned int specified = 0;
 	unsigned int matched = 0;
+	int force = 0;
 	unsigned int i;
 	int ret;
 
@@ -610,14 +615,16 @@ static LIST_HEAD(, vdev_netvsc_ctx) vdev_netvsc_ctx_list =
 	for (i = 0; i != kvargs->count; ++i) {
 		const struct rte_kvargs_pair *pair = &kvargs->pairs[i];
 
-		if (!strcmp(pair->key, VDEV_NETVSC_ARG_IFACE) ||
-		    !strcmp(pair->key, VDEV_NETVSC_ARG_MAC))
+		if (!strcmp(pair->key, VDEV_NETVSC_ARG_FORCE))
+			force = !!atoi(pair->value);
+		else if (!strcmp(pair->key, VDEV_NETVSC_ARG_IFACE) ||
+			 !strcmp(pair->key, VDEV_NETVSC_ARG_MAC))
 			++specified;
 	}
 	rte_eal_alarm_cancel(vdev_netvsc_alarm, NULL);
 	/* Gather interfaces. */
 	ret = vdev_netvsc_foreach_iface(vdev_netvsc_netvsc_probe, name, kvargs,
-					specified, &matched);
+					force, specified, &matched);
 	if (ret < 0)
 		goto error;
 	if (matched < specified)
@@ -676,7 +683,8 @@ static LIST_HEAD(, vdev_netvsc_ctx) vdev_netvsc_ctx_list =
 RTE_PMD_REGISTER_ALIAS(VDEV_NETVSC_DRIVER, eth_vdev_netvsc);
 RTE_PMD_REGISTER_PARAM_STRING(net_vdev_netvsc,
 			      VDEV_NETVSC_ARG_IFACE "=<string> "
-			      VDEV_NETVSC_ARG_MAC "=<string>");
+			      VDEV_NETVSC_ARG_MAC "=<string> "
+			      VDEV_NETVSC_ARG_FORCE "=<int>");
 
 /** Initialize driver log type. */
 RTE_INIT(vdev_netvsc_init_log)
-- 
1.8.3.1



More information about the dev mailing list