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
