ethdev: add private generic device iterator
This iterator can be customized with a comparison function that will trigger a stopping condition. It can be leveraged to write several different iterators that have similar but non-identical purposes. It is private to librte_ethdev. Signed-off-by: Gaetan Rivet <gaetan.rivet@6wind.com>
This commit is contained in:
parent
ac91bc493c
commit
600ce80536
@ -18,6 +18,7 @@ EXPORT_MAP := rte_ethdev_version.map
|
||||
|
||||
LIBABIVER := 10
|
||||
|
||||
SRCS-y += ethdev_private.c
|
||||
SRCS-y += rte_ethdev.c
|
||||
SRCS-y += rte_flow.c
|
||||
SRCS-y += rte_tm.c
|
||||
|
31
lib/librte_ethdev/ethdev_private.c
Normal file
31
lib/librte_ethdev/ethdev_private.c
Normal file
@ -0,0 +1,31 @@
|
||||
/* SPDX-License-Identifier: BSD-3-Clause
|
||||
* Copyright(c) 2018 Gaëtan Rivet
|
||||
*/
|
||||
|
||||
#include "rte_ethdev.h"
|
||||
#include "ethdev_private.h"
|
||||
|
||||
struct rte_eth_dev *
|
||||
eth_find_device(const struct rte_eth_dev *start, rte_eth_cmp_t cmp,
|
||||
const void *data)
|
||||
{
|
||||
struct rte_eth_dev *edev;
|
||||
ptrdiff_t idx;
|
||||
|
||||
/* Avoid Undefined Behaviour */
|
||||
if (start != NULL &&
|
||||
(start < &rte_eth_devices[0] ||
|
||||
start > &rte_eth_devices[RTE_MAX_ETHPORTS]))
|
||||
return NULL;
|
||||
if (start != NULL)
|
||||
idx = start - &rte_eth_devices[0] + 1;
|
||||
else
|
||||
idx = 0;
|
||||
for (; idx < RTE_MAX_ETHPORTS; idx++) {
|
||||
edev = &rte_eth_devices[idx];
|
||||
if (cmp(edev, data) == 0)
|
||||
return edev;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
26
lib/librte_ethdev/ethdev_private.h
Normal file
26
lib/librte_ethdev/ethdev_private.h
Normal file
@ -0,0 +1,26 @@
|
||||
/* SPDX-License-Identifier: BSD-3-Clause
|
||||
* Copyright(c) 2018 Gaëtan Rivet
|
||||
*/
|
||||
|
||||
#ifndef _RTE_ETH_PRIVATE_H_
|
||||
#define _RTE_ETH_PRIVATE_H_
|
||||
|
||||
#include "rte_ethdev.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* Generic rte_eth_dev comparison function. */
|
||||
typedef int (*rte_eth_cmp_t)(const struct rte_eth_dev *, const void *);
|
||||
|
||||
/* Generic rte_eth_dev iterator. */
|
||||
struct rte_eth_dev *
|
||||
eth_find_device(const struct rte_eth_dev *_start, rte_eth_cmp_t cmp,
|
||||
const void *data);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* _RTE_ETH_PRIVATE_H_ */
|
@ -4,7 +4,8 @@
|
||||
name = 'ethdev'
|
||||
version = 10
|
||||
allow_experimental_apis = true
|
||||
sources = files('ethdev_profile.c',
|
||||
sources = files('ethdev_private.c',
|
||||
'ethdev_profile.c',
|
||||
'rte_ethdev.c',
|
||||
'rte_flow.c',
|
||||
'rte_mtr.c',
|
||||
|
Loading…
x
Reference in New Issue
Block a user