Netdev List
 help / color / mirror / Atom feed
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.



  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