バックナンバーはこちら。
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フラグメントにまつわる特殊な動作があるらしい。
バックナンバーはこちら。
コメント