1 | // SPDX-License-Identifier: GPL-2.0 |
2 | /* Copyright (c) 2020 Cloudflare */ |
3 | #include "bpf_iter.h" |
4 | #include "bpf_tracing_net.h" |
5 | #include <bpf/bpf_helpers.h> |
6 | #include <bpf/bpf_tracing.h> |
7 | #include <errno.h> |
8 | |
9 | char _license[] SEC("license" ) = "GPL" ; |
10 | |
11 | struct { |
12 | __uint(type, BPF_MAP_TYPE_SOCKMAP); |
13 | __uint(max_entries, 64); |
14 | __type(key, __u32); |
15 | __type(value, __u64); |
16 | } sockmap SEC(".maps" ); |
17 | |
18 | struct { |
19 | __uint(type, BPF_MAP_TYPE_SOCKHASH); |
20 | __uint(max_entries, 64); |
21 | __type(key, __u32); |
22 | __type(value, __u64); |
23 | } sockhash SEC(".maps" ); |
24 | |
25 | struct { |
26 | __uint(type, BPF_MAP_TYPE_SOCKHASH); |
27 | __uint(max_entries, 64); |
28 | __type(key, __u32); |
29 | __type(value, __u64); |
30 | } dst SEC(".maps" ); |
31 | |
32 | __u32 elems = 0; |
33 | __u32 socks = 0; |
34 | |
35 | SEC("iter/sockmap" ) |
36 | int copy(struct bpf_iter__sockmap *ctx) |
37 | { |
38 | struct sock *sk = ctx->sk; |
39 | __u32 tmp, *key = ctx->key; |
40 | int ret; |
41 | |
42 | if (!key) |
43 | return 0; |
44 | |
45 | elems++; |
46 | |
47 | /* We need a temporary buffer on the stack, since the verifier doesn't |
48 | * let us use the pointer from the context as an argument to the helper. |
49 | */ |
50 | tmp = *key; |
51 | |
52 | if (sk) { |
53 | socks++; |
54 | return bpf_map_update_elem(&dst, &tmp, sk, 0) != 0; |
55 | } |
56 | |
57 | ret = bpf_map_delete_elem(&dst, &tmp); |
58 | return ret && ret != -ENOENT; |
59 | } |
60 | |