(toppers-users 4612) ノンブロッキングコールを使用したTCP送信処理について

森崇 tmori @ esm.co.jp
2016年 10月 26日 (水) 07:56:27 JST


toppers/tinetを利用させていただいております森と申します.

tinetを使用した通信アプリの異常系処理の動作確認をしておりましたところ,
tinetの不具合?と思われる現象を確認いたしました.
★使用させていただいているtinetは,tinet-asp-1.5.4.tar.gzです.

そのため,tinetをデバッグ確認したところ,原因と思われるところまで特定できました.

以下,調査結果になりますので,
大変恐れ入りますが,調査結果に不備等ないかご確認をおねがいできませんでしょうか.

■発生している現象
 ノンブロッキングコールを使用したTCP送信を連続実行中に,
 LAN切断※を実施したところ,コールバックによる通知が正しく上がらない現象が発生しました.
 ※KEEP ALIVE設定を10秒程度に短縮して動作確認しています.

■デバッグ確認結果
 デバッグの結果,LAN切断後にTCP層から呼び出されるtcp_close()において,
 送信要求に対するコールバック関数の第二引数に誤りがある
 ことが原因ではないかと推測しております.

 以下,該当箇所にて詳細説明します.

 ■該当箇所
・ファイル:tinet/netinet/tcp_subr.c
・関数:tcp_close
・行番号:504行目
・ソースコード:
 tcp_close()では,送信処理がペンディング中である場合,コールバック関数を呼び出しておりますが,
 該当箇所においては,第二引数が送信要求(snd_nblk_tfn)ではなく,受信要求(rcv_nblk_tfn)になっております.

 第二引数を送信要求(snd_nblk_tfn)に暫定修正したところ,問題の現象は発生しなくなりました.
 恐れ入りますが,本修正で問題ないかご確認をお願いできますと助かります.


 301 T_TCP_CEP *
 302 tcp_close (T_TCP_CEP *cep)
 :
 486                         if (cep->snd_nblk_tfn != TFN_TCP_UNDEF) {
 :

 495
(*cep->callback)(GET_TCP_CEPID(cep), cep->snd_nblk_tfn, (void*)&len);
 496                                         break;
 497
 498                                 case TFN_TCP_SND_DAT:
 499                                 case TFN_TCP_GET_BUF:
 500                                         if (cep->error == E_TMOUT)
 501                                                 len = E_CLS;
 502                                         else
 503                                                 len = cep->error;
 504
(*cep->callback)(GET_TCP_CEPID(cep), cep->rcv_nblk_tfn, (void*)&len);
                                ^^^^^^^^^^^^^^^^^
                                ★snd_nblk_tfnではないでしょうか?
 505                                         break;




以上,よろしくお願いいたします.


-- 
組込み技術センター
森 崇(もり たかし)
TEL:0776-25-8490
email:tmori @ esm.co.jp

Platformingサービス:http://www.esm.co.jp/service/platforming_service
AUTOSAR製品開発:http://www.esm.co.jp/service/autosar
組込みソリューション:http://www.esm.co.jp/service/etec_service