Re: [PATCH net-next v2 2/6] tools: ynl: convert enum selector to string for sub-message parsing
From: Jakub Kicinski
Date: Wed Sep 23 2026 - 21:14:45 EST
On Sun, 20 Sep 2026 18:06:37 +0800 Hangbin Liu wrote:
> const char *encap_type_str;
> encap_type_str = rt_route_encap_type_str(dst->encap_type);
> if (!encap_type_str)
> return ynl_submsg_failed(yarg, "encap", "encap-type");
> if (rt_route_encap_data_parse(&parg, encap_type_str, attr))
> return YNL_PARSE_CB_ERROR;
Please squash this in:
diff --git a/tools/net/ynl/pyynl/ynl_gen_c.py b/tools/net/ynl/pyynl/ynl_gen_c.py
index 785e747e5865..3b95e5d31638 100755
--- a/tools/net/ynl/pyynl/ynl_gen_c.py
+++ b/tools/net/ynl/pyynl/ynl_gen_c.py
@@ -954,14 +954,13 @@ from lib import SpecSubMessage
parse_sel = sel_var
get_lines = []
- if not self.selector.is_external() and self.selector.attr and \
- "enum" in self.selector.attr.attr:
- enum_name = self.selector.attr.attr["enum"]
- str_fn = c_lower(self.family.ident_name + "-" + enum_name) + "_str"
- sel_str_var = f"{sel}_str"
- get_lines += [f'const char *{sel_str_var};',
- f'{sel_str_var} = {str_fn}({sel_var});']
- parse_sel = sel_str_var
+ local_vars = None
+
+ if self.selector.is_enum_val():
+ parse_sel = f"{sel}_str"
+ local_vars = [f'const char *{parse_sel};']
+ enum = self.family.consts[self.selector.get_enum_name()]
+ get_lines += [f'{parse_sel} = {enum.render_name}_str({sel_var});']
get_lines += [f'if (!{parse_sel})',
f'return ynl_submsg_failed(yarg, "{self.name}", "{selector}");',
@@ -969,7 +968,7 @@ from lib import SpecSubMessage
"return YNL_PARSE_CB_ERROR;"]
init_lines = [f"parg.rsp_policy = &{self.nested_render_name}_nest;",
f"parg.data = &{var}->{self.c_name};"]
- return get_lines, init_lines, None
+ return get_lines, init_lines, local_vars
class Selector:
@@ -991,6 +990,12 @@ from lib import SpecSubMessage
def is_external(self):
return self._external
+ def is_enum_val(self):
+ return self.get_enum_name() is not None
+
+ def get_enum_name(self):
+ return self.attr and self.attr.attr.get("enum")
+
class Struct:
def __init__(self, family, space_name, type_list=None, fixed_header=None,