linux - 如何在 Linux 内核中找到 sk_buff 的所有者套接字?

标签 linux sockets tcp linux-kernel

我正在尝试查找 sk_buff 实例的所有者套接字,例如 skb。我的最终目标是找到一个特定的 TCP 选项并以某种方式让用户空间应用程序知道。我打算在找到 TCP 选项时设置一个套接字选项,让用户空间应用程序调用 getsockopt()。因此我需要知道 sk_buffsock 之间的所有权。

我发现sk_buff中有一个字段:

struct sock *sk;

但是,当我尝试在 tcp_input.c 中的 tcp_parse_options 检索此字段时,我总是得到 skb->sk == NULL

所以我想知道如何才能找到这里的主人?

此外,我发现 3 个地方似乎设置了所有者套接字:

http://lxr.free-electrons.com/source/net/ipv4/tcp_input.c?v=3.11#L4181

http://lxr.free-electrons.com/source/net/ipv4/tcp_input.c?v=3.11#L4196

http://lxr.free-electrons.com/source/net/ipv4/tcp_input.c?v=3.11#L4456

我还在 sk_buff 中添加了一个新标志用于指示并将其设置在 tcp_parse_options 中。然后我在这三个地方检查这个标志。但是它们都没有显示设置了标志,因此我无法确定是否设置套接字选项。

对这个问题有什么想法或建议吗?

提前致谢!

最佳答案

从 sk_buff (skb) 你可以用这样的东西得到 sock (sk):

const struct tcphdr *th = tcp_hdr(skb);
struct sock *sk = __inet_lookup_skb(&tcp_hashinfo, skb, th->source, th->dest);
if (sk)
    struct socket* = sk->sk_socket;

这对我有用。不要忘记添加正确的标题。

关于linux - 如何在 Linux 内核中找到 sk_buff 的所有者套接字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37031711/

相关文章:

linux - 无法读取 s/mime 格式的 PKCS7 签名文件(大尺寸)

linux - 使用 Linux 的海量直播视频流

linux - 从 stdin 将数据压缩到现有的 zipfile 子目录中

c - 套接字被 pause() 阻塞

php - PHP_NORMAL_READ切断正在发送的数据

tcp - 客户端 channel 不处于可写状态(NIO)Netty

linux - Control + F4 在 ubuntu 16.04 中不起作用

silverlight - 如何在 Silverlight 中打开一个返回端口 80 的套接字?

linux connect()超时和syncookies

Java维护持久的TCP连接