Snap for 8618890 from 23ff4d4549779628a4c1eb8a7f5002a18cadde8d to mainline-wifi-release

Change-Id: Ie15c01a2dbaa9e1253d3943ebbd1ef5d0bc035b9
diff --git a/assets/defaultiwlanerrorconfig.json b/assets/defaultiwlanerrorconfig.json
index 07b980d..eae1ae2 100644
--- a/assets/defaultiwlanerrorconfig.json
+++ b/assets/defaultiwlanerrorconfig.json
@@ -72,6 +72,12 @@
         "ErrorDetails": ["IO_EXCEPTION"],
         "RetryArray": ["0", "0", "0", "60+r15", "120", "-1"],
         "UnthrottlingEvents": ["APM_ENABLE_EVENT", "APM_DISABLE_EVENT", "WIFI_DISABLE_EVENT", "WIFI_AP_CHANGED_EVENT"]
+      },
+      {
+        "ErrorType": "IKE_PROTOCOL_ERROR_TYPE",
+        "ErrorDetails": ["24"],
+        "RetryArray": ["10", "20", "40", "80", "160"],
+        "UnthrottlingEvents": ["APM_ENABLE_EVENT", "WIFI_DISABLE_EVENT", "WIFI_CALLING_DISABLE_EVENT"]
       }
     ]
   }
diff --git a/src/com/google/android/iwlan/ErrorPolicyManager.java b/src/com/google/android/iwlan/ErrorPolicyManager.java
index 76083fb..59fad64 100644
--- a/src/com/google/android/iwlan/ErrorPolicyManager.java
+++ b/src/com/google/android/iwlan/ErrorPolicyManager.java
@@ -304,6 +304,8 @@
             ret = DataFailCause.IWLAN_IKEV2_MSG_TIMEOUT;
         } else if (error.getErrorType() == IwlanError.SIM_NOT_READY_EXCEPTION) {
             ret = DataFailCause.IWLAN_PDN_CONNECTION_REJECTION;
+        } else if (error.getErrorType() == IwlanError.NETWORK_FAILURE) {
+            ret = DataFailCause.NETWORK_FAILURE;
         } else if (error.getErrorType() == IwlanError.IKE_PROTOCOL_EXCEPTION) {
             Exception exception = error.getException();
             if (exception != null && exception instanceof IkeProtocolException) {
diff --git a/src/com/google/android/iwlan/IwlanError.java b/src/com/google/android/iwlan/IwlanError.java
index 4580750..f621a7a 100644
--- a/src/com/google/android/iwlan/IwlanError.java
+++ b/src/com/google/android/iwlan/IwlanError.java
@@ -41,9 +41,10 @@
     public static final int EPDG_SELECTOR_SERVER_SELECTION_FAILED = 4;
     public static final int TUNNEL_TRANSFORM_FAILED = 5;
     public static final int SIM_NOT_READY_EXCEPTION = 6;
+    public static final int NETWORK_FAILURE = 7;
 
     // Catch all exception
-    public static final int UNKNOWN_EXCEPTION = 7; // catch all
+    public static final int UNKNOWN_EXCEPTION = 8; // catch all
 
     @IntDef({
         NO_ERROR,
@@ -53,6 +54,7 @@
         EPDG_SELECTOR_SERVER_SELECTION_FAILED,
         TUNNEL_TRANSFORM_FAILED,
         SIM_NOT_READY_EXCEPTION,
+        NETWORK_FAILURE,
         UNKNOWN_EXCEPTION
     })
     @interface IwlanErrorType {};
@@ -69,6 +71,7 @@
                             "IWLAN_EPDG_SELECTOR_SERVER_SELECTION_FAILED");
                     put(TUNNEL_TRANSFORM_FAILED, "IWLAN_TUNNEL_TRANSFORM_FAILED");
                     put(SIM_NOT_READY_EXCEPTION, "IWLAN_SIM_NOT_READY_EXCEPTION");
+                    put(NETWORK_FAILURE, "IWLAN_NETWORK_FAILURE");
                     put(UNKNOWN_EXCEPTION, "IWLAN_UNKNOWN_EXCEPTION");
                 }
             };
@@ -198,6 +201,9 @@
             case "SIM_NOT_READY_EXCEPTION":
                 ret = IwlanError.SIM_NOT_READY_EXCEPTION;
                 break;
+            case "NETWORK_FAILURE":
+                ret = IwlanError.NETWORK_FAILURE;
+                break;
         }
         return ret;
     }
diff --git a/src/com/google/android/iwlan/epdg/EpdgTunnelManager.java b/src/com/google/android/iwlan/epdg/EpdgTunnelManager.java
index 19b4ce7..1c824b7 100644
--- a/src/com/google/android/iwlan/epdg/EpdgTunnelManager.java
+++ b/src/com/google/android/iwlan/epdg/EpdgTunnelManager.java
@@ -387,6 +387,12 @@
             return sb.toString();
         }
 
+        public boolean hasTunnelOpened() {
+            return mInternalAddrList != null
+                    && !mInternalAddrList.isEmpty() /* The child session is opened */
+                    && mIface != null; /* The tunnel interface is bring up */
+        }
+
         @Override
         public String toString() {
             StringBuilder sb = new StringBuilder();
@@ -1387,7 +1393,13 @@
                     if (sessionClosedData.mIwlanError.getErrorType() != IwlanError.NO_ERROR) {
                         iwlanError = sessionClosedData.mIwlanError;
                     } else {
-                        iwlanError = tunnelConfig.getError();
+                        // If IKE session setup failed without error cause, Iwlan reports
+                        // NETWORK_FAILURE instead of NO_ERROR
+                        if (!tunnelConfig.hasTunnelOpened()) {
+                            iwlanError = new IwlanError(IwlanError.NETWORK_FAILURE);
+                        } else {
+                            iwlanError = tunnelConfig.getError();
+                        }
                     }
 
                     IpSecManager.IpSecTunnelInterface iface = tunnelConfig.getIface();
diff --git a/test/com/google/android/iwlan/ErrorPolicyManagerTest.java b/test/com/google/android/iwlan/ErrorPolicyManagerTest.java
index 718a875..3bc624b 100644
--- a/test/com/google/android/iwlan/ErrorPolicyManagerTest.java
+++ b/test/com/google/android/iwlan/ErrorPolicyManagerTest.java
@@ -191,7 +191,7 @@
     }
 
     @Test
-    public void testInvalidCarrierConfig() throws Exception {
+    public void testDefaultPolicyFallback() throws Exception {
         String apn = "ims";
         String config =
                 "[{"
@@ -217,17 +217,21 @@
 
         sleep(1000);
 
-        // IKE_PROTOCOL_ERROR_TYPE(24) and retryArray = 5, 10, 15 as it will fallback due to failed
-        // parsing
+        // Fallback to default Iwlan error policy for IKE_PROTOCOL_ERROR_TYPE(24) because of failed
+        // parsing (or lack of explicit carrier-defined policy).
         IwlanError iwlanError = buildIwlanIkeAuthFailedError();
         long time = mErrorPolicyManager.reportIwlanError(apn, iwlanError);
-        assertEquals(5, time);
-        time = mErrorPolicyManager.reportIwlanError(apn, iwlanError);
         assertEquals(10, time);
         time = mErrorPolicyManager.reportIwlanError(apn, iwlanError);
-        assertEquals(10, time);
+        assertEquals(20, time);
         time = mErrorPolicyManager.reportIwlanError(apn, iwlanError);
-        assertEquals(10, time);
+        assertEquals(40, time);
+        time = mErrorPolicyManager.reportIwlanError(apn, iwlanError);
+        assertEquals(80, time);
+        time = mErrorPolicyManager.reportIwlanError(apn, iwlanError);
+        assertEquals(160, time);
+        time = mErrorPolicyManager.reportIwlanError(apn, iwlanError);
+        assertEquals(86400, time);
     }
 
     @Test
diff --git a/test/com/google/android/iwlan/epdg/EpdgTunnelManagerTest.java b/test/com/google/android/iwlan/epdg/EpdgTunnelManagerTest.java
index 3a045b1..5960e00 100644
--- a/test/com/google/android/iwlan/epdg/EpdgTunnelManagerTest.java
+++ b/test/com/google/android/iwlan/epdg/EpdgTunnelManagerTest.java
@@ -991,7 +991,7 @@
     @Test
     public void testHandleOnClosedWithEpdgAddressSelected_True() throws Exception {
         String testApnName = "www.xyz.com";
-        IwlanError error = new IwlanError(IwlanError.NO_ERROR);
+        IwlanError error = new IwlanError(IwlanError.NETWORK_FAILURE);
 
         doReturn(0L).when(mEpdgTunnelManager).reportIwlanError(eq(testApnName), eq(error));
         mEpdgTunnelManager.putApnNameToTunnelConfig(
@@ -1010,7 +1010,7 @@
     @Test
     public void testHandleOnClosedWithEpdgAddressSelected_False() throws Exception {
         String testApnName = "www.xyz.com";
-        IwlanError error = new IwlanError(IwlanError.NO_ERROR);
+        IwlanError error = new IwlanError(IwlanError.NETWORK_FAILURE);
 
         doReturn(0L).when(mEpdgTunnelManager).reportIwlanError(eq(testApnName), eq(error));