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 で、それぞれ宣言されています。