Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package iproute2 for openSUSE:Factory 
checked in at 2025-12-08 11:52:34
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/iproute2 (Old)
 and      /work/SRC/openSUSE:Factory/.iproute2.new.1939 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "iproute2"

Mon Dec  8 11:52:34 2025 rev:147 rq:1321272 version:6.18

Changes:
--------
--- /work/SRC/openSUSE:Factory/iproute2/iproute2.changes        2025-10-16 
17:38:09.562928930 +0200
+++ /work/SRC/openSUSE:Factory/.iproute2.new.1939/iproute2.changes      
2025-12-08 11:52:38.562190656 +0100
@@ -1,0 +2,10 @@
+Fri Dec  5 07:47:55 UTC 2025 - Jan Engelhardt <[email protected]>
+
+- Update to release 6.18
+  * tc: add dualpi2 scheduler module
+  * iplink: bond_slave: add support for actor_port_prio
+  * ip: iplink_bridge: Support fdb_local_vlan_0
+  * ip/bond: add broadcast_neighbor support
+  * netshaper: Add netshaper command
+
+-------------------------------------------------------------------

Old:
----
  iproute2-6.17.0.tar.sign
  iproute2-6.17.0.tar.xz

New:
----
  iproute2-6.18.0.tar.sign
  iproute2-6.18.0.tar.xz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ iproute2.spec ++++++
--- /var/tmp/diff_new_pack.papbiM/_old  2025-12-08 11:52:39.754240596 +0100
+++ /var/tmp/diff_new_pack.papbiM/_new  2025-12-08 11:52:39.754240596 +0100
@@ -17,7 +17,7 @@
 
 
 Name:           iproute2
-Version:        6.17
+Version:        6.18
 Release:        0
 Summary:        Linux network configuration utilities
 License:        GPL-2.0-only

++++++ _scmsync.obsinfo ++++++
--- /var/tmp/diff_new_pack.papbiM/_old  2025-12-08 11:52:39.786241937 +0100
+++ /var/tmp/diff_new_pack.papbiM/_new  2025-12-08 11:52:39.794242272 +0100
@@ -1,5 +1,5 @@
-mtime: 1760185776
-commit: 5b51236f99e525c52dc08ef0f349d5215a8659a4715207194f1bc73370e08d75
+mtime: 1764921080
+commit: 72df8da5327e631352098d5882bcaa82419ef7d3b4d6f53f61698f44c2309f15
 url: https://src.opensuse.org/jengelh/iproute2
 revision: master
 

++++++ build.specials.obscpio ++++++

++++++ build.specials.obscpio ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/.gitignore new/.gitignore
--- old/.gitignore      1970-01-01 01:00:00.000000000 +0100
+++ new/.gitignore      2025-12-05 08:51:32.000000000 +0100
@@ -0,0 +1 @@
+.osc

++++++ iproute2-6.17.0.tar.xz -> iproute2-6.18.0.tar.xz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/iproute2-6.17.0/Makefile new/iproute2-6.18.0/Makefile
--- old/iproute2-6.17.0/Makefile        2025-09-29 16:43:02.000000000 +0200
+++ new/iproute2-6.18.0/Makefile        2025-12-01 17:47:16.000000000 +0100
@@ -71,7 +71,7 @@
 
 SUBDIRS=lib ip tc bridge misc netem genl man
 ifeq ($(HAVE_MNL),y)
-SUBDIRS += tipc devlink rdma dcb vdpa
+SUBDIRS += tipc devlink rdma dcb vdpa netshaper
 endif
 
 LIBNETLINK=../lib/libutil.a ../lib/libnetlink.a
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/iproute2-6.17.0/dcb/dcb_maxrate.c 
new/iproute2-6.18.0/dcb/dcb_maxrate.c
--- old/iproute2-6.17.0/dcb/dcb_maxrate.c       2025-09-29 16:43:02.000000000 
+0200
+++ new/iproute2-6.18.0/dcb/dcb_maxrate.c       2025-12-01 17:47:16.000000000 
+0100
@@ -42,13 +42,20 @@
 
 static int dcb_maxrate_parse_mapping_tc_maxrate(__u32 key, char *value, void 
*data)
 {
-       __u64 rate;
+       __u64 rate_bytes_per_sec;
+       __u64 rate_kbits_per_sec;
 
-       if (get_rate64(&rate, value))
+       if (get_rate64(&rate_bytes_per_sec, value))
                return -EINVAL;
 
+       /* get_rate64() returns Bps.
+        * ieee_maxrate UAPI expects kbps.
+        * convert Bps to kbps by dividing 125.
+        */
+       rate_kbits_per_sec = rate_bytes_per_sec / 125;
+
        return dcb_parse_mapping("TC", key, IEEE_8021QAZ_MAX_TCS - 1,
-                                "RATE", rate, -1,
+                                "RATE", rate_kbits_per_sec, -1,
                                 dcb_set_u64, data);
 }
 
@@ -62,8 +69,14 @@
        print_string(PRINT_FP, NULL, "tc-maxrate ", NULL);
 
        for (i = 0; i < size; i++) {
+               /* ieee_maxrate UAPI returns kbps.
+                * print_rate() expects Bps for display.
+                * convert kbps to Bps by multiplying 125.
+                */
+               __u64 rate_bytes_per_sec  = maxrate->tc_maxrate[i] * 125;
+
                snprintf(b, sizeof(b), "%zd:%%s ", i);
-               print_rate(dcb->use_iec, PRINT_ANY, NULL, b, 
maxrate->tc_maxrate[i]);
+               print_rate(dcb->use_iec, PRINT_ANY, NULL, b, 
rate_bytes_per_sec);
        }
 
        close_json_array(PRINT_JSON, "tc_maxrate");
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/iproute2-6.17.0/devlink/devlink.c 
new/iproute2-6.18.0/devlink/devlink.c
--- old/iproute2-6.17.0/devlink/devlink.c       2025-09-29 16:43:02.000000000 
+0200
+++ new/iproute2-6.18.0/devlink/devlink.c       2025-12-01 17:47:16.000000000 
+0100
@@ -4594,6 +4594,8 @@
        } while (!ctx.flash_done || (ctx.not_first && !ctx.received_end));
 
        err = mnlu_gen_socket_recv_run(&dl->nlg, NULL, NULL);
+       if (err < 0)
+               pr_err("devlink answers: %s\n", strerror(errno));
 
 out:
        close(pipe_r);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/iproute2-6.17.0/include/json_print.h 
new/iproute2-6.18.0/include/json_print.h
--- old/iproute2-6.17.0/include/json_print.h    2025-09-29 16:43:02.000000000 
+0200
+++ new/iproute2-6.18.0/include/json_print.h    2025-12-01 17:47:16.000000000 
+0100
@@ -68,7 +68,7 @@
 _PRINT_FUNC(null, const char*)
 _PRINT_FUNC(string, const char*)
 _PRINT_FUNC(uint, unsigned int)
-_PRINT_FUNC(size, __u32)
+_PRINT_FUNC(size, __u64)
 _PRINT_FUNC(u64, uint64_t)
 _PRINT_FUNC(hhu, unsigned char)
 _PRINT_FUNC(hu, unsigned short)
@@ -109,6 +109,6 @@
 }
 
 /* A backdoor to the size formatter. Please use print_size() instead. */
-char *sprint_size(__u32 sz, char *buf);
+char *sprint_size(__u64 sz, char *buf);
 
 #endif /* _JSON_PRINT_H_ */
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/iproute2-6.17.0/include/uapi/linux/bpf.h 
new/iproute2-6.18.0/include/uapi/linux/bpf.h
--- old/iproute2-6.17.0/include/uapi/linux/bpf.h        2025-09-29 
16:43:02.000000000 +0200
+++ new/iproute2-6.18.0/include/uapi/linux/bpf.h        2025-12-01 
17:47:16.000000000 +0100
@@ -1522,6 +1522,12 @@
                 * If provided, map_flags should have BPF_F_TOKEN_FD flag set.
                 */
                __s32   map_token_fd;
+
+               /* Hash of the program that has exclusive access to the map.
+                */
+               __aligned_u64 excl_prog_hash;
+               /* Size of the passed excl_prog_hash. */
+               __u32 excl_prog_hash_size;
        };
 
        struct { /* anonymous struct used by BPF_MAP_*_ELEM and BPF_MAP_FREEZE 
commands */
@@ -1605,6 +1611,16 @@
                 * continuous.
                 */
                __u32           fd_array_cnt;
+               /* Pointer to a buffer containing the signature of the BPF
+                * program.
+                */
+               __aligned_u64   signature;
+               /* Size of the signature buffer in bytes. */
+               __u32           signature_size;
+               /* ID of the kernel keyring to be used for signature
+                * verification.
+                */
+               __s32           keyring_id;
        };
 
        struct { /* anonymous struct used by BPF_OBJ_* commands */
@@ -4875,7 +4891,7 @@
  *
  *             **-ENOENT** if the bpf_local_storage cannot be found.
  *
- * long bpf_d_path(struct path *path, char *buf, u32 sz)
+ * long bpf_d_path(const struct path *path, char *buf, u32 sz)
  *     Description
  *             Return full path for given **struct path** object, which
  *             needs to be the kernel BTF *path* object. The path is
@@ -6666,6 +6682,8 @@
        __u32 btf_value_type_id;
        __u32 btf_vmlinux_id;
        __u64 map_extra;
+       __aligned_u64 hash;
+       __u32 hash_size;
 } __attribute__((aligned(8)));
 
 struct bpf_btf_info {
@@ -7418,6 +7436,10 @@
        __u64 __opaque[2];
 } __attribute__((aligned(8)));
 
+struct bpf_task_work {
+       __u64 __opaque;
+} __attribute__((aligned(8)));
+
 struct bpf_wq {
        __u64 __opaque[2];
 } __attribute__((aligned(8)));
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/iproute2-6.17.0/include/uapi/linux/can/netlink.h 
new/iproute2-6.18.0/include/uapi/linux/can/netlink.h
--- old/iproute2-6.17.0/include/uapi/linux/can/netlink.h        2025-09-29 
16:43:02.000000000 +0200
+++ new/iproute2-6.18.0/include/uapi/linux/can/netlink.h        2025-12-01 
17:47:16.000000000 +0100
@@ -101,8 +101,8 @@
 #define CAN_CTRLMODE_PRESUME_ACK       0x40    /* Ignore missing CAN ACKs */
 #define CAN_CTRLMODE_FD_NON_ISO                0x80    /* CAN FD in non-ISO 
mode */
 #define CAN_CTRLMODE_CC_LEN8_DLC       0x100   /* Classic CAN DLC option */
-#define CAN_CTRLMODE_TDC_AUTO          0x200   /* CAN transiver automatically 
calculates TDCV */
-#define CAN_CTRLMODE_TDC_MANUAL                0x400   /* TDCV is manually set 
up by user */
+#define CAN_CTRLMODE_TDC_AUTO          0x200   /* FD transceiver automatically 
calculates TDCV */
+#define CAN_CTRLMODE_TDC_MANUAL                0x400   /* FD TDCV is manually 
set up by user */
 
 /*
  * CAN device statistics
@@ -129,14 +129,14 @@
        IFLA_CAN_RESTART_MS,
        IFLA_CAN_RESTART,
        IFLA_CAN_BERR_COUNTER,
-       IFLA_CAN_DATA_BITTIMING,
-       IFLA_CAN_DATA_BITTIMING_CONST,
+       IFLA_CAN_DATA_BITTIMING, /* FD */
+       IFLA_CAN_DATA_BITTIMING_CONST, /* FD */
        IFLA_CAN_TERMINATION,
        IFLA_CAN_TERMINATION_CONST,
        IFLA_CAN_BITRATE_CONST,
-       IFLA_CAN_DATA_BITRATE_CONST,
+       IFLA_CAN_DATA_BITRATE_CONST, /* FD */
        IFLA_CAN_BITRATE_MAX,
-       IFLA_CAN_TDC,
+       IFLA_CAN_TDC, /* FD */
        IFLA_CAN_CTRLMODE_EXT,
 
        /* add new constants above here */
@@ -145,7 +145,7 @@
 };
 
 /*
- * CAN FD Transmitter Delay Compensation (TDC)
+ * CAN FD/XL Transmitter Delay Compensation (TDC)
  *
  * Please refer to struct can_tdc_const and can_tdc in
  * include/linux/can/bittiming.h for further details.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/iproute2-6.17.0/include/uapi/linux/devlink.h 
new/iproute2-6.18.0/include/uapi/linux/devlink.h
--- old/iproute2-6.17.0/include/uapi/linux/devlink.h    2025-09-29 
16:43:02.000000000 +0200
+++ new/iproute2-6.18.0/include/uapi/linux/devlink.h    2025-12-01 
17:47:16.000000000 +0100
@@ -636,6 +636,8 @@
 
        DEVLINK_ATTR_RATE_TC_BWS,               /* nested */
 
+       DEVLINK_ATTR_HEALTH_REPORTER_BURST_PERIOD,      /* u64 */
+
        /* Add new attributes above here, update the spec in
         * Documentation/netlink/specs/devlink.yaml and re-generate
         * net/devlink/netlink_gen.c.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/iproute2-6.17.0/include/uapi/linux/if_bridge.h 
new/iproute2-6.18.0/include/uapi/linux/if_bridge.h
--- old/iproute2-6.17.0/include/uapi/linux/if_bridge.h  2025-09-29 
16:43:02.000000000 +0200
+++ new/iproute2-6.18.0/include/uapi/linux/if_bridge.h  2025-12-01 
17:47:16.000000000 +0100
@@ -823,6 +823,8 @@
 /* bridge boolean options
  * BR_BOOLOPT_NO_LL_LEARN - disable learning from link-local packets
  * BR_BOOLOPT_MCAST_VLAN_SNOOPING - control vlan multicast snooping
+ * BR_BOOLOPT_FDB_LOCAL_VLAN_0 - local FDB entries installed by the bridge
+ *                               driver itself should only be added on VLAN 0
  *
  * IMPORTANT: if adding a new option do not forget to handle
  *            it in br_boolopt_toggle/get and bridge sysfs
@@ -832,6 +834,7 @@
        BR_BOOLOPT_MCAST_VLAN_SNOOPING,
        BR_BOOLOPT_MST_ENABLE,
        BR_BOOLOPT_MDB_OFFLOAD_FAIL_NOTIFICATION,
+       BR_BOOLOPT_FDB_LOCAL_VLAN_0,
        BR_BOOLOPT_MAX
 };
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/iproute2-6.17.0/include/uapi/linux/if_link.h 
new/iproute2-6.18.0/include/uapi/linux/if_link.h
--- old/iproute2-6.17.0/include/uapi/linux/if_link.h    2025-09-29 
16:43:02.000000000 +0200
+++ new/iproute2-6.18.0/include/uapi/linux/if_link.h    2025-12-01 
17:47:16.000000000 +0100
@@ -379,6 +379,8 @@
        IFLA_DPLL_PIN,
        IFLA_MAX_PACING_OFFLOAD_HORIZON,
        IFLA_NETNS_IMMUTABLE,
+       IFLA_HEADROOM,
+       IFLA_TAILROOM,
        __IFLA_MAX
 };
 
@@ -1562,6 +1564,7 @@
        IFLA_BOND_SLAVE_AD_ACTOR_OPER_PORT_STATE,
        IFLA_BOND_SLAVE_AD_PARTNER_OPER_PORT_STATE,
        IFLA_BOND_SLAVE_PRIO,
+       IFLA_BOND_SLAVE_ACTOR_PORT_PRIO,
        __IFLA_BOND_SLAVE_MAX,
 };
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/iproute2-6.17.0/include/uapi/linux/mptcp.h 
new/iproute2-6.18.0/include/uapi/linux/mptcp.h
--- old/iproute2-6.17.0/include/uapi/linux/mptcp.h      2025-09-29 
16:43:02.000000000 +0200
+++ new/iproute2-6.18.0/include/uapi/linux/mptcp.h      2025-12-01 
17:47:16.000000000 +0100
@@ -30,20 +30,27 @@
 #define MPTCP_INFO_FLAG_REMOTE_KEY_RECEIVED    _BITUL(1)
 
 #define MPTCP_PM_EV_FLAG_DENY_JOIN_ID0         _BITUL(0)
+#define MPTCP_PM_EV_FLAG_SERVER_SIDE           _BITUL(1)
 
-#define MPTCP_PM_ADDR_FLAG_SIGNAL                      (1 << 0)
-#define MPTCP_PM_ADDR_FLAG_SUBFLOW                     (1 << 1)
-#define MPTCP_PM_ADDR_FLAG_BACKUP                      (1 << 2)
-#define MPTCP_PM_ADDR_FLAG_FULLMESH                    (1 << 3)
-#define MPTCP_PM_ADDR_FLAG_IMPLICIT                    (1 << 4)
+#define MPTCP_PM_ADDR_FLAG_SIGNAL              _BITUL(0)
+#define MPTCP_PM_ADDR_FLAG_SUBFLOW             _BITUL(1)
+#define MPTCP_PM_ADDR_FLAG_BACKUP              _BITUL(2)
+#define MPTCP_PM_ADDR_FLAG_FULLMESH            _BITUL(3)
+#define MPTCP_PM_ADDR_FLAG_IMPLICIT            _BITUL(4)
+#define MPTCP_PM_ADDR_FLAG_LAMINAR             _BITUL(5)
 
 struct mptcp_info {
        __u8    mptcpi_subflows;
+       #define mptcpi_extra_subflows mptcpi_subflows
        __u8    mptcpi_add_addr_signal;
        __u8    mptcpi_add_addr_accepted;
        __u8    mptcpi_subflows_max;
+       #define mptcpi_limit_extra_subflows mptcpi_subflows_max
        __u8    mptcpi_add_addr_signal_max;
+       #define mptcpi_endp_signal_max mptcpi_add_addr_signal_max
        __u8    mptcpi_add_addr_accepted_max;
+       #define mptcpi_limit_add_addr_accepted mptcpi_add_addr_accepted_max
+       /* 16-bit hole that can no longer be filled */
        __u32   mptcpi_flags;
        __u32   mptcpi_token;
        __u64   mptcpi_write_seq;
@@ -51,14 +58,17 @@
        __u64   mptcpi_rcv_nxt;
        __u8    mptcpi_local_addr_used;
        __u8    mptcpi_local_addr_max;
+       #define mptcpi_endp_subflow_max mptcpi_local_addr_max
        __u8    mptcpi_csum_enabled;
+       /* 8-bit hole that can no longer be filled */
        __u32   mptcpi_retransmits;
        __u64   mptcpi_bytes_retrans;
        __u64   mptcpi_bytes_sent;
        __u64   mptcpi_bytes_received;
        __u64   mptcpi_bytes_acked;
        __u8    mptcpi_subflows_total;
-       __u8    reserved[3];
+       __u8    mptcpi_endp_laminar_max;
+       __u8    reserved[2];
        __u32   mptcpi_last_data_sent;
        __u32   mptcpi_last_data_recv;
        __u32   mptcpi_last_ack_recv;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/iproute2-6.17.0/include/uapi/linux/mptcp_pm.h 
new/iproute2-6.18.0/include/uapi/linux/mptcp_pm.h
--- old/iproute2-6.17.0/include/uapi/linux/mptcp_pm.h   2025-09-29 
16:43:02.000000000 +0200
+++ new/iproute2-6.18.0/include/uapi/linux/mptcp_pm.h   2025-12-01 
17:47:16.000000000 +0100
@@ -16,10 +16,10 @@
  *   good time to allocate memory and send ADD_ADDR if needed. Depending on the
  *   traffic-patterns it can take a long time until the MPTCP_EVENT_ESTABLISHED
  *   is sent. Attributes: token, family, saddr4 | saddr6, daddr4 | daddr6,
- *   sport, dport, server-side, [flags].
+ *   sport, dport, [server-side], [flags].
  * @MPTCP_EVENT_ESTABLISHED: A MPTCP connection is established (can start new
  *   subflows). Attributes: token, family, saddr4 | saddr6, daddr4 | daddr6,
- *   sport, dport, server-side, [flags].
+ *   sport, dport, [server-side], [flags].
  * @MPTCP_EVENT_CLOSED: A MPTCP connection has stopped. Attribute: token.
  * @MPTCP_EVENT_ANNOUNCED: A new address has been announced by the peer.
  *   Attributes: token, rem_id, family, daddr4 | daddr6 [, dport].
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/iproute2-6.17.0/include/uapi/linux/stddef.h 
new/iproute2-6.18.0/include/uapi/linux/stddef.h
--- old/iproute2-6.17.0/include/uapi/linux/stddef.h     2025-09-29 
16:43:02.000000000 +0200
+++ new/iproute2-6.18.0/include/uapi/linux/stddef.h     2025-12-01 
17:47:16.000000000 +0100
@@ -3,7 +3,6 @@
 #define _LINUX_STDDEF_H
 
 
-
 #ifndef __always_inline
 #define __always_inline __inline__
 #endif
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/iproute2-6.17.0/include/uapi/linux/tcp.h 
new/iproute2-6.18.0/include/uapi/linux/tcp.h
--- old/iproute2-6.17.0/include/uapi/linux/tcp.h        2025-09-29 
16:43:02.000000000 +0200
+++ new/iproute2-6.18.0/include/uapi/linux/tcp.h        2025-12-01 
17:47:16.000000000 +0100
@@ -316,6 +316,15 @@
                                         * in milliseconds, including any
                                         * unfinished recovery.
                                         */
+       __u32   tcpi_received_ce;    /* # of CE marks received */
+       __u32   tcpi_delivered_e1_bytes;  /* Accurate ECN byte counters */
+       __u32   tcpi_delivered_e0_bytes;
+       __u32   tcpi_delivered_ce_bytes;
+       __u32   tcpi_received_e1_bytes;
+       __u32   tcpi_received_e0_bytes;
+       __u32   tcpi_received_ce_bytes;
+       __u16   tcpi_accecn_fail_mode;
+       __u16   tcpi_accecn_opt_seen;
 };
 
 /* netlink attributes types for SCM_TIMESTAMPING_OPT_STATS */
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/iproute2-6.17.0/include/uapi/linux/virtio_ids.h 
new/iproute2-6.18.0/include/uapi/linux/virtio_ids.h
--- old/iproute2-6.17.0/include/uapi/linux/virtio_ids.h 2025-09-29 
16:43:02.000000000 +0200
+++ new/iproute2-6.18.0/include/uapi/linux/virtio_ids.h 2025-12-01 
17:47:16.000000000 +0100
@@ -68,6 +68,7 @@
 #define VIRTIO_ID_AUDIO_POLICY         39 /* virtio audio policy */
 #define VIRTIO_ID_BT                   40 /* virtio bluetooth */
 #define VIRTIO_ID_GPIO                 41 /* virtio gpio */
+#define VIRTIO_ID_SPI                  45 /* virtio spi */
 
 /*
  * Virtio Transitional IDs
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/iproute2-6.17.0/include/uapi/linux/virtio_net.h 
new/iproute2-6.18.0/include/uapi/linux/virtio_net.h
--- old/iproute2-6.17.0/include/uapi/linux/virtio_net.h 2025-09-29 
16:43:02.000000000 +0200
+++ new/iproute2-6.18.0/include/uapi/linux/virtio_net.h 2025-12-01 
17:47:16.000000000 +0100
@@ -193,7 +193,8 @@
 
 struct virtio_net_hdr_v1_hash {
        struct virtio_net_hdr_v1 hdr;
-       __le32 hash_value;
+       __le16 hash_value_lo;
+       __le16 hash_value_hi;
 #define VIRTIO_NET_HASH_REPORT_NONE            0
 #define VIRTIO_NET_HASH_REPORT_IPv4            1
 #define VIRTIO_NET_HASH_REPORT_TCPv4           2
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/iproute2-6.17.0/include/utils.h 
new/iproute2-6.18.0/include/utils.h
--- old/iproute2-6.17.0/include/utils.h 2025-09-29 16:43:02.000000000 +0200
+++ new/iproute2-6.18.0/include/utils.h 2025-12-01 17:47:16.000000000 +0100
@@ -165,6 +165,7 @@
 int get_rate(unsigned int *rate, const char *str);
 int get_rate64(__u64 *rate, const char *str);
 int get_size(unsigned int *size, const char *str);
+int get_size64(__u64 *size, const char *str);
 
 int hex2mem(const char *buf, uint8_t *mem, int count);
 char *hexstring_n2a(const __u8 *str, int len, char *buf, int blen);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/iproute2-6.17.0/include/version.h 
new/iproute2-6.18.0/include/version.h
--- old/iproute2-6.17.0/include/version.h       2025-09-29 16:43:02.000000000 
+0200
+++ new/iproute2-6.18.0/include/version.h       2025-12-01 17:47:16.000000000 
+0100
@@ -1 +1 @@
-static const char version[] = "6.17.0";
+static const char version[] = "6.18.0";
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/iproute2-6.17.0/ip/iplink_bond.c 
new/iproute2-6.18.0/ip/iplink_bond.c
--- old/iproute2-6.17.0/ip/iplink_bond.c        2025-09-29 16:43:02.000000000 
+0200
+++ new/iproute2-6.18.0/ip/iplink_bond.c        2025-12-01 17:47:16.000000000 
+0100
@@ -91,6 +91,7 @@
        "stable",
        "bandwidth",
        "count",
+       "actor_port_prio",
        NULL,
 };
 
@@ -149,6 +150,7 @@
                "                [ lacp_rate LACP_RATE ]\n"
                "                [ lacp_active LACP_ACTIVE]\n"
                "                [ coupled_control COUPLED_CONTROL ]\n"
+               "                [ broadcast_neighbor BROADCAST_NEIGHBOR ]\n"
                "                [ ad_select AD_SELECT ]\n"
                "                [ ad_user_port_key PORTKEY ]\n"
                "                [ ad_actor_sys_prio SYSPRIO ]\n"
@@ -165,6 +167,7 @@
                "LACP_RATE := slow|fast\n"
                "AD_SELECT := stable|bandwidth|count\n"
                "COUPLED_CONTROL := off|on\n"
+               "BROADCAST_NEIGHBOR := off|on\n"
        );
 }
 
@@ -184,6 +187,7 @@
        __u32 arp_all_targets, resend_igmp, min_links, lp_interval;
        __u32 packets_per_slave;
        __u8 missed_max;
+       __u8 broadcast_neighbor;
        unsigned int ifindex;
        int ret;
 
@@ -376,6 +380,12 @@
                        if (ret)
                                return ret;
                        addattr8(n, 1024, IFLA_BOND_COUPLED_CONTROL, 
coupled_control);
+               } else if (strcmp(*argv, "broadcast_neighbor") == 0) {
+                       NEXT_ARG();
+                       broadcast_neighbor = parse_on_off("broadcast_neighbor", 
*argv, &ret);
+                       if (ret)
+                               return ret;
+                       addattr8(n, 1024, IFLA_BOND_BROADCAST_NEIGH, 
broadcast_neighbor);
                } else if (matches(*argv, "ad_select") == 0) {
                        NEXT_ARG();
                        if (get_index(ad_select_tbl, *argv) < 0)
@@ -675,6 +685,13 @@
                             rta_getattr_u8(tb[IFLA_BOND_COUPLED_CONTROL]));
        }
 
+       if (tb[IFLA_BOND_BROADCAST_NEIGH]) {
+               print_on_off(PRINT_ANY,
+                            "broadcast_neighbor",
+                            "broadcast_neighbor %s ",
+                            rta_getattr_u8(tb[IFLA_BOND_BROADCAST_NEIGH]));
+       }
+
        if (tb[IFLA_BOND_AD_SELECT]) {
                const char *ad_select = get_name(ad_select_tbl,
                                                 
rta_getattr_u8(tb[IFLA_BOND_AD_SELECT]));
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/iproute2-6.17.0/ip/iplink_bond_slave.c 
new/iproute2-6.18.0/ip/iplink_bond_slave.c
--- old/iproute2-6.17.0/ip/iplink_bond_slave.c  2025-09-29 16:43:02.000000000 
+0200
+++ new/iproute2-6.18.0/ip/iplink_bond_slave.c  2025-12-01 17:47:16.000000000 
+0100
@@ -15,7 +15,9 @@
 
 static void print_explain(FILE *f)
 {
-       fprintf(f, "Usage: ... bond_slave [ queue_id ID ] [ prio PRIORITY ]\n");
+       fprintf(f, "Usage: ... bond_slave [ queue_id ID ] [ prio PRIORITY ]\n"
+                  "                      [ actor_port_prio PRIORITY ]\n"
+       );
 }
 
 static void explain(void)
@@ -145,12 +147,18 @@
                          state);
                print_slave_oper_state(f, "ad_partner_oper_port_state_str", 
state);
        }
+
+       if (tb[IFLA_BOND_SLAVE_ACTOR_PORT_PRIO])
+               print_int(PRINT_ANY,
+                         "actor_port_prio",
+                         "actor_port_prio %d ",
+                         rta_getattr_u16(tb[IFLA_BOND_SLAVE_ACTOR_PORT_PRIO]));
 }
 
 static int bond_slave_parse_opt(struct link_util *lu, int argc, char **argv,
                                struct nlmsghdr *n)
 {
-       __u16 queue_id;
+       __u16 queue_id, actor_port_prio;
        int prio;
 
        while (argc > 0) {
@@ -164,6 +172,12 @@
                        if (get_s32(&prio, *argv, 0))
                                invarg("prio is invalid", *argv);
                        addattr32(n, 1024, IFLA_BOND_SLAVE_PRIO, prio);
+               } else if (strcmp(*argv, "actor_port_prio") == 0) {
+                       NEXT_ARG();
+                       if (get_u16(&actor_port_prio, *argv, 0))
+                               invarg("actor prio is invalid", *argv);
+                       addattr16(n, 1024, IFLA_BOND_SLAVE_ACTOR_PORT_PRIO,
+                                 actor_port_prio);
                } else {
                        if (matches(*argv, "help") != 0)
                                fprintf(stderr,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/iproute2-6.17.0/ip/iplink_bridge.c 
new/iproute2-6.18.0/ip/iplink_bridge.c
--- old/iproute2-6.17.0/ip/iplink_bridge.c      2025-09-29 16:43:02.000000000 
+0200
+++ new/iproute2-6.18.0/ip/iplink_bridge.c      2025-12-01 17:47:16.000000000 
+0100
@@ -36,6 +36,7 @@
                "                 [ group_fwd_mask MASK ]\n"
                "                 [ group_address ADDRESS ]\n"
                "                 [ no_linklocal_learn NO_LINKLOCAL_LEARN ]\n"
+               "                 [ fdb_local_vlan_0 FDB_LOCAL_VLAN_0 ]\n"
                "                 [ fdb_max_learned FDB_MAX_LEARNED ]\n"
                "                 [ vlan_filtering VLAN_FILTERING ]\n"
                "                 [ vlan_protocol VLAN_PROTOCOL ]\n"
@@ -427,6 +428,18 @@
                                bm.optval |= mofn_bit;
                        else
                                bm.optval &= ~mofn_bit;
+               } else if (strcmp(*argv, "fdb_local_vlan_0") == 0) {
+                       __u32 bit = 1 << BR_BOOLOPT_FDB_LOCAL_VLAN_0;
+                       __u8 value;
+
+                       NEXT_ARG();
+                       if (get_u8(&value, *argv, 0))
+                               invarg("invalid fdb_local_vlan_0", *argv);
+                       bm.optmask |= bit;
+                       if (value)
+                               bm.optval |= bit;
+                       else
+                               bm.optval &= ~bit;
                } else if (matches(*argv, "help") == 0) {
                        explain();
                        return -1;
@@ -635,6 +648,7 @@
 
        if (tb[IFLA_BR_MULTI_BOOLOPT]) {
                __u32 mofn_bit = 1 << BR_BOOLOPT_MDB_OFFLOAD_FAIL_NOTIFICATION;
+               __u32 fdb_vlan_0_bit = 1 << BR_BOOLOPT_FDB_LOCAL_VLAN_0;
                __u32 mcvl_bit = 1 << BR_BOOLOPT_MCAST_VLAN_SNOOPING;
                __u32 no_ll_learn_bit = 1 << BR_BOOLOPT_NO_LL_LEARN;
                __u32 mst_bit = 1 << BR_BOOLOPT_MST_ENABLE;
@@ -661,6 +675,11 @@
                                   "mdb_offload_fail_notification",
                                   "mdb_offload_fail_notification %u ",
                                   !!(bm->optval & mofn_bit));
+               if (bm->optmask & fdb_vlan_0_bit)
+                       print_uint(PRINT_ANY,
+                                  "fdb_local_vlan_0",
+                                  "fdb_local_vlan_0 %u ",
+                                  !!(bm->optval & fdb_vlan_0_bit));
        }
 
        if (tb[IFLA_BR_MCAST_ROUTER])
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/iproute2-6.17.0/ip/iptuntap.c 
new/iproute2-6.18.0/ip/iptuntap.c
--- old/iproute2-6.17.0/ip/iptuntap.c   2025-09-29 16:43:02.000000000 +0200
+++ new/iproute2-6.18.0/ip/iptuntap.c   2025-12-01 17:47:16.000000000 +0100
@@ -314,6 +314,7 @@
                                   !strcmp(name, value)) {
                                SPRINT_BUF(pname);
 
+                               open_json_object(NULL);
                                if (get_task_name(pid, pname, sizeof(pname)))
                                        print_string(PRINT_ANY, "name",
                                                     "%s", "<NULL>");
@@ -322,6 +323,7 @@
                                                     "%s", pname);
 
                                print_uint(PRINT_ANY, "pid", "(%d)", pid);
+                               close_json_object();
                        }
 
                        free(key);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/iproute2-6.17.0/lib/bridge.c 
new/iproute2-6.18.0/lib/bridge.c
--- old/iproute2-6.17.0/lib/bridge.c    2025-09-29 16:43:02.000000000 +0200
+++ new/iproute2-6.18.0/lib/bridge.c    2025-12-01 17:47:16.000000000 +0100
@@ -2,8 +2,8 @@
 
 #include <net/if.h>
 
-#include "bridge.h"
 #include "utils.h"
+#include "bridge.h"
 
 void bridge_print_vlan_flags(__u16 flags)
 {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/iproute2-6.17.0/lib/json_print_math.c 
new/iproute2-6.18.0/lib/json_print_math.c
--- old/iproute2-6.17.0/lib/json_print_math.c   2025-09-29 16:43:02.000000000 
+0200
+++ new/iproute2-6.18.0/lib/json_print_math.c   2025-12-01 17:47:16.000000000 
+0100
@@ -7,25 +7,28 @@
 #include "utils.h"
 #include "json_print.h"
 
-char *sprint_size(__u32 sz, char *buf)
+char *sprint_size(__u64 sz, char *buf)
 {
        long kilo = 1024;
        long mega = kilo * kilo;
+       long giga = mega * kilo;
        size_t len = SPRINT_BSIZE - 1;
        double tmp = sz;
 
-       if (sz >= mega && fabs(mega * rint(tmp / mega) - sz) < 1024)
+       if (sz >= giga && fabs(giga * rint(tmp / giga) - sz) < 1024)
+               snprintf(buf, len, "%gGb", rint(tmp / giga));
+       else if (sz >= mega && fabs(mega * rint(tmp / mega) - sz) < 1024)
                snprintf(buf, len, "%gMb", rint(tmp / mega));
        else if (sz >= kilo && fabs(kilo * rint(tmp / kilo) - sz) < 16)
                snprintf(buf, len, "%gKb", rint(tmp / kilo));
        else
-               snprintf(buf, len, "%ub", sz);
+               snprintf(buf, len, "%llub", sz);
 
        return buf;
 }
 
 int print_color_size(enum output_type type, enum color_attr color,
-                    const char *key, const char *fmt, __u32 sz)
+                    const char *key, const char *fmt, __u64 sz)
 {
        SPRINT_BUF(buf);
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/iproute2-6.17.0/lib/utils_math.c 
new/iproute2-6.18.0/lib/utils_math.c
--- old/iproute2-6.17.0/lib/utils_math.c        2025-09-29 16:43:02.000000000 
+0200
+++ new/iproute2-6.18.0/lib/utils_math.c        2025-12-01 17:47:16.000000000 
+0100
@@ -87,7 +87,7 @@
        return 0;
 }
 
-int get_size(unsigned int *size, const char *str)
+int get_size64(__u64 *size, const char *str)
 {
        double sz;
        char *p;
@@ -120,4 +120,21 @@
                return -1;
 
        return 0;
+}
+
+int get_size(unsigned int *size, const char *str)
+{
+       __u64 sz64;
+       int rv;
+
+       rv = get_size64(&sz64, str);
+       *size = sz64;
+
+       if (rv)
+               return rv;
+
+       if (sz64 > UINT_MAX)
+               return -1;
+
+       return 0;
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/iproute2-6.17.0/man/man8/ip-link.8.in 
new/iproute2-6.18.0/man/man8/ip-link.8.in
--- old/iproute2-6.17.0/man/man8/ip-link.8.in   2025-09-29 16:43:02.000000000 
+0200
+++ new/iproute2-6.18.0/man/man8/ip-link.8.in   2025-12-01 17:47:16.000000000 
+0100
@@ -1725,6 +1725,8 @@
 ] [
 .BI no_linklocal_learn " NO_LINKLOCAL_LEARN "
 ] [
+.BI fdb_local_vlan_0 " FDB_LOCAL_VLAN_0 "
+] [
 .BI fdb_max_learned " FDB_MAX_LEARNED "
 ] [
 .BI vlan_filtering " VLAN_FILTERING "
@@ -1852,6 +1854,19 @@
 When disabled, the bridge will not learn from link-local frames (default:
 enabled).
 
+.BI fdb_local_vlan_0 " FDB_LOCAL_VLAN_0 "
+When disabled, local FDB entries (i.e. those for member port addresses and
+address of the bridge itself) are kept at VLAN 0 as well as any member VLANs.
+When the option is enabled, they are only kept at VLAN 0. By default the
+option is disabled.
+
+When this option is enabled, when making a forwarding decision, the bridge 
looks
+at VLAN 0 for a matching entry that is permanent, but not added by user. 
However
+in all other ways the entry only exists on VLAN 0. This affects dumping, where
+the entries are not shown on non-0 VLANs, and FDB get and flush do not find the
+entry on non-0 VLANs. When the entry is deleted, it affects forwarding on all
+VLANs.
+
 .BI fdb_max_learned " FDB_MAX_LEARNED "
 - set the maximum number of learned FDB entries. If
 .RI ( FDB_MAX_LEARNED " == 0) "
@@ -2846,6 +2861,12 @@
 (a 32bit signed value). This option only valid for active-backup(1),
 balance-tlb (5) and balance-alb (6) mode.
 
+.sp
+.BI actor_port_prio " PRIORITY"
+- set the slave's ad actor port priority for 802.3ad aggregation selection
+logic during failover (a 16bit unsigned value). This option only valid for
+802.3ad (4) mode.
+
 .in -8
 
 .TP
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/iproute2-6.17.0/man/man8/netshaper.8 
new/iproute2-6.18.0/man/man8/netshaper.8
--- old/iproute2-6.17.0/man/man8/netshaper.8    1970-01-01 01:00:00.000000000 
+0100
+++ new/iproute2-6.18.0/man/man8/netshaper.8    2025-12-01 17:47:16.000000000 
+0100
@@ -0,0 +1,215 @@
+.TH NETSHAPER 8 "7 Oct 2025" "iproute2" "Linux"
+.SH NAME
+netshaper \- show / manipulate network device hardware shaping configuration
+.SH SYNOPSIS
+
+.ad l
+.in +8
+.ti -8
+.B netshaper
+.RI "[ " OPTIONS " ] { " COMMAND " | "
+.BR help " }"
+.sp
+
+.ti -8
+.IR OPTIONS " := { "
+\fB\-V\fR[\fIersion\fR] |
+\fB\-c\fR[\fIolor\fR] |
+\fB\-help\fR }
+
+.ti -8
+.B "netshaper set"
+.B dev
+.IR DEV
+.B handle scope
+.IR HANDLE_SCOPE
+.RI "[ " id
+.IR HANDLE_ID " ]"
+.B bw-max
+.IR BW_MAX
+
+.ti -8
+.B "netshaper" " { " show " | " delete " }"
+.B dev
+.IR DEV
+.B handle scope
+.IR HANDLE_SCOPE
+.RI "[ " id
+.IR HANDLE_ID " ]"
+
+.SH DESCRIPTION
+.B netshaper
+allows configuration and management of hardware rate limiting (shaping) 
capabilities
+available on network devices. The API provides control over shapers at 
different levels
+including network devices, queues, and scheduling nodes, enabling manipulation 
of the
+device's scheduling tree.
+
+Each shaper is uniquely identified within a device by a
+.IR handle ,
+which consists of a
+.I scope
+and an optional
+.IR id .
+Depending on the scope value, shapers are attached to specific hardware 
objects:
+
+.TP
+.B netdev
+Shapers attached to the entire network device. The
+.I id
+parameter is optional for this scope (defaults to 0 if not specified).
+
+.TP
+.B queue
+Shapers attached to specific device queues. The
+.I id
+parameter is required and specifies the queue number.
+
+.TP
+.B node
+Shapers representing scheduling groups that can be placed at arbitrary
+locations in the scheduling tree. The
+.I id
+parameter is required.
+
+.SH COMMANDS
+
+.SS
+.B netshaper set
+- Create or update a shaper configuration
+
+Creates or updates a shaper with the specified parameters. All parameters 
except
+.I id
+(for netdev scope) are required.
+
+.SS
+.B netshaper show
+- Display shaper information
+
+Shows the current configuration of the specified shaper, including bandwidth
+limits and device information.
+
+.SS
+.B netshaper delete
+- Remove a shaper configuration
+
+Removes the specified shaper configuration from the device.
+
+.SH PARAMETERS
+
+.TP
+.BI dev " DEV"
+Specifies the network device name on which to operate.
+
+.TP
+.B handle
+Defines the shaper handle consisting of:
+
+.RS
+.TP
+.BI scope " HANDLE_SCOPE"
+The shaper scope, which can be:
+.BR netdev " (device-level shaper), "
+.BR queue " (queue-level shaper), or "
+.BR node " (scheduling node shaper)."
+
+.TP
+.BI id " HANDLE_ID"
+Numeric identifier for the shaper. Optional for
+.B netdev
+scope (defaults to 0), required for
+.B queue
+and
+.B node
+scopes.
+.RE
+
+.TP
+.BI bw-max " BW_MAX"
+Maximum bandwidth limit for the shaper. Accepts values with suffixes:
+.BR kbit ", " mbit ", " gbit
+for kilobits, megabits, and gigabits per second respectively.
+
+.SH OPTIONS
+
+.TP
+.BR \-V ", " \-Version
+Print the version of the
+.B netshaper
+utility and exit.
+
+.TP
+.BR \-c [ color "] = {" always " | " auto " | " never }
+Configure color output. If parameter is omitted or
+.BR always ,
+color output is enabled regardless of stdout state. If parameter is
+.BR auto ,
+stdout is checked to be a terminal before enabling color output. If parameter 
is
+.BR never ,
+color output is disabled. If specified multiple times, the last one takes
+precedence.
+
+.TP
+.B \-help
+Display usage information and exit.
+
+.SH EXAMPLES
+
+.TP
+.B Example 1: Create a device-level shaper (id optional)
+.nf
+# netshaper set dev foo handle scope netdev bw-max 10gbit
+.fi
+.RS
+Creates a netdev-scoped shaper with default id 0 and sets the maximum
+bandwidth to 10 gigabits per second.
+.RE
+
+.TP
+.B Example 2: Show shaper configuration
+.nf
+# netshaper show dev foo handle scope netdev
+.fi
+.RS
+Display the current shaper configuration for the specified device and handle.
+.RE
+
+.TP
+.B Example 3: Delete shaper configuration
+.nf
+# netshaper delete dev eth0 handle scope netdev
+.fi
+.RS
+Remove the specified shaper configuration.
+.RE
+
+.SH NOTES
+.IP \(bu
+For
+.B netdev
+scope, the
+.I id
+parameter is optional and defaults to 0 if not specified.
+.IP \(bu
+For
+.B queue
+and
+.B node
+scopes, the
+.I id
+parameter is required.
+.IP \(bu
+Bandwidth values support standard suffixes:
+.BR kbit " (kilobits per second), "
+.BR mbit " (megabits per second), "
+.BR gbit " (gigabits per second)."
+.IP \(bu
+This command currently supports basic shaper operations. Additional
+functionality will be added as requirements are identified.
+
+.SH SEE ALSO
+.BR ip (8),
+.BR ip-link (8),
+.BR tc (8)
+
+.SH AUTHOR
+Erni Sri Satya Vennela <[email protected]>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/iproute2-6.17.0/netshaper/.gitignore 
new/iproute2-6.18.0/netshaper/.gitignore
--- old/iproute2-6.17.0/netshaper/.gitignore    1970-01-01 01:00:00.000000000 
+0100
+++ new/iproute2-6.18.0/netshaper/.gitignore    2025-12-01 17:47:16.000000000 
+0100
@@ -0,0 +1 @@
+netshaper
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/iproute2-6.17.0/netshaper/Makefile 
new/iproute2-6.18.0/netshaper/Makefile
--- old/iproute2-6.17.0/netshaper/Makefile      1970-01-01 01:00:00.000000000 
+0100
+++ new/iproute2-6.18.0/netshaper/Makefile      2025-12-01 17:47:16.000000000 
+0100
@@ -0,0 +1,19 @@
+# SPDX-License-Identifier: GPL-2.0
+include ../config.mk
+
+NSOBJ = netshaper.o
+TARGETS += netshaper
+LDLIBS += -lm
+
+all: $(TARGETS) $(LIBS)
+
+netshaper: $(NSOBJ)
+       $(QUIET_LINK)$(CC) $^ $(LDFLAGS) $(LDLIBS) -o $@
+
+install: all
+       for i in $(TARGETS); \
+       do install -m 0755 $$i $(DESTDIR)$(SBINDIR); \
+       done
+
+clean:
+       rm -f $(NSOBJ) $(TARGETS)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/iproute2-6.17.0/netshaper/netshaper.c 
new/iproute2-6.18.0/netshaper/netshaper.c
--- old/iproute2-6.17.0/netshaper/netshaper.c   1970-01-01 01:00:00.000000000 
+0100
+++ new/iproute2-6.18.0/netshaper/netshaper.c   2025-12-01 17:47:16.000000000 
+0100
@@ -0,0 +1,276 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * iplink_netshaper.c netshaper H/W shaping support
+ *
+ * Authors:        Erni Sri Satya Vennela <[email protected]>
+ */
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <stdbool.h>
+
+#include <linux/genetlink.h>
+#include <linux/netlink.h>
+#include <linux/rtnetlink.h>
+#include <linux/net_shaper.h>
+
+#include "version.h"
+#include "utils.h"
+#include "ll_map.h"
+#include "color.h"
+#include "json_print.h"
+#include "libgenl.h"
+#include "libnetlink.h"
+
+/* netlink socket */
+static struct rtnl_handle gen_rth = { .fd = -1 };
+static int genl_family = -1;
+
+static void usage(void)
+{
+       fprintf(stderr,
+               "Usage: netshaper [ OPTIONS ] { COMMAND | help }\n"
+               "OPTIONS := { -V[ersion] | -c[olor] | -help }\n"
+               "COMMAND := { set | get | delete } dev DEVNAME\n"
+               "           handle scope HANDLE_SCOPE [id HANDLE_ID]\n"
+               "           [bw-max BW_MAX]\n"
+               "Where: DEVNAME         := STRING\n"
+               "       HANDLE_SCOPE    := { netdev | queue | node }\n"
+               "       HANDLE_ID       := UINT (required for queue/node, 
optional for netdev)\n"
+               "       BW_MAX          := UINT{ kbit | mbit | gbit }\n");
+}
+
+static const char *net_shaper_scope_names[NET_SHAPER_SCOPE_MAX + 1] = {
+       "unspec",
+       "netdev",
+       "queue",
+       "node"
+};
+
+static void print_netshaper_attrs(struct nlmsghdr *answer)
+{
+       struct genlmsghdr *ghdr = NLMSG_DATA(answer);
+       int len = answer->nlmsg_len - NLMSG_LENGTH(GENL_HDRLEN);
+       struct rtattr *tb[NET_SHAPER_A_MAX + 1] = {};
+       struct rtattr *handle_tb[NET_SHAPER_A_HANDLE_MAX + 1] = {};
+       __u32 bw_max_mbps, scope, id;
+       __u64 bw_max_bps;
+       int ifindex;
+
+       parse_rtattr_flags(tb, NET_SHAPER_A_MAX,
+                          (struct rtattr *)((char *)ghdr + GENL_HDRLEN),
+                          len, NLA_F_NESTED);
+
+       for (int i = 1; i <= NET_SHAPER_A_MAX; ++i) {
+               if (!tb[i])
+                       continue;
+               switch (i) {
+               case NET_SHAPER_A_BW_MAX:
+                       bw_max_bps = rta_getattr_uint(tb[i]);
+                       bw_max_mbps = (bw_max_bps / 1000000);
+
+                       print_uint(PRINT_ANY, "bw-max", "bw-max: %u mbps\n",
+                                  bw_max_mbps);
+                       break;
+               case NET_SHAPER_A_IFINDEX:
+                       ifindex = rta_getattr_u32(tb[i]);
+                       print_color_string(PRINT_ANY, COLOR_IFNAME, "dev",
+                                          "dev: %s\n",
+                                          ll_index_to_name(ifindex));
+                       break;
+               case NET_SHAPER_A_HANDLE:
+                       parse_rtattr_nested(handle_tb, NET_SHAPER_A_HANDLE_MAX,
+                                           tb[NET_SHAPER_A_HANDLE]);
+                       if (handle_tb[NET_SHAPER_A_HANDLE_SCOPE]) {
+                               scope = 
rta_getattr_u32(handle_tb[NET_SHAPER_A_HANDLE_SCOPE]);
+                               print_string(PRINT_ANY, "scope",
+                                            "scope: %s\n",
+                                            net_shaper_scope_names[scope]);
+                       }
+                       if (handle_tb[NET_SHAPER_A_HANDLE_ID]) {
+                               id = 
rta_getattr_u32(handle_tb[NET_SHAPER_A_HANDLE_ID]);
+                               print_uint(PRINT_ANY, "id", "id: %u\n", id);
+                       }
+                       break;
+               default:
+                       break;
+               }
+       }
+}
+
+static int do_cmd(int argc, char **argv, int cmd)
+{
+       GENL_REQUEST(req, 1024, genl_family, 0, NET_SHAPER_FAMILY_VERSION, cmd,
+                    NLM_F_REQUEST | NLM_F_ACK);
+
+       struct nlmsghdr *answer;
+       __u64 bw_max_bps = 0;
+       int ifindex = -1;
+       int handle_scope = NET_SHAPER_SCOPE_UNSPEC;
+       __u32 handle_id = 0;
+       bool handle_present = false;
+       int err;
+
+       while (argc > 0) {
+               if (strcmp(*argv, "dev") == 0) {
+                       NEXT_ARG();
+                       ifindex = ll_name_to_index(*argv);
+               } else if (strcmp(*argv, "bw-max") == 0) {
+                       NEXT_ARG();
+                       if (get_rate64(&bw_max_bps, *argv)) {
+                               fprintf(stderr, "Invalid bw-max value\n");
+                               return -1;
+                       }
+                       /* Convert Bps to bps */
+                       bw_max_bps *= 8;
+               } else if (strcmp(*argv, "handle") == 0) {
+                       handle_present = true;
+                       NEXT_ARG();
+
+                       if (strcmp(*argv, "scope") != 0) {
+                               fprintf(stderr, "What is \"%s\"\n", *argv);
+                               usage();
+                               return -1;
+                       }
+                       NEXT_ARG();
+
+                       if (strcmp(*argv, "netdev") == 0) {
+                               handle_scope = NET_SHAPER_SCOPE_NETDEV;
+                               /* For netdev scope, id is optional - check if 
next arg is "id" */
+                               if (argc > 1 && strcmp(argv[1], "id") == 0) {
+                                       NEXT_ARG(); /* move to "id" */
+                                       NEXT_ARG(); /* move to id value */
+                                       if (get_unsigned(&handle_id, *argv, 
10)) {
+                                               fprintf(stderr, "Invalid handle 
id\n");
+                                               return -1;
+                                       }
+                               }
+                       } else if (strcmp(*argv, "queue") == 0) {
+                               handle_scope = NET_SHAPER_SCOPE_QUEUE;
+                               /* For queue scope, id is required */
+                               NEXT_ARG();
+                               if (strcmp(*argv, "id") != 0) {
+                                       fprintf(stderr, "What is \"%s\"\n", 
*argv);
+                                       usage();
+                                       return -1;
+                               }
+                               NEXT_ARG();
+                               if (get_unsigned(&handle_id, *argv, 10)) {
+                                       fprintf(stderr, "Invalid handle id\n");
+                                       return -1;
+                               }
+                       } else if (strcmp(*argv, "node") == 0) {
+                               handle_scope = NET_SHAPER_SCOPE_NODE;
+                               /* For node scope, id is required */
+                               NEXT_ARG();
+                               if (strcmp(*argv, "id") != 0) {
+                                       fprintf(stderr, "What is \"%s\"\n", 
*argv);
+                                       usage();
+                                       return -1;
+                               }
+                               NEXT_ARG();
+                               if (get_unsigned(&handle_id, *argv, 10)) {
+                                       fprintf(stderr, "Invalid handle id\n");
+                                       return -1;
+                               }
+                       } else {
+                               fprintf(stderr, "Invalid scope\n");
+                               return -1;
+                       }
+               } else {
+                       fprintf(stderr, "What is \"%s\"\n", *argv);
+                       usage();
+                       return -1;
+               }
+               argc--;
+               argv++;
+       }
+
+       if (ifindex == -1)
+               missarg("dev");
+
+       if (!handle_present)
+               missarg("handle");
+
+       if (cmd == NET_SHAPER_CMD_SET && bw_max_bps == 0)
+               missarg("bw-max");
+
+       addattr32(&req.n, sizeof(req), NET_SHAPER_A_IFINDEX, ifindex);
+
+       struct rtattr *handle = addattr_nest(&req.n, sizeof(req),
+                                            NET_SHAPER_A_HANDLE | 
NLA_F_NESTED);
+       addattr32(&req.n, sizeof(req), NET_SHAPER_A_HANDLE_SCOPE, handle_scope);
+       addattr32(&req.n, sizeof(req), NET_SHAPER_A_HANDLE_ID, handle_id);
+       addattr_nest_end(&req.n, handle);
+
+       if (cmd == NET_SHAPER_CMD_SET)
+               addattr64(&req.n, sizeof(req), NET_SHAPER_A_BW_MAX, bw_max_bps);
+
+       err = rtnl_talk(&gen_rth, &req.n, &answer);
+       if (err < 0) {
+               printf("Kernel command failed: %d\n", err);
+               return err;
+       }
+
+       if (cmd == NET_SHAPER_CMD_GET)
+               print_netshaper_attrs(answer);
+
+       return err;
+}
+
+int main(int argc, char **argv)
+{
+       int color = default_color_opt();
+
+       while (argc > 1) {
+               const char *opt = argv[1];
+
+               if (opt[0] != '-')
+                       break;
+               if (opt[1] == '-')
+                       opt++;
+
+               if (strcmp(opt, "-help") == 0) {
+                       usage();
+                       exit(0);
+               } else if (strcmp(opt, "-Version") == 0 ||
+                          strcmp(opt, "-V") == 0) {
+                       printf("netshaper utility, %s\n", version);
+                       exit(0);
+               } else if (matches_color(opt, &color)) {
+               } else {
+                       fprintf(stderr,
+                               "Option \"%s\" is unknown, try \"netshaper 
help\".\n",
+                               opt);
+                       exit(-1);
+               }
+               argc--; argv++;
+       }
+
+       check_enable_color(color, 0);
+
+       if (genl_init_handle(&gen_rth, NET_SHAPER_FAMILY_NAME, &genl_family))
+               exit(1);
+
+       if (argc > 1) {
+               argc--;
+               argv++;
+
+               if (strcmp(*argv, "set") == 0)
+                       return do_cmd(argc - 1, argv + 1, NET_SHAPER_CMD_SET);
+               if (strcmp(*argv, "delete") == 0)
+                       return do_cmd(argc - 1, argv + 1, 
NET_SHAPER_CMD_DELETE);
+               if (strcmp(*argv, "show") == 0)
+                       return do_cmd(argc - 1, argv + 1, NET_SHAPER_CMD_GET);
+               if (strcmp(*argv, "help") == 0) {
+                       usage();
+                       return 0;
+               }
+               fprintf(stderr,
+                       "Command \"%s\" is unknown, try \"netshaper help\".\n",
+                       *argv);
+               exit(-1);
+       }
+       usage();
+       exit(-1);
+}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/iproute2-6.17.0/rdma/include/uapi/rdma/ib_user_sa.h 
new/iproute2-6.18.0/rdma/include/uapi/rdma/ib_user_sa.h
--- old/iproute2-6.17.0/rdma/include/uapi/rdma/ib_user_sa.h     2025-09-29 
16:43:02.000000000 +0200
+++ new/iproute2-6.18.0/rdma/include/uapi/rdma/ib_user_sa.h     2025-12-01 
17:47:16.000000000 +0100
@@ -74,4 +74,18 @@
        __u8    preference;
 };
 
+struct ib_user_service_rec {
+       __be64  id;
+       __u8    gid[16];
+       __be16  pkey;
+       __u8    reserved[2];
+       __be32  lease;
+       __u8    key[16];
+       __u8    name[64];
+       __u8    data_8[16];
+       __be16  data_16[8];
+       __be32  data_32[4];
+       __be64  data_64[2];
+};
+
 #endif /* IB_USER_SA_H */
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/iproute2-6.17.0/rdma/include/uapi/rdma/rdma_user_cm.h 
new/iproute2-6.18.0/rdma/include/uapi/rdma/rdma_user_cm.h
--- old/iproute2-6.17.0/rdma/include/uapi/rdma/rdma_user_cm.h   2025-09-29 
16:43:02.000000000 +0200
+++ new/iproute2-6.18.0/rdma/include/uapi/rdma/rdma_user_cm.h   2025-12-01 
17:47:16.000000000 +0100
@@ -67,7 +67,9 @@
        RDMA_USER_CM_CMD_QUERY,
        RDMA_USER_CM_CMD_BIND,
        RDMA_USER_CM_CMD_RESOLVE_ADDR,
-       RDMA_USER_CM_CMD_JOIN_MCAST
+       RDMA_USER_CM_CMD_JOIN_MCAST,
+       RDMA_USER_CM_CMD_RESOLVE_IB_SERVICE,
+       RDMA_USER_CM_CMD_WRITE_CM_EVENT,
 };
 
 /* See IBTA Annex A11, servies ID bytes 4 & 5 */
@@ -147,7 +149,8 @@
 enum {
        RDMA_USER_CM_QUERY_ADDR,
        RDMA_USER_CM_QUERY_PATH,
-       RDMA_USER_CM_QUERY_GID
+       RDMA_USER_CM_QUERY_GID,
+       RDMA_USER_CM_QUERY_IB_SERVICE
 };
 
 struct rdma_ucm_query {
@@ -187,6 +190,11 @@
        struct ib_path_rec_data path_data[];
 };
 
+struct rdma_ucm_query_ib_service_resp {
+       __u32 num_service_recs;
+       struct ib_user_service_rec recs[];
+};
+
 struct rdma_ucm_conn_param {
        __u32 qp_num;
        __u32 qkey;
@@ -297,6 +305,7 @@
        union {
                struct rdma_ucm_conn_param conn;
                struct rdma_ucm_ud_param   ud;
+               __u32 arg32[2];
        } param;
        __u32 reserved;
        struct rdma_ucm_ece ece;
@@ -338,4 +347,33 @@
        __u32 events_reported;
 };
 
+enum {
+       RDMA_USER_CM_IB_SERVICE_FLAG_ID = 1 << 0,
+       RDMA_USER_CM_IB_SERVICE_FLAG_NAME = 1 << 1,
+};
+
+#define RDMA_USER_CM_IB_SERVICE_NAME_SIZE 64
+struct rdma_ucm_ib_service {
+       __u64 service_id;
+       __u8  service_name[RDMA_USER_CM_IB_SERVICE_NAME_SIZE];
+       __u32 flags;
+       __u32 reserved;
+};
+
+struct rdma_ucm_resolve_ib_service {
+       __u32 id;
+       struct rdma_ucm_ib_service ibs;
+};
+
+struct rdma_ucm_write_cm_event {
+       __u32 id;
+       __u32 reserved;
+       __u32 event;
+       __u32 status;
+       union {
+               struct rdma_ucm_conn_param conn;
+               struct rdma_ucm_ud_param ud;
+               __u64 arg;
+       } param;
+};
 #endif /* RDMA_USER_CM_H */
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/iproute2-6.17.0/scripts/iproute2-import-uapi 
new/iproute2-6.18.0/scripts/iproute2-import-uapi
--- old/iproute2-6.17.0/scripts/iproute2-import-uapi    1970-01-01 
01:00:00.000000000 +0100
+++ new/iproute2-6.18.0/scripts/iproute2-import-uapi    2025-12-01 
17:47:16.000000000 +0100
@@ -0,0 +1,67 @@
+#!/bin/bash -e
+#
+# iproute2-import-uapi [commit]
+#
+# Imports sanitized copies of kernel uapi headers from <commit> (can be
+# a commit id, a tag or a branch name). If the argument is omitted,
+# commit currently checked out in the kernel repository is used.
+
+sn="${0##*/}"
+export ARCH="x86_64"
+mkopt="-j$(nproc)" || mkopt=''
+
+if [ ! -d "$LINUX_GIT" ]; then
+    echo "${sn}: please set LINUX_GIT to the location of kernel git" >&2
+    exit 1
+fi
+
+pushd "$LINUX_GIT"
+if [ -n "$1" ]; then
+    git checkout "$1"
+fi
+desc=$(git describe --exact-match 2>/dev/null \
+       || git show -s --abbrev=12 --pretty='%h: ("%s")')
+kobj=$(mktemp -d)
+make $mkopt O="$kobj" allmodconfig
+make $mkopt O="$kobj" prepare
+make $mkopt O="$kobj" INSTALL_HDR_PATH="${kobj}/hdr" headers_install
+popd
+
+pushd include/uapi
+find . -type f -name '*.h' -exec cp -v "${kobj}/hdr/include/{}" {} \;
+
+go_on=true
+while $go_on; do
+    go_on=false
+    while read f; do
+        if [ "${f#asm/}" != "$f" ]; then
+            # skip architecture dependent asm/ headers
+            continue
+        fi
+        if [ -f "$f" ]; then
+            # already present
+            continue
+        fi
+       if [ ! -f "${kobj}/hdr/include/${f}" ]; then
+            # not a kernel header
+            continue
+        fi
+        echo "+ add $f"
+        go_on=true
+        mkdir -p "${f%/*}"
+        cp "${kobj}/hdr/include/${f}" "${f}"
+    done < <(
+        find . -type f -name '*.[ch]' -exec sed -nre 
'\_^[[:blank:]]*#include[[:blank:]]<.+>_ { 
s_^[[:blank:]]*#include[[:blank:]]<([^>]*)>.*$_\1_ ; p }' {} \; \
+            | LC_ALL=C sort -u
+    )
+done
+popd
+rm -rf "$kobj"
+
+git add include/uapi
+git commit -s -F - <<EOT
+Update kernel headers
+
+Update kernel headers to commit:
+       ${desc}
+EOT
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/iproute2-6.17.0/tc/m_police.c 
new/iproute2-6.18.0/tc/m_police.c
--- old/iproute2-6.17.0/tc/m_police.c   2025-09-29 16:43:02.000000000 +0200
+++ new/iproute2-6.18.0/tc/m_police.c   2025-12-01 17:47:16.000000000 +0100
@@ -54,12 +54,12 @@
        __u32 ptab[256];
        __u32 avrate = 0;
        int presult = 0;
-       unsigned buffer = 0, mtu = 0, mpu = 0;
+       unsigned mtu = 0, mpu = 0;
        unsigned short overhead = 0;
        unsigned int linklayer = LINKLAYER_ETHERNET; /* Assume ethernet */
        int Rcell_log =  -1, Pcell_log = -1;
        struct rtattr *tail;
-       __u64 rate64 = 0, prate64 = 0;
+       __u64 rate64 = 0, prate64 = 0, buffer64 = 0;
        __u64 pps64 = 0, ppsburst64 = 0;
 
        if (a) /* new way of doing things */
@@ -78,9 +78,10 @@
                        strcmp(*argv, "buffer") == 0 ||
                        strcmp(*argv, "maxburst") == 0) {
                        NEXT_ARG();
-                       if (buffer)
+                       if (buffer64)
                                duparg("buffer/burst", *argv);
-                       if (get_size_and_cell(&buffer, &Rcell_log, *argv) < 0)
+                       if (get_size64_and_cell(&buffer64, &Rcell_log,
+                                               *argv) < 0)
                                invarg("buffer", *argv);
                } else if (strcmp(*argv, "mtu") == 0 ||
                           strcmp(*argv, "minburst") == 0) {
@@ -173,7 +174,7 @@
        }
 
        /* When the TB policer is used, burst is required */
-       if (rate64 && !buffer && !avrate) {
+       if (rate64 && !buffer64 && !avrate) {
                fprintf(stderr, "'burst' requires 'rate'.\n");
                return -1;
        }
@@ -210,7 +211,11 @@
                        fprintf(stderr, "POLICE: failed to calculate rate 
table.\n");
                        return -1;
                }
-               p.burst = tc_calc_xmittime(rate64, buffer);
+               p.burst = tc_calc_xmittime(rate64, buffer64);
+               if (p.burst == UINT_MAX) {
+                       fprintf(stderr, "POLICE: burst out of range\n");
+                       return -1;
+               }
        }
        p.mtu = mtu;
        if (prate64) {
@@ -265,9 +270,8 @@
        SPRINT_BUF(b2);
        struct tc_police *p;
        struct rtattr *tb[TCA_POLICE_MAX+1];
-       unsigned int buffer;
        unsigned int linklayer;
-       __u64 rate64, prate64;
+       __u64 rate64, prate64, buffer64;
        __u64 pps64, ppsburst64;
 
        print_string(PRINT_JSON, "kind", "%s", "police");
@@ -296,8 +300,8 @@
        print_hex(PRINT_FP, NULL, " police 0x%x ", p->index);
        print_uint(PRINT_JSON, "index", NULL, p->index);
        tc_print_rate(PRINT_FP, NULL, "rate %s ", rate64);
-       buffer = tc_calc_xmitsize(rate64, p->burst);
-       print_size(PRINT_FP, NULL, "burst %s ", buffer);
+       buffer64 = tc_calc_xmitsize(rate64, p->burst);
+       print_size(PRINT_FP, NULL, "burst %s ", buffer64);
        print_size(PRINT_FP, NULL, "mtu %s ", p->mtu);
        if (show_raw)
                print_hex(PRINT_FP, NULL, "[%08x] ", p->burst);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/iproute2-6.17.0/tc/tc_core.c 
new/iproute2-6.18.0/tc/tc_core.c
--- old/iproute2-6.17.0/tc/tc_core.c    2025-09-29 16:43:02.000000000 +0200
+++ new/iproute2-6.18.0/tc/tc_core.c    2025-12-01 17:47:16.000000000 +0100
@@ -43,12 +43,15 @@
        return ktime / clock_factor;
 }
 
-unsigned int tc_calc_xmittime(__u64 rate, unsigned int size)
+unsigned int tc_calc_xmittime(__u64 rate, __u64 size)
 {
-       return 
ceil(tc_core_time2tick(TIME_UNITS_PER_SEC*((double)size/(double)rate)));
+       double val;
+
+       val = 
ceil(tc_core_time2tick(TIME_UNITS_PER_SEC*((double)size/(double)rate)));
+       return val > UINT_MAX ? UINT_MAX : val;
 }
 
-unsigned int tc_calc_xmitsize(__u64 rate, unsigned int ticks)
+__u64 tc_calc_xmitsize(__u64 rate, unsigned int ticks)
 {
        return ((double)rate*tc_core_tick2time(ticks))/TIME_UNITS_PER_SEC;
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/iproute2-6.17.0/tc/tc_core.h 
new/iproute2-6.18.0/tc/tc_core.h
--- old/iproute2-6.17.0/tc/tc_core.h    2025-09-29 16:43:02.000000000 +0200
+++ new/iproute2-6.18.0/tc/tc_core.h    2025-12-01 17:47:16.000000000 +0100
@@ -15,8 +15,8 @@
 double tc_core_tick2time(double tick);
 unsigned tc_core_time2ktime(unsigned time);
 unsigned tc_core_ktime2time(unsigned ktime);
-unsigned tc_calc_xmittime(__u64 rate, unsigned size);
-unsigned tc_calc_xmitsize(__u64 rate, unsigned ticks);
+unsigned tc_calc_xmittime(__u64 rate, __u64 size);
+__u64 tc_calc_xmitsize(__u64 rate, unsigned ticks);
 int tc_calc_rtable(struct tc_ratespec *r, __u32 *rtab,
                   int cell_log, unsigned mtu, enum link_layer link_layer);
 int tc_calc_rtable_64(struct tc_ratespec *r, __u32 *rtab,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/iproute2-6.17.0/tc/tc_util.c 
new/iproute2-6.18.0/tc/tc_util.c
--- old/iproute2-6.17.0/tc/tc_util.c    2025-09-29 16:43:02.000000000 +0200
+++ new/iproute2-6.18.0/tc/tc_util.c    2025-12-01 17:47:16.000000000 +0100
@@ -257,14 +257,14 @@
        print_rate(use_iec, t, key, fmt, rate);
 }
 
-int get_size_and_cell(unsigned int *size, int *cell_log, char *str)
+int get_size64_and_cell(__u64 *size, int *cell_log, char *str)
 {
        char *slash = strchr(str, '/');
 
        if (slash)
                *slash = 0;
 
-       if (get_size(size, str))
+       if (get_size64(size, str))
                return -1;
 
        if (slash) {
@@ -286,6 +286,23 @@
        return 0;
 }
 
+int get_size_and_cell(unsigned int *size, int *cell_log, char *str)
+{
+       __u64 size64;
+       int rv;
+
+       rv = get_size64_and_cell(&size64, cell_log, str);
+       if (rv)
+               return rv;
+
+       if (size64 > UINT32_MAX)
+               return -1;
+
+       *size = size64;
+
+       return 0;
+}
+
 void print_devname(enum output_type type, int ifindex)
 {
        const char *ifname = ll_index_to_name(ifindex);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/iproute2-6.17.0/tc/tc_util.h 
new/iproute2-6.18.0/tc/tc_util.h
--- old/iproute2-6.17.0/tc/tc_util.h    2025-09-29 16:43:02.000000000 +0200
+++ new/iproute2-6.18.0/tc/tc_util.h    2025-12-01 17:47:16.000000000 +0100
@@ -80,6 +80,7 @@
 int get_percent_rate(unsigned int *rate, const char *str, const char *dev);
 int get_percent_rate64(__u64 *rate, const char *str, const char *dev);
 int get_size_and_cell(unsigned int *size, int *cell_log, char *str);
+int get_size64_and_cell(__u64 *size, int *cell_log, char *str);
 int get_linklayer(unsigned int *val, const char *arg);
 
 void tc_print_rate(enum output_type t, const char *key, const char *fmt,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/iproute2-6.17.0/vdpa/include/uapi/linux/virtio_ids.h 
new/iproute2-6.18.0/vdpa/include/uapi/linux/virtio_ids.h
--- old/iproute2-6.17.0/vdpa/include/uapi/linux/virtio_ids.h    2025-09-29 
16:43:02.000000000 +0200
+++ new/iproute2-6.18.0/vdpa/include/uapi/linux/virtio_ids.h    2025-12-01 
17:47:16.000000000 +0100
@@ -68,6 +68,7 @@
 #define VIRTIO_ID_AUDIO_POLICY         39 /* virtio audio policy */
 #define VIRTIO_ID_BT                   40 /* virtio bluetooth */
 #define VIRTIO_ID_GPIO                 41 /* virtio gpio */
+#define VIRTIO_ID_SPI                  45 /* virtio spi */
 
 /*
  * Virtio Transitional IDs

Reply via email to