【Ethernet】車載ネットワーク その42【lwIP疑似受信⑤】

【Ethernet】車載ネットワーク その42【lwIP疑似受信⑤】 車載ネットワーク

バックナンバーはこちら。
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フラグメントの順番入れ替えの疑似受信結果

フクさん
フクさん

試してみた結果は・・・。

太郎くん
太郎くん

(ゴクリ・・・。)

フクさん
フクさん

普通に動いた!!

太郎くん
太郎くん

よっしゃー!!

結果ログ

フクさん
フクさん

ログを張っておこう。

igmp_init: initializing
igmp_start: starting IGMP processing on if 008FFC58
igmp_lookup_group: allocated a new group with address 224.0.0.1 on if 008FFC58
netif: added interface ts IP addr 0.0.0.0 netmask 0.0.0.0 gw 0.0.0.0
igmp_lookup_group: allocated a new group with address 236.0.1.1 on if 008FFC58
igmp_joingroup_netif: join to new group: 236.0.1.1
ip4_output_if: ts0
IP header:
+-------------------------------+
| 4 | 6 |  0x00 |        32     | (v, hl, tos, len)
+-------------------------------+
|        0      |000|       0   | (id, flags, offset)
+-------------------------------+
|    1  |    2  |    0x37d7     | (ttl, proto, chksum)
+-------------------------------+
|    0  |    0  |    0  |    0  | (src)
+-------------------------------+
|  236  |    0  |    1  |    1  | (dest)
+-------------------------------+
ip4_output_if: call netif->output()
ethernet_output: sending packet 00499666
udp_bind(ipaddr = 0.0.0.0, port = 2425)
udp_bind: bound to 0.0.0.0, port 2425)
ethernet_input: dest:01:00:5e:00:01:01, src:10:6f:3f:0f:d6:dd, type:800
IP packet is a fragment (id=0x6adc tot_len=1500 len=1500 MF=1 offset=8880), calling ip4_reass()
ip_reass_pbufcount: 3 out
ethernet_input: dest:01:00:5e:00:01:01, src:10:6f:3f:0f:d6:dd, type:800
IP packet is a fragment (id=0x6adc tot_len=1500 len=1500 MF=1 offset=2960), calling ip4_reass()
ip4_reass: matching previous fragment ID=6adc
ip_reass_pbufcount: 6 out
ethernet_input: dest:01:00:5e:00:01:01, src:10:6f:3f:0f:d6:dd, type:800
IP packet is a fragment (id=0x6adc tot_len=1500 len=1500 MF=1 offset=7400), calling ip4_reass()
ip4_reass: matching previous fragment ID=6adc
ip_reass_pbufcount: 9 out
ethernet_input: dest:01:00:5e:00:01:01, src:10:6f:3f:0f:d6:dd, type:800
IP packet is a fragment (id=0x6adc tot_len=1500 len=1500 MF=1 offset=5920), calling ip4_reass()
ip4_reass: matching previous fragment ID=6adc
ip_reass_pbufcount: 12 out
ethernet_input: dest:01:00:5e:00:01:01, src:10:6f:3f:0f:d6:dd, type:800
IP packet is a fragment (id=0x6adc tot_len=1500 len=1500 MF=1 offset=4440), calling ip4_reass()
ip4_reass: matching previous fragment ID=6adc
ip_reass_pbufcount: 15 out
ethernet_input: dest:01:00:5e:00:01:01, src:10:6f:3f:0f:d6:dd, type:800
IP packet is a fragment (id=0x6adc tot_len=1500 len=1500 MF=1 offset=1480), calling ip4_reass()
ip4_reass: matching previous fragment ID=6adc
ip_reass_pbufcount: 18 out
ethernet_input: dest:01:00:5e:00:01:01, src:10:6f:3f:0f:d6:dd, type:800
IP packet is a fragment (id=0x6adc tot_len=521 len=521 MF=0 offset=10360), calling ip4_reass()
ip4_reass: matching previous fragment ID=6adc
ip4_reass: last fragment seen, total len 10861
ip_reass_pbufcount: 19 out
ethernet_input: dest:01:00:5e:00:01:01, src:10:6f:3f:0f:d6:dd, type:800
IP packet is a fragment (id=0x6adc tot_len=1500 len=1500 MF=1 offset=0), calling ip4_reass()
ip4_reass: matching previous fragment ID=6adc
ip4_input:
IP header:
+-------------------------------+
| 4 | 5 |  0x00 |     10881     | (v, hl, tos, len)
+-------------------------------+
|    27356      |000|       0   | (id, flags, offset)
+-------------------------------+
|  255  |   17  |    0x6eda     | (ttl, proto, chksum)
+-------------------------------+
|  192  |  168  |   10  |   11  | (src)
+-------------------------------+
|  236  |    0  |    1  |    1  | (dest)
+-------------------------------+
ip4_input: p->len 576 p->tot_len 10881
udp_input: received datagram of length 10861
UDP header:
+-------------------------------+
|     45056     |      2425     | (src port, dest port)
+-------------------------------+
|     10861     |     0x0000    | (len, chksum)
+-------------------------------+
udp (236.0.1.1, 2425) <-- (192.168.10.11, 45056)
pcb (0.0.0.0, 2425) <-- (0.0.0.0, 0)
udp_input: calculating checksum
01 00 20 00 F4 50 71 DA 02 00 9A 10 7D 40 0B 00
01 00 00 00 45 2A 00 00 77 23 E4 F4 00 00 00 00
F9 40 02 00 00 00 00 00 06 F9 00 00 00 00 FF FF
/* 省略 */

ログ考察

フクさん
フクさん

IP packet is a fragment
の行を見るとわかるなけど、
断片化時のoffsetが出力されてる。
これにより、順番通りに受信していないことが分かる。

太郎くん
太郎くん

うん、そんな感じ。

フクさん
フクさん

そして、
ethernet_input:
の7つ目で
last fragment seen, total len 10861
とあり、最終フレームを検知している。

太郎くん
太郎くん

でも、そこで受信が止まるって感じではないね。

フクさん
フクさん

うん。
最後の1フレームを受信した段階で、
IPヘッダ、UDPヘッダのチェックをしている状態。

フクさん
フクさん

というわけで無事動いたと言える。

太郎くん
太郎くん

んー、でもどういう設計/実装になってるのかな?
フクさんはなんとなく予想してたっぽいけど。

フクさん
フクさん

ちょっと話としては長くなるんで、次回かなー。

まとめ

フクさん
フクさん

まとめだよ。

  • IPフラグメントの受信フレーム順番入れ替えをしても受信した。
    • ログも確認したが、最終フレームで打ち切ってることはしていない。

バックナンバーはこちら。

コメント

タイトルとURLをコピーしました