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

From: Hangbin Liu

Date: Thu Sep 17 2026 - 02:39:00 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.

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

diff --git a/tools/net/ynl/pyynl/ynl_gen_c.py b/tools/net/ynl/pyynl/ynl_gen_c.py
index 2b3483db1b60..45bd7bc834b4 100755
--- a/tools/net/ynl/pyynl/ynl_gen_c.py
+++ b/tools/net/ynl/pyynl/ynl_gen_c.py
@@ -951,9 +951,17 @@ class TypeSubMessage(TypeNest):
sel_var = f"_sel_{sel}"
else:
sel_var = f"{var}->{sel}"
+
+ parse_sel = sel_var
+ 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"
+ parse_sel = f"{str_fn}({sel_var})"
+
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))",
+ 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};"]

--
2.55.0