summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--service/java/com/android/server/wifi/WifiNative.java14
-rw-r--r--service/tests/wifitests/src/com/android/server/wifi/WifiNativeInterfaceManagementTest.java93
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();
+ }
}
}