M3S-T4-Tinyについて その2

毎回皆様にはお世話になっております。
なっとうです。

シェルティ様 SAK様には前回大変お世話になりました。

M3S-T4-Tinyをなんとか組み込む事ができました。
(まだwebサーバーの確認はできていませんが、ファイルシステムを組み込む所まではできているかと思います。)

前回のお話の中で、送信したい時にtcp_can_cepを送るとの事で、受信をキャンセルして送信をする事ができました。

その後確かに送る事も受信する事もできましたが、以下の問題で悩んでおります。

wiresharkで確認をしていると、どういったタイミングで起こる事象なのか把握できておりませんが、
送信->ACK受信がきているのに、
Retransmissionが発生し、それの応答としてDuplicate ACKが返ってきます。

その後何事も無く動作できれば良いのですが、
その状態から次の送信に移ることができなく困っております。

もしかしたらこのサイトの趣旨と少しかけ離れているのかもしれませんが、ご教授いただけたらと思います。

前提条件は前回と同じです。
使用マイコンはRX63N
開発環境はCubeSuite+ V2.01.00

サンプルプログラムはパッチプログラムを入れて動かしております。
ソースはtcp_nonblocking_sampleを使用しております。

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


  • なっとうさん、お疲れ様です。

    返信遅くなりすみません。
    以下、教えていただけますか?

    ①tcp_can_cep()の第2引数は何でしょうか?
     →TFN_TCP_ALL、TFN_TCP_RCV_DATのいずれかかと思いますが、TFN_TCP_ALLの場合、すべてキャンセルされてしまいますので、間違えて送信をキャンセルしていないかご確認ください。

    ②wiresharkのログ(*pcap\,*pcapng)を貼っていただけますか?

    ③tcpudp_open()に渡すワーク領域は十分でしょうか?サンプルのようにtcpudp_get_ramsize()で値の事前確認をしていれば問題ないと思います。

    ④tcp_snd_dat()の送信データ長にゼロを指定していませんか?

    ⑤スタックは十分でしょうか?
     Callwalkerを使ってスタックを見てください。
     \sample\rx63n_rsk\src\bsp\stacksct.h の、
    #pragma stacksize si=0x400
     で調整してください。

    ---

    別方向で解決を図るとしたら、通信端点を送信用受信用とで分けてキャンセルを使わない方法がありますね。
    こちらもご検討ください。

    以上よろしくお願いします
  • シェルティ様

    お世話になります。
    なっとうです。
    何度もご尽力頂き感謝いたします。

    ①tcp_can_cep()の第2引数は何でしょうか?
    TFN_TCP_RCV_DATのみです。

    ②wiresharkのログ(*pcap\,*pcapng)を貼っていただけますか?
    現在システムに組み込んでしまっているので、貼れないのですが、
    イメージとしまして、下記状況です。

    192.168.1.1がマイコン(サーバー)
    192.168.1.1がPC(クライアント)

    Source:192.168.1.1 Destination:192.168.1.2
    50000>50001 [PSY ACK] seq=242256 ACK=361 Win=1460 Len=30

    Source:192.168.1.2 Destination:192.168.1.1
    50001>50000 [ACK] seq=361 ACK=242286 Win=1460 Len=0

    ここで上記のACKが取れて無い様で、
    TCP Retransmission
    Source:192.168.1.1 Destination:192.168.1.2
    50000>50001 [PSY ACK] seq=242256 ACK=361 Win=1460 Len=30

    Source:192.168.1.2 Destination:192.168.1.1
    TCP DUP ACK
    50001>50000 [ACK] seq=361 ACK=242286 Win=1460 Len=0




    となり、2秒→4秒→8秒毎に同様の状態が続きます。
    現在はタイムアウトを持たせてlan_close()、tcpudp_close()して、
    再度オープンをして対応をしています。

    ③tcpudp_open()に渡すワーク領域は十分でしょうか?
    こちらはサンプル通りで問題ありません。

    ④tcp_snd_dat()の送信データ長にゼロを指定していませんか?
    ゼロ指定はありません。

    ⑤スタックは十分でしょうか?
    スタックは十分とってあります。

    後もう一点(webサーバーについてですが。)
    私も内臓ROMだけでサーバーを動かしたく思っております。
    構成としては、画面一枚あればよく、
    接続時は現在の設定データを表示し、
    設定を変更して、ボタンを押したら、
    ゲットメソッドで受けたデータを反映して、
    再度表示させる程度を考えております。

    前回のお話の中で、file_open()とfile_read()の変更、実装との事でしたが、
    よろしければ、もう少しご指南を頂けたらと存じます。

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




  • なっとうさん、お疲れ様です。シェルティです。

    ①~⑤のご回答ありがとうございます。
    状況把握できました。

    ②のTCPの挙動ですが、なっとうさんのご指摘通り、ACKが受信できていないの挙動ですね。

    現象発生時PCからping 192.168.1.1 と実行し、応答ありますか?

    もし応答がなければ、TCP/IP部分の問題ではなく、
    EtherC/EDMAC所謂イーサネットコントローラ部分が止まって
    しまっていますね。

    T4 V.1.06 Release 00のデフォルト設定だとEDMACでの受信データ転送先は0x1020からになります。
    メモリウィンドウでこの領域を見て受信データが入ってきているかどうか確認いただけますか?
    t4_driver.c のlan_inthdr()にブレークを貼ってブレークすることを確認する、でも良いかと思います。
    (EDMAC転送が完了すると割り込みが発生してこの関数が実行されます)

    もし応答が有る場合はTCP/IP内の問題の可能性があり解決は少し難しいかもしれません。

    ---

    もう一つのご質問について。

    私がWebサーバを内蔵ROMだけで動作させたときは、
    アプリケーションノート「M3S-T4-Tinyを用いたWebサーバの実装(an_r20an0075jj_rx_t4.zip)」の「rx62n_webserver_mmc」を改造しました。

    これは r_file_driver.c からFATファイルシステムを呼び出しているのですが、
    FATファイルシステムのAPIを全部取り外し、内蔵ROMからデータを読み出すように file_read()関数を改造しました。

    また、ファイル自体はRXコンパイラのリンカ設定で、バイナリをリンクできる機能があるので、これを使ってHTMLファイルや画像ファイル等のウェブサーバコンテンツをプロジェクトに登録しました。
    この時シンボル名定義も出来るので、これらファイルのシンボルをr_file_driver.c 内でexternしてアクセスするようにしました。

    あとはfile_open()で受け取ったファイルパスに対応する
    ウェブサーバコンテンツのファイル(内蔵ROMに格納したデータ)に
    適当に番号(1\,2\,3...でOKです)を付けて戻り値として返し、
    file_read()で再びそのファイルの番号が指定されて呼び出されてくるので、その中で対応するファイルの先頭ポインタからデータを読み出してmemcpy()でウェブサーバにコピーして渡してあげる、という実装にしました。

    言葉だけだとうまく伝えられていないかもです。すみません。

    T4セミナーの講師の方の話によると「内蔵ROMだけで動くようにしたWebサーバはもう出来上がっていて、近いうちにアプリケーションノートにしてアップする」と仰っていました。

    これを待つのも良いと思います。

    以上です





  • シェルティ様

    毎度お世話になります。
    なっとうです。

    ご連絡頂きありがとうございます。

    早速確認してみたいと思います。

    一先ずこの件に関してクローズとさせて頂きます。
    ありがとうございました。

    今後ともよろしくお願いいたします。