Hi Gaetan From: Gaetan Rivet, Friday, March 30, 2018 12:24 AM > Signed-off-by: Gaetan Rivet <gaetan.ri...@6wind.com> > --- > lib/Makefile | 2 +- > lib/librte_ether/Makefile | 3 +- > lib/librte_ether/rte_class_eth.c | 73 > ++++++++++++++++++++++++++++++++++++++++ > 3 files changed, 76 insertions(+), 2 deletions(-) create mode 100644 > lib/librte_ether/rte_class_eth.c > > diff --git a/lib/Makefile b/lib/Makefile index 4206485d3..47513f03f 100644 > --- a/lib/Makefile > +++ b/lib/Makefile > @@ -23,7 +23,7 @@ DIRS-$(CONFIG_RTE_LIBRTE_CMDLINE) += > librte_cmdline DEPDIRS-librte_cmdline := librte_eal > DIRS-$(CONFIG_RTE_LIBRTE_ETHER) += librte_ether DEPDIRS-librte_ether > := librte_net librte_eal librte_mempool librte_ring -DEPDIRS-librte_ether += > librte_mbuf > +DEPDIRS-librte_ether += librte_mbuf librte_kvargs > DIRS-$(CONFIG_RTE_LIBRTE_BBDEV) += librte_bbdev DEPDIRS- > librte_bbdev := librte_eal librte_mempool librte_mbuf > DIRS-$(CONFIG_RTE_LIBRTE_CRYPTODEV) += librte_cryptodev diff --git > a/lib/librte_ether/Makefile b/lib/librte_ether/Makefile index > 3ca5782bb..a1a0393de 100644 > --- a/lib/librte_ether/Makefile > +++ b/lib/librte_ether/Makefile > @@ -12,13 +12,14 @@ CFLAGS += -DALLOW_EXPERIMENTAL_API CFLAGS > += -O3 CFLAGS += $(WERROR_FLAGS) LDLIBS += -lrte_net -lrte_eal - > lrte_mempool -lrte_ring -LDLIBS += -lrte_mbuf > +LDLIBS += -lrte_mbuf -lrte_kvargs > > EXPORT_MAP := rte_ethdev_version.map > > LIBABIVER := 8 > > SRCS-y += rte_ethdev.c > +SRCS-y += rte_class_eth.c > SRCS-y += rte_flow.c > SRCS-y += rte_tm.c > SRCS-y += rte_mtr.c > diff --git a/lib/librte_ether/rte_class_eth.c > b/lib/librte_ether/rte_class_eth.c > new file mode 100644 > index 000000000..97d24781d > --- /dev/null > +++ b/lib/librte_ether/rte_class_eth.c > @@ -0,0 +1,73 @@ > +/* SPDX-License-Identifier: BSD-3-Clause > + * Copyright(c) 2018 Gaëtan Rivet > + */ > + > +#include <string.h> > + > +#include <rte_class.h> > +#include <rte_compat.h> > +#include <rte_errno.h> > +#include <rte_kvargs.h> > +#include <rte_log.h> > + > +#include "rte_ethdev.h" > +#include "rte_ethdev_core.h" > + > +enum eth_params { > + RTE_ETH_PARAMS_MAX, > +}; > + > +static const char *eth_params_keys[] = { > + [RTE_ETH_PARAMS_MAX] = NULL, > +}; > + > +static int > +eth_dev_match(struct rte_eth_dev *edev, > + struct rte_kvargs *kvlist) > +{ > + (void) kvlist; > + (void) edev; > + return 0; > +} > + > +static void * > +eth_dev_iterate(const void *_start, > + const char *str, > + const struct rte_dev_iterator *it) > +{ > + const struct rte_eth_dev *start = _start; > + struct rte_device *dev = it->device; > + struct rte_kvargs *kvargs = NULL; > + struct rte_eth_dev *edev = NULL; > + uint16_t p = 0; > + > + if (str != NULL) { > + kvargs = rte_kvargs_parse(str, eth_params_keys); > + if (kvargs == NULL) { > + RTE_LOG(ERR, EAL, "cannot parse argument list\n"); > + rte_errno = EINVAL; > + return NULL; > + } > + } > + if (start) > + p = start->data->port_id + 1; > + for (p = rte_eth_find_next(p); > + p < RTE_MAX_ETHPORTS; > + p = rte_eth_find_next(p + 1)) {
What are about differed\owned\bonded devices? What is actually the use cases of this iterator? DPDK internal management or applications? > + edev = &rte_eth_devices[p]; > + if (dev != edev->device) > + goto next_ethdev; > + if (eth_dev_match(edev, kvargs) == 0) > + break; > +next_ethdev: > + edev = NULL; > + } > + rte_kvargs_free(kvargs); > + return edev; > +} > + > +struct rte_class rte_class_eth = { > + .dev_iterate = eth_dev_iterate, > +}; > + > +RTE_REGISTER_CLASS(eth, rte_class_eth); > -- > 2.11.0