common/mlx5: move to formal ASO action API
[dpdk.git] / drivers / net / iavf / iavf_fdir.c
index 264c47d..d683a46 100644 (file)
        IAVF_INSET_IPV6_TC | IAVF_INSET_IPV6_HOP_LIMIT | \
        IAVF_INSET_SCTP_SRC_PORT | IAVF_INSET_SCTP_DST_PORT)
 
-#define IAVF_FDIR_INSET_GTPU (\
+#define IAVF_FDIR_INSET_IPV4_GTPU (\
        IAVF_INSET_IPV4_SRC | IAVF_INSET_IPV4_DST | \
        IAVF_INSET_GTPU_TEID)
 
-#define IAVF_FDIR_INSET_GTPU_EH (\
+#define IAVF_FDIR_INSET_IPV4_GTPU_EH (\
        IAVF_INSET_IPV4_SRC | IAVF_INSET_IPV4_DST | \
        IAVF_INSET_GTPU_TEID | IAVF_INSET_GTPU_QFI)
 
+#define IAVF_FDIR_INSET_IPV6_GTPU (\
+       IAVF_INSET_IPV6_SRC | IAVF_INSET_IPV6_DST | \
+       IAVF_INSET_GTPU_TEID)
+
+#define IAVF_FDIR_INSET_IPV6_GTPU_EH (\
+       IAVF_INSET_IPV6_SRC | IAVF_INSET_IPV6_DST | \
+       IAVF_INSET_GTPU_TEID | IAVF_INSET_GTPU_QFI)
+
 #define IAVF_FDIR_INSET_L2TPV3OIP (\
        IAVF_L2TPV3OIP_SESSION_ID)
 
@@ -106,8 +114,10 @@ static struct iavf_pattern_match_item iavf_fdir_pattern[] = {
        {iavf_pattern_eth_ipv6_udp,             IAVF_FDIR_INSET_ETH_IPV6_UDP,           IAVF_INSET_NONE},
        {iavf_pattern_eth_ipv6_tcp,             IAVF_FDIR_INSET_ETH_IPV6_TCP,           IAVF_INSET_NONE},
        {iavf_pattern_eth_ipv6_sctp,            IAVF_FDIR_INSET_ETH_IPV6_SCTP,          IAVF_INSET_NONE},
-       {iavf_pattern_eth_ipv4_gtpu,            IAVF_FDIR_INSET_GTPU,                   IAVF_INSET_NONE},
-       {iavf_pattern_eth_ipv4_gtpu_eh,         IAVF_FDIR_INSET_GTPU_EH,                IAVF_INSET_NONE},
+       {iavf_pattern_eth_ipv4_gtpu,            IAVF_FDIR_INSET_IPV4_GTPU,              IAVF_INSET_NONE},
+       {iavf_pattern_eth_ipv4_gtpu_eh,         IAVF_FDIR_INSET_IPV4_GTPU_EH,           IAVF_INSET_NONE},
+       {iavf_pattern_eth_ipv6_gtpu,            IAVF_FDIR_INSET_IPV6_GTPU,              IAVF_INSET_NONE},
+       {iavf_pattern_eth_ipv6_gtpu_eh,         IAVF_FDIR_INSET_IPV6_GTPU_EH,           IAVF_INSET_NONE},
        {iavf_pattern_eth_ipv4_l2tpv3,          IAVF_FDIR_INSET_L2TPV3OIP,              IAVF_INSET_NONE},
        {iavf_pattern_eth_ipv6_l2tpv3,          IAVF_FDIR_INSET_L2TPV3OIP,              IAVF_INSET_NONE},
        {iavf_pattern_eth_ipv4_esp,             IAVF_FDIR_INSET_ESP,                    IAVF_INSET_NONE},
@@ -246,6 +256,7 @@ iavf_fdir_parse_action_qregion(struct iavf_adapter *ad,
                        const struct rte_flow_action *act,
                        struct virtchnl_filter_action *filter_action)
 {
+       struct iavf_info *vf = IAVF_DEV_PRIVATE_TO_VF(ad);
        const struct rte_flow_action_rss *rss = act->conf;
        uint32_t i;
 
@@ -290,6 +301,13 @@ iavf_fdir_parse_action_qregion(struct iavf_adapter *ad,
                return -rte_errno;
        }
 
+       if (rss->queue_num > vf->max_rss_qregion) {
+               rte_flow_error_set(error, EINVAL,
+                               RTE_FLOW_ERROR_TYPE_ACTION, act,
+                               "The region size cannot be large than the supported max RSS queue region");
+               return -rte_errno;
+       }
+
        filter_action->act_conf.queue.index = rss->queue[0];
        filter_action->act_conf.queue.region = rte_fls_u32(rss->queue_num) - 1;