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

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

バックナンバーはこちら。
https://www.simulationroom999.com/blog/In-vehicle-network-backnumber/

はじめに

lwIPの疑似受信用の結果。

登場人物

博識フクロウのフクさん

イラスト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

lwIPの疑似受信の結果

フクさん
フクさん

さて、疑似受信の結果を見るか。

太郎くん
太郎くん

そういうば、プロトコルスタックって中で結構複雑そうなことしてるけど、
そこらへんも見れるのかな?
UDP受信の結果だけ見ても
「ふーん?」
って終わっちゃいそう。

フクさん
フクさん

lwIPのログ出力機能があって、
それを標準出力されるようにしてある。
それを結果として貼るよ。

太郎くん
太郎くん

だったらなんか見えるかな。

lwIPの疑似受信のログ

フクさん
フクさん

こんなログになった。

igmp_init: initializing
igmp_start: starting IGMP processing on if 00AFFA68
igmp_lookup_group: allocated a new group with address 224.0.0.1 on if 00AFFA68
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 00AFFA68
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 001A9666
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=0), 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=1480), 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=2960), 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=4440), 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=5920), 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=7400), 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=1500 len=1500 MF=1 offset=8880), calling ip4_reass()
ip4_reass: matching previous fragment ID=6adc
ip_reass_pbufcount: 21 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
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
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
/* 以降省略 */

受信は成功したのか?

太郎くん
太郎くん

・・・。

フクさん
フクさん

ログに関してはソースコードを見比べながら読むしかないねー。

太郎くん
太郎くん

結論としては、うまく受信したってことでよいのかな?

フクさん
フクさん

うん。
無事IPフラグメントにも対処して、10881[byte]のUDPパケットになったデータの取り出しに成功してるね。
ログの最後のHEX文字列がそれだ。
10881[byte]分全部載せるのもアレなんで、途中から省略してるけど。

受信部分

太郎くん
太郎くん

実際の受信したときのログは
ethernet_input:
ではじまってるところになるのかな?

フクさん
フクさん

そうそう。

太郎くん
太郎くん

一回の受信だと、IPフラグメントの関係でパケットが確定してないんで、
8回受信した後にIP層の評価、そしてUDPの評価をしている感じか。

フクさん
フクさん

その通り!

これで終了?

太郎くん
太郎くん

よーし、これでIPフラグメントは怖くないねー!

フクさん
フクさん

どうだろうねー。
IPフラグメント仕様にもう一つの魔境があるんだよねぇ。

太郎くん
太郎くん

なにそれ!!?

フクさん
フクさん

まぁこれも次回説明して、
最終的には疑似受信させてみる予定だよ。

まとめ

フクさん
フクさん

まとめだよ。

  • lwIP疑似受信は成功。
    • IPフラグメントに対応していた。
  • IPフラグメントにまつわる特殊な動作があるらしい。

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

コメント

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