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.
next prev parent 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