summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--service/java/com/android/server/wifi/WifiConfigManager.java4
-rw-r--r--service/java/com/android/server/wifi/WifiStateMachine.java27
-rw-r--r--tests/wifitests/src/com/android/server/wifi/WifiConfigManagerTest.java58
-rw-r--r--tests/wifitests/src/com/android/server/wifi/WifiStateMachineTest.java46
4 files changed, 99 insertions, 36 deletions
diff --git a/service/java/com/android/server/wifi/WifiConfigManager.java b/service/java/com/android/server/wifi/WifiConfigManager.java
index 47d43aa24..82ad5b986 100644
--- a/service/java/com/android/server/wifi/WifiConfigManager.java
+++ b/service/java/com/android/server/wifi/WifiConfigManager.java
@@ -1012,6 +1012,10 @@ public class WifiConfigManager {
Log.e(TAG, "Cannot add/update network with null config");
return new NetworkUpdateResult(WifiConfiguration.INVALID_NETWORK_ID);
}
+ if (mPendingStoreRead) {
+ Log.e(TAG, "Cannot add/update network before store is read!");
+ return new NetworkUpdateResult(WifiConfiguration.INVALID_NETWORK_ID);
+ }
NetworkUpdateResult result = addOrUpdateNetworkInternal(config, uid);
if (!result.isSuccess()) {
Log.e(TAG, "Failed to add/update network " + config.getPrintableSsid());
diff --git a/service/java/com/android/server/wifi/WifiStateMachine.java b/service/java/com/android/server/wifi/WifiStateMachine.java
index f2bda6856..b8d7e6ab6 100644
--- a/service/java/com/android/server/wifi/WifiStateMachine.java
+++ b/service/java/com/android/server/wifi/WifiStateMachine.java
@@ -3677,7 +3677,24 @@ public class WifiStateMachine extends StateMachine implements WifiNative.WifiRss
BluetoothAdapter.STATE_DISCONNECTED);
break;
case CMD_ENABLE_NETWORK:
+ boolean disableOthers = message.arg2 == 1;
+ int netId = message.arg1;
+ boolean ok = mWifiConfigManager.enableNetwork(
+ netId, disableOthers, message.sendingUid);
+ if (!ok) {
+ messageHandlingStatus = MESSAGE_HANDLING_STATUS_FAIL;
+ }
+ replyToMessage(message, message.what, ok ? SUCCESS : FAILURE);
+ break;
case CMD_ADD_OR_UPDATE_NETWORK:
+ WifiConfiguration config = (WifiConfiguration) message.obj;
+ NetworkUpdateResult result =
+ mWifiConfigManager.addOrUpdateNetwork(config, message.sendingUid);
+ if (!result.isSuccess()) {
+ messageHandlingStatus = MESSAGE_HANDLING_STATUS_FAIL;
+ }
+ replyToMessage(message, message.what, result.getNetworkId());
+ break;
case CMD_SAVE_CONFIG:
replyToMessage(message, message.what, FAILURE);
break;
@@ -3702,7 +3719,7 @@ public class WifiStateMachine extends StateMachine implements WifiNative.WifiRss
}
break;
case CMD_INITIALIZE:
- boolean ok = mWifiNative.initializeVendorHal(mVendorHalDeathRecipient);
+ ok = mWifiNative.initializeVendorHal(mVendorHalDeathRecipient);
replyToMessage(message, message.what, ok ? SUCCESS : FAILURE);
break;
case CMD_BOOT_COMPLETED:
@@ -4783,14 +4800,6 @@ public class WifiStateMachine extends StateMachine implements WifiNative.WifiRss
mTemporarilyDisconnectWifi = false;
}
break;
- case CMD_ADD_OR_UPDATE_NETWORK:
- config = (WifiConfiguration) message.obj;
- result = mWifiConfigManager.addOrUpdateNetwork(config, message.sendingUid);
- if (!result.isSuccess()) {
- messageHandlingStatus = MESSAGE_HANDLING_STATUS_FAIL;
- }
- replyToMessage(message, message.what, result.getNetworkId());
- break;
case CMD_REMOVE_NETWORK:
if (!deleteNetworkConfigAndSendReply(message, false)) {
// failed to remove the config and caller was notified
diff --git a/tests/wifitests/src/com/android/server/wifi/WifiConfigManagerTest.java b/tests/wifitests/src/com/android/server/wifi/WifiConfigManagerTest.java
index 69049a6a1..987c50937 100644
--- a/tests/wifitests/src/com/android/server/wifi/WifiConfigManagerTest.java
+++ b/tests/wifitests/src/com/android/server/wifi/WifiConfigManagerTest.java
@@ -115,6 +115,7 @@ public class WifiConfigManagerTest {
private InOrder mContextConfigStoreMockOrder;
private InOrder mNetworkListStoreDataMockOrder;
private WifiConfigManager mWifiConfigManager;
+ private boolean mStoreReadTriggered = false;
/**
* Setup the mocks and an instance of WifiConfigManager before each test.
@@ -171,6 +172,8 @@ public class WifiConfigManagerTest {
.thenReturn(true);
when(mWifiConfigStore.areStoresPresent()).thenReturn(true);
+ setupStoreDataForRead(new ArrayList<WifiConfiguration>(),
+ new ArrayList<WifiConfiguration>(), new HashSet<String>());
when(mDevicePolicyManagerInternal.isActiveAdminWithPolicy(anyInt(), anyInt()))
.thenReturn(false);
@@ -202,6 +205,18 @@ public class WifiConfigManagerTest {
}
/**
+ * Verifies that network addition via
+ * {@link WifiConfigManager#addOrUpdateNetwork(WifiConfiguration, int)} fails if we have not
+ * yet loaded data from store.
+ */
+ @Test
+ public void testAddNetworkBeforeLoadFromStore() {
+ WifiConfiguration openNetwork = WifiConfigurationTestUtil.createOpenNetwork();
+ assertFalse(
+ mWifiConfigManager.addOrUpdateNetwork(openNetwork, TEST_CREATOR_UID).isSuccess());
+ }
+
+ /**
* Verifies the addition of a single network using
* {@link WifiConfigManager#addOrUpdateNetwork(WifiConfiguration, int)}
*/
@@ -2378,8 +2393,7 @@ public class WifiConfigManagerTest {
// Create a network for user2 try adding it. This should be rejected.
final WifiConfiguration user2Network = WifiConfigurationTestUtil.createPskNetwork();
- NetworkUpdateResult result =
- mWifiConfigManager.addOrUpdateNetwork(user2Network, creatorUid);
+ NetworkUpdateResult result = addNetworkToWifiConfigManager(user2Network, creatorUid);
assertFalse(result.isSuccess());
}
@@ -2399,8 +2413,7 @@ public class WifiConfigManagerTest {
// Create a network for user2 try adding it. This should be rejected.
final WifiConfiguration user2Network = WifiConfigurationTestUtil.createPskNetwork();
- NetworkUpdateResult result =
- mWifiConfigManager.addOrUpdateNetwork(user2Network, TEST_SYSUI_UID);
+ NetworkUpdateResult result = addNetworkToWifiConfigManager(user2Network, TEST_SYSUI_UID);
assertTrue(result.isSuccess());
}
@@ -2920,8 +2933,7 @@ public class WifiConfigManagerTest {
public void testUpdateNetworkAddProxyWithPermissionAndSystem() {
// Testing updating network with uid permission OVERRIDE_WIFI_CONFIG
WifiConfiguration network = WifiConfigurationTestUtil.createOpenHiddenNetwork();
- NetworkUpdateResult result =
- mWifiConfigManager.addOrUpdateNetwork(network, TEST_CREATOR_UID);
+ NetworkUpdateResult result = addNetworkToWifiConfigManager(network, TEST_CREATOR_UID);
assertTrue(result.getNetworkId() != WifiConfiguration.INVALID_NETWORK_ID);
verifyAddOrUpdateNetworkWithProxySettingsAndPermissions(
true, // withConfOverride
@@ -2933,7 +2945,7 @@ public class WifiConfigManagerTest {
// Testing updating network with proxy while holding Profile Owner policy
network = WifiConfigurationTestUtil.createOpenHiddenNetwork();
- result = mWifiConfigManager.addOrUpdateNetwork(network, TEST_NO_PERM_UID);
+ result = addNetworkToWifiConfigManager(network, TEST_NO_PERM_UID);
assertTrue(result.getNetworkId() != WifiConfiguration.INVALID_NETWORK_ID);
verifyAddOrUpdateNetworkWithProxySettingsAndPermissions(
false, // withConfOverride
@@ -2945,7 +2957,7 @@ public class WifiConfigManagerTest {
// Testing updating network with proxy while holding Device Owner Policy
network = WifiConfigurationTestUtil.createOpenHiddenNetwork();
- result = mWifiConfigManager.addOrUpdateNetwork(network, TEST_NO_PERM_UID);
+ result = addNetworkToWifiConfigManager(network, TEST_NO_PERM_UID);
assertTrue(result.getNetworkId() != WifiConfiguration.INVALID_NETWORK_ID);
verifyAddOrUpdateNetworkWithProxySettingsAndPermissions(
false, // withConfOverride
@@ -3181,7 +3193,7 @@ public class WifiConfigManagerTest {
when(mWifiPermissionsUtil.checkConfigOverridePermission(anyInt()))
.thenReturn(withConfOverride);
int uid = withConfOverride ? TEST_CREATOR_UID : TEST_NO_PERM_UID;
- NetworkUpdateResult result = mWifiConfigManager.addOrUpdateNetwork(network, uid);
+ NetworkUpdateResult result = addNetworkToWifiConfigManager(network, uid);
assertEquals(assertSuccess, result.getNetworkId() != WifiConfiguration.INVALID_NETWORK_ID);
return result;
}
@@ -3472,17 +3484,41 @@ public class WifiConfigManagerTest {
WifiManager.CHANGE_REASON_REMOVED);
}
+ private void verifyWifiConfigStoreRead() {
+ assertTrue(mWifiConfigManager.loadFromStore());
+ mContextConfigStoreMockOrder.verify(mContext)
+ .sendBroadcastAsUser(any(Intent.class), any(UserHandle.class));
+ }
+
+ private void triggerStoreReadIfNeeded() {
+ // Trigger a store read if not already done.
+ if (!mStoreReadTriggered) {
+ verifyWifiConfigStoreRead();
+ mStoreReadTriggered = true;
+ }
+ }
+
+ /**
+ * Adds the provided configuration to WifiConfigManager with uid = TEST_CREATOR_UID.
+ */
+ private NetworkUpdateResult addNetworkToWifiConfigManager(WifiConfiguration configuration) {
+ return addNetworkToWifiConfigManager(configuration, TEST_CREATOR_UID);
+ }
+
/**
* Adds the provided configuration to WifiConfigManager and modifies the provided configuration
* with creator/update uid, package name and time. This also sets defaults for fields not
* populated.
* These fields are populated internally by WifiConfigManager and hence we need
* to modify the configuration before we compare the added network with the retrieved network.
+ * This method also triggers a store read if not already done.
*/
- private NetworkUpdateResult addNetworkToWifiConfigManager(WifiConfiguration configuration) {
+ private NetworkUpdateResult addNetworkToWifiConfigManager(WifiConfiguration configuration,
+ int uid) {
+ triggerStoreReadIfNeeded();
when(mClock.getWallClockMillis()).thenReturn(TEST_WALLCLOCK_CREATION_TIME_MILLIS);
NetworkUpdateResult result =
- mWifiConfigManager.addOrUpdateNetwork(configuration, TEST_CREATOR_UID);
+ mWifiConfigManager.addOrUpdateNetwork(configuration, uid);
setDefaults(configuration);
setCreationDebugParams(configuration);
configuration.networkId = result.getNetworkId();
diff --git a/tests/wifitests/src/com/android/server/wifi/WifiStateMachineTest.java b/tests/wifitests/src/com/android/server/wifi/WifiStateMachineTest.java
index c9d084342..d3da2e761 100644
--- a/tests/wifitests/src/com/android/server/wifi/WifiStateMachineTest.java
+++ b/tests/wifitests/src/com/android/server/wifi/WifiStateMachineTest.java
@@ -629,7 +629,7 @@ public class WifiStateMachineTest {
public void canRemoveNetworkConfigInClientMode() throws Exception {
boolean result;
when(mWifiConfigManager.removeNetwork(eq(0), anyInt())).thenReturn(true);
- addNetworkAndVerifySuccess();
+ initializeAndAddNetworkAndVerifySuccess();
mLooper.startAutoDispatch();
result = mWsm.syncRemoveNetwork(mWsmAsyncChannel, 0);
mLooper.stopAutoDispatch();
@@ -657,7 +657,7 @@ public class WifiStateMachineTest {
@Test
public void canForgetNetworkConfigInClientMode() throws Exception {
when(mWifiConfigManager.removeNetwork(eq(0), anyInt())).thenReturn(true);
- addNetworkAndVerifySuccess();
+ initializeAndAddNetworkAndVerifySuccess();
mWsm.sendMessage(WifiManager.FORGET_NETWORK, 0, MANAGED_PROFILE_UID);
mLooper.dispatchAll();
verify(mWifiConfigManager).removeNetwork(anyInt(), anyInt());
@@ -697,13 +697,7 @@ public class WifiStateMachineTest {
mLooper.dispatchAll();
}
- private void addNetworkAndVerifySuccess() throws Exception {
- addNetworkAndVerifySuccess(false);
- }
-
private void addNetworkAndVerifySuccess(boolean isHidden) throws Exception {
- loadComponentsInStaMode();
-
WifiConfiguration config = new WifiConfiguration();
config.SSID = sSSID;
config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
@@ -730,6 +724,15 @@ public class WifiStateMachineTest {
assertTrue(config2.allowedKeyManagement.get(WifiConfiguration.KeyMgmt.NONE));
}
+ private void initializeAndAddNetworkAndVerifySuccess() throws Exception {
+ initializeAndAddNetworkAndVerifySuccess(false);
+ }
+
+ private void initializeAndAddNetworkAndVerifySuccess(boolean isHidden) throws Exception {
+ loadComponentsInStaMode();
+ addNetworkAndVerifySuccess(isHidden);
+ }
+
/**
* Helper method to retrieve WifiConfiguration by SSID.
*
@@ -781,7 +784,7 @@ public class WifiStateMachineTest {
@Test
public void scan() throws Exception {
- addNetworkAndVerifySuccess();
+ initializeAndAddNetworkAndVerifySuccess();
mWsm.setOperationalMode(WifiStateMachine.CONNECT_MODE);
mWsm.startScan(-1, 0, null, null);
@@ -794,7 +797,7 @@ public class WifiStateMachineTest {
@Test
public void scanWithHiddenNetwork() throws Exception {
- addNetworkAndVerifySuccess(true);
+ initializeAndAddNetworkAndVerifySuccess(true);
Set<String> hiddenNetworkSet = new HashSet<>();
hiddenNetworkSet.add(sSSID);
@@ -814,7 +817,7 @@ public class WifiStateMachineTest {
@Test
public void connect() throws Exception {
- addNetworkAndVerifySuccess();
+ initializeAndAddNetworkAndVerifySuccess();
when(mWifiConfigManager.enableNetwork(eq(0), eq(true), anyInt())).thenReturn(true);
when(mWifiConfigManager.checkAndUpdateLastConnectUid(eq(0), anyInt())).thenReturn(true);
@@ -852,7 +855,7 @@ public class WifiStateMachineTest {
@Test
public void connectWithNoEnablePermission() throws Exception {
- addNetworkAndVerifySuccess();
+ initializeAndAddNetworkAndVerifySuccess();
when(mWifiConfigManager.enableNetwork(eq(0), eq(true), anyInt())).thenReturn(false);
when(mWifiConfigManager.checkAndUpdateLastConnectUid(eq(0), anyInt())).thenReturn(false);
@@ -890,7 +893,7 @@ public class WifiStateMachineTest {
@Test
public void enableWithInvalidNetworkId() throws Exception {
- addNetworkAndVerifySuccess();
+ initializeAndAddNetworkAndVerifySuccess();
when(mWifiConfigManager.getConfiguredNetwork(eq(0))).thenReturn(null);
mWsm.setOperationalMode(WifiStateMachine.CONNECT_MODE);
@@ -914,7 +917,7 @@ public class WifiStateMachineTest {
*/
@Test
public void reconnectToConnectedNetwork() throws Exception {
- addNetworkAndVerifySuccess();
+ initializeAndAddNetworkAndVerifySuccess();
mWsm.setOperationalMode(WifiStateMachine.CONNECT_MODE);
mLooper.dispatchAll();
@@ -945,7 +948,7 @@ public class WifiStateMachineTest {
@Test
public void testDhcpFailure() throws Exception {
- addNetworkAndVerifySuccess();
+ initializeAndAddNetworkAndVerifySuccess();
mWsm.setOperationalMode(WifiStateMachine.CONNECT_MODE);
mLooper.dispatchAll();
@@ -973,7 +976,7 @@ public class WifiStateMachineTest {
@Test
public void testBadNetworkEvent() throws Exception {
- addNetworkAndVerifySuccess();
+ initializeAndAddNetworkAndVerifySuccess();
mWsm.setOperationalMode(WifiStateMachine.CONNECT_MODE);
mLooper.dispatchAll();
@@ -1531,4 +1534,15 @@ public class WifiStateMachineTest {
assertEquals(SupplicantState.DISCONNECTED, wifiInfo.getSupplicantState());
assertNull(wifiInfo.getBSSID());
}
+
+ /**
+ * Adds the network without putting WifiStateMachine into ConnectMode.
+ */
+ @Test
+ public void addNetworkInInitialState() throws Exception {
+ // We should not be in initial state now.
+ assertTrue("InitialState".equals(getCurrentState().getName()));
+ addNetworkAndVerifySuccess(false);
+ verify(mWifiConnectivityManager, never()).setUserConnectChoice(eq(0));
+ }
}