1 | // SPDX-License-Identifier: GPL-2.0 |
2 | /* Copyright (c) 2020 Google LLC. */ |
3 | #include "bpf_iter.h" |
4 | #include <bpf/bpf_helpers.h> |
5 | #include <bpf/bpf_tracing.h> |
6 | |
7 | char _license[] SEC("license" ) = "GPL" ; |
8 | |
9 | struct { |
10 | __uint(type, BPF_MAP_TYPE_SK_STORAGE); |
11 | __uint(map_flags, BPF_F_NO_PREALLOC); |
12 | __type(key, int); |
13 | __type(value, int); |
14 | } sk_stg_map SEC(".maps" ); |
15 | |
16 | SEC("iter/bpf_sk_storage_map" ) |
17 | int delete_bpf_sk_storage_map(struct bpf_iter__bpf_sk_storage_map *ctx) |
18 | { |
19 | if (ctx->sk) |
20 | bpf_sk_storage_delete(&sk_stg_map, ctx->sk); |
21 | |
22 | return 0; |
23 | } |
24 | |
25 | SEC("iter/task_file" ) |
26 | int fill_socket_owner(struct bpf_iter__task_file *ctx) |
27 | { |
28 | struct task_struct *task = ctx->task; |
29 | struct file *file = ctx->file; |
30 | struct socket *sock; |
31 | int *sock_tgid; |
32 | |
33 | if (!task || !file) |
34 | return 0; |
35 | |
36 | sock = bpf_sock_from_file(file); |
37 | if (!sock) |
38 | return 0; |
39 | |
40 | sock_tgid = bpf_sk_storage_get(&sk_stg_map, sock->sk, 0, 0); |
41 | if (!sock_tgid) |
42 | return 0; |
43 | |
44 | *sock_tgid = task->tgid; |
45 | |
46 | return 0; |
47 | } |
48 | |
49 | SEC("iter/tcp" ) |
50 | int negate_socket_local_storage(struct bpf_iter__tcp *ctx) |
51 | { |
52 | struct sock_common *sk_common = ctx->sk_common; |
53 | int *sock_tgid; |
54 | |
55 | if (!sk_common) |
56 | return 0; |
57 | |
58 | sock_tgid = bpf_sk_storage_get(&sk_stg_map, sk_common, 0, 0); |
59 | if (!sock_tgid) |
60 | return 0; |
61 | |
62 | *sock_tgid = -*sock_tgid; |
63 | |
64 | return 0; |
65 | } |
66 | |