From mboxrd@z Thu Jan 1 00:00:00 1970 From: John Fastabend Subject: [PATCH bpf-next 4/8] bpf: skb_verdict, support SK_PASS on RX BPF path Date: Thu, 20 Dec 2018 11:35:32 -0800 Message-ID: <1545334536-766-5-git-send-email-john.fastabend@gmail.com> References: <1545334536-766-1-git-send-email-john.fastabend@gmail.com> Cc: netdev@vger.kernel.org, john.fastabend@gmail.com To: ast@kernel.org, daniel@iogearbox.net Return-path: Received: from mail-it1-f195.google.com ([209.85.166.195]:40272 "EHLO mail-it1-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725785AbeLTTgJ (ORCPT ); Thu, 20 Dec 2018 14:36:09 -0500 Received: by mail-it1-f195.google.com with SMTP id h193so3401184ita.5 for ; Thu, 20 Dec 2018 11:36:09 -0800 (PST) In-Reply-To: <1545334536-766-1-git-send-email-john.fastabend@gmail.com> Sender: netdev-owner@vger.kernel.org List-ID: Add SK_PASS verdict support to SK_SKB_VERDICT programs. Now that support for redirects exists we can implement SK_PASS as a redirect to the same socket. This simplifies the BPF programs and avoids an extra map lookup on RX path for simple visibility cases. Further, reduces user (BPF programmer in this context) confusion when their program drops skb due to lack of support. Signed-off-by: John Fastabend --- net/core/skmsg.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/net/core/skmsg.c b/net/core/skmsg.c index 56a99d0..8a91a46 100644 --- a/net/core/skmsg.c +++ b/net/core/skmsg.c @@ -669,6 +669,22 @@ static void sk_psock_verdict_apply(struct sk_psock *psock, bool ingress; switch (verdict) { + case __SK_PASS: + sk_other = psock->sk; + if (sock_flag(sk_other, SOCK_DEAD) || + !sk_psock_test_state(psock, SK_PSOCK_TX_ENABLED)) { + goto out_free; + } + if (atomic_read(&sk_other->sk_rmem_alloc) <= + sk_other->sk_rcvbuf) { + struct tcp_skb_cb *tcp = TCP_SKB_CB(skb); + + tcp->bpf.flags |= BPF_F_INGRESS; + skb_queue_tail(&psock->ingress_skb, skb); + schedule_work(&psock->work); + break; + } + goto out_free; case __SK_REDIRECT: sk_other = tcp_skb_bpf_redirect_fetch(skb); if (unlikely(!sk_other)) -- 2.7.4