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

name: fou

protocol: genetlink-legacy

doc: |
  Foo-over-UDP.

c-family-name: fou-genl-name
c-version-name: fou-genl-version
max-by-define: true
kernel-policy: global

definitions:
  -
    type: enum
    name: encap_type
    name-prefix: fou-encap-
    enum-name:
    entries: [ unspec, direct, gue ]

attribute-sets:
  -
    name: fou
    name-prefix: fou-attr-
    attributes:
      -
        name: unspec
        type: unused
        value: 0
      -
        name: port
        type: u16
        byte-order: big-endian
      -
        name: af
        type: u8
      -
        name: ipproto
        type: u8
      -
        name: type
        type: u8
      -
        name: remcsum_nopartial
        type: flag
      -
        name: local_v4
        type: u32
      -
        name: local_v6
        type: binary
        checks:
          min-len: 16
      -
        name: peer_v4
        type: u32
      -
        name: peer_v6
        type: binary
        checks:
          min-len: 16
      -
        name: peer_port
        type: u16
        byte-order: big-endian
      -
        name: ifindex
        type: s32

operations:
  list:
    -
      name: unspec
      doc: unused
      value: 0

    -
      name: add
      doc: Add port.
      attribute-set: fou

      dont-validate: [ strict, dump ]
      flags: [ admin-perm ]

      do:
        request: &all_attrs
          attributes:
            - port
            - ipproto
            - type
            - remcsum_nopartial
            - local_v4
            - peer_v4
            - local_v6
            - peer_v6
            - peer_port
            - ifindex

    -
      name: del
      doc: Delete port.
      attribute-set: fou

      dont-validate: [ strict, dump ]
      flags: [ admin-perm ]

      do:
        request: &select_attrs
          attributes:
            - af
            - ifindex
            - port
            - peer_port
            - local_v4
            - peer_v4
            - local_v6
            - peer_v6

    -
      name: get
      doc: Get tunnel info.
      attribute-set: fou
      dont-validate: [ strict, dump ]

      do:
        request: *select_attrs
        reply: *all_attrs

      dump:
        reply: *all_attrs