From c88eb6f4e9b2d8f71f3391db2bf0ec82ecccae81 Mon Sep 17 00:00:00 2001
From: Daniel Golle <daniel@makrotopia.org>
Date: Wed, 12 Feb 2025 04:12:42 +0000
Subject: [PATCH] ethtool: make building for RSS input xfrm optional

Unfortunately there is no way to detect at runtime if the kernel the
support for RSS input transformation, and the default value
RXH_XFRM_NO_CHANGE (0xff) used by newer ethtool results in breakage
with older kernels.
As a stop-gap solution simply don't compile with support for input
xfrm by default.

Signed-off-by: Daniel Golle <daniel@makrotopia.org>
---
 configure.ac | 10 ++++++++++
 ethtool.c    | 10 ++++++++++
 2 files changed, 20 insertions(+)

--- a/configure.ac
+++ b/configure.ac
@@ -45,6 +45,16 @@ if test x$enable_pretty_dump = xyes; the
 fi
 AM_CONDITIONAL([ETHTOOL_ENABLE_PRETTY_DUMP], [test x$enable_pretty_dump = xyes])
 
+AC_ARG_ENABLE(rss-input-xfrm,
+	      [  --enable-rss-input-xfrm  build with support for RSS input transformation (disabled by default)],
+	      ,
+	      enable_rss_input_xfrm=no)
+if test x$enable_rss_input_xfrm = xyes; then
+    AC_DEFINE(ETHTOOL_ENABLE_RSS_INPUT_XFRM, 1,
+	      [Define this to enable building with support for RSS input transformation.])
+fi
+AM_CONDITIONAL([ETHTOOL_ENABLE_RSS_INPUT_XFRM], [test x$enable_rss_input_xfrm = xyes])
+
 AC_ARG_WITH([bash-completion-dir],
 	    AS_HELP_STRING([--with-bash-completion-dir[=PATH]],
 	                   [Install the bash-completion script in this directory. @<:@default=yes@:>@]),
--- a/ethtool.c
+++ b/ethtool.c
@@ -4170,7 +4170,7 @@ static int do_grxfh(struct cmd_context *
 	}
 	if (rss->hfunc)
 		printf("    Unknown hash function: 0x%x\n", rss->hfunc);
-
+#ifdef ETHTOOL_ENABLE_RSS_INPUT_XFRM
 	printf("RSS input transformation:\n");
 	printf("    symmetric-xor: %s\n",
 	       (rss->input_xfrm & RXH_XFRM_SYM_XOR) ? "on" : "off");
@@ -4182,6 +4182,7 @@ static int do_grxfh(struct cmd_context *
 	if (rss->input_xfrm)
 		printf("    Unknown bits in RSS input transformation: 0x%x\n",
 		       rss->input_xfrm);
+#endif
 
 out:
 	free(hfuncs);
@@ -4503,7 +4504,15 @@ static int do_srxfh(struct cmd_context *
 	rss->cmd = ETHTOOL_SRSSH;
 	rss->rss_context = rss_context;
 	rss->hfunc = req_hfunc;
+#ifdef ETHTOOL_ENABLE_RSS_INPUT_XFRM
 	rss->input_xfrm = req_input_xfrm;
+#else
+	if (req_input_xfrm != 0xff) {
+		perror("Compiled for kernel without support for input transformation");
+		err = 1;
+		goto free;
+	}
+#endif
 	if (delete) {
 		rss->indir_size = rss->key_size = 0;
 	} else {
