T4でIPフラグメント

いつもお世話になっております。Mきちです。

RX64M+R600VI+T4で、既存のシステム(WindowsPC)とUDP通信を行っています。

通常の送受信では問題が無いのですが、サイズが大きな電文の送受信において

udp_snd_dat、udp_rcv_dat のAPI関数から戻ってこない現象が発生しました。

あわててマニュアルを見ると、T4はIPフラグメントに対応していないとのこと。。。(汗)

こちら側からの送信には電文を分割する仕組みを加えるにしても、相手側からは分割されたデータが来てしまいます。

困ってしまいました。 こちらの皆様のお知恵を拝借したく、経験談やアドバイスなどありましたら、ご教授ください。

 

Parents
  • フラグメントデータが、T4 の UDP関数で受信できないという問題です。

    T4 の \r_t4_rx\make_lib\make_lib\T4_src フォルダを調べてみました。
    ip.c の _ip_rcv_hdr() のなかで、フラグメントデータはエラーになっているようですね。
    まずは、これをコメントにして、ライブラリを再構築してみます。
    データの結合は、その後に悩んでみます。
  • Mきちさん

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

    IPフラグメントはT4ライブラリはサポートしていないですね。
    コードを見てみましたが、仰る通り_ip_rcv_hdr()で受信パケットにIPフラグメントのフラグが
    立っていたらエラーパケットとして破棄する実装になっていますね。

    T4ライブラリがrcv_buff_release()を呼ぶと、RAMに転送されてきたパケットデータは
    次の受信データが来たら上書きされて消えてしまいますので、IPフラグメントのフラグが
    立っている受信データは即座にエラーにしてrcv_buff_release()でリリースするのではなくて、
    その前にどこか大きなRAM(アプリが必要とする分の容量)にプールしておく必要がありますね。
    プールする位置はIPヘッダにあるフラグメントオフセットフィールドの値をそのままプールの先頭からのオフセットとすればよいと思います。
    それで、IPフラグメントの最終パケットだと検出したら、つまり、
    IPヘッダのフラグフィールドのMore FragmentがOFFと検出し、
    かつプールにたまった全データが揃っていたら(歯抜けになっていないかチェックして、
    歯抜けになっていたら1秒くらいは歯抜けの歯が埋まるか待つ)プールにたまった
    全データの先頭ポインタをコールバックでユーザ通知するような実装にすれば
    受信側はどうにか作れるのでは、と思います。

    送信側については、1472バイト(Etherフレーム1514 - Etherヘッダ14 - IPヘッダ20 - UDPヘッダ8)単位で
    アプリケーション指定のデータを千切って、それぞれにIPフラグメント情報を取り付けて
    送出してあげる実装に変更すれば作れると思います。

    RFC791とRFC815をかいつまんで実装していき、Wiresharkでログを取りながら確認していくと
    道が見えてくると思います。

    以上です
  • シェルティさん、回答ありがとうございます。
    ご指摘のような関数を自作するしかないようですね。
    T4で近日中にフラグメント対応したバージョンにUPされることはないのかな?
Reply Children
No Data