能否从 Linux 内核数据类型“struct sock”中检索套接字端口?

Can one retrieve a socket's port from the Linux Kernel data type `struct sock`?

动机

我正在尝试编写一个 bpftrace 程序来跟踪套接字何时准备好通过连接到 kprobe sock_def_readable 进行读取。我会得到一个 struct sock 来检查。我想将它映射回我在用户区创建的套接字。

问题

如何从 struct sock 恢复端口号?

我只是扩展了 inet_sk 的定义...这只是一个转换。

#!/usr/bin/env bpftrace

#include <linux/net/inet_sock.h>

BEGIN
{
    printf("network tracing");
}

kprobe:sock_def_readable
{
  $inet_sock = (struct inet_sock *)arg0;
  printf("sock_def_readable destination port %d, source port %d \n", $inet_sock->inet_sport, $inet_sock->inet_dport);
}