ある種の 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 raw ソケットを作成して処理を行うのは同じではないでしょうか?
ご連絡をお待ちしております。ありがとう。
マーク