@@ -70,6 +70,17 @@ enum hns3_tuple_field {
HNS3_RSS_FIELD_IPV6_FRAG_IP_S
};
+#define HNS3_RSS_TUPLE_IPV4_TCP_M GENMASK(3, 0)
+#define HNS3_RSS_TUPLE_IPV4_UDP_M GENMASK(11, 8)
+#define HNS3_RSS_TUPLE_IPV4_SCTP_M GENMASK(20, 16)
+#define HNS3_RSS_TUPLE_IPV4_NONF_M GENMASK(25, 24)
+#define HNS3_RSS_TUPLE_IPV4_FLAG_M GENMASK(27, 26)
+#define HNS3_RSS_TUPLE_IPV6_TCP_M GENMASK(35, 32)
+#define HNS3_RSS_TUPLE_IPV6_UDP_M GENMASK(43, 40)
+#define HNS3_RSS_TUPLE_IPV6_SCTP_M GENMASK(52, 48)
+#define HNS3_RSS_TUPLE_IPV6_NONF_M GENMASK(57, 56)
+#define HNS3_RSS_TUPLE_IPV6_FLAG_M GENMASK(59, 58)
+
enum hns3_rss_tuple_type {
HNS3_RSS_IP_TUPLE,
HNS3_RSS_IP_L4_TUPLE,
@@ -79,200 +90,249 @@ static const struct {
uint64_t rss_types;
uint16_t tuple_type;
uint64_t rss_field;
+ uint64_t tuple_mask;
} 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) },
+ BIT_ULL(HNS3_RSS_FIELD_IPV4_EN_FRAG_IP_S),
+ HNS3_RSS_TUPLE_IPV4_FLAG_M },
{ 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) },
+ BIT_ULL(HNS3_RSS_FIELD_IPV4_EN_FRAG_IP_D),
+ HNS3_RSS_TUPLE_IPV4_FLAG_M },
{ 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) },
+ BIT_ULL(HNS3_RSS_FIELD_IPV4_EN_FRAG_IP_D),
+ HNS3_RSS_TUPLE_IPV4_FLAG_M },
/* 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) },
+ BIT_ULL(HNS3_RSS_FIELD_IPV4_EN_NONFRAG_IP_S),
+ HNS3_RSS_TUPLE_IPV4_NONF_M },
{ RTE_ETH_RSS_IPV4 | RTE_ETH_RSS_L3_DST_ONLY,
HNS3_RSS_IP_TUPLE,
- BIT_ULL(HNS3_RSS_FIELD_IPV4_EN_NONFRAG_IP_D) },
+ BIT_ULL(HNS3_RSS_FIELD_IPV4_EN_NONFRAG_IP_D),
+ HNS3_RSS_TUPLE_IPV4_NONF_M },
{ 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) },
+ BIT_ULL(HNS3_RSS_FIELD_IPV4_EN_NONFRAG_IP_D),
+ HNS3_RSS_TUPLE_IPV4_NONF_M },
/* 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) },
+ BIT_ULL(HNS3_RSS_FIELD_IPV4_EN_NONFRAG_IP_S),
+ HNS3_RSS_TUPLE_IPV4_NONF_M },
{ 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) },
+ BIT_ULL(HNS3_RSS_FIELD_IPV4_EN_NONFRAG_IP_D),
+ HNS3_RSS_TUPLE_IPV4_NONF_M },
{ 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) },
+ BIT_ULL(HNS3_RSS_FIELD_IPV4_EN_NONFRAG_IP_D),
+ HNS3_RSS_TUPLE_IPV4_NONF_M },
/* 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) },
+ BIT_ULL(HNS3_RSS_FIELD_IPV4_TCP_EN_IP_S),
+ HNS3_RSS_TUPLE_IPV4_TCP_M },
{ 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) },
+ BIT_ULL(HNS3_RSS_FIELD_IPV4_TCP_EN_IP_D),
+ HNS3_RSS_TUPLE_IPV4_TCP_M },
{ 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) },
+ BIT_ULL(HNS3_RSS_FIELD_IPV4_TCP_EN_TCP_S),
+ HNS3_RSS_TUPLE_IPV4_TCP_M },
{ 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) },
+ BIT_ULL(HNS3_RSS_FIELD_IPV4_TCP_EN_TCP_D),
+ HNS3_RSS_TUPLE_IPV4_TCP_M },
{ 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) },
+ BIT_ULL(HNS3_RSS_FIELD_IPV4_TCP_EN_TCP_D),
+ HNS3_RSS_TUPLE_IPV4_TCP_M },
/* 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) },
+ BIT_ULL(HNS3_RSS_FIELD_IPV4_UDP_EN_IP_S),
+ HNS3_RSS_TUPLE_IPV4_UDP_M },
{ 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) },
+ BIT_ULL(HNS3_RSS_FIELD_IPV4_UDP_EN_IP_D),
+ HNS3_RSS_TUPLE_IPV4_UDP_M },
{ 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) },
+ BIT_ULL(HNS3_RSS_FIELD_IPV4_UDP_EN_UDP_S),
+ HNS3_RSS_TUPLE_IPV4_UDP_M },
{ 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) },
+ BIT_ULL(HNS3_RSS_FIELD_IPV4_UDP_EN_UDP_D),
+ HNS3_RSS_TUPLE_IPV4_UDP_M },
{ 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) },
+ BIT_ULL(HNS3_RSS_FIELD_IPV4_UDP_EN_UDP_D),
+ HNS3_RSS_TUPLE_IPV4_UDP_M },
/* 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) },
+ BIT_ULL(HNS3_RSS_FIELD_IPV4_SCTP_EN_IP_S),
+ HNS3_RSS_TUPLE_IPV4_SCTP_M },
{ 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) },
+ BIT_ULL(HNS3_RSS_FIELD_IPV4_SCTP_EN_IP_D),
+ HNS3_RSS_TUPLE_IPV4_SCTP_M },
{ 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) },
+ BIT_ULL(HNS3_RSS_FIELD_IPV4_SCTP_EN_SCTP_S),
+ HNS3_RSS_TUPLE_IPV4_SCTP_M },
{ 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) },
+ BIT_ULL(HNS3_RSS_FIELD_IPV4_SCTP_EN_SCTP_D),
+ HNS3_RSS_TUPLE_IPV4_SCTP_M },
{ 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) },
+ BIT_ULL(HNS3_RSS_FIELD_IPV4_SCTP_EN_SCTP_VER),
+ HNS3_RSS_TUPLE_IPV4_SCTP_M },
/* 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) },
+ BIT_ULL(HNS3_RSS_FIELD_IPV6_FRAG_IP_S),
+ HNS3_RSS_TUPLE_IPV6_FLAG_M },
{ RTE_ETH_RSS_FRAG_IPV6 | RTE_ETH_RSS_L3_DST_ONLY,
HNS3_RSS_IP_TUPLE,
- BIT_ULL(HNS3_RSS_FIELD_IPV6_FRAG_IP_D) },
+ BIT_ULL(HNS3_RSS_FIELD_IPV6_FRAG_IP_D),
+ HNS3_RSS_TUPLE_IPV6_FLAG_M },
{ 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) },
+ BIT_ULL(HNS3_RSS_FIELD_IPV6_FRAG_IP_D),
+ HNS3_RSS_TUPLE_IPV6_FLAG_M },
/* IPV6 */
{ RTE_ETH_RSS_IPV6 | RTE_ETH_RSS_L3_SRC_ONLY,
HNS3_RSS_IP_TUPLE,
- BIT_ULL(HNS3_RSS_FIELD_IPV6_NONFRAG_IP_S) },
+ BIT_ULL(HNS3_RSS_FIELD_IPV6_NONFRAG_IP_S),
+ HNS3_RSS_TUPLE_IPV6_NONF_M },
{ RTE_ETH_RSS_IPV6 | RTE_ETH_RSS_L3_DST_ONLY,
HNS3_RSS_IP_TUPLE,
- BIT_ULL(HNS3_RSS_FIELD_IPV6_NONFRAG_IP_D) },
+ BIT_ULL(HNS3_RSS_FIELD_IPV6_NONFRAG_IP_D),
+ HNS3_RSS_TUPLE_IPV6_NONF_M },
{ 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) },
+ BIT_ULL(HNS3_RSS_FIELD_IPV6_NONFRAG_IP_D),
+ HNS3_RSS_TUPLE_IPV6_NONF_M },
/* 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) },
+ BIT_ULL(HNS3_RSS_FIELD_IPV6_NONFRAG_IP_S),
+ HNS3_RSS_TUPLE_IPV6_NONF_M },
{ 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) },
+ BIT_ULL(HNS3_RSS_FIELD_IPV6_NONFRAG_IP_D),
+ HNS3_RSS_TUPLE_IPV6_NONF_M },
{ 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) },
+ BIT_ULL(HNS3_RSS_FIELD_IPV6_NONFRAG_IP_D),
+ HNS3_RSS_TUPLE_IPV6_NONF_M },
/* 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) },
+ BIT_ULL(HNS3_RSS_FIELD_IPV6_TCP_EN_IP_S),
+ HNS3_RSS_TUPLE_IPV6_TCP_M },
{ 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) },
+ BIT_ULL(HNS3_RSS_FIELD_IPV6_TCP_EN_IP_D),
+ HNS3_RSS_TUPLE_IPV6_TCP_M },
{ 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) },
+ BIT_ULL(HNS3_RSS_FIELD_IPV6_TCP_EN_TCP_S),
+ HNS3_RSS_TUPLE_IPV6_TCP_M },
{ 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) },
+ BIT_ULL(HNS3_RSS_FIELD_IPV6_TCP_EN_TCP_D),
+ HNS3_RSS_TUPLE_IPV6_TCP_M },
{ 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) },
+ BIT_ULL(HNS3_RSS_FIELD_IPV6_TCP_EN_TCP_D),
+ HNS3_RSS_TUPLE_IPV6_TCP_M },
/* 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) },
+ BIT_ULL(HNS3_RSS_FIELD_IPV6_UDP_EN_IP_S),
+ HNS3_RSS_TUPLE_IPV6_UDP_M },
{ 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) },
+ BIT_ULL(HNS3_RSS_FIELD_IPV6_UDP_EN_IP_D),
+ HNS3_RSS_TUPLE_IPV6_UDP_M },
{ 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) },
+ BIT_ULL(HNS3_RSS_FIELD_IPV6_UDP_EN_UDP_S),
+ HNS3_RSS_TUPLE_IPV6_UDP_M },
{ 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) },
+ BIT_ULL(HNS3_RSS_FIELD_IPV6_UDP_EN_UDP_D),
+ HNS3_RSS_TUPLE_IPV6_UDP_M },
{ 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) },
+ BIT_ULL(HNS3_RSS_FIELD_IPV6_UDP_EN_UDP_D),
+ HNS3_RSS_TUPLE_IPV6_UDP_M },
/* 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) },
+ BIT_ULL(HNS3_RSS_FIELD_IPV6_SCTP_EN_IP_S),
+ HNS3_RSS_TUPLE_IPV6_SCTP_M },
{ 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) },
+ BIT_ULL(HNS3_RSS_FIELD_IPV6_SCTP_EN_IP_D),
+ HNS3_RSS_TUPLE_IPV6_SCTP_M },
{ 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) },
+ BIT_ULL(HNS3_RSS_FIELD_IPV6_SCTP_EN_SCTP_S),
+ HNS3_RSS_TUPLE_IPV6_SCTP_M },
{ 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) },
+ BIT_ULL(HNS3_RSS_FIELD_IPV6_SCTP_EN_SCTP_D),
+ HNS3_RSS_TUPLE_IPV6_SCTP_M },
{ 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) },
+ BIT_ULL(HNS3_RSS_FIELD_IPV6_SCTP_EN_SCTP_VER),
+ HNS3_RSS_TUPLE_IPV6_SCTP_M },
};
/*
@@ -575,6 +635,96 @@ hns3_dev_rss_hash_update(struct rte_eth_dev *dev,
return ret;
}
+int
+hns3_get_rss_tuple_field(struct hns3_hw *hw, uint64_t *tuple_fields)
+{
+ struct hns3_rss_input_tuple_cmd *req;
+ struct hns3_cmd_desc desc;
+ int ret;
+
+ hns3_cmd_setup_basic_desc(&desc, HNS3_OPC_RSS_INPUT_TUPLE, true);
+ req = (struct hns3_rss_input_tuple_cmd *)desc.data;
+ ret = hns3_cmd_send(hw, &desc, 1);
+ if (ret != 0) {
+ hns3_err(hw, "fail to get RSS hash tuple fields from firmware, ret = %d",
+ ret);
+ return ret;
+ }
+
+ *tuple_fields = rte_le_to_cpu_64(req->tuple_field);
+
+ return 0;
+}
+
+static uint64_t
+hns3_rss_tuple_fields_to_rss_hf(struct hns3_hw *hw, uint64_t tuple_fields)
+{
+ uint64_t ipv6_sctp_l4_mask =
+ BIT_ULL(HNS3_RSS_FIELD_IPV6_SCTP_EN_SCTP_D) |
+ BIT_ULL(HNS3_RSS_FIELD_IPV6_SCTP_EN_SCTP_S);
+ uint64_t rss_hf = 0;
+ uint64_t tuple_mask;
+ uint32_t i;
+
+ for (i = 0; i < RTE_DIM(hns3_set_tuple_table); i++) {
+ tuple_mask = hns3_set_tuple_table[i].tuple_mask;
+ /*
+ * The RSS hash of the packet type is disabled if its tuples is
+ * zero.
+ */
+ if ((tuple_fields & tuple_mask) == 0)
+ continue;
+
+ /*
+ * Some hardware don't support to use src/dst port fields to
+ * hash for IPV6-SCTP packet.
+ */
+ if ((hns3_set_tuple_table[i].rss_types &
+ RTE_ETH_RSS_NONFRAG_IPV6_SCTP) &&
+ !hw->rss_info.ipv6_sctp_offload_supported)
+ tuple_mask &= ~ipv6_sctp_l4_mask;
+
+ /*
+ * The framework (ethdev ops) or driver (rte flow API) ensure
+ * that both L3_SRC/DST_ONLY and L4_SRC/DST_ONLY cannot be set
+ * to driver at the same time. But if user doesn't specify
+ * anything L3/L4_SRC/DST_ONLY, driver enables all tuple fields.
+ * In this case, driver should not report L3/L4_SRC/DST_ONLY.
+ */
+ if ((tuple_fields & tuple_mask) == tuple_mask) {
+ /* Skip the item enabled part tuples. */
+ if ((tuple_fields & hns3_set_tuple_table[i].rss_field) !=
+ tuple_mask)
+ continue;
+
+ rss_hf |= hns3_set_tuple_table[i].rss_types;
+ continue;
+ }
+
+ /* Match the item enabled part tuples.*/
+ if ((tuple_fields & hns3_set_tuple_table[i].rss_field) ==
+ hns3_set_tuple_table[i].rss_field)
+ rss_hf |= hns3_set_tuple_table[i].rss_types;
+ }
+
+ return rss_hf;
+}
+
+static int
+hns3_rss_hash_get_rss_hf(struct hns3_hw *hw, uint64_t *rss_hf)
+{
+ uint64_t tuple_fields;
+ int ret;
+
+ ret = hns3_get_rss_tuple_field(hw, &tuple_fields);
+ if (ret != 0)
+ return ret;
+
+ *rss_hf = hns3_rss_tuple_fields_to_rss_hf(hw, tuple_fields);
+
+ return 0;
+}
+
/*
* Get rss key and rss_hf types set of RSS hash configuration.
* @param dev
@@ -590,28 +740,32 @@ hns3_dev_rss_hash_conf_get(struct rte_eth_dev *dev,
{
struct hns3_adapter *hns = dev->data->dev_private;
struct hns3_hw *hw = &hns->hw;
- struct hns3_rss_conf *rss_cfg = &hw->rss_info;
uint8_t hash_algo;
int ret;
rte_spinlock_lock(&hw->lock);
- rss_conf->rss_hf = rss_cfg->conf.types;
+ ret = hns3_rss_hash_get_rss_hf(hw, &rss_conf->rss_hf);
+ if (ret != 0) {
+ hns3_err(hw, "obtain hash tuples failed, ret = %d", ret);
+ goto out;
+ }
/* Get the RSS Key required by the user */
if (rss_conf->rss_key && rss_conf->rss_key_len >= hw->rss_key_size) {
ret = hns3_rss_get_algo_key(hw, &hash_algo, rss_conf->rss_key,
hw->rss_key_size);
if (ret != 0) {
- rte_spinlock_unlock(&hw->lock);
hns3_err(hw, "obtain hash algo and key failed, ret = %d",
ret);
- return ret;
+ goto out;
}
rss_conf->rss_key_len = hw->rss_key_size;
}
+
+out:
rte_spinlock_unlock(&hw->lock);
- return 0;
+ return ret;
}
/*
@@ -110,6 +110,7 @@ int hns3_rss_reset_indir_table(struct hns3_hw *hw);
int hns3_config_rss(struct hns3_adapter *hns);
void hns3_rss_uninit(struct hns3_adapter *hns);
int hns3_set_rss_tuple_by_rss_hf(struct hns3_hw *hw, uint64_t rss_hf);
+int hns3_get_rss_tuple_field(struct hns3_hw *hw, uint64_t *tuple_fields);
int hns3_rss_set_algo_key(struct hns3_hw *hw, uint8_t hash_algo,
const uint8_t *key, uint8_t key_len);
int hns3_rss_get_algo_key(struct hns3_hw *hw, uint8_t *hash_algo,