into the void

ソフトウェアに関する雑多な調査日記

Androidを載せたbeagleboard-xmをWiFi APにするまで(其の六)

DHCPサーバとDNSリレーサーバ用のプログラムをポーティングする。
Ubuntuで試験的にAPを作ったときに使ったdhcp3-serverとdnsmasqを第一候補にした。dnsmasqについてはすでにandroidのソースツリーに含まれていてビルドもされているようなのでそのまま使ってみる。dhcp3-serverは含まれていない。他にDHCPサーバとして使えようなパッケージもなさそうなので、ソースからビルドする必要がある。
と思ったが、busyboxにudhcpdという簡易なDHCPサーバが入っているらしいのでまずはこれで試してみることにする。busyboxであればandroidへのポーティング実績がたくさんあるし、他にもいろいろなコマンドが使えるようになって便利そうなので。

busyboxのポーティング

参考にしたのは下記のページ。
http://mobisocial.stanford.edu/news/2011/02/compile-busybox-on-android-os/
まずはクロスコンパイル用のtoolchainをダウンロードする。(これまで使ってきたtoolchainではいろいろリソースが足りなくてbusyboxのビルドはできない。)ダウンロードしたtoolchainは適当なフォルダに展開する。
https://sourcery.mentor.com/sgpp/lite/arm/portal/release324
次にbusybox本体をダウンロードする。最新stable buildである1.19.3を使った。
http://www.busybox.net/
展開した後、make menuconfigで必要な設定をする。必須なのは「Cross Compiler prefix」を変更すること。変更後の値はさっきダウンロードして展開したtoolchainの場所を指すようにする。あとは、ビルドするコマンドをどれにするか選択する。自分の環境ではデフォルトのままにしてビルドしてみたらubi系コマンドのビルドでエラーが出たので、ubiattachなどのubiではじまるものだけチェックを外しておいた。
make menuconfigが完了したら、同じフォルダでmake。busy boxというexecutableなバイナリができていれば成功。これをandroidの/system/binにコピーしておく。

udhcpdの設定

busyboxのudhcpd用の設定ファイルを作成する。参考にしたのは下記のサイト。
http://palmyra.seesaa.net/article/189995055.html
androidの/data/udhcpd.confを設定ファイルとして、/data/udhcpd.leasesをリース管理用のファイルとして用意した。
後者は内容はなく空のファイル。前者は下記のような感じ。busyboxがインストールされていればviがつかえるので、androidシステム上で直接ファイルを編集すればいい。

vi /data/udhcpd.conf
start 192.168.2.10                                                              
end 192.168.2.20                                                                
max_leases 20                                                                   
lease_file /data/udhcpd.leases                                                  
interface ath0                                                                  
opt dns 192.168.2.1                                                             
opt subnet 255.255.255.0                                                        
opt router 192.168.2.1  

デフォルトゲートウェイとの通信まで

dnsmasqの設定はまだだが、とりあえずudhcpdを使ってIPを払い出してデフォルトゲートウェイまで通信できるかやってみる。

WiFiドライバ、インタフェースの設定

前の記事で書いたのと同じ方法でWiFiの設定をする

insmod /system/lib/modules/zd1211b.ko
# WiFiモジュールを挿す
netcfg ath0 up
iwconfig ath0 mode Master
iwconfig ath0 essid <SSID>
iwconfig ath0 channel 6
iwconfig ath0 rate 11M
iwconfig ath0 key 1111111111
IP、デフォルトゲートウェイの設定

ath0のIPアドレスデフォルトゲートウェイの設定を行う。

ifconfig ath0 192.168.2.1 netmask 255.255.255.0
route add default gw <上位ルータのアドレス> dev usb0
ip_forwardの設定

普通のLinuxと同じように/proc/net/ipv4/ip_forwardで複数のネットワークデバイスをまたぐIPパケットの転送の有効、無効を設定できる。下記のように有効しておく。

echo 1 > /proc/sys/net/ipv4/ip_forward
DHCPサーバの起動

さきほど作った設定ファイルを使ってudhcpdを起動しておく

/system/bin/busybox udhcpd -f /data/udhcpd.conf &
疎通確認

beagleboard-xmとは別に持っているandroid端末(NW-Z1000)からWiFI接続してみた。
WiFi接続(WEP)は無事つながり、その後IPの取得もできた。pingを使って、beagleboard-xm(192.168.2.1)とさらにその先の有線側の上位ルーターにも疎通していることを確認できた。
あとはdnsmasqを動かせば名前解決もできてインターネットアクセスできるようになるはず。