|
カテゴリ:L01E
IS11LGで USBガジェットとして、ECM (ACM-CDC-Ethernet)ドライバをカーネルに実装して
逆テザリングで通信できるようになったので、同様にL-01Eでもルートなしで逆テザリングを してみようという話です。この方法はLGのスマホなら大抵可能だと思います。 まず、USBの接続方法ですが、 設定⇒PC接続にある「LGソフトウェア」を改変し、選択することで行います。 「LGソフトウェア」の本来の機能は無視します。 「LGソフトウェア」の選択ですが、ルート直下のinit.lge.usb.rcに記述されている以下の記述がトリガーになり、その中に記載されている処理が動きます。 on property:sys.usb.config=pc_suite stop adbd write /sys/class/android_usb/android0/enable 0 write /sys/class/android_usb/android0/idVendor 1004 write /sys/class/android_usb/android0/idProduct 631B write /sys/class/android_usb/android0/bDeviceClass 239 write /sys/class/android_usb/android0/bDeviceSubClass 2 write /sys/class/android_usb/android0/bDeviceProtocol 1 write /sys/class/android_usb/android0/f_acm/acm_transports hsic write /sys/class/android_usb/android0/f_diag/clients diag,diag_mdm write /sys/class/android_usb/android0/functions acm,diag,mtp write /sys/class/android_usb/android0/enable 1 setprop sys.usb.state ${sys.usb.config} on property:sys.usb.config=pc_suite,adb write /sys/class/android_usb/android0/enable 0 write /sys/class/android_usb/android0/idVendor 1004 write /sys/class/android_usb/android0/idProduct 631B write /sys/class/android_usb/android0/bDeviceClass 239 write /sys/class/android_usb/android0/bDeviceSubClass 2 write /sys/class/android_usb/android0/bDeviceProtocol 1 write /sys/class/android_usb/android0/f_acm/acm_transports hsic write /sys/class/android_usb/android0/f_diag/clients diag,diag_mdm write /sys/class/android_usb/android0/functions acm,diag,mtp,adb write /sys/class/android_usb/android0/enable 1 start adbd setprop sys.usb.state ${sys.usb.config} つまりsetpropでsys.usb.configをpc_suiteにセットするとこの記述の箇所がイベントルーチンになって、カーネルの特定のファイルへ書き込んでスマホのUSB接続が切り替えるようになっています。 ちなみに、普通のスマホでは、以下のようにsys.usb.config の値とfunctionに書き込むパラメータが同じケースが多いんですが、sys.usb.stateの値とfunctionの値が違うケースもあります。 on property:sys.usb.config=mass_storage,adb ・・・ write /sys/class/android_usb/android0/functions mass_storage,adb ・・・ setprop sys.usb.state ${sys.usb.config} また、USBテザリングの際には、プロパティsys.usb.config の値は、LGスマホの場合は、ecmになっています。 on property:sys.usb.config=ecm LG以外のスマホだと on property:sys.usb.config=rndis と記述されていることが多いです。 ecmとは、CDC-ECM のことで、USB CDC ECM(Ethernet Networking Control Model)のことを指します。USBで擬似インサーネットを作るということです。rndisも同じです。 テザリングの時にも、USB擬似インサーネットの機能がカーネル側およびPC側のドライバも選択されてロードされるんですが、テザリングの際には、スマホ側でDHCPサーバが起動してIPアドレスを自動でリリースしたりしています。それだと逆テザリングにならないので、只のUSBインサーネットモードにして、PCのルーティングを使ってネットワークを共有してしまおうという考えです。 上記だけの修正では、インサーネットデバイス(この場合は、usb0)はネットワークとしてUPしていないし、IPアドレスも割り当ててられていないのでこのプロパティが呼ばれたら、ついでにシェルも実行してデバイスをUPしIPアドレスを割り当てます。 これが以下の記述です。 ① init.lge.usb.rc を修正(on property:sys.usb.config=pc_suiteとpc_suite,adbを書き換え) # ecm (usb-ethernet) on property:sys.usb.config=pc_suite stop adbd write /sys/class/android_usb/android0/enable 0 write /sys/class/android_usb/android0/idVendor 1004 write /sys/class/android_usb/android0/idProduct 6312 write /sys/class/android_usb/android0/bDeviceClass EF write /sys/class/android_usb/android0/bDeviceSubClass 02 write /sys/class/android_usb/android0/bDeviceProtocol 01 write /sys/class/android_usb/android0/functions ecm write /sys/class/android_usb/android0/enable 1 setprop sys.usb.state ${sys.usb.config} setprop persist.usb.ethernet.enable 1 on property:sys.usb.config=pc_suite,adb write /sys/class/android_usb/android0/enable 0 write /sys/class/android_usb/android0/idVendor 1004 write /sys/class/android_usb/android0/idProduct 6312 write /sys/class/android_usb/android0/bDeviceClass EF write /sys/class/android_usb/android0/bDeviceSubClass 02 write /sys/class/android_usb/android0/bDeviceProtocol 01 write /sys/class/android_usb/android0/functions ecm,adb write /sys/class/android_usb/android0/enable 1 start adbd setprop sys.usb.state ${sys.usb.config} setprop persist.usb.ethernet.enable 1 ② init.lge.usb.rc に追加(IPアドレスの割り当て) # cdc ethernet (ethernet over usb) service wakeup_eth0 /system/bin/sh /system/etc/wakeup_eth0.sh user root disabled oneshot on property:persist.usb.ethernet.enable=1 start wakeup_eth0 on property:persist.usb.ethernet.enable=0 stop wakeup_eth0 ② /system/etc/wakeup_eth0.sh を作成 #!/system/bin/sh # mobile data off svc data disable ip link set usb0 up ip addr add 192.168.137.7/24 broadcast 192.168.137.255 dev usb0 ip route add 192.168.137.1 dev usb0 ip route add default via 192.168.137.1 dev usb0 setprop net.dns1 8.8.8.8 IPアドレスは、192.168.137.X に割り当てます(上記では192.168.137.7)。 これはWindows7のネットワーク共有機能を用いるためです。Windows7のネットワーク共有では、 Windows7側のIPアドレスが192.168.137.1に固定されるためそれと同一のネットワークセグメントのIPアドレスを割り当てます。 最後の行のDNS(net.dns1)の書き換えですが、DNSサーバとしてGoogleのDNSサーバ 8.8.8.8 を 指定します。なお、モバイル通信が生きている状態だとモバイル通信側のプロセスでこのDNS(net.dns1)をキャリアのDNSサーバへ上書きしてしまいます。そのため、最初にモバイル通信をOFFにして (svc data disable)書き換えたDNSが他のプロセスで変更されないようにしています。 以上で修正は終わり。スマホへboot.imgの書き換えが済んだ後の使い方ですが、 ①PC接続を「LGソフトウェア」に変更する モバイル通信がOFFになったことを確認する ②スマホをPCにUSB接続する。 デバイスマネージャでみるとこんな感じでLGEのネットワークドライバが生成されます。 ③PC側の他のネットワークのプロパティでネットワークの共有設定を行う 共有のホームネットワーク接続にUSBネットワークの「ローカルエリア接続XX」を選択。 こんな作業のやり方で通信が可能になります。 なお、解除は実装していないので使用後はPC接続設定を「充電のみ」などに切り替えて再起動してください。 注)アプリによっては「ネットワークが繋がっていません」というメッセージで動かないものがあります。これはアプリの中でConnectityManagerを呼んでおり接続中のネットワークがWIFIなのかMobile(3G/LTE)なのか判断しているのが原因です。 GooglePlayやYoutubeなどはConnectityManagerを呼んでいるのでこの方法だけでは使えません。 なお、こういうアプリも使えるようにするには、XposedInstallerを入れてFakeWifiConnectionなどのモジュールで回避する方法があります(要ルート) 参考1) L01EのROMバージョンL01E20D00用に作ったCWMからのupdate.zipを作ってみたので参考にしてください。(L01Eは、boot.img書き換えにloki_flashツールを使います。ちょっと特殊なスマホです) 参考2)ramdiskのファイル修正後からupdate.zipを作るスクリプト echo "repack ramdisk" cd boot repack_ramdisk ./ramdisk ./boot.img-ramdisk.cpio.gz echo "repack boot.img" mkbootimg \ --kernel ./boot.img-kernel \ --ramdisk ./boot.img-ramdisk.cpio.gz \ --cmdline 'vmalloc=600M console=ttyHSL0,115200,n8 lpj=67677 user_debug=31 msm_rtb.filter=0x0 ehci-hcd.park=3 coresight-etm.boot_enable=0 androidboot.hardware=geehdc' \ --base 0x80200000 \ --ramdisk_offset 0x02000000 \ --pagesize 2048 \ -o ../boot.img echo "repack update.zip" cd .. zip -r ../jb-boot-mod.zip META-INF boot.img system echo "done" boot.imgの再構築と書き換えが必要ですので、難しい方は、xda にある Android Reverse Tethering 3.19(要ルート)を使った方がいいかも お気に入りの記事を「いいね!」で応援しよう
最終更新日
2017年02月15日 08時26分29秒
コメント(0) | コメントを書く
[L01E] カテゴリの最新記事
|