summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAswin Sankar <apsankar@google.com>2023-03-31 20:53:25 +0000
committerAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>2023-03-31 20:53:25 +0000
commitb1ea5543f95f02bab198fc9c5915722cacda0b98 (patch)
tree18b1dc1cc8089e124f581b08cb04ad8aa888e6d8
parentb73388154a4a53d0a43d45fdf6be953bf7194b72 (diff)
parentc65a3aa678cd787e51a62407c8373e391c08bbc4 (diff)
downloadIwlan-b1ea5543f95f02bab198fc9c5915722cacda0b98.tar.gz
Separate IkeSessionState for each tunnel am: f9e81a60c7 am: c65a3aa678
Original change: https://android-review.googlesource.com/c/platform/packages/services/Iwlan/+/2515716 Change-Id: Icbd72b0528beb7b325eb1fda0c9f3b82da49c135 Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
-rw-r--r--src/com/google/android/iwlan/epdg/EpdgTunnelManager.java83
-rw-r--r--test/com/google/android/iwlan/epdg/EpdgTunnelManagerTest.java22
2 files changed, 55 insertions, 50 deletions
diff --git a/src/com/google/android/iwlan/epdg/EpdgTunnelManager.java b/src/com/google/android/iwlan/epdg/EpdgTunnelManager.java
index 345f446..6577bdf 100644
--- a/src/com/google/android/iwlan/epdg/EpdgTunnelManager.java
+++ b/src/com/google/android/iwlan/epdg/EpdgTunnelManager.java
@@ -218,8 +218,6 @@ public class EpdgTunnelManager {
SaProposal.PSEUDORANDOM_FUNCTION_SHA2_512);
}
- private IkeSessionState mIkeSessionState;
-
private final EpdgSelector.EpdgSelectorCallback mSelectorCallback =
new EpdgSelector.EpdgSelectorCallback() {
@Override
@@ -250,6 +248,16 @@ public class EpdgTunnelManager {
private boolean mIsBackoffTimeValid = false;
private long mBackoffTime;
+ private IkeSessionState mIkeSessionState;
+
+ public IkeSessionState getIkeSessionState() {
+ return mIkeSessionState;
+ }
+
+ public void setIkeSessionState(IkeSessionState ikeSessionState) {
+ mIkeSessionState = ikeSessionState;
+ }
+
public NetworkSliceInfo getSliceInfo() {
return mSliceInfo;
}
@@ -287,6 +295,8 @@ public class EpdgTunnelManager {
mError = new IwlanError(IwlanError.NO_ERROR);
mSrcIpv6Address = srcIpv6Addr;
mSrcIpv6AddressPrefixLen = srcIpv6PrefixLength;
+
+ setIkeSessionState(IkeSessionState.IKE_SESSION_INIT_IN_PROGRESS);
}
@NonNull
@@ -429,8 +439,7 @@ public class EpdgTunnelManager {
mHandler.sendMessage(
mHandler.obtainMessage(
EVENT_IKE_SESSION_CLOSED,
- new SessionClosedData(
- mApnName, mToken, new IwlanError(IwlanError.NO_ERROR))));
+ new SessionClosedData(mApnName, mToken, null /* ikeException */)));
}
@Override
@@ -522,8 +531,7 @@ public class EpdgTunnelManager {
mHandler.sendMessage(
mHandler.obtainMessage(
EVENT_CHILD_SESSION_CLOSED,
- new SessionClosedData(
- mApnName, mToken, new IwlanError(IwlanError.NO_ERROR))));
+ new SessionClosedData(mApnName, mToken, null /* ikeException */)));
}
@Override
@@ -714,8 +722,6 @@ public class EpdgTunnelManager {
TunnelRequestWrapper tunnelRequestWrapper =
new TunnelRequestWrapper(setupRequest, tunnelCallback, tunnelMetrics);
- mIkeSessionState = IkeSessionState.NO_IKE_SESSION;
-
mHandler.sendMessage(
mHandler.obtainMessage(EVENT_TUNNEL_BRINGUP_REQUEST, tunnelRequestWrapper));
@@ -758,7 +764,6 @@ public class EpdgTunnelManager {
Executors.newSingleThreadExecutor(),
getTmIkeSessionCallback(apnName, token),
new TmChildSessionCallback(apnName, token));
- mIkeSessionState = IkeSessionState.IKE_SESSION_INIT_IN_PROGRESS;
boolean isSrcIpv6Present = setupRequest.srcIpv6Address().isPresent();
putApnNameToTunnelConfig(
apnName,
@@ -1239,12 +1244,6 @@ public class EpdgTunnelManager {
private void onSessionClosedWithException(
IkeException exception, String apnName, int token, int sessionType) {
- IwlanError error;
- if (exception instanceof IkeIOException) {
- error = new IwlanError(mIkeSessionState.getErrorType(), exception);
- } else {
- error = new IwlanError(exception);
- }
Log.e(
TAG,
"Closing tunnel with exception for apn: "
@@ -1252,15 +1251,12 @@ public class EpdgTunnelManager {
+ " with token: "
+ token
+ " sessionType:"
- + sessionType
- + " error: "
- + error
- + " state: "
- + mIkeSessionState);
+ + sessionType);
exception.printStackTrace();
mHandler.sendMessage(
- mHandler.obtainMessage(sessionType, new SessionClosedData(apnName, token, error)));
+ mHandler.obtainMessage(
+ sessionType, new SessionClosedData(apnName, token, exception)));
}
private boolean isEpdgSelectionOrFirstTunnelBringUpInProgress() {
@@ -1272,6 +1268,18 @@ public class EpdgTunnelManager {
|| !mPendingBringUpRequests.isEmpty();
}
+ private IwlanError getErrorFromIkeException(
+ IkeException ikeException, IkeSessionState ikeSessionState) {
+ IwlanError error;
+ if (ikeException instanceof IkeIOException) {
+ error = new IwlanError(ikeSessionState.getErrorType(), ikeException);
+ } else {
+ error = new IwlanError(ikeException);
+ }
+ Log.e(TAG, "Closing tunnel: error: " + error + " state: " + ikeSessionState);
+ return error;
+ }
+
private final class TmHandler extends Handler {
@Override
@@ -1436,7 +1444,7 @@ public class EpdgTunnelManager {
mValidEpdgInfo.resetIndex();
printRequestQueue("EVENT_CHILD_SESSION_OPENED");
serviceAllPendingRequests();
- mIkeSessionState = IkeSessionState.CHILD_SESSION_OPENED;
+ tunnelConfig.setIkeSessionState(IkeSessionState.CHILD_SESSION_OPENED);
break;
case EVENT_IKE_SESSION_CLOSED:
@@ -1456,8 +1464,11 @@ public class EpdgTunnelManager {
// the Child session closed exceptionally; in which case, we attempt to retrieve
// the stored error (if any) from TunnelConfig.
IwlanError iwlanError;
- if (sessionClosedData.mIwlanError.getErrorType() != IwlanError.NO_ERROR) {
- iwlanError = sessionClosedData.mIwlanError;
+ if (sessionClosedData.mIkeException != null) {
+ iwlanError =
+ getErrorFromIkeException(
+ sessionClosedData.mIkeException,
+ tunnelConfig.getIkeSessionState());
} else {
// If IKE session opened, then closed before child session (and IWLAN
// tunnel) opened.
@@ -1485,6 +1496,7 @@ public class EpdgTunnelManager {
}
Log.d(TAG, "Tunnel Closed: " + iwlanError);
+ tunnelConfig.setIkeSessionState(IkeSessionState.NO_IKE_SESSION);
tunnelConfig.getTunnelCallback().onClosed(apnName, iwlanError);
onClosedMetricsBuilder = new OnClosedMetrics.Builder().setApnName(apnName);
@@ -1512,8 +1524,6 @@ public class EpdgTunnelManager {
setHasConnectedToEpdg(false);
}
- mIkeSessionState = IkeSessionState.NO_IKE_SESSION;
-
break;
case EVENT_UPDATE_NETWORK:
@@ -1544,8 +1554,6 @@ public class EpdgTunnelManager {
mNetwork = network;
- mIkeSessionState = IkeSessionState.IKE_MOBILITY_IN_PROGRESS;
-
mApnNameToTunnelConfig.forEach(
(apn, config) -> {
Log.d(
@@ -1555,6 +1563,7 @@ public class EpdgTunnelManager {
+ "). "
+ paraString);
config.getIkeSession().setNetwork(network);
+ config.setIkeSessionState(IkeSessionState.IKE_MOBILITY_IN_PROGRESS);
});
break;
@@ -1626,8 +1635,9 @@ public class EpdgTunnelManager {
closeIkeSession(
apnName, new IwlanError(IwlanError.TUNNEL_TRANSFORM_FAILED));
}
- if (mIkeSessionState == IkeSessionState.IKE_MOBILITY_IN_PROGRESS) {
- mIkeSessionState = IkeSessionState.CHILD_SESSION_OPENED;
+ if (tunnelConfig.getIkeSessionState()
+ == IkeSessionState.IKE_MOBILITY_IN_PROGRESS) {
+ tunnelConfig.setIkeSessionState(IkeSessionState.CHILD_SESSION_OPENED);
}
break;
@@ -1646,7 +1656,12 @@ public class EpdgTunnelManager {
Log.d(TAG, "No tunnel callback for apn: " + apnName);
return;
}
- tunnelConfig.setError(sessionClosedData.mIwlanError);
+ if (sessionClosedData.mIkeException != null) {
+ tunnelConfig.setError(
+ getErrorFromIkeException(
+ sessionClosedData.mIkeException,
+ tunnelConfig.getIkeSessionState()));
+ }
tunnelConfig.getIkeSession().close();
break;
@@ -2042,11 +2057,11 @@ public class EpdgTunnelManager {
// Data received from IkeSessionStateMachine if either IKE session or Child session have been
// closed, normally or exceptionally.
private static final class SessionClosedData extends IkeEventData {
- final IwlanError mIwlanError;
+ final IkeException mIkeException;
- private SessionClosedData(String apnName, int token, IwlanError iwlanError) {
+ private SessionClosedData(String apnName, int token, IkeException ikeException) {
super(apnName, token);
- mIwlanError = iwlanError;
+ mIkeException = ikeException;
}
}
diff --git a/test/com/google/android/iwlan/epdg/EpdgTunnelManagerTest.java b/test/com/google/android/iwlan/epdg/EpdgTunnelManagerTest.java
index 61134dc..fa5bbaa 100644
--- a/test/com/google/android/iwlan/epdg/EpdgTunnelManagerTest.java
+++ b/test/com/google/android/iwlan/epdg/EpdgTunnelManagerTest.java
@@ -2305,55 +2305,45 @@ public class EpdgTunnelManagerTest {
@Test
public void testCloseTunnelWithIkeDpdTimeout() throws Exception {
IwlanError error = new IwlanError(IwlanError.IKE_DPD_TIMEOUT, mMockIkeIoException);
- doReturn(0L).when(mEpdgTunnelManager).reportIwlanError(eq(TEST_APN_NAME), eq(error));
IkeSessionArgumentCaptors ikeSessionArgumentCaptors =
verifyBringUpTunnelWithDnsQuery(TEST_APN_NAME);
ChildSessionCallback childSessionCallback =
ikeSessionArgumentCaptors.mChildSessionCallbackCaptor.getValue();
verifyTunnelOnOpened(TEST_APN_NAME, childSessionCallback);
- setOneTunnelOpened(TEST_APN_NAME);
mEpdgTunnelManager
.getTmIkeSessionCallback(
TEST_APN_NAME, mEpdgTunnelManager.getCurrentTokenForApn(TEST_APN_NAME))
.onClosedWithException(mMockIkeIoException);
mTestLooper.dispatchAll();
- verify(mEpdgTunnelManager, times(1)).reportIwlanError(eq(TEST_APN_NAME), eq(error));
- verify(mMockIwlanTunnelCallback, atLeastOnce()).onClosed(eq(TEST_APN_NAME), eq(error));
+ verify(mEpdgTunnelManager, never()).reportIwlanError(eq(TEST_APN_NAME), eq(error));
+ verify(mMockIwlanTunnelCallback, times(1)).onClosed(eq(TEST_APN_NAME), eq(error));
}
@Test
public void testCloseTunnelWithIkeMobilityTimeout() throws Exception {
IwlanError error = new IwlanError(IwlanError.IKE_MOBILITY_TIMEOUT, mMockIkeIoException);
- doReturn(0L).when(mEpdgTunnelManager).reportIwlanError(eq(TEST_APN_NAME), eq(error));
IkeSessionArgumentCaptors ikeSessionArgumentCaptors =
- verifyBringUpTunnelWithDnsQuery(TEST_APN_NAME);
+ verifyBringUpTunnelWithDnsQuery(TEST_APN_NAME, mMockIkeSession);
ChildSessionCallback childSessionCallback =
ikeSessionArgumentCaptors.mChildSessionCallbackCaptor.getValue();
verifyTunnelOnOpened(TEST_APN_NAME, childSessionCallback);
- setOneTunnelOpened(TEST_APN_NAME);
Network newNetwork = mock(Network.class);
mEpdgTunnelManager.updateNetwork(newNetwork, mMockLinkProperties);
mTestLooper.dispatchAll();
- EpdgTunnelManager.TunnelConfig testApnTunnelConfig =
- mEpdgTunnelManager.getTunnelConfigForApn(TEST_APN_NAME);
-
- newNetwork = mock(Network.class);
- testApnTunnelConfig.getIkeSession().setNetwork(newNetwork);
- mTestLooper.dispatchAll();
-
mEpdgTunnelManager
.getTmIkeSessionCallback(
TEST_APN_NAME, mEpdgTunnelManager.getCurrentTokenForApn(TEST_APN_NAME))
.onClosedWithException(mMockIkeIoException);
mTestLooper.dispatchAll();
- verify(mEpdgTunnelManager, atLeastOnce()).reportIwlanError(eq(TEST_APN_NAME), eq(error));
- verify(mMockIwlanTunnelCallback, atLeastOnce()).onClosed(eq(TEST_APN_NAME), eq(error));
+ verify(mMockIkeSession, times(1)).setNetwork(eq(newNetwork));
+ verify(mEpdgTunnelManager, never()).reportIwlanError(eq(TEST_APN_NAME), eq(error));
+ verify(mMockIwlanTunnelCallback, times(1)).onClosed(eq(TEST_APN_NAME), eq(error));
}
private boolean testIsN1ModeSupported(int[] nrAvailability) {