All of lore.kernel.org
 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: 10+ 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-15 23:18     ` Mohsin Bashir
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 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.