こんにちわ。 菊池と申します。 せっかくの World IPv6 Day なので、6to4 で繋げてみたのですが 亀が踊ってくれませんでした。
原因と対策はとりあえず分かったのですが、ちょっと釈然としません。 詳細は以下のとおりです。 まず /etc/rc.conf は ipv6_enable="YES" となっています。 すると /etc/rc.d/ip6addrctl がデフォルトで prefer_ipv6 します。 これにより、IPv6 優先ぽい policy table が自動で設定されます。 各アプリケーションが getaddrinfo() を使って接続先を取得する際、 libc の net/getaddrinfo.c の reorder あたりで、 この policy table に従った並び替えが行われるようです。 ところが、この policy table が存在すると なぜか getaddrinfo() が 常にIPv4アドレスを先に返すようです...。 # 逆に /etc/rc.d/ip6addrctl prefer_ipv4 としても同じです。 代わりに、ip6addrctl flush を実行し、policy table の中身をクリアすると reorder() でソートが行われないので、IPv6アドレスが先に返るようになりました。 毎回 ip6addrctl flush すれば踊る亀を拝むことができるのですが、 IPv6用の policy table が存在すると IPv4 が優先されてしまう というのは、何か釈然としません。 何か特別な理由があるのでしょうか? # それとも、単に私の手元の環境がおかしいだけなのでしょうか…。 確認したのは FreeBSD 8.1-RELEASE です。 # svnweb で見る限り current でも同じ気がしますが、自信ありません。 何かご存知の方、いらっしゃいましたら教えてください。 よろしくお願いします。