diff options
author | Michal Kubecek <mkubecek@suse.cz> | 2020-04-13 23:21:20 +0200 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2020-05-13 15:54:38 -0400 |
commit | 4b1fa2c2d250441f83b90f9410cd6ce7d879c2fe (patch) | |
tree | b76573b89ad826148df5b51ba0288e8edccb4154 | |
parent | 8bb9a04002a38fd24be122fed35420fee589bc6e (diff) | |
download | ethtool-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.c | 17 |
1 files changed, 12 insertions, 5 deletions
@@ -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) { |