【问题标题】:How to find owner socket of sk_buff in Linux kernel?如何在 Linux 内核中找到 sk_buff 的所有者套接字?
【发布时间】:2016-05-06 02:22:49
【问题描述】:

我正在尝试查找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。然后我在这三个地方检查这个标志。但是它们都没有显示标志已设置,因此我无法确定是否设置套接字选项。

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

提前致谢!

【问题讨论】:

    标签: linux sockets tcp linux-kernel


    【解决方案1】:

    从 sk_buff (skb) 你可以得到袜子 (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;
    

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

    【讨论】:

    • 在调用 __inet_lookup_skb 之前必须禁用本地 BH
    • @sim 什么是本地 BH?
    • sk_peer_pid 仅适用于 UNIX 套接字,对于其他套接字系列始终为 NULL。如何从 struct sock 中找到所有者?
    • @daisy local_bh_disable()
    • @sim 谢谢,我发现这个链接非常有用stackoverflow.com/questions/24260087/…
    猜你喜欢
    • 1970-01-01
    • 2014-07-11
    • 2016-12-13
    • 2015-05-04
    • 1970-01-01
    • 1970-01-01
    • 2012-11-26
    • 2013-11-25
    • 1970-01-01
    相关资源
    最近更新 更多