This iterator helps applications iterate over the device list and skip holes caused by invalid or detached devices.
Signed-off-by: Gaetan Rivet <gaetan.ri...@6wind.com> --- lib/librte_ether/rte_ethdev.c | 13 +++++++++++++ lib/librte_ether/rte_ethdev.h | 19 +++++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/lib/librte_ether/rte_ethdev.c b/lib/librte_ether/rte_ethdev.c index d5d1b52..fcb9933 100644 --- a/lib/librte_ether/rte_ethdev.c +++ b/lib/librte_ether/rte_ethdev.c @@ -138,6 +138,19 @@ enum { STAT_QMAP_RX }; +uint8_t +rte_eth_find_next(uint8_t port_id) +{ + while (port_id < RTE_MAX_ETHPORTS && + rte_eth_devices[port_id].state != RTE_ETH_DEV_ATTACHED) + port_id++; + + if (port_id >= RTE_MAX_ETHPORTS) + return RTE_MAX_ETHPORTS; + + return port_id; +} + static void rte_eth_dev_data_alloc(void) { diff --git a/lib/librte_ether/rte_ethdev.h b/lib/librte_ether/rte_ethdev.h index d51b8e9..59c4123 100644 --- a/lib/librte_ether/rte_ethdev.h +++ b/lib/librte_ether/rte_ethdev.h @@ -1731,6 +1731,25 @@ struct rte_eth_dev_data { extern struct rte_eth_dev rte_eth_devices[]; /** + * Iterates over valid ethdev ports. + * + * @param: port_id + * The id of the next possible valid port. + * @return + * Next valid port id, RTE_MAX_ETHPORTS is there is none. + */ +uint8_t rte_eth_find_next(uint8_t port_id); + +/** + * Macro to iterate over all enabled ethdev ports. + */ +#define RTE_ETH_FOREACH_DEV(p) \ + for (p = rte_eth_find_next(0); \ + p < RTE_MAX_ETHPORTS; \ + p = rte_eth_find_next(p + 1)) + + +/** * Get the total number of Ethernet devices that have been successfully * initialized by the [matching] Ethernet driver during the PCI probing phase. * All devices whose port identifier is in the range -- 2.1.4