アドホックアクセスポイント計画成る

アドホックアクセスポイント計画の準備が整った。想定した以下の機能を搭載している。

  • 必要な準備はファームウェアのインストールとWebブラウザからのアクセス
  • AOSSボタンを押すことにより、AOSSランプ(LED)点灯および無線LANインターフェースのIPアドレス付加、並びにaodvd起動
  • AOSSボタンを押した後の挙動はスクリプトにて自由に設定可能

以下は私的な備忘録。


AOSSボタンを使用可能にするために地獄の苦労。OpenWrtのみではたどり着けない境地。DD-WRTに変更してgpioの動きをやっと理解する。AOSSボタンの挙動は、

#> gpio poll [pin1~8]

にて確かめる。WLI3-TX1-G54は2。WZR-RS-G54は0。WLI3-TX1-G54の場合は、

#> gpio poll 2
01 – do nothing
00 – push
01 – pull

となる。01が標準状態であり、/src/router/rc/resetbutton.cにてinverseとして扱われる。このresetbutton.cにてservice_restart関数によりAOSSボタンが1秒押されるとrc restart(サービス再起動)を行うよう実装されている。このeval関数をコメントアウトし、

runStartup (“/etc/config”, “.sesbutton”);
runStartup (“/jffs/etc/config”, “.sesbutton”); //if available

とすることで、自由なスクリプトを/jffs/etc/configなどに置けば使える状況になる。

WLI3-TX1-G54はこれで動作した。だがしかし、WZR-RS-G54は動作しない。

resetbutton.cでは、WZR-RS-G54は実態に合わないdefineがなされる。それは/src/router/shared/util.hにて行われる。resetbutton.cでは、実態に合わないdefineのために、int pushを用いてボタンの指定を行う。WZR-RS-G54の場合は以下のとおり。

push = 0x01

brandでcaseしているときに上記のpushを設定するよう到達するようにする。しかしながらgpioではpinの0をpollすると01,00,01…と表示されるのに、resetbutton.cをDEBUGをdefineした状態でgpioの動作を確認しても変化しない。どうやら/dev/gpio/outenをオープンし、gpio|=pinしたものを書き込むか書き込まないかの違いで、/dev/gpio/inから読み込めるかどうかが決まるらしい。どうでもいいがresetbutton.cはネストしすぎでめちゃくちゃ読みにくい。

これを/src/router上でmake rcしてコンパイルしたものを/usr/sbinに詰め込んでbuild_firmware.sh実行するとbinができる。make rcするときはある一定バージョンのv24?はコンパイルでこけるので、/src/router/rc/revision.hで修正を行う。これはsvnでパッケージをとってこないで、Webサーバから取り寄せているからかもしれない。

aodv-uuのコンパイルはmipselのtoolchainとdd-wrtの中のv23あたりのlinuxを指定してコンパイルを行う。ソース中のlnxにてカーネルモジュールのコンパイルが行われるが、上手くカーネルパスが指定されないので、srcルートでmake KERNEL_DIR=hogehogeで指定。出来たものを、それぞれ/usr/sbin/aodvdと/lib/module/2.4.23/kaodv.oに入れる。このコンパイルしたaodvdはモジュールをmodprobeしようとしてくれるのだが、dd-wrtではmodprobeは存在しない。dd-wrt内にmodprobe入れるか、main.cでハードコーディングされているmodprobeをinsmodに書き換えるかする必要がある。既にkaodv.oがinsmodされていれば、上記のエラーが出ても問題ないので、そういうスクリプトを書けば解決する。なお、当然のことながらaodvdはインターフェースにIPアドレスが振られていないと動作しない。

firmwareをインストール後、192.168.1.1に固定されるので、http://192.168.1.1にアクセスする。初期ID&PASSはDD-WRTの標準であり、id:root, pass:adminである。まず、Setupタブの中のIPアドレスを設定する。これがLAN側のIPアドレスになる。そしてDHCPサーバを切る。次にセキュリティタブのSPI Firewallを切る。これを切らんとアドホックの無線LANアクセスができなかった。次にWirelessの設定でWireless ModeをAdhocに変更。Advanced Settingsで再送回数を増減して遊んでも良い。最後にAdministratorでReset ButtonとJFFS2 Supportを有効。telnetdのみでは気持ち悪ければ、Servicesでsshdを起動。

この時点で/jffsが出来ているはず。/optから/jffsにetcとusrをコピーする。etcの中には.sesbutton。usrの中には.sesbuttonから起動するpreaodv.shが入っている。preaodv.shにてAOSSランプの点灯とインターフェースのIPアドレス設定、aodvdの起動を行う。

以上の設定が正しく行われていれば、”電源を切った状態のアクセスポイント”に電源を入れ、DIAGランプが消灯するのをしばらく待ち、ころあいを見てAOSSボタンを押せばAOSSランプが点灯し、aodvdが起動したことが確認できるはずである。もしaodvdにてルーティングされないようであれば、アドホックモード上でpingが帰ってくるかどうかを確認する。aodvdが起動していないアドホックモード上でpingが通らなければ、aodvd起動後にもpingは、通らない。

AOSSボタンを3秒以上、長押しすると、ファームウェアがリストアされ、IPアドレスが192.168.1.1に、essidがdd-wrtに戻る。最悪、復元不能な状態に陥った場合には長押しすること。

  1. お見事。お疲れ様。LDCの設計が全然できないからって、Adobe Apolloで遊んでしまっっているオレとは大違い!

  2. 趣味、無線LANなんで、遊び兼研究なのですよ。

    …もうそろそろ無線LANタワーの中身を活用できるんで、楽しみですな。

Leave a Comment


NOTE - You can use these HTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>