google-code-prettify

2006-09-26

connect(2)でEADDRNOTAVAILを返している個所

connect(2)で接続先ポート番号が0の時にEADDRNOTAVAILが返るのだが、このエラーを返している個所を調べた。

connect(2)を呼ぶと、まずsys_connect()が呼ばれる。sys_connect()はsys/kern/uipc_syscalls.cにある。

if ((error = getsock(p->p_fd, SCARG(uap, s), &fp)) != 0)
return (error);
...
so = (struct socket *)fp->f_data;
...
error = soconnect(so, nam, l);

sys_connect()ではgetsock()でsocketを取得。そのsocketをsoconnect()へ渡している。

soconnect()はsys/kern/uipc_socket.cにある。

error = (*so->so_proto->pr_usrreq)(so, PRU_CONNECT,
(struct mbuf *)0, nam, (struct mbuf *)0, l);

で、プロトコル(so_proto)に応じたusrreq関数を呼んでいる。TCPの場合はtcp_usrreq()が呼ばれる。

tcp_usrreq()はsys/netinet/tcp_usrreq.cにあり、

case PRU_CONNECT:
...
error = in_pcbconnect(inp, nam, l);

と、in_pcbconnect()を呼んでいる。

netinet/in_pcb.cのin_pcbconnect()で、

if (sin->sin_port == 0)
return (EADDRNOTAVAIL);

とEADDRNOTAVAILを返している。

本当はgetsock()あたりで、__linkset_add_dataや__linkset_foreachなどおもしろいことが行われているのだが、それはまたいつか書こう。

ところで、uipcとpcbって何の略だろう?
この辺の略語は、どうやって調べたらよいのやら。

6 件のコメント:

匿名 さんのコメント...

uipcはなんとなくUserland Inter Process Callの略かなと想像できますが...

当ってるかどうかも含めて調べ方が謎ですね(w

匿名 さんのコメント...

http://ja.wikipedia.org/wiki/%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9%E5%88%B6%E5%BE%A1%E3%83%96%E3%83%AD%E3%83%83%E3%82%AF
process control block
だろうけど、

http://ja.wikipedia.org/wiki/%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9%E9%96%93%E9%80%9A%E4%BF%A1
interprocess communication
の前に付くのは UNIX なのかなあ

sakurai さんのコメント...

コメントありがとうございます。> お二方。

歴史的経緯もありそうですし、正解は書いた本人に聞かないと謎ですねー。
ファイルのコメントにでも、略語の説明を書いてくれていると良いのですが。

soda さんのコメント...

ipc は interprocess communication の方でしょう。uはなんだっけ。
sys/sys/proc.h にある pcb は、process control block ですが、
netinet/ の pcb は、protocol control block なので違います。

soda さんのコメント...

ちょっと間違えました。
process control block の定義は <sys/proc.h> ではなく <machine/pcb.h> の方ですね。

sakurai さんのコメント...

> sodaさん
ありがとうございます。勉強になりました。

どこかに、略語一覧表があるといいですね。