summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMingguang Xu <mingguangxu@google.com>2020-09-03 10:43:08 -0700
committerMingguang Xu <mingguangxu@google.com>2020-09-09 21:25:44 -0700
commitd8f20d663f99203a51fa92dd0cba31712f68e650 (patch)
tree1be5fd184f93145fe5076a4acec2c637358ff558
parentedc209e114cb84977b592bd4ef2fe8203a68951c (diff)
Do not allow default network to be switched from WiFi to Cellular when RSSI is high
Under the two conditions: When external scorer takes action; The overlay to enable time hysteresis (config_wifiMinConfirmationDurationSendNetworkScoreEnabled) is enabled, on top of the minimum confirmation duration added for sending low score to Connectivity Service, add a check on RSSI: If RSSI is higher than or equal to a configurable threshold (default -67dBm), then donot send any low score to Connectivity Service. This guarantees that default network will not be switched from WiFi to Cellular when RSSI is high (user is seeing three or four bars on WiFi icon). The reason for adding RSSI check is that users are trained to look at high RSSI (e.g., three bars) as indication of good WiFi. This will certainly reduce any false alarms (especially for some IOT APs). Bug: 167643965 Test: atest com.android.server.wifi Signed-off-by: Mingguang Xu <mingguangxu@google.com> Change-Id: I31f1802a569603bbf4c50df2fbd73d71935e0f9d
-rw-r--r--service/java/com/android/server/wifi/DeviceConfigFacade.java15
-rw-r--r--service/java/com/android/server/wifi/WifiScoreReport.java19
-rw-r--r--tests/wifitests/src/com/android/server/wifi/DeviceConfigFacadeTest.java5
-rw-r--r--tests/wifitests/src/com/android/server/wifi/WifiScoreReportTest.java16
4 files changed, 47 insertions, 8 deletions
diff --git a/service/java/com/android/server/wifi/DeviceConfigFacade.java b/service/java/com/android/server/wifi/DeviceConfigFacade.java
index 3856ff1fd..a7bcfc764 100644
--- a/service/java/com/android/server/wifi/DeviceConfigFacade.java
+++ b/service/java/com/android/server/wifi/DeviceConfigFacade.java
@@ -139,6 +139,9 @@ public class DeviceConfigFacade {
// depends on the score evaluation period normally controlled by
// 'com.android.wifi.resources.R' config_wifiPollRssiIntervalMilliseconds.
static final int DEFAULT_MIN_CONFIRMATION_DURATION_SEND_HIGH_SCORE_MS = 0;
+ // Default RSSI threshold in dBm above which low score is not sent to connectivity service
+ // when external scorer takes action.
+ static final int DEFAULT_RSSI_THRESHOLD_NOT_SEND_LOW_SCORE_TO_CS_DBM = -67;
// Cached values of fields updated via updateDeviceConfigFlags()
private boolean mIsAbnormalConnectionBugreportEnabled;
private int mAbnormalConnectionDurationMs;
@@ -189,6 +192,7 @@ public class DeviceConfigFacade {
private int mHealthMonitorFwAlertValidTimeMs;
private int mMinConfirmationDurationSendLowScoreMs;
private int mMinConfirmationDurationSendHighScoreMs;
+ private int mRssiThresholdNotSendLowScoreToCsDbm;
public DeviceConfigFacade(Context context, Handler handler, WifiMetrics wifiMetrics) {
mContext = context;
@@ -342,6 +346,9 @@ public class DeviceConfigFacade {
mMinConfirmationDurationSendHighScoreMs = DeviceConfig.getInt(NAMESPACE,
"min_confirmation_duration_send_high_score_ms",
DEFAULT_MIN_CONFIRMATION_DURATION_SEND_HIGH_SCORE_MS);
+ mRssiThresholdNotSendLowScoreToCsDbm = DeviceConfig.getInt(NAMESPACE,
+ "rssi_threshold_not_send_low_score_to_cs_dbm",
+ DEFAULT_RSSI_THRESHOLD_NOT_SEND_LOW_SCORE_TO_CS_DBM);
}
private Set<String> getUnmodifiableSetQuoted(String key) {
@@ -706,4 +713,12 @@ public class DeviceConfigFacade {
public int getMinConfirmationDurationSendHighScoreMs() {
return mMinConfirmationDurationSendHighScoreMs;
}
+
+ /**
+ * Gets the RSSI threshold above which low score is not sent to connectivity service when
+ * external scorer takes action.
+ */
+ public int getRssiThresholdNotSendLowScoreToCsDbm() {
+ return mRssiThresholdNotSendLowScoreToCsDbm;
+ }
}
diff --git a/service/java/com/android/server/wifi/WifiScoreReport.java b/service/java/com/android/server/wifi/WifiScoreReport.java
index 89f0445cb..e918b73d5 100644
--- a/service/java/com/android/server/wifi/WifiScoreReport.java
+++ b/service/java/com/android/server/wifi/WifiScoreReport.java
@@ -189,14 +189,25 @@ public class WifiScoreReport {
&& mContext.getResources().getBoolean(
R.bool.config_wifiMinConfirmationDurationSendNetworkScoreEnabled)) {
long millis = mClock.getWallClockMillis();
- if (mLastScoreBreachLowTimeMillis != INVALID_WALL_CLOCK_MILLIS
- && (millis - mLastScoreBreachLowTimeMillis)
- < mDeviceConfigFacade.getMinConfirmationDurationSendLowScoreMs()) {
- return;
+ if (mLastScoreBreachLowTimeMillis != INVALID_WALL_CLOCK_MILLIS) {
+ if (mWifiInfo.getRssi()
+ >= mDeviceConfigFacade.getRssiThresholdNotSendLowScoreToCsDbm()) {
+ Log.d(TAG, "Not reporting low score because RSSI is high "
+ + mWifiInfo.getRssi());
+ return;
+ }
+ if ((millis - mLastScoreBreachLowTimeMillis)
+ < mDeviceConfigFacade.getMinConfirmationDurationSendLowScoreMs()) {
+ Log.d(TAG, "Not reporting low score because elapsed time is shorter than "
+ + "the minimum confirmation duration");
+ return;
+ }
}
if (mLastScoreBreachHighTimeMillis != INVALID_WALL_CLOCK_MILLIS
&& (millis - mLastScoreBreachHighTimeMillis)
< mDeviceConfigFacade.getMinConfirmationDurationSendHighScoreMs()) {
+ Log.d(TAG, "Not reporting high score because elapsed time is shorter than "
+ + "the minimum confirmation duration");
return;
}
}
diff --git a/tests/wifitests/src/com/android/server/wifi/DeviceConfigFacadeTest.java b/tests/wifitests/src/com/android/server/wifi/DeviceConfigFacadeTest.java
index 43a16fe4c..a570d2948 100644
--- a/tests/wifitests/src/com/android/server/wifi/DeviceConfigFacadeTest.java
+++ b/tests/wifitests/src/com/android/server/wifi/DeviceConfigFacadeTest.java
@@ -209,6 +209,8 @@ public class DeviceConfigFacadeTest extends WifiBaseTest {
mDeviceConfigFacade.getMinConfirmationDurationSendLowScoreMs());
assertEquals(DeviceConfigFacade.DEFAULT_MIN_CONFIRMATION_DURATION_SEND_HIGH_SCORE_MS,
mDeviceConfigFacade.getMinConfirmationDurationSendHighScoreMs());
+ assertEquals(DeviceConfigFacade.DEFAULT_RSSI_THRESHOLD_NOT_SEND_LOW_SCORE_TO_CS_DBM,
+ mDeviceConfigFacade.getRssiThresholdNotSendLowScoreToCsDbm());
}
/**
@@ -315,6 +317,8 @@ public class DeviceConfigFacadeTest extends WifiBaseTest {
anyInt())).thenReturn(4000);
when(DeviceConfig.getInt(anyString(), eq("min_confirmation_duration_send_high_score_ms"),
anyInt())).thenReturn(1000);
+ when(DeviceConfig.getInt(anyString(), eq("rssi_threshold_not_send_low_score_to_cs_dbm"),
+ anyInt())).thenReturn(-70);
mOnPropertiesChangedListenerCaptor.getValue().onPropertiesChanged(null);
// Verifying fields are updated to the new values
@@ -373,5 +377,6 @@ public class DeviceConfigFacadeTest extends WifiBaseTest {
assertEquals(1000, mDeviceConfigFacade.getHealthMonitorFwAlertValidTimeMs());
assertEquals(4000, mDeviceConfigFacade.getMinConfirmationDurationSendLowScoreMs());
assertEquals(1000, mDeviceConfigFacade.getMinConfirmationDurationSendHighScoreMs());
+ assertEquals(-70, mDeviceConfigFacade.getRssiThresholdNotSendLowScoreToCsDbm());
}
}
diff --git a/tests/wifitests/src/com/android/server/wifi/WifiScoreReportTest.java b/tests/wifitests/src/com/android/server/wifi/WifiScoreReportTest.java
index 82dbbe941..fb2d128cc 100644
--- a/tests/wifitests/src/com/android/server/wifi/WifiScoreReportTest.java
+++ b/tests/wifitests/src/com/android/server/wifi/WifiScoreReportTest.java
@@ -208,6 +208,8 @@ public class WifiScoreReportTest extends WifiBaseTest {
DeviceConfigFacade.DEFAULT_MIN_CONFIRMATION_DURATION_SEND_LOW_SCORE_MS);
when(mDeviceConfigFacade.getMinConfirmationDurationSendHighScoreMs()).thenReturn(
DeviceConfigFacade.DEFAULT_MIN_CONFIRMATION_DURATION_SEND_HIGH_SCORE_MS);
+ when(mDeviceConfigFacade.getRssiThresholdNotSendLowScoreToCsDbm()).thenReturn(
+ DeviceConfigFacade.DEFAULT_RSSI_THRESHOLD_NOT_SEND_LOW_SCORE_TO_CS_DBM);
}
/**
@@ -870,6 +872,7 @@ public class WifiScoreReportTest extends WifiBaseTest {
mClock.mStepMillis = 0;
mClock.mWallClockMillis = 10;
+ mWifiInfo.setRssi(-65);
scorerImpl.mScoreUpdateObserver.notifyScoreUpdate(scorerImpl.mSessionId, 49);
mLooper.dispatchAll();
verify(mNetworkAgent).sendNetworkScore(anyInt());
@@ -891,9 +894,11 @@ public class WifiScoreReportTest extends WifiBaseTest {
mClock.mWallClockMillis = 10;
scorerImpl.mScoreUpdateObserver.notifyScoreUpdate(scorerImpl.mSessionId, 60);
+ mWifiInfo.setRssi(-70);
mLooper.dispatchAll();
verify(mNetworkAgent).sendNetworkScore(60);
mClock.mWallClockMillis = 3010;
+ mWifiInfo.setRssi(-65);
scorerImpl.mScoreUpdateObserver.notifyScoreUpdate(scorerImpl.mSessionId, 59);
mLooper.dispatchAll();
verify(mNetworkAgent).sendNetworkScore(59);
@@ -904,11 +909,11 @@ public class WifiScoreReportTest extends WifiBaseTest {
}
/**
- * Verify confirmation duration is added for reporting low score when it is enabled in
- * config overlay
+ * Verify confirmation duration and RSSI check is added for reporting low score when it is
+ * enabled in config overlay
*/
@Test
- public void confirmationDurationIsAddedForSendingLowScore() throws Exception {
+ public void confirmationDurationAndRssiCheckIsAddedForSendingLowScore() throws Exception {
WifiConnectedNetworkScorerImpl scorerImpl = new WifiConnectedNetworkScorerImpl();
// Register Client for verification.
mWifiScoreReport.setWifiConnectedNetworkScorer(mAppBinder, scorerImpl);
@@ -929,11 +934,13 @@ public class WifiScoreReportTest extends WifiBaseTest {
verify(mNetworkAgent, never()).sendNetworkScore(anyInt());
mClock.mWallClockMillis = 10
+ mDeviceConfigFacade.DEFAULT_MIN_CONFIRMATION_DURATION_SEND_LOW_SCORE_MS;
+ mWifiInfo.setRssi(-65);
scorerImpl.mScoreUpdateObserver.notifyScoreUpdate(scorerImpl.mSessionId, 47);
mLooper.dispatchAll();
- verify(mNetworkAgent).sendNetworkScore(47);
+ verify(mNetworkAgent, never()).sendNetworkScore(47);
mClock.mWallClockMillis = 10
+ mDeviceConfigFacade.DEFAULT_MIN_CONFIRMATION_DURATION_SEND_LOW_SCORE_MS + 3000;
+ mWifiInfo.setRssi(-68);
scorerImpl.mScoreUpdateObserver.notifyScoreUpdate(scorerImpl.mSessionId, 46);
mLooper.dispatchAll();
verify(mNetworkAgent).sendNetworkScore(46);
@@ -958,6 +965,7 @@ public class WifiScoreReportTest extends WifiBaseTest {
mLooper.dispatchAll();
verify(mNetworkAgent, never()).sendNetworkScore(anyInt());
mClock.mWallClockMillis = 3000;
+ mWifiInfo.setRssi(-70);
scorerImpl.mScoreUpdateObserver.notifyScoreUpdate(scorerImpl.mSessionId, 51);
mLooper.dispatchAll();
verify(mNetworkAgent).sendNetworkScore(51);