Loading tools/net/ynl/ynl-gen-c.py +13 −2 Original line number Original line Diff line number Diff line Loading @@ -300,8 +300,10 @@ class TypeScalar(Type): return f"NLA_POLICY_MIN({policy}, {self.checks['min']})" return f"NLA_POLICY_MIN({policy}, {self.checks['min']})" elif 'enum' in self.attr: elif 'enum' in self.attr: enum = self.family.consts[self.attr['enum']] enum = self.family.consts[self.attr['enum']] cnt = len(enum['entries']) low, high = enum.value_range() return f"NLA_POLICY_MAX({policy}, {cnt - 1})" if low == 0: return f"NLA_POLICY_MAX({policy}, {high})" return f"NLA_POLICY_RANGE({policy}, {low}, {high})" return super()._attr_policy(policy) return super()._attr_policy(policy) def _attr_typol(self): def _attr_typol(self): Loading Loading @@ -676,6 +678,15 @@ class EnumSet(SpecEnumSet): def new_entry(self, entry, prev_entry, value_start): def new_entry(self, entry, prev_entry, value_start): return EnumEntry(self, entry, prev_entry, value_start) return EnumEntry(self, entry, prev_entry, value_start) def value_range(self): low = min([x.value for x in self.entries.values()]) high = max([x.value for x in self.entries.values()]) if high - low + 1 != len(self.entries): raise Exception("Can't get value range for a noncontiguous enum") return low, high class AttrSet(SpecAttrSet): class AttrSet(SpecAttrSet): def __init__(self, family, yaml): def __init__(self, family, yaml): Loading Loading
tools/net/ynl/ynl-gen-c.py +13 −2 Original line number Original line Diff line number Diff line Loading @@ -300,8 +300,10 @@ class TypeScalar(Type): return f"NLA_POLICY_MIN({policy}, {self.checks['min']})" return f"NLA_POLICY_MIN({policy}, {self.checks['min']})" elif 'enum' in self.attr: elif 'enum' in self.attr: enum = self.family.consts[self.attr['enum']] enum = self.family.consts[self.attr['enum']] cnt = len(enum['entries']) low, high = enum.value_range() return f"NLA_POLICY_MAX({policy}, {cnt - 1})" if low == 0: return f"NLA_POLICY_MAX({policy}, {high})" return f"NLA_POLICY_RANGE({policy}, {low}, {high})" return super()._attr_policy(policy) return super()._attr_policy(policy) def _attr_typol(self): def _attr_typol(self): Loading Loading @@ -676,6 +678,15 @@ class EnumSet(SpecEnumSet): def new_entry(self, entry, prev_entry, value_start): def new_entry(self, entry, prev_entry, value_start): return EnumEntry(self, entry, prev_entry, value_start) return EnumEntry(self, entry, prev_entry, value_start) def value_range(self): low = min([x.value for x in self.entries.values()]) high = max([x.value for x in self.entries.values()]) if high - low + 1 != len(self.entries): raise Exception("Can't get value range for a noncontiguous enum") return low, high class AttrSet(SpecAttrSet): class AttrSet(SpecAttrSet): def __init__(self, family, yaml): def __init__(self, family, yaml): Loading