Commit a6d63bbf authored by Takeru Hayasaka's avatar Takeru Hayasaka Committed by Tony Nguyen

ice: Implement RSS settings for GTP using ethtool

Following the addition of new GTP RSS hash options to ethtool.h, this patch
implements the corresponding RSS settings for GTP packets in the Intel ice
driver. It enables users to configure RSS for GTP-U and GTP-C traffic over IPv4
and IPv6, utilizing the newly defined hash options.

The implementation covers the handling of gtpu(4|6), gtpc(4|6), gtpc(4|6)t,
gtpu(4|6)e, gtpu(4|6)u, and gtpu(4|6)d traffic, providing enhanced load
distribution for GTP traffic across multiple processing units.
Signed-off-by: default avatarTakeru Hayasaka <hayatake396@gmail.com>
Reviewed-by: default avatarMarcin Szycik <marcin.szycik@linux.intel.com>
Tested-by: Pucha Himasekhar Reddy <himasekharx.reddy.pucha@intel.com> (A Contingent worker at Intel)
Signed-off-by: default avatarTony Nguyen <anthony.l.nguyen@intel.com>
parent 0ed3bba1
...@@ -370,13 +370,26 @@ more options for Receive Side Scaling (RSS) hash byte configuration. ...@@ -370,13 +370,26 @@ more options for Receive Side Scaling (RSS) hash byte configuration.
Where <type> is: Where <type> is:
tcp4 signifying TCP over IPv4 tcp4 signifying TCP over IPv4
udp4 signifying UDP over IPv4 udp4 signifying UDP over IPv4
gtpc4 signifying GTP-C over IPv4
gtpc4t signifying GTP-C (include TEID) over IPv4
gtpu4 signifying GTP-U over IPV4
gtpu4e signifying GTP-U and Extension Header over IPV4
gtpu4u signifying GTP-U PSC Uplink over IPV4
gtpu4d signifying GTP-U PSC Downlink over IPV4
tcp6 signifying TCP over IPv6 tcp6 signifying TCP over IPv6
udp6 signifying UDP over IPv6 udp6 signifying UDP over IPv6
gtpc6 signifying GTP-C over IPv6
gtpc6t signifying GTP-C (include TEID) over IPv6
gtpu6 signifying GTP-U over IPV6
gtpu6e signifying GTP-U and Extension Header over IPV6
gtpu6u signifying GTP-U PSC Uplink over IPV6
gtpu6d signifying GTP-U PSC Downlink over IPV6
And <option> is one or more of: And <option> is one or more of:
s Hash on the IP source address of the Rx packet. s Hash on the IP source address of the Rx packet.
d Hash on the IP destination address of the Rx packet. d Hash on the IP destination address of the Rx packet.
f Hash on bytes 0 and 1 of the Layer 4 header of the Rx packet. f Hash on bytes 0 and 1 of the Layer 4 header of the Rx packet.
n Hash on bytes 2 and 3 of the Layer 4 header of the Rx packet. n Hash on bytes 2 and 3 of the Layer 4 header of the Rx packet.
e Hash on GTP Packet on TEID (4bytes) of the Rx packet.
Accelerated Receive Flow Steering (aRFS) Accelerated Receive Flow Steering (aRFS)
......
...@@ -2483,6 +2483,24 @@ static u32 ice_parse_hdrs(struct ethtool_rxnfc *nfc) ...@@ -2483,6 +2483,24 @@ static u32 ice_parse_hdrs(struct ethtool_rxnfc *nfc)
case SCTP_V4_FLOW: case SCTP_V4_FLOW:
hdrs |= ICE_FLOW_SEG_HDR_SCTP | ICE_FLOW_SEG_HDR_IPV4; hdrs |= ICE_FLOW_SEG_HDR_SCTP | ICE_FLOW_SEG_HDR_IPV4;
break; break;
case GTPU_V4_FLOW:
hdrs |= ICE_FLOW_SEG_HDR_GTPU_IP | ICE_FLOW_SEG_HDR_IPV4;
break;
case GTPC_V4_FLOW:
hdrs |= ICE_FLOW_SEG_HDR_GTPC | ICE_FLOW_SEG_HDR_IPV4;
break;
case GTPC_TEID_V4_FLOW:
hdrs |= ICE_FLOW_SEG_HDR_GTPC_TEID | ICE_FLOW_SEG_HDR_IPV4;
break;
case GTPU_EH_V4_FLOW:
hdrs |= ICE_FLOW_SEG_HDR_GTPU_EH | ICE_FLOW_SEG_HDR_IPV4;
break;
case GTPU_UL_V4_FLOW:
hdrs |= ICE_FLOW_SEG_HDR_GTPU_UP | ICE_FLOW_SEG_HDR_IPV4;
break;
case GTPU_DL_V4_FLOW:
hdrs |= ICE_FLOW_SEG_HDR_GTPU_DWN | ICE_FLOW_SEG_HDR_IPV4;
break;
case TCP_V6_FLOW: case TCP_V6_FLOW:
hdrs |= ICE_FLOW_SEG_HDR_TCP | ICE_FLOW_SEG_HDR_IPV6; hdrs |= ICE_FLOW_SEG_HDR_TCP | ICE_FLOW_SEG_HDR_IPV6;
break; break;
...@@ -2492,6 +2510,24 @@ static u32 ice_parse_hdrs(struct ethtool_rxnfc *nfc) ...@@ -2492,6 +2510,24 @@ static u32 ice_parse_hdrs(struct ethtool_rxnfc *nfc)
case SCTP_V6_FLOW: case SCTP_V6_FLOW:
hdrs |= ICE_FLOW_SEG_HDR_SCTP | ICE_FLOW_SEG_HDR_IPV6; hdrs |= ICE_FLOW_SEG_HDR_SCTP | ICE_FLOW_SEG_HDR_IPV6;
break; break;
case GTPU_V6_FLOW:
hdrs |= ICE_FLOW_SEG_HDR_GTPU_IP | ICE_FLOW_SEG_HDR_IPV6;
break;
case GTPC_V6_FLOW:
hdrs |= ICE_FLOW_SEG_HDR_GTPC | ICE_FLOW_SEG_HDR_IPV6;
break;
case GTPC_TEID_V6_FLOW:
hdrs |= ICE_FLOW_SEG_HDR_GTPC_TEID | ICE_FLOW_SEG_HDR_IPV6;
break;
case GTPU_EH_V6_FLOW:
hdrs |= ICE_FLOW_SEG_HDR_GTPU_EH | ICE_FLOW_SEG_HDR_IPV6;
break;
case GTPU_UL_V6_FLOW:
hdrs |= ICE_FLOW_SEG_HDR_GTPU_UP | ICE_FLOW_SEG_HDR_IPV6;
break;
case GTPU_DL_V6_FLOW:
hdrs |= ICE_FLOW_SEG_HDR_GTPU_DWN | ICE_FLOW_SEG_HDR_IPV6;
break;
default: default:
break; break;
} }
...@@ -2515,6 +2551,12 @@ static u64 ice_parse_hash_flds(struct ethtool_rxnfc *nfc, bool symm) ...@@ -2515,6 +2551,12 @@ static u64 ice_parse_hash_flds(struct ethtool_rxnfc *nfc, bool symm)
case TCP_V4_FLOW: case TCP_V4_FLOW:
case UDP_V4_FLOW: case UDP_V4_FLOW:
case SCTP_V4_FLOW: case SCTP_V4_FLOW:
case GTPU_V4_FLOW:
case GTPC_V4_FLOW:
case GTPC_TEID_V4_FLOW:
case GTPU_EH_V4_FLOW:
case GTPU_UL_V4_FLOW:
case GTPU_DL_V4_FLOW:
if (nfc->data & RXH_IP_SRC) if (nfc->data & RXH_IP_SRC)
hfld |= ICE_FLOW_HASH_FLD_IPV4_SA; hfld |= ICE_FLOW_HASH_FLD_IPV4_SA;
if (nfc->data & RXH_IP_DST) if (nfc->data & RXH_IP_DST)
...@@ -2523,6 +2565,12 @@ static u64 ice_parse_hash_flds(struct ethtool_rxnfc *nfc, bool symm) ...@@ -2523,6 +2565,12 @@ static u64 ice_parse_hash_flds(struct ethtool_rxnfc *nfc, bool symm)
case TCP_V6_FLOW: case TCP_V6_FLOW:
case UDP_V6_FLOW: case UDP_V6_FLOW:
case SCTP_V6_FLOW: case SCTP_V6_FLOW:
case GTPU_V6_FLOW:
case GTPC_V6_FLOW:
case GTPC_TEID_V6_FLOW:
case GTPU_EH_V6_FLOW:
case GTPU_UL_V6_FLOW:
case GTPU_DL_V6_FLOW:
if (nfc->data & RXH_IP_SRC) if (nfc->data & RXH_IP_SRC)
hfld |= ICE_FLOW_HASH_FLD_IPV6_SA; hfld |= ICE_FLOW_HASH_FLD_IPV6_SA;
if (nfc->data & RXH_IP_DST) if (nfc->data & RXH_IP_DST)
...@@ -2561,6 +2609,33 @@ static u64 ice_parse_hash_flds(struct ethtool_rxnfc *nfc, bool symm) ...@@ -2561,6 +2609,33 @@ static u64 ice_parse_hash_flds(struct ethtool_rxnfc *nfc, bool symm)
} }
} }
if (nfc->data & RXH_GTP_TEID) {
switch (nfc->flow_type) {
case GTPC_TEID_V4_FLOW:
case GTPC_TEID_V6_FLOW:
hfld |= ICE_FLOW_HASH_FLD_GTPC_TEID;
break;
case GTPU_V4_FLOW:
case GTPU_V6_FLOW:
hfld |= ICE_FLOW_HASH_FLD_GTPU_IP_TEID;
break;
case GTPU_EH_V4_FLOW:
case GTPU_EH_V6_FLOW:
hfld |= ICE_FLOW_HASH_FLD_GTPU_EH_TEID;
break;
case GTPU_UL_V4_FLOW:
case GTPU_UL_V6_FLOW:
hfld |= ICE_FLOW_HASH_FLD_GTPU_UP_TEID;
break;
case GTPU_DL_V4_FLOW:
case GTPU_DL_V6_FLOW:
hfld |= ICE_FLOW_HASH_FLD_GTPU_DWN_TEID;
break;
default:
break;
}
}
return hfld; return hfld;
} }
...@@ -2673,6 +2748,13 @@ ice_get_rss_hash_opt(struct ice_vsi *vsi, struct ethtool_rxnfc *nfc) ...@@ -2673,6 +2748,13 @@ ice_get_rss_hash_opt(struct ice_vsi *vsi, struct ethtool_rxnfc *nfc)
hash_flds & ICE_FLOW_HASH_FLD_UDP_DST_PORT || hash_flds & ICE_FLOW_HASH_FLD_UDP_DST_PORT ||
hash_flds & ICE_FLOW_HASH_FLD_SCTP_DST_PORT) hash_flds & ICE_FLOW_HASH_FLD_SCTP_DST_PORT)
nfc->data |= (u64)RXH_L4_B_2_3; nfc->data |= (u64)RXH_L4_B_2_3;
if (hash_flds & ICE_FLOW_HASH_FLD_GTPC_TEID ||
hash_flds & ICE_FLOW_HASH_FLD_GTPU_IP_TEID ||
hash_flds & ICE_FLOW_HASH_FLD_GTPU_EH_TEID ||
hash_flds & ICE_FLOW_HASH_FLD_GTPU_UP_TEID ||
hash_flds & ICE_FLOW_HASH_FLD_GTPU_DWN_TEID)
nfc->data |= (u64)RXH_GTP_TEID;
} }
/** /**
......
...@@ -37,13 +37,13 @@ ...@@ -37,13 +37,13 @@
#define ICE_HASH_SCTP_IPV4 (ICE_FLOW_HASH_IPV4 | ICE_FLOW_HASH_SCTP_PORT) #define ICE_HASH_SCTP_IPV4 (ICE_FLOW_HASH_IPV4 | ICE_FLOW_HASH_SCTP_PORT)
#define ICE_HASH_SCTP_IPV6 (ICE_FLOW_HASH_IPV6 | ICE_FLOW_HASH_SCTP_PORT) #define ICE_HASH_SCTP_IPV6 (ICE_FLOW_HASH_IPV6 | ICE_FLOW_HASH_SCTP_PORT)
#define ICE_FLOW_HASH_GTP_TEID \ #define ICE_FLOW_HASH_GTP_C_TEID \
(BIT_ULL(ICE_FLOW_FIELD_IDX_GTPC_TEID)) (BIT_ULL(ICE_FLOW_FIELD_IDX_GTPC_TEID))
#define ICE_FLOW_HASH_GTP_IPV4_TEID \ #define ICE_FLOW_HASH_GTP_C_IPV4_TEID \
(ICE_FLOW_HASH_IPV4 | ICE_FLOW_HASH_GTP_TEID) (ICE_FLOW_HASH_IPV4 | ICE_FLOW_HASH_GTP_C_TEID)
#define ICE_FLOW_HASH_GTP_IPV6_TEID \ #define ICE_FLOW_HASH_GTP_C_IPV6_TEID \
(ICE_FLOW_HASH_IPV6 | ICE_FLOW_HASH_GTP_TEID) (ICE_FLOW_HASH_IPV6 | ICE_FLOW_HASH_GTP_C_TEID)
#define ICE_FLOW_HASH_GTP_U_TEID \ #define ICE_FLOW_HASH_GTP_U_TEID \
(BIT_ULL(ICE_FLOW_FIELD_IDX_GTPU_IP_TEID)) (BIT_ULL(ICE_FLOW_FIELD_IDX_GTPU_IP_TEID))
...@@ -66,6 +66,20 @@ ...@@ -66,6 +66,20 @@
(ICE_FLOW_HASH_IPV6 | ICE_FLOW_HASH_GTP_U_EH_TEID | \ (ICE_FLOW_HASH_IPV6 | ICE_FLOW_HASH_GTP_U_EH_TEID | \
ICE_FLOW_HASH_GTP_U_EH_QFI) ICE_FLOW_HASH_GTP_U_EH_QFI)
#define ICE_FLOW_HASH_GTP_U_UP \
(BIT_ULL(ICE_FLOW_FIELD_IDX_GTPU_UP_TEID))
#define ICE_FLOW_HASH_GTP_U_DWN \
(BIT_ULL(ICE_FLOW_FIELD_IDX_GTPU_DWN_TEID))
#define ICE_FLOW_HASH_GTP_U_IPV4_UP \
(ICE_FLOW_HASH_IPV4 | ICE_FLOW_HASH_GTP_U_UP)
#define ICE_FLOW_HASH_GTP_U_IPV6_UP \
(ICE_FLOW_HASH_IPV6 | ICE_FLOW_HASH_GTP_U_UP)
#define ICE_FLOW_HASH_GTP_U_IPV4_DWN \
(ICE_FLOW_HASH_IPV4 | ICE_FLOW_HASH_GTP_U_DWN)
#define ICE_FLOW_HASH_GTP_U_IPV6_DWN \
(ICE_FLOW_HASH_IPV6 | ICE_FLOW_HASH_GTP_U_DWN)
#define ICE_FLOW_HASH_PPPOE_SESS_ID \ #define ICE_FLOW_HASH_PPPOE_SESS_ID \
(BIT_ULL(ICE_FLOW_FIELD_IDX_PPPOE_SESS_ID)) (BIT_ULL(ICE_FLOW_FIELD_IDX_PPPOE_SESS_ID))
...@@ -242,6 +256,13 @@ enum ice_flow_field { ...@@ -242,6 +256,13 @@ enum ice_flow_field {
#define ICE_FLOW_HASH_FLD_SCTP_DST_PORT \ #define ICE_FLOW_HASH_FLD_SCTP_DST_PORT \
BIT_ULL(ICE_FLOW_FIELD_IDX_SCTP_DST_PORT) BIT_ULL(ICE_FLOW_FIELD_IDX_SCTP_DST_PORT)
#define ICE_FLOW_HASH_FLD_GTPC_TEID BIT_ULL(ICE_FLOW_FIELD_IDX_GTPC_TEID)
#define ICE_FLOW_HASH_FLD_GTPU_IP_TEID BIT_ULL(ICE_FLOW_FIELD_IDX_GTPU_IP_TEID)
#define ICE_FLOW_HASH_FLD_GTPU_EH_TEID BIT_ULL(ICE_FLOW_FIELD_IDX_GTPU_EH_TEID)
#define ICE_FLOW_HASH_FLD_GTPU_UP_TEID BIT_ULL(ICE_FLOW_FIELD_IDX_GTPU_UP_TEID)
#define ICE_FLOW_HASH_FLD_GTPU_DWN_TEID \
BIT_ULL(ICE_FLOW_FIELD_IDX_GTPU_DWN_TEID)
/* Flow headers and fields for AVF support */ /* Flow headers and fields for AVF support */
enum ice_flow_avf_hdr_field { enum ice_flow_avf_hdr_field {
/* Values 0 - 28 are reserved for future use */ /* Values 0 - 28 are reserved for future use */
......
...@@ -1618,6 +1618,25 @@ static const struct ice_rss_hash_cfg default_rss_cfgs[] = { ...@@ -1618,6 +1618,25 @@ static const struct ice_rss_hash_cfg default_rss_cfgs[] = {
*/ */
{ICE_FLOW_SEG_HDR_SCTP | ICE_FLOW_SEG_HDR_IPV4, {ICE_FLOW_SEG_HDR_SCTP | ICE_FLOW_SEG_HDR_IPV4,
ICE_HASH_SCTP_IPV4, ICE_RSS_OUTER_HEADERS, false}, ICE_HASH_SCTP_IPV4, ICE_RSS_OUTER_HEADERS, false},
/* configure RSS for gtpc4 with input set IPv4 src/dst */
{ICE_FLOW_SEG_HDR_GTPC | ICE_FLOW_SEG_HDR_IPV4,
ICE_FLOW_HASH_IPV4, ICE_RSS_OUTER_HEADERS, false},
/* configure RSS for gtpc4t with input set IPv4 src/dst */
{ICE_FLOW_SEG_HDR_GTPC_TEID | ICE_FLOW_SEG_HDR_IPV4,
ICE_FLOW_HASH_GTP_C_IPV4_TEID, ICE_RSS_OUTER_HEADERS, false},
/* configure RSS for gtpu4 with input set IPv4 src/dst */
{ICE_FLOW_SEG_HDR_GTPU_IP | ICE_FLOW_SEG_HDR_IPV4,
ICE_FLOW_HASH_GTP_U_IPV4_TEID, ICE_RSS_OUTER_HEADERS, false},
/* configure RSS for gtpu4e with input set IPv4 src/dst */
{ICE_FLOW_SEG_HDR_GTPU_EH | ICE_FLOW_SEG_HDR_IPV4,
ICE_FLOW_HASH_GTP_U_IPV4_EH, ICE_RSS_OUTER_HEADERS, false},
/* configure RSS for gtpu4u with input set IPv4 src/dst */
{ ICE_FLOW_SEG_HDR_GTPU_UP | ICE_FLOW_SEG_HDR_IPV4,
ICE_FLOW_HASH_GTP_U_IPV4_UP, ICE_RSS_OUTER_HEADERS, false},
/* configure RSS for gtpu4d with input set IPv4 src/dst */
{ICE_FLOW_SEG_HDR_GTPU_DWN | ICE_FLOW_SEG_HDR_IPV4,
ICE_FLOW_HASH_GTP_U_IPV4_DWN, ICE_RSS_OUTER_HEADERS, false},
/* configure RSS for tcp6 with input set IPv6 src/dst, TCP src/dst */ /* configure RSS for tcp6 with input set IPv6 src/dst, TCP src/dst */
{ICE_FLOW_SEG_HDR_TCP | ICE_FLOW_SEG_HDR_IPV6, {ICE_FLOW_SEG_HDR_TCP | ICE_FLOW_SEG_HDR_IPV6,
ICE_HASH_TCP_IPV6, ICE_RSS_ANY_HEADERS, false}, ICE_HASH_TCP_IPV6, ICE_RSS_ANY_HEADERS, false},
...@@ -1632,6 +1651,24 @@ static const struct ice_rss_hash_cfg default_rss_cfgs[] = { ...@@ -1632,6 +1651,24 @@ static const struct ice_rss_hash_cfg default_rss_cfgs[] = {
/* configure RSS for IPSEC ESP SPI with input set MAC_IPV4_SPI */ /* configure RSS for IPSEC ESP SPI with input set MAC_IPV4_SPI */
{ICE_FLOW_SEG_HDR_ESP, {ICE_FLOW_SEG_HDR_ESP,
ICE_FLOW_HASH_ESP_SPI, ICE_RSS_OUTER_HEADERS, false}, ICE_FLOW_HASH_ESP_SPI, ICE_RSS_OUTER_HEADERS, false},
/* configure RSS for gtpc6 with input set IPv6 src/dst */
{ICE_FLOW_SEG_HDR_GTPC | ICE_FLOW_SEG_HDR_IPV6,
ICE_FLOW_HASH_IPV6, ICE_RSS_OUTER_HEADERS, false},
/* configure RSS for gtpc6t with input set IPv6 src/dst */
{ICE_FLOW_SEG_HDR_GTPC_TEID | ICE_FLOW_SEG_HDR_IPV6,
ICE_FLOW_HASH_GTP_C_IPV6_TEID, ICE_RSS_OUTER_HEADERS, false},
/* configure RSS for gtpu6 with input set IPv6 src/dst */
{ICE_FLOW_SEG_HDR_GTPU_IP | ICE_FLOW_SEG_HDR_IPV6,
ICE_FLOW_HASH_GTP_U_IPV6_TEID, ICE_RSS_OUTER_HEADERS, false},
/* configure RSS for gtpu6e with input set IPv6 src/dst */
{ICE_FLOW_SEG_HDR_GTPU_EH | ICE_FLOW_SEG_HDR_IPV6,
ICE_FLOW_HASH_GTP_U_IPV6_EH, ICE_RSS_OUTER_HEADERS, false},
/* configure RSS for gtpu6u with input set IPv6 src/dst */
{ ICE_FLOW_SEG_HDR_GTPU_UP | ICE_FLOW_SEG_HDR_IPV6,
ICE_FLOW_HASH_GTP_U_IPV6_UP, ICE_RSS_OUTER_HEADERS, false},
/* configure RSS for gtpu6d with input set IPv6 src/dst */
{ICE_FLOW_SEG_HDR_GTPU_DWN | ICE_FLOW_SEG_HDR_IPV6,
ICE_FLOW_HASH_GTP_U_IPV6_DWN, ICE_RSS_OUTER_HEADERS, false},
}; };
/** /**
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment