13/10/2020 18:19, Bing Zhao: > --- a/lib/librte_ethdev/rte_ethdev.c > +++ b/lib/librte_ethdev/rte_ethdev.c > @@ -2208,6 +2208,30 @@ struct rte_eth_dev * > return ret; > } > > +int > +rte_eth_hairpin_get_peer_ports(uint16_t cur_port, uint16_t *peer_ports, > + size_t len, uint32_t direction) > +{ > + struct rte_eth_dev *dev; > + int ret; > + > + if (!peer_ports || !len) > + return -EINVAL; > + > + RTE_ETH_VALID_PORTID_OR_ERR_RET(cur_port, -EINVAL);
should be -ENODEV > + dev = &rte_eth_devices[cur_port]; > + RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->hairpin_get_peer_ports, > + -ENOTSUP); > + > + ret = (*dev->dev_ops->hairpin_get_peer_ports)(dev, peer_ports, > + len, direction); > + if (ret < 0) > + RTE_ETHDEV_LOG(ERR, "Failed to get %d hairpin peer %s ports", > + cur_port, direction ? "RX" : "TX"); Missing \n > + > + return ret; > +} > --- a/lib/librte_ethdev/rte_ethdev.h > +++ b/lib/librte_ethdev/rte_ethdev.h > * @warning > * @b EXPERIMENTAL: this API may change, or be removed, without prior notice > * > + * Get all the hairpin peer RX / TX ports of the current port. > + * The caller should ensure that the array is large enough to save the ports > + * list. > + * > + * @param cur_port > + * The current port identifier of the Ethernet device. Why current? In general we use "port_id". > + * @param peer_ports > + * Pointer to the array to store the peer ports list. > + * @param len > + * Length of the array to store the port identifiers. > + * @param direction > + * Current port to peer port direction > + * positive - current used as TX to get all peer RX ports. > + * zero - current used as RX to get all peer TX ports. > + * > + * @return > + * - (0 or positive) actual peer ports number. > + * - (-EINVAL) if bad parameter. > + * - (-ENOTSUP) if hardware doesn't support. > + * - Others detailed errors from PMD drivers. Please add ENODEV > + */ > +__rte_experimental > +int rte_eth_hairpin_get_peer_ports(uint16_t cur_port, uint16_t *peer_ports, > + size_t len, uint32_t direction);