From patchwork Mon Jul 1 20:48:14 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Stanislav Fomichev X-Patchwork-Id: 1125598 X-Patchwork-Delegate: bpf@iogearbox.net Return-Path: X-Original-To: incoming-bpf@patchwork.ozlabs.org Delivered-To: patchwork-incoming-bpf@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=bpf-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=google.com header.i=@google.com header.b="v2SizwqE"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 45czwr2M2kz9sBp for ; Tue, 2 Jul 2019 06:48:28 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726664AbfGAUs1 (ORCPT ); Mon, 1 Jul 2019 16:48:27 -0400 Received: from mail-pf1-f201.google.com ([209.85.210.201]:37483 "EHLO mail-pf1-f201.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726686AbfGAUs1 (ORCPT ); Mon, 1 Jul 2019 16:48:27 -0400 Received: by mail-pf1-f201.google.com with SMTP id x18so9475268pfj.4 for ; Mon, 01 Jul 2019 13:48:27 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=date:in-reply-to:message-id:mime-version:references:subject:from:to :cc; bh=INF3BhAYxiC5zN7sI0E/1ejr1GqqfZAk7apZjO1QaBg=; b=v2SizwqEzo0HRILTfG8hKxn7HR13u+sEEwA0E2mO0W6/SZR7mMFwY+758HE5rxyQCY VD/dggiH60mX67ZVxSLvFNiWjPucZAhEm5O52i7Fn/4hCZUr4nZkv081l3/Ef7bExx5q bFV81flb81bsZczZgRa4WfJ3BdwAYoen4RpuxzY/BzOB5X3tb00X9PyutYI5Yr9HUrB8 IlkOfc/k+60toNvVS7sCneoOhkFHHSSdwO9f60rekNvED0hAqNPCqFDg7EZ/7uI2bK6M Jx9OMyP31TVJEi96s55nTQTRWgSTD3X5MJuAXY2vqdeNfxXsg0XjqlS9icviBqZgfiyc 326A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc; bh=INF3BhAYxiC5zN7sI0E/1ejr1GqqfZAk7apZjO1QaBg=; b=t8PwCQ32ewZNKEmZm05naotaON+HWzvlrual3w5USMU2gZKfxSqVKcQ/PU1T6P856t rpnlJcLLiT73+aZAtJeGfiX89NhubBmg8LcEQiOFAR5YrXH1zdIrVgUHoNUdmGoXvihm Ibqxef3FP2tSj2jdSrc+CadlHfzUNIZ9PdWX7XbwDTx5rithNppMoI44LjWxuZnFWgoQ aferJhk5+hU10tVJGTzAEpBrAPiyr4C6VTmjw9mmDmysNzrD5dwt2gMJhdecQTVyf2mY KZPa66vL+FvA1/lQyVaKoQ07LdlbhXzWxwGGAsPYkpTonH2S+XeY/n+zSGMgZin8UewT 3l3g== X-Gm-Message-State: APjAAAXX7QtnTi8aWT9/4ueStPx4011sRoJcUulLPBmhRI7agOxcqFu5 A/MmXCIM+f05sVmIsn4mBUcVhFI= X-Google-Smtp-Source: APXvYqzKhBy10PewYzuyN7H79WKX0/koGTFebHygP4NeE8AacXlN2HnrwjKNM0sSDjoyFhVV3C8IUEg= X-Received: by 2002:a65:6541:: with SMTP id a1mr26318110pgw.409.1562014106370; Mon, 01 Jul 2019 13:48:26 -0700 (PDT) Date: Mon, 1 Jul 2019 13:48:14 -0700 In-Reply-To: <20190701204821.44230-1-sdf@google.com> Message-Id: <20190701204821.44230-2-sdf@google.com> Mime-Version: 1.0 References: <20190701204821.44230-1-sdf@google.com> X-Mailer: git-send-email 2.22.0.410.gd8fdbe21b5-goog Subject: [PATCH bpf-next 1/8] bpf: add BPF_CGROUP_SOCK_OPS callback that is executed on every RTT From: Stanislav Fomichev To: netdev@vger.kernel.org, bpf@vger.kernel.org Cc: davem@davemloft.net, ast@kernel.org, daniel@iogearbox.net, Stanislav Fomichev , Eric Dumazet , Priyaranjan Jha , Yuchung Cheng , Soheil Hassas Yeganeh Sender: bpf-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: bpf@vger.kernel.org Performance impact should be minimal because it's under a new BPF_SOCK_OPS_RTT_CB_FLAG flag that has to be explicitly enabled. Suggested-by: Eric Dumazet Cc: Eric Dumazet Cc: Priyaranjan Jha Cc: Yuchung Cheng Cc: Soheil Hassas Yeganeh Signed-off-by: Stanislav Fomichev --- include/net/tcp.h | 8 ++++++++ include/uapi/linux/bpf.h | 6 +++++- net/ipv4/tcp_input.c | 4 ++++ 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/include/net/tcp.h b/include/net/tcp.h index 9d36cc88d043..e16d8a3fd3b4 100644 --- a/include/net/tcp.h +++ b/include/net/tcp.h @@ -2221,6 +2221,14 @@ static inline bool tcp_bpf_ca_needs_ecn(struct sock *sk) return (tcp_call_bpf(sk, BPF_SOCK_OPS_NEEDS_ECN, 0, NULL) == 1); } +static inline void tcp_bpf_rtt(struct sock *sk) +{ + struct tcp_sock *tp = tcp_sk(sk); + + if (BPF_SOCK_OPS_TEST_FLAG(tp, BPF_SOCK_OPS_RTT_CB_FLAG)) + tcp_call_bpf(sk, BPF_SOCK_OPS_RTT_CB, 0, NULL); +} + #if IS_ENABLED(CONFIG_SMC) extern struct static_key_false tcp_have_smc; #endif diff --git a/include/uapi/linux/bpf.h b/include/uapi/linux/bpf.h index cffea1826a1f..9cdd0aaeba06 100644 --- a/include/uapi/linux/bpf.h +++ b/include/uapi/linux/bpf.h @@ -1770,6 +1770,7 @@ union bpf_attr { * * **BPF_SOCK_OPS_RTO_CB_FLAG** (retransmission time out) * * **BPF_SOCK_OPS_RETRANS_CB_FLAG** (retransmission) * * **BPF_SOCK_OPS_STATE_CB_FLAG** (TCP state change) + * * **BPF_SOCK_OPS_RTT_CB_FLAG** (every RTT) * * Therefore, this function can be used to clear a callback flag by * setting the appropriate bit to zero. e.g. to disable the RTO @@ -3314,7 +3315,8 @@ struct bpf_sock_ops { #define BPF_SOCK_OPS_RTO_CB_FLAG (1<<0) #define BPF_SOCK_OPS_RETRANS_CB_FLAG (1<<1) #define BPF_SOCK_OPS_STATE_CB_FLAG (1<<2) -#define BPF_SOCK_OPS_ALL_CB_FLAGS 0x7 /* Mask of all currently +#define BPF_SOCK_OPS_RTT_CB_FLAG (1<<3) +#define BPF_SOCK_OPS_ALL_CB_FLAGS 0xF /* Mask of all currently * supported cb flags */ @@ -3369,6 +3371,8 @@ enum { BPF_SOCK_OPS_TCP_LISTEN_CB, /* Called on listen(2), right after * socket transition to LISTEN state. */ + BPF_SOCK_OPS_RTT_CB, /* Called on every RTT. + */ }; /* List of TCP states. There is a build check in net/ipv4/tcp.c to detect diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c index b71efeb0ae5b..c21e8a22fb3b 100644 --- a/net/ipv4/tcp_input.c +++ b/net/ipv4/tcp_input.c @@ -778,6 +778,8 @@ static void tcp_rtt_estimator(struct sock *sk, long mrtt_us) tp->rttvar_us -= (tp->rttvar_us - tp->mdev_max_us) >> 2; tp->rtt_seq = tp->snd_nxt; tp->mdev_max_us = tcp_rto_min_us(sk); + + tcp_bpf_rtt(sk); } } else { /* no previous measure. */ @@ -786,6 +788,8 @@ static void tcp_rtt_estimator(struct sock *sk, long mrtt_us) tp->rttvar_us = max(tp->mdev_us, tcp_rto_min_us(sk)); tp->mdev_max_us = tp->rttvar_us; tp->rtt_seq = tp->snd_nxt; + + tcp_bpf_rtt(sk); } tp->srtt_us = max(1U, srtt); } From patchwork Mon Jul 1 20:48:15 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Stanislav Fomichev X-Patchwork-Id: 1125600 X-Patchwork-Delegate: bpf@iogearbox.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=google.com header.i=@google.com header.b="dUpLFaPB"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 45czwv69B1z9s4Y for ; Tue, 2 Jul 2019 06:48:31 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726838AbfGAUsb (ORCPT ); Mon, 1 Jul 2019 16:48:31 -0400 Received: from mail-pf1-f201.google.com ([209.85.210.201]:43210 "EHLO mail-pf1-f201.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726966AbfGAUsa (ORCPT ); Mon, 1 Jul 2019 16:48:30 -0400 Received: by mail-pf1-f201.google.com with SMTP id j7so9473270pfn.10 for ; Mon, 01 Jul 2019 13:48:29 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=date:in-reply-to:message-id:mime-version:references:subject:from:to :cc; bh=ModQgDPhzuyPvFACPBg8Rl25O3S/FpNHFLqMvCgTcWw=; b=dUpLFaPB+BU41OsL1OLcuRtyiDgDA8iVJSZWYmxw78QWCy1r+Ih5YnaNWZR7AUpGul 9N+8i7qXndq2f4e/hlXbbdnD4Rjl+0KgMYn3qkuRZmUOfZ9peKN9cAjaeZx+W9LCQpis HaugJijk+EePaKKIXoOQaILV8XQaghEMSCOZj7buK61rge5tEnnPuG94M0dnNk0jdc1x UIhhXXEcgZFdYhekyBDcQvvhcsIBpuSLpLqC+qJiV5jvlGh/6KwbPiQCYuROkJVfsa+2 BDFV4aBEHyd1D+9BnlyzchGRyVoVj8iBmcXedTsZ2DbzPaVUKITZzISZ6o9YaIv4A5bx 6t9g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc; bh=ModQgDPhzuyPvFACPBg8Rl25O3S/FpNHFLqMvCgTcWw=; b=K9aVa+zD5KkVsxrIyTxW46zWamRTWKqzL4HeYf4775VK0VIPwUg7kcYaL/53xbZ19t fvvHXFdYfPO8ZOZBTfW3o2UhM3w27/+y4lxswPBoTlCMGU1j5+8kDsWAqe1UDweyS7F/ zLSTunXmBAtRqxFIpTnFpPuZk0Sj01NtkRGBOjtB7/EpfzM9DbEfaMbU9FNfF7tZ2aom rGmpRSRJHKvBZ2ZMBbDP8glVyacRSRBXqWf86MLATMwAmQK8SpsoM4Yry9NmRow7IJqJ CuBnhigi4lqLWaF0AlhlSoOyrEft0nHabkdaHj9upBxGrD1c+GJvX0fc7UQhT/cZ0+cU OTSA== X-Gm-Message-State: APjAAAWr2ht1nJ96XoAUEuDlL5ldFlICys5pJGf2vfEwImCDTLlwkChZ CljRx1zEBz+418zb2UD38k7rF4iOYluEGxRgejIEBgHa/NBTFcM3J/2u1A6j5Ac629YQoKOLEdo UtbrTNVjVYuzl3wT8GIoB6kecTS5OFlb/ydgWtyOfawlNckqT/M/7vw== X-Google-Smtp-Source: APXvYqwDLKwFedoIlfJGc8j4Hwl8kx2YHwbLy6maX2cN+vxpk09sCOh/uJJB9/1v/89aIxlj8nl5JVU= X-Received: by 2002:a63:3f48:: with SMTP id m69mr26107172pga.17.1562014108970; Mon, 01 Jul 2019 13:48:28 -0700 (PDT) Date: Mon, 1 Jul 2019 13:48:15 -0700 In-Reply-To: <20190701204821.44230-1-sdf@google.com> Message-Id: <20190701204821.44230-3-sdf@google.com> Mime-Version: 1.0 References: <20190701204821.44230-1-sdf@google.com> X-Mailer: git-send-email 2.22.0.410.gd8fdbe21b5-goog Subject: [PATCH bpf-next 2/8] bpf: split shared bpf_tcp_sock and bpf_sock_ops implementation From: Stanislav Fomichev To: netdev@vger.kernel.org, bpf@vger.kernel.org Cc: davem@davemloft.net, ast@kernel.org, daniel@iogearbox.net, Stanislav Fomichev , Eric Dumazet , Priyaranjan Jha , Yuchung Cheng , Soheil Hassas Yeganeh Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org We've added bpf_tcp_sock member to bpf_sock_ops and don't expect any new tcp_sock fields in bpf_sock_ops. Let's remove CONVERT_COMMON_TCP_SOCK_FIELDS so bpf_tcp_sock can be independently extended. Cc: Eric Dumazet Cc: Priyaranjan Jha Cc: Yuchung Cheng Cc: Soheil Hassas Yeganeh Signed-off-by: Stanislav Fomichev --- net/core/filter.c | 180 ++++++++++++++++++++++++++++++++-------------- 1 file changed, 126 insertions(+), 54 deletions(-) diff --git a/net/core/filter.c b/net/core/filter.c index 4836264f82ee..ad908526545d 100644 --- a/net/core/filter.c +++ b/net/core/filter.c @@ -5194,54 +5194,6 @@ static const struct bpf_func_proto bpf_lwt_seg6_adjust_srh_proto = { }; #endif /* CONFIG_IPV6_SEG6_BPF */ -#define CONVERT_COMMON_TCP_SOCK_FIELDS(md_type, CONVERT) \ -do { \ - switch (si->off) { \ - case offsetof(md_type, snd_cwnd): \ - CONVERT(snd_cwnd); break; \ - case offsetof(md_type, srtt_us): \ - CONVERT(srtt_us); break; \ - case offsetof(md_type, snd_ssthresh): \ - CONVERT(snd_ssthresh); break; \ - case offsetof(md_type, rcv_nxt): \ - CONVERT(rcv_nxt); break; \ - case offsetof(md_type, snd_nxt): \ - CONVERT(snd_nxt); break; \ - case offsetof(md_type, snd_una): \ - CONVERT(snd_una); break; \ - case offsetof(md_type, mss_cache): \ - CONVERT(mss_cache); break; \ - case offsetof(md_type, ecn_flags): \ - CONVERT(ecn_flags); break; \ - case offsetof(md_type, rate_delivered): \ - CONVERT(rate_delivered); break; \ - case offsetof(md_type, rate_interval_us): \ - CONVERT(rate_interval_us); break; \ - case offsetof(md_type, packets_out): \ - CONVERT(packets_out); break; \ - case offsetof(md_type, retrans_out): \ - CONVERT(retrans_out); break; \ - case offsetof(md_type, total_retrans): \ - CONVERT(total_retrans); break; \ - case offsetof(md_type, segs_in): \ - CONVERT(segs_in); break; \ - case offsetof(md_type, data_segs_in): \ - CONVERT(data_segs_in); break; \ - case offsetof(md_type, segs_out): \ - CONVERT(segs_out); break; \ - case offsetof(md_type, data_segs_out): \ - CONVERT(data_segs_out); break; \ - case offsetof(md_type, lost_out): \ - CONVERT(lost_out); break; \ - case offsetof(md_type, sacked_out): \ - CONVERT(sacked_out); break; \ - case offsetof(md_type, bytes_received): \ - CONVERT(bytes_received); break; \ - case offsetof(md_type, bytes_acked): \ - CONVERT(bytes_acked); break; \ - } \ -} while (0) - #ifdef CONFIG_INET static struct sock *sk_lookup(struct net *net, struct bpf_sock_tuple *tuple, int dif, int sdif, u8 family, u8 proto) @@ -5623,9 +5575,6 @@ u32 bpf_tcp_sock_convert_ctx_access(enum bpf_access_type type, offsetof(struct tcp_sock, FIELD)); \ } while (0) - CONVERT_COMMON_TCP_SOCK_FIELDS(struct bpf_tcp_sock, - BPF_TCP_SOCK_GET_COMMON); - if (insn > insn_buf) return insn - insn_buf; @@ -5640,6 +5589,69 @@ u32 bpf_tcp_sock_convert_ctx_access(enum bpf_access_type type, offsetof(struct tcp_sock, rtt_min) + offsetof(struct minmax_sample, v)); break; + case offsetof(struct bpf_tcp_sock, snd_cwnd): + BPF_TCP_SOCK_GET_COMMON(snd_cwnd); + break; + case offsetof(struct bpf_tcp_sock, srtt_us): + BPF_TCP_SOCK_GET_COMMON(srtt_us); + break; + case offsetof(struct bpf_tcp_sock, snd_ssthresh): + BPF_TCP_SOCK_GET_COMMON(snd_ssthresh); + break; + case offsetof(struct bpf_tcp_sock, rcv_nxt): + BPF_TCP_SOCK_GET_COMMON(rcv_nxt); + break; + case offsetof(struct bpf_tcp_sock, snd_nxt): + BPF_TCP_SOCK_GET_COMMON(snd_nxt); + break; + case offsetof(struct bpf_tcp_sock, snd_una): + BPF_TCP_SOCK_GET_COMMON(snd_una); + break; + case offsetof(struct bpf_tcp_sock, mss_cache): + BPF_TCP_SOCK_GET_COMMON(mss_cache); + break; + case offsetof(struct bpf_tcp_sock, ecn_flags): + BPF_TCP_SOCK_GET_COMMON(ecn_flags); + break; + case offsetof(struct bpf_tcp_sock, rate_delivered): + BPF_TCP_SOCK_GET_COMMON(rate_delivered); + break; + case offsetof(struct bpf_tcp_sock, rate_interval_us): + BPF_TCP_SOCK_GET_COMMON(rate_interval_us); + break; + case offsetof(struct bpf_tcp_sock, packets_out): + BPF_TCP_SOCK_GET_COMMON(packets_out); + break; + case offsetof(struct bpf_tcp_sock, retrans_out): + BPF_TCP_SOCK_GET_COMMON(retrans_out); + break; + case offsetof(struct bpf_tcp_sock, total_retrans): + BPF_TCP_SOCK_GET_COMMON(total_retrans); + break; + case offsetof(struct bpf_tcp_sock, segs_in): + BPF_TCP_SOCK_GET_COMMON(segs_in); + break; + case offsetof(struct bpf_tcp_sock, data_segs_in): + BPF_TCP_SOCK_GET_COMMON(data_segs_in); + break; + case offsetof(struct bpf_tcp_sock, segs_out): + BPF_TCP_SOCK_GET_COMMON(segs_out); + break; + case offsetof(struct bpf_tcp_sock, data_segs_out): + BPF_TCP_SOCK_GET_COMMON(data_segs_out); + break; + case offsetof(struct bpf_tcp_sock, lost_out): + BPF_TCP_SOCK_GET_COMMON(lost_out); + break; + case offsetof(struct bpf_tcp_sock, sacked_out): + BPF_TCP_SOCK_GET_COMMON(sacked_out); + break; + case offsetof(struct bpf_tcp_sock, bytes_received): + BPF_TCP_SOCK_GET_COMMON(bytes_received); + break; + case offsetof(struct bpf_tcp_sock, bytes_acked): + BPF_TCP_SOCK_GET_COMMON(bytes_acked); + break; } return insn - insn_buf; @@ -7913,9 +7925,6 @@ static u32 sock_ops_convert_ctx_access(enum bpf_access_type type, SOCK_OPS_GET_FIELD(BPF_FIELD, OBJ_FIELD, OBJ); \ } while (0) - CONVERT_COMMON_TCP_SOCK_FIELDS(struct bpf_sock_ops, - SOCK_OPS_GET_TCP_SOCK_FIELD); - if (insn > insn_buf) return insn - insn_buf; @@ -8085,6 +8094,69 @@ static u32 sock_ops_convert_ctx_access(enum bpf_access_type type, SOCK_OPS_GET_OR_SET_FIELD(sk_txhash, sk_txhash, struct sock, type); break; + case offsetof(struct bpf_sock_ops, snd_cwnd): + SOCK_OPS_GET_TCP_SOCK_FIELD(snd_cwnd); + break; + case offsetof(struct bpf_sock_ops, srtt_us): + SOCK_OPS_GET_TCP_SOCK_FIELD(srtt_us); + break; + case offsetof(struct bpf_sock_ops, snd_ssthresh): + SOCK_OPS_GET_TCP_SOCK_FIELD(snd_ssthresh); + break; + case offsetof(struct bpf_sock_ops, rcv_nxt): + SOCK_OPS_GET_TCP_SOCK_FIELD(rcv_nxt); + break; + case offsetof(struct bpf_sock_ops, snd_nxt): + SOCK_OPS_GET_TCP_SOCK_FIELD(snd_nxt); + break; + case offsetof(struct bpf_sock_ops, snd_una): + SOCK_OPS_GET_TCP_SOCK_FIELD(snd_una); + break; + case offsetof(struct bpf_sock_ops, mss_cache): + SOCK_OPS_GET_TCP_SOCK_FIELD(mss_cache); + break; + case offsetof(struct bpf_sock_ops, ecn_flags): + SOCK_OPS_GET_TCP_SOCK_FIELD(ecn_flags); + break; + case offsetof(struct bpf_sock_ops, rate_delivered): + SOCK_OPS_GET_TCP_SOCK_FIELD(rate_delivered); + break; + case offsetof(struct bpf_sock_ops, rate_interval_us): + SOCK_OPS_GET_TCP_SOCK_FIELD(rate_interval_us); + break; + case offsetof(struct bpf_sock_ops, packets_out): + SOCK_OPS_GET_TCP_SOCK_FIELD(packets_out); + break; + case offsetof(struct bpf_sock_ops, retrans_out): + SOCK_OPS_GET_TCP_SOCK_FIELD(retrans_out); + break; + case offsetof(struct bpf_sock_ops, total_retrans): + SOCK_OPS_GET_TCP_SOCK_FIELD(total_retrans); + break; + case offsetof(struct bpf_sock_ops, segs_in): + SOCK_OPS_GET_TCP_SOCK_FIELD(segs_in); + break; + case offsetof(struct bpf_sock_ops, data_segs_in): + SOCK_OPS_GET_TCP_SOCK_FIELD(data_segs_in); + break; + case offsetof(struct bpf_sock_ops, segs_out): + SOCK_OPS_GET_TCP_SOCK_FIELD(segs_out); + break; + case offsetof(struct bpf_sock_ops, data_segs_out): + SOCK_OPS_GET_TCP_SOCK_FIELD(data_segs_out); + break; + case offsetof(struct bpf_sock_ops, lost_out): + SOCK_OPS_GET_TCP_SOCK_FIELD(lost_out); + break; + case offsetof(struct bpf_sock_ops, sacked_out): + SOCK_OPS_GET_TCP_SOCK_FIELD(sacked_out); + break; + case offsetof(struct bpf_sock_ops, bytes_received): + SOCK_OPS_GET_TCP_SOCK_FIELD(bytes_received); + break; + case offsetof(struct bpf_sock_ops, bytes_acked): + SOCK_OPS_GET_TCP_SOCK_FIELD(bytes_acked); + break; case offsetof(struct bpf_sock_ops, sk): *insn++ = BPF_LDX_MEM(BPF_FIELD_SIZEOF( struct bpf_sock_ops_kern, From patchwork Mon Jul 1 20:48:16 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Stanislav Fomichev X-Patchwork-Id: 1125602 X-Patchwork-Delegate: bpf@iogearbox.net Return-Path: X-Original-To: incoming-bpf@patchwork.ozlabs.org Delivered-To: patchwork-incoming-bpf@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=bpf-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=google.com header.i=@google.com header.b="VGY723St"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 45czwx4Wh8z9s4Y for ; Tue, 2 Jul 2019 06:48:33 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726871AbfGAUsd (ORCPT ); Mon, 1 Jul 2019 16:48:33 -0400 Received: from mail-vs1-f74.google.com ([209.85.217.74]:33088 "EHLO mail-vs1-f74.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726869AbfGAUsd (ORCPT ); Mon, 1 Jul 2019 16:48:33 -0400 Received: by mail-vs1-f74.google.com with SMTP id x140so4376336vsc.0 for ; Mon, 01 Jul 2019 13:48:32 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=date:in-reply-to:message-id:mime-version:references:subject:from:to :cc; bh=ui36edJNM3/6IjeIVND2MQix6moGekKCtsBACidEA/M=; b=VGY723StJzrK9t8YiEB5wDVfMpdF4fwFBKBmZoc6pqe5JQKIRWLt1HkTSSKLVTpOr2 hJe/a1WitmlmqHqcutZMVhO7Dn/H8jqbZ3x5sSkcyuVypZeKUCrwv8xbePGIbQlFOygF oEs5avSEXib1Cw+ZUTRPctS6UGlCKn374xQNi2s53vTBjq1/peeoYETFRAtz/y/8cZ+R crecRNE8pV9vEzCol2KZErp0GdmDCwFs5WGfx8lMmhCJK6NKYv8SKncT08LuPve+WfGE RqtkCmV1azc1Z1+ZmwlY57r258pzQ9DYccekPyfOh1foekiCPUvmpxUn+zaPB11d/xR8 0/5g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc; bh=ui36edJNM3/6IjeIVND2MQix6moGekKCtsBACidEA/M=; b=FrqpMnxAX/abZHQM2Bo+xtEjAdmseIPPg36kKByCeAuZmXaw9XgF2971l7Ls8BczN/ LSO3kV05pYc5I8Y4xGEiCU4q7a8DHToGEbS40k2fkBxX7UMmfZe9IhtqEu6Idw+oG75l SpRaMQELHL+hI7VW2fdQES1iLVXSHkA25bwE7r1m0jzS8dxrplfnAs0rOM1Tva6vQ7ZN k1HgQtYPLaIHrTJO8Ssu7434pdOop8H54jLpuxohYf7KXyKQXvxiJlXyw0FZXWeu87pZ L2Soj8BZ4S5Gqd91iWkYLlOEI/o7uhRm+1rlN9lOnEeJQ1o+5geUXh+cf+Cx6j+ETgtM qOaA== X-Gm-Message-State: APjAAAVSMj79Kic/HyKhK3lFhDJlSVv/QkN7l2GL1hLeHXtRAV4jh/ds SsvaiJefWpoxVRrF7flU+ytXW/E= X-Google-Smtp-Source: APXvYqz1j05bbTYjKaalEkRRRtnzGI/FV26vhPEruhaVGkWZtKihNpM/0iIRkyHLcQFlr58Tz1+Qxmw= X-Received: by 2002:a67:c113:: with SMTP id d19mr15895270vsj.89.1562014111849; Mon, 01 Jul 2019 13:48:31 -0700 (PDT) Date: Mon, 1 Jul 2019 13:48:16 -0700 In-Reply-To: <20190701204821.44230-1-sdf@google.com> Message-Id: <20190701204821.44230-4-sdf@google.com> Mime-Version: 1.0 References: <20190701204821.44230-1-sdf@google.com> X-Mailer: git-send-email 2.22.0.410.gd8fdbe21b5-goog Subject: [PATCH bpf-next 3/8] bpf: add dsack_dups/delivered{, _ce} to bpf_tcp_sock From: Stanislav Fomichev To: netdev@vger.kernel.org, bpf@vger.kernel.org Cc: davem@davemloft.net, ast@kernel.org, daniel@iogearbox.net, Stanislav Fomichev , Eric Dumazet , Priyaranjan Jha , Yuchung Cheng , Soheil Hassas Yeganeh Sender: bpf-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: bpf@vger.kernel.org Add more fields to bpf_tcp_sock that might be useful for debugging congestion control issues. Cc: Eric Dumazet Cc: Priyaranjan Jha Cc: Yuchung Cheng Cc: Soheil Hassas Yeganeh Signed-off-by: Stanislav Fomichev --- 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; From patchwork Mon Jul 1 20:48:17 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Stanislav Fomichev X-Patchwork-Id: 1125604 X-Patchwork-Delegate: bpf@iogearbox.net Return-Path: X-Original-To: incoming-bpf@patchwork.ozlabs.org Delivered-To: patchwork-incoming-bpf@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=bpf-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=google.com header.i=@google.com header.b="MFTt/l0K"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 45czx02Kzjz9s4Y for ; Tue, 2 Jul 2019 06:48:36 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726977AbfGAUsg (ORCPT ); Mon, 1 Jul 2019 16:48:36 -0400 Received: from mail-vk1-f202.google.com ([209.85.221.202]:46109 "EHLO mail-vk1-f202.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726702AbfGAUsf (ORCPT ); Mon, 1 Jul 2019 16:48:35 -0400 Received: by mail-vk1-f202.google.com with SMTP id p64so3920347vkp.13 for ; Mon, 01 Jul 2019 13:48:35 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=date:in-reply-to:message-id:mime-version:references:subject:from:to :cc; bh=pVikEg8jjnvM0Q28LM7sWpY08h9CumZd8qGejdWCdLY=; b=MFTt/l0Ktxh+G4sjegR1dnw1FepmgMdcBQHxO0sDejqpeapdfhyli2EUq/r7ytQsO3 do0x39FK1WqmbJDhz+tudp3ca4VHnghWvAIi4SBNyou9howUW/TGdeKlH2Q+ZZDncOL1 u09WOJj08Bw7LMUNgG/AXIXpFrC8mz5xPJN0h3CE1KQimh4jw2O9oN4uwiYWI/4y70l2 CtCUA8heNY3Lnldkadw+/nReVaFk/mTto21TBiDj/VkhWRYxfS8mh/3IWf2R2wbfwp81 i4adZKj2LI9NX5NXjT0PJ1/uYc+VuxNRikUQF6AC1mnn7ShvckEwVRNgemU2P5kl5b9j I+IA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc; bh=pVikEg8jjnvM0Q28LM7sWpY08h9CumZd8qGejdWCdLY=; b=VvEu3QNVKDZBpbeSGV9ZvjU6esRn0lLcL12WlMR5rWE15buD10nrD5zdHsa8zLD3ED zs3ZbcWOFU6bHIV4ZhfLTOwSxIiouFcVaNw825cOW8xpycaeMvULwcCH1h1RgIIxe4tM xPxLdvb8Fl4sxK6um3bG9tTgVFfo41LU1OewWUPwRWBzZ6boLp6i7QgdO8CCMNQ3ivbn soKX2k+s/jaweRm0lqoinEaTT7M3Dp0V4M0qcEnlieWQrlA/aCLQuIonl8duR1jNkhJS mbWctH4vXbDRIC4yyF/duvIgpWy2fz0qbj+CkArdkZPrRs3y35Srt5C+kRjuwynTAv8/ nvNA== X-Gm-Message-State: APjAAAWslzPQdjnCW3BrpvUtcHe2nEtkLaEuoX/o6I06mMreAgsT/rfw Zkww62XvSF5aNYUVgiQWhkwgyM4= X-Google-Smtp-Source: APXvYqxRizHEqb38RLLpSnKtke5tWnEtl1FdzxTuJoLYKxThF94TMRPyjJRCUG91ip2fTjwmCV7AKv4= X-Received: by 2002:a1f:200b:: with SMTP id g11mr9069177vkg.26.1562014114519; Mon, 01 Jul 2019 13:48:34 -0700 (PDT) Date: Mon, 1 Jul 2019 13:48:17 -0700 In-Reply-To: <20190701204821.44230-1-sdf@google.com> Message-Id: <20190701204821.44230-5-sdf@google.com> Mime-Version: 1.0 References: <20190701204821.44230-1-sdf@google.com> X-Mailer: git-send-email 2.22.0.410.gd8fdbe21b5-goog Subject: [PATCH bpf-next 4/8] bpf: add icsk_retransmits to bpf_tcp_sock From: Stanislav Fomichev To: netdev@vger.kernel.org, bpf@vger.kernel.org Cc: davem@davemloft.net, ast@kernel.org, daniel@iogearbox.net, Stanislav Fomichev , Eric Dumazet , Priyaranjan Jha , Yuchung Cheng , Soheil Hassas Yeganeh Sender: bpf-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: bpf@vger.kernel.org Add some inet_connection_sock fields to bpf_tcp_sock that might be useful for debugging congestion control issues. Cc: Eric Dumazet Cc: Priyaranjan Jha Cc: Yuchung Cheng Cc: Soheil Hassas Yeganeh Signed-off-by: Stanislav Fomichev --- include/uapi/linux/bpf.h | 1 + net/core/filter.c | 20 +++++++++++++++++++- 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/include/uapi/linux/bpf.h b/include/uapi/linux/bpf.h index bfb0b1a76684..ead27aebf491 100644 --- a/include/uapi/linux/bpf.h +++ b/include/uapi/linux/bpf.h @@ -3078,6 +3078,7 @@ struct bpf_tcp_sock { */ __u32 delivered; /* Total data packets delivered incl. rexmits */ __u32 delivered_ce; /* Like the above but only ECE marked packets */ + __u32 icsk_retransmits; /* Number of unrecovered [RTO] timeouts */ }; struct bpf_sock_tuple { diff --git a/net/core/filter.c b/net/core/filter.c index 3da4b6c38b46..089aaea0ccc6 100644 --- a/net/core/filter.c +++ b/net/core/filter.c @@ -5544,7 +5544,8 @@ 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, delivered_ce)) + if (off < 0 || off >= offsetofend(struct bpf_tcp_sock, + icsk_retransmits)) return false; if (off % size != 0) @@ -5575,6 +5576,20 @@ u32 bpf_tcp_sock_convert_ctx_access(enum bpf_access_type type, offsetof(struct tcp_sock, FIELD)); \ } while (0) +#define BPF_INET_SOCK_GET_COMMON(FIELD) \ + do { \ + BUILD_BUG_ON(FIELD_SIZEOF(struct inet_connection_sock, \ + FIELD) > \ + FIELD_SIZEOF(struct bpf_tcp_sock, FIELD)); \ + *insn++ = BPF_LDX_MEM(BPF_FIELD_SIZEOF( \ + struct inet_connection_sock, \ + FIELD), \ + si->dst_reg, si->src_reg, \ + offsetof( \ + struct inet_connection_sock, \ + FIELD)); \ + } while (0) + if (insn > insn_buf) return insn - insn_buf; @@ -5661,6 +5676,9 @@ u32 bpf_tcp_sock_convert_ctx_access(enum bpf_access_type type, case offsetof(struct bpf_tcp_sock, delivered_ce): BPF_TCP_SOCK_GET_COMMON(delivered_ce); break; + case offsetof(struct bpf_tcp_sock, icsk_retransmits): + BPF_INET_SOCK_GET_COMMON(icsk_retransmits); + break; } return insn - insn_buf; From patchwork Mon Jul 1 20:48:18 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Stanislav Fomichev X-Patchwork-Id: 1125606 X-Patchwork-Delegate: bpf@iogearbox.net Return-Path: X-Original-To: incoming-bpf@patchwork.ozlabs.org Delivered-To: patchwork-incoming-bpf@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=bpf-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=google.com header.i=@google.com header.b="LpjuZE5h"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 45czx24QC7z9s4Y for ; Tue, 2 Jul 2019 06:48:38 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726993AbfGAUsi (ORCPT ); Mon, 1 Jul 2019 16:48:38 -0400 Received: from mail-pg1-f201.google.com ([209.85.215.201]:39115 "EHLO mail-pg1-f201.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726963AbfGAUsi (ORCPT ); Mon, 1 Jul 2019 16:48:38 -0400 Received: by mail-pg1-f201.google.com with SMTP id t19so3686306pgh.6 for ; Mon, 01 Jul 2019 13:48:37 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=date:in-reply-to:message-id:mime-version:references:subject:from:to :cc; bh=trs1LCZx1TeDDlzbf8u9lj0ooqYGUeGGwTht5ffRyCA=; b=LpjuZE5hTGrhyLFusN8A6V+yFsTdeaC36wGSyEmptDZvldo6yIwX3eTbQBEwHkBNbj kJDC8WMmY8PUQM5Hmai/ZjI11wDiog/6hYLgXgMergZ0UBUqgFCdit9SvfHK4qukabne Z14y1v0oEitpa2XkHpwePf0vVrEkg7WFiUM3ga2H0oWnB0K7ZQLkuZC1p6aiIIs9JL08 AOzib1murpjC7z3Tj19BNQgFGHwUpA+qB7vH3mh+CcUxQSiX54pYvjKQF7SDimbZxZv1 mUSgKNPDPq5d/H/BVYZ1hr9Iy9Ud9qFiPjS+oee8qTPlEhUexUv+CnNshFcNCegwQCMR kfiA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc; bh=trs1LCZx1TeDDlzbf8u9lj0ooqYGUeGGwTht5ffRyCA=; b=ji3JpdsC3Dn/HVslaRw9xVUGiGm4ScJ5xigOAV0TEl+9CLBV/ALc3S5XhUUXx8DqaO ODieU0G+S1lRGfBHNU+x0xD4wHIZnB760FfdecV5I7ZmT3KEV3fyFwRbW+4hKUR/D6rg NByhIhOXbXar+EvMyC2kY7UbU7g1bB1JIFeBKVtqe9zbB86CDyA3Ry52YOOap/H1bjow KMFjpV6uwozHBmkEDu/lfWhIhevYxiqO0zXOI2U3yYNSwkPrfz/Un6zx4bbSHoiiizEm rTkcDbJmIDGfxMx38Mdmz2E//tPk+caXtbVhgJSpfMUOyZYqLOxOItKnUqMQJho30xfG Rt8Q== X-Gm-Message-State: APjAAAW0Nq2B0AwS4gT4NjiAOvCPMpyD32lzHJ9TL0Pnji7RekXO6OOq YYAfIuBZCcsMMY760DG9qns9Jdo= X-Google-Smtp-Source: APXvYqySZn0GhS6hgtrVmYWiMjcvhaykE73XPjMP/X/0xZ6541raOaFGRHwei8AZOFLSrObM2gStiOI= X-Received: by 2002:a63:5a0a:: with SMTP id o10mr27271957pgb.282.1562014117078; Mon, 01 Jul 2019 13:48:37 -0700 (PDT) Date: Mon, 1 Jul 2019 13:48:18 -0700 In-Reply-To: <20190701204821.44230-1-sdf@google.com> Message-Id: <20190701204821.44230-6-sdf@google.com> Mime-Version: 1.0 References: <20190701204821.44230-1-sdf@google.com> X-Mailer: git-send-email 2.22.0.410.gd8fdbe21b5-goog Subject: [PATCH bpf-next 5/8] bpf/tools: sync bpf.h From: Stanislav Fomichev To: netdev@vger.kernel.org, bpf@vger.kernel.org Cc: davem@davemloft.net, ast@kernel.org, daniel@iogearbox.net, Stanislav Fomichev , Eric Dumazet , Priyaranjan Jha , Yuchung Cheng , Soheil Hassas Yeganeh Sender: bpf-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: bpf@vger.kernel.org Sync new bpf_tcp_sock fields and new BPF_PROG_TYPE_SOCK_OPS RTT callback. Cc: Eric Dumazet Cc: Priyaranjan Jha Cc: Yuchung Cheng Cc: Soheil Hassas Yeganeh Signed-off-by: Stanislav Fomichev --- tools/include/uapi/linux/bpf.h | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/tools/include/uapi/linux/bpf.h b/tools/include/uapi/linux/bpf.h index a396b516a2b2..cecf42c871d4 100644 --- a/tools/include/uapi/linux/bpf.h +++ b/tools/include/uapi/linux/bpf.h @@ -1767,6 +1767,7 @@ union bpf_attr { * * **BPF_SOCK_OPS_RTO_CB_FLAG** (retransmission time out) * * **BPF_SOCK_OPS_RETRANS_CB_FLAG** (retransmission) * * **BPF_SOCK_OPS_STATE_CB_FLAG** (TCP state change) + * * **BPF_SOCK_OPS_RTT_CB_FLAG** (every RTT) * * Therefore, this function can be used to clear a callback flag by * setting the appropriate bit to zero. e.g. to disable the RTO @@ -3069,6 +3070,12 @@ 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 */ + __u32 icsk_retransmits; /* Number of unrecovered [RTO] timeouts */ }; struct bpf_sock_tuple { @@ -3311,7 +3318,8 @@ struct bpf_sock_ops { #define BPF_SOCK_OPS_RTO_CB_FLAG (1<<0) #define BPF_SOCK_OPS_RETRANS_CB_FLAG (1<<1) #define BPF_SOCK_OPS_STATE_CB_FLAG (1<<2) -#define BPF_SOCK_OPS_ALL_CB_FLAGS 0x7 /* Mask of all currently +#define BPF_SOCK_OPS_RTT_CB_FLAG (1<<3) +#define BPF_SOCK_OPS_ALL_CB_FLAGS 0xF /* Mask of all currently * supported cb flags */ @@ -3366,6 +3374,8 @@ enum { BPF_SOCK_OPS_TCP_LISTEN_CB, /* Called on listen(2), right after * socket transition to LISTEN state. */ + BPF_SOCK_OPS_RTT_CB, /* Called on every RTT. + */ }; /* List of TCP states. There is a build check in net/ipv4/tcp.c to detect From patchwork Mon Jul 1 20:48:19 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Stanislav Fomichev X-Patchwork-Id: 1125608 X-Patchwork-Delegate: bpf@iogearbox.net Return-Path: X-Original-To: incoming-bpf@patchwork.ozlabs.org Delivered-To: patchwork-incoming-bpf@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=bpf-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=google.com header.i=@google.com header.b="tfYRwA5X"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 45czx55ZXSz9s4Y for ; Tue, 2 Jul 2019 06:48:41 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726957AbfGAUsl (ORCPT ); Mon, 1 Jul 2019 16:48:41 -0400 Received: from mail-pg1-f201.google.com ([209.85.215.201]:37964 "EHLO mail-pg1-f201.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726668AbfGAUsl (ORCPT ); Mon, 1 Jul 2019 16:48:41 -0400 Received: by mail-pg1-f201.google.com with SMTP id w5so3960669pgs.5 for ; Mon, 01 Jul 2019 13:48:40 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=date:in-reply-to:message-id:mime-version:references:subject:from:to :cc; bh=AuUvzLe+8H5B7LFlE4e2DM+gaSageU+LkPR0C3Dhbpk=; b=tfYRwA5XcFblo54cenWyEAjY1HmjcdOu8dl/govQu2IMAKZQamhQEwa8YqfIp59pZh p+1n1fKPL7YtxaB4PHWJGkD6jX+v3lJw5knPgWnQM9DWi2+WWJzdhMtPqGJEfj3B/Br6 cYv5qUcFDK56L1TVxZy90Ol9s3yrs7LRcGa7FcTRpIAAL3Sf0bCQEuVePg4Su7AchnDy IzRxMc3dqGUqW0jO6d4j0HaflepUZ6JRoeDt6u0ZsIfrasLfPqCQvSWMWXjAR6VX6r1j WQrLtVO8Z7EsBBomUqOPEX9rKExmh1BEIy8e2NFY1YcynzhhmTqj7Y2UJvdTO2w/D9B0 kX/w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc; bh=AuUvzLe+8H5B7LFlE4e2DM+gaSageU+LkPR0C3Dhbpk=; b=ZIR11NMpLtj6fBXiHKNOF4Ymym/hO9gLSVFg5ni5yOto25Yg0/FMxEd8NqByyfPa/2 QZ437xodZOLt6BaGy4llgsHgeIgQjBOdFLB2/OM8cctLj/XCndolosqdrWiaoh/aLbE0 Uo2w4d/RKkSZ7duiWsh1gHoeBUWq8IyQ0siz+PIK0KC2UYPIeft5eZwCQTZ2B1hDYo2i Guga3TFcbGSAaoy/jc4EqmxdbnS9FOfh7EBggf1HNXkU546OdMSM6cbWWuyEthYHiTnp wsm2vaGKcsaQIuMyIJtbbN5DV29hxU2tVCCw/RJN9/fX33a2nn92wvUO7gJkmrBF3fXu 02Aw== X-Gm-Message-State: APjAAAUyHFx6wkJ1PZ59RcybEJvycG+k/f28xo2Meb47lsQRCKACx4Vz cSnm7VOAq4qfFS21jg8oXTdQPcI= X-Google-Smtp-Source: APXvYqxBN45hw0BOCvfiiIWrJRlVOijEmM2o4aoYsaEJsCfP8TObsdtQ/GCWja0BCNqYCX5vWZqjQ+I= X-Received: by 2002:a63:a1f:: with SMTP id 31mr26398646pgk.66.1562014119543; Mon, 01 Jul 2019 13:48:39 -0700 (PDT) Date: Mon, 1 Jul 2019 13:48:19 -0700 In-Reply-To: <20190701204821.44230-1-sdf@google.com> Message-Id: <20190701204821.44230-7-sdf@google.com> Mime-Version: 1.0 References: <20190701204821.44230-1-sdf@google.com> X-Mailer: git-send-email 2.22.0.410.gd8fdbe21b5-goog Subject: [PATCH bpf-next 6/8] selftests/bpf: test BPF_SOCK_OPS_RTT_CB From: Stanislav Fomichev To: netdev@vger.kernel.org, bpf@vger.kernel.org Cc: davem@davemloft.net, ast@kernel.org, daniel@iogearbox.net, Stanislav Fomichev , Eric Dumazet , Priyaranjan Jha , Yuchung Cheng , Soheil Hassas Yeganeh Sender: bpf-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: bpf@vger.kernel.org Make sure the callback is invoked for syn-ack and data packet. Cc: Eric Dumazet Cc: Priyaranjan Jha Cc: Yuchung Cheng Cc: Soheil Hassas Yeganeh Signed-off-by: Stanislav Fomichev --- tools/testing/selftests/bpf/Makefile | 3 +- tools/testing/selftests/bpf/progs/tcp_rtt.c | 61 +++++ tools/testing/selftests/bpf/test_tcp_rtt.c | 253 ++++++++++++++++++++ 3 files changed, 316 insertions(+), 1 deletion(-) create mode 100644 tools/testing/selftests/bpf/progs/tcp_rtt.c create mode 100644 tools/testing/selftests/bpf/test_tcp_rtt.c diff --git a/tools/testing/selftests/bpf/Makefile b/tools/testing/selftests/bpf/Makefile index de1754a8f5fe..2620406a53ec 100644 --- a/tools/testing/selftests/bpf/Makefile +++ b/tools/testing/selftests/bpf/Makefile @@ -27,7 +27,7 @@ TEST_GEN_PROGS = test_verifier test_tag test_maps test_lru_map test_lpm_map test test_cgroup_storage test_select_reuseport test_section_names \ test_netcnt test_tcpnotify_user test_sock_fields test_sysctl test_hashmap \ test_btf_dump test_cgroup_attach xdping test_sockopt test_sockopt_sk \ - test_sockopt_multi + test_sockopt_multi test_tcp_rtt BPF_OBJ_FILES = $(patsubst %.c,%.o, $(notdir $(wildcard progs/*.c))) TEST_GEN_FILES = $(BPF_OBJ_FILES) @@ -107,6 +107,7 @@ $(OUTPUT)/test_cgroup_attach: cgroup_helpers.c $(OUTPUT)/test_sockopt: cgroup_helpers.c $(OUTPUT)/test_sockopt_sk: cgroup_helpers.c $(OUTPUT)/test_sockopt_multi: cgroup_helpers.c +$(OUTPUT)/test_tcp_rtt: cgroup_helpers.c .PHONY: force diff --git a/tools/testing/selftests/bpf/progs/tcp_rtt.c b/tools/testing/selftests/bpf/progs/tcp_rtt.c new file mode 100644 index 000000000000..233bdcb1659e --- /dev/null +++ b/tools/testing/selftests/bpf/progs/tcp_rtt.c @@ -0,0 +1,61 @@ +// SPDX-License-Identifier: GPL-2.0 +#include +#include "bpf_helpers.h" + +char _license[] SEC("license") = "GPL"; +__u32 _version SEC("version") = 1; + +struct tcp_rtt_storage { + __u32 invoked; + __u32 dsack_dups; + __u32 delivered; + __u32 delivered_ce; + __u32 icsk_retransmits; +}; + +struct bpf_map_def SEC("maps") socket_storage_map = { + .type = BPF_MAP_TYPE_SK_STORAGE, + .key_size = sizeof(int), + .value_size = sizeof(struct tcp_rtt_storage), + .map_flags = BPF_F_NO_PREALLOC, +}; +BPF_ANNOTATE_KV_PAIR(socket_storage_map, int, struct tcp_rtt_storage); + +SEC("sockops") +int _sockops(struct bpf_sock_ops *ctx) +{ + struct tcp_rtt_storage *storage; + struct bpf_tcp_sock *tcp_sk; + int op = (int) ctx->op; + struct bpf_sock *sk; + + sk = ctx->sk; + if (!sk) + return 1; + + storage = bpf_sk_storage_get(&socket_storage_map, sk, 0, + BPF_SK_STORAGE_GET_F_CREATE); + if (!storage) + return 1; + + if (op == BPF_SOCK_OPS_TCP_CONNECT_CB) { + bpf_sock_ops_cb_flags_set(ctx, BPF_SOCK_OPS_RTT_CB_FLAG); + return 1; + } + + if (op != BPF_SOCK_OPS_RTT_CB) + return 1; + + tcp_sk = bpf_tcp_sock(sk); + if (!tcp_sk) + return 1; + + storage->invoked++; + + storage->dsack_dups = tcp_sk->dsack_dups; + storage->delivered = tcp_sk->delivered; + storage->delivered_ce = tcp_sk->delivered_ce; + storage->icsk_retransmits = tcp_sk->icsk_retransmits; + + return 1; +} diff --git a/tools/testing/selftests/bpf/test_tcp_rtt.c b/tools/testing/selftests/bpf/test_tcp_rtt.c new file mode 100644 index 000000000000..413fd8514adc --- /dev/null +++ b/tools/testing/selftests/bpf/test_tcp_rtt.c @@ -0,0 +1,253 @@ +// SPDX-License-Identifier: GPL-2.0 +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include "bpf_rlimit.h" +#include "bpf_util.h" +#include "cgroup_helpers.h" + +#define CG_PATH "/tcp_rtt" + +struct tcp_rtt_storage { + __u32 invoked; + __u32 dsack_dups; + __u32 delivered; + __u32 delivered_ce; + __u32 icsk_retransmits; +}; + +static void send_byte(int fd) +{ + char b = 0x55; + + if (write(fd, &b, sizeof(b)) != 1) + error(1, errno, "Failed to send single byte"); +} + +static int verify_sk(int map_fd, int client_fd, const char *msg, __u32 invoked, + __u32 dsack_dups, __u32 delivered, __u32 delivered_ce, + __u32 icsk_retransmits) +{ + int err = 0; + struct tcp_rtt_storage val; + + if (bpf_map_lookup_elem(map_fd, &client_fd, &val) < 0) + error(1, errno, "Failed to read socket storage"); + + if (val.invoked != invoked) { + log_err("%s: unexpected bpf_tcp_sock.invoked %d != %d", + msg, val.invoked, invoked); + err++; + } + + if (val.dsack_dups != dsack_dups) { + log_err("%s: unexpected bpf_tcp_sock.dsack_dups %d != %d", + msg, val.dsack_dups, dsack_dups); + err++; + } + + if (val.delivered != delivered) { + log_err("%s: unexpected bpf_tcp_sock.delivered %d != %d", + msg, val.delivered, delivered); + err++; + } + + if (val.delivered_ce != delivered_ce) { + log_err("%s: unexpected bpf_tcp_sock.delivered_ce %d != %d", + msg, val.delivered_ce, delivered_ce); + err++; + } + + if (val.icsk_retransmits != icsk_retransmits) { + log_err("%s: unexpected bpf_tcp_sock.icsk_retransmits %d != %d", + msg, val.icsk_retransmits, icsk_retransmits); + err++; + } + + return err; +} + +static int connect_to_server(int server_fd) +{ + struct sockaddr_storage addr; + socklen_t len = sizeof(addr); + int fd; + + fd = socket(AF_INET, SOCK_STREAM, 0); + if (fd < 0) { + log_err("Failed to create client socket"); + return -1; + } + + if (getsockname(server_fd, (struct sockaddr *)&addr, &len)) { + log_err("Failed to get server addr"); + goto out; + } + + if (connect(fd, (const struct sockaddr *)&addr, len) < 0) { + log_err("Fail to connect to server"); + goto out; + } + + return fd; + +out: + close(fd); + return -1; +} + +static int run_test(int cgroup_fd, int server_fd) +{ + struct bpf_prog_load_attr attr = { + .prog_type = BPF_PROG_TYPE_SOCK_OPS, + .file = "./tcp_rtt.o", + .expected_attach_type = BPF_CGROUP_SOCK_OPS, + }; + struct bpf_program *prog; + struct bpf_object *obj; + struct bpf_map *map; + int client_fd; + int ignored; + int map_fd; + int err; + + err = bpf_prog_load_xattr(&attr, &obj, &ignored); + if (err) { + log_err("Failed to load BPF object"); + return -1; + } + + map = bpf_map__next(NULL, obj); + map_fd = bpf_map__fd(map); + + prog = bpf_program__next(NULL, obj); + err = bpf_prog_attach(bpf_program__fd(prog), cgroup_fd, + BPF_CGROUP_SOCK_OPS, 0); + if (err) { + log_err("Failed to attach BPF program"); + goto close_bpf_object; + } + + client_fd = connect_to_server(server_fd); + if (client_fd < 0) { + err = -1; + goto close_bpf_object; + } + + err += verify_sk(map_fd, client_fd, "syn-ack", + /*invoked=*/1, + /*dsack_dups=*/0, + /*delivered=*/1, + /*delivered_ce=*/0, + /*icsk_retransmits=*/0); + + send_byte(client_fd); + + err += verify_sk(map_fd, client_fd, "first payload byte", + /*invoked=*/2, + /*dsack_dups=*/0, + /*delivered=*/2, + /*delivered_ce=*/0, + /*icsk_retransmits=*/0); + + close(client_fd); + +close_bpf_object: + bpf_object__close(obj); + return err; +} + +static int start_server(void) +{ + struct sockaddr_in addr = { + .sin_family = AF_INET, + .sin_addr.s_addr = htonl(INADDR_LOOPBACK), + }; + int fd; + + fd = socket(AF_INET, SOCK_STREAM, 0); + if (fd < 0) { + log_err("Failed to create server socket"); + return -1; + } + + if (bind(fd, (const struct sockaddr *)&addr, sizeof(addr)) < 0) { + log_err("Failed to bind socket"); + close(fd); + return -1; + } + + return fd; +} + +static void *server_thread(void *arg) +{ + struct sockaddr_storage addr; + socklen_t len = sizeof(addr); + int fd = *(int *)arg; + int client_fd; + + if (listen(fd, 1) < 0) + error(1, errno, "Failed to listed on socket"); + + client_fd = accept(fd, (struct sockaddr *)&addr, &len); + if (client_fd < 0) + error(1, errno, "Failed to accept client"); + + if (accept(fd, (struct sockaddr *)&addr, &len) >= 0) + error(1, errno, "Unexpected success in second accept"); + + close(client_fd); + + return NULL; +} + +int main(int args, char **argv) +{ + int server_fd, cgroup_fd; + int err = EXIT_SUCCESS; + pthread_t tid; + + if (setup_cgroup_environment()) + goto cleanup_obj; + + cgroup_fd = create_and_get_cgroup(CG_PATH); + if (cgroup_fd < 0) + goto cleanup_cgroup_env; + + if (join_cgroup(CG_PATH)) + goto cleanup_cgroup; + + server_fd = start_server(); + if (server_fd < 0) { + err = EXIT_FAILURE; + goto cleanup_cgroup; + } + + pthread_create(&tid, NULL, server_thread, (void *)&server_fd); + + if (run_test(cgroup_fd, server_fd)) + err = EXIT_FAILURE; + + close(server_fd); + + printf("test_sockopt_sk: %s\n", + err == EXIT_SUCCESS ? "PASSED" : "FAILED"); + +cleanup_cgroup: + close(cgroup_fd); +cleanup_cgroup_env: + cleanup_cgroup_environment(); +cleanup_obj: + return err; +} From patchwork Mon Jul 1 20:48:20 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Stanislav Fomichev X-Patchwork-Id: 1125610 X-Patchwork-Delegate: bpf@iogearbox.net Return-Path: X-Original-To: incoming-bpf@patchwork.ozlabs.org Delivered-To: patchwork-incoming-bpf@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=bpf-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=google.com header.i=@google.com header.b="v10Ei6Uq"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 45czxB2p2Vz9s8m for ; Tue, 2 Jul 2019 06:48:46 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727031AbfGAUso (ORCPT ); Mon, 1 Jul 2019 16:48:44 -0400 Received: from mail-vk1-f201.google.com ([209.85.221.201]:56024 "EHLO mail-vk1-f201.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727028AbfGAUsn (ORCPT ); Mon, 1 Jul 2019 16:48:43 -0400 Received: by mail-vk1-f201.google.com with SMTP id b85so3906612vke.22 for ; Mon, 01 Jul 2019 13:48:42 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=date:in-reply-to:message-id:mime-version:references:subject:from:to :cc; bh=0ABU5Wq16YVDAqCRXg4jt4WKykxR9zBYv9w101IaTts=; b=v10Ei6UqcrjLTMsoWFDNFg26AcFYtolnV+CW682Ie1oImF1RMx6dduFpw1UfgoZu0J oq0CEQzSosmt88hROqK8dkYmZLHtwntmO7k9eAilHkZySToZccbTfY+yfoSLg4xl9vbB V0p05ILfZT1XwnhI7niCTCWmAU+no0y+v/3CW+0QlA4o4AQCCNd217K+BGD6wNQlo+2X 08TB+aXVxJ+JOcwYRYSBQZtfR9qZt7HAFpaDgawGj36upQuWz/FRfgc49R0ccb4LOBM9 OteOXv7LqFc+o4aWVWbtRCMclTN+pEU2M8kKaJ3RwKJf6UpiseFhKfSrHDAOLB5i36IV awSw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc; bh=0ABU5Wq16YVDAqCRXg4jt4WKykxR9zBYv9w101IaTts=; b=Pjzbm5xPKV+0399fT68uMdMrlZSPgLStwUKxFn320QhScsMEcdEcWTXrmVTmo6yXMk LRqsOU/n4kRuXQQokBtroCFd9o1F943K/UEVApcot6WB1iBiHDL2xY2EmvLTa9Pr3HDG 0yI1xfWRDRfy5MJt0D/4bPYdzn3w/ysS+T7Vzm0hI/GkIsJDGbpYWjqb/53NU0OirgMU mSgEh0X8AFH/s+4s881uUo/CpxXg7G+++XhUAFshiw2D+RXPULc+DQXZLZB3H6EFt+O7 /H7zCrY0BTWbDH59gSPLPA2Vr9rqic+huLGlh7oeVuhh4CxMddXwyvMiBw8BVzR2s96p E4pw== X-Gm-Message-State: APjAAAWtJ8UDcff/K7ss4nz6cPiuXUiORTGJxGJ20cUWpS0WAE4Yq+HT VZ6GW0PJvHcpn81XHTY2t7FZkeg= X-Google-Smtp-Source: APXvYqwR4r9Fv5U9fAHYTlT2WwxAAO1SQXO5g9P12hybl4Q5yjlsuro9EG+43Qj5gGeHQHFPlVEZhc8= X-Received: by 2002:a67:c410:: with SMTP id c16mr15234498vsk.227.1562014122062; Mon, 01 Jul 2019 13:48:42 -0700 (PDT) Date: Mon, 1 Jul 2019 13:48:20 -0700 In-Reply-To: <20190701204821.44230-1-sdf@google.com> Message-Id: <20190701204821.44230-8-sdf@google.com> Mime-Version: 1.0 References: <20190701204821.44230-1-sdf@google.com> X-Mailer: git-send-email 2.22.0.410.gd8fdbe21b5-goog Subject: [PATCH bpf-next 7/8] samples/bpf: add sample program that periodically dumps TCP stats From: Stanislav Fomichev To: netdev@vger.kernel.org, bpf@vger.kernel.org Cc: davem@davemloft.net, ast@kernel.org, daniel@iogearbox.net, Stanislav Fomichev , Eric Dumazet , Priyaranjan Jha , Yuchung Cheng , Soheil Hassas Yeganeh Sender: bpf-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: bpf@vger.kernel.org Uses new RTT callback to dump stats every second. $ mkdir -p /tmp/cgroupv2 $ mount -t cgroup2 none /tmp/cgroupv2 $ mkdir -p /tmp/cgroupv2/foo $ echo $$ >> /tmp/cgroupv2/foo/cgroup.procs $ bpftool prog load ./tcp_dumpstats_kern.o /sys/fs/bpf/tcp_prog $ bpftool cgroup attach /tmp/cgroupv2/foo sock_ops pinned /sys/fs/bpf/tcp_prog $ bpftool prog tracelog $ # run neper/netperf/etc Used neper to compare performance with and without this program attached and didn't see any noticeable performance impact. Sample output: -0 [015] ..s. 2074.128800: 0: dsack_dups=0 delivered=242526 -0 [015] ..s. 2074.128808: 0: delivered_ce=0 icsk_retransmits=0 -0 [015] ..s. 2075.130133: 0: dsack_dups=0 delivered=323599 -0 [015] ..s. 2075.130138: 0: delivered_ce=0 icsk_retransmits=0 -0 [005] .Ns. 2076.131440: 0: dsack_dups=0 delivered=404648 -0 [005] .Ns. 2076.131447: 0: delivered_ce=0 icsk_retransmits=0 Cc: Eric Dumazet Cc: Priyaranjan Jha Cc: Yuchung Cheng Cc: Soheil Hassas Yeganeh Signed-off-by: Stanislav Fomichev --- samples/bpf/Makefile | 1 + samples/bpf/tcp_dumpstats_kern.c | 65 ++++++++++++++++++++++++++++++++ 2 files changed, 66 insertions(+) create mode 100644 samples/bpf/tcp_dumpstats_kern.c diff --git a/samples/bpf/Makefile b/samples/bpf/Makefile index 0917f8cf4fab..eaebbeead42f 100644 --- a/samples/bpf/Makefile +++ b/samples/bpf/Makefile @@ -154,6 +154,7 @@ always += tcp_iw_kern.o always += tcp_clamp_kern.o always += tcp_basertt_kern.o always += tcp_tos_reflect_kern.o +always += tcp_dumpstats_kern.o always += xdp_redirect_kern.o always += xdp_redirect_map_kern.o always += xdp_redirect_cpu_kern.o diff --git a/samples/bpf/tcp_dumpstats_kern.c b/samples/bpf/tcp_dumpstats_kern.c new file mode 100644 index 000000000000..5d22bf61db65 --- /dev/null +++ b/samples/bpf/tcp_dumpstats_kern.c @@ -0,0 +1,65 @@ +// SPDX-License-Identifier: GPL-2.0 +#include + +#include "bpf_helpers.h" +#include "bpf_endian.h" + +#define INTERVAL 1000000000ULL + +int _version SEC("version") = 1; +char _license[] SEC("license") = "GPL"; + +struct { + __u32 type; + __u32 map_flags; + int *key; + __u64 *value; +} bpf_next_dump SEC(".maps") = { + .type = BPF_MAP_TYPE_SK_STORAGE, + .map_flags = BPF_F_NO_PREALLOC, +}; + +SEC("sockops") +int _sockops(struct bpf_sock_ops *ctx) +{ + struct bpf_tcp_sock *tcp_sk; + struct bpf_sock *sk; + __u64 *next_dump; + __u64 now; + + switch (ctx->op) { + case BPF_SOCK_OPS_TCP_CONNECT_CB: + bpf_sock_ops_cb_flags_set(ctx, BPF_SOCK_OPS_RTT_CB_FLAG); + return 1; + case BPF_SOCK_OPS_RTT_CB: + break; + default: + return 1; + } + + sk = ctx->sk; + if (!sk) + return 1; + + next_dump = bpf_sk_storage_get(&bpf_next_dump, sk, 0, + BPF_SK_STORAGE_GET_F_CREATE); + if (!next_dump) + return 1; + + now = bpf_ktime_get_ns(); + if (now < *next_dump) + return 1; + + tcp_sk = bpf_tcp_sock(sk); + if (!tcp_sk) + return 1; + + *next_dump = now + INTERVAL; + + bpf_printk("dsack_dups=%u delivered=%u\n", + tcp_sk->dsack_dups, tcp_sk->delivered); + bpf_printk("delivered_ce=%u icsk_retransmits=%u\n", + tcp_sk->delivered_ce, tcp_sk->icsk_retransmits); + + return 1; +} From patchwork Mon Jul 1 20:48:21 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Stanislav Fomichev X-Patchwork-Id: 1125611 X-Patchwork-Delegate: bpf@iogearbox.net Return-Path: X-Original-To: incoming-bpf@patchwork.ozlabs.org Delivered-To: patchwork-incoming-bpf@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=bpf-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=google.com header.i=@google.com header.b="Q1fImz0y"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 45czxC0Sdxz9sBp for ; Tue, 2 Jul 2019 06:48:47 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727036AbfGAUsq (ORCPT ); Mon, 1 Jul 2019 16:48:46 -0400 Received: from mail-vk1-f201.google.com ([209.85.221.201]:50410 "EHLO mail-vk1-f201.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726951AbfGAUsp (ORCPT ); Mon, 1 Jul 2019 16:48:45 -0400 Received: by mail-vk1-f201.google.com with SMTP id p196so1739351vke.17 for ; Mon, 01 Jul 2019 13:48:45 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=date:in-reply-to:message-id:mime-version:references:subject:from:to :cc; bh=bFfe9UYfTQADjR9AyiHnTtCwXNfUK/5CDZ1sDAGgDRw=; b=Q1fImz0yEfudVE17zVKhz9wdgOYxytn2+8LK7qGRJiNbhdyqAVsfRRzuoM6QyU+E8S lShWiLbSp6lVaqJ1Hz+9RNGc1utj3o6F3PYbbTJMCsn/jQCsRA9jXBIi6eQA5+kgtcDH XQJ73P1EM/T9N90qhoohyQK4jzjbioD5xZU4m42wBB4wbFAeiFqqnkrmXnfD+FZyqIEo X7KOoGv8nen3ACTEPe6SGV7IwrGz/RptDKL4yJONeYeRV0GTeoKFM9R7I3Wz8MBCw2bA n4RHzxgykpm2g3scQdfTm4T5G17WuzhWE/mcNQ7PVQKzRngpLx0uT59zjci63jOw5knN LVmQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc; bh=bFfe9UYfTQADjR9AyiHnTtCwXNfUK/5CDZ1sDAGgDRw=; b=DxhtXQh+Q1JtADzoGyZJhBmG8w7LgYagh1cObmIvDc3K7tb61damdbJ1ij3/ai7bpR UKpvEYtFWPDpU1mpVYkvmbmEOSTKrVHYIGaH6zkLxnJSLLZBUC76f0qgok7STU60gWJx kMrbR8q8yPoPreQuh6H//EhVDvI0F6gHeQ1iozMbRDJFC3ChpuaQg4VTGzabK+Mnfd9n ROIKJ9NpjsrvtGAT4Fc3GbZ05JfTdDiKI+3N0tbszkLcBe7xbP7teYvpSFHrxVkpOZ3F P4VMv0lSlxWkv+a1mke4tkTFLXAgtOdbU0jNEvdoimtCyi91MjgKJ1dWQc1D33lY9C41 x69g== X-Gm-Message-State: APjAAAVVsKu4204S0KlFa1t+/G3UWCd2hrT0A4/k07oEHy8ewZ57Wr1n N+JX6MZtLPwyf2wEbfriIJngXbY= X-Google-Smtp-Source: APXvYqx3oet41HXYS45yolXBP3ohs5z/gCMJpvJVjsAvmH2hVBiJqmwzGUal011CmRM8CSi4VuDSivs= X-Received: by 2002:a67:ce97:: with SMTP id c23mr15937336vse.78.1562014124757; Mon, 01 Jul 2019 13:48:44 -0700 (PDT) Date: Mon, 1 Jul 2019 13:48:21 -0700 In-Reply-To: <20190701204821.44230-1-sdf@google.com> Message-Id: <20190701204821.44230-9-sdf@google.com> Mime-Version: 1.0 References: <20190701204821.44230-1-sdf@google.com> X-Mailer: git-send-email 2.22.0.410.gd8fdbe21b5-goog Subject: [PATCH bpf-next 8/8] samples/bpf: fix tcp_bpf.readme detach command From: Stanislav Fomichev To: netdev@vger.kernel.org, bpf@vger.kernel.org Cc: davem@davemloft.net, ast@kernel.org, daniel@iogearbox.net, Stanislav Fomichev Sender: bpf-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: bpf@vger.kernel.org Copy-paste, should be detach, not attach. Signed-off-by: Stanislav Fomichev --- samples/bpf/tcp_bpf.readme | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/bpf/tcp_bpf.readme b/samples/bpf/tcp_bpf.readme index fee746621aec..78e247f62108 100644 --- a/samples/bpf/tcp_bpf.readme +++ b/samples/bpf/tcp_bpf.readme @@ -25,4 +25,4 @@ attached to the cgroupv2). To remove (unattach) a socket_ops BPF program from a cgroupv2: - bpftool cgroup attach /tmp/cgroupv2/foo sock_ops pinned /sys/fs/bpf/tcp_prog + bpftool cgroup detach /tmp/cgroupv2/foo sock_ops pinned /sys/fs/bpf/tcp_prog