# SPDX-License-Identifier: ((GPL-2.0 WITH Linux-syscall-note) OR BSD-3-Clause)
---
name: team

protocol: genetlink-legacy

doc: |
  Network team device driver.

c-family-name: team-genl-name
c-version-name: team-genl-version
kernel-policy: global
uapi-header: linux/if_team.h

definitions:
  -
    name: string-max-len
    type: const
    value: 32
  -
    name: genl-change-event-mc-grp-name
    type: const
    value: change_event

attribute-sets:
  -
    name: team
    doc: |
      The team nested layout of get/set msg looks like::

          [TEAM_ATTR_LIST_OPTION]
              [TEAM_ATTR_ITEM_OPTION]
                  [TEAM_ATTR_OPTION_*], ...
              [TEAM_ATTR_ITEM_OPTION]
                  [TEAM_ATTR_OPTION_*], ...
              ...
          [TEAM_ATTR_LIST_PORT]
              [TEAM_ATTR_ITEM_PORT]
                  [TEAM_ATTR_PORT_*], ...
              [TEAM_ATTR_ITEM_PORT]
                  [TEAM_ATTR_PORT_*], ...
              ...

    name-prefix: team-attr-
    attributes:
      -
        name: unspec
        type: unused
        value: 0
      -
        name: team-ifindex
        type: u32
      -
        name: list-option
        type: nest
        nested-attributes: item-option
      -
        name: list-port
        type: nest
        nested-attributes: item-port
  -
    name: item-option
    name-prefix: team-attr-item-
    attr-cnt-name: __team-attr-item-option-max
    attr-max-name: team-attr-item-option-max
    attributes:
      -
        name: option-unspec
        type: unused
        value: 0
      -
        name: option
        type: nest
        nested-attributes: attr-option
  -
    name: attr-option
    name-prefix: team-attr-option-
    attributes:
      -
        name: unspec
        type: unused
        value: 0
      -
        name: name
        type: string
        checks:
          max-len: string-max-len
          unterminated-ok: true
      -
        name: changed
        type: flag
      -
        name: type
        type: u8
      -
        name: data
        type: binary
      -
        name: removed
        type: flag
      -
        name: port-ifindex
        type: u32
        doc: for per-port options
      -
        name: array-index
        type: u32
        doc: for array options
  -
    name: item-port
    name-prefix: team-attr-item-
    attr-cnt-name: __team-attr-item-port-max
    attr-max-name: team-attr-item-port-max
    attributes:
      -
        name: port-unspec
        type: unused
        value: 0
      -
        name: port
        type: nest
        nested-attributes: attr-port
  -
    name: attr-port
    name-prefix: team-attr-port-
    attributes:
      -
        name: unspec
        type: unused
        value: 0
      -
        name: ifindex
        type: u32
      -
        name: changed
        type: flag
      -
        name: linkup
        type: flag
      -
        name: speed
        type: u32
      -
        name: duplex
        type: u8
      -
        name: removed
        type: flag

operations:
  list:
    -
      name: noop
      doc: No operation
      value: 0
      attribute-set: team
      dont-validate: [strict]

      do:
        # Actually it only reply the team netlink family
        reply:
          attributes:
            - team-ifindex

    -
      name: options-set
      doc: Set team options
      attribute-set: team
      dont-validate: [strict]
      flags: [admin-perm]

      do:
        request: &option_attrs
          attributes:
            - team-ifindex
            - list-option
        reply: *option_attrs

    -
      name: options-get
      doc: Get team options info
      attribute-set: team
      dont-validate: [strict]
      flags: [admin-perm]

      do:
        request:
          attributes:
            - team-ifindex
        reply: *option_attrs

    -
      name: port-list-get
      doc: Get team ports info
      attribute-set: team
      dont-validate: [strict]
      flags: [admin-perm]

      do:
        request:
          attributes:
            - team-ifindex
        reply: &port_attrs
          attributes:
            - team-ifindex
            - list-port
