バックナンバーはこちら。
https://www.simulationroom999.com/blog/In-vehicle-network-backnumber/
はじめに
IPフラグメントの受信フレーム順違いを再現する疑似受信コード。
登場人物
博識フクロウのフクさん

イラストACにて公開の「kino_k」さんのイラストを使用しています。
https://www.ac-illust.com/main/profile.php?id=iKciwKA9&area=1
エンジニア歴8年の太郎くん

イラストACにて公開の「しのみ」さんのイラストを使用しています。
https://www.ac-illust.com/main/profile.php?id=uCKphAW2&area=1
IPフラグメントの順番入れ替えの疑似受信

で、順番入れ替えの疑似受信はどうやるの?

あー。
そこはすごくシンプルで、
main関数内のinput_pkts関数の引数をランダムにするだけ。

ランダム?

元々こうなってたんだけど。
input_pkts(&net_test, txdata1, sizeof(txdata1));
input_pkts(&net_test, txdata2, sizeof(txdata2));
input_pkts(&net_test, txdata3, sizeof(txdata3));
input_pkts(&net_test, txdata4, sizeof(txdata4));
input_pkts(&net_test, txdata5, sizeof(txdata5));
input_pkts(&net_test, txdata6, sizeof(txdata6));
input_pkts(&net_test, txdata7, sizeof(txdata7));
input_pkts(&net_test, txdata8, sizeof(txdata8));

こうする。
input_pkts(&net_test, txdata7, sizeof(txdata7));
input_pkts(&net_test, txdata3, sizeof(txdata3));
input_pkts(&net_test, txdata6, sizeof(txdata6));
input_pkts(&net_test, txdata5, sizeof(txdata5));
input_pkts(&net_test, txdata4, sizeof(txdata4));
input_pkts(&net_test, txdata2, sizeof(txdata2));
input_pkts(&net_test, txdata8, sizeof(txdata8));
input_pkts(&net_test, txdata1, sizeof(txdata1));
修正コード所感

これはまたすごいことになったねぇ。
まともに動く気がしない。

そもそも最初の受信フレームにUDPヘッダもいないもんね。

UDPの判定はIPフラグメントを解決した後だから、
最初の受信フレームに居る必要はないね。

まぁ理屈上はそうだろうけど。
設計上、実装上は大変なんじゃない?

まぁ大変だろうけど、不可能ではない。

組み込み系のメモリリソース制約にも反するんじゃない?

そこは設計/実装次第だねー。

フクさんの話ぶりを聞いてると、
なんかうまいやり方があって、
lwIPはそのやり方に則ってるって話?

まぁlwIPが則ってるかはこれから見ることなんでわからないが、
割と組み込みの通信周りとしては王道のやり方は存在するね。

なるほど。
それで妙に楽観的なのね。

(まぁこの予想が外れたらヤバいけど)

(大丈夫かなぁ。楽観視してたらやっぱアカーンってのは開発で散々味わったからなぁ)
まとめ

まとめだよ。
- IPフラグメントの受信フレーム順を変える疑似受信コード作成。
- 渡す受信フレームの順番を入れ替えるだけ。
- 組み込み系として、この仕様は重くないか?
- 重いが、割とよくある話でもあり、lwIPも対応しているであろうと楽観視。
バックナンバーはこちら。
コメント