[dpdk-dev,v3,18/20] ethdev: register ether layer as a class
Checks
Commit Message
Signed-off-by: Gaetan Rivet <gaetan.rivet@6wind.com>
---
lib/Makefile | 2 +-
lib/librte_ether/Makefile | 3 +-
lib/librte_ether/rte_class_eth.c | 65 ++++++++++++++++++++++++++++++++++++++++
3 files changed, 68 insertions(+), 2 deletions(-)
create mode 100644 lib/librte_ether/rte_class_eth.c
@@ -22,7 +22,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
@@ -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
new file mode 100644
@@ -0,0 +1,65 @@
+/* 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"
+
+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, NULL);
+ 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)) {
+ 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);