diff options
author | 2025-03-08 22:04:20 +0800 | |
---|---|---|
committer | 2025-03-08 22:04:20 +0800 | |
commit | a07bb8fd1299070229f0e8f3dcb57ffd5ef9870a (patch) | |
tree | 84f21bd0bf7071bc5fc7dd989e77d7ceb5476682 /net/ipv4/udp_bpf.c | |
download | ohosKernel-a07bb8fd1299070229f0e8f3dcb57ffd5ef9870a.tar.gz ohosKernel-a07bb8fd1299070229f0e8f3dcb57ffd5ef9870a.zip |
Initial commit: OpenHarmony-v4.0-ReleaseOpenHarmony-v4.0-Release
Diffstat (limited to '')
-rw-r--r-- | net/ipv4/udp_bpf.c | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/net/ipv4/udp_bpf.c b/net/ipv4/udp_bpf.c new file mode 100644 index 000000000..69c9663f9 --- /dev/null +++ b/net/ipv4/udp_bpf.c | |||
@@ -0,0 +1,52 @@ | |||
1 | // SPDX-License-Identifier: GPL-2.0 | ||
2 | /* Copyright (c) 2020 Cloudflare Ltd https://cloudflare.com */ | ||
3 | |||
4 | #include <linux/skmsg.h> | ||
5 | #include <net/sock.h> | ||
6 | #include <net/udp.h> | ||
7 | |||
8 | enum { | ||
9 | UDP_BPF_IPV4, | ||
10 | UDP_BPF_IPV6, | ||
11 | UDP_BPF_NUM_PROTS, | ||
12 | }; | ||
13 | |||
14 | static struct proto *udpv6_prot_saved __read_mostly; | ||
15 | static DEFINE_SPINLOCK(udpv6_prot_lock); | ||
16 | static struct proto udp_bpf_prots[UDP_BPF_NUM_PROTS]; | ||
17 | |||
18 | static void udp_bpf_rebuild_protos(struct proto *prot, const struct proto *base) | ||
19 | { | ||
20 | *prot = *base; | ||
21 | prot->unhash = sock_map_unhash; | ||
22 | prot->close = sock_map_close; | ||
23 | } | ||
24 | |||
25 | static void udp_bpf_check_v6_needs_rebuild(struct proto *ops) | ||
26 | { | ||
27 | if (unlikely(ops != smp_load_acquire(&udpv6_prot_saved))) { | ||
28 | spin_lock_bh(&udpv6_prot_lock); | ||
29 | if (likely(ops != udpv6_prot_saved)) { | ||
30 | udp_bpf_rebuild_protos(&udp_bpf_prots[UDP_BPF_IPV6], ops); | ||
31 | smp_store_release(&udpv6_prot_saved, ops); | ||
32 | } | ||
33 | spin_unlock_bh(&udpv6_prot_lock); | ||
34 | } | ||
35 | } | ||
36 | |||
37 | static int __init udp_bpf_v4_build_proto(void) | ||
38 | { | ||
39 | udp_bpf_rebuild_protos(&udp_bpf_prots[UDP_BPF_IPV4], &udp_prot); | ||
40 | return 0; | ||
41 | } | ||
42 | late_initcall(udp_bpf_v4_build_proto); | ||
43 | |||
44 | struct proto *udp_bpf_get_proto(struct sock *sk, struct sk_psock *psock) | ||
45 | { | ||
46 | int family = sk->sk_family == AF_INET ? UDP_BPF_IPV4 : UDP_BPF_IPV6; | ||
47 | |||
48 | if (sk->sk_family == AF_INET6) | ||
49 | udp_bpf_check_v6_needs_rebuild(psock->sk_proto); | ||
50 | |||
51 | return &udp_bpf_prots[family]; | ||
52 | } | ||