Add more fields to bpf_tcp_sock that might be useful for debugging
congestion control issues.

Cc: Eric Dumazet <eduma...@google.com>
Cc: Priyaranjan Jha <priyar...@google.com>
Cc: Yuchung Cheng <ych...@google.com>
Cc: Soheil Hassas Yeganeh <soh...@google.com>
Signed-off-by: Stanislav Fomichev <s...@google.com>
---
 include/uapi/linux/bpf.h |  5 +++++
 net/core/filter.c        | 11 ++++++++++-
 2 files changed, 15 insertions(+), 1 deletion(-)

diff --git a/include/uapi/linux/bpf.h b/include/uapi/linux/bpf.h
index 9cdd0aaeba06..bfb0b1a76684 100644
--- a/include/uapi/linux/bpf.h
+++ b/include/uapi/linux/bpf.h
@@ -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 {
diff --git a/net/core/filter.c b/net/core/filter.c
index ad908526545d..3da4b6c38b46 100644
--- a/net/core/filter.c
+++ b/net/core/filter.c
@@ -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;
-- 
2.22.0.410.gd8fdbe21b5-goog

Reply via email to