プログラミングでメシが食えるか!?

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週間、家族からも機嫌が悪い、と言われてましたが、これで少しは精神的にも落ち着けそうです。。

Comment(10)

コメント

最近pppdが更新されたかも知れません。久々につなげたら駄目になったので。。
私の環境では、0xa880の0xfを0xffに書き換えればOKでした。

深見

BlackBerry Bold 9000(4.0.6.306)をMacBook Pro (OS X 10.6.3)のBluetoothモデムにしてmopera Uに接続したくて何度もやってみてたのですが,ダメで,検索してここにたどり着きました.HexEditorでどのファイルを開いて書き換えればよいのでしょうか.OS Xのことが何もわからない初心者ですが,教えてください.

深見さま
すでにBlackBerryは解約してしまい、実験ができないので、今のpppdのどこを書き換えればいいのかは試せません。。
書き換えるのは、/usr/sbin/pppdで、上記の方法で書き換える場所を試行錯誤してみてください。

深見

小俣様,早速ありがとうございます.Mac OS X 10.6.3で,/usr/sbin/pppdというディレクトリーを見つけることが出来ず,立ち往生しております.もしかしてpppdというのは,Mac OS Xの方ではなく,BlackBerryの方のシステム・ファイルなのでしょうか?

深見さま
MacOS側です。ディレクトリーではなく、ファイルです。実行ファイルです。
ターミナルで、
which pppd
とやってみて、それでもなければ、
find /usr -name pppd
find /sbin -name pppd
find /bin -name pppd
という感じで探してみてください。

深見

何度もスミマセン.不可視ファイルなのですね.「移動」メニュー→「フォルダへ移動…」→「/usr/sbin」と入力 で,pppdにたどり着くことが出来ました.HexEditorで「char:0xf」を探したところ,アドレス:0xa8d6にありました.この0xfを0xffに書き換えて「保存」しようとしたのですが,「書類“pppd”を保存できませんでした。」と出てきて先に進めません.ご教授お願い申し上げます.ちなみにpppdのコピーをデスクトップに作って,それをいじってます.

深見さん
パーミッションの問題ではないでしょうか?
chmod oug+rw pppd
とターミナルで行うなどして、書き込み可能にしてやってみてください。
私はターミナルばかり使うので、GUIは良く知りませんもので・・・。

深見

いろいろとありがとうございます.「chmod oug+rw /usr/sbin/pppd」でパーミッション変更してみましたが,やはり保存が出来ませんでした.GUIで「Get Info(Command+I)」してアクセス権変更してみたり,ディスクユーティリティでアクセス権の修復をしてから再度「chmod oug+rw /usr/sbin/pppd」したり,root権限でログオンして,それらのことをやってみたりしましたが,どうしてもHexEditorでpppdの変更の保存が出来ません.

深見さん
とりあえず、別名で保存して、cpコマンドでコピーしてみてはどうでしょう?

深見

HexEditorではなくHexEditでやって保存が出来ました.が,接続が出来ていません.うーん,BBB&Macの取り合わせは奥が深いですね.残念ですが諦めます.ご教授ありがとうございました.

コメントを投稿する