# SPDX-License-Identifier: ((GPL-2.0 WITH Linux-syscall-note) OR BSD-3-Clause)
---
name: mptcp_pm
protocol: genetlink-legacy
doc: Multipath TCP.

c-family-name: mptcp-pm-name
c-version-name: mptcp-pm-ver
max-by-define: true
kernel-policy: per-op
cmd-cnt-name: --mptcp-pm-cmd-after-last

definitions:
  -
    type: enum
    name: event-type
    enum-name: mptcp-event-type
    name-prefix: mptcp-event-
    entries:
      -
        name: unspec
        doc: unused event
      -
        name: created
        doc: >-
          A new MPTCP connection has been created. It is the good time to
          allocate memory and send ADD_ADDR if needed. Depending on the
          traffic-patterns it can take a long time until the
          MPTCP_EVENT_ESTABLISHED is sent.
          Attributes: token, family, saddr4 | saddr6, daddr4 | daddr6, sport,
          dport, server-side, [flags].
      -
        name: established
        doc: >-
          A MPTCP connection is established (can start new subflows).
          Attributes: token, family, saddr4 | saddr6, daddr4 | daddr6, sport,
          dport, server-side, [flags].
      -
        name: closed
        doc: >-
          A MPTCP connection has stopped.
          Attribute: token.
      -
        name: announced
        value: 6
        doc: >-
          A new address has been announced by the peer.
          Attributes: token, rem_id, family, daddr4 | daddr6 [, dport].
      -
        name: removed
        doc: >-
          An address has been lost by the peer.
          Attributes: token, rem_id.
      -
        name: sub-established
        value: 10
        doc: >-
          A new subflow has been established. 'error' should not be set.
          Attributes: token, family, loc_id, rem_id, saddr4 | saddr6, daddr4 |
          daddr6, sport, dport, backup, if-idx [, error].
      -
        name: sub-closed
        doc: >-
          A subflow has been closed. An error (copy of sk_err) could be set if
          an error has been detected for this subflow.
          Attributes: token, family, loc_id, rem_id, saddr4 | saddr6, daddr4 |
          daddr6, sport, dport, backup, if-idx [, error].
      -
        name: sub-priority
        value: 13
        doc: >-
          The priority of a subflow has changed. 'error' should not be set.
          Attributes: token, family, loc_id, rem_id, saddr4 | saddr6, daddr4 |
          daddr6, sport, dport, backup, if-idx [, error].
      -
        name: listener-created
        value: 15
        doc: >-
          A new PM listener is created.
          Attributes: family, sport, saddr4 | saddr6.
      -
        name: listener-closed
        doc: >-
          A PM listener is closed.
          Attributes: family, sport, saddr4 | saddr6.

attribute-sets:
  -
    name: address
    name-prefix: mptcp-pm-addr-attr-
    attributes:
      -
        name: unspec
        type: unused
        value: 0
      -
        name: family
        type: u16
      -
        name: id
        type: u8
      -
        name: addr4
        type: u32
        byte-order: big-endian
      -
        name: addr6
        type: binary
        checks:
          exact-len: 16
      -
        name: port
        type: u16
      -
        name: flags
        type: u32
      -
        name: if-idx
        type: s32
  -
    name: subflow-attribute
    name-prefix: mptcp-subflow-attr-
    attributes:
      -
        name: unspec
        type: unused
        value: 0
      -
        name: token-rem
        type: u32
      -
        name: token-loc
        type: u32
      -
        name: relwrite-seq
        type: u32
      -
        name: map-seq
        type: u64
      -
        name: map-sfseq
        type: u32
      -
        name: ssn-offset
        type: u32
      -
        name: map-datalen
        type: u16
      -
        name: flags
        type: u32
      -
        name: id-rem
        type: u8
      -
        name: id-loc
        type: u8
      -
        name: pad
        type: pad
  -
    name: endpoint
    name-prefix: mptcp-pm-endpoint-
    attributes:
      -
        name: addr
        type: nest
        nested-attributes: address
  -
    name: attr
    name-prefix: mptcp-pm-attr-
    attr-cnt-name: --mptcp-attr-after-last
    attributes:
      -
        name: unspec
        type: unused
        value: 0
      -
        name: addr
        type: nest
        nested-attributes: address
      -
        name: rcv-add-addrs
        type: u32
      -
        name: subflows
        type: u32
      -
        name: token
        type: u32
      -
        name: loc-id
        type: u8
      -
        name: addr-remote
        type: nest
        nested-attributes: address
  -
    name: event-attr
    enum-name: mptcp-event-attr
    name-prefix: mptcp-attr-
    attributes:
      -
        name: unspec
        type: unused
        value: 0
      -
        name: token
        type: u32
      -
        name: family
        type: u16
      -
        name: loc-id
        type: u8
      -
        name: rem-id
        type: u8
      -
        name: saddr4
        type: u32
        byte-order: big-endian
      -
        name: saddr6
        type: binary
        checks:
          min-len: 16
      -
        name: daddr4
        type: u32
        byte-order: big-endian
      -
        name: daddr6
        type: binary
        checks:
          min-len: 16
      -
        name: sport
        type: u16
        byte-order: big-endian
      -
        name: dport
        type: u16
        byte-order: big-endian
      -
        name: backup
        type: u8
      -
        name: error
        type: u8
      -
        name: flags
        type: u16
      -
        name: timeout
        type: u32
      -
        name: if-idx
        type: s32
      -
        name: reset-reason
        type: u32
      -
        name: reset-flags
        type: u32
      -
        name: server-side
        type: u8

operations:
  list:
    -
      name: unspec
      doc: unused
      value: 0
    -
      name: add-addr
      doc: Add endpoint
      attribute-set: endpoint
      dont-validate: [strict]
      flags: [uns-admin-perm]
      do: &add-addr-attrs
        request:
          attributes:
            - addr
    -
      name: del-addr
      doc: Delete endpoint
      attribute-set: endpoint
      dont-validate: [strict]
      flags: [uns-admin-perm]
      do: *add-addr-attrs
    -
      name: get-addr
      doc: Get endpoint information
      attribute-set: attr
      dont-validate: [strict]
      do: &get-addr-attrs
        request:
          attributes:
            - addr
            - token
        reply:
          attributes:
            - addr
      dump:
        reply:
          attributes:
            - addr
    -
      name: flush-addrs
      doc: Flush addresses
      attribute-set: endpoint
      dont-validate: [strict]
      flags: [uns-admin-perm]
      do: *add-addr-attrs
    -
      name: set-limits
      doc: Set protocol limits
      attribute-set: attr
      dont-validate: [strict]
      flags: [uns-admin-perm]
      do: &mptcp-limits
        request:
          attributes:
            - rcv-add-addrs
            - subflows
    -
      name: get-limits
      doc: Get protocol limits
      attribute-set: attr
      dont-validate: [strict]
      do: &mptcp-get-limits
        request:
          attributes:
            - rcv-add-addrs
            - subflows
        reply:
          attributes:
            - rcv-add-addrs
            - subflows
    -
      name: set-flags
      doc: Change endpoint flags
      attribute-set: attr
      dont-validate: [strict]
      flags: [uns-admin-perm]
      do: &mptcp-set-flags
        request:
          attributes:
            - addr
            - token
            - addr-remote
    -
      name: announce
      doc: Announce new address
      attribute-set: attr
      dont-validate: [strict]
      flags: [uns-admin-perm]
      do: &announce-add
        request:
          attributes:
            - addr
            - token
    -
      name: remove
      doc: Announce removal
      attribute-set: attr
      dont-validate: [strict]
      flags: [uns-admin-perm]
      do:
        request:
          attributes:
            - token
            - loc-id
    -
      name: subflow-create
      doc: Create subflow
      attribute-set: attr
      dont-validate: [strict]
      flags: [uns-admin-perm]
      do: &sf-create
        request:
          attributes:
            - addr
            - token
            - addr-remote
    -
      name: subflow-destroy
      doc: Destroy subflow
      attribute-set: attr
      dont-validate: [strict]
      flags: [uns-admin-perm]
      do: *sf-create
