ethtool: Symmetric OR-XOR RSS hash

Add an additional type of symmetric RSS hash type: OR-XOR.
The "Symmetric-OR-XOR" algorithm transforms the input as follows:

(SRC_IP | DST_IP, SRC_IP ^ DST_IP, SRC_PORT | DST_PORT, SRC_PORT ^ DST_PORT)

Change 'cap_rss_sym_xor_supported' to 'supported_input_xfrm', a bitmap
of supported RXH_XFRM_* types.

Reviewed-by: Cosmin Ratiu <cratiu@nvidia.com>
Reviewed-by: Tariq Toukan <tariqt@nvidia.com>
Signed-off-by: Gal Pressman <gal@nvidia.com>
Reviewed-by: Edward Cree <ecree.xilinx@gmail.com>
Link: https://patch.msgid.link/20250224174416.499070-2-gal@nvidia.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
pull/1188/head
Gal Pressman 2025-02-24 19:44:13 +02:00 committed by Jakub Kicinski
parent ad530283d3
commit ecdff89338
7 changed files with 24 additions and 14 deletions

View File

@ -1934,7 +1934,7 @@ ETHTOOL_A_RSS_INDIR attribute returns RSS indirection table where each byte
indicates queue number. indicates queue number.
ETHTOOL_A_RSS_INPUT_XFRM attribute is a bitmap indicating the type of ETHTOOL_A_RSS_INPUT_XFRM attribute is a bitmap indicating the type of
transformation applied to the input protocol fields before given to the RSS transformation applied to the input protocol fields before given to the RSS
hfunc. Current supported option is symmetric-xor. hfunc. Current supported options are symmetric-xor and symmetric-or-xor.
PLCA_GET_CFG PLCA_GET_CFG
============ ============

View File

@ -49,14 +49,21 @@ destination address) and TCP/UDP (source port, destination port) tuples
are swapped, the computed hash is the same. This is beneficial in some are swapped, the computed hash is the same. This is beneficial in some
applications that monitor TCP/IP flows (IDS, firewalls, ...etc) and need applications that monitor TCP/IP flows (IDS, firewalls, ...etc) and need
both directions of the flow to land on the same Rx queue (and CPU). The both directions of the flow to land on the same Rx queue (and CPU). The
"Symmetric-XOR" is a type of RSS algorithms that achieves this hash "Symmetric-XOR" and "Symmetric-OR-XOR" are types of RSS algorithms that
symmetry by XORing the input source and destination fields of the IP achieve this hash symmetry by XOR/ORing the input source and destination
and/or L4 protocols. This, however, results in reduced input entropy and fields of the IP and/or L4 protocols. This, however, results in reduced
could potentially be exploited. Specifically, the algorithm XORs the input input entropy and could potentially be exploited.
Specifically, the "Symmetric-XOR" algorithm XORs the input
as follows:: as follows::
# (SRC_IP ^ DST_IP, SRC_IP ^ DST_IP, SRC_PORT ^ DST_PORT, SRC_PORT ^ DST_PORT) # (SRC_IP ^ DST_IP, SRC_IP ^ DST_IP, SRC_PORT ^ DST_PORT, SRC_PORT ^ DST_PORT)
The "Symmetric-OR-XOR" algorithm, on the other hand, transforms the input as
follows::
# (SRC_IP | DST_IP, SRC_IP ^ DST_IP, SRC_PORT | DST_PORT, SRC_PORT ^ DST_PORT)
The result is then fed to the underlying RSS algorithm. The result is then fed to the underlying RSS algorithm.
Some advanced NICs allow steering packets to queues based on Some advanced NICs allow steering packets to queues based on

View File

@ -1808,7 +1808,7 @@ static int iavf_set_rxfh(struct net_device *netdev,
static const struct ethtool_ops iavf_ethtool_ops = { static const struct ethtool_ops iavf_ethtool_ops = {
.supported_coalesce_params = ETHTOOL_COALESCE_USECS | .supported_coalesce_params = ETHTOOL_COALESCE_USECS |
ETHTOOL_COALESCE_USE_ADAPTIVE, ETHTOOL_COALESCE_USE_ADAPTIVE,
.cap_rss_sym_xor_supported = true, .supported_input_xfrm = RXH_XFRM_SYM_XOR,
.get_drvinfo = iavf_get_drvinfo, .get_drvinfo = iavf_get_drvinfo,
.get_link = ethtool_op_get_link, .get_link = ethtool_op_get_link,
.get_ringparam = iavf_get_ringparam, .get_ringparam = iavf_get_ringparam,

View File

@ -4770,7 +4770,7 @@ static const struct ethtool_ops ice_ethtool_ops = {
.supported_coalesce_params = ETHTOOL_COALESCE_USECS | .supported_coalesce_params = ETHTOOL_COALESCE_USECS |
ETHTOOL_COALESCE_USE_ADAPTIVE | ETHTOOL_COALESCE_USE_ADAPTIVE |
ETHTOOL_COALESCE_RX_USECS_HIGH, ETHTOOL_COALESCE_RX_USECS_HIGH,
.cap_rss_sym_xor_supported = true, .supported_input_xfrm = RXH_XFRM_SYM_XOR,
.rxfh_per_ctx_key = true, .rxfh_per_ctx_key = true,
.get_link_ksettings = ice_get_link_ksettings, .get_link_ksettings = ice_get_link_ksettings,
.set_link_ksettings = ice_set_link_ksettings, .set_link_ksettings = ice_set_link_ksettings,

View File

@ -763,13 +763,12 @@ struct kernel_ethtool_ts_info {
/** /**
* struct ethtool_ops - optional netdev operations * struct ethtool_ops - optional netdev operations
* @supported_input_xfrm: supported types of input xfrm from %RXH_XFRM_*.
* @cap_link_lanes_supported: indicates if the driver supports lanes * @cap_link_lanes_supported: indicates if the driver supports lanes
* parameter. * parameter.
* @cap_rss_ctx_supported: indicates if the driver supports RSS * @cap_rss_ctx_supported: indicates if the driver supports RSS
* contexts via legacy API, drivers implementing @create_rxfh_context * contexts via legacy API, drivers implementing @create_rxfh_context
* do not have to set this bit. * do not have to set this bit.
* @cap_rss_sym_xor_supported: indicates if the driver supports symmetric-xor
* RSS.
* @rxfh_per_ctx_key: device supports setting different RSS key for each * @rxfh_per_ctx_key: device supports setting different RSS key for each
* additional context. Netlink API should report hfunc, key, and input_xfrm * additional context. Netlink API should report hfunc, key, and input_xfrm
* for every context, not just context 0. * for every context, not just context 0.
@ -995,9 +994,9 @@ struct kernel_ethtool_ts_info {
* of the generic netdev features interface. * of the generic netdev features interface.
*/ */
struct ethtool_ops { struct ethtool_ops {
u32 supported_input_xfrm:8;
u32 cap_link_lanes_supported:1; u32 cap_link_lanes_supported:1;
u32 cap_rss_ctx_supported:1; u32 cap_rss_ctx_supported:1;
u32 cap_rss_sym_xor_supported:1;
u32 rxfh_per_ctx_key:1; u32 rxfh_per_ctx_key:1;
u32 cap_rss_rxnfc_adds:1; u32 cap_rss_rxnfc_adds:1;
u32 rxfh_indir_space; u32 rxfh_indir_space;

View File

@ -2289,6 +2289,10 @@ static inline int ethtool_validate_duplex(__u8 duplex)
* be exploited to reduce the RSS queue spread. * be exploited to reduce the RSS queue spread.
*/ */
#define RXH_XFRM_SYM_XOR (1 << 0) #define RXH_XFRM_SYM_XOR (1 << 0)
/* Similar to SYM_XOR, except that one copy of the XOR'ed fields is replaced by
* an OR of the same fields
*/
#define RXH_XFRM_SYM_OR_XOR (1 << 1)
#define RXH_XFRM_NO_CHANGE 0xff #define RXH_XFRM_NO_CHANGE 0xff
/* L2-L4 network traffic flow types */ /* L2-L4 network traffic flow types */

View File

@ -1011,11 +1011,11 @@ static noinline_for_stack int ethtool_set_rxnfc(struct net_device *dev,
if (rc) if (rc)
return rc; return rc;
/* Sanity check: if symmetric-xor is set, then: /* Sanity check: if symmetric-xor/symmetric-or-xor is set, then:
* 1 - no other fields besides IP src/dst and/or L4 src/dst * 1 - no other fields besides IP src/dst and/or L4 src/dst
* 2 - If src is set, dst must also be set * 2 - If src is set, dst must also be set
*/ */
if ((rxfh.input_xfrm & RXH_XFRM_SYM_XOR) && if ((rxfh.input_xfrm & (RXH_XFRM_SYM_XOR | RXH_XFRM_SYM_OR_XOR)) &&
((info.data & ~(RXH_IP_SRC | RXH_IP_DST | ((info.data & ~(RXH_IP_SRC | RXH_IP_DST |
RXH_L4_B_0_1 | RXH_L4_B_2_3)) || RXH_L4_B_0_1 | RXH_L4_B_2_3)) ||
(!!(info.data & RXH_IP_SRC) ^ !!(info.data & RXH_IP_DST)) || (!!(info.data & RXH_IP_SRC) ^ !!(info.data & RXH_IP_DST)) ||
@ -1388,11 +1388,11 @@ static noinline_for_stack int ethtool_set_rxfh(struct net_device *dev,
return -EOPNOTSUPP; return -EOPNOTSUPP;
/* Check input data transformation capabilities */ /* Check input data transformation capabilities */
if (rxfh.input_xfrm && rxfh.input_xfrm != RXH_XFRM_SYM_XOR && if (rxfh.input_xfrm && rxfh.input_xfrm != RXH_XFRM_SYM_XOR &&
rxfh.input_xfrm != RXH_XFRM_SYM_OR_XOR &&
rxfh.input_xfrm != RXH_XFRM_NO_CHANGE) rxfh.input_xfrm != RXH_XFRM_NO_CHANGE)
return -EINVAL; return -EINVAL;
if (rxfh.input_xfrm != RXH_XFRM_NO_CHANGE && if (rxfh.input_xfrm != RXH_XFRM_NO_CHANGE &&
(rxfh.input_xfrm & RXH_XFRM_SYM_XOR) && rxfh.input_xfrm & ~ops->supported_input_xfrm)
!ops->cap_rss_sym_xor_supported)
return -EOPNOTSUPP; return -EOPNOTSUPP;
create = rxfh.rss_context == ETH_RXFH_CONTEXT_ALLOC; create = rxfh.rss_context == ETH_RXFH_CONTEXT_ALLOC;