From f8d29e401e2dddc955cff331d922d7a1edeb09da Mon Sep 17 00:00:00 2001 From: Motomu Utsumi Date: Mon, 15 May 2023 20:19:39 +0900 Subject: [PATCH 1/2] Check clatd does not stop when suspended network is disconnected Currently, clatd is not stopped when suspended network is disconnected and aosp/2583410 fixes this issue. This CL adds test for current behavior, aosp/2583410 can update testDisconnectSuspendedNetworkStopClatd to call verifyClatdStop instead of verifyNeverClatdStop Test: atest FrameworksNetTests Bug: 277682237 (cherry picked from https://android-review.googlesource.com/q/commit:4a5b06559fc276a06f53134694a0a6548b36b026) Merged-In: I345e097ce8e114800d77c5f44d38d7ae4938935c Change-Id: I345e097ce8e114800d77c5f44d38d7ae4938935c --- .../server/ConnectivityServiceTest.java | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/tests/unit/java/com/android/server/ConnectivityServiceTest.java b/tests/unit/java/com/android/server/ConnectivityServiceTest.java index 839625280a..0669d4f023 100755 --- a/tests/unit/java/com/android/server/ConnectivityServiceTest.java +++ b/tests/unit/java/com/android/server/ConnectivityServiceTest.java @@ -17922,4 +17922,34 @@ public class ConnectivityServiceTest { verify(mDeps).destroyLiveTcpSockets(eq(UidRange.toIntRanges(ranges)), eq(exemptUids)); } + + @Test + public void testDisconnectSuspendedNetworkStopClatd() throws Exception { + final TestNetworkCallback networkCallback = new TestNetworkCallback(); + final NetworkRequest networkRequest = new NetworkRequest.Builder() + .addCapability(NET_CAPABILITY_DUN) + .build(); + mCm.requestNetwork(networkRequest, networkCallback); + + final IpPrefix nat64Prefix = new IpPrefix(InetAddress.getByName("64:ff9b::"), 96); + NetworkCapabilities nc = new NetworkCapabilities().addCapability(NET_CAPABILITY_DUN); + final LinkProperties lp = new LinkProperties(); + lp.setInterfaceName(MOBILE_IFNAME); + lp.addLinkAddress(new LinkAddress("2001:db8:1::1/64")); + lp.setNat64Prefix(nat64Prefix); + mCellAgent = new TestNetworkAgentWrapper(TRANSPORT_CELLULAR, lp, nc); + mCellAgent.connect(true /* validated */, false /* hasInternet */, + false /* privateDnsProbeSent */); + + verifyClatdStart(null /* inOrder */, MOBILE_IFNAME, mCellAgent.getNetwork().netId, + nat64Prefix.toString()); + + mCellAgent.suspend(); + mCm.unregisterNetworkCallback(networkCallback); + mCellAgent.expectDisconnected(); + waitForIdle(); + + // TODO (aosp/2583410): update following check to verifyClatdStop + verifyNeverClatdStop(null /* inOrder */, MOBILE_IFNAME); + } } From 9b5334dbad64d7e1278e10a7232c6fa11ec8629e Mon Sep 17 00:00:00 2001 From: wangshengrjxtjcb Date: Tue, 9 May 2023 09:51:06 +0800 Subject: [PATCH 2/2] Fix agents disconnecting in SUSPENDED state. Network state is not changed to disconnected when a networkagent is disconnected and network state is SUSPENDED. So the function requiresClat return true. Clat is not stoped. Bug: 277682237 Test: atest FrameworksNetTests (cherry picked from https://android-review.googlesource.com/q/commit:fd5d3d90e1da7411104902ddfe859ebd0e4a02fb) Merged-In: I5edfcf64aca5d2d34325d722dd29fab41bcf2600 Change-Id: I5edfcf64aca5d2d34325d722dd29fab41bcf2600 --- framework/src/android/net/NetworkInfo.java | 18 ++++++++++++++++++ .../android/server/ConnectivityService.java | 2 +- .../server/ConnectivityServiceTest.java | 3 +-- 3 files changed, 20 insertions(+), 3 deletions(-) diff --git a/framework/src/android/net/NetworkInfo.java b/framework/src/android/net/NetworkInfo.java index b7ec519d2c..7aa984709b 100644 --- a/framework/src/android/net/NetworkInfo.java +++ b/framework/src/android/net/NetworkInfo.java @@ -333,6 +333,24 @@ public class NetworkInfo implements Parcelable { } } + /** + * Indicates whether this network is suspended. + * @deprecated Apps should instead use the + * {@link android.net.ConnectivityManager.NetworkCallback} API to + * learn about connectivity changes. See + * {@link ConnectivityManager#registerDefaultNetworkCallback} and + * {@link ConnectivityManager#registerNetworkCallback}. These will + * give a more accurate picture of the connectivity state of + * the device and let apps react more easily and quickly to changes. + * @hide + */ + @Deprecated + public boolean isSuspended() { + synchronized (this) { + return mState == State.SUSPENDED; + } + } + /** * Indicates whether network connectivity is possible. A network is unavailable * when a persistent or semi-persistent condition prevents the possibility diff --git a/service/src/com/android/server/ConnectivityService.java b/service/src/com/android/server/ConnectivityService.java index 8ec6eb9052..108fc6491e 100755 --- a/service/src/com/android/server/ConnectivityService.java +++ b/service/src/com/android/server/ConnectivityService.java @@ -4526,7 +4526,7 @@ public class ConnectivityService extends IConnectivityManager.Stub // because they lost all their requests or because their score isn't good) // then they would disconnect organically, report their new state and then // disconnect the channel. - if (nai.networkInfo.isConnected()) { + if (nai.networkInfo.isConnected() || nai.networkInfo.isSuspended()) { nai.networkInfo.setDetailedState(NetworkInfo.DetailedState.DISCONNECTED, null, null); } diff --git a/tests/unit/java/com/android/server/ConnectivityServiceTest.java b/tests/unit/java/com/android/server/ConnectivityServiceTest.java index 0669d4f023..91b1eb1b4f 100755 --- a/tests/unit/java/com/android/server/ConnectivityServiceTest.java +++ b/tests/unit/java/com/android/server/ConnectivityServiceTest.java @@ -17949,7 +17949,6 @@ public class ConnectivityServiceTest { mCellAgent.expectDisconnected(); waitForIdle(); - // TODO (aosp/2583410): update following check to verifyClatdStop - verifyNeverClatdStop(null /* inOrder */, MOBILE_IFNAME); + verifyClatdStop(null /* inOrder */, MOBILE_IFNAME); } }