From: Mohsin Bashir <mohsin.bashr@gmail.com>
To: netdev@vger.kernel.org
Cc: dsahern@kernel.org, stephen@networkplumber.org,
pabeni@redhat.com, kuba@kernel.org, ernis@linux.microsoft.com,
mohsin.bashr@gmail.com
Subject: [PATCH iproute2-next 3/5] netshaper: Extend show output with parent, bw-min and weight
Date: Thu, 30 Apr 2026 18:16:09 -0700 [thread overview]
Message-ID: <20260501011611.3533573-4-mohsin.bashr@gmail.com> (raw)
In-Reply-To: <20260501011611.3533573-1-mohsin.bashr@gmail.com>
Extend print_netshaper_attrs() to display parent scope/id, bw-min,
and weight fields in the show output. Replace the switch-based
iteration with direct attribute checks for cleaner output formatting.
Verify the support by setting the rate for a queue and attempt to read it
back.
Before:
./netshaper set dev eth2 handle scope queue id 0 bw-min 10mbit weight 5
./netshaper show dev eth2 handle scope queue id 0
scope: queue
id: 0
dev: eth2
After:
./netshaper set dev eth2 handle scope queue id 0 bw-min 10mbit weight 5
./netshaper show dev eth2 handle scope queue id 0
dev: eth2 scope queue id 1 parent scope netdev bw-min 10 mbps weight 5
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Signed-off-by: Mohsin Bashir <mohsin.bashr@gmail.com>
---
netshaper/netshaper.c | 89 ++++++++++++++++++++++++++-----------------
1 file changed, 55 insertions(+), 34 deletions(-)
diff --git a/netshaper/netshaper.c b/netshaper/netshaper.c
index 4ee30525..53a5eae3 100644
--- a/netshaper/netshaper.c
+++ b/netshaper/netshaper.c
@@ -72,53 +72,74 @@ static int parse_rate(const char *str, __u64 *rate_bps)
static void print_netshaper_attrs(struct nlmsghdr *answer)
{
+ struct rtattr *parent_tb[NET_SHAPER_A_HANDLE_MAX + 1] = {};
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;
+ __u32 scope, id;
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);
+ if (tb[NET_SHAPER_A_IFINDEX]) {
+ ifindex = rta_getattr_u32(tb[NET_SHAPER_A_IFINDEX]);
+ print_color_string(PRINT_ANY, COLOR_IFNAME, "dev",
+ "dev: %s ", ll_index_to_name(ifindex));
+ }
- 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;
+ if (tb[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 ",
+ 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 ", id);
+ }
+ }
+
+ if (tb[NET_SHAPER_A_PARENT]) {
+ parse_rtattr_nested(parent_tb, NET_SHAPER_A_HANDLE_MAX,
+ tb[NET_SHAPER_A_PARENT]);
+ if (parent_tb[NET_SHAPER_A_HANDLE_SCOPE]) {
+ scope = rta_getattr_u32(parent_tb[NET_SHAPER_A_HANDLE_SCOPE]);
+ print_string(PRINT_ANY, "parent-scope",
+ "parent scope %s ",
+ net_shaper_scope_names[scope]);
}
+ if (parent_tb[NET_SHAPER_A_HANDLE_ID]) {
+ id = rta_getattr_u32(parent_tb[NET_SHAPER_A_HANDLE_ID]);
+ print_uint(PRINT_ANY, "parent-id", "id %u ", id);
+ }
+ }
+
+ if (tb[NET_SHAPER_A_BW_MAX]) {
+ __u64 bw = rta_getattr_uint(tb[NET_SHAPER_A_BW_MAX]);
+
+ print_uint(PRINT_ANY, "bw-max", "bw-max %u mbps ",
+ (__u32)(bw / 1000000));
}
+
+ if (tb[NET_SHAPER_A_BW_MIN]) {
+ __u64 bw = rta_getattr_uint(tb[NET_SHAPER_A_BW_MIN]);
+
+ print_uint(PRINT_ANY, "bw-min", "bw-min %u mbps ",
+ (__u32)(bw / 1000000));
+ }
+
+ if (tb[NET_SHAPER_A_WEIGHT]) {
+ __u32 weight = rta_getattr_u32(tb[NET_SHAPER_A_WEIGHT]);
+
+ print_uint(PRINT_ANY, "weight", "weight %u ", weight);
+ }
+
+ printf("\n");
}
static int do_cmd(int argc, char **argv, int cmd)
--
2.52.0
next prev parent reply other threads:[~2026-05-01 1:16 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-05-01 1:16 [PATCH iproute2-next 0/5] netshaper: Extend netshaper support Mohsin Bashir
2026-05-01 1:16 ` [PATCH iproute2-next 1/5] netshaper: Extract parse_scope() and parse_rate() helpers Mohsin Bashir
2026-05-01 17:47 ` David Ahern
2026-05-01 1:16 ` [PATCH iproute2-next 2/5] netshaper: Add bw-min and weight parameter support Mohsin Bashir
2026-05-01 17:50 ` David Ahern
2026-05-01 1:16 ` Mohsin Bashir [this message]
2026-05-01 1:16 ` [PATCH iproute2-next 4/5] netshaper: Make handle id optional for node scope Mohsin Bashir
2026-05-01 1:16 ` [PATCH iproute2-next 5/5] netshaper: Add group command for creating scheduling hierarchies Mohsin Bashir
2026-05-01 15:17 ` [PATCH iproute2-next 0/5] netshaper: Extend netshaper support Stephen Hemminger
2026-05-01 21:13 ` Mohsin Bashir
2026-05-01 17:52 ` David Ahern
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260501011611.3533573-4-mohsin.bashr@gmail.com \
--to=mohsin.bashr@gmail.com \
--cc=dsahern@kernel.org \
--cc=ernis@linux.microsoft.com \
--cc=kuba@kernel.org \
--cc=netdev@vger.kernel.org \
--cc=pabeni@redhat.com \
--cc=stephen@networkplumber.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.