From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-7.0 required=3.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH, MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS, UNWANTED_LANGUAGE_BODY,URIBL_BLOCKED,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 36382C3F2D7 for ; Wed, 4 Mar 2020 10:13:54 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 0DA5B2187F for ; Wed, 4 Mar 2020 10:13:54 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=cloudflare.com header.i=@cloudflare.com header.b="elTxoKyu" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2387866AbgCDKNx (ORCPT ); Wed, 4 Mar 2020 05:13:53 -0500 Received: from mail-lf1-f41.google.com ([209.85.167.41]:35446 "EHLO mail-lf1-f41.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2387833AbgCDKNv (ORCPT ); Wed, 4 Mar 2020 05:13:51 -0500 Received: by mail-lf1-f41.google.com with SMTP id z9so1030243lfa.2 for ; Wed, 04 Mar 2020 02:13:49 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=cloudflare.com; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=0JG4vRN2U1vBjajCliJupAy0Xm38EfZHPBvH9KwfXgk=; b=elTxoKyu7RkdVLYq8DExwAcOXjjfFBZEbcj6vrF5UpngljtRqGrZ7ebgasBZPsdubp zuovFtYIe0rEhyusnKUocgzt3WlrXT9ZeqK8YMpldRtrMSXiw8t9Hir0CdQkbdyOFnYw I7z3lQfWSwm41cFGvT8VytXTt1vcuzNp4ypXQ= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=0JG4vRN2U1vBjajCliJupAy0Xm38EfZHPBvH9KwfXgk=; b=kJJiyASNjaXKPZSi32zqG98/9svXiiN+Pj0slmcFh62uHDXicxVHelvRa2pxJj15l5 Y9PWoAJG/r276L4NoYSuB91SXJLdwBwefWg2mgrptA9rhbMTrFGPhGukDFrCDtLwSAkQ bOddMW9N/KE8wVkBPUWyhLV/yoGN5A88N+nsCrIxBjzq3nwfPPlF86ppFJi7dpnX+tlO pgsnZHYnSirV+5vyNTwkB0mQ/w2OKfp4Iiu5Yl8nZNCqCzNvbP4fN8kRzY967g1iw5zv voPZUBV9kbD6+jBXR7+rZjpY9wtBN5ncynDzwLHzCrN3RGJpWV+wMnONiIIUYtlOMdCk 0yuw== X-Gm-Message-State: ANhLgQ0PJECGXXVr/fR287tfGbP22TAlq2j/cJWzCWgfUMub17dRZpUl Rwwq9Q7tnxwBgE+29ye49qAB/kgiwAfZhJDj X-Google-Smtp-Source: ADFU+vtOHKTMDKLBdW063ze8vJHAb6ivzE/JIjJvB1eGckwN1kulKZrWnFhZaB0IdtDF9F6BE/XHCQ== X-Received: by 2002:a19:760b:: with SMTP id c11mr982899lff.140.1583316828295; Wed, 04 Mar 2020 02:13:48 -0800 (PST) Received: from localhost.localdomain ([176.221.114.230]) by smtp.gmail.com with ESMTPSA id l7sm341777lfk.65.2020.03.04.02.13.47 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 04 Mar 2020 02:13:47 -0800 (PST) From: Lorenz Bauer To: john.fastabend@gmail.com, "David S. Miller" , Jakub Kicinski , Alexey Kuznetsov , Hideaki YOSHIFUJI , Daniel Borkmann , Jakub Sitnicki , Lorenz Bauer , Alexei Starovoitov Cc: kernel-team@cloudflare.com, linux-kernel@vger.kernel.org, netdev@vger.kernel.org, bpf@vger.kernel.org Subject: [PATCH bpf-next v3 07/12] bpf: add sockmap hooks for UDP sockets Date: Wed, 4 Mar 2020 11:13:12 +0100 Message-Id: <20200304101318.5225-8-lmb@cloudflare.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20200304101318.5225-1-lmb@cloudflare.com> References: <20200304101318.5225-1-lmb@cloudflare.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Add basic psock hooks for UDP sockets. This allows adding and removing sockets, as well as automatic removal on unhash and close. Signed-off-by: Lorenz Bauer Signed-off-by: Jakub Sitnicki --- MAINTAINERS | 1 + include/net/udp.h | 5 +++++ net/ipv4/Makefile | 1 + net/ipv4/udp_bpf.c | 53 ++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 60 insertions(+) create mode 100644 net/ipv4/udp_bpf.c diff --git a/MAINTAINERS b/MAINTAINERS index 8f27f40d22bb..b2fae56dca9f 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -9359,6 +9359,7 @@ F: include/linux/skmsg.h F: net/core/skmsg.c F: net/core/sock_map.c F: net/ipv4/tcp_bpf.c +F: net/ipv4/udp_bpf.c LANTIQ / INTEL Ethernet drivers M: Hauke Mehrtens diff --git a/include/net/udp.h b/include/net/udp.h index e55d5f765807..a8fa6c0c6ded 100644 --- a/include/net/udp.h +++ b/include/net/udp.h @@ -503,4 +503,9 @@ static inline struct sk_buff *udp_rcv_segment(struct sock *sk, return segs; } +#ifdef CONFIG_BPF_STREAM_PARSER +struct sk_psock; +struct proto *udp_bpf_get_proto(struct sock *sk, struct sk_psock *psock); +#endif /* BPF_STREAM_PARSER */ + #endif /* _UDP_H */ diff --git a/net/ipv4/Makefile b/net/ipv4/Makefile index 9d97bace13c8..9e1a186a3671 100644 --- a/net/ipv4/Makefile +++ b/net/ipv4/Makefile @@ -61,6 +61,7 @@ obj-$(CONFIG_TCP_CONG_LP) += tcp_lp.o obj-$(CONFIG_TCP_CONG_YEAH) += tcp_yeah.o obj-$(CONFIG_TCP_CONG_ILLINOIS) += tcp_illinois.o obj-$(CONFIG_NET_SOCK_MSG) += tcp_bpf.o +obj-$(CONFIG_BPF_STREAM_PARSER) += udp_bpf.o obj-$(CONFIG_NETLABEL) += cipso_ipv4.o obj-$(CONFIG_XFRM) += xfrm4_policy.o xfrm4_state.o xfrm4_input.o \ diff --git a/net/ipv4/udp_bpf.c b/net/ipv4/udp_bpf.c new file mode 100644 index 000000000000..eddd973e6575 --- /dev/null +++ b/net/ipv4/udp_bpf.c @@ -0,0 +1,53 @@ +// SPDX-License-Identifier: GPL-2.0 +/* Copyright (c) 2020 Cloudflare Ltd https://cloudflare.com */ + +#include +#include +#include + +enum { + UDP_BPF_IPV4, + UDP_BPF_IPV6, + UDP_BPF_NUM_PROTS, +}; + +static struct proto *udpv6_prot_saved __read_mostly; +static DEFINE_SPINLOCK(udpv6_prot_lock); +static struct proto udp_bpf_prots[UDP_BPF_NUM_PROTS]; + +static void udp_bpf_rebuild_protos(struct proto *prot, const struct proto *base) +{ + *prot = *base; + prot->unhash = sock_map_unhash; + prot->close = sock_map_close; +} + +static void udp_bpf_check_v6_needs_rebuild(struct sock *sk, struct proto *ops) +{ + if (sk->sk_family == AF_INET6 && + unlikely(ops != smp_load_acquire(&udpv6_prot_saved))) { + spin_lock_bh(&udpv6_prot_lock); + if (likely(ops != udpv6_prot_saved)) { + udp_bpf_rebuild_protos(&udp_bpf_prots[UDP_BPF_IPV6], ops); + smp_store_release(&udpv6_prot_saved, ops); + } + spin_unlock_bh(&udpv6_prot_lock); + } +} + +static int __init udp_bpf_v4_build_proto(void) +{ + udp_bpf_rebuild_protos(&udp_bpf_prots[UDP_BPF_IPV4], &udp_prot); + return 0; +} +core_initcall(udp_bpf_v4_build_proto); + +struct proto *udp_bpf_get_proto(struct sock *sk, struct sk_psock *psock) +{ + int family = sk->sk_family == AF_INET ? UDP_BPF_IPV4 : UDP_BPF_IPV6; + + if (!psock->sk_proto) + udp_bpf_check_v6_needs_rebuild(sk, READ_ONCE(sk->sk_prot)); + + return &udp_bpf_prots[family]; +} -- 2.20.1