net/ice: fix flow priority support in non-pipeline mode
authorYuying Zhang <yuying.zhang@intel.com>
Sat, 18 Sep 2021 06:49:30 +0000 (06:49 +0000)
committerQi Zhang <qi.z.zhang@intel.com>
Wed, 22 Sep 2021 07:31:07 +0000 (09:31 +0200)
Lower values denote higher priority with 0 as the maximum.
The usage of priority in non-pipeline mode is wrong.

This patch fixed this issue in switch filter and added input
validation of priority in FDIR, RSS and ACL filter which
only support one priority level.

Fixes: 2321e34c23b3 ("net/ice: support flow priority for DCF switch filter")
Cc: stable@dpdk.org
Signed-off-by: Yuying Zhang <yuying.zhang@intel.com>
Acked-by: Qi Zhang <qi.z.zhang@intel.com>
drivers/net/ice/ice_acl_filter.c
drivers/net/ice/ice_fdir_filter.c
drivers/net/ice/ice_generic_flow.c
drivers/net/ice/ice_hash.c
drivers/net/ice/ice_switch_filter.c

index 0c15a7036cb31df17a8e52d045db1d2b82c9518d..614bd44e23eb611bbdc6dc7d2b21994b99e65189 100644 (file)
@@ -904,7 +904,7 @@ ice_acl_parse(struct ice_adapter *ad,
               uint32_t array_len,
               const struct rte_flow_item pattern[],
               const struct rte_flow_action actions[],
-              uint32_t priority __rte_unused,
+              uint32_t priority,
               void **meta,
               struct rte_flow_error *error)
 {
@@ -914,6 +914,9 @@ ice_acl_parse(struct ice_adapter *ad,
        uint64_t input_set;
        int ret;
 
+       if (priority >= 1)
+               return -rte_errno;
+
        memset(filter, 0, sizeof(*filter));
        item = ice_search_pattern_match_item(ad, pattern, array, array_len,
                                             error);
index 7ba65b9b04cdff1cae7331877e0cbc8a22493835..af9669fac6af7554013f92277c7a8d323bb1778a 100644 (file)
@@ -2194,7 +2194,7 @@ ice_fdir_parse(struct ice_adapter *ad,
               uint32_t array_len,
               const struct rte_flow_item pattern[],
               const struct rte_flow_action actions[],
-              uint32_t priority __rte_unused,
+              uint32_t priority,
               void **meta,
               struct rte_flow_error *error)
 {
@@ -2207,6 +2207,10 @@ ice_fdir_parse(struct ice_adapter *ad,
        memset(filter, 0, sizeof(*filter));
        item = ice_search_pattern_match_item(ad, pattern, array, array_len,
                                             error);
+
+       if (!ad->devargs.pipe_mode_support && priority >= 1)
+               return -rte_errno;
+
        if (!item)
                return -rte_errno;
 
index 9e03c2856c1769d79d6485d14afbe69250fad559..13e3734172385abd878fd2f1dde3d813ac81c7b6 100644 (file)
@@ -1923,9 +1923,9 @@ ice_register_parser(struct ice_flow_parser *parser,
        } else {
                if (parser->engine->type == ICE_FLOW_ENGINE_SWITCH ||
                                parser->engine->type == ICE_FLOW_ENGINE_HASH)
-                       TAILQ_INSERT_TAIL(list, parser_node, node);
-               else if (parser->engine->type == ICE_FLOW_ENGINE_FDIR)
                        TAILQ_INSERT_HEAD(list, parser_node, node);
+               else if (parser->engine->type == ICE_FLOW_ENGINE_FDIR)
+                       TAILQ_INSERT_TAIL(list, parser_node, node);
                else if (parser->engine->type == ICE_FLOW_ENGINE_ACL)
                        TAILQ_INSERT_HEAD(list, parser_node, node);
                else
index 54d14dfcddfb8fba820ef4cc58a11d2bba5d83c0..175780c9ff4b8674842cf64dda4ba93f818ce421 100644 (file)
@@ -1034,7 +1034,7 @@ ice_hash_parse_pattern_action(__rte_unused struct ice_adapter *ad,
                        uint32_t array_len,
                        const struct rte_flow_item pattern[],
                        const struct rte_flow_action actions[],
-                       uint32_t priority __rte_unused,
+                       uint32_t priority,
                        void **meta,
                        struct rte_flow_error *error)
 {
@@ -1043,6 +1043,9 @@ ice_hash_parse_pattern_action(__rte_unused struct ice_adapter *ad,
        struct ice_rss_meta *rss_meta_ptr;
        uint64_t phint = ICE_PHINT_NONE;
 
+       if (priority >= 1)
+               return -rte_errno;
+
        rss_meta_ptr = rte_zmalloc(NULL, sizeof(*rss_meta_ptr), 0);
        if (!rss_meta_ptr) {
                rte_flow_error_set(error, EINVAL,
index bbd2805c37963f2c64bea122406117a8cad0ce0a..f4f6cf2f0689d26de952373c079b6980eba36de2 100644 (file)
@@ -31,6 +31,7 @@
 #define ICE_PPP_IPV4_PROTO     0x0021
 #define ICE_PPP_IPV6_PROTO     0x0057
 #define ICE_IPV4_PROTO_NVGRE   0x002F
+#define ICE_SW_PRI_BASE 6
 
 #define ICE_SW_INSET_ETHER ( \
        ICE_INSET_DMAC | ICE_INSET_SMAC | ICE_INSET_ETHERTYPE)
@@ -1592,7 +1593,10 @@ ice_switch_parse_dcf_action(struct ice_dcf_adapter *ad,
        rule_info->sw_act.src = rule_info->sw_act.vsi_handle;
        rule_info->sw_act.flag = ICE_FLTR_RX;
        rule_info->rx = 1;
-       rule_info->priority = 6 - priority;
+       /* 0 denotes lowest priority of recipe and highest priority
+        * of rte_flow. Change rte_flow priority into recipe priority.
+        */
+       rule_info->priority = ICE_SW_PRI_BASE - priority;
 
        return 0;
 }
@@ -1671,7 +1675,10 @@ ice_switch_parse_action(struct ice_pf *pf,
        rule_info->sw_act.vsi_handle = vsi->idx;
        rule_info->rx = 1;
        rule_info->sw_act.src = vsi->idx;
-       rule_info->priority = priority + 5;
+       /* 0 denotes lowest priority of recipe and highest priority
+        * of rte_flow. Change rte_flow priority into recipe priority.
+        */
+       rule_info->priority = ICE_SW_PRI_BASE - priority;
 
        return 0;