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.**
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)
(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
*/
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.
/**< 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;
# 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;