diff options
4 files changed, 151 insertions, 6 deletions
diff --git a/service/java/com/android/server/wifi/WifiConfigManager.java b/service/java/com/android/server/wifi/WifiConfigManager.java index 982c48a48..09b0b3483 100644 --- a/service/java/com/android/server/wifi/WifiConfigManager.java +++ b/service/java/com/android/server/wifi/WifiConfigManager.java @@ -119,10 +119,11 @@ public class WifiConfigManager { 5, // threshold for DISABLED_AUTHENTICATION_FAILURE 5, // threshold for DISABLED_DHCP_FAILURE 5, // threshold for DISABLED_DNS_FAILURE + 1, // threshold for DISABLED_NO_INTERNET_TEMPORARY 1, // threshold for DISABLED_WPS_START 6, // threshold for DISABLED_TLS_VERSION_MISMATCH 1, // threshold for DISABLED_AUTHENTICATION_NO_CREDENTIALS - 1, // threshold for DISABLED_NO_INTERNET + 1, // threshold for DISABLED_NO_INTERNET_PERMANENT 1, // threshold for DISABLED_BY_WIFI_MANAGER 1, // threshold for DISABLED_BY_USER_SWITCH 1 // threshold for DISABLED_BY_WRONG_PASSWORD @@ -141,10 +142,11 @@ public class WifiConfigManager { 5 * 60 * 1000, // threshold for DISABLED_AUTHENTICATION_FAILURE 5 * 60 * 1000, // threshold for DISABLED_DHCP_FAILURE 5 * 60 * 1000, // threshold for DISABLED_DNS_FAILURE + 10 * 60 * 1000, // threshold for DISABLED_NO_INTERNET_TEMPORARY 0 * 60 * 1000, // threshold for DISABLED_WPS_START Integer.MAX_VALUE, // threshold for DISABLED_TLS_VERSION Integer.MAX_VALUE, // threshold for DISABLED_AUTHENTICATION_NO_CREDENTIALS - Integer.MAX_VALUE, // threshold for DISABLED_NO_INTERNET + Integer.MAX_VALUE, // threshold for DISABLED_NO_INTERNET_PERMANENT Integer.MAX_VALUE, // threshold for DISABLED_BY_WIFI_MANAGER Integer.MAX_VALUE, // threshold for DISABLED_BY_USER_SWITCH Integer.MAX_VALUE // threshold for DISABLED_BY_WRONG_PASSWORD diff --git a/service/java/com/android/server/wifi/WifiStateMachine.java b/service/java/com/android/server/wifi/WifiStateMachine.java index 74a4dc7f0..fa22749bb 100644 --- a/service/java/com/android/server/wifi/WifiStateMachine.java +++ b/service/java/com/android/server/wifi/WifiStateMachine.java @@ -5292,10 +5292,20 @@ public class WifiStateMachine extends StateMachine { config.networkId, false); mWifiConfigManager.updateNetworkSelectionStatus(config.networkId, WifiConfiguration.NetworkSelectionStatus - .DISABLED_NO_INTERNET); + .DISABLED_NO_INTERNET_PERMANENT); + } else { + mWifiConfigManager.incrementNetworkNoInternetAccessReports( + config.networkId); + // If this was not the last selected network, update network + // selection status to temporarily disable the network. + if (mWifiConfigManager.getLastSelectedNetwork() != config.networkId + && !config.noInternetAccessExpected) { + mWifiConfigManager.updateNetworkSelectionStatus( + config.networkId, + WifiConfiguration.NetworkSelectionStatus + .DISABLED_NO_INTERNET_TEMPORARY); + } } - mWifiConfigManager.incrementNetworkNoInternetAccessReports( - config.networkId); } } return HANDLED; diff --git a/tests/wifitests/src/com/android/server/wifi/WifiConfigManagerTest.java b/tests/wifitests/src/com/android/server/wifi/WifiConfigManagerTest.java index 844a358d0..5b4917c7f 100644 --- a/tests/wifitests/src/com/android/server/wifi/WifiConfigManagerTest.java +++ b/tests/wifitests/src/com/android/server/wifi/WifiConfigManagerTest.java @@ -643,6 +643,33 @@ public class WifiConfigManagerTest { /** * Verifies the update of network status using + * {@link WifiConfigManager#updateNetworkSelectionStatus(int, int)}. + */ + @Test + public void testNetworkSelectionStatusTemporarilyDisabledDueToNoInternet() { + WifiConfiguration openNetwork = WifiConfigurationTestUtil.createOpenNetwork(); + + NetworkUpdateResult result = verifyAddNetworkToWifiConfigManager(openNetwork); + + int networkId = result.getNetworkId(); + // First set it to enabled. + verifyUpdateNetworkSelectionStatus( + networkId, NetworkSelectionStatus.NETWORK_SELECTION_ENABLE, 0); + + // Now set it to temporarily disabled. The threshold for no internet is 1, so + // disable it once to actually mark it temporarily disabled. + verifyUpdateNetworkSelectionStatus( + result.getNetworkId(), NetworkSelectionStatus.DISABLED_NO_INTERNET_TEMPORARY, 1); + verify(mWcmListener).onSavedNetworkTemporarilyDisabled(networkId); + + // Now set it back to enabled. + verifyUpdateNetworkSelectionStatus( + result.getNetworkId(), NetworkSelectionStatus.NETWORK_SELECTION_ENABLE, 0); + verify(mWcmListener, times(2)).onSavedNetworkEnabled(networkId); + } + + /** + * Verifies the update of network status using * {@link WifiConfigManager#updateNetworkSelectionStatus(int, int)} and ensures that * enabling a network clears out all the temporary disable counters. */ diff --git a/tests/wifitests/src/com/android/server/wifi/WifiStateMachineTest.java b/tests/wifitests/src/com/android/server/wifi/WifiStateMachineTest.java index b067d9dfa..8da8339b3 100644 --- a/tests/wifitests/src/com/android/server/wifi/WifiStateMachineTest.java +++ b/tests/wifitests/src/com/android/server/wifi/WifiStateMachineTest.java @@ -16,6 +16,8 @@ package com.android.server.wifi; +import static android.net.wifi.WifiConfiguration.NetworkSelectionStatus.DISABLED_NO_INTERNET_TEMPORARY; + import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotEquals; @@ -37,6 +39,7 @@ import android.net.ConnectivityManager; import android.net.DhcpResults; import android.net.LinkProperties; import android.net.MacAddress; +import android.net.NetworkAgent; import android.net.NetworkCapabilities; import android.net.NetworkFactory; import android.net.NetworkInfo; @@ -2123,7 +2126,7 @@ public class WifiStateMachineTest { Bundle thresholds = new Bundle(); thresholds.putIntegerArrayList("thresholds", thresholdsArray); Message message = new Message(); - message.what = android.net.NetworkAgent.CMD_SET_SIGNAL_STRENGTH_THRESHOLDS; + message.what = NetworkAgent.CMD_SET_SIGNAL_STRENGTH_THRESHOLDS; message.obj = thresholds; messengerCaptor.getValue().send(message); mLooper.dispatchAll(); @@ -2433,4 +2436,107 @@ public class WifiStateMachineTest { mLooper.dispatchAll(); assertEquals(TEST_GLOBAL_MAC_ADDRESS.toString(), mWsm.getWifiInfo().getMacAddress()); } + + /** + * Verify that we temporarily disable the network when auto-connected to a network + * with no internet access. + */ + @Test + public void verifyAutoConnectedNetworkWithInternetValidationFailure() throws Exception { + // Simulate the first connection. + connect(); + ArgumentCaptor<Messenger> messengerCaptor = ArgumentCaptor.forClass(Messenger.class); + verify(mConnectivityManager).registerNetworkAgent(messengerCaptor.capture(), + any(NetworkInfo.class), any(LinkProperties.class), any(NetworkCapabilities.class), + anyInt(), any(NetworkMisc.class)); + + WifiConfiguration currentNetwork = new WifiConfiguration(); + currentNetwork.networkId = FRAMEWORK_NETWORK_ID; + currentNetwork.noInternetAccessExpected = false; + currentNetwork.numNoInternetAccessReports = 1; + when(mWifiConfigManager.getConfiguredNetwork(FRAMEWORK_NETWORK_ID)) + .thenReturn(currentNetwork); + when(mWifiConfigManager.getLastSelectedNetwork()).thenReturn(FRAMEWORK_NETWORK_ID + 1); + + Message message = new Message(); + message.what = NetworkAgent.CMD_REPORT_NETWORK_STATUS; + message.arg1 = NetworkAgent.INVALID_NETWORK; + message.obj = new Bundle(); + messengerCaptor.getValue().send(message); + mLooper.dispatchAll(); + + verify(mWifiConfigManager) + .incrementNetworkNoInternetAccessReports(FRAMEWORK_NETWORK_ID); + verify(mWifiConfigManager).updateNetworkSelectionStatus( + FRAMEWORK_NETWORK_ID, DISABLED_NO_INTERNET_TEMPORARY); + } + + /** + * Verify that we don't temporarily disable the network when user selected to connect to a + * network with no internet access. + */ + @Test + public void verifyLastSelectedNetworkWithInternetValidationFailure() throws Exception { + // Simulate the first connection. + connect(); + ArgumentCaptor<Messenger> messengerCaptor = ArgumentCaptor.forClass(Messenger.class); + verify(mConnectivityManager).registerNetworkAgent(messengerCaptor.capture(), + any(NetworkInfo.class), any(LinkProperties.class), any(NetworkCapabilities.class), + anyInt(), any(NetworkMisc.class)); + + WifiConfiguration currentNetwork = new WifiConfiguration(); + currentNetwork.networkId = FRAMEWORK_NETWORK_ID; + currentNetwork.noInternetAccessExpected = false; + currentNetwork.numNoInternetAccessReports = 1; + when(mWifiConfigManager.getConfiguredNetwork(FRAMEWORK_NETWORK_ID)) + .thenReturn(currentNetwork); + when(mWifiConfigManager.getLastSelectedNetwork()).thenReturn(FRAMEWORK_NETWORK_ID); + + Message message = new Message(); + message.what = NetworkAgent.CMD_REPORT_NETWORK_STATUS; + message.arg1 = NetworkAgent.INVALID_NETWORK; + message.obj = new Bundle(); + messengerCaptor.getValue().send(message); + mLooper.dispatchAll(); + + verify(mWifiConfigManager) + .incrementNetworkNoInternetAccessReports(FRAMEWORK_NETWORK_ID); + verify(mWifiConfigManager, never()).updateNetworkSelectionStatus( + FRAMEWORK_NETWORK_ID, DISABLED_NO_INTERNET_TEMPORARY); + } + + /** + * Verify that we temporarily disable the network when auto-connected to a network + * with no internet access. + */ + @Test + public void verifyAutoConnectedNoInternetExpectedNetworkWithInternetValidationFailure() + throws Exception { + // Simulate the first connection. + connect(); + ArgumentCaptor<Messenger> messengerCaptor = ArgumentCaptor.forClass(Messenger.class); + verify(mConnectivityManager).registerNetworkAgent(messengerCaptor.capture(), + any(NetworkInfo.class), any(LinkProperties.class), any(NetworkCapabilities.class), + anyInt(), any(NetworkMisc.class)); + + WifiConfiguration currentNetwork = new WifiConfiguration(); + currentNetwork.networkId = FRAMEWORK_NETWORK_ID; + currentNetwork.noInternetAccessExpected = true; + currentNetwork.numNoInternetAccessReports = 1; + when(mWifiConfigManager.getConfiguredNetwork(FRAMEWORK_NETWORK_ID + 1)) + .thenReturn(currentNetwork); + when(mWifiConfigManager.getLastSelectedNetwork()).thenReturn(FRAMEWORK_NETWORK_ID); + + Message message = new Message(); + message.what = NetworkAgent.CMD_REPORT_NETWORK_STATUS; + message.arg1 = NetworkAgent.INVALID_NETWORK; + message.obj = new Bundle(); + messengerCaptor.getValue().send(message); + mLooper.dispatchAll(); + + verify(mWifiConfigManager) + .incrementNetworkNoInternetAccessReports(FRAMEWORK_NETWORK_ID); + verify(mWifiConfigManager, never()).updateNetworkSelectionStatus( + FRAMEWORK_NETWORK_ID, DISABLED_NO_INTERNET_TEMPORARY); + } } |