| < 2009年2月 > | ||||||
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 8 | 9 | 10 | 11 | 12 | 13 | 14 |
| 15 | 16 | 17 | 18 | 19 | 20 | 21 |
| 22 | 23 | 24 | 25 | 26 | 27 | 28 |
次の日: 2009年3月18日
去年の夏ごろに Pentium-DC を積んだ安いファイルサーバを一台作りました。FreeBSD 7 を入れてあって、qemu で Windows 2000 を動かして遊んだりもしてました。
で、最近ちょっと「お仕事」を qemu にやらせてみようと思っていろいろやろうとすると、どういうわけかネットワークへのアクセスがうまくいかない。
tcpdump してみると、どうも 1500byte を超えるでっかーいフレームが平然と流れてる。というわけで、調査。
まず、接続はこうなってる。
salamander 上での ifconfig 結果はこんな感じ。(ipv6 や関係のないインタフェースは削っています)
em0: flags=8943<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST> metric 0 mtu 1500
options=198<VLAN_MTU,VLAN_HWTAGGING,VLAN_HWCSUM,TSO4>
ether 00:1b:**:**:**:**
inet 172.16.*.* netmask 0xffffff80 broadcast 172.16.*.*
media: Ethernet autoselect (1000baseTX <full-duplex>)
status: active
bridge0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
ether ee:70:**:**:**:**
id 00:00:00:00:00:00 priority 32768 hellotime 2 fwddelay 15
maxage 20 holdcnt 6 proto rstp maxaddr 100 timeout 1200
root id 00:00:00:00:00:00 priority 32768 ifcost 0 port 0
member: tap0 flags=143<LEARNING,DISCOVER,AUTOEDGE,AUTOPTP>
member: em0 flags=143<LEARNING,DISCOVER,AUTOEDGE,AUTOPTP>
tap0: flags=8902<BROADCAST,PROMISC,SIMPLEX,MULTICAST> metric 0 mtu 1500
ether 00:bd:**:**:**:**
さて、この状態で shade と salamander の間だけで通信異常が。
具体的には、関係するすべてのインタフェースの MTU が 1500byte に設定されているにも関わらず、1500byte 以上のパケットが salamander → shade の方向に流れる。
ほかの間の通信はすべて正常で、1500 バイトを超える ping などもすべて正常。netstat -rW でホスト間で使用する最大フレーム長を確認しても、やはり 1500。
結論から言うと TSO4 が悪い。ifconfig em0 -tso で一発解決。
TSO というのは TCP Segmentation Offload の略だそうで、簡単に言えば、でかいデータを NIC に渡してやると勝手に分割したりして送信してくれるということです。
残念ながら send(2) したデータがどういう流れで tap0 から吐き出されるのか理解していないので、原因については推測すらできません。が、なんか変なのは間違いないですね。
ところで全然関係ないんですが、OpenOffice 3.0 Draw で図を描いて PNG 出力したら、スペルチェックの波線が残ったまま出力してくれました。これはさすがにおバカすぎると思いました…。