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