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'
125bddd2e56SDonald Hunter              byte-order:
126bddd2e56SDonald Hunter                enum: [ little-endian, big-endian ]
127*6d6bae63SDonald Hunter              doc:
128*6d6bae63SDonald Hunter                description: Documentation for the struct member attribute.
129*6d6bae63SDonald Hunter                type: string
130e616c07cSJakub Kicinski        # End genetlink-legacy
131e616c07cSJakub Kicinski
132e616c07cSJakub Kicinski  attribute-sets:
133e616c07cSJakub Kicinski    description: Definition of attribute spaces for this family.
134e616c07cSJakub Kicinski    type: array
135e616c07cSJakub Kicinski    items:
136e616c07cSJakub Kicinski      description: Definition of a single attribute space.
137e616c07cSJakub Kicinski      type: object
138e616c07cSJakub Kicinski      required: [ name, attributes ]
139e616c07cSJakub Kicinski      additionalProperties: False
140e616c07cSJakub Kicinski      properties:
141e616c07cSJakub Kicinski        name:
142e616c07cSJakub Kicinski          description: |
143e616c07cSJakub Kicinski            Name used when referring to this space in other definitions, not used outside of the spec.
144e616c07cSJakub Kicinski          type: string
145e616c07cSJakub Kicinski        name-prefix:
146e616c07cSJakub Kicinski          description: |
147e616c07cSJakub Kicinski            Prefix for the C enum name of the attributes. Default family[name]-set[name]-a-
148e616c07cSJakub Kicinski          type: string
149e616c07cSJakub Kicinski        enum-name:
150e616c07cSJakub Kicinski          description: Name for the enum type of the attribute.
151e616c07cSJakub Kicinski          type: string
152e616c07cSJakub Kicinski        doc:
153e616c07cSJakub Kicinski          description: Documentation of the space.
154e616c07cSJakub Kicinski          type: string
155e616c07cSJakub Kicinski        subset-of:
156e616c07cSJakub Kicinski          description: |
157e616c07cSJakub Kicinski            Name of another space which this is a logical part of. Sub-spaces can be used to define
158e616c07cSJakub Kicinski            a limited group of attributes which are used in a nest.
159e616c07cSJakub Kicinski          type: string
160e616c07cSJakub Kicinski        # Start genetlink-c
161e616c07cSJakub Kicinski        attr-cnt-name:
162e616c07cSJakub Kicinski          description: The explicit name for constant holding the count of attributes (last attr + 1).
163e616c07cSJakub Kicinski          type: string
164e616c07cSJakub Kicinski        attr-max-name:
165e616c07cSJakub Kicinski          description: The explicit name for last member of attribute enum.
166e616c07cSJakub Kicinski          type: string
167e616c07cSJakub Kicinski        # End genetlink-c
168e616c07cSJakub Kicinski        attributes:
169e616c07cSJakub Kicinski          description: List of attributes in the space.
170e616c07cSJakub Kicinski          type: array
171e616c07cSJakub Kicinski          items:
172e616c07cSJakub Kicinski            type: object
173e616c07cSJakub Kicinski            required: [ name, type ]
174e616c07cSJakub Kicinski            additionalProperties: False
175e616c07cSJakub Kicinski            properties:
176e616c07cSJakub Kicinski              name:
177e616c07cSJakub Kicinski                type: string
178e616c07cSJakub Kicinski              type: &attr-type
179e616c07cSJakub Kicinski                enum: [ unused, pad, flag, binary, u8, u16, u32, u64, s32, s64,
180e616c07cSJakub Kicinski                        string, nest, array-nest, nest-type-value ]
181e616c07cSJakub Kicinski              doc:
182e616c07cSJakub Kicinski                description: Documentation of the attribute.
183e616c07cSJakub Kicinski                type: string
184e616c07cSJakub Kicinski              value:
185e616c07cSJakub Kicinski                description: Value for the enum item representing this attribute in the uAPI.
186e616c07cSJakub Kicinski                $ref: '#/$defs/uint'
187e616c07cSJakub Kicinski              type-value:
188e616c07cSJakub Kicinski                description: Name of the value extracted from the type of a nest-type-value attribute.
189e616c07cSJakub Kicinski                type: array
190e616c07cSJakub Kicinski                items:
191e616c07cSJakub Kicinski                  type: string
192e616c07cSJakub Kicinski              byte-order:
193e616c07cSJakub Kicinski                enum: [ little-endian, big-endian ]
194e616c07cSJakub Kicinski              multi-attr:
195e616c07cSJakub Kicinski                type: boolean
196e616c07cSJakub Kicinski              nested-attributes:
197e616c07cSJakub Kicinski                description: Name of the space (sub-space) used inside the attribute.
198e616c07cSJakub Kicinski                type: string
199e616c07cSJakub Kicinski              enum:
200e616c07cSJakub Kicinski                description: Name of the enum type used for the attribute.
201e616c07cSJakub Kicinski                type: string
202e616c07cSJakub Kicinski              enum-as-flags:
203e616c07cSJakub Kicinski                description: |
204e616c07cSJakub Kicinski                  Treat the enum as flags. In most cases enum is either used as flags or as values.
205e616c07cSJakub Kicinski                  Sometimes, however, both forms are necessary, in which case header contains the enum
206e616c07cSJakub Kicinski                  form while specific attributes may request to convert the values into a bitfield.
207e616c07cSJakub Kicinski                type: boolean
208e616c07cSJakub Kicinski              checks:
209e616c07cSJakub Kicinski                description: Kernel input validation.
210e616c07cSJakub Kicinski                type: object
211e616c07cSJakub Kicinski                additionalProperties: False
212e616c07cSJakub Kicinski                properties:
213e616c07cSJakub Kicinski                  flags-mask:
214e616c07cSJakub Kicinski                    description: Name of the flags constant on which to base mask (unsigned scalar types only).
215e616c07cSJakub Kicinski                    type: string
216e616c07cSJakub Kicinski                  min:
217e616c07cSJakub Kicinski                    description: Min value for an integer attribute.
218e616c07cSJakub Kicinski                    type: integer
219e616c07cSJakub Kicinski                  min-len:
220e616c07cSJakub Kicinski                    description: Min length for a binary attribute.
221e616c07cSJakub Kicinski                    $ref: '#/$defs/len-or-define'
222e616c07cSJakub Kicinski                  max-len:
223e616c07cSJakub Kicinski                    description: Max length for a string or a binary attribute.
224e616c07cSJakub Kicinski                    $ref: '#/$defs/len-or-define'
225e616c07cSJakub Kicinski              sub-type: *attr-type
22626071913SDonald Hunter              # Start genetlink-legacy
22726071913SDonald Hunter              struct:
22826071913SDonald Hunter                description: Name of the struct type used for the attribute.
22926071913SDonald Hunter                type: string
23026071913SDonald Hunter              # End genetlink-legacy
231e616c07cSJakub Kicinski
232e616c07cSJakub Kicinski      # Make sure name-prefix does not appear in subsets (subsets inherit naming)
233e616c07cSJakub Kicinski      dependencies:
234e616c07cSJakub Kicinski        name-prefix:
235e616c07cSJakub Kicinski          not:
236e616c07cSJakub Kicinski            required: [ subset-of ]
237e616c07cSJakub Kicinski        subset-of:
238e616c07cSJakub Kicinski          not:
239e616c07cSJakub Kicinski            required: [ name-prefix ]
240e616c07cSJakub Kicinski
241e616c07cSJakub Kicinski  operations:
242e616c07cSJakub Kicinski    description: Operations supported by the protocol.
243e616c07cSJakub Kicinski    type: object
244e616c07cSJakub Kicinski    required: [ list ]
245e616c07cSJakub Kicinski    additionalProperties: False
246e616c07cSJakub Kicinski    properties:
247e616c07cSJakub Kicinski      enum-model:
248e616c07cSJakub Kicinski        description: |
249e616c07cSJakub Kicinski          The model of assigning values to the operations.
250e616c07cSJakub Kicinski          "unified" is the recommended model where all message types belong
251e616c07cSJakub Kicinski          to a single enum.
252e616c07cSJakub Kicinski          "directional" has the messages sent to the kernel and from the kernel
253e616c07cSJakub Kicinski          enumerated separately.
2548403bf04SJakub Kicinski        enum: [ unified, directional ] # Trim
255e616c07cSJakub Kicinski      name-prefix:
256e616c07cSJakub Kicinski        description: |
257e616c07cSJakub Kicinski          Prefix for the C enum name of the command. The name is formed by concatenating
258e616c07cSJakub Kicinski          the prefix with the upper case name of the command, with dashes replaced by underscores.
259e616c07cSJakub Kicinski        type: string
260e616c07cSJakub Kicinski      enum-name:
261e616c07cSJakub Kicinski        description: Name for the enum type with commands.
262e616c07cSJakub Kicinski        type: string
263e616c07cSJakub Kicinski      async-prefix:
264e616c07cSJakub Kicinski        description: Same as name-prefix but used to render notifications and events to separate enum.
265e616c07cSJakub Kicinski        type: string
266e616c07cSJakub Kicinski      async-enum:
267e616c07cSJakub Kicinski        description: Name for the enum type with notifications/events.
268e616c07cSJakub Kicinski        type: string
269f036d936SDonald Hunter      # Start genetlink-legacy
270f036d936SDonald Hunter      fixed-header: &fixed-header
271f036d936SDonald Hunter        description: |
272f036d936SDonald Hunter          Name of the structure defining the optional fixed-length protocol
273f036d936SDonald Hunter          header. This header is placed in a message after the netlink and
274f036d936SDonald Hunter          genetlink headers and before any attributes.
275f036d936SDonald Hunter        type: string
276f036d936SDonald Hunter      # End genetlink-legacy
277e616c07cSJakub Kicinski      list:
278e616c07cSJakub Kicinski        description: List of commands
279e616c07cSJakub Kicinski        type: array
280e616c07cSJakub Kicinski        items:
281e616c07cSJakub Kicinski          type: object
282e616c07cSJakub Kicinski          additionalProperties: False
283e616c07cSJakub Kicinski          required: [ name, doc ]
284e616c07cSJakub Kicinski          properties:
285e616c07cSJakub Kicinski            name:
286e616c07cSJakub Kicinski              description: Name of the operation, also defining its C enum value in uAPI.
287e616c07cSJakub Kicinski              type: string
288e616c07cSJakub Kicinski            doc:
289e616c07cSJakub Kicinski              description: Documentation for the command.
290e616c07cSJakub Kicinski              type: string
291e616c07cSJakub Kicinski            value:
292e616c07cSJakub Kicinski              description: Value for the enum in the uAPI.
293e616c07cSJakub Kicinski              $ref: '#/$defs/uint'
294e616c07cSJakub Kicinski            attribute-set:
295e616c07cSJakub Kicinski              description: |
296e616c07cSJakub Kicinski                Attribute space from which attributes directly in the requests and replies
297e616c07cSJakub Kicinski                to this command are defined.
298e616c07cSJakub Kicinski              type: string
299e616c07cSJakub Kicinski            flags: &cmd_flags
300e616c07cSJakub Kicinski              description: Command flags.
301e616c07cSJakub Kicinski              type: array
302e616c07cSJakub Kicinski              items:
303e616c07cSJakub Kicinski                enum: [ admin-perm ]
304e616c07cSJakub Kicinski            dont-validate:
305e616c07cSJakub Kicinski              description: Kernel attribute validation flags.
306e616c07cSJakub Kicinski              type: array
307e616c07cSJakub Kicinski              items:
308e616c07cSJakub Kicinski                enum: [ strict, dump ]
309f036d936SDonald Hunter            # Start genetlink-legacy
310f036d936SDonald Hunter            fixed-header: *fixed-header
311f036d936SDonald Hunter            # End genetlink-legacy
312e616c07cSJakub Kicinski            do: &subop-type
313e616c07cSJakub Kicinski              description: Main command handler.
314e616c07cSJakub Kicinski              type: object
315e616c07cSJakub Kicinski              additionalProperties: False
316e616c07cSJakub Kicinski              properties:
317e616c07cSJakub Kicinski                request: &subop-attr-list
318e616c07cSJakub Kicinski                  description: Definition of the request message for a given command.
319e616c07cSJakub Kicinski                  type: object
320e616c07cSJakub Kicinski                  additionalProperties: False
321e616c07cSJakub Kicinski                  properties:
322e616c07cSJakub Kicinski                    attributes:
323e616c07cSJakub Kicinski                      description: |
324e616c07cSJakub Kicinski                        Names of attributes from the attribute-set (not full attribute
325e616c07cSJakub Kicinski                        definitions, just names).
326e616c07cSJakub Kicinski                      type: array
327e616c07cSJakub Kicinski                      items:
328e616c07cSJakub Kicinski                        type: string
3298403bf04SJakub Kicinski                    # Start genetlink-legacy
3308403bf04SJakub Kicinski                    value:
3318403bf04SJakub Kicinski                      description: |
3328403bf04SJakub Kicinski                        ID of this message if value for request and response differ,
3338403bf04SJakub Kicinski                        i.e. requests and responses have different message enums.
3348403bf04SJakub Kicinski                      $ref: '#/$defs/uint'
3358403bf04SJakub Kicinski                    # End genetlink-legacy
336e616c07cSJakub Kicinski                reply: *subop-attr-list
337e616c07cSJakub Kicinski                pre:
338e616c07cSJakub Kicinski                  description: Hook for a function to run before the main callback (pre_doit or start).
339e616c07cSJakub Kicinski                  type: string
340e616c07cSJakub Kicinski                post:
341e616c07cSJakub Kicinski                  description: Hook for a function to run after the main callback (post_doit or done).
342e616c07cSJakub Kicinski                  type: string
343e616c07cSJakub Kicinski            dump: *subop-type
344e616c07cSJakub Kicinski            notify:
345e616c07cSJakub Kicinski              description: Name of the command sharing the reply type with this notification.
346e616c07cSJakub Kicinski              type: string
347e616c07cSJakub Kicinski            event:
348e616c07cSJakub Kicinski              type: object
349e616c07cSJakub Kicinski              additionalProperties: False
350e616c07cSJakub Kicinski              properties:
351e616c07cSJakub Kicinski                attributes:
352e616c07cSJakub Kicinski                  description: Explicit list of the attributes for the notification.
353e616c07cSJakub Kicinski                  type: array
354e616c07cSJakub Kicinski                  items:
355e616c07cSJakub Kicinski                    type: string
356e616c07cSJakub Kicinski            mcgrp:
357e616c07cSJakub Kicinski              description: Name of the multicast group generating given notification.
358e616c07cSJakub Kicinski              type: string
359e616c07cSJakub Kicinski  mcast-groups:
360e616c07cSJakub Kicinski    description: List of multicast groups.
361e616c07cSJakub Kicinski    type: object
362e616c07cSJakub Kicinski    required: [ list ]
363e616c07cSJakub Kicinski    additionalProperties: False
364e616c07cSJakub Kicinski    properties:
365e616c07cSJakub Kicinski      list:
366e616c07cSJakub Kicinski        description: List of groups.
367e616c07cSJakub Kicinski        type: array
368e616c07cSJakub Kicinski        items:
369e616c07cSJakub Kicinski          type: object
370e616c07cSJakub Kicinski          required: [ name ]
371e616c07cSJakub Kicinski          additionalProperties: False
372e616c07cSJakub Kicinski          properties:
373e616c07cSJakub Kicinski            name:
374e616c07cSJakub Kicinski              description: |
375e616c07cSJakub Kicinski                The name for the group, used to form the define and the value of the define.
376e616c07cSJakub Kicinski              type: string
377e616c07cSJakub Kicinski            # Start genetlink-c
378e616c07cSJakub Kicinski            c-define-name:
379e616c07cSJakub Kicinski              description: Override for the name of the define in C uAPI.
380e616c07cSJakub Kicinski              type: string
381e616c07cSJakub Kicinski            # End genetlink-c
382e616c07cSJakub Kicinski            flags: *cmd_flags
383