diff options
-rw-r--r-- | service/java/com/android/server/wifi/WifiNative.java | 14 | ||||
-rw-r--r-- | service/tests/wifitests/src/com/android/server/wifi/WifiNativeInterfaceManagementTest.java | 93 |
2 files changed, 98 insertions, 9 deletions
diff --git a/service/java/com/android/server/wifi/WifiNative.java b/service/java/com/android/server/wifi/WifiNative.java index a7a5d275be..3694dfd0a1 100644 --- a/service/java/com/android/server/wifi/WifiNative.java +++ b/service/java/com/android/server/wifi/WifiNative.java @@ -938,6 +938,11 @@ public class WifiNative { if (!mSupplicantStaIfaceHal.teardownIface(iface.name)) { Log.e(TAG, "Failed to teardown iface in supplicant on " + iface); } + if (mMainlineSupplicant.isActive() + && !mMainlineSupplicant.removeStaInterface(iface.name)) { + Log.e(TAG, "Unable to tear down " + iface.name + " in the mainline supplicant" + + " after client interface destroyed"); + } if (!mWifiCondManager.tearDownClientInterface(iface.name)) { Log.e(TAG, "Failed to teardown iface in wificond on " + iface); } @@ -1869,6 +1874,11 @@ public class WifiNative { teardownInterface(iface.name); return false; } + if (mMainlineSupplicant.isActive() + && !mMainlineSupplicant.removeStaInterface(iface.name)) { + Log.e(TAG, "Unable to tear down " + iface.name + " in the mainline supplicant" + + " for switch to scan mode"); + } iface.type = Iface.IFACE_TYPE_STA_FOR_SCAN; stopSupplicantIfNecessary(); iface.featureSet = getSupportedFeatureSetInternal(iface.name); @@ -1940,6 +1950,10 @@ public class WifiNative { Log.e(TAG, "Failed to enable QoS policy feature for iface " + iface.name); } } + if (mMainlineSupplicant.isActive() + && !mMainlineSupplicant.addStaInterface(iface.name)) { + Log.e(TAG, "Unable to add interface " + iface.name + " to mainline supplicant"); + } iface.type = Iface.IFACE_TYPE_STA_FOR_CONNECTIVITY; iface.featureSet = getSupportedFeatureSetInternal(iface.name); saveCompleteFeatureSetInConfigStoreIfNecessary(iface.featureSet); diff --git a/service/tests/wifitests/src/com/android/server/wifi/WifiNativeInterfaceManagementTest.java b/service/tests/wifitests/src/com/android/server/wifi/WifiNativeInterfaceManagementTest.java index 32dd0c1eb0..97838f8000 100644 --- a/service/tests/wifitests/src/com/android/server/wifi/WifiNativeInterfaceManagementTest.java +++ b/service/tests/wifitests/src/com/android/server/wifi/WifiNativeInterfaceManagementTest.java @@ -76,6 +76,8 @@ import org.mockito.InOrder; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.mockito.MockitoSession; +import org.mockito.invocation.InvocationOnMock; +import org.mockito.stubbing.Answer; import java.util.ArrayList; import java.util.BitSet; @@ -150,6 +152,8 @@ public class WifiNativeInterfaceManagementTest extends WifiBaseTest { ArgumentCaptor.forClass(WifiNative.VendorHalRadioModeChangeEventHandler.class); private ArgumentCaptor<SupplicantDeathEventHandler> mSupplicantDeathHandlerCaptor = ArgumentCaptor.forClass(SupplicantDeathEventHandler.class); + private ArgumentCaptor<SupplicantDeathEventHandler> mMainlineSupplicantDeathHandlerCaptor = + ArgumentCaptor.forClass(SupplicantDeathEventHandler.class); private ArgumentCaptor<WifiNative.HostapdDeathEventHandler> mHostapdDeathHandlerCaptor = ArgumentCaptor.forClass(WifiNative.HostapdDeathEventHandler.class); private ArgumentCaptor<NetdEventObserver> mNetworkObserverCaptor0 = @@ -228,9 +232,32 @@ public class WifiNativeInterfaceManagementTest extends WifiBaseTest { when(mHostapdHal.removeAccessPoint(any())).thenReturn(true); when(mHostapdHal.registerApCallback(any(), any())).thenReturn(true); + when(mMainlineSupplicant.addStaInterface(anyString())).thenReturn(true); when(mMainlineSupplicant.isAvailable()).thenReturn(true); + when(mMainlineSupplicant.removeStaInterface(anyString())).thenReturn(true); when(mMainlineSupplicant.startService()).thenReturn(true); + /** + * Ensure that {@link MainlineSupplicant#isActive()} only returns true if the service has + * been started. Otherwise, if the service has been stopped or was never started, + * the service is not considered active. + */ + when(mMainlineSupplicant.isActive()).thenReturn(false); + doAnswer(new Answer<Boolean>() { + @Override + public Boolean answer(InvocationOnMock invocation) { + when(mMainlineSupplicant.isActive()).thenReturn(true); + return true; + } + }).when(mMainlineSupplicant).startService(); + doAnswer(new Answer<Void>() { + @Override + public Void answer(InvocationOnMock invocation) { + when(mMainlineSupplicant.isActive()).thenReturn(false); + return null; // void method returns null + } + }).when(mMainlineSupplicant).stopService(); + when(mWifiGlobals.isWifiInterfaceAddedSelfRecoveryEnabled()).thenReturn(false); when(mWifiInjector.makeNetdWrapper()).thenReturn(mNetdWrapper); @@ -263,7 +290,7 @@ public class WifiNativeInterfaceManagementTest extends WifiBaseTest { mInOrder = inOrder(mWifiVendorHal, mWificondControl, mSupplicantStaIfaceHal, mHostapdHal, mWifiMonitor, mNetdWrapper, mIfaceCallback0, mIfaceCallback1, mIfaceEventCallback0, - mWifiMetrics, mWifiP2pNative); + mWifiMetrics, mWifiP2pNative, mMainlineSupplicant); mWifiNative = new WifiNative( mWifiVendorHal, mSupplicantStaIfaceHal, mHostapdHal, mWificondControl, @@ -289,7 +316,7 @@ public class WifiNativeInterfaceManagementTest extends WifiBaseTest { } verifyNoMoreInteractions(mWifiVendorHal, mWificondControl, mSupplicantStaIfaceHal, mHostapdHal, mWifiMonitor, mNetdWrapper, mIfaceCallback0, mIfaceCallback1, - mIfaceEventCallback0, mWifiMetrics); + mIfaceEventCallback0, mWifiMetrics, mMainlineSupplicant); } private MockResources getMockResources() { @@ -542,6 +569,10 @@ public class WifiNativeInterfaceManagementTest extends WifiBaseTest { verify(mSupplicantStaIfaceHal, atLeastOnce()).isInitializationStarted(); verify(mSupplicantStaIfaceHal).deregisterDeathHandler(); verify(mSupplicantStaIfaceHal).terminate(); + verify(mMainlineSupplicant, atLeastOnce()).isActive(); + verify(mMainlineSupplicant).removeStaInterface(IFACE_NAME_1); + verify(mMainlineSupplicant).unregisterFrameworkDeathHandler(); + verify(mMainlineSupplicant).stopService(); verify(mIfaceCallback1).onDestroyed(IFACE_NAME_1); // Verify AP removal @@ -604,10 +635,15 @@ public class WifiNativeInterfaceManagementTest extends WifiBaseTest { mInOrder.verify(mWifiVendorHal).isVendorHalSupported(); mInOrder.verify(mWifiVendorHal).replaceStaIfaceRequestorWs(ifaceName, workSource); mInOrder.verify(mSupplicantStaIfaceHal).teardownIface(ifaceName); + mInOrder.verify(mMainlineSupplicant).isActive(); + mInOrder.verify(mMainlineSupplicant).removeStaInterface(ifaceName); mInOrder.verify(mSupplicantStaIfaceHal).isInitializationStarted(); mInOrder.verify(mSupplicantStaIfaceHal).deregisterDeathHandler(); mInOrder.verify(mSupplicantStaIfaceHal).isInitializationStarted(); mInOrder.verify(mSupplicantStaIfaceHal).terminate(); + mInOrder.verify(mMainlineSupplicant).isActive(); + mInOrder.verify(mMainlineSupplicant).unregisterFrameworkDeathHandler(); + mInOrder.verify(mMainlineSupplicant).stopService(); mInOrder.verify(mSupplicantStaIfaceHal).getAdvancedCapabilities(ifaceName); mInOrder.verify(mSupplicantStaIfaceHal).getWpaDriverFeatureSet(ifaceName); mInOrder.verify(mWifiVendorHal).getSupportedFeatureSet(ifaceName); @@ -988,6 +1024,24 @@ public class WifiNativeInterfaceManagementTest extends WifiBaseTest { } /** + * Verifies the setup of a client interface and mainline supplicant death handling. + */ + @Test + public void testSetupClientInterfaceAndMainlineSupplicantDied() throws Exception { + executeAndValidateSetupClientInterface( + false, false, IFACE_NAME_0, mIfaceCallback0, mIfaceDestroyedListenerCaptor0, + mNetworkObserverCaptor0); + verify(mMainlineSupplicant, times(1)) + .registerFrameworkDeathHandler(mMainlineSupplicantDeathHandlerCaptor.capture()); + + // Trigger mainline supplicant death + mMainlineSupplicantDeathHandlerCaptor.getValue().onDeath(); + mLooper.dispatchAll(); + verify(mStatusListener).onStatusChanged(false); + verify(mStatusListener).onStatusChanged(true); + } + + /** * Verifies the setup of a soft ap interface and hostapd death handling. */ @Test @@ -1406,20 +1460,26 @@ public class WifiNativeInterfaceManagementTest extends WifiBaseTest { mInOrder.verify(mSupplicantStaIfaceHal).isInitializationComplete(); mInOrder.verify(mSupplicantStaIfaceHal).registerDeathHandler(any()); when(mSupplicantStaIfaceHal.isInitializationStarted()).thenReturn(true); + + mInOrder.verify(mMainlineSupplicant).isAvailable(); + mInOrder.verify(mMainlineSupplicant).startService(); + mInOrder.verify(mMainlineSupplicant).registerFrameworkDeathHandler(any()); } mInOrder.verify(mSupplicantStaIfaceHal).setupIface(ifaceName); if (failureCode == STA_FAILURE_CODE_SETUP_INTERFACE) { mInOrder.verify(mWifiVendorHal).isVendorHalSupported(); mInOrder.verify(mWifiVendorHal).removeStaIface(ifaceName); mInOrder.verify(mWifiMetrics).incrementNumSetupClientInterfaceFailureDueToSupplicant(); - } else { - mInOrder.verify(mSupplicantStaIfaceHal).getAdvancedCapabilities(ifaceName); - mInOrder.verify(mSupplicantStaIfaceHal).getWpaDriverFeatureSet(ifaceName); - mInOrder.verify(mWifiVendorHal).getSupportedFeatureSet(ifaceName); - mInOrder.verify(mWifiVendorHal).getTwtCapabilities(ifaceName); - mInOrder.verify(mSupplicantStaIfaceHal).getUsdCapabilities(ifaceName); - mInOrder.verify(mWifiVendorHal).getUsableChannels(anyInt(), anyInt(), anyInt()); + return; } + mInOrder.verify(mMainlineSupplicant).isActive(); + mInOrder.verify(mMainlineSupplicant).addStaInterface(ifaceName); + mInOrder.verify(mSupplicantStaIfaceHal).getAdvancedCapabilities(ifaceName); + mInOrder.verify(mSupplicantStaIfaceHal).getWpaDriverFeatureSet(ifaceName); + mInOrder.verify(mWifiVendorHal).getSupportedFeatureSet(ifaceName); + mInOrder.verify(mWifiVendorHal).getTwtCapabilities(ifaceName); + mInOrder.verify(mSupplicantStaIfaceHal).getUsdCapabilities(ifaceName); + mInOrder.verify(mWifiVendorHal).getUsableChannels(anyInt(), anyInt(), anyInt()); } /** @@ -1509,6 +1569,7 @@ public class WifiNativeInterfaceManagementTest extends WifiBaseTest { false, false, true, IFACE_NAME_0, mIfaceDestroyedListenerCaptor0, mNetworkObserverCaptor0, true, 0); verify(mSupplicantStaIfaceHal, atLeastOnce()).isInitializationStarted(); + verify(mMainlineSupplicant, atLeastOnce()).isActive(); verify(mWifiVendorHal, never()).stopVendorHal(); verify(mWifiP2pNative).stopP2pSupplicantIfNecessary(); } @@ -1743,6 +1804,8 @@ public class WifiNativeInterfaceManagementTest extends WifiBaseTest { mInOrder.verify(mNetdWrapper).unregisterObserver(networkObserver); } mInOrder.verify(mSupplicantStaIfaceHal).teardownIface(ifaceName); + mInOrder.verify(mMainlineSupplicant).isActive(); + mInOrder.verify(mMainlineSupplicant).removeStaInterface(anyString()); mInOrder.verify(mWificondControl).tearDownClientInterface(ifaceName); if (!anyOtherStaIface) { @@ -1753,6 +1816,9 @@ public class WifiNativeInterfaceManagementTest extends WifiBaseTest { mInOrder.verify(mSupplicantStaIfaceHal).terminate(); } when(mSupplicantStaIfaceHal.isInitializationStarted()).thenReturn(false); + mInOrder.verify(mMainlineSupplicant).isActive(); + mInOrder.verify(mMainlineSupplicant).unregisterFrameworkDeathHandler(); + mInOrder.verify(mMainlineSupplicant).stopService(); } if (!anyOtherStaIface && !anyOtherApIface && !anyOtherP2pIface && !anyOtherNanIface) { mInOrder.verify(mWificondControl).tearDownInterfaces(); @@ -2077,6 +2143,8 @@ public class WifiNativeInterfaceManagementTest extends WifiBaseTest { mNetworkObserverCaptor0.getValue()); if (mWifiNative.hasAnyStaIfaceForConnectivity()) { mInOrder.verify(mSupplicantStaIfaceHal).teardownIface(ifaceName); + mInOrder.verify(mMainlineSupplicant).isActive(); + mInOrder.verify(mMainlineSupplicant).removeStaInterface(ifaceName); } mInOrder.verify(mWificondControl).tearDownClientInterface(ifaceName); if (mWifiNative.hasAnyStaIfaceForConnectivity()) { @@ -2084,6 +2152,8 @@ public class WifiNativeInterfaceManagementTest extends WifiBaseTest { mInOrder.verify(mSupplicantStaIfaceHal).deregisterDeathHandler(); mInOrder.verify(mSupplicantStaIfaceHal).isInitializationStarted(); mInOrder.verify(mSupplicantStaIfaceHal).terminate(); + mInOrder.verify(mMainlineSupplicant).isActive(); + mInOrder.verify(mMainlineSupplicant).stopService(); when(mSupplicantStaIfaceHal.isInitializationStarted()).thenReturn(false); } mInOrder.verify(mWifiVendorHal).isVendorHalReady(); @@ -2287,6 +2357,11 @@ public class WifiNativeInterfaceManagementTest extends WifiBaseTest { mInOrder.verify(mWifiP2pNative).stopP2pSupplicantIfNecessary(); } } + mInOrder.verify(mMainlineSupplicant, atLeastOnce()).isActive(); + if (isSupplicantStartedBefore) { + mInOrder.verify(mMainlineSupplicant).unregisterFrameworkDeathHandler(); + mInOrder.verify(mMainlineSupplicant).stopService(); + } } } |