Merge "WifiConfigManager: Prevent store writes before a read is triggered"
diff --git a/service/java/com/android/server/wifi/WifiConfigurationUtil.java b/service/java/com/android/server/wifi/WifiConfigurationUtil.java
index ea58549..fc298e7 100644
--- a/service/java/com/android/server/wifi/WifiConfigurationUtil.java
+++ b/service/java/com/android/server/wifi/WifiConfigurationUtil.java
@@ -199,6 +199,10 @@
newEnterpriseConfig.getAnonymousIdentity())) {
return true;
}
+ if (!TextUtils.equals(existingEnterpriseConfig.getPassword(),
+ newEnterpriseConfig.getPassword())) {
+ return true;
+ }
X509Certificate[] existingCaCerts = existingEnterpriseConfig.getCaCertificates();
X509Certificate[] newCaCerts = newEnterpriseConfig.getCaCertificates();
if (!Arrays.equals(existingCaCerts, newCaCerts)) {
diff --git a/service/java/com/android/server/wifi/WifiNative.java b/service/java/com/android/server/wifi/WifiNative.java
index c22b0a5..666f2b5 100644
--- a/service/java/com/android/server/wifi/WifiNative.java
+++ b/service/java/com/android/server/wifi/WifiNative.java
@@ -580,6 +580,29 @@
void onDown(String ifaceName);
}
+ private void initializeNwParamsForClientInterface(@NonNull String ifaceName) {
+ try {
+ // A runtime crash or shutting down AP mode can leave
+ // IP addresses configured, and this affects
+ // connectivity when supplicant starts up.
+ // Ensure we have no IP addresses before a supplicant start.
+ mNwManagementService.clearInterfaceAddresses(ifaceName);
+
+ // Set privacy extensions
+ mNwManagementService.setInterfaceIpv6PrivacyExtensions(ifaceName, true);
+
+ // IPv6 is enabled only as long as access point is connected since:
+ // - IPv6 addresses and routes stick around after disconnection
+ // - kernel is unaware when connected and fails to start IPv6 negotiation
+ // - kernel can start autoconfiguration when 802.1x is not complete
+ mNwManagementService.disableIpv6(ifaceName);
+ } catch (RemoteException re) {
+ Log.e(mTAG, "Unable to change interface settings: " + re);
+ } catch (IllegalStateException ie) {
+ Log.e(mTAG, "Unable to change interface settings: " + ie);
+ }
+ }
+
/**
* Setup an interface for Client mode operations.
*
@@ -628,6 +651,7 @@
teardownInterface(iface.name);
return null;
}
+ initializeNwParamsForClientInterface(iface.name);
Log.i(mTAG, "Successfully setup iface=" + iface.name);
return iface.name;
}
diff --git a/service/java/com/android/server/wifi/rtt/RttServiceImpl.java b/service/java/com/android/server/wifi/rtt/RttServiceImpl.java
index 6f025c3..16275c1 100644
--- a/service/java/com/android/server/wifi/rtt/RttServiceImpl.java
+++ b/service/java/com/android/server/wifi/rtt/RttServiceImpl.java
@@ -305,9 +305,9 @@
binder.linkToDeath(dr, 0);
} catch (RemoteException e) {
Log.e(TAG, "Error on linkToDeath - " + e);
+ return;
}
-
mRttServiceSynchronized.mHandler.post(() -> {
WorkSource sourceToUse = workSource;
if (workSource == null || workSource.size() == 0 || workSource.get(0) == 0) {
diff --git a/tests/wifitests/src/com/android/server/wifi/WifiNativeInterfaceManagementTest.java b/tests/wifitests/src/com/android/server/wifi/WifiNativeInterfaceManagementTest.java
index fe08fe6..39ac0fe 100644
--- a/tests/wifitests/src/com/android/server/wifi/WifiNativeInterfaceManagementTest.java
+++ b/tests/wifitests/src/com/android/server/wifi/WifiNativeInterfaceManagementTest.java
@@ -652,6 +652,9 @@
inOrder.verify(mWificondControl).setupInterfaceForClientMode(ifaceName);
inOrder.verify(mSupplicantStaIfaceHal).setupIface(ifaceName);
inOrder.verify(mNwManagementService).registerObserver(networkObserverCaptor.capture());
+ inOrder.verify(mNwManagementService).clearInterfaceAddresses(ifaceName);
+ inOrder.verify(mNwManagementService).setInterfaceIpv6PrivacyExtensions(ifaceName, true);
+ inOrder.verify(mNwManagementService).disableIpv6(ifaceName);
}
private void executeAndValidateTeardownClientInterface(