(toppers-users 4350) tcp_rcv_dat() で受信待ち中に FIN を受信してもリターンしない

Shigenori Kimura skimura @ mvd.biglobe.ne.jp
2015年 3月 11日 (水) 19:37:18 JST


 ASP用 TINET 1.5.2 (2011-05-11) を、Renesas の RX62N (Little 
Endian, IPV4, ethernet) に移植しています。

 現在のところ、DHCP、DNS、HTTP の各クライアントと、TELNET、FTP 
のサーバなどが動作しています。

 最近気付いたのですが、ブロッキング・モードで tcp_rcv_dat() に
よる受信待ち中に FIN を受信しても呼び出し元にリターンしないよう
です。

 ITRON TCP/IP API 仕様 Ver. 1.00.01 の tcp_rcv_dat() の記述に
よれば、「相手側から接続が正常切断され、受信バッファにデータが
なくなると、API から 0 が返る。」とあるので、FIN を受信するとリ
ターンものと理解していました。

 但し、tcp_rcv_dat() を呼び出した時点で既にFIN を受信していた
場合には、待たされることなくリターンしてきて、0 を返しています。


 私なりに原因を探ったところ、netinet/tcp_input.c 内の関数 
close_connection () 内の処理にて、

    switch (cep->fsm_state) {
    case TCP_FSM_SYN_RECVD:    /* SYN を受信し、SYN 送信済み */
    case TCP_FSM_ESTABLISHED:  /* コネクション開設完了       */
        cep->fsm_state = TCP_FSM_CLOSE_WAIT;
追記=>  syscall(set_flg(cep->rcv_flgid, TCP_CEP_EVT_RWBUF_READY));
        break;

のように、「追記=>」とあるコードを追加したところ、期待通りに動
作するようになりました。

 しかし、全ての状況を考慮したものではないため、自信がまったく
ありません。

 アドバイスを頂ければ幸いです。

 よろしくお願い申し上げます。