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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox