【问题标题】:Can one retrieve a socket's port from the Linux Kernel data type `struct sock`?可以从 Linux 内核数据类型“struct sock”中检索套接字的端口吗?
【发布时间】:2020-05-08 07:02:36
【问题描述】:

动机

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

问题

如何从struct sock 中恢复端口号?

【问题讨论】:

  • 如果它不在那里,那将是惊人的。您是否考虑过查看定义?
  • 我想我可以使用inet_sk(sk)->inet_sportinet_sk(sk)->inet_dport 函数来做到这一点。
  • 你使用哪个内核版本?
  • @red0ct 我认为是 4.15

标签: sockets linux-kernel kprobe


【解决方案1】:

我只是扩展了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);
}

【讨论】:

  • 一个恼人的事情是端口是大端的
猜你喜欢
  • 1970-01-01
  • 2016-05-16
  • 2013-08-14
  • 2016-11-07
  • 1970-01-01
  • 2012-12-07
  • 2011-07-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多