(toppers-users 2098) TINETのtcp_cls_cep()の挙動について

TAKAHASHI Shuhei pcb @ pcbsoft.net
2005年 9月 7日 (水) 19:09:10 JST


はじめまして。
高橋 周平と申す者です。


つい先日、Toppers/JSPとTINETの存在を知り、利用させて頂いています。
組み込みOSに触れるのは初めてなので、簡単なプログラムを動作させるだけでも
四苦八苦しているのですが(^^; 、Toppers/JSPは他の環境に比べて非常に堅牢で、
ドキュメントもよく整備されていて、とてもありがたいです。


ところで、TINETを利用していて思ったのですが、ちょうど数日前に小峰様が
指摘されていらっしゃるとおり、tcp_cls_cep()がタイムアウトで帰ってきた
直後にtcp_acp_cep()を呼び出すと、E_OBJが返されることがあるようです。

ITRON TCP/IP API仕様のtcp_cls_cep()の解説によりますと、

> タイムアウトやtcp_can_cepによってtcp_cls_cepの処理がキャンセルされた
> 場合、指定したTCP通信端点からRSTを送信して接続を強制切断し、それぞれ
> E_TMOUT, E_RLWAIを返値としてリターンする。RSTをすぐに送信できない場
> 合には、送信する手配のみを行うか、それもできない場合にはRSTの送信を
> 省略する。いずれの場合にも、tcp_cls_cepからリターンすると(ノンブロ
> ッキング指定をした場合には、完了を通知するコールバックが呼ばれると)、
> TCP通信端点は未使用状態になっている。

とのことですので、この振る舞いは適切ではないのではと思います。

ソースコードを拝見させて頂いた所、/tinet/netinet/tcp_usrreq.c:685が
> 			if (error == E_RLWAI) {
となっていますが、これはもしかして
> 			if (error == E_TMOUT) {
とするべきなのではないかと思っているのですが、如何でしょうか。


なにぶん素人なものでして、見当外れなことを言っているかもしれませんが、
大目に見てくだされば幸いです。
よろしくお願いいたします。

-- 
TAKAHASHI Shuhei
mailto: pcb @ pcbsoft.net