Loading services/core/java/com/android/server/connectivity/Tethering.java +71 −36 Original line number Original line Diff line number Diff line Loading @@ -520,8 +520,8 @@ public class Tethering extends BaseNetworkObserver implements IControlsTethering } } /** /** * Creates a proxy {@link ResultReceiver} which enables tethering if the provsioning result is * Creates a proxy {@link ResultReceiver} which enables tethering if the provisioning result * successful before firing back up to the wrapped receiver. * is successful before firing back up to the wrapped receiver. * * * @param type The type of tethering being enabled. * @param type The type of tethering being enabled. * @param receiver A ResultReceiver which will be called back with an int resultCode. * @param receiver A ResultReceiver which will be called back with an int resultCode. Loading Loading @@ -890,7 +890,11 @@ public class Tethering extends BaseNetworkObserver implements IControlsTethering public int setUsbTethering(boolean enable) { public int setUsbTethering(boolean enable) { if (VDBG) Log.d(TAG, "setUsbTethering(" + enable + ")"); if (VDBG) Log.d(TAG, "setUsbTethering(" + enable + ")"); UsbManager usbManager = (UsbManager)mContext.getSystemService(Context.USB_SERVICE); UsbManager usbManager = mContext.getSystemService(UsbManager.class); if (usbManager == null) { return enable ? ConnectivityManager.TETHER_ERROR_MASTER_ERROR : ConnectivityManager.TETHER_ERROR_NO_ERROR; } synchronized (mPublicSync) { synchronized (mPublicSync) { if (enable) { if (enable) { Loading Loading @@ -936,7 +940,7 @@ public class Tethering extends BaseNetworkObserver implements IControlsTethering private void checkDunRequired() { private void checkDunRequired() { int secureSetting = 2; int secureSetting = 2; TelephonyManager tm = (TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE); TelephonyManager tm = mContext.getSystemService(TelephonyManager.class); if (tm != null) { if (tm != null) { secureSetting = tm.getTetherApnRequired(); secureSetting = tm.getTetherApnRequired(); } } Loading Loading @@ -1054,6 +1058,8 @@ public class Tethering extends BaseNetworkObserver implements IControlsTethering private ConnectivityManager mCM; private ConnectivityManager mCM; private NetworkCallback mDefaultNetworkCallback; private NetworkCallback mDefaultNetworkCallback; private NetworkCallback mDunTetheringCallback; private NetworkCallback mDunTetheringCallback; private NetworkCallback mMobileNetworkCallback; private boolean mDunRequired; public UpstreamNetworkMonitor(Context ctx, StateMachine tgt, int what) { public UpstreamNetworkMonitor(Context ctx, StateMachine tgt, int what) { mContext = ctx; mContext = ctx; Loading @@ -1077,6 +1083,8 @@ public class Tethering extends BaseNetworkObserver implements IControlsTethering } } public void stop() { public void stop() { releaseMobileNetworkRequest(); releaseCallback(mDefaultNetworkCallback); releaseCallback(mDefaultNetworkCallback); mDefaultNetworkCallback = null; mDefaultNetworkCallback = null; Loading @@ -1086,6 +1094,52 @@ public class Tethering extends BaseNetworkObserver implements IControlsTethering mNetworkMap.clear(); mNetworkMap.clear(); } } public void mobileUpstreamRequiresDun(boolean dunRequired) { final boolean valueChanged = (mDunRequired != dunRequired); mDunRequired = dunRequired; if (valueChanged && mobileNetworkRequested()) { releaseMobileNetworkRequest(); registerMobileNetworkRequest(); } } public boolean mobileNetworkRequested() { return (mMobileNetworkCallback != null); } public void registerMobileNetworkRequest() { if (mMobileNetworkCallback != null) return; final NetworkRequest.Builder builder = new NetworkRequest.Builder() .addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR); if (mDunRequired) { builder.removeCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED) .addCapability(NetworkCapabilities.NET_CAPABILITY_DUN); } else { builder.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET); } final NetworkRequest mobileUpstreamRequest = builder.build(); // The existing default network and DUN callbacks will be notified. // Therefore, to avoid duplicate notifications, we only register a no-op. mMobileNetworkCallback = new NetworkCallback(); // TODO: Change the timeout from 0 (no onUnavailable callback) to use some // moderate callback time (once timeout callbacks are implemented). This might // be useful for updating some UI. Additionally, we should definitely log a // message to aid in any subsequent debugging if (DBG) Log.d(TAG, "requesting mobile upstream network: " + mobileUpstreamRequest); cm().requestNetwork(mobileUpstreamRequest, mMobileNetworkCallback); } public void releaseMobileNetworkRequest() { if (mMobileNetworkCallback == null) return; cm().unregisterNetworkCallback(mMobileNetworkCallback); mMobileNetworkCallback = null; } public NetworkState lookup(Network network) { public NetworkState lookup(Network network) { return (network != null) ? mNetworkMap.get(network) : null; return (network != null) ? mNetworkMap.get(network) : null; } } Loading Loading @@ -1272,8 +1326,7 @@ public class Tethering extends BaseNetworkObserver implements IControlsTethering private final ArrayList<TetherInterfaceStateMachine> mNotifyList; private final ArrayList<TetherInterfaceStateMachine> mNotifyList; private final IPv6TetheringCoordinator mIPv6TetheringCoordinator; private final IPv6TetheringCoordinator mIPv6TetheringCoordinator; private int mMobileApnReserved = ConnectivityManager.TYPE_NONE; private int mPreviousMobileApn = ConnectivityManager.TYPE_NONE; private NetworkCallback mMobileUpstreamCallback; private static final int UPSTREAM_SETTLE_TIME_MS = 10000; private static final int UPSTREAM_SETTLE_TIME_MS = 10000; Loading Loading @@ -1311,13 +1364,13 @@ public class Tethering extends BaseNetworkObserver implements IControlsTethering protected boolean turnOnUpstreamMobileConnection(int apnType) { protected boolean turnOnUpstreamMobileConnection(int apnType) { if (apnType == ConnectivityManager.TYPE_NONE) { return false; } if (apnType == ConnectivityManager.TYPE_NONE) { return false; } if (apnType != mMobileApnReserved) { if (apnType != mPreviousMobileApn) { // Unregister any previous mobile upstream callback because // Unregister any previous mobile upstream callback because // this request, if any, will be different. // this request, if any, will be different. turnOffUpstreamMobileConnection(); turnOffUpstreamMobileConnection(); } } if (mMobileUpstreamCallback != null) { if (mUpstreamNetworkMonitor.mobileNetworkRequested()) { // Looks like we already filed a request for this apnType. // Looks like we already filed a request for this apnType. return true; return true; } } Loading @@ -1326,42 +1379,25 @@ public class Tethering extends BaseNetworkObserver implements IControlsTethering case ConnectivityManager.TYPE_MOBILE_DUN: case ConnectivityManager.TYPE_MOBILE_DUN: case ConnectivityManager.TYPE_MOBILE: case ConnectivityManager.TYPE_MOBILE: case ConnectivityManager.TYPE_MOBILE_HIPRI: case ConnectivityManager.TYPE_MOBILE_HIPRI: mMobileApnReserved = apnType; mPreviousMobileApn = apnType; break; break; default: default: return false; return false; } } final NetworkRequest.Builder builder = new NetworkRequest.Builder() // TODO: This should be called by the code that observes .addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR); // configuration changes, once the above code in this function if (apnType == ConnectivityManager.TYPE_MOBILE_DUN) { // is simplified (i.e. eradicated). builder.removeCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED) mUpstreamNetworkMonitor.mobileUpstreamRequiresDun( .addCapability(NetworkCapabilities.NET_CAPABILITY_DUN); apnType == ConnectivityManager.TYPE_MOBILE_DUN); } else { builder.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET); } final NetworkRequest mobileUpstreamRequest = builder.build(); // The UpstreamNetworkMonitor's callback will be notified. // Therefore, to avoid duplicate notifications, we only register a no-op. mMobileUpstreamCallback = new NetworkCallback(); // TODO: Change the timeout from 0 (no onUnavailable callback) to use some mUpstreamNetworkMonitor.registerMobileNetworkRequest(); // moderate callback time (once timeout callbacks are implemented). This might // be useful for updating some UI. Additionally, we should definitely log a // message to aid in any subsequent debugging if (DBG) Log.d(TAG, "requesting mobile upstream network: " + mobileUpstreamRequest); getConnectivityManager().requestNetwork( mobileUpstreamRequest, mMobileUpstreamCallback, 0, apnType); return true; return true; } } protected void turnOffUpstreamMobileConnection() { protected void turnOffUpstreamMobileConnection() { if (mMobileUpstreamCallback != null) { mUpstreamNetworkMonitor.releaseMobileNetworkRequest(); getConnectivityManager().unregisterNetworkCallback(mMobileUpstreamCallback); mPreviousMobileApn = ConnectivityManager.TYPE_NONE; mMobileUpstreamCallback = null; } mMobileApnReserved = ConnectivityManager.TYPE_NONE; } } protected boolean turnOnMasterTetherSettings() { protected boolean turnOnMasterTetherSettings() { Loading Loading @@ -1677,7 +1713,6 @@ public class Tethering extends BaseNetworkObserver implements IControlsTethering @Override @Override public void exit() { public void exit() { // TODO: examine if we should check the return value. turnOffUpstreamMobileConnection(); turnOffUpstreamMobileConnection(); mUpstreamNetworkMonitor.stop(); mUpstreamNetworkMonitor.stop(); stopListeningForSimChanges(); stopListeningForSimChanges(); Loading Loading
services/core/java/com/android/server/connectivity/Tethering.java +71 −36 Original line number Original line Diff line number Diff line Loading @@ -520,8 +520,8 @@ public class Tethering extends BaseNetworkObserver implements IControlsTethering } } /** /** * Creates a proxy {@link ResultReceiver} which enables tethering if the provsioning result is * Creates a proxy {@link ResultReceiver} which enables tethering if the provisioning result * successful before firing back up to the wrapped receiver. * is successful before firing back up to the wrapped receiver. * * * @param type The type of tethering being enabled. * @param type The type of tethering being enabled. * @param receiver A ResultReceiver which will be called back with an int resultCode. * @param receiver A ResultReceiver which will be called back with an int resultCode. Loading Loading @@ -890,7 +890,11 @@ public class Tethering extends BaseNetworkObserver implements IControlsTethering public int setUsbTethering(boolean enable) { public int setUsbTethering(boolean enable) { if (VDBG) Log.d(TAG, "setUsbTethering(" + enable + ")"); if (VDBG) Log.d(TAG, "setUsbTethering(" + enable + ")"); UsbManager usbManager = (UsbManager)mContext.getSystemService(Context.USB_SERVICE); UsbManager usbManager = mContext.getSystemService(UsbManager.class); if (usbManager == null) { return enable ? ConnectivityManager.TETHER_ERROR_MASTER_ERROR : ConnectivityManager.TETHER_ERROR_NO_ERROR; } synchronized (mPublicSync) { synchronized (mPublicSync) { if (enable) { if (enable) { Loading Loading @@ -936,7 +940,7 @@ public class Tethering extends BaseNetworkObserver implements IControlsTethering private void checkDunRequired() { private void checkDunRequired() { int secureSetting = 2; int secureSetting = 2; TelephonyManager tm = (TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE); TelephonyManager tm = mContext.getSystemService(TelephonyManager.class); if (tm != null) { if (tm != null) { secureSetting = tm.getTetherApnRequired(); secureSetting = tm.getTetherApnRequired(); } } Loading Loading @@ -1054,6 +1058,8 @@ public class Tethering extends BaseNetworkObserver implements IControlsTethering private ConnectivityManager mCM; private ConnectivityManager mCM; private NetworkCallback mDefaultNetworkCallback; private NetworkCallback mDefaultNetworkCallback; private NetworkCallback mDunTetheringCallback; private NetworkCallback mDunTetheringCallback; private NetworkCallback mMobileNetworkCallback; private boolean mDunRequired; public UpstreamNetworkMonitor(Context ctx, StateMachine tgt, int what) { public UpstreamNetworkMonitor(Context ctx, StateMachine tgt, int what) { mContext = ctx; mContext = ctx; Loading @@ -1077,6 +1083,8 @@ public class Tethering extends BaseNetworkObserver implements IControlsTethering } } public void stop() { public void stop() { releaseMobileNetworkRequest(); releaseCallback(mDefaultNetworkCallback); releaseCallback(mDefaultNetworkCallback); mDefaultNetworkCallback = null; mDefaultNetworkCallback = null; Loading @@ -1086,6 +1094,52 @@ public class Tethering extends BaseNetworkObserver implements IControlsTethering mNetworkMap.clear(); mNetworkMap.clear(); } } public void mobileUpstreamRequiresDun(boolean dunRequired) { final boolean valueChanged = (mDunRequired != dunRequired); mDunRequired = dunRequired; if (valueChanged && mobileNetworkRequested()) { releaseMobileNetworkRequest(); registerMobileNetworkRequest(); } } public boolean mobileNetworkRequested() { return (mMobileNetworkCallback != null); } public void registerMobileNetworkRequest() { if (mMobileNetworkCallback != null) return; final NetworkRequest.Builder builder = new NetworkRequest.Builder() .addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR); if (mDunRequired) { builder.removeCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED) .addCapability(NetworkCapabilities.NET_CAPABILITY_DUN); } else { builder.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET); } final NetworkRequest mobileUpstreamRequest = builder.build(); // The existing default network and DUN callbacks will be notified. // Therefore, to avoid duplicate notifications, we only register a no-op. mMobileNetworkCallback = new NetworkCallback(); // TODO: Change the timeout from 0 (no onUnavailable callback) to use some // moderate callback time (once timeout callbacks are implemented). This might // be useful for updating some UI. Additionally, we should definitely log a // message to aid in any subsequent debugging if (DBG) Log.d(TAG, "requesting mobile upstream network: " + mobileUpstreamRequest); cm().requestNetwork(mobileUpstreamRequest, mMobileNetworkCallback); } public void releaseMobileNetworkRequest() { if (mMobileNetworkCallback == null) return; cm().unregisterNetworkCallback(mMobileNetworkCallback); mMobileNetworkCallback = null; } public NetworkState lookup(Network network) { public NetworkState lookup(Network network) { return (network != null) ? mNetworkMap.get(network) : null; return (network != null) ? mNetworkMap.get(network) : null; } } Loading Loading @@ -1272,8 +1326,7 @@ public class Tethering extends BaseNetworkObserver implements IControlsTethering private final ArrayList<TetherInterfaceStateMachine> mNotifyList; private final ArrayList<TetherInterfaceStateMachine> mNotifyList; private final IPv6TetheringCoordinator mIPv6TetheringCoordinator; private final IPv6TetheringCoordinator mIPv6TetheringCoordinator; private int mMobileApnReserved = ConnectivityManager.TYPE_NONE; private int mPreviousMobileApn = ConnectivityManager.TYPE_NONE; private NetworkCallback mMobileUpstreamCallback; private static final int UPSTREAM_SETTLE_TIME_MS = 10000; private static final int UPSTREAM_SETTLE_TIME_MS = 10000; Loading Loading @@ -1311,13 +1364,13 @@ public class Tethering extends BaseNetworkObserver implements IControlsTethering protected boolean turnOnUpstreamMobileConnection(int apnType) { protected boolean turnOnUpstreamMobileConnection(int apnType) { if (apnType == ConnectivityManager.TYPE_NONE) { return false; } if (apnType == ConnectivityManager.TYPE_NONE) { return false; } if (apnType != mMobileApnReserved) { if (apnType != mPreviousMobileApn) { // Unregister any previous mobile upstream callback because // Unregister any previous mobile upstream callback because // this request, if any, will be different. // this request, if any, will be different. turnOffUpstreamMobileConnection(); turnOffUpstreamMobileConnection(); } } if (mMobileUpstreamCallback != null) { if (mUpstreamNetworkMonitor.mobileNetworkRequested()) { // Looks like we already filed a request for this apnType. // Looks like we already filed a request for this apnType. return true; return true; } } Loading @@ -1326,42 +1379,25 @@ public class Tethering extends BaseNetworkObserver implements IControlsTethering case ConnectivityManager.TYPE_MOBILE_DUN: case ConnectivityManager.TYPE_MOBILE_DUN: case ConnectivityManager.TYPE_MOBILE: case ConnectivityManager.TYPE_MOBILE: case ConnectivityManager.TYPE_MOBILE_HIPRI: case ConnectivityManager.TYPE_MOBILE_HIPRI: mMobileApnReserved = apnType; mPreviousMobileApn = apnType; break; break; default: default: return false; return false; } } final NetworkRequest.Builder builder = new NetworkRequest.Builder() // TODO: This should be called by the code that observes .addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR); // configuration changes, once the above code in this function if (apnType == ConnectivityManager.TYPE_MOBILE_DUN) { // is simplified (i.e. eradicated). builder.removeCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED) mUpstreamNetworkMonitor.mobileUpstreamRequiresDun( .addCapability(NetworkCapabilities.NET_CAPABILITY_DUN); apnType == ConnectivityManager.TYPE_MOBILE_DUN); } else { builder.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET); } final NetworkRequest mobileUpstreamRequest = builder.build(); // The UpstreamNetworkMonitor's callback will be notified. // Therefore, to avoid duplicate notifications, we only register a no-op. mMobileUpstreamCallback = new NetworkCallback(); // TODO: Change the timeout from 0 (no onUnavailable callback) to use some mUpstreamNetworkMonitor.registerMobileNetworkRequest(); // moderate callback time (once timeout callbacks are implemented). This might // be useful for updating some UI. Additionally, we should definitely log a // message to aid in any subsequent debugging if (DBG) Log.d(TAG, "requesting mobile upstream network: " + mobileUpstreamRequest); getConnectivityManager().requestNetwork( mobileUpstreamRequest, mMobileUpstreamCallback, 0, apnType); return true; return true; } } protected void turnOffUpstreamMobileConnection() { protected void turnOffUpstreamMobileConnection() { if (mMobileUpstreamCallback != null) { mUpstreamNetworkMonitor.releaseMobileNetworkRequest(); getConnectivityManager().unregisterNetworkCallback(mMobileUpstreamCallback); mPreviousMobileApn = ConnectivityManager.TYPE_NONE; mMobileUpstreamCallback = null; } mMobileApnReserved = ConnectivityManager.TYPE_NONE; } } protected boolean turnOnMasterTetherSettings() { protected boolean turnOnMasterTetherSettings() { Loading Loading @@ -1677,7 +1713,6 @@ public class Tethering extends BaseNetworkObserver implements IControlsTethering @Override @Override public void exit() { public void exit() { // TODO: examine if we should check the return value. turnOffUpstreamMobileConnection(); turnOffUpstreamMobileConnection(); mUpstreamNetworkMonitor.stop(); mUpstreamNetworkMonitor.stop(); stopListeningForSimChanges(); stopListeningForSimChanges(); Loading