Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package ethtool for openSUSE:Factory checked in at 2026-07-12 16:20:59 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/ethtool (Old) and /work/SRC/openSUSE:Factory/.ethtool.new.1991 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "ethtool" Sun Jul 12 16:20:59 2026 rev:91 rq:1364884 version:7.1 Changes: -------- --- /work/SRC/openSUSE:Factory/ethtool/ethtool.changes 2026-05-06 19:18:22.090249522 +0200 +++ /work/SRC/openSUSE:Factory/.ethtool.new.1991/ethtool.changes 2026-07-12 16:21:36.556923563 +0200 @@ -1,0 +2,17 @@ +Fri Jul 10 08:44:07 UTC 2026 - Jan Engelhardt <[email protected]> + +- Update to release 7.1 + * Added netlink support for RX CQE Coalescing params + * netlink: module-eeprom: Add 'hex on pages on' option for + page-organized hex dump + * netlink: fec: Add missing newlines in FEC statistics output + * ethtool: Add man page and bash completion for 'pages on|off' + * ethtool: Update pause stats struct + * ethtool: Add --disable-netlink to help output + * qsfp: add support for newer SFF-8636 compliance codes + * sfpid: add support for newer SFF-8472 compliance codes + * sfpid: fix 10G Base-ER module detection +- Delete bf023af442f63e16f1699128c7ce467eddc6d340.patch, + d35d87fbcda97fe31df79d62277743214641892a.patch (merged) + +------------------------------------------------------------------- Old: ---- bf023af442f63e16f1699128c7ce467eddc6d340.patch d35d87fbcda97fe31df79d62277743214641892a.patch ethtool-7.0.tar.sign ethtool-7.0.tar.xz New: ---- ethtool-7.1.tar.sign ethtool-7.1.tar.xz ----------(Old B)---------- Old: * sfpid: fix 10G Base-ER module detection - Delete bf023af442f63e16f1699128c7ce467eddc6d340.patch, d35d87fbcda97fe31df79d62277743214641892a.patch (merged) Old:- Delete bf023af442f63e16f1699128c7ce467eddc6d340.patch, d35d87fbcda97fe31df79d62277743214641892a.patch (merged) ----------(Old E)---------- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ ethtool.spec ++++++ --- /var/tmp/diff_new_pack.4TBl6n/_old 2026-07-12 16:21:37.132942978 +0200 +++ /var/tmp/diff_new_pack.4TBl6n/_new 2026-07-12 16:21:37.132942978 +0200 @@ -17,7 +17,7 @@ Name: ethtool -Version: 7.0 +Version: 7.1 Release: 0 Summary: Utility for examining and tuning Ethernet-based network interfaces License: GPL-2.0-only @@ -28,8 +28,6 @@ Source: https://www.kernel.org/pub/software/network/ethtool/%{name}-%{version}.tar.xz Source2: https://www.kernel.org/pub/software/network/ethtool/%{name}-%{version}.tar.sign Source3: %{name}.keyring -Patch12612562: d35d87fbcda97fe31df79d62277743214641892a.patch -Patch12612563: bf023af442f63e16f1699128c7ce467eddc6d340.patch BuildRequires: pkg-config BuildRequires: xz BuildRequires: pkgconfig(libmnl) ++++++ ethtool-7.0.tar.xz -> ethtool-7.1.tar.xz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ethtool-7.0/NEWS new/ethtool-7.1/NEWS --- old/ethtool-7.0/NEWS 2026-04-28 15:04:53.000000000 +0200 +++ new/ethtool-7.1/NEWS 2026-07-06 23:33:09.000000000 +0200 @@ -1,3 +1,15 @@ +Version 7.1 - Jul 7, 2026 + * Feature: track TX pause storm events (-I -a) + * Feature: update doc for ETHTOOL_PFC_PREVENTION_TOUT tunable + * Feature: RX CQE coalescing params (-c, -C) + * Feature: allow hex dump of all pages (-m) + * Feature: qsfp: support newer SFF-8636 compliance codes (-m) + * Feature: sfpid: support newer SFF-8636 compliance codes (-m) + * Fix: document --disable-netlink in help output (-h) + * Fix: add missing newlines in FEC output (--show-fec) + * Fix: sfpid: fix 10G Base-ER module detection (-m) + * Misc: clarify 10000baseCR link mode in man page + Version 7.0 - Apr 28, 2026 * Feature: support MSE display (--show-mse) * Feature: add 2 new link_ext_state names diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ethtool-7.0/cmis.c new/ethtool-7.1/cmis.c --- old/ethtool-7.0/cmis.c 2026-03-23 23:16:37.000000000 +0100 +++ new/ethtool-7.1/cmis.c 2026-07-06 21:43:40.000000000 +0200 @@ -1022,6 +1022,64 @@ cmis_show_all_common(&map); } +static void cmis_hex_dump(struct cmd_context *ctx, + const struct cmis_memory_map *map) +{ + struct module_eeprom_dump dump = { + .length = CMIS_PAGE_SIZE, + .i2c_address = CMIS_I2C_ADDRESS, + .print_bank = true, + }; + u8 bank, page; + + new_json_obj(ctx->json); + if (is_json_context()) { + open_json_object(NULL); + open_json_array("pages", ""); + } + + dump.data = map->lower_memory; + module_dump_eeprom_hex(&dump); + + for (bank = 0; bank < CMIS_MAX_BANKS; bank++) { + for (page = 0; page < CMIS_MAX_PAGES; page++) { + const __u8 *buf = map->upper_memory[bank][page]; + + if (!buf) + continue; + + /* Upper memory starts at one page size into + * the buffer, since pages are accessed at + * offset between page size and twice the + * page size. + */ + dump.offset = CMIS_PAGE_SIZE; + dump.page = page; + dump.bank = bank; + dump.data = buf + CMIS_PAGE_SIZE; + module_dump_eeprom_hex(&dump); + } + } + + if (is_json_context()) { + close_json_array(""); + close_json_object(); + } + delete_json_obj(); +} + +static void cmis_pretty_print(struct cmd_context *ctx, + const struct cmis_memory_map *map) +{ + new_json_obj(ctx->json); + open_json_object(NULL); + + cmis_show_all_common(map); + + close_json_object(); + delete_json_obj(); +} + static void cmis_request_init(struct ethtool_module_eeprom *request, u8 bank, u8 page, u32 offset) { @@ -1117,21 +1175,19 @@ return 0; } -int cmis_show_all_nl(struct cmd_context *ctx) +int cmis_show_all_nl(struct cmd_context *ctx, bool dump_pages) { struct cmis_memory_map map = {}; int ret; - new_json_obj(ctx->json); - open_json_object(NULL); - ret = cmis_memory_map_init_pages(ctx, &map); if (ret < 0) return ret; - cmis_show_all_common(&map); - close_json_object(); - delete_json_obj(); + if (dump_pages) + cmis_hex_dump(ctx, &map); + else + cmis_pretty_print(ctx, &map); return 0; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ethtool-7.0/cmis.h new/ethtool-7.1/cmis.h --- old/ethtool-7.0/cmis.h 2025-06-23 22:25:49.000000000 +0200 +++ new/ethtool-7.1/cmis.h 2026-07-06 21:43:40.000000000 +0200 @@ -201,6 +201,6 @@ void cmis_show_all_ioctl(const __u8 *id); -int cmis_show_all_nl(struct cmd_context *ctx); +int cmis_show_all_nl(struct cmd_context *ctx, bool dump_pages); #endif /* CMIS_H__ */ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ethtool-7.0/configure new/ethtool-7.1/configure --- old/ethtool-7.0/configure 2026-04-28 15:05:05.000000000 +0200 +++ new/ethtool-7.1/configure 2026-07-06 23:39:19.000000000 +0200 @@ -1,6 +1,6 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.72 for ethtool 7.0. +# Generated by GNU Autoconf 2.72 for ethtool 7.1. # # Report bugs to <[email protected]>. # @@ -604,8 +604,8 @@ # Identity of this package. PACKAGE_NAME='ethtool' PACKAGE_TARNAME='ethtool' -PACKAGE_VERSION='7.0' -PACKAGE_STRING='ethtool 7.0' +PACKAGE_VERSION='7.1' +PACKAGE_STRING='ethtool 7.1' PACKAGE_BUGREPORT='[email protected]' PACKAGE_URL='' @@ -1322,7 +1322,7 @@ # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -'configure' configures ethtool 7.0 to adapt to many kinds of systems. +'configure' configures ethtool 7.1 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1389,7 +1389,7 @@ if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of ethtool 7.0:";; + short | recursive ) echo "Configuration of ethtool 7.1:";; esac cat <<\_ACEOF @@ -1499,7 +1499,7 @@ test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -ethtool configure 7.0 +ethtool configure 7.1 generated by GNU Autoconf 2.72 Copyright (C) 2023 Free Software Foundation, Inc. @@ -1723,7 +1723,7 @@ This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by ethtool $as_me 7.0, which was +It was created by ethtool $as_me 7.1, which was generated by GNU Autoconf 2.72. Invocation command line was $ $0$ac_configure_args_raw @@ -3203,7 +3203,7 @@ # Define the identity of the package. PACKAGE='ethtool' - VERSION='7.0' + VERSION='7.1' printf "%s\n" "#define PACKAGE \"$PACKAGE\"" >>confdefs.h @@ -6050,7 +6050,7 @@ # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by ethtool $as_me 7.0, which was +This file was extended by ethtool $as_me 7.1, which was generated by GNU Autoconf 2.72. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -6118,7 +6118,7 @@ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config='$ac_cs_config_escaped' ac_cs_version="\\ -ethtool config.status 7.0 +ethtool config.status 7.1 configured by $0, generated by GNU Autoconf 2.72, with options \\"\$ac_cs_config\\" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ethtool-7.0/configure.ac new/ethtool-7.1/configure.ac --- old/ethtool-7.0/configure.ac 2026-04-28 15:04:53.000000000 +0200 +++ new/ethtool-7.1/configure.ac 2026-07-06 23:18:04.000000000 +0200 @@ -1,5 +1,5 @@ dnl Process this file with autoconf to produce a configure script. -AC_INIT(ethtool, 7.0, [email protected]) +AC_INIT(ethtool, 7.1, [email protected]) AC_PREREQ(2.52) AC_CONFIG_MACRO_DIR([m4]) AC_CONFIG_SRCDIR([ethtool.c]) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ethtool-7.0/ethtool.8 new/ethtool-7.1/ethtool.8 --- old/ethtool-7.0/ethtool.8 2026-04-28 15:05:06.000000000 +0200 +++ new/ethtool-7.1/ethtool.8 2026-07-06 23:39:22.000000000 +0200 @@ -117,7 +117,7 @@ . hy \\n(HY .. . -.TH ETHTOOL 8 "Apr 2026" "Ethtool version 7.0" +.TH ETHTOOL 8 "Jul 2026" "Ethtool version 7.1" .SH NAME ethtool \- query or control network driver and hardware settings . @@ -198,6 +198,8 @@ .BN tx\-aggr\-max\-bytes .BN tx\-aggr\-max\-frames .BN tx\-aggr\-time\-usecs +.BN rx\-cqe\-frames +.BN rx\-cqe\-nsecs .HP .B ethtool \-g|\-\-show\-ring .I devname @@ -401,6 +403,7 @@ .I devname .B2 raw on off .B2 hex on off +.B2 pages on off .BN offset .BN length .BN page @@ -934,7 +937,7 @@ 0x40000 10000baseKX4 Full 0x80000 10000baseKR Full 0x100000 10000baseR_FEC -0x40000000000 10000baseCR Full +0x40000000000 10000baseCR Full (a.k.a 10G_SFI_DA, SFF-8431 Appendix-E) 0x80000000000 10000baseSR Full 0x100000000000 10000baseLR Full 0x200000000000 10000baseLRM Full @@ -1429,6 +1432,24 @@ and .I length parameters are treated relatively to EEPROM page boundaries. +When +.B hex on pages on +is specified, dumps all relevant EEPROM pages in hex, organized by page. +Each page is preceded by a header identifying the page number. For banked pages, +the bank number is also shown, and for SFP modules, the I2C address is also +shown, as different parts of the EEPROM memory map are accessible via different +I2C addresses. The set of pages dumped matches what the pretty-printer reads for +each module type. This option cannot be combined with +.I offset, length, page, bank +or +.I i2c +parameters. When combined with +.BI \-\-json , +the output is a JSON object with a "pages" array. Each element is an +object with the fields "bank", "page", "offset", "i2c_address" and "data", +emitted unconditionally regardless of module type. "data" is an array of +lowercase hex strings, one per byte; its length is the length of the +memory block. .TP .B \-\-show\-priv\-flags Queries the specified network device for its private flags. The @@ -1550,7 +1571,13 @@ Get the current tx copybreak buffer size in bytes. .TP .B pfc\-prevention\-tout -Get the current pfc prevention timeout value in msecs. +Get the PFC storm prevention timeout value in milliseconds. +This timeout value applies to both PFC (Priority Flow Control) and standard +link-level pause storms (IEEE 802.3x). A pause storm occurs when a device +continously sends TX pause frames to the switch, resulting in persistent +backpressure. When enabled, if the NIC detects that pause assertion has +exceeded the configured timeout, the device takes protective action (stops +sending pause frames) to prevent a complete traffic stall. .RE .TP .B \-\-set\-tunable @@ -1567,7 +1594,16 @@ Set the tx copybreak buffer size in bytes. .TP .BI pfc\-prevention\-tout \ N -Set pfc prevention timeout in msecs. Value of 0 means disable and 65535 means auto. +Set the PFC storm prevention timeout in milliseconds. The range of valid +values is device specific. Special values: +.RS 4 +.TP +.B 0 +Disable storm prevention. +.TP +.B 65535 +Use device-local default timeout (auto). +.RE .RE .TP .B \-\-reset diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ethtool-7.0/ethtool.8.in new/ethtool-7.1/ethtool.8.in --- old/ethtool-7.0/ethtool.8.in 2026-04-28 15:04:53.000000000 +0200 +++ new/ethtool-7.1/ethtool.8.in 2026-07-06 23:18:24.000000000 +0200 @@ -117,7 +117,7 @@ . hy \\n(HY .. . -.TH ETHTOOL 8 "Apr 2026" "Ethtool version @VERSION@" +.TH ETHTOOL 8 "Jul 2026" "Ethtool version @VERSION@" .SH NAME ethtool \- query or control network driver and hardware settings . @@ -198,6 +198,8 @@ .BN tx\-aggr\-max\-bytes .BN tx\-aggr\-max\-frames .BN tx\-aggr\-time\-usecs +.BN rx\-cqe\-frames +.BN rx\-cqe\-nsecs .HP .B ethtool \-g|\-\-show\-ring .I devname @@ -401,6 +403,7 @@ .I devname .B2 raw on off .B2 hex on off +.B2 pages on off .BN offset .BN length .BN page @@ -934,7 +937,7 @@ 0x40000 10000baseKX4 Full 0x80000 10000baseKR Full 0x100000 10000baseR_FEC -0x40000000000 10000baseCR Full +0x40000000000 10000baseCR Full (a.k.a 10G_SFI_DA, SFF-8431 Appendix-E) 0x80000000000 10000baseSR Full 0x100000000000 10000baseLR Full 0x200000000000 10000baseLRM Full @@ -1429,6 +1432,24 @@ and .I length parameters are treated relatively to EEPROM page boundaries. +When +.B hex on pages on +is specified, dumps all relevant EEPROM pages in hex, organized by page. +Each page is preceded by a header identifying the page number. For banked pages, +the bank number is also shown, and for SFP modules, the I2C address is also +shown, as different parts of the EEPROM memory map are accessible via different +I2C addresses. The set of pages dumped matches what the pretty-printer reads for +each module type. This option cannot be combined with +.I offset, length, page, bank +or +.I i2c +parameters. When combined with +.BI \-\-json , +the output is a JSON object with a "pages" array. Each element is an +object with the fields "bank", "page", "offset", "i2c_address" and "data", +emitted unconditionally regardless of module type. "data" is an array of +lowercase hex strings, one per byte; its length is the length of the +memory block. .TP .B \-\-show\-priv\-flags Queries the specified network device for its private flags. The @@ -1550,7 +1571,13 @@ Get the current tx copybreak buffer size in bytes. .TP .B pfc\-prevention\-tout -Get the current pfc prevention timeout value in msecs. +Get the PFC storm prevention timeout value in milliseconds. +This timeout value applies to both PFC (Priority Flow Control) and standard +link-level pause storms (IEEE 802.3x). A pause storm occurs when a device +continously sends TX pause frames to the switch, resulting in persistent +backpressure. When enabled, if the NIC detects that pause assertion has +exceeded the configured timeout, the device takes protective action (stops +sending pause frames) to prevent a complete traffic stall. .RE .TP .B \-\-set\-tunable @@ -1567,7 +1594,16 @@ Set the tx copybreak buffer size in bytes. .TP .BI pfc\-prevention\-tout \ N -Set pfc prevention timeout in msecs. Value of 0 means disable and 65535 means auto. +Set the PFC storm prevention timeout in milliseconds. The range of valid +values is device specific. Special values: +.RS 4 +.TP +.B 0 +Disable storm prevention. +.TP +.B 65535 +Use device-local default timeout (auto). +.RE .RE .TP .B \-\-reset diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ethtool-7.0/ethtool.c new/ethtool-7.1/ethtool.c --- old/ethtool-7.0/ethtool.c 2026-04-28 12:45:15.000000000 +0200 +++ new/ethtool-7.1/ethtool.c 2026-07-06 21:44:29.000000000 +0200 @@ -5925,6 +5925,8 @@ " [tx-aggr-max-bytes N]\n" " [tx-aggr-max-frames N]\n" " [tx-aggr-time-usecs N]\n" + " [rx-cqe-frames N]\n" + " [rx-cqe-nsecs N]\n" }, { .opts = "-g|--show-ring", @@ -6163,6 +6165,7 @@ .help = "Query/Decode Module EEPROM information and optical diagnostics if available", .xhelp = " [ raw on|off ]\n" " [ hex on|off ]\n" + " [ pages on|off ]\n" " [ offset N ]\n" " [ length N ]\n" " [ page N ]\n" @@ -6414,6 +6417,7 @@ fprintf(stdout, "\n"); fprintf(stdout, "FLAGS:\n"); fprintf(stdout, " --debug MASK turn on debugging messages\n"); + fprintf(stdout, " --disable-netlink do not use netlink, fall back to ioctl interface\n"); fprintf(stdout, " -j|--json enable JSON output format (not supported by all commands)\n"); fprintf(stdout, " -I|--include-statistics request device statistics related to the command (not supported by all commands)\n"); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ethtool-7.0/ethtool.spec new/ethtool-7.1/ethtool.spec --- old/ethtool-7.0/ethtool.spec 2026-04-28 15:05:06.000000000 +0200 +++ new/ethtool-7.1/ethtool.spec 2026-07-06 23:39:24.000000000 +0200 @@ -1,5 +1,5 @@ Name : ethtool -Version : 7.0 +Version : 7.1 Release : 1 Group : Utilities diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ethtool-7.0/internal.h new/ethtool-7.1/internal.h --- old/ethtool-7.0/internal.h 2026-03-23 19:00:01.000000000 +0100 +++ new/ethtool-7.1/internal.h 2026-07-06 21:43:40.000000000 +0200 @@ -381,14 +381,14 @@ /* Module EEPROM parsing code */ void sff8079_show_all_ioctl(const __u8 *id); -int sff8079_show_all_nl(struct cmd_context *ctx); +int sff8079_show_all_nl(struct cmd_context *ctx, bool dump_pages); /* Optics diagnostics */ void sff8472_show_all(const __u8 *id); /* QSFP Optics diagnostics */ void sff8636_show_all_ioctl(const __u8 *id, __u32 eeprom_len); -int sff8636_show_all_nl(struct cmd_context *ctx); +int sff8636_show_all_nl(struct cmd_context *ctx, bool dump_pages); /* FUJITSU Extended Socket network device */ int fjes_dump_regs(struct ethtool_drvinfo *info, struct ethtool_regs *regs); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ethtool-7.0/module-common.c new/ethtool-7.1/module-common.c --- old/ethtool-7.0/module-common.c 2025-11-19 23:18:51.000000000 +0100 +++ new/ethtool-7.1/module-common.c 2026-07-06 21:43:40.000000000 +0200 @@ -656,3 +656,39 @@ PRINT_VCC_ALL("Module voltage", "module_voltage_measurement", sd->sfp_voltage[MCURR]); } + +/* Print one EEPROM memory block with a descriptive header followed by hex + * dump. The header is selected by the dump->print_i2c and dump->print_bank + * flags: "Page: 0xN" is always printed, an I2C-addressed block prints + * "I2C Address: 0xN" and a banked page prints "Bank: 0xN". + * + * In JSON context, all fields (bank, page, offset, i2c_address) are emitted + * unconditionally as a JSON object inside the enclosing "pages" array. + */ +void module_dump_eeprom_hex(const struct module_eeprom_dump *dump) +{ + u32 i; + + if (is_json_context()) { + open_json_object(NULL); + print_uint(PRINT_JSON, "bank", "%u", dump->bank); + print_uint(PRINT_JSON, "page", "%u", dump->page); + print_uint(PRINT_JSON, "offset", "%u", dump->offset); + print_uint(PRINT_JSON, "i2c_address", "%u", dump->i2c_address); + open_json_array("data", ""); + for (i = 0; i < dump->length; i++) + print_hex(PRINT_JSON, NULL, "%02x", dump->data[i]); + close_json_array(""); + close_json_object(); + return; + } + + if (dump->print_i2c) + printf("I2C Address: 0x%02x\n", dump->i2c_address); + if (dump->print_bank) + printf("Bank: 0x%x\n", dump->bank); + printf("Page: 0x%x\n\n", dump->page); + + dump_hex(stdout, dump->data, dump->length, dump->offset); + printf("\n"); +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ethtool-7.0/module-common.h new/ethtool-7.1/module-common.h --- old/ethtool-7.0/module-common.h 2025-06-23 22:25:49.000000000 +0200 +++ new/ethtool-7.1/module-common.h 2026-07-06 21:43:40.000000000 +0200 @@ -261,6 +261,17 @@ __u8 adver_value; /* Supported if (offset & value) != 0. */ }; +struct module_eeprom_dump { + u32 offset; + u32 length; + u8 page; + u8 bank; + u8 i2c_address; + bool print_bank; + bool print_i2c; + const u8 *data; +}; + extern const struct module_aw_mod module_aw_mod_flags[]; extern const struct module_aw_chan module_aw_chan_flags[]; @@ -283,5 +294,6 @@ void module_show_connector(const __u8 *id, int ctor_offset); void module_show_mit_compliance(u16 value); void module_show_dom_mod_lvl_monitors(const struct sff_diags *sd); +void module_dump_eeprom_hex(const struct module_eeprom_dump *dump); #endif /* MODULE_COMMON_H__ */ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ethtool-7.0/netlink/coalesce.c new/ethtool-7.1/netlink/coalesce.c --- old/ethtool-7.0/netlink/coalesce.c 2026-04-28 12:45:15.000000000 +0200 +++ new/ethtool-7.1/netlink/coalesce.c 2026-07-06 21:43:40.000000000 +0200 @@ -96,6 +96,11 @@ show_u32("tx-aggr-time-usecs", "tx-aggr-time-usecs:\t", tb[ETHTOOL_A_COALESCE_TX_AGGR_TIME_USECS]); show_cr(); + show_u32("rx-cqe-frames", "rx-cqe-frames:\t\t", + tb[ETHTOOL_A_COALESCE_RX_CQE_FRAMES]); + show_u32("rx-cqe-nsecs", "rx-cqe-nsecs:\t\t", + tb[ETHTOOL_A_COALESCE_RX_CQE_NSECS]); + show_cr(); close_json_object(); @@ -292,6 +297,18 @@ .handler = nl_parse_direct_u32, .min_argc = 1, }, + { + .arg = "rx-cqe-frames", + .type = ETHTOOL_A_COALESCE_RX_CQE_FRAMES, + .handler = nl_parse_direct_u32, + .min_argc = 1, + }, + { + .arg = "rx-cqe-nsecs", + .type = ETHTOOL_A_COALESCE_RX_CQE_NSECS, + .handler = nl_parse_direct_u32, + .min_argc = 1, + }, {} }; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ethtool-7.0/netlink/desc-ethtool.c new/ethtool-7.1/netlink/desc-ethtool.c --- old/ethtool-7.0/netlink/desc-ethtool.c 2026-04-28 13:34:19.000000000 +0200 +++ new/ethtool-7.1/netlink/desc-ethtool.c 2026-07-06 21:43:40.000000000 +0200 @@ -249,6 +249,8 @@ NLATTR_DESC_U32(ETHTOOL_A_COALESCE_TX_AGGR_TIME_USECS), NLATTR_DESC_NESTED(ETHTOOL_A_COALESCE_RX_PROFILE, profile), NLATTR_DESC_NESTED(ETHTOOL_A_COALESCE_TX_PROFILE, profile), + NLATTR_DESC_U32(ETHTOOL_A_COALESCE_RX_CQE_FRAMES), + NLATTR_DESC_U32(ETHTOOL_A_COALESCE_RX_CQE_NSECS), }; static const struct pretty_nla_desc __pause_stats_desc[] = { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ethtool-7.0/netlink/fec.c new/ethtool-7.1/netlink/fec.c --- old/ethtool-7.0/netlink/fec.c 2026-01-05 17:57:34.000000000 +0100 +++ new/ethtool-7.1/netlink/fec.c 2026-07-06 21:43:40.000000000 +0200 @@ -166,6 +166,8 @@ if (lanes) { close_json_array(""); printf(" ]\n"); + } else { + printf("\n"); } close_json_object(); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ethtool-7.0/netlink/module-eeprom.c new/ethtool-7.1/netlink/module-eeprom.c --- old/ethtool-7.0/netlink/module-eeprom.c 2025-06-23 22:25:49.000000000 +0200 +++ new/ethtool-7.1/netlink/module-eeprom.c 2026-07-06 21:43:40.000000000 +0200 @@ -25,6 +25,7 @@ unsigned long present; u8 dump_hex; u8 dump_raw; + u8 dump_pages; u32 offset; u32 length; u32 page; @@ -83,6 +84,12 @@ .dest_offset = offsetof(struct cmd_params, i2c_address), .min_argc = 1, }, + { + .arg = "pages", + .handler = nl_parse_u8bool, + .dest_offset = offsetof(struct cmd_params, dump_pages), + .min_argc = 1, + }, {} }; @@ -207,7 +214,7 @@ return 0; } -static int eeprom_parse(struct cmd_context *ctx) +static int eeprom_parse(struct cmd_context *ctx, bool dump_pages __maybe_unused) { struct ethtool_module_eeprom request = { .length = 1, @@ -228,18 +235,18 @@ case MODULE_ID_GBIC: case MODULE_ID_SOLDERED_MODULE: case MODULE_ID_SFP: - return sff8079_show_all_nl(ctx); + return sff8079_show_all_nl(ctx, dump_pages); case MODULE_ID_QSFP: case MODULE_ID_QSFP28: case MODULE_ID_QSFP_PLUS: - return sff8636_show_all_nl(ctx); + return sff8636_show_all_nl(ctx, dump_pages); case MODULE_ID_QSFP_DD: case MODULE_ID_OSFP: case MODULE_ID_DSFP: case MODULE_ID_QSFP_PLUS_CMIS: case MODULE_ID_SFP_DD_CMIS: case MODULE_ID_SFP_PLUS_CMIS: - return cmis_show_all_nl(ctx); + return cmis_show_all_nl(ctx, dump_pages); #endif default: /* If we cannot recognize the memory map, default to dumping @@ -272,10 +279,28 @@ return -EINVAL; } + if (getmodule_cmd_params.dump_pages && !getmodule_cmd_params.dump_hex) { + fprintf(stderr, "Pages dump requires hex on\n"); + return -EINVAL; + } + + if (getmodule_cmd_params.dump_pages && + (getmodule_cmd_params.present & (1 << PARAM_PAGE | + 1 << PARAM_BANK | + 1 << PARAM_OFFSET | + 1 << PARAM_LENGTH | + 1 << PARAM_I2C))) { + fprintf(stderr, + "Pages dump cannot be combined with offset, length, page, bank or i2c\n"); + return -EINVAL; + } + /* When complete hex/raw dump of the EEPROM is requested, fallback to - * ioctl. Netlink can only request specific pages. + * ioctl. Netlink can only request specific pages. Skip fallback when + * pages dump is requested, as it handles page selection internally. */ if ((getmodule_cmd_params.dump_hex || getmodule_cmd_params.dump_raw) && + !getmodule_cmd_params.dump_pages && !(getmodule_cmd_params.present & (1 << PARAM_PAGE | 1 << PARAM_BANK | 1 << PARAM_I2C))) { @@ -300,7 +325,11 @@ if (request.page && !request.offset) request.offset = 128; - if (getmodule_cmd_params.dump_hex || getmodule_cmd_params.dump_raw) { + if (getmodule_cmd_params.dump_pages) { + ret = eeprom_parse(ctx, true); + if (ret < 0) + goto cleanup; + } else if (getmodule_cmd_params.dump_hex || getmodule_cmd_params.dump_raw) { ret = nl_get_eeprom_page(ctx, &request); if (ret < 0) goto cleanup; @@ -311,7 +340,7 @@ dump_hex(stdout, request.data, request.length, request.offset); } else { - ret = eeprom_parse(ctx); + ret = eeprom_parse(ctx, false); if (ret < 0) goto cleanup; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ethtool-7.0/netlink/pause.c new/ethtool-7.1/netlink/pause.c --- old/ethtool-7.0/netlink/pause.c 2026-04-28 12:45:15.000000000 +0200 +++ new/ethtool-7.1/netlink/pause.c 2026-07-06 21:43:40.000000000 +0200 @@ -116,6 +116,7 @@ } stats[] = { { ETHTOOL_A_PAUSE_STAT_TX_FRAMES, "tx_pause_frames" }, { ETHTOOL_A_PAUSE_STAT_RX_FRAMES, "rx_pause_frames" }, + { ETHTOOL_A_PAUSE_STAT_TX_PAUSE_STORM_EVENTS, "tx_pause_storm_events" }, }; bool header = false; unsigned int i; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ethtool-7.0/qsfp.c new/ethtool-7.1/qsfp.c --- old/ethtool-7.0/qsfp.c 2025-06-23 22:25:49.000000000 +0200 +++ new/ethtool-7.1/qsfp.c 2026-07-06 21:43:40.000000000 +0200 @@ -62,9 +62,11 @@ #include "cmis.h" #include "netlink/extapi.h" +#define SFF8636_MAX_PAGES 4 + struct sff8636_memory_map { const __u8 *lower_memory; - const __u8 *upper_memory[4]; + const __u8 *upper_memory[SFF8636_MAX_PAGES]; #define page_00h upper_memory[0x0] #define page_03h upper_memory[0x3] }; @@ -451,6 +453,10 @@ sprintf(value, "%s", "SONET: OC-48, short reach"); /* SAS/SATA Compliance Codes */ + if (map->page_00h[SFF8636_SAS_COMP_OFFSET] & (SFF8636_SAS_24G)) + sprintf(value, "%s", "SAS 24.0G"); + if (map->page_00h[SFF8636_SAS_COMP_OFFSET] & (SFF8636_SAS_12G)) + sprintf(value, "%s", "SAS 12.0G"); if (map->page_00h[SFF8636_SAS_COMP_OFFSET] & (SFF8636_SAS_6G)) sprintf(value, "%s", "SAS 6.0G"); if (map->page_00h[SFF8636_SAS_COMP_OFFSET] & (SFF8636_SAS_3G)) @@ -528,6 +534,8 @@ sprintf(value, "%s", "FC: 1600 MBytes/sec"); if (map->page_00h[SFF8636_FC_SPEED_OFFSET] & SFF8636_FC_SPEED_400_MBPS) sprintf(value, "%s", "FC: 400 MBytes/sec"); + if (map->page_00h[SFF8636_FC_SPEED_OFFSET] & SFF8636_FC_SPEED_3200_MBPS) + sprintf(value, "%s", "FC: 3200 MBytes/sec"); if (map->page_00h[SFF8636_FC_SPEED_OFFSET] & SFF8636_FC_SPEED_200_MBPS) sprintf(value, "%s", "FC: 200 MBytes/sec"); if (map->page_00h[SFF8636_FC_SPEED_OFFSET] & SFF8636_FC_SPEED_100_MBPS) @@ -1078,21 +1086,72 @@ return 0; } -int sff8636_show_all_nl(struct cmd_context *ctx) +static void sff8636_hex_dump(struct cmd_context *ctx, + const struct sff8636_memory_map *map) { - struct sff8636_memory_map map = {}; - int ret; + struct module_eeprom_dump dump = { + .length = SFF8636_PAGE_SIZE, + .i2c_address = SFF8636_I2C_ADDRESS, + }; + u8 page; new_json_obj(ctx->json); + if (is_json_context()) { + open_json_object(NULL); + open_json_array("pages", ""); + } + + dump.data = map->lower_memory; + module_dump_eeprom_hex(&dump); + + for (page = 0; page < SFF8636_MAX_PAGES; page++) { + const __u8 *buf = map->upper_memory[page]; + + if (!buf) + continue; + + /* Upper memory starts at one page size into the + * buffer, since pages are accessed at offset between + * page size and twice the page size. + */ + dump.offset = SFF8636_PAGE_SIZE; + dump.page = page; + dump.data = buf + SFF8636_PAGE_SIZE; + module_dump_eeprom_hex(&dump); + } + + if (is_json_context()) { + close_json_array(""); + close_json_object(); + } + delete_json_obj(); +} + +static void sff8636_pretty_print(struct cmd_context *ctx, + const struct sff8636_memory_map *map) +{ + new_json_obj(ctx->json); open_json_object(NULL); + sff8636_show_all_common(map); + + close_json_object(); + delete_json_obj(); +} + +int sff8636_show_all_nl(struct cmd_context *ctx, bool dump_pages) +{ + struct sff8636_memory_map map = {}; + int ret; + ret = sff8636_memory_map_init_pages(ctx, &map); if (ret < 0) return ret; - sff8636_show_all_common(&map); - close_json_object(); - delete_json_obj(); + if (dump_pages) + sff8636_hex_dump(ctx, &map); + else + sff8636_pretty_print(ctx, &map); return 0; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ethtool-7.0/qsfp.h new/ethtool-7.1/qsfp.h --- old/ethtool-7.0/qsfp.h 2025-06-23 22:25:49.000000000 +0200 +++ new/ethtool-7.1/qsfp.h 2026-07-06 21:43:40.000000000 +0200 @@ -217,6 +217,7 @@ /* SAS/SATA Complaince Codes - 133 */ #define SFF8636_SAS_COMP_OFFSET 0x85 +#define SFF8636_SAS_24G (1 << 7) #define SFF8636_SAS_12G (1 << 6) #define SFF8636_SAS_6G (1 << 5) #define SFF8636_SAS_3G (1 << 4) @@ -269,6 +270,7 @@ #define SFF8636_FC_SPEED_800_MBPS (1 << 6) #define SFF8636_FC_SPEED_1600_MBPS (1 << 5) #define SFF8636_FC_SPEED_400_MBPS (1 << 4) +#define SFF8636_FC_SPEED_3200_MBPS (1 << 3) #define SFF8636_FC_SPEED_200_MBPS (1 << 2) #define SFF8636_FC_SPEED_100_MBPS (1 << 0) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ethtool-7.0/sfpid.c new/ethtool-7.1/sfpid.c --- old/ethtool-7.0/sfpid.c 2026-04-08 00:22:06.000000000 +0200 +++ new/ethtool-7.1/sfpid.c 2026-07-06 21:43:40.000000000 +0200 @@ -73,7 +73,7 @@ /* 10G Ethernet Compliance Codes */ if (id[3] & (1 << 7)) sprintf(value, "%s", - "10G Ethernet: 10G Base-LRM [SFF-8472 rev10.4 onwards]"); + "10G Ethernet: 10G Base-ER [SFF-8472 rev10.4 onwards]"); if (id[3] & (1 << 6)) sprintf(value, "%s", "10G Ethernet: 10G Base-LRM"); if (id[3] & (1 << 5)) @@ -188,8 +188,12 @@ sprintf(value, "%s", "FC: 1200 MBytes/sec"); if (id[10] & (1 << 6)) sprintf(value, "%s", "FC: 800 MBytes/sec"); + if (id[10] & (1 << 5)) + sprintf(value, "%s", "FC: 1600 MBytes/sec"); if (id[10] & (1 << 4)) sprintf(value, "%s", "FC: 400 MBytes/sec"); + if (id[10] & (1 << 3)) + sprintf(value, "%s", "FC: 3200 MBytes/sec"); if (id[10] & (1 << 2)) sprintf(value, "%s", "FC: 200 MBytes/sec"); if (id[10] & (1 << 0)) @@ -498,8 +502,54 @@ return ret; } -int sff8079_show_all_nl(struct cmd_context *ctx) +static void sff8079_hex_dump(struct cmd_context *ctx, const u8 *buf, + bool a2h_present) { + struct module_eeprom_dump dump = { + .length = SFF8079_PAGE_SIZE, + .print_i2c = true, + }; + + new_json_obj(ctx->json); + if (is_json_context()) { + open_json_object(NULL); + open_json_array("pages", ""); + } + + dump.i2c_address = SFF8079_I2C_ADDRESS_LOW; + dump.data = buf; + module_dump_eeprom_hex(&dump); + + if (a2h_present) { + dump.i2c_address = SFF8079_I2C_ADDRESS_HIGH; + dump.data = buf + ETH_MODULE_SFF_8079_LEN; + module_dump_eeprom_hex(&dump); + } + + if (is_json_context()) { + close_json_array(""); + close_json_object(); + } + delete_json_obj(); +} + +static void sff8079_pretty_print(struct cmd_context *ctx, const u8 *buf, + bool a2h_present) +{ + new_json_obj(ctx->json); + open_json_object(NULL); + sff8079_show_all_common(buf); + + if (a2h_present) + sff8472_show_all(buf); + + close_json_object(); + delete_json_obj(); +} + +int sff8079_show_all_nl(struct cmd_context *ctx, bool dump_pages) +{ + bool a2h_present; u8 *buf; int ret; @@ -516,26 +566,23 @@ if (ret) goto out; - new_json_obj(ctx->json); - open_json_object(NULL); - sff8079_show_all_common(buf); + /* Check if A2h page is present */ + a2h_present = buf[92] & (1 << 6); - /* Finish if A2h page is not present */ - if (!(buf[92] & (1 << 6))) - goto out_json; - - /* Read A2h page */ - ret = sff8079_get_eeprom_page(ctx, SFF8079_I2C_ADDRESS_HIGH, - buf + ETH_MODULE_SFF_8079_LEN); - if (ret) { - fprintf(stderr, "Failed to read Page A2h.\n"); - goto out_json; + if (a2h_present) { + /* Read A2h page */ + ret = sff8079_get_eeprom_page(ctx, SFF8079_I2C_ADDRESS_HIGH, + buf + ETH_MODULE_SFF_8079_LEN); + if (ret) { + fprintf(stderr, "Failed to read Page A2h\n"); + goto out; + } } - sff8472_show_all(buf); -out_json: - close_json_object(); - delete_json_obj(); + if (dump_pages) + sff8079_hex_dump(ctx, buf, a2h_present); + else + sff8079_pretty_print(ctx, buf, a2h_present); out: free(buf); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ethtool-7.0/shell-completion/bash/ethtool new/ethtool-7.1/shell-completion/bash/ethtool --- old/ethtool-7.0/shell-completion/bash/ethtool 2026-04-28 12:45:15.000000000 +0200 +++ new/ethtool-7.1/shell-completion/bash/ethtool 2026-07-06 21:44:29.000000000 +0200 @@ -259,6 +259,8 @@ [tx-aggr-max-bytes]=1 [tx-aggr-max-frames]=1 [tx-aggr-time-usecs]=1 + [rx-cqe-frames]=1 + [rx-cqe-nsecs]=1 ) case "$prev" in @@ -669,11 +671,13 @@ [hex]=1 [length]=1 [offset]=1 + [pages]=1 [raw]=1 ) case "$prev" in hex|\ + pages|\ raw) COMPREPLY=( $( compgen -W 'on off' -- "$cur" ) ) return ;; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ethtool-7.0/uapi/linux/const.h new/ethtool-7.1/uapi/linux/const.h --- old/ethtool-7.0/uapi/linux/const.h 2026-04-28 12:45:32.000000000 +0200 +++ new/ethtool-7.1/uapi/linux/const.h 2026-07-06 22:34:39.000000000 +0200 @@ -50,4 +50,22 @@ #define __KERNEL_DIV_ROUND_UP(n, d) (((n) + (d) - 1) / (d)) +/* + * Divide positive or negative dividend by positive or negative divisor + * and round to closest integer. Result is undefined for negative + * divisors if the dividend variable type is unsigned and for negative + * dividends if the divisor variable type is unsigned. + */ +#define __KERNEL_DIV_ROUND_CLOSEST(x, divisor) \ +({ \ + __typeof__(x) __x = x; \ + __typeof__(divisor) __d = divisor; \ + \ + (((__typeof__(x))-1) > 0 || \ + ((__typeof__(divisor))-1) > 0 || \ + (((__x) > 0) == ((__d) > 0))) ? \ + (((__x) + ((__d) / 2)) / (__d)) : \ + (((__x) - ((__d) / 2)) / (__d)); \ +}) + #endif /* _LINUX_CONST_H */ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ethtool-7.0/uapi/linux/ethtool.h new/ethtool-7.1/uapi/linux/ethtool.h --- old/ethtool-7.0/uapi/linux/ethtool.h 2026-04-28 12:45:32.000000000 +0200 +++ new/ethtool-7.1/uapi/linux/ethtool.h 2026-07-06 22:34:39.000000000 +0200 @@ -225,7 +225,7 @@ ETHTOOL_ID_UNSPEC, ETHTOOL_RX_COPYBREAK, ETHTOOL_TX_COPYBREAK, - ETHTOOL_PFC_PREVENTION_TOUT, /* timeout in msecs */ + ETHTOOL_PFC_PREVENTION_TOUT, /* both pause and pfc, see man ethtool */ ETHTOOL_TX_COPYBREAK_BUF_SIZE, /* * Add your fresh new tunable attribute above and remember to update diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ethtool-7.0/uapi/linux/ethtool_netlink_generated.h new/ethtool-7.1/uapi/linux/ethtool_netlink_generated.h --- old/ethtool-7.0/uapi/linux/ethtool_netlink_generated.h 2026-04-28 12:45:32.000000000 +0200 +++ new/ethtool-7.1/uapi/linux/ethtool_netlink_generated.h 2026-07-06 22:34:39.000000000 +0200 @@ -371,6 +371,8 @@ ETHTOOL_A_COALESCE_TX_AGGR_TIME_USECS, ETHTOOL_A_COALESCE_RX_PROFILE, ETHTOOL_A_COALESCE_TX_PROFILE, + ETHTOOL_A_COALESCE_RX_CQE_FRAMES, + ETHTOOL_A_COALESCE_RX_CQE_NSECS, __ETHTOOL_A_COALESCE_CNT, ETHTOOL_A_COALESCE_MAX = (__ETHTOOL_A_COALESCE_CNT - 1) @@ -381,6 +383,7 @@ ETHTOOL_A_PAUSE_STAT_PAD, ETHTOOL_A_PAUSE_STAT_TX_FRAMES, ETHTOOL_A_PAUSE_STAT_RX_FRAMES, + ETHTOOL_A_PAUSE_STAT_TX_PAUSE_STORM_EVENTS, __ETHTOOL_A_PAUSE_STAT_CNT, ETHTOOL_A_PAUSE_STAT_MAX = (__ETHTOOL_A_PAUSE_STAT_CNT - 1) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ethtool-7.0/uapi/linux/if_link.h new/ethtool-7.1/uapi/linux/if_link.h --- old/ethtool-7.0/uapi/linux/if_link.h 2026-04-28 12:45:32.000000000 +0200 +++ new/ethtool-7.1/uapi/linux/if_link.h 2026-07-06 22:34:39.000000000 +0200 @@ -742,6 +742,11 @@ * @IFLA_BR_FDB_MAX_LEARNED * Set the number of max dynamically learned FDB entries for the current * bridge. + * + * @IFLA_BR_STP_MODE + * Set the STP mode for the bridge, which controls how the bridge + * selects between userspace and kernel STP. The valid values are + * documented below in the ``BR_STP_MODE_*`` constants. */ enum { IFLA_BR_UNSPEC, @@ -794,11 +799,45 @@ IFLA_BR_MCAST_QUERIER_STATE, IFLA_BR_FDB_N_LEARNED, IFLA_BR_FDB_MAX_LEARNED, + IFLA_BR_STP_MODE, __IFLA_BR_MAX, }; #define IFLA_BR_MAX (__IFLA_BR_MAX - 1) +/** + * DOC: Bridge STP mode values + * + * @BR_STP_MODE_AUTO + * Default. The kernel invokes the ``/sbin/bridge-stp`` helper to hand + * the bridge to a userspace STP daemon (e.g. mstpd). Only attempted in + * the initial network namespace; in other namespaces this falls back to + * kernel STP. + * + * @BR_STP_MODE_USER + * Directly enable userspace STP (``BR_USER_STP``) without invoking the + * ``/sbin/bridge-stp`` helper. Works in any network namespace. + * Userspace is responsible for ensuring an STP daemon manages the + * bridge. + * + * @BR_STP_MODE_KERNEL + * Directly enable kernel STP (``BR_KERNEL_STP``) without invoking the + * helper. + * + * The mode controls how the bridge selects between userspace and kernel + * STP when STP is enabled via ``IFLA_BR_STP_STATE``. It can only be + * changed while STP is disabled (``IFLA_BR_STP_STATE`` == 0), returns + * ``-EBUSY`` otherwise. The default value is ``BR_STP_MODE_AUTO``. + */ +enum br_stp_mode { + BR_STP_MODE_AUTO, + BR_STP_MODE_USER, + BR_STP_MODE_KERNEL, + __BR_STP_MODE_MAX +}; + +#define BR_STP_MODE_MAX (__BR_STP_MODE_MAX - 1) + struct ifla_bridge_id { __u8 prio[2]; __u8 addr[6]; /* ETH_ALEN */ @@ -1294,6 +1333,11 @@ NETKIT_L3, }; +enum netkit_pairing { + NETKIT_DEVICE_PAIR, + NETKIT_DEVICE_SINGLE, +}; + /* NETKIT_SCRUB_NONE leaves clearing skb->{mark,priority} up to * the BPF program if attached. This also means the latter can * consume the two fields if they were populated earlier. @@ -1318,6 +1362,7 @@ IFLA_NETKIT_PEER_SCRUB, IFLA_NETKIT_HEADROOM, IFLA_NETKIT_TAILROOM, + IFLA_NETKIT_PAIRING, __IFLA_NETKIT_MAX, }; #define IFLA_NETKIT_MAX (__IFLA_NETKIT_MAX - 1) @@ -1566,6 +1611,8 @@ IFLA_BOND_SLAVE_AD_PARTNER_OPER_PORT_STATE, IFLA_BOND_SLAVE_PRIO, IFLA_BOND_SLAVE_ACTOR_PORT_PRIO, + IFLA_BOND_SLAVE_AD_CHURN_ACTOR_STATE, + IFLA_BOND_SLAVE_AD_CHURN_PARTNER_STATE, __IFLA_BOND_SLAVE_MAX, };
