在Linux内核中,我发现系统调用getsockopt
最终调用sock->ops->getsockopt
(code here)。 sock->ops
是一个名为proto_ops
的结构。这个结构包含许多函数指针,如getsockopt
,我想知道它指向的位置 - 我没有找到该地方启动这个结构。
我使用IPv4和TCP进行系统调用,它可能有一些特定的实现函数可以在这里调用。
任何见解都会非常有帮助。提前谢谢!
答案 0 :(得分:1)
对于IPv4套接字,操作将是net/ipv4/af_inet.c
中定义的inet_stream_ops
,inet_dgram_ops
,inet_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_getsockopt
,net/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
选项的位置。