Netdev List
 help / color / mirror / Atom feed
From: Mohsin Bashir <mohsin.bashr@gmail.com>
To: David Ahern <dsahern@kernel.org>, netdev@vger.kernel.org
Cc: stephen@networkplumber.org, pabeni@redhat.com, kuba@kernel.org,
	ernis@linux.microsoft.com, alexanderduyck@gmail.com
Subject: Re: [PATCH iproute2-next v3 5/6] netshaper: Add group command for creating scheduling hierarchies
Date: Sat, 16 May 2026 04:18:23 +0500	[thread overview]
Message-ID: <ae1103c0-c407-4215-9ce0-5a775e781eb2@gmail.com> (raw)
In-Reply-To: <9866a42a-98e8-4a34-9962-33ec0df4dcc3@kernel.org>



On 5/14/26 8:15 AM, David Ahern wrote:
> 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?
> 

It is just an arbitrary value and there's no uapi basis for this. I can 
switch to dynamic allocation/re-allocation.

>> +
>> +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.

Yeah, that's a good suggestion.

> 
>> +			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.
> 
> 

Sure.

  reply	other threads:[~2026-05-15 23:18 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
2026-05-15 23:18     ` Mohsin Bashir [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=ae1103c0-c407-4215-9ce0-5a775e781eb2@gmail.com \
    --to=mohsin.bashr@gmail.com \
    --cc=alexanderduyck@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