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(ð_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

