Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

tools: ynl-gen: add function prefix argument

This patch adds a new CLI argument for overriding the default
function prefix, as used for naming the doit/dumpit functions
in the generated kernel code.

When not specified the default "$(FAMILY)-nl" is used.

This can also be specified persistently in generated files:
/* YNL-ARG --function-prefix wg */

In the above example it causes the following changes:
wireguard_nl_get_device_dumpit() -> wg_get_device_dumpit()
wireguard_nl_get_device_doit() -> wg_get_device_doit()

The variable name fn_prefix, was chosen as it relates to op_prefix
which is used to prefix the UAPI commands enum entries.

Link: https://lore.kernel.org/r/aRvWzC8qz3iXDAb3@zx2c4.com/
Suggested-by: Jason A. Donenfeld <Jason@zx2c4.com>
Signed-off-by: Asbjørn Sloth Tønnesen <ast@fiberby.net>
Link: https://patch.msgid.link/20251120174429.390574-2-ast@fiberby.net
Signed-off-by: Jakub Kicinski <kuba@kernel.org>

authored by

Asbjørn Sloth Tønnesen and committed by
Jakub Kicinski
17fa6ee3 97a88d9e

+16 -9
+16 -9
tools/net/ynl/pyynl/ynl_gen_c.py
··· 1205 1205 1206 1206 1207 1207 class Family(SpecFamily): 1208 - def __init__(self, file_name, exclude_ops): 1208 + def __init__(self, file_name, exclude_ops, fn_prefix): 1209 1209 # Added by resolve: 1210 1210 self.c_name = None 1211 1211 delattr(self, "c_name") ··· 1236 1236 self.uapi_header_name = self.uapi_header[6:-2] 1237 1237 else: 1238 1238 self.uapi_header_name = self.ident_name 1239 + 1240 + self.fn_prefix = fn_prefix if fn_prefix else f'{self.ident_name}-nl' 1239 1241 1240 1242 def resolve(self): 1241 1243 self.resolve_up(super()) ··· 2913 2911 continue 2914 2912 2915 2913 if 'do' in op: 2916 - name = c_lower(f"{family.ident_name}-nl-{op_name}-doit") 2914 + name = c_lower(f"{family.fn_prefix}-{op_name}-doit") 2917 2915 cw.write_func_prot('int', name, 2918 2916 ['struct sk_buff *skb', 'struct genl_info *info'], suffix=';') 2919 2917 2920 2918 if 'dump' in op: 2921 - name = c_lower(f"{family.ident_name}-nl-{op_name}-dumpit") 2919 + name = c_lower(f"{family.fn_prefix}-{op_name}-dumpit") 2922 2920 cw.write_func_prot('int', name, 2923 2921 ['struct sk_buff *skb', 'struct netlink_callback *cb'], suffix=';') 2924 2922 cw.nl() ··· 2944 2942 for x in op['dont-validate']])), ) 2945 2943 for op_mode in ['do', 'dump']: 2946 2944 if op_mode in op: 2947 - name = c_lower(f"{family.ident_name}-nl-{op_name}-{op_mode}it") 2945 + name = c_lower(f"{family.fn_prefix}-{op_name}-{op_mode}it") 2948 2946 members.append((op_mode + 'it', name)) 2949 2947 if family.kernel_policy == 'per-op': 2950 2948 struct = Struct(family, op['attribute-set'], ··· 2982 2980 members.append(('validate', 2983 2981 ' | '.join([c_upper('genl-dont-validate-' + x) 2984 2982 for x in dont_validate])), ) 2985 - name = c_lower(f"{family.ident_name}-nl-{op_name}-{op_mode}it") 2983 + name = c_lower(f"{family.fn_prefix}-{op_name}-{op_mode}it") 2986 2984 if 'pre' in op[op_mode]: 2987 2985 members.append((cb_names[op_mode]['pre'], c_lower(op[op_mode]['pre']))) 2988 2986 members.append((op_mode + 'it', name)) ··· 3404 3402 help='Do not overwrite the output file if the new output is identical to the old') 3405 3403 parser.add_argument('--exclude-op', action='append', default=[]) 3406 3404 parser.add_argument('-o', dest='out_file', type=str, default=None) 3405 + parser.add_argument('--function-prefix', dest='fn_prefix', type=str) 3407 3406 args = parser.parse_args() 3408 3407 3409 3408 if args.header is None: ··· 3413 3410 exclude_ops = [re.compile(expr) for expr in args.exclude_op] 3414 3411 3415 3412 try: 3416 - parsed = Family(args.spec, exclude_ops) 3413 + parsed = Family(args.spec, exclude_ops, args.fn_prefix) 3417 3414 if parsed.license != '((GPL-2.0 WITH Linux-syscall-note) OR BSD-3-Clause)': 3418 3415 print('Spec license:', parsed.license) 3419 3416 print('License must be: ((GPL-2.0 WITH Linux-syscall-note) OR BSD-3-Clause)') ··· 3433 3430 cw.p("/* Do not edit directly, auto-generated from: */") 3434 3431 cw.p(f"/*\t{spec_kernel} */") 3435 3432 cw.p(f"/* YNL-GEN {args.mode} {'header' if args.header else 'source'} */") 3436 - if args.exclude_op or args.user_header: 3433 + if args.exclude_op or args.user_header or args.fn_prefix: 3437 3434 line = '' 3438 - line += ' --user-header '.join([''] + args.user_header) 3439 - line += ' --exclude-op '.join([''] + args.exclude_op) 3435 + if args.user_header: 3436 + line += ' --user-header '.join([''] + args.user_header) 3437 + if args.exclude_op: 3438 + line += ' --exclude-op '.join([''] + args.exclude_op) 3439 + if args.fn_prefix: 3440 + line += f' --function-prefix {args.fn_prefix}' 3440 3441 cw.p(f'/* YNL-ARG{line} */') 3441 3442 cw.nl() 3442 3443