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(