c03953a30f
OBS-URL: https://build.opensuse.org/package/show/network:utilities/ethtool?expand=0&rev=95
64 lines
2.4 KiB
Diff
64 lines
2.4 KiB
Diff
From: Michal Kubecek <mkubecek@suse.cz>
|
|
Date: Mon, 13 Apr 2020 11:46:42 +0200
|
|
Subject: features: accept long legacy flag names when setting features
|
|
Patch-mainline: v5.7
|
|
Git-commit: 4b1fa2c2d250441f83b90f9410cd6ce7d879c2fe
|
|
|
|
The legacy feature flags have long names (e.g. "generic-receive-offload")
|
|
and short names (e.g. "gro"). While "ethtool -k" shows only long names,
|
|
"ethtool -K" accepts only short names. This is a bit confusing as users
|
|
have to resort to documentation to see what flag name to use; in
|
|
particular, if a legacy flag corresponds to only one actual kernel feature,
|
|
"ethtool -k" shows the output in the same form as if long flag name were
|
|
a kernel feature name but this name cannot be used to set the flag/feature.
|
|
|
|
Accept both short and long legacy flag names in "ethool -K".
|
|
|
|
Reported-by: Konstantin Kharlamov <hi-angel@yandex.ru>
|
|
Signed-off-by: Michal Kubecek <mkubecek@suse.cz>
|
|
---
|
|
ethtool.c | 17 ++++++++++++-----
|
|
1 file changed, 12 insertions(+), 5 deletions(-)
|
|
|
|
--- a/ethtool.c
|
|
+++ b/ethtool.c
|
|
@@ -2297,26 +2297,33 @@ static int do_sfeatures(struct cmd_context *ctx)
|
|
/* Generate cmdline_info for legacy flags and kernel-named
|
|
* features, and parse our arguments.
|
|
*/
|
|
- cmdline_features = calloc(ARRAY_SIZE(off_flag_def) + defs->n_features,
|
|
+ cmdline_features = calloc(2 * ARRAY_SIZE(off_flag_def) +
|
|
+ defs->n_features,
|
|
sizeof(cmdline_features[0]));
|
|
if (!cmdline_features) {
|
|
perror("Cannot parse arguments");
|
|
rc = 1;
|
|
goto err;
|
|
}
|
|
- for (i = 0; i < ARRAY_SIZE(off_flag_def); i++)
|
|
+ j = 0;
|
|
+ for (i = 0; i < ARRAY_SIZE(off_flag_def); i++) {
|
|
flag_to_cmdline_info(off_flag_def[i].short_name,
|
|
off_flag_def[i].value,
|
|
&off_flags_wanted, &off_flags_mask,
|
|
- &cmdline_features[i]);
|
|
+ &cmdline_features[j++]);
|
|
+ flag_to_cmdline_info(off_flag_def[i].long_name,
|
|
+ off_flag_def[i].value,
|
|
+ &off_flags_wanted, &off_flags_mask,
|
|
+ &cmdline_features[j++]);
|
|
+ }
|
|
for (i = 0; i < defs->n_features; i++)
|
|
flag_to_cmdline_info(
|
|
defs->def[i].name, FEATURE_FIELD_FLAG(i),
|
|
&FEATURE_WORD(efeatures->features, i, requested),
|
|
&FEATURE_WORD(efeatures->features, i, valid),
|
|
- &cmdline_features[ARRAY_SIZE(off_flag_def) + i]);
|
|
+ &cmdline_features[j++]);
|
|
parse_generic_cmdline(ctx, &any_changed, cmdline_features,
|
|
- ARRAY_SIZE(off_flag_def) + defs->n_features);
|
|
+ 2 * ARRAY_SIZE(off_flag_def) + defs->n_features);
|
|
free(cmdline_features);
|
|
|
|
if (!any_changed) {
|