0001
0002
0003 #include "bpf_iter.h"
0004 #include "bpf_tracing_net.h"
0005 #include <bpf/bpf_helpers.h>
0006 #include <bpf/bpf_endian.h>
0007
0008 char _license[] SEC("license") = "GPL";
0009
0010 static long sock_i_ino(const struct sock *sk)
0011 {
0012 const struct socket *sk_socket = sk->sk_socket;
0013 const struct inode *inode;
0014 unsigned long ino;
0015
0016 if (!sk_socket)
0017 return 0;
0018
0019 inode = &container_of(sk_socket, struct socket_alloc, socket)->vfs_inode;
0020 bpf_probe_read_kernel(&ino, sizeof(ino), &inode->i_ino);
0021 return ino;
0022 }
0023
0024 SEC("iter/udp")
0025 int dump_udp4(struct bpf_iter__udp *ctx)
0026 {
0027 struct seq_file *seq = ctx->meta->seq;
0028 struct udp_sock *udp_sk = ctx->udp_sk;
0029 struct inet_sock *inet;
0030 __u16 srcp, destp;
0031 __be32 dest, src;
0032 __u32 seq_num;
0033 int rqueue;
0034
0035 if (udp_sk == (void *)0)
0036 return 0;
0037
0038 seq_num = ctx->meta->seq_num;
0039 if (seq_num == 0)
0040 BPF_SEQ_PRINTF(seq,
0041 " sl local_address rem_address st tx_queue "
0042 "rx_queue tr tm->when retrnsmt uid timeout "
0043 "inode ref pointer drops\n");
0044
0045
0046 inet = &udp_sk->inet;
0047 if (inet->sk.sk_family == AF_INET6)
0048 return 0;
0049
0050 inet = &udp_sk->inet;
0051 dest = inet->inet_daddr;
0052 src = inet->inet_rcv_saddr;
0053 srcp = bpf_ntohs(inet->inet_sport);
0054 destp = bpf_ntohs(inet->inet_dport);
0055 rqueue = inet->sk.sk_rmem_alloc.counter - udp_sk->forward_deficit;
0056
0057 BPF_SEQ_PRINTF(seq, "%5d: %08X:%04X %08X:%04X ",
0058 ctx->bucket, src, srcp, dest, destp);
0059
0060 BPF_SEQ_PRINTF(seq, "%02X %08X:%08X %02X:%08lX %08X %5u %8d %lu %d %pK %u\n",
0061 inet->sk.sk_state,
0062 inet->sk.sk_wmem_alloc.refs.counter - 1,
0063 rqueue,
0064 0, 0L, 0, ctx->uid, 0,
0065 sock_i_ino(&inet->sk),
0066 inet->sk.sk_refcnt.refs.counter, udp_sk,
0067 inet->sk.sk_drops.counter);
0068
0069 return 0;
0070 }