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

Where do the function pointers point to in struct "proto_ops"?

在 Linux 内核中,我发现系统调用 getsockopt 最后调用 sock->ops->getsockoptcode 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_getsockoptnet/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_specificgetsockopt 指向 ip_getsockopt

ip_getsockoptnet/ipv4/ip_sockglue.c 中,它在同一个文件中调用 do_ip_getsockopt,这是实际处理 SOL_IP 选项的地方。