From 9a9ba10ada5eaf4af0f7e17090b22eeab346a2a4 Mon Sep 17 00:00:00 2001 From: Bing Zhao Date: Thu, 15 Oct 2020 21:08:53 +0800 Subject: [PATCH] ethdev: add function to get hairpin peer ports list After hairpin queues are configured, in general, the application will maintain the ports topology and even the queues configuration for the hairpin. But sometimes it will not. If there is no hot-plug, it is easy to bind and unbind hairpin among all the ports. The application can just connect or disconnect the hairpin egress ports to/from all the probed ingress ports. Then all the connections could be handled properly. But with hot-plug / hot-unplug, one port could be probed and removed dynamically. With two ports hairpin, all the connections from and to this port should be handled after start(bind) or before stop(unbind). It is necessary to know the hairpin topology with this port. This function will return the ports list with the actual peer ports number after configuration. Either peer Rx or Tx ports will be gotten with this function call. Signed-off-by: Bing Zhao Acked-by: Ori Kam --- doc/guides/rel_notes/release_20_11.rst | 1 + lib/librte_ethdev/rte_ethdev.c | 24 +++++++++++++++++ lib/librte_ethdev/rte_ethdev.h | 30 +++++++++++++++++++++ lib/librte_ethdev/rte_ethdev_driver.h | 33 ++++++++++++++++++++++++ lib/librte_ethdev/rte_ethdev_version.map | 1 + 5 files changed, 89 insertions(+) diff --git a/doc/guides/rel_notes/release_20_11.rst b/doc/guides/rel_notes/release_20_11.rst index 151a58944d..25beca98fa 100644 --- a/doc/guides/rel_notes/release_20_11.rst +++ b/doc/guides/rel_notes/release_20_11.rst @@ -114,6 +114,7 @@ New Features New APIs are introduced to support binding / unbinding 2 ports hairpin. Hairpin Tx part flow rules can be inserted explicitly. + New API is added to get the hairpin peer ports list. * **Updated Broadcom bnxt driver.** diff --git a/lib/librte_ethdev/rte_ethdev.c b/lib/librte_ethdev/rte_ethdev.c index 6f67c80ba0..d72137c00e 100644 --- a/lib/librte_ethdev/rte_ethdev.c +++ b/lib/librte_ethdev/rte_ethdev.c @@ -2259,6 +2259,30 @@ rte_eth_hairpin_unbind(uint16_t tx_port, uint16_t rx_port) return ret; } +int +rte_eth_hairpin_get_peer_ports(uint16_t port_id, uint16_t *peer_ports, + size_t len, uint32_t direction) +{ + struct rte_eth_dev *dev; + int ret; + + if (peer_ports == NULL || len == 0) + return -EINVAL; + + RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV); + dev = &rte_eth_devices[port_id]; + 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\n", + port_id, direction ? "Rx" : "Tx"); + + return ret; +} + void rte_eth_tx_buffer_drop_callback(struct rte_mbuf **pkts, uint16_t unsent, void *userdata __rte_unused) diff --git a/lib/librte_ethdev/rte_ethdev.h b/lib/librte_ethdev/rte_ethdev.h index bfcade73ee..f56cfa3396 100644 --- a/lib/librte_ethdev/rte_ethdev.h +++ b/lib/librte_ethdev/rte_ethdev.h @@ -2184,6 +2184,36 @@ int rte_eth_tx_hairpin_queue_setup (uint16_t port_id, uint16_t tx_queue_id, uint16_t nb_tx_desc, const struct rte_eth_hairpin_conf *conf); +/** + * @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 port_id + * The port identifier of the Ethernet device. + * @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. + * - (-ENODEV) if *port_id* invalid + * - (-ENOTSUP) if hardware doesn't support. + * - Others detailed errors from PMD drivers. + */ +__rte_experimental +int rte_eth_hairpin_get_peer_ports(uint16_t port_id, uint16_t *peer_ports, + size_t len, uint32_t direction); + /** * @warning * @b EXPERIMENTAL: this API may change, or be removed, without prior notice diff --git a/lib/librte_ethdev/rte_ethdev_driver.h b/lib/librte_ethdev/rte_ethdev_driver.h index 9a65bd5ed7..03e00d52fe 100644 --- a/lib/librte_ethdev/rte_ethdev_driver.h +++ b/lib/librte_ethdev/rte_ethdev_driver.h @@ -655,6 +655,37 @@ typedef int (*eth_fec_get_t)(struct rte_eth_dev *dev, */ typedef int (*eth_fec_set_t)(struct rte_eth_dev *dev, uint32_t fec_capa); +/** + * @internal + * Get all hairpin Tx/Rx peer ports of the current device, if any. + * + * @param dev + * ethdev handle of port. + * @param peer_ports + * array to save the ports list. + * @param len + * array length. + * @param direction + * value to decide the current to peer direction + * positive - used as Tx to get all peer Rx ports. + * zero - used as Rx to get all peer Tx ports. + * + * @return + * Negative errno value on error, 0 or positive on success. + * + * @retval 0 + * Success, no peer ports. + * @retval >0 + * Actual number of the peer ports. + * @retval -ENOTSUP + * Get peer ports API is not supported. + * @retval -EINVAL + * One of the parameters is invalid. + */ +typedef int (*hairpin_get_peer_ports_t)(struct rte_eth_dev *dev, + uint16_t *peer_ports, size_t len, + uint32_t direction); + /** * @internal * Bind all hairpin Tx queues of one port to the Rx queues of the peer port. @@ -849,6 +880,8 @@ struct eth_dev_ops { /**< Get Forward Error Correction(FEC) mode. */ eth_fec_set_t fec_set; /**< Set Forward Error Correction(FEC) mode. */ + hairpin_get_peer_ports_t hairpin_get_peer_ports; + /**< Get hairpin peer ports list. */ eth_hairpin_bind_t hairpin_bind; /**< Bind all hairpin Tx queues of device to the peer port Rx queues. */ eth_hairpin_unbind_t hairpin_unbind; diff --git a/lib/librte_ethdev/rte_ethdev_version.map b/lib/librte_ethdev/rte_ethdev_version.map index d67c9dc4fb..a1e6897c92 100644 --- a/lib/librte_ethdev/rte_ethdev_version.map +++ b/lib/librte_ethdev/rte_ethdev_version.map @@ -228,6 +228,7 @@ EXPERIMENTAL { # added in 20.11 rte_eth_hairpin_bind; + rte_eth_hairpin_get_peer_ports; rte_eth_hairpin_unbind; rte_eth_link_speed_to_str; rte_eth_link_to_str; -- 2.20.1