struct "proto_ops" 中的函数指针指向哪里?
Where do the function pointers point to in struct "proto_ops"?
在 Linux 内核中,我发现系统调用 getsockopt
最后调用 sock->ops->getsockopt
(code here). And sock->ops
is a struct called proto_ops
. This struct contains many function pointers such as getsockopt
我想知道它指向哪里 - 我没有找到这个地方启动了这个结构。
我在系统调用中使用了IPv4和TCP,它可能有一些特定的实现函数可以在这里调用。
任何见解都会非常有帮助。提前致谢!
对于 IPv4 套接字,ops 将是结构之一 inet_stream_ops
, inet_dgram_ops
, inet_sockraw_ops
defined in net/ipv4/af_inet.c
(unless you're using something weird like SCTP that has its own ops defined elsewhere). To see how those pointers get there, look at inet_create
in the same file, which is called from __sock_create
as pf->create()
。
要查看 that 指针如何到达那里,请注意 inet_create
是名为 inet_family_ops
的结构的 create
成员,它是 passed to sock_register()
,导致它被放置在创建套接字时查询的 net_families
数组中。
名称中带有 register
的函数是您想要查看不同内核组件如何连接时寻找的好东西。
现在回到 getsockopt
。如果您查看 getsockopt
指针的实际去向,在所有 3 个 inet_*_ops
结构中,它指向 sock_common_getsockopt
用于 getsockopt
函数。
sock_common_getsockopt
在 net/core/sock.c
中不是很有趣。它只是从 struct socket
中提取 struct sock
,然后调用 sk->sk_prot->getsockopt
。所以接下来你会想知道那个是从哪里来的。
它来自下一层。我将以 TCP 为例。
在net/ipv4/tcp_ipv4.c
中有一个struct proto tcp_prot
,其中getsockopt
成员指向tcp_getsockopt
,一个在net/ipv4/tcp.c
中定义的函数。它自己实现 SOL_TCP
选项,对于其他选项,它从另一个名为 icsk_af_ops
的操作结构调用 getsockopt
方法。这让我们回到 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
选项的地方。
在 Linux 内核中,我发现系统调用 getsockopt
最后调用 sock->ops->getsockopt
(code here). And sock->ops
is a struct called proto_ops
. This struct contains many function pointers such as getsockopt
我想知道它指向哪里 - 我没有找到这个地方启动了这个结构。
我在系统调用中使用了IPv4和TCP,它可能有一些特定的实现函数可以在这里调用。
任何见解都会非常有帮助。提前致谢!
对于 IPv4 套接字,ops 将是结构之一 inet_stream_ops
, inet_dgram_ops
, inet_sockraw_ops
defined in net/ipv4/af_inet.c
(unless you're using something weird like SCTP that has its own ops defined elsewhere). To see how those pointers get there, look at inet_create
in the same file, which is called from __sock_create
as pf->create()
。
要查看 that 指针如何到达那里,请注意 inet_create
是名为 inet_family_ops
的结构的 create
成员,它是 passed to sock_register()
,导致它被放置在创建套接字时查询的 net_families
数组中。
名称中带有 register
的函数是您想要查看不同内核组件如何连接时寻找的好东西。
现在回到 getsockopt
。如果您查看 getsockopt
指针的实际去向,在所有 3 个 inet_*_ops
结构中,它指向 sock_common_getsockopt
用于 getsockopt
函数。
sock_common_getsockopt
在 net/core/sock.c
中不是很有趣。它只是从 struct socket
中提取 struct sock
,然后调用 sk->sk_prot->getsockopt
。所以接下来你会想知道那个是从哪里来的。
它来自下一层。我将以 TCP 为例。
在net/ipv4/tcp_ipv4.c
中有一个struct proto tcp_prot
,其中getsockopt
成员指向tcp_getsockopt
,一个在net/ipv4/tcp.c
中定义的函数。它自己实现 SOL_TCP
选项,对于其他选项,它从另一个名为 icsk_af_ops
的操作结构调用 getsockopt
方法。这让我们回到 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
选项的地方。