久しぶりにますたにラーメンに行く。 やっぱりここでは基本だと思う組み合わせ、 「ラーメン大盛り固めネギ多め」をオーダー。 おいしい。
そのあと、コンビニで「ごまだれだんご」というブツを発見。 中から胡麻だれがトローリと出てきます。
てなことはどうでもよくって、 FreeBSD 4.3-RELEASE のリリースノートで 「VLAN ネットワーキングコードのいくつかの些細なバグを修正しました」 と触れられている IEEE 802.1q VLAN のテストを行いました。 っていうか、以前の 4.1.1-RELEASE の頃の VLAN のコードって (4.2-RELEASE は試していない) 些細なバグどころではなくかなりダメダメで、 パッチなしには MTU が 1496 になってしまって、 VLAN スイッチを経由した通常の Ethernet とお話ができなくなってしまう、 という致命的欠点があったのですが。 ということで、 SysKonnect 社の SK-9844 Dual Gigabit Ethernet カードを持った、 この PC で実験します。
config ファイルに次の行を加え、vlan(4) を 16 個 config します。 また、4.3-RELEASE では GENERIC の config に sk ドライバ (SysKonnect Gigabit Ethernet) が含まれていないので、それも足します。
pseudo-device vlan 16 device sk
これで起動すると、まずは sk が Gigabit Ethernet を 2 ポート発見し、 次のように起動時に表示されます。
skc0: <SysKonnect Gigabit Ethernet> port 0xb800-0xb8ff mem 0xfc8fc000-0xfc8fffff irq 17 at device 3.0 on pci3 skc0: SysKonnect SK-NET Gigabit Ethernet Adapter SK-9844 SX dual link sk0: <XaQti Corp. XMAC II> on skc0 sk0: Ethernet address: 00:00:5a:99:4b:5c miibus0: <MII bus> on sk0 xmphy0: <XaQti Corp. XMAC II gigabit interface> on miibus0 xmphy0: 1000baseSX, 1000baseSX-FDX, auto sk1: <XaQti Corp. XMAC II> on skc0 sk1: Ethernet address: 00:00:5a:99:4b:5d miibus1: <MII bus> on sk1 xmphy1: <XaQti Corp. XMAC II gigabit interface> on miibus1 xmphy1: 1000baseSX, 1000baseSX-FDX, auto
ここで ifconfig -a
とすると、VLAN に相当するインターフェースが、
次のように表示されます。
vlan0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500 ether 00:00:00:00:00:00 vlan1: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500 ether 00:00:00:00:00:00 ...(略)... vlan15: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500 ether 00:00:00:00:00:00
お、MTU 1500 じゃん、素晴らしいと思って、
# ifconfig vlan0 inet 192.168.0.1 netmask 255.255.255.0 vlan 610 vlandev sk1
と叩くと…、残念ながら、
# ifconfig vlan0 vlan0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1496 inet 192.168.0.1 netmask 0xffffff00 broadcast 192.168.0.255 inet6 fe80::200:5aff:fe99:4b5c%vlan0 prefixlen 64 scopeid 0x5 ether 00:00:5a:99:4b:5d vlan: 610 parent interface: sk1
と、MTU が 1496 になってしまう。 ちなみに、parent interface を sk1 ではなく fxp0 にすると、 1500 になってしまったりするので、 やっぱり fxp0 くらいしか FreeBSD の VLAN って使えないのか、 と思って www.FreeBSD.org で freebsd-net ML の記事などを検索すると、 どうも MTU を手動で ifconfig するだけで動くぞ、 と書かれてみました (ちなみに、それは以前 4.0-RELEASE や 4.1.1-RELEASE の頃に試してみて、 見事に敗退していたので、今回は試していなかった)。 ということで、では手動で試してみましょう。
# ifconfig vlan0 inet 192.168.0.1 netmask 255.255.255.0 vlan 610 vlandev sk1 mtu 1500
すると、ついに、次のように表示されました。
# ifconfig vlan0 vlan0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500 inet 192.168.0.1 netmask 0xffffff00 broadcast 192.168.0.255 inet6 fe80::200:5aff:fe99:4b5c%vlan0 prefixlen 64 scopeid 0x5 ether 00:00:5a:99:4b:5d vlan: 610 parent interface: sk1
やったぁ。 試しに、 VLAN スイッチを通して port VLAN に接続した別のマシンと, この VLAN のインターフェースとの間で、 でかいファイルを ftp してみて、 tcpdump でパケット内容を sniff してみると、 ちゃんと TCP のパケットが 1460 バイトになっている。 すばらしい。 そもそも、1496 バイトと 1500 バイトのホスト間では、 正常に ftp できないことは確認済 (しかも以前は無理やり mtu 1500 つけても、実際には通信できなかった)。
これ、誤解でした。 やっぱり送信には何の問題もないけど、 受信はできません。 ちなみに、SysKonnect のチップのデータシートを見ると、 やはり Giant Frame を受け取るビットがあって、 ここを立てないと IEEE 802.1q パケットの受信はハード的に無理らしい。 ちなみに、fxp ドライバでもやっぱり正常に受信は無理でした。 やはりドライバの改善が必要でしょう。うーん。(2001/06/01)
あ、しまった。 外からの GET は試したけど、 外への PUT が正常に MTU が 1460 出来ているか試していない。 月曜にやろう。