FreeBSD7.0でemobile(D02HW)を使う


USB接続のemobileがFreeBSD7.0で動いたので動作報告です。新しく買ったノートPCはFreeBSDを使っていて、クライアントとして使うOSのカーネルまで弄る趣味は無いけど、流石にモバイルでemobileが使えないのは致命的過ぎるので頑張ってみました。
このデバイス、USBメモリとUSBモデムが同居していて、普通に繋げると10MBのUSBメモリとして認識されます。その中にドライバが入っていて、windowsだと自動的に展開されてモデムが起動する仕組みなわけです。
emobileには普通にPPPで繋がれば良いのでFreeBSDでも使えるはずなんだけど、USBで繋げるとUSBメモリ(umass)としか認識されないので、細工をしてモデムとして認識されるようにします。

カーネルソースにパッチ当て

こいつ(D02HW)は韓国かどこかの製品のOEMらしく世界中で使われているので、既に誰かがパッチを書いてたりします。
MavEtJu's Distorted View of the World
↑を参考にusb/118686: [usbdevs] [patch] teach usbdevs / ubsa(4) about Huawei E220 G3 Modemの一番新しいパッチをカーネルソースに当てます。パッチは6.2のものなので7.0のFreeBSDにはpatchコマンドで簡単に当たらないので「/usr/src/sys/dev/usb」以下のソースに手動で埋め込んでいきます。行が違うくらいでソース自体はそのまま張り付けました。

カーネルコンパイル

カーネルコンフィグでumassを無効にします。

 > cp /sys/i386/conf/GENERIC /sys/i386/conf/NEW
 > vi /sys/i386/conf/NEW
  #device         umass ←#でコメントアウト
 > config /sys/i386/conf/NEW
 > cd /sys/i386/compile/NEW
 > make clean depend; make depend; make all install;

/boot/loader.confに2行追加します。

 ubsa_load="YES"
 umass_load="YES"

これで再起動。/dev/cuaU0 が見えていたら成功です。

ppp.confの編集

pppの設定ファイルは「/etc/ppp/ppp.conf」です。下のように作成しました。

default:
 set log Phase Chat Connect LCP IPCP CCP tun command
 ident user-ppp VERSION (built COMPILATIONDATE)

 # Ensure that "device" references the correct serial port
 # for your modem. (cuad0 = COM1, cuad1 = COM2)
 #
 set device /dev/cuaU0

 set speed 115200
 set dial "ABORT BUSY ABORT NO\\sCARRIER TIMEOUT 5 \
           \"\" AT OK-AT-OK ATE1Q0 OK \\dATDT\\T TIMEOUT 40 CONNECT"
 set timeout 0                  # 3 minute idle timer (the default)
 enable dns                             # request DNS info (for resolv.conf)

d02hw:
 #
 # edit the next three lines and replace the items in caps with
 # the values which have been assigned by your ISP.
 #

 set phone "*99***1#"
 set authname "em"
 set authkey "em"

 set ifaddr 10.0.0.1/0 10.0.0.2/0 255.255.255.0 0.0.0.0
 delete ALL
 add default HISADDR
 enable dns

接続

rootで「/usr/sbin/ppp -background d02hw」を実行して接続出来ました。オプションの-backgroundを外すと対話モードで起動するので、デバッグなど出来ると思います。
切断は「kill -TERM `cat /var/run/tun0.pid`」で行ってます。接続時に自動的にゲートウェイとDNSが切り替わるんだけど、切断後そのままになってしまうので、startppp.shとstopppp.shを作って切断時に元に戻すようにしました。

 startppp.sh
#!/bin/sh
/usr/sbin/ppp -background d02hw
 stopppp.sh
#!/bin/sh
kill -TERM `cat /var/run/tun0.pid`
sh -c 'echo "nameserver 192.168.24.10" > /etc/resolv.conf'
route add default 192.168.24.10

その他

このままじゃ遅いってどこかで見たけど、上の作業だけで400Kbpsくらい出てます。うーん、遅いのだろうか。