uIP TCP/IPについて

先ごろ(だいぶ前ですが)ルネサスサイトから uIP TCP/IP Protocol Stack Demostration Document number:R01AN0169EU0100 Ver 1.01 NOTEs: * The demostration directory structure is explained in the application note. * This application note supports RX62N and the demostration project runs on RSK+RX62N. UIPのサンプルを入手しましてSH7670へ移植しました、その結果とても良好な結果を得ましたので報告します 自前のソースでTCP/IPを実装して稼動させていましたがよく応答ができなくなったりしていました いろいろな遷移状態でわけがわからないような(たぶんプロトコルが十分でない)遷移もありました UIPにすると必ず応答して、応答不良などまだ経験がありません、 ただこのUIP長い(大きい)データ転送には弱いんです、”どうしてこんなに時間がかかるの”というぐらい なにか説明ではACKが200mセコンドウェイト方式を採用しているからだとか これの速度はもっと速くはならないものでしょうか? IWIPなど聞きますが、UIPと比べてどうなのでしょうか、IWIPのほうがいいのでしょうか?
  • シェルティさん

    いつもお世話になります

    いろいろやりました、一つのことが課題でして

    tcp_snd_datと tcp_rcv_datはcallbackの中で使用可能ということで

    このことはtcp_snd_datのすぐ後にtcp_rcv_datする

    tcp_rcv_datのすぐ後にtcp_snd_datということで良くわかります

    tcp_snd_datで1Byte送信これを続けさまに発信するなどうまくいきます

    tcp_rcv_datの場合は相手方がデータが入らない場合は無理です

    ということでcallbackの中で全てを処理すれば

    telnetは即可能であると感じています

    ただtelnetを構成する場合、

    現在使用しているインタープリタに結合させたいと思っています

    telnetから入力したコマンドラインをインタープリタに送信して

    インタープリタから出力される文字列をtelnetに出力したいと思います

    この場合callback外の箇所からtelnet送信を起動しないといけません

    uIPの場合ですと、パケットがなくてもcallbackが常に一定間隔で呼ばれており

    その呼ばれたタイミングでデータがある場合はtelnetに出力できます

    t4ですとcallbackイベントがないと飛んできません

    外部からtelnet出力を起動できますでしょうか?

    インタープリタをcallback中に作りこめばできることはわかりますが、

    そうなるとソフト作成が大変なことになるので

    アドバイスでもいただけましたら、幸いです。

  • httpサーバーの方は画面が一応出ました、ファイルリストがブラウザーに表示されました、とりあえずご報告まで。

  • IKUZOさん

    こんにちは、シェルティです。

    なるほど、IKUZOさんが実現されたいことと合致するか少し不安ですが、
    callback処理外から送信することは可能です。

    callbackではtcp_rcv_dat()を呼び出しておいて、
    インタプリター側が送信したくなったら、インタプリター側で
    tcp_rcv_dat()をキャンセルして、キャンセル完了のcallbackで
    tcp_snd_dat()を呼び出し、tcp_snd_dat()の完了で再度tcp_rcv_dat()を
    呼び出す、というものです。

    キャンセルして送信している間も、TCP/IPライブラリ内部にある程度は
    (config_tcpudp.c のtcp_ccep構造体に設定した受信ウィンドウ分は)
    バッファリングされますので、キャンセル/送信中に
    受信データをこぼすこともありません。

    この動作を実現しているサンプルがありますので参考にしてみてください。

    https://www.renesas.com/mw/t4
      ->画面下のほうのTCP/IPサンプルプログラム
        ->画面左のほうのサンプルプログラム
          ->RXファミリ 組み込み用TCP/IP M3S-T4-Tinyを用いたサンプルプログラム Firmware Integration Technology
            ->解凍データの奥底にある「tcp_nonblocking_cancel_sample」フォルダのecho_srv.c

    また、ファイルリストがブラウザに表示されたとのことで、よかったです。       

    ネットワークはいろいろ難儀なところが多いので動き始めるとうれしさも大きいですね。

    以上です

  • シェルティさん

    いつもありがとうございます

    インタプリター側でtcp_rcv_dat()をキャンセルして、キャンセル完了のcallbackでtcp_snd_dat()を呼び出すとのことですが

    キャンセル完了のcallbackというのが良くわからなくて、

    サンプルではstrstrで<CRLF> checkをやってから送信しているので、この場所でコマンド解析というようなことですが

    「インタプリター側でtcp_rcv_dat()をキャンセルして」具体的にはどのようにできますか?

  • サンプルコードによると、受信データが1秒以内に受信できない場合はキャンセルを発令するという意味のように取れますが

    それで、受信のところtcp_rcv_dat(で停止することがないと受け取れますが、たぶんそうですよね、

    その考え方でやってみたいと思います、

    やってみましたがTFN_TCP_RCV_DAT:には1秒毎には来てくれませんね。

    やはり外部から「インタプリター側でtcp_rcv_dat()をキャンセルして」やるひつようがあるようです。

    シェルティさん、すみません、コードミスってました、今一度確認します。

    シェルティさん、解りましたTFN_TCP_RCV_DAT:が外部から送信する窓口ですね、この線でやってみます。

  • シェルティさん

    できました、ありがとうございました。

  • IKUZOさん

    こんにちは、シェルティです

    おお、見事にインタプリタの入出力がtelnetに繋がっていますね。
    telnetサーバの通信端点を増やせば、複数人同時ログインもできると思います。

    後発の方のために、IKUZOさんの疑問点(キャンセル動作)にも回答しておきたいと思います。

    ■前提条件
    (1)通常はmain()ループでプログラムカウンタが周回している
    (2)10ms周期タイマ割り込みまたは、Etherコントローラ割り込みを起点とし
     TCP/IPの処理が実行される。(必要に応じてTCP/IPからユーザにコールバックする)

    ■1通信端点での送信・受信同時動作(受信キャンセル動作の応用)
    (1)main()でまずはTCP接続の1回目の接続待ち受け(tcp_acp_cep())をノンブロッキングコール
    (2)TCP接続が完了するとコールバックが発生、イベントコードはTFN_TCP_ACP_CEPとなる。
    (3)TFN_TCP_ACP_CEPを伴ってコールバックが来たら、tcp_rcv_dat()を実行し
     受信予約(インタプリタへのコマンド待ち)
    (4)TCP受信が完了するとコールバックが発生、イベントコードはTFN_TCP_RCV_DATとなる。
    (5)TFN_TCP_RCV_DATを伴ってコールバックが来たら、tcp_rcv_dat()で
     指定した受信バッファポインタに受信データが入っているので
     これを取り出してインタプリタ側に送出、
     続いてtcp_rcv_dat()を実行し受信予約(次のインタプリタへのコマンド待ち)
    (6)main()ではインタプリタの制御を行っており、(5)で詰め込まれたキューを監視しているとして、
     キューに何かが入ってきたら、キューに登録されたコマンド処理を実行し、実行結果を
     送信バッファに書き込み、tcp_can_cep()を使用して、(5)の受信をキャンセルする
    (7)キャンセルが完了するとコールバックが発生、イベントコードはTFN_TCP_RCV_DATとなる。
    (8)TFN_TCP_RCV_DATとエラーコード(E_RLWAI)を伴ってコールバックが来たら、
     tcp_snd_dat()で(6)の送信バッファを指定して実行
    (9)TCP送信が完了するとコールバックが発生、イベントコードはTFN_TCP_SND_DATとなる。
    (10)TFN_TCP_SND_DATを伴ってコールバックが来たら、tcp_rcv_dat()で再度受信待ちする
     一見(6)~(10)の間に受信したデータは取りこぼしそうですが、TCP/IP内部の受信ウィンドウに
     自動的に保持されACKが返る(溢れた分もEtherコントローラに数KBは保持される模様、
     これも溢れて本当に受信データが破棄されてもTCPの再送制御で通信相手は
     もう一度同じデータを送ってくる)ので、受信データが消えてしまうことはありません。
     
    以上です

  • 管理人です。

    TCP/IPのデモおよびアプリケーションノートに関して、利用中止の注意がルネサスHPに掲載されていますのでご注意ください。

    <件名>
    オープンソースソフトウェアの TCP/IP プロトコルスタックを用いた Ethernet 通信デモンストレーションおよびアプリケーションノートの利用中止について
    <URL>
    https://www.renesas.com/jp/ja/document/oth/renesas-response-uip-open-source-tcp-ip-stacks-vulnerability-issue

    よろしくお願いします。

  • 利用中止も致し方無いですね

    telnet等今どきインターネットに繋ぐ人もいなでしょうし

    実験程度ならともかくルネサス社として商用利用するには無理があると思いましたから

    納得いきます。