Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
SUSE:SLE-15-SP1:GA
ethtool
ethtool-better-syntax-for-combinations-of-FEC-m...
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File ethtool-better-syntax-for-combinations-of-FEC-modes.patch of Package ethtool
From: Edward Cree <ecree@solarflare.com> Date: Wed, 19 Sep 2018 17:06:25 +0100 Subject: ethtool: better syntax for combinations of FEC modes Patch-mainline: v4.19? Git-commit: 98c148e8651b01561a8fb1ad8201c1d4a6c30d64 References: fate#326122 bsc#1105557 Instead of commas, just have them as separate argvs. The parsing state machine might look heavyweight, but it makes it easy to add more parameters later and distinguish parameter names from encoding names. Suggested-by: Michal Kubecek <mkubecek@suse.cz> Signed-off-by: Edward Cree <ecree@solarflare.com> Reviewed-by: Michal Kubecek <mkubecek@suse.cz> Signed-off-by: John W. Linville <linville@tuxdriver.com> Acked-by: Michal Kubecek <mkubecek@suse.cz> --- ethtool.8.in | 6 ++--- ethtool.c | 63 ++++++++++++++------------------------------------ test-cmdline.c | 10 ++++---- 3 files changed, 25 insertions(+), 54 deletions(-) diff --git a/ethtool.8.in b/ethtool.8.in index 07ad69edcf64..97d7efcc8320 100644 --- a/ethtool.8.in +++ b/ethtool.8.in @@ -366,7 +366,7 @@ ethtool \- query or control network driver and hardware settings .B ethtool \-\-set\-fec .I devname .B encoding -.BR auto | off | rs | baser [ , ...] +.BR auto | off | rs | baser \ [...] . .\" Adjust lines (i.e. full justification) and hyphenate. .ad @@ -1054,11 +1054,11 @@ current FEC mode, the driver or firmware must take the link down administratively and report the problem in the system logs for users to correct. .RS 4 .TP -.BR encoding\ auto | off | rs | baser [ , ...] +.BR encoding\ auto | off | rs | baser \ [...] Sets the FEC encoding for the device. Combinations of options are specified as e.g. -.B auto,rs +.B encoding auto rs ; the semantics of such combinations vary between drivers. .TS nokeep; diff --git a/ethtool.c b/ethtool.c index a5c20337fa4c..98790d2a3b31 100644 --- a/ethtool.c +++ b/ethtool.c @@ -4886,39 +4886,6 @@ static int fecmode_str_to_type(const char *str) return 0; } -/* Takes a comma-separated list of FEC modes, returns the bitwise OR of their - * corresponding ETHTOOL_FEC_* constants. - * Accepts repetitions (e.g. 'auto,auto') and trailing comma (e.g. 'off,'). - */ -static int parse_fecmode(const char *str) -{ - int fecmode = 0; - char buf[6]; - - if (!str) - return 0; - while (*str) { - size_t next; - int mode; - - next = strcspn(str, ","); - if (next >= 6) /* Bad mode, longest name is 5 chars */ - return 0; - /* Copy into temp buffer and nul-terminate */ - memcpy(buf, str, next); - buf[next] = 0; - mode = fecmode_str_to_type(buf); - if (!mode) /* Bad mode encountered */ - return 0; - fecmode |= mode; - str += next; - /* Skip over ',' (but not nul) */ - if (*str) - str++; - } - return fecmode; -} - static int do_gfec(struct cmd_context *ctx) { struct ethtool_fecparam feccmd = { 0 }; @@ -4948,22 +4915,26 @@ static int do_gfec(struct cmd_context *ctx) static int do_sfec(struct cmd_context *ctx) { - char *fecmode_str = NULL; + enum { ARG_NONE, ARG_ENCODING } state = ARG_NONE; struct ethtool_fecparam feccmd; - struct cmdline_info cmdline_fec[] = { - { "encoding", CMDL_STR, &fecmode_str, &feccmd.fec}, - }; - int changed; - int fecmode; - int rv; + int fecmode = 0, newmode; + int rv, i; - parse_generic_cmdline(ctx, &changed, cmdline_fec, - ARRAY_SIZE(cmdline_fec)); - - if (!fecmode_str) + for (i = 0; i < ctx->argc; i++) { + if (!strcmp(ctx->argp[i], "encoding")) { + state = ARG_ENCODING; + continue; + } + if (state == ARG_ENCODING) { + newmode = fecmode_str_to_type(ctx->argp[i]); + if (!newmode) + exit_bad_args(); + fecmode |= newmode; + continue; + } exit_bad_args(); + } - fecmode = parse_fecmode(fecmode_str); if (!fecmode) exit_bad_args(); @@ -5150,7 +5121,7 @@ static const struct option { " [ downshift ]\n"}, { "--show-fec", 1, do_gfec, "Show FEC settings"}, { "--set-fec", 1, do_sfec, "Set FEC settings", - " [ encoding auto|off|rs|baser ]\n"}, + " [ encoding auto|off|rs|baser [...]]\n"}, { "-h|--help", 0, show_usage, "Show this help" }, { "--version", 0, do_version, "Show version number" }, {} diff --git a/test-cmdline.c b/test-cmdline.c index 9c51ccada19d..84630a55d0e4 100644 --- a/test-cmdline.c +++ b/test-cmdline.c @@ -268,12 +268,12 @@ static struct test_case { { 1, "--set-eee devname advertise foo" }, { 1, "--set-fec devname" }, { 0, "--set-fec devname encoding auto" }, - { 0, "--set-fec devname encoding off," }, - { 0, "--set-fec devname encoding baser,rs" }, - { 0, "--set-fec devname encoding auto,auto," }, + { 0, "--set-fec devname encoding off" }, + { 0, "--set-fec devname encoding baser rs" }, + { 0, "--set-fec devname encoding auto auto" }, { 1, "--set-fec devname encoding foo" }, - { 1, "--set-fec devname encoding auto,foo" }, - { 1, "--set-fec devname encoding auto,," }, + { 1, "--set-fec devname encoding auto foo" }, + { 1, "--set-fec devname encoding none" }, { 1, "--set-fec devname auto" }, /* can't test --set-priv-flags yet */ { 0, "-h" }, -- 2.19.1
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor