Tethering.java revision 6fdd0c6274c81b337ad35b70480f881daf7354c3
1d0e18ffb82b59d38aeaf0e552f48e734202719abRobert Greenwalt/* 2d0e18ffb82b59d38aeaf0e552f48e734202719abRobert Greenwalt * Copyright (C) 2010 The Android Open Source Project 3d0e18ffb82b59d38aeaf0e552f48e734202719abRobert Greenwalt * 4d0e18ffb82b59d38aeaf0e552f48e734202719abRobert Greenwalt * Licensed under the Apache License, Version 2.0 (the "License"); 5d0e18ffb82b59d38aeaf0e552f48e734202719abRobert Greenwalt * you may not use this file except in compliance with the License. 6d0e18ffb82b59d38aeaf0e552f48e734202719abRobert Greenwalt * You may obtain a copy of the License at 7d0e18ffb82b59d38aeaf0e552f48e734202719abRobert Greenwalt * 8d0e18ffb82b59d38aeaf0e552f48e734202719abRobert Greenwalt * http://www.apache.org/licenses/LICENSE-2.0 9d0e18ffb82b59d38aeaf0e552f48e734202719abRobert Greenwalt * 10d0e18ffb82b59d38aeaf0e552f48e734202719abRobert Greenwalt * Unless required by applicable law or agreed to in writing, software 11d0e18ffb82b59d38aeaf0e552f48e734202719abRobert Greenwalt * distributed under the License is distributed on an "AS IS" BASIS, 12d0e18ffb82b59d38aeaf0e552f48e734202719abRobert Greenwalt * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13d0e18ffb82b59d38aeaf0e552f48e734202719abRobert Greenwalt * See the License for the specific language governing permissions and 14d0e18ffb82b59d38aeaf0e552f48e734202719abRobert Greenwalt * limitations under the License. 15d0e18ffb82b59d38aeaf0e552f48e734202719abRobert Greenwalt */ 16d0e18ffb82b59d38aeaf0e552f48e734202719abRobert Greenwalt 17d0e18ffb82b59d38aeaf0e552f48e734202719abRobert Greenwaltpackage com.android.server.connectivity; 18d0e18ffb82b59d38aeaf0e552f48e734202719abRobert Greenwalt 19d0e18ffb82b59d38aeaf0e552f48e734202719abRobert Greenwaltimport android.app.Notification; 20d0e18ffb82b59d38aeaf0e552f48e734202719abRobert Greenwaltimport android.app.NotificationManager; 21d0e18ffb82b59d38aeaf0e552f48e734202719abRobert Greenwaltimport android.app.PendingIntent; 226fdd0c6274c81b337ad35b70480f881daf7354c3Danica Changimport android.bluetooth.BluetoothPan; 23d0e18ffb82b59d38aeaf0e552f48e734202719abRobert Greenwaltimport android.content.BroadcastReceiver; 24d0e18ffb82b59d38aeaf0e552f48e734202719abRobert Greenwaltimport android.content.Context; 25d0e18ffb82b59d38aeaf0e552f48e734202719abRobert Greenwaltimport android.content.Intent; 26d0e18ffb82b59d38aeaf0e552f48e734202719abRobert Greenwaltimport android.content.IntentFilter; 272a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwaltimport android.content.pm.PackageManager; 28d0e18ffb82b59d38aeaf0e552f48e734202719abRobert Greenwaltimport android.content.res.Resources; 29ac051ae7ac62532c78f820a0c7347ca36b119132Mike Lockwoodimport android.hardware.Usb; 30d0e18ffb82b59d38aeaf0e552f48e734202719abRobert Greenwaltimport android.net.ConnectivityManager; 3165ae29bd852ff468ad003af241d5177fe016c74aRobert Greenwaltimport android.net.InterfaceConfiguration; 322a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwaltimport android.net.IConnectivityManager; 33d0e18ffb82b59d38aeaf0e552f48e734202719abRobert Greenwaltimport android.net.INetworkManagementEventObserver; 342a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwaltimport android.net.NetworkInfo; 352a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwaltimport android.os.Binder; 36030f5e18dfa71673708deb75e8aa1f196bebbd99Robert Greenwaltimport android.os.Environment; 377eae25021d3aa71c7616ea766f9a4d5af3b1772bRobert Greenwaltimport android.os.HandlerThread; 38d0e18ffb82b59d38aeaf0e552f48e734202719abRobert Greenwaltimport android.os.IBinder; 39d0e18ffb82b59d38aeaf0e552f48e734202719abRobert Greenwaltimport android.os.INetworkManagementService; 40dfadaeac088cabce854d8f476405cd412f82593aRobert Greenwaltimport android.os.Looper; 412a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwaltimport android.os.Message; 42d0e18ffb82b59d38aeaf0e552f48e734202719abRobert Greenwaltimport android.os.RemoteException; 43d0e18ffb82b59d38aeaf0e552f48e734202719abRobert Greenwaltimport android.os.ServiceManager; 44d0e18ffb82b59d38aeaf0e552f48e734202719abRobert Greenwaltimport android.provider.Settings; 45d0e18ffb82b59d38aeaf0e552f48e734202719abRobert Greenwaltimport android.util.Log; 46d0e18ffb82b59d38aeaf0e552f48e734202719abRobert Greenwalt 472a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwaltimport com.android.internal.telephony.Phone; 482a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwaltimport com.android.internal.util.HierarchicalState; 492a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwaltimport com.android.internal.util.HierarchicalStateMachine; 502a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt 512a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwaltimport java.io.FileDescriptor; 522a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwaltimport java.io.PrintWriter; 53d0e18ffb82b59d38aeaf0e552f48e734202719abRobert Greenwaltimport java.util.ArrayList; 542a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwaltimport java.util.HashMap; 556fdd0c6274c81b337ad35b70480f881daf7354c3Danica Changimport java.util.LinkedList; 562a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwaltimport java.util.Set; 57d0e18ffb82b59d38aeaf0e552f48e734202719abRobert Greenwalt/** 58d0e18ffb82b59d38aeaf0e552f48e734202719abRobert Greenwalt * @hide 592a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt * 602a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt * Timeout 612a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt * 622a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt * TODO - look for parent classes and code sharing 63d0e18ffb82b59d38aeaf0e552f48e734202719abRobert Greenwalt */ 6465ae29bd852ff468ad003af241d5177fe016c74aRobert Greenwalt 65d0e18ffb82b59d38aeaf0e552f48e734202719abRobert Greenwaltpublic class Tethering extends INetworkManagementEventObserver.Stub { 66d0e18ffb82b59d38aeaf0e552f48e734202719abRobert Greenwalt 67d0e18ffb82b59d38aeaf0e552f48e734202719abRobert Greenwalt private Context mContext; 68924cc94caaab5e9ad0714e0877e871290316e2b1Robert Greenwalt private final static String TAG = "Tethering"; 69924cc94caaab5e9ad0714e0877e871290316e2b1Robert Greenwalt private final static boolean DEBUG = false; 70d0e18ffb82b59d38aeaf0e552f48e734202719abRobert Greenwalt 71c9d5fb7c95f158d9a31d534895373afcfad77806Robert Greenwalt private boolean mBooted = false; 72c9d5fb7c95f158d9a31d534895373afcfad77806Robert Greenwalt //used to remember if we got connected before boot finished 73c9d5fb7c95f158d9a31d534895373afcfad77806Robert Greenwalt private boolean mDeferedUsbConnection = false; 74d0e18ffb82b59d38aeaf0e552f48e734202719abRobert Greenwalt 752a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt // TODO - remove both of these - should be part of interface inspection/selection stuff 762a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt private String[] mTetherableUsbRegexs; 772a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt private String[] mTetherableWifiRegexs; 786fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang private String[] mTetherableBluetoothRegexs; 79c9d5fb7c95f158d9a31d534895373afcfad77806Robert Greenwalt private String[] mUpstreamIfaceRegexs; 802a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt 817eae25021d3aa71c7616ea766f9a4d5af3b1772bRobert Greenwalt private Looper mLooper; 827eae25021d3aa71c7616ea766f9a4d5af3b1772bRobert Greenwalt private HandlerThread mThread; 83dfadaeac088cabce854d8f476405cd412f82593aRobert Greenwalt 84030f5e18dfa71673708deb75e8aa1f196bebbd99Robert Greenwalt private HashMap<String, TetherInterfaceSM> mIfaces; // all tethered/tetherable ifaces 85d0e18ffb82b59d38aeaf0e552f48e734202719abRobert Greenwalt 86d0e18ffb82b59d38aeaf0e552f48e734202719abRobert Greenwalt private BroadcastReceiver mStateReceiver; 87d0e18ffb82b59d38aeaf0e552f48e734202719abRobert Greenwalt 88bfb7bfa53847832db2a3eb05e5eff7cb974c3c7aRobert Greenwalt private static final String USB_NEAR_IFACE_ADDR = "192.168.42.129"; 89bfb7bfa53847832db2a3eb05e5eff7cb974c3c7aRobert Greenwalt private static final String USB_NETMASK = "255.255.255.0"; 90bfb7bfa53847832db2a3eb05e5eff7cb974c3c7aRobert Greenwalt 91bfb7bfa53847832db2a3eb05e5eff7cb974c3c7aRobert Greenwalt // FYI - the default wifi is 192.168.43.1 and 255.255.255.0 92d70a3d4e2d356aab4cac313f1f9d8272a5e3e8d0Robert Greenwalt 932a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt private String[] mDhcpRange; 94bfb7bfa53847832db2a3eb05e5eff7cb974c3c7aRobert Greenwalt private static final String DHCP_DEFAULT_RANGE1_START = "192.168.42.2"; 95bfb7bfa53847832db2a3eb05e5eff7cb974c3c7aRobert Greenwalt private static final String DHCP_DEFAULT_RANGE1_STOP = "192.168.42.254"; 96bfb7bfa53847832db2a3eb05e5eff7cb974c3c7aRobert Greenwalt private static final String DHCP_DEFAULT_RANGE2_START = "192.168.43.2"; 97bfb7bfa53847832db2a3eb05e5eff7cb974c3c7aRobert Greenwalt private static final String DHCP_DEFAULT_RANGE2_STOP = "192.168.43.254"; 986fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang private static final String DHCP_DEFAULT_RANGE3_START = "192.168.44.9"; 996fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang private static final String DHCP_DEFAULT_RANGE3_STOP = "192.168.44.254"; 1002a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt 1012a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt private String[] mDnsServers; 102d70a3d4e2d356aab4cac313f1f9d8272a5e3e8d0Robert Greenwalt private static final String DNS_DEFAULT_SERVER1 = "8.8.8.8"; 103d70a3d4e2d356aab4cac313f1f9d8272a5e3e8d0Robert Greenwalt private static final String DNS_DEFAULT_SERVER2 = "4.2.2.2"; 1042a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt 10577b32ddbbeeb13a07b16f23af705567c75a8e3dfRobert Greenwalt // resampled each time we turn on tethering - used as cache for settings/config-val 106030f5e18dfa71673708deb75e8aa1f196bebbd99Robert Greenwalt private boolean mDunRequired; // configuration info - must use DUN apn on 3g 107030f5e18dfa71673708deb75e8aa1f196bebbd99Robert Greenwalt 108a599fe7c0d8b4d4bdf4accb099cb17bebcb9088bRobert Greenwalt private HierarchicalStateMachine mTetherMasterSM; 109a599fe7c0d8b4d4bdf4accb099cb17bebcb9088bRobert Greenwalt 110a599fe7c0d8b4d4bdf4accb099cb17bebcb9088bRobert Greenwalt private Notification mTetheredNotification; 1112a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt 112030f5e18dfa71673708deb75e8aa1f196bebbd99Robert Greenwalt // whether we can tether is the && of these two - they come in as separate 113030f5e18dfa71673708deb75e8aa1f196bebbd99Robert Greenwalt // broadcasts so track them so we can decide what to do when either changes 114030f5e18dfa71673708deb75e8aa1f196bebbd99Robert Greenwalt private boolean mUsbMassStorageOff; // track the status of USB Mass Storage 115030f5e18dfa71673708deb75e8aa1f196bebbd99Robert Greenwalt private boolean mUsbConnected; // track the status of USB connection 116030f5e18dfa71673708deb75e8aa1f196bebbd99Robert Greenwalt 117dfadaeac088cabce854d8f476405cd412f82593aRobert Greenwalt public Tethering(Context context, Looper looper) { 118d0e18ffb82b59d38aeaf0e552f48e734202719abRobert Greenwalt Log.d(TAG, "Tethering starting"); 119d0e18ffb82b59d38aeaf0e552f48e734202719abRobert Greenwalt mContext = context; 120dfadaeac088cabce854d8f476405cd412f82593aRobert Greenwalt mLooper = looper; 121d0e18ffb82b59d38aeaf0e552f48e734202719abRobert Greenwalt 122d0e18ffb82b59d38aeaf0e552f48e734202719abRobert Greenwalt // register for notifications from NetworkManagement Service 123d0e18ffb82b59d38aeaf0e552f48e734202719abRobert Greenwalt IBinder b = ServiceManager.getService(Context.NETWORKMANAGEMENT_SERVICE); 124d0e18ffb82b59d38aeaf0e552f48e734202719abRobert Greenwalt INetworkManagementService service = INetworkManagementService.Stub.asInterface(b); 125d0e18ffb82b59d38aeaf0e552f48e734202719abRobert Greenwalt try { 126d0e18ffb82b59d38aeaf0e552f48e734202719abRobert Greenwalt service.registerObserver(this); 127d0e18ffb82b59d38aeaf0e552f48e734202719abRobert Greenwalt } catch (RemoteException e) { 128d0e18ffb82b59d38aeaf0e552f48e734202719abRobert Greenwalt Log.e(TAG, "Error registering observer :" + e); 129d0e18ffb82b59d38aeaf0e552f48e734202719abRobert Greenwalt } 130d0e18ffb82b59d38aeaf0e552f48e734202719abRobert Greenwalt 1312a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt mIfaces = new HashMap<String, TetherInterfaceSM>(); 132d0e18ffb82b59d38aeaf0e552f48e734202719abRobert Greenwalt 1337eae25021d3aa71c7616ea766f9a4d5af3b1772bRobert Greenwalt // make our own thread so we don't anr the system 1347eae25021d3aa71c7616ea766f9a4d5af3b1772bRobert Greenwalt mThread = new HandlerThread("Tethering"); 1357eae25021d3aa71c7616ea766f9a4d5af3b1772bRobert Greenwalt mThread.start(); 1367eae25021d3aa71c7616ea766f9a4d5af3b1772bRobert Greenwalt mLooper = mThread.getLooper(); 137dfadaeac088cabce854d8f476405cd412f82593aRobert Greenwalt mTetherMasterSM = new TetherMasterSM("TetherMaster", mLooper); 1382a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt mTetherMasterSM.start(); 1392a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt 140bb51d9feea260e1527628b878319c0cf76adadebRobert Greenwalt mStateReceiver = new StateReceiver(); 141d0e18ffb82b59d38aeaf0e552f48e734202719abRobert Greenwalt IntentFilter filter = new IntentFilter(); 142ac051ae7ac62532c78f820a0c7347ca36b119132Mike Lockwood filter.addAction(Usb.ACTION_USB_STATE); 1432a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION); 144c9d5fb7c95f158d9a31d534895373afcfad77806Robert Greenwalt filter.addAction(Intent.ACTION_BOOT_COMPLETED); 145bb51d9feea260e1527628b878319c0cf76adadebRobert Greenwalt mContext.registerReceiver(mStateReceiver, filter); 146bb51d9feea260e1527628b878319c0cf76adadebRobert Greenwalt 147bb51d9feea260e1527628b878319c0cf76adadebRobert Greenwalt filter = new IntentFilter(); 148030f5e18dfa71673708deb75e8aa1f196bebbd99Robert Greenwalt filter.addAction(Intent.ACTION_MEDIA_SHARED); 149030f5e18dfa71673708deb75e8aa1f196bebbd99Robert Greenwalt filter.addAction(Intent.ACTION_MEDIA_UNSHARED); 150bb51d9feea260e1527628b878319c0cf76adadebRobert Greenwalt filter.addDataScheme("file"); 151bb51d9feea260e1527628b878319c0cf76adadebRobert Greenwalt mContext.registerReceiver(mStateReceiver, filter); 152bb51d9feea260e1527628b878319c0cf76adadebRobert Greenwalt 153030f5e18dfa71673708deb75e8aa1f196bebbd99Robert Greenwalt mUsbMassStorageOff = !Environment.MEDIA_SHARED.equals( 154030f5e18dfa71673708deb75e8aa1f196bebbd99Robert Greenwalt Environment.getExternalStorageState()); 1552a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt 1562a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt mDhcpRange = context.getResources().getStringArray( 1572a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt com.android.internal.R.array.config_tether_dhcp_range); 158bfb7bfa53847832db2a3eb05e5eff7cb974c3c7aRobert Greenwalt if ((mDhcpRange.length == 0) || (mDhcpRange.length % 2 ==1)) { 1596fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang mDhcpRange = new String[6]; 160bfb7bfa53847832db2a3eb05e5eff7cb974c3c7aRobert Greenwalt mDhcpRange[0] = DHCP_DEFAULT_RANGE1_START; 161bfb7bfa53847832db2a3eb05e5eff7cb974c3c7aRobert Greenwalt mDhcpRange[1] = DHCP_DEFAULT_RANGE1_STOP; 162bfb7bfa53847832db2a3eb05e5eff7cb974c3c7aRobert Greenwalt mDhcpRange[2] = DHCP_DEFAULT_RANGE2_START; 163bfb7bfa53847832db2a3eb05e5eff7cb974c3c7aRobert Greenwalt mDhcpRange[3] = DHCP_DEFAULT_RANGE2_STOP; 1646fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang mDhcpRange[4] = DHCP_DEFAULT_RANGE3_START; 1656fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang mDhcpRange[5] = DHCP_DEFAULT_RANGE3_STOP; 1662a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt } 16777b32ddbbeeb13a07b16f23af705567c75a8e3dfRobert Greenwalt mDunRequired = false; // resample when we turn on 1682a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt 1692a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt mTetherableUsbRegexs = context.getResources().getStringArray( 1702a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt com.android.internal.R.array.config_tether_usb_regexs); 1712a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt mTetherableWifiRegexs = context.getResources().getStringArray( 1722a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt com.android.internal.R.array.config_tether_wifi_regexs); 1736fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang mTetherableBluetoothRegexs = context.getResources().getStringArray( 1746fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang com.android.internal.R.array.config_tether_bluetooth_regexs); 175c9d5fb7c95f158d9a31d534895373afcfad77806Robert Greenwalt mUpstreamIfaceRegexs = context.getResources().getStringArray( 176c9d5fb7c95f158d9a31d534895373afcfad77806Robert Greenwalt com.android.internal.R.array.config_tether_upstream_regexs); 1772a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt 1782a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt // TODO - remove and rely on real notifications of the current iface 1792a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt mDnsServers = new String[2]; 180d70a3d4e2d356aab4cac313f1f9d8272a5e3e8d0Robert Greenwalt mDnsServers[0] = DNS_DEFAULT_SERVER1; 181d70a3d4e2d356aab4cac313f1f9d8272a5e3e8d0Robert Greenwalt mDnsServers[1] = DNS_DEFAULT_SERVER2; 182d0e18ffb82b59d38aeaf0e552f48e734202719abRobert Greenwalt } 183d0e18ffb82b59d38aeaf0e552f48e734202719abRobert Greenwalt 1842a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt public void interfaceLinkStatusChanged(String iface, boolean link) { 185924cc94caaab5e9ad0714e0877e871290316e2b1Robert Greenwalt if (DEBUG) Log.d(TAG, "interfaceLinkStatusChanged " + iface + ", " + link); 1862a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt boolean found = false; 18765ae29bd852ff468ad003af241d5177fe016c74aRobert Greenwalt boolean usb = false; 188a599fe7c0d8b4d4bdf4accb099cb17bebcb9088bRobert Greenwalt if (isWifi(iface)) { 189a599fe7c0d8b4d4bdf4accb099cb17bebcb9088bRobert Greenwalt found = true; 190a599fe7c0d8b4d4bdf4accb099cb17bebcb9088bRobert Greenwalt } else if (isUsb(iface)) { 191a599fe7c0d8b4d4bdf4accb099cb17bebcb9088bRobert Greenwalt found = true; 192a599fe7c0d8b4d4bdf4accb099cb17bebcb9088bRobert Greenwalt usb = true; 1936fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang } else if (isBluetooth(iface)) { 1946fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang found = true; 1952a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt } 1962a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt if (found == false) return; 1972a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt 1982a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt synchronized (mIfaces) { 1992a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt TetherInterfaceSM sm = mIfaces.get(iface); 2002a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt if (link) { 2012a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt if (sm == null) { 202dfadaeac088cabce854d8f476405cd412f82593aRobert Greenwalt sm = new TetherInterfaceSM(iface, mLooper, usb); 2032a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt mIfaces.put(iface, sm); 2042a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt sm.start(); 2052a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt } 2062a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt } else { 2072a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt if (sm != null) { 2086a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt sm.sendMessage(TetherInterfaceSM.CMD_INTERFACE_DOWN); 2092a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt mIfaces.remove(iface); 2102a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt } 2112a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt } 2122a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt } 213d0e18ffb82b59d38aeaf0e552f48e734202719abRobert Greenwalt } 214d0e18ffb82b59d38aeaf0e552f48e734202719abRobert Greenwalt 215a599fe7c0d8b4d4bdf4accb099cb17bebcb9088bRobert Greenwalt private boolean isUsb(String iface) { 216a599fe7c0d8b4d4bdf4accb099cb17bebcb9088bRobert Greenwalt for (String regex : mTetherableUsbRegexs) { 217a599fe7c0d8b4d4bdf4accb099cb17bebcb9088bRobert Greenwalt if (iface.matches(regex)) return true; 218a599fe7c0d8b4d4bdf4accb099cb17bebcb9088bRobert Greenwalt } 219a599fe7c0d8b4d4bdf4accb099cb17bebcb9088bRobert Greenwalt return false; 220a599fe7c0d8b4d4bdf4accb099cb17bebcb9088bRobert Greenwalt } 221a599fe7c0d8b4d4bdf4accb099cb17bebcb9088bRobert Greenwalt 222a599fe7c0d8b4d4bdf4accb099cb17bebcb9088bRobert Greenwalt public boolean isWifi(String iface) { 223a599fe7c0d8b4d4bdf4accb099cb17bebcb9088bRobert Greenwalt for (String regex : mTetherableWifiRegexs) { 224a599fe7c0d8b4d4bdf4accb099cb17bebcb9088bRobert Greenwalt if (iface.matches(regex)) return true; 225a599fe7c0d8b4d4bdf4accb099cb17bebcb9088bRobert Greenwalt } 226a599fe7c0d8b4d4bdf4accb099cb17bebcb9088bRobert Greenwalt return false; 227a599fe7c0d8b4d4bdf4accb099cb17bebcb9088bRobert Greenwalt } 228a599fe7c0d8b4d4bdf4accb099cb17bebcb9088bRobert Greenwalt 2296fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang public boolean isBluetooth(String iface) { 2306fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang for (String regex : mTetherableBluetoothRegexs) { 2316fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang if (iface.matches(regex)) return true; 2326fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang } 2336fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang return false; 2346fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang } 2352a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt public void interfaceAdded(String iface) { 23665ae29bd852ff468ad003af241d5177fe016c74aRobert Greenwalt IBinder b = ServiceManager.getService(Context.NETWORKMANAGEMENT_SERVICE); 23765ae29bd852ff468ad003af241d5177fe016c74aRobert Greenwalt INetworkManagementService service = INetworkManagementService.Stub.asInterface(b); 2382a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt boolean found = false; 23965ae29bd852ff468ad003af241d5177fe016c74aRobert Greenwalt boolean usb = false; 240a599fe7c0d8b4d4bdf4accb099cb17bebcb9088bRobert Greenwalt if (isWifi(iface)) { 241a599fe7c0d8b4d4bdf4accb099cb17bebcb9088bRobert Greenwalt found = true; 2422a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt } 243a599fe7c0d8b4d4bdf4accb099cb17bebcb9088bRobert Greenwalt if (isUsb(iface)) { 244a599fe7c0d8b4d4bdf4accb099cb17bebcb9088bRobert Greenwalt found = true; 245a599fe7c0d8b4d4bdf4accb099cb17bebcb9088bRobert Greenwalt usb = true; 246d0e18ffb82b59d38aeaf0e552f48e734202719abRobert Greenwalt } 2476fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang if (isBluetooth(iface)) { 2486fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang found = true; 2496fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang } 2502a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt if (found == false) { 251924cc94caaab5e9ad0714e0877e871290316e2b1Robert Greenwalt if (DEBUG) Log.d(TAG, iface + " is not a tetherable iface, ignoring"); 252d0e18ffb82b59d38aeaf0e552f48e734202719abRobert Greenwalt return; 253d0e18ffb82b59d38aeaf0e552f48e734202719abRobert Greenwalt } 25465ae29bd852ff468ad003af241d5177fe016c74aRobert Greenwalt 2552a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt synchronized (mIfaces) { 2562a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt TetherInterfaceSM sm = mIfaces.get(iface); 2572a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt if (sm != null) { 258924cc94caaab5e9ad0714e0877e871290316e2b1Robert Greenwalt if (DEBUG) Log.d(TAG, "active iface (" + iface + ") reported as added, ignoring"); 2592a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt return; 2602a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt } 261dfadaeac088cabce854d8f476405cd412f82593aRobert Greenwalt sm = new TetherInterfaceSM(iface, mLooper, usb); 2622a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt mIfaces.put(iface, sm); 2632a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt sm.start(); 2642a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt } 265924cc94caaab5e9ad0714e0877e871290316e2b1Robert Greenwalt if (DEBUG) Log.d(TAG, "interfaceAdded :" + iface); 266d0e18ffb82b59d38aeaf0e552f48e734202719abRobert Greenwalt } 267d0e18ffb82b59d38aeaf0e552f48e734202719abRobert Greenwalt 2682a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt public void interfaceRemoved(String iface) { 2692a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt synchronized (mIfaces) { 2702a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt TetherInterfaceSM sm = mIfaces.get(iface); 2712a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt if (sm == null) { 272924cc94caaab5e9ad0714e0877e871290316e2b1Robert Greenwalt if (DEBUG) { 273924cc94caaab5e9ad0714e0877e871290316e2b1Robert Greenwalt Log.e(TAG, "attempting to remove unknown iface (" + iface + "), ignoring"); 274924cc94caaab5e9ad0714e0877e871290316e2b1Robert Greenwalt } 2752a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt return; 2762a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt } 2776a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt sm.sendMessage(TetherInterfaceSM.CMD_INTERFACE_DOWN); 2782a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt mIfaces.remove(iface); 279d0e18ffb82b59d38aeaf0e552f48e734202719abRobert Greenwalt } 280d0e18ffb82b59d38aeaf0e552f48e734202719abRobert Greenwalt } 281d0e18ffb82b59d38aeaf0e552f48e734202719abRobert Greenwalt 2825a73506cdd466f2b96686ced3ff0f7ca224d1143Robert Greenwalt public int tether(String iface) { 283d0e18ffb82b59d38aeaf0e552f48e734202719abRobert Greenwalt Log.d(TAG, "Tethering " + iface); 2842a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt TetherInterfaceSM sm = null; 2852a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt synchronized (mIfaces) { 2862a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt sm = mIfaces.get(iface); 287d0e18ffb82b59d38aeaf0e552f48e734202719abRobert Greenwalt } 2882a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt if (sm == null) { 2892a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt Log.e(TAG, "Tried to Tether an unknown iface :" + iface + ", ignoring"); 2905a73506cdd466f2b96686ced3ff0f7ca224d1143Robert Greenwalt return ConnectivityManager.TETHER_ERROR_UNKNOWN_IFACE; 291d0e18ffb82b59d38aeaf0e552f48e734202719abRobert Greenwalt } 2925a73506cdd466f2b96686ced3ff0f7ca224d1143Robert Greenwalt if (!sm.isAvailable() && !sm.isErrored()) { 2932a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt Log.e(TAG, "Tried to Tether an unavailable iface :" + iface + ", ignoring"); 2945a73506cdd466f2b96686ced3ff0f7ca224d1143Robert Greenwalt return ConnectivityManager.TETHER_ERROR_UNAVAIL_IFACE; 295d0e18ffb82b59d38aeaf0e552f48e734202719abRobert Greenwalt } 2966a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt sm.sendMessage(TetherInterfaceSM.CMD_TETHER_REQUESTED); 2975a73506cdd466f2b96686ced3ff0f7ca224d1143Robert Greenwalt return ConnectivityManager.TETHER_ERROR_NO_ERROR; 298d0e18ffb82b59d38aeaf0e552f48e734202719abRobert Greenwalt } 299d0e18ffb82b59d38aeaf0e552f48e734202719abRobert Greenwalt 3005a73506cdd466f2b96686ced3ff0f7ca224d1143Robert Greenwalt public int untether(String iface) { 301d0e18ffb82b59d38aeaf0e552f48e734202719abRobert Greenwalt Log.d(TAG, "Untethering " + iface); 3022a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt TetherInterfaceSM sm = null; 3032a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt synchronized (mIfaces) { 3042a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt sm = mIfaces.get(iface); 3052a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt } 3062a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt if (sm == null) { 3072a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt Log.e(TAG, "Tried to Untether an unknown iface :" + iface + ", ignoring"); 3085a73506cdd466f2b96686ced3ff0f7ca224d1143Robert Greenwalt return ConnectivityManager.TETHER_ERROR_UNKNOWN_IFACE; 309d0e18ffb82b59d38aeaf0e552f48e734202719abRobert Greenwalt } 3102a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt if (sm.isErrored()) { 3112a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt Log.e(TAG, "Tried to Untethered an errored iface :" + iface + ", ignoring"); 3125a73506cdd466f2b96686ced3ff0f7ca224d1143Robert Greenwalt return ConnectivityManager.TETHER_ERROR_UNAVAIL_IFACE; 313d0e18ffb82b59d38aeaf0e552f48e734202719abRobert Greenwalt } 3146a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt sm.sendMessage(TetherInterfaceSM.CMD_TETHER_UNREQUESTED); 3155a73506cdd466f2b96686ced3ff0f7ca224d1143Robert Greenwalt return ConnectivityManager.TETHER_ERROR_NO_ERROR; 3165a73506cdd466f2b96686ced3ff0f7ca224d1143Robert Greenwalt } 3175a73506cdd466f2b96686ced3ff0f7ca224d1143Robert Greenwalt 3185a73506cdd466f2b96686ced3ff0f7ca224d1143Robert Greenwalt public int getLastTetherError(String iface) { 3195a73506cdd466f2b96686ced3ff0f7ca224d1143Robert Greenwalt TetherInterfaceSM sm = null; 3205a73506cdd466f2b96686ced3ff0f7ca224d1143Robert Greenwalt synchronized (mIfaces) { 3215a73506cdd466f2b96686ced3ff0f7ca224d1143Robert Greenwalt sm = mIfaces.get(iface); 3225a73506cdd466f2b96686ced3ff0f7ca224d1143Robert Greenwalt } 3235a73506cdd466f2b96686ced3ff0f7ca224d1143Robert Greenwalt if (sm == null) { 3245a73506cdd466f2b96686ced3ff0f7ca224d1143Robert Greenwalt Log.e(TAG, "Tried to getLastTetherError on an unknown iface :" + iface + ", ignoring"); 3255a73506cdd466f2b96686ced3ff0f7ca224d1143Robert Greenwalt return ConnectivityManager.TETHER_ERROR_UNKNOWN_IFACE; 3265a73506cdd466f2b96686ced3ff0f7ca224d1143Robert Greenwalt } 3275a73506cdd466f2b96686ced3ff0f7ca224d1143Robert Greenwalt return sm.getLastError(); 3282a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt } 329d0e18ffb82b59d38aeaf0e552f48e734202719abRobert Greenwalt 3302a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt private void sendTetherStateChangedBroadcast() { 3312a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt IBinder b = ServiceManager.getService(Context.CONNECTIVITY_SERVICE); 3322a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt IConnectivityManager service = IConnectivityManager.Stub.asInterface(b); 333d0e18ffb82b59d38aeaf0e552f48e734202719abRobert Greenwalt try { 3342a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt if (!service.isTetheringSupported()) return; 3352a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt } catch (RemoteException e) { 3362a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt return; 337d0e18ffb82b59d38aeaf0e552f48e734202719abRobert Greenwalt } 338d0e18ffb82b59d38aeaf0e552f48e734202719abRobert Greenwalt 3392a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt ArrayList<String> availableList = new ArrayList<String>(); 3402a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt ArrayList<String> activeList = new ArrayList<String>(); 3412a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt ArrayList<String> erroredList = new ArrayList<String>(); 3422a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt 343a599fe7c0d8b4d4bdf4accb099cb17bebcb9088bRobert Greenwalt boolean wifiTethered = false; 344a599fe7c0d8b4d4bdf4accb099cb17bebcb9088bRobert Greenwalt boolean usbTethered = false; 3456fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang boolean bluetoothTethered = false; 346a599fe7c0d8b4d4bdf4accb099cb17bebcb9088bRobert Greenwalt 3472a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt synchronized (mIfaces) { 3482a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt Set ifaces = mIfaces.keySet(); 3492a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt for (Object iface : ifaces) { 3502a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt TetherInterfaceSM sm = mIfaces.get(iface); 3512a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt if (sm != null) { 3526fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang if (sm.isErrored()) { 3532a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt erroredList.add((String)iface); 3542a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt } else if (sm.isAvailable()) { 3552a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt availableList.add((String)iface); 3562a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt } else if (sm.isTethered()) { 357a599fe7c0d8b4d4bdf4accb099cb17bebcb9088bRobert Greenwalt if (isUsb((String)iface)) { 358a599fe7c0d8b4d4bdf4accb099cb17bebcb9088bRobert Greenwalt usbTethered = true; 359a599fe7c0d8b4d4bdf4accb099cb17bebcb9088bRobert Greenwalt } else if (isWifi((String)iface)) { 360a599fe7c0d8b4d4bdf4accb099cb17bebcb9088bRobert Greenwalt wifiTethered = true; 3616fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang } else if (isBluetooth((String)iface)) { 3626fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang bluetoothTethered = true; 363a599fe7c0d8b4d4bdf4accb099cb17bebcb9088bRobert Greenwalt } 3642a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt activeList.add((String)iface); 3652a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt } 3662a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt } 367d0e18ffb82b59d38aeaf0e552f48e734202719abRobert Greenwalt } 368d0e18ffb82b59d38aeaf0e552f48e734202719abRobert Greenwalt } 369d0e18ffb82b59d38aeaf0e552f48e734202719abRobert Greenwalt Intent broadcast = new Intent(ConnectivityManager.ACTION_TETHER_STATE_CHANGED); 370d0e18ffb82b59d38aeaf0e552f48e734202719abRobert Greenwalt broadcast.addFlags(Intent.FLAG_RECEIVER_REPLACE_PENDING); 3712a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt broadcast.putStringArrayListExtra(ConnectivityManager.EXTRA_AVAILABLE_TETHER, 3722a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt availableList); 3732a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt broadcast.putStringArrayListExtra(ConnectivityManager.EXTRA_ACTIVE_TETHER, activeList); 3742a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt broadcast.putStringArrayListExtra(ConnectivityManager.EXTRA_ERRORED_TETHER, 3752a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt erroredList); 3762a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt mContext.sendStickyBroadcast(broadcast); 377924cc94caaab5e9ad0714e0877e871290316e2b1Robert Greenwalt if (DEBUG) { 378924cc94caaab5e9ad0714e0877e871290316e2b1Robert Greenwalt Log.d(TAG, "sendTetherStateChangedBroadcast " + availableList.size() + ", " + 379924cc94caaab5e9ad0714e0877e871290316e2b1Robert Greenwalt activeList.size() + ", " + erroredList.size()); 380924cc94caaab5e9ad0714e0877e871290316e2b1Robert Greenwalt } 381a599fe7c0d8b4d4bdf4accb099cb17bebcb9088bRobert Greenwalt 382a599fe7c0d8b4d4bdf4accb099cb17bebcb9088bRobert Greenwalt if (usbTethered) { 3836fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang if (wifiTethered || bluetoothTethered) { 384a599fe7c0d8b4d4bdf4accb099cb17bebcb9088bRobert Greenwalt showTetheredNotification(com.android.internal.R.drawable.stat_sys_tether_general); 385a599fe7c0d8b4d4bdf4accb099cb17bebcb9088bRobert Greenwalt } else { 386a599fe7c0d8b4d4bdf4accb099cb17bebcb9088bRobert Greenwalt showTetheredNotification(com.android.internal.R.drawable.stat_sys_tether_usb); 387a599fe7c0d8b4d4bdf4accb099cb17bebcb9088bRobert Greenwalt } 388a599fe7c0d8b4d4bdf4accb099cb17bebcb9088bRobert Greenwalt } else if (wifiTethered) { 3896fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang if (bluetoothTethered) { 3906fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang showTetheredNotification(com.android.internal.R.drawable.stat_sys_tether_general); 3916fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang } else { 3926fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang showTetheredNotification(com.android.internal.R.drawable.stat_sys_tether_wifi); 3936fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang } 3946fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang } else if (bluetoothTethered) { 3956fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang showTetheredNotification(com.android.internal.R.drawable.stat_sys_tether_bluetooth); 396a599fe7c0d8b4d4bdf4accb099cb17bebcb9088bRobert Greenwalt } else { 397a599fe7c0d8b4d4bdf4accb099cb17bebcb9088bRobert Greenwalt clearTetheredNotification(); 398a599fe7c0d8b4d4bdf4accb099cb17bebcb9088bRobert Greenwalt } 399a599fe7c0d8b4d4bdf4accb099cb17bebcb9088bRobert Greenwalt } 400a599fe7c0d8b4d4bdf4accb099cb17bebcb9088bRobert Greenwalt 401a599fe7c0d8b4d4bdf4accb099cb17bebcb9088bRobert Greenwalt private void showTetheredNotification(int icon) { 402a599fe7c0d8b4d4bdf4accb099cb17bebcb9088bRobert Greenwalt NotificationManager notificationManager = 403a599fe7c0d8b4d4bdf4accb099cb17bebcb9088bRobert Greenwalt (NotificationManager)mContext.getSystemService(Context.NOTIFICATION_SERVICE); 404a599fe7c0d8b4d4bdf4accb099cb17bebcb9088bRobert Greenwalt if (notificationManager == null) { 405a599fe7c0d8b4d4bdf4accb099cb17bebcb9088bRobert Greenwalt return; 406a599fe7c0d8b4d4bdf4accb099cb17bebcb9088bRobert Greenwalt } 407a599fe7c0d8b4d4bdf4accb099cb17bebcb9088bRobert Greenwalt 408db3fe9edd4cb638d3dd20b23456f6cdb0a414ed1Robert Greenwalt if (mTetheredNotification != null) { 409db3fe9edd4cb638d3dd20b23456f6cdb0a414ed1Robert Greenwalt if (mTetheredNotification.icon == icon) { 410db3fe9edd4cb638d3dd20b23456f6cdb0a414ed1Robert Greenwalt return; 411db3fe9edd4cb638d3dd20b23456f6cdb0a414ed1Robert Greenwalt } 412db3fe9edd4cb638d3dd20b23456f6cdb0a414ed1Robert Greenwalt notificationManager.cancel(mTetheredNotification.icon); 413db3fe9edd4cb638d3dd20b23456f6cdb0a414ed1Robert Greenwalt } 414db3fe9edd4cb638d3dd20b23456f6cdb0a414ed1Robert Greenwalt 415a599fe7c0d8b4d4bdf4accb099cb17bebcb9088bRobert Greenwalt Intent intent = new Intent(); 416a599fe7c0d8b4d4bdf4accb099cb17bebcb9088bRobert Greenwalt intent.setClassName("com.android.settings", "com.android.settings.TetherSettings"); 417a599fe7c0d8b4d4bdf4accb099cb17bebcb9088bRobert Greenwalt intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); 418a599fe7c0d8b4d4bdf4accb099cb17bebcb9088bRobert Greenwalt 419a599fe7c0d8b4d4bdf4accb099cb17bebcb9088bRobert Greenwalt PendingIntent pi = PendingIntent.getActivity(mContext, 0, intent, 0); 420a599fe7c0d8b4d4bdf4accb099cb17bebcb9088bRobert Greenwalt 421a599fe7c0d8b4d4bdf4accb099cb17bebcb9088bRobert Greenwalt Resources r = Resources.getSystem(); 422a599fe7c0d8b4d4bdf4accb099cb17bebcb9088bRobert Greenwalt CharSequence title = r.getText(com.android.internal.R.string.tethered_notification_title); 423a599fe7c0d8b4d4bdf4accb099cb17bebcb9088bRobert Greenwalt CharSequence message = r.getText(com.android.internal.R.string. 424a599fe7c0d8b4d4bdf4accb099cb17bebcb9088bRobert Greenwalt tethered_notification_message); 425a599fe7c0d8b4d4bdf4accb099cb17bebcb9088bRobert Greenwalt 4266fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang if (mTetheredNotification == null) { 427a599fe7c0d8b4d4bdf4accb099cb17bebcb9088bRobert Greenwalt mTetheredNotification = new Notification(); 428a599fe7c0d8b4d4bdf4accb099cb17bebcb9088bRobert Greenwalt mTetheredNotification.when = 0; 429a599fe7c0d8b4d4bdf4accb099cb17bebcb9088bRobert Greenwalt } 430a599fe7c0d8b4d4bdf4accb099cb17bebcb9088bRobert Greenwalt mTetheredNotification.icon = icon; 431a599fe7c0d8b4d4bdf4accb099cb17bebcb9088bRobert Greenwalt mTetheredNotification.defaults &= ~Notification.DEFAULT_SOUND; 432a599fe7c0d8b4d4bdf4accb099cb17bebcb9088bRobert Greenwalt mTetheredNotification.flags = Notification.FLAG_ONGOING_EVENT; 433a599fe7c0d8b4d4bdf4accb099cb17bebcb9088bRobert Greenwalt mTetheredNotification.tickerText = title; 434a599fe7c0d8b4d4bdf4accb099cb17bebcb9088bRobert Greenwalt mTetheredNotification.setLatestEventInfo(mContext, title, message, pi); 435a599fe7c0d8b4d4bdf4accb099cb17bebcb9088bRobert Greenwalt 436a599fe7c0d8b4d4bdf4accb099cb17bebcb9088bRobert Greenwalt notificationManager.notify(mTetheredNotification.icon, mTetheredNotification); 437a599fe7c0d8b4d4bdf4accb099cb17bebcb9088bRobert Greenwalt } 438a599fe7c0d8b4d4bdf4accb099cb17bebcb9088bRobert Greenwalt 439a599fe7c0d8b4d4bdf4accb099cb17bebcb9088bRobert Greenwalt private void clearTetheredNotification() { 440a599fe7c0d8b4d4bdf4accb099cb17bebcb9088bRobert Greenwalt NotificationManager notificationManager = 441a599fe7c0d8b4d4bdf4accb099cb17bebcb9088bRobert Greenwalt (NotificationManager)mContext.getSystemService(Context.NOTIFICATION_SERVICE); 442a599fe7c0d8b4d4bdf4accb099cb17bebcb9088bRobert Greenwalt if (notificationManager != null && mTetheredNotification != null) { 443a599fe7c0d8b4d4bdf4accb099cb17bebcb9088bRobert Greenwalt notificationManager.cancel(mTetheredNotification.icon); 444a599fe7c0d8b4d4bdf4accb099cb17bebcb9088bRobert Greenwalt mTetheredNotification = null; 445a599fe7c0d8b4d4bdf4accb099cb17bebcb9088bRobert Greenwalt } 4465a73506cdd466f2b96686ced3ff0f7ca224d1143Robert Greenwalt } 4475a73506cdd466f2b96686ced3ff0f7ca224d1143Robert Greenwalt 448030f5e18dfa71673708deb75e8aa1f196bebbd99Robert Greenwalt private void updateUsbStatus() { 449030f5e18dfa71673708deb75e8aa1f196bebbd99Robert Greenwalt boolean enable = mUsbConnected && mUsbMassStorageOff; 450030f5e18dfa71673708deb75e8aa1f196bebbd99Robert Greenwalt 451030f5e18dfa71673708deb75e8aa1f196bebbd99Robert Greenwalt if (mBooted) { 452030f5e18dfa71673708deb75e8aa1f196bebbd99Robert Greenwalt enableUsbIfaces(enable); 453030f5e18dfa71673708deb75e8aa1f196bebbd99Robert Greenwalt } 454030f5e18dfa71673708deb75e8aa1f196bebbd99Robert Greenwalt } 455030f5e18dfa71673708deb75e8aa1f196bebbd99Robert Greenwalt 4562a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt private class StateReceiver extends BroadcastReceiver { 457d0e18ffb82b59d38aeaf0e552f48e734202719abRobert Greenwalt public void onReceive(Context content, Intent intent) { 4582a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt String action = intent.getAction(); 459ac051ae7ac62532c78f820a0c7347ca36b119132Mike Lockwood if (action.equals(Usb.ACTION_USB_STATE)) { 460ac051ae7ac62532c78f820a0c7347ca36b119132Mike Lockwood mUsbConnected = intent.getExtras().getBoolean(Usb.USB_CONNECTED); 461ac051ae7ac62532c78f820a0c7347ca36b119132Mike Lockwood updateUsbStatus(); 462030f5e18dfa71673708deb75e8aa1f196bebbd99Robert Greenwalt } else if (action.equals(Intent.ACTION_MEDIA_SHARED)) { 463030f5e18dfa71673708deb75e8aa1f196bebbd99Robert Greenwalt mUsbMassStorageOff = false; 464030f5e18dfa71673708deb75e8aa1f196bebbd99Robert Greenwalt updateUsbStatus(); 465030f5e18dfa71673708deb75e8aa1f196bebbd99Robert Greenwalt } 466030f5e18dfa71673708deb75e8aa1f196bebbd99Robert Greenwalt else if (action.equals(Intent.ACTION_MEDIA_UNSHARED)) { 467030f5e18dfa71673708deb75e8aa1f196bebbd99Robert Greenwalt mUsbMassStorageOff = true; 468030f5e18dfa71673708deb75e8aa1f196bebbd99Robert Greenwalt updateUsbStatus(); 4692a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt } else if (action.equals(ConnectivityManager.CONNECTIVITY_ACTION)) { 470924cc94caaab5e9ad0714e0877e871290316e2b1Robert Greenwalt if (DEBUG) Log.d(TAG, "Tethering got CONNECTIVITY_ACTION"); 4716a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt mTetherMasterSM.sendMessage(TetherMasterSM.CMD_UPSTREAM_CHANGED); 472c9d5fb7c95f158d9a31d534895373afcfad77806Robert Greenwalt } else if (action.equals(Intent.ACTION_BOOT_COMPLETED)) { 473c9d5fb7c95f158d9a31d534895373afcfad77806Robert Greenwalt mBooted = true; 474030f5e18dfa71673708deb75e8aa1f196bebbd99Robert Greenwalt updateUsbStatus(); 475d0e18ffb82b59d38aeaf0e552f48e734202719abRobert Greenwalt } 476d0e18ffb82b59d38aeaf0e552f48e734202719abRobert Greenwalt } 477d0e18ffb82b59d38aeaf0e552f48e734202719abRobert Greenwalt } 478d0e18ffb82b59d38aeaf0e552f48e734202719abRobert Greenwalt 47965ae29bd852ff468ad003af241d5177fe016c74aRobert Greenwalt // used on cable insert/remove 480d70a3d4e2d356aab4cac313f1f9d8272a5e3e8d0Robert Greenwalt private void enableUsbIfaces(boolean enable) { 48165ae29bd852ff468ad003af241d5177fe016c74aRobert Greenwalt IBinder b = ServiceManager.getService(Context.NETWORKMANAGEMENT_SERVICE); 48265ae29bd852ff468ad003af241d5177fe016c74aRobert Greenwalt INetworkManagementService service = INetworkManagementService.Stub.asInterface(b); 48365ae29bd852ff468ad003af241d5177fe016c74aRobert Greenwalt String[] ifaces = new String[0]; 48465ae29bd852ff468ad003af241d5177fe016c74aRobert Greenwalt try { 48565ae29bd852ff468ad003af241d5177fe016c74aRobert Greenwalt ifaces = service.listInterfaces(); 48665ae29bd852ff468ad003af241d5177fe016c74aRobert Greenwalt } catch (Exception e) { 48765ae29bd852ff468ad003af241d5177fe016c74aRobert Greenwalt Log.e(TAG, "Error listing Interfaces :" + e); 48865ae29bd852ff468ad003af241d5177fe016c74aRobert Greenwalt return; 48965ae29bd852ff468ad003af241d5177fe016c74aRobert Greenwalt } 49065ae29bd852ff468ad003af241d5177fe016c74aRobert Greenwalt for (String iface : ifaces) { 491a599fe7c0d8b4d4bdf4accb099cb17bebcb9088bRobert Greenwalt if (isUsb(iface)) { 492a599fe7c0d8b4d4bdf4accb099cb17bebcb9088bRobert Greenwalt if (enable) { 493a599fe7c0d8b4d4bdf4accb099cb17bebcb9088bRobert Greenwalt interfaceAdded(iface); 494a599fe7c0d8b4d4bdf4accb099cb17bebcb9088bRobert Greenwalt } else { 495a599fe7c0d8b4d4bdf4accb099cb17bebcb9088bRobert Greenwalt interfaceRemoved(iface); 49665ae29bd852ff468ad003af241d5177fe016c74aRobert Greenwalt } 49765ae29bd852ff468ad003af241d5177fe016c74aRobert Greenwalt } 49865ae29bd852ff468ad003af241d5177fe016c74aRobert Greenwalt } 49965ae29bd852ff468ad003af241d5177fe016c74aRobert Greenwalt } 50065ae29bd852ff468ad003af241d5177fe016c74aRobert Greenwalt 5016fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang // toggled when we enter/leave the fully tethered state 502d70a3d4e2d356aab4cac313f1f9d8272a5e3e8d0Robert Greenwalt private boolean enableUsbRndis(boolean enabled) { 503924cc94caaab5e9ad0714e0877e871290316e2b1Robert Greenwalt if (DEBUG) Log.d(TAG, "enableUsbRndis(" + enabled + ")"); 50465ae29bd852ff468ad003af241d5177fe016c74aRobert Greenwalt IBinder b = ServiceManager.getService(Context.NETWORKMANAGEMENT_SERVICE); 50565ae29bd852ff468ad003af241d5177fe016c74aRobert Greenwalt INetworkManagementService service = INetworkManagementService.Stub.asInterface(b); 50665ae29bd852ff468ad003af241d5177fe016c74aRobert Greenwalt 50765ae29bd852ff468ad003af241d5177fe016c74aRobert Greenwalt try { 50865ae29bd852ff468ad003af241d5177fe016c74aRobert Greenwalt if (enabled) { 50965ae29bd852ff468ad003af241d5177fe016c74aRobert Greenwalt synchronized (this) { 51065ae29bd852ff468ad003af241d5177fe016c74aRobert Greenwalt if (!service.isUsbRNDISStarted()) { 51165ae29bd852ff468ad003af241d5177fe016c74aRobert Greenwalt service.startUsbRNDIS(); 51265ae29bd852ff468ad003af241d5177fe016c74aRobert Greenwalt } 51365ae29bd852ff468ad003af241d5177fe016c74aRobert Greenwalt } 51465ae29bd852ff468ad003af241d5177fe016c74aRobert Greenwalt } else { 51565ae29bd852ff468ad003af241d5177fe016c74aRobert Greenwalt if (service.isUsbRNDISStarted()) { 51665ae29bd852ff468ad003af241d5177fe016c74aRobert Greenwalt service.stopUsbRNDIS(); 51765ae29bd852ff468ad003af241d5177fe016c74aRobert Greenwalt } 51865ae29bd852ff468ad003af241d5177fe016c74aRobert Greenwalt } 51965ae29bd852ff468ad003af241d5177fe016c74aRobert Greenwalt } catch (Exception e) { 52065ae29bd852ff468ad003af241d5177fe016c74aRobert Greenwalt Log.e(TAG, "Error toggling usb RNDIS :" + e); 52165ae29bd852ff468ad003af241d5177fe016c74aRobert Greenwalt return false; 52265ae29bd852ff468ad003af241d5177fe016c74aRobert Greenwalt } 52365ae29bd852ff468ad003af241d5177fe016c74aRobert Greenwalt return true; 52465ae29bd852ff468ad003af241d5177fe016c74aRobert Greenwalt } 52565ae29bd852ff468ad003af241d5177fe016c74aRobert Greenwalt 52665ae29bd852ff468ad003af241d5177fe016c74aRobert Greenwalt // configured when we start tethering and unconfig'd on error or conclusion 527d70a3d4e2d356aab4cac313f1f9d8272a5e3e8d0Robert Greenwalt private boolean configureUsbIface(boolean enabled) { 528924cc94caaab5e9ad0714e0877e871290316e2b1Robert Greenwalt if (DEBUG) Log.d(TAG, "configureUsbIface(" + enabled + ")"); 52965ae29bd852ff468ad003af241d5177fe016c74aRobert Greenwalt 53065ae29bd852ff468ad003af241d5177fe016c74aRobert Greenwalt IBinder b = ServiceManager.getService(Context.NETWORKMANAGEMENT_SERVICE); 53165ae29bd852ff468ad003af241d5177fe016c74aRobert Greenwalt INetworkManagementService service = INetworkManagementService.Stub.asInterface(b); 53265ae29bd852ff468ad003af241d5177fe016c74aRobert Greenwalt 53365ae29bd852ff468ad003af241d5177fe016c74aRobert Greenwalt // bring toggle the interfaces 53465ae29bd852ff468ad003af241d5177fe016c74aRobert Greenwalt String[] ifaces = new String[0]; 53565ae29bd852ff468ad003af241d5177fe016c74aRobert Greenwalt try { 53665ae29bd852ff468ad003af241d5177fe016c74aRobert Greenwalt ifaces = service.listInterfaces(); 53765ae29bd852ff468ad003af241d5177fe016c74aRobert Greenwalt } catch (Exception e) { 53865ae29bd852ff468ad003af241d5177fe016c74aRobert Greenwalt Log.e(TAG, "Error listing Interfaces :" + e); 53965ae29bd852ff468ad003af241d5177fe016c74aRobert Greenwalt return false; 54065ae29bd852ff468ad003af241d5177fe016c74aRobert Greenwalt } 54165ae29bd852ff468ad003af241d5177fe016c74aRobert Greenwalt for (String iface : ifaces) { 542a599fe7c0d8b4d4bdf4accb099cb17bebcb9088bRobert Greenwalt if (isUsb(iface)) { 543a599fe7c0d8b4d4bdf4accb099cb17bebcb9088bRobert Greenwalt InterfaceConfiguration ifcg = null; 544a599fe7c0d8b4d4bdf4accb099cb17bebcb9088bRobert Greenwalt try { 545a599fe7c0d8b4d4bdf4accb099cb17bebcb9088bRobert Greenwalt ifcg = service.getInterfaceConfig(iface); 546a599fe7c0d8b4d4bdf4accb099cb17bebcb9088bRobert Greenwalt if (ifcg != null) { 547bfb7bfa53847832db2a3eb05e5eff7cb974c3c7aRobert Greenwalt String[] addr = USB_NEAR_IFACE_ADDR.split("\\."); 548bfb7bfa53847832db2a3eb05e5eff7cb974c3c7aRobert Greenwalt ifcg.ipAddr = (Integer.parseInt(addr[0]) << 24) + 549bfb7bfa53847832db2a3eb05e5eff7cb974c3c7aRobert Greenwalt (Integer.parseInt(addr[1]) << 16) + 550bfb7bfa53847832db2a3eb05e5eff7cb974c3c7aRobert Greenwalt (Integer.parseInt(addr[2]) << 8) + 551bfb7bfa53847832db2a3eb05e5eff7cb974c3c7aRobert Greenwalt (Integer.parseInt(addr[3])); 552bfb7bfa53847832db2a3eb05e5eff7cb974c3c7aRobert Greenwalt addr = USB_NETMASK.split("\\."); 553bfb7bfa53847832db2a3eb05e5eff7cb974c3c7aRobert Greenwalt ifcg.netmask = (Integer.parseInt(addr[0]) << 24) + 554bfb7bfa53847832db2a3eb05e5eff7cb974c3c7aRobert Greenwalt (Integer.parseInt(addr[1]) << 16) + 555bfb7bfa53847832db2a3eb05e5eff7cb974c3c7aRobert Greenwalt (Integer.parseInt(addr[2]) << 8) + 556bfb7bfa53847832db2a3eb05e5eff7cb974c3c7aRobert Greenwalt (Integer.parseInt(addr[3])); 557a599fe7c0d8b4d4bdf4accb099cb17bebcb9088bRobert Greenwalt if (enabled) { 558a599fe7c0d8b4d4bdf4accb099cb17bebcb9088bRobert Greenwalt ifcg.interfaceFlags = ifcg.interfaceFlags.replace("down", "up"); 559a599fe7c0d8b4d4bdf4accb099cb17bebcb9088bRobert Greenwalt } else { 560a599fe7c0d8b4d4bdf4accb099cb17bebcb9088bRobert Greenwalt ifcg.interfaceFlags = ifcg.interfaceFlags.replace("up", "down"); 56165ae29bd852ff468ad003af241d5177fe016c74aRobert Greenwalt } 562a599fe7c0d8b4d4bdf4accb099cb17bebcb9088bRobert Greenwalt ifcg.interfaceFlags = ifcg.interfaceFlags.replace("running", ""); 563a599fe7c0d8b4d4bdf4accb099cb17bebcb9088bRobert Greenwalt ifcg.interfaceFlags = ifcg.interfaceFlags.replace(" "," "); 564a599fe7c0d8b4d4bdf4accb099cb17bebcb9088bRobert Greenwalt service.setInterfaceConfig(iface, ifcg); 56565ae29bd852ff468ad003af241d5177fe016c74aRobert Greenwalt } 566a599fe7c0d8b4d4bdf4accb099cb17bebcb9088bRobert Greenwalt } catch (Exception e) { 567a599fe7c0d8b4d4bdf4accb099cb17bebcb9088bRobert Greenwalt Log.e(TAG, "Error configuring interface " + iface + ", :" + e); 568a599fe7c0d8b4d4bdf4accb099cb17bebcb9088bRobert Greenwalt return false; 56965ae29bd852ff468ad003af241d5177fe016c74aRobert Greenwalt } 57065ae29bd852ff468ad003af241d5177fe016c74aRobert Greenwalt } 57165ae29bd852ff468ad003af241d5177fe016c74aRobert Greenwalt } 57265ae29bd852ff468ad003af241d5177fe016c74aRobert Greenwalt 57365ae29bd852ff468ad003af241d5177fe016c74aRobert Greenwalt return true; 57465ae29bd852ff468ad003af241d5177fe016c74aRobert Greenwalt } 57565ae29bd852ff468ad003af241d5177fe016c74aRobert Greenwalt 5762a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt public String[] getTetherableUsbRegexs() { 5772a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt return mTetherableUsbRegexs; 5782a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt } 5792a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt 5802a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt public String[] getTetherableWifiRegexs() { 5812a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt return mTetherableWifiRegexs; 5822a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt } 5832a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt 5846fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang public String[] getTetherableBluetoothRegexs() { 5856fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang return mTetherableBluetoothRegexs; 5866fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang } 5876fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang 588c9d5fb7c95f158d9a31d534895373afcfad77806Robert Greenwalt public String[] getUpstreamIfaceRegexs() { 589c9d5fb7c95f158d9a31d534895373afcfad77806Robert Greenwalt return mUpstreamIfaceRegexs; 590c9d5fb7c95f158d9a31d534895373afcfad77806Robert Greenwalt } 591c9d5fb7c95f158d9a31d534895373afcfad77806Robert Greenwalt 592c9d5fb7c95f158d9a31d534895373afcfad77806Robert Greenwalt public boolean isDunRequired() { 59377b32ddbbeeb13a07b16f23af705567c75a8e3dfRobert Greenwalt boolean defaultVal = mContext.getResources().getBoolean( 59477b32ddbbeeb13a07b16f23af705567c75a8e3dfRobert Greenwalt com.android.internal.R.bool.config_tether_dun_required); 59577b32ddbbeeb13a07b16f23af705567c75a8e3dfRobert Greenwalt boolean result = (Settings.Secure.getInt(mContext.getContentResolver(), 59677b32ddbbeeb13a07b16f23af705567c75a8e3dfRobert Greenwalt Settings.Secure.TETHER_DUN_REQUIRED, (defaultVal ? 1 : 0)) == 1); 59777b32ddbbeeb13a07b16f23af705567c75a8e3dfRobert Greenwalt return result; 598c9d5fb7c95f158d9a31d534895373afcfad77806Robert Greenwalt } 599c9d5fb7c95f158d9a31d534895373afcfad77806Robert Greenwalt 6002a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt public String[] getTetheredIfaces() { 6012a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt ArrayList<String> list = new ArrayList<String>(); 6022a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt synchronized (mIfaces) { 6032a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt Set keys = mIfaces.keySet(); 6042a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt for (Object key : keys) { 6052a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt TetherInterfaceSM sm = mIfaces.get(key); 6062a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt if (sm.isTethered()) { 6072a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt list.add((String)key); 6082a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt } 6092a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt } 6102a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt } 6112a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt String[] retVal = new String[list.size()]; 6122a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt for (int i=0; i < list.size(); i++) { 6132a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt retVal[i] = list.get(i); 6142a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt } 6152a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt return retVal; 6162a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt } 6172a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt 6182a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt public String[] getTetherableIfaces() { 6192a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt ArrayList<String> list = new ArrayList<String>(); 6202a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt synchronized (mIfaces) { 6212a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt Set keys = mIfaces.keySet(); 6222a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt for (Object key : keys) { 6232a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt TetherInterfaceSM sm = mIfaces.get(key); 6242a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt if (sm.isAvailable()) { 6252a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt list.add((String)key); 6262a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt } 6272a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt } 6282a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt } 6292a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt String[] retVal = new String[list.size()]; 6302a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt for (int i=0; i < list.size(); i++) { 6312a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt retVal[i] = list.get(i); 6322a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt } 6332a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt return retVal; 6342a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt } 6352a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt 6365a73506cdd466f2b96686ced3ff0f7ca224d1143Robert Greenwalt public String[] getErroredIfaces() { 6375a73506cdd466f2b96686ced3ff0f7ca224d1143Robert Greenwalt ArrayList<String> list = new ArrayList<String>(); 6385a73506cdd466f2b96686ced3ff0f7ca224d1143Robert Greenwalt synchronized (mIfaces) { 6395a73506cdd466f2b96686ced3ff0f7ca224d1143Robert Greenwalt Set keys = mIfaces.keySet(); 6405a73506cdd466f2b96686ced3ff0f7ca224d1143Robert Greenwalt for (Object key : keys) { 6415a73506cdd466f2b96686ced3ff0f7ca224d1143Robert Greenwalt TetherInterfaceSM sm = mIfaces.get(key); 6425a73506cdd466f2b96686ced3ff0f7ca224d1143Robert Greenwalt if (sm.isErrored()) { 6435a73506cdd466f2b96686ced3ff0f7ca224d1143Robert Greenwalt list.add((String)key); 6445a73506cdd466f2b96686ced3ff0f7ca224d1143Robert Greenwalt } 6455a73506cdd466f2b96686ced3ff0f7ca224d1143Robert Greenwalt } 6465a73506cdd466f2b96686ced3ff0f7ca224d1143Robert Greenwalt } 6475a73506cdd466f2b96686ced3ff0f7ca224d1143Robert Greenwalt String[] retVal = new String[list.size()]; 6485a73506cdd466f2b96686ced3ff0f7ca224d1143Robert Greenwalt for (int i= 0; i< list.size(); i++) { 6495a73506cdd466f2b96686ced3ff0f7ca224d1143Robert Greenwalt retVal[i] = list.get(i); 6505a73506cdd466f2b96686ced3ff0f7ca224d1143Robert Greenwalt } 6515a73506cdd466f2b96686ced3ff0f7ca224d1143Robert Greenwalt return retVal; 6525a73506cdd466f2b96686ced3ff0f7ca224d1143Robert Greenwalt } 6535a73506cdd466f2b96686ced3ff0f7ca224d1143Robert Greenwalt 6542a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt 6552a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt class TetherInterfaceSM extends HierarchicalStateMachine { 6562a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt // notification from the master SM that it's not in tether mode 6576a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt static final int CMD_TETHER_MODE_DEAD = 1; 6582a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt // request from the user that it wants to tether 6596a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt static final int CMD_TETHER_REQUESTED = 2; 6602a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt // request from the user that it wants to untether 6616a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt static final int CMD_TETHER_UNREQUESTED = 3; 6622a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt // notification that this interface is down 6636a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt static final int CMD_INTERFACE_DOWN = 4; 6642a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt // notification that this interface is up 6656a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt static final int CMD_INTERFACE_UP = 5; 6662a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt // notification from the master SM that it had an error turning on cellular dun 6676a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt static final int CMD_CELL_DUN_ERROR = 6; 6682a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt // notification from the master SM that it had trouble enabling IP Forwarding 6696a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt static final int CMD_IP_FORWARDING_ENABLE_ERROR = 7; 6702a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt // notification from the master SM that it had trouble disabling IP Forwarding 6716a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt static final int CMD_IP_FORWARDING_DISABLE_ERROR = 8; 6722a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt // notification from the master SM that it had trouble staring tethering 6736a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt static final int CMD_START_TETHERING_ERROR = 9; 6742a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt // notification from the master SM that it had trouble stopping tethering 6756a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt static final int CMD_STOP_TETHERING_ERROR = 10; 6762a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt // notification from the master SM that it had trouble setting the DNS forwarders 6776a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt static final int CMD_SET_DNS_FORWARDERS_ERROR = 11; 6786a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt // the upstream connection has changed 679951749ba2e014566553d17c512e947472951a060Wink Saville static final int CMD_TETHER_CONNECTION_CHANGED = 12; 6802a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt 6812a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt private HierarchicalState mDefaultState; 6822a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt 6832a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt private HierarchicalState mInitialState; 6842a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt private HierarchicalState mStartingState; 6852a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt private HierarchicalState mTetheredState; 6862a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt 6872a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt private HierarchicalState mUnavailableState; 6882a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt 6892a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt private boolean mAvailable; 6902a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt private boolean mTethered; 6915a73506cdd466f2b96686ced3ff0f7ca224d1143Robert Greenwalt int mLastError; 6922a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt 6932a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt String mIfaceName; 6946a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt String mMyUpstreamIfaceName; // may change over time 6956a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt 69665ae29bd852ff468ad003af241d5177fe016c74aRobert Greenwalt boolean mUsb; 6972a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt 698dfadaeac088cabce854d8f476405cd412f82593aRobert Greenwalt TetherInterfaceSM(String name, Looper looper, boolean usb) { 699dfadaeac088cabce854d8f476405cd412f82593aRobert Greenwalt super(name, looper); 7002a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt mIfaceName = name; 70165ae29bd852ff468ad003af241d5177fe016c74aRobert Greenwalt mUsb = usb; 7025a73506cdd466f2b96686ced3ff0f7ca224d1143Robert Greenwalt setLastError(ConnectivityManager.TETHER_ERROR_NO_ERROR); 7032a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt 7042a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt mInitialState = new InitialState(); 7052a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt addState(mInitialState); 7062a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt mStartingState = new StartingState(); 7072a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt addState(mStartingState); 7082a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt mTetheredState = new TetheredState(); 7092a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt addState(mTetheredState); 7102a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt mUnavailableState = new UnavailableState(); 7112a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt addState(mUnavailableState); 7122a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt 7132a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt setInitialState(mInitialState); 7142a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt } 7152a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt 7162a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt public String toString() { 7172a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt String res = new String(); 7182a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt res += mIfaceName + " - "; 7192a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt HierarchicalState current = getCurrentState(); 7202a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt if (current == mInitialState) res += "InitialState"; 7212a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt if (current == mStartingState) res += "StartingState"; 7222a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt if (current == mTetheredState) res += "TetheredState"; 7232a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt if (current == mUnavailableState) res += "UnavailableState"; 7242a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt if (mAvailable) res += " - Available"; 7252a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt if (mTethered) res += " - Tethered"; 7265a73506cdd466f2b96686ced3ff0f7ca224d1143Robert Greenwalt res += " - lastError =" + mLastError; 7272a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt return res; 7282a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt } 7292a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt 7305a73506cdd466f2b96686ced3ff0f7ca224d1143Robert Greenwalt public synchronized int getLastError() { 7315a73506cdd466f2b96686ced3ff0f7ca224d1143Robert Greenwalt return mLastError; 7325a73506cdd466f2b96686ced3ff0f7ca224d1143Robert Greenwalt } 7335a73506cdd466f2b96686ced3ff0f7ca224d1143Robert Greenwalt 7345a73506cdd466f2b96686ced3ff0f7ca224d1143Robert Greenwalt private synchronized void setLastError(int error) { 7355a73506cdd466f2b96686ced3ff0f7ca224d1143Robert Greenwalt mLastError = error; 7365a73506cdd466f2b96686ced3ff0f7ca224d1143Robert Greenwalt 7375a73506cdd466f2b96686ced3ff0f7ca224d1143Robert Greenwalt if (isErrored()) { 7385a73506cdd466f2b96686ced3ff0f7ca224d1143Robert Greenwalt if (mUsb) { 7395a73506cdd466f2b96686ced3ff0f7ca224d1143Robert Greenwalt // note everything's been unwound by this point so nothing to do on 7405a73506cdd466f2b96686ced3ff0f7ca224d1143Robert Greenwalt // further error.. 7415a73506cdd466f2b96686ced3ff0f7ca224d1143Robert Greenwalt Tethering.this.configureUsbIface(false); 7425a73506cdd466f2b96686ced3ff0f7ca224d1143Robert Greenwalt } 7435a73506cdd466f2b96686ced3ff0f7ca224d1143Robert Greenwalt } 7445a73506cdd466f2b96686ced3ff0f7ca224d1143Robert Greenwalt } 7455a73506cdd466f2b96686ced3ff0f7ca224d1143Robert Greenwalt 7462a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt // synchronized between this getter and the following setter 7472a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt public synchronized boolean isAvailable() { 7482a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt return mAvailable; 7492a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt } 7502a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt 7512a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt private synchronized void setAvailable(boolean available) { 7522a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt mAvailable = available; 7532a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt } 7542a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt 7552a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt // synchronized between this getter and the following setter 7562a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt public synchronized boolean isTethered() { 7572a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt return mTethered; 7582a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt } 7592a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt 7602a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt private synchronized void setTethered(boolean tethered) { 7612a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt mTethered = tethered; 7622a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt } 7632a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt 7642a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt // synchronized between this getter and the following setter 7652a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt public synchronized boolean isErrored() { 7665a73506cdd466f2b96686ced3ff0f7ca224d1143Robert Greenwalt return (mLastError != ConnectivityManager.TETHER_ERROR_NO_ERROR); 7672a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt } 7682a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt 7692a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt class InitialState extends HierarchicalState { 7702a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt @Override 7712a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt public void enter() { 7722a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt setAvailable(true); 7732a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt setTethered(false); 7742a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt sendTetherStateChangedBroadcast(); 7752a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt } 7762a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt 7772a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt @Override 7782a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt public boolean processMessage(Message message) { 779924cc94caaab5e9ad0714e0877e871290316e2b1Robert Greenwalt if (DEBUG) Log.d(TAG, "InitialState.processMessage what=" + message.what); 7802a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt boolean retValue = true; 7812a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt switch (message.what) { 7822a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt case CMD_TETHER_REQUESTED: 7835a73506cdd466f2b96686ced3ff0f7ca224d1143Robert Greenwalt setLastError(ConnectivityManager.TETHER_ERROR_NO_ERROR); 7846a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt mTetherMasterSM.sendMessage(TetherMasterSM.CMD_TETHER_MODE_REQUESTED, 7856a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt TetherInterfaceSM.this); 7862a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt transitionTo(mStartingState); 7872a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt break; 7882a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt case CMD_INTERFACE_DOWN: 7892a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt transitionTo(mUnavailableState); 7902a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt break; 7912a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt default: 7922a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt retValue = false; 7932a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt break; 7942a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt } 7952a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt return retValue; 7962a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt } 7972a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt } 7982a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt 7992a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt class StartingState extends HierarchicalState { 8002a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt @Override 8012a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt public void enter() { 8022a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt setAvailable(false); 80365ae29bd852ff468ad003af241d5177fe016c74aRobert Greenwalt if (mUsb) { 804d70a3d4e2d356aab4cac313f1f9d8272a5e3e8d0Robert Greenwalt if (!Tethering.this.configureUsbIface(true)) { 8056a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt mTetherMasterSM.sendMessage(TetherMasterSM.CMD_TETHER_MODE_UNREQUESTED, 8066a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt TetherInterfaceSM.this); 8075a73506cdd466f2b96686ced3ff0f7ca224d1143Robert Greenwalt setLastError(ConnectivityManager.TETHER_ERROR_IFACE_CFG_ERROR); 8085a73506cdd466f2b96686ced3ff0f7ca224d1143Robert Greenwalt 809951749ba2e014566553d17c512e947472951a060Wink Saville transitionTo(mInitialState); 81065ae29bd852ff468ad003af241d5177fe016c74aRobert Greenwalt return; 81165ae29bd852ff468ad003af241d5177fe016c74aRobert Greenwalt } 81265ae29bd852ff468ad003af241d5177fe016c74aRobert Greenwalt } 8132a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt sendTetherStateChangedBroadcast(); 8146a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt 815951749ba2e014566553d17c512e947472951a060Wink Saville // Skipping StartingState 816951749ba2e014566553d17c512e947472951a060Wink Saville transitionTo(mTetheredState); 8172a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt } 8182a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt @Override 8192a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt public boolean processMessage(Message message) { 820924cc94caaab5e9ad0714e0877e871290316e2b1Robert Greenwalt if (DEBUG) Log.d(TAG, "StartingState.processMessage what=" + message.what); 8212a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt boolean retValue = true; 8222a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt switch (message.what) { 8232a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt // maybe a parent class? 8242a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt case CMD_TETHER_UNREQUESTED: 8256a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt mTetherMasterSM.sendMessage(TetherMasterSM.CMD_TETHER_MODE_UNREQUESTED, 8266a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt TetherInterfaceSM.this); 82765ae29bd852ff468ad003af241d5177fe016c74aRobert Greenwalt if (mUsb) { 828d70a3d4e2d356aab4cac313f1f9d8272a5e3e8d0Robert Greenwalt if (!Tethering.this.configureUsbIface(false)) { 8295a73506cdd466f2b96686ced3ff0f7ca224d1143Robert Greenwalt setLastErrorAndTransitionToInitialState( 8305a73506cdd466f2b96686ced3ff0f7ca224d1143Robert Greenwalt ConnectivityManager.TETHER_ERROR_IFACE_CFG_ERROR); 83165ae29bd852ff468ad003af241d5177fe016c74aRobert Greenwalt break; 83265ae29bd852ff468ad003af241d5177fe016c74aRobert Greenwalt } 83365ae29bd852ff468ad003af241d5177fe016c74aRobert Greenwalt } 8342a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt transitionTo(mInitialState); 8352a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt break; 8362a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt case CMD_CELL_DUN_ERROR: 8372a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt case CMD_IP_FORWARDING_ENABLE_ERROR: 8382a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt case CMD_IP_FORWARDING_DISABLE_ERROR: 8392a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt case CMD_START_TETHERING_ERROR: 8402a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt case CMD_STOP_TETHERING_ERROR: 8412a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt case CMD_SET_DNS_FORWARDERS_ERROR: 8425a73506cdd466f2b96686ced3ff0f7ca224d1143Robert Greenwalt setLastErrorAndTransitionToInitialState( 8435a73506cdd466f2b96686ced3ff0f7ca224d1143Robert Greenwalt ConnectivityManager.TETHER_ERROR_MASTER_ERROR); 8442a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt break; 8452a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt case CMD_INTERFACE_DOWN: 8466a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt mTetherMasterSM.sendMessage(TetherMasterSM.CMD_TETHER_MODE_UNREQUESTED, 8476a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt TetherInterfaceSM.this); 8482a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt transitionTo(mUnavailableState); 8492a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt break; 8502a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt default: 8512a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt retValue = false; 8522a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt } 8532a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt return retValue; 8542a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt } 8552a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt } 8562a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt 8572a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt class TetheredState extends HierarchicalState { 8582a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt @Override 8592a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt public void enter() { 8602a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt IBinder b = ServiceManager.getService(Context.NETWORKMANAGEMENT_SERVICE); 8612a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt INetworkManagementService service = 8622a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt INetworkManagementService.Stub.asInterface(b); 8632a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt try { 8642a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt service.tetherInterface(mIfaceName); 8652a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt } catch (Exception e) { 8665a73506cdd466f2b96686ced3ff0f7ca224d1143Robert Greenwalt setLastError(ConnectivityManager.TETHER_ERROR_TETHER_IFACE_ERROR); 8675a73506cdd466f2b96686ced3ff0f7ca224d1143Robert Greenwalt 868951749ba2e014566553d17c512e947472951a060Wink Saville transitionTo(mInitialState); 8692a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt return; 8702a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt } 871d70a3d4e2d356aab4cac313f1f9d8272a5e3e8d0Robert Greenwalt if (mUsb) Tethering.this.enableUsbRndis(true); 872924cc94caaab5e9ad0714e0877e871290316e2b1Robert Greenwalt if (DEBUG) Log.d(TAG, "Tethered " + mIfaceName); 8732a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt setAvailable(false); 8742a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt setTethered(true); 8752a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt sendTetherStateChangedBroadcast(); 8762a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt } 8772a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt @Override 87865ae29bd852ff468ad003af241d5177fe016c74aRobert Greenwalt public void exit() { 879d70a3d4e2d356aab4cac313f1f9d8272a5e3e8d0Robert Greenwalt if (mUsb) Tethering.this.enableUsbRndis(false); 88065ae29bd852ff468ad003af241d5177fe016c74aRobert Greenwalt } 88165ae29bd852ff468ad003af241d5177fe016c74aRobert Greenwalt @Override 8822a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt public boolean processMessage(Message message) { 883924cc94caaab5e9ad0714e0877e871290316e2b1Robert Greenwalt if (DEBUG) Log.d(TAG, "TetheredState.processMessage what=" + message.what); 8842a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt boolean retValue = true; 8852a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt boolean error = false; 8862a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt switch (message.what) { 8872a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt case CMD_TETHER_UNREQUESTED: 8882a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt case CMD_INTERFACE_DOWN: 8892a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt IBinder b = ServiceManager.getService(Context.NETWORKMANAGEMENT_SERVICE); 8902a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt INetworkManagementService service = 8912a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt INetworkManagementService.Stub.asInterface(b); 8926a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt if (mMyUpstreamIfaceName != null) { 8935a73506cdd466f2b96686ced3ff0f7ca224d1143Robert Greenwalt try { 8946a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt service.disableNat(mIfaceName, mMyUpstreamIfaceName); 895b37f0c6513241f79a6ea0e3c162dc540d028b60cRobert Greenwalt mMyUpstreamIfaceName = null; 8966a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt } catch (Exception e) { 8976a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt try { 8986a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt service.untetherInterface(mIfaceName); 8996a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt } catch (Exception ee) {} 9005a73506cdd466f2b96686ced3ff0f7ca224d1143Robert Greenwalt 9016a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt setLastErrorAndTransitionToInitialState( 9026a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt ConnectivityManager.TETHER_ERROR_DISABLE_NAT_ERROR); 9036a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt break; 9046a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt } 9052a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt } 9062a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt try { 9072a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt service.untetherInterface(mIfaceName); 9082a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt } catch (Exception e) { 9095a73506cdd466f2b96686ced3ff0f7ca224d1143Robert Greenwalt setLastErrorAndTransitionToInitialState( 9105a73506cdd466f2b96686ced3ff0f7ca224d1143Robert Greenwalt ConnectivityManager.TETHER_ERROR_UNTETHER_IFACE_ERROR); 9112a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt break; 9122a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt } 9136a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt mTetherMasterSM.sendMessage(TetherMasterSM.CMD_TETHER_MODE_UNREQUESTED, 9146a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt TetherInterfaceSM.this); 9152a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt if (message.what == CMD_TETHER_UNREQUESTED) { 91665ae29bd852ff468ad003af241d5177fe016c74aRobert Greenwalt if (mUsb) { 917d70a3d4e2d356aab4cac313f1f9d8272a5e3e8d0Robert Greenwalt if (!Tethering.this.configureUsbIface(false)) { 9185a73506cdd466f2b96686ced3ff0f7ca224d1143Robert Greenwalt setLastError( 9195a73506cdd466f2b96686ced3ff0f7ca224d1143Robert Greenwalt ConnectivityManager.TETHER_ERROR_IFACE_CFG_ERROR); 92065ae29bd852ff468ad003af241d5177fe016c74aRobert Greenwalt } 92165ae29bd852ff468ad003af241d5177fe016c74aRobert Greenwalt } 9225a73506cdd466f2b96686ced3ff0f7ca224d1143Robert Greenwalt transitionTo(mInitialState); 9232a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt } else if (message.what == CMD_INTERFACE_DOWN) { 9242a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt transitionTo(mUnavailableState); 9252a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt } 926924cc94caaab5e9ad0714e0877e871290316e2b1Robert Greenwalt if (DEBUG) Log.d(TAG, "Untethered " + mIfaceName); 9272a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt break; 9286a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt case CMD_TETHER_CONNECTION_CHANGED: 9296a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt String newUpstreamIfaceName = (String)(message.obj); 9306a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt b = ServiceManager.getService(Context.NETWORKMANAGEMENT_SERVICE); 9316a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt service = INetworkManagementService.Stub.asInterface(b); 9326a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt 9336a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt if (mMyUpstreamIfaceName != null) { 9346a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt try { 9356a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt service.disableNat(mIfaceName, mMyUpstreamIfaceName); 936b37f0c6513241f79a6ea0e3c162dc540d028b60cRobert Greenwalt mMyUpstreamIfaceName = null; 9376a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt } catch (Exception e) { 9386a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt try { 9396a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt service.untetherInterface(mIfaceName); 9406a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt } catch (Exception ee) {} 9416a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt 9426a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt setLastErrorAndTransitionToInitialState( 9436a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt ConnectivityManager.TETHER_ERROR_DISABLE_NAT_ERROR); 9446a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt break; 9456a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt } 9466a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt } 9476a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt if (newUpstreamIfaceName != null) { 9486a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt try { 9496a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt service.enableNat(mIfaceName, newUpstreamIfaceName); 9506a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt } catch (Exception e) { 9516a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt try { 9526a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt service.untetherInterface(mIfaceName); 9536a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt } catch (Exception ee) {} 9546a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt 9556a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt setLastError(ConnectivityManager.TETHER_ERROR_ENABLE_NAT_ERROR); 9566a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt transitionTo(mInitialState); 9576a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt return true; 9586a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt } 9596a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt } 9606a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt mMyUpstreamIfaceName = newUpstreamIfaceName; 9616a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt break; 9622a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt case CMD_CELL_DUN_ERROR: 9632a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt case CMD_IP_FORWARDING_ENABLE_ERROR: 9642a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt case CMD_IP_FORWARDING_DISABLE_ERROR: 9652a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt case CMD_START_TETHERING_ERROR: 9662a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt case CMD_STOP_TETHERING_ERROR: 9672a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt case CMD_SET_DNS_FORWARDERS_ERROR: 9682a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt error = true; 9692a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt // fall through 9702a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt case CMD_TETHER_MODE_DEAD: 9712a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt b = ServiceManager.getService(Context.NETWORKMANAGEMENT_SERVICE); 9722a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt service = INetworkManagementService.Stub.asInterface(b); 9736a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt if (mMyUpstreamIfaceName != null) { 9745a73506cdd466f2b96686ced3ff0f7ca224d1143Robert Greenwalt try { 9756a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt service.disableNat(mIfaceName, mMyUpstreamIfaceName); 976b37f0c6513241f79a6ea0e3c162dc540d028b60cRobert Greenwalt mMyUpstreamIfaceName = null; 9776a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt } catch (Exception e) { 9786a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt try { 9796a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt service.untetherInterface(mIfaceName); 9806a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt } catch (Exception ee) {} 9815a73506cdd466f2b96686ced3ff0f7ca224d1143Robert Greenwalt 9826a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt setLastErrorAndTransitionToInitialState( 9836a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt ConnectivityManager.TETHER_ERROR_DISABLE_NAT_ERROR); 9846a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt break; 9856a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt } 9862a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt } 9872a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt try { 9882a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt service.untetherInterface(mIfaceName); 9892a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt } catch (Exception e) { 9905a73506cdd466f2b96686ced3ff0f7ca224d1143Robert Greenwalt setLastErrorAndTransitionToInitialState( 9915a73506cdd466f2b96686ced3ff0f7ca224d1143Robert Greenwalt ConnectivityManager.TETHER_ERROR_UNTETHER_IFACE_ERROR); 9922a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt break; 9932a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt } 9942a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt if (error) { 9955a73506cdd466f2b96686ced3ff0f7ca224d1143Robert Greenwalt setLastErrorAndTransitionToInitialState( 9965a73506cdd466f2b96686ced3ff0f7ca224d1143Robert Greenwalt ConnectivityManager.TETHER_ERROR_MASTER_ERROR); 9972a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt break; 9982a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt } 999924cc94caaab5e9ad0714e0877e871290316e2b1Robert Greenwalt if (DEBUG) Log.d(TAG, "Tether lost upstream connection " + mIfaceName); 10002a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt sendTetherStateChangedBroadcast(); 100165ae29bd852ff468ad003af241d5177fe016c74aRobert Greenwalt if (mUsb) { 1002d70a3d4e2d356aab4cac313f1f9d8272a5e3e8d0Robert Greenwalt if (!Tethering.this.configureUsbIface(false)) { 10035a73506cdd466f2b96686ced3ff0f7ca224d1143Robert Greenwalt setLastError(ConnectivityManager.TETHER_ERROR_IFACE_CFG_ERROR); 100465ae29bd852ff468ad003af241d5177fe016c74aRobert Greenwalt } 100565ae29bd852ff468ad003af241d5177fe016c74aRobert Greenwalt } 10062a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt transitionTo(mInitialState); 10072a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt break; 10082a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt default: 10092a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt retValue = false; 10102a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt break; 10112a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt } 10122a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt return retValue; 10132a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt } 10142a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt } 10152a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt 10162a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt class UnavailableState extends HierarchicalState { 10172a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt @Override 10182a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt public void enter() { 10192a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt setAvailable(false); 10205a73506cdd466f2b96686ced3ff0f7ca224d1143Robert Greenwalt setLastError(ConnectivityManager.TETHER_ERROR_NO_ERROR); 10212a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt setTethered(false); 10222a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt sendTetherStateChangedBroadcast(); 10232a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt } 10242a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt @Override 10252a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt public boolean processMessage(Message message) { 10262a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt boolean retValue = true; 10272a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt switch (message.what) { 10282a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt case CMD_INTERFACE_UP: 10292a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt transitionTo(mInitialState); 10302a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt break; 10312a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt default: 10322a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt retValue = false; 10332a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt break; 10342a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt } 10352a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt return retValue; 10362a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt } 10372a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt } 10382a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt 10395a73506cdd466f2b96686ced3ff0f7ca224d1143Robert Greenwalt void setLastErrorAndTransitionToInitialState(int error) { 10405a73506cdd466f2b96686ced3ff0f7ca224d1143Robert Greenwalt setLastError(error); 10415a73506cdd466f2b96686ced3ff0f7ca224d1143Robert Greenwalt transitionTo(mInitialState); 10422a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt } 104365ae29bd852ff468ad003af241d5177fe016c74aRobert Greenwalt 10442a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt } 10452a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt 10462a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt class TetherMasterSM extends HierarchicalStateMachine { 10472a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt // an interface SM has requested Tethering 10482a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt static final int CMD_TETHER_MODE_REQUESTED = 1; 10492a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt // an interface SM has unrequested Tethering 10502a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt static final int CMD_TETHER_MODE_UNREQUESTED = 2; 10516a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt // upstream connection change - do the right thing 10526a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt static final int CMD_UPSTREAM_CHANGED = 3; 10532a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt // we received notice that the cellular DUN connection is up 10546a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt static final int CMD_CELL_CONNECTION_RENEW = 4; 10556a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt // we don't have a valid upstream conn, check again after a delay 1056951749ba2e014566553d17c512e947472951a060Wink Saville static final int CMD_RETRY_UPSTREAM = 5; 10572a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt 10582a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt // This indicates what a timeout event relates to. A state that 10592a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt // sends itself a delayed timeout event and handles incoming timeout events 10602a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt // should inc this when it is entered and whenever it sends a new timeout event. 10612a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt // We do not flush the old ones. 10622a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt private int mSequenceNumber; 10632a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt 10642a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt private HierarchicalState mInitialState; 10652a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt private HierarchicalState mTetherModeAliveState; 10662a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt 10672a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt private HierarchicalState mSetIpForwardingEnabledErrorState; 10682a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt private HierarchicalState mSetIpForwardingDisabledErrorState; 10692a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt private HierarchicalState mStartTetheringErrorState; 10702a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt private HierarchicalState mStopTetheringErrorState; 10712a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt private HierarchicalState mSetDnsForwardersErrorState; 10722a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt 10732a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt private ArrayList mNotifyList; 10742a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt 10756a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt private boolean mConnectionRequested = false; 10762a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt 1077b37f0c6513241f79a6ea0e3c162dc540d028b60cRobert Greenwalt private String mUpstreamIfaceName = null; 1078b37f0c6513241f79a6ea0e3c162dc540d028b60cRobert Greenwalt 10796a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt private static final int UPSTREAM_SETTLE_TIME_MS = 10000; 10806a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt private static final int CELL_CONNECTION_RENEW_MS = 40000; 10812a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt 1082dfadaeac088cabce854d8f476405cd412f82593aRobert Greenwalt TetherMasterSM(String name, Looper looper) { 1083dfadaeac088cabce854d8f476405cd412f82593aRobert Greenwalt super(name, looper); 10842a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt 10852a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt //Add states 10862a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt mInitialState = new InitialState(); 10872a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt addState(mInitialState); 10882a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt mTetherModeAliveState = new TetherModeAliveState(); 10892a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt addState(mTetherModeAliveState); 10902a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt 10912a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt mSetIpForwardingEnabledErrorState = new SetIpForwardingEnabledErrorState(); 10922a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt addState(mSetIpForwardingEnabledErrorState); 10932a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt mSetIpForwardingDisabledErrorState = new SetIpForwardingDisabledErrorState(); 10942a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt addState(mSetIpForwardingDisabledErrorState); 10952a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt mStartTetheringErrorState = new StartTetheringErrorState(); 10962a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt addState(mStartTetheringErrorState); 10972a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt mStopTetheringErrorState = new StopTetheringErrorState(); 10982a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt addState(mStopTetheringErrorState); 10992a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt mSetDnsForwardersErrorState = new SetDnsForwardersErrorState(); 11002a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt addState(mSetDnsForwardersErrorState); 11012a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt 11022a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt mNotifyList = new ArrayList(); 11032a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt setInitialState(mInitialState); 11042a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt } 11052a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt 1106d70a3d4e2d356aab4cac313f1f9d8272a5e3e8d0Robert Greenwalt class TetherMasterUtilState extends HierarchicalState { 11076a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt protected final static boolean TRY_TO_SETUP_MOBILE_CONNECTION = true; 11086a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt protected final static boolean WAIT_FOR_NETWORK_TO_SETTLE = false; 11096a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt 1110d70a3d4e2d356aab4cac313f1f9d8272a5e3e8d0Robert Greenwalt @Override 1111d70a3d4e2d356aab4cac313f1f9d8272a5e3e8d0Robert Greenwalt public boolean processMessage(Message m) { 1112d70a3d4e2d356aab4cac313f1f9d8272a5e3e8d0Robert Greenwalt return false; 1113d70a3d4e2d356aab4cac313f1f9d8272a5e3e8d0Robert Greenwalt } 11146a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt protected int turnOnMobileConnection() { 1115d70a3d4e2d356aab4cac313f1f9d8272a5e3e8d0Robert Greenwalt IBinder b = ServiceManager.getService(Context.CONNECTIVITY_SERVICE); 1116d70a3d4e2d356aab4cac313f1f9d8272a5e3e8d0Robert Greenwalt IConnectivityManager service = IConnectivityManager.Stub.asInterface(b); 1117d70a3d4e2d356aab4cac313f1f9d8272a5e3e8d0Robert Greenwalt int retValue = Phone.APN_REQUEST_FAILED; 1118d70a3d4e2d356aab4cac313f1f9d8272a5e3e8d0Robert Greenwalt try { 1119d70a3d4e2d356aab4cac313f1f9d8272a5e3e8d0Robert Greenwalt retValue = service.startUsingNetworkFeature(ConnectivityManager.TYPE_MOBILE, 112077e638dee8b8b0f9c0fcb5403f8c6fb97b52826fRobert Greenwalt (mDunRequired ? Phone.FEATURE_ENABLE_DUN : Phone.FEATURE_ENABLE_HIPRI), 1121c9d5fb7c95f158d9a31d534895373afcfad77806Robert Greenwalt new Binder()); 1122d70a3d4e2d356aab4cac313f1f9d8272a5e3e8d0Robert Greenwalt } catch (Exception e) { 1123d70a3d4e2d356aab4cac313f1f9d8272a5e3e8d0Robert Greenwalt } 11246a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt switch (retValue) { 11256a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt case Phone.APN_ALREADY_ACTIVE: 11266a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt case Phone.APN_REQUEST_STARTED: 11276a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt sendMessageDelayed(CMD_CELL_CONNECTION_RENEW, CELL_CONNECTION_RENEW_MS); 11286a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt mConnectionRequested = true; 11296a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt break; 11306a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt case Phone.APN_REQUEST_FAILED: 11316a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt default: 11326a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt mConnectionRequested = false; 11336a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt break; 11346a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt } 11356a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt 1136d70a3d4e2d356aab4cac313f1f9d8272a5e3e8d0Robert Greenwalt return retValue; 1137d70a3d4e2d356aab4cac313f1f9d8272a5e3e8d0Robert Greenwalt } 11386a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt protected boolean turnOffMobileConnection() { 11396a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt if (mConnectionRequested) { 11406a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt IBinder b = ServiceManager.getService(Context.CONNECTIVITY_SERVICE); 11416a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt IConnectivityManager service = 11426a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt IConnectivityManager.Stub.asInterface(b); 11436a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt try { 11446a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt service.stopUsingNetworkFeature(ConnectivityManager.TYPE_MOBILE, 114577e638dee8b8b0f9c0fcb5403f8c6fb97b52826fRobert Greenwalt (mDunRequired? Phone.FEATURE_ENABLE_DUN : 114677e638dee8b8b0f9c0fcb5403f8c6fb97b52826fRobert Greenwalt Phone.FEATURE_ENABLE_HIPRI)); 11476a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt } catch (Exception e) { 11486a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt return false; 11496a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt } 11506a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt mConnectionRequested = false; 1151d70a3d4e2d356aab4cac313f1f9d8272a5e3e8d0Robert Greenwalt } 1152d70a3d4e2d356aab4cac313f1f9d8272a5e3e8d0Robert Greenwalt return true; 1153d70a3d4e2d356aab4cac313f1f9d8272a5e3e8d0Robert Greenwalt } 11546a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt protected boolean turnOnMasterTetherSettings() { 1155d70a3d4e2d356aab4cac313f1f9d8272a5e3e8d0Robert Greenwalt IBinder b = ServiceManager.getService(Context.NETWORKMANAGEMENT_SERVICE); 1156d70a3d4e2d356aab4cac313f1f9d8272a5e3e8d0Robert Greenwalt INetworkManagementService service = 1157d70a3d4e2d356aab4cac313f1f9d8272a5e3e8d0Robert Greenwalt INetworkManagementService.Stub.asInterface(b); 1158d70a3d4e2d356aab4cac313f1f9d8272a5e3e8d0Robert Greenwalt try { 1159d70a3d4e2d356aab4cac313f1f9d8272a5e3e8d0Robert Greenwalt service.setIpForwardingEnabled(true); 1160d70a3d4e2d356aab4cac313f1f9d8272a5e3e8d0Robert Greenwalt } catch (Exception e) { 1161951749ba2e014566553d17c512e947472951a060Wink Saville transitionTo(mSetIpForwardingEnabledErrorState); 1162d70a3d4e2d356aab4cac313f1f9d8272a5e3e8d0Robert Greenwalt return false; 1163d70a3d4e2d356aab4cac313f1f9d8272a5e3e8d0Robert Greenwalt } 1164d70a3d4e2d356aab4cac313f1f9d8272a5e3e8d0Robert Greenwalt try { 1165bfb7bfa53847832db2a3eb05e5eff7cb974c3c7aRobert Greenwalt service.startTethering(mDhcpRange); 1166d70a3d4e2d356aab4cac313f1f9d8272a5e3e8d0Robert Greenwalt } catch (Exception e) { 1167951749ba2e014566553d17c512e947472951a060Wink Saville transitionTo(mStartTetheringErrorState); 1168d70a3d4e2d356aab4cac313f1f9d8272a5e3e8d0Robert Greenwalt return false; 1169d70a3d4e2d356aab4cac313f1f9d8272a5e3e8d0Robert Greenwalt } 1170d70a3d4e2d356aab4cac313f1f9d8272a5e3e8d0Robert Greenwalt try { 1171d70a3d4e2d356aab4cac313f1f9d8272a5e3e8d0Robert Greenwalt service.setDnsForwarders(mDnsServers); 1172d70a3d4e2d356aab4cac313f1f9d8272a5e3e8d0Robert Greenwalt } catch (Exception e) { 1173951749ba2e014566553d17c512e947472951a060Wink Saville transitionTo(mSetDnsForwardersErrorState); 1174d70a3d4e2d356aab4cac313f1f9d8272a5e3e8d0Robert Greenwalt return false; 1175d70a3d4e2d356aab4cac313f1f9d8272a5e3e8d0Robert Greenwalt } 1176d70a3d4e2d356aab4cac313f1f9d8272a5e3e8d0Robert Greenwalt return true; 1177d70a3d4e2d356aab4cac313f1f9d8272a5e3e8d0Robert Greenwalt } 11786a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt protected boolean turnOffMasterTetherSettings() { 1179d70a3d4e2d356aab4cac313f1f9d8272a5e3e8d0Robert Greenwalt IBinder b = ServiceManager.getService(Context.NETWORKMANAGEMENT_SERVICE); 1180d70a3d4e2d356aab4cac313f1f9d8272a5e3e8d0Robert Greenwalt INetworkManagementService service = 1181d70a3d4e2d356aab4cac313f1f9d8272a5e3e8d0Robert Greenwalt INetworkManagementService.Stub.asInterface(b); 1182d70a3d4e2d356aab4cac313f1f9d8272a5e3e8d0Robert Greenwalt try { 1183d70a3d4e2d356aab4cac313f1f9d8272a5e3e8d0Robert Greenwalt service.stopTethering(); 1184d70a3d4e2d356aab4cac313f1f9d8272a5e3e8d0Robert Greenwalt } catch (Exception e) { 1185d70a3d4e2d356aab4cac313f1f9d8272a5e3e8d0Robert Greenwalt transitionTo(mStopTetheringErrorState); 1186d70a3d4e2d356aab4cac313f1f9d8272a5e3e8d0Robert Greenwalt return false; 1187d70a3d4e2d356aab4cac313f1f9d8272a5e3e8d0Robert Greenwalt } 1188d70a3d4e2d356aab4cac313f1f9d8272a5e3e8d0Robert Greenwalt try { 1189d70a3d4e2d356aab4cac313f1f9d8272a5e3e8d0Robert Greenwalt service.setIpForwardingEnabled(false); 1190d70a3d4e2d356aab4cac313f1f9d8272a5e3e8d0Robert Greenwalt } catch (Exception e) { 1191d70a3d4e2d356aab4cac313f1f9d8272a5e3e8d0Robert Greenwalt transitionTo(mSetIpForwardingDisabledErrorState); 1192d70a3d4e2d356aab4cac313f1f9d8272a5e3e8d0Robert Greenwalt return false; 1193d70a3d4e2d356aab4cac313f1f9d8272a5e3e8d0Robert Greenwalt } 1194d70a3d4e2d356aab4cac313f1f9d8272a5e3e8d0Robert Greenwalt transitionTo(mInitialState); 1195d70a3d4e2d356aab4cac313f1f9d8272a5e3e8d0Robert Greenwalt return true; 1196d70a3d4e2d356aab4cac313f1f9d8272a5e3e8d0Robert Greenwalt } 11976a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt protected String findActiveUpstreamIface() { 1198c9d5fb7c95f158d9a31d534895373afcfad77806Robert Greenwalt // check for what iface we can use - if none found switch to error. 1199c9d5fb7c95f158d9a31d534895373afcfad77806Robert Greenwalt IBinder b = ServiceManager.getService(Context.NETWORKMANAGEMENT_SERVICE); 1200c9d5fb7c95f158d9a31d534895373afcfad77806Robert Greenwalt INetworkManagementService service = INetworkManagementService.Stub.asInterface(b); 1201c9d5fb7c95f158d9a31d534895373afcfad77806Robert Greenwalt 1202c9d5fb7c95f158d9a31d534895373afcfad77806Robert Greenwalt String[] ifaces = new String[0]; 1203c9d5fb7c95f158d9a31d534895373afcfad77806Robert Greenwalt try { 1204c9d5fb7c95f158d9a31d534895373afcfad77806Robert Greenwalt ifaces = service.listInterfaces(); 1205c9d5fb7c95f158d9a31d534895373afcfad77806Robert Greenwalt } catch (Exception e) { 1206c9d5fb7c95f158d9a31d534895373afcfad77806Robert Greenwalt Log.e(TAG, "Error listing Interfaces :" + e); 1207c9d5fb7c95f158d9a31d534895373afcfad77806Robert Greenwalt return null; 1208c9d5fb7c95f158d9a31d534895373afcfad77806Robert Greenwalt } 12096a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt 1210c9d5fb7c95f158d9a31d534895373afcfad77806Robert Greenwalt for (String iface : ifaces) { 1211c9d5fb7c95f158d9a31d534895373afcfad77806Robert Greenwalt for (String regex : mUpstreamIfaceRegexs) { 1212c9d5fb7c95f158d9a31d534895373afcfad77806Robert Greenwalt if (iface.matches(regex)) { 1213c9d5fb7c95f158d9a31d534895373afcfad77806Robert Greenwalt // verify it is up! 1214c9d5fb7c95f158d9a31d534895373afcfad77806Robert Greenwalt InterfaceConfiguration ifcg = null; 1215c9d5fb7c95f158d9a31d534895373afcfad77806Robert Greenwalt try { 1216c9d5fb7c95f158d9a31d534895373afcfad77806Robert Greenwalt ifcg = service.getInterfaceConfig(iface); 1217c9d5fb7c95f158d9a31d534895373afcfad77806Robert Greenwalt } catch (Exception e) { 1218c9d5fb7c95f158d9a31d534895373afcfad77806Robert Greenwalt Log.e(TAG, "Error getting iface config :" + e); 1219c9d5fb7c95f158d9a31d534895373afcfad77806Robert Greenwalt // ignore - try next 1220c9d5fb7c95f158d9a31d534895373afcfad77806Robert Greenwalt continue; 1221c9d5fb7c95f158d9a31d534895373afcfad77806Robert Greenwalt } 1222c9d5fb7c95f158d9a31d534895373afcfad77806Robert Greenwalt if (ifcg.interfaceFlags.contains("up")) { 1223c9d5fb7c95f158d9a31d534895373afcfad77806Robert Greenwalt return iface; 1224c9d5fb7c95f158d9a31d534895373afcfad77806Robert Greenwalt } 1225c9d5fb7c95f158d9a31d534895373afcfad77806Robert Greenwalt } 1226c9d5fb7c95f158d9a31d534895373afcfad77806Robert Greenwalt } 1227c9d5fb7c95f158d9a31d534895373afcfad77806Robert Greenwalt } 1228c9d5fb7c95f158d9a31d534895373afcfad77806Robert Greenwalt return null; 1229c9d5fb7c95f158d9a31d534895373afcfad77806Robert Greenwalt } 12306a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt protected void chooseUpstreamType(boolean tryCell) { 12316a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt // decide if the current upstream is good or not and if not 12326a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt // do something about it (start up DUN if required or HiPri if not) 12336a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt String iface = findActiveUpstreamIface(); 12346a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt IBinder b = ServiceManager.getService(Context.CONNECTIVITY_SERVICE); 12356a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt IConnectivityManager cm = IConnectivityManager.Stub.asInterface(b); 12366a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt mConnectionRequested = false; 1237924cc94caaab5e9ad0714e0877e871290316e2b1Robert Greenwalt if (DEBUG) { 1238924cc94caaab5e9ad0714e0877e871290316e2b1Robert Greenwalt Log.d(TAG, "chooseUpstreamType(" + tryCell + "), dunRequired =" 1239924cc94caaab5e9ad0714e0877e871290316e2b1Robert Greenwalt + mDunRequired + ", iface=" + iface); 1240924cc94caaab5e9ad0714e0877e871290316e2b1Robert Greenwalt } 124177e638dee8b8b0f9c0fcb5403f8c6fb97b52826fRobert Greenwalt if (iface != null) { 12426a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt try { 124377e638dee8b8b0f9c0fcb5403f8c6fb97b52826fRobert Greenwalt if (mDunRequired) { 124477e638dee8b8b0f9c0fcb5403f8c6fb97b52826fRobert Greenwalt // check if Dun is on - we can use that 124577e638dee8b8b0f9c0fcb5403f8c6fb97b52826fRobert Greenwalt NetworkInfo info = cm.getNetworkInfo( 124677e638dee8b8b0f9c0fcb5403f8c6fb97b52826fRobert Greenwalt ConnectivityManager.TYPE_MOBILE_DUN); 124777e638dee8b8b0f9c0fcb5403f8c6fb97b52826fRobert Greenwalt if (info.isConnected()) { 1248924cc94caaab5e9ad0714e0877e871290316e2b1Robert Greenwalt if (DEBUG) Log.d(TAG, "setting dun ifacename =" + iface); 124977e638dee8b8b0f9c0fcb5403f8c6fb97b52826fRobert Greenwalt // even if we're already connected - it may be somebody else's 125077e638dee8b8b0f9c0fcb5403f8c6fb97b52826fRobert Greenwalt // refcount, so add our own 125177e638dee8b8b0f9c0fcb5403f8c6fb97b52826fRobert Greenwalt turnOnMobileConnection(); 125277e638dee8b8b0f9c0fcb5403f8c6fb97b52826fRobert Greenwalt } else { 125377e638dee8b8b0f9c0fcb5403f8c6fb97b52826fRobert Greenwalt // verify the iface is not the default mobile - can't use that! 125477e638dee8b8b0f9c0fcb5403f8c6fb97b52826fRobert Greenwalt info = cm.getNetworkInfo(ConnectivityManager.TYPE_MOBILE); 125577e638dee8b8b0f9c0fcb5403f8c6fb97b52826fRobert Greenwalt if (info.isConnected()) { 125677e638dee8b8b0f9c0fcb5403f8c6fb97b52826fRobert Greenwalt iface = null; // can't accept this one 125777e638dee8b8b0f9c0fcb5403f8c6fb97b52826fRobert Greenwalt } 125877e638dee8b8b0f9c0fcb5403f8c6fb97b52826fRobert Greenwalt } 125977e638dee8b8b0f9c0fcb5403f8c6fb97b52826fRobert Greenwalt } else { 1260924cc94caaab5e9ad0714e0877e871290316e2b1Robert Greenwalt if (DEBUG) Log.d(TAG, "checking if hipri brought us this connection"); 12616a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt NetworkInfo info = cm.getNetworkInfo( 12626a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt ConnectivityManager.TYPE_MOBILE_HIPRI); 12636a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt if (info.isConnected()) { 1264924cc94caaab5e9ad0714e0877e871290316e2b1Robert Greenwalt if (DEBUG) Log.d(TAG, "yes - hipri in use"); 126577e638dee8b8b0f9c0fcb5403f8c6fb97b52826fRobert Greenwalt // even if we're already connected - it may be sombody else's 126677e638dee8b8b0f9c0fcb5403f8c6fb97b52826fRobert Greenwalt // refcount, so add our own 12676a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt turnOnMobileConnection(); 12682a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt } 12692a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt } 127077e638dee8b8b0f9c0fcb5403f8c6fb97b52826fRobert Greenwalt } catch (RemoteException e) { 127177e638dee8b8b0f9c0fcb5403f8c6fb97b52826fRobert Greenwalt Log.e(TAG, "RemoteException calling ConnectivityManager " + e); 127277e638dee8b8b0f9c0fcb5403f8c6fb97b52826fRobert Greenwalt iface = null; 12736a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt } 12746a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt } 127577e638dee8b8b0f9c0fcb5403f8c6fb97b52826fRobert Greenwalt // may have been set to null in the if above 127677e638dee8b8b0f9c0fcb5403f8c6fb97b52826fRobert Greenwalt if (iface == null ) { 127777e638dee8b8b0f9c0fcb5403f8c6fb97b52826fRobert Greenwalt if (tryCell == TRY_TO_SETUP_MOBILE_CONNECTION) { 127877e638dee8b8b0f9c0fcb5403f8c6fb97b52826fRobert Greenwalt turnOnMobileConnection(); 127977e638dee8b8b0f9c0fcb5403f8c6fb97b52826fRobert Greenwalt } 12806a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt // wait for things to settle and retry 12816a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt sendMessageDelayed(CMD_RETRY_UPSTREAM, UPSTREAM_SETTLE_TIME_MS); 12826a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt } 1283b37f0c6513241f79a6ea0e3c162dc540d028b60cRobert Greenwalt notifyTetheredOfNewUpstreamIface(iface); 12846a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt } 1285b37f0c6513241f79a6ea0e3c162dc540d028b60cRobert Greenwalt protected void notifyTetheredOfNewUpstreamIface(String ifaceName) { 1286924cc94caaab5e9ad0714e0877e871290316e2b1Robert Greenwalt if (DEBUG) Log.d(TAG, "notifying tethered with iface =" + ifaceName); 1287b37f0c6513241f79a6ea0e3c162dc540d028b60cRobert Greenwalt mUpstreamIfaceName = ifaceName; 12886a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt for (Object o : mNotifyList) { 12896a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt TetherInterfaceSM sm = (TetherInterfaceSM)o; 12906a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt sm.sendMessage(TetherInterfaceSM.CMD_TETHER_CONNECTION_CHANGED, 12916a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt ifaceName); 12922a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt } 12932a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt } 12942a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt } 12952a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt 12966a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt class InitialState extends TetherMasterUtilState { 12972a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt @Override 12982a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt public void enter() { 12996a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt mConnectionRequested = false; 13002a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt } 13012a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt @Override 13022a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt public boolean processMessage(Message message) { 1303924cc94caaab5e9ad0714e0877e871290316e2b1Robert Greenwalt if (DEBUG) Log.d(TAG, "MasterInitialState.processMessage what=" + message.what); 13042a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt boolean retValue = true; 13052a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt switch (message.what) { 13062a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt case CMD_TETHER_MODE_REQUESTED: 130777b32ddbbeeb13a07b16f23af705567c75a8e3dfRobert Greenwalt mDunRequired = isDunRequired(); 13082a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt TetherInterfaceSM who = (TetherInterfaceSM)message.obj; 1309924cc94caaab5e9ad0714e0877e871290316e2b1Robert Greenwalt if (DEBUG) Log.d(TAG, "Tether Mode requested by " + who.toString()); 13102a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt mNotifyList.add(who); 13116a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt transitionTo(mTetherModeAliveState); 13122a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt break; 13132a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt case CMD_TETHER_MODE_UNREQUESTED: 13142a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt who = (TetherInterfaceSM)message.obj; 1315924cc94caaab5e9ad0714e0877e871290316e2b1Robert Greenwalt if (DEBUG) Log.d(TAG, "Tether Mode unrequested by " + who.toString()); 13162a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt int index = mNotifyList.indexOf(who); 13172a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt if (index != -1) { 13186a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt mNotifyList.remove(who); 13192a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt } 13202a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt break; 13212a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt default: 13222a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt retValue = false; 13232a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt break; 13242a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt } 13252a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt return retValue; 13262a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt } 13272a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt } 13282a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt 1329d70a3d4e2d356aab4cac313f1f9d8272a5e3e8d0Robert Greenwalt class TetherModeAliveState extends TetherMasterUtilState { 13306a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt boolean mTryCell = WAIT_FOR_NETWORK_TO_SETTLE; 13312a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt @Override 13322a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt public void enter() { 13336a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt mTryCell = WAIT_FOR_NETWORK_TO_SETTLE; // first pass lets just see what we have. 13346a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt chooseUpstreamType(mTryCell); 13356a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt mTryCell = !mTryCell; 13366a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt turnOnMasterTetherSettings(); // may transition us out 13376a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt } 13386a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt @Override 13396a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt public void exit() { 13406a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt turnOffMobileConnection(); 1341b37f0c6513241f79a6ea0e3c162dc540d028b60cRobert Greenwalt notifyTetheredOfNewUpstreamIface(null); 13422a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt } 13432a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt @Override 13442a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt public boolean processMessage(Message message) { 1345924cc94caaab5e9ad0714e0877e871290316e2b1Robert Greenwalt if (DEBUG) Log.d(TAG, "TetherModeAliveState.processMessage what=" + message.what); 13462a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt boolean retValue = true; 13472a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt switch (message.what) { 13482a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt case CMD_TETHER_MODE_REQUESTED: 13492a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt TetherInterfaceSM who = (TetherInterfaceSM)message.obj; 13502a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt mNotifyList.add(who); 1351b37f0c6513241f79a6ea0e3c162dc540d028b60cRobert Greenwalt who.sendMessage(TetherInterfaceSM.CMD_TETHER_CONNECTION_CHANGED, 1352b37f0c6513241f79a6ea0e3c162dc540d028b60cRobert Greenwalt mUpstreamIfaceName); 13532a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt break; 13542a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt case CMD_TETHER_MODE_UNREQUESTED: 13552a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt who = (TetherInterfaceSM)message.obj; 13562a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt int index = mNotifyList.indexOf(who); 13572a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt if (index != -1) { 13582a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt mNotifyList.remove(index); 13592a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt if (mNotifyList.isEmpty()) { 1360d70a3d4e2d356aab4cac313f1f9d8272a5e3e8d0Robert Greenwalt turnOffMasterTetherSettings(); // transitions appropriately 13612a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt } 13622a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt } 13632a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt break; 13646a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt case CMD_UPSTREAM_CHANGED: 13656a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt mTryCell = WAIT_FOR_NETWORK_TO_SETTLE; 13666a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt chooseUpstreamType(mTryCell); 13676a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt mTryCell = !mTryCell; 13682a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt break; 13696a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt case CMD_CELL_CONNECTION_RENEW: 13706a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt // make sure we're still using a requested connection - may have found 13716a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt // wifi or something since then. 13726a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt if (mConnectionRequested) { 1373924cc94caaab5e9ad0714e0877e871290316e2b1Robert Greenwalt if (DEBUG) { 1374924cc94caaab5e9ad0714e0877e871290316e2b1Robert Greenwalt Log.d(TAG, "renewing mobile connection - requeuing for another " + 1375924cc94caaab5e9ad0714e0877e871290316e2b1Robert Greenwalt CELL_CONNECTION_RENEW_MS + "ms"); 1376924cc94caaab5e9ad0714e0877e871290316e2b1Robert Greenwalt } 13776a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt turnOnMobileConnection(); 13786a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt } 137965ae29bd852ff468ad003af241d5177fe016c74aRobert Greenwalt break; 13806a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt case CMD_RETRY_UPSTREAM: 13816a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt chooseUpstreamType(mTryCell); 13826a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt mTryCell = !mTryCell; 13836a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt break; 13846a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt default: 13852a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt retValue = false; 13862a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt break; 13872a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt } 13882a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt return retValue; 13892a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt } 13902a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt } 13912a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt 13922a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt class ErrorState extends HierarchicalState { 13932a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt int mErrorNotification; 13942a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt @Override 13952a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt public boolean processMessage(Message message) { 13962a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt boolean retValue = true; 13972a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt switch (message.what) { 13982a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt case CMD_TETHER_MODE_REQUESTED: 13992a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt TetherInterfaceSM who = (TetherInterfaceSM)message.obj; 14006a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt who.sendMessage(mErrorNotification); 14012a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt break; 14022a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt default: 14032a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt retValue = false; 14042a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt } 14052a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt return retValue; 14062a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt } 14072a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt void notify(int msgType) { 14082a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt mErrorNotification = msgType; 14092a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt for (Object o : mNotifyList) { 14102a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt TetherInterfaceSM sm = (TetherInterfaceSM)o; 14116a1967c9088b9f05665462efa9d98210143500bdRobert Greenwalt sm.sendMessage(msgType); 14122a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt } 14132a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt } 14142a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt 14152a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt } 14162a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt class SetIpForwardingEnabledErrorState extends ErrorState { 14172a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt @Override 14182a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt public void enter() { 14192a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt Log.e(TAG, "Error in setIpForwardingEnabled"); 14202a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt notify(TetherInterfaceSM.CMD_IP_FORWARDING_ENABLE_ERROR); 14212a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt } 14222a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt } 14232a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt 14242a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt class SetIpForwardingDisabledErrorState extends ErrorState { 14252a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt @Override 14262a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt public void enter() { 14272a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt Log.e(TAG, "Error in setIpForwardingDisabled"); 14282a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt notify(TetherInterfaceSM.CMD_IP_FORWARDING_DISABLE_ERROR); 14292a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt } 14302a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt } 14312a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt 14322a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt class StartTetheringErrorState extends ErrorState { 14332a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt @Override 14342a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt public void enter() { 14352a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt Log.e(TAG, "Error in startTethering"); 14362a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt notify(TetherInterfaceSM.CMD_START_TETHERING_ERROR); 14372a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt IBinder b = ServiceManager.getService(Context.NETWORKMANAGEMENT_SERVICE); 14382a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt INetworkManagementService service = 14392a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt INetworkManagementService.Stub.asInterface(b); 14402a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt try { 14412a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt service.setIpForwardingEnabled(false); 14422a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt } catch (Exception e) {} 14432a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt } 14442a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt } 14452a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt 14462a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt class StopTetheringErrorState extends ErrorState { 14472a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt @Override 14482a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt public void enter() { 14492a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt Log.e(TAG, "Error in stopTethering"); 14502a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt notify(TetherInterfaceSM.CMD_STOP_TETHERING_ERROR); 14512a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt IBinder b = ServiceManager.getService(Context.NETWORKMANAGEMENT_SERVICE); 14522a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt INetworkManagementService service = 14532a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt INetworkManagementService.Stub.asInterface(b); 14542a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt try { 14552a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt service.setIpForwardingEnabled(false); 14562a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt } catch (Exception e) {} 14572a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt } 14582a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt } 14592a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt 14602a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt class SetDnsForwardersErrorState extends ErrorState { 14612a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt @Override 14622a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt public void enter() { 14632a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt Log.e(TAG, "Error in setDnsForwarders"); 14642a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt notify(TetherInterfaceSM.CMD_SET_DNS_FORWARDERS_ERROR); 14652a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt IBinder b = ServiceManager.getService(Context.NETWORKMANAGEMENT_SERVICE); 14662a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt INetworkManagementService service = 14672a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt INetworkManagementService.Stub.asInterface(b); 14682a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt try { 14692a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt service.stopTethering(); 14702a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt } catch (Exception e) {} 14712a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt try { 14722a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt service.setIpForwardingEnabled(false); 14732a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt } catch (Exception e) {} 14742a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt } 1475d0e18ffb82b59d38aeaf0e552f48e734202719abRobert Greenwalt } 1476d0e18ffb82b59d38aeaf0e552f48e734202719abRobert Greenwalt } 1477d0e18ffb82b59d38aeaf0e552f48e734202719abRobert Greenwalt 14782a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { 14792a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt if (mContext.checkCallingOrSelfPermission( 14802a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt android.Manifest.permission.DUMP) != PackageManager.PERMISSION_GRANTED) { 14812a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt pw.println("Permission Denial: can't dump ConnectivityService.Tether " + 14822a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt "from from pid=" + Binder.getCallingPid() + ", uid=" + 14832a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt Binder.getCallingUid()); 14842a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt return; 14852a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt } 14862a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt 14872a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt pw.println(); 14882a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt pw.println("Tether state:"); 14892a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt synchronized (mIfaces) { 14902a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt for (Object o : mIfaces.values()) { 14912a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt pw.println(" "+o.toString()); 14922a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt } 1493d0e18ffb82b59d38aeaf0e552f48e734202719abRobert Greenwalt } 14942a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt pw.println(); 14952a091d7aa0c174986387e5d56bf97a87fe075bdbRobert Greenwalt return; 1496d0e18ffb82b59d38aeaf0e552f48e734202719abRobert Greenwalt } 1497d0e18ffb82b59d38aeaf0e552f48e734202719abRobert Greenwalt} 1498