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

时间:2016-05-04 15:11:30

标签: linux sockets tcp linux-kernel

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

我发现sk_buff中有一个字段:

sock

但是,当我尝试在struct sock *sk; 的{​​{3}}处检索此字段时,我总是得到tcp_input.c

所以我想知道如何在这里找到主人?

另外,我找到3个似乎设置所有者套接字的地方:

tcp_parse_options

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

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

对此问题的任何想法或建议?

提前致谢!

1 个答案:

答案 0 :(得分:2)

从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;

这对我有用。别忘了添加正确的标题。