Commit 85674625 authored by Jakub Kicinski's avatar Jakub Kicinski Committed by David S. Miller
Browse files

tcp_metrics: add netlink protocol spec in YAML



Add a protocol spec for tcp_metrics, so that it's accessible via YNL.
Useful at the very least for testing fixes.

In this episode of "10,000 ways to complicate netlink" the metric
nest has defines which are off by 1. iproute2 does:

        struct rtattr *m[TCP_METRIC_MAX + 1 + 1];

        parse_rtattr_nested(m, TCP_METRIC_MAX + 1, a);

        for (i = 0; i < TCP_METRIC_MAX + 1; i++) {
                // ...
                attr = m[i + 1];

This is too weird to support in YNL, add a new set of defines
with _correct_ values to the official kernel header.

Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
Reviewed-by: default avatarDonald Hunter <donald.hunter@gmail.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 7c811005
Loading
Loading
Loading
Loading
+169 −0
Original line number Diff line number Diff line
# 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
+16 −0
Original line number Diff line number Diff line
@@ -27,6 +27,22 @@ enum tcp_metric_index {

#define TCP_METRIC_MAX	(__TCP_METRIC_MAX - 1)

/* Re-define enum tcp_metric_index, again, using the values carried
 * as netlink attribute types.
 */
enum {
	TCP_METRICS_A_METRICS_RTT = 1,
	TCP_METRICS_A_METRICS_RTTVAR,
	TCP_METRICS_A_METRICS_SSTHRESH,
	TCP_METRICS_A_METRICS_CWND,
	TCP_METRICS_A_METRICS_REODERING,
	TCP_METRICS_A_METRICS_RTT_US,
	TCP_METRICS_A_METRICS_RTTVAR_US,

	__TCP_METRICS_A_METRICS_MAX
};
#define TCP_METRICS_A_METRICS_MAX (__TCP_METRICS_A_METRICS_MAX - 1)

enum {
	TCP_METRICS_ATTR_UNSPEC,
	TCP_METRICS_ATTR_ADDR_IPV4,		/* u32 */
+1 −0
Original line number Diff line number Diff line
@@ -26,3 +26,4 @@ CFLAGS_nfsd:=$(call get_hdr_inc,_LINUX_NFSD_NETLINK_H,nfsd_netlink.h)
CFLAGS_ovs_datapath:=$(call get_hdr_inc,__LINUX_OPENVSWITCH_H,openvswitch.h)
CFLAGS_ovs_flow:=$(call get_hdr_inc,__LINUX_OPENVSWITCH_H,openvswitch.h)
CFLAGS_ovs_vport:=$(call get_hdr_inc,__LINUX_OPENVSWITCH_H,openvswitch.h)
CFLAGS_tcp_metrics:=$(call get_hdr_inc,_LINUX_TCP_METRICS_H,tcp_metrics.h)