netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH iproute2-next v3] iproute2: Add 'netshaper' command to 'ip link' for netdev shaping
@ 2025-08-11  7:05 Erni Sri Satya Vennela
  2025-08-11 20:16 ` Haiyang Zhang
                   ` (2 more replies)
  0 siblings, 3 replies; 18+ messages in thread
From: Erni Sri Satya Vennela @ 2025-08-11  7:05 UTC (permalink / raw)
  To: stephen, dsahern, netdev
  Cc: haiyangz, shradhagupta, ssengar, dipayanroy, ernis,
	Erni Sri Satya Vennela

Add support for the netshaper Generic Netlink
family to iproute2. Introduce a new subcommand to `ip link` for
configuring netshaper parameters directly from userspace.

This interface allows users to set shaping attributes (such as speed)
which are passed to the kernel to perform the corresponding netshaper
operation.

Example usage:
$ip link netshaper { set | get | delete } dev DEVNAME \
                   handle scope SCOPE id ID \
                   [ speed SPEED ]

Internally, this triggers a kernel call to apply the shaping
configuration to the specified network device.

Currently, the tool supports the following functionalities:
- Setting speed in Mbps, enabling bandwidth clamping for
  a network device that support netshaper operations.
- Deleting the current configuration.
- Querying the existing configuration.

Additional netshaper operations will be integrated into the tool
as per requirement.

This change enables easy and scriptable configuration of bandwidth
shaping for  devices that use the netshaper Netlink family.

Corresponding net-next patches:
1) https://lore.kernel.org/all/cover.1728460186.git.pabeni@redhat.com/
2) https://lore.kernel.org/lkml/1750144656-2021-1-git-send-email-ernis@linux.microsoft.com/

Install pkg-config and libmnl* packages to print kernel extack
errors to stdout.

Signed-off-by: Erni Sri Satya Vennela <ernis@linux.microsoft.com>
---
Please add include/uapi/linux/net_shaper.h from kernel source tree
for this patch.
---
Changes in v3:
* Use strcmp instead of matches.
* Use get_rate64 instead get_unsigned for speed parameter.
* Remove speed_mbps in do_cmd() to reduce redundancy.
* Update the usage of speed parameter in the command.
Changes in v2:
* Use color coding for printing device name in stdout.
* Use clang-format to format the code inline.
* Use __u64 for speed_bps.
* Remove include/uapi/linux/netshaper.h file. 
---
 ip/Makefile           |   2 +-
 ip/iplink.c           |  12 +++
 ip/iplink_netshaper.c | 189 ++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 202 insertions(+), 1 deletion(-)
 create mode 100644 ip/iplink_netshaper.c

diff --git a/ip/Makefile b/ip/Makefile
index 3535ba78..18218c3b 100644
--- a/ip/Makefile
+++ b/ip/Makefile
@@ -4,7 +4,7 @@ IPOBJ=ip.o ipaddress.o ipaddrlabel.o iproute.o iprule.o ipnetns.o \
     ipmaddr.o ipmonitor.o ipmroute.o ipprefix.o iptuntap.o iptoken.o \
     ipxfrm.o xfrm_state.o xfrm_policy.o xfrm_monitor.o iplink_dummy.o \
     iplink_ifb.o iplink_nlmon.o iplink_team.o iplink_vcan.o iplink_vxcan.o \
-    iplink_vlan.o link_veth.o link_gre.o iplink_can.o iplink_xdp.o \
+    iplink_vlan.o iplink_netshaper.o link_veth.o link_gre.o iplink_can.o iplink_xdp.o \
     iplink_macvlan.o ipl2tp.o link_vti.o link_vti6.o link_xfrm.o \
     iplink_vxlan.o tcp_metrics.o iplink_ipoib.o ipnetconf.o link_ip6tnl.o \
     link_iptnl.o link_gre6.o iplink_bond.o iplink_bond_slave.o iplink_hsr.o \
diff --git a/ip/iplink.c b/ip/iplink.c
index 59e8caf4..daa4603d 100644
--- a/ip/iplink.c
+++ b/ip/iplink.c
@@ -1509,6 +1509,15 @@ static void do_help(int argc, char **argv)
 		usage();
 }
 
+static int iplink_netshaper(int argc, char **argv)
+{
+	struct link_util *lu;
+
+	lu = get_link_kind("netshaper");
+
+	return lu->parse_opt(lu, argc, argv, NULL);
+}
+
 int do_iplink(int argc, char **argv)
 {
 	if (argc < 1)
@@ -1545,6 +1554,9 @@ int do_iplink(int argc, char **argv)
 	if (matches(*argv, "property") == 0)
 		return iplink_prop(argc-1, argv+1);
 
+	if (strcmp(*argv, "netshaper") == 0)
+		return iplink_netshaper(argc-1, argv+1);
+
 	if (matches(*argv, "help") == 0) {
 		do_help(argc-1, argv+1);
 		return 0;
diff --git a/ip/iplink_netshaper.c b/ip/iplink_netshaper.c
new file mode 100644
index 00000000..30ee6c3e
--- /dev/null
+++ b/ip/iplink_netshaper.c
@@ -0,0 +1,189 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * iplink_netshaper.c netshaper H/W shaping support
+ *
+ * Authors:        Erni Sri Satya Vennela <ernis@linux.microsoft.com>
+ */
+#include <stdio.h>
+#include <string.h>
+#include <linux/genetlink.h>
+#include <linux/netlink.h>
+#include <linux/rtnetlink.h>
+#include <uapi/linux/netshaper.h>
+#include "utils.h"
+#include "ip_common.h"
+#include "libgenl.h"
+
+/* netlink socket */
+static struct rtnl_handle gen_rth = { .fd = -1 };
+static int genl_family = -1;
+
+static void usage(void)
+{
+	fprintf(stderr,
+		"Usage:	ip link netshaper set dev DEVNAME handle scope HANDLE_SCOPE id HANDLE_ID speed SPEED\n"
+		"	ip link netshaper delete dev DEVNAME handle scope HANDLE_SCOPE id HANDLE_ID\n"
+		"	ip link netshaper get dev DEVNAME handle scope HANDLE_SCOPE id HANDLE_ID\n"
+		"Where:	DEVNAME		:= STRING\n"
+		"	HANDLE_SCOPE	:= { netdev | queue | node }\n"
+		"	HANDLE_ID	:= UINT\n"
+		"	SPEED		:= UINT{ kbit | mbit | gbit }\n");
+
+	exit(-1);
+}
+
+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] = {};
+	__u32 speed_mbps;
+	__u64 speed_bps;
+	int ifindex;
+
+	parse_rtattr(tb, NET_SHAPER_A_MAX,
+		     (struct rtattr *)((char *)ghdr + GENL_HDRLEN), len);
+
+	for (int i = 1; i <= NET_SHAPER_A_MAX; ++i) {
+		if (!tb[i])
+			continue;
+		switch (i) {
+		case NET_SHAPER_A_BW_MAX:
+			speed_bps = rta_getattr_u64(tb[i]);
+			speed_mbps = (speed_bps / 1000000);
+			print_uint(PRINT_ANY, "speed", "speed: %u mbps\n",
+				   speed_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;
+		default:
+			break;
+		}
+	}
+}
+
+static int do_cmd(int argc, char **argv, struct nlmsghdr *n, int cmd)
+{
+	GENL_REQUEST(req, 1024, genl_family, 0, NET_SHAPER_FAMILY_VERSION, cmd,
+		     NLM_F_REQUEST | NLM_F_ACK);
+
+	struct nlmsghdr *answer;
+	__u64 speed_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, "speed") == 0) {
+			NEXT_ARG();
+			if(get_rate64(&speed_bps, *argv)) {
+				fprintf(stderr, "Invalid speed value\n");
+				return -1;
+			}
+			/*Convert Bps to bps*/
+			speed_bps *= 8;
+		} else if (strcmp(*argv, "handle") == 0) {
+			handle_present = true;
+			NEXT_ARG();
+			if (strcmp(*argv, "scope") == 0) {
+				NEXT_ARG();
+				if (strcmp(*argv, "netdev") == 0) {
+					handle_scope = NET_SHAPER_SCOPE_NETDEV;
+				} else if (strcmp(*argv, "queue") == 0) {
+					handle_scope = NET_SHAPER_SCOPE_QUEUE;
+				} else if (strcmp(*argv, "node") == 0) {
+					handle_scope = NET_SHAPER_SCOPE_NODE;
+				} else {
+					fprintf(stderr, "Invalid scope\n");
+					return -1;
+				}
+
+				NEXT_ARG();
+				if (strcmp(*argv, "id") == 0) {
+					NEXT_ARG();
+					if (get_unsigned(&handle_id, *argv, 10)) {
+						fprintf(stderr,
+							"Invalid handle id\n");
+						return -1;
+					}
+				}
+			}
+		} else {
+			fprintf(stderr, "What is \"%s\"\n", *argv);
+			usage();
+		}
+		argc--;
+		argv++;
+	}
+
+	if (ifindex == -1)
+		missarg("dev");
+
+	if (!handle_present)
+		missarg("handle");
+
+	if (cmd == NET_SHAPER_CMD_SET && speed_bps == 0)
+		missarg("speed");
+
+	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, speed_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;
+}
+
+static int netshaper_parse_opt(struct link_util *lu, int argc, char **argv,
+			       struct nlmsghdr *n)
+{
+	if (argc < 1)
+		usage();
+	if (strcmp(*argv, "help") == 0)
+		usage();
+
+	if (genl_init_handle(&gen_rth, NET_SHAPER_FAMILY_NAME, &genl_family))
+		exit(1);
+
+	if (strcmp(*argv, "set") == 0)
+		return do_cmd(argc - 1, argv + 1, n, NET_SHAPER_CMD_SET);
+
+	if (strcmp(*argv, "delete") == 0)
+		return do_cmd(argc - 1, argv + 1, n, NET_SHAPER_CMD_DELETE);
+
+	if (strcmp(*argv, "get") == 0)
+		return do_cmd(argc - 1, argv + 1, n, NET_SHAPER_CMD_GET);
+
+	fprintf(stderr,
+		"Command \"%s\" is unknown, try \"ip link netshaper help\".\n",
+		*argv);
+	exit(-1);
+}
+
+struct link_util netshaper_link_util = {
+	.id = "netshaper",
+	.parse_opt = netshaper_parse_opt,
+};
-- 
2.43.0


^ permalink raw reply related	[flat|nested] 18+ messages in thread

* RE: [PATCH iproute2-next v3] iproute2: Add 'netshaper' command to 'ip link' for netdev shaping
  2025-08-11  7:05 [PATCH iproute2-next v3] iproute2: Add 'netshaper' command to 'ip link' for netdev shaping Erni Sri Satya Vennela
@ 2025-08-11 20:16 ` Haiyang Zhang
  2025-08-16 18:05 ` Stephen Hemminger
  2025-08-16 22:55 ` Stephen Hemminger
  2 siblings, 0 replies; 18+ messages in thread
From: Haiyang Zhang @ 2025-08-11 20:16 UTC (permalink / raw)
  To: Erni Sri Satya Vennela, stephen@networkplumber.org,
	dsahern@gmail.com, netdev@vger.kernel.org
  Cc: shradhagupta@linux.microsoft.com, Saurabh Singh Sengar,
	Dipayaan Roy, Erni Sri Satya Vennela



> -----Original Message-----
> From: Erni Sri Satya Vennela <ernis@linux.microsoft.com>
> Sent: Monday, August 11, 2025 3:05 AM
> To: stephen@networkplumber.org; dsahern@gmail.com; netdev@vger.kernel.org
> Cc: Haiyang Zhang <haiyangz@microsoft.com>;
> shradhagupta@linux.microsoft.com; Saurabh Singh Sengar
> <ssengar@microsoft.com>; Dipayaan Roy <dipayanroy@microsoft.com>; Erni Sri
> Satya Vennela <ernis@microsoft.com>; Erni Sri Satya Vennela
> <ernis@linux.microsoft.com>
> Subject: [PATCH iproute2-next v3] iproute2: Add 'netshaper' command to 'ip
> link' for netdev shaping
>
> Add support for the netshaper Generic Netlink
> family to iproute2. Introduce a new subcommand to `ip link` for
> configuring netshaper parameters directly from userspace.
>
> This interface allows users to set shaping attributes (such as speed)
> which are passed to the kernel to perform the corresponding netshaper
> operation.
>
> Example usage:
> $ip link netshaper { set | get | delete } dev DEVNAME \
>                    handle scope SCOPE id ID \
>                    [ speed SPEED ]
>
> Internally, this triggers a kernel call to apply the shaping
> configuration to the specified network device.
>
> Currently, the tool supports the following functionalities:
> - Setting speed in Mbps, enabling bandwidth clamping for
>   a network device that support netshaper operations.
> - Deleting the current configuration.
> - Querying the existing configuration.
>
> Additional netshaper operations will be integrated into the tool
> as per requirement.
>
> This change enables easy and scriptable configuration of bandwidth
> shaping for  devices that use the netshaper Netlink family.
>
> Corresponding net-next patches:
> 1)
> https://lore.ker/
> nel.org%2Fall%2Fcover.1728460186.git.pabeni%40redhat.com%2F&data=05%7C02%7
> Chaiyangz%40microsoft.com%7C0ac998f8db0c4cf31d8208ddd8a5658b%7C72f988bf86f
> 141af91ab2d7cd011db47%7C1%7C0%7C638904927080914227%7CUnknown%7CTWFpbGZsb3d
> 8eyJFbXB0eU1hcGkiOnRydWUsIlYiOiIwLjAuMDAwMCIsIlAiOiJXaW4zMiIsIkFOIjoiTWFpb
> CIsIldUIjoyfQ%3D%3D%7C0%7C%7C%7C&sdata=WY7zqpx5F9Wnf0WbHUIxMDGbwmjwQysjTdD
> cPAZ5jzM%3D&reserved=0
> 2)
> https://lore.ker/
> nel.org%2Flkml%2F1750144656-2021-1-git-send-email-
> ernis%40linux.microsoft.com%2F&data=05%7C02%7Chaiyangz%40microsoft.com%7C0
> ac998f8db0c4cf31d8208ddd8a5658b%7C72f988bf86f141af91ab2d7cd011db47%7C1%7C0
> %7C638904927080928775%7CUnknown%7CTWFpbGZsb3d8eyJFbXB0eU1hcGkiOnRydWUsIlYi
> OiIwLjAuMDAwMCIsIlAiOiJXaW4zMiIsIkFOIjoiTWFpbCIsIldUIjoyfQ%3D%3D%7C0%7C%7C
> %7C&sdata=TmzKYLtKlU%2FphFWfa13toeOmJGAU1RgBBtRvp%2F3Wg5s%3D&reserved=0
>
> Install pkg-config and libmnl* packages to print kernel extack
> errors to stdout.
>
> Signed-off-by: Erni Sri Satya Vennela <ernis@linux.microsoft.com>

Reviewed-by: Haiyang Zhang <haiyangz@microsoft.com>



^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH iproute2-next v3] iproute2: Add 'netshaper' command to 'ip link' for netdev shaping
  2025-08-11  7:05 [PATCH iproute2-next v3] iproute2: Add 'netshaper' command to 'ip link' for netdev shaping Erni Sri Satya Vennela
  2025-08-11 20:16 ` Haiyang Zhang
@ 2025-08-16 18:05 ` Stephen Hemminger
  2025-08-21 10:45   ` Erni Sri Satya Vennela
  2025-08-16 22:55 ` Stephen Hemminger
  2 siblings, 1 reply; 18+ messages in thread
From: Stephen Hemminger @ 2025-08-16 18:05 UTC (permalink / raw)
  To: Erni Sri Satya Vennela
  Cc: dsahern, netdev, haiyangz, shradhagupta, ssengar, dipayanroy,
	ernis

On Mon, 11 Aug 2025 00:05:02 -0700
Erni Sri Satya Vennela <ernis@linux.microsoft.com> wrote:

> Add support for the netshaper Generic Netlink
> family to iproute2. Introduce a new subcommand to `ip link` for
> configuring netshaper parameters directly from userspace.
> 
> This interface allows users to set shaping attributes (such as speed)
> which are passed to the kernel to perform the corresponding netshaper
> operation.
> 
> Example usage:
> $ip link netshaper { set | get | delete } dev DEVNAME \
>                    handle scope SCOPE id ID \
>                    [ speed SPEED ]
> 
> Internally, this triggers a kernel call to apply the shaping
> configuration to the specified network device.
> 
> Currently, the tool supports the following functionalities:
> - Setting speed in Mbps, enabling bandwidth clamping for
>   a network device that support netshaper operations.
> - Deleting the current configuration.
> - Querying the existing configuration.
> 
> Additional netshaper operations will be integrated into the tool
> as per requirement.
> 
> This change enables easy and scriptable configuration of bandwidth
> shaping for  devices that use the netshaper Netlink family.
> 
> Corresponding net-next patches:
> 1) https://lore.kernel.org/all/cover.1728460186.git.pabeni@redhat.com/
> 2) https://lore.kernel.org/lkml/1750144656-2021-1-git-send-email-ernis@linux.microsoft.com/
> 
> Install pkg-config and libmnl* packages to print kernel extack
> errors to stdout.
> 
> Signed-off-by: Erni Sri Satya Vennela <ernis@linux.microsoft.com>
> ---
> Please add include/uapi/linux/net_shaper.h from kernel source tree
> for this patch.
> ---
> Changes in v3:
> * Use strcmp instead of matches.
> * Use get_rate64 instead get_unsigned for speed parameter.
> * Remove speed_mbps in do_cmd() to reduce redundancy.
> * Update the usage of speed parameter in the command.
> Changes in v2:
> * Use color coding for printing device name in stdout.
> * Use clang-format to format the code inline.
> * Use __u64 for speed_bps.
> * Remove include/uapi/linux/netshaper.h file. 
> ---
>  ip/Makefile           |   2 +-
>  ip/iplink.c           |  12 +++
>  ip/iplink_netshaper.c | 189 ++++++++++++++++++++++++++++++++++++++++++
>  3 files changed, 202 insertions(+), 1 deletion(-)
>  create mode 100644 ip/iplink_netshaper.c

No documentation.
No tests?

> 
> diff --git a/ip/Makefile b/ip/Makefile
> index 3535ba78..18218c3b 100644
> --- a/ip/Makefile
> +++ b/ip/Makefile
> @@ -4,7 +4,7 @@ IPOBJ=ip.o ipaddress.o ipaddrlabel.o iproute.o iprule.o ipnetns.o \
>      ipmaddr.o ipmonitor.o ipmroute.o ipprefix.o iptuntap.o iptoken.o \
>      ipxfrm.o xfrm_state.o xfrm_policy.o xfrm_monitor.o iplink_dummy.o \
>      iplink_ifb.o iplink_nlmon.o iplink_team.o iplink_vcan.o iplink_vxcan.o \
> -    iplink_vlan.o link_veth.o link_gre.o iplink_can.o iplink_xdp.o \
> +    iplink_vlan.o iplink_netshaper.o link_veth.o link_gre.o iplink_can.o iplink_xdp.o \
>      iplink_macvlan.o ipl2tp.o link_vti.o link_vti6.o link_xfrm.o \
>      iplink_vxlan.o tcp_metrics.o iplink_ipoib.o ipnetconf.o link_ip6tnl.o \
>      link_iptnl.o link_gre6.o iplink_bond.o iplink_bond_slave.o iplink_hsr.o \
> diff --git a/ip/iplink.c b/ip/iplink.c
> index 59e8caf4..daa4603d 100644
> --- a/ip/iplink.c
> +++ b/ip/iplink.c
> @@ -1509,6 +1509,15 @@ static void do_help(int argc, char **argv)
>  		usage();
>  }
>  
> +static int iplink_netshaper(int argc, char **argv)
> +{
> +	struct link_util *lu;
> +
> +	lu = get_link_kind("netshaper");
> +
> +	return lu->parse_opt(lu, argc, argv, NULL);
> +}
> +
>  int do_iplink(int argc, char **argv)
>  {
>  	if (argc < 1)
> @@ -1545,6 +1554,9 @@ int do_iplink(int argc, char **argv)
>  	if (matches(*argv, "property") == 0)
>  		return iplink_prop(argc-1, argv+1);
>  
> +	if (strcmp(*argv, "netshaper") == 0)
> +		return iplink_netshaper(argc-1, argv+1);
> +
>  	if (matches(*argv, "help") == 0) {
>  		do_help(argc-1, argv+1);
>  		return 0;
> diff --git a/ip/iplink_netshaper.c b/ip/iplink_netshaper.c
> new file mode 100644
> index 00000000..30ee6c3e
> --- /dev/null
> +++ b/ip/iplink_netshaper.c
> @@ -0,0 +1,189 @@
> +/* SPDX-License-Identifier: GPL-2.0 */
> +/*
> + * iplink_netshaper.c netshaper H/W shaping support
> + *
> + * Authors:        Erni Sri Satya Vennela <ernis@linux.microsoft.com>
> + */
> +#include <stdio.h>
> +#include <string.h>
> +#include <linux/genetlink.h>
> +#include <linux/netlink.h>
> +#include <linux/rtnetlink.h>
> +#include <uapi/linux/netshaper.h>
> +#include "utils.h"
> +#include "ip_common.h"
> +#include "libgenl.h"
> +
> +/* netlink socket */
> +static struct rtnl_handle gen_rth = { .fd = -1 };
> +static int genl_family = -1;
> +
> +static void usage(void)
> +{
> +	fprintf(stderr,
> +		"Usage:	ip link netshaper set dev DEVNAME handle scope HANDLE_SCOPE id HANDLE_ID speed SPEED\n"
> +		"	ip link netshaper delete dev DEVNAME handle scope HANDLE_SCOPE id HANDLE_ID\n"
> +		"	ip link netshaper get dev DEVNAME handle scope HANDLE_SCOPE id HANDLE_ID\n"

Seems like netshaper is property of the device not a top level object, the syntax
here is awkward. Open to better suggestions. Looks to me that netshaper should be property of
device not top level object.

Or netshaper is like neighbour and route and really wants to be not part of link command.

Also no other ip commands use show not get.
The verb "get" is only used for things like getting a route or neighbor with a particular address.


> +		"Where:	DEVNAME		:= STRING\n"
> +		"	HANDLE_SCOPE	:= { netdev | queue | node }\n"
> +		"	HANDLE_ID	:= UINT\n"
> +		"	SPEED		:= UINT{ kbit | mbit | gbit }\n");
> +
> +	exit(-1);
> +}
> +
> +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] = {};
> +	__u32 speed_mbps;
> +	__u64 speed_bps;
> +	int ifindex;
> +
> +	parse_rtattr(tb, NET_SHAPER_A_MAX,
> +		     (struct rtattr *)((char *)ghdr + GENL_HDRLEN), len);
> +
> +	for (int i = 1; i <= NET_SHAPER_A_MAX; ++i) {
> +		if (!tb[i])
> +			continue;
> +		switch (i) {
> +		case NET_SHAPER_A_BW_MAX:
> +			speed_bps = rta_getattr_u64(tb[i]);
> +			speed_mbps = (speed_bps / 1000000);
> +			print_uint(PRINT_ANY, "speed", "speed: %u mbps\n",
> +				   speed_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;
> +		default:
> +			break;
> +		}
> +	}
> +}
> +
> +static int do_cmd(int argc, char **argv, struct nlmsghdr *n, int cmd)
> +{
> +	GENL_REQUEST(req, 1024, genl_family, 0, NET_SHAPER_FAMILY_VERSION, cmd,
> +		     NLM_F_REQUEST | NLM_F_ACK);
> +
> +	struct nlmsghdr *answer;
> +	__u64 speed_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, "speed") == 0) {
> +			NEXT_ARG();
> +			if(get_rate64(&speed_bps, *argv)) {
> +				fprintf(stderr, "Invalid speed value\n");
> +				return -1;
> +			}
> +			/*Convert Bps to bps*/
> +			speed_bps *= 8;
> +		} else if (strcmp(*argv, "handle") == 0) {
> +			handle_present = true;
> +			NEXT_ARG();
> +			if (strcmp(*argv, "scope") == 0) {
> +				NEXT_ARG();
> +				if (strcmp(*argv, "netdev") == 0) {
> +					handle_scope = NET_SHAPER_SCOPE_NETDEV;
> +				} else if (strcmp(*argv, "queue") == 0) {
> +					handle_scope = NET_SHAPER_SCOPE_QUEUE;
> +				} else if (strcmp(*argv, "node") == 0) {
> +					handle_scope = NET_SHAPER_SCOPE_NODE;
> +				} else {
> +					fprintf(stderr, "Invalid scope\n");
> +					return -1;
> +				}
> +
> +				NEXT_ARG();
> +				if (strcmp(*argv, "id") == 0) {
> +					NEXT_ARG();
> +					if (get_unsigned(&handle_id, *argv, 10)) {
> +						fprintf(stderr,
> +							"Invalid handle id\n");
> +						return -1;
> +					}
> +				}
> +			}
> +		} else {
> +			fprintf(stderr, "What is \"%s\"\n", *argv);
> +			usage();
> +		}
> +		argc--;
> +		argv++;
> +	}
> +
> +	if (ifindex == -1)
> +		missarg("dev");
> +
> +	if (!handle_present)
> +		missarg("handle");
> +
> +	if (cmd == NET_SHAPER_CMD_SET && speed_bps == 0)
> +		missarg("speed");
> +
> +	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, speed_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;
> +}
> +
> +static int netshaper_parse_opt(struct link_util *lu, int argc, char **argv,
> +			       struct nlmsghdr *n)
> +{
> +	if (argc < 1)
> +		usage();
> +	if (strcmp(*argv, "help") == 0)
> +		usage();
> +
> +	if (genl_init_handle(&gen_rth, NET_SHAPER_FAMILY_NAME, &genl_family))
> +		exit(1);
> +
> +	if (strcmp(*argv, "set") == 0)
> +		return do_cmd(argc - 1, argv + 1, n, NET_SHAPER_CMD_SET);
> +
> +	if (strcmp(*argv, "delete") == 0)
> +		return do_cmd(argc - 1, argv + 1, n, NET_SHAPER_CMD_DELETE);
> +
> +	if (strcmp(*argv, "get") == 0)
> +		return do_cmd(argc - 1, argv + 1, n, NET_SHAPER_CMD_GET);
> +
> +	fprintf(stderr,
> +		"Command \"%s\" is unknown, try \"ip link netshaper help\".\n",
> +		*argv);
> +	exit(-1);
> +}
> +
> +struct link_util netshaper_link_util = {
> +	.id = "netshaper",
> +	.parse_opt = netshaper_parse_opt,
> +};


Please add a print_opt functionality.
Very useful to see what kernel thinks state is. 

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH iproute2-next v3] iproute2: Add 'netshaper' command to 'ip link' for netdev shaping
  2025-08-11  7:05 [PATCH iproute2-next v3] iproute2: Add 'netshaper' command to 'ip link' for netdev shaping Erni Sri Satya Vennela
  2025-08-11 20:16 ` Haiyang Zhang
  2025-08-16 18:05 ` Stephen Hemminger
@ 2025-08-16 22:55 ` Stephen Hemminger
  2025-08-18 15:36   ` Jakub Kicinski
  2025-08-21 10:49   ` Erni Sri Satya Vennela
  2 siblings, 2 replies; 18+ messages in thread
From: Stephen Hemminger @ 2025-08-16 22:55 UTC (permalink / raw)
  To: Erni Sri Satya Vennela
  Cc: dsahern, netdev, haiyangz, shradhagupta, ssengar, dipayanroy,
	ernis

On Mon, 11 Aug 2025 00:05:02 -0700
Erni Sri Satya Vennela <ernis@linux.microsoft.com> wrote:

> Add support for the netshaper Generic Netlink
> family to iproute2. Introduce a new subcommand to `ip link` for
> configuring netshaper parameters directly from userspace.
> 
> This interface allows users to set shaping attributes (such as speed)
> which are passed to the kernel to perform the corresponding netshaper
> operation.
> 
> Example usage:
> $ip link netshaper { set | get | delete } dev DEVNAME \
>                    handle scope SCOPE id ID \
>                    [ speed SPEED ]


The choice of ip link is awkward and doesn't match other options.
I can think of some better other choices:

  1. netshaper could be a property of the device. But the choice of using genetlink
     instead of regular ip netlink attributes makes this hard.
  2. netshaper could be part of devlink. Since it is more targeted at hardware
     device attributes.
  3. netshaper could be a standalone command like bridge, dcb, devlink, rdma, tipc and vdpa.

What ever choice the command line options need to follow similar syntax to other iproute commands.

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH iproute2-next v3] iproute2: Add 'netshaper' command to 'ip link' for netdev shaping
  2025-08-16 22:55 ` Stephen Hemminger
@ 2025-08-18 15:36   ` Jakub Kicinski
  2025-08-18 15:41     ` David Ahern
  2025-08-21 11:06     ` Erni Sri Satya Vennela
  2025-08-21 10:49   ` Erni Sri Satya Vennela
  1 sibling, 2 replies; 18+ messages in thread
From: Jakub Kicinski @ 2025-08-18 15:36 UTC (permalink / raw)
  To: Stephen Hemminger
  Cc: Erni Sri Satya Vennela, dsahern, netdev, haiyangz, shradhagupta,
	ssengar, dipayanroy, ernis

On Sat, 16 Aug 2025 15:55:10 -0700 Stephen Hemminger wrote:
> On Mon, 11 Aug 2025 00:05:02 -0700
> Erni Sri Satya Vennela <ernis@linux.microsoft.com> wrote:
> 
> > Add support for the netshaper Generic Netlink
> > family to iproute2. Introduce a new subcommand to `ip link` for
> > configuring netshaper parameters directly from userspace.
> > 
> > This interface allows users to set shaping attributes (such as speed)
> > which are passed to the kernel to perform the corresponding netshaper
> > operation.
> > 
> > Example usage:
> > $ip link netshaper { set | get | delete } dev DEVNAME \
> >                    handle scope SCOPE id ID \
> >                    [ speed SPEED ]  
> 
> The choice of ip link is awkward and doesn't match other options.
> I can think of some better other choices:
> 
>   1. netshaper could be a property of the device. But the choice of using genetlink
>      instead of regular ip netlink attributes makes this hard.
>   2. netshaper could be part of devlink. Since it is more targeted at hardware
>      device attributes.
>   3. netshaper could be a standalone command like bridge, dcb, devlink, rdma, tipc and vdpa.
> 
> What ever choice the command line options need to follow similar syntax to other iproute commands.

I think historically we gravitated towards option 3 -- each family has
a command? But indeed we could fold it together with something like
the netdev family without much issue, they are both key'd on netdevs.

Somewhat related -- what's your take on integrating / vendoring in YNL?
mnl doesn't provide any extack support..

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH iproute2-next v3] iproute2: Add 'netshaper' command to 'ip link' for netdev shaping
  2025-08-18 15:36   ` Jakub Kicinski
@ 2025-08-18 15:41     ` David Ahern
  2025-08-18 16:00       ` Jakub Kicinski
  2025-08-21 11:06     ` Erni Sri Satya Vennela
  1 sibling, 1 reply; 18+ messages in thread
From: David Ahern @ 2025-08-18 15:41 UTC (permalink / raw)
  To: Jakub Kicinski, Stephen Hemminger
  Cc: Erni Sri Satya Vennela, netdev, haiyangz, shradhagupta, ssengar,
	dipayanroy, ernis

On 8/18/25 9:36 AM, Jakub Kicinski wrote:
> Somewhat related -- what's your take on integrating / vendoring in YNL?

I feel like this has been brought up a few times.

Is there a specific proposal or any patches to review?

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH iproute2-next v3] iproute2: Add 'netshaper' command to 'ip link' for netdev shaping
  2025-08-18 15:41     ` David Ahern
@ 2025-08-18 16:00       ` Jakub Kicinski
  2025-08-19 15:27         ` David Ahern
  2025-08-21 12:31         ` Erni Sri Satya Vennela
  0 siblings, 2 replies; 18+ messages in thread
From: Jakub Kicinski @ 2025-08-18 16:00 UTC (permalink / raw)
  To: David Ahern
  Cc: Stephen Hemminger, Erni Sri Satya Vennela, netdev, haiyangz,
	shradhagupta, ssengar, dipayanroy, ernis

On Mon, 18 Aug 2025 09:41:29 -0600 David Ahern wrote:
> On 8/18/25 9:36 AM, Jakub Kicinski wrote:
> > Somewhat related -- what's your take on integrating / vendoring in YNL?  
> 
> I feel like this has been brought up a few times.
> 
> Is there a specific proposal or any patches to review?

Not AFAIK. Erni is being asked to rethink his approach here, and 
if we're going with a new command perhaps YNL should be on the table.

I'd be very interested to get a final ruling on YNL integration 
into iproute2 -- given its inability to work as a shared object /
library it's not unreasonable for the answer to be "no". 

The page pool sample in the kernel sources is very useful, I find
myself copying to various systems during debug. If there's no clear
path to YNL integration with iproute2 it's time for that sample to
be come a real CLI tool.

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH iproute2-next v3] iproute2: Add 'netshaper' command to 'ip link' for netdev shaping
  2025-08-18 16:00       ` Jakub Kicinski
@ 2025-08-19 15:27         ` David Ahern
  2025-08-21 12:31         ` Erni Sri Satya Vennela
  1 sibling, 0 replies; 18+ messages in thread
From: David Ahern @ 2025-08-19 15:27 UTC (permalink / raw)
  To: Jakub Kicinski
  Cc: Stephen Hemminger, Erni Sri Satya Vennela, netdev, haiyangz,
	shradhagupta, ssengar, dipayanroy, ernis

On 8/18/25 10:00 AM, Jakub Kicinski wrote:
> I'd be very interested to get a final ruling on YNL integration into
> iproute2 -- given its inability to work as a shared object / library
> it's not unreasonable for the answer to be "no".

kind of hard to answer that without some proposal with details on what
an integration of ynl would look like

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH iproute2-next v3] iproute2: Add 'netshaper' command to 'ip link' for netdev shaping
  2025-08-16 18:05 ` Stephen Hemminger
@ 2025-08-21 10:45   ` Erni Sri Satya Vennela
  0 siblings, 0 replies; 18+ messages in thread
From: Erni Sri Satya Vennela @ 2025-08-21 10:45 UTC (permalink / raw)
  To: Stephen Hemminger
  Cc: dsahern, netdev, haiyangz, shradhagupta, ssengar, dipayanroy,
	ernis

On Sat, Aug 16, 2025 at 11:05:07AM -0700, Stephen Hemminger wrote:
> On Mon, 11 Aug 2025 00:05:02 -0700
> Erni Sri Satya Vennela <ernis@linux.microsoft.com> wrote:
> 
> > Add support for the netshaper Generic Netlink
> > family to iproute2. Introduce a new subcommand to `ip link` for
> > configuring netshaper parameters directly from userspace.
> > 
> > This interface allows users to set shaping attributes (such as speed)
> > which are passed to the kernel to perform the corresponding netshaper
> > operation.
> > 
> > Example usage:
> > $ip link netshaper { set | get | delete } dev DEVNAME \
> >                    handle scope SCOPE id ID \
> >                    [ speed SPEED ]
> > 
> > Internally, this triggers a kernel call to apply the shaping
> > configuration to the specified network device.
> > 
> > Currently, the tool supports the following functionalities:
> > - Setting speed in Mbps, enabling bandwidth clamping for
> >   a network device that support netshaper operations.
> > - Deleting the current configuration.
> > - Querying the existing configuration.
> > 
> > Additional netshaper operations will be integrated into the tool
> > as per requirement.
> > 
> > This change enables easy and scriptable configuration of bandwidth
> > shaping for  devices that use the netshaper Netlink family.
> > 
> > Corresponding net-next patches:
> > 1) https://lore.kernel.org/all/cover.1728460186.git.pabeni@redhat.com/
> > 2) https://lore.kernel.org/lkml/1750144656-2021-1-git-send-email-ernis@linux.microsoft.com/
> > 
> > Install pkg-config and libmnl* packages to print kernel extack
> > errors to stdout.
> > 
> > Signed-off-by: Erni Sri Satya Vennela <ernis@linux.microsoft.com>
> > ---
> > Please add include/uapi/linux/net_shaper.h from kernel source tree
> > for this patch.
> > ---
> > Changes in v3:
> > * Use strcmp instead of matches.
> > * Use get_rate64 instead get_unsigned for speed parameter.
> > * Remove speed_mbps in do_cmd() to reduce redundancy.
> > * Update the usage of speed parameter in the command.
> > Changes in v2:
> > * Use color coding for printing device name in stdout.
> > * Use clang-format to format the code inline.
> > * Use __u64 for speed_bps.
> > * Remove include/uapi/linux/netshaper.h file. 
> > ---
> >  ip/Makefile           |   2 +-
> >  ip/iplink.c           |  12 +++
> >  ip/iplink_netshaper.c | 189 ++++++++++++++++++++++++++++++++++++++++++
> >  3 files changed, 202 insertions(+), 1 deletion(-)
> >  create mode 100644 ip/iplink_netshaper.c
> 
> No documentation.
> No tests?
I will share the documentation on netshapers, specifically covering
how to use the ip command for this use case.
> 
> > 
> > diff --git a/ip/Makefile b/ip/Makefile
> > index 3535ba78..18218c3b 100644
> > --- a/ip/Makefile
> > +++ b/ip/Makefile
> > @@ -4,7 +4,7 @@ IPOBJ=ip.o ipaddress.o ipaddrlabel.o iproute.o iprule.o ipnetns.o \
> >      ipmaddr.o ipmonitor.o ipmroute.o ipprefix.o iptuntap.o iptoken.o \
> >      ipxfrm.o xfrm_state.o xfrm_policy.o xfrm_monitor.o iplink_dummy.o \
> >      iplink_ifb.o iplink_nlmon.o iplink_team.o iplink_vcan.o iplink_vxcan.o \
> > -    iplink_vlan.o link_veth.o link_gre.o iplink_can.o iplink_xdp.o \
> > +    iplink_vlan.o iplink_netshaper.o link_veth.o link_gre.o iplink_can.o iplink_xdp.o \
> >      iplink_macvlan.o ipl2tp.o link_vti.o link_vti6.o link_xfrm.o \
> >      iplink_vxlan.o tcp_metrics.o iplink_ipoib.o ipnetconf.o link_ip6tnl.o \
> >      link_iptnl.o link_gre6.o iplink_bond.o iplink_bond_slave.o iplink_hsr.o \
> > diff --git a/ip/iplink.c b/ip/iplink.c
> > index 59e8caf4..daa4603d 100644
> > --- a/ip/iplink.c
> > +++ b/ip/iplink.c
> > @@ -1509,6 +1509,15 @@ static void do_help(int argc, char **argv)
> >  		usage();
> >  }
> >  
> > +static int iplink_netshaper(int argc, char **argv)
> > +{
> > +	struct link_util *lu;
> > +
> > +	lu = get_link_kind("netshaper");
> > +
> > +	return lu->parse_opt(lu, argc, argv, NULL);
> > +}
> > +
> >  int do_iplink(int argc, char **argv)
> >  {
> >  	if (argc < 1)
> > @@ -1545,6 +1554,9 @@ int do_iplink(int argc, char **argv)
> >  	if (matches(*argv, "property") == 0)
> >  		return iplink_prop(argc-1, argv+1);
> >  
> > +	if (strcmp(*argv, "netshaper") == 0)
> > +		return iplink_netshaper(argc-1, argv+1);
> > +
> >  	if (matches(*argv, "help") == 0) {
> >  		do_help(argc-1, argv+1);
> >  		return 0;
> > diff --git a/ip/iplink_netshaper.c b/ip/iplink_netshaper.c
> > new file mode 100644
> > index 00000000..30ee6c3e
> > --- /dev/null
> > +++ b/ip/iplink_netshaper.c
> > @@ -0,0 +1,189 @@
> > +/* SPDX-License-Identifier: GPL-2.0 */
> > +/*
> > + * iplink_netshaper.c netshaper H/W shaping support
> > + *
> > + * Authors:        Erni Sri Satya Vennela <ernis@linux.microsoft.com>
> > + */
> > +#include <stdio.h>
> > +#include <string.h>
> > +#include <linux/genetlink.h>
> > +#include <linux/netlink.h>
> > +#include <linux/rtnetlink.h>
> > +#include <uapi/linux/netshaper.h>
> > +#include "utils.h"
> > +#include "ip_common.h"
> > +#include "libgenl.h"
> > +
> > +/* netlink socket */
> > +static struct rtnl_handle gen_rth = { .fd = -1 };
> > +static int genl_family = -1;
> > +
> > +static void usage(void)
> > +{
> > +	fprintf(stderr,
> > +		"Usage:	ip link netshaper set dev DEVNAME handle scope HANDLE_SCOPE id HANDLE_ID speed SPEED\n"
> > +		"	ip link netshaper delete dev DEVNAME handle scope HANDLE_SCOPE id HANDLE_ID\n"
> > +		"	ip link netshaper get dev DEVNAME handle scope HANDLE_SCOPE id HANDLE_ID\n"
> 
> Seems like netshaper is property of the device not a top level object, the syntax
> here is awkward. Open to better suggestions. Looks to me that netshaper should be property of
> device not top level object.
> 
> Or netshaper is like neighbour and route and really wants to be not part of link command.
> 
> Also no other ip commands use show not get.
> The verb "get" is only used for things like getting a route or neighbor with a particular address.

Okay. I will change the code accordingly.
> 
> 
> > +		"Where:	DEVNAME		:= STRING\n"
> > +		"	HANDLE_SCOPE	:= { netdev | queue | node }\n"
> > +		"	HANDLE_ID	:= UINT\n"
> > +		"	SPEED		:= UINT{ kbit | mbit | gbit }\n");
> > +
> > +	exit(-1);
> > +}
> > +
> > +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] = {};
> > +	__u32 speed_mbps;
> > +	__u64 speed_bps;
> > +	int ifindex;
> > +
> > +	parse_rtattr(tb, NET_SHAPER_A_MAX,
> > +		     (struct rtattr *)((char *)ghdr + GENL_HDRLEN), len);
> > +
> > +	for (int i = 1; i <= NET_SHAPER_A_MAX; ++i) {
> > +		if (!tb[i])
> > +			continue;
> > +		switch (i) {
> > +		case NET_SHAPER_A_BW_MAX:
> > +			speed_bps = rta_getattr_u64(tb[i]);
> > +			speed_mbps = (speed_bps / 1000000);
> > +			print_uint(PRINT_ANY, "speed", "speed: %u mbps\n",
> > +				   speed_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;
> > +		default:
> > +			break;
> > +		}
> > +	}
> > +}
> > +
> > +static int do_cmd(int argc, char **argv, struct nlmsghdr *n, int cmd)
> > +{
> > +	GENL_REQUEST(req, 1024, genl_family, 0, NET_SHAPER_FAMILY_VERSION, cmd,
> > +		     NLM_F_REQUEST | NLM_F_ACK);
> > +
> > +	struct nlmsghdr *answer;
> > +	__u64 speed_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, "speed") == 0) {
> > +			NEXT_ARG();
> > +			if(get_rate64(&speed_bps, *argv)) {
> > +				fprintf(stderr, "Invalid speed value\n");
> > +				return -1;
> > +			}
> > +			/*Convert Bps to bps*/
> > +			speed_bps *= 8;
> > +		} else if (strcmp(*argv, "handle") == 0) {
> > +			handle_present = true;
> > +			NEXT_ARG();
> > +			if (strcmp(*argv, "scope") == 0) {
> > +				NEXT_ARG();
> > +				if (strcmp(*argv, "netdev") == 0) {
> > +					handle_scope = NET_SHAPER_SCOPE_NETDEV;
> > +				} else if (strcmp(*argv, "queue") == 0) {
> > +					handle_scope = NET_SHAPER_SCOPE_QUEUE;
> > +				} else if (strcmp(*argv, "node") == 0) {
> > +					handle_scope = NET_SHAPER_SCOPE_NODE;
> > +				} else {
> > +					fprintf(stderr, "Invalid scope\n");
> > +					return -1;
> > +				}
> > +
> > +				NEXT_ARG();
> > +				if (strcmp(*argv, "id") == 0) {
> > +					NEXT_ARG();
> > +					if (get_unsigned(&handle_id, *argv, 10)) {
> > +						fprintf(stderr,
> > +							"Invalid handle id\n");
> > +						return -1;
> > +					}
> > +				}
> > +			}
> > +		} else {
> > +			fprintf(stderr, "What is \"%s\"\n", *argv);
> > +			usage();
> > +		}
> > +		argc--;
> > +		argv++;
> > +	}
> > +
> > +	if (ifindex == -1)
> > +		missarg("dev");
> > +
> > +	if (!handle_present)
> > +		missarg("handle");
> > +
> > +	if (cmd == NET_SHAPER_CMD_SET && speed_bps == 0)
> > +		missarg("speed");
> > +
> > +	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, speed_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;
> > +}
> > +
> > +static int netshaper_parse_opt(struct link_util *lu, int argc, char **argv,
> > +			       struct nlmsghdr *n)
> > +{
> > +	if (argc < 1)
> > +		usage();
> > +	if (strcmp(*argv, "help") == 0)
> > +		usage();
> > +
> > +	if (genl_init_handle(&gen_rth, NET_SHAPER_FAMILY_NAME, &genl_family))
> > +		exit(1);
> > +
> > +	if (strcmp(*argv, "set") == 0)
> > +		return do_cmd(argc - 1, argv + 1, n, NET_SHAPER_CMD_SET);
> > +
> > +	if (strcmp(*argv, "delete") == 0)
> > +		return do_cmd(argc - 1, argv + 1, n, NET_SHAPER_CMD_DELETE);
> > +
> > +	if (strcmp(*argv, "get") == 0)
> > +		return do_cmd(argc - 1, argv + 1, n, NET_SHAPER_CMD_GET);
> > +
> > +	fprintf(stderr,
> > +		"Command \"%s\" is unknown, try \"ip link netshaper help\".\n",
> > +		*argv);
> > +	exit(-1);
> > +}
> > +
> > +struct link_util netshaper_link_util = {
> > +	.id = "netshaper",
> > +	.parse_opt = netshaper_parse_opt,
> > +};
> 
> 
> Please add a print_opt functionality.
> Very useful to see what kernel thinks state is. 

Thankyou for the clarification. I'll make sure to integrate these
changes in the next version.

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH iproute2-next v3] iproute2: Add 'netshaper' command to 'ip link' for netdev shaping
  2025-08-16 22:55 ` Stephen Hemminger
  2025-08-18 15:36   ` Jakub Kicinski
@ 2025-08-21 10:49   ` Erni Sri Satya Vennela
  1 sibling, 0 replies; 18+ messages in thread
From: Erni Sri Satya Vennela @ 2025-08-21 10:49 UTC (permalink / raw)
  To: Stephen Hemminger
  Cc: dsahern, netdev, haiyangz, shradhagupta, ssengar, dipayanroy,
	ernis

On Sat, Aug 16, 2025 at 03:55:10PM -0700, Stephen Hemminger wrote:
> On Mon, 11 Aug 2025 00:05:02 -0700
> Erni Sri Satya Vennela <ernis@linux.microsoft.com> wrote:
> 
> > Add support for the netshaper Generic Netlink
> > family to iproute2. Introduce a new subcommand to `ip link` for
> > configuring netshaper parameters directly from userspace.
> > 
> > This interface allows users to set shaping attributes (such as speed)
> > which are passed to the kernel to perform the corresponding netshaper
> > operation.
> > 
> > Example usage:
> > $ip link netshaper { set | get | delete } dev DEVNAME \
> >                    handle scope SCOPE id ID \
> >                    [ speed SPEED ]
> 
> 
> The choice of ip link is awkward and doesn't match other options.
> I can think of some better other choices:
> 
>   1. netshaper could be a property of the device. But the choice of using genetlink
>      instead of regular ip netlink attributes makes this hard.
>   2. netshaper could be part of devlink. Since it is more targeted at hardware
>      device attributes.
>   3. netshaper could be a standalone command like bridge, dcb, devlink, rdma, tipc and vdpa.
> 
> What ever choice the command line options need to follow similar syntax to other iproute commands.

Thankyou for the suggestions.
After internal discussions, I have decided to proceed with
implementing netshaper as a standalone command.

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH iproute2-next v3] iproute2: Add 'netshaper' command to 'ip link' for netdev shaping
  2025-08-18 15:36   ` Jakub Kicinski
  2025-08-18 15:41     ` David Ahern
@ 2025-08-21 11:06     ` Erni Sri Satya Vennela
  2025-08-21 14:12       ` Jakub Kicinski
  2025-08-25 16:16       ` Stephen Hemminger
  1 sibling, 2 replies; 18+ messages in thread
From: Erni Sri Satya Vennela @ 2025-08-21 11:06 UTC (permalink / raw)
  To: Jakub Kicinski
  Cc: Stephen Hemminger, dsahern, netdev, haiyangz, shradhagupta,
	ssengar, dipayanroy, ernis

On Mon, Aug 18, 2025 at 08:36:12AM -0700, Jakub Kicinski wrote:
> On Sat, 16 Aug 2025 15:55:10 -0700 Stephen Hemminger wrote:
> > On Mon, 11 Aug 2025 00:05:02 -0700
> > Erni Sri Satya Vennela <ernis@linux.microsoft.com> wrote:
> > 
> > > Add support for the netshaper Generic Netlink
> > > family to iproute2. Introduce a new subcommand to `ip link` for
> > > configuring netshaper parameters directly from userspace.
> > > 
> > > This interface allows users to set shaping attributes (such as speed)
> > > which are passed to the kernel to perform the corresponding netshaper
> > > operation.
> > > 
> > > Example usage:
> > > $ip link netshaper { set | get | delete } dev DEVNAME \
> > >                    handle scope SCOPE id ID \
> > >                    [ speed SPEED ]  
> > 
> > The choice of ip link is awkward and doesn't match other options.
> > I can think of some better other choices:
> > 
> >   1. netshaper could be a property of the device. But the choice of using genetlink
> >      instead of regular ip netlink attributes makes this hard.
> >   2. netshaper could be part of devlink. Since it is more targeted at hardware
> >      device attributes.
> >   3. netshaper could be a standalone command like bridge, dcb, devlink, rdma, tipc and vdpa.
> > 
> > What ever choice the command line options need to follow similar syntax to other iproute commands.
> 
> I think historically we gravitated towards option 3 -- each family has
> a command? But indeed we could fold it together with something like
> the netdev family without much issue, they are both key'd on netdevs.
> 
> Somewhat related -- what's your take on integrating / vendoring in YNL?
> mnl doesn't provide any extack support..

I have done some tests and found that if we install pkg-config and
libmnl packages beforehand. The extack error messages from the kernel
are being printed to the stdout.

Example 1:
$ sudo ip link netshaper set dev <interface> handle scope queue id 1
speed 15gbit

Error: mana: net shaper scope should be netdev.
Kernel command failed: -1

Example 2:
$ sudo ip link netshaper set dev <interface> handle scope netdev id 2
speed 15gbit

Error: mana: Cannot create multiple shapers.
Kernel command failed: -1


^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH iproute2-next v3] iproute2: Add 'netshaper' command to 'ip link' for netdev shaping
  2025-08-18 16:00       ` Jakub Kicinski
  2025-08-19 15:27         ` David Ahern
@ 2025-08-21 12:31         ` Erni Sri Satya Vennela
  1 sibling, 0 replies; 18+ messages in thread
From: Erni Sri Satya Vennela @ 2025-08-21 12:31 UTC (permalink / raw)
  To: Jakub Kicinski
  Cc: David Ahern, Stephen Hemminger, netdev, haiyangz, shradhagupta,
	ssengar, dipayanroy, ernis

On Mon, Aug 18, 2025 at 09:00:10AM -0700, Jakub Kicinski wrote:
> On Mon, 18 Aug 2025 09:41:29 -0600 David Ahern wrote:
> > On 8/18/25 9:36 AM, Jakub Kicinski wrote:
> > > Somewhat related -- what's your take on integrating / vendoring in YNL?  
> > 
> > I feel like this has been brought up a few times.
> > 
> > Is there a specific proposal or any patches to review?
> 
> Not AFAIK. Erni is being asked to rethink his approach here, and 
> if we're going with a new command perhaps YNL should be on the table.
> 
Thank you for the feedback and for suggesting integration with the ynl
tool.

For the current implementation, I have followed your earlier guidance
( while implementing bandwidth clamping for MANA interface ) and used 
netlink commands similar to those used by ynl to support netshaper
operations from the kernel.

Ref: https://lore.kernel.org/all/20250421170349.003861f2@kernel.org/

> I'd be very interested to get a final ruling on YNL integration 
> into iproute2 -- given its inability to work as a shared object /
> library it's not unreasonable for the answer to be "no". 

This approach, to use netshaper as separate command in iproute2, seemed
like the most practical path forward to address shaping support without
introducing additional complexity.
> 
> The page pool sample in the kernel sources is very useful, I find
> myself copying to various systems during debug. If there's no clear
> path to YNL integration with iproute2 it's time for that sample to
> be come a real CLI tool.

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH iproute2-next v3] iproute2: Add 'netshaper' command to 'ip link' for netdev shaping
  2025-08-21 11:06     ` Erni Sri Satya Vennela
@ 2025-08-21 14:12       ` Jakub Kicinski
  2025-08-24 13:40         ` Erni Sri Satya Vennela
  2025-08-25 16:16       ` Stephen Hemminger
  1 sibling, 1 reply; 18+ messages in thread
From: Jakub Kicinski @ 2025-08-21 14:12 UTC (permalink / raw)
  To: Erni Sri Satya Vennela
  Cc: Stephen Hemminger, dsahern, netdev, haiyangz, shradhagupta,
	ssengar, dipayanroy, ernis

On Thu, 21 Aug 2025 04:06:07 -0700 Erni Sri Satya Vennela wrote:
> > Somewhat related -- what's your take on integrating / vendoring in YNL?
> > mnl doesn't provide any extack support..  
> 
> I have done some tests and found that if we install pkg-config and
> libmnl packages beforehand. The extack error messages from the kernel
> are being printed to the stdout.

Sorry, I wasn't very precise, it supports printing the string messages.
But nothing that requires actually understanding the message.
No bad attribute errors, no missing attribute errors, no policy errors.

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH iproute2-next v3] iproute2: Add 'netshaper' command to 'ip link' for netdev shaping
  2025-08-21 14:12       ` Jakub Kicinski
@ 2025-08-24 13:40         ` Erni Sri Satya Vennela
  2025-08-24 14:23           ` Stephen Hemminger
  2025-08-25 15:52           ` Jakub Kicinski
  0 siblings, 2 replies; 18+ messages in thread
From: Erni Sri Satya Vennela @ 2025-08-24 13:40 UTC (permalink / raw)
  To: Jakub Kicinski
  Cc: Stephen Hemminger, dsahern, netdev, haiyangz, shradhagupta,
	ssengar, dipayanroy, ernis

On Thu, Aug 21, 2025 at 07:12:59AM -0700, Jakub Kicinski wrote:
> On Thu, 21 Aug 2025 04:06:07 -0700 Erni Sri Satya Vennela wrote:
> > > Somewhat related -- what's your take on integrating / vendoring in YNL?
> > > mnl doesn't provide any extack support..  
> > 
> > I have done some tests and found that if we install pkg-config and
> > libmnl packages beforehand. The extack error messages from the kernel
> > are being printed to the stdout.
> 
> Sorry, I wasn't very precise, it supports printing the string messages.
> But nothing that requires actually understanding the message.
> No bad attribute errors, no missing attribute errors, no policy errors.

Are you referring to the following error logs from the ynl tool?

$./tools/net/ynl/pyynl/cli.py
 --spec Documentation/netlink/specs/net_shaper.yaml
 --do set 
 --json '{"ifindex":'3',
	  "handle":{"scope": "netdev", "id":'1' },
	  "bw-max": 200001000 }'

Netlink error: Invalid argument
nl_len = 92 (76) nl_flags = 0x300 nl_type = 2
        error: -22
        extack: {'msg': 'mana: Please use multiples of 100Mbps for
bandwidth'}

If yes, would it be reasonable to add support in iproute2 itself for
displaying such error logs?

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH iproute2-next v3] iproute2: Add 'netshaper' command to 'ip link' for netdev shaping
  2025-08-24 13:40         ` Erni Sri Satya Vennela
@ 2025-08-24 14:23           ` Stephen Hemminger
  2025-08-25 15:52           ` Jakub Kicinski
  1 sibling, 0 replies; 18+ messages in thread
From: Stephen Hemminger @ 2025-08-24 14:23 UTC (permalink / raw)
  To: Erni Sri Satya Vennela
  Cc: Jakub Kicinski, dsahern, netdev, haiyangz, shradhagupta, ssengar,
	dipayanroy, ernis

On Sun, 24 Aug 2025 06:40:17 -0700
Erni Sri Satya Vennela <ernis@linux.microsoft.com> wrote:

> On Thu, Aug 21, 2025 at 07:12:59AM -0700, Jakub Kicinski wrote:
> > On Thu, 21 Aug 2025 04:06:07 -0700 Erni Sri Satya Vennela wrote:  
> > > > Somewhat related -- what's your take on integrating / vendoring in YNL?
> > > > mnl doesn't provide any extack support..    
> > > 
> > > I have done some tests and found that if we install pkg-config and
> > > libmnl packages beforehand. The extack error messages from the kernel
> > > are being printed to the stdout.  
> > 
> > Sorry, I wasn't very precise, it supports printing the string messages.
> > But nothing that requires actually understanding the message.
> > No bad attribute errors, no missing attribute errors, no policy errors.  
> 
> Are you referring to the following error logs from the ynl tool?
> 
> $./tools/net/ynl/pyynl/cli.py
>  --spec Documentation/netlink/specs/net_shaper.yaml
>  --do set 
>  --json '{"ifindex":'3',
> 	  "handle":{"scope": "netdev", "id":'1' },
> 	  "bw-max": 200001000 }'
> 
> Netlink error: Invalid argument
> nl_len = 92 (76) nl_flags = 0x300 nl_type = 2
>         error: -22
>         extack: {'msg': 'mana: Please use multiples of 100Mbps for
> bandwidth'}
> 
> If yes, would it be reasonable to add support in iproute2 itself for
> displaying such error logs?

other parts of iproute2 already use libmnl to display extack messages.

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH iproute2-next v3] iproute2: Add 'netshaper' command to 'ip link' for netdev shaping
  2025-08-24 13:40         ` Erni Sri Satya Vennela
  2025-08-24 14:23           ` Stephen Hemminger
@ 2025-08-25 15:52           ` Jakub Kicinski
  1 sibling, 0 replies; 18+ messages in thread
From: Jakub Kicinski @ 2025-08-25 15:52 UTC (permalink / raw)
  To: Erni Sri Satya Vennela
  Cc: Stephen Hemminger, dsahern, netdev, haiyangz, shradhagupta,
	ssengar, dipayanroy, ernis

On Sun, 24 Aug 2025 06:40:17 -0700 Erni Sri Satya Vennela wrote:
> > Sorry, I wasn't very precise, it supports printing the string messages.
> > But nothing that requires actually understanding the message.
> > No bad attribute errors, no missing attribute errors, no policy errors.  
> 
> Are you referring to the following error logs from the ynl tool?
> 
> $./tools/net/ynl/pyynl/cli.py
>  --spec Documentation/netlink/specs/net_shaper.yaml
>  --do set 
>  --json '{"ifindex":'3',
> 	  "handle":{"scope": "netdev", "id":'1' },
> 	  "bw-max": 200001000 }'
> 
> Netlink error: Invalid argument
> nl_len = 92 (76) nl_flags = 0x300 nl_type = 2
>         error: -22
>         extack: {'msg': 'mana: Please use multiples of 100Mbps for
> bandwidth'}

Not 'msg', the other types, for example miss-type, bad-attr:

$ ynl --family net_shaper --do get
Netlink error: Invalid argument
nl_len = 44 (28) nl_flags = 0x300 nl_type = 2
	error: -22
	extack: {'miss-type': 'ifindex', 'miss-type-doc': 'Interface index owning the specified shaper.'}

$ ynl --family net_shaper --do get --json '{"ifindex": 1}'
Netlink error: Operation not supported
nl_len = 44 (28) nl_flags = 0x300 nl_type = 2
	error: -95
	extack: {'bad-attr': '.ifindex'}

> If yes, would it be reasonable to add support in iproute2 itself for
> displaying such error logs?

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH iproute2-next v3] iproute2: Add 'netshaper' command to 'ip link' for netdev shaping
  2025-08-21 11:06     ` Erni Sri Satya Vennela
  2025-08-21 14:12       ` Jakub Kicinski
@ 2025-08-25 16:16       ` Stephen Hemminger
  2025-09-01  5:47         ` Erni Sri Satya Vennela
  1 sibling, 1 reply; 18+ messages in thread
From: Stephen Hemminger @ 2025-08-25 16:16 UTC (permalink / raw)
  To: Erni Sri Satya Vennela
  Cc: Jakub Kicinski, dsahern, netdev, haiyangz, shradhagupta, ssengar,
	dipayanroy, ernis

On Thu, 21 Aug 2025 04:06:07 -0700
Erni Sri Satya Vennela <ernis@linux.microsoft.com> wrote:

> On Mon, Aug 18, 2025 at 08:36:12AM -0700, Jakub Kicinski wrote:
> > On Sat, 16 Aug 2025 15:55:10 -0700 Stephen Hemminger wrote:  
> > > On Mon, 11 Aug 2025 00:05:02 -0700
> > > Erni Sri Satya Vennela <ernis@linux.microsoft.com> wrote:
> > >   
> > > > Add support for the netshaper Generic Netlink
> > > > family to iproute2. Introduce a new subcommand to `ip link` for
> > > > configuring netshaper parameters directly from userspace.
> > > > 
> > > > This interface allows users to set shaping attributes (such as speed)
> > > > which are passed to the kernel to perform the corresponding netshaper
> > > > operation.
> > > > 
> > > > Example usage:
> > > > $ip link netshaper { set | get | delete } dev DEVNAME \
> > > >                    handle scope SCOPE id ID \
> > > >                    [ speed SPEED ]    
> > > 
> > > The choice of ip link is awkward and doesn't match other options.
> > > I can think of some better other choices:
> > > 
> > >   1. netshaper could be a property of the device. But the choice of using genetlink
> > >      instead of regular ip netlink attributes makes this hard.
> > >   2. netshaper could be part of devlink. Since it is more targeted at hardware
> > >      device attributes.
> > >   3. netshaper could be a standalone command like bridge, dcb, devlink, rdma, tipc and vdpa.
> > > 
> > > What ever choice the command line options need to follow similar syntax to other iproute commands.  
> > 
> > I think historically we gravitated towards option 3 -- each family has
> > a command? But indeed we could fold it together with something like
> > the netdev family without much issue, they are both key'd on netdevs.
> > 
> > Somewhat related -- what's your take on integrating / vendoring in YNL?
> > mnl doesn't provide any extack support..  

No YNL integration with iproute adds too much.

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH iproute2-next v3] iproute2: Add 'netshaper' command to 'ip link' for netdev shaping
  2025-08-25 16:16       ` Stephen Hemminger
@ 2025-09-01  5:47         ` Erni Sri Satya Vennela
  0 siblings, 0 replies; 18+ messages in thread
From: Erni Sri Satya Vennela @ 2025-09-01  5:47 UTC (permalink / raw)
  To: Stephen Hemminger
  Cc: Jakub Kicinski, dsahern, netdev, haiyangz, shradhagupta, ssengar,
	dipayanroy, ernis

On Mon, Aug 25, 2025 at 09:16:22AM -0700, Stephen Hemminger wrote:
> On Thu, 21 Aug 2025 04:06:07 -0700
> Erni Sri Satya Vennela <ernis@linux.microsoft.com> wrote:
> 
> > On Mon, Aug 18, 2025 at 08:36:12AM -0700, Jakub Kicinski wrote:
> > > On Sat, 16 Aug 2025 15:55:10 -0700 Stephen Hemminger wrote:  
> > > > On Mon, 11 Aug 2025 00:05:02 -0700
> > > > Erni Sri Satya Vennela <ernis@linux.microsoft.com> wrote:
> > > >   
> > > > > Add support for the netshaper Generic Netlink
> > > > > family to iproute2. Introduce a new subcommand to `ip link` for
> > > > > configuring netshaper parameters directly from userspace.
> > > > > 
> > > > > This interface allows users to set shaping attributes (such as speed)
> > > > > which are passed to the kernel to perform the corresponding netshaper
> > > > > operation.
> > > > > 
> > > > > Example usage:
> > > > > $ip link netshaper { set | get | delete } dev DEVNAME \
> > > > >                    handle scope SCOPE id ID \
> > > > >                    [ speed SPEED ]    
> > > > 
> > > > The choice of ip link is awkward and doesn't match other options.
> > > > I can think of some better other choices:
> > > > 
> > > >   1. netshaper could be a property of the device. But the choice of using genetlink
> > > >      instead of regular ip netlink attributes makes this hard.
> > > >   2. netshaper could be part of devlink. Since it is more targeted at hardware
> > > >      device attributes.
> > > >   3. netshaper could be a standalone command like bridge, dcb, devlink, rdma, tipc and vdpa.
> > > > 
> > > > What ever choice the command line options need to follow similar syntax to other iproute commands.  
> > > 
> > > I think historically we gravitated towards option 3 -- each family has
> > > a command? But indeed we could fold it together with something like
> > > the netdev family without much issue, they are both key'd on netdevs.
> > > 
> > > Somewhat related -- what's your take on integrating / vendoring in YNL?
> > > mnl doesn't provide any extack support..  
> 
> No YNL integration with iproute adds too much.

Thankyou Stephen and Jakub for the feedback.
After reviewing the discussion,  I will proceed with the next version
of the patch with netshaper as a standalone command.

I appreciate the perspectives shared and will keep YNL in mind for
future work.

^ permalink raw reply	[flat|nested] 18+ messages in thread

end of thread, other threads:[~2025-09-01  5:47 UTC | newest]

Thread overview: 18+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-08-11  7:05 [PATCH iproute2-next v3] iproute2: Add 'netshaper' command to 'ip link' for netdev shaping Erni Sri Satya Vennela
2025-08-11 20:16 ` Haiyang Zhang
2025-08-16 18:05 ` Stephen Hemminger
2025-08-21 10:45   ` Erni Sri Satya Vennela
2025-08-16 22:55 ` Stephen Hemminger
2025-08-18 15:36   ` Jakub Kicinski
2025-08-18 15:41     ` David Ahern
2025-08-18 16:00       ` Jakub Kicinski
2025-08-19 15:27         ` David Ahern
2025-08-21 12:31         ` Erni Sri Satya Vennela
2025-08-21 11:06     ` Erni Sri Satya Vennela
2025-08-21 14:12       ` Jakub Kicinski
2025-08-24 13:40         ` Erni Sri Satya Vennela
2025-08-24 14:23           ` Stephen Hemminger
2025-08-25 15:52           ` Jakub Kicinski
2025-08-25 16:16       ` Stephen Hemminger
2025-09-01  5:47         ` Erni Sri Satya Vennela
2025-08-21 10:49   ` Erni Sri Satya Vennela

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).