BlackBerry Bold:MacOSでなかなかモデム通信がうまくいかない原因解決!オープンソース万歳!
BlackBerryネタばかりですが、本当にBlackBerryがこの1週間頭の中を占領してました。プログラマー・ネットワークエンジニアとしてこのあたりがうまくいかないというのは本当に気になってしまうもので。
BlackBerry本体が故障で交換となってから、一度はうまくいったMacOSでmopera Uにモデム接続するのが、なぜかまた不調になり、ずっと解析してました。
Thu Feb 26 03:00:55 2009 : rcvd [IPCP ConfNak id=0xf
Thu Feb 26 03:00:55 2009 : IPCP: Maximum Config-Requests exceeded
Thu Feb 26 03:00:55 2009 : sent [LCP TermReq id=0x3 "No network protocols running"]
Thu Feb 26 03:00:55 2009 : rcvd [LCP TermAck id=0x3]
Thu Feb 26 03:00:55 2009 : Connection terminated.
ログではこんな感じに、IPCPのConfigRequestのリトライでタイムアウト、という感じで、pppdはipcp-max-configureというパラメータでリトライ回数が変更できるのに、どう設定してもid=0xfつまり15回でタイムアウトになります。
P902iでは15回もリトライしないうちにアドレスが割り当てられてIPCPが確立できるのですが、BlackBerryだともっと時間が必要なようです。Windowsでも、
モデムの初期化中は DSR は低い状態です。モデムがオンになっているか確認してください。
このログがかなり繰り返されます。
GUIから設定する方法ですと、細かいオプションの指定が本当に効いているのかがわかりにくいので、直接pppdコマンドで実験したりしましたが、それでも同じ現象になります。
こうなったらpppdのソースを見るしかない、と思って、本家からソースをダウンロードしてみたところ、「Maximum Config-Requests exceeded」この文字列がどこにもないのです。ipcp-max-configureで変更できる値でタイムアウトした場合は、「timeout sending Config-Requests」こんなメッセージが出るはずです。
pppdのREADMEを見ると、コピーライトはフリーだが一部BSDライセンスやGPLがあると書いてあるので、これはMacOS版も公開されているはずだ、と思って探したらAppleが公開しているソースが見つかり、それをダウンロードして、まずはビルドしてみるかと思ったら、結構大変そうです。仕方ないのでソースを改めて見ていたら、なんと!__APPLE__の条件コンパイルで、「Maximum Config-Requests exceeded」このメッセージが出る処理が加えられていました。その値を実行時に設定できるのかと思って調べると、これは固定のようです。fsm.hに、
#define DEFMAXREQLOOPS 15 /* Maximum number of req loops for convergence */
こんな感じに15に定義されていて、これを上書きするパラメータはありません。
これはビルド環境を作るしかないかなぁ、と思ったのですが、とりあえずバイナリエディタで無理矢理書き換えて試してみるか、と、pppdをHexEditorで開き、0f000000を探して順番に書き換えて実行してみました。すると、先頭から0xa891番地の0xf を0xffに変更すると15回以上リトライしてくれました!これで無事にBlackBerryでMacOSでもモデム接続ができます。
pppdコマンドを直接実行しても、GUIから実行してもうまくいくようになりました。
なお、上記の書き換え場所のオフセットは、この先のバージョンアップで変わる可能性があります。私が試したのは、pppd version 2.4.2で、ファイルサイズは535472バイトです。
なんで15回に制限したのでしょうねぇ。P902iだと12回くらいで接続成功するのですが、P902iはIP接続できない(たしか)ので、mopera UでもPPP接続です。IP接続は最初のネゴシエーションあたりが遅いのですかねぇ。。
なお、モデムスクリプトは、標準のNTT DoCoMo P/FxxxiX(Bluetooth)でも大丈夫ですが、あらかじめAPNを設定しておくのが面倒であれば、
http://perishablepress.com/press/2007/06/12/blackberry-curve-as-bluetooth-modem-for-mac/
ここにあるスクリプトを使うと便利です。
まあ、それでもBlackBerryでBluetooth接続し、モデム通信を行う場合、タイミングによってはpppdがハングアップし、リブートしないと殺せなくなります。起動後、一度Bluetoothの設定でシリアル通信の状態を確認してBluetooth接続を行った後にモデム接続をすればほぼ問題ありません。
mopera Uでの接続はパケット代が上限なしなので、あまり使いすぎるとお金がかかりすぎます。それでも外出先でどうしても会社からソースを取りたい場合などには便利なのです。今週実際に客先で使えずに困りました。これでようやくP902iからBlackBerryに完全に乗り換えられます。丸1週間かかりました。。
問題は解決できたみたいなので、これからはBlackBerryの良いところをどんどん紹介したいと思います。気に入っている点が多いから、ここまでこだわって試行錯誤しました。
今回、改めてオープンソースのありがたみを感じました。pppdのソースがなければ解析はかなり難しかったと思います。メーカーや事業者がきちんとサポートしてくれればもちろん良いのですが、MacOSはサポート対象外、というものも多く、仕組みとしては使えるはずなのに、情報が開示されていないから手が出せない、ということは多いものです。サポートに要望を出しても大抵は放置されますので、ソースが公開されているメリットは大きいです。さらにOSごとオープンなLinuxやBSDに人気がでたり、ボランティアの開発者が集まるのも理解できますね。
この1週間、家族からも機嫌が悪い、と言われてましたが、これで少しは精神的にも落ち着けそうです。。