as flow action.
* Added new flow APIs to create/update/destroy/query shared action.
+* **Updated the ethdev library to support hairpin between two ports.**
+
+ New APIs are introduced to support binding / unbinding 2 ports hairpin.
+
* **Updated Broadcom bnxt driver.**
Updated the Broadcom bnxt driver with new features and improvements, including:
return eth_err(port_id, ret);
}
+int
+rte_eth_hairpin_bind(uint16_t tx_port, uint16_t rx_port)
+{
+ struct rte_eth_dev *dev;
+ int ret;
+
+ RTE_ETH_VALID_PORTID_OR_ERR_RET(tx_port, -ENODEV);
+ dev = &rte_eth_devices[tx_port];
+ if (dev->data->dev_started == 0) {
+ RTE_ETHDEV_LOG(ERR, "Tx port %d is not started\n", tx_port);
+ return -EBUSY;
+ }
+
+ RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->hairpin_bind, -ENOTSUP);
+ ret = (*dev->dev_ops->hairpin_bind)(dev, rx_port);
+ if (ret != 0)
+ RTE_ETHDEV_LOG(ERR, "Failed to bind hairpin Tx %d"
+ " to Rx %d (%d - all ports)\n",
+ tx_port, rx_port, RTE_MAX_ETHPORTS);
+
+ return ret;
+}
+
+int
+rte_eth_hairpin_unbind(uint16_t tx_port, uint16_t rx_port)
+{
+ struct rte_eth_dev *dev;
+ int ret;
+
+ RTE_ETH_VALID_PORTID_OR_ERR_RET(tx_port, -ENODEV);
+ dev = &rte_eth_devices[tx_port];
+ if (dev->data->dev_started == 0) {
+ RTE_ETHDEV_LOG(ERR, "Tx port %d is already stopped\n", tx_port);
+ return -EBUSY;
+ }
+
+ RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->hairpin_unbind, -ENOTSUP);
+ ret = (*dev->dev_ops->hairpin_unbind)(dev, rx_port);
+ if (ret != 0)
+ RTE_ETHDEV_LOG(ERR, "Failed to unbind hairpin Tx %d"
+ " from Rx %d (%d - all ports)\n",
+ tx_port, rx_port, RTE_MAX_ETHPORTS);
+
+ 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
+ *
+ * Bind all hairpin Tx queues of one port to the Rx queues of the peer port.
+ * It is only allowed to call this function after all hairpin queues are
+ * configured properly and the devices are in started state.
+ *
+ * @param tx_port
+ * The identifier of the Tx port.
+ * @param rx_port
+ * The identifier of peer Rx port.
+ * RTE_MAX_ETHPORTS is allowed for the traversal of all devices.
+ * Rx port ID could have the same value as Tx port ID.
+ *
+ * @return
+ * - (0) if successful.
+ * - (-ENODEV) if Tx port ID is invalid.
+ * - (-EBUSY) if device is not in started state.
+ * - (-ENOTSUP) if hardware doesn't support.
+ * - Others detailed errors from PMD drivers.
+ */
+__rte_experimental
+int rte_eth_hairpin_bind(uint16_t tx_port, uint16_t rx_port);
+
+/**
+ * @warning
+ * @b EXPERIMENTAL: this API may change, or be removed, without prior notice
+ *
+ * Unbind all hairpin Tx queues of one port from the Rx queues of the peer port.
+ * This should be called before closing the Tx or Rx devices, if the bind
+ * function is called before.
+ * After unbinding the hairpin ports pair, it is allowed to bind them again.
+ * Changing queues configuration should be after stopping the device(s).
+ *
+ * @param tx_port
+ * The identifier of the Tx port.
+ * @param rx_port
+ * The identifier of peer Rx port.
+ * RTE_MAX_ETHPORTS is allowed for traversal of all devices.
+ * Rx port ID could have the same value as Tx port ID.
+ *
+ * @return
+ * - (0) if successful.
+ * - (-ENODEV) if Tx port ID is invalid.
+ * - (-EBUSY) if device is in stopped state.
+ * - (-ENOTSUP) if hardware doesn't support.
+ * - Others detailed errors from PMD drivers.
+ */
+__rte_experimental
+int rte_eth_hairpin_unbind(uint16_t tx_port, uint16_t rx_port);
+
/**
* Return the NUMA socket to which an Ethernet device is connected
*
*/
typedef int (*eth_fec_set_t)(struct rte_eth_dev *dev, uint32_t fec_capa);
+/**
+ * @internal
+ * Bind all hairpin Tx queues of one port to the Rx queues of the peer port.
+ *
+ * @param dev
+ * ethdev handle of port.
+ * @param rx_port
+ * the peer Rx port.
+ *
+ * @return
+ * Negative errno value on error, 0 on success.
+ *
+ * @retval 0
+ * Success, bind successfully.
+ * @retval -ENOTSUP
+ * Bind API is not supported.
+ * @retval -EINVAL
+ * One of the parameters is invalid.
+ * @retval -EBUSY
+ * Device is not started.
+ */
+typedef int (*eth_hairpin_bind_t)(struct rte_eth_dev *dev,
+ uint16_t rx_port);
+
+/**
+ * @internal
+ * Unbind all hairpin Tx queues of one port from the Rx queues of the peer port.
+ *
+ * @param dev
+ * ethdev handle of port.
+ * @param rx_port
+ * the peer Rx port.
+ *
+ * @return
+ * Negative errno value on error, 0 on success.
+ *
+ * @retval 0
+ * Success, unbind successfully.
+ * @retval -ENOTSUP
+ * Bind API is not supported.
+ * @retval -EINVAL
+ * One of the parameters is invalid.
+ * @retval -EBUSY
+ * Device is already stopped.
+ */
+typedef int (*eth_hairpin_unbind_t)(struct rte_eth_dev *dev,
+ uint16_t rx_port);
+
/**
* @internal A structure containing the functions exported by an Ethernet driver.
*/
/**< Get Forward Error Correction(FEC) mode. */
eth_fec_set_t fec_set;
/**< Set Forward Error Correction(FEC) mode. */
+ 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;
+ /**< Unbind all hairpin Tx queues from the peer port Rx queues. */
};
/**
rte_tm_wred_profile_delete;
# added in 20.11
+ rte_eth_hairpin_bind;
+ rte_eth_hairpin_unbind;
rte_eth_link_speed_to_str;
rte_eth_link_to_str;
rte_eth_fec_get_capability;