summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid S. Miller <davem@davemloft.net>2023-03-03 11:22:39 +0300
committerDavid S. Miller <davem@davemloft.net>2023-03-03 11:22:39 +0300
commit8f632a0a1f6760bb4b1dd7a7e95689df1b5552fb (patch)
tree4c20400c6690b98b190c1121dce21de07c842171
parentad93bab6b8d3bfeae4a0158eaabd61bb0b2fbb79 (diff)
parentbcec7171eba901cc5f427ebbad9fe17ed4749b8f (diff)
downloadlinux-8f632a0a1f6760bb4b1dd7a7e95689df1b5552fb.tar.xz
Merge branch 'net-tools-ynl-fixes'
Jakub Kicinski says: ==================== tools: ynl: fix subset use and change default value for attrs/ops Fix a problem in subsetting, which will become apparent when the devlink family comes after the merge window. Even tho none of the existing families need this, we don't want someone to get "inspired" by the current, incorrect code when using specs in other languages. Change the default value for the first attr/op. This is a slight behavior change so needs to go in now. The diffstat of the last patch should serve as the clearest justification there.. ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--Documentation/netlink/specs/ethtool.yaml15
-rw-r--r--Documentation/netlink/specs/fou.yaml2
-rw-r--r--Documentation/netlink/specs/netdev.yaml2
-rw-r--r--Documentation/userspace-api/netlink/specs.rst10
-rw-r--r--tools/net/ynl/lib/nlspec.py27
-rwxr-xr-xtools/net/ynl/ynl-gen-c.py7
6 files changed, 32 insertions, 31 deletions
diff --git a/Documentation/netlink/specs/ethtool.yaml b/Documentation/netlink/specs/ethtool.yaml
index 08b776908d15..35c462bce56f 100644
--- a/Documentation/netlink/specs/ethtool.yaml
+++ b/Documentation/netlink/specs/ethtool.yaml
@@ -11,7 +11,6 @@ attribute-sets:
-
name: dev-index
type: u32
- value: 1
-
name: dev-name
type: string
@@ -25,7 +24,6 @@ attribute-sets:
-
name: index
type: u32
- value: 1
-
name: name
type: string
@@ -39,14 +37,12 @@ attribute-sets:
name: bit
type: nest
nested-attributes: bitset-bit
- value: 1
-
name: bitset
attributes:
-
name: nomask
type: flag
- value: 1
-
name: size
type: u32
@@ -61,7 +57,6 @@ attribute-sets:
-
name: index
type: u32
- value: 1
-
name: value
type: string
@@ -71,7 +66,6 @@ attribute-sets:
-
name: string
type: nest
- value: 1
multi-attr: true
nested-attributes: string
-
@@ -80,7 +74,6 @@ attribute-sets:
-
name: id
type: u32
- value: 1
-
name: count
type: u32
@@ -96,14 +89,12 @@ attribute-sets:
name: stringset
type: nest
multi-attr: true
- value: 1
nested-attributes: stringset
-
name: strset
attributes:
-
name: header
- value: 1
type: nest
nested-attributes: header
-
@@ -119,7 +110,6 @@ attribute-sets:
attributes:
-
name: header
- value: 1
type: nest
nested-attributes: header
-
@@ -132,7 +122,6 @@ attribute-sets:
attributes:
-
name: header
- value: 1
type: nest
nested-attributes: header
-
@@ -180,7 +169,6 @@ attribute-sets:
attributes:
-
name: pad
- value: 1
type: pad
-
name: reassembly-errors
@@ -205,7 +193,6 @@ attribute-sets:
attributes:
-
name: header
- value: 1
type: nest
nested-attributes: header
-
@@ -251,13 +238,11 @@ operations:
do: &strset-get-op
request:
- value: 1
attributes:
- header
- stringsets
- counts-only
reply:
- value: 1
attributes:
- header
- stringsets
diff --git a/Documentation/netlink/specs/fou.yaml b/Documentation/netlink/specs/fou.yaml
index 266c386eedf3..cca4cf98f03a 100644
--- a/Documentation/netlink/specs/fou.yaml
+++ b/Documentation/netlink/specs/fou.yaml
@@ -26,6 +26,7 @@ attribute-sets:
-
name: unspec
type: unused
+ value: 0
-
name: port
type: u16
@@ -71,6 +72,7 @@ operations:
-
name: unspec
doc: unused
+ value: 0
-
name: add
diff --git a/Documentation/netlink/specs/netdev.yaml b/Documentation/netlink/specs/netdev.yaml
index cffef09729f1..ba9ee13cf729 100644
--- a/Documentation/netlink/specs/netdev.yaml
+++ b/Documentation/netlink/specs/netdev.yaml
@@ -48,7 +48,6 @@ attribute-sets:
name: ifindex
doc: netdev ifindex
type: u32
- value: 1
checks:
min: 1
-
@@ -66,7 +65,6 @@ operations:
-
name: dev-get
doc: Get / dump information about a netdev.
- value: 1
attribute-set: dev
do:
request:
diff --git a/Documentation/userspace-api/netlink/specs.rst b/Documentation/userspace-api/netlink/specs.rst
index 6ffe8137cd90..32e53328d113 100644
--- a/Documentation/userspace-api/netlink/specs.rst
+++ b/Documentation/userspace-api/netlink/specs.rst
@@ -197,9 +197,15 @@ 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.
-Note that the ``value`` of an attribute is defined only in its main 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).
enum
~~~~
diff --git a/tools/net/ynl/lib/nlspec.py b/tools/net/ynl/lib/nlspec.py
index 71da568e2c28..9d394e50de23 100644
--- a/tools/net/ynl/lib/nlspec.py
+++ b/tools/net/ynl/lib/nlspec.py
@@ -95,15 +95,22 @@ class SpecAttrSet(SpecElement):
self.attrs = collections.OrderedDict()
self.attrs_by_val = collections.OrderedDict()
- val = 0
- for elem in self.yaml['attributes']:
- if 'value' in elem:
- val = elem['value']
+ if self.subset_of is None:
+ val = 1
+ for elem in self.yaml['attributes']:
+ if 'value' in elem:
+ val = elem['value']
- attr = self.new_attr(elem, val)
- self.attrs[attr.name] = attr
- self.attrs_by_val[attr.value] = attr
- val += 1
+ attr = self.new_attr(elem, val)
+ self.attrs[attr.name] = attr
+ self.attrs_by_val[attr.value] = attr
+ val += 1
+ else:
+ real_set = family.attr_sets[self.subset_of]
+ for elem in self.yaml['attributes']:
+ attr = real_set[elem['name']]
+ self.attrs[attr.name] = attr
+ self.attrs_by_val[attr.value] = attr
def new_attr(self, elem, value):
return SpecAttr(self.family, self, elem, value)
@@ -245,7 +252,7 @@ class SpecFamily(SpecElement):
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']
@@ -256,7 +263,7 @@ class SpecFamily(SpecElement):
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:
diff --git a/tools/net/ynl/ynl-gen-c.py b/tools/net/ynl/ynl-gen-c.py
index 274e9c566f61..62f8f2c3c56c 100755
--- a/tools/net/ynl/ynl-gen-c.py
+++ b/tools/net/ynl/ynl-gen-c.py
@@ -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: