summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--service/java/com/android/server/wifi/WifiConfigManager.java32
-rw-r--r--service/java/com/android/server/wifi/WifiConnectivityManager.java11
-rw-r--r--service/java/com/android/server/wifi/WifiStateMachine.java78
-rw-r--r--tests/wifitests/src/com/android/server/wifi/WifiConnectivityManagerTest.java2
4 files changed, 70 insertions, 53 deletions
diff --git a/service/java/com/android/server/wifi/WifiConfigManager.java b/service/java/com/android/server/wifi/WifiConfigManager.java
index c1a334a5d..dbe67e88e 100644
--- a/service/java/com/android/server/wifi/WifiConfigManager.java
+++ b/service/java/com/android/server/wifi/WifiConfigManager.java
@@ -190,7 +190,7 @@ public class WifiConfigManager {
*/
private static final int[] NETWORK_SELECTION_DISABLE_THRESHOLD = {
-1, // threshold for NETWORK_SELECTION_ENABLE
- 1, // threshold for DISABLED_BAD_LINK
+ 1, // threshold for DISABLED_BAD_LINK (deprecated)
5, // threshold for DISABLED_ASSOCIATION_REJECTION
5, // threshold for DISABLED_AUTHENTICATION_FAILURE
5, // threshold for DISABLED_DHCP_FAILURE
@@ -206,7 +206,7 @@ public class WifiConfigManager {
*/
private static final int[] NETWORK_SELECTION_DISABLE_TIMEOUT = {
Integer.MAX_VALUE, // threshold for NETWORK_SELECTION_ENABLE
- 15, // threshold for DISABLED_BAD_LINK
+ 15, // threshold for DISABLED_BAD_LINK (deprecated)
5, // threshold for DISABLED_ASSOCIATION_REJECTION
5, // threshold for DISABLED_AUTHENTICATION_FAILURE
5, // threshold for DISABLED_DHCP_FAILURE
@@ -243,11 +243,6 @@ public class WifiConfigManager {
public AtomicInteger mBandAward5Ghz = new AtomicInteger();
/**
- * If Connectivity Service has triggered an unwanted network disconnect
- */
- public long mLastUnwantedNetworkDisconnectTimestamp = 0;
-
- /**
* Framework keeps a list of ephemeral SSIDs that where deleted by user,
* so as, framework knows not to autojoin again those SSIDs based on scorer input.
* The list is never cleared up.
@@ -3222,29 +3217,6 @@ public class WifiConfigManager {
}
}
- /** called when CS ask WiFistateMachine to disconnect the current network
- * because the score is bad.
- */
- void handleBadNetworkDisconnectReport(int netId, WifiInfo info) {
- /* TODO verify the bad network is current */
- WifiConfiguration config = mConfiguredNetworks.getForCurrentUser(netId);
- if (config != null) {
- if ((info.is24GHz() && info.getRssi()
- <= WifiQualifiedNetworkSelector.QUALIFIED_RSSI_24G_BAND)
- || (info.is5GHz() && info.getRssi()
- <= WifiQualifiedNetworkSelector.QUALIFIED_RSSI_5G_BAND)) {
- // We do not block due to bad RSSI since network selection should not select bad
- // RSSI candidate
- } else {
- // We got disabled but RSSI is good, so disable hard
- updateNetworkSelectionStatus(config,
- WifiConfiguration.NetworkSelectionStatus.DISABLED_BAD_LINK);
- }
- }
- // Record last time Connectivity Service switched us away from WiFi and onto Cell
- mLastUnwantedNetworkDisconnectTimestamp = mClock.currentTimeMillis();
- }
-
int getMaxDhcpRetries() {
return mFacade.getIntegerSetting(mContext,
Settings.Global.WIFI_MAX_DHCP_RETRY_COUNT,
diff --git a/service/java/com/android/server/wifi/WifiConnectivityManager.java b/service/java/com/android/server/wifi/WifiConnectivityManager.java
index 7f3d5d7d9..1c388c120 100644
--- a/service/java/com/android/server/wifi/WifiConnectivityManager.java
+++ b/service/java/com/android/server/wifi/WifiConnectivityManager.java
@@ -510,7 +510,7 @@ public class WifiConnectivityManager {
public WifiConnectivityManager(Context context, WifiStateMachine stateMachine,
WifiScanner scanner, WifiConfigManager configManager, WifiInfo wifiInfo,
WifiQualifiedNetworkSelector qualifiedNetworkSelector,
- WifiInjector wifiInjector, Looper looper) {
+ WifiInjector wifiInjector, Looper looper, boolean enable) {
mStateMachine = stateMachine;
mScanner = scanner;
mConfigManager = configManager;
@@ -545,7 +545,10 @@ public class WifiConnectivityManager {
// Register for all single scan results
mScanner.registerScanListener(mAllSingleScanListener);
- Log.i(TAG, "ConnectivityScanManager initialized ");
+ mWifiConnectivityManagerEnabled = enable;
+
+ Log.i(TAG, "ConnectivityScanManager initialized and "
+ + (enable ? "enabled" : "disabled"));
}
/**
@@ -1118,6 +1121,8 @@ public class WifiConnectivityManager {
stopConnectivityScan();
resetLastPeriodicSingleScanTimeStamp();
mLastConnectionAttemptBssid = null;
+ } else if (mWifiConnectivityManagerEnabled) {
+ startConnectivityScan(SCAN_IMMEDIATELY);
}
}
@@ -1133,6 +1138,8 @@ public class WifiConnectivityManager {
stopConnectivityScan();
resetLastPeriodicSingleScanTimeStamp();
mLastConnectionAttemptBssid = null;
+ } else if (mWifiEnabled) {
+ startConnectivityScan(SCAN_IMMEDIATELY);
}
}
diff --git a/service/java/com/android/server/wifi/WifiStateMachine.java b/service/java/com/android/server/wifi/WifiStateMachine.java
index ccb313624..65bf10233 100644
--- a/service/java/com/android/server/wifi/WifiStateMachine.java
+++ b/service/java/com/android/server/wifi/WifiStateMachine.java
@@ -96,6 +96,7 @@ import android.util.Log;
import android.util.SparseArray;
import com.android.internal.R;
+import com.android.internal.annotations.GuardedBy;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.app.IBatteryStats;
import com.android.internal.util.AsyncChannel;
@@ -544,10 +545,14 @@ public class WifiStateMachine extends StateMachine implements WifiNative.WifiRss
private WifiScanner mWifiScanner;
- private int mConnectionRequests = 0;
+ @GuardedBy("mWifiReqCountLock")
+ private int mConnectionReqCount = 0;
private WifiNetworkFactory mNetworkFactory;
+ @GuardedBy("mWifiReqCountLock")
+ private int mUntrustedReqCount = 0;
private UntrustedWifiNetworkFactory mUntrustedNetworkFactory;
private WifiNetworkAgent mNetworkAgent;
+ private final Object mWifiReqCountLock = new Object();
private String[] mWhiteListedSsids = null;
@@ -2535,7 +2540,8 @@ public class WifiStateMachine extends StateMachine implements WifiNative.WifiRss
sb.append(" known=").append(mNumScanResultsKnown);
sb.append(" got=").append(mNumScanResultsReturned);
sb.append(String.format(" bcn=%d", mRunningBeaconCount));
- sb.append(String.format(" con=%d", mConnectionRequests));
+ sb.append(String.format(" con=%d", mConnectionReqCount));
+ sb.append(String.format(" untrustedcn=%d", mUntrustedReqCount));
key = mWifiConfigManager.getLastSelectedConfiguration();
if (key != null) {
sb.append(" last=").append(key);
@@ -3906,23 +3912,33 @@ public class WifiStateMachine extends StateMachine implements WifiNative.WifiRss
@Override
protected void needNetworkFor(NetworkRequest networkRequest, int score) {
- ++mConnectionRequests;
+ synchronized (mWifiReqCountLock) {
+ if (++mConnectionReqCount == 1) {
+ if (mWifiConnectivityManager != null && mUntrustedReqCount == 0) {
+ mWifiConnectivityManager.enable(true);
+ }
+ }
+ }
}
@Override
protected void releaseNetworkFor(NetworkRequest networkRequest) {
- --mConnectionRequests;
+ synchronized (mWifiReqCountLock) {
+ if (--mConnectionReqCount == 0) {
+ if (mWifiConnectivityManager != null && mUntrustedReqCount == 0) {
+ mWifiConnectivityManager.enable(false);
+ }
+ }
+ }
}
public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
- pw.println("mConnectionRequests " + mConnectionRequests);
+ pw.println("mConnectionReqCount " + mConnectionReqCount);
}
}
private class UntrustedWifiNetworkFactory extends NetworkFactory {
- private int mUntrustedReqCount;
-
public UntrustedWifiNetworkFactory(Looper l, Context c, String tag, NetworkCapabilities f) {
super(l, c, tag, f);
}
@@ -3931,9 +3947,14 @@ public class WifiStateMachine extends StateMachine implements WifiNative.WifiRss
protected void needNetworkFor(NetworkRequest networkRequest, int score) {
if (!networkRequest.networkCapabilities.hasCapability(
NetworkCapabilities.NET_CAPABILITY_TRUSTED)) {
- if (++mUntrustedReqCount == 1) {
- if (mWifiConnectivityManager != null) {
- mWifiConnectivityManager.setUntrustedConnectionAllowed(true);
+ synchronized (mWifiReqCountLock) {
+ if (++mUntrustedReqCount == 1) {
+ if (mWifiConnectivityManager != null) {
+ if (mConnectionReqCount == 0) {
+ mWifiConnectivityManager.enable(true);
+ }
+ mWifiConnectivityManager.setUntrustedConnectionAllowed(true);
+ }
}
}
}
@@ -3943,9 +3964,14 @@ public class WifiStateMachine extends StateMachine implements WifiNative.WifiRss
protected void releaseNetworkFor(NetworkRequest networkRequest) {
if (!networkRequest.networkCapabilities.hasCapability(
NetworkCapabilities.NET_CAPABILITY_TRUSTED)) {
- if (--mUntrustedReqCount == 0) {
- if (mWifiConnectivityManager != null) {
- mWifiConnectivityManager.setUntrustedConnectionAllowed(false);
+ synchronized (mWifiReqCountLock) {
+ if (--mUntrustedReqCount == 0) {
+ if (mWifiConnectivityManager != null) {
+ mWifiConnectivityManager.setUntrustedConnectionAllowed(false);
+ if (mConnectionReqCount == 0) {
+ mWifiConnectivityManager.enable(false);
+ }
+ }
}
}
}
@@ -4682,10 +4708,12 @@ public class WifiStateMachine extends StateMachine implements WifiNative.WifiRss
if (mWifiScanner == null) {
mWifiScanner = mFacade.makeWifiScanner(mContext, getHandler().getLooper());
- mWifiConnectivityManager = new WifiConnectivityManager(mContext,
- WifiStateMachine.this, mWifiScanner, mWifiConfigManager, mWifiInfo,
- mWifiQualifiedNetworkSelector, mWifiInjector,
- getHandler().getLooper());
+ synchronized (mWifiReqCountLock) {
+ mWifiConnectivityManager = new WifiConnectivityManager(mContext,
+ WifiStateMachine.this, mWifiScanner, mWifiConfigManager, mWifiInfo,
+ mWifiQualifiedNetworkSelector, mWifiInjector,
+ getHandler().getLooper(), hasConnectionRequests());
+ }
}
mWifiLogger.startLogging(DBG);
@@ -7063,8 +7091,6 @@ public class WifiStateMachine extends StateMachine implements WifiNative.WifiRss
break;
case CMD_UNWANTED_NETWORK:
if (message.arg1 == NETWORK_STATUS_UNWANTED_DISCONNECT) {
- mWifiConfigManager.handleBadNetworkDisconnectReport(
- mLastNetworkId, mWifiInfo);
mWifiNative.disconnect();
transitionTo(mDisconnectingState);
} else if (message.arg1 == NETWORK_STATUS_UNWANTED_DISABLE_AUTOJOIN ||
@@ -8073,7 +8099,11 @@ public class WifiStateMachine extends StateMachine implements WifiNative.WifiRss
* @param bssid BSSID of the network
*/
public void autoConnectToNetwork(int networkId, String bssid) {
- sendMessage(CMD_AUTO_CONNECT, networkId, 0, bssid);
+ synchronized (mWifiReqCountLock) {
+ if (hasConnectionRequests()) {
+ sendMessage(CMD_AUTO_CONNECT, networkId, 0, bssid);
+ }
+ }
}
/**
@@ -8216,4 +8246,12 @@ public class WifiStateMachine extends StateMachine implements WifiNative.WifiRss
}
return null;
}
+
+ /**
+ * Check if there is any connection request for WiFi network.
+ * Note, caller of this helper function must acquire mWifiReqCountLock.
+ */
+ private boolean hasConnectionRequests() {
+ return mConnectionReqCount > 0 || mUntrustedReqCount > 0;
+ }
}
diff --git a/tests/wifitests/src/com/android/server/wifi/WifiConnectivityManagerTest.java b/tests/wifitests/src/com/android/server/wifi/WifiConnectivityManagerTest.java
index 022997d67..b1f88ecc9 100644
--- a/tests/wifitests/src/com/android/server/wifi/WifiConnectivityManagerTest.java
+++ b/tests/wifitests/src/com/android/server/wifi/WifiConnectivityManagerTest.java
@@ -75,7 +75,7 @@ public class WifiConnectivityManagerTest {
mWifiQNS = mockWifiQualifiedNetworkSelector();
mWifiConnectivityManager = new WifiConnectivityManager(mContext, mWifiStateMachine,
mWifiScanner, mWifiConfigManager, mWifiInfo, mWifiQNS, mWifiInjector,
- mLooper.getLooper());
+ mLooper.getLooper(), true);
mWifiConnectivityManager.setWifiEnabled(true);
when(mClock.elapsedRealtime()).thenReturn(SystemClock.elapsedRealtime());
}