りんけーじ - 日記 - 2009年2月の日記



< 2009年2月 >
1234567
891011121314
15161718192021
22232425262728
前の月: 2008年12月
次の月: 2009年3月

2009/02/23 22:36 [TCP Segmentation Offload と bridge と tap]

去年の夏ごろに Pentium-DC を積んだ安いファイルサーバを一台作りました。FreeBSD 7 を入れてあって、qemu で Windows 2000 を動かして遊んだりもしてました。

で、最近ちょっと「お仕事」を qemu にやらせてみようと思っていろいろやろうとすると、どういうわけかネットワークへのアクセスがうまくいかない。

tcpdump してみると、どうも 1500byte を超えるでっかーいフレームが平然と流れてる。というわけで、調査。

まず、接続はこうなってる。

serenia-em0-bridge0-tap0-shade

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 出力したら、スペルチェックの波線が残ったまま出力してくれました。これはさすがにおバカすぎると思いました…。

コメント(0) トラックバック(0)