summaryrefslogtreecommitdiff
path: root/ethtool.c
diff options
context:
space:
mode:
authorBen Hutchings <bhutchings@solarflare.com>2010-06-25 15:49:19 +0100
committerJeff Garzik <jgarzik@redhat.com>2010-06-25 13:07:53 -0400
commit99a2b6bf711c0b3662116262211e1b2f569449da (patch)
tree2fab6c9b7c454accd676dbfe92037a5880e560fe /ethtool.c
parent24d71eb4a2650662f8863f7811735c839d9d4799 (diff)
downloadethtool-99a2b6bf711c0b3662116262211e1b2f569449da.tar.gz
ethtool: Add support for named flags
Define an argument type CMDL_FLAG, which can be used to set and clear flags. For each setting that can be modified in this way, the flags to be set and cleared are accumulated in two variables. Add support for CMDL_FLAGS parse_generic_cmdline(). Add utility function print_flags(). Signed-off-by: Ben Hutchings <bhutchings@solarflare.com> Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
Diffstat (limited to 'ethtool.c')
-rw-r--r--ethtool.c40
1 files changed, 39 insertions, 1 deletions
diff --git a/ethtool.c b/ethtool.c
index d4bf5a8..4adab4b 100644
--- a/ethtool.c
+++ b/ethtool.c
@@ -352,14 +352,21 @@ typedef enum {
CMDL_BE16,
CMDL_BE32,
CMDL_STR,
+ CMDL_FLAG,
} cmdline_type_t;
struct cmdline_info {
const char *name;
cmdline_type_t type;
- /* Points to int (BOOL), s32, u16, u32, u64 or char * (STR) */
+ /* Points to int (BOOL), s32, u16, u32 (U32/FLAG), u64 or
+ * char * (STR). For FLAG, the value accumulates all flags
+ * to be set. */
void *wanted_val;
void *ioctl_val;
+ /* For FLAG, the flag value to be set/cleared */
+ u32 flag_val;
+ /* For FLAG, accumulates all flags to be cleared */
+ u32 *unwanted_val;
};
static struct cmdline_info cmdline_gregs[] = {
@@ -550,6 +557,17 @@ static void parse_generic_cmdline(int argc, char **argp,
0xffffffff));
break;
}
+ case CMDL_FLAG: {
+ u32 *p;
+ if (!strcmp(argp[i], "on"))
+ p = info[idx].wanted_val;
+ else if (!strcmp(argp[i], "off"))
+ p = info[idx].unwanted_val;
+ else
+ show_usage(1);
+ *p |= info[idx].flag_val;
+ break;
+ }
case CMDL_STR: {
char **s = info[idx].wanted_val;
*s = strdup(argp[i]);
@@ -566,6 +584,26 @@ static void parse_generic_cmdline(int argc, char **argp,
}
}
+static void
+print_flags(const struct cmdline_info *info, unsigned int n_info, u32 value)
+{
+ const char *sep = "";
+
+ while (n_info) {
+ if (info->type == CMDL_FLAG && value & info->flag_val) {
+ printf("%s%s", sep, info->name);
+ sep = " ";
+ value &= ~info->flag_val;
+ }
+ ++info;
+ --n_info;
+ }
+
+ /* Print any unrecognised flags in hex */
+ if (value)
+ printf("%s%#x", sep, value);
+}
+
static int rxflow_str_to_type(const char *str)
{
int flow_type = 0;