* [PATCH net-next] tcp_metrics: add netlink protocol spec in YAML
@ 2024-06-26 20:11 Jakub Kicinski
2024-06-27 9:20 ` Donald Hunter
2024-06-27 10:34 ` Donald Hunter
0 siblings, 2 replies; 4+ messages in thread
From: Jakub Kicinski @ 2024-06-26 20:11 UTC (permalink / raw)
To: davem; +Cc: netdev, edumazet, pabeni, Jakub Kicinski, donald.hunter
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: Jakub Kicinski <kuba@kernel.org>
---
CC: donald.hunter@gmail.com
---
Documentation/netlink/specs/tcp_metrics.yaml | 178 +++++++++++++++++++
include/uapi/linux/tcp_metrics.h | 16 ++
2 files changed, 194 insertions(+)
create mode 100644 Documentation/netlink/specs/tcp_metrics.yaml
diff --git a/Documentation/netlink/specs/tcp_metrics.yaml b/Documentation/netlink/specs/tcp_metrics.yaml
new file mode 100644
index 000000000000..cc3aa66f915a
--- /dev/null
+++ b/Documentation/netlink/specs/tcp_metrics.yaml
@@ -0,0 +1,178 @@
+# 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: unspec
+ type: unused
+ value: 0
+ -
+ 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
+ # Intentially don't define the name-prefix to match the kernel, 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 3 bits fractional
+ (left-shift by 3 to get the msec value).
+
+operations:
+ list:
+ -
+ name: unspec
+ doc: unused
+ value: 0
+
+ -
+ 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
diff --git a/include/uapi/linux/tcp_metrics.h b/include/uapi/linux/tcp_metrics.h
index 7cb4a172feed..d93d32f163f0 100644
--- a/include/uapi/linux/tcp_metrics.h
+++ b/include/uapi/linux/tcp_metrics.h
@@ -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 */
--
2.45.2
^ permalink raw reply related [flat|nested] 4+ messages in thread* Re: [PATCH net-next] tcp_metrics: add netlink protocol spec in YAML
2024-06-26 20:11 [PATCH net-next] tcp_metrics: add netlink protocol spec in YAML Jakub Kicinski
@ 2024-06-27 9:20 ` Donald Hunter
2024-06-27 19:03 ` Jakub Kicinski
2024-06-27 10:34 ` Donald Hunter
1 sibling, 1 reply; 4+ messages in thread
From: Donald Hunter @ 2024-06-27 9:20 UTC (permalink / raw)
To: Jakub Kicinski; +Cc: davem, netdev, edumazet, pabeni
Jakub Kicinski <kuba@kernel.org> writes:
> 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.
I had to add tcp_metrics.h to Makefile.deps to get the generated code to
complile.
diff --git a/tools/net/ynl/Makefile.deps b/tools/net/ynl/Makefile.deps
index f4e8eb79c1b8..2f05f8ec2324 100644
--- a/tools/net/ynl/Makefile.deps
+++ b/tools/net/ynl/Makefile.deps
@@ -25,3 +25,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)
> +
> + -
> + name: metrics
> + # Intentially don't define the name-prefix to match the kernel, see below.
Typo: Intentionally
> + 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
Should this be a dash, '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
Same here?
> + type: u32
> + doc: |
> + Round Trip Time (RTT), in usecs, with 3 bits fractional
> + (left-shift by 3 to get the msec value).
> +
^ permalink raw reply related [flat|nested] 4+ messages in thread* Re: [PATCH net-next] tcp_metrics: add netlink protocol spec in YAML
2024-06-27 9:20 ` Donald Hunter
@ 2024-06-27 19:03 ` Jakub Kicinski
0 siblings, 0 replies; 4+ messages in thread
From: Jakub Kicinski @ 2024-06-27 19:03 UTC (permalink / raw)
To: Donald Hunter; +Cc: davem, netdev, edumazet, pabeni
On Thu, 27 Jun 2024 10:20:15 +0100 Donald Hunter wrote:
> I had to add tcp_metrics.h to Makefile.deps to get the generated code to
> complile.
>
> diff --git a/tools/net/ynl/Makefile.deps b/tools/net/ynl/Makefile.deps
> index f4e8eb79c1b8..2f05f8ec2324 100644
> --- a/tools/net/ynl/Makefile.deps
> +++ b/tools/net/ynl/Makefile.deps
> @@ -25,3 +25,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)
Indeed, and I think we need to add _UAPI to the guard. Or just include
the file without calling get_hdr_inc. I'll send v2 as a (tiny) series.
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH net-next] tcp_metrics: add netlink protocol spec in YAML
2024-06-26 20:11 [PATCH net-next] tcp_metrics: add netlink protocol spec in YAML Jakub Kicinski
2024-06-27 9:20 ` Donald Hunter
@ 2024-06-27 10:34 ` Donald Hunter
1 sibling, 0 replies; 4+ messages in thread
From: Donald Hunter @ 2024-06-27 10:34 UTC (permalink / raw)
To: Jakub Kicinski; +Cc: davem, netdev, edumazet, pabeni
On Wed, 26 Jun 2024 at 21:11, Jakub Kicinski <kuba@kernel.org> wrote:
>
> +operations:
> + list:
> + -
> + name: unspec
> + doc: unused
> + value: 0
Is this needed? It shows up in generated docs as:
unspec
unused
value: 0
The spec works with it removed.
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2024-06-27 19:03 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-06-26 20:11 [PATCH net-next] tcp_metrics: add netlink protocol spec in YAML Jakub Kicinski
2024-06-27 9:20 ` Donald Hunter
2024-06-27 19:03 ` Jakub Kicinski
2024-06-27 10:34 ` Donald Hunter
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).