[PATCH net-next v2 2/6] tools: ynl: convert enum selector to string for sub-message parsing

From: Hangbin Liu

Date: Sun Sep 20 2026 - 06:08:58 EST


From: Hangbin Liu <liuhangbin@xxxxxxxxxx>

YNL sub-message parsing expects a string selector for strcmp(). So for
non-external enum selectors, convert the integer value to its string form
via the family's {enum}_str() helper. This enables correct decoding of
sub-messages keyed by enum values.

After change, the new generated code looks like

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;

Signed-off-by: Hangbin Liu <liuhangbin@xxxxxxxxxx>
---
tools/net/ynl/pyynl/ynl_gen_c.py | 20 ++++++++++++++++----
1 file changed, 16 insertions(+), 4 deletions(-)

diff --git a/tools/net/ynl/pyynl/ynl_gen_c.py b/tools/net/ynl/pyynl/ynl_gen_c.py
index 2b3483db1b60..785e747e5865 100755
--- a/tools/net/ynl/pyynl/ynl_gen_c.py
+++ b/tools/net/ynl/pyynl/ynl_gen_c.py
@@ -951,10 +951,22 @@ class TypeSubMessage(TypeNest):
sel_var = f"_sel_{sel}"
else:
sel_var = f"{var}->{sel}"
- get_lines = [f'if (!{sel_var})',
- f'return ynl_submsg_failed(yarg, "{self.name}", "{selector}");',
- f"if ({self.nested_render_name}_parse(&parg, {sel_var}, attr))",
- "return YNL_PARSE_CB_ERROR;"]
+
+ 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
+
+ get_lines += [f'if (!{parse_sel})',
+ f'return ynl_submsg_failed(yarg, "{self.name}", "{selector}");',
+ f"if ({self.nested_render_name}_parse(&parg, {parse_sel}, attr))",
+ "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

--
2.55.0