From 37897ca86845ac9f8df16ca424477baa3ac8c389 Mon Sep 17 00:00:00 2001 From: Ben Hutchings Date: Sat, 29 Oct 2011 02:33:30 +0100 Subject: Encapsulate command context in a structure Replace the fd and ifr arguments to each sub-command handler with struct cmd_context. Change send_ioctl() to take a pointer to this context and a pointer to the ethtool_cmd or other structure. Use send_ioctl() consistently. Signed-off-by: Ben Hutchings --- ethtool.c | 419 ++++++++++++++++++++++++++------------------------------------ 1 file changed, 174 insertions(+), 245 deletions(-) (limited to 'ethtool.c') diff --git a/ethtool.c b/ethtool.c index f967f84..b6f535c 100644 --- a/ethtool.c +++ b/ethtool.c @@ -67,42 +67,40 @@ enum { static int parse_wolopts(char *optstr, u32 *data); static char *unparse_wolopts(int wolopts); static void get_mac_addr(char *src, unsigned char *dest); -static int do_gdrv(int fd, struct ifreq *ifr); -static int do_gset(int fd, struct ifreq *ifr); -static int do_sset(int fd, struct ifreq *ifr); -static int do_gregs(int fd, struct ifreq *ifr); -static int do_nway_rst(int fd, struct ifreq *ifr); -static int do_geeprom(int fd, struct ifreq *ifr); -static int do_seeprom(int fd, struct ifreq *ifr); -static int do_test(int fd, struct ifreq *ifr); -static int do_phys_id(int fd, struct ifreq *ifr); -static int do_gpause(int fd, struct ifreq *ifr); -static int do_spause(int fd, struct ifreq *ifr); -static int do_gring(int fd, struct ifreq *ifr); -static int do_sring(int fd, struct ifreq *ifr); -static int do_schannels(int fd, struct ifreq *ifr); -static int do_gchannels(int fd, struct ifreq *ifr); -static int do_gcoalesce(int fd, struct ifreq *ifr); -static int do_scoalesce(int fd, struct ifreq *ifr); -static int do_goffload(int fd, struct ifreq *ifr); -static int do_soffload(int fd, struct ifreq *ifr); -static int do_gstats(int fd, struct ifreq *ifr); +static int do_gdrv(struct cmd_context *ctx); +static int do_gset(struct cmd_context *ctx); +static int do_sset(struct cmd_context *ctx); +static int do_gregs(struct cmd_context *ctx); +static int do_nway_rst(struct cmd_context *ctx); +static int do_geeprom(struct cmd_context *ctx); +static int do_seeprom(struct cmd_context *ctx); +static int do_test(struct cmd_context *ctx); +static int do_phys_id(struct cmd_context *ctx); +static int do_gpause(struct cmd_context *ctx); +static int do_spause(struct cmd_context *ctx); +static int do_gring(struct cmd_context *ctx); +static int do_sring(struct cmd_context *ctx); +static int do_schannels(struct cmd_context *ctx); +static int do_gchannels(struct cmd_context *ctx); +static int do_gcoalesce(struct cmd_context *ctx); +static int do_scoalesce(struct cmd_context *ctx); +static int do_goffload(struct cmd_context *ctx); +static int do_soffload(struct cmd_context *ctx); +static int do_gstats(struct cmd_context *ctx); static int rxflow_str_to_type(const char *str); static int parse_rxfhashopts(char *optstr, u32 *data); static char *unparse_rxfhashopts(u64 opts); static int dump_rxfhash(int fhash, u64 val); -static int do_srxclass(int fd, struct ifreq *ifr); -static int do_grxclass(int fd, struct ifreq *ifr); -static int do_grxfhindir(int fd, struct ifreq *ifr); -static int do_srxfhindir(int fd, struct ifreq *ifr); -static int do_srxclsrule(int fd, struct ifreq *ifr); -static int do_grxclsrule(int fd, struct ifreq *ifr); -static int do_flash(int fd, struct ifreq *ifr); -static int do_permaddr(int fd, struct ifreq *ifr); -static int do_getfwdump(int fd, struct ifreq *ifr); -static int do_setfwdump(int fd, struct ifreq *ifr); - -static int send_ioctl(int fd, struct ifreq *ifr); +static int do_srxclass(struct cmd_context *ctx); +static int do_grxclass(struct cmd_context *ctx); +static int do_grxfhindir(struct cmd_context *ctx); +static int do_srxfhindir(struct cmd_context *ctx); +static int do_srxclsrule(struct cmd_context *ctx); +static int do_grxclsrule(struct cmd_context *ctx); +static int do_flash(struct cmd_context *ctx); +static int do_permaddr(struct cmd_context *ctx); +static int do_getfwdump(struct cmd_context *ctx); +static int do_setfwdump(struct cmd_context *ctx); static enum { MODE_VERSION = -2, @@ -1982,94 +1980,92 @@ static int dump_rxfhash(int fhash, u64 val) static int doit(void) { - struct ifreq ifr; - int fd; + struct cmd_context ctx; /* Setup our control structures. */ - memset(&ifr, 0, sizeof(ifr)); - strcpy(ifr.ifr_name, devname); + memset(&ctx.ifr, 0, sizeof(ctx.ifr)); + strcpy(ctx.ifr.ifr_name, devname); /* Open control socket. */ - fd = socket(AF_INET, SOCK_DGRAM, 0); - if (fd < 0) { + ctx.fd = socket(AF_INET, SOCK_DGRAM, 0); + if (ctx.fd < 0) { perror("Cannot get control socket"); return 70; } /* all of these are expected to populate ifr->ifr_data as needed */ if (mode == MODE_GDRV) { - return do_gdrv(fd, &ifr); + return do_gdrv(&ctx); } else if (mode == MODE_GSET) { - return do_gset(fd, &ifr); + return do_gset(&ctx); } else if (mode == MODE_SSET) { - return do_sset(fd, &ifr); + return do_sset(&ctx); } else if (mode == MODE_GREGS) { - return do_gregs(fd, &ifr); + return do_gregs(&ctx); } else if (mode == MODE_NWAY_RST) { - return do_nway_rst(fd, &ifr); + return do_nway_rst(&ctx); } else if (mode == MODE_GEEPROM) { - return do_geeprom(fd, &ifr); + return do_geeprom(&ctx); } else if (mode == MODE_SEEPROM) { - return do_seeprom(fd, &ifr); + return do_seeprom(&ctx); } else if (mode == MODE_TEST) { - return do_test(fd, &ifr); + return do_test(&ctx); } else if (mode == MODE_PHYS_ID) { - return do_phys_id(fd, &ifr); + return do_phys_id(&ctx); } else if (mode == MODE_GPAUSE) { - return do_gpause(fd, &ifr); + return do_gpause(&ctx); } else if (mode == MODE_SPAUSE) { - return do_spause(fd, &ifr); + return do_spause(&ctx); } else if (mode == MODE_GCOALESCE) { - return do_gcoalesce(fd, &ifr); + return do_gcoalesce(&ctx); } else if (mode == MODE_SCOALESCE) { - return do_scoalesce(fd, &ifr); + return do_scoalesce(&ctx); } else if (mode == MODE_GRING) { - return do_gring(fd, &ifr); + return do_gring(&ctx); } else if (mode == MODE_SRING) { - return do_sring(fd, &ifr); + return do_sring(&ctx); } else if (mode == MODE_GCHANNELS) { - return do_gchannels(fd, &ifr); + return do_gchannels(&ctx); } else if (mode == MODE_SCHANNELS) { - return do_schannels(fd, &ifr); + return do_schannels(&ctx); } else if (mode == MODE_GOFFLOAD) { - return do_goffload(fd, &ifr); + return do_goffload(&ctx); } else if (mode == MODE_SOFFLOAD) { - return do_soffload(fd, &ifr); + return do_soffload(&ctx); } else if (mode == MODE_GSTATS) { - return do_gstats(fd, &ifr); + return do_gstats(&ctx); } else if (mode == MODE_GNFC) { - return do_grxclass(fd, &ifr); + return do_grxclass(&ctx); } else if (mode == MODE_SNFC) { - return do_srxclass(fd, &ifr); + return do_srxclass(&ctx); } else if (mode == MODE_GRXFHINDIR) { - return do_grxfhindir(fd, &ifr); + return do_grxfhindir(&ctx); } else if (mode == MODE_SRXFHINDIR) { - return do_srxfhindir(fd, &ifr); + return do_srxfhindir(&ctx); } else if (mode == MODE_SCLSRULE) { - return do_srxclsrule(fd, &ifr); + return do_srxclsrule(&ctx); } else if (mode == MODE_GCLSRULE) { - return do_grxclsrule(fd, &ifr); + return do_grxclsrule(&ctx); } else if (mode == MODE_FLASHDEV) { - return do_flash(fd, &ifr); + return do_flash(&ctx); } else if (mode == MODE_PERMADDR) { - return do_permaddr(fd, &ifr); + return do_permaddr(&ctx); } else if (mode == MODE_GET_DUMP) { - return do_getfwdump(fd, &ifr); + return do_getfwdump(&ctx); } else if (mode == MODE_SET_DUMP) { - return do_setfwdump(fd, &ifr); + return do_setfwdump(&ctx); } return 69; } -static int do_gdrv(int fd, struct ifreq *ifr) +static int do_gdrv(struct cmd_context *ctx) { int err; struct ethtool_drvinfo drvinfo; drvinfo.cmd = ETHTOOL_GDRVINFO; - ifr->ifr_data = (caddr_t)&drvinfo; - err = send_ioctl(fd, ifr); + err = send_ioctl(ctx, &drvinfo); if (err < 0) { perror("Cannot get driver information"); return 71; @@ -2077,7 +2073,7 @@ static int do_gdrv(int fd, struct ifreq *ifr) return dump_drvinfo(&drvinfo); } -static int do_gpause(int fd, struct ifreq *ifr) +static int do_gpause(struct cmd_context *ctx) { struct ethtool_cmd ecmd; int err; @@ -2085,8 +2081,7 @@ static int do_gpause(int fd, struct ifreq *ifr) fprintf(stdout, "Pause parameters for %s:\n", devname); epause.cmd = ETHTOOL_GPAUSEPARAM; - ifr->ifr_data = (caddr_t)&epause; - err = send_ioctl(fd, ifr); + err = send_ioctl(ctx, &epause); if (err) { perror("Cannot get device pause settings"); return 76; @@ -2094,8 +2089,7 @@ static int do_gpause(int fd, struct ifreq *ifr) if (epause.autoneg) { ecmd.cmd = ETHTOOL_GSET; - ifr->ifr_data = (caddr_t)&ecmd; - err = send_ioctl(fd, ifr); + err = send_ioctl(ctx, &ecmd); if (err) { perror("Cannot get device settings"); return 1; @@ -2137,13 +2131,12 @@ static void do_generic_set(struct cmdline_info *info, do_generic_set1(&info[i], changed_out); } -static int do_spause(int fd, struct ifreq *ifr) +static int do_spause(struct cmd_context *ctx) { int err, changed = 0; epause.cmd = ETHTOOL_GPAUSEPARAM; - ifr->ifr_data = (caddr_t)&epause; - err = send_ioctl(fd, ifr); + err = send_ioctl(ctx, &epause); if (err) { perror("Cannot get device pause settings"); return 77; @@ -2157,8 +2150,7 @@ static int do_spause(int fd, struct ifreq *ifr) } epause.cmd = ETHTOOL_SPAUSEPARAM; - ifr->ifr_data = (caddr_t)&epause; - err = send_ioctl(fd, ifr); + err = send_ioctl(ctx, &epause); if (err) { perror("Cannot set device pause parameters"); return 79; @@ -2167,13 +2159,12 @@ static int do_spause(int fd, struct ifreq *ifr) return 0; } -static int do_sring(int fd, struct ifreq *ifr) +static int do_sring(struct cmd_context *ctx) { int err, changed = 0; ering.cmd = ETHTOOL_GRINGPARAM; - ifr->ifr_data = (caddr_t)&ering; - err = send_ioctl(fd, ifr); + err = send_ioctl(ctx, &ering); if (err) { perror("Cannot get device ring settings"); return 76; @@ -2187,8 +2178,7 @@ static int do_sring(int fd, struct ifreq *ifr) } ering.cmd = ETHTOOL_SRINGPARAM; - ifr->ifr_data = (caddr_t)&ering; - err = send_ioctl(fd, ifr); + err = send_ioctl(ctx, &ering); if (err) { perror("Cannot set device ring parameters"); return 81; @@ -2197,15 +2187,14 @@ static int do_sring(int fd, struct ifreq *ifr) return 0; } -static int do_gring(int fd, struct ifreq *ifr) +static int do_gring(struct cmd_context *ctx) { int err; fprintf(stdout, "Ring parameters for %s:\n", devname); ering.cmd = ETHTOOL_GRINGPARAM; - ifr->ifr_data = (caddr_t)&ering; - err = send_ioctl(fd, ifr); + err = send_ioctl(ctx, &ering); if (err == 0) { err = dump_ring(); if (err) @@ -2218,13 +2207,12 @@ static int do_gring(int fd, struct ifreq *ifr) return 0; } -static int do_schannels(int fd, struct ifreq *ifr) +static int do_schannels(struct cmd_context *ctx) { int err, changed = 0; echannels.cmd = ETHTOOL_GCHANNELS; - ifr->ifr_data = (caddr_t)&echannels; - err = send_ioctl(fd, ifr); + err = send_ioctl(ctx, &echannels); if (err) { perror("Cannot get device channel parameters"); return 1; @@ -2243,8 +2231,7 @@ static int do_schannels(int fd, struct ifreq *ifr) } echannels.cmd = ETHTOOL_SCHANNELS; - ifr->ifr_data = (caddr_t)&echannels; - err = send_ioctl(fd, ifr); + err = send_ioctl(ctx, &echannels); if (err) { perror("Cannot set device channel parameters"); return 1; @@ -2253,15 +2240,14 @@ static int do_schannels(int fd, struct ifreq *ifr) return 0; } -static int do_gchannels(int fd, struct ifreq *ifr) +static int do_gchannels(struct cmd_context *ctx) { int err; fprintf(stdout, "Channel parameters for %s:\n", devname); echannels.cmd = ETHTOOL_GCHANNELS; - ifr->ifr_data = (caddr_t)&echannels; - err = send_ioctl(fd, ifr); + err = send_ioctl(ctx, &echannels); if (err == 0) { err = dump_channels(); if (err) @@ -2274,15 +2260,14 @@ static int do_gchannels(int fd, struct ifreq *ifr) } -static int do_gcoalesce(int fd, struct ifreq *ifr) +static int do_gcoalesce(struct cmd_context *ctx) { int err; fprintf(stdout, "Coalesce parameters for %s:\n", devname); ecoal.cmd = ETHTOOL_GCOALESCE; - ifr->ifr_data = (caddr_t)&ecoal; - err = send_ioctl(fd, ifr); + err = send_ioctl(ctx, &ecoal); if (err == 0) { err = dump_coalesce(); if (err) @@ -2295,13 +2280,12 @@ static int do_gcoalesce(int fd, struct ifreq *ifr) return 0; } -static int do_scoalesce(int fd, struct ifreq *ifr) +static int do_scoalesce(struct cmd_context *ctx) { int err, changed = 0; ecoal.cmd = ETHTOOL_GCOALESCE; - ifr->ifr_data = (caddr_t)&ecoal; - err = send_ioctl(fd, ifr); + err = send_ioctl(ctx, &ecoal); if (err) { perror("Cannot get device coalesce settings"); return 76; @@ -2316,8 +2300,7 @@ static int do_scoalesce(int fd, struct ifreq *ifr) } ecoal.cmd = ETHTOOL_SCOALESCE; - ifr->ifr_data = (caddr_t)&ecoal; - err = send_ioctl(fd, ifr); + err = send_ioctl(ctx, &ecoal); if (err) { perror("Cannot set device coalesce parameters"); return 81; @@ -2326,7 +2309,7 @@ static int do_scoalesce(int fd, struct ifreq *ifr) return 0; } -static int do_goffload(int fd, struct ifreq *ifr) +static int do_goffload(struct cmd_context *ctx) { struct ethtool_value eval; int err, allfail = 1, rx = 0, tx = 0, sg = 0; @@ -2336,8 +2319,7 @@ static int do_goffload(int fd, struct ifreq *ifr) fprintf(stdout, "Offload parameters for %s:\n", devname); eval.cmd = ETHTOOL_GRXCSUM; - ifr->ifr_data = (caddr_t)&eval; - err = send_ioctl(fd, ifr); + err = send_ioctl(ctx, &eval); if (err) perror("Cannot get device rx csum settings"); else { @@ -2346,8 +2328,7 @@ static int do_goffload(int fd, struct ifreq *ifr) } eval.cmd = ETHTOOL_GTXCSUM; - ifr->ifr_data = (caddr_t)&eval; - err = send_ioctl(fd, ifr); + err = send_ioctl(ctx, &eval); if (err) perror("Cannot get device tx csum settings"); else { @@ -2356,8 +2337,7 @@ static int do_goffload(int fd, struct ifreq *ifr) } eval.cmd = ETHTOOL_GSG; - ifr->ifr_data = (caddr_t)&eval; - err = send_ioctl(fd, ifr); + err = send_ioctl(ctx, &eval); if (err) perror("Cannot get device scatter-gather settings"); else { @@ -2366,8 +2346,7 @@ static int do_goffload(int fd, struct ifreq *ifr) } eval.cmd = ETHTOOL_GTSO; - ifr->ifr_data = (caddr_t)&eval; - err = send_ioctl(fd, ifr); + err = send_ioctl(ctx, &eval); if (err) perror("Cannot get device tcp segmentation offload settings"); else { @@ -2376,8 +2355,7 @@ static int do_goffload(int fd, struct ifreq *ifr) } eval.cmd = ETHTOOL_GUFO; - ifr->ifr_data = (caddr_t)&eval; - err = ioctl(fd, SIOCETHTOOL, ifr); + err = send_ioctl(ctx, &eval); if (err) perror("Cannot get device udp large send offload settings"); else { @@ -2386,8 +2364,7 @@ static int do_goffload(int fd, struct ifreq *ifr) } eval.cmd = ETHTOOL_GGSO; - ifr->ifr_data = (caddr_t)&eval; - err = ioctl(fd, SIOCETHTOOL, ifr); + err = send_ioctl(ctx, &eval); if (err) perror("Cannot get device generic segmentation offload settings"); else { @@ -2396,8 +2373,7 @@ static int do_goffload(int fd, struct ifreq *ifr) } eval.cmd = ETHTOOL_GFLAGS; - ifr->ifr_data = (caddr_t)&eval; - err = ioctl(fd, SIOCETHTOOL, ifr); + err = send_ioctl(ctx, &eval); if (err) { perror("Cannot get device flags"); } else { @@ -2410,8 +2386,7 @@ static int do_goffload(int fd, struct ifreq *ifr) } eval.cmd = ETHTOOL_GGRO; - ifr->ifr_data = (caddr_t)&eval; - err = ioctl(fd, SIOCETHTOOL, ifr); + err = send_ioctl(ctx, &eval); if (err) perror("Cannot get device GRO settings"); else { @@ -2428,7 +2403,7 @@ static int do_goffload(int fd, struct ifreq *ifr) ntuple, rxhash); } -static int do_soffload(int fd, struct ifreq *ifr) +static int do_soffload(struct cmd_context *ctx) { struct ethtool_value eval; int err, changed = 0; @@ -2437,8 +2412,7 @@ static int do_soffload(int fd, struct ifreq *ifr) changed = 1; eval.cmd = ETHTOOL_SRXCSUM; eval.data = (off_csum_rx_wanted == 1); - ifr->ifr_data = (caddr_t)&eval; - err = send_ioctl(fd, ifr); + err = send_ioctl(ctx, &eval); if (err) { perror("Cannot set device rx csum settings"); return 84; @@ -2449,8 +2423,7 @@ static int do_soffload(int fd, struct ifreq *ifr) changed = 1; eval.cmd = ETHTOOL_STXCSUM; eval.data = (off_csum_tx_wanted == 1); - ifr->ifr_data = (caddr_t)&eval; - err = send_ioctl(fd, ifr); + err = send_ioctl(ctx, &eval); if (err) { perror("Cannot set device tx csum settings"); return 85; @@ -2461,8 +2434,7 @@ static int do_soffload(int fd, struct ifreq *ifr) changed = 1; eval.cmd = ETHTOOL_SSG; eval.data = (off_sg_wanted == 1); - ifr->ifr_data = (caddr_t)&eval; - err = send_ioctl(fd, ifr); + err = send_ioctl(ctx, &eval); if (err) { perror("Cannot set device scatter-gather settings"); return 86; @@ -2473,8 +2445,7 @@ static int do_soffload(int fd, struct ifreq *ifr) changed = 1; eval.cmd = ETHTOOL_STSO; eval.data = (off_tso_wanted == 1); - ifr->ifr_data = (caddr_t)&eval; - err = send_ioctl(fd, ifr); + err = send_ioctl(ctx, &eval); if (err) { perror("Cannot set device tcp segmentation offload settings"); return 88; @@ -2484,8 +2455,7 @@ static int do_soffload(int fd, struct ifreq *ifr) changed = 1; eval.cmd = ETHTOOL_SUFO; eval.data = (off_ufo_wanted == 1); - ifr->ifr_data = (caddr_t)&eval; - err = ioctl(fd, SIOCETHTOOL, ifr); + err = send_ioctl(ctx, &eval); if (err) { perror("Cannot set device udp large send offload settings"); return 89; @@ -2495,8 +2465,7 @@ static int do_soffload(int fd, struct ifreq *ifr) changed = 1; eval.cmd = ETHTOOL_SGSO; eval.data = (off_gso_wanted == 1); - ifr->ifr_data = (caddr_t)&eval; - err = ioctl(fd, SIOCETHTOOL, ifr); + err = send_ioctl(ctx, &eval); if (err) { perror("Cannot set device generic segmentation offload settings"); return 90; @@ -2506,8 +2475,7 @@ static int do_soffload(int fd, struct ifreq *ifr) changed = 1; eval.cmd = ETHTOOL_GFLAGS; eval.data = 0; - ifr->ifr_data = (caddr_t)&eval; - err = ioctl(fd, SIOCETHTOOL, ifr); + err = send_ioctl(ctx, &eval); if (err) { perror("Cannot get device flag settings"); return 91; @@ -2517,7 +2485,7 @@ static int do_soffload(int fd, struct ifreq *ifr) eval.data = ((eval.data & ~off_flags_mask) | off_flags_wanted); - err = ioctl(fd, SIOCETHTOOL, ifr); + err = send_ioctl(ctx, &eval); if (err) { perror("Cannot set device flag settings"); return 92; @@ -2527,8 +2495,7 @@ static int do_soffload(int fd, struct ifreq *ifr) changed = 1; eval.cmd = ETHTOOL_SGRO; eval.data = (off_gro_wanted == 1); - ifr->ifr_data = (caddr_t)&eval; - err = ioctl(fd, SIOCETHTOOL, ifr); + err = send_ioctl(ctx, &eval); if (err) { perror("Cannot set device GRO settings"); return 93; @@ -2542,7 +2509,7 @@ static int do_soffload(int fd, struct ifreq *ifr) return 0; } -static int do_gset(int fd, struct ifreq *ifr) +static int do_gset(struct cmd_context *ctx) { int err; struct ethtool_cmd ecmd; @@ -2553,8 +2520,7 @@ static int do_gset(int fd, struct ifreq *ifr) fprintf(stdout, "Settings for %s:\n", devname); ecmd.cmd = ETHTOOL_GSET; - ifr->ifr_data = (caddr_t)&ecmd; - err = send_ioctl(fd, ifr); + err = send_ioctl(ctx, &ecmd); if (err == 0) { err = dump_ecmd(&ecmd); if (err) @@ -2565,8 +2531,7 @@ static int do_gset(int fd, struct ifreq *ifr) } wolinfo.cmd = ETHTOOL_GWOL; - ifr->ifr_data = (caddr_t)&wolinfo; - err = send_ioctl(fd, ifr); + err = send_ioctl(ctx, &wolinfo); if (err == 0) { err = dump_wol(&wolinfo); if (err) @@ -2577,8 +2542,7 @@ static int do_gset(int fd, struct ifreq *ifr) } edata.cmd = ETHTOOL_GMSGLVL; - ifr->ifr_data = (caddr_t)&edata; - err = send_ioctl(fd, ifr); + err = send_ioctl(ctx, &edata); if (err == 0) { fprintf(stdout, " Current message level: 0x%08x (%d)\n" " ", @@ -2592,8 +2556,7 @@ static int do_gset(int fd, struct ifreq *ifr) } edata.cmd = ETHTOOL_GLINK; - ifr->ifr_data = (caddr_t)&edata; - err = send_ioctl(fd, ifr); + err = send_ioctl(ctx, &edata); if (err == 0) { fprintf(stdout, " Link detected: %s\n", edata.data ? "yes":"no"); @@ -2609,7 +2572,7 @@ static int do_gset(int fd, struct ifreq *ifr) return 0; } -static int do_sset(int fd, struct ifreq *ifr) +static int do_sset(struct cmd_context *ctx) { int err; @@ -2617,8 +2580,7 @@ static int do_sset(int fd, struct ifreq *ifr) struct ethtool_cmd ecmd; ecmd.cmd = ETHTOOL_GSET; - ifr->ifr_data = (caddr_t)&ecmd; - err = send_ioctl(fd, ifr); + err = send_ioctl(ctx, &ecmd); if (err < 0) { perror("Cannot get current device settings"); } else { @@ -2671,8 +2633,7 @@ static int do_sset(int fd, struct ifreq *ifr) /* Try to perform the update. */ ecmd.cmd = ETHTOOL_SSET; - ifr->ifr_data = (caddr_t)&ecmd; - err = send_ioctl(fd, ifr); + err = send_ioctl(ctx, &ecmd); if (err < 0) perror("Cannot set new settings"); } @@ -2696,8 +2657,7 @@ static int do_sset(int fd, struct ifreq *ifr) struct ethtool_wolinfo wol; wol.cmd = ETHTOOL_GWOL; - ifr->ifr_data = (caddr_t)&wol; - err = send_ioctl(fd, ifr); + err = send_ioctl(ctx, &wol); if (err < 0) { perror("Cannot get current wake-on-lan settings"); } else { @@ -2714,8 +2674,7 @@ static int do_sset(int fd, struct ifreq *ifr) /* Try to perform the update. */ wol.cmd = ETHTOOL_SWOL; - ifr->ifr_data = (caddr_t)&wol; - err = send_ioctl(fd, ifr); + err = send_ioctl(ctx, &wol); if (err < 0) perror("Cannot set new wake-on-lan settings"); } @@ -2731,16 +2690,14 @@ static int do_sset(int fd, struct ifreq *ifr) struct ethtool_value edata; edata.cmd = ETHTOOL_GMSGLVL; - ifr->ifr_data = (caddr_t)&edata; - err = send_ioctl(fd, ifr); + err = send_ioctl(ctx, &edata); if (err < 0) { perror("Cannot get msglvl"); } else { edata.cmd = ETHTOOL_SMSGLVL; edata.data = ((edata.data & ~msglvl_mask) | msglvl_wanted); - ifr->ifr_data = (caddr_t)&edata; - err = send_ioctl(fd, ifr); + err = send_ioctl(ctx, &edata); if (err < 0) perror("Cannot set new msglvl"); } @@ -2749,15 +2706,14 @@ static int do_sset(int fd, struct ifreq *ifr) return 0; } -static int do_gregs(int fd, struct ifreq *ifr) +static int do_gregs(struct cmd_context *ctx) { int err; struct ethtool_drvinfo drvinfo; struct ethtool_regs *regs; drvinfo.cmd = ETHTOOL_GDRVINFO; - ifr->ifr_data = (caddr_t)&drvinfo; - err = send_ioctl(fd, ifr); + err = send_ioctl(ctx, &drvinfo); if (err < 0) { perror("Cannot get driver information"); return 72; @@ -2770,8 +2726,7 @@ static int do_gregs(int fd, struct ifreq *ifr) } regs->cmd = ETHTOOL_GREGS; regs->len = drvinfo.regdump_len; - ifr->ifr_data = (caddr_t)regs; - err = send_ioctl(fd, ifr); + err = send_ioctl(ctx, regs); if (err < 0) { perror("Cannot get register dump"); free(regs); @@ -2787,29 +2742,27 @@ static int do_gregs(int fd, struct ifreq *ifr) return 0; } -static int do_nway_rst(int fd, struct ifreq *ifr) +static int do_nway_rst(struct cmd_context *ctx) { struct ethtool_value edata; int err; edata.cmd = ETHTOOL_NWAY_RST; - ifr->ifr_data = (caddr_t)&edata; - err = send_ioctl(fd, ifr); + err = send_ioctl(ctx, &edata); if (err < 0) perror("Cannot restart autonegotiation"); return err; } -static int do_geeprom(int fd, struct ifreq *ifr) +static int do_geeprom(struct cmd_context *ctx) { int err; struct ethtool_drvinfo drvinfo; struct ethtool_eeprom *eeprom; drvinfo.cmd = ETHTOOL_GDRVINFO; - ifr->ifr_data = (caddr_t)&drvinfo; - err = send_ioctl(fd, ifr); + err = send_ioctl(ctx, &drvinfo); if (err < 0) { perror("Cannot get driver information"); return 74; @@ -2829,8 +2782,7 @@ static int do_geeprom(int fd, struct ifreq *ifr) eeprom->cmd = ETHTOOL_GEEPROM; eeprom->len = geeprom_length; eeprom->offset = geeprom_offset; - ifr->ifr_data = (caddr_t)eeprom; - err = send_ioctl(fd, ifr); + err = send_ioctl(ctx, eeprom); if (err < 0) { perror("Cannot get EEPROM data"); free(eeprom); @@ -2842,15 +2794,14 @@ static int do_geeprom(int fd, struct ifreq *ifr) return err; } -static int do_seeprom(int fd, struct ifreq *ifr) +static int do_seeprom(struct cmd_context *ctx) { int err; struct ethtool_drvinfo drvinfo; struct ethtool_eeprom *eeprom; drvinfo.cmd = ETHTOOL_GDRVINFO; - ifr->ifr_data = (caddr_t)&drvinfo; - err = send_ioctl(fd, ifr); + err = send_ioctl(ctx, &drvinfo); if (err < 0) { perror("Cannot get driver information"); return 74; @@ -2881,8 +2832,7 @@ static int do_seeprom(int fd, struct ifreq *ifr) if (!seeprom_value_seen) eeprom->len = fread(eeprom->data, 1, eeprom->len, stdin); - ifr->ifr_data = (caddr_t)eeprom; - err = send_ioctl(fd, ifr); + err = send_ioctl(ctx, eeprom); if (err < 0) { perror("Cannot set EEPROM data"); err = 87; @@ -2892,7 +2842,7 @@ static int do_seeprom(int fd, struct ifreq *ifr) return err; } -static int do_test(int fd, struct ifreq *ifr) +static int do_test(struct cmd_context *ctx) { int err; struct ethtool_drvinfo drvinfo; @@ -2900,8 +2850,7 @@ static int do_test(int fd, struct ifreq *ifr) struct ethtool_gstrings *strings; drvinfo.cmd = ETHTOOL_GDRVINFO; - ifr->ifr_data = (caddr_t)&drvinfo; - err = send_ioctl(fd, ifr); + err = send_ioctl(ctx, &drvinfo); if (err < 0) { perror("Cannot get driver information"); return 72; @@ -2921,8 +2870,7 @@ static int do_test(int fd, struct ifreq *ifr) test->flags = ETH_TEST_FL_OFFLINE; else test->flags = 0; - ifr->ifr_data = (caddr_t)test; - err = send_ioctl(fd, ifr); + err = send_ioctl(ctx, test); if (err < 0) { perror("Cannot test"); free (test); @@ -2940,8 +2888,7 @@ static int do_test(int fd, struct ifreq *ifr) strings->cmd = ETHTOOL_GSTRINGS; strings->string_set = ETH_SS_TEST; strings->len = drvinfo.testinfo_len; - ifr->ifr_data = (caddr_t)strings; - err = send_ioctl(fd, ifr); + err = send_ioctl(ctx, strings); if (err < 0) { perror("Cannot get strings"); free (test); @@ -2955,22 +2902,21 @@ static int do_test(int fd, struct ifreq *ifr) return err; } -static int do_phys_id(int fd, struct ifreq *ifr) +static int do_phys_id(struct cmd_context *ctx) { int err; struct ethtool_value edata; edata.cmd = ETHTOOL_PHYS_ID; edata.data = phys_id_time; - ifr->ifr_data = (caddr_t)&edata; - err = send_ioctl(fd, ifr); + err = send_ioctl(ctx, &edata); if (err < 0) perror("Cannot identify NIC"); return err; } -static int do_gstats(int fd, struct ifreq *ifr) +static int do_gstats(struct cmd_context *ctx) { struct ethtool_drvinfo drvinfo; struct ethtool_gstrings *strings; @@ -2979,8 +2925,7 @@ static int do_gstats(int fd, struct ifreq *ifr) int err; drvinfo.cmd = ETHTOOL_GDRVINFO; - ifr->ifr_data = (caddr_t)&drvinfo; - err = send_ioctl(fd, ifr); + err = send_ioctl(ctx, &drvinfo); if (err < 0) { perror("Cannot get driver information"); return 71; @@ -3005,8 +2950,7 @@ static int do_gstats(int fd, struct ifreq *ifr) strings->cmd = ETHTOOL_GSTRINGS; strings->string_set = ETH_SS_STATS; strings->len = n_stats; - ifr->ifr_data = (caddr_t) strings; - err = send_ioctl(fd, ifr); + err = send_ioctl(ctx, strings); if (err < 0) { perror("Cannot get stats strings information"); free(strings); @@ -3016,8 +2960,7 @@ static int do_gstats(int fd, struct ifreq *ifr) stats->cmd = ETHTOOL_GSTATS; stats->n_stats = n_stats; - ifr->ifr_data = (caddr_t) stats; - err = send_ioctl(fd, ifr); + err = send_ioctl(ctx, stats); if (err < 0) { perror("Cannot get stats information"); free(strings); @@ -3040,7 +2983,7 @@ static int do_gstats(int fd, struct ifreq *ifr) } -static int do_srxclass(int fd, struct ifreq *ifr) +static int do_srxclass(struct cmd_context *ctx) { int err; @@ -3051,8 +2994,7 @@ static int do_srxclass(int fd, struct ifreq *ifr) nfccmd.flow_type = rx_fhash_set; nfccmd.data = rx_fhash_val; - ifr->ifr_data = (caddr_t)&nfccmd; - err = ioctl(fd, SIOCETHTOOL, ifr); + err = send_ioctl(ctx, &nfccmd); if (err < 0) perror("Cannot change RX network flow hashing options"); @@ -3061,7 +3003,7 @@ static int do_srxclass(int fd, struct ifreq *ifr) return 0; } -static int do_grxclass(int fd, struct ifreq *ifr) +static int do_grxclass(struct cmd_context *ctx) { int err; @@ -3070,8 +3012,7 @@ static int do_grxclass(int fd, struct ifreq *ifr) nfccmd.cmd = ETHTOOL_GRXFH; nfccmd.flow_type = rx_fhash_get; - ifr->ifr_data = (caddr_t)&nfccmd; - err = ioctl(fd, SIOCETHTOOL, ifr); + err = send_ioctl(ctx, &nfccmd); if (err < 0) perror("Cannot get RX network flow hashing options"); else @@ -3081,7 +3022,7 @@ static int do_grxclass(int fd, struct ifreq *ifr) return 0; } -static int do_grxfhindir(int fd, struct ifreq *ifr) +static int do_grxfhindir(struct cmd_context *ctx) { struct ethtool_rxnfc ring_count; struct ethtool_rxfh_indir indir_head; @@ -3090,8 +3031,7 @@ static int do_grxfhindir(int fd, struct ifreq *ifr) int err; ring_count.cmd = ETHTOOL_GRXRINGS; - ifr->ifr_data = (caddr_t) &ring_count; - err = send_ioctl(fd, ifr); + err = send_ioctl(ctx, &ring_count); if (err < 0) { perror("Cannot get RX ring count"); return 102; @@ -3099,8 +3039,7 @@ static int do_grxfhindir(int fd, struct ifreq *ifr) indir_head.cmd = ETHTOOL_GRXFHINDIR; indir_head.size = 0; - ifr->ifr_data = (caddr_t) &indir_head; - err = send_ioctl(fd, ifr); + err = send_ioctl(ctx, &indir_head); if (err < 0) { perror("Cannot get RX flow hash indirection table size"); return 103; @@ -3110,8 +3049,7 @@ static int do_grxfhindir(int fd, struct ifreq *ifr) indir_head.size * sizeof(*indir->ring_index)); indir->cmd = ETHTOOL_GRXFHINDIR; indir->size = indir_head.size; - ifr->ifr_data = (caddr_t) indir; - err = send_ioctl(fd, ifr); + err = send_ioctl(ctx, indir); if (err < 0) { perror("Cannot get RX flow hash indirection table"); return 103; @@ -3129,7 +3067,7 @@ static int do_grxfhindir(int fd, struct ifreq *ifr) return 0; } -static int do_srxfhindir(int fd, struct ifreq *ifr) +static int do_srxfhindir(struct cmd_context *ctx) { struct ethtool_rxfh_indir indir_head; struct ethtool_rxfh_indir *indir; @@ -3141,8 +3079,7 @@ static int do_srxfhindir(int fd, struct ifreq *ifr) indir_head.cmd = ETHTOOL_GRXFHINDIR; indir_head.size = 0; - ifr->ifr_data = (caddr_t) &indir_head; - err = send_ioctl(fd, ifr); + err = send_ioctl(ctx, &indir_head); if (err < 0) { perror("Cannot get RX flow hash indirection table size"); return 104; @@ -3188,8 +3125,7 @@ static int do_srxfhindir(int fd, struct ifreq *ifr) } } - ifr->ifr_data = (caddr_t) indir; - err = send_ioctl(fd, ifr); + err = send_ioctl(ctx, indir); if (err < 0) { perror("Cannot set RX flow hash indirection table"); return 105; @@ -3198,7 +3134,7 @@ static int do_srxfhindir(int fd, struct ifreq *ifr) return 0; } -static int do_flash(int fd, struct ifreq *ifr) +static int do_flash(struct cmd_context *ctx) { struct ethtool_flash efl; int err; @@ -3222,15 +3158,14 @@ static int do_flash(int fd, struct ifreq *ifr) else efl.region = flash_region; - ifr->ifr_data = (caddr_t)&efl; - err = send_ioctl(fd, ifr); + err = send_ioctl(ctx, &efl); if (err < 0) perror("Flashing failed"); return err; } -static int do_permaddr(int fd, struct ifreq *ifr) +static int do_permaddr(struct cmd_context *ctx) { int i, err; struct ethtool_perm_addr *epaddr; @@ -3238,9 +3173,8 @@ static int do_permaddr(int fd, struct ifreq *ifr) epaddr = malloc(sizeof(struct ethtool_perm_addr) + MAX_ADDR_LEN); epaddr->cmd = ETHTOOL_GPERMADDR; epaddr->size = MAX_ADDR_LEN; - ifr->ifr_data = (caddr_t)epaddr; - err = send_ioctl(fd, ifr); + err = send_ioctl(ctx, epaddr); if (err < 0) perror("Cannot read permanent address"); else { @@ -3332,7 +3266,7 @@ static int flow_spec_to_ntuple(struct ethtool_rx_flow_spec *fsp, return 0; } -static int do_srxntuple(int fd, struct ifreq *ifr) +static int do_srxntuple(struct cmd_context *ctx) { struct ethtool_rx_ntuple ntuplecmd; struct ethtool_value eval; @@ -3349,15 +3283,13 @@ static int do_srxntuple(int fd, struct ifreq *ifr) * flag not being set on the device */ eval.cmd = ETHTOOL_GFLAGS; - ifr->ifr_data = (caddr_t)&eval; - err = ioctl(fd, SIOCETHTOOL, ifr); + err = send_ioctl(ctx, &eval); if (err || !(eval.data & ETH_FLAG_NTUPLE)) return -1; /* send rule via N-tuple */ ntuplecmd.cmd = ETHTOOL_SRXNTUPLE; - ifr->ifr_data = (caddr_t)&ntuplecmd; - err = ioctl(fd, SIOCETHTOOL, ifr); + err = send_ioctl(ctx, &ntuplecmd); /* * Display error only if reponse is something other than op not @@ -3373,25 +3305,25 @@ static int do_srxntuple(int fd, struct ifreq *ifr) return 0; } -static int do_srxclsrule(int fd, struct ifreq *ifr) +static int do_srxclsrule(struct cmd_context *ctx) { int err; if (rx_class_rule_added) { /* attempt to add rule via N-tuple specifier */ - err = do_srxntuple(fd, ifr); + err = do_srxntuple(ctx); if (!err) return 0; /* attempt to add rule via network flow classifier */ - err = rxclass_rule_ins(fd, ifr, &rx_rule_fs); + err = rxclass_rule_ins(ctx, &rx_rule_fs); if (err < 0) { fprintf(stderr, "Cannot insert" " classification rule\n"); return 1; } } else if (rx_class_rule_del >= 0) { - err = rxclass_rule_del(fd, ifr, rx_class_rule_del); + err = rxclass_rule_del(ctx, rx_class_rule_del); if (err < 0) { fprintf(stderr, "Cannot delete" @@ -3405,28 +3337,27 @@ static int do_srxclsrule(int fd, struct ifreq *ifr) return 0; } -static int do_grxclsrule(int fd, struct ifreq *ifr) +static int do_grxclsrule(struct cmd_context *ctx) { struct ethtool_rxnfc nfccmd; int err; if (rx_class_rule_get >= 0) { - err = rxclass_rule_get(fd, ifr, rx_class_rule_get); + err = rxclass_rule_get(ctx, rx_class_rule_get); if (err < 0) fprintf(stderr, "Cannot get RX classification rule\n"); return err ? 1 : 0; } nfccmd.cmd = ETHTOOL_GRXRINGS; - ifr->ifr_data = (caddr_t)&nfccmd; - err = ioctl(fd, SIOCETHTOOL, ifr); + err = send_ioctl(ctx, &nfccmd); if (err < 0) perror("Cannot get RX rings"); else fprintf(stdout, "%d RX rings available\n", (int)nfccmd.data); - err = rxclass_rule_getall(fd, ifr); + err = rxclass_rule_getall(ctx); if (err < 0) fprintf(stderr, "RX classification rule retrieval failed\n"); @@ -3459,7 +3390,7 @@ static int do_writefwdump(struct ethtool_dump *dump) return err; } -static int do_getfwdump(int fd, struct ifreq *ifr) +static int do_getfwdump(struct cmd_context *ctx) { int err; struct ethtool_dump edata; @@ -3467,8 +3398,7 @@ static int do_getfwdump(int fd, struct ifreq *ifr) edata.cmd = ETHTOOL_GET_DUMP_FLAG; - ifr->ifr_data = (caddr_t) &edata; - err = send_ioctl(fd, ifr); + err = send_ioctl(ctx, &edata); if (err < 0) { perror("Can not get dump level\n"); return 1; @@ -3485,8 +3415,7 @@ static int do_getfwdump(int fd, struct ifreq *ifr) } data->cmd = ETHTOOL_GET_DUMP_DATA; data->len = edata.len; - ifr->ifr_data = (caddr_t) data; - err = send_ioctl(fd, ifr); + err = send_ioctl(ctx, data); if (err < 0) { perror("Can not get dump data\n"); err = 1; @@ -3498,15 +3427,14 @@ free: return err; } -static int do_setfwdump(int fd, struct ifreq *ifr) +static int do_setfwdump(struct cmd_context *ctx) { int err; struct ethtool_dump dump; dump.cmd = ETHTOOL_SET_DUMP; dump.flag = dump_flag; - ifr->ifr_data = (caddr_t)&dump; - err = send_ioctl(fd, ifr); + err = send_ioctl(ctx, &dump); if (err < 0) { perror("Can not set dump level\n"); return 1; @@ -3514,9 +3442,10 @@ static int do_setfwdump(int fd, struct ifreq *ifr) return 0; } -static int send_ioctl(int fd, struct ifreq *ifr) +int send_ioctl(struct cmd_context *ctx, void *cmd) { - return ioctl(fd, SIOCETHTOOL, ifr); + ctx->ifr.ifr_data = cmd; + return ioctl(ctx->fd, SIOCETHTOOL, &ctx->ifr); } int main(int argc, char **argp, char **envp) -- cgit v1.2.1