From: Vladimir Medvedkin <[email protected]>

Use the common flow action checking parsing infrastructure for checking
flow actions for hash filter.

Signed-off-by: Vladimir Medvedkin <[email protected]>
---
 drivers/net/intel/ice/ice_hash.c | 178 +++++++++++++++++--------------
 1 file changed, 95 insertions(+), 83 deletions(-)

diff --git a/drivers/net/intel/ice/ice_hash.c b/drivers/net/intel/ice/ice_hash.c
index 7b77890790..250d8f97d1 100644
--- a/drivers/net/intel/ice/ice_hash.c
+++ b/drivers/net/intel/ice/ice_hash.c
@@ -1065,94 +1065,92 @@ ice_any_invalid_rss_type(enum rte_eth_hash_function 
rss_func,
 }
 
 static int
-ice_hash_parse_action(struct ice_pattern_match_item *pattern_match_item,
-               const struct rte_flow_action actions[],
+ice_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;
+
+       rss = actions->actions[0]->conf;
+
+       switch (rss->func) {
+       case RTE_ETH_HASH_FUNCTION_DEFAULT:
+       case RTE_ETH_HASH_FUNCTION_TOEPLITZ:
+       case RTE_ETH_HASH_FUNCTION_SIMPLE_XOR:
+       case RTE_ETH_HASH_FUNCTION_SYMMETRIC_TOEPLITZ:
+               break;
+       default:
+               return rte_flow_error_set(error, ENOTSUP,
+                               RTE_FLOW_ERROR_TYPE_ACTION_CONF, rss,
+                               "Selected RSS hash function not supported");
+       }
+
+       if (rss->level)
+               return rte_flow_error_set(error, ENOTSUP,
+                               RTE_FLOW_ERROR_TYPE_ACTION_CONF, rss,
+                               "a nonzero RSS encapsulation level is not 
supported");
+
+       if (rss->key_len)
+               return rte_flow_error_set(error, ENOTSUP,
+                               RTE_FLOW_ERROR_TYPE_ACTION_CONF, rss,
+                               "a nonzero RSS key_len is not supported");
+
+       if (rss->queue)
+               return rte_flow_error_set(error, ENOTSUP,
+                               RTE_FLOW_ERROR_TYPE_ACTION_CONF, rss,
+                               "a non-NULL RSS queue is not supported");
+
+       return 0;
+}
+
+static int
+ice_hash_parse_rss_action(struct ice_pattern_match_item *pattern_match_item,
+               const struct rte_flow_action_rss *rss,
                uint64_t pattern_hint, struct ice_rss_meta *rss_meta,
                struct rte_flow_error *error)
 {
        struct ice_rss_hash_cfg *cfg = pattern_match_item->meta;
-       enum rte_flow_action_type action_type;
-       const struct rte_flow_action_rss *rss;
-       const struct rte_flow_action *action;
        uint64_t rss_type;
+       bool symm = false;
 
-       /* 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;
-
-                       /* Check hash function and save it to rss_meta. */
-                       if (pattern_match_item->pattern_list !=
-                           pattern_empty && rss->func ==
-                           RTE_ETH_HASH_FUNCTION_SIMPLE_XOR) {
-                               return rte_flow_error_set(error, ENOTSUP,
-                                       RTE_FLOW_ERROR_TYPE_ACTION, action,
-                                       "Not supported flow");
-                       } else if (rss->func ==
-                                  RTE_ETH_HASH_FUNCTION_SIMPLE_XOR){
-                               rss_meta->hash_function =
-                               RTE_ETH_HASH_FUNCTION_SIMPLE_XOR;
-                               return 0;
-                       } else if (rss->func ==
-                                  RTE_ETH_HASH_FUNCTION_SYMMETRIC_TOEPLITZ) {
-                               rss_meta->hash_function =
-                               RTE_ETH_HASH_FUNCTION_SYMMETRIC_TOEPLITZ;
-                               if (pattern_hint == ICE_PHINT_RAW)
-                                       rss_meta->raw.symm = true;
-                               else
-                                       cfg->symm = true;
-                       }
-
-                       if (rss->level)
-                               return rte_flow_error_set(error, ENOTSUP,
-                                       RTE_FLOW_ERROR_TYPE_ACTION, action,
-                                       "a nonzero RSS encapsulation level is 
not supported");
-
-                       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 (rss->queue)
-                               return rte_flow_error_set(error, ENOTSUP,
-                                       RTE_FLOW_ERROR_TYPE_ACTION, action,
-                                       "a non-NULL RSS queue is not 
supported");
-
-                       /* If pattern type is raw, no need to refine rss type */
-                       if (pattern_hint == ICE_PHINT_RAW)
-                               break;
-
-                       /**
-                        * Check simultaneous use of SRC_ONLY and DST_ONLY
-                        * of the same level.
-                        */
-                       rss_type = rte_eth_rss_hf_refine(rss_type);
-
-                       if (ice_any_invalid_rss_type(rss->func, rss_type,
-                                       pattern_match_item->input_set_mask_o))
-                               return rte_flow_error_set(error, ENOTSUP,
-                                       RTE_FLOW_ERROR_TYPE_ACTION,
-                                       action, "RSS type not supported");
-
-                       rss_meta->cfg = *cfg;
-                       ice_refine_hash_cfg(&rss_meta->cfg,
-                                           rss_type, pattern_hint);
-                       break;
-               case RTE_FLOW_ACTION_TYPE_END:
-                       break;
-
-               default:
-                       rte_flow_error_set(error, EINVAL,
-                                       RTE_FLOW_ERROR_TYPE_ACTION, action,
-                                       "Invalid action.");
-                       return -rte_errno;
+       if (rss->func == RTE_ETH_HASH_FUNCTION_SIMPLE_XOR) {
+               if (pattern_match_item->pattern_list != pattern_empty) {
+                       return rte_flow_error_set(error, ENOTSUP,
+                                       RTE_FLOW_ERROR_TYPE_ACTION_CONF, rss,
+                                       "XOR hash function is only supported 
for empty pattern");
                }
+               rss_meta->hash_function = RTE_ETH_HASH_FUNCTION_SIMPLE_XOR;
+               return 0;
        }
 
+       if (rss->func == RTE_ETH_HASH_FUNCTION_SYMMETRIC_TOEPLITZ) {
+               rss_meta->hash_function = 
RTE_ETH_HASH_FUNCTION_SYMMETRIC_TOEPLITZ;
+               symm = true;
+       }
+
+       /* If pattern type is raw, no need to refine rss type */
+       if (pattern_hint == ICE_PHINT_RAW) {
+               rss_meta->raw.symm = symm;
+               return 0;
+       }
+       cfg->symm = symm;
+
+       /**
+        * Check simultaneous use of SRC_ONLY and DST_ONLY
+        * of the same level.
+        */
+       rss_type = rte_eth_rss_hf_refine(rss->types);
+
+       if (ice_any_invalid_rss_type(rss->func, rss_type,
+                               pattern_match_item->input_set_mask_o))
+               return rte_flow_error_set(error, ENOTSUP,
+                               RTE_FLOW_ERROR_TYPE_ACTION_CONF,
+                               rss, "RSS type not supported");
+
+       rss_meta->cfg = *cfg;
+       ice_refine_hash_cfg(&rss_meta->cfg,
+                           rss_type, pattern_hint);
+
        return 0;
 }
 
@@ -1166,15 +1164,29 @@ ice_hash_parse_pattern_action(__rte_unused struct 
ice_adapter *ad,
                        void **meta,
                        struct rte_flow_error *error)
 {
-       int ret = 0;
+       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,
+               .check = ice_hash_parse_action_check,
+       };
+       const struct rte_flow_action_rss *rss;
        struct ice_pattern_match_item *pattern_match_item;
        struct ice_rss_meta *rss_meta_ptr;
        uint64_t phint = ICE_PHINT_NONE;
+       int ret = 0;
 
        ret = ci_flow_check_attr(attr, NULL, error);
        if (ret)
                return ret;
 
+       ret = ci_flow_check_actions(actions, &param, &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,
@@ -1206,9 +1218,9 @@ ice_hash_parse_pattern_action(__rte_unused struct 
ice_adapter *ad,
                }
        }
 
-       /* Check rss action. */
-       ret = ice_hash_parse_action(pattern_match_item, actions, phint,
-                                   rss_meta_ptr, error);
+       rss = parsed_actions.actions[0]->conf;
+       ret = ice_hash_parse_rss_action(pattern_match_item, rss, phint,
+                               rss_meta_ptr, error);
 
 error:
        if (!ret && meta)
-- 
2.47.3

Reply via email to