diff options
author | android-build-team Robot <android-build-team-robot@google.com> | 2019-05-25 23:11:38 +0000 |
---|---|---|
committer | android-build-team Robot <android-build-team-robot@google.com> | 2019-05-25 23:11:38 +0000 |
commit | 55d1fa762624c4671a61db7f6564a2fd50d04d45 (patch) | |
tree | 38f2f632f5eca9cb6b7bd5eba08ff334feded8f1 | |
parent | e93bc3e343118636805e702d0bc47573bb2ae423 (diff) | |
parent | 8a2a97976f1ad31b0981abc134139a3252ea13f2 (diff) | |
download | android_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
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)); |