Merge "Also update connected clients for local only tethering"
diff --git a/tests/cts/net/TEST_MAPPING b/TEST_MAPPING
similarity index 88%
rename from tests/cts/net/TEST_MAPPING
rename to TEST_MAPPING
index 8f65b65..1db4baa 100644
--- a/tests/cts/net/TEST_MAPPING
+++ b/TEST_MAPPING
@@ -1,5 +1,6 @@
{
- // TODO: move to mainline-presubmit once supported
+ // Run in addition to mainline-presubmit as mainline-presubmit is not
+ // supported in every branch.
"presubmit": [
{
"name": "CtsNetTestCasesLatestSdk",
diff --git a/Tethering/Android.bp b/Tethering/Android.bp
index 23aa7f8..d8557ad 100644
--- a/Tethering/Android.bp
+++ b/Tethering/Android.bp
@@ -67,6 +67,9 @@
"liblog",
"libnativehelper_compat_libc++",
],
+ static_libs: [
+ "libnetjniutils",
+ ],
// We cannot use plain "libc++" here to link libc++ dynamically because it results in:
// java.lang.UnsatisfiedLinkError: dlopen failed: library "libc++_shared.so" not found
diff --git a/Tethering/jni/android_net_util_TetheringUtils.cpp b/Tethering/jni/android_net_util_TetheringUtils.cpp
index 94c871d..7bfb6da 100644
--- a/Tethering/jni/android_net_util_TetheringUtils.cpp
+++ b/Tethering/jni/android_net_util_TetheringUtils.cpp
@@ -19,8 +19,8 @@
#include <jni.h>
#include <linux/filter.h>
#include <nativehelper/JNIHelp.h>
-#include <nativehelper/JNIHelpCompat.h>
#include <nativehelper/ScopedUtfChars.h>
+#include <netjniutils/netjniutils.h>
#include <net/if.h>
#include <netinet/ether.h>
#include <netinet/ip6.h>
@@ -57,7 +57,7 @@
filter_code,
};
- int fd = jniGetFDFromFileDescriptor(env, javaFd);
+ int fd = netjniutils::GetNativeFileDescriptor(env, javaFd);
if (setsockopt(fd, SOL_SOCKET, SO_ATTACH_FILTER, &filter, sizeof(filter)) != 0) {
jniThrowExceptionFmt(env, "java/net/SocketException",
"setsockopt(SO_ATTACH_FILTER): %s", strerror(errno));
@@ -79,7 +79,7 @@
{
static const int kLinkLocalHopLimit = 255;
- int fd = jniGetFDFromFileDescriptor(env, javaFd);
+ int fd = netjniutils::GetNativeFileDescriptor(env, javaFd);
// Set an ICMPv6 filter that only passes Router Solicitations.
struct icmp6_filter rs_only;
diff --git a/Tethering/src/android/net/ip/NeighborPacketForwarder.java b/Tethering/src/android/net/ip/NeighborPacketForwarder.java
index 73fc833..084743d 100644
--- a/Tethering/src/android/net/ip/NeighborPacketForwarder.java
+++ b/Tethering/src/android/net/ip/NeighborPacketForwarder.java
@@ -25,7 +25,6 @@
import static android.system.OsConstants.SOCK_RAW;
import android.net.util.InterfaceParams;
-import android.net.util.PacketReader;
import android.net.util.SocketUtils;
import android.net.util.TetheringUtils;
import android.os.Handler;
@@ -33,6 +32,8 @@
import android.system.Os;
import android.util.Log;
+import com.android.net.module.util.PacketReader;
+
import java.io.FileDescriptor;
import java.io.IOException;
import java.net.Inet6Address;
diff --git a/tests/cts/tethering/OWNERS b/tests/cts/OWNERS
similarity index 81%
rename from tests/cts/tethering/OWNERS
rename to tests/cts/OWNERS
index cd6abeb..4264345 100644
--- a/tests/cts/tethering/OWNERS
+++ b/tests/cts/OWNERS
@@ -1,4 +1,4 @@
# Bug component: 31808
+set noparent
lorenzo@google.com
-satk@google.com
-
+satk@google.com
\ No newline at end of file
diff --git a/tests/cts/hostside/OWNERS b/tests/cts/hostside/OWNERS
index 52c8053..20bc55e 100644
--- a/tests/cts/hostside/OWNERS
+++ b/tests/cts/hostside/OWNERS
@@ -1,4 +1,4 @@
# Bug component: 61373
+# Inherits parent owners
sudheersai@google.com
-lorenzo@google.com
jchalard@google.com
diff --git a/tests/cts/net/OWNERS b/tests/cts/net/OWNERS
index 7722bb3..432bd9b 100644
--- a/tests/cts/net/OWNERS
+++ b/tests/cts/net/OWNERS
@@ -1,5 +1,3 @@
# Bug component: 31808
-lorenzo@google.com
-satk@google.com
-
+# Inherits parent owners
per-file src/android/net/cts/NetworkWatchlistTest.java=alanstokes@google.com
diff --git a/tests/cts/net/src/android/net/cts/NetworkAgentTest.kt b/tests/cts/net/src/android/net/cts/NetworkAgentTest.kt
index 85d0a2e..87aa2a3 100644
--- a/tests/cts/net/src/android/net/cts/NetworkAgentTest.kt
+++ b/tests/cts/net/src/android/net/cts/NetworkAgentTest.kt
@@ -18,6 +18,8 @@
import android.app.Instrumentation
import android.content.Context
import android.net.ConnectivityManager
+import android.net.InetAddresses
+import android.net.IpPrefix
import android.net.KeepalivePacketData
import android.net.LinkAddress
import android.net.LinkProperties
@@ -34,9 +36,20 @@
import android.net.NetworkAgent.VALID_NETWORK
import android.net.NetworkAgentConfig
import android.net.NetworkCapabilities
+import android.net.NetworkCapabilities.NET_CAPABILITY_INTERNET
+import android.net.NetworkCapabilities.NET_CAPABILITY_NOT_CONGESTED
+import android.net.NetworkCapabilities.NET_CAPABILITY_NOT_METERED
+import android.net.NetworkCapabilities.NET_CAPABILITY_NOT_ROAMING
+import android.net.NetworkCapabilities.NET_CAPABILITY_NOT_SUSPENDED
+import android.net.NetworkCapabilities.NET_CAPABILITY_NOT_VPN
+import android.net.NetworkCapabilities.NET_CAPABILITY_TEMPORARILY_NOT_METERED
+import android.net.NetworkCapabilities.NET_CAPABILITY_TRUSTED
+import android.net.NetworkCapabilities.TRANSPORT_TEST
+import android.net.NetworkCapabilities.TRANSPORT_VPN
import android.net.NetworkInfo
import android.net.NetworkProvider
import android.net.NetworkRequest
+import android.net.RouteInfo
import android.net.SocketKeepalive
import android.net.StringNetworkSpecifier
import android.net.Uri
@@ -57,6 +70,7 @@
import android.os.Looper
import android.os.Message
import android.os.Messenger
+import android.util.DebugUtils.valueToString
import androidx.test.InstrumentationRegistry
import androidx.test.runner.AndroidJUnit4
import com.android.internal.util.AsyncChannel
@@ -80,7 +94,6 @@
import org.mockito.Mockito.doReturn
import org.mockito.Mockito.mock
import org.mockito.Mockito.verify
-import java.net.InetAddress
import java.time.Duration
import java.util.Arrays
import java.util.UUID
@@ -122,8 +135,8 @@
@Rule @JvmField
val ignoreRule = DevSdkIgnoreRule(ignoreClassUpTo = Build.VERSION_CODES.Q)
- private val LOCAL_IPV4_ADDRESS = InetAddress.parseNumericAddress("192.0.2.1")
- private val REMOTE_IPV4_ADDRESS = InetAddress.parseNumericAddress("192.0.2.2")
+ private val LOCAL_IPV4_ADDRESS = InetAddresses.parseNumericAddress("192.0.2.1")
+ private val REMOTE_IPV4_ADDRESS = InetAddresses.parseNumericAddress("192.0.2.2")
private val mCM = realContext.getSystemService(ConnectivityManager::class.java)
private val mHandlerThread = HandlerThread("${javaClass.simpleName} handler thread")
@@ -314,22 +327,23 @@
private fun createNetworkAgent(
context: Context = realContext,
name: String? = null,
- nc: NetworkCapabilities = NetworkCapabilities(),
- lp: LinkProperties = LinkProperties()
+ initialNc: NetworkCapabilities? = null,
+ initialLp: LinkProperties? = null
): TestableNetworkAgent {
- nc.apply {
- addTransportType(NetworkCapabilities.TRANSPORT_TEST)
- removeCapability(NetworkCapabilities.NET_CAPABILITY_TRUSTED)
- removeCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
- addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_SUSPENDED)
- addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_ROAMING)
- addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_VPN)
+ val nc = initialNc ?: NetworkCapabilities().apply {
+ addTransportType(TRANSPORT_TEST)
+ removeCapability(NET_CAPABILITY_TRUSTED)
+ removeCapability(NET_CAPABILITY_INTERNET)
+ addCapability(NET_CAPABILITY_NOT_SUSPENDED)
+ addCapability(NET_CAPABILITY_NOT_ROAMING)
+ addCapability(NET_CAPABILITY_NOT_VPN)
if (null != name) {
setNetworkSpecifier(StringNetworkSpecifier(name))
}
}
- lp.apply {
- addLinkAddress(LinkAddress(LOCAL_IPV4_ADDRESS, 0))
+ val lp = initialLp ?: LinkProperties().apply {
+ addLinkAddress(LinkAddress(LOCAL_IPV4_ADDRESS, 32))
+ addRoute(RouteInfo(IpPrefix("0.0.0.0/0"), null, null))
}
val config = NetworkAgentConfig.Builder().build()
return TestableNetworkAgent(context, mHandlerThread.looper, nc, lp, config).also {
@@ -341,7 +355,7 @@
Pair<TestableNetworkAgent, TestableNetworkCallback> {
val request: NetworkRequest = NetworkRequest.Builder()
.clearCapabilities()
- .addTransportType(NetworkCapabilities.TRANSPORT_TEST)
+ .addTransportType(TRANSPORT_TEST)
.build()
val callback = TestableNetworkCallback(timeoutMs = DEFAULT_TIMEOUT_MS)
requestNetwork(request, callback)
@@ -386,7 +400,7 @@
val callbacks = thresholds.map { strength ->
val request = NetworkRequest.Builder()
.clearCapabilities()
- .addTransportType(NetworkCapabilities.TRANSPORT_TEST)
+ .addTransportType(TRANSPORT_TEST)
.setSignalStrength(strength)
.build()
TestableNetworkCallback(DEFAULT_TIMEOUT_MS).also {
@@ -486,10 +500,10 @@
it.getInterfaceName() == ifaceName
}
val nc = NetworkCapabilities(agent.nc)
- nc.addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED)
+ nc.addCapability(NET_CAPABILITY_NOT_METERED)
agent.sendNetworkCapabilities(nc)
callback.expectCapabilitiesThat(agent.network) {
- it.hasCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED)
+ it.hasCapability(NET_CAPABILITY_NOT_METERED)
}
}
@@ -503,12 +517,12 @@
val name2 = UUID.randomUUID().toString()
val request1 = NetworkRequest.Builder()
.clearCapabilities()
- .addTransportType(NetworkCapabilities.TRANSPORT_TEST)
+ .addTransportType(TRANSPORT_TEST)
.setNetworkSpecifier(StringNetworkSpecifier(name1))
.build()
val request2 = NetworkRequest.Builder()
.clearCapabilities()
- .addTransportType(NetworkCapabilities.TRANSPORT_TEST)
+ .addTransportType(TRANSPORT_TEST)
.setNetworkSpecifier(StringNetworkSpecifier(name2))
.build()
val callback1 = TestableNetworkCallback(timeoutMs = DEFAULT_TIMEOUT_MS)
@@ -519,7 +533,7 @@
// Then file the interesting request
val request = NetworkRequest.Builder()
.clearCapabilities()
- .addTransportType(NetworkCapabilities.TRANSPORT_TEST)
+ .addTransportType(TRANSPORT_TEST)
.build()
val callback = TestableNetworkCallback(timeoutMs = DEFAULT_TIMEOUT_MS)
requestNetwork(request, callback)
@@ -551,52 +565,71 @@
@IgnoreUpTo(Build.VERSION_CODES.R)
fun testSetUnderlyingNetworks() {
val request = NetworkRequest.Builder()
- .addTransportType(NetworkCapabilities.TRANSPORT_TEST)
- .addTransportType(NetworkCapabilities.TRANSPORT_VPN)
- .removeCapability(NetworkCapabilities.NET_CAPABILITY_NOT_VPN)
- .removeCapability(NetworkCapabilities.NET_CAPABILITY_TRUSTED) // TODO: add to VPN!
+ .addTransportType(TRANSPORT_TEST)
+ .addTransportType(TRANSPORT_VPN)
+ .removeCapability(NET_CAPABILITY_NOT_VPN)
+ .removeCapability(NET_CAPABILITY_TRUSTED) // TODO: add to VPN!
.build()
- val callback = TestableNetworkCallback()
- mCM.registerNetworkCallback(request, callback)
+ val callback = TestableNetworkCallback(timeoutMs = DEFAULT_TIMEOUT_MS)
+ registerNetworkCallback(request, callback)
val nc = NetworkCapabilities().apply {
- addTransportType(NetworkCapabilities.TRANSPORT_TEST)
- addTransportType(NetworkCapabilities.TRANSPORT_VPN)
- removeCapability(NetworkCapabilities.NET_CAPABILITY_NOT_VPN)
+ addTransportType(TRANSPORT_TEST)
+ addTransportType(TRANSPORT_VPN)
+ removeCapability(NET_CAPABILITY_NOT_VPN)
}
val defaultNetwork = mCM.activeNetwork
assertNotNull(defaultNetwork)
- val defaultNetworkTransports = mCM.getNetworkCapabilities(defaultNetwork).transportTypes
+ val defaultNetworkCapabilities = mCM.getNetworkCapabilities(defaultNetwork)
+ val defaultNetworkTransports = defaultNetworkCapabilities.transportTypes
- val agent = createNetworkAgent(nc = nc)
+ val agent = createNetworkAgent(initialNc = nc)
agent.register()
agent.markConnected()
callback.expectAvailableThenValidatedCallbacks(agent.network!!)
+ // Check that the default network's transport is propagated to the VPN.
var vpnNc = mCM.getNetworkCapabilities(agent.network)
assertNotNull(vpnNc)
- assertTrue(NetworkCapabilities.TRANSPORT_VPN in vpnNc.transportTypes)
+
+ val testAndVpn = intArrayOf(TRANSPORT_TEST, TRANSPORT_VPN)
+ assertTrue(hasAllTransports(vpnNc, testAndVpn))
+ assertFalse(vpnNc.hasCapability(NET_CAPABILITY_NOT_VPN))
assertTrue(hasAllTransports(vpnNc, defaultNetworkTransports),
"VPN transports ${Arrays.toString(vpnNc.transportTypes)}" +
" lacking transports from ${Arrays.toString(defaultNetworkTransports)}")
+ // Check that when no underlying networks are announced the underlying transport disappears.
agent.setUnderlyingNetworks(listOf<Network>())
callback.expectCapabilitiesThat(agent.network!!) {
- it.transportTypes.size == 1 && it.hasTransport(NetworkCapabilities.TRANSPORT_VPN)
+ it.transportTypes.size == 2 && hasAllTransports(it, testAndVpn)
}
- val expectedTransports = (defaultNetworkTransports.toSet() +
- NetworkCapabilities.TRANSPORT_VPN).toIntArray()
+ // Put the underlying network back and check that the underlying transport reappears.
+ val expectedTransports = (defaultNetworkTransports.toSet() + TRANSPORT_TEST + TRANSPORT_VPN)
+ .toIntArray()
agent.setUnderlyingNetworks(null)
callback.expectCapabilitiesThat(agent.network!!) {
it.transportTypes.size == expectedTransports.size &&
hasAllTransports(it, expectedTransports)
}
+ // Check that some underlying capabilities are propagated.
+ // This is not very accurate because the test does not control the capabilities of the
+ // underlying networks, and because not congested, not roaming, and not suspended are the
+ // default anyway. It's still useful as an extra check though.
+ vpnNc = mCM.getNetworkCapabilities(agent.network)
+ for (cap in listOf(NET_CAPABILITY_NOT_CONGESTED,
+ NET_CAPABILITY_NOT_ROAMING,
+ NET_CAPABILITY_NOT_SUSPENDED)) {
+ val capStr = valueToString(NetworkCapabilities::class.java, "NET_CAPABILITY_", cap)
+ if (defaultNetworkCapabilities.hasCapability(cap) && !vpnNc.hasCapability(cap)) {
+ fail("$capStr not propagated from underlying: $defaultNetworkCapabilities")
+ }
+ }
+
agent.unregister()
callback.expectCallback<Lost>(agent.network)
-
- mCM.unregisterNetworkCallback(callback)
}
@Test
@@ -687,7 +720,7 @@
// First create a request to make sure the network is kept up
val request1 = NetworkRequest.Builder()
.clearCapabilities()
- .addTransportType(NetworkCapabilities.TRANSPORT_TEST)
+ .addTransportType(TRANSPORT_TEST)
.build()
val callback1 = TestableNetworkCallback(timeoutMs = DEFAULT_TIMEOUT_MS).also {
registerNetworkCallback(request1, it)
@@ -697,7 +730,7 @@
// Then file the interesting request
val request = NetworkRequest.Builder()
.clearCapabilities()
- .addTransportType(NetworkCapabilities.TRANSPORT_TEST)
+ .addTransportType(TRANSPORT_TEST)
.build()
val callback = TestableNetworkCallback(timeoutMs = DEFAULT_TIMEOUT_MS)
requestNetwork(request, callback)
@@ -708,18 +741,18 @@
// Send TEMP_NOT_METERED and check that the callback is called appropriately.
val nc1 = NetworkCapabilities(agent.nc)
- .addCapability(NetworkCapabilities.NET_CAPABILITY_TEMPORARILY_NOT_METERED)
+ .addCapability(NET_CAPABILITY_TEMPORARILY_NOT_METERED)
agent.sendNetworkCapabilities(nc1)
callback.expectCapabilitiesThat(agent.network) {
- it.hasCapability(NetworkCapabilities.NET_CAPABILITY_TEMPORARILY_NOT_METERED)
+ it.hasCapability(NET_CAPABILITY_TEMPORARILY_NOT_METERED)
}
// Remove TEMP_NOT_METERED and check that the callback is called appropriately.
val nc2 = NetworkCapabilities(agent.nc)
- .removeCapability(NetworkCapabilities.NET_CAPABILITY_TEMPORARILY_NOT_METERED)
+ .removeCapability(NET_CAPABILITY_TEMPORARILY_NOT_METERED)
agent.sendNetworkCapabilities(nc2)
callback.expectCapabilitiesThat(agent.network) {
- !it.hasCapability(NetworkCapabilities.NET_CAPABILITY_TEMPORARILY_NOT_METERED)
+ !it.hasCapability(NET_CAPABILITY_TEMPORARILY_NOT_METERED)
}
}