我正在尝试查找sk_buff
个实例的所有者套接字,例如skb
。我的最终目标是找到一个特定的TCP选项,并以某种方式让用户空间应用程序知道。我计划在找到TCP选项时设置套接字选项,并让用户空间应用程序调用{{1}}。因此,我需要了解getsockopt()
和sk_buff
之间的所有权。
我发现sk_buff中有一个字段:
sock
但是,当我尝试在struct sock *sk;
的{{3}}处检索此字段时,我总是得到tcp_input.c
。
所以我想知道如何在这里找到主人?
另外,我找到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
我还在skb->sk == NULL
中添加了一个新标记,用于指示并将其设置为sk_buff
。然后我在这三个地方检查这个标志。但是它们都没有显示标志已设置,因此我无法确定是否设置套接字选项。
对此问题的任何想法或建议?
提前致谢!
答案 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;
这对我有用。别忘了添加正确的标题。