Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0
0002 /* Copyright (c) 2020 Facebook */
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     /* filter out udp6 sockets */
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 }