ethdev: add iterator to match devargs input
[dpdk.git] / lib / librte_ethdev / ethdev_private.c
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(c) 2018 GaĆ«tan Rivet
3  */
4
5 #include "rte_ethdev.h"
6 #include "ethdev_private.h"
7
8 uint16_t
9 eth_dev_to_id(const struct rte_eth_dev *dev)
10 {
11         if (dev == NULL)
12                 return RTE_MAX_ETHPORTS;
13         return dev - rte_eth_devices;
14 }
15
16 struct rte_eth_dev *
17 eth_find_device(const struct rte_eth_dev *start, rte_eth_cmp_t cmp,
18                 const void *data)
19 {
20         struct rte_eth_dev *edev;
21         ptrdiff_t idx;
22
23         /* Avoid Undefined Behaviour */
24         if (start != NULL &&
25             (start < &rte_eth_devices[0] ||
26              start > &rte_eth_devices[RTE_MAX_ETHPORTS]))
27                 return NULL;
28         if (start != NULL)
29                 idx = eth_dev_to_id(start) + 1;
30         else
31                 idx = 0;
32         for (; idx < RTE_MAX_ETHPORTS; idx++) {
33                 edev = &rte_eth_devices[idx];
34                 if (cmp(edev, data) == 0)
35                         return edev;
36         }
37         return NULL;
38 }
39