# SPDX-License-Identifier: ((GPL-2.0 WITH Linux-syscall-note) OR BSD-3-Clause)
---
name: nlctrl
protocol: genetlink-legacy
uapi-header: linux/genetlink.h

doc: |
  genetlink meta-family that exposes information about all genetlink
  families registered in the kernel (including itself).

definitions:
  -
    name: op-flags
    type: flags
    enum-name:
    entries:
      - admin-perm
      - cmd-cap-do
      - cmd-cap-dump
      - cmd-cap-haspol
      - uns-admin-perm
  -
    name: attr-type
    enum-name: netlink-attribute-type
    type: enum
    entries:
      - invalid
      - flag
      - u8
      - u16
      - u32
      - u64
      - s8
      - s16
      - s32
      - s64
      - binary
      - string
      - nul-string
      - nested
      - nested-array
      - bitfield32
      - sint
      - uint

attribute-sets:
  -
    name: ctrl-attrs
    name-prefix: ctrl-attr-
    attributes:
      -
        name: family-id
        type: u16
      -
        name: family-name
        type: string
      -
        name: version
        type: u32
      -
        name: hdrsize
        type: u32
      -
        name: maxattr
        type: u32
      -
        name: ops
        type: indexed-array
        sub-type: nest
        nested-attributes: op-attrs
      -
        name: mcast-groups
        type: indexed-array
        sub-type: nest
        nested-attributes: mcast-group-attrs
      -
        name: policy
        type: nest-type-value
        type-value: [policy-id, attr-id]
        nested-attributes: policy-attrs
      -
        name: op-policy
        type: nest-type-value
        type-value: [op-id]
        nested-attributes: op-policy-attrs
      -
        name: op
        type: u32
  -
    name: mcast-group-attrs
    name-prefix: ctrl-attr-mcast-grp-
    enum-name:
    attributes:
      -
        name: name
        type: string
      -
        name: id
        type: u32
  -
    name: op-attrs
    name-prefix: ctrl-attr-op-
    enum-name:
    attributes:
      -
        name: id
        type: u32
      -
        name: flags
        type: u32
        enum: op-flags
        enum-as-flags: true
  -
    name: policy-attrs
    name-prefix: nl-policy-type-attr-
    enum-name:
    attributes:
      -
        name: type
        type: u32
        enum: attr-type
      -
        name: min-value-s
        type: s64
      -
        name: max-value-s
        type: s64
      -
        name: min-value-u
        type: u64
      -
        name: max-value-u
        type: u64
      -
        name: min-length
        type: u32
      -
        name: max-length
        type: u32
      -
        name: policy-idx
        type: u32
      -
        name: policy-maxtype
        type: u32
      -
        name: bitfield32-mask
        type: u32
      -
        name: mask
        type: u64
      -
        name: pad
        type: pad
  -
    name: op-policy-attrs
    name-prefix: ctrl-attr-policy-
    enum-name:
    attributes:
      -
        name: do
        type: u32
      -
        name: dump
        type: u32

operations:
  enum-model: directional
  name-prefix: ctrl-cmd-
  list:
    -
      name: getfamily
      doc: Get / dump genetlink families
      attribute-set: ctrl-attrs
      do:
        request:
          value: 3
          attributes:
            - family-name
        reply: &all-attrs
          value: 1
          attributes:
            - family-id
            - family-name
            - hdrsize
            - maxattr
            - mcast-groups
            - ops
            - version
      dump:
        reply: *all-attrs
    -
      name: getpolicy
      doc: Get / dump genetlink policies
      attribute-set: ctrl-attrs
      dump:
        request:
          value: 10
          attributes:
            - family-name
            - family-id
            - op
        reply:
          value: 10
          attributes:
            - family-id
            - op-policy
            - policy
