Use the common attr and action parsing infrastructure in ntuple filter.
As a result, some checks have become more stringent, in particular the
group attribute is now explicitly rejected instead of being ignored.

Signed-off-by: Anatoly Burakov <[email protected]>
---
 drivers/net/intel/ixgbe/ixgbe_flow.c | 133 ++++++++-------------------
 1 file changed, 36 insertions(+), 97 deletions(-)

diff --git a/drivers/net/intel/ixgbe/ixgbe_flow.c 
b/drivers/net/intel/ixgbe/ixgbe_flow.c
index 00104636a7..46161e6146 100644
--- a/drivers/net/intel/ixgbe/ixgbe_flow.c
+++ b/drivers/net/intel/ixgbe/ixgbe_flow.c
@@ -219,12 +219,11 @@ ixgbe_flow_actions_check(const struct ci_flow_actions 
*actions,
 static int
 cons_parse_ntuple_filter(const struct rte_flow_attr *attr,
                         const struct rte_flow_item pattern[],
-                        const struct rte_flow_action actions[],
+                        const struct rte_flow_action_queue *q_act,
                         struct rte_eth_ntuple_filter *filter,
                         struct rte_flow_error *error)
 {
        const struct rte_flow_item *item;
-       const struct rte_flow_action *act;
        const struct rte_flow_item_ipv4 *ipv4_spec;
        const struct rte_flow_item_ipv4 *ipv4_mask;
        const struct rte_flow_item_tcp *tcp_spec;
@@ -240,24 +239,11 @@ cons_parse_ntuple_filter(const struct rte_flow_attr *attr,
        struct rte_flow_item_eth eth_null;
        struct rte_flow_item_vlan vlan_null;
 
-       if (!pattern) {
-               rte_flow_error_set(error,
-                       EINVAL, RTE_FLOW_ERROR_TYPE_ITEM_NUM,
-                       NULL, "NULL pattern.");
-               return -rte_errno;
-       }
-
-       if (!actions) {
-               rte_flow_error_set(error, EINVAL,
-                                  RTE_FLOW_ERROR_TYPE_ACTION_NUM,
-                                  NULL, "NULL action.");
-               return -rte_errno;
-       }
-       if (!attr) {
-               rte_flow_error_set(error, EINVAL,
-                                  RTE_FLOW_ERROR_TYPE_ATTR,
-                                  NULL, "NULL attribute.");
-               return -rte_errno;
+       /* Priority must be 16-bit */
+       if (attr->priority > UINT16_MAX) {
+               return rte_flow_error_set(error, EINVAL,
+                               RTE_FLOW_ERROR_TYPE_ATTR_PRIORITY, attr,
+                               "Priority must be 16-bit");
        }
 
        memset(&eth_null, 0, sizeof(struct rte_flow_item_eth));
@@ -553,70 +539,11 @@ cons_parse_ntuple_filter(const struct rte_flow_attr *attr,
 
 action:
 
-       /**
-        * n-tuple only supports forwarding,
-        * check if the first not void action is QUEUE.
-        */
-       act = next_no_void_action(actions, NULL);
-       if (act->type != RTE_FLOW_ACTION_TYPE_QUEUE) {
-               memset(filter, 0, sizeof(struct rte_eth_ntuple_filter));
-               rte_flow_error_set(error, EINVAL,
-                       RTE_FLOW_ERROR_TYPE_ACTION,
-                       item, "Not supported action.");
-               return -rte_errno;
-       }
-       filter->queue =
-               ((const struct rte_flow_action_queue *)act->conf)->index;
+       filter->queue = q_act->index;
 
-       /* check if the next not void item is END */
-       act = next_no_void_action(actions, act);
-       if (act->type != RTE_FLOW_ACTION_TYPE_END) {
-               memset(filter, 0, sizeof(struct rte_eth_ntuple_filter));
-               rte_flow_error_set(error, EINVAL,
-                       RTE_FLOW_ERROR_TYPE_ACTION,
-                       act, "Not supported action.");
-               return -rte_errno;
-       }
-
-       /* parse attr */
-       /* must be input direction */
-       if (!attr->ingress) {
-               memset(filter, 0, sizeof(struct rte_eth_ntuple_filter));
-               rte_flow_error_set(error, EINVAL,
-                                  RTE_FLOW_ERROR_TYPE_ATTR_INGRESS,
-                                  attr, "Only support ingress.");
-               return -rte_errno;
-       }
-
-       /* not supported */
-       if (attr->egress) {
-               memset(filter, 0, sizeof(struct rte_eth_ntuple_filter));
-               rte_flow_error_set(error, EINVAL,
-                                  RTE_FLOW_ERROR_TYPE_ATTR_EGRESS,
-                                  attr, "Not support egress.");
-               return -rte_errno;
-       }
-
-       /* not supported */
-       if (attr->transfer) {
-               memset(filter, 0, sizeof(struct rte_eth_ntuple_filter));
-               rte_flow_error_set(error, EINVAL,
-                                  RTE_FLOW_ERROR_TYPE_ATTR_TRANSFER,
-                                  attr, "No support for transfer.");
-               return -rte_errno;
-       }
-
-       if (attr->priority > 0xFFFF) {
-               memset(filter, 0, sizeof(struct rte_eth_ntuple_filter));
-               rte_flow_error_set(error, EINVAL,
-                                  RTE_FLOW_ERROR_TYPE_ATTR_PRIORITY,
-                                  attr, "Error priority.");
-               return -rte_errno;
-       }
        filter->priority = (uint16_t)attr->priority;
-       if (attr->priority < IXGBE_MIN_N_TUPLE_PRIO ||
-           attr->priority > IXGBE_MAX_N_TUPLE_PRIO)
-           filter->priority = 1;
+       if (attr->priority < IXGBE_MIN_N_TUPLE_PRIO || attr->priority > 
IXGBE_MAX_N_TUPLE_PRIO)
+               filter->priority = 1;
 
        return 0;
 }
@@ -705,15 +632,40 @@ ixgbe_parse_ntuple_filter(struct rte_eth_dev *dev,
                          struct rte_eth_ntuple_filter *filter,
                          struct rte_flow_error *error)
 {
-       int ret;
        struct ixgbe_hw *hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+       struct ci_flow_attr_check_param attr_param = {
+               .allow_priority = true,
+       };
+       struct ci_flow_actions parsed_actions;
+       struct ci_flow_actions_check_param ap_param = {
+               .allowed_types = (const enum rte_flow_action_type[]){
+                       /* only queue is allowed here */
+                       RTE_FLOW_ACTION_TYPE_QUEUE,
+                       RTE_FLOW_ACTION_TYPE_END
+               },
+               .driver_ctx = dev,
+               .check = ixgbe_flow_actions_check,
+               .max_actions = 1,
+       };
+       const struct rte_flow_action *action;
+       int ret;
 
        if (hw->mac.type != ixgbe_mac_82599EB &&
                        hw->mac.type != ixgbe_mac_X540)
                return -ENOTSUP;
 
-       ret = cons_parse_ntuple_filter(attr, pattern, actions, filter, error);
+       /* validate attributes */
+       ret = ci_flow_check_attr(attr, &attr_param, error);
+       if (ret)
+               return ret;
 
+       /* parse requested actions */
+       ret = ci_flow_check_actions(actions, &ap_param, &parsed_actions, error);
+       if (ret)
+               return ret;
+       action = parsed_actions.actions[0];
+
+       ret = cons_parse_ntuple_filter(attr, pattern, action->conf, filter, 
error);
        if (ret)
                return ret;
 
@@ -726,19 +678,6 @@ ixgbe_parse_ntuple_filter(struct rte_eth_dev *dev,
                return -rte_errno;
        }
 
-       /* Ixgbe doesn't support many priorities. */
-       if (filter->priority < IXGBE_MIN_N_TUPLE_PRIO ||
-           filter->priority > IXGBE_MAX_N_TUPLE_PRIO) {
-               memset(filter, 0, sizeof(struct rte_eth_ntuple_filter));
-               rte_flow_error_set(error, EINVAL,
-                       RTE_FLOW_ERROR_TYPE_ITEM,
-                       NULL, "Priority not supported by ntuple filter");
-               return -rte_errno;
-       }
-
-       if (filter->queue >= dev->data->nb_rx_queues)
-               return -rte_errno;
-
        /* fixed value for ixgbe */
        filter->flags = RTE_5TUPLE_FLAGS;
        return 0;
-- 
2.47.3

Reply via email to