From: Martin Spinler <[email protected]> VDEV are useful for NFB devices not represented by PCI device, e.g. virtual or simulated devices.
Signed-off-by: Martin Spinler <[email protected]> --- drivers/net/nfb/meson.build | 1 + drivers/net/nfb/nfb_vdev.c | 95 +++++++++++++++++++++++++++++++++++++ 2 files changed, 96 insertions(+) create mode 100644 drivers/net/nfb/nfb_vdev.c diff --git a/drivers/net/nfb/meson.build b/drivers/net/nfb/meson.build index d7a255c928..9e458dfb4a 100644 --- a/drivers/net/nfb/meson.build +++ b/drivers/net/nfb/meson.build @@ -16,6 +16,7 @@ ext_deps += dep sources = files( 'nfb_ethdev.c', + 'nfb_vdev.c', 'nfb_rx.c', 'nfb_rxmode.c', 'nfb_stats.c', diff --git a/drivers/net/nfb/nfb_vdev.c b/drivers/net/nfb/nfb_vdev.c new file mode 100644 index 0000000000..3a8d8b0531 --- /dev/null +++ b/drivers/net/nfb/nfb_vdev.c @@ -0,0 +1,95 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright(c) 2026 Cesnet + */ + +#include <rte_kvargs.h> +#include <ethdev_vdev.h> + +#include "nfb.h" + +#define VDEV_NFB_DRIVER net_vdev_nfb +#define VDEV_NFB_ARG_DEV "dev" + +static int +vdev_nfb_vdev_probe(struct rte_vdev_device *dev) +{ + int i; + int ret = 0; + + struct nfb_init_params params; + + const char *vdev_name = rte_vdev_device_name(dev); + const char *vdev_args = rte_vdev_device_args(dev); + char *dev_params, *dev_params_mod; + struct rte_kvargs *kvargs; + + kvargs = rte_kvargs_parse(vdev_args, NULL); + if (kvargs == NULL) { + NFB_LOG(ERR, "Failed to parse device arguments %s", vdev_args); + ret = -EINVAL; + goto err_parse_args; + } + + dev_params = strdup(vdev_args); + if (dev_params == NULL) { + ret = -ENOMEM; + goto err_strdup_params; + } + + params.args = dev_params; + params.path = nfb_default_dev_path(); + params.nfb_id = 0; + + dev_params_mod = dev_params; + + dev_params_mod[0] = 0; + + /* Parse parameters for virtual device */ + for (i = 0; i != (signed int)kvargs->count; ++i) { + const struct rte_kvargs_pair *pair = &kvargs->pairs[i]; + + if (!strcmp(pair->key, VDEV_NFB_ARG_DEV)) { + params.path = pair->value; + } else { + dev_params_mod += sprintf(dev_params_mod, "%s%s=%s", + dev_params_mod == dev_params ? "" : ",", + pair->key, pair->value); + } + } + + strlcpy(params.name, vdev_name, sizeof(params.name)); + + ret = nfb_eth_common_probe(&dev->device, NULL, NULL, ¶ms, -1); + if (ret) + goto err_nfb_common_probe; + + free(dev_params); + rte_kvargs_free(kvargs); + + return ret; + +err_nfb_common_probe: + free(dev_params); +err_strdup_params: + rte_kvargs_free(kvargs); +err_parse_args: + return ret; +} + +static int +vdev_nfb_vdev_remove(struct rte_vdev_device *dev) +{ + return nfb_eth_common_remove(&dev->device); +} + +/** Virtual device descriptor. */ +static struct rte_vdev_driver vdev_nfb_vdev = { + .probe = vdev_nfb_vdev_probe, + .remove = vdev_nfb_vdev_remove, +}; + +RTE_PMD_REGISTER_VDEV(VDEV_NFB_DRIVER, vdev_nfb_vdev); +RTE_PMD_REGISTER_ALIAS(VDEV_NFB_DRIVER, eth_vdev_nfb); +RTE_PMD_REGISTER_PARAM_STRING(net_vdev_nfb, + VDEV_NFB_ARG_DEV "=<string>" + ); -- 2.52.0

