如何在Linux内核中findsk_buff的owner socket?

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

我发现在sk_buff中有一个字段:

 struct sock *sk; 

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

所以我想知道如何在这里find店主?

另外,我发现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设置。 然后我在这三个地方检查这个标志。 但是他们都没有显示标志被设置,所以我不能确定是否设置套接字选项。

任何想法或build议这个问题?

提前致谢!

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

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