bnxt_en: Add RSS support for IPSEC headers
authorAjit Khaparde <ajit.khaparde@broadcom.com>
Mon, 5 Feb 2024 22:32:02 +0000 (14:32 -0800)
committerJakub Kicinski <kuba@kernel.org>
Fri, 9 Feb 2024 20:37:42 +0000 (12:37 -0800)
IPSec uses two distinct protocols, Authentication Header (AH) and
Encapsulating Security Payload (ESP).
Add support to configure RSS based on AH and ESP headers.
This functionality will be enabled based on the capabilities
indicated by the firmware in HWRM_VNIC_QCAPS.

Signed-off-by: Ajit Khaparde <ajit.khaparde@broadcom.com>
Signed-off-by: Michael Chan <michael.chan@broadcom.com>
Link: https://lore.kernel.org/r/20240205223202.25341-14-michael.chan@broadcom.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/broadcom/bnxt/bnxt.c
drivers/net/ethernet/broadcom/bnxt/bnxt.h
drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c

index dfadf5d3ea1863e86b26c3666ba0c0d594917ba3..6f415425dc14c2e066a648a50a052f3b10288fb5 100644 (file)
@@ -6099,10 +6099,13 @@ static void
 __bnxt_hwrm_vnic_set_rss(struct bnxt *bp, struct hwrm_vnic_rss_cfg_input *req,
                         struct bnxt_vnic_info *vnic)
 {
-       if (bp->flags & BNXT_FLAG_CHIP_P5_PLUS)
+       if (bp->flags & BNXT_FLAG_CHIP_P5_PLUS) {
                bnxt_fill_hw_rss_tbl_p5(bp, vnic);
-       else
+               if (bp->flags & BNXT_FLAG_CHIP_P7)
+                       req->flags |= VNIC_RSS_CFG_REQ_FLAGS_IPSEC_HASH_TYPE_CFG_SUPPORT;
+       } else {
                bnxt_fill_hw_rss_tbl(bp, vnic);
+       }
 
        if (bp->rss_hash_delta) {
                req->hash_type = cpu_to_le32(bp->rss_hash_delta);
@@ -6465,6 +6468,14 @@ static int bnxt_hwrm_vnic_qcaps(struct bnxt *bp)
                }
                if (flags & VNIC_QCAPS_RESP_FLAGS_HW_TUNNEL_TPA_CAP)
                        bp->fw_cap |= BNXT_FW_CAP_VNIC_TUNNEL_TPA;
+               if (flags & VNIC_QCAPS_RESP_FLAGS_RSS_IPSEC_AH_SPI_IPV4_CAP)
+                       bp->rss_cap |= BNXT_RSS_CAP_AH_V4_RSS_CAP;
+               if (flags & VNIC_QCAPS_RESP_FLAGS_RSS_IPSEC_AH_SPI_IPV6_CAP)
+                       bp->rss_cap |= BNXT_RSS_CAP_AH_V6_RSS_CAP;
+               if (flags & VNIC_QCAPS_RESP_FLAGS_RSS_IPSEC_ESP_SPI_IPV4_CAP)
+                       bp->rss_cap |= BNXT_RSS_CAP_ESP_V4_RSS_CAP;
+               if (flags & VNIC_QCAPS_RESP_FLAGS_RSS_IPSEC_ESP_SPI_IPV6_CAP)
+                       bp->rss_cap |= BNXT_RSS_CAP_ESP_V6_RSS_CAP;
        }
        hwrm_req_drop(bp, req);
        return rc;
index 2b2f051ee085f4496424f49d17e5b403b9da5f02..60bdd0673ec8a08674752dc9f994355dda6c1df0 100644 (file)
@@ -2221,6 +2221,10 @@ struct bnxt {
 #define BNXT_RSS_CAP_UDP_RSS_CAP               BIT(1)
 #define BNXT_RSS_CAP_NEW_RSS_CAP               BIT(2)
 #define BNXT_RSS_CAP_RSS_TCAM                  BIT(3)
+#define BNXT_RSS_CAP_AH_V4_RSS_CAP             BIT(4)
+#define BNXT_RSS_CAP_AH_V6_RSS_CAP             BIT(5)
+#define BNXT_RSS_CAP_ESP_V4_RSS_CAP            BIT(6)
+#define BNXT_RSS_CAP_ESP_V6_RSS_CAP            BIT(7)
 
        u8                      rss_hash_key[HW_HASH_KEY_SIZE];
        u8                      rss_hash_key_valid:1;
index a8c6d5dd057cb6fe4bf0dc47cd8cfe054d245b66..dfb5944683f8f442474b0fa04f401b20c57c17e8 100644 (file)
@@ -1533,8 +1533,14 @@ static int bnxt_grxfh(struct bnxt *bp, struct ethtool_rxnfc *cmd)
                        cmd->data |= RXH_IP_SRC | RXH_IP_DST |
                                     RXH_L4_B_0_1 | RXH_L4_B_2_3;
                fallthrough;
-       case SCTP_V4_FLOW:
        case AH_ESP_V4_FLOW:
+               if (bp->rss_hash_cfg &
+                   (VNIC_RSS_CFG_REQ_HASH_TYPE_AH_SPI_IPV4 |
+                    VNIC_RSS_CFG_REQ_HASH_TYPE_ESP_SPI_IPV4))
+                       cmd->data |= RXH_IP_SRC | RXH_IP_DST |
+                                    RXH_L4_B_0_1 | RXH_L4_B_2_3;
+               fallthrough;
+       case SCTP_V4_FLOW:
        case AH_V4_FLOW:
        case ESP_V4_FLOW:
        case IPV4_FLOW:
@@ -1552,8 +1558,14 @@ static int bnxt_grxfh(struct bnxt *bp, struct ethtool_rxnfc *cmd)
                        cmd->data |= RXH_IP_SRC | RXH_IP_DST |
                                     RXH_L4_B_0_1 | RXH_L4_B_2_3;
                fallthrough;
-       case SCTP_V6_FLOW:
        case AH_ESP_V6_FLOW:
+               if (bp->rss_hash_cfg &
+                   (VNIC_RSS_CFG_REQ_HASH_TYPE_AH_SPI_IPV6 |
+                    VNIC_RSS_CFG_REQ_HASH_TYPE_ESP_SPI_IPV6))
+                       cmd->data |= RXH_IP_SRC | RXH_IP_DST |
+                                    RXH_L4_B_0_1 | RXH_L4_B_2_3;
+               fallthrough;
+       case SCTP_V6_FLOW:
        case AH_V6_FLOW:
        case ESP_V6_FLOW:
        case IPV6_FLOW:
@@ -1600,6 +1612,24 @@ static int bnxt_srxfh(struct bnxt *bp, struct ethtool_rxnfc *cmd)
                rss_hash_cfg &= ~VNIC_RSS_CFG_REQ_HASH_TYPE_UDP_IPV6;
                if (tuple == 4)
                        rss_hash_cfg |= VNIC_RSS_CFG_REQ_HASH_TYPE_UDP_IPV6;
+       } else if (cmd->flow_type == AH_ESP_V4_FLOW) {
+               if (tuple == 4 && (!(bp->rss_cap & BNXT_RSS_CAP_AH_V4_RSS_CAP) ||
+                                  !(bp->rss_cap & BNXT_RSS_CAP_ESP_V4_RSS_CAP)))
+                       return -EINVAL;
+               rss_hash_cfg &= ~(VNIC_RSS_CFG_REQ_HASH_TYPE_AH_SPI_IPV4 |
+                                 VNIC_RSS_CFG_REQ_HASH_TYPE_ESP_SPI_IPV4);
+               if (tuple == 4)
+                       rss_hash_cfg |= VNIC_RSS_CFG_REQ_HASH_TYPE_AH_SPI_IPV4 |
+                                       VNIC_RSS_CFG_REQ_HASH_TYPE_ESP_SPI_IPV4;
+       } else if (cmd->flow_type == AH_ESP_V6_FLOW) {
+               if (tuple == 4 && (!(bp->rss_cap & BNXT_RSS_CAP_AH_V6_RSS_CAP) ||
+                                  !(bp->rss_cap & BNXT_RSS_CAP_ESP_V6_RSS_CAP)))
+                       return -EINVAL;
+               rss_hash_cfg &= ~(VNIC_RSS_CFG_REQ_HASH_TYPE_AH_SPI_IPV6 |
+                                 VNIC_RSS_CFG_REQ_HASH_TYPE_ESP_SPI_IPV6);
+               if (tuple == 4)
+                       rss_hash_cfg |= VNIC_RSS_CFG_REQ_HASH_TYPE_AH_SPI_IPV6 |
+                                       VNIC_RSS_CFG_REQ_HASH_TYPE_ESP_SPI_IPV6;
        } else if (tuple == 4) {
                return -EINVAL;
        }