aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichal Kubecek <mkubecek@suse.cz>2020-04-13 23:21:20 +0200
committerJohn W. Linville <linville@tuxdriver.com>2020-05-13 15:54:38 -0400
commit4b1fa2c2d250441f83b90f9410cd6ce7d879c2fe (patch)
treeb76573b89ad826148df5b51ba0288e8edccb4154
parent8bb9a04002a38fd24be122fed35420fee589bc6e (diff)
downloadethtool-4b1fa2c2d250441f83b90f9410cd6ce7d879c2fe.tar.gz
features: accept long legacy flag names when setting features
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> Signed-off-by: John W. Linville <linville@tuxdriver.com>
-rw-r--r--ethtool.c17
1 files changed, 12 insertions, 5 deletions
diff --git a/ethtool.c b/ethtool.c
index 6dfc76e..c8ae494 100644
--- a/ethtool.c
+++ b/ethtool.c
@@ -2306,26 +2306,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) {