こんにちわ。
菊池と申します。

せっかくの 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 でも同じ気がしますが、自信ありません。

何かご存知の方、いらっしゃいましたら教えてください。
よろしくお願いします。

メールによる返信