summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAswin Sankar <apsankar@google.com>2023-04-04 04:11:50 +0000
committerAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>2023-04-04 04:11:50 +0000
commit758618980849b137fdcb1492970c72a9176ada67 (patch)
tree491d988717650a27bb3f3cff0656be65b06429a8
parent1aea68bba18d08b92f2632c175129e141a9cfe6d (diff)
parent8eb994345454d4a5cc479c9ab9b2539bf9f2cee9 (diff)
downloadIwlan-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.java117
-rw-r--r--test/com/google/android/iwlan/epdg/EpdgTunnelManagerTest.java20
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);