1 // SPDX-License-Identifier: GPL-2.0
2 /* Copyright (c) 2020 Facebook */
4 #include "bpf_tracing_net.h"
5 #include <bpf/bpf_helpers.h>
6 #include <bpf/bpf_tracing.h>
7 #include <bpf/bpf_endian.h>
9 char _license
[] SEC("license") = "GPL";
11 static long sock_i_ino(const struct sock
*sk
)
13 const struct socket
*sk_socket
= sk
->sk_socket
;
14 const struct inode
*inode
;
20 inode
= &container_of(sk_socket
, struct socket_alloc
, socket
)->vfs_inode
;
21 bpf_probe_read_kernel(&ino
, sizeof(ino
), &inode
->i_ino
);
26 int dump_udp4(struct bpf_iter__udp
*ctx
)
28 struct seq_file
*seq
= ctx
->meta
->seq
;
29 struct udp_sock
*udp_sk
= ctx
->udp_sk
;
30 struct inet_sock
*inet
;
36 if (udp_sk
== (void *)0)
39 seq_num
= ctx
->meta
->seq_num
;
42 " sl local_address rem_address st tx_queue "
43 "rx_queue tr tm->when retrnsmt uid timeout "
44 "inode ref pointer drops\n");
46 /* filter out udp6 sockets */
48 if (inet
->sk
.sk_family
== AF_INET6
)
52 dest
= inet
->inet_daddr
;
53 src
= inet
->inet_rcv_saddr
;
54 srcp
= bpf_ntohs(inet
->inet_sport
);
55 destp
= bpf_ntohs(inet
->inet_dport
);
56 rqueue
= inet
->sk
.sk_rmem_alloc
.counter
- udp_sk
->forward_deficit
;
58 BPF_SEQ_PRINTF(seq
, "%5d: %08X:%04X %08X:%04X ",
59 ctx
->bucket
, src
, srcp
, dest
, destp
);
61 BPF_SEQ_PRINTF(seq
, "%02X %08X:%08X %02X:%08lX %08X %5u %8d %lu %d %pK %u\n",
63 inet
->sk
.sk_wmem_alloc
.refs
.counter
- 1,
65 0, 0L, 0, ctx
->uid
, 0,
66 sock_i_ino(&inet
->sk
),
67 inet
->sk
.sk_refcnt
.refs
.counter
, udp_sk
,
68 inet
->sk
.sk_drops
.counter
);