From: David Ahern <dsahern@kernel.org>
To: Mohsin Bashir <mohsin.bashr@gmail.com>, netdev@vger.kernel.org
Cc: stephen@networkplumber.org, pabeni@redhat.com, kuba@kernel.org,
ernis@linux.microsoft.com, alexanderduyck@gmail.com,
Claude Assistant <noreply@anthropic.com>
Subject: Re: [PATCH iproute2-next v3 5/6] netshaper: Add group command for creating scheduling hierarchies
Date: Thu, 14 May 2026 09:15:49 -0600 [thread overview]
Message-ID: <9866a42a-98e8-4a34-9962-33ec0df4dcc3@kernel.org> (raw)
In-Reply-To: <20260511183915.797792-6-mohsin.bashr@gmail.com>
On 5/11/26 12:39 PM, Mohsin Bashir wrote:
> @@ -319,6 +324,217 @@ static int do_cmd(int argc, char **argv, int cmd)
> return err;
> }
>
> +#define NET_SHAPER_MAX_LEAVES 256
why 256 as the limit? What drives a max value -- anything related to the
uapi? Will 256 ever be deemed too little? if not, why?
> +
> +static int do_group(int argc, char **argv)
> +{
> + GENL_REQUEST(req, 4096, genl_family, 0, NET_SHAPER_FAMILY_VERSION,
> + NET_SHAPER_CMD_GROUP, NLM_F_REQUEST | NLM_F_ACK);
> +
> + struct shaper_args args = SHAPER_ARGS_INIT;
> + bool parsing_leaves = false, has_handle_id = false, has_parent_id = false;
> + int parent_scope = -1, num_leaves = 0;
> + int err, ret, handle_scope = NET_SHAPER_SCOPE_UNSPEC;
> + __u32 handle_id = 0, parent_id = 0;
> + struct nlmsghdr *answer;
> +
> + struct {
> + int scope;
> + __u32 id;
> + } leaves[NET_SHAPER_MAX_LEAVES];
> +
> + while (argc > 0) {
> + if (parsing_leaves) {
This while loop is really long. Move this parsing_leaves code to a
function and then drop the parsing_leaves flag.
> + if (strcmp(*argv, "scope") == 0) {
> + int lscope;
> +
> + NEXT_ARG();
> + lscope = parse_scope(*argv);
> + if (lscope < 0) {
> + fprintf(stderr, "Invalid leaf scope \"%s\"\n",
> + *argv);
> + return -1;
> + }
> + NEXT_ARG();
> + if (strcmp(*argv, "id") != 0) {
> + fprintf(stderr, "Expected \"id\" after leaf scope\n");
> + return -1;
> + }
> +
> + NEXT_ARG();
> + if (num_leaves >= ARRAY_SIZE(leaves)) {
> + fprintf(stderr, "Too many leaves\n");
> + return -1;
> + }
> + leaves[num_leaves].scope = lscope;
> + if (get_unsigned(&leaves[num_leaves].id, *argv, 10)) {
> + fprintf(stderr, "Invalid leaf id\n");
> + return -1;
> + }
> + num_leaves++;
> + argc--;
> + argv++;
> + continue;
> + }
> + parsing_leaves = false;
> + }
> +
> + ret = parse_shaper_arg(*argv, &argc, &argv, &args);
> + if (ret < 0)
> + return -1;
> + if (ret > 0) {
> + argc--;
> + argv++;
> + continue;
> + }
> +
> + if (strcmp(*argv, "handle") == 0) {
> + NEXT_ARG();
> + if (strcmp(*argv, "scope") != 0) {
> + fprintf(stderr, "Expected \"scope\" after \"handle\"\n");
> + return -1;
> + }
> + NEXT_ARG();
> + handle_scope = parse_scope(*argv);
> + if (handle_scope < 0) {
> + fprintf(stderr, "Invalid handle scope \"%s\"\n",
> + *argv);
> + return -1;
> + }
> + if (handle_scope != NET_SHAPER_SCOPE_NODE &&
> + handle_scope != NET_SHAPER_SCOPE_NETDEV) {
> + fprintf(stderr, "Group handle scope must be \"node\" or \"netdev\"\n");
> + return -1;
> + }
> +
> + if (argc > 1 && strcmp(argv[1], "id") == 0) {
> + NEXT_ARG();
> + NEXT_ARG();
> + if (get_unsigned(&handle_id, *argv, 10)) {
> + fprintf(stderr, "Invalid handle id\n");
> + return -1;
> + }
> + has_handle_id = true;
> + }
> + } else if (strcmp(*argv, "parent") == 0) {
> + NEXT_ARG();
> + if (strcmp(*argv, "scope") != 0) {
> + fprintf(stderr, "Expected \"scope\" after \"parent\"\n");
> + return -1;
> + }
> + NEXT_ARG();
> + parent_scope = parse_scope(*argv);
> + if (parent_scope < 0) {
> + fprintf(stderr, "Invalid parent scope \"%s\"\n",
> + *argv);
> + return -1;
> + }
> + if (parent_scope != NET_SHAPER_SCOPE_NODE &&
> + parent_scope != NET_SHAPER_SCOPE_NETDEV) {
> + fprintf(stderr, "Parent scope must be \"node\" or \"netdev\"\n");
> + return -1;
> + }
> +
> + if (parent_scope == NET_SHAPER_SCOPE_NODE) {
> + NEXT_ARG();
> + if (strcmp(*argv, "id") != 0) {
> + fprintf(stderr, "What is \"%s\"\n", *argv);
> + usage();
> + return -1;
> + }
> + NEXT_ARG();
> + if (get_unsigned(&parent_id, *argv, 10)) {
> + fprintf(stderr, "Invalid parent id\n");
> + return -1;
> + }
> + has_parent_id = true;
> + } else if (argc > 1 && strcmp(argv[1], "id") == 0) {
> + NEXT_ARG();
> + NEXT_ARG();
> + if (get_unsigned(&parent_id, *argv, 10)) {
> + fprintf(stderr, "Invalid parent id\n");
> + return -1;
> + }
> + has_parent_id = true;
> + }
> + } else if (strcmp(*argv, "leaves") == 0) {
> + parsing_leaves = true;
> + argc--;
> + argv++;
> + continue;
> + } else {
> + fprintf(stderr, "What is \"%s\"\n", *argv);
> + usage();
> + return -1;
> + }
> + argc--;
> + argv++;
> + }
> +
> + if (args.ifindex == -1)
> + missarg("dev");
> + if (handle_scope == NET_SHAPER_SCOPE_UNSPEC)
> + missarg("handle");
> + if (parent_scope < 0)
> + missarg("parent");
> + if (num_leaves == 0)
> + missarg("leaves");
> +
> + addattr32(&req.n, sizeof(req), NET_SHAPER_A_IFINDEX, args.ifindex);
> +
> + struct rtattr *parent = addattr_nest(&req.n, sizeof(req),
> + NET_SHAPER_A_PARENT | NLA_F_NESTED);
no inline declarations.
Claude and Codex like to do this. If this code was co-authored by an AI
tool, please add the Assisted by tag (see
Documentation/process/coding-assistants.rst in the kernel repo). And if
that is true (code is co-authored by AI), drop the Reviewed-by tag.
next prev parent reply other threads:[~2026-05-14 15:15 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-05-11 18:39 [PATCH iproute2-next v3 0/6] netshaper: Extend netshaper support Mohsin Bashir
2026-05-11 18:39 ` [PATCH iproute2-next v3 1/6] netshaper: Extract parse_scope() and parse_rate() helpers Mohsin Bashir
2026-05-11 18:39 ` [PATCH iproute2-next v3 2/6] netshaper: Add bw-min and weight parameter support Mohsin Bashir
2026-05-14 15:16 ` David Ahern
2026-05-11 18:39 ` [PATCH iproute2-next v3 3/6] netshaper: Extend show output with parent, bw-min and weight Mohsin Bashir
2026-05-11 18:39 ` [PATCH iproute2-next v3 4/6] netshaper: Extract struct shaper_args and parse_shaper_arg() helper Mohsin Bashir
2026-05-11 18:39 ` [PATCH iproute2-next v3 5/6] netshaper: Add group command for creating scheduling hierarchies Mohsin Bashir
2026-05-14 15:15 ` David Ahern [this message]
2026-05-11 18:39 ` [PATCH iproute2-next v3 6/6] netshaper: Update man page for new parameters and group command Mohsin Bashir
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=9866a42a-98e8-4a34-9962-33ec0df4dcc3@kernel.org \
--to=dsahern@kernel.org \
--cc=alexanderduyck@gmail.com \
--cc=ernis@linux.microsoft.com \
--cc=kuba@kernel.org \
--cc=mohsin.bashr@gmail.com \
--cc=netdev@vger.kernel.org \
--cc=noreply@anthropic.com \
--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