- dev = &rte_eth_devices[port_id];
- if (! (dev->data->dev_conf.fdir_conf.mode)) {
- PMD_DEBUG_TRACE("port %d: pkt-filter disabled\n", port_id);
- return (-ENOSYS);
- }
-
- FUNC_PTR_OR_ERR_RET(*dev->dev_ops->fdir_infos_get, -ENOTSUP);
-
- (*dev->dev_ops->fdir_infos_get)(dev, fdir);
- return (0);
-}
-
-int
-rte_eth_dev_fdir_add_perfect_filter(uint8_t port_id,
- struct rte_fdir_filter *fdir_filter,
- uint16_t soft_id, uint8_t queue,
- uint8_t drop)
-{
- struct rte_eth_dev *dev;
-
- if (port_id >= nb_ports) {
- PMD_DEBUG_TRACE("Invalid port_id=%d\n", port_id);
- return (-ENODEV);
- }
-
- dev = &rte_eth_devices[port_id];
-
- if (dev->data->dev_conf.fdir_conf.mode != RTE_FDIR_MODE_PERFECT) {
- PMD_DEBUG_TRACE("port %d: invalid FDIR mode=%u\n",
- port_id, dev->data->dev_conf.fdir_conf.mode);
- return (-ENOSYS);
- }
-
- if ((fdir_filter->l4type == RTE_FDIR_L4TYPE_SCTP
- || fdir_filter->l4type == RTE_FDIR_L4TYPE_NONE)
- && (fdir_filter->port_src || fdir_filter->port_dst)) {
- PMD_DEBUG_TRACE(" Port are meaningless for SCTP and " \
- "None l4type, source & destinations ports " \
- "should be null!\n");
- return (-EINVAL);
- }
-
- /* For now IPv6 is not supported with perfect filter */
- if (fdir_filter->iptype == RTE_FDIR_IPTYPE_IPV6)
- return (-ENOTSUP);
-
- FUNC_PTR_OR_ERR_RET(*dev->dev_ops->fdir_add_perfect_filter, -ENOTSUP);
- return (*dev->dev_ops->fdir_add_perfect_filter)(dev, fdir_filter,
- soft_id, queue,
- drop);
-}
-
-int
-rte_eth_dev_fdir_update_perfect_filter(uint8_t port_id,
- struct rte_fdir_filter *fdir_filter,
- uint16_t soft_id, uint8_t queue,
- uint8_t drop)
-{
- struct rte_eth_dev *dev;
-
- if (port_id >= nb_ports) {
- PMD_DEBUG_TRACE("Invalid port_id=%d\n", port_id);
- return (-ENODEV);
- }
-
- dev = &rte_eth_devices[port_id];
-
- if (dev->data->dev_conf.fdir_conf.mode != RTE_FDIR_MODE_PERFECT) {
- PMD_DEBUG_TRACE("port %d: invalid FDIR mode=%u\n",
- port_id, dev->data->dev_conf.fdir_conf.mode);
- return (-ENOSYS);
- }
-
- if ((fdir_filter->l4type == RTE_FDIR_L4TYPE_SCTP
- || fdir_filter->l4type == RTE_FDIR_L4TYPE_NONE)
- && (fdir_filter->port_src || fdir_filter->port_dst)) {
- PMD_DEBUG_TRACE(" Port are meaningless for SCTP and " \
- "None l4type, source & destinations ports " \
- "should be null!\n");
- return (-EINVAL);
- }
-
- /* For now IPv6 is not supported with perfect filter */
- if (fdir_filter->iptype == RTE_FDIR_IPTYPE_IPV6)
- return (-ENOTSUP);
-
- FUNC_PTR_OR_ERR_RET(*dev->dev_ops->fdir_update_perfect_filter, -ENOTSUP);
- return (*dev->dev_ops->fdir_update_perfect_filter)(dev, fdir_filter,
- soft_id, queue, drop);
-}
-
-int
-rte_eth_dev_fdir_remove_perfect_filter(uint8_t port_id,
- struct rte_fdir_filter *fdir_filter,
- uint16_t soft_id)
-{
- struct rte_eth_dev *dev;
-
- if (port_id >= nb_ports) {
- PMD_DEBUG_TRACE("Invalid port_id=%d\n", port_id);
- return (-ENODEV);
- }
-
- dev = &rte_eth_devices[port_id];
-
- if (dev->data->dev_conf.fdir_conf.mode != RTE_FDIR_MODE_PERFECT) {
- PMD_DEBUG_TRACE("port %d: invalid FDIR mode=%u\n",
- port_id, dev->data->dev_conf.fdir_conf.mode);
- return (-ENOSYS);
- }
-
- if ((fdir_filter->l4type == RTE_FDIR_L4TYPE_SCTP
- || fdir_filter->l4type == RTE_FDIR_L4TYPE_NONE)
- && (fdir_filter->port_src || fdir_filter->port_dst)) {
- PMD_DEBUG_TRACE(" Port are meaningless for SCTP and " \
- "None l4type, source & destinations ports " \
- "should be null!\n");
- return (-EINVAL);
- }
-
- /* For now IPv6 is not supported with perfect filter */
- if (fdir_filter->iptype == RTE_FDIR_IPTYPE_IPV6)
- return (-ENOTSUP);
-
- FUNC_PTR_OR_ERR_RET(*dev->dev_ops->fdir_remove_perfect_filter, -ENOTSUP);
- return (*dev->dev_ops->fdir_remove_perfect_filter)(dev, fdir_filter,
- soft_id);
-}
-
-int
-rte_eth_dev_fdir_set_masks(uint8_t port_id, struct rte_fdir_masks *fdir_mask)
-{
- struct rte_eth_dev *dev;
-
- if (port_id >= nb_ports) {
- PMD_DEBUG_TRACE("Invalid port_id=%d\n", port_id);
- return (-ENODEV);
- }
-
- dev = &rte_eth_devices[port_id];
- if (! (dev->data->dev_conf.fdir_conf.mode)) {
- PMD_DEBUG_TRACE("port %d: pkt-filter disabled\n", port_id);
- return (-ENOSYS);
- }
-
- FUNC_PTR_OR_ERR_RET(*dev->dev_ops->fdir_set_masks, -ENOTSUP);
- return (*dev->dev_ops->fdir_set_masks)(dev, fdir_mask);
-}
-
-int
-rte_eth_dev_flow_ctrl_get(uint8_t port_id, struct rte_eth_fc_conf *fc_conf)
-{
- struct rte_eth_dev *dev;
-
- if (port_id >= nb_ports) {
- PMD_DEBUG_TRACE("Invalid port_id=%d\n", port_id);
- return (-ENODEV);
- }
-
- dev = &rte_eth_devices[port_id];
- FUNC_PTR_OR_ERR_RET(*dev->dev_ops->flow_ctrl_get, -ENOTSUP);
- memset(fc_conf, 0, sizeof(*fc_conf));
- return (*dev->dev_ops->flow_ctrl_get)(dev, fc_conf);
-}
-
-int
-rte_eth_dev_flow_ctrl_set(uint8_t port_id, struct rte_eth_fc_conf *fc_conf)
-{
- struct rte_eth_dev *dev;
-
- if (port_id >= nb_ports) {
- PMD_DEBUG_TRACE("Invalid port_id=%d\n", port_id);
- return (-ENODEV);
- }
-
- if ((fc_conf->send_xon != 0) && (fc_conf->send_xon != 1)) {
- PMD_DEBUG_TRACE("Invalid send_xon, only 0/1 allowed\n");
- return (-EINVAL);
- }
-
- dev = &rte_eth_devices[port_id];
- FUNC_PTR_OR_ERR_RET(*dev->dev_ops->flow_ctrl_set, -ENOTSUP);
- return (*dev->dev_ops->flow_ctrl_set)(dev, fc_conf);
-}
-
-int
-rte_eth_dev_priority_flow_ctrl_set(uint8_t port_id, struct rte_eth_pfc_conf *pfc_conf)
-{
- struct rte_eth_dev *dev;
-
- if (port_id >= nb_ports) {
- PMD_DEBUG_TRACE("Invalid port_id=%d\n", port_id);
- return (-ENODEV);
- }
-
- if (pfc_conf->priority > (ETH_DCB_NUM_USER_PRIORITIES - 1)) {
- PMD_DEBUG_TRACE("Invalid priority, only 0-7 allowed\n");
- return (-EINVAL);
- }
-
- dev = &rte_eth_devices[port_id];
- /* High water, low water validation are device specific */
- if (*dev->dev_ops->priority_flow_ctrl_set)
- return (*dev->dev_ops->priority_flow_ctrl_set)(dev, pfc_conf);
- return (-ENOTSUP);
-}
-
-static inline int
-rte_eth_check_reta_mask(struct rte_eth_rss_reta_entry64 *reta_conf,
- uint16_t reta_size)
-{
- uint16_t i, num;
-
- if (!reta_conf)
- return -EINVAL;
-
- if (reta_size != RTE_ALIGN(reta_size, RTE_RETA_GROUP_SIZE)) {
- PMD_DEBUG_TRACE("Invalid reta size, should be %u aligned\n",
- RTE_RETA_GROUP_SIZE);
- return -EINVAL;