Use the common flow action checking parsing infrastructure for checking flow actions for hash filter.
Signed-off-by: Anatoly Burakov <[email protected]> --- drivers/net/intel/iavf/iavf_hash.c | 143 +++++++++++++++-------------- 1 file changed, 72 insertions(+), 71 deletions(-) diff --git a/drivers/net/intel/iavf/iavf_hash.c b/drivers/net/intel/iavf/iavf_hash.c index b569450b82..d8c9e900e8 100644 --- a/drivers/net/intel/iavf/iavf_hash.c +++ b/drivers/net/intel/iavf/iavf_hash.c @@ -1428,95 +1428,81 @@ iavf_any_invalid_rss_type(enum rte_eth_hash_function rss_func, } static int -iavf_hash_parse_action(struct iavf_pattern_match_item *match_item, - const struct rte_flow_action actions[], - uint64_t pattern_hint, struct iavf_rss_meta *rss_meta, - struct rte_flow_error *error) +iavf_hash_parse_rss_type(struct iavf_pattern_match_item *match_item, + const struct rte_flow_action_rss *rss, + uint64_t pattern_hint, struct iavf_rss_meta *rss_meta, + struct rte_flow_error *error) { - enum rte_flow_action_type action_type; - const struct rte_flow_action_rss *rss; - const struct rte_flow_action *action; uint64_t rss_type; - /* Supported action is RSS. */ - for (action = actions; action->type != - RTE_FLOW_ACTION_TYPE_END; action++) { - action_type = action->type; - switch (action_type) { - case RTE_FLOW_ACTION_TYPE_RSS: - rss = action->conf; - rss_type = rss->types; + rss_meta->rss_algorithm = rss->func == RTE_ETH_HASH_FUNCTION_SYMMETRIC_TOEPLITZ ? + VIRTCHNL_RSS_ALG_TOEPLITZ_SYMMETRIC : + VIRTCHNL_RSS_ALG_TOEPLITZ_ASYMMETRIC; - if (rss->func == - RTE_ETH_HASH_FUNCTION_SIMPLE_XOR){ - rss_meta->rss_algorithm = - VIRTCHNL_RSS_ALG_XOR_ASYMMETRIC; - return rte_flow_error_set(error, ENOTSUP, - RTE_FLOW_ERROR_TYPE_ACTION, action, - "function simple_xor is not supported"); - } else if (rss->func == - RTE_ETH_HASH_FUNCTION_SYMMETRIC_TOEPLITZ) { - rss_meta->rss_algorithm = - VIRTCHNL_RSS_ALG_TOEPLITZ_SYMMETRIC; - } else { - rss_meta->rss_algorithm = - VIRTCHNL_RSS_ALG_TOEPLITZ_ASYMMETRIC; - } + /* If pattern type is raw, no need to refine rss type */ + if (pattern_hint == IAVF_PHINT_RAW) + return 0; - if (rss->level) - return rte_flow_error_set(error, ENOTSUP, - RTE_FLOW_ERROR_TYPE_ACTION, action, - "a nonzero RSS encapsulation level is not supported"); + /** + * Check simultaneous use of SRC_ONLY and DST_ONLY + * of the same level. + */ + rss_type = rte_eth_rss_hf_refine(rss->types); - if (rss->key_len) - return rte_flow_error_set(error, ENOTSUP, - RTE_FLOW_ERROR_TYPE_ACTION, action, - "a nonzero RSS key_len is not supported"); + if (iavf_any_invalid_rss_type(rss->func, rss_type, match_item->input_set_mask)) { + return rte_flow_error_set(error, ENOTSUP, + RTE_FLOW_ERROR_TYPE_ACTION_CONF, rss, + "RSS type not supported"); + } - if (rss->queue_num) - return rte_flow_error_set(error, ENOTSUP, - RTE_FLOW_ERROR_TYPE_ACTION, action, - "a non-NULL RSS queue is not supported"); + memcpy(&rss_meta->proto_hdrs, match_item->meta, sizeof(struct virtchnl_proto_hdrs)); - /* If pattern type is raw, no need to refine rss type */ - if (pattern_hint == IAVF_PHINT_RAW) - break; + iavf_refine_proto_hdrs(&rss_meta->proto_hdrs, rss_type, pattern_hint); - /** - * Check simultaneous use of SRC_ONLY and DST_ONLY - * of the same level. - */ - rss_type = rte_eth_rss_hf_refine(rss_type); + return 0; +} - if (iavf_any_invalid_rss_type(rss->func, rss_type, - match_item->input_set_mask)) - return rte_flow_error_set(error, ENOTSUP, - RTE_FLOW_ERROR_TYPE_ACTION, - action, "RSS type not supported"); +static int +iavf_hash_parse_action_check(const struct ci_flow_actions *actions, + const struct ci_flow_actions_check_param *param __rte_unused, + struct rte_flow_error *error) +{ + const struct rte_flow_action_rss *rss = actions->actions[0]->conf; - memcpy(&rss_meta->proto_hdrs, match_item->meta, - sizeof(struct virtchnl_proto_hdrs)); + /* filter out unsupported RSS functions */ + switch (rss->func) { + case RTE_ETH_HASH_FUNCTION_SIMPLE_XOR: + case RTE_ETH_HASH_FUNCTION_SYMMETRIC_TOEPLITZ_SORT: + return rte_flow_error_set(error, ENOTSUP, + RTE_FLOW_ERROR_TYPE_ACTION_CONF, rss, + "Selected RSS hash function not supported"); + default: + break; + } - iavf_refine_proto_hdrs(&rss_meta->proto_hdrs, - rss_type, pattern_hint); - break; + if (rss->level != 0) { + return rte_flow_error_set(error, ENOTSUP, + RTE_FLOW_ERROR_TYPE_ACTION_CONF, rss, + "Nonzero RSS encapsulation level is not supported"); + } - case RTE_FLOW_ACTION_TYPE_END: - break; + if (rss->key_len != 0) { + return rte_flow_error_set(error, ENOTSUP, + RTE_FLOW_ERROR_TYPE_ACTION_CONF, rss, + "RSS key is not supported"); + } - default: - rte_flow_error_set(error, EINVAL, - RTE_FLOW_ERROR_TYPE_ACTION, action, - "Invalid action."); - return -rte_errno; - } + if (rss->queue_num != 0) { + return rte_flow_error_set(error, ENOTSUP, + RTE_FLOW_ERROR_TYPE_ACTION_CONF, rss, + "RSS queue region is not supported"); } return 0; } static int -iavf_hash_parse_pattern_action(__rte_unused struct iavf_adapter *ad, +iavf_hash_parse_pattern_action(struct iavf_adapter *ad, struct iavf_pattern_match_item *array, uint32_t array_len, const struct rte_flow_item pattern[], @@ -1525,6 +1511,17 @@ iavf_hash_parse_pattern_action(__rte_unused struct iavf_adapter *ad, void **meta, struct rte_flow_error *error) { + struct ci_flow_actions parsed_actions = {0}; + struct ci_flow_actions_check_param param = { + .allowed_types = (enum rte_flow_action_type[]){ + RTE_FLOW_ACTION_TYPE_RSS, + RTE_FLOW_ACTION_TYPE_END + }, + .max_actions = 1, + .driver_ctx = ad, + .check = iavf_hash_parse_action_check, + }; + const struct rte_flow_action_rss *rss; struct iavf_pattern_match_item *pattern_match_item; struct iavf_rss_meta *rss_meta_ptr; uint64_t phint = IAVF_PHINT_NONE; @@ -1534,6 +1531,10 @@ iavf_hash_parse_pattern_action(__rte_unused struct iavf_adapter *ad, if (ret) return ret; + ret = ci_flow_check_actions(actions, ¶m, &parsed_actions, error); + if (ret) + return ret; + rss_meta_ptr = rte_zmalloc(NULL, sizeof(*rss_meta_ptr), 0); if (!rss_meta_ptr) { rte_flow_error_set(error, EINVAL, @@ -1566,8 +1567,8 @@ iavf_hash_parse_pattern_action(__rte_unused struct iavf_adapter *ad, } } - ret = iavf_hash_parse_action(pattern_match_item, actions, phint, - rss_meta_ptr, error); + rss = parsed_actions.actions[0]->conf; + ret = iavf_hash_parse_rss_type(pattern_match_item, rss, phint, rss_meta_ptr, error); error: if (!ret && meta) -- 2.47.3

