日別アーカイブ: 2014/04/08

FirefoxOS v1.4 のアドレス解決

FxOS on AndroidStick にて v1.3 までは DNS によるアドレス解決がすんなりできていたのですが,v1.4 では全くできなくなっていて調査したところ,ソフト構成の変更があったようです.

ソフト構成の変更点

ソースを辿ってみたところ,名前解決は NSPR 実装の gecko/nsprpub/pr/src/misc/prnetdb.c 内にある PR_GetAddrInfoByName() にて実施していました.この API 内では,GETADDRINFO() にて変数 _pr_getaddrinfo に設定された関数を呼び出され,この変数はライブラリから検索されて見つかった関数が設定されています.

v1.3 までは gecko/other-licenses/android/getaddrinfo.c の __wrap_getaddrinfo() に誘導されていましたが,v1.4 からはこの other-licenses/android が無効になり,bionic の getaddrinfo() が直接呼ばれるようになったようです.

gecko/moz.build にて MOZ_WIDGET_TOOLKIT が ‘gonk’ の場合,other-licenses/android が無効にされているのが分かります.

- if CONFIG['MOZ_WIDGET_TOOLKIT'] in ('android', 'gonk'):
- add_tier_dir('base', ['other-licenses/android'])
+ if CONFIG['MOZ_WIDGET_TOOLKIT'] == 'android':
+ add_tier_dir('base', ['other-licenses/android'])

bionic の getaddrinfo() は netd にアドレス解決を依頼します.ソケットを介して “getaddrinfo” コマンドが送られてアドレスを解決するようですが,この応答が timeout してアドレス解決できなくなっていたようです.netd は android の daemon なので ”setprop net.dnsN” で解決しそうに思いますが,残念ながらこの方法では解決しませんでした.

※追記(4/19): FxOS は multicastDNS に対応しているため,導入ネットワークに接続していればこの問題は発生しないと思われます.つまり自室内LANは未対応…

netd への登録

android には netd が open した socket にコマンドを送り込むコマンド “/system/bin/ndc” が用意されています.これを使うと netd に直接 DNS サーバ情報を送り込めるようです.これを用いて以下のように netd に google DNS サーバのアドレスを設定したところ,v1.4 でのアドレス解決ができるようになりました.

# ndc
Usage: ndc [sockname] <monitor>|<cmd> [arg1] [arg2...]
# ndc resolver setdefaultif eth0
# ndc resolver setifdns eth0 ^ 8.8.8.8 8.8.4.4
Using alt socket netd
200 0 Resolver command succeeded

書式はソースから起こしたのですが,resolver が名前解決コマンド,setifdns がサブコマンドでI/Fへのサーバ情報設定,”^” はドメイン名で「省略」を表し,後ろの2つはサーバIPアドレスです.

今のところ手動で対応する必要がありますが,実施するなら netd の起動後の script に設定しておくのがよいかと思います.

補足ですが,ストレージ制御の vold にも “/system/bin/vdc” コマンドが用意されており,これらの daemon の挙動チェックに外部コマンドが用意されているのはなかなか便利です.残念ながらコマンド一覧が見当たらないのですが,ソースから起こしておくと便利かもしれません.

Proxy への影響

FirefoxOS は一部を除いて HTTP でのアクセスが基本ですので,proxy を設定すれば URL のアドレス解決は proxy サーバに委ねられるため,この問題は proxy サーバのアドレス解決だけが影響を受けます.proxy サーバの設定を IP アドレスで行えばこの問題は起こりません.