PF_PACKET 套接字的创建

PF_PACKET 套接字的历史与常见套接字(例如,PF_INET)的差异早在 socket() 系统调用被调用时就开始了。socket() 系统调用由 net/socket.c 中的 sys_socket() 函数内部处理,它使用 sock_create() 函数来确定与指定族相关的协议族操作。这些信息来自 net_families 数组,该数组在内核启动时通过调用 sock_register() 函数放置。 此时,内核能够调用给定族特有的 create() 函数,该函数将生成适当的 sock 结构并完成创建阶段。

对于 PF_PACKET 套接字,create() 函数对应于 net/packet/af_packet.c 中的 packet_create()。 除此之外,此函数负责将协议特定操作的引用写入 sock 结构中。 请注意,这与族特定操作不同;后者仅包含指向 create 函数的指针,而协议特定操作包含可以为给定套接字执行的整套函数(例如,accept、connect、bind、ioctl、listen、sendmsg 等——请查看 include/linux/net.h 以获取完整列表)。

© . All rights reserved.