14e16b6a7SJakub Kicinski# SPDX-License-Identifier: ((GPL-2.0 WITH Linux-syscall-note) OR BSD-3-Clause)
2e616c07cSJakub Kicinski%YAML 1.2
3e616c07cSJakub Kicinski---
4e616c07cSJakub Kicinski$id: http://kernel.org/schemas/netlink/genetlink-legacy.yaml#
5e616c07cSJakub Kicinski$schema: https://json-schema.org/draft-07/schema
6e616c07cSJakub Kicinski
7e616c07cSJakub Kicinski# Common defines
8e616c07cSJakub Kicinski$defs:
9e616c07cSJakub Kicinski  uint:
10e616c07cSJakub Kicinski    type: integer
11e616c07cSJakub Kicinski    minimum: 0
12e616c07cSJakub Kicinski  len-or-define:
13e616c07cSJakub Kicinski    type: [ string, integer ]
14e616c07cSJakub Kicinski    pattern: ^[0-9A-Za-z_]+( - 1)?$
15e616c07cSJakub Kicinski    minimum: 0
16e616c07cSJakub Kicinski
17e616c07cSJakub Kicinski# Schema for specs
18e616c07cSJakub Kicinskititle: Protocol
19e616c07cSJakub Kicinskidescription: Specification of a genetlink protocol
20e616c07cSJakub Kicinskitype: object
21e616c07cSJakub Kicinskirequired: [ name, doc, attribute-sets, operations ]
22e616c07cSJakub KicinskiadditionalProperties: False
23e616c07cSJakub Kicinskiproperties:
24e616c07cSJakub Kicinski  name:
25e616c07cSJakub Kicinski    description: Name of the genetlink family.
26e616c07cSJakub Kicinski    type: string
27e616c07cSJakub Kicinski  doc:
28e616c07cSJakub Kicinski    type: string
29e616c07cSJakub Kicinski  version:
30e616c07cSJakub Kicinski    description: Generic Netlink family version. Default is 1.
31e616c07cSJakub Kicinski    type: integer
32e616c07cSJakub Kicinski    minimum: 1
33e616c07cSJakub Kicinski  protocol:
34e616c07cSJakub Kicinski    description: Schema compatibility level. Default is "genetlink".
35e616c07cSJakub Kicinski    enum: [ genetlink, genetlink-c, genetlink-legacy ] # Trim
36e616c07cSJakub Kicinski  uapi-header:
37e616c07cSJakub Kicinski    description: Path to the uAPI header, default is linux/${family-name}.h
38e616c07cSJakub Kicinski    type: string
3982b32970SJakub Kicinski  # Start genetlink-c
40e616c07cSJakub Kicinski  c-family-name:
41e616c07cSJakub Kicinski    description: Name of the define for the family name.
42e616c07cSJakub Kicinski    type: string
43e616c07cSJakub Kicinski  c-version-name:
44e616c07cSJakub Kicinski    description: Name of the define for the verion of the family.
45e616c07cSJakub Kicinski    type: string
46e616c07cSJakub Kicinski  max-by-define:
47e616c07cSJakub Kicinski    description: Makes the number of attributes and commands be specified by a define, not an enum value.
48e616c07cSJakub Kicinski    type: boolean
49e616c07cSJakub Kicinski  # End genetlink-c
50e616c07cSJakub Kicinski  # Start genetlink-legacy
51e616c07cSJakub Kicinski  kernel-policy:
52e616c07cSJakub Kicinski    description: |
53e616c07cSJakub Kicinski      Defines if the input policy in the kernel is global, per-operation, or split per operation type.
54e616c07cSJakub Kicinski      Default is split.
55e616c07cSJakub Kicinski    enum: [ split, per-op, global ]
56e616c07cSJakub Kicinski  # End genetlink-legacy
57e616c07cSJakub Kicinski
58e616c07cSJakub Kicinski  definitions:
59e616c07cSJakub Kicinski    description: List of type and constant definitions (enums, flags, defines).
60e616c07cSJakub Kicinski    type: array
61e616c07cSJakub Kicinski    items:
62e616c07cSJakub Kicinski      type: object
63e616c07cSJakub Kicinski      required: [ type, name ]
64e616c07cSJakub Kicinski      additionalProperties: False
65e616c07cSJakub Kicinski      properties:
66e616c07cSJakub Kicinski        name:
67e616c07cSJakub Kicinski          type: string
68e616c07cSJakub Kicinski        header:
69e616c07cSJakub Kicinski          description: For C-compatible languages, header which already defines this value.
70e616c07cSJakub Kicinski          type: string
71e616c07cSJakub Kicinski        type:
72e616c07cSJakub Kicinski          enum: [ const, enum, flags, struct ] # Trim
73e616c07cSJakub Kicinski        doc:
74e616c07cSJakub Kicinski          type: string
75e616c07cSJakub Kicinski        # For const
76e616c07cSJakub Kicinski        value:
77e616c07cSJakub Kicinski          description: For const - the value.
78e616c07cSJakub Kicinski          type: [ string, integer ]
79e616c07cSJakub Kicinski        # For enum and flags
80e616c07cSJakub Kicinski        value-start:
81e616c07cSJakub Kicinski          description: For enum or flags the literal initializer for the first value.
82e616c07cSJakub Kicinski          type: [ string, integer ]
83e616c07cSJakub Kicinski        entries:
84e616c07cSJakub Kicinski          description: For enum or flags array of values.
85e616c07cSJakub Kicinski          type: array
86e616c07cSJakub Kicinski          items:
87e616c07cSJakub Kicinski            oneOf:
88e616c07cSJakub Kicinski              - type: string
89e616c07cSJakub Kicinski              - type: object
90e616c07cSJakub Kicinski                required: [ name ]
91e616c07cSJakub Kicinski                additionalProperties: False
92e616c07cSJakub Kicinski                properties:
93e616c07cSJakub Kicinski                  name:
94e616c07cSJakub Kicinski                    type: string
95e616c07cSJakub Kicinski                  value:
96e616c07cSJakub Kicinski                    type: integer
97e616c07cSJakub Kicinski                  doc:
98e616c07cSJakub Kicinski                    type: string
99e616c07cSJakub Kicinski        render-max:
100e616c07cSJakub Kicinski          description: Render the max members for this enum.
101e616c07cSJakub Kicinski          type: boolean
102e616c07cSJakub Kicinski        # Start genetlink-c
103e616c07cSJakub Kicinski        enum-name:
104e616c07cSJakub Kicinski          description: Name for enum, if empty no name will be used.
105e616c07cSJakub Kicinski          type: [ string, "null" ]
106e616c07cSJakub Kicinski        name-prefix:
107e616c07cSJakub Kicinski          description: For enum the prefix of the values, optional.
108e616c07cSJakub Kicinski          type: string
109e616c07cSJakub Kicinski        # End genetlink-c
110e616c07cSJakub Kicinski        # Start genetlink-legacy
111e616c07cSJakub Kicinski        members:
112e616c07cSJakub Kicinski          description: List of struct members. Only scalars and strings members allowed.
113e616c07cSJakub Kicinski          type: array
114e616c07cSJakub Kicinski          items:
115e616c07cSJakub Kicinski            type: object
116e616c07cSJakub Kicinski            required: [ name, type ]
117e616c07cSJakub Kicinski            additionalProperties: False
118e616c07cSJakub Kicinski            properties:
119e616c07cSJakub Kicinski              name:
120e616c07cSJakub Kicinski                type: string
121e616c07cSJakub Kicinski              type:
122e616c07cSJakub Kicinski                enum: [ u8, u16, u32, u64, s8, s16, s32, s64, string ]
123e616c07cSJakub Kicinski              len:
124e616c07cSJakub Kicinski                $ref: '#/$defs/len-or-define'
125*bddd2e56SDonald Hunter              byte-order:
126*bddd2e56SDonald Hunter                enum: [ little-endian, big-endian ]
127e616c07cSJakub Kicinski        # End genetlink-legacy
128e616c07cSJakub Kicinski
129e616c07cSJakub Kicinski  attribute-sets:
130e616c07cSJakub Kicinski    description: Definition of attribute spaces for this family.
131e616c07cSJakub Kicinski    type: array
132e616c07cSJakub Kicinski    items:
133e616c07cSJakub Kicinski      description: Definition of a single attribute space.
134e616c07cSJakub Kicinski      type: object
135e616c07cSJakub Kicinski      required: [ name, attributes ]
136e616c07cSJakub Kicinski      additionalProperties: False
137e616c07cSJakub Kicinski      properties:
138e616c07cSJakub Kicinski        name:
139e616c07cSJakub Kicinski          description: |
140e616c07cSJakub Kicinski            Name used when referring to this space in other definitions, not used outside of the spec.
141e616c07cSJakub Kicinski          type: string
142e616c07cSJakub Kicinski        name-prefix:
143e616c07cSJakub Kicinski          description: |
144e616c07cSJakub Kicinski            Prefix for the C enum name of the attributes. Default family[name]-set[name]-a-
145e616c07cSJakub Kicinski          type: string
146e616c07cSJakub Kicinski        enum-name:
147e616c07cSJakub Kicinski          description: Name for the enum type of the attribute.
148e616c07cSJakub Kicinski          type: string
149e616c07cSJakub Kicinski        doc:
150e616c07cSJakub Kicinski          description: Documentation of the space.
151e616c07cSJakub Kicinski          type: string
152e616c07cSJakub Kicinski        subset-of:
153e616c07cSJakub Kicinski          description: |
154e616c07cSJakub Kicinski            Name of another space which this is a logical part of. Sub-spaces can be used to define
155e616c07cSJakub Kicinski            a limited group of attributes which are used in a nest.
156e616c07cSJakub Kicinski          type: string
157e616c07cSJakub Kicinski        # Start genetlink-c
158e616c07cSJakub Kicinski        attr-cnt-name:
159e616c07cSJakub Kicinski          description: The explicit name for constant holding the count of attributes (last attr + 1).
160e616c07cSJakub Kicinski          type: string
161e616c07cSJakub Kicinski        attr-max-name:
162e616c07cSJakub Kicinski          description: The explicit name for last member of attribute enum.
163e616c07cSJakub Kicinski          type: string
164e616c07cSJakub Kicinski        # End genetlink-c
165e616c07cSJakub Kicinski        attributes:
166e616c07cSJakub Kicinski          description: List of attributes in the space.
167e616c07cSJakub Kicinski          type: array
168e616c07cSJakub Kicinski          items:
169e616c07cSJakub Kicinski            type: object
170e616c07cSJakub Kicinski            required: [ name, type ]
171e616c07cSJakub Kicinski            additionalProperties: False
172e616c07cSJakub Kicinski            properties:
173e616c07cSJakub Kicinski              name:
174e616c07cSJakub Kicinski                type: string
175e616c07cSJakub Kicinski              type: &attr-type
176e616c07cSJakub Kicinski                enum: [ unused, pad, flag, binary, u8, u16, u32, u64, s32, s64,
177e616c07cSJakub Kicinski                        string, nest, array-nest, nest-type-value ]
178e616c07cSJakub Kicinski              doc:
179e616c07cSJakub Kicinski                description: Documentation of the attribute.
180e616c07cSJakub Kicinski                type: string
181e616c07cSJakub Kicinski              value:
182e616c07cSJakub Kicinski                description: Value for the enum item representing this attribute in the uAPI.
183e616c07cSJakub Kicinski                $ref: '#/$defs/uint'
184e616c07cSJakub Kicinski              type-value:
185e616c07cSJakub Kicinski                description: Name of the value extracted from the type of a nest-type-value attribute.
186e616c07cSJakub Kicinski                type: array
187e616c07cSJakub Kicinski                items:
188e616c07cSJakub Kicinski                  type: string
189e616c07cSJakub Kicinski              byte-order:
190e616c07cSJakub Kicinski                enum: [ little-endian, big-endian ]
191e616c07cSJakub Kicinski              multi-attr:
192e616c07cSJakub Kicinski                type: boolean
193e616c07cSJakub Kicinski              nested-attributes:
194e616c07cSJakub Kicinski                description: Name of the space (sub-space) used inside the attribute.
195e616c07cSJakub Kicinski                type: string
196e616c07cSJakub Kicinski              enum:
197e616c07cSJakub Kicinski                description: Name of the enum type used for the attribute.
198e616c07cSJakub Kicinski                type: string
199e616c07cSJakub Kicinski              enum-as-flags:
200e616c07cSJakub Kicinski                description: |
201e616c07cSJakub Kicinski                  Treat the enum as flags. In most cases enum is either used as flags or as values.
202e616c07cSJakub Kicinski                  Sometimes, however, both forms are necessary, in which case header contains the enum
203e616c07cSJakub Kicinski                  form while specific attributes may request to convert the values into a bitfield.
204e616c07cSJakub Kicinski                type: boolean
205e616c07cSJakub Kicinski              checks:
206e616c07cSJakub Kicinski                description: Kernel input validation.
207e616c07cSJakub Kicinski                type: object
208e616c07cSJakub Kicinski                additionalProperties: False
209e616c07cSJakub Kicinski                properties:
210e616c07cSJakub Kicinski                  flags-mask:
211e616c07cSJakub Kicinski                    description: Name of the flags constant on which to base mask (unsigned scalar types only).
212e616c07cSJakub Kicinski                    type: string
213e616c07cSJakub Kicinski                  min:
214e616c07cSJakub Kicinski                    description: Min value for an integer attribute.
215e616c07cSJakub Kicinski                    type: integer
216e616c07cSJakub Kicinski                  min-len:
217e616c07cSJakub Kicinski                    description: Min length for a binary attribute.
218e616c07cSJakub Kicinski                    $ref: '#/$defs/len-or-define'
219e616c07cSJakub Kicinski                  max-len:
220e616c07cSJakub Kicinski                    description: Max length for a string or a binary attribute.
221e616c07cSJakub Kicinski                    $ref: '#/$defs/len-or-define'
222e616c07cSJakub Kicinski              sub-type: *attr-type
22326071913SDonald Hunter              # Start genetlink-legacy
22426071913SDonald Hunter              struct:
22526071913SDonald Hunter                description: Name of the struct type used for the attribute.
22626071913SDonald Hunter                type: string
22726071913SDonald Hunter              # End genetlink-legacy
228e616c07cSJakub Kicinski
229e616c07cSJakub Kicinski      # Make sure name-prefix does not appear in subsets (subsets inherit naming)
230e616c07cSJakub Kicinski      dependencies:
231e616c07cSJakub Kicinski        name-prefix:
232e616c07cSJakub Kicinski          not:
233e616c07cSJakub Kicinski            required: [ subset-of ]
234e616c07cSJakub Kicinski        subset-of:
235e616c07cSJakub Kicinski          not:
236e616c07cSJakub Kicinski            required: [ name-prefix ]
237e616c07cSJakub Kicinski
238e616c07cSJakub Kicinski  operations:
239e616c07cSJakub Kicinski    description: Operations supported by the protocol.
240e616c07cSJakub Kicinski    type: object
241e616c07cSJakub Kicinski    required: [ list ]
242e616c07cSJakub Kicinski    additionalProperties: False
243e616c07cSJakub Kicinski    properties:
244e616c07cSJakub Kicinski      enum-model:
245e616c07cSJakub Kicinski        description: |
246e616c07cSJakub Kicinski          The model of assigning values to the operations.
247e616c07cSJakub Kicinski          "unified" is the recommended model where all message types belong
248e616c07cSJakub Kicinski          to a single enum.
249e616c07cSJakub Kicinski          "directional" has the messages sent to the kernel and from the kernel
250e616c07cSJakub Kicinski          enumerated separately.
2518403bf04SJakub Kicinski        enum: [ unified, directional ] # Trim
252e616c07cSJakub Kicinski      name-prefix:
253e616c07cSJakub Kicinski        description: |
254e616c07cSJakub Kicinski          Prefix for the C enum name of the command. The name is formed by concatenating
255e616c07cSJakub Kicinski          the prefix with the upper case name of the command, with dashes replaced by underscores.
256e616c07cSJakub Kicinski        type: string
257e616c07cSJakub Kicinski      enum-name:
258e616c07cSJakub Kicinski        description: Name for the enum type with commands.
259e616c07cSJakub Kicinski        type: string
260e616c07cSJakub Kicinski      async-prefix:
261e616c07cSJakub Kicinski        description: Same as name-prefix but used to render notifications and events to separate enum.
262e616c07cSJakub Kicinski        type: string
263e616c07cSJakub Kicinski      async-enum:
264e616c07cSJakub Kicinski        description: Name for the enum type with notifications/events.
265e616c07cSJakub Kicinski        type: string
266f036d936SDonald Hunter      # Start genetlink-legacy
267f036d936SDonald Hunter      fixed-header: &fixed-header
268f036d936SDonald Hunter        description: |
269f036d936SDonald Hunter          Name of the structure defining the optional fixed-length protocol
270f036d936SDonald Hunter          header. This header is placed in a message after the netlink and
271f036d936SDonald Hunter          genetlink headers and before any attributes.
272f036d936SDonald Hunter        type: string
273f036d936SDonald Hunter      # End genetlink-legacy
274e616c07cSJakub Kicinski      list:
275e616c07cSJakub Kicinski        description: List of commands
276e616c07cSJakub Kicinski        type: array
277e616c07cSJakub Kicinski        items:
278e616c07cSJakub Kicinski          type: object
279e616c07cSJakub Kicinski          additionalProperties: False
280e616c07cSJakub Kicinski          required: [ name, doc ]
281e616c07cSJakub Kicinski          properties:
282e616c07cSJakub Kicinski            name:
283e616c07cSJakub Kicinski              description: Name of the operation, also defining its C enum value in uAPI.
284e616c07cSJakub Kicinski              type: string
285e616c07cSJakub Kicinski            doc:
286e616c07cSJakub Kicinski              description: Documentation for the command.
287e616c07cSJakub Kicinski              type: string
288e616c07cSJakub Kicinski            value:
289e616c07cSJakub Kicinski              description: Value for the enum in the uAPI.
290e616c07cSJakub Kicinski              $ref: '#/$defs/uint'
291e616c07cSJakub Kicinski            attribute-set:
292e616c07cSJakub Kicinski              description: |
293e616c07cSJakub Kicinski                Attribute space from which attributes directly in the requests and replies
294e616c07cSJakub Kicinski                to this command are defined.
295e616c07cSJakub Kicinski              type: string
296e616c07cSJakub Kicinski            flags: &cmd_flags
297e616c07cSJakub Kicinski              description: Command flags.
298e616c07cSJakub Kicinski              type: array
299e616c07cSJakub Kicinski              items:
300e616c07cSJakub Kicinski                enum: [ admin-perm ]
301e616c07cSJakub Kicinski            dont-validate:
302e616c07cSJakub Kicinski              description: Kernel attribute validation flags.
303e616c07cSJakub Kicinski              type: array
304e616c07cSJakub Kicinski              items:
305e616c07cSJakub Kicinski                enum: [ strict, dump ]
306f036d936SDonald Hunter            # Start genetlink-legacy
307f036d936SDonald Hunter            fixed-header: *fixed-header
308f036d936SDonald Hunter            # End genetlink-legacy
309e616c07cSJakub Kicinski            do: &subop-type
310e616c07cSJakub Kicinski              description: Main command handler.
311e616c07cSJakub Kicinski              type: object
312e616c07cSJakub Kicinski              additionalProperties: False
313e616c07cSJakub Kicinski              properties:
314e616c07cSJakub Kicinski                request: &subop-attr-list
315e616c07cSJakub Kicinski                  description: Definition of the request message for a given command.
316e616c07cSJakub Kicinski                  type: object
317e616c07cSJakub Kicinski                  additionalProperties: False
318e616c07cSJakub Kicinski                  properties:
319e616c07cSJakub Kicinski                    attributes:
320e616c07cSJakub Kicinski                      description: |
321e616c07cSJakub Kicinski                        Names of attributes from the attribute-set (not full attribute
322e616c07cSJakub Kicinski                        definitions, just names).
323e616c07cSJakub Kicinski                      type: array
324e616c07cSJakub Kicinski                      items:
325e616c07cSJakub Kicinski                        type: string
3268403bf04SJakub Kicinski                    # Start genetlink-legacy
3278403bf04SJakub Kicinski                    value:
3288403bf04SJakub Kicinski                      description: |
3298403bf04SJakub Kicinski                        ID of this message if value for request and response differ,
3308403bf04SJakub Kicinski                        i.e. requests and responses have different message enums.
3318403bf04SJakub Kicinski                      $ref: '#/$defs/uint'
3328403bf04SJakub Kicinski                    # End genetlink-legacy
333e616c07cSJakub Kicinski                reply: *subop-attr-list
334e616c07cSJakub Kicinski                pre:
335e616c07cSJakub Kicinski                  description: Hook for a function to run before the main callback (pre_doit or start).
336e616c07cSJakub Kicinski                  type: string
337e616c07cSJakub Kicinski                post:
338e616c07cSJakub Kicinski                  description: Hook for a function to run after the main callback (post_doit or done).
339e616c07cSJakub Kicinski                  type: string
340e616c07cSJakub Kicinski            dump: *subop-type
341e616c07cSJakub Kicinski            notify:
342e616c07cSJakub Kicinski              description: Name of the command sharing the reply type with this notification.
343e616c07cSJakub Kicinski              type: string
344e616c07cSJakub Kicinski            event:
345e616c07cSJakub Kicinski              type: object
346e616c07cSJakub Kicinski              additionalProperties: False
347e616c07cSJakub Kicinski              properties:
348e616c07cSJakub Kicinski                attributes:
349e616c07cSJakub Kicinski                  description: Explicit list of the attributes for the notification.
350e616c07cSJakub Kicinski                  type: array
351e616c07cSJakub Kicinski                  items:
352e616c07cSJakub Kicinski                    type: string
353e616c07cSJakub Kicinski            mcgrp:
354e616c07cSJakub Kicinski              description: Name of the multicast group generating given notification.
355e616c07cSJakub Kicinski              type: string
356e616c07cSJakub Kicinski  mcast-groups:
357e616c07cSJakub Kicinski    description: List of multicast groups.
358e616c07cSJakub Kicinski    type: object
359e616c07cSJakub Kicinski    required: [ list ]
360e616c07cSJakub Kicinski    additionalProperties: False
361e616c07cSJakub Kicinski    properties:
362e616c07cSJakub Kicinski      list:
363e616c07cSJakub Kicinski        description: List of groups.
364e616c07cSJakub Kicinski        type: array
365e616c07cSJakub Kicinski        items:
366e616c07cSJakub Kicinski          type: object
367e616c07cSJakub Kicinski          required: [ name ]
368e616c07cSJakub Kicinski          additionalProperties: False
369e616c07cSJakub Kicinski          properties:
370e616c07cSJakub Kicinski            name:
371e616c07cSJakub Kicinski              description: |
372e616c07cSJakub Kicinski                The name for the group, used to form the define and the value of the define.
373e616c07cSJakub Kicinski              type: string
374e616c07cSJakub Kicinski            # Start genetlink-c
375e616c07cSJakub Kicinski            c-define-name:
376e616c07cSJakub Kicinski              description: Override for the name of the define in C uAPI.
377e616c07cSJakub Kicinski              type: string
378e616c07cSJakub Kicinski            # End genetlink-c
379e616c07cSJakub Kicinski            flags: *cmd_flags
380