diff options
author | Aswin Sankar <apsankar@google.com> | 2023-04-04 04:11:50 +0000 |
---|---|---|
committer | Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com> | 2023-04-04 04:11:50 +0000 |
commit | 758618980849b137fdcb1492970c72a9176ada67 (patch) | |
tree | 491d988717650a27bb3f3cff0656be65b06429a8 | |
parent | 1aea68bba18d08b92f2632c175129e141a9cfe6d (diff) | |
parent | 8eb994345454d4a5cc479c9ab9b2539bf9f2cee9 (diff) | |
download | Iwlan-758618980849b137fdcb1492970c72a9176ada67.tar.gz |
Separate system default network from Ike Session network am: 8f79c2777d am: 13cf2e6882 am: 8eb9943454
Original change: https://android-review.googlesource.com/c/platform/packages/services/Iwlan/+/2518218
Change-Id: I0e32284f641224e22cac1b04429e0d1ba1e2e33b
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
-rw-r--r-- | src/com/google/android/iwlan/epdg/EpdgTunnelManager.java | 117 | ||||
-rw-r--r-- | test/com/google/android/iwlan/epdg/EpdgTunnelManagerTest.java | 20 |
2 files changed, 79 insertions, 58 deletions
diff --git a/src/com/google/android/iwlan/epdg/EpdgTunnelManager.java b/src/com/google/android/iwlan/epdg/EpdgTunnelManager.java index 6577bdf..1656e34 100644 --- a/src/com/google/android/iwlan/epdg/EpdgTunnelManager.java +++ b/src/com/google/android/iwlan/epdg/EpdgTunnelManager.java @@ -156,8 +156,13 @@ public class EpdgTunnelManager { private Queue<TunnelRequestWrapper> mPendingBringUpRequests = new LinkedList<>(); private final EpdgInfo mValidEpdgInfo = new EpdgInfo(); - private InetAddress mEpdgAddress; - private Network mNetwork; + @Nullable private InetAddress mEpdgAddress; + + // The most recently updated system default network as seen by IwlanDataService. + @Nullable private Network mDefaultNetwork; + // The latest Network provided to the IKE session. Only for debugging purposes. + @Nullable private Network mIkeSessionNetwork; + private int mTransactionId = 0; private boolean mHasConnectedToEpdg; private final IkeSessionCreator mIkeSessionCreator; @@ -764,6 +769,7 @@ public class EpdgTunnelManager { Executors.newSingleThreadExecutor(), getTmIkeSessionCallback(apnName, token), new TmChildSessionCallback(apnName, token)); + boolean isSrcIpv6Present = setupRequest.srcIpv6Address().isPresent(); putApnNameToTunnelConfig( apnName, @@ -960,7 +966,7 @@ public class EpdgTunnelManager { .setRemoteIdentification(getId(setupRequest.apnName(), false)) .setAuthEap(null, getEapConfig()) .addIkeSaProposal(buildIkeSaProposal()) - .setNetwork(mNetwork) + .setNetwork(mDefaultNetwork) .addIkeOption(IkeSessionParams.IKE_OPTION_ACCEPT_ANY_REMOTE_ID) .addIkeOption(IkeSessionParams.IKE_OPTION_MOBIKE) .addIkeOption(IkeSessionParams.IKE_OPTION_REKEY_MOBILITY) @@ -1324,8 +1330,8 @@ public class EpdgTunnelManager { Log.e(TAG, "SIM isn't ready"); bringUpError = new IwlanError(IwlanError.SIM_NOT_READY_EXCEPTION); reportIwlanError(setupRequest.apnName(), bringUpError); - } else if (Objects.isNull(mNetwork)) { - Log.e(TAG, "The underlying network is not ready"); + } else if (Objects.isNull(mDefaultNetwork)) { + Log.e(TAG, "The default network is not ready"); bringUpError = new IwlanError(IwlanError.IKE_INTERNAL_IO_EXCEPTION); reportIwlanError(setupRequest.apnName(), bringUpError); } else if (!canBringUpTunnel(setupRequest.apnName())) { @@ -1440,7 +1446,7 @@ public class EpdgTunnelManager { (int) mIkeTunnelEstablishmentDuration) .build()); - setHasConnectedToEpdg(true); + onConnectedToEpdg(true); mValidEpdgInfo.resetIndex(); printRequestQueue("EVENT_CHILD_SESSION_OPENED"); serviceAllPendingRequests(); @@ -1521,50 +1527,55 @@ public class EpdgTunnelManager { mApnNameToTunnelConfig.remove(apnName); if (mApnNameToTunnelConfig.size() == 0 && mPendingBringUpRequests.isEmpty()) { - setHasConnectedToEpdg(false); + onConnectedToEpdg(false); } break; case EVENT_UPDATE_NETWORK: UpdateNetworkWrapper updatedNetwork = (UpdateNetworkWrapper) msg.obj; - Network network = updatedNetwork.getNetwork(); - LinkProperties link = updatedNetwork.getLinkProperties(); - String paraString = "Network: " + network; - - if (Objects.nonNull(network) && network.equals(mNetwork)) { - Log.w(TAG, "The Underlying Network has not changed. " + paraString); - break; - } - - if (Objects.isNull(network)) { - Log.w(TAG, "The Underlying Network has been removed."); - mNetwork = null; - break; - } + mDefaultNetwork = updatedNetwork.getNetwork(); + LinkProperties defaultLinkProperties = updatedNetwork.getLinkProperties(); + String paraString = "Network: " + mDefaultNetwork; - if (Objects.isNull(link)) { - Log.w(TAG, "The Underlying Network's linkProperties is not ready"); - break; - } - if (Objects.nonNull(mEpdgAddress) && !link.isReachable(mEpdgAddress)) { - Log.w(TAG, "The Underlying Network doesn't have a route to the ePDG"); - break; + if (mHasConnectedToEpdg) { + if (Objects.isNull(mDefaultNetwork)) { + Log.w(TAG, "The default network has been removed."); + } else if (Objects.isNull(defaultLinkProperties)) { + Log.w( + TAG, + "The default network's LinkProperties is not ready ." + + paraString); + } else if (!defaultLinkProperties.isReachable(mEpdgAddress)) { + Log.w( + TAG, + "The default network link " + + defaultLinkProperties + + " doesn't have a route to the ePDG " + + mEpdgAddress + + paraString); + } else if (Objects.equals(mDefaultNetwork, mIkeSessionNetwork)) { + Log.w( + TAG, + "The default network has not changed from the IKE session" + + " network. " + + paraString); + } else { + mApnNameToTunnelConfig.forEach( + (apn, config) -> { + Log.d( + TAG, + "The Underlying Network is updating for APN (+" + + apn + + "). " + + paraString); + config.getIkeSession().setNetwork(mDefaultNetwork); + config.setIkeSessionState( + IkeSessionState.IKE_MOBILITY_IN_PROGRESS); + }); + mIkeSessionNetwork = mDefaultNetwork; + } } - - mNetwork = network; - - mApnNameToTunnelConfig.forEach( - (apn, config) -> { - Log.d( - TAG, - "The Underlying Network is updating for APN (+" - + apn - + "). " - + paraString); - config.getIkeSession().setNetwork(network); - config.setIkeSessionState(IkeSessionState.IKE_MOBILITY_IN_PROGRESS); - }); break; case EVENT_TUNNEL_BRINGDOWN_REQUEST: @@ -1613,7 +1624,7 @@ public class EpdgTunnelManager { ipSecManager.createIpSecTunnelInterface( DUMMY_ADDR /* unused */, DUMMY_ADDR /* unused */, - mNetwork)); + mDefaultNetwork)); } catch (IpSecManager.ResourceUnavailableException | IOException e) { Log.e(TAG, "Failed to create tunnel interface. " + e); closeIkeSession( @@ -1697,7 +1708,8 @@ public class EpdgTunnelManager { case EVENT_IKE_SESSION_CONNECTION_INFO_CHANGED: IkeSessionConnectionInfoData ikeSessionConnectionInfoData = (IkeSessionConnectionInfoData) msg.obj; - network = ikeSessionConnectionInfoData.mIkeSessionConnectionInfo.getNetwork(); + Network network = + ikeSessionConnectionInfoData.mIkeSessionConnectionInfo.getNetwork(); apnName = ikeSessionConnectionInfoData.mApnName; ConnectivityManager connectivityManager = @@ -1817,7 +1829,7 @@ public class EpdgTunnelManager { epdgAddressOrder, setupRequest.isRoaming(), setupRequest.isEmergency(), - mNetwork, + mDefaultNetwork, mSelectorCallback); if (epdgError.getErrorType() != IwlanError.NO_ERROR) { @@ -2336,8 +2348,14 @@ public class EpdgTunnelManager { } @VisibleForTesting - void setHasConnectedToEpdg(boolean value) { - mHasConnectedToEpdg = value; + void onConnectedToEpdg(boolean hasConnected) { + mHasConnectedToEpdg = hasConnected; + if (mHasConnectedToEpdg) { + mIkeSessionNetwork = mDefaultNetwork; + } else { + mIkeSessionNetwork = null; + mEpdgAddress = null; + } } @VisibleForTesting @@ -2382,9 +2400,9 @@ public class EpdgTunnelManager { @VisibleForTesting IpPreferenceConflict isIpPreferenceConflictsWithNetwork( @CarrierConfigManager.Iwlan.EpdgAddressIpPreference int ipPreference) { - List<InetAddress> localAddresses = getAddressForNetwork(mNetwork, mContext); + List<InetAddress> localAddresses = getAddressForNetwork(mDefaultNetwork, mContext); if (localAddresses == null || localAddresses.size() == 0) { - Log.e(TAG, "No local addresses available."); + Log.e(TAG, "No local addresses available for Network " + mDefaultNetwork); return new IpPreferenceConflict(true, IwlanError.EPDG_SELECTOR_SERVER_SELECTION_FAILED); } else if (!IwlanHelper.hasIpv6Address(localAddresses) && ipPreference == CarrierConfigManager.Iwlan.EPDG_ADDRESS_IPV6_ONLY) { @@ -2416,6 +2434,7 @@ public class EpdgTunnelManager { public void dump(PrintWriter pw) { pw.println("---- EpdgTunnelManager ----"); pw.println("mHasConnectedToEpdg: " + mHasConnectedToEpdg); + pw.println("mIkeSessionNetwork: " + mIkeSessionNetwork); if (mEpdgAddress != null) { pw.println("mEpdgAddress: " + mEpdgAddress); } diff --git a/test/com/google/android/iwlan/epdg/EpdgTunnelManagerTest.java b/test/com/google/android/iwlan/epdg/EpdgTunnelManagerTest.java index fa5bbaa..f42fcb0 100644 --- a/test/com/google/android/iwlan/epdg/EpdgTunnelManagerTest.java +++ b/test/com/google/android/iwlan/epdg/EpdgTunnelManagerTest.java @@ -1118,7 +1118,7 @@ public class EpdgTunnelManagerTest { 0); int token = mEpdgTunnelManager.incrementAndGetCurrentTokenForApn(testApnName); - mEpdgTunnelManager.setHasConnectedToEpdg(true); + mEpdgTunnelManager.onConnectedToEpdg(true); mEpdgTunnelManager.setEpdgAddress(InetAddresses.parseNumericAddress(EPDG_ADDRESS)); mEpdgTunnelManager.getTmIkeSessionCallback(testApnName, token).onClosed(); @@ -1152,7 +1152,7 @@ public class EpdgTunnelManagerTest { EXPECTED_EPDG_ADDRESSES, new IwlanError(IwlanError.NO_ERROR), 1); mTestLooper.dispatchAll(); - mEpdgTunnelManager.setHasConnectedToEpdg(false); + mEpdgTunnelManager.onConnectedToEpdg(false); mEpdgTunnelManager.getTmIkeSessionCallback(testApnName, DEFAULT_TOKEN).onClosed(); mTestLooper.dispatchAll(); @@ -1170,7 +1170,7 @@ public class EpdgTunnelManagerTest { null, 0); mEpdgTunnelManager.validateAndSetEpdgAddress(EXPECTED_EPDG_ADDRESSES); - mEpdgTunnelManager.setHasConnectedToEpdg(true); + mEpdgTunnelManager.onConnectedToEpdg(true); } private IkeSessionArgumentCaptors verifyBringUpTunnelWithDnsQuery(String apnName) { @@ -1330,7 +1330,7 @@ public class EpdgTunnelManagerTest { 0); int token = mEpdgTunnelManager.incrementAndGetCurrentTokenForApn(testApnName); - mEpdgTunnelManager.setHasConnectedToEpdg(true); + mEpdgTunnelManager.onConnectedToEpdg(true); mEpdgTunnelManager.setEpdgAddress(InetAddresses.parseNumericAddress(EPDG_ADDRESS)); mEpdgTunnelManager @@ -1365,7 +1365,7 @@ public class EpdgTunnelManagerTest { EXPECTED_EPDG_ADDRESSES, new IwlanError(IwlanError.NO_ERROR), 1); mTestLooper.dispatchAll(); - mEpdgTunnelManager.setHasConnectedToEpdg(false); + mEpdgTunnelManager.onConnectedToEpdg(false); mEpdgTunnelManager .getTmIkeSessionCallback(testApnName, DEFAULT_TOKEN) @@ -1630,7 +1630,7 @@ public class EpdgTunnelManagerTest { 0); int token = mEpdgTunnelManager.incrementAndGetCurrentTokenForApn(testApnName); - mEpdgTunnelManager.setHasConnectedToEpdg(true); + mEpdgTunnelManager.onConnectedToEpdg(true); mEpdgTunnelManager.setEpdgAddress(InetAddresses.parseNumericAddress(EPDG_ADDRESS)); mEpdgTunnelManager @@ -1664,7 +1664,7 @@ public class EpdgTunnelManagerTest { mEpdgTunnelManager.sendSelectionRequestComplete(null, error, 1); mTestLooper.dispatchAll(); - mEpdgTunnelManager.setHasConnectedToEpdg(false); + mEpdgTunnelManager.onConnectedToEpdg(false); verify(mEpdgTunnelManager, times(1)).reportIwlanError(eq(testApnName), eq(error)); } @@ -2046,7 +2046,7 @@ public class EpdgTunnelManagerTest { // testApnName with token 0 setupTunnelBringup(TEST_APN_NAME, ++transactionId); - mEpdgTunnelManager.setHasConnectedToEpdg(true); + mEpdgTunnelManager.onConnectedToEpdg(true); IwlanError error = new IwlanError(mMockIkeException); doReturn(0L).when(mEpdgTunnelManager).reportIwlanError(eq(TEST_APN_NAME), eq(error)); @@ -2060,7 +2060,7 @@ public class EpdgTunnelManagerTest { // testApnName1 with token 1 setupTunnelBringup(TEST_APN_NAME, ++transactionId); - mEpdgTunnelManager.setHasConnectedToEpdg(true); + mEpdgTunnelManager.onConnectedToEpdg(true); // signal from obsolete callback (token 0), ignore it reset(mMockIwlanTunnelCallback); @@ -2385,6 +2385,7 @@ public class EpdgTunnelManagerTest { mMockedIpSecTransformIn, IpSecManager.DIRECTION_IN); mTestLooper.dispatchAll(); + mEpdgTunnelManager.onConnectedToEpdg(true); Network newNetwork = mock(Network.class); mEpdgTunnelManager.updateNetwork(newNetwork, mMockLinkProperties); mTestLooper.dispatchAll(); @@ -2467,6 +2468,7 @@ public class EpdgTunnelManagerTest { mMockedIpSecTransformIn, IpSecManager.DIRECTION_IN); mTestLooper.dispatchAll(); + mEpdgTunnelManager.onConnectedToEpdg(true); Network newNetwork = mock(Network.class); LinkProperties mockUnreachableLinkProperties = mock(LinkProperties.class); when(mockUnreachableLinkProperties.isReachable(any())).thenReturn(false); |