法楽日記

デジタル散策記&マインド探訪記

FreeBSD 11.1R: カーネル内での socket 関連システムコールの関数呼び出し関係

FreeBSD 11.1R では、ユーザ空間で socket 関連のシステムコールが呼び出されると、カーネル空間では sys_xxx() → kern_xxx() → soxxx() → pru_xxx() の順に関数が呼び出されます。記憶の整理のため、対応表を書き出しておきます。

sys_xxx() → kern_xxx() → soxxx() → pru_xxx()
sys_socket() kern_socket() socreate() pru_attach()
sys_bind() kern_bindat() sobind() pru_bind()
sys_bindat() kern_bindat() sobindat() pru_bindat()
sys_listen() kern_listen() solisten() pru_listen()
sys_accept() kern_accept4() soaccept() pru_accept()
sys_accept4() kern_accept4() soaccept() pru_accept()
sys_connect() kern_connectat() soconnect() pru_connect()
sys_connectat() kern_connectat() soconnectat() pru_connectat()
sys_socketpair() kern_socketpair() socreate() pru_attach()
sys_sendto() kern_sendit() sosend() pru_sosend()
sys_sendmsg() kern_sendit() sosend() pru_sosend()
sys_recvfrom() kern_recvit() soreceive() pru_soreceive()
sys_sendmsg() kern_recvit() soreceive() pru_soreceive()
sys_shutdown() kern_shutdown() soshutdown() pru_shutdown()
sys_setsockopt() kern_setsockopt() sosetopt() pr_ctloutput()
sys_getsockopt() kern_getsockopt() sogetopt() pr_ctloutput()
sys_getsockname() kern_getsockname() - pru_sockaddr()
sys_getpeername() kern_getpeername() - pru_peeraddr()

表末尾の kern_getsockname() と kern_getpeername() は例外で、対応する soxxx() はありません。表右端の pru_xxx() は pr_usrreqs 構造体のメンバ、pr_xxx() は protosw 構造体のメンバです。

なお、sys_xxx() と kern_xxx() は sys/kern/uipc_syscalls.c で、soxxx() は sys/kern/uipc_socket.c で、それぞれ定義されています。また、socket 構造体は sys/sys/socketvar.h で、protosw 構造体と pr_usrreqs 構造体は sys/sys/protosw.h で、それぞれ宣言されています。