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

protocol: genetlink-legacy

doc: |
  Management interface for TCP metrics.

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

definitions:
  -
    name: tcp-fastopen-cookie-max
    type: const
    value: 16

attribute-sets:
  -
    name: tcp-metrics
    name-prefix: tcp-metrics-attr-
    attributes:
      -
        name: addr-ipv4
        type: u32
        byte-order: big-endian
        display-hint: ipv4
      -
        name: addr-ipv6
        type: binary
        checks:
          min-len: 16
        byte-order: big-endian
        display-hint: ipv6
      -
        name: age
        type: u64
      -
        name: tw-tsval
        type: u32
        doc: unused
      -
        name: tw-ts-stamp
        type: s32
        doc: unused
      -
        name: vals
        type: nest
        nested-attributes: metrics
      -
        name: fopen-mss
        type: u16
      -
        name: fopen-syn-drops
        type: u16
      -
        name: fopen-syn-drop-ts
        type: u64
      -
        name: fopen-cookie
        type: binary
        checks:
          min-len: tcp-fastopen-cookie-max
      -
        name: saddr-ipv4
        type: u32
        byte-order: big-endian
        display-hint: ipv4
      -
        name: saddr-ipv6
        type: binary
        checks:
          min-len: 16
        byte-order: big-endian
        display-hint: ipv6
      -
        name: pad
        type: pad

  -
    name: metrics
    # Intentionally don't define the name-prefix, see below.
    doc: |
      Attributes with metrics. Note that the values here do not match
      the TCP_METRIC_* defines in the kernel, because kernel defines
      are off-by one (e.g. rtt is defined as enum 0, while netlink carries
      attribute type 1).
    attributes:
      -
        name: rtt
        type: u32
        doc: |
          Round Trip Time (RTT), in msecs with 3 bits fractional
          (left-shift by 3 to get the msec value).
      -
        name: rttvar
        type: u32
        doc: |
          Round Trip Time VARiance (RTT), in msecs with 2 bits fractional
          (left-shift by 2 to get the msec value).
      -
        name: ssthresh
        type: u32
        doc: Slow Start THRESHold.
      -
        name: cwnd
        type: u32
        doc: Congestion Window.
      -
        name: reodering
        type: u32
        doc: Reodering metric.
      -
        name: rtt-us
        type: u32
        doc: |
          Round Trip Time (RTT), in usecs, with 3 bits fractional
          (left-shift by 3 to get the msec value).
      -
        name: rttvar-us
        type: u32
        doc: |
          Round Trip Time (RTT), in usecs, with 2 bits fractional
          (left-shift by 3 to get the msec value).

operations:
  list:
    -
      name: get
      doc: Retrieve metrics.
      attribute-set: tcp-metrics

      dont-validate: [strict, dump]

      do:
        request: &sel_attrs
          attributes:
            - addr-ipv4
            - addr-ipv6
            - saddr-ipv4
            - saddr-ipv6
        reply: &all_attrs
          attributes:
            - addr-ipv4
            - addr-ipv6
            - saddr-ipv4
            - saddr-ipv6
            - age
            - vals
            - fopen-mss
            - fopen-syn-drops
            - fopen-syn-drop-ts
            - fopen-cookie
      dump:
        reply: *all_attrs

    -
      name: del
      doc: Delete metrics.
      attribute-set: tcp-metrics

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

      do:
        request: *sel_attrs
