1 | // SPDX-License-Identifier: GPL-2.0 |
2 | /* Copyright (c) 2020 Facebook */ |
3 | #include "bpf_iter.h" |
4 | #include "bpf_tracing_net.h" |
5 | #include <bpf/bpf_helpers.h> |
6 | #include <bpf/bpf_endian.h> |
7 | |
8 | char _license[] SEC("license" ) = "GPL" ; |
9 | |
10 | static long sock_i_ino(const struct sock *sk) |
11 | { |
12 | const struct socket *sk_socket = sk->sk_socket; |
13 | const struct inode *inode; |
14 | unsigned long ino; |
15 | |
16 | if (!sk_socket) |
17 | return 0; |
18 | |
19 | inode = &container_of(sk_socket, struct socket_alloc, socket)->vfs_inode; |
20 | bpf_probe_read_kernel(&ino, sizeof(ino), &inode->i_ino); |
21 | return ino; |
22 | } |
23 | |
24 | SEC("iter/udp" ) |
25 | int dump_udp4(struct bpf_iter__udp *ctx) |
26 | { |
27 | struct seq_file *seq = ctx->meta->seq; |
28 | struct udp_sock *udp_sk = ctx->udp_sk; |
29 | struct inet_sock *inet; |
30 | __u16 srcp, destp; |
31 | __be32 dest, src; |
32 | __u32 seq_num; |
33 | int rqueue; |
34 | |
35 | if (udp_sk == (void *)0) |
36 | return 0; |
37 | |
38 | seq_num = ctx->meta->seq_num; |
39 | if (seq_num == 0) |
40 | BPF_SEQ_PRINTF(seq, |
41 | " sl local_address rem_address st tx_queue " |
42 | "rx_queue tr tm->when retrnsmt uid timeout " |
43 | "inode ref pointer drops\n" ); |
44 | |
45 | /* filter out udp6 sockets */ |
46 | inet = &udp_sk->inet; |
47 | if (inet->sk.sk_family == AF_INET6) |
48 | return 0; |
49 | |
50 | inet = &udp_sk->inet; |
51 | dest = inet->inet_daddr; |
52 | src = inet->inet_rcv_saddr; |
53 | srcp = bpf_ntohs(inet->inet_sport); |
54 | destp = bpf_ntohs(inet->inet_dport); |
55 | rqueue = inet->sk.sk_rmem_alloc.counter - udp_sk->forward_deficit; |
56 | |
57 | BPF_SEQ_PRINTF(seq, "%5d: %08X:%04X %08X:%04X " , |
58 | ctx->bucket, src, srcp, dest, destp); |
59 | |
60 | BPF_SEQ_PRINTF(seq, "%02X %08X:%08X %02X:%08lX %08X %5u %8d %lu %d %pK %u\n" , |
61 | inet->sk.sk_state, |
62 | inet->sk.sk_wmem_alloc.refs.counter - 1, |
63 | rqueue, |
64 | 0, 0L, 0, ctx->uid, 0, |
65 | sock_i_ino(sk: &inet->sk), |
66 | inet->sk.sk_refcnt.refs.counter, udp_sk, |
67 | inet->sk.sk_drops.counter); |
68 | |
69 | return 0; |
70 | } |
71 | |