今朝、tobyにログインしてifconfigしたらem0にIPv6の一時アドレスがついていないことに気づいて、いろいろ調べた。
/etc/network.subrを見るとnetwork6_interface_setup()の定義のところで、
if [ ${rtsol_available} = yes -a -n "${rtsol_interfaces}" ]; then
# Act as endhost - automatically configured.
# You can configure only single interface, as
# specification assumes that autoconfigured host has
# single interface only.
sysctl net.inet6.ip6.accept_rtadv=1
set ${rtsol_interfaces}
ifconfig $1 up
if ! checkyesno rtsold_enable; then
rtsol ${rtsol_flags} $1
fi
fi
とあるので、rtsol_available=yesになるインターフェースじゃないとaccept_rtadv=1にならないらしい。では、どうしたらrtsol_available=yesになるのかさかのぼってみてみると、rtsol_availableを触るのは3か所。
1か所目
case ${ipv6_gateway_enable} in
[Yy][Ee][Ss])
rtsol_available=no
;;
*)
rtsol_available=yes
;;
esac
ここは、ipv6_gateway_enable=noにしているので、rtsol_available=yesになっているはず。
2か所目
prefix=`get_if_var $i ipv6_prefix_IF`
if [ -n "${prefix}" ]; then
rtsol_available=no
rtsol_interface=no
laddr=`network6_getladdr $i`
hostid=`expr "${laddr}" : 'fe80::\(.*\)%\(.*\)'`
ここは実行してみたけど、prefixは空文字列になっていて、test -n はFalseになって、rtsol_available=yesは維持。
3か所目
ipv6_ifconfig=`get_if_var $i ipv6_ifconfig_IF`
if [ -n "${ipv6_ifconfig}" ]; then
rtsol_available=no
rtsol_interface=no
ifconfig $i inet6 ${ipv6_ifconfig} alias
fi
ここはアドレスがついてしまっている。なので test -nがTrueになって、rtsol_available=noになってしまっている模様。
ん?と思って、rc.confを見たら、サーバ待ち受けようにipv6アドレスを付ける設定のaliasを消してしまって、メインのアドレスとして設定する状態になってしまっていたようで、これが怪しそうなので、aliasになるように変更してリブートしてみた。
するとちゃんと一時アドレスがついて、デフォルトルートもちゃんとつくようになった。めでたしめでたし。
というか、rc.confの ipv6_ifconfig_em0 と ipv6_ifconfig_em0_alias0 の違いがやっとわかった。