From patchwork Mon Dec 9 06:31:56 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Stefan Raspl X-Patchwork-Id: 300576 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 9DF3F2C00AC for ; Thu, 12 Dec 2013 19:33:21 +1100 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752063Ab3LLIdS (ORCPT ); Thu, 12 Dec 2013 03:33:18 -0500 Received: from e06smtp17.uk.ibm.com ([195.75.94.113]:52461 "EHLO e06smtp17.uk.ibm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751458Ab3LLIdL (ORCPT ); Thu, 12 Dec 2013 03:33:11 -0500 Received: from /spool/local by e06smtp17.uk.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Thu, 12 Dec 2013 08:33:07 -0000 Received: from d06dlp02.portsmouth.uk.ibm.com (9.149.20.14) by e06smtp17.uk.ibm.com (192.168.101.147) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Thu, 12 Dec 2013 08:33:06 -0000 Received: from b06cxnps4075.portsmouth.uk.ibm.com (d06relay12.portsmouth.uk.ibm.com [9.149.109.197]) by d06dlp02.portsmouth.uk.ibm.com (Postfix) with ESMTP id 3C9CE219006B; Thu, 12 Dec 2013 08:33:05 +0000 (GMT) Received: from d06av10.portsmouth.uk.ibm.com (d06av10.portsmouth.uk.ibm.com [9.149.37.251]) by b06cxnps4075.portsmouth.uk.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id rBC8WrES65994918; Thu, 12 Dec 2013 08:32:53 GMT Received: from d06av10.portsmouth.uk.ibm.com (localhost [127.0.0.1]) by d06av10.portsmouth.uk.ibm.com (8.14.4/8.14.4/NCO v10.0 AVout) with ESMTP id rBC8X4Zc010097; Thu, 12 Dec 2013 01:33:05 -0700 Received: from tuxmaker.boeblingen.de.ibm.com (tuxmaker.boeblingen.de.ibm.com [9.152.85.9]) by d06av10.portsmouth.uk.ibm.com (8.14.4/8.14.4/NCO v10.0 AVin) with ESMTP id rBC8X4pr010070; Thu, 12 Dec 2013 01:33:04 -0700 Received: by tuxmaker.boeblingen.de.ibm.com (Postfix, from userid 2177) id 977C3122444C; Mon, 9 Dec 2013 07:33:12 +0100 (CET) Message-Id: <20131209063312.520666849@linux.vnet.ibm.com> User-Agent: quilt/0.60-1 Date: Mon, 09 Dec 2013 07:31:56 +0100 From: raspl@linux.vnet.ibm.com To: bhutchings@solarflare.com Cc: davem@davemloft.net, blaschka@linux.vnet.ibm.com, netdev@vger.kernel.org, linux-s390@vger.kernel.org Subject: [PATCH ethtool 2/3] ethtool: Add option -q to display adjacent switch ports attributes References: <20131209063154.508075549@linux.vnet.ibm.com> Content-Disposition: inline; filename=ethtool_add_new_option-q.patch X-TM-AS-MML: disable X-Content-Scanned: Fidelis XPS MAILER x-cbid: 13121208-0542-0000-0000-00000760674D Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Add new option '-q|--query-switch-port' to display information on the adjacent switch port's settings as perceived by the respective NIC. In the output, - unsupported attributes are indicated as such ('unsupported'), - supported but disabled attributes display 'no', and - enabled attributes display 'yes'. Attributes supported by this patch are - forwarding modes: standard (802.1) and reflective relay (RR) aka hairpin - edge virtual bridging (EVB) related capabilities: edge control protocol (ECP), VSI discovery and configuration protocol (VDP), and retransmission timer exponent (RTE). Signed-off-by: Stefan Raspl --- ethtool-copy.h | 35 +++++++++++++++++++++++++++++ ethtool.8 | 6 +++++ ethtool.c | 68 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 109 insertions(+) -- 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 --- a/ethtool-copy.h +++ b/ethtool-copy.h @@ -348,6 +348,22 @@ struct ethtool_pauseparam { __u32 tx_pause; }; +/** + * struct ethtool_swport_attrs - query adjacent switch port attributes + * @cmd: ETHTOOL_GPORT + * @port_rc: Use GPORT_RC_* as appropriate. + * @supported: Forwarding modes and capabilities supported by the switch port, + * see SUPPORTED_SP_* flags. + * @enabled: Forwarding modes and capabilities currently activated at the + * adjacent switch port, see ENABLED_SP_* flags. + */ +struct ethtool_swport_attrs { + __u32 cmd; + __u32 port_rc; + __u32 supported; + __u32 enabled; +}; + #define ETH_GSTRING_LEN 32 enum ethtool_stringset { ETH_SS_TEST = 0, @@ -900,6 +916,7 @@ enum ethtool_sfeatures_retval_bits { #define ETHTOOL_GMODULEEEPROM 0x00000043 /* Get plug-in module eeprom */ #define ETHTOOL_GEEE 0x00000044 /* Get EEE settings */ #define ETHTOOL_SEEE 0x00000045 /* Set EEE settings */ +#define ETHTOOL_GPORT 0x00000046 /* Get switch port attributes */ /* compatibility with older code */ #define SPARC_ETH_GSET ETHTOOL_GSET @@ -1067,6 +1084,24 @@ enum ethtool_sfeatures_retval_bits { #define ETH_MODULE_SFF_8472 0x2 #define ETH_MODULE_SFF_8472_LEN 512 +/* Bad return codes for switch ports */ +#define GPORT_RC_LLDP_UNSUP 1 /* switch port doesn't support */ + /* required LLDP EVB TLV */ + +/* Indicates what features the adjacent switch port supports. */ +#define SUPPORTED_SP_FWD_802_1 (1 << 0) +#define SUPPORTED_SP_FWD_RR (1 << 1) +#define SUPPORTED_SP_CAP_RTE (1 << 9) +#define SUPPORTED_SP_CAP_ECP (1 << 10) +#define SUPPORTED_SP_CAP_VDP (1 << 11) + +/* Indicates what features the adjacent switch port has enabled. */ +#define ENABLED_SP_FWD_802_1 (1 << 0) +#define ENABLED_SP_FWD_RR (1 << 1) +#define ENABLED_SP_CAP_RTE (1 << 9) +#define ENABLED_SP_CAP_ECP (1 << 10) +#define ENABLED_SP_CAP_VDP (1 << 11) + /* Reset flags */ /* The reset() operation must clear the flags for the components which * were actually reset. On successful return, the flags indicate the --- a/ethtool.8 +++ b/ethtool.8 @@ -214,6 +214,9 @@ ethtool \- query or control network driv .B ethtool \-P|\-\-show\-permaddr .I devname .HP +.B ethtool \-q|\-\-query-switch-port +.I devname +.HP .B ethtool \-r|\-\-negotiate .I devname .HP @@ -485,6 +488,9 @@ Length of time to perform phys-id, in se .B \-P \-\-show\-permaddr Queries the specified network device for permanent hardware address. .TP +.B \-q \-\-query-switch-port +Queries the specified Ethernet device for adjacent switch port's attributes. +.TP .B \-r \-\-negotiate Restarts auto-negotiation on the specified Ethernet device, if auto-negotiation is enabled. --- a/ethtool.c +++ b/ethtool.c @@ -714,6 +714,54 @@ static int dump_drvinfo(struct ethtool_d return 0; } +static const char *port_setting(struct ethtool_swport_attrs *attrs, + u32 supported, u32 enabled) +{ + char *rc = "unsupported"; + + if (supported & attrs->supported) { + if (enabled & attrs->enabled) + rc = "yes"; + else + rc = "no"; + } + + return rc; +} + +static int dump_switch_port_attrs(const char *devname, + struct ethtool_swport_attrs *attrs) +{ + static const struct { + const char *name; + int type; /* 0=forwarding, 1=capability */ + u32 supported; + u32 enabled; + } port_defs[] = { + { "802.1", 0, SUPPORTED_SP_FWD_802_1, ENABLED_SP_FWD_802_1 }, + { "RR", 0, SUPPORTED_SP_FWD_RR, ENABLED_SP_FWD_RR }, + { "RTE", 1, SUPPORTED_SP_CAP_RTE, ENABLED_SP_CAP_RTE }, + { "ECP", 1, SUPPORTED_SP_CAP_ECP, ENABLED_SP_CAP_ECP }, + { "VDP", 1, SUPPORTED_SP_CAP_VDP, ENABLED_SP_CAP_VDP }, + }; + int i; + + if (attrs->port_rc == GPORT_RC_LLDP_UNSUP) { + fprintf(stderr, "Required LLDP EVB TLV not supported by " + "adjacent switch\n"); + return 1; + } + fprintf(stdout, "Adjacent switch port attributes of %s:\n", + devname); + for (i = 0; i < ARRAY_SIZE(port_defs); i++) + fprintf(stdout, "%s %s: %s\n", port_defs[i].name, + (port_defs[i].type ? "capability" : "forwarding"), + port_setting(attrs, port_defs[i].supported, + port_defs[i].enabled)); + + return 0; +} + static int parse_wolopts(char *optstr, u32 *data) { *data = 0; @@ -2863,6 +2911,24 @@ static int do_phys_id(struct cmd_context return err; } +static int do_switch_port(struct cmd_context *ctx) +{ + struct ethtool_swport_attrs attrs; + int err; + + if (ctx->argc != 0) + exit_bad_args(); + + attrs.cmd = ETHTOOL_GPORT; + err = send_ioctl(ctx, &attrs); + if (err < 0) { + perror("Cannot get driver information"); + return 1; + } + + return dump_switch_port_attrs(ctx->devname, &attrs); +} + static int do_gstats(struct cmd_context *ctx) { struct ethtool_gstrings *strings; @@ -3799,6 +3865,8 @@ static const struct option { { "-p|--identify", 1, do_phys_id, "Show visible port identification (e.g. blinking)", " [ TIME-IN-SECONDS ]\n" }, + { "-q|--query-switch-port", 1, do_switch_port, "Query adjacent " + "switch port attributes" }, { "-t|--test", 1, do_test, "Execute adapter self test", " [ online | offline | external_lb ]\n" }, { "-S|--statistics", 1, do_gstats, "Show adapter statistics" },