bpf: add dsack_dups/delivered{, _ce} to bpf_tcp_sock
authorStanislav Fomichev <sdf@google.com>
Tue, 2 Jul 2019 16:13:58 +0000 (09:13 -0700)
committerDaniel Borkmann <daniel@iogearbox.net>
Wed, 3 Jul 2019 14:52:01 +0000 (16:52 +0200)
Add more fields to bpf_tcp_sock that might be useful for debugging
congestion control issues.

Cc: Eric Dumazet <edumazet@google.com>
Cc: Priyaranjan Jha <priyarjha@google.com>
Cc: Yuchung Cheng <ycheng@google.com>
Cc: Soheil Hassas Yeganeh <soheil@google.com>
Acked-by: Soheil Hassas Yeganeh <soheil@google.com>
Acked-by: Yuchung Cheng <ycheng@google.com>
Signed-off-by: Stanislav Fomichev <sdf@google.com>
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
include/uapi/linux/bpf.h
net/core/filter.c

index 9cdd0aaeba06aa772dc95255c27bf2b3b72287d8..bfb0b1a76684b4c1a8a4dd15ce87c1ebcfbd424d 100644 (file)
@@ -3073,6 +3073,11 @@ struct bpf_tcp_sock {
                                 * sum(delta(snd_una)), or how many bytes
                                 * were acked.
                                 */
+       __u32 dsack_dups;       /* RFC4898 tcpEStatsStackDSACKDups
+                                * total number of DSACK blocks received
+                                */
+       __u32 delivered;        /* Total data packets delivered incl. rexmits */
+       __u32 delivered_ce;     /* Like the above but only ECE marked packets */
 };
 
 struct bpf_sock_tuple {
index ad908526545d0eb0100ee1dd62ee2d94dd2bf1e8..3da4b6c38b46c1019d011c3d9ae52d941ac485fb 100644 (file)
@@ -5544,7 +5544,7 @@ static const struct bpf_func_proto bpf_sock_addr_sk_lookup_udp_proto = {
 bool bpf_tcp_sock_is_valid_access(int off, int size, enum bpf_access_type type,
                                  struct bpf_insn_access_aux *info)
 {
-       if (off < 0 || off >= offsetofend(struct bpf_tcp_sock, bytes_acked))
+       if (off < 0 || off >= offsetofend(struct bpf_tcp_sock, delivered_ce))
                return false;
 
        if (off % size != 0)
@@ -5652,6 +5652,15 @@ u32 bpf_tcp_sock_convert_ctx_access(enum bpf_access_type type,
        case offsetof(struct bpf_tcp_sock, bytes_acked):
                BPF_TCP_SOCK_GET_COMMON(bytes_acked);
                break;
+       case offsetof(struct bpf_tcp_sock, dsack_dups):
+               BPF_TCP_SOCK_GET_COMMON(dsack_dups);
+               break;
+       case offsetof(struct bpf_tcp_sock, delivered):
+               BPF_TCP_SOCK_GET_COMMON(delivered);
+               break;
+       case offsetof(struct bpf_tcp_sock, delivered_ce):
+               BPF_TCP_SOCK_GET_COMMON(delivered_ce);
+               break;
        }
 
        return insn - insn_buf;