Commit be093a80 authored by Jakub Kicinski's avatar Jakub Kicinski

tools: ynl-gen: inherit policy in multi-attr

Instead of reimplementing policies in MutliAttr for every
underlying type forward the calls to the base type.
This will be needed for DPLL which uses a multi-attr nest,
and currently gets an invalid NLA_NEST policy generated.
Reviewed-by: default avatarJacob Keller <Jacob.e.keller@intel.com>
Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent 10c4d2a7
...@@ -462,6 +462,11 @@ class TypeNest(Type): ...@@ -462,6 +462,11 @@ class TypeNest(Type):
class TypeMultiAttr(Type): class TypeMultiAttr(Type):
def __init__(self, family, attr_set, attr, value, base_type):
super().__init__(family, attr_set, attr, value)
self.base_type = base_type
def is_multi_val(self): def is_multi_val(self):
return True return True
...@@ -497,13 +502,11 @@ class TypeMultiAttr(Type): ...@@ -497,13 +502,11 @@ class TypeMultiAttr(Type):
else: else:
raise Exception(f"Free of MultiAttr sub-type {self.attr['type']} not supported yet") raise Exception(f"Free of MultiAttr sub-type {self.attr['type']} not supported yet")
def _attr_policy(self, policy):
return self.base_type._attr_policy(policy)
def _attr_typol(self): def _attr_typol(self):
if 'type' not in self.attr or self.attr['type'] == 'nest': return self.base_type._attr_typol()
return f'.type = YNL_PT_NEST, .nest = &{self.nested_render_name}_nest, '
elif self.attr['type'] in scalars:
return f".type = YNL_PT_U{self.attr['type'][1:]}, "
else:
raise Exception(f"Sub-type {self.attr['type']} not supported yet")
def _attr_get(self, ri, var): def _attr_get(self, ri, var):
return f'n_{self.c_name}++;', None, None return f'n_{self.c_name}++;', None, None
...@@ -717,29 +720,32 @@ class AttrSet(SpecAttrSet): ...@@ -717,29 +720,32 @@ class AttrSet(SpecAttrSet):
self.c_name = '' self.c_name = ''
def new_attr(self, elem, value): def new_attr(self, elem, value):
if 'multi-attr' in elem and elem['multi-attr']: if elem['type'] in scalars:
return TypeMultiAttr(self.family, self, elem, value) t = TypeScalar(self.family, self, elem, value)
elif elem['type'] in scalars:
return TypeScalar(self.family, self, elem, value)
elif elem['type'] == 'unused': elif elem['type'] == 'unused':
return TypeUnused(self.family, self, elem, value) t = TypeUnused(self.family, self, elem, value)
elif elem['type'] == 'pad': elif elem['type'] == 'pad':
return TypePad(self.family, self, elem, value) t = TypePad(self.family, self, elem, value)
elif elem['type'] == 'flag': elif elem['type'] == 'flag':
return TypeFlag(self.family, self, elem, value) t = TypeFlag(self.family, self, elem, value)
elif elem['type'] == 'string': elif elem['type'] == 'string':
return TypeString(self.family, self, elem, value) t = TypeString(self.family, self, elem, value)
elif elem['type'] == 'binary': elif elem['type'] == 'binary':
return TypeBinary(self.family, self, elem, value) t = TypeBinary(self.family, self, elem, value)
elif elem['type'] == 'nest': elif elem['type'] == 'nest':
return TypeNest(self.family, self, elem, value) t = TypeNest(self.family, self, elem, value)
elif elem['type'] == 'array-nest': elif elem['type'] == 'array-nest':
return TypeArrayNest(self.family, self, elem, value) t = TypeArrayNest(self.family, self, elem, value)
elif elem['type'] == 'nest-type-value': elif elem['type'] == 'nest-type-value':
return TypeNestTypeValue(self.family, self, elem, value) t = TypeNestTypeValue(self.family, self, elem, value)
else: else:
raise Exception(f"No typed class for type {elem['type']}") raise Exception(f"No typed class for type {elem['type']}")
if 'multi-attr' in elem and elem['multi-attr']:
t = TypeMultiAttr(self.family, self, elem, value, t)
return t
class Operation(SpecOperation): class Operation(SpecOperation):
def __init__(self, family, yaml, req_value, rsp_value): def __init__(self, family, yaml, req_value, rsp_value):
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment