函数指针在struct" proto_ops"中指向哪里?

时间:2016-03-24 17:47:46

标签: linux sockets linux-kernel function-pointers getsockopt

在Linux内核中,我发现系统调用getsockopt最终调用sock->ops->getsockoptcode here)。 sock->ops是一个名为proto_ops的结构。这个结构包含许多函数指针,如getsockopt,我想知道它指向的位置 - 我没有找到该地方启动这个结构。

我使用IPv4和TCP进行系统调用,它可能有一些特定的实现函数可以在这里调用。

任何见解都会非常有帮助。提前谢谢!

1 个答案:

答案 0 :(得分:1)

对于IPv4套接字,操作将是net/ipv4/af_inet.c中定义的inet_stream_opsinet_dgram_opsinet_sockraw_ops结构之一(除非您使用像SCTP这样奇怪的东西)在其他地方有自己的ops)。要查看这些指针是如何实现的,请查看同一文件中的inet_create,即called from __sock_create as pf->create()

要了解 指针是如何实现的,请注意inet_create是名为create的{​​{1}}结构的inet_family_ops成员,passed to sock_register(),导致它被放置在创建套接字时参考的net_families数组中。

当您想要查看不同内核组件的连接方式时,在名称中使用register的函数是一件好事。

现在回到getsockopt。如果您查看getsockopt指针的实际位置,在所有3个inet_*_ops结构中,它指向sock_common_getsockopt函数的getsockopt

sock_common_getsockopt中的

net/core/sock.c不是很有趣。它只是从struct sock中提取struct socket,然后调用sk->sk_prot->getsockopt。接下来你会想知道 来自哪里。

它来自下一层。我将以TCP为例。

net/ipv4/tcp_ipv4.c struct proto tcp_prot中,getsockopt成员指向tcp_getsockoptnet/ipv4/tcp.c中定义的函数。它本身实现了SOL_TCP个选项,而对于其他选项,它从另一个名为getsockopt的操作结构调用icsk_af_ops方法。这会将我们带回net/ipv4/tcp_ipv4.c,其中struct inet_connection_sock_af_ops ipv4_specific getsockopt指向ip_getsockopt

ip_getsockopt位于net/ipv4/ip_sockglue.c,并在同一个文件中调用do_ip_getsockopt,这是实际处理SOL_IP选项的位置。