net/vdev_netvsc: add force parameter
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@6wind.com> Signed-off-by: Matan Azrad <matan@mellanox.com>
This commit is contained in:
parent
31182fadfb
commit
658dea3a5e
@ -86,5 +86,10 @@ The following device parameters are supported:
|
|||||||
Same as ``iface`` except a suitable NetVSC interface is located using its
|
Same as ``iface`` except a suitable NetVSC interface is located using its
|
||||||
MAC address.
|
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
|
Not specifying either ``iface`` or ``mac`` makes this driver attach itself to
|
||||||
all unrouted NetVSC interfaces found on the system.
|
all unrouted NetVSC interfaces found on the system.
|
||||||
|
@ -36,6 +36,7 @@
|
|||||||
#define VDEV_NETVSC_DRIVER net_vdev_netvsc
|
#define VDEV_NETVSC_DRIVER net_vdev_netvsc
|
||||||
#define VDEV_NETVSC_ARG_IFACE "iface"
|
#define VDEV_NETVSC_ARG_IFACE "iface"
|
||||||
#define VDEV_NETVSC_ARG_MAC "mac"
|
#define VDEV_NETVSC_ARG_MAC "mac"
|
||||||
|
#define VDEV_NETVSC_ARG_FORCE "force"
|
||||||
#define VDEV_NETVSC_PROBE_MS 1000
|
#define VDEV_NETVSC_PROBE_MS 1000
|
||||||
|
|
||||||
#define NETVSC_CLASS_ID "{f8615163-df3e-46c5-913f-f2d2f965ed0e}"
|
#define NETVSC_CLASS_ID "{f8615163-df3e-46c5-913f-f2d2f965ed0e}"
|
||||||
@ -419,6 +420,9 @@ vdev_netvsc_alarm(__rte_unused void *arg)
|
|||||||
* - struct rte_kvargs *kvargs:
|
* - struct rte_kvargs *kvargs:
|
||||||
* Device arguments provided to current driver instance.
|
* Device arguments provided to current driver instance.
|
||||||
*
|
*
|
||||||
|
* - int force:
|
||||||
|
* Accept specified interface even if not detected as NetVSC.
|
||||||
|
*
|
||||||
* - unsigned int specified:
|
* - unsigned int specified:
|
||||||
* Number of specific netdevices provided as device arguments.
|
* Number of specific netdevices provided as device arguments.
|
||||||
*
|
*
|
||||||
@ -436,6 +440,7 @@ vdev_netvsc_netvsc_probe(const struct if_nameindex *iface,
|
|||||||
{
|
{
|
||||||
const char *name = va_arg(ap, const char *);
|
const char *name = va_arg(ap, const char *);
|
||||||
struct rte_kvargs *kvargs = va_arg(ap, struct rte_kvargs *);
|
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 specified = va_arg(ap, unsigned int);
|
||||||
unsigned int *matched = va_arg(ap, unsigned int *);
|
unsigned int *matched = va_arg(ap, unsigned int *);
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
@ -490,20 +495,18 @@ vdev_netvsc_netvsc_probe(const struct if_nameindex *iface,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
if (!vdev_netvsc_iface_is_netvsc(iface)) {
|
if (!vdev_netvsc_iface_is_netvsc(iface)) {
|
||||||
if (!specified)
|
if (!specified || !force)
|
||||||
return 0;
|
return 0;
|
||||||
DRV_LOG(WARNING,
|
DRV_LOG(WARNING,
|
||||||
"interface \"%s\" (index %u) is not NetVSC,"
|
"using non-NetVSC interface \"%s\" (index %u)",
|
||||||
" skipping",
|
|
||||||
iface->if_name, iface->if_index);
|
iface->if_name, iface->if_index);
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
/* Routed NetVSC should not be probed. */
|
/* Routed NetVSC should not be probed. */
|
||||||
if (vdev_netvsc_has_route(iface->if_name)) {
|
if (vdev_netvsc_has_route(iface->if_name)) {
|
||||||
DRV_LOG(WARNING, "NetVSC interface \"%s\" (index %u) is routed",
|
if (!specified || !force)
|
||||||
iface->if_name, iface->if_index);
|
|
||||||
if (!specified)
|
|
||||||
return 0;
|
return 0;
|
||||||
|
DRV_LOG(WARNING, "using routed NetVSC interface \"%s\""
|
||||||
|
" (index %u)", iface->if_name, iface->if_index);
|
||||||
}
|
}
|
||||||
/* Create interface context. */
|
/* Create interface context. */
|
||||||
ctx = calloc(1, sizeof(*ctx));
|
ctx = calloc(1, sizeof(*ctx));
|
||||||
@ -597,6 +600,7 @@ vdev_netvsc_vdev_probe(struct rte_vdev_device *dev)
|
|||||||
static const char *const vdev_netvsc_arg[] = {
|
static const char *const vdev_netvsc_arg[] = {
|
||||||
VDEV_NETVSC_ARG_IFACE,
|
VDEV_NETVSC_ARG_IFACE,
|
||||||
VDEV_NETVSC_ARG_MAC,
|
VDEV_NETVSC_ARG_MAC,
|
||||||
|
VDEV_NETVSC_ARG_FORCE,
|
||||||
NULL,
|
NULL,
|
||||||
};
|
};
|
||||||
const char *name = rte_vdev_device_name(dev);
|
const char *name = rte_vdev_device_name(dev);
|
||||||
@ -605,6 +609,7 @@ vdev_netvsc_vdev_probe(struct rte_vdev_device *dev)
|
|||||||
vdev_netvsc_arg);
|
vdev_netvsc_arg);
|
||||||
unsigned int specified = 0;
|
unsigned int specified = 0;
|
||||||
unsigned int matched = 0;
|
unsigned int matched = 0;
|
||||||
|
int force = 0;
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
@ -616,14 +621,16 @@ vdev_netvsc_vdev_probe(struct rte_vdev_device *dev)
|
|||||||
for (i = 0; i != kvargs->count; ++i) {
|
for (i = 0; i != kvargs->count; ++i) {
|
||||||
const struct rte_kvargs_pair *pair = &kvargs->pairs[i];
|
const struct rte_kvargs_pair *pair = &kvargs->pairs[i];
|
||||||
|
|
||||||
if (!strcmp(pair->key, VDEV_NETVSC_ARG_IFACE) ||
|
if (!strcmp(pair->key, VDEV_NETVSC_ARG_FORCE))
|
||||||
!strcmp(pair->key, VDEV_NETVSC_ARG_MAC))
|
force = !!atoi(pair->value);
|
||||||
|
else if (!strcmp(pair->key, VDEV_NETVSC_ARG_IFACE) ||
|
||||||
|
!strcmp(pair->key, VDEV_NETVSC_ARG_MAC))
|
||||||
++specified;
|
++specified;
|
||||||
}
|
}
|
||||||
rte_eal_alarm_cancel(vdev_netvsc_alarm, NULL);
|
rte_eal_alarm_cancel(vdev_netvsc_alarm, NULL);
|
||||||
/* Gather interfaces. */
|
/* Gather interfaces. */
|
||||||
ret = vdev_netvsc_foreach_iface(vdev_netvsc_netvsc_probe, name, kvargs,
|
ret = vdev_netvsc_foreach_iface(vdev_netvsc_netvsc_probe, name, kvargs,
|
||||||
specified, &matched);
|
force, specified, &matched);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
goto error;
|
goto error;
|
||||||
if (matched < specified)
|
if (matched < specified)
|
||||||
@ -682,7 +689,8 @@ RTE_PMD_REGISTER_VDEV(VDEV_NETVSC_DRIVER, vdev_netvsc_vdev);
|
|||||||
RTE_PMD_REGISTER_ALIAS(VDEV_NETVSC_DRIVER, eth_vdev_netvsc);
|
RTE_PMD_REGISTER_ALIAS(VDEV_NETVSC_DRIVER, eth_vdev_netvsc);
|
||||||
RTE_PMD_REGISTER_PARAM_STRING(net_vdev_netvsc,
|
RTE_PMD_REGISTER_PARAM_STRING(net_vdev_netvsc,
|
||||||
VDEV_NETVSC_ARG_IFACE "=<string> "
|
VDEV_NETVSC_ARG_IFACE "=<string> "
|
||||||
VDEV_NETVSC_ARG_MAC "=<string>");
|
VDEV_NETVSC_ARG_MAC "=<string> "
|
||||||
|
VDEV_NETVSC_ARG_FORCE "=<int>");
|
||||||
|
|
||||||
/** Initialize driver log type. */
|
/** Initialize driver log type. */
|
||||||
RTE_INIT(vdev_netvsc_init_log)
|
RTE_INIT(vdev_netvsc_init_log)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user