From: Hangbin Liu 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 --- 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