summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorandroid-build-team Robot <android-build-team-robot@google.com>2019-05-25 23:11:38 +0000
committerandroid-build-team Robot <android-build-team-robot@google.com>2019-05-25 23:11:38 +0000
commit55d1fa762624c4671a61db7f6564a2fd50d04d45 (patch)
tree38f2f632f5eca9cb6b7bd5eba08ff334feded8f1
parente93bc3e343118636805e702d0bc47573bb2ae423 (diff)
parent8a2a97976f1ad31b0981abc134139a3252ea13f2 (diff)
downloadandroid_frameworks_opt_net_wifi-55d1fa762624c4671a61db7f6564a2fd50d04d45.tar.gz
android_frameworks_opt_net_wifi-55d1fa762624c4671a61db7f6564a2fd50d04d45.tar.bz2
android_frameworks_opt_net_wifi-55d1fa762624c4671a61db7f6564a2fd50d04d45.zip
Snap for 5605988 from 8a2a97976f1ad31b0981abc134139a3252ea13f2 to qt-release
Change-Id: I63829fcba5c86d866a212195dc57b839bb1d03f6
-rw-r--r--service/java/com/android/server/wifi/ClientModeImpl.java3
-rw-r--r--service/java/com/android/server/wifi/WifiLastResortWatchdog.java48
-rw-r--r--service/java/com/android/server/wifi/aware/WifiAwareStateManager.java4
-rw-r--r--tests/wifitests/src/com/android/server/wifi/WifiLastResortWatchdogTest.java39
-rw-r--r--tests/wifitests/src/com/android/server/wifi/WifiServiceImplTest.java2
-rw-r--r--tests/wifitests/src/com/android/server/wifi/aware/WifiAwareStateManagerTest.java89
6 files changed, 165 insertions, 20 deletions
diff --git a/service/java/com/android/server/wifi/ClientModeImpl.java b/service/java/com/android/server/wifi/ClientModeImpl.java
index 4adf27ff0..008135051 100644
--- a/service/java/com/android/server/wifi/ClientModeImpl.java
+++ b/service/java/com/android/server/wifi/ClientModeImpl.java
@@ -955,6 +955,8 @@ public class ClientModeImpl extends StateMachine {
mWifiMetrics.getHandler());
mWifiMonitor.registerHandler(mInterfaceName, CMD_TARGET_BSSID,
mWifiMetrics.getHandler());
+ mWifiMonitor.registerHandler(mInterfaceName, WifiMonitor.NETWORK_CONNECTION_EVENT,
+ mWifiInjector.getWifiLastResortWatchdog().getHandler());
}
private void setMulticastFilter(boolean enabled) {
@@ -4274,6 +4276,7 @@ public class ClientModeImpl extends StateMachine {
mWifiInfo.setMacAddress(currentMacAddress);
Log.i(TAG, "Connecting with " + currentMacAddress + " as the mac address");
if (mWifiNative.connectToNetwork(mInterfaceName, config)) {
+ mWifiInjector.getWifiLastResortWatchdog().noteStartConnectTime();
mWifiMetrics.logStaEvent(StaEvent.TYPE_CMD_START_CONNECT, config);
mLastConnectAttemptTimestamp = mClock.getWallClockMillis();
mTargetWifiConfiguration = config;
diff --git a/service/java/com/android/server/wifi/WifiLastResortWatchdog.java b/service/java/com/android/server/wifi/WifiLastResortWatchdog.java
index 6889b5016..286e4ba47 100644
--- a/service/java/com/android/server/wifi/WifiLastResortWatchdog.java
+++ b/service/java/com/android/server/wifi/WifiLastResortWatchdog.java
@@ -20,6 +20,7 @@ import android.net.wifi.ScanResult;
import android.net.wifi.WifiConfiguration;
import android.os.Handler;
import android.os.Looper;
+import android.os.Message;
import android.text.TextUtils;
import android.util.LocalLog;
import android.util.Log;
@@ -74,6 +75,8 @@ public class WifiLastResortWatchdog {
// Number of milliseconds to wait before re-enable Watchdog triger
@VisibleForTesting
public static final long LAST_TRIGGER_TIMEOUT_MILLIS = 2 * 3600 * 1000; // 2 hours
+ @VisibleForTesting
+ public static final int ABNORMAL_SUCCESSFUL_CONNECTION_DURATION_MS = 1000 * 30; // 30 seconds
/**
* Cached WifiConfigurations of available networks seen within MAX_BSSID_AGE scan results
@@ -105,6 +108,8 @@ public class WifiLastResortWatchdog {
// If any connection failure happened after watchdog triggering restart then assume watchdog
// did not fix the problem
private boolean mWatchdogFixedWifi = true;
+ private long mLastStartConnectTime = 0;
+ private Handler mHandler;
/**
* Local log used for debugging any WifiLastResortWatchdog issues.
@@ -118,6 +123,49 @@ public class WifiLastResortWatchdog {
mWifiMetrics = wifiMetrics;
mClientModeImpl = clientModeImpl;
mClientModeImplLooper = clientModeImplLooper;
+ mHandler = new Handler(clientModeImplLooper) {
+ public void handleMessage(Message msg) {
+ processMessage(msg);
+ }
+ };
+ }
+
+ /**
+ * Returns handler for L2 events from supplicant.
+ * @return Handler
+ */
+ public Handler getHandler() {
+ return mHandler;
+ }
+
+ /**
+ * Refreshes when the last CMD_START_CONNECT is triggered.
+ */
+ public void noteStartConnectTime() {
+ mLastStartConnectTime = mClock.getElapsedSinceBootMillis();
+ }
+
+ private void processMessage(Message msg) {
+ switch (msg.what) {
+ case WifiMonitor.NETWORK_CONNECTION_EVENT:
+ // Trigger bugreport for successful connections that take abnormally long
+ if (mLastStartConnectTime > 0) {
+ long durationMs = mClock.getElapsedSinceBootMillis() - mLastStartConnectTime;
+ if (durationMs > ABNORMAL_SUCCESSFUL_CONNECTION_DURATION_MS) {
+ final String bugTitle = "Wi-Fi Bugreport: Abnormal connection time";
+ final String bugDetail = "Expected connection to take less than "
+ + ABNORMAL_SUCCESSFUL_CONNECTION_DURATION_MS + " milliseconds. "
+ + "Actually took " + durationMs + " milliseconds.";
+ mWifiInjector.getClientModeImplHandler().post(() -> {
+ mClientModeImpl.takeBugReport(bugTitle, bugDetail);
+ });
+ }
+ mLastStartConnectTime = 0;
+ }
+ break;
+ default:
+ return;
+ }
}
/**
diff --git a/service/java/com/android/server/wifi/aware/WifiAwareStateManager.java b/service/java/com/android/server/wifi/aware/WifiAwareStateManager.java
index 36cabd646..9b096e525 100644
--- a/service/java/com/android/server/wifi/aware/WifiAwareStateManager.java
+++ b/service/java/com/android/server/wifi/aware/WifiAwareStateManager.java
@@ -1413,7 +1413,9 @@ public class WifiAwareStateManager implements WifiAwareShellCommand.DelegatedShe
*/
onAwareDownLocal();
-
+ if (reason != NanStatusType.SUCCESS) {
+ sendAwareStateChangedBroadcast(false);
+ }
break;
}
case NOTIFICATION_TYPE_ON_MESSAGE_SEND_SUCCESS: {
diff --git a/tests/wifitests/src/com/android/server/wifi/WifiLastResortWatchdogTest.java b/tests/wifitests/src/com/android/server/wifi/WifiLastResortWatchdogTest.java
index 9ae382640..dab283539 100644
--- a/tests/wifitests/src/com/android/server/wifi/WifiLastResortWatchdogTest.java
+++ b/tests/wifitests/src/com/android/server/wifi/WifiLastResortWatchdogTest.java
@@ -24,6 +24,7 @@ import static org.mockito.MockitoAnnotations.*;
import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiSsid;
+import android.os.Handler;
import android.os.test.TestLooper;
import android.util.Pair;
@@ -72,6 +73,7 @@ public class WifiLastResortWatchdogTest {
mLastResortWatchdog.setBugReportProbability(1);
when(mClientModeImpl.getWifiInfo()).thenReturn(mWifiInfo);
when(mWifiInfo.getSSID()).thenReturn(TEST_NETWORK_SSID);
+ when(mWifiInjector.getClientModeImplHandler()).thenReturn(mLastResortWatchdog.getHandler());
}
private List<Pair<ScanDetail, WifiConfiguration>> createFilteredQnsCandidates(String[] ssids,
@@ -2152,4 +2154,41 @@ public class WifiLastResortWatchdogTest {
verify(mWifiMetrics, times(1)).incrementNumLastResortWatchdogSuccesses();
}
+ /**
+ * Verifies that when a connection takes too long (time difference between
+ * StaEvent.TYPE_CMD_START_CONNECT and StaEvent.TYPE_NETWORK_CONNECTION_EVENT) a bugreport is
+ * taken.
+ */
+ @Test
+ public void testAbnormalConnectionTimeTriggersBugreport() throws Exception {
+ // first verifies that bugreports are not taken when connection takes less than
+ // WifiLastResortWatchdog.ABNORMAL_SUCCESSFUL_CONNECTION_DURATION_MS
+ when(mClock.getElapsedSinceBootMillis()).thenReturn(1L);
+ mLastResortWatchdog.noteStartConnectTime();
+ when(mClock.getElapsedSinceBootMillis()).thenReturn(
+ (long) WifiLastResortWatchdog.ABNORMAL_SUCCESSFUL_CONNECTION_DURATION_MS);
+ Handler handler = mLastResortWatchdog.getHandler();
+ handler.sendMessage(
+ handler.obtainMessage(WifiMonitor.NETWORK_CONNECTION_EVENT, 0, 0, null));
+ mLooper.dispatchAll();
+ verify(mClientModeImpl, never()).takeBugReport(anyString(), anyString());
+
+ // Now verify that bugreport is taken
+ mLastResortWatchdog.noteStartConnectTime();
+ when(mClock.getElapsedSinceBootMillis()).thenReturn(
+ (long) 2 * WifiLastResortWatchdog.ABNORMAL_SUCCESSFUL_CONNECTION_DURATION_MS + 1);
+ handler.sendMessage(
+ handler.obtainMessage(WifiMonitor.NETWORK_CONNECTION_EVENT, 0, 0, null));
+ mLooper.dispatchAll();
+ verify(mClientModeImpl).takeBugReport(anyString(), anyString());
+
+ // Verify additional connections (without more TYPE_CMD_START_CONNECT) don't trigger more
+ // bugreports.
+ when(mClock.getElapsedSinceBootMillis()).thenReturn(
+ (long) 4 * WifiLastResortWatchdog.ABNORMAL_SUCCESSFUL_CONNECTION_DURATION_MS);
+ handler.sendMessage(
+ handler.obtainMessage(WifiMonitor.NETWORK_CONNECTION_EVENT, 0, 0, null));
+ mLooper.dispatchAll();
+ verify(mClientModeImpl).takeBugReport(anyString(), anyString());
+ }
}
diff --git a/tests/wifitests/src/com/android/server/wifi/WifiServiceImplTest.java b/tests/wifitests/src/com/android/server/wifi/WifiServiceImplTest.java
index 45d6af44d..0377001e6 100644
--- a/tests/wifitests/src/com/android/server/wifi/WifiServiceImplTest.java
+++ b/tests/wifitests/src/com/android/server/wifi/WifiServiceImplTest.java
@@ -1193,7 +1193,7 @@ public class WifiServiceImplTest {
.thenReturn(TEST_WIFI_CONFIGURATION_LIST);
// no permission = target SDK=Q && not a carrier app
- when(mTelephonyManager.checkCarrierPrivilegesForPackage(anyString())).thenReturn(
+ when(mTelephonyManager.checkCarrierPrivilegesForPackageAnyPhone(anyString())).thenReturn(
TelephonyManager.CARRIER_PRIVILEGE_STATUS_NO_ACCESS);
ParceledListSlice<WifiConfiguration> configs =
diff --git a/tests/wifitests/src/com/android/server/wifi/aware/WifiAwareStateManagerTest.java b/tests/wifitests/src/com/android/server/wifi/aware/WifiAwareStateManagerTest.java
index 04ecfe7d4..d6b1b38d1 100644
--- a/tests/wifitests/src/com/android/server/wifi/aware/WifiAwareStateManagerTest.java
+++ b/tests/wifitests/src/com/android/server/wifi/aware/WifiAwareStateManagerTest.java
@@ -357,7 +357,7 @@ public class WifiAwareStateManagerTest {
// (1) enable usage
mDut.enableUsage();
mMockLooper.dispatchAll();
- validateCorrectAwareStatusChangeBroadcast(inOrder, true);
+ validateCorrectAwareStatusChangeBroadcast(inOrder);
inOrder.verify(mMockNative).getCapabilities(transactionId.capture());
mDut.onCapabilitiesUpdateResponse(transactionId.getValue(), getCapabilities());
mMockLooper.dispatchAll();
@@ -403,7 +403,7 @@ public class WifiAwareStateManagerTest {
// (1) check initial state
mDut.enableUsage();
mMockLooper.dispatchAll();
- validateCorrectAwareStatusChangeBroadcast(inOrder, true);
+ validateCorrectAwareStatusChangeBroadcast(inOrder);
inOrder.verify(mMockNative).getCapabilities(transactionId.capture());
mDut.onCapabilitiesUpdateResponse(transactionId.getValue(), getCapabilities());
mMockLooper.dispatchAll();
@@ -415,7 +415,7 @@ public class WifiAwareStateManagerTest {
collector.checkThat("usage disabled", mDut.isUsageEnabled(), equalTo(false));
inOrder.verify(mMockNative).disable(transactionId.capture());
mDut.onDisableResponse(transactionId.getValue(), NanStatusType.SUCCESS);
- validateCorrectAwareStatusChangeBroadcast(inOrder, false);
+ validateCorrectAwareStatusChangeBroadcast(inOrder);
// (3) try connecting and validate that get failure callback (though app should be aware of
// non-availability through state change broadcast and/or query API)
@@ -448,7 +448,7 @@ public class WifiAwareStateManagerTest {
// (1) check initial state
mDut.enableUsage();
mMockLooper.dispatchAll();
- validateCorrectAwareStatusChangeBroadcast(inOrder, true);
+ validateCorrectAwareStatusChangeBroadcast(inOrder);
inOrderM.verify(mAwareMetricsMock).recordEnableUsage();
inOrder.verify(mMockNative).getCapabilities(transactionId.capture());
mDut.onCapabilitiesUpdateResponse(transactionId.getValue(), getCapabilities());
@@ -476,7 +476,7 @@ public class WifiAwareStateManagerTest {
inOrderM.verify(mAwareMetricsMock).recordAttachSessionDuration(anyLong());
inOrderM.verify(mAwareMetricsMock).recordDisableAware();
inOrderM.verify(mAwareMetricsMock).recordDisableUsage();
- validateCorrectAwareStatusChangeBroadcast(inOrder, false);
+ validateCorrectAwareStatusChangeBroadcast(inOrder);
validateInternalClientInfoCleanedUp(clientId);
mDut.onDisableResponse(transactionId.getValue(), NanStatusType.SUCCESS);
mMockLooper.dispatchAll();
@@ -498,7 +498,7 @@ public class WifiAwareStateManagerTest {
mMockLooper.dispatchAll();
inOrderM.verify(mAwareMetricsMock).recordEnableUsage();
collector.checkThat("usage enabled", mDut.isUsageEnabled(), equalTo(true));
- validateCorrectAwareStatusChangeBroadcast(inOrder, true);
+ validateCorrectAwareStatusChangeBroadcast(inOrder);
// (7) connect (should be successful)
mDut.connect(clientId, uid, pid, callingPackage, mockCallback, configRequest, false);
@@ -536,7 +536,7 @@ public class WifiAwareStateManagerTest {
// (1) check initial state
mDut.enableUsage();
mMockLooper.dispatchAll();
- validateCorrectAwareStatusChangeBroadcast(inOrder, true);
+ validateCorrectAwareStatusChangeBroadcast(inOrder);
inOrder.verify(mMockNative).getCapabilities(transactionId.capture());
mDut.onCapabilitiesUpdateResponse(transactionId.getValue(), getCapabilities());
mMockLooper.dispatchAll();
@@ -3148,7 +3148,8 @@ public class WifiAwareStateManagerTest {
mMockLooper.dispatchAll();
inOrder.verify(mMockNative).disable(transactionId.capture());
mDut.onDisableResponse(transactionId.getValue(), NanStatusType.SUCCESS);
- validateCorrectAwareStatusChangeBroadcast(inOrder, false);
+ collector.checkThat("usage disabled", mDut.isUsageEnabled(), equalTo(false));
+ validateCorrectAwareStatusChangeBroadcast(inOrder);
// (4) power state change: SCREEN ON (but DOZE still on - fakish but expect no changes)
simulatePowerStateChangeInteractive(false);
@@ -3167,7 +3168,8 @@ public class WifiAwareStateManagerTest {
// (5) power state change: DOZE OFF
simulatePowerStateChangeDoze(false);
mMockLooper.dispatchAll();
- validateCorrectAwareStatusChangeBroadcast(inOrder, true);
+ collector.checkThat("usage enabled", mDut.isUsageEnabled(), equalTo(true));
+ validateCorrectAwareStatusChangeBroadcast(inOrder);
verifyNoMoreInteractions(mMockNativeManager, mMockNative, mockCallback);
}
@@ -3212,7 +3214,8 @@ public class WifiAwareStateManagerTest {
mMockLooper.dispatchAll();
inOrder.verify(mMockNative).disable(transactionId.capture());
mDut.onDisableResponse(transactionId.getValue(), NanStatusType.SUCCESS);
- validateCorrectAwareStatusChangeBroadcast(inOrder, false);
+ collector.checkThat("usage disabled", mDut.isUsageEnabled(), equalTo(false));
+ validateCorrectAwareStatusChangeBroadcast(inOrder);
// disable other gating feature -> no change
simulatePowerStateChangeDoze(true);
@@ -3227,7 +3230,8 @@ public class WifiAwareStateManagerTest {
// (4) location mode change: enable
simulateLocationModeChange(true);
mMockLooper.dispatchAll();
- validateCorrectAwareStatusChangeBroadcast(inOrder, true);
+ collector.checkThat("usage enabled", mDut.isUsageEnabled(), equalTo(true));
+ validateCorrectAwareStatusChangeBroadcast(inOrder);
verifyNoMoreInteractions(mMockNativeManager, mMockNative, mockCallback);
}
@@ -3272,7 +3276,8 @@ public class WifiAwareStateManagerTest {
mMockLooper.dispatchAll();
inOrder.verify(mMockNative).disable(transactionId.capture());
mDut.onDisableResponse(transactionId.getValue(), NanStatusType.SUCCESS);
- validateCorrectAwareStatusChangeBroadcast(inOrder, false);
+ collector.checkThat("usage disabled", mDut.isUsageEnabled(), equalTo(false));
+ validateCorrectAwareStatusChangeBroadcast(inOrder);
// disable other gating feature -> no change
simulatePowerStateChangeDoze(true);
@@ -3287,11 +3292,63 @@ public class WifiAwareStateManagerTest {
// (4) wifi state change: enable
simulateWifiStateChange(true);
mMockLooper.dispatchAll();
- validateCorrectAwareStatusChangeBroadcast(inOrder, true);
+ collector.checkThat("usage enabled", mDut.isUsageEnabled(), equalTo(true));
+ validateCorrectAwareStatusChangeBroadcast(inOrder);
verifyNoMoreInteractions(mMockNativeManager, mMockNative, mockCallback);
}
+ /**
+ * Validate aware state change when get aware down from native
+ */
+ @Test
+ public void testWifiAwareStateChangeFromNative() throws Exception {
+ final int clientId = 12314;
+ final int uid = 1000;
+ final int pid = 2000;
+ final String callingPackage = "com.google.somePackage";
+ final ConfigRequest configRequest = new ConfigRequest.Builder().build();
+
+ IWifiAwareEventCallback mockCallback = mock(IWifiAwareEventCallback.class);
+ InOrder inOrder = inOrder(mMockContext, mMockNative, mockCallback);
+ ArgumentCaptor<Short> transactionId = ArgumentCaptor.forClass(Short.class);
+
+ // (0) check initial state
+ mDut.enableUsage();
+ mMockLooper.dispatchAll();
+ validateCorrectAwareStatusChangeBroadcast(inOrder);
+ inOrder.verify(mMockNative).getCapabilities(transactionId.capture());
+ mDut.onCapabilitiesUpdateResponse(transactionId.getValue(), getCapabilities());
+ mMockLooper.dispatchAll();
+ collector.checkThat("usage enabled", mDut.isUsageEnabled(), equalTo(true));
+
+ // (1) connect client
+ mDut.connect(clientId, uid, pid, callingPackage, mockCallback, configRequest, false);
+ mMockLooper.dispatchAll();
+ inOrder.verify(mMockNative).enableAndConfigure(transactionId.capture(),
+ eq(configRequest), eq(false), eq(true), eq(true), eq(false));
+ mDut.onConfigSuccessResponse(transactionId.getValue());
+ mMockLooper.dispatchAll();
+ inOrder.verify(mockCallback).onConnectSuccess(clientId);
+
+ // (2) Aware down notification from native
+ mDut.onAwareDownNotification(NanStatusType.UNSUPPORTED_CONCURRENCY_NAN_DISABLED);
+ mMockLooper.dispatchAll();
+ collector.checkThat("usage enabled", mDut.isUsageEnabled(), equalTo(true));
+ validateCorrectAwareStatusChangeBroadcast(inOrder);
+
+ // (3) try reconnect client
+ mDut.connect(clientId, uid, pid, callingPackage, mockCallback, configRequest, false);
+ mMockLooper.dispatchAll();
+ inOrder.verify(mMockNative).enableAndConfigure(transactionId.capture(),
+ eq(configRequest), eq(false), eq(true), eq(true), eq(false));
+ mDut.onConfigSuccessResponse(transactionId.getValue());
+ mMockLooper.dispatchAll();
+ inOrder.verify(mockCallback).onConnectSuccess(clientId);
+
+ verifyNoMoreInteractions(mMockNative, mockCallback);
+ }
+
/*
* Tests of internal state of WifiAwareStateManager: very limited (not usually
* a good idea). However, these test that the internal state is cleaned-up
@@ -3352,12 +3409,8 @@ public class WifiAwareStateManagerTest {
/**
* Validates that the broadcast sent on Aware status change is correct.
- *
- * @param expectedEnabled The expected change status - i.e. are we expected
- * to announce that Aware is enabled (true) or disabled (false).
*/
- private void validateCorrectAwareStatusChangeBroadcast(InOrder inOrder,
- boolean expectedEnabled) {
+ private void validateCorrectAwareStatusChangeBroadcast(InOrder inOrder) {
ArgumentCaptor<Intent> intent = ArgumentCaptor.forClass(Intent.class);
inOrder.verify(mMockContext).sendBroadcastAsUser(intent.capture(), eq(UserHandle.ALL));