From: Huisong Li <lihuis...@huawei.com>

When user only use 'ipv4' to set 'rss_hf', hns3 will enable
all tuple fields for 'ipv4' flow. But if user use 'ipv4-tcp'
, 'ipv4' and 'l4-src-only' to set 'rss_hf', driver does not
enable all tuple fields for 'ipv4' flow. So this patch fixes
this problem.

Fixes: 806f1d5ab0e3 ("net/hns3: set RSS hash type input configuration")
Cc: sta...@dpdk.org

Signed-off-by: Huisong Li <lihuis...@huawei.com>
Signed-off-by: Dongdong Liu <liudongdo...@huawei.com>
---
 drivers/net/hns3/hns3_rss.c | 266 ++++++++++++++++++++++++------------
 1 file changed, 176 insertions(+), 90 deletions(-)

diff --git a/drivers/net/hns3/hns3_rss.c b/drivers/net/hns3/hns3_rss.c
index 6d71ee94a9..ea745c791f 100644
--- a/drivers/net/hns3/hns3_rss.c
+++ b/drivers/net/hns3/hns3_rss.c
@@ -70,130 +70,209 @@ enum hns3_tuple_field {
        HNS3_RSS_FIELD_IPV6_FRAG_IP_S
 };
 
+enum hns3_rss_tuple_type {
+       HNS3_RSS_IP_TUPLE,
+       HNS3_RSS_IP_L4_TUPLE,
+};
+
 static const struct {
        uint64_t rss_types;
+       uint16_t tuple_type;
        uint64_t rss_field;
 } hns3_set_tuple_table[] = {
+       /* IPV4-FRAG */
        { RTE_ETH_RSS_FRAG_IPV4 | RTE_ETH_RSS_L3_SRC_ONLY,
+         HNS3_RSS_IP_TUPLE,
          BIT_ULL(HNS3_RSS_FIELD_IPV4_EN_FRAG_IP_S) },
        { RTE_ETH_RSS_FRAG_IPV4 | RTE_ETH_RSS_L3_DST_ONLY,
+         HNS3_RSS_IP_TUPLE,
+         BIT_ULL(HNS3_RSS_FIELD_IPV4_EN_FRAG_IP_D) },
+       { RTE_ETH_RSS_FRAG_IPV4,
+         HNS3_RSS_IP_TUPLE,
+         BIT_ULL(HNS3_RSS_FIELD_IPV4_EN_FRAG_IP_S) |
          BIT_ULL(HNS3_RSS_FIELD_IPV4_EN_FRAG_IP_D) },
+
+       /* IPV4 */
+       { RTE_ETH_RSS_IPV4 | RTE_ETH_RSS_L3_SRC_ONLY,
+         HNS3_RSS_IP_TUPLE,
+         BIT_ULL(HNS3_RSS_FIELD_IPV4_EN_NONFRAG_IP_S) },
+       { RTE_ETH_RSS_IPV4 | RTE_ETH_RSS_L3_DST_ONLY,
+         HNS3_RSS_IP_TUPLE,
+         BIT_ULL(HNS3_RSS_FIELD_IPV4_EN_NONFRAG_IP_D) },
+       { RTE_ETH_RSS_IPV4,
+         HNS3_RSS_IP_TUPLE,
+         BIT_ULL(HNS3_RSS_FIELD_IPV4_EN_NONFRAG_IP_S) |
+         BIT_ULL(HNS3_RSS_FIELD_IPV4_EN_NONFRAG_IP_D) },
+
+       /* IPV4-OTHER */
+       { RTE_ETH_RSS_NONFRAG_IPV4_OTHER | RTE_ETH_RSS_L3_SRC_ONLY,
+         HNS3_RSS_IP_TUPLE,
+         BIT_ULL(HNS3_RSS_FIELD_IPV4_EN_NONFRAG_IP_S) },
+       { RTE_ETH_RSS_NONFRAG_IPV4_OTHER | RTE_ETH_RSS_L3_DST_ONLY,
+         HNS3_RSS_IP_TUPLE,
+         BIT_ULL(HNS3_RSS_FIELD_IPV4_EN_NONFRAG_IP_D) },
+       { RTE_ETH_RSS_NONFRAG_IPV4_OTHER,
+         HNS3_RSS_IP_TUPLE,
+         BIT_ULL(HNS3_RSS_FIELD_IPV4_EN_NONFRAG_IP_S) |
+         BIT_ULL(HNS3_RSS_FIELD_IPV4_EN_NONFRAG_IP_D) },
+
+       /* IPV4-TCP */
        { RTE_ETH_RSS_NONFRAG_IPV4_TCP | RTE_ETH_RSS_L3_SRC_ONLY,
+         HNS3_RSS_IP_L4_TUPLE,
          BIT_ULL(HNS3_RSS_FIELD_IPV4_TCP_EN_IP_S) },
        { RTE_ETH_RSS_NONFRAG_IPV4_TCP | RTE_ETH_RSS_L3_DST_ONLY,
+         HNS3_RSS_IP_L4_TUPLE,
          BIT_ULL(HNS3_RSS_FIELD_IPV4_TCP_EN_IP_D) },
        { RTE_ETH_RSS_NONFRAG_IPV4_TCP | RTE_ETH_RSS_L4_SRC_ONLY,
+         HNS3_RSS_IP_L4_TUPLE,
          BIT_ULL(HNS3_RSS_FIELD_IPV4_TCP_EN_TCP_S) },
        { RTE_ETH_RSS_NONFRAG_IPV4_TCP | RTE_ETH_RSS_L4_DST_ONLY,
+         HNS3_RSS_IP_L4_TUPLE,
+         BIT_ULL(HNS3_RSS_FIELD_IPV4_TCP_EN_TCP_D) },
+       { RTE_ETH_RSS_NONFRAG_IPV4_TCP,
+         HNS3_RSS_IP_L4_TUPLE,
+         BIT_ULL(HNS3_RSS_FIELD_IPV4_TCP_EN_IP_S) |
+         BIT_ULL(HNS3_RSS_FIELD_IPV4_TCP_EN_IP_D) |
+         BIT_ULL(HNS3_RSS_FIELD_IPV4_TCP_EN_TCP_S) |
          BIT_ULL(HNS3_RSS_FIELD_IPV4_TCP_EN_TCP_D) },
+
+       /* IPV4-UDP */
        { RTE_ETH_RSS_NONFRAG_IPV4_UDP | RTE_ETH_RSS_L3_SRC_ONLY,
+         HNS3_RSS_IP_L4_TUPLE,
          BIT_ULL(HNS3_RSS_FIELD_IPV4_UDP_EN_IP_S) },
        { RTE_ETH_RSS_NONFRAG_IPV4_UDP | RTE_ETH_RSS_L3_DST_ONLY,
+         HNS3_RSS_IP_L4_TUPLE,
          BIT_ULL(HNS3_RSS_FIELD_IPV4_UDP_EN_IP_D) },
        { RTE_ETH_RSS_NONFRAG_IPV4_UDP | RTE_ETH_RSS_L4_SRC_ONLY,
+         HNS3_RSS_IP_L4_TUPLE,
          BIT_ULL(HNS3_RSS_FIELD_IPV4_UDP_EN_UDP_S) },
        { RTE_ETH_RSS_NONFRAG_IPV4_UDP | RTE_ETH_RSS_L4_DST_ONLY,
+         HNS3_RSS_IP_L4_TUPLE,
+         BIT_ULL(HNS3_RSS_FIELD_IPV4_UDP_EN_UDP_D) },
+       { RTE_ETH_RSS_NONFRAG_IPV4_UDP,
+         HNS3_RSS_IP_L4_TUPLE,
+         BIT_ULL(HNS3_RSS_FIELD_IPV4_UDP_EN_IP_S) |
+         BIT_ULL(HNS3_RSS_FIELD_IPV4_UDP_EN_IP_D) |
+         BIT_ULL(HNS3_RSS_FIELD_IPV4_UDP_EN_UDP_S) |
          BIT_ULL(HNS3_RSS_FIELD_IPV4_UDP_EN_UDP_D) },
+
+       /* IPV4-SCTP */
        { RTE_ETH_RSS_NONFRAG_IPV4_SCTP | RTE_ETH_RSS_L3_SRC_ONLY,
+         HNS3_RSS_IP_L4_TUPLE,
          BIT_ULL(HNS3_RSS_FIELD_IPV4_SCTP_EN_IP_S) },
        { RTE_ETH_RSS_NONFRAG_IPV4_SCTP | RTE_ETH_RSS_L3_DST_ONLY,
+         HNS3_RSS_IP_L4_TUPLE,
          BIT_ULL(HNS3_RSS_FIELD_IPV4_SCTP_EN_IP_D) },
        { RTE_ETH_RSS_NONFRAG_IPV4_SCTP | RTE_ETH_RSS_L4_SRC_ONLY,
+         HNS3_RSS_IP_L4_TUPLE,
          BIT_ULL(HNS3_RSS_FIELD_IPV4_SCTP_EN_SCTP_S) },
        { RTE_ETH_RSS_NONFRAG_IPV4_SCTP | RTE_ETH_RSS_L4_DST_ONLY,
+         HNS3_RSS_IP_L4_TUPLE,
          BIT_ULL(HNS3_RSS_FIELD_IPV4_SCTP_EN_SCTP_D) },
-       { RTE_ETH_RSS_IPV4 | RTE_ETH_RSS_L3_SRC_ONLY,
-         BIT_ULL(HNS3_RSS_FIELD_IPV4_EN_NONFRAG_IP_S) },
-       { RTE_ETH_RSS_IPV4 | RTE_ETH_RSS_L3_DST_ONLY,
-         BIT_ULL(HNS3_RSS_FIELD_IPV4_EN_NONFRAG_IP_D) },
-       { RTE_ETH_RSS_NONFRAG_IPV4_OTHER | RTE_ETH_RSS_L3_SRC_ONLY,
-         BIT_ULL(HNS3_RSS_FIELD_IPV4_EN_NONFRAG_IP_S) },
-       { RTE_ETH_RSS_NONFRAG_IPV4_OTHER | RTE_ETH_RSS_L3_DST_ONLY,
-         BIT_ULL(HNS3_RSS_FIELD_IPV4_EN_NONFRAG_IP_D) },
+       { RTE_ETH_RSS_NONFRAG_IPV4_SCTP,
+         HNS3_RSS_IP_L4_TUPLE,
+         BIT_ULL(HNS3_RSS_FIELD_IPV4_SCTP_EN_IP_S) |
+         BIT_ULL(HNS3_RSS_FIELD_IPV4_SCTP_EN_IP_D) |
+         BIT_ULL(HNS3_RSS_FIELD_IPV4_SCTP_EN_SCTP_S) |
+         BIT_ULL(HNS3_RSS_FIELD_IPV4_SCTP_EN_SCTP_D) |
+         BIT_ULL(HNS3_RSS_FIELD_IPV4_SCTP_EN_SCTP_VER) },
+
+       /* IPV6-FRAG */
        { RTE_ETH_RSS_FRAG_IPV6 | RTE_ETH_RSS_L3_SRC_ONLY,
+         HNS3_RSS_IP_TUPLE,
          BIT_ULL(HNS3_RSS_FIELD_IPV6_FRAG_IP_S) },
        { RTE_ETH_RSS_FRAG_IPV6 | RTE_ETH_RSS_L3_DST_ONLY,
+         HNS3_RSS_IP_TUPLE,
          BIT_ULL(HNS3_RSS_FIELD_IPV6_FRAG_IP_D) },
+       { RTE_ETH_RSS_FRAG_IPV6,
+         HNS3_RSS_IP_TUPLE,
+         BIT_ULL(HNS3_RSS_FIELD_IPV6_FRAG_IP_S) |
+         BIT_ULL(HNS3_RSS_FIELD_IPV6_FRAG_IP_D) },
+
+       /* IPV6 */
+       { RTE_ETH_RSS_IPV6 | RTE_ETH_RSS_L3_SRC_ONLY,
+         HNS3_RSS_IP_TUPLE,
+         BIT_ULL(HNS3_RSS_FIELD_IPV6_NONFRAG_IP_S) },
+       { RTE_ETH_RSS_IPV6 | RTE_ETH_RSS_L3_DST_ONLY,
+         HNS3_RSS_IP_TUPLE,
+         BIT_ULL(HNS3_RSS_FIELD_IPV6_NONFRAG_IP_D) },
+       { RTE_ETH_RSS_IPV6,
+         HNS3_RSS_IP_TUPLE,
+         BIT_ULL(HNS3_RSS_FIELD_IPV6_NONFRAG_IP_S) |
+         BIT_ULL(HNS3_RSS_FIELD_IPV6_NONFRAG_IP_D) },
+
+       /* IPV6-OTHER */
+       { RTE_ETH_RSS_NONFRAG_IPV6_OTHER | RTE_ETH_RSS_L3_SRC_ONLY,
+         HNS3_RSS_IP_TUPLE,
+         BIT_ULL(HNS3_RSS_FIELD_IPV6_NONFRAG_IP_S) },
+       { RTE_ETH_RSS_NONFRAG_IPV6_OTHER | RTE_ETH_RSS_L3_DST_ONLY,
+         HNS3_RSS_IP_TUPLE,
+         BIT_ULL(HNS3_RSS_FIELD_IPV6_NONFRAG_IP_D) },
+       { RTE_ETH_RSS_NONFRAG_IPV6_OTHER,
+         HNS3_RSS_IP_TUPLE,
+         BIT_ULL(HNS3_RSS_FIELD_IPV6_NONFRAG_IP_S) |
+         BIT_ULL(HNS3_RSS_FIELD_IPV6_NONFRAG_IP_D) },
+
+       /* IPV6-TCP */
        { RTE_ETH_RSS_NONFRAG_IPV6_TCP | RTE_ETH_RSS_L3_SRC_ONLY,
+         HNS3_RSS_IP_L4_TUPLE,
          BIT_ULL(HNS3_RSS_FIELD_IPV6_TCP_EN_IP_S) },
        { RTE_ETH_RSS_NONFRAG_IPV6_TCP | RTE_ETH_RSS_L3_DST_ONLY,
+         HNS3_RSS_IP_L4_TUPLE,
          BIT_ULL(HNS3_RSS_FIELD_IPV6_TCP_EN_IP_D) },
        { RTE_ETH_RSS_NONFRAG_IPV6_TCP | RTE_ETH_RSS_L4_SRC_ONLY,
+         HNS3_RSS_IP_L4_TUPLE,
          BIT_ULL(HNS3_RSS_FIELD_IPV6_TCP_EN_TCP_S) },
        { RTE_ETH_RSS_NONFRAG_IPV6_TCP | RTE_ETH_RSS_L4_DST_ONLY,
+         HNS3_RSS_IP_L4_TUPLE,
+         BIT_ULL(HNS3_RSS_FIELD_IPV6_TCP_EN_TCP_D) },
+       { RTE_ETH_RSS_NONFRAG_IPV6_TCP,
+         HNS3_RSS_IP_L4_TUPLE,
+         BIT_ULL(HNS3_RSS_FIELD_IPV6_TCP_EN_IP_S) |
+         BIT_ULL(HNS3_RSS_FIELD_IPV6_TCP_EN_IP_D) |
+         BIT_ULL(HNS3_RSS_FIELD_IPV6_TCP_EN_TCP_S) |
          BIT_ULL(HNS3_RSS_FIELD_IPV6_TCP_EN_TCP_D) },
+
+       /* IPV6-UDP */
        { RTE_ETH_RSS_NONFRAG_IPV6_UDP | RTE_ETH_RSS_L3_SRC_ONLY,
+         HNS3_RSS_IP_L4_TUPLE,
          BIT_ULL(HNS3_RSS_FIELD_IPV6_UDP_EN_IP_S) },
        { RTE_ETH_RSS_NONFRAG_IPV6_UDP | RTE_ETH_RSS_L3_DST_ONLY,
+         HNS3_RSS_IP_L4_TUPLE,
          BIT_ULL(HNS3_RSS_FIELD_IPV6_UDP_EN_IP_D) },
        { RTE_ETH_RSS_NONFRAG_IPV6_UDP | RTE_ETH_RSS_L4_SRC_ONLY,
+         HNS3_RSS_IP_L4_TUPLE,
          BIT_ULL(HNS3_RSS_FIELD_IPV6_UDP_EN_UDP_S) },
        { RTE_ETH_RSS_NONFRAG_IPV6_UDP | RTE_ETH_RSS_L4_DST_ONLY,
+         HNS3_RSS_IP_L4_TUPLE,
+         BIT_ULL(HNS3_RSS_FIELD_IPV6_UDP_EN_UDP_D) },
+       { RTE_ETH_RSS_NONFRAG_IPV6_UDP,
+         HNS3_RSS_IP_L4_TUPLE,
+         BIT_ULL(HNS3_RSS_FIELD_IPV6_UDP_EN_IP_S) |
+         BIT_ULL(HNS3_RSS_FIELD_IPV6_UDP_EN_IP_D) |
+         BIT_ULL(HNS3_RSS_FIELD_IPV6_UDP_EN_UDP_S) |
          BIT_ULL(HNS3_RSS_FIELD_IPV6_UDP_EN_UDP_D) },
+
+       /* IPV6-SCTP */
        { RTE_ETH_RSS_NONFRAG_IPV6_SCTP | RTE_ETH_RSS_L3_SRC_ONLY,
+         HNS3_RSS_IP_L4_TUPLE,
          BIT_ULL(HNS3_RSS_FIELD_IPV6_SCTP_EN_IP_S) },
        { RTE_ETH_RSS_NONFRAG_IPV6_SCTP | RTE_ETH_RSS_L3_DST_ONLY,
+         HNS3_RSS_IP_L4_TUPLE,
          BIT_ULL(HNS3_RSS_FIELD_IPV6_SCTP_EN_IP_D) },
        { RTE_ETH_RSS_NONFRAG_IPV6_SCTP | RTE_ETH_RSS_L4_SRC_ONLY,
+         HNS3_RSS_IP_L4_TUPLE,
          BIT_ULL(HNS3_RSS_FIELD_IPV6_SCTP_EN_SCTP_S) },
        { RTE_ETH_RSS_NONFRAG_IPV6_SCTP | RTE_ETH_RSS_L4_DST_ONLY,
+         HNS3_RSS_IP_L4_TUPLE,
          BIT_ULL(HNS3_RSS_FIELD_IPV6_SCTP_EN_SCTP_D) },
-       { RTE_ETH_RSS_IPV6 | RTE_ETH_RSS_L3_SRC_ONLY,
-         BIT_ULL(HNS3_RSS_FIELD_IPV6_NONFRAG_IP_S) },
-       { RTE_ETH_RSS_IPV6 | RTE_ETH_RSS_L3_DST_ONLY,
-         BIT_ULL(HNS3_RSS_FIELD_IPV6_NONFRAG_IP_D) },
-       { RTE_ETH_RSS_NONFRAG_IPV6_OTHER | RTE_ETH_RSS_L3_SRC_ONLY,
-         BIT_ULL(HNS3_RSS_FIELD_IPV6_NONFRAG_IP_S) },
-       { RTE_ETH_RSS_NONFRAG_IPV6_OTHER | RTE_ETH_RSS_L3_DST_ONLY,
-         BIT_ULL(HNS3_RSS_FIELD_IPV6_NONFRAG_IP_D) },
-};
-
-static const struct {
-       uint64_t rss_types;
-       uint64_t rss_field;
-} hns3_set_rss_types[] = {
-       { RTE_ETH_RSS_FRAG_IPV4, BIT_ULL(HNS3_RSS_FIELD_IPV4_EN_FRAG_IP_D) |
-         BIT_ULL(HNS3_RSS_FIELD_IPV4_EN_FRAG_IP_S) },
-       { RTE_ETH_RSS_NONFRAG_IPV4_TCP, 
BIT_ULL(HNS3_RSS_FIELD_IPV4_TCP_EN_IP_S) |
-         BIT_ULL(HNS3_RSS_FIELD_IPV4_TCP_EN_IP_D) |
-         BIT_ULL(HNS3_RSS_FIELD_IPV4_TCP_EN_TCP_S) |
-         BIT_ULL(HNS3_RSS_FIELD_IPV4_TCP_EN_TCP_D) },
-       { RTE_ETH_RSS_NONFRAG_IPV4_UDP, 
BIT_ULL(HNS3_RSS_FIELD_IPV4_UDP_EN_IP_S) |
-         BIT_ULL(HNS3_RSS_FIELD_IPV4_UDP_EN_IP_D) |
-         BIT_ULL(HNS3_RSS_FIELD_IPV4_UDP_EN_UDP_S) |
-         BIT_ULL(HNS3_RSS_FIELD_IPV4_UDP_EN_UDP_D) },
-       { RTE_ETH_RSS_NONFRAG_IPV4_SCTP, 
BIT_ULL(HNS3_RSS_FIELD_IPV4_SCTP_EN_IP_S) |
-         BIT_ULL(HNS3_RSS_FIELD_IPV4_SCTP_EN_IP_D) |
-         BIT_ULL(HNS3_RSS_FIELD_IPV4_SCTP_EN_SCTP_S) |
-         BIT_ULL(HNS3_RSS_FIELD_IPV4_SCTP_EN_SCTP_D) |
-         BIT_ULL(HNS3_RSS_FIELD_IPV4_SCTP_EN_SCTP_VER) },
-       { RTE_ETH_RSS_IPV4,
-         BIT_ULL(HNS3_RSS_FIELD_IPV4_EN_NONFRAG_IP_S) |
-         BIT_ULL(HNS3_RSS_FIELD_IPV4_EN_NONFRAG_IP_D) },
-       { RTE_ETH_RSS_NONFRAG_IPV4_OTHER,
-         BIT_ULL(HNS3_RSS_FIELD_IPV4_EN_NONFRAG_IP_S) |
-         BIT_ULL(HNS3_RSS_FIELD_IPV4_EN_NONFRAG_IP_D) },
-       { RTE_ETH_RSS_FRAG_IPV6, BIT_ULL(HNS3_RSS_FIELD_IPV6_FRAG_IP_S) |
-         BIT_ULL(HNS3_RSS_FIELD_IPV6_FRAG_IP_D) },
-       { RTE_ETH_RSS_NONFRAG_IPV6_TCP, 
BIT_ULL(HNS3_RSS_FIELD_IPV6_TCP_EN_IP_S) |
-         BIT_ULL(HNS3_RSS_FIELD_IPV6_TCP_EN_IP_D) |
-         BIT_ULL(HNS3_RSS_FIELD_IPV6_TCP_EN_TCP_S) |
-         BIT_ULL(HNS3_RSS_FIELD_IPV6_TCP_EN_TCP_D) },
-       { RTE_ETH_RSS_NONFRAG_IPV6_UDP, 
BIT_ULL(HNS3_RSS_FIELD_IPV6_UDP_EN_IP_S) |
-         BIT_ULL(HNS3_RSS_FIELD_IPV6_UDP_EN_IP_D) |
-         BIT_ULL(HNS3_RSS_FIELD_IPV6_UDP_EN_UDP_S) |
-         BIT_ULL(HNS3_RSS_FIELD_IPV6_UDP_EN_UDP_D) },
-       { RTE_ETH_RSS_NONFRAG_IPV6_SCTP, 
BIT_ULL(HNS3_RSS_FIELD_IPV6_SCTP_EN_IP_S) |
+       { RTE_ETH_RSS_NONFRAG_IPV6_SCTP,
+         HNS3_RSS_IP_L4_TUPLE,
+         BIT_ULL(HNS3_RSS_FIELD_IPV6_SCTP_EN_IP_S) |
          BIT_ULL(HNS3_RSS_FIELD_IPV6_SCTP_EN_IP_D) |
          BIT_ULL(HNS3_RSS_FIELD_IPV6_SCTP_EN_SCTP_D) |
          BIT_ULL(HNS3_RSS_FIELD_IPV6_SCTP_EN_SCTP_S) |
          BIT_ULL(HNS3_RSS_FIELD_IPV6_SCTP_EN_SCTP_VER) },
-       { RTE_ETH_RSS_IPV6,
-         BIT_ULL(HNS3_RSS_FIELD_IPV6_NONFRAG_IP_S) |
-         BIT_ULL(HNS3_RSS_FIELD_IPV6_NONFRAG_IP_D) },
-       { RTE_ETH_RSS_NONFRAG_IPV6_OTHER,
-         BIT_ULL(HNS3_RSS_FIELD_IPV6_NONFRAG_IP_S) |
-         BIT_ULL(HNS3_RSS_FIELD_IPV6_NONFRAG_IP_D) }
 };
 
 /*
@@ -321,46 +400,53 @@ hns3_rss_reset_indir_table(struct hns3_hw *hw)
        return ret;
 }
 
+static uint64_t
+hns3_rss_calc_tuple_filed(uint64_t rss_hf)
+{
+       uint64_t l3_only_mask = RTE_ETH_RSS_L3_SRC_ONLY |
+                               RTE_ETH_RSS_L3_DST_ONLY;
+       uint64_t l4_only_mask = RTE_ETH_RSS_L4_SRC_ONLY |
+                               RTE_ETH_RSS_L4_DST_ONLY;
+       uint64_t l3_l4_only_mask = l3_only_mask | l4_only_mask;
+       bool has_l3_l4_only = !!(rss_hf & l3_l4_only_mask);
+       bool has_l3_only = !!(rss_hf & l3_only_mask);
+       uint64_t tuple = 0;
+       uint32_t i;
+
+       for (i = 0; i < RTE_DIM(hns3_set_tuple_table); i++) {
+               if ((rss_hf & hns3_set_tuple_table[i].rss_types) !=
+                   hns3_set_tuple_table[i].rss_types)
+                       continue;
+
+               if (hns3_set_tuple_table[i].tuple_type == HNS3_RSS_IP_TUPLE) {
+                       if (hns3_set_tuple_table[i].rss_types & l3_only_mask ||
+                           !has_l3_only)
+                               tuple |= hns3_set_tuple_table[i].rss_field;
+                       continue;
+               }
+
+               /* For IP types with L4, we need check both L3 and L4 */
+               if (hns3_set_tuple_table[i].rss_types & l3_l4_only_mask ||
+                   !has_l3_l4_only)
+                       tuple |= hns3_set_tuple_table[i].rss_field;
+       }
+
+       return tuple;
+}
+
 int
 hns3_set_rss_tuple_by_rss_hf(struct hns3_hw *hw, uint64_t rss_hf)
 {
        struct hns3_rss_input_tuple_cmd *req;
        struct hns3_cmd_desc desc;
-       uint32_t fields_count = 0; /* count times for setting tuple fields */
-       uint32_t i;
+       uint64_t tuple_field;
        int ret;
 
        hns3_cmd_setup_basic_desc(&desc, HNS3_OPC_RSS_INPUT_TUPLE, false);
-
        req = (struct hns3_rss_input_tuple_cmd *)desc.data;
 
-       for (i = 0; i < RTE_DIM(hns3_set_tuple_table); i++) {
-               if ((rss_hf & hns3_set_tuple_table[i].rss_types) ==
-                    hns3_set_tuple_table[i].rss_types) {
-                       req->tuple_field |=
-                           rte_cpu_to_le_64(hns3_set_tuple_table[i].rss_field);
-                       fields_count++;
-               }
-       }
-
-       /*
-        * When user does not specify the following types or a combination of
-        * the following types, it enables all fields for the supported RSS
-        * types. the following types as:
-        * - RTE_ETH_RSS_L3_SRC_ONLY
-        * - RTE_ETH_RSS_L3_DST_ONLY
-        * - RTE_ETH_RSS_L4_SRC_ONLY
-        * - RTE_ETH_RSS_L4_DST_ONLY
-        */
-       if (fields_count == 0) {
-               for (i = 0; i < RTE_DIM(hns3_set_rss_types); i++) {
-                       if ((rss_hf & hns3_set_rss_types[i].rss_types) ==
-                            hns3_set_rss_types[i].rss_types)
-                               req->tuple_field |= rte_cpu_to_le_64(
-                                       hns3_set_rss_types[i].rss_field);
-               }
-       }
-
+       tuple_field = hns3_rss_calc_tuple_filed(rss_hf);
+       req->tuple_field = rte_cpu_to_le_64(tuple_field);
        ret = hns3_cmd_send(hw, &desc, 1);
        if (ret) {
                hns3_err(hw, "Update RSS flow types tuples failed %d", ret);
-- 
2.22.0

Reply via email to