我遇到了实现某种 IGMP 侦听后端的内核驱动程序代码,作为其功能的一部分,它创建了一个新的套接字地址系列 AF_IGMPSNOOP,但实际上只为这种类型的套接字实现了一些操作:
static struct proto_ops igmp_snoop_ops = {
family: AF_IGMP_SNOOP,
release: _igmp_snoop_sock_release,
bind: sock_no_bind,
connect: sock_no_connect,
socketpair: sock_no_socketpair,
accept: sock_no_accept,
getname: sock_no_getname,
poll: datagram_poll,
ioctl: sock_no_ioctl,
listen: sock_no_listen,
shutdown: sock_no_shutdown,
setsockopt: _igmp_snoop_setsockopt,
getsockopt: sock_no_getsockopt,
sendmsg: _igmp_snoop_sock_sendmsg,
recvmsg: _igmp_snoop_sock_recvmsg,
mmap: sock_no_mmap,
sendpage: sock_no_sendpage,
}
然而,从用户空间的角度来看,一个套接字被创建为:
fd = socket (AF_IGMPSNOOP, SOCK_RAW, IPPROTO_IGMP)
我想知道添加一个新系列的理由是什么,而实际上是使用原始套接字来访问 IGMP 数据包的堆栈?只创建 AF_INET 原始套接字并做这些事情不是一样吗?
期待您的来信!谢谢。
标记