linux/tools/testing/selftests/bpf/progs/bpf_iter_udp6.c
<<
>>
Prefs
   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
   8char _license[] SEC("license") = "GPL";
   9
  10#define IPV6_SEQ_DGRAM_HEADER                           \
  11        "  sl  "                                        \
  12        "local_address                         "        \
  13        "remote_address                        "        \
  14        "st tx_queue rx_queue tr tm->when retrnsmt"     \
  15        "   uid  timeout inode ref pointer drops\n"
  16
  17static long sock_i_ino(const struct sock *sk)
  18{
  19        const struct socket *sk_socket = sk->sk_socket;
  20        const struct inode *inode;
  21        unsigned long ino;
  22
  23        if (!sk_socket)
  24                return 0;
  25
  26        inode = &container_of(sk_socket, struct socket_alloc, socket)->vfs_inode;
  27        bpf_probe_read_kernel(&ino, sizeof(ino), &inode->i_ino);
  28        return ino;
  29}
  30
  31SEC("iter/udp")
  32int dump_udp6(struct bpf_iter__udp *ctx)
  33{
  34        struct seq_file *seq = ctx->meta->seq;
  35        struct udp_sock *udp_sk = ctx->udp_sk;
  36        const struct in6_addr *dest, *src;
  37        struct udp6_sock *udp6_sk;
  38        struct inet_sock *inet;
  39        __u16 srcp, destp;
  40        __u32 seq_num;
  41        int rqueue;
  42
  43        if (udp_sk == (void *)0)
  44                return 0;
  45
  46        seq_num = ctx->meta->seq_num;
  47        if (seq_num == 0)
  48                BPF_SEQ_PRINTF(seq, IPV6_SEQ_DGRAM_HEADER);
  49
  50        udp6_sk = bpf_skc_to_udp6_sock(udp_sk);
  51        if (udp6_sk == (void *)0)
  52                return 0;
  53
  54        inet = &udp_sk->inet;
  55        srcp = bpf_ntohs(inet->inet_sport);
  56        destp = bpf_ntohs(inet->inet_dport);
  57        rqueue = inet->sk.sk_rmem_alloc.counter - udp_sk->forward_deficit;
  58        dest  = &inet->sk.sk_v6_daddr;
  59        src   = &inet->sk.sk_v6_rcv_saddr;
  60
  61        BPF_SEQ_PRINTF(seq, "%5d: %08X%08X%08X%08X:%04X %08X%08X%08X%08X:%04X ",
  62                       ctx->bucket,
  63                       src->s6_addr32[0], src->s6_addr32[1],
  64                       src->s6_addr32[2], src->s6_addr32[3], srcp,
  65                       dest->s6_addr32[0], dest->s6_addr32[1],
  66                       dest->s6_addr32[2], dest->s6_addr32[3], destp);
  67
  68        BPF_SEQ_PRINTF(seq, "%02X %08X:%08X %02X:%08lX %08X %5u %8d %lu %d %pK %u\n",
  69                       inet->sk.sk_state,
  70                       inet->sk.sk_wmem_alloc.refs.counter - 1,
  71                       rqueue,
  72                       0, 0L, 0, ctx->uid, 0,
  73                       sock_i_ino(&inet->sk),
  74                       inet->sk.sk_refcnt.refs.counter, udp_sk,
  75                       inet->sk.sk_drops.counter);
  76
  77        return 0;
  78}
  79