Message ID | AANLkTi=GygGKnuSZmWecmGejDjzLx2uaHuk+DroVfHDy@mail.gmail.com |
---|---|
State | Not Applicable, archived |
Delegated to: | David Miller |
Headers | show |
On Thu, Dec 02, 2010 at 02:35:51PM -0800, Mahesh Bandewar wrote: > This patch adds -L command-line option to switch loopback mode on/off > and -l option to display current loopback mode on a specified interface. [...] > +.A1 on off > +Switches loopback mode > +.B on > +or > +.B off What about devices that support different kinds of loopback, like MAC loopback & PHY loopback? (No idea if we have kernel support for this either...) -David -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On Fri, 2010-12-03 at 17:03 +0100, David Lamparter wrote: > On Thu, Dec 02, 2010 at 02:35:51PM -0800, Mahesh Bandewar wrote: > > This patch adds -L command-line option to switch loopback mode on/off > > and -l option to display current loopback mode on a specified interface. > [...] > > +.A1 on off > > +Switches loopback mode > > +.B on > > +or > > +.B off > > What about devices that support different kinds of loopback, like MAC > loopback & PHY loopback? (No idea if we have kernel support for this > either...) That distinction is useful for diagnostic purposes, but drivers can already cover those different loopback modes in self-test. The motivation for this feature is testing data path behaviour, and Mahesh has specified that loopback should be enabled as near as possible to the host. Ben.
On Fri, Dec 03, 2010 at 04:33:34PM +0000, Ben Hutchings wrote: > On Fri, 2010-12-03 at 17:03 +0100, David Lamparter wrote: > > On Thu, Dec 02, 2010 at 02:35:51PM -0800, Mahesh Bandewar wrote: > > > This patch adds -L command-line option to switch loopback mode on/off > > > and -l option to display current loopback mode on a specified interface. > > [...] > > > +.A1 on off > > > +Switches loopback mode > > > +.B on > > > +or > > > +.B off > > > > What about devices that support different kinds of loopback, like MAC > > loopback & PHY loopback? (No idea if we have kernel support for this > > either...) > > That distinction is useful for diagnostic purposes, but drivers can > already cover those different loopback modes in self-test. The > motivation for this feature is testing data path behaviour, and Mahesh > has specified that loopback should be enabled as near as possible to the > host. Ah, good enough. Thanks. -David -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On Fri, 3 Dec 2010, David Lamparter wrote: > On Fri, Dec 03, 2010 at 04:33:34PM +0000, Ben Hutchings wrote: > > On Fri, 2010-12-03 at 17:03 +0100, David Lamparter wrote: > > > On Thu, Dec 02, 2010 at 02:35:51PM -0800, Mahesh Bandewar wrote: > > > > This patch adds -L command-line option to switch loopback mode on/off > > > > and -l option to display current loopback mode on a specified interface. > > > [...] > > > > +.A1 on off > > > > +Switches loopback mode > > > > +.B on > > > > +or > > > > +.B off > > > > > > What about devices that support different kinds of loopback, like MAC > > > loopback & PHY loopback? (No idea if we have kernel support for this > > > either...) > > > > That distinction is useful for diagnostic purposes, but drivers can > > already cover those different loopback modes in self-test. The > > motivation for this feature is testing data path behaviour, and Mahesh > > has specified that loopback should be enabled as near as possible to the > > host. > > Ah, good enough. Thanks. Perhaps in the future it could be extended, if desired, to something like: loopback=0 disabled loopback=1 driver loopback nearest host loopback=2 driver loopback nearest network Both types of loopback could be useful for different purposes. -Bill -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/ethtool-copy.h b/ethtool-copy.h index 75c3ae7..297a042 100644 --- a/ethtool-copy.h +++ b/ethtool-copy.h @@ -584,6 +584,8 @@ struct ethtool_flash { #define ETHTOOL_GSSET_INFO 0x00000037 /* Get string set info */ #define ETHTOOL_GRXFHINDIR 0x00000038 /* Get RX flow hash indir'n table */ #define ETHTOOL_SRXFHINDIR 0x00000039 /* Set RX flow hash indir'n table */ +#define ETHTOOL_SLOOPBACK 0x0000003a /* Enable / Disable loopback. */ +#define ETHTOOL_GLOOPBACK 0x0000003b /* Get loopback status. */ /* compatibility with older code */ #define SPARC_ETH_GSET ETHTOOL_GSET diff --git a/ethtool.8 b/ethtool.8 index 1760924..bda1fe6 100644 --- a/ethtool.8 +++ b/ethtool.8 @@ -174,6 +174,13 @@ ethtool \- Display or change ethernet card settings .B2 txvlan on off .B2 rxhash on off +.B ethtool \-l|\-\-show\-loopback +.I ethX + +.B ethtool \-L|\-\-config\-loopback +.I ethX +.B1 on off + .B ethtool \-p|\-\-identify .I ethX .RI [ N ] @@ -406,6 +413,20 @@ Specifies whether TX VLAN acceleration should be enabled .A2 rxhash on off Specifies whether receive hashing offload should be enabled .TP +.B \-l \-\-show\-loopback +Queries the specified ethernet device for loopback mode settings. +.TP +.B \-L \-\-config\-loopback +Configures loopback mode on the specified ethernet device. Possible values +are: +.TP +.A1 on off +Switches loopback mode +.B on +or +.B off +for the speficied ethernet device. +.TP .B \-p \-\-identify Initiates adapter-specific action intended to enable an operator to easily identify the adapter by sight. Typically this involves diff --git a/ethtool.c b/ethtool.c index 239912b..b3bf4dd 100644 --- a/ethtool.c +++ b/ethtool.c @@ -114,6 +114,8 @@ static int do_srxntuple(int fd, struct ifreq *ifr); static int do_grxntuple(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_sloopback(int fd, struct ifreq *ifr); +static int do_gloopback(int fd, struct ifreq *ifr); static int send_ioctl(int fd, struct ifreq *ifr); @@ -145,6 +147,8 @@ static enum { MODE_GNTUPLE, MODE_FLASHDEV, MODE_PERMADDR, + MODE_SLOOPBACK, + MODE_GLOOPBACK, } mode = MODE_GSET; static struct option { @@ -266,6 +270,9 @@ static struct option { "Get Rx ntuple filters and actions\n" }, { "-P", "--show-permaddr", MODE_PERMADDR, "Show permanent hardware address" }, + { "-L", "--config-loopback", MODE_SLOOPBACK, "{En|Dis}able device loopback" + " [ on|off ]\n"}, + { "-l", "--show-loopback", MODE_GLOOPBACK, "Show device loopback mode",}, { "-h", "--help", MODE_HELP, "Show this help" }, {} }; @@ -407,6 +414,8 @@ static char *flash_file = NULL; static int flash = -1; static int flash_region = -1; +static int loopback_enable = 0; + static int msglvl_changed; static u32 msglvl_wanted = 0; static u32 msglvl_mask = 0; @@ -841,6 +850,8 @@ static void parse_cmdline(int argc, char **argp) (mode == MODE_GNTUPLE) || (mode == MODE_PHYS_ID) || (mode == MODE_FLASHDEV) || + (mode == MODE_SLOOPBACK) || + (mode == MODE_GLOOPBACK) || (mode == MODE_PERMADDR)) { devname = argp[i]; break; @@ -1009,6 +1020,16 @@ static void parse_cmdline(int argc, char **argp) } break; } + if (mode == MODE_SLOOPBACK) { + if (!strcmp(argp[i], "on")) + loopback_enable = 1; + else if (!strcmp(argp[i], "off")) + loopback_enable = 0; + else + show_usage(1); + i = argc; + break; + } if (mode != MODE_SSET) show_usage(1); if (!strcmp(argp[i], "speed")) { @@ -2019,6 +2040,10 @@ static int doit(void) return do_flash(fd, &ifr); } else if (mode == MODE_PERMADDR) { return do_permaddr(fd, &ifr); + } else if (mode == MODE_SLOOPBACK) { + return do_sloopback(fd, &ifr); + } else if (mode == MODE_GLOOPBACK) { + return do_gloopback(fd, &ifr); } return 69; @@ -3201,6 +3226,45 @@ static int do_grxntuple(int fd, struct ifreq *ifr) return 0; } +static int do_sloopback(int fd, struct ifreq *ifr) +{ + int err; + struct ethtool_value edata; + + edata.cmd = ETHTOOL_SLOOPBACK; + edata.data = loopback_enable; + ifr->ifr_data = (caddr_t)&edata; + + err = send_ioctl(fd, ifr); + if (err < 0) { + char error[64]; + sprintf(error, "Cannot turn %s loopback mode", + loopback_enable ? "on" : "off"); + perror(error); + return 1; + } + + return err; +} + +static int do_gloopback(int fd, struct ifreq *ifr) +{ + int err; + struct ethtool_value edata; + + edata.cmd = ETHTOOL_GLOOPBACK; + ifr->ifr_data = (caddr_t)&edata; + + err = send_ioctl(fd, ifr); + if (err < 0) { + perror("Cannot get loopback status"); + return 1; + } + printf("Loopback is turned %s\n", edata.data ? "on" : "off"); + + return err; +} + static int send_ioctl(int fd, struct ifreq *ifr) { return ioctl(fd, SIOCETHTOOL, ifr);