ethdev: register as a class
[dpdk.git] / lib / librte_ethdev / rte_class_eth.c
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(c) 2018 GaĆ«tan Rivet
3  */
4
5 #include <string.h>
6
7 #include <rte_class.h>
8 #include <rte_compat.h>
9 #include <rte_errno.h>
10 #include <rte_kvargs.h>
11 #include <rte_log.h>
12
13 #include "rte_ethdev.h"
14 #include "rte_ethdev_core.h"
15 #include "ethdev_private.h"
16
17 enum eth_params {
18         RTE_ETH_PARAMS_MAX,
19 };
20
21 static const char * const eth_params_keys[] = {
22         [RTE_ETH_PARAMS_MAX] = NULL,
23 };
24
25 struct eth_dev_match_arg {
26         struct rte_device *device;
27         struct rte_kvargs *kvlist;
28 };
29
30 #define eth_dev_match_arg(d, k) \
31         (&(const struct eth_dev_match_arg) { \
32                 .device = (d), \
33                 .kvlist = (k), \
34         })
35
36 static int
37 eth_dev_match(const struct rte_eth_dev *edev,
38               const void *_arg)
39 {
40         const struct eth_dev_match_arg *arg = _arg;
41         const struct rte_kvargs *kvlist = arg->kvlist;
42
43         if (edev->state == RTE_ETH_DEV_UNUSED)
44                 return -1;
45         if (edev->device != arg->device)
46                 return -1;
47         if (kvlist == NULL)
48                 /* Empty string matches everything. */
49                 return 0;
50         return 0;
51 }
52
53 static void *
54 eth_dev_iterate(const void *start,
55                 const char *str,
56                 const struct rte_dev_iterator *it)
57 {
58         struct rte_kvargs *kvargs = NULL;
59         struct rte_eth_dev *edev = NULL;
60
61         if (str != NULL) {
62                 kvargs = rte_kvargs_parse(str, eth_params_keys);
63                 if (kvargs == NULL) {
64                         RTE_LOG(ERR, EAL, "cannot parse argument list\n");
65                         rte_errno = EINVAL;
66                         return NULL;
67                 }
68         }
69         edev = eth_find_device(start, eth_dev_match,
70                                eth_dev_match_arg(it->device, kvargs));
71         rte_kvargs_free(kvargs);
72         return edev;
73 }
74
75 struct rte_class rte_class_eth = {
76         .dev_iterate = eth_dev_iterate,
77 };
78
79 RTE_REGISTER_CLASS(eth, rte_class_eth);