xref: /aosp_15_r20/development/scripts/reverse_tether.sh (revision 90c8c64db3049935a07c6143d7fd006e26f8ecca)
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