Skip to content

Commit

Permalink
tools: ynl-gen: use names of constants in generated limits
Browse files Browse the repository at this point in the history
YNL specs can use string expressions for limits, like s32-min
or u16-max. We convert all of those into their numeric values
when generating the code, which isn't always helpful. Try to
retain the string representations in the output. Any sort of
calculations still need the integers.

Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Reviewed-by: Joe Damato <jdamato@fastly.com>
Link: https://patch.msgid.link/20241010151248.2049755-1-kuba@kernel.org
[pabeni@redhat.com: regenerated netdev-genl-gen.c]
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
  • Loading branch information
Jakub Kicinski authored and Paolo Abeni committed Oct 15, 2024
1 parent 97802ff commit bcbbfaa
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 16 deletions.
6 changes: 3 additions & 3 deletions net/core/netdev-genl-gen.c
Original file line number Diff line number Diff line change
Expand Up @@ -14,16 +14,16 @@
/* Integer value ranges */
static const struct netlink_range_validation netdev_a_page_pool_id_range = {
.min = 1ULL,
.max = 4294967295ULL,
.max = U32_MAX,
};

static const struct netlink_range_validation netdev_a_page_pool_ifindex_range = {
.min = 1ULL,
.max = 2147483647ULL,
.max = S32_MAX,
};

static const struct netlink_range_validation netdev_a_napi_defer_hard_irqs_range = {
.max = 2147483647ULL,
.max = S32_MAX,
};

/* Common nested types */
Expand Down
36 changes: 23 additions & 13 deletions tools/net/ynl/ynl-gen-c.py
Original file line number Diff line number Diff line change
Expand Up @@ -80,11 +80,21 @@ def get_limit(self, limit, default=None):
value = self.checks.get(limit, default)
if value is None:
return value
elif value in self.family.consts:
if isinstance(value, int):
return value
if value in self.family.consts:
raise Exception("Resolving family constants not implemented, yet")
return limit_to_number(value)

def get_limit_str(self, limit, default=None, suffix=''):
value = self.checks.get(limit, default)
if value is None:
return ''
if isinstance(value, int):
return str(value) + suffix
if value in self.family.consts:
return c_upper(f"{self.family['name']}-{value}")
if not isinstance(value, int):
value = limit_to_number(value)
return value
return c_upper(value)

def resolve(self):
if 'name-prefix' in self.attr:
Expand Down Expand Up @@ -358,11 +368,11 @@ def _attr_policy(self, policy):
elif 'full-range' in self.checks:
return f"NLA_POLICY_FULL_RANGE({policy}, &{c_lower(self.enum_name)}_range)"
elif 'range' in self.checks:
return f"NLA_POLICY_RANGE({policy}, {self.get_limit('min')}, {self.get_limit('max')})"
return f"NLA_POLICY_RANGE({policy}, {self.get_limit_str('min')}, {self.get_limit_str('max')})"
elif 'min' in self.checks:
return f"NLA_POLICY_MIN({policy}, {self.get_limit('min')})"
return f"NLA_POLICY_MIN({policy}, {self.get_limit_str('min')})"
elif 'max' in self.checks:
return f"NLA_POLICY_MAX({policy}, {self.get_limit('max')})"
return f"NLA_POLICY_MAX({policy}, {self.get_limit_str('max')})"
return super()._attr_policy(policy)

def _attr_typol(self):
Expand Down Expand Up @@ -413,11 +423,11 @@ def _attr_typol(self):

def _attr_policy(self, policy):
if 'exact-len' in self.checks:
mem = 'NLA_POLICY_EXACT_LEN(' + str(self.get_limit('exact-len')) + ')'
mem = 'NLA_POLICY_EXACT_LEN(' + self.get_limit_str('exact-len') + ')'
else:
mem = '{ .type = ' + policy
if 'max-len' in self.checks:
mem += ', .len = ' + str(self.get_limit('max-len'))
mem += ', .len = ' + self.get_limit_str('max-len')
mem += ', }'
return mem

Expand Down Expand Up @@ -476,9 +486,9 @@ def _attr_policy(self, policy):
if len(self.checks) == 0:
mem = '{ .type = NLA_BINARY, }'
elif 'exact-len' in self.checks:
mem = 'NLA_POLICY_EXACT_LEN(' + str(self.get_limit('exact-len')) + ')'
mem = 'NLA_POLICY_EXACT_LEN(' + self.get_limit_str('exact-len') + ')'
elif 'min-len' in self.checks:
mem = '{ .len = ' + str(self.get_limit('min-len')) + ', }'
mem = '{ .len = ' + self.get_limit_str('min-len') + ', }'

return mem

Expand Down Expand Up @@ -2166,9 +2176,9 @@ def print_kernel_policy_ranges(family, cw):
cw.block_start(line=f'static const struct netlink_range_validation{sign} {c_lower(attr.enum_name)}_range =')
members = []
if 'min' in attr.checks:
members.append(('min', str(attr.get_limit('min')) + suffix))
members.append(('min', attr.get_limit_str('min', suffix=suffix)))
if 'max' in attr.checks:
members.append(('max', str(attr.get_limit('max')) + suffix))
members.append(('max', attr.get_limit_str('max', suffix=suffix)))
cw.write_struct_init(members)
cw.block_end(line=';')
cw.nl()
Expand Down

0 comments on commit bcbbfaa

Please sign in to comment.