tiarra を IPv6 で動かした時に IPv4 なクライアントがつながらない問題
んー どこかで IO::Socket::IPv6 の挙動がかわったのかもしんないんだけど、少なくともDebian squeeze環境で確認した限り、tiarra を IPv6 enable な状態(IPv6動作に必要な perl モジュールを入れた上で tiarra-ip-version: v6 にした状態)で動かしていると IPv4 なクライアントは接続できない(connection established な状態のまま accept されずに timeout する)。
これは IrcIO::Client オブジェクトのコンストラクタ内で使用されてる $addr (= $socket->peerhost)に格納されるアドレスが いわゆる IPv4 mapped address になってて、そこで実行される Tiarra::Resolver->paranoid_check() 内で行われている IPアドレス → ホスト名 → IPアドレス というチェックにおいて 最初のIPアドレス(IPv4 mapped address な IPv6 アドレス)と最後のIPアドレス(純粋にIPv4なアドレス)が一致しないとみなされているため。
ちょっとどこで処置しておくのがいいのか困る感じではあるけど とりあえず paranoid_check() で IPv4 mapped address がきた時には prefix をとっぱらって IPv4 なアドレスとして処理するように以下のパッチでもすればいけるはず。
Index: main/Tiarra/Resolver.pm =================================================================== --- main/Tiarra/Resolver.pm (リビジョン 39140) +++ main/Tiarra/Resolver.pm (作業コピー) @@ -230,6 +230,10 @@ my ($class_or_this, $data, $closure, $my_use_threads) = @_; my $this = $class_or_this->_this; + if ($use_ipv6 && $data =~ /^::ffff:(.*)$/i) { + ::printmsg("Pranoid check address is IPv4 mapped address, strip prefix ". $data); + $data = $1; + } # stage 1 $this->resolve( 'host', $data, sub {
で、えーと これは 誰に連絡しておくといいのだろう? ^^;;;