Skip to content

Commit

Permalink
tools: ynl: use 1 as the default for first entry in attrs/ops
Browse files Browse the repository at this point in the history
Pretty much all families use value: 1 or reserve as unspec
the first entry in attribute set and the first operation.
Make this the default. Update documentation (the doc for
values of operations just refers back to doc for attrs
so updating only attrs).

Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
kuba-moo authored and davem330 committed Mar 3, 2023
1 parent 7cf9353 commit ad4fafc
Show file tree
Hide file tree
Showing 3 changed files with 14 additions and 6 deletions.
7 changes: 6 additions & 1 deletion Documentation/userspace-api/netlink/specs.rst
Original file line number Diff line number Diff line change
Expand Up @@ -197,7 +197,12 @@ value
Numerical attribute ID, used in serialized Netlink messages.
The ``value`` property can be skipped, in which case the attribute ID
will be the value of the previous attribute plus one (recursively)
and ``0`` for the first attribute in the attribute set.
and ``1`` for the first attribute in the attribute set.

Attributes (and operations) use ``1`` as the default value for the first
entry (unlike enums in definitions which start from ``0``) because
entry ``0`` is almost always reserved as undefined. Spec can explicitly
set value to ``0`` if needed.

Note that the ``value`` of an attribute is defined only in its main set
(not in subsets).
Expand Down
6 changes: 3 additions & 3 deletions tools/net/ynl/lib/nlspec.py
Original file line number Diff line number Diff line change
Expand Up @@ -96,7 +96,7 @@ def __init__(self, family, yaml):
self.attrs_by_val = collections.OrderedDict()

if self.subset_of is None:
val = 0
val = 1
for elem in self.yaml['attributes']:
if 'value' in elem:
val = elem['value']
Expand Down Expand Up @@ -252,7 +252,7 @@ def add_unresolved(self, elem):
self._resolution_list.append(elem)

def _dictify_ops_unified(self):
val = 0
val = 1
for elem in self.yaml['operations']['list']:
if 'value' in elem:
val = elem['value']
Expand All @@ -263,7 +263,7 @@ def _dictify_ops_unified(self):
self.msgs[op.name] = op

def _dictify_ops_directional(self):
req_val = rsp_val = 0
req_val = rsp_val = 1
for elem in self.yaml['operations']['list']:
if 'notify' in elem:
if 'value' in elem:
Expand Down
7 changes: 5 additions & 2 deletions tools/net/ynl/ynl-gen-c.py
Original file line number Diff line number Diff line change
Expand Up @@ -2044,14 +2044,17 @@ def render_uapi(family, cw):
max_value = f"({cnt_name} - 1)"

uapi_enum_start(family, cw, family['operations'], 'enum-name')
val = 0
for op in family.msgs.values():
if separate_ntf and ('notify' in op or 'event' in op):
continue

suffix = ','
if 'value' in op:
suffix = f" = {op['value']},"
if op.value != val:
suffix = f" = {op.value},"
val = op.value
cw.p(op.enum_name + suffix)
val += 1
cw.nl()
cw.p(cnt_name + ('' if max_by_define else ','))
if not max_by_define:
Expand Down

0 comments on commit ad4fafc

Please sign in to comment.