1*90c8c64dSAndroid Build Coastguard Worker#!/bin/bash 2*90c8c64dSAndroid Build Coastguard Worker# Copyright 2010 Google Inc. 3*90c8c64dSAndroid Build Coastguard Worker# All right reserved. 4*90c8c64dSAndroid Build Coastguard Worker# Author: Szymon Jakubczak <[email protected]> 5*90c8c64dSAndroid Build Coastguard Worker# 6*90c8c64dSAndroid Build Coastguard Worker# Configure the host and the Android phone for "reverse tethering". 7*90c8c64dSAndroid Build Coastguard Worker# (Route all network traffic via the host.) 8*90c8c64dSAndroid Build Coastguard Worker 9*90c8c64dSAndroid Build Coastguard Worker# default values 10*90c8c64dSAndroid Build Coastguard Worker: ${BRIDGE:=usbeth} 11*90c8c64dSAndroid Build Coastguard Worker: ${LAN_DEV:=eth0} # LAN uplink on the host 12*90c8c64dSAndroid Build Coastguard Worker: ${HOST_DEV:=usb0} # name of the RNDIS interface on the host 13*90c8c64dSAndroid Build Coastguard Worker: ${PHONE_DEV:=rndis0} # name of the RNDIS interface on the phone 14*90c8c64dSAndroid Build Coastguard Worker 15*90c8c64dSAndroid Build Coastguard Worker: ${PHONE_IP:=192.168.77.2} # for NAT and tests 16*90c8c64dSAndroid Build Coastguard Worker: ${HOST_IP:=192.168.77.1} 17*90c8c64dSAndroid Build Coastguard Worker: ${NETMASK:=255.255.255.0} 18*90c8c64dSAndroid Build Coastguard Worker 19*90c8c64dSAndroid Build Coastguard Worker# location of the hwaddr utility 20*90c8c64dSAndroid Build Coastguard Worker: ${HWADDR:=/home/build/nonconf/google3/experimental/users/szym/moblat/hwaddr/hwaddr-armeabi} 21*90c8c64dSAndroid Build Coastguard Worker: ${PHONE_HW:=""} # hardware (Ethernet) address for the interface (bridge only) 22*90c8c64dSAndroid Build Coastguard Worker 23*90c8c64dSAndroid Build Coastguard Worker# for NAT configuration 24*90c8c64dSAndroid Build Coastguard Worker: ${DNS1:=8.8.8.8} 25*90c8c64dSAndroid Build Coastguard Worker: ${DNS2:=8.8.4.4} 26*90c8c64dSAndroid Build Coastguard Worker 27*90c8c64dSAndroid Build Coastguard Worker# export ADB=/path/to/sdk/adb for custom adb 28*90c8c64dSAndroid Build Coastguard WorkerADB="${ADB:-adb} ${SERIAL:+-s $SERIAL}" 29*90c8c64dSAndroid Build Coastguard Worker 30*90c8c64dSAndroid Build Coastguard Workerset -e 31*90c8c64dSAndroid Build Coastguard Workertrap error ERR 32*90c8c64dSAndroid Build Coastguard Worker 33*90c8c64dSAndroid Build Coastguard Workererror() { 34*90c8c64dSAndroid Build Coastguard Worker echo >&2 "Error occured: $?" 35*90c8c64dSAndroid Build Coastguard Worker} 36*90c8c64dSAndroid Build Coastguard Worker 37*90c8c64dSAndroid Build Coastguard Workerusage() { 38*90c8c64dSAndroid Build Coastguard Worker echo "Usage: $0 <command>" 39*90c8c64dSAndroid Build Coastguard Worker echo " rndis -- start RNDIS and test ping the phone" 40*90c8c64dSAndroid Build Coastguard Worker echo " nat -- use host as NAT" 41*90c8c64dSAndroid Build Coastguard Worker echo " nat+secure -- nat + extra security" 42*90c8c64dSAndroid Build Coastguard Worker echo " bridge -- use host as bridge" 43*90c8c64dSAndroid Build Coastguard Worker echo " stop -- switch back to 3G" 44*90c8c64dSAndroid Build Coastguard Worker echo " stop-all -- clean up everything" 45*90c8c64dSAndroid Build Coastguard Worker echo 46*90c8c64dSAndroid Build Coastguard Worker echo "Advanced Commands" 47*90c8c64dSAndroid Build Coastguard Worker echo " Host:" 48*90c8c64dSAndroid Build Coastguard Worker echo " nat_start " 49*90c8c64dSAndroid Build Coastguard Worker echo " nat_secure " 50*90c8c64dSAndroid Build Coastguard Worker echo " nat_stop " 51*90c8c64dSAndroid Build Coastguard Worker echo " bridge_start " 52*90c8c64dSAndroid Build Coastguard Worker echo " bridge_add " 53*90c8c64dSAndroid Build Coastguard Worker echo " bridge_stop " 54*90c8c64dSAndroid Build Coastguard Worker echo " Phone:" 55*90c8c64dSAndroid Build Coastguard Worker echo " rndis_start " 56*90c8c64dSAndroid Build Coastguard Worker echo " rndis_stop " 57*90c8c64dSAndroid Build Coastguard Worker echo " rndis_test " 58*90c8c64dSAndroid Build Coastguard Worker echo " route_nat " 59*90c8c64dSAndroid Build Coastguard Worker echo " route_bridge " 60*90c8c64dSAndroid Build Coastguard Worker echo " route_reset " 61*90c8c64dSAndroid Build Coastguard Worker echo 62*90c8c64dSAndroid Build Coastguard Worker echo "Options and Environment Variables:" 63*90c8c64dSAndroid Build Coastguard Worker echo " -h|--help" 64*90c8c64dSAndroid Build Coastguard Worker echo " -b bridge_name BRIDGE=$BRIDGE" 65*90c8c64dSAndroid Build Coastguard Worker echo " -s serial_number SERIAL=$SERIAL" 66*90c8c64dSAndroid Build Coastguard Worker echo " -u host_usb_device HOST_DEV=$HOST_DEV" 67*90c8c64dSAndroid Build Coastguard Worker echo " -l host_lan_device LAN_DEV=$LAN_DEV" 68*90c8c64dSAndroid Build Coastguard Worker echo " -d dns1 dns2 DNS1=$DNS1" 69*90c8c64dSAndroid Build Coastguard Worker echo " DNS2=$DNS2" 70*90c8c64dSAndroid Build Coastguard Worker echo " -p phone_ip PHONE_IP=$PHONE_IP" 71*90c8c64dSAndroid Build Coastguard Worker echo " -a host_ip HOST_IP=$HOST_IP" 72*90c8c64dSAndroid Build Coastguard Worker echo " -m netmask NETMASK=$NETMASK" 73*90c8c64dSAndroid Build Coastguard Worker echo " -e hardware_addr PHONE_HW=$PHONE_HW" 74*90c8c64dSAndroid Build Coastguard Worker echo 75*90c8c64dSAndroid Build Coastguard Worker echo " HWADDR=$HWADDR" 76*90c8c64dSAndroid Build Coastguard Worker echo " ADB=$ADB" 77*90c8c64dSAndroid Build Coastguard Worker} 78*90c8c64dSAndroid Build Coastguard Worker 79*90c8c64dSAndroid Build Coastguard Worker################################## 80*90c8c64dSAndroid Build Coastguard Worker### PHONE configuration routines 81*90c8c64dSAndroid Build Coastguard Worker################################## 82*90c8c64dSAndroid Build Coastguard Workerrndis_start() { 83*90c8c64dSAndroid Build Coastguard Worker echo "Starting RNDIS..." 84*90c8c64dSAndroid Build Coastguard Worker $ADB wait-for-device 85*90c8c64dSAndroid Build Coastguard Worker $ADB shell "svc usb setFunction rndis" 86*90c8c64dSAndroid Build Coastguard Worker $ADB wait-for-device 87*90c8c64dSAndroid Build Coastguard Worker $ADB shell "ifconfig $PHONE_DEV down" 88*90c8c64dSAndroid Build Coastguard Worker if [[ -n "$PHONE_HW" ]]; then 89*90c8c64dSAndroid Build Coastguard Worker $ADB push $HWADDR /data/local/hwaddr # TODO(szym) handle failures? 90*90c8c64dSAndroid Build Coastguard Worker $ADB shell "/data/local/hwaddr $PHONE_DEV $PHONE_HW" 91*90c8c64dSAndroid Build Coastguard Worker $ADB shell "/data/local/hwaddr $PHONE_DEV" 92*90c8c64dSAndroid Build Coastguard Worker fi 93*90c8c64dSAndroid Build Coastguard Worker} 94*90c8c64dSAndroid Build Coastguard Worker 95*90c8c64dSAndroid Build Coastguard Workerrndis_stop() { 96*90c8c64dSAndroid Build Coastguard Worker $ADB shell "svc usb setFunction" #empty to clear 97*90c8c64dSAndroid Build Coastguard Worker} 98*90c8c64dSAndroid Build Coastguard Worker 99*90c8c64dSAndroid Build Coastguard Workerrndis_test() { 100*90c8c64dSAndroid Build Coastguard Worker # configure some IPs, so that we can ping 101*90c8c64dSAndroid Build Coastguard Worker $ADB shell "ifconfig $PHONE_DEV $PHONE_IP netmask $NETMASK up" 102*90c8c64dSAndroid Build Coastguard Worker sudo ifconfig $HOST_DEV $HOST_IP netmask $NETMASK up 103*90c8c64dSAndroid Build Coastguard Worker echo "Pinging the phone..." 104*90c8c64dSAndroid Build Coastguard Worker ping -q -c 1 -W 1 $PHONE_IP 105*90c8c64dSAndroid Build Coastguard Worker echo "Success!" 106*90c8c64dSAndroid Build Coastguard Worker} 107*90c8c64dSAndroid Build Coastguard Worker 108*90c8c64dSAndroid Build Coastguard Workerupdate_dns() { 109*90c8c64dSAndroid Build Coastguard Worker $ADB shell 'setprop net.dnschange $((`getprop net.dnschange`+1))' 110*90c8c64dSAndroid Build Coastguard Worker} 111*90c8c64dSAndroid Build Coastguard Worker 112*90c8c64dSAndroid Build Coastguard Workerdefault_routes() { 113*90c8c64dSAndroid Build Coastguard Worker $ADB shell 'cat /proc/net/route' | awk '{ if ($2==00000000) print $1 }' 114*90c8c64dSAndroid Build Coastguard Worker} 115*90c8c64dSAndroid Build Coastguard Worker 116*90c8c64dSAndroid Build Coastguard Workerroute_none() { 117*90c8c64dSAndroid Build Coastguard Worker $ADB shell "svc data disable" 118*90c8c64dSAndroid Build Coastguard Worker $ADB shell "svc wifi disable" 119*90c8c64dSAndroid Build Coastguard Worker # kill all default route interfaces (just in case something remains) 120*90c8c64dSAndroid Build Coastguard Worker for dev in `default_routes`; do 121*90c8c64dSAndroid Build Coastguard Worker $ADB shell "ifconfig $dev down" 122*90c8c64dSAndroid Build Coastguard Worker done 123*90c8c64dSAndroid Build Coastguard Worker} 124*90c8c64dSAndroid Build Coastguard Workerroute_nat() { 125*90c8c64dSAndroid Build Coastguard Worker echo "Setting up phone routes and DNS..." 126*90c8c64dSAndroid Build Coastguard Worker route_none 127*90c8c64dSAndroid Build Coastguard Worker $ADB shell "ifconfig $PHONE_DEV $PHONE_IP netmask $NETMASK up" 128*90c8c64dSAndroid Build Coastguard Worker $ADB shell "route add default gw $HOST_IP dev $PHONE_DEV" 129*90c8c64dSAndroid Build Coastguard Worker $ADB shell "setprop net.dns1 $DNS1" 130*90c8c64dSAndroid Build Coastguard Worker $ADB shell "setprop net.dns2 $DNS2" 131*90c8c64dSAndroid Build Coastguard Worker update_dns 132*90c8c64dSAndroid Build Coastguard Worker} 133*90c8c64dSAndroid Build Coastguard Workerroute_bridge() { 134*90c8c64dSAndroid Build Coastguard Worker echo "Running DHCP on the phone..." 135*90c8c64dSAndroid Build Coastguard Worker route_none 136*90c8c64dSAndroid Build Coastguard Worker $ADB shell "ifconfig $PHONE_DEV up" 137*90c8c64dSAndroid Build Coastguard Worker $ADB shell "netcfg $PHONE_DEV dhcp" 138*90c8c64dSAndroid Build Coastguard Worker $ADB shell "ifconfig $PHONE_DEV" # for diagnostics 139*90c8c64dSAndroid Build Coastguard Worker 140*90c8c64dSAndroid Build Coastguard Worker DNS1=`$ADB shell getprop net.${PHONE_DEV}.dns1` 141*90c8c64dSAndroid Build Coastguard Worker $ADB shell "setprop net.dns1 $DNS1" 142*90c8c64dSAndroid Build Coastguard Worker DNS2=`$ADB shell getprop net.${PHONE_DEV}.dns2` 143*90c8c64dSAndroid Build Coastguard Worker $ADB shell "setprop net.dns2 $DNS2" 144*90c8c64dSAndroid Build Coastguard Worker update_dns 145*90c8c64dSAndroid Build Coastguard Worker} 146*90c8c64dSAndroid Build Coastguard Workerroute_reset() { 147*90c8c64dSAndroid Build Coastguard Worker route_none 148*90c8c64dSAndroid Build Coastguard Worker $ADB shell "svc data enable" 149*90c8c64dSAndroid Build Coastguard Worker} 150*90c8c64dSAndroid Build Coastguard Worker 151*90c8c64dSAndroid Build Coastguard Worker################################# 152*90c8c64dSAndroid Build Coastguard Worker### HOST configuration routines 153*90c8c64dSAndroid Build Coastguard Worker################################# 154*90c8c64dSAndroid Build Coastguard Workernat_start() { 155*90c8c64dSAndroid Build Coastguard Worker echo "Configuring NAT..." 156*90c8c64dSAndroid Build Coastguard Worker sudo sysctl -w net.ipv4.ip_forward=1 157*90c8c64dSAndroid Build Coastguard Worker sudo iptables -F 158*90c8c64dSAndroid Build Coastguard Worker sudo iptables -t nat -F 159*90c8c64dSAndroid Build Coastguard Worker sudo iptables -t nat -A POSTROUTING -o $LAN_DEV -j MASQUERADE 160*90c8c64dSAndroid Build Coastguard Worker sudo iptables -P FORWARD ACCEPT 161*90c8c64dSAndroid Build Coastguard Worker sudo ifconfig $HOST_DEV $HOST_IP netmask $NETMASK up 162*90c8c64dSAndroid Build Coastguard Worker} 163*90c8c64dSAndroid Build Coastguard Workernat_secure() { 164*90c8c64dSAndroid Build Coastguard Worker echo "Making your NAT secure..." 165*90c8c64dSAndroid Build Coastguard Worker sudo iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT 166*90c8c64dSAndroid Build Coastguard Worker sudo iptables -A FORWARD -m state --state NEW -i $HOST_DEV -j ACCEPT 167*90c8c64dSAndroid Build Coastguard Worker sudo iptables -P FORWARD DROP 168*90c8c64dSAndroid Build Coastguard Worker sudo ifconfig usb0 $HOST_IP netmask $NETMASK up 169*90c8c64dSAndroid Build Coastguard Worker} 170*90c8c64dSAndroid Build Coastguard Workernat_stop() { 171*90c8c64dSAndroid Build Coastguard Worker sudo sysctl -w net.ipv4.ip_forward=0 172*90c8c64dSAndroid Build Coastguard Worker sudo iptables -F 173*90c8c64dSAndroid Build Coastguard Worker sudo iptables -t nat -F 174*90c8c64dSAndroid Build Coastguard Worker} 175*90c8c64dSAndroid Build Coastguard Worker 176*90c8c64dSAndroid Build Coastguard Workerbridge_start() { 177*90c8c64dSAndroid Build Coastguard Worker echo "Configuring bridge..." 178*90c8c64dSAndroid Build Coastguard Worker sudo brctl addbr $BRIDGE || return 0 # all good 179*90c8c64dSAndroid Build Coastguard Worker sudo brctl setfd $BRIDGE 0 180*90c8c64dSAndroid Build Coastguard Worker sudo ifconfig $LAN_DEV 0.0.0.0 181*90c8c64dSAndroid Build Coastguard Worker sudo brctl addif $BRIDGE $LAN_DEV 182*90c8c64dSAndroid Build Coastguard Worker sudo dhclient $BRIDGE || { 183*90c8c64dSAndroid Build Coastguard Worker echo "DHCP failed. Recovering..." 184*90c8c64dSAndroid Build Coastguard Worker bridge_stop 185*90c8c64dSAndroid Build Coastguard Worker false 186*90c8c64dSAndroid Build Coastguard Worker } 187*90c8c64dSAndroid Build Coastguard Worker} 188*90c8c64dSAndroid Build Coastguard Workerbridge_add() { 189*90c8c64dSAndroid Build Coastguard Worker echo "Adding usb0 to the bridge" 190*90c8c64dSAndroid Build Coastguard Worker sudo brctl delif $BRIDGE $HOST_DEV 2>/dev/null || true # ignore 191*90c8c64dSAndroid Build Coastguard Worker sudo ifconfig $HOST_DEV 0.0.0.0 192*90c8c64dSAndroid Build Coastguard Worker sudo brctl addif $BRIDGE $HOST_DEV 193*90c8c64dSAndroid Build Coastguard Worker} 194*90c8c64dSAndroid Build Coastguard Workerbridge_stop() { 195*90c8c64dSAndroid Build Coastguard Worker sudo ifconfig $BRIDGE down || true # ignore errors 196*90c8c64dSAndroid Build Coastguard Worker sudo brctl delbr $BRIDGE || true 197*90c8c64dSAndroid Build Coastguard Worker sudo dhclient $LAN_DEV 198*90c8c64dSAndroid Build Coastguard Worker} 199*90c8c64dSAndroid Build Coastguard Worker 200*90c8c64dSAndroid Build Coastguard Worker### command-line interpreter 201*90c8c64dSAndroid Build Coastguard Workerif [ $# == "0" ]; then 202*90c8c64dSAndroid Build Coastguard Worker usage 203*90c8c64dSAndroid Build Coastguard Workerfi 204*90c8c64dSAndroid Build Coastguard Worker 205*90c8c64dSAndroid Build Coastguard Workerwhile (( $# )); do 206*90c8c64dSAndroid Build Coastguard Workercase $1 in 207*90c8c64dSAndroid Build Coastguard Worker--help|-h) 208*90c8c64dSAndroid Build Coastguard Worker usage 209*90c8c64dSAndroid Build Coastguard Worker exit 210*90c8c64dSAndroid Build Coastguard Worker ;; 211*90c8c64dSAndroid Build Coastguard Worker 212*90c8c64dSAndroid Build Coastguard Worker-b) shift; BRIDGE=$1 ;; 213*90c8c64dSAndroid Build Coastguard Worker-s) shift; SERIAL=$1 ;; 214*90c8c64dSAndroid Build Coastguard Worker-u) shift; HOST_DEV=$1 ;; 215*90c8c64dSAndroid Build Coastguard Worker-l) shift; LAN_DEV=$1 ;; 216*90c8c64dSAndroid Build Coastguard Worker-d) shift; DNS1=$1; shift; DNS2=$1 ;; 217*90c8c64dSAndroid Build Coastguard Worker-p) shift; PHONE_IP=$1 ;; 218*90c8c64dSAndroid Build Coastguard Worker-a) shift; HOST_IP=$1 ;; 219*90c8c64dSAndroid Build Coastguard Worker-m) shift; NETMASK=$1 ;; 220*90c8c64dSAndroid Build Coastguard Worker-e) shift; PHONE_HW=$1 ;; 221*90c8c64dSAndroid Build Coastguard Worker 222*90c8c64dSAndroid Build Coastguard Workerrndis) 223*90c8c64dSAndroid Build Coastguard Worker rndis_start 224*90c8c64dSAndroid Build Coastguard Worker rndis_test 225*90c8c64dSAndroid Build Coastguard Worker ;; 226*90c8c64dSAndroid Build Coastguard Worker 227*90c8c64dSAndroid Build Coastguard Workerbridge) 228*90c8c64dSAndroid Build Coastguard Worker ifconfig $HOST_DEV >/dev/null || $0 rndis 229*90c8c64dSAndroid Build Coastguard Worker bridge_start 230*90c8c64dSAndroid Build Coastguard Worker bridge_add 231*90c8c64dSAndroid Build Coastguard Worker route_bridge 232*90c8c64dSAndroid Build Coastguard Worker ;; 233*90c8c64dSAndroid Build Coastguard Worker 234*90c8c64dSAndroid Build Coastguard Workernat) 235*90c8c64dSAndroid Build Coastguard Worker ifconfig $HOST_DEV >/dev/null || $0 rndis 236*90c8c64dSAndroid Build Coastguard Worker nat_start 237*90c8c64dSAndroid Build Coastguard Worker route_nat 238*90c8c64dSAndroid Build Coastguard Worker ;; 239*90c8c64dSAndroid Build Coastguard Worker 240*90c8c64dSAndroid Build Coastguard Workernat+secure) 241*90c8c64dSAndroid Build Coastguard Worker $0 nat 242*90c8c64dSAndroid Build Coastguard Worker nat_secure 243*90c8c64dSAndroid Build Coastguard Worker ;; 244*90c8c64dSAndroid Build Coastguard Worker 245*90c8c64dSAndroid Build Coastguard Workerstop) 246*90c8c64dSAndroid Build Coastguard Worker route_reset 247*90c8c64dSAndroid Build Coastguard Worker ;; 248*90c8c64dSAndroid Build Coastguard Worker 249*90c8c64dSAndroid Build Coastguard Workerstop-all) 250*90c8c64dSAndroid Build Coastguard Worker bridge_stop 251*90c8c64dSAndroid Build Coastguard Worker nat_stop 252*90c8c64dSAndroid Build Coastguard Worker route_reset 253*90c8c64dSAndroid Build Coastguard Worker rndis_stop 254*90c8c64dSAndroid Build Coastguard Worker ;; 255*90c8c64dSAndroid Build Coastguard Worker 256*90c8c64dSAndroid Build Coastguard Worker*) # execute 'advanced command' by function name 257*90c8c64dSAndroid Build Coastguard Worker $1 258*90c8c64dSAndroid Build Coastguard Worker ;; 259*90c8c64dSAndroid Build Coastguard Workeresac 260*90c8c64dSAndroid Build Coastguard Workershift 261*90c8c64dSAndroid Build Coastguard Workerdone 262