From 57d0c2d3281f488a0e4d58169c073928d1c44eaf1496a3d9ed51d821a809e54d Mon Sep 17 00:00:00 2001 From: Petr Uzel Date: Thu, 5 Dec 2013 14:21:06 +0000 Subject: [PATCH] - Add '-q' command line option to display switch port attributes (bnc#853637, fate#315293) - added patches: * ethtool-display-switch-port-attributes.patch OBS-URL: https://build.opensuse.org/package/show/network:utilities/ethtool?expand=0&rev=44 --- ethtool-display-switch-port-attributes.patch | 200 +++++++++++++++++++ ethtool.changes | 8 + ethtool.spec | 2 + 3 files changed, 210 insertions(+) create mode 100644 ethtool-display-switch-port-attributes.patch diff --git a/ethtool-display-switch-port-attributes.patch b/ethtool-display-switch-port-attributes.patch new file mode 100644 index 0000000..b249151 --- /dev/null +++ b/ethtool-display-switch-port-attributes.patch @@ -0,0 +1,200 @@ +ethtool: Add option '-q' to display adjacent switch port's attributes + +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(+) + +Index: ethtool-3.12.1/ethtool-copy.h +=================================================================== +--- ethtool-3.12.1.orig/ethtool-copy.h ++++ ethtool-3.12.1/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 +Index: ethtool-3.12.1/ethtool.8 +=================================================================== +--- ethtool-3.12.1.orig/ethtool.8 ++++ ethtool-3.12.1/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 +@@ -483,6 +486,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. +Index: ethtool-3.12.1/ethtool.c +=================================================================== +--- ethtool-3.12.1.orig/ethtool.c ++++ ethtool-3.12.1/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" }, diff --git a/ethtool.changes b/ethtool.changes index a8ca2fb..fec525a 100644 --- a/ethtool.changes +++ b/ethtool.changes @@ -1,3 +1,11 @@ +------------------------------------------------------------------- +Thu Dec 5 14:19:38 UTC 2013 - puzel@suse.com + +- Add '-q' command line option to display switch port attributes + (bnc#853637, fate#315293) +- added patches: + * ethtool-display-switch-port-attributes.patch + ------------------------------------------------------------------- Sun Nov 24 14:05:08 UTC 2013 - p.drouand@gmail.com diff --git a/ethtool.spec b/ethtool.spec index 0e56750..b937d99 100644 --- a/ethtool.spec +++ b/ethtool.spec @@ -27,6 +27,7 @@ Url: http://kernel.org/pub/software/network/ethtool/ #Freecode-URL: https://freecode.com/projects/ethtool Source: http://kernel.org/pub/software/network/ethtool/%{name}-%{version}.tar.xz Source2: http://kernel.org/pub/software/network/ethtool/%{name}-%{version}.tar.sign +Patch1: ethtool-display-switch-port-attributes.patch BuildRoot: %{_tmppath}/%{name}-%{version}-build BuildRequires: xz @@ -37,6 +38,7 @@ network interfaces. See the man page for more details. %prep %{?gpg_verify: xz -dk "%{S:0}"; %gpg_verify %{S:2}} %setup -q +%patch1 -p1 %build export CFLAGS="%{optflags} -W -Wall -Wstrict-prototypes -Wformat-security -Wpointer-arith"