tools: ynl-gen: split presence metadata
authorJakub Kicinski <kuba@kernel.org>
Mon, 5 May 2025 16:52:06 +0000 (09:52 -0700)
committerJakub Kicinski <kuba@kernel.org>
Thu, 8 May 2025 01:21:25 +0000 (18:21 -0700)
commitb8ae9f70aaf134dc57f227fd1730b64ce89e109d
treef7c3b66c647c04c4657e7ccc7f7411249de8dee2
parenta512be0ecb147e25ec0492335953ae8ad8e28fcb
tools: ynl-gen: split presence metadata

Each YNL struct contains the data and a sub-struct indicating which
fields are valid. Something like:

  struct family_op_req {
      struct {
            u32 a:1;
            u32 b:1;
    u32 bin_len;
      } _present;

      u32 a;
      u64 b;
      const unsigned char *bin;
  };

Note that the bin object 'bin' has a length stored, and that length
has a _len suffix added to the field name. This breaks if there
is a explicit field called bin_len, which is the case for some
TC actions. Move the length fields out of the _present struct,
create a new struct called _len:

  struct family_op_req {
      struct {
            u32 a:1;
            u32 b:1;
      } _present;
      struct {
    u32 bin;
      } _len;

      u32 a;
      u64 b;
      const unsigned char *bin;
  };

This should prevent name collisions and help with the packing
of the struct.

Unfortunately this is a breaking change, but hopefully the migration
isn't too painful.

Link: https://patch.msgid.link/20250505165208.248049-3-kuba@kernel.org
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
tools/net/ynl/pyynl/ynl_gen_c.py
tools/net/ynl/samples/devlink.c
tools/net/ynl/samples/rt-addr.c
tools/net/ynl/samples/rt-route.c