Merge "Move NsdServiceInfoTest to common tests"
diff --git a/Cronet/tests/cts/OWNERS b/Cronet/tests/OWNERS
similarity index 100%
rename from Cronet/tests/cts/OWNERS
rename to Cronet/tests/OWNERS
diff --git a/Cronet/tests/common/Android.bp b/Cronet/tests/common/Android.bp
index 939a81c..e17081a 100644
--- a/Cronet/tests/common/Android.bp
+++ b/Cronet/tests/common/Android.bp
@@ -26,9 +26,7 @@
// go with merging NetHttp and Tethering targets.
android_test {
name: "NetHttpCoverageTests",
- defaults: ["CronetTestJavaDefaults"],
enforce_default_target_sdk_version: true,
- sdk_version: "test_current",
min_sdk_version: "30",
test_suites: ["general-tests", "mts-tethering"],
static_libs: [
@@ -36,6 +34,9 @@
"CtsNetHttpTestsLib",
"NetHttpTestsLibPreJarJar",
],
- jarjar_rules: ":framework-tethering-jarjar-rules",
+ jarjar_rules: ":net-http-test-jarjar-rules",
compile_multilib: "both", // Include both the 32 and 64 bit versions
+ jni_libs: [
+ "cronet_aml_components_cronet_android_cronet_tests__testing"
+ ],
}
diff --git a/Cronet/tests/cts/Android.bp b/Cronet/tests/cts/Android.bp
index d969b54..a0b2434 100644
--- a/Cronet/tests/cts/Android.bp
+++ b/Cronet/tests/cts/Android.bp
@@ -18,38 +18,10 @@
default_applicable_licenses: ["Android-Apache-2.0"],
}
-// cronet_test_java_defaults can be used to specify a java_defaults target that
-// either enables or disables Cronet tests. This is used to disable Cronet
-// tests on tm-mainline-prod where the required APIs are not present.
-cronet_test_java_defaults = "CronetTestJavaDefaultsEnabled"
-// This is a placeholder comment to avoid merge conflicts
-// as cronet_test_java_defaults may have different values
-// depending on the branch
-
-java_defaults {
- name: "CronetTestJavaDefaultsEnabled",
- enabled: true,
- // TODO(danstahr): move to unconditional static_libs once the T branch is abandoned
- static_libs: [
- "truth",
- ],
-}
-
-java_defaults {
- name: "CronetTestJavaDefaultsDisabled",
- enabled: false,
-}
-
-java_defaults {
- name: "CronetTestJavaDefaults",
- defaults: [cronet_test_java_defaults],
-}
-
android_library {
name: "CtsNetHttpTestsLib",
defaults: [
"cts_defaults",
- "CronetTestJavaDefaults",
],
sdk_version: "test_current",
min_sdk_version: "30",
@@ -61,14 +33,17 @@
"androidx.test.ext.junit",
"ctstestrunner-axt",
"ctstestserver",
- "junit",
"hamcrest-library",
+ "junit",
"kotlin-test",
+ "mockito-target",
+ "net-tests-utils",
+ "truth",
],
libs: [
"android.test.base",
"androidx.annotation_annotation",
- "framework-tethering",
+ "framework-connectivity",
"org.apache.http.legacy",
],
lint: { test: true }
@@ -78,9 +53,10 @@
name: "CtsNetHttpTestCases",
defaults: [
"cts_defaults",
- "CronetTestJavaDefaults",
],
+ enforce_default_target_sdk_version: true,
sdk_version: "test_current",
+ min_sdk_version: "30",
static_libs: ["CtsNetHttpTestsLib"],
// Tag this as a cts test artifact
test_suites: [
diff --git a/Cronet/tests/cts/src/android/net/http/cts/BidirectionalStreamTest.kt b/Cronet/tests/cts/src/android/net/http/cts/BidirectionalStreamTest.kt
index bead1f8..0885f4f 100644
--- a/Cronet/tests/cts/src/android/net/http/cts/BidirectionalStreamTest.kt
+++ b/Cronet/tests/cts/src/android/net/http/cts/BidirectionalStreamTest.kt
@@ -23,8 +23,11 @@
import android.net.http.cts.util.TestBidirectionalStreamCallback.ResponseStep
import android.net.http.cts.util.assumeOKStatusCode
import android.net.http.cts.util.skipIfNoInternetConnection
+import android.os.Build
import androidx.test.core.app.ApplicationProvider
-import androidx.test.ext.junit.runners.AndroidJUnit4
+import com.android.testutils.DevSdkIgnoreRule
+import com.android.testutils.DevSdkIgnoreRunner
+import com.google.common.truth.Truth.assertThat
import kotlin.test.Test
import kotlin.test.assertEquals
import org.hamcrest.MatcherAssert
@@ -39,7 +42,8 @@
* This tests uses a non-hermetic server. Instead of asserting, assume the next callback. This way,
* if the request were to fail, the test would just be skipped instead of failing.
*/
-@RunWith(AndroidJUnit4::class)
+@RunWith(DevSdkIgnoreRunner::class)
+@DevSdkIgnoreRule.IgnoreUpTo(Build.VERSION_CODES.R)
class BidirectionalStreamTest {
private val context: Context = ApplicationProvider.getApplicationContext()
private val callback = TestBidirectionalStreamCallback()
@@ -78,4 +82,113 @@
"Received byte count must be > 0", info.receivedByteCount, Matchers.greaterThan(0L))
assertEquals("h2", info.negotiatedProtocol)
}
+
+ @Test
+ @Throws(Exception::class)
+ fun testBidirectionalStream_getHttpMethod() {
+ val builder = createBidirectionalStreamBuilder(URL)
+ val method = "GET"
+
+ builder.setHttpMethod(method)
+ stream = builder.build()
+ assertThat(stream!!.getHttpMethod()).isEqualTo(method)
+ }
+
+ @Test
+ @Throws(Exception::class)
+ fun testBidirectionalStream_hasTrafficStatsTag() {
+ val builder = createBidirectionalStreamBuilder(URL)
+
+ builder.setTrafficStatsTag(10)
+ stream = builder.build()
+ assertThat(stream!!.hasTrafficStatsTag()).isTrue()
+ }
+
+ @Test
+ @Throws(Exception::class)
+ fun testBidirectionalStream_getTrafficStatsTag() {
+ val builder = createBidirectionalStreamBuilder(URL)
+ val trafficStatsTag = 10
+
+ builder.setTrafficStatsTag(trafficStatsTag)
+ stream = builder.build()
+ assertThat(stream!!.getTrafficStatsTag()).isEqualTo(trafficStatsTag)
+ }
+
+ @Test
+ @Throws(Exception::class)
+ fun testBidirectionalStream_hasTrafficStatsUid() {
+ val builder = createBidirectionalStreamBuilder(URL)
+
+ builder.setTrafficStatsUid(10)
+ stream = builder.build()
+ assertThat(stream!!.hasTrafficStatsUid()).isTrue()
+ }
+
+ @Test
+ @Throws(Exception::class)
+ fun testBidirectionalStream_getTrafficStatsUid() {
+ val builder = createBidirectionalStreamBuilder(URL)
+ val trafficStatsUid = 10
+
+ builder.setTrafficStatsUid(trafficStatsUid)
+ stream = builder.build()
+ assertThat(stream!!.getTrafficStatsUid()).isEqualTo(trafficStatsUid)
+ }
+
+ @Test
+ @Throws(Exception::class)
+ fun testBidirectionalStream_getHeaders_asList() {
+ val builder = createBidirectionalStreamBuilder(URL)
+ val expectedHeaders = mapOf(
+ "Authorization" to "Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==",
+ "Max-Forwards" to "10",
+ "X-Client-Data" to "random custom header content").entries.toList()
+
+ for (header in expectedHeaders) {
+ builder.addHeader(header.key, header.value)
+ }
+
+ stream = builder.build()
+ assertThat(stream!!.getHeaders().getAsList()).containsAtLeastElementsIn(expectedHeaders)
+ }
+
+ @Test
+ @Throws(Exception::class)
+ fun testBidirectionalStream_getHeaders_asMap() {
+ val builder = createBidirectionalStreamBuilder(URL)
+ val expectedHeaders = mapOf(
+ "Authorization" to listOf("Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ=="),
+ "Max-Forwards" to listOf("10"),
+ "X-Client-Data" to listOf("random custom header content"))
+
+ for (header in expectedHeaders) {
+ builder.addHeader(header.key, header.value.get(0))
+ }
+
+ stream = builder.build()
+ assertThat(stream!!.getHeaders().getAsMap()).containsAtLeastEntriesIn(expectedHeaders)
+ }
+
+ @Test
+ @Throws(Exception::class)
+ fun testBidirectionalStream_getPriority() {
+ val builder = createBidirectionalStreamBuilder(URL)
+ val priority = BidirectionalStream.STREAM_PRIORITY_LOW
+
+ builder.setPriority(priority)
+ stream = builder.build()
+ assertThat(stream!!.getPriority()).isEqualTo(priority)
+ }
+
+ @Test
+ @Throws(Exception::class)
+ fun testBidirectionalStream_isDelayRequestHeadersUntilFirstFlushEnabled() {
+ val builder = createBidirectionalStreamBuilder(URL)
+
+ builder.setDelayRequestHeadersUntilFirstFlushEnabled(true)
+ stream = builder.build()
+ assertThat(stream!!.isDelayRequestHeadersUntilFirstFlushEnabled()).isTrue()
+ }
+
}
diff --git a/Cronet/tests/cts/src/android/net/http/cts/CallbackExceptionTest.kt b/Cronet/tests/cts/src/android/net/http/cts/CallbackExceptionTest.kt
index e17b63f..1405ed9 100644
--- a/Cronet/tests/cts/src/android/net/http/cts/CallbackExceptionTest.kt
+++ b/Cronet/tests/cts/src/android/net/http/cts/CallbackExceptionTest.kt
@@ -23,8 +23,10 @@
import android.net.http.cts.util.TestUrlRequestCallback
import android.net.http.cts.util.TestUrlRequestCallback.FailureType
import android.net.http.cts.util.TestUrlRequestCallback.ResponseStep
+import android.os.Build
import androidx.test.core.app.ApplicationProvider
-import androidx.test.ext.junit.runners.AndroidJUnit4
+import com.android.testutils.DevSdkIgnoreRule
+import com.android.testutils.DevSdkIgnoreRunner
import kotlin.test.Test
import kotlin.test.assertEquals
import kotlin.test.assertIs
@@ -32,7 +34,8 @@
import kotlin.test.assertTrue
import org.junit.runner.RunWith
-@RunWith(AndroidJUnit4::class)
+@RunWith(DevSdkIgnoreRunner::class)
+@DevSdkIgnoreRule.IgnoreUpTo(Build.VERSION_CODES.R)
class CallbackExceptionTest {
@Test
@@ -53,7 +56,7 @@
val callback = TestUrlRequestCallback()
callback.setFailure(FailureType.THROW_SYNC, ResponseStep.ON_RESPONSE_STARTED)
val request = httpEngine
- .newUrlRequestBuilder(server.successUrl, callback, callback.executor)
+ .newUrlRequestBuilder(server.successUrl, callback.executor, callback)
.build()
request.start()
diff --git a/Cronet/tests/cts/src/android/net/http/cts/ConnectionMigrationOptionsTest.kt b/Cronet/tests/cts/src/android/net/http/cts/ConnectionMigrationOptionsTest.kt
index 2701ed0..10c7f3c 100644
--- a/Cronet/tests/cts/src/android/net/http/cts/ConnectionMigrationOptionsTest.kt
+++ b/Cronet/tests/cts/src/android/net/http/cts/ConnectionMigrationOptionsTest.kt
@@ -17,30 +17,55 @@
package android.net.http.cts
import android.net.http.ConnectionMigrationOptions
-import androidx.test.ext.junit.runners.AndroidJUnit4
+import android.net.http.ConnectionMigrationOptions.MIGRATION_OPTION_ENABLED
+import android.net.http.ConnectionMigrationOptions.MIGRATION_OPTION_UNSPECIFIED
+import android.os.Build
+import com.android.testutils.DevSdkIgnoreRule
+import com.android.testutils.DevSdkIgnoreRunner
import kotlin.test.Test
-import kotlin.test.assertNotNull
-import kotlin.test.assertTrue
+import kotlin.test.assertEquals
import org.junit.runner.RunWith
-@RunWith(AndroidJUnit4::class)
+@RunWith(DevSdkIgnoreRunner::class)
+@DevSdkIgnoreRule.IgnoreUpTo(Build.VERSION_CODES.R)
class ConnectionMigrationOptionsTest {
@Test
+ fun testConnectionMigrationOptions_defaultValues() {
+ val options =
+ ConnectionMigrationOptions.Builder().build()
+
+ assertEquals(MIGRATION_OPTION_UNSPECIFIED, options.allowNonDefaultNetworkUsage)
+ assertEquals(MIGRATION_OPTION_UNSPECIFIED, options.defaultNetworkMigration)
+ assertEquals(MIGRATION_OPTION_UNSPECIFIED, options.pathDegradationMigration)
+ }
+
+ @Test
fun testConnectionMigrationOptions_enableDefaultNetworkMigration_returnSetValue() {
val options =
- ConnectionMigrationOptions.Builder().setEnableDefaultNetworkMigration(true).build()
+ ConnectionMigrationOptions.Builder()
+ .setDefaultNetworkMigration(MIGRATION_OPTION_ENABLED)
+ .build()
- assertNotNull(options.enableDefaultNetworkMigration)
- assertTrue(options.enableDefaultNetworkMigration!!)
+ assertEquals(MIGRATION_OPTION_ENABLED, options.defaultNetworkMigration)
}
@Test
fun testConnectionMigrationOptions_enablePathDegradationMigration_returnSetValue() {
val options =
- ConnectionMigrationOptions.Builder().setEnablePathDegradationMigration(true).build()
+ ConnectionMigrationOptions.Builder()
+ .setPathDegradationMigration(MIGRATION_OPTION_ENABLED)
+ .build()
- assertNotNull(options.enablePathDegradationMigration)
- assertTrue(options.enablePathDegradationMigration!!)
+ assertEquals(MIGRATION_OPTION_ENABLED, options.pathDegradationMigration)
+ }
+
+ @Test
+ fun testConnectionMigrationOptions_allowNonDefaultNetworkUsage_returnSetValue() {
+ val options =
+ ConnectionMigrationOptions.Builder()
+ .setAllowNonDefaultNetworkUsage(MIGRATION_OPTION_ENABLED).build()
+
+ assertEquals(MIGRATION_OPTION_ENABLED, options.allowNonDefaultNetworkUsage)
}
}
diff --git a/Cronet/tests/cts/src/android/net/http/cts/DnsOptionsTest.kt b/Cronet/tests/cts/src/android/net/http/cts/DnsOptionsTest.kt
index b96e931..56802c6 100644
--- a/Cronet/tests/cts/src/android/net/http/cts/DnsOptionsTest.kt
+++ b/Cronet/tests/cts/src/android/net/http/cts/DnsOptionsTest.kt
@@ -17,36 +17,42 @@
package android.net.http.cts
import android.net.http.DnsOptions
-import androidx.test.ext.junit.runners.AndroidJUnit4
+import android.net.http.DnsOptions.DNS_OPTION_ENABLED
+import android.net.http.DnsOptions.DNS_OPTION_UNSPECIFIED
+import android.os.Build
+import com.android.testutils.DevSdkIgnoreRule
+import com.android.testutils.DevSdkIgnoreRunner
import java.time.Duration
import kotlin.test.Test
import kotlin.test.assertEquals
import kotlin.test.assertNotNull
import kotlin.test.assertNull
-import kotlin.test.assertTrue
import org.junit.runner.RunWith
-@RunWith(AndroidJUnit4::class)
+@RunWith(DevSdkIgnoreRunner::class)
+@DevSdkIgnoreRule.IgnoreUpTo(Build.VERSION_CODES.R)
class DnsOptionsTest {
@Test
fun testDnsOptions_defaultValues() {
val options = DnsOptions.Builder().build()
- assertNull(options.persistHostCache)
+ assertEquals(DNS_OPTION_UNSPECIFIED, options.persistHostCache)
assertNull(options.persistHostCachePeriod)
- assertNull(options.enableStaleDns)
+ assertEquals(DNS_OPTION_UNSPECIFIED, options.staleDns)
assertNull(options.staleDnsOptions)
- assertNull(options.useHttpStackDnsResolver)
- assertNull(options.preestablishConnectionsToStaleDnsResults)
+ assertEquals(DNS_OPTION_UNSPECIFIED, options.useHttpStackDnsResolver)
+ assertEquals(DNS_OPTION_UNSPECIFIED,
+ options.preestablishConnectionsToStaleDnsResults)
}
@Test
fun testDnsOptions_persistHostCache_returnSetValue() {
- val options = DnsOptions.Builder().setPersistHostCache(true).build()
+ val options = DnsOptions.Builder()
+ .setPersistHostCache(DNS_OPTION_ENABLED)
+ .build()
- assertNotNull(options.persistHostCache)
- assertTrue(options.persistHostCache!!)
+ assertEquals(DNS_OPTION_ENABLED, options.persistHostCache)
}
@Test
@@ -59,44 +65,63 @@
@Test
fun testDnsOptions_enableStaleDns_returnSetValue() {
- val options = DnsOptions.Builder().setEnableStaleDns(true).build()
+ val options = DnsOptions.Builder()
+ .setStaleDns(DNS_OPTION_ENABLED)
+ .build()
- assertNotNull(options.enableStaleDns)
- assertTrue(options.enableStaleDns!!)
+ assertEquals(DNS_OPTION_ENABLED, options.staleDns)
}
@Test
fun testDnsOptions_useHttpStackDnsResolver_returnsSetValue() {
- val options = DnsOptions.Builder().setUseHttpStackDnsResolver(true).build()
+ val options = DnsOptions.Builder()
+ .setUseHttpStackDnsResolver(DNS_OPTION_ENABLED)
+ .build()
- assertNotNull(options.useHttpStackDnsResolver)
- assertTrue(options.useHttpStackDnsResolver!!)
+ assertEquals(DNS_OPTION_ENABLED, options.useHttpStackDnsResolver)
}
@Test
fun testDnsOptions_preestablishConnectionsToStaleDnsResults_returnsSetValue() {
- val options = DnsOptions.Builder().setPreestablishConnectionsToStaleDnsResults(true).build()
+ val options = DnsOptions.Builder()
+ .setPreestablishConnectionsToStaleDnsResults(DNS_OPTION_ENABLED)
+ .build()
- assertNotNull(options.preestablishConnectionsToStaleDnsResults)
- assertTrue(options.preestablishConnectionsToStaleDnsResults!!)
+ assertEquals(DNS_OPTION_ENABLED,
+ options.preestablishConnectionsToStaleDnsResults)
+ }
+
+ @Test
+ fun testDnsOptions_setStaleDnsOptions_returnsSetValues() {
+ val staleOptions = DnsOptions.StaleDnsOptions.Builder()
+ .setAllowCrossNetworkUsage(DNS_OPTION_ENABLED)
+ .setFreshLookupTimeout(Duration.ofMillis(1234))
+ .build()
+ val options = DnsOptions.Builder()
+ .setStaleDns(DNS_OPTION_ENABLED)
+ .setStaleDnsOptions(staleOptions)
+ .build()
+
+ assertEquals(DNS_OPTION_ENABLED, options.staleDns)
+ assertEquals(staleOptions, options.staleDnsOptions)
}
@Test
fun testStaleDnsOptions_defaultValues() {
val options = DnsOptions.StaleDnsOptions.Builder().build()
- assertNull(options.allowCrossNetworkUsage)
- assertNull(options.freshLookupTimeoutMillis)
- assertNull(options.maxExpiredDelayMillis)
- assertNull(options.useStaleOnNameNotResolved)
+ assertEquals(DNS_OPTION_UNSPECIFIED, options.allowCrossNetworkUsage)
+ assertNull(options.freshLookupTimeout)
+ assertNull(options.maxExpiredDelay)
+ assertEquals(DNS_OPTION_UNSPECIFIED, options.useStaleOnNameNotResolved)
}
@Test
fun testStaleDnsOptions_allowCrossNetworkUsage_returnsSetValue() {
- val options = DnsOptions.StaleDnsOptions.Builder().setAllowCrossNetworkUsage(true).build()
+ val options = DnsOptions.StaleDnsOptions.Builder()
+ .setAllowCrossNetworkUsage(DNS_OPTION_ENABLED).build()
- assertNotNull(options.allowCrossNetworkUsage)
- assertTrue(options.allowCrossNetworkUsage!!)
+ assertEquals(DNS_OPTION_ENABLED, options.allowCrossNetworkUsage)
}
@Test
@@ -104,17 +129,17 @@
val duration = Duration.ofMillis(12345)
val options = DnsOptions.StaleDnsOptions.Builder().setFreshLookupTimeout(duration).build()
- assertNotNull(options.freshLookupTimeoutMillis)
- assertEquals(duration.toMillis(), options.freshLookupTimeoutMillis!!)
+ assertNotNull(options.freshLookupTimeout)
+ assertEquals(duration, options.freshLookupTimeout!!)
}
@Test
fun testStaleDnsOptions_useStaleOnNameNotResolved_returnsSetValue() {
- val options =
- DnsOptions.StaleDnsOptions.Builder().setUseStaleOnNameNotResolved(true).build()
+ val options = DnsOptions.StaleDnsOptions.Builder()
+ .setUseStaleOnNameNotResolved(DNS_OPTION_ENABLED)
+ .build()
- assertNotNull(options.useStaleOnNameNotResolved)
- assertTrue(options.useStaleOnNameNotResolved!!)
+ assertEquals(DNS_OPTION_ENABLED, options.useStaleOnNameNotResolved)
}
@Test
@@ -122,7 +147,7 @@
val duration = Duration.ofMillis(12345)
val options = DnsOptions.StaleDnsOptions.Builder().setMaxExpiredDelay(duration).build()
- assertNotNull(options.maxExpiredDelayMillis)
- assertEquals(duration.toMillis(), options.maxExpiredDelayMillis!!)
+ assertNotNull(options.maxExpiredDelay)
+ assertEquals(duration, options.maxExpiredDelay!!)
}
}
diff --git a/Cronet/tests/cts/src/android/net/http/cts/HttpEngineTest.java b/Cronet/tests/cts/src/android/net/http/cts/HttpEngineTest.java
index 34baedf..9fc4389 100644
--- a/Cronet/tests/cts/src/android/net/http/cts/HttpEngineTest.java
+++ b/Cronet/tests/cts/src/android/net/http/cts/HttpEngineTest.java
@@ -20,34 +20,53 @@
import static android.net.http.cts.util.TestUtilsKt.assumeOKStatusCode;
import static android.net.http.cts.util.TestUtilsKt.skipIfNoInternetConnection;
+import static com.google.common.truth.Truth.assertThat;
+
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.containsString;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import android.content.Context;
+import android.net.Network;
+import android.net.http.ConnectionMigrationOptions;
+import android.net.http.DnsOptions;
import android.net.http.HttpEngine;
+import android.net.http.QuicOptions;
import android.net.http.UrlRequest;
import android.net.http.UrlResponseInfo;
+import android.net.http.cts.util.HttpCtsTestServer;
import android.net.http.cts.util.TestUrlRequestCallback;
import android.net.http.cts.util.TestUrlRequestCallback.ResponseStep;
+import android.os.Build;
import androidx.test.core.app.ApplicationProvider;
-import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import com.android.testutils.DevSdkIgnoreRule;
+import com.android.testutils.DevSdkIgnoreRunner;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
+import org.mockito.Mockito;
-@RunWith(AndroidJUnit4.class)
+import java.time.Instant;
+import java.util.Arrays;
+import java.util.Calendar;
+import java.util.Set;
+
+@RunWith(DevSdkIgnoreRunner.class)
+@DevSdkIgnoreRule.IgnoreUpTo(Build.VERSION_CODES.R)
public class HttpEngineTest {
private static final String HOST = "source.android.com";
private static final String URL = "https://" + HOST;
private HttpEngine.Builder mEngineBuilder;
private TestUrlRequestCallback mCallback;
+ private HttpCtsTestServer mTestServer;
private UrlRequest mRequest;
private HttpEngine mEngine;
private Context mContext;
@@ -58,6 +77,7 @@
skipIfNoInternetConnection(mContext);
mEngineBuilder = new HttpEngine.Builder(mContext);
mCallback = new TestUrlRequestCallback();
+ mTestServer = new HttpCtsTestServer(mContext);
}
@After
@@ -69,6 +89,9 @@
if (mEngine != null) {
mEngine.shutdown();
}
+ if (mTestServer != null) {
+ mTestServer.shutdown();
+ }
}
private boolean isQuic(String negotiatedProtocol) {
@@ -93,31 +116,30 @@
@Test
public void testHttpEngine_EnableHttpCache() {
- // We need a server which sets cache-control != no-cache.
- String url = "https://www.example.com";
+ String url = mTestServer.getCacheableTestDownloadUrl(
+ /* downloadId */ "cacheable-download",
+ /* numBytes */ 10);
mEngine =
mEngineBuilder
.setStoragePath(mContext.getApplicationInfo().dataDir)
- .setEnableHttpCache(HttpEngine.Builder.HTTP_CACHE_DISK,
- /* maxSize */ 100 * 1024)
+ .setEnableHttpCache(
+ HttpEngine.Builder.HTTP_CACHE_DISK, /* maxSize */ 100 * 1024)
.build();
UrlRequest.Builder builder =
- mEngine.newUrlRequestBuilder(url, mCallback, mCallback.getExecutor());
+ mEngine.newUrlRequestBuilder(url, mCallback.getExecutor(), mCallback);
mRequest = builder.build();
mRequest.start();
- // This tests uses a non-hermetic server. Instead of asserting, assume the next callback.
- // This way, if the request were to fail, the test would just be skipped instead of failing.
- mCallback.assumeCallback(ResponseStep.ON_SUCCEEDED);
+ mCallback.expectCallback(ResponseStep.ON_SUCCEEDED);
UrlResponseInfo info = mCallback.mResponseInfo;
assumeOKStatusCode(info);
assertFalse(info.wasCached());
mCallback = new TestUrlRequestCallback();
- builder = mEngine.newUrlRequestBuilder(url, mCallback, mCallback.getExecutor());
+ builder = mEngine.newUrlRequestBuilder(url, mCallback.getExecutor(), mCallback);
mRequest = builder.build();
mRequest.start();
- mCallback.assumeCallback(ResponseStep.ON_SUCCEEDED);
+ mCallback.expectCallback(ResponseStep.ON_SUCCEEDED);
info = mCallback.mResponseInfo;
assertOKStatusCode(info);
assertTrue(info.wasCached());
@@ -141,11 +163,12 @@
@Test
public void testHttpEngine_EnablePublicKeyPinningBypassForLocalTrustAnchors() {
+ String url = mTestServer.getSuccessUrl();
// For known hosts, requests should succeed whether we're bypassing the local trust anchor
// or not.
mEngine = mEngineBuilder.setEnablePublicKeyPinningBypassForLocalTrustAnchors(false).build();
UrlRequest.Builder builder =
- mEngine.newUrlRequestBuilder(URL, mCallback, mCallback.getExecutor());
+ mEngine.newUrlRequestBuilder(url, mCallback.getExecutor(), mCallback);
mRequest = builder.build();
mRequest.start();
mCallback.expectCallback(ResponseStep.ON_SUCCEEDED);
@@ -153,7 +176,7 @@
mEngine.shutdown();
mEngine = mEngineBuilder.setEnablePublicKeyPinningBypassForLocalTrustAnchors(true).build();
mCallback = new TestUrlRequestCallback();
- builder = mEngine.newUrlRequestBuilder(URL, mCallback, mCallback.getExecutor());
+ builder = mEngine.newUrlRequestBuilder(url, mCallback.getExecutor(), mCallback);
mRequest = builder.build();
mRequest.start();
mCallback.expectCallback(ResponseStep.ON_SUCCEEDED);
@@ -169,35 +192,215 @@
// server.
}
+ private byte[] generateSha256() {
+ byte[] sha256 = new byte[32];
+ Arrays.fill(sha256, (byte) 58);
+ return sha256;
+ }
+
+ private Instant instantInFuture(int secondsIntoFuture) {
+ Calendar cal = Calendar.getInstance();
+ cal.add(Calendar.SECOND, secondsIntoFuture);
+ return cal.getTime().toInstant();
+ }
+
+ @Test
+ public void testHttpEngine_AddPublicKeyPins() {
+ // CtsTestServer, when set in SslMode.NO_CLIENT_AUTH (required to trigger
+ // certificate verification, needed by this test), uses a certificate that
+ // doesn't match the hostname. For this reason, CtsTestServer cannot be used
+ // by this test.
+ Instant expirationInstant = instantInFuture(/* secondsIntoFuture */ 100);
+ boolean includeSubdomains = true;
+ Set<byte[]> pinsSha256 = Set.of(generateSha256());
+ mEngine = mEngineBuilder.addPublicKeyPins(
+ HOST, pinsSha256, includeSubdomains, expirationInstant).build();
+
+ UrlRequest.Builder builder =
+ mEngine.newUrlRequestBuilder(URL, mCallback.getExecutor(), mCallback);
+ mRequest = builder.build();
+ mRequest.start();
+ mCallback.expectCallback(ResponseStep.ON_FAILED);
+ assertNotNull("Expected an error", mCallback.mError);
+ }
+
@Test
public void testHttpEngine_EnableQuic() throws Exception {
+ String url = mTestServer.getSuccessUrl();
mEngine = mEngineBuilder.setEnableQuic(true).addQuicHint(HOST, 443, 443).build();
- // The hint doesn't guarantee that QUIC will win the race, just that it will race TCP.
- // We send multiple requests to reduce the flakiness of the test.
- boolean quicWasUsed = false;
- for (int i = 0; i < 5; i++) {
- mCallback = new TestUrlRequestCallback();
- UrlRequest.Builder builder =
- mEngine.newUrlRequestBuilder(URL, mCallback.getExecutor(), mCallback);
- mRequest = builder.build();
- mRequest.start();
+ UrlRequest.Builder builder =
+ mEngine.newUrlRequestBuilder(url, mCallback.getExecutor(), mCallback);
+ mRequest = builder.build();
+ mRequest.start();
- // This tests uses a non-hermetic server. Instead of asserting, assume the next
- // callback. This way, if the request were to fail, the test would just be skipped
- // instead of failing.
- mCallback.assumeCallback(ResponseStep.ON_SUCCEEDED);
- UrlResponseInfo info = mCallback.mResponseInfo;
- assumeOKStatusCode(info);
- quicWasUsed = isQuic(info.getNegotiatedProtocol());
- if (quicWasUsed) {
- break;
- }
- }
- assertTrue(quicWasUsed);
+ mCallback.expectCallback(ResponseStep.ON_SUCCEEDED);
+ UrlResponseInfo info = mCallback.mResponseInfo;
+ assertOKStatusCode(info);
}
@Test
public void testHttpEngine_GetDefaultUserAgent() throws Exception {
assertThat(mEngineBuilder.getDefaultUserAgent(), containsString("AndroidHttpClient"));
+ assertThat(mEngineBuilder.getDefaultUserAgent()).contains(HttpEngine.getVersionString());
+ }
+
+ @Test
+ public void testHttpEngine_requestUsesDefaultUserAgent() throws Exception {
+ mEngine = mEngineBuilder.build();
+ HttpCtsTestServer server =
+ new HttpCtsTestServer(ApplicationProvider.getApplicationContext());
+
+ String url = server.getUserAgentUrl();
+ UrlRequest request =
+ mEngine.newUrlRequestBuilder(url, mCallback.getExecutor(), mCallback).build();
+ request.start();
+
+ mCallback.expectCallback(ResponseStep.ON_SUCCEEDED);
+ UrlResponseInfo info = mCallback.mResponseInfo;
+ assertOKStatusCode(info);
+ String receivedUserAgent = extractUserAgent(mCallback.mResponseAsString);
+
+ assertThat(receivedUserAgent).isEqualTo(mEngineBuilder.getDefaultUserAgent());
+ }
+
+ @Test
+ public void testHttpEngine_requestUsesCustomUserAgent() throws Exception {
+ String userAgent = "CtsTests User Agent";
+ HttpCtsTestServer server =
+ new HttpCtsTestServer(ApplicationProvider.getApplicationContext());
+ mEngine =
+ new HttpEngine.Builder(ApplicationProvider.getApplicationContext())
+ .setUserAgent(userAgent)
+ .build();
+
+ String url = server.getUserAgentUrl();
+ UrlRequest request =
+ mEngine.newUrlRequestBuilder(url, mCallback.getExecutor(), mCallback).build();
+ request.start();
+
+ mCallback.expectCallback(ResponseStep.ON_SUCCEEDED);
+ UrlResponseInfo info = mCallback.mResponseInfo;
+ assertOKStatusCode(info);
+ String receivedUserAgent = extractUserAgent(mCallback.mResponseAsString);
+
+ assertThat(receivedUserAgent).isEqualTo(userAgent);
+ }
+
+ private static String extractUserAgent(String userAgentResponseBody) {
+ // If someone wants to be evil and have the title HTML tag a part of the user agent,
+ // they'll have to fix this method :)
+ return userAgentResponseBody.replaceFirst(".*<title>", "").replaceFirst("</title>.*", "");
+ }
+
+ @Test
+ public void testHttpEngine_bindToNetwork() throws Exception {
+ // Create a fake Android.net.Network. Since that network doesn't exist, binding to
+ // that should end up in a failed request.
+ Network mockNetwork = Mockito.mock(Network.class);
+ Mockito.when(mockNetwork.getNetworkHandle()).thenReturn(123L);
+ String url = mTestServer.getSuccessUrl();
+
+ mEngine = mEngineBuilder.build();
+ mEngine.bindToNetwork(mockNetwork);
+ UrlRequest.Builder builder =
+ mEngine.newUrlRequestBuilder(url, mCallback.getExecutor(), mCallback);
+ mRequest = builder.build();
+ mRequest.start();
+
+ mCallback.expectCallback(ResponseStep.ON_FAILED);
+ }
+
+ @Test
+ public void testHttpEngine_unbindFromNetwork() throws Exception {
+ // Create a fake Android.net.Network. Since that network doesn't exist, binding to
+ // that should end up in a failed request.
+ Network mockNetwork = Mockito.mock(Network.class);
+ Mockito.when(mockNetwork.getNetworkHandle()).thenReturn(123L);
+ String url = mTestServer.getSuccessUrl();
+
+ mEngine = mEngineBuilder.build();
+ // Bind to the fake network but then unbind. This should result in a successful
+ // request.
+ mEngine.bindToNetwork(mockNetwork);
+ mEngine.bindToNetwork(null);
+ UrlRequest.Builder builder =
+ mEngine.newUrlRequestBuilder(url, mCallback.getExecutor(), mCallback);
+ mRequest = builder.build();
+ mRequest.start();
+
+ mCallback.expectCallback(ResponseStep.ON_SUCCEEDED);
+ UrlResponseInfo info = mCallback.mResponseInfo;
+ assertOKStatusCode(info);
+ }
+
+ @Test
+ public void testHttpEngine_setConnectionMigrationOptions_requestSucceeds() {
+ ConnectionMigrationOptions options = new ConnectionMigrationOptions.Builder().build();
+ mEngine = mEngineBuilder.setConnectionMigrationOptions(options).build();
+ UrlRequest.Builder builder =
+ mEngine.newUrlRequestBuilder(
+ mTestServer.getSuccessUrl(), mCallback.getExecutor(), mCallback);
+ mRequest = builder.build();
+ mRequest.start();
+
+ mCallback.expectCallback(ResponseStep.ON_SUCCEEDED);
+ UrlResponseInfo info = mCallback.mResponseInfo;
+ assertOKStatusCode(info);
+ }
+
+ @Test
+ public void testHttpEngine_setDnsOptions_requestSucceeds() {
+ DnsOptions options = new DnsOptions.Builder().build();
+ mEngine = mEngineBuilder.setDnsOptions(options).build();
+ UrlRequest.Builder builder =
+ mEngine.newUrlRequestBuilder(
+ mTestServer.getSuccessUrl(), mCallback.getExecutor(), mCallback);
+ mRequest = builder.build();
+ mRequest.start();
+
+ mCallback.expectCallback(ResponseStep.ON_SUCCEEDED);
+ UrlResponseInfo info = mCallback.mResponseInfo;
+ assertOKStatusCode(info);
+ }
+
+ @Test
+ public void getVersionString_notEmpty() {
+ assertThat(HttpEngine.getVersionString()).isNotEmpty();
+ }
+
+ @Test
+ public void testHttpEngine_SetQuicOptions_RequestSucceedsWithQuic() throws Exception {
+ String url = mTestServer.getSuccessUrl();
+ QuicOptions options = new QuicOptions.Builder().build();
+ mEngine = mEngineBuilder
+ .setEnableQuic(true)
+ .addQuicHint(HOST, 443, 443)
+ .setQuicOptions(options)
+ .build();
+ UrlRequest.Builder builder =
+ mEngine.newUrlRequestBuilder(url, mCallback.getExecutor(), mCallback);
+ mRequest = builder.build();
+ mRequest.start();
+
+ mCallback.expectCallback(ResponseStep.ON_SUCCEEDED);
+ UrlResponseInfo info = mCallback.mResponseInfo;
+ assertOKStatusCode(info);
+
+ }
+
+ @Test
+ public void testHttpEngine_enableBrotli_brotliAdvertised() {
+ mEngine = mEngineBuilder.setEnableBrotli(true).build();
+ mRequest =
+ mEngine.newUrlRequestBuilder(
+ mTestServer.getEchoHeadersUrl(), mCallback.getExecutor(), mCallback)
+ .build();
+ mRequest.start();
+
+ mCallback.assumeCallback(ResponseStep.ON_SUCCEEDED);
+ UrlResponseInfo info = mCallback.mResponseInfo;
+ assertThat(info.getHeaders().getAsMap().get("x-request-header-Accept-Encoding").toString())
+ .contains("br");
+ assertOKStatusCode(info);
}
}
diff --git a/Cronet/tests/cts/src/android/net/http/cts/NetworkExceptionTest.kt b/Cronet/tests/cts/src/android/net/http/cts/NetworkExceptionTest.kt
index dd07a41..cff54b3 100644
--- a/Cronet/tests/cts/src/android/net/http/cts/NetworkExceptionTest.kt
+++ b/Cronet/tests/cts/src/android/net/http/cts/NetworkExceptionTest.kt
@@ -19,8 +19,10 @@
import android.net.http.HttpEngine
import android.net.http.NetworkException
import android.net.http.cts.util.TestUrlRequestCallback
+import android.os.Build
import androidx.test.core.app.ApplicationProvider
-import androidx.test.ext.junit.runners.AndroidJUnit4
+import com.android.testutils.DevSdkIgnoreRule
+import com.android.testutils.DevSdkIgnoreRunner
import kotlin.test.assertEquals
import kotlin.test.assertIs
import kotlin.test.assertSame
@@ -28,7 +30,8 @@
import org.junit.Test
import org.junit.runner.RunWith
-@RunWith(AndroidJUnit4::class)
+@RunWith(DevSdkIgnoreRunner::class)
+@DevSdkIgnoreRule.IgnoreUpTo(Build.VERSION_CODES.R)
class NetworkExceptionTest {
@Test
@@ -50,7 +53,7 @@
val httpEngine = HttpEngine.Builder(ApplicationProvider.getApplicationContext()).build()
val callback = TestUrlRequestCallback()
val request =
- httpEngine.newUrlRequestBuilder("http://localhost", callback, callback.executor).build()
+ httpEngine.newUrlRequestBuilder("http://localhost", callback.executor, callback).build()
request.start()
callback.blockForDone()
diff --git a/Cronet/tests/cts/src/android/net/http/cts/QuicExceptionTest.kt b/Cronet/tests/cts/src/android/net/http/cts/QuicExceptionTest.kt
new file mode 100644
index 0000000..2705fc3
--- /dev/null
+++ b/Cronet/tests/cts/src/android/net/http/cts/QuicExceptionTest.kt
@@ -0,0 +1,46 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.net.http.cts
+
+import android.net.http.QuicException
+import android.os.Build
+import com.android.testutils.DevSdkIgnoreRule
+import com.android.testutils.DevSdkIgnoreRunner
+import kotlin.test.Test
+import kotlin.test.assertEquals
+import org.junit.runner.RunWith
+
+@RunWith(DevSdkIgnoreRunner::class)
+@DevSdkIgnoreRule.IgnoreUpTo(Build.VERSION_CODES.R)
+class QuicExceptionTest {
+
+ @Test
+ fun testQuicException_returnsInputParameters() {
+ val message = "failed"
+ val cause = Throwable("thrown")
+ val quicException =
+ object : QuicException(message, cause) {
+ override fun getErrorCode() = 0
+ override fun isImmediatelyRetryable() = false
+ }
+
+ assertEquals(message, quicException.message)
+ assertEquals(cause, quicException.cause)
+ }
+
+ // TODO: add test for QuicException triggered from HttpEngine
+}
diff --git a/Cronet/tests/cts/src/android/net/http/cts/QuicOptionsTest.kt b/Cronet/tests/cts/src/android/net/http/cts/QuicOptionsTest.kt
index 1888962..da0b15c 100644
--- a/Cronet/tests/cts/src/android/net/http/cts/QuicOptionsTest.kt
+++ b/Cronet/tests/cts/src/android/net/http/cts/QuicOptionsTest.kt
@@ -16,21 +16,30 @@
package android.net.http.cts
import android.net.http.QuicOptions
-import androidx.test.ext.junit.runners.AndroidJUnit4
+import android.os.Build
+import com.android.testutils.DevSdkIgnoreRule
+import com.android.testutils.DevSdkIgnoreRunner
import com.google.common.truth.Truth.assertThat
+import java.time.Duration
+import kotlin.test.assertFailsWith
+import kotlin.test.assertFalse
+import kotlin.test.assertTrue
import org.junit.Test
import org.junit.runner.RunWith
-@RunWith(AndroidJUnit4::class)
+@RunWith(DevSdkIgnoreRunner::class)
+@DevSdkIgnoreRule.IgnoreUpTo(Build.VERSION_CODES.R)
class QuicOptionsTest {
@Test
fun testQuicOptions_defaultValues() {
val quicOptions = QuicOptions.Builder().build()
- assertThat(quicOptions.quicHostAllowlist).isEmpty()
+ assertThat(quicOptions.allowedQuicHosts).isEmpty()
assertThat(quicOptions.handshakeUserAgent).isNull()
- // TODO(danstahr): idleConnectionTimeout getter should be public
- // assertThat(quicOptions.idleConnectionTimeout).isNull()
- assertThat(quicOptions.inMemoryServerConfigsCacheSize).isNull()
+ assertThat(quicOptions.idleConnectionTimeout).isNull()
+ assertFalse(quicOptions.hasInMemoryServerConfigsCacheSize())
+ assertFailsWith(IllegalStateException::class) {
+ quicOptions.inMemoryServerConfigsCacheSize
+ }
}
@Test
@@ -41,13 +50,11 @@
.addAllowedQuicHost("foo")
.addAllowedQuicHost("baz")
.build()
- assertThat(quicOptions.quicHostAllowlist)
+ assertThat(quicOptions.allowedQuicHosts)
.containsExactly("foo", "bar", "baz")
.inOrder()
}
- // TODO(danstahr): idleConnectionTimeout getter should be public
- /*
@Test
fun testQuicOptions_idleConnectionTimeout_returnsSetValue() {
val timeout = Duration.ofMinutes(10)
@@ -57,14 +64,24 @@
assertThat(quicOptions.idleConnectionTimeout)
.isEqualTo(timeout)
}
- */
@Test
fun testQuicOptions_inMemoryServerConfigsCacheSize_returnsSetValue() {
val quicOptions = QuicOptions.Builder()
.setInMemoryServerConfigsCacheSize(42)
.build()
+ assertTrue(quicOptions.hasInMemoryServerConfigsCacheSize())
assertThat(quicOptions.inMemoryServerConfigsCacheSize)
.isEqualTo(42)
}
+
+ @Test
+ fun testQuicOptions_handshakeUserAgent_returnsSetValue() {
+ val userAgent = "test"
+ val quicOptions = QuicOptions.Builder()
+ .setHandshakeUserAgent(userAgent)
+ .build()
+ assertThat(quicOptions.handshakeUserAgent)
+ .isEqualTo(userAgent)
+ }
}
diff --git a/Cronet/tests/cts/src/android/net/http/cts/UrlRequestTest.java b/Cronet/tests/cts/src/android/net/http/cts/UrlRequestTest.java
index 735bdc6..3c4d134 100644
--- a/Cronet/tests/cts/src/android/net/http/cts/UrlRequestTest.java
+++ b/Cronet/tests/cts/src/android/net/http/cts/UrlRequestTest.java
@@ -19,32 +19,65 @@
import static android.net.http.cts.util.TestUtilsKt.assertOKStatusCode;
import static android.net.http.cts.util.TestUtilsKt.skipIfNoInternetConnection;
+import static com.google.common.truth.Truth.assertThat;
+
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.greaterThan;
import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertSame;
+import static org.junit.Assert.assertTrue;
import android.content.Context;
+import android.net.http.HeaderBlock;
import android.net.http.HttpEngine;
+import android.net.http.HttpException;
+import android.net.http.InlineExecutionProhibitedException;
+import android.net.http.UploadDataProvider;
import android.net.http.UrlRequest;
import android.net.http.UrlRequest.Status;
import android.net.http.UrlResponseInfo;
import android.net.http.cts.util.HttpCtsTestServer;
import android.net.http.cts.util.TestStatusListener;
-import android.net.http.cts.util.TestUploadDataProvider;
import android.net.http.cts.util.TestUrlRequestCallback;
import android.net.http.cts.util.TestUrlRequestCallback.ResponseStep;
+import android.net.http.cts.util.UploadDataProviders;
+import android.os.Build;
+import android.webkit.cts.CtsTestServer;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
import androidx.test.core.app.ApplicationProvider;
-import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import com.android.testutils.DevSdkIgnoreRule;
+import com.android.testutils.DevSdkIgnoreRunner;
+
+import com.google.common.base.Strings;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
-@RunWith(AndroidJUnit4.class)
+import java.net.URLEncoder;
+import java.nio.ByteBuffer;
+import java.nio.charset.StandardCharsets;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ArrayBlockingQueue;
+import java.util.concurrent.BlockingQueue;
+import java.util.concurrent.Executor;
+import java.util.concurrent.Executors;
+import java.util.concurrent.TimeUnit;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+@RunWith(DevSdkIgnoreRunner.class)
+@DevSdkIgnoreRule.IgnoreUpTo(Build.VERSION_CODES.R)
public class UrlRequestTest {
+ private static final Executor DIRECT_EXECUTOR = Runnable::run;
+
private TestUrlRequestCallback mCallback;
private HttpCtsTestServer mTestServer;
private HttpEngine mHttpEngine;
@@ -109,14 +142,11 @@
}
@Test
- public void testUrlRequestPost_EchoRequestBody() throws Exception {
+ public void testUrlRequestPost_EchoRequestBody() {
String testData = "test";
UrlRequest.Builder builder = createUrlRequestBuilder(mTestServer.getEchoBodyUrl());
- TestUploadDataProvider dataProvider =
- new TestUploadDataProvider(
- TestUploadDataProvider.SuccessCallbackMode.SYNC, mCallback.getExecutor());
- dataProvider.addRead(testData.getBytes());
+ UploadDataProvider dataProvider = UploadDataProviders.create(testData);
builder.setUploadDataProvider(dataProvider, mCallback.getExecutor());
builder.addHeader("Content-Type", "text/html");
builder.build().start();
@@ -124,12 +154,373 @@
assertOKStatusCode(mCallback.mResponseInfo);
assertEquals(testData, mCallback.mResponseAsString);
- dataProvider.assertClosed();
}
@Test
- public void testUrlRequestFail_FailedCalled() throws Exception {
+ public void testUrlRequestFail_FailedCalled() {
createUrlRequestBuilder("http://0.0.0.0:0/").build().start();
mCallback.expectCallback(ResponseStep.ON_FAILED);
}
+
+ @Test
+ public void testUrlRequest_directExecutor_allowed() throws InterruptedException {
+ TestUrlRequestCallback callback = new TestUrlRequestCallback();
+ callback.setAllowDirectExecutor(true);
+ UrlRequest.Builder builder = mHttpEngine.newUrlRequestBuilder(
+ mTestServer.getEchoBodyUrl(), DIRECT_EXECUTOR, callback);
+ UploadDataProvider dataProvider = UploadDataProviders.create("test");
+ builder.setUploadDataProvider(dataProvider, DIRECT_EXECUTOR);
+ builder.addHeader("Content-Type", "text/plain;charset=UTF-8");
+ builder.setDirectExecutorAllowed(true);
+ builder.build().start();
+ callback.blockForDone();
+
+ if (callback.mOnErrorCalled) {
+ throw new AssertionError("Expected no exception", callback.mError);
+ }
+
+ assertEquals(200, callback.mResponseInfo.getHttpStatusCode());
+ assertEquals("test", callback.mResponseAsString);
+ }
+
+ @Test
+ public void testUrlRequest_directExecutor_disallowed_uploadDataProvider() throws Exception {
+ TestUrlRequestCallback callback = new TestUrlRequestCallback();
+ // This applies just locally to the test callback, not to SUT
+ callback.setAllowDirectExecutor(true);
+
+ UrlRequest.Builder builder = mHttpEngine.newUrlRequestBuilder(
+ mTestServer.getEchoBodyUrl(), Executors.newSingleThreadExecutor(), callback);
+ UploadDataProvider dataProvider = UploadDataProviders.create("test");
+
+ builder.setUploadDataProvider(dataProvider, DIRECT_EXECUTOR)
+ .addHeader("Content-Type", "text/plain;charset=UTF-8")
+ .build()
+ .start();
+ callback.blockForDone();
+
+ assertTrue(callback.mOnErrorCalled);
+ assertTrue(callback.mError.getCause() instanceof InlineExecutionProhibitedException);
+ }
+
+ @Test
+ public void testUrlRequest_directExecutor_disallowed_responseCallback() throws Exception {
+ TestUrlRequestCallback callback = new TestUrlRequestCallback();
+ // This applies just locally to the test callback, not to SUT
+ callback.setAllowDirectExecutor(true);
+
+ UrlRequest.Builder builder = mHttpEngine.newUrlRequestBuilder(
+ mTestServer.getEchoBodyUrl(), DIRECT_EXECUTOR, callback);
+ UploadDataProvider dataProvider = UploadDataProviders.create("test");
+
+ builder.setUploadDataProvider(dataProvider, Executors.newSingleThreadExecutor())
+ .addHeader("Content-Type", "text/plain;charset=UTF-8")
+ .build()
+ .start();
+ callback.blockForDone();
+
+ assertTrue(callback.mOnErrorCalled);
+ assertTrue(callback.mError.getCause() instanceof InlineExecutionProhibitedException);
+ }
+
+ @Test
+ public void testUrlRequest_nonDirectByteBuffer() throws Exception {
+ BlockingQueue<HttpException> onFailedException = new ArrayBlockingQueue<>(1);
+
+ UrlRequest request =
+ mHttpEngine
+ .newUrlRequestBuilder(
+ mTestServer.getSuccessUrl(),
+ Executors.newSingleThreadExecutor(),
+ new StubUrlRequestCallback() {
+ @Override
+ public void onResponseStarted(
+ UrlRequest request, UrlResponseInfo info) {
+ // note: allocate, not allocateDirect
+ request.read(ByteBuffer.allocate(1024));
+ }
+
+ @Override
+ public void onFailed(
+ UrlRequest request,
+ UrlResponseInfo info,
+ HttpException error) {
+ onFailedException.add(error);
+ }
+ })
+ .build();
+ request.start();
+
+ HttpException e = onFailedException.poll(5, TimeUnit.SECONDS);
+ assertNotNull(e);
+ assertTrue(e.getCause() instanceof IllegalArgumentException);
+ assertTrue(e.getCause().getMessage().contains("direct"));
+ }
+
+ @Test
+ public void testUrlRequest_fullByteBuffer() throws Exception {
+ BlockingQueue<HttpException> onFailedException = new ArrayBlockingQueue<>(1);
+
+ UrlRequest request =
+ mHttpEngine
+ .newUrlRequestBuilder(
+ mTestServer.getSuccessUrl(),
+ Executors.newSingleThreadExecutor(),
+ new StubUrlRequestCallback() {
+ @Override
+ public void onResponseStarted(
+ UrlRequest request, UrlResponseInfo info) {
+ ByteBuffer bb = ByteBuffer.allocateDirect(1024);
+ bb.position(bb.limit());
+ request.read(bb);
+ }
+
+ @Override
+ public void onFailed(
+ UrlRequest request,
+ UrlResponseInfo info,
+ HttpException error) {
+ onFailedException.add(error);
+ }
+ })
+ .build();
+ request.start();
+
+ HttpException e = onFailedException.poll(5, TimeUnit.SECONDS);
+ assertNotNull(e);
+ assertTrue(e.getCause() instanceof IllegalArgumentException);
+ assertTrue(e.getCause().getMessage().contains("full"));
+ }
+
+ @Test
+ public void testUrlRequest_redirects() throws Exception {
+ int expectedNumRedirects = 5;
+ String url =
+ mTestServer.getRedirectingAssetUrl("html/hello_world.html", expectedNumRedirects);
+
+ UrlRequest request = createUrlRequestBuilder(url).build();
+ request.start();
+
+ mCallback.expectCallback(ResponseStep.ON_SUCCEEDED);
+ UrlResponseInfo info = mCallback.mResponseInfo;
+ assertOKStatusCode(info);
+ assertThat(mCallback.mResponseAsString).contains("hello world");
+ assertThat(info.getUrlChain()).hasSize(expectedNumRedirects + 1);
+ assertThat(info.getUrlChain().get(0)).isEqualTo(url);
+ assertThat(info.getUrlChain().get(expectedNumRedirects)).isEqualTo(info.getUrl());
+ }
+
+ @Test
+ public void testUrlRequestPost_withRedirect() throws Exception {
+ String body = Strings.repeat(
+ "Hello, this is a really interesting body, so write this 100 times.", 100);
+
+ String redirectUrlParameter =
+ URLEncoder.encode(mTestServer.getEchoBodyUrl(), "UTF-8");
+ createUrlRequestBuilder(
+ String.format(
+ "%s/alt_redirect?dest=%s&statusCode=307",
+ mTestServer.getBaseUri(),
+ redirectUrlParameter))
+ .setHttpMethod("POST")
+ .addHeader("Content-Type", "text/plain")
+ .setUploadDataProvider(
+ UploadDataProviders.create(body.getBytes(StandardCharsets.UTF_8)),
+ mCallback.getExecutor())
+ .build()
+ .start();
+ mCallback.expectCallback(ResponseStep.ON_SUCCEEDED);
+
+ assertOKStatusCode(mCallback.mResponseInfo);
+ assertThat(mCallback.mResponseAsString).isEqualTo(body);
+ }
+
+ @Test
+ public void testUrlRequest_customHeaders() throws Exception {
+ UrlRequest.Builder builder = createUrlRequestBuilder(mTestServer.getEchoHeadersUrl());
+
+ List<Map.Entry<String, String>> expectedHeaders = Arrays.asList(
+ Map.entry("Authorization", "Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ=="),
+ Map.entry("Max-Forwards", "10"),
+ Map.entry("X-Client-Data", "random custom header content"));
+
+ for (Map.Entry<String, String> header : expectedHeaders) {
+ builder.addHeader(header.getKey(), header.getValue());
+ }
+
+ builder.build().start();
+ mCallback.expectCallback(ResponseStep.ON_SUCCEEDED);
+
+ assertOKStatusCode(mCallback.mResponseInfo);
+
+ List<Map.Entry<String, String>> echoedHeaders =
+ extractEchoedHeaders(mCallback.mResponseInfo.getHeaders());
+
+ // The implementation might decide to add more headers like accepted encodings it handles
+ // internally so the server is likely to see more headers than explicitly set
+ // by the developer.
+ assertThat(echoedHeaders)
+ .containsAtLeastElementsIn(expectedHeaders);
+ }
+
+ @Test
+ public void testUrlRequest_getHttpMethod() throws Exception {
+ UrlRequest.Builder builder = createUrlRequestBuilder(mTestServer.getSuccessUrl());
+ final String method = "POST";
+
+ builder.setHttpMethod(method);
+ UrlRequest request = builder.build();
+ assertThat(request.getHttpMethod()).isEqualTo(method);
+ }
+
+ @Test
+ public void testUrlRequest_getHeaders_asList() throws Exception {
+ UrlRequest.Builder builder = createUrlRequestBuilder(mTestServer.getSuccessUrl());
+ final List<Map.Entry<String, String>> expectedHeaders = Arrays.asList(
+ Map.entry("Authorization", "Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ=="),
+ Map.entry("Max-Forwards", "10"),
+ Map.entry("X-Client-Data", "random custom header content"));
+
+ for (Map.Entry<String, String> header : expectedHeaders) {
+ builder.addHeader(header.getKey(), header.getValue());
+ }
+
+ UrlRequest request = builder.build();
+ assertThat(request.getHeaders().getAsList()).containsAtLeastElementsIn(expectedHeaders);
+ }
+
+ @Test
+ public void testUrlRequest_getHeaders_asMap() throws Exception {
+ UrlRequest.Builder builder = createUrlRequestBuilder(mTestServer.getSuccessUrl());
+ final Map<String, List<String>> expectedHeaders = Map.of(
+ "Authorization", Arrays.asList("Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ=="),
+ "Max-Forwards", Arrays.asList("10"),
+ "X-Client-Data", Arrays.asList("random custom header content"));
+
+ for (Map.Entry<String, List<String>> header : expectedHeaders.entrySet()) {
+ builder.addHeader(header.getKey(), header.getValue().get(0));
+ }
+
+ UrlRequest request = builder.build();
+ assertThat(request.getHeaders().getAsMap()).containsAtLeastEntriesIn(expectedHeaders);
+ }
+
+ @Test
+ public void testUrlRequest_isCacheDisabled() throws Exception {
+ UrlRequest.Builder builder = createUrlRequestBuilder(mTestServer.getSuccessUrl());
+ final boolean isCacheDisabled = true;
+
+ builder.setCacheDisabled(isCacheDisabled);
+ UrlRequest request = builder.build();
+ assertThat(request.isCacheDisabled()).isEqualTo(isCacheDisabled);
+ }
+
+ @Test
+ public void testUrlRequest_isDirectExecutorAllowed() throws Exception {
+ UrlRequest.Builder builder = createUrlRequestBuilder(mTestServer.getSuccessUrl());
+ final boolean isDirectExecutorAllowed = true;
+
+ builder.setDirectExecutorAllowed(isDirectExecutorAllowed);
+ UrlRequest request = builder.build();
+ assertThat(request.isDirectExecutorAllowed()).isEqualTo(isDirectExecutorAllowed);
+ }
+
+ @Test
+ public void testUrlRequest_getPriority() throws Exception {
+ UrlRequest.Builder builder = createUrlRequestBuilder(mTestServer.getSuccessUrl());
+ final int priority = UrlRequest.REQUEST_PRIORITY_LOW;
+
+ builder.setPriority(priority);
+ UrlRequest request = builder.build();
+ assertThat(request.getPriority()).isEqualTo(priority);
+ }
+
+ @Test
+ public void testUrlRequest_hasTrafficStatsTag() throws Exception {
+ UrlRequest.Builder builder = createUrlRequestBuilder(mTestServer.getSuccessUrl());
+
+ builder.setTrafficStatsTag(10);
+ UrlRequest request = builder.build();
+ assertThat(request.hasTrafficStatsTag()).isEqualTo(true);
+ }
+
+ @Test
+ public void testUrlRequest_getTrafficStatsTag() throws Exception {
+ UrlRequest.Builder builder = createUrlRequestBuilder(mTestServer.getSuccessUrl());
+ final int trafficStatsTag = 10;
+
+ builder.setTrafficStatsTag(trafficStatsTag);
+ UrlRequest request = builder.build();
+ assertThat(request.getTrafficStatsTag()).isEqualTo(trafficStatsTag);
+ }
+
+ @Test
+ public void testUrlRequest_hasTrafficStatsUid() throws Exception {
+ UrlRequest.Builder builder = createUrlRequestBuilder(mTestServer.getSuccessUrl());
+
+ builder.setTrafficStatsUid(10);
+ UrlRequest request = builder.build();
+ assertThat(request.hasTrafficStatsUid()).isEqualTo(true);
+ }
+
+ @Test
+ public void testUrlRequest_getTrafficStatsUid() throws Exception {
+ UrlRequest.Builder builder = createUrlRequestBuilder(mTestServer.getSuccessUrl());
+ final int trafficStatsUid = 10;
+
+ builder.setTrafficStatsUid(trafficStatsUid);
+ UrlRequest request = builder.build();
+ assertThat(request.getTrafficStatsUid()).isEqualTo(trafficStatsUid);
+ }
+
+ private static List<Map.Entry<String, String>> extractEchoedHeaders(HeaderBlock headers) {
+ return headers.getAsList()
+ .stream()
+ .flatMap(input -> {
+ if (input.getKey().startsWith(CtsTestServer.ECHOED_RESPONSE_HEADER_PREFIX)) {
+ String strippedKey =
+ input.getKey().substring(
+ CtsTestServer.ECHOED_RESPONSE_HEADER_PREFIX.length());
+ return Stream.of(Map.entry(strippedKey, input.getValue()));
+ } else {
+ return Stream.empty();
+ }
+ })
+ .collect(Collectors.toList());
+ }
+
+ private static class StubUrlRequestCallback implements UrlRequest.Callback {
+
+ @Override
+ public void onRedirectReceived(
+ UrlRequest request, UrlResponseInfo info, String newLocationUrl) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public void onResponseStarted(UrlRequest request, UrlResponseInfo info) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public void onReadCompleted(
+ UrlRequest request, UrlResponseInfo info, ByteBuffer byteBuffer) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public void onSucceeded(UrlRequest request, UrlResponseInfo info) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public void onFailed(UrlRequest request, UrlResponseInfo info, HttpException error) {
+ throw new UnsupportedOperationException(error);
+ }
+
+ @Override
+ public void onCanceled(@NonNull UrlRequest request, @Nullable UrlResponseInfo info) {
+ throw new UnsupportedOperationException();
+ }
+ }
}
diff --git a/Cronet/tests/cts/src/android/net/http/cts/UrlResponseInfoTest.kt b/Cronet/tests/cts/src/android/net/http/cts/UrlResponseInfoTest.kt
new file mode 100644
index 0000000..f1b57c6
--- /dev/null
+++ b/Cronet/tests/cts/src/android/net/http/cts/UrlResponseInfoTest.kt
@@ -0,0 +1,70 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.net.http.cts
+
+import android.content.Context
+import android.net.http.HttpEngine
+import android.net.http.cts.util.HttpCtsTestServer
+import android.net.http.cts.util.TestUrlRequestCallback
+import android.net.http.cts.util.TestUrlRequestCallback.ResponseStep
+import android.os.Build
+import androidx.test.core.app.ApplicationProvider
+import com.android.testutils.DevSdkIgnoreRule
+import com.android.testutils.DevSdkIgnoreRunner
+import kotlin.test.Test
+import kotlin.test.assertEquals
+import kotlin.test.assertFalse
+import kotlin.test.assertTrue
+import org.junit.runner.RunWith
+
+@RunWith(DevSdkIgnoreRunner::class)
+@DevSdkIgnoreRule.IgnoreUpTo(Build.VERSION_CODES.R)
+class UrlResponseInfoTest {
+
+ @Test
+ fun testUrlResponseInfo_apisReturnCorrectInfo() {
+ // start the engine and send a request
+ val context: Context = ApplicationProvider.getApplicationContext()
+ val server = HttpCtsTestServer(context)
+ val httpEngine = HttpEngine.Builder(context).build()
+ val callback = TestUrlRequestCallback()
+ val url = server.successUrl
+ val request = httpEngine.newUrlRequestBuilder(url, callback.executor, callback).build()
+
+ request.start()
+ callback.expectCallback(ResponseStep.ON_SUCCEEDED)
+
+ val info = callback.mResponseInfo
+ assertFalse(info.headers.asList.isEmpty())
+ assertEquals(200, info.httpStatusCode)
+ assertTrue(info.receivedByteCount > 0)
+ assertEquals(url, info.url)
+ assertEquals(listOf(url), info.urlChain)
+ assertFalse(info.wasCached())
+
+ // TODO Current test server does not set these values. Uncomment when we use one that does.
+ // assertEquals("OK", info.httpStatusText)
+ // assertEquals("http/1.1", info.negotiatedProtocol)
+
+ // cronet defaults to port 0 when no proxy is specified.
+ // This is not a behaviour we want to enforce since null is reasonable too.
+ // assertEquals(":0", info.proxyServer)
+
+ server.shutdown()
+ httpEngine.shutdown()
+ }
+}
diff --git a/Cronet/tests/cts/src/android/net/http/cts/util/TestBidirectionalStreamCallback.java b/Cronet/tests/cts/src/android/net/http/cts/util/TestBidirectionalStreamCallback.java
index e82b24d..1e7333c 100644
--- a/Cronet/tests/cts/src/android/net/http/cts/util/TestBidirectionalStreamCallback.java
+++ b/Cronet/tests/cts/src/android/net/http/cts/util/TestBidirectionalStreamCallback.java
@@ -26,6 +26,7 @@
import static org.junit.Assume.assumeTrue;
import android.net.http.BidirectionalStream;
+import android.net.http.HeaderBlock;
import android.net.http.HttpException;
import android.net.http.UrlResponseInfo;
import android.os.ConditionVariable;
@@ -43,7 +44,7 @@
* the stream completes on another thread. Allows to cancel, block stream or throw an exception from
* an arbitrary step.
*/
-public class TestBidirectionalStreamCallback extends BidirectionalStream.Callback {
+public class TestBidirectionalStreamCallback implements BidirectionalStream.Callback {
private static final int TIMEOUT_MS = 12_000;
public UrlResponseInfo mResponseInfo;
public HttpException mError;
@@ -56,7 +57,7 @@
public int mHttpResponseDataLength;
public String mResponseAsString = "";
- public UrlResponseInfo.HeaderBlock mTrailers;
+ public HeaderBlock mTrailers;
private static final int READ_BUFFER_SIZE = 32 * 1024;
@@ -337,7 +338,7 @@
public void onResponseTrailersReceived(
BidirectionalStream stream,
UrlResponseInfo info,
- UrlResponseInfo.HeaderBlock trailers) {
+ HeaderBlock trailers) {
checkOnValidThread();
assertFalse(stream.isDone());
assertNull(mError);
diff --git a/Cronet/tests/cts/src/android/net/http/cts/util/TestUploadDataProvider.java b/Cronet/tests/cts/src/android/net/http/cts/util/TestUploadDataProvider.java
deleted file mode 100644
index d047828..0000000
--- a/Cronet/tests/cts/src/android/net/http/cts/util/TestUploadDataProvider.java
+++ /dev/null
@@ -1,294 +0,0 @@
-/*
- * Copyright (C) 2022 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.http.cts.util;
-
-import android.net.http.UploadDataProvider;
-import android.net.http.UploadDataSink;
-import android.os.ConditionVariable;
-
-import java.io.IOException;
-import java.nio.ByteBuffer;
-import java.nio.channels.ClosedChannelException;
-import java.util.ArrayList;
-import java.util.concurrent.Executor;
-import java.util.concurrent.atomic.AtomicBoolean;
-
-/** An UploadDataProvider implementation used in tests. */
-public class TestUploadDataProvider extends UploadDataProvider {
- // Indicates whether all success callbacks are synchronous or asynchronous.
- // Doesn't apply to errors.
- public enum SuccessCallbackMode {
- SYNC,
- ASYNC
- }
-
- // Indicates whether failures should throw exceptions, invoke callbacks
- // synchronously, or invoke callback asynchronously.
- public enum FailMode {
- NONE,
- THROWN,
- CALLBACK_SYNC,
- CALLBACK_ASYNC
- }
-
- private final ArrayList<byte[]> mReads = new ArrayList<byte[]>();
- private final SuccessCallbackMode mSuccessCallbackMode;
- private final Executor mExecutor;
-
- private boolean mChunked;
-
- // Index of read to fail on.
- private int mReadFailIndex = -1;
- // Indicates how to fail on a read.
- private FailMode mReadFailMode = FailMode.NONE;
-
- private FailMode mRewindFailMode = FailMode.NONE;
-
- private FailMode mLengthFailMode = FailMode.NONE;
-
- private int mNumReadCalls;
- private int mNumRewindCalls;
-
- private int mNextRead;
- private boolean mStarted;
- private boolean mReadPending;
- private boolean mRewindPending;
- // Used to ensure there are no read/rewind requests after a failure.
- private boolean mFailed;
-
- private final AtomicBoolean mClosed = new AtomicBoolean(false);
- private final ConditionVariable mAwaitingClose = new ConditionVariable(false);
-
- public TestUploadDataProvider(
- SuccessCallbackMode successCallbackMode, final Executor executor) {
- mSuccessCallbackMode = successCallbackMode;
- mExecutor = executor;
- }
-
- // Adds the result to be returned by a successful read request. The
- // returned bytes must all fit within the read buffer provided by Cronet.
- // After a rewind, if there is one, all reads will be repeated.
- public void addRead(byte[] read) {
- if (mStarted) {
- throw new IllegalStateException("Adding bytes after read");
- }
- mReads.add(read);
- }
-
- public void setReadFailure(int readFailIndex, FailMode readFailMode) {
- mReadFailIndex = readFailIndex;
- mReadFailMode = readFailMode;
- }
-
- public void setLengthFailure() {
- mLengthFailMode = FailMode.THROWN;
- }
-
- public void setRewindFailure(FailMode rewindFailMode) {
- mRewindFailMode = rewindFailMode;
- }
-
- public void setChunked(boolean chunked) {
- mChunked = chunked;
- }
-
- public int getNumReadCalls() {
- return mNumReadCalls;
- }
-
- public int getNumRewindCalls() {
- return mNumRewindCalls;
- }
-
- /** Returns the cumulative length of all data added by calls to addRead. */
- @Override
- public long getLength() throws IOException {
- if (mClosed.get()) {
- throw new ClosedChannelException();
- }
- if (mLengthFailMode == FailMode.THROWN) {
- throw new IllegalStateException("Sync length failure");
- }
- return getUploadedLength();
- }
-
- public long getUploadedLength() {
- if (mChunked) {
- return -1;
- }
- long length = 0;
- for (byte[] read : mReads) {
- length += read.length;
- }
- return length;
- }
-
- @Override
- public void read(final UploadDataSink uploadDataSink, final ByteBuffer byteBuffer)
- throws IOException {
- int currentReadCall = mNumReadCalls;
- ++mNumReadCalls;
- if (mClosed.get()) {
- throw new ClosedChannelException();
- }
- assertIdle();
-
- if (maybeFailRead(currentReadCall, uploadDataSink)) {
- mFailed = true;
- return;
- }
-
- mReadPending = true;
- mStarted = true;
-
- final boolean finalChunk = (mChunked && mNextRead == mReads.size() - 1);
- if (mNextRead < mReads.size()) {
- if ((byteBuffer.limit() - byteBuffer.position()) < mReads.get(mNextRead).length) {
- throw new IllegalStateException("Read buffer smaller than expected.");
- }
- byteBuffer.put(mReads.get(mNextRead));
- ++mNextRead;
- } else {
- throw new IllegalStateException("Too many reads: " + mNextRead);
- }
-
- Runnable completeRunnable =
- new Runnable() {
- @Override
- public void run() {
- mReadPending = false;
- uploadDataSink.onReadSucceeded(finalChunk);
- }
- };
- if (mSuccessCallbackMode == SuccessCallbackMode.SYNC) {
- completeRunnable.run();
- } else {
- mExecutor.execute(completeRunnable);
- }
- }
-
- @Override
- public void rewind(final UploadDataSink uploadDataSink) throws IOException {
- ++mNumRewindCalls;
- if (mClosed.get()) {
- throw new ClosedChannelException();
- }
- assertIdle();
-
- if (maybeFailRewind(uploadDataSink)) {
- mFailed = true;
- return;
- }
-
- if (mNextRead == 0) {
- // Should never try and rewind when rewinding does nothing.
- throw new IllegalStateException("Unexpected rewind when already at beginning");
- }
-
- mRewindPending = true;
- mNextRead = 0;
-
- Runnable completeRunnable =
- new Runnable() {
- @Override
- public void run() {
- mRewindPending = false;
- uploadDataSink.onRewindSucceeded();
- }
- };
- if (mSuccessCallbackMode == SuccessCallbackMode.SYNC) {
- completeRunnable.run();
- } else {
- mExecutor.execute(completeRunnable);
- }
- }
-
- private void assertIdle() {
- if (mReadPending) {
- throw new IllegalStateException("Unexpected operation during read");
- }
- if (mRewindPending) {
- throw new IllegalStateException("Unexpected operation during rewind");
- }
- if (mFailed) {
- throw new IllegalStateException("Unexpected operation after failure");
- }
- }
-
- private boolean maybeFailRead(int readIndex, final UploadDataSink uploadDataSink) {
- if (readIndex != mReadFailIndex) return false;
-
- switch (mReadFailMode) {
- case THROWN:
- throw new IllegalStateException("Thrown read failure");
- case CALLBACK_SYNC:
- uploadDataSink.onReadError(new IllegalStateException("Sync read failure"));
- return true;
- case CALLBACK_ASYNC:
- Runnable errorRunnable =
- new Runnable() {
- @Override
- public void run() {
- uploadDataSink.onReadError(
- new IllegalStateException("Async read failure"));
- }
- };
- mExecutor.execute(errorRunnable);
- return true;
- default:
- return false;
- }
- }
-
- private boolean maybeFailRewind(final UploadDataSink uploadDataSink) {
- switch (mRewindFailMode) {
- case THROWN:
- throw new IllegalStateException("Thrown rewind failure");
- case CALLBACK_SYNC:
- uploadDataSink.onRewindError(new IllegalStateException("Sync rewind failure"));
- return true;
- case CALLBACK_ASYNC:
- Runnable errorRunnable =
- new Runnable() {
- @Override
- public void run() {
- uploadDataSink.onRewindError(
- new IllegalStateException("Async rewind failure"));
- }
- };
- mExecutor.execute(errorRunnable);
- return true;
- default:
- return false;
- }
- }
-
- @Override
- public void close() throws IOException {
- if (!mClosed.compareAndSet(false, true)) {
- throw new AssertionError("Closed twice");
- }
- mAwaitingClose.open();
- }
-
- public void assertClosed() {
- mAwaitingClose.block(5000);
- if (!mClosed.get()) {
- throw new AssertionError("Was not closed");
- }
- }
-}
diff --git a/Cronet/tests/cts/src/android/net/http/cts/util/TestUrlRequestCallback.java b/Cronet/tests/cts/src/android/net/http/cts/util/TestUrlRequestCallback.java
index efbcff6..28443b7 100644
--- a/Cronet/tests/cts/src/android/net/http/cts/util/TestUrlRequestCallback.java
+++ b/Cronet/tests/cts/src/android/net/http/cts/util/TestUrlRequestCallback.java
@@ -50,7 +50,7 @@
* method to block thread until the request completes on another thread.
* Allows us to cancel, block request or throw an exception from an arbitrary step.
*/
-public class TestUrlRequestCallback extends UrlRequest.Callback {
+public class TestUrlRequestCallback implements UrlRequest.Callback {
private static final int TIMEOUT_MS = 12_000;
public ArrayList<UrlResponseInfo> mRedirectResponseInfoList = new ArrayList<>();
public ArrayList<String> mRedirectUrlList = new ArrayList<>();
diff --git a/Cronet/tests/cts/src/android/net/http/cts/util/UploadDataProviders.java b/Cronet/tests/cts/src/android/net/http/cts/util/UploadDataProviders.java
new file mode 100644
index 0000000..3b90fa0
--- /dev/null
+++ b/Cronet/tests/cts/src/android/net/http/cts/util/UploadDataProviders.java
@@ -0,0 +1,209 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.net.http.cts.util;
+
+import android.net.http.UploadDataProvider;
+import android.net.http.UploadDataSink;
+import android.os.ParcelFileDescriptor;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.nio.channels.FileChannel;
+import java.nio.charset.StandardCharsets;
+
+/**
+ * Provides implementations of {@link UploadDataProvider} for common use cases. Corresponds to
+ * {@code android.net.http.apihelpers.UploadDataProviders} which is not an exposed API.
+ */
+public final class UploadDataProviders {
+ /**
+ * Uploads an entire file.
+ *
+ * @param file The file to upload
+ * @return A new UploadDataProvider for the given file
+ */
+ public static UploadDataProvider create(final File file) {
+ return new FileUploadProvider(() -> new FileInputStream(file).getChannel());
+ }
+
+ /**
+ * Uploads an entire file, closing the descriptor when it is no longer needed.
+ *
+ * @param fd The file descriptor to upload
+ * @throws IllegalArgumentException if {@code fd} is not a file.
+ * @return A new UploadDataProvider for the given file descriptor
+ */
+ public static UploadDataProvider create(final ParcelFileDescriptor fd) {
+ return new FileUploadProvider(() -> {
+ if (fd.getStatSize() != -1) {
+ return new ParcelFileDescriptor.AutoCloseInputStream(fd).getChannel();
+ } else {
+ fd.close();
+ throw new IllegalArgumentException("Not a file: " + fd);
+ }
+ });
+ }
+
+ /**
+ * Uploads a ByteBuffer, from the current {@code buffer.position()} to {@code buffer.limit()}
+ *
+ * @param buffer The data to upload
+ * @return A new UploadDataProvider for the given buffer
+ */
+ public static UploadDataProvider create(ByteBuffer buffer) {
+ return new ByteBufferUploadProvider(buffer.slice());
+ }
+
+ /**
+ * Uploads {@code length} bytes from {@code data}, starting from {@code offset}
+ *
+ * @param data Array containing data to upload
+ * @param offset Offset within data to start with
+ * @param length Number of bytes to upload
+ * @return A new UploadDataProvider for the given data
+ */
+ public static UploadDataProvider create(byte[] data, int offset, int length) {
+ return new ByteBufferUploadProvider(ByteBuffer.wrap(data, offset, length).slice());
+ }
+
+ /**
+ * Uploads the contents of {@code data}
+ *
+ * @param data Array containing data to upload
+ * @return A new UploadDataProvider for the given data
+ */
+ public static UploadDataProvider create(byte[] data) {
+ return create(data, 0, data.length);
+ }
+
+ /**
+ * Uploads the UTF-8 representation of {@code data}
+ *
+ * @param data String containing data to upload
+ * @return A new UploadDataProvider for the given data
+ */
+ public static UploadDataProvider create(String data) {
+ return create(data.getBytes(StandardCharsets.UTF_8));
+ }
+
+ private interface FileChannelProvider {
+ FileChannel getChannel() throws IOException;
+ }
+
+ private static final class FileUploadProvider extends UploadDataProvider {
+ private volatile FileChannel mChannel;
+ private final FileChannelProvider mProvider;
+ /** Guards initialization of {@code mChannel} */
+ private final Object mLock = new Object();
+
+ private FileUploadProvider(FileChannelProvider provider) {
+ this.mProvider = provider;
+ }
+
+ @Override
+ public long getLength() throws IOException {
+ return getChannel().size();
+ }
+
+ @Override
+ public void read(UploadDataSink uploadDataSink, ByteBuffer byteBuffer) throws IOException {
+ if (!byteBuffer.hasRemaining()) {
+ throw new IllegalStateException("Cronet passed a buffer with no bytes remaining");
+ }
+ FileChannel channel = getChannel();
+ int bytesRead = 0;
+ while (bytesRead == 0) {
+ int read = channel.read(byteBuffer);
+ if (read == -1) {
+ break;
+ } else {
+ bytesRead += read;
+ }
+ }
+ uploadDataSink.onReadSucceeded(false);
+ }
+
+ @Override
+ public void rewind(UploadDataSink uploadDataSink) throws IOException {
+ getChannel().position(0);
+ uploadDataSink.onRewindSucceeded();
+ }
+
+ /**
+ * Lazily initializes the channel so that a blocking operation isn't performed
+ * on a non-executor thread.
+ */
+ private FileChannel getChannel() throws IOException {
+ if (mChannel == null) {
+ synchronized (mLock) {
+ if (mChannel == null) {
+ mChannel = mProvider.getChannel();
+ }
+ }
+ }
+ return mChannel;
+ }
+
+ @Override
+ public void close() throws IOException {
+ FileChannel channel = mChannel;
+ if (channel != null) {
+ channel.close();
+ }
+ }
+ }
+
+ private static final class ByteBufferUploadProvider extends UploadDataProvider {
+ private final ByteBuffer mUploadBuffer;
+
+ private ByteBufferUploadProvider(ByteBuffer uploadBuffer) {
+ this.mUploadBuffer = uploadBuffer;
+ }
+
+ @Override
+ public long getLength() {
+ return mUploadBuffer.limit();
+ }
+
+ @Override
+ public void read(UploadDataSink uploadDataSink, ByteBuffer byteBuffer) {
+ if (!byteBuffer.hasRemaining()) {
+ throw new IllegalStateException("Cronet passed a buffer with no bytes remaining");
+ }
+ if (byteBuffer.remaining() >= mUploadBuffer.remaining()) {
+ byteBuffer.put(mUploadBuffer);
+ } else {
+ int oldLimit = mUploadBuffer.limit();
+ mUploadBuffer.limit(mUploadBuffer.position() + byteBuffer.remaining());
+ byteBuffer.put(mUploadBuffer);
+ mUploadBuffer.limit(oldLimit);
+ }
+ uploadDataSink.onReadSucceeded(false);
+ }
+
+ @Override
+ public void rewind(UploadDataSink uploadDataSink) {
+ mUploadBuffer.position(0);
+ uploadDataSink.onRewindSucceeded();
+ }
+ }
+
+ // Prevent instantiation
+ private UploadDataProviders() {}
+}
diff --git a/Cronet/tests/mts/Android.bp b/Cronet/tests/mts/Android.bp
index 03d163c..4e4251c 100644
--- a/Cronet/tests/mts/Android.bp
+++ b/Cronet/tests/mts/Android.bp
@@ -17,32 +17,42 @@
default_applicable_licenses: ["Android-Apache-2.0"],
}
+java_genrule {
+ name: "net-http-test-jarjar-rules",
+ tool_files: [
+ ":NetHttpTestsLibPreJarJar{.jar}",
+ "jarjar_excludes.txt",
+ ],
+ tools: [
+ "jarjar-rules-generator",
+ ],
+ out: ["net_http_test_jarjar_rules.txt"],
+ cmd: "$(location jarjar-rules-generator) " +
+ "$(location :NetHttpTestsLibPreJarJar{.jar}) " +
+ "--prefix android.net.connectivity " +
+ "--excludes $(location jarjar_excludes.txt) " +
+ "--output $(out)",
+}
+
+// Library to be used in coverage tests. cronet_java_tests can't be used directly because the common
+// tests need to inherit the NetHttpTests manifest.
android_library {
name: "NetHttpTestsLibPreJarJar",
- srcs: [":cronet_aml_javatests_sources"],
- sdk_version: "test_current",
+ static_libs: ["cronet_java_tests"],
+ sdk_version: "module_current",
min_sdk_version: "30",
- static_libs: [
- "androidx.test.ext.junit",
- "androidx.test.rules",
- "junit",
- ],
- libs: [
- "android.test.base",
- "framework-tethering-pre-jarjar",
- ],
- lint: { test: true }
}
android_test {
name: "NetHttpTests",
defaults: [
- "CronetTestJavaDefaults",
"mts-target-sdk-version-current",
],
- sdk_version: "test_current",
static_libs: ["NetHttpTestsLibPreJarJar"],
- jarjar_rules: ":framework-tethering-jarjar-rules",
+ jarjar_rules: ":net-http-test-jarjar-rules",
+ jni_libs: [
+ "cronet_aml_components_cronet_android_cronet_tests__testing"
+ ],
test_suites: [
"general-tests",
"mts-tethering",
diff --git a/Cronet/tests/mts/AndroidManifest.xml b/Cronet/tests/mts/AndroidManifest.xml
index 62c2060..f597134 100644
--- a/Cronet/tests/mts/AndroidManifest.xml
+++ b/Cronet/tests/mts/AndroidManifest.xml
@@ -21,7 +21,7 @@
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET"/>
- <application>
+ <application android:networkSecurityConfig="@xml/network_security_config">
<uses-library android:name="android.test.runner" />
</application>
<instrumentation android:name="androidx.test.runner.AndroidJUnitRunner"
diff --git a/Cronet/tests/mts/jarjar_excludes.txt b/Cronet/tests/mts/jarjar_excludes.txt
new file mode 100644
index 0000000..a3e86de
--- /dev/null
+++ b/Cronet/tests/mts/jarjar_excludes.txt
@@ -0,0 +1,15 @@
+# It's prohibited to jarjar androidx packages
+androidx\..+
+# Do not jarjar the api classes
+android\.net\..+
+# cronet_tests.so is not jarjared and uses base classes. We can remove this when there's a
+# separate java base target to depend on.
+org\.chromium\.base\..+
+J\.cronet_tests_N(\$.+)?
+
+# Do not jarjar the tests and its utils as they also do JNI with cronet_tests.so
+org\.chromium\.net\..*Test.*(\$.+)?
+org\.chromium\.net\.NativeTestServer(\$.+)?
+org\.chromium\.net\.MockUrlRequestJobFactory(\$.+)?
+org\.chromium\.net\.QuicTestServer(\$.+)?
+org\.chromium\.net\.MockCertVerifier(\$.+)?
\ No newline at end of file
diff --git a/Cronet/tests/mts/res/xml/network_security_config.xml b/Cronet/tests/mts/res/xml/network_security_config.xml
new file mode 100644
index 0000000..d44c36f
--- /dev/null
+++ b/Cronet/tests/mts/res/xml/network_security_config.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!--
+ ~ Copyright (C) 2022 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<network-security-config>
+ <domain-config cleartextTrafficPermitted="true">
+ <!-- Used as the base URL by native test server (net::EmbeddedTestServer) -->
+ <domain includeSubdomains="true">127.0.0.1</domain>
+ <!-- Used by CronetHttpURLConnectionTest#testIOExceptionInterruptRethrown -->
+ <domain includeSubdomains="true">localhost</domain>
+ <!-- Used by CronetHttpURLConnectionTest#testBadIP -->
+ <domain includeSubdomains="true">0.0.0.0</domain>
+ <!-- Used by CronetHttpURLConnectionTest#testSetUseCachesFalse -->
+ <domain includeSubdomains="true">host-cache-test-host</domain>
+ <!-- Used by CronetHttpURLConnectionTest#testBadHostname -->
+ <domain includeSubdomains="true">this-weird-host-name-does-not-exist</domain>
+ <!-- Used by CronetUrlRequestContextTest#testHostResolverRules -->
+ <domain includeSubdomains="true">some-weird-hostname</domain>
+ </domain-config>
+</network-security-config>
\ No newline at end of file
diff --git a/Cronet/tools/import/copy.bara.sky b/Cronet/tools/import/copy.bara.sky
index 2acf8cd..5372a4d 100644
--- a/Cronet/tools/import/copy.bara.sky
+++ b/Cronet/tools/import/copy.bara.sky
@@ -19,6 +19,8 @@
# Exclude existing *OWNERS files
"**/*OWNERS",
+ "**/.git/**",
+ "**/.gitignore",
]
cronet_origin_files = glob(
@@ -28,13 +30,14 @@
"build/buildflag.h",
"chrome/VERSION",
"components/cronet/**",
- "components/grpc_suport/**",
"components/metrics/**",
"components/nacl/**",
"components/prefs/**",
"crypto/**",
"ipc/**",
"net/**",
+ # Note: Only used for tests.
+ "testing/**",
"url/**",
"LICENSE",
],
@@ -48,6 +51,8 @@
"components/cronet/ios/**",
"components/cronet/native/**",
+ # Per aosp/2399270
+ "testing/buildbot/**",
# Exclude all third-party directories. Those are specified explicitly
# below, so no dependency can accidentally creep in.
@@ -65,14 +70,11 @@
"base/third_party/icu/**",
"base/third_party/nspr/**",
"base/third_party/superfasthash/**",
- # TODO: we should be able to remove this dependency.
- "base/third_party/symbolize/**",
"base/third_party/valgrind/**",
- "base/third_party/xdg_user_dirs/**",
- # Not present in source repo; requires gclient sync.
"buildtools/third_party/libc++/**",
- # Not present in source repo; requires gclient sync.
"buildtools/third_party/libc++abi/**",
+ # Note: Only used for tests.
+ "net/third_party/nist-pkits/**",
"net/third_party/quiche/**",
"net/third_party/uri_template/**",
"third_party/abseil-cpp/**",
@@ -80,13 +82,24 @@
"third_party/ashmem/**",
"third_party/boringssl/**",
"third_party/brotli/**",
- # Not present in source repo; requires gclient sync.
+ # Note: Only used for tests.
+ "third_party/ced/**",
+ # Note: Only used for tests.
+ "third_party/googletest/**",
"third_party/icu/**",
"third_party/libevent/**",
+ # Note: Only used for tests.
+ "third_party/libxml/**",
+ # Note: Only used for tests.
+ "third_party/lss/**",
"third_party/metrics_proto/**",
"third_party/modp_b64/**",
"third_party/protobuf/**",
- "third_party/zlib/**",
+ # Note: Only used for tests.
+ "third_party/quic_trace/**",
+ # Note: Cronet currently uses Android's zlib
+ # "third_party/zlib/**",
+ "url/third_party/mozilla/**",
],
exclude = common_excludes,
)
@@ -94,12 +107,8 @@
core.workflow(
name = "import_cronet",
authoring = authoring.overwrite("Cronet Mainline Eng <cronet-mainline-eng+copybara@google.com>"),
- origin = git.origin(
- url = "rpc://chromium/chromium/src",
- # Source ref is set by the invoking script.
- ref = "overwritten-by-script",
- partial_fetch = True,
- ),
+ # Origin folder is specified via source_ref argument, see import_cronet.sh
+ origin = folder.origin(),
origin_files = cronet_origin_files,
destination = git.destination(
# The destination URL is set by the invoking script.
diff --git a/Cronet/tools/import/import_cronet.sh b/Cronet/tools/import/import_cronet.sh
index 7642914..0f04af7 100755
--- a/Cronet/tools/import/import_cronet.sh
+++ b/Cronet/tools/import/import_cronet.sh
@@ -19,40 +19,115 @@
# Environment:
# ANDROID_BUILD_TOP: path the root of the current Android directory.
# Arguments:
-# -l: The last revision that was imported.
-# -n: The new revision to import.
+# -l rev: The last revision that was imported.
+# Optional Arguments:
+# -n rev: The new revision to import.
+# -f: Force copybara to ignore a failure to find the last imported revision.
-OPTSTRING=l:n:
+set -e -x
+
+OPTSTRING=fl:n:
usage() {
cat <<EOF
-Usage: import_cronet.sh -l last-rev -n new-rev
+Usage: import_cronet.sh -n new-rev [-l last-rev] [-f]
EOF
exit 1
}
+COPYBARA_FOLDER_ORIGIN="/tmp/copybara-origin"
+
+#######################################
+# Create local upstream-import branch in external/cronet.
+# Globals:
+# ANDROID_BUILD_TOP
+# Arguments:
+# none
+#######################################
+setup_upstream_import_branch() {
+ local git_dir="${ANDROID_BUILD_TOP}/external/cronet"
+
+ (cd "${git_dir}" && git fetch aosp upstream-import:upstream-import)
+}
+
+#######################################
+# Setup folder.origin for copybara inside /tmp
+# Globals:
+# COPYBARA_FOLDER_ORIGIN
+# Arguments:
+# new_rev, string
+#######################################
+setup_folder_origin() (
+ local _new_rev=$1
+ mkdir -p "${COPYBARA_FOLDER_ORIGIN}"
+ cd "${COPYBARA_FOLDER_ORIGIN}"
+
+ if [ -d src ]; then
+ (cd src && git fetch --tags && git checkout "${_new_rev}")
+ else
+ # For this to work _new_rev must be a branch or a tag.
+ git clone --depth=1 --branch "${_new_rev}" https://chromium.googlesource.com/chromium/src.git
+ fi
+
+
+ cat <<EOF >.gclient
+solutions = [
+ {
+ "name": "src",
+ "url": "https://chromium.googlesource.com/chromium/src.git",
+ "managed": False,
+ "custom_deps": {},
+ "custom_vars": {},
+ },
+]
+target_os = ["android"]
+EOF
+ cd src
+ # Set appropriate gclient flags to speed up syncing.
+ gclient sync \
+ --no-history \
+ --shallow \
+ --delete_unversioned_trees
+)
+
#######################################
# Runs the copybara import of Chromium
# Globals:
# ANDROID_BUILD_TOP
+# COPYBARA_FOLDER_ORIGIN
# Arguments:
-# last_rev, string
-# new_rev, string
+# last_rev, string or empty
+# force, string or empty
#######################################
do_run_copybara() {
local _last_rev=$1
- local _new_rev=$2
+ local _force=$2
+
+ local -a flags
+ flags+=(--git-destination-url="file://${ANDROID_BUILD_TOP}/external/cronet")
+ flags+=(--repo-timeout 3m)
+
+ # buildtools/third_party/libc++ contains an invalid symlink
+ flags+=(--folder-origin-ignore-invalid-symlinks)
+ flags+=(--git-no-verify)
+
+ if [ ! -z "${_force}" ]; then
+ flags+=(--force)
+ fi
+
+ if [ ! -z "${_last_rev}" ]; then
+ flags+=(--last-rev "${_last_rev}")
+ fi
/google/bin/releases/copybara/public/copybara/copybara \
- --git-destination-url="file://${ANDROID_BUILD_TOP}/external/cronet" \
- --last-rev "${_last_rev}" \
- --repo-timeout 3h \
+ "${flags[@]}" \
"${ANDROID_BUILD_TOP}/packages/modules/Connectivity/Cronet/tools/import/copy.bara.sky" \
- import_cronet "${_new_rev}"
+ import_cronet "${COPYBARA_FOLDER_ORIGIN}/src"
}
while getopts $OPTSTRING opt; do
case "${opt}" in
+ f) force=true ;;
l) last_rev="${OPTARG}" ;;
n) new_rev="${OPTARG}" ;;
?) usage ;;
@@ -60,17 +135,12 @@
esac
done
-# TODO: Get last-rev from METADATA file.
-# Setting last-rev may only be required for the first commit.
-if [ -z "${last_rev}" ]; then
- echo "-l argument required"
- usage
-fi
-
if [ -z "${new_rev}" ]; then
echo "-n argument required"
usage
fi
-do_run_copybara "${last_rev}" "${new_rev}"
+setup_upstream_import_branch
+setup_folder_origin "${new_rev}"
+do_run_copybara "${last_rev}" "${force}"
diff --git a/TEST_MAPPING b/TEST_MAPPING
index 70c5f85..0326bf2 100644
--- a/TEST_MAPPING
+++ b/TEST_MAPPING
@@ -75,9 +75,6 @@
"name": "connectivity_native_test"
},
{
- "name": "CtsNetHttpTestCases"
- },
- {
"name": "libclat_test"
},
{
@@ -97,6 +94,16 @@
},
{
"name": "FrameworksNetIntegrationTests"
+ },
+ // Runs both NetHttpTests and CtsNetHttpTestCases
+ {
+ "name": "NetHttpCoverageTests",
+ "options": [
+ {
+ // These sometimes take longer than 1 min which is the presubmit timeout
+ "exclude-annotation": "androidx.test.filters.LargeTest"
+ }
+ ]
}
],
"postsubmit": [
@@ -113,11 +120,6 @@
},
{
"name": "FrameworksNetDeflakeTest"
- },
- // Run in postsubmit to confirm test passes continously since this is a new test setup
- // TODO: move tests to presubmit
- {
- "name": "NetHttpTests"
}
],
"mainline-presubmit": [
@@ -215,7 +217,21 @@
"name": "libnetworkstats_test[CaptivePortalLoginGoogle.apk+NetworkStackGoogle.apk+com.google.android.resolv.apex+com.google.android.tethering.apex]"
},
{
- "name": "NetHttpCoverageTests[CaptivePortalLoginGoogle.apk+NetworkStackGoogle.apk+com.google.android.resolv.apex+com.google.android.tethering.apex]"
+ "name": "NetHttpCoverageTests[CaptivePortalLoginGoogle.apk+NetworkStackGoogle.apk+com.google.android.resolv.apex+com.google.android.tethering.apex]",
+ "options": [
+ {
+ // These sometimes take longer than 1 min which is the presubmit timeout
+ "exclude-annotation": "androidx.test.filters.LargeTest"
+ }
+ ]
+ },
+ {
+ "name": "CtsTetheringTestLatestSdk[CaptivePortalLoginGoogle.apk+NetworkStackGoogle.apk+com.google.android.resolv.apex+com.google.android.tethering.apex]",
+ "options": [
+ {
+ "exclude-annotation": "com.android.testutils.NetworkStackModuleTest"
+ }
+ ]
}
],
"mainline-postsubmit": [
@@ -223,6 +239,15 @@
{
"name": "CtsNetTestCasesLatestSdk[CaptivePortalLoginGoogle.apk+NetworkStackGoogle.apk+com.google.android.resolv.apex+com.google.android.tethering.apex]",
"keywords": ["sim"]
+ },
+ {
+ "name": "CtsTetheringTestLatestSdk[CaptivePortalLoginGoogle.apk+NetworkStackGoogle.apk+com.google.android.resolv.apex+com.google.android.tethering.apex]",
+ "keywords": ["sim"],
+ "options": [
+ {
+ "exclude-annotation": "com.android.testutils.NetworkStackModuleTest"
+ }
+ ]
}
],
"imports": [
diff --git a/Tethering/Android.bp b/Tethering/Android.bp
index d2f6d15..4478b1e 100644
--- a/Tethering/Android.bp
+++ b/Tethering/Android.bp
@@ -61,9 +61,13 @@
"modules-utils-build",
"modules-utils-statemachine",
"networkstack-client",
+ // AIDL tetheroffload implementation
+ "android.hardware.tetheroffload-V1-java",
+ // HIDL tetheroffload implementation
"android.hardware.tetheroffload.config-V1.0-java",
"android.hardware.tetheroffload.control-V1.0-java",
"android.hardware.tetheroffload.control-V1.1-java",
+ "android.hidl.manager-V1.2-java",
"net-utils-framework-common",
"net-utils-device-common",
"net-utils-device-common-bpf",
@@ -115,7 +119,6 @@
name: "libcom_android_networkstack_tethering_util_jni",
sdk_version: "30",
apex_available: [
- "//apex_available:platform", // Used by InProcessTethering
"com.android.tethering",
],
min_sdk_version: "30",
@@ -184,24 +187,6 @@
lint: { strict_updatability_linting: true },
}
-// Non-updatable tethering running in the system server process for devices not using the module
-android_app {
- name: "InProcessTethering",
- defaults: [
- "TetheringAppDefaults",
- "TetheringApiLevel",
- "ConnectivityNextEnableDefaults",
- "TetheringReleaseTargetSdk"
- ],
- static_libs: ["TetheringApiCurrentLib"],
- certificate: "platform",
- manifest: "AndroidManifest_InProcess.xml",
- // InProcessTethering is a replacement for Tethering
- overrides: ["Tethering"],
- apex_available: ["com.android.tethering"],
- lint: { strict_updatability_linting: true },
-}
-
// Updatable tethering packaged for finalized API
android_app {
name: "Tethering",
@@ -210,11 +195,7 @@
certificate: "networkstack",
manifest: "AndroidManifest.xml",
use_embedded_native_libs: true,
- // The network stack *must* be included to ensure security of the device
- required: [
- "NetworkStack",
- "privapp_allowlist_com.android.tethering",
- ],
+ privapp_allowlist: ":privapp_allowlist_com.android.tethering",
apex_available: ["com.android.tethering"],
lint: { strict_updatability_linting: true },
}
@@ -230,11 +211,7 @@
certificate: "networkstack",
manifest: "AndroidManifest.xml",
use_embedded_native_libs: true,
- // The network stack *must* be included to ensure security of the device
- required: [
- "NetworkStackNext",
- "privapp_allowlist_com.android.tethering",
- ],
+ privapp_allowlist: ":privapp_allowlist_com.android.tethering",
apex_available: ["com.android.tethering"],
lint: { strict_updatability_linting: true },
}
@@ -246,6 +223,9 @@
// e.g. *classpath_fragments.
"com.android.tethering",
],
+ native_shared_libs: [
+ "libnetd_updatable",
+ ],
}
java_library_static {
diff --git a/Tethering/AndroidManifest_InProcess.xml b/Tethering/AndroidManifest_InProcess.xml
deleted file mode 100644
index b1f1240..0000000
--- a/Tethering/AndroidManifest_InProcess.xml
+++ /dev/null
@@ -1,34 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
- * Copyright (C) 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
--->
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="com.android.networkstack.tethering.inprocess"
- android:sharedUserId="android.uid.system"
- android:process="system">
- <uses-sdk android:minSdkVersion="29" android:targetSdkVersion="29" />
- <application>
- <service android:name="com.android.networkstack.tethering.TetheringService"
- android:process="system"
- android:permission="android.permission.MAINLINE_NETWORK_STACK"
- android:exported="true">
- <intent-filter>
- <action android:name="android.net.ITetheringConnector.InProcess"/>
- </intent-filter>
- </service>
- </application>
-</manifest>
diff --git a/Tethering/apex/Android.bp b/Tethering/apex/Android.bp
index 67206cd..cf9b359 100644
--- a/Tethering/apex/Android.bp
+++ b/Tethering/apex/Android.bp
@@ -18,26 +18,19 @@
default_applicable_licenses: ["Android-Apache-2.0"],
}
-prebuilt_etc {
- name: "TetheringInProcessFlag",
- src: "in-process",
- filename_from_src: true,
- sub_dir: "flag",
-}
-
-prebuilt_etc {
- name: "TetheringOutOfProcessFlag",
- src: "out-of-process",
- filename_from_src: true,
- sub_dir: "flag",
-}
-
// Defaults to enable/disable java targets which uses development APIs. "enabled" may have a
// different value depending on the branch.
java_defaults {
name: "ConnectivityNextEnableDefaults",
enabled: true,
}
+java_defaults {
+ name: "NetworkStackApiShimSettingsForCurrentBranch",
+ // API shims to include in the networking modules built from the branch. Branches that disable
+ // the "next" targets must use stable shims (latest stable API level) instead of current shims
+ // (X_current API level).
+ static_libs: ["NetworkStackApiCurrentShims"],
+}
apex_defaults {
name: "ConnectivityApexDefaults",
// Tethering app to include in the AOSP apex. Branches that disable the "next" targets may use
@@ -50,35 +43,25 @@
// as the above target may have different "enabled" values
// depending on the branch
-// cronet_in_tethering_apex_defaults can be used to specify an apex_defaults target that either
-// enables or disables inclusion of Cronet in the Tethering apex. This is used to disable Cronet
-// on tm-mainline-prod. Note: in order for Cronet APIs to work Cronet must also be enabled
-// by the cronet_java_*_defaults in common/TetheringLib/Android.bp.
-cronet_in_tethering_apex_defaults = "CronetInTetheringApexDefaultsEnabled"
-// This is a placeholder comment to avoid merge conflicts
-// as cronet_apex_defaults may have different values
-// depending on the branch
-
apex_defaults {
name: "CronetInTetheringApexDefaults",
- defaults: [cronet_in_tethering_apex_defaults],
-}
-
-apex_defaults {
- name: "CronetInTetheringApexDefaultsEnabled",
- jni_libs: ["cronet_aml_components_cronet_android_cronet"],
+ jni_libs: [
+ "cronet_aml_components_cronet_android_cronet",
+ "//external/cronet/third_party/boringssl:libcrypto",
+ "//external/cronet/third_party/boringssl:libssl",
+ ],
arch: {
riscv64: {
// TODO: remove this when there is a riscv64 libcronet
- exclude_jni_libs: ["cronet_aml_components_cronet_android_cronet"],
+ exclude_jni_libs: [
+ "cronet_aml_components_cronet_android_cronet",
+ "//external/cronet/third_party/boringssl:libcrypto",
+ "//external/cronet/third_party/boringssl:libssl",
+ ],
},
},
}
-apex_defaults {
- name: "CronetInTetheringApexDefaultsDisabled",
-}
-
apex {
name: "com.android.tethering",
defaults: [
@@ -129,11 +112,7 @@
"ServiceConnectivityResources",
"HalfSheetUX",
],
- prebuilts: [
- "current_sdkinfo",
- "privapp_allowlist_com.android.tethering",
- "TetheringOutOfProcessFlag",
- ],
+ prebuilts: ["current_sdkinfo"],
manifest: "manifest.json",
key: "com.android.tethering.key",
// Indicates that pre-installed version of this apex can be compressed.
@@ -227,7 +206,6 @@
"android.net.apf",
"android.net.connectivity",
"android.net.http.apihelpers",
- "android.net.http.internal",
"android.net.netstats.provider",
"android.net.nsd",
"android.net.wear",
@@ -240,27 +218,3 @@
standalone_contents: ["service-connectivity"],
apex_available: ["com.android.tethering"],
}
-
-override_apex {
- name: "com.android.tethering.inprocess",
- base: "com.android.tethering",
- package_name: "com.android.tethering.inprocess",
- enabled: enable_tethering_next_apex,
- bpfs: [
- "block.o",
- "clatd.o",
- "dscpPolicy.o",
- "netd.o",
- "offload@inprocess.o",
- "test@inprocess.o",
- ],
- apps: [
- "ServiceConnectivityResources",
- "InProcessTethering",
- ],
- prebuilts: [
- "current_sdkinfo",
- "privapp_allowlist_com.android.tethering",
- "TetheringInProcessFlag",
- ],
-}
diff --git a/Tethering/apex/in-process b/Tethering/apex/in-process
deleted file mode 100644
index e69de29..0000000
--- a/Tethering/apex/in-process
+++ /dev/null
diff --git a/Tethering/apex/out-of-process b/Tethering/apex/out-of-process
deleted file mode 100644
index e69de29..0000000
--- a/Tethering/apex/out-of-process
+++ /dev/null
diff --git a/Tethering/apex/permissions/Android.bp b/Tethering/apex/permissions/Android.bp
index ac9ec65..69c1aa2 100644
--- a/Tethering/apex/permissions/Android.bp
+++ b/Tethering/apex/permissions/Android.bp
@@ -19,10 +19,7 @@
default_visibility: ["//packages/modules/Connectivity/Tethering:__subpackages__"],
}
-prebuilt_etc {
+filegroup {
name: "privapp_allowlist_com.android.tethering",
- sub_dir: "permissions",
- filename: "permissions.xml",
- src: "permissions.xml",
- installable: false,
+ srcs: ["permissions.xml"],
}
\ No newline at end of file
diff --git a/Tethering/common/TetheringLib/Android.bp b/Tethering/common/TetheringLib/Android.bp
index 4c677d0..a4db776 100644
--- a/Tethering/common/TetheringLib/Android.bp
+++ b/Tethering/common/TetheringLib/Android.bp
@@ -17,20 +17,9 @@
default_applicable_licenses: ["Android-Apache-2.0"],
}
-// Both cronet_java_defaults and cronet_java_prejarjar_defaults can be used to
-// specify a java_defaults target that either enables or disables Cronet. This
-// is used to disable Cronet on tm-mainline-prod.
-// Note: they must either both be enabled or disabled.
-cronet_java_defaults = "CronetJavaDefaultsEnabled"
-cronet_java_prejarjar_defaults = "CronetJavaPrejarjarDefaultsEnabled"
-// This is a placeholder comment to avoid merge conflicts
-// as cronet_defaults may have different values
-// depending on the branch
-
java_sdk_library {
name: "framework-tethering",
defaults: [
- "CronetJavaDefaults",
"framework-tethering-defaults",
],
impl_library_visibility: [
@@ -65,60 +54,13 @@
hostdex: true, // for hiddenapi check
permitted_packages: ["android.net"],
-}
-
-java_defaults {
- name: "CronetJavaDefaults",
- defaults: [cronet_java_defaults],
-}
-
-java_defaults {
- name: "CronetJavaDefaultsEnabled",
- srcs: [":cronet_aml_api_sources"],
- libs: [
- "androidx.annotation_annotation",
- ],
- impl_only_static_libs: [
- "cronet_aml_java",
- ],
- // STOPSHIP(b/265674359): fix all Cronet lint warnings and re-enable lint
- // directly in framework-tethering
- lint: {
- enabled: false,
- },
- api_lint: {
- enabled: false,
- },
- api_dir: "cronet_enabled/api",
-}
-
-java_defaults {
- name: "CronetJavaDefaultsDisabled",
- lint: { strict_updatability_linting: true },
-}
-
-java_defaults {
- name: "CronetJavaPrejarjarDefaults",
- defaults: [cronet_java_prejarjar_defaults],
-}
-
-java_defaults {
- name: "CronetJavaPrejarjarDefaultsDisabled",
-}
-
-java_defaults {
- name: "CronetJavaPrejarjarDefaultsEnabled",
- static_libs: [
- "cronet_aml_api_java",
- "cronet_aml_java"
- ],
+ lint: { strict_updatability_linting: true },
}
java_library {
name: "framework-tethering-pre-jarjar",
defaults: [
"framework-tethering-defaults",
- "CronetJavaPrejarjarDefaults",
],
}
@@ -135,7 +77,7 @@
out: ["framework_tethering_jarjar_rules.txt"],
cmd: "$(location jarjar-rules-generator) " +
"$(location :framework-tethering-pre-jarjar{.jar}) " +
- "--apistubs $(location :framework-tethering.stubs.module_lib{.jar}) " +
+ "--apistubs $(location :framework-tethering.stubs.module_lib{.jar}) " +
"--prefix android.net.http.internal " +
"--excludes $(location jarjar-excludes.txt) " +
"--output $(out)",
@@ -159,6 +101,7 @@
filegroup {
name: "framework-tethering-srcs",
+ defaults: ["framework-sources-module-defaults"],
srcs: [
"src/**/*.aidl",
"src/**/*.java",
diff --git a/Tethering/common/TetheringLib/cronet_enabled/api/current.txt b/Tethering/common/TetheringLib/cronet_enabled/api/current.txt
deleted file mode 100644
index e954074..0000000
--- a/Tethering/common/TetheringLib/cronet_enabled/api/current.txt
+++ /dev/null
@@ -1,268 +0,0 @@
-// Signature format: 2.0
-package android.net.http {
-
- public abstract class BidirectionalStream {
- ctor public BidirectionalStream();
- method public abstract void cancel();
- method public abstract void flush();
- method public abstract boolean isDone();
- method public abstract void read(java.nio.ByteBuffer);
- method public abstract void start();
- method public abstract void write(java.nio.ByteBuffer, boolean);
- }
-
- public abstract static class BidirectionalStream.Builder {
- ctor public BidirectionalStream.Builder();
- method public abstract android.net.http.BidirectionalStream.Builder addHeader(String, String);
- method public abstract android.net.http.BidirectionalStream build();
- method public abstract android.net.http.BidirectionalStream.Builder delayRequestHeadersUntilFirstFlush(boolean);
- method public abstract android.net.http.BidirectionalStream.Builder setHttpMethod(String);
- method public abstract android.net.http.BidirectionalStream.Builder setPriority(int);
- method public abstract android.net.http.BidirectionalStream.Builder setTrafficStatsTag(int);
- method public abstract android.net.http.BidirectionalStream.Builder setTrafficStatsUid(int);
- field public static final int STREAM_PRIORITY_HIGHEST = 4; // 0x4
- field public static final int STREAM_PRIORITY_IDLE = 0; // 0x0
- field public static final int STREAM_PRIORITY_LOW = 2; // 0x2
- field public static final int STREAM_PRIORITY_LOWEST = 1; // 0x1
- field public static final int STREAM_PRIORITY_MEDIUM = 3; // 0x3
- }
-
- public abstract static class BidirectionalStream.Callback {
- ctor public BidirectionalStream.Callback();
- method public void onCanceled(android.net.http.BidirectionalStream, android.net.http.UrlResponseInfo);
- method public abstract void onFailed(android.net.http.BidirectionalStream, android.net.http.UrlResponseInfo, android.net.http.HttpException);
- method public abstract void onReadCompleted(android.net.http.BidirectionalStream, android.net.http.UrlResponseInfo, java.nio.ByteBuffer, boolean);
- method public abstract void onResponseHeadersReceived(android.net.http.BidirectionalStream, android.net.http.UrlResponseInfo);
- method public void onResponseTrailersReceived(android.net.http.BidirectionalStream, android.net.http.UrlResponseInfo, android.net.http.UrlResponseInfo.HeaderBlock);
- method public abstract void onStreamReady(android.net.http.BidirectionalStream);
- method public abstract void onSucceeded(android.net.http.BidirectionalStream, android.net.http.UrlResponseInfo);
- method public abstract void onWriteCompleted(android.net.http.BidirectionalStream, android.net.http.UrlResponseInfo, java.nio.ByteBuffer, boolean);
- }
-
- public abstract class CallbackException extends android.net.http.HttpException {
- ctor protected CallbackException(String, Throwable);
- }
-
- public class ConnectionMigrationOptions {
- method @Nullable public Boolean getAllowNonDefaultNetworkUsage();
- method @Nullable public Boolean getEnableDefaultNetworkMigration();
- method @Nullable public Boolean getEnablePathDegradationMigration();
- }
-
- public static final class ConnectionMigrationOptions.Builder {
- ctor public ConnectionMigrationOptions.Builder();
- method public android.net.http.ConnectionMigrationOptions build();
- method public android.net.http.ConnectionMigrationOptions.Builder setAllowNonDefaultNetworkUsage(boolean);
- method public android.net.http.ConnectionMigrationOptions.Builder setEnableDefaultNetworkMigration(boolean);
- method public android.net.http.ConnectionMigrationOptions.Builder setEnablePathDegradationMigration(boolean);
- }
-
- public final class DnsOptions {
- method @Nullable public Boolean getEnableStaleDns();
- method @Nullable public Boolean getPersistHostCache();
- method @Nullable public java.time.Duration getPersistHostCachePeriod();
- method @Nullable public Boolean getPreestablishConnectionsToStaleDnsResults();
- method @Nullable public android.net.http.DnsOptions.StaleDnsOptions getStaleDnsOptions();
- method @Nullable public Boolean getUseHttpStackDnsResolver();
- }
-
- public static final class DnsOptions.Builder {
- ctor public DnsOptions.Builder();
- method public android.net.http.DnsOptions build();
- method public android.net.http.DnsOptions.Builder setEnableStaleDns(boolean);
- method public android.net.http.DnsOptions.Builder setPersistHostCache(boolean);
- method public android.net.http.DnsOptions.Builder setPersistHostCachePeriod(java.time.Duration);
- method public android.net.http.DnsOptions.Builder setPreestablishConnectionsToStaleDnsResults(boolean);
- method public android.net.http.DnsOptions.Builder setStaleDnsOptions(android.net.http.DnsOptions.StaleDnsOptions);
- method public android.net.http.DnsOptions.Builder setUseHttpStackDnsResolver(boolean);
- }
-
- public static class DnsOptions.StaleDnsOptions {
- method @Nullable public Boolean getAllowCrossNetworkUsage();
- method @Nullable public Long getFreshLookupTimeoutMillis();
- method @Nullable public Long getMaxExpiredDelayMillis();
- method @Nullable public Boolean getUseStaleOnNameNotResolved();
- }
-
- public static final class DnsOptions.StaleDnsOptions.Builder {
- ctor public DnsOptions.StaleDnsOptions.Builder();
- method public android.net.http.DnsOptions.StaleDnsOptions build();
- method public android.net.http.DnsOptions.StaleDnsOptions.Builder setAllowCrossNetworkUsage(boolean);
- method public android.net.http.DnsOptions.StaleDnsOptions.Builder setFreshLookupTimeout(java.time.Duration);
- method public android.net.http.DnsOptions.StaleDnsOptions.Builder setMaxExpiredDelay(java.time.Duration);
- method public android.net.http.DnsOptions.StaleDnsOptions.Builder setUseStaleOnNameNotResolved(boolean);
- }
-
- public abstract class HttpEngine {
- method public void bindToNetwork(@Nullable android.net.Network);
- method public abstract java.net.URLStreamHandlerFactory createUrlStreamHandlerFactory();
- method public static String getVersionString();
- method public abstract android.net.http.BidirectionalStream.Builder newBidirectionalStreamBuilder(String, java.util.concurrent.Executor, android.net.http.BidirectionalStream.Callback);
- method public abstract android.net.http.UrlRequest.Builder newUrlRequestBuilder(String, java.util.concurrent.Executor, android.net.http.UrlRequest.Callback);
- method public android.net.http.UrlRequest.Builder newUrlRequestBuilder(String, android.net.http.UrlRequest.Callback, java.util.concurrent.Executor);
- method public abstract java.net.URLConnection openConnection(java.net.URL) throws java.io.IOException;
- method public abstract void shutdown();
- }
-
- public static class HttpEngine.Builder {
- ctor public HttpEngine.Builder(android.content.Context);
- method public android.net.http.HttpEngine.Builder addPublicKeyPins(String, java.util.Set<byte[]>, boolean, java.time.Instant);
- method public android.net.http.HttpEngine.Builder addQuicHint(String, int, int);
- method public android.net.http.HttpEngine build();
- method public String getDefaultUserAgent();
- method public android.net.http.HttpEngine.Builder setConnectionMigrationOptions(android.net.http.ConnectionMigrationOptions);
- method public android.net.http.HttpEngine.Builder setDnsOptions(android.net.http.DnsOptions);
- method public android.net.http.HttpEngine.Builder setEnableBrotli(boolean);
- method public android.net.http.HttpEngine.Builder setEnableHttp2(boolean);
- method public android.net.http.HttpEngine.Builder setEnableHttpCache(int, long);
- method public android.net.http.HttpEngine.Builder setEnablePublicKeyPinningBypassForLocalTrustAnchors(boolean);
- method public android.net.http.HttpEngine.Builder setEnableQuic(boolean);
- method public android.net.http.HttpEngine.Builder setQuicOptions(android.net.http.QuicOptions);
- method public android.net.http.HttpEngine.Builder setStoragePath(String);
- method public android.net.http.HttpEngine.Builder setUserAgent(String);
- field public static final int HTTP_CACHE_DISABLED = 0; // 0x0
- field public static final int HTTP_CACHE_DISK = 3; // 0x3
- field public static final int HTTP_CACHE_DISK_NO_HTTP = 2; // 0x2
- field public static final int HTTP_CACHE_IN_MEMORY = 1; // 0x1
- }
-
- public class HttpException extends java.io.IOException {
- ctor public HttpException(@Nullable String, @Nullable Throwable);
- }
-
- public final class InlineExecutionProhibitedException extends java.util.concurrent.RejectedExecutionException {
- ctor public InlineExecutionProhibitedException();
- }
-
- public abstract class NetworkException extends android.net.http.HttpException {
- ctor public NetworkException(@Nullable String, @Nullable Throwable);
- method public abstract int getErrorCode();
- method public abstract boolean isImmediatelyRetryable();
- field public static final int ERROR_ADDRESS_UNREACHABLE = 9; // 0x9
- field public static final int ERROR_CONNECTION_CLOSED = 5; // 0x5
- field public static final int ERROR_CONNECTION_REFUSED = 7; // 0x7
- field public static final int ERROR_CONNECTION_RESET = 8; // 0x8
- field public static final int ERROR_CONNECTION_TIMED_OUT = 6; // 0x6
- field public static final int ERROR_HOSTNAME_NOT_RESOLVED = 1; // 0x1
- field public static final int ERROR_INTERNET_DISCONNECTED = 2; // 0x2
- field public static final int ERROR_NETWORK_CHANGED = 3; // 0x3
- field public static final int ERROR_OTHER = 11; // 0xb
- field public static final int ERROR_QUIC_PROTOCOL_FAILED = 10; // 0xa
- field public static final int ERROR_TIMED_OUT = 4; // 0x4
- }
-
- public abstract class QuicException extends android.net.http.NetworkException {
- ctor protected QuicException(@Nullable String, @Nullable Throwable);
- }
-
- public class QuicOptions {
- method @Nullable public String getHandshakeUserAgent();
- method @Nullable public Integer getInMemoryServerConfigsCacheSize();
- method @NonNull public java.util.Set<java.lang.String> getQuicHostAllowlist();
- }
-
- public static final class QuicOptions.Builder {
- ctor public QuicOptions.Builder();
- method @NonNull public android.net.http.QuicOptions.Builder addAllowedQuicHost(@NonNull String);
- method @NonNull public android.net.http.QuicOptions build();
- method @NonNull public android.net.http.QuicOptions.Builder setHandshakeUserAgent(@NonNull String);
- method public android.net.http.QuicOptions.Builder setIdleConnectionTimeout(java.time.Duration);
- method @NonNull public android.net.http.QuicOptions.Builder setInMemoryServerConfigsCacheSize(int);
- }
-
- public abstract class UploadDataProvider implements java.io.Closeable {
- ctor public UploadDataProvider();
- method public void close() throws java.io.IOException;
- method public abstract long getLength() throws java.io.IOException;
- method public abstract void read(@NonNull android.net.http.UploadDataSink, @NonNull java.nio.ByteBuffer) throws java.io.IOException;
- method public abstract void rewind(@NonNull android.net.http.UploadDataSink) throws java.io.IOException;
- }
-
- public abstract class UploadDataSink {
- ctor public UploadDataSink();
- method public abstract void onReadError(@NonNull Exception);
- method public abstract void onReadSucceeded(boolean);
- method public abstract void onRewindError(@NonNull Exception);
- method public abstract void onRewindSucceeded();
- }
-
- public abstract class UrlRequest {
- method public abstract void cancel();
- method public abstract void followRedirect();
- method public abstract void getStatus(@NonNull android.net.http.UrlRequest.StatusListener);
- method public abstract boolean isDone();
- method public abstract void read(@NonNull java.nio.ByteBuffer);
- method public abstract void start();
- }
-
- public abstract static class UrlRequest.Builder {
- method @NonNull public abstract android.net.http.UrlRequest.Builder addHeader(@NonNull String, @NonNull String);
- method @NonNull public abstract android.net.http.UrlRequest.Builder bindToNetwork(@Nullable android.net.Network);
- method @NonNull public abstract android.net.http.UrlRequest build();
- method @NonNull public abstract android.net.http.UrlRequest.Builder setAllowDirectExecutor(boolean);
- method @NonNull public abstract android.net.http.UrlRequest.Builder setDisableCache(boolean);
- method @NonNull public abstract android.net.http.UrlRequest.Builder setHttpMethod(@NonNull String);
- method @NonNull public abstract android.net.http.UrlRequest.Builder setPriority(int);
- method public abstract android.net.http.UrlRequest.Builder setTrafficStatsTag(int);
- method public abstract android.net.http.UrlRequest.Builder setTrafficStatsUid(int);
- method @NonNull public abstract android.net.http.UrlRequest.Builder setUploadDataProvider(@NonNull android.net.http.UploadDataProvider, @NonNull java.util.concurrent.Executor);
- field public static final int REQUEST_PRIORITY_HIGHEST = 4; // 0x4
- field public static final int REQUEST_PRIORITY_IDLE = 0; // 0x0
- field public static final int REQUEST_PRIORITY_LOW = 2; // 0x2
- field public static final int REQUEST_PRIORITY_LOWEST = 1; // 0x1
- field public static final int REQUEST_PRIORITY_MEDIUM = 3; // 0x3
- }
-
- public abstract static class UrlRequest.Callback {
- ctor public UrlRequest.Callback();
- method public void onCanceled(@NonNull android.net.http.UrlRequest, @Nullable android.net.http.UrlResponseInfo);
- method public abstract void onFailed(@NonNull android.net.http.UrlRequest, @Nullable android.net.http.UrlResponseInfo, @NonNull android.net.http.HttpException);
- method public abstract void onReadCompleted(@NonNull android.net.http.UrlRequest, @NonNull android.net.http.UrlResponseInfo, @NonNull java.nio.ByteBuffer) throws java.lang.Exception;
- method public abstract void onRedirectReceived(@NonNull android.net.http.UrlRequest, @NonNull android.net.http.UrlResponseInfo, @NonNull String) throws java.lang.Exception;
- method public abstract void onResponseStarted(@NonNull android.net.http.UrlRequest, @NonNull android.net.http.UrlResponseInfo) throws java.lang.Exception;
- method public abstract void onSucceeded(@NonNull android.net.http.UrlRequest, @NonNull android.net.http.UrlResponseInfo);
- }
-
- public static class UrlRequest.Status {
- field public static final int CONNECTING = 10; // 0xa
- field public static final int DOWNLOADING_PAC_FILE = 5; // 0x5
- field public static final int ESTABLISHING_PROXY_TUNNEL = 8; // 0x8
- field public static final int IDLE = 0; // 0x0
- field public static final int INVALID = -1; // 0xffffffff
- field public static final int READING_RESPONSE = 14; // 0xe
- field public static final int RESOLVING_HOST = 9; // 0x9
- field public static final int RESOLVING_HOST_IN_PAC_FILE = 7; // 0x7
- field public static final int RESOLVING_PROXY_FOR_URL = 6; // 0x6
- field public static final int SENDING_REQUEST = 12; // 0xc
- field public static final int SSL_HANDSHAKE = 11; // 0xb
- field public static final int WAITING_FOR_AVAILABLE_SOCKET = 2; // 0x2
- field public static final int WAITING_FOR_CACHE = 4; // 0x4
- field public static final int WAITING_FOR_DELEGATE = 3; // 0x3
- field public static final int WAITING_FOR_RESPONSE = 13; // 0xd
- field public static final int WAITING_FOR_STALLED_SOCKET_POOL = 1; // 0x1
- }
-
- public static interface UrlRequest.StatusListener {
- method public void onStatus(int);
- }
-
- public abstract class UrlResponseInfo {
- ctor public UrlResponseInfo();
- method @NonNull public abstract android.net.http.UrlResponseInfo.HeaderBlock getHeaders();
- method public abstract int getHttpStatusCode();
- method @NonNull public abstract String getHttpStatusText();
- method @NonNull public abstract String getNegotiatedProtocol();
- method public abstract long getReceivedByteCount();
- method @NonNull public abstract String getUrl();
- method @NonNull public abstract java.util.List<java.lang.String> getUrlChain();
- method public abstract boolean wasCached();
- }
-
- public abstract static class UrlResponseInfo.HeaderBlock {
- ctor public UrlResponseInfo.HeaderBlock();
- method public abstract java.util.List<java.util.Map.Entry<java.lang.String,java.lang.String>> getAsList();
- method public abstract java.util.Map<java.lang.String,java.util.List<java.lang.String>> getAsMap();
- }
-
-}
-
diff --git a/Tethering/common/TetheringLib/cronet_enabled/api/module-lib-current.txt b/Tethering/common/TetheringLib/cronet_enabled/api/module-lib-current.txt
deleted file mode 100644
index 460c216..0000000
--- a/Tethering/common/TetheringLib/cronet_enabled/api/module-lib-current.txt
+++ /dev/null
@@ -1,50 +0,0 @@
-// Signature format: 2.0
-package android.net {
-
- public final class TetheringConstants {
- field public static final String EXTRA_ADD_TETHER_TYPE = "extraAddTetherType";
- field public static final String EXTRA_PROVISION_CALLBACK = "extraProvisionCallback";
- field public static final String EXTRA_REM_TETHER_TYPE = "extraRemTetherType";
- field public static final String EXTRA_RUN_PROVISION = "extraRunProvision";
- field public static final String EXTRA_SET_ALARM = "extraSetAlarm";
- }
-
- public class TetheringManager {
- ctor public TetheringManager(@NonNull android.content.Context, @NonNull java.util.function.Supplier<android.os.IBinder>);
- method public int getLastTetherError(@NonNull String);
- method @NonNull public String[] getTetherableBluetoothRegexs();
- method @NonNull public String[] getTetherableIfaces();
- method @NonNull public String[] getTetherableUsbRegexs();
- method @NonNull public String[] getTetherableWifiRegexs();
- method @NonNull public String[] getTetheredIfaces();
- method @NonNull public String[] getTetheringErroredIfaces();
- method public boolean isTetheringSupported();
- method public boolean isTetheringSupported(@NonNull String);
- method public void requestLatestTetheringEntitlementResult(int, @NonNull android.os.ResultReceiver, boolean);
- method @Deprecated public int setUsbTethering(boolean);
- method @RequiresPermission(anyOf={android.Manifest.permission.TETHER_PRIVILEGED, android.Manifest.permission.WRITE_SETTINGS}) public void startTethering(int, @NonNull java.util.concurrent.Executor, @NonNull android.net.TetheringManager.StartTetheringCallback);
- method @Deprecated public int tether(@NonNull String);
- method @Deprecated public int untether(@NonNull String);
- }
-
- public static interface TetheringManager.TetheredInterfaceCallback {
- method public void onAvailable(@NonNull String);
- method public void onUnavailable();
- }
-
- public static interface TetheringManager.TetheredInterfaceRequest {
- method public void release();
- }
-
- public static interface TetheringManager.TetheringEventCallback {
- method @Deprecated public default void onTetherableInterfaceRegexpsChanged(@NonNull android.net.TetheringManager.TetheringInterfaceRegexps);
- }
-
- @Deprecated public static class TetheringManager.TetheringInterfaceRegexps {
- method @Deprecated @NonNull public java.util.List<java.lang.String> getTetherableBluetoothRegexs();
- method @Deprecated @NonNull public java.util.List<java.lang.String> getTetherableUsbRegexs();
- method @Deprecated @NonNull public java.util.List<java.lang.String> getTetherableWifiRegexs();
- }
-
-}
-
diff --git a/Tethering/common/TetheringLib/cronet_enabled/api/removed.txt b/Tethering/common/TetheringLib/cronet_enabled/api/removed.txt
deleted file mode 100644
index d802177..0000000
--- a/Tethering/common/TetheringLib/cronet_enabled/api/removed.txt
+++ /dev/null
@@ -1 +0,0 @@
-// Signature format: 2.0
diff --git a/Tethering/common/TetheringLib/cronet_enabled/api/system-current.txt b/Tethering/common/TetheringLib/cronet_enabled/api/system-current.txt
deleted file mode 100644
index 844ff64..0000000
--- a/Tethering/common/TetheringLib/cronet_enabled/api/system-current.txt
+++ /dev/null
@@ -1,117 +0,0 @@
-// Signature format: 2.0
-package android.net {
-
- public final class TetheredClient implements android.os.Parcelable {
- ctor public TetheredClient(@NonNull android.net.MacAddress, @NonNull java.util.Collection<android.net.TetheredClient.AddressInfo>, int);
- method public int describeContents();
- method @NonNull public java.util.List<android.net.TetheredClient.AddressInfo> getAddresses();
- method @NonNull public android.net.MacAddress getMacAddress();
- method public int getTetheringType();
- method public void writeToParcel(@NonNull android.os.Parcel, int);
- field @NonNull public static final android.os.Parcelable.Creator<android.net.TetheredClient> CREATOR;
- }
-
- public static final class TetheredClient.AddressInfo implements android.os.Parcelable {
- method public int describeContents();
- method @NonNull public android.net.LinkAddress getAddress();
- method @Nullable public String getHostname();
- method public void writeToParcel(@NonNull android.os.Parcel, int);
- field @NonNull public static final android.os.Parcelable.Creator<android.net.TetheredClient.AddressInfo> CREATOR;
- }
-
- public final class TetheringInterface implements android.os.Parcelable {
- ctor public TetheringInterface(int, @NonNull String);
- method public int describeContents();
- method @NonNull public String getInterface();
- method public int getType();
- method public void writeToParcel(@NonNull android.os.Parcel, int);
- field @NonNull public static final android.os.Parcelable.Creator<android.net.TetheringInterface> CREATOR;
- }
-
- public class TetheringManager {
- method @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE) public void registerTetheringEventCallback(@NonNull java.util.concurrent.Executor, @NonNull android.net.TetheringManager.TetheringEventCallback);
- method @RequiresPermission(anyOf={android.Manifest.permission.TETHER_PRIVILEGED, android.Manifest.permission.WRITE_SETTINGS}) public void requestLatestTetheringEntitlementResult(int, boolean, @NonNull java.util.concurrent.Executor, @NonNull android.net.TetheringManager.OnTetheringEntitlementResultListener);
- method @RequiresPermission(anyOf={android.Manifest.permission.TETHER_PRIVILEGED, android.Manifest.permission.WRITE_SETTINGS}) public void startTethering(@NonNull android.net.TetheringManager.TetheringRequest, @NonNull java.util.concurrent.Executor, @NonNull android.net.TetheringManager.StartTetheringCallback);
- method @RequiresPermission(anyOf={android.Manifest.permission.TETHER_PRIVILEGED, android.Manifest.permission.WRITE_SETTINGS}) public void stopAllTethering();
- method @RequiresPermission(anyOf={android.Manifest.permission.TETHER_PRIVILEGED, android.Manifest.permission.WRITE_SETTINGS}) public void stopTethering(int);
- method @RequiresPermission(anyOf={android.Manifest.permission.TETHER_PRIVILEGED, android.Manifest.permission.ACCESS_NETWORK_STATE}) public void unregisterTetheringEventCallback(@NonNull android.net.TetheringManager.TetheringEventCallback);
- field @Deprecated public static final String ACTION_TETHER_STATE_CHANGED = "android.net.conn.TETHER_STATE_CHANGED";
- field public static final int CONNECTIVITY_SCOPE_GLOBAL = 1; // 0x1
- field public static final int CONNECTIVITY_SCOPE_LOCAL = 2; // 0x2
- field public static final String EXTRA_ACTIVE_LOCAL_ONLY = "android.net.extra.ACTIVE_LOCAL_ONLY";
- field public static final String EXTRA_ACTIVE_TETHER = "tetherArray";
- field public static final String EXTRA_AVAILABLE_TETHER = "availableArray";
- field public static final String EXTRA_ERRORED_TETHER = "erroredArray";
- field public static final int TETHERING_BLUETOOTH = 2; // 0x2
- field public static final int TETHERING_ETHERNET = 5; // 0x5
- field public static final int TETHERING_INVALID = -1; // 0xffffffff
- field public static final int TETHERING_NCM = 4; // 0x4
- field public static final int TETHERING_USB = 1; // 0x1
- field public static final int TETHERING_WIFI = 0; // 0x0
- field public static final int TETHERING_WIFI_P2P = 3; // 0x3
- field public static final int TETHER_ERROR_DHCPSERVER_ERROR = 12; // 0xc
- field public static final int TETHER_ERROR_DISABLE_FORWARDING_ERROR = 9; // 0x9
- field public static final int TETHER_ERROR_ENABLE_FORWARDING_ERROR = 8; // 0x8
- field public static final int TETHER_ERROR_ENTITLEMENT_UNKNOWN = 13; // 0xd
- field public static final int TETHER_ERROR_IFACE_CFG_ERROR = 10; // 0xa
- field public static final int TETHER_ERROR_INTERNAL_ERROR = 5; // 0x5
- field public static final int TETHER_ERROR_NO_ACCESS_TETHERING_PERMISSION = 15; // 0xf
- field public static final int TETHER_ERROR_NO_CHANGE_TETHERING_PERMISSION = 14; // 0xe
- field public static final int TETHER_ERROR_NO_ERROR = 0; // 0x0
- field public static final int TETHER_ERROR_PROVISIONING_FAILED = 11; // 0xb
- field public static final int TETHER_ERROR_SERVICE_UNAVAIL = 2; // 0x2
- field public static final int TETHER_ERROR_TETHER_IFACE_ERROR = 6; // 0x6
- field public static final int TETHER_ERROR_UNAVAIL_IFACE = 4; // 0x4
- field public static final int TETHER_ERROR_UNKNOWN_IFACE = 1; // 0x1
- field public static final int TETHER_ERROR_UNKNOWN_TYPE = 16; // 0x10
- field public static final int TETHER_ERROR_UNSUPPORTED = 3; // 0x3
- field public static final int TETHER_ERROR_UNTETHER_IFACE_ERROR = 7; // 0x7
- field public static final int TETHER_HARDWARE_OFFLOAD_FAILED = 2; // 0x2
- field public static final int TETHER_HARDWARE_OFFLOAD_STARTED = 1; // 0x1
- field public static final int TETHER_HARDWARE_OFFLOAD_STOPPED = 0; // 0x0
- }
-
- public static interface TetheringManager.OnTetheringEntitlementResultListener {
- method public void onTetheringEntitlementResult(int);
- }
-
- public static interface TetheringManager.StartTetheringCallback {
- method public default void onTetheringFailed(int);
- method public default void onTetheringStarted();
- }
-
- public static interface TetheringManager.TetheringEventCallback {
- method public default void onClientsChanged(@NonNull java.util.Collection<android.net.TetheredClient>);
- method public default void onError(@NonNull String, int);
- method public default void onError(@NonNull android.net.TetheringInterface, int);
- method public default void onLocalOnlyInterfacesChanged(@NonNull java.util.List<java.lang.String>);
- method public default void onLocalOnlyInterfacesChanged(@NonNull java.util.Set<android.net.TetheringInterface>);
- method public default void onOffloadStatusChanged(int);
- method public default void onTetherableInterfacesChanged(@NonNull java.util.List<java.lang.String>);
- method public default void onTetherableInterfacesChanged(@NonNull java.util.Set<android.net.TetheringInterface>);
- method public default void onTetheredInterfacesChanged(@NonNull java.util.List<java.lang.String>);
- method public default void onTetheredInterfacesChanged(@NonNull java.util.Set<android.net.TetheringInterface>);
- method public default void onTetheringSupported(boolean);
- method public default void onUpstreamChanged(@Nullable android.net.Network);
- }
-
- public static class TetheringManager.TetheringRequest {
- method @Nullable public android.net.LinkAddress getClientStaticIpv4Address();
- method public int getConnectivityScope();
- method @Nullable public android.net.LinkAddress getLocalIpv4Address();
- method public boolean getShouldShowEntitlementUi();
- method public int getTetheringType();
- method public boolean isExemptFromEntitlementCheck();
- }
-
- public static class TetheringManager.TetheringRequest.Builder {
- ctor public TetheringManager.TetheringRequest.Builder(int);
- method @NonNull public android.net.TetheringManager.TetheringRequest build();
- method @NonNull @RequiresPermission(android.Manifest.permission.TETHER_PRIVILEGED) public android.net.TetheringManager.TetheringRequest.Builder setConnectivityScope(int);
- method @NonNull @RequiresPermission(android.Manifest.permission.TETHER_PRIVILEGED) public android.net.TetheringManager.TetheringRequest.Builder setExemptFromEntitlementCheck(boolean);
- method @NonNull @RequiresPermission(android.Manifest.permission.TETHER_PRIVILEGED) public android.net.TetheringManager.TetheringRequest.Builder setShouldShowEntitlementUi(boolean);
- method @NonNull @RequiresPermission(android.Manifest.permission.TETHER_PRIVILEGED) public android.net.TetheringManager.TetheringRequest.Builder setStaticIpv4Addresses(@NonNull android.net.LinkAddress, @NonNull android.net.LinkAddress);
- }
-
-}
-
diff --git a/Tethering/jni/com_android_networkstack_tethering_util_TetheringUtils.cpp b/Tethering/jni/com_android_networkstack_tethering_util_TetheringUtils.cpp
index 6699c0d..14e4b9a 100644
--- a/Tethering/jni/com_android_networkstack_tethering_util_TetheringUtils.cpp
+++ b/Tethering/jni/com_android_networkstack_tethering_util_TetheringUtils.cpp
@@ -18,21 +18,19 @@
#include <error.h>
#include <jni.h>
#include <linux/filter.h>
+#include <linux/ipv6.h>
#include <nativehelper/JNIHelp.h>
#include <nativehelper/ScopedUtfChars.h>
#include <netjniutils/netjniutils.h>
#include <net/if.h>
#include <netinet/ether.h>
-#include <netinet/ip6.h>
#include <netinet/icmp6.h>
#include <sys/socket.h>
#include <stdio.h>
-namespace android {
+#include <bpf/BpfClassic.h>
-static const uint32_t kIPv6NextHeaderOffset = offsetof(ip6_hdr, ip6_nxt);
-static const uint32_t kIPv6PayloadStart = sizeof(ip6_hdr);
-static const uint32_t kICMPv6TypeOffset = kIPv6PayloadStart + offsetof(icmp6_hdr, icmp6_type);
+namespace android {
static void throwSocketException(JNIEnv *env, const char* msg, int error) {
jniThrowExceptionFmt(env, "java/net/SocketException", "%s: %s", msg, strerror(error));
@@ -42,18 +40,14 @@
uint32_t type) {
sock_filter filter_code[] = {
// Check header is ICMPv6.
- BPF_STMT(BPF_LD | BPF_B | BPF_ABS, kIPv6NextHeaderOffset),
- BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, IPPROTO_ICMPV6, 0, 3),
+ BPF_LOAD_IPV6_U8(nexthdr),
+ BPF2_REJECT_IF_NOT_EQUAL(IPPROTO_ICMPV6),
// Check ICMPv6 type.
- BPF_STMT(BPF_LD | BPF_B | BPF_ABS, kICMPv6TypeOffset),
- BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, type, 0, 1),
+ BPF_LOAD_NET_RELATIVE_U8(sizeof(ipv6hdr) + offsetof(icmp6_hdr, icmp6_type)),
+ BPF2_REJECT_IF_NOT_EQUAL(type),
- // Accept.
- BPF_STMT(BPF_RET | BPF_K, 0xffff),
-
- // Reject.
- BPF_STMT(BPF_RET | BPF_K, 0)
+ BPF_ACCEPT,
};
const sock_fprog filter = {
@@ -67,17 +61,17 @@
}
}
-static void com_android_networkstack_tethering_util_setupNaSocket(JNIEnv *env, jobject clazz,
+static void com_android_networkstack_tethering_util_setupNaSocket(JNIEnv *env, jclass clazz,
jobject javaFd) {
com_android_networkstack_tethering_util_setupIcmpFilter(env, javaFd, ND_NEIGHBOR_ADVERT);
}
-static void com_android_networkstack_tethering_util_setupNsSocket(JNIEnv *env, jobject clazz,
+static void com_android_networkstack_tethering_util_setupNsSocket(JNIEnv *env, jclass clazz,
jobject javaFd) {
com_android_networkstack_tethering_util_setupIcmpFilter(env, javaFd, ND_NEIGHBOR_SOLICIT);
}
-static void com_android_networkstack_tethering_util_setupRaSocket(JNIEnv *env, jobject clazz,
+static void com_android_networkstack_tethering_util_setupRaSocket(JNIEnv *env, jclass clazz,
jobject javaFd, jint ifIndex) {
static const int kLinkLocalHopLimit = 255;
diff --git a/Tethering/res/values-af/strings.xml b/Tethering/res/values-af/strings.xml
index 056168b..3790142 100644
--- a/Tethering/res/values-af/strings.xml
+++ b/Tethering/res/values-af/strings.xml
@@ -16,14 +16,14 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="tethered_notification_title" msgid="6426563586025792944">"Verbinding of warmkol is aktief"</string>
- <string name="tethered_notification_message" msgid="64800879503420696">"Tik om op te stel."</string>
- <string name="disable_tether_notification_title" msgid="3004509127903564191">"Verbinding is gedeaktiveer"</string>
- <string name="disable_tether_notification_message" msgid="6717523799293901476">"Kontak jou administrateur vir besonderhede"</string>
- <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Warmkol- en verbindingstatus"</string>
- <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
- <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
- <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
- <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
- <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
+ <string name="tethered_notification_title" msgid="5350162111436634622">"Verbinding of warmkol is aktief"</string>
+ <string name="tethered_notification_message" msgid="2338023450330652098">"Tik om op te stel."</string>
+ <string name="disable_tether_notification_title" msgid="3183576627492925522">"Verbinding is gedeaktiveer"</string>
+ <string name="disable_tether_notification_message" msgid="6655882039707534929">"Kontak jou admin vir besonderhede"</string>
+ <string name="notification_channel_tethering_status" msgid="7030733422705019001">"Warmkol- en verbindingstatus"</string>
+ <string name="no_upstream_notification_title" msgid="2052743091868702475"></string>
+ <string name="no_upstream_notification_message" msgid="6932020551635470134"></string>
+ <string name="no_upstream_notification_disable_button" msgid="8836277213343697023"></string>
+ <string name="upstream_roaming_notification_title" msgid="8614262557406849762"></string>
+ <string name="upstream_roaming_notification_message" msgid="5999740876323106599"></string>
</resources>
diff --git a/Tethering/res/values-am/strings.xml b/Tethering/res/values-am/strings.xml
index ac468dd..bb89d6e 100644
--- a/Tethering/res/values-am/strings.xml
+++ b/Tethering/res/values-am/strings.xml
@@ -16,14 +16,14 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="tethered_notification_title" msgid="6426563586025792944">"እንደ ሞደም መሰካት ወይም መገናኛ ነጥብ ገባሪ"</string>
- <string name="tethered_notification_message" msgid="64800879503420696">"ለማዋቀር መታ ያድርጉ።"</string>
- <string name="disable_tether_notification_title" msgid="3004509127903564191">"እንደ ሞደም መሰካት ተሰናክሏል"</string>
- <string name="disable_tether_notification_message" msgid="6717523799293901476">"ለዝርዝሮች የእርስዎን አስተዳዳሪ ያነጋግሩ"</string>
- <string name="notification_channel_tethering_status" msgid="2663463891530932727">"መገናኛ ነጥብ እና እንደ ሞደም የመሰካት ሁኔታ"</string>
- <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
- <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
- <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
- <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
- <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
+ <string name="tethered_notification_title" msgid="5350162111436634622">"እንደ ሞደም መሰካት ወይም መገናኛ ነጥብ ገባሪ"</string>
+ <string name="tethered_notification_message" msgid="2338023450330652098">"ለማዋቀር መታ ያድርጉ።"</string>
+ <string name="disable_tether_notification_title" msgid="3183576627492925522">"እንደ ሞደም መሰካት ተሰናክሏል"</string>
+ <string name="disable_tether_notification_message" msgid="6655882039707534929">"ለዝርዝሮች የእርስዎን አስተዳዳሪ ያነጋግሩ"</string>
+ <string name="notification_channel_tethering_status" msgid="7030733422705019001">"መገናኛ ነጥብ እና እንደ ሞደም የመሰካት ሁኔታ"</string>
+ <string name="no_upstream_notification_title" msgid="2052743091868702475"></string>
+ <string name="no_upstream_notification_message" msgid="6932020551635470134"></string>
+ <string name="no_upstream_notification_disable_button" msgid="8836277213343697023"></string>
+ <string name="upstream_roaming_notification_title" msgid="8614262557406849762"></string>
+ <string name="upstream_roaming_notification_message" msgid="5999740876323106599"></string>
</resources>
diff --git a/Tethering/res/values-ar/strings.xml b/Tethering/res/values-ar/strings.xml
index 7d5bad3..ef98a01 100644
--- a/Tethering/res/values-ar/strings.xml
+++ b/Tethering/res/values-ar/strings.xml
@@ -16,14 +16,14 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="tethered_notification_title" msgid="6426563586025792944">"النطاق نشط أو نقطة الاتصال نشطة"</string>
- <string name="tethered_notification_message" msgid="64800879503420696">"انقر للإعداد."</string>
- <string name="disable_tether_notification_title" msgid="3004509127903564191">"التوصيل متوقف."</string>
- <string name="disable_tether_notification_message" msgid="6717523799293901476">"تواصَل مع المشرف للحصول على التفاصيل."</string>
- <string name="notification_channel_tethering_status" msgid="2663463891530932727">"حالة نقطة الاتصال والتوصيل"</string>
- <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
- <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
- <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
- <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
- <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
+ <string name="tethered_notification_title" msgid="5350162111436634622">"نقطة التوصيل نشطة أو الاتصال نشط"</string>
+ <string name="tethered_notification_message" msgid="2338023450330652098">"انقر لإعداد التوصيل."</string>
+ <string name="disable_tether_notification_title" msgid="3183576627492925522">"التوصيل غير مفعَّل"</string>
+ <string name="disable_tether_notification_message" msgid="6655882039707534929">"تواصَل مع المشرف للحصول على التفاصيل."</string>
+ <string name="notification_channel_tethering_status" msgid="7030733422705019001">"حالة نقطة الاتصال والتوصيل"</string>
+ <string name="no_upstream_notification_title" msgid="2052743091868702475"></string>
+ <string name="no_upstream_notification_message" msgid="6932020551635470134"></string>
+ <string name="no_upstream_notification_disable_button" msgid="8836277213343697023"></string>
+ <string name="upstream_roaming_notification_title" msgid="8614262557406849762"></string>
+ <string name="upstream_roaming_notification_message" msgid="5999740876323106599"></string>
</resources>
diff --git a/Tethering/res/values-as/strings.xml b/Tethering/res/values-as/strings.xml
index 0913504..9b9e8d6 100644
--- a/Tethering/res/values-as/strings.xml
+++ b/Tethering/res/values-as/strings.xml
@@ -16,14 +16,14 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="tethered_notification_title" msgid="6426563586025792944">"টে\'ডাৰিং অথবা হ\'টস্প\'ট সক্ৰিয় অৱস্থাত আছে"</string>
- <string name="tethered_notification_message" msgid="64800879503420696">"ছেট আপ কৰিবলৈ টিপক।"</string>
- <string name="disable_tether_notification_title" msgid="3004509127903564191">"টে\'ডাৰিঙৰ সুবিধাটো অক্ষম কৰি থোৱা হৈছে"</string>
- <string name="disable_tether_notification_message" msgid="6717523799293901476">"সবিশেষ জানিবলৈ আপোনাৰ প্ৰশাসকৰ সৈতে যোগাযোগ কৰক"</string>
- <string name="notification_channel_tethering_status" msgid="2663463891530932727">"হ’টস্প\'ট আৰু টে\'ডাৰিঙৰ স্থিতি"</string>
- <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
- <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
- <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
- <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
- <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
+ <string name="tethered_notification_title" msgid="5350162111436634622">"টে’ডাৰিং অথবা হ’টস্প’ট সক্ৰিয় অৱস্থাত আছে"</string>
+ <string name="tethered_notification_message" msgid="2338023450330652098">"ছেট আপ কৰিবলৈ টিপক।"</string>
+ <string name="disable_tether_notification_title" msgid="3183576627492925522">"টে’ডাৰিঙৰ সুবিধাটো অক্ষম কৰি থোৱা হৈছে"</string>
+ <string name="disable_tether_notification_message" msgid="6655882039707534929">"সবিশেষ জানিবলৈ আপোনাৰ প্ৰশাসকৰ সৈতে যোগাযোগ কৰক"</string>
+ <string name="notification_channel_tethering_status" msgid="7030733422705019001">"হ’টস্প’ট আৰু টে’ডাৰিঙৰ স্থিতি"</string>
+ <string name="no_upstream_notification_title" msgid="2052743091868702475"></string>
+ <string name="no_upstream_notification_message" msgid="6932020551635470134"></string>
+ <string name="no_upstream_notification_disable_button" msgid="8836277213343697023"></string>
+ <string name="upstream_roaming_notification_title" msgid="8614262557406849762"></string>
+ <string name="upstream_roaming_notification_message" msgid="5999740876323106599"></string>
</resources>
diff --git a/Tethering/res/values-az/strings.xml b/Tethering/res/values-az/strings.xml
index dce70da..b091f15 100644
--- a/Tethering/res/values-az/strings.xml
+++ b/Tethering/res/values-az/strings.xml
@@ -16,14 +16,14 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="tethered_notification_title" msgid="6426563586025792944">"Birləşmə və ya hotspot aktivdir"</string>
- <string name="tethered_notification_message" msgid="64800879503420696">"Ayarlamaq üçün toxunun."</string>
- <string name="disable_tether_notification_title" msgid="3004509127903564191">"Birləşmə deaktivdir"</string>
- <string name="disable_tether_notification_message" msgid="6717523799293901476">"Detallar üçün adminlə əlaqə saxlayın"</string>
- <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Hotspot & birləşmə statusu"</string>
- <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
- <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
- <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
- <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
- <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
+ <string name="tethered_notification_title" msgid="5350162111436634622">"Modem rejimi və ya hotspot aktivdir"</string>
+ <string name="tethered_notification_message" msgid="2338023450330652098">"Ayarlamaq üçün toxunun."</string>
+ <string name="disable_tether_notification_title" msgid="3183576627492925522">"Modem rejimi deaktivdir"</string>
+ <string name="disable_tether_notification_message" msgid="6655882039707534929">"Detallar üçün adminlə əlaqə saxlayın"</string>
+ <string name="notification_channel_tethering_status" msgid="7030733422705019001">"Hotspot və modem rejimi statusu"</string>
+ <string name="no_upstream_notification_title" msgid="2052743091868702475"></string>
+ <string name="no_upstream_notification_message" msgid="6932020551635470134"></string>
+ <string name="no_upstream_notification_disable_button" msgid="8836277213343697023"></string>
+ <string name="upstream_roaming_notification_title" msgid="8614262557406849762"></string>
+ <string name="upstream_roaming_notification_message" msgid="5999740876323106599"></string>
</resources>
diff --git a/Tethering/res/values-b+sr+Latn/strings.xml b/Tethering/res/values-b+sr+Latn/strings.xml
index b0774ec..aa6c6fd 100644
--- a/Tethering/res/values-b+sr+Latn/strings.xml
+++ b/Tethering/res/values-b+sr+Latn/strings.xml
@@ -16,14 +16,14 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="tethered_notification_title" msgid="6426563586025792944">"Privezivanje ili hotspot je aktivan"</string>
- <string name="tethered_notification_message" msgid="64800879503420696">"Dodirnite da biste podesili."</string>
- <string name="disable_tether_notification_title" msgid="3004509127903564191">"Privezivanje je onemogućeno"</string>
- <string name="disable_tether_notification_message" msgid="6717523799293901476">"Potražite detalje od administratora"</string>
- <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Status hotspota i privezivanja"</string>
- <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
- <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
- <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
- <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
- <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
+ <string name="tethered_notification_title" msgid="5350162111436634622">"Aktivno je privezivanje ili hotspot"</string>
+ <string name="tethered_notification_message" msgid="2338023450330652098">"Dodirnite da biste podesili."</string>
+ <string name="disable_tether_notification_title" msgid="3183576627492925522">"Privezivanje je onemogućeno"</string>
+ <string name="disable_tether_notification_message" msgid="6655882039707534929">"Potražite detalje od administratora"</string>
+ <string name="notification_channel_tethering_status" msgid="7030733422705019001">"Status hotspota i privezivanja"</string>
+ <string name="no_upstream_notification_title" msgid="2052743091868702475"></string>
+ <string name="no_upstream_notification_message" msgid="6932020551635470134"></string>
+ <string name="no_upstream_notification_disable_button" msgid="8836277213343697023"></string>
+ <string name="upstream_roaming_notification_title" msgid="8614262557406849762"></string>
+ <string name="upstream_roaming_notification_message" msgid="5999740876323106599"></string>
</resources>
diff --git a/Tethering/res/values-be/strings.xml b/Tethering/res/values-be/strings.xml
index a8acebe..5da8828 100644
--- a/Tethering/res/values-be/strings.xml
+++ b/Tethering/res/values-be/strings.xml
@@ -16,14 +16,14 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="tethered_notification_title" msgid="6426563586025792944">"Мадэм або хот-спот актыўныя"</string>
- <string name="tethered_notification_message" msgid="64800879503420696">"Дакраніцеся, каб наладзіць."</string>
- <string name="disable_tether_notification_title" msgid="3004509127903564191">"Рэжым мадэма выключаны"</string>
- <string name="disable_tether_notification_message" msgid="6717523799293901476">"Звярніцеся да адміністратара па падрабязную інфармацыю"</string>
- <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Стан \"Хот-спот і мадэм\""</string>
- <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
- <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
- <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
- <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
- <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
+ <string name="tethered_notification_title" msgid="5350162111436634622">"Мадэм або хот-спот актыўныя"</string>
+ <string name="tethered_notification_message" msgid="2338023450330652098">"Націсніце, каб наладзіць."</string>
+ <string name="disable_tether_notification_title" msgid="3183576627492925522">"Рэжым мадэма выключаны"</string>
+ <string name="disable_tether_notification_message" msgid="6655882039707534929">"Звярніцеся да адміністратара па падрабязную інфармацыю"</string>
+ <string name="notification_channel_tethering_status" msgid="7030733422705019001">"Стан \"Хот-спот і мадэм\""</string>
+ <string name="no_upstream_notification_title" msgid="2052743091868702475"></string>
+ <string name="no_upstream_notification_message" msgid="6932020551635470134"></string>
+ <string name="no_upstream_notification_disable_button" msgid="8836277213343697023"></string>
+ <string name="upstream_roaming_notification_title" msgid="8614262557406849762"></string>
+ <string name="upstream_roaming_notification_message" msgid="5999740876323106599"></string>
</resources>
diff --git a/Tethering/res/values-bg/strings.xml b/Tethering/res/values-bg/strings.xml
index 94fb2d8..0ce2ac7 100644
--- a/Tethering/res/values-bg/strings.xml
+++ b/Tethering/res/values-bg/strings.xml
@@ -16,14 +16,14 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="tethered_notification_title" msgid="6426563586025792944">"Има активна споделена връзка или точка за достъп"</string>
- <string name="tethered_notification_message" msgid="64800879503420696">"Докоснете, за да настроите."</string>
- <string name="disable_tether_notification_title" msgid="3004509127903564191">"Функцията за тетъринг е деактивирана"</string>
- <string name="disable_tether_notification_message" msgid="6717523799293901476">"Свържете се с администратора си за подробности"</string>
- <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Състояние на функцията за точка за достъп и тетъринг"</string>
- <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
- <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
- <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
- <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
- <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
+ <string name="tethered_notification_title" msgid="5350162111436634622">"Има активна споделена връзка или точка за достъп"</string>
+ <string name="tethered_notification_message" msgid="2338023450330652098">"Докоснете, за да настроите."</string>
+ <string name="disable_tether_notification_title" msgid="3183576627492925522">"Функцията за тетъринг е деактивирана"</string>
+ <string name="disable_tether_notification_message" msgid="6655882039707534929">"Свържете се с администратора си за подробности"</string>
+ <string name="notification_channel_tethering_status" msgid="7030733422705019001">"Състояние на функцията за точка за достъп и тетъринг"</string>
+ <string name="no_upstream_notification_title" msgid="2052743091868702475"></string>
+ <string name="no_upstream_notification_message" msgid="6932020551635470134"></string>
+ <string name="no_upstream_notification_disable_button" msgid="8836277213343697023"></string>
+ <string name="upstream_roaming_notification_title" msgid="8614262557406849762"></string>
+ <string name="upstream_roaming_notification_message" msgid="5999740876323106599"></string>
</resources>
diff --git a/Tethering/res/values-bn/strings.xml b/Tethering/res/values-bn/strings.xml
index aea02b9..787a65c 100644
--- a/Tethering/res/values-bn/strings.xml
+++ b/Tethering/res/values-bn/strings.xml
@@ -16,14 +16,14 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="tethered_notification_title" msgid="6426563586025792944">"টিথারিং বা হটস্পট চালু আছে"</string>
- <string name="tethered_notification_message" msgid="64800879503420696">"সেট-আপ করতে ট্যাপ করুন।"</string>
- <string name="disable_tether_notification_title" msgid="3004509127903564191">"টিথারিং বন্ধ করা আছে"</string>
- <string name="disable_tether_notification_message" msgid="6717523799293901476">"বিশদে জানতে অ্যাডমিনের সাথে যোগাযোগ করুন"</string>
- <string name="notification_channel_tethering_status" msgid="2663463891530932727">"হটস্পট ও টিথারিং স্ট্যাটাস"</string>
- <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
- <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
- <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
- <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
- <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
+ <string name="tethered_notification_title" msgid="5350162111436634622">"টেথারিং বা হটস্পট অ্যাক্টিভ আছে"</string>
+ <string name="tethered_notification_message" msgid="2338023450330652098">"সেট-আপ করতে ট্যাপ করুন।"</string>
+ <string name="disable_tether_notification_title" msgid="3183576627492925522">"টেথারিং বন্ধ করা আছে"</string>
+ <string name="disable_tether_notification_message" msgid="6655882039707534929">"বিস্তারিত বিবরণ পেতে, অ্যাডমিনের সাথে যোগাযোগ করুন"</string>
+ <string name="notification_channel_tethering_status" msgid="7030733422705019001">"হটস্পট ও টেথারিং সংক্রান্ত স্ট্যাটাস"</string>
+ <string name="no_upstream_notification_title" msgid="2052743091868702475"></string>
+ <string name="no_upstream_notification_message" msgid="6932020551635470134"></string>
+ <string name="no_upstream_notification_disable_button" msgid="8836277213343697023"></string>
+ <string name="upstream_roaming_notification_title" msgid="8614262557406849762"></string>
+ <string name="upstream_roaming_notification_message" msgid="5999740876323106599"></string>
</resources>
diff --git a/Tethering/res/values-bs/strings.xml b/Tethering/res/values-bs/strings.xml
index de23272..b6073fd 100644
--- a/Tethering/res/values-bs/strings.xml
+++ b/Tethering/res/values-bs/strings.xml
@@ -16,14 +16,14 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="tethered_notification_title" msgid="6426563586025792944">"Aktivno je povezivanje putem mobitela ili pristupna tačka"</string>
- <string name="tethered_notification_message" msgid="64800879503420696">"Dodirnite da postavite."</string>
- <string name="disable_tether_notification_title" msgid="3004509127903564191">"Povezivanje putem mobitela je onemogućeno"</string>
- <string name="disable_tether_notification_message" msgid="6717523799293901476">"Kontaktirajte svog administratora za detalje"</string>
- <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Status pristupne tačke i povezivanja putem mobitela"</string>
- <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
- <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
- <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
- <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
- <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
+ <string name="tethered_notification_title" msgid="5350162111436634622">"Dijeljenje internetske veze ili pristupna tačka su aktivni"</string>
+ <string name="tethered_notification_message" msgid="2338023450330652098">"Dodirnite da postavite."</string>
+ <string name="disable_tether_notification_title" msgid="3183576627492925522">"Dijeljenje internetske veze je onemogućeno"</string>
+ <string name="disable_tether_notification_message" msgid="6655882039707534929">"Kontaktirajte administratora za detalje"</string>
+ <string name="notification_channel_tethering_status" msgid="7030733422705019001">"Status pristupne tačke i dijeljenja internetske veze"</string>
+ <string name="no_upstream_notification_title" msgid="2052743091868702475"></string>
+ <string name="no_upstream_notification_message" msgid="6932020551635470134"></string>
+ <string name="no_upstream_notification_disable_button" msgid="8836277213343697023"></string>
+ <string name="upstream_roaming_notification_title" msgid="8614262557406849762"></string>
+ <string name="upstream_roaming_notification_message" msgid="5999740876323106599"></string>
</resources>
diff --git a/Tethering/res/values-ca/strings.xml b/Tethering/res/values-ca/strings.xml
index 88b795c..2513989 100644
--- a/Tethering/res/values-ca/strings.xml
+++ b/Tethering/res/values-ca/strings.xml
@@ -16,14 +16,14 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="tethered_notification_title" msgid="6426563586025792944">"Compartició de xarxa o punt d\'accés Wi‑Fi actius"</string>
- <string name="tethered_notification_message" msgid="64800879503420696">"Toca per configurar."</string>
- <string name="disable_tether_notification_title" msgid="3004509127903564191">"La compartició de xarxa està desactivada"</string>
- <string name="disable_tether_notification_message" msgid="6717523799293901476">"Contacta amb el teu administrador per obtenir més informació"</string>
- <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Estat del punt d\'accés Wi‑Fi i de la compartició de xarxa"</string>
- <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
- <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
- <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
- <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
- <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
+ <string name="tethered_notification_title" msgid="5350162111436634622">"Compartició de xarxa o punt d\'accés Wi‑Fi actius"</string>
+ <string name="tethered_notification_message" msgid="2338023450330652098">"Toca per configurar."</string>
+ <string name="disable_tether_notification_title" msgid="3183576627492925522">"La compartició de xarxa està desactivada"</string>
+ <string name="disable_tether_notification_message" msgid="6655882039707534929">"Contacta amb el teu administrador per obtenir més informació"</string>
+ <string name="notification_channel_tethering_status" msgid="7030733422705019001">"Estat del punt d\'accés Wi‑Fi i de la compartició de xarxa"</string>
+ <string name="no_upstream_notification_title" msgid="2052743091868702475"></string>
+ <string name="no_upstream_notification_message" msgid="6932020551635470134"></string>
+ <string name="no_upstream_notification_disable_button" msgid="8836277213343697023"></string>
+ <string name="upstream_roaming_notification_title" msgid="8614262557406849762"></string>
+ <string name="upstream_roaming_notification_message" msgid="5999740876323106599"></string>
</resources>
diff --git a/Tethering/res/values-cs/strings.xml b/Tethering/res/values-cs/strings.xml
index 8c1b83b..a749915 100644
--- a/Tethering/res/values-cs/strings.xml
+++ b/Tethering/res/values-cs/strings.xml
@@ -16,14 +16,14 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="tethered_notification_title" msgid="6426563586025792944">"Tethering nebo hotspot je aktivní"</string>
- <string name="tethered_notification_message" msgid="64800879503420696">"Klepnutím zahájíte nastavení."</string>
- <string name="disable_tether_notification_title" msgid="3004509127903564191">"Tethering je zakázán"</string>
- <string name="disable_tether_notification_message" msgid="6717523799293901476">"O podrobnosti požádejte administrátora"</string>
- <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Stav hotspotu a tetheringu"</string>
- <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
- <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
- <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
- <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
- <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
+ <string name="tethered_notification_title" msgid="5350162111436634622">"Tethering nebo hotspot je aktivní"</string>
+ <string name="tethered_notification_message" msgid="2338023450330652098">"Klepnutím ho nastavíte."</string>
+ <string name="disable_tether_notification_title" msgid="3183576627492925522">"Tethering je zakázán"</string>
+ <string name="disable_tether_notification_message" msgid="6655882039707534929">"O podrobnosti požádejte administrátora"</string>
+ <string name="notification_channel_tethering_status" msgid="7030733422705019001">"Stav hotspotu a tetheringu"</string>
+ <string name="no_upstream_notification_title" msgid="2052743091868702475"></string>
+ <string name="no_upstream_notification_message" msgid="6932020551635470134"></string>
+ <string name="no_upstream_notification_disable_button" msgid="8836277213343697023"></string>
+ <string name="upstream_roaming_notification_title" msgid="8614262557406849762"></string>
+ <string name="upstream_roaming_notification_message" msgid="5999740876323106599"></string>
</resources>
diff --git a/Tethering/res/values-da/strings.xml b/Tethering/res/values-da/strings.xml
index f413e70..dddf097 100644
--- a/Tethering/res/values-da/strings.xml
+++ b/Tethering/res/values-da/strings.xml
@@ -16,14 +16,14 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="tethered_notification_title" msgid="6426563586025792944">"Netdeling eller hotspot er aktivt"</string>
- <string name="tethered_notification_message" msgid="64800879503420696">"Tryk for at konfigurere."</string>
- <string name="disable_tether_notification_title" msgid="3004509127903564191">"Netdeling er deaktiveret"</string>
- <string name="disable_tether_notification_message" msgid="6717523799293901476">"Kontakt din administrator for at få oplysninger"</string>
- <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Status for hotspot og netdeling"</string>
- <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
- <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
- <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
- <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
- <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
+ <string name="tethered_notification_title" msgid="5350162111436634622">"Netdeling eller hotspot er aktiveret"</string>
+ <string name="tethered_notification_message" msgid="2338023450330652098">"Tryk for at konfigurere."</string>
+ <string name="disable_tether_notification_title" msgid="3183576627492925522">"Netdeling er deaktiveret"</string>
+ <string name="disable_tether_notification_message" msgid="6655882039707534929">"Kontakt din administrator for at få oplysninger"</string>
+ <string name="notification_channel_tethering_status" msgid="7030733422705019001">"Status for hotspot og netdeling"</string>
+ <string name="no_upstream_notification_title" msgid="2052743091868702475"></string>
+ <string name="no_upstream_notification_message" msgid="6932020551635470134"></string>
+ <string name="no_upstream_notification_disable_button" msgid="8836277213343697023"></string>
+ <string name="upstream_roaming_notification_title" msgid="8614262557406849762"></string>
+ <string name="upstream_roaming_notification_message" msgid="5999740876323106599"></string>
</resources>
diff --git a/Tethering/res/values-de/strings.xml b/Tethering/res/values-de/strings.xml
index f057d78..ab7b8c9 100644
--- a/Tethering/res/values-de/strings.xml
+++ b/Tethering/res/values-de/strings.xml
@@ -16,14 +16,14 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="tethered_notification_title" msgid="6426563586025792944">"Tethering oder Hotspot aktiv"</string>
- <string name="tethered_notification_message" msgid="64800879503420696">"Zum Einrichten tippen."</string>
- <string name="disable_tether_notification_title" msgid="3004509127903564191">"Tethering ist deaktiviert"</string>
- <string name="disable_tether_notification_message" msgid="6717523799293901476">"Bitte wende dich für weitere Informationen an den Administrator"</string>
- <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Hotspot- und Tethering-Status"</string>
- <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
- <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
- <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
- <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
- <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
+ <string name="tethered_notification_title" msgid="5350162111436634622">"Tethering oder Hotspot aktiv"</string>
+ <string name="tethered_notification_message" msgid="2338023450330652098">"Zum Einrichten tippen."</string>
+ <string name="disable_tether_notification_title" msgid="3183576627492925522">"Tethering ist deaktiviert"</string>
+ <string name="disable_tether_notification_message" msgid="6655882039707534929">"Bitte wende dich für weitere Informationen an den Administrator"</string>
+ <string name="notification_channel_tethering_status" msgid="7030733422705019001">"Hotspot- und Tethering-Status"</string>
+ <string name="no_upstream_notification_title" msgid="2052743091868702475"></string>
+ <string name="no_upstream_notification_message" msgid="6932020551635470134"></string>
+ <string name="no_upstream_notification_disable_button" msgid="8836277213343697023"></string>
+ <string name="upstream_roaming_notification_title" msgid="8614262557406849762"></string>
+ <string name="upstream_roaming_notification_message" msgid="5999740876323106599"></string>
</resources>
diff --git a/Tethering/res/values-el/strings.xml b/Tethering/res/values-el/strings.xml
index b3c986b..4ed3ec5 100644
--- a/Tethering/res/values-el/strings.xml
+++ b/Tethering/res/values-el/strings.xml
@@ -16,14 +16,14 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="tethered_notification_title" msgid="6426563586025792944">"Πρόσδεση ή σύνδεση σημείου πρόσβασης ενεργή"</string>
- <string name="tethered_notification_message" msgid="64800879503420696">"Πατήστε για ρύθμιση."</string>
- <string name="disable_tether_notification_title" msgid="3004509127903564191">"Η σύνδεση είναι απενεργοποιημένη"</string>
- <string name="disable_tether_notification_message" msgid="6717523799293901476">"Επικοινωνήστε με τον διαχειριστή σας για λεπτομέρειες"</string>
- <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Κατάσταση σημείου πρόσβασης Wi-Fi και σύνδεσης"</string>
- <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
- <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
- <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
- <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
- <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
+ <string name="tethered_notification_title" msgid="5350162111436634622">"Ενεργή σύνδεση ή ενεργό σημείο πρόσβασης Wi-Fi"</string>
+ <string name="tethered_notification_message" msgid="2338023450330652098">"Πατήστε για ρύθμιση."</string>
+ <string name="disable_tether_notification_title" msgid="3183576627492925522">"Η σύνδεση είναι απενεργοποιημένη"</string>
+ <string name="disable_tether_notification_message" msgid="6655882039707534929">"Επικοινωνήστε με τον διαχειριστή για λεπτομέρειες"</string>
+ <string name="notification_channel_tethering_status" msgid="7030733422705019001">"Κατάσταση σημείου πρόσβασης Wi-Fi και σύνδεσης"</string>
+ <string name="no_upstream_notification_title" msgid="2052743091868702475"></string>
+ <string name="no_upstream_notification_message" msgid="6932020551635470134"></string>
+ <string name="no_upstream_notification_disable_button" msgid="8836277213343697023"></string>
+ <string name="upstream_roaming_notification_title" msgid="8614262557406849762"></string>
+ <string name="upstream_roaming_notification_message" msgid="5999740876323106599"></string>
</resources>
diff --git a/Tethering/res/values-en-rAU/strings.xml b/Tethering/res/values-en-rAU/strings.xml
index 769e012..2dc7689 100644
--- a/Tethering/res/values-en-rAU/strings.xml
+++ b/Tethering/res/values-en-rAU/strings.xml
@@ -16,14 +16,14 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="tethered_notification_title" msgid="6426563586025792944">"Tethering or hotspot active"</string>
- <string name="tethered_notification_message" msgid="64800879503420696">"Tap to set up."</string>
- <string name="disable_tether_notification_title" msgid="3004509127903564191">"Tethering is disabled"</string>
- <string name="disable_tether_notification_message" msgid="6717523799293901476">"Contact your admin for details"</string>
- <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Hotspot and tethering status"</string>
- <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
- <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
- <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
- <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
- <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
+ <string name="tethered_notification_title" msgid="5350162111436634622">"Tethering or hotspot active"</string>
+ <string name="tethered_notification_message" msgid="2338023450330652098">"Tap to set up."</string>
+ <string name="disable_tether_notification_title" msgid="3183576627492925522">"Tethering is disabled"</string>
+ <string name="disable_tether_notification_message" msgid="6655882039707534929">"Contact your admin for details"</string>
+ <string name="notification_channel_tethering_status" msgid="7030733422705019001">"Hotspot and tethering status"</string>
+ <string name="no_upstream_notification_title" msgid="2052743091868702475"></string>
+ <string name="no_upstream_notification_message" msgid="6932020551635470134"></string>
+ <string name="no_upstream_notification_disable_button" msgid="8836277213343697023"></string>
+ <string name="upstream_roaming_notification_title" msgid="8614262557406849762"></string>
+ <string name="upstream_roaming_notification_message" msgid="5999740876323106599"></string>
</resources>
diff --git a/Tethering/res/values-en-rCA/strings.xml b/Tethering/res/values-en-rCA/strings.xml
index 769e012..066cd82 100644
--- a/Tethering/res/values-en-rCA/strings.xml
+++ b/Tethering/res/values-en-rCA/strings.xml
@@ -16,14 +16,14 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="tethered_notification_title" msgid="6426563586025792944">"Tethering or hotspot active"</string>
- <string name="tethered_notification_message" msgid="64800879503420696">"Tap to set up."</string>
- <string name="disable_tether_notification_title" msgid="3004509127903564191">"Tethering is disabled"</string>
- <string name="disable_tether_notification_message" msgid="6717523799293901476">"Contact your admin for details"</string>
- <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Hotspot and tethering status"</string>
- <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
- <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
- <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
- <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
- <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
+ <string name="tethered_notification_title" msgid="5350162111436634622">"Tethering or hotspot active"</string>
+ <string name="tethered_notification_message" msgid="2338023450330652098">"Tap to set up."</string>
+ <string name="disable_tether_notification_title" msgid="3183576627492925522">"Tethering is disabled"</string>
+ <string name="disable_tether_notification_message" msgid="6655882039707534929">"Contact your admin for details"</string>
+ <string name="notification_channel_tethering_status" msgid="7030733422705019001">"Hotspot & tethering status"</string>
+ <string name="no_upstream_notification_title" msgid="2052743091868702475"></string>
+ <string name="no_upstream_notification_message" msgid="6932020551635470134"></string>
+ <string name="no_upstream_notification_disable_button" msgid="8836277213343697023"></string>
+ <string name="upstream_roaming_notification_title" msgid="8614262557406849762"></string>
+ <string name="upstream_roaming_notification_message" msgid="5999740876323106599"></string>
</resources>
diff --git a/Tethering/res/values-en-rGB/strings.xml b/Tethering/res/values-en-rGB/strings.xml
index 769e012..2dc7689 100644
--- a/Tethering/res/values-en-rGB/strings.xml
+++ b/Tethering/res/values-en-rGB/strings.xml
@@ -16,14 +16,14 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="tethered_notification_title" msgid="6426563586025792944">"Tethering or hotspot active"</string>
- <string name="tethered_notification_message" msgid="64800879503420696">"Tap to set up."</string>
- <string name="disable_tether_notification_title" msgid="3004509127903564191">"Tethering is disabled"</string>
- <string name="disable_tether_notification_message" msgid="6717523799293901476">"Contact your admin for details"</string>
- <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Hotspot and tethering status"</string>
- <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
- <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
- <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
- <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
- <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
+ <string name="tethered_notification_title" msgid="5350162111436634622">"Tethering or hotspot active"</string>
+ <string name="tethered_notification_message" msgid="2338023450330652098">"Tap to set up."</string>
+ <string name="disable_tether_notification_title" msgid="3183576627492925522">"Tethering is disabled"</string>
+ <string name="disable_tether_notification_message" msgid="6655882039707534929">"Contact your admin for details"</string>
+ <string name="notification_channel_tethering_status" msgid="7030733422705019001">"Hotspot and tethering status"</string>
+ <string name="no_upstream_notification_title" msgid="2052743091868702475"></string>
+ <string name="no_upstream_notification_message" msgid="6932020551635470134"></string>
+ <string name="no_upstream_notification_disable_button" msgid="8836277213343697023"></string>
+ <string name="upstream_roaming_notification_title" msgid="8614262557406849762"></string>
+ <string name="upstream_roaming_notification_message" msgid="5999740876323106599"></string>
</resources>
diff --git a/Tethering/res/values-en-rIN/strings.xml b/Tethering/res/values-en-rIN/strings.xml
index 769e012..2dc7689 100644
--- a/Tethering/res/values-en-rIN/strings.xml
+++ b/Tethering/res/values-en-rIN/strings.xml
@@ -16,14 +16,14 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="tethered_notification_title" msgid="6426563586025792944">"Tethering or hotspot active"</string>
- <string name="tethered_notification_message" msgid="64800879503420696">"Tap to set up."</string>
- <string name="disable_tether_notification_title" msgid="3004509127903564191">"Tethering is disabled"</string>
- <string name="disable_tether_notification_message" msgid="6717523799293901476">"Contact your admin for details"</string>
- <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Hotspot and tethering status"</string>
- <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
- <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
- <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
- <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
- <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
+ <string name="tethered_notification_title" msgid="5350162111436634622">"Tethering or hotspot active"</string>
+ <string name="tethered_notification_message" msgid="2338023450330652098">"Tap to set up."</string>
+ <string name="disable_tether_notification_title" msgid="3183576627492925522">"Tethering is disabled"</string>
+ <string name="disable_tether_notification_message" msgid="6655882039707534929">"Contact your admin for details"</string>
+ <string name="notification_channel_tethering_status" msgid="7030733422705019001">"Hotspot and tethering status"</string>
+ <string name="no_upstream_notification_title" msgid="2052743091868702475"></string>
+ <string name="no_upstream_notification_message" msgid="6932020551635470134"></string>
+ <string name="no_upstream_notification_disable_button" msgid="8836277213343697023"></string>
+ <string name="upstream_roaming_notification_title" msgid="8614262557406849762"></string>
+ <string name="upstream_roaming_notification_message" msgid="5999740876323106599"></string>
</resources>
diff --git a/Tethering/res/values-en-rXC/strings.xml b/Tethering/res/values-en-rXC/strings.xml
index f1674be..a83caac 100644
--- a/Tethering/res/values-en-rXC/strings.xml
+++ b/Tethering/res/values-en-rXC/strings.xml
@@ -16,14 +16,14 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="tethered_notification_title" msgid="6426563586025792944">"Tethering or hotspot active"</string>
- <string name="tethered_notification_message" msgid="64800879503420696">"Tap to set up."</string>
- <string name="disable_tether_notification_title" msgid="3004509127903564191">"Tethering is disabled"</string>
- <string name="disable_tether_notification_message" msgid="6717523799293901476">"Contact your admin for details"</string>
- <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Hotspot & tethering status"</string>
- <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
- <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
- <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
- <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
- <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
+ <string name="tethered_notification_title" msgid="5350162111436634622">"Tethering or hotspot active"</string>
+ <string name="tethered_notification_message" msgid="2338023450330652098">"Tap to set up."</string>
+ <string name="disable_tether_notification_title" msgid="3183576627492925522">"Tethering is disabled"</string>
+ <string name="disable_tether_notification_message" msgid="6655882039707534929">"Contact your admin for details"</string>
+ <string name="notification_channel_tethering_status" msgid="7030733422705019001">"Hotspot & tethering status"</string>
+ <string name="no_upstream_notification_title" msgid="2052743091868702475"></string>
+ <string name="no_upstream_notification_message" msgid="6932020551635470134"></string>
+ <string name="no_upstream_notification_disable_button" msgid="8836277213343697023"></string>
+ <string name="upstream_roaming_notification_title" msgid="8614262557406849762"></string>
+ <string name="upstream_roaming_notification_message" msgid="5999740876323106599"></string>
</resources>
diff --git a/Tethering/res/values-es-rUS/strings.xml b/Tethering/res/values-es-rUS/strings.xml
index 63689f4..69bd4e7 100644
--- a/Tethering/res/values-es-rUS/strings.xml
+++ b/Tethering/res/values-es-rUS/strings.xml
@@ -16,14 +16,14 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="tethered_notification_title" msgid="6426563586025792944">"Conexión a red o hotspot conectados"</string>
- <string name="tethered_notification_message" msgid="64800879503420696">"Presiona para configurar esta opción."</string>
- <string name="disable_tether_notification_title" msgid="3004509127903564191">"Se inhabilitó la conexión mediante dispositivo portátil"</string>
- <string name="disable_tether_notification_message" msgid="6717523799293901476">"Para obtener más información, comunícate con el administrador"</string>
- <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Estado del hotspot y la conexión mediante dispositivo portátil"</string>
- <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
- <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
- <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
- <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
- <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
+ <string name="tethered_notification_title" msgid="5350162111436634622">"Conexión mediante dispositivo móvil o hotspot activos"</string>
+ <string name="tethered_notification_message" msgid="2338023450330652098">"Presiona para configurar esta opción."</string>
+ <string name="disable_tether_notification_title" msgid="3183576627492925522">"Se inhabilitó la conexión mediante dispositivo móvil"</string>
+ <string name="disable_tether_notification_message" msgid="6655882039707534929">"Para obtener más información, comunícate con el administrador"</string>
+ <string name="notification_channel_tethering_status" msgid="7030733422705019001">"Estado del hotspot y de la conexión mediante dispositivo portátil"</string>
+ <string name="no_upstream_notification_title" msgid="2052743091868702475"></string>
+ <string name="no_upstream_notification_message" msgid="6932020551635470134"></string>
+ <string name="no_upstream_notification_disable_button" msgid="8836277213343697023"></string>
+ <string name="upstream_roaming_notification_title" msgid="8614262557406849762"></string>
+ <string name="upstream_roaming_notification_message" msgid="5999740876323106599"></string>
</resources>
diff --git a/Tethering/res/values-es/strings.xml b/Tethering/res/values-es/strings.xml
index 9a34ed5..6bef387 100644
--- a/Tethering/res/values-es/strings.xml
+++ b/Tethering/res/values-es/strings.xml
@@ -16,14 +16,14 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="tethered_notification_title" msgid="6426563586025792944">"Conexión compartida o punto de acceso activos"</string>
- <string name="tethered_notification_message" msgid="64800879503420696">"Toca para configurar."</string>
- <string name="disable_tether_notification_title" msgid="3004509127903564191">"La conexión compartida está inhabilitada"</string>
- <string name="disable_tether_notification_message" msgid="6717523799293901476">"Solicita más información a tu administrador"</string>
- <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Estado del punto de acceso y de la conexión compartida"</string>
- <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
- <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
- <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
- <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
- <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
+ <string name="tethered_notification_title" msgid="5350162111436634622">"Conexión compartida o punto de acceso activos"</string>
+ <string name="tethered_notification_message" msgid="2338023450330652098">"Toca para configurarla."</string>
+ <string name="disable_tether_notification_title" msgid="3183576627492925522">"La conexión compartida está inhabilitada"</string>
+ <string name="disable_tether_notification_message" msgid="6655882039707534929">"Ponte en contacto con el administrador para obtener más información"</string>
+ <string name="notification_channel_tethering_status" msgid="7030733422705019001">"Estado del punto de acceso y la conexión compartida"</string>
+ <string name="no_upstream_notification_title" msgid="2052743091868702475"></string>
+ <string name="no_upstream_notification_message" msgid="6932020551635470134"></string>
+ <string name="no_upstream_notification_disable_button" msgid="8836277213343697023"></string>
+ <string name="upstream_roaming_notification_title" msgid="8614262557406849762"></string>
+ <string name="upstream_roaming_notification_message" msgid="5999740876323106599"></string>
</resources>
diff --git a/Tethering/res/values-et/strings.xml b/Tethering/res/values-et/strings.xml
index 0970341..68088ce 100644
--- a/Tethering/res/values-et/strings.xml
+++ b/Tethering/res/values-et/strings.xml
@@ -16,14 +16,14 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="tethered_notification_title" msgid="6426563586025792944">"Jagamine või kuumkoht on aktiivne"</string>
- <string name="tethered_notification_message" msgid="64800879503420696">"Puudutage seadistamiseks."</string>
- <string name="disable_tether_notification_title" msgid="3004509127903564191">"Jagamine on keelatud"</string>
- <string name="disable_tether_notification_message" msgid="6717523799293901476">"Lisateabe saamiseks võtke ühendust oma administraatoriga"</string>
- <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Kuumkoha ja jagamise olek"</string>
- <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
- <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
- <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
- <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
- <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
+ <string name="tethered_notification_title" msgid="5350162111436634622">"Jagamine või kuumkoht on aktiivne"</string>
+ <string name="tethered_notification_message" msgid="2338023450330652098">"Puudutage seadistamiseks."</string>
+ <string name="disable_tether_notification_title" msgid="3183576627492925522">"Jagamine on keelatud"</string>
+ <string name="disable_tether_notification_message" msgid="6655882039707534929">"Lisateabe saamiseks võtke ühendust oma administraatoriga"</string>
+ <string name="notification_channel_tethering_status" msgid="7030733422705019001">"Kuumkoha ja jagamise olek"</string>
+ <string name="no_upstream_notification_title" msgid="2052743091868702475"></string>
+ <string name="no_upstream_notification_message" msgid="6932020551635470134"></string>
+ <string name="no_upstream_notification_disable_button" msgid="8836277213343697023"></string>
+ <string name="upstream_roaming_notification_title" msgid="8614262557406849762"></string>
+ <string name="upstream_roaming_notification_message" msgid="5999740876323106599"></string>
</resources>
diff --git a/Tethering/res/values-eu/strings.xml b/Tethering/res/values-eu/strings.xml
index 632019e..37b35a8 100644
--- a/Tethering/res/values-eu/strings.xml
+++ b/Tethering/res/values-eu/strings.xml
@@ -16,14 +16,14 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="tethered_notification_title" msgid="6426563586025792944">"Konexioa partekatzea edo wifi-gunea aktibo dago"</string>
- <string name="tethered_notification_message" msgid="64800879503420696">"Sakatu konfiguratzeko."</string>
- <string name="disable_tether_notification_title" msgid="3004509127903564191">"Desgaituta dago konexioa partekatzeko aukera"</string>
- <string name="disable_tether_notification_message" msgid="6717523799293901476">"Xehetasunak lortzeko, jarri administratzailearekin harremanetan"</string>
- <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Wifi-gunearen eta konexioa partekatzeko eginbidearen egoera"</string>
- <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
- <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
- <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
- <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
- <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
+ <string name="tethered_notification_title" msgid="5350162111436634622">"Konexioa partekatzeko aukera edo wifi-gunea aktibo dago"</string>
+ <string name="tethered_notification_message" msgid="2338023450330652098">"Konfiguratzeko, sakatu hau."</string>
+ <string name="disable_tether_notification_title" msgid="3183576627492925522">"Konexioa partekatzeko aukera desgaituta dago"</string>
+ <string name="disable_tether_notification_message" msgid="6655882039707534929">"Xehetasunak lortzeko, jarri administratzailearekin harremanetan"</string>
+ <string name="notification_channel_tethering_status" msgid="7030733422705019001">"Wifi-gunearen eta konexioa partekatzeko aukeraren egoera"</string>
+ <string name="no_upstream_notification_title" msgid="2052743091868702475"></string>
+ <string name="no_upstream_notification_message" msgid="6932020551635470134"></string>
+ <string name="no_upstream_notification_disable_button" msgid="8836277213343697023"></string>
+ <string name="upstream_roaming_notification_title" msgid="8614262557406849762"></string>
+ <string name="upstream_roaming_notification_message" msgid="5999740876323106599"></string>
</resources>
diff --git a/Tethering/res/values-fa/strings.xml b/Tethering/res/values-fa/strings.xml
index 2e21c85..d7f2543 100644
--- a/Tethering/res/values-fa/strings.xml
+++ b/Tethering/res/values-fa/strings.xml
@@ -16,14 +16,14 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="tethered_notification_title" msgid="6426563586025792944">"اشتراکگذاری اینترنت یا نقطه اتصال فعال"</string>
- <string name="tethered_notification_message" msgid="64800879503420696">"برای راهاندازی ضربه بزنید."</string>
- <string name="disable_tether_notification_title" msgid="3004509127903564191">"اشتراکگذاری اینترنت غیرفعال است"</string>
- <string name="disable_tether_notification_message" msgid="6717523799293901476">"برای جزئیات، با سرپرستتان تماس بگیرید"</string>
- <string name="notification_channel_tethering_status" msgid="2663463891530932727">"وضعیت نقطه اتصال و اشتراکگذاری اینترنت"</string>
- <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
- <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
- <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
- <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
- <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
+ <string name="tethered_notification_title" msgid="5350162111436634622">"اشتراکگذاری اینترنت یا نقطه اتصال فعال است"</string>
+ <string name="tethered_notification_message" msgid="2338023450330652098">"برای راهاندازی، ضربه بزنید."</string>
+ <string name="disable_tether_notification_title" msgid="3183576627492925522">"اشتراکگذاری اینترنت غیرفعال است"</string>
+ <string name="disable_tether_notification_message" msgid="6655882039707534929">"برای جزئیات، با سرپرستتان تماس بگیرید"</string>
+ <string name="notification_channel_tethering_status" msgid="7030733422705019001">"وضعیت نقطه اتصال و اشتراکگذاری اینترنت"</string>
+ <string name="no_upstream_notification_title" msgid="2052743091868702475"></string>
+ <string name="no_upstream_notification_message" msgid="6932020551635470134"></string>
+ <string name="no_upstream_notification_disable_button" msgid="8836277213343697023"></string>
+ <string name="upstream_roaming_notification_title" msgid="8614262557406849762"></string>
+ <string name="upstream_roaming_notification_message" msgid="5999740876323106599"></string>
</resources>
diff --git a/Tethering/res/values-fi/strings.xml b/Tethering/res/values-fi/strings.xml
index 413db3f..4bf09fec 100644
--- a/Tethering/res/values-fi/strings.xml
+++ b/Tethering/res/values-fi/strings.xml
@@ -16,14 +16,14 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="tethered_notification_title" msgid="6426563586025792944">"Yhteyden jakaminen tai hotspot käytössä"</string>
- <string name="tethered_notification_message" msgid="64800879503420696">"Ota käyttöön napauttamalla."</string>
- <string name="disable_tether_notification_title" msgid="3004509127903564191">"Yhteyden jakaminen on poistettu käytöstä"</string>
- <string name="disable_tether_notification_message" msgid="6717523799293901476">"Pyydä lisätietoja järjestelmänvalvojalta"</string>
- <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Hotspotin ja yhteyden jakamisen tila"</string>
- <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
- <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
- <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
- <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
- <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
+ <string name="tethered_notification_title" msgid="5350162111436634622">"Puhelimen käyttäminen modeemina tai hotspot käytössä"</string>
+ <string name="tethered_notification_message" msgid="2338023450330652098">"Ota käyttöön napauttamalla."</string>
+ <string name="disable_tether_notification_title" msgid="3183576627492925522">"Puhelimen käyttäminen modeemina on poistettu käytöstä"</string>
+ <string name="disable_tether_notification_message" msgid="6655882039707534929">"Pyydä lisätietoa järjestelmänvalvojalta"</string>
+ <string name="notification_channel_tethering_status" msgid="7030733422705019001">"Hotspotin ja modeemina toimivan puhelimen tila"</string>
+ <string name="no_upstream_notification_title" msgid="2052743091868702475"></string>
+ <string name="no_upstream_notification_message" msgid="6932020551635470134"></string>
+ <string name="no_upstream_notification_disable_button" msgid="8836277213343697023"></string>
+ <string name="upstream_roaming_notification_title" msgid="8614262557406849762"></string>
+ <string name="upstream_roaming_notification_message" msgid="5999740876323106599"></string>
</resources>
diff --git a/Tethering/res/values-fr-rCA/strings.xml b/Tethering/res/values-fr-rCA/strings.xml
index eb2e4ba..66b4684 100644
--- a/Tethering/res/values-fr-rCA/strings.xml
+++ b/Tethering/res/values-fr-rCA/strings.xml
@@ -16,14 +16,14 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="tethered_notification_title" msgid="6426563586025792944">"Partage de connexion ou point d\'accès sans fil activé"</string>
- <string name="tethered_notification_message" msgid="64800879503420696">"Touchez pour configurer."</string>
- <string name="disable_tether_notification_title" msgid="3004509127903564191">"Le partage de connexion est désactivé"</string>
- <string name="disable_tether_notification_message" msgid="6717523799293901476">"Communiquez avec votre administrateur pour obtenir plus de détails"</string>
- <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Point d\'accès et partage de connexion"</string>
- <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
- <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
- <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
- <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
- <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
+ <string name="tethered_notification_title" msgid="5350162111436634622">"Partage de connexion ou point d\'accès sans fil activé"</string>
+ <string name="tethered_notification_message" msgid="2338023450330652098">"Touchez pour configurer."</string>
+ <string name="disable_tether_notification_title" msgid="3183576627492925522">"Le partage de connexion est désactivé"</string>
+ <string name="disable_tether_notification_message" msgid="6655882039707534929">"Communiquez avec votre administrateur pour obtenir plus de détails"</string>
+ <string name="notification_channel_tethering_status" msgid="7030733422705019001">"État du point d\'accès sans fil et du partage de connexion"</string>
+ <string name="no_upstream_notification_title" msgid="2052743091868702475"></string>
+ <string name="no_upstream_notification_message" msgid="6932020551635470134"></string>
+ <string name="no_upstream_notification_disable_button" msgid="8836277213343697023"></string>
+ <string name="upstream_roaming_notification_title" msgid="8614262557406849762"></string>
+ <string name="upstream_roaming_notification_message" msgid="5999740876323106599"></string>
</resources>
diff --git a/Tethering/res/values-fr/strings.xml b/Tethering/res/values-fr/strings.xml
index 22259c5..9440d95 100644
--- a/Tethering/res/values-fr/strings.xml
+++ b/Tethering/res/values-fr/strings.xml
@@ -16,14 +16,14 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="tethered_notification_title" msgid="6426563586025792944">"Partage de connexion ou point d\'accès activé"</string>
- <string name="tethered_notification_message" msgid="64800879503420696">"Appuyez pour effectuer la configuration."</string>
- <string name="disable_tether_notification_title" msgid="3004509127903564191">"Le partage de connexion est désactivé"</string>
- <string name="disable_tether_notification_message" msgid="6717523799293901476">"Pour en savoir plus, contactez votre administrateur"</string>
- <string name="notification_channel_tethering_status" msgid="2663463891530932727">"État du point d\'accès et du partage de connexion"</string>
- <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
- <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
- <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
- <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
- <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
+ <string name="tethered_notification_title" msgid="5350162111436634622">"Partage de connexion ou point d\'accès activé"</string>
+ <string name="tethered_notification_message" msgid="2338023450330652098">"Appuyez pour configurer."</string>
+ <string name="disable_tether_notification_title" msgid="3183576627492925522">"Le partage de connexion est désactivé"</string>
+ <string name="disable_tether_notification_message" msgid="6655882039707534929">"Pour en savoir plus, contactez votre administrateur"</string>
+ <string name="notification_channel_tethering_status" msgid="7030733422705019001">"État du point d\'accès et du partage de connexion"</string>
+ <string name="no_upstream_notification_title" msgid="2052743091868702475"></string>
+ <string name="no_upstream_notification_message" msgid="6932020551635470134"></string>
+ <string name="no_upstream_notification_disable_button" msgid="8836277213343697023"></string>
+ <string name="upstream_roaming_notification_title" msgid="8614262557406849762"></string>
+ <string name="upstream_roaming_notification_message" msgid="5999740876323106599"></string>
</resources>
diff --git a/Tethering/res/values-gl/strings.xml b/Tethering/res/values-gl/strings.xml
index ded82fc..74bb7f2 100644
--- a/Tethering/res/values-gl/strings.xml
+++ b/Tethering/res/values-gl/strings.xml
@@ -16,14 +16,14 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="tethered_notification_title" msgid="6426563586025792944">"Conexión compartida ou zona wifi activada"</string>
- <string name="tethered_notification_message" msgid="64800879503420696">"Toca para configurar."</string>
- <string name="disable_tether_notification_title" msgid="3004509127903564191">"A conexión compartida está desactivada"</string>
- <string name="disable_tether_notification_message" msgid="6717523799293901476">"Contacta co administrador para obter información"</string>
- <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Estado da zona wifi e da conexión compartida"</string>
- <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
- <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
- <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
- <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
- <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
+ <string name="tethered_notification_title" msgid="5350162111436634622">"Conexión compartida ou zona wifi activada"</string>
+ <string name="tethered_notification_message" msgid="2338023450330652098">"Toca para configurar."</string>
+ <string name="disable_tether_notification_title" msgid="3183576627492925522">"A conexión compartida está desactivada"</string>
+ <string name="disable_tether_notification_message" msgid="6655882039707534929">"Contacta co administrador para obter información"</string>
+ <string name="notification_channel_tethering_status" msgid="7030733422705019001">"Estado da zona wifi e da conexión compartida"</string>
+ <string name="no_upstream_notification_title" msgid="2052743091868702475"></string>
+ <string name="no_upstream_notification_message" msgid="6932020551635470134"></string>
+ <string name="no_upstream_notification_disable_button" msgid="8836277213343697023"></string>
+ <string name="upstream_roaming_notification_title" msgid="8614262557406849762"></string>
+ <string name="upstream_roaming_notification_message" msgid="5999740876323106599"></string>
</resources>
diff --git a/Tethering/res/values-gu/strings.xml b/Tethering/res/values-gu/strings.xml
index 7cbbc2d..c463499 100644
--- a/Tethering/res/values-gu/strings.xml
+++ b/Tethering/res/values-gu/strings.xml
@@ -16,14 +16,14 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="tethered_notification_title" msgid="6426563586025792944">"ઇન્ટરનેટ શેર કરવાની સુવિધા અથવા હૉટસ્પૉટ સક્રિય છે"</string>
- <string name="tethered_notification_message" msgid="64800879503420696">"સેટઅપ કરવા માટે ટૅપ કરો."</string>
- <string name="disable_tether_notification_title" msgid="3004509127903564191">"ઇન્ટરનેટ શેર કરવાની સુવિધા બંધ કરી છે"</string>
- <string name="disable_tether_notification_message" msgid="6717523799293901476">"વિગતો માટે તમારા વ્યવસ્થાપકનો સંપર્ક કરો"</string>
- <string name="notification_channel_tethering_status" msgid="2663463891530932727">"હૉટસ્પૉટ અને ઇન્ટરનેટ શેર કરવાની સુવિધાનું સ્ટેટસ"</string>
- <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
- <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
- <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
- <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
- <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
+ <string name="tethered_notification_title" msgid="5350162111436634622">"ઇન્ટરનેટ શેર કરવાની સુવિધા અથવા હૉટસ્પૉટ સક્રિય છે"</string>
+ <string name="tethered_notification_message" msgid="2338023450330652098">"સેટઅપ કરવા માટે ટૅપ કરો."</string>
+ <string name="disable_tether_notification_title" msgid="3183576627492925522">"ઇન્ટરનેટ શેર કરવાની સુવિધા બંધ કરી છે"</string>
+ <string name="disable_tether_notification_message" msgid="6655882039707534929">"વિગતો માટે તમારા ઍડમિનનો સંપર્ક કરો"</string>
+ <string name="notification_channel_tethering_status" msgid="7030733422705019001">"હૉટસ્પૉટ અને ઇન્ટરનેટ શેર કરવાની સુવિધાનું સ્ટેટસ"</string>
+ <string name="no_upstream_notification_title" msgid="2052743091868702475"></string>
+ <string name="no_upstream_notification_message" msgid="6932020551635470134"></string>
+ <string name="no_upstream_notification_disable_button" msgid="8836277213343697023"></string>
+ <string name="upstream_roaming_notification_title" msgid="8614262557406849762"></string>
+ <string name="upstream_roaming_notification_message" msgid="5999740876323106599"></string>
</resources>
diff --git a/Tethering/res/values-hi/strings.xml b/Tethering/res/values-hi/strings.xml
index 08af81b..12f7961 100644
--- a/Tethering/res/values-hi/strings.xml
+++ b/Tethering/res/values-hi/strings.xml
@@ -16,14 +16,14 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="tethered_notification_title" msgid="6426563586025792944">"टेदरिंग या हॉटस्पॉट चालू है"</string>
- <string name="tethered_notification_message" msgid="64800879503420696">"सेट अप करने के लिए टैप करें."</string>
- <string name="disable_tether_notification_title" msgid="3004509127903564191">"टेदरिंग बंद है"</string>
- <string name="disable_tether_notification_message" msgid="6717523799293901476">"जानकारी के लिए अपने एडमिन से संपर्क करें"</string>
- <string name="notification_channel_tethering_status" msgid="2663463891530932727">"हॉटस्पॉट और टेदरिंग की स्थिति"</string>
- <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
- <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
- <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
- <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
- <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
+ <string name="tethered_notification_title" msgid="5350162111436634622">"टेदरिंग या हॉटस्पॉट चालू है"</string>
+ <string name="tethered_notification_message" msgid="2338023450330652098">"सेट अप करने के लिए टैप करें."</string>
+ <string name="disable_tether_notification_title" msgid="3183576627492925522">"टेदरिंग बंद है"</string>
+ <string name="disable_tether_notification_message" msgid="6655882039707534929">"जानकारी के लिए अपने एडमिन से संपर्क करें"</string>
+ <string name="notification_channel_tethering_status" msgid="7030733422705019001">"हॉटस्पॉट और टेदरिंग की स्थिति"</string>
+ <string name="no_upstream_notification_title" msgid="2052743091868702475"></string>
+ <string name="no_upstream_notification_message" msgid="6932020551635470134"></string>
+ <string name="no_upstream_notification_disable_button" msgid="8836277213343697023"></string>
+ <string name="upstream_roaming_notification_title" msgid="8614262557406849762"></string>
+ <string name="upstream_roaming_notification_message" msgid="5999740876323106599"></string>
</resources>
diff --git a/Tethering/res/values-hr/strings.xml b/Tethering/res/values-hr/strings.xml
index 827c135..19b7b45 100644
--- a/Tethering/res/values-hr/strings.xml
+++ b/Tethering/res/values-hr/strings.xml
@@ -16,14 +16,14 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="tethered_notification_title" msgid="6426563586025792944">"Modemsko povezivanje ili žarišna točka aktivni"</string>
- <string name="tethered_notification_message" msgid="64800879503420696">"Dodirnite da biste postavili."</string>
- <string name="disable_tether_notification_title" msgid="3004509127903564191">"Modemsko je povezivanje onemogućeno"</string>
- <string name="disable_tether_notification_message" msgid="6717523799293901476">"Obratite se administratoru da biste saznali pojedinosti"</string>
- <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Status žarišne točke i modemskog povezivanja"</string>
- <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
- <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
- <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
- <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
- <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
+ <string name="tethered_notification_title" msgid="5350162111436634622">"Modemsko povezivanje ili žarišna točka aktivni"</string>
+ <string name="tethered_notification_message" msgid="2338023450330652098">"Dodirnite da biste ih postavili."</string>
+ <string name="disable_tether_notification_title" msgid="3183576627492925522">"Modemsko je povezivanje onemogućeno"</string>
+ <string name="disable_tether_notification_message" msgid="6655882039707534929">"Obratite se administratoru da biste saznali pojedinosti"</string>
+ <string name="notification_channel_tethering_status" msgid="7030733422705019001">"Status žarišne točke i modemskog povezivanja"</string>
+ <string name="no_upstream_notification_title" msgid="2052743091868702475"></string>
+ <string name="no_upstream_notification_message" msgid="6932020551635470134"></string>
+ <string name="no_upstream_notification_disable_button" msgid="8836277213343697023"></string>
+ <string name="upstream_roaming_notification_title" msgid="8614262557406849762"></string>
+ <string name="upstream_roaming_notification_message" msgid="5999740876323106599"></string>
</resources>
diff --git a/Tethering/res/values-hu/strings.xml b/Tethering/res/values-hu/strings.xml
index eb68d6b..419f434 100644
--- a/Tethering/res/values-hu/strings.xml
+++ b/Tethering/res/values-hu/strings.xml
@@ -16,14 +16,14 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="tethered_notification_title" msgid="6426563586025792944">"Megosztás vagy aktív hotspot"</string>
- <string name="tethered_notification_message" msgid="64800879503420696">"Koppintson a beállításhoz."</string>
- <string name="disable_tether_notification_title" msgid="3004509127903564191">"Az internetmegosztás le van tiltva"</string>
- <string name="disable_tether_notification_message" msgid="6717523799293901476">"A részletekért forduljon rendszergazdájához"</string>
- <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Hotspot és internetmegosztás állapota"</string>
- <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
- <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
- <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
- <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
- <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
+ <string name="tethered_notification_title" msgid="5350162111436634622">"Az internetmegosztás vagy a hotspot aktív"</string>
+ <string name="tethered_notification_message" msgid="2338023450330652098">"Koppintson a beállításhoz."</string>
+ <string name="disable_tether_notification_title" msgid="3183576627492925522">"Az internetmegosztás le van tiltva"</string>
+ <string name="disable_tether_notification_message" msgid="6655882039707534929">"A részletekért forduljon rendszergazdájához"</string>
+ <string name="notification_channel_tethering_status" msgid="7030733422705019001">"Hotspot és internetmegosztás állapota"</string>
+ <string name="no_upstream_notification_title" msgid="2052743091868702475"></string>
+ <string name="no_upstream_notification_message" msgid="6932020551635470134"></string>
+ <string name="no_upstream_notification_disable_button" msgid="8836277213343697023"></string>
+ <string name="upstream_roaming_notification_title" msgid="8614262557406849762"></string>
+ <string name="upstream_roaming_notification_message" msgid="5999740876323106599"></string>
</resources>
diff --git a/Tethering/res/values-hy/strings.xml b/Tethering/res/values-hy/strings.xml
index 912941e..c8842b6 100644
--- a/Tethering/res/values-hy/strings.xml
+++ b/Tethering/res/values-hy/strings.xml
@@ -16,14 +16,14 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="tethered_notification_title" msgid="6426563586025792944">"Մոդեմի ռեժիմը միացված է"</string>
- <string name="tethered_notification_message" msgid="64800879503420696">"Հպեք՝ կարգավորելու համար։"</string>
- <string name="disable_tether_notification_title" msgid="3004509127903564191">"Մոդեմի ռեժիմն անջատված է"</string>
- <string name="disable_tether_notification_message" msgid="6717523799293901476">"Մանրամասների համար դիմեք ձեր ադմինիստրատորին"</string>
- <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Թեժ կետի և մոդեմի ռեժիմի կարգավիճակը"</string>
- <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
- <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
- <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
- <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
- <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
+ <string name="tethered_notification_title" msgid="5350162111436634622">"Մոդեմի ռեժիմը միացված է"</string>
+ <string name="tethered_notification_message" msgid="2338023450330652098">"Հպեք՝ կարգավորելու համար։"</string>
+ <string name="disable_tether_notification_title" msgid="3183576627492925522">"Մոդեմի ռեժիմն անջատված է"</string>
+ <string name="disable_tether_notification_message" msgid="6655882039707534929">"Մանրամասների համար դիմեք ձեր ադմինիստրատորին"</string>
+ <string name="notification_channel_tethering_status" msgid="7030733422705019001">"Թեժ կետի և մոդեմի ռեժիմի կարգավիճակը"</string>
+ <string name="no_upstream_notification_title" msgid="2052743091868702475"></string>
+ <string name="no_upstream_notification_message" msgid="6932020551635470134"></string>
+ <string name="no_upstream_notification_disable_button" msgid="8836277213343697023"></string>
+ <string name="upstream_roaming_notification_title" msgid="8614262557406849762"></string>
+ <string name="upstream_roaming_notification_message" msgid="5999740876323106599"></string>
</resources>
diff --git a/Tethering/res/values-in/strings.xml b/Tethering/res/values-in/strings.xml
index a4e175a..4ae35d4 100644
--- a/Tethering/res/values-in/strings.xml
+++ b/Tethering/res/values-in/strings.xml
@@ -16,14 +16,14 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="tethered_notification_title" msgid="6426563586025792944">"Tethering atau hotspot aktif"</string>
- <string name="tethered_notification_message" msgid="64800879503420696">"Ketuk untuk menyiapkan."</string>
- <string name="disable_tether_notification_title" msgid="3004509127903564191">"Tethering dinonaktifkan"</string>
- <string name="disable_tether_notification_message" msgid="6717523799293901476">"Hubungi admin untuk mengetahui detailnya"</string>
- <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Status hotspot & tethering"</string>
- <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
- <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
- <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
- <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
- <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
+ <string name="tethered_notification_title" msgid="5350162111436634622">"Tethering atau hotspot aktif"</string>
+ <string name="tethered_notification_message" msgid="2338023450330652098">"Ketuk untuk menyiapkan."</string>
+ <string name="disable_tether_notification_title" msgid="3183576627492925522">"Tethering dinonaktifkan"</string>
+ <string name="disable_tether_notification_message" msgid="6655882039707534929">"Hubungi admin untuk mengetahui detailnya"</string>
+ <string name="notification_channel_tethering_status" msgid="7030733422705019001">"Status hotspot & tethering"</string>
+ <string name="no_upstream_notification_title" msgid="2052743091868702475"></string>
+ <string name="no_upstream_notification_message" msgid="6932020551635470134"></string>
+ <string name="no_upstream_notification_disable_button" msgid="8836277213343697023"></string>
+ <string name="upstream_roaming_notification_title" msgid="8614262557406849762"></string>
+ <string name="upstream_roaming_notification_message" msgid="5999740876323106599"></string>
</resources>
diff --git a/Tethering/res/values-is/strings.xml b/Tethering/res/values-is/strings.xml
index e9f6670..df69fb4 100644
--- a/Tethering/res/values-is/strings.xml
+++ b/Tethering/res/values-is/strings.xml
@@ -16,14 +16,14 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="tethered_notification_title" msgid="6426563586025792944">"Kveikt á tjóðrun eða aðgangsstað"</string>
- <string name="tethered_notification_message" msgid="64800879503420696">"Ýttu til að setja upp."</string>
- <string name="disable_tether_notification_title" msgid="3004509127903564191">"Slökkt er á tjóðrun"</string>
- <string name="disable_tether_notification_message" msgid="6717523799293901476">"Hafðu samband við kerfisstjórann til að fá upplýsingar"</string>
- <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Staða heits reits og tjóðrunar"</string>
- <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
- <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
- <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
- <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
- <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
+ <string name="tethered_notification_title" msgid="5350162111436634622">"Kveikt á tjóðrun eða heitum reit"</string>
+ <string name="tethered_notification_message" msgid="2338023450330652098">"Ýttu til að setja upp."</string>
+ <string name="disable_tether_notification_title" msgid="3183576627492925522">"Slökkt er á tjóðrun"</string>
+ <string name="disable_tether_notification_message" msgid="6655882039707534929">"Hafðu samband við stjórnanda til að fá upplýsingar"</string>
+ <string name="notification_channel_tethering_status" msgid="7030733422705019001">"Staða heits reits og tjóðrunar"</string>
+ <string name="no_upstream_notification_title" msgid="2052743091868702475"></string>
+ <string name="no_upstream_notification_message" msgid="6932020551635470134"></string>
+ <string name="no_upstream_notification_disable_button" msgid="8836277213343697023"></string>
+ <string name="upstream_roaming_notification_title" msgid="8614262557406849762"></string>
+ <string name="upstream_roaming_notification_message" msgid="5999740876323106599"></string>
</resources>
diff --git a/Tethering/res/values-it/strings.xml b/Tethering/res/values-it/strings.xml
index ffb9196..b13ee92 100644
--- a/Tethering/res/values-it/strings.xml
+++ b/Tethering/res/values-it/strings.xml
@@ -16,14 +16,14 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="tethered_notification_title" msgid="6426563586025792944">"Hotspot o tethering attivo"</string>
- <string name="tethered_notification_message" msgid="64800879503420696">"Tocca per impostare."</string>
- <string name="disable_tether_notification_title" msgid="3004509127903564191">"Tethering disattivato"</string>
- <string name="disable_tether_notification_message" msgid="6717523799293901476">"Contatta il tuo amministratore per avere informazioni dettagliate"</string>
- <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Stato hotspot e tethering"</string>
- <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
- <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
- <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
- <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
- <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
+ <string name="tethered_notification_title" msgid="5350162111436634622">"Hotspot o tethering attivo"</string>
+ <string name="tethered_notification_message" msgid="2338023450330652098">"Tocca per impostare."</string>
+ <string name="disable_tether_notification_title" msgid="3183576627492925522">"Tethering disattivato"</string>
+ <string name="disable_tether_notification_message" msgid="6655882039707534929">"Contatta il tuo amministratore per avere informazioni dettagliate"</string>
+ <string name="notification_channel_tethering_status" msgid="7030733422705019001">"Stato hotspot e tethering"</string>
+ <string name="no_upstream_notification_title" msgid="2052743091868702475"></string>
+ <string name="no_upstream_notification_message" msgid="6932020551635470134"></string>
+ <string name="no_upstream_notification_disable_button" msgid="8836277213343697023"></string>
+ <string name="upstream_roaming_notification_title" msgid="8614262557406849762"></string>
+ <string name="upstream_roaming_notification_message" msgid="5999740876323106599"></string>
</resources>
diff --git a/Tethering/res/values-iw/strings.xml b/Tethering/res/values-iw/strings.xml
index 7adcb47..f7fb4d5 100644
--- a/Tethering/res/values-iw/strings.xml
+++ b/Tethering/res/values-iw/strings.xml
@@ -16,14 +16,14 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="tethered_notification_title" msgid="6426563586025792944">"נקודה לשיתוף אינטרנט או שיתוף אינטרנט בין מכשירים: בסטטוס פעיל"</string>
- <string name="tethered_notification_message" msgid="64800879503420696">"יש להקיש כדי להגדיר."</string>
- <string name="disable_tether_notification_title" msgid="3004509127903564191">"שיתוף האינטרנט בין מכשירים מושבת"</string>
- <string name="disable_tether_notification_message" msgid="6717523799293901476">"לפרטים, יש לפנות למנהל המערכת"</string>
- <string name="notification_channel_tethering_status" msgid="2663463891530932727">"סטטוס של נקודה לשיתוף אינטרנט ושיתוף אינטרנט בין מכשירים"</string>
- <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
- <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
- <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
- <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
- <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
+ <string name="tethered_notification_title" msgid="5350162111436634622">"שיתוף האינטרנט או הנקודה לשיתוף אינטרנט פעילים"</string>
+ <string name="tethered_notification_message" msgid="2338023450330652098">"יש להקיש כדי להגדיר."</string>
+ <string name="disable_tether_notification_title" msgid="3183576627492925522">"שיתוף האינטרנט בין מכשירים מושבת"</string>
+ <string name="disable_tether_notification_message" msgid="6655882039707534929">"לפרטים, יש לפנות לאדמין"</string>
+ <string name="notification_channel_tethering_status" msgid="7030733422705019001">"סטטוס של נקודה לשיתוף אינטרנט ושיתוף אינטרנט בין מכשירים"</string>
+ <string name="no_upstream_notification_title" msgid="2052743091868702475"></string>
+ <string name="no_upstream_notification_message" msgid="6932020551635470134"></string>
+ <string name="no_upstream_notification_disable_button" msgid="8836277213343697023"></string>
+ <string name="upstream_roaming_notification_title" msgid="8614262557406849762"></string>
+ <string name="upstream_roaming_notification_message" msgid="5999740876323106599"></string>
</resources>
diff --git a/Tethering/res/values-ja/strings.xml b/Tethering/res/values-ja/strings.xml
index f68a730..172e771 100644
--- a/Tethering/res/values-ja/strings.xml
+++ b/Tethering/res/values-ja/strings.xml
@@ -16,14 +16,14 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="tethered_notification_title" msgid="6426563586025792944">"テザリングまたはアクセス ポイントが有効です"</string>
- <string name="tethered_notification_message" msgid="64800879503420696">"タップしてセットアップします。"</string>
- <string name="disable_tether_notification_title" msgid="3004509127903564191">"テザリングは無効に設定されています"</string>
- <string name="disable_tether_notification_message" msgid="6717523799293901476">"詳しくは、管理者にお問い合わせください"</string>
- <string name="notification_channel_tethering_status" msgid="2663463891530932727">"アクセス ポイントとテザリングのステータス"</string>
- <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
- <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
- <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
- <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
- <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
+ <string name="tethered_notification_title" msgid="5350162111436634622">"テザリングまたはアクセス ポイントが有効です"</string>
+ <string name="tethered_notification_message" msgid="2338023450330652098">"タップしてセットアップしてください。"</string>
+ <string name="disable_tether_notification_title" msgid="3183576627492925522">"テザリングは無効に設定されています"</string>
+ <string name="disable_tether_notification_message" msgid="6655882039707534929">"詳しくは、管理者にお問い合わせください"</string>
+ <string name="notification_channel_tethering_status" msgid="7030733422705019001">"アクセス ポイントとテザリングのステータス"</string>
+ <string name="no_upstream_notification_title" msgid="2052743091868702475"></string>
+ <string name="no_upstream_notification_message" msgid="6932020551635470134"></string>
+ <string name="no_upstream_notification_disable_button" msgid="8836277213343697023"></string>
+ <string name="upstream_roaming_notification_title" msgid="8614262557406849762"></string>
+ <string name="upstream_roaming_notification_message" msgid="5999740876323106599"></string>
</resources>
diff --git a/Tethering/res/values-ka/strings.xml b/Tethering/res/values-ka/strings.xml
index 7c22e82..b4e1191 100644
--- a/Tethering/res/values-ka/strings.xml
+++ b/Tethering/res/values-ka/strings.xml
@@ -16,14 +16,14 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="tethered_notification_title" msgid="6426563586025792944">"ტეტერინგი ან უსადენო ქსელი აქტიურია"</string>
- <string name="tethered_notification_message" msgid="64800879503420696">"შეეხეთ დასაყენებლად."</string>
- <string name="disable_tether_notification_title" msgid="3004509127903564191">"ტეტერინგი გათიშულია"</string>
- <string name="disable_tether_notification_message" msgid="6717523799293901476">"დამატებითი ინფორმაციისთვის დაუკავშირდით თქვენს ადმინისტრატორს"</string>
- <string name="notification_channel_tethering_status" msgid="2663463891530932727">"უსადენო ქსელის და ტეტერინგის სტატუსი"</string>
- <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
- <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
- <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
- <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
- <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
+ <string name="tethered_notification_title" msgid="5350162111436634622">"ტეტერინგი ან უსადენო ქსელი აქტიურია"</string>
+ <string name="tethered_notification_message" msgid="2338023450330652098">"შეეხეთ დასაყენებლად."</string>
+ <string name="disable_tether_notification_title" msgid="3183576627492925522">"ტეტერინგი გათიშულია"</string>
+ <string name="disable_tether_notification_message" msgid="6655882039707534929">"დამატებითი ინფორმაციისთვის დაუკავშირდით თქვენს ადმინისტრატორს"</string>
+ <string name="notification_channel_tethering_status" msgid="7030733422705019001">"უსადენო ქსელის და ტეტერინგის სტატუსი"</string>
+ <string name="no_upstream_notification_title" msgid="2052743091868702475"></string>
+ <string name="no_upstream_notification_message" msgid="6932020551635470134"></string>
+ <string name="no_upstream_notification_disable_button" msgid="8836277213343697023"></string>
+ <string name="upstream_roaming_notification_title" msgid="8614262557406849762"></string>
+ <string name="upstream_roaming_notification_message" msgid="5999740876323106599"></string>
</resources>
diff --git a/Tethering/res/values-kk/strings.xml b/Tethering/res/values-kk/strings.xml
index 0857d06..0116381 100644
--- a/Tethering/res/values-kk/strings.xml
+++ b/Tethering/res/values-kk/strings.xml
@@ -16,14 +16,14 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="tethered_notification_title" msgid="6426563586025792944">"Тетеринг немесе хотспот қосулы"</string>
- <string name="tethered_notification_message" msgid="64800879503420696">"Реттеу үшін түртіңіз."</string>
- <string name="disable_tether_notification_title" msgid="3004509127903564191">"Тетеринг өшірілді."</string>
- <string name="disable_tether_notification_message" msgid="6717523799293901476">"Мәліметтерді әкімшіден алыңыз."</string>
- <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Хотспот және тетеринг күйі"</string>
- <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
- <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
- <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
- <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
- <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
+ <string name="tethered_notification_title" msgid="5350162111436634622">"Тетеринг немесе хотспот іске қосылған"</string>
+ <string name="tethered_notification_message" msgid="2338023450330652098">"Реттеу үшін түртіңіз."</string>
+ <string name="disable_tether_notification_title" msgid="3183576627492925522">"Тетеринг өшірілді."</string>
+ <string name="disable_tether_notification_message" msgid="6655882039707534929">"Мәлімет алу үшін әкімшіге хабарласыңыз."</string>
+ <string name="notification_channel_tethering_status" msgid="7030733422705019001">"Хотспот және тетеринг күйі"</string>
+ <string name="no_upstream_notification_title" msgid="2052743091868702475"></string>
+ <string name="no_upstream_notification_message" msgid="6932020551635470134"></string>
+ <string name="no_upstream_notification_disable_button" msgid="8836277213343697023"></string>
+ <string name="upstream_roaming_notification_title" msgid="8614262557406849762"></string>
+ <string name="upstream_roaming_notification_message" msgid="5999740876323106599"></string>
</resources>
diff --git a/Tethering/res/values-km/strings.xml b/Tethering/res/values-km/strings.xml
index 536e3d1..52667e8 100644
--- a/Tethering/res/values-km/strings.xml
+++ b/Tethering/res/values-km/strings.xml
@@ -16,14 +16,14 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="tethered_notification_title" msgid="6426563586025792944">"ការភ្ជាប់ ឬហតស្ប៉តកំពុងដំណើរការ"</string>
- <string name="tethered_notification_message" msgid="64800879503420696">"ចុចដើម្បីរៀបចំ។"</string>
- <string name="disable_tether_notification_title" msgid="3004509127903564191">"ការភ្ជាប់ត្រូវបានបិទ"</string>
- <string name="disable_tether_notification_message" msgid="6717523799293901476">"ទាក់ទងអ្នកគ្រប់គ្រងរបស់អ្នក ដើម្បីទទួលបានព័ត៌មានលម្អិត"</string>
- <string name="notification_channel_tethering_status" msgid="2663463891530932727">"ស្ថានភាពនៃការភ្ជាប់ និងហតស្ប៉ត"</string>
- <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
- <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
- <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
- <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
- <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
+ <string name="tethered_notification_title" msgid="5350162111436634622">"ការភ្ជាប់ ឬហតស្ប៉តកំពុងដំណើរការ"</string>
+ <string name="tethered_notification_message" msgid="2338023450330652098">"ចុចដើម្បីរៀបចំ។"</string>
+ <string name="disable_tether_notification_title" msgid="3183576627492925522">"ការភ្ជាប់ត្រូវបានបិទ"</string>
+ <string name="disable_tether_notification_message" msgid="6655882039707534929">"ទាក់ទងអ្នកគ្រប់គ្រងរបស់អ្នក ដើម្បីទទួលបានព័ត៌មានលម្អិត"</string>
+ <string name="notification_channel_tethering_status" msgid="7030733422705019001">"ស្ថានភាពនៃការភ្ជាប់ និងហតស្ប៉ត"</string>
+ <string name="no_upstream_notification_title" msgid="2052743091868702475"></string>
+ <string name="no_upstream_notification_message" msgid="6932020551635470134"></string>
+ <string name="no_upstream_notification_disable_button" msgid="8836277213343697023"></string>
+ <string name="upstream_roaming_notification_title" msgid="8614262557406849762"></string>
+ <string name="upstream_roaming_notification_message" msgid="5999740876323106599"></string>
</resources>
diff --git a/Tethering/res/values-kn/strings.xml b/Tethering/res/values-kn/strings.xml
index 32f5492..a0a3607 100644
--- a/Tethering/res/values-kn/strings.xml
+++ b/Tethering/res/values-kn/strings.xml
@@ -16,14 +16,14 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="tethered_notification_title" msgid="6426563586025792944">"ಟೆಥರಿಂಗ್ ಅಥವಾ ಹಾಟ್ಸ್ಪಾಟ್ ಸಕ್ರಿಯವಾಗಿದೆ"</string>
- <string name="tethered_notification_message" msgid="64800879503420696">"ಸೆಟಪ್ ಮಾಡಲು ಟ್ಯಾಪ್ ಮಾಡಿ."</string>
- <string name="disable_tether_notification_title" msgid="3004509127903564191">"ಟೆಥರಿಂಗ್ ಅನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ"</string>
- <string name="disable_tether_notification_message" msgid="6717523799293901476">"ವಿವರಗಳಿಗಾಗಿ ನಿಮ್ಮ ನಿರ್ವಾಹಕರನ್ನು ಸಂಪರ್ಕಿಸಿ"</string>
- <string name="notification_channel_tethering_status" msgid="2663463891530932727">"ಹಾಟ್ಸ್ಪಾಟ್ ಮತ್ತು ಟೆಥರಿಂಗ್ ಸ್ಥಿತಿ"</string>
- <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
- <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
- <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
- <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
- <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
+ <string name="tethered_notification_title" msgid="5350162111436634622">"ಟೆಥರಿಂಗ್ ಅಥವಾ ಹಾಟ್ಸ್ಪಾಟ್ ಸಕ್ರಿಯವಾಗಿದೆ"</string>
+ <string name="tethered_notification_message" msgid="2338023450330652098">"ಸೆಟಪ್ ಮಾಡಲು ಟ್ಯಾಪ್ ಮಾಡಿ."</string>
+ <string name="disable_tether_notification_title" msgid="3183576627492925522">"ಟೆಥರಿಂಗ್ ಅನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ"</string>
+ <string name="disable_tether_notification_message" msgid="6655882039707534929">"ವಿವರಗಳಿಗಾಗಿ ನಿಮ್ಮ ನಿರ್ವಾಹಕರನ್ನು ಸಂಪರ್ಕಿಸಿ"</string>
+ <string name="notification_channel_tethering_status" msgid="7030733422705019001">"ಹಾಟ್ಸ್ಪಾಟ್ ಮತ್ತು ಟೆಥರಿಂಗ್ ಸ್ಥಿತಿ"</string>
+ <string name="no_upstream_notification_title" msgid="2052743091868702475"></string>
+ <string name="no_upstream_notification_message" msgid="6932020551635470134"></string>
+ <string name="no_upstream_notification_disable_button" msgid="8836277213343697023"></string>
+ <string name="upstream_roaming_notification_title" msgid="8614262557406849762"></string>
+ <string name="upstream_roaming_notification_message" msgid="5999740876323106599"></string>
</resources>
diff --git a/Tethering/res/values-ko/strings.xml b/Tethering/res/values-ko/strings.xml
index 156b247..f7b8da0 100644
--- a/Tethering/res/values-ko/strings.xml
+++ b/Tethering/res/values-ko/strings.xml
@@ -16,14 +16,14 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="tethered_notification_title" msgid="6426563586025792944">"테더링 또는 핫스팟 사용"</string>
- <string name="tethered_notification_message" msgid="64800879503420696">"설정하려면 탭하세요."</string>
- <string name="disable_tether_notification_title" msgid="3004509127903564191">"테더링이 사용 중지됨"</string>
- <string name="disable_tether_notification_message" msgid="6717523799293901476">"자세한 정보는 관리자에게 문의하세요."</string>
- <string name="notification_channel_tethering_status" msgid="2663463891530932727">"핫스팟 및 테더링 상태"</string>
- <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
- <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
- <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
- <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
- <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
+ <string name="tethered_notification_title" msgid="5350162111436634622">"테더링 또는 핫스팟 사용 중"</string>
+ <string name="tethered_notification_message" msgid="2338023450330652098">"설정하려면 탭하세요."</string>
+ <string name="disable_tether_notification_title" msgid="3183576627492925522">"테더링이 사용 중지됨"</string>
+ <string name="disable_tether_notification_message" msgid="6655882039707534929">"자세한 정보는 관리자에게 문의하세요."</string>
+ <string name="notification_channel_tethering_status" msgid="7030733422705019001">"핫스팟 및 테더링 상태"</string>
+ <string name="no_upstream_notification_title" msgid="2052743091868702475"></string>
+ <string name="no_upstream_notification_message" msgid="6932020551635470134"></string>
+ <string name="no_upstream_notification_disable_button" msgid="8836277213343697023"></string>
+ <string name="upstream_roaming_notification_title" msgid="8614262557406849762"></string>
+ <string name="upstream_roaming_notification_message" msgid="5999740876323106599"></string>
</resources>
diff --git a/Tethering/res/values-ky/strings.xml b/Tethering/res/values-ky/strings.xml
index 18ee5fd..35e6453 100644
--- a/Tethering/res/values-ky/strings.xml
+++ b/Tethering/res/values-ky/strings.xml
@@ -16,14 +16,14 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="tethered_notification_title" msgid="6426563586025792944">"Модем режими күйүп турат"</string>
- <string name="tethered_notification_message" msgid="64800879503420696">"Жөндөө үчүн таптап коюңуз."</string>
- <string name="disable_tether_notification_title" msgid="3004509127903564191">"Телефонду модем катары колдонууга болбойт"</string>
- <string name="disable_tether_notification_message" msgid="6717523799293901476">"Кеңири маалымат үчүн администраторуңузга кайрылыңыз"</string>
- <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Байланыш түйүнүнүн жана модем режиминин статусу"</string>
- <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
- <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
- <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
- <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
- <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
+ <string name="tethered_notification_title" msgid="5350162111436634622">"Модем режими күйүп турат"</string>
+ <string name="tethered_notification_message" msgid="2338023450330652098">"Тууралоо үчүн басыңыз."</string>
+ <string name="disable_tether_notification_title" msgid="3183576627492925522">"Модем режими өчүк"</string>
+ <string name="disable_tether_notification_message" msgid="6655882039707534929">"Кеңири маалымат үчүн администраторуңузга кайрылыңыз"</string>
+ <string name="notification_channel_tethering_status" msgid="7030733422705019001">"Хотспот жана байланыш түйүнүүн статусу"</string>
+ <string name="no_upstream_notification_title" msgid="2052743091868702475"></string>
+ <string name="no_upstream_notification_message" msgid="6932020551635470134"></string>
+ <string name="no_upstream_notification_disable_button" msgid="8836277213343697023"></string>
+ <string name="upstream_roaming_notification_title" msgid="8614262557406849762"></string>
+ <string name="upstream_roaming_notification_message" msgid="5999740876323106599"></string>
</resources>
diff --git a/Tethering/res/values-lo/strings.xml b/Tethering/res/values-lo/strings.xml
index b127670..046551d 100644
--- a/Tethering/res/values-lo/strings.xml
+++ b/Tethering/res/values-lo/strings.xml
@@ -16,14 +16,14 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="tethered_notification_title" msgid="6426563586025792944">"ເປີດການປ່ອຍສັນຍານ ຫຼື ຮັອດສະປອດແລ້ວ"</string>
- <string name="tethered_notification_message" msgid="64800879503420696">"ແຕະເພື່ອຕັ້ງຄ່າ."</string>
- <string name="disable_tether_notification_title" msgid="3004509127903564191">"ການປ່ອຍສັນຍານຖືກປິດໄວ້"</string>
- <string name="disable_tether_notification_message" msgid="6717523799293901476">"ຕິດຕໍ່ຜູ້ເບິ່ງແຍງລະບົບສຳລັບລາຍລະອຽດ"</string>
- <string name="notification_channel_tethering_status" msgid="2663463891530932727">"ສະຖານະຮັອດສະປອດ ແລະ ການປ່ອຍສັນຍານ"</string>
- <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
- <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
- <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
- <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
- <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
+ <string name="tethered_notification_title" msgid="5350162111436634622">"ການປ່ອຍສັນຍານ ຫຼື ຮັອດສະປອດເປີດນຳໃຊ້ຢູ່"</string>
+ <string name="tethered_notification_message" msgid="2338023450330652098">"ແຕະເພື່ອຕັ້ງຄ່າ."</string>
+ <string name="disable_tether_notification_title" msgid="3183576627492925522">"ການປ່ອຍສັນຍານຖືກປິດໄວ້"</string>
+ <string name="disable_tether_notification_message" msgid="6655882039707534929">"ຕິດຕໍ່ຜູ້ເບິ່ງແຍງລະບົບຂອງທ່ານສຳລັບລາຍລະອຽດ"</string>
+ <string name="notification_channel_tethering_status" msgid="7030733422705019001">"ສະຖານະຮັອດສະປອດ ແລະ ການປ່ອຍສັນຍານ"</string>
+ <string name="no_upstream_notification_title" msgid="2052743091868702475"></string>
+ <string name="no_upstream_notification_message" msgid="6932020551635470134"></string>
+ <string name="no_upstream_notification_disable_button" msgid="8836277213343697023"></string>
+ <string name="upstream_roaming_notification_title" msgid="8614262557406849762"></string>
+ <string name="upstream_roaming_notification_message" msgid="5999740876323106599"></string>
</resources>
diff --git a/Tethering/res/values-lt/strings.xml b/Tethering/res/values-lt/strings.xml
index 8427baf..c685318 100644
--- a/Tethering/res/values-lt/strings.xml
+++ b/Tethering/res/values-lt/strings.xml
@@ -16,14 +16,14 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="tethered_notification_title" msgid="6426563586025792944">"Įrenginys naudojamas kaip modemas arba įjungtas viešosios interneto prieigos taškas"</string>
- <string name="tethered_notification_message" msgid="64800879503420696">"Palieskite, kad nustatytumėte."</string>
- <string name="disable_tether_notification_title" msgid="3004509127903564191">"Įrenginio kaip modemo naudojimas išjungtas"</string>
- <string name="disable_tether_notification_message" msgid="6717523799293901476">"Jei reikia išsamios informacijos, susisiekite su administratoriumi"</string>
- <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Viešosios interneto prieigos taško ir įrenginio kaip modemo naudojimo būsena"</string>
- <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
- <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
- <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
- <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
- <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
+ <string name="tethered_notification_title" msgid="5350162111436634622">"Įrenginys naudojamas kaip modemas arba įjungtas viešosios interneto prieigos taškas"</string>
+ <string name="tethered_notification_message" msgid="2338023450330652098">"Palieskite, kad nustatytumėte."</string>
+ <string name="disable_tether_notification_title" msgid="3183576627492925522">"Įrenginio kaip modemo naudojimas išjungtas"</string>
+ <string name="disable_tether_notification_message" msgid="6655882039707534929">"Jei reikia išsamios informacijos, susisiekite su administratoriumi"</string>
+ <string name="notification_channel_tethering_status" msgid="7030733422705019001">"Viešosios interneto prieigos taško ir įrenginio kaip modemo naudojimo būsena"</string>
+ <string name="no_upstream_notification_title" msgid="2052743091868702475"></string>
+ <string name="no_upstream_notification_message" msgid="6932020551635470134"></string>
+ <string name="no_upstream_notification_disable_button" msgid="8836277213343697023"></string>
+ <string name="upstream_roaming_notification_title" msgid="8614262557406849762"></string>
+ <string name="upstream_roaming_notification_message" msgid="5999740876323106599"></string>
</resources>
diff --git a/Tethering/res/values-lv/strings.xml b/Tethering/res/values-lv/strings.xml
index aa2d699..fd8751c 100644
--- a/Tethering/res/values-lv/strings.xml
+++ b/Tethering/res/values-lv/strings.xml
@@ -16,14 +16,14 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="tethered_notification_title" msgid="6426563586025792944">"Piesaiste vai tīklājs ir aktīvs."</string>
- <string name="tethered_notification_message" msgid="64800879503420696">"Pieskarieties, lai to iestatītu."</string>
- <string name="disable_tether_notification_title" msgid="3004509127903564191">"Piesaiste ir atspējota"</string>
- <string name="disable_tether_notification_message" msgid="6717523799293901476">"Lai iegūtu detalizētu informāciju, sazinieties ar savu administratoru."</string>
- <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Tīklāja un piesaistes statuss"</string>
- <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
- <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
- <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
- <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
- <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
+ <string name="tethered_notification_title" msgid="5350162111436634622">"Piesaiste vai tīklājs ir aktīvs"</string>
+ <string name="tethered_notification_message" msgid="2338023450330652098">"Pieskarieties, lai iestatītu."</string>
+ <string name="disable_tether_notification_title" msgid="3183576627492925522">"Piesaiste ir atspējota"</string>
+ <string name="disable_tether_notification_message" msgid="6655882039707534929">"Lai iegūtu detalizētu informāciju, sazinieties ar savu administratoru."</string>
+ <string name="notification_channel_tethering_status" msgid="7030733422705019001">"Tīklāja un piesaistes statuss"</string>
+ <string name="no_upstream_notification_title" msgid="2052743091868702475"></string>
+ <string name="no_upstream_notification_message" msgid="6932020551635470134"></string>
+ <string name="no_upstream_notification_disable_button" msgid="8836277213343697023"></string>
+ <string name="upstream_roaming_notification_title" msgid="8614262557406849762"></string>
+ <string name="upstream_roaming_notification_message" msgid="5999740876323106599"></string>
</resources>
diff --git a/Tethering/res/values-mcc310-mnc004-af/strings.xml b/Tethering/res/values-mcc310-mnc004-af/strings.xml
index 19d659c..216c02c 100644
--- a/Tethering/res/values-mcc310-mnc004-af/strings.xml
+++ b/Tethering/res/values-mcc310-mnc004-af/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="5030042590486713460">"Verbinding het nie internet nie"</string>
- <string name="no_upstream_notification_message" msgid="3843613362272973447">"Toestelle kan nie koppel nie"</string>
- <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Skakel verbinding af"</string>
- <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"Warmkol of verbinding is aan"</string>
- <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"Bykomende heffings kan geld terwyl jy swerf"</string>
+ <string name="no_upstream_notification_title" msgid="3584617491053416666">"Verbinding het nie internet nie"</string>
+ <string name="no_upstream_notification_message" msgid="5626323795587558017">"Toestelle kan nie koppel nie"</string>
+ <string name="no_upstream_notification_disable_button" msgid="868677179945695858">"Skakel verbinding af"</string>
+ <string name="upstream_roaming_notification_title" msgid="2870229486619751829">"Warmkol of verbinding is aan"</string>
+ <string name="upstream_roaming_notification_message" msgid="5229740963392849544">"Bykomende heffings kan geld terwyl jy swerf"</string>
</resources>
diff --git a/Tethering/res/values-mcc310-mnc004-am/strings.xml b/Tethering/res/values-mcc310-mnc004-am/strings.xml
index 8995430..666630a 100644
--- a/Tethering/res/values-mcc310-mnc004-am/strings.xml
+++ b/Tethering/res/values-mcc310-mnc004-am/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="5030042590486713460">"ማስተሳሰር ምንም በይነመረብ የለውም"</string>
- <string name="no_upstream_notification_message" msgid="3843613362272973447">"መሣሪያዎችን ማገናኘት አይቻልም"</string>
- <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"ማስተሳሰርን አጥፋ"</string>
- <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"መገናኛ ነጥብ ወይም ማስተሳሰር በርቷል"</string>
- <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"በሚያንዣብብበት ጊዜ ተጨማሪ ክፍያዎች ተፈጻሚ ሊሆኑ ይችላሉ"</string>
+ <string name="no_upstream_notification_title" msgid="3584617491053416666">"እንደ ሞደም መሰካት ምንም በይነመረብ የለውም"</string>
+ <string name="no_upstream_notification_message" msgid="5626323795587558017">"መሣሪያዎችን ማገናኘት አልተቻልም"</string>
+ <string name="no_upstream_notification_disable_button" msgid="868677179945695858">"እንደ ሞደም መሰካትን አጥፋ"</string>
+ <string name="upstream_roaming_notification_title" msgid="2870229486619751829">"መገናኛ ነጥብ ወይም እንደ ሞደም መሰካት በርቷል"</string>
+ <string name="upstream_roaming_notification_message" msgid="5229740963392849544">"በሚያንዣብብበት ጊዜ ተጨማሪ ክፍያዎች ተፈጻሚ ሊሆኑ ይችላሉ"</string>
</resources>
diff --git a/Tethering/res/values-mcc310-mnc004-ar/strings.xml b/Tethering/res/values-mcc310-mnc004-ar/strings.xml
index 54f3b53..2859803 100644
--- a/Tethering/res/values-mcc310-mnc004-ar/strings.xml
+++ b/Tethering/res/values-mcc310-mnc004-ar/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="5030042590486713460">"ما مِن اتصال بالإنترنت خلال التوصيل"</string>
- <string name="no_upstream_notification_message" msgid="3843613362272973447">"تعذّر اتصال الأجهزة"</string>
- <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"إيقاف التوصيل"</string>
- <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"نقطة الاتصال أو التوصيل مفعّلان"</string>
- <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"قد يتم تطبيق رسوم إضافية أثناء التجوال."</string>
+ <string name="no_upstream_notification_title" msgid="3584617491053416666">"ما مِن اتصال بالإنترنت خلال التوصيل"</string>
+ <string name="no_upstream_notification_message" msgid="5626323795587558017">"يتعذّر اتصال الأجهزة"</string>
+ <string name="no_upstream_notification_disable_button" msgid="868677179945695858">"إيقاف التوصيل"</string>
+ <string name="upstream_roaming_notification_title" msgid="2870229486619751829">"نقطة الاتصال مفعَّلة أو التوصيل مفعَّل"</string>
+ <string name="upstream_roaming_notification_message" msgid="5229740963392849544">"قد يتم تحصيل رسوم إضافية أثناء التجوال."</string>
</resources>
diff --git a/Tethering/res/values-mcc310-mnc004-as/strings.xml b/Tethering/res/values-mcc310-mnc004-as/strings.xml
index e215141..360c8ca 100644
--- a/Tethering/res/values-mcc310-mnc004-as/strings.xml
+++ b/Tethering/res/values-mcc310-mnc004-as/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="5030042590486713460">"টে\'ডাৰিঙৰ ইণ্টাৰনেট নাই"</string>
- <string name="no_upstream_notification_message" msgid="3843613362272973447">"ডিভাইচসমূহ সংযোগ কৰিব নোৱাৰি"</string>
- <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"টে\'ডাৰিং অফ কৰক"</string>
- <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"হটস্পট অথবা টে\'ডাৰিং অন আছে"</string>
- <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"ৰ\'মিঙত থাকিলে অতিৰিক্ত মাচুল প্ৰযোজ্য হ’ব পাৰে"</string>
+ <string name="no_upstream_notification_title" msgid="3584617491053416666">"টে’ডাৰিঙৰ ইণ্টাৰনেট নাই"</string>
+ <string name="no_upstream_notification_message" msgid="5626323795587558017">"ডিভাইচসমূহ সংযোগ কৰিব নোৱাৰি"</string>
+ <string name="no_upstream_notification_disable_button" msgid="868677179945695858">"টে’ডাৰিং অফ কৰক"</string>
+ <string name="upstream_roaming_notification_title" msgid="2870229486619751829">"হ’টস্প’ট অথবা টে’ডাৰিং অন আছে"</string>
+ <string name="upstream_roaming_notification_message" msgid="5229740963392849544">"ৰ’মিঙত থাকিলে অতিৰিক্ত মাচুল প্ৰযোজ্য হ’ব পাৰে"</string>
</resources>
diff --git a/Tethering/res/values-mcc310-mnc004-az/strings.xml b/Tethering/res/values-mcc310-mnc004-az/strings.xml
index 1fd8e4c..b7fdd70 100644
--- a/Tethering/res/values-mcc310-mnc004-az/strings.xml
+++ b/Tethering/res/values-mcc310-mnc004-az/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="5030042590486713460">"Modemin internetə girişi yoxdur"</string>
- <string name="no_upstream_notification_message" msgid="3843613362272973447">"Cihazları qoşmaq mümkün deyil"</string>
- <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Modemi deaktiv edin"</string>
- <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"Hotspot və ya modem aktivdir"</string>
- <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"Rouminq zamanı əlavə ödənişlər tətbiq edilə bilər"</string>
+ <string name="no_upstream_notification_title" msgid="3584617491053416666">"Modem rejimi internetə qoşulmayıb"</string>
+ <string name="no_upstream_notification_message" msgid="5626323795587558017">"Cihazları qoşmaq olmur"</string>
+ <string name="no_upstream_notification_disable_button" msgid="868677179945695858">"Modem rejimini deaktiv edin"</string>
+ <string name="upstream_roaming_notification_title" msgid="2870229486619751829">"Hotspot və ya modem rejimi aktivdir"</string>
+ <string name="upstream_roaming_notification_message" msgid="5229740963392849544">"Rouminq zamanı əlavə ödəniş çıxıla bilər"</string>
</resources>
diff --git a/Tethering/res/values-mcc310-mnc004-b+sr+Latn/strings.xml b/Tethering/res/values-mcc310-mnc004-b+sr+Latn/strings.xml
index 1abe4f3..a214f93 100644
--- a/Tethering/res/values-mcc310-mnc004-b+sr+Latn/strings.xml
+++ b/Tethering/res/values-mcc310-mnc004-b+sr+Latn/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="5030042590486713460">"Privezivanje nema pristup internetu"</string>
- <string name="no_upstream_notification_message" msgid="3843613362272973447">"Povezivanje uređaja nije uspelo"</string>
- <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Isključi privezivanje"</string>
- <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"Uključen je hotspot ili privezivanje"</string>
- <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"Možda važe dodatni troškovi u romingu"</string>
+ <string name="no_upstream_notification_title" msgid="3584617491053416666">"Privezivanje nema pristup internetu"</string>
+ <string name="no_upstream_notification_message" msgid="5626323795587558017">"Povezivanje uređaja nije uspelo"</string>
+ <string name="no_upstream_notification_disable_button" msgid="868677179945695858">"Isključi privezivanje"</string>
+ <string name="upstream_roaming_notification_title" msgid="2870229486619751829">"Uključen je hotspot ili privezivanje"</string>
+ <string name="upstream_roaming_notification_message" msgid="5229740963392849544">"Možda važe dodatni troškovi u romingu"</string>
</resources>
diff --git a/Tethering/res/values-mcc310-mnc004-be/strings.xml b/Tethering/res/values-mcc310-mnc004-be/strings.xml
index 38dbd1e..316e856 100644
--- a/Tethering/res/values-mcc310-mnc004-be/strings.xml
+++ b/Tethering/res/values-mcc310-mnc004-be/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="5030042590486713460">"Рэжым мадэма выкарыстоўваецца без доступу да інтэрнэту"</string>
- <string name="no_upstream_notification_message" msgid="3843613362272973447">"Не ўдалося падключыць прылады"</string>
- <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Выключыць рэжым мадэма"</string>
- <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"Хот-спот або рэжым мадэма ўключаны"</string>
- <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"Пры выкарыстанні роўмінгу можа спаганяцца дадатковая плата"</string>
+ <string name="no_upstream_notification_title" msgid="3584617491053416666">"Рэжым мадэма выкарыстоўваецца без доступу да інтэрнэту"</string>
+ <string name="no_upstream_notification_message" msgid="5626323795587558017">"Не ўдалося падключыць прылады"</string>
+ <string name="no_upstream_notification_disable_button" msgid="868677179945695858">"Выключыць рэжым мадэма"</string>
+ <string name="upstream_roaming_notification_title" msgid="2870229486619751829">"Хот-спот або рэжым мадэма ўключаны"</string>
+ <string name="upstream_roaming_notification_message" msgid="5229740963392849544">"Пры выкарыстанні роўмінгу можа спаганяцца дадатковая плата"</string>
</resources>
diff --git a/Tethering/res/values-mcc310-mnc004-bg/strings.xml b/Tethering/res/values-mcc310-mnc004-bg/strings.xml
index 04b44db..a31c06a 100644
--- a/Tethering/res/values-mcc310-mnc004-bg/strings.xml
+++ b/Tethering/res/values-mcc310-mnc004-bg/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="5030042590486713460">"Тетърингът няма връзка с интернет"</string>
- <string name="no_upstream_notification_message" msgid="3843613362272973447">"Устройствата не могат да установят връзка"</string>
- <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Изключване на тетъринга"</string>
- <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"Точката за достъп или тетърингът са включени"</string>
- <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"Възможно е да ви бъдат начислени допълнителни такси при роуминг"</string>
+ <string name="no_upstream_notification_title" msgid="3584617491053416666">"Няма връзка с интернет за тетъринг"</string>
+ <string name="no_upstream_notification_message" msgid="5626323795587558017">"Устройствата не могат да установят връзка"</string>
+ <string name="no_upstream_notification_disable_button" msgid="868677179945695858">"Изключване на функцията за тетъринг"</string>
+ <string name="upstream_roaming_notification_title" msgid="2870229486619751829">"Точката за достъп или функцията за тетъринг са включени"</string>
+ <string name="upstream_roaming_notification_message" msgid="5229740963392849544">"Възможно е да ви бъдат начислени допълнителни такси при роуминг"</string>
</resources>
diff --git a/Tethering/res/values-mcc310-mnc004-bn/strings.xml b/Tethering/res/values-mcc310-mnc004-bn/strings.xml
index 579d1be..f49b14c 100644
--- a/Tethering/res/values-mcc310-mnc004-bn/strings.xml
+++ b/Tethering/res/values-mcc310-mnc004-bn/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="5030042590486713460">"টিথারিং করার জন্য কোনও ইন্টারনেট কানেকশন নেই"</string>
- <string name="no_upstream_notification_message" msgid="3843613362272973447">"ডিভাইস কানেক্ট করতে পারছে না"</string>
- <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"টিথারিং বন্ধ করুন"</string>
- <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"হটস্পট বা টিথারিং চালু আছে"</string>
- <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"রোমিংয়ের সময় অতিরিক্ত চার্জ করা হতে পারে"</string>
+ <string name="no_upstream_notification_title" msgid="3584617491053416666">"টেথারিং করার জন্য কোনও ইন্টারনেট কানেকশন লাগে না"</string>
+ <string name="no_upstream_notification_message" msgid="5626323795587558017">"ডিভাইস কানেক্ট করা যাচ্ছে না"</string>
+ <string name="no_upstream_notification_disable_button" msgid="868677179945695858">"টেথারিং বন্ধ করুন"</string>
+ <string name="upstream_roaming_notification_title" msgid="2870229486619751829">"হটস্পট বা টেথারিং চালু আছে"</string>
+ <string name="upstream_roaming_notification_message" msgid="5229740963392849544">"রোমিংয়ে থাকার সময় অতিরিক্ত চার্জ লাগতে পারে"</string>
</resources>
diff --git a/Tethering/res/values-mcc310-mnc004-bs/strings.xml b/Tethering/res/values-mcc310-mnc004-bs/strings.xml
index 9ce3efe..ed269c6 100644
--- a/Tethering/res/values-mcc310-mnc004-bs/strings.xml
+++ b/Tethering/res/values-mcc310-mnc004-bs/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="5030042590486713460">"Povezivanje putem mobitela nema internet"</string>
- <string name="no_upstream_notification_message" msgid="3843613362272973447">"Uređaji se ne mogu povezati"</string>
- <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Isključi povezivanje putem mobitela"</string>
- <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"Pristupna tačka ili povezivanje putem mobitela je uključeno"</string>
- <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"Mogu nastati dodatni troškovi u romingu"</string>
+ <string name="no_upstream_notification_title" msgid="3584617491053416666">"Dijeljenje internetske veze nema internet"</string>
+ <string name="no_upstream_notification_message" msgid="5626323795587558017">"Nije moguće povezati uređaje"</string>
+ <string name="no_upstream_notification_disable_button" msgid="868677179945695858">"Isključi dijeljenje internetske veze"</string>
+ <string name="upstream_roaming_notification_title" msgid="2870229486619751829">"Pristupna tačka ili dijeljenje internetske veze su uključeni"</string>
+ <string name="upstream_roaming_notification_message" msgid="5229740963392849544">"Mogu nastati dodatni troškovi u romingu"</string>
</resources>
diff --git a/Tethering/res/values-mcc310-mnc004-ca/strings.xml b/Tethering/res/values-mcc310-mnc004-ca/strings.xml
index 46d4c35..0826f4e 100644
--- a/Tethering/res/values-mcc310-mnc004-ca/strings.xml
+++ b/Tethering/res/values-mcc310-mnc004-ca/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="5030042590486713460">"La compartició de xarxa no té accés a Internet"</string>
- <string name="no_upstream_notification_message" msgid="3843613362272973447">"No es poden connectar els dispositius"</string>
- <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Desactiva la compartició de xarxa"</string>
- <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"S\'ha activat el punt d\'accés Wi‑Fi o la compartició de xarxa"</string>
- <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"És possible que s\'apliquin costos addicionals en itinerància"</string>
+ <string name="no_upstream_notification_title" msgid="3584617491053416666">"La compartició de xarxa no té accés a Internet"</string>
+ <string name="no_upstream_notification_message" msgid="5626323795587558017">"No es poden connectar els dispositius"</string>
+ <string name="no_upstream_notification_disable_button" msgid="868677179945695858">"Desactiva la compartició de xarxa"</string>
+ <string name="upstream_roaming_notification_title" msgid="2870229486619751829">"El punt d\'accés Wi‑Fi o la compartició de xarxa estan activats"</string>
+ <string name="upstream_roaming_notification_message" msgid="5229740963392849544">"És possible que s\'apliquin costos addicionals en itinerància"</string>
</resources>
diff --git a/Tethering/res/values-mcc310-mnc004-cs/strings.xml b/Tethering/res/values-mcc310-mnc004-cs/strings.xml
index cc13860..6899f71 100644
--- a/Tethering/res/values-mcc310-mnc004-cs/strings.xml
+++ b/Tethering/res/values-mcc310-mnc004-cs/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="5030042590486713460">"Tethering nemá připojení k internetu"</string>
- <string name="no_upstream_notification_message" msgid="3843613362272973447">"Zařízení se nemůžou připojit"</string>
- <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Vypnout tethering"</string>
- <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"Je zapnutý hotspot nebo tethering"</string>
- <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"Při roamingu mohou být účtovány dodatečné poplatky"</string>
+ <string name="no_upstream_notification_title" msgid="3584617491053416666">"Tethering nemá připojení k internetu"</string>
+ <string name="no_upstream_notification_message" msgid="5626323795587558017">"Zařízení se nemůžou připojit"</string>
+ <string name="no_upstream_notification_disable_button" msgid="868677179945695858">"Vypnout tethering"</string>
+ <string name="upstream_roaming_notification_title" msgid="2870229486619751829">"Je zapnutý hotspot nebo tethering"</string>
+ <string name="upstream_roaming_notification_message" msgid="5229740963392849544">"Při roamingu mohou být účtovány dodatečné poplatky"</string>
</resources>
diff --git a/Tethering/res/values-mcc310-mnc004-da/strings.xml b/Tethering/res/values-mcc310-mnc004-da/strings.xml
index 92c3ae1..dbca93b 100644
--- a/Tethering/res/values-mcc310-mnc004-da/strings.xml
+++ b/Tethering/res/values-mcc310-mnc004-da/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="5030042590486713460">"Netdeling har ingen internetforbindelse"</string>
- <string name="no_upstream_notification_message" msgid="3843613362272973447">"Enheder kan ikke oprette forbindelse"</string>
- <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Deaktiver netdeling"</string>
- <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"Hotspot eller netdeling er aktiveret"</string>
- <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"Der opkræves muligvis yderligere gebyrer ved roaming"</string>
+ <string name="no_upstream_notification_title" msgid="3584617491053416666">"Netdeling har ingen internetforbindelse"</string>
+ <string name="no_upstream_notification_message" msgid="5626323795587558017">"Enheder kan ikke oprette forbindelse"</string>
+ <string name="no_upstream_notification_disable_button" msgid="868677179945695858">"Deaktiver netdeling"</string>
+ <string name="upstream_roaming_notification_title" msgid="2870229486619751829">"Hotspot eller netdeling er aktiveret"</string>
+ <string name="upstream_roaming_notification_message" msgid="5229740963392849544">"Der opkræves muligvis yderligere gebyrer ved roaming"</string>
</resources>
diff --git a/Tethering/res/values-mcc310-mnc004-de/strings.xml b/Tethering/res/values-mcc310-mnc004-de/strings.xml
index 967eb4d..139b4e0 100644
--- a/Tethering/res/values-mcc310-mnc004-de/strings.xml
+++ b/Tethering/res/values-mcc310-mnc004-de/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="5030042590486713460">"Tethering hat keinen Internetzugriff"</string>
- <string name="no_upstream_notification_message" msgid="3843613362272973447">"Geräte können sich nicht verbinden"</string>
- <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Tethering deaktivieren"</string>
- <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"Hotspot oder Tethering ist aktiviert"</string>
- <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"Für das Roaming können zusätzliche Gebühren anfallen"</string>
+ <string name="no_upstream_notification_title" msgid="3584617491053416666">"Tethering hat keinen Internetzugriff"</string>
+ <string name="no_upstream_notification_message" msgid="5626323795587558017">"Geräte können sich nicht verbinden"</string>
+ <string name="no_upstream_notification_disable_button" msgid="868677179945695858">"Tethering deaktivieren"</string>
+ <string name="upstream_roaming_notification_title" msgid="2870229486619751829">"Hotspot oder Tethering ist aktiviert"</string>
+ <string name="upstream_roaming_notification_message" msgid="5229740963392849544">"Für das Roaming können zusätzliche Gebühren anfallen"</string>
</resources>
diff --git a/Tethering/res/values-mcc310-mnc004-el/strings.xml b/Tethering/res/values-mcc310-mnc004-el/strings.xml
index 5fb4974..d778b03 100644
--- a/Tethering/res/values-mcc310-mnc004-el/strings.xml
+++ b/Tethering/res/values-mcc310-mnc004-el/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="5030042590486713460">"Η σύνδεση δεν έχει πρόσβαση στο διαδίκτυο"</string>
- <string name="no_upstream_notification_message" msgid="3843613362272973447">"Δεν είναι δυνατή η σύνδεση των συσκευών"</string>
- <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Απενεργοποιήστε τη σύνδεση"</string>
- <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"Ενεργό σημείο πρόσβασης Wi-Fi ή ενεργή σύνδεση"</string>
- <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"Ενδέχεται να ισχύουν επιπλέον χρεώσεις κατά την περιαγωγή."</string>
+ <string name="no_upstream_notification_title" msgid="3584617491053416666">"Η σύνδεση δεν έχει πρόσβαση στο διαδίκτυο"</string>
+ <string name="no_upstream_notification_message" msgid="5626323795587558017">"Δεν είναι δυνατή η σύνδεση των συσκευών"</string>
+ <string name="no_upstream_notification_disable_button" msgid="868677179945695858">"Απενεργοποίηση σύνδεσης"</string>
+ <string name="upstream_roaming_notification_title" msgid="2870229486619751829">"Ενεργό σημείο πρόσβασης Wi-Fi ή ενεργή σύνδεση"</string>
+ <string name="upstream_roaming_notification_message" msgid="5229740963392849544">"Ενδέχεται να ισχύουν επιπλέον χρεώσεις κατά την περιαγωγή."</string>
</resources>
diff --git a/Tethering/res/values-mcc310-mnc004-en-rAU/strings.xml b/Tethering/res/values-mcc310-mnc004-en-rAU/strings.xml
index 45647f9..bc68d00 100644
--- a/Tethering/res/values-mcc310-mnc004-en-rAU/strings.xml
+++ b/Tethering/res/values-mcc310-mnc004-en-rAU/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="5030042590486713460">"Tethering has no Internet"</string>
- <string name="no_upstream_notification_message" msgid="3843613362272973447">"Devices can’t connect"</string>
- <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Turn off tethering"</string>
- <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"Hotspot or tethering is on"</string>
- <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"Additional charges may apply while roaming"</string>
+ <string name="no_upstream_notification_title" msgid="3584617491053416666">"Tethering has no Internet"</string>
+ <string name="no_upstream_notification_message" msgid="5626323795587558017">"Devices can\'t connect"</string>
+ <string name="no_upstream_notification_disable_button" msgid="868677179945695858">"Turn off tethering"</string>
+ <string name="upstream_roaming_notification_title" msgid="2870229486619751829">"Hotspot or tethering is on"</string>
+ <string name="upstream_roaming_notification_message" msgid="5229740963392849544">"Additional charges may apply while roaming"</string>
</resources>
diff --git a/Tethering/res/values-mcc310-mnc004-en-rCA/strings.xml b/Tethering/res/values-mcc310-mnc004-en-rCA/strings.xml
index 45647f9..4f39489 100644
--- a/Tethering/res/values-mcc310-mnc004-en-rCA/strings.xml
+++ b/Tethering/res/values-mcc310-mnc004-en-rCA/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="5030042590486713460">"Tethering has no Internet"</string>
- <string name="no_upstream_notification_message" msgid="3843613362272973447">"Devices can’t connect"</string>
- <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Turn off tethering"</string>
- <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"Hotspot or tethering is on"</string>
- <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"Additional charges may apply while roaming"</string>
+ <string name="no_upstream_notification_title" msgid="3584617491053416666">"Tethering has no internet"</string>
+ <string name="no_upstream_notification_message" msgid="5626323795587558017">"Devices can’t connect"</string>
+ <string name="no_upstream_notification_disable_button" msgid="868677179945695858">"Turn off tethering"</string>
+ <string name="upstream_roaming_notification_title" msgid="2870229486619751829">"Hotspot or tethering is on"</string>
+ <string name="upstream_roaming_notification_message" msgid="5229740963392849544">"Additional charges may apply while roaming"</string>
</resources>
diff --git a/Tethering/res/values-mcc310-mnc004-en-rGB/strings.xml b/Tethering/res/values-mcc310-mnc004-en-rGB/strings.xml
index 45647f9..bc68d00 100644
--- a/Tethering/res/values-mcc310-mnc004-en-rGB/strings.xml
+++ b/Tethering/res/values-mcc310-mnc004-en-rGB/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="5030042590486713460">"Tethering has no Internet"</string>
- <string name="no_upstream_notification_message" msgid="3843613362272973447">"Devices can’t connect"</string>
- <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Turn off tethering"</string>
- <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"Hotspot or tethering is on"</string>
- <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"Additional charges may apply while roaming"</string>
+ <string name="no_upstream_notification_title" msgid="3584617491053416666">"Tethering has no Internet"</string>
+ <string name="no_upstream_notification_message" msgid="5626323795587558017">"Devices can\'t connect"</string>
+ <string name="no_upstream_notification_disable_button" msgid="868677179945695858">"Turn off tethering"</string>
+ <string name="upstream_roaming_notification_title" msgid="2870229486619751829">"Hotspot or tethering is on"</string>
+ <string name="upstream_roaming_notification_message" msgid="5229740963392849544">"Additional charges may apply while roaming"</string>
</resources>
diff --git a/Tethering/res/values-mcc310-mnc004-en-rIN/strings.xml b/Tethering/res/values-mcc310-mnc004-en-rIN/strings.xml
index 45647f9..bc68d00 100644
--- a/Tethering/res/values-mcc310-mnc004-en-rIN/strings.xml
+++ b/Tethering/res/values-mcc310-mnc004-en-rIN/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="5030042590486713460">"Tethering has no Internet"</string>
- <string name="no_upstream_notification_message" msgid="3843613362272973447">"Devices can’t connect"</string>
- <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Turn off tethering"</string>
- <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"Hotspot or tethering is on"</string>
- <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"Additional charges may apply while roaming"</string>
+ <string name="no_upstream_notification_title" msgid="3584617491053416666">"Tethering has no Internet"</string>
+ <string name="no_upstream_notification_message" msgid="5626323795587558017">"Devices can\'t connect"</string>
+ <string name="no_upstream_notification_disable_button" msgid="868677179945695858">"Turn off tethering"</string>
+ <string name="upstream_roaming_notification_title" msgid="2870229486619751829">"Hotspot or tethering is on"</string>
+ <string name="upstream_roaming_notification_message" msgid="5229740963392849544">"Additional charges may apply while roaming"</string>
</resources>
diff --git a/Tethering/res/values-mcc310-mnc004-en-rXC/strings.xml b/Tethering/res/values-mcc310-mnc004-en-rXC/strings.xml
index 7877074..be00edf 100644
--- a/Tethering/res/values-mcc310-mnc004-en-rXC/strings.xml
+++ b/Tethering/res/values-mcc310-mnc004-en-rXC/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="5030042590486713460">"Tethering has no internet"</string>
- <string name="no_upstream_notification_message" msgid="3843613362272973447">"Devices can’t connect"</string>
- <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Turn off tethering"</string>
- <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"Hotspot or tethering is on"</string>
- <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"Additional charges may apply while roaming"</string>
+ <string name="no_upstream_notification_title" msgid="3584617491053416666">"Tethering has no internet"</string>
+ <string name="no_upstream_notification_message" msgid="5626323795587558017">"Devices can’t connect"</string>
+ <string name="no_upstream_notification_disable_button" msgid="868677179945695858">"Turn off tethering"</string>
+ <string name="upstream_roaming_notification_title" msgid="2870229486619751829">"Hotspot or tethering is on"</string>
+ <string name="upstream_roaming_notification_message" msgid="5229740963392849544">"Additional charges may apply while roaming"</string>
</resources>
diff --git a/Tethering/res/values-mcc310-mnc004-es-rUS/strings.xml b/Tethering/res/values-mcc310-mnc004-es-rUS/strings.xml
index 08edd81..e00a7a0 100644
--- a/Tethering/res/values-mcc310-mnc004-es-rUS/strings.xml
+++ b/Tethering/res/values-mcc310-mnc004-es-rUS/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="5030042590486713460">"La conexión mediante dispositivo móvil no tiene Internet"</string>
- <string name="no_upstream_notification_message" msgid="3843613362272973447">"No se pueden conectar los dispositivos"</string>
- <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Desactivar conexión mediante dispositivo móvil"</string>
- <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"Se activó el hotspot o la conexión mediante dispositivo móvil"</string>
- <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"Es posible que se apliquen cargos adicionales por roaming"</string>
+ <string name="no_upstream_notification_title" msgid="3584617491053416666">"La conexión mediante dispositivo móvil no tiene Internet"</string>
+ <string name="no_upstream_notification_message" msgid="5626323795587558017">"No se pueden conectar los dispositivos"</string>
+ <string name="no_upstream_notification_disable_button" msgid="868677179945695858">"Desactivar conexión mediante dispositivo móvil"</string>
+ <string name="upstream_roaming_notification_title" msgid="2870229486619751829">"Se activó el hotspot o la conexión mediante dispositivo móvil"</string>
+ <string name="upstream_roaming_notification_message" msgid="5229740963392849544">"Es posible que se apliquen cargos adicionales por roaming"</string>
</resources>
diff --git a/Tethering/res/values-mcc310-mnc004-es/strings.xml b/Tethering/res/values-mcc310-mnc004-es/strings.xml
index 79f51d0..6c7e983 100644
--- a/Tethering/res/values-mcc310-mnc004-es/strings.xml
+++ b/Tethering/res/values-mcc310-mnc004-es/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="5030042590486713460">"La conexión no se puede compartir, porque no hay acceso a Internet"</string>
- <string name="no_upstream_notification_message" msgid="3843613362272973447">"Los dispositivos no se pueden conectar"</string>
- <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Desactivar conexión compartida"</string>
- <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"Punto de acceso o conexión compartida activados"</string>
- <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"Puede que se apliquen cargos adicionales en itinerancia"</string>
+ <string name="no_upstream_notification_title" msgid="3584617491053416666">"La conexión no se puede compartir, porque no hay acceso a Internet"</string>
+ <string name="no_upstream_notification_message" msgid="5626323795587558017">"Los dispositivos no se pueden conectar"</string>
+ <string name="no_upstream_notification_disable_button" msgid="868677179945695858">"Desactivar conexión compartida"</string>
+ <string name="upstream_roaming_notification_title" msgid="2870229486619751829">"Punto de acceso o conexión compartida activados"</string>
+ <string name="upstream_roaming_notification_message" msgid="5229740963392849544">"Pueden aplicarse cargos adicionales en roaming"</string>
</resources>
diff --git a/Tethering/res/values-mcc310-mnc004-et/strings.xml b/Tethering/res/values-mcc310-mnc004-et/strings.xml
index 2da5f8a..2f108fc 100644
--- a/Tethering/res/values-mcc310-mnc004-et/strings.xml
+++ b/Tethering/res/values-mcc310-mnc004-et/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="5030042590486713460">"Jagamisel puudub internetiühendus"</string>
- <string name="no_upstream_notification_message" msgid="3843613362272973447">"Seadmed ei saa ühendust luua"</string>
- <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Lülita jagamine välja"</string>
- <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"Kuumkoht või jagamine on sisse lülitatud"</string>
- <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"Rändluse kasutamisega võivad kaasneda lisatasud"</string>
+ <string name="no_upstream_notification_title" msgid="3584617491053416666">"Jagamisel puudub internetiühendus"</string>
+ <string name="no_upstream_notification_message" msgid="5626323795587558017">"Seadmed ei saa ühendust luua"</string>
+ <string name="no_upstream_notification_disable_button" msgid="868677179945695858">"Lülita jagamine välja"</string>
+ <string name="upstream_roaming_notification_title" msgid="2870229486619751829">"Kuumkoht või jagamine on sisse lülitatud"</string>
+ <string name="upstream_roaming_notification_message" msgid="5229740963392849544">"Rändluse kasutamisega võivad kaasneda lisatasud"</string>
</resources>
diff --git a/Tethering/res/values-mcc310-mnc004-eu/strings.xml b/Tethering/res/values-mcc310-mnc004-eu/strings.xml
index 2073f28..c970dd7 100644
--- a/Tethering/res/values-mcc310-mnc004-eu/strings.xml
+++ b/Tethering/res/values-mcc310-mnc004-eu/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="5030042590486713460">"Konexioa partekatzeko aukerak ez du Interneteko konexiorik"</string>
- <string name="no_upstream_notification_message" msgid="3843613362272973447">"Ezin dira konektatu gailuak"</string>
- <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Desaktibatu konexioa partekatzeko aukera"</string>
- <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"Wifi-gunea edo konexioa partekatzeko aukera aktibatuta dago"</string>
- <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"Baliteke kostu gehigarriak ordaindu behar izatea ibiltaritzan"</string>
+ <string name="no_upstream_notification_title" msgid="3584617491053416666">"Konexioa partekatzeko aukerak ez du Interneteko konexiorik"</string>
+ <string name="no_upstream_notification_message" msgid="5626323795587558017">"Ezin dira konektatu gailuak"</string>
+ <string name="no_upstream_notification_disable_button" msgid="868677179945695858">"Desaktibatu konexioa partekatzeko aukera"</string>
+ <string name="upstream_roaming_notification_title" msgid="2870229486619751829">"Wifi-gunea edo konexioa partekatzeko aukera aktibatuta dago"</string>
+ <string name="upstream_roaming_notification_message" msgid="5229740963392849544">"Baliteke tarifa gehigarriak ordaindu behar izatea ibiltaritza erabili bitartean"</string>
</resources>
diff --git a/Tethering/res/values-mcc310-mnc004-fa/strings.xml b/Tethering/res/values-mcc310-mnc004-fa/strings.xml
index e21b2a0..7333e2f 100644
--- a/Tethering/res/values-mcc310-mnc004-fa/strings.xml
+++ b/Tethering/res/values-mcc310-mnc004-fa/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="5030042590486713460">"«اشتراکگذاری اینترنت» به اینترنت دسترسی ندارد"</string>
- <string name="no_upstream_notification_message" msgid="3843613362272973447">"دستگاهها متصل نمیشوند"</string>
- <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"خاموش کردن «اشتراکگذاری اینترنت»"</string>
- <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"«نقطه اتصال» یا «اشتراکگذاری اینترنت» روشن است"</string>
- <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"ممکن است درحین فراگردی تغییرات دیگر اعمال شود"</string>
+ <string name="no_upstream_notification_title" msgid="3584617491053416666">"«اشتراکگذاری اینترنت» به اینترنت دسترسی ندارد"</string>
+ <string name="no_upstream_notification_message" msgid="5626323795587558017">"دستگاهها متصل نمیشوند"</string>
+ <string name="no_upstream_notification_disable_button" msgid="868677179945695858">"خاموش کردن «اشتراکگذاری اینترنت»"</string>
+ <string name="upstream_roaming_notification_title" msgid="2870229486619751829">"«نقطه اتصال» یا «اشتراکگذاری اینترنت» روشن است"</string>
+ <string name="upstream_roaming_notification_message" msgid="5229740963392849544">"هنگام فراگردی ممکن است هزینههای اضافی کسر شود"</string>
</resources>
diff --git a/Tethering/res/values-mcc310-mnc004-fi/strings.xml b/Tethering/res/values-mcc310-mnc004-fi/strings.xml
index 88b0b13..3faed5b 100644
--- a/Tethering/res/values-mcc310-mnc004-fi/strings.xml
+++ b/Tethering/res/values-mcc310-mnc004-fi/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="5030042590486713460">"Ei jaettavaa internetyhteyttä"</string>
- <string name="no_upstream_notification_message" msgid="3843613362272973447">"Laitteet eivät voi muodostaa yhteyttä"</string>
- <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Laita yhteyden jakaminen pois päältä"</string>
- <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"Hotspot tai yhteyden jakaminen on päällä"</string>
- <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"Roaming voi aiheuttaa lisämaksuja"</string>
+ <string name="no_upstream_notification_title" msgid="3584617491053416666">"Puhelinta ei voi käyttää modeemina, koska sillä ei ole internet-yhteyttä"</string>
+ <string name="no_upstream_notification_message" msgid="5626323795587558017">"Laitteet eivät voi muodostaa yhteyttä"</string>
+ <string name="no_upstream_notification_disable_button" msgid="868677179945695858">"Laita puhelimen käyttäminen modeemina pois päältä"</string>
+ <string name="upstream_roaming_notification_title" msgid="2870229486619751829">"Hotspot tai puhelimen käyttäminen modeemina on päällä"</string>
+ <string name="upstream_roaming_notification_message" msgid="5229740963392849544">"Roaming voi aiheuttaa lisämaksuja"</string>
</resources>
diff --git a/Tethering/res/values-mcc310-mnc004-fr-rCA/strings.xml b/Tethering/res/values-mcc310-mnc004-fr-rCA/strings.xml
index 3b781bc..0659c40 100644
--- a/Tethering/res/values-mcc310-mnc004-fr-rCA/strings.xml
+++ b/Tethering/res/values-mcc310-mnc004-fr-rCA/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="5030042590486713460">"Le partage de connexion n\'est pas connecté à Internet"</string>
- <string name="no_upstream_notification_message" msgid="3843613362272973447">"Impossible de connecter les appareils"</string>
- <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Désactiver le partage de connexion"</string>
- <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"Le point d\'accès ou le partage de connexion est activé"</string>
- <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"En itinérance, des frais supplémentaires peuvent s\'appliquer"</string>
+ <string name="no_upstream_notification_title" msgid="3584617491053416666">"Le partage de connexion n\'est pas connecté à Internet"</string>
+ <string name="no_upstream_notification_message" msgid="5626323795587558017">"Impossible de connecter les appareils"</string>
+ <string name="no_upstream_notification_disable_button" msgid="868677179945695858">"Désactiver le partage de connexion"</string>
+ <string name="upstream_roaming_notification_title" msgid="2870229486619751829">"Le point d\'accès sans fil ou le partage de connexion est activé"</string>
+ <string name="upstream_roaming_notification_message" msgid="5229740963392849544">"En itinérance, des frais supplémentaires peuvent s\'appliquer"</string>
</resources>
diff --git a/Tethering/res/values-mcc310-mnc004-fr/strings.xml b/Tethering/res/values-mcc310-mnc004-fr/strings.xml
index 51d7203..26065f8 100644
--- a/Tethering/res/values-mcc310-mnc004-fr/strings.xml
+++ b/Tethering/res/values-mcc310-mnc004-fr/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="5030042590486713460">"Aucune connexion à Internet n\'est disponible pour le partage de connexion"</string>
- <string name="no_upstream_notification_message" msgid="3843613362272973447">"Impossible de connecter les appareils"</string>
- <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Désactiver le partage de connexion"</string>
- <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"Le point d\'accès ou le partage de connexion est activé"</string>
- <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"En itinérance, des frais supplémentaires peuvent s\'appliquer"</string>
+ <string name="no_upstream_notification_title" msgid="3584617491053416666">"Aucune connexion à Internet disponible pour le partage de connexion"</string>
+ <string name="no_upstream_notification_message" msgid="5626323795587558017">"Impossible de connecter les appareils"</string>
+ <string name="no_upstream_notification_disable_button" msgid="868677179945695858">"Désactiver le partage de connexion"</string>
+ <string name="upstream_roaming_notification_title" msgid="2870229486619751829">"Le point d\'accès ou le partage de connexion est activé"</string>
+ <string name="upstream_roaming_notification_message" msgid="5229740963392849544">"En itinérance, des frais supplémentaires peuvent s\'appliquer"</string>
</resources>
diff --git a/Tethering/res/values-mcc310-mnc004-gl/strings.xml b/Tethering/res/values-mcc310-mnc004-gl/strings.xml
index 008ccb4..924e71b 100644
--- a/Tethering/res/values-mcc310-mnc004-gl/strings.xml
+++ b/Tethering/res/values-mcc310-mnc004-gl/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="5030042590486713460">"A conexión compartida non ten Internet"</string>
- <string name="no_upstream_notification_message" msgid="3843613362272973447">"Non se puideron conectar os dispositivos"</string>
- <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Desactivar conexión compartida"</string>
- <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"Está activada a zona wifi ou a conexión compartida"</string>
- <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"Pódense aplicar cargos adicionais en itinerancia"</string>
+ <string name="no_upstream_notification_title" msgid="3584617491053416666">"A conexión compartida non ten acceso a Internet"</string>
+ <string name="no_upstream_notification_message" msgid="5626323795587558017">"Non se puideron conectar os dispositivos"</string>
+ <string name="no_upstream_notification_disable_button" msgid="868677179945695858">"Desactivar conexión compartida"</string>
+ <string name="upstream_roaming_notification_title" msgid="2870229486619751829">"Está activada a zona wifi ou a conexión compartida"</string>
+ <string name="upstream_roaming_notification_message" msgid="5229740963392849544">"Pódense aplicar cargos adicionais en itinerancia"</string>
</resources>
diff --git a/Tethering/res/values-mcc310-mnc004-gu/strings.xml b/Tethering/res/values-mcc310-mnc004-gu/strings.xml
index f2e3b4d..ab446df 100644
--- a/Tethering/res/values-mcc310-mnc004-gu/strings.xml
+++ b/Tethering/res/values-mcc310-mnc004-gu/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="5030042590486713460">"ઇન્ટરનેટ શેર કરવાની સુવિધામાં ઇન્ટરનેટ નથી"</string>
- <string name="no_upstream_notification_message" msgid="3843613362272973447">"ડિવાઇસ કનેક્ટ કરી શકાતા નથી"</string>
- <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"ઇન્ટરનેટ શેર કરવાની સુવિધા બંધ કરો"</string>
- <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"હૉટસ્પૉટ અથવા ઇન્ટરનેટ શેર કરવાની સુવિધા ચાલુ છે"</string>
- <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"રોમિંગમાં વધારાના શુલ્ક લાગી શકે છે"</string>
+ <string name="no_upstream_notification_title" msgid="3584617491053416666">"ઇન્ટરનેટ શેર કરવાની સુવિધામાં ઇન્ટરનેટ નથી"</string>
+ <string name="no_upstream_notification_message" msgid="5626323795587558017">"ડિવાઇસ કનેક્ટ કરી શકાતા નથી"</string>
+ <string name="no_upstream_notification_disable_button" msgid="868677179945695858">"ઇન્ટરનેટ શેર કરવાની સુવિધા બંધ કરો"</string>
+ <string name="upstream_roaming_notification_title" msgid="2870229486619751829">"હૉટસ્પૉટ અથવા ઇન્ટરનેટ શેર કરવાની સુવિધા ચાલુ છે"</string>
+ <string name="upstream_roaming_notification_message" msgid="5229740963392849544">"રોમિંગ દરમિયાન વધારાના શુલ્ક લાગુ થઈ શકે છે"</string>
</resources>
diff --git a/Tethering/res/values-mcc310-mnc004-hi/strings.xml b/Tethering/res/values-mcc310-mnc004-hi/strings.xml
index b11839d..073a680 100644
--- a/Tethering/res/values-mcc310-mnc004-hi/strings.xml
+++ b/Tethering/res/values-mcc310-mnc004-hi/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="5030042590486713460">"टेदरिंग से इंटरनेट नहीं चल रहा"</string>
- <string name="no_upstream_notification_message" msgid="3843613362272973447">"डिवाइस कनेक्ट नहीं हो पा रहे"</string>
- <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"टेदरिंग बंद करें"</string>
- <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"हॉटस्पॉट या टेदरिंग चालू है"</string>
- <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"रोमिंग के दौरान अतिरिक्त शुल्क लग सकता है"</string>
+ <string name="no_upstream_notification_title" msgid="3584617491053416666">"टेदरिंग से इंटरनेट नहीं चल रहा है"</string>
+ <string name="no_upstream_notification_message" msgid="5626323795587558017">"डिवाइस कनेक्ट नहीं हो पा रहे"</string>
+ <string name="no_upstream_notification_disable_button" msgid="868677179945695858">"टेदरिंग बंद करें"</string>
+ <string name="upstream_roaming_notification_title" msgid="2870229486619751829">"हॉटस्पॉट या टेदरिंग चालू है"</string>
+ <string name="upstream_roaming_notification_message" msgid="5229740963392849544">"रोमिंग के दौरान अतिरिक्त शुल्क काटा जा सकता है"</string>
</resources>
diff --git a/Tethering/res/values-mcc310-mnc004-hr/strings.xml b/Tethering/res/values-mcc310-mnc004-hr/strings.xml
index 0a5aca2..6cc8415 100644
--- a/Tethering/res/values-mcc310-mnc004-hr/strings.xml
+++ b/Tethering/res/values-mcc310-mnc004-hr/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="5030042590486713460">"Modemsko povezivanje nema internet"</string>
- <string name="no_upstream_notification_message" msgid="3843613362272973447">"Uređaji se ne mogu povezati"</string>
- <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Isključivanje modemskog povezivanja"</string>
- <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"Uključena je žarišna točka ili modemsko povezivanje"</string>
- <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"U roamingu su mogući dodatni troškovi"</string>
+ <string name="no_upstream_notification_title" msgid="3584617491053416666">"Modemsko povezivanje nema internet"</string>
+ <string name="no_upstream_notification_message" msgid="5626323795587558017">"Uređaji se ne mogu povezati"</string>
+ <string name="no_upstream_notification_disable_button" msgid="868677179945695858">"Isključi modemsko povezivanje"</string>
+ <string name="upstream_roaming_notification_title" msgid="2870229486619751829">"Uključena je žarišna točka ili modemsko povezivanje"</string>
+ <string name="upstream_roaming_notification_message" msgid="5229740963392849544">"U roamingu su mogući dodatni troškovi"</string>
</resources>
diff --git a/Tethering/res/values-mcc310-mnc004-hu/strings.xml b/Tethering/res/values-mcc310-mnc004-hu/strings.xml
index 21c689a..6ab9565 100644
--- a/Tethering/res/values-mcc310-mnc004-hu/strings.xml
+++ b/Tethering/res/values-mcc310-mnc004-hu/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="5030042590486713460">"Nincs internetkapcsolat az internet megosztásához"</string>
- <string name="no_upstream_notification_message" msgid="3843613362272973447">"Az eszközök nem tudnak csatlakozni"</string>
- <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Internetmegosztás kikapcsolása"</string>
- <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"A hotspot vagy az internetmegosztás be van kapcsolva"</string>
- <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"Roaming során további díjak léphetnek fel"</string>
+ <string name="no_upstream_notification_title" msgid="3584617491053416666">"Nincs internetkapcsolat az internet megosztásához"</string>
+ <string name="no_upstream_notification_message" msgid="5626323795587558017">"Az eszközök nem tudnak csatlakozni"</string>
+ <string name="no_upstream_notification_disable_button" msgid="868677179945695858">"Internetmegosztás kikapcsolása"</string>
+ <string name="upstream_roaming_notification_title" msgid="2870229486619751829">"A hotspot vagy az internetmegosztás be van kapcsolva"</string>
+ <string name="upstream_roaming_notification_message" msgid="5229740963392849544">"Roaming során további díjak léphetnek fel"</string>
</resources>
diff --git a/Tethering/res/values-mcc310-mnc004-hy/strings.xml b/Tethering/res/values-mcc310-mnc004-hy/strings.xml
index 689d928..75b1c3e 100644
--- a/Tethering/res/values-mcc310-mnc004-hy/strings.xml
+++ b/Tethering/res/values-mcc310-mnc004-hy/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="5030042590486713460">"Մոդեմի ռեժիմի կապը բացակայում է"</string>
- <string name="no_upstream_notification_message" msgid="3843613362272973447">"Չհաջողվեց միացնել սարքը"</string>
- <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Անջատել մոդեմի ռեժիմը"</string>
- <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"Թեժ կետը կամ մոդեմի ռեժիմը միացված է"</string>
- <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"Ռոումինգում կարող են լրացուցիչ վճարներ գանձվել"</string>
+ <string name="no_upstream_notification_title" msgid="3584617491053416666">"Մոդեմի ռեժիմի ինտերնետ կապը բացակայում է"</string>
+ <string name="no_upstream_notification_message" msgid="5626323795587558017">"Չհաջողվեց միացնել սարքերը"</string>
+ <string name="no_upstream_notification_disable_button" msgid="868677179945695858">"Անջատել մոդեմի ռեժիմը"</string>
+ <string name="upstream_roaming_notification_title" msgid="2870229486619751829">"Թեժ կետը կամ մոդեմի ռեժիմը միացված է"</string>
+ <string name="upstream_roaming_notification_message" msgid="5229740963392849544">"Ռոումինգում կարող են լրացուցիչ վճարներ գանձվել"</string>
</resources>
diff --git a/Tethering/res/values-mcc310-mnc004-in/strings.xml b/Tethering/res/values-mcc310-mnc004-in/strings.xml
index a5f4d19..7289d63 100644
--- a/Tethering/res/values-mcc310-mnc004-in/strings.xml
+++ b/Tethering/res/values-mcc310-mnc004-in/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="5030042590486713460">"Tidak ada koneksi internet di tethering"</string>
- <string name="no_upstream_notification_message" msgid="3843613362272973447">"Perangkat tidak dapat terhubung"</string>
- <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Nonaktifkan tethering"</string>
- <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"Hotspot atau tethering aktif"</string>
- <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"Biaya tambahan mungkin berlaku saat roaming"</string>
+ <string name="no_upstream_notification_title" msgid="3584617491053416666">"Tidak ada koneksi internet di tethering"</string>
+ <string name="no_upstream_notification_message" msgid="5626323795587558017">"Perangkat tidak dapat terhubung"</string>
+ <string name="no_upstream_notification_disable_button" msgid="868677179945695858">"Nonaktifkan tethering"</string>
+ <string name="upstream_roaming_notification_title" msgid="2870229486619751829">"Hotspot atau tethering aktif"</string>
+ <string name="upstream_roaming_notification_message" msgid="5229740963392849544">"Biaya tambahan mungkin berlaku saat roaming"</string>
</resources>
diff --git a/Tethering/res/values-mcc310-mnc004-is/strings.xml b/Tethering/res/values-mcc310-mnc004-is/strings.xml
index fc7e8aa..e2f2f9d 100644
--- a/Tethering/res/values-mcc310-mnc004-is/strings.xml
+++ b/Tethering/res/values-mcc310-mnc004-is/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="5030042590486713460">"Tjóðrun er ekki með internettengingu"</string>
- <string name="no_upstream_notification_message" msgid="3843613362272973447">"Tæki geta ekki tengst"</string>
- <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Slökkva á tjóðrun"</string>
- <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"Kveikt er á heitum reit eða tjóðrun"</string>
- <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"Viðbótargjöld kunna að eiga við í reiki"</string>
+ <string name="no_upstream_notification_title" msgid="3584617491053416666">"Tjóðrun er ekki með internettengingu"</string>
+ <string name="no_upstream_notification_message" msgid="5626323795587558017">"Tæki geta ekki tengst"</string>
+ <string name="no_upstream_notification_disable_button" msgid="868677179945695858">"Slökkva á tjóðrun"</string>
+ <string name="upstream_roaming_notification_title" msgid="2870229486619751829">"Kveikt er á heitum reit eða tjóðrun"</string>
+ <string name="upstream_roaming_notification_message" msgid="5229740963392849544">"Viðbótargjöld kunna að eiga við í reiki"</string>
</resources>
diff --git a/Tethering/res/values-mcc310-mnc004-it/strings.xml b/Tethering/res/values-mcc310-mnc004-it/strings.xml
index 6456dd1..44805bd 100644
--- a/Tethering/res/values-mcc310-mnc004-it/strings.xml
+++ b/Tethering/res/values-mcc310-mnc004-it/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="5030042590486713460">"Nessuna connessione a Internet per il tethering"</string>
- <string name="no_upstream_notification_message" msgid="3843613362272973447">"Impossibile connettere i dispositivi"</string>
- <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Disattiva il tethering"</string>
- <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"Hotspot o tethering attivi"</string>
- <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"Potrebbero essere applicati costi aggiuntivi durante il roaming"</string>
+ <string name="no_upstream_notification_title" msgid="3584617491053416666">"Nessuna connessione a internet per il tethering"</string>
+ <string name="no_upstream_notification_message" msgid="5626323795587558017">"Impossibile connettere i dispositivi"</string>
+ <string name="no_upstream_notification_disable_button" msgid="868677179945695858">"Disattiva il tethering"</string>
+ <string name="upstream_roaming_notification_title" msgid="2870229486619751829">"Hotspot o tethering attivo"</string>
+ <string name="upstream_roaming_notification_message" msgid="5229740963392849544">"Potrebbero essere applicati costi aggiuntivi durante il roaming"</string>
</resources>
diff --git a/Tethering/res/values-mcc310-mnc004-iw/strings.xml b/Tethering/res/values-mcc310-mnc004-iw/strings.xml
index 46b24bd..0618169 100644
--- a/Tethering/res/values-mcc310-mnc004-iw/strings.xml
+++ b/Tethering/res/values-mcc310-mnc004-iw/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="5030042590486713460">"אי אפשר להפעיל את תכונת שיתוף האינטרנט בין מכשירים כי אין חיבור לאינטרנט"</string>
- <string name="no_upstream_notification_message" msgid="3843613362272973447">"למכשירים אין אפשרות להתחבר"</string>
- <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"השבתה של שיתוף האינטרנט בין מכשירים"</string>
- <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"תכונת הנקודה לשיתוף אינטרנט או תכונת שיתוף האינטרנט בין מכשירים פועלת"</string>
- <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"ייתכנו חיובים נוספים בעת נדידה"</string>
+ <string name="no_upstream_notification_title" msgid="3584617491053416666">"אי אפשר להפעיל את תכונת שיתוף האינטרנט בין מכשירים כי אין חיבור לאינטרנט"</string>
+ <string name="no_upstream_notification_message" msgid="5626323795587558017">"למכשירים אין אפשרות להתחבר"</string>
+ <string name="no_upstream_notification_disable_button" msgid="868677179945695858">"השבתה של שיתוף האינטרנט בין מכשירים"</string>
+ <string name="upstream_roaming_notification_title" msgid="2870229486619751829">"תכונת הנקודה לשיתוף אינטרנט או תכונת שיתוף האינטרנט בין מכשירים פועלת"</string>
+ <string name="upstream_roaming_notification_message" msgid="5229740963392849544">"ייתכנו חיובים נוספים במהלך נדידה"</string>
</resources>
diff --git a/Tethering/res/values-mcc310-mnc004-ja/strings.xml b/Tethering/res/values-mcc310-mnc004-ja/strings.xml
index e6eb277..344167d 100644
--- a/Tethering/res/values-mcc310-mnc004-ja/strings.xml
+++ b/Tethering/res/values-mcc310-mnc004-ja/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="5030042590486713460">"テザリングがインターネットに接続されていません"</string>
- <string name="no_upstream_notification_message" msgid="3843613362272973447">"デバイスを接続できません"</string>
- <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"テザリングを OFF にする"</string>
- <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"アクセス ポイントまたはテザリングが ON です"</string>
- <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"ローミング時に追加料金が発生することがあります"</string>
+ <string name="no_upstream_notification_title" msgid="3584617491053416666">"テザリングがインターネットに接続されていません"</string>
+ <string name="no_upstream_notification_message" msgid="5626323795587558017">"デバイスを接続できません"</string>
+ <string name="no_upstream_notification_disable_button" msgid="868677179945695858">"テザリングを OFF にする"</string>
+ <string name="upstream_roaming_notification_title" msgid="2870229486619751829">"アクセス ポイントまたはテザリングが ON です"</string>
+ <string name="upstream_roaming_notification_message" msgid="5229740963392849544">"ローミング時に追加料金が発生することがあります"</string>
</resources>
diff --git a/Tethering/res/values-mcc310-mnc004-ka/strings.xml b/Tethering/res/values-mcc310-mnc004-ka/strings.xml
index aeddd71..20db7fc 100644
--- a/Tethering/res/values-mcc310-mnc004-ka/strings.xml
+++ b/Tethering/res/values-mcc310-mnc004-ka/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="5030042590486713460">"ტეტერინგს არ აქვს ინტერნეტზე წვდომა"</string>
- <string name="no_upstream_notification_message" msgid="3843613362272973447">"მოწყობილობები ვერ ახერხებენ დაკავშირებას"</string>
- <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"ტეტერინგის გამორთვა"</string>
- <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"ჩართულია უსადენო ქსელი ან ტეტერინგი"</string>
- <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"როუმინგის გამოყენებისას შეიძლება ჩამოგეჭრათ დამატებითი საფასური"</string>
+ <string name="no_upstream_notification_title" msgid="3584617491053416666">"ტეტერინგს არ აქვს ინტერნეტზე წვდომა"</string>
+ <string name="no_upstream_notification_message" msgid="5626323795587558017">"მოწყობილობები ვერ ახერხებენ დაკავშირებას"</string>
+ <string name="no_upstream_notification_disable_button" msgid="868677179945695858">"ტეტერინგის გამორთვა"</string>
+ <string name="upstream_roaming_notification_title" msgid="2870229486619751829">"ჩართულია უსადენო ქსელი ან ტეტერინგი"</string>
+ <string name="upstream_roaming_notification_message" msgid="5229740963392849544">"როუმინგის გამოყენებისას შეიძლება ჩამოგეჭრათ დამატებითი საფასური"</string>
</resources>
diff --git a/Tethering/res/values-mcc310-mnc004-kk/strings.xml b/Tethering/res/values-mcc310-mnc004-kk/strings.xml
index 255f0a2..35f1738 100644
--- a/Tethering/res/values-mcc310-mnc004-kk/strings.xml
+++ b/Tethering/res/values-mcc310-mnc004-kk/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="5030042590486713460">"Тетеринг режимі интернет байланысынсыз пайдаланылуда"</string>
- <string name="no_upstream_notification_message" msgid="3843613362272973447">"Құрылғыларды байланыстыру мүмкін емес"</string>
- <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Тетерингіні өшіру"</string>
- <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"Хотспот немесе тетеринг қосулы"</string>
- <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"Роуминг кезінде қосымша ақы алынуы мүмкін."</string>
+ <string name="no_upstream_notification_title" msgid="3584617491053416666">"Тетеринг кезінде интернет байланысы жоқ"</string>
+ <string name="no_upstream_notification_message" msgid="5626323795587558017">"Құрылғыларды байланыстыру мүмкін емес"</string>
+ <string name="no_upstream_notification_disable_button" msgid="868677179945695858">"Тетерингіні өшіру"</string>
+ <string name="upstream_roaming_notification_title" msgid="2870229486619751829">"Хотспот немесе тетеринг қосулы"</string>
+ <string name="upstream_roaming_notification_message" msgid="5229740963392849544">"Роуминг кезінде қосымша ақы алынуы мүмкін."</string>
</resources>
diff --git a/Tethering/res/values-mcc310-mnc004-km/strings.xml b/Tethering/res/values-mcc310-mnc004-km/strings.xml
index 2bceb1c..2af80b1 100644
--- a/Tethering/res/values-mcc310-mnc004-km/strings.xml
+++ b/Tethering/res/values-mcc310-mnc004-km/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="5030042590486713460">"ការភ្ជាប់មិនមានអ៊ីនធឺណិតទេ"</string>
- <string name="no_upstream_notification_message" msgid="3843613362272973447">"មិនអាចភ្ជាប់ឧបករណ៍បានទេ"</string>
- <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"បិទការភ្ជាប់"</string>
- <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"ហតស្ប៉ត ឬការភ្ជាប់ត្រូវបានបើក"</string>
- <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"អាចមានការគិតថ្លៃបន្ថែម នៅពេលរ៉ូមីង"</string>
+ <string name="no_upstream_notification_title" msgid="3584617491053416666">"ការភ្ជាប់មិនមានអ៊ីនធឺណិតទេ"</string>
+ <string name="no_upstream_notification_message" msgid="5626323795587558017">"មិនអាចភ្ជាប់ឧបករណ៍បានទេ"</string>
+ <string name="no_upstream_notification_disable_button" msgid="868677179945695858">"បិទការភ្ជាប់"</string>
+ <string name="upstream_roaming_notification_title" msgid="2870229486619751829">"ហតស្ប៉ត ឬការភ្ជាប់ត្រូវបានបើក"</string>
+ <string name="upstream_roaming_notification_message" msgid="5229740963392849544">"អាចមានការគិតថ្លៃបន្ថែម នៅពេលរ៉ូមីង"</string>
</resources>
diff --git a/Tethering/res/values-mcc310-mnc004-kn/strings.xml b/Tethering/res/values-mcc310-mnc004-kn/strings.xml
index ed76930..16c55d0 100644
--- a/Tethering/res/values-mcc310-mnc004-kn/strings.xml
+++ b/Tethering/res/values-mcc310-mnc004-kn/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="5030042590486713460">"ಟೆಥರಿಂಗ್ ಯಾವುದೇ ಇಂಟರ್ನೆಟ್ ಕನೆಕ್ಷನ್ ಹೊಂದಿಲ್ಲ"</string>
- <string name="no_upstream_notification_message" msgid="3843613362272973447">"ಸಾಧನಗಳನ್ನು ಕನೆಕ್ಟ್ ಮಾಡಲು ಸಾಧ್ಯವಿಲ್ಲ"</string>
- <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"ಟೆಥರಿಂಗ್ ಆಫ್ ಮಾಡಿ"</string>
- <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"ಹಾಟ್ಸ್ಪಾಟ್ ಅಥವಾ ಟೆಥರಿಂಗ್ ಆನ್ ಆಗಿದೆ"</string>
- <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"ರೋಮಿಂಗ್ನಲ್ಲಿರುವಾಗ ಹೆಚ್ಚುವರಿ ಶುಲ್ಕಗಳು ಅನ್ವಯವಾಗಬಹುದು"</string>
+ <string name="no_upstream_notification_title" msgid="3584617491053416666">"ಟೆಥರಿಂಗ್ ಯಾವುದೇ ಇಂಟರ್ನೆಟ್ ಕನೆಕ್ಷನ್ ಹೊಂದಿಲ್ಲ"</string>
+ <string name="no_upstream_notification_message" msgid="5626323795587558017">"ಸಾಧನಗಳನ್ನು ಕನೆಕ್ಟ್ ಮಾಡಲು ಸಾಧ್ಯವಿಲ್ಲ"</string>
+ <string name="no_upstream_notification_disable_button" msgid="868677179945695858">"ಟೆಥರಿಂಗ್ ಆಫ್ ಮಾಡಿ"</string>
+ <string name="upstream_roaming_notification_title" msgid="2870229486619751829">"ಹಾಟ್ಸ್ಪಾಟ್ ಅಥವಾ ಟೆಥರಿಂಗ್ ಆನ್ ಆಗಿದೆ"</string>
+ <string name="upstream_roaming_notification_message" msgid="5229740963392849544">"ರೋಮಿಂಗ್ನಲ್ಲಿರುವಾಗ ಹೆಚ್ಚುವರಿ ಶುಲ್ಕಗಳು ಅನ್ವಯವಾಗಬಹುದು"</string>
</resources>
diff --git a/Tethering/res/values-mcc310-mnc004-ko/strings.xml b/Tethering/res/values-mcc310-mnc004-ko/strings.xml
index 6e50494..619504f 100644
--- a/Tethering/res/values-mcc310-mnc004-ko/strings.xml
+++ b/Tethering/res/values-mcc310-mnc004-ko/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="5030042590486713460">"테더링으로 인터넷을 사용할 수 없음"</string>
- <string name="no_upstream_notification_message" msgid="3843613362272973447">"기기에서 연결할 수 없음"</string>
- <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"테더링 사용 중지"</string>
- <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"핫스팟 또는 테더링 켜짐"</string>
- <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"로밍 중에는 추가 요금이 발생할 수 있습니다."</string>
+ <string name="no_upstream_notification_title" msgid="3584617491053416666">"테더링으로 인터넷을 사용할 수 없음"</string>
+ <string name="no_upstream_notification_message" msgid="5626323795587558017">"기기에서 연결할 수 없음"</string>
+ <string name="no_upstream_notification_disable_button" msgid="868677179945695858">"테더링 사용 중지"</string>
+ <string name="upstream_roaming_notification_title" msgid="2870229486619751829">"핫스팟 또는 테더링이 켜짐"</string>
+ <string name="upstream_roaming_notification_message" msgid="5229740963392849544">"로밍 중에는 추가 요금이 부과될 수 있습니다."</string>
</resources>
diff --git a/Tethering/res/values-mcc310-mnc004-ky/strings.xml b/Tethering/res/values-mcc310-mnc004-ky/strings.xml
index d68128b..f52dd90 100644
--- a/Tethering/res/values-mcc310-mnc004-ky/strings.xml
+++ b/Tethering/res/values-mcc310-mnc004-ky/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="5030042590486713460">"Модем режими Интернети жок колдонулууда"</string>
- <string name="no_upstream_notification_message" msgid="3843613362272973447">"Түзмөктөр туташпай жатат"</string>
- <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Модем режимин өчүрүү"</string>
- <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"Байланыш түйүнү же модем режими күйүк"</string>
- <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"Роумингде кошумча акы алынышы мүмкүн"</string>
+ <string name="no_upstream_notification_title" msgid="3584617491053416666">"Модем режими Интернети жок колдонулууда"</string>
+ <string name="no_upstream_notification_message" msgid="5626323795587558017">"Түзмөктөр туташпай жатат"</string>
+ <string name="no_upstream_notification_disable_button" msgid="868677179945695858">"Модем режимин өчүрүү"</string>
+ <string name="upstream_roaming_notification_title" msgid="2870229486619751829">"Байланыш түйүнү же модем режими күйүк"</string>
+ <string name="upstream_roaming_notification_message" msgid="5229740963392849544">"Роумингде кошумча акы алынышы мүмкүн"</string>
</resources>
diff --git a/Tethering/res/values-mcc310-mnc004-lo/strings.xml b/Tethering/res/values-mcc310-mnc004-lo/strings.xml
index 03e134a..d3184f7 100644
--- a/Tethering/res/values-mcc310-mnc004-lo/strings.xml
+++ b/Tethering/res/values-mcc310-mnc004-lo/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="5030042590486713460">"ການປ່ອຍສັນຍານບໍ່ມີອິນເຕີເນັດ"</string>
- <string name="no_upstream_notification_message" msgid="3843613362272973447">"ອຸປະກອນບໍ່ສາມາດເຊື່ອມຕໍ່ໄດ້"</string>
- <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"ປິດການປ່ອຍສັນຍານ"</string>
- <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"ເປີດໃຊ້ຮັອດສະປອດ ຫຼື ການປ່ອຍສັນຍານຢູ່"</string>
- <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"ອາດມີຄ່າໃຊ້ຈ່າຍເພີ່ມເຕີມໃນລະຫວ່າງການໂຣມມິງ"</string>
+ <string name="no_upstream_notification_title" msgid="3584617491053416666">"ການປ່ອຍສັນຍານບໍ່ມີອິນເຕີເນັດ"</string>
+ <string name="no_upstream_notification_message" msgid="5626323795587558017">"ອຸປະກອນບໍ່ສາມາດເຊື່ອມຕໍ່ໄດ້"</string>
+ <string name="no_upstream_notification_disable_button" msgid="868677179945695858">"ປິດການປ່ອຍສັນຍານ"</string>
+ <string name="upstream_roaming_notification_title" msgid="2870229486619751829">"ຮັອດສະປອດ ຫຼື ການປ່ອຍສັນຍານເປີດຢູ່"</string>
+ <string name="upstream_roaming_notification_message" msgid="5229740963392849544">"ອາດມີຄ່າບໍລິການເພີ່ມເຕີມໃນລະຫວ່າງການໂຣມມິງ"</string>
</resources>
diff --git a/Tethering/res/values-mcc310-mnc004-lt/strings.xml b/Tethering/res/values-mcc310-mnc004-lt/strings.xml
index 652cedc..a07644d 100644
--- a/Tethering/res/values-mcc310-mnc004-lt/strings.xml
+++ b/Tethering/res/values-mcc310-mnc004-lt/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="5030042590486713460">"Nėra įrenginio kaip modemo naudojimo interneto ryšio"</string>
- <string name="no_upstream_notification_message" msgid="3843613362272973447">"Nepavyko susieti įrenginių"</string>
- <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Išjungti įrenginio kaip modemo naudojimą"</string>
- <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"Įjungtas viešosios interneto prieigos taškas arba įrenginio kaip modemo naudojimas"</string>
- <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"Veikiant tarptinkliniam ryšiui gali būti taikomi papildomi mokesčiai"</string>
+ <string name="no_upstream_notification_title" msgid="3584617491053416666">"Nėra įrenginio kaip modemo naudojimo interneto ryšio"</string>
+ <string name="no_upstream_notification_message" msgid="5626323795587558017">"Nepavyko susieti įrenginių"</string>
+ <string name="no_upstream_notification_disable_button" msgid="868677179945695858">"Išjungti įrenginio kaip modemo naudojimą"</string>
+ <string name="upstream_roaming_notification_title" msgid="2870229486619751829">"Įjungtas viešosios interneto prieigos taškas arba įrenginio kaip modemo naudojimas"</string>
+ <string name="upstream_roaming_notification_message" msgid="5229740963392849544">"Veikiant tarptinkliniam ryšiui gali būti taikomi papildomi mokesčiai"</string>
</resources>
diff --git a/Tethering/res/values-mcc310-mnc004-lv/strings.xml b/Tethering/res/values-mcc310-mnc004-lv/strings.xml
index 2219722..5090ecf 100644
--- a/Tethering/res/values-mcc310-mnc004-lv/strings.xml
+++ b/Tethering/res/values-mcc310-mnc004-lv/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="5030042590486713460">"Piesaistei nav interneta savienojuma"</string>
- <string name="no_upstream_notification_message" msgid="3843613362272973447">"Nevar savienot ierīces"</string>
- <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Izslēgt piesaisti"</string>
- <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"Ir ieslēgts tīklājs vai piesaiste"</string>
- <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"Viesabonēšanas laikā var tikt piemērota papildu samaksa"</string>
+ <string name="no_upstream_notification_title" msgid="3584617491053416666">"Piesaistei nav interneta savienojuma"</string>
+ <string name="no_upstream_notification_message" msgid="5626323795587558017">"Nevar savienot ierīces"</string>
+ <string name="no_upstream_notification_disable_button" msgid="868677179945695858">"Izslēgt piesaisti"</string>
+ <string name="upstream_roaming_notification_title" msgid="2870229486619751829">"Ir ieslēgts tīklājs vai piesaiste"</string>
+ <string name="upstream_roaming_notification_message" msgid="5229740963392849544">"Viesabonēšanas laikā var tikt piemērota papildu maksa."</string>
</resources>
diff --git a/Tethering/res/values-mcc310-mnc004-mk/strings.xml b/Tethering/res/values-mcc310-mnc004-mk/strings.xml
index 227f9e3..c95c80e 100644
--- a/Tethering/res/values-mcc310-mnc004-mk/strings.xml
+++ b/Tethering/res/values-mcc310-mnc004-mk/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="5030042590486713460">"Нема интернет преку мобилен"</string>
- <string name="no_upstream_notification_message" msgid="3843613362272973447">"Уредите не може да се поврзат"</string>
- <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Исклучи интернет преку мобилен"</string>
- <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"Точката на пристап или интернетот преку мобилен е вклучен"</string>
- <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"При роаминг може да се наплатат дополнителни трошоци"</string>
+ <string name="no_upstream_notification_title" msgid="3584617491053416666">"Нема интернет преку мобилен"</string>
+ <string name="no_upstream_notification_message" msgid="5626323795587558017">"Уредите не може да се поврзат"</string>
+ <string name="no_upstream_notification_disable_button" msgid="868677179945695858">"Исклучи интернет преку мобилен"</string>
+ <string name="upstream_roaming_notification_title" msgid="2870229486619751829">"Вклучено: точка на пристап или интернет преку мобилен"</string>
+ <string name="upstream_roaming_notification_message" msgid="5229740963392849544">"При роаминг може да се наплатат дополнителни трошоци"</string>
</resources>
diff --git a/Tethering/res/values-mcc310-mnc004-ml/strings.xml b/Tethering/res/values-mcc310-mnc004-ml/strings.xml
index ec43885..7bad5c1 100644
--- a/Tethering/res/values-mcc310-mnc004-ml/strings.xml
+++ b/Tethering/res/values-mcc310-mnc004-ml/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="5030042590486713460">"ടെതറിംഗിന് ഇന്റർനെറ്റ് ഇല്ല"</string>
- <string name="no_upstream_notification_message" msgid="3843613362272973447">"ഉപകരണങ്ങൾ കണക്റ്റ് ചെയ്യാനാവില്ല"</string>
- <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"ടെതറിംഗ് ഓഫാക്കുക"</string>
- <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"ഹോട്ട്സ്പോട്ട് അല്ലെങ്കിൽ ടെതറിംഗ് ഓണാണ്"</string>
- <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"റോമിംഗ് ചെയ്യുമ്പോൾ അധിക നിരക്കുകൾ ബാധകമായേക്കാം"</string>
+ <string name="no_upstream_notification_title" msgid="3584617491053416666">"ടെതറിംഗിന് ഇന്റർനെറ്റ് ഇല്ല"</string>
+ <string name="no_upstream_notification_message" msgid="5626323795587558017">"ഉപകരണങ്ങൾ കണക്റ്റ് ചെയ്യാനാവില്ല"</string>
+ <string name="no_upstream_notification_disable_button" msgid="868677179945695858">"ടെതറിംഗ് ഓഫാക്കുക"</string>
+ <string name="upstream_roaming_notification_title" msgid="2870229486619751829">"ഹോട്ട്സ്പോട്ട് അല്ലെങ്കിൽ ടെതറിംഗ് ഓണാണ്"</string>
+ <string name="upstream_roaming_notification_message" msgid="5229740963392849544">"റോമിംഗ് ചെയ്യുമ്പോൾ അധിക നിരക്കുകൾ ബാധകമായേക്കാം"</string>
</resources>
diff --git a/Tethering/res/values-mcc310-mnc004-mn/strings.xml b/Tethering/res/values-mcc310-mnc004-mn/strings.xml
index e263573..ff76236 100644
--- a/Tethering/res/values-mcc310-mnc004-mn/strings.xml
+++ b/Tethering/res/values-mcc310-mnc004-mn/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="5030042590486713460">"Модемд интернэт алга байна"</string>
- <string name="no_upstream_notification_message" msgid="3843613362272973447">"Төхөөрөмжүүд холбогдох боломжгүй байна"</string>
- <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Модем болгохыг унтраах"</string>
- <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"Сүлжээний цэг эсвэл модем болгох асаалттай байна"</string>
- <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"Роумингийн үеэр нэмэлт төлбөр нэхэмжилж болзошгүй"</string>
+ <string name="no_upstream_notification_title" msgid="3584617491053416666">"Модем болгоход ямар ч интернэт байхгүй байна"</string>
+ <string name="no_upstream_notification_message" msgid="5626323795587558017">"Төхөөрөмжүүд холбогдох боломжгүй байна"</string>
+ <string name="no_upstream_notification_disable_button" msgid="868677179945695858">"Модем болгохыг унтраах"</string>
+ <string name="upstream_roaming_notification_title" msgid="2870229486619751829">"Сүлжээний цэг эсвэл модем болгох асаалттай байна"</string>
+ <string name="upstream_roaming_notification_message" msgid="5229740963392849544">"Роумингийн үеэр нэмэлт төлбөр тооцогдож магадгүй"</string>
</resources>
diff --git a/Tethering/res/values-mcc310-mnc004-mr/strings.xml b/Tethering/res/values-mcc310-mnc004-mr/strings.xml
index adf845d..1754dd4 100644
--- a/Tethering/res/values-mcc310-mnc004-mr/strings.xml
+++ b/Tethering/res/values-mcc310-mnc004-mr/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="5030042590486713460">"टेदरिंगला इंटरनेट नाही"</string>
- <string name="no_upstream_notification_message" msgid="3843613362272973447">"डिव्हाइस कनेक्ट होऊ शकत नाहीत"</string>
- <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"टेदरिंग बंद करा"</string>
- <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"हॉटस्पॉट किंवा टेदरिंग सुरू आहे"</string>
- <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"रोमिंगदरम्यान अतिरिक्त शुल्क लागू होऊ शकतात"</string>
+ <string name="no_upstream_notification_title" msgid="3584617491053416666">"टेदरिंगसाठी इंटरनेट नाही"</string>
+ <string name="no_upstream_notification_message" msgid="5626323795587558017">"डिव्हाइस कनेक्ट होऊ शकत नाहीत"</string>
+ <string name="no_upstream_notification_disable_button" msgid="868677179945695858">"टेदरिंग बंद करा"</string>
+ <string name="upstream_roaming_notification_title" msgid="2870229486619751829">"हॉटस्पॉट किंवा टेदरिंग सुरू आहे"</string>
+ <string name="upstream_roaming_notification_message" msgid="5229740963392849544">"रोमिंगदरम्यान अतिरिक्त शुल्के लागू होऊ शकतात"</string>
</resources>
diff --git a/Tethering/res/values-mcc310-mnc004-ms/strings.xml b/Tethering/res/values-mcc310-mnc004-ms/strings.xml
index f65c451..343e6fa 100644
--- a/Tethering/res/values-mcc310-mnc004-ms/strings.xml
+++ b/Tethering/res/values-mcc310-mnc004-ms/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="5030042590486713460">"Penambatan tiada Internet"</string>
- <string name="no_upstream_notification_message" msgid="3843613362272973447">"Peranti tidak dapat disambungkan"</string>
- <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Matikan penambatan"</string>
- <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"Tempat liputan atau penambatan dihidupkan"</string>
- <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"Caj tambahan mungkin digunakan semasa perayauan"</string>
+ <string name="no_upstream_notification_title" msgid="3584617491053416666">"Penambatan tiada Internet"</string>
+ <string name="no_upstream_notification_message" msgid="5626323795587558017">"Peranti tidak dapat disambungkan"</string>
+ <string name="no_upstream_notification_disable_button" msgid="868677179945695858">"Matikan penambatan"</string>
+ <string name="upstream_roaming_notification_title" msgid="2870229486619751829">"Tempat liputan atau penambatan dihidupkan"</string>
+ <string name="upstream_roaming_notification_message" msgid="5229740963392849544">"Caj tambahan boleh dikenakan semasa perayauan"</string>
</resources>
diff --git a/Tethering/res/values-mcc310-mnc004-my/strings.xml b/Tethering/res/values-mcc310-mnc004-my/strings.xml
index 4118e77..152f468 100644
--- a/Tethering/res/values-mcc310-mnc004-my/strings.xml
+++ b/Tethering/res/values-mcc310-mnc004-my/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="5030042590486713460">"မိုဘိုင်းဖုန်းသုံး ချိတ်ဆက်မျှဝေခြင်းတွင် အင်တာနက် မရှိပါ"</string>
- <string name="no_upstream_notification_message" msgid="3843613362272973447">"စက်များ ချိတ်ဆက်၍ မရပါ"</string>
- <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"မိုဘိုင်းဖုန်းသုံး ချိတ်ဆက်မျှဝေခြင်း ပိတ်ရန်"</string>
- <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"ဟော့စပေါ့ (သို့) မိုဘိုင်းဖုန်းသုံး ချိတ်ဆက်မျှဝေခြင်း ဖွင့်ထားသည်"</string>
- <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"ပြင်ပကွန်ရက်နှင့် ချိတ်ဆက်သည့်အခါ နောက်ထပ်ကျသင့်မှုများ ရှိနိုင်သည်"</string>
+ <string name="no_upstream_notification_title" msgid="3584617491053416666">"မိုဘိုင်းသုံး၍ ချိတ်ဆက်ခြင်းတွင် အင်တာနက် မရှိပါ"</string>
+ <string name="no_upstream_notification_message" msgid="5626323795587558017">"စက်ပစ္စည်းများကို ချိတ်ဆက်၍မရပါ"</string>
+ <string name="no_upstream_notification_disable_button" msgid="868677179945695858">"မိုဘိုင်းသုံး၍ ချိတ်ဆက်ခြင်း ပိတ်ရန်"</string>
+ <string name="upstream_roaming_notification_title" msgid="2870229486619751829">"ဟော့စပေါ့ (သို့) မိုဘိုင်းသုံး၍ ချိတ်ဆက်ခြင်း ဖွင့်ထားသည်"</string>
+ <string name="upstream_roaming_notification_message" msgid="5229740963392849544">"ပြင်ပကွန်ရက်သုံးနေစဉ် နောက်ထပ်ကျသင့်ငွေ ပေးရနိုင်သည်"</string>
</resources>
diff --git a/Tethering/res/values-mcc310-mnc004-nb/strings.xml b/Tethering/res/values-mcc310-mnc004-nb/strings.xml
index 3685358..31895d1 100644
--- a/Tethering/res/values-mcc310-mnc004-nb/strings.xml
+++ b/Tethering/res/values-mcc310-mnc004-nb/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="5030042590486713460">"Internettdeling har ikke internettilgang"</string>
- <string name="no_upstream_notification_message" msgid="3843613362272973447">"Enhetene kan ikke koble til"</string>
- <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Slå av internettdeling"</string>
- <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"Wi-Fi-sone eller internettdeling er på"</string>
- <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"Ytterligere kostnader kan påløpe under roaming"</string>
+ <string name="no_upstream_notification_title" msgid="3584617491053416666">"Internettdeling har ikke internettilgang"</string>
+ <string name="no_upstream_notification_message" msgid="5626323795587558017">"Enheter kan ikke koble til"</string>
+ <string name="no_upstream_notification_disable_button" msgid="868677179945695858">"Slå av internettdeling"</string>
+ <string name="upstream_roaming_notification_title" msgid="2870229486619751829">"Wifi-sone eller internettdeling er på"</string>
+ <string name="upstream_roaming_notification_message" msgid="5229740963392849544">"Det kan påløpe flere kostnader ved roaming"</string>
</resources>
diff --git a/Tethering/res/values-mcc310-mnc004-ne/strings.xml b/Tethering/res/values-mcc310-mnc004-ne/strings.xml
index d074f15..4b50773 100644
--- a/Tethering/res/values-mcc310-mnc004-ne/strings.xml
+++ b/Tethering/res/values-mcc310-mnc004-ne/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="5030042590486713460">"टेदरिङमार्फत इन्टरनेट कनेक्सन प्राप्त हुन सकेन"</string>
- <string name="no_upstream_notification_message" msgid="3843613362272973447">"यन्त्रहरू कनेक्ट गर्न सकिएन"</string>
- <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"टेदरिङ निष्क्रिय पार्नुहोस्"</string>
- <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"हटस्पट वा टेदरिङ सक्रिय छ"</string>
- <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"रोमिङ सेवा प्रयोग गर्दा अतिरिक्त शुल्क लाग्न सक्छ"</string>
+ <string name="no_upstream_notification_title" msgid="3584617491053416666">"टेदरिङमार्फत इन्टरनेट कनेक्ट गर्न सकिएन"</string>
+ <string name="no_upstream_notification_message" msgid="5626323795587558017">"डिभाइसहरू कनेक्ट गर्न सकिएन"</string>
+ <string name="no_upstream_notification_disable_button" msgid="868677179945695858">"टेदरिङ अफ गर्नुहोस्"</string>
+ <string name="upstream_roaming_notification_title" msgid="2870229486619751829">"हटस्पट वा टेदरिङ अन छ"</string>
+ <string name="upstream_roaming_notification_message" msgid="5229740963392849544">"रोमिङ सेवा प्रयोग गर्दा अतिरिक्त शुल्क लाग्न सक्छ"</string>
</resources>
diff --git a/Tethering/res/values-mcc310-mnc004-nl/strings.xml b/Tethering/res/values-mcc310-mnc004-nl/strings.xml
index 1d88894..8af41fd 100644
--- a/Tethering/res/values-mcc310-mnc004-nl/strings.xml
+++ b/Tethering/res/values-mcc310-mnc004-nl/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="5030042590486713460">"Tethering heeft geen internet"</string>
- <string name="no_upstream_notification_message" msgid="3843613362272973447">"Apparaten kunnen niet worden verbonden"</string>
- <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Tethering uitschakelen"</string>
- <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"Hotspot of tethering is ingeschakeld"</string>
- <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"Er kunnen extra kosten voor roaming in rekening worden gebracht."</string>
+ <string name="no_upstream_notification_title" msgid="3584617491053416666">"Tethering heeft geen internet"</string>
+ <string name="no_upstream_notification_message" msgid="5626323795587558017">"Apparaten kunnen geen verbinding maken"</string>
+ <string name="no_upstream_notification_disable_button" msgid="868677179945695858">"Tethering uitzetten"</string>
+ <string name="upstream_roaming_notification_title" msgid="2870229486619751829">"Hotspot of tethering staat aan"</string>
+ <string name="upstream_roaming_notification_message" msgid="5229740963392849544">"Er kunnen extra kosten voor roaming in rekening worden gebracht"</string>
</resources>
diff --git a/Tethering/res/values-mcc310-mnc004-or/strings.xml b/Tethering/res/values-mcc310-mnc004-or/strings.xml
index 8038815..6eb0773 100644
--- a/Tethering/res/values-mcc310-mnc004-or/strings.xml
+++ b/Tethering/res/values-mcc310-mnc004-or/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="5030042590486713460">"ଟିଥରିଂ ପାଇଁ କୌଣସି ଇଣ୍ଟର୍ନେଟ୍ ସଂଯୋଗ ନାହିଁ"</string>
- <string name="no_upstream_notification_message" msgid="3843613362272973447">"ଡିଭାଇସଗୁଡ଼ିକ ସଂଯୋଗ କରାଯାଇପାରିବ ନାହିଁ"</string>
- <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"ଟିଥରିଂ ବନ୍ଦ କରନ୍ତୁ"</string>
- <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"ହଟସ୍ପଟ୍ କିମ୍ବା ଟିଥରିଂ ଚାଲୁ ଅଛି"</string>
- <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"ରୋମିଂରେ ଥିବା ସମୟରେ ଅତିରିକ୍ତ ଶୁଳ୍କ ଲାଗୁ ହୋଇପାରେ"</string>
+ <string name="no_upstream_notification_title" msgid="3584617491053416666">"ଟିଥରିଂ ପାଇଁ କୌଣସି ଇଣ୍ଟରନେଟ କନେକ୍ସନ ନାହିଁ"</string>
+ <string name="no_upstream_notification_message" msgid="5626323795587558017">"ଡିଭାଇସଗୁଡ଼ିକୁ କନେକ୍ଟ କରାଯାଇପାରିବ ନାହିଁ"</string>
+ <string name="no_upstream_notification_disable_button" msgid="868677179945695858">"ଟିଥରିଂକୁ ବନ୍ଦ କରନ୍ତୁ"</string>
+ <string name="upstream_roaming_notification_title" msgid="2870229486619751829">"ହଟସ୍ପଟ କିମ୍ବା ଟିଥରିଂ ଚାଲୁ ଅଛି"</string>
+ <string name="upstream_roaming_notification_message" msgid="5229740963392849544">"ରୋମିଂ ସମୟରେ ଅତିରିକ୍ତ ଚାର୍ଜ ଲାଗୁ ହୋଇପାରେ"</string>
</resources>
diff --git a/Tethering/res/values-mcc310-mnc004-pa/strings.xml b/Tethering/res/values-mcc310-mnc004-pa/strings.xml
index 819833e..28181e2 100644
--- a/Tethering/res/values-mcc310-mnc004-pa/strings.xml
+++ b/Tethering/res/values-mcc310-mnc004-pa/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="5030042590486713460">"ਟੈਦਰਿੰਗ ਕੋਲ ਇੰਟਰਨੈੱਟ ਪਹੁੰਚ ਨਹੀਂ ਹੈ"</string>
- <string name="no_upstream_notification_message" msgid="3843613362272973447">"ਡੀਵਾਈਸ ਕਨੈਕਟ ਨਹੀਂ ਕੀਤੇ ਜਾ ਸਕਦੇ"</string>
- <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"ਟੈਦਰਿੰਗ ਬੰਦ ਕਰੋ"</string>
- <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"ਹੌਟਸਪੌਟ ਜਾਂ ਟੈਦਰਿੰਗ ਚਾਲੂ ਹੈ"</string>
- <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"ਰੋਮਿੰਗ ਦੌਰਾਨ ਵਧੀਕ ਖਰਚੇ ਲਾਗੂ ਹੋ ਸਕਦੇ ਹਨ"</string>
+ <string name="no_upstream_notification_title" msgid="3584617491053416666">"ਟੈਦਰਿੰਗ ਕੋਲ ਇੰਟਰਨੈੱਟ ਪਹੁੰਚ ਨਹੀਂ ਹੈ"</string>
+ <string name="no_upstream_notification_message" msgid="5626323795587558017">"ਡੀਵਾਈਸ ਕਨੈਕਟ ਨਹੀਂ ਕੀਤੇ ਜਾ ਸਕਦੇ"</string>
+ <string name="no_upstream_notification_disable_button" msgid="868677179945695858">"ਟੈਦਰਿੰਗ ਬੰਦ ਕਰੋ"</string>
+ <string name="upstream_roaming_notification_title" msgid="2870229486619751829">"ਹੌਟਸਪੌਟ ਜਾਂ ਟੈਦਰਿੰਗ ਚਾਲੂ ਹੈ"</string>
+ <string name="upstream_roaming_notification_message" msgid="5229740963392849544">"ਰੋਮਿੰਗ ਦੌਰਾਨ ਵਧੀਕ ਖਰਚੇ ਲਾਗੂ ਹੋ ਸਕਦੇ ਹਨ"</string>
</resources>
diff --git a/Tethering/res/values-mcc310-mnc004-pl/strings.xml b/Tethering/res/values-mcc310-mnc004-pl/strings.xml
index 65e4380..816302a 100644
--- a/Tethering/res/values-mcc310-mnc004-pl/strings.xml
+++ b/Tethering/res/values-mcc310-mnc004-pl/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="5030042590486713460">"Tethering nie ma internetu"</string>
- <string name="no_upstream_notification_message" msgid="3843613362272973447">"Urządzenia nie mogą się połączyć"</string>
- <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Wyłącz tethering"</string>
- <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"Hotspot lub tethering jest włączony"</string>
- <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"Podczas korzystania z roamingu mogą zostać naliczone dodatkowe opłaty"</string>
+ <string name="no_upstream_notification_title" msgid="3584617491053416666">"Tethering nie ma internetu"</string>
+ <string name="no_upstream_notification_message" msgid="5626323795587558017">"Urządzenia nie mogą się połączyć"</string>
+ <string name="no_upstream_notification_disable_button" msgid="868677179945695858">"Wyłącz tethering"</string>
+ <string name="upstream_roaming_notification_title" msgid="2870229486619751829">"Hotspot lub tethering jest włączony"</string>
+ <string name="upstream_roaming_notification_message" msgid="5229740963392849544">"Podczas korzystania z roamingu mogą zostać naliczone dodatkowe opłaty"</string>
</resources>
diff --git a/Tethering/res/values-mcc310-mnc004-pt-rBR/strings.xml b/Tethering/res/values-mcc310-mnc004-pt-rBR/strings.xml
index d886617..55767c2 100644
--- a/Tethering/res/values-mcc310-mnc004-pt-rBR/strings.xml
+++ b/Tethering/res/values-mcc310-mnc004-pt-rBR/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="5030042590486713460">"O tethering não tem Internet"</string>
- <string name="no_upstream_notification_message" msgid="3843613362272973447">"Não é possível conectar os dispositivos"</string>
- <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Desativar o tethering"</string>
- <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"Ponto de acesso ou tethering ativado"</string>
- <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"Pode haver cobranças extras durante o roaming"</string>
+ <string name="no_upstream_notification_title" msgid="3584617491053416666">"O tethering não tem uma conexão de Internet"</string>
+ <string name="no_upstream_notification_message" msgid="5626323795587558017">"Não é possível conectar os dispositivos"</string>
+ <string name="no_upstream_notification_disable_button" msgid="868677179945695858">"Desativar o tethering"</string>
+ <string name="upstream_roaming_notification_title" msgid="2870229486619751829">"O ponto de acesso ou tethering está ativado"</string>
+ <string name="upstream_roaming_notification_message" msgid="5229740963392849544">"Pode haver cobranças extras durante o roaming"</string>
</resources>
diff --git a/Tethering/res/values-mcc310-mnc004-pt-rPT/strings.xml b/Tethering/res/values-mcc310-mnc004-pt-rPT/strings.xml
index bfd45ca..eccabf8 100644
--- a/Tethering/res/values-mcc310-mnc004-pt-rPT/strings.xml
+++ b/Tethering/res/values-mcc310-mnc004-pt-rPT/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="5030042590486713460">"A ligação (à Internet) via telemóvel não tem Internet"</string>
- <string name="no_upstream_notification_message" msgid="3843613362272973447">"Não é possível ligar os dispositivos"</string>
- <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Desativar ligação (à Internet) via telemóvel"</string>
- <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"A zona Wi-Fi ou a ligação (à Internet) via telemóvel está ativada"</string>
- <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"Podem aplicar-se custos adicionais em roaming."</string>
+ <string name="no_upstream_notification_title" msgid="3584617491053416666">"A ligação (à Internet) via telemóvel não tem Internet"</string>
+ <string name="no_upstream_notification_message" msgid="5626323795587558017">"Não é possível ligar os dispositivos"</string>
+ <string name="no_upstream_notification_disable_button" msgid="868677179945695858">"Desativar ligação (à Internet) via telemóvel"</string>
+ <string name="upstream_roaming_notification_title" msgid="2870229486619751829">"A zona Wi-Fi ou a ligação (à Internet) via telemóvel está ativada"</string>
+ <string name="upstream_roaming_notification_message" msgid="5229740963392849544">"Podem aplicar-se custos adicionais em roaming"</string>
</resources>
diff --git a/Tethering/res/values-mcc310-mnc004-pt/strings.xml b/Tethering/res/values-mcc310-mnc004-pt/strings.xml
index d886617..55767c2 100644
--- a/Tethering/res/values-mcc310-mnc004-pt/strings.xml
+++ b/Tethering/res/values-mcc310-mnc004-pt/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="5030042590486713460">"O tethering não tem Internet"</string>
- <string name="no_upstream_notification_message" msgid="3843613362272973447">"Não é possível conectar os dispositivos"</string>
- <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Desativar o tethering"</string>
- <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"Ponto de acesso ou tethering ativado"</string>
- <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"Pode haver cobranças extras durante o roaming"</string>
+ <string name="no_upstream_notification_title" msgid="3584617491053416666">"O tethering não tem uma conexão de Internet"</string>
+ <string name="no_upstream_notification_message" msgid="5626323795587558017">"Não é possível conectar os dispositivos"</string>
+ <string name="no_upstream_notification_disable_button" msgid="868677179945695858">"Desativar o tethering"</string>
+ <string name="upstream_roaming_notification_title" msgid="2870229486619751829">"O ponto de acesso ou tethering está ativado"</string>
+ <string name="upstream_roaming_notification_message" msgid="5229740963392849544">"Pode haver cobranças extras durante o roaming"</string>
</resources>
diff --git a/Tethering/res/values-mcc310-mnc004-ro/strings.xml b/Tethering/res/values-mcc310-mnc004-ro/strings.xml
index 8d87a9e..3c3d7bc 100644
--- a/Tethering/res/values-mcc310-mnc004-ro/strings.xml
+++ b/Tethering/res/values-mcc310-mnc004-ro/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="5030042590486713460">"Procesul de tethering nu are internet"</string>
- <string name="no_upstream_notification_message" msgid="3843613362272973447">"Dispozitivele nu se pot conecta"</string>
- <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Dezactivați procesul de tethering"</string>
- <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"S-a activat hotspotul sau tethering"</string>
- <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"Se pot aplica taxe suplimentare pentru roaming"</string>
+ <string name="no_upstream_notification_title" msgid="3584617491053416666">"Procesul de tethering nu are internet"</string>
+ <string name="no_upstream_notification_message" msgid="5626323795587558017">"Dispozitivele nu se pot conecta"</string>
+ <string name="no_upstream_notification_disable_button" msgid="868677179945695858">"Dezactivează tetheringul"</string>
+ <string name="upstream_roaming_notification_title" msgid="2870229486619751829">"S-a activat hotspotul sau tetheringul"</string>
+ <string name="upstream_roaming_notification_message" msgid="5229740963392849544">"Se pot aplica taxe suplimentare pentru roaming"</string>
</resources>
diff --git a/Tethering/res/values-mcc310-mnc004-ru/strings.xml b/Tethering/res/values-mcc310-mnc004-ru/strings.xml
index dbdb9eb..7667180 100644
--- a/Tethering/res/values-mcc310-mnc004-ru/strings.xml
+++ b/Tethering/res/values-mcc310-mnc004-ru/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="5030042590486713460">"Режим модема используется без доступа к Интернету"</string>
- <string name="no_upstream_notification_message" msgid="3843613362272973447">"Невозможно подключить устройства."</string>
- <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Отключить режим модема"</string>
- <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"Включены точка доступа или режим модема"</string>
- <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"За использование услуг связи в роуминге может взиматься дополнительная плата."</string>
+ <string name="no_upstream_notification_title" msgid="3584617491053416666">"Режим модема используется без доступа к интернету"</string>
+ <string name="no_upstream_notification_message" msgid="5626323795587558017">"Невозможно подключить устройства."</string>
+ <string name="no_upstream_notification_disable_button" msgid="868677179945695858">"Отключить режим модема"</string>
+ <string name="upstream_roaming_notification_title" msgid="2870229486619751829">"Включена точка доступа или режим модема"</string>
+ <string name="upstream_roaming_notification_message" msgid="5229740963392849544">"За использование услуг связи в роуминге может взиматься дополнительная плата."</string>
</resources>
diff --git a/Tethering/res/values-mcc310-mnc004-si/strings.xml b/Tethering/res/values-mcc310-mnc004-si/strings.xml
index d8301e4..0c88a39 100644
--- a/Tethering/res/values-mcc310-mnc004-si/strings.xml
+++ b/Tethering/res/values-mcc310-mnc004-si/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="5030042590486713460">"ටෙදරින් හට අන්තර්ජාලය නැත"</string>
- <string name="no_upstream_notification_message" msgid="3843613362272973447">"උපාංගවලට සම්බන්ධ විය නොහැකිය"</string>
- <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"ටෙදරින් ක්රියාවිරහිත කරන්න"</string>
- <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"හොට්ස්පොට් හෝ ටෙදරින් ක්රියාත්මකයි"</string>
- <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"රෝමිං අතරතුර අමතර ගාස්තු අදාළ විය හැකිය"</string>
+ <string name="no_upstream_notification_title" msgid="3584617491053416666">"ටෙදරින් හට අන්තර්ජාලය නැත"</string>
+ <string name="no_upstream_notification_message" msgid="5626323795587558017">"උපාංගවලට සම්බන්ධ විය නොහැක"</string>
+ <string name="no_upstream_notification_disable_button" msgid="868677179945695858">"ටෙදරින් ක්රියාවිරහිත කරන්න"</string>
+ <string name="upstream_roaming_notification_title" msgid="2870229486619751829">"හොට්ස්පොට් හෝ ටෙදරින් ක්රියාත්මකයි"</string>
+ <string name="upstream_roaming_notification_message" msgid="5229740963392849544">"රෝමිං අතරේ අතිරේක ගාස්තු අදාළ විය හැක"</string>
</resources>
diff --git a/Tethering/res/values-mcc310-mnc004-sk/strings.xml b/Tethering/res/values-mcc310-mnc004-sk/strings.xml
index bef7136..c3b941e 100644
--- a/Tethering/res/values-mcc310-mnc004-sk/strings.xml
+++ b/Tethering/res/values-mcc310-mnc004-sk/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="5030042590486713460">"Tethering nemá internetové pripojenie"</string>
- <string name="no_upstream_notification_message" msgid="3843613362272973447">"Zariadenia sa nemôžu pripojiť"</string>
- <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Vypnúť tethering"</string>
- <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"Je zapnutý hotspot alebo tethering"</string>
- <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"Počas roamingu vám môžu byť účtované ďalšie poplatky"</string>
+ <string name="no_upstream_notification_title" msgid="3584617491053416666">"Tethering nemá internetové pripojenie"</string>
+ <string name="no_upstream_notification_message" msgid="5626323795587558017">"Zariadenia sa nemôžu pripojiť"</string>
+ <string name="no_upstream_notification_disable_button" msgid="868677179945695858">"Vypnúť tethering"</string>
+ <string name="upstream_roaming_notification_title" msgid="2870229486619751829">"Je zapnutý hotspot alebo tethering"</string>
+ <string name="upstream_roaming_notification_message" msgid="5229740963392849544">"Počas roamingu vám môžu byť účtované ďalšie poplatky"</string>
</resources>
diff --git a/Tethering/res/values-mcc310-mnc004-sl/strings.xml b/Tethering/res/values-mcc310-mnc004-sl/strings.xml
index 3202c62..6573475 100644
--- a/Tethering/res/values-mcc310-mnc004-sl/strings.xml
+++ b/Tethering/res/values-mcc310-mnc004-sl/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="5030042590486713460">"Internetna povezava prek mobilnega telefona ni vzpostavljena"</string>
- <string name="no_upstream_notification_message" msgid="3843613362272973447">"Napravi se ne moreta povezati"</string>
- <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Izklopi internetno povezavo prek mobilnega telefona"</string>
- <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"Dostopna točka ali internetna povezava prek mobilnega telefona je vklopljena"</string>
- <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"Med gostovanjem lahko nastanejo dodatni stroški"</string>
+ <string name="no_upstream_notification_title" msgid="3584617491053416666">"Povezava računalnika z internetom prek mobilnega telefona nima internetne povezave"</string>
+ <string name="no_upstream_notification_message" msgid="5626323795587558017">"Napravi se ne moreta povezati"</string>
+ <string name="no_upstream_notification_disable_button" msgid="868677179945695858">"Izklopi povezavo računalnika z internetom prek mobilnega telefona"</string>
+ <string name="upstream_roaming_notification_title" msgid="2870229486619751829">"Dostopna točka ali povezava računalnika z internetom prek mobilnega telefona je vklopljena"</string>
+ <string name="upstream_roaming_notification_message" msgid="5229740963392849544">"Med gostovanjem lahko nastanejo dodatni stroški."</string>
</resources>
diff --git a/Tethering/res/values-mcc310-mnc004-sq/strings.xml b/Tethering/res/values-mcc310-mnc004-sq/strings.xml
index 37f6ad2..93ea231 100644
--- a/Tethering/res/values-mcc310-mnc004-sq/strings.xml
+++ b/Tethering/res/values-mcc310-mnc004-sq/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="5030042590486713460">"Ndarja e internetit nuk ka internet"</string>
- <string name="no_upstream_notification_message" msgid="3843613362272973447">"Pajisjet nuk mund të lidhen"</string>
- <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Çaktivizo ndarjen e internetit"</string>
- <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"Zona e qasjes për internet ose ndarja e internetit është aktive"</string>
- <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"Mund të zbatohen tarifime shtesë kur je në roaming"</string>
+ <string name="no_upstream_notification_title" msgid="3584617491053416666">"Ndarja e internetit nuk ka internet"</string>
+ <string name="no_upstream_notification_message" msgid="5626323795587558017">"Pajisjet nuk mund të lidhen"</string>
+ <string name="no_upstream_notification_disable_button" msgid="868677179945695858">"Çaktivizo ndarjen e internetit"</string>
+ <string name="upstream_roaming_notification_title" msgid="2870229486619751829">"Zona e qasjes për internet ose ndarja e internetit është aktive"</string>
+ <string name="upstream_roaming_notification_message" msgid="5229740963392849544">"Mund të zbatohen tarifime shtesë kur je në roaming"</string>
</resources>
diff --git a/Tethering/res/values-mcc310-mnc004-sr/strings.xml b/Tethering/res/values-mcc310-mnc004-sr/strings.xml
index 5566d03..e8fb478 100644
--- a/Tethering/res/values-mcc310-mnc004-sr/strings.xml
+++ b/Tethering/res/values-mcc310-mnc004-sr/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="5030042590486713460">"Привезивање нема приступ интернету"</string>
- <string name="no_upstream_notification_message" msgid="3843613362272973447">"Повезивање уређаја није успело"</string>
- <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Искључи привезивање"</string>
- <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"Укључен је хотспот или привезивање"</string>
- <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"Можда важе додатни трошкови у ромингу"</string>
+ <string name="no_upstream_notification_title" msgid="3584617491053416666">"Привезивање нема приступ интернету"</string>
+ <string name="no_upstream_notification_message" msgid="5626323795587558017">"Повезивање уређаја није успело"</string>
+ <string name="no_upstream_notification_disable_button" msgid="868677179945695858">"Искључи привезивање"</string>
+ <string name="upstream_roaming_notification_title" msgid="2870229486619751829">"Укључен је хотспот или привезивање"</string>
+ <string name="upstream_roaming_notification_message" msgid="5229740963392849544">"Можда важе додатни трошкови у ромингу"</string>
</resources>
diff --git a/Tethering/res/values-mcc310-mnc004-sv/strings.xml b/Tethering/res/values-mcc310-mnc004-sv/strings.xml
index 9765acd..6fc1747 100644
--- a/Tethering/res/values-mcc310-mnc004-sv/strings.xml
+++ b/Tethering/res/values-mcc310-mnc004-sv/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="5030042590486713460">"Det finns ingen internetanslutning för internetdelningen"</string>
- <string name="no_upstream_notification_message" msgid="3843613362272973447">"Enheterna kan inte anslutas"</string>
- <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Inaktivera internetdelning"</string>
- <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"Surfzon eller internetdelning har aktiverats"</string>
- <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"Ytterligare avgifter kan tillkomma vid roaming"</string>
+ <string name="no_upstream_notification_title" msgid="3584617491053416666">"Det finns ingen internetanslutning för internetdelningen"</string>
+ <string name="no_upstream_notification_message" msgid="5626323795587558017">"Enheterna kan inte anslutas"</string>
+ <string name="no_upstream_notification_disable_button" msgid="868677179945695858">"Inaktivera internetdelning"</string>
+ <string name="upstream_roaming_notification_title" msgid="2870229486619751829">"Surfzon eller internetdelning har aktiverats"</string>
+ <string name="upstream_roaming_notification_message" msgid="5229740963392849544">"Ytterligare avgifter kan tillkomma vid roaming"</string>
</resources>
diff --git a/Tethering/res/values-mcc310-mnc004-sw/strings.xml b/Tethering/res/values-mcc310-mnc004-sw/strings.xml
index cf850c9..73a7026 100644
--- a/Tethering/res/values-mcc310-mnc004-sw/strings.xml
+++ b/Tethering/res/values-mcc310-mnc004-sw/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="5030042590486713460">"Kipengele cha kusambaza mtandao hakina intaneti"</string>
- <string name="no_upstream_notification_message" msgid="3843613362272973447">"Imeshindwa kuunganisha vifaa"</string>
- <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Zima kipengele cha kusambaza mtandao"</string>
- <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"Umewasha kipengele cha kusambaza mtandao au mtandao pepe"</string>
- <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"Huenda ukatozwa gharama za ziada ukitumia mitandao ya ng\'ambo"</string>
+ <string name="no_upstream_notification_title" msgid="3584617491053416666">"Huduma ya kusambaza mtandao haina muunganisho wa intaneti"</string>
+ <string name="no_upstream_notification_message" msgid="5626323795587558017">"Imeshindwa kuunganisha vifaa"</string>
+ <string name="no_upstream_notification_disable_button" msgid="868677179945695858">"Zima kipengele cha kusambaza mtandao"</string>
+ <string name="upstream_roaming_notification_title" msgid="2870229486619751829">"Umewasha kipengele cha kusambaza mtandao au mtandao pepe"</string>
+ <string name="upstream_roaming_notification_message" msgid="5229740963392849544">"Huenda ukatozwa gharama za ziada ukitumia mitandao ya ng\'ambo"</string>
</resources>
diff --git a/Tethering/res/values-mcc310-mnc004-ta/strings.xml b/Tethering/res/values-mcc310-mnc004-ta/strings.xml
index f4b15aa..436f00b 100644
--- a/Tethering/res/values-mcc310-mnc004-ta/strings.xml
+++ b/Tethering/res/values-mcc310-mnc004-ta/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="5030042590486713460">"இணைப்பு முறைக்கு இணைய இணைப்பு இல்லை"</string>
- <string name="no_upstream_notification_message" msgid="3843613362272973447">"சாதனங்களால் இணைய முடியவில்லை"</string>
- <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"இணைப்பு முறையை ஆஃப் செய்"</string>
- <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"ஹாட்ஸ்பாட் அல்லது இணைப்பு முறை ஆன் செய்யப்பட்டுள்ளது"</string>
- <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"ரோமிங்கின்போது கூடுதல் கட்டணங்கள் விதிக்கப்படக்கூடும்"</string>
+ <string name="no_upstream_notification_title" msgid="3584617491053416666">"இணைப்பு முறைக்கு இணைய இணைப்பு இல்லை"</string>
+ <string name="no_upstream_notification_message" msgid="5626323795587558017">"சாதனங்களால் இணைய முடியவில்லை"</string>
+ <string name="no_upstream_notification_disable_button" msgid="868677179945695858">"இணைப்பு முறையை முடக்கு"</string>
+ <string name="upstream_roaming_notification_title" msgid="2870229486619751829">"ஹாட்ஸ்பாட் அல்லது இணைப்பு முறை இயக்கப்பட்டுள்ளது"</string>
+ <string name="upstream_roaming_notification_message" msgid="5229740963392849544">"ரோமிங்கின்போது கூடுதல் கட்டணங்கள் விதிக்கப்படலாம்"</string>
</resources>
diff --git a/Tethering/res/values-mcc310-mnc004-te/strings.xml b/Tethering/res/values-mcc310-mnc004-te/strings.xml
index 937d34d..ba83627 100644
--- a/Tethering/res/values-mcc310-mnc004-te/strings.xml
+++ b/Tethering/res/values-mcc310-mnc004-te/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="5030042590486713460">"టెథరింగ్ చేయడానికి ఇంటర్నెట్ కనెక్షన్ లేదు"</string>
- <string name="no_upstream_notification_message" msgid="3843613362272973447">"పరికరాలు కనెక్ట్ అవ్వడం లేదు"</string>
- <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"టెథరింగ్ను ఆఫ్ చేయండి"</string>
- <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"హాట్స్పాట్ లేదా టెథరింగ్ ఆన్లో ఉంది"</string>
- <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"రోమింగ్లో ఉన్నప్పుడు అదనపు ఛార్జీలు వర్తించవచ్చు"</string>
+ <string name="no_upstream_notification_title" msgid="3584617491053416666">"టెథరింగ్ చేయడానికి ఇంటర్నెట్ కనెక్షన్ లేదు"</string>
+ <string name="no_upstream_notification_message" msgid="5626323795587558017">"పరికరాలు కనెక్ట్ అవ్వడం లేదు"</string>
+ <string name="no_upstream_notification_disable_button" msgid="868677179945695858">"టెథరింగ్ను ఆఫ్ చేయండి"</string>
+ <string name="upstream_roaming_notification_title" msgid="2870229486619751829">"హాట్స్పాట్ లేదా టెథరింగ్ ఆన్లో ఉంది"</string>
+ <string name="upstream_roaming_notification_message" msgid="5229740963392849544">"రోమింగ్లో ఉన్నప్పుడు అదనపు ఛార్జీలు వర్తించవచ్చు"</string>
</resources>
diff --git a/Tethering/res/values-mcc310-mnc004-th/strings.xml b/Tethering/res/values-mcc310-mnc004-th/strings.xml
index f781fae..e2ea084 100644
--- a/Tethering/res/values-mcc310-mnc004-th/strings.xml
+++ b/Tethering/res/values-mcc310-mnc004-th/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="5030042590486713460">"การเชื่อมต่ออินเทอร์เน็ตผ่านมือถือไม่มีอินเทอร์เน็ต"</string>
- <string name="no_upstream_notification_message" msgid="3843613362272973447">"อุปกรณ์เชื่อมต่อไม่ได้"</string>
- <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"ปิดการเชื่อมต่ออินเทอร์เน็ตผ่านมือถือ"</string>
- <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"ฮอตสปอตหรือการเชื่อมต่ออินเทอร์เน็ตผ่านมือถือเปิดอยู่"</string>
- <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"อาจมีค่าใช้จ่ายเพิ่มเติมขณะโรมมิ่ง"</string>
+ <string name="no_upstream_notification_title" msgid="3584617491053416666">"ไม่มีอินเทอร์เน็ตสำหรับการเชื่อมต่ออินเทอร์เน็ตผ่านมือถือ"</string>
+ <string name="no_upstream_notification_message" msgid="5626323795587558017">"อุปกรณ์เชื่อมต่อไม่ได้"</string>
+ <string name="no_upstream_notification_disable_button" msgid="868677179945695858">"ปิดการเชื่อมต่ออินเทอร์เน็ตผ่านมือถือ"</string>
+ <string name="upstream_roaming_notification_title" msgid="2870229486619751829">"ฮอตสปอตหรือการเชื่อมต่ออินเทอร์เน็ตผ่านมือถือเปิดอยู่"</string>
+ <string name="upstream_roaming_notification_message" msgid="5229740963392849544">"อาจมีค่าใช้จ่ายเพิ่มเติมขณะโรมมิ่ง"</string>
</resources>
diff --git a/Tethering/res/values-mcc310-mnc004-tl/strings.xml b/Tethering/res/values-mcc310-mnc004-tl/strings.xml
index 8d5d465..7b4b71c 100644
--- a/Tethering/res/values-mcc310-mnc004-tl/strings.xml
+++ b/Tethering/res/values-mcc310-mnc004-tl/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="5030042590486713460">"Walang internet ang pag-tether"</string>
- <string name="no_upstream_notification_message" msgid="3843613362272973447">"Hindi makakonekta ang mga device"</string>
- <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"I-off ang pag-tether"</string>
- <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"Naka-on ang Hotspot o pag-tether"</string>
- <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"Posibleng magkaroon ng mga karagdagang singil habang nagro-roam"</string>
+ <string name="no_upstream_notification_title" msgid="3584617491053416666">"Walang internet ang pag-tether"</string>
+ <string name="no_upstream_notification_message" msgid="5626323795587558017">"Hindi makakonekta ang mga device"</string>
+ <string name="no_upstream_notification_disable_button" msgid="868677179945695858">"I-off ang pag-tether"</string>
+ <string name="upstream_roaming_notification_title" msgid="2870229486619751829">"Naka-on ang hotspot o pag-tether"</string>
+ <string name="upstream_roaming_notification_message" msgid="5229740963392849544">"Posibleng magkaroon ng mga karagdagang singil habang nagro-roam"</string>
</resources>
diff --git a/Tethering/res/values-mcc310-mnc004-tr/strings.xml b/Tethering/res/values-mcc310-mnc004-tr/strings.xml
index 80cab33..066e1d7 100644
--- a/Tethering/res/values-mcc310-mnc004-tr/strings.xml
+++ b/Tethering/res/values-mcc310-mnc004-tr/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="5030042590486713460">"Tethering\'in internet bağlantısı yok"</string>
- <string name="no_upstream_notification_message" msgid="3843613362272973447">"Cihazlar bağlanamıyor"</string>
- <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Tethering\'i kapat"</string>
- <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"Hotspot veya tethering açık"</string>
- <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"Dolaşım sırasında ek ücretler uygulanabilir"</string>
+ <string name="no_upstream_notification_title" msgid="3584617491053416666">"Tethering\'in internet bağlantısı yok"</string>
+ <string name="no_upstream_notification_message" msgid="5626323795587558017">"Cihazlar bağlanamıyor"</string>
+ <string name="no_upstream_notification_disable_button" msgid="868677179945695858">"Tethering\'i kapat"</string>
+ <string name="upstream_roaming_notification_title" msgid="2870229486619751829">"Hotspot veya tethering açık"</string>
+ <string name="upstream_roaming_notification_message" msgid="5229740963392849544">"Dolaşım sırasında ek ücretler uygulanabilir"</string>
</resources>
diff --git a/Tethering/res/values-mcc310-mnc004-uk/strings.xml b/Tethering/res/values-mcc310-mnc004-uk/strings.xml
index c05932a..036746a 100644
--- a/Tethering/res/values-mcc310-mnc004-uk/strings.xml
+++ b/Tethering/res/values-mcc310-mnc004-uk/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="5030042590486713460">"Телефон, який використовується як модем, не підключений до Інтернету"</string>
- <string name="no_upstream_notification_message" msgid="3843613362272973447">"Не вдається підключити пристрої"</string>
- <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Вимкнути використання телефона як модема"</string>
- <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"Увімкнено точку доступу або використання телефона як модема"</string>
- <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"У роумінгу може стягуватися додаткова плата"</string>
+ <string name="no_upstream_notification_title" msgid="3584617491053416666">"Телефон, що використовується як модем, не підключений до Інтернету"</string>
+ <string name="no_upstream_notification_message" msgid="5626323795587558017">"Не вдається підключити пристрої"</string>
+ <string name="no_upstream_notification_disable_button" msgid="868677179945695858">"Вимкнути використання телефона як модема"</string>
+ <string name="upstream_roaming_notification_title" msgid="2870229486619751829">"Увімкнено точку доступу або використання телефона як модема"</string>
+ <string name="upstream_roaming_notification_message" msgid="5229740963392849544">"У роумінгу може стягуватися додаткова плата"</string>
</resources>
diff --git a/Tethering/res/values-mcc310-mnc004-ur/strings.xml b/Tethering/res/values-mcc310-mnc004-ur/strings.xml
index d820eee..90eadef 100644
--- a/Tethering/res/values-mcc310-mnc004-ur/strings.xml
+++ b/Tethering/res/values-mcc310-mnc004-ur/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="5030042590486713460">"ٹیدرنگ میں انٹرنیٹ نہیں ہے"</string>
- <string name="no_upstream_notification_message" msgid="3843613362272973447">"آلات منسلک نہیں ہو سکتے"</string>
- <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"ٹیدرنگ آف کریں"</string>
- <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"ہاٹ اسپاٹ یا ٹیدرنگ آن ہے"</string>
- <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"رومنگ کے دوران اضافی چارجز لاگو ہو سکتے ہیں"</string>
+ <string name="no_upstream_notification_title" msgid="3584617491053416666">"ٹیدرنگ میں انٹرنیٹ نہیں ہے"</string>
+ <string name="no_upstream_notification_message" msgid="5626323795587558017">"آلات منسلک نہیں ہو سکتے"</string>
+ <string name="no_upstream_notification_disable_button" msgid="868677179945695858">"ٹیدرنگ آف کریں"</string>
+ <string name="upstream_roaming_notification_title" msgid="2870229486619751829">"ہاٹ اسپاٹ یا ٹیدرنگ آن ہے"</string>
+ <string name="upstream_roaming_notification_message" msgid="5229740963392849544">"رومنگ کے دوران اضافی چارجز لاگو ہو سکتے ہیں"</string>
</resources>
diff --git a/Tethering/res/values-mcc310-mnc004-uz/strings.xml b/Tethering/res/values-mcc310-mnc004-uz/strings.xml
index 726148a..f647572 100644
--- a/Tethering/res/values-mcc310-mnc004-uz/strings.xml
+++ b/Tethering/res/values-mcc310-mnc004-uz/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="5030042590486713460">"Modem internetga ulanmagan"</string>
- <string name="no_upstream_notification_message" msgid="3843613362272973447">"Qurilmalar ulanmadi"</string>
- <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Modem rejimini faolsizlantirish"</string>
- <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"Hotspot yoki modem rejimi yoniq"</string>
- <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"Rouming vaqtida qoʻshimcha haq olinishi mumkin"</string>
+ <string name="no_upstream_notification_title" msgid="3584617491053416666">"Modem internetga ulanmagan"</string>
+ <string name="no_upstream_notification_message" msgid="5626323795587558017">"Qurilmalar ulanmadi"</string>
+ <string name="no_upstream_notification_disable_button" msgid="868677179945695858">"Modem rejimini faolsizlantirish"</string>
+ <string name="upstream_roaming_notification_title" msgid="2870229486619751829">"Hotspot yoki modem rejimi yoniq"</string>
+ <string name="upstream_roaming_notification_message" msgid="5229740963392849544">"Rouming vaqtida qoʻshimcha haq olinishi mumkin"</string>
</resources>
diff --git a/Tethering/res/values-mcc310-mnc004-vi/strings.xml b/Tethering/res/values-mcc310-mnc004-vi/strings.xml
index b7cb045..71db045 100644
--- a/Tethering/res/values-mcc310-mnc004-vi/strings.xml
+++ b/Tethering/res/values-mcc310-mnc004-vi/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="5030042590486713460">"Không có Internet để chia sẻ kết Internet"</string>
- <string name="no_upstream_notification_message" msgid="3843613362272973447">"Các thiết bị không thể kết nối"</string>
- <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Tắt tính năng chia sẻ Internet"</string>
- <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"Điểm phát sóng hoặc tính năng chia sẻ Internet đang bật"</string>
- <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"Bạn có thể mất thêm phí dữ liệu khi chuyển vùng"</string>
+ <string name="no_upstream_notification_title" msgid="3584617491053416666">"Không có Internet để chia sẻ Internet"</string>
+ <string name="no_upstream_notification_message" msgid="5626323795587558017">"Các thiết bị không thể kết nối"</string>
+ <string name="no_upstream_notification_disable_button" msgid="868677179945695858">"Tắt tính năng chia sẻ Internet"</string>
+ <string name="upstream_roaming_notification_title" msgid="2870229486619751829">"Điểm phát sóng hoặc tính năng chia sẻ Internet đang bật"</string>
+ <string name="upstream_roaming_notification_message" msgid="5229740963392849544">"Bạn có thể mất thêm phí dữ liệu khi chuyển vùng"</string>
</resources>
diff --git a/Tethering/res/values-mcc310-mnc004-zh-rCN/strings.xml b/Tethering/res/values-mcc310-mnc004-zh-rCN/strings.xml
index af91aff..d279fdd 100644
--- a/Tethering/res/values-mcc310-mnc004-zh-rCN/strings.xml
+++ b/Tethering/res/values-mcc310-mnc004-zh-rCN/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="5030042590486713460">"共享网络未连接到互联网"</string>
- <string name="no_upstream_notification_message" msgid="3843613362272973447">"设备无法连接"</string>
- <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"关闭网络共享"</string>
- <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"热点或网络共享已开启"</string>
- <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"漫游时可能会产生额外的费用"</string>
+ <string name="no_upstream_notification_title" msgid="3584617491053416666">"共享网络未连接到互联网"</string>
+ <string name="no_upstream_notification_message" msgid="5626323795587558017">"设备无法连接"</string>
+ <string name="no_upstream_notification_disable_button" msgid="868677179945695858">"关闭网络共享"</string>
+ <string name="upstream_roaming_notification_title" msgid="2870229486619751829">"热点或网络共享已开启"</string>
+ <string name="upstream_roaming_notification_message" msgid="5229740963392849544">"漫游时可能会产生额外的费用"</string>
</resources>
diff --git a/Tethering/res/values-mcc310-mnc004-zh-rHK/strings.xml b/Tethering/res/values-mcc310-mnc004-zh-rHK/strings.xml
index 28e6b80..5bad7e4 100644
--- a/Tethering/res/values-mcc310-mnc004-zh-rHK/strings.xml
+++ b/Tethering/res/values-mcc310-mnc004-zh-rHK/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="5030042590486713460">"無法透過網絡共享連線至互聯網"</string>
- <string name="no_upstream_notification_message" msgid="3843613362272973447">"裝置無法連接"</string>
- <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"關閉網絡共享"</string>
- <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"熱點或網絡共享已開啟"</string>
- <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"漫遊時可能需要支付額外費用"</string>
+ <string name="no_upstream_notification_title" msgid="3584617491053416666">"無法透過網絡共享連線至互聯網"</string>
+ <string name="no_upstream_notification_message" msgid="5626323795587558017">"裝置無法連接"</string>
+ <string name="no_upstream_notification_disable_button" msgid="868677179945695858">"關閉網絡共享"</string>
+ <string name="upstream_roaming_notification_title" msgid="2870229486619751829">"熱點或網絡共享已開啟"</string>
+ <string name="upstream_roaming_notification_message" msgid="5229740963392849544">"漫遊時可能需要支付額外費用"</string>
</resources>
diff --git a/Tethering/res/values-mcc310-mnc004-zh-rTW/strings.xml b/Tethering/res/values-mcc310-mnc004-zh-rTW/strings.xml
index 528a1e5..8991ff4 100644
--- a/Tethering/res/values-mcc310-mnc004-zh-rTW/strings.xml
+++ b/Tethering/res/values-mcc310-mnc004-zh-rTW/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="5030042590486713460">"無法透過網路共用連上網際網路"</string>
- <string name="no_upstream_notification_message" msgid="3843613362272973447">"裝置無法連線"</string>
- <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"關閉網路共用"</string>
- <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"無線基地台或網路共用已開啟"</string>
- <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"使用漫遊服務可能須支付額外費用"</string>
+ <string name="no_upstream_notification_title" msgid="3584617491053416666">"無法透過網路共用連上網際網路"</string>
+ <string name="no_upstream_notification_message" msgid="5626323795587558017">"裝置無法連線"</string>
+ <string name="no_upstream_notification_disable_button" msgid="868677179945695858">"關閉網路共用"</string>
+ <string name="upstream_roaming_notification_title" msgid="2870229486619751829">"無線基地台或網路共用已開啟"</string>
+ <string name="upstream_roaming_notification_message" msgid="5229740963392849544">"使用漫遊服務可能須支付額外費用"</string>
</resources>
diff --git a/Tethering/res/values-mcc310-mnc004-zu/strings.xml b/Tethering/res/values-mcc310-mnc004-zu/strings.xml
index 11eb666..31db66a 100644
--- a/Tethering/res/values-mcc310-mnc004-zu/strings.xml
+++ b/Tethering/res/values-mcc310-mnc004-zu/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="5030042590486713460">"Ukusebenzisa ifoni njengemodemu akunayo i-inthanethi"</string>
- <string name="no_upstream_notification_message" msgid="3843613362272973447">"Amadivayisi awakwazi ukuxhumeka"</string>
- <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Vala ukusebenzisa ifoni njengemodemu"</string>
- <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"I-hotspot noma ukusebenzisa ifoni njengemodemu kuvuliwe"</string>
- <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"Kungaba nezinkokhelo ezengeziwe uma uzula"</string>
+ <string name="no_upstream_notification_title" msgid="3584617491053416666">"Ukusebenzisa ifoni njengemodemu akunayo i-inthanethi"</string>
+ <string name="no_upstream_notification_message" msgid="5626323795587558017">"Amadivayisi awakwazi ukuxhuma"</string>
+ <string name="no_upstream_notification_disable_button" msgid="868677179945695858">"Vala ukusebenzisa ifoni njengemodemu"</string>
+ <string name="upstream_roaming_notification_title" msgid="2870229486619751829">"I-hotspot noma ukusebenzisa ifoni njengemodemu kuvuliwe"</string>
+ <string name="upstream_roaming_notification_message" msgid="5229740963392849544">"Kungaba nezinkokhelo ezengeziwe uma uzula"</string>
</resources>
diff --git a/Tethering/res/values-mcc311-mnc480-af/strings.xml b/Tethering/res/values-mcc311-mnc480-af/strings.xml
index 9bfa531..cc70b66 100644
--- a/Tethering/res/values-mcc311-mnc480-af/strings.xml
+++ b/Tethering/res/values-mcc311-mnc480-af/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="611650570559011140">"Verbinding het nie internet nie"</string>
- <string name="no_upstream_notification_message" msgid="6508394877641864863">"Toestelle kan nie koppel nie"</string>
- <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Skakel verbinding af"</string>
- <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"Warmkol of verbinding is aan"</string>
- <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"Bykomende heffings kan geld terwyl jy swerf"</string>
+ <string name="no_upstream_notification_title" msgid="5897815458155858594">"Verbinding het nie internet nie"</string>
+ <string name="no_upstream_notification_message" msgid="9037716118606459874">"Toestelle kan nie koppel nie"</string>
+ <string name="no_upstream_notification_disable_button" msgid="5284024068281565456">"Skakel verbinding af"</string>
+ <string name="upstream_roaming_notification_title" msgid="186331286017243006">"Warmkol of verbinding is aan"</string>
+ <string name="upstream_roaming_notification_message" msgid="7692641323940316538">"Bykomende heffings kan geld terwyl jy swerf"</string>
</resources>
diff --git a/Tethering/res/values-mcc311-mnc480-am/strings.xml b/Tethering/res/values-mcc311-mnc480-am/strings.xml
index 5949dfa..9808534 100644
--- a/Tethering/res/values-mcc311-mnc480-am/strings.xml
+++ b/Tethering/res/values-mcc311-mnc480-am/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="611650570559011140">"ማስተሳሰር ምንም በይነመረብ የለውም"</string>
- <string name="no_upstream_notification_message" msgid="6508394877641864863">"መሣሪያዎችን ማገናኘት አይቻልም"</string>
- <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"ማስተሳሰርን አጥፋ"</string>
- <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"መገናኛ ነጥብ ወይም ማስተሳሰር በርቷል"</string>
- <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"በሚያንዣብብበት ጊዜ ተጨማሪ ክፍያዎች ተፈጻሚ ሊሆኑ ይችላሉ"</string>
+ <string name="no_upstream_notification_title" msgid="5897815458155858594">"እንደ ሞደም መሰካት ምንም በይነመረብ የለውም"</string>
+ <string name="no_upstream_notification_message" msgid="9037716118606459874">"መሣሪያዎችን ማገናኘት አልተቻልም"</string>
+ <string name="no_upstream_notification_disable_button" msgid="5284024068281565456">"እንደ ሞደም መሰካትን አጥፋ"</string>
+ <string name="upstream_roaming_notification_title" msgid="186331286017243006">"መገናኛ ነጥብ ወይም እንደ ሞደም መሰካት በርቷል"</string>
+ <string name="upstream_roaming_notification_message" msgid="7692641323940316538">"በሚያንዣብብበት ጊዜ ተጨማሪ ክፍያዎች ተፈጻሚ ሊሆኑ ይችላሉ"</string>
</resources>
diff --git a/Tethering/res/values-mcc311-mnc480-ar/strings.xml b/Tethering/res/values-mcc311-mnc480-ar/strings.xml
index 8467f9b..ab84c4a 100644
--- a/Tethering/res/values-mcc311-mnc480-ar/strings.xml
+++ b/Tethering/res/values-mcc311-mnc480-ar/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="611650570559011140">"ما مِن اتصال بالإنترنت خلال التوصيل"</string>
- <string name="no_upstream_notification_message" msgid="6508394877641864863">"تعذّر اتصال الأجهزة"</string>
- <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"إيقاف التوصيل"</string>
- <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"نقطة الاتصال أو التوصيل مفعّلان"</string>
- <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"قد يتم تطبيق رسوم إضافية أثناء التجوال."</string>
+ <string name="no_upstream_notification_title" msgid="5897815458155858594">"ما مِن اتصال بالإنترنت خلال التوصيل"</string>
+ <string name="no_upstream_notification_message" msgid="9037716118606459874">"يتعذّر اتصال الأجهزة"</string>
+ <string name="no_upstream_notification_disable_button" msgid="5284024068281565456">"إيقاف التوصيل"</string>
+ <string name="upstream_roaming_notification_title" msgid="186331286017243006">"نقطة الاتصال مفعَّلة أو التوصيل مفعَّل"</string>
+ <string name="upstream_roaming_notification_message" msgid="7692641323940316538">"قد يتم تحصيل رسوم إضافية أثناء التجوال."</string>
</resources>
diff --git a/Tethering/res/values-mcc311-mnc480-as/strings.xml b/Tethering/res/values-mcc311-mnc480-as/strings.xml
index 9776bd8..f7ab7e9 100644
--- a/Tethering/res/values-mcc311-mnc480-as/strings.xml
+++ b/Tethering/res/values-mcc311-mnc480-as/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="611650570559011140">"টে\'ডাৰিঙৰ ইণ্টাৰনেট নাই"</string>
- <string name="no_upstream_notification_message" msgid="6508394877641864863">"ডিভাইচসমূহ সংযোগ কৰিব নোৱাৰি"</string>
- <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"টে\'ডাৰিং অফ কৰক"</string>
- <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"হটস্পট অথবা টে\'ডাৰিং অন আছে"</string>
- <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"ৰ\'মিঙত থাকিলে অতিৰিক্ত মাচুল প্ৰযোজ্য হ’ব পাৰে"</string>
+ <string name="no_upstream_notification_title" msgid="5897815458155858594">"টে’ডাৰিঙৰ ইণ্টাৰনেট নাই"</string>
+ <string name="no_upstream_notification_message" msgid="9037716118606459874">"ডিভাইচসমূহ সংযোগ কৰিব নোৱাৰি"</string>
+ <string name="no_upstream_notification_disable_button" msgid="5284024068281565456">"টে’ডাৰিং অফ কৰক"</string>
+ <string name="upstream_roaming_notification_title" msgid="186331286017243006">"হ’টস্প’ট অথবা টে’ডাৰিং অন আছে"</string>
+ <string name="upstream_roaming_notification_message" msgid="7692641323940316538">"ৰ’মিঙত থাকিলে অতিৰিক্ত মাচুল প্ৰযোজ্য হ’ব পাৰে"</string>
</resources>
diff --git a/Tethering/res/values-mcc311-mnc480-az/strings.xml b/Tethering/res/values-mcc311-mnc480-az/strings.xml
index e6d3eaf..6e36df1 100644
--- a/Tethering/res/values-mcc311-mnc480-az/strings.xml
+++ b/Tethering/res/values-mcc311-mnc480-az/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="611650570559011140">"Modemin internetə girişi yoxdur"</string>
- <string name="no_upstream_notification_message" msgid="6508394877641864863">"Cihazları qoşmaq mümkün deyil"</string>
- <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Modemi deaktiv edin"</string>
- <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"Hotspot və ya modem aktivdir"</string>
- <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"Rouminq zamanı əlavə ödənişlər tətbiq edilə bilər"</string>
+ <string name="no_upstream_notification_title" msgid="5897815458155858594">"Modem rejimi internetə qoşulmayıb"</string>
+ <string name="no_upstream_notification_message" msgid="9037716118606459874">"Cihazları qoşmaq olmur"</string>
+ <string name="no_upstream_notification_disable_button" msgid="5284024068281565456">"Modem rejimini deaktiv edin"</string>
+ <string name="upstream_roaming_notification_title" msgid="186331286017243006">"Hotspot və ya modem rejimi aktivdir"</string>
+ <string name="upstream_roaming_notification_message" msgid="7692641323940316538">"Rouminq zamanı əlavə ödəniş çıxıla bilər"</string>
</resources>
diff --git a/Tethering/res/values-mcc311-mnc480-b+sr+Latn/strings.xml b/Tethering/res/values-mcc311-mnc480-b+sr+Latn/strings.xml
index 4c8a1df..1730075 100644
--- a/Tethering/res/values-mcc311-mnc480-b+sr+Latn/strings.xml
+++ b/Tethering/res/values-mcc311-mnc480-b+sr+Latn/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="611650570559011140">"Privezivanje nema pristup internetu"</string>
- <string name="no_upstream_notification_message" msgid="6508394877641864863">"Povezivanje uređaja nije uspelo"</string>
- <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Isključi privezivanje"</string>
- <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"Uključen je hotspot ili privezivanje"</string>
- <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"Možda važe dodatni troškovi u romingu"</string>
+ <string name="no_upstream_notification_title" msgid="5897815458155858594">"Privezivanje nema pristup internetu"</string>
+ <string name="no_upstream_notification_message" msgid="9037716118606459874">"Povezivanje uređaja nije uspelo"</string>
+ <string name="no_upstream_notification_disable_button" msgid="5284024068281565456">"Isključi privezivanje"</string>
+ <string name="upstream_roaming_notification_title" msgid="186331286017243006">"Uključen je hotspot ili privezivanje"</string>
+ <string name="upstream_roaming_notification_message" msgid="7692641323940316538">"Možda važe dodatni troškovi u romingu"</string>
</resources>
diff --git a/Tethering/res/values-mcc311-mnc480-be/strings.xml b/Tethering/res/values-mcc311-mnc480-be/strings.xml
index edfa41e..88577d4 100644
--- a/Tethering/res/values-mcc311-mnc480-be/strings.xml
+++ b/Tethering/res/values-mcc311-mnc480-be/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="611650570559011140">"Рэжым мадэма выкарыстоўваецца без доступу да інтэрнэту"</string>
- <string name="no_upstream_notification_message" msgid="6508394877641864863">"Не ўдалося падключыць прылады"</string>
- <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Выключыць рэжым мадэма"</string>
- <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"Хот-спот або рэжым мадэма ўключаны"</string>
- <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"Пры выкарыстанні роўмінгу можа спаганяцца дадатковая плата"</string>
+ <string name="no_upstream_notification_title" msgid="5897815458155858594">"Рэжым мадэма выкарыстоўваецца без доступу да інтэрнэту"</string>
+ <string name="no_upstream_notification_message" msgid="9037716118606459874">"Не ўдалося падключыць прылады"</string>
+ <string name="no_upstream_notification_disable_button" msgid="5284024068281565456">"Выключыць рэжым мадэма"</string>
+ <string name="upstream_roaming_notification_title" msgid="186331286017243006">"Хот-спот або рэжым мадэма ўключаны"</string>
+ <string name="upstream_roaming_notification_message" msgid="7692641323940316538">"Пры выкарыстанні роўмінгу можа спаганяцца дадатковая плата"</string>
</resources>
diff --git a/Tethering/res/values-mcc311-mnc480-bg/strings.xml b/Tethering/res/values-mcc311-mnc480-bg/strings.xml
index f563981..d549997 100644
--- a/Tethering/res/values-mcc311-mnc480-bg/strings.xml
+++ b/Tethering/res/values-mcc311-mnc480-bg/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="611650570559011140">"Тетърингът няма връзка с интернет"</string>
- <string name="no_upstream_notification_message" msgid="6508394877641864863">"Устройствата не могат да установят връзка"</string>
- <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Изключване на тетъринга"</string>
- <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"Точката за достъп или тетърингът са включени"</string>
- <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"Възможно е да ви бъдат начислени допълнителни такси при роуминг"</string>
+ <string name="no_upstream_notification_title" msgid="5897815458155858594">"Няма връзка с интернет за тетъринг"</string>
+ <string name="no_upstream_notification_message" msgid="9037716118606459874">"Устройствата не могат да установят връзка"</string>
+ <string name="no_upstream_notification_disable_button" msgid="5284024068281565456">"Изключване на функцията за тетъринг"</string>
+ <string name="upstream_roaming_notification_title" msgid="186331286017243006">"Точката за достъп или функцията за тетъринг са включени"</string>
+ <string name="upstream_roaming_notification_message" msgid="7692641323940316538">"Възможно е да ви бъдат начислени допълнителни такси при роуминг"</string>
</resources>
diff --git a/Tethering/res/values-mcc311-mnc480-bn/strings.xml b/Tethering/res/values-mcc311-mnc480-bn/strings.xml
index d8ecd2e..93e316a 100644
--- a/Tethering/res/values-mcc311-mnc480-bn/strings.xml
+++ b/Tethering/res/values-mcc311-mnc480-bn/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="611650570559011140">"টিথারিং করার জন্য কোনও ইন্টারনেট কানেকশন নেই"</string>
- <string name="no_upstream_notification_message" msgid="6508394877641864863">"ডিভাইস কানেক্ট করতে পারছে না"</string>
- <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"টিথারিং বন্ধ করুন"</string>
- <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"হটস্পট বা টিথারিং চালু আছে"</string>
- <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"রোমিংয়ের সময় অতিরিক্ত চার্জ করা হতে পারে"</string>
+ <string name="no_upstream_notification_title" msgid="5897815458155858594">"টেথারিং করার জন্য কোনও ইন্টারনেট কানেকশন লাগে না"</string>
+ <string name="no_upstream_notification_message" msgid="9037716118606459874">"ডিভাইস কানেক্ট করা যাচ্ছে না"</string>
+ <string name="no_upstream_notification_disable_button" msgid="5284024068281565456">"টেথারিং বন্ধ করুন"</string>
+ <string name="upstream_roaming_notification_title" msgid="186331286017243006">"হটস্পট বা টেথারিং চালু আছে"</string>
+ <string name="upstream_roaming_notification_message" msgid="7692641323940316538">"রোমিংয়ে থাকার সময় অতিরিক্ত চার্জ লাগতে পারে"</string>
</resources>
diff --git a/Tethering/res/values-mcc311-mnc480-bs/strings.xml b/Tethering/res/values-mcc311-mnc480-bs/strings.xml
index b85fd5e..27777c2 100644
--- a/Tethering/res/values-mcc311-mnc480-bs/strings.xml
+++ b/Tethering/res/values-mcc311-mnc480-bs/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="611650570559011140">"Povezivanje putem mobitela nema internet"</string>
- <string name="no_upstream_notification_message" msgid="6508394877641864863">"Uređaji se ne mogu povezati"</string>
- <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Isključi povezivanje putem mobitela"</string>
- <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"Pristupna tačka ili povezivanje putem mobitela je uključeno"</string>
- <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"Mogu nastati dodatni troškovi u romingu"</string>
+ <string name="no_upstream_notification_title" msgid="5897815458155858594">"Dijeljenje internetske veze nema internet"</string>
+ <string name="no_upstream_notification_message" msgid="9037716118606459874">"Nije moguće povezati uređaje"</string>
+ <string name="no_upstream_notification_disable_button" msgid="5284024068281565456">"Isključi dijeljenje internetske veze"</string>
+ <string name="upstream_roaming_notification_title" msgid="186331286017243006">"Pristupna tačka ili dijeljenje internetske veze su uključeni"</string>
+ <string name="upstream_roaming_notification_message" msgid="7692641323940316538">"Mogu nastati dodatni troškovi u romingu"</string>
</resources>
diff --git a/Tethering/res/values-mcc311-mnc480-ca/strings.xml b/Tethering/res/values-mcc311-mnc480-ca/strings.xml
index a357215..dad35f8 100644
--- a/Tethering/res/values-mcc311-mnc480-ca/strings.xml
+++ b/Tethering/res/values-mcc311-mnc480-ca/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="611650570559011140">"La compartició de xarxa no té accés a Internet"</string>
- <string name="no_upstream_notification_message" msgid="6508394877641864863">"No es poden connectar els dispositius"</string>
- <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Desactiva la compartició de xarxa"</string>
- <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"S\'ha activat el punt d\'accés Wi‑Fi o la compartició de xarxa"</string>
- <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"És possible que s\'apliquin costos addicionals en itinerància"</string>
+ <string name="no_upstream_notification_title" msgid="5897815458155858594">"La compartició de xarxa no té accés a Internet"</string>
+ <string name="no_upstream_notification_message" msgid="9037716118606459874">"No es poden connectar els dispositius"</string>
+ <string name="no_upstream_notification_disable_button" msgid="5284024068281565456">"Desactiva la compartició de xarxa"</string>
+ <string name="upstream_roaming_notification_title" msgid="186331286017243006">"El punt d\'accés Wi‑Fi o la compartició de xarxa estan activats"</string>
+ <string name="upstream_roaming_notification_message" msgid="7692641323940316538">"És possible que s\'apliquin costos addicionals en itinerància"</string>
</resources>
diff --git a/Tethering/res/values-mcc311-mnc480-cs/strings.xml b/Tethering/res/values-mcc311-mnc480-cs/strings.xml
index 91196be..cbcabe1 100644
--- a/Tethering/res/values-mcc311-mnc480-cs/strings.xml
+++ b/Tethering/res/values-mcc311-mnc480-cs/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="611650570559011140">"Tethering nemá připojení k internetu"</string>
- <string name="no_upstream_notification_message" msgid="6508394877641864863">"Zařízení se nemůžou připojit"</string>
- <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Vypnout tethering"</string>
- <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"Je zapnutý hotspot nebo tethering"</string>
- <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"Při roamingu mohou být účtovány dodatečné poplatky"</string>
+ <string name="no_upstream_notification_title" msgid="5897815458155858594">"Tethering nemá připojení k internetu"</string>
+ <string name="no_upstream_notification_message" msgid="9037716118606459874">"Zařízení se nemůžou připojit"</string>
+ <string name="no_upstream_notification_disable_button" msgid="5284024068281565456">"Vypnout tethering"</string>
+ <string name="upstream_roaming_notification_title" msgid="186331286017243006">"Je zapnutý hotspot nebo tethering"</string>
+ <string name="upstream_roaming_notification_message" msgid="7692641323940316538">"Při roamingu mohou být účtovány dodatečné poplatky"</string>
</resources>
diff --git a/Tethering/res/values-mcc311-mnc480-da/strings.xml b/Tethering/res/values-mcc311-mnc480-da/strings.xml
index 1968900..9176709 100644
--- a/Tethering/res/values-mcc311-mnc480-da/strings.xml
+++ b/Tethering/res/values-mcc311-mnc480-da/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="611650570559011140">"Netdeling har ingen internetforbindelse"</string>
- <string name="no_upstream_notification_message" msgid="6508394877641864863">"Enheder kan ikke oprette forbindelse"</string>
- <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Deaktiver netdeling"</string>
- <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"Hotspot eller netdeling er aktiveret"</string>
- <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"Der opkræves muligvis yderligere gebyrer ved roaming"</string>
+ <string name="no_upstream_notification_title" msgid="5897815458155858594">"Netdeling har ingen internetforbindelse"</string>
+ <string name="no_upstream_notification_message" msgid="9037716118606459874">"Enheder kan ikke oprette forbindelse"</string>
+ <string name="no_upstream_notification_disable_button" msgid="5284024068281565456">"Deaktiver netdeling"</string>
+ <string name="upstream_roaming_notification_title" msgid="186331286017243006">"Hotspot eller netdeling er aktiveret"</string>
+ <string name="upstream_roaming_notification_message" msgid="7692641323940316538">"Der opkræves muligvis yderligere gebyrer ved roaming"</string>
</resources>
diff --git a/Tethering/res/values-mcc311-mnc480-de/strings.xml b/Tethering/res/values-mcc311-mnc480-de/strings.xml
index eb3f8c5..b3bc7d8 100644
--- a/Tethering/res/values-mcc311-mnc480-de/strings.xml
+++ b/Tethering/res/values-mcc311-mnc480-de/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="611650570559011140">"Tethering hat keinen Internetzugriff"</string>
- <string name="no_upstream_notification_message" msgid="6508394877641864863">"Geräte können sich nicht verbinden"</string>
- <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Tethering deaktivieren"</string>
- <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"Hotspot oder Tethering ist aktiviert"</string>
- <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"Für das Roaming können zusätzliche Gebühren anfallen"</string>
+ <string name="no_upstream_notification_title" msgid="5897815458155858594">"Tethering hat keinen Internetzugriff"</string>
+ <string name="no_upstream_notification_message" msgid="9037716118606459874">"Geräte können sich nicht verbinden"</string>
+ <string name="no_upstream_notification_disable_button" msgid="5284024068281565456">"Tethering deaktivieren"</string>
+ <string name="upstream_roaming_notification_title" msgid="186331286017243006">"Hotspot oder Tethering ist aktiviert"</string>
+ <string name="upstream_roaming_notification_message" msgid="7692641323940316538">"Für das Roaming können zusätzliche Gebühren anfallen"</string>
</resources>
diff --git a/Tethering/res/values-mcc311-mnc480-el/strings.xml b/Tethering/res/values-mcc311-mnc480-el/strings.xml
index 56c3d81..babd62c 100644
--- a/Tethering/res/values-mcc311-mnc480-el/strings.xml
+++ b/Tethering/res/values-mcc311-mnc480-el/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="611650570559011140">"Η σύνδεση δεν έχει πρόσβαση στο διαδίκτυο"</string>
- <string name="no_upstream_notification_message" msgid="6508394877641864863">"Δεν είναι δυνατή η σύνδεση των συσκευών"</string>
- <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Απενεργοποιήστε τη σύνδεση"</string>
- <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"Ενεργό σημείο πρόσβασης Wi-Fi ή ενεργή σύνδεση"</string>
- <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"Ενδέχεται να ισχύουν επιπλέον χρεώσεις κατά την περιαγωγή."</string>
+ <string name="no_upstream_notification_title" msgid="5897815458155858594">"Η σύνδεση δεν έχει πρόσβαση στο διαδίκτυο"</string>
+ <string name="no_upstream_notification_message" msgid="9037716118606459874">"Δεν είναι δυνατή η σύνδεση των συσκευών"</string>
+ <string name="no_upstream_notification_disable_button" msgid="5284024068281565456">"Απενεργοποίηση σύνδεσης"</string>
+ <string name="upstream_roaming_notification_title" msgid="186331286017243006">"Ενεργό σημείο πρόσβασης Wi-Fi ή ενεργή σύνδεση"</string>
+ <string name="upstream_roaming_notification_message" msgid="7692641323940316538">"Ενδέχεται να ισχύουν επιπλέον χρεώσεις κατά την περιαγωγή."</string>
</resources>
diff --git a/Tethering/res/values-mcc311-mnc480-en-rAU/strings.xml b/Tethering/res/values-mcc311-mnc480-en-rAU/strings.xml
index dd1a197..afa4467 100644
--- a/Tethering/res/values-mcc311-mnc480-en-rAU/strings.xml
+++ b/Tethering/res/values-mcc311-mnc480-en-rAU/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="611650570559011140">"Tethering has no Internet"</string>
- <string name="no_upstream_notification_message" msgid="6508394877641864863">"Devices can’t connect"</string>
- <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Turn off tethering"</string>
- <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"Hotspot or tethering is on"</string>
- <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"Additional charges may apply while roaming"</string>
+ <string name="no_upstream_notification_title" msgid="5897815458155858594">"Tethering has no Internet"</string>
+ <string name="no_upstream_notification_message" msgid="9037716118606459874">"Devices can\'t connect"</string>
+ <string name="no_upstream_notification_disable_button" msgid="5284024068281565456">"Turn off tethering"</string>
+ <string name="upstream_roaming_notification_title" msgid="186331286017243006">"Hotspot or tethering is on"</string>
+ <string name="upstream_roaming_notification_message" msgid="7692641323940316538">"Additional charges may apply while roaming"</string>
</resources>
diff --git a/Tethering/res/values-mcc311-mnc480-en-rCA/strings.xml b/Tethering/res/values-mcc311-mnc480-en-rCA/strings.xml
index dd1a197..251cad6 100644
--- a/Tethering/res/values-mcc311-mnc480-en-rCA/strings.xml
+++ b/Tethering/res/values-mcc311-mnc480-en-rCA/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="611650570559011140">"Tethering has no Internet"</string>
- <string name="no_upstream_notification_message" msgid="6508394877641864863">"Devices can’t connect"</string>
- <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Turn off tethering"</string>
- <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"Hotspot or tethering is on"</string>
- <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"Additional charges may apply while roaming"</string>
+ <string name="no_upstream_notification_title" msgid="5897815458155858594">"Tethering has no internet"</string>
+ <string name="no_upstream_notification_message" msgid="9037716118606459874">"Devices can’t connect"</string>
+ <string name="no_upstream_notification_disable_button" msgid="5284024068281565456">"Turn off tethering"</string>
+ <string name="upstream_roaming_notification_title" msgid="186331286017243006">"Hotspot or tethering is on"</string>
+ <string name="upstream_roaming_notification_message" msgid="7692641323940316538">"Additional charges may apply while roaming"</string>
</resources>
diff --git a/Tethering/res/values-mcc311-mnc480-en-rGB/strings.xml b/Tethering/res/values-mcc311-mnc480-en-rGB/strings.xml
index dd1a197..afa4467 100644
--- a/Tethering/res/values-mcc311-mnc480-en-rGB/strings.xml
+++ b/Tethering/res/values-mcc311-mnc480-en-rGB/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="611650570559011140">"Tethering has no Internet"</string>
- <string name="no_upstream_notification_message" msgid="6508394877641864863">"Devices can’t connect"</string>
- <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Turn off tethering"</string>
- <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"Hotspot or tethering is on"</string>
- <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"Additional charges may apply while roaming"</string>
+ <string name="no_upstream_notification_title" msgid="5897815458155858594">"Tethering has no Internet"</string>
+ <string name="no_upstream_notification_message" msgid="9037716118606459874">"Devices can\'t connect"</string>
+ <string name="no_upstream_notification_disable_button" msgid="5284024068281565456">"Turn off tethering"</string>
+ <string name="upstream_roaming_notification_title" msgid="186331286017243006">"Hotspot or tethering is on"</string>
+ <string name="upstream_roaming_notification_message" msgid="7692641323940316538">"Additional charges may apply while roaming"</string>
</resources>
diff --git a/Tethering/res/values-mcc311-mnc480-en-rIN/strings.xml b/Tethering/res/values-mcc311-mnc480-en-rIN/strings.xml
index dd1a197..afa4467 100644
--- a/Tethering/res/values-mcc311-mnc480-en-rIN/strings.xml
+++ b/Tethering/res/values-mcc311-mnc480-en-rIN/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="611650570559011140">"Tethering has no Internet"</string>
- <string name="no_upstream_notification_message" msgid="6508394877641864863">"Devices can’t connect"</string>
- <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Turn off tethering"</string>
- <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"Hotspot or tethering is on"</string>
- <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"Additional charges may apply while roaming"</string>
+ <string name="no_upstream_notification_title" msgid="5897815458155858594">"Tethering has no Internet"</string>
+ <string name="no_upstream_notification_message" msgid="9037716118606459874">"Devices can\'t connect"</string>
+ <string name="no_upstream_notification_disable_button" msgid="5284024068281565456">"Turn off tethering"</string>
+ <string name="upstream_roaming_notification_title" msgid="186331286017243006">"Hotspot or tethering is on"</string>
+ <string name="upstream_roaming_notification_message" msgid="7692641323940316538">"Additional charges may apply while roaming"</string>
</resources>
diff --git a/Tethering/res/values-mcc311-mnc480-en-rXC/strings.xml b/Tethering/res/values-mcc311-mnc480-en-rXC/strings.xml
index d3347aa..766a0e8 100644
--- a/Tethering/res/values-mcc311-mnc480-en-rXC/strings.xml
+++ b/Tethering/res/values-mcc311-mnc480-en-rXC/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="611650570559011140">"Tethering has no internet"</string>
- <string name="no_upstream_notification_message" msgid="6508394877641864863">"Devices can’t connect"</string>
- <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Turn off tethering"</string>
- <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"Hotspot or tethering is on"</string>
- <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"Additional charges may apply while roaming"</string>
+ <string name="no_upstream_notification_title" msgid="5897815458155858594">"Tethering has no internet"</string>
+ <string name="no_upstream_notification_message" msgid="9037716118606459874">"Devices can’t connect"</string>
+ <string name="no_upstream_notification_disable_button" msgid="5284024068281565456">"Turn off tethering"</string>
+ <string name="upstream_roaming_notification_title" msgid="186331286017243006">"Hotspot or tethering is on"</string>
+ <string name="upstream_roaming_notification_message" msgid="7692641323940316538">"Additional charges may apply while roaming"</string>
</resources>
diff --git a/Tethering/res/values-mcc311-mnc480-es-rUS/strings.xml b/Tethering/res/values-mcc311-mnc480-es-rUS/strings.xml
index 2f0504f..16c6059 100644
--- a/Tethering/res/values-mcc311-mnc480-es-rUS/strings.xml
+++ b/Tethering/res/values-mcc311-mnc480-es-rUS/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="611650570559011140">"La conexión mediante dispositivo móvil no tiene Internet"</string>
- <string name="no_upstream_notification_message" msgid="6508394877641864863">"No se pueden conectar los dispositivos"</string>
- <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Desactivar conexión mediante dispositivo móvil"</string>
- <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"Se activó el hotspot o la conexión mediante dispositivo móvil"</string>
- <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"Es posible que se apliquen cargos adicionales por roaming"</string>
+ <string name="no_upstream_notification_title" msgid="5897815458155858594">"La conexión mediante dispositivo móvil no tiene Internet"</string>
+ <string name="no_upstream_notification_message" msgid="9037716118606459874">"No se pueden conectar los dispositivos"</string>
+ <string name="no_upstream_notification_disable_button" msgid="5284024068281565456">"Desactivar conexión mediante dispositivo móvil"</string>
+ <string name="upstream_roaming_notification_title" msgid="186331286017243006">"Se activó el hotspot o la conexión mediante dispositivo móvil"</string>
+ <string name="upstream_roaming_notification_message" msgid="7692641323940316538">"Es posible que se apliquen cargos adicionales por roaming"</string>
</resources>
diff --git a/Tethering/res/values-mcc311-mnc480-es/strings.xml b/Tethering/res/values-mcc311-mnc480-es/strings.xml
index 2d8f882..952e056 100644
--- a/Tethering/res/values-mcc311-mnc480-es/strings.xml
+++ b/Tethering/res/values-mcc311-mnc480-es/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="611650570559011140">"La conexión no se puede compartir, porque no hay acceso a Internet"</string>
- <string name="no_upstream_notification_message" msgid="6508394877641864863">"Los dispositivos no se pueden conectar"</string>
- <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Desactivar conexión compartida"</string>
- <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"Punto de acceso o conexión compartida activados"</string>
- <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"Puede que se apliquen cargos adicionales en itinerancia"</string>
+ <string name="no_upstream_notification_title" msgid="5897815458155858594">"La conexión no se puede compartir, porque no hay acceso a Internet"</string>
+ <string name="no_upstream_notification_message" msgid="9037716118606459874">"Los dispositivos no se pueden conectar"</string>
+ <string name="no_upstream_notification_disable_button" msgid="5284024068281565456">"Desactivar conexión compartida"</string>
+ <string name="upstream_roaming_notification_title" msgid="186331286017243006">"Punto de acceso o conexión compartida activados"</string>
+ <string name="upstream_roaming_notification_message" msgid="7692641323940316538">"Pueden aplicarse cargos adicionales en roaming"</string>
</resources>
diff --git a/Tethering/res/values-mcc311-mnc480-et/strings.xml b/Tethering/res/values-mcc311-mnc480-et/strings.xml
index 8493c47..c9cae1f 100644
--- a/Tethering/res/values-mcc311-mnc480-et/strings.xml
+++ b/Tethering/res/values-mcc311-mnc480-et/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="611650570559011140">"Jagamisel puudub internetiühendus"</string>
- <string name="no_upstream_notification_message" msgid="6508394877641864863">"Seadmed ei saa ühendust luua"</string>
- <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Lülita jagamine välja"</string>
- <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"Kuumkoht või jagamine on sisse lülitatud"</string>
- <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"Rändluse kasutamisega võivad kaasneda lisatasud"</string>
+ <string name="no_upstream_notification_title" msgid="5897815458155858594">"Jagamisel puudub internetiühendus"</string>
+ <string name="no_upstream_notification_message" msgid="9037716118606459874">"Seadmed ei saa ühendust luua"</string>
+ <string name="no_upstream_notification_disable_button" msgid="5284024068281565456">"Lülita jagamine välja"</string>
+ <string name="upstream_roaming_notification_title" msgid="186331286017243006">"Kuumkoht või jagamine on sisse lülitatud"</string>
+ <string name="upstream_roaming_notification_message" msgid="7692641323940316538">"Rändluse kasutamisega võivad kaasneda lisatasud"</string>
</resources>
diff --git a/Tethering/res/values-mcc311-mnc480-eu/strings.xml b/Tethering/res/values-mcc311-mnc480-eu/strings.xml
index 33bccab..7abb4b0 100644
--- a/Tethering/res/values-mcc311-mnc480-eu/strings.xml
+++ b/Tethering/res/values-mcc311-mnc480-eu/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="611650570559011140">"Konexioa partekatzeko aukerak ez du Interneteko konexiorik"</string>
- <string name="no_upstream_notification_message" msgid="6508394877641864863">"Ezin dira konektatu gailuak"</string>
- <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Desaktibatu konexioa partekatzeko aukera"</string>
- <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"Wifi-gunea edo konexioa partekatzeko aukera aktibatuta dago"</string>
- <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"Baliteke kostu gehigarriak ordaindu behar izatea ibiltaritzan"</string>
+ <string name="no_upstream_notification_title" msgid="5897815458155858594">"Konexioa partekatzeko aukerak ez du Interneteko konexiorik"</string>
+ <string name="no_upstream_notification_message" msgid="9037716118606459874">"Ezin dira konektatu gailuak"</string>
+ <string name="no_upstream_notification_disable_button" msgid="5284024068281565456">"Desaktibatu konexioa partekatzeko aukera"</string>
+ <string name="upstream_roaming_notification_title" msgid="186331286017243006">"Wifi-gunea edo konexioa partekatzeko aukera aktibatuta dago"</string>
+ <string name="upstream_roaming_notification_message" msgid="7692641323940316538">"Baliteke tarifa gehigarriak ordaindu behar izatea ibiltaritza erabili bitartean"</string>
</resources>
diff --git a/Tethering/res/values-mcc311-mnc480-fa/strings.xml b/Tethering/res/values-mcc311-mnc480-fa/strings.xml
index cf8a0cc..6bdf387 100644
--- a/Tethering/res/values-mcc311-mnc480-fa/strings.xml
+++ b/Tethering/res/values-mcc311-mnc480-fa/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="611650570559011140">"«اشتراکگذاری اینترنت» به اینترنت دسترسی ندارد"</string>
- <string name="no_upstream_notification_message" msgid="6508394877641864863">"دستگاهها متصل نمیشوند"</string>
- <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"خاموش کردن «اشتراکگذاری اینترنت»"</string>
- <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"«نقطه اتصال» یا «اشتراکگذاری اینترنت» روشن است"</string>
- <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"ممکن است درحین فراگردی تغییرات دیگر اعمال شود"</string>
+ <string name="no_upstream_notification_title" msgid="5897815458155858594">"«اشتراکگذاری اینترنت» به اینترنت دسترسی ندارد"</string>
+ <string name="no_upstream_notification_message" msgid="9037716118606459874">"دستگاهها متصل نمیشوند"</string>
+ <string name="no_upstream_notification_disable_button" msgid="5284024068281565456">"خاموش کردن «اشتراکگذاری اینترنت»"</string>
+ <string name="upstream_roaming_notification_title" msgid="186331286017243006">"«نقطه اتصال» یا «اشتراکگذاری اینترنت» روشن است"</string>
+ <string name="upstream_roaming_notification_message" msgid="7692641323940316538">"هنگام فراگردی ممکن است هزینههای اضافی کسر شود"</string>
</resources>
diff --git a/Tethering/res/values-mcc311-mnc480-fi/strings.xml b/Tethering/res/values-mcc311-mnc480-fi/strings.xml
index 6a3ab80..57f16bb 100644
--- a/Tethering/res/values-mcc311-mnc480-fi/strings.xml
+++ b/Tethering/res/values-mcc311-mnc480-fi/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="611650570559011140">"Ei jaettavaa internetyhteyttä"</string>
- <string name="no_upstream_notification_message" msgid="6508394877641864863">"Laitteet eivät voi muodostaa yhteyttä"</string>
- <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Laita yhteyden jakaminen pois päältä"</string>
- <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"Hotspot tai yhteyden jakaminen on päällä"</string>
- <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"Roaming voi aiheuttaa lisämaksuja"</string>
+ <string name="no_upstream_notification_title" msgid="5897815458155858594">"Puhelinta ei voi käyttää modeemina, koska sillä ei ole internet-yhteyttä"</string>
+ <string name="no_upstream_notification_message" msgid="9037716118606459874">"Laitteet eivät voi muodostaa yhteyttä"</string>
+ <string name="no_upstream_notification_disable_button" msgid="5284024068281565456">"Laita puhelimen käyttäminen modeemina pois päältä"</string>
+ <string name="upstream_roaming_notification_title" msgid="186331286017243006">"Hotspot tai puhelimen käyttäminen modeemina on päällä"</string>
+ <string name="upstream_roaming_notification_message" msgid="7692641323940316538">"Roaming voi aiheuttaa lisämaksuja"</string>
</resources>
diff --git a/Tethering/res/values-mcc311-mnc480-fr-rCA/strings.xml b/Tethering/res/values-mcc311-mnc480-fr-rCA/strings.xml
index ffb9bf6..bf3d634 100644
--- a/Tethering/res/values-mcc311-mnc480-fr-rCA/strings.xml
+++ b/Tethering/res/values-mcc311-mnc480-fr-rCA/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="611650570559011140">"Le partage de connexion n\'est pas connecté à Internet"</string>
- <string name="no_upstream_notification_message" msgid="6508394877641864863">"Impossible de connecter les appareils"</string>
- <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Désactiver le partage de connexion"</string>
- <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"Le point d\'accès ou le partage de connexion est activé"</string>
- <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"En itinérance, des frais supplémentaires peuvent s\'appliquer"</string>
+ <string name="no_upstream_notification_title" msgid="5897815458155858594">"Le partage de connexion n\'est pas connecté à Internet"</string>
+ <string name="no_upstream_notification_message" msgid="9037716118606459874">"Impossible de connecter les appareils"</string>
+ <string name="no_upstream_notification_disable_button" msgid="5284024068281565456">"Désactiver le partage de connexion"</string>
+ <string name="upstream_roaming_notification_title" msgid="186331286017243006">"Le point d\'accès sans fil ou le partage de connexion est activé"</string>
+ <string name="upstream_roaming_notification_message" msgid="7692641323940316538">"En itinérance, des frais supplémentaires peuvent s\'appliquer"</string>
</resources>
diff --git a/Tethering/res/values-mcc311-mnc480-fr/strings.xml b/Tethering/res/values-mcc311-mnc480-fr/strings.xml
index 768bce3..6faa61e 100644
--- a/Tethering/res/values-mcc311-mnc480-fr/strings.xml
+++ b/Tethering/res/values-mcc311-mnc480-fr/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="611650570559011140">"Aucune connexion à Internet n\'est disponible pour le partage de connexion"</string>
- <string name="no_upstream_notification_message" msgid="6508394877641864863">"Impossible de connecter les appareils"</string>
- <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Désactiver le partage de connexion"</string>
- <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"Le point d\'accès ou le partage de connexion est activé"</string>
- <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"En itinérance, des frais supplémentaires peuvent s\'appliquer"</string>
+ <string name="no_upstream_notification_title" msgid="5897815458155858594">"Aucune connexion à Internet disponible pour le partage de connexion"</string>
+ <string name="no_upstream_notification_message" msgid="9037716118606459874">"Impossible de connecter les appareils"</string>
+ <string name="no_upstream_notification_disable_button" msgid="5284024068281565456">"Désactiver le partage de connexion"</string>
+ <string name="upstream_roaming_notification_title" msgid="186331286017243006">"Le point d\'accès ou le partage de connexion est activé"</string>
+ <string name="upstream_roaming_notification_message" msgid="7692641323940316538">"En itinérance, des frais supplémentaires peuvent s\'appliquer"</string>
</resources>
diff --git a/Tethering/res/values-mcc311-mnc480-gl/strings.xml b/Tethering/res/values-mcc311-mnc480-gl/strings.xml
index 0c4195a..446d706 100644
--- a/Tethering/res/values-mcc311-mnc480-gl/strings.xml
+++ b/Tethering/res/values-mcc311-mnc480-gl/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="611650570559011140">"A conexión compartida non ten Internet"</string>
- <string name="no_upstream_notification_message" msgid="6508394877641864863">"Non se puideron conectar os dispositivos"</string>
- <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Desactivar conexión compartida"</string>
- <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"Está activada a zona wifi ou a conexión compartida"</string>
- <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"Pódense aplicar cargos adicionais en itinerancia"</string>
+ <string name="no_upstream_notification_title" msgid="5897815458155858594">"A conexión compartida non ten acceso a Internet"</string>
+ <string name="no_upstream_notification_message" msgid="9037716118606459874">"Non se puideron conectar os dispositivos"</string>
+ <string name="no_upstream_notification_disable_button" msgid="5284024068281565456">"Desactivar conexión compartida"</string>
+ <string name="upstream_roaming_notification_title" msgid="186331286017243006">"Está activada a zona wifi ou a conexión compartida"</string>
+ <string name="upstream_roaming_notification_message" msgid="7692641323940316538">"Pódense aplicar cargos adicionais en itinerancia"</string>
</resources>
diff --git a/Tethering/res/values-mcc311-mnc480-gu/strings.xml b/Tethering/res/values-mcc311-mnc480-gu/strings.xml
index e9d33a7..577874d 100644
--- a/Tethering/res/values-mcc311-mnc480-gu/strings.xml
+++ b/Tethering/res/values-mcc311-mnc480-gu/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="611650570559011140">"ઇન્ટરનેટ શેર કરવાની સુવિધામાં ઇન્ટરનેટ નથી"</string>
- <string name="no_upstream_notification_message" msgid="6508394877641864863">"ડિવાઇસ કનેક્ટ કરી શકાતા નથી"</string>
- <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"ઇન્ટરનેટ શેર કરવાની સુવિધા બંધ કરો"</string>
- <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"હૉટસ્પૉટ અથવા ઇન્ટરનેટ શેર કરવાની સુવિધા ચાલુ છે"</string>
- <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"રોમિંગમાં વધારાના શુલ્ક લાગી શકે છે"</string>
+ <string name="no_upstream_notification_title" msgid="5897815458155858594">"ઇન્ટરનેટ શેર કરવાની સુવિધામાં ઇન્ટરનેટ નથી"</string>
+ <string name="no_upstream_notification_message" msgid="9037716118606459874">"ડિવાઇસ કનેક્ટ કરી શકાતા નથી"</string>
+ <string name="no_upstream_notification_disable_button" msgid="5284024068281565456">"ઇન્ટરનેટ શેર કરવાની સુવિધા બંધ કરો"</string>
+ <string name="upstream_roaming_notification_title" msgid="186331286017243006">"હૉટસ્પૉટ અથવા ઇન્ટરનેટ શેર કરવાની સુવિધા ચાલુ છે"</string>
+ <string name="upstream_roaming_notification_message" msgid="7692641323940316538">"રોમિંગ દરમિયાન વધારાના શુલ્ક લાગુ થઈ શકે છે"</string>
</resources>
diff --git a/Tethering/res/values-mcc311-mnc480-hi/strings.xml b/Tethering/res/values-mcc311-mnc480-hi/strings.xml
index aa418ac..f2a4773 100644
--- a/Tethering/res/values-mcc311-mnc480-hi/strings.xml
+++ b/Tethering/res/values-mcc311-mnc480-hi/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="611650570559011140">"टेदरिंग से इंटरनेट नहीं चल रहा"</string>
- <string name="no_upstream_notification_message" msgid="6508394877641864863">"डिवाइस कनेक्ट नहीं हो पा रहे"</string>
- <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"टेदरिंग बंद करें"</string>
- <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"हॉटस्पॉट या टेदरिंग चालू है"</string>
- <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"रोमिंग के दौरान अतिरिक्त शुल्क लग सकता है"</string>
+ <string name="no_upstream_notification_title" msgid="5897815458155858594">"टेदरिंग से इंटरनेट नहीं चल रहा है"</string>
+ <string name="no_upstream_notification_message" msgid="9037716118606459874">"डिवाइस कनेक्ट नहीं हो पा रहे"</string>
+ <string name="no_upstream_notification_disable_button" msgid="5284024068281565456">"टेदरिंग बंद करें"</string>
+ <string name="upstream_roaming_notification_title" msgid="186331286017243006">"हॉटस्पॉट या टेदरिंग चालू है"</string>
+ <string name="upstream_roaming_notification_message" msgid="7692641323940316538">"रोमिंग के दौरान अतिरिक्त शुल्क काटा जा सकता है"</string>
</resources>
diff --git a/Tethering/res/values-mcc311-mnc480-hr/strings.xml b/Tethering/res/values-mcc311-mnc480-hr/strings.xml
index 51c524a..a08f822 100644
--- a/Tethering/res/values-mcc311-mnc480-hr/strings.xml
+++ b/Tethering/res/values-mcc311-mnc480-hr/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="611650570559011140">"Modemsko povezivanje nema internet"</string>
- <string name="no_upstream_notification_message" msgid="6508394877641864863">"Uređaji se ne mogu povezati"</string>
- <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Isključivanje modemskog povezivanja"</string>
- <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"Uključena je žarišna točka ili modemsko povezivanje"</string>
- <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"U roamingu su mogući dodatni troškovi"</string>
+ <string name="no_upstream_notification_title" msgid="5897815458155858594">"Modemsko povezivanje nema internet"</string>
+ <string name="no_upstream_notification_message" msgid="9037716118606459874">"Uređaji se ne mogu povezati"</string>
+ <string name="no_upstream_notification_disable_button" msgid="5284024068281565456">"Isključi modemsko povezivanje"</string>
+ <string name="upstream_roaming_notification_title" msgid="186331286017243006">"Uključena je žarišna točka ili modemsko povezivanje"</string>
+ <string name="upstream_roaming_notification_message" msgid="7692641323940316538">"U roamingu su mogući dodatni troškovi"</string>
</resources>
diff --git a/Tethering/res/values-mcc311-mnc480-hu/strings.xml b/Tethering/res/values-mcc311-mnc480-hu/strings.xml
index 164e45e..61a399a 100644
--- a/Tethering/res/values-mcc311-mnc480-hu/strings.xml
+++ b/Tethering/res/values-mcc311-mnc480-hu/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="611650570559011140">"Nincs internetkapcsolat az internet megosztásához"</string>
- <string name="no_upstream_notification_message" msgid="6508394877641864863">"Az eszközök nem tudnak csatlakozni"</string>
- <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Internetmegosztás kikapcsolása"</string>
- <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"A hotspot vagy az internetmegosztás be van kapcsolva"</string>
- <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"Roaming során további díjak léphetnek fel"</string>
+ <string name="no_upstream_notification_title" msgid="5897815458155858594">"Nincs internetkapcsolat az internet megosztásához"</string>
+ <string name="no_upstream_notification_message" msgid="9037716118606459874">"Az eszközök nem tudnak csatlakozni"</string>
+ <string name="no_upstream_notification_disable_button" msgid="5284024068281565456">"Internetmegosztás kikapcsolása"</string>
+ <string name="upstream_roaming_notification_title" msgid="186331286017243006">"A hotspot vagy az internetmegosztás be van kapcsolva"</string>
+ <string name="upstream_roaming_notification_message" msgid="7692641323940316538">"Roaming során további díjak léphetnek fel"</string>
</resources>
diff --git a/Tethering/res/values-mcc311-mnc480-hy/strings.xml b/Tethering/res/values-mcc311-mnc480-hy/strings.xml
index e76c0a4..f4d63c9 100644
--- a/Tethering/res/values-mcc311-mnc480-hy/strings.xml
+++ b/Tethering/res/values-mcc311-mnc480-hy/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="611650570559011140">"Մոդեմի ռեժիմի կապը բացակայում է"</string>
- <string name="no_upstream_notification_message" msgid="6508394877641864863">"Չհաջողվեց միացնել սարքը"</string>
- <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Անջատել մոդեմի ռեժիմը"</string>
- <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"Թեժ կետը կամ մոդեմի ռեժիմը միացված է"</string>
- <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"Ռոումինգում կարող են լրացուցիչ վճարներ գանձվել"</string>
+ <string name="no_upstream_notification_title" msgid="5897815458155858594">"Մոդեմի ռեժիմի ինտերնետ կապը բացակայում է"</string>
+ <string name="no_upstream_notification_message" msgid="9037716118606459874">"Չհաջողվեց միացնել սարքերը"</string>
+ <string name="no_upstream_notification_disable_button" msgid="5284024068281565456">"Անջատել մոդեմի ռեժիմը"</string>
+ <string name="upstream_roaming_notification_title" msgid="186331286017243006">"Թեժ կետը կամ մոդեմի ռեժիմը միացված է"</string>
+ <string name="upstream_roaming_notification_message" msgid="7692641323940316538">"Ռոումինգում կարող են լրացուցիչ վճարներ գանձվել"</string>
</resources>
diff --git a/Tethering/res/values-mcc311-mnc480-in/strings.xml b/Tethering/res/values-mcc311-mnc480-in/strings.xml
index 2b817f8..98c6d71 100644
--- a/Tethering/res/values-mcc311-mnc480-in/strings.xml
+++ b/Tethering/res/values-mcc311-mnc480-in/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="611650570559011140">"Tidak ada koneksi internet di tethering"</string>
- <string name="no_upstream_notification_message" msgid="6508394877641864863">"Perangkat tidak dapat terhubung"</string>
- <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Nonaktifkan tethering"</string>
- <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"Hotspot atau tethering aktif"</string>
- <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"Biaya tambahan mungkin berlaku saat roaming"</string>
+ <string name="no_upstream_notification_title" msgid="5897815458155858594">"Tidak ada koneksi internet di tethering"</string>
+ <string name="no_upstream_notification_message" msgid="9037716118606459874">"Perangkat tidak dapat terhubung"</string>
+ <string name="no_upstream_notification_disable_button" msgid="5284024068281565456">"Nonaktifkan tethering"</string>
+ <string name="upstream_roaming_notification_title" msgid="186331286017243006">"Hotspot atau tethering aktif"</string>
+ <string name="upstream_roaming_notification_message" msgid="7692641323940316538">"Biaya tambahan mungkin berlaku saat roaming"</string>
</resources>
diff --git a/Tethering/res/values-mcc311-mnc480-is/strings.xml b/Tethering/res/values-mcc311-mnc480-is/strings.xml
index a338d9c..ade1b01 100644
--- a/Tethering/res/values-mcc311-mnc480-is/strings.xml
+++ b/Tethering/res/values-mcc311-mnc480-is/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="611650570559011140">"Tjóðrun er ekki með internettengingu"</string>
- <string name="no_upstream_notification_message" msgid="6508394877641864863">"Tæki geta ekki tengst"</string>
- <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Slökkva á tjóðrun"</string>
- <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"Kveikt er á heitum reit eða tjóðrun"</string>
- <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"Viðbótargjöld kunna að eiga við í reiki"</string>
+ <string name="no_upstream_notification_title" msgid="5897815458155858594">"Tjóðrun er ekki með internettengingu"</string>
+ <string name="no_upstream_notification_message" msgid="9037716118606459874">"Tæki geta ekki tengst"</string>
+ <string name="no_upstream_notification_disable_button" msgid="5284024068281565456">"Slökkva á tjóðrun"</string>
+ <string name="upstream_roaming_notification_title" msgid="186331286017243006">"Kveikt er á heitum reit eða tjóðrun"</string>
+ <string name="upstream_roaming_notification_message" msgid="7692641323940316538">"Viðbótargjöld kunna að eiga við í reiki"</string>
</resources>
diff --git a/Tethering/res/values-mcc311-mnc480-it/strings.xml b/Tethering/res/values-mcc311-mnc480-it/strings.xml
index 77769c2..07e1526 100644
--- a/Tethering/res/values-mcc311-mnc480-it/strings.xml
+++ b/Tethering/res/values-mcc311-mnc480-it/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="611650570559011140">"Nessuna connessione a Internet per il tethering"</string>
- <string name="no_upstream_notification_message" msgid="6508394877641864863">"Impossibile connettere i dispositivi"</string>
- <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Disattiva il tethering"</string>
- <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"Hotspot o tethering attivi"</string>
- <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"Potrebbero essere applicati costi aggiuntivi durante il roaming"</string>
+ <string name="no_upstream_notification_title" msgid="5897815458155858594">"Nessuna connessione a internet per il tethering"</string>
+ <string name="no_upstream_notification_message" msgid="9037716118606459874">"Impossibile connettere i dispositivi"</string>
+ <string name="no_upstream_notification_disable_button" msgid="5284024068281565456">"Disattiva il tethering"</string>
+ <string name="upstream_roaming_notification_title" msgid="186331286017243006">"Hotspot o tethering attivo"</string>
+ <string name="upstream_roaming_notification_message" msgid="7692641323940316538">"Potrebbero essere applicati costi aggiuntivi durante il roaming"</string>
</resources>
diff --git a/Tethering/res/values-mcc311-mnc480-iw/strings.xml b/Tethering/res/values-mcc311-mnc480-iw/strings.xml
index 5267b51..ebebae8 100644
--- a/Tethering/res/values-mcc311-mnc480-iw/strings.xml
+++ b/Tethering/res/values-mcc311-mnc480-iw/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="611650570559011140">"אי אפשר להפעיל את תכונת שיתוף האינטרנט בין מכשירים כי אין חיבור לאינטרנט"</string>
- <string name="no_upstream_notification_message" msgid="6508394877641864863">"למכשירים אין אפשרות להתחבר"</string>
- <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"השבתה של שיתוף האינטרנט בין מכשירים"</string>
- <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"תכונת הנקודה לשיתוף אינטרנט או תכונת שיתוף האינטרנט בין מכשירים פועלת"</string>
- <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"ייתכנו חיובים נוספים בעת נדידה"</string>
+ <string name="no_upstream_notification_title" msgid="5897815458155858594">"אי אפשר להפעיל את תכונת שיתוף האינטרנט בין מכשירים כי אין חיבור לאינטרנט"</string>
+ <string name="no_upstream_notification_message" msgid="9037716118606459874">"למכשירים אין אפשרות להתחבר"</string>
+ <string name="no_upstream_notification_disable_button" msgid="5284024068281565456">"השבתה של שיתוף האינטרנט בין מכשירים"</string>
+ <string name="upstream_roaming_notification_title" msgid="186331286017243006">"תכונת הנקודה לשיתוף אינטרנט או תכונת שיתוף האינטרנט בין מכשירים פועלת"</string>
+ <string name="upstream_roaming_notification_message" msgid="7692641323940316538">"ייתכנו חיובים נוספים במהלך נדידה"</string>
</resources>
diff --git a/Tethering/res/values-mcc311-mnc480-ja/strings.xml b/Tethering/res/values-mcc311-mnc480-ja/strings.xml
index 66a9a6d..334d362 100644
--- a/Tethering/res/values-mcc311-mnc480-ja/strings.xml
+++ b/Tethering/res/values-mcc311-mnc480-ja/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="611650570559011140">"テザリングがインターネットに接続されていません"</string>
- <string name="no_upstream_notification_message" msgid="6508394877641864863">"デバイスを接続できません"</string>
- <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"テザリングを OFF にする"</string>
- <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"アクセス ポイントまたはテザリングが ON です"</string>
- <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"ローミング時に追加料金が発生することがあります"</string>
+ <string name="no_upstream_notification_title" msgid="5897815458155858594">"テザリングがインターネットに接続されていません"</string>
+ <string name="no_upstream_notification_message" msgid="9037716118606459874">"デバイスを接続できません"</string>
+ <string name="no_upstream_notification_disable_button" msgid="5284024068281565456">"テザリングを OFF にする"</string>
+ <string name="upstream_roaming_notification_title" msgid="186331286017243006">"アクセス ポイントまたはテザリングが ON です"</string>
+ <string name="upstream_roaming_notification_message" msgid="7692641323940316538">"ローミング時に追加料金が発生することがあります"</string>
</resources>
diff --git a/Tethering/res/values-mcc311-mnc480-ka/strings.xml b/Tethering/res/values-mcc311-mnc480-ka/strings.xml
index d8ad880..d369d20 100644
--- a/Tethering/res/values-mcc311-mnc480-ka/strings.xml
+++ b/Tethering/res/values-mcc311-mnc480-ka/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="611650570559011140">"ტეტერინგს არ აქვს ინტერნეტზე წვდომა"</string>
- <string name="no_upstream_notification_message" msgid="6508394877641864863">"მოწყობილობები ვერ ახერხებენ დაკავშირებას"</string>
- <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"ტეტერინგის გამორთვა"</string>
- <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"ჩართულია უსადენო ქსელი ან ტეტერინგი"</string>
- <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"როუმინგის გამოყენებისას შეიძლება ჩამოგეჭრათ დამატებითი საფასური"</string>
+ <string name="no_upstream_notification_title" msgid="5897815458155858594">"ტეტერინგს არ აქვს ინტერნეტზე წვდომა"</string>
+ <string name="no_upstream_notification_message" msgid="9037716118606459874">"მოწყობილობები ვერ ახერხებენ დაკავშირებას"</string>
+ <string name="no_upstream_notification_disable_button" msgid="5284024068281565456">"ტეტერინგის გამორთვა"</string>
+ <string name="upstream_roaming_notification_title" msgid="186331286017243006">"ჩართულია უსადენო ქსელი ან ტეტერინგი"</string>
+ <string name="upstream_roaming_notification_message" msgid="7692641323940316538">"როუმინგის გამოყენებისას შეიძლება ჩამოგეჭრათ დამატებითი საფასური"</string>
</resources>
diff --git a/Tethering/res/values-mcc311-mnc480-kk/strings.xml b/Tethering/res/values-mcc311-mnc480-kk/strings.xml
index 1ddd6b4..c16c106 100644
--- a/Tethering/res/values-mcc311-mnc480-kk/strings.xml
+++ b/Tethering/res/values-mcc311-mnc480-kk/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="611650570559011140">"Тетеринг режимі интернет байланысынсыз пайдаланылуда"</string>
- <string name="no_upstream_notification_message" msgid="6508394877641864863">"Құрылғыларды байланыстыру мүмкін емес"</string>
- <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Тетерингіні өшіру"</string>
- <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"Хотспот немесе тетеринг қосулы"</string>
- <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"Роуминг кезінде қосымша ақы алынуы мүмкін."</string>
+ <string name="no_upstream_notification_title" msgid="5897815458155858594">"Тетеринг кезінде интернет байланысы жоқ"</string>
+ <string name="no_upstream_notification_message" msgid="9037716118606459874">"Құрылғыларды байланыстыру мүмкін емес"</string>
+ <string name="no_upstream_notification_disable_button" msgid="5284024068281565456">"Тетерингіні өшіру"</string>
+ <string name="upstream_roaming_notification_title" msgid="186331286017243006">"Хотспот немесе тетеринг қосулы"</string>
+ <string name="upstream_roaming_notification_message" msgid="7692641323940316538">"Роуминг кезінде қосымша ақы алынуы мүмкін."</string>
</resources>
diff --git a/Tethering/res/values-mcc311-mnc480-km/strings.xml b/Tethering/res/values-mcc311-mnc480-km/strings.xml
index cf5a137..8084b87 100644
--- a/Tethering/res/values-mcc311-mnc480-km/strings.xml
+++ b/Tethering/res/values-mcc311-mnc480-km/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="611650570559011140">"ការភ្ជាប់មិនមានអ៊ីនធឺណិតទេ"</string>
- <string name="no_upstream_notification_message" msgid="6508394877641864863">"មិនអាចភ្ជាប់ឧបករណ៍បានទេ"</string>
- <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"បិទការភ្ជាប់"</string>
- <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"ហតស្ប៉ត ឬការភ្ជាប់ត្រូវបានបើក"</string>
- <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"អាចមានការគិតថ្លៃបន្ថែម នៅពេលរ៉ូមីង"</string>
+ <string name="no_upstream_notification_title" msgid="5897815458155858594">"ការភ្ជាប់មិនមានអ៊ីនធឺណិតទេ"</string>
+ <string name="no_upstream_notification_message" msgid="9037716118606459874">"មិនអាចភ្ជាប់ឧបករណ៍បានទេ"</string>
+ <string name="no_upstream_notification_disable_button" msgid="5284024068281565456">"បិទការភ្ជាប់"</string>
+ <string name="upstream_roaming_notification_title" msgid="186331286017243006">"ហតស្ប៉ត ឬការភ្ជាប់ត្រូវបានបើក"</string>
+ <string name="upstream_roaming_notification_message" msgid="7692641323940316538">"អាចមានការគិតថ្លៃបន្ថែម នៅពេលរ៉ូមីង"</string>
</resources>
diff --git a/Tethering/res/values-mcc311-mnc480-kn/strings.xml b/Tethering/res/values-mcc311-mnc480-kn/strings.xml
index 68ae68b..528cdbf 100644
--- a/Tethering/res/values-mcc311-mnc480-kn/strings.xml
+++ b/Tethering/res/values-mcc311-mnc480-kn/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="611650570559011140">"ಟೆಥರಿಂಗ್ ಯಾವುದೇ ಇಂಟರ್ನೆಟ್ ಕನೆಕ್ಷನ್ ಹೊಂದಿಲ್ಲ"</string>
- <string name="no_upstream_notification_message" msgid="6508394877641864863">"ಸಾಧನಗಳನ್ನು ಕನೆಕ್ಟ್ ಮಾಡಲು ಸಾಧ್ಯವಿಲ್ಲ"</string>
- <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"ಟೆಥರಿಂಗ್ ಆಫ್ ಮಾಡಿ"</string>
- <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"ಹಾಟ್ಸ್ಪಾಟ್ ಅಥವಾ ಟೆಥರಿಂಗ್ ಆನ್ ಆಗಿದೆ"</string>
- <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"ರೋಮಿಂಗ್ನಲ್ಲಿರುವಾಗ ಹೆಚ್ಚುವರಿ ಶುಲ್ಕಗಳು ಅನ್ವಯವಾಗಬಹುದು"</string>
+ <string name="no_upstream_notification_title" msgid="5897815458155858594">"ಟೆಥರಿಂಗ್ ಯಾವುದೇ ಇಂಟರ್ನೆಟ್ ಕನೆಕ್ಷನ್ ಹೊಂದಿಲ್ಲ"</string>
+ <string name="no_upstream_notification_message" msgid="9037716118606459874">"ಸಾಧನಗಳನ್ನು ಕನೆಕ್ಟ್ ಮಾಡಲು ಸಾಧ್ಯವಿಲ್ಲ"</string>
+ <string name="no_upstream_notification_disable_button" msgid="5284024068281565456">"ಟೆಥರಿಂಗ್ ಆಫ್ ಮಾಡಿ"</string>
+ <string name="upstream_roaming_notification_title" msgid="186331286017243006">"ಹಾಟ್ಸ್ಪಾಟ್ ಅಥವಾ ಟೆಥರಿಂಗ್ ಆನ್ ಆಗಿದೆ"</string>
+ <string name="upstream_roaming_notification_message" msgid="7692641323940316538">"ರೋಮಿಂಗ್ನಲ್ಲಿರುವಾಗ ಹೆಚ್ಚುವರಿ ಶುಲ್ಕಗಳು ಅನ್ವಯವಾಗಬಹುದು"</string>
</resources>
diff --git a/Tethering/res/values-mcc311-mnc480-ko/strings.xml b/Tethering/res/values-mcc311-mnc480-ko/strings.xml
index 17185ba..f195c82 100644
--- a/Tethering/res/values-mcc311-mnc480-ko/strings.xml
+++ b/Tethering/res/values-mcc311-mnc480-ko/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="611650570559011140">"테더링으로 인터넷을 사용할 수 없음"</string>
- <string name="no_upstream_notification_message" msgid="6508394877641864863">"기기에서 연결할 수 없음"</string>
- <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"테더링 사용 중지"</string>
- <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"핫스팟 또는 테더링 켜짐"</string>
- <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"로밍 중에는 추가 요금이 발생할 수 있습니다."</string>
+ <string name="no_upstream_notification_title" msgid="5897815458155858594">"테더링으로 인터넷을 사용할 수 없음"</string>
+ <string name="no_upstream_notification_message" msgid="9037716118606459874">"기기에서 연결할 수 없음"</string>
+ <string name="no_upstream_notification_disable_button" msgid="5284024068281565456">"테더링 사용 중지"</string>
+ <string name="upstream_roaming_notification_title" msgid="186331286017243006">"핫스팟 또는 테더링이 켜짐"</string>
+ <string name="upstream_roaming_notification_message" msgid="7692641323940316538">"로밍 중에는 추가 요금이 부과될 수 있습니다."</string>
</resources>
diff --git a/Tethering/res/values-mcc311-mnc480-ky/strings.xml b/Tethering/res/values-mcc311-mnc480-ky/strings.xml
index 6a9fb98..f8ca531 100644
--- a/Tethering/res/values-mcc311-mnc480-ky/strings.xml
+++ b/Tethering/res/values-mcc311-mnc480-ky/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="611650570559011140">"Модем режими Интернети жок колдонулууда"</string>
- <string name="no_upstream_notification_message" msgid="6508394877641864863">"Түзмөктөр туташпай жатат"</string>
- <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Модем режимин өчүрүү"</string>
- <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"Байланыш түйүнү же модем режими күйүк"</string>
- <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"Роумингде кошумча акы алынышы мүмкүн"</string>
+ <string name="no_upstream_notification_title" msgid="5897815458155858594">"Модем режими Интернети жок колдонулууда"</string>
+ <string name="no_upstream_notification_message" msgid="9037716118606459874">"Түзмөктөр туташпай жатат"</string>
+ <string name="no_upstream_notification_disable_button" msgid="5284024068281565456">"Модем режимин өчүрүү"</string>
+ <string name="upstream_roaming_notification_title" msgid="186331286017243006">"Байланыш түйүнү же модем режими күйүк"</string>
+ <string name="upstream_roaming_notification_message" msgid="7692641323940316538">"Роумингде кошумча акы алынышы мүмкүн"</string>
</resources>
diff --git a/Tethering/res/values-mcc311-mnc480-lo/strings.xml b/Tethering/res/values-mcc311-mnc480-lo/strings.xml
index bcc4b57..6258bc0 100644
--- a/Tethering/res/values-mcc311-mnc480-lo/strings.xml
+++ b/Tethering/res/values-mcc311-mnc480-lo/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="611650570559011140">"ການປ່ອຍສັນຍານບໍ່ມີອິນເຕີເນັດ"</string>
- <string name="no_upstream_notification_message" msgid="6508394877641864863">"ອຸປະກອນບໍ່ສາມາດເຊື່ອມຕໍ່ໄດ້"</string>
- <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"ປິດການປ່ອຍສັນຍານ"</string>
- <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"ເປີດໃຊ້ຮັອດສະປອດ ຫຼື ການປ່ອຍສັນຍານຢູ່"</string>
- <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"ອາດມີຄ່າໃຊ້ຈ່າຍເພີ່ມເຕີມໃນລະຫວ່າງການໂຣມມິງ"</string>
+ <string name="no_upstream_notification_title" msgid="5897815458155858594">"ການປ່ອຍສັນຍານບໍ່ມີອິນເຕີເນັດ"</string>
+ <string name="no_upstream_notification_message" msgid="9037716118606459874">"ອຸປະກອນບໍ່ສາມາດເຊື່ອມຕໍ່ໄດ້"</string>
+ <string name="no_upstream_notification_disable_button" msgid="5284024068281565456">"ປິດການປ່ອຍສັນຍານ"</string>
+ <string name="upstream_roaming_notification_title" msgid="186331286017243006">"ຮັອດສະປອດ ຫຼື ການປ່ອຍສັນຍານເປີດຢູ່"</string>
+ <string name="upstream_roaming_notification_message" msgid="7692641323940316538">"ອາດມີຄ່າບໍລິການເພີ່ມເຕີມໃນລະຫວ່າງການໂຣມມິງ"</string>
</resources>
diff --git a/Tethering/res/values-mcc311-mnc480-lt/strings.xml b/Tethering/res/values-mcc311-mnc480-lt/strings.xml
index 011c2c1..267c7f6 100644
--- a/Tethering/res/values-mcc311-mnc480-lt/strings.xml
+++ b/Tethering/res/values-mcc311-mnc480-lt/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="611650570559011140">"Nėra įrenginio kaip modemo naudojimo interneto ryšio"</string>
- <string name="no_upstream_notification_message" msgid="6508394877641864863">"Nepavyko susieti įrenginių"</string>
- <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Išjungti įrenginio kaip modemo naudojimą"</string>
- <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"Įjungtas viešosios interneto prieigos taškas arba įrenginio kaip modemo naudojimas"</string>
- <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"Veikiant tarptinkliniam ryšiui gali būti taikomi papildomi mokesčiai"</string>
+ <string name="no_upstream_notification_title" msgid="5897815458155858594">"Nėra įrenginio kaip modemo naudojimo interneto ryšio"</string>
+ <string name="no_upstream_notification_message" msgid="9037716118606459874">"Nepavyko susieti įrenginių"</string>
+ <string name="no_upstream_notification_disable_button" msgid="5284024068281565456">"Išjungti įrenginio kaip modemo naudojimą"</string>
+ <string name="upstream_roaming_notification_title" msgid="186331286017243006">"Įjungtas viešosios interneto prieigos taškas arba įrenginio kaip modemo naudojimas"</string>
+ <string name="upstream_roaming_notification_message" msgid="7692641323940316538">"Veikiant tarptinkliniam ryšiui gali būti taikomi papildomi mokesčiai"</string>
</resources>
diff --git a/Tethering/res/values-mcc311-mnc480-lv/strings.xml b/Tethering/res/values-mcc311-mnc480-lv/strings.xml
index 5cb2f3b..ca54195 100644
--- a/Tethering/res/values-mcc311-mnc480-lv/strings.xml
+++ b/Tethering/res/values-mcc311-mnc480-lv/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="611650570559011140">"Piesaistei nav interneta savienojuma"</string>
- <string name="no_upstream_notification_message" msgid="6508394877641864863">"Nevar savienot ierīces"</string>
- <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Izslēgt piesaisti"</string>
- <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"Ir ieslēgts tīklājs vai piesaiste"</string>
- <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"Viesabonēšanas laikā var tikt piemērota papildu samaksa"</string>
+ <string name="no_upstream_notification_title" msgid="5897815458155858594">"Piesaistei nav interneta savienojuma"</string>
+ <string name="no_upstream_notification_message" msgid="9037716118606459874">"Nevar savienot ierīces"</string>
+ <string name="no_upstream_notification_disable_button" msgid="5284024068281565456">"Izslēgt piesaisti"</string>
+ <string name="upstream_roaming_notification_title" msgid="186331286017243006">"Ir ieslēgts tīklājs vai piesaiste"</string>
+ <string name="upstream_roaming_notification_message" msgid="7692641323940316538">"Viesabonēšanas laikā var tikt piemērota papildu maksa."</string>
</resources>
diff --git a/Tethering/res/values-mcc311-mnc480-mk/strings.xml b/Tethering/res/values-mcc311-mnc480-mk/strings.xml
index 4cbfd88..8c2b8aa 100644
--- a/Tethering/res/values-mcc311-mnc480-mk/strings.xml
+++ b/Tethering/res/values-mcc311-mnc480-mk/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="611650570559011140">"Нема интернет преку мобилен"</string>
- <string name="no_upstream_notification_message" msgid="6508394877641864863">"Уредите не може да се поврзат"</string>
- <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Исклучи интернет преку мобилен"</string>
- <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"Точката на пристап или интернетот преку мобилен е вклучен"</string>
- <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"При роаминг може да се наплатат дополнителни трошоци"</string>
+ <string name="no_upstream_notification_title" msgid="5897815458155858594">"Нема интернет преку мобилен"</string>
+ <string name="no_upstream_notification_message" msgid="9037716118606459874">"Уредите не може да се поврзат"</string>
+ <string name="no_upstream_notification_disable_button" msgid="5284024068281565456">"Исклучи интернет преку мобилен"</string>
+ <string name="upstream_roaming_notification_title" msgid="186331286017243006">"Вклучено: точка на пристап или интернет преку мобилен"</string>
+ <string name="upstream_roaming_notification_message" msgid="7692641323940316538">"При роаминг може да се наплатат дополнителни трошоци"</string>
</resources>
diff --git a/Tethering/res/values-mcc311-mnc480-ml/strings.xml b/Tethering/res/values-mcc311-mnc480-ml/strings.xml
index 9cf4eaf..9a722c5 100644
--- a/Tethering/res/values-mcc311-mnc480-ml/strings.xml
+++ b/Tethering/res/values-mcc311-mnc480-ml/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="611650570559011140">"ടെതറിംഗിന് ഇന്റർനെറ്റ് ഇല്ല"</string>
- <string name="no_upstream_notification_message" msgid="6508394877641864863">"ഉപകരണങ്ങൾ കണക്റ്റ് ചെയ്യാനാവില്ല"</string>
- <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"ടെതറിംഗ് ഓഫാക്കുക"</string>
- <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"ഹോട്ട്സ്പോട്ട് അല്ലെങ്കിൽ ടെതറിംഗ് ഓണാണ്"</string>
- <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"റോമിംഗ് ചെയ്യുമ്പോൾ അധിക നിരക്കുകൾ ബാധകമായേക്കാം"</string>
+ <string name="no_upstream_notification_title" msgid="5897815458155858594">"ടെതറിംഗിന് ഇന്റർനെറ്റ് ഇല്ല"</string>
+ <string name="no_upstream_notification_message" msgid="9037716118606459874">"ഉപകരണങ്ങൾ കണക്റ്റ് ചെയ്യാനാവില്ല"</string>
+ <string name="no_upstream_notification_disable_button" msgid="5284024068281565456">"ടെതറിംഗ് ഓഫാക്കുക"</string>
+ <string name="upstream_roaming_notification_title" msgid="186331286017243006">"ഹോട്ട്സ്പോട്ട് അല്ലെങ്കിൽ ടെതറിംഗ് ഓണാണ്"</string>
+ <string name="upstream_roaming_notification_message" msgid="7692641323940316538">"റോമിംഗ് ചെയ്യുമ്പോൾ അധിക നിരക്കുകൾ ബാധകമായേക്കാം"</string>
</resources>
diff --git a/Tethering/res/values-mcc311-mnc480-mn/strings.xml b/Tethering/res/values-mcc311-mnc480-mn/strings.xml
index 47c82c1..f6fcf01 100644
--- a/Tethering/res/values-mcc311-mnc480-mn/strings.xml
+++ b/Tethering/res/values-mcc311-mnc480-mn/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="611650570559011140">"Модемд интернэт алга байна"</string>
- <string name="no_upstream_notification_message" msgid="6508394877641864863">"Төхөөрөмжүүд холбогдох боломжгүй байна"</string>
- <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Модем болгохыг унтраах"</string>
- <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"Сүлжээний цэг эсвэл модем болгох асаалттай байна"</string>
- <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"Роумингийн үеэр нэмэлт төлбөр нэхэмжилж болзошгүй"</string>
+ <string name="no_upstream_notification_title" msgid="5897815458155858594">"Модем болгоход ямар ч интернэт байхгүй байна"</string>
+ <string name="no_upstream_notification_message" msgid="9037716118606459874">"Төхөөрөмжүүд холбогдох боломжгүй байна"</string>
+ <string name="no_upstream_notification_disable_button" msgid="5284024068281565456">"Модем болгохыг унтраах"</string>
+ <string name="upstream_roaming_notification_title" msgid="186331286017243006">"Сүлжээний цэг эсвэл модем болгох асаалттай байна"</string>
+ <string name="upstream_roaming_notification_message" msgid="7692641323940316538">"Роумингийн үеэр нэмэлт төлбөр тооцогдож магадгүй"</string>
</resources>
diff --git a/Tethering/res/values-mcc311-mnc480-mr/strings.xml b/Tethering/res/values-mcc311-mnc480-mr/strings.xml
index ad9e809..2563e15 100644
--- a/Tethering/res/values-mcc311-mnc480-mr/strings.xml
+++ b/Tethering/res/values-mcc311-mnc480-mr/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="611650570559011140">"टेदरिंगला इंटरनेट नाही"</string>
- <string name="no_upstream_notification_message" msgid="6508394877641864863">"डिव्हाइस कनेक्ट होऊ शकत नाहीत"</string>
- <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"टेदरिंग बंद करा"</string>
- <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"हॉटस्पॉट किंवा टेदरिंग सुरू आहे"</string>
- <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"रोमिंगदरम्यान अतिरिक्त शुल्क लागू होऊ शकतात"</string>
+ <string name="no_upstream_notification_title" msgid="5897815458155858594">"टेदरिंगसाठी इंटरनेट नाही"</string>
+ <string name="no_upstream_notification_message" msgid="9037716118606459874">"डिव्हाइस कनेक्ट होऊ शकत नाहीत"</string>
+ <string name="no_upstream_notification_disable_button" msgid="5284024068281565456">"टेदरिंग बंद करा"</string>
+ <string name="upstream_roaming_notification_title" msgid="186331286017243006">"हॉटस्पॉट किंवा टेदरिंग सुरू आहे"</string>
+ <string name="upstream_roaming_notification_message" msgid="7692641323940316538">"रोमिंगदरम्यान अतिरिक्त शुल्के लागू होऊ शकतात"</string>
</resources>
diff --git a/Tethering/res/values-mcc311-mnc480-ms/strings.xml b/Tethering/res/values-mcc311-mnc480-ms/strings.xml
index e708cb8..b2ccbbb 100644
--- a/Tethering/res/values-mcc311-mnc480-ms/strings.xml
+++ b/Tethering/res/values-mcc311-mnc480-ms/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="611650570559011140">"Penambatan tiada Internet"</string>
- <string name="no_upstream_notification_message" msgid="6508394877641864863">"Peranti tidak dapat disambungkan"</string>
- <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Matikan penambatan"</string>
- <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"Tempat liputan atau penambatan dihidupkan"</string>
- <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"Caj tambahan mungkin digunakan semasa perayauan"</string>
+ <string name="no_upstream_notification_title" msgid="5897815458155858594">"Penambatan tiada Internet"</string>
+ <string name="no_upstream_notification_message" msgid="9037716118606459874">"Peranti tidak dapat disambungkan"</string>
+ <string name="no_upstream_notification_disable_button" msgid="5284024068281565456">"Matikan penambatan"</string>
+ <string name="upstream_roaming_notification_title" msgid="186331286017243006">"Tempat liputan atau penambatan dihidupkan"</string>
+ <string name="upstream_roaming_notification_message" msgid="7692641323940316538">"Caj tambahan boleh dikenakan semasa perayauan"</string>
</resources>
diff --git a/Tethering/res/values-mcc311-mnc480-my/strings.xml b/Tethering/res/values-mcc311-mnc480-my/strings.xml
index ba54622..2281b7b 100644
--- a/Tethering/res/values-mcc311-mnc480-my/strings.xml
+++ b/Tethering/res/values-mcc311-mnc480-my/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="611650570559011140">"မိုဘိုင်းဖုန်းသုံး ချိတ်ဆက်မျှဝေခြင်းတွင် အင်တာနက် မရှိပါ"</string>
- <string name="no_upstream_notification_message" msgid="6508394877641864863">"စက်များ ချိတ်ဆက်၍ မရပါ"</string>
- <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"မိုဘိုင်းဖုန်းသုံး ချိတ်ဆက်မျှဝေခြင်း ပိတ်ရန်"</string>
- <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"ဟော့စပေါ့ (သို့) မိုဘိုင်းဖုန်းသုံး ချိတ်ဆက်မျှဝေခြင်း ဖွင့်ထားသည်"</string>
- <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"ပြင်ပကွန်ရက်နှင့် ချိတ်ဆက်သည့်အခါ နောက်ထပ်ကျသင့်မှုများ ရှိနိုင်သည်"</string>
+ <string name="no_upstream_notification_title" msgid="5897815458155858594">"မိုဘိုင်းသုံး၍ ချိတ်ဆက်ခြင်းတွင် အင်တာနက် မရှိပါ"</string>
+ <string name="no_upstream_notification_message" msgid="9037716118606459874">"စက်ပစ္စည်းများကို ချိတ်ဆက်၍မရပါ"</string>
+ <string name="no_upstream_notification_disable_button" msgid="5284024068281565456">"မိုဘိုင်းသုံး၍ ချိတ်ဆက်ခြင်း ပိတ်ရန်"</string>
+ <string name="upstream_roaming_notification_title" msgid="186331286017243006">"ဟော့စပေါ့ (သို့) မိုဘိုင်းသုံး၍ ချိတ်ဆက်ခြင်း ဖွင့်ထားသည်"</string>
+ <string name="upstream_roaming_notification_message" msgid="7692641323940316538">"ပြင်ပကွန်ရက်သုံးနေစဉ် နောက်ထပ်ကျသင့်ငွေ ပေးရနိုင်သည်"</string>
</resources>
diff --git a/Tethering/res/values-mcc311-mnc480-nb/strings.xml b/Tethering/res/values-mcc311-mnc480-nb/strings.xml
index 57db484..92e6300 100644
--- a/Tethering/res/values-mcc311-mnc480-nb/strings.xml
+++ b/Tethering/res/values-mcc311-mnc480-nb/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="611650570559011140">"Internettdeling har ikke internettilgang"</string>
- <string name="no_upstream_notification_message" msgid="6508394877641864863">"Enhetene kan ikke koble til"</string>
- <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Slå av internettdeling"</string>
- <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"Wi-Fi-sone eller internettdeling er på"</string>
- <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"Ytterligere kostnader kan påløpe under roaming"</string>
+ <string name="no_upstream_notification_title" msgid="5897815458155858594">"Internettdeling har ikke internettilgang"</string>
+ <string name="no_upstream_notification_message" msgid="9037716118606459874">"Enheter kan ikke koble til"</string>
+ <string name="no_upstream_notification_disable_button" msgid="5284024068281565456">"Slå av internettdeling"</string>
+ <string name="upstream_roaming_notification_title" msgid="186331286017243006">"Wifi-sone eller internettdeling er på"</string>
+ <string name="upstream_roaming_notification_message" msgid="7692641323940316538">"Det kan påløpe flere kostnader ved roaming"</string>
</resources>
diff --git a/Tethering/res/values-mcc311-mnc480-ne/strings.xml b/Tethering/res/values-mcc311-mnc480-ne/strings.xml
index 1503244..bfd6108 100644
--- a/Tethering/res/values-mcc311-mnc480-ne/strings.xml
+++ b/Tethering/res/values-mcc311-mnc480-ne/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="611650570559011140">"टेदरिङमार्फत इन्टरनेट कनेक्सन प्राप्त हुन सकेन"</string>
- <string name="no_upstream_notification_message" msgid="6508394877641864863">"यन्त्रहरू कनेक्ट गर्न सकिएन"</string>
- <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"टेदरिङ निष्क्रिय पार्नुहोस्"</string>
- <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"हटस्पट वा टेदरिङ सक्रिय छ"</string>
- <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"रोमिङ सेवा प्रयोग गर्दा अतिरिक्त शुल्क लाग्न सक्छ"</string>
+ <string name="no_upstream_notification_title" msgid="5897815458155858594">"टेदरिङमार्फत इन्टरनेट कनेक्ट गर्न सकिएन"</string>
+ <string name="no_upstream_notification_message" msgid="9037716118606459874">"डिभाइसहरू कनेक्ट गर्न सकिएन"</string>
+ <string name="no_upstream_notification_disable_button" msgid="5284024068281565456">"टेदरिङ अफ गर्नुहोस्"</string>
+ <string name="upstream_roaming_notification_title" msgid="186331286017243006">"हटस्पट वा टेदरिङ अन छ"</string>
+ <string name="upstream_roaming_notification_message" msgid="7692641323940316538">"रोमिङ सेवा प्रयोग गर्दा अतिरिक्त शुल्क लाग्न सक्छ"</string>
</resources>
diff --git a/Tethering/res/values-mcc311-mnc480-nl/strings.xml b/Tethering/res/values-mcc311-mnc480-nl/strings.xml
index b08133f..7533b6f 100644
--- a/Tethering/res/values-mcc311-mnc480-nl/strings.xml
+++ b/Tethering/res/values-mcc311-mnc480-nl/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="611650570559011140">"Tethering heeft geen internet"</string>
- <string name="no_upstream_notification_message" msgid="6508394877641864863">"Apparaten kunnen niet worden verbonden"</string>
- <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Tethering uitschakelen"</string>
- <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"Hotspot of tethering is ingeschakeld"</string>
- <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"Er kunnen extra kosten voor roaming in rekening worden gebracht."</string>
+ <string name="no_upstream_notification_title" msgid="5897815458155858594">"Tethering heeft geen internet"</string>
+ <string name="no_upstream_notification_message" msgid="9037716118606459874">"Apparaten kunnen geen verbinding maken"</string>
+ <string name="no_upstream_notification_disable_button" msgid="5284024068281565456">"Tethering uitzetten"</string>
+ <string name="upstream_roaming_notification_title" msgid="186331286017243006">"Hotspot of tethering staat aan"</string>
+ <string name="upstream_roaming_notification_message" msgid="7692641323940316538">"Er kunnen extra kosten voor roaming in rekening worden gebracht"</string>
</resources>
diff --git a/Tethering/res/values-mcc311-mnc480-or/strings.xml b/Tethering/res/values-mcc311-mnc480-or/strings.xml
index 1ad4ca3..7324de1 100644
--- a/Tethering/res/values-mcc311-mnc480-or/strings.xml
+++ b/Tethering/res/values-mcc311-mnc480-or/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="611650570559011140">"ଟିଥରିଂ ପାଇଁ କୌଣସି ଇଣ୍ଟର୍ନେଟ୍ ସଂଯୋଗ ନାହିଁ"</string>
- <string name="no_upstream_notification_message" msgid="6508394877641864863">"ଡିଭାଇସଗୁଡ଼ିକ ସଂଯୋଗ କରାଯାଇପାରିବ ନାହିଁ"</string>
- <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"ଟିଥରିଂ ବନ୍ଦ କରନ୍ତୁ"</string>
- <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"ହଟସ୍ପଟ୍ କିମ୍ବା ଟିଥରିଂ ଚାଲୁ ଅଛି"</string>
- <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"ରୋମିଂରେ ଥିବା ସମୟରେ ଅତିରିକ୍ତ ଶୁଳ୍କ ଲାଗୁ ହୋଇପାରେ"</string>
+ <string name="no_upstream_notification_title" msgid="5897815458155858594">"ଟିଥରିଂ ପାଇଁ କୌଣସି ଇଣ୍ଟରନେଟ କନେକ୍ସନ ନାହିଁ"</string>
+ <string name="no_upstream_notification_message" msgid="9037716118606459874">"ଡିଭାଇସଗୁଡ଼ିକୁ କନେକ୍ଟ କରାଯାଇପାରିବ ନାହିଁ"</string>
+ <string name="no_upstream_notification_disable_button" msgid="5284024068281565456">"ଟିଥରିଂକୁ ବନ୍ଦ କରନ୍ତୁ"</string>
+ <string name="upstream_roaming_notification_title" msgid="186331286017243006">"ହଟସ୍ପଟ କିମ୍ବା ଟିଥରିଂ ଚାଲୁ ଅଛି"</string>
+ <string name="upstream_roaming_notification_message" msgid="7692641323940316538">"ରୋମିଂ ସମୟରେ ଅତିରିକ୍ତ ଚାର୍ଜ ଲାଗୁ ହୋଇପାରେ"</string>
</resources>
diff --git a/Tethering/res/values-mcc311-mnc480-pa/strings.xml b/Tethering/res/values-mcc311-mnc480-pa/strings.xml
index 88def56..0ca0af5 100644
--- a/Tethering/res/values-mcc311-mnc480-pa/strings.xml
+++ b/Tethering/res/values-mcc311-mnc480-pa/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="611650570559011140">"ਟੈਦਰਿੰਗ ਕੋਲ ਇੰਟਰਨੈੱਟ ਪਹੁੰਚ ਨਹੀਂ ਹੈ"</string>
- <string name="no_upstream_notification_message" msgid="6508394877641864863">"ਡੀਵਾਈਸ ਕਨੈਕਟ ਨਹੀਂ ਕੀਤੇ ਜਾ ਸਕਦੇ"</string>
- <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"ਟੈਦਰਿੰਗ ਬੰਦ ਕਰੋ"</string>
- <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"ਹੌਟਸਪੌਟ ਜਾਂ ਟੈਦਰਿੰਗ ਚਾਲੂ ਹੈ"</string>
- <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"ਰੋਮਿੰਗ ਦੌਰਾਨ ਵਧੀਕ ਖਰਚੇ ਲਾਗੂ ਹੋ ਸਕਦੇ ਹਨ"</string>
+ <string name="no_upstream_notification_title" msgid="5897815458155858594">"ਟੈਦਰਿੰਗ ਕੋਲ ਇੰਟਰਨੈੱਟ ਪਹੁੰਚ ਨਹੀਂ ਹੈ"</string>
+ <string name="no_upstream_notification_message" msgid="9037716118606459874">"ਡੀਵਾਈਸ ਕਨੈਕਟ ਨਹੀਂ ਕੀਤੇ ਜਾ ਸਕਦੇ"</string>
+ <string name="no_upstream_notification_disable_button" msgid="5284024068281565456">"ਟੈਦਰਿੰਗ ਬੰਦ ਕਰੋ"</string>
+ <string name="upstream_roaming_notification_title" msgid="186331286017243006">"ਹੌਟਸਪੌਟ ਜਾਂ ਟੈਦਰਿੰਗ ਚਾਲੂ ਹੈ"</string>
+ <string name="upstream_roaming_notification_message" msgid="7692641323940316538">"ਰੋਮਿੰਗ ਦੌਰਾਨ ਵਧੀਕ ਖਰਚੇ ਲਾਗੂ ਹੋ ਸਕਦੇ ਹਨ"</string>
</resources>
diff --git a/Tethering/res/values-mcc311-mnc480-pl/strings.xml b/Tethering/res/values-mcc311-mnc480-pl/strings.xml
index f9890ab..62bb68c 100644
--- a/Tethering/res/values-mcc311-mnc480-pl/strings.xml
+++ b/Tethering/res/values-mcc311-mnc480-pl/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="611650570559011140">"Tethering nie ma internetu"</string>
- <string name="no_upstream_notification_message" msgid="6508394877641864863">"Urządzenia nie mogą się połączyć"</string>
- <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Wyłącz tethering"</string>
- <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"Hotspot lub tethering jest włączony"</string>
- <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"Podczas korzystania z roamingu mogą zostać naliczone dodatkowe opłaty"</string>
+ <string name="no_upstream_notification_title" msgid="5897815458155858594">"Tethering nie ma internetu"</string>
+ <string name="no_upstream_notification_message" msgid="9037716118606459874">"Urządzenia nie mogą się połączyć"</string>
+ <string name="no_upstream_notification_disable_button" msgid="5284024068281565456">"Wyłącz tethering"</string>
+ <string name="upstream_roaming_notification_title" msgid="186331286017243006">"Hotspot lub tethering jest włączony"</string>
+ <string name="upstream_roaming_notification_message" msgid="7692641323940316538">"Podczas korzystania z roamingu mogą zostać naliczone dodatkowe opłaty"</string>
</resources>
diff --git a/Tethering/res/values-mcc311-mnc480-pt-rBR/strings.xml b/Tethering/res/values-mcc311-mnc480-pt-rBR/strings.xml
index ce3b884..ae033fa 100644
--- a/Tethering/res/values-mcc311-mnc480-pt-rBR/strings.xml
+++ b/Tethering/res/values-mcc311-mnc480-pt-rBR/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="611650570559011140">"O tethering não tem Internet"</string>
- <string name="no_upstream_notification_message" msgid="6508394877641864863">"Não é possível conectar os dispositivos"</string>
- <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Desativar o tethering"</string>
- <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"Ponto de acesso ou tethering ativado"</string>
- <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"Pode haver cobranças extras durante o roaming"</string>
+ <string name="no_upstream_notification_title" msgid="5897815458155858594">"O tethering não tem uma conexão de Internet"</string>
+ <string name="no_upstream_notification_message" msgid="9037716118606459874">"Não é possível conectar os dispositivos"</string>
+ <string name="no_upstream_notification_disable_button" msgid="5284024068281565456">"Desativar o tethering"</string>
+ <string name="upstream_roaming_notification_title" msgid="186331286017243006">"O ponto de acesso ou tethering está ativado"</string>
+ <string name="upstream_roaming_notification_message" msgid="7692641323940316538">"Pode haver cobranças extras durante o roaming"</string>
</resources>
diff --git a/Tethering/res/values-mcc311-mnc480-pt-rPT/strings.xml b/Tethering/res/values-mcc311-mnc480-pt-rPT/strings.xml
index 7e883ea..c544864 100644
--- a/Tethering/res/values-mcc311-mnc480-pt-rPT/strings.xml
+++ b/Tethering/res/values-mcc311-mnc480-pt-rPT/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="611650570559011140">"A ligação (à Internet) via telemóvel não tem Internet"</string>
- <string name="no_upstream_notification_message" msgid="6508394877641864863">"Não é possível ligar os dispositivos"</string>
- <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Desativar ligação (à Internet) via telemóvel"</string>
- <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"A zona Wi-Fi ou a ligação (à Internet) via telemóvel está ativada"</string>
- <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"Podem aplicar-se custos adicionais em roaming."</string>
+ <string name="no_upstream_notification_title" msgid="5897815458155858594">"A ligação (à Internet) via telemóvel não tem Internet"</string>
+ <string name="no_upstream_notification_message" msgid="9037716118606459874">"Não é possível ligar os dispositivos"</string>
+ <string name="no_upstream_notification_disable_button" msgid="5284024068281565456">"Desativar ligação (à Internet) via telemóvel"</string>
+ <string name="upstream_roaming_notification_title" msgid="186331286017243006">"A zona Wi-Fi ou a ligação (à Internet) via telemóvel está ativada"</string>
+ <string name="upstream_roaming_notification_message" msgid="7692641323940316538">"Podem aplicar-se custos adicionais em roaming"</string>
</resources>
diff --git a/Tethering/res/values-mcc311-mnc480-pt/strings.xml b/Tethering/res/values-mcc311-mnc480-pt/strings.xml
index ce3b884..ae033fa 100644
--- a/Tethering/res/values-mcc311-mnc480-pt/strings.xml
+++ b/Tethering/res/values-mcc311-mnc480-pt/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="611650570559011140">"O tethering não tem Internet"</string>
- <string name="no_upstream_notification_message" msgid="6508394877641864863">"Não é possível conectar os dispositivos"</string>
- <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Desativar o tethering"</string>
- <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"Ponto de acesso ou tethering ativado"</string>
- <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"Pode haver cobranças extras durante o roaming"</string>
+ <string name="no_upstream_notification_title" msgid="5897815458155858594">"O tethering não tem uma conexão de Internet"</string>
+ <string name="no_upstream_notification_message" msgid="9037716118606459874">"Não é possível conectar os dispositivos"</string>
+ <string name="no_upstream_notification_disable_button" msgid="5284024068281565456">"Desativar o tethering"</string>
+ <string name="upstream_roaming_notification_title" msgid="186331286017243006">"O ponto de acesso ou tethering está ativado"</string>
+ <string name="upstream_roaming_notification_message" msgid="7692641323940316538">"Pode haver cobranças extras durante o roaming"</string>
</resources>
diff --git a/Tethering/res/values-mcc311-mnc480-ro/strings.xml b/Tethering/res/values-mcc311-mnc480-ro/strings.xml
index 1009417..484b8b3 100644
--- a/Tethering/res/values-mcc311-mnc480-ro/strings.xml
+++ b/Tethering/res/values-mcc311-mnc480-ro/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="611650570559011140">"Procesul de tethering nu are internet"</string>
- <string name="no_upstream_notification_message" msgid="6508394877641864863">"Dispozitivele nu se pot conecta"</string>
- <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Dezactivați procesul de tethering"</string>
- <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"S-a activat hotspotul sau tethering"</string>
- <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"Se pot aplica taxe suplimentare pentru roaming"</string>
+ <string name="no_upstream_notification_title" msgid="5897815458155858594">"Procesul de tethering nu are internet"</string>
+ <string name="no_upstream_notification_message" msgid="9037716118606459874">"Dispozitivele nu se pot conecta"</string>
+ <string name="no_upstream_notification_disable_button" msgid="5284024068281565456">"Dezactivează tetheringul"</string>
+ <string name="upstream_roaming_notification_title" msgid="186331286017243006">"S-a activat hotspotul sau tetheringul"</string>
+ <string name="upstream_roaming_notification_message" msgid="7692641323940316538">"Se pot aplica taxe suplimentare pentru roaming"</string>
</resources>
diff --git a/Tethering/res/values-mcc311-mnc480-ru/strings.xml b/Tethering/res/values-mcc311-mnc480-ru/strings.xml
index 88683be..ef38703 100644
--- a/Tethering/res/values-mcc311-mnc480-ru/strings.xml
+++ b/Tethering/res/values-mcc311-mnc480-ru/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="611650570559011140">"Режим модема используется без доступа к Интернету"</string>
- <string name="no_upstream_notification_message" msgid="6508394877641864863">"Невозможно подключить устройства."</string>
- <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Отключить режим модема"</string>
- <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"Включены точка доступа или режим модема"</string>
- <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"За использование услуг связи в роуминге может взиматься дополнительная плата."</string>
+ <string name="no_upstream_notification_title" msgid="5897815458155858594">"Режим модема используется без доступа к интернету"</string>
+ <string name="no_upstream_notification_message" msgid="9037716118606459874">"Невозможно подключить устройства."</string>
+ <string name="no_upstream_notification_disable_button" msgid="5284024068281565456">"Отключить режим модема"</string>
+ <string name="upstream_roaming_notification_title" msgid="186331286017243006">"Включена точка доступа или режим модема"</string>
+ <string name="upstream_roaming_notification_message" msgid="7692641323940316538">"За использование услуг связи в роуминге может взиматься дополнительная плата."</string>
</resources>
diff --git a/Tethering/res/values-mcc311-mnc480-si/strings.xml b/Tethering/res/values-mcc311-mnc480-si/strings.xml
index 176bcdb..3069085 100644
--- a/Tethering/res/values-mcc311-mnc480-si/strings.xml
+++ b/Tethering/res/values-mcc311-mnc480-si/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="611650570559011140">"ටෙදරින් හට අන්තර්ජාලය නැත"</string>
- <string name="no_upstream_notification_message" msgid="6508394877641864863">"උපාංගවලට සම්බන්ධ විය නොහැකිය"</string>
- <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"ටෙදරින් ක්රියාවිරහිත කරන්න"</string>
- <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"හොට්ස්පොට් හෝ ටෙදරින් ක්රියාත්මකයි"</string>
- <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"රෝමිං අතරතුර අමතර ගාස්තු අදාළ විය හැකිය"</string>
+ <string name="no_upstream_notification_title" msgid="5897815458155858594">"ටෙදරින් හට අන්තර්ජාලය නැත"</string>
+ <string name="no_upstream_notification_message" msgid="9037716118606459874">"උපාංගවලට සම්බන්ධ විය නොහැක"</string>
+ <string name="no_upstream_notification_disable_button" msgid="5284024068281565456">"ටෙදරින් ක්රියාවිරහිත කරන්න"</string>
+ <string name="upstream_roaming_notification_title" msgid="186331286017243006">"හොට්ස්පොට් හෝ ටෙදරින් ක්රියාත්මකයි"</string>
+ <string name="upstream_roaming_notification_message" msgid="7692641323940316538">"රෝමිං අතරේ අතිරේක ගාස්තු අදාළ විය හැක"</string>
</resources>
diff --git a/Tethering/res/values-mcc311-mnc480-sk/strings.xml b/Tethering/res/values-mcc311-mnc480-sk/strings.xml
index b9e2127..9f70311 100644
--- a/Tethering/res/values-mcc311-mnc480-sk/strings.xml
+++ b/Tethering/res/values-mcc311-mnc480-sk/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="611650570559011140">"Tethering nemá internetové pripojenie"</string>
- <string name="no_upstream_notification_message" msgid="6508394877641864863">"Zariadenia sa nemôžu pripojiť"</string>
- <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Vypnúť tethering"</string>
- <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"Je zapnutý hotspot alebo tethering"</string>
- <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"Počas roamingu vám môžu byť účtované ďalšie poplatky"</string>
+ <string name="no_upstream_notification_title" msgid="5897815458155858594">"Tethering nemá internetové pripojenie"</string>
+ <string name="no_upstream_notification_message" msgid="9037716118606459874">"Zariadenia sa nemôžu pripojiť"</string>
+ <string name="no_upstream_notification_disable_button" msgid="5284024068281565456">"Vypnúť tethering"</string>
+ <string name="upstream_roaming_notification_title" msgid="186331286017243006">"Je zapnutý hotspot alebo tethering"</string>
+ <string name="upstream_roaming_notification_message" msgid="7692641323940316538">"Počas roamingu vám môžu byť účtované ďalšie poplatky"</string>
</resources>
diff --git a/Tethering/res/values-mcc311-mnc480-sl/strings.xml b/Tethering/res/values-mcc311-mnc480-sl/strings.xml
index e8140e6..613d7a8 100644
--- a/Tethering/res/values-mcc311-mnc480-sl/strings.xml
+++ b/Tethering/res/values-mcc311-mnc480-sl/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="611650570559011140">"Internetna povezava prek mobilnega telefona ni vzpostavljena"</string>
- <string name="no_upstream_notification_message" msgid="6508394877641864863">"Napravi se ne moreta povezati"</string>
- <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Izklopi internetno povezavo prek mobilnega telefona"</string>
- <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"Dostopna točka ali internetna povezava prek mobilnega telefona je vklopljena"</string>
- <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"Med gostovanjem lahko nastanejo dodatni stroški"</string>
+ <string name="no_upstream_notification_title" msgid="5897815458155858594">"Povezava računalnika z internetom prek mobilnega telefona nima internetne povezave"</string>
+ <string name="no_upstream_notification_message" msgid="9037716118606459874">"Napravi se ne moreta povezati"</string>
+ <string name="no_upstream_notification_disable_button" msgid="5284024068281565456">"Izklopi povezavo računalnika z internetom prek mobilnega telefona"</string>
+ <string name="upstream_roaming_notification_title" msgid="186331286017243006">"Dostopna točka ali povezava računalnika z internetom prek mobilnega telefona je vklopljena"</string>
+ <string name="upstream_roaming_notification_message" msgid="7692641323940316538">"Med gostovanjem lahko nastanejo dodatni stroški."</string>
</resources>
diff --git a/Tethering/res/values-mcc311-mnc480-sq/strings.xml b/Tethering/res/values-mcc311-mnc480-sq/strings.xml
index 61e698d..0472d4d 100644
--- a/Tethering/res/values-mcc311-mnc480-sq/strings.xml
+++ b/Tethering/res/values-mcc311-mnc480-sq/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="611650570559011140">"Ndarja e internetit nuk ka internet"</string>
- <string name="no_upstream_notification_message" msgid="6508394877641864863">"Pajisjet nuk mund të lidhen"</string>
- <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Çaktivizo ndarjen e internetit"</string>
- <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"Zona e qasjes për internet ose ndarja e internetit është aktive"</string>
- <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"Mund të zbatohen tarifime shtesë kur je në roaming"</string>
+ <string name="no_upstream_notification_title" msgid="5897815458155858594">"Ndarja e internetit nuk ka internet"</string>
+ <string name="no_upstream_notification_message" msgid="9037716118606459874">"Pajisjet nuk mund të lidhen"</string>
+ <string name="no_upstream_notification_disable_button" msgid="5284024068281565456">"Çaktivizo ndarjen e internetit"</string>
+ <string name="upstream_roaming_notification_title" msgid="186331286017243006">"Zona e qasjes për internet ose ndarja e internetit është aktive"</string>
+ <string name="upstream_roaming_notification_message" msgid="7692641323940316538">"Mund të zbatohen tarifime shtesë kur je në roaming"</string>
</resources>
diff --git a/Tethering/res/values-mcc311-mnc480-sr/strings.xml b/Tethering/res/values-mcc311-mnc480-sr/strings.xml
index b4c411c..bc70cf6 100644
--- a/Tethering/res/values-mcc311-mnc480-sr/strings.xml
+++ b/Tethering/res/values-mcc311-mnc480-sr/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="611650570559011140">"Привезивање нема приступ интернету"</string>
- <string name="no_upstream_notification_message" msgid="6508394877641864863">"Повезивање уређаја није успело"</string>
- <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Искључи привезивање"</string>
- <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"Укључен је хотспот или привезивање"</string>
- <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"Можда важе додатни трошкови у ромингу"</string>
+ <string name="no_upstream_notification_title" msgid="5897815458155858594">"Привезивање нема приступ интернету"</string>
+ <string name="no_upstream_notification_message" msgid="9037716118606459874">"Повезивање уређаја није успело"</string>
+ <string name="no_upstream_notification_disable_button" msgid="5284024068281565456">"Искључи привезивање"</string>
+ <string name="upstream_roaming_notification_title" msgid="186331286017243006">"Укључен је хотспот или привезивање"</string>
+ <string name="upstream_roaming_notification_message" msgid="7692641323940316538">"Можда важе додатни трошкови у ромингу"</string>
</resources>
diff --git a/Tethering/res/values-mcc311-mnc480-sv/strings.xml b/Tethering/res/values-mcc311-mnc480-sv/strings.xml
index 4f543e4..507acc8 100644
--- a/Tethering/res/values-mcc311-mnc480-sv/strings.xml
+++ b/Tethering/res/values-mcc311-mnc480-sv/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="611650570559011140">"Det finns ingen internetanslutning för internetdelningen"</string>
- <string name="no_upstream_notification_message" msgid="6508394877641864863">"Enheterna kan inte anslutas"</string>
- <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Inaktivera internetdelning"</string>
- <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"Surfzon eller internetdelning har aktiverats"</string>
- <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"Ytterligare avgifter kan tillkomma vid roaming"</string>
+ <string name="no_upstream_notification_title" msgid="5897815458155858594">"Det finns ingen internetanslutning för internetdelningen"</string>
+ <string name="no_upstream_notification_message" msgid="9037716118606459874">"Enheterna kan inte anslutas"</string>
+ <string name="no_upstream_notification_disable_button" msgid="5284024068281565456">"Inaktivera internetdelning"</string>
+ <string name="upstream_roaming_notification_title" msgid="186331286017243006">"Surfzon eller internetdelning har aktiverats"</string>
+ <string name="upstream_roaming_notification_message" msgid="7692641323940316538">"Ytterligare avgifter kan tillkomma vid roaming"</string>
</resources>
diff --git a/Tethering/res/values-mcc311-mnc480-sw/strings.xml b/Tethering/res/values-mcc311-mnc480-sw/strings.xml
index ac347ab..865b0e3 100644
--- a/Tethering/res/values-mcc311-mnc480-sw/strings.xml
+++ b/Tethering/res/values-mcc311-mnc480-sw/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="611650570559011140">"Kipengele cha kusambaza mtandao hakina intaneti"</string>
- <string name="no_upstream_notification_message" msgid="6508394877641864863">"Imeshindwa kuunganisha vifaa"</string>
- <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Zima kipengele cha kusambaza mtandao"</string>
- <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"Umewasha kipengele cha kusambaza mtandao au mtandao pepe"</string>
- <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"Huenda ukatozwa gharama za ziada ukitumia mitandao ya ng\'ambo"</string>
+ <string name="no_upstream_notification_title" msgid="5897815458155858594">"Huduma ya kusambaza mtandao haina muunganisho wa intaneti"</string>
+ <string name="no_upstream_notification_message" msgid="9037716118606459874">"Imeshindwa kuunganisha vifaa"</string>
+ <string name="no_upstream_notification_disable_button" msgid="5284024068281565456">"Zima kipengele cha kusambaza mtandao"</string>
+ <string name="upstream_roaming_notification_title" msgid="186331286017243006">"Umewasha kipengele cha kusambaza mtandao au mtandao pepe"</string>
+ <string name="upstream_roaming_notification_message" msgid="7692641323940316538">"Huenda ukatozwa gharama za ziada ukitumia mitandao ya ng\'ambo"</string>
</resources>
diff --git a/Tethering/res/values-mcc311-mnc480-ta/strings.xml b/Tethering/res/values-mcc311-mnc480-ta/strings.xml
index 2ea2467..e5f33ee 100644
--- a/Tethering/res/values-mcc311-mnc480-ta/strings.xml
+++ b/Tethering/res/values-mcc311-mnc480-ta/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="611650570559011140">"இணைப்பு முறைக்கு இணைய இணைப்பு இல்லை"</string>
- <string name="no_upstream_notification_message" msgid="6508394877641864863">"சாதனங்களால் இணைய முடியவில்லை"</string>
- <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"இணைப்பு முறையை ஆஃப் செய்"</string>
- <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"ஹாட்ஸ்பாட் அல்லது இணைப்பு முறை ஆன் செய்யப்பட்டுள்ளது"</string>
- <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"ரோமிங்கின்போது கூடுதல் கட்டணங்கள் விதிக்கப்படக்கூடும்"</string>
+ <string name="no_upstream_notification_title" msgid="5897815458155858594">"இணைப்பு முறைக்கு இணைய இணைப்பு இல்லை"</string>
+ <string name="no_upstream_notification_message" msgid="9037716118606459874">"சாதனங்களால் இணைய முடியவில்லை"</string>
+ <string name="no_upstream_notification_disable_button" msgid="5284024068281565456">"இணைப்பு முறையை முடக்கு"</string>
+ <string name="upstream_roaming_notification_title" msgid="186331286017243006">"ஹாட்ஸ்பாட் அல்லது இணைப்பு முறை இயக்கப்பட்டுள்ளது"</string>
+ <string name="upstream_roaming_notification_message" msgid="7692641323940316538">"ரோமிங்கின்போது கூடுதல் கட்டணங்கள் விதிக்கப்படலாம்"</string>
</resources>
diff --git a/Tethering/res/values-mcc311-mnc480-te/strings.xml b/Tethering/res/values-mcc311-mnc480-te/strings.xml
index 9360297..1bb4786 100644
--- a/Tethering/res/values-mcc311-mnc480-te/strings.xml
+++ b/Tethering/res/values-mcc311-mnc480-te/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="611650570559011140">"టెథరింగ్ చేయడానికి ఇంటర్నెట్ కనెక్షన్ లేదు"</string>
- <string name="no_upstream_notification_message" msgid="6508394877641864863">"పరికరాలు కనెక్ట్ అవ్వడం లేదు"</string>
- <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"టెథరింగ్ను ఆఫ్ చేయండి"</string>
- <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"హాట్స్పాట్ లేదా టెథరింగ్ ఆన్లో ఉంది"</string>
- <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"రోమింగ్లో ఉన్నప్పుడు అదనపు ఛార్జీలు వర్తించవచ్చు"</string>
+ <string name="no_upstream_notification_title" msgid="5897815458155858594">"టెథరింగ్ చేయడానికి ఇంటర్నెట్ కనెక్షన్ లేదు"</string>
+ <string name="no_upstream_notification_message" msgid="9037716118606459874">"పరికరాలు కనెక్ట్ అవ్వడం లేదు"</string>
+ <string name="no_upstream_notification_disable_button" msgid="5284024068281565456">"టెథరింగ్ను ఆఫ్ చేయండి"</string>
+ <string name="upstream_roaming_notification_title" msgid="186331286017243006">"హాట్స్పాట్ లేదా టెథరింగ్ ఆన్లో ఉంది"</string>
+ <string name="upstream_roaming_notification_message" msgid="7692641323940316538">"రోమింగ్లో ఉన్నప్పుడు అదనపు ఛార్జీలు వర్తించవచ్చు"</string>
</resources>
diff --git a/Tethering/res/values-mcc311-mnc480-th/strings.xml b/Tethering/res/values-mcc311-mnc480-th/strings.xml
index 9c4d7e0..e76f735 100644
--- a/Tethering/res/values-mcc311-mnc480-th/strings.xml
+++ b/Tethering/res/values-mcc311-mnc480-th/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="611650570559011140">"การเชื่อมต่ออินเทอร์เน็ตผ่านมือถือไม่มีอินเทอร์เน็ต"</string>
- <string name="no_upstream_notification_message" msgid="6508394877641864863">"อุปกรณ์เชื่อมต่อไม่ได้"</string>
- <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"ปิดการเชื่อมต่ออินเทอร์เน็ตผ่านมือถือ"</string>
- <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"ฮอตสปอตหรือการเชื่อมต่ออินเทอร์เน็ตผ่านมือถือเปิดอยู่"</string>
- <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"อาจมีค่าใช้จ่ายเพิ่มเติมขณะโรมมิ่ง"</string>
+ <string name="no_upstream_notification_title" msgid="5897815458155858594">"ไม่มีอินเทอร์เน็ตสำหรับการเชื่อมต่ออินเทอร์เน็ตผ่านมือถือ"</string>
+ <string name="no_upstream_notification_message" msgid="9037716118606459874">"อุปกรณ์เชื่อมต่อไม่ได้"</string>
+ <string name="no_upstream_notification_disable_button" msgid="5284024068281565456">"ปิดการเชื่อมต่ออินเทอร์เน็ตผ่านมือถือ"</string>
+ <string name="upstream_roaming_notification_title" msgid="186331286017243006">"ฮอตสปอตหรือการเชื่อมต่ออินเทอร์เน็ตผ่านมือถือเปิดอยู่"</string>
+ <string name="upstream_roaming_notification_message" msgid="7692641323940316538">"อาจมีค่าใช้จ่ายเพิ่มเติมขณะโรมมิ่ง"</string>
</resources>
diff --git a/Tethering/res/values-mcc311-mnc480-tl/strings.xml b/Tethering/res/values-mcc311-mnc480-tl/strings.xml
index a7c78a5..cccc8c4 100644
--- a/Tethering/res/values-mcc311-mnc480-tl/strings.xml
+++ b/Tethering/res/values-mcc311-mnc480-tl/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="611650570559011140">"Walang internet ang pag-tether"</string>
- <string name="no_upstream_notification_message" msgid="6508394877641864863">"Hindi makakonekta ang mga device"</string>
- <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"I-off ang pag-tether"</string>
- <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"Naka-on ang Hotspot o pag-tether"</string>
- <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"Posibleng magkaroon ng mga karagdagang singil habang nagro-roam"</string>
+ <string name="no_upstream_notification_title" msgid="5897815458155858594">"Walang internet ang pag-tether"</string>
+ <string name="no_upstream_notification_message" msgid="9037716118606459874">"Hindi makakonekta ang mga device"</string>
+ <string name="no_upstream_notification_disable_button" msgid="5284024068281565456">"I-off ang pag-tether"</string>
+ <string name="upstream_roaming_notification_title" msgid="186331286017243006">"Naka-on ang hotspot o pag-tether"</string>
+ <string name="upstream_roaming_notification_message" msgid="7692641323940316538">"Posibleng magkaroon ng mga karagdagang singil habang nagro-roam"</string>
</resources>
diff --git a/Tethering/res/values-mcc311-mnc480-tr/strings.xml b/Tethering/res/values-mcc311-mnc480-tr/strings.xml
index 93da2c3..93bef12 100644
--- a/Tethering/res/values-mcc311-mnc480-tr/strings.xml
+++ b/Tethering/res/values-mcc311-mnc480-tr/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="611650570559011140">"Tethering\'in internet bağlantısı yok"</string>
- <string name="no_upstream_notification_message" msgid="6508394877641864863">"Cihazlar bağlanamıyor"</string>
- <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Tethering\'i kapat"</string>
- <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"Hotspot veya tethering açık"</string>
- <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"Dolaşım sırasında ek ücretler uygulanabilir"</string>
+ <string name="no_upstream_notification_title" msgid="5897815458155858594">"Tethering\'in internet bağlantısı yok"</string>
+ <string name="no_upstream_notification_message" msgid="9037716118606459874">"Cihazlar bağlanamıyor"</string>
+ <string name="no_upstream_notification_disable_button" msgid="5284024068281565456">"Tethering\'i kapat"</string>
+ <string name="upstream_roaming_notification_title" msgid="186331286017243006">"Hotspot veya tethering açık"</string>
+ <string name="upstream_roaming_notification_message" msgid="7692641323940316538">"Dolaşım sırasında ek ücretler uygulanabilir"</string>
</resources>
diff --git a/Tethering/res/values-mcc311-mnc480-uk/strings.xml b/Tethering/res/values-mcc311-mnc480-uk/strings.xml
index ee0dcd2..1bc2c06 100644
--- a/Tethering/res/values-mcc311-mnc480-uk/strings.xml
+++ b/Tethering/res/values-mcc311-mnc480-uk/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="611650570559011140">"Телефон, який використовується як модем, не підключений до Інтернету"</string>
- <string name="no_upstream_notification_message" msgid="6508394877641864863">"Не вдається підключити пристрої"</string>
- <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Вимкнути використання телефона як модема"</string>
- <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"Увімкнено точку доступу або використання телефона як модема"</string>
- <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"У роумінгу може стягуватися додаткова плата"</string>
+ <string name="no_upstream_notification_title" msgid="5897815458155858594">"Телефон, що використовується як модем, не підключений до Інтернету"</string>
+ <string name="no_upstream_notification_message" msgid="9037716118606459874">"Не вдається підключити пристрої"</string>
+ <string name="no_upstream_notification_disable_button" msgid="5284024068281565456">"Вимкнути використання телефона як модема"</string>
+ <string name="upstream_roaming_notification_title" msgid="186331286017243006">"Увімкнено точку доступу або використання телефона як модема"</string>
+ <string name="upstream_roaming_notification_message" msgid="7692641323940316538">"У роумінгу може стягуватися додаткова плата"</string>
</resources>
diff --git a/Tethering/res/values-mcc311-mnc480-ur/strings.xml b/Tethering/res/values-mcc311-mnc480-ur/strings.xml
index 41cd28e..63d8e1b 100644
--- a/Tethering/res/values-mcc311-mnc480-ur/strings.xml
+++ b/Tethering/res/values-mcc311-mnc480-ur/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="611650570559011140">"ٹیدرنگ میں انٹرنیٹ نہیں ہے"</string>
- <string name="no_upstream_notification_message" msgid="6508394877641864863">"آلات منسلک نہیں ہو سکتے"</string>
- <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"ٹیدرنگ آف کریں"</string>
- <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"ہاٹ اسپاٹ یا ٹیدرنگ آن ہے"</string>
- <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"رومنگ کے دوران اضافی چارجز لاگو ہو سکتے ہیں"</string>
+ <string name="no_upstream_notification_title" msgid="5897815458155858594">"ٹیدرنگ میں انٹرنیٹ نہیں ہے"</string>
+ <string name="no_upstream_notification_message" msgid="9037716118606459874">"آلات منسلک نہیں ہو سکتے"</string>
+ <string name="no_upstream_notification_disable_button" msgid="5284024068281565456">"ٹیدرنگ آف کریں"</string>
+ <string name="upstream_roaming_notification_title" msgid="186331286017243006">"ہاٹ اسپاٹ یا ٹیدرنگ آن ہے"</string>
+ <string name="upstream_roaming_notification_message" msgid="7692641323940316538">"رومنگ کے دوران اضافی چارجز لاگو ہو سکتے ہیں"</string>
</resources>
diff --git a/Tethering/res/values-mcc311-mnc480-uz/strings.xml b/Tethering/res/values-mcc311-mnc480-uz/strings.xml
index c847bc9..4d655d9 100644
--- a/Tethering/res/values-mcc311-mnc480-uz/strings.xml
+++ b/Tethering/res/values-mcc311-mnc480-uz/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="611650570559011140">"Modem internetga ulanmagan"</string>
- <string name="no_upstream_notification_message" msgid="6508394877641864863">"Qurilmalar ulanmadi"</string>
- <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Modem rejimini faolsizlantirish"</string>
- <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"Hotspot yoki modem rejimi yoniq"</string>
- <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"Rouming vaqtida qoʻshimcha haq olinishi mumkin"</string>
+ <string name="no_upstream_notification_title" msgid="5897815458155858594">"Modem internetga ulanmagan"</string>
+ <string name="no_upstream_notification_message" msgid="9037716118606459874">"Qurilmalar ulanmadi"</string>
+ <string name="no_upstream_notification_disable_button" msgid="5284024068281565456">"Modem rejimini faolsizlantirish"</string>
+ <string name="upstream_roaming_notification_title" msgid="186331286017243006">"Hotspot yoki modem rejimi yoniq"</string>
+ <string name="upstream_roaming_notification_message" msgid="7692641323940316538">"Rouming vaqtida qoʻshimcha haq olinishi mumkin"</string>
</resources>
diff --git a/Tethering/res/values-mcc311-mnc480-vi/strings.xml b/Tethering/res/values-mcc311-mnc480-vi/strings.xml
index a74326f..15e7a01 100644
--- a/Tethering/res/values-mcc311-mnc480-vi/strings.xml
+++ b/Tethering/res/values-mcc311-mnc480-vi/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="611650570559011140">"Không có Internet để chia sẻ kết Internet"</string>
- <string name="no_upstream_notification_message" msgid="6508394877641864863">"Các thiết bị không thể kết nối"</string>
- <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Tắt tính năng chia sẻ Internet"</string>
- <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"Điểm phát sóng hoặc tính năng chia sẻ Internet đang bật"</string>
- <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"Bạn có thể mất thêm phí dữ liệu khi chuyển vùng"</string>
+ <string name="no_upstream_notification_title" msgid="5897815458155858594">"Không có Internet để chia sẻ Internet"</string>
+ <string name="no_upstream_notification_message" msgid="9037716118606459874">"Các thiết bị không thể kết nối"</string>
+ <string name="no_upstream_notification_disable_button" msgid="5284024068281565456">"Tắt tính năng chia sẻ Internet"</string>
+ <string name="upstream_roaming_notification_title" msgid="186331286017243006">"Điểm phát sóng hoặc tính năng chia sẻ Internet đang bật"</string>
+ <string name="upstream_roaming_notification_message" msgid="7692641323940316538">"Bạn có thể mất thêm phí dữ liệu khi chuyển vùng"</string>
</resources>
diff --git a/Tethering/res/values-mcc311-mnc480-zh-rCN/strings.xml b/Tethering/res/values-mcc311-mnc480-zh-rCN/strings.xml
index d737003..8a200aa 100644
--- a/Tethering/res/values-mcc311-mnc480-zh-rCN/strings.xml
+++ b/Tethering/res/values-mcc311-mnc480-zh-rCN/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="611650570559011140">"共享网络未连接到互联网"</string>
- <string name="no_upstream_notification_message" msgid="6508394877641864863">"设备无法连接"</string>
- <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"关闭网络共享"</string>
- <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"热点或网络共享已开启"</string>
- <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"漫游时可能会产生额外的费用"</string>
+ <string name="no_upstream_notification_title" msgid="5897815458155858594">"共享网络未连接到互联网"</string>
+ <string name="no_upstream_notification_message" msgid="9037716118606459874">"设备无法连接"</string>
+ <string name="no_upstream_notification_disable_button" msgid="5284024068281565456">"关闭网络共享"</string>
+ <string name="upstream_roaming_notification_title" msgid="186331286017243006">"热点或网络共享已开启"</string>
+ <string name="upstream_roaming_notification_message" msgid="7692641323940316538">"漫游时可能会产生额外的费用"</string>
</resources>
diff --git a/Tethering/res/values-mcc311-mnc480-zh-rHK/strings.xml b/Tethering/res/values-mcc311-mnc480-zh-rHK/strings.xml
index f378a9d..b2e64d1 100644
--- a/Tethering/res/values-mcc311-mnc480-zh-rHK/strings.xml
+++ b/Tethering/res/values-mcc311-mnc480-zh-rHK/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="611650570559011140">"無法透過網絡共享連線至互聯網"</string>
- <string name="no_upstream_notification_message" msgid="6508394877641864863">"裝置無法連接"</string>
- <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"關閉網絡共享"</string>
- <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"熱點或網絡共享已開啟"</string>
- <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"漫遊時可能需要支付額外費用"</string>
+ <string name="no_upstream_notification_title" msgid="5897815458155858594">"無法透過網絡共享連線至互聯網"</string>
+ <string name="no_upstream_notification_message" msgid="9037716118606459874">"裝置無法連接"</string>
+ <string name="no_upstream_notification_disable_button" msgid="5284024068281565456">"關閉網絡共享"</string>
+ <string name="upstream_roaming_notification_title" msgid="186331286017243006">"熱點或網絡共享已開啟"</string>
+ <string name="upstream_roaming_notification_message" msgid="7692641323940316538">"漫遊時可能需要支付額外費用"</string>
</resources>
diff --git a/Tethering/res/values-mcc311-mnc480-zh-rTW/strings.xml b/Tethering/res/values-mcc311-mnc480-zh-rTW/strings.xml
index cd653df..0d7ddf2 100644
--- a/Tethering/res/values-mcc311-mnc480-zh-rTW/strings.xml
+++ b/Tethering/res/values-mcc311-mnc480-zh-rTW/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="611650570559011140">"無法透過網路共用連上網際網路"</string>
- <string name="no_upstream_notification_message" msgid="6508394877641864863">"裝置無法連線"</string>
- <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"關閉網路共用"</string>
- <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"無線基地台或網路共用已開啟"</string>
- <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"使用漫遊服務可能須支付額外費用"</string>
+ <string name="no_upstream_notification_title" msgid="5897815458155858594">"無法透過網路共用連上網際網路"</string>
+ <string name="no_upstream_notification_message" msgid="9037716118606459874">"裝置無法連線"</string>
+ <string name="no_upstream_notification_disable_button" msgid="5284024068281565456">"關閉網路共用"</string>
+ <string name="upstream_roaming_notification_title" msgid="186331286017243006">"無線基地台或網路共用已開啟"</string>
+ <string name="upstream_roaming_notification_message" msgid="7692641323940316538">"使用漫遊服務可能須支付額外費用"</string>
</resources>
diff --git a/Tethering/res/values-mcc311-mnc480-zu/strings.xml b/Tethering/res/values-mcc311-mnc480-zu/strings.xml
index 32f6df5..d18f079 100644
--- a/Tethering/res/values-mcc311-mnc480-zu/strings.xml
+++ b/Tethering/res/values-mcc311-mnc480-zu/strings.xml
@@ -16,9 +16,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="no_upstream_notification_title" msgid="611650570559011140">"Ukusebenzisa ifoni njengemodemu akunayo i-inthanethi"</string>
- <string name="no_upstream_notification_message" msgid="6508394877641864863">"Amadivayisi awakwazi ukuxhumeka"</string>
- <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Vala ukusebenzisa ifoni njengemodemu"</string>
- <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"I-hotspot noma ukusebenzisa ifoni njengemodemu kuvuliwe"</string>
- <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"Kungaba nezinkokhelo ezengeziwe uma uzula"</string>
+ <string name="no_upstream_notification_title" msgid="5897815458155858594">"Ukusebenzisa ifoni njengemodemu akunayo i-inthanethi"</string>
+ <string name="no_upstream_notification_message" msgid="9037716118606459874">"Amadivayisi awakwazi ukuxhuma"</string>
+ <string name="no_upstream_notification_disable_button" msgid="5284024068281565456">"Vala ukusebenzisa ifoni njengemodemu"</string>
+ <string name="upstream_roaming_notification_title" msgid="186331286017243006">"I-hotspot noma ukusebenzisa ifoni njengemodemu kuvuliwe"</string>
+ <string name="upstream_roaming_notification_message" msgid="7692641323940316538">"Kungaba nezinkokhelo ezengeziwe uma uzula"</string>
</resources>
diff --git a/Tethering/res/values-mk/strings.xml b/Tethering/res/values-mk/strings.xml
index 9ad9b9a..f1b15e6 100644
--- a/Tethering/res/values-mk/strings.xml
+++ b/Tethering/res/values-mk/strings.xml
@@ -16,14 +16,14 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="tethered_notification_title" msgid="6426563586025792944">"Активно е врзување или точка на пристап"</string>
- <string name="tethered_notification_message" msgid="64800879503420696">"Допрете за поставување."</string>
- <string name="disable_tether_notification_title" msgid="3004509127903564191">"Врзувањето е оневозможено"</string>
- <string name="disable_tether_notification_message" msgid="6717523799293901476">"Контактирајте со администраторот за детали"</string>
- <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Статус на точката на пристап и врзувањето"</string>
- <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
- <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
- <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
- <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
- <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
+ <string name="tethered_notification_title" msgid="5350162111436634622">"Активно: интернет преку мобилен или точка на пристап"</string>
+ <string name="tethered_notification_message" msgid="2338023450330652098">"Допрете за поставување."</string>
+ <string name="disable_tether_notification_title" msgid="3183576627492925522">"Интернетот преку мобилен е оневозможен"</string>
+ <string name="disable_tether_notification_message" msgid="6655882039707534929">"За детали, контактирајте со администраторот"</string>
+ <string name="notification_channel_tethering_status" msgid="7030733422705019001">"Статус на точка на пристап и интернет преку мобилен"</string>
+ <string name="no_upstream_notification_title" msgid="2052743091868702475"></string>
+ <string name="no_upstream_notification_message" msgid="6932020551635470134"></string>
+ <string name="no_upstream_notification_disable_button" msgid="8836277213343697023"></string>
+ <string name="upstream_roaming_notification_title" msgid="8614262557406849762"></string>
+ <string name="upstream_roaming_notification_message" msgid="5999740876323106599"></string>
</resources>
diff --git a/Tethering/res/values-ml/strings.xml b/Tethering/res/values-ml/strings.xml
index 9db79ce..8182b11 100644
--- a/Tethering/res/values-ml/strings.xml
+++ b/Tethering/res/values-ml/strings.xml
@@ -16,14 +16,14 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="tethered_notification_title" msgid="6426563586025792944">"ടെതറിംഗ് അല്ലെങ്കിൽ ഹോട്ട്സ്പോട്ട് സജീവമാണ്"</string>
- <string name="tethered_notification_message" msgid="64800879503420696">"സജ്ജീകരിക്കാൻ ടാപ്പ് ചെയ്യുക."</string>
- <string name="disable_tether_notification_title" msgid="3004509127903564191">"ടെതറിംഗ് പ്രവർത്തനരഹിതമാക്കിയിരിക്കുന്നു"</string>
- <string name="disable_tether_notification_message" msgid="6717523799293901476">"വിശദാംശങ്ങൾക്ക് നിങ്ങളുടെ അഡ്മിനെ ബന്ധപ്പെടുക"</string>
- <string name="notification_channel_tethering_status" msgid="2663463891530932727">"ഹോട്ട്സ്പോട്ടിന്റെയും ടെതറിംഗിന്റെയും നില"</string>
- <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
- <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
- <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
- <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
- <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
+ <string name="tethered_notification_title" msgid="5350162111436634622">"ടെതറിംഗ് അല്ലെങ്കിൽ ഹോട്ട്സ്പോട്ട് സജീവമാണ്"</string>
+ <string name="tethered_notification_message" msgid="2338023450330652098">"സജ്ജീകരിക്കാൻ ടാപ്പ് ചെയ്യുക."</string>
+ <string name="disable_tether_notification_title" msgid="3183576627492925522">"ടെതറിംഗ് പ്രവർത്തനരഹിതമാക്കിയിരിക്കുന്നു"</string>
+ <string name="disable_tether_notification_message" msgid="6655882039707534929">"വിശദാംശങ്ങൾക്ക് നിങ്ങളുടെ അഡ്മിനെ ബന്ധപ്പെടുക"</string>
+ <string name="notification_channel_tethering_status" msgid="7030733422705019001">"ഹോട്ട്സ്പോട്ടിന്റെയും ടെതറിംഗിന്റെയും നില"</string>
+ <string name="no_upstream_notification_title" msgid="2052743091868702475"></string>
+ <string name="no_upstream_notification_message" msgid="6932020551635470134"></string>
+ <string name="no_upstream_notification_disable_button" msgid="8836277213343697023"></string>
+ <string name="upstream_roaming_notification_title" msgid="8614262557406849762"></string>
+ <string name="upstream_roaming_notification_message" msgid="5999740876323106599"></string>
</resources>
diff --git a/Tethering/res/values-mn/strings.xml b/Tethering/res/values-mn/strings.xml
index 42d1edb..a9aef5c 100644
--- a/Tethering/res/values-mn/strings.xml
+++ b/Tethering/res/values-mn/strings.xml
@@ -16,14 +16,14 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="tethered_notification_title" msgid="6426563586025792944">"Модем болгох эсвэл сүлжээний цэг идэвхтэй байна"</string>
- <string name="tethered_notification_message" msgid="64800879503420696">"Тохируулахын тулд товшино уу."</string>
- <string name="disable_tether_notification_title" msgid="3004509127903564191">"Модем болгохыг идэвхгүй болгосон"</string>
- <string name="disable_tether_notification_message" msgid="6717523799293901476">"Дэлгэрэнгүй мэдээлэл авахын тулд админтайгаа холбогдоно уу"</string>
- <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Сүлжээний цэг болон модем болгох төлөв"</string>
- <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
- <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
- <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
- <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
- <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
+ <string name="tethered_notification_title" msgid="5350162111436634622">"Модем болгох эсвэл сүлжээний цэг идэвхтэй байна"</string>
+ <string name="tethered_notification_message" msgid="2338023450330652098">"Тохируулахын тулд товшино уу."</string>
+ <string name="disable_tether_notification_title" msgid="3183576627492925522">"Модем болгохыг идэвхгүй болгосон"</string>
+ <string name="disable_tether_notification_message" msgid="6655882039707534929">"Дэлгэрэнгүй мэдээлэл авах бол админтайгаа холбогдоно уу"</string>
+ <string name="notification_channel_tethering_status" msgid="7030733422705019001">"Сүлжээний цэг болон модем болгохын төлөв"</string>
+ <string name="no_upstream_notification_title" msgid="2052743091868702475"></string>
+ <string name="no_upstream_notification_message" msgid="6932020551635470134"></string>
+ <string name="no_upstream_notification_disable_button" msgid="8836277213343697023"></string>
+ <string name="upstream_roaming_notification_title" msgid="8614262557406849762"></string>
+ <string name="upstream_roaming_notification_message" msgid="5999740876323106599"></string>
</resources>
diff --git a/Tethering/res/values-mr/strings.xml b/Tethering/res/values-mr/strings.xml
index 13995b6..d49cc61 100644
--- a/Tethering/res/values-mr/strings.xml
+++ b/Tethering/res/values-mr/strings.xml
@@ -16,14 +16,14 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="tethered_notification_title" msgid="6426563586025792944">"टेदरिंग किंवा हॉटस्पॉट अॅक्टिव्ह आहे"</string>
- <string name="tethered_notification_message" msgid="64800879503420696">"सेट करण्यासाठी टॅप करा."</string>
- <string name="disable_tether_notification_title" msgid="3004509127903564191">"टेदरिंग बंद केले आहे"</string>
- <string name="disable_tether_notification_message" msgid="6717523799293901476">"तपशीलांसाठी तुमच्या ॲडमिनशी संपर्क साधा"</string>
- <string name="notification_channel_tethering_status" msgid="2663463891530932727">"हॉटस्पॉट आणि टेदरिंगची स्थिती"</string>
- <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
- <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
- <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
- <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
- <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
+ <string name="tethered_notification_title" msgid="5350162111436634622">"टेदरिंग किंवा हॉटस्पॉट अॅक्टिव्ह आहे"</string>
+ <string name="tethered_notification_message" msgid="2338023450330652098">"सेट करण्यासाठी टॅप करा."</string>
+ <string name="disable_tether_notification_title" msgid="3183576627492925522">"टेदरिंग बंद केले आहे"</string>
+ <string name="disable_tether_notification_message" msgid="6655882039707534929">"तपशिलांसाठी तुमच्या ॲडमिनशी संपर्क साधा"</string>
+ <string name="notification_channel_tethering_status" msgid="7030733422705019001">"हॉटस्पॉट & टेदरिंग स्टेटस"</string>
+ <string name="no_upstream_notification_title" msgid="2052743091868702475"></string>
+ <string name="no_upstream_notification_message" msgid="6932020551635470134"></string>
+ <string name="no_upstream_notification_disable_button" msgid="8836277213343697023"></string>
+ <string name="upstream_roaming_notification_title" msgid="8614262557406849762"></string>
+ <string name="upstream_roaming_notification_message" msgid="5999740876323106599"></string>
</resources>
diff --git a/Tethering/res/values-ms/strings.xml b/Tethering/res/values-ms/strings.xml
index d6a67f3..bc7aab3 100644
--- a/Tethering/res/values-ms/strings.xml
+++ b/Tethering/res/values-ms/strings.xml
@@ -16,14 +16,14 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="tethered_notification_title" msgid="6426563586025792944">"Penambatan atau tempat liputan aktif"</string>
- <string name="tethered_notification_message" msgid="64800879503420696">"Ketik untuk membuat persediaan."</string>
- <string name="disable_tether_notification_title" msgid="3004509127903564191">"Penambatan dilumpuhkan"</string>
- <string name="disable_tether_notification_message" msgid="6717523799293901476">"Hubungi pentadbir anda untuk mendapatkan maklumat lanjut"</string>
- <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Status tempat liputan & penambatan"</string>
- <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
- <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
- <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
- <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
- <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
+ <string name="tethered_notification_title" msgid="5350162111436634622">"Penambatan atau tempat liputan aktif"</string>
+ <string name="tethered_notification_message" msgid="2338023450330652098">"Ketik untuk membuat persediaan."</string>
+ <string name="disable_tether_notification_title" msgid="3183576627492925522">"Penambatan dilumpuhkan"</string>
+ <string name="disable_tether_notification_message" msgid="6655882039707534929">"Hubungi pentadbir anda untuk mendapatkan maklumat lanjut"</string>
+ <string name="notification_channel_tethering_status" msgid="7030733422705019001">"Status tempat liputan & penambatan"</string>
+ <string name="no_upstream_notification_title" msgid="2052743091868702475"></string>
+ <string name="no_upstream_notification_message" msgid="6932020551635470134"></string>
+ <string name="no_upstream_notification_disable_button" msgid="8836277213343697023"></string>
+ <string name="upstream_roaming_notification_title" msgid="8614262557406849762"></string>
+ <string name="upstream_roaming_notification_message" msgid="5999740876323106599"></string>
</resources>
diff --git a/Tethering/res/values-my/strings.xml b/Tethering/res/values-my/strings.xml
index 49f6b88..4f40423 100644
--- a/Tethering/res/values-my/strings.xml
+++ b/Tethering/res/values-my/strings.xml
@@ -16,14 +16,14 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="tethered_notification_title" msgid="6426563586025792944">"မိုဘိုင်းဖုန်းသုံး ချိတ်ဆက်မျှဝေခြင်း သို့မဟုတ် ဟော့စပေါ့ ဖွင့်ထားသည်"</string>
- <string name="tethered_notification_message" msgid="64800879503420696">"စနစ်ထည့်သွင်းရန် တို့ပါ။"</string>
- <string name="disable_tether_notification_title" msgid="3004509127903564191">"မိုဘိုင်းဖုန်းသုံး ချိတ်ဆက်မျှဝေခြင်းကို ပိတ်ထားသည်"</string>
- <string name="disable_tether_notification_message" msgid="6717523799293901476">"အသေးစိတ်အတွက် သင့်စီမံခန့်ခွဲသူကို ဆက်သွယ်ပါ"</string>
- <string name="notification_channel_tethering_status" msgid="2663463891530932727">"ဟော့စပေါ့နှင့် မိုဘိုင်းဖုန်းသုံး ချိတ်ဆက်မျှဝေခြင်း အခြေအနေ"</string>
- <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
- <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
- <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
- <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
- <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
+ <string name="tethered_notification_title" msgid="5350162111436634622">"မိုဘိုင်းသုံး၍ ချိတ်ဆက်ခြင်း (သို့) ဟော့စပေါ့ ဖွင့်ထားသည်"</string>
+ <string name="tethered_notification_message" msgid="2338023450330652098">"စနစ်ထည့်သွင်းရန် တို့ပါ။"</string>
+ <string name="disable_tether_notification_title" msgid="3183576627492925522">"မိုဘိုင်းသုံး၍ ချိတ်ဆက်ခြင်း ပိတ်ထားသည်"</string>
+ <string name="disable_tether_notification_message" msgid="6655882039707534929">"အသေးစိတ်သိရန် သင့်စီမံခန့်ခွဲသူထံ ဆက်သွယ်ပါ"</string>
+ <string name="notification_channel_tethering_status" msgid="7030733422705019001">"ဟော့စပေါ့နှင့် မိုဘိုင်းသုံး၍ ချိတ်ဆက်ခြင်း အခြေအနေ"</string>
+ <string name="no_upstream_notification_title" msgid="2052743091868702475"></string>
+ <string name="no_upstream_notification_message" msgid="6932020551635470134"></string>
+ <string name="no_upstream_notification_disable_button" msgid="8836277213343697023"></string>
+ <string name="upstream_roaming_notification_title" msgid="8614262557406849762"></string>
+ <string name="upstream_roaming_notification_message" msgid="5999740876323106599"></string>
</resources>
diff --git a/Tethering/res/values-nb/strings.xml b/Tethering/res/values-nb/strings.xml
index 9594e0a..e9024c0 100644
--- a/Tethering/res/values-nb/strings.xml
+++ b/Tethering/res/values-nb/strings.xml
@@ -16,14 +16,14 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="tethered_notification_title" msgid="6426563586025792944">"Internettdeling eller Wi-Fi-sone er aktiv"</string>
- <string name="tethered_notification_message" msgid="64800879503420696">"Trykk for å konfigurere."</string>
- <string name="disable_tether_notification_title" msgid="3004509127903564191">"Internettdeling er slått av"</string>
- <string name="disable_tether_notification_message" msgid="6717523799293901476">"Ta kontakt med administratoren din for å få mer informasjon"</string>
- <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Status for Wi-Fi-sone og internettdeling"</string>
- <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
- <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
- <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
- <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
- <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
+ <string name="tethered_notification_title" msgid="5350162111436634622">"Internettdeling eller wifi-sone er aktiv"</string>
+ <string name="tethered_notification_message" msgid="2338023450330652098">"Trykk for å konfigurere."</string>
+ <string name="disable_tether_notification_title" msgid="3183576627492925522">"Internettdeling er slått av"</string>
+ <string name="disable_tether_notification_message" msgid="6655882039707534929">"Kontakt administratoren din for å få mer informasjon"</string>
+ <string name="notification_channel_tethering_status" msgid="7030733422705019001">"Status for wifi-sone og internettdeling"</string>
+ <string name="no_upstream_notification_title" msgid="2052743091868702475"></string>
+ <string name="no_upstream_notification_message" msgid="6932020551635470134"></string>
+ <string name="no_upstream_notification_disable_button" msgid="8836277213343697023"></string>
+ <string name="upstream_roaming_notification_title" msgid="8614262557406849762"></string>
+ <string name="upstream_roaming_notification_message" msgid="5999740876323106599"></string>
</resources>
diff --git a/Tethering/res/values-ne/strings.xml b/Tethering/res/values-ne/strings.xml
index 72ae3a8..988d5c2 100644
--- a/Tethering/res/values-ne/strings.xml
+++ b/Tethering/res/values-ne/strings.xml
@@ -16,14 +16,14 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="tethered_notification_title" msgid="6426563586025792944">"टेदरिङ वा हटस्पट सक्रिय छ"</string>
- <string name="tethered_notification_message" msgid="64800879503420696">"सेटअप गर्न ट्याप गर्नुहोस्।"</string>
- <string name="disable_tether_notification_title" msgid="3004509127903564191">"टेदरिङ सुविधा असक्षम पारिएको छ"</string>
- <string name="disable_tether_notification_message" msgid="6717523799293901476">"विवरणहरूका लागि आफ्ना प्रशासकलाई सम्पर्क गर्नुहोस्"</string>
- <string name="notification_channel_tethering_status" msgid="2663463891530932727">"हटस्पट तथा टेदरिङको स्थिति"</string>
- <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
- <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
- <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
- <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
- <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
+ <string name="tethered_notification_title" msgid="5350162111436634622">"टेदरिङ वा हटस्पट अन छ"</string>
+ <string name="tethered_notification_message" msgid="2338023450330652098">"सेटअप गर्न ट्याप गर्नुहोस्।"</string>
+ <string name="disable_tether_notification_title" msgid="3183576627492925522">"टेदरिङ सुविधा अफ गरिएको छ"</string>
+ <string name="disable_tether_notification_message" msgid="6655882039707534929">"विस्तृत जानकारीका लागि एड्मिनलाई सम्पर्क गर्नुहोस्"</string>
+ <string name="notification_channel_tethering_status" msgid="7030733422705019001">"हटस्पट तथा टेदरिङको स्थिति"</string>
+ <string name="no_upstream_notification_title" msgid="2052743091868702475"></string>
+ <string name="no_upstream_notification_message" msgid="6932020551635470134"></string>
+ <string name="no_upstream_notification_disable_button" msgid="8836277213343697023"></string>
+ <string name="upstream_roaming_notification_title" msgid="8614262557406849762"></string>
+ <string name="upstream_roaming_notification_message" msgid="5999740876323106599"></string>
</resources>
diff --git a/Tethering/res/values-nl/strings.xml b/Tethering/res/values-nl/strings.xml
index 18b2bbf..d6a0a1a 100644
--- a/Tethering/res/values-nl/strings.xml
+++ b/Tethering/res/values-nl/strings.xml
@@ -16,14 +16,14 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="tethered_notification_title" msgid="6426563586025792944">"Tethering of hotspot actief"</string>
- <string name="tethered_notification_message" msgid="64800879503420696">"Tik om in te stellen."</string>
- <string name="disable_tether_notification_title" msgid="3004509127903564191">"Tethering is uitgeschakeld"</string>
- <string name="disable_tether_notification_message" msgid="6717523799293901476">"Neem contact op met je beheerder voor meer informatie"</string>
- <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Status van hotspot en tethering"</string>
- <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
- <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
- <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
- <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
- <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
+ <string name="tethered_notification_title" msgid="5350162111436634622">"Tethering of hotspot actief"</string>
+ <string name="tethered_notification_message" msgid="2338023450330652098">"Tik om in te stellen."</string>
+ <string name="disable_tether_notification_title" msgid="3183576627492925522">"Tethering staat uit"</string>
+ <string name="disable_tether_notification_message" msgid="6655882039707534929">"Neem contact op met je beheerder voor meer informatie"</string>
+ <string name="notification_channel_tethering_status" msgid="7030733422705019001">"Status van hotspot en tethering"</string>
+ <string name="no_upstream_notification_title" msgid="2052743091868702475"></string>
+ <string name="no_upstream_notification_message" msgid="6932020551635470134"></string>
+ <string name="no_upstream_notification_disable_button" msgid="8836277213343697023"></string>
+ <string name="upstream_roaming_notification_title" msgid="8614262557406849762"></string>
+ <string name="upstream_roaming_notification_message" msgid="5999740876323106599"></string>
</resources>
diff --git a/Tethering/res/values-or/strings.xml b/Tethering/res/values-or/strings.xml
index a15a6db..9abca6c 100644
--- a/Tethering/res/values-or/strings.xml
+++ b/Tethering/res/values-or/strings.xml
@@ -16,14 +16,14 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="tethered_notification_title" msgid="6426563586025792944">"ଟିଥେରିଂ କିମ୍ୱା ହଟସ୍ପଟ୍ ସକ୍ରିୟ ଅଛି"</string>
- <string name="tethered_notification_message" msgid="64800879503420696">"ସେଟ୍ ଅପ୍ କରିବାକୁ ଟାପ୍ କରନ୍ତୁ।"</string>
- <string name="disable_tether_notification_title" msgid="3004509127903564191">"ଟିଥେରିଂ ଅକ୍ଷମ କରାଯାଇଛି"</string>
- <string name="disable_tether_notification_message" msgid="6717523799293901476">"ବିବରଣୀଗୁଡ଼ିକ ପାଇଁ ଆପଣଙ୍କ ଆଡମିନଙ୍କ ସହ ଯୋଗାଯୋଗ କରନ୍ତୁ"</string>
- <string name="notification_channel_tethering_status" msgid="2663463891530932727">"ହଟସ୍ପଟ୍ ଓ ଟିଥେରିଂ ସ୍ଥିତି"</string>
- <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
- <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
- <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
- <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
- <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
+ <string name="tethered_notification_title" msgid="5350162111436634622">"ଟିଥରିଂ କିମ୍ବା ହଟସ୍ପଟ ସକ୍ରିୟ ଅଛି"</string>
+ <string name="tethered_notification_message" msgid="2338023450330652098">"ସେଟ ଅପ କରିବାକୁ ଟାପ କରନ୍ତୁ।"</string>
+ <string name="disable_tether_notification_title" msgid="3183576627492925522">"ଟିଥରିଂକୁ ଅକ୍ଷମ କରାଯାଇଛି"</string>
+ <string name="disable_tether_notification_message" msgid="6655882039707534929">"ବିବରଣୀ ପାଇଁ ଆପଣଙ୍କ ଆଡମିନଙ୍କ ସହ କଣ୍ଟାକ୍ଟ କରନ୍ତୁ"</string>
+ <string name="notification_channel_tethering_status" msgid="7030733422705019001">"ହଟସ୍ପଟ ଏବଂ ଟିଥରିଂ ସ୍ଥିତି"</string>
+ <string name="no_upstream_notification_title" msgid="2052743091868702475"></string>
+ <string name="no_upstream_notification_message" msgid="6932020551635470134"></string>
+ <string name="no_upstream_notification_disable_button" msgid="8836277213343697023"></string>
+ <string name="upstream_roaming_notification_title" msgid="8614262557406849762"></string>
+ <string name="upstream_roaming_notification_message" msgid="5999740876323106599"></string>
</resources>
diff --git a/Tethering/res/values-pa/strings.xml b/Tethering/res/values-pa/strings.xml
index a8235e4..bcd1c14 100644
--- a/Tethering/res/values-pa/strings.xml
+++ b/Tethering/res/values-pa/strings.xml
@@ -16,14 +16,14 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="tethered_notification_title" msgid="6426563586025792944">"ਟੈਦਰਿੰਗ ਜਾਂ ਹੌਟਸਪੌਟ ਕਿਰਿਆਸ਼ੀਲ"</string>
- <string name="tethered_notification_message" msgid="64800879503420696">"ਸੈੱਟਅੱਪ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ।"</string>
- <string name="disable_tether_notification_title" msgid="3004509127903564191">"ਟੈਦਰਿੰਗ ਨੂੰ ਬੰਦ ਕੀਤਾ ਗਿਆ ਹੈ"</string>
- <string name="disable_tether_notification_message" msgid="6717523799293901476">"ਵੇਰਵਿਆਂ ਲਈ ਆਪਣੇ ਪ੍ਰਸ਼ਾਸਕ ਨਾਲ ਸੰਪਰਕ ਕਰੋ"</string>
- <string name="notification_channel_tethering_status" msgid="2663463891530932727">"ਹੌਟਸਪੌਟ ਅਤੇ ਟੈਦਰਿੰਗ ਦੀ ਸਥਿਤੀ"</string>
- <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
- <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
- <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
- <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
- <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
+ <string name="tethered_notification_title" msgid="5350162111436634622">"ਟੈਦਰਿੰਗ ਜਾਂ ਹੌਟਸਪੌਟ ਕਿਰਿਆਸ਼ੀਲ"</string>
+ <string name="tethered_notification_message" msgid="2338023450330652098">"ਸੈੱਟਅੱਪ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ।"</string>
+ <string name="disable_tether_notification_title" msgid="3183576627492925522">"ਟੈਦਰਿੰਗ ਨੂੰ ਬੰਦ ਕੀਤਾ ਗਿਆ ਹੈ"</string>
+ <string name="disable_tether_notification_message" msgid="6655882039707534929">"ਵੇਰਵਿਆਂ ਲਈ ਆਪਣੇ ਪ੍ਰਸ਼ਾਸਕ ਨਾਲ ਸੰਪਰਕ ਕਰੋ"</string>
+ <string name="notification_channel_tethering_status" msgid="7030733422705019001">"ਹੌਟਸਪੌਟ ਅਤੇ ਟੈਦਰਿੰਗ ਦੀ ਸਥਿਤੀ"</string>
+ <string name="no_upstream_notification_title" msgid="2052743091868702475"></string>
+ <string name="no_upstream_notification_message" msgid="6932020551635470134"></string>
+ <string name="no_upstream_notification_disable_button" msgid="8836277213343697023"></string>
+ <string name="upstream_roaming_notification_title" msgid="8614262557406849762"></string>
+ <string name="upstream_roaming_notification_message" msgid="5999740876323106599"></string>
</resources>
diff --git a/Tethering/res/values-pl/strings.xml b/Tethering/res/values-pl/strings.xml
index ccb017d..855afb4 100644
--- a/Tethering/res/values-pl/strings.xml
+++ b/Tethering/res/values-pl/strings.xml
@@ -16,14 +16,14 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="tethered_notification_title" msgid="6426563586025792944">"Aktywny tethering lub punkt dostępu"</string>
- <string name="tethered_notification_message" msgid="64800879503420696">"Kliknij, by skonfigurować"</string>
- <string name="disable_tether_notification_title" msgid="3004509127903564191">"Tethering został wyłączony"</string>
- <string name="disable_tether_notification_message" msgid="6717523799293901476">"Aby uzyskać szczegółowe informacje, skontaktuj się z administratorem"</string>
- <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Hotspot i tethering – stan"</string>
- <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
- <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
- <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
- <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
- <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
+ <string name="tethered_notification_title" msgid="5350162111436634622">"Aktywny tethering lub hotspot"</string>
+ <string name="tethered_notification_message" msgid="2338023450330652098">"Kliknij, aby skonfigurować."</string>
+ <string name="disable_tether_notification_title" msgid="3183576627492925522">"Tethering jest wyłączony"</string>
+ <string name="disable_tether_notification_message" msgid="6655882039707534929">"Aby uzyskać szczegółowe informacje, skontaktuj się z administratorem"</string>
+ <string name="notification_channel_tethering_status" msgid="7030733422705019001">"Stan hotspotu i tetheringu"</string>
+ <string name="no_upstream_notification_title" msgid="2052743091868702475"></string>
+ <string name="no_upstream_notification_message" msgid="6932020551635470134"></string>
+ <string name="no_upstream_notification_disable_button" msgid="8836277213343697023"></string>
+ <string name="upstream_roaming_notification_title" msgid="8614262557406849762"></string>
+ <string name="upstream_roaming_notification_message" msgid="5999740876323106599"></string>
</resources>
diff --git a/Tethering/res/values-pt-rBR/strings.xml b/Tethering/res/values-pt-rBR/strings.xml
index a0a4745..7e19f0e 100644
--- a/Tethering/res/values-pt-rBR/strings.xml
+++ b/Tethering/res/values-pt-rBR/strings.xml
@@ -16,14 +16,14 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="tethered_notification_title" msgid="6426563586025792944">"Ponto de acesso ou tethering ativo"</string>
- <string name="tethered_notification_message" msgid="64800879503420696">"Toque para configurar."</string>
- <string name="disable_tether_notification_title" msgid="3004509127903564191">"Tethering desativado"</string>
- <string name="disable_tether_notification_message" msgid="6717523799293901476">"Fale com seu administrador para saber detalhes"</string>
- <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Status de ponto de acesso e tethering"</string>
- <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
- <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
- <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
- <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
- <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
+ <string name="tethered_notification_title" msgid="5350162111436634622">"Ponto de acesso ou tethering ativo"</string>
+ <string name="tethered_notification_message" msgid="2338023450330652098">"Toque para configurar."</string>
+ <string name="disable_tether_notification_title" msgid="3183576627492925522">"O tethering está desativado"</string>
+ <string name="disable_tether_notification_message" msgid="6655882039707534929">"Entre em contato com seu administrador para saber detalhes"</string>
+ <string name="notification_channel_tethering_status" msgid="7030733422705019001">"Status do ponto de acesso e do tethering"</string>
+ <string name="no_upstream_notification_title" msgid="2052743091868702475"></string>
+ <string name="no_upstream_notification_message" msgid="6932020551635470134"></string>
+ <string name="no_upstream_notification_disable_button" msgid="8836277213343697023"></string>
+ <string name="upstream_roaming_notification_title" msgid="8614262557406849762"></string>
+ <string name="upstream_roaming_notification_message" msgid="5999740876323106599"></string>
</resources>
diff --git a/Tethering/res/values-pt-rPT/strings.xml b/Tethering/res/values-pt-rPT/strings.xml
index e3f03fc..ac8ea5c 100644
--- a/Tethering/res/values-pt-rPT/strings.xml
+++ b/Tethering/res/values-pt-rPT/strings.xml
@@ -16,14 +16,14 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="tethered_notification_title" msgid="6426563586025792944">"Ligação (à Internet) via telemóvel ou zona Wi-Fi ativas"</string>
- <string name="tethered_notification_message" msgid="64800879503420696">"Toque para configurar."</string>
- <string name="disable_tether_notification_title" msgid="3004509127903564191">"A ligação (à Internet) via telemóvel está desativada."</string>
- <string name="disable_tether_notification_message" msgid="6717523799293901476">"Contacte o administrador para obter detalhes."</string>
- <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Estado da zona Wi-Fi e da ligação (à Internet) via telemóvel"</string>
- <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
- <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
- <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
- <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
- <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
+ <string name="tethered_notification_title" msgid="5350162111436634622">"Ligação (à Internet) via telemóvel ou zona Wi-Fi ativa"</string>
+ <string name="tethered_notification_message" msgid="2338023450330652098">"Toque para configurar."</string>
+ <string name="disable_tether_notification_title" msgid="3183576627492925522">"A ligação (à Internet) via telemóvel está desativada"</string>
+ <string name="disable_tether_notification_message" msgid="6655882039707534929">"Contacte o administrador para obter detalhes"</string>
+ <string name="notification_channel_tethering_status" msgid="7030733422705019001">"Estado da zona Wi-Fi e da ligação (à Internet) via telemóvel"</string>
+ <string name="no_upstream_notification_title" msgid="2052743091868702475"></string>
+ <string name="no_upstream_notification_message" msgid="6932020551635470134"></string>
+ <string name="no_upstream_notification_disable_button" msgid="8836277213343697023"></string>
+ <string name="upstream_roaming_notification_title" msgid="8614262557406849762"></string>
+ <string name="upstream_roaming_notification_message" msgid="5999740876323106599"></string>
</resources>
diff --git a/Tethering/res/values-pt/strings.xml b/Tethering/res/values-pt/strings.xml
index a0a4745..7e19f0e 100644
--- a/Tethering/res/values-pt/strings.xml
+++ b/Tethering/res/values-pt/strings.xml
@@ -16,14 +16,14 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="tethered_notification_title" msgid="6426563586025792944">"Ponto de acesso ou tethering ativo"</string>
- <string name="tethered_notification_message" msgid="64800879503420696">"Toque para configurar."</string>
- <string name="disable_tether_notification_title" msgid="3004509127903564191">"Tethering desativado"</string>
- <string name="disable_tether_notification_message" msgid="6717523799293901476">"Fale com seu administrador para saber detalhes"</string>
- <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Status de ponto de acesso e tethering"</string>
- <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
- <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
- <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
- <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
- <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
+ <string name="tethered_notification_title" msgid="5350162111436634622">"Ponto de acesso ou tethering ativo"</string>
+ <string name="tethered_notification_message" msgid="2338023450330652098">"Toque para configurar."</string>
+ <string name="disable_tether_notification_title" msgid="3183576627492925522">"O tethering está desativado"</string>
+ <string name="disable_tether_notification_message" msgid="6655882039707534929">"Entre em contato com seu administrador para saber detalhes"</string>
+ <string name="notification_channel_tethering_status" msgid="7030733422705019001">"Status do ponto de acesso e do tethering"</string>
+ <string name="no_upstream_notification_title" msgid="2052743091868702475"></string>
+ <string name="no_upstream_notification_message" msgid="6932020551635470134"></string>
+ <string name="no_upstream_notification_disable_button" msgid="8836277213343697023"></string>
+ <string name="upstream_roaming_notification_title" msgid="8614262557406849762"></string>
+ <string name="upstream_roaming_notification_message" msgid="5999740876323106599"></string>
</resources>
diff --git a/Tethering/res/values-ro/strings.xml b/Tethering/res/values-ro/strings.xml
index 5706a4a..e022504 100644
--- a/Tethering/res/values-ro/strings.xml
+++ b/Tethering/res/values-ro/strings.xml
@@ -16,14 +16,14 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="tethered_notification_title" msgid="6426563586025792944">"Tethering sau hotspot activ"</string>
- <string name="tethered_notification_message" msgid="64800879503420696">"Atingeți ca să configurați."</string>
- <string name="disable_tether_notification_title" msgid="3004509127903564191">"Tetheringul este dezactivat"</string>
- <string name="disable_tether_notification_message" msgid="6717523799293901476">"Contactați administratorul pentru detalii"</string>
- <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Starea hotspotului și a tetheringului"</string>
- <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
- <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
- <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
- <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
- <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
+ <string name="tethered_notification_title" msgid="5350162111436634622">"Tethering sau hotspot activ"</string>
+ <string name="tethered_notification_message" msgid="2338023450330652098">"Atinge pentru a configura."</string>
+ <string name="disable_tether_notification_title" msgid="3183576627492925522">"Tetheringul este dezactivat"</string>
+ <string name="disable_tether_notification_message" msgid="6655882039707534929">"Contactează administratorul pentru detalii"</string>
+ <string name="notification_channel_tethering_status" msgid="7030733422705019001">"Starea hotspotului și a tetheringului"</string>
+ <string name="no_upstream_notification_title" msgid="2052743091868702475"></string>
+ <string name="no_upstream_notification_message" msgid="6932020551635470134"></string>
+ <string name="no_upstream_notification_disable_button" msgid="8836277213343697023"></string>
+ <string name="upstream_roaming_notification_title" msgid="8614262557406849762"></string>
+ <string name="upstream_roaming_notification_message" msgid="5999740876323106599"></string>
</resources>
diff --git a/Tethering/res/values-ru/strings.xml b/Tethering/res/values-ru/strings.xml
index 7cb6f7d..4361d70 100644
--- a/Tethering/res/values-ru/strings.xml
+++ b/Tethering/res/values-ru/strings.xml
@@ -16,14 +16,14 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="tethered_notification_title" msgid="6426563586025792944">"Включен режим модема или точка доступа"</string>
- <string name="tethered_notification_message" msgid="64800879503420696">"Нажмите, чтобы настроить."</string>
- <string name="disable_tether_notification_title" msgid="3004509127903564191">"Использование телефона в качестве модема запрещено"</string>
- <string name="disable_tether_notification_message" msgid="6717523799293901476">"Чтобы узнать подробности, обратитесь к администратору."</string>
- <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Статус хот-спота и режима модема"</string>
- <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
- <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
- <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
- <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
- <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
+ <string name="tethered_notification_title" msgid="5350162111436634622">"Включен режим модема или точка доступа"</string>
+ <string name="tethered_notification_message" msgid="2338023450330652098">"Нажмите, чтобы настроить."</string>
+ <string name="disable_tether_notification_title" msgid="3183576627492925522">"Включить режим модема нельзя"</string>
+ <string name="disable_tether_notification_message" msgid="6655882039707534929">"Чтобы узнать больше, обратитесь к администратору."</string>
+ <string name="notification_channel_tethering_status" msgid="7030733422705019001">"Статус точки доступа и режима модема"</string>
+ <string name="no_upstream_notification_title" msgid="2052743091868702475"></string>
+ <string name="no_upstream_notification_message" msgid="6932020551635470134"></string>
+ <string name="no_upstream_notification_disable_button" msgid="8836277213343697023"></string>
+ <string name="upstream_roaming_notification_title" msgid="8614262557406849762"></string>
+ <string name="upstream_roaming_notification_message" msgid="5999740876323106599"></string>
</resources>
diff --git a/Tethering/res/values-si/strings.xml b/Tethering/res/values-si/strings.xml
index ec34c22..14f30e9 100644
--- a/Tethering/res/values-si/strings.xml
+++ b/Tethering/res/values-si/strings.xml
@@ -16,14 +16,14 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="tethered_notification_title" msgid="6426563586025792944">"ටෙදරින් හෝ හොට්ස්පොට් සක්රීයයි"</string>
- <string name="tethered_notification_message" msgid="64800879503420696">"පිහිටුවීමට තට්ටු කරන්න."</string>
- <string name="disable_tether_notification_title" msgid="3004509127903564191">"ටෙදරින් අබල කර ඇත"</string>
- <string name="disable_tether_notification_message" msgid="6717523799293901476">"විස්තර සඳහා ඔබගේ පරිපාලක අමතන්න"</string>
- <string name="notification_channel_tethering_status" msgid="2663463891530932727">"හොට්ස්පොට් & ටෙදරින් තත්ත්වය"</string>
- <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
- <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
- <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
- <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
- <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
+ <string name="tethered_notification_title" msgid="5350162111436634622">"ටෙදරින් හෝ හොට්ස්පොට් සක්රියයි"</string>
+ <string name="tethered_notification_message" msgid="2338023450330652098">"පිහිටුවීමට තට්ටු කරන්න."</string>
+ <string name="disable_tether_notification_title" msgid="3183576627492925522">"ටෙදරින් අබල කර ඇත"</string>
+ <string name="disable_tether_notification_message" msgid="6655882039707534929">"විස්තර සඳහා ඔබේ පරිපාලක අමතන්න"</string>
+ <string name="notification_channel_tethering_status" msgid="7030733422705019001">"හොට්ස්පොට් සහ ටෙදරින් තත්ත්වය"</string>
+ <string name="no_upstream_notification_title" msgid="2052743091868702475"></string>
+ <string name="no_upstream_notification_message" msgid="6932020551635470134"></string>
+ <string name="no_upstream_notification_disable_button" msgid="8836277213343697023"></string>
+ <string name="upstream_roaming_notification_title" msgid="8614262557406849762"></string>
+ <string name="upstream_roaming_notification_message" msgid="5999740876323106599"></string>
</resources>
diff --git a/Tethering/res/values-sk/strings.xml b/Tethering/res/values-sk/strings.xml
index 43e787c..15845e7 100644
--- a/Tethering/res/values-sk/strings.xml
+++ b/Tethering/res/values-sk/strings.xml
@@ -16,14 +16,14 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="tethered_notification_title" msgid="6426563586025792944">"Tethering alebo prístupový bod je aktívny"</string>
- <string name="tethered_notification_message" msgid="64800879503420696">"Klepnutím prejdete na nastavenie."</string>
- <string name="disable_tether_notification_title" msgid="3004509127903564191">"Tethering je deaktivovaný"</string>
- <string name="disable_tether_notification_message" msgid="6717523799293901476">"O podrobnosti požiadajte svojho správcu"</string>
- <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Stav hotspotu a tetheringu"</string>
- <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
- <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
- <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
- <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
- <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
+ <string name="tethered_notification_title" msgid="5350162111436634622">"Tethering alebo hotspot je aktívny"</string>
+ <string name="tethered_notification_message" msgid="2338023450330652098">"Nastavíte ho klepnutím."</string>
+ <string name="disable_tether_notification_title" msgid="3183576627492925522">"Tethering je deaktivovaný"</string>
+ <string name="disable_tether_notification_message" msgid="6655882039707534929">"O podrobnosti požiadajte svojho správcu"</string>
+ <string name="notification_channel_tethering_status" msgid="7030733422705019001">"Stav hotspotu a tetheringu"</string>
+ <string name="no_upstream_notification_title" msgid="2052743091868702475"></string>
+ <string name="no_upstream_notification_message" msgid="6932020551635470134"></string>
+ <string name="no_upstream_notification_disable_button" msgid="8836277213343697023"></string>
+ <string name="upstream_roaming_notification_title" msgid="8614262557406849762"></string>
+ <string name="upstream_roaming_notification_message" msgid="5999740876323106599"></string>
</resources>
diff --git a/Tethering/res/values-sl/strings.xml b/Tethering/res/values-sl/strings.xml
index 5943362..4c9bd3c 100644
--- a/Tethering/res/values-sl/strings.xml
+++ b/Tethering/res/values-sl/strings.xml
@@ -16,14 +16,14 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="tethered_notification_title" msgid="6426563586025792944">"Povezava z internetom prek mobilnega telefona ali dostopna točka je aktivna"</string>
- <string name="tethered_notification_message" msgid="64800879503420696">"Dotaknite se, če želite nastaviti."</string>
- <string name="disable_tether_notification_title" msgid="3004509127903564191">"Povezava z internetom prek mobilnega telefona je onemogočena"</string>
- <string name="disable_tether_notification_message" msgid="6717523799293901476">"Za podrobnosti se obrnite na skrbnika"</string>
- <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Stanje dostopne točke in povezave z internetom prek mobilnega telefona"</string>
- <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
- <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
- <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
- <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
- <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
+ <string name="tethered_notification_title" msgid="5350162111436634622">"Povezava računalnika z internetom prek mobilnega telefona ali dostopna točka je aktivna."</string>
+ <string name="tethered_notification_message" msgid="2338023450330652098">"Dotaknite se za nastavitev."</string>
+ <string name="disable_tether_notification_title" msgid="3183576627492925522">"Povezava računalnika z internetom prek mobilnega telefona je onemogočena."</string>
+ <string name="disable_tether_notification_message" msgid="6655882039707534929">"Za podrobnosti se obrnite na skrbnika."</string>
+ <string name="notification_channel_tethering_status" msgid="7030733422705019001">"Stanje dostopne točke in povezave računalnika z internetom prek mobilnega telefona"</string>
+ <string name="no_upstream_notification_title" msgid="2052743091868702475"></string>
+ <string name="no_upstream_notification_message" msgid="6932020551635470134"></string>
+ <string name="no_upstream_notification_disable_button" msgid="8836277213343697023"></string>
+ <string name="upstream_roaming_notification_title" msgid="8614262557406849762"></string>
+ <string name="upstream_roaming_notification_message" msgid="5999740876323106599"></string>
</resources>
diff --git a/Tethering/res/values-sq/strings.xml b/Tethering/res/values-sq/strings.xml
index 21e1155..e39e98d 100644
--- a/Tethering/res/values-sq/strings.xml
+++ b/Tethering/res/values-sq/strings.xml
@@ -16,14 +16,14 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="tethered_notification_title" msgid="6426563586025792944">"Ndarja e internetit ose zona e qasjes së internetit është aktive"</string>
- <string name="tethered_notification_message" msgid="64800879503420696">"Trokit për ta konfiguruar."</string>
- <string name="disable_tether_notification_title" msgid="3004509127903564191">"Ndarja e internetit është çaktivizuar"</string>
- <string name="disable_tether_notification_message" msgid="6717523799293901476">"Kontakto me administratorin për detaje"</string>
- <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Statusi i zonës së qasjes dhe ndarjes së internetit"</string>
- <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
- <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
- <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
- <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
- <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
+ <string name="tethered_notification_title" msgid="5350162111436634622">"Lidhja e çiftimit ose ajo e qasjes në zona publike interneti është aktive"</string>
+ <string name="tethered_notification_message" msgid="2338023450330652098">"Trokit për ta konfiguruar."</string>
+ <string name="disable_tether_notification_title" msgid="3183576627492925522">"Ndarja e internetit është çaktivizuar"</string>
+ <string name="disable_tether_notification_message" msgid="6655882039707534929">"Kontakto me administratorin për detaje"</string>
+ <string name="notification_channel_tethering_status" msgid="7030733422705019001">"Statusi i zonës së qasjes dhe ndarjes së internetit"</string>
+ <string name="no_upstream_notification_title" msgid="2052743091868702475"></string>
+ <string name="no_upstream_notification_message" msgid="6932020551635470134"></string>
+ <string name="no_upstream_notification_disable_button" msgid="8836277213343697023"></string>
+ <string name="upstream_roaming_notification_title" msgid="8614262557406849762"></string>
+ <string name="upstream_roaming_notification_message" msgid="5999740876323106599"></string>
</resources>
diff --git a/Tethering/res/values-sr/strings.xml b/Tethering/res/values-sr/strings.xml
index e2e4dc6..ca3ba59 100644
--- a/Tethering/res/values-sr/strings.xml
+++ b/Tethering/res/values-sr/strings.xml
@@ -16,14 +16,14 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="tethered_notification_title" msgid="6426563586025792944">"Привезивање или хотспот је активан"</string>
- <string name="tethered_notification_message" msgid="64800879503420696">"Додирните да бисте подесили."</string>
- <string name="disable_tether_notification_title" msgid="3004509127903564191">"Привезивање је онемогућено"</string>
- <string name="disable_tether_notification_message" msgid="6717523799293901476">"Потражите детаље од администратора"</string>
- <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Статус хотспота и привезивања"</string>
- <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
- <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
- <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
- <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
- <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
+ <string name="tethered_notification_title" msgid="5350162111436634622">"Активно је привезивање или хотспот"</string>
+ <string name="tethered_notification_message" msgid="2338023450330652098">"Додирните да бисте подесили."</string>
+ <string name="disable_tether_notification_title" msgid="3183576627492925522">"Привезивање је онемогућено"</string>
+ <string name="disable_tether_notification_message" msgid="6655882039707534929">"Потражите детаље од администратора"</string>
+ <string name="notification_channel_tethering_status" msgid="7030733422705019001">"Статус хотспота и привезивања"</string>
+ <string name="no_upstream_notification_title" msgid="2052743091868702475"></string>
+ <string name="no_upstream_notification_message" msgid="6932020551635470134"></string>
+ <string name="no_upstream_notification_disable_button" msgid="8836277213343697023"></string>
+ <string name="upstream_roaming_notification_title" msgid="8614262557406849762"></string>
+ <string name="upstream_roaming_notification_message" msgid="5999740876323106599"></string>
</resources>
diff --git a/Tethering/res/values-sv/strings.xml b/Tethering/res/values-sv/strings.xml
index 72702c2..da5e104 100644
--- a/Tethering/res/values-sv/strings.xml
+++ b/Tethering/res/values-sv/strings.xml
@@ -16,14 +16,14 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="tethered_notification_title" msgid="6426563586025792944">"Internetdelning eller surfzon har aktiverats"</string>
- <string name="tethered_notification_message" msgid="64800879503420696">"Tryck om du vill konfigurera."</string>
- <string name="disable_tether_notification_title" msgid="3004509127903564191">"Internetdelning har inaktiverats"</string>
- <string name="disable_tether_notification_message" msgid="6717523799293901476">"Kontakta administratören om du vill veta mer"</string>
- <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Trådlös surfzon och internetdelning har inaktiverats"</string>
- <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
- <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
- <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
- <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
- <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
+ <string name="tethered_notification_title" msgid="5350162111436634622">"Internetdelning eller surfzon är aktiv"</string>
+ <string name="tethered_notification_message" msgid="2338023450330652098">"Tryck om du vill konfigurera."</string>
+ <string name="disable_tether_notification_title" msgid="3183576627492925522">"Internetdelning har inaktiverats"</string>
+ <string name="disable_tether_notification_message" msgid="6655882039707534929">"Kontakta administratören om du vill veta mer"</string>
+ <string name="notification_channel_tethering_status" msgid="7030733422705019001">"Status för surfzon och internetdelning"</string>
+ <string name="no_upstream_notification_title" msgid="2052743091868702475"></string>
+ <string name="no_upstream_notification_message" msgid="6932020551635470134"></string>
+ <string name="no_upstream_notification_disable_button" msgid="8836277213343697023"></string>
+ <string name="upstream_roaming_notification_title" msgid="8614262557406849762"></string>
+ <string name="upstream_roaming_notification_message" msgid="5999740876323106599"></string>
</resources>
diff --git a/Tethering/res/values-sw/strings.xml b/Tethering/res/values-sw/strings.xml
index 65e4aa8..3e58667 100644
--- a/Tethering/res/values-sw/strings.xml
+++ b/Tethering/res/values-sw/strings.xml
@@ -16,14 +16,14 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="tethered_notification_title" msgid="6426563586025792944">"Kusambaza mtandao au mtandaopepe umewashwa"</string>
- <string name="tethered_notification_message" msgid="64800879503420696">"Gusa ili uweke mipangilio."</string>
- <string name="disable_tether_notification_title" msgid="3004509127903564191">"Umezima kipengele cha kusambaza mtandao"</string>
- <string name="disable_tether_notification_message" msgid="6717523799293901476">"Wasiliana na msimamizi wako ili upate maelezo zaidi"</string>
- <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Mtandaopepe na hali ya kusambaza mtandao"</string>
- <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
- <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
- <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
- <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
- <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
+ <string name="tethered_notification_title" msgid="5350162111436634622">"Umewasha kipengele cha kusambaza mtandao au mtandao pepe"</string>
+ <string name="tethered_notification_message" msgid="2338023450330652098">"Gusa ili uweke mipangilio."</string>
+ <string name="disable_tether_notification_title" msgid="3183576627492925522">"Umezima kipengele cha kusambaza mtandao"</string>
+ <string name="disable_tether_notification_message" msgid="6655882039707534929">"Wasiliana na msimamizi wako ili upate maelezo zaidi"</string>
+ <string name="notification_channel_tethering_status" msgid="7030733422705019001">"Mtandaopepe na hali ya kusambaza mtandao"</string>
+ <string name="no_upstream_notification_title" msgid="2052743091868702475"></string>
+ <string name="no_upstream_notification_message" msgid="6932020551635470134"></string>
+ <string name="no_upstream_notification_disable_button" msgid="8836277213343697023"></string>
+ <string name="upstream_roaming_notification_title" msgid="8614262557406849762"></string>
+ <string name="upstream_roaming_notification_message" msgid="5999740876323106599"></string>
</resources>
diff --git a/Tethering/res/values-ta/strings.xml b/Tethering/res/values-ta/strings.xml
index 4aba62d..a811e67 100644
--- a/Tethering/res/values-ta/strings.xml
+++ b/Tethering/res/values-ta/strings.xml
@@ -16,14 +16,14 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="tethered_notification_title" msgid="6426563586025792944">"டெதெரிங் அல்லது ஹாட்ஸ்பாட் இயங்குகிறது"</string>
- <string name="tethered_notification_message" msgid="64800879503420696">"அமைக்க, தட்டவும்."</string>
- <string name="disable_tether_notification_title" msgid="3004509127903564191">"டெதெரிங் முடக்கப்பட்டுள்ளது"</string>
- <string name="disable_tether_notification_message" msgid="6717523799293901476">"விவரங்களுக்கு உங்கள் நிர்வாகியைத் தொடர்புகொள்ளவும்"</string>
- <string name="notification_channel_tethering_status" msgid="2663463891530932727">"ஹாட்ஸ்பாட் & டெதெரிங் நிலை"</string>
- <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
- <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
- <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
- <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
- <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
+ <string name="tethered_notification_title" msgid="5350162111436634622">"இணைப்பு முறை அல்லது ஹாட்ஸ்பாட் செயல்பாட்டில் உள்ளது"</string>
+ <string name="tethered_notification_message" msgid="2338023450330652098">"அமைக்க தட்டவும்."</string>
+ <string name="disable_tether_notification_title" msgid="3183576627492925522">"இணைப்பு முறை முடக்கப்பட்டுள்ளது"</string>
+ <string name="disable_tether_notification_message" msgid="6655882039707534929">"விவரங்களுக்கு உங்கள் நிர்வாகியைத் தொடர்புகொள்ளவும்"</string>
+ <string name="notification_channel_tethering_status" msgid="7030733422705019001">"ஹாட்ஸ்பாட் & இணைப்பு முறை நிலை"</string>
+ <string name="no_upstream_notification_title" msgid="2052743091868702475"></string>
+ <string name="no_upstream_notification_message" msgid="6932020551635470134"></string>
+ <string name="no_upstream_notification_disable_button" msgid="8836277213343697023"></string>
+ <string name="upstream_roaming_notification_title" msgid="8614262557406849762"></string>
+ <string name="upstream_roaming_notification_message" msgid="5999740876323106599"></string>
</resources>
diff --git a/Tethering/res/values-te/strings.xml b/Tethering/res/values-te/strings.xml
index 1f91791..a92208d 100644
--- a/Tethering/res/values-te/strings.xml
+++ b/Tethering/res/values-te/strings.xml
@@ -16,14 +16,14 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="tethered_notification_title" msgid="6426563586025792944">"టెథరింగ్ లేదా హాట్స్పాట్ యాక్టివ్గా ఉంది"</string>
- <string name="tethered_notification_message" msgid="64800879503420696">"సెటప్ చేయడానికి ట్యాప్ చేయండి."</string>
- <string name="disable_tether_notification_title" msgid="3004509127903564191">"టెథరింగ్ డిజేబుల్ చేయబడింది"</string>
- <string name="disable_tether_notification_message" msgid="6717523799293901476">"వివరాల కోసం మీ అడ్మిన్ని సంప్రదించండి"</string>
- <string name="notification_channel_tethering_status" msgid="2663463891530932727">"హాట్స్పాట్ & టెథరింగ్ స్థితి"</string>
- <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
- <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
- <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
- <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
- <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
+ <string name="tethered_notification_title" msgid="5350162111436634622">"టెథరింగ్ లేదా హాట్స్పాట్ యాక్టివ్గా ఉంది"</string>
+ <string name="tethered_notification_message" msgid="2338023450330652098">"సెటప్ చేయడానికి ట్యాప్ చేయండి."</string>
+ <string name="disable_tether_notification_title" msgid="3183576627492925522">"టెథరింగ్ డిజేబుల్ చేయబడింది"</string>
+ <string name="disable_tether_notification_message" msgid="6655882039707534929">"వివరాల కోసం మీ అడ్మిన్ను కాంటాక్ట్ చేయండి"</string>
+ <string name="notification_channel_tethering_status" msgid="7030733422705019001">"హాట్స్పాట్ & టెథరింగ్ స్టేటస్"</string>
+ <string name="no_upstream_notification_title" msgid="2052743091868702475"></string>
+ <string name="no_upstream_notification_message" msgid="6932020551635470134"></string>
+ <string name="no_upstream_notification_disable_button" msgid="8836277213343697023"></string>
+ <string name="upstream_roaming_notification_title" msgid="8614262557406849762"></string>
+ <string name="upstream_roaming_notification_message" msgid="5999740876323106599"></string>
</resources>
diff --git a/Tethering/res/values-th/strings.xml b/Tethering/res/values-th/strings.xml
index 44171c0..5ebbc80 100644
--- a/Tethering/res/values-th/strings.xml
+++ b/Tethering/res/values-th/strings.xml
@@ -16,14 +16,14 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="tethered_notification_title" msgid="6426563586025792944">"การเชื่อมต่ออินเทอร์เน็ตผ่านมือถือหรือฮอตสปอตทำงานอยู่"</string>
- <string name="tethered_notification_message" msgid="64800879503420696">"แตะเพื่อตั้งค่า"</string>
- <string name="disable_tether_notification_title" msgid="3004509127903564191">"ปิดใช้การเชื่อมต่ออินเทอร์เน็ตผ่านมือถือแล้ว"</string>
- <string name="disable_tether_notification_message" msgid="6717523799293901476">"ติดต่อผู้ดูแลระบบเพื่อขอรายละเอียด"</string>
- <string name="notification_channel_tethering_status" msgid="2663463891530932727">"สถานะฮอตสปอตและการเชื่อมต่ออินเทอร์เน็ตผ่านมือถือ"</string>
- <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
- <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
- <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
- <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
- <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
+ <string name="tethered_notification_title" msgid="5350162111436634622">"การเชื่อมต่ออินเทอร์เน็ตผ่านมือถือหรือฮอตสปอตทำงานอยู่"</string>
+ <string name="tethered_notification_message" msgid="2338023450330652098">"แตะเพื่อตั้งค่า"</string>
+ <string name="disable_tether_notification_title" msgid="3183576627492925522">"การเชื่อมต่ออินเทอร์เน็ตผ่านมือถือปิดอยู่"</string>
+ <string name="disable_tether_notification_message" msgid="6655882039707534929">"ติดต่อผู้ดูแลระบบเพื่อขอรายละเอียด"</string>
+ <string name="notification_channel_tethering_status" msgid="7030733422705019001">"สถานะฮอตสปอตและการเชื่อมต่ออินเทอร์เน็ตผ่านมือถือ"</string>
+ <string name="no_upstream_notification_title" msgid="2052743091868702475"></string>
+ <string name="no_upstream_notification_message" msgid="6932020551635470134"></string>
+ <string name="no_upstream_notification_disable_button" msgid="8836277213343697023"></string>
+ <string name="upstream_roaming_notification_title" msgid="8614262557406849762"></string>
+ <string name="upstream_roaming_notification_message" msgid="5999740876323106599"></string>
</resources>
diff --git a/Tethering/res/values-tl/strings.xml b/Tethering/res/values-tl/strings.xml
index 7347dd3..3364e52 100644
--- a/Tethering/res/values-tl/strings.xml
+++ b/Tethering/res/values-tl/strings.xml
@@ -16,14 +16,14 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="tethered_notification_title" msgid="6426563586025792944">"Aktibo ang pag-tether o hotspot"</string>
- <string name="tethered_notification_message" msgid="64800879503420696">"I-tap para i-set up."</string>
- <string name="disable_tether_notification_title" msgid="3004509127903564191">"Naka-disable ang pag-tether"</string>
- <string name="disable_tether_notification_message" msgid="6717523799293901476">"Makipag-ugnayan sa iyong admin para sa mga detalye"</string>
- <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Status ng hotspot at pag-tether"</string>
- <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
- <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
- <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
- <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
- <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
+ <string name="tethered_notification_title" msgid="5350162111436634622">"Aktibo ang pag-tether o hotspot"</string>
+ <string name="tethered_notification_message" msgid="2338023450330652098">"I-tap para i-set up."</string>
+ <string name="disable_tether_notification_title" msgid="3183576627492925522">"Naka-disable ang pag-tether"</string>
+ <string name="disable_tether_notification_message" msgid="6655882039707534929">"Makipag-ugnayan sa iyong admin para sa mga detalye"</string>
+ <string name="notification_channel_tethering_status" msgid="7030733422705019001">"Status ng hotspot at pag-tether"</string>
+ <string name="no_upstream_notification_title" msgid="2052743091868702475"></string>
+ <string name="no_upstream_notification_message" msgid="6932020551635470134"></string>
+ <string name="no_upstream_notification_disable_button" msgid="8836277213343697023"></string>
+ <string name="upstream_roaming_notification_title" msgid="8614262557406849762"></string>
+ <string name="upstream_roaming_notification_message" msgid="5999740876323106599"></string>
</resources>
diff --git a/Tethering/res/values-tr/strings.xml b/Tethering/res/values-tr/strings.xml
index 32030f1..0bb273c 100644
--- a/Tethering/res/values-tr/strings.xml
+++ b/Tethering/res/values-tr/strings.xml
@@ -16,14 +16,14 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="tethered_notification_title" msgid="6426563586025792944">"Tethering veya hotspot etkin"</string>
- <string name="tethered_notification_message" msgid="64800879503420696">"Ayarlamak için dokunun."</string>
- <string name="disable_tether_notification_title" msgid="3004509127903564191">"Tethering devre dışı bırakıldı"</string>
- <string name="disable_tether_notification_message" msgid="6717523799293901476">"Ayrıntılı bilgi için yöneticinize başvurun"</string>
- <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Hotspot ve tethering durumu"</string>
- <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
- <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
- <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
- <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
- <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
+ <string name="tethered_notification_title" msgid="5350162111436634622">"Tethering veya hotspot etkin"</string>
+ <string name="tethered_notification_message" msgid="2338023450330652098">"Ayarlamak için dokunun."</string>
+ <string name="disable_tether_notification_title" msgid="3183576627492925522">"Tethering devre dışı bırakıldı"</string>
+ <string name="disable_tether_notification_message" msgid="6655882039707534929">"Ayrıntılı bilgi için yöneticinize başvurun"</string>
+ <string name="notification_channel_tethering_status" msgid="7030733422705019001">"Hotspot ve tethering durumu"</string>
+ <string name="no_upstream_notification_title" msgid="2052743091868702475"></string>
+ <string name="no_upstream_notification_message" msgid="6932020551635470134"></string>
+ <string name="no_upstream_notification_disable_button" msgid="8836277213343697023"></string>
+ <string name="upstream_roaming_notification_title" msgid="8614262557406849762"></string>
+ <string name="upstream_roaming_notification_message" msgid="5999740876323106599"></string>
</resources>
diff --git a/Tethering/res/values-uk/strings.xml b/Tethering/res/values-uk/strings.xml
index 1ca89b3..11962e5 100644
--- a/Tethering/res/values-uk/strings.xml
+++ b/Tethering/res/values-uk/strings.xml
@@ -16,14 +16,14 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="tethered_notification_title" msgid="6426563586025792944">"Модем чи точка доступу активні"</string>
- <string name="tethered_notification_message" msgid="64800879503420696">"Натисніть, щоб налаштувати."</string>
- <string name="disable_tether_notification_title" msgid="3004509127903564191">"Використання телефона як модема вимкнено"</string>
- <string name="disable_tether_notification_message" msgid="6717523799293901476">"Щоб дізнатися більше, зв\'яжіться з адміністратором"</string>
- <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Статус точки доступу та модема"</string>
- <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
- <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
- <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
- <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
- <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
+ <string name="tethered_notification_title" msgid="5350162111436634622">"Модем чи точка доступу активні"</string>
+ <string name="tethered_notification_message" msgid="2338023450330652098">"Натисніть, щоб налаштувати."</string>
+ <string name="disable_tether_notification_title" msgid="3183576627492925522">"Використання телефона як модема вимкнено"</string>
+ <string name="disable_tether_notification_message" msgid="6655882039707534929">"Щоб дізнатися більше, зверніться до адміністратора"</string>
+ <string name="notification_channel_tethering_status" msgid="7030733422705019001">"Статус точки доступу й модема"</string>
+ <string name="no_upstream_notification_title" msgid="2052743091868702475"></string>
+ <string name="no_upstream_notification_message" msgid="6932020551635470134"></string>
+ <string name="no_upstream_notification_disable_button" msgid="8836277213343697023"></string>
+ <string name="upstream_roaming_notification_title" msgid="8614262557406849762"></string>
+ <string name="upstream_roaming_notification_message" msgid="5999740876323106599"></string>
</resources>
diff --git a/Tethering/res/values-ur/strings.xml b/Tethering/res/values-ur/strings.xml
index d72c7d4..c70e44f 100644
--- a/Tethering/res/values-ur/strings.xml
+++ b/Tethering/res/values-ur/strings.xml
@@ -16,14 +16,14 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="tethered_notification_title" msgid="6426563586025792944">"ٹیدرنگ یا ہاٹ اسپاٹ فعال"</string>
- <string name="tethered_notification_message" msgid="64800879503420696">"سیٹ اپ کرنے کیلئے تھپتھپائیں۔"</string>
- <string name="disable_tether_notification_title" msgid="3004509127903564191">"ٹیدرنگ غیر فعال ہے"</string>
- <string name="disable_tether_notification_message" msgid="6717523799293901476">"تفصیلات کے لئے اپنے منتظم سے رابطہ کریں"</string>
- <string name="notification_channel_tethering_status" msgid="2663463891530932727">"ہاٹ اسپاٹ اور ٹیتھرنگ کا اسٹیٹس"</string>
- <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
- <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
- <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
- <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
- <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
+ <string name="tethered_notification_title" msgid="5350162111436634622">"ٹیدرنگ یا ہاٹ اسپاٹ فعال ہے"</string>
+ <string name="tethered_notification_message" msgid="2338023450330652098">"سیٹ اپ کرنے کیلئے تھپتھپائیں۔"</string>
+ <string name="disable_tether_notification_title" msgid="3183576627492925522">"ٹیدرنگ غیر فعال ہے"</string>
+ <string name="disable_tether_notification_message" msgid="6655882039707534929">"تفصیلات کیلئے اپنے منتظم سے رابطہ کریں"</string>
+ <string name="notification_channel_tethering_status" msgid="7030733422705019001">"ہاٹ اسپاٹ اور ٹیتھرنگ کا اسٹیٹس"</string>
+ <string name="no_upstream_notification_title" msgid="2052743091868702475"></string>
+ <string name="no_upstream_notification_message" msgid="6932020551635470134"></string>
+ <string name="no_upstream_notification_disable_button" msgid="8836277213343697023"></string>
+ <string name="upstream_roaming_notification_title" msgid="8614262557406849762"></string>
+ <string name="upstream_roaming_notification_message" msgid="5999740876323106599"></string>
</resources>
diff --git a/Tethering/res/values-uz/strings.xml b/Tethering/res/values-uz/strings.xml
index af3b2eb..b315901 100644
--- a/Tethering/res/values-uz/strings.xml
+++ b/Tethering/res/values-uz/strings.xml
@@ -16,14 +16,14 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="tethered_notification_title" msgid="6426563586025792944">"Modem rejimi yoki hotspot yoniq"</string>
- <string name="tethered_notification_message" msgid="64800879503420696">"Sozlash uchun bosing."</string>
- <string name="disable_tether_notification_title" msgid="3004509127903564191">"Modem rejimi faolsizlantirildi"</string>
- <string name="disable_tether_notification_message" msgid="6717523799293901476">"Tafsilotlari uchun administratoringizga murojaat qiling"</string>
- <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Hotspot va modem rejimi holati"</string>
- <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
- <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
- <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
- <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
- <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
+ <string name="tethered_notification_title" msgid="5350162111436634622">"Modem rejimi yoki hotspot yoniq"</string>
+ <string name="tethered_notification_message" msgid="2338023450330652098">"Sozlash uchun bosing."</string>
+ <string name="disable_tether_notification_title" msgid="3183576627492925522">"Modem rejimi faolsizlantirildi"</string>
+ <string name="disable_tether_notification_message" msgid="6655882039707534929">"Tafsilotlari uchun administratoringizga murojaat qiling"</string>
+ <string name="notification_channel_tethering_status" msgid="7030733422705019001">"Hotspot va modem rejimi holati"</string>
+ <string name="no_upstream_notification_title" msgid="2052743091868702475"></string>
+ <string name="no_upstream_notification_message" msgid="6932020551635470134"></string>
+ <string name="no_upstream_notification_disable_button" msgid="8836277213343697023"></string>
+ <string name="upstream_roaming_notification_title" msgid="8614262557406849762"></string>
+ <string name="upstream_roaming_notification_message" msgid="5999740876323106599"></string>
</resources>
diff --git a/Tethering/res/values-vi/strings.xml b/Tethering/res/values-vi/strings.xml
index 21a0735..8e1b91e 100644
--- a/Tethering/res/values-vi/strings.xml
+++ b/Tethering/res/values-vi/strings.xml
@@ -16,14 +16,14 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="tethered_notification_title" msgid="6426563586025792944">"Tính năng chia sẻ Internet hoặc điểm phát sóng đang hoạt động"</string>
- <string name="tethered_notification_message" msgid="64800879503420696">"Hãy nhấn để thiết lập."</string>
- <string name="disable_tether_notification_title" msgid="3004509127903564191">"Đã tắt tính năng chia sẻ Internet"</string>
- <string name="disable_tether_notification_message" msgid="6717523799293901476">"Hãy liên hệ với quản trị viên của bạn để biết chi tiết"</string>
- <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Trạng thái điểm phát sóng và chia sẻ Internet"</string>
- <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
- <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
- <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
- <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
- <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
+ <string name="tethered_notification_title" msgid="5350162111436634622">"Tính năng chia sẻ Internet hoặc điểm phát sóng đang hoạt động"</string>
+ <string name="tethered_notification_message" msgid="2338023450330652098">"Hãy nhấn để thiết lập."</string>
+ <string name="disable_tether_notification_title" msgid="3183576627492925522">"Tính năng chia sẻ Internet đã bị tắt"</string>
+ <string name="disable_tether_notification_message" msgid="6655882039707534929">"Hãy liên hệ với quản trị viên của bạn để biết thông tin chi tiết"</string>
+ <string name="notification_channel_tethering_status" msgid="7030733422705019001">"Trạng thái của chế độ cài đặt \"Điểm phát sóng và chia sẻ Internet\""</string>
+ <string name="no_upstream_notification_title" msgid="2052743091868702475"></string>
+ <string name="no_upstream_notification_message" msgid="6932020551635470134"></string>
+ <string name="no_upstream_notification_disable_button" msgid="8836277213343697023"></string>
+ <string name="upstream_roaming_notification_title" msgid="8614262557406849762"></string>
+ <string name="upstream_roaming_notification_message" msgid="5999740876323106599"></string>
</resources>
diff --git a/Tethering/res/values-zh-rCN/strings.xml b/Tethering/res/values-zh-rCN/strings.xml
index 98e3b4b..054344e 100644
--- a/Tethering/res/values-zh-rCN/strings.xml
+++ b/Tethering/res/values-zh-rCN/strings.xml
@@ -16,14 +16,14 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="tethered_notification_title" msgid="6426563586025792944">"网络共享或热点已启用"</string>
- <string name="tethered_notification_message" msgid="64800879503420696">"点按即可设置。"</string>
- <string name="disable_tether_notification_title" msgid="3004509127903564191">"网络共享已停用"</string>
- <string name="disable_tether_notification_message" msgid="6717523799293901476">"如需了解详情,请与您的管理员联系"</string>
- <string name="notification_channel_tethering_status" msgid="2663463891530932727">"热点和网络共享状态"</string>
- <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
- <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
- <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
- <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
- <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
+ <string name="tethered_notification_title" msgid="5350162111436634622">"网络共享或热点已启用"</string>
+ <string name="tethered_notification_message" msgid="2338023450330652098">"点按即可设置。"</string>
+ <string name="disable_tether_notification_title" msgid="3183576627492925522">"网络共享已停用"</string>
+ <string name="disable_tether_notification_message" msgid="6655882039707534929">"如需了解详情,请与您的管理员联系"</string>
+ <string name="notification_channel_tethering_status" msgid="7030733422705019001">"热点和网络共享状态"</string>
+ <string name="no_upstream_notification_title" msgid="2052743091868702475"></string>
+ <string name="no_upstream_notification_message" msgid="6932020551635470134"></string>
+ <string name="no_upstream_notification_disable_button" msgid="8836277213343697023"></string>
+ <string name="upstream_roaming_notification_title" msgid="8614262557406849762"></string>
+ <string name="upstream_roaming_notification_message" msgid="5999740876323106599"></string>
</resources>
diff --git a/Tethering/res/values-zh-rHK/strings.xml b/Tethering/res/values-zh-rHK/strings.xml
index 9cafd42..790d40a 100644
--- a/Tethering/res/values-zh-rHK/strings.xml
+++ b/Tethering/res/values-zh-rHK/strings.xml
@@ -16,14 +16,14 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="tethered_notification_title" msgid="6426563586025792944">"網絡共享或熱點已啟用"</string>
- <string name="tethered_notification_message" msgid="64800879503420696">"輕按即可設定。"</string>
- <string name="disable_tether_notification_title" msgid="3004509127903564191">"網絡共享已停用"</string>
- <string name="disable_tether_notification_message" msgid="6717523799293901476">"請聯絡您的管理員以瞭解詳情"</string>
- <string name="notification_channel_tethering_status" msgid="2663463891530932727">"熱點和網絡共享狀態"</string>
- <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
- <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
- <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
- <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
- <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
+ <string name="tethered_notification_title" msgid="5350162111436634622">"網絡共享或熱點已啟用"</string>
+ <string name="tethered_notification_message" msgid="2338023450330652098">"輕按即可設定。"</string>
+ <string name="disable_tether_notification_title" msgid="3183576627492925522">"網絡共享已停用"</string>
+ <string name="disable_tether_notification_message" msgid="6655882039707534929">"請聯絡你的管理員以瞭解詳情"</string>
+ <string name="notification_channel_tethering_status" msgid="7030733422705019001">"熱點和網絡共享狀態"</string>
+ <string name="no_upstream_notification_title" msgid="2052743091868702475"></string>
+ <string name="no_upstream_notification_message" msgid="6932020551635470134"></string>
+ <string name="no_upstream_notification_disable_button" msgid="8836277213343697023"></string>
+ <string name="upstream_roaming_notification_title" msgid="8614262557406849762"></string>
+ <string name="upstream_roaming_notification_message" msgid="5999740876323106599"></string>
</resources>
diff --git a/Tethering/res/values-zh-rTW/strings.xml b/Tethering/res/values-zh-rTW/strings.xml
index 50a50bf..65a689e 100644
--- a/Tethering/res/values-zh-rTW/strings.xml
+++ b/Tethering/res/values-zh-rTW/strings.xml
@@ -16,14 +16,14 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="tethered_notification_title" msgid="6426563586025792944">"網路共用或無線基地台已啟用"</string>
- <string name="tethered_notification_message" msgid="64800879503420696">"輕觸即可進行設定。"</string>
- <string name="disable_tether_notification_title" msgid="3004509127903564191">"網路共用已停用"</string>
- <string name="disable_tether_notification_message" msgid="6717523799293901476">"詳情請洽你的管理員"</string>
- <string name="notification_channel_tethering_status" msgid="2663463891530932727">"無線基地台與網路共用狀態"</string>
- <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
- <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
- <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
- <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
- <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
+ <string name="tethered_notification_title" msgid="5350162111436634622">"網路共用或無線基地台已啟用"</string>
+ <string name="tethered_notification_message" msgid="2338023450330652098">"輕觸即可設定。"</string>
+ <string name="disable_tether_notification_title" msgid="3183576627492925522">"網路共用已停用"</string>
+ <string name="disable_tether_notification_message" msgid="6655882039707534929">"詳情請洽你的管理員"</string>
+ <string name="notification_channel_tethering_status" msgid="7030733422705019001">"無線基地台與網路共用狀態"</string>
+ <string name="no_upstream_notification_title" msgid="2052743091868702475"></string>
+ <string name="no_upstream_notification_message" msgid="6932020551635470134"></string>
+ <string name="no_upstream_notification_disable_button" msgid="8836277213343697023"></string>
+ <string name="upstream_roaming_notification_title" msgid="8614262557406849762"></string>
+ <string name="upstream_roaming_notification_message" msgid="5999740876323106599"></string>
</resources>
diff --git a/Tethering/res/values-zu/strings.xml b/Tethering/res/values-zu/strings.xml
index f210f87..e9651dd 100644
--- a/Tethering/res/values-zu/strings.xml
+++ b/Tethering/res/values-zu/strings.xml
@@ -16,14 +16,14 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="tethered_notification_title" msgid="6426563586025792944">"Ukusebenzisa njengemodemu noma i-hotspot ephathekayo kuvuliwe"</string>
- <string name="tethered_notification_message" msgid="64800879503420696">"Thepha ukuze usethe."</string>
- <string name="disable_tether_notification_title" msgid="3004509127903564191">"Ukusebenzisa ifoni njengemodemu kukhutshaziwe"</string>
- <string name="disable_tether_notification_message" msgid="6717523799293901476">"Xhumana nomphathi wakho ukuze uthole imininingwane"</string>
- <string name="notification_channel_tethering_status" msgid="2663463891530932727">"I-Hotspot nesimo sokusebenzisa ifoni njengemodemu"</string>
- <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
- <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
- <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
- <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
- <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
+ <string name="tethered_notification_title" msgid="5350162111436634622">"Ukusebenzisa njengemodemu noma i-hotspot ephathekayo kuvuliwe"</string>
+ <string name="tethered_notification_message" msgid="2338023450330652098">"Thepha ukuze usethe."</string>
+ <string name="disable_tether_notification_title" msgid="3183576627492925522">"Ukusebenzisa ifoni njengemodemu kukhutshaziwe"</string>
+ <string name="disable_tether_notification_message" msgid="6655882039707534929">"Xhumana nomphathi wakho ukuze uthole imininingwane"</string>
+ <string name="notification_channel_tethering_status" msgid="7030733422705019001">"I-Hotspot nesimo sokusebenzisa ifoni njengemodemu"</string>
+ <string name="no_upstream_notification_title" msgid="2052743091868702475"></string>
+ <string name="no_upstream_notification_message" msgid="6932020551635470134"></string>
+ <string name="no_upstream_notification_disable_button" msgid="8836277213343697023"></string>
+ <string name="upstream_roaming_notification_title" msgid="8614262557406849762"></string>
+ <string name="upstream_roaming_notification_message" msgid="5999740876323106599"></string>
</resources>
diff --git a/Tethering/src/android/net/ip/IpServer.java b/Tethering/src/android/net/ip/IpServer.java
index 65ea8e5..6affb62 100644
--- a/Tethering/src/android/net/ip/IpServer.java
+++ b/Tethering/src/android/net/ip/IpServer.java
@@ -17,6 +17,8 @@
package android.net.ip;
import static android.net.RouteInfo.RTN_UNICAST;
+import static android.net.TetheringManager.CONNECTIVITY_SCOPE_GLOBAL;
+import static android.net.TetheringManager.CONNECTIVITY_SCOPE_LOCAL;
import static android.net.TetheringManager.TETHER_ERROR_DHCPSERVER_ERROR;
import static android.net.TetheringManager.TETHER_ERROR_ENABLE_FORWARDING_ERROR;
import static android.net.TetheringManager.TETHER_ERROR_IFACE_CFG_ERROR;
@@ -405,8 +407,8 @@
/** Internals. */
- private boolean startIPv4() {
- return configureIPv4(true);
+ private boolean startIPv4(int scope) {
+ return configureIPv4(true, scope);
}
/**
@@ -616,7 +618,7 @@
}
private void stopIPv4() {
- configureIPv4(false);
+ configureIPv4(false /* enabled */, CONNECTIVITY_SCOPE_GLOBAL /* not used */);
// NOTE: All of configureIPv4() will be refactored out of existence
// into calls to InterfaceController, shared with startIPv4().
mInterfaceCtrl.clearIPv4Address();
@@ -627,11 +629,11 @@
mStaticIpv4ClientAddr = null;
}
- private boolean configureIPv4(boolean enabled) {
+ private boolean configureIPv4(boolean enabled, int scope) {
if (VDBG) Log.d(TAG, "configureIPv4(" + enabled + ")");
if (enabled) {
- mIpv4Address = requestIpv4Address(true /* useLastAddress */);
+ mIpv4Address = requestIpv4Address(scope, true /* useLastAddress */);
}
if (mIpv4Address == null) {
@@ -679,12 +681,12 @@
return (mInterfaceType == TetheringManager.TETHERING_BLUETOOTH) && !SdkLevel.isAtLeastT();
}
- private LinkAddress requestIpv4Address(final boolean useLastAddress) {
+ private LinkAddress requestIpv4Address(final int scope, final boolean useLastAddress) {
if (mStaticIpv4ServerAddr != null) return mStaticIpv4ServerAddr;
if (shouldNotConfigureBluetoothInterface()) return new LinkAddress(BLUETOOTH_IFACE_ADDR);
- return mPrivateAddressCoordinator.requestDownstreamAddress(this, useLastAddress);
+ return mPrivateAddressCoordinator.requestDownstreamAddress(this, scope, useLastAddress);
}
private boolean startIPv6() {
@@ -998,67 +1000,6 @@
}
}
- private void handleNewPrefixRequest(@NonNull final IpPrefix currentPrefix) {
- if (!currentPrefix.contains(mIpv4Address.getAddress())
- || currentPrefix.getPrefixLength() != mIpv4Address.getPrefixLength()) {
- Log.e(TAG, "Invalid prefix: " + currentPrefix);
- return;
- }
-
- final LinkAddress deprecatedLinkAddress = mIpv4Address;
- mIpv4Address = requestIpv4Address(false);
- if (mIpv4Address == null) {
- mLog.e("Fail to request a new downstream prefix");
- return;
- }
- final Inet4Address srvAddr = (Inet4Address) mIpv4Address.getAddress();
-
- // Add new IPv4 address on the interface.
- if (!mInterfaceCtrl.addAddress(srvAddr, currentPrefix.getPrefixLength())) {
- mLog.e("Failed to add new IP " + srvAddr);
- return;
- }
-
- // Remove deprecated routes from local network.
- removeRoutesFromLocalNetwork(
- Collections.singletonList(getDirectConnectedRoute(deprecatedLinkAddress)));
- mLinkProperties.removeLinkAddress(deprecatedLinkAddress);
-
- // Add new routes to local network.
- addRoutesToLocalNetwork(
- Collections.singletonList(getDirectConnectedRoute(mIpv4Address)));
- mLinkProperties.addLinkAddress(mIpv4Address);
-
- // Update local DNS caching server with new IPv4 address, otherwise, dnsmasq doesn't
- // listen on the interface configured with new IPv4 address, that results DNS validation
- // failure of downstream client even if appropriate routes have been configured.
- try {
- mNetd.tetherApplyDnsInterfaces();
- } catch (ServiceSpecificException | RemoteException e) {
- mLog.e("Failed to update local DNS caching server");
- return;
- }
- sendLinkProperties();
-
- // Notify DHCP server that new prefix/route has been applied on IpServer.
- final Inet4Address clientAddr = mStaticIpv4ClientAddr == null ? null :
- (Inet4Address) mStaticIpv4ClientAddr.getAddress();
- final DhcpServingParamsParcel params = makeServingParams(srvAddr /* defaultRouter */,
- srvAddr /* dnsServer */, mIpv4Address /* serverLinkAddress */, clientAddr);
- try {
- mDhcpServer.updateParams(params, new OnHandlerStatusCallback() {
- @Override
- public void callback(int statusCode) {
- if (statusCode != STATUS_SUCCESS) {
- mLog.e("Error updating DHCP serving params: " + statusCode);
- }
- }
- });
- } catch (RemoteException e) {
- mLog.e("Error updating DHCP serving params", e);
- }
- }
-
private byte getHopLimit(String upstreamIface, int adjustTTL) {
try {
int upstreamHopLimit = Integer.parseUnsignedInt(
@@ -1173,12 +1114,37 @@
mBpfCoordinator.stopMonitoring(this);
}
- class BaseServingState extends State {
+ abstract class BaseServingState extends State {
+ private final int mDesiredInterfaceState;
+
+ BaseServingState(int interfaceState) {
+ mDesiredInterfaceState = interfaceState;
+ }
+
@Override
public void enter() {
startConntrackMonitoring();
- if (!startIPv4()) {
+ startServingInterface();
+
+ if (mLastError != TETHER_ERROR_NO_ERROR) {
+ transitionTo(mInitialState);
+ }
+
+ if (DBG) Log.d(TAG, getStateString(mDesiredInterfaceState) + " serve " + mIfaceName);
+ sendInterfaceState(mDesiredInterfaceState);
+ }
+
+ private int getScope() {
+ if (mDesiredInterfaceState == STATE_TETHERED) {
+ return CONNECTIVITY_SCOPE_GLOBAL;
+ }
+
+ return CONNECTIVITY_SCOPE_LOCAL;
+ }
+
+ private void startServingInterface() {
+ if (!startIPv4(getScope())) {
mLastError = TETHER_ERROR_IFACE_CFG_ERROR;
return;
}
@@ -1257,6 +1223,67 @@
}
return true;
}
+
+ private void handleNewPrefixRequest(@NonNull final IpPrefix currentPrefix) {
+ if (!currentPrefix.contains(mIpv4Address.getAddress())
+ || currentPrefix.getPrefixLength() != mIpv4Address.getPrefixLength()) {
+ Log.e(TAG, "Invalid prefix: " + currentPrefix);
+ return;
+ }
+
+ final LinkAddress deprecatedLinkAddress = mIpv4Address;
+ mIpv4Address = requestIpv4Address(getScope(), false);
+ if (mIpv4Address == null) {
+ mLog.e("Fail to request a new downstream prefix");
+ return;
+ }
+ final Inet4Address srvAddr = (Inet4Address) mIpv4Address.getAddress();
+
+ // Add new IPv4 address on the interface.
+ if (!mInterfaceCtrl.addAddress(srvAddr, currentPrefix.getPrefixLength())) {
+ mLog.e("Failed to add new IP " + srvAddr);
+ return;
+ }
+
+ // Remove deprecated routes from local network.
+ removeRoutesFromLocalNetwork(
+ Collections.singletonList(getDirectConnectedRoute(deprecatedLinkAddress)));
+ mLinkProperties.removeLinkAddress(deprecatedLinkAddress);
+
+ // Add new routes to local network.
+ addRoutesToLocalNetwork(
+ Collections.singletonList(getDirectConnectedRoute(mIpv4Address)));
+ mLinkProperties.addLinkAddress(mIpv4Address);
+
+ // Update local DNS caching server with new IPv4 address, otherwise, dnsmasq doesn't
+ // listen on the interface configured with new IPv4 address, that results DNS validation
+ // failure of downstream client even if appropriate routes have been configured.
+ try {
+ mNetd.tetherApplyDnsInterfaces();
+ } catch (ServiceSpecificException | RemoteException e) {
+ mLog.e("Failed to update local DNS caching server");
+ return;
+ }
+ sendLinkProperties();
+
+ // Notify DHCP server that new prefix/route has been applied on IpServer.
+ final Inet4Address clientAddr = mStaticIpv4ClientAddr == null ? null :
+ (Inet4Address) mStaticIpv4ClientAddr.getAddress();
+ final DhcpServingParamsParcel params = makeServingParams(srvAddr /* defaultRouter */,
+ srvAddr /* dnsServer */, mIpv4Address /* serverLinkAddress */, clientAddr);
+ try {
+ mDhcpServer.updateParams(params, new OnHandlerStatusCallback() {
+ @Override
+ public void callback(int statusCode) {
+ if (statusCode != STATUS_SUCCESS) {
+ mLog.e("Error updating DHCP serving params: " + statusCode);
+ }
+ }
+ });
+ } catch (RemoteException e) {
+ mLog.e("Error updating DHCP serving params", e);
+ }
+ }
}
// Handling errors in BaseServingState.enter() by transitioning is
@@ -1265,15 +1292,8 @@
// and forwarding and NAT rules should be handled by a coordinating
// functional element outside of IpServer.
class LocalHotspotState extends BaseServingState {
- @Override
- public void enter() {
- super.enter();
- if (mLastError != TETHER_ERROR_NO_ERROR) {
- transitionTo(mInitialState);
- }
-
- if (DBG) Log.d(TAG, "Local hotspot " + mIfaceName);
- sendInterfaceState(STATE_LOCAL_ONLY);
+ LocalHotspotState() {
+ super(STATE_LOCAL_ONLY);
}
@Override
@@ -1301,15 +1321,8 @@
// and forwarding and NAT rules should be handled by a coordinating
// functional element outside of IpServer.
class TetheredState extends BaseServingState {
- @Override
- public void enter() {
- super.enter();
- if (mLastError != TETHER_ERROR_NO_ERROR) {
- transitionTo(mInitialState);
- }
-
- if (DBG) Log.d(TAG, "Tethered " + mIfaceName);
- sendInterfaceState(STATE_TETHERED);
+ TetheredState() {
+ super(STATE_TETHERED);
}
@Override
diff --git a/Tethering/src/android/net/ip/RouterAdvertisementDaemon.java b/Tethering/src/android/net/ip/RouterAdvertisementDaemon.java
index 775c36f..18c2171 100644
--- a/Tethering/src/android/net/ip/RouterAdvertisementDaemon.java
+++ b/Tethering/src/android/net/ip/RouterAdvertisementDaemon.java
@@ -129,9 +129,6 @@
// Tethered traffic will have the hop limit properly decremented.
// Consequently, set the hoplimit greater by one than the upstream
// unicast hop limit.
- //
- // TODO: Dynamically pass down the IPV6_UNICAST_HOPS value from the
- // upstream interface for more correct behaviour.
static final byte DEFAULT_HOPLIMIT = 65;
public boolean hasDefaultRoute;
diff --git a/Tethering/src/com/android/networkstack/tethering/BpfCoordinator.java b/Tethering/src/com/android/networkstack/tethering/BpfCoordinator.java
index 9f8d9b1..976f5df 100644
--- a/Tethering/src/com/android/networkstack/tethering/BpfCoordinator.java
+++ b/Tethering/src/com/android/networkstack/tethering/BpfCoordinator.java
@@ -37,6 +37,7 @@
import android.app.usage.NetworkStatsManager;
import android.net.INetd;
+import android.net.LinkProperties;
import android.net.MacAddress;
import android.net.NetworkStats;
import android.net.NetworkStats.Entry;
@@ -878,6 +879,27 @@
return true;
}
+ private int getMtu(@NonNull final String ifaceName, @NonNull final LinkProperties lp) {
+ int mtu = INVALID_MTU;
+
+ if (ifaceName.equals(lp.getInterfaceName())) {
+ mtu = lp.getMtu();
+ }
+
+ // Get mtu via kernel if mtu is not found in LinkProperties.
+ if (mtu == INVALID_MTU) {
+ mtu = mDeps.getNetworkInterfaceMtu(ifaceName);
+ }
+
+ // Use default mtu if can't find any.
+ if (mtu == INVALID_MTU) mtu = NetworkStackConstants.ETHER_MTU;
+
+ // Clamp to minimum ipv4 mtu
+ if (mtu < IPV4_MIN_MTU) mtu = IPV4_MIN_MTU;
+
+ return mtu;
+ }
+
/**
* Call when UpstreamNetworkState may be changed.
* If upstream has ipv4 for tethering, update this new UpstreamNetworkState
@@ -900,16 +922,7 @@
final String ifaceName = ns.linkProperties.getInterfaceName();
final InterfaceParams params = mDeps.getInterfaceParams(ifaceName);
final boolean isVcn = isVcnInterface(ifaceName);
- mtu = ns.linkProperties.getMtu();
- if (mtu == INVALID_MTU) {
- // Get mtu via kernel if mtu is not found in LinkProperties.
- mtu = mDeps.getNetworkInterfaceMtu(ifaceName);
- }
-
- // Use default mtu if can't find any.
- if (mtu == INVALID_MTU) mtu = NetworkStackConstants.ETHER_MTU;
- // Clamp to minimum ipv4 mtu
- if (mtu < IPV4_MIN_MTU) mtu = IPV4_MIN_MTU;
+ mtu = getMtu(ifaceName, ns.linkProperties);
if (!isVcn && params != null && !params.hasMacAddress /* raw ip upstream only */) {
upstreamIndex = params.index;
diff --git a/Tethering/src/com/android/networkstack/tethering/ConnectedClientsTracker.java b/Tethering/src/com/android/networkstack/tethering/ConnectedClientsTracker.java
index 8a96988..5b19c4e 100644
--- a/Tethering/src/com/android/networkstack/tethering/ConnectedClientsTracker.java
+++ b/Tethering/src/com/android/networkstack/tethering/ConnectedClientsTracker.java
@@ -29,6 +29,8 @@
import androidx.annotation.Nullable;
import androidx.annotation.VisibleForTesting;
+import com.android.modules.utils.build.SdkLevel;
+
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
@@ -49,6 +51,8 @@
@NonNull
private List<WifiClient> mLastWifiClients = Collections.emptyList();
@NonNull
+ private List<WifiClient> mLastLocalOnlyClients = Collections.emptyList();
+ @NonNull
private List<TetheredClient> mLastTetheredClients = Collections.emptyList();
@VisibleForTesting
@@ -72,25 +76,44 @@
*
* <p>The new list can be obtained through {@link #getLastTetheredClients()}.
* @param ipServers The IpServers used to assign addresses to clients.
- * @param wifiClients The list of L2-connected WiFi clients. Null for no change since last
- * update.
+ * @param wifiClients The list of L2-connected WiFi clients that are connected to a global
+ * hotspot. Null for no change since last update.
+ * @param localOnlyClients The list of L2-connected WiFi clients that are connected to localOnly
+ * hotspot. Null for no change since last update.
* @return True if the list of clients changed since the last calculation.
*/
public boolean updateConnectedClients(
- Iterable<IpServer> ipServers, @Nullable List<WifiClient> wifiClients) {
+ Iterable<IpServer> ipServers, @Nullable List<WifiClient> wifiClients,
+ @Nullable List<WifiClient> localOnlyClients) {
final long now = mClock.elapsedRealtime();
- if (wifiClients != null) {
- mLastWifiClients = wifiClients;
- }
+ if (wifiClients != null) mLastWifiClients = wifiClients;
+ if (localOnlyClients != null) mLastLocalOnlyClients = localOnlyClients;
+
final Set<MacAddress> wifiClientMacs = getClientMacs(mLastWifiClients);
+ final Set<MacAddress> localOnlyClientMacs = getClientMacs(mLastLocalOnlyClients);
// Build the list of non-expired leases from all IpServers, grouped by mac address
final Map<MacAddress, TetheredClient> clientsMap = new HashMap<>();
for (IpServer server : ipServers) {
+ final Set<MacAddress> connectedClientMacs;
+ switch (server.servingMode()) {
+ case IpServer.STATE_TETHERED:
+ connectedClientMacs = wifiClientMacs;
+ break;
+ case IpServer.STATE_LOCAL_ONLY:
+ // Before T, SAP and LOHS both use wifiClientMacs because
+ // registerLocalOnlyHotspotSoftApCallback didn't exist.
+ connectedClientMacs = SdkLevel.isAtLeastT()
+ ? localOnlyClientMacs : wifiClientMacs;
+ break;
+ default:
+ continue;
+ }
+
for (TetheredClient client : server.getAllLeases()) {
if (client.getTetheringType() == TETHERING_WIFI
- && !wifiClientMacs.contains(client.getMacAddress())) {
+ && !connectedClientMacs.contains(client.getMacAddress())) {
// Skip leases of WiFi clients that are not (or no longer) L2-connected
continue;
}
@@ -104,11 +127,8 @@
// TODO: add IPv6 addresses from netlink
// Add connected WiFi clients that do not have any known address
- for (MacAddress client : wifiClientMacs) {
- if (clientsMap.containsKey(client)) continue;
- clientsMap.put(client, new TetheredClient(
- client, Collections.emptyList() /* addresses */, TETHERING_WIFI));
- }
+ addWifiClientsIfNoLeases(clientsMap, wifiClientMacs);
+ addWifiClientsIfNoLeases(clientsMap, localOnlyClientMacs);
final HashSet<TetheredClient> clients = new HashSet<>(clientsMap.values());
final boolean clientsChanged = clients.size() != mLastTetheredClients.size()
@@ -117,6 +137,15 @@
return clientsChanged;
}
+ private static void addWifiClientsIfNoLeases(
+ final Map<MacAddress, TetheredClient> clientsMap, final Set<MacAddress> clientMacs) {
+ for (MacAddress mac : clientMacs) {
+ if (clientsMap.containsKey(mac)) continue;
+ clientsMap.put(mac, new TetheredClient(
+ mac, Collections.emptyList() /* addresses */, TETHERING_WIFI));
+ }
+ }
+
private static void addLease(Map<MacAddress, TetheredClient> clientsMap, TetheredClient lease) {
final TetheredClient aggregateClient = clientsMap.getOrDefault(
lease.getMacAddress(), lease);
diff --git a/Tethering/src/com/android/networkstack/tethering/EntitlementManager.java b/Tethering/src/com/android/networkstack/tethering/EntitlementManager.java
index 6d502ce..b88b13b 100644
--- a/Tethering/src/com/android/networkstack/tethering/EntitlementManager.java
+++ b/Tethering/src/com/android/networkstack/tethering/EntitlementManager.java
@@ -459,8 +459,9 @@
}
@VisibleForTesting
- PendingIntent createRecheckAlarmIntent() {
+ PendingIntent createRecheckAlarmIntent(final String pkgName) {
final Intent intent = new Intent(ACTION_PROVISIONING_ALARM);
+ intent.setPackage(pkgName);
return PendingIntent.getBroadcast(mContext, 0, intent, PendingIntent.FLAG_IMMUTABLE);
}
@@ -470,7 +471,7 @@
final int period = config.provisioningCheckPeriod;
if (period <= 0) return;
- mProvisioningRecheckAlarm = createRecheckAlarmIntent();
+ mProvisioningRecheckAlarm = createRecheckAlarmIntent(mContext.getPackageName());
AlarmManager alarmManager = (AlarmManager) mContext.getSystemService(
Context.ALARM_SERVICE);
long triggerAtMillis = SystemClock.elapsedRealtime() + (period * MS_PER_HOUR);
diff --git a/Tethering/src/com/android/networkstack/tethering/IOffloadHal.java b/Tethering/src/com/android/networkstack/tethering/IOffloadHal.java
new file mode 100644
index 0000000..e66e7ae
--- /dev/null
+++ b/Tethering/src/com/android/networkstack/tethering/IOffloadHal.java
@@ -0,0 +1,64 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.networkstack.tethering;
+
+import android.annotation.NonNull;
+import android.os.NativeHandle;
+
+import com.android.networkstack.tethering.OffloadHardwareInterface.ForwardedStats;
+import com.android.networkstack.tethering.OffloadHardwareInterface.OffloadHalCallback;
+
+import java.util.ArrayList;
+
+/** Abstraction of Tetheroffload HAL interface */
+interface IOffloadHal {
+ /*
+ * Initialize the Tetheroffload HAL. Offload management process need to know conntrack rules to
+ * support NAT, but it may not have permission to create netlink netfilter sockets. Create two
+ * netlink netfilter sockets and share them with offload management process.
+ */
+ boolean initOffload(@NonNull NativeHandle handle1, @NonNull NativeHandle handle2,
+ @NonNull OffloadHalCallback callback);
+
+ /** Stop the Tetheroffload HAL. */
+ boolean stopOffload();
+
+ /** Get HAL interface version number. */
+ int getVersion();
+
+ /** Get Tx/Rx usage from last query. */
+ ForwardedStats getForwardedStats(@NonNull String upstream);
+
+ /** Set local prefixes to offload management process. */
+ boolean setLocalPrefixes(@NonNull ArrayList<String> localPrefixes);
+
+ /** Set data limit value to offload management process. */
+ boolean setDataLimit(@NonNull String iface, long limit);
+
+ /** Set data warning and limit value to offload management process. */
+ boolean setDataWarningAndLimit(@NonNull String iface, long warning, long limit);
+
+ /** Set upstream parameters to offload management process. */
+ boolean setUpstreamParameters(@NonNull String iface, @NonNull String v4addr,
+ @NonNull String v4gateway, @NonNull ArrayList<String> v6gws);
+
+ /** Add downstream prefix to offload management process. */
+ boolean addDownstream(@NonNull String ifname, @NonNull String prefix);
+
+ /** Remove downstream prefix from offload management process. */
+ boolean removeDownstream(@NonNull String ifname, @NonNull String prefix);
+}
diff --git a/Tethering/src/com/android/networkstack/tethering/OffloadController.java b/Tethering/src/com/android/networkstack/tethering/OffloadController.java
index d2f177d..b4c0d6a 100644
--- a/Tethering/src/com/android/networkstack/tethering/OffloadController.java
+++ b/Tethering/src/com/android/networkstack/tethering/OffloadController.java
@@ -26,8 +26,8 @@
import static android.net.netstats.provider.NetworkStatsProvider.QUOTA_UNLIMITED;
import static android.provider.Settings.Global.TETHER_OFFLOAD_DISABLED;
-import static com.android.networkstack.tethering.OffloadHardwareInterface.OFFLOAD_HAL_VERSION_1_0;
-import static com.android.networkstack.tethering.OffloadHardwareInterface.OFFLOAD_HAL_VERSION_1_1;
+import static com.android.networkstack.tethering.OffloadHardwareInterface.OFFLOAD_HAL_VERSION_HIDL_1_0;
+import static com.android.networkstack.tethering.OffloadHardwareInterface.OFFLOAD_HAL_VERSION_HIDL_1_1;
import static com.android.networkstack.tethering.OffloadHardwareInterface.OFFLOAD_HAL_VERSION_NONE;
import static com.android.networkstack.tethering.TetheringConfiguration.DEFAULT_TETHER_OFFLOAD_POLL_INTERVAL_MS;
@@ -98,9 +98,8 @@
private final OffloadTetheringStatsProvider mStatsProvider;
private final SharedLog mLog;
private final HashMap<String, LinkProperties> mDownstreams;
- private boolean mConfigInitialized;
@OffloadHardwareInterface.OffloadHalVersion
- private int mControlHalVersion;
+ private int mOffloadHalVersion;
private LinkProperties mUpstreamLinkProperties;
// The complete set of offload-exempt prefixes passed in via Tethering from
// all upstream and downstream sources.
@@ -205,20 +204,11 @@
return false;
}
- if (!mConfigInitialized) {
- mConfigInitialized = mHwInterface.initOffloadConfig();
- if (!mConfigInitialized) {
- mLog.i("tethering offload config not supported");
- stop();
- return false;
- }
- }
-
- mControlHalVersion = mHwInterface.initOffloadControl(
+ mOffloadHalVersion = mHwInterface.initOffload(
// OffloadHardwareInterface guarantees that these callback
// methods are called on the handler passed to it, which is the
// same as mHandler, as coordinated by the setup in Tethering.
- new OffloadHardwareInterface.ControlCallback() {
+ new OffloadHardwareInterface.OffloadHalCallback() {
@Override
public void onStarted() {
if (!started()) return;
@@ -305,11 +295,11 @@
final boolean isStarted = started();
if (!isStarted) {
- mLog.i("tethering offload control not supported");
+ mLog.i("tethering offload not supported");
stop();
} else {
mLog.log("tethering offload started, version: "
- + OffloadHardwareInterface.halVerToString(mControlHalVersion));
+ + OffloadHardwareInterface.halVerToString(mOffloadHalVersion));
mNatUpdateCallbacksReceived = 0;
mNatUpdateNetlinkErrors = 0;
maybeSchedulePollingStats();
@@ -325,9 +315,8 @@
final boolean wasStarted = started();
updateStatsForCurrentUpstream();
mUpstreamLinkProperties = null;
- mHwInterface.stopOffloadControl();
- mControlHalVersion = OFFLOAD_HAL_VERSION_NONE;
- mConfigInitialized = false;
+ mHwInterface.stopOffload();
+ mOffloadHalVersion = OFFLOAD_HAL_VERSION_NONE;
if (mHandler.hasCallbacks(mScheduledPollingTask)) {
mHandler.removeCallbacks(mScheduledPollingTask);
}
@@ -335,7 +324,7 @@
}
private boolean started() {
- return mConfigInitialized && mControlHalVersion != OFFLOAD_HAL_VERSION_NONE;
+ return mOffloadHalVersion != OFFLOAD_HAL_VERSION_NONE;
}
@VisibleForTesting
@@ -528,7 +517,7 @@
}
private boolean useStatsPolling() {
- return mControlHalVersion == OFFLOAD_HAL_VERSION_1_0;
+ return mOffloadHalVersion == OFFLOAD_HAL_VERSION_HIDL_1_0;
}
private boolean maybeUpdateDataWarningAndLimit(String iface) {
@@ -540,7 +529,7 @@
final InterfaceQuota quota = mInterfaceQuotas.getOrDefault(iface, InterfaceQuota.MAX_VALUE);
final boolean ret;
- if (mControlHalVersion >= OFFLOAD_HAL_VERSION_1_1) {
+ if (mOffloadHalVersion >= OFFLOAD_HAL_VERSION_HIDL_1_1) {
ret = mHwInterface.setDataWarningAndLimit(iface, quota.warningBytes, quota.limitBytes);
} else {
ret = mHwInterface.setDataLimit(iface, quota.limitBytes);
@@ -611,7 +600,7 @@
for (RouteInfo ri : oldRoutes) {
if (shouldIgnoreDownstreamRoute(ri)) continue;
if (!newRoutes.contains(ri)) {
- mHwInterface.removeDownstreamPrefix(ifname, ri.getDestination().toString());
+ mHwInterface.removeDownstream(ifname, ri.getDestination().toString());
}
}
@@ -619,7 +608,7 @@
for (RouteInfo ri : newRoutes) {
if (shouldIgnoreDownstreamRoute(ri)) continue;
if (!oldRoutes.contains(ri)) {
- mHwInterface.addDownstreamPrefix(ifname, ri.getDestination().toString());
+ mHwInterface.addDownstream(ifname, ri.getDestination().toString());
}
}
}
@@ -639,7 +628,7 @@
for (RouteInfo route : lp.getRoutes()) {
if (shouldIgnoreDownstreamRoute(route)) continue;
- mHwInterface.removeDownstreamPrefix(ifname, route.getDestination().toString());
+ mHwInterface.removeDownstream(ifname, route.getDestination().toString());
}
}
@@ -768,11 +757,21 @@
final boolean isStarted = started();
pw.println("Offload HALs " + (isStarted ? "started" : "not started"));
pw.println("Offload Control HAL version: "
- + OffloadHardwareInterface.halVerToString(mControlHalVersion));
+ + OffloadHardwareInterface.halVerToString(mOffloadHalVersion));
LinkProperties lp = mUpstreamLinkProperties;
String upstream = (lp != null) ? lp.getInterfaceName() : null;
pw.println("Current upstream: " + upstream);
pw.println("Exempt prefixes: " + mLastLocalPrefixStrs);
+ pw.println("ForwardedStats:");
+ pw.increaseIndent();
+ if (mForwardedStats.isEmpty()) {
+ pw.println("<empty>");
+ } else {
+ for (final Map.Entry<String, ForwardedStats> kv : mForwardedStats.entrySet()) {
+ pw.println(kv.getKey() + ": " + kv.getValue());
+ }
+ }
+ pw.decreaseIndent();
pw.println("NAT timeout update callbacks received during the "
+ (isStarted ? "current" : "last")
+ " offload session: "
diff --git a/Tethering/src/com/android/networkstack/tethering/OffloadHalAidlImpl.java b/Tethering/src/com/android/networkstack/tethering/OffloadHalAidlImpl.java
new file mode 100644
index 0000000..e7dc757
--- /dev/null
+++ b/Tethering/src/com/android/networkstack/tethering/OffloadHalAidlImpl.java
@@ -0,0 +1,304 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.networkstack.tethering;
+
+import static com.android.networkstack.tethering.OffloadHardwareInterface.OFFLOAD_HAL_VERSION_AIDL;
+
+import android.annotation.NonNull;
+import android.hardware.tetheroffload.ForwardedStats;
+import android.hardware.tetheroffload.IOffload;
+import android.hardware.tetheroffload.ITetheringOffloadCallback;
+import android.hardware.tetheroffload.NatTimeoutUpdate;
+import android.hardware.tetheroffload.NetworkProtocol;
+import android.hardware.tetheroffload.OffloadCallbackEvent;
+import android.os.Handler;
+import android.os.NativeHandle;
+import android.os.ParcelFileDescriptor;
+import android.os.ServiceManager;
+import android.system.OsConstants;
+
+import com.android.modules.utils.build.SdkLevel;
+import com.android.net.module.util.SharedLog;
+import com.android.networkstack.tethering.OffloadHardwareInterface.OffloadHalCallback;
+
+import java.util.ArrayList;
+
+/**
+ * The implementation of IOffloadHal which based on Stable AIDL interface
+ */
+public class OffloadHalAidlImpl implements IOffloadHal {
+ private static final String TAG = OffloadHalAidlImpl.class.getSimpleName();
+ private static final String HAL_INSTANCE_NAME = IOffload.DESCRIPTOR + "/default";
+
+ private final Handler mHandler;
+ private final SharedLog mLog;
+ private final IOffload mIOffload;
+ @OffloadHardwareInterface.OffloadHalVersion
+ private final int mOffloadVersion;
+
+ private TetheringOffloadCallback mTetheringOffloadCallback;
+
+ public OffloadHalAidlImpl(int version, @NonNull IOffload offload, @NonNull Handler handler,
+ @NonNull SharedLog log) {
+ mOffloadVersion = version;
+ mIOffload = offload;
+ mHandler = handler;
+ mLog = log.forSubComponent(TAG);
+ }
+
+ /**
+ * Initialize the Tetheroffload HAL. Provides bound netlink file descriptors for use in the
+ * management process.
+ */
+ public boolean initOffload(@NonNull NativeHandle handle1, @NonNull NativeHandle handle2,
+ @NonNull OffloadHalCallback callback) {
+ final String methodStr = String.format("initOffload(%d, %d, %s)",
+ handle1.getFileDescriptor().getInt$(), handle2.getFileDescriptor().getInt$(),
+ (callback == null) ? "null"
+ : "0x" + Integer.toHexString(System.identityHashCode(callback)));
+ mTetheringOffloadCallback = new TetheringOffloadCallback(mHandler, callback, mLog);
+ try {
+ mIOffload.initOffload(
+ ParcelFileDescriptor.adoptFd(handle1.getFileDescriptor().getInt$()),
+ ParcelFileDescriptor.adoptFd(handle2.getFileDescriptor().getInt$()),
+ mTetheringOffloadCallback);
+ } catch (Exception e) {
+ logAndIgnoreException(e, methodStr);
+ return false;
+ }
+ mLog.i(methodStr);
+ return true;
+ }
+
+ /** Stop the Tetheroffload HAL. */
+ public boolean stopOffload() {
+ final String methodStr = "stopOffload()";
+ try {
+ mIOffload.stopOffload();
+ } catch (Exception e) {
+ logAndIgnoreException(e, methodStr);
+ return false;
+ }
+
+ mTetheringOffloadCallback = null;
+ mLog.i(methodStr);
+ return true;
+ }
+
+ /** Get HAL interface version number. */
+ public int getVersion() {
+ return mOffloadVersion;
+ }
+
+ /** Get Tx/Rx usage from last query. */
+ public OffloadHardwareInterface.ForwardedStats getForwardedStats(@NonNull String upstream) {
+ ForwardedStats stats = new ForwardedStats();
+ final String methodStr = String.format("getForwardedStats(%s)", upstream);
+ try {
+ stats = mIOffload.getForwardedStats(upstream);
+ } catch (Exception e) {
+ logAndIgnoreException(e, methodStr);
+ }
+ mLog.i(methodStr);
+ return new OffloadHardwareInterface.ForwardedStats(stats.rxBytes, stats.txBytes);
+ }
+
+ /** Set local prefixes to offload management process. */
+ public boolean setLocalPrefixes(@NonNull ArrayList<String> localPrefixes) {
+ final String methodStr = String.format("setLocalPrefixes([%s])",
+ String.join(",", localPrefixes));
+ try {
+ mIOffload.setLocalPrefixes(localPrefixes.toArray(new String[localPrefixes.size()]));
+ } catch (Exception e) {
+ logAndIgnoreException(e, methodStr);
+ return false;
+ }
+ mLog.i(methodStr);
+ return true;
+ }
+
+ /**
+ * Set data limit value to offload management process.
+ * Method setDataLimit is deprecated in AIDL, so call setDataWarningAndLimit instead,
+ * with warningBytes set to its MAX_VALUE.
+ */
+ public boolean setDataLimit(@NonNull String iface, long limit) {
+ final long warning = Long.MAX_VALUE;
+ final String methodStr = String.format("setDataLimit(%s, %d)", iface, limit);
+ try {
+ mIOffload.setDataWarningAndLimit(iface, warning, limit);
+ } catch (Exception e) {
+ logAndIgnoreException(e, methodStr);
+ return false;
+ }
+ mLog.i(methodStr);
+ return true;
+ }
+
+ /** Set data warning and limit value to offload management process. */
+ public boolean setDataWarningAndLimit(@NonNull String iface, long warning, long limit) {
+ final String methodStr =
+ String.format("setDataWarningAndLimit(%s, %d, %d)", iface, warning, limit);
+ try {
+ mIOffload.setDataWarningAndLimit(iface, warning, limit);
+ } catch (Exception e) {
+ logAndIgnoreException(e, methodStr);
+ return false;
+ }
+ mLog.i(methodStr);
+ return true;
+ }
+
+ /** Set upstream parameters to offload management process. */
+ public boolean setUpstreamParameters(@NonNull String iface, @NonNull String v4addr,
+ @NonNull String v4gateway, @NonNull ArrayList<String> v6gws) {
+ final String methodStr = String.format("setUpstreamParameters(%s, %s, %s, [%s])",
+ iface, v4addr, v4gateway, String.join(",", v6gws));
+ try {
+ mIOffload.setUpstreamParameters(iface, v4addr, v4gateway,
+ v6gws.toArray(new String[v6gws.size()]));
+ } catch (Exception e) {
+ logAndIgnoreException(e, methodStr);
+ return false;
+ }
+ mLog.i(methodStr);
+ return true;
+ }
+
+ /** Add downstream prefix to offload management process. */
+ public boolean addDownstream(@NonNull String ifname, @NonNull String prefix) {
+ final String methodStr = String.format("addDownstream(%s, %s)", ifname, prefix);
+ try {
+ mIOffload.addDownstream(ifname, prefix);
+ } catch (Exception e) {
+ logAndIgnoreException(e, methodStr);
+ return false;
+ }
+ mLog.i(methodStr);
+ return true;
+ }
+
+ /** Remove downstream prefix from offload management process. */
+ public boolean removeDownstream(@NonNull String ifname, @NonNull String prefix) {
+ final String methodStr = String.format("removeDownstream(%s, %s)", ifname, prefix);
+ try {
+ mIOffload.removeDownstream(ifname, prefix);
+ } catch (Exception e) {
+ logAndIgnoreException(e, methodStr);
+ return false;
+ }
+ mLog.i(methodStr);
+ return true;
+ }
+
+ /**
+ * Get {@link IOffloadHal} object from the AIDL service.
+ *
+ * @param handler {@link Handler} to specify the thread upon which the callback will be invoked.
+ * @param log Log to be used by the repository.
+ */
+ public static IOffloadHal getIOffloadHal(Handler handler, SharedLog log) {
+ // Tetheroffload AIDL interface is only supported after U.
+ if (!SdkLevel.isAtLeastU() || !ServiceManager.isDeclared(HAL_INSTANCE_NAME)) return null;
+
+ IOffload offload = IOffload.Stub.asInterface(
+ ServiceManager.waitForDeclaredService(HAL_INSTANCE_NAME));
+ if (offload == null) return null;
+
+ return new OffloadHalAidlImpl(OFFLOAD_HAL_VERSION_AIDL, offload, handler, log);
+ }
+
+ private void logAndIgnoreException(Exception e, final String methodStr) {
+ mLog.e(methodStr + " failed with " + e.getClass().getSimpleName() + ": ", e);
+ }
+
+ private static class TetheringOffloadCallback extends ITetheringOffloadCallback.Stub {
+ public final Handler handler;
+ public final OffloadHalCallback callback;
+ public final SharedLog log;
+
+ TetheringOffloadCallback(
+ Handler h, OffloadHalCallback cb, SharedLog sharedLog) {
+ handler = h;
+ callback = cb;
+ log = sharedLog;
+ }
+
+ private void handleOnEvent(int event) {
+ switch (event) {
+ case OffloadCallbackEvent.OFFLOAD_STARTED:
+ callback.onStarted();
+ break;
+ case OffloadCallbackEvent.OFFLOAD_STOPPED_ERROR:
+ callback.onStoppedError();
+ break;
+ case OffloadCallbackEvent.OFFLOAD_STOPPED_UNSUPPORTED:
+ callback.onStoppedUnsupported();
+ break;
+ case OffloadCallbackEvent.OFFLOAD_SUPPORT_AVAILABLE:
+ callback.onSupportAvailable();
+ break;
+ case OffloadCallbackEvent.OFFLOAD_STOPPED_LIMIT_REACHED:
+ callback.onStoppedLimitReached();
+ break;
+ case OffloadCallbackEvent.OFFLOAD_WARNING_REACHED:
+ callback.onWarningReached();
+ break;
+ default:
+ log.e("Unsupported OffloadCallbackEvent: " + event);
+ }
+ }
+
+ @Override
+ public void onEvent(int event) {
+ handler.post(() -> {
+ handleOnEvent(event);
+ });
+ }
+
+ @Override
+ public void updateTimeout(NatTimeoutUpdate params) {
+ handler.post(() -> {
+ callback.onNatTimeoutUpdate(
+ networkProtocolToOsConstant(params.proto),
+ params.src.addr, params.src.port,
+ params.dst.addr, params.dst.port);
+ });
+ }
+
+ @Override
+ public String getInterfaceHash() {
+ return ITetheringOffloadCallback.HASH;
+ }
+
+ @Override
+ public int getInterfaceVersion() {
+ return ITetheringOffloadCallback.VERSION;
+ }
+ }
+
+ private static int networkProtocolToOsConstant(int proto) {
+ switch (proto) {
+ case NetworkProtocol.TCP: return OsConstants.IPPROTO_TCP;
+ case NetworkProtocol.UDP: return OsConstants.IPPROTO_UDP;
+ default:
+ // The caller checks this value and will log an error. Just make
+ // sure it won't collide with valid OsConstants.IPPROTO_* values.
+ return -Math.abs(proto);
+ }
+ }
+}
diff --git a/Tethering/src/com/android/networkstack/tethering/OffloadHalHidlImpl.java b/Tethering/src/com/android/networkstack/tethering/OffloadHalHidlImpl.java
new file mode 100644
index 0000000..e0a9878
--- /dev/null
+++ b/Tethering/src/com/android/networkstack/tethering/OffloadHalHidlImpl.java
@@ -0,0 +1,439 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.networkstack.tethering;
+
+import static com.android.networkstack.tethering.OffloadHardwareInterface.OFFLOAD_HAL_VERSION_HIDL_1_0;
+import static com.android.networkstack.tethering.OffloadHardwareInterface.OFFLOAD_HAL_VERSION_HIDL_1_1;
+import static com.android.networkstack.tethering.OffloadHardwareInterface.OFFLOAD_HAL_VERSION_NONE;
+import static com.android.networkstack.tethering.OffloadHardwareInterface.halVerToString;
+import static com.android.networkstack.tethering.util.TetheringUtils.uint16;
+
+import android.annotation.NonNull;
+import android.hardware.tetheroffload.config.V1_0.IOffloadConfig;
+import android.hardware.tetheroffload.control.V1_0.IOffloadControl;
+import android.hardware.tetheroffload.control.V1_0.NatTimeoutUpdate;
+import android.hardware.tetheroffload.control.V1_0.NetworkProtocol;
+import android.hardware.tetheroffload.control.V1_0.OffloadCallbackEvent;
+import android.hardware.tetheroffload.control.V1_1.ITetheringOffloadCallback;
+import android.os.Handler;
+import android.os.NativeHandle;
+import android.os.RemoteException;
+import android.system.OsConstants;
+import android.util.Log;
+
+import com.android.net.module.util.SharedLog;
+import com.android.networkstack.tethering.OffloadHardwareInterface.ForwardedStats;
+import com.android.networkstack.tethering.OffloadHardwareInterface.OffloadHalCallback;
+
+import java.util.ArrayList;
+import java.util.NoSuchElementException;
+
+/**
+ * The implementation of IOffloadHal which based on HIDL interfaces
+ */
+public class OffloadHalHidlImpl implements IOffloadHal {
+ private static final String TAG = OffloadHalHidlImpl.class.getSimpleName();
+ private static final String YIELDS = " -> ";
+
+ private final Handler mHandler;
+ private final SharedLog mLog;
+ private final IOffloadConfig mIOffloadConfig;
+ private final IOffloadControl mIOffloadControl;
+ @OffloadHardwareInterface.OffloadHalVersion
+ private final int mOffloadControlVersion;
+
+ private OffloadHalCallback mOffloadHalCallback;
+ private TetheringOffloadCallback mTetheringOffloadCallback;
+
+ public OffloadHalHidlImpl(int version, @NonNull IOffloadConfig config,
+ @NonNull IOffloadControl control, @NonNull Handler handler, @NonNull SharedLog log) {
+ mOffloadControlVersion = version;
+ mIOffloadConfig = config;
+ mIOffloadControl = control;
+ mHandler = handler;
+ mLog = log.forSubComponent(TAG);
+ }
+
+ /**
+ * Initialize the Tetheroffload HAL. Provides bound netlink file descriptors for use in the
+ * management process.
+ */
+ public boolean initOffload(@NonNull NativeHandle handle1, @NonNull NativeHandle handle2,
+ @NonNull OffloadHalCallback callback) {
+ final String logmsg = String.format("initOffload(%d, %d, %s)",
+ handle1.getFileDescriptor().getInt$(), handle2.getFileDescriptor().getInt$(),
+ (callback == null) ? "null"
+ : "0x" + Integer.toHexString(System.identityHashCode(callback)));
+
+ mOffloadHalCallback = callback;
+ mTetheringOffloadCallback = new TetheringOffloadCallback(
+ mHandler, mOffloadHalCallback, mLog, mOffloadControlVersion);
+ final CbResults results = new CbResults();
+ try {
+ mIOffloadConfig.setHandles(handle1, handle2,
+ (boolean success, String errMsg) -> {
+ results.mSuccess = success;
+ results.mErrMsg = errMsg;
+ });
+ mIOffloadControl.initOffload(
+ mTetheringOffloadCallback,
+ (boolean success, String errMsg) -> {
+ results.mSuccess = success;
+ results.mErrMsg = errMsg;
+ });
+ } catch (RemoteException e) {
+ record(logmsg, e);
+ return false;
+ }
+
+ record(logmsg, results);
+ return results.mSuccess;
+ }
+
+ /** Stop the Tetheroffload HAL. */
+ public boolean stopOffload() {
+ try {
+ mIOffloadControl.stopOffload(
+ (boolean success, String errMsg) -> {
+ if (!success) mLog.e("stopOffload failed: " + errMsg);
+ });
+ } catch (RemoteException e) {
+ mLog.e("failed to stopOffload: " + e);
+ }
+ mOffloadHalCallback = null;
+ mTetheringOffloadCallback = null;
+ mLog.log("stopOffload()");
+ return true;
+ }
+
+ /** Get HAL interface version number. */
+ public int getVersion() {
+ return mOffloadControlVersion;
+ }
+
+ /** Get Tx/Rx usage from last query. */
+ public ForwardedStats getForwardedStats(@NonNull String upstream) {
+ final String logmsg = String.format("getForwardedStats(%s)", upstream);
+
+ final ForwardedStats stats = new ForwardedStats();
+ try {
+ mIOffloadControl.getForwardedStats(
+ upstream,
+ (long rxBytes, long txBytes) -> {
+ stats.rxBytes = (rxBytes > 0) ? rxBytes : 0;
+ stats.txBytes = (txBytes > 0) ? txBytes : 0;
+ });
+ } catch (RemoteException e) {
+ record(logmsg, e);
+ return stats;
+ }
+
+ return stats;
+ }
+
+ /** Set local prefixes to offload management process. */
+ public boolean setLocalPrefixes(@NonNull ArrayList<String> localPrefixes) {
+ final String logmsg = String.format("setLocalPrefixes([%s])",
+ String.join(",", localPrefixes));
+
+ final CbResults results = new CbResults();
+ try {
+ mIOffloadControl.setLocalPrefixes(localPrefixes,
+ (boolean success, String errMsg) -> {
+ results.mSuccess = success;
+ results.mErrMsg = errMsg;
+ });
+ } catch (RemoteException e) {
+ record(logmsg, e);
+ return false;
+ }
+
+ record(logmsg, results);
+ return results.mSuccess;
+ }
+
+ /** Set data limit value to offload management process. */
+ public boolean setDataLimit(@NonNull String iface, long limit) {
+
+ final String logmsg = String.format("setDataLimit(%s, %d)", iface, limit);
+
+ final CbResults results = new CbResults();
+ try {
+ mIOffloadControl.setDataLimit(
+ iface, limit,
+ (boolean success, String errMsg) -> {
+ results.mSuccess = success;
+ results.mErrMsg = errMsg;
+ });
+ } catch (RemoteException e) {
+ record(logmsg, e);
+ return false;
+ }
+
+ record(logmsg, results);
+ return results.mSuccess;
+ }
+
+ /** Set data warning and limit value to offload management process. */
+ public boolean setDataWarningAndLimit(@NonNull String iface, long warning, long limit) {
+ if (mOffloadControlVersion < OFFLOAD_HAL_VERSION_HIDL_1_1) {
+ throw new UnsupportedOperationException(
+ "setDataWarningAndLimit is not supported below HAL V1.1");
+ }
+ final String logmsg =
+ String.format("setDataWarningAndLimit(%s, %d, %d)", iface, warning, limit);
+
+ final CbResults results = new CbResults();
+ try {
+ ((android.hardware.tetheroffload.control.V1_1.IOffloadControl) mIOffloadControl)
+ .setDataWarningAndLimit(
+ iface, warning, limit,
+ (boolean success, String errMsg) -> {
+ results.mSuccess = success;
+ results.mErrMsg = errMsg;
+ });
+ } catch (RemoteException e) {
+ record(logmsg, e);
+ return false;
+ }
+
+ record(logmsg, results);
+ return results.mSuccess;
+ }
+
+ /** Set upstream parameters to offload management process. */
+ public boolean setUpstreamParameters(@NonNull String iface, @NonNull String v4addr,
+ @NonNull String v4gateway, @NonNull ArrayList<String> v6gws) {
+ final String logmsg = String.format("setUpstreamParameters(%s, %s, %s, [%s])",
+ iface, v4addr, v4gateway, String.join(",", v6gws));
+
+ final CbResults results = new CbResults();
+ try {
+ mIOffloadControl.setUpstreamParameters(
+ iface, v4addr, v4gateway, v6gws,
+ (boolean success, String errMsg) -> {
+ results.mSuccess = success;
+ results.mErrMsg = errMsg;
+ });
+ } catch (RemoteException e) {
+ record(logmsg, e);
+ return false;
+ }
+
+ record(logmsg, results);
+ return results.mSuccess;
+ }
+
+ /** Add downstream prefix to offload management process. */
+ public boolean addDownstream(@NonNull String ifname, @NonNull String prefix) {
+ final String logmsg = String.format("addDownstream(%s, %s)", ifname, prefix);
+
+ final CbResults results = new CbResults();
+ try {
+ mIOffloadControl.addDownstream(ifname, prefix,
+ (boolean success, String errMsg) -> {
+ results.mSuccess = success;
+ results.mErrMsg = errMsg;
+ });
+ } catch (RemoteException e) {
+ record(logmsg, e);
+ return false;
+ }
+
+ record(logmsg, results);
+ return results.mSuccess;
+ }
+
+ /** Remove downstream prefix from offload management process. */
+ public boolean removeDownstream(@NonNull String ifname, @NonNull String prefix) {
+ final String logmsg = String.format("removeDownstream(%s, %s)", ifname, prefix);
+
+ final CbResults results = new CbResults();
+ try {
+ mIOffloadControl.removeDownstream(ifname, prefix,
+ (boolean success, String errMsg) -> {
+ results.mSuccess = success;
+ results.mErrMsg = errMsg;
+ });
+ } catch (RemoteException e) {
+ record(logmsg, e);
+ return false;
+ }
+
+ record(logmsg, results);
+ return results.mSuccess;
+ }
+
+ /**
+ * Get {@link IOffloadHal} object from the HIDL service.
+ *
+ * @param handler {@link Handler} to specify the thread upon which the callback will be invoked.
+ * @param log Log to be used by the repository.
+ */
+ public static IOffloadHal getIOffloadHal(Handler handler, SharedLog log) {
+ IOffloadConfig config = null;
+ try {
+ config = IOffloadConfig.getService(true /*retry*/);
+ } catch (RemoteException e) {
+ log.e("getIOffloadConfig error " + e);
+ return null;
+ } catch (NoSuchElementException e) {
+ log.i("getIOffloadConfig Tether Offload HAL not present/implemented");
+ return null;
+ }
+
+ IOffloadControl control = null;
+ int version = OFFLOAD_HAL_VERSION_NONE;
+ try {
+ control = android.hardware.tetheroffload.control
+ .V1_1.IOffloadControl.getService(true /*retry*/);
+ version = OFFLOAD_HAL_VERSION_HIDL_1_1;
+ } catch (NoSuchElementException e) {
+ // Unsupported by device.
+ } catch (RemoteException e) {
+ log.e("Unable to get offload control " + OFFLOAD_HAL_VERSION_HIDL_1_1);
+ }
+ if (control == null) {
+ try {
+ control = IOffloadControl.getService(true /*retry*/);
+ version = OFFLOAD_HAL_VERSION_HIDL_1_0;
+ } catch (NoSuchElementException e) {
+ // Unsupported by device.
+ } catch (RemoteException e) {
+ log.e("Unable to get offload control " + OFFLOAD_HAL_VERSION_HIDL_1_0);
+ }
+ }
+
+ if (config == null || control == null) return null;
+
+ return new OffloadHalHidlImpl(version, config, control, handler, log);
+ }
+
+ private void record(String msg, Throwable t) {
+ mLog.e(msg + YIELDS + "exception: " + t);
+ }
+
+ private void record(String msg, CbResults results) {
+ final String logmsg = msg + YIELDS + results;
+ if (!results.mSuccess) {
+ mLog.e(logmsg);
+ } else {
+ mLog.log(logmsg);
+ }
+ }
+
+ private static class TetheringOffloadCallback extends ITetheringOffloadCallback.Stub {
+ public final Handler handler;
+ public final OffloadHalCallback callback;
+ public final SharedLog log;
+ private final int mOffloadControlVersion;
+
+ TetheringOffloadCallback(
+ Handler h, OffloadHalCallback cb, SharedLog sharedLog, int offloadControlVersion) {
+ handler = h;
+ callback = cb;
+ log = sharedLog;
+ this.mOffloadControlVersion = offloadControlVersion;
+ }
+
+ private void handleOnEvent(int event) {
+ switch (event) {
+ case OffloadCallbackEvent.OFFLOAD_STARTED:
+ callback.onStarted();
+ break;
+ case OffloadCallbackEvent.OFFLOAD_STOPPED_ERROR:
+ callback.onStoppedError();
+ break;
+ case OffloadCallbackEvent.OFFLOAD_STOPPED_UNSUPPORTED:
+ callback.onStoppedUnsupported();
+ break;
+ case OffloadCallbackEvent.OFFLOAD_SUPPORT_AVAILABLE:
+ callback.onSupportAvailable();
+ break;
+ case OffloadCallbackEvent.OFFLOAD_STOPPED_LIMIT_REACHED:
+ callback.onStoppedLimitReached();
+ break;
+ case android.hardware.tetheroffload.control
+ .V1_1.OffloadCallbackEvent.OFFLOAD_WARNING_REACHED:
+ callback.onWarningReached();
+ break;
+ default:
+ log.e("Unsupported OffloadCallbackEvent: " + event);
+ }
+ }
+
+ @Override
+ public void onEvent(int event) {
+ // The implementation should never call onEvent()) if the event is already reported
+ // through newer callback.
+ if (mOffloadControlVersion > OFFLOAD_HAL_VERSION_HIDL_1_0) {
+ Log.wtf(TAG, "onEvent(" + event + ") fired on HAL "
+ + halVerToString(mOffloadControlVersion));
+ }
+ handler.post(() -> {
+ handleOnEvent(event);
+ });
+ }
+
+ @Override
+ public void onEvent_1_1(int event) {
+ if (mOffloadControlVersion < OFFLOAD_HAL_VERSION_HIDL_1_1) {
+ Log.wtf(TAG, "onEvent_1_1(" + event + ") fired on HAL "
+ + halVerToString(mOffloadControlVersion));
+ return;
+ }
+ handler.post(() -> {
+ handleOnEvent(event);
+ });
+ }
+
+ @Override
+ public void updateTimeout(NatTimeoutUpdate params) {
+ handler.post(() -> {
+ callback.onNatTimeoutUpdate(
+ networkProtocolToOsConstant(params.proto),
+ params.src.addr, uint16(params.src.port),
+ params.dst.addr, uint16(params.dst.port));
+ });
+ }
+ }
+
+ private static int networkProtocolToOsConstant(int proto) {
+ switch (proto) {
+ case NetworkProtocol.TCP: return OsConstants.IPPROTO_TCP;
+ case NetworkProtocol.UDP: return OsConstants.IPPROTO_UDP;
+ default:
+ // The caller checks this value and will log an error. Just make
+ // sure it won't collide with valid OsConstants.IPPROTO_* values.
+ return -Math.abs(proto);
+ }
+ }
+
+ private static class CbResults {
+ boolean mSuccess;
+ String mErrMsg;
+
+ @Override
+ public String toString() {
+ if (mSuccess) {
+ return "ok";
+ } else {
+ return "fail: " + mErrMsg;
+ }
+ }
+ }
+}
diff --git a/Tethering/src/com/android/networkstack/tethering/OffloadHardwareInterface.java b/Tethering/src/com/android/networkstack/tethering/OffloadHardwareInterface.java
index 76ddfe5..de15c5b 100644
--- a/Tethering/src/com/android/networkstack/tethering/OffloadHardwareInterface.java
+++ b/Tethering/src/com/android/networkstack/tethering/OffloadHardwareInterface.java
@@ -18,25 +18,15 @@
import static com.android.net.module.util.netlink.StructNlMsgHdr.NLM_F_DUMP;
import static com.android.net.module.util.netlink.StructNlMsgHdr.NLM_F_REQUEST;
-import static com.android.networkstack.tethering.util.TetheringUtils.uint16;
import android.annotation.IntDef;
import android.annotation.NonNull;
-import android.hardware.tetheroffload.config.V1_0.IOffloadConfig;
-import android.hardware.tetheroffload.control.V1_0.IOffloadControl;
-import android.hardware.tetheroffload.control.V1_0.NatTimeoutUpdate;
-import android.hardware.tetheroffload.control.V1_0.NetworkProtocol;
-import android.hardware.tetheroffload.control.V1_0.OffloadCallbackEvent;
-import android.hardware.tetheroffload.control.V1_1.ITetheringOffloadCallback;
import android.net.util.SocketUtils;
import android.os.Handler;
import android.os.NativeHandle;
-import android.os.RemoteException;
import android.system.ErrnoException;
import android.system.Os;
import android.system.OsConstants;
-import android.util.Log;
-import android.util.Pair;
import com.android.internal.annotations.VisibleForTesting;
import com.android.net.module.util.SharedLog;
@@ -54,8 +44,6 @@
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.util.ArrayList;
-import java.util.NoSuchElementException;
-
/**
* Capture tethering dependencies, for injection.
@@ -86,43 +74,43 @@
private final Handler mHandler;
private final SharedLog mLog;
private final Dependencies mDeps;
- private IOffloadControl mOffloadControl;
+ private IOffloadHal mIOffload;
// TODO: Use major-minor version control to prevent from defining new constants.
static final int OFFLOAD_HAL_VERSION_NONE = 0;
- static final int OFFLOAD_HAL_VERSION_1_0 = 1;
- static final int OFFLOAD_HAL_VERSION_1_1 = 2;
+ static final int OFFLOAD_HAL_VERSION_HIDL_1_0 = 1;
+ static final int OFFLOAD_HAL_VERSION_HIDL_1_1 = 2;
+ static final int OFFLOAD_HAL_VERSION_AIDL = 3;
/** @hide */
@Retention(RetentionPolicy.SOURCE)
@IntDef(prefix = "OFFLOAD_HAL_VERSION_", value = {
OFFLOAD_HAL_VERSION_NONE,
- OFFLOAD_HAL_VERSION_1_0,
- OFFLOAD_HAL_VERSION_1_1
+ OFFLOAD_HAL_VERSION_HIDL_1_0,
+ OFFLOAD_HAL_VERSION_HIDL_1_1,
+ OFFLOAD_HAL_VERSION_AIDL,
})
public @interface OffloadHalVersion {}
- @OffloadHalVersion
- private int mOffloadControlVersion = OFFLOAD_HAL_VERSION_NONE;
@NonNull
static String halVerToString(int version) {
switch(version) {
- case OFFLOAD_HAL_VERSION_1_0:
- return "1.0";
- case OFFLOAD_HAL_VERSION_1_1:
- return "1.1";
+ case OFFLOAD_HAL_VERSION_HIDL_1_0:
+ return "HIDL 1.0";
+ case OFFLOAD_HAL_VERSION_HIDL_1_1:
+ return "HIDL 1.1";
+ case OFFLOAD_HAL_VERSION_AIDL:
+ return "AIDL";
case OFFLOAD_HAL_VERSION_NONE:
return "None";
default:
throw new IllegalArgumentException("Unsupported version int " + version);
}
-
}
- private TetheringOffloadCallback mTetheringOffloadCallback;
- private ControlCallback mControlCallback;
+ private OffloadHalCallback mOffloadHalCallback;
/** The callback to notify status of offload management process. */
- public static class ControlCallback {
+ public static class OffloadHalCallback {
/** Offload started. */
public void onStarted() {}
/**
@@ -179,7 +167,7 @@
}
public OffloadHardwareInterface(Handler h, SharedLog log) {
- this(h, log, new Dependencies(log));
+ this(h, log, new Dependencies(h, log));
}
OffloadHardwareInterface(Handler h, SharedLog log, Dependencies deps) {
@@ -190,45 +178,21 @@
/** Capture OffloadHardwareInterface dependencies, for injection. */
static class Dependencies {
+ private final Handler mHandler;
private final SharedLog mLog;
- Dependencies(SharedLog log) {
+ Dependencies(Handler handler, SharedLog log) {
+ mHandler = handler;
mLog = log;
}
- public IOffloadConfig getOffloadConfig() {
- try {
- return IOffloadConfig.getService(true /*retry*/);
- } catch (RemoteException | NoSuchElementException e) {
- mLog.e("getIOffloadConfig error " + e);
- return null;
- }
- }
-
- @NonNull
- public Pair<IOffloadControl, Integer> getOffloadControl() {
- IOffloadControl hal = null;
- int version = OFFLOAD_HAL_VERSION_NONE;
- try {
- hal = android.hardware.tetheroffload.control
- .V1_1.IOffloadControl.getService(true /*retry*/);
- version = OFFLOAD_HAL_VERSION_1_1;
- } catch (NoSuchElementException e) {
- // Unsupported by device.
- } catch (RemoteException e) {
- mLog.e("Unable to get offload control " + OFFLOAD_HAL_VERSION_1_1);
- }
+ public IOffloadHal getOffload() {
+ // Prefer AIDL implementation if its service is declared.
+ IOffloadHal hal = OffloadHalAidlImpl.getIOffloadHal(mHandler, mLog);
if (hal == null) {
- try {
- hal = IOffloadControl.getService(true /*retry*/);
- version = OFFLOAD_HAL_VERSION_1_0;
- } catch (NoSuchElementException e) {
- // Unsupported by device.
- } catch (RemoteException e) {
- mLog.e("Unable to get offload control " + OFFLOAD_HAL_VERSION_1_0);
- }
+ hal = OffloadHalHidlImpl.getIOffloadHal(mHandler, mLog);
}
- return new Pair<IOffloadControl, Integer>(hal, version);
+ return hal;
}
public NativeHandle createConntrackSocket(final int groups) {
@@ -273,56 +237,6 @@
return DEFAULT_TETHER_OFFLOAD_DISABLED;
}
- /**
- * Offload management process need to know conntrack rules to support NAT, but it may not have
- * permission to create netlink netfilter sockets. Create two netlink netfilter sockets and
- * share them with offload management process.
- */
- public boolean initOffloadConfig() {
- final IOffloadConfig offloadConfig = mDeps.getOffloadConfig();
- if (offloadConfig == null) {
- mLog.e("Could not find IOffloadConfig service");
- return false;
- }
- // Per the IConfigOffload definition:
- //
- // h1 provides a file descriptor bound to the following netlink groups
- // (NF_NETLINK_CONNTRACK_NEW | NF_NETLINK_CONNTRACK_DESTROY).
- //
- // h2 provides a file descriptor bound to the following netlink groups
- // (NF_NETLINK_CONNTRACK_UPDATE | NF_NETLINK_CONNTRACK_DESTROY).
- final NativeHandle h1 = mDeps.createConntrackSocket(
- NF_NETLINK_CONNTRACK_NEW | NF_NETLINK_CONNTRACK_DESTROY);
- if (h1 == null) return false;
-
- requestSocketDump(h1);
-
- final NativeHandle h2 = mDeps.createConntrackSocket(
- NF_NETLINK_CONNTRACK_UPDATE | NF_NETLINK_CONNTRACK_DESTROY);
- if (h2 == null) {
- closeFdInNativeHandle(h1);
- return false;
- }
-
- final CbResults results = new CbResults();
- try {
- offloadConfig.setHandles(h1, h2,
- (boolean success, String errMsg) -> {
- results.mSuccess = success;
- results.mErrMsg = errMsg;
- });
- } catch (RemoteException e) {
- record("initOffloadConfig, setHandles fail", e);
- return false;
- }
- // Explicitly close FDs.
- closeFdInNativeHandle(h1);
- closeFdInNativeHandle(h2);
-
- record("initOffloadConfig, setHandles results:", results);
- return results.mSuccess;
- }
-
@VisibleForTesting
void sendIpv4NfGenMsg(@NonNull NativeHandle handle, short type, short flags) {
final int length = StructNlMsgHdr.STRUCT_SIZE + StructNfGenMsg.STRUCT_SIZE;
@@ -355,165 +269,107 @@
(short) (NLM_F_REQUEST | NLM_F_DUMP));
}
- private void closeFdInNativeHandle(final NativeHandle h) {
- try {
- h.close();
- } catch (IOException | IllegalStateException e) {
- // IllegalStateException means fd is already closed, do nothing here.
- // Also nothing we can do if IOException.
+ private void maybeCloseFdInNativeHandles(final NativeHandle... handles) {
+ for (NativeHandle h : handles) {
+ if (h == null) continue;
+ try {
+ h.close();
+ } catch (IOException | IllegalStateException e) {
+ // IllegalStateException means fd is already closed, do nothing here.
+ // Also nothing we can do if IOException.
+ }
}
}
+ private int initWithHandles(NativeHandle h1, NativeHandle h2) {
+ if (h1 == null || h2 == null) {
+ mLog.e("Failed to create socket.");
+ return OFFLOAD_HAL_VERSION_NONE;
+ }
+
+ requestSocketDump(h1);
+ if (!mIOffload.initOffload(h1, h2, mOffloadHalCallback)) {
+ mIOffload.stopOffload();
+ mLog.e("Failed to initialize offload.");
+ return OFFLOAD_HAL_VERSION_NONE;
+ }
+
+ return mIOffload.getVersion();
+ }
+
/**
* Initialize the tethering offload HAL.
*
* @return one of {@code OFFLOAD_HAL_VERSION_*} represents the HAL version, or
* {@link #OFFLOAD_HAL_VERSION_NONE} if failed.
*/
- public int initOffloadControl(ControlCallback controlCb) {
- mControlCallback = controlCb;
-
- if (mOffloadControl == null) {
- final Pair<IOffloadControl, Integer> halAndVersion = mDeps.getOffloadControl();
- mOffloadControl = halAndVersion.first;
- mOffloadControlVersion = halAndVersion.second;
- if (mOffloadControl == null) {
- mLog.e("tethering IOffloadControl.getService() returned null");
+ public int initOffload(OffloadHalCallback offloadCb) {
+ if (mIOffload == null) {
+ mIOffload = mDeps.getOffload();
+ if (mIOffload == null) {
+ mLog.i("No tethering offload HAL service found.");
return OFFLOAD_HAL_VERSION_NONE;
}
- mLog.i("tethering offload control version "
- + halVerToString(mOffloadControlVersion) + " is supported.");
+ mLog.i("Tethering offload version "
+ + halVerToString(mIOffload.getVersion()) + " is supported.");
}
- final String logmsg = String.format("initOffloadControl(%s)",
- (controlCb == null) ? "null"
- : "0x" + Integer.toHexString(System.identityHashCode(controlCb)));
+ // Per the IOffload definition:
+ //
+ // h1 provides a file descriptor bound to the following netlink groups
+ // (NF_NETLINK_CONNTRACK_NEW | NF_NETLINK_CONNTRACK_DESTROY).
+ //
+ // h2 provides a file descriptor bound to the following netlink groups
+ // (NF_NETLINK_CONNTRACK_UPDATE | NF_NETLINK_CONNTRACK_DESTROY).
+ final NativeHandle h1 = mDeps.createConntrackSocket(
+ NF_NETLINK_CONNTRACK_NEW | NF_NETLINK_CONNTRACK_DESTROY);
+ final NativeHandle h2 = mDeps.createConntrackSocket(
+ NF_NETLINK_CONNTRACK_UPDATE | NF_NETLINK_CONNTRACK_DESTROY);
- mTetheringOffloadCallback = new TetheringOffloadCallback(
- mHandler, mControlCallback, mLog, mOffloadControlVersion);
- final CbResults results = new CbResults();
- try {
- mOffloadControl.initOffload(
- mTetheringOffloadCallback,
- (boolean success, String errMsg) -> {
- results.mSuccess = success;
- results.mErrMsg = errMsg;
- });
- } catch (RemoteException e) {
- record(logmsg, e);
- return OFFLOAD_HAL_VERSION_NONE;
+ mOffloadHalCallback = offloadCb;
+ final int version = initWithHandles(h1, h2);
+
+ // Explicitly close FDs for HIDL. AIDL will pass the original FDs to the service,
+ // they shouldn't be closed here.
+ if (version < OFFLOAD_HAL_VERSION_AIDL) {
+ maybeCloseFdInNativeHandles(h1, h2);
}
-
- record(logmsg, results);
- return results.mSuccess ? mOffloadControlVersion : OFFLOAD_HAL_VERSION_NONE;
+ return version;
}
- /** Stop IOffloadControl. */
- public void stopOffloadControl() {
- if (mOffloadControl != null) {
- try {
- mOffloadControl.stopOffload(
- (boolean success, String errMsg) -> {
- if (!success) mLog.e("stopOffload failed: " + errMsg);
- });
- } catch (RemoteException e) {
- mLog.e("failed to stopOffload: " + e);
+ /** Stop the tethering offload HAL. */
+ public void stopOffload() {
+ if (mIOffload != null) {
+ if (!mIOffload.stopOffload()) {
+ mLog.e("Failed to stop offload.");
}
}
- mOffloadControl = null;
- mTetheringOffloadCallback = null;
- mControlCallback = null;
- mLog.log("stopOffloadControl()");
+ mIOffload = null;
+ mOffloadHalCallback = null;
}
/** Get Tx/Rx usage from last query. */
public ForwardedStats getForwardedStats(String upstream) {
- final String logmsg = String.format("getForwardedStats(%s)", upstream);
-
- final ForwardedStats stats = new ForwardedStats();
- try {
- mOffloadControl.getForwardedStats(
- upstream,
- (long rxBytes, long txBytes) -> {
- stats.rxBytes = (rxBytes > 0) ? rxBytes : 0;
- stats.txBytes = (txBytes > 0) ? txBytes : 0;
- });
- } catch (RemoteException e) {
- record(logmsg, e);
- return stats;
- }
-
- return stats;
+ return mIOffload.getForwardedStats(upstream);
}
/** Set local prefixes to offload management process. */
public boolean setLocalPrefixes(ArrayList<String> localPrefixes) {
- final String logmsg = String.format("setLocalPrefixes([%s])",
- String.join(",", localPrefixes));
-
- final CbResults results = new CbResults();
- try {
- mOffloadControl.setLocalPrefixes(localPrefixes,
- (boolean success, String errMsg) -> {
- results.mSuccess = success;
- results.mErrMsg = errMsg;
- });
- } catch (RemoteException e) {
- record(logmsg, e);
- return false;
- }
-
- record(logmsg, results);
- return results.mSuccess;
+ return mIOffload.setLocalPrefixes(localPrefixes);
}
/** Set data limit value to offload management process. */
public boolean setDataLimit(String iface, long limit) {
-
- final String logmsg = String.format("setDataLimit(%s, %d)", iface, limit);
-
- final CbResults results = new CbResults();
- try {
- mOffloadControl.setDataLimit(
- iface, limit,
- (boolean success, String errMsg) -> {
- results.mSuccess = success;
- results.mErrMsg = errMsg;
- });
- } catch (RemoteException e) {
- record(logmsg, e);
- return false;
- }
-
- record(logmsg, results);
- return results.mSuccess;
+ return mIOffload.setDataLimit(iface, limit);
}
/** Set data warning and limit value to offload management process. */
public boolean setDataWarningAndLimit(String iface, long warning, long limit) {
- if (mOffloadControlVersion < OFFLOAD_HAL_VERSION_1_1) {
- throw new IllegalArgumentException(
+ if (mIOffload.getVersion() < OFFLOAD_HAL_VERSION_HIDL_1_1) {
+ throw new UnsupportedOperationException(
"setDataWarningAndLimit is not supported below HAL V1.1");
}
- final String logmsg =
- String.format("setDataWarningAndLimit(%s, %d, %d)", iface, warning, limit);
-
- final CbResults results = new CbResults();
- try {
- ((android.hardware.tetheroffload.control.V1_1.IOffloadControl) mOffloadControl)
- .setDataWarningAndLimit(
- iface, warning, limit,
- (boolean success, String errMsg) -> {
- results.mSuccess = success;
- results.mErrMsg = errMsg;
- });
- } catch (RemoteException e) {
- record(logmsg, e);
- return false;
- }
-
- record(logmsg, results);
- return results.mSuccess;
+ return mIOffload.setDataWarningAndLimit(iface, warning, limit);
}
/** Set upstream parameters to offload management process. */
@@ -523,178 +379,16 @@
v4addr = (v4addr != null) ? v4addr : NO_IPV4_ADDRESS;
v4gateway = (v4gateway != null) ? v4gateway : NO_IPV4_GATEWAY;
v6gws = (v6gws != null) ? v6gws : new ArrayList<>();
-
- final String logmsg = String.format("setUpstreamParameters(%s, %s, %s, [%s])",
- iface, v4addr, v4gateway, String.join(",", v6gws));
-
- final CbResults results = new CbResults();
- try {
- mOffloadControl.setUpstreamParameters(
- iface, v4addr, v4gateway, v6gws,
- (boolean success, String errMsg) -> {
- results.mSuccess = success;
- results.mErrMsg = errMsg;
- });
- } catch (RemoteException e) {
- record(logmsg, e);
- return false;
- }
-
- record(logmsg, results);
- return results.mSuccess;
+ return mIOffload.setUpstreamParameters(iface, v4addr, v4gateway, v6gws);
}
/** Add downstream prefix to offload management process. */
- public boolean addDownstreamPrefix(String ifname, String prefix) {
- final String logmsg = String.format("addDownstreamPrefix(%s, %s)", ifname, prefix);
-
- final CbResults results = new CbResults();
- try {
- mOffloadControl.addDownstream(ifname, prefix,
- (boolean success, String errMsg) -> {
- results.mSuccess = success;
- results.mErrMsg = errMsg;
- });
- } catch (RemoteException e) {
- record(logmsg, e);
- return false;
- }
-
- record(logmsg, results);
- return results.mSuccess;
+ public boolean addDownstream(String ifname, String prefix) {
+ return mIOffload.addDownstream(ifname, prefix);
}
/** Remove downstream prefix from offload management process. */
- public boolean removeDownstreamPrefix(String ifname, String prefix) {
- final String logmsg = String.format("removeDownstreamPrefix(%s, %s)", ifname, prefix);
-
- final CbResults results = new CbResults();
- try {
- mOffloadControl.removeDownstream(ifname, prefix,
- (boolean success, String errMsg) -> {
- results.mSuccess = success;
- results.mErrMsg = errMsg;
- });
- } catch (RemoteException e) {
- record(logmsg, e);
- return false;
- }
-
- record(logmsg, results);
- return results.mSuccess;
- }
-
- private void record(String msg, Throwable t) {
- mLog.e(msg + YIELDS + "exception: " + t);
- }
-
- private void record(String msg, CbResults results) {
- final String logmsg = msg + YIELDS + results;
- if (!results.mSuccess) {
- mLog.e(logmsg);
- } else {
- mLog.log(logmsg);
- }
- }
-
- private static class TetheringOffloadCallback extends ITetheringOffloadCallback.Stub {
- public final Handler handler;
- public final ControlCallback controlCb;
- public final SharedLog log;
- private final int mOffloadControlVersion;
-
- TetheringOffloadCallback(
- Handler h, ControlCallback cb, SharedLog sharedLog, int offloadControlVersion) {
- handler = h;
- controlCb = cb;
- log = sharedLog;
- this.mOffloadControlVersion = offloadControlVersion;
- }
-
- private void handleOnEvent(int event) {
- switch (event) {
- case OffloadCallbackEvent.OFFLOAD_STARTED:
- controlCb.onStarted();
- break;
- case OffloadCallbackEvent.OFFLOAD_STOPPED_ERROR:
- controlCb.onStoppedError();
- break;
- case OffloadCallbackEvent.OFFLOAD_STOPPED_UNSUPPORTED:
- controlCb.onStoppedUnsupported();
- break;
- case OffloadCallbackEvent.OFFLOAD_SUPPORT_AVAILABLE:
- controlCb.onSupportAvailable();
- break;
- case OffloadCallbackEvent.OFFLOAD_STOPPED_LIMIT_REACHED:
- controlCb.onStoppedLimitReached();
- break;
- case android.hardware.tetheroffload.control
- .V1_1.OffloadCallbackEvent.OFFLOAD_WARNING_REACHED:
- controlCb.onWarningReached();
- break;
- default:
- log.e("Unsupported OffloadCallbackEvent: " + event);
- }
- }
-
- @Override
- public void onEvent(int event) {
- // The implementation should never call onEvent()) if the event is already reported
- // through newer callback.
- if (mOffloadControlVersion > OFFLOAD_HAL_VERSION_1_0) {
- Log.wtf(TAG, "onEvent(" + event + ") fired on HAL "
- + halVerToString(mOffloadControlVersion));
- }
- handler.post(() -> {
- handleOnEvent(event);
- });
- }
-
- @Override
- public void onEvent_1_1(int event) {
- if (mOffloadControlVersion < OFFLOAD_HAL_VERSION_1_1) {
- Log.wtf(TAG, "onEvent_1_1(" + event + ") fired on HAL "
- + halVerToString(mOffloadControlVersion));
- return;
- }
- handler.post(() -> {
- handleOnEvent(event);
- });
- }
-
- @Override
- public void updateTimeout(NatTimeoutUpdate params) {
- handler.post(() -> {
- controlCb.onNatTimeoutUpdate(
- networkProtocolToOsConstant(params.proto),
- params.src.addr, uint16(params.src.port),
- params.dst.addr, uint16(params.dst.port));
- });
- }
- }
-
- private static int networkProtocolToOsConstant(int proto) {
- switch (proto) {
- case NetworkProtocol.TCP: return OsConstants.IPPROTO_TCP;
- case NetworkProtocol.UDP: return OsConstants.IPPROTO_UDP;
- default:
- // The caller checks this value and will log an error. Just make
- // sure it won't collide with valid OsContants.IPPROTO_* values.
- return -Math.abs(proto);
- }
- }
-
- private static class CbResults {
- boolean mSuccess;
- String mErrMsg;
-
- @Override
- public String toString() {
- if (mSuccess) {
- return "ok";
- } else {
- return "fail: " + mErrMsg;
- }
- }
+ public boolean removeDownstream(String ifname, String prefix) {
+ return mIOffload.removeDownstream(ifname, prefix);
}
}
diff --git a/Tethering/src/com/android/networkstack/tethering/PrivateAddressCoordinator.java b/Tethering/src/com/android/networkstack/tethering/PrivateAddressCoordinator.java
index 41a10ae..6c0ca82 100644
--- a/Tethering/src/com/android/networkstack/tethering/PrivateAddressCoordinator.java
+++ b/Tethering/src/com/android/networkstack/tethering/PrivateAddressCoordinator.java
@@ -16,6 +16,8 @@
package com.android.networkstack.tethering;
import static android.net.NetworkCapabilities.TRANSPORT_VPN;
+import static android.net.TetheringManager.CONNECTIVITY_SCOPE_GLOBAL;
+import static android.net.TetheringManager.CONNECTIVITY_SCOPE_LOCAL;
import static android.net.TetheringManager.TETHERING_BLUETOOTH;
import static android.net.TetheringManager.TETHERING_WIFI_P2P;
@@ -34,7 +36,6 @@
import android.net.ip.IpServer;
import android.util.ArrayMap;
import android.util.ArraySet;
-import android.util.SparseArray;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
@@ -77,7 +78,7 @@
private final ConnectivityManager mConnectivityMgr;
private final TetheringConfiguration mConfig;
// keyed by downstream type(TetheringManager.TETHERING_*).
- private final SparseArray<LinkAddress> mCachedAddresses;
+ private final ArrayMap<AddressKey, LinkAddress> mCachedAddresses;
public PrivateAddressCoordinator(Context context, TetheringConfiguration config) {
mDownstreams = new ArraySet<>();
@@ -85,10 +86,12 @@
mConnectivityMgr = (ConnectivityManager) context.getSystemService(
Context.CONNECTIVITY_SERVICE);
mConfig = config;
- mCachedAddresses = new SparseArray<>();
+ mCachedAddresses = new ArrayMap<AddressKey, LinkAddress>();
// Reserved static addresses for bluetooth and wifi p2p.
- mCachedAddresses.put(TETHERING_BLUETOOTH, new LinkAddress(LEGACY_BLUETOOTH_IFACE_ADDRESS));
- mCachedAddresses.put(TETHERING_WIFI_P2P, new LinkAddress(LEGACY_WIFI_P2P_IFACE_ADDRESS));
+ mCachedAddresses.put(new AddressKey(TETHERING_BLUETOOTH, CONNECTIVITY_SCOPE_GLOBAL),
+ new LinkAddress(LEGACY_BLUETOOTH_IFACE_ADDRESS));
+ mCachedAddresses.put(new AddressKey(TETHERING_WIFI_P2P, CONNECTIVITY_SCOPE_LOCAL),
+ new LinkAddress(LEGACY_WIFI_P2P_IFACE_ADDRESS));
mTetheringPrefixes = new ArrayList<>(Arrays.asList(new IpPrefix("192.168.0.0/16"),
new IpPrefix("172.16.0.0/12"), new IpPrefix("10.0.0.0/8")));
@@ -166,16 +169,18 @@
* returns null if there is no available address.
*/
@Nullable
- public LinkAddress requestDownstreamAddress(final IpServer ipServer, boolean useLastAddress) {
+ public LinkAddress requestDownstreamAddress(final IpServer ipServer, final int scope,
+ boolean useLastAddress) {
if (mConfig.shouldEnableWifiP2pDedicatedIp()
&& ipServer.interfaceType() == TETHERING_WIFI_P2P) {
return new LinkAddress(LEGACY_WIFI_P2P_IFACE_ADDRESS);
}
+ final AddressKey addrKey = new AddressKey(ipServer.interfaceType(), scope);
// This ensures that tethering isn't started on 2 different interfaces with the same type.
// Once tethering could support multiple interface with the same type,
// TetheringSoftApCallback would need to handle it among others.
- final LinkAddress cachedAddress = mCachedAddresses.get(ipServer.interfaceType());
+ final LinkAddress cachedAddress = mCachedAddresses.get(addrKey);
if (useLastAddress && cachedAddress != null
&& !isConflictWithUpstream(asIpPrefix(cachedAddress))) {
mDownstreams.add(ipServer);
@@ -186,7 +191,7 @@
final LinkAddress newAddress = chooseDownstreamAddress(prefixRange);
if (newAddress != null) {
mDownstreams.add(ipServer);
- mCachedAddresses.put(ipServer.interfaceType(), newAddress);
+ mCachedAddresses.put(addrKey, newAddress);
return newAddress;
}
}
@@ -384,6 +389,34 @@
return asIpPrefix(address);
}
+ private static class AddressKey {
+ private final int mTetheringType;
+ private final int mScope;
+
+ private AddressKey(int type, int scope) {
+ mTetheringType = type;
+ mScope = scope;
+ }
+
+ @Override
+ public int hashCode() {
+ return (mTetheringType << 16) + mScope;
+ }
+
+ @Override
+ public boolean equals(@Nullable Object obj) {
+ if (!(obj instanceof AddressKey)) return false;
+ final AddressKey other = (AddressKey) obj;
+
+ return mTetheringType == other.mTetheringType && mScope == other.mScope;
+ }
+
+ @Override
+ public String toString() {
+ return "AddressKey(" + mTetheringType + ", " + mScope + ")";
+ }
+ }
+
void dump(final IndentingPrintWriter pw) {
pw.println("mTetheringPrefixes:");
pw.increaseIndent();
diff --git a/Tethering/src/com/android/networkstack/tethering/Tethering.java b/Tethering/src/com/android/networkstack/tethering/Tethering.java
index 2e71fda..b371178 100644
--- a/Tethering/src/com/android/networkstack/tethering/Tethering.java
+++ b/Tethering/src/com/android/networkstack/tethering/Tethering.java
@@ -58,6 +58,7 @@
import static android.net.wifi.WifiManager.IFACE_IP_MODE_LOCAL_ONLY;
import static android.net.wifi.WifiManager.IFACE_IP_MODE_TETHERED;
import static android.net.wifi.WifiManager.IFACE_IP_MODE_UNSPECIFIED;
+import static android.net.wifi.WifiManager.SoftApCallback;
import static android.net.wifi.WifiManager.WIFI_AP_STATE_DISABLED;
import static android.telephony.CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED;
import static android.telephony.SubscriptionManager.INVALID_SUBSCRIPTION_ID;
@@ -156,6 +157,7 @@
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
+import java.util.Objects;
import java.util.Set;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.Executor;
@@ -479,15 +481,15 @@
mStateReceiver, noUpstreamFilter, PERMISSION_MAINLINE_NETWORK_STACK, mHandler);
final WifiManager wifiManager = getWifiManager();
- TetheringSoftApCallback softApCallback = new TetheringSoftApCallback();
if (wifiManager != null) {
- wifiManager.registerSoftApCallback(mExecutor, softApCallback);
- }
- if (SdkLevel.isAtLeastT() && wifiManager != null) {
- // Although WifiManager#registerLocalOnlyHotspotSoftApCallback document that it need
- // NEARBY_WIFI_DEVICES permission, but actually a caller who have NETWORK_STACK
- // or MAINLINE_NETWORK_STACK permission would also able to use this API.
- wifiManager.registerLocalOnlyHotspotSoftApCallback(mExecutor, softApCallback);
+ wifiManager.registerSoftApCallback(mExecutor, new TetheringSoftApCallback());
+ if (SdkLevel.isAtLeastT()) {
+ // Although WifiManager#registerLocalOnlyHotspotSoftApCallback document that it need
+ // NEARBY_WIFI_DEVICES permission, but actually a caller who have NETWORK_STACK
+ // or MAINLINE_NETWORK_STACK permission can also use this API.
+ wifiManager.registerLocalOnlyHotspotSoftApCallback(mExecutor,
+ new LocalOnlyHotspotCallback());
+ }
}
startTrackDefaultNetwork();
@@ -573,26 +575,17 @@
}
}
- private class TetheringSoftApCallback implements WifiManager.SoftApCallback {
- // TODO: Remove onStateChanged override when this method has default on
- // WifiManager#SoftApCallback interface.
- // Wifi listener for state change of the soft AP
- @Override
- public void onStateChanged(final int state, final int failureReason) {
- // Nothing
- }
-
- // Called by wifi when the number of soft AP clients changed.
- // Currently multiple softAp would not behave well in PrivateAddressCoordinator
- // (where it gets the address from cache), it ensure tethering only support one ipServer for
- // TETHERING_WIFI. Once tethering support multiple softAp enabled simultaneously,
- // onConnectedClientsChanged should also be updated to support tracking different softAp's
- // clients individually.
- // TODO: Add wtf log and have check to reject request duplicated type with different
- // interface.
+ private class TetheringSoftApCallback implements SoftApCallback {
@Override
public void onConnectedClientsChanged(final List<WifiClient> clients) {
- updateConnectedClients(clients);
+ updateConnectedClients(clients, null);
+ }
+ }
+
+ private class LocalOnlyHotspotCallback implements SoftApCallback {
+ @Override
+ public void onConnectedClientsChanged(final List<WifiClient> clients) {
+ updateConnectedClients(null, clients);
}
}
@@ -1853,14 +1846,16 @@
setUpstreamNetwork(ns);
final Network newUpstream = (ns != null) ? ns.network : null;
- if (mTetherUpstream != newUpstream) {
+ if (!Objects.equals(mTetherUpstream, newUpstream)) {
mTetherUpstream = newUpstream;
reportUpstreamChanged(mTetherUpstream);
- // Need to notify capabilities change after upstream network changed because new
- // network's capabilities should be checked every time.
+ // Need to notify capabilities change after upstream network changed because
+ // upstream may switch to existing network which don't have
+ // UpstreamNetworkMonitor.EVENT_ON_CAPABILITIES callback.
mNotificationUpdater.onUpstreamCapabilitiesChanged(
(ns != null) ? ns.networkCapabilities : null);
}
+ mTetheringMetrics.maybeUpdateUpstreamType(ns);
}
protected void setUpstreamNetwork(UpstreamNetworkState ns) {
@@ -1967,7 +1962,7 @@
mIPv6TetheringCoordinator.removeActiveDownstream(who);
mOffload.excludeDownstreamInterface(who.interfaceName());
mForwardedDownstreams.remove(who);
- updateConnectedClients(null /* wifiClients */);
+ maybeDhcpLeasesChanged();
// If this is a Wi-Fi interface, tell WifiManager of any errors
// or the inactive serving state.
@@ -2090,6 +2085,7 @@
mNotificationUpdater.onUpstreamCapabilitiesChanged(null);
}
mBpfCoordinator.stopPolling();
+ mTetheringMetrics.cleanup();
}
private boolean updateUpstreamWanted() {
@@ -2708,9 +2704,15 @@
if (e != null) throw e;
}
- private void updateConnectedClients(final List<WifiClient> wifiClients) {
+ private void maybeDhcpLeasesChanged() {
+ // null means wifi clients did not change.
+ updateConnectedClients(null, null);
+ }
+
+ private void updateConnectedClients(final List<WifiClient> wifiClients,
+ final List<WifiClient> localOnlyClients) {
if (mConnectedClientsTracker.updateConnectedClients(mTetherMainSM.getAllDownstreams(),
- wifiClients)) {
+ wifiClients, localOnlyClients)) {
reportTetherClientsChanged(mConnectedClientsTracker.getLastTetheredClients());
}
}
@@ -2729,7 +2731,7 @@
@Override
public void dhcpLeasesChanged() {
- updateConnectedClients(null /* wifiClients */);
+ maybeDhcpLeasesChanged();
}
@Override
diff --git a/Tethering/src/com/android/networkstack/tethering/TetheringConfiguration.java b/Tethering/src/com/android/networkstack/tethering/TetheringConfiguration.java
index b6591a9..b0aa668 100644
--- a/Tethering/src/com/android/networkstack/tethering/TetheringConfiguration.java
+++ b/Tethering/src/com/android/networkstack/tethering/TetheringConfiguration.java
@@ -39,6 +39,8 @@
import android.telephony.TelephonyManager;
import android.text.TextUtils;
+import androidx.annotation.NonNull;
+
import com.android.internal.annotations.VisibleForTesting;
import com.android.modules.utils.build.SdkLevel;
import com.android.net.module.util.DeviceConfigUtils;
@@ -158,6 +160,8 @@
public final int activeDataSubId;
+ private final Dependencies mDeps;
+
private final boolean mEnableLegacyDhcpServer;
private final int mOffloadPollInterval;
// TODO: Add to TetheringConfigurationParcel if required.
@@ -170,7 +174,31 @@
private final int mUsbTetheringFunction;
protected final ContentResolver mContentResolver;
- public TetheringConfiguration(Context ctx, SharedLog log, int id) {
+ /**
+ * A class wrapping dependencies of {@link TetheringConfiguration}, useful for testing.
+ */
+ @VisibleForTesting
+ public static class Dependencies {
+ boolean isFeatureEnabled(@NonNull Context context, @NonNull String namespace,
+ @NonNull String name, @NonNull String moduleName, boolean defaultEnabled) {
+ return DeviceConfigUtils.isFeatureEnabled(context, namespace, name,
+ moduleName, defaultEnabled);
+ }
+
+ boolean getDeviceConfigBoolean(@NonNull String namespace, @NonNull String name,
+ boolean defaultValue) {
+ return DeviceConfig.getBoolean(namespace, name, defaultValue);
+ }
+ }
+
+ public TetheringConfiguration(@NonNull Context ctx, @NonNull SharedLog log, int id) {
+ this(ctx, log, id, new Dependencies());
+ }
+
+ @VisibleForTesting
+ public TetheringConfiguration(@NonNull Context ctx, @NonNull SharedLog log, int id,
+ @NonNull Dependencies deps) {
+ mDeps = deps;
final SharedLog configLog = log.forSubComponent("config");
activeDataSubId = id;
@@ -583,17 +611,7 @@
}
private boolean getDeviceConfigBoolean(final String name, final boolean defaultValue) {
- // Due to the limitation of static mock for testing, using #getDeviceConfigProperty instead
- // of DeviceConfig#getBoolean. If using #getBoolean here, the test can't know that the
- // returned boolean value comes from device config or default value (because of null
- // property string). See the test case testBpfOffload{*} in TetheringConfigurationTest.java.
- final String value = getDeviceConfigProperty(name);
- return value != null ? Boolean.parseBoolean(value) : defaultValue;
- }
-
- @VisibleForTesting
- protected String getDeviceConfigProperty(String name) {
- return DeviceConfig.getProperty(NAMESPACE_CONNECTIVITY, name);
+ return mDeps.getDeviceConfigBoolean(NAMESPACE_CONNECTIVITY, name, defaultValue);
}
/**
@@ -610,10 +628,9 @@
return isFeatureEnabled(ctx, NAMESPACE_TETHERING, featureVersionFlag);
}
- @VisibleForTesting
- protected boolean isFeatureEnabled(Context ctx, String namespace, String featureVersionFlag) {
- return DeviceConfigUtils.isFeatureEnabled(ctx, namespace, featureVersionFlag,
- TETHERING_MODULE_NAME, false /* defaultEnabled */);
+ private boolean isFeatureEnabled(Context ctx, String namespace, String featureVersionFlag) {
+ return mDeps.isFeatureEnabled(ctx, namespace, featureVersionFlag, TETHERING_MODULE_NAME,
+ false /* defaultEnabled */);
}
private Resources getResources(Context ctx, int subId) {
diff --git a/Tethering/src/com/android/networkstack/tethering/metrics/TetheringMetrics.java b/Tethering/src/com/android/networkstack/tethering/metrics/TetheringMetrics.java
index ffcea4e..814afcd 100644
--- a/Tethering/src/com/android/networkstack/tethering/metrics/TetheringMetrics.java
+++ b/Tethering/src/com/android/networkstack/tethering/metrics/TetheringMetrics.java
@@ -16,6 +16,12 @@
package com.android.networkstack.tethering.metrics;
+import static android.net.NetworkCapabilities.TRANSPORT_BLUETOOTH;
+import static android.net.NetworkCapabilities.TRANSPORT_CELLULAR;
+import static android.net.NetworkCapabilities.TRANSPORT_ETHERNET;
+import static android.net.NetworkCapabilities.TRANSPORT_LOWPAN;
+import static android.net.NetworkCapabilities.TRANSPORT_WIFI;
+import static android.net.NetworkCapabilities.TRANSPORT_WIFI_AWARE;
import static android.net.TetheringManager.TETHERING_BLUETOOTH;
import static android.net.TetheringManager.TETHERING_ETHERNET;
import static android.net.TetheringManager.TETHERING_NCM;
@@ -39,6 +45,8 @@
import static android.net.TetheringManager.TETHER_ERROR_UNSUPPORTED;
import static android.net.TetheringManager.TETHER_ERROR_UNTETHER_IFACE_ERROR;
+import android.annotation.Nullable;
+import android.net.NetworkCapabilities;
import android.stats.connectivity.DownstreamType;
import android.stats.connectivity.ErrorCode;
import android.stats.connectivity.UpstreamType;
@@ -49,6 +57,11 @@
import androidx.annotation.NonNull;
import androidx.annotation.VisibleForTesting;
+import com.android.networkstack.tethering.UpstreamNetworkState;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+
/**
* Collection of utilities for tethering metrics.
*
@@ -66,21 +79,58 @@
private static final String SYSTEMUI_PKG_NAME = "com.android.systemui";
private static final String GMS_PKG_NAME = "com.google.android.gms";
private final SparseArray<NetworkTetheringReported.Builder> mBuilderMap = new SparseArray<>();
+ private final SparseArray<Long> mDownstreamStartTime = new SparseArray<Long>();
+ private final ArrayList<RecordUpstreamEvent> mUpstreamEventList = new ArrayList<>();
+ private UpstreamType mCurrentUpstream = null;
+ private Long mCurrentUpStreamStartTime = 0L;
- /** Update Tethering stats about caller's package name and downstream type. */
- public void createBuilder(final int downstreamType, final String callerPkg) {
- NetworkTetheringReported.Builder statsBuilder =
- NetworkTetheringReported.newBuilder();
- statsBuilder.setDownstreamType(downstreamTypeToEnum(downstreamType))
- .setUserType(userTypeToEnum(callerPkg))
- .setUpstreamType(UpstreamType.UT_UNKNOWN)
- .setErrorCode(ErrorCode.EC_NO_ERROR)
- .setUpstreamEvents(UpstreamEvents.newBuilder())
- .setDurationMillis(0);
- mBuilderMap.put(downstreamType, statsBuilder);
+
+ /**
+ * Return the current system time in milliseconds.
+ * @return the current system time in milliseconds.
+ */
+ public long timeNow() {
+ return System.currentTimeMillis();
}
- /** Update error code of given downstreamType. */
+ private static class RecordUpstreamEvent {
+ public final long mStartTime;
+ public final long mStopTime;
+ public final UpstreamType mUpstreamType;
+
+ RecordUpstreamEvent(final long startTime, final long stopTime,
+ final UpstreamType upstream) {
+ mStartTime = startTime;
+ mStopTime = stopTime;
+ mUpstreamType = upstream;
+ }
+ }
+
+ /**
+ * Creates a |NetworkTetheringReported.Builder| object to update the tethering stats for the
+ * specified downstream type and caller's package name. Initializes the upstream events, error
+ * code, and duration to default values. Sets the start time for the downstream type in the
+ * |mDownstreamStartTime| map.
+ * @param downstreamType The type of downstream connection (e.g. Wifi, USB, Bluetooth).
+ * @param callerPkg The package name of the caller.
+ */
+ public void createBuilder(final int downstreamType, final String callerPkg) {
+ NetworkTetheringReported.Builder statsBuilder = NetworkTetheringReported.newBuilder()
+ .setDownstreamType(downstreamTypeToEnum(downstreamType))
+ .setUserType(userTypeToEnum(callerPkg))
+ .setUpstreamType(UpstreamType.UT_UNKNOWN)
+ .setErrorCode(ErrorCode.EC_NO_ERROR)
+ .setUpstreamEvents(UpstreamEvents.newBuilder())
+ .setDurationMillis(0);
+ mBuilderMap.put(downstreamType, statsBuilder);
+ mDownstreamStartTime.put(downstreamType, timeNow());
+ }
+
+ /**
+ * Update the error code of the given downstream type in the Tethering stats.
+ * @param downstreamType The downstream type whose error code to update.
+ * @param errCode The error code to set.
+ */
public void updateErrorCode(final int downstreamType, final int errCode) {
NetworkTetheringReported.Builder statsBuilder = mBuilderMap.get(downstreamType);
if (statsBuilder == null) {
@@ -90,38 +140,150 @@
statsBuilder.setErrorCode(errorCodeToEnum(errCode));
}
- /** Remove Tethering stats.
- * If Tethering stats is ready to write then write it before removing.
+ /**
+ * Update the list of upstream types and their duration whenever the current upstream type
+ * changes.
+ * @param ns The UpstreamNetworkState object representing the current upstream network state.
+ */
+ public void maybeUpdateUpstreamType(@Nullable final UpstreamNetworkState ns) {
+ UpstreamType upstream = transportTypeToUpstreamTypeEnum(ns);
+ if (upstream.equals(mCurrentUpstream)) return;
+
+ final long newTime = timeNow();
+ if (mCurrentUpstream != null) {
+ mUpstreamEventList.add(new RecordUpstreamEvent(mCurrentUpStreamStartTime, newTime,
+ mCurrentUpstream));
+ }
+ mCurrentUpstream = upstream;
+ mCurrentUpStreamStartTime = newTime;
+ }
+
+ /**
+ * Updates the upstream events builder with a new upstream event.
+ * @param upstreamEventsBuilder the builder for the upstream events list
+ * @param start the start time of the upstream event
+ * @param stop the stop time of the upstream event
+ * @param upstream the type of upstream type (e.g. Wifi, Cellular, Bluetooth, ...)
+ */
+ private void addUpstreamEvent(final UpstreamEvents.Builder upstreamEventsBuilder,
+ final long start, final long stop, @Nullable final UpstreamType upstream,
+ final long txBytes, final long rxBytes) {
+ final UpstreamEvent.Builder upstreamEventBuilder = UpstreamEvent.newBuilder()
+ .setUpstreamType(upstream == null ? UpstreamType.UT_NO_NETWORK : upstream)
+ .setDurationMillis(stop - start)
+ .setTxBytes(txBytes)
+ .setRxBytes(rxBytes);
+ upstreamEventsBuilder.addUpstreamEvent(upstreamEventBuilder);
+ }
+
+ /**
+ * Updates the |NetworkTetheringReported.Builder| with relevant upstream events associated with
+ * the downstream event identified by the given downstream start time.
+ *
+ * This method iterates through the list of upstream events and adds any relevant events to a
+ * |UpstreamEvents.Builder|. Upstream events are considered relevant if their stop time is
+ * greater than or equal to the given downstream start time. The method also adds the last
+ * upstream event that occurred up until the current time.
+ *
+ * The resulting |UpstreamEvents.Builder| is then added to the
+ * |NetworkTetheringReported.Builder|, along with the duration of the downstream event
+ * (i.e., stop time minus downstream start time).
+ *
+ * @param statsBuilder the builder for the NetworkTetheringReported message
+ * @param downstreamStartTime the start time of the downstream event to find relevant upstream
+ * events for
+ */
+ private void noteDownstreamStopped(final NetworkTetheringReported.Builder statsBuilder,
+ final long downstreamStartTime) {
+ UpstreamEvents.Builder upstreamEventsBuilder = UpstreamEvents.newBuilder();
+
+ for (RecordUpstreamEvent event : mUpstreamEventList) {
+ if (downstreamStartTime > event.mStopTime) continue;
+
+ final long startTime = Math.max(downstreamStartTime, event.mStartTime);
+ // Handle completed upstream events.
+ addUpstreamEvent(upstreamEventsBuilder, startTime, event.mStopTime,
+ event.mUpstreamType, 0L /* txBytes */, 0L /* rxBytes */);
+ }
+ final long startTime = Math.max(downstreamStartTime, mCurrentUpStreamStartTime);
+ final long stopTime = timeNow();
+ // Handle the last upstream event.
+ addUpstreamEvent(upstreamEventsBuilder, startTime, stopTime, mCurrentUpstream,
+ 0L /* txBytes */, 0L /* rxBytes */);
+ statsBuilder.setUpstreamEvents(upstreamEventsBuilder);
+ statsBuilder.setDurationMillis(stopTime - downstreamStartTime);
+ }
+
+ /**
+ * Removes tethering statistics for the given downstream type. If there are any stats to write
+ * for the downstream event associated with the type, they are written before removing the
+ * statistics.
+ *
+ * If the given downstream type does not exist in the map, an error message is logged and the
+ * method returns without doing anything.
+ *
+ * @param downstreamType the type of downstream event to remove statistics for
*/
public void sendReport(final int downstreamType) {
- final NetworkTetheringReported.Builder statsBuilder =
- mBuilderMap.get(downstreamType);
+ final NetworkTetheringReported.Builder statsBuilder = mBuilderMap.get(downstreamType);
if (statsBuilder == null) {
Log.e(TAG, "Given downstreamType does not exist, this is a bug!");
return;
}
+
+ noteDownstreamStopped(statsBuilder, mDownstreamStartTime.get(downstreamType));
write(statsBuilder.build());
+
mBuilderMap.remove(downstreamType);
+ mDownstreamStartTime.remove(downstreamType);
}
- /** Collect Tethering stats and write metrics data to statsd pipeline. */
+ /**
+ * Collects tethering statistics and writes them to the statsd pipeline. This method takes in a
+ * NetworkTetheringReported object, extracts its fields and uses them to write statistics data
+ * to the statsd pipeline.
+ *
+ * @param reported a NetworkTetheringReported object containing statistics to write
+ */
@VisibleForTesting
public void write(@NonNull final NetworkTetheringReported reported) {
- TetheringStatsLog.write(TetheringStatsLog.NETWORK_TETHERING_REPORTED,
+ final byte[] upstreamEvents = reported.getUpstreamEvents().toByteArray();
+
+ TetheringStatsLog.write(
+ TetheringStatsLog.NETWORK_TETHERING_REPORTED,
reported.getErrorCode().getNumber(),
reported.getDownstreamType().getNumber(),
reported.getUpstreamType().getNumber(),
reported.getUserType().getNumber(),
- null, 0);
+ upstreamEvents,
+ reported.getDurationMillis());
if (DBG) {
- Log.d(TAG, "Write errorCode: " + reported.getErrorCode().getNumber()
- + ", downstreamType: " + reported.getDownstreamType().getNumber()
- + ", upstreamType: " + reported.getUpstreamType().getNumber()
- + ", userType: " + reported.getUserType().getNumber());
+ Log.d(
+ TAG,
+ "Write errorCode: "
+ + reported.getErrorCode().getNumber()
+ + ", downstreamType: "
+ + reported.getDownstreamType().getNumber()
+ + ", upstreamType: "
+ + reported.getUpstreamType().getNumber()
+ + ", userType: "
+ + reported.getUserType().getNumber()
+ + ", upstreamTypes: "
+ + Arrays.toString(upstreamEvents)
+ + ", durationMillis: "
+ + reported.getDurationMillis());
}
}
- /** Map {@link TetheringType} to {@link DownstreamType} */
+ /**
+ * Cleans up the variables related to upstream events when tethering is turned off.
+ */
+ public void cleanup() {
+ mUpstreamEventList.clear();
+ mCurrentUpstream = null;
+ mCurrentUpStreamStartTime = 0L;
+ }
+
private DownstreamType downstreamTypeToEnum(final int ifaceType) {
switch(ifaceType) {
case TETHERING_WIFI:
@@ -141,7 +303,6 @@
}
}
- /** Map {@link StartTetheringError} to {@link ErrorCode} */
private ErrorCode errorCodeToEnum(final int lastError) {
switch(lastError) {
case TETHER_ERROR_NO_ERROR:
@@ -181,7 +342,6 @@
}
}
- /** Map callerPkg to {@link UserType} */
private UserType userTypeToEnum(final String callerPkg) {
if (callerPkg.equals(SETTINGS_PKG_NAME)) {
return UserType.USER_SETTINGS;
@@ -193,4 +353,25 @@
return UserType.USER_UNKNOWN;
}
}
+
+ private UpstreamType transportTypeToUpstreamTypeEnum(final UpstreamNetworkState ns) {
+ final NetworkCapabilities nc = (ns != null) ? ns.networkCapabilities : null;
+ if (nc == null) return UpstreamType.UT_NO_NETWORK;
+
+ final int typeCount = nc.getTransportTypes().length;
+ // It's possible for a VCN network to be mapped to UT_UNKNOWN, as it may consist of both
+ // Wi-Fi and cellular transport.
+ // TODO: It's necessary to define a new upstream type for VCN, which can be identified by
+ // NET_CAPABILITY_NOT_VCN_MANAGED.
+ if (typeCount > 1) return UpstreamType.UT_UNKNOWN;
+
+ if (nc.hasTransport(TRANSPORT_CELLULAR)) return UpstreamType.UT_CELLULAR;
+ if (nc.hasTransport(TRANSPORT_WIFI)) return UpstreamType.UT_WIFI;
+ if (nc.hasTransport(TRANSPORT_BLUETOOTH)) return UpstreamType.UT_BLUETOOTH;
+ if (nc.hasTransport(TRANSPORT_ETHERNET)) return UpstreamType.UT_ETHERNET;
+ if (nc.hasTransport(TRANSPORT_WIFI_AWARE)) return UpstreamType.UT_WIFI_AWARE;
+ if (nc.hasTransport(TRANSPORT_LOWPAN)) return UpstreamType.UT_LOWPAN;
+
+ return UpstreamType.UT_UNKNOWN;
+ }
}
diff --git a/Tethering/src/com/android/networkstack/tethering/metrics/stats.proto b/Tethering/src/com/android/networkstack/tethering/metrics/stats.proto
index 27f2126..b276389 100644
--- a/Tethering/src/com/android/networkstack/tethering/metrics/stats.proto
+++ b/Tethering/src/com/android/networkstack/tethering/metrics/stats.proto
@@ -21,13 +21,21 @@
import "frameworks/proto_logging/stats/enums/stats/connectivity/tethering.proto";
-// Logs each upstream for a successful switch over
+/**
+ * Represents an event that logs information about a successful switch to an upstream network.
+ */
message UpstreamEvent {
- // Transport type of upstream network
+ // Indicates the transport type of network.
optional .android.stats.connectivity.UpstreamType upstream_type = 1;
- // A time period that an upstream continued
+ // The duration of network usage.
optional int64 duration_millis = 2;
+
+ // The amount of data received from tethered clients.
+ optional int64 tx_bytes = 3;
+
+ // The amount of data received from remote.
+ optional int64 rx_bytes = 4;
}
message UpstreamEvents {
diff --git a/Tethering/tests/integration/base/android/net/EthernetTetheringTestBase.java b/Tethering/tests/integration/base/android/net/EthernetTetheringTestBase.java
index 7685981..9162546 100644
--- a/Tethering/tests/integration/base/android/net/EthernetTetheringTestBase.java
+++ b/Tethering/tests/integration/base/android/net/EthernetTetheringTestBase.java
@@ -25,17 +25,14 @@
import static android.net.TetheringManager.CONNECTIVITY_SCOPE_GLOBAL;
import static android.net.TetheringManager.CONNECTIVITY_SCOPE_LOCAL;
import static android.net.TetheringManager.TETHERING_ETHERNET;
+import static android.net.TetheringTester.buildTcpPacket;
+import static android.net.TetheringTester.buildUdpPacket;
+import static android.net.TetheringTester.isAddressIpv4;
import static android.net.TetheringTester.isExpectedIcmpPacket;
import static android.net.TetheringTester.isExpectedTcpPacket;
import static android.net.TetheringTester.isExpectedUdpPacket;
-import static android.system.OsConstants.IPPROTO_IP;
-import static android.system.OsConstants.IPPROTO_IPV6;
-import static android.system.OsConstants.IPPROTO_TCP;
-import static android.system.OsConstants.IPPROTO_UDP;
import static com.android.net.module.util.HexDump.dumpHexString;
-import static com.android.net.module.util.NetworkStackConstants.ETHER_TYPE_IPV4;
-import static com.android.net.module.util.NetworkStackConstants.ETHER_TYPE_IPV6;
import static com.android.net.module.util.NetworkStackConstants.ICMPV6_ROUTER_ADVERTISEMENT;
import static com.android.net.module.util.NetworkStackConstants.TCPHDR_ACK;
import static com.android.net.module.util.NetworkStackConstants.TCPHDR_SYN;
@@ -67,11 +64,11 @@
import android.util.Log;
import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
import androidx.test.platform.app.InstrumentationRegistry;
import com.android.modules.utils.build.SdkLevel;
-import com.android.net.module.util.PacketBuilder;
+import com.android.net.module.util.Struct;
+import com.android.net.module.util.structs.Ipv6Header;
import com.android.testutils.HandlerUtils;
import com.android.testutils.TapPacketReader;
import com.android.testutils.TestNetworkTracker;
@@ -122,29 +119,17 @@
(Inet4Address) parseNumericAddress("8.8.8.8");
protected static final Inet6Address REMOTE_IP6_ADDR =
(Inet6Address) parseNumericAddress("2002:db8:1::515:ca");
+ // The IPv6 network address translation of REMOTE_IP4_ADDR if pref64::/n is 64:ff9b::/96.
+ // For more information, see TetheringTester#PREF64_IPV4ONLY_ADDR, which assumes a prefix
+ // of 64:ff9b::/96.
protected static final Inet6Address REMOTE_NAT64_ADDR =
(Inet6Address) parseNumericAddress("64:ff9b::808:808");
- protected static final IpPrefix TEST_NAT64PREFIX = new IpPrefix("64:ff9b::/96");
- // IPv4 header definition.
- protected static final short ID = 27149;
- protected static final short FLAGS_AND_FRAGMENT_OFFSET = (short) 0x4000; // flags=DF, offset=0
- protected static final byte TIME_TO_LIVE = (byte) 0x40;
- protected static final byte TYPE_OF_SERVICE = 0;
-
- // IPv6 header definition.
- private static final short HOP_LIMIT = 0x40;
- // version=6, traffic class=0x0, flowlabel=0x0;
- private static final int VERSION_TRAFFICCLASS_FLOWLABEL = 0x60000000;
-
- // UDP and TCP header definition.
// LOCAL_PORT is used by public port and private port. Assume port 9876 has not been used yet
// before the testing that public port and private port are the same in the testing. Note that
// NAT port forwarding could be different between private port and public port.
protected static final short LOCAL_PORT = 9876;
protected static final short REMOTE_PORT = 433;
- private static final short WINDOW = (short) 0x2000;
- private static final short URGENT_POINTER = 0;
// Payload definition.
protected static final ByteBuffer EMPTY_PAYLOAD = ByteBuffer.wrap(new byte[0]);
@@ -213,6 +198,13 @@
}
}
+ protected void stopEthernetTethering(final MyTetheringEventCallback callback) {
+ runAsShell(TETHER_PRIVILEGED, () -> {
+ mTm.stopTethering(TETHERING_ETHERNET);
+ maybeUnregisterTetheringEventCallback(callback);
+ });
+ }
+
protected void cleanUp() throws Exception {
setPreferTestNetworks(false);
@@ -251,6 +243,7 @@
if (mRunTests) cleanUp();
} finally {
mHandlerThread.quitSafely();
+ mHandlerThread.join();
mUiAutomation.dropShellPermissionIdentity();
}
}
@@ -639,77 +632,10 @@
final LinkProperties lp = new LinkProperties();
lp.setLinkAddresses(addresses);
lp.setDnsServers(dnses);
- lp.setNat64Prefix(TEST_NAT64PREFIX);
return runAsShell(MANAGE_TEST_NETWORKS, () -> initTestNetwork(mContext, lp, TIMEOUT_MS));
}
- private short getEthType(@NonNull final InetAddress srcIp, @NonNull final InetAddress dstIp) {
- return isAddressIpv4(srcIp, dstIp) ? (short) ETHER_TYPE_IPV4 : (short) ETHER_TYPE_IPV6;
- }
-
- private int getIpProto(@NonNull final InetAddress srcIp, @NonNull final InetAddress dstIp) {
- return isAddressIpv4(srcIp, dstIp) ? IPPROTO_IP : IPPROTO_IPV6;
- }
-
- @NonNull
- protected ByteBuffer buildUdpPacket(
- @Nullable final MacAddress srcMac, @Nullable final MacAddress dstMac,
- @NonNull final InetAddress srcIp, @NonNull final InetAddress dstIp,
- short srcPort, short dstPort, @Nullable final ByteBuffer payload)
- throws Exception {
- final int ipProto = getIpProto(srcIp, dstIp);
- final boolean hasEther = (srcMac != null && dstMac != null);
- final int payloadLen = (payload == null) ? 0 : payload.limit();
- final ByteBuffer buffer = PacketBuilder.allocate(hasEther, ipProto, IPPROTO_UDP,
- payloadLen);
- final PacketBuilder packetBuilder = new PacketBuilder(buffer);
-
- // [1] Ethernet header
- if (hasEther) {
- packetBuilder.writeL2Header(srcMac, dstMac, getEthType(srcIp, dstIp));
- }
-
- // [2] IP header
- if (ipProto == IPPROTO_IP) {
- packetBuilder.writeIpv4Header(TYPE_OF_SERVICE, ID, FLAGS_AND_FRAGMENT_OFFSET,
- TIME_TO_LIVE, (byte) IPPROTO_UDP, (Inet4Address) srcIp, (Inet4Address) dstIp);
- } else {
- packetBuilder.writeIpv6Header(VERSION_TRAFFICCLASS_FLOWLABEL, (byte) IPPROTO_UDP,
- HOP_LIMIT, (Inet6Address) srcIp, (Inet6Address) dstIp);
- }
-
- // [3] UDP header
- packetBuilder.writeUdpHeader(srcPort, dstPort);
-
- // [4] Payload
- if (payload != null) {
- buffer.put(payload);
- // in case data might be reused by caller, restore the position and
- // limit of bytebuffer.
- payload.clear();
- }
-
- return packetBuilder.finalizePacket();
- }
-
- @NonNull
- protected ByteBuffer buildUdpPacket(@NonNull final InetAddress srcIp,
- @NonNull final InetAddress dstIp, short srcPort, short dstPort,
- @Nullable final ByteBuffer payload) throws Exception {
- return buildUdpPacket(null /* srcMac */, null /* dstMac */, srcIp, dstIp, srcPort,
- dstPort, payload);
- }
-
- private boolean isAddressIpv4(@NonNull final InetAddress srcIp,
- @NonNull final InetAddress dstIp) {
- if (srcIp instanceof Inet4Address && dstIp instanceof Inet4Address) return true;
- if (srcIp instanceof Inet6Address && dstIp instanceof Inet6Address) return false;
-
- fail("Unsupported conditions: srcIp " + srcIp + ", dstIp " + dstIp);
- return false; // unreachable
- }
-
protected void sendDownloadPacketUdp(@NonNull final InetAddress srcIp,
@NonNull final InetAddress dstIp, @NonNull final TetheringTester tester,
boolean is6To4) throws Exception {
@@ -751,45 +677,6 @@
});
}
-
- @NonNull
- private ByteBuffer buildTcpPacket(
- @Nullable final MacAddress srcMac, @Nullable final MacAddress dstMac,
- @NonNull final InetAddress srcIp, @NonNull final InetAddress dstIp,
- short srcPort, short dstPort, final short seq, final short ack,
- final byte tcpFlags, @NonNull final ByteBuffer payload) throws Exception {
- final int ipProto = getIpProto(srcIp, dstIp);
- final boolean hasEther = (srcMac != null && dstMac != null);
- final ByteBuffer buffer = PacketBuilder.allocate(hasEther, ipProto, IPPROTO_TCP,
- payload.limit());
- final PacketBuilder packetBuilder = new PacketBuilder(buffer);
-
- // [1] Ethernet header
- if (hasEther) {
- packetBuilder.writeL2Header(srcMac, dstMac, getEthType(srcIp, dstIp));
- }
-
- // [2] IP header
- if (ipProto == IPPROTO_IP) {
- packetBuilder.writeIpv4Header(TYPE_OF_SERVICE, ID, FLAGS_AND_FRAGMENT_OFFSET,
- TIME_TO_LIVE, (byte) IPPROTO_TCP, (Inet4Address) srcIp, (Inet4Address) dstIp);
- } else {
- packetBuilder.writeIpv6Header(VERSION_TRAFFICCLASS_FLOWLABEL, (byte) IPPROTO_TCP,
- HOP_LIMIT, (Inet6Address) srcIp, (Inet6Address) dstIp);
- }
-
- // [3] TCP header
- packetBuilder.writeTcpHeader(srcPort, dstPort, seq, ack, tcpFlags, WINDOW, URGENT_POINTER);
-
- // [4] Payload
- buffer.put(payload);
- // in case data might be reused by caller, restore the position and
- // limit of bytebuffer.
- payload.clear();
-
- return packetBuilder.finalizePacket();
- }
-
protected void sendDownloadPacketTcp(@NonNull final InetAddress srcIp,
@NonNull final InetAddress dstIp, short seq, short ack, byte tcpFlags,
@NonNull final ByteBuffer payload, @NonNull final TetheringTester tester,
@@ -1013,6 +900,18 @@
return new TetheringTester(mDownstreamReader, mUpstreamReader);
}
+ @NonNull
+ protected Inet6Address getClatIpv6Address(TetheringTester tester, TetheredDevice tethered)
+ throws Exception {
+ // Send an IPv4 UDP packet from client and check that a CLAT translated IPv6 UDP packet can
+ // be found on upstream interface. Get CLAT IPv6 address from the CLAT translated IPv6 UDP
+ // packet.
+ byte[] expectedPacket = probeV4TetheringConnectivity(tester, tethered, true /* is4To6 */);
+
+ // Above has guaranteed that the found packet is an IPv6 packet without ether header.
+ return Struct.parse(Ipv6Header.class, ByteBuffer.wrap(expectedPacket)).srcIp;
+ }
+
protected <T> List<T> toList(T... array) {
return Arrays.asList(array);
}
diff --git a/Tethering/tests/integration/base/android/net/TetheringTester.java b/Tethering/tests/integration/base/android/net/TetheringTester.java
index ae39b24..3f3768e 100644
--- a/Tethering/tests/integration/base/android/net/TetheringTester.java
+++ b/Tethering/tests/integration/base/android/net/TetheringTester.java
@@ -16,17 +16,27 @@
package android.net;
+import static android.net.DnsResolver.CLASS_IN;
+import static android.net.DnsResolver.TYPE_AAAA;
import static android.net.InetAddresses.parseNumericAddress;
+import static android.system.OsConstants.ICMP_ECHO;
+import static android.system.OsConstants.ICMP_ECHOREPLY;
import static android.system.OsConstants.IPPROTO_ICMP;
import static android.system.OsConstants.IPPROTO_ICMPV6;
+import static android.system.OsConstants.IPPROTO_IP;
+import static android.system.OsConstants.IPPROTO_IPV6;
import static android.system.OsConstants.IPPROTO_TCP;
import static android.system.OsConstants.IPPROTO_UDP;
import static com.android.net.module.util.DnsPacket.ANSECTION;
import static com.android.net.module.util.DnsPacket.ARSECTION;
+import static com.android.net.module.util.DnsPacket.DnsHeader;
+import static com.android.net.module.util.DnsPacket.DnsRecord;
import static com.android.net.module.util.DnsPacket.NSSECTION;
import static com.android.net.module.util.DnsPacket.QDSECTION;
import static com.android.net.module.util.HexDump.dumpHexString;
+import static com.android.net.module.util.IpUtils.icmpChecksum;
+import static com.android.net.module.util.IpUtils.ipChecksum;
import static com.android.net.module.util.NetworkStackConstants.ARP_REPLY;
import static com.android.net.module.util.NetworkStackConstants.ARP_REQUEST;
import static com.android.net.module.util.NetworkStackConstants.ETHER_ADDR_LEN;
@@ -38,6 +48,10 @@
import static com.android.net.module.util.NetworkStackConstants.ICMPV6_ND_OPTION_TLLA;
import static com.android.net.module.util.NetworkStackConstants.ICMPV6_NEIGHBOR_SOLICITATION;
import static com.android.net.module.util.NetworkStackConstants.ICMPV6_ROUTER_ADVERTISEMENT;
+import static com.android.net.module.util.NetworkStackConstants.ICMP_CHECKSUM_OFFSET;
+import static com.android.net.module.util.NetworkStackConstants.IPV4_CHECKSUM_OFFSET;
+import static com.android.net.module.util.NetworkStackConstants.IPV4_HEADER_MIN_LEN;
+import static com.android.net.module.util.NetworkStackConstants.IPV4_LENGTH_OFFSET;
import static com.android.net.module.util.NetworkStackConstants.IPV6_ADDR_ALL_NODES_MULTICAST;
import static com.android.net.module.util.NetworkStackConstants.NEIGHBOR_ADVERTISEMENT_FLAG_OVERRIDE;
import static com.android.net.module.util.NetworkStackConstants.NEIGHBOR_ADVERTISEMENT_FLAG_SOLICITED;
@@ -58,6 +72,7 @@
import com.android.net.module.util.DnsPacket;
import com.android.net.module.util.Ipv6Utils;
+import com.android.net.module.util.PacketBuilder;
import com.android.net.module.util.Struct;
import com.android.net.module.util.structs.EthernetHeader;
import com.android.net.module.util.structs.Icmpv4Header;
@@ -101,6 +116,44 @@
DhcpPacket.DHCP_LEASE_TIME,
};
private static final InetAddress LINK_LOCAL = parseNumericAddress("fe80::1");
+ // IPv4 header definition.
+ protected static final short ID = 27149;
+ protected static final short FLAGS_AND_FRAGMENT_OFFSET = (short) 0x4000; // flags=DF, offset=0
+ protected static final byte TIME_TO_LIVE = (byte) 0x40;
+ protected static final byte TYPE_OF_SERVICE = 0;
+
+ // IPv6 header definition.
+ private static final short HOP_LIMIT = 0x40;
+ // version=6, traffic class=0x0, flowlabel=0x0;
+ private static final int VERSION_TRAFFICCLASS_FLOWLABEL = 0x60000000;
+
+ // UDP and TCP header definition.
+ private static final short WINDOW = (short) 0x2000;
+ private static final short URGENT_POINTER = 0;
+
+ // ICMP definition.
+ private static final short ICMPECHO_CODE = 0x0;
+
+ // Prefix64 discovery definition. See RFC 7050 section 8.
+ // Note that the AAAA response Pref64::WKAs consisting of Pref64::/n and WKA.
+ // Use 64:ff9b::/96 as Pref64::/n and WKA 192.0.0.17{0|1} here.
+ //
+ // Host DNS64 server
+ // | |
+ // | "AAAA" query for "ipv4only.arpa." |
+ // |----------------------------------------------->|
+ // | |
+ // | "AAAA" response with: |
+ // | "64:ff9b::192.0.0.170" |
+ // |<-----------------------------------------------|
+ //
+ private static final String PREF64_IPV4ONLY_HOSTNAME = "ipv4only.arpa";
+ private static final InetAddress PREF64_IPV4ONLY_ADDR = parseNumericAddress(
+ "64:ff9b::192.0.0.170");
+
+ // DNS header definition.
+ private static final short FLAG = (short) 0x8100; // qr, ra
+ private static final short TTL = (short) 0;
public static final String DHCP_HOSTNAME = "testhostname";
@@ -462,6 +515,11 @@
super(data);
}
+ TestDnsPacket(@NonNull DnsHeader header, @Nullable ArrayList<DnsRecord> qd,
+ @Nullable ArrayList<DnsRecord> an) {
+ super(header, qd, an);
+ }
+
@Nullable
public static TestDnsPacket getTestDnsPacket(final ByteBuffer buf) {
try {
@@ -628,7 +686,191 @@
return false;
}
- private void sendUploadPacket(ByteBuffer packet) throws Exception {
+ @NonNull
+ public static ByteBuffer buildUdpPacket(
+ @Nullable final MacAddress srcMac, @Nullable final MacAddress dstMac,
+ @NonNull final InetAddress srcIp, @NonNull final InetAddress dstIp,
+ short srcPort, short dstPort, @Nullable final ByteBuffer payload)
+ throws Exception {
+ final int ipProto = getIpProto(srcIp, dstIp);
+ final boolean hasEther = (srcMac != null && dstMac != null);
+ final int payloadLen = (payload == null) ? 0 : payload.limit();
+ final ByteBuffer buffer = PacketBuilder.allocate(hasEther, ipProto, IPPROTO_UDP,
+ payloadLen);
+ final PacketBuilder packetBuilder = new PacketBuilder(buffer);
+
+ // [1] Ethernet header
+ if (hasEther) {
+ packetBuilder.writeL2Header(srcMac, dstMac, getEthType(srcIp, dstIp));
+ }
+
+ // [2] IP header
+ if (ipProto == IPPROTO_IP) {
+ packetBuilder.writeIpv4Header(TYPE_OF_SERVICE, ID, FLAGS_AND_FRAGMENT_OFFSET,
+ TIME_TO_LIVE, (byte) IPPROTO_UDP, (Inet4Address) srcIp, (Inet4Address) dstIp);
+ } else {
+ packetBuilder.writeIpv6Header(VERSION_TRAFFICCLASS_FLOWLABEL, (byte) IPPROTO_UDP,
+ HOP_LIMIT, (Inet6Address) srcIp, (Inet6Address) dstIp);
+ }
+
+ // [3] UDP header
+ packetBuilder.writeUdpHeader(srcPort, dstPort);
+
+ // [4] Payload
+ if (payload != null) {
+ buffer.put(payload);
+ // in case data might be reused by caller, restore the position and
+ // limit of bytebuffer.
+ payload.clear();
+ }
+
+ return packetBuilder.finalizePacket();
+ }
+
+ @NonNull
+ public static ByteBuffer buildUdpPacket(@NonNull final InetAddress srcIp,
+ @NonNull final InetAddress dstIp, short srcPort, short dstPort,
+ @Nullable final ByteBuffer payload) throws Exception {
+ return buildUdpPacket(null /* srcMac */, null /* dstMac */, srcIp, dstIp, srcPort,
+ dstPort, payload);
+ }
+
+ @NonNull
+ public static ByteBuffer buildTcpPacket(
+ @Nullable final MacAddress srcMac, @Nullable final MacAddress dstMac,
+ @NonNull final InetAddress srcIp, @NonNull final InetAddress dstIp,
+ short srcPort, short dstPort, final short seq, final short ack,
+ final byte tcpFlags, @NonNull final ByteBuffer payload) throws Exception {
+ final int ipProto = getIpProto(srcIp, dstIp);
+ final boolean hasEther = (srcMac != null && dstMac != null);
+ final ByteBuffer buffer = PacketBuilder.allocate(hasEther, ipProto, IPPROTO_TCP,
+ payload.limit());
+ final PacketBuilder packetBuilder = new PacketBuilder(buffer);
+
+ // [1] Ethernet header
+ if (hasEther) {
+ packetBuilder.writeL2Header(srcMac, dstMac, getEthType(srcIp, dstIp));
+ }
+
+ // [2] IP header
+ if (ipProto == IPPROTO_IP) {
+ packetBuilder.writeIpv4Header(TYPE_OF_SERVICE, ID, FLAGS_AND_FRAGMENT_OFFSET,
+ TIME_TO_LIVE, (byte) IPPROTO_TCP, (Inet4Address) srcIp, (Inet4Address) dstIp);
+ } else {
+ packetBuilder.writeIpv6Header(VERSION_TRAFFICCLASS_FLOWLABEL, (byte) IPPROTO_TCP,
+ HOP_LIMIT, (Inet6Address) srcIp, (Inet6Address) dstIp);
+ }
+
+ // [3] TCP header
+ packetBuilder.writeTcpHeader(srcPort, dstPort, seq, ack, tcpFlags, WINDOW, URGENT_POINTER);
+
+ // [4] Payload
+ buffer.put(payload);
+ // in case data might be reused by caller, restore the position and
+ // limit of bytebuffer.
+ payload.clear();
+
+ return packetBuilder.finalizePacket();
+ }
+
+ // PacketBuilder doesn't support IPv4 ICMP packet. It may need to refactor PacketBuilder first
+ // because ICMP is a specific layer 3 protocol for PacketBuilder which expects packets always
+ // have layer 3 (IP) and layer 4 (TCP, UDP) for now. Since we don't use IPv4 ICMP packet too
+ // much in this test, we just write a ICMP packet builder here.
+ @NonNull
+ public static ByteBuffer buildIcmpEchoPacketV4(
+ @Nullable final MacAddress srcMac, @Nullable final MacAddress dstMac,
+ @NonNull final Inet4Address srcIp, @NonNull final Inet4Address dstIp,
+ int type, short id, short seq) throws Exception {
+ if (type != ICMP_ECHO && type != ICMP_ECHOREPLY) {
+ fail("Unsupported ICMP type: " + type);
+ }
+
+ // Build ICMP echo id and seq fields as payload. Ignore the data field.
+ final ByteBuffer payload = ByteBuffer.allocate(4);
+ payload.putShort(id);
+ payload.putShort(seq);
+ payload.rewind();
+
+ final boolean hasEther = (srcMac != null && dstMac != null);
+ final int etherHeaderLen = hasEther ? Struct.getSize(EthernetHeader.class) : 0;
+ final int ipv4HeaderLen = Struct.getSize(Ipv4Header.class);
+ final int Icmpv4HeaderLen = Struct.getSize(Icmpv4Header.class);
+ final int payloadLen = payload.limit();
+ final ByteBuffer packet = ByteBuffer.allocate(etherHeaderLen + ipv4HeaderLen
+ + Icmpv4HeaderLen + payloadLen);
+
+ // [1] Ethernet header
+ if (hasEther) {
+ final EthernetHeader ethHeader = new EthernetHeader(dstMac, srcMac, ETHER_TYPE_IPV4);
+ ethHeader.writeToByteBuffer(packet);
+ }
+
+ // [2] IP header
+ final Ipv4Header ipv4Header = new Ipv4Header(TYPE_OF_SERVICE,
+ (short) 0 /* totalLength, calculate later */, ID,
+ FLAGS_AND_FRAGMENT_OFFSET, TIME_TO_LIVE, (byte) IPPROTO_ICMP,
+ (short) 0 /* checksum, calculate later */, srcIp, dstIp);
+ ipv4Header.writeToByteBuffer(packet);
+
+ // [3] ICMP header
+ final Icmpv4Header icmpv4Header = new Icmpv4Header((byte) type, ICMPECHO_CODE,
+ (short) 0 /* checksum, calculate later */);
+ icmpv4Header.writeToByteBuffer(packet);
+
+ // [4] Payload
+ packet.put(payload);
+ packet.flip();
+
+ // [5] Finalize packet
+ // Used for updating IP header fields. If there is Ehternet header, IPv4 header offset
+ // in buffer equals ethernet header length because IPv4 header is located next to ethernet
+ // header. Otherwise, IPv4 header offset is 0.
+ final int ipv4HeaderOffset = hasEther ? etherHeaderLen : 0;
+
+ // Populate the IPv4 totalLength field.
+ packet.putShort(ipv4HeaderOffset + IPV4_LENGTH_OFFSET,
+ (short) (ipv4HeaderLen + Icmpv4HeaderLen + payloadLen));
+
+ // Populate the IPv4 header checksum field.
+ packet.putShort(ipv4HeaderOffset + IPV4_CHECKSUM_OFFSET,
+ ipChecksum(packet, ipv4HeaderOffset /* headerOffset */));
+
+ // Populate the ICMP checksum field.
+ packet.putShort(ipv4HeaderOffset + IPV4_HEADER_MIN_LEN + ICMP_CHECKSUM_OFFSET,
+ icmpChecksum(packet, ipv4HeaderOffset + IPV4_HEADER_MIN_LEN,
+ Icmpv4HeaderLen + payloadLen));
+ return packet;
+ }
+
+ @NonNull
+ public static ByteBuffer buildIcmpEchoPacketV4(@NonNull final Inet4Address srcIp,
+ @NonNull final Inet4Address dstIp, int type, short id, short seq)
+ throws Exception {
+ return buildIcmpEchoPacketV4(null /* srcMac */, null /* dstMac */, srcIp, dstIp,
+ type, id, seq);
+ }
+
+ private static short getEthType(@NonNull final InetAddress srcIp,
+ @NonNull final InetAddress dstIp) {
+ return isAddressIpv4(srcIp, dstIp) ? (short) ETHER_TYPE_IPV4 : (short) ETHER_TYPE_IPV6;
+ }
+
+ private static int getIpProto(@NonNull final InetAddress srcIp,
+ @NonNull final InetAddress dstIp) {
+ return isAddressIpv4(srcIp, dstIp) ? IPPROTO_IP : IPPROTO_IPV6;
+ }
+
+ public static boolean isAddressIpv4(@NonNull final InetAddress srcIp,
+ @NonNull final InetAddress dstIp) {
+ if (srcIp instanceof Inet4Address && dstIp instanceof Inet4Address) return true;
+ if (srcIp instanceof Inet6Address && dstIp instanceof Inet6Address) return false;
+
+ fail("Unsupported conditions: srcIp " + srcIp + ", dstIp " + dstIp);
+ return false; // unreachable
+ }
+
+ public void sendUploadPacket(ByteBuffer packet) throws Exception {
mDownstreamReader.sendResponse(packet);
}
@@ -650,10 +892,85 @@
return null;
}
+ @NonNull
+ private ByteBuffer buildUdpDnsPrefix64ReplyPacket(int dnsId, @NonNull final Inet6Address srcIp,
+ @NonNull final Inet6Address dstIp, short srcPort, short dstPort) throws Exception {
+ // [1] Build prefix64 DNS message.
+ final ArrayList<DnsRecord> qlist = new ArrayList<>();
+ // Fill QD section.
+ qlist.add(DnsRecord.makeQuestion(PREF64_IPV4ONLY_HOSTNAME, TYPE_AAAA, CLASS_IN));
+ final ArrayList<DnsRecord> alist = new ArrayList<>();
+ // Fill AN sections.
+ alist.add(DnsRecord.makeAOrAAAARecord(ANSECTION, PREF64_IPV4ONLY_HOSTNAME, CLASS_IN, TTL,
+ PREF64_IPV4ONLY_ADDR));
+ final TestDnsPacket dns = new TestDnsPacket(
+ new DnsHeader(dnsId, FLAG, qlist.size(), alist.size()), qlist, alist);
+
+ // [2] Build IPv6 UDP DNS packet.
+ return buildUdpPacket(srcIp, dstIp, srcPort, dstPort, ByteBuffer.wrap(dns.getBytes()));
+ }
+
+ private void maybeReplyUdpDnsPrefix64Discovery(@NonNull byte[] packet) {
+ final ByteBuffer buf = ByteBuffer.wrap(packet);
+
+ // [1] Parse the prefix64 discovery DNS query for hostname ipv4only.arpa.
+ // Parse IPv6 and UDP header.
+ Ipv6Header ipv6Header = null;
+ try {
+ ipv6Header = Struct.parse(Ipv6Header.class, buf);
+ if (ipv6Header == null || ipv6Header.nextHeader != IPPROTO_UDP) return;
+ } catch (Exception e) {
+ // Parsing packet fail means it is not IPv6 UDP packet.
+ return;
+ }
+ final UdpHeader udpHeader = Struct.parse(UdpHeader.class, buf);
+
+ // Parse DNS message.
+ final TestDnsPacket pref64Query = TestDnsPacket.getTestDnsPacket(buf);
+ if (pref64Query == null) return;
+ if (pref64Query.getHeader().isResponse()) return;
+ if (pref64Query.getQDCount() != 1) return;
+ if (pref64Query.getANCount() != 0) return;
+ if (pref64Query.getNSCount() != 0) return;
+ if (pref64Query.getARCount() != 0) return;
+
+ final List<DnsRecord> qdRecordList = pref64Query.getRecordList(QDSECTION);
+ if (qdRecordList.size() != 1) return;
+ if (!qdRecordList.get(0).dName.equals(PREF64_IPV4ONLY_HOSTNAME)) return;
+
+ // [2] Build prefix64 DNS discovery reply from received query.
+ // DNS response transaction id must be copied from DNS query. Used by the requester
+ // to match up replies to outstanding queries. See RFC 1035 section 4.1.1. Also reverse
+ // the source/destination address/port of query packet for building reply packet.
+ final ByteBuffer replyPacket;
+ try {
+ replyPacket = buildUdpDnsPrefix64ReplyPacket(pref64Query.getHeader().getId(),
+ ipv6Header.dstIp /* srcIp */, ipv6Header.srcIp /* dstIp */,
+ (short) udpHeader.dstPort /* srcPort */,
+ (short) udpHeader.srcPort /* dstPort */);
+ } catch (Exception e) {
+ fail("Failed to build prefix64 discovery reply for " + ipv6Header.srcIp + ": " + e);
+ return;
+ }
+
+ Log.d(TAG, "Sending prefix64 discovery reply");
+ try {
+ sendDownloadPacket(replyPacket);
+ } catch (Exception e) {
+ fail("Failed to reply prefix64 discovery for " + ipv6Header.srcIp + ": " + e);
+ }
+ }
+
private byte[] getUploadPacket(Predicate<byte[]> filter) {
assertNotNull("Can't deal with upstream interface in local only mode", mUpstreamReader);
- return mUpstreamReader.poll(PACKET_READ_TIMEOUT_MS, filter);
+ byte[] packet;
+ while ((packet = mUpstreamReader.poll(PACKET_READ_TIMEOUT_MS)) != null) {
+ if (filter.test(packet)) return packet;
+
+ maybeReplyUdpDnsPrefix64Discovery(packet);
+ }
+ return null;
}
private @NonNull byte[] verifyPacketNotNull(String message, @Nullable byte[] packet) {
@@ -680,4 +997,12 @@
return verifyPacketNotNull("Download fail", getDownloadPacket(filter));
}
+
+ // Send DHCPDISCOVER to DHCP server to see if DHCP server is still alive to handle
+ // the upcoming DHCP packets. This method should be only used when we know the DHCP
+ // server has been created successfully before.
+ public boolean testDhcpServerAlive(final MacAddress mac) throws Exception {
+ sendDhcpDiscover(mac.toByteArray());
+ return getNextDhcpPacket() != null;
+ }
}
diff --git a/Tethering/tests/integration/src/android/net/EthernetTetheringTest.java b/Tethering/tests/integration/src/android/net/EthernetTetheringTest.java
index fb4b9fa..eed308c 100644
--- a/Tethering/tests/integration/src/android/net/EthernetTetheringTest.java
+++ b/Tethering/tests/integration/src/android/net/EthernetTetheringTest.java
@@ -20,23 +20,17 @@
import static android.net.TetheringManager.CONNECTIVITY_SCOPE_LOCAL;
import static android.net.TetheringManager.TETHERING_ETHERNET;
import static android.net.TetheringTester.TestDnsPacket;
+import static android.net.TetheringTester.buildIcmpEchoPacketV4;
+import static android.net.TetheringTester.buildUdpPacket;
import static android.net.TetheringTester.isExpectedIcmpPacket;
import static android.net.TetheringTester.isExpectedUdpDnsPacket;
import static android.system.OsConstants.ICMP_ECHO;
import static android.system.OsConstants.ICMP_ECHOREPLY;
-import static android.system.OsConstants.IPPROTO_ICMP;
import static com.android.net.module.util.ConnectivityUtils.isIPv6ULA;
import static com.android.net.module.util.HexDump.dumpHexString;
-import static com.android.net.module.util.IpUtils.icmpChecksum;
-import static com.android.net.module.util.IpUtils.ipChecksum;
-import static com.android.net.module.util.NetworkStackConstants.ETHER_TYPE_IPV4;
import static com.android.net.module.util.NetworkStackConstants.ICMPV6_ECHO_REPLY_TYPE;
import static com.android.net.module.util.NetworkStackConstants.ICMPV6_ECHO_REQUEST_TYPE;
-import static com.android.net.module.util.NetworkStackConstants.ICMP_CHECKSUM_OFFSET;
-import static com.android.net.module.util.NetworkStackConstants.IPV4_CHECKSUM_OFFSET;
-import static com.android.net.module.util.NetworkStackConstants.IPV4_HEADER_MIN_LEN;
-import static com.android.net.module.util.NetworkStackConstants.IPV4_LENGTH_OFFSET;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
@@ -53,19 +47,16 @@
import android.util.Log;
import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
import androidx.test.filters.MediumTest;
import androidx.test.runner.AndroidJUnit4;
import com.android.net.module.util.Ipv6Utils;
import com.android.net.module.util.Struct;
-import com.android.net.module.util.structs.EthernetHeader;
-import com.android.net.module.util.structs.Icmpv4Header;
import com.android.net.module.util.structs.Ipv4Header;
-import com.android.net.module.util.structs.Ipv6Header;
import com.android.net.module.util.structs.UdpHeader;
import com.android.testutils.DevSdkIgnoreRule;
import com.android.testutils.DevSdkIgnoreRule.IgnoreUpTo;
+import com.android.testutils.NetworkStackModuleTest;
import com.android.testutils.TapPacketReader;
import org.junit.Rule;
@@ -96,7 +87,6 @@
private static final String TAG = EthernetTetheringTest.class.getSimpleName();
private static final short DNS_PORT = 53;
- private static final short ICMPECHO_CODE = 0x0;
private static final short ICMPECHO_ID = 0x0;
private static final short ICMPECHO_SEQ = 0x0;
@@ -365,7 +355,7 @@
// Enable Ethernet tethering and check that it starts.
tetheringEventCallback = enableEthernetTethering(iface, null /* any upstream */);
} finally {
- maybeUnregisterTetheringEventCallback(tetheringEventCallback);
+ stopEthernetTethering(tetheringEventCallback);
}
// There is nothing more we can do on a physical interface without connecting an actual
// client, which is not possible in this test.
@@ -522,18 +512,6 @@
runUdp4Test();
}
- @NonNull
- private Inet6Address getClatIpv6Address(TetheringTester tester, TetheredDevice tethered)
- throws Exception {
- // Send an IPv4 UDP packet from client and check that a CLAT translated IPv6 UDP packet can
- // be found on upstream interface. Get CLAT IPv6 address from the CLAT translated IPv6 UDP
- // packet.
- byte[] expectedPacket = probeV4TetheringConnectivity(tester, tethered, true /* is4To6 */);
-
- // Above has guaranteed that the found packet is an IPv6 packet without ether header.
- return Struct.parse(Ipv6Header.class, ByteBuffer.wrap(expectedPacket)).srcIp;
- }
-
// Test network topology:
//
// public network (rawip) private network
@@ -576,85 +554,6 @@
runClatUdpTest();
}
- // PacketBuilder doesn't support IPv4 ICMP packet. It may need to refactor PacketBuilder first
- // because ICMP is a specific layer 3 protocol for PacketBuilder which expects packets always
- // have layer 3 (IP) and layer 4 (TCP, UDP) for now. Since we don't use IPv4 ICMP packet too
- // much in this test, we just write a ICMP packet builder here.
- // TODO: move ICMPv4 packet build function to common utilis.
- @NonNull
- private ByteBuffer buildIcmpEchoPacketV4(
- @Nullable final MacAddress srcMac, @Nullable final MacAddress dstMac,
- @NonNull final Inet4Address srcIp, @NonNull final Inet4Address dstIp,
- int type, short id, short seq) throws Exception {
- if (type != ICMP_ECHO && type != ICMP_ECHOREPLY) {
- fail("Unsupported ICMP type: " + type);
- }
-
- // Build ICMP echo id and seq fields as payload. Ignore the data field.
- final ByteBuffer payload = ByteBuffer.allocate(4);
- payload.putShort(id);
- payload.putShort(seq);
- payload.rewind();
-
- final boolean hasEther = (srcMac != null && dstMac != null);
- final int etherHeaderLen = hasEther ? Struct.getSize(EthernetHeader.class) : 0;
- final int ipv4HeaderLen = Struct.getSize(Ipv4Header.class);
- final int Icmpv4HeaderLen = Struct.getSize(Icmpv4Header.class);
- final int payloadLen = payload.limit();
- final ByteBuffer packet = ByteBuffer.allocate(etherHeaderLen + ipv4HeaderLen
- + Icmpv4HeaderLen + payloadLen);
-
- // [1] Ethernet header
- if (hasEther) {
- final EthernetHeader ethHeader = new EthernetHeader(dstMac, srcMac, ETHER_TYPE_IPV4);
- ethHeader.writeToByteBuffer(packet);
- }
-
- // [2] IP header
- final Ipv4Header ipv4Header = new Ipv4Header(TYPE_OF_SERVICE,
- (short) 0 /* totalLength, calculate later */, ID,
- FLAGS_AND_FRAGMENT_OFFSET, TIME_TO_LIVE, (byte) IPPROTO_ICMP,
- (short) 0 /* checksum, calculate later */, srcIp, dstIp);
- ipv4Header.writeToByteBuffer(packet);
-
- // [3] ICMP header
- final Icmpv4Header icmpv4Header = new Icmpv4Header((byte) type, ICMPECHO_CODE,
- (short) 0 /* checksum, calculate later */);
- icmpv4Header.writeToByteBuffer(packet);
-
- // [4] Payload
- packet.put(payload);
- packet.flip();
-
- // [5] Finalize packet
- // Used for updating IP header fields. If there is Ehternet header, IPv4 header offset
- // in buffer equals ethernet header length because IPv4 header is located next to ethernet
- // header. Otherwise, IPv4 header offset is 0.
- final int ipv4HeaderOffset = hasEther ? etherHeaderLen : 0;
-
- // Populate the IPv4 totalLength field.
- packet.putShort(ipv4HeaderOffset + IPV4_LENGTH_OFFSET,
- (short) (ipv4HeaderLen + Icmpv4HeaderLen + payloadLen));
-
- // Populate the IPv4 header checksum field.
- packet.putShort(ipv4HeaderOffset + IPV4_CHECKSUM_OFFSET,
- ipChecksum(packet, ipv4HeaderOffset /* headerOffset */));
-
- // Populate the ICMP checksum field.
- packet.putShort(ipv4HeaderOffset + IPV4_HEADER_MIN_LEN + ICMP_CHECKSUM_OFFSET,
- icmpChecksum(packet, ipv4HeaderOffset + IPV4_HEADER_MIN_LEN,
- Icmpv4HeaderLen + payloadLen));
- return packet;
- }
-
- @NonNull
- private ByteBuffer buildIcmpEchoPacketV4(@NonNull final Inet4Address srcIp,
- @NonNull final Inet4Address dstIp, int type, short id, short seq)
- throws Exception {
- return buildIcmpEchoPacketV4(null /* srcMac */, null /* dstMac */, srcIp, dstIp,
- type, id, seq);
- }
-
@Test
public void testIcmpv4Echo() throws Exception {
final TetheringTester tester = initTetheringTester(toList(TEST_IP4_ADDR),
@@ -852,4 +751,43 @@
REMOTE_NAT64_ADDR /* downloadSrcIp */, clatIp6 /* downloadDstIp */,
tester, true /* isClat */);
}
+
+ private static final byte[] ZeroLengthDhcpPacket = new byte[] {
+ // scapy.Ether(
+ // dst="ff:ff:ff:ff:ff:ff")
+ // scapy.IP(
+ // dst="255.255.255.255")
+ // scapy.UDP(sport=68, dport=67)
+ /* Ethernet Header */
+ (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff,
+ (byte) 0xe0, (byte) 0x4f, (byte) 0x43, (byte) 0xe6, (byte) 0xfb, (byte) 0xd2,
+ (byte) 0x08, (byte) 0x00,
+ /* Ip header */
+ (byte) 0x45, (byte) 0x00, (byte) 0x00, (byte) 0x1c, (byte) 0x00, (byte) 0x01,
+ (byte) 0x00, (byte) 0x00, (byte) 0x40, (byte) 0x11, (byte) 0xb6, (byte) 0x58,
+ (byte) 0x64, (byte) 0x4f, (byte) 0x60, (byte) 0x29, (byte) 0xff, (byte) 0xff,
+ (byte) 0xff, (byte) 0xff,
+ /* UDP header */
+ (byte) 0x00, (byte) 0x44, (byte) 0x00, (byte) 0x43,
+ (byte) 0x00, (byte) 0x08, (byte) 0x3a, (byte) 0xdf
+ };
+
+ // This test requires the update in NetworkStackModule(See b/269692093).
+ @NetworkStackModuleTest
+ @Test
+ public void testTetherZeroLengthDhcpPacket() throws Exception {
+ final TetheringTester tester = initTetheringTester(toList(TEST_IP4_ADDR),
+ toList(TEST_IP4_DNS));
+ tester.createTetheredDevice(TEST_MAC, false /* hasIpv6 */);
+
+ // Send a zero-length DHCP packet to upstream DHCP server.
+ final ByteBuffer packet = ByteBuffer.wrap(ZeroLengthDhcpPacket);
+ tester.sendUploadPacket(packet);
+
+ // Send DHCPDISCOVER packet from another downstream tethered device to verify that
+ // upstream DHCP server doesn't close the listening socket and stop reading, then we
+ // can still receive the next DHCP packet from server.
+ final MacAddress macAddress = MacAddress.fromString("11:22:33:44:55:66");
+ assertTrue(tester.testDhcpServerAlive(macAddress));
+ }
}
diff --git a/Tethering/tests/mts/src/android/tethering/mts/MtsEthernetTetheringTest.java b/Tethering/tests/mts/src/android/tethering/mts/MtsEthernetTetheringTest.java
index cb57d13..c2bc812 100644
--- a/Tethering/tests/mts/src/android/tethering/mts/MtsEthernetTetheringTest.java
+++ b/Tethering/tests/mts/src/android/tethering/mts/MtsEthernetTetheringTest.java
@@ -80,8 +80,8 @@
// Per RX UDP packet size: iphdr (20) + udphdr (8) + payload (2) = 30 bytes.
private static final int RX_UDP_PACKET_SIZE = 30;
private static final int RX_UDP_PACKET_COUNT = 456;
- // Per TX UDP packet size: ethhdr (14) + iphdr (20) + udphdr (8) + payload (2) = 44 bytes.
- private static final int TX_UDP_PACKET_SIZE = 44;
+ // Per TX UDP packet size: iphdr (20) + udphdr (8) + payload (2) = 30 bytes.
+ private static final int TX_UDP_PACKET_SIZE = 30;
private static final int TX_UDP_PACKET_COUNT = 123;
private static final String DUMPSYS_TETHERING_RAWMAP_ARG = "bpfRawMap";
diff --git a/Tethering/tests/privileged/src/com/android/networkstack/tethering/ConntrackSocketTest.java b/Tethering/tests/privileged/src/com/android/networkstack/tethering/ConntrackSocketTest.java
index 706df4e..81d4fbe 100644
--- a/Tethering/tests/privileged/src/com/android/networkstack/tethering/ConntrackSocketTest.java
+++ b/Tethering/tests/privileged/src/com/android/networkstack/tethering/ConntrackSocketTest.java
@@ -80,7 +80,7 @@
// Looper must be prepared here since AndroidJUnitRunner runs tests on separate threads.
if (Looper.myLooper() == null) Looper.prepare();
- mDeps = new OffloadHardwareInterface.Dependencies(mLog);
+ mDeps = new OffloadHardwareInterface.Dependencies(mHandler, mLog);
mOffloadHw = new OffloadHardwareInterface(mHandler, mLog, mDeps);
}
@@ -106,6 +106,7 @@
ConntrackMessage.Tuple tuple = ctmsg.tupleOrig;
if (nlmsghdr.nlmsg_type == (NFNL_SUBSYS_CTNETLINK << 8 | IPCTNL_MSG_CT_NEW)
+ && tuple != null
&& tuple.protoNum == IPPROTO_TCP
&& tuple.srcIp.equals(local.getAddress())
&& tuple.dstIp.equals(remote.getAddress())
diff --git a/Tethering/tests/unit/src/android/net/ip/IpServerTest.java b/Tethering/tests/unit/src/android/net/ip/IpServerTest.java
index f0d9057..46e50ef 100644
--- a/Tethering/tests/unit/src/android/net/ip/IpServerTest.java
+++ b/Tethering/tests/unit/src/android/net/ip/IpServerTest.java
@@ -19,6 +19,8 @@
import static android.net.INetd.IF_STATE_DOWN;
import static android.net.INetd.IF_STATE_UP;
import static android.net.RouteInfo.RTN_UNICAST;
+import static android.net.TetheringManager.CONNECTIVITY_SCOPE_GLOBAL;
+import static android.net.TetheringManager.CONNECTIVITY_SCOPE_LOCAL;
import static android.net.TetheringManager.TETHERING_BLUETOOTH;
import static android.net.TetheringManager.TETHERING_NCM;
import static android.net.TetheringManager.TETHERING_USB;
@@ -48,6 +50,7 @@
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
+import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.argThat;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyBoolean;
@@ -271,8 +274,8 @@
dispatchTetherConnectionChanged(upstreamIface, lp, 0);
}
reset(mNetd, mCallback, mAddressCoordinator, mBpfCoordinator);
- when(mAddressCoordinator.requestDownstreamAddress(any(), anyBoolean())).thenReturn(
- mTestAddress);
+ when(mAddressCoordinator.requestDownstreamAddress(any(), anyInt(),
+ anyBoolean())).thenReturn(mTestAddress);
}
@SuppressWarnings("DoNotCall") // Ignore warning for synchronous to call to Thread.run()
@@ -293,8 +296,8 @@
@Before public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
when(mSharedLog.forSubComponent(anyString())).thenReturn(mSharedLog);
- when(mAddressCoordinator.requestDownstreamAddress(any(), anyBoolean())).thenReturn(
- mTestAddress);
+ when(mAddressCoordinator.requestDownstreamAddress(any(), anyInt(),
+ anyBoolean())).thenReturn(mTestAddress);
when(mTetherConfig.isBpfOffloadEnabled()).thenReturn(DEFAULT_USING_BPF_OFFLOAD);
when(mTetherConfig.useLegacyDhcpServer()).thenReturn(false /* default value */);
@@ -428,7 +431,8 @@
dispatchCommand(IpServer.CMD_TETHER_REQUESTED, STATE_TETHERED);
InOrder inOrder = inOrder(mCallback, mNetd, mAddressCoordinator);
if (isAtLeastT()) {
- inOrder.verify(mAddressCoordinator).requestDownstreamAddress(any(), eq(true));
+ inOrder.verify(mAddressCoordinator).requestDownstreamAddress(any(),
+ eq(CONNECTIVITY_SCOPE_GLOBAL), eq(true));
inOrder.verify(mNetd).interfaceSetCfg(argThat(cfg ->
IFACE_NAME.equals(cfg.ifName) && assertContainsFlag(cfg.flags, IF_STATE_UP)));
}
@@ -477,7 +481,8 @@
dispatchCommand(IpServer.CMD_TETHER_REQUESTED, STATE_TETHERED);
InOrder inOrder = inOrder(mCallback, mNetd, mAddressCoordinator);
- inOrder.verify(mAddressCoordinator).requestDownstreamAddress(any(), eq(true));
+ inOrder.verify(mAddressCoordinator).requestDownstreamAddress(any(),
+ eq(CONNECTIVITY_SCOPE_GLOBAL), eq(true));
inOrder.verify(mNetd).interfaceSetCfg(argThat(cfg ->
IFACE_NAME.equals(cfg.ifName) && assertContainsFlag(cfg.flags, IF_STATE_UP)));
inOrder.verify(mNetd).tetherInterfaceAdd(IFACE_NAME);
@@ -498,7 +503,8 @@
dispatchCommand(IpServer.CMD_TETHER_REQUESTED, STATE_LOCAL_ONLY);
InOrder inOrder = inOrder(mCallback, mNetd, mAddressCoordinator);
- inOrder.verify(mAddressCoordinator).requestDownstreamAddress(any(), eq(true));
+ inOrder.verify(mAddressCoordinator).requestDownstreamAddress(any(),
+ eq(CONNECTIVITY_SCOPE_LOCAL), eq(true));
inOrder.verify(mNetd).interfaceSetCfg(argThat(cfg ->
IFACE_NAME.equals(cfg.ifName) && assertNotContainsFlag(cfg.flags, IF_STATE_UP)));
inOrder.verify(mNetd).tetherInterfaceAdd(IFACE_NAME);
@@ -766,7 +772,8 @@
final ArgumentCaptor<LinkProperties> lpCaptor =
ArgumentCaptor.forClass(LinkProperties.class);
InOrder inOrder = inOrder(mNetd, mCallback, mAddressCoordinator);
- inOrder.verify(mAddressCoordinator).requestDownstreamAddress(any(), eq(true));
+ inOrder.verify(mAddressCoordinator).requestDownstreamAddress(any(),
+ eq(CONNECTIVITY_SCOPE_LOCAL), eq(true));
inOrder.verify(mNetd).networkAddInterface(INetd.LOCAL_NET_ID, IFACE_NAME);
// One for ipv4 route, one for ipv6 link local route.
inOrder.verify(mNetd, times(2)).networkAddRoute(eq(INetd.LOCAL_NET_ID), eq(IFACE_NAME),
@@ -779,12 +786,13 @@
// Simulate the DHCP server receives DHCPDECLINE on MirrorLink and then signals
// onNewPrefixRequest callback.
final LinkAddress newAddress = new LinkAddress("192.168.100.125/24");
- when(mAddressCoordinator.requestDownstreamAddress(any(), anyBoolean())).thenReturn(
- newAddress);
+ when(mAddressCoordinator.requestDownstreamAddress(any(), anyInt(),
+ anyBoolean())).thenReturn(newAddress);
eventCallbacks.onNewPrefixRequest(new IpPrefix("192.168.42.0/24"));
mLooper.dispatchAll();
- inOrder.verify(mAddressCoordinator).requestDownstreamAddress(any(), eq(false));
+ inOrder.verify(mAddressCoordinator).requestDownstreamAddress(any(),
+ eq(CONNECTIVITY_SCOPE_LOCAL), eq(false));
inOrder.verify(mNetd).tetherApplyDnsInterfaces();
inOrder.verify(mCallback).updateLinkProperties(eq(mIpServer), lpCaptor.capture());
verifyNoMoreInteractions(mCallback);
diff --git a/Tethering/tests/unit/src/com/android/networkstack/tethering/ConnectedClientsTrackerTest.kt b/Tethering/tests/unit/src/com/android/networkstack/tethering/ConnectedClientsTrackerTest.kt
index d915354..2dd9f91 100644
--- a/Tethering/tests/unit/src/com/android/networkstack/tethering/ConnectedClientsTrackerTest.kt
+++ b/Tethering/tests/unit/src/com/android/networkstack/tethering/ConnectedClientsTrackerTest.kt
@@ -24,19 +24,25 @@
import android.net.TetheringManager.TETHERING_WIFI
import android.net.ip.IpServer
import android.net.wifi.WifiClient
+import android.os.Build
import androidx.test.filters.SmallTest
import androidx.test.runner.AndroidJUnit4
+import com.android.testutils.DevSdkIgnoreRule
+import com.android.testutils.DevSdkIgnoreRule.IgnoreUpTo
+import kotlin.test.assertEquals
+import kotlin.test.assertFalse
+import kotlin.test.assertTrue
+import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.Mockito.doReturn
import org.mockito.Mockito.mock
-import kotlin.test.assertEquals
-import kotlin.test.assertFalse
-import kotlin.test.assertTrue
@RunWith(AndroidJUnit4::class)
@SmallTest
class ConnectedClientsTrackerTest {
+ @get:Rule
+ val ignoreRule = DevSdkIgnoreRule()
private val server1 = mock(IpServer::class.java)
private val server2 = mock(IpServer::class.java)
@@ -70,55 +76,122 @@
@Test
fun testUpdateConnectedClients() {
+ doReturn(IpServer.STATE_TETHERED).`when`(server1).servingMode()
+ doReturn(IpServer.STATE_TETHERED).`when`(server2).servingMode()
+ runUpdateConnectedClientsTest(isGlobal = true)
+ }
+
+ @Test @IgnoreUpTo(Build.VERSION_CODES.S_V2)
+ fun testUpdateConnectedClients_LocalOnly() {
+ doReturn(IpServer.STATE_LOCAL_ONLY).`when`(server1).servingMode()
+ doReturn(IpServer.STATE_LOCAL_ONLY).`when`(server2).servingMode()
+ runUpdateConnectedClientsTest(isGlobal = false)
+ }
+
+ fun runUpdateConnectedClientsTest(isGlobal: Boolean) {
doReturn(emptyList<TetheredClient>()).`when`(server1).allLeases
doReturn(emptyList<TetheredClient>()).`when`(server2).allLeases
val tracker = ConnectedClientsTracker(clock)
- assertFalse(tracker.updateConnectedClients(servers, null))
+ assertFalse(tracker.updateConnectedClients(servers, null, null))
// Obtain a lease for client 1
doReturn(listOf(client1)).`when`(server1).allLeases
- assertSameClients(listOf(client1), assertNewClients(tracker, servers, listOf(wifiClient1)))
+ if (isGlobal) {
+ assertSameClients(listOf(client1), assertNewClients(tracker, servers,
+ wifiClients = listOf(wifiClient1)))
+ } else {
+ assertSameClients(listOf(client1), assertNewClients(tracker, servers,
+ localOnlyClients = listOf(wifiClient1)))
+ }
// Client 2 L2-connected, no lease yet
val client2WithoutAddr = TetheredClient(client2Addr, emptyList(), TETHERING_WIFI)
- assertSameClients(listOf(client1, client2WithoutAddr),
- assertNewClients(tracker, servers, listOf(wifiClient1, wifiClient2)))
+ if (isGlobal) {
+ assertSameClients(listOf(client1, client2WithoutAddr), assertNewClients(
+ tracker, servers, wifiClients = listOf(wifiClient1, wifiClient2)))
+ } else {
+ assertSameClients(listOf(client1, client2WithoutAddr), assertNewClients(
+ tracker, servers, localOnlyClients = listOf(wifiClient1, wifiClient2)))
+ }
// Client 2 lease obtained
doReturn(listOf(client1, client2)).`when`(server1).allLeases
- assertSameClients(listOf(client1, client2), assertNewClients(tracker, servers, null))
+ assertSameClients(listOf(client1, client2), assertNewClients(tracker, servers))
// Client 3 lease obtained
doReturn(listOf(client3)).`when`(server2).allLeases
- assertSameClients(listOf(client1, client2, client3),
- assertNewClients(tracker, servers, null))
+ assertSameClients(listOf(client1, client2, client3), assertNewClients(tracker, servers))
- // Client 2 L2-disconnected
- assertSameClients(listOf(client1, client3),
- assertNewClients(tracker, servers, listOf(wifiClient1)))
-
- // Client 1 L2-disconnected
- assertSameClients(listOf(client3), assertNewClients(tracker, servers, emptyList()))
-
- // Client 1 comes back
- assertSameClients(listOf(client1, client3),
- assertNewClients(tracker, servers, listOf(wifiClient1)))
+ if (isGlobal) {
+ // Client 2 L2-disconnected
+ assertSameClients(listOf(client1, client3),
+ assertNewClients(tracker, servers, wifiClients = listOf(wifiClient1)))
+ // Client 1 L2-disconnected
+ assertSameClients(listOf(client3), assertNewClients(tracker, servers,
+ wifiClients = emptyList()))
+ // Client 1 comes back
+ assertSameClients(listOf(client1, client3),
+ assertNewClients(tracker, servers, wifiClients = listOf(wifiClient1)))
+ } else {
+ // Client 2 L2-disconnected
+ assertSameClients(listOf(client1, client3),
+ assertNewClients(tracker, servers, localOnlyClients = listOf(wifiClient1)))
+ // Client 1 L2-disconnected
+ assertSameClients(listOf(client3),
+ assertNewClients(tracker, servers, localOnlyClients = emptyList()))
+ // Client 1 comes back
+ assertSameClients(listOf(client1, client3),
+ assertNewClients(tracker, servers, localOnlyClients = listOf(wifiClient1)))
+ }
// Leases lost, client 1 still L2-connected
doReturn(emptyList<TetheredClient>()).`when`(server1).allLeases
doReturn(emptyList<TetheredClient>()).`when`(server2).allLeases
assertSameClients(listOf(TetheredClient(client1Addr, emptyList(), TETHERING_WIFI)),
- assertNewClients(tracker, servers, null))
+ assertNewClients(tracker, servers))
+ }
+
+ @Test @IgnoreUpTo(Build.VERSION_CODES.S_V2)
+ fun testLocalOnlyAndTetheredHotspotClients() {
+ val tracker = ConnectedClientsTracker(clock)
+ doReturn(IpServer.STATE_LOCAL_ONLY).`when`(server1).servingMode()
+ doReturn(IpServer.STATE_TETHERED).`when`(server2).servingMode()
+
+ // Client 1 connected to server1 (LOHS)
+ doReturn(listOf(client1)).`when`(server1).allLeases
+ doReturn(emptyList<TetheredClient>()).`when`(server2).allLeases
+ assertSameClients(listOf(client1), assertNewClients(tracker, servers,
+ localOnlyClients = listOf(wifiClient1)))
+
+ // Client 2 connected to server2 (wifi Tethering)
+ doReturn(listOf(client2)).`when`(server2).allLeases
+ assertSameClients(listOf(client1, client2), assertNewClients(tracker, servers,
+ listOf(wifiClient2), listOf(wifiClient1)))
+
+ // Client 2 L2-disconnected but lease doesn't expired yet
+ assertSameClients(listOf(client1), assertNewClients(tracker, servers,
+ wifiClients = emptyList()))
+
+ // Client 1 lease lost but still L2-connected
+ doReturn(emptyList<TetheredClient>()).`when`(server1).allLeases
+ val client1WithoutAddr = TetheredClient(client1Addr, emptyList(), TETHERING_WIFI)
+ assertSameClients(listOf(client1WithoutAddr), assertNewClients(tracker, servers))
+
+ // Client 1 L2-disconnected
+ assertSameClients(emptyList(), assertNewClients(tracker, servers,
+ localOnlyClients = emptyList()))
}
@Test
fun testUpdateConnectedClients_LeaseExpiration() {
+ doReturn(IpServer.STATE_TETHERED).`when`(server1).servingMode()
+ doReturn(IpServer.STATE_TETHERED).`when`(server2).servingMode()
val tracker = ConnectedClientsTracker(clock)
doReturn(listOf(client1, client2)).`when`(server1).allLeases
doReturn(listOf(client3)).`when`(server2).allLeases
assertSameClients(listOf(client1, client2, client3), assertNewClients(
- tracker, servers, listOf(wifiClient1, wifiClient2)))
+ tracker, servers, wifiClients = listOf(wifiClient1, wifiClient2)))
clock.time += 20
// Client 3 has no remaining lease: removed
@@ -131,15 +204,16 @@
// Only the "t + 30" address is left, the "t + 10" address expired
listOf(client2Exp30AddrInfo),
TETHERING_WIFI))
- assertSameClients(expectedClients, assertNewClients(tracker, servers, null))
+ assertSameClients(expectedClients, assertNewClients(tracker, servers))
}
private fun assertNewClients(
tracker: ConnectedClientsTracker,
ipServers: Iterable<IpServer>,
- wifiClients: List<WifiClient>?
+ wifiClients: List<WifiClient>? = null,
+ localOnlyClients: List<WifiClient>? = null
): List<TetheredClient> {
- assertTrue(tracker.updateConnectedClients(ipServers, wifiClients))
+ assertTrue(tracker.updateConnectedClients(ipServers, wifiClients, localOnlyClients))
return tracker.lastTetheredClients
}
diff --git a/Tethering/tests/unit/src/com/android/networkstack/tethering/EntitlementManagerTest.java b/Tethering/tests/unit/src/com/android/networkstack/tethering/EntitlementManagerTest.java
index e4263db..c2e1617 100644
--- a/Tethering/tests/unit/src/com/android/networkstack/tethering/EntitlementManagerTest.java
+++ b/Tethering/tests/unit/src/com/android/networkstack/tethering/EntitlementManagerTest.java
@@ -213,7 +213,8 @@
}
@Override
- PendingIntent createRecheckAlarmIntent() {
+ PendingIntent createRecheckAlarmIntent(final String pkgName) {
+ assertEquals(TEST_PACKAGE_NAME, pkgName);
return mAlarmIntent;
}
}
diff --git a/Tethering/tests/unit/src/com/android/networkstack/tethering/FakeTetheringConfiguration.java b/Tethering/tests/unit/src/com/android/networkstack/tethering/FakeTetheringConfiguration.java
index 0d686ed..9e287a0 100644
--- a/Tethering/tests/unit/src/com/android/networkstack/tethering/FakeTetheringConfiguration.java
+++ b/Tethering/tests/unit/src/com/android/networkstack/tethering/FakeTetheringConfiguration.java
@@ -19,22 +19,26 @@
import android.content.Context;
import android.content.res.Resources;
+import androidx.annotation.NonNull;
+
import com.android.net.module.util.SharedLog;
/** FakeTetheringConfiguration is used to override static method for testing. */
public class FakeTetheringConfiguration extends TetheringConfiguration {
FakeTetheringConfiguration(Context ctx, SharedLog log, int id) {
- super(ctx, log, id);
- }
+ super(ctx, log, id, new Dependencies() {
+ @Override
+ boolean isFeatureEnabled(@NonNull Context context, @NonNull String namespace,
+ @NonNull String name, @NonNull String moduleName, boolean defaultEnabled) {
+ return defaultEnabled;
+ }
- @Override
- protected String getDeviceConfigProperty(final String name) {
- return null;
- }
-
- @Override
- protected boolean isFeatureEnabled(Context ctx, String namespace, String featureVersionFlag) {
- return false;
+ @Override
+ boolean getDeviceConfigBoolean(@NonNull String namespace, @NonNull String name,
+ boolean defaultValue) {
+ return defaultValue;
+ }
+ });
}
@Override
diff --git a/Tethering/tests/unit/src/com/android/networkstack/tethering/OffloadControllerTest.java b/Tethering/tests/unit/src/com/android/networkstack/tethering/OffloadControllerTest.java
index faca1c8..36c15a7 100644
--- a/Tethering/tests/unit/src/com/android/networkstack/tethering/OffloadControllerTest.java
+++ b/Tethering/tests/unit/src/com/android/networkstack/tethering/OffloadControllerTest.java
@@ -31,8 +31,8 @@
import static com.android.networkstack.tethering.OffloadController.StatsType.STATS_PER_IFACE;
import static com.android.networkstack.tethering.OffloadController.StatsType.STATS_PER_UID;
import static com.android.networkstack.tethering.OffloadHardwareInterface.ForwardedStats;
-import static com.android.networkstack.tethering.OffloadHardwareInterface.OFFLOAD_HAL_VERSION_1_0;
-import static com.android.networkstack.tethering.OffloadHardwareInterface.OFFLOAD_HAL_VERSION_1_1;
+import static com.android.networkstack.tethering.OffloadHardwareInterface.OFFLOAD_HAL_VERSION_HIDL_1_0;
+import static com.android.networkstack.tethering.OffloadHardwareInterface.OFFLOAD_HAL_VERSION_HIDL_1_1;
import static com.android.networkstack.tethering.TetheringConfiguration.DEFAULT_TETHER_OFFLOAD_POLL_INTERVAL_MS;
import static com.android.testutils.MiscAsserts.assertContainsAll;
import static com.android.testutils.MiscAsserts.assertThrows;
@@ -79,6 +79,7 @@
import com.android.internal.util.test.FakeSettingsProvider;
import com.android.net.module.util.SharedLog;
+import com.android.networkstack.tethering.OffloadHardwareInterface.OffloadHalCallback;
import com.android.testutils.DevSdkIgnoreRule;
import com.android.testutils.DevSdkIgnoreRule.IgnoreUpTo;
import com.android.testutils.TestableNetworkStatsProviderCbBinder;
@@ -125,8 +126,8 @@
private OffloadController.OffloadTetheringStatsProvider mTetherStatsProvider;
private final ArgumentCaptor<ArrayList> mStringArrayCaptor =
ArgumentCaptor.forClass(ArrayList.class);
- private final ArgumentCaptor<OffloadHardwareInterface.ControlCallback> mControlCallbackCaptor =
- ArgumentCaptor.forClass(OffloadHardwareInterface.ControlCallback.class);
+ private final ArgumentCaptor<OffloadHalCallback> mOffloadHalCallbackCaptor =
+ ArgumentCaptor.forClass(OffloadHalCallback.class);
private MockContentResolver mContentResolver;
private final TestLooper mTestLooper = new TestLooper();
private OffloadController.Dependencies mDeps = new OffloadController.Dependencies() {
@@ -151,10 +152,9 @@
FakeSettingsProvider.clearSettingsProvider();
}
- private void setupFunctioningHardwareInterface(int controlVersion) {
- when(mHardware.initOffloadConfig()).thenReturn(true);
- when(mHardware.initOffloadControl(mControlCallbackCaptor.capture()))
- .thenReturn(controlVersion);
+ private void setupFunctioningHardwareInterface(int offloadHalVersion) {
+ when(mHardware.initOffload(mOffloadHalCallbackCaptor.capture()))
+ .thenReturn(offloadHalVersion);
when(mHardware.setUpstreamParameters(anyString(), any(), any(), any())).thenReturn(true);
when(mHardware.getForwardedStats(any())).thenReturn(new ForwardedStats());
when(mHardware.setDataLimit(anyString(), anyLong())).thenReturn(true);
@@ -192,9 +192,9 @@
@Test
public void testStartStop() throws Exception {
stopOffloadController(
- startOffloadController(OFFLOAD_HAL_VERSION_1_0, true /*expectStart*/));
+ startOffloadController(OFFLOAD_HAL_VERSION_HIDL_1_0, true /*expectStart*/));
stopOffloadController(
- startOffloadController(OFFLOAD_HAL_VERSION_1_1, true /*expectStart*/));
+ startOffloadController(OFFLOAD_HAL_VERSION_HIDL_1_1, true /*expectStart*/));
}
@NonNull
@@ -206,9 +206,8 @@
final InOrder inOrder = inOrder(mHardware);
inOrder.verify(mHardware, times(1)).getDefaultTetherOffloadDisabled();
- inOrder.verify(mHardware, times(expectStart ? 1 : 0)).initOffloadConfig();
- inOrder.verify(mHardware, times(expectStart ? 1 : 0)).initOffloadControl(
- any(OffloadHardwareInterface.ControlCallback.class));
+ inOrder.verify(mHardware, times(expectStart ? 1 : 0)).initOffload(
+ any(OffloadHalCallback.class));
inOrder.verifyNoMoreInteractions();
// Clear counters only instead of whole mock to preserve the mocking setup.
clearInvocations(mHardware);
@@ -218,7 +217,7 @@
private void stopOffloadController(final OffloadController offload) throws Exception {
final InOrder inOrder = inOrder(mHardware);
offload.stop();
- inOrder.verify(mHardware, times(1)).stopOffloadControl();
+ inOrder.verify(mHardware, times(1)).stopOffload();
inOrder.verifyNoMoreInteractions();
reset(mHardware);
}
@@ -228,7 +227,7 @@
when(mHardware.getDefaultTetherOffloadDisabled()).thenReturn(1);
assertThrows(SettingNotFoundException.class, () ->
Settings.Global.getInt(mContentResolver, TETHER_OFFLOAD_DISABLED));
- startOffloadController(OFFLOAD_HAL_VERSION_1_0, false /*expectStart*/);
+ startOffloadController(OFFLOAD_HAL_VERSION_HIDL_1_0, false /*expectStart*/);
}
@Test
@@ -236,26 +235,26 @@
when(mHardware.getDefaultTetherOffloadDisabled()).thenReturn(0);
assertThrows(SettingNotFoundException.class, () ->
Settings.Global.getInt(mContentResolver, TETHER_OFFLOAD_DISABLED));
- startOffloadController(OFFLOAD_HAL_VERSION_1_0, true /*expectStart*/);
+ startOffloadController(OFFLOAD_HAL_VERSION_HIDL_1_0, true /*expectStart*/);
}
@Test
public void testSettingsAllowsStart() throws Exception {
Settings.Global.putInt(mContentResolver, TETHER_OFFLOAD_DISABLED, 0);
- startOffloadController(OFFLOAD_HAL_VERSION_1_0, true /*expectStart*/);
+ startOffloadController(OFFLOAD_HAL_VERSION_HIDL_1_0, true /*expectStart*/);
}
@Test
public void testSettingsDisablesStart() throws Exception {
Settings.Global.putInt(mContentResolver, TETHER_OFFLOAD_DISABLED, 1);
- startOffloadController(OFFLOAD_HAL_VERSION_1_0, false /*expectStart*/);
+ startOffloadController(OFFLOAD_HAL_VERSION_HIDL_1_0, false /*expectStart*/);
}
@Test
public void testSetUpstreamLinkPropertiesWorking() throws Exception {
enableOffload();
final OffloadController offload =
- startOffloadController(OFFLOAD_HAL_VERSION_1_0, true /*expectStart*/);
+ startOffloadController(OFFLOAD_HAL_VERSION_HIDL_1_0, true /*expectStart*/);
// In reality, the UpstreamNetworkMonitor would have passed down to us
// a covering set of local prefixes representing a minimum essential
@@ -426,7 +425,7 @@
public void testGetForwardedStats() throws Exception {
enableOffload();
final OffloadController offload =
- startOffloadController(OFFLOAD_HAL_VERSION_1_0, true /*expectStart*/);
+ startOffloadController(OFFLOAD_HAL_VERSION_HIDL_1_0, true /*expectStart*/);
final String ethernetIface = "eth1";
final String mobileIface = "rmnet_data0";
@@ -521,11 +520,11 @@
// Verify the OffloadController is called by R framework, where the framework doesn't send
// warning.
// R only uses HAL 1.0.
- checkSetDataWarningAndLimit(false, OFFLOAD_HAL_VERSION_1_0);
+ checkSetDataWarningAndLimit(false, OFFLOAD_HAL_VERSION_HIDL_1_0);
// Verify the OffloadController is called by S+ framework, where the framework sends
// warning along with limit.
- checkSetDataWarningAndLimit(true, OFFLOAD_HAL_VERSION_1_0);
- checkSetDataWarningAndLimit(true, OFFLOAD_HAL_VERSION_1_1);
+ checkSetDataWarningAndLimit(true, OFFLOAD_HAL_VERSION_HIDL_1_0);
+ checkSetDataWarningAndLimit(true, OFFLOAD_HAL_VERSION_HIDL_1_1);
}
private void checkSetDataWarningAndLimit(boolean isProviderSetWarning, int controlVersion)
@@ -550,7 +549,7 @@
when(mHardware.setDataWarningAndLimit(anyString(), anyLong(), anyLong())).thenReturn(true);
offload.setUpstreamLinkProperties(lp);
// Applying an interface sends the initial quota to the hardware.
- if (controlVersion >= OFFLOAD_HAL_VERSION_1_1) {
+ if (controlVersion >= OFFLOAD_HAL_VERSION_HIDL_1_1) {
inOrder.verify(mHardware).setDataWarningAndLimit(ethernetIface, Long.MAX_VALUE,
Long.MAX_VALUE);
} else {
@@ -576,7 +575,7 @@
mTetherStatsProvider.onSetLimit(ethernetIface, ethernetLimit);
}
waitForIdle();
- if (controlVersion >= OFFLOAD_HAL_VERSION_1_1) {
+ if (controlVersion >= OFFLOAD_HAL_VERSION_HIDL_1_1) {
inOrder.verify(mHardware).setDataWarningAndLimit(ethernetIface, Long.MAX_VALUE,
ethernetLimit);
} else {
@@ -591,7 +590,7 @@
mTetherStatsProvider.onSetLimit(mobileIface, mobileLimit);
}
waitForIdle();
- if (controlVersion >= OFFLOAD_HAL_VERSION_1_1) {
+ if (controlVersion >= OFFLOAD_HAL_VERSION_HIDL_1_1) {
inOrder.verify(mHardware, never()).setDataWarningAndLimit(anyString(), anyLong(),
anyLong());
} else {
@@ -603,7 +602,7 @@
lp.setInterfaceName(mobileIface);
offload.setUpstreamLinkProperties(lp);
waitForIdle();
- if (controlVersion >= OFFLOAD_HAL_VERSION_1_1) {
+ if (controlVersion >= OFFLOAD_HAL_VERSION_HIDL_1_1) {
inOrder.verify(mHardware).setDataWarningAndLimit(mobileIface,
isProviderSetWarning ? mobileWarning : Long.MAX_VALUE,
mobileLimit);
@@ -620,7 +619,7 @@
mTetherStatsProvider.onSetLimit(mobileIface, NetworkStatsProvider.QUOTA_UNLIMITED);
}
waitForIdle();
- if (controlVersion >= OFFLOAD_HAL_VERSION_1_1) {
+ if (controlVersion >= OFFLOAD_HAL_VERSION_HIDL_1_1) {
inOrder.verify(mHardware).setDataWarningAndLimit(mobileIface, Long.MAX_VALUE,
Long.MAX_VALUE);
} else {
@@ -655,15 +654,15 @@
}
waitForIdle();
inOrder.verify(mHardware).getForwardedStats(ethernetIface);
- inOrder.verify(mHardware).stopOffloadControl();
+ inOrder.verify(mHardware).stopOffload();
}
@Test
public void testDataWarningAndLimitCallback_LimitReached() throws Exception {
enableOffload();
- startOffloadController(OFFLOAD_HAL_VERSION_1_0, true /*expectStart*/);
+ startOffloadController(OFFLOAD_HAL_VERSION_HIDL_1_0, true /*expectStart*/);
- final OffloadHardwareInterface.ControlCallback callback = mControlCallbackCaptor.getValue();
+ final OffloadHalCallback callback = mOffloadHalCallbackCaptor.getValue();
callback.onStoppedLimitReached();
mTetherStatsProviderCb.expectNotifyStatsUpdated();
@@ -679,8 +678,8 @@
@Test
@IgnoreUpTo(Build.VERSION_CODES.R) // HAL 1.1 is only supported from S
public void testDataWarningAndLimitCallback_WarningReached() throws Exception {
- startOffloadController(OFFLOAD_HAL_VERSION_1_1, true /*expectStart*/);
- final OffloadHardwareInterface.ControlCallback callback = mControlCallbackCaptor.getValue();
+ startOffloadController(OFFLOAD_HAL_VERSION_HIDL_1_1, true /*expectStart*/);
+ final OffloadHalCallback callback = mOffloadHalCallbackCaptor.getValue();
callback.onWarningReached();
mTetherStatsProviderCb.expectNotifyStatsUpdated();
@@ -695,7 +694,7 @@
public void testAddRemoveDownstreams() throws Exception {
enableOffload();
final OffloadController offload =
- startOffloadController(OFFLOAD_HAL_VERSION_1_0, true /*expectStart*/);
+ startOffloadController(OFFLOAD_HAL_VERSION_HIDL_1_0, true /*expectStart*/);
final InOrder inOrder = inOrder(mHardware);
// Tethering makes several calls to setLocalPrefixes() before add/remove
@@ -710,14 +709,14 @@
usbLinkProperties.addRoute(
new RouteInfo(new IpPrefix(USB_PREFIX), null, null, RTN_UNICAST));
offload.notifyDownstreamLinkProperties(usbLinkProperties);
- inOrder.verify(mHardware, times(1)).addDownstreamPrefix(RNDIS0, USB_PREFIX);
+ inOrder.verify(mHardware, times(1)).addDownstream(RNDIS0, USB_PREFIX);
inOrder.verifyNoMoreInteractions();
// [2] Routes for IPv6 link-local prefixes should never be added.
usbLinkProperties.addRoute(
new RouteInfo(new IpPrefix(IPV6_LINKLOCAL), null, null, RTN_UNICAST));
offload.notifyDownstreamLinkProperties(usbLinkProperties);
- inOrder.verify(mHardware, never()).addDownstreamPrefix(eq(RNDIS0), anyString());
+ inOrder.verify(mHardware, never()).addDownstream(eq(RNDIS0), anyString());
inOrder.verifyNoMoreInteractions();
// [3] Add an IPv6 prefix for good measure. Only new offload-able
@@ -726,14 +725,14 @@
usbLinkProperties.addRoute(
new RouteInfo(new IpPrefix(IPV6_DOC_PREFIX), null, null, RTN_UNICAST));
offload.notifyDownstreamLinkProperties(usbLinkProperties);
- inOrder.verify(mHardware, times(1)).addDownstreamPrefix(RNDIS0, IPV6_DOC_PREFIX);
+ inOrder.verify(mHardware, times(1)).addDownstream(RNDIS0, IPV6_DOC_PREFIX);
inOrder.verifyNoMoreInteractions();
// [4] Adding addresses doesn't affect notifyDownstreamLinkProperties().
// The address is passed in by a separate setLocalPrefixes() invocation.
usbLinkProperties.addLinkAddress(new LinkAddress("2001:db8::2/64"));
offload.notifyDownstreamLinkProperties(usbLinkProperties);
- inOrder.verify(mHardware, never()).addDownstreamPrefix(eq(RNDIS0), anyString());
+ inOrder.verify(mHardware, never()).addDownstream(eq(RNDIS0), anyString());
// [5] Differences in local routes are converted into addDownstream()
// and removeDownstream() invocations accordingly.
@@ -742,8 +741,8 @@
usbLinkProperties.addRoute(
new RouteInfo(new IpPrefix(IPV6_DISCARD_PREFIX), null, null, RTN_UNICAST));
offload.notifyDownstreamLinkProperties(usbLinkProperties);
- inOrder.verify(mHardware, times(1)).removeDownstreamPrefix(RNDIS0, IPV6_DOC_PREFIX);
- inOrder.verify(mHardware, times(1)).addDownstreamPrefix(RNDIS0, IPV6_DISCARD_PREFIX);
+ inOrder.verify(mHardware, times(1)).removeDownstream(RNDIS0, IPV6_DOC_PREFIX);
+ inOrder.verify(mHardware, times(1)).addDownstream(RNDIS0, IPV6_DISCARD_PREFIX);
inOrder.verifyNoMoreInteractions();
// [6] Removing a downstream interface which was never added causes no
@@ -753,8 +752,8 @@
// [7] Removing an active downstream removes all remaining prefixes.
offload.removeDownstreamInterface(RNDIS0);
- inOrder.verify(mHardware, times(1)).removeDownstreamPrefix(RNDIS0, USB_PREFIX);
- inOrder.verify(mHardware, times(1)).removeDownstreamPrefix(RNDIS0, IPV6_DISCARD_PREFIX);
+ inOrder.verify(mHardware, times(1)).removeDownstream(RNDIS0, USB_PREFIX);
+ inOrder.verify(mHardware, times(1)).removeDownstream(RNDIS0, IPV6_DISCARD_PREFIX);
inOrder.verifyNoMoreInteractions();
}
@@ -762,7 +761,7 @@
public void testControlCallbackOnStoppedUnsupportedFetchesAllStats() throws Exception {
enableOffload();
final OffloadController offload =
- startOffloadController(OFFLOAD_HAL_VERSION_1_0, true /*expectStart*/);
+ startOffloadController(OFFLOAD_HAL_VERSION_HIDL_1_0, true /*expectStart*/);
// Pretend to set a few different upstreams (only the interface name
// matters for this test; we're ignoring IP and route information).
@@ -776,7 +775,7 @@
// that happen with setUpstreamParameters().
clearInvocations(mHardware);
- OffloadHardwareInterface.ControlCallback callback = mControlCallbackCaptor.getValue();
+ OffloadHalCallback callback = mOffloadHalCallbackCaptor.getValue();
callback.onStoppedUnsupported();
// Verify forwarded stats behaviour.
@@ -793,7 +792,7 @@
throws Exception {
enableOffload();
final OffloadController offload =
- startOffloadController(OFFLOAD_HAL_VERSION_1_0, true /*expectStart*/);
+ startOffloadController(OFFLOAD_HAL_VERSION_HIDL_1_0, true /*expectStart*/);
// Pretend to set a few different upstreams (only the interface name
// matters for this test; we're ignoring IP and route information).
@@ -840,7 +839,7 @@
// that happen with setUpstreamParameters().
clearInvocations(mHardware);
- OffloadHardwareInterface.ControlCallback callback = mControlCallbackCaptor.getValue();
+ OffloadHalCallback callback = mOffloadHalCallbackCaptor.getValue();
callback.onSupportAvailable();
// Verify forwarded stats behaviour.
@@ -859,8 +858,8 @@
// into OffloadController proper. After this, also check for:
// "192.168.43.1/32", "2001:2::1/128", "2001:2::2/128"
"127.0.0.0/8", "192.0.2.0/24", "fe80::/64", "2001:db8::/64");
- verify(mHardware, times(1)).addDownstreamPrefix(WLAN0, "192.168.43.0/24");
- verify(mHardware, times(1)).addDownstreamPrefix(WLAN0, "2001:2::/64");
+ verify(mHardware, times(1)).addDownstream(WLAN0, "192.168.43.0/24");
+ verify(mHardware, times(1)).addDownstream(WLAN0, "2001:2::/64");
verify(mHardware, times(1)).setUpstreamParameters(eq(RMNET0), any(), any(), any());
verify(mHardware, times(1)).setDataLimit(eq(RMNET0), anyLong());
verifyNoMoreInteractions(mHardware);
@@ -871,7 +870,7 @@
enableOffload();
setOffloadPollInterval(DEFAULT_TETHER_OFFLOAD_POLL_INTERVAL_MS);
final OffloadController offload =
- startOffloadController(OFFLOAD_HAL_VERSION_1_0, true /*expectStart*/);
+ startOffloadController(OFFLOAD_HAL_VERSION_HIDL_1_0, true /*expectStart*/);
// Initialize with fake eth upstream.
final String ethernetIface = "eth1";
@@ -925,7 +924,7 @@
offload.setUpstreamLinkProperties(makeEthernetLinkProperties());
mTetherStatsProvider.onSetAlert(0);
waitForIdle();
- if (controlVersion >= OFFLOAD_HAL_VERSION_1_1) {
+ if (controlVersion >= OFFLOAD_HAL_VERSION_HIDL_1_1) {
mTetherStatsProviderCb.assertNoCallback();
} else {
mTetherStatsProviderCb.expectNotifyAlertReached();
@@ -935,7 +934,7 @@
@Test
public void testSoftwarePollingUsed() throws Exception {
- checkSoftwarePollingUsed(OFFLOAD_HAL_VERSION_1_0);
- checkSoftwarePollingUsed(OFFLOAD_HAL_VERSION_1_1);
+ checkSoftwarePollingUsed(OFFLOAD_HAL_VERSION_HIDL_1_0);
+ checkSoftwarePollingUsed(OFFLOAD_HAL_VERSION_HIDL_1_1);
}
}
diff --git a/Tethering/tests/unit/src/com/android/networkstack/tethering/OffloadHalAidlImplTest.java b/Tethering/tests/unit/src/com/android/networkstack/tethering/OffloadHalAidlImplTest.java
new file mode 100644
index 0000000..c9ce64f
--- /dev/null
+++ b/Tethering/tests/unit/src/com/android/networkstack/tethering/OffloadHalAidlImplTest.java
@@ -0,0 +1,390 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.networkstack.tethering;
+
+import static com.android.networkstack.tethering.OffloadHardwareInterface.OFFLOAD_HAL_VERSION_AIDL;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.anyLong;
+import static org.mockito.Mockito.anyString;
+import static org.mockito.Mockito.doNothing;
+import static org.mockito.Mockito.doThrow;
+import static org.mockito.Mockito.inOrder;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.hardware.tetheroffload.ForwardedStats;
+import android.hardware.tetheroffload.IOffload;
+import android.hardware.tetheroffload.IPv4AddrPortPair;
+import android.hardware.tetheroffload.ITetheringOffloadCallback;
+import android.hardware.tetheroffload.NatTimeoutUpdate;
+import android.hardware.tetheroffload.NetworkProtocol;
+import android.hardware.tetheroffload.OffloadCallbackEvent;
+import android.os.Handler;
+import android.os.NativeHandle;
+import android.os.ParcelFileDescriptor;
+import android.os.ServiceSpecificException;
+import android.os.test.TestLooper;
+import android.system.OsConstants;
+
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
+import com.android.net.module.util.SharedLog;
+import com.android.networkstack.tethering.OffloadHardwareInterface.OffloadHalCallback;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
+import org.mockito.InOrder;
+import org.mockito.MockitoAnnotations;
+
+import java.io.FileDescriptor;
+import java.util.ArrayList;
+
+@RunWith(AndroidJUnit4.class)
+@SmallTest
+public final class OffloadHalAidlImplTest {
+ private static final String RMNET0 = "test_rmnet_data0";
+
+ private final SharedLog mLog = new SharedLog("test");
+ private final TestLooper mTestLooper = new TestLooper();
+
+ private IOffload mIOffloadMock;
+ private OffloadHalAidlImpl mIOffloadHal;
+ private ITetheringOffloadCallback mTetheringOffloadCallback;
+ private OffloadHalCallback mOffloadHalCallback;
+
+ private void initAndValidateOffloadHal(boolean initSuccess)
+ throws Exception {
+ final FileDescriptor fd1 = new FileDescriptor();
+ final FileDescriptor fd2 = new FileDescriptor();
+ final NativeHandle handle1 = new NativeHandle(fd1, true);
+ final NativeHandle handle2 = new NativeHandle(fd2, true);
+ final ArgumentCaptor<ParcelFileDescriptor> fdCaptor1 =
+ ArgumentCaptor.forClass(ParcelFileDescriptor.class);
+ final ArgumentCaptor<ParcelFileDescriptor> fdCaptor2 =
+ ArgumentCaptor.forClass(ParcelFileDescriptor.class);
+ final ArgumentCaptor<ITetheringOffloadCallback> offloadCallbackCaptor =
+ ArgumentCaptor.forClass(ITetheringOffloadCallback.class);
+ if (initSuccess) {
+ doNothing().when(mIOffloadMock).initOffload(any(), any(), any());
+ } else {
+ doThrow(new IllegalStateException()).when(mIOffloadMock).initOffload(any(), any(),
+ any());
+ }
+ assertEquals(mIOffloadHal.initOffload(handle1, handle2, mOffloadHalCallback),
+ initSuccess);
+ verify(mIOffloadMock).initOffload(fdCaptor1.capture(), fdCaptor2.capture(),
+ offloadCallbackCaptor.capture());
+ assertEquals(fdCaptor1.getValue().getFd(), fd1.getInt$());
+ assertEquals(fdCaptor2.getValue().getFd(), fd2.getInt$());
+ mTetheringOffloadCallback = offloadCallbackCaptor.getValue();
+ }
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ mIOffloadMock = mock(IOffload.class);
+ mIOffloadHal = new OffloadHalAidlImpl(OFFLOAD_HAL_VERSION_AIDL, mIOffloadMock,
+ new Handler(mTestLooper.getLooper()), mLog);
+ mOffloadHalCallback = spy(new OffloadHalCallback());
+ }
+
+ @Test
+ public void testInitOffloadSuccess() throws Exception {
+ initAndValidateOffloadHal(true /* initSuccess */);
+ }
+
+ @Test
+ public void testInitOffloadFailure() throws Exception {
+ initAndValidateOffloadHal(false /* initSuccess */);
+ }
+
+ @Test
+ public void testStopOffloadSuccess() throws Exception {
+ initAndValidateOffloadHal(true);
+ doNothing().when(mIOffloadMock).stopOffload();
+ assertTrue(mIOffloadHal.stopOffload());
+ verify(mIOffloadMock).stopOffload();
+ }
+
+ @Test
+ public void testStopOffloadFailure() throws Exception {
+ initAndValidateOffloadHal(true);
+ doThrow(new IllegalStateException()).when(mIOffloadMock).stopOffload();
+ assertFalse(mIOffloadHal.stopOffload());
+ }
+
+ private void doTestGetForwardedStats(boolean expectSuccess) throws Exception {
+ initAndValidateOffloadHal(true);
+ final ForwardedStats returnStats = new ForwardedStats();
+ if (expectSuccess) {
+ returnStats.rxBytes = 12345;
+ returnStats.txBytes = 67890;
+ when(mIOffloadMock.getForwardedStats(anyString())).thenReturn(returnStats);
+ } else {
+ when(mIOffloadMock.getForwardedStats(anyString()))
+ .thenThrow(new ServiceSpecificException(IOffload.ERROR_CODE_UNUSED));
+ }
+ final OffloadHardwareInterface.ForwardedStats stats =
+ mIOffloadHal.getForwardedStats(RMNET0);
+ verify(mIOffloadMock).getForwardedStats(eq(RMNET0));
+ assertNotNull(stats);
+ assertEquals(stats.rxBytes, returnStats.rxBytes);
+ assertEquals(stats.txBytes, returnStats.txBytes);
+ }
+
+ @Test
+ public void testGetForwardedStatsSuccess() throws Exception {
+ doTestGetForwardedStats(true);
+ }
+
+ @Test
+ public void testGetForwardedStatsFailure() throws Exception {
+ doTestGetForwardedStats(false);
+ }
+
+ private void doTestSetLocalPrefixes(boolean expectSuccess) throws Exception {
+ initAndValidateOffloadHal(true);
+ final ArrayList<String> localPrefixes = new ArrayList<>();
+ localPrefixes.add("127.0.0.0/8");
+ localPrefixes.add("fe80::/64");
+ final String[] localPrefixesArray =
+ localPrefixes.toArray(new String[localPrefixes.size()]);
+ if (expectSuccess) {
+ doNothing().when(mIOffloadMock).setLocalPrefixes(any());
+ } else {
+ doThrow(new IllegalArgumentException()).when(mIOffloadMock).setLocalPrefixes(any());
+ }
+ assertEquals(expectSuccess, mIOffloadHal.setLocalPrefixes(localPrefixes));
+ verify(mIOffloadMock).setLocalPrefixes(eq(localPrefixesArray));
+ }
+
+ @Test
+ public void testSetLocalPrefixesSuccess() throws Exception {
+ doTestSetLocalPrefixes(true);
+ }
+
+ @Test
+ public void testSetLocalPrefixesFailure() throws Exception {
+ doTestSetLocalPrefixes(false);
+ }
+
+ private void doTestSetDataLimit(boolean expectSuccess) throws Exception {
+ initAndValidateOffloadHal(true);
+ final long limit = 12345;
+ if (expectSuccess) {
+ doNothing().when(mIOffloadMock).setDataWarningAndLimit(anyString(), anyLong(),
+ anyLong());
+ } else {
+ doThrow(new IllegalArgumentException())
+ .when(mIOffloadMock).setDataWarningAndLimit(anyString(), anyLong(), anyLong());
+ }
+ assertEquals(expectSuccess, mIOffloadHal.setDataLimit(RMNET0, limit));
+ verify(mIOffloadMock).setDataWarningAndLimit(eq(RMNET0), eq(Long.MAX_VALUE), eq(limit));
+ }
+
+ @Test
+ public void testSetDataLimitSuccess() throws Exception {
+ doTestSetDataLimit(true);
+ }
+
+ @Test
+ public void testSetDataLimitFailure() throws Exception {
+ doTestSetDataLimit(false);
+ }
+
+ private void doTestSetDataWarningAndLimit(boolean expectSuccess) throws Exception {
+ initAndValidateOffloadHal(true);
+ final long warning = 12345;
+ final long limit = 67890;
+ if (expectSuccess) {
+ doNothing().when(mIOffloadMock).setDataWarningAndLimit(anyString(), anyLong(),
+ anyLong());
+ } else {
+ doThrow(new IllegalArgumentException())
+ .when(mIOffloadMock).setDataWarningAndLimit(anyString(), anyLong(), anyLong());
+ }
+ assertEquals(expectSuccess, mIOffloadHal.setDataWarningAndLimit(RMNET0, warning, limit));
+ verify(mIOffloadMock).setDataWarningAndLimit(eq(RMNET0), eq(warning), eq(limit));
+ }
+
+ @Test
+ public void testSetDataWarningAndLimitSuccess() throws Exception {
+ doTestSetDataWarningAndLimit(true);
+ }
+
+ @Test
+ public void testSetDataWarningAndLimitFailure() throws Exception {
+ doTestSetDataWarningAndLimit(false);
+ }
+
+ private void doTestSetUpstreamParameters(boolean expectSuccess) throws Exception {
+ initAndValidateOffloadHal(true);
+ final String v4addr = "192.168.10.1";
+ final String v4gateway = "192.168.10.255";
+ final ArrayList<String> v6gws = new ArrayList<>(0);
+ v6gws.add("2001:db8::1");
+ String[] v6gwsArray = v6gws.toArray(new String[v6gws.size()]);
+ if (expectSuccess) {
+ doNothing().when(mIOffloadMock).setUpstreamParameters(anyString(), anyString(),
+ anyString(), any());
+ } else {
+ doThrow(new IllegalArgumentException()).when(mIOffloadMock).setUpstreamParameters(
+ anyString(), anyString(), anyString(), any());
+ }
+ assertEquals(expectSuccess, mIOffloadHal.setUpstreamParameters(RMNET0, v4addr, v4gateway,
+ v6gws));
+ verify(mIOffloadMock).setUpstreamParameters(eq(RMNET0), eq(v4addr), eq(v4gateway),
+ eq(v6gwsArray));
+ }
+
+ @Test
+ public void testSetUpstreamParametersSuccess() throws Exception {
+ doTestSetUpstreamParameters(true);
+ }
+
+ @Test
+ public void testSetUpstreamParametersFailure() throws Exception {
+ doTestSetUpstreamParameters(false);
+ }
+
+ private void doTestAddDownstream(boolean expectSuccess) throws Exception {
+ initAndValidateOffloadHal(true);
+ final String ifName = "wlan1";
+ final String prefix = "192.168.43.0/24";
+ if (expectSuccess) {
+ doNothing().when(mIOffloadMock).addDownstream(anyString(), anyString());
+ } else {
+ doThrow(new IllegalStateException()).when(mIOffloadMock).addDownstream(anyString(),
+ anyString());
+ }
+ assertEquals(expectSuccess, mIOffloadHal.addDownstream(ifName, prefix));
+ verify(mIOffloadMock).addDownstream(eq(ifName), eq(prefix));
+ }
+
+ @Test
+ public void testAddDownstreamSuccess() throws Exception {
+ doTestAddDownstream(true);
+ }
+
+ @Test
+ public void testAddDownstreamFailure() throws Exception {
+ doTestAddDownstream(false);
+ }
+
+ private void doTestRemoveDownstream(boolean expectSuccess) throws Exception {
+ initAndValidateOffloadHal(true);
+ final String ifName = "wlan1";
+ final String prefix = "192.168.43.0/24";
+ if (expectSuccess) {
+ doNothing().when(mIOffloadMock).removeDownstream(anyString(), anyString());
+ } else {
+ doThrow(new IllegalArgumentException()).when(mIOffloadMock).removeDownstream(
+ anyString(), anyString());
+ }
+ assertEquals(expectSuccess, mIOffloadHal.removeDownstream(ifName, prefix));
+ verify(mIOffloadMock).removeDownstream(eq(ifName), eq(prefix));
+ }
+
+ @Test
+ public void testRemoveDownstreamSuccess() throws Exception {
+ doTestRemoveDownstream(true);
+ }
+
+ @Test
+ public void testRemoveDownstreamFailure() throws Exception {
+ doTestRemoveDownstream(false);
+ }
+
+ @Test
+ public void testTetheringOffloadCallback() throws Exception {
+ initAndValidateOffloadHal(true);
+
+ mTetheringOffloadCallback.onEvent(OffloadCallbackEvent.OFFLOAD_STARTED);
+ mTestLooper.dispatchAll();
+ final InOrder inOrder = inOrder(mOffloadHalCallback);
+ inOrder.verify(mOffloadHalCallback).onStarted();
+ inOrder.verifyNoMoreInteractions();
+
+ mTetheringOffloadCallback.onEvent(OffloadCallbackEvent.OFFLOAD_STOPPED_ERROR);
+ mTestLooper.dispatchAll();
+ inOrder.verify(mOffloadHalCallback).onStoppedError();
+ inOrder.verifyNoMoreInteractions();
+
+ mTetheringOffloadCallback.onEvent(OffloadCallbackEvent.OFFLOAD_STOPPED_UNSUPPORTED);
+ mTestLooper.dispatchAll();
+ inOrder.verify(mOffloadHalCallback).onStoppedUnsupported();
+ inOrder.verifyNoMoreInteractions();
+
+ mTetheringOffloadCallback.onEvent(OffloadCallbackEvent.OFFLOAD_SUPPORT_AVAILABLE);
+ mTestLooper.dispatchAll();
+ inOrder.verify(mOffloadHalCallback).onSupportAvailable();
+ inOrder.verifyNoMoreInteractions();
+
+ mTetheringOffloadCallback.onEvent(OffloadCallbackEvent.OFFLOAD_STOPPED_LIMIT_REACHED);
+ mTestLooper.dispatchAll();
+ inOrder.verify(mOffloadHalCallback).onStoppedLimitReached();
+ inOrder.verifyNoMoreInteractions();
+
+ mTetheringOffloadCallback.onEvent(OffloadCallbackEvent.OFFLOAD_WARNING_REACHED);
+ mTestLooper.dispatchAll();
+ inOrder.verify(mOffloadHalCallback).onWarningReached();
+ inOrder.verifyNoMoreInteractions();
+
+ final NatTimeoutUpdate tcpParams = buildNatTimeoutUpdate(NetworkProtocol.TCP);
+ mTetheringOffloadCallback.updateTimeout(tcpParams);
+ mTestLooper.dispatchAll();
+ inOrder.verify(mOffloadHalCallback).onNatTimeoutUpdate(eq(OsConstants.IPPROTO_TCP),
+ eq(tcpParams.src.addr),
+ eq(tcpParams.src.port),
+ eq(tcpParams.dst.addr),
+ eq(tcpParams.dst.port));
+ inOrder.verifyNoMoreInteractions();
+
+ final NatTimeoutUpdate udpParams = buildNatTimeoutUpdate(NetworkProtocol.UDP);
+ mTetheringOffloadCallback.updateTimeout(udpParams);
+ mTestLooper.dispatchAll();
+ inOrder.verify(mOffloadHalCallback).onNatTimeoutUpdate(eq(OsConstants.IPPROTO_UDP),
+ eq(udpParams.src.addr),
+ eq(udpParams.src.port),
+ eq(udpParams.dst.addr),
+ eq(udpParams.dst.port));
+ inOrder.verifyNoMoreInteractions();
+ }
+
+ private NatTimeoutUpdate buildNatTimeoutUpdate(final int proto) {
+ final NatTimeoutUpdate params = new NatTimeoutUpdate();
+ params.proto = proto;
+ params.src = new IPv4AddrPortPair();
+ params.dst = new IPv4AddrPortPair();
+ params.src.addr = "192.168.43.200";
+ params.src.port = 100;
+ params.dst.addr = "172.50.46.169";
+ params.dst.port = 150;
+ return params;
+ }
+}
diff --git a/Tethering/tests/unit/src/com/android/networkstack/tethering/OffloadHalHidlImplTest.java b/Tethering/tests/unit/src/com/android/networkstack/tethering/OffloadHalHidlImplTest.java
new file mode 100644
index 0000000..6fdab5a
--- /dev/null
+++ b/Tethering/tests/unit/src/com/android/networkstack/tethering/OffloadHalHidlImplTest.java
@@ -0,0 +1,359 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.networkstack.tethering;
+
+import static com.android.networkstack.tethering.OffloadHardwareInterface.OFFLOAD_HAL_VERSION_HIDL_1_0;
+import static com.android.networkstack.tethering.OffloadHardwareInterface.OFFLOAD_HAL_VERSION_HIDL_1_1;
+import static com.android.networkstack.tethering.util.TetheringUtils.uint16;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertThrows;
+import static org.junit.Assert.fail;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.doAnswer;
+import static org.mockito.Mockito.inOrder;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.reset;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+
+import android.hardware.tetheroffload.config.V1_0.IOffloadConfig;
+import android.hardware.tetheroffload.control.V1_0.IOffloadControl;
+import android.hardware.tetheroffload.control.V1_0.NatTimeoutUpdate;
+import android.hardware.tetheroffload.control.V1_0.NetworkProtocol;
+import android.hardware.tetheroffload.control.V1_1.ITetheringOffloadCallback;
+import android.hardware.tetheroffload.control.V1_1.OffloadCallbackEvent;
+import android.os.Handler;
+import android.os.NativeHandle;
+import android.os.test.TestLooper;
+import android.system.OsConstants;
+
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
+import com.android.net.module.util.SharedLog;
+import com.android.networkstack.tethering.OffloadHardwareInterface.ForwardedStats;
+import com.android.networkstack.tethering.OffloadHardwareInterface.OffloadHalCallback;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
+import org.mockito.InOrder;
+import org.mockito.MockitoAnnotations;
+
+import java.io.FileDescriptor;
+import java.util.ArrayList;
+
+@RunWith(AndroidJUnit4.class)
+@SmallTest
+public final class OffloadHalHidlImplTest {
+ private static final String RMNET0 = "test_rmnet_data0";
+
+ private final SharedLog mLog = new SharedLog("test");
+ private final TestLooper mTestLooper = new TestLooper();
+
+ private OffloadHalHidlImpl mIOffloadHal;
+ private IOffloadConfig mIOffloadConfigMock;
+ private IOffloadControl mIOffloadControlMock;
+ private ITetheringOffloadCallback mTetheringOffloadCallback;
+ private OffloadHalCallback mOffloadHalCallback;
+
+ private void createAndInitOffloadHal(int version) throws Exception {
+ final FileDescriptor fd1 = new FileDescriptor();
+ final FileDescriptor fd2 = new FileDescriptor();
+ final NativeHandle handle1 = new NativeHandle(fd1, true);
+ final NativeHandle handle2 = new NativeHandle(fd2, true);
+ mIOffloadConfigMock = mock(IOffloadConfig.class);
+ switch (version) {
+ case OFFLOAD_HAL_VERSION_HIDL_1_0:
+ mIOffloadControlMock = mock(IOffloadControl.class);
+ break;
+ case OFFLOAD_HAL_VERSION_HIDL_1_1:
+ mIOffloadControlMock = mock(
+ android.hardware.tetheroffload.control.V1_1.IOffloadControl.class);
+ break;
+ default:
+ fail("Nonexistent HAL version");
+ return;
+ }
+ mIOffloadHal = new OffloadHalHidlImpl(version, mIOffloadConfigMock,
+ mIOffloadControlMock, new Handler(mTestLooper.getLooper()), mLog);
+ mIOffloadHal.initOffload(handle1, handle2, mOffloadHalCallback);
+
+ final ArgumentCaptor<NativeHandle> nativeHandleCaptor1 =
+ ArgumentCaptor.forClass(NativeHandle.class);
+ final ArgumentCaptor<NativeHandle> nativeHandleCaptor2 =
+ ArgumentCaptor.forClass(NativeHandle.class);
+ final ArgumentCaptor<ITetheringOffloadCallback> offloadCallbackCaptor =
+ ArgumentCaptor.forClass(ITetheringOffloadCallback.class);
+ verify(mIOffloadConfigMock).setHandles(nativeHandleCaptor1.capture(),
+ nativeHandleCaptor2.capture(), any());
+ verify(mIOffloadControlMock).initOffload(offloadCallbackCaptor.capture(), any());
+ assertEquals(nativeHandleCaptor1.getValue().getFileDescriptor().getInt$(),
+ handle1.getFileDescriptor().getInt$());
+ assertEquals(nativeHandleCaptor2.getValue().getFileDescriptor().getInt$(),
+ handle2.getFileDescriptor().getInt$());
+ mTetheringOffloadCallback = offloadCallbackCaptor.getValue();
+ }
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ mOffloadHalCallback = spy(new OffloadHalCallback());
+ }
+
+ @Test
+ public void testGetForwardedStats() throws Exception {
+ createAndInitOffloadHal(OFFLOAD_HAL_VERSION_HIDL_1_0);
+ final long rxBytes = 12345;
+ final long txBytes = 67890;
+ doAnswer(invocation -> {
+ ((IOffloadControl.getForwardedStatsCallback) invocation.getArgument(1))
+ .onValues(rxBytes, txBytes);
+ return null;
+ }).when(mIOffloadControlMock).getForwardedStats(eq(RMNET0), any());
+ final ForwardedStats stats = mIOffloadHal.getForwardedStats(RMNET0);
+ verify(mIOffloadControlMock).getForwardedStats(eq(RMNET0), any());
+ assertNotNull(stats);
+ assertEquals(rxBytes, stats.rxBytes);
+ assertEquals(txBytes, stats.txBytes);
+ }
+
+ private void doTestSetLocalPrefixes(boolean expectSuccess) throws Exception {
+ createAndInitOffloadHal(OFFLOAD_HAL_VERSION_HIDL_1_0);
+ final ArrayList<String> localPrefixes = new ArrayList<>();
+ localPrefixes.add("127.0.0.0/8");
+ localPrefixes.add("fe80::/64");
+ doAnswer(invocation -> {
+ ((IOffloadControl.setLocalPrefixesCallback) invocation.getArgument(1))
+ .onValues(expectSuccess, "");
+ return null;
+ }).when(mIOffloadControlMock).setLocalPrefixes(eq(localPrefixes), any());
+ assertEquals(expectSuccess, mIOffloadHal.setLocalPrefixes(localPrefixes));
+ verify(mIOffloadControlMock).setLocalPrefixes(eq(localPrefixes), any());
+ }
+
+ @Test
+ public void testSetLocalPrefixesSuccess() throws Exception {
+ doTestSetLocalPrefixes(true);
+ }
+
+ @Test
+ public void testSetLocalPrefixesFailure() throws Exception {
+ doTestSetLocalPrefixes(false);
+ }
+
+ private void doTestSetDataLimit(boolean expectSuccess) throws Exception {
+ createAndInitOffloadHal(OFFLOAD_HAL_VERSION_HIDL_1_0);
+ final long limit = 12345;
+ doAnswer(invocation -> {
+ ((IOffloadControl.setDataLimitCallback) invocation.getArgument(2))
+ .onValues(expectSuccess, "");
+ return null;
+ }).when(mIOffloadControlMock).setDataLimit(eq(RMNET0), eq(limit), any());
+ assertEquals(expectSuccess, mIOffloadHal.setDataLimit(RMNET0, limit));
+ verify(mIOffloadControlMock).setDataLimit(eq(RMNET0), eq(limit), any());
+ }
+
+ @Test
+ public void testSetDataLimitSuccess() throws Exception {
+ doTestSetDataLimit(true);
+ }
+
+ @Test
+ public void testSetDataLimitFailure() throws Exception {
+ doTestSetDataLimit(false);
+ }
+
+ private void doTestSetDataWarningAndLimit(boolean expectSuccess) throws Exception {
+ createAndInitOffloadHal(OFFLOAD_HAL_VERSION_HIDL_1_1);
+ final long warning = 12345;
+ final long limit = 67890;
+ doAnswer(invocation -> {
+ ((android.hardware.tetheroffload.control.V1_1.IOffloadControl
+ .setDataWarningAndLimitCallback) invocation.getArgument(3))
+ .onValues(expectSuccess, "");
+ return null;
+ }).when((android.hardware.tetheroffload.control.V1_1.IOffloadControl) mIOffloadControlMock)
+ .setDataWarningAndLimit(eq(RMNET0), eq(warning), eq(limit), any());
+ assertEquals(expectSuccess, mIOffloadHal.setDataWarningAndLimit(RMNET0, warning, limit));
+ verify((android.hardware.tetheroffload.control.V1_1.IOffloadControl) mIOffloadControlMock)
+ .setDataWarningAndLimit(eq(RMNET0), eq(warning), eq(limit), any());
+ }
+
+ @Test
+ public void testSetDataWarningAndLimitSuccess() throws Exception {
+ doTestSetDataWarningAndLimit(true);
+ }
+
+ @Test
+ public void testSetDataWarningAndLimitFailure() throws Exception {
+ // Verify that V1.0 control HAL would reject the function call with exception.
+ createAndInitOffloadHal(OFFLOAD_HAL_VERSION_HIDL_1_0);
+ final long warning = 12345;
+ final long limit = 67890;
+ assertThrows(UnsupportedOperationException.class,
+ () -> mIOffloadHal.setDataWarningAndLimit(RMNET0, warning, limit));
+
+ doTestSetDataWarningAndLimit(false);
+ }
+
+ private void doTestSetUpstreamParameters(boolean expectSuccess) throws Exception {
+ createAndInitOffloadHal(OFFLOAD_HAL_VERSION_HIDL_1_0);
+ final String v4addr = "192.168.10.1";
+ final String v4gateway = "192.168.10.255";
+ final ArrayList<String> v6gws = new ArrayList<>(0);
+ v6gws.add("2001:db8::1");
+ doAnswer(invocation -> {
+ ((IOffloadControl.setUpstreamParametersCallback) invocation.getArgument(4))
+ .onValues(expectSuccess, "");
+ return null;
+ }).when(mIOffloadControlMock).setUpstreamParameters(eq(RMNET0), eq(v4addr), eq(v4gateway),
+ eq(v6gws), any());
+ assertEquals(expectSuccess, mIOffloadHal.setUpstreamParameters(RMNET0, v4addr, v4gateway,
+ v6gws));
+ verify(mIOffloadControlMock).setUpstreamParameters(eq(RMNET0), eq(v4addr), eq(v4gateway),
+ eq(v6gws), any());
+ }
+
+ @Test
+ public void testSetUpstreamParametersSuccess() throws Exception {
+ doTestSetUpstreamParameters(true);
+ }
+
+ @Test
+ public void testSetUpstreamParametersFailure() throws Exception {
+ doTestSetUpstreamParameters(false);
+ }
+
+ private void doTestAddDownstream(boolean expectSuccess) throws Exception {
+ createAndInitOffloadHal(OFFLOAD_HAL_VERSION_HIDL_1_0);
+ final String ifName = "wlan1";
+ final String prefix = "192.168.43.0/24";
+ doAnswer(invocation -> {
+ ((IOffloadControl.addDownstreamCallback) invocation.getArgument(2))
+ .onValues(expectSuccess, "");
+ return null;
+ }).when(mIOffloadControlMock).addDownstream(eq(ifName), eq(prefix), any());
+ assertEquals(expectSuccess, mIOffloadHal.addDownstream(ifName, prefix));
+ verify(mIOffloadControlMock).addDownstream(eq(ifName), eq(prefix), any());
+ }
+
+ @Test
+ public void testAddDownstreamSuccess() throws Exception {
+ doTestAddDownstream(true);
+ }
+
+ @Test
+ public void testAddDownstreamFailure() throws Exception {
+ doTestAddDownstream(false);
+ }
+
+ private void doTestRemoveDownstream(boolean expectSuccess) throws Exception {
+ createAndInitOffloadHal(OFFLOAD_HAL_VERSION_HIDL_1_0);
+ final String ifName = "wlan1";
+ final String prefix = "192.168.43.0/24";
+ doAnswer(invocation -> {
+ ((IOffloadControl.removeDownstreamCallback) invocation.getArgument(2))
+ .onValues(expectSuccess, "");
+ return null;
+ }).when(mIOffloadControlMock).removeDownstream(eq(ifName), eq(prefix), any());
+ assertEquals(expectSuccess, mIOffloadHal.removeDownstream(ifName, prefix));
+ verify(mIOffloadControlMock).removeDownstream(eq(ifName), eq(prefix), any());
+ }
+
+ @Test
+ public void testRemoveDownstreamSuccess() throws Exception {
+ doTestRemoveDownstream(true);
+ }
+
+ @Test
+ public void testRemoveDownstreamFailure() throws Exception {
+ doTestRemoveDownstream(false);
+ }
+
+ @Test
+ public void testTetheringOffloadCallback() throws Exception {
+ createAndInitOffloadHal(OFFLOAD_HAL_VERSION_HIDL_1_0);
+
+ mTetheringOffloadCallback.onEvent(OffloadCallbackEvent.OFFLOAD_STARTED);
+ mTestLooper.dispatchAll();
+ verify(mOffloadHalCallback).onStarted();
+
+ mTetheringOffloadCallback.onEvent(OffloadCallbackEvent.OFFLOAD_STOPPED_ERROR);
+ mTestLooper.dispatchAll();
+ verify(mOffloadHalCallback).onStoppedError();
+
+ mTetheringOffloadCallback.onEvent(OffloadCallbackEvent.OFFLOAD_STOPPED_UNSUPPORTED);
+ mTestLooper.dispatchAll();
+ verify(mOffloadHalCallback).onStoppedUnsupported();
+
+ mTetheringOffloadCallback.onEvent(OffloadCallbackEvent.OFFLOAD_SUPPORT_AVAILABLE);
+ mTestLooper.dispatchAll();
+ verify(mOffloadHalCallback).onSupportAvailable();
+
+ mTetheringOffloadCallback.onEvent(OffloadCallbackEvent.OFFLOAD_STOPPED_LIMIT_REACHED);
+ mTestLooper.dispatchAll();
+ verify(mOffloadHalCallback).onStoppedLimitReached();
+
+ final NatTimeoutUpdate tcpParams = buildNatTimeoutUpdate(NetworkProtocol.TCP);
+ mTetheringOffloadCallback.updateTimeout(tcpParams);
+ mTestLooper.dispatchAll();
+ verify(mOffloadHalCallback).onNatTimeoutUpdate(eq(OsConstants.IPPROTO_TCP),
+ eq(tcpParams.src.addr),
+ eq(uint16(tcpParams.src.port)),
+ eq(tcpParams.dst.addr),
+ eq(uint16(tcpParams.dst.port)));
+
+ final NatTimeoutUpdate udpParams = buildNatTimeoutUpdate(NetworkProtocol.UDP);
+ mTetheringOffloadCallback.updateTimeout(udpParams);
+ mTestLooper.dispatchAll();
+ verify(mOffloadHalCallback).onNatTimeoutUpdate(eq(OsConstants.IPPROTO_UDP),
+ eq(udpParams.src.addr),
+ eq(uint16(udpParams.src.port)),
+ eq(udpParams.dst.addr),
+ eq(uint16(udpParams.dst.port)));
+ reset(mOffloadHalCallback);
+
+ createAndInitOffloadHal(OFFLOAD_HAL_VERSION_HIDL_1_1);
+
+ // Verify the interface will process the events that comes from V1.1 HAL.
+ mTetheringOffloadCallback.onEvent_1_1(OffloadCallbackEvent.OFFLOAD_STARTED);
+ mTestLooper.dispatchAll();
+ final InOrder inOrder = inOrder(mOffloadHalCallback);
+ inOrder.verify(mOffloadHalCallback).onStarted();
+ inOrder.verifyNoMoreInteractions();
+
+ mTetheringOffloadCallback.onEvent_1_1(OffloadCallbackEvent.OFFLOAD_WARNING_REACHED);
+ mTestLooper.dispatchAll();
+ inOrder.verify(mOffloadHalCallback).onWarningReached();
+ inOrder.verifyNoMoreInteractions();
+ }
+
+ private NatTimeoutUpdate buildNatTimeoutUpdate(final int proto) {
+ final NatTimeoutUpdate params = new NatTimeoutUpdate();
+ params.proto = proto;
+ params.src.addr = "192.168.43.200";
+ params.src.port = 100;
+ params.dst.addr = "172.50.46.169";
+ params.dst.port = 150;
+ return params;
+ }
+}
diff --git a/Tethering/tests/unit/src/com/android/networkstack/tethering/OffloadHardwareInterfaceTest.java b/Tethering/tests/unit/src/com/android/networkstack/tethering/OffloadHardwareInterfaceTest.java
index 36b439b..b1f875b 100644
--- a/Tethering/tests/unit/src/com/android/networkstack/tethering/OffloadHardwareInterfaceTest.java
+++ b/Tethering/tests/unit/src/com/android/networkstack/tethering/OffloadHardwareInterfaceTest.java
@@ -20,36 +20,29 @@
import static android.system.OsConstants.AF_UNIX;
import static android.system.OsConstants.SOCK_STREAM;
-import static com.android.networkstack.tethering.OffloadHardwareInterface.OFFLOAD_HAL_VERSION_1_0;
-import static com.android.networkstack.tethering.OffloadHardwareInterface.OFFLOAD_HAL_VERSION_1_1;
-import static com.android.networkstack.tethering.util.TetheringUtils.uint16;
+import static com.android.networkstack.tethering.OffloadHardwareInterface.OFFLOAD_HAL_VERSION_AIDL;
+import static com.android.networkstack.tethering.OffloadHardwareInterface.OFFLOAD_HAL_VERSION_HIDL_1_0;
+import static com.android.networkstack.tethering.OffloadHardwareInterface.OFFLOAD_HAL_VERSION_HIDL_1_1;
+import static com.android.networkstack.tethering.OffloadHardwareInterface.OFFLOAD_HAL_VERSION_NONE;
import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertThrows;
+import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyLong;
+import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.ArgumentMatchers.eq;
-import static org.mockito.Mockito.inOrder;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.reset;
-import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
-import android.hardware.tetheroffload.config.V1_0.IOffloadConfig;
-import android.hardware.tetheroffload.control.V1_0.IOffloadControl;
-import android.hardware.tetheroffload.control.V1_0.NatTimeoutUpdate;
-import android.hardware.tetheroffload.control.V1_0.NetworkProtocol;
-import android.hardware.tetheroffload.control.V1_1.ITetheringOffloadCallback;
-import android.hardware.tetheroffload.control.V1_1.OffloadCallbackEvent;
import android.os.Handler;
import android.os.NativeHandle;
import android.os.test.TestLooper;
import android.system.ErrnoException;
import android.system.Os;
-import android.system.OsConstants;
-import android.util.Pair;
import androidx.test.filters.SmallTest;
import androidx.test.runner.AndroidJUnit4;
@@ -57,12 +50,13 @@
import com.android.net.module.util.SharedLog;
import com.android.net.module.util.netlink.StructNfGenMsg;
import com.android.net.module.util.netlink.StructNlMsgHdr;
+import com.android.networkstack.tethering.OffloadHardwareInterface.ForwardedStats;
+import com.android.networkstack.tethering.OffloadHardwareInterface.OffloadHalCallback;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
-import org.mockito.InOrder;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
@@ -79,11 +73,9 @@
private final TestLooper mTestLooper = new TestLooper();
private OffloadHardwareInterface mOffloadHw;
- private ITetheringOffloadCallback mTetheringOffloadCallback;
- private OffloadHardwareInterface.ControlCallback mControlCallback;
+ private OffloadHalCallback mOffloadHalCallback;
- @Mock private IOffloadConfig mIOffloadConfig;
- private IOffloadControl mIOffloadControl;
+ @Mock private IOffloadHal mIOffload;
@Mock private NativeHandle mNativeHandle;
// Random values to test Netlink message.
@@ -91,32 +83,16 @@
private static final short TEST_FLAGS = 263;
class MyDependencies extends OffloadHardwareInterface.Dependencies {
- private final int mMockControlVersion;
- MyDependencies(SharedLog log, final int mockControlVersion) {
- super(log);
- mMockControlVersion = mockControlVersion;
+ private final int mMockOffloadHalVersion;
+ MyDependencies(Handler handler, SharedLog log, final int mockOffloadHalVersion) {
+ super(handler, log);
+ mMockOffloadHalVersion = mockOffloadHalVersion;
+ when(mIOffload.getVersion()).thenReturn(mMockOffloadHalVersion);
}
@Override
- public IOffloadConfig getOffloadConfig() {
- return mIOffloadConfig;
- }
-
- @Override
- public Pair<IOffloadControl, Integer> getOffloadControl() {
- switch (mMockControlVersion) {
- case OFFLOAD_HAL_VERSION_1_0:
- mIOffloadControl = mock(IOffloadControl.class);
- break;
- case OFFLOAD_HAL_VERSION_1_1:
- mIOffloadControl =
- mock(android.hardware.tetheroffload.control.V1_1.IOffloadControl.class);
- break;
- default:
- throw new IllegalArgumentException("Invalid offload control version "
- + mMockControlVersion);
- }
- return new Pair<IOffloadControl, Integer>(mIOffloadControl, mMockControlVersion);
+ public IOffloadHal getOffload() {
+ return mMockOffloadHalVersion == OFFLOAD_HAL_VERSION_NONE ? null : mIOffload;
}
@Override
@@ -128,156 +104,140 @@
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
- mControlCallback = spy(new OffloadHardwareInterface.ControlCallback());
+ mOffloadHalCallback = new OffloadHalCallback();
+ when(mIOffload.initOffload(any(NativeHandle.class), any(NativeHandle.class),
+ any(OffloadHalCallback.class))).thenReturn(true);
}
- private void startOffloadHardwareInterface(int controlVersion) throws Exception {
+ private void startOffloadHardwareInterface(int offloadHalVersion)
+ throws Exception {
final SharedLog log = new SharedLog("test");
- mOffloadHw = new OffloadHardwareInterface(new Handler(mTestLooper.getLooper()), log,
- new MyDependencies(log, controlVersion));
- mOffloadHw.initOffloadConfig();
- mOffloadHw.initOffloadControl(mControlCallback);
- final ArgumentCaptor<ITetheringOffloadCallback> mOffloadCallbackCaptor =
- ArgumentCaptor.forClass(ITetheringOffloadCallback.class);
- verify(mIOffloadControl).initOffload(mOffloadCallbackCaptor.capture(), any());
- mTetheringOffloadCallback = mOffloadCallbackCaptor.getValue();
+ final Handler handler = new Handler(mTestLooper.getLooper());
+ final int num = offloadHalVersion != OFFLOAD_HAL_VERSION_NONE ? 1 : 0;
+ mOffloadHw = new OffloadHardwareInterface(handler, log,
+ new MyDependencies(handler, log, offloadHalVersion));
+ assertEquals(offloadHalVersion, mOffloadHw.initOffload(mOffloadHalCallback));
+ verify(mIOffload, times(num)).initOffload(any(NativeHandle.class), any(NativeHandle.class),
+ eq(mOffloadHalCallback));
+ }
+
+ @Test
+ public void testInitFailureWithNoHal() throws Exception {
+ startOffloadHardwareInterface(OFFLOAD_HAL_VERSION_NONE);
+ }
+
+ @Test
+ public void testInitSuccessWithAidl() throws Exception {
+ startOffloadHardwareInterface(OFFLOAD_HAL_VERSION_AIDL);
+ }
+
+ @Test
+ public void testInitSuccessWithHidl_1_0() throws Exception {
+ startOffloadHardwareInterface(OFFLOAD_HAL_VERSION_HIDL_1_0);
+ }
+
+ @Test
+ public void testInitSuccessWithHidl_1_1() throws Exception {
+ startOffloadHardwareInterface(OFFLOAD_HAL_VERSION_HIDL_1_1);
}
@Test
public void testGetForwardedStats() throws Exception {
- startOffloadHardwareInterface(OFFLOAD_HAL_VERSION_1_0);
- final OffloadHardwareInterface.ForwardedStats stats = mOffloadHw.getForwardedStats(RMNET0);
- verify(mIOffloadControl).getForwardedStats(eq(RMNET0), any());
- assertNotNull(stats);
+ startOffloadHardwareInterface(OFFLOAD_HAL_VERSION_HIDL_1_0);
+ ForwardedStats stats = new ForwardedStats(12345, 56780);
+ when(mIOffload.getForwardedStats(anyString())).thenReturn(stats);
+ assertEquals(mOffloadHw.getForwardedStats(RMNET0), stats);
+ verify(mIOffload).getForwardedStats(eq(RMNET0));
}
@Test
public void testSetLocalPrefixes() throws Exception {
- startOffloadHardwareInterface(OFFLOAD_HAL_VERSION_1_0);
+ startOffloadHardwareInterface(OFFLOAD_HAL_VERSION_HIDL_1_0);
final ArrayList<String> localPrefixes = new ArrayList<>();
localPrefixes.add("127.0.0.0/8");
localPrefixes.add("fe80::/64");
- mOffloadHw.setLocalPrefixes(localPrefixes);
- verify(mIOffloadControl).setLocalPrefixes(eq(localPrefixes), any());
+ when(mIOffload.setLocalPrefixes(any())).thenReturn(true);
+ assertTrue(mOffloadHw.setLocalPrefixes(localPrefixes));
+ verify(mIOffload).setLocalPrefixes(eq(localPrefixes));
+ when(mIOffload.setLocalPrefixes(any())).thenReturn(false);
+ assertFalse(mOffloadHw.setLocalPrefixes(localPrefixes));
}
@Test
public void testSetDataLimit() throws Exception {
- startOffloadHardwareInterface(OFFLOAD_HAL_VERSION_1_0);
+ startOffloadHardwareInterface(OFFLOAD_HAL_VERSION_HIDL_1_0);
final long limit = 12345;
- mOffloadHw.setDataLimit(RMNET0, limit);
- verify(mIOffloadControl).setDataLimit(eq(RMNET0), eq(limit), any());
+ when(mIOffload.setDataLimit(anyString(), anyLong())).thenReturn(true);
+ assertTrue(mOffloadHw.setDataLimit(RMNET0, limit));
+ verify(mIOffload).setDataLimit(eq(RMNET0), eq(limit));
+ when(mIOffload.setDataLimit(anyString(), anyLong())).thenReturn(false);
+ assertFalse(mOffloadHw.setDataLimit(RMNET0, limit));
+ }
+
+ @Test
+ public void testSetDataWarningAndLimitFailureWithHidl_1_0() throws Exception {
+ // Verify V1.0 control HAL would reject the function call with exception.
+ startOffloadHardwareInterface(OFFLOAD_HAL_VERSION_HIDL_1_0);
+ final long warning = 12345;
+ final long limit = 67890;
+ assertThrows(UnsupportedOperationException.class,
+ () -> mOffloadHw.setDataWarningAndLimit(RMNET0, warning, limit));
}
@Test
public void testSetDataWarningAndLimit() throws Exception {
- // Verify V1.0 control HAL would reject the function call with exception.
- startOffloadHardwareInterface(OFFLOAD_HAL_VERSION_1_0);
+ // Verify V1.1 control HAL could receive this function call.
+ startOffloadHardwareInterface(OFFLOAD_HAL_VERSION_HIDL_1_1);
final long warning = 12345;
final long limit = 67890;
- assertThrows(IllegalArgumentException.class,
- () -> mOffloadHw.setDataWarningAndLimit(RMNET0, warning, limit));
- reset(mIOffloadControl);
-
- // Verify V1.1 control HAL could receive this function call.
- startOffloadHardwareInterface(OFFLOAD_HAL_VERSION_1_1);
- mOffloadHw.setDataWarningAndLimit(RMNET0, warning, limit);
- verify((android.hardware.tetheroffload.control.V1_1.IOffloadControl) mIOffloadControl)
- .setDataWarningAndLimit(eq(RMNET0), eq(warning), eq(limit), any());
+ when(mIOffload.setDataWarningAndLimit(anyString(), anyLong(), anyLong())).thenReturn(true);
+ assertTrue(mOffloadHw.setDataWarningAndLimit(RMNET0, warning, limit));
+ verify(mIOffload).setDataWarningAndLimit(eq(RMNET0), eq(warning), eq(limit));
+ when(mIOffload.setDataWarningAndLimit(anyString(), anyLong(), anyLong())).thenReturn(false);
+ assertFalse(mOffloadHw.setDataWarningAndLimit(RMNET0, warning, limit));
}
@Test
public void testSetUpstreamParameters() throws Exception {
- startOffloadHardwareInterface(OFFLOAD_HAL_VERSION_1_0);
+ startOffloadHardwareInterface(OFFLOAD_HAL_VERSION_HIDL_1_0);
final String v4addr = "192.168.10.1";
final String v4gateway = "192.168.10.255";
final ArrayList<String> v6gws = new ArrayList<>(0);
v6gws.add("2001:db8::1");
- mOffloadHw.setUpstreamParameters(RMNET0, v4addr, v4gateway, v6gws);
- verify(mIOffloadControl).setUpstreamParameters(eq(RMNET0), eq(v4addr), eq(v4gateway),
- eq(v6gws), any());
+ when(mIOffload.setUpstreamParameters(anyString(), anyString(), anyString(), any()))
+ .thenReturn(true);
+ assertTrue(mOffloadHw.setUpstreamParameters(RMNET0, v4addr, v4gateway, v6gws));
+ verify(mIOffload).setUpstreamParameters(eq(RMNET0), eq(v4addr), eq(v4gateway), eq(v6gws));
final ArgumentCaptor<ArrayList<String>> mArrayListCaptor =
ArgumentCaptor.forClass(ArrayList.class);
- mOffloadHw.setUpstreamParameters(null, null, null, null);
- verify(mIOffloadControl).setUpstreamParameters(eq(""), eq(""), eq(""),
- mArrayListCaptor.capture(), any());
+ when(mIOffload.setUpstreamParameters(anyString(), anyString(), anyString(), any()))
+ .thenReturn(false);
+ assertFalse(mOffloadHw.setUpstreamParameters(null, null, null, null));
+ verify(mIOffload).setUpstreamParameters(eq(""), eq(""), eq(""), mArrayListCaptor.capture());
assertEquals(mArrayListCaptor.getValue().size(), 0);
}
@Test
- public void testUpdateDownstreamPrefix() throws Exception {
- startOffloadHardwareInterface(OFFLOAD_HAL_VERSION_1_0);
+ public void testUpdateDownstream() throws Exception {
+ startOffloadHardwareInterface(OFFLOAD_HAL_VERSION_HIDL_1_0);
final String ifName = "wlan1";
final String prefix = "192.168.43.0/24";
- mOffloadHw.addDownstreamPrefix(ifName, prefix);
- verify(mIOffloadControl).addDownstream(eq(ifName), eq(prefix), any());
-
- mOffloadHw.removeDownstreamPrefix(ifName, prefix);
- verify(mIOffloadControl).removeDownstream(eq(ifName), eq(prefix), any());
- }
-
- @Test
- public void testTetheringOffloadCallback() throws Exception {
- startOffloadHardwareInterface(OFFLOAD_HAL_VERSION_1_0);
-
- mTetheringOffloadCallback.onEvent(OffloadCallbackEvent.OFFLOAD_STARTED);
- mTestLooper.dispatchAll();
- verify(mControlCallback).onStarted();
-
- mTetheringOffloadCallback.onEvent(OffloadCallbackEvent.OFFLOAD_STOPPED_ERROR);
- mTestLooper.dispatchAll();
- verify(mControlCallback).onStoppedError();
-
- mTetheringOffloadCallback.onEvent(OffloadCallbackEvent.OFFLOAD_STOPPED_UNSUPPORTED);
- mTestLooper.dispatchAll();
- verify(mControlCallback).onStoppedUnsupported();
-
- mTetheringOffloadCallback.onEvent(OffloadCallbackEvent.OFFLOAD_SUPPORT_AVAILABLE);
- mTestLooper.dispatchAll();
- verify(mControlCallback).onSupportAvailable();
-
- mTetheringOffloadCallback.onEvent(OffloadCallbackEvent.OFFLOAD_STOPPED_LIMIT_REACHED);
- mTestLooper.dispatchAll();
- verify(mControlCallback).onStoppedLimitReached();
-
- final NatTimeoutUpdate tcpParams = buildNatTimeoutUpdate(NetworkProtocol.TCP);
- mTetheringOffloadCallback.updateTimeout(tcpParams);
- mTestLooper.dispatchAll();
- verify(mControlCallback).onNatTimeoutUpdate(eq(OsConstants.IPPROTO_TCP),
- eq(tcpParams.src.addr),
- eq(uint16(tcpParams.src.port)),
- eq(tcpParams.dst.addr),
- eq(uint16(tcpParams.dst.port)));
-
- final NatTimeoutUpdate udpParams = buildNatTimeoutUpdate(NetworkProtocol.UDP);
- mTetheringOffloadCallback.updateTimeout(udpParams);
- mTestLooper.dispatchAll();
- verify(mControlCallback).onNatTimeoutUpdate(eq(OsConstants.IPPROTO_UDP),
- eq(udpParams.src.addr),
- eq(uint16(udpParams.src.port)),
- eq(udpParams.dst.addr),
- eq(uint16(udpParams.dst.port)));
- reset(mControlCallback);
-
- startOffloadHardwareInterface(OFFLOAD_HAL_VERSION_1_1);
-
- // Verify the interface will process the events that comes from V1.1 HAL.
- mTetheringOffloadCallback.onEvent_1_1(OffloadCallbackEvent.OFFLOAD_STARTED);
- mTestLooper.dispatchAll();
- final InOrder inOrder = inOrder(mControlCallback);
- inOrder.verify(mControlCallback).onStarted();
- inOrder.verifyNoMoreInteractions();
-
- mTetheringOffloadCallback.onEvent_1_1(OffloadCallbackEvent.OFFLOAD_WARNING_REACHED);
- mTestLooper.dispatchAll();
- inOrder.verify(mControlCallback).onWarningReached();
- inOrder.verifyNoMoreInteractions();
+ when(mIOffload.addDownstream(anyString(), anyString())).thenReturn(true);
+ assertTrue(mOffloadHw.addDownstream(ifName, prefix));
+ verify(mIOffload).addDownstream(eq(ifName), eq(prefix));
+ when(mIOffload.addDownstream(anyString(), anyString())).thenReturn(false);
+ assertFalse(mOffloadHw.addDownstream(ifName, prefix));
+ when(mIOffload.removeDownstream(anyString(), anyString())).thenReturn(true);
+ assertTrue(mOffloadHw.removeDownstream(ifName, prefix));
+ verify(mIOffload).removeDownstream(eq(ifName), eq(prefix));
+ when(mIOffload.removeDownstream(anyString(), anyString())).thenReturn(false);
+ assertFalse(mOffloadHw.removeDownstream(ifName, prefix));
}
@Test
public void testSendIpv4NfGenMsg() throws Exception {
- startOffloadHardwareInterface(OFFLOAD_HAL_VERSION_1_0);
+ startOffloadHardwareInterface(OFFLOAD_HAL_VERSION_HIDL_1_0);
FileDescriptor writeSocket = new FileDescriptor();
FileDescriptor readSocket = new FileDescriptor();
try {
@@ -308,14 +268,4 @@
assertEquals(0 /* error */, buffer.getShort()); // res_id
assertEquals(expectedLen, buffer.position());
}
-
- private NatTimeoutUpdate buildNatTimeoutUpdate(final int proto) {
- final NatTimeoutUpdate params = new NatTimeoutUpdate();
- params.proto = proto;
- params.src.addr = "192.168.43.200";
- params.src.port = 100;
- params.dst.addr = "172.50.46.169";
- params.dst.port = 150;
- return params;
- }
}
diff --git a/Tethering/tests/unit/src/com/android/networkstack/tethering/PrivateAddressCoordinatorTest.java b/Tethering/tests/unit/src/com/android/networkstack/tethering/PrivateAddressCoordinatorTest.java
index 55d9852..91b092a 100644
--- a/Tethering/tests/unit/src/com/android/networkstack/tethering/PrivateAddressCoordinatorTest.java
+++ b/Tethering/tests/unit/src/com/android/networkstack/tethering/PrivateAddressCoordinatorTest.java
@@ -19,6 +19,8 @@
import static android.net.NetworkCapabilities.TRANSPORT_CELLULAR;
import static android.net.NetworkCapabilities.TRANSPORT_VPN;
import static android.net.NetworkCapabilities.TRANSPORT_WIFI;
+import static android.net.TetheringManager.CONNECTIVITY_SCOPE_GLOBAL;
+import static android.net.TetheringManager.CONNECTIVITY_SCOPE_LOCAL;
import static android.net.TetheringManager.TETHERING_ETHERNET;
import static android.net.TetheringManager.TETHERING_USB;
import static android.net.TetheringManager.TETHERING_WIFI;
@@ -61,6 +63,7 @@
private static final String TEST_IFNAME = "test0";
@Mock private IpServer mHotspotIpServer;
+ @Mock private IpServer mLocalHotspotIpServer;
@Mock private IpServer mUsbIpServer;
@Mock private IpServer mEthernetIpServer;
@Mock private IpServer mWifiP2pIpServer;
@@ -90,6 +93,7 @@
when(mUsbIpServer.interfaceType()).thenReturn(TETHERING_USB);
when(mEthernetIpServer.interfaceType()).thenReturn(TETHERING_ETHERNET);
when(mHotspotIpServer.interfaceType()).thenReturn(TETHERING_WIFI);
+ when(mLocalHotspotIpServer.interfaceType()).thenReturn(TETHERING_WIFI);
when(mWifiP2pIpServer.interfaceType()).thenReturn(TETHERING_WIFI_P2P);
}
@@ -104,9 +108,10 @@
mPrivateAddressCoordinator = spy(new PrivateAddressCoordinator(mContext, mConfig));
}
- private LinkAddress requestDownstreamAddress(final IpServer ipServer, boolean useLastAddress) {
+ private LinkAddress requestDownstreamAddress(final IpServer ipServer, int scope,
+ boolean useLastAddress) {
final LinkAddress address = mPrivateAddressCoordinator.requestDownstreamAddress(
- ipServer, useLastAddress);
+ ipServer, scope, useLastAddress);
when(ipServer.getAddress()).thenReturn(address);
return address;
}
@@ -115,19 +120,19 @@
public void testRequestDownstreamAddressWithoutUsingLastAddress() throws Exception {
final IpPrefix bluetoothPrefix = asIpPrefix(mBluetoothAddress);
final LinkAddress address = requestDownstreamAddress(mHotspotIpServer,
- false /* useLastAddress */);
+ CONNECTIVITY_SCOPE_GLOBAL, false /* useLastAddress */);
final IpPrefix hotspotPrefix = asIpPrefix(address);
assertNotEquals(hotspotPrefix, bluetoothPrefix);
final LinkAddress newAddress = requestDownstreamAddress(mHotspotIpServer,
- false /* useLastAddress */);
+ CONNECTIVITY_SCOPE_GLOBAL, false /* useLastAddress */);
final IpPrefix testDupRequest = asIpPrefix(newAddress);
assertNotEquals(hotspotPrefix, testDupRequest);
assertNotEquals(bluetoothPrefix, testDupRequest);
mPrivateAddressCoordinator.releaseDownstream(mHotspotIpServer);
final LinkAddress usbAddress = requestDownstreamAddress(mUsbIpServer,
- false /* useLastAddress */);
+ CONNECTIVITY_SCOPE_GLOBAL, false /* useLastAddress */);
final IpPrefix usbPrefix = asIpPrefix(usbAddress);
assertNotEquals(usbPrefix, bluetoothPrefix);
assertNotEquals(usbPrefix, hotspotPrefix);
@@ -139,25 +144,28 @@
int fakeSubAddr = 0x2b00; // 43.0.
when(mPrivateAddressCoordinator.getRandomInt()).thenReturn(fakeSubAddr);
LinkAddress actualAddress = requestDownstreamAddress(mHotspotIpServer,
- false /* useLastAddress */);
+ CONNECTIVITY_SCOPE_GLOBAL, false /* useLastAddress */);
assertEquals(new LinkAddress("192.168.43.2/24"), actualAddress);
mPrivateAddressCoordinator.releaseDownstream(mHotspotIpServer);
fakeSubAddr = 0x2d01; // 45.1.
when(mPrivateAddressCoordinator.getRandomInt()).thenReturn(fakeSubAddr);
- actualAddress = requestDownstreamAddress(mHotspotIpServer, false /* useLastAddress */);
+ actualAddress = requestDownstreamAddress(mHotspotIpServer,
+ CONNECTIVITY_SCOPE_GLOBAL, false /* useLastAddress */);
assertEquals(new LinkAddress("192.168.45.2/24"), actualAddress);
mPrivateAddressCoordinator.releaseDownstream(mHotspotIpServer);
fakeSubAddr = 0x2eff; // 46.255.
when(mPrivateAddressCoordinator.getRandomInt()).thenReturn(fakeSubAddr);
- actualAddress = requestDownstreamAddress(mHotspotIpServer, false /* useLastAddress */);
+ actualAddress = requestDownstreamAddress(mHotspotIpServer,
+ CONNECTIVITY_SCOPE_GLOBAL, false /* useLastAddress */);
assertEquals(new LinkAddress("192.168.46.254/24"), actualAddress);
mPrivateAddressCoordinator.releaseDownstream(mHotspotIpServer);
fakeSubAddr = 0x2f05; // 47.5.
when(mPrivateAddressCoordinator.getRandomInt()).thenReturn(fakeSubAddr);
- actualAddress = requestDownstreamAddress(mHotspotIpServer, false /* useLastAddress */);
+ actualAddress = requestDownstreamAddress(mHotspotIpServer,
+ CONNECTIVITY_SCOPE_GLOBAL, false /* useLastAddress */);
assertEquals(new LinkAddress("192.168.47.5/24"), actualAddress);
mPrivateAddressCoordinator.releaseDownstream(mHotspotIpServer);
}
@@ -168,7 +176,7 @@
when(mPrivateAddressCoordinator.getRandomInt()).thenReturn(
getSubAddress(mBluetoothAddress.getAddress().getAddress()));
final LinkAddress hotspotAddress = requestDownstreamAddress(mHotspotIpServer,
- false /* useLastAddress */);
+ CONNECTIVITY_SCOPE_GLOBAL, false /* useLastAddress */);
final IpPrefix hotspotPrefix = asIpPrefix(hotspotAddress);
assertNotEquals(asIpPrefix(mBluetoothAddress), hotspotPrefix);
mPrivateAddressCoordinator.releaseDownstream(mHotspotIpServer);
@@ -177,7 +185,7 @@
when(mPrivateAddressCoordinator.getRandomInt()).thenReturn(
getSubAddress(hotspotAddress.getAddress().getAddress()));
final LinkAddress usbAddress = requestDownstreamAddress(mUsbIpServer,
- false /* useLastAddress */);
+ CONNECTIVITY_SCOPE_GLOBAL, false /* useLastAddress */);
final IpPrefix usbPrefix = asIpPrefix(usbAddress);
assertNotEquals(asIpPrefix(mBluetoothAddress), usbPrefix);
assertNotEquals(hotspotPrefix, usbPrefix);
@@ -187,7 +195,7 @@
when(mPrivateAddressCoordinator.getRandomInt()).thenReturn(
getSubAddress(mLegacyWifiP2pAddress.getAddress().getAddress()));
final LinkAddress etherAddress = requestDownstreamAddress(mEthernetIpServer,
- false /* useLastAddress */);
+ CONNECTIVITY_SCOPE_GLOBAL, false /* useLastAddress */);
final IpPrefix etherPrefix = asIpPrefix(etherAddress);
assertNotEquals(asIpPrefix(mLegacyWifiP2pAddress), etherPrefix);
assertNotEquals(asIpPrefix(mBluetoothAddress), etherPrefix);
@@ -200,11 +208,11 @@
final int fakeHotspotSubAddr = 0x2b05; // 43.5
when(mPrivateAddressCoordinator.getRandomInt()).thenReturn(fakeHotspotSubAddr);
final LinkAddress hotspotAddress = requestDownstreamAddress(mHotspotIpServer,
- true /* useLastAddress */);
+ CONNECTIVITY_SCOPE_GLOBAL, true /* useLastAddress */);
assertEquals("Wrong wifi prefix: ", new LinkAddress("192.168.43.5/24"), hotspotAddress);
final LinkAddress usbAddress = requestDownstreamAddress(mUsbIpServer,
- true /* useLastAddress */);
+ CONNECTIVITY_SCOPE_GLOBAL, true /* useLastAddress */);
assertEquals("Wrong wifi prefix: ", new LinkAddress("192.168.45.5/24"), usbAddress);
mPrivateAddressCoordinator.releaseDownstream(mHotspotIpServer);
@@ -214,10 +222,10 @@
when(mPrivateAddressCoordinator.getRandomInt()).thenReturn(fakeHotspotSubAddr);
final LinkAddress newHotspotAddress = requestDownstreamAddress(mHotspotIpServer,
- true /* useLastAddress */);
+ CONNECTIVITY_SCOPE_GLOBAL, true /* useLastAddress */);
assertEquals(hotspotAddress, newHotspotAddress);
final LinkAddress newUsbAddress = requestDownstreamAddress(mUsbIpServer,
- true /* useLastAddress */);
+ CONNECTIVITY_SCOPE_GLOBAL, true /* useLastAddress */);
assertEquals(usbAddress, newUsbAddress);
final UpstreamNetworkState wifiUpstream = buildUpstreamNetworkState(mWifiNetwork,
@@ -257,7 +265,7 @@
when(mPrivateAddressCoordinator.getRandomInt()).thenReturn(fakeHotspotSubAddr);
// - Enable hotspot with prefix 192.168.43.0/24
final LinkAddress hotspotAddr = requestDownstreamAddress(mHotspotIpServer,
- true /* useLastAddress */);
+ CONNECTIVITY_SCOPE_GLOBAL, true /* useLastAddress */);
final IpPrefix hotspotPrefix = asIpPrefix(hotspotAddr);
assertEquals("Wrong wifi prefix: ", predefinedPrefix, hotspotPrefix);
// - test mobile network with null NetworkCapabilities. Ideally this should not happen
@@ -311,21 +319,21 @@
// - Restart hotspot again and its prefix is different previous.
mPrivateAddressCoordinator.releaseDownstream(mHotspotIpServer);
final LinkAddress hotspotAddr2 = requestDownstreamAddress(mHotspotIpServer,
- true /* useLastAddress */);
+ CONNECTIVITY_SCOPE_GLOBAL, true /* useLastAddress */);
final IpPrefix hotspotPrefix2 = asIpPrefix(hotspotAddr2);
assertNotEquals(hotspotPrefix, hotspotPrefix2);
mPrivateAddressCoordinator.updateUpstreamPrefix(v4OnlyWifi);
verify(mHotspotIpServer, never()).sendMessage(IpServer.CMD_NOTIFY_PREFIX_CONFLICT);
// - Usb tethering can be enabled and its prefix is different with conflict one.
final LinkAddress usbAddr = requestDownstreamAddress(mUsbIpServer,
- true /* useLastAddress */);
+ CONNECTIVITY_SCOPE_GLOBAL, true /* useLastAddress */);
final IpPrefix usbPrefix = asIpPrefix(usbAddr);
assertNotEquals(predefinedPrefix, usbPrefix);
assertNotEquals(hotspotPrefix2, usbPrefix);
// - Disable wifi upstream, then wifi's prefix can be selected again.
mPrivateAddressCoordinator.removeUpstreamPrefix(mWifiNetwork);
final LinkAddress ethAddr = requestDownstreamAddress(mEthernetIpServer,
- true /* useLastAddress */);
+ CONNECTIVITY_SCOPE_GLOBAL, true /* useLastAddress */);
final IpPrefix ethPrefix = asIpPrefix(ethAddr);
assertEquals(predefinedPrefix, ethPrefix);
}
@@ -335,7 +343,7 @@
final int randomAddress = 0x8605; // 134.5
when(mPrivateAddressCoordinator.getRandomInt()).thenReturn(randomAddress);
final LinkAddress addr0 = requestDownstreamAddress(mHotspotIpServer,
- true /* useLastAddress */);
+ CONNECTIVITY_SCOPE_GLOBAL, true /* useLastAddress */);
// Check whether return address is prefix 192.168.0.0/16 + subAddress 0.0.134.5.
assertEquals("Wrong prefix: ", new LinkAddress("192.168.134.5/24"), addr0);
final UpstreamNetworkState wifiUpstream = buildUpstreamNetworkState(mWifiNetwork,
@@ -345,7 +353,7 @@
// Check whether return address is next prefix of 192.168.134.0/24.
final LinkAddress addr1 = requestDownstreamAddress(mHotspotIpServer,
- true /* useLastAddress */);
+ CONNECTIVITY_SCOPE_GLOBAL, true /* useLastAddress */);
assertEquals("Wrong prefix: ", new LinkAddress("192.168.135.5/24"), addr1);
final UpstreamNetworkState wifiUpstream2 = buildUpstreamNetworkState(mWifiNetwork,
new LinkAddress("192.168.149.16/19"), null,
@@ -355,7 +363,7 @@
// The conflict range is 128 ~ 159, so the address is 192.168.160.5/24.
final LinkAddress addr2 = requestDownstreamAddress(mHotspotIpServer,
- true /* useLastAddress */);
+ CONNECTIVITY_SCOPE_GLOBAL, true /* useLastAddress */);
assertEquals("Wrong prefix: ", new LinkAddress("192.168.160.5/24"), addr2);
final UpstreamNetworkState mobileUpstream = buildUpstreamNetworkState(mMobileNetwork,
new LinkAddress("192.168.129.53/18"), null,
@@ -370,7 +378,7 @@
// The conflict range are 128 ~ 159 and 159 ~ 191, so the address is 192.168.192.5/24.
final LinkAddress addr3 = requestDownstreamAddress(mHotspotIpServer,
- true /* useLastAddress */);
+ CONNECTIVITY_SCOPE_GLOBAL, true /* useLastAddress */);
assertEquals("Wrong prefix: ", new LinkAddress("192.168.192.5/24"), addr3);
final UpstreamNetworkState mobileUpstream3 = buildUpstreamNetworkState(mMobileNetwork3,
new LinkAddress("192.168.188.133/17"), null,
@@ -380,7 +388,7 @@
// Conflict range: 128 ~ 255. The next available address is 192.168.0.5 because
// 192.168.134/24 ~ 192.168.255.255/24 is not available.
final LinkAddress addr4 = requestDownstreamAddress(mHotspotIpServer,
- true /* useLastAddress */);
+ CONNECTIVITY_SCOPE_GLOBAL, true /* useLastAddress */);
assertEquals("Wrong prefix: ", new LinkAddress("192.168.0.5/24"), addr4);
final UpstreamNetworkState mobileUpstream4 = buildUpstreamNetworkState(mMobileNetwork4,
new LinkAddress("192.168.3.59/21"), null,
@@ -389,7 +397,7 @@
// Conflict ranges: 128 ~ 255 and 0 ~ 7, so the address is 192.168.8.5/24.
final LinkAddress addr5 = requestDownstreamAddress(mHotspotIpServer,
- true /* useLastAddress */);
+ CONNECTIVITY_SCOPE_GLOBAL, true /* useLastAddress */);
assertEquals("Wrong prefix: ", new LinkAddress("192.168.8.5/24"), addr5);
final UpstreamNetworkState mobileUpstream5 = buildUpstreamNetworkState(mMobileNetwork5,
new LinkAddress("192.168.68.43/21"), null,
@@ -399,7 +407,7 @@
// Update an upstream that does *not* conflict, check whether return the same address
// 192.168.5/24.
final LinkAddress addr6 = requestDownstreamAddress(mHotspotIpServer,
- true /* useLastAddress */);
+ CONNECTIVITY_SCOPE_GLOBAL, true /* useLastAddress */);
assertEquals("Wrong prefix: ", new LinkAddress("192.168.8.5/24"), addr6);
final UpstreamNetworkState mobileUpstream6 = buildUpstreamNetworkState(mMobileNetwork6,
new LinkAddress("192.168.10.97/21"), null,
@@ -408,7 +416,7 @@
// Conflict ranges: 0 ~ 15 and 128 ~ 255, so the address is 192.168.16.5/24.
final LinkAddress addr7 = requestDownstreamAddress(mHotspotIpServer,
- true /* useLastAddress */);
+ CONNECTIVITY_SCOPE_GLOBAL, true /* useLastAddress */);
assertEquals("Wrong prefix: ", new LinkAddress("192.168.16.5/24"), addr7);
final UpstreamNetworkState mobileUpstream7 = buildUpstreamNetworkState(mMobileNetwork6,
new LinkAddress("192.168.0.0/17"), null,
@@ -417,7 +425,7 @@
// Choose prefix from next range(172.16.0.0/12) when no available prefix in 192.168.0.0/16.
final LinkAddress addr8 = requestDownstreamAddress(mHotspotIpServer,
- true /* useLastAddress */);
+ CONNECTIVITY_SCOPE_GLOBAL, true /* useLastAddress */);
assertEquals("Wrong prefix: ", new LinkAddress("172.16.134.5/24"), addr8);
}
@@ -426,7 +434,7 @@
final int randomAddress = 0x1f2b2a; // 31.43.42
when(mPrivateAddressCoordinator.getRandomInt()).thenReturn(randomAddress);
final LinkAddress classC1 = requestDownstreamAddress(mHotspotIpServer,
- true /* useLastAddress */);
+ CONNECTIVITY_SCOPE_GLOBAL, true /* useLastAddress */);
// Check whether return address is prefix 192.168.0.0/16 + subAddress 0.0.43.42.
assertEquals("Wrong prefix: ", new LinkAddress("192.168.43.42/24"), classC1);
final UpstreamNetworkState wifiUpstream = buildUpstreamNetworkState(mWifiNetwork,
@@ -437,7 +445,7 @@
// Check whether return address is next address of prefix 192.168.128.0/17.
final LinkAddress classC2 = requestDownstreamAddress(mHotspotIpServer,
- true /* useLastAddress */);
+ CONNECTIVITY_SCOPE_GLOBAL, true /* useLastAddress */);
assertEquals("Wrong prefix: ", new LinkAddress("192.168.128.42/24"), classC2);
final UpstreamNetworkState mobileUpstream = buildUpstreamNetworkState(mMobileNetwork,
new LinkAddress("192.1.2.3/8"), null,
@@ -447,7 +455,7 @@
// Check whether return address is under prefix 172.16.0.0/12.
final LinkAddress classB1 = requestDownstreamAddress(mHotspotIpServer,
- true /* useLastAddress */);
+ CONNECTIVITY_SCOPE_GLOBAL, true /* useLastAddress */);
assertEquals("Wrong prefix: ", new LinkAddress("172.31.43.42/24"), classB1);
final UpstreamNetworkState mobileUpstream2 = buildUpstreamNetworkState(mMobileNetwork2,
new LinkAddress("172.28.123.100/14"), null,
@@ -458,12 +466,12 @@
// 172.28.0.0 ~ 172.31.255.255 is not available.
// Check whether return address is next address of prefix 172.16.0.0/14.
final LinkAddress classB2 = requestDownstreamAddress(mHotspotIpServer,
- true /* useLastAddress */);
+ CONNECTIVITY_SCOPE_GLOBAL, true /* useLastAddress */);
assertEquals("Wrong prefix: ", new LinkAddress("172.16.0.42/24"), classB2);
// Check whether new downstream is next address of address 172.16.0.42/24.
final LinkAddress classB3 = requestDownstreamAddress(mUsbIpServer,
- true /* useLastAddress */);
+ CONNECTIVITY_SCOPE_GLOBAL, true /* useLastAddress */);
assertEquals("Wrong prefix: ", new LinkAddress("172.16.1.42/24"), classB3);
final UpstreamNetworkState mobileUpstream3 = buildUpstreamNetworkState(mMobileNetwork3,
new LinkAddress("172.16.0.1/24"), null,
@@ -474,7 +482,7 @@
// Check whether return address is next address of prefix 172.16.1.42/24.
final LinkAddress classB4 = requestDownstreamAddress(mHotspotIpServer,
- true /* useLastAddress */);
+ CONNECTIVITY_SCOPE_GLOBAL, true /* useLastAddress */);
assertEquals("Wrong prefix: ", new LinkAddress("172.16.2.42/24"), classB4);
final UpstreamNetworkState mobileUpstream4 = buildUpstreamNetworkState(mMobileNetwork4,
new LinkAddress("172.16.0.1/13"), null,
@@ -485,11 +493,11 @@
// Check whether return address is next address of prefix 172.16.0.1/13.
final LinkAddress classB5 = requestDownstreamAddress(mHotspotIpServer,
- true /* useLastAddress */);
+ CONNECTIVITY_SCOPE_GLOBAL, true /* useLastAddress */);
assertEquals("Wrong prefix: ", new LinkAddress("172.24.0.42/24"), classB5);
// Check whether return address is next address of prefix 172.24.0.42/24.
final LinkAddress classB6 = requestDownstreamAddress(mUsbIpServer,
- true /* useLastAddress */);
+ CONNECTIVITY_SCOPE_GLOBAL, true /* useLastAddress */);
assertEquals("Wrong prefix: ", new LinkAddress("172.24.1.42/24"), classB6);
final UpstreamNetworkState mobileUpstream5 = buildUpstreamNetworkState(mMobileNetwork5,
new LinkAddress("172.24.0.1/12"), null,
@@ -500,11 +508,11 @@
// Check whether return address is prefix 10.0.0.0/8 + subAddress 0.31.43.42.
final LinkAddress classA1 = requestDownstreamAddress(mHotspotIpServer,
- true /* useLastAddress */);
+ CONNECTIVITY_SCOPE_GLOBAL, true /* useLastAddress */);
assertEquals("Wrong prefix: ", new LinkAddress("10.31.43.42/24"), classA1);
// Check whether new downstream is next address of address 10.31.43.42/24.
final LinkAddress classA2 = requestDownstreamAddress(mUsbIpServer,
- true /* useLastAddress */);
+ CONNECTIVITY_SCOPE_GLOBAL, true /* useLastAddress */);
assertEquals("Wrong prefix: ", new LinkAddress("10.31.44.42/24"), classA2);
}
@@ -524,7 +532,7 @@
private void assertReseveredWifiP2pPrefix() throws Exception {
LinkAddress address = requestDownstreamAddress(mHotspotIpServer,
- true /* useLastAddress */);
+ CONNECTIVITY_SCOPE_GLOBAL, true /* useLastAddress */);
final IpPrefix hotspotPrefix = asIpPrefix(address);
final IpPrefix legacyWifiP2pPrefix = asIpPrefix(mLegacyWifiP2pAddress);
assertNotEquals(legacyWifiP2pPrefix, hotspotPrefix);
@@ -544,8 +552,23 @@
// If #shouldEnableWifiP2pDedicatedIp() is enabled, wifi P2P gets the configured address.
LinkAddress address = requestDownstreamAddress(mWifiP2pIpServer,
- true /* useLastAddress */);
+ CONNECTIVITY_SCOPE_LOCAL, true /* useLastAddress */);
assertEquals(mLegacyWifiP2pAddress, address);
mPrivateAddressCoordinator.releaseDownstream(mWifiP2pIpServer);
}
+
+ @Test
+ public void testEnableSapAndLohsConcurrently() throws Exception {
+ // 0x2b05 -> 43.5, 0x8605 -> 134.5
+ when(mPrivateAddressCoordinator.getRandomInt()).thenReturn(0x2b05, 0x8605);
+
+ final LinkAddress hotspotAddress = requestDownstreamAddress(mHotspotIpServer,
+ CONNECTIVITY_SCOPE_GLOBAL, true /* useLastAddress */);
+ assertEquals("Wrong hotspot prefix: ", new LinkAddress("192.168.43.5/24"), hotspotAddress);
+
+ final LinkAddress localHotspotAddress = requestDownstreamAddress(mLocalHotspotIpServer,
+ CONNECTIVITY_SCOPE_LOCAL, true /* useLastAddress */);
+ assertEquals("Wrong local hotspot prefix: ", new LinkAddress("192.168.134.5/24"),
+ localHotspotAddress);
+ }
}
diff --git a/Tethering/tests/unit/src/com/android/networkstack/tethering/TetheringConfigurationTest.java b/Tethering/tests/unit/src/com/android/networkstack/tethering/TetheringConfigurationTest.java
index f662c02..3382af8 100644
--- a/Tethering/tests/unit/src/com/android/networkstack/tethering/TetheringConfigurationTest.java
+++ b/Tethering/tests/unit/src/com/android/networkstack/tethering/TetheringConfigurationTest.java
@@ -21,14 +21,13 @@
import static android.net.ConnectivityManager.TYPE_MOBILE_DUN;
import static android.net.ConnectivityManager.TYPE_MOBILE_HIPRI;
import static android.net.ConnectivityManager.TYPE_WIFI;
-import static android.provider.DeviceConfig.NAMESPACE_CONNECTIVITY;
import static android.telephony.CarrierConfigManager.KEY_CARRIER_CONFIG_APPLIED_BOOL;
import static android.telephony.CarrierConfigManager.KEY_REQUIRE_ENTITLEMENT_CHECKS_BOOL;
import static android.telephony.SubscriptionManager.INVALID_SUBSCRIPTION_ID;
-import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn;
-import static com.android.dx.mockito.inline.extended.ExtendedMockito.mockitoSession;
import static com.android.networkstack.apishim.ConstantsShim.KEY_CARRIER_SUPPORTS_TETHERING_BOOL;
+import static com.android.networkstack.tethering.TetheringConfiguration.OVERRIDE_TETHER_ENABLE_BPF_OFFLOAD;
+import static com.android.networkstack.tethering.TetheringConfiguration.TETHER_ENABLE_LEGACY_DHCP_SERVER;
import static com.android.networkstack.tethering.TetheringConfiguration.TETHER_FORCE_USB_FUNCTIONS;
import static com.android.networkstack.tethering.TetheringConfiguration.TETHER_USB_NCM_FUNCTION;
import static com.android.networkstack.tethering.TetheringConfiguration.TETHER_USB_RNDIS_FUNCTION;
@@ -39,6 +38,7 @@
import static org.junit.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.Matchers.eq;
+import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.when;
import android.content.Context;
@@ -49,12 +49,13 @@
import android.content.res.Resources;
import android.os.Build;
import android.os.PersistableBundle;
-import android.provider.DeviceConfig;
import android.provider.Settings;
import android.telephony.CarrierConfigManager;
import android.telephony.TelephonyManager;
import android.test.mock.MockContentResolver;
+import android.util.ArrayMap;
+import androidx.annotation.NonNull;
import androidx.test.filters.SmallTest;
import androidx.test.runner.AndroidJUnit4;
@@ -73,8 +74,7 @@
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
-import org.mockito.MockitoSession;
-import org.mockito.quality.Strictness;
+import org.mockito.MockitoAnnotations;
import java.util.Arrays;
import java.util.Iterator;
@@ -102,13 +102,13 @@
@Mock private ModuleInfo mMi;
private Context mMockContext;
private boolean mHasTelephonyManager;
- private MockitoSession mMockingSession;
private MockContentResolver mContentResolver;
private final PersistableBundle mCarrierConfig = new PersistableBundle();
+ private final MockDependencies mDeps = new MockDependencies();
private class MockTetheringConfiguration extends TetheringConfiguration {
MockTetheringConfiguration(Context ctx, SharedLog log, int id) {
- super(ctx, log, id);
+ super(ctx, log, id, mDeps);
}
@Override
@@ -151,19 +151,43 @@
}
}
+ private static class MockDependencies extends TetheringConfiguration.Dependencies {
+ private ArrayMap<String, Boolean> mMockFlags = new ArrayMap<>();
+
+ @Override
+ boolean isFeatureEnabled(@NonNull Context context, @NonNull String namespace,
+ @NonNull String name, @NonNull String moduleName, boolean defaultEnabled) {
+ return isMockFlagEnabled(name, defaultEnabled);
+ }
+
+ @Override
+ boolean getDeviceConfigBoolean(@NonNull String namespace, @NonNull String name,
+ boolean defaultValue) {
+ // Flags should use isFeatureEnabled instead of getBoolean; see comments in
+ // DeviceConfigUtils. getBoolean should only be used for the two legacy flags below.
+ assertTrue(OVERRIDE_TETHER_ENABLE_BPF_OFFLOAD.equals(name)
+ || TETHER_ENABLE_LEGACY_DHCP_SERVER.equals(name));
+
+ // Use the same mocking strategy as isFeatureEnabled for testing
+ return isMockFlagEnabled(name, defaultValue);
+ }
+
+ private boolean isMockFlagEnabled(@NonNull String name, boolean defaultEnabled) {
+ final Boolean flag = mMockFlags.getOrDefault(name, defaultEnabled);
+ // Value in the map can also be null
+ if (flag != null) return flag;
+ return defaultEnabled;
+ }
+
+ void setFeatureEnabled(@NonNull String flag, Boolean enabled) {
+ mMockFlags.put(flag, enabled);
+ }
+ }
+
@Before
public void setUp() throws Exception {
- // TODO: use a dependencies class instead of mock statics.
- mMockingSession = mockitoSession()
- .initMocks(this)
- .mockStatic(DeviceConfig.class)
- .strictness(Strictness.WARN)
- .startMocking();
- DeviceConfigUtils.resetPackageVersionCacheForTest();
- doReturn(null).when(
- () -> DeviceConfig.getProperty(eq(NAMESPACE_CONNECTIVITY),
- eq(TetheringConfiguration.TETHER_ENABLE_LEGACY_DHCP_SERVER)));
- setTetherForceUpstreamAutomaticFlagVersion(null);
+ MockitoAnnotations.initMocks(this);
+ setTetherForceUpstreamAutomaticFlagEnabled(null);
final PackageInfo pi = new PackageInfo();
pi.setLongVersionCode(TEST_PACKAGE_VERSION);
@@ -202,7 +226,6 @@
@After
public void tearDown() throws Exception {
- mMockingSession.finishMocking();
DeviceConfigUtils.resetPackageVersionCacheForTest();
// Call {@link #clearSettingsProvider()} before and after using FakeSettingsProvider.
FakeSettingsProvider.clearSettingsProvider();
@@ -211,7 +234,7 @@
private TetheringConfiguration getTetheringConfiguration(int... legacyTetherUpstreamTypes) {
when(mResources.getIntArray(R.array.config_tether_upstream_types)).thenReturn(
legacyTetherUpstreamTypes);
- return new TetheringConfiguration(mMockContext, mLog, INVALID_SUBSCRIPTION_ID);
+ return new TetheringConfiguration(mMockContext, mLog, INVALID_SUBSCRIPTION_ID, mDeps);
}
@Test
@@ -297,7 +320,7 @@
when(mTelephonyManager.isTetheringApnRequired()).thenReturn(false);
final TetheringConfiguration cfg = new TetheringConfiguration(
- mMockContext, mLog, INVALID_SUBSCRIPTION_ID);
+ mMockContext, mLog, INVALID_SUBSCRIPTION_ID, mDeps);
final Iterator<Integer> upstreamIterator = cfg.preferredUpstreamIfaceTypes.iterator();
assertTrue(upstreamIterator.hasNext());
assertEquals(TYPE_ETHERNET, upstreamIterator.next().intValue());
@@ -320,7 +343,7 @@
when(mTelephonyManager.isTetheringApnRequired()).thenReturn(false);
final TetheringConfiguration cfg = new TetheringConfiguration(
- mMockContext, mLog, INVALID_SUBSCRIPTION_ID);
+ mMockContext, mLog, INVALID_SUBSCRIPTION_ID, mDeps);
final Iterator<Integer> upstreamIterator = cfg.preferredUpstreamIfaceTypes.iterator();
assertTrue(upstreamIterator.hasNext());
assertEquals(TYPE_ETHERNET, upstreamIterator.next().intValue());
@@ -338,7 +361,7 @@
when(mTelephonyManager.isTetheringApnRequired()).thenReturn(false);
final TetheringConfiguration cfg = new TetheringConfiguration(
- mMockContext, mLog, INVALID_SUBSCRIPTION_ID);
+ mMockContext, mLog, INVALID_SUBSCRIPTION_ID, mDeps);
final Iterator<Integer> upstreamIterator = cfg.preferredUpstreamIfaceTypes.iterator();
assertTrue(upstreamIterator.hasNext());
assertEquals(TYPE_WIFI, upstreamIterator.next().intValue());
@@ -350,27 +373,26 @@
}
private void initializeBpfOffloadConfiguration(
- final boolean fromRes, final String fromDevConfig) {
+ final boolean fromRes, final Boolean fromDevConfig) {
when(mResources.getBoolean(R.bool.config_tether_enable_bpf_offload)).thenReturn(fromRes);
- doReturn(fromDevConfig).when(
- () -> DeviceConfig.getProperty(eq(NAMESPACE_CONNECTIVITY),
- eq(TetheringConfiguration.OVERRIDE_TETHER_ENABLE_BPF_OFFLOAD)));
+ mDeps.setFeatureEnabled(
+ TetheringConfiguration.OVERRIDE_TETHER_ENABLE_BPF_OFFLOAD, fromDevConfig);
}
@Test
public void testBpfOffloadEnabledByResource() {
initializeBpfOffloadConfiguration(true, null /* unset */);
final TetheringConfiguration enableByRes =
- new TetheringConfiguration(mMockContext, mLog, INVALID_SUBSCRIPTION_ID);
+ new TetheringConfiguration(mMockContext, mLog, INVALID_SUBSCRIPTION_ID, mDeps);
assertTrue(enableByRes.isBpfOffloadEnabled());
}
@Test
public void testBpfOffloadEnabledByDeviceConfigOverride() {
for (boolean res : new boolean[]{true, false}) {
- initializeBpfOffloadConfiguration(res, "true");
+ initializeBpfOffloadConfiguration(res, true);
final TetheringConfiguration enableByDevConOverride =
- new TetheringConfiguration(mMockContext, mLog, INVALID_SUBSCRIPTION_ID);
+ new TetheringConfiguration(mMockContext, mLog, INVALID_SUBSCRIPTION_ID, mDeps);
assertTrue(enableByDevConOverride.isBpfOffloadEnabled());
}
}
@@ -379,16 +401,16 @@
public void testBpfOffloadDisabledByResource() {
initializeBpfOffloadConfiguration(false, null /* unset */);
final TetheringConfiguration disableByRes =
- new TetheringConfiguration(mMockContext, mLog, INVALID_SUBSCRIPTION_ID);
+ new TetheringConfiguration(mMockContext, mLog, INVALID_SUBSCRIPTION_ID, mDeps);
assertFalse(disableByRes.isBpfOffloadEnabled());
}
@Test
public void testBpfOffloadDisabledByDeviceConfigOverride() {
for (boolean res : new boolean[]{true, false}) {
- initializeBpfOffloadConfiguration(res, "false");
+ initializeBpfOffloadConfiguration(res, false);
final TetheringConfiguration disableByDevConOverride =
- new TetheringConfiguration(mMockContext, mLog, INVALID_SUBSCRIPTION_ID);
+ new TetheringConfiguration(mMockContext, mLog, INVALID_SUBSCRIPTION_ID, mDeps);
assertFalse(disableByDevConOverride.isBpfOffloadEnabled());
}
}
@@ -397,22 +419,18 @@
public void testNewDhcpServerDisabled() {
when(mResources.getBoolean(R.bool.config_tether_enable_legacy_dhcp_server)).thenReturn(
true);
- doReturn("false").when(
- () -> DeviceConfig.getProperty(eq(NAMESPACE_CONNECTIVITY),
- eq(TetheringConfiguration.TETHER_ENABLE_LEGACY_DHCP_SERVER)));
+ mDeps.setFeatureEnabled(TetheringConfiguration.TETHER_ENABLE_LEGACY_DHCP_SERVER, false);
final TetheringConfiguration enableByRes =
- new TetheringConfiguration(mMockContext, mLog, INVALID_SUBSCRIPTION_ID);
+ new TetheringConfiguration(mMockContext, mLog, INVALID_SUBSCRIPTION_ID, mDeps);
assertTrue(enableByRes.useLegacyDhcpServer());
when(mResources.getBoolean(R.bool.config_tether_enable_legacy_dhcp_server)).thenReturn(
false);
- doReturn("true").when(
- () -> DeviceConfig.getProperty(eq(NAMESPACE_CONNECTIVITY),
- eq(TetheringConfiguration.TETHER_ENABLE_LEGACY_DHCP_SERVER)));
+ mDeps.setFeatureEnabled(TetheringConfiguration.TETHER_ENABLE_LEGACY_DHCP_SERVER, true);
final TetheringConfiguration enableByDevConfig =
- new TetheringConfiguration(mMockContext, mLog, INVALID_SUBSCRIPTION_ID);
+ new TetheringConfiguration(mMockContext, mLog, INVALID_SUBSCRIPTION_ID, mDeps);
assertTrue(enableByDevConfig.useLegacyDhcpServer());
}
@@ -420,12 +438,10 @@
public void testNewDhcpServerEnabled() {
when(mResources.getBoolean(R.bool.config_tether_enable_legacy_dhcp_server)).thenReturn(
false);
- doReturn("false").when(
- () -> DeviceConfig.getProperty(eq(NAMESPACE_CONNECTIVITY),
- eq(TetheringConfiguration.TETHER_ENABLE_LEGACY_DHCP_SERVER)));
+ mDeps.setFeatureEnabled(TetheringConfiguration.TETHER_ENABLE_LEGACY_DHCP_SERVER, false);
final TetheringConfiguration cfg =
- new TetheringConfiguration(mMockContext, mLog, INVALID_SUBSCRIPTION_ID);
+ new TetheringConfiguration(mMockContext, mLog, INVALID_SUBSCRIPTION_ID, mDeps);
assertFalse(cfg.useLegacyDhcpServer());
}
@@ -433,7 +449,7 @@
@Test
public void testOffloadIntervalByResource() {
final TetheringConfiguration intervalByDefault =
- new TetheringConfiguration(mMockContext, mLog, INVALID_SUBSCRIPTION_ID);
+ new TetheringConfiguration(mMockContext, mLog, INVALID_SUBSCRIPTION_ID, mDeps);
assertEquals(TetheringConfiguration.DEFAULT_TETHER_OFFLOAD_POLL_INTERVAL_MS,
intervalByDefault.getOffloadPollInterval());
@@ -442,7 +458,7 @@
when(mResources.getInteger(R.integer.config_tether_offload_poll_interval)).thenReturn(
override);
final TetheringConfiguration overrideByRes =
- new TetheringConfiguration(mMockContext, mLog, INVALID_SUBSCRIPTION_ID);
+ new TetheringConfiguration(mMockContext, mLog, INVALID_SUBSCRIPTION_ID, mDeps);
assertEquals(override, overrideByRes.getOffloadPollInterval());
}
}
@@ -451,7 +467,7 @@
public void testGetResourcesBySubId() {
setUpResourceForSubId();
final TetheringConfiguration cfg = new TetheringConfiguration(
- mMockContext, mLog, INVALID_SUBSCRIPTION_ID);
+ mMockContext, mLog, INVALID_SUBSCRIPTION_ID, mDeps);
assertTrue(cfg.provisioningApp.length == 0);
final int anyValidSubId = 1;
final MockTetheringConfiguration mockCfg =
@@ -493,7 +509,7 @@
mockService(Context.CARRIER_CONFIG_SERVICE,
CarrierConfigManager.class, null);
final TetheringConfiguration cfg = new TetheringConfiguration(
- mMockContext, mLog, INVALID_SUBSCRIPTION_ID);
+ mMockContext, mLog, INVALID_SUBSCRIPTION_ID, mDeps);
assertTrue(cfg.isCarrierSupportTethering);
assertTrue(cfg.isCarrierConfigAffirmsEntitlementCheckRequired);
@@ -506,7 +522,7 @@
CarrierConfigManager.class, mCarrierConfigManager);
when(mCarrierConfigManager.getConfigForSubId(anyInt())).thenReturn(null);
final TetheringConfiguration cfg = new TetheringConfiguration(
- mMockContext, mLog, INVALID_SUBSCRIPTION_ID);
+ mMockContext, mLog, INVALID_SUBSCRIPTION_ID, mDeps);
assertTrue(cfg.isCarrierSupportTethering);
assertTrue(cfg.isCarrierConfigAffirmsEntitlementCheckRequired);
@@ -521,7 +537,7 @@
mCarrierConfig.putBoolean(KEY_CARRIER_SUPPORTS_TETHERING_BOOL, false);
when(mCarrierConfigManager.getConfigForSubId(anyInt())).thenReturn(mCarrierConfig);
final TetheringConfiguration cfg = new TetheringConfiguration(
- mMockContext, mLog, INVALID_SUBSCRIPTION_ID);
+ mMockContext, mLog, INVALID_SUBSCRIPTION_ID, mDeps);
if (SdkLevel.isAtLeastT()) {
assertFalse(cfg.isCarrierSupportTethering);
@@ -535,13 +551,13 @@
@Test
public void testEnableLegacyWifiP2PAddress() throws Exception {
final TetheringConfiguration defaultCfg = new TetheringConfiguration(
- mMockContext, mLog, INVALID_SUBSCRIPTION_ID);
+ mMockContext, mLog, INVALID_SUBSCRIPTION_ID, mDeps);
assertFalse(defaultCfg.shouldEnableWifiP2pDedicatedIp());
when(mResources.getBoolean(R.bool.config_tether_enable_legacy_wifi_p2p_dedicated_ip))
.thenReturn(true);
final TetheringConfiguration testCfg = new TetheringConfiguration(
- mMockContext, mLog, INVALID_SUBSCRIPTION_ID);
+ mMockContext, mLog, INVALID_SUBSCRIPTION_ID, mDeps);
assertTrue(testCfg.shouldEnableWifiP2pDedicatedIp());
}
@@ -576,16 +592,13 @@
public void testChooseUpstreamAutomatically_FlagOverride() throws Exception {
when(mResources.getBoolean(R.bool.config_tether_upstream_automatic))
.thenReturn(false);
- setTetherForceUpstreamAutomaticFlagVersion(TEST_PACKAGE_VERSION - 1);
- assertTrue(DeviceConfigUtils.isFeatureEnabled(mMockContext, NAMESPACE_CONNECTIVITY,
- TetheringConfiguration.TETHER_FORCE_UPSTREAM_AUTOMATIC_VERSION, APEX_NAME, false));
-
+ setTetherForceUpstreamAutomaticFlagEnabled(true);
assertChooseUpstreamAutomaticallyIs(true);
- setTetherForceUpstreamAutomaticFlagVersion(0L);
+ setTetherForceUpstreamAutomaticFlagEnabled(null);
assertChooseUpstreamAutomaticallyIs(false);
- setTetherForceUpstreamAutomaticFlagVersion(Long.MAX_VALUE);
+ setTetherForceUpstreamAutomaticFlagEnabled(false);
assertChooseUpstreamAutomaticallyIs(false);
}
@@ -593,7 +606,7 @@
public void testChooseUpstreamAutomatically_FlagOverrideOnSAndT() throws Exception {
when(mResources.getBoolean(R.bool.config_tether_upstream_automatic))
.thenReturn(false);
- setTetherForceUpstreamAutomaticFlagVersion(TEST_PACKAGE_VERSION - 1);
+ setTetherForceUpstreamAutomaticFlagEnabled(true);
assertChooseUpstreamAutomaticallyIs(false);
}
@@ -604,28 +617,24 @@
// TETHER_FORCE_UPSTREAM_AUTOMATIC_VERSION is.
when(mResources.getBoolean(R.bool.config_tether_upstream_automatic))
.thenReturn(false);
- setTetherForceUpstreamAutomaticFlagVersion(TEST_PACKAGE_VERSION - 1);
- assertTrue(DeviceConfigUtils.isFeatureEnabled(mMockContext, NAMESPACE_CONNECTIVITY,
- TetheringConfiguration.TETHER_FORCE_UPSTREAM_AUTOMATIC_VERSION, APEX_NAME, false));
-
+ setTetherForceUpstreamAutomaticFlagEnabled(true);
assertChooseUpstreamAutomaticallyIs(true);
- setTetherForceUpstreamAutomaticFlagVersion(0L);
+ setTetherForceUpstreamAutomaticFlagEnabled(null);
assertChooseUpstreamAutomaticallyIs(true);
- setTetherForceUpstreamAutomaticFlagVersion(Long.MAX_VALUE);
+ setTetherForceUpstreamAutomaticFlagEnabled(false);
assertChooseUpstreamAutomaticallyIs(true);
}
- private void setTetherForceUpstreamAutomaticFlagVersion(Long version) {
- doReturn(version == null ? null : Long.toString(version)).when(
- () -> DeviceConfig.getProperty(eq(NAMESPACE_CONNECTIVITY),
- eq(TetheringConfiguration.TETHER_FORCE_UPSTREAM_AUTOMATIC_VERSION)));
+ private void setTetherForceUpstreamAutomaticFlagEnabled(Boolean enabled) {
+ mDeps.setFeatureEnabled(
+ TetheringConfiguration.TETHER_FORCE_UPSTREAM_AUTOMATIC_VERSION, enabled);
}
private void assertChooseUpstreamAutomaticallyIs(boolean value) {
- assertEquals(value, new TetheringConfiguration(mMockContext, mLog, INVALID_SUBSCRIPTION_ID)
- .chooseUpstreamAutomatically);
+ assertEquals(value, new TetheringConfiguration(
+ mMockContext, mLog, INVALID_SUBSCRIPTION_ID, mDeps).chooseUpstreamAutomatically);
}
@Test
@@ -654,7 +663,7 @@
private void assertIsUsingNcm(boolean expected) {
final TetheringConfiguration cfg =
- new TetheringConfiguration(mMockContext, mLog, INVALID_SUBSCRIPTION_ID);
+ new TetheringConfiguration(mMockContext, mLog, INVALID_SUBSCRIPTION_ID, mDeps);
assertEquals(expected, cfg.isUsingNcm());
}
@@ -704,7 +713,7 @@
private void assertUsbAndNcmRegexs(final String[] usbRegexs, final String[] ncmRegexs) {
final TetheringConfiguration cfg =
- new TetheringConfiguration(mMockContext, mLog, INVALID_SUBSCRIPTION_ID);
+ new TetheringConfiguration(mMockContext, mLog, INVALID_SUBSCRIPTION_ID, mDeps);
assertArrayEquals(usbRegexs, cfg.tetherableUsbRegexs);
assertArrayEquals(ncmRegexs, cfg.tetherableNcmRegexs);
}
@@ -716,28 +725,28 @@
final int defaultSubnetPrefixLength = 0;
final TetheringConfiguration defaultCfg =
- new TetheringConfiguration(mMockContext, mLog, INVALID_SUBSCRIPTION_ID);
+ new TetheringConfiguration(mMockContext, mLog, INVALID_SUBSCRIPTION_ID, mDeps);
assertEquals(defaultSubnetPrefixLength, defaultCfg.getP2pLeasesSubnetPrefixLength());
final int prefixLengthTooSmall = -1;
when(mResources.getInteger(R.integer.config_p2p_leases_subnet_prefix_length)).thenReturn(
prefixLengthTooSmall);
final TetheringConfiguration tooSmallCfg =
- new TetheringConfiguration(mMockContext, mLog, INVALID_SUBSCRIPTION_ID);
+ new TetheringConfiguration(mMockContext, mLog, INVALID_SUBSCRIPTION_ID, mDeps);
assertEquals(defaultSubnetPrefixLength, tooSmallCfg.getP2pLeasesSubnetPrefixLength());
final int prefixLengthTooLarge = 31;
when(mResources.getInteger(R.integer.config_p2p_leases_subnet_prefix_length)).thenReturn(
prefixLengthTooLarge);
final TetheringConfiguration tooLargeCfg =
- new TetheringConfiguration(mMockContext, mLog, INVALID_SUBSCRIPTION_ID);
+ new TetheringConfiguration(mMockContext, mLog, INVALID_SUBSCRIPTION_ID, mDeps);
assertEquals(defaultSubnetPrefixLength, tooLargeCfg.getP2pLeasesSubnetPrefixLength());
final int p2pLeasesSubnetPrefixLength = 27;
when(mResources.getInteger(R.integer.config_p2p_leases_subnet_prefix_length)).thenReturn(
p2pLeasesSubnetPrefixLength);
final TetheringConfiguration p2pCfg =
- new TetheringConfiguration(mMockContext, mLog, INVALID_SUBSCRIPTION_ID);
+ new TetheringConfiguration(mMockContext, mLog, INVALID_SUBSCRIPTION_ID, mDeps);
assertEquals(p2pLeasesSubnetPrefixLength, p2pCfg.getP2pLeasesSubnetPrefixLength());
}
}
diff --git a/Tethering/tests/unit/src/com/android/networkstack/tethering/TetheringNotificationUpdaterTest.kt b/Tethering/tests/unit/src/com/android/networkstack/tethering/TetheringNotificationUpdaterTest.kt
index 75c819b..ac3d713 100644
--- a/Tethering/tests/unit/src/com/android/networkstack/tethering/TetheringNotificationUpdaterTest.kt
+++ b/Tethering/tests/unit/src/com/android/networkstack/tethering/TetheringNotificationUpdaterTest.kt
@@ -156,6 +156,7 @@
@After
fun tearDown() {
fakeTetheringThread.quitSafely()
+ fakeTetheringThread.join()
}
private fun verifyActivityPendingIntent(intent: Intent, flags: Int) {
diff --git a/Tethering/tests/unit/src/com/android/networkstack/tethering/TetheringTest.java b/Tethering/tests/unit/src/com/android/networkstack/tethering/TetheringTest.java
index 79590b7..9c6904d 100644
--- a/Tethering/tests/unit/src/com/android/networkstack/tethering/TetheringTest.java
+++ b/Tethering/tests/unit/src/com/android/networkstack/tethering/TetheringTest.java
@@ -68,7 +68,7 @@
import static com.android.modules.utils.build.SdkLevel.isAtLeastT;
import static com.android.net.module.util.Inet4AddressUtils.inet4AddressToIntHTH;
import static com.android.net.module.util.Inet4AddressUtils.intToInet4AddressHTH;
-import static com.android.networkstack.tethering.OffloadHardwareInterface.OFFLOAD_HAL_VERSION_1_0;
+import static com.android.networkstack.tethering.OffloadHardwareInterface.OFFLOAD_HAL_VERSION_HIDL_1_0;
import static com.android.networkstack.tethering.OffloadHardwareInterface.OFFLOAD_HAL_VERSION_NONE;
import static com.android.networkstack.tethering.TestConnectivityManager.BROADCAST_FIRST;
import static com.android.networkstack.tethering.TestConnectivityManager.CALLBACKS_FIRST;
@@ -240,6 +240,7 @@
private static final String TEST_RNDIS_IFNAME = "test_rndis0";
private static final String TEST_WIFI_IFNAME = "test_wlan0";
private static final String TEST_WLAN_IFNAME = "test_wlan1";
+ private static final String TEST_WLAN2_IFNAME = "test_wlan2";
private static final String TEST_P2P_IFNAME = "test_p2p-p2p0-0";
private static final String TEST_NCM_IFNAME = "test_ncm0";
private static final String TEST_ETH_IFNAME = "test_eth0";
@@ -392,6 +393,7 @@
assertTrue("Non-mocked interface " + ifName,
ifName.equals(TEST_RNDIS_IFNAME)
|| ifName.equals(TEST_WLAN_IFNAME)
+ || ifName.equals(TEST_WLAN2_IFNAME)
|| ifName.equals(TEST_WIFI_IFNAME)
|| ifName.equals(TEST_MOBILE_IFNAME)
|| ifName.equals(TEST_DUN_IFNAME)
@@ -400,8 +402,9 @@
|| ifName.equals(TEST_ETH_IFNAME)
|| ifName.equals(TEST_BT_IFNAME));
final String[] ifaces = new String[] {
- TEST_RNDIS_IFNAME, TEST_WLAN_IFNAME, TEST_WIFI_IFNAME, TEST_MOBILE_IFNAME,
- TEST_DUN_IFNAME, TEST_P2P_IFNAME, TEST_NCM_IFNAME, TEST_ETH_IFNAME};
+ TEST_RNDIS_IFNAME, TEST_WLAN_IFNAME, TEST_WLAN2_IFNAME, TEST_WIFI_IFNAME,
+ TEST_MOBILE_IFNAME, TEST_DUN_IFNAME, TEST_P2P_IFNAME, TEST_NCM_IFNAME,
+ TEST_ETH_IFNAME};
return new InterfaceParams(ifName,
CollectionUtils.indexOf(ifaces, ifName) + IFINDEX_OFFSET,
MacAddress.ALL_ZEROS_ADDRESS);
@@ -428,7 +431,7 @@
public class MockTetheringDependencies extends TetheringDependencies {
StateMachine mUpstreamNetworkMonitorSM;
- ArrayList<IpServer> mIpv6CoordinatorNotifyList;
+ ArrayList<IpServer> mAllDownstreams;
@Override
public BpfCoordinator getBpfCoordinator(
@@ -463,7 +466,7 @@
@Override
public IPv6TetheringCoordinator getIPv6TetheringCoordinator(
ArrayList<IpServer> notifyList, SharedLog log) {
- mIpv6CoordinatorNotifyList = notifyList;
+ mAllDownstreams = notifyList;
return mIPv6TetheringCoordinator;
}
@@ -642,15 +645,14 @@
false);
when(mNetd.interfaceGetList())
.thenReturn(new String[] {
- TEST_MOBILE_IFNAME, TEST_WLAN_IFNAME, TEST_RNDIS_IFNAME, TEST_P2P_IFNAME,
- TEST_NCM_IFNAME, TEST_ETH_IFNAME, TEST_BT_IFNAME});
+ TEST_MOBILE_IFNAME, TEST_WLAN_IFNAME, TEST_WLAN2_IFNAME, TEST_RNDIS_IFNAME,
+ TEST_P2P_IFNAME, TEST_NCM_IFNAME, TEST_ETH_IFNAME, TEST_BT_IFNAME});
when(mResources.getString(R.string.config_wifi_tether_enable)).thenReturn("");
mInterfaceConfiguration = new InterfaceConfigurationParcel();
mInterfaceConfiguration.flags = new String[0];
when(mRouterAdvertisementDaemon.start())
.thenReturn(true);
- initOffloadConfiguration(true /* offloadConfig */, OFFLOAD_HAL_VERSION_1_0,
- 0 /* defaultDisabled */);
+ initOffloadConfiguration(OFFLOAD_HAL_VERSION_HIDL_1_0, 0 /* defaultDisabled */);
when(mOffloadHardwareInterface.getForwardedStats(any())).thenReturn(mForwardedStats);
mServiceContext = new TestContext(mContext);
@@ -1027,7 +1029,7 @@
*/
private void sendIPv6TetherUpdates(UpstreamNetworkState upstreamState) {
// IPv6TetheringCoordinator must have been notified of downstream
- for (IpServer ipSrv : mTetheringDependencies.mIpv6CoordinatorNotifyList) {
+ for (IpServer ipSrv : mTetheringDependencies.mAllDownstreams) {
UpstreamNetworkState ipv6OnlyState = buildMobileUpstreamState(false, true, false);
ipSrv.sendMessage(IpServer.CMD_IPV6_TETHER_UPDATE, 0, 0,
upstreamState.linkProperties.isIpv6Provisioned()
@@ -2001,6 +2003,7 @@
verify(mWifiManager).updateInterfaceIpState(
TEST_WLAN_IFNAME, WifiManager.IFACE_IP_MODE_CONFIGURATION_ERROR);
+ verify(mTetheringMetrics, times(0)).maybeUpdateUpstreamType(any());
verify(mTetheringMetrics, times(2)).updateErrorCode(eq(TETHERING_WIFI),
eq(TETHER_ERROR_INTERNAL_ERROR));
verify(mTetheringMetrics, times(2)).sendReport(eq(TETHERING_WIFI));
@@ -2345,25 +2348,15 @@
mLooper.dispatchAll();
callback.expectOffloadStatusChanged(TETHER_HARDWARE_OFFLOAD_STOPPED);
- // 1. Offload fail if no OffloadConfig.
- initOffloadConfiguration(false /* offloadConfig */, OFFLOAD_HAL_VERSION_1_0,
- 0 /* defaultDisabled */);
+ // 1. Offload fail if no IOffloadHal.
+ initOffloadConfiguration(OFFLOAD_HAL_VERSION_NONE, 0 /* defaultDisabled */);
runUsbTethering(upstreamState);
callback.expectOffloadStatusChanged(TETHER_HARDWARE_OFFLOAD_FAILED);
runStopUSBTethering();
callback.expectOffloadStatusChanged(TETHER_HARDWARE_OFFLOAD_STOPPED);
reset(mUsbManager, mIPv6TetheringCoordinator);
- // 2. Offload fail if no OffloadControl.
- initOffloadConfiguration(true /* offloadConfig */, OFFLOAD_HAL_VERSION_NONE,
- 0 /* defaultDisabled */);
- runUsbTethering(upstreamState);
- callback.expectOffloadStatusChanged(TETHER_HARDWARE_OFFLOAD_FAILED);
- runStopUSBTethering();
- callback.expectOffloadStatusChanged(TETHER_HARDWARE_OFFLOAD_STOPPED);
- reset(mUsbManager, mIPv6TetheringCoordinator);
- // 3. Offload fail if disabled by settings.
- initOffloadConfiguration(true /* offloadConfig */, OFFLOAD_HAL_VERSION_1_0,
- 1 /* defaultDisabled */);
+ // 2. Offload fail if disabled by settings.
+ initOffloadConfiguration(OFFLOAD_HAL_VERSION_HIDL_1_0, 1 /* defaultDisabled */);
runUsbTethering(upstreamState);
callback.expectOffloadStatusChanged(TETHER_HARDWARE_OFFLOAD_FAILED);
runStopUSBTethering();
@@ -2378,11 +2371,10 @@
verify(mUsbManager).setCurrentFunctions(UsbManager.FUNCTION_NONE);
}
- private void initOffloadConfiguration(final boolean offloadConfig,
- @OffloadHardwareInterface.OffloadHalVersion final int offloadControlVersion,
+ private void initOffloadConfiguration(
+ @OffloadHardwareInterface.OffloadHalVersion final int offloadHalVersion,
final int defaultDisabled) {
- when(mOffloadHardwareInterface.initOffloadConfig()).thenReturn(offloadConfig);
- when(mOffloadHardwareInterface.initOffloadControl(any())).thenReturn(offloadControlVersion);
+ when(mOffloadHardwareInterface.initOffload(any())).thenReturn(offloadHalVersion);
when(mOffloadHardwareInterface.getDefaultTetherOffloadDisabled()).thenReturn(
defaultDisabled);
}
@@ -2693,10 +2685,9 @@
final UpstreamNetworkState upstreamState2 = buildMobileIPv4UpstreamState();
initTetheringUpstream(upstreamState2);
stateMachine.chooseUpstreamType(true);
- // Bug: duplicated upstream change event.
- mTetheringEventCallback.expectUpstreamChanged(upstreamState2.network);
- inOrder.verify(mNotificationUpdater)
- .onUpstreamCapabilitiesChanged(upstreamState2.networkCapabilities);
+ // Expect that no upstream change event and capabilities changed event.
+ mTetheringEventCallback.assertNoUpstreamChangeCallback();
+ inOrder.verify(mNotificationUpdater, never()).onUpstreamCapabilitiesChanged(any());
// Set the upstream with the same network ID but different object and different capability.
final UpstreamNetworkState upstreamState3 = buildMobileIPv4UpstreamState();
@@ -2704,11 +2695,13 @@
upstreamState3.networkCapabilities.addCapability(NET_CAPABILITY_VALIDATED);
initTetheringUpstream(upstreamState3);
stateMachine.chooseUpstreamType(true);
- // Bug: duplicated upstream change event.
- mTetheringEventCallback.expectUpstreamChanged(upstreamState3.network);
+ // Expect that no upstream change event and capabilities changed event.
+ mTetheringEventCallback.assertNoUpstreamChangeCallback();
+ stateMachine.handleUpstreamNetworkMonitorCallback(EVENT_ON_CAPABILITIES, upstreamState3);
inOrder.verify(mNotificationUpdater)
.onUpstreamCapabilitiesChanged(upstreamState3.networkCapabilities);
+
// Lose upstream.
initTetheringUpstream(null);
stateMachine.chooseUpstreamType(true);
@@ -2999,9 +2992,9 @@
final MacAddress testMac1 = MacAddress.fromString("11:11:11:11:11:11");
final DhcpLeaseParcelable p2pLease = createDhcpLeaseParcelable("clientId1", testMac1,
"192.168.50.24", 24, Long.MAX_VALUE, "test1");
- final List<TetheredClient> p2pClients = notifyDhcpLeasesChanged(TETHERING_WIFI_P2P,
+ final List<TetheredClient> connectedClients = notifyDhcpLeasesChanged(TETHERING_WIFI_P2P,
eventCallbacks, p2pLease);
- callback.expectTetheredClientChanged(p2pClients);
+ callback.expectTetheredClientChanged(connectedClients);
reset(mDhcpServer);
// Run wifi tethering.
@@ -3010,21 +3003,11 @@
verify(mDhcpServer, timeout(DHCPSERVER_START_TIMEOUT_MS)).startWithCallbacks(
any(), dhcpEventCbsCaptor.capture());
eventCallbacks = dhcpEventCbsCaptor.getValue();
- // Update mac address from softAp callback before getting dhcp lease.
final MacAddress testMac2 = MacAddress.fromString("22:22:22:22:22:22");
- final TetheredClient noAddrClient = notifyConnectedWifiClientsChanged(testMac2,
- false /* isLocalOnly */);
- final List<TetheredClient> p2pAndNoAddrClients = new ArrayList<>(p2pClients);
- p2pAndNoAddrClients.add(noAddrClient);
- callback.expectTetheredClientChanged(p2pAndNoAddrClients);
-
- // Update dhcp lease for wifi tethering.
final DhcpLeaseParcelable wifiLease = createDhcpLeaseParcelable("clientId2", testMac2,
"192.168.43.24", 24, Long.MAX_VALUE, "test2");
- final List<TetheredClient> p2pAndWifiClients = new ArrayList<>(p2pClients);
- p2pAndWifiClients.addAll(notifyDhcpLeasesChanged(TETHERING_WIFI,
- eventCallbacks, wifiLease));
- callback.expectTetheredClientChanged(p2pAndWifiClients);
+ verifyHotspotClientUpdate(false /* isLocalOnly */, testMac2, wifiLease, connectedClients,
+ eventCallbacks, callback);
// Test onStarted callback that register second callback when tethering is running.
TestTetheringEventCallback callback2 = new TestTetheringEventCallback();
@@ -3032,7 +3015,7 @@
mTethering.registerTetheringEventCallback(callback2);
mLooper.dispatchAll();
});
- callback2.expectTetheredClientChanged(p2pAndWifiClients);
+ callback2.expectTetheredClientChanged(connectedClients);
}
@Test
@@ -3054,26 +3037,86 @@
verify(mDhcpServer, timeout(DHCPSERVER_START_TIMEOUT_MS)).startWithCallbacks(
any(), dhcpEventCbsCaptor.capture());
final IDhcpEventCallbacks eventCallbacks = dhcpEventCbsCaptor.getValue();
- // Update mac address from softAp callback before getting dhcp lease.
- final MacAddress testMac = MacAddress.fromString("22:22:22:22:22:22");
- final TetheredClient noAddrClient = notifyConnectedWifiClientsChanged(testMac,
- true /* isLocalOnly */);
- final List<TetheredClient> noAddrLocalOnlyClients = new ArrayList<>();
- noAddrLocalOnlyClients.add(noAddrClient);
- callback.expectTetheredClientChanged(noAddrLocalOnlyClients);
- // Update dhcp lease for local only hotspot.
+ final List<TetheredClient> connectedClients = new ArrayList<>();
+ final MacAddress testMac = MacAddress.fromString("22:22:22:22:22:22");
final DhcpLeaseParcelable wifiLease = createDhcpLeaseParcelable("clientId", testMac,
"192.168.43.24", 24, Long.MAX_VALUE, "test");
- final List<TetheredClient> localOnlyClients = notifyDhcpLeasesChanged(TETHERING_WIFI,
- eventCallbacks, wifiLease);
- callback.expectTetheredClientChanged(localOnlyClients);
+ verifyHotspotClientUpdate(true /* isLocalOnly */, testMac, wifiLease, connectedClients,
+ eventCallbacks, callback);
// Client disconnect from local only hotspot.
mLocalOnlyHotspotCallback.onConnectedClientsChanged(Collections.emptyList());
callback.expectTetheredClientChanged(Collections.emptyList());
}
+ @Test
+ @IgnoreUpTo(Build.VERSION_CODES.S_V2)
+ public void testConnectedClientsForSapAndLohsConcurrency() throws Exception {
+ TestTetheringEventCallback callback = new TestTetheringEventCallback();
+ runAsShell(NETWORK_SETTINGS, () -> {
+ mTethering.registerTetheringEventCallback(callback);
+ mLooper.dispatchAll();
+ });
+ callback.expectTetheredClientChanged(Collections.emptyList());
+
+ mTethering.interfaceStatusChanged(TEST_WLAN_IFNAME, true);
+ sendWifiApStateChanged(WIFI_AP_STATE_ENABLED, TEST_WLAN_IFNAME, IFACE_IP_MODE_TETHERED);
+ final ArgumentCaptor<IDhcpEventCallbacks> dhcpEventCbsCaptor =
+ ArgumentCaptor.forClass(IDhcpEventCallbacks.class);
+ verify(mDhcpServer, timeout(DHCPSERVER_START_TIMEOUT_MS)).startWithCallbacks(
+ any(), dhcpEventCbsCaptor.capture());
+ IDhcpEventCallbacks eventCallbacks = dhcpEventCbsCaptor.getValue();
+ final List<TetheredClient> connectedClients = new ArrayList<>();
+ final MacAddress wifiMac = MacAddress.fromString("11:11:11:11:11:11");
+ final DhcpLeaseParcelable wifiLease = createDhcpLeaseParcelable("clientId", wifiMac,
+ "192.168.2.12", 24, Long.MAX_VALUE, "test");
+ verifyHotspotClientUpdate(false /* isLocalOnly */, wifiMac, wifiLease, connectedClients,
+ eventCallbacks, callback);
+ reset(mDhcpServer);
+
+ mTethering.interfaceStatusChanged(TEST_WLAN2_IFNAME, true);
+ sendWifiApStateChanged(WIFI_AP_STATE_ENABLED, TEST_WLAN2_IFNAME, IFACE_IP_MODE_LOCAL_ONLY);
+
+ verify(mDhcpServer, timeout(DHCPSERVER_START_TIMEOUT_MS)).startWithCallbacks(
+ any(), dhcpEventCbsCaptor.capture());
+ eventCallbacks = dhcpEventCbsCaptor.getValue();
+ final MacAddress localOnlyMac = MacAddress.fromString("22:22:22:22:22:22");
+ final DhcpLeaseParcelable localOnlyLease = createDhcpLeaseParcelable("clientId",
+ localOnlyMac, "192.168.43.24", 24, Long.MAX_VALUE, "test");
+ verifyHotspotClientUpdate(true /* isLocalOnly */, localOnlyMac, localOnlyLease,
+ connectedClients, eventCallbacks, callback);
+
+ assertTrue(isIpServerActive(TETHERING_WIFI, TEST_WLAN_IFNAME, IpServer.STATE_TETHERED));
+ assertTrue(isIpServerActive(TETHERING_WIFI, TEST_WLAN2_IFNAME, IpServer.STATE_LOCAL_ONLY));
+ }
+
+ private boolean isIpServerActive(int type, String ifName, int mode) {
+ for (IpServer ipSrv : mTetheringDependencies.mAllDownstreams) {
+ if (ipSrv.interfaceType() == type && ipSrv.interfaceName().equals(ifName)
+ && ipSrv.servingMode() == mode) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ private void verifyHotspotClientUpdate(final boolean isLocalOnly, final MacAddress testMac,
+ final DhcpLeaseParcelable dhcpLease, final List<TetheredClient> currentClients,
+ final IDhcpEventCallbacks dhcpCallback, final TestTetheringEventCallback callback)
+ throws Exception {
+ // Update mac address from softAp callback before getting dhcp lease.
+ final TetheredClient noAddrClient = notifyConnectedWifiClientsChanged(testMac, isLocalOnly);
+ final List<TetheredClient> withNoAddrClients = new ArrayList<>(currentClients);
+ withNoAddrClients.add(noAddrClient);
+ callback.expectTetheredClientChanged(withNoAddrClients);
+
+ // Update dhcp lease for hotspot.
+ currentClients.addAll(notifyDhcpLeasesChanged(TETHERING_WIFI, dhcpCallback, dhcpLease));
+ callback.expectTetheredClientChanged(currentClients);
+ }
+
private TetheredClient notifyConnectedWifiClientsChanged(final MacAddress mac,
boolean isLocalOnly) throws Exception {
final ArrayList<WifiClient> wifiClients = new ArrayList<>();
@@ -3377,6 +3420,7 @@
verify(mDhcpServer, timeout(DHCPSERVER_START_TIMEOUT_MS).times(1)).startWithCallbacks(
any(), any());
verify(mTetheringMetrics).createBuilder(eq(TETHERING_NCM), anyString());
+ verify(mTetheringMetrics, times(1)).maybeUpdateUpstreamType(any());
// Change the USB tethering function to NCM. Because the USB tethering function was set to
// RNDIS (the default), tethering is stopped.
@@ -3393,6 +3437,7 @@
mLooper.dispatchAll();
ncmResult.assertHasResult();
verify(mTetheringMetrics, times(2)).createBuilder(eq(TETHERING_NCM), anyString());
+ verify(mTetheringMetrics, times(1)).maybeUpdateUpstreamType(any());
verify(mTetheringMetrics).updateErrorCode(eq(TETHERING_NCM),
eq(TETHER_ERROR_SERVICE_UNAVAIL));
verify(mTetheringMetrics, times(2)).sendReport(eq(TETHERING_NCM));
@@ -3497,6 +3542,29 @@
assertEquals(expectedTypes.size() > 0, mTethering.isTetheringSupported());
callback.expectSupportedTetheringTypes(expectedTypes);
}
+
+ @Test
+ public void testIpv4AddressForSapAndLohsConcurrency() throws Exception {
+ mTethering.interfaceStatusChanged(TEST_WLAN_IFNAME, true);
+ sendWifiApStateChanged(WIFI_AP_STATE_ENABLED, TEST_WLAN_IFNAME, IFACE_IP_MODE_TETHERED);
+
+ ArgumentCaptor<InterfaceConfigurationParcel> ifaceConfigCaptor =
+ ArgumentCaptor.forClass(InterfaceConfigurationParcel.class);
+ verify(mNetd).interfaceSetCfg(ifaceConfigCaptor.capture());
+ InterfaceConfigurationParcel ifaceConfig = ifaceConfigCaptor.getValue();
+ final IpPrefix sapPrefix = new IpPrefix(
+ InetAddresses.parseNumericAddress(ifaceConfig.ipv4Addr), ifaceConfig.prefixLength);
+
+ mTethering.interfaceStatusChanged(TEST_WLAN2_IFNAME, true);
+ sendWifiApStateChanged(WIFI_AP_STATE_ENABLED, TEST_WLAN2_IFNAME, IFACE_IP_MODE_LOCAL_ONLY);
+
+ ifaceConfigCaptor = ArgumentCaptor.forClass(InterfaceConfigurationParcel.class);
+ verify(mNetd, times(2)).interfaceSetCfg(ifaceConfigCaptor.capture());
+ ifaceConfig = ifaceConfigCaptor.getValue();
+ final IpPrefix lohsPrefix = new IpPrefix(
+ InetAddresses.parseNumericAddress(ifaceConfig.ipv4Addr), ifaceConfig.prefixLength);
+ assertFalse(sapPrefix.equals(lohsPrefix));
+ }
// TODO: Test that a request for hotspot mode doesn't interfere with an
// already operating tethering mode interface.
}
diff --git a/Tethering/tests/unit/src/com/android/networkstack/tethering/metrics/TetheringMetricsTest.java b/Tethering/tests/unit/src/com/android/networkstack/tethering/metrics/TetheringMetricsTest.java
index 7fdde97..e2c924c 100644
--- a/Tethering/tests/unit/src/com/android/networkstack/tethering/metrics/TetheringMetricsTest.java
+++ b/Tethering/tests/unit/src/com/android/networkstack/tethering/metrics/TetheringMetricsTest.java
@@ -16,6 +16,12 @@
package com.android.networkstack.tethering.metrics;
+import static android.net.NetworkCapabilities.TRANSPORT_BLUETOOTH;
+import static android.net.NetworkCapabilities.TRANSPORT_CELLULAR;
+import static android.net.NetworkCapabilities.TRANSPORT_ETHERNET;
+import static android.net.NetworkCapabilities.TRANSPORT_LOWPAN;
+import static android.net.NetworkCapabilities.TRANSPORT_WIFI;
+import static android.net.NetworkCapabilities.TRANSPORT_WIFI_AWARE;
import static android.net.TetheringManager.TETHERING_BLUETOOTH;
import static android.net.TetheringManager.TETHERING_ETHERNET;
import static android.net.TetheringManager.TETHERING_NCM;
@@ -44,15 +50,17 @@
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
+import android.net.NetworkCapabilities;
import android.stats.connectivity.DownstreamType;
import android.stats.connectivity.ErrorCode;
import android.stats.connectivity.UpstreamType;
import android.stats.connectivity.UserType;
-import android.util.Pair;
import androidx.test.filters.SmallTest;
import androidx.test.runner.AndroidJUnit4;
+import com.android.networkstack.tethering.UpstreamNetworkState;
+
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -65,138 +73,310 @@
private static final String SETTINGS_PKG = "com.android.settings";
private static final String SYSTEMUI_PKG = "com.android.systemui";
private static final String GMS_PKG = "com.google.android.gms";
- private TetheringMetrics mTetheringMetrics;
+ private static final long TEST_START_TIME = 1670395936033L;
+ private static final long SECOND_IN_MILLIS = 1_000L;
+ private TetheringMetrics mTetheringMetrics;
private final NetworkTetheringReported.Builder mStatsBuilder =
NetworkTetheringReported.newBuilder();
+ private long mElapsedRealtime;
+
private class MockTetheringMetrics extends TetheringMetrics {
@Override
- public void write(final NetworkTetheringReported reported) { }
+ public void write(final NetworkTetheringReported reported) {}
+ @Override
+ public long timeNow() {
+ return currentTimeMillis();
+ }
+ }
+
+ private long currentTimeMillis() {
+ return TEST_START_TIME + mElapsedRealtime;
+ }
+
+ private void incrementCurrentTime(final long duration) {
+ mElapsedRealtime += duration;
+ mTetheringMetrics.timeNow();
+ }
+
+ private long getElapsedRealtime() {
+ return mElapsedRealtime;
+ }
+
+ private void clearElapsedRealtime() {
+ mElapsedRealtime = 0;
}
@Before
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
mTetheringMetrics = spy(new MockTetheringMetrics());
+ mElapsedRealtime = 0L;
}
- private void verifyReport(DownstreamType downstream, ErrorCode error, UserType user)
+ private void verifyReport(final DownstreamType downstream, final ErrorCode error,
+ final UserType user, final UpstreamEvents.Builder upstreamEvents, final long duration)
throws Exception {
final NetworkTetheringReported expectedReport =
mStatsBuilder.setDownstreamType(downstream)
.setUserType(user)
.setUpstreamType(UpstreamType.UT_UNKNOWN)
.setErrorCode(error)
- .setUpstreamEvents(UpstreamEvents.newBuilder())
- .setDurationMillis(0)
+ .setUpstreamEvents(upstreamEvents)
+ .setDurationMillis(duration)
.build();
verify(mTetheringMetrics).write(expectedReport);
}
- private void updateErrorAndSendReport(int downstream, int error) {
+ private void updateErrorAndSendReport(final int downstream, final int error) {
mTetheringMetrics.updateErrorCode(downstream, error);
mTetheringMetrics.sendReport(downstream);
}
- private void runDownstreamTypesTest(final Pair<Integer, DownstreamType>... testPairs)
- throws Exception {
- for (Pair<Integer, DownstreamType> testPair : testPairs) {
- final int type = testPair.first;
- final DownstreamType expectedResult = testPair.second;
-
- mTetheringMetrics.createBuilder(type, TEST_CALLER_PKG);
- updateErrorAndSendReport(type, TETHER_ERROR_NO_ERROR);
- verifyReport(expectedResult, ErrorCode.EC_NO_ERROR, UserType.USER_UNKNOWN);
- reset(mTetheringMetrics);
+ private static NetworkCapabilities buildUpstreamCapabilities(final int[] transports) {
+ final NetworkCapabilities nc = new NetworkCapabilities();
+ for (int type: transports) {
+ nc.addTransportType(type);
}
+ return nc;
+ }
+
+ private static UpstreamNetworkState buildUpstreamState(final int... transports) {
+ return new UpstreamNetworkState(
+ null,
+ buildUpstreamCapabilities(transports),
+ null);
+ }
+
+ private void addUpstreamEvent(UpstreamEvents.Builder upstreamEvents,
+ final UpstreamType expectedResult, final long duration, final long txBytes,
+ final long rxBytes) {
+ UpstreamEvent.Builder upstreamEvent = UpstreamEvent.newBuilder()
+ .setUpstreamType(expectedResult)
+ .setDurationMillis(duration)
+ .setTxBytes(txBytes)
+ .setRxBytes(rxBytes);
+ upstreamEvents.addUpstreamEvent(upstreamEvent);
+ }
+
+ private void runDownstreamTypesTest(final int type, final DownstreamType expectedResult)
+ throws Exception {
+ mTetheringMetrics.createBuilder(type, TEST_CALLER_PKG);
+ final long duration = 2 * SECOND_IN_MILLIS;
+ incrementCurrentTime(duration);
+ UpstreamEvents.Builder upstreamEvents = UpstreamEvents.newBuilder();
+ // Set UpstreamType as NO_NETWORK because the upstream type has not been changed.
+ addUpstreamEvent(upstreamEvents, UpstreamType.UT_NO_NETWORK, duration, 0L, 0L);
+ updateErrorAndSendReport(type, TETHER_ERROR_NO_ERROR);
+
+ verifyReport(expectedResult, ErrorCode.EC_NO_ERROR, UserType.USER_UNKNOWN,
+ upstreamEvents, getElapsedRealtime());
+ reset(mTetheringMetrics);
+ clearElapsedRealtime();
+ mTetheringMetrics.cleanup();
}
@Test
public void testDownstreamTypes() throws Exception {
- runDownstreamTypesTest(new Pair<>(TETHERING_WIFI, DownstreamType.DS_TETHERING_WIFI),
- new Pair<>(TETHERING_WIFI_P2P, DownstreamType.DS_TETHERING_WIFI_P2P),
- new Pair<>(TETHERING_BLUETOOTH, DownstreamType.DS_TETHERING_BLUETOOTH),
- new Pair<>(TETHERING_USB, DownstreamType.DS_TETHERING_USB),
- new Pair<>(TETHERING_NCM, DownstreamType.DS_TETHERING_NCM),
- new Pair<>(TETHERING_ETHERNET, DownstreamType.DS_TETHERING_ETHERNET));
+ runDownstreamTypesTest(TETHERING_WIFI, DownstreamType.DS_TETHERING_WIFI);
+ runDownstreamTypesTest(TETHERING_WIFI_P2P, DownstreamType.DS_TETHERING_WIFI_P2P);
+ runDownstreamTypesTest(TETHERING_BLUETOOTH, DownstreamType.DS_TETHERING_BLUETOOTH);
+ runDownstreamTypesTest(TETHERING_USB, DownstreamType.DS_TETHERING_USB);
+ runDownstreamTypesTest(TETHERING_NCM, DownstreamType.DS_TETHERING_NCM);
+ runDownstreamTypesTest(TETHERING_ETHERNET, DownstreamType.DS_TETHERING_ETHERNET);
}
- private void runErrorCodesTest(final Pair<Integer, ErrorCode>... testPairs)
+ private void runErrorCodesTest(final int errorCode, final ErrorCode expectedResult)
throws Exception {
- for (Pair<Integer, ErrorCode> testPair : testPairs) {
- final int errorCode = testPair.first;
- final ErrorCode expectedResult = testPair.second;
+ mTetheringMetrics.createBuilder(TETHERING_WIFI, TEST_CALLER_PKG);
+ mTetheringMetrics.maybeUpdateUpstreamType(buildUpstreamState(TRANSPORT_WIFI));
+ final long duration = 2 * SECOND_IN_MILLIS;
+ incrementCurrentTime(duration);
+ updateErrorAndSendReport(TETHERING_WIFI, errorCode);
- mTetheringMetrics.createBuilder(TETHERING_WIFI, TEST_CALLER_PKG);
- updateErrorAndSendReport(TETHERING_WIFI, errorCode);
- verifyReport(DownstreamType.DS_TETHERING_WIFI, expectedResult, UserType.USER_UNKNOWN);
- reset(mTetheringMetrics);
- }
+ UpstreamEvents.Builder upstreamEvents = UpstreamEvents.newBuilder();
+ addUpstreamEvent(upstreamEvents, UpstreamType.UT_WIFI, duration, 0L, 0L);
+ verifyReport(DownstreamType.DS_TETHERING_WIFI, expectedResult, UserType.USER_UNKNOWN,
+ upstreamEvents, getElapsedRealtime());
+ reset(mTetheringMetrics);
+ clearElapsedRealtime();
+ mTetheringMetrics.cleanup();
}
@Test
public void testErrorCodes() throws Exception {
- runErrorCodesTest(new Pair<>(TETHER_ERROR_NO_ERROR, ErrorCode.EC_NO_ERROR),
- new Pair<>(TETHER_ERROR_UNKNOWN_IFACE, ErrorCode.EC_UNKNOWN_IFACE),
- new Pair<>(TETHER_ERROR_SERVICE_UNAVAIL, ErrorCode.EC_SERVICE_UNAVAIL),
- new Pair<>(TETHER_ERROR_UNSUPPORTED, ErrorCode.EC_UNSUPPORTED),
- new Pair<>(TETHER_ERROR_UNAVAIL_IFACE, ErrorCode.EC_UNAVAIL_IFACE),
- new Pair<>(TETHER_ERROR_INTERNAL_ERROR, ErrorCode.EC_INTERNAL_ERROR),
- new Pair<>(TETHER_ERROR_TETHER_IFACE_ERROR, ErrorCode.EC_TETHER_IFACE_ERROR),
- new Pair<>(TETHER_ERROR_UNTETHER_IFACE_ERROR, ErrorCode.EC_UNTETHER_IFACE_ERROR),
- new Pair<>(TETHER_ERROR_ENABLE_FORWARDING_ERROR,
- ErrorCode.EC_ENABLE_FORWARDING_ERROR),
- new Pair<>(TETHER_ERROR_DISABLE_FORWARDING_ERROR,
- ErrorCode.EC_DISABLE_FORWARDING_ERROR),
- new Pair<>(TETHER_ERROR_IFACE_CFG_ERROR, ErrorCode.EC_IFACE_CFG_ERROR),
- new Pair<>(TETHER_ERROR_PROVISIONING_FAILED, ErrorCode.EC_PROVISIONING_FAILED),
- new Pair<>(TETHER_ERROR_DHCPSERVER_ERROR, ErrorCode.EC_DHCPSERVER_ERROR),
- new Pair<>(TETHER_ERROR_ENTITLEMENT_UNKNOWN, ErrorCode.EC_ENTITLEMENT_UNKNOWN),
- new Pair<>(TETHER_ERROR_NO_CHANGE_TETHERING_PERMISSION,
- ErrorCode.EC_NO_CHANGE_TETHERING_PERMISSION),
- new Pair<>(TETHER_ERROR_NO_ACCESS_TETHERING_PERMISSION,
- ErrorCode.EC_NO_ACCESS_TETHERING_PERMISSION),
- new Pair<>(TETHER_ERROR_UNKNOWN_TYPE, ErrorCode.EC_UNKNOWN_TYPE));
+ runErrorCodesTest(TETHER_ERROR_NO_ERROR, ErrorCode.EC_NO_ERROR);
+ runErrorCodesTest(TETHER_ERROR_UNKNOWN_IFACE, ErrorCode.EC_UNKNOWN_IFACE);
+ runErrorCodesTest(TETHER_ERROR_SERVICE_UNAVAIL, ErrorCode.EC_SERVICE_UNAVAIL);
+ runErrorCodesTest(TETHER_ERROR_UNSUPPORTED, ErrorCode.EC_UNSUPPORTED);
+ runErrorCodesTest(TETHER_ERROR_UNAVAIL_IFACE, ErrorCode.EC_UNAVAIL_IFACE);
+ runErrorCodesTest(TETHER_ERROR_INTERNAL_ERROR, ErrorCode.EC_INTERNAL_ERROR);
+ runErrorCodesTest(TETHER_ERROR_TETHER_IFACE_ERROR, ErrorCode.EC_TETHER_IFACE_ERROR);
+ runErrorCodesTest(TETHER_ERROR_UNTETHER_IFACE_ERROR, ErrorCode.EC_UNTETHER_IFACE_ERROR);
+ runErrorCodesTest(TETHER_ERROR_ENABLE_FORWARDING_ERROR,
+ ErrorCode.EC_ENABLE_FORWARDING_ERROR);
+ runErrorCodesTest(TETHER_ERROR_DISABLE_FORWARDING_ERROR,
+ ErrorCode.EC_DISABLE_FORWARDING_ERROR);
+ runErrorCodesTest(TETHER_ERROR_IFACE_CFG_ERROR, ErrorCode.EC_IFACE_CFG_ERROR);
+ runErrorCodesTest(TETHER_ERROR_PROVISIONING_FAILED, ErrorCode.EC_PROVISIONING_FAILED);
+ runErrorCodesTest(TETHER_ERROR_DHCPSERVER_ERROR, ErrorCode.EC_DHCPSERVER_ERROR);
+ runErrorCodesTest(TETHER_ERROR_ENTITLEMENT_UNKNOWN, ErrorCode.EC_ENTITLEMENT_UNKNOWN);
+ runErrorCodesTest(TETHER_ERROR_NO_CHANGE_TETHERING_PERMISSION,
+ ErrorCode.EC_NO_CHANGE_TETHERING_PERMISSION);
+ runErrorCodesTest(TETHER_ERROR_NO_ACCESS_TETHERING_PERMISSION,
+ ErrorCode.EC_NO_ACCESS_TETHERING_PERMISSION);
+ runErrorCodesTest(TETHER_ERROR_UNKNOWN_TYPE, ErrorCode.EC_UNKNOWN_TYPE);
}
- private void runUserTypesTest(final Pair<String, UserType>... testPairs)
+ private void runUserTypesTest(final String callerPkg, final UserType expectedResult)
throws Exception {
- for (Pair<String, UserType> testPair : testPairs) {
- final String callerPkg = testPair.first;
- final UserType expectedResult = testPair.second;
+ mTetheringMetrics.createBuilder(TETHERING_WIFI, callerPkg);
+ final long duration = 1 * SECOND_IN_MILLIS;
+ incrementCurrentTime(duration);
+ updateErrorAndSendReport(TETHERING_WIFI, TETHER_ERROR_NO_ERROR);
- mTetheringMetrics.createBuilder(TETHERING_WIFI, callerPkg);
- updateErrorAndSendReport(TETHERING_WIFI, TETHER_ERROR_NO_ERROR);
- verifyReport(DownstreamType.DS_TETHERING_WIFI, ErrorCode.EC_NO_ERROR, expectedResult);
- reset(mTetheringMetrics);
- }
+ UpstreamEvents.Builder upstreamEvents = UpstreamEvents.newBuilder();
+ // Set UpstreamType as NO_NETWORK because the upstream type has not been changed.
+ addUpstreamEvent(upstreamEvents, UpstreamType.UT_NO_NETWORK, duration, 0L, 0L);
+ verifyReport(DownstreamType.DS_TETHERING_WIFI, ErrorCode.EC_NO_ERROR, expectedResult,
+ upstreamEvents, getElapsedRealtime());
+ reset(mTetheringMetrics);
+ clearElapsedRealtime();
+ mTetheringMetrics.cleanup();
}
@Test
public void testUserTypes() throws Exception {
- runUserTypesTest(new Pair<>(TEST_CALLER_PKG, UserType.USER_UNKNOWN),
- new Pair<>(SETTINGS_PKG, UserType.USER_SETTINGS),
- new Pair<>(SYSTEMUI_PKG, UserType.USER_SYSTEMUI),
- new Pair<>(GMS_PKG, UserType.USER_GMS));
+ runUserTypesTest(TEST_CALLER_PKG, UserType.USER_UNKNOWN);
+ runUserTypesTest(SETTINGS_PKG, UserType.USER_SETTINGS);
+ runUserTypesTest(SYSTEMUI_PKG, UserType.USER_SYSTEMUI);
+ runUserTypesTest(GMS_PKG, UserType.USER_GMS);
+ }
+
+ private void runUpstreamTypesTest(final UpstreamNetworkState ns,
+ final UpstreamType expectedResult) throws Exception {
+ mTetheringMetrics.createBuilder(TETHERING_WIFI, TEST_CALLER_PKG);
+ mTetheringMetrics.maybeUpdateUpstreamType(ns);
+ final long duration = 2 * SECOND_IN_MILLIS;
+ incrementCurrentTime(duration);
+ updateErrorAndSendReport(TETHERING_WIFI, TETHER_ERROR_NO_ERROR);
+
+ UpstreamEvents.Builder upstreamEvents = UpstreamEvents.newBuilder();
+ addUpstreamEvent(upstreamEvents, expectedResult, duration, 0L, 0L);
+ verifyReport(DownstreamType.DS_TETHERING_WIFI, ErrorCode.EC_NO_ERROR,
+ UserType.USER_UNKNOWN, upstreamEvents, getElapsedRealtime());
+ reset(mTetheringMetrics);
+ clearElapsedRealtime();
+ mTetheringMetrics.cleanup();
+ }
+
+ @Test
+ public void testUpstreamTypes() throws Exception {
+ runUpstreamTypesTest(null , UpstreamType.UT_NO_NETWORK);
+ runUpstreamTypesTest(buildUpstreamState(TRANSPORT_CELLULAR), UpstreamType.UT_CELLULAR);
+ runUpstreamTypesTest(buildUpstreamState(TRANSPORT_WIFI), UpstreamType.UT_WIFI);
+ runUpstreamTypesTest(buildUpstreamState(TRANSPORT_BLUETOOTH), UpstreamType.UT_BLUETOOTH);
+ runUpstreamTypesTest(buildUpstreamState(TRANSPORT_ETHERNET), UpstreamType.UT_ETHERNET);
+ runUpstreamTypesTest(buildUpstreamState(TRANSPORT_WIFI_AWARE), UpstreamType.UT_WIFI_AWARE);
+ runUpstreamTypesTest(buildUpstreamState(TRANSPORT_LOWPAN), UpstreamType.UT_LOWPAN);
+ runUpstreamTypesTest(buildUpstreamState(TRANSPORT_CELLULAR, TRANSPORT_WIFI,
+ TRANSPORT_BLUETOOTH), UpstreamType.UT_UNKNOWN);
}
@Test
public void testMultiBuildersCreatedBeforeSendReport() throws Exception {
mTetheringMetrics.createBuilder(TETHERING_WIFI, SETTINGS_PKG);
+ final long wifiTetheringStartTime = currentTimeMillis();
+ incrementCurrentTime(1 * SECOND_IN_MILLIS);
mTetheringMetrics.createBuilder(TETHERING_USB, SYSTEMUI_PKG);
+ final long usbTetheringStartTime = currentTimeMillis();
+ incrementCurrentTime(2 * SECOND_IN_MILLIS);
mTetheringMetrics.createBuilder(TETHERING_BLUETOOTH, GMS_PKG);
-
+ final long bluetoothTetheringStartTime = currentTimeMillis();
+ incrementCurrentTime(3 * SECOND_IN_MILLIS);
updateErrorAndSendReport(TETHERING_WIFI, TETHER_ERROR_DHCPSERVER_ERROR);
+
+ UpstreamEvents.Builder wifiTetheringUpstreamEvents = UpstreamEvents.newBuilder();
+ addUpstreamEvent(wifiTetheringUpstreamEvents, UpstreamType.UT_NO_NETWORK,
+ currentTimeMillis() - wifiTetheringStartTime, 0L, 0L);
verifyReport(DownstreamType.DS_TETHERING_WIFI, ErrorCode.EC_DHCPSERVER_ERROR,
- UserType.USER_SETTINGS);
-
+ UserType.USER_SETTINGS, wifiTetheringUpstreamEvents,
+ currentTimeMillis() - wifiTetheringStartTime);
+ incrementCurrentTime(1 * SECOND_IN_MILLIS);
updateErrorAndSendReport(TETHERING_USB, TETHER_ERROR_ENABLE_FORWARDING_ERROR);
- verifyReport(DownstreamType.DS_TETHERING_USB, ErrorCode.EC_ENABLE_FORWARDING_ERROR,
- UserType.USER_SYSTEMUI);
+ UpstreamEvents.Builder usbTetheringUpstreamEvents = UpstreamEvents.newBuilder();
+ addUpstreamEvent(usbTetheringUpstreamEvents, UpstreamType.UT_NO_NETWORK,
+ currentTimeMillis() - usbTetheringStartTime, 0L, 0L);
+
+ verifyReport(DownstreamType.DS_TETHERING_USB, ErrorCode.EC_ENABLE_FORWARDING_ERROR,
+ UserType.USER_SYSTEMUI, usbTetheringUpstreamEvents,
+ currentTimeMillis() - usbTetheringStartTime);
+ incrementCurrentTime(1 * SECOND_IN_MILLIS);
updateErrorAndSendReport(TETHERING_BLUETOOTH, TETHER_ERROR_TETHER_IFACE_ERROR);
+
+ UpstreamEvents.Builder bluetoothTetheringUpstreamEvents = UpstreamEvents.newBuilder();
+ addUpstreamEvent(bluetoothTetheringUpstreamEvents, UpstreamType.UT_NO_NETWORK,
+ currentTimeMillis() - bluetoothTetheringStartTime, 0L, 0L);
verifyReport(DownstreamType.DS_TETHERING_BLUETOOTH, ErrorCode.EC_TETHER_IFACE_ERROR,
- UserType.USER_GMS);
+ UserType.USER_GMS, bluetoothTetheringUpstreamEvents,
+ currentTimeMillis() - bluetoothTetheringStartTime);
+ }
+
+ @Test
+ public void testUpstreamsWithMultipleDownstreams() throws Exception {
+ mTetheringMetrics.createBuilder(TETHERING_WIFI, SETTINGS_PKG);
+ final long wifiTetheringStartTime = currentTimeMillis();
+ incrementCurrentTime(1 * SECOND_IN_MILLIS);
+ mTetheringMetrics.maybeUpdateUpstreamType(buildUpstreamState(TRANSPORT_WIFI));
+ final long wifiUpstreamStartTime = currentTimeMillis();
+ incrementCurrentTime(5 * SECOND_IN_MILLIS);
+ mTetheringMetrics.createBuilder(TETHERING_USB, SYSTEMUI_PKG);
+ final long usbTetheringStartTime = currentTimeMillis();
+ incrementCurrentTime(5 * SECOND_IN_MILLIS);
+ updateErrorAndSendReport(TETHERING_USB, TETHER_ERROR_NO_ERROR);
+
+ UpstreamEvents.Builder usbTetheringUpstreamEvents = UpstreamEvents.newBuilder();
+ addUpstreamEvent(usbTetheringUpstreamEvents, UpstreamType.UT_WIFI,
+ currentTimeMillis() - usbTetheringStartTime, 0L, 0L);
+ verifyReport(DownstreamType.DS_TETHERING_USB, ErrorCode.EC_NO_ERROR,
+ UserType.USER_SYSTEMUI, usbTetheringUpstreamEvents,
+ currentTimeMillis() - usbTetheringStartTime);
+ incrementCurrentTime(7 * SECOND_IN_MILLIS);
+ updateErrorAndSendReport(TETHERING_WIFI, TETHER_ERROR_NO_ERROR);
+
+ UpstreamEvents.Builder wifiTetheringUpstreamEvents = UpstreamEvents.newBuilder();
+ addUpstreamEvent(wifiTetheringUpstreamEvents, UpstreamType.UT_WIFI,
+ currentTimeMillis() - wifiUpstreamStartTime, 0L, 0L);
+ verifyReport(DownstreamType.DS_TETHERING_WIFI, ErrorCode.EC_NO_ERROR,
+ UserType.USER_SETTINGS, wifiTetheringUpstreamEvents,
+ currentTimeMillis() - wifiTetheringStartTime);
+ }
+
+ @Test
+ public void testSwitchingMultiUpstreams() throws Exception {
+ mTetheringMetrics.createBuilder(TETHERING_WIFI, SETTINGS_PKG);
+ final long wifiTetheringStartTime = currentTimeMillis();
+ incrementCurrentTime(1 * SECOND_IN_MILLIS);
+ mTetheringMetrics.maybeUpdateUpstreamType(buildUpstreamState(TRANSPORT_WIFI));
+ final long wifiDuration = 5 * SECOND_IN_MILLIS;
+ incrementCurrentTime(wifiDuration);
+ mTetheringMetrics.maybeUpdateUpstreamType(buildUpstreamState(TRANSPORT_BLUETOOTH));
+ final long bluetoothDuration = 15 * SECOND_IN_MILLIS;
+ incrementCurrentTime(bluetoothDuration);
+ mTetheringMetrics.maybeUpdateUpstreamType(buildUpstreamState(TRANSPORT_CELLULAR));
+ final long celltoothDuration = 20 * SECOND_IN_MILLIS;
+ incrementCurrentTime(celltoothDuration);
+ updateErrorAndSendReport(TETHERING_WIFI, TETHER_ERROR_NO_ERROR);
+
+ UpstreamEvents.Builder upstreamEvents = UpstreamEvents.newBuilder();
+ addUpstreamEvent(upstreamEvents, UpstreamType.UT_WIFI, wifiDuration, 0L, 0L);
+ addUpstreamEvent(upstreamEvents, UpstreamType.UT_BLUETOOTH, bluetoothDuration, 0L, 0L);
+ addUpstreamEvent(upstreamEvents, UpstreamType.UT_CELLULAR, celltoothDuration, 0L, 0L);
+
+ verifyReport(DownstreamType.DS_TETHERING_WIFI, ErrorCode.EC_NO_ERROR,
+ UserType.USER_SETTINGS, upstreamEvents,
+ currentTimeMillis() - wifiTetheringStartTime);
}
}
diff --git a/bpf_progs/Android.bp b/bpf_progs/Android.bp
index 229dce3..b3f8ed6 100644
--- a/bpf_progs/Android.bp
+++ b/bpf_progs/Android.bp
@@ -103,18 +103,6 @@
}
bpf {
- name: "offload@inprocess.o",
- srcs: ["offload@inprocess.c"],
- btf: true,
- cflags: [
- "-Wall",
- "-Werror",
- "-DBTF",
- "-DINPROCESS",
- ],
-}
-
-bpf {
name: "test.o",
srcs: ["test.c"],
cflags: [
@@ -135,18 +123,6 @@
}
bpf {
- name: "test@inprocess.o",
- srcs: ["test@inprocess.c"],
- btf: true,
- cflags: [
- "-Wall",
- "-Werror",
- "-DBTF",
- "-DINPROCESS",
- ],
-}
-
-bpf {
name: "clatd.o",
srcs: ["clatd.c"],
btf: true,
diff --git a/bpf_progs/block.c b/bpf_progs/block.c
index f2a3e62..d734b74 100644
--- a/bpf_progs/block.c
+++ b/bpf_progs/block.c
@@ -19,8 +19,8 @@
#include <netinet/in.h>
#include <stdint.h>
-// The resulting .o needs to load on the Android T beta 3 bpfloader
-#define BPFLOADER_MIN_VER BPFLOADER_T_BETA3_VERSION
+// The resulting .o needs to load on the Android T bpfloader
+#define BPFLOADER_MIN_VER BPFLOADER_T_VERSION
#include "bpf_helpers.h"
@@ -71,3 +71,4 @@
LICENSE("Apache 2.0");
CRITICAL("ConnectivityNative");
+DISABLE_BTF_ON_USER_BUILDS();
diff --git a/bpf_progs/bpf_net_helpers.h b/bpf_progs/bpf_net_helpers.h
index b7ca3af..ed33cc9 100644
--- a/bpf_progs/bpf_net_helpers.h
+++ b/bpf_progs/bpf_net_helpers.h
@@ -86,3 +86,30 @@
if (len > skb->len) len = skb->len;
if (skb->data_end - skb->data < len) bpf_skb_pull_data(skb, len);
}
+
+// constants for passing in to 'bool egress'
+static const bool INGRESS = false;
+static const bool EGRESS = true;
+
+// constants for passing in to 'bool downstream'
+static const bool UPSTREAM = false;
+static const bool DOWNSTREAM = true;
+
+// constants for passing in to 'bool is_ethernet'
+static const bool RAWIP = false;
+static const bool ETHER = true;
+
+// constants for passing in to 'bool updatetime'
+static const bool NO_UPDATETIME = false;
+static const bool UPDATETIME = true;
+
+// constants for passing in to ignore_on_eng / ignore_on_user / ignore_on_userdebug
+// define's instead of static const due to tm-mainline-prod compiler static_assert limitations
+#define LOAD_ON_ENG false
+#define LOAD_ON_USER false
+#define LOAD_ON_USERDEBUG false
+#define IGNORE_ON_ENG true
+#define IGNORE_ON_USER true
+#define IGNORE_ON_USERDEBUG true
+
+#define KVER_4_14 KVER(4, 14, 0)
diff --git a/bpf_progs/clatd.c b/bpf_progs/clatd.c
index 7350209..905b8fa 100644
--- a/bpf_progs/clatd.c
+++ b/bpf_progs/clatd.c
@@ -30,8 +30,8 @@
#define __kernel_udphdr udphdr
#include <linux/udp.h>
-// The resulting .o needs to load on the Android T beta 3 bpfloader
-#define BPFLOADER_MIN_VER BPFLOADER_T_BETA3_VERSION
+// The resulting .o needs to load on the Android T bpfloader
+#define BPFLOADER_MIN_VER BPFLOADER_T_VERSION
#include "bpf_helpers.h"
#include "bpf_net_helpers.h"
@@ -52,12 +52,6 @@
__be32 identification;
};
-// constants for passing in to 'bool is_ethernet'
-static const bool RAWIP = false;
-static const bool ETHER = true;
-
-#define KVER_4_14 KVER(4, 14, 0)
-
DEFINE_BPF_MAP_GRW(clat_ingress6_map, HASH, ClatIngress6Key, ClatIngress6Value, 16, AID_SYSTEM)
static inline __always_inline int nat64(struct __sk_buff* skb,
@@ -91,6 +85,12 @@
if (ip6->version != 6) return TC_ACT_PIPE;
// Maximum IPv6 payload length that can be translated to IPv4
+ // Note: technically this check is too strict for an IPv6 fragment,
+ // which by virtue of stripping the extra 8 byte fragment extension header,
+ // could thus be 8 bytes larger and still fit in an ipv4 packet post
+ // translation. However... who ever heard of receiving ~64KB frags...
+ // fragments are kind of by definition smaller than ingress device mtu,
+ // and thus, on the internet, very very unlikely to exceed 1500 bytes.
if (ntohs(ip6->payload_len) > 0xFFFF - sizeof(struct iphdr)) return TC_ACT_PIPE;
ClatIngress6Key k = {
@@ -416,3 +416,4 @@
LICENSE("Apache 2.0");
CRITICAL("Connectivity");
+DISABLE_BTF_ON_USER_BUILDS();
diff --git a/bpf_progs/dscpPolicy.c b/bpf_progs/dscpPolicy.c
index 72f63c6..88b50b5 100644
--- a/bpf_progs/dscpPolicy.c
+++ b/bpf_progs/dscpPolicy.c
@@ -27,8 +27,8 @@
#include <stdint.h>
#include <string.h>
-// The resulting .o needs to load on the Android T beta 3 bpfloader
-#define BPFLOADER_MIN_VER BPFLOADER_T_BETA3_VERSION
+// The resulting .o needs to load on the Android T bpfloader
+#define BPFLOADER_MIN_VER BPFLOADER_T_VERSION
#include "bpf_helpers.h"
#include "dscpPolicy.h"
@@ -238,3 +238,4 @@
LICENSE("Apache 2.0");
CRITICAL("Connectivity");
+DISABLE_BTF_ON_USER_BUILDS();
diff --git a/bpf_progs/netd.c b/bpf_progs/netd.c
index e068d8a..74b09e7 100644
--- a/bpf_progs/netd.c
+++ b/bpf_progs/netd.c
@@ -14,8 +14,8 @@
* limitations under the License.
*/
-// The resulting .o needs to load on the Android T Beta 3 bpfloader
-#define BPFLOADER_MIN_VER BPFLOADER_T_BETA3_VERSION
+// The resulting .o needs to load on the Android T bpfloader
+#define BPFLOADER_MIN_VER BPFLOADER_T_VERSION
#include <bpf_helpers.h>
#include <linux/bpf.h>
@@ -42,10 +42,6 @@
static const int BPF_NOMATCH = 0;
static const int BPF_MATCH = 1;
-// Used for 'bool egress'
-static const bool INGRESS = false;
-static const bool EGRESS = true;
-
// Used for 'bool enable_tracing'
static const bool TRACE_ON = true;
static const bool TRACE_OFF = false;
@@ -64,15 +60,15 @@
#define DEFINE_BPF_MAP_NO_NETD(the_map, TYPE, TypeOfKey, TypeOfValue, num_entries) \
DEFINE_BPF_MAP_EXT(the_map, TYPE, TypeOfKey, TypeOfValue, num_entries, \
AID_ROOT, AID_NET_BW_ACCT, 0060, "fs_bpf_net_shared", "", false, \
- BPFLOADER_MIN_VER, BPFLOADER_MAX_VER, /*ignore_on_eng*/false, \
- /*ignore_on_user*/false, /*ignore_on_userdebug*/false)
+ BPFLOADER_MIN_VER, BPFLOADER_MAX_VER, LOAD_ON_ENG, \
+ LOAD_ON_USER, LOAD_ON_USERDEBUG)
// For maps netd only needs read only access to
#define DEFINE_BPF_MAP_RO_NETD(the_map, TYPE, TypeOfKey, TypeOfValue, num_entries) \
DEFINE_BPF_MAP_EXT(the_map, TYPE, TypeOfKey, TypeOfValue, num_entries, \
AID_ROOT, AID_NET_BW_ACCT, 0460, "fs_bpf_netd_readonly", "", false, \
- BPFLOADER_MIN_VER, BPFLOADER_MAX_VER, /*ignore_on_eng*/false, \
- /*ignore_on_user*/false, /*ignore_on_userdebug*/false)
+ BPFLOADER_MIN_VER, BPFLOADER_MAX_VER, LOAD_ON_ENG, \
+ LOAD_ON_USER, LOAD_ON_USERDEBUG)
// For maps netd needs to be able to read and write
#define DEFINE_BPF_MAP_RW_NETD(the_map, TYPE, TypeOfKey, TypeOfValue, num_entries) \
@@ -103,15 +99,15 @@
// A single-element configuration array, packet tracing is enabled when 'true'.
DEFINE_BPF_MAP_EXT(packet_trace_enabled_map, ARRAY, uint32_t, bool, 1,
AID_ROOT, AID_SYSTEM, 0060, "fs_bpf_net_shared", "", false,
- BPFLOADER_IGNORED_ON_VERSION, BPFLOADER_MAX_VER, /*ignore_on_eng*/false,
- /*ignore_on_user*/true, /*ignore_on_userdebug*/false)
+ BPFLOADER_IGNORED_ON_VERSION, BPFLOADER_MAX_VER, LOAD_ON_ENG,
+ IGNORE_ON_USER, LOAD_ON_USERDEBUG)
// A ring buffer on which packet information is pushed. This map will only be loaded
// on eng and userdebug devices. User devices won't load this to save memory.
DEFINE_BPF_RINGBUF_EXT(packet_trace_ringbuf, PacketTrace, PACKET_TRACE_BUF_SIZE,
AID_ROOT, AID_SYSTEM, 0060, "fs_bpf_net_shared", "", false,
- BPFLOADER_IGNORED_ON_VERSION, BPFLOADER_MAX_VER, /*ignore_on_eng*/false,
- /*ignore_on_user*/true, /*ignore_on_userdebug*/false);
+ BPFLOADER_IGNORED_ON_VERSION, BPFLOADER_MAX_VER, LOAD_ON_ENG,
+ IGNORE_ON_USER, LOAD_ON_USERDEBUG);
// iptables xt_bpf programs need to be usable by both netd and netutils_wrappers
// selinux contexts, because even non-xt_bpf iptables mutations are implemented as
@@ -176,36 +172,38 @@
* Especially since the number of packets is important for any future clat offload correction.
* (which adjusts upward by 20 bytes per packet to account for ipv4 -> ipv6 header conversion)
*/
-#define DEFINE_UPDATE_STATS(the_stats_map, TypeOfKey) \
- static __always_inline inline void update_##the_stats_map(struct __sk_buff* skb, \
- bool egress, TypeOfKey* key) { \
- StatsValue* value = bpf_##the_stats_map##_lookup_elem(key); \
- if (!value) { \
- StatsValue newValue = {}; \
- bpf_##the_stats_map##_update_elem(key, &newValue, BPF_NOEXIST); \
- value = bpf_##the_stats_map##_lookup_elem(key); \
- } \
- if (value) { \
- const int mtu = 1500; \
- uint64_t packets = 1; \
- uint64_t bytes = skb->len; \
- if (bytes > mtu) { \
- bool is_ipv6 = (skb->protocol == htons(ETH_P_IPV6)); \
- int ip_overhead = (is_ipv6 ? sizeof(struct ipv6hdr) : sizeof(struct iphdr)); \
- int tcp_overhead = ip_overhead + sizeof(struct tcphdr) + 12; \
- int mss = mtu - tcp_overhead; \
- uint64_t payload = bytes - tcp_overhead; \
- packets = (payload + mss - 1) / mss; \
- bytes = tcp_overhead * packets + payload; \
- } \
- if (egress) { \
- __sync_fetch_and_add(&value->txPackets, packets); \
- __sync_fetch_and_add(&value->txBytes, bytes); \
- } else { \
- __sync_fetch_and_add(&value->rxPackets, packets); \
- __sync_fetch_and_add(&value->rxBytes, bytes); \
- } \
- } \
+#define DEFINE_UPDATE_STATS(the_stats_map, TypeOfKey) \
+ static __always_inline inline void update_##the_stats_map(const struct __sk_buff* const skb, \
+ const TypeOfKey* const key, \
+ const bool egress, \
+ const unsigned kver) { \
+ StatsValue* value = bpf_##the_stats_map##_lookup_elem(key); \
+ if (!value) { \
+ StatsValue newValue = {}; \
+ bpf_##the_stats_map##_update_elem(key, &newValue, BPF_NOEXIST); \
+ value = bpf_##the_stats_map##_lookup_elem(key); \
+ } \
+ if (value) { \
+ const int mtu = 1500; \
+ uint64_t packets = 1; \
+ uint64_t bytes = skb->len; \
+ if (bytes > mtu) { \
+ bool is_ipv6 = (skb->protocol == htons(ETH_P_IPV6)); \
+ int ip_overhead = (is_ipv6 ? sizeof(struct ipv6hdr) : sizeof(struct iphdr)); \
+ int tcp_overhead = ip_overhead + sizeof(struct tcphdr) + 12; \
+ int mss = mtu - tcp_overhead; \
+ uint64_t payload = bytes - tcp_overhead; \
+ packets = (payload + mss - 1) / mss; \
+ bytes = tcp_overhead * packets + payload; \
+ } \
+ if (egress) { \
+ __sync_fetch_and_add(&value->txPackets, packets); \
+ __sync_fetch_and_add(&value->txBytes, bytes); \
+ } else { \
+ __sync_fetch_and_add(&value->rxPackets, packets); \
+ __sync_fetch_and_add(&value->rxBytes, bytes); \
+ } \
+ } \
}
DEFINE_UPDATE_STATS(app_uid_stats_map, uint32_t)
@@ -300,7 +298,8 @@
bpf_packet_trace_ringbuf_submit(pkt);
}
-static __always_inline inline bool skip_owner_match(struct __sk_buff* skb, const unsigned kver) {
+static __always_inline inline bool skip_owner_match(struct __sk_buff* skb, bool egress,
+ const unsigned kver) {
uint32_t flag = 0;
if (skb->protocol == htons(ETH_P_IP)) {
uint8_t proto;
@@ -330,7 +329,8 @@
} else {
return false;
}
- return flag & TCP_FLAG_RST; // false on read failure
+ // Always allow RST's, and additionally allow ingress FINs
+ return flag & (TCP_FLAG_RST | (egress ? 0 : TCP_FLAG_FIN)); // false on read failure
}
static __always_inline inline BpfConfig getConfig(uint32_t configKey) {
@@ -352,7 +352,7 @@
bool egress, const unsigned kver) {
if (is_system_uid(uid)) return PASS;
- if (skip_owner_match(skb, kver)) return PASS;
+ if (skip_owner_match(skb, egress, kver)) return PASS;
BpfConfig enabledRules = getConfig(UID_RULES_CONFIGURATION_KEY);
@@ -383,12 +383,15 @@
return PASS;
}
-static __always_inline inline void update_stats_with_config(struct __sk_buff* skb, bool egress,
- StatsKey* key, uint32_t selectedMap) {
+static __always_inline inline void update_stats_with_config(const uint32_t selectedMap,
+ const struct __sk_buff* const skb,
+ const StatsKey* const key,
+ const bool egress,
+ const unsigned kver) {
if (selectedMap == SELECT_MAP_A) {
- update_stats_map_A(skb, egress, key);
+ update_stats_map_A(skb, key, egress, kver);
} else {
- update_stats_map_B(skb, egress, key);
+ update_stats_map_B(skb, key, egress, kver);
}
}
@@ -409,10 +412,8 @@
// Always allow and never count clat traffic. Only the IPv4 traffic on the stacked
// interface is accounted for and subject to usage restrictions.
- // TODO: remove sock_uid check once Nat464Xlat javaland adds the socket tag AID_CLAT for clat.
- if (sock_uid == AID_CLAT || uid == AID_CLAT) {
- return PASS;
- }
+ // CLAT IPv6 TX sockets are *always* tagged with CLAT uid, see tagSocketAsClat()
+ if (uid == AID_CLAT) return PASS;
int match = bpf_owner_match(skb, sock_uid, egress, kver);
@@ -438,22 +439,17 @@
uint32_t mapSettingKey = CURRENT_STATS_MAP_CONFIGURATION_KEY;
uint32_t* selectedMap = bpf_configuration_map_lookup_elem(&mapSettingKey);
- // Use asm("%0 &= 1" : "+r"(match)) before return match,
- // to help kernel's bpf verifier, so that it can be 100% certain
- // that the returned value is always BPF_NOMATCH(0) or BPF_MATCH(1).
- if (!selectedMap) {
- asm("%0 &= 1" : "+r"(match));
- return match;
- }
-
- if (key.tag) {
- update_stats_with_config(skb, egress, &key, *selectedMap);
- key.tag = 0;
- }
+ if (!selectedMap) return PASS; // cannot happen, needed to keep bpf verifier happy
do_packet_tracing(skb, egress, uid, tag, enable_tracing, kver);
- update_stats_with_config(skb, egress, &key, *selectedMap);
- update_app_uid_stats_map(skb, egress, &uid);
+ update_stats_with_config(*selectedMap, skb, &key, egress, kver);
+ update_app_uid_stats_map(skb, &uid, egress, kver);
+
+ // We've already handled DROP_UNLESS_DNS up above, thus when we reach here the only
+ // possible values of match are DROP(0) or PASS(1), however we need to use
+ // "match &= 1" before 'return match' to help the kernel's bpf verifier,
+ // so that it can be 100% certain that the returned value is always 0 or 1.
+ // We use assembly so that it cannot be optimized out by a too smart compiler.
asm("%0 &= 1" : "+r"(match));
return match;
}
@@ -504,9 +500,8 @@
// Clat daemon does not generate new traffic, all its traffic is accounted for already
// on the v4-* interfaces (except for the 20 (or 28) extra bytes of IPv6 vs IPv4 overhead,
// but that can be corrected for later when merging v4-foo stats into interface foo's).
- // TODO: remove sock_uid check once Nat464Xlat javaland adds the socket tag AID_CLAT for clat.
+ // CLAT sockets are created by system server and tagged as uid CLAT, see tagSocketAsClat()
uint32_t sock_uid = bpf_get_socket_uid(skb);
- if (sock_uid == AID_CLAT) return BPF_NOMATCH;
if (sock_uid == AID_SYSTEM) {
uint64_t cookie = bpf_get_socket_cookie(skb);
UidTagValue* utag = bpf_cookie_tag_map_lookup_elem(&cookie);
@@ -514,7 +509,7 @@
}
uint32_t key = skb->ifindex;
- update_iface_stats_map(skb, EGRESS, &key);
+ update_iface_stats_map(skb, &key, EGRESS, KVER_NONE);
return BPF_MATCH;
}
@@ -527,7 +522,7 @@
// Keep that in mind when moving this out of iptables xt_bpf and into tc ingress (or xdp).
uint32_t key = skb->ifindex;
- update_iface_stats_map(skb, INGRESS, &key);
+ update_iface_stats_map(skb, &key, INGRESS, KVER_NONE);
return BPF_MATCH;
}
@@ -537,7 +532,7 @@
if (is_received_skb(skb)) {
// Account for ingress traffic before tc drops it.
uint32_t key = skb->ifindex;
- update_iface_stats_map(skb, INGRESS, &key);
+ update_iface_stats_map(skb, &key, INGRESS, KVER_NONE);
}
return TC_ACT_UNSPEC;
}
@@ -592,3 +587,4 @@
LICENSE("Apache 2.0");
CRITICAL("Connectivity and netd");
+DISABLE_BTF_ON_USER_BUILDS();
diff --git a/bpf_progs/offload.c b/bpf_progs/offload.c
index a8612df..8645dd7 100644
--- a/bpf_progs/offload.c
+++ b/bpf_progs/offload.c
@@ -38,13 +38,7 @@
// Warning: values other than AID_ROOT don't work for map uid on BpfLoader < v0.21
#define TETHERING_UID AID_ROOT
-#ifdef INPROCESS
-#define DEFAULT_BPF_MAP_SELINUX_CONTEXT "fs_bpf_net_shared"
-#define DEFAULT_BPF_PROG_SELINUX_CONTEXT "fs_bpf_net_shared"
-#define TETHERING_GID AID_SYSTEM
-#else
#define TETHERING_GID AID_NETWORK_STACK
-#endif
#include "bpf_helpers.h"
#include "bpf_net_helpers.h"
@@ -131,7 +125,7 @@
TETHERING_GID)
static inline __always_inline int do_forward6(struct __sk_buff* skb, const bool is_ethernet,
- const bool downstream) {
+ const bool downstream, const unsigned kver) {
// Must be meta-ethernet IPv6 frame
if (skb->protocol != htons(ETH_P_IPV6)) return TC_ACT_PIPE;
@@ -232,13 +226,13 @@
// This would require a much newer kernel with newer ebpf accessors.
// (This is also blindly assuming 12 bytes of tcp timestamp option in tcp header)
uint64_t packets = 1;
- uint64_t bytes = skb->len;
- if (bytes > v->pmtu) {
- const int tcp_overhead = sizeof(struct ipv6hdr) + sizeof(struct tcphdr) + 12;
- const int mss = v->pmtu - tcp_overhead;
- const uint64_t payload = bytes - tcp_overhead;
+ uint64_t L3_bytes = skb->len - l2_header_size;
+ if (L3_bytes > v->pmtu) {
+ const int tcp6_overhead = sizeof(struct ipv6hdr) + sizeof(struct tcphdr) + 12;
+ const int mss = v->pmtu - tcp6_overhead;
+ const uint64_t payload = L3_bytes - tcp6_overhead;
packets = (payload + mss - 1) / mss;
- bytes = tcp_overhead * packets + payload;
+ L3_bytes = tcp6_overhead * packets + payload;
}
// Are we past the limit? If so, then abort...
@@ -247,7 +241,7 @@
// a packet we let the core stack deal with things.
// (The core stack needs to handle limits correctly anyway,
// since we don't offload all traffic in both directions)
- if (stat_v->rxBytes + stat_v->txBytes + bytes > *limit_v) TC_PUNT(LIMIT_REACHED);
+ if (stat_v->rxBytes + stat_v->txBytes + L3_bytes > *limit_v) TC_PUNT(LIMIT_REACHED);
if (!is_ethernet) {
// Try to inject an ethernet header, and simply return if we fail.
@@ -287,7 +281,7 @@
bpf_csum_update(skb, 0xFFFF - ntohs(old_hl) + ntohs(new_hl));
__sync_fetch_and_add(downstream ? &stat_v->rxPackets : &stat_v->txPackets, packets);
- __sync_fetch_and_add(downstream ? &stat_v->rxBytes : &stat_v->txBytes, bytes);
+ __sync_fetch_and_add(downstream ? &stat_v->rxBytes : &stat_v->txBytes, L3_bytes);
// Overwrite any mac header with the new one
// For a rawip tx interface it will simply be a bunch of zeroes and later stripped.
@@ -305,13 +299,13 @@
DEFINE_BPF_PROG("schedcls/tether_downstream6_ether", TETHERING_UID, TETHERING_GID,
sched_cls_tether_downstream6_ether)
(struct __sk_buff* skb) {
- return do_forward6(skb, /* is_ethernet */ true, /* downstream */ true);
+ return do_forward6(skb, ETHER, DOWNSTREAM, KVER_NONE);
}
DEFINE_BPF_PROG("schedcls/tether_upstream6_ether", TETHERING_UID, TETHERING_GID,
sched_cls_tether_upstream6_ether)
(struct __sk_buff* skb) {
- return do_forward6(skb, /* is_ethernet */ true, /* downstream */ false);
+ return do_forward6(skb, ETHER, UPSTREAM, KVER_NONE);
}
// Note: section names must be unique to prevent programs from appending to each other,
@@ -331,13 +325,13 @@
DEFINE_BPF_PROG_KVER("schedcls/tether_downstream6_rawip$4_14", TETHERING_UID, TETHERING_GID,
sched_cls_tether_downstream6_rawip_4_14, KVER(4, 14, 0))
(struct __sk_buff* skb) {
- return do_forward6(skb, /* is_ethernet */ false, /* downstream */ true);
+ return do_forward6(skb, RAWIP, DOWNSTREAM, KVER(4, 14, 0));
}
DEFINE_BPF_PROG_KVER("schedcls/tether_upstream6_rawip$4_14", TETHERING_UID, TETHERING_GID,
sched_cls_tether_upstream6_rawip_4_14, KVER(4, 14, 0))
(struct __sk_buff* skb) {
- return do_forward6(skb, /* is_ethernet */ false, /* downstream */ false);
+ return do_forward6(skb, RAWIP, UPSTREAM, KVER(4, 14, 0));
}
// and define no-op stubs for pre-4.14 kernels.
@@ -362,7 +356,8 @@
static inline __always_inline int do_forward4_bottom(struct __sk_buff* skb,
const int l2_header_size, void* data, const void* data_end,
struct ethhdr* eth, struct iphdr* ip, const bool is_ethernet,
- const bool downstream, const bool updatetime, const bool is_tcp) {
+ const bool downstream, const bool updatetime, const bool is_tcp,
+ const unsigned kver) {
struct tcphdr* tcph = is_tcp ? (void*)(ip + 1) : NULL;
struct udphdr* udph = is_tcp ? NULL : (void*)(ip + 1);
@@ -449,13 +444,13 @@
// This would require a much newer kernel with newer ebpf accessors.
// (This is also blindly assuming 12 bytes of tcp timestamp option in tcp header)
uint64_t packets = 1;
- uint64_t bytes = skb->len;
- if (bytes > v->pmtu) {
- const int tcp_overhead = sizeof(struct iphdr) + sizeof(struct tcphdr) + 12;
- const int mss = v->pmtu - tcp_overhead;
- const uint64_t payload = bytes - tcp_overhead;
+ uint64_t L3_bytes = skb->len - l2_header_size;
+ if (L3_bytes > v->pmtu) {
+ const int tcp4_overhead = sizeof(struct iphdr) + sizeof(struct tcphdr) + 12;
+ const int mss = v->pmtu - tcp4_overhead;
+ const uint64_t payload = L3_bytes - tcp4_overhead;
packets = (payload + mss - 1) / mss;
- bytes = tcp_overhead * packets + payload;
+ L3_bytes = tcp4_overhead * packets + payload;
}
// Are we past the limit? If so, then abort...
@@ -464,7 +459,7 @@
// a packet we let the core stack deal with things.
// (The core stack needs to handle limits correctly anyway,
// since we don't offload all traffic in both directions)
- if (stat_v->rxBytes + stat_v->txBytes + bytes > *limit_v) TC_PUNT(LIMIT_REACHED);
+ if (stat_v->rxBytes + stat_v->txBytes + L3_bytes > *limit_v) TC_PUNT(LIMIT_REACHED);
if (!is_ethernet) {
// Try to inject an ethernet header, and simply return if we fail.
@@ -540,7 +535,7 @@
if (updatetime) v->last_used = bpf_ktime_get_boot_ns();
__sync_fetch_and_add(downstream ? &stat_v->rxPackets : &stat_v->txPackets, packets);
- __sync_fetch_and_add(downstream ? &stat_v->rxBytes : &stat_v->txBytes, bytes);
+ __sync_fetch_and_add(downstream ? &stat_v->rxBytes : &stat_v->txBytes, L3_bytes);
// Redirect to forwarded interface.
//
@@ -552,7 +547,7 @@
}
static inline __always_inline int do_forward4(struct __sk_buff* skb, const bool is_ethernet,
- const bool downstream, const bool updatetime) {
+ const bool downstream, const bool updatetime, const unsigned kver) {
// Require ethernet dst mac address to be our unicast address.
if (is_ethernet && (skb->pkt_type != PACKET_HOST)) return TC_ACT_PIPE;
@@ -640,10 +635,10 @@
// if the underlying requisite kernel support (bpf_ktime_get_boot_ns) was backported.
if (is_tcp) {
return do_forward4_bottom(skb, l2_header_size, data, data_end, eth, ip,
- is_ethernet, downstream, updatetime, /* is_tcp */ true);
+ is_ethernet, downstream, updatetime, /* is_tcp */ true, kver);
} else {
return do_forward4_bottom(skb, l2_header_size, data, data_end, eth, ip,
- is_ethernet, downstream, updatetime, /* is_tcp */ false);
+ is_ethernet, downstream, updatetime, /* is_tcp */ false, kver);
}
}
@@ -652,25 +647,25 @@
DEFINE_BPF_PROG_KVER("schedcls/tether_downstream4_rawip$5_8", TETHERING_UID, TETHERING_GID,
sched_cls_tether_downstream4_rawip_5_8, KVER(5, 8, 0))
(struct __sk_buff* skb) {
- return do_forward4(skb, /* is_ethernet */ false, /* downstream */ true, /* updatetime */ true);
+ return do_forward4(skb, RAWIP, DOWNSTREAM, UPDATETIME, KVER(5, 8, 0));
}
DEFINE_BPF_PROG_KVER("schedcls/tether_upstream4_rawip$5_8", TETHERING_UID, TETHERING_GID,
sched_cls_tether_upstream4_rawip_5_8, KVER(5, 8, 0))
(struct __sk_buff* skb) {
- return do_forward4(skb, /* is_ethernet */ false, /* downstream */ false, /* updatetime */ true);
+ return do_forward4(skb, RAWIP, UPSTREAM, UPDATETIME, KVER(5, 8, 0));
}
DEFINE_BPF_PROG_KVER("schedcls/tether_downstream4_ether$5_8", TETHERING_UID, TETHERING_GID,
sched_cls_tether_downstream4_ether_5_8, KVER(5, 8, 0))
(struct __sk_buff* skb) {
- return do_forward4(skb, /* is_ethernet */ true, /* downstream */ true, /* updatetime */ true);
+ return do_forward4(skb, ETHER, DOWNSTREAM, UPDATETIME, KVER(5, 8, 0));
}
DEFINE_BPF_PROG_KVER("schedcls/tether_upstream4_ether$5_8", TETHERING_UID, TETHERING_GID,
sched_cls_tether_upstream4_ether_5_8, KVER(5, 8, 0))
(struct __sk_buff* skb) {
- return do_forward4(skb, /* is_ethernet */ true, /* downstream */ false, /* updatetime */ true);
+ return do_forward4(skb, ETHER, UPSTREAM, UPDATETIME, KVER(5, 8, 0));
}
// Full featured (optional) implementations for 4.14-S, 4.19-S & 5.4-S kernels
@@ -681,7 +676,7 @@
sched_cls_tether_downstream4_rawip_opt,
KVER(4, 14, 0), KVER(5, 8, 0))
(struct __sk_buff* skb) {
- return do_forward4(skb, /* is_ethernet */ false, /* downstream */ true, /* updatetime */ true);
+ return do_forward4(skb, RAWIP, DOWNSTREAM, UPDATETIME, KVER(4, 14, 0));
}
DEFINE_OPTIONAL_BPF_PROG_KVER_RANGE("schedcls/tether_upstream4_rawip$opt",
@@ -689,7 +684,7 @@
sched_cls_tether_upstream4_rawip_opt,
KVER(4, 14, 0), KVER(5, 8, 0))
(struct __sk_buff* skb) {
- return do_forward4(skb, /* is_ethernet */ false, /* downstream */ false, /* updatetime */ true);
+ return do_forward4(skb, RAWIP, UPSTREAM, UPDATETIME, KVER(4, 14, 0));
}
DEFINE_OPTIONAL_BPF_PROG_KVER_RANGE("schedcls/tether_downstream4_ether$opt",
@@ -697,7 +692,7 @@
sched_cls_tether_downstream4_ether_opt,
KVER(4, 14, 0), KVER(5, 8, 0))
(struct __sk_buff* skb) {
- return do_forward4(skb, /* is_ethernet */ true, /* downstream */ true, /* updatetime */ true);
+ return do_forward4(skb, ETHER, DOWNSTREAM, UPDATETIME, KVER(4, 14, 0));
}
DEFINE_OPTIONAL_BPF_PROG_KVER_RANGE("schedcls/tether_upstream4_ether$opt",
@@ -705,7 +700,7 @@
sched_cls_tether_upstream4_ether_opt,
KVER(4, 14, 0), KVER(5, 8, 0))
(struct __sk_buff* skb) {
- return do_forward4(skb, /* is_ethernet */ true, /* downstream */ false, /* updatetime */ true);
+ return do_forward4(skb, ETHER, UPSTREAM, UPDATETIME, KVER(4, 14, 0));
}
// Partial (TCP-only: will not update 'last_used' field) implementations for 4.14+ kernels.
@@ -725,13 +720,13 @@
DEFINE_BPF_PROG_KVER_RANGE("schedcls/tether_downstream4_rawip$5_4", TETHERING_UID, TETHERING_GID,
sched_cls_tether_downstream4_rawip_5_4, KVER(5, 4, 0), KVER(5, 8, 0))
(struct __sk_buff* skb) {
- return do_forward4(skb, /* is_ethernet */ false, /* downstream */ true, /* updatetime */ false);
+ return do_forward4(skb, RAWIP, DOWNSTREAM, NO_UPDATETIME, KVER(5, 4, 0));
}
DEFINE_BPF_PROG_KVER_RANGE("schedcls/tether_upstream4_rawip$5_4", TETHERING_UID, TETHERING_GID,
sched_cls_tether_upstream4_rawip_5_4, KVER(5, 4, 0), KVER(5, 8, 0))
(struct __sk_buff* skb) {
- return do_forward4(skb, /* is_ethernet */ false, /* downstream */ false, /* updatetime */ false);
+ return do_forward4(skb, RAWIP, UPSTREAM, NO_UPDATETIME, KVER(5, 4, 0));
}
// RAWIP: Optional for 4.14/4.19 (R) kernels -- which support bpf_skb_change_head().
@@ -742,7 +737,7 @@
sched_cls_tether_downstream4_rawip_4_14,
KVER(4, 14, 0), KVER(5, 4, 0))
(struct __sk_buff* skb) {
- return do_forward4(skb, /* is_ethernet */ false, /* downstream */ true, /* updatetime */ false);
+ return do_forward4(skb, RAWIP, DOWNSTREAM, NO_UPDATETIME, KVER(4, 14, 0));
}
DEFINE_OPTIONAL_BPF_PROG_KVER_RANGE("schedcls/tether_upstream4_rawip$4_14",
@@ -750,7 +745,7 @@
sched_cls_tether_upstream4_rawip_4_14,
KVER(4, 14, 0), KVER(5, 4, 0))
(struct __sk_buff* skb) {
- return do_forward4(skb, /* is_ethernet */ false, /* downstream */ false, /* updatetime */ false);
+ return do_forward4(skb, RAWIP, UPSTREAM, NO_UPDATETIME, KVER(4, 14, 0));
}
// ETHER: Required for 4.14-Q/R, 4.19-Q/R & 5.4-R kernels.
@@ -758,13 +753,13 @@
DEFINE_BPF_PROG_KVER_RANGE("schedcls/tether_downstream4_ether$4_14", TETHERING_UID, TETHERING_GID,
sched_cls_tether_downstream4_ether_4_14, KVER(4, 14, 0), KVER(5, 8, 0))
(struct __sk_buff* skb) {
- return do_forward4(skb, /* is_ethernet */ true, /* downstream */ true, /* updatetime */ false);
+ return do_forward4(skb, ETHER, DOWNSTREAM, NO_UPDATETIME, KVER(4, 14, 0));
}
DEFINE_BPF_PROG_KVER_RANGE("schedcls/tether_upstream4_ether$4_14", TETHERING_UID, TETHERING_GID,
sched_cls_tether_upstream4_ether_4_14, KVER(4, 14, 0), KVER(5, 8, 0))
(struct __sk_buff* skb) {
- return do_forward4(skb, /* is_ethernet */ true, /* downstream */ false, /* updatetime */ false);
+ return do_forward4(skb, ETHER, UPSTREAM, NO_UPDATETIME, KVER(4, 14, 0));
}
// Placeholder (no-op) implementations for older Q kernels
@@ -820,9 +815,9 @@
if ((void*)(eth + 1) > data_end) return XDP_PASS;
if (eth->h_proto == htons(ETH_P_IPV6))
- return do_xdp_forward6(ctx, /* is_ethernet */ true, downstream);
+ return do_xdp_forward6(ctx, ETHER, downstream);
if (eth->h_proto == htons(ETH_P_IP))
- return do_xdp_forward4(ctx, /* is_ethernet */ true, downstream);
+ return do_xdp_forward4(ctx, ETHER, downstream);
// Anything else we don't know how to handle...
return XDP_PASS;
@@ -836,8 +831,8 @@
if (data_end - data < 1) return XDP_PASS;
const uint8_t v = (*(uint8_t*)data) >> 4;
- if (v == 6) return do_xdp_forward6(ctx, /* is_ethernet */ false, downstream);
- if (v == 4) return do_xdp_forward4(ctx, /* is_ethernet */ false, downstream);
+ if (v == 6) return do_xdp_forward6(ctx, RAWIP, downstream);
+ if (v == 4) return do_xdp_forward4(ctx, RAWIP, downstream);
// Anything else we don't know how to handle...
return XDP_PASS;
@@ -848,23 +843,24 @@
DEFINE_XDP_PROG("xdp/tether_downstream_ether",
xdp_tether_downstream_ether) {
- return do_xdp_forward_ether(ctx, /* downstream */ true);
+ return do_xdp_forward_ether(ctx, DOWNSTREAM);
}
DEFINE_XDP_PROG("xdp/tether_downstream_rawip",
xdp_tether_downstream_rawip) {
- return do_xdp_forward_rawip(ctx, /* downstream */ true);
+ return do_xdp_forward_rawip(ctx, DOWNSTREAM);
}
DEFINE_XDP_PROG("xdp/tether_upstream_ether",
xdp_tether_upstream_ether) {
- return do_xdp_forward_ether(ctx, /* downstream */ false);
+ return do_xdp_forward_ether(ctx, UPSTREAM);
}
DEFINE_XDP_PROG("xdp/tether_upstream_rawip",
xdp_tether_upstream_rawip) {
- return do_xdp_forward_rawip(ctx, /* downstream */ false);
+ return do_xdp_forward_rawip(ctx, UPSTREAM);
}
LICENSE("Apache 2.0");
CRITICAL("Connectivity (Tethering)");
+DISABLE_BTF_ON_USER_BUILDS();
diff --git a/bpf_progs/offload@inprocess.c b/bpf_progs/offload@inprocess.c
deleted file mode 120000
index 4092e0d..0000000
--- a/bpf_progs/offload@inprocess.c
+++ /dev/null
@@ -1 +0,0 @@
-offload.c
\ No newline at end of file
diff --git a/bpf_progs/test.c b/bpf_progs/test.c
index d1f780f..68469c8 100644
--- a/bpf_progs/test.c
+++ b/bpf_progs/test.c
@@ -32,13 +32,7 @@
// Warning: values other than AID_ROOT don't work for map uid on BpfLoader < v0.21
#define TETHERING_UID AID_ROOT
-#ifdef INPROCESS
-#define DEFAULT_BPF_MAP_SELINUX_CONTEXT "fs_bpf_net_shared"
-#define DEFAULT_BPF_PROG_SELINUX_CONTEXT "fs_bpf_net_shared"
-#define TETHERING_GID AID_SYSTEM
-#else
#define TETHERING_GID AID_NETWORK_STACK
-#endif
// This is non production code, only used for testing
// Needed because the bitmap array definition is non-kosher for pre-T OS devices.
@@ -73,3 +67,4 @@
}
LICENSE("Apache 2.0");
+DISABLE_BTF_ON_USER_BUILDS();
diff --git a/bpf_progs/test@inprocess.c b/bpf_progs/test@inprocess.c
deleted file mode 120000
index aeebb26..0000000
--- a/bpf_progs/test@inprocess.c
+++ /dev/null
@@ -1 +0,0 @@
-test.c
\ No newline at end of file
diff --git a/common/Android.bp b/common/Android.bp
index 729ef32..ff4de11 100644
--- a/common/Android.bp
+++ b/common/Android.bp
@@ -25,7 +25,7 @@
"src/com/android/net/module/util/bpf/*.java",
],
sdk_version: "module_current",
- min_sdk_version: "29",
+ min_sdk_version: "30",
visibility: [
// Do not add any lib. This library is only shared inside connectivity module
// and its tests.
diff --git a/framework-t/Android.bp b/framework-t/Android.bp
index 7ef20c5..ffa2857 100644
--- a/framework-t/Android.bp
+++ b/framework-t/Android.bp
@@ -46,6 +46,7 @@
libs: [
"unsupportedappusage",
"app-compat-annotations",
+ "androidx.annotation_annotation",
],
impl_only_libs: [
// The build system will use framework-bluetooth module_current stubs, because
@@ -139,7 +140,7 @@
"//packages/modules/Connectivity/apex",
"//packages/modules/Connectivity/service", // For R8 only
"//packages/modules/Connectivity/service-t",
- "//packages/modules/Connectivity/nearby/service",
+ "//packages/modules/Connectivity/nearby:__subpackages__",
"//frameworks/base",
// Tests using hidden APIs
@@ -156,7 +157,6 @@
"//frameworks/opt/telephony/tests/telephonytests",
"//packages/modules/CaptivePortalLogin/tests",
"//packages/modules/Connectivity/Tethering/tests:__subpackages__",
- "//packages/modules/Connectivity/nearby/tests:__subpackages__",
"//packages/modules/Connectivity/tests:__subpackages__",
"//packages/modules/IPsec/tests/iketests",
"//packages/modules/NetworkStack/tests:__subpackages__",
diff --git a/framework-t/Sources.bp b/framework-t/Sources.bp
index 391a562..b8eb1f6 100644
--- a/framework-t/Sources.bp
+++ b/framework-t/Sources.bp
@@ -16,15 +16,13 @@
filegroup {
name: "framework-connectivity-tiramisu-updatable-sources",
+ defaults: ["framework-sources-module-defaults"],
srcs: [
"src/**/*.java",
"src/**/*.aidl",
],
path: "src",
- visibility: [
- "//frameworks/base",
- "//packages/modules/Connectivity:__subpackages__",
- ],
+ visibility: ["//packages/modules/Connectivity:__subpackages__"],
}
cc_library_shared {
diff --git a/framework-t/src/android/net/NetworkIdentity.java b/framework-t/src/android/net/NetworkIdentity.java
index edfd21c..947a092 100644
--- a/framework-t/src/android/net/NetworkIdentity.java
+++ b/framework-t/src/android/net/NetworkIdentity.java
@@ -32,6 +32,7 @@
import android.net.wifi.WifiInfo;
import android.service.NetworkIdentityProto;
import android.telephony.TelephonyManager;
+import android.util.Log;
import android.util.proto.ProtoOutputStream;
import com.android.net.module.util.BitUtils;
@@ -406,10 +407,18 @@
setOemManaged(getOemBitfield(snapshot.getNetworkCapabilities()));
if (mType == TYPE_WIFI) {
- final TransportInfo transportInfo = snapshot.getNetworkCapabilities()
- .getTransportInfo();
+ final NetworkCapabilities nc = snapshot.getNetworkCapabilities();
+ final TransportInfo transportInfo = nc.getTransportInfo();
if (transportInfo instanceof WifiInfo) {
final WifiInfo info = (WifiInfo) transportInfo;
+ // Log.wtf to catch trying to set a null wifiNetworkKey into NetworkIdentity.
+ // See b/266598304. The problematic data that has null wifi network key is
+ // thrown out when storing data, which is handled by the service.
+ if (info.getNetworkKey() == null) {
+ Log.wtf(TAG, "WifiInfo contains a null wifiNetworkKey and it will"
+ + " be set into NetworkIdentity, netId=" + snapshot.getNetwork()
+ + "NetworkCapabilities=" + nc);
+ }
setWifiNetworkKey(info.getNetworkKey());
}
} else if (mType == TYPE_TEST) {
diff --git a/framework-t/src/android/net/NetworkStatsAccess.java b/framework-t/src/android/net/NetworkStatsAccess.java
index 0585756..23902dc 100644
--- a/framework-t/src/android/net/NetworkStatsAccess.java
+++ b/framework-t/src/android/net/NetworkStatsAccess.java
@@ -17,7 +17,6 @@
package android.net;
import static android.Manifest.permission.READ_NETWORK_USAGE_HISTORY;
-import static android.content.pm.PackageManager.PERMISSION_GRANTED;
import static android.net.NetworkStats.UID_ALL;
import static android.net.TrafficStats.UID_REMOVED;
import static android.net.TrafficStats.UID_TETHERING;
@@ -33,6 +32,8 @@
import android.os.UserHandle;
import android.telephony.TelephonyManager;
+import com.android.net.module.util.PermissionUtils;
+
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@@ -100,6 +101,7 @@
* <li>Device owners.
* <li>Carrier-privileged applications.
* <li>The system UID.
+ * <li>NetworkStack application.
* </ul>
*/
int DEVICE = 3;
@@ -125,9 +127,9 @@
final int appId = UserHandle.getAppId(callingUid);
- final boolean isNetworkStack = context.checkPermission(
- android.Manifest.permission.NETWORK_STACK, callingPid, callingUid)
- == PERMISSION_GRANTED;
+ final boolean isNetworkStack = PermissionUtils.checkAnyPermissionOf(
+ context, callingPid, callingUid, android.Manifest.permission.NETWORK_STACK,
+ NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK);
if (hasCarrierPrivileges || isDeviceOwner
|| appId == Process.SYSTEM_UID || isNetworkStack) {
diff --git a/framework-t/src/android/net/NetworkTemplate.java b/framework-t/src/android/net/NetworkTemplate.java
index 55fcc4a..33bd884 100644
--- a/framework-t/src/android/net/NetworkTemplate.java
+++ b/framework-t/src/android/net/NetworkTemplate.java
@@ -47,6 +47,7 @@
import android.os.Build;
import android.os.Parcel;
import android.os.Parcelable;
+import android.text.TextUtils;
import android.util.ArraySet;
import android.util.Log;
@@ -58,7 +59,10 @@
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.Arrays;
+import java.util.Collections;
import java.util.Comparator;
+import java.util.HashSet;
+import java.util.List;
import java.util.Objects;
import java.util.Set;
import java.util.SortedSet;
@@ -180,6 +184,23 @@
}
}
+ private static Set<String> setOf(@Nullable final String item) {
+ if (item == null) {
+ // Set.of will throw if item is null
+ final Set<String> set = new HashSet<>();
+ set.add(null);
+ return Collections.unmodifiableSet(set);
+ } else {
+ return Set.of(item);
+ }
+ }
+
+ private static void throwAtLeastU() {
+ if (SdkLevel.isAtLeastU()) {
+ throw new UnsupportedOperationException("Method not supported on Android U or above");
+ }
+ }
+
/**
* Template to match {@link ConnectivityManager#TYPE_MOBILE} networks with
* the given IMSI.
@@ -192,7 +213,7 @@
publicAlternatives = "Use {@code Builder} instead.")
public static NetworkTemplate buildTemplateMobileAll(@NonNull String subscriberId) {
return new NetworkTemplate.Builder(MATCH_MOBILE).setMeteredness(METERED_YES)
- .setSubscriberIds(Set.of(subscriberId)).build();
+ .setSubscriberIds(setOf(subscriberId)).build();
}
/**
@@ -256,10 +277,9 @@
// TODO(b/270089918): Remove this method. This can only be done after there are no more callers,
// including in OEM code which can access this by linking against the framework.
public static NetworkTemplate buildTemplateBluetooth() {
- if (SdkLevel.isAtLeastU()) {
- throw new UnsupportedOperationException(
- "buildTemplateBluetooth is not supported on Android U devices or above");
- }
+ // TODO : this is part of hidden-o txt, does that mean it should be annotated with
+ // @UnsupportedAppUsage(maxTargetSdk = O) ? If yes, can't throwAtLeastU() lest apps
+ // targeting O- crash on those devices.
return new NetworkTemplate.Builder(MATCH_BLUETOOTH).build();
}
@@ -272,13 +292,97 @@
// TODO(b/270089918): Remove this method. This can only be done after there are no more callers,
// including in OEM code which can access this by linking against the framework.
public static NetworkTemplate buildTemplateProxy() {
- if (SdkLevel.isAtLeastU()) {
- throw new UnsupportedOperationException(
- "buildTemplateProxy is not supported on Android U devices or above");
- }
+ // TODO : this is part of hidden-o txt, does that mean it should be annotated with
+ // @UnsupportedAppUsage(maxTargetSdk = O) ? If yes, can't throwAtLeastU() lest apps
+ // targeting O- crash on those devices.
return new NetworkTemplate(MATCH_PROXY, null, null);
}
+ /**
+ * Template to match all metered carrier networks with the given IMSI.
+ *
+ * @hide
+ */
+ // TODO(b/273963543): Remove this method. This can only be done after there are no more callers,
+ // including in OEM code which can access this by linking against the framework.
+ public static NetworkTemplate buildTemplateCarrierMetered(@NonNull String subscriberId) {
+ throwAtLeastU();
+ return new NetworkTemplate.Builder(MATCH_CARRIER)
+ // Set.of will throw if subscriberId is null, which is the historical
+ // behavior and should be preserved.
+ .setSubscriberIds(Set.of(subscriberId))
+ .setMeteredness(METERED_YES)
+ .build();
+ }
+
+ /**
+ * Template to match cellular networks with the given IMSI, {@code ratType} and
+ * {@code metered}. Use {@link #NETWORK_TYPE_ALL} to include all network types when
+ * filtering. See {@code TelephonyManager.NETWORK_TYPE_*}.
+ *
+ * @hide
+ */
+ // TODO(b/273963543): Remove this method. This can only be done after there are no more callers,
+ // including in OEM code which can access this by linking against the framework.
+ public static NetworkTemplate buildTemplateMobileWithRatType(@Nullable String subscriberId,
+ int ratType, int metered) {
+ throwAtLeastU();
+ return new NetworkTemplate.Builder(MATCH_MOBILE)
+ .setSubscriberIds(TextUtils.isEmpty(subscriberId)
+ ? Collections.emptySet()
+ : Set.of(subscriberId))
+ .setMeteredness(metered)
+ .setRatType(ratType)
+ .build();
+ }
+
+ /**
+ * Template to match {@link ConnectivityManager#TYPE_WIFI} networks with the
+ * given key of the wifi network.
+ *
+ * @param wifiNetworkKey key of the wifi network. see {@link WifiInfo#getNetworkKey()}
+ * to know details about the key.
+ * @hide
+ */
+ // TODO(b/273963543): Remove this method. This can only be done after there are no more callers,
+ // including in OEM code which can access this by linking against the framework.
+ public static NetworkTemplate buildTemplateWifi(@NonNull String wifiNetworkKey) {
+ // TODO : this is part of hidden-o txt, does that mean it should be annotated with
+ // @UnsupportedAppUsage(maxTargetSdk = O) ? If yes, can't throwAtLeastU() lest apps
+ // targeting O- crash on those devices.
+ return new NetworkTemplate.Builder(MATCH_WIFI)
+ // Set.of will throw if wifiNetworkKey is null, which is the historical
+ // behavior and should be preserved.
+ .setWifiNetworkKeys(Set.of(wifiNetworkKey))
+ .build();
+ }
+
+ /**
+ * Template to match all {@link ConnectivityManager#TYPE_WIFI} networks with the given
+ * key of the wifi network and IMSI.
+ *
+ * Call with {@link #WIFI_NETWORK_KEY_ALL} for {@code wifiNetworkKey} to get result regardless
+ * of key of the wifi network.
+ *
+ * @param wifiNetworkKey key of the wifi network. see {@link WifiInfo#getNetworkKey()}
+ * to know details about the key.
+ * @param subscriberId the IMSI associated to this wifi network.
+ *
+ * @hide
+ */
+ // TODO(b/273963543): Remove this method. This can only be done after there are no more callers,
+ // including in OEM code which can access this by linking against the framework.
+ public static NetworkTemplate buildTemplateWifi(@Nullable String wifiNetworkKey,
+ @Nullable String subscriberId) {
+ throwAtLeastU();
+ return new NetworkTemplate.Builder(MATCH_WIFI)
+ .setSubscriberIds(setOf(subscriberId))
+ .setWifiNetworkKeys(wifiNetworkKey == null
+ ? Collections.emptySet()
+ : Set.of(wifiNetworkKey))
+ .build();
+ }
+
private final int mMatchRule;
/**
@@ -311,12 +415,20 @@
// subscriber ID.
case MATCH_CARRIER:
if (matchSubscriberIds.length == 0) {
- throw new IllegalArgumentException("checkValidMatchSubscriberIds with empty"
- + " list of ids for rule" + getMatchRuleName(matchRule));
+ throw new IllegalArgumentException("matchSubscriberIds may not contain"
+ + " null for rule " + getMatchRuleName(matchRule));
}
- // fall through
- case MATCH_MOBILE:
if (CollectionUtils.contains(matchSubscriberIds, null)) {
+ throw new IllegalArgumentException("matchSubscriberIds may not contain"
+ + " null for rule " + getMatchRuleName(matchRule));
+ }
+ break;
+ case MATCH_MOBILE:
+ // Prevent from crash for b/273963543, where the OEMs still call into unsupported
+ // buildTemplateMobileAll with null subscriberId and get crashed.
+ final int firstSdk = Build.VERSION.DEVICE_INITIAL_SDK_INT;
+ if (firstSdk > Build.VERSION_CODES.TIRAMISU
+ && CollectionUtils.contains(matchSubscriberIds, null)) {
throw new IllegalArgumentException("checkValidMatchSubscriberIds list of ids"
+ " may not contain null for rule " + getMatchRuleName(matchRule));
}
@@ -349,10 +461,6 @@
if (matchRule == 6 || matchRule == 7) {
Log.e(TAG, "Use MATCH_MOBILE with empty subscriberIds or MATCH_WIFI with empty "
+ "wifiNetworkKeys instead of template with matchRule=" + matchRule);
- if (SdkLevel.isAtLeastU()) {
- throw new UnsupportedOperationException(
- "Wildcard templates are not supported on Android U devices or above");
- }
}
}
@@ -386,10 +494,9 @@
getMeterednessForBackwardsCompatibility(matchRule),
ROAMING_ALL, DEFAULT_NETWORK_ALL, NETWORK_TYPE_ALL,
OEM_MANAGED_ALL);
- if (SdkLevel.isAtLeastU()) {
- throw new UnsupportedOperationException(
- "This constructor is not supported on Android U devices or above");
- }
+ // TODO : this is part of hidden-o txt, does that mean it should be annotated with
+ // @UnsupportedAppUsage(maxTargetSdk = O) ? If yes, can't throwAtLeastU() lest apps
+ // targeting O- crash on those devices.
}
/** @hide */
@@ -404,10 +511,7 @@
this(getBackwardsCompatibleMatchRule(matchRule),
matchSubscriberIds == null ? new String[]{} : matchSubscriberIds,
matchWifiNetworkKeys, metered, roaming, defaultNetwork, ratType, oemManaged);
- if (SdkLevel.isAtLeastU()) {
- throw new UnsupportedOperationException(
- "This constructor is not supported on Android U devices or above");
- }
+ throwAtLeastU();
}
/** @hide */
@@ -514,10 +618,9 @@
// including in OEM code which can access this by linking against the framework.
/** @hide */
public boolean isMatchRuleMobile() {
- if (SdkLevel.isAtLeastU()) {
- throw new UnsupportedOperationException(
- "isMatchRuleMobile is not supported on Android U devices or above");
- }
+ // TODO : this is part of hidden-o txt, does that mean it should be annotated with
+ // @UnsupportedAppUsage(maxTargetSdk = O) ? If yes, can't throwAtLeastU() lest apps
+ // targeting O- crash on those devices.
switch (mMatchRule) {
case MATCH_MOBILE:
// Old MATCH_MOBILE_WILDCARD
@@ -700,7 +803,15 @@
* to know details about the key.
*/
private boolean matchesWifiNetworkKey(@NonNull String wifiNetworkKey) {
- Objects.requireNonNull(wifiNetworkKey);
+ // Note that this code accepts null wifi network keys because of a past bug where wifi
+ // code was sending a null network key for some connected networks, which isn't expected
+ // and ended up stored in the data on many devices.
+ // A null network key in the data matches a wildcard template (one where
+ // {@code mMatchWifiNetworkKeys} is empty), but not one where {@code MatchWifiNetworkKeys}
+ // contains null. See b/266598304.
+ if (wifiNetworkKey == null) {
+ return CollectionUtils.isEmpty(mMatchWifiNetworkKeys);
+ }
return CollectionUtils.isEmpty(mMatchWifiNetworkKeys)
|| CollectionUtils.contains(mMatchWifiNetworkKeys, wifiNetworkKey);
}
@@ -822,8 +933,7 @@
* subscribers.
* <p>
* For example, given an incoming template matching B, and the currently
- * active merge set [A,B], we'd return a new template that primarily matches
- * A, but also matches B.
+ * active merge set [A,B], we'd return a new template that matches both A and B.
*
* @hide
*/
@@ -832,6 +942,46 @@
+ "Callers should have their own logic to merge template for"
+ " different IMSIs and stop calling this function.")
public static NetworkTemplate normalize(NetworkTemplate template, String[] merged) {
+ return normalizeImpl(template, Collections.singletonList(merged));
+ }
+
+ /**
+ * Examine the given template and normalize it.
+ * We pick the "lowest" merged subscriber as the primary
+ * for key purposes, and expand the template to match all other merged
+ * subscribers.
+ *
+ * There can be multiple merged subscriberIds for multi-SIM devices.
+ *
+ * <p>
+ * For example, given an incoming template matching B, and the currently
+ * active merge set [A,B], we'd return a new template that matches both A and B.
+ *
+ * @hide
+ */
+ // TODO(b/273963543): Remove this method. This can only be done after there are no more callers,
+ // including in OEM code which can access this by linking against the framework.
+ public static NetworkTemplate normalize(NetworkTemplate template, List<String[]> mergedList) {
+ throwAtLeastU();
+ return normalizeImpl(template, mergedList);
+ }
+
+ /**
+ * Examine the given template and normalize it.
+ * We pick the "lowest" merged subscriber as the primary
+ * for key purposes, and expand the template to match all other merged
+ * subscribers.
+ *
+ * There can be multiple merged subscriberIds for multi-SIM devices.
+ *
+ * <p>
+ * For example, given an incoming template matching B, and the currently
+ * active merge set [A,B], we'd return a new template that matches both A and B.
+ *
+ * @hide
+ */
+ private static NetworkTemplate normalizeImpl(NetworkTemplate template,
+ List<String[]> mergedList) {
// Now there are several types of network which uses SubscriberId to store network
// information. For instances:
// The TYPE_WIFI with subscriberId means that it is a merged carrier wifi network.
@@ -839,18 +989,21 @@
if (CollectionUtils.isEmpty(template.mMatchSubscriberIds)) return template;
- if (CollectionUtils.contains(merged, template.mMatchSubscriberIds[0])) {
- // Requested template subscriber is part of the merge group; return
- // a template that matches all merged subscribers.
- final String[] matchWifiNetworkKeys = template.mMatchWifiNetworkKeys;
- // TODO: Use NetworkTemplate.Builder to build a template after NetworkTemplate
- // could handle incompatible subscriberIds. See b/217805241.
- return new NetworkTemplate(template.mMatchRule, merged,
- CollectionUtils.isEmpty(matchWifiNetworkKeys)
- ? new String[0] : new String[] { matchWifiNetworkKeys[0] },
- (template.mMatchRule == MATCH_MOBILE || template.mMatchRule == MATCH_CARRIER)
- ? METERED_YES : METERED_ALL,
- ROAMING_ALL, DEFAULT_NETWORK_ALL, NETWORK_TYPE_ALL, OEM_MANAGED_ALL);
+ for (String[] merged : mergedList) {
+ if (CollectionUtils.contains(merged, template.mMatchSubscriberIds[0])) {
+ // Requested template subscriber is part of the merge group; return
+ // a template that matches all merged subscribers.
+ final String[] matchWifiNetworkKeys = template.mMatchWifiNetworkKeys;
+ // TODO: Use NetworkTemplate.Builder to build a template after NetworkTemplate
+ // could handle incompatible subscriberIds. See b/217805241.
+ return new NetworkTemplate(template.mMatchRule, merged,
+ CollectionUtils.isEmpty(matchWifiNetworkKeys)
+ ? new String[0] : new String[] { matchWifiNetworkKeys[0] },
+ (template.mMatchRule == MATCH_MOBILE
+ || template.mMatchRule == MATCH_CARRIER)
+ ? METERED_YES : METERED_ALL,
+ ROAMING_ALL, DEFAULT_NETWORK_ALL, NETWORK_TYPE_ALL, OEM_MANAGED_ALL);
+ }
}
return template;
diff --git a/framework-t/src/android/net/nsd/INsdManager.aidl b/framework-t/src/android/net/nsd/INsdManager.aidl
index 89e9cdb..9d14b1a 100644
--- a/framework-t/src/android/net/nsd/INsdManager.aidl
+++ b/framework-t/src/android/net/nsd/INsdManager.aidl
@@ -26,5 +26,5 @@
* {@hide}
*/
interface INsdManager {
- INsdServiceConnector connect(INsdManagerCallback cb);
+ INsdServiceConnector connect(INsdManagerCallback cb, boolean useJavaBackend);
}
diff --git a/framework-t/src/android/net/nsd/NsdManager.java b/framework-t/src/android/net/nsd/NsdManager.java
index b4f8897..2930cbd 100644
--- a/framework-t/src/android/net/nsd/NsdManager.java
+++ b/framework-t/src/android/net/nsd/NsdManager.java
@@ -16,6 +16,7 @@
package android.net.nsd;
+import static android.net.connectivity.ConnectivityCompatChanges.ENABLE_PLATFORM_MDNS_BACKEND;
import static android.net.connectivity.ConnectivityCompatChanges.RUN_NATIVE_NSD_ONLY_IF_LEGACY_APPS_T_AND_LATER;
import android.annotation.IntDef;
@@ -280,6 +281,9 @@
EVENT_NAMES.put(UNREGISTER_SERVICE_CALLBACK, "UNREGISTER_SERVICE_CALLBACK");
EVENT_NAMES.put(UNREGISTER_SERVICE_CALLBACK_SUCCEEDED,
"UNREGISTER_SERVICE_CALLBACK_SUCCEEDED");
+ EVENT_NAMES.put(MDNS_DISCOVERY_MANAGER_EVENT, "MDNS_DISCOVERY_MANAGER_EVENT");
+ EVENT_NAMES.put(REGISTER_CLIENT, "REGISTER_CLIENT");
+ EVENT_NAMES.put(UNREGISTER_CLIENT, "UNREGISTER_CLIENT");
}
/** @hide */
@@ -425,6 +429,10 @@
private final DiscoveryListener mWrapped;
private final Executor mWrappedExecutor;
private final ArraySet<TrackedNsdInfo> mFoundInfo = new ArraySet<>();
+ // When this flag is set to true, no further service found or lost callbacks should be
+ // handled. This flag indicates that the network for this DelegatingDiscoveryListener is
+ // lost, and any further callbacks would be redundant.
+ private boolean mAllServicesLost = false;
private DelegatingDiscoveryListener(Network network, DiscoveryListener listener,
Executor executor) {
@@ -441,6 +449,7 @@
serviceInfo.setNetwork(mNetwork);
mWrappedExecutor.execute(() -> mWrapped.onServiceLost(serviceInfo));
}
+ mAllServicesLost = true;
}
@Override
@@ -482,12 +491,22 @@
@Override
public void onServiceFound(NsdServiceInfo serviceInfo) {
+ if (mAllServicesLost) {
+ // This DelegatingDiscoveryListener no longer has a network connection. Ignore
+ // the callback.
+ return;
+ }
mFoundInfo.add(new TrackedNsdInfo(serviceInfo));
mWrappedExecutor.execute(() -> mWrapped.onServiceFound(serviceInfo));
}
@Override
public void onServiceLost(NsdServiceInfo serviceInfo) {
+ if (mAllServicesLost) {
+ // This DelegatingDiscoveryListener no longer has a network connection. Ignore
+ // the callback.
+ return;
+ }
mFoundInfo.remove(new TrackedNsdInfo(serviceInfo));
mWrappedExecutor.execute(() -> mWrapped.onServiceLost(serviceInfo));
}
@@ -510,7 +529,8 @@
mHandler = new ServiceHandler(t.getLooper());
try {
- mService = service.connect(new NsdCallbackImpl(mHandler));
+ mService = service.connect(new NsdCallbackImpl(mHandler), CompatChanges.isChangeEnabled(
+ ENABLE_PLATFORM_MDNS_BACKEND));
} catch (RemoteException e) {
throw new RuntimeException("Failed to connect to NsdService");
}
@@ -1312,7 +1332,7 @@
* before registering other callbacks. Upon failure to register a callback for example if
* it's a duplicated registration, the application is notified through
* {@link ServiceInfoCallback#onServiceInfoCallbackRegistrationFailed} with
- * {@link #FAILURE_BAD_PARAMETERS} or {@link #FAILURE_ALREADY_ACTIVE}.
+ * {@link #FAILURE_BAD_PARAMETERS}.
*
* @param serviceInfo the service to receive updates for
* @param executor Executor to run callbacks with
diff --git a/framework/Android.bp b/framework/Android.bp
index 3950dba..123f02a 100644
--- a/framework/Android.bp
+++ b/framework/Android.bp
@@ -45,14 +45,12 @@
// TODO: use a java_library in the bootclasspath instead
filegroup {
name: "framework-connectivity-sources",
+ defaults: ["framework-sources-module-defaults"],
srcs: [
":framework-connectivity-internal-sources",
":framework-connectivity-aidl-export-sources",
],
- visibility: [
- "//frameworks/base",
- "//packages/modules/Connectivity:__subpackages__",
- ],
+ visibility: ["//packages/modules/Connectivity:__subpackages__"],
}
java_defaults {
@@ -107,7 +105,13 @@
java_library {
name: "framework-connectivity-pre-jarjar",
- defaults: ["framework-connectivity-defaults"],
+ defaults: [
+ "framework-connectivity-defaults",
+ ],
+ static_libs: [
+ "cronet_aml_api_java",
+ "cronet_aml_java",
+ ],
libs: [
// This cannot be in the defaults clause above because if it were, it would be used
// to generate the connectivity stubs. That would create a circular dependency
@@ -119,9 +123,23 @@
visibility: ["//packages/modules/Connectivity:__subpackages__"]
}
+java_defaults {
+ name: "CronetJavaDefaults",
+ srcs: [":cronet_aml_api_sources"],
+ libs: [
+ "androidx.annotation_annotation",
+ ],
+ impl_only_static_libs: [
+ "cronet_aml_java",
+ ],
+}
+
java_sdk_library {
name: "framework-connectivity",
- defaults: ["framework-connectivity-defaults"],
+ defaults: [
+ "framework-connectivity-defaults",
+ "CronetJavaDefaults",
+ ],
installable: true,
jarjar_rules: ":framework-connectivity-jarjar-rules",
permitted_packages: ["android.net"],
@@ -149,6 +167,7 @@
"//frameworks/opt/net/ethernet/tests:__subpackages__",
"//frameworks/opt/telephony/tests/telephonytests",
"//packages/modules/CaptivePortalLogin/tests",
+ "//packages/modules/Connectivity/Cronet/tests:__subpackages__",
"//packages/modules/Connectivity/Tethering/tests:__subpackages__",
"//packages/modules/Connectivity/tests:__subpackages__",
"//packages/modules/IPsec/tests/iketests",
@@ -185,6 +204,7 @@
"libnativehelper",
],
header_libs: [
+ "bpf_headers",
"dnsproxyd_protocol_headers",
],
stl: "none",
diff --git a/framework/api/current.txt b/framework/api/current.txt
index 672e3e2..6860c3c 100644
--- a/framework/api/current.txt
+++ b/framework/api/current.txt
@@ -525,3 +525,292 @@
}
+package android.net.http {
+
+ public abstract class BidirectionalStream {
+ ctor public BidirectionalStream();
+ method public abstract void cancel();
+ method public abstract void flush();
+ method @NonNull public abstract android.net.http.HeaderBlock getHeaders();
+ method @NonNull public abstract String getHttpMethod();
+ method public abstract int getPriority();
+ method public abstract int getTrafficStatsTag();
+ method public abstract int getTrafficStatsUid();
+ method public abstract boolean hasTrafficStatsTag();
+ method public abstract boolean hasTrafficStatsUid();
+ method public abstract boolean isDelayRequestHeadersUntilFirstFlushEnabled();
+ method public abstract boolean isDone();
+ method public abstract void read(@NonNull java.nio.ByteBuffer);
+ method public abstract void start();
+ method public abstract void write(@NonNull java.nio.ByteBuffer, boolean);
+ field public static final int STREAM_PRIORITY_HIGHEST = 4; // 0x4
+ field public static final int STREAM_PRIORITY_IDLE = 0; // 0x0
+ field public static final int STREAM_PRIORITY_LOW = 2; // 0x2
+ field public static final int STREAM_PRIORITY_LOWEST = 1; // 0x1
+ field public static final int STREAM_PRIORITY_MEDIUM = 3; // 0x3
+ }
+
+ public abstract static class BidirectionalStream.Builder {
+ ctor public BidirectionalStream.Builder();
+ method @NonNull public abstract android.net.http.BidirectionalStream.Builder addHeader(@NonNull String, @NonNull String);
+ method @NonNull public abstract android.net.http.BidirectionalStream build();
+ method @NonNull public abstract android.net.http.BidirectionalStream.Builder setDelayRequestHeadersUntilFirstFlushEnabled(boolean);
+ method @NonNull public abstract android.net.http.BidirectionalStream.Builder setHttpMethod(@NonNull String);
+ method @NonNull public abstract android.net.http.BidirectionalStream.Builder setPriority(int);
+ method @NonNull public abstract android.net.http.BidirectionalStream.Builder setTrafficStatsTag(int);
+ method @NonNull public abstract android.net.http.BidirectionalStream.Builder setTrafficStatsUid(int);
+ }
+
+ public static interface BidirectionalStream.Callback {
+ method public void onCanceled(@NonNull android.net.http.BidirectionalStream, @Nullable android.net.http.UrlResponseInfo);
+ method public void onFailed(@NonNull android.net.http.BidirectionalStream, @Nullable android.net.http.UrlResponseInfo, @NonNull android.net.http.HttpException);
+ method public void onReadCompleted(@NonNull android.net.http.BidirectionalStream, @NonNull android.net.http.UrlResponseInfo, @NonNull java.nio.ByteBuffer, boolean);
+ method public void onResponseHeadersReceived(@NonNull android.net.http.BidirectionalStream, @NonNull android.net.http.UrlResponseInfo);
+ method public void onResponseTrailersReceived(@NonNull android.net.http.BidirectionalStream, @NonNull android.net.http.UrlResponseInfo, @NonNull android.net.http.HeaderBlock);
+ method public void onStreamReady(@NonNull android.net.http.BidirectionalStream);
+ method public void onSucceeded(@NonNull android.net.http.BidirectionalStream, @NonNull android.net.http.UrlResponseInfo);
+ method public void onWriteCompleted(@NonNull android.net.http.BidirectionalStream, @NonNull android.net.http.UrlResponseInfo, @NonNull java.nio.ByteBuffer, boolean);
+ }
+
+ public abstract class CallbackException extends android.net.http.HttpException {
+ ctor protected CallbackException(@Nullable String, @Nullable Throwable);
+ }
+
+ public class ConnectionMigrationOptions {
+ method public int getAllowNonDefaultNetworkUsage();
+ method public int getDefaultNetworkMigration();
+ method public int getPathDegradationMigration();
+ field public static final int MIGRATION_OPTION_DISABLED = 2; // 0x2
+ field public static final int MIGRATION_OPTION_ENABLED = 1; // 0x1
+ field public static final int MIGRATION_OPTION_UNSPECIFIED = 0; // 0x0
+ }
+
+ public static final class ConnectionMigrationOptions.Builder {
+ ctor public ConnectionMigrationOptions.Builder();
+ method @NonNull public android.net.http.ConnectionMigrationOptions build();
+ method @NonNull public android.net.http.ConnectionMigrationOptions.Builder setAllowNonDefaultNetworkUsage(int);
+ method @NonNull public android.net.http.ConnectionMigrationOptions.Builder setDefaultNetworkMigration(int);
+ method @NonNull public android.net.http.ConnectionMigrationOptions.Builder setPathDegradationMigration(int);
+ }
+
+ public final class DnsOptions {
+ method public int getPersistHostCache();
+ method @Nullable public java.time.Duration getPersistHostCachePeriod();
+ method public int getPreestablishConnectionsToStaleDnsResults();
+ method public int getStaleDns();
+ method @Nullable public android.net.http.DnsOptions.StaleDnsOptions getStaleDnsOptions();
+ method public int getUseHttpStackDnsResolver();
+ field public static final int DNS_OPTION_DISABLED = 2; // 0x2
+ field public static final int DNS_OPTION_ENABLED = 1; // 0x1
+ field public static final int DNS_OPTION_UNSPECIFIED = 0; // 0x0
+ }
+
+ public static final class DnsOptions.Builder {
+ ctor public DnsOptions.Builder();
+ method @NonNull public android.net.http.DnsOptions build();
+ method @NonNull public android.net.http.DnsOptions.Builder setPersistHostCache(int);
+ method @NonNull public android.net.http.DnsOptions.Builder setPersistHostCachePeriod(@NonNull java.time.Duration);
+ method @NonNull public android.net.http.DnsOptions.Builder setPreestablishConnectionsToStaleDnsResults(int);
+ method @NonNull public android.net.http.DnsOptions.Builder setStaleDns(int);
+ method @NonNull public android.net.http.DnsOptions.Builder setStaleDnsOptions(@NonNull android.net.http.DnsOptions.StaleDnsOptions);
+ method @NonNull public android.net.http.DnsOptions.Builder setUseHttpStackDnsResolver(int);
+ }
+
+ public static class DnsOptions.StaleDnsOptions {
+ method public int getAllowCrossNetworkUsage();
+ method @Nullable public java.time.Duration getFreshLookupTimeout();
+ method @Nullable public java.time.Duration getMaxExpiredDelay();
+ method public int getUseStaleOnNameNotResolved();
+ }
+
+ public static final class DnsOptions.StaleDnsOptions.Builder {
+ ctor public DnsOptions.StaleDnsOptions.Builder();
+ method @NonNull public android.net.http.DnsOptions.StaleDnsOptions build();
+ method @NonNull public android.net.http.DnsOptions.StaleDnsOptions.Builder setAllowCrossNetworkUsage(int);
+ method @NonNull public android.net.http.DnsOptions.StaleDnsOptions.Builder setFreshLookupTimeout(@NonNull java.time.Duration);
+ method @NonNull public android.net.http.DnsOptions.StaleDnsOptions.Builder setMaxExpiredDelay(@NonNull java.time.Duration);
+ method @NonNull public android.net.http.DnsOptions.StaleDnsOptions.Builder setUseStaleOnNameNotResolved(int);
+ }
+
+ public abstract class HeaderBlock {
+ ctor public HeaderBlock();
+ method @NonNull public abstract java.util.List<java.util.Map.Entry<java.lang.String,java.lang.String>> getAsList();
+ method @NonNull public abstract java.util.Map<java.lang.String,java.util.List<java.lang.String>> getAsMap();
+ }
+
+ public abstract class HttpEngine {
+ method public void bindToNetwork(@Nullable android.net.Network);
+ method @NonNull public abstract java.net.URLStreamHandlerFactory createUrlStreamHandlerFactory();
+ method @NonNull public static String getVersionString();
+ method @NonNull public abstract android.net.http.BidirectionalStream.Builder newBidirectionalStreamBuilder(@NonNull String, @NonNull java.util.concurrent.Executor, @NonNull android.net.http.BidirectionalStream.Callback);
+ method @NonNull public abstract android.net.http.UrlRequest.Builder newUrlRequestBuilder(@NonNull String, @NonNull java.util.concurrent.Executor, @NonNull android.net.http.UrlRequest.Callback);
+ method @NonNull public abstract java.net.URLConnection openConnection(@NonNull java.net.URL) throws java.io.IOException;
+ method public abstract void shutdown();
+ }
+
+ public static class HttpEngine.Builder {
+ ctor public HttpEngine.Builder(@NonNull android.content.Context);
+ method @NonNull public android.net.http.HttpEngine.Builder addPublicKeyPins(@NonNull String, @NonNull java.util.Set<byte[]>, boolean, @NonNull java.time.Instant);
+ method @NonNull public android.net.http.HttpEngine.Builder addQuicHint(@NonNull String, int, int);
+ method @NonNull public android.net.http.HttpEngine build();
+ method @NonNull public String getDefaultUserAgent();
+ method @NonNull public android.net.http.HttpEngine.Builder setConnectionMigrationOptions(@NonNull android.net.http.ConnectionMigrationOptions);
+ method @NonNull public android.net.http.HttpEngine.Builder setDnsOptions(@NonNull android.net.http.DnsOptions);
+ method @NonNull public android.net.http.HttpEngine.Builder setEnableBrotli(boolean);
+ method @NonNull public android.net.http.HttpEngine.Builder setEnableHttp2(boolean);
+ method @NonNull public android.net.http.HttpEngine.Builder setEnableHttpCache(int, long);
+ method @NonNull public android.net.http.HttpEngine.Builder setEnablePublicKeyPinningBypassForLocalTrustAnchors(boolean);
+ method @NonNull public android.net.http.HttpEngine.Builder setEnableQuic(boolean);
+ method @NonNull public android.net.http.HttpEngine.Builder setQuicOptions(@NonNull android.net.http.QuicOptions);
+ method @NonNull public android.net.http.HttpEngine.Builder setStoragePath(@NonNull String);
+ method @NonNull public android.net.http.HttpEngine.Builder setUserAgent(@NonNull String);
+ field public static final int HTTP_CACHE_DISABLED = 0; // 0x0
+ field public static final int HTTP_CACHE_DISK = 3; // 0x3
+ field public static final int HTTP_CACHE_DISK_NO_HTTP = 2; // 0x2
+ field public static final int HTTP_CACHE_IN_MEMORY = 1; // 0x1
+ }
+
+ public class HttpException extends java.io.IOException {
+ ctor public HttpException(@Nullable String, @Nullable Throwable);
+ }
+
+ public final class InlineExecutionProhibitedException extends java.util.concurrent.RejectedExecutionException {
+ ctor public InlineExecutionProhibitedException();
+ }
+
+ public abstract class NetworkException extends android.net.http.HttpException {
+ ctor public NetworkException(@Nullable String, @Nullable Throwable);
+ method public abstract int getErrorCode();
+ method public abstract boolean isImmediatelyRetryable();
+ field public static final int ERROR_ADDRESS_UNREACHABLE = 9; // 0x9
+ field public static final int ERROR_CONNECTION_CLOSED = 5; // 0x5
+ field public static final int ERROR_CONNECTION_REFUSED = 7; // 0x7
+ field public static final int ERROR_CONNECTION_RESET = 8; // 0x8
+ field public static final int ERROR_CONNECTION_TIMED_OUT = 6; // 0x6
+ field public static final int ERROR_HOSTNAME_NOT_RESOLVED = 1; // 0x1
+ field public static final int ERROR_INTERNET_DISCONNECTED = 2; // 0x2
+ field public static final int ERROR_NETWORK_CHANGED = 3; // 0x3
+ field public static final int ERROR_OTHER = 11; // 0xb
+ field public static final int ERROR_QUIC_PROTOCOL_FAILED = 10; // 0xa
+ field public static final int ERROR_TIMED_OUT = 4; // 0x4
+ }
+
+ public abstract class QuicException extends android.net.http.NetworkException {
+ ctor protected QuicException(@Nullable String, @Nullable Throwable);
+ }
+
+ public class QuicOptions {
+ method @NonNull public java.util.Set<java.lang.String> getAllowedQuicHosts();
+ method @Nullable public String getHandshakeUserAgent();
+ method @Nullable public java.time.Duration getIdleConnectionTimeout();
+ method public int getInMemoryServerConfigsCacheSize();
+ method public boolean hasInMemoryServerConfigsCacheSize();
+ }
+
+ public static final class QuicOptions.Builder {
+ ctor public QuicOptions.Builder();
+ method @NonNull public android.net.http.QuicOptions.Builder addAllowedQuicHost(@NonNull String);
+ method @NonNull public android.net.http.QuicOptions build();
+ method @NonNull public android.net.http.QuicOptions.Builder setHandshakeUserAgent(@NonNull String);
+ method @NonNull public android.net.http.QuicOptions.Builder setIdleConnectionTimeout(@NonNull java.time.Duration);
+ method @NonNull public android.net.http.QuicOptions.Builder setInMemoryServerConfigsCacheSize(int);
+ }
+
+ public abstract class UploadDataProvider implements java.io.Closeable {
+ ctor public UploadDataProvider();
+ method public void close() throws java.io.IOException;
+ method public abstract long getLength() throws java.io.IOException;
+ method public abstract void read(@NonNull android.net.http.UploadDataSink, @NonNull java.nio.ByteBuffer) throws java.io.IOException;
+ method public abstract void rewind(@NonNull android.net.http.UploadDataSink) throws java.io.IOException;
+ }
+
+ public abstract class UploadDataSink {
+ ctor public UploadDataSink();
+ method public abstract void onReadError(@NonNull Exception);
+ method public abstract void onReadSucceeded(boolean);
+ method public abstract void onRewindError(@NonNull Exception);
+ method public abstract void onRewindSucceeded();
+ }
+
+ public abstract class UrlRequest {
+ method public abstract void cancel();
+ method public abstract void followRedirect();
+ method @NonNull public abstract android.net.http.HeaderBlock getHeaders();
+ method @Nullable public abstract String getHttpMethod();
+ method public abstract int getPriority();
+ method public abstract void getStatus(@NonNull android.net.http.UrlRequest.StatusListener);
+ method public abstract int getTrafficStatsTag();
+ method public abstract int getTrafficStatsUid();
+ method public abstract boolean hasTrafficStatsTag();
+ method public abstract boolean hasTrafficStatsUid();
+ method public abstract boolean isCacheDisabled();
+ method public abstract boolean isDirectExecutorAllowed();
+ method public abstract boolean isDone();
+ method public abstract void read(@NonNull java.nio.ByteBuffer);
+ method public abstract void start();
+ field public static final int REQUEST_PRIORITY_HIGHEST = 4; // 0x4
+ field public static final int REQUEST_PRIORITY_IDLE = 0; // 0x0
+ field public static final int REQUEST_PRIORITY_LOW = 2; // 0x2
+ field public static final int REQUEST_PRIORITY_LOWEST = 1; // 0x1
+ field public static final int REQUEST_PRIORITY_MEDIUM = 3; // 0x3
+ }
+
+ public abstract static class UrlRequest.Builder {
+ method @NonNull public abstract android.net.http.UrlRequest.Builder addHeader(@NonNull String, @NonNull String);
+ method @NonNull public abstract android.net.http.UrlRequest.Builder bindToNetwork(@Nullable android.net.Network);
+ method @NonNull public abstract android.net.http.UrlRequest build();
+ method @NonNull public abstract android.net.http.UrlRequest.Builder setCacheDisabled(boolean);
+ method @NonNull public abstract android.net.http.UrlRequest.Builder setDirectExecutorAllowed(boolean);
+ method @NonNull public abstract android.net.http.UrlRequest.Builder setHttpMethod(@NonNull String);
+ method @NonNull public abstract android.net.http.UrlRequest.Builder setPriority(int);
+ method @NonNull public abstract android.net.http.UrlRequest.Builder setTrafficStatsTag(int);
+ method @NonNull public abstract android.net.http.UrlRequest.Builder setTrafficStatsUid(int);
+ method @NonNull public abstract android.net.http.UrlRequest.Builder setUploadDataProvider(@NonNull android.net.http.UploadDataProvider, @NonNull java.util.concurrent.Executor);
+ }
+
+ public static interface UrlRequest.Callback {
+ method public void onCanceled(@NonNull android.net.http.UrlRequest, @Nullable android.net.http.UrlResponseInfo);
+ method public void onFailed(@NonNull android.net.http.UrlRequest, @Nullable android.net.http.UrlResponseInfo, @NonNull android.net.http.HttpException);
+ method public void onReadCompleted(@NonNull android.net.http.UrlRequest, @NonNull android.net.http.UrlResponseInfo, @NonNull java.nio.ByteBuffer) throws java.lang.Exception;
+ method public void onRedirectReceived(@NonNull android.net.http.UrlRequest, @NonNull android.net.http.UrlResponseInfo, @NonNull String) throws java.lang.Exception;
+ method public void onResponseStarted(@NonNull android.net.http.UrlRequest, @NonNull android.net.http.UrlResponseInfo) throws java.lang.Exception;
+ method public void onSucceeded(@NonNull android.net.http.UrlRequest, @NonNull android.net.http.UrlResponseInfo);
+ }
+
+ public static class UrlRequest.Status {
+ field public static final int CONNECTING = 10; // 0xa
+ field public static final int DOWNLOADING_PAC_FILE = 5; // 0x5
+ field public static final int ESTABLISHING_PROXY_TUNNEL = 8; // 0x8
+ field public static final int IDLE = 0; // 0x0
+ field public static final int INVALID = -1; // 0xffffffff
+ field public static final int READING_RESPONSE = 14; // 0xe
+ field public static final int RESOLVING_HOST = 9; // 0x9
+ field public static final int RESOLVING_HOST_IN_PAC_FILE = 7; // 0x7
+ field public static final int RESOLVING_PROXY_FOR_URL = 6; // 0x6
+ field public static final int SENDING_REQUEST = 12; // 0xc
+ field public static final int SSL_HANDSHAKE = 11; // 0xb
+ field public static final int WAITING_FOR_AVAILABLE_SOCKET = 2; // 0x2
+ field public static final int WAITING_FOR_CACHE = 4; // 0x4
+ field public static final int WAITING_FOR_DELEGATE = 3; // 0x3
+ field public static final int WAITING_FOR_RESPONSE = 13; // 0xd
+ field public static final int WAITING_FOR_STALLED_SOCKET_POOL = 1; // 0x1
+ }
+
+ public static interface UrlRequest.StatusListener {
+ method public void onStatus(int);
+ }
+
+ public abstract class UrlResponseInfo {
+ ctor public UrlResponseInfo();
+ method @NonNull public abstract android.net.http.HeaderBlock getHeaders();
+ method public abstract int getHttpStatusCode();
+ method @NonNull public abstract String getHttpStatusText();
+ method @NonNull public abstract String getNegotiatedProtocol();
+ method public abstract long getReceivedByteCount();
+ method @NonNull public abstract String getUrl();
+ method @NonNull public abstract java.util.List<java.lang.String> getUrlChain();
+ method public abstract boolean wasCached();
+ }
+
+}
+
diff --git a/framework/api/system-current.txt b/framework/api/system-current.txt
index 196e023..4a2ed8a 100644
--- a/framework/api/system-current.txt
+++ b/framework/api/system-current.txt
@@ -470,7 +470,7 @@
}
public abstract class SocketKeepalive implements java.lang.AutoCloseable {
- method public final void start(@IntRange(from=0xa, to=0xe10) int, int, @NonNull android.net.Network);
+ method public final void start(@IntRange(from=0xa, to=0xe10) int, int, @Nullable android.net.Network);
field public static final int ERROR_NO_SUCH_SLOT = -33; // 0xffffffdf
field public static final int FLAG_AUTOMATIC_ON_OFF = 1; // 0x1
field public static final int SUCCESS = 0; // 0x0
diff --git a/framework/cronet_disabled/api/current.txt b/framework/cronet_disabled/api/current.txt
new file mode 100644
index 0000000..672e3e2
--- /dev/null
+++ b/framework/cronet_disabled/api/current.txt
@@ -0,0 +1,527 @@
+// Signature format: 2.0
+package android.net {
+
+ public class CaptivePortal implements android.os.Parcelable {
+ method public int describeContents();
+ method public void ignoreNetwork();
+ method public void reportCaptivePortalDismissed();
+ method public void writeToParcel(android.os.Parcel, int);
+ field @NonNull public static final android.os.Parcelable.Creator<android.net.CaptivePortal> CREATOR;
+ }
+
+ public class ConnectivityDiagnosticsManager {
+ method public void registerConnectivityDiagnosticsCallback(@NonNull android.net.NetworkRequest, @NonNull java.util.concurrent.Executor, @NonNull android.net.ConnectivityDiagnosticsManager.ConnectivityDiagnosticsCallback);
+ method public void unregisterConnectivityDiagnosticsCallback(@NonNull android.net.ConnectivityDiagnosticsManager.ConnectivityDiagnosticsCallback);
+ }
+
+ public abstract static class ConnectivityDiagnosticsManager.ConnectivityDiagnosticsCallback {
+ ctor public ConnectivityDiagnosticsManager.ConnectivityDiagnosticsCallback();
+ method public void onConnectivityReportAvailable(@NonNull android.net.ConnectivityDiagnosticsManager.ConnectivityReport);
+ method public void onDataStallSuspected(@NonNull android.net.ConnectivityDiagnosticsManager.DataStallReport);
+ method public void onNetworkConnectivityReported(@NonNull android.net.Network, boolean);
+ }
+
+ public static final class ConnectivityDiagnosticsManager.ConnectivityReport implements android.os.Parcelable {
+ ctor public ConnectivityDiagnosticsManager.ConnectivityReport(@NonNull android.net.Network, long, @NonNull android.net.LinkProperties, @NonNull android.net.NetworkCapabilities, @NonNull android.os.PersistableBundle);
+ method public int describeContents();
+ method @NonNull public android.os.PersistableBundle getAdditionalInfo();
+ method @NonNull public android.net.LinkProperties getLinkProperties();
+ method @NonNull public android.net.Network getNetwork();
+ method @NonNull public android.net.NetworkCapabilities getNetworkCapabilities();
+ method public long getReportTimestamp();
+ method public void writeToParcel(@NonNull android.os.Parcel, int);
+ field @NonNull public static final android.os.Parcelable.Creator<android.net.ConnectivityDiagnosticsManager.ConnectivityReport> CREATOR;
+ field public static final String KEY_NETWORK_PROBES_ATTEMPTED_BITMASK = "networkProbesAttempted";
+ field public static final String KEY_NETWORK_PROBES_SUCCEEDED_BITMASK = "networkProbesSucceeded";
+ field public static final String KEY_NETWORK_VALIDATION_RESULT = "networkValidationResult";
+ field public static final int NETWORK_PROBE_DNS = 4; // 0x4
+ field public static final int NETWORK_PROBE_FALLBACK = 32; // 0x20
+ field public static final int NETWORK_PROBE_HTTP = 8; // 0x8
+ field public static final int NETWORK_PROBE_HTTPS = 16; // 0x10
+ field public static final int NETWORK_PROBE_PRIVATE_DNS = 64; // 0x40
+ field public static final int NETWORK_VALIDATION_RESULT_INVALID = 0; // 0x0
+ field public static final int NETWORK_VALIDATION_RESULT_PARTIALLY_VALID = 2; // 0x2
+ field public static final int NETWORK_VALIDATION_RESULT_SKIPPED = 3; // 0x3
+ field public static final int NETWORK_VALIDATION_RESULT_VALID = 1; // 0x1
+ }
+
+ public static final class ConnectivityDiagnosticsManager.DataStallReport implements android.os.Parcelable {
+ ctor public ConnectivityDiagnosticsManager.DataStallReport(@NonNull android.net.Network, long, int, @NonNull android.net.LinkProperties, @NonNull android.net.NetworkCapabilities, @NonNull android.os.PersistableBundle);
+ method public int describeContents();
+ method public int getDetectionMethod();
+ method @NonNull public android.net.LinkProperties getLinkProperties();
+ method @NonNull public android.net.Network getNetwork();
+ method @NonNull public android.net.NetworkCapabilities getNetworkCapabilities();
+ method public long getReportTimestamp();
+ method @NonNull public android.os.PersistableBundle getStallDetails();
+ method public void writeToParcel(@NonNull android.os.Parcel, int);
+ field @NonNull public static final android.os.Parcelable.Creator<android.net.ConnectivityDiagnosticsManager.DataStallReport> CREATOR;
+ field public static final int DETECTION_METHOD_DNS_EVENTS = 1; // 0x1
+ field public static final int DETECTION_METHOD_TCP_METRICS = 2; // 0x2
+ field public static final String KEY_DNS_CONSECUTIVE_TIMEOUTS = "dnsConsecutiveTimeouts";
+ field public static final String KEY_TCP_METRICS_COLLECTION_PERIOD_MILLIS = "tcpMetricsCollectionPeriodMillis";
+ field public static final String KEY_TCP_PACKET_FAIL_RATE = "tcpPacketFailRate";
+ }
+
+ public class ConnectivityManager {
+ method public void addDefaultNetworkActiveListener(android.net.ConnectivityManager.OnNetworkActiveListener);
+ method public boolean bindProcessToNetwork(@Nullable android.net.Network);
+ method @NonNull public android.net.SocketKeepalive createSocketKeepalive(@NonNull android.net.Network, @NonNull android.net.IpSecManager.UdpEncapsulationSocket, @NonNull java.net.InetAddress, @NonNull java.net.InetAddress, @NonNull java.util.concurrent.Executor, @NonNull android.net.SocketKeepalive.Callback);
+ method @Nullable @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE) public android.net.Network getActiveNetwork();
+ method @Deprecated @Nullable @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE) public android.net.NetworkInfo getActiveNetworkInfo();
+ method @Deprecated @NonNull @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE) public android.net.NetworkInfo[] getAllNetworkInfo();
+ method @Deprecated @NonNull @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE) public android.net.Network[] getAllNetworks();
+ method @Deprecated public boolean getBackgroundDataSetting();
+ method @Nullable public android.net.Network getBoundNetworkForProcess();
+ method public int getConnectionOwnerUid(int, @NonNull java.net.InetSocketAddress, @NonNull java.net.InetSocketAddress);
+ method @Nullable public android.net.ProxyInfo getDefaultProxy();
+ method @Nullable @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE) public android.net.LinkProperties getLinkProperties(@Nullable android.net.Network);
+ method @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE) public int getMultipathPreference(@Nullable android.net.Network);
+ method @Nullable @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE) public android.net.NetworkCapabilities getNetworkCapabilities(@Nullable android.net.Network);
+ method @Deprecated @Nullable @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE) public android.net.NetworkInfo getNetworkInfo(int);
+ method @Deprecated @Nullable @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE) public android.net.NetworkInfo getNetworkInfo(@Nullable android.net.Network);
+ method @Deprecated @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE) public int getNetworkPreference();
+ method @Nullable public byte[] getNetworkWatchlistConfigHash();
+ method @Deprecated @Nullable public static android.net.Network getProcessDefaultNetwork();
+ method public int getRestrictBackgroundStatus();
+ method @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE) public boolean isActiveNetworkMetered();
+ method public boolean isDefaultNetworkActive();
+ method @Deprecated public static boolean isNetworkTypeValid(int);
+ method public void registerBestMatchingNetworkCallback(@NonNull android.net.NetworkRequest, @NonNull android.net.ConnectivityManager.NetworkCallback, @NonNull android.os.Handler);
+ method @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE) public void registerDefaultNetworkCallback(@NonNull android.net.ConnectivityManager.NetworkCallback);
+ method @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE) public void registerDefaultNetworkCallback(@NonNull android.net.ConnectivityManager.NetworkCallback, @NonNull android.os.Handler);
+ method @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE) public void registerNetworkCallback(@NonNull android.net.NetworkRequest, @NonNull android.net.ConnectivityManager.NetworkCallback);
+ method @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE) public void registerNetworkCallback(@NonNull android.net.NetworkRequest, @NonNull android.net.ConnectivityManager.NetworkCallback, @NonNull android.os.Handler);
+ method @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE) public void registerNetworkCallback(@NonNull android.net.NetworkRequest, @NonNull android.app.PendingIntent);
+ method public void releaseNetworkRequest(@NonNull android.app.PendingIntent);
+ method public void removeDefaultNetworkActiveListener(@NonNull android.net.ConnectivityManager.OnNetworkActiveListener);
+ method @Deprecated public void reportBadNetwork(@Nullable android.net.Network);
+ method public void reportNetworkConnectivity(@Nullable android.net.Network, boolean);
+ method public boolean requestBandwidthUpdate(@NonNull android.net.Network);
+ method public void requestNetwork(@NonNull android.net.NetworkRequest, @NonNull android.net.ConnectivityManager.NetworkCallback);
+ method public void requestNetwork(@NonNull android.net.NetworkRequest, @NonNull android.net.ConnectivityManager.NetworkCallback, @NonNull android.os.Handler);
+ method public void requestNetwork(@NonNull android.net.NetworkRequest, @NonNull android.net.ConnectivityManager.NetworkCallback, int);
+ method public void requestNetwork(@NonNull android.net.NetworkRequest, @NonNull android.net.ConnectivityManager.NetworkCallback, @NonNull android.os.Handler, int);
+ method public void requestNetwork(@NonNull android.net.NetworkRequest, @NonNull android.app.PendingIntent);
+ method @Deprecated public void setNetworkPreference(int);
+ method @Deprecated public static boolean setProcessDefaultNetwork(@Nullable android.net.Network);
+ method public void unregisterNetworkCallback(@NonNull android.net.ConnectivityManager.NetworkCallback);
+ method public void unregisterNetworkCallback(@NonNull android.app.PendingIntent);
+ field @Deprecated public static final String ACTION_BACKGROUND_DATA_SETTING_CHANGED = "android.net.conn.BACKGROUND_DATA_SETTING_CHANGED";
+ field public static final String ACTION_CAPTIVE_PORTAL_SIGN_IN = "android.net.conn.CAPTIVE_PORTAL";
+ field public static final String ACTION_RESTRICT_BACKGROUND_CHANGED = "android.net.conn.RESTRICT_BACKGROUND_CHANGED";
+ field @Deprecated public static final String CONNECTIVITY_ACTION = "android.net.conn.CONNECTIVITY_CHANGE";
+ field @Deprecated public static final int DEFAULT_NETWORK_PREFERENCE = 1; // 0x1
+ field public static final String EXTRA_CAPTIVE_PORTAL = "android.net.extra.CAPTIVE_PORTAL";
+ field public static final String EXTRA_CAPTIVE_PORTAL_URL = "android.net.extra.CAPTIVE_PORTAL_URL";
+ field @Deprecated public static final String EXTRA_EXTRA_INFO = "extraInfo";
+ field @Deprecated public static final String EXTRA_IS_FAILOVER = "isFailover";
+ field public static final String EXTRA_NETWORK = "android.net.extra.NETWORK";
+ field @Deprecated public static final String EXTRA_NETWORK_INFO = "networkInfo";
+ field public static final String EXTRA_NETWORK_REQUEST = "android.net.extra.NETWORK_REQUEST";
+ field @Deprecated public static final String EXTRA_NETWORK_TYPE = "networkType";
+ field public static final String EXTRA_NO_CONNECTIVITY = "noConnectivity";
+ field @Deprecated public static final String EXTRA_OTHER_NETWORK_INFO = "otherNetwork";
+ field public static final String EXTRA_REASON = "reason";
+ field public static final int MULTIPATH_PREFERENCE_HANDOVER = 1; // 0x1
+ field public static final int MULTIPATH_PREFERENCE_PERFORMANCE = 4; // 0x4
+ field public static final int MULTIPATH_PREFERENCE_RELIABILITY = 2; // 0x2
+ field public static final int RESTRICT_BACKGROUND_STATUS_DISABLED = 1; // 0x1
+ field public static final int RESTRICT_BACKGROUND_STATUS_ENABLED = 3; // 0x3
+ field public static final int RESTRICT_BACKGROUND_STATUS_WHITELISTED = 2; // 0x2
+ field @Deprecated public static final int TYPE_BLUETOOTH = 7; // 0x7
+ field @Deprecated public static final int TYPE_DUMMY = 8; // 0x8
+ field @Deprecated public static final int TYPE_ETHERNET = 9; // 0x9
+ field @Deprecated public static final int TYPE_MOBILE = 0; // 0x0
+ field @Deprecated public static final int TYPE_MOBILE_DUN = 4; // 0x4
+ field @Deprecated public static final int TYPE_MOBILE_HIPRI = 5; // 0x5
+ field @Deprecated public static final int TYPE_MOBILE_MMS = 2; // 0x2
+ field @Deprecated public static final int TYPE_MOBILE_SUPL = 3; // 0x3
+ field @Deprecated public static final int TYPE_VPN = 17; // 0x11
+ field @Deprecated public static final int TYPE_WIFI = 1; // 0x1
+ field @Deprecated public static final int TYPE_WIMAX = 6; // 0x6
+ }
+
+ public static class ConnectivityManager.NetworkCallback {
+ ctor public ConnectivityManager.NetworkCallback();
+ ctor public ConnectivityManager.NetworkCallback(int);
+ method public void onAvailable(@NonNull android.net.Network);
+ method public void onBlockedStatusChanged(@NonNull android.net.Network, boolean);
+ method public void onCapabilitiesChanged(@NonNull android.net.Network, @NonNull android.net.NetworkCapabilities);
+ method public void onLinkPropertiesChanged(@NonNull android.net.Network, @NonNull android.net.LinkProperties);
+ method public void onLosing(@NonNull android.net.Network, int);
+ method public void onLost(@NonNull android.net.Network);
+ method public void onUnavailable();
+ field public static final int FLAG_INCLUDE_LOCATION_INFO = 1; // 0x1
+ }
+
+ public static interface ConnectivityManager.OnNetworkActiveListener {
+ method public void onNetworkActive();
+ }
+
+ public class DhcpInfo implements android.os.Parcelable {
+ ctor public DhcpInfo();
+ method public int describeContents();
+ method public void writeToParcel(android.os.Parcel, int);
+ field @NonNull public static final android.os.Parcelable.Creator<android.net.DhcpInfo> CREATOR;
+ field public int dns1;
+ field public int dns2;
+ field public int gateway;
+ field public int ipAddress;
+ field public int leaseDuration;
+ field public int netmask;
+ field public int serverAddress;
+ }
+
+ public final class DnsResolver {
+ method @NonNull public static android.net.DnsResolver getInstance();
+ method public void query(@Nullable android.net.Network, @NonNull String, int, @NonNull java.util.concurrent.Executor, @Nullable android.os.CancellationSignal, @NonNull android.net.DnsResolver.Callback<? super java.util.List<java.net.InetAddress>>);
+ method public void query(@Nullable android.net.Network, @NonNull String, int, int, @NonNull java.util.concurrent.Executor, @Nullable android.os.CancellationSignal, @NonNull android.net.DnsResolver.Callback<? super java.util.List<java.net.InetAddress>>);
+ method public void rawQuery(@Nullable android.net.Network, @NonNull byte[], int, @NonNull java.util.concurrent.Executor, @Nullable android.os.CancellationSignal, @NonNull android.net.DnsResolver.Callback<? super byte[]>);
+ method public void rawQuery(@Nullable android.net.Network, @NonNull String, int, int, int, @NonNull java.util.concurrent.Executor, @Nullable android.os.CancellationSignal, @NonNull android.net.DnsResolver.Callback<? super byte[]>);
+ field public static final int CLASS_IN = 1; // 0x1
+ field public static final int ERROR_PARSE = 0; // 0x0
+ field public static final int ERROR_SYSTEM = 1; // 0x1
+ field public static final int FLAG_EMPTY = 0; // 0x0
+ field public static final int FLAG_NO_CACHE_LOOKUP = 4; // 0x4
+ field public static final int FLAG_NO_CACHE_STORE = 2; // 0x2
+ field public static final int FLAG_NO_RETRY = 1; // 0x1
+ field public static final int TYPE_A = 1; // 0x1
+ field public static final int TYPE_AAAA = 28; // 0x1c
+ }
+
+ public static interface DnsResolver.Callback<T> {
+ method public void onAnswer(@NonNull T, int);
+ method public void onError(@NonNull android.net.DnsResolver.DnsException);
+ }
+
+ public static class DnsResolver.DnsException extends java.lang.Exception {
+ ctor public DnsResolver.DnsException(int, @Nullable Throwable);
+ field public final int code;
+ }
+
+ public class InetAddresses {
+ method public static boolean isNumericAddress(@NonNull String);
+ method @NonNull public static java.net.InetAddress parseNumericAddress(@NonNull String);
+ }
+
+ public final class IpConfiguration implements android.os.Parcelable {
+ method public int describeContents();
+ method @Nullable public android.net.ProxyInfo getHttpProxy();
+ method @Nullable public android.net.StaticIpConfiguration getStaticIpConfiguration();
+ method public void writeToParcel(@NonNull android.os.Parcel, int);
+ field @NonNull public static final android.os.Parcelable.Creator<android.net.IpConfiguration> CREATOR;
+ }
+
+ public static final class IpConfiguration.Builder {
+ ctor public IpConfiguration.Builder();
+ method @NonNull public android.net.IpConfiguration build();
+ method @NonNull public android.net.IpConfiguration.Builder setHttpProxy(@Nullable android.net.ProxyInfo);
+ method @NonNull public android.net.IpConfiguration.Builder setStaticIpConfiguration(@Nullable android.net.StaticIpConfiguration);
+ }
+
+ public final class IpPrefix implements android.os.Parcelable {
+ ctor public IpPrefix(@NonNull java.net.InetAddress, @IntRange(from=0, to=128) int);
+ method public boolean contains(@NonNull java.net.InetAddress);
+ method public int describeContents();
+ method @NonNull public java.net.InetAddress getAddress();
+ method @IntRange(from=0, to=128) public int getPrefixLength();
+ method @NonNull public byte[] getRawAddress();
+ method public void writeToParcel(android.os.Parcel, int);
+ field @NonNull public static final android.os.Parcelable.Creator<android.net.IpPrefix> CREATOR;
+ }
+
+ public class LinkAddress implements android.os.Parcelable {
+ method public int describeContents();
+ method public java.net.InetAddress getAddress();
+ method public int getFlags();
+ method @IntRange(from=0, to=128) public int getPrefixLength();
+ method public int getScope();
+ method public void writeToParcel(android.os.Parcel, int);
+ field @NonNull public static final android.os.Parcelable.Creator<android.net.LinkAddress> CREATOR;
+ }
+
+ public final class LinkProperties implements android.os.Parcelable {
+ ctor public LinkProperties();
+ method public boolean addRoute(@NonNull android.net.RouteInfo);
+ method public void clear();
+ method public int describeContents();
+ method @Nullable public java.net.Inet4Address getDhcpServerAddress();
+ method @NonNull public java.util.List<java.net.InetAddress> getDnsServers();
+ method @Nullable public String getDomains();
+ method @Nullable public android.net.ProxyInfo getHttpProxy();
+ method @Nullable public String getInterfaceName();
+ method @NonNull public java.util.List<android.net.LinkAddress> getLinkAddresses();
+ method public int getMtu();
+ method @Nullable public android.net.IpPrefix getNat64Prefix();
+ method @Nullable public String getPrivateDnsServerName();
+ method @NonNull public java.util.List<android.net.RouteInfo> getRoutes();
+ method public boolean isPrivateDnsActive();
+ method public boolean isWakeOnLanSupported();
+ method public void setDhcpServerAddress(@Nullable java.net.Inet4Address);
+ method public void setDnsServers(@NonNull java.util.Collection<java.net.InetAddress>);
+ method public void setDomains(@Nullable String);
+ method public void setHttpProxy(@Nullable android.net.ProxyInfo);
+ method public void setInterfaceName(@Nullable String);
+ method public void setLinkAddresses(@NonNull java.util.Collection<android.net.LinkAddress>);
+ method public void setMtu(int);
+ method public void setNat64Prefix(@Nullable android.net.IpPrefix);
+ method public void writeToParcel(android.os.Parcel, int);
+ field @NonNull public static final android.os.Parcelable.Creator<android.net.LinkProperties> CREATOR;
+ }
+
+ public final class MacAddress implements android.os.Parcelable {
+ method public int describeContents();
+ method @NonNull public static android.net.MacAddress fromBytes(@NonNull byte[]);
+ method @NonNull public static android.net.MacAddress fromString(@NonNull String);
+ method public int getAddressType();
+ method @Nullable public java.net.Inet6Address getLinkLocalIpv6FromEui48Mac();
+ method public boolean isLocallyAssigned();
+ method public boolean matches(@NonNull android.net.MacAddress, @NonNull android.net.MacAddress);
+ method @NonNull public byte[] toByteArray();
+ method @NonNull public String toOuiString();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.net.MacAddress BROADCAST_ADDRESS;
+ field @NonNull public static final android.os.Parcelable.Creator<android.net.MacAddress> CREATOR;
+ field public static final int TYPE_BROADCAST = 3; // 0x3
+ field public static final int TYPE_MULTICAST = 2; // 0x2
+ field public static final int TYPE_UNICAST = 1; // 0x1
+ }
+
+ public class Network implements android.os.Parcelable {
+ method public void bindSocket(java.net.DatagramSocket) throws java.io.IOException;
+ method public void bindSocket(java.net.Socket) throws java.io.IOException;
+ method public void bindSocket(java.io.FileDescriptor) throws java.io.IOException;
+ method public int describeContents();
+ method public static android.net.Network fromNetworkHandle(long);
+ method public java.net.InetAddress[] getAllByName(String) throws java.net.UnknownHostException;
+ method public java.net.InetAddress getByName(String) throws java.net.UnknownHostException;
+ method public long getNetworkHandle();
+ method public javax.net.SocketFactory getSocketFactory();
+ method public java.net.URLConnection openConnection(java.net.URL) throws java.io.IOException;
+ method public java.net.URLConnection openConnection(java.net.URL, java.net.Proxy) throws java.io.IOException;
+ method public void writeToParcel(android.os.Parcel, int);
+ field @NonNull public static final android.os.Parcelable.Creator<android.net.Network> CREATOR;
+ }
+
+ public final class NetworkCapabilities implements android.os.Parcelable {
+ ctor public NetworkCapabilities();
+ ctor public NetworkCapabilities(android.net.NetworkCapabilities);
+ method public int describeContents();
+ method @NonNull public int[] getCapabilities();
+ method @NonNull public int[] getEnterpriseIds();
+ method public int getLinkDownstreamBandwidthKbps();
+ method public int getLinkUpstreamBandwidthKbps();
+ method @Nullable public android.net.NetworkSpecifier getNetworkSpecifier();
+ method public int getOwnerUid();
+ method public int getSignalStrength();
+ method @Nullable public android.net.TransportInfo getTransportInfo();
+ method public boolean hasCapability(int);
+ method public boolean hasEnterpriseId(int);
+ method public boolean hasTransport(int);
+ method public void writeToParcel(android.os.Parcel, int);
+ field @NonNull public static final android.os.Parcelable.Creator<android.net.NetworkCapabilities> CREATOR;
+ field public static final int NET_CAPABILITY_CAPTIVE_PORTAL = 17; // 0x11
+ field public static final int NET_CAPABILITY_CBS = 5; // 0x5
+ field public static final int NET_CAPABILITY_DUN = 2; // 0x2
+ field public static final int NET_CAPABILITY_EIMS = 10; // 0xa
+ field public static final int NET_CAPABILITY_ENTERPRISE = 29; // 0x1d
+ field public static final int NET_CAPABILITY_FOREGROUND = 19; // 0x13
+ field public static final int NET_CAPABILITY_FOTA = 3; // 0x3
+ field public static final int NET_CAPABILITY_HEAD_UNIT = 32; // 0x20
+ field public static final int NET_CAPABILITY_IA = 7; // 0x7
+ field public static final int NET_CAPABILITY_IMS = 4; // 0x4
+ field public static final int NET_CAPABILITY_INTERNET = 12; // 0xc
+ field public static final int NET_CAPABILITY_MCX = 23; // 0x17
+ field public static final int NET_CAPABILITY_MMS = 0; // 0x0
+ field public static final int NET_CAPABILITY_MMTEL = 33; // 0x21
+ field public static final int NET_CAPABILITY_NOT_CONGESTED = 20; // 0x14
+ field public static final int NET_CAPABILITY_NOT_METERED = 11; // 0xb
+ field public static final int NET_CAPABILITY_NOT_RESTRICTED = 13; // 0xd
+ field public static final int NET_CAPABILITY_NOT_ROAMING = 18; // 0x12
+ field public static final int NET_CAPABILITY_NOT_SUSPENDED = 21; // 0x15
+ field public static final int NET_CAPABILITY_NOT_VPN = 15; // 0xf
+ field public static final int NET_CAPABILITY_PRIORITIZE_BANDWIDTH = 35; // 0x23
+ field public static final int NET_CAPABILITY_PRIORITIZE_LATENCY = 34; // 0x22
+ field public static final int NET_CAPABILITY_RCS = 8; // 0x8
+ field public static final int NET_CAPABILITY_SUPL = 1; // 0x1
+ field public static final int NET_CAPABILITY_TEMPORARILY_NOT_METERED = 25; // 0x19
+ field public static final int NET_CAPABILITY_TRUSTED = 14; // 0xe
+ field public static final int NET_CAPABILITY_VALIDATED = 16; // 0x10
+ field public static final int NET_CAPABILITY_WIFI_P2P = 6; // 0x6
+ field public static final int NET_CAPABILITY_XCAP = 9; // 0x9
+ field public static final int NET_ENTERPRISE_ID_1 = 1; // 0x1
+ field public static final int NET_ENTERPRISE_ID_2 = 2; // 0x2
+ field public static final int NET_ENTERPRISE_ID_3 = 3; // 0x3
+ field public static final int NET_ENTERPRISE_ID_4 = 4; // 0x4
+ field public static final int NET_ENTERPRISE_ID_5 = 5; // 0x5
+ field public static final int SIGNAL_STRENGTH_UNSPECIFIED = -2147483648; // 0x80000000
+ field public static final int TRANSPORT_BLUETOOTH = 2; // 0x2
+ field public static final int TRANSPORT_CELLULAR = 0; // 0x0
+ field public static final int TRANSPORT_ETHERNET = 3; // 0x3
+ field public static final int TRANSPORT_LOWPAN = 6; // 0x6
+ field public static final int TRANSPORT_THREAD = 9; // 0x9
+ field public static final int TRANSPORT_USB = 8; // 0x8
+ field public static final int TRANSPORT_VPN = 4; // 0x4
+ field public static final int TRANSPORT_WIFI = 1; // 0x1
+ field public static final int TRANSPORT_WIFI_AWARE = 5; // 0x5
+ }
+
+ @Deprecated public class NetworkInfo implements android.os.Parcelable {
+ ctor @Deprecated public NetworkInfo(int, int, @Nullable String, @Nullable String);
+ method @Deprecated public int describeContents();
+ method @Deprecated @NonNull public android.net.NetworkInfo.DetailedState getDetailedState();
+ method @Deprecated public String getExtraInfo();
+ method @Deprecated public String getReason();
+ method @Deprecated public android.net.NetworkInfo.State getState();
+ method @Deprecated public int getSubtype();
+ method @Deprecated public String getSubtypeName();
+ method @Deprecated public int getType();
+ method @Deprecated public String getTypeName();
+ method @Deprecated public boolean isAvailable();
+ method @Deprecated public boolean isConnected();
+ method @Deprecated public boolean isConnectedOrConnecting();
+ method @Deprecated public boolean isFailover();
+ method @Deprecated public boolean isRoaming();
+ method @Deprecated public void setDetailedState(@NonNull android.net.NetworkInfo.DetailedState, @Nullable String, @Nullable String);
+ method @Deprecated public void writeToParcel(android.os.Parcel, int);
+ field @Deprecated @NonNull public static final android.os.Parcelable.Creator<android.net.NetworkInfo> CREATOR;
+ }
+
+ @Deprecated public enum NetworkInfo.DetailedState {
+ enum_constant @Deprecated public static final android.net.NetworkInfo.DetailedState AUTHENTICATING;
+ enum_constant @Deprecated public static final android.net.NetworkInfo.DetailedState BLOCKED;
+ enum_constant @Deprecated public static final android.net.NetworkInfo.DetailedState CAPTIVE_PORTAL_CHECK;
+ enum_constant @Deprecated public static final android.net.NetworkInfo.DetailedState CONNECTED;
+ enum_constant @Deprecated public static final android.net.NetworkInfo.DetailedState CONNECTING;
+ enum_constant @Deprecated public static final android.net.NetworkInfo.DetailedState DISCONNECTED;
+ enum_constant @Deprecated public static final android.net.NetworkInfo.DetailedState DISCONNECTING;
+ enum_constant @Deprecated public static final android.net.NetworkInfo.DetailedState FAILED;
+ enum_constant @Deprecated public static final android.net.NetworkInfo.DetailedState IDLE;
+ enum_constant @Deprecated public static final android.net.NetworkInfo.DetailedState OBTAINING_IPADDR;
+ enum_constant @Deprecated public static final android.net.NetworkInfo.DetailedState SCANNING;
+ enum_constant @Deprecated public static final android.net.NetworkInfo.DetailedState SUSPENDED;
+ enum_constant @Deprecated public static final android.net.NetworkInfo.DetailedState VERIFYING_POOR_LINK;
+ }
+
+ @Deprecated public enum NetworkInfo.State {
+ enum_constant @Deprecated public static final android.net.NetworkInfo.State CONNECTED;
+ enum_constant @Deprecated public static final android.net.NetworkInfo.State CONNECTING;
+ enum_constant @Deprecated public static final android.net.NetworkInfo.State DISCONNECTED;
+ enum_constant @Deprecated public static final android.net.NetworkInfo.State DISCONNECTING;
+ enum_constant @Deprecated public static final android.net.NetworkInfo.State SUSPENDED;
+ enum_constant @Deprecated public static final android.net.NetworkInfo.State UNKNOWN;
+ }
+
+ public class NetworkRequest implements android.os.Parcelable {
+ method public boolean canBeSatisfiedBy(@Nullable android.net.NetworkCapabilities);
+ method public int describeContents();
+ method @NonNull public int[] getCapabilities();
+ method @Nullable public android.net.NetworkSpecifier getNetworkSpecifier();
+ method @NonNull public int[] getTransportTypes();
+ method public boolean hasCapability(int);
+ method public boolean hasTransport(int);
+ method public void writeToParcel(android.os.Parcel, int);
+ field @NonNull public static final android.os.Parcelable.Creator<android.net.NetworkRequest> CREATOR;
+ }
+
+ public static class NetworkRequest.Builder {
+ ctor public NetworkRequest.Builder();
+ ctor public NetworkRequest.Builder(@NonNull android.net.NetworkRequest);
+ method public android.net.NetworkRequest.Builder addCapability(int);
+ method public android.net.NetworkRequest.Builder addTransportType(int);
+ method public android.net.NetworkRequest build();
+ method @NonNull public android.net.NetworkRequest.Builder clearCapabilities();
+ method public android.net.NetworkRequest.Builder removeCapability(int);
+ method public android.net.NetworkRequest.Builder removeTransportType(int);
+ method @NonNull public android.net.NetworkRequest.Builder setIncludeOtherUidNetworks(boolean);
+ method @Deprecated public android.net.NetworkRequest.Builder setNetworkSpecifier(String);
+ method public android.net.NetworkRequest.Builder setNetworkSpecifier(android.net.NetworkSpecifier);
+ }
+
+ public class ParseException extends java.lang.RuntimeException {
+ ctor public ParseException(@NonNull String);
+ ctor public ParseException(@NonNull String, @NonNull Throwable);
+ field public String response;
+ }
+
+ public class ProxyInfo implements android.os.Parcelable {
+ ctor public ProxyInfo(@Nullable android.net.ProxyInfo);
+ method public static android.net.ProxyInfo buildDirectProxy(String, int);
+ method public static android.net.ProxyInfo buildDirectProxy(String, int, java.util.List<java.lang.String>);
+ method public static android.net.ProxyInfo buildPacProxy(android.net.Uri);
+ method @NonNull public static android.net.ProxyInfo buildPacProxy(@NonNull android.net.Uri, int);
+ method public int describeContents();
+ method public String[] getExclusionList();
+ method public String getHost();
+ method public android.net.Uri getPacFileUrl();
+ method public int getPort();
+ method public boolean isValid();
+ method public void writeToParcel(android.os.Parcel, int);
+ field @NonNull public static final android.os.Parcelable.Creator<android.net.ProxyInfo> CREATOR;
+ }
+
+ public final class RouteInfo implements android.os.Parcelable {
+ method public int describeContents();
+ method @NonNull public android.net.IpPrefix getDestination();
+ method @Nullable public java.net.InetAddress getGateway();
+ method @Nullable public String getInterface();
+ method public int getType();
+ method public boolean hasGateway();
+ method public boolean isDefaultRoute();
+ method public boolean matches(java.net.InetAddress);
+ method public void writeToParcel(android.os.Parcel, int);
+ field @NonNull public static final android.os.Parcelable.Creator<android.net.RouteInfo> CREATOR;
+ field public static final int RTN_THROW = 9; // 0x9
+ field public static final int RTN_UNICAST = 1; // 0x1
+ field public static final int RTN_UNREACHABLE = 7; // 0x7
+ }
+
+ public abstract class SocketKeepalive implements java.lang.AutoCloseable {
+ method public final void close();
+ method public final void start(@IntRange(from=0xa, to=0xe10) int);
+ method public final void stop();
+ field public static final int ERROR_HARDWARE_ERROR = -31; // 0xffffffe1
+ field public static final int ERROR_INSUFFICIENT_RESOURCES = -32; // 0xffffffe0
+ field public static final int ERROR_INVALID_INTERVAL = -24; // 0xffffffe8
+ field public static final int ERROR_INVALID_IP_ADDRESS = -21; // 0xffffffeb
+ field public static final int ERROR_INVALID_LENGTH = -23; // 0xffffffe9
+ field public static final int ERROR_INVALID_NETWORK = -20; // 0xffffffec
+ field public static final int ERROR_INVALID_PORT = -22; // 0xffffffea
+ field public static final int ERROR_INVALID_SOCKET = -25; // 0xffffffe7
+ field public static final int ERROR_SOCKET_NOT_IDLE = -26; // 0xffffffe6
+ field public static final int ERROR_UNSUPPORTED = -30; // 0xffffffe2
+ }
+
+ public static class SocketKeepalive.Callback {
+ ctor public SocketKeepalive.Callback();
+ method public void onDataReceived();
+ method public void onError(int);
+ method public void onStarted();
+ method public void onStopped();
+ }
+
+ public final class StaticIpConfiguration implements android.os.Parcelable {
+ method public int describeContents();
+ method @NonNull public java.util.List<java.net.InetAddress> getDnsServers();
+ method @Nullable public String getDomains();
+ method @Nullable public java.net.InetAddress getGateway();
+ method @NonNull public android.net.LinkAddress getIpAddress();
+ method public void writeToParcel(@NonNull android.os.Parcel, int);
+ field @NonNull public static final android.os.Parcelable.Creator<android.net.StaticIpConfiguration> CREATOR;
+ }
+
+ public static final class StaticIpConfiguration.Builder {
+ ctor public StaticIpConfiguration.Builder();
+ method @NonNull public android.net.StaticIpConfiguration build();
+ method @NonNull public android.net.StaticIpConfiguration.Builder setDnsServers(@NonNull Iterable<java.net.InetAddress>);
+ method @NonNull public android.net.StaticIpConfiguration.Builder setDomains(@Nullable String);
+ method @NonNull public android.net.StaticIpConfiguration.Builder setGateway(@Nullable java.net.InetAddress);
+ method @NonNull public android.net.StaticIpConfiguration.Builder setIpAddress(@NonNull android.net.LinkAddress);
+ }
+
+ public interface TransportInfo {
+ }
+
+}
+
diff --git a/framework/cronet_disabled/api/lint-baseline.txt b/framework/cronet_disabled/api/lint-baseline.txt
new file mode 100644
index 0000000..2f4004a
--- /dev/null
+++ b/framework/cronet_disabled/api/lint-baseline.txt
@@ -0,0 +1,4 @@
+// Baseline format: 1.0
+VisiblySynchronized: android.net.NetworkInfo#toString():
+ Internal locks must not be exposed (synchronizing on this or class is still
+ externally observable): method android.net.NetworkInfo.toString()
diff --git a/framework/cronet_disabled/api/module-lib-current.txt b/framework/cronet_disabled/api/module-lib-current.txt
new file mode 100644
index 0000000..193bd92
--- /dev/null
+++ b/framework/cronet_disabled/api/module-lib-current.txt
@@ -0,0 +1,239 @@
+// Signature format: 2.0
+package android.net {
+
+ public final class ConnectivityFrameworkInitializer {
+ method public static void registerServiceWrappers();
+ }
+
+ public class ConnectivityManager {
+ method @RequiresPermission(anyOf={android.Manifest.permission.NETWORK_SETTINGS, android.Manifest.permission.NETWORK_STACK, android.net.NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK}) public void addUidToMeteredNetworkAllowList(int);
+ method @RequiresPermission(anyOf={android.Manifest.permission.NETWORK_SETTINGS, android.Manifest.permission.NETWORK_STACK, android.net.NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK}) public void addUidToMeteredNetworkDenyList(int);
+ method @RequiresPermission(anyOf={android.Manifest.permission.NETWORK_SETTINGS, android.net.NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK}) public void factoryReset();
+ method @NonNull @RequiresPermission(anyOf={android.net.NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK, android.Manifest.permission.NETWORK_STACK, android.Manifest.permission.NETWORK_SETTINGS}) public java.util.List<android.net.NetworkStateSnapshot> getAllNetworkStateSnapshots();
+ method @Nullable public android.net.ProxyInfo getGlobalProxy();
+ method @NonNull public static android.util.Range<java.lang.Integer> getIpSecNetIdRange();
+ method @Nullable @RequiresPermission(anyOf={android.net.NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK, android.Manifest.permission.NETWORK_STACK, android.Manifest.permission.NETWORK_SETTINGS}) public android.net.LinkProperties getRedactedLinkPropertiesForPackage(@NonNull android.net.LinkProperties, int, @NonNull String);
+ method @Nullable @RequiresPermission(anyOf={android.net.NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK, android.Manifest.permission.NETWORK_STACK, android.Manifest.permission.NETWORK_SETTINGS}) public android.net.NetworkCapabilities getRedactedNetworkCapabilitiesForPackage(@NonNull android.net.NetworkCapabilities, int, @NonNull String);
+ method @RequiresPermission(anyOf={android.net.NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK, android.Manifest.permission.NETWORK_SETTINGS}) public void registerDefaultNetworkCallbackForUid(int, @NonNull android.net.ConnectivityManager.NetworkCallback, @NonNull android.os.Handler);
+ method @RequiresPermission(anyOf={android.net.NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK, android.Manifest.permission.NETWORK_SETTINGS, android.Manifest.permission.NETWORK_SETUP_WIZARD, android.Manifest.permission.CONNECTIVITY_USE_RESTRICTED_NETWORKS}) public void registerSystemDefaultNetworkCallback(@NonNull android.net.ConnectivityManager.NetworkCallback, @NonNull android.os.Handler);
+ method @RequiresPermission(anyOf={android.Manifest.permission.NETWORK_SETTINGS, android.Manifest.permission.NETWORK_STACK, android.net.NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK}) public void removeUidFromMeteredNetworkAllowList(int);
+ method @RequiresPermission(anyOf={android.Manifest.permission.NETWORK_SETTINGS, android.Manifest.permission.NETWORK_STACK, android.net.NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK}) public void removeUidFromMeteredNetworkDenyList(int);
+ method @RequiresPermission(anyOf={android.Manifest.permission.NETWORK_SETTINGS, android.Manifest.permission.NETWORK_STACK, android.net.NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK}) public void replaceFirewallChain(int, @NonNull int[]);
+ method @RequiresPermission(anyOf={android.Manifest.permission.NETWORK_SETTINGS, android.Manifest.permission.NETWORK_STACK, android.net.NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK}) public void requestBackgroundNetwork(@NonNull android.net.NetworkRequest, @NonNull android.net.ConnectivityManager.NetworkCallback, @NonNull android.os.Handler);
+ method @Deprecated public boolean requestRouteToHostAddress(int, java.net.InetAddress);
+ method @RequiresPermission(anyOf={android.Manifest.permission.NETWORK_SETTINGS, android.Manifest.permission.NETWORK_SETUP_WIZARD, android.Manifest.permission.NETWORK_STACK, android.net.NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK}) public void setAcceptPartialConnectivity(@NonNull android.net.Network, boolean, boolean);
+ method @RequiresPermission(anyOf={android.Manifest.permission.NETWORK_SETTINGS, android.Manifest.permission.NETWORK_SETUP_WIZARD, android.Manifest.permission.NETWORK_STACK, android.net.NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK}) public void setAcceptUnvalidated(@NonNull android.net.Network, boolean, boolean);
+ method @RequiresPermission(anyOf={android.Manifest.permission.NETWORK_SETTINGS, android.Manifest.permission.NETWORK_SETUP_WIZARD, android.Manifest.permission.NETWORK_STACK, android.net.NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK}) public void setAvoidUnvalidated(@NonNull android.net.Network);
+ method @RequiresPermission(anyOf={android.Manifest.permission.NETWORK_SETTINGS, android.Manifest.permission.NETWORK_STACK, android.net.NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK}) public void setFirewallChainEnabled(int, boolean);
+ method @RequiresPermission(android.Manifest.permission.NETWORK_STACK) public void setGlobalProxy(@Nullable android.net.ProxyInfo);
+ method @RequiresPermission(anyOf={android.net.NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK, android.Manifest.permission.NETWORK_STACK, android.Manifest.permission.NETWORK_SETTINGS}) public void setLegacyLockdownVpnEnabled(boolean);
+ method @Deprecated @RequiresPermission(android.Manifest.permission.NETWORK_STACK) public void setProfileNetworkPreference(@NonNull android.os.UserHandle, int, @Nullable java.util.concurrent.Executor, @Nullable Runnable);
+ method @RequiresPermission(android.Manifest.permission.NETWORK_STACK) public void setProfileNetworkPreferences(@NonNull android.os.UserHandle, @NonNull java.util.List<android.net.ProfileNetworkPreference>, @Nullable java.util.concurrent.Executor, @Nullable Runnable);
+ method @RequiresPermission(anyOf={android.net.NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK, android.Manifest.permission.NETWORK_STACK, android.Manifest.permission.NETWORK_SETTINGS}) public void setRequireVpnForUids(boolean, @NonNull java.util.Collection<android.util.Range<java.lang.Integer>>);
+ method @RequiresPermission(anyOf={android.Manifest.permission.NETWORK_SETTINGS, android.Manifest.permission.NETWORK_STACK, android.net.NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK}) public void setUidFirewallRule(int, int, int);
+ method @RequiresPermission(anyOf={android.net.NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK, android.Manifest.permission.NETWORK_STACK, android.Manifest.permission.NETWORK_SETTINGS}) public void setVpnDefaultForUids(@NonNull String, @NonNull java.util.Collection<android.util.Range<java.lang.Integer>>);
+ method @RequiresPermission(anyOf={android.Manifest.permission.MANAGE_TEST_NETWORKS, android.Manifest.permission.NETWORK_STACK}) public void simulateDataStall(int, long, @NonNull android.net.Network, @NonNull android.os.PersistableBundle);
+ method @RequiresPermission(anyOf={android.Manifest.permission.NETWORK_SETTINGS, android.Manifest.permission.NETWORK_STACK, android.net.NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK}) public void startCaptivePortalApp(@NonNull android.net.Network);
+ method public void systemReady();
+ field public static final String ACTION_CLEAR_DNS_CACHE = "android.net.action.CLEAR_DNS_CACHE";
+ field public static final String ACTION_PROMPT_LOST_VALIDATION = "android.net.action.PROMPT_LOST_VALIDATION";
+ field public static final String ACTION_PROMPT_PARTIAL_CONNECTIVITY = "android.net.action.PROMPT_PARTIAL_CONNECTIVITY";
+ field public static final String ACTION_PROMPT_UNVALIDATED = "android.net.action.PROMPT_UNVALIDATED";
+ field public static final int BLOCKED_METERED_REASON_ADMIN_DISABLED = 262144; // 0x40000
+ field public static final int BLOCKED_METERED_REASON_DATA_SAVER = 65536; // 0x10000
+ field public static final int BLOCKED_METERED_REASON_MASK = -65536; // 0xffff0000
+ field public static final int BLOCKED_METERED_REASON_USER_RESTRICTED = 131072; // 0x20000
+ field public static final int BLOCKED_REASON_APP_STANDBY = 4; // 0x4
+ field public static final int BLOCKED_REASON_BATTERY_SAVER = 1; // 0x1
+ field public static final int BLOCKED_REASON_DOZE = 2; // 0x2
+ field public static final int BLOCKED_REASON_LOCKDOWN_VPN = 16; // 0x10
+ field public static final int BLOCKED_REASON_LOW_POWER_STANDBY = 32; // 0x20
+ field public static final int BLOCKED_REASON_NONE = 0; // 0x0
+ field public static final int BLOCKED_REASON_RESTRICTED_MODE = 8; // 0x8
+ field public static final int FIREWALL_CHAIN_DOZABLE = 1; // 0x1
+ field public static final int FIREWALL_CHAIN_LOW_POWER_STANDBY = 5; // 0x5
+ field public static final int FIREWALL_CHAIN_OEM_DENY_1 = 7; // 0x7
+ field public static final int FIREWALL_CHAIN_OEM_DENY_2 = 8; // 0x8
+ field public static final int FIREWALL_CHAIN_OEM_DENY_3 = 9; // 0x9
+ field public static final int FIREWALL_CHAIN_POWERSAVE = 3; // 0x3
+ field public static final int FIREWALL_CHAIN_RESTRICTED = 4; // 0x4
+ field public static final int FIREWALL_CHAIN_STANDBY = 2; // 0x2
+ field public static final int FIREWALL_RULE_ALLOW = 1; // 0x1
+ field public static final int FIREWALL_RULE_DEFAULT = 0; // 0x0
+ field public static final int FIREWALL_RULE_DENY = 2; // 0x2
+ field public static final int PROFILE_NETWORK_PREFERENCE_DEFAULT = 0; // 0x0
+ field public static final int PROFILE_NETWORK_PREFERENCE_ENTERPRISE = 1; // 0x1
+ field public static final int PROFILE_NETWORK_PREFERENCE_ENTERPRISE_BLOCKING = 3; // 0x3
+ field public static final int PROFILE_NETWORK_PREFERENCE_ENTERPRISE_NO_FALLBACK = 2; // 0x2
+ }
+
+ public static class ConnectivityManager.NetworkCallback {
+ method public void onBlockedStatusChanged(@NonNull android.net.Network, int);
+ }
+
+ public class ConnectivitySettingsManager {
+ method public static void clearGlobalProxy(@NonNull android.content.Context);
+ method @Nullable public static String getCaptivePortalHttpUrl(@NonNull android.content.Context);
+ method public static int getCaptivePortalMode(@NonNull android.content.Context, int);
+ method @NonNull public static java.time.Duration getConnectivityKeepPendingIntentDuration(@NonNull android.content.Context, @NonNull java.time.Duration);
+ method @NonNull public static android.util.Range<java.lang.Integer> getDnsResolverSampleRanges(@NonNull android.content.Context);
+ method @NonNull public static java.time.Duration getDnsResolverSampleValidityDuration(@NonNull android.content.Context, @NonNull java.time.Duration);
+ method public static int getDnsResolverSuccessThresholdPercent(@NonNull android.content.Context, int);
+ method @Nullable public static android.net.ProxyInfo getGlobalProxy(@NonNull android.content.Context);
+ method public static long getIngressRateLimitInBytesPerSecond(@NonNull android.content.Context);
+ method @NonNull public static java.time.Duration getMobileDataActivityTimeout(@NonNull android.content.Context, @NonNull java.time.Duration);
+ method public static boolean getMobileDataAlwaysOn(@NonNull android.content.Context, boolean);
+ method @NonNull public static java.util.Set<java.lang.Integer> getMobileDataPreferredUids(@NonNull android.content.Context);
+ method public static int getNetworkAvoidBadWifi(@NonNull android.content.Context);
+ method @Nullable public static String getNetworkMeteredMultipathPreference(@NonNull android.content.Context);
+ method public static int getNetworkSwitchNotificationMaximumDailyCount(@NonNull android.content.Context, int);
+ method @NonNull public static java.time.Duration getNetworkSwitchNotificationRateDuration(@NonNull android.content.Context, @NonNull java.time.Duration);
+ method @NonNull public static String getPrivateDnsDefaultMode(@NonNull android.content.Context);
+ method @Nullable public static String getPrivateDnsHostname(@NonNull android.content.Context);
+ method public static int getPrivateDnsMode(@NonNull android.content.Context);
+ method @NonNull public static java.util.Set<java.lang.Integer> getUidsAllowedOnRestrictedNetworks(@NonNull android.content.Context);
+ method public static boolean getWifiAlwaysRequested(@NonNull android.content.Context, boolean);
+ method @NonNull public static java.time.Duration getWifiDataActivityTimeout(@NonNull android.content.Context, @NonNull java.time.Duration);
+ method public static void setCaptivePortalHttpUrl(@NonNull android.content.Context, @Nullable String);
+ method public static void setCaptivePortalMode(@NonNull android.content.Context, int);
+ method public static void setConnectivityKeepPendingIntentDuration(@NonNull android.content.Context, @NonNull java.time.Duration);
+ method public static void setDnsResolverSampleRanges(@NonNull android.content.Context, @NonNull android.util.Range<java.lang.Integer>);
+ method public static void setDnsResolverSampleValidityDuration(@NonNull android.content.Context, @NonNull java.time.Duration);
+ method public static void setDnsResolverSuccessThresholdPercent(@NonNull android.content.Context, @IntRange(from=0, to=100) int);
+ method public static void setGlobalProxy(@NonNull android.content.Context, @NonNull android.net.ProxyInfo);
+ method public static void setIngressRateLimitInBytesPerSecond(@NonNull android.content.Context, @IntRange(from=-1L, to=4294967295L) long);
+ method public static void setMobileDataActivityTimeout(@NonNull android.content.Context, @NonNull java.time.Duration);
+ method public static void setMobileDataAlwaysOn(@NonNull android.content.Context, boolean);
+ method public static void setMobileDataPreferredUids(@NonNull android.content.Context, @NonNull java.util.Set<java.lang.Integer>);
+ method public static void setNetworkAvoidBadWifi(@NonNull android.content.Context, int);
+ method public static void setNetworkMeteredMultipathPreference(@NonNull android.content.Context, @NonNull String);
+ method public static void setNetworkSwitchNotificationMaximumDailyCount(@NonNull android.content.Context, @IntRange(from=0) int);
+ method public static void setNetworkSwitchNotificationRateDuration(@NonNull android.content.Context, @NonNull java.time.Duration);
+ method public static void setPrivateDnsDefaultMode(@NonNull android.content.Context, @NonNull int);
+ method public static void setPrivateDnsHostname(@NonNull android.content.Context, @Nullable String);
+ method public static void setPrivateDnsMode(@NonNull android.content.Context, int);
+ method public static void setUidsAllowedOnRestrictedNetworks(@NonNull android.content.Context, @NonNull java.util.Set<java.lang.Integer>);
+ method public static void setWifiAlwaysRequested(@NonNull android.content.Context, boolean);
+ method public static void setWifiDataActivityTimeout(@NonNull android.content.Context, @NonNull java.time.Duration);
+ field public static final int CAPTIVE_PORTAL_MODE_AVOID = 2; // 0x2
+ field public static final int CAPTIVE_PORTAL_MODE_IGNORE = 0; // 0x0
+ field public static final int CAPTIVE_PORTAL_MODE_PROMPT = 1; // 0x1
+ field public static final int NETWORK_AVOID_BAD_WIFI_AVOID = 2; // 0x2
+ field public static final int NETWORK_AVOID_BAD_WIFI_IGNORE = 0; // 0x0
+ field public static final int NETWORK_AVOID_BAD_WIFI_PROMPT = 1; // 0x1
+ field public static final int PRIVATE_DNS_MODE_OFF = 1; // 0x1
+ field public static final int PRIVATE_DNS_MODE_OPPORTUNISTIC = 2; // 0x2
+ field public static final int PRIVATE_DNS_MODE_PROVIDER_HOSTNAME = 3; // 0x3
+ }
+
+ public final class DhcpOption implements android.os.Parcelable {
+ ctor public DhcpOption(byte, @Nullable byte[]);
+ method public int describeContents();
+ method public byte getType();
+ method @Nullable public byte[] getValue();
+ method public void writeToParcel(@NonNull android.os.Parcel, int);
+ field @NonNull public static final android.os.Parcelable.Creator<android.net.DhcpOption> CREATOR;
+ }
+
+ public final class NetworkAgentConfig implements android.os.Parcelable {
+ method @Nullable public String getSubscriberId();
+ method public boolean isBypassableVpn();
+ method public boolean isVpnValidationRequired();
+ }
+
+ public static final class NetworkAgentConfig.Builder {
+ method @NonNull public android.net.NetworkAgentConfig.Builder setBypassableVpn(boolean);
+ method @NonNull public android.net.NetworkAgentConfig.Builder setLocalRoutesExcludedForVpn(boolean);
+ method @NonNull public android.net.NetworkAgentConfig.Builder setSubscriberId(@Nullable String);
+ method @NonNull public android.net.NetworkAgentConfig.Builder setVpnRequiresValidation(boolean);
+ }
+
+ public final class NetworkCapabilities implements android.os.Parcelable {
+ method @NonNull @RequiresPermission(android.Manifest.permission.NETWORK_FACTORY) public java.util.Set<java.lang.Integer> getAllowedUids();
+ method @Nullable public java.util.Set<android.util.Range<java.lang.Integer>> getUids();
+ method public boolean hasForbiddenCapability(int);
+ field public static final long REDACT_ALL = -1L; // 0xffffffffffffffffL
+ field public static final long REDACT_FOR_ACCESS_FINE_LOCATION = 1L; // 0x1L
+ field public static final long REDACT_FOR_LOCAL_MAC_ADDRESS = 2L; // 0x2L
+ field public static final long REDACT_FOR_NETWORK_SETTINGS = 4L; // 0x4L
+ field public static final long REDACT_NONE = 0L; // 0x0L
+ field public static final int TRANSPORT_TEST = 7; // 0x7
+ }
+
+ public static final class NetworkCapabilities.Builder {
+ method @NonNull @RequiresPermission(android.Manifest.permission.NETWORK_FACTORY) public android.net.NetworkCapabilities.Builder setAllowedUids(@NonNull java.util.Set<java.lang.Integer>);
+ method @NonNull public android.net.NetworkCapabilities.Builder setUids(@Nullable java.util.Set<android.util.Range<java.lang.Integer>>);
+ }
+
+ public class NetworkRequest implements android.os.Parcelable {
+ method @NonNull public int[] getEnterpriseIds();
+ method @NonNull public int[] getForbiddenCapabilities();
+ method public boolean hasEnterpriseId(int);
+ method public boolean hasForbiddenCapability(int);
+ }
+
+ public static class NetworkRequest.Builder {
+ method @NonNull public android.net.NetworkRequest.Builder addForbiddenCapability(int);
+ method @NonNull public android.net.NetworkRequest.Builder removeForbiddenCapability(int);
+ method @NonNull public android.net.NetworkRequest.Builder setUids(@Nullable java.util.Set<android.util.Range<java.lang.Integer>>);
+ }
+
+ public final class ProfileNetworkPreference implements android.os.Parcelable {
+ method public int describeContents();
+ method @NonNull public int[] getExcludedUids();
+ method @NonNull public int[] getIncludedUids();
+ method public int getPreference();
+ method public int getPreferenceEnterpriseId();
+ method public void writeToParcel(@NonNull android.os.Parcel, int);
+ field @NonNull public static final android.os.Parcelable.Creator<android.net.ProfileNetworkPreference> CREATOR;
+ }
+
+ public static final class ProfileNetworkPreference.Builder {
+ ctor public ProfileNetworkPreference.Builder();
+ method @NonNull public android.net.ProfileNetworkPreference build();
+ method @NonNull public android.net.ProfileNetworkPreference.Builder setExcludedUids(@NonNull int[]);
+ method @NonNull public android.net.ProfileNetworkPreference.Builder setIncludedUids(@NonNull int[]);
+ method @NonNull public android.net.ProfileNetworkPreference.Builder setPreference(int);
+ method @NonNull public android.net.ProfileNetworkPreference.Builder setPreferenceEnterpriseId(int);
+ }
+
+ public final class TestNetworkInterface implements android.os.Parcelable {
+ ctor public TestNetworkInterface(@NonNull android.os.ParcelFileDescriptor, @NonNull String);
+ method public int describeContents();
+ method @NonNull public android.os.ParcelFileDescriptor getFileDescriptor();
+ method @NonNull public String getInterfaceName();
+ method @Nullable public android.net.MacAddress getMacAddress();
+ method public int getMtu();
+ method public void writeToParcel(@NonNull android.os.Parcel, int);
+ field @NonNull public static final android.os.Parcelable.Creator<android.net.TestNetworkInterface> CREATOR;
+ }
+
+ public class TestNetworkManager {
+ method @NonNull @RequiresPermission(android.Manifest.permission.MANAGE_TEST_NETWORKS) public android.net.TestNetworkInterface createTapInterface();
+ method @NonNull @RequiresPermission(android.Manifest.permission.MANAGE_TEST_NETWORKS) public android.net.TestNetworkInterface createTunInterface(@NonNull java.util.Collection<android.net.LinkAddress>);
+ method @RequiresPermission(android.Manifest.permission.MANAGE_TEST_NETWORKS) public void setupTestNetwork(@NonNull String, @NonNull android.os.IBinder);
+ method @RequiresPermission(android.Manifest.permission.MANAGE_TEST_NETWORKS) public void teardownTestNetwork(@NonNull android.net.Network);
+ field public static final String TEST_TAP_PREFIX = "testtap";
+ }
+
+ public final class TestNetworkSpecifier extends android.net.NetworkSpecifier implements android.os.Parcelable {
+ ctor public TestNetworkSpecifier(@NonNull String);
+ method public int describeContents();
+ method @Nullable public String getInterfaceName();
+ method public void writeToParcel(@NonNull android.os.Parcel, int);
+ field @NonNull public static final android.os.Parcelable.Creator<android.net.TestNetworkSpecifier> CREATOR;
+ }
+
+ public interface TransportInfo {
+ method public default long getApplicableRedactions();
+ method @NonNull public default android.net.TransportInfo makeCopy(long);
+ }
+
+ public final class VpnTransportInfo implements android.os.Parcelable android.net.TransportInfo {
+ ctor @Deprecated public VpnTransportInfo(int, @Nullable String);
+ method @Nullable public String getSessionId();
+ method @NonNull public android.net.VpnTransportInfo makeCopy(long);
+ }
+
+}
+
diff --git a/Tethering/common/TetheringLib/cronet_enabled/api/module-lib-removed.txt b/framework/cronet_disabled/api/module-lib-removed.txt
similarity index 100%
rename from Tethering/common/TetheringLib/cronet_enabled/api/module-lib-removed.txt
rename to framework/cronet_disabled/api/module-lib-removed.txt
diff --git a/framework/cronet_disabled/api/removed.txt b/framework/cronet_disabled/api/removed.txt
new file mode 100644
index 0000000..303a1e6
--- /dev/null
+++ b/framework/cronet_disabled/api/removed.txt
@@ -0,0 +1,11 @@
+// Signature format: 2.0
+package android.net {
+
+ public class ConnectivityManager {
+ method @Deprecated public boolean requestRouteToHost(int, int);
+ method @Deprecated public int startUsingNetworkFeature(int, String);
+ method @Deprecated public int stopUsingNetworkFeature(int, String);
+ }
+
+}
+
diff --git a/framework/cronet_disabled/api/system-current.txt b/framework/cronet_disabled/api/system-current.txt
new file mode 100644
index 0000000..4a2ed8a
--- /dev/null
+++ b/framework/cronet_disabled/api/system-current.txt
@@ -0,0 +1,544 @@
+// Signature format: 2.0
+package android.net {
+
+ public class CaptivePortal implements android.os.Parcelable {
+ method @Deprecated public void logEvent(int, @NonNull String);
+ method @RequiresPermission(android.Manifest.permission.NETWORK_STACK) public void reevaluateNetwork();
+ method public void useNetwork();
+ field public static final int APP_REQUEST_REEVALUATION_REQUIRED = 100; // 0x64
+ field public static final int APP_RETURN_DISMISSED = 0; // 0x0
+ field public static final int APP_RETURN_UNWANTED = 1; // 0x1
+ field public static final int APP_RETURN_WANTED_AS_IS = 2; // 0x2
+ }
+
+ public final class CaptivePortalData implements android.os.Parcelable {
+ method public int describeContents();
+ method public long getByteLimit();
+ method public long getExpiryTimeMillis();
+ method public long getRefreshTimeMillis();
+ method @Nullable public android.net.Uri getUserPortalUrl();
+ method public int getUserPortalUrlSource();
+ method @Nullable public CharSequence getVenueFriendlyName();
+ method @Nullable public android.net.Uri getVenueInfoUrl();
+ method public int getVenueInfoUrlSource();
+ method public boolean isCaptive();
+ method public boolean isSessionExtendable();
+ method public void writeToParcel(@NonNull android.os.Parcel, int);
+ field public static final int CAPTIVE_PORTAL_DATA_SOURCE_OTHER = 0; // 0x0
+ field public static final int CAPTIVE_PORTAL_DATA_SOURCE_PASSPOINT = 1; // 0x1
+ field @NonNull public static final android.os.Parcelable.Creator<android.net.CaptivePortalData> CREATOR;
+ }
+
+ public static class CaptivePortalData.Builder {
+ ctor public CaptivePortalData.Builder();
+ ctor public CaptivePortalData.Builder(@Nullable android.net.CaptivePortalData);
+ method @NonNull public android.net.CaptivePortalData build();
+ method @NonNull public android.net.CaptivePortalData.Builder setBytesRemaining(long);
+ method @NonNull public android.net.CaptivePortalData.Builder setCaptive(boolean);
+ method @NonNull public android.net.CaptivePortalData.Builder setExpiryTime(long);
+ method @NonNull public android.net.CaptivePortalData.Builder setRefreshTime(long);
+ method @NonNull public android.net.CaptivePortalData.Builder setSessionExtendable(boolean);
+ method @NonNull public android.net.CaptivePortalData.Builder setUserPortalUrl(@Nullable android.net.Uri);
+ method @NonNull public android.net.CaptivePortalData.Builder setUserPortalUrl(@Nullable android.net.Uri, int);
+ method @NonNull public android.net.CaptivePortalData.Builder setVenueFriendlyName(@Nullable CharSequence);
+ method @NonNull public android.net.CaptivePortalData.Builder setVenueInfoUrl(@Nullable android.net.Uri);
+ method @NonNull public android.net.CaptivePortalData.Builder setVenueInfoUrl(@Nullable android.net.Uri, int);
+ }
+
+ public class ConnectivityManager {
+ method @NonNull @RequiresPermission(android.Manifest.permission.PACKET_KEEPALIVE_OFFLOAD) public android.net.SocketKeepalive createNattKeepalive(@NonNull android.net.Network, @NonNull android.os.ParcelFileDescriptor, @NonNull java.net.InetAddress, @NonNull java.net.InetAddress, @NonNull java.util.concurrent.Executor, @NonNull android.net.SocketKeepalive.Callback);
+ method @NonNull @RequiresPermission(android.Manifest.permission.PACKET_KEEPALIVE_OFFLOAD) public android.net.SocketKeepalive createSocketKeepalive(@NonNull android.net.Network, @NonNull java.net.Socket, @NonNull java.util.concurrent.Executor, @NonNull android.net.SocketKeepalive.Callback);
+ method @Deprecated @RequiresPermission(android.Manifest.permission.NETWORK_SETTINGS) public String getCaptivePortalServerUrl();
+ method @Deprecated @RequiresPermission(android.Manifest.permission.TETHER_PRIVILEGED) public void getLatestTetheringEntitlementResult(int, boolean, @NonNull java.util.concurrent.Executor, @NonNull android.net.ConnectivityManager.OnTetheringEntitlementResultListener);
+ method @Deprecated @RequiresPermission(anyOf={android.Manifest.permission.TETHER_PRIVILEGED, android.Manifest.permission.WRITE_SETTINGS}) public boolean isTetheringSupported();
+ method @RequiresPermission(anyOf={android.net.NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK, android.Manifest.permission.NETWORK_FACTORY}) public int registerNetworkProvider(@NonNull android.net.NetworkProvider);
+ method public void registerQosCallback(@NonNull android.net.QosSocketInfo, @NonNull java.util.concurrent.Executor, @NonNull android.net.QosCallback);
+ method @Deprecated @RequiresPermission(android.Manifest.permission.TETHER_PRIVILEGED) public void registerTetheringEventCallback(@NonNull java.util.concurrent.Executor, @NonNull android.net.ConnectivityManager.OnTetheringEventCallback);
+ method @RequiresPermission(android.net.NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK) public void requestNetwork(@NonNull android.net.NetworkRequest, int, int, @NonNull android.os.Handler, @NonNull android.net.ConnectivityManager.NetworkCallback);
+ method @RequiresPermission(anyOf={android.Manifest.permission.NETWORK_AIRPLANE_MODE, android.Manifest.permission.NETWORK_SETTINGS, android.Manifest.permission.NETWORK_SETUP_WIZARD, android.Manifest.permission.NETWORK_STACK}) public void setAirplaneMode(boolean);
+ method @RequiresPermission(android.Manifest.permission.CONTROL_OEM_PAID_NETWORK_PREFERENCE) public void setOemNetworkPreference(@NonNull android.net.OemNetworkPreferences, @Nullable java.util.concurrent.Executor, @Nullable Runnable);
+ method @RequiresPermission(anyOf={android.net.NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK, android.Manifest.permission.NETWORK_STACK}) public boolean shouldAvoidBadWifi();
+ method @RequiresPermission(android.net.NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK) public void startCaptivePortalApp(@NonNull android.net.Network, @NonNull android.os.Bundle);
+ method @Deprecated @RequiresPermission(android.Manifest.permission.TETHER_PRIVILEGED) public void startTethering(int, boolean, android.net.ConnectivityManager.OnStartTetheringCallback);
+ method @Deprecated @RequiresPermission(android.Manifest.permission.TETHER_PRIVILEGED) public void startTethering(int, boolean, android.net.ConnectivityManager.OnStartTetheringCallback, android.os.Handler);
+ method @Deprecated @RequiresPermission(android.Manifest.permission.TETHER_PRIVILEGED) public void stopTethering(int);
+ method @RequiresPermission(anyOf={android.net.NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK, android.Manifest.permission.NETWORK_FACTORY}) public void unregisterNetworkProvider(@NonNull android.net.NetworkProvider);
+ method public void unregisterQosCallback(@NonNull android.net.QosCallback);
+ method @Deprecated @RequiresPermission(android.Manifest.permission.TETHER_PRIVILEGED) public void unregisterTetheringEventCallback(@NonNull android.net.ConnectivityManager.OnTetheringEventCallback);
+ field public static final String EXTRA_CAPTIVE_PORTAL_PROBE_SPEC = "android.net.extra.CAPTIVE_PORTAL_PROBE_SPEC";
+ field public static final String EXTRA_CAPTIVE_PORTAL_USER_AGENT = "android.net.extra.CAPTIVE_PORTAL_USER_AGENT";
+ field public static final int TETHERING_BLUETOOTH = 2; // 0x2
+ field public static final int TETHERING_USB = 1; // 0x1
+ field public static final int TETHERING_WIFI = 0; // 0x0
+ field @Deprecated public static final int TETHER_ERROR_ENTITLEMENT_UNKONWN = 13; // 0xd
+ field @Deprecated public static final int TETHER_ERROR_NO_ERROR = 0; // 0x0
+ field @Deprecated public static final int TETHER_ERROR_PROVISION_FAILED = 11; // 0xb
+ field public static final int TYPE_NONE = -1; // 0xffffffff
+ field @Deprecated public static final int TYPE_PROXY = 16; // 0x10
+ field @Deprecated public static final int TYPE_WIFI_P2P = 13; // 0xd
+ }
+
+ @Deprecated public abstract static class ConnectivityManager.OnStartTetheringCallback {
+ ctor @Deprecated public ConnectivityManager.OnStartTetheringCallback();
+ method @Deprecated public void onTetheringFailed();
+ method @Deprecated public void onTetheringStarted();
+ }
+
+ @Deprecated public static interface ConnectivityManager.OnTetheringEntitlementResultListener {
+ method @Deprecated public void onTetheringEntitlementResult(int);
+ }
+
+ @Deprecated public abstract static class ConnectivityManager.OnTetheringEventCallback {
+ ctor @Deprecated public ConnectivityManager.OnTetheringEventCallback();
+ method @Deprecated public void onUpstreamChanged(@Nullable android.net.Network);
+ }
+
+ public final class DscpPolicy implements android.os.Parcelable {
+ method @Nullable public java.net.InetAddress getDestinationAddress();
+ method @Nullable public android.util.Range<java.lang.Integer> getDestinationPortRange();
+ method public int getDscpValue();
+ method public int getPolicyId();
+ method public int getProtocol();
+ method @Nullable public java.net.InetAddress getSourceAddress();
+ method public int getSourcePort();
+ field @NonNull public static final android.os.Parcelable.Creator<android.net.DscpPolicy> CREATOR;
+ field public static final int PROTOCOL_ANY = -1; // 0xffffffff
+ field public static final int SOURCE_PORT_ANY = -1; // 0xffffffff
+ }
+
+ public static final class DscpPolicy.Builder {
+ ctor public DscpPolicy.Builder(int, int);
+ method @NonNull public android.net.DscpPolicy build();
+ method @NonNull public android.net.DscpPolicy.Builder setDestinationAddress(@NonNull java.net.InetAddress);
+ method @NonNull public android.net.DscpPolicy.Builder setDestinationPortRange(@NonNull android.util.Range<java.lang.Integer>);
+ method @NonNull public android.net.DscpPolicy.Builder setProtocol(int);
+ method @NonNull public android.net.DscpPolicy.Builder setSourceAddress(@NonNull java.net.InetAddress);
+ method @NonNull public android.net.DscpPolicy.Builder setSourcePort(int);
+ }
+
+ public final class InvalidPacketException extends java.lang.Exception {
+ ctor public InvalidPacketException(int);
+ method public int getError();
+ field public static final int ERROR_INVALID_IP_ADDRESS = -21; // 0xffffffeb
+ field public static final int ERROR_INVALID_LENGTH = -23; // 0xffffffe9
+ field public static final int ERROR_INVALID_PORT = -22; // 0xffffffea
+ }
+
+ public final class IpConfiguration implements android.os.Parcelable {
+ ctor public IpConfiguration();
+ ctor public IpConfiguration(@NonNull android.net.IpConfiguration);
+ method @NonNull public android.net.IpConfiguration.IpAssignment getIpAssignment();
+ method @NonNull public android.net.IpConfiguration.ProxySettings getProxySettings();
+ method public void setHttpProxy(@Nullable android.net.ProxyInfo);
+ method public void setIpAssignment(@NonNull android.net.IpConfiguration.IpAssignment);
+ method public void setProxySettings(@NonNull android.net.IpConfiguration.ProxySettings);
+ method public void setStaticIpConfiguration(@Nullable android.net.StaticIpConfiguration);
+ }
+
+ public enum IpConfiguration.IpAssignment {
+ enum_constant public static final android.net.IpConfiguration.IpAssignment DHCP;
+ enum_constant public static final android.net.IpConfiguration.IpAssignment STATIC;
+ enum_constant public static final android.net.IpConfiguration.IpAssignment UNASSIGNED;
+ }
+
+ public enum IpConfiguration.ProxySettings {
+ enum_constant public static final android.net.IpConfiguration.ProxySettings NONE;
+ enum_constant public static final android.net.IpConfiguration.ProxySettings PAC;
+ enum_constant public static final android.net.IpConfiguration.ProxySettings STATIC;
+ enum_constant public static final android.net.IpConfiguration.ProxySettings UNASSIGNED;
+ }
+
+ public final class IpPrefix implements android.os.Parcelable {
+ ctor public IpPrefix(@NonNull String);
+ }
+
+ public class KeepalivePacketData {
+ ctor protected KeepalivePacketData(@NonNull java.net.InetAddress, @IntRange(from=0, to=65535) int, @NonNull java.net.InetAddress, @IntRange(from=0, to=65535) int, @NonNull byte[]) throws android.net.InvalidPacketException;
+ method @NonNull public java.net.InetAddress getDstAddress();
+ method public int getDstPort();
+ method @NonNull public byte[] getPacket();
+ method @NonNull public java.net.InetAddress getSrcAddress();
+ method public int getSrcPort();
+ }
+
+ public class LinkAddress implements android.os.Parcelable {
+ ctor public LinkAddress(@NonNull java.net.InetAddress, @IntRange(from=0, to=128) int, int, int);
+ ctor public LinkAddress(@NonNull java.net.InetAddress, @IntRange(from=0, to=128) int, int, int, long, long);
+ ctor public LinkAddress(@NonNull java.net.InetAddress, @IntRange(from=0, to=128) int);
+ ctor public LinkAddress(@NonNull String);
+ ctor public LinkAddress(@NonNull String, int, int);
+ method public long getDeprecationTime();
+ method public long getExpirationTime();
+ method public boolean isGlobalPreferred();
+ method public boolean isIpv4();
+ method public boolean isIpv6();
+ method public boolean isSameAddressAs(@Nullable android.net.LinkAddress);
+ field public static final long LIFETIME_PERMANENT = 9223372036854775807L; // 0x7fffffffffffffffL
+ field public static final long LIFETIME_UNKNOWN = -1L; // 0xffffffffffffffffL
+ }
+
+ public final class LinkProperties implements android.os.Parcelable {
+ ctor public LinkProperties(@Nullable android.net.LinkProperties);
+ ctor public LinkProperties(@Nullable android.net.LinkProperties, boolean);
+ method public boolean addDnsServer(@NonNull java.net.InetAddress);
+ method public boolean addLinkAddress(@NonNull android.net.LinkAddress);
+ method public boolean addPcscfServer(@NonNull java.net.InetAddress);
+ method @NonNull public java.util.List<java.net.InetAddress> getAddresses();
+ method @NonNull public java.util.List<java.lang.String> getAllInterfaceNames();
+ method @NonNull public java.util.List<android.net.LinkAddress> getAllLinkAddresses();
+ method @NonNull public java.util.List<android.net.RouteInfo> getAllRoutes();
+ method @Nullable public android.net.Uri getCaptivePortalApiUrl();
+ method @Nullable public android.net.CaptivePortalData getCaptivePortalData();
+ method @NonNull public java.util.List<java.net.InetAddress> getPcscfServers();
+ method @Nullable public String getTcpBufferSizes();
+ method @NonNull public java.util.List<java.net.InetAddress> getValidatedPrivateDnsServers();
+ method public boolean hasGlobalIpv6Address();
+ method public boolean hasIpv4Address();
+ method public boolean hasIpv4DefaultRoute();
+ method public boolean hasIpv4DnsServer();
+ method public boolean hasIpv6DefaultRoute();
+ method public boolean hasIpv6DnsServer();
+ method public boolean isIpv4Provisioned();
+ method public boolean isIpv6Provisioned();
+ method public boolean isProvisioned();
+ method public boolean isReachable(@NonNull java.net.InetAddress);
+ method public boolean removeDnsServer(@NonNull java.net.InetAddress);
+ method public boolean removeLinkAddress(@NonNull android.net.LinkAddress);
+ method public boolean removeRoute(@NonNull android.net.RouteInfo);
+ method public void setCaptivePortalApiUrl(@Nullable android.net.Uri);
+ method public void setCaptivePortalData(@Nullable android.net.CaptivePortalData);
+ method public void setPcscfServers(@NonNull java.util.Collection<java.net.InetAddress>);
+ method public void setPrivateDnsServerName(@Nullable String);
+ method public void setTcpBufferSizes(@Nullable String);
+ method public void setUsePrivateDns(boolean);
+ method public void setValidatedPrivateDnsServers(@NonNull java.util.Collection<java.net.InetAddress>);
+ }
+
+ public final class NattKeepalivePacketData extends android.net.KeepalivePacketData implements android.os.Parcelable {
+ ctor public NattKeepalivePacketData(@NonNull java.net.InetAddress, int, @NonNull java.net.InetAddress, int, @NonNull byte[]) throws android.net.InvalidPacketException;
+ method public int describeContents();
+ method public void writeToParcel(@NonNull android.os.Parcel, int);
+ field @NonNull public static final android.os.Parcelable.Creator<android.net.NattKeepalivePacketData> CREATOR;
+ }
+
+ public class Network implements android.os.Parcelable {
+ ctor public Network(@NonNull android.net.Network);
+ method public int getNetId();
+ method @NonNull public android.net.Network getPrivateDnsBypassingCopy();
+ }
+
+ public abstract class NetworkAgent {
+ ctor public NetworkAgent(@NonNull android.content.Context, @NonNull android.os.Looper, @NonNull String, @NonNull android.net.NetworkCapabilities, @NonNull android.net.LinkProperties, int, @NonNull android.net.NetworkAgentConfig, @Nullable android.net.NetworkProvider);
+ ctor public NetworkAgent(@NonNull android.content.Context, @NonNull android.os.Looper, @NonNull String, @NonNull android.net.NetworkCapabilities, @NonNull android.net.LinkProperties, @NonNull android.net.NetworkScore, @NonNull android.net.NetworkAgentConfig, @Nullable android.net.NetworkProvider);
+ method @Nullable public android.net.Network getNetwork();
+ method public void markConnected();
+ method public void onAddKeepalivePacketFilter(int, @NonNull android.net.KeepalivePacketData);
+ method public void onAutomaticReconnectDisabled();
+ method public void onBandwidthUpdateRequested();
+ method public void onDscpPolicyStatusUpdated(int, int);
+ method public void onNetworkCreated();
+ method public void onNetworkDestroyed();
+ method public void onNetworkUnwanted();
+ method public void onQosCallbackRegistered(int, @NonNull android.net.QosFilter);
+ method public void onQosCallbackUnregistered(int);
+ method public void onRemoveKeepalivePacketFilter(int);
+ method public void onSaveAcceptUnvalidated(boolean);
+ method public void onSignalStrengthThresholdsUpdated(@NonNull int[]);
+ method public void onStartSocketKeepalive(int, @NonNull java.time.Duration, @NonNull android.net.KeepalivePacketData);
+ method public void onStopSocketKeepalive(int);
+ method public void onValidationStatus(int, @Nullable android.net.Uri);
+ method @NonNull public android.net.Network register();
+ method public void sendAddDscpPolicy(@NonNull android.net.DscpPolicy);
+ method public void sendLinkProperties(@NonNull android.net.LinkProperties);
+ method public void sendNetworkCapabilities(@NonNull android.net.NetworkCapabilities);
+ method public void sendNetworkScore(@NonNull android.net.NetworkScore);
+ method public void sendNetworkScore(@IntRange(from=0, to=99) int);
+ method public final void sendQosCallbackError(int, int);
+ method public final void sendQosSessionAvailable(int, int, @NonNull android.net.QosSessionAttributes);
+ method public final void sendQosSessionLost(int, int, int);
+ method public void sendRemoveAllDscpPolicies();
+ method public void sendRemoveDscpPolicy(int);
+ method public final void sendSocketKeepaliveEvent(int, int);
+ method @Deprecated public void setLegacySubtype(int, @NonNull String);
+ method public void setLingerDuration(@NonNull java.time.Duration);
+ method public void setTeardownDelayMillis(@IntRange(from=0, to=0x1388) int);
+ method public void setUnderlyingNetworks(@Nullable java.util.List<android.net.Network>);
+ method public void unregister();
+ method public void unregisterAfterReplacement(@IntRange(from=0, to=0x1388) int);
+ field public static final int DSCP_POLICY_STATUS_DELETED = 4; // 0x4
+ field public static final int DSCP_POLICY_STATUS_INSUFFICIENT_PROCESSING_RESOURCES = 3; // 0x3
+ field public static final int DSCP_POLICY_STATUS_POLICY_NOT_FOUND = 5; // 0x5
+ field public static final int DSCP_POLICY_STATUS_REQUESTED_CLASSIFIER_NOT_SUPPORTED = 2; // 0x2
+ field public static final int DSCP_POLICY_STATUS_REQUEST_DECLINED = 1; // 0x1
+ field public static final int DSCP_POLICY_STATUS_SUCCESS = 0; // 0x0
+ field public static final int VALIDATION_STATUS_NOT_VALID = 2; // 0x2
+ field public static final int VALIDATION_STATUS_VALID = 1; // 0x1
+ }
+
+ public final class NetworkAgentConfig implements android.os.Parcelable {
+ method public int describeContents();
+ method public int getLegacyType();
+ method @NonNull public String getLegacyTypeName();
+ method public boolean isExplicitlySelected();
+ method public boolean isPartialConnectivityAcceptable();
+ method public boolean isUnvalidatedConnectivityAcceptable();
+ method public void writeToParcel(@NonNull android.os.Parcel, int);
+ field @NonNull public static final android.os.Parcelable.Creator<android.net.NetworkAgentConfig> CREATOR;
+ }
+
+ public static final class NetworkAgentConfig.Builder {
+ ctor public NetworkAgentConfig.Builder();
+ method @NonNull public android.net.NetworkAgentConfig build();
+ method @NonNull public android.net.NetworkAgentConfig.Builder setExplicitlySelected(boolean);
+ method @NonNull public android.net.NetworkAgentConfig.Builder setLegacyExtraInfo(@NonNull String);
+ method @NonNull public android.net.NetworkAgentConfig.Builder setLegacySubType(int);
+ method @NonNull public android.net.NetworkAgentConfig.Builder setLegacySubTypeName(@NonNull String);
+ method @NonNull public android.net.NetworkAgentConfig.Builder setLegacyType(int);
+ method @NonNull public android.net.NetworkAgentConfig.Builder setLegacyTypeName(@NonNull String);
+ method @NonNull public android.net.NetworkAgentConfig.Builder setNat64DetectionEnabled(boolean);
+ method @NonNull public android.net.NetworkAgentConfig.Builder setPartialConnectivityAcceptable(boolean);
+ method @NonNull public android.net.NetworkAgentConfig.Builder setProvisioningNotificationEnabled(boolean);
+ method @NonNull public android.net.NetworkAgentConfig.Builder setUnvalidatedConnectivityAcceptable(boolean);
+ }
+
+ public final class NetworkCapabilities implements android.os.Parcelable {
+ method @NonNull public int[] getAdministratorUids();
+ method @Nullable public static String getCapabilityCarrierName(int);
+ method @Nullable public String getSsid();
+ method @NonNull public java.util.Set<java.lang.Integer> getSubscriptionIds();
+ method @NonNull public int[] getTransportTypes();
+ method @Nullable public java.util.List<android.net.Network> getUnderlyingNetworks();
+ method public boolean isPrivateDnsBroken();
+ method public boolean satisfiedByNetworkCapabilities(@Nullable android.net.NetworkCapabilities);
+ field public static final int NET_CAPABILITY_BIP = 31; // 0x1f
+ field public static final int NET_CAPABILITY_NOT_VCN_MANAGED = 28; // 0x1c
+ field public static final int NET_CAPABILITY_OEM_PAID = 22; // 0x16
+ field public static final int NET_CAPABILITY_OEM_PRIVATE = 26; // 0x1a
+ field public static final int NET_CAPABILITY_PARTIAL_CONNECTIVITY = 24; // 0x18
+ field public static final int NET_CAPABILITY_VEHICLE_INTERNAL = 27; // 0x1b
+ field public static final int NET_CAPABILITY_VSIM = 30; // 0x1e
+ }
+
+ public static final class NetworkCapabilities.Builder {
+ ctor public NetworkCapabilities.Builder();
+ ctor public NetworkCapabilities.Builder(@NonNull android.net.NetworkCapabilities);
+ method @NonNull public android.net.NetworkCapabilities.Builder addCapability(int);
+ method @NonNull public android.net.NetworkCapabilities.Builder addEnterpriseId(int);
+ method @NonNull public android.net.NetworkCapabilities.Builder addTransportType(int);
+ method @NonNull public android.net.NetworkCapabilities build();
+ method @NonNull public android.net.NetworkCapabilities.Builder removeCapability(int);
+ method @NonNull public android.net.NetworkCapabilities.Builder removeEnterpriseId(int);
+ method @NonNull public android.net.NetworkCapabilities.Builder removeTransportType(int);
+ method @NonNull @RequiresPermission(android.Manifest.permission.NETWORK_FACTORY) public android.net.NetworkCapabilities.Builder setAdministratorUids(@NonNull int[]);
+ method @NonNull public android.net.NetworkCapabilities.Builder setLinkDownstreamBandwidthKbps(int);
+ method @NonNull public android.net.NetworkCapabilities.Builder setLinkUpstreamBandwidthKbps(int);
+ method @NonNull public android.net.NetworkCapabilities.Builder setNetworkSpecifier(@Nullable android.net.NetworkSpecifier);
+ method @NonNull @RequiresPermission(android.Manifest.permission.NETWORK_FACTORY) public android.net.NetworkCapabilities.Builder setOwnerUid(int);
+ method @NonNull @RequiresPermission(android.Manifest.permission.NETWORK_FACTORY) public android.net.NetworkCapabilities.Builder setRequestorPackageName(@Nullable String);
+ method @NonNull @RequiresPermission(android.Manifest.permission.NETWORK_FACTORY) public android.net.NetworkCapabilities.Builder setRequestorUid(int);
+ method @NonNull @RequiresPermission(android.Manifest.permission.NETWORK_SIGNAL_STRENGTH_WAKEUP) public android.net.NetworkCapabilities.Builder setSignalStrength(int);
+ method @NonNull @RequiresPermission(android.Manifest.permission.NETWORK_FACTORY) public android.net.NetworkCapabilities.Builder setSsid(@Nullable String);
+ method @NonNull public android.net.NetworkCapabilities.Builder setSubscriptionIds(@NonNull java.util.Set<java.lang.Integer>);
+ method @NonNull public android.net.NetworkCapabilities.Builder setTransportInfo(@Nullable android.net.TransportInfo);
+ method @NonNull @RequiresPermission(android.Manifest.permission.NETWORK_FACTORY) public android.net.NetworkCapabilities.Builder setUnderlyingNetworks(@Nullable java.util.List<android.net.Network>);
+ method @NonNull public static android.net.NetworkCapabilities.Builder withoutDefaultCapabilities();
+ }
+
+ public class NetworkProvider {
+ ctor public NetworkProvider(@NonNull android.content.Context, @NonNull android.os.Looper, @NonNull String);
+ method @RequiresPermission(android.Manifest.permission.NETWORK_FACTORY) public void declareNetworkRequestUnfulfillable(@NonNull android.net.NetworkRequest);
+ method public int getProviderId();
+ method public void onNetworkRequestWithdrawn(@NonNull android.net.NetworkRequest);
+ method public void onNetworkRequested(@NonNull android.net.NetworkRequest, @IntRange(from=0, to=99) int, int);
+ method @RequiresPermission(android.Manifest.permission.NETWORK_FACTORY) public void registerNetworkOffer(@NonNull android.net.NetworkScore, @NonNull android.net.NetworkCapabilities, @NonNull java.util.concurrent.Executor, @NonNull android.net.NetworkProvider.NetworkOfferCallback);
+ method @RequiresPermission(android.Manifest.permission.NETWORK_FACTORY) public void unregisterNetworkOffer(@NonNull android.net.NetworkProvider.NetworkOfferCallback);
+ field public static final int ID_NONE = -1; // 0xffffffff
+ }
+
+ public static interface NetworkProvider.NetworkOfferCallback {
+ method public void onNetworkNeeded(@NonNull android.net.NetworkRequest);
+ method public void onNetworkUnneeded(@NonNull android.net.NetworkRequest);
+ }
+
+ public class NetworkReleasedException extends java.lang.Exception {
+ ctor public NetworkReleasedException();
+ }
+
+ public class NetworkRequest implements android.os.Parcelable {
+ method @Nullable public String getRequestorPackageName();
+ method public int getRequestorUid();
+ }
+
+ public static class NetworkRequest.Builder {
+ method @NonNull @RequiresPermission(android.Manifest.permission.NETWORK_SIGNAL_STRENGTH_WAKEUP) public android.net.NetworkRequest.Builder setSignalStrength(int);
+ method @NonNull public android.net.NetworkRequest.Builder setSubscriptionIds(@NonNull java.util.Set<java.lang.Integer>);
+ }
+
+ public final class NetworkScore implements android.os.Parcelable {
+ method public int describeContents();
+ method public int getKeepConnectedReason();
+ method public int getLegacyInt();
+ method public boolean isExiting();
+ method public boolean isTransportPrimary();
+ method public void writeToParcel(@NonNull android.os.Parcel, int);
+ field @NonNull public static final android.os.Parcelable.Creator<android.net.NetworkScore> CREATOR;
+ field public static final int KEEP_CONNECTED_FOR_HANDOVER = 1; // 0x1
+ field public static final int KEEP_CONNECTED_NONE = 0; // 0x0
+ }
+
+ public static final class NetworkScore.Builder {
+ ctor public NetworkScore.Builder();
+ method @NonNull public android.net.NetworkScore build();
+ method @NonNull public android.net.NetworkScore.Builder setExiting(boolean);
+ method @NonNull public android.net.NetworkScore.Builder setKeepConnectedReason(int);
+ method @NonNull public android.net.NetworkScore.Builder setLegacyInt(int);
+ method @NonNull public android.net.NetworkScore.Builder setTransportPrimary(boolean);
+ }
+
+ public final class OemNetworkPreferences implements android.os.Parcelable {
+ method public int describeContents();
+ method @NonNull public java.util.Map<java.lang.String,java.lang.Integer> getNetworkPreferences();
+ method public void writeToParcel(@NonNull android.os.Parcel, int);
+ field @NonNull public static final android.os.Parcelable.Creator<android.net.OemNetworkPreferences> CREATOR;
+ field public static final int OEM_NETWORK_PREFERENCE_OEM_PAID = 1; // 0x1
+ field public static final int OEM_NETWORK_PREFERENCE_OEM_PAID_NO_FALLBACK = 2; // 0x2
+ field public static final int OEM_NETWORK_PREFERENCE_OEM_PAID_ONLY = 3; // 0x3
+ field public static final int OEM_NETWORK_PREFERENCE_OEM_PRIVATE_ONLY = 4; // 0x4
+ field public static final int OEM_NETWORK_PREFERENCE_UNINITIALIZED = 0; // 0x0
+ }
+
+ public static final class OemNetworkPreferences.Builder {
+ ctor public OemNetworkPreferences.Builder();
+ ctor public OemNetworkPreferences.Builder(@NonNull android.net.OemNetworkPreferences);
+ method @NonNull public android.net.OemNetworkPreferences.Builder addNetworkPreference(@NonNull String, int);
+ method @NonNull public android.net.OemNetworkPreferences build();
+ method @NonNull public android.net.OemNetworkPreferences.Builder clearNetworkPreference(@NonNull String);
+ }
+
+ public abstract class QosCallback {
+ ctor public QosCallback();
+ method public void onError(@NonNull android.net.QosCallbackException);
+ method public void onQosSessionAvailable(@NonNull android.net.QosSession, @NonNull android.net.QosSessionAttributes);
+ method public void onQosSessionLost(@NonNull android.net.QosSession);
+ }
+
+ public static class QosCallback.QosCallbackRegistrationException extends java.lang.RuntimeException {
+ }
+
+ public final class QosCallbackException extends java.lang.Exception {
+ ctor public QosCallbackException(@NonNull String);
+ ctor public QosCallbackException(@NonNull Throwable);
+ }
+
+ public abstract class QosFilter {
+ method @NonNull public abstract android.net.Network getNetwork();
+ method public abstract boolean matchesLocalAddress(@NonNull java.net.InetAddress, int, int);
+ method public boolean matchesProtocol(int);
+ method public abstract boolean matchesRemoteAddress(@NonNull java.net.InetAddress, int, int);
+ }
+
+ public final class QosSession implements android.os.Parcelable {
+ ctor public QosSession(int, int);
+ method public int describeContents();
+ method public int getSessionId();
+ method public int getSessionType();
+ method public long getUniqueId();
+ method public void writeToParcel(@NonNull android.os.Parcel, int);
+ field @NonNull public static final android.os.Parcelable.Creator<android.net.QosSession> CREATOR;
+ field public static final int TYPE_EPS_BEARER = 1; // 0x1
+ field public static final int TYPE_NR_BEARER = 2; // 0x2
+ }
+
+ public interface QosSessionAttributes {
+ }
+
+ public final class QosSocketInfo implements android.os.Parcelable {
+ ctor public QosSocketInfo(@NonNull android.net.Network, @NonNull java.net.Socket) throws java.io.IOException;
+ ctor public QosSocketInfo(@NonNull android.net.Network, @NonNull java.net.DatagramSocket) throws java.io.IOException;
+ method public int describeContents();
+ method @NonNull public java.net.InetSocketAddress getLocalSocketAddress();
+ method @NonNull public android.net.Network getNetwork();
+ method @Nullable public java.net.InetSocketAddress getRemoteSocketAddress();
+ method public void writeToParcel(@NonNull android.os.Parcel, int);
+ field @NonNull public static final android.os.Parcelable.Creator<android.net.QosSocketInfo> CREATOR;
+ }
+
+ public final class RouteInfo implements android.os.Parcelable {
+ ctor public RouteInfo(@Nullable android.net.IpPrefix, @Nullable java.net.InetAddress, @Nullable String, int);
+ ctor public RouteInfo(@Nullable android.net.IpPrefix, @Nullable java.net.InetAddress, @Nullable String, int, int);
+ method public int getMtu();
+ }
+
+ public abstract class SocketKeepalive implements java.lang.AutoCloseable {
+ method public final void start(@IntRange(from=0xa, to=0xe10) int, int, @Nullable android.net.Network);
+ field public static final int ERROR_NO_SUCH_SLOT = -33; // 0xffffffdf
+ field public static final int FLAG_AUTOMATIC_ON_OFF = 1; // 0x1
+ field public static final int SUCCESS = 0; // 0x0
+ }
+
+ public class SocketLocalAddressChangedException extends java.lang.Exception {
+ ctor public SocketLocalAddressChangedException();
+ }
+
+ public class SocketNotBoundException extends java.lang.Exception {
+ ctor public SocketNotBoundException();
+ }
+
+ public class SocketNotConnectedException extends java.lang.Exception {
+ ctor public SocketNotConnectedException();
+ }
+
+ public class SocketRemoteAddressChangedException extends java.lang.Exception {
+ ctor public SocketRemoteAddressChangedException();
+ }
+
+ public final class StaticIpConfiguration implements android.os.Parcelable {
+ ctor public StaticIpConfiguration();
+ ctor public StaticIpConfiguration(@Nullable android.net.StaticIpConfiguration);
+ method public void addDnsServer(@NonNull java.net.InetAddress);
+ method public void clear();
+ method @NonNull public java.util.List<android.net.RouteInfo> getRoutes(@Nullable String);
+ }
+
+ public final class TcpKeepalivePacketData extends android.net.KeepalivePacketData implements android.os.Parcelable {
+ ctor public TcpKeepalivePacketData(@NonNull java.net.InetAddress, int, @NonNull java.net.InetAddress, int, @NonNull byte[], int, int, int, int, int, int) throws android.net.InvalidPacketException;
+ method public int describeContents();
+ method public int getIpTos();
+ method public int getIpTtl();
+ method public int getTcpAck();
+ method public int getTcpSeq();
+ method public int getTcpWindow();
+ method public int getTcpWindowScale();
+ method public void writeToParcel(@NonNull android.os.Parcel, int);
+ field @NonNull public static final android.os.Parcelable.Creator<android.net.TcpKeepalivePacketData> CREATOR;
+ }
+
+ public final class VpnTransportInfo implements android.os.Parcelable android.net.TransportInfo {
+ ctor public VpnTransportInfo(int, @Nullable String, boolean, boolean);
+ method public boolean areLongLivedTcpConnectionsExpensive();
+ method public int describeContents();
+ method public int getType();
+ method public boolean isBypassable();
+ method public void writeToParcel(@NonNull android.os.Parcel, int);
+ field @NonNull public static final android.os.Parcelable.Creator<android.net.VpnTransportInfo> CREATOR;
+ }
+
+}
+
+package android.net.apf {
+
+ public final class ApfCapabilities implements android.os.Parcelable {
+ ctor public ApfCapabilities(int, int, int);
+ method public int describeContents();
+ method public static boolean getApfDrop8023Frames();
+ method @NonNull public static int[] getApfEtherTypeBlackList();
+ method public boolean hasDataAccess();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator<android.net.apf.ApfCapabilities> CREATOR;
+ field public final int apfPacketFormat;
+ field public final int apfVersionSupported;
+ field public final int maximumApfProgramSize;
+ }
+
+}
+
diff --git a/framework/cronet_disabled/api/system-lint-baseline.txt b/framework/cronet_disabled/api/system-lint-baseline.txt
new file mode 100644
index 0000000..9a97707
--- /dev/null
+++ b/framework/cronet_disabled/api/system-lint-baseline.txt
@@ -0,0 +1 @@
+// Baseline format: 1.0
diff --git a/Tethering/common/TetheringLib/cronet_enabled/api/system-removed.txt b/framework/cronet_disabled/api/system-removed.txt
similarity index 100%
rename from Tethering/common/TetheringLib/cronet_enabled/api/system-removed.txt
rename to framework/cronet_disabled/api/system-removed.txt
diff --git a/framework/jarjar-excludes.txt b/framework/jarjar-excludes.txt
index 1311765..9b48d57 100644
--- a/framework/jarjar-excludes.txt
+++ b/framework/jarjar-excludes.txt
@@ -23,3 +23,8 @@
# TODO (b/217115866): add jarjar rules for Nearby
android\.nearby\..+
+
+# Don't touch anything that's already under android.net.http (cronet)
+# This is required since android.net.http contains api classes and hidden classes.
+# TODO: Remove this after hidden classes are moved to different package
+android\.net\.http\..+
\ No newline at end of file
diff --git a/framework/jni/android_net_NetworkUtils.cpp b/framework/jni/android_net_NetworkUtils.cpp
index 38e0059..ca297e5 100644
--- a/framework/jni/android_net_NetworkUtils.cpp
+++ b/framework/jni/android_net_NetworkUtils.cpp
@@ -23,6 +23,7 @@
#include <netinet/in.h>
#include <string.h>
+#include <bpf/BpfClassic.h>
#include <DnsProxydProtocol.h> // NETID_USE_LOCAL_NAMESERVERS
#include <nativehelper/JNIPlatformHelp.h>
#include <utils/Log.h>
@@ -55,11 +56,10 @@
static void android_net_utils_attachDropAllBPFFilter(JNIEnv *env, jclass clazz, jobject javaFd)
{
- struct sock_filter filter_code[] = {
- // Reject all.
- BPF_STMT(BPF_RET | BPF_K, 0)
+ static struct sock_filter filter_code[] = {
+ BPF_REJECT,
};
- struct sock_fprog filter = {
+ static const struct sock_fprog filter = {
sizeof(filter_code) / sizeof(filter_code[0]),
filter_code,
};
diff --git a/framework/src/android/net/ConnectivityManager.java b/framework/src/android/net/ConnectivityManager.java
index 7cef58b..2315521 100644
--- a/framework/src/android/net/ConnectivityManager.java
+++ b/framework/src/android/net/ConnectivityManager.java
@@ -2521,7 +2521,7 @@
@RequiresPermission(android.Manifest.permission.PACKET_KEEPALIVE_OFFLOAD)
public @NonNull SocketKeepalive createSocketKeepalive(@NonNull Network network,
@NonNull Socket socket,
- @NonNull Executor executor,
+ @NonNull @CallbackExecutor Executor executor,
@NonNull Callback callback) {
ParcelFileDescriptor dup;
try {
@@ -2535,6 +2535,26 @@
}
/**
+ * Get the supported keepalive count for each transport configured in resource overlays.
+ *
+ * @return An array of supported keepalive count for each transport type.
+ * @hide
+ */
+ @RequiresPermission(anyOf = { android.Manifest.permission.NETWORK_SETTINGS,
+ // CTS 13 used QUERY_ALL_PACKAGES to get the resource value, which was implemented
+ // as below in KeepaliveUtils. Also allow that permission so that KeepaliveUtils can
+ // use this method and avoid breaking released CTS. Apps that have this permission
+ // can query the resource themselves anyway.
+ android.Manifest.permission.QUERY_ALL_PACKAGES })
+ public int[] getSupportedKeepalives() {
+ try {
+ return mService.getSupportedKeepalives();
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+
+ /**
* Ensure that a network route exists to deliver traffic to the specified
* host via the specified network interface. An attempt to add a route that
* already exists is ignored, but treated as successful.
@@ -5494,9 +5514,9 @@
* @return {@code uid} if the connection is found and the app has permission to observe it
* (e.g., if it is associated with the calling VPN app's VpnService tunnel) or {@link
* android.os.Process#INVALID_UID} if the connection is not found.
- * @throws {@link SecurityException} if the caller is not the active VpnService for the current
+ * @throws SecurityException if the caller is not the active VpnService for the current
* user.
- * @throws {@link IllegalArgumentException} if an unsupported protocol is requested.
+ * @throws IllegalArgumentException if an unsupported protocol is requested.
*/
public int getConnectionOwnerUid(
int protocol, @NonNull InetSocketAddress local, @NonNull InetSocketAddress remote) {
diff --git a/framework/src/android/net/ConnectivitySettingsManager.java b/framework/src/android/net/ConnectivitySettingsManager.java
index 822e67d..67dacb8 100644
--- a/framework/src/android/net/ConnectivitySettingsManager.java
+++ b/framework/src/android/net/ConnectivitySettingsManager.java
@@ -28,6 +28,7 @@
import android.annotation.Nullable;
import android.annotation.SystemApi;
import android.content.Context;
+import android.content.pm.PackageManager;
import android.net.ConnectivityManager.MultipathPreference;
import android.os.Binder;
import android.os.Build;
@@ -36,6 +37,7 @@
import android.provider.Settings;
import android.text.TextUtils;
import android.util.ArraySet;
+import android.util.Log;
import android.util.Range;
import com.android.net.module.util.ConnectivitySettingsUtils;
@@ -55,6 +57,7 @@
*/
@SystemApi(client = SystemApi.Client.MODULE_LIBRARIES)
public class ConnectivitySettingsManager {
+ private static final String TAG = ConnectivitySettingsManager.class.getSimpleName();
private ConnectivitySettingsManager() {}
@@ -696,10 +699,20 @@
/**
* Set global http proxy settings from given {@link ProxyInfo}.
*
+ * <p class="note">
+ * While a {@link ProxyInfo} for a PAC proxy can be specified, not all devices support
+ * PAC proxies. In particular, smaller devices like watches often do not have the capabilities
+ * necessary to interpret the PAC file. In such cases, calling this API with a PAC proxy
+ * results in undefined behavior, including possibly breaking networking for applications.
+ * You can test for this by checking for the presence of {@link PackageManager.FEATURE_WEBVIEW}.
+ * </p>
+ *
* @param context The {@link Context} to set the setting.
* @param proxyInfo The {@link ProxyInfo} for global http proxy settings which build from
* {@link ProxyInfo#buildPacProxy(Uri)} or
* {@link ProxyInfo#buildDirectProxy(String, int, List)}
+ * @throws UnsupportedOperationException if |proxyInfo| codes for a PAC proxy but the system
+ * does not support PAC proxies.
*/
public static void setGlobalProxy(@NonNull Context context, @NonNull ProxyInfo proxyInfo) {
final String host = proxyInfo.getHost();
@@ -707,6 +720,14 @@
final String exclusionList = proxyInfo.getExclusionListAsString();
final String pacFileUrl = proxyInfo.getPacFileUrl().toString();
+
+ if (!TextUtils.isEmpty(pacFileUrl)) {
+ final PackageManager pm = context.getPackageManager();
+ if (null != pm && !pm.hasSystemFeature(PackageManager.FEATURE_WEBVIEW)) {
+ Log.wtf(TAG, "PAC proxy can't be installed on a device without FEATURE_WEBVIEW");
+ }
+ }
+
if (TextUtils.isEmpty(pacFileUrl)) {
Settings.Global.putString(context.getContentResolver(), GLOBAL_HTTP_PROXY_HOST, host);
Settings.Global.putInt(context.getContentResolver(), GLOBAL_HTTP_PROXY_PORT, port);
diff --git a/framework/src/android/net/IConnectivityManager.aidl b/framework/src/android/net/IConnectivityManager.aidl
index 1372e9a..ebe8bca 100644
--- a/framework/src/android/net/IConnectivityManager.aidl
+++ b/framework/src/android/net/IConnectivityManager.aidl
@@ -195,6 +195,8 @@
void stopKeepalive(in ISocketKeepaliveCallback cb);
+ int[] getSupportedKeepalives();
+
String getCaptivePortalServerUrl();
byte[] getNetworkWatchlistConfigHash();
diff --git a/framework/src/android/net/LinkAddress.java b/framework/src/android/net/LinkAddress.java
index d48b8c7..90f55b3 100644
--- a/framework/src/android/net/LinkAddress.java
+++ b/framework/src/android/net/LinkAddress.java
@@ -487,17 +487,23 @@
*/
@SystemApi
public boolean isGlobalPreferred() {
- /**
- * Note that addresses flagged as IFA_F_OPTIMISTIC are
- * simultaneously flagged as IFA_F_TENTATIVE (when the tentative
- * state has cleared either DAD has succeeded or failed, and both
- * flags are cleared regardless).
- */
- int flags = getFlags();
return (scope == RT_SCOPE_UNIVERSE
&& !isIpv6ULA()
- && (flags & (IFA_F_DADFAILED | IFA_F_DEPRECATED)) == 0L
- && ((flags & IFA_F_TENTATIVE) == 0L || (flags & IFA_F_OPTIMISTIC) != 0L));
+ && isPreferred());
+ }
+
+ /**
+ * Checks if the address is a preferred address.
+ *
+ * @hide
+ */
+ public boolean isPreferred() {
+ // Note that addresses flagged as IFA_F_OPTIMISTIC are simultaneously flagged as
+ // IFA_F_TENTATIVE (when the tentative state has cleared either DAD has succeeded or
+ // failed, and both flags are cleared regardless).
+ int flags = getFlags();
+ return (flags & (IFA_F_DADFAILED | IFA_F_DEPRECATED)) == 0L
+ && ((flags & IFA_F_TENTATIVE) == 0L || (flags & IFA_F_OPTIMISTIC) != 0L);
}
/**
diff --git a/framework/src/android/net/LinkProperties.java b/framework/src/android/net/LinkProperties.java
index e0926e9..9fb9bc6 100644
--- a/framework/src/android/net/LinkProperties.java
+++ b/framework/src/android/net/LinkProperties.java
@@ -1456,6 +1456,10 @@
* @hide
*/
public boolean isIdenticalPcscfs(@NonNull LinkProperties target) {
+ // Per 3GPP TS 24.229, B.2.2.1 PDP context activation and P-CSCF discovery
+ // list order is important, so on U+ compare one by one
+ if (SdkLevel.isAtLeastU()) return target.getPcscfServers().equals(mPcscfs);
+ // but for safety old behaviour on pre-U:
Collection<InetAddress> targetPcscfs = target.getPcscfServers();
return (mPcscfs.size() == targetPcscfs.size()) ?
mPcscfs.containsAll(targetPcscfs) : false;
diff --git a/framework/src/android/net/NattKeepalivePacketData.java b/framework/src/android/net/NattKeepalivePacketData.java
index c4f8fc2..9e6d80d 100644
--- a/framework/src/android/net/NattKeepalivePacketData.java
+++ b/framework/src/android/net/NattKeepalivePacketData.java
@@ -29,7 +29,9 @@
import com.android.net.module.util.IpUtils;
import java.net.Inet4Address;
+import java.net.Inet6Address;
import java.net.InetAddress;
+import java.net.UnknownHostException;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.util.Objects;
@@ -38,6 +40,7 @@
@SystemApi
public final class NattKeepalivePacketData extends KeepalivePacketData implements Parcelable {
private static final int IPV4_HEADER_LENGTH = 20;
+ private static final int IPV6_HEADER_LENGTH = 40;
private static final int UDP_HEADER_LENGTH = 8;
// This should only be constructed via static factory methods, such as
@@ -55,39 +58,85 @@
public static NattKeepalivePacketData nattKeepalivePacket(
InetAddress srcAddress, int srcPort, InetAddress dstAddress, int dstPort)
throws InvalidPacketException {
-
- if (!(srcAddress instanceof Inet4Address) || !(dstAddress instanceof Inet4Address)) {
- throw new InvalidPacketException(ERROR_INVALID_IP_ADDRESS);
- }
-
if (dstPort != NattSocketKeepalive.NATT_PORT) {
throw new InvalidPacketException(ERROR_INVALID_PORT);
}
+ // Convert IPv4 mapped v6 address to v4 if any.
+ final InetAddress srcAddr, dstAddr;
+ try {
+ srcAddr = InetAddress.getByAddress(srcAddress.getAddress());
+ dstAddr = InetAddress.getByAddress(dstAddress.getAddress());
+ } catch (UnknownHostException e) {
+ throw new InvalidPacketException(ERROR_INVALID_IP_ADDRESS);
+ }
+
+ if (srcAddr instanceof Inet4Address && dstAddr instanceof Inet4Address) {
+ return nattKeepalivePacketv4(
+ (Inet4Address) srcAddr, srcPort, (Inet4Address) dstAddr, dstPort);
+ } else if (srcAddr instanceof Inet6Address && dstAddr instanceof Inet6Address) {
+ return nattKeepalivePacketv6(
+ (Inet6Address) srcAddr, srcPort, (Inet6Address) dstAddr, dstPort);
+ } else {
+ // Destination address and source address should be the same IP family.
+ throw new InvalidPacketException(ERROR_INVALID_IP_ADDRESS);
+ }
+ }
+
+ private static NattKeepalivePacketData nattKeepalivePacketv4(
+ Inet4Address srcAddress, int srcPort, Inet4Address dstAddress, int dstPort)
+ throws InvalidPacketException {
int length = IPV4_HEADER_LENGTH + UDP_HEADER_LENGTH + 1;
- ByteBuffer buf = ByteBuffer.allocate(length);
+ final ByteBuffer buf = ByteBuffer.allocate(length);
buf.order(ByteOrder.BIG_ENDIAN);
- buf.putShort((short) 0x4500); // IP version and TOS
+ buf.putShort((short) 0x4500); // IP version and TOS
buf.putShort((short) length);
- buf.putInt(0); // ID, flags, offset
- buf.put((byte) 64); // TTL
+ buf.putShort((short) 0); // ID
+ buf.putShort((short) 0x4000); // Flags(DF), offset
+ // Technically speaking, this should be reading/using the v4 sysctl
+ // /proc/sys/net/ipv4/ip_default_ttl. Use hard-coded 64 for simplicity.
+ buf.put((byte) 64); // TTL
buf.put((byte) OsConstants.IPPROTO_UDP);
- int ipChecksumOffset = buf.position();
- buf.putShort((short) 0); // IP checksum
+ final int ipChecksumOffset = buf.position();
+ buf.putShort((short) 0); // IP checksum
buf.put(srcAddress.getAddress());
buf.put(dstAddress.getAddress());
buf.putShort((short) srcPort);
buf.putShort((short) dstPort);
- buf.putShort((short) (length - 20)); // UDP length
- int udpChecksumOffset = buf.position();
- buf.putShort((short) 0); // UDP checksum
- buf.put((byte) 0xff); // NAT-T keepalive
+ buf.putShort((short) (UDP_HEADER_LENGTH + 1)); // UDP length
+ final int udpChecksumOffset = buf.position();
+ buf.putShort((short) 0); // UDP checksum
+ buf.put((byte) 0xff); // NAT-T keepalive
buf.putShort(ipChecksumOffset, IpUtils.ipChecksum(buf, 0));
buf.putShort(udpChecksumOffset, IpUtils.udpChecksum(buf, 0, IPV4_HEADER_LENGTH));
return new NattKeepalivePacketData(srcAddress, srcPort, dstAddress, dstPort, buf.array());
}
+ private static NattKeepalivePacketData nattKeepalivePacketv6(
+ Inet6Address srcAddress, int srcPort, Inet6Address dstAddress, int dstPort)
+ throws InvalidPacketException {
+ final ByteBuffer buf = ByteBuffer.allocate(IPV6_HEADER_LENGTH + UDP_HEADER_LENGTH + 1);
+ buf.order(ByteOrder.BIG_ENDIAN);
+ buf.putInt(0x60000000); // IP version, traffic class and flow label
+ buf.putShort((short) (UDP_HEADER_LENGTH + 1)); // Payload length
+ buf.put((byte) OsConstants.IPPROTO_UDP); // Next header
+ // For native ipv6, this hop limit value should use the per interface v6 hoplimit sysctl.
+ // For 464xlat, this value should use the v4 ttl sysctl.
+ // Either way, for simplicity, just hard code 64.
+ buf.put((byte) 64); // Hop limit
+ buf.put(srcAddress.getAddress());
+ buf.put(dstAddress.getAddress());
+ // UDP
+ buf.putShort((short) srcPort);
+ buf.putShort((short) dstPort);
+ buf.putShort((short) (UDP_HEADER_LENGTH + 1)); // UDP length = Payload length
+ final int udpChecksumOffset = buf.position();
+ buf.putShort((short) 0); // UDP checksum
+ buf.put((byte) 0xff); // NAT-T keepalive. 1 byte of data
+ buf.putShort(udpChecksumOffset, IpUtils.udpChecksum(buf, 0, IPV6_HEADER_LENGTH));
+ return new NattKeepalivePacketData(srcAddress, srcPort, dstAddress, dstPort, buf.array());
+ }
/** Parcelable Implementation */
public int describeContents() {
return 0;
diff --git a/framework/src/android/net/NetworkAgent.java b/framework/src/android/net/NetworkAgent.java
index 8fe20de..177f7e3 100644
--- a/framework/src/android/net/NetworkAgent.java
+++ b/framework/src/android/net/NetworkAgent.java
@@ -281,9 +281,8 @@
*
* arg1 = the hardware slot number of the keepalive to start
* arg2 = interval in seconds
- * obj = AutomaticKeepaliveInfo object
+ * obj = KeepalivePacketData object describing the data to be sent
*
- * Also used internally by ConnectivityService / KeepaliveTracker, with different semantics.
* @hide
*/
public static final int CMD_START_SOCKET_KEEPALIVE = BASE + 11;
@@ -436,6 +435,14 @@
public static final int CMD_DSCP_POLICY_STATUS = BASE + 28;
/**
+ * Sent by the NetworkAgent to ConnectivityService to notify that this network is expected to be
+ * replaced within the specified time by a similar network.
+ * arg1 = timeout in milliseconds
+ * @hide
+ */
+ public static final int EVENT_UNREGISTER_AFTER_REPLACEMENT = BASE + 29;
+
+ /**
* DSCP policy was successfully added.
*/
public static final int DSCP_POLICY_STATUS_SUCCESS = 0;
@@ -477,27 +484,6 @@
@Retention(RetentionPolicy.SOURCE)
public @interface DscpPolicyStatus {}
- /**
- * Sent by the NetworkAgent to ConnectivityService to notify that this network is expected to be
- * replaced within the specified time by a similar network.
- * arg1 = timeout in milliseconds
- * @hide
- */
- public static final int EVENT_UNREGISTER_AFTER_REPLACEMENT = BASE + 29;
-
- /**
- * Sent by AutomaticOnOffKeepaliveTracker periodically (when relevant) to trigger monitor
- * automatic keepalive request.
- *
- * NATT keepalives have an automatic mode where the system only sends keepalive packets when
- * TCP sockets are open over a VPN. The system will check periodically for presence of
- * such open sockets, and this message is what triggers the re-evaluation.
- *
- * obj = A Binder object associated with the keepalive.
- * @hide
- */
- public static final int CMD_MONITOR_AUTOMATIC_KEEPALIVE = BASE + 30;
-
private static NetworkInfo getLegacyNetworkInfo(final NetworkAgentConfig config) {
final NetworkInfo ni = new NetworkInfo(config.legacyType, config.legacySubType,
config.legacyTypeName, config.legacySubTypeName);
diff --git a/framework/src/android/net/NetworkCapabilities.java b/framework/src/android/net/NetworkCapabilities.java
index 324f565..92e9599 100644
--- a/framework/src/android/net/NetworkCapabilities.java
+++ b/framework/src/android/net/NetworkCapabilities.java
@@ -757,10 +757,10 @@
NET_CAPABILITY_PARTIAL_CONNECTIVITY);
/**
- * Capabilities that are allowed for test networks. This list must be set so that it is safe
- * for an unprivileged user to create a network with these capabilities via shell. As such,
- * it must never contain capabilities that are generally useful to the system, such as
- * INTERNET, IMS, SUPL, etc.
+ * Capabilities that are allowed for all test networks. This list must be set so that it is safe
+ * for an unprivileged user to create a network with these capabilities via shell. As such, it
+ * must never contain capabilities that are generally useful to the system, such as INTERNET,
+ * IMS, SUPL, etc.
*/
private static final long TEST_NETWORKS_ALLOWED_CAPABILITIES =
BitUtils.packBitList(
@@ -774,6 +774,14 @@
NET_CAPABILITY_NOT_VCN_MANAGED);
/**
+ * Extra allowed capabilities for test networks that do not have TRANSPORT_CELLULAR. Test
+ * networks with TRANSPORT_CELLULAR must not have those capabilities in order to mitigate
+ * the risk of being used by running apps.
+ */
+ private static final long TEST_NETWORKS_EXTRA_ALLOWED_CAPABILITIES_ON_NON_CELL =
+ BitUtils.packBitList(NET_CAPABILITY_CBS, NET_CAPABILITY_DUN, NET_CAPABILITY_RCS);
+
+ /**
* Adds the given capability to this {@code NetworkCapability} instance.
* Note that when searching for a network to satisfy a request, all capabilities
* requested must be satisfied.
@@ -1126,14 +1134,22 @@
mTransportTypes =
(originalTransportTypes & UNRESTRICTED_TEST_NETWORKS_ALLOWED_TRANSPORTS)
| (1 << TRANSPORT_TEST);
-
- // SubIds are only allowed for Test Networks that only declare TRANSPORT_TEST.
- setSubscriptionIds(originalSubIds);
} else {
// If the test network is restricted, then it may declare any transport.
mTransportTypes = (originalTransportTypes | (1 << TRANSPORT_TEST));
}
+
+ if (hasSingleTransport(TRANSPORT_TEST)) {
+ // SubIds are only allowed for Test Networks that only declare TRANSPORT_TEST.
+ setSubscriptionIds(originalSubIds);
+ }
+
mNetworkCapabilities = originalCapabilities & TEST_NETWORKS_ALLOWED_CAPABILITIES;
+ if (!hasTransport(TRANSPORT_CELLULAR)) {
+ mNetworkCapabilities |=
+ (originalCapabilities & TEST_NETWORKS_EXTRA_ALLOWED_CAPABILITIES_ON_NON_CELL);
+ }
+
mNetworkSpecifier = originalSpecifier;
mSignalStrength = originalSignalStrength;
mTransportInfo = originalTransportInfo;
@@ -1332,6 +1348,18 @@
}
/**
+ * Gets the transports as an int. Internal callers only.
+ *
+ * Prefer getTransportTypes/hasTransportType if not immediately collapsing back into a scalar.
+ *
+ * @return a long integer representing the transport types.
+ * @hide
+ */
+ public long getTransportTypesInternal() {
+ return mTransportTypes;
+ }
+
+ /**
* Sets all the transports set on this {@code NetworkCapability} instance.
* This overwrites any existing transports.
*
diff --git a/framework/src/android/net/NetworkInfo.java b/framework/src/android/net/NetworkInfo.java
index b7ec519..7aa9847 100644
--- a/framework/src/android/net/NetworkInfo.java
+++ b/framework/src/android/net/NetworkInfo.java
@@ -334,6 +334,24 @@
}
/**
+ * 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
* of connecting to that network. Examples include
diff --git a/framework/src/android/net/ProxyInfo.java b/framework/src/android/net/ProxyInfo.java
index 0deda37..adf2376 100644
--- a/framework/src/android/net/ProxyInfo.java
+++ b/framework/src/android/net/ProxyInfo.java
@@ -47,6 +47,8 @@
private final int mPort;
private final String mExclusionList;
private final String[] mParsedExclusionList;
+ // Uri.EMPTY if none.
+ @NonNull
private final Uri mPacFileUrl;
/**
@@ -256,6 +258,14 @@
return proxy;
}
+ /**
+ * @hide
+ * @return whether this proxy uses a Proxy Auto Configuration URL.
+ */
+ public boolean isPacProxy() {
+ return !Uri.EMPTY.equals(mPacFileUrl);
+ }
+
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
diff --git a/framework/src/android/net/SocketKeepalive.java b/framework/src/android/net/SocketKeepalive.java
index 311126e..f915e72 100644
--- a/framework/src/android/net/SocketKeepalive.java
+++ b/framework/src/android/net/SocketKeepalive.java
@@ -21,6 +21,7 @@
import android.annotation.IntDef;
import android.annotation.IntRange;
import android.annotation.NonNull;
+import android.annotation.Nullable;
import android.annotation.SystemApi;
import android.os.Binder;
import android.os.ParcelFileDescriptor;
@@ -148,9 +149,7 @@
public static final int ERROR_INSUFFICIENT_RESOURCES = -32;
/**
- * There was no such slot. This should only be internally as it indicates
- * a programming error in the system server. It should not propagate to
- * applications.
+ * There was no such slot, or no keepalive running on this slot.
* @hide
*/
@SystemApi
@@ -374,12 +373,14 @@
* the supplied {@link Callback} will see a call to
* {@link Callback#onError(int)} with {@link #ERROR_INVALID_INTERVAL}.
* @param flags Flags to enable/disable available options on this keepalive.
- * @param underpinnedNetwork The underpinned network of this keepalive.
+ * @param underpinnedNetwork an optional network running over mNetwork that this
+ * keepalive is intended to keep up, e.g. an IPSec
+ * tunnel running over mNetwork.
* @hide
*/
@SystemApi(client = PRIVILEGED_APPS)
public final void start(@IntRange(from = MIN_INTERVAL_SEC, to = MAX_INTERVAL_SEC)
- int intervalSec, @StartFlags int flags, @NonNull Network underpinnedNetwork) {
+ int intervalSec, @StartFlags int flags, @Nullable Network underpinnedNetwork) {
startImpl(intervalSec, flags, underpinnedNetwork);
}
diff --git a/framework/src/android/net/TcpSocketKeepalive.java b/framework/src/android/net/TcpSocketKeepalive.java
index b548f6d..696889f 100644
--- a/framework/src/android/net/TcpSocketKeepalive.java
+++ b/framework/src/android/net/TcpSocketKeepalive.java
@@ -55,6 +55,12 @@
throw new IllegalArgumentException("Illegal flag value for "
+ this.getClass().getSimpleName() + " : " + flags);
}
+
+ if (underpinnedNetwork != null) {
+ throw new IllegalArgumentException("Illegal underpinned network for "
+ + this.getClass().getSimpleName() + " : " + underpinnedNetwork);
+ }
+
mExecutor.execute(() -> {
try {
mService.startTcpKeepalive(mNetwork, mPfd, intervalSec, mCallback);
diff --git a/framework/src/android/net/TestNetworkManager.java b/framework/src/android/net/TestNetworkManager.java
index b64299f..416c6de 100644
--- a/framework/src/android/net/TestNetworkManager.java
+++ b/framework/src/android/net/TestNetworkManager.java
@@ -260,7 +260,7 @@
/**
* Create a tap interface with or without carrier for testing purposes.
*
- * Note: setting carrierUp = false is not supported until kernel version 5.0.
+ * Note: setting carrierUp = false is not supported until kernel version 6.0.
*
* @param carrierUp whether the created interface has a carrier or not.
* @param bringUp whether to bring up the interface before returning it.
@@ -280,6 +280,8 @@
/**
* Create a tap interface for testing purposes.
*
+ * Note: setting carrierUp = false is not supported until kernel version 6.0.
+ *
* @param carrierUp whether the created interface has a carrier or not.
* @param bringUp whether to bring up the interface before returning it.
* @param disableIpv6ProvisioningDelay whether to disable DAD and RS delay.
diff --git a/framework/src/android/net/apf/ApfCapabilities.java b/framework/src/android/net/apf/ApfCapabilities.java
index 64f14a1..fae2499 100644
--- a/framework/src/android/net/apf/ApfCapabilities.java
+++ b/framework/src/android/net/apf/ApfCapabilities.java
@@ -19,9 +19,6 @@
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.SystemApi;
-import android.content.Context;
-import android.content.res.Resources;
-import android.net.ConnectivityResources;
import android.os.Parcel;
import android.os.Parcelable;
@@ -36,8 +33,6 @@
*/
@SystemApi
public final class ApfCapabilities implements Parcelable {
- private static ConnectivityResources sResources;
-
/**
* Version of APF instruction set supported for packet filtering. 0 indicates no support for
* packet filtering using APF programs.
@@ -67,15 +62,6 @@
apfPacketFormat = in.readInt();
}
- @NonNull
- private static synchronized ConnectivityResources getResources(@NonNull Context ctx) {
- if (sResources == null) {
- sResources = new ConnectivityResources(ctx);
- }
- return sResources;
- }
-
-
@Override
public int describeContents() {
return 0;
diff --git a/framework/src/android/net/connectivity/ConnectivityCompatChanges.java b/framework/src/android/net/connectivity/ConnectivityCompatChanges.java
index 2cfda9e..dfe5867 100644
--- a/framework/src/android/net/connectivity/ConnectivityCompatChanges.java
+++ b/framework/src/android/net/connectivity/ConnectivityCompatChanges.java
@@ -73,6 +73,17 @@
@EnabledAfter(targetSdkVersion = Build.VERSION_CODES.TIRAMISU)
public static final long ENABLE_SELF_CERTIFIED_CAPABILITIES_DECLARATION = 266524688;
+ /**
+ * Apps targeting < Android 14 use a legacy NSD backend.
+ *
+ * The legacy apps use a legacy native daemon as NsdManager backend, but other apps use a
+ * platform-integrated mDNS implementation as backend.
+ *
+ * @hide
+ */
+ @ChangeId
+ @EnabledAfter(targetSdkVersion = Build.VERSION_CODES.TIRAMISU)
+ public static final long ENABLE_PLATFORM_MDNS_BACKEND = 270306772L;
private ConnectivityCompatChanges() {
}
}
diff --git a/framework/src/android/net/util/KeepaliveUtils.java b/framework/src/android/net/util/KeepaliveUtils.java
index 8d7a0b3..07b8c45 100644
--- a/framework/src/android/net/util/KeepaliveUtils.java
+++ b/framework/src/android/net/util/KeepaliveUtils.java
@@ -18,11 +18,8 @@
import android.annotation.NonNull;
import android.content.Context;
-import android.content.res.Resources;
-import android.net.ConnectivityResources;
+import android.net.ConnectivityManager;
import android.net.NetworkCapabilities;
-import android.text.TextUtils;
-import android.util.AndroidRuntimeException;
/**
* Collection of utilities for socket keepalive offload.
@@ -33,64 +30,20 @@
public static final String TAG = "KeepaliveUtils";
- public static class KeepaliveDeviceConfigurationException extends AndroidRuntimeException {
- public KeepaliveDeviceConfigurationException(final String msg) {
- super(msg);
- }
- }
-
/**
* Read supported keepalive count for each transport type from overlay resource. This should be
* used to create a local variable store of resource customization, and use it as the input for
- * {@link getSupportedKeepalivesForNetworkCapabilities}.
+ * {@link #getSupportedKeepalivesForNetworkCapabilities}.
*
* @param context The context to read resource from.
* @return An array of supported keepalive count for each transport type.
+ * @deprecated This is used by CTS 13, but can be removed after switching it to
+ * {@link ConnectivityManager#getSupportedKeepalives()}.
*/
@NonNull
+ @Deprecated
public static int[] getSupportedKeepalives(@NonNull Context context) {
- String[] res = null;
- try {
- final ConnectivityResources connRes = new ConnectivityResources(context);
- // TODO: use R.id.config_networkSupportedKeepaliveCount directly
- final int id = connRes.get().getIdentifier("config_networkSupportedKeepaliveCount",
- "array", connRes.getResourcesContext().getPackageName());
- res = new ConnectivityResources(context).get().getStringArray(id);
- } catch (Resources.NotFoundException unused) {
- }
- if (res == null) throw new KeepaliveDeviceConfigurationException("invalid resource");
-
- final int[] ret = new int[NetworkCapabilities.MAX_TRANSPORT + 1];
- for (final String row : res) {
- if (TextUtils.isEmpty(row)) {
- throw new KeepaliveDeviceConfigurationException("Empty string");
- }
- final String[] arr = row.split(",");
- if (arr.length != 2) {
- throw new KeepaliveDeviceConfigurationException("Invalid parameter length");
- }
-
- int transport;
- int supported;
- try {
- transport = Integer.parseInt(arr[0]);
- supported = Integer.parseInt(arr[1]);
- } catch (NumberFormatException e) {
- throw new KeepaliveDeviceConfigurationException("Invalid number format");
- }
-
- if (!NetworkCapabilities.isValidTransport(transport)) {
- throw new KeepaliveDeviceConfigurationException("Invalid transport " + transport);
- }
-
- if (supported < 0) {
- throw new KeepaliveDeviceConfigurationException(
- "Invalid supported count " + supported + " for "
- + NetworkCapabilities.transportNameOf(transport));
- }
- ret[transport] = supported;
- }
- return ret;
+ return context.getSystemService(ConnectivityManager.class).getSupportedKeepalives();
}
/**
diff --git a/nearby/framework/Android.bp b/nearby/framework/Android.bp
index e223b54..278f823 100644
--- a/nearby/framework/Android.bp
+++ b/nearby/framework/Android.bp
@@ -32,10 +32,10 @@
filegroup {
name: "framework-nearby-sources",
+ defaults: ["framework-sources-module-defaults"],
srcs: [
":framework-nearby-java-sources",
],
- visibility: ["//frameworks/base"],
}
// Build of only framework-nearby (not as part of connectivity) for
@@ -45,6 +45,7 @@
srcs: [":framework-nearby-java-sources"],
sdk_version: "module_current",
libs: [
+ "androidx.annotation_annotation",
"framework-annotations-lib",
"framework-bluetooth",
],
diff --git a/nearby/halfsheet/Android.bp b/nearby/halfsheet/Android.bp
index 2d0d327..8011dc6 100644
--- a/nearby/halfsheet/Android.bp
+++ b/nearby/halfsheet/Android.bp
@@ -27,7 +27,7 @@
certificate: ":com.android.nearby.halfsheetcertificate",
libs: [
"framework-bluetooth",
- "framework-connectivity-t",
+ "framework-connectivity-t.impl",
"nearby-service-string",
],
static_libs: [
diff --git a/nearby/halfsheet/src/com/android/nearby/halfsheet/HalfSheetActivity.java b/nearby/halfsheet/src/com/android/nearby/halfsheet/HalfSheetActivity.java
index 2a38b8a..07e5776 100644
--- a/nearby/halfsheet/src/com/android/nearby/halfsheet/HalfSheetActivity.java
+++ b/nearby/halfsheet/src/com/android/nearby/halfsheet/HalfSheetActivity.java
@@ -16,6 +16,8 @@
package com.android.nearby.halfsheet;
+import static android.Manifest.permission.ACCESS_FINE_LOCATION;
+
import static com.android.nearby.halfsheet.fragment.DevicePairingFragment.APP_LAUNCH_FRAGMENT_TYPE;
import static com.android.server.nearby.common.bluetooth.fastpair.FastPairConstants.EXTRA_MODEL_ID;
import static com.android.server.nearby.common.fastpair.service.UserActionHandlerBase.EXTRA_MAC_ADDRESS;
@@ -226,7 +228,8 @@
EXTRA_HALF_SHEET_IS_RETROACTIVE,
getIntent().getBooleanExtra(EXTRA_HALF_SHEET_IS_RETROACTIVE,
false))
- .putExtra(EXTRA_MAC_ADDRESS, mScanFastPairStoreItem.getAddress()));
+ .putExtra(EXTRA_MAC_ADDRESS, mScanFastPairStoreItem.getAddress()),
+ ACCESS_FINE_LOCATION);
}
}
diff --git a/nearby/halfsheet/src/com/android/nearby/halfsheet/utils/BroadcastUtils.java b/nearby/halfsheet/src/com/android/nearby/halfsheet/utils/BroadcastUtils.java
index 467997c..2f1e90a 100644
--- a/nearby/halfsheet/src/com/android/nearby/halfsheet/utils/BroadcastUtils.java
+++ b/nearby/halfsheet/src/com/android/nearby/halfsheet/utils/BroadcastUtils.java
@@ -31,6 +31,13 @@
context.sendBroadcast(intent);
}
+ /**
+ * Helps send a broadcast with specified receiver permission.
+ */
+ public static void sendBroadcast(Context context, Intent intent, String receiverPermission) {
+ context.sendBroadcast(intent, receiverPermission);
+ }
+
private BroadcastUtils() {
}
}
diff --git a/nearby/tests/multidevices/README.md b/nearby/tests/multidevices/README.md
index b64667c..9d086de 100644
--- a/nearby/tests/multidevices/README.md
+++ b/nearby/tests/multidevices/README.md
@@ -43,14 +43,24 @@
* Adjust Bluetooth profile configurations. \
The Fast Pair provider simulator is an opposite role to the seeker. It needs
to enable/disable the following Bluetooth profile:
- * Disable A2DP (profile_supported_a2dp)
- * Disable the AVRCP controller (profile_supported_avrcp_controller)
- * Enable A2DP sink (profile_supported_a2dp_sink)
- * Enable the HFP client connection service (profile_supported_hfpclient,
- hfp_client_connection_service_enabled)
- * Enable the AVRCP target (profile_supported_avrcp_target)
- * Enable the automatic audio focus request
- (a2dp_sink_automatically_request_audio_focus)
+ * Disable A2DP source (bluetooth.profile.a2dp.source.enabled)
+ * Enable A2DP sink (bluetooth.profile.a2dp.sink.enabled)
+ * Disable the AVRCP controller (bluetooth.profile.avrcp.controller.enabled)
+ * Enable the AVRCP target (bluetooth.profile.avrcp.target.enabled)
+ * Enable the HFP service (bluetooth.profile.hfp.ag.enabled, bluetooth.profile.hfp.hf.enabled)
+
+```makefile
+# The Bluetooth profiles that Fast Pair provider simulator expect to have enabled.
+PRODUCT_PRODUCT_PROPERTIES += \
+ bluetooth.device.default_name=FastPairProviderSimulator \
+ bluetooth.profile.a2dp.source.enabled=false \
+ bluetooth.profile.a2dp.sink.enabled=true \
+ bluetooth.profile.avrcp.controller.enabled=false \
+ bluetooth.profile.avrcp.target.enabled=true \
+ bluetooth.profile.hfp.ag.enabled=true \
+ bluetooth.profile.hfp.hf.enabled=true
+```
+
* Adjust Bluetooth TX power limitation in Bluetooth module and disable the
Fast Pair in Google Play service (aka GMS)
diff --git a/nearby/tests/multidevices/clients/test_support/fastpair_provider/simulator_app/src/android/nearby/fastpair/provider/simulator/app/MainActivity.java b/nearby/tests/multidevices/clients/test_support/fastpair_provider/simulator_app/src/android/nearby/fastpair/provider/simulator/app/MainActivity.java
index e916c53..75fafb0 100644
--- a/nearby/tests/multidevices/clients/test_support/fastpair_provider/simulator_app/src/android/nearby/fastpair/provider/simulator/app/MainActivity.java
+++ b/nearby/tests/multidevices/clients/test_support/fastpair_provider/simulator_app/src/android/nearby/fastpair/provider/simulator/app/MainActivity.java
@@ -657,9 +657,7 @@
int desiredIoCapability = getIoCapabilityFromModelId(modelId);
- mBluetoothController.setIoCapability(
- /*ioCapabilityClassic=*/ desiredIoCapability,
- /*ioCapabilityBLE=*/ desiredIoCapability);
+ mBluetoothController.setIoCapability(desiredIoCapability);
runOnUiThread(() -> {
updateStringStatusView(
@@ -950,9 +948,7 @@
}
// Recover the IO capability.
- mBluetoothController.setIoCapability(
- /*ioCapabilityClassic=*/ IO_CAPABILITY_IO, /*ioCapabilityBLE=*/
- IO_CAPABILITY_KBDISP);
+ mBluetoothController.setIoCapability(IO_CAPABILITY_IO);
super.onDestroy();
}
diff --git a/nearby/tests/multidevices/clients/test_support/fastpair_provider/src/android/nearby/fastpair/provider/bluetooth/BluetoothController.kt b/nearby/tests/multidevices/clients/test_support/fastpair_provider/src/android/nearby/fastpair/provider/bluetooth/BluetoothController.kt
index 0cc0c92..345e8d2 100644
--- a/nearby/tests/multidevices/clients/test_support/fastpair_provider/src/android/nearby/fastpair/provider/bluetooth/BluetoothController.kt
+++ b/nearby/tests/multidevices/clients/test_support/fastpair_provider/src/android/nearby/fastpair/provider/bluetooth/BluetoothController.kt
@@ -50,23 +50,16 @@
}
/**
- * Sets the Input/Output capability of the device for both classic Bluetooth and BLE operations.
+ * Sets the Input/Output capability of the device for classic Bluetooth operations.
* Note: In order to let changes take effect, this method will make sure the Bluetooth stack is
* restarted by blocking calling thread.
*
* @param ioCapabilityClassic One of {@link #IO_CAPABILITY_IO}, {@link #IO_CAPABILITY_NONE},
* ```
* {@link #IO_CAPABILITY_KBDISP} or more in {@link BluetoothAdapter}.
- * @param ioCapabilityBLE
- * ```
- * One of {@link #IO_CAPABILITY_IO}, {@link #IO_CAPABILITY_NONE}, {@link
- * ```
- * #IO_CAPABILITY_KBDISP} or more in {@link BluetoothAdapter}.
- * ```
*/
- fun setIoCapability(ioCapabilityClassic: Int, ioCapabilityBLE: Int) {
+ fun setIoCapability(ioCapabilityClassic: Int) {
bluetoothAdapter.ioCapability = ioCapabilityClassic
- bluetoothAdapter.leIoCapability = ioCapabilityBLE
// Toggling airplane mode on/off to restart Bluetooth stack and reset the BLE.
try {
@@ -273,4 +266,4 @@
private const val TURN_AIRPLANE_MODE_OFF = 0
private const val TURN_AIRPLANE_MODE_ON = 1
}
-}
\ No newline at end of file
+}
diff --git a/nearby/tests/multidevices/clients/test_support/snippet_helper/tests/Android.bp b/nearby/tests/multidevices/clients/test_support/snippet_helper/tests/Android.bp
index 284d5c2..ec0392c 100644
--- a/nearby/tests/multidevices/clients/test_support/snippet_helper/tests/Android.bp
+++ b/nearby/tests/multidevices/clients/test_support/snippet_helper/tests/Android.bp
@@ -35,4 +35,5 @@
// timeout in seconds.
timeout: 36000,
},
-}
\ No newline at end of file
+ upstream: true,
+}
diff --git a/nearby/tests/multidevices/host/Android.bp b/nearby/tests/multidevices/host/Android.bp
index b81032d..b6c1c9d 100644
--- a/nearby/tests/multidevices/host/Android.bp
+++ b/nearby/tests/multidevices/host/Android.bp
@@ -22,7 +22,10 @@
name: "NearbyMultiDevicesTestSuite",
main: "suite_main.py",
srcs: ["*.py"],
- libs: ["NearbyMultiDevicesHostHelper"],
+ libs: [
+ "NearbyMultiDevicesHostHelper",
+ "mobly",
+ ],
test_suites: [
"general-tests",
"mts-tethering",
@@ -38,6 +41,11 @@
// Package the JSON metadata with the Mobly test.
"test_data/**/*",
],
+ version: {
+ py3: {
+ embedded_launcher: true,
+ },
+ },
}
python_library_host {
diff --git a/nearby/tests/multidevices/host/AndroidTest.xml b/nearby/tests/multidevices/host/AndroidTest.xml
index c1f6a70..fff0ed1 100644
--- a/nearby/tests/multidevices/host/AndroidTest.xml
+++ b/nearby/tests/multidevices/host/AndroidTest.xml
@@ -42,11 +42,6 @@
<option name="run-command" value="input keyevent KEYCODE_WAKEUP" />
<option name="run-command" value="wm dismiss-keyguard" />
</target_preparer>
- <target_preparer class="com.android.tradefed.targetprep.PythonVirtualenvPreparer">
- <!-- Any python dependencies can be specified and will be installed with pip -->
- <!-- TODO(b/225958696): Import python dependencies -->
- <option name="dep-module" value="mobly" />
- </target_preparer>
<target_preparer class="com.android.tradefed.targetprep.DeviceSetup">
<option name="force-skip-system-props" value="true" /> <!-- avoid restarting device -->
<option name="screen-always-on" value="on" />
diff --git a/nearby/tests/multidevices/host/suite_main.py b/nearby/tests/multidevices/host/suite_main.py
index 4f5d48c..9a580fb 100644
--- a/nearby/tests/multidevices/host/suite_main.py
+++ b/nearby/tests/multidevices/host/suite_main.py
@@ -31,11 +31,9 @@
]
-def _valid_argument(arg: str) -> bool:
- return arg.startswith(('--config', '-c', '--tests', '--test_case'))
-
-
if __name__ == '__main__':
logging.basicConfig(filename=_BOOTSTRAP_LOGGING_FILENAME, level=logging.INFO)
- suite_runner.run_suite(argv=[arg for arg in sys.argv if _valid_argument(arg)],
- test_classes=_TEST_CLASSES_LIST)
+ if '--' in sys.argv:
+ index = sys.argv.index('--')
+ sys.argv = sys.argv[:1] + sys.argv[index + 1:]
+ suite_runner.run_suite(test_classes=_TEST_CLASSES_LIST)
diff --git a/nearby/tests/robotests/Android.bp b/nearby/tests/robotests/Android.bp
index 56c0107..70fa0c3 100644
--- a/nearby/tests/robotests/Android.bp
+++ b/nearby/tests/robotests/Android.bp
@@ -42,15 +42,14 @@
"androidx.lifecycle_lifecycle-runtime",
"androidx.mediarouter_mediarouter-nodeps",
"error_prone_annotations",
- "mockito-robolectric-prebuilt",
"service-nearby-pre-jarjar",
"truth-prebuilt",
"robolectric_android-all-stub",
- "Robolectric_all-target",
],
test_options: {
// timeout in seconds.
timeout: 36000,
},
+ upstream: true,
}
diff --git a/netd/Android.bp b/netd/Android.bp
index 473460d..4325d89 100644
--- a/netd/Android.bp
+++ b/netd/Android.bp
@@ -35,6 +35,9 @@
"BpfHandler.cpp",
"NetdUpdatable.cpp",
],
+ static_libs: [
+ "libmodules-utils-build",
+ ],
shared_libs: [
"libbase",
"liblog",
diff --git a/netd/BpfBaseTest.cpp b/netd/BpfBaseTest.cpp
index 624d216..c979a7b 100644
--- a/netd/BpfBaseTest.cpp
+++ b/netd/BpfBaseTest.cpp
@@ -93,7 +93,7 @@
ASSERT_EQ(TEST_TAG, tagResult.value().tag);
ASSERT_EQ(0, close(sock));
// Check map periodically until sk destroy handler have done its job.
- for (int i = 0; i < 10; i++) {
+ for (int i = 0; i < 1000; i++) {
usleep(5000); // 5ms
tagResult = cookieTagMap.readValue(cookie);
if (!tagResult.ok()) {
@@ -101,7 +101,7 @@
return;
}
}
- FAIL() << "socket tag still exist after 50ms";
+ FAIL() << "socket tag still exist after 5s";
}
}
diff --git a/netd/BpfHandler.cpp b/netd/BpfHandler.cpp
index 2b773c9..d239277 100644
--- a/netd/BpfHandler.cpp
+++ b/netd/BpfHandler.cpp
@@ -19,8 +19,10 @@
#include "BpfHandler.h"
#include <linux/bpf.h>
+#include <inttypes.h>
#include <android-base/unique_fd.h>
+#include <android-modules-utils/sdk_level.h>
#include <bpf/WaitForProgsLoaded.h>
#include <log/log.h>
#include <netdutils/UidConstants.h>
@@ -32,7 +34,6 @@
namespace net {
using base::unique_fd;
-using bpf::NONEXISTENT_COOKIE;
using bpf::getSocketCookie;
using bpf::retrieveProgram;
using netdutils::Status;
@@ -51,35 +52,37 @@
static Status attachProgramToCgroup(const char* programPath, const unique_fd& cgroupFd,
bpf_attach_type type) {
unique_fd cgroupProg(retrieveProgram(programPath));
- if (cgroupProg == -1) {
- int ret = errno;
- ALOGE("Failed to get program from %s: %s", programPath, strerror(ret));
- return statusFromErrno(ret, "cgroup program get failed");
+ if (!cgroupProg.ok()) {
+ const int err = errno;
+ ALOGE("Failed to get program from %s: %s", programPath, strerror(err));
+ return statusFromErrno(err, "cgroup program get failed");
}
if (android::bpf::attachProgram(type, cgroupProg, cgroupFd)) {
- int ret = errno;
- ALOGE("Program from %s attach failed: %s", programPath, strerror(ret));
- return statusFromErrno(ret, "program attach failed");
+ const int err = errno;
+ ALOGE("Program from %s attach failed: %s", programPath, strerror(err));
+ return statusFromErrno(err, "program attach failed");
}
return netdutils::status::ok;
}
static Status checkProgramAccessible(const char* programPath) {
unique_fd prog(retrieveProgram(programPath));
- if (prog == -1) {
- int ret = errno;
- ALOGE("Failed to get program from %s: %s", programPath, strerror(ret));
- return statusFromErrno(ret, "program retrieve failed");
+ if (!prog.ok()) {
+ const int err = errno;
+ ALOGE("Failed to get program from %s: %s", programPath, strerror(err));
+ return statusFromErrno(err, "program retrieve failed");
}
return netdutils::status::ok;
}
static Status initPrograms(const char* cg2_path) {
+ if (modules::sdklevel::IsAtLeastU() && !!strcmp(cg2_path, "/sys/fs/cgroup")) abort();
+
unique_fd cg_fd(open(cg2_path, O_DIRECTORY | O_RDONLY | O_CLOEXEC));
- if (cg_fd == -1) {
- int ret = errno;
- ALOGE("Failed to open the cgroup directory: %s", strerror(ret));
- return statusFromErrno(ret, "Open the cgroup directory failed");
+ if (!cg_fd.ok()) {
+ const int err = errno;
+ ALOGE("Failed to open the cgroup directory: %s", strerror(err));
+ return statusFromErrno(err, "Open the cgroup directory failed");
}
RETURN_IF_NOT_OK(checkProgramAccessible(XT_BPF_ALLOWLIST_PROG_PATH));
RETURN_IF_NOT_OK(checkProgramAccessible(XT_BPF_DENYLIST_PROG_PATH));
@@ -185,7 +188,7 @@
}
uint64_t sock_cookie = getSocketCookie(sockFd);
- if (sock_cookie == NONEXISTENT_COOKIE) return -errno;
+ if (!sock_cookie) return -errno;
UidTagValue newKey = {.uid = (uint32_t)chargeUid, .tag = tag};
@@ -244,12 +247,14 @@
mCookieTagMap.getMap().get());
return -res.error().code();
}
+ ALOGD("Socket with cookie %" PRIu64 " tagged successfully with tag %" PRIu32 " uid %u "
+ "and real uid %u", sock_cookie, tag, chargeUid, realUid);
return 0;
}
int BpfHandler::untagSocket(int sockFd) {
uint64_t sock_cookie = getSocketCookie(sockFd);
- if (sock_cookie == NONEXISTENT_COOKIE) return -errno;
+ if (!sock_cookie) return -errno;
if (!mCookieTagMap.isValid()) return -EPERM;
base::Result<void> res = mCookieTagMap.deleteValue(sock_cookie);
@@ -257,6 +262,7 @@
ALOGE("Failed to untag socket: %s", strerror(res.error().code()));
return -res.error().code();
}
+ ALOGD("Socket with cookie %" PRIu64 " untagged successfully.", sock_cookie);
return 0;
}
diff --git a/service-t/Android.bp b/service-t/Android.bp
index 5bf2973..7de749c 100644
--- a/service-t/Android.bp
+++ b/service-t/Android.bp
@@ -75,3 +75,47 @@
"//packages/modules/IPsec/tests/iketests",
],
}
+
+// Test building mDNS as a standalone, so that it can be imported into other repositories as-is.
+// The mDNS code is platform code so it should use framework-annotations-lib, contrary to apps that
+// should use sdk_version: "system_current" and only androidx.annotation_annotation. But this build
+// rule verifies that the mDNS code can be built into apps, if code transformations are applied to
+// the annotations.
+// When using "system_current", framework annotations are not available; they would appear as
+// package-private as they are marked as such in the system_current stubs. So build against
+// core_platform and add the stubs manually in "libs". See http://b/147773144#comment7.
+java_library {
+ name: "service-connectivity-mdns-standalone-build-test",
+ sdk_version: "core_platform",
+ srcs: [
+ ":service-mdns-droidstubs",
+ "src/com/android/server/connectivity/mdns/**/*.java",
+ ],
+ exclude_srcs: [
+ "src/com/android/server/connectivity/mdns/internal/SocketNetlinkMonitor.java",
+ "src/com/android/server/connectivity/mdns/SocketNetLinkMonitorFactory.java"
+ ],
+ static_libs: [
+ "net-utils-device-common-mdns-standalone-build-test",
+ ],
+ libs: [
+ "framework-annotations-lib",
+ "android_system_stubs_current",
+ "androidx.annotation_annotation",
+ ],
+ visibility: [
+ "//visibility:private",
+ ],
+}
+
+droidstubs {
+ name: "service-mdns-droidstubs",
+ srcs: ["src/com/android/server/connectivity/mdns/SocketNetLinkMonitorFactory.java"],
+ libs: [
+ "net-utils-device-common-mdns-standalone-build-test",
+ "service-connectivity-tiramisu-pre-jarjar"
+ ],
+ visibility: [
+ "//visibility:private",
+ ],
+}
\ No newline at end of file
diff --git a/service-t/jni/com_android_server_net_NetworkStatsFactory.cpp b/service-t/jni/com_android_server_net_NetworkStatsFactory.cpp
index 2dbe771..a16757b 100644
--- a/service-t/jni/com_android_server_net_NetworkStatsFactory.cpp
+++ b/service-t/jni/com_android_server_net_NetworkStatsFactory.cpp
@@ -170,23 +170,10 @@
return 0;
}
-static int readNetworkStatsDetail(JNIEnv* env, jclass clazz, jobject stats, jint limitUid,
- jobjectArray limitIfacesObj, jint limitTag) {
-
- std::vector<std::string> limitIfaces;
- if (limitIfacesObj != NULL && env->GetArrayLength(limitIfacesObj) > 0) {
- int num = env->GetArrayLength(limitIfacesObj);
- for (int i = 0; i < num; i++) {
- jstring string = (jstring)env->GetObjectArrayElement(limitIfacesObj, i);
- ScopedUtfChars string8(env, string);
- if (string8.c_str() != NULL) {
- limitIfaces.push_back(std::string(string8.c_str()));
- }
- }
- }
+static int readNetworkStatsDetail(JNIEnv* env, jclass clazz, jobject stats) {
std::vector<stats_line> lines;
- if (parseBpfNetworkStatsDetail(&lines, limitIfaces, limitTag, limitUid) < 0)
+ if (parseBpfNetworkStatsDetail(&lines) < 0)
return -1;
return statsLinesToNetworkStats(env, clazz, stats, lines);
@@ -202,8 +189,7 @@
}
static const JNINativeMethod gMethods[] = {
- { "nativeReadNetworkStatsDetail",
- "(Landroid/net/NetworkStats;I[Ljava/lang/String;I)I",
+ { "nativeReadNetworkStatsDetail", "(Landroid/net/NetworkStats;)I",
(void*) readNetworkStatsDetail },
{ "nativeReadNetworkStatsDev", "(Landroid/net/NetworkStats;)I",
(void*) readNetworkStatsDev },
diff --git a/service-t/native/libs/libnetworkstats/Android.bp b/service-t/native/libs/libnetworkstats/Android.bp
index aa1ee41..0dfd0af 100644
--- a/service-t/native/libs/libnetworkstats/Android.bp
+++ b/service-t/native/libs/libnetworkstats/Android.bp
@@ -26,9 +26,11 @@
srcs: [
"BpfNetworkStats.cpp",
"NetworkTraceHandler.cpp",
+ "NetworkTracePoller.cpp",
],
shared_libs: [
"libbase",
+ "libcutils",
"liblog",
],
static_libs: [
@@ -62,6 +64,7 @@
srcs: [
"BpfNetworkStatsTest.cpp",
"NetworkTraceHandlerTest.cpp",
+ "NetworkTracePollerTest.cpp",
],
cflags: [
"-Wall",
@@ -73,10 +76,13 @@
"libgmock",
"libnetworkstats",
"libperfetto_client_experimental",
+ "libprotobuf-cpp-lite",
+ "perfetto_trace_protos",
],
shared_libs: [
"libbase",
"liblog",
+ "libcutils",
"libandroid_net",
],
compile_multilib: "both",
diff --git a/service-t/native/libs/libnetworkstats/BpfNetworkStats.cpp b/service-t/native/libs/libnetworkstats/BpfNetworkStats.cpp
index 4fbc5f4..1bc8ca5 100644
--- a/service-t/native/libs/libnetworkstats/BpfNetworkStats.cpp
+++ b/service-t/native/libs/libnetworkstats/BpfNetworkStats.cpp
@@ -109,13 +109,12 @@
return newLine;
}
-int parseBpfNetworkStatsDetailInternal(std::vector<stats_line>* lines,
- const std::vector<std::string>& limitIfaces, int limitTag,
- int limitUid, const BpfMap<StatsKey, StatsValue>& statsMap,
+int parseBpfNetworkStatsDetailInternal(std::vector<stats_line>& lines,
+ const BpfMap<StatsKey, StatsValue>& statsMap,
const BpfMap<uint32_t, IfaceValue>& ifaceMap) {
int64_t unknownIfaceBytesTotal = 0;
const auto processDetailUidStats =
- [lines, &limitIfaces, &limitTag, &limitUid, &unknownIfaceBytesTotal, &ifaceMap](
+ [&lines, &unknownIfaceBytesTotal, &ifaceMap](
const StatsKey& key,
const BpfMap<StatsKey, StatsValue>& statsMap) -> Result<void> {
char ifname[IFNAMSIZ];
@@ -123,23 +122,17 @@
&unknownIfaceBytesTotal)) {
return Result<void>();
}
- std::string ifnameStr(ifname);
- if (limitIfaces.size() > 0 &&
- std::find(limitIfaces.begin(), limitIfaces.end(), ifnameStr) == limitIfaces.end()) {
- // Nothing matched; skip this line.
- return Result<void>();
- }
- if (limitTag != TAG_ALL && uint32_t(limitTag) != key.tag) {
- return Result<void>();
- }
- if (limitUid != UID_ALL && uint32_t(limitUid) != key.uid) {
- return Result<void>();
- }
Result<StatsValue> statsEntry = statsMap.readValue(key);
if (!statsEntry.ok()) {
return base::ResultError(statsEntry.error().message(), statsEntry.error().code());
}
- lines->push_back(populateStatsEntry(key, statsEntry.value(), ifname));
+ stats_line newLine = populateStatsEntry(key, statsEntry.value(), ifname);
+ lines.push_back(newLine);
+ if (newLine.tag) {
+ // account tagged traffic in the untagged stats (for historical reasons?)
+ newLine.tag = 0;
+ lines.push_back(newLine);
+ }
return Result<void>();
};
Result<void> res = statsMap.iterate(processDetailUidStats);
@@ -162,9 +155,7 @@
return 0;
}
-int parseBpfNetworkStatsDetail(std::vector<stats_line>* lines,
- const std::vector<std::string>& limitIfaces, int limitTag,
- int limitUid) {
+int parseBpfNetworkStatsDetail(std::vector<stats_line>* lines) {
static BpfMapRO<uint32_t, IfaceValue> ifaceIndexNameMap(IFACE_INDEX_NAME_MAP_PATH);
static BpfMapRO<uint32_t, uint32_t> configurationMap(CONFIGURATION_MAP_PATH);
static BpfMap<StatsKey, StatsValue> statsMapA(STATS_MAP_A_PATH);
@@ -195,8 +186,7 @@
// TODO: the above comment feels like it may be obsolete / out of date,
// since we no longer swap the map via netd binder rpc - though we do
// still swap it.
- int ret = parseBpfNetworkStatsDetailInternal(lines, limitIfaces, limitTag, limitUid,
- *inactiveStatsMap, ifaceIndexNameMap);
+ int ret = parseBpfNetworkStatsDetailInternal(*lines, *inactiveStatsMap, ifaceIndexNameMap);
if (ret) {
ALOGE("parse detail network stats failed: %s", strerror(errno));
return ret;
@@ -211,11 +201,11 @@
return 0;
}
-int parseBpfNetworkStatsDevInternal(std::vector<stats_line>* lines,
+int parseBpfNetworkStatsDevInternal(std::vector<stats_line>& lines,
const BpfMap<uint32_t, StatsValue>& statsMap,
const BpfMap<uint32_t, IfaceValue>& ifaceMap) {
int64_t unknownIfaceBytesTotal = 0;
- const auto processDetailIfaceStats = [lines, &unknownIfaceBytesTotal, &ifaceMap, &statsMap](
+ const auto processDetailIfaceStats = [&lines, &unknownIfaceBytesTotal, &ifaceMap, &statsMap](
const uint32_t& key, const StatsValue& value,
const BpfMap<uint32_t, StatsValue>&) {
char ifname[IFNAMSIZ];
@@ -227,7 +217,7 @@
.tag = (uint32_t)TAG_NONE,
.counterSet = (uint32_t)SET_ALL,
};
- lines->push_back(populateStatsEntry(fakeKey, value, ifname));
+ lines.push_back(populateStatsEntry(fakeKey, value, ifname));
return Result<void>();
};
Result<void> res = statsMap.iterateWithValue(processDetailIfaceStats);
@@ -244,29 +234,28 @@
int parseBpfNetworkStatsDev(std::vector<stats_line>* lines) {
static BpfMapRO<uint32_t, IfaceValue> ifaceIndexNameMap(IFACE_INDEX_NAME_MAP_PATH);
static BpfMapRO<uint32_t, StatsValue> ifaceStatsMap(IFACE_STATS_MAP_PATH);
- return parseBpfNetworkStatsDevInternal(lines, ifaceStatsMap, ifaceIndexNameMap);
+ return parseBpfNetworkStatsDevInternal(*lines, ifaceStatsMap, ifaceIndexNameMap);
}
-void groupNetworkStats(std::vector<stats_line>* lines) {
- if (lines->size() <= 1) return;
- std::sort(lines->begin(), lines->end());
+void groupNetworkStats(std::vector<stats_line>& lines) {
+ if (lines.size() <= 1) return;
+ std::sort(lines.begin(), lines.end());
// Similar to std::unique(), but aggregates the duplicates rather than discarding them.
- size_t nextOutput = 0;
- for (size_t i = 1; i < lines->size(); i++) {
- if (lines->at(nextOutput) == lines->at(i)) {
- lines->at(nextOutput) += lines->at(i);
+ size_t currentOutput = 0;
+ for (size_t i = 1; i < lines.size(); i++) {
+ // note that == operator only compares the 'key' portion: iface/uid/tag/set
+ if (lines[currentOutput] == lines[i]) {
+ // while += operator only affects the 'data' portion: {rx,tx}{Bytes,Packets}
+ lines[currentOutput] += lines[i];
} else {
- nextOutput++;
- if (nextOutput != i) {
- lines->at(nextOutput) = lines->at(i);
- }
+ // okay, we're done aggregating the current line, move to the next one
+ lines[++currentOutput] = lines[i];
}
}
- if (lines->size() != nextOutput + 1) {
- lines->resize(nextOutput + 1);
- }
+ // possibly shrink the vector - currentOutput is the last line with valid data
+ lines.resize(currentOutput + 1);
}
// True if lhs equals to rhs, only compare iface, uid, tag and set.
diff --git a/service-t/native/libs/libnetworkstats/BpfNetworkStatsTest.cpp b/service-t/native/libs/libnetworkstats/BpfNetworkStatsTest.cpp
index ff62c0b..ccd3f5e 100644
--- a/service-t/native/libs/libnetworkstats/BpfNetworkStatsTest.cpp
+++ b/service-t/native/libs/libnetworkstats/BpfNetworkStatsTest.cpp
@@ -225,18 +225,11 @@
ASSERT_EQ(0, bpfGetUidStatsInternal(TEST_UID2, &result2, mFakeAppUidStatsMap));
expectStatsEqual(value2, result2);
std::vector<stats_line> lines;
- std::vector<std::string> ifaces;
populateFakeStats(TEST_UID1, 0, IFACE_INDEX1, TEST_COUNTERSET0, value1, mFakeStatsMap);
populateFakeStats(TEST_UID1, 0, IFACE_INDEX2, TEST_COUNTERSET1, value1, mFakeStatsMap);
populateFakeStats(TEST_UID2, 0, IFACE_INDEX3, TEST_COUNTERSET1, value1, mFakeStatsMap);
- ASSERT_EQ(0, parseBpfNetworkStatsDetailInternal(&lines, ifaces, TAG_ALL, TEST_UID1,
- mFakeStatsMap, mFakeIfaceIndexNameMap));
- ASSERT_EQ((unsigned long)2, lines.size());
- lines.clear();
- ASSERT_EQ(0, parseBpfNetworkStatsDetailInternal(&lines, ifaces, TAG_ALL, TEST_UID2,
- mFakeStatsMap, mFakeIfaceIndexNameMap));
- ASSERT_EQ((unsigned long)1, lines.size());
- expectStatsLineEqual(value1, IFACE_NAME3, TEST_UID2, TEST_COUNTERSET1, 0, lines.front());
+ ASSERT_EQ(0, parseBpfNetworkStatsDetailInternal(lines, mFakeStatsMap, mFakeIfaceIndexNameMap));
+ ASSERT_EQ((unsigned long)3, lines.size());
}
TEST_F(BpfNetworkStatsHelperTest, TestGetIfaceStatsInternal) {
@@ -297,24 +290,8 @@
mFakeStatsMap);
populateFakeStats(TEST_UID2, TEST_TAG, IFACE_INDEX1, TEST_COUNTERSET0, value1, mFakeStatsMap);
std::vector<stats_line> lines;
- std::vector<std::string> ifaces;
- ASSERT_EQ(0, parseBpfNetworkStatsDetailInternal(&lines, ifaces, TAG_ALL, UID_ALL, mFakeStatsMap,
- mFakeIfaceIndexNameMap));
- ASSERT_EQ((unsigned long)4, lines.size());
- lines.clear();
- ASSERT_EQ(0, parseBpfNetworkStatsDetailInternal(&lines, ifaces, TAG_ALL, TEST_UID1,
- mFakeStatsMap, mFakeIfaceIndexNameMap));
- ASSERT_EQ((unsigned long)3, lines.size());
- lines.clear();
- ASSERT_EQ(0, parseBpfNetworkStatsDetailInternal(&lines, ifaces, TEST_TAG, TEST_UID1,
- mFakeStatsMap, mFakeIfaceIndexNameMap));
- ASSERT_EQ((unsigned long)2, lines.size());
- lines.clear();
- ifaces.push_back(std::string(IFACE_NAME1));
- ASSERT_EQ(0, parseBpfNetworkStatsDetailInternal(&lines, ifaces, TEST_TAG, TEST_UID1,
- mFakeStatsMap, mFakeIfaceIndexNameMap));
- ASSERT_EQ((unsigned long)1, lines.size());
- expectStatsLineEqual(value1, IFACE_NAME1, TEST_UID1, TEST_COUNTERSET0, TEST_TAG, lines.front());
+ ASSERT_EQ(0, parseBpfNetworkStatsDetailInternal(lines, mFakeStatsMap, mFakeIfaceIndexNameMap));
+ ASSERT_EQ((unsigned long)7, lines.size());
}
TEST_F(BpfNetworkStatsHelperTest, TestGetStatsWithSkippedIface) {
@@ -333,24 +310,8 @@
populateFakeStats(TEST_UID1, 0, IFACE_INDEX1, TEST_COUNTERSET1, value1, mFakeStatsMap);
populateFakeStats(TEST_UID2, 0, IFACE_INDEX1, TEST_COUNTERSET0, value1, mFakeStatsMap);
std::vector<stats_line> lines;
- std::vector<std::string> ifaces;
- ASSERT_EQ(0, parseBpfNetworkStatsDetailInternal(&lines, ifaces, TAG_ALL, UID_ALL, mFakeStatsMap,
- mFakeIfaceIndexNameMap));
+ ASSERT_EQ(0, parseBpfNetworkStatsDetailInternal(lines, mFakeStatsMap, mFakeIfaceIndexNameMap));
ASSERT_EQ((unsigned long)4, lines.size());
- lines.clear();
- ASSERT_EQ(0, parseBpfNetworkStatsDetailInternal(&lines, ifaces, TAG_ALL, TEST_UID1,
- mFakeStatsMap, mFakeIfaceIndexNameMap));
- ASSERT_EQ((unsigned long)3, lines.size());
- lines.clear();
- ASSERT_EQ(0, parseBpfNetworkStatsDetailInternal(&lines, ifaces, TAG_ALL, TEST_UID2,
- mFakeStatsMap, mFakeIfaceIndexNameMap));
- ASSERT_EQ((unsigned long)1, lines.size());
- expectStatsLineEqual(value1, IFACE_NAME1, TEST_UID2, TEST_COUNTERSET0, 0, lines.front());
- lines.clear();
- ifaces.push_back(std::string(IFACE_NAME1));
- ASSERT_EQ(0, parseBpfNetworkStatsDetailInternal(&lines, ifaces, TAG_ALL, TEST_UID1,
- mFakeStatsMap, mFakeIfaceIndexNameMap));
- ASSERT_EQ((unsigned long)2, lines.size());
}
TEST_F(BpfNetworkStatsHelperTest, TestUnknownIfaceError) {
@@ -387,10 +348,8 @@
ifname, curKey, &unknownIfaceBytesTotal));
ASSERT_EQ(-1, unknownIfaceBytesTotal);
std::vector<stats_line> lines;
- std::vector<std::string> ifaces;
// TODO: find a way to test the total of unknown Iface Bytes go above limit.
- ASSERT_EQ(0, parseBpfNetworkStatsDetailInternal(&lines, ifaces, TAG_ALL, UID_ALL, mFakeStatsMap,
- mFakeIfaceIndexNameMap));
+ ASSERT_EQ(0, parseBpfNetworkStatsDetailInternal(lines, mFakeStatsMap, mFakeIfaceIndexNameMap));
ASSERT_EQ((unsigned long)1, lines.size());
expectStatsLineEqual(value1, IFACE_NAME1, TEST_UID1, TEST_COUNTERSET0, 0, lines.front());
}
@@ -422,7 +381,7 @@
EXPECT_RESULT_OK(mFakeIfaceStatsMap.writeValue(ifaceStatsKey, value2, BPF_ANY));
std::vector<stats_line> lines;
ASSERT_EQ(0,
- parseBpfNetworkStatsDevInternal(&lines, mFakeIfaceStatsMap, mFakeIfaceIndexNameMap));
+ parseBpfNetworkStatsDevInternal(lines, mFakeIfaceStatsMap, mFakeIfaceIndexNameMap));
ASSERT_EQ((unsigned long)4, lines.size());
expectStatsLineEqual(value1, IFACE_NAME1, UID_ALL, SET_ALL, TAG_NONE, lines[0]);
@@ -450,28 +409,32 @@
.txPackets = TEST_PACKET0,
.txBytes = TEST_BYTES0,
};
- StatsValue value3 = {
+ StatsValue value3 = { // value1 *2
.rxPackets = TEST_PACKET0 * 2,
.rxBytes = TEST_BYTES0 * 2,
.txPackets = TEST_PACKET1 * 2,
.txBytes = TEST_BYTES1 * 2,
};
+ StatsValue value5 = { // value2 + value3
+ .rxPackets = TEST_PACKET1 + TEST_PACKET0 * 2,
+ .rxBytes = TEST_BYTES1 + TEST_BYTES0 * 2,
+ .txPackets = TEST_PACKET0 + TEST_PACKET1 * 2,
+ .txBytes = TEST_BYTES0 + TEST_BYTES1 * 2,
+ };
std::vector<stats_line> lines;
- std::vector<std::string> ifaces;
// Test empty stats.
- ASSERT_EQ(0, parseBpfNetworkStatsDetailInternal(&lines, ifaces, TAG_ALL, UID_ALL, mFakeStatsMap,
- mFakeIfaceIndexNameMap));
+ ASSERT_EQ(0, parseBpfNetworkStatsDetailInternal(lines, mFakeStatsMap, mFakeIfaceIndexNameMap));
ASSERT_EQ((size_t) 0, lines.size());
lines.clear();
// Test 1 line stats.
populateFakeStats(TEST_UID1, TEST_TAG, IFACE_INDEX1, TEST_COUNTERSET0, value1, mFakeStatsMap);
- ASSERT_EQ(0, parseBpfNetworkStatsDetailInternal(&lines, ifaces, TAG_ALL, UID_ALL, mFakeStatsMap,
- mFakeIfaceIndexNameMap));
- ASSERT_EQ((size_t) 1, lines.size());
- expectStatsLineEqual(value1, IFACE_NAME1, TEST_UID1, TEST_COUNTERSET0, TEST_TAG, lines[0]);
+ ASSERT_EQ(0, parseBpfNetworkStatsDetailInternal(lines, mFakeStatsMap, mFakeIfaceIndexNameMap));
+ ASSERT_EQ((size_t) 2, lines.size()); // TEST_TAG != 0 -> 1 entry becomes 2 lines
+ expectStatsLineEqual(value1, IFACE_NAME1, TEST_UID1, TEST_COUNTERSET0, 0, lines[0]);
+ expectStatsLineEqual(value1, IFACE_NAME1, TEST_UID1, TEST_COUNTERSET0, TEST_TAG, lines[1]);
lines.clear();
// These items should not be grouped.
@@ -480,25 +443,27 @@
populateFakeStats(TEST_UID1, TEST_TAG + 1, IFACE_INDEX1, TEST_COUNTERSET0, value2,
mFakeStatsMap);
populateFakeStats(TEST_UID2, TEST_TAG, IFACE_INDEX1, TEST_COUNTERSET0, value1, mFakeStatsMap);
- ASSERT_EQ(0, parseBpfNetworkStatsDetailInternal(&lines, ifaces, TAG_ALL, UID_ALL, mFakeStatsMap,
- mFakeIfaceIndexNameMap));
- ASSERT_EQ((size_t) 5, lines.size());
+ ASSERT_EQ(0, parseBpfNetworkStatsDetailInternal(lines, mFakeStatsMap, mFakeIfaceIndexNameMap));
+ ASSERT_EQ((size_t) 9, lines.size());
lines.clear();
// These items should be grouped.
populateFakeStats(TEST_UID1, TEST_TAG, IFACE_INDEX3, TEST_COUNTERSET0, value1, mFakeStatsMap);
populateFakeStats(TEST_UID2, TEST_TAG, IFACE_INDEX3, TEST_COUNTERSET0, value1, mFakeStatsMap);
- ASSERT_EQ(0, parseBpfNetworkStatsDetailInternal(&lines, ifaces, TAG_ALL, UID_ALL, mFakeStatsMap,
- mFakeIfaceIndexNameMap));
- ASSERT_EQ((size_t) 5, lines.size());
+ ASSERT_EQ(0, parseBpfNetworkStatsDetailInternal(lines, mFakeStatsMap, mFakeIfaceIndexNameMap));
+ ASSERT_EQ((size_t) 9, lines.size());
// Verify Sorted & Grouped.
- expectStatsLineEqual(value3, IFACE_NAME1, TEST_UID1, TEST_COUNTERSET0, TEST_TAG, lines[0]);
- expectStatsLineEqual(value2, IFACE_NAME1, TEST_UID1, TEST_COUNTERSET1, TEST_TAG, lines[1]);
- expectStatsLineEqual(value2, IFACE_NAME1, TEST_UID1, TEST_COUNTERSET0, TEST_TAG + 1, lines[2]);
- expectStatsLineEqual(value3, IFACE_NAME1, TEST_UID2, TEST_COUNTERSET0, TEST_TAG, lines[3]);
- expectStatsLineEqual(value2, IFACE_NAME2, TEST_UID1, TEST_COUNTERSET0, TEST_TAG, lines[4]);
+ expectStatsLineEqual(value5, IFACE_NAME1, TEST_UID1, TEST_COUNTERSET0, 0, lines[0]);
+ expectStatsLineEqual(value2, IFACE_NAME1, TEST_UID1, TEST_COUNTERSET1, 0, lines[1]);
+ expectStatsLineEqual(value3, IFACE_NAME1, TEST_UID1, TEST_COUNTERSET0, TEST_TAG, lines[2]);
+ expectStatsLineEqual(value2, IFACE_NAME1, TEST_UID1, TEST_COUNTERSET1, TEST_TAG, lines[3]);
+ expectStatsLineEqual(value2, IFACE_NAME1, TEST_UID1, TEST_COUNTERSET0, TEST_TAG + 1, lines[4]);
+ expectStatsLineEqual(value3, IFACE_NAME1, TEST_UID2, TEST_COUNTERSET0, 0, lines[5]);
+ expectStatsLineEqual(value3, IFACE_NAME1, TEST_UID2, TEST_COUNTERSET0, TEST_TAG, lines[6]);
+ expectStatsLineEqual(value2, IFACE_NAME2, TEST_UID1, TEST_COUNTERSET0, 0, lines[7]);
+ expectStatsLineEqual(value2, IFACE_NAME2, TEST_UID1, TEST_COUNTERSET0, TEST_TAG, lines[8]);
lines.clear();
// Perform test on IfaceStats.
@@ -512,7 +477,7 @@
EXPECT_RESULT_OK(mFakeIfaceStatsMap.writeValue(ifaceStatsKey, value1, BPF_ANY));
ASSERT_EQ(0,
- parseBpfNetworkStatsDevInternal(&lines, mFakeIfaceStatsMap, mFakeIfaceIndexNameMap));
+ parseBpfNetworkStatsDevInternal(lines, mFakeIfaceStatsMap, mFakeIfaceIndexNameMap));
ASSERT_EQ((size_t) 2, lines.size());
expectStatsLineEqual(value3, IFACE_NAME1, UID_ALL, SET_ALL, TAG_NONE, lines[0]);
@@ -531,41 +496,48 @@
.txPackets = TEST_PACKET1,
.txBytes = TEST_BYTES1,
};
+ StatsValue value4 = { // value1 * 4
+ .rxPackets = TEST_PACKET0 * 4,
+ .rxBytes = TEST_BYTES0 * 4,
+ .txPackets = TEST_PACKET1 * 4,
+ .txBytes = TEST_BYTES1 * 4,
+ };
// Mutate uid, 0 < TEST_UID1 < INT_MAX < INT_MIN < UINT_MAX.
- populateFakeStats(0, TEST_TAG, IFACE_INDEX1, TEST_COUNTERSET0, value1, mFakeStatsMap);
- populateFakeStats(UINT_MAX, TEST_TAG, IFACE_INDEX1, TEST_COUNTERSET0, value1, mFakeStatsMap);
- populateFakeStats(INT_MIN, TEST_TAG, IFACE_INDEX1, TEST_COUNTERSET0, value1, mFakeStatsMap);
- populateFakeStats(INT_MAX, TEST_TAG, IFACE_INDEX1, TEST_COUNTERSET0, value1, mFakeStatsMap);
+ populateFakeStats(0, TEST_TAG, IFACE_INDEX1, TEST_COUNTERSET0, value1, mFakeStatsMap);
+ populateFakeStats(UINT_MAX, TEST_TAG, IFACE_INDEX1, TEST_COUNTERSET0, value1, mFakeStatsMap);
+ populateFakeStats(INT_MIN, TEST_TAG, IFACE_INDEX1, TEST_COUNTERSET0, value1, mFakeStatsMap);
+ populateFakeStats(INT_MAX, TEST_TAG, IFACE_INDEX1, TEST_COUNTERSET0, value1, mFakeStatsMap);
// Mutate tag, 0 < TEST_TAG < INT_MAX < INT_MIN < UINT_MAX.
- populateFakeStats(TEST_UID1, INT_MAX, IFACE_INDEX1, TEST_COUNTERSET0, value1, mFakeStatsMap);
- populateFakeStats(TEST_UID1, INT_MIN, IFACE_INDEX1, TEST_COUNTERSET0, value1, mFakeStatsMap);
- populateFakeStats(TEST_UID1, 0, IFACE_INDEX1, TEST_COUNTERSET0, value1, mFakeStatsMap);
+ populateFakeStats(TEST_UID1, INT_MAX, IFACE_INDEX1, TEST_COUNTERSET0, value1, mFakeStatsMap);
+ populateFakeStats(TEST_UID1, INT_MIN, IFACE_INDEX1, TEST_COUNTERSET0, value1, mFakeStatsMap);
+ populateFakeStats(TEST_UID1, 0, IFACE_INDEX1, TEST_COUNTERSET0, value1, mFakeStatsMap);
populateFakeStats(TEST_UID1, UINT_MAX, IFACE_INDEX1, TEST_COUNTERSET0, value1, mFakeStatsMap);
// TODO: Mutate counterSet and enlarge TEST_MAP_SIZE if overflow on counterSet is possible.
std::vector<stats_line> lines;
- std::vector<std::string> ifaces;
- ASSERT_EQ(0, parseBpfNetworkStatsDetailInternal(&lines, ifaces, TAG_ALL, UID_ALL, mFakeStatsMap,
- mFakeIfaceIndexNameMap));
- ASSERT_EQ((size_t) 8, lines.size());
+ ASSERT_EQ(0, parseBpfNetworkStatsDetailInternal(lines, mFakeStatsMap, mFakeIfaceIndexNameMap));
+ ASSERT_EQ((size_t) 12, lines.size());
// Uid 0 first
- expectStatsLineEqual(value1, IFACE_NAME1, 0, TEST_COUNTERSET0, TEST_TAG, lines[0]);
+ expectStatsLineEqual(value1, IFACE_NAME1, 0, TEST_COUNTERSET0, 0, lines[0]);
+ expectStatsLineEqual(value1, IFACE_NAME1, 0, TEST_COUNTERSET0, TEST_TAG, lines[1]);
// Test uid, mutate tag.
- expectStatsLineEqual(value1, IFACE_NAME1, TEST_UID1, TEST_COUNTERSET0, 0, lines[1]);
- expectStatsLineEqual(value1, IFACE_NAME1, TEST_UID1, TEST_COUNTERSET0, INT_MAX, lines[2]);
- expectStatsLineEqual(value1, IFACE_NAME1, TEST_UID1, TEST_COUNTERSET0, INT_MIN, lines[3]);
- expectStatsLineEqual(value1, IFACE_NAME1, TEST_UID1, TEST_COUNTERSET0, UINT_MAX, lines[4]);
+ expectStatsLineEqual(value4, IFACE_NAME1, TEST_UID1, TEST_COUNTERSET0, 0, lines[2]);
+ expectStatsLineEqual(value1, IFACE_NAME1, TEST_UID1, TEST_COUNTERSET0, INT_MAX, lines[3]);
+ expectStatsLineEqual(value1, IFACE_NAME1, TEST_UID1, TEST_COUNTERSET0, INT_MIN, lines[4]);
+ expectStatsLineEqual(value1, IFACE_NAME1, TEST_UID1, TEST_COUNTERSET0, UINT_MAX, lines[5]);
// Mutate uid.
- expectStatsLineEqual(value1, IFACE_NAME1, INT_MAX, TEST_COUNTERSET0, TEST_TAG, lines[5]);
- expectStatsLineEqual(value1, IFACE_NAME1, INT_MIN, TEST_COUNTERSET0, TEST_TAG, lines[6]);
- expectStatsLineEqual(value1, IFACE_NAME1, UINT_MAX, TEST_COUNTERSET0, TEST_TAG, lines[7]);
- lines.clear();
+ expectStatsLineEqual(value1, IFACE_NAME1, INT_MAX, TEST_COUNTERSET0, 0, lines[6]);
+ expectStatsLineEqual(value1, IFACE_NAME1, INT_MAX, TEST_COUNTERSET0, TEST_TAG, lines[7]);
+ expectStatsLineEqual(value1, IFACE_NAME1, INT_MIN, TEST_COUNTERSET0, 0, lines[8]);
+ expectStatsLineEqual(value1, IFACE_NAME1, INT_MIN, TEST_COUNTERSET0, TEST_TAG, lines[9]);
+ expectStatsLineEqual(value1, IFACE_NAME1, UINT_MAX, TEST_COUNTERSET0, 0, lines[10]);
+ expectStatsLineEqual(value1, IFACE_NAME1, UINT_MAX, TEST_COUNTERSET0, TEST_TAG, lines[11]);
}
} // namespace bpf
} // namespace android
diff --git a/service-t/native/libs/libnetworkstats/NetworkTraceHandler.cpp b/service-t/native/libs/libnetworkstats/NetworkTraceHandler.cpp
index be4ffe3..c5f9631 100644
--- a/service-t/native/libs/libnetworkstats/NetworkTraceHandler.cpp
+++ b/service-t/native/libs/libnetworkstats/NetworkTraceHandler.cpp
@@ -33,11 +33,62 @@
namespace android {
namespace bpf {
+using ::android::bpf::internal::NetworkTracePoller;
+using ::perfetto::protos::pbzero::NetworkPacketBundle;
using ::perfetto::protos::pbzero::NetworkPacketEvent;
using ::perfetto::protos::pbzero::NetworkPacketTraceConfig;
using ::perfetto::protos::pbzero::TracePacket;
using ::perfetto::protos::pbzero::TrafficDirection;
+// Bundling takes groups of packets with similar contextual fields (generally,
+// all fields except timestamp and length) and summarises them in a single trace
+// packet. For example, rather than
+//
+// {.timestampNs = 1, .uid = 1000, .tag = 123, .len = 72}
+// {.timestampNs = 2, .uid = 1000, .tag = 123, .len = 100}
+// {.timestampNs = 5, .uid = 1000, .tag = 123, .len = 456}
+//
+// The output will be something like
+// {
+// .timestamp = 1
+// .ctx = {.uid = 1000, .tag = 123}
+// .timestamp = [0, 1, 4], // delta encoded
+// .length = [72, 100, 456], // should be zipped with timestamps
+// }
+//
+// Most workloads have many packets from few contexts. Bundling greatly reduces
+// the amount of redundant information written, thus reducing the overall trace
+// size. Interning ids are similarly based on unique bundle contexts.
+
+// Based on boost::hash_combine
+template <typename T, typename... Rest>
+void HashCombine(std::size_t& seed, const T& val, const Rest&... rest) {
+ seed ^= std::hash<T>()(val) + 0x9e3779b9 + (seed << 6) + (seed >> 2);
+ (HashCombine(seed, rest), ...);
+}
+
+// Details summarises the timestamp and lengths of packets in a bundle.
+struct BundleDetails {
+ std::vector<std::pair<uint64_t, uint32_t>> time_and_len;
+ uint64_t minTs = std::numeric_limits<uint64_t>::max();
+ uint64_t maxTs = std::numeric_limits<uint64_t>::min();
+ uint32_t bytes = 0;
+};
+
+#define AGG_FIELDS(x) \
+ (x).ifindex, (x).uid, (x).tag, (x).sport, (x).dport, (x).egress, \
+ (x).ipProto, (x).tcpFlags
+
+std::size_t BundleHash::operator()(const BundleKey& a) const {
+ std::size_t seed = 0;
+ HashCombine(seed, AGG_FIELDS(a));
+ return seed;
+}
+
+bool BundleEq::operator()(const BundleKey& a, const BundleKey& b) const {
+ return std::tie(AGG_FIELDS(a)) == std::tie(AGG_FIELDS(b));
+}
+
// static
void NetworkTraceHandler::RegisterDataSource() {
ALOGD("Registering Perfetto data source");
@@ -50,17 +101,27 @@
void NetworkTraceHandler::InitPerfettoTracing() {
perfetto::TracingInitArgs args = {};
args.backends |= perfetto::kSystemBackend;
+ // The following line disables the Perfetto system consumer. Perfetto inlines
+ // the call to `Initialize` which allows the compiler to see that the branch
+ // with the SystemConsumerTracingBackend is not used. With LTO enabled, this
+ // strips the Perfetto consumer code and reduces the size of this binary by
+ // around 270KB total. Be careful when changing this value.
args.enable_system_consumer = false;
perfetto::Tracing::Initialize(args);
NetworkTraceHandler::RegisterDataSource();
}
// static
-NetworkTracePoller NetworkTraceHandler::sPoller([](const PacketTrace& pkt) {
- NetworkTraceHandler::Trace([pkt](NetworkTraceHandler::TraceContext ctx) {
- NetworkTraceHandler::Fill(pkt, *ctx.NewTracePacket());
- });
-});
+NetworkTracePoller NetworkTraceHandler::sPoller(
+ [](const std::vector<PacketTrace>& packets) {
+ // Trace calls the provided callback for each active session. The context
+ // gets a reference to the NetworkTraceHandler instance associated with
+ // the session and delegates writing. The corresponding handler will write
+ // with the setting specified in the trace config.
+ NetworkTraceHandler::Trace([&](NetworkTraceHandler::TraceContext ctx) {
+ ctx.GetDataSourceLocked()->Write(packets, ctx);
+ });
+ });
void NetworkTraceHandler::OnSetup(const SetupArgs& args) {
const std::string& raw = args.config->network_packet_trace_config_raw();
@@ -71,44 +132,130 @@
ALOGI("poll_ms is missing or below the 100ms minimum. Increasing to 100ms");
mPollMs = 100;
}
+
+ mInternLimit = config.intern_limit();
+ mAggregationThreshold = config.aggregation_threshold();
+ mDropLocalPort = config.drop_local_port();
+ mDropRemotePort = config.drop_remote_port();
+ mDropTcpFlags = config.drop_tcp_flags();
}
void NetworkTraceHandler::OnStart(const StartArgs&) {
+ if (mIsTest) return; // Don't touch non-hermetic bpf in test.
mStarted = sPoller.Start(mPollMs);
}
void NetworkTraceHandler::OnStop(const StopArgs&) {
+ if (mIsTest) return; // Don't touch non-hermetic bpf in test.
if (mStarted) sPoller.Stop();
mStarted = false;
+
+ // Although this shouldn't be required, there seems to be some cases when we
+ // don't fill enough of a Perfetto Chunk for Perfetto to automatically commit
+ // the traced data. This manually flushes OnStop so we commit at least once.
+ NetworkTraceHandler::Trace([&](NetworkTraceHandler::TraceContext ctx) {
+ perfetto::LockedHandle<NetworkTraceHandler> handle =
+ ctx.GetDataSourceLocked();
+ // Trace is called for all active handlers, only flush our context. Since
+ // handle doesn't have a `.get()`, use `*` and `&` to get what it points to.
+ if (&(*handle) != this) return;
+ ctx.Flush();
+ });
}
-void NetworkTracePoller::SchedulePolling() {
- // Schedules another run of ourselves to recursively poll periodically.
- mTaskRunner->PostDelayedTask(
- [this]() {
- mMutex.lock();
- SchedulePolling();
- ConsumeAllLocked();
- mMutex.unlock();
- },
- mPollMs);
+void NetworkTraceHandler::Write(const std::vector<PacketTrace>& packets,
+ NetworkTraceHandler::TraceContext& ctx) {
+ // TODO: remove this fallback once Perfetto stable has support for bundles.
+ if (!mInternLimit && !mAggregationThreshold) {
+ for (const PacketTrace& pkt : packets) {
+ auto dst = ctx.NewTracePacket();
+ dst->set_timestamp(pkt.timestampNs);
+ auto* event = dst->set_network_packet();
+ event->set_length(pkt.length);
+ Fill(pkt, event);
+ }
+ return;
+ }
+
+ uint64_t minTs = std::numeric_limits<uint64_t>::max();
+ std::unordered_map<BundleKey, BundleDetails, BundleHash, BundleEq> bundles;
+ for (const PacketTrace& pkt : packets) {
+ BundleKey key = pkt;
+
+ // Dropping fields should remove them from the output and remove them from
+ // the aggregation key. In order to do the latter without changing the hash
+ // function, set the dropped fields to zero.
+ if (mDropTcpFlags) key.tcpFlags = 0;
+ if (mDropLocalPort) (key.egress ? key.sport : key.dport) = 0;
+ if (mDropRemotePort) (key.egress ? key.dport : key.sport) = 0;
+
+ minTs = std::min(minTs, pkt.timestampNs);
+
+ BundleDetails& bundle = bundles[key];
+ bundle.time_and_len.emplace_back(pkt.timestampNs, pkt.length);
+ bundle.minTs = std::min(bundle.minTs, pkt.timestampNs);
+ bundle.maxTs = std::max(bundle.maxTs, pkt.timestampNs);
+ bundle.bytes += pkt.length;
+ }
+
+ NetworkTraceState* incr_state = ctx.GetIncrementalState();
+ for (const auto& kv : bundles) {
+ const BundleKey& key = kv.first;
+ const BundleDetails& details = kv.second;
+
+ auto dst = ctx.NewTracePacket();
+ dst->set_timestamp(details.minTs);
+
+ // Incremental state is only used when interning. Set the flag based on
+ // whether state was cleared. Leave the flag empty in non-intern configs.
+ if (mInternLimit > 0) {
+ if (incr_state->cleared) {
+ dst->set_sequence_flags(TracePacket::SEQ_INCREMENTAL_STATE_CLEARED);
+ incr_state->cleared = false;
+ } else {
+ dst->set_sequence_flags(TracePacket::SEQ_NEEDS_INCREMENTAL_STATE);
+ }
+ }
+
+ auto* event = FillWithInterning(incr_state, key, dst.get());
+
+ int count = details.time_and_len.size();
+ if (!mAggregationThreshold || count < mAggregationThreshold) {
+ protozero::PackedVarInt offsets;
+ protozero::PackedVarInt lengths;
+ for (const auto& kv : details.time_and_len) {
+ offsets.Append(kv.first - details.minTs);
+ lengths.Append(kv.second);
+ }
+
+ event->set_packet_timestamps(offsets);
+ event->set_packet_lengths(lengths);
+ } else {
+ event->set_total_duration(details.maxTs - details.minTs);
+ event->set_total_length(details.bytes);
+ event->set_total_packets(count);
+ }
+ }
}
-// static class method
-void NetworkTraceHandler::Fill(const PacketTrace& src, TracePacket& dst) {
- dst.set_timestamp(src.timestampNs);
- auto* event = dst.set_network_packet();
+void NetworkTraceHandler::Fill(const PacketTrace& src,
+ NetworkPacketEvent* event) {
event->set_direction(src.egress ? TrafficDirection::DIR_EGRESS
: TrafficDirection::DIR_INGRESS);
- event->set_length(src.length);
event->set_uid(src.uid);
event->set_tag(src.tag);
- event->set_local_port(src.egress ? ntohs(src.sport) : ntohs(src.dport));
- event->set_remote_port(src.egress ? ntohs(src.dport) : ntohs(src.sport));
+ if (!mDropLocalPort) {
+ event->set_local_port(ntohs(src.egress ? src.sport : src.dport));
+ }
+ if (!mDropRemotePort) {
+ event->set_remote_port(ntohs(src.egress ? src.dport : src.sport));
+ }
+ if (!mDropTcpFlags) {
+ event->set_tcp_flags(src.tcpFlags);
+ }
event->set_ip_proto(src.ipProto);
- event->set_tcp_flags(src.tcpFlags);
char ifname[IF_NAMESIZE] = {};
if (if_indextoname(src.ifindex, ifname) == ifname) {
@@ -118,90 +265,38 @@
}
}
-bool NetworkTracePoller::Start(uint32_t pollMs) {
- ALOGD("Starting datasource");
+NetworkPacketBundle* NetworkTraceHandler::FillWithInterning(
+ NetworkTraceState* state, const BundleKey& key, TracePacket* dst) {
+ uint64_t iid = 0;
+ bool found = false;
- std::scoped_lock<std::mutex> lock(mMutex);
- if (mSessionCount > 0) {
- if (mPollMs != pollMs) {
- // Nothing technical prevents mPollMs from changing, it's just unclear
- // what the right behavior is. Taking the min of active values could poll
- // too frequently giving some sessions too much data. Taking the max could
- // be too infrequent. For now, do nothing.
- ALOGI("poll_ms can't be changed while running, ignoring poll_ms=%d",
- pollMs);
+ if (state->iids.size() < mInternLimit) {
+ auto [iter, success] = state->iids.try_emplace(key, state->iids.size() + 1);
+ iid = iter->second;
+ found = true;
+
+ if (success) {
+ // If we successfully empaced, record the newly interned data.
+ auto* packet_context = dst->set_interned_data()->add_packet_context();
+ Fill(key, packet_context->set_ctx());
+ packet_context->set_iid(iid);
}
- mSessionCount++;
- return true;
+ } else {
+ auto iter = state->iids.find(key);
+ if (iter != state->iids.end()) {
+ iid = iter->second;
+ found = true;
+ }
}
- auto status = mConfigurationMap.init(PACKET_TRACE_ENABLED_MAP_PATH);
- if (!status.ok()) {
- ALOGW("Failed to bind config map: %s", status.error().message().c_str());
- return false;
+ auto* event = dst->set_network_packet_bundle();
+ if (found) {
+ event->set_iid(iid);
+ } else {
+ Fill(key, event->set_ctx());
}
- auto rb = BpfRingbuf<PacketTrace>::Create(PACKET_TRACE_RINGBUF_PATH);
- if (!rb.ok()) {
- ALOGW("Failed to create ringbuf: %s", rb.error().message().c_str());
- return false;
- }
-
- mRingBuffer = std::move(*rb);
-
- auto res = mConfigurationMap.writeValue(0, true, BPF_ANY);
- if (!res.ok()) {
- ALOGW("Failed to enable tracing: %s", res.error().message().c_str());
- return false;
- }
-
- // Start a task runner to run ConsumeAll every mPollMs milliseconds.
- mTaskRunner = perfetto::Platform::GetDefaultPlatform()->CreateTaskRunner({});
- mPollMs = pollMs;
- SchedulePolling();
-
- mSessionCount++;
- return true;
-}
-
-bool NetworkTracePoller::Stop() {
- ALOGD("Stopping datasource");
-
- std::scoped_lock<std::mutex> lock(mMutex);
- if (mSessionCount == 0) return false; // This should never happen
-
- // If this isn't the last session, don't clean up yet.
- if (--mSessionCount > 0) return true;
-
- auto res = mConfigurationMap.writeValue(0, false, BPF_ANY);
- if (!res.ok()) {
- ALOGW("Failed to disable tracing: %s", res.error().message().c_str());
- }
-
- mTaskRunner.reset();
- mRingBuffer.reset();
-
- return res.ok();
-}
-
-bool NetworkTracePoller::ConsumeAll() {
- std::scoped_lock<std::mutex> lock(mMutex);
- return ConsumeAllLocked();
-}
-
-bool NetworkTracePoller::ConsumeAllLocked() {
- if (mRingBuffer == nullptr) {
- ALOGW("Tracing is not active");
- return false;
- }
-
- base::Result<int> ret = mRingBuffer->ConsumeAll(mCallback);
- if (!ret.ok()) {
- ALOGW("Failed to poll ringbuf: %s", ret.error().message().c_str());
- return false;
- }
-
- return true;
+ return event;
}
} // namespace bpf
diff --git a/service-t/native/libs/libnetworkstats/NetworkTraceHandlerTest.cpp b/service-t/native/libs/libnetworkstats/NetworkTraceHandlerTest.cpp
index 543be21..f2c1a86 100644
--- a/service-t/native/libs/libnetworkstats/NetworkTraceHandlerTest.cpp
+++ b/service-t/native/libs/libnetworkstats/NetworkTraceHandlerTest.cpp
@@ -14,208 +14,381 @@
* limitations under the License.
*/
-#include <android-base/unique_fd.h>
-#include <android/multinetwork.h>
-#include <arpa/inet.h>
#include <gmock/gmock.h>
#include <gtest/gtest.h>
-#include <inttypes.h>
-#include <net/if.h>
-#include <netinet/tcp.h>
-#include <sys/socket.h>
-#include <sys/types.h>
-#include <unistd.h>
#include <vector>
#include "netdbpf/NetworkTraceHandler.h"
-
-using ::testing::AllOf;
-using ::testing::AnyOf;
-using ::testing::Each;
-using ::testing::Eq;
-using ::testing::Field;
-using ::testing::Test;
+#include "protos/perfetto/config/android/network_trace_config.gen.h"
+#include "protos/perfetto/trace/android/network_trace.pb.h"
+#include "protos/perfetto/trace/trace.pb.h"
+#include "protos/perfetto/trace/trace_packet.pb.h"
namespace android {
namespace bpf {
-// Use uint32 max to cause the handler to never Loop. Instead, the tests will
-// manually drive things by calling ConsumeAll explicitly.
-constexpr uint32_t kNeverPoll = std::numeric_limits<uint32_t>::max();
+using ::perfetto::protos::NetworkPacketEvent;
+using ::perfetto::protos::NetworkPacketTraceConfig;
+using ::perfetto::protos::Trace;
+using ::perfetto::protos::TracePacket;
+using ::perfetto::protos::TrafficDirection;
-__be16 bindAndListen(int s) {
- sockaddr_in sin = {.sin_family = AF_INET};
- socklen_t len = sizeof(sin);
- if (bind(s, (sockaddr*)&sin, sizeof(sin))) return 0;
- if (listen(s, 1)) return 0;
- if (getsockname(s, (sockaddr*)&sin, &len)) return 0;
- return sin.sin_port;
-}
+class NetworkTraceHandlerTest : public testing::Test {
+ protected:
+ // Starts a tracing session with the handler under test.
+ std::unique_ptr<perfetto::TracingSession> StartTracing(
+ NetworkPacketTraceConfig settings) {
+ perfetto::TracingInitArgs args;
+ args.backends = perfetto::kInProcessBackend;
+ perfetto::Tracing::Initialize(args);
-// This takes tcp flag constants from the standard library and makes them usable
-// with the flags we get from BPF. The standard library flags are big endian
-// whereas the BPF flags are reported in host byte order. BPF also trims the
-// flags down to the 8 single-bit flag bits (fin, syn, rst, etc).
-constexpr inline uint8_t FlagToHost(__be32 be_unix_flags) {
- return ntohl(be_unix_flags) >> 16;
-}
+ perfetto::DataSourceDescriptor dsd;
+ dsd.set_name("test.network_packets");
+ NetworkTraceHandler::Register(dsd, /*isTest=*/true);
-// Pretty prints all fields for a list of packets (useful for debugging).
-struct PacketPrinter {
- const std::vector<PacketTrace>& data;
- static constexpr char kTcpFlagNames[] = "FSRPAUEC";
+ perfetto::TraceConfig cfg;
+ cfg.add_buffers()->set_size_kb(1024);
+ auto* config = cfg.add_data_sources()->mutable_config();
+ config->set_name("test.network_packets");
+ config->set_network_packet_trace_config_raw(settings.SerializeAsString());
- friend std::ostream& operator<<(std::ostream& os, const PacketPrinter& d) {
- os << "Packet count: " << d.data.size();
- for (const PacketTrace& info : d.data) {
- os << "\nifidx=" << info.ifindex;
- os << ", len=" << info.length;
- os << ", uid=" << info.uid;
- os << ", tag=" << info.tag;
- os << ", sport=" << info.sport;
- os << ", dport=" << info.dport;
- os << ", direction=" << (info.egress ? "egress" : "ingress");
- os << ", proto=" << static_cast<int>(info.ipProto);
- os << ", ip=" << static_cast<int>(info.ipVersion);
- os << ", flags=";
- for (int i = 0; i < 8; i++) {
- os << ((info.tcpFlags & (1 << i)) ? kTcpFlagNames[i] : '.');
+ auto session = perfetto::Tracing::NewTrace(perfetto::kInProcessBackend);
+ session->Setup(cfg);
+ session->StartBlocking();
+ return session;
+ }
+
+ // Stops the trace session and reports all relevant trace packets.
+ bool StopTracing(perfetto::TracingSession* session,
+ std::vector<TracePacket>* output) {
+ session->StopBlocking();
+
+ Trace trace;
+ std::vector<char> raw_trace = session->ReadTraceBlocking();
+ if (!trace.ParseFromArray(raw_trace.data(), raw_trace.size())) {
+ ADD_FAILURE() << "trace.ParseFromArray failed";
+ return false;
+ }
+
+ // This is a real trace and includes irrelevant trace packets such as trace
+ // metadata. The following strips the results to just the packets we want.
+ for (const auto& pkt : trace.packet()) {
+ if (pkt.has_network_packet() || pkt.has_network_packet_bundle()) {
+ output->emplace_back(pkt);
}
}
- return os;
+
+ return true;
+ }
+
+ // This runs a trace with a single call to Write.
+ bool TraceAndSortPackets(const std::vector<PacketTrace>& input,
+ std::vector<TracePacket>* output,
+ NetworkPacketTraceConfig config = {}) {
+ auto session = StartTracing(config);
+ NetworkTraceHandler::Trace([&](NetworkTraceHandler::TraceContext ctx) {
+ ctx.GetDataSourceLocked()->Write(input, ctx);
+ ctx.Flush();
+ });
+
+ if (!StopTracing(session.get(), output)) {
+ return false;
+ }
+
+ // Sort to provide deterministic ordering regardless of Perfetto internals
+ // or implementation-defined (e.g. hash map) reshuffling.
+ std::sort(output->begin(), output->end(),
+ [](const TracePacket& a, const TracePacket& b) {
+ return a.timestamp() < b.timestamp();
+ });
+
+ return true;
}
};
-class NetworkTracePollerTest : public testing::Test {
- protected:
- void SetUp() {
- if (access(PACKET_TRACE_RINGBUF_PATH, R_OK)) {
- GTEST_SKIP() << "Network tracing is not enabled/loaded on this build.";
- }
- if (sizeof(void*) != 8) {
- GTEST_SKIP() << "Network tracing requires 64-bit build.";
- }
- }
-};
+TEST_F(NetworkTraceHandlerTest, WriteBasicFields) {
+ std::vector<PacketTrace> input = {
+ PacketTrace{
+ .timestampNs = 1000,
+ .length = 100,
+ .uid = 10,
+ .tag = 123,
+ .ipProto = 6,
+ .tcpFlags = 1,
+ },
+ };
-TEST_F(NetworkTracePollerTest, PollWhileInactive) {
- NetworkTracePoller handler([&](const PacketTrace& pkt) {});
+ std::vector<TracePacket> events;
+ ASSERT_TRUE(TraceAndSortPackets(input, &events));
- // One succeed after start and before stop.
- EXPECT_FALSE(handler.ConsumeAll());
- ASSERT_TRUE(handler.Start(kNeverPoll));
- EXPECT_TRUE(handler.ConsumeAll());
- ASSERT_TRUE(handler.Stop());
- EXPECT_FALSE(handler.ConsumeAll());
+ ASSERT_EQ(events.size(), 1);
+ EXPECT_THAT(events[0].timestamp(), 1000);
+ EXPECT_THAT(events[0].network_packet().uid(), 10);
+ EXPECT_THAT(events[0].network_packet().tag(), 123);
+ EXPECT_THAT(events[0].network_packet().ip_proto(), 6);
+ EXPECT_THAT(events[0].network_packet().tcp_flags(), 1);
+ EXPECT_THAT(events[0].network_packet().length(), 100);
+ EXPECT_THAT(events[0].has_sequence_flags(), false);
}
-TEST_F(NetworkTracePollerTest, ConcurrentSessions) {
- // Simulate two concurrent sessions (two starts followed by two stops). Check
- // that tracing is stopped only after both sessions finish.
- NetworkTracePoller handler([&](const PacketTrace& pkt) {});
+TEST_F(NetworkTraceHandlerTest, WriteDirectionAndPorts) {
+ std::vector<PacketTrace> input = {
+ PacketTrace{
+ .timestampNs = 1,
+ .sport = htons(8080),
+ .dport = htons(443),
+ .egress = true,
+ },
+ PacketTrace{
+ .timestampNs = 2,
+ .sport = htons(443),
+ .dport = htons(8080),
+ .egress = false,
+ },
+ };
- ASSERT_TRUE(handler.Start(kNeverPoll));
- EXPECT_TRUE(handler.ConsumeAll());
+ std::vector<TracePacket> events;
+ ASSERT_TRUE(TraceAndSortPackets(input, &events));
- ASSERT_TRUE(handler.Start(kNeverPoll));
- EXPECT_TRUE(handler.ConsumeAll());
-
- ASSERT_TRUE(handler.Stop());
- EXPECT_TRUE(handler.ConsumeAll());
-
- ASSERT_TRUE(handler.Stop());
- EXPECT_FALSE(handler.ConsumeAll());
+ ASSERT_EQ(events.size(), 2);
+ EXPECT_THAT(events[0].network_packet().local_port(), 8080);
+ EXPECT_THAT(events[0].network_packet().remote_port(), 443);
+ EXPECT_THAT(events[0].network_packet().direction(),
+ TrafficDirection::DIR_EGRESS);
+ EXPECT_THAT(events[1].network_packet().local_port(), 8080);
+ EXPECT_THAT(events[1].network_packet().remote_port(), 443);
+ EXPECT_THAT(events[1].network_packet().direction(),
+ TrafficDirection::DIR_INGRESS);
}
-TEST_F(NetworkTracePollerTest, TraceTcpSession) {
- __be16 server_port = 0;
- std::vector<PacketTrace> packets;
+TEST_F(NetworkTraceHandlerTest, BasicBundling) {
+ // TODO: remove this once bundling becomes default. Until then, set arbitrary
+ // aggregation threshold to enable bundling.
+ NetworkPacketTraceConfig config;
+ config.set_aggregation_threshold(10);
- // Record all packets with the bound address and current uid. This callback is
- // involked only within ConsumeAll, at which point the port should have
- // already been filled in and all packets have been processed.
- NetworkTracePoller handler([&](const PacketTrace& pkt) {
- if (pkt.sport != server_port && pkt.dport != server_port) return;
- if (pkt.uid != getuid()) return;
- packets.push_back(pkt);
+ std::vector<PacketTrace> input = {
+ PacketTrace{.uid = 123, .timestampNs = 2, .length = 200},
+ PacketTrace{.uid = 123, .timestampNs = 1, .length = 100},
+ PacketTrace{.uid = 123, .timestampNs = 4, .length = 300},
+
+ PacketTrace{.uid = 456, .timestampNs = 2, .length = 400},
+ PacketTrace{.uid = 456, .timestampNs = 4, .length = 100},
+ };
+
+ std::vector<TracePacket> events;
+ ASSERT_TRUE(TraceAndSortPackets(input, &events, config));
+
+ ASSERT_EQ(events.size(), 2);
+
+ EXPECT_THAT(events[0].timestamp(), 1);
+ EXPECT_THAT(events[0].network_packet_bundle().ctx().uid(), 123);
+ EXPECT_THAT(events[0].network_packet_bundle().packet_lengths(),
+ testing::ElementsAre(200, 100, 300));
+ EXPECT_THAT(events[0].network_packet_bundle().packet_timestamps(),
+ testing::ElementsAre(1, 0, 3));
+
+ EXPECT_THAT(events[1].timestamp(), 2);
+ EXPECT_THAT(events[1].network_packet_bundle().ctx().uid(), 456);
+ EXPECT_THAT(events[1].network_packet_bundle().packet_lengths(),
+ testing::ElementsAre(400, 100));
+ EXPECT_THAT(events[1].network_packet_bundle().packet_timestamps(),
+ testing::ElementsAre(0, 2));
+}
+
+TEST_F(NetworkTraceHandlerTest, AggregationThreshold) {
+ // With an aggregation threshold of 3, the set of packets with uid=123 will
+ // be aggregated (3>=3) whereas packets with uid=456 get per-packet info.
+ NetworkPacketTraceConfig config;
+ config.set_aggregation_threshold(3);
+
+ std::vector<PacketTrace> input = {
+ PacketTrace{.uid = 123, .timestampNs = 2, .length = 200},
+ PacketTrace{.uid = 123, .timestampNs = 1, .length = 100},
+ PacketTrace{.uid = 123, .timestampNs = 4, .length = 300},
+
+ PacketTrace{.uid = 456, .timestampNs = 2, .length = 400},
+ PacketTrace{.uid = 456, .timestampNs = 4, .length = 100},
+ };
+
+ std::vector<TracePacket> events;
+ ASSERT_TRUE(TraceAndSortPackets(input, &events, config));
+
+ ASSERT_EQ(events.size(), 2);
+
+ EXPECT_EQ(events[0].timestamp(), 1);
+ EXPECT_EQ(events[0].network_packet_bundle().ctx().uid(), 123);
+ EXPECT_EQ(events[0].network_packet_bundle().total_duration(), 3);
+ EXPECT_EQ(events[0].network_packet_bundle().total_packets(), 3);
+ EXPECT_EQ(events[0].network_packet_bundle().total_length(), 600);
+
+ EXPECT_EQ(events[1].timestamp(), 2);
+ EXPECT_EQ(events[1].network_packet_bundle().ctx().uid(), 456);
+ EXPECT_THAT(events[1].network_packet_bundle().packet_lengths(),
+ testing::ElementsAre(400, 100));
+ EXPECT_THAT(events[1].network_packet_bundle().packet_timestamps(),
+ testing::ElementsAre(0, 2));
+}
+
+TEST_F(NetworkTraceHandlerTest, DropLocalPort) {
+ NetworkPacketTraceConfig config;
+ config.set_drop_local_port(true);
+ config.set_aggregation_threshold(10);
+
+ __be16 a = htons(10000);
+ __be16 b = htons(10001);
+ std::vector<PacketTrace> input = {
+ // Recall that local is `src` for egress and `dst` for ingress.
+ PacketTrace{.timestampNs = 1, .length = 2, .egress = true, .sport = a},
+ PacketTrace{.timestampNs = 2, .length = 4, .egress = false, .dport = a},
+ PacketTrace{.timestampNs = 3, .length = 6, .egress = true, .sport = b},
+ PacketTrace{.timestampNs = 4, .length = 8, .egress = false, .dport = b},
+ };
+
+ std::vector<TracePacket> events;
+ ASSERT_TRUE(TraceAndSortPackets(input, &events, config));
+ ASSERT_EQ(events.size(), 2);
+
+ // Despite having different local ports, drop and bundle by remaining fields.
+ EXPECT_EQ(events[0].network_packet_bundle().ctx().direction(),
+ TrafficDirection::DIR_EGRESS);
+ EXPECT_THAT(events[0].network_packet_bundle().packet_lengths(),
+ testing::ElementsAre(2, 6));
+
+ EXPECT_EQ(events[1].network_packet_bundle().ctx().direction(),
+ TrafficDirection::DIR_INGRESS);
+ EXPECT_THAT(events[1].network_packet_bundle().packet_lengths(),
+ testing::ElementsAre(4, 8));
+
+ // Local port shouldn't be in output.
+ EXPECT_FALSE(events[0].network_packet_bundle().ctx().has_local_port());
+ EXPECT_FALSE(events[1].network_packet_bundle().ctx().has_local_port());
+}
+
+TEST_F(NetworkTraceHandlerTest, DropRemotePort) {
+ NetworkPacketTraceConfig config;
+ config.set_drop_remote_port(true);
+ config.set_aggregation_threshold(10);
+
+ __be16 a = htons(443);
+ __be16 b = htons(80);
+ std::vector<PacketTrace> input = {
+ // Recall that remote is `dst` for egress and `src` for ingress.
+ PacketTrace{.timestampNs = 1, .length = 2, .egress = true, .dport = a},
+ PacketTrace{.timestampNs = 2, .length = 4, .egress = false, .sport = a},
+ PacketTrace{.timestampNs = 3, .length = 6, .egress = true, .dport = b},
+ PacketTrace{.timestampNs = 4, .length = 8, .egress = false, .sport = b},
+ };
+
+ std::vector<TracePacket> events;
+ ASSERT_TRUE(TraceAndSortPackets(input, &events, config));
+ ASSERT_EQ(events.size(), 2);
+
+ // Despite having different remote ports, drop and bundle by remaining fields.
+ EXPECT_EQ(events[0].network_packet_bundle().ctx().direction(),
+ TrafficDirection::DIR_EGRESS);
+ EXPECT_THAT(events[0].network_packet_bundle().packet_lengths(),
+ testing::ElementsAre(2, 6));
+
+ EXPECT_EQ(events[1].network_packet_bundle().ctx().direction(),
+ TrafficDirection::DIR_INGRESS);
+ EXPECT_THAT(events[1].network_packet_bundle().packet_lengths(),
+ testing::ElementsAre(4, 8));
+
+ // Remote port shouldn't be in output.
+ EXPECT_FALSE(events[0].network_packet_bundle().ctx().has_remote_port());
+ EXPECT_FALSE(events[1].network_packet_bundle().ctx().has_remote_port());
+}
+
+TEST_F(NetworkTraceHandlerTest, DropTcpFlags) {
+ NetworkPacketTraceConfig config;
+ config.set_drop_tcp_flags(true);
+ config.set_aggregation_threshold(10);
+
+ std::vector<PacketTrace> input = {
+ PacketTrace{.timestampNs = 1, .uid = 123, .length = 1, .tcpFlags = 1},
+ PacketTrace{.timestampNs = 2, .uid = 123, .length = 2, .tcpFlags = 2},
+ PacketTrace{.timestampNs = 3, .uid = 456, .length = 3, .tcpFlags = 1},
+ PacketTrace{.timestampNs = 4, .uid = 456, .length = 4, .tcpFlags = 2},
+ };
+
+ std::vector<TracePacket> events;
+ ASSERT_TRUE(TraceAndSortPackets(input, &events, config));
+
+ ASSERT_EQ(events.size(), 2);
+
+ // Despite having different tcp flags, drop and bundle by remaining fields.
+ EXPECT_EQ(events[0].network_packet_bundle().ctx().uid(), 123);
+ EXPECT_THAT(events[0].network_packet_bundle().packet_lengths(),
+ testing::ElementsAre(1, 2));
+
+ EXPECT_EQ(events[1].network_packet_bundle().ctx().uid(), 456);
+ EXPECT_THAT(events[1].network_packet_bundle().packet_lengths(),
+ testing::ElementsAre(3, 4));
+
+ // Tcp flags shouldn't be in output.
+ EXPECT_FALSE(events[0].network_packet_bundle().ctx().has_tcp_flags());
+ EXPECT_FALSE(events[1].network_packet_bundle().ctx().has_tcp_flags());
+}
+
+TEST_F(NetworkTraceHandlerTest, Interning) {
+ NetworkPacketTraceConfig config;
+ config.set_intern_limit(2);
+
+ // The test writes 4 packets coming from three sources (uids). With an intern
+ // limit of 2, the first two sources should be interned. This test splits this
+ // into individual writes since internally an unordered map is used and would
+ // otherwise non-deterministically choose what to intern (this is fine for
+ // real use, but not good for test assertions).
+ std::vector<std::vector<PacketTrace>> inputs = {
+ {PacketTrace{.timestampNs = 1, .uid = 123}},
+ {PacketTrace{.timestampNs = 2, .uid = 456}},
+ {PacketTrace{.timestampNs = 3, .uid = 789}},
+ {PacketTrace{.timestampNs = 4, .uid = 123}},
+ };
+
+ auto session = StartTracing(config);
+
+ NetworkTraceHandler::Trace([&](NetworkTraceHandler::TraceContext ctx) {
+ ctx.GetDataSourceLocked()->Write(inputs[0], ctx);
+ ctx.GetDataSourceLocked()->Write(inputs[1], ctx);
+ ctx.GetDataSourceLocked()->Write(inputs[2], ctx);
+ ctx.GetDataSourceLocked()->Write(inputs[3], ctx);
+ ctx.Flush();
});
- ASSERT_TRUE(handler.Start(kNeverPoll));
- const uint32_t kClientTag = 2468;
- const uint32_t kServerTag = 1357;
+ std::vector<TracePacket> events;
+ ASSERT_TRUE(StopTracing(session.get(), &events));
- // Go through a typical connection sequence between two v4 sockets using tcp.
- // This covers connection handshake, shutdown, and one data packet.
- {
- android::base::unique_fd clientsocket(socket(AF_INET, SOCK_STREAM, 0));
- ASSERT_NE(-1, clientsocket) << "Failed to open client socket";
- ASSERT_EQ(android_tag_socket(clientsocket, kClientTag), 0);
+ ASSERT_EQ(events.size(), 4);
- android::base::unique_fd serversocket(socket(AF_INET, SOCK_STREAM, 0));
- ASSERT_NE(-1, serversocket) << "Failed to open server socket";
- ASSERT_EQ(android_tag_socket(serversocket, kServerTag), 0);
+ // First time seen, emit new interned data, bundle uses iid instead of ctx.
+ EXPECT_EQ(events[0].network_packet_bundle().iid(), 1);
+ ASSERT_EQ(events[0].interned_data().packet_context().size(), 1);
+ EXPECT_EQ(events[0].interned_data().packet_context(0).iid(), 1);
+ EXPECT_EQ(events[0].interned_data().packet_context(0).ctx().uid(), 123);
+ EXPECT_EQ(events[0].sequence_flags(),
+ TracePacket::SEQ_INCREMENTAL_STATE_CLEARED);
- server_port = bindAndListen(serversocket);
- ASSERT_NE(0, server_port) << "Can't bind to server port";
+ // First time seen, emit new interned data, bundle uses iid instead of ctx.
+ EXPECT_EQ(events[1].network_packet_bundle().iid(), 2);
+ ASSERT_EQ(events[1].interned_data().packet_context().size(), 1);
+ EXPECT_EQ(events[1].interned_data().packet_context(0).iid(), 2);
+ EXPECT_EQ(events[1].interned_data().packet_context(0).ctx().uid(), 456);
+ EXPECT_EQ(events[1].sequence_flags(),
+ TracePacket::SEQ_NEEDS_INCREMENTAL_STATE);
- sockaddr_in addr = {.sin_family = AF_INET, .sin_port = server_port};
- ASSERT_EQ(0, connect(clientsocket, (sockaddr*)&addr, sizeof(addr)))
- << "connect to loopback failed: " << strerror(errno);
+ // Not enough room in intern table (limit 2), inline the context.
+ EXPECT_EQ(events[2].network_packet_bundle().ctx().uid(), 789);
+ EXPECT_EQ(events[2].interned_data().packet_context().size(), 0);
+ EXPECT_EQ(events[2].sequence_flags(),
+ TracePacket::SEQ_NEEDS_INCREMENTAL_STATE);
- int accepted = accept(serversocket, nullptr, nullptr);
- ASSERT_NE(-1, accepted) << "accept connection failed: " << strerror(errno);
-
- const char data[] = "abcdefghijklmnopqrstuvwxyz";
- EXPECT_EQ(send(clientsocket, data, sizeof(data), 0), sizeof(data))
- << "failed to send message: " << strerror(errno);
-
- char buff[100] = {};
- EXPECT_EQ(recv(accepted, buff, sizeof(buff), 0), sizeof(data))
- << "failed to receive message: " << strerror(errno);
-
- EXPECT_EQ(std::string(data), std::string(buff));
- }
-
- ASSERT_TRUE(handler.ConsumeAll());
- ASSERT_TRUE(handler.Stop());
-
- // There are 12 packets in total (6 messages: each seen by client & server):
- // 1. Client connects to server with syn
- // 2. Server responds with syn ack
- // 3. Client responds with ack
- // 4. Client sends data with psh ack
- // 5. Server acks the data packet
- // 6. Client closes connection with fin ack
- ASSERT_EQ(packets.size(), 12) << PacketPrinter{packets};
-
- // All packets should be TCP packets.
- EXPECT_THAT(packets, Each(Field(&PacketTrace::ipProto, Eq(IPPROTO_TCP))));
-
- // Packet 1: client requests connection with server.
- EXPECT_EQ(packets[0].egress, 1) << PacketPrinter{packets};
- EXPECT_EQ(packets[0].dport, server_port) << PacketPrinter{packets};
- EXPECT_EQ(packets[0].tag, kClientTag) << PacketPrinter{packets};
- EXPECT_EQ(packets[0].tcpFlags, FlagToHost(TCP_FLAG_SYN))
- << PacketPrinter{packets};
-
- // Packet 2: server receives request from client.
- EXPECT_EQ(packets[1].egress, 0) << PacketPrinter{packets};
- EXPECT_EQ(packets[1].dport, server_port) << PacketPrinter{packets};
- EXPECT_EQ(packets[1].tag, kServerTag) << PacketPrinter{packets};
- EXPECT_EQ(packets[1].tcpFlags, FlagToHost(TCP_FLAG_SYN))
- << PacketPrinter{packets};
-
- // Packet 3: server replies back with syn ack.
- EXPECT_EQ(packets[2].egress, 1) << PacketPrinter{packets};
- EXPECT_EQ(packets[2].sport, server_port) << PacketPrinter{packets};
- EXPECT_EQ(packets[2].tcpFlags, FlagToHost(TCP_FLAG_SYN | TCP_FLAG_ACK))
- << PacketPrinter{packets};
-
- // Packet 4: client receives the server's syn ack.
- EXPECT_EQ(packets[3].egress, 0) << PacketPrinter{packets};
- EXPECT_EQ(packets[3].sport, server_port) << PacketPrinter{packets};
- EXPECT_EQ(packets[3].tcpFlags, FlagToHost(TCP_FLAG_SYN | TCP_FLAG_ACK))
- << PacketPrinter{packets};
+ // Second time seen, no need to re-emit interned data, only record iid.
+ EXPECT_EQ(events[3].network_packet_bundle().iid(), 1);
+ EXPECT_EQ(events[3].interned_data().packet_context().size(), 0);
+ EXPECT_EQ(events[3].sequence_flags(),
+ TracePacket::SEQ_NEEDS_INCREMENTAL_STATE);
}
} // namespace bpf
diff --git a/service-t/native/libs/libnetworkstats/NetworkTracePoller.cpp b/service-t/native/libs/libnetworkstats/NetworkTracePoller.cpp
new file mode 100644
index 0000000..80c315a
--- /dev/null
+++ b/service-t/native/libs/libnetworkstats/NetworkTracePoller.cpp
@@ -0,0 +1,147 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "NetworkTrace"
+#define ATRACE_TAG ATRACE_TAG_NETWORK
+
+#include "netdbpf/NetworkTracePoller.h"
+
+#include <bpf/BpfUtils.h>
+#include <cutils/trace.h>
+#include <log/log.h>
+#include <perfetto/tracing/platform.h>
+#include <perfetto/tracing/tracing.h>
+
+namespace android {
+namespace bpf {
+namespace internal {
+
+void NetworkTracePoller::PollAndSchedule(perfetto::base::TaskRunner* runner,
+ uint32_t poll_ms) {
+ // Always schedule another run of ourselves to recursively poll periodically.
+ // The task runner is sequential so these can't run on top of each other.
+ runner->PostDelayedTask([=]() { PollAndSchedule(runner, poll_ms); }, poll_ms);
+
+ if (mMutex.try_lock()) {
+ ConsumeAllLocked();
+ mMutex.unlock();
+ }
+}
+
+bool NetworkTracePoller::Start(uint32_t pollMs) {
+ ALOGD("Starting datasource");
+
+ std::scoped_lock<std::mutex> lock(mMutex);
+ if (mSessionCount > 0) {
+ if (mPollMs != pollMs) {
+ // Nothing technical prevents mPollMs from changing, it's just unclear
+ // what the right behavior is. Taking the min of active values could poll
+ // too frequently giving some sessions too much data. Taking the max could
+ // be too infrequent. For now, do nothing.
+ ALOGI("poll_ms can't be changed while running, ignoring poll_ms=%d",
+ pollMs);
+ }
+ mSessionCount++;
+ return true;
+ }
+
+ auto status = mConfigurationMap.init(PACKET_TRACE_ENABLED_MAP_PATH);
+ if (!status.ok()) {
+ ALOGW("Failed to bind config map: %s", status.error().message().c_str());
+ return false;
+ }
+
+ auto rb = BpfRingbuf<PacketTrace>::Create(PACKET_TRACE_RINGBUF_PATH);
+ if (!rb.ok()) {
+ ALOGW("Failed to create ringbuf: %s", rb.error().message().c_str());
+ return false;
+ }
+
+ mRingBuffer = std::move(*rb);
+
+ auto res = mConfigurationMap.writeValue(0, true, BPF_ANY);
+ if (!res.ok()) {
+ ALOGW("Failed to enable tracing: %s", res.error().message().c_str());
+ return false;
+ }
+
+ // Start a task runner to run ConsumeAll every mPollMs milliseconds.
+ mTaskRunner = perfetto::Platform::GetDefaultPlatform()->CreateTaskRunner({});
+ mPollMs = pollMs;
+ PollAndSchedule(mTaskRunner.get(), mPollMs);
+
+ mSessionCount++;
+ return true;
+}
+
+bool NetworkTracePoller::Stop() {
+ ALOGD("Stopping datasource");
+
+ std::scoped_lock<std::mutex> lock(mMutex);
+ if (mSessionCount == 0) return false; // This should never happen
+
+ // If this isn't the last session, don't clean up yet.
+ if (--mSessionCount > 0) return true;
+
+ auto res = mConfigurationMap.writeValue(0, false, BPF_ANY);
+ if (!res.ok()) {
+ ALOGW("Failed to disable tracing: %s", res.error().message().c_str());
+ }
+
+ // Make sure everything in the system has actually seen the 'false' we just
+ // wrote, things should now be well and truly disabled.
+ synchronizeKernelRCU();
+
+ // Drain remaining events from the ring buffer now that tracing is disabled.
+ // This prevents the next trace from seeing stale events and allows writing
+ // the last batch of events to Perfetto.
+ ConsumeAllLocked();
+
+ mTaskRunner.reset();
+ mRingBuffer.reset();
+
+ return res.ok();
+}
+
+bool NetworkTracePoller::ConsumeAll() {
+ std::scoped_lock<std::mutex> lock(mMutex);
+ return ConsumeAllLocked();
+}
+
+bool NetworkTracePoller::ConsumeAllLocked() {
+ if (mRingBuffer == nullptr) {
+ ALOGW("Tracing is not active");
+ return false;
+ }
+
+ std::vector<PacketTrace> packets;
+ base::Result<int> ret = mRingBuffer->ConsumeAll(
+ [&](const PacketTrace& pkt) { packets.push_back(pkt); });
+ if (!ret.ok()) {
+ ALOGW("Failed to poll ringbuf: %s", ret.error().message().c_str());
+ return false;
+ }
+
+ ATRACE_INT("NetworkTracePackets", packets.size());
+
+ mCallback(packets);
+
+ return true;
+}
+
+} // namespace internal
+} // namespace bpf
+} // namespace android
diff --git a/service-t/native/libs/libnetworkstats/NetworkTracePollerTest.cpp b/service-t/native/libs/libnetworkstats/NetworkTracePollerTest.cpp
new file mode 100644
index 0000000..df07bbe
--- /dev/null
+++ b/service-t/native/libs/libnetworkstats/NetworkTracePollerTest.cpp
@@ -0,0 +1,241 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <android-base/unique_fd.h>
+#include <android/multinetwork.h>
+#include <arpa/inet.h>
+#include <gmock/gmock.h>
+#include <gtest/gtest.h>
+#include <inttypes.h>
+#include <net/if.h>
+#include <netinet/tcp.h>
+#include <sys/socket.h>
+#include <sys/types.h>
+#include <unistd.h>
+
+#include <chrono>
+#include <thread>
+#include <vector>
+
+#include "netdbpf/NetworkTracePoller.h"
+
+using ::testing::AllOf;
+using ::testing::AnyOf;
+using ::testing::Each;
+using ::testing::Eq;
+using ::testing::Field;
+using ::testing::Test;
+
+namespace android {
+namespace bpf {
+namespace internal {
+// Use uint32 max to cause the handler to never Loop. Instead, the tests will
+// manually drive things by calling ConsumeAll explicitly.
+constexpr uint32_t kNeverPoll = std::numeric_limits<uint32_t>::max();
+
+__be16 bindAndListen(int s) {
+ sockaddr_in sin = {.sin_family = AF_INET};
+ socklen_t len = sizeof(sin);
+ if (bind(s, (sockaddr*)&sin, sizeof(sin))) return 0;
+ if (listen(s, 1)) return 0;
+ if (getsockname(s, (sockaddr*)&sin, &len)) return 0;
+ return sin.sin_port;
+}
+
+// This takes tcp flag constants from the standard library and makes them usable
+// with the flags we get from BPF. The standard library flags are big endian
+// whereas the BPF flags are reported in host byte order. BPF also trims the
+// flags down to the 8 single-bit flag bits (fin, syn, rst, etc).
+constexpr inline uint8_t FlagToHost(__be32 be_unix_flags) {
+ return ntohl(be_unix_flags) >> 16;
+}
+
+// Pretty prints all fields for a list of packets (useful for debugging).
+struct PacketPrinter {
+ const std::vector<PacketTrace>& data;
+ static constexpr char kTcpFlagNames[] = "FSRPAUEC";
+
+ friend std::ostream& operator<<(std::ostream& os, const PacketPrinter& d) {
+ os << "Packet count: " << d.data.size();
+ for (const PacketTrace& info : d.data) {
+ os << "\nifidx=" << info.ifindex;
+ os << ", len=" << info.length;
+ os << ", uid=" << info.uid;
+ os << ", tag=" << info.tag;
+ os << ", sport=" << info.sport;
+ os << ", dport=" << info.dport;
+ os << ", direction=" << (info.egress ? "egress" : "ingress");
+ os << ", proto=" << static_cast<int>(info.ipProto);
+ os << ", ip=" << static_cast<int>(info.ipVersion);
+ os << ", flags=";
+ for (int i = 0; i < 8; i++) {
+ os << ((info.tcpFlags & (1 << i)) ? kTcpFlagNames[i] : '.');
+ }
+ }
+ return os;
+ }
+};
+
+class NetworkTracePollerTest : public testing::Test {
+ protected:
+ void SetUp() {
+ if (access(PACKET_TRACE_RINGBUF_PATH, R_OK)) {
+ GTEST_SKIP() << "Network tracing is not enabled/loaded on this build.";
+ }
+ if (sizeof(void*) != 8) {
+ GTEST_SKIP() << "Network tracing requires 64-bit build.";
+ }
+ }
+};
+
+TEST_F(NetworkTracePollerTest, PollWhileInactive) {
+ NetworkTracePoller handler([&](const std::vector<PacketTrace>& pkt) {});
+
+ // One succeed after start and before stop.
+ EXPECT_FALSE(handler.ConsumeAll());
+ ASSERT_TRUE(handler.Start(kNeverPoll));
+ EXPECT_TRUE(handler.ConsumeAll());
+ ASSERT_TRUE(handler.Stop());
+ EXPECT_FALSE(handler.ConsumeAll());
+}
+
+TEST_F(NetworkTracePollerTest, ConcurrentSessions) {
+ // Simulate two concurrent sessions (two starts followed by two stops). Check
+ // that tracing is stopped only after both sessions finish.
+ NetworkTracePoller handler([&](const std::vector<PacketTrace>& pkt) {});
+
+ ASSERT_TRUE(handler.Start(kNeverPoll));
+ EXPECT_TRUE(handler.ConsumeAll());
+
+ ASSERT_TRUE(handler.Start(kNeverPoll));
+ EXPECT_TRUE(handler.ConsumeAll());
+
+ ASSERT_TRUE(handler.Stop());
+ EXPECT_TRUE(handler.ConsumeAll());
+
+ ASSERT_TRUE(handler.Stop());
+ EXPECT_FALSE(handler.ConsumeAll());
+}
+
+TEST_F(NetworkTracePollerTest, TraceTcpSession) {
+ __be16 server_port = 0;
+ std::vector<PacketTrace> packets, unmatched;
+
+ // Record all packets with the bound address and current uid. This callback is
+ // involked only within ConsumeAll, at which point the port should have
+ // already been filled in and all packets have been processed.
+ NetworkTracePoller handler([&](const std::vector<PacketTrace>& pkts) {
+ for (const PacketTrace& pkt : pkts) {
+ if ((pkt.sport == server_port || pkt.dport == server_port) &&
+ pkt.uid == getuid()) {
+ packets.push_back(pkt);
+ } else {
+ // There may be spurious packets not caused by the test. These are only
+ // captured so that we can report them to help debug certain errors.
+ unmatched.push_back(pkt);
+ }
+ }
+ });
+
+ ASSERT_TRUE(handler.Start(kNeverPoll));
+ const uint32_t kClientTag = 2468;
+ const uint32_t kServerTag = 1357;
+
+ // Go through a typical connection sequence between two v4 sockets using tcp.
+ // This covers connection handshake, shutdown, and one data packet.
+ {
+ android::base::unique_fd clientsocket(socket(AF_INET, SOCK_STREAM, 0));
+ ASSERT_NE(-1, clientsocket) << "Failed to open client socket";
+ ASSERT_EQ(android_tag_socket(clientsocket, kClientTag), 0);
+
+ android::base::unique_fd serversocket(socket(AF_INET, SOCK_STREAM, 0));
+ ASSERT_NE(-1, serversocket) << "Failed to open server socket";
+ ASSERT_EQ(android_tag_socket(serversocket, kServerTag), 0);
+
+ server_port = bindAndListen(serversocket);
+ ASSERT_NE(0, server_port) << "Can't bind to server port";
+
+ sockaddr_in addr = {.sin_family = AF_INET, .sin_port = server_port};
+ ASSERT_EQ(0, connect(clientsocket, (sockaddr*)&addr, sizeof(addr)))
+ << "connect to loopback failed: " << strerror(errno);
+
+ int accepted = accept(serversocket, nullptr, nullptr);
+ ASSERT_NE(-1, accepted) << "accept connection failed: " << strerror(errno);
+
+ const char data[] = "abcdefghijklmnopqrstuvwxyz";
+ EXPECT_EQ(send(clientsocket, data, sizeof(data), 0), sizeof(data))
+ << "failed to send message: " << strerror(errno);
+
+ char buff[100] = {};
+ EXPECT_EQ(recv(accepted, buff, sizeof(buff), 0), sizeof(data))
+ << "failed to receive message: " << strerror(errno);
+
+ EXPECT_EQ(std::string(data), std::string(buff));
+ }
+
+ // Poll until we get all the packets (typically we get it first try).
+ for (int attempt = 0; attempt < 10; attempt++) {
+ ASSERT_TRUE(handler.ConsumeAll());
+ if (packets.size() >= 12) break;
+ std::this_thread::sleep_for(std::chrono::milliseconds(5));
+ }
+
+ ASSERT_TRUE(handler.Stop());
+
+ // There are 12 packets in total (6 messages: each seen by client & server):
+ // 1. Client connects to server with syn
+ // 2. Server responds with syn ack
+ // 3. Client responds with ack
+ // 4. Client sends data with psh ack
+ // 5. Server acks the data packet
+ // 6. Client closes connection with fin ack
+ ASSERT_EQ(packets.size(), 12)
+ << PacketPrinter{packets}
+ << "\nUnmatched packets: " << PacketPrinter{unmatched};
+
+ // All packets should be TCP packets.
+ EXPECT_THAT(packets, Each(Field(&PacketTrace::ipProto, Eq(IPPROTO_TCP))));
+
+ // Packet 1: client requests connection with server.
+ EXPECT_EQ(packets[0].egress, 1) << PacketPrinter{packets};
+ EXPECT_EQ(packets[0].dport, server_port) << PacketPrinter{packets};
+ EXPECT_EQ(packets[0].tag, kClientTag) << PacketPrinter{packets};
+ EXPECT_EQ(packets[0].tcpFlags, FlagToHost(TCP_FLAG_SYN))
+ << PacketPrinter{packets};
+
+ // Packet 2: server receives request from client.
+ EXPECT_EQ(packets[1].egress, 0) << PacketPrinter{packets};
+ EXPECT_EQ(packets[1].dport, server_port) << PacketPrinter{packets};
+ EXPECT_EQ(packets[1].tag, kServerTag) << PacketPrinter{packets};
+ EXPECT_EQ(packets[1].tcpFlags, FlagToHost(TCP_FLAG_SYN))
+ << PacketPrinter{packets};
+
+ // Packet 3: server replies back with syn ack.
+ EXPECT_EQ(packets[2].egress, 1) << PacketPrinter{packets};
+ EXPECT_EQ(packets[2].sport, server_port) << PacketPrinter{packets};
+ EXPECT_EQ(packets[2].tcpFlags, FlagToHost(TCP_FLAG_SYN | TCP_FLAG_ACK))
+ << PacketPrinter{packets};
+
+ // Packet 4: client receives the server's syn ack.
+ EXPECT_EQ(packets[3].egress, 0) << PacketPrinter{packets};
+ EXPECT_EQ(packets[3].sport, server_port) << PacketPrinter{packets};
+ EXPECT_EQ(packets[3].tcpFlags, FlagToHost(TCP_FLAG_SYN | TCP_FLAG_ACK))
+ << PacketPrinter{packets};
+}
+
+} // namespace internal
+} // namespace bpf
+} // namespace android
diff --git a/service-t/native/libs/libnetworkstats/include/netdbpf/BpfNetworkStats.h b/service-t/native/libs/libnetworkstats/include/netdbpf/BpfNetworkStats.h
index 03a1a44..133009f 100644
--- a/service-t/native/libs/libnetworkstats/include/netdbpf/BpfNetworkStats.h
+++ b/service-t/native/libs/libnetworkstats/include/netdbpf/BpfNetworkStats.h
@@ -26,7 +26,7 @@
// TODO: set this to a proper value based on the map size;
constexpr int TAG_STATS_MAP_SOFT_LIMIT = 3;
constexpr int UID_ALL = -1;
-constexpr int TAG_ALL = -1;
+//constexpr int TAG_ALL = -1;
constexpr int TAG_NONE = 0;
constexpr int SET_ALL = -1;
constexpr int SET_DEFAULT = 0;
@@ -63,9 +63,8 @@
const BpfMap<uint32_t, StatsValue>& ifaceStatsMap,
const BpfMap<uint32_t, IfaceValue>& ifaceNameMap);
// For test only
-int parseBpfNetworkStatsDetailInternal(std::vector<stats_line>* lines,
- const std::vector<std::string>& limitIfaces, int limitTag,
- int limitUid, const BpfMap<StatsKey, StatsValue>& statsMap,
+int parseBpfNetworkStatsDetailInternal(std::vector<stats_line>& lines,
+ const BpfMap<StatsKey, StatsValue>& statsMap,
const BpfMap<uint32_t, IfaceValue>& ifaceMap);
// For test only
int cleanStatsMapInternal(const base::unique_fd& cookieTagMap, const base::unique_fd& tagStatsMap);
@@ -107,18 +106,16 @@
}
// For test only
-int parseBpfNetworkStatsDevInternal(std::vector<stats_line>* lines,
+int parseBpfNetworkStatsDevInternal(std::vector<stats_line>& lines,
const BpfMap<uint32_t, StatsValue>& statsMap,
const BpfMap<uint32_t, IfaceValue>& ifaceMap);
int bpfGetUidStats(uid_t uid, Stats* stats);
int bpfGetIfaceStats(const char* iface, Stats* stats);
-int parseBpfNetworkStatsDetail(std::vector<stats_line>* lines,
- const std::vector<std::string>& limitIfaces, int limitTag,
- int limitUid);
+int parseBpfNetworkStatsDetail(std::vector<stats_line>* lines);
int parseBpfNetworkStatsDev(std::vector<stats_line>* lines);
-void groupNetworkStats(std::vector<stats_line>* lines);
+void groupNetworkStats(std::vector<stats_line>& lines);
int cleanStatsMap();
} // namespace bpf
} // namespace android
diff --git a/service-t/native/libs/libnetworkstats/include/netdbpf/NetworkTraceHandler.h b/service-t/native/libs/libnetworkstats/include/netdbpf/NetworkTraceHandler.h
index 3f244b3..bc10e68 100644
--- a/service-t/native/libs/libnetworkstats/include/netdbpf/NetworkTraceHandler.h
+++ b/service-t/native/libs/libnetworkstats/include/netdbpf/NetworkTraceHandler.h
@@ -22,9 +22,7 @@
#include <string>
#include <unordered_map>
-#include "android-base/thread_annotations.h"
-#include "bpf/BpfMap.h"
-#include "bpf/BpfRingbuf.h"
+#include "netdbpf/NetworkTracePoller.h"
// For PacketTrace struct definition
#include "netd.h"
@@ -32,57 +30,39 @@
namespace android {
namespace bpf {
-// NetworkTracePoller is responsible for interactions with the BPF ring buffer
-// including polling. This class is an internal helper for NetworkTraceHandler,
-// it is not meant to be used elsewhere.
-class NetworkTracePoller {
- public:
- // Testonly: initialize with a callback capable of intercepting data.
- NetworkTracePoller(std::function<void(const PacketTrace&)> callback)
- : mCallback(std::move(callback)) {}
+// BundleKeys are PacketTraces where timestamp and length are ignored.
+using BundleKey = PacketTrace;
- // Starts tracing with the given poll interval.
- bool Start(uint32_t pollMs) EXCLUDES(mMutex);
+// BundleKeys are hashed using all fields except timestamp/length.
+struct BundleHash {
+ std::size_t operator()(const BundleKey& a) const;
+};
- // Stops tracing and release any held state.
- bool Stop() EXCLUDES(mMutex);
+// BundleKeys are equal if all fields except timestamp/length are equal.
+struct BundleEq {
+ bool operator()(const BundleKey& a, const BundleKey& b) const;
+};
- // Consumes all available events from the ringbuffer.
- bool ConsumeAll() EXCLUDES(mMutex);
+// Track the bundles we've interned and their corresponding intern id (iid). We
+// use IncrementalState (rather than state in the Handler) so that we stay in
+// sync with Perfetto's periodic state clearing (which helps recover from packet
+// loss). When state is cleared, the state object is replaced with a new default
+// constructed instance.
+struct NetworkTraceState {
+ bool cleared = true;
+ std::unordered_map<BundleKey, uint64_t, BundleHash, BundleEq> iids;
+};
- private:
- void SchedulePolling() REQUIRES(mMutex);
- bool ConsumeAllLocked() REQUIRES(mMutex);
-
- std::mutex mMutex;
-
- // Records the number of successfully started active sessions so that only the
- // first active session attempts setup and only the last cleans up. Note that
- // the session count will remain zero if Start fails. It is expected that Stop
- // will not be called for any trace session where Start fails.
- int mSessionCount GUARDED_BY(mMutex);
-
- // How often to poll the ring buffer, defined by the trace config.
- uint32_t mPollMs GUARDED_BY(mMutex);
-
- // The function to process PacketTrace, typically a Perfetto sink.
- std::function<void(const PacketTrace&)> mCallback GUARDED_BY(mMutex);
-
- // The BPF ring buffer handle.
- std::unique_ptr<BpfRingbuf<PacketTrace>> mRingBuffer GUARDED_BY(mMutex);
-
- // The packet tracing config map (really a 1-element array).
- BpfMap<uint32_t, bool> mConfigurationMap GUARDED_BY(mMutex);
-
- // This must be the last member, causing it to be the first deleted. If it is
- // not, members required for callbacks can be deleted before it's stopped.
- std::unique_ptr<perfetto::base::TaskRunner> mTaskRunner GUARDED_BY(mMutex);
+// Inject our custom incremental state type using type traits.
+struct NetworkTraceTraits : public perfetto::DefaultDataSourceTraits {
+ using IncrementalStateType = NetworkTraceState;
};
// NetworkTraceHandler implements the android.network_packets data source. This
// class is registered with Perfetto and is instantiated when tracing starts and
// destroyed when tracing ends. There is one instance per trace session.
-class NetworkTraceHandler : public perfetto::DataSource<NetworkTraceHandler> {
+class NetworkTraceHandler
+ : public perfetto::DataSource<NetworkTraceHandler, NetworkTraceTraits> {
public:
// Registers this DataSource.
static void RegisterDataSource();
@@ -90,19 +70,40 @@
// Connects to the system Perfetto daemon and registers the trace handler.
static void InitPerfettoTracing();
+ // When isTest is true, skip non-hermetic code.
+ NetworkTraceHandler(bool isTest = false) : mIsTest(isTest) {}
+
// perfetto::DataSource overrides:
void OnSetup(const SetupArgs& args) override;
void OnStart(const StartArgs&) override;
void OnStop(const StopArgs&) override;
+ // Writes the packets as Perfetto TracePackets, creating packets as needed
+ // using the provided callback (which allows easy testing).
+ void Write(const std::vector<PacketTrace>& packets,
+ NetworkTraceHandler::TraceContext& ctx);
+
private:
// Convert a PacketTrace into a Perfetto trace packet.
- static void Fill(const PacketTrace& src,
- ::perfetto::protos::pbzero::TracePacket& dst);
+ void Fill(const PacketTrace& src,
+ ::perfetto::protos::pbzero::NetworkPacketEvent* event);
- static NetworkTracePoller sPoller;
- uint32_t mPollMs;
+ // Fills in contextual information either inline or via interning.
+ ::perfetto::protos::pbzero::NetworkPacketBundle* FillWithInterning(
+ NetworkTraceState* state, const BundleKey& key,
+ ::perfetto::protos::pbzero::TracePacket* dst);
+
+ static internal::NetworkTracePoller sPoller;
bool mStarted;
+ bool mIsTest;
+
+ // Values from config, see proto for details.
+ uint32_t mPollMs;
+ uint32_t mInternLimit;
+ uint32_t mAggregationThreshold;
+ bool mDropLocalPort;
+ bool mDropRemotePort;
+ bool mDropTcpFlags;
};
} // namespace bpf
diff --git a/service-t/native/libs/libnetworkstats/include/netdbpf/NetworkTracePoller.h b/service-t/native/libs/libnetworkstats/include/netdbpf/NetworkTracePoller.h
new file mode 100644
index 0000000..8433934
--- /dev/null
+++ b/service-t/native/libs/libnetworkstats/include/netdbpf/NetworkTracePoller.h
@@ -0,0 +1,91 @@
+/**
+ * Copyright (c) 2023, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <perfetto/base/task_runner.h>
+#include <perfetto/tracing.h>
+
+#include <string>
+#include <unordered_map>
+
+#include "android-base/thread_annotations.h"
+#include "bpf/BpfMap.h"
+#include "bpf/BpfRingbuf.h"
+
+// For PacketTrace struct definition
+#include "netd.h"
+
+namespace android {
+namespace bpf {
+namespace internal {
+
+// NetworkTracePoller is responsible for interactions with the BPF ring buffer
+// including polling. This class is an internal helper for NetworkTraceHandler,
+// it is not meant to be used elsewhere.
+class NetworkTracePoller {
+ public:
+ using EventSink = std::function<void(const std::vector<PacketTrace>&)>;
+
+ // Testonly: initialize with a callback capable of intercepting data.
+ NetworkTracePoller(EventSink callback) : mCallback(std::move(callback)) {}
+
+ // Starts tracing with the given poll interval.
+ bool Start(uint32_t pollMs) EXCLUDES(mMutex);
+
+ // Stops tracing and release any held state.
+ bool Stop() EXCLUDES(mMutex);
+
+ // Consumes all available events from the ringbuffer.
+ bool ConsumeAll() EXCLUDES(mMutex);
+
+ private:
+ // Poll the ring buffer for new data and schedule another run of ourselves
+ // after poll_ms (essentially polling periodically until stopped). This takes
+ // in the runner and poll duration to prevent a hard requirement on the lock
+ // and thus a deadlock while resetting the TaskRunner. The runner pointer is
+ // always valid within tasks run by that runner.
+ void PollAndSchedule(perfetto::base::TaskRunner* runner, uint32_t poll_ms);
+ bool ConsumeAllLocked() REQUIRES(mMutex);
+
+ std::mutex mMutex;
+
+ // Records the number of successfully started active sessions so that only the
+ // first active session attempts setup and only the last cleans up. Note that
+ // the session count will remain zero if Start fails. It is expected that Stop
+ // will not be called for any trace session where Start fails.
+ int mSessionCount GUARDED_BY(mMutex);
+
+ // How often to poll the ring buffer, defined by the trace config.
+ uint32_t mPollMs GUARDED_BY(mMutex);
+
+ // The function to process PacketTrace, typically a Perfetto sink.
+ EventSink mCallback GUARDED_BY(mMutex);
+
+ // The BPF ring buffer handle.
+ std::unique_ptr<BpfRingbuf<PacketTrace>> mRingBuffer GUARDED_BY(mMutex);
+
+ // The packet tracing config map (really a 1-element array).
+ BpfMap<uint32_t, bool> mConfigurationMap GUARDED_BY(mMutex);
+
+ // This must be the last member, causing it to be the first deleted. If it is
+ // not, members required for callbacks can be deleted before it's stopped.
+ std::unique_ptr<perfetto::base::TaskRunner> mTaskRunner GUARDED_BY(mMutex);
+};
+
+} // namespace internal
+} // namespace bpf
+} // namespace android
diff --git a/service-t/src/com/android/server/NsdService.java b/service-t/src/com/android/server/NsdService.java
index 619b64d..754a60b 100644
--- a/service-t/src/com/android/server/NsdService.java
+++ b/service-t/src/com/android/server/NsdService.java
@@ -17,13 +17,19 @@
package com.android.server;
import static android.net.ConnectivityManager.NETID_UNSET;
+import static android.net.NetworkCapabilities.TRANSPORT_VPN;
+import static android.net.NetworkCapabilities.TRANSPORT_WIFI;
import static android.net.nsd.NsdManager.MDNS_DISCOVERY_MANAGER_EVENT;
import static android.net.nsd.NsdManager.MDNS_SERVICE_EVENT;
-import static android.provider.DeviceConfig.NAMESPACE_CONNECTIVITY;
+import static android.net.nsd.NsdManager.RESOLVE_SERVICE_SUCCEEDED;
import static android.provider.DeviceConfig.NAMESPACE_TETHERING;
+import static com.android.modules.utils.build.SdkLevel.isAtLeastU;
+import static com.android.server.connectivity.mdns.MdnsRecord.MAX_LABEL_LENGTH;
+
import android.annotation.NonNull;
import android.annotation.Nullable;
+import android.app.ActivityManager;
import android.content.Context;
import android.content.Intent;
import android.net.ConnectivityManager;
@@ -42,6 +48,8 @@
import android.net.nsd.MDnsManager;
import android.net.nsd.NsdManager;
import android.net.nsd.NsdServiceInfo;
+import android.net.wifi.WifiManager;
+import android.os.Binder;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.IBinder;
@@ -49,42 +57,45 @@
import android.os.Message;
import android.os.RemoteException;
import android.os.UserHandle;
+import android.provider.DeviceConfig;
import android.text.TextUtils;
+import android.util.ArraySet;
import android.util.Log;
import android.util.Pair;
import android.util.SparseArray;
import com.android.internal.annotations.VisibleForTesting;
+import com.android.internal.util.IndentingPrintWriter;
import com.android.internal.util.State;
import com.android.internal.util.StateMachine;
+import com.android.net.module.util.CollectionUtils;
import com.android.net.module.util.DeviceConfigUtils;
+import com.android.net.module.util.InetAddressUtils;
import com.android.net.module.util.PermissionUtils;
+import com.android.net.module.util.SharedLog;
import com.android.server.connectivity.mdns.ExecutorProvider;
import com.android.server.connectivity.mdns.MdnsAdvertiser;
import com.android.server.connectivity.mdns.MdnsDiscoveryManager;
+import com.android.server.connectivity.mdns.MdnsInterfaceSocket;
import com.android.server.connectivity.mdns.MdnsMultinetworkSocketClient;
import com.android.server.connectivity.mdns.MdnsSearchOptions;
import com.android.server.connectivity.mdns.MdnsServiceBrowserListener;
import com.android.server.connectivity.mdns.MdnsServiceInfo;
-import com.android.server.connectivity.mdns.MdnsSocketClientBase;
import com.android.server.connectivity.mdns.MdnsSocketProvider;
+import com.android.server.connectivity.mdns.util.MdnsUtils;
import java.io.FileDescriptor;
import java.io.PrintWriter;
+import java.net.Inet6Address;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.net.UnknownHostException;
-import java.nio.ByteBuffer;
-import java.nio.CharBuffer;
-import java.nio.charset.Charset;
-import java.nio.charset.CharsetEncoder;
-import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
-import java.util.Objects;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@@ -103,8 +114,6 @@
*/
private static final String MDNS_DISCOVERY_MANAGER_VERSION = "mdns_discovery_manager_version";
private static final String LOCAL_DOMAIN_NAME = "local";
- // Max label length as per RFC 1034/1035
- private static final int MAX_LABEL_LENGTH = 63;
/**
* Enable advertising using the Java MdnsAdvertiser, instead of the legacy mdnsresponder
@@ -140,9 +149,18 @@
"mdns_advertiser_allowlist_";
private static final String MDNS_ALLOWLIST_FLAG_SUFFIX = "_version";
+ @VisibleForTesting
+ static final String MDNS_CONFIG_RUNNING_APP_ACTIVE_IMPORTANCE_CUTOFF =
+ "mdns_config_running_app_active_importance_cutoff";
+ @VisibleForTesting
+ static final int DEFAULT_RUNNING_APP_ACTIVE_IMPORTANCE_CUTOFF =
+ ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND;
+ private final int mRunningAppActiveImportanceCutoff;
+
public static final boolean DBG = Log.isLoggable(TAG, Log.DEBUG);
private static final long CLEANUP_DELAY_MS = 10000;
private static final int IFACE_IDX_ANY = 0;
+ private static final SharedLog LOGGER = new SharedLog("serviceDiscovery");
private final Context mContext;
private final NsdStateMachine mNsdStateMachine;
@@ -158,6 +176,7 @@
private final MdnsSocketProvider mMdnsSocketProvider;
@NonNull
private final MdnsAdvertiser mAdvertiser;
+ private final SharedLog mServiceLogs = LOGGER.forSubComponent(TAG);
// WARNING : Accessing these values in any thread is not safe, it must only be changed in the
// state machine thread. If change this outside state machine, it will need to introduce
// synchronization.
@@ -172,12 +191,24 @@
/* A map from unique id to client info */
private final SparseArray<ClientInfo> mIdToClientInfoMap= new SparseArray<>();
+ // Note this is not final to avoid depending on the Wi-Fi service starting before NsdService
+ @Nullable
+ private WifiManager.MulticastLock mHeldMulticastLock;
+ // Fulfilled network requests that require the Wi-Fi lock: key is the obtained Network
+ // (non-null), value is the requested Network (nullable)
+ @NonNull
+ private final ArraySet<Network> mWifiLockRequiredNetworks = new ArraySet<>();
+ @NonNull
+ private final ArraySet<Integer> mRunningAppActiveUids = new ArraySet<>();
+
private final long mCleanupDelayMs;
private static final int INVALID_ID = 0;
private int mUniqueId = 1;
// The count of the connected legacy clients.
private int mLegacyClientCount = 0;
+ // The number of client that ever connected.
+ private int mClientNumberId = 1;
private static class MdnsListener implements MdnsServiceBrowserListener {
protected final int mClientId;
@@ -239,14 +270,14 @@
public void onServiceNameDiscovered(@NonNull MdnsServiceInfo serviceInfo) {
mNsdStateMachine.sendMessage(MDNS_DISCOVERY_MANAGER_EVENT, mTransactionId,
NsdManager.SERVICE_FOUND,
- new MdnsEvent(mClientId, mReqServiceInfo.getServiceType(), serviceInfo));
+ new MdnsEvent(mClientId, serviceInfo));
}
@Override
public void onServiceNameRemoved(@NonNull MdnsServiceInfo serviceInfo) {
mNsdStateMachine.sendMessage(MDNS_DISCOVERY_MANAGER_EVENT, mTransactionId,
NsdManager.SERVICE_LOST,
- new MdnsEvent(mClientId, mReqServiceInfo.getServiceType(), serviceInfo));
+ new MdnsEvent(mClientId, serviceInfo));
}
}
@@ -261,24 +292,147 @@
public void onServiceFound(MdnsServiceInfo serviceInfo) {
mNsdStateMachine.sendMessage(MDNS_DISCOVERY_MANAGER_EVENT, mTransactionId,
NsdManager.RESOLVE_SERVICE_SUCCEEDED,
- new MdnsEvent(mClientId, mReqServiceInfo.getServiceType(), serviceInfo));
+ new MdnsEvent(mClientId, serviceInfo));
}
}
+ private class ServiceInfoListener extends MdnsListener {
+
+ ServiceInfoListener(int clientId, int transactionId, @NonNull NsdServiceInfo reqServiceInfo,
+ @NonNull String listenServiceType) {
+ super(clientId, transactionId, reqServiceInfo, listenServiceType);
+ }
+
+ @Override
+ public void onServiceFound(@NonNull MdnsServiceInfo serviceInfo) {
+ mNsdStateMachine.sendMessage(MDNS_DISCOVERY_MANAGER_EVENT, mTransactionId,
+ NsdManager.SERVICE_UPDATED,
+ new MdnsEvent(mClientId, serviceInfo));
+ }
+
+ @Override
+ public void onServiceUpdated(@NonNull MdnsServiceInfo serviceInfo) {
+ mNsdStateMachine.sendMessage(MDNS_DISCOVERY_MANAGER_EVENT, mTransactionId,
+ NsdManager.SERVICE_UPDATED,
+ new MdnsEvent(mClientId, serviceInfo));
+ }
+
+ @Override
+ public void onServiceRemoved(@NonNull MdnsServiceInfo serviceInfo) {
+ mNsdStateMachine.sendMessage(MDNS_DISCOVERY_MANAGER_EVENT, mTransactionId,
+ NsdManager.SERVICE_UPDATED_LOST,
+ new MdnsEvent(mClientId, serviceInfo));
+ }
+ }
+
+ private class SocketRequestMonitor implements MdnsSocketProvider.SocketRequestMonitor {
+ @Override
+ public void onSocketRequestFulfilled(@Nullable Network socketNetwork,
+ @NonNull MdnsInterfaceSocket socket, @NonNull int[] transports) {
+ // The network may be null for Wi-Fi SoftAp interfaces (tethering), but there is no APF
+ // filtering on such interfaces, so taking the multicast lock is not necessary to
+ // disable APF filtering of multicast.
+ if (socketNetwork == null
+ || !CollectionUtils.contains(transports, TRANSPORT_WIFI)
+ || CollectionUtils.contains(transports, TRANSPORT_VPN)) {
+ return;
+ }
+
+ if (mWifiLockRequiredNetworks.add(socketNetwork)) {
+ updateMulticastLock();
+ }
+ }
+
+ @Override
+ public void onSocketDestroyed(@Nullable Network socketNetwork,
+ @NonNull MdnsInterfaceSocket socket) {
+ if (mWifiLockRequiredNetworks.remove(socketNetwork)) {
+ updateMulticastLock();
+ }
+ }
+ }
+
+ private class UidImportanceListener implements ActivityManager.OnUidImportanceListener {
+ private final Handler mHandler;
+
+ private UidImportanceListener(Handler handler) {
+ mHandler = handler;
+ }
+
+ @Override
+ public void onUidImportance(int uid, int importance) {
+ mHandler.post(() -> handleUidImportanceChanged(uid, importance));
+ }
+ }
+
+ private void handleUidImportanceChanged(int uid, int importance) {
+ // Lower importance values are more "important"
+ final boolean modified = importance <= mRunningAppActiveImportanceCutoff
+ ? mRunningAppActiveUids.add(uid)
+ : mRunningAppActiveUids.remove(uid);
+ if (modified) {
+ updateMulticastLock();
+ }
+ }
+
+ /**
+ * Take or release the lock based on updated internal state.
+ *
+ * This determines whether the lock needs to be held based on
+ * {@link #mWifiLockRequiredNetworks}, {@link #mRunningAppActiveUids} and
+ * {@link ClientInfo#mClientRequests}, so it must be called after any of the these have been
+ * updated.
+ */
+ private void updateMulticastLock() {
+ final int needsLockUid = getMulticastLockNeededUid();
+ if (needsLockUid >= 0 && mHeldMulticastLock == null) {
+ final WifiManager wm = mContext.getSystemService(WifiManager.class);
+ if (wm == null) {
+ Log.wtf(TAG, "Got a TRANSPORT_WIFI network without WifiManager");
+ return;
+ }
+ mHeldMulticastLock = wm.createMulticastLock(TAG);
+ mHeldMulticastLock.acquire();
+ mServiceLogs.log("Taking multicast lock for uid " + needsLockUid);
+ } else if (needsLockUid < 0 && mHeldMulticastLock != null) {
+ mHeldMulticastLock.release();
+ mHeldMulticastLock = null;
+ mServiceLogs.log("Released multicast lock");
+ }
+ }
+
+ /**
+ * @return The UID of an app requiring the multicast lock, or -1 if none.
+ */
+ private int getMulticastLockNeededUid() {
+ if (mWifiLockRequiredNetworks.size() == 0) {
+ // Return early if NSD is not active, or not on any relevant network
+ return -1;
+ }
+ for (int i = 0; i < mIdToClientInfoMap.size(); i++) {
+ final ClientInfo clientInfo = mIdToClientInfoMap.valueAt(i);
+ if (!mRunningAppActiveUids.contains(clientInfo.mUid)) {
+ // Ignore non-active UIDs
+ continue;
+ }
+
+ if (clientInfo.hasAnyJavaBackendRequestForNetworks(mWifiLockRequiredNetworks)) {
+ return clientInfo.mUid;
+ }
+ }
+ return -1;
+ }
+
/**
* Data class of mdns service callback information.
*/
private static class MdnsEvent {
final int mClientId;
@NonNull
- final String mRequestedServiceType;
- @NonNull
final MdnsServiceInfo mMdnsServiceInfo;
- MdnsEvent(int clientId, @NonNull String requestedServiceType,
- @NonNull MdnsServiceInfo mdnsServiceInfo) {
+ MdnsEvent(int clientId, @NonNull MdnsServiceInfo mdnsServiceInfo) {
mClientId = clientId;
- mRequestedServiceType = requestedServiceType;
mMdnsServiceInfo = mdnsServiceInfo;
}
}
@@ -302,6 +456,7 @@
mMDnsManager.startDaemon();
mIsDaemonStarted = true;
maybeScheduleStop();
+ mServiceLogs.log("Start mdns_responder daemon");
}
private void maybeStopDaemon() {
@@ -312,6 +467,7 @@
mMDnsManager.unregisterEventListener(mMDnsEventCallback);
mMDnsManager.stopDaemon();
mIsDaemonStarted = false;
+ mServiceLogs.log("Stop mdns_responder daemon");
}
private boolean isAnyRequestActive() {
@@ -367,13 +523,14 @@
final int clientId = msg.arg2;
switch (msg.what) {
case NsdManager.REGISTER_CLIENT:
- final Pair<NsdServiceConnector, INsdManagerCallback> arg =
- (Pair<NsdServiceConnector, INsdManagerCallback>) msg.obj;
- final INsdManagerCallback cb = arg.second;
+ final ConnectorArgs arg = (ConnectorArgs) msg.obj;
+ final INsdManagerCallback cb = arg.callback;
try {
- cb.asBinder().linkToDeath(arg.first, 0);
- cInfo = new ClientInfo(cb);
- mClients.put(arg.first, cInfo);
+ cb.asBinder().linkToDeath(arg.connector, 0);
+ final String tag = "Client" + arg.uid + "-" + mClientNumberId++;
+ cInfo = new ClientInfo(cb, arg.uid, arg.useJavaBackend,
+ mServiceLogs.forSubComponent(tag));
+ mClients.put(arg.connector, cInfo);
} catch (RemoteException e) {
Log.w(TAG, "Client " + clientId + " has already died");
}
@@ -496,9 +653,11 @@
}
private void storeAdvertiserRequestMap(int clientId, int globalId,
- ClientInfo clientInfo) {
- clientInfo.mClientRequests.put(clientId, new AdvertiserClientRequest(globalId));
+ ClientInfo clientInfo, @Nullable Network requestedNetwork) {
+ clientInfo.mClientRequests.put(clientId,
+ new AdvertiserClientRequest(globalId, requestedNetwork));
mIdToClientInfoMap.put(globalId, clientInfo);
+ updateMulticastLock();
}
private void removeRequestMap(int clientId, int globalId, ClientInfo clientInfo) {
@@ -511,22 +670,19 @@
maybeScheduleStop();
} else {
maybeStopMonitoringSocketsIfNoActiveRequest();
+ updateMulticastLock();
}
}
private void storeDiscoveryManagerRequestMap(int clientId, int globalId,
- MdnsListener listener, ClientInfo clientInfo) {
+ MdnsListener listener, ClientInfo clientInfo,
+ @Nullable Network requestedNetwork) {
clientInfo.mClientRequests.put(clientId,
- new DiscoveryManagerRequest(globalId, listener));
+ new DiscoveryManagerRequest(globalId, listener, requestedNetwork));
mIdToClientInfoMap.put(globalId, clientInfo);
+ updateMulticastLock();
}
- private void clearRegisteredServiceInfo(ClientInfo clientInfo) {
- clientInfo.mRegisteredService = null;
- clientInfo.mClientIdForServiceUpdates = 0;
- }
-
-
/**
* Truncate a service name to up to 63 UTF-8 bytes.
*
@@ -536,18 +692,7 @@
*/
@NonNull
private String truncateServiceName(@NonNull String originalName) {
- // UTF-8 is at most 4 bytes per character; return early in the common case where
- // the name can't possibly be over the limit given its string length.
- if (originalName.length() <= MAX_LABEL_LENGTH / 4) return originalName;
-
- final Charset utf8 = StandardCharsets.UTF_8;
- final CharsetEncoder encoder = utf8.newEncoder();
- final ByteBuffer out = ByteBuffer.allocate(MAX_LABEL_LENGTH);
- // encode will write as many characters as possible to the out buffer, and just
- // return an overflow code if there were too many characters (no need to check the
- // return code here, this method truncates the name on purpose).
- encoder.encode(CharBuffer.wrap(originalName), out, true /* endOfInput */);
- return new String(out.array(), 0, out.position(), utf8);
+ return MdnsUtils.truncateServiceName(originalName, MAX_LABEL_LENGTH);
}
private void stopDiscoveryManagerRequest(ClientRequest request, int clientId, int id,
@@ -583,8 +728,12 @@
final NsdServiceInfo info = args.serviceInfo;
id = getUniqueId();
- final String serviceType = constructServiceType(info.getServiceType());
- if (mDeps.isMdnsDiscoveryManagerEnabled(mContext)
+ final Pair<String, String> typeAndSubtype =
+ parseTypeAndSubtype(info.getServiceType());
+ final String serviceType = typeAndSubtype == null
+ ? null : typeAndSubtype.first;
+ if (clientInfo.mUseJavaBackend
+ || mDeps.isMdnsDiscoveryManagerEnabled(mContext)
|| useDiscoveryManagerForType(serviceType)) {
if (serviceType == null) {
clientInfo.onDiscoverServicesFailed(clientId,
@@ -596,14 +745,23 @@
maybeStartMonitoringSockets();
final MdnsListener listener =
new DiscoveryListener(clientId, id, info, listenServiceType);
- final MdnsSearchOptions options = MdnsSearchOptions.newBuilder()
- .setNetwork(info.getNetwork())
- .setIsPassiveMode(true)
- .build();
+ final MdnsSearchOptions.Builder optionsBuilder =
+ MdnsSearchOptions.newBuilder()
+ .setNetwork(info.getNetwork())
+ .setRemoveExpiredService(true)
+ .setIsPassiveMode(true);
+ if (typeAndSubtype.second != null) {
+ // The parsing ensures subtype starts with an underscore.
+ // MdnsSearchOptions expects the underscore to not be present.
+ optionsBuilder.addSubtype(typeAndSubtype.second.substring(1));
+ }
mMdnsDiscoveryManager.registerListener(
- listenServiceType, listener, options);
- storeDiscoveryManagerRequestMap(clientId, id, listener, clientInfo);
+ listenServiceType, listener, optionsBuilder.build());
+ storeDiscoveryManagerRequestMap(clientId, id, listener, clientInfo,
+ info.getNetwork());
clientInfo.onDiscoverServicesStarted(clientId, info);
+ clientInfo.log("Register a DiscoveryListener " + id
+ + " for service type:" + listenServiceType);
} else {
maybeStartDaemon();
if (discoverServices(id, info)) {
@@ -645,6 +803,7 @@
if (request instanceof DiscoveryManagerRequest) {
stopDiscoveryManagerRequest(request, clientId, id, clientInfo);
clientInfo.onStopDiscoverySucceeded(clientId);
+ clientInfo.log("Unregister the DiscoveryListener " + id);
} else {
removeRequestMap(clientId, id, clientInfo);
if (stopServiceDiscovery(id)) {
@@ -677,8 +836,11 @@
id = getUniqueId();
final NsdServiceInfo serviceInfo = args.serviceInfo;
final String serviceType = serviceInfo.getServiceType();
- final String registerServiceType = constructServiceType(serviceType);
- if (mDeps.isMdnsAdvertiserEnabled(mContext)
+ final Pair<String, String> typeSubtype = parseTypeAndSubtype(serviceType);
+ final String registerServiceType = typeSubtype == null
+ ? null : typeSubtype.first;
+ if (clientInfo.mUseJavaBackend
+ || mDeps.isMdnsAdvertiserEnabled(mContext)
|| useAdvertiserForType(registerServiceType)) {
if (registerServiceType == null) {
Log.e(TAG, "Invalid service type: " + serviceType);
@@ -691,8 +853,13 @@
serviceInfo.getServiceName()));
maybeStartMonitoringSockets();
- mAdvertiser.addService(id, serviceInfo);
- storeAdvertiserRequestMap(clientId, id, clientInfo);
+ // TODO: pass in the subtype as well. Including the subtype in the
+ // service type would generate service instance names like
+ // Name._subtype._sub._type._tcp, which is incorrect
+ // (it should be Name._type._tcp).
+ mAdvertiser.addService(id, serviceInfo, typeSubtype.second);
+ storeAdvertiserRequestMap(clientId, id, clientInfo,
+ serviceInfo.getNetwork());
} else {
maybeStartDaemon();
if (registerService(id, serviceInfo)) {
@@ -757,8 +924,12 @@
final NsdServiceInfo info = args.serviceInfo;
id = getUniqueId();
- final String serviceType = constructServiceType(info.getServiceType());
- if (mDeps.isMdnsDiscoveryManagerEnabled(mContext)
+ final Pair<String, String> typeSubtype =
+ parseTypeAndSubtype(info.getServiceType());
+ final String serviceType = typeSubtype == null
+ ? null : typeSubtype.first;
+ if (clientInfo.mUseJavaBackend
+ || mDeps.isMdnsDiscoveryManagerEnabled(mContext)
|| useDiscoveryManagerForType(serviceType)) {
if (serviceType == null) {
clientInfo.onResolveServiceFailed(clientId,
@@ -774,10 +945,14 @@
.setNetwork(info.getNetwork())
.setIsPassiveMode(true)
.setResolveInstanceName(info.getServiceName())
+ .setRemoveExpiredService(true)
.build();
mMdnsDiscoveryManager.registerListener(
resolveServiceType, listener, options);
- storeDiscoveryManagerRequestMap(clientId, id, listener, clientInfo);
+ storeDiscoveryManagerRequestMap(clientId, id, listener, clientInfo,
+ info.getNetwork());
+ clientInfo.log("Register a ResolutionListener " + id
+ + " for service type:" + resolveServiceType);
} else {
if (clientInfo.mResolvedService != null) {
clientInfo.onResolveServiceFailed(
@@ -820,6 +995,7 @@
if (request instanceof DiscoveryManagerRequest) {
stopDiscoveryManagerRequest(request, clientId, id, clientInfo);
clientInfo.onStopResolutionSucceeded(clientId);
+ clientInfo.log("Unregister the ResolutionListener " + id);
} else {
removeRequestMap(clientId, id, clientInfo);
if (stopResolveService(id)) {
@@ -832,7 +1008,7 @@
}
break;
}
- case NsdManager.REGISTER_SERVICE_CALLBACK:
+ case NsdManager.REGISTER_SERVICE_CALLBACK: {
if (DBG) Log.d(TAG, "Register a service callback");
args = (ListenerArgs) msg.obj;
clientInfo = mClients.get(args.connector);
@@ -844,23 +1020,36 @@
break;
}
- if (clientInfo.mRegisteredService != null) {
- clientInfo.onServiceInfoCallbackRegistrationFailed(
- clientId, NsdManager.FAILURE_ALREADY_ACTIVE);
+ final NsdServiceInfo info = args.serviceInfo;
+ id = getUniqueId();
+ final Pair<String, String> typeAndSubtype =
+ parseTypeAndSubtype(info.getServiceType());
+ final String serviceType = typeAndSubtype == null
+ ? null : typeAndSubtype.first;
+ if (serviceType == null) {
+ clientInfo.onServiceInfoCallbackRegistrationFailed(clientId,
+ NsdManager.FAILURE_BAD_PARAMETERS);
break;
}
+ final String resolveServiceType = serviceType + ".local";
- maybeStartDaemon();
- id = getUniqueId();
- if (resolveService(id, args.serviceInfo)) {
- clientInfo.mRegisteredService = new NsdServiceInfo();
- clientInfo.mClientIdForServiceUpdates = clientId;
- storeLegacyRequestMap(clientId, id, clientInfo, msg.what);
- } else {
- clientInfo.onServiceInfoCallbackRegistrationFailed(
- clientId, NsdManager.FAILURE_BAD_PARAMETERS);
- }
+ maybeStartMonitoringSockets();
+ final MdnsListener listener =
+ new ServiceInfoListener(clientId, id, info, resolveServiceType);
+ final MdnsSearchOptions options = MdnsSearchOptions.newBuilder()
+ .setNetwork(info.getNetwork())
+ .setIsPassiveMode(true)
+ .setResolveInstanceName(info.getServiceName())
+ .setRemoveExpiredService(true)
+ .build();
+ mMdnsDiscoveryManager.registerListener(
+ resolveServiceType, listener, options);
+ storeDiscoveryManagerRequestMap(clientId, id, listener, clientInfo,
+ info.getNetwork());
+ clientInfo.log("Register a ServiceInfoListener " + id
+ + " for service type:" + resolveServiceType);
break;
+ }
case NsdManager.UNREGISTER_SERVICE_CALLBACK: {
if (DBG) Log.d(TAG, "Unregister a service callback");
args = (ListenerArgs) msg.obj;
@@ -875,17 +1064,17 @@
final ClientRequest request = clientInfo.mClientRequests.get(clientId);
if (request == null) {
- Log.e(TAG, "Unknown client request in STOP_RESOLUTION");
+ Log.e(TAG, "Unknown client request in UNREGISTER_SERVICE_CALLBACK");
break;
}
id = request.mGlobalId;
- removeRequestMap(clientId, id, clientInfo);
- if (stopResolveService(id)) {
+ if (request instanceof DiscoveryManagerRequest) {
+ stopDiscoveryManagerRequest(request, clientId, id, clientInfo);
clientInfo.onServiceInfoCallbackUnregistered(clientId);
+ clientInfo.log("Unregister the ServiceInfoListener " + id);
} else {
- Log.e(TAG, "Failed to unregister service info callback");
+ loge("Unregister failed with non-DiscoveryManagerRequest.");
}
- clearRegisteredServiceInfo(clientInfo);
break;
}
case MDNS_SERVICE_EVENT:
@@ -904,19 +1093,6 @@
return HANDLED;
}
- private void notifyResolveFailedResult(boolean isListenedToUpdates, int clientId,
- ClientInfo clientInfo, int error) {
- if (isListenedToUpdates) {
- clientInfo.onServiceInfoCallbackRegistrationFailed(clientId, error);
- clearRegisteredServiceInfo(clientInfo);
- } else {
- // The resolve API always returned FAILURE_INTERNAL_ERROR on error; keep it
- // for backwards compatibility.
- clientInfo.onResolveServiceFailed(clientId, NsdManager.FAILURE_INTERNAL_ERROR);
- clientInfo.mResolvedService = null;
- }
- }
-
private boolean handleMDnsServiceEvent(int code, int id, Object obj) {
NsdServiceInfo servInfo;
ClientInfo clientInfo = mIdToClientInfoMap.get(id);
@@ -973,8 +1149,6 @@
// found services on the same interface index and their network at the time
setServiceNetworkForCallback(servInfo, lostNetId, info.interfaceIdx);
clientInfo.onServiceLost(clientId, servInfo);
- // TODO: also support registered service lost when not discovering
- clientInfo.maybeNotifyRegisteredServiceLost(servInfo);
break;
}
case IMDnsEventListener.SERVICE_DISCOVERY_FAILED:
@@ -1011,11 +1185,7 @@
String rest = fullName.substring(index);
String type = rest.replace(".local.", "");
- final boolean isListenedToUpdates =
- clientId == clientInfo.mClientIdForServiceUpdates;
- final NsdServiceInfo serviceInfo = isListenedToUpdates
- ? clientInfo.mRegisteredService : clientInfo.mResolvedService;
-
+ final NsdServiceInfo serviceInfo = clientInfo.mResolvedService;
serviceInfo.setServiceName(name);
serviceInfo.setServiceType(type);
serviceInfo.setPort(info.port);
@@ -1030,8 +1200,9 @@
storeLegacyRequestMap(clientId, id2, clientInfo,
NsdManager.RESOLVE_SERVICE);
} else {
- notifyResolveFailedResult(isListenedToUpdates, clientId, clientInfo,
- NsdManager.FAILURE_BAD_PARAMETERS);
+ clientInfo.onResolveServiceFailed(
+ clientId, NsdManager.FAILURE_INTERNAL_ERROR);
+ clientInfo.mResolvedService = null;
}
break;
}
@@ -1039,17 +1210,17 @@
/* NNN resolveId errorCode */
stopResolveService(id);
removeRequestMap(clientId, id, clientInfo);
- notifyResolveFailedResult(
- clientId == clientInfo.mClientIdForServiceUpdates,
- clientId, clientInfo, NsdManager.FAILURE_BAD_PARAMETERS);
+ clientInfo.onResolveServiceFailed(
+ clientId, NsdManager.FAILURE_INTERNAL_ERROR);
+ clientInfo.mResolvedService = null;
break;
case IMDnsEventListener.SERVICE_GET_ADDR_FAILED:
/* NNN resolveId errorCode */
stopGetAddrInfo(id);
removeRequestMap(clientId, id, clientInfo);
- notifyResolveFailedResult(
- clientId == clientInfo.mClientIdForServiceUpdates,
- clientId, clientInfo, NsdManager.FAILURE_BAD_PARAMETERS);
+ clientInfo.onResolveServiceFailed(
+ clientId, NsdManager.FAILURE_INTERNAL_ERROR);
+ clientInfo.mResolvedService = null;
break;
case IMDnsEventListener.SERVICE_GET_ADDR_SUCCESS: {
/* NNN resolveId hostname ttl addr interfaceIdx netId */
@@ -1066,38 +1237,19 @@
// If the resolved service is on an interface without a network, consider it
// as a failure: it would not be usable by apps as they would need
// privileged permissions.
- if (clientId == clientInfo.mClientIdForServiceUpdates) {
- if (netId != NETID_UNSET && serviceHost != null) {
- setServiceNetworkForCallback(clientInfo.mRegisteredService,
- netId, info.interfaceIdx);
- final List<InetAddress> addresses =
- clientInfo.mRegisteredService.getHostAddresses();
- addresses.add(serviceHost);
- clientInfo.mRegisteredService.setHostAddresses(addresses);
- clientInfo.onServiceUpdated(
- clientId, clientInfo.mRegisteredService);
- } else {
- stopGetAddrInfo(id);
- removeRequestMap(clientId, id, clientInfo);
- clearRegisteredServiceInfo(clientInfo);
- clientInfo.onServiceInfoCallbackRegistrationFailed(
- clientId, NsdManager.FAILURE_BAD_PARAMETERS);
- }
+ if (netId != NETID_UNSET && serviceHost != null) {
+ clientInfo.mResolvedService.setHost(serviceHost);
+ setServiceNetworkForCallback(clientInfo.mResolvedService,
+ netId, info.interfaceIdx);
+ clientInfo.onResolveServiceSucceeded(
+ clientId, clientInfo.mResolvedService);
} else {
- if (netId != NETID_UNSET && serviceHost != null) {
- clientInfo.mResolvedService.setHost(serviceHost);
- setServiceNetworkForCallback(clientInfo.mResolvedService,
- netId, info.interfaceIdx);
- clientInfo.onResolveServiceSucceeded(
- clientId, clientInfo.mResolvedService);
- } else {
- clientInfo.onResolveServiceFailed(
- clientId, NsdManager.FAILURE_INTERNAL_ERROR);
- }
- stopGetAddrInfo(id);
- removeRequestMap(clientId, id, clientInfo);
- clientInfo.mResolvedService = null;
+ clientInfo.onResolveServiceFailed(
+ clientId, NsdManager.FAILURE_INTERNAL_ERROR);
}
+ stopGetAddrInfo(id);
+ removeRequestMap(clientId, id, clientInfo);
+ clientInfo.mResolvedService = null;
break;
}
default:
@@ -1106,15 +1258,47 @@
return true;
}
- private NsdServiceInfo buildNsdServiceInfoFromMdnsEvent(final MdnsEvent event) {
+ @Nullable
+ private NsdServiceInfo buildNsdServiceInfoFromMdnsEvent(
+ final MdnsEvent event, int code) {
final MdnsServiceInfo serviceInfo = event.mMdnsServiceInfo;
- final String serviceType = event.mRequestedServiceType;
+ final String[] typeArray = serviceInfo.getServiceType();
+ final String joinedType;
+ if (typeArray.length == 0
+ || !typeArray[typeArray.length - 1].equals(LOCAL_DOMAIN_NAME)) {
+ Log.wtf(TAG, "MdnsServiceInfo type does not end in .local: "
+ + Arrays.toString(typeArray));
+ return null;
+ } else {
+ joinedType = TextUtils.join(".",
+ Arrays.copyOfRange(typeArray, 0, typeArray.length - 1));
+ }
+ final String serviceType;
+ switch (code) {
+ case NsdManager.SERVICE_FOUND:
+ case NsdManager.SERVICE_LOST:
+ // For consistency with historical behavior, discovered service types have
+ // a dot at the end.
+ serviceType = joinedType + ".";
+ break;
+ case RESOLVE_SERVICE_SUCCEEDED:
+ // For consistency with historical behavior, resolved service types have
+ // a dot at the beginning.
+ serviceType = "." + joinedType;
+ break;
+ default:
+ serviceType = joinedType;
+ break;
+ }
final String serviceName = serviceInfo.getServiceInstanceName();
final NsdServiceInfo servInfo = new NsdServiceInfo(serviceName, serviceType);
final Network network = serviceInfo.getNetwork();
+ // In MdnsDiscoveryManagerEvent, the Network can be null which means it is a
+ // network for Tethering interface. In other words, the network == null means the
+ // network has netId = INetd.LOCAL_NET_ID.
setServiceNetworkForCallback(
servInfo,
- network == null ? NETID_UNSET : network.netId,
+ network == null ? INetd.LOCAL_NET_ID : network.netId,
serviceInfo.getInterfaceIndex());
return servInfo;
}
@@ -1130,11 +1314,12 @@
final MdnsEvent event = (MdnsEvent) obj;
final int clientId = event.mClientId;
- final NsdServiceInfo info = buildNsdServiceInfoFromMdnsEvent(event);
- if (DBG) {
- Log.d(TAG, String.format("MdnsDiscoveryManager event code=%s transactionId=%d",
- NsdManager.nameOf(code), transactionId));
- }
+ final NsdServiceInfo info = buildNsdServiceInfoFromMdnsEvent(event, code);
+ // Errors are already logged if null
+ if (info == null) return false;
+ mServiceLogs.log(String.format(
+ "MdnsDiscoveryManager event code=%s transactionId=%d",
+ NsdManager.nameOf(code), transactionId));
switch (code) {
case NsdManager.SERVICE_FOUND:
clientInfo.onServiceFound(clientId, info);
@@ -1149,8 +1334,6 @@
break;
}
final MdnsServiceInfo serviceInfo = event.mMdnsServiceInfo;
- // Add '.' in front of the service type that aligns with historical behavior
- info.setServiceType("." + event.mRequestedServiceType);
info.setPort(serviceInfo.getPort());
Map<String, String> attrs = serviceInfo.getAttributes();
@@ -1162,22 +1345,7 @@
Log.e(TAG, "Invalid attribute", e);
}
}
- final List<InetAddress> addresses = new ArrayList<>();
- for (String ipv4Address : serviceInfo.getIpv4Addresses()) {
- try {
- addresses.add(InetAddresses.parseNumericAddress(ipv4Address));
- } catch (IllegalArgumentException e) {
- Log.wtf(TAG, "Invalid ipv4 address", e);
- }
- }
- for (String ipv6Address : serviceInfo.getIpv6Addresses()) {
- try {
- addresses.add(InetAddresses.parseNumericAddress(ipv6Address));
- } catch (IllegalArgumentException e) {
- Log.wtf(TAG, "Invalid ipv6 address", e);
- }
- }
-
+ final List<InetAddress> addresses = getInetAddresses(serviceInfo);
if (addresses.size() != 0) {
info.setHostAddresses(addresses);
clientInfo.onResolveServiceSucceeded(clientId, info);
@@ -1195,6 +1363,28 @@
stopDiscoveryManagerRequest(request, clientId, transactionId, clientInfo);
break;
}
+ case NsdManager.SERVICE_UPDATED: {
+ final MdnsServiceInfo serviceInfo = event.mMdnsServiceInfo;
+ info.setPort(serviceInfo.getPort());
+
+ Map<String, String> attrs = serviceInfo.getAttributes();
+ for (Map.Entry<String, String> kv : attrs.entrySet()) {
+ final String key = kv.getKey();
+ try {
+ info.setAttribute(key, serviceInfo.getAttributeAsBytes(key));
+ } catch (IllegalArgumentException e) {
+ Log.e(TAG, "Invalid attribute", e);
+ }
+ }
+
+ final List<InetAddress> addresses = getInetAddresses(serviceInfo);
+ info.setHostAddresses(addresses);
+ clientInfo.onServiceUpdated(clientId, info);
+ break;
+ }
+ case NsdManager.SERVICE_UPDATED_LOST:
+ clientInfo.onServiceUpdatedLost(clientId);
+ break;
default:
return false;
}
@@ -1203,6 +1393,30 @@
}
}
+ @NonNull
+ private static List<InetAddress> getInetAddresses(@NonNull MdnsServiceInfo serviceInfo) {
+ final List<String> v4Addrs = serviceInfo.getIpv4Addresses();
+ final List<String> v6Addrs = serviceInfo.getIpv6Addresses();
+ final List<InetAddress> addresses = new ArrayList<>(v4Addrs.size() + v6Addrs.size());
+ for (String ipv4Address : v4Addrs) {
+ try {
+ addresses.add(InetAddresses.parseNumericAddress(ipv4Address));
+ } catch (IllegalArgumentException e) {
+ Log.wtf(TAG, "Invalid ipv4 address", e);
+ }
+ }
+ for (String ipv6Address : v6Addrs) {
+ try {
+ final Inet6Address addr = (Inet6Address) InetAddresses.parseNumericAddress(
+ ipv6Address);
+ addresses.add(InetAddressUtils.withScopeId(addr, serviceInfo.getInterfaceIndex()));
+ } catch (IllegalArgumentException e) {
+ Log.wtf(TAG, "Invalid ipv6 address", e);
+ }
+ }
+ return addresses;
+ }
+
private static void setServiceNetworkForCallback(NsdServiceInfo info, int netId, int ifaceIdx) {
switch (netId) {
case NETID_UNSET:
@@ -1256,28 +1470,39 @@
* Check the given service type is valid and construct it to a service type
* which can use for discovery / resolution service.
*
- * <p> The valid service type should be 2 labels, or 3 labels if the query is for a
+ * <p>The valid service type should be 2 labels, or 3 labels if the query is for a
* subtype (see RFC6763 7.1). Each label is up to 63 characters and must start with an
* underscore; they are alphanumerical characters or dashes or underscore, except the
* last one that is just alphanumerical. The last label must be _tcp or _udp.
*
+ * <p>The subtype may also be specified with a comma after the service type, for example
+ * _type._tcp,_subtype.
+ *
* @param serviceType the request service type for discovery / resolution service
* @return constructed service type or null if the given service type is invalid.
*/
@Nullable
- public static String constructServiceType(String serviceType) {
+ public static Pair<String, String> parseTypeAndSubtype(String serviceType) {
if (TextUtils.isEmpty(serviceType)) return null;
+ final String typeOrSubtypePattern = "_[a-zA-Z0-9-_]{1,61}[a-zA-Z0-9]";
final Pattern serviceTypePattern = Pattern.compile(
- "^(_[a-zA-Z0-9-_]{1,61}[a-zA-Z0-9]\\.)?"
- + "(_[a-zA-Z0-9-_]{1,61}[a-zA-Z0-9]\\._(?:tcp|udp))"
+ // Optional leading subtype (_subtype._type._tcp)
+ // (?: xxx) is a non-capturing parenthesis, don't capture the dot
+ "^(?:(" + typeOrSubtypePattern + ")\\.)?"
+ // Actual type (_type._tcp.local)
+ + "(" + typeOrSubtypePattern + "\\._(?:tcp|udp))"
// Drop '.' at the end of service type that is compatible with old backend.
- + "\\.?$");
+ // e.g. allow "_type._tcp.local."
+ + "\\.?"
+ // Optional subtype after comma, for "_type._tcp,_subtype" format
+ + "(?:,(" + typeOrSubtypePattern + "))?"
+ + "$");
final Matcher matcher = serviceTypePattern.matcher(serviceType);
if (!matcher.matches()) return null;
- return matcher.group(1) == null
- ? matcher.group(2)
- : matcher.group(1) + "_sub." + matcher.group(2);
+ // Use the subtype either at the beginning or after the comma
+ final String subtype = matcher.group(1) != null ? matcher.group(1) : matcher.group(3);
+ return new Pair<>(matcher.group(2), subtype);
}
@VisibleForTesting
@@ -1295,14 +1520,28 @@
mMDnsEventCallback = new MDnsEventCallback(mNsdStateMachine);
mDeps = deps;
- mMdnsSocketProvider = deps.makeMdnsSocketProvider(ctx, handler.getLooper());
+ mMdnsSocketProvider = deps.makeMdnsSocketProvider(ctx, handler.getLooper(),
+ LOGGER.forSubComponent("MdnsSocketProvider"), new SocketRequestMonitor());
+ // Netlink monitor starts on boot, and intentionally never stopped, to ensure that all
+ // address events are received.
+ handler.post(mMdnsSocketProvider::startNetLinkMonitor);
+
+ // NsdService is started after ActivityManager (startOtherServices in SystemServer, vs.
+ // startBootstrapServices).
+ mRunningAppActiveImportanceCutoff = mDeps.getDeviceConfigInt(
+ MDNS_CONFIG_RUNNING_APP_ACTIVE_IMPORTANCE_CUTOFF,
+ DEFAULT_RUNNING_APP_ACTIVE_IMPORTANCE_CUTOFF);
+ final ActivityManager am = ctx.getSystemService(ActivityManager.class);
+ am.addOnUidImportanceListener(new UidImportanceListener(handler),
+ mRunningAppActiveImportanceCutoff);
+
mMdnsSocketClient =
new MdnsMultinetworkSocketClient(handler.getLooper(), mMdnsSocketProvider);
- mMdnsDiscoveryManager =
- deps.makeMdnsDiscoveryManager(new ExecutorProvider(), mMdnsSocketClient);
+ mMdnsDiscoveryManager = deps.makeMdnsDiscoveryManager(new ExecutorProvider(),
+ mMdnsSocketClient, LOGGER.forSubComponent("MdnsDiscoveryManager"));
handler.post(() -> mMdnsSocketClient.setCallback(mMdnsDiscoveryManager));
mAdvertiser = deps.makeMdnsAdvertiser(handler.getLooper(), mMdnsSocketProvider,
- new AdvertiserCallback());
+ new AdvertiserCallback(), LOGGER.forSubComponent("MdnsAdvertiser"));
}
/**
@@ -1317,8 +1556,9 @@
* @return true if the MdnsDiscoveryManager feature is enabled.
*/
public boolean isMdnsDiscoveryManagerEnabled(Context context) {
- return DeviceConfigUtils.isFeatureEnabled(context, NAMESPACE_CONNECTIVITY,
- MDNS_DISCOVERY_MANAGER_VERSION, false /* defaultEnabled */);
+ return isAtLeastU() || DeviceConfigUtils.isFeatureEnabled(context, NAMESPACE_TETHERING,
+ MDNS_DISCOVERY_MANAGER_VERSION, DeviceConfigUtils.TETHERING_MODULE_NAME,
+ false /* defaultEnabled */);
}
/**
@@ -1328,8 +1568,9 @@
* @return true if the MdnsAdvertiser feature is enabled.
*/
public boolean isMdnsAdvertiserEnabled(Context context) {
- return DeviceConfigUtils.isFeatureEnabled(context, NAMESPACE_CONNECTIVITY,
- MDNS_ADVERTISER_VERSION, false /* defaultEnabled */);
+ return isAtLeastU() || DeviceConfigUtils.isFeatureEnabled(context, NAMESPACE_TETHERING,
+ MDNS_ADVERTISER_VERSION, DeviceConfigUtils.TETHERING_MODULE_NAME,
+ false /* defaultEnabled */);
}
/**
@@ -1354,8 +1595,9 @@
* @see MdnsDiscoveryManager
*/
public MdnsDiscoveryManager makeMdnsDiscoveryManager(
- ExecutorProvider executorProvider, MdnsSocketClientBase socketClient) {
- return new MdnsDiscoveryManager(executorProvider, socketClient);
+ @NonNull ExecutorProvider executorProvider,
+ @NonNull MdnsMultinetworkSocketClient socketClient, @NonNull SharedLog sharedLog) {
+ return new MdnsDiscoveryManager(executorProvider, socketClient, sharedLog);
}
/**
@@ -1363,15 +1605,31 @@
*/
public MdnsAdvertiser makeMdnsAdvertiser(
@NonNull Looper looper, @NonNull MdnsSocketProvider socketProvider,
- @NonNull MdnsAdvertiser.AdvertiserCallback cb) {
- return new MdnsAdvertiser(looper, socketProvider, cb);
+ @NonNull MdnsAdvertiser.AdvertiserCallback cb, @NonNull SharedLog sharedLog) {
+ return new MdnsAdvertiser(looper, socketProvider, cb, sharedLog);
}
/**
* @see MdnsSocketProvider
*/
- public MdnsSocketProvider makeMdnsSocketProvider(Context context, Looper looper) {
- return new MdnsSocketProvider(context, looper);
+ public MdnsSocketProvider makeMdnsSocketProvider(@NonNull Context context,
+ @NonNull Looper looper, @NonNull SharedLog sharedLog,
+ @NonNull MdnsSocketProvider.SocketRequestMonitor socketCreationCallback) {
+ return new MdnsSocketProvider(context, looper, sharedLog, socketCreationCallback);
+ }
+
+ /**
+ * @see DeviceConfig#getInt(String, String, int)
+ */
+ public int getDeviceConfigInt(@NonNull String config, int defaultValue) {
+ return DeviceConfig.getInt(NAMESPACE_TETHERING, config, defaultValue);
+ }
+
+ /**
+ * @see Binder#getCallingUid()
+ */
+ public int getCallingUid() {
+ return Binder.getCallingUid();
}
}
@@ -1463,6 +1721,7 @@
private class AdvertiserCallback implements MdnsAdvertiser.AdvertiserCallback {
@Override
public void onRegisterServiceSucceeded(int serviceId, NsdServiceInfo registeredInfo) {
+ mServiceLogs.log("onRegisterServiceSucceeded: serviceId " + serviceId);
final ClientInfo clientInfo = getClientInfoOrLog(serviceId);
if (clientInfo == null) return;
@@ -1503,12 +1762,29 @@
}
}
+ private static class ConnectorArgs {
+ @NonNull public final NsdServiceConnector connector;
+ @NonNull public final INsdManagerCallback callback;
+ public final boolean useJavaBackend;
+ public final int uid;
+
+ ConnectorArgs(@NonNull NsdServiceConnector connector, @NonNull INsdManagerCallback callback,
+ boolean useJavaBackend, int uid) {
+ this.connector = connector;
+ this.callback = callback;
+ this.useJavaBackend = useJavaBackend;
+ this.uid = uid;
+ }
+ }
+
@Override
- public INsdServiceConnector connect(INsdManagerCallback cb) {
+ public INsdServiceConnector connect(INsdManagerCallback cb, boolean useJavaBackend) {
mContext.enforceCallingOrSelfPermission(android.Manifest.permission.INTERNET, "NsdService");
+ if (DBG) Log.d(TAG, "New client connect. useJavaBackend=" + useJavaBackend);
final INsdServiceConnector connector = new NsdServiceConnector();
- mNsdStateMachine.sendMessage(mNsdStateMachine.obtainMessage(
- NsdManager.REGISTER_CLIENT, new Pair<>(connector, cb)));
+ mNsdStateMachine.sendMessage(mNsdStateMachine.obtainMessage(NsdManager.REGISTER_CLIENT,
+ new ConnectorArgs((NsdServiceConnector) connector, cb, useJavaBackend,
+ mDeps.getCallingUid())));
return connector;
}
@@ -1707,15 +1983,19 @@
}
@Override
- public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
- if (!PermissionUtils.checkDumpPermission(mContext, TAG, pw)) return;
+ public void dump(FileDescriptor fd, PrintWriter writer, String[] args) {
+ if (!PermissionUtils.checkDumpPermission(mContext, TAG, writer)) return;
- for (ClientInfo client : mClients.values()) {
- pw.println("Client Info");
- pw.println(client);
- }
-
+ final IndentingPrintWriter pw = new IndentingPrintWriter(writer, " ");
+ // Dump state machine logs
mNsdStateMachine.dump(fd, pw, args);
+
+ // Dump service and clients logs
+ pw.println();
+ pw.println("Logs:");
+ pw.increaseIndent();
+ mServiceLogs.reverseDump(pw);
+ pw.decreaseIndent();
}
private abstract static class ClientRequest {
@@ -1735,18 +2015,34 @@
}
}
- private static class AdvertiserClientRequest extends ClientRequest {
- private AdvertiserClientRequest(int globalId) {
+ private abstract static class JavaBackendClientRequest extends ClientRequest {
+ @Nullable
+ private final Network mRequestedNetwork;
+
+ private JavaBackendClientRequest(int globalId, @Nullable Network requestedNetwork) {
super(globalId);
+ mRequestedNetwork = requestedNetwork;
+ }
+
+ @Nullable
+ public Network getRequestedNetwork() {
+ return mRequestedNetwork;
}
}
- private static class DiscoveryManagerRequest extends ClientRequest {
+ private static class AdvertiserClientRequest extends JavaBackendClientRequest {
+ private AdvertiserClientRequest(int globalId, @Nullable Network requestedNetwork) {
+ super(globalId, requestedNetwork);
+ }
+ }
+
+ private static class DiscoveryManagerRequest extends JavaBackendClientRequest {
@NonNull
private final MdnsListener mListener;
- private DiscoveryManagerRequest(int globalId, @NonNull MdnsListener listener) {
- super(globalId);
+ private DiscoveryManagerRequest(int globalId, @NonNull MdnsListener listener,
+ @Nullable Network requestedNetwork) {
+ super(globalId, requestedNetwork);
mListener = listener;
}
}
@@ -1764,15 +2060,19 @@
// The target SDK of this client < Build.VERSION_CODES.S
private boolean mIsPreSClient = false;
+ private final int mUid;
+ // The flag of using java backend if the client's target SDK >= U
+ private final boolean mUseJavaBackend;
+ // Store client logs
+ private final SharedLog mClientLogs;
- /*** The service that is registered to listen to its updates */
- private NsdServiceInfo mRegisteredService;
- /*** The client id that listen to updates */
- private int mClientIdForServiceUpdates;
-
- private ClientInfo(INsdManagerCallback cb) {
+ private ClientInfo(INsdManagerCallback cb, int uid, boolean useJavaBackend,
+ SharedLog sharedLog) {
mCb = cb;
- if (DBG) Log.d(TAG, "New client");
+ mUid = uid;
+ mUseJavaBackend = useJavaBackend;
+ mClientLogs = sharedLog;
+ mClientLogs.log("New client. useJavaBackend=" + useJavaBackend);
}
@Override
@@ -1780,6 +2080,8 @@
StringBuilder sb = new StringBuilder();
sb.append("mResolvedService ").append(mResolvedService).append("\n");
sb.append("mIsLegacy ").append(mIsPreSClient).append("\n");
+ sb.append("mUseJavaBackend ").append(mUseJavaBackend).append("\n");
+ sb.append("mUid ").append(mUid).append("\n");
for (int i = 0; i < mClientRequests.size(); i++) {
int clientID = mClientRequests.keyAt(i);
sb.append("clientId ")
@@ -1810,6 +2112,7 @@
// Remove any pending requests from the global map when we get rid of a client,
// and send cancellations to the daemon.
private void expungeAllRequests() {
+ mClientLogs.log("Client unregistered. expungeAllRequests!");
// TODO: to keep handler responsive, do not clean all requests for that client at once.
for (int i = 0; i < mClientRequests.size(); i++) {
final int clientId = mClientRequests.keyAt(i);
@@ -1850,6 +2153,26 @@
}
}
mClientRequests.clear();
+ updateMulticastLock();
+ }
+
+ /**
+ * Returns true if this client has any Java backend request that requests one of the given
+ * networks.
+ */
+ boolean hasAnyJavaBackendRequestForNetworks(@NonNull ArraySet<Network> networks) {
+ for (int i = 0; i < mClientRequests.size(); i++) {
+ final ClientRequest req = mClientRequests.valueAt(i);
+ if (!(req instanceof JavaBackendClientRequest)) {
+ continue;
+ }
+ final Network reqNetwork = ((JavaBackendClientRequest) mClientRequests.valueAt(i))
+ .getRequestedNetwork();
+ if (MdnsUtils.isAnyNetworkMatched(reqNetwork, networks)) {
+ return true;
+ }
+ }
+ return false;
}
// mClientRequests is a sparse array of listener id -> ClientRequest. For a given
@@ -1864,16 +2187,8 @@
return -1;
}
- private void maybeNotifyRegisteredServiceLost(@NonNull NsdServiceInfo info) {
- if (mRegisteredService == null) return;
- if (!Objects.equals(mRegisteredService.getServiceName(), info.getServiceName())) return;
- // Resolved services have a leading dot appended at the beginning of their type, but in
- // discovered info it's at the end
- if (!Objects.equals(
- mRegisteredService.getServiceType() + ".", "." + info.getServiceType())) {
- return;
- }
- onServiceUpdatedLost(mClientIdForServiceUpdates);
+ private void log(String message) {
+ mClientLogs.log(message);
}
void onDiscoverServicesStarted(int listenerKey, NsdServiceInfo info) {
diff --git a/service-t/src/com/android/server/connectivity/mdns/AbstractSocketNetlink.java b/service-t/src/com/android/server/connectivity/mdns/AbstractSocketNetlink.java
new file mode 100644
index 0000000..b792e46
--- /dev/null
+++ b/service-t/src/com/android/server/connectivity/mdns/AbstractSocketNetlink.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.connectivity.mdns;
+
+/**
+ * The interface for netlink monitor.
+ */
+public interface AbstractSocketNetlink {
+
+ /**
+ * Returns if the netlink monitor is supported or not. By default, it is not supported.
+ */
+ default boolean isSupported() {
+ return false;
+ }
+
+ /**
+ * Starts the monitor.
+ */
+ default void startMonitoring() {
+ }
+
+ /**
+ * Stops the monitor.
+ */
+ default void stopMonitoring() {
+ }
+}
diff --git a/service-t/src/com/android/server/connectivity/mdns/EnqueueMdnsQueryCallable.java b/service-t/src/com/android/server/connectivity/mdns/EnqueueMdnsQueryCallable.java
index 9a67007..bd4ec20 100644
--- a/service-t/src/com/android/server/connectivity/mdns/EnqueueMdnsQueryCallable.java
+++ b/service-t/src/com/android/server/connectivity/mdns/EnqueueMdnsQueryCallable.java
@@ -18,17 +18,16 @@
import android.annotation.NonNull;
import android.annotation.Nullable;
-import android.net.Network;
import android.text.TextUtils;
import android.util.Log;
import android.util.Pair;
import com.android.server.connectivity.mdns.util.MdnsLogger;
+import com.android.server.connectivity.mdns.util.MdnsUtils;
import java.io.IOException;
import java.lang.ref.WeakReference;
import java.net.DatagramPacket;
-import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.util.ArrayList;
import java.util.Collection;
@@ -70,11 +69,14 @@
private final List<String> subtypes;
private final boolean expectUnicastResponse;
private final int transactionId;
- @Nullable
- private final Network network;
+ @NonNull
+ private final SocketKey socketKey;
private final boolean sendDiscoveryQueries;
@NonNull
private final List<MdnsResponse> servicesToResolve;
+ @NonNull
+ private final MdnsResponseDecoder.Clock clock;
+ private final boolean onlyUseIpv6OnIpv6OnlyNetworks;
EnqueueMdnsQueryCallable(
@NonNull MdnsSocketClientBase requestSender,
@@ -83,18 +85,22 @@
@NonNull Collection<String> subtypes,
boolean expectUnicastResponse,
int transactionId,
- @Nullable Network network,
+ @NonNull SocketKey socketKey,
+ boolean onlyUseIpv6OnIpv6OnlyNetworks,
boolean sendDiscoveryQueries,
- @NonNull Collection<MdnsResponse> servicesToResolve) {
+ @NonNull Collection<MdnsResponse> servicesToResolve,
+ @NonNull MdnsResponseDecoder.Clock clock) {
weakRequestSender = new WeakReference<>(requestSender);
this.packetWriter = packetWriter;
serviceTypeLabels = TextUtils.split(serviceType, "\\.");
this.subtypes = new ArrayList<>(subtypes);
this.expectUnicastResponse = expectUnicastResponse;
this.transactionId = transactionId;
- this.network = network;
+ this.socketKey = socketKey;
+ this.onlyUseIpv6OnIpv6OnlyNetworks = onlyUseIpv6OnIpv6OnlyNetworks;
this.sendDiscoveryQueries = sendDiscoveryQueries;
this.servicesToResolve = new ArrayList<>(servicesToResolve);
+ this.clock = clock;
}
// Incompatible return type for override of Callable#call().
@@ -119,26 +125,33 @@
// List of (name, type) to query
final ArrayList<Pair<String[], Integer>> missingKnownAnswerRecords = new ArrayList<>();
+ final long now = clock.elapsedRealtime();
for (MdnsResponse response : servicesToResolve) {
- // TODO: also send queries to renew record TTL (as per RFC6762 7.1 no need to query
- // if remaining TTL is more than half the original one, so send the queries if half
- // the TTL has passed).
- if (response.isComplete()) continue;
final String[] serviceName = response.getServiceName();
if (serviceName == null) continue;
- if (!response.hasTextRecord()) {
- missingKnownAnswerRecords.add(new Pair<>(serviceName, MdnsRecord.TYPE_TXT));
- }
- if (!response.hasServiceRecord()) {
- missingKnownAnswerRecords.add(new Pair<>(serviceName, MdnsRecord.TYPE_SRV));
- // The hostname is not yet known, so queries for address records will be sent
- // the next time the EnqueueMdnsQueryCallable is enqueued if the reply does not
- // contain them. In practice, advertisers should include the address records
- // when queried for SRV, although it's not a MUST requirement (RFC6763 12.2).
- } else if (!response.hasInet4AddressRecord() && !response.hasInet6AddressRecord()) {
- final String[] host = response.getServiceRecord().getServiceHost();
- missingKnownAnswerRecords.add(new Pair<>(host, MdnsRecord.TYPE_A));
- missingKnownAnswerRecords.add(new Pair<>(host, MdnsRecord.TYPE_AAAA));
+ boolean renewTxt = !response.hasTextRecord() || MdnsUtils.isRecordRenewalNeeded(
+ response.getTextRecord(), now);
+ boolean renewSrv = !response.hasServiceRecord() || MdnsUtils.isRecordRenewalNeeded(
+ response.getServiceRecord(), now);
+ if (renewSrv && renewTxt) {
+ missingKnownAnswerRecords.add(new Pair<>(serviceName, MdnsRecord.TYPE_ANY));
+ } else {
+ if (renewTxt) {
+ missingKnownAnswerRecords.add(new Pair<>(serviceName, MdnsRecord.TYPE_TXT));
+ }
+ if (renewSrv) {
+ missingKnownAnswerRecords.add(new Pair<>(serviceName, MdnsRecord.TYPE_SRV));
+ // The hostname is not yet known, so queries for address records will be
+ // sent the next time the EnqueueMdnsQueryCallable is enqueued if the reply
+ // does not contain them. In practice, advertisers should include the
+ // address records when queried for SRV, although it's not a MUST
+ // requirement (RFC6763 12.2).
+ } else if (!response.hasInet4AddressRecord()
+ && !response.hasInet6AddressRecord()) {
+ final String[] host = response.getServiceRecord().getServiceHost();
+ missingKnownAnswerRecords.add(new Pair<>(host, MdnsRecord.TYPE_A));
+ missingKnownAnswerRecords.add(new Pair<>(host, MdnsRecord.TYPE_AAAA));
+ }
}
}
numQuestions += missingKnownAnswerRecords.size();
@@ -176,24 +189,9 @@
writeQuestion(serviceTypeLabels, MdnsRecord.TYPE_PTR);
}
- if (requestSender instanceof MdnsMultinetworkSocketClient) {
- sendPacketToIpv4AndIpv6(requestSender, MdnsConstants.MDNS_PORT, network);
- for (Integer emulatorPort : castShellEmulatorMdnsPorts) {
- sendPacketToIpv4AndIpv6(requestSender, emulatorPort, network);
- }
- } else if (requestSender instanceof MdnsSocketClient) {
- final MdnsSocketClient client = (MdnsSocketClient) requestSender;
- InetAddress mdnsAddress = MdnsConstants.getMdnsIPv4Address();
- if (client.isOnIPv6OnlyNetwork()) {
- mdnsAddress = MdnsConstants.getMdnsIPv6Address();
- }
-
- sendPacketTo(client, new InetSocketAddress(mdnsAddress, MdnsConstants.MDNS_PORT));
- for (Integer emulatorPort : castShellEmulatorMdnsPorts) {
- sendPacketTo(client, new InetSocketAddress(mdnsAddress, emulatorPort));
- }
- } else {
- throw new IOException("Unknown socket client type: " + requestSender.getClass());
+ sendPacketToIpv4AndIpv6(requestSender, MdnsConstants.MDNS_PORT);
+ for (Integer emulatorPort : castShellEmulatorMdnsPorts) {
+ sendPacketToIpv4AndIpv6(requestSender, emulatorPort);
}
return Pair.create(transactionId, subtypes);
} catch (IOException e) {
@@ -211,38 +209,39 @@
| (expectUnicastResponse ? MdnsConstants.QCLASS_UNICAST : 0));
}
- private void sendPacketTo(MdnsSocketClientBase requestSender, InetSocketAddress address)
+ private void sendPacket(MdnsSocketClientBase requestSender, InetSocketAddress address)
throws IOException {
DatagramPacket packet = packetWriter.getPacket(address);
if (expectUnicastResponse) {
- requestSender.sendUnicastPacket(packet);
+ if (requestSender instanceof MdnsMultinetworkSocketClient) {
+ ((MdnsMultinetworkSocketClient) requestSender).sendPacketRequestingUnicastResponse(
+ packet, socketKey, onlyUseIpv6OnIpv6OnlyNetworks);
+ } else {
+ requestSender.sendPacketRequestingUnicastResponse(
+ packet, onlyUseIpv6OnIpv6OnlyNetworks);
+ }
} else {
- requestSender.sendMulticastPacket(packet);
+ if (requestSender instanceof MdnsMultinetworkSocketClient) {
+ ((MdnsMultinetworkSocketClient) requestSender)
+ .sendPacketRequestingMulticastResponse(
+ packet, socketKey, onlyUseIpv6OnIpv6OnlyNetworks);
+ } else {
+ requestSender.sendPacketRequestingMulticastResponse(
+ packet, onlyUseIpv6OnIpv6OnlyNetworks);
+ }
}
}
- private void sendPacketFromNetwork(MdnsSocketClientBase requestSender,
- InetSocketAddress address, Network network)
- throws IOException {
- DatagramPacket packet = packetWriter.getPacket(address);
- if (expectUnicastResponse) {
- requestSender.sendUnicastPacket(packet, network);
- } else {
- requestSender.sendMulticastPacket(packet, network);
- }
- }
-
- private void sendPacketToIpv4AndIpv6(MdnsSocketClientBase requestSender, int port,
- Network network) {
+ private void sendPacketToIpv4AndIpv6(MdnsSocketClientBase requestSender, int port) {
try {
- sendPacketFromNetwork(requestSender,
- new InetSocketAddress(MdnsConstants.getMdnsIPv4Address(), port), network);
+ sendPacket(requestSender,
+ new InetSocketAddress(MdnsConstants.getMdnsIPv4Address(), port));
} catch (IOException e) {
Log.i(TAG, "Can't send packet to IPv4", e);
}
try {
- sendPacketFromNetwork(requestSender,
- new InetSocketAddress(MdnsConstants.getMdnsIPv6Address(), port), network);
+ sendPacket(requestSender,
+ new InetSocketAddress(MdnsConstants.getMdnsIPv6Address(), port));
} catch (IOException e) {
Log.i(TAG, "Can't send packet to IPv6", e);
}
diff --git a/service-t/src/com/android/server/connectivity/mdns/ExecutorProvider.java b/service-t/src/com/android/server/connectivity/mdns/ExecutorProvider.java
index 72b65e0..0eebc61 100644
--- a/service-t/src/com/android/server/connectivity/mdns/ExecutorProvider.java
+++ b/service-t/src/com/android/server/connectivity/mdns/ExecutorProvider.java
@@ -42,6 +42,9 @@
/** Shuts down all the created {@link ScheduledExecutorService} instances. */
public void shutdownAll() {
for (ScheduledExecutorService executor : serviceTypeClientSchedulerExecutors) {
+ if (executor.isShutdown()) {
+ continue;
+ }
executor.shutdownNow();
}
}
diff --git a/service-t/src/com/android/server/connectivity/mdns/MdnsAdvertiser.java b/service-t/src/com/android/server/connectivity/mdns/MdnsAdvertiser.java
index ec3e997..158d7a3 100644
--- a/service-t/src/com/android/server/connectivity/mdns/MdnsAdvertiser.java
+++ b/service-t/src/com/android/server/connectivity/mdns/MdnsAdvertiser.java
@@ -16,6 +16,8 @@
package com.android.server.connectivity.mdns;
+import static com.android.server.connectivity.mdns.MdnsRecord.MAX_LABEL_LENGTH;
+
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.net.LinkAddress;
@@ -28,6 +30,8 @@
import android.util.SparseArray;
import com.android.internal.annotations.VisibleForTesting;
+import com.android.net.module.util.SharedLog;
+import com.android.server.connectivity.mdns.util.MdnsUtils;
import java.util.List;
import java.util.Map;
@@ -47,6 +51,7 @@
// Top-level domain for link-local queries, as per RFC6762 3.
private static final String LOCAL_TLD = "local";
+
private final Looper mLooper;
private final AdvertiserCallback mCb;
@@ -65,6 +70,7 @@
private final Dependencies mDeps;
private String[] mDeviceHostName;
+ @NonNull private final SharedLog mSharedLog;
/**
* Dependencies for {@link MdnsAdvertiser}, useful for testing.
@@ -78,11 +84,11 @@
@NonNull List<LinkAddress> initialAddresses,
@NonNull Looper looper, @NonNull byte[] packetCreationBuffer,
@NonNull MdnsInterfaceAdvertiser.Callback cb,
- @NonNull String[] deviceHostName) {
+ @NonNull String[] deviceHostName,
+ @NonNull SharedLog sharedLog) {
// Note NetworkInterface is final and not mockable
- final String logTag = socket.getInterface().getName();
- return new MdnsInterfaceAdvertiser(logTag, socket, initialAddresses, looper,
- packetCreationBuffer, cb, deviceHostName);
+ return new MdnsInterfaceAdvertiser(socket, initialAddresses, looper,
+ packetCreationBuffer, cb, deviceHostName, sharedLog);
}
/**
@@ -129,9 +135,7 @@
@Override
public void onServiceConflict(@NonNull MdnsInterfaceAdvertiser advertiser, int serviceId) {
- if (DBG) {
- Log.v(TAG, "Found conflict, restarted probing for service " + serviceId);
- }
+ mSharedLog.i("Found conflict, restarted probing for service " + serviceId);
final Registration registration = mRegistrations.get(serviceId);
if (registration == null) return;
@@ -249,8 +253,9 @@
int getConflictingService(@NonNull NsdServiceInfo info) {
for (int i = 0; i < mPendingRegistrations.size(); i++) {
final NsdServiceInfo other = mPendingRegistrations.valueAt(i).getServiceInfo();
- if (info.getServiceName().equals(other.getServiceName())
- && info.getServiceType().equals(other.getServiceType())) {
+ if (MdnsUtils.equalsIgnoreDnsCase(info.getServiceName(), other.getServiceName())
+ && MdnsUtils.equalsIgnoreDnsCase(info.getServiceType(),
+ other.getServiceType())) {
return mPendingRegistrations.keyAt(i);
}
}
@@ -266,7 +271,8 @@
mPendingRegistrations.put(id, registration);
for (int i = 0; i < mAdvertisers.size(); i++) {
try {
- mAdvertisers.valueAt(i).addService(id, registration.getServiceInfo());
+ mAdvertisers.valueAt(i).addService(
+ id, registration.getServiceInfo(), registration.getSubtype());
} catch (NameConflictException e) {
Log.wtf(TAG, "Name conflict adding services that should have unique names", e);
}
@@ -281,21 +287,23 @@
}
@Override
- public void onSocketCreated(@NonNull Network network,
+ public void onSocketCreated(@NonNull SocketKey socketKey,
@NonNull MdnsInterfaceSocket socket,
@NonNull List<LinkAddress> addresses) {
MdnsInterfaceAdvertiser advertiser = mAllAdvertisers.get(socket);
if (advertiser == null) {
advertiser = mDeps.makeAdvertiser(socket, addresses, mLooper, mPacketCreationBuffer,
- mInterfaceAdvertiserCb, mDeviceHostName);
+ mInterfaceAdvertiserCb, mDeviceHostName,
+ mSharedLog.forSubComponent(socket.getInterface().getName()));
mAllAdvertisers.put(socket, advertiser);
advertiser.start();
}
mAdvertisers.put(socket, advertiser);
for (int i = 0; i < mPendingRegistrations.size(); i++) {
+ final Registration registration = mPendingRegistrations.valueAt(i);
try {
advertiser.addService(mPendingRegistrations.keyAt(i),
- mPendingRegistrations.valueAt(i).getServiceInfo());
+ registration.getServiceInfo(), registration.getSubtype());
} catch (NameConflictException e) {
Log.wtf(TAG, "Name conflict adding services that should have unique names", e);
}
@@ -303,14 +311,14 @@
}
@Override
- public void onInterfaceDestroyed(@NonNull Network network,
+ public void onInterfaceDestroyed(@NonNull SocketKey socketKey,
@NonNull MdnsInterfaceSocket socket) {
final MdnsInterfaceAdvertiser advertiser = mAdvertisers.get(socket);
if (advertiser != null) advertiser.destroyNow();
}
@Override
- public void onAddressesChanged(@NonNull Network network,
+ public void onAddressesChanged(@NonNull SocketKey socketKey,
@NonNull MdnsInterfaceSocket socket, @NonNull List<LinkAddress> addresses) {
final MdnsInterfaceAdvertiser advertiser = mAdvertisers.get(socket);
if (advertiser != null) advertiser.updateAddresses(addresses);
@@ -324,10 +332,13 @@
private int mConflictCount;
@NonNull
private NsdServiceInfo mServiceInfo;
+ @Nullable
+ private final String mSubtype;
- private Registration(@NonNull NsdServiceInfo serviceInfo) {
+ private Registration(@NonNull NsdServiceInfo serviceInfo, @Nullable String subtype) {
this.mOriginalName = serviceInfo.getServiceName();
this.mServiceInfo = serviceInfo;
+ this.mSubtype = subtype;
}
/**
@@ -358,7 +369,7 @@
// "Name (2)", then "Name (3)" etc.
// TODO: use a hidden method in NsdServiceInfo once MdnsAdvertiser is moved to service-t
final NsdServiceInfo newInfo = new NsdServiceInfo();
- newInfo.setServiceName(mOriginalName + " (" + (mConflictCount + renameCount + 1) + ")");
+ newInfo.setServiceName(getUpdatedServiceName(renameCount));
newInfo.setServiceType(mServiceInfo.getServiceType());
for (Map.Entry<String, byte[]> attr : mServiceInfo.getAttributes().entrySet()) {
newInfo.setAttribute(attr.getKey(),
@@ -371,10 +382,22 @@
return newInfo;
}
+ private String getUpdatedServiceName(int renameCount) {
+ final String suffix = " (" + (mConflictCount + renameCount + 1) + ")";
+ final String truncatedServiceName = MdnsUtils.truncateServiceName(mOriginalName,
+ MAX_LABEL_LENGTH - suffix.length());
+ return truncatedServiceName + suffix;
+ }
+
@NonNull
public NsdServiceInfo getServiceInfo() {
return mServiceInfo;
}
+
+ @Nullable
+ public String getSubtype() {
+ return mSubtype;
+ }
}
/**
@@ -405,18 +428,20 @@
}
public MdnsAdvertiser(@NonNull Looper looper, @NonNull MdnsSocketProvider socketProvider,
- @NonNull AdvertiserCallback cb) {
- this(looper, socketProvider, cb, new Dependencies());
+ @NonNull AdvertiserCallback cb, @NonNull SharedLog sharedLog) {
+ this(looper, socketProvider, cb, new Dependencies(), sharedLog);
}
@VisibleForTesting
MdnsAdvertiser(@NonNull Looper looper, @NonNull MdnsSocketProvider socketProvider,
- @NonNull AdvertiserCallback cb, @NonNull Dependencies deps) {
+ @NonNull AdvertiserCallback cb, @NonNull Dependencies deps,
+ @NonNull SharedLog sharedLog) {
mLooper = looper;
mCb = cb;
mSocketProvider = socketProvider;
mDeps = deps;
mDeviceHostName = deps.generateHostname();
+ mSharedLog = sharedLog;
}
private void checkThread() {
@@ -429,8 +454,9 @@
* Add a service to advertise.
* @param id A unique ID for the service.
* @param service The service info to advertise.
+ * @param subtype An optional subtype to advertise the service with.
*/
- public void addService(int id, NsdServiceInfo service) {
+ public void addService(int id, NsdServiceInfo service, @Nullable String subtype) {
checkThread();
if (mRegistrations.get(id) != null) {
Log.e(TAG, "Adding duplicate registration for " + service);
@@ -439,12 +465,10 @@
return;
}
- if (DBG) {
- Log.i(TAG, "Adding service " + service + " with ID " + id);
- }
+ mSharedLog.i("Adding service " + service + " with ID " + id + " and subtype " + subtype);
final Network network = service.getNetwork();
- final Registration registration = new Registration(service);
+ final Registration registration = new Registration(service, subtype);
final BiPredicate<Network, InterfaceAdvertiserRequest> checkConflictFilter;
if (network == null) {
// If registering on all networks, no advertiser must have conflicts
@@ -473,9 +497,7 @@
public void removeService(int id) {
checkThread();
if (!mRegistrations.contains(id)) return;
- if (DBG) {
- Log.i(TAG, "Removing service with ID " + id);
- }
+ mSharedLog.i("Removing service with ID " + id);
for (int i = mAdvertiserRequests.size() - 1; i >= 0; i--) {
final InterfaceAdvertiserRequest advertiser = mAdvertiserRequests.valueAt(i);
advertiser.removeService(id);
diff --git a/service-t/src/com/android/server/connectivity/mdns/MdnsConfigs.java b/service-t/src/com/android/server/connectivity/mdns/MdnsConfigs.java
index 75c7e6c..f5e7790 100644
--- a/service-t/src/com/android/server/connectivity/mdns/MdnsConfigs.java
+++ b/service-t/src/com/android/server/connectivity/mdns/MdnsConfigs.java
@@ -51,7 +51,7 @@
}
public static boolean useSessionIdToScheduleMdnsTask() {
- return false;
+ return true;
}
public static boolean shouldCancelScanTaskWhenFutureIsNull() {
@@ -94,10 +94,6 @@
return false;
}
- public static boolean allowSearchOptionsToRemoveExpiredService() {
- return false;
- }
-
public static boolean allowNetworkInterfaceIndexPropagation() {
return true;
}
diff --git a/service-t/src/com/android/server/connectivity/mdns/MdnsConstants.java b/service-t/src/com/android/server/connectivity/mdns/MdnsConstants.java
index f0e1717..ce5f540 100644
--- a/service-t/src/com/android/server/connectivity/mdns/MdnsConstants.java
+++ b/service-t/src/com/android/server/connectivity/mdns/MdnsConstants.java
@@ -16,6 +16,8 @@
package com.android.server.connectivity.mdns;
+import static com.android.internal.annotations.VisibleForTesting.Visibility.PACKAGE;
+
import static java.nio.charset.StandardCharsets.UTF_8;
import com.android.internal.annotations.VisibleForTesting;
@@ -25,7 +27,7 @@
import java.nio.charset.Charset;
/** mDNS-related constants. */
-@VisibleForTesting
+@VisibleForTesting(visibility = PACKAGE)
public final class MdnsConstants {
public static final int MDNS_PORT = 5353;
// Flags word format is:
diff --git a/service-t/src/com/android/server/connectivity/mdns/MdnsDiscoveryManager.java b/service-t/src/com/android/server/connectivity/mdns/MdnsDiscoveryManager.java
index 67059e7..05b1dcf 100644
--- a/service-t/src/com/android/server/connectivity/mdns/MdnsDiscoveryManager.java
+++ b/service-t/src/com/android/server/connectivity/mdns/MdnsDiscoveryManager.java
@@ -16,19 +16,25 @@
package com.android.server.connectivity.mdns;
+import static com.android.server.connectivity.mdns.util.MdnsUtils.ensureRunningOnHandlerThread;
+
import android.Manifest.permission;
import android.annotation.NonNull;
+import android.annotation.Nullable;
import android.annotation.RequiresPermission;
-import android.net.Network;
-import android.text.TextUtils;
+import android.os.Handler;
+import android.os.HandlerThread;
import android.util.ArrayMap;
import android.util.Log;
+import android.util.Pair;
import com.android.internal.annotations.VisibleForTesting;
-import com.android.server.connectivity.mdns.util.MdnsLogger;
+import com.android.net.module.util.SharedLog;
+import com.android.server.connectivity.mdns.util.MdnsUtils;
import java.io.IOException;
-import java.util.Map;
+import java.util.ArrayList;
+import java.util.List;
/**
* This class keeps tracking the set of registered {@link MdnsServiceBrowserListener} instances, and
@@ -37,17 +43,104 @@
public class MdnsDiscoveryManager implements MdnsSocketClientBase.Callback {
private static final String TAG = MdnsDiscoveryManager.class.getSimpleName();
public static final boolean DBG = Log.isLoggable(TAG, Log.DEBUG);
- private static final MdnsLogger LOGGER = new MdnsLogger("MdnsDiscoveryManager");
private final ExecutorProvider executorProvider;
private final MdnsSocketClientBase socketClient;
+ @NonNull private final SharedLog sharedLog;
- private final Map<String, MdnsServiceTypeClient> serviceTypeClients = new ArrayMap<>();
+ @NonNull private final PerSocketServiceTypeClients perSocketServiceTypeClients;
+ @NonNull private final Handler handler;
+ @Nullable private final HandlerThread handlerThread;
+
+ private static class PerSocketServiceTypeClients {
+ private final ArrayMap<Pair<String, SocketKey>, MdnsServiceTypeClient> clients =
+ new ArrayMap<>();
+
+ public void put(@NonNull String serviceType, @NonNull SocketKey socketKey,
+ @NonNull MdnsServiceTypeClient client) {
+ final String dnsLowerServiceType = MdnsUtils.toDnsLowerCase(serviceType);
+ final Pair<String, SocketKey> perSocketServiceType = new Pair<>(dnsLowerServiceType,
+ socketKey);
+ clients.put(perSocketServiceType, client);
+ }
+
+ @Nullable
+ public MdnsServiceTypeClient get(
+ @NonNull String serviceType, @NonNull SocketKey socketKey) {
+ final String dnsLowerServiceType = MdnsUtils.toDnsLowerCase(serviceType);
+ final Pair<String, SocketKey> perSocketServiceType = new Pair<>(dnsLowerServiceType,
+ socketKey);
+ return clients.getOrDefault(perSocketServiceType, null);
+ }
+
+ public List<MdnsServiceTypeClient> getByServiceType(@NonNull String serviceType) {
+ final String dnsLowerServiceType = MdnsUtils.toDnsLowerCase(serviceType);
+ final List<MdnsServiceTypeClient> list = new ArrayList<>();
+ for (int i = 0; i < clients.size(); i++) {
+ final Pair<String, SocketKey> perSocketServiceType = clients.keyAt(i);
+ if (dnsLowerServiceType.equals(perSocketServiceType.first)) {
+ list.add(clients.valueAt(i));
+ }
+ }
+ return list;
+ }
+
+ public List<MdnsServiceTypeClient> getBySocketKey(@NonNull SocketKey socketKey) {
+ final List<MdnsServiceTypeClient> list = new ArrayList<>();
+ for (int i = 0; i < clients.size(); i++) {
+ final Pair<String, SocketKey> perSocketServiceType = clients.keyAt(i);
+ if (socketKey.equals(perSocketServiceType.second)) {
+ list.add(clients.valueAt(i));
+ }
+ }
+ return list;
+ }
+
+ public List<MdnsServiceTypeClient> getAllMdnsServiceTypeClient() {
+ return new ArrayList<>(clients.values());
+ }
+
+ public void remove(@NonNull MdnsServiceTypeClient client) {
+ final int index = clients.indexOfValue(client);
+ clients.removeAt(index);
+ }
+
+ public boolean isEmpty() {
+ return clients.isEmpty();
+ }
+ }
public MdnsDiscoveryManager(@NonNull ExecutorProvider executorProvider,
- @NonNull MdnsSocketClientBase socketClient) {
+ @NonNull MdnsSocketClientBase socketClient, @NonNull SharedLog sharedLog) {
this.executorProvider = executorProvider;
this.socketClient = socketClient;
+ this.sharedLog = sharedLog;
+ this.perSocketServiceTypeClients = new PerSocketServiceTypeClients();
+ if (socketClient.getLooper() != null) {
+ this.handlerThread = null;
+ this.handler = new Handler(socketClient.getLooper());
+ } else {
+ this.handlerThread = new HandlerThread(MdnsDiscoveryManager.class.getSimpleName());
+ this.handlerThread.start();
+ this.handler = new Handler(handlerThread.getLooper());
+ }
+ }
+
+ private void checkAndRunOnHandlerThread(@NonNull Runnable function) {
+ if (this.handlerThread == null) {
+ function.run();
+ } else {
+ handler.post(function);
+ }
+ }
+
+ /**
+ * Do the cleanup of the MdnsDiscoveryManager
+ */
+ public void shutDown() {
+ if (this.handlerThread != null) {
+ this.handlerThread.quitSafely();
+ }
}
/**
@@ -60,33 +153,57 @@
* serviceType}.
*/
@RequiresPermission(permission.CHANGE_WIFI_MULTICAST_STATE)
- public synchronized void registerListener(
+ public void registerListener(
@NonNull String serviceType,
@NonNull MdnsServiceBrowserListener listener,
@NonNull MdnsSearchOptions searchOptions) {
- LOGGER.log(
- "Registering listener for subtypes: %s",
- TextUtils.join(",", searchOptions.getSubtypes()));
- if (serviceTypeClients.isEmpty()) {
+ sharedLog.i("Registering listener for serviceType: " + serviceType);
+ checkAndRunOnHandlerThread(() ->
+ handleRegisterListener(serviceType, listener, searchOptions));
+ }
+
+ private void handleRegisterListener(
+ @NonNull String serviceType,
+ @NonNull MdnsServiceBrowserListener listener,
+ @NonNull MdnsSearchOptions searchOptions) {
+ if (perSocketServiceTypeClients.isEmpty()) {
// First listener. Starts the socket client.
try {
socketClient.startDiscovery();
} catch (IOException e) {
- LOGGER.e("Failed to start discover.", e);
+ sharedLog.e("Failed to start discover.", e);
return;
}
}
// Request the network for discovery.
- socketClient.notifyNetworkRequested(listener, searchOptions.getNetwork());
+ socketClient.notifyNetworkRequested(listener, searchOptions.getNetwork(),
+ new MdnsSocketClientBase.SocketCreationCallback() {
+ @Override
+ public void onSocketCreated(@NonNull SocketKey socketKey) {
+ ensureRunningOnHandlerThread(handler);
+ // All listeners of the same service types shares the same
+ // MdnsServiceTypeClient.
+ MdnsServiceTypeClient serviceTypeClient =
+ perSocketServiceTypeClients.get(serviceType, socketKey);
+ if (serviceTypeClient == null) {
+ serviceTypeClient = createServiceTypeClient(serviceType, socketKey);
+ perSocketServiceTypeClients.put(serviceType, socketKey,
+ serviceTypeClient);
+ }
+ serviceTypeClient.startSendAndReceive(listener, searchOptions);
+ }
- // All listeners of the same service types shares the same MdnsServiceTypeClient.
- MdnsServiceTypeClient serviceTypeClient = serviceTypeClients.get(serviceType);
- if (serviceTypeClient == null) {
- serviceTypeClient = createServiceTypeClient(serviceType);
- serviceTypeClients.put(serviceType, serviceTypeClient);
- }
- // TODO(b/264634275): Wait for a socket to be created before sending packets.
- serviceTypeClient.startSendAndReceive(listener, searchOptions);
+ @Override
+ public void onSocketDestroyed(@NonNull SocketKey socketKey) {
+ ensureRunningOnHandlerThread(handler);
+ final MdnsServiceTypeClient serviceTypeClient =
+ perSocketServiceTypeClients.get(serviceType, socketKey);
+ if (serviceTypeClient == null) return;
+ // Notify all listeners that all services are removed from this socket.
+ serviceTypeClient.notifySocketDestroyed();
+ perSocketServiceTypeClients.remove(serviceTypeClient);
+ }
+ });
}
/**
@@ -97,46 +214,81 @@
* @param listener The {@link MdnsServiceBrowserListener} listener.
*/
@RequiresPermission(permission.CHANGE_WIFI_MULTICAST_STATE)
- public synchronized void unregisterListener(
+ public void unregisterListener(
@NonNull String serviceType, @NonNull MdnsServiceBrowserListener listener) {
- LOGGER.log("Unregistering listener for service type: %s", serviceType);
- if (DBG) Log.d(TAG, "Unregistering listener for serviceType:" + serviceType);
- MdnsServiceTypeClient serviceTypeClient = serviceTypeClients.get(serviceType);
- if (serviceTypeClient == null) {
- return;
- }
- if (serviceTypeClient.stopSendAndReceive(listener)) {
- // No listener is registered for the service type anymore, remove it from the list of
- // the service type clients.
- serviceTypeClients.remove(serviceType);
- if (serviceTypeClients.isEmpty()) {
- // No discovery request. Stops the socket client.
- socketClient.stopDiscovery();
- }
- }
+ sharedLog.i("Unregistering listener for serviceType:" + serviceType);
+ checkAndRunOnHandlerThread(() -> handleUnregisterListener(serviceType, listener));
+ }
+
+ private void handleUnregisterListener(
+ @NonNull String serviceType, @NonNull MdnsServiceBrowserListener listener) {
// Unrequested the network.
socketClient.notifyNetworkUnrequested(listener);
- }
- @Override
- public synchronized void onResponseReceived(@NonNull MdnsPacket packet,
- int interfaceIndex, Network network) {
- for (MdnsServiceTypeClient serviceTypeClient : serviceTypeClients.values()) {
- serviceTypeClient.processResponse(packet, interfaceIndex, network);
+ final List<MdnsServiceTypeClient> serviceTypeClients =
+ perSocketServiceTypeClients.getByServiceType(serviceType);
+ if (serviceTypeClients.isEmpty()) {
+ return;
+ }
+ for (int i = 0; i < serviceTypeClients.size(); i++) {
+ final MdnsServiceTypeClient serviceTypeClient = serviceTypeClients.get(i);
+ if (serviceTypeClient.stopSendAndReceive(listener)) {
+ // No listener is registered for the service type anymore, remove it from the list
+ // of the service type clients.
+ perSocketServiceTypeClients.remove(serviceTypeClient);
+ }
+ }
+ if (perSocketServiceTypeClients.isEmpty()) {
+ // No discovery request. Stops the socket client.
+ sharedLog.i("All service type listeners unregistered; stopping discovery");
+ socketClient.stopDiscovery();
}
}
@Override
- public synchronized void onFailedToParseMdnsResponse(int receivedPacketNumber, int errorCode) {
- for (MdnsServiceTypeClient serviceTypeClient : serviceTypeClients.values()) {
+ public void onResponseReceived(@NonNull MdnsPacket packet, @NonNull SocketKey socketKey) {
+ checkAndRunOnHandlerThread(() ->
+ handleOnResponseReceived(packet, socketKey));
+ }
+
+ private void handleOnResponseReceived(@NonNull MdnsPacket packet,
+ @NonNull SocketKey socketKey) {
+ for (MdnsServiceTypeClient serviceTypeClient : getMdnsServiceTypeClient(socketKey)) {
+ serviceTypeClient.processResponse(packet, socketKey);
+ }
+ }
+
+ private List<MdnsServiceTypeClient> getMdnsServiceTypeClient(@NonNull SocketKey socketKey) {
+ if (socketClient.supportsRequestingSpecificNetworks()) {
+ return perSocketServiceTypeClients.getBySocketKey(socketKey);
+ } else {
+ return perSocketServiceTypeClients.getAllMdnsServiceTypeClient();
+ }
+ }
+
+ @Override
+ public void onFailedToParseMdnsResponse(int receivedPacketNumber, int errorCode,
+ @NonNull SocketKey socketKey) {
+ checkAndRunOnHandlerThread(() ->
+ handleOnFailedToParseMdnsResponse(receivedPacketNumber, errorCode, socketKey));
+ }
+
+ private void handleOnFailedToParseMdnsResponse(int receivedPacketNumber, int errorCode,
+ @NonNull SocketKey socketKey) {
+ for (MdnsServiceTypeClient serviceTypeClient : getMdnsServiceTypeClient(socketKey)) {
serviceTypeClient.onFailedToParseMdnsResponse(receivedPacketNumber, errorCode);
}
}
@VisibleForTesting
- MdnsServiceTypeClient createServiceTypeClient(@NonNull String serviceType) {
+ MdnsServiceTypeClient createServiceTypeClient(@NonNull String serviceType,
+ @NonNull SocketKey socketKey) {
+ sharedLog.log("createServiceTypeClient for type:" + serviceType + " " + socketKey);
+ final String tag = serviceType + "-" + socketKey.getNetwork()
+ + "/" + socketKey.getInterfaceIndex();
return new MdnsServiceTypeClient(
serviceType, socketClient,
- executorProvider.newServiceTypeClientSchedulerExecutor());
+ executorProvider.newServiceTypeClientSchedulerExecutor(), socketKey,
+ sharedLog.forSubComponent(tag));
}
}
\ No newline at end of file
diff --git a/service-t/src/com/android/server/connectivity/mdns/MdnsInterfaceAdvertiser.java b/service-t/src/com/android/server/connectivity/mdns/MdnsInterfaceAdvertiser.java
index 79cddce..724a704 100644
--- a/service-t/src/com/android/server/connectivity/mdns/MdnsInterfaceAdvertiser.java
+++ b/service-t/src/com/android/server/connectivity/mdns/MdnsInterfaceAdvertiser.java
@@ -26,6 +26,7 @@
import com.android.internal.annotations.VisibleForTesting;
import com.android.net.module.util.HexDump;
+import com.android.net.module.util.SharedLog;
import com.android.server.connectivity.mdns.MdnsAnnouncer.BaseAnnouncementInfo;
import com.android.server.connectivity.mdns.MdnsPacketRepeater.PacketRepeaterCallback;
@@ -62,6 +63,9 @@
@NonNull
private final MdnsReplySender mReplySender;
+ @NonNull
+ private final SharedLog mSharedLog;
+
/**
* Callbacks called by {@link MdnsInterfaceAdvertiser} to report status updates.
*/
@@ -96,15 +100,13 @@
@Override
public void onFinished(MdnsProber.ProbingInfo info) {
final MdnsAnnouncer.AnnouncementInfo announcementInfo;
- if (DBG) {
- Log.v(mTag, "Probing finished for service " + info.getServiceId());
- }
+ mSharedLog.i("Probing finished for service " + info.getServiceId());
mCbHandler.post(() -> mCb.onRegisterServiceSucceeded(
MdnsInterfaceAdvertiser.this, info.getServiceId()));
try {
announcementInfo = mRecordRepository.onProbingSucceeded(info);
} catch (IOException e) {
- Log.e(mTag, "Error building announcements", e);
+ mSharedLog.e("Error building announcements", e);
return;
}
@@ -168,28 +170,30 @@
}
}
- public MdnsInterfaceAdvertiser(@NonNull String logTag,
- @NonNull MdnsInterfaceSocket socket, @NonNull List<LinkAddress> initialAddresses,
- @NonNull Looper looper, @NonNull byte[] packetCreationBuffer, @NonNull Callback cb,
- @NonNull String[] deviceHostName) {
- this(logTag, socket, initialAddresses, looper, packetCreationBuffer, cb,
- new Dependencies(), deviceHostName);
+ public MdnsInterfaceAdvertiser(@NonNull MdnsInterfaceSocket socket,
+ @NonNull List<LinkAddress> initialAddresses, @NonNull Looper looper,
+ @NonNull byte[] packetCreationBuffer, @NonNull Callback cb,
+ @NonNull String[] deviceHostName, @NonNull SharedLog sharedLog) {
+ this(socket, initialAddresses, looper, packetCreationBuffer, cb,
+ new Dependencies(), deviceHostName, sharedLog);
}
- public MdnsInterfaceAdvertiser(@NonNull String logTag,
- @NonNull MdnsInterfaceSocket socket, @NonNull List<LinkAddress> initialAddresses,
- @NonNull Looper looper, @NonNull byte[] packetCreationBuffer, @NonNull Callback cb,
- @NonNull Dependencies deps, @NonNull String[] deviceHostName) {
- mTag = MdnsInterfaceAdvertiser.class.getSimpleName() + "/" + logTag;
+ public MdnsInterfaceAdvertiser(@NonNull MdnsInterfaceSocket socket,
+ @NonNull List<LinkAddress> initialAddresses, @NonNull Looper looper,
+ @NonNull byte[] packetCreationBuffer, @NonNull Callback cb, @NonNull Dependencies deps,
+ @NonNull String[] deviceHostName, @NonNull SharedLog sharedLog) {
+ mTag = MdnsInterfaceAdvertiser.class.getSimpleName() + "/" + sharedLog.getTag();
mRecordRepository = deps.makeRecordRepository(looper, deviceHostName);
mRecordRepository.updateAddresses(initialAddresses);
mSocket = socket;
mCb = cb;
mCbHandler = new Handler(looper);
- mReplySender = deps.makeReplySender(logTag, looper, socket, packetCreationBuffer);
- mAnnouncer = deps.makeMdnsAnnouncer(logTag, looper, mReplySender,
+ mReplySender = deps.makeReplySender(sharedLog.getTag(), looper, socket,
+ packetCreationBuffer);
+ mAnnouncer = deps.makeMdnsAnnouncer(sharedLog.getTag(), looper, mReplySender,
mAnnouncingCallback);
- mProber = deps.makeMdnsProber(logTag, looper, mReplySender, mProbingCallback);
+ mProber = deps.makeMdnsProber(sharedLog.getTag(), looper, mReplySender, mProbingCallback);
+ mSharedLog = sharedLog;
}
/**
@@ -208,15 +212,14 @@
*
* @throws NameConflictException There is already a service being advertised with that name.
*/
- public void addService(int id, NsdServiceInfo service) throws NameConflictException {
- final int replacedExitingService = mRecordRepository.addService(id, service);
+ public void addService(int id, NsdServiceInfo service, @Nullable String subtype)
+ throws NameConflictException {
+ final int replacedExitingService = mRecordRepository.addService(id, service, subtype);
// Cancel announcements for the existing service. This only happens for exiting services
// (so cancelling exiting announcements), as per RecordRepository.addService.
if (replacedExitingService >= 0) {
- if (DBG) {
- Log.d(mTag, "Service " + replacedExitingService
- + " getting re-added, cancelling exit announcements");
- }
+ mSharedLog.i("Service " + replacedExitingService
+ + " getting re-added, cancelling exit announcements");
mAnnouncer.stop(replacedExitingService);
}
mProber.startProbing(mRecordRepository.setServiceProbing(id));
diff --git a/service-t/src/com/android/server/connectivity/mdns/MdnsMultinetworkSocketClient.java b/service-t/src/com/android/server/connectivity/mdns/MdnsMultinetworkSocketClient.java
index 93972d9..d1fa57c 100644
--- a/service-t/src/com/android/server/connectivity/mdns/MdnsMultinetworkSocketClient.java
+++ b/service-t/src/com/android/server/connectivity/mdns/MdnsMultinetworkSocketClient.java
@@ -16,8 +16,7 @@
package com.android.server.connectivity.mdns;
-import static com.android.server.connectivity.mdns.MdnsSocketProvider.ensureRunningOnHandlerThread;
-import static com.android.server.connectivity.mdns.MdnsSocketProvider.isNetworkMatched;
+import static com.android.server.connectivity.mdns.util.MdnsUtils.ensureRunningOnHandlerThread;
import android.annotation.NonNull;
import android.annotation.Nullable;
@@ -34,7 +33,7 @@
import java.net.Inet6Address;
import java.net.InetSocketAddress;
import java.util.List;
-import java.util.Map;
+import java.util.Objects;
/**
* The {@link MdnsMultinetworkSocketClient} manages the multinetwork socket for mDns
@@ -48,9 +47,8 @@
@NonNull private final Handler mHandler;
@NonNull private final MdnsSocketProvider mSocketProvider;
- private final Map<MdnsServiceBrowserListener, InterfaceSocketCallback> mRequestedNetworks =
+ private final ArrayMap<MdnsServiceBrowserListener, InterfaceSocketCallback> mRequestedNetworks =
new ArrayMap<>();
- private final ArrayMap<MdnsInterfaceSocket, Network> mActiveNetworkSockets = new ArrayMap<>();
private final ArrayMap<MdnsInterfaceSocket, ReadPacketHandler> mSocketPacketHandlers =
new ArrayMap<>();
private MdnsSocketClientBase.Callback mCallback = null;
@@ -63,41 +61,90 @@
}
private class InterfaceSocketCallback implements MdnsSocketProvider.SocketCallback {
+ @NonNull
+ private final SocketCreationCallback mSocketCreationCallback;
+ @NonNull
+ private final ArrayMap<MdnsInterfaceSocket, SocketKey> mActiveSockets =
+ new ArrayMap<>();
+
+ InterfaceSocketCallback(SocketCreationCallback socketCreationCallback) {
+ mSocketCreationCallback = socketCreationCallback;
+ }
+
@Override
- public void onSocketCreated(@NonNull Network network,
+ public void onSocketCreated(@NonNull SocketKey socketKey,
@NonNull MdnsInterfaceSocket socket, @NonNull List<LinkAddress> addresses) {
// The socket may be already created by other request before, try to get the stored
// ReadPacketHandler.
ReadPacketHandler handler = mSocketPacketHandlers.get(socket);
if (handler == null) {
// First request to create this socket. Initial a ReadPacketHandler for this socket.
- handler = new ReadPacketHandler(network, socket.getInterface().getIndex());
+ handler = new ReadPacketHandler(socketKey);
mSocketPacketHandlers.put(socket, handler);
}
socket.addPacketHandler(handler);
- mActiveNetworkSockets.put(socket, network);
+ mActiveSockets.put(socket, socketKey);
+ mSocketCreationCallback.onSocketCreated(socketKey);
}
@Override
- public void onInterfaceDestroyed(@NonNull Network network,
+ public void onInterfaceDestroyed(@NonNull SocketKey socketKey,
@NonNull MdnsInterfaceSocket socket) {
- mSocketPacketHandlers.remove(socket);
- mActiveNetworkSockets.remove(socket);
+ notifySocketDestroyed(socket);
+ maybeCleanupPacketHandler(socket);
+ }
+
+ private void notifySocketDestroyed(@NonNull MdnsInterfaceSocket socket) {
+ final SocketKey socketKey = mActiveSockets.remove(socket);
+ if (!isSocketActive(socket)) {
+ mSocketCreationCallback.onSocketDestroyed(socketKey);
+ }
+ }
+
+ void onNetworkUnrequested() {
+ for (int i = mActiveSockets.size() - 1; i >= 0; i--) {
+ // Iterate from the end so the socket can be removed
+ final MdnsInterfaceSocket socket = mActiveSockets.keyAt(i);
+ notifySocketDestroyed(socket);
+ maybeCleanupPacketHandler(socket);
+ }
}
}
- private class ReadPacketHandler implements MulticastPacketReader.PacketHandler {
- private final Network mNetwork;
- private final int mInterfaceIndex;
+ private boolean isSocketActive(@NonNull MdnsInterfaceSocket socket) {
+ for (int i = 0; i < mRequestedNetworks.size(); i++) {
+ final InterfaceSocketCallback isc = mRequestedNetworks.valueAt(i);
+ if (isc.mActiveSockets.containsKey(socket)) {
+ return true;
+ }
+ }
+ return false;
+ }
- ReadPacketHandler(@NonNull Network network, int interfaceIndex) {
- mNetwork = network;
- mInterfaceIndex = interfaceIndex;
+ private ArrayMap<MdnsInterfaceSocket, SocketKey> getActiveSockets() {
+ final ArrayMap<MdnsInterfaceSocket, SocketKey> sockets = new ArrayMap<>();
+ for (int i = 0; i < mRequestedNetworks.size(); i++) {
+ final InterfaceSocketCallback isc = mRequestedNetworks.valueAt(i);
+ sockets.putAll(isc.mActiveSockets);
+ }
+ return sockets;
+ }
+
+ private void maybeCleanupPacketHandler(@NonNull MdnsInterfaceSocket socket) {
+ if (isSocketActive(socket)) return;
+ mSocketPacketHandlers.remove(socket);
+ }
+
+ private class ReadPacketHandler implements MulticastPacketReader.PacketHandler {
+ @NonNull private final SocketKey mSocketKey;
+
+ ReadPacketHandler(@NonNull SocketKey socketKey) {
+ mSocketKey = socketKey;
}
@Override
public void handlePacket(byte[] recvbuf, int length, InetSocketAddress src) {
- processResponsePacket(recvbuf, length, mInterfaceIndex, mNetwork);
+ processResponsePacket(recvbuf, length, mSocketKey);
}
}
@@ -114,10 +161,11 @@
* @param listener the listener for discovery.
* @param network the target network for discovery. Null means discovery on all possible
* interfaces.
+ * @param socketCreationCallback the callback to notify socket creation.
*/
@Override
public void notifyNetworkRequested(@NonNull MdnsServiceBrowserListener listener,
- @Nullable Network network) {
+ @Nullable Network network, @NonNull SocketCreationCallback socketCreationCallback) {
ensureRunningOnHandlerThread(mHandler);
InterfaceSocketCallback callback = mRequestedNetworks.get(listener);
if (callback != null) {
@@ -125,7 +173,7 @@
}
if (DBG) Log.d(TAG, "notifyNetworkRequested: network=" + network);
- callback = new InterfaceSocketCallback();
+ callback = new InterfaceSocketCallback(socketCreationCallback);
mRequestedNetworks.put(listener, callback);
mSocketProvider.requestSocket(network, callback);
}
@@ -134,25 +182,43 @@
@Override
public void notifyNetworkUnrequested(@NonNull MdnsServiceBrowserListener listener) {
ensureRunningOnHandlerThread(mHandler);
- final InterfaceSocketCallback callback = mRequestedNetworks.remove(listener);
+ final InterfaceSocketCallback callback = mRequestedNetworks.get(listener);
if (callback == null) {
Log.e(TAG, "Can not be unrequested with unknown listener=" + listener);
return;
}
+ callback.onNetworkUnrequested();
+ // onNetworkUnrequested does cleanups based on mRequestedNetworks, only remove afterwards
+ mRequestedNetworks.remove(listener);
mSocketProvider.unrequestSocket(callback);
}
- private void sendMdnsPacket(@NonNull DatagramPacket packet, @Nullable Network targetNetwork) {
+ @Override
+ public Looper getLooper() {
+ return mHandler.getLooper();
+ }
+
+ @Override
+ public boolean supportsRequestingSpecificNetworks() {
+ return true;
+ }
+
+ private void sendMdnsPacket(@NonNull DatagramPacket packet, @NonNull SocketKey targetSocketKey,
+ boolean onlyUseIpv6OnIpv6OnlyNetworks) {
final boolean isIpv6 = ((InetSocketAddress) packet.getSocketAddress()).getAddress()
instanceof Inet6Address;
final boolean isIpv4 = ((InetSocketAddress) packet.getSocketAddress()).getAddress()
instanceof Inet4Address;
- for (int i = 0; i < mActiveNetworkSockets.size(); i++) {
- final MdnsInterfaceSocket socket = mActiveNetworkSockets.keyAt(i);
- final Network network = mActiveNetworkSockets.valueAt(i);
+ final ArrayMap<MdnsInterfaceSocket, SocketKey> activeSockets = getActiveSockets();
+ boolean shouldQueryIpv6 = !onlyUseIpv6OnIpv6OnlyNetworks || isIpv6OnlySockets(
+ activeSockets, targetSocketKey);
+ for (int i = 0; i < activeSockets.size(); i++) {
+ final MdnsInterfaceSocket socket = activeSockets.keyAt(i);
+ final SocketKey socketKey = activeSockets.valueAt(i);
// Check ip capability and network before sending packet
- if (((isIpv6 && socket.hasJoinedIpv6()) || (isIpv4 && socket.hasJoinedIpv4()))
- && isNetworkMatched(targetNetwork, network)) {
+ if (((isIpv6 && socket.hasJoinedIpv6() && shouldQueryIpv6)
+ || (isIpv4 && socket.hasJoinedIpv4()))
+ && Objects.equals(socketKey, targetSocketKey)) {
try {
socket.send(packet);
} catch (IOException e) {
@@ -162,8 +228,20 @@
}
}
- private void processResponsePacket(byte[] recvbuf, int length, int interfaceIndex,
- @NonNull Network network) {
+ private boolean isIpv6OnlySockets(
+ @NonNull ArrayMap<MdnsInterfaceSocket, SocketKey> activeSockets,
+ @NonNull SocketKey targetSocketKey) {
+ for (int i = 0; i < activeSockets.size(); i++) {
+ final MdnsInterfaceSocket socket = activeSockets.keyAt(i);
+ final SocketKey socketKey = activeSockets.valueAt(i);
+ if (Objects.equals(socketKey, targetSocketKey) && socket.hasJoinedIpv4()) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ private void processResponsePacket(byte[] recvbuf, int length, @NonNull SocketKey socketKey) {
int packetNumber = ++mReceivedPacketNumber;
final MdnsPacket response;
@@ -173,45 +251,47 @@
if (e.code != MdnsResponseErrorCode.ERROR_NOT_RESPONSE_MESSAGE) {
Log.e(TAG, e.getMessage(), e);
if (mCallback != null) {
- mCallback.onFailedToParseMdnsResponse(packetNumber, e.code);
+ mCallback.onFailedToParseMdnsResponse(packetNumber, e.code, socketKey);
}
}
return;
}
if (mCallback != null) {
- mCallback.onResponseReceived(response, interfaceIndex, network);
+ mCallback.onResponseReceived(response, socketKey);
}
}
- /** Sends a mDNS request packet that asks for multicast response. */
+ /**
+ * Send a mDNS request packet via given socket key that asks for multicast response.
+ */
+ public void sendPacketRequestingMulticastResponse(@NonNull DatagramPacket packet,
+ @NonNull SocketKey socketKey, boolean onlyUseIpv6OnIpv6OnlyNetworks) {
+ mHandler.post(() -> sendMdnsPacket(packet, socketKey, onlyUseIpv6OnIpv6OnlyNetworks));
+ }
+
@Override
- public void sendMulticastPacket(@NonNull DatagramPacket packet) {
- sendMulticastPacket(packet, null /* network */);
+ public void sendPacketRequestingMulticastResponse(
+ @NonNull DatagramPacket packet, boolean onlyUseIpv6OnIpv6OnlyNetworks) {
+ throw new UnsupportedOperationException("This socket client need to specify the socket to"
+ + "send packet");
}
/**
- * Sends a mDNS request packet via given network that asks for multicast response. Null network
- * means sending packet via all networks.
+ * Send a mDNS request packet via given socket key that asks for unicast response.
+ *
+ * <p>The socket client may use a null network to identify some or all interfaces, in which case
+ * passing null sends the packet to these.
*/
- @Override
- public void sendMulticastPacket(@NonNull DatagramPacket packet, @Nullable Network network) {
- mHandler.post(() -> sendMdnsPacket(packet, network));
+ public void sendPacketRequestingUnicastResponse(@NonNull DatagramPacket packet,
+ @NonNull SocketKey socketKey, boolean onlyUseIpv6OnIpv6OnlyNetworks) {
+ mHandler.post(() -> sendMdnsPacket(packet, socketKey, onlyUseIpv6OnIpv6OnlyNetworks));
}
- /** Sends a mDNS request packet that asks for unicast response. */
@Override
- public void sendUnicastPacket(@NonNull DatagramPacket packet) {
- sendUnicastPacket(packet, null /* network */);
+ public void sendPacketRequestingUnicastResponse(
+ @NonNull DatagramPacket packet, boolean onlyUseIpv6OnIpv6OnlyNetworks) {
+ throw new UnsupportedOperationException("This socket client need to specify the socket to"
+ + "send packet");
}
-
- /**
- * Sends a mDNS request packet via given network that asks for unicast response. Null network
- * means sending packet via all networks.
- */
- @Override
- public void sendUnicastPacket(@NonNull DatagramPacket packet, @Nullable Network network) {
- // TODO: Separate unicast packet.
- mHandler.post(() -> sendMdnsPacket(packet, network));
- }
-}
+}
\ No newline at end of file
diff --git a/service-t/src/com/android/server/connectivity/mdns/MdnsNsecRecord.java b/service-t/src/com/android/server/connectivity/mdns/MdnsNsecRecord.java
index 6ec2f99..1239180 100644
--- a/service-t/src/com/android/server/connectivity/mdns/MdnsNsecRecord.java
+++ b/service-t/src/com/android/server/connectivity/mdns/MdnsNsecRecord.java
@@ -20,6 +20,7 @@
import android.text.TextUtils;
import com.android.net.module.util.CollectionUtils;
+import com.android.server.connectivity.mdns.util.MdnsUtils;
import java.io.IOException;
import java.util.ArrayList;
@@ -152,7 +153,8 @@
@Override
public int hashCode() {
return Objects.hash(super.hashCode(),
- Arrays.hashCode(mNextDomain), Arrays.hashCode(mTypes));
+ Arrays.hashCode(MdnsUtils.toDnsLabelsLowerCase(mNextDomain)),
+ Arrays.hashCode(mTypes));
}
@Override
@@ -165,7 +167,8 @@
}
return super.equals(other)
- && Arrays.equals(mNextDomain, ((MdnsNsecRecord) other).mNextDomain)
+ && MdnsUtils.equalsDnsLabelIgnoreDnsCase(mNextDomain,
+ ((MdnsNsecRecord) other).mNextDomain)
&& Arrays.equals(mTypes, ((MdnsNsecRecord) other).mTypes);
}
}
diff --git a/service-t/src/com/android/server/connectivity/mdns/MdnsPacketWriter.java b/service-t/src/com/android/server/connectivity/mdns/MdnsPacketWriter.java
index c0f9b8b..6879a64 100644
--- a/service-t/src/com/android/server/connectivity/mdns/MdnsPacketWriter.java
+++ b/service-t/src/com/android/server/connectivity/mdns/MdnsPacketWriter.java
@@ -17,11 +17,11 @@
package com.android.server.connectivity.mdns;
import com.android.server.connectivity.mdns.MdnsServiceInfo.TextEntry;
+import com.android.server.connectivity.mdns.util.MdnsUtils;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.SocketAddress;
-import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
@@ -180,7 +180,7 @@
int existingOffset = entry.getKey();
String[] existingLabels = entry.getValue();
- if (Arrays.equals(existingLabels, labels)) {
+ if (MdnsUtils.equalsDnsLabelIgnoreDnsCase(existingLabels, labels)) {
writePointer(existingOffset);
return;
} else if (MdnsRecord.labelsAreSuffix(existingLabels, labels)) {
diff --git a/service-t/src/com/android/server/connectivity/mdns/MdnsPointerRecord.java b/service-t/src/com/android/server/connectivity/mdns/MdnsPointerRecord.java
index 2c7b26b..c88ead0 100644
--- a/service-t/src/com/android/server/connectivity/mdns/MdnsPointerRecord.java
+++ b/service-t/src/com/android/server/connectivity/mdns/MdnsPointerRecord.java
@@ -19,6 +19,7 @@
import android.annotation.Nullable;
import com.android.internal.annotations.VisibleForTesting;
+import com.android.server.connectivity.mdns.util.MdnsUtils;
import java.io.IOException;
import java.util.Arrays;
@@ -60,7 +61,8 @@
}
public boolean hasSubtype() {
- return (name != null) && (name.length > 2) && name[1].equals(MdnsConstants.SUBTYPE_LABEL);
+ return (name != null) && (name.length > 2) && MdnsUtils.equalsIgnoreDnsCase(name[1],
+ MdnsConstants.SUBTYPE_LABEL);
}
public String getSubtype() {
@@ -74,7 +76,7 @@
@Override
public int hashCode() {
- return (super.hashCode() * 31) + Arrays.hashCode(pointer);
+ return (super.hashCode() * 31) + Arrays.hashCode(MdnsUtils.toDnsLabelsLowerCase(pointer));
}
@Override
@@ -86,6 +88,7 @@
return false;
}
- return super.equals(other) && Arrays.equals(pointer, ((MdnsPointerRecord) other).pointer);
+ return super.equals(other) && MdnsUtils.equalsDnsLabelIgnoreDnsCase(pointer,
+ ((MdnsPointerRecord) other).pointer);
}
}
\ No newline at end of file
diff --git a/service-t/src/com/android/server/connectivity/mdns/MdnsProber.java b/service-t/src/com/android/server/connectivity/mdns/MdnsProber.java
index 669b323..ecf846e 100644
--- a/service-t/src/com/android/server/connectivity/mdns/MdnsProber.java
+++ b/service-t/src/com/android/server/connectivity/mdns/MdnsProber.java
@@ -21,9 +21,9 @@
import com.android.internal.annotations.VisibleForTesting;
import com.android.net.module.util.CollectionUtils;
+import com.android.server.connectivity.mdns.util.MdnsUtils;
import java.util.ArrayList;
-import java.util.Arrays;
import java.util.Collections;
import java.util.List;
@@ -113,7 +113,8 @@
*/
private static boolean containsName(@NonNull List<MdnsRecord> records,
@NonNull String[] name) {
- return CollectionUtils.any(records, r -> Arrays.equals(name, r.getName()));
+ return CollectionUtils.any(records,
+ r -> MdnsUtils.equalsDnsLabelIgnoreDnsCase(name, r.getName()));
}
}
diff --git a/service-t/src/com/android/server/connectivity/mdns/MdnsRecord.java b/service-t/src/com/android/server/connectivity/mdns/MdnsRecord.java
index bcee9d1..28bd1b4 100644
--- a/service-t/src/com/android/server/connectivity/mdns/MdnsRecord.java
+++ b/service-t/src/com/android/server/connectivity/mdns/MdnsRecord.java
@@ -24,6 +24,7 @@
import android.text.TextUtils;
import com.android.internal.annotations.VisibleForTesting;
+import com.android.server.connectivity.mdns.util.MdnsUtils;
import java.io.IOException;
import java.util.Arrays;
@@ -46,6 +47,8 @@
public static final long RECEIPT_TIME_NOT_SENT = 0L;
public static final int CLASS_ANY = 0x00ff;
+ /** Max label length as per RFC 1034/1035 */
+ public static final int MAX_LABEL_LENGTH = 63;
/** Status indicating that the record is current. */
public static final int STATUS_OK = 0;
@@ -134,7 +137,7 @@
}
for (int i = 0; i < list1.length; ++i) {
- if (!list1[i].equals(list2[i + offset])) {
+ if (!MdnsUtils.equalsIgnoreDnsCase(list1[i], list2[i + offset])) {
return false;
}
}
@@ -269,12 +272,13 @@
MdnsRecord otherRecord = (MdnsRecord) other;
- return Arrays.equals(name, otherRecord.name) && (type == otherRecord.type);
+ return MdnsUtils.equalsDnsLabelIgnoreDnsCase(name, otherRecord.name) && (type
+ == otherRecord.type);
}
@Override
public int hashCode() {
- return Objects.hash(Arrays.hashCode(name), type);
+ return Objects.hash(Arrays.hashCode(MdnsUtils.toDnsLabelsLowerCase(name)), type);
}
/**
@@ -295,7 +299,7 @@
public Key(int recordType, String[] recordName) {
this.recordType = recordType;
- this.recordName = recordName;
+ this.recordName = MdnsUtils.toDnsLabelsLowerCase(recordName);
}
@Override
diff --git a/service-t/src/com/android/server/connectivity/mdns/MdnsRecordRepository.java b/service-t/src/com/android/server/connectivity/mdns/MdnsRecordRepository.java
index 1329172..1375279 100644
--- a/service-t/src/com/android/server/connectivity/mdns/MdnsRecordRepository.java
+++ b/service-t/src/com/android/server/connectivity/mdns/MdnsRecordRepository.java
@@ -30,6 +30,7 @@
import com.android.internal.annotations.VisibleForTesting;
import com.android.net.module.util.CollectionUtils;
import com.android.net.module.util.HexDump;
+import com.android.server.connectivity.mdns.util.MdnsUtils;
import java.io.IOException;
import java.net.Inet4Address;
@@ -69,6 +70,8 @@
// Top-level domain for link-local queries, as per RFC6762 3.
private static final String LOCAL_TLD = "local";
+ // Subtype separator as per RFC6763 7.1 (_printer._sub._http._tcp.local)
+ private static final String SUBTYPE_SEPARATOR = "_sub";
// Service type for service enumeration (RFC6763 9.)
private static final String[] DNS_SD_SERVICE_TYPE =
@@ -156,13 +159,15 @@
@NonNull
public final List<RecordInfo<?>> allRecords;
@NonNull
- public final RecordInfo<MdnsPointerRecord> ptrRecord;
+ public final List<RecordInfo<MdnsPointerRecord>> ptrRecords;
@NonNull
public final RecordInfo<MdnsServiceRecord> srvRecord;
@NonNull
public final RecordInfo<MdnsTextRecord> txtRecord;
@NonNull
public final NsdServiceInfo serviceInfo;
+ @Nullable
+ public final String subtype;
/**
* Whether the service is sending exit announcements and will be destroyed soon.
@@ -175,14 +180,16 @@
* @param deviceHostname Hostname of the device (for the interface used)
* @param serviceInfo Service to advertise
*/
- ServiceRegistration(@NonNull String[] deviceHostname, @NonNull NsdServiceInfo serviceInfo) {
+ ServiceRegistration(@NonNull String[] deviceHostname, @NonNull NsdServiceInfo serviceInfo,
+ @Nullable String subtype) {
this.serviceInfo = serviceInfo;
+ this.subtype = subtype;
final String[] serviceType = splitServiceType(serviceInfo);
final String[] serviceName = splitFullyQualifiedName(serviceInfo, serviceType);
// Service PTR record
- ptrRecord = new RecordInfo<>(
+ final RecordInfo<MdnsPointerRecord> ptrRecord = new RecordInfo<>(
serviceInfo,
new MdnsPointerRecord(
serviceType,
@@ -192,6 +199,26 @@
serviceName),
true /* sharedName */, true /* probing */);
+ if (subtype == null) {
+ this.ptrRecords = Collections.singletonList(ptrRecord);
+ } else {
+ final String[] subtypeName = new String[serviceType.length + 2];
+ System.arraycopy(serviceType, 0, subtypeName, 2, serviceType.length);
+ subtypeName[0] = subtype;
+ subtypeName[1] = SUBTYPE_SEPARATOR;
+ final RecordInfo<MdnsPointerRecord> subtypeRecord = new RecordInfo<>(
+ serviceInfo,
+ new MdnsPointerRecord(
+ subtypeName,
+ 0L /* receiptTimeMillis */,
+ false /* cacheFlush */,
+ NON_NAME_RECORDS_TTL_MILLIS,
+ serviceName),
+ true /* sharedName */, true /* probing */);
+
+ this.ptrRecords = List.of(ptrRecord, subtypeRecord);
+ }
+
srvRecord = new RecordInfo<>(
serviceInfo,
new MdnsServiceRecord(serviceName,
@@ -211,8 +238,8 @@
attrsToTextEntries(serviceInfo.getAttributes())),
false /* sharedName */, true /* probing */);
- final ArrayList<RecordInfo<?>> allRecords = new ArrayList<>(4);
- allRecords.add(ptrRecord);
+ final ArrayList<RecordInfo<?>> allRecords = new ArrayList<>(5);
+ allRecords.addAll(ptrRecords);
allRecords.add(srvRecord);
allRecords.add(txtRecord);
// Service type enumeration record (RFC6763 9.)
@@ -275,7 +302,8 @@
* ID of the replaced service.
* @throws NameConflictException There is already a (non-exiting) service using the name.
*/
- public int addService(int serviceId, NsdServiceInfo serviceInfo) throws NameConflictException {
+ public int addService(int serviceId, NsdServiceInfo serviceInfo, @Nullable String subtype)
+ throws NameConflictException {
if (mServices.contains(serviceId)) {
throw new IllegalArgumentException(
"Service ID must not be reused across registrations: " + serviceId);
@@ -288,7 +316,7 @@
}
final ServiceRegistration registration = new ServiceRegistration(
- mDeviceHostname, serviceInfo);
+ mDeviceHostname, serviceInfo, subtype);
mServices.put(serviceId, registration);
// Remove existing exiting service
@@ -302,7 +330,8 @@
private int getServiceByName(@NonNull String serviceName) {
for (int i = 0; i < mServices.size(); i++) {
final ServiceRegistration registration = mServices.valueAt(i);
- if (serviceName.equals(registration.serviceInfo.getServiceName())) {
+ if (MdnsUtils.equalsIgnoreDnsCase(serviceName,
+ registration.serviceInfo.getServiceName())) {
return mServices.keyAt(i);
}
}
@@ -344,24 +373,25 @@
if (registration == null) return null;
if (registration.exiting) return null;
- // Send exit (TTL 0) for the PTR record, if the record was sent (in particular don't send
+ // Send exit (TTL 0) for the PTR records, if at least one was sent (in particular don't send
// if still probing)
- if (registration.ptrRecord.lastSentTimeMs == 0L) {
+ if (CollectionUtils.all(registration.ptrRecords, r -> r.lastSentTimeMs == 0L)) {
return null;
}
registration.exiting = true;
- final MdnsPointerRecord expiredRecord = new MdnsPointerRecord(
- registration.ptrRecord.record.getName(),
- 0L /* receiptTimeMillis */,
- true /* cacheFlush */,
- 0L /* ttlMillis */,
- registration.ptrRecord.record.getPointer());
+ final List<MdnsRecord> expiredRecords = CollectionUtils.map(registration.ptrRecords,
+ r -> new MdnsPointerRecord(
+ r.record.getName(),
+ 0L /* receiptTimeMillis */,
+ true /* cacheFlush */,
+ 0L /* ttlMillis */,
+ r.record.getPointer()));
// Exit should be skipped if the record is still advertised by another service, but that
// would be a conflict (2 service registrations with the same service name), so it would
// not have been allowed by the repository.
- return new MdnsAnnouncer.ExitAnnouncementInfo(id, Collections.singletonList(expiredRecord));
+ return new MdnsAnnouncer.ExitAnnouncementInfo(id, expiredRecords);
}
public void removeService(int id) {
@@ -442,7 +472,7 @@
for (int i = 0; i < mServices.size(); i++) {
final ServiceRegistration registration = mServices.valueAt(i);
if (registration.exiting) continue;
- addReplyFromService(question, registration.allRecords, registration.ptrRecord,
+ addReplyFromService(question, registration.allRecords, registration.ptrRecords,
registration.srvRecord, registration.txtRecord, replyUnicast, now,
answerInfo, additionalAnswerRecords);
}
@@ -499,7 +529,7 @@
*/
private void addReplyFromService(@NonNull MdnsRecord question,
@NonNull List<RecordInfo<?>> serviceRecords,
- @Nullable RecordInfo<MdnsPointerRecord> servicePtrRecord,
+ @Nullable List<RecordInfo<MdnsPointerRecord>> servicePtrRecords,
@Nullable RecordInfo<MdnsServiceRecord> serviceSrvRecord,
@Nullable RecordInfo<MdnsTextRecord> serviceTxtRecord,
boolean replyUnicast, long now, @NonNull List<RecordInfo<?>> answerInfo,
@@ -517,7 +547,9 @@
must match the question qtype unless the qtype is "ANY" (255) or the rrtype is
"CNAME" (5), and the record rrclass must match the question qclass unless the
qclass is "ANY" (255) */
- if (!Arrays.equals(info.record.getName(), question.getName())) continue;
+ if (!MdnsUtils.equalsDnsLabelIgnoreDnsCase(info.record.getName(), question.getName())) {
+ continue;
+ }
hasFullyOwnedNameMatch |= !info.isSharedName;
// The repository does not store CNAME records
@@ -531,7 +563,8 @@
}
hasKnownAnswer = true;
- hasDnsSdPtrRecordAnswer |= (info == servicePtrRecord);
+ hasDnsSdPtrRecordAnswer |= (servicePtrRecords != null
+ && CollectionUtils.any(servicePtrRecords, r -> info == r));
hasDnsSdSrvRecordAnswer |= (info == serviceSrvRecord);
// TODO: responses to probe queries should bypass this check and only ensure the
@@ -718,7 +751,10 @@
// happens. In fact probing is only done for the service name in the SRV record.
// This means only SRV and TXT records need to be checked.
final RecordInfo<MdnsServiceRecord> srvRecord = registration.srvRecord;
- if (!Arrays.equals(record.getName(), srvRecord.record.getName())) continue;
+ if (!MdnsUtils.equalsDnsLabelIgnoreDnsCase(record.getName(),
+ srvRecord.record.getName())) {
+ continue;
+ }
// As per RFC6762 9., it's fine if the "conflict" is an identical record with same
// data.
@@ -791,10 +827,11 @@
*/
@Nullable
public MdnsProber.ProbingInfo renameServiceForConflict(int serviceId, NsdServiceInfo newInfo) {
- if (!mServices.contains(serviceId)) return null;
+ final ServiceRegistration existing = mServices.get(serviceId);
+ if (existing == null) return null;
final ServiceRegistration newService = new ServiceRegistration(
- mDeviceHostname, newInfo);
+ mDeviceHostname, newInfo, existing.subtype);
mServices.put(serviceId, newService);
return makeProbingInfo(serviceId, newService.srvRecord.record);
}
diff --git a/service-t/src/com/android/server/connectivity/mdns/MdnsReplySender.java b/service-t/src/com/android/server/connectivity/mdns/MdnsReplySender.java
index f1389ca..8bc598d 100644
--- a/service-t/src/com/android/server/connectivity/mdns/MdnsReplySender.java
+++ b/service-t/src/com/android/server/connectivity/mdns/MdnsReplySender.java
@@ -16,7 +16,7 @@
package com.android.server.connectivity.mdns;
-import static com.android.server.connectivity.mdns.MdnsSocketProvider.ensureRunningOnHandlerThread;
+import static com.android.server.connectivity.mdns.util.MdnsUtils.ensureRunningOnHandlerThread;
import android.annotation.NonNull;
import android.os.Handler;
diff --git a/service-t/src/com/android/server/connectivity/mdns/MdnsResponse.java b/service-t/src/com/android/server/connectivity/mdns/MdnsResponse.java
index be2555b..e2288c1 100644
--- a/service-t/src/com/android/server/connectivity/mdns/MdnsResponse.java
+++ b/service-t/src/com/android/server/connectivity/mdns/MdnsResponse.java
@@ -21,10 +21,10 @@
import android.net.Network;
import com.android.internal.annotations.VisibleForTesting;
+import com.android.server.connectivity.mdns.util.MdnsUtils;
import java.io.IOException;
import java.util.ArrayList;
-import java.util.Arrays;
import java.util.Collections;
import java.util.Iterator;
import java.util.LinkedList;
@@ -81,6 +81,28 @@
return a == null || a.getTtl() == b.getTtl();
}
+ private <T extends MdnsRecord> boolean addOrReplaceRecord(@NonNull T record,
+ @NonNull List<T> recordsList) {
+ final int existing = recordsList.indexOf(record);
+ boolean isSame = false;
+ if (existing >= 0) {
+ isSame = recordsAreSame(record, recordsList.get(existing));
+ final MdnsRecord existedRecord = recordsList.remove(existing);
+ records.remove(existedRecord);
+ }
+ recordsList.add(record);
+ records.add(record);
+ return !isSame;
+ }
+
+ /**
+ * @return True if this response contains an identical (original TTL included) record.
+ */
+ public boolean hasIdenticalRecord(@NonNull MdnsRecord record) {
+ final int existing = records.indexOf(record);
+ return existing >= 0 && recordsAreSame(record, records.get(existing));
+ }
+
/**
* Adds a pointer record.
*
@@ -88,21 +110,11 @@
* pointer record is already present in the response with the same TTL.
*/
public synchronized boolean addPointerRecord(MdnsPointerRecord pointerRecord) {
- if (!Arrays.equals(serviceName, pointerRecord.getPointer())) {
+ if (!MdnsUtils.equalsDnsLabelIgnoreDnsCase(serviceName, pointerRecord.getPointer())) {
throw new IllegalArgumentException(
"Pointer records for different service names cannot be added");
}
- final int existing = pointerRecords.indexOf(pointerRecord);
- if (existing >= 0) {
- if (recordsAreSame(pointerRecord, pointerRecords.get(existing))) {
- return false;
- }
- final MdnsRecord record = pointerRecords.remove(existing);
- records.remove(record);
- }
- pointerRecords.add(pointerRecord);
- records.add(pointerRecord);
- return true;
+ return addOrReplaceRecord(pointerRecord, pointerRecords);
}
/** Gets the pointer records. */
@@ -158,9 +170,7 @@
/** Sets the service record. */
public synchronized boolean setServiceRecord(MdnsServiceRecord serviceRecord) {
- if (recordsAreSame(this.serviceRecord, serviceRecord)) {
- return false;
- }
+ boolean isSame = recordsAreSame(this.serviceRecord, serviceRecord);
if (this.serviceRecord != null) {
records.remove(this.serviceRecord);
}
@@ -168,7 +178,7 @@
if (this.serviceRecord != null) {
records.add(this.serviceRecord);
}
- return true;
+ return !isSame;
}
/** Gets the service record. */
@@ -182,9 +192,7 @@
/** Sets the text record. */
public synchronized boolean setTextRecord(MdnsTextRecord textRecord) {
- if (recordsAreSame(this.textRecord, textRecord)) {
- return false;
- }
+ boolean isSame = recordsAreSame(this.textRecord, textRecord);
if (this.textRecord != null) {
records.remove(this.textRecord);
}
@@ -192,7 +200,7 @@
if (this.textRecord != null) {
records.add(this.textRecord);
}
- return true;
+ return !isSame;
}
/** Gets the text record. */
@@ -207,17 +215,7 @@
/** Add the IPv4 address record. */
public synchronized boolean addInet4AddressRecord(
@NonNull MdnsInetAddressRecord newInet4AddressRecord) {
- final int existing = inet4AddressRecords.indexOf(newInet4AddressRecord);
- if (existing >= 0) {
- if (recordsAreSame(newInet4AddressRecord, inet4AddressRecords.get(existing))) {
- return false;
- }
- final MdnsRecord record = inet4AddressRecords.remove(existing);
- records.remove(record);
- }
- inet4AddressRecords.add(newInet4AddressRecord);
- records.add(newInet4AddressRecord);
- return true;
+ return addOrReplaceRecord(newInet4AddressRecord, inet4AddressRecords);
}
/** Gets the IPv4 address records. */
@@ -248,17 +246,7 @@
/** Sets the IPv6 address records. */
public synchronized boolean addInet6AddressRecord(
@NonNull MdnsInetAddressRecord newInet6AddressRecord) {
- final int existing = inet6AddressRecords.indexOf(newInet6AddressRecord);
- if (existing >= 0) {
- if (recordsAreSame(newInet6AddressRecord, inet6AddressRecords.get(existing))) {
- return false;
- }
- final MdnsRecord record = inet6AddressRecords.remove(existing);
- records.remove(record);
- }
- inet6AddressRecords.add(newInet6AddressRecord);
- records.add(newInet6AddressRecord);
- return true;
+ return addOrReplaceRecord(newInet6AddressRecord, inet6AddressRecords);
}
/**
@@ -316,13 +304,13 @@
boolean dropAddressRecords = false;
for (MdnsInetAddressRecord inetAddressRecord : getInet4AddressRecords()) {
- if (!Arrays.equals(
+ if (!MdnsUtils.equalsDnsLabelIgnoreDnsCase(
this.serviceRecord.getServiceHost(), inetAddressRecord.getName())) {
dropAddressRecords = true;
}
}
for (MdnsInetAddressRecord inetAddressRecord : getInet6AddressRecords()) {
- if (!Arrays.equals(
+ if (!MdnsUtils.equalsDnsLabelIgnoreDnsCase(
this.serviceRecord.getServiceHost(), inetAddressRecord.getName())) {
dropAddressRecords = true;
}
diff --git a/service-t/src/com/android/server/connectivity/mdns/MdnsResponseDecoder.java b/service-t/src/com/android/server/connectivity/mdns/MdnsResponseDecoder.java
index 0151202..eff1880 100644
--- a/service-t/src/com/android/server/connectivity/mdns/MdnsResponseDecoder.java
+++ b/service-t/src/com/android/server/connectivity/mdns/MdnsResponseDecoder.java
@@ -20,13 +20,15 @@
import android.annotation.Nullable;
import android.net.Network;
import android.os.SystemClock;
+import android.util.ArrayMap;
import android.util.ArraySet;
+import android.util.Pair;
import com.android.server.connectivity.mdns.util.MdnsLogger;
+import com.android.server.connectivity.mdns.util.MdnsUtils;
import java.io.EOFException;
import java.util.ArrayList;
-import java.util.Arrays;
import java.util.Collection;
import java.util.List;
@@ -50,7 +52,7 @@
List<MdnsResponse> responses, String[] pointer) {
if (responses != null) {
for (MdnsResponse response : responses) {
- if (Arrays.equals(response.getServiceName(), pointer)) {
+ if (MdnsUtils.equalsDnsLabelIgnoreDnsCase(response.getServiceName(), pointer)) {
return response;
}
}
@@ -66,7 +68,8 @@
if (serviceRecord == null) {
continue;
}
- if (Arrays.equals(serviceRecord.getServiceHost(), hostName)) {
+ if (MdnsUtils.equalsDnsLabelIgnoreDnsCase(serviceRecord.getServiceHost(),
+ hostName)) {
return response;
}
}
@@ -119,9 +122,14 @@
* @param interfaceIndex the network interface index (or
* {@link MdnsSocket#INTERFACE_INDEX_UNSPECIFIED} if not known) at which the packet was received
* @param network the network at which the packet was received, or null if it is unknown.
- * @return The set of response instances that were modified or newly added.
+ * @return The pair of 1) set of response instances that were modified or newly added. *not*
+ * including those which records were only updated with newer receive
+ * timestamps.
+ * 2) A copy of the original responses with some of them have records
+ * update or only contains receive time updated.
*/
- public ArraySet<MdnsResponse> augmentResponses(@NonNull MdnsPacket mdnsPacket,
+ public Pair<ArraySet<MdnsResponse>, ArrayList<MdnsResponse>> augmentResponses(
+ @NonNull MdnsPacket mdnsPacket,
@NonNull Collection<MdnsResponse> existingResponses, int interfaceIndex,
@Nullable Network network) {
final ArrayList<MdnsRecord> records = new ArrayList<>(
@@ -133,8 +141,11 @@
final ArraySet<MdnsResponse> modified = new ArraySet<>();
final ArrayList<MdnsResponse> responses = new ArrayList<>(existingResponses.size());
+ final ArrayMap<MdnsResponse, MdnsResponse> augmentedToOriginal = new ArrayMap<>();
for (MdnsResponse existing : existingResponses) {
- responses.add(new MdnsResponse(existing));
+ final MdnsResponse copy = new MdnsResponse(existing);
+ responses.add(copy);
+ augmentedToOriginal.put(copy, existing);
}
// The response records are structured in a hierarchy, where some records reference
// others, as follows:
@@ -160,15 +171,12 @@
// A: host name -> IP address
// Loop 1: find PTR records, which identify distinct service instances.
- long now = SystemClock.elapsedRealtime();
+ long now = clock.elapsedRealtime();
for (MdnsRecord record : records) {
if (record instanceof MdnsPointerRecord) {
String[] name = record.getName();
- if ((serviceType == null)
- || Arrays.equals(name, serviceType)
- || ((name.length == (serviceType.length + 2))
- && name[1].equals(MdnsConstants.SUBTYPE_LABEL)
- && MdnsRecord.labelsAreSuffix(serviceType, name))) {
+ if ((serviceType == null) || MdnsUtils.typeEqualsOrIsSubtype(
+ serviceType, name)) {
MdnsPointerRecord pointerRecord = (MdnsPointerRecord) record;
// Group PTR records that refer to the same service instance name into a single
// response.
@@ -179,7 +187,6 @@
network);
responses.add(response);
}
-
if (response.addPointerRecord((MdnsPointerRecord) record)) {
modified.add(response);
}
@@ -220,9 +227,10 @@
// This bit, the cache-flush bit, tells neighboring hosts
// that this is not a shared record type. Instead of merging this new
// record additively into the cache in addition to any previous records with
- // the same name, rrtype, and rrclass, all old records with that name,
- // rrtype, and rrclass that were received more than one second ago are
- // declared invalid, and marked to expire from the cache in one second.
+ // the same name, rrtype, and rrclass.
+ // TODO: All old records with that name, rrtype, and rrclass that were
+ // received more than one second ago are declared invalid, and marked
+ // to expire from the cache in one second.
if (inetRecord.getCacheFlush()) {
response.clearInet4AddressRecords();
response.clearInet6AddressRecords();
@@ -236,9 +244,10 @@
// This bit, the cache-flush bit, tells neighboring hosts
// that this is not a shared record type. Instead of merging this new
// record additively into the cache in addition to any previous records with
- // the same name, rrtype, and rrclass, all old records with that name,
- // rrtype, and rrclass that were received more than one second ago are
- // declared invalid, and marked to expire from the cache in one second.
+ // the same name, rrtype, and rrclass.
+ // TODO: All old records with that name, rrtype, and rrclass that were
+ // received more than one second ago are declared invalid, and marked
+ // to expire from the cache in one second.
if (inetRecord.getCacheFlush()) {
response.clearInet4AddressRecords();
response.clearInet6AddressRecords();
@@ -255,7 +264,11 @@
findResponsesWithHostName(responses, inetRecord.getName());
for (MdnsResponse response : matchingResponses) {
if (assignInetRecord(response, inetRecord)) {
- modified.add(response);
+ final MdnsResponse originalResponse = augmentedToOriginal.get(response);
+ if (originalResponse == null
+ || !originalResponse.hasIdenticalRecord(inetRecord)) {
+ modified.add(response);
+ }
}
}
} else {
@@ -263,13 +276,27 @@
findResponseWithHostName(responses, inetRecord.getName());
if (response != null) {
if (assignInetRecord(response, inetRecord)) {
- modified.add(response);
+ final MdnsResponse originalResponse = augmentedToOriginal.get(response);
+ if (originalResponse == null
+ || !originalResponse.hasIdenticalRecord(inetRecord)) {
+ modified.add(response);
+ }
}
}
}
}
- return modified;
+ // Only responses that have new or modified address records were added to the modified set.
+ // Make sure responses that have lost address records are added to the set too.
+ for (int i = 0; i < augmentedToOriginal.size(); i++) {
+ final MdnsResponse augmented = augmentedToOriginal.keyAt(i);
+ final MdnsResponse original = augmentedToOriginal.valueAt(i);
+ if (augmented.getRecords().size() != original.getRecords().size()) {
+ modified.add(augmented);
+ }
+ }
+
+ return Pair.create(modified, responses);
}
private static boolean assignInetRecord(
@@ -294,7 +321,7 @@
if (serviceRecord == null) {
continue;
}
- if (Arrays.equals(serviceRecord.getServiceHost(), hostName)) {
+ if (MdnsUtils.equalsDnsLabelIgnoreDnsCase(serviceRecord.getServiceHost(), hostName)) {
if (result == null) {
result = new ArrayList<>(/* initialCapacity= */ responses.size());
}
diff --git a/service-t/src/com/android/server/connectivity/mdns/MdnsSearchOptions.java b/service-t/src/com/android/server/connectivity/mdns/MdnsSearchOptions.java
index 3da6bd0..98c80ee 100644
--- a/service-t/src/com/android/server/connectivity/mdns/MdnsSearchOptions.java
+++ b/service-t/src/com/android/server/connectivity/mdns/MdnsSearchOptions.java
@@ -44,10 +44,13 @@
new Parcelable.Creator<MdnsSearchOptions>() {
@Override
public MdnsSearchOptions createFromParcel(Parcel source) {
- return new MdnsSearchOptions(source.createStringArrayList(),
- source.readBoolean(), source.readBoolean(),
+ return new MdnsSearchOptions(
+ source.createStringArrayList(),
+ source.readBoolean(),
+ source.readBoolean(),
source.readParcelable(null),
- source.readString());
+ source.readString(),
+ (source.dataAvail() > 0) ? source.readBoolean() : false);
}
@Override
@@ -61,18 +64,25 @@
private final String resolveInstanceName;
private final boolean isPassiveMode;
+ private final boolean onlyUseIpv6OnIpv6OnlyNetworks;
private final boolean removeExpiredService;
// The target network for searching. Null network means search on all possible interfaces.
@Nullable private final Network mNetwork;
/** Parcelable constructs for a {@link MdnsSearchOptions}. */
- MdnsSearchOptions(List<String> subtypes, boolean isPassiveMode, boolean removeExpiredService,
- @Nullable Network network, @Nullable String resolveInstanceName) {
+ MdnsSearchOptions(
+ List<String> subtypes,
+ boolean isPassiveMode,
+ boolean removeExpiredService,
+ @Nullable Network network,
+ @Nullable String resolveInstanceName,
+ boolean onlyUseIpv6OnIpv6OnlyNetworks) {
this.subtypes = new ArrayList<>();
if (subtypes != null) {
this.subtypes.addAll(subtypes);
}
this.isPassiveMode = isPassiveMode;
+ this.onlyUseIpv6OnIpv6OnlyNetworks = onlyUseIpv6OnIpv6OnlyNetworks;
this.removeExpiredService = removeExpiredService;
mNetwork = network;
this.resolveInstanceName = resolveInstanceName;
@@ -104,6 +114,14 @@
return isPassiveMode;
}
+ /**
+ * @return {@code true} if only the IPv4 mDNS host should be queried on network that supports
+ * both IPv6 as well as IPv4. On an IPv6-only network, this is ignored.
+ */
+ public boolean onlyUseIpv6OnIpv6OnlyNetworks() {
+ return onlyUseIpv6OnIpv6OnlyNetworks;
+ }
+
/** Returns {@code true} if service will be removed after its TTL expires. */
public boolean removeExpiredService() {
return removeExpiredService;
@@ -140,12 +158,14 @@
out.writeBoolean(removeExpiredService);
out.writeParcelable(mNetwork, 0);
out.writeString(resolveInstanceName);
+ out.writeBoolean(onlyUseIpv6OnIpv6OnlyNetworks);
}
/** A builder to create {@link MdnsSearchOptions}. */
public static final class Builder {
private final Set<String> subtypes;
private boolean isPassiveMode = true;
+ private boolean onlyUseIpv6OnIpv6OnlyNetworks = false;
private boolean removeExpiredService;
private Network mNetwork;
private String resolveInstanceName;
@@ -190,6 +210,15 @@
}
/**
+ * Sets if only the IPv4 mDNS host should be queried on a network that is both IPv4 & IPv6.
+ * On an IPv6-only network, this is ignored.
+ */
+ public Builder setOnlyUseIpv6OnIpv6OnlyNetworks(boolean onlyUseIpv6OnIpv6OnlyNetworks) {
+ this.onlyUseIpv6OnIpv6OnlyNetworks = onlyUseIpv6OnIpv6OnlyNetworks;
+ return this;
+ }
+
+ /**
* Sets if the service should be removed after TTL.
*
* @param removeExpiredService If set to {@code true}, the service will be removed after TTL
@@ -223,8 +252,13 @@
/** Builds a {@link MdnsSearchOptions} with the arguments supplied to this builder. */
public MdnsSearchOptions build() {
- return new MdnsSearchOptions(new ArrayList<>(subtypes), isPassiveMode,
- removeExpiredService, mNetwork, resolveInstanceName);
+ return new MdnsSearchOptions(
+ new ArrayList<>(subtypes),
+ isPassiveMode,
+ removeExpiredService,
+ mNetwork,
+ resolveInstanceName,
+ onlyUseIpv6OnIpv6OnlyNetworks);
}
}
}
\ No newline at end of file
diff --git a/service-t/src/com/android/server/connectivity/mdns/MdnsServiceCache.java b/service-t/src/com/android/server/connectivity/mdns/MdnsServiceCache.java
new file mode 100644
index 0000000..cd0be67
--- /dev/null
+++ b/service-t/src/com/android/server/connectivity/mdns/MdnsServiceCache.java
@@ -0,0 +1,178 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.connectivity.mdns;
+
+import static com.android.server.connectivity.mdns.util.MdnsUtils.ensureRunningOnHandlerThread;
+import static com.android.server.connectivity.mdns.util.MdnsUtils.equalsIgnoreDnsCase;
+import static com.android.server.connectivity.mdns.util.MdnsUtils.toDnsLowerCase;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.net.Network;
+import android.os.Handler;
+import android.os.Looper;
+import android.util.ArrayMap;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * The {@link MdnsServiceCache} manages the service which discovers from each socket and cache these
+ * services to reduce duplicated queries.
+ *
+ * <p>This class is not thread safe, it is intended to be used only from the looper thread.
+ * However, the constructor is an exception, as it is called on another thread;
+ * therefore for thread safety all members of this class MUST either be final or initialized
+ * to their default value (0, false or null).
+ */
+public class MdnsServiceCache {
+ private static class CacheKey {
+ @NonNull final String mLowercaseServiceType;
+ @Nullable final Network mNetwork;
+
+ CacheKey(@NonNull String serviceType, @Nullable Network network) {
+ mLowercaseServiceType = toDnsLowerCase(serviceType);
+ mNetwork = network;
+ }
+
+ @Override public int hashCode() {
+ return Objects.hash(mLowercaseServiceType, mNetwork);
+ }
+
+ @Override public boolean equals(Object other) {
+ if (this == other) {
+ return true;
+ }
+ if (!(other instanceof CacheKey)) {
+ return false;
+ }
+ return Objects.equals(mLowercaseServiceType, ((CacheKey) other).mLowercaseServiceType)
+ && Objects.equals(mNetwork, ((CacheKey) other).mNetwork);
+ }
+ }
+ /**
+ * A map of cached services. Key is composed of service name, type and network. Value is the
+ * service which use the service type to discover from each socket.
+ */
+ @NonNull
+ private final ArrayMap<CacheKey, List<MdnsResponse>> mCachedServices = new ArrayMap<>();
+ @NonNull
+ private final Handler mHandler;
+
+ public MdnsServiceCache(@NonNull Looper looper) {
+ mHandler = new Handler(looper);
+ }
+
+ /**
+ * Get the cache services which are queried from given service type and network.
+ *
+ * @param serviceType the target service type.
+ * @param network the target network
+ * @return the set of services which matches the given service type.
+ */
+ @NonNull
+ public List<MdnsResponse> getCachedServices(@NonNull String serviceType,
+ @Nullable Network network) {
+ ensureRunningOnHandlerThread(mHandler);
+ final CacheKey key = new CacheKey(serviceType, network);
+ return mCachedServices.containsKey(key)
+ ? Collections.unmodifiableList(new ArrayList<>(mCachedServices.get(key)))
+ : Collections.emptyList();
+ }
+
+ private MdnsResponse findMatchedResponse(@NonNull List<MdnsResponse> responses,
+ @NonNull String serviceName) {
+ for (MdnsResponse response : responses) {
+ if (equalsIgnoreDnsCase(serviceName, response.getServiceInstanceName())) {
+ return response;
+ }
+ }
+ return null;
+ }
+
+ /**
+ * Get the cache service.
+ *
+ * @param serviceName the target service name.
+ * @param serviceType the target service type.
+ * @param network the target network
+ * @return the service which matches given conditions.
+ */
+ @Nullable
+ public MdnsResponse getCachedService(@NonNull String serviceName,
+ @NonNull String serviceType, @Nullable Network network) {
+ ensureRunningOnHandlerThread(mHandler);
+ final List<MdnsResponse> responses =
+ mCachedServices.get(new CacheKey(serviceType, network));
+ if (responses == null) {
+ return null;
+ }
+ final MdnsResponse response = findMatchedResponse(responses, serviceName);
+ return response != null ? new MdnsResponse(response) : null;
+ }
+
+ /**
+ * Add or update a service.
+ *
+ * @param serviceType the service type.
+ * @param network the target network
+ * @param response the response of the discovered service.
+ */
+ public void addOrUpdateService(@NonNull String serviceType, @Nullable Network network,
+ @NonNull MdnsResponse response) {
+ ensureRunningOnHandlerThread(mHandler);
+ final List<MdnsResponse> responses = mCachedServices.computeIfAbsent(
+ new CacheKey(serviceType, network), key -> new ArrayList<>());
+ // Remove existing service if present.
+ final MdnsResponse existing =
+ findMatchedResponse(responses, response.getServiceInstanceName());
+ responses.remove(existing);
+ responses.add(response);
+ }
+
+ /**
+ * Remove a service which matches the given service name, type and network.
+ *
+ * @param serviceName the target service name.
+ * @param serviceType the target service type.
+ * @param network the target network.
+ */
+ @Nullable
+ public MdnsResponse removeService(@NonNull String serviceName, @NonNull String serviceType,
+ @Nullable Network network) {
+ ensureRunningOnHandlerThread(mHandler);
+ final List<MdnsResponse> responses =
+ mCachedServices.get(new CacheKey(serviceType, network));
+ if (responses == null) {
+ return null;
+ }
+ final Iterator<MdnsResponse> iterator = responses.iterator();
+ while (iterator.hasNext()) {
+ final MdnsResponse response = iterator.next();
+ if (equalsIgnoreDnsCase(serviceName, response.getServiceInstanceName())) {
+ iterator.remove();
+ return response;
+ }
+ }
+ return null;
+ }
+
+ // TODO: check ttl expiration for each service and notify to the clients.
+}
diff --git a/service-t/src/com/android/server/connectivity/mdns/MdnsServiceRecord.java b/service-t/src/com/android/server/connectivity/mdns/MdnsServiceRecord.java
index ebd8b77..f851b35 100644
--- a/service-t/src/com/android/server/connectivity/mdns/MdnsServiceRecord.java
+++ b/service-t/src/com/android/server/connectivity/mdns/MdnsServiceRecord.java
@@ -19,6 +19,7 @@
import android.annotation.Nullable;
import com.android.internal.annotations.VisibleForTesting;
+import com.android.server.connectivity.mdns.util.MdnsUtils;
import java.io.IOException;
import java.util.Arrays;
@@ -142,7 +143,8 @@
@Override
public int hashCode() {
return (super.hashCode() * 31)
- + Objects.hash(servicePriority, serviceWeight, Arrays.hashCode(serviceHost),
+ + Objects.hash(servicePriority, serviceWeight,
+ Arrays.hashCode(MdnsUtils.toDnsLabelsLowerCase(serviceHost)),
servicePort);
}
@@ -159,7 +161,7 @@
return super.equals(other)
&& (servicePriority == otherRecord.servicePriority)
&& (serviceWeight == otherRecord.serviceWeight)
- && Arrays.equals(serviceHost, otherRecord.serviceHost)
+ && MdnsUtils.equalsDnsLabelIgnoreDnsCase(serviceHost, otherRecord.serviceHost)
&& (servicePort == otherRecord.servicePort);
}
}
diff --git a/service-t/src/com/android/server/connectivity/mdns/MdnsServiceTypeClient.java b/service-t/src/com/android/server/connectivity/mdns/MdnsServiceTypeClient.java
index df270bb..48e4724 100644
--- a/service-t/src/com/android/server/connectivity/mdns/MdnsServiceTypeClient.java
+++ b/service-t/src/com/android/server/connectivity/mdns/MdnsServiceTypeClient.java
@@ -20,7 +20,6 @@
import android.annotation.NonNull;
import android.annotation.Nullable;
-import android.net.Network;
import android.text.TextUtils;
import android.util.ArrayMap;
import android.util.ArraySet;
@@ -28,13 +27,16 @@
import com.android.internal.annotations.GuardedBy;
import com.android.internal.annotations.VisibleForTesting;
-import com.android.server.connectivity.mdns.util.MdnsLogger;
+import com.android.net.module.util.CollectionUtils;
+import com.android.net.module.util.SharedLog;
+import com.android.server.connectivity.mdns.util.MdnsUtils;
import java.net.Inet4Address;
import java.net.Inet6Address;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
+import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
@@ -49,23 +51,21 @@
public class MdnsServiceTypeClient {
private static final int DEFAULT_MTU = 1500;
- private static final MdnsLogger LOGGER = new MdnsLogger("MdnsServiceTypeClient");
-
private final String serviceType;
private final String[] serviceTypeLabels;
private final MdnsSocketClientBase socketClient;
private final MdnsResponseDecoder responseDecoder;
private final ScheduledExecutorService executor;
+ @NonNull private final SocketKey socketKey;
+ @NonNull private final SharedLog sharedLog;
private final Object lock = new Object();
private final ArrayMap<MdnsServiceBrowserListener, MdnsSearchOptions> listeners =
new ArrayMap<>();
+ // TODO: change instanceNameToResponse to TreeMap with case insensitive comparator.
private final Map<String, MdnsResponse> instanceNameToResponse = new HashMap<>();
private final boolean removeServiceAfterTtlExpires =
MdnsConfigs.removeServiceAfterTtlExpires();
- private final boolean allowSearchOptionsToRemoveExpiredService =
- MdnsConfigs.allowSearchOptionsToRemoveExpiredService();
-
private final MdnsResponseDecoder.Clock clock;
@Nullable private MdnsSearchOptions searchOptions;
@@ -88,8 +88,11 @@
public MdnsServiceTypeClient(
@NonNull String serviceType,
@NonNull MdnsSocketClientBase socketClient,
- @NonNull ScheduledExecutorService executor) {
- this(serviceType, socketClient, executor, new MdnsResponseDecoder.Clock());
+ @NonNull ScheduledExecutorService executor,
+ @NonNull SocketKey socketKey,
+ @NonNull SharedLog sharedLog) {
+ this(serviceType, socketClient, executor, new MdnsResponseDecoder.Clock(), socketKey,
+ sharedLog);
}
@VisibleForTesting
@@ -97,13 +100,17 @@
@NonNull String serviceType,
@NonNull MdnsSocketClientBase socketClient,
@NonNull ScheduledExecutorService executor,
- @NonNull MdnsResponseDecoder.Clock clock) {
+ @NonNull MdnsResponseDecoder.Clock clock,
+ @NonNull SocketKey socketKey,
+ @NonNull SharedLog sharedLog) {
this.serviceType = serviceType;
this.socketClient = socketClient;
this.executor = executor;
this.serviceTypeLabels = TextUtils.split(serviceType, "\\.");
this.responseDecoder = new MdnsResponseDecoder(clock, serviceTypeLabels);
this.clock = clock;
+ this.socketKey = socketKey;
+ this.sharedLog = sharedLog;
}
private static MdnsServiceInfo buildMdnsServiceInfoFromResponse(
@@ -168,33 +175,66 @@
@NonNull MdnsSearchOptions searchOptions) {
synchronized (lock) {
this.searchOptions = searchOptions;
+ boolean hadReply = false;
if (listeners.put(listener, searchOptions) == null) {
for (MdnsResponse existingResponse : instanceNameToResponse.values()) {
+ if (!responseMatchesOptions(existingResponse, searchOptions)) continue;
final MdnsServiceInfo info =
buildMdnsServiceInfoFromResponse(existingResponse, serviceTypeLabels);
listener.onServiceNameDiscovered(info);
if (existingResponse.isComplete()) {
listener.onServiceFound(info);
+ hadReply = true;
}
}
}
// Cancel the next scheduled periodical task.
if (requestTaskFuture != null) {
- requestTaskFuture.cancel(true);
+ cancelRequestTaskLocked();
}
// Keep tracking the ScheduledFuture for the task so we can cancel it if caller is not
// interested anymore.
- requestTaskFuture =
- executor.submit(
- new QueryTask(
- new QueryTaskConfig(
- searchOptions.getSubtypes(),
- searchOptions.isPassiveMode(),
- ++currentSessionId,
- searchOptions.getNetwork())));
+ final QueryTaskConfig taskConfig = new QueryTaskConfig(
+ searchOptions.getSubtypes(),
+ searchOptions.isPassiveMode(),
+ searchOptions.onlyUseIpv6OnIpv6OnlyNetworks(),
+ currentSessionId,
+ socketKey);
+ if (hadReply) {
+ requestTaskFuture = scheduleNextRunLocked(taskConfig);
+ } else {
+ requestTaskFuture = executor.submit(new QueryTask(taskConfig));
+ }
}
}
+ @GuardedBy("lock")
+ private void cancelRequestTaskLocked() {
+ requestTaskFuture.cancel(true);
+ ++currentSessionId;
+ requestTaskFuture = null;
+ }
+
+ private boolean responseMatchesOptions(@NonNull MdnsResponse response,
+ @NonNull MdnsSearchOptions options) {
+ final boolean matchesInstanceName = options.getResolveInstanceName() == null
+ // DNS is case-insensitive, so ignore case in the comparison
+ || MdnsUtils.equalsIgnoreDnsCase(options.getResolveInstanceName(),
+ response.getServiceInstanceName());
+
+ // If discovery is requiring some subtypes, the response must have one that matches a
+ // requested one.
+ final List<String> responseSubtypes = response.getSubtypes() == null
+ ? Collections.emptyList() : response.getSubtypes();
+ final boolean matchesSubtype = options.getSubtypes().size() == 0
+ || CollectionUtils.any(options.getSubtypes(), requiredSub ->
+ CollectionUtils.any(responseSubtypes, actualSub ->
+ MdnsUtils.equalsIgnoreDnsCase(
+ MdnsConstants.SUBTYPE_PREFIX + requiredSub, actualSub)));
+
+ return matchesInstanceName && matchesSubtype;
+ }
+
/**
* Unregisters {@code listener} from receiving discovery event of mDNS service instances.
*
@@ -204,10 +244,11 @@
*/
public boolean stopSendAndReceive(@NonNull MdnsServiceBrowserListener listener) {
synchronized (lock) {
- listeners.remove(listener);
+ if (listeners.remove(listener) == null) {
+ return listeners.isEmpty();
+ }
if (listeners.isEmpty() && requestTaskFuture != null) {
- requestTaskFuture.cancel(true);
- requestTaskFuture = null;
+ cancelRequestTaskLocked();
}
return listeners.isEmpty();
}
@@ -220,21 +261,37 @@
/**
* Process an incoming response packet.
*/
- public synchronized void processResponse(@NonNull MdnsPacket packet, int interfaceIndex,
- Network network) {
+ public synchronized void processResponse(@NonNull MdnsPacket packet,
+ @NonNull SocketKey socketKey) {
synchronized (lock) {
// Augment the list of current known responses, and generated responses for resolve
// requests if there is no known response
final List<MdnsResponse> currentList = new ArrayList<>(instanceNameToResponse.values());
- currentList.addAll(makeResponsesForResolveIfUnknown(interfaceIndex, network));
- final ArraySet<MdnsResponse> modifiedResponses = responseDecoder.augmentResponses(
- packet, currentList, interfaceIndex, network);
+ List<MdnsResponse> additionalResponses = makeResponsesForResolve(socketKey);
+ for (MdnsResponse additionalResponse : additionalResponses) {
+ if (!instanceNameToResponse.containsKey(
+ additionalResponse.getServiceInstanceName())) {
+ currentList.add(additionalResponse);
+ }
+ }
+ final Pair<ArraySet<MdnsResponse>, ArrayList<MdnsResponse>> augmentedResult =
+ responseDecoder.augmentResponses(packet, currentList,
+ socketKey.getInterfaceIndex(), socketKey.getNetwork());
- for (MdnsResponse modified : modifiedResponses) {
- if (modified.isGoodbye()) {
- onGoodbyeReceived(modified.getServiceInstanceName());
- } else {
- onResponseModified(modified);
+ final ArraySet<MdnsResponse> modifiedResponse = augmentedResult.first;
+ final ArrayList<MdnsResponse> allResponses = augmentedResult.second;
+
+ for (MdnsResponse response : allResponses) {
+ if (modifiedResponse.contains(response)) {
+ if (response.isGoodbye()) {
+ onGoodbyeReceived(response.getServiceInstanceName());
+ } else {
+ onResponseModified(response);
+ }
+ } else if (instanceNameToResponse.containsKey(response.getServiceInstanceName())) {
+ // If the response is not modified and already in the cache. The cache will
+ // need to be updated to refresh the last receipt time.
+ instanceNameToResponse.put(response.getServiceInstanceName(), response);
}
}
}
@@ -246,37 +303,72 @@
}
}
+ /** Notify all services are removed because the socket is destroyed. */
+ public void notifySocketDestroyed() {
+ synchronized (lock) {
+ for (MdnsResponse response : instanceNameToResponse.values()) {
+ final String name = response.getServiceInstanceName();
+ if (name == null) continue;
+ for (int i = 0; i < listeners.size(); i++) {
+ if (!responseMatchesOptions(response, listeners.valueAt(i))) continue;
+ final MdnsServiceBrowserListener listener = listeners.keyAt(i);
+ final MdnsServiceInfo serviceInfo =
+ buildMdnsServiceInfoFromResponse(response, serviceTypeLabels);
+ if (response.isComplete()) {
+ sharedLog.log("Socket destroyed. onServiceRemoved: " + name);
+ listener.onServiceRemoved(serviceInfo);
+ }
+ sharedLog.log("Socket destroyed. onServiceNameRemoved: " + name);
+ listener.onServiceNameRemoved(serviceInfo);
+ }
+ }
+
+ if (requestTaskFuture != null) {
+ cancelRequestTaskLocked();
+ }
+ }
+ }
+
private void onResponseModified(@NonNull MdnsResponse response) {
+ final String serviceInstanceName = response.getServiceInstanceName();
final MdnsResponse currentResponse =
- instanceNameToResponse.get(response.getServiceInstanceName());
+ instanceNameToResponse.get(serviceInstanceName);
boolean newServiceFound = false;
boolean serviceBecomesComplete = false;
if (currentResponse == null) {
newServiceFound = true;
- String serviceInstanceName = response.getServiceInstanceName();
if (serviceInstanceName != null) {
instanceNameToResponse.put(serviceInstanceName, response);
}
} else {
boolean before = currentResponse.isComplete();
- instanceNameToResponse.put(response.getServiceInstanceName(), response);
+ instanceNameToResponse.put(serviceInstanceName, response);
boolean after = response.isComplete();
serviceBecomesComplete = !before && after;
}
+ sharedLog.i(String.format(
+ "Handling response from service: %s, newServiceFound: %b, serviceBecomesComplete:"
+ + " %b, responseIsComplete: %b",
+ serviceInstanceName, newServiceFound, serviceBecomesComplete,
+ response.isComplete()));
MdnsServiceInfo serviceInfo =
buildMdnsServiceInfoFromResponse(response, serviceTypeLabels);
for (int i = 0; i < listeners.size(); i++) {
+ if (!responseMatchesOptions(response, listeners.valueAt(i))) continue;
final MdnsServiceBrowserListener listener = listeners.keyAt(i);
if (newServiceFound) {
+ sharedLog.log("onServiceNameDiscovered: " + serviceInfo);
listener.onServiceNameDiscovered(serviceInfo);
}
if (response.isComplete()) {
if (newServiceFound || serviceBecomesComplete) {
+ sharedLog.log("onServiceFound: " + serviceInfo);
listener.onServiceFound(serviceInfo);
} else {
+ sharedLog.log("onServiceUpdated: " + serviceInfo);
listener.onServiceUpdated(serviceInfo);
}
}
@@ -289,12 +381,15 @@
return;
}
for (int i = 0; i < listeners.size(); i++) {
+ if (!responseMatchesOptions(response, listeners.valueAt(i))) continue;
final MdnsServiceBrowserListener listener = listeners.keyAt(i);
final MdnsServiceInfo serviceInfo =
buildMdnsServiceInfoFromResponse(response, serviceTypeLabels);
if (response.isComplete()) {
+ sharedLog.log("onServiceRemoved: " + serviceInfo);
listener.onServiceRemoved(serviceInfo);
}
+ sharedLog.log("onServiceNameRemoved: " + serviceInfo);
listener.onServiceNameRemoved(serviceInfo);
}
}
@@ -303,9 +398,7 @@
if (removeServiceAfterTtlExpires) {
return true;
}
- return allowSearchOptionsToRemoveExpiredService
- && searchOptions != null
- && searchOptions.removeExpiredService();
+ return searchOptions != null && searchOptions.removeExpiredService();
}
@VisibleForTesting
@@ -333,6 +426,7 @@
private final boolean alwaysAskForUnicastResponse =
MdnsConfigs.alwaysAskForUnicastResponseInEachBurst();
private final boolean usePassiveMode;
+ private final boolean onlyUseIpv6OnIpv6OnlyNetworks;
private final long sessionId;
@VisibleForTesting
int transactionId;
@@ -343,11 +437,15 @@
private int burstCounter;
private int timeToRunNextTaskInMs;
private boolean isFirstBurst;
- @Nullable private final Network network;
+ @NonNull private final SocketKey socketKey;
- QueryTaskConfig(@NonNull Collection<String> subtypes, boolean usePassiveMode,
- long sessionId, @Nullable Network network) {
+ QueryTaskConfig(@NonNull Collection<String> subtypes,
+ boolean usePassiveMode,
+ boolean onlyUseIpv6OnIpv6OnlyNetworks,
+ long sessionId,
+ @Nullable SocketKey socketKey) {
this.usePassiveMode = usePassiveMode;
+ this.onlyUseIpv6OnIpv6OnlyNetworks = onlyUseIpv6OnIpv6OnlyNetworks;
this.subtypes = new ArrayList<>(subtypes);
this.queriesPerBurst = QUERIES_PER_BURST;
this.burstCounter = 0;
@@ -368,7 +466,7 @@
// doubles until it maxes out at TIME_BETWEEN_BURSTS_MS.
this.timeBetweenBurstsInMs = INITIAL_TIME_BETWEEN_BURSTS_MS;
}
- this.network = network;
+ this.socketKey = socketKey;
}
QueryTaskConfig getConfigForNextRun() {
@@ -408,8 +506,7 @@
}
}
- private List<MdnsResponse> makeResponsesForResolveIfUnknown(int interfaceIndex,
- @NonNull Network network) {
+ private List<MdnsResponse> makeResponsesForResolve(@NonNull SocketKey socketKey) {
final List<MdnsResponse> resolveResponses = new ArrayList<>();
for (int i = 0; i < listeners.size(); i++) {
final String resolveName = listeners.valueAt(i).getResolveInstanceName();
@@ -424,7 +521,7 @@
instanceFullName.addAll(Arrays.asList(serviceTypeLabels));
knownResponse = new MdnsResponse(
0L /* lastUpdateTime */, instanceFullName.toArray(new String[0]),
- interfaceIndex, network);
+ socketKey.getInterfaceIndex(), socketKey.getNetwork());
}
resolveResponses.add(knownResponse);
}
@@ -448,10 +545,7 @@
// The listener is requesting to resolve a service that has no info in
// cache. Use the provided name to generate a minimal response, so other records are
// queried to complete it.
- // Only the names are used to know which queries to send, other parameters like
- // interfaceIndex do not matter.
- servicesToResolve = makeResponsesForResolveIfUnknown(
- 0 /* interfaceIndex */, config.network);
+ servicesToResolve = makeResponsesForResolve(config.socketKey);
sendDiscoveryQueries = servicesToResolve.size() < listeners.size();
}
Pair<Integer, List<String>> result;
@@ -464,12 +558,14 @@
config.subtypes,
config.expectUnicastResponse,
config.transactionId,
- config.network,
+ config.socketKey,
+ config.onlyUseIpv6OnIpv6OnlyNetworks,
sendDiscoveryQueries,
- servicesToResolve)
+ servicesToResolve,
+ clock)
.call();
} catch (RuntimeException e) {
- LOGGER.e(String.format("Failed to run EnqueueMdnsQueryCallable for subtype: %s",
+ sharedLog.e(String.format("Failed to run EnqueueMdnsQueryCallable for subtype: %s",
TextUtils.join(",", config.subtypes)), e);
result = null;
}
@@ -506,27 +602,36 @@
== 0) {
iter.remove();
for (int i = 0; i < listeners.size(); i++) {
+ if (!responseMatchesOptions(existingResponse,
+ listeners.valueAt(i))) {
+ continue;
+ }
final MdnsServiceBrowserListener listener = listeners.keyAt(i);
- String serviceInstanceName =
- existingResponse.getServiceInstanceName();
- if (serviceInstanceName != null) {
+ if (existingResponse.getServiceInstanceName() != null) {
final MdnsServiceInfo serviceInfo =
buildMdnsServiceInfoFromResponse(
existingResponse, serviceTypeLabels);
if (existingResponse.isComplete()) {
+ sharedLog.log("TTL expired. onServiceRemoved: "
+ + serviceInfo);
listener.onServiceRemoved(serviceInfo);
}
+ sharedLog.log("TTL expired. onServiceNameRemoved: "
+ + serviceInfo);
listener.onServiceNameRemoved(serviceInfo);
}
}
}
}
}
- QueryTaskConfig config = this.config.getConfigForNextRun();
- requestTaskFuture =
- executor.schedule(
- new QueryTask(config), config.timeToRunNextTaskInMs, MILLISECONDS);
+ requestTaskFuture = scheduleNextRunLocked(this.config);
}
}
}
+
+ @NonNull
+ private Future<?> scheduleNextRunLocked(@NonNull QueryTaskConfig lastRunConfig) {
+ QueryTaskConfig config = lastRunConfig.getConfigForNextRun();
+ return executor.schedule(new QueryTask(config), config.timeToRunNextTaskInMs, MILLISECONDS);
+ }
}
\ No newline at end of file
diff --git a/service-t/src/com/android/server/connectivity/mdns/MdnsSocket.java b/service-t/src/com/android/server/connectivity/mdns/MdnsSocket.java
index 5fd1354..cdd9f76 100644
--- a/service-t/src/com/android/server/connectivity/mdns/MdnsSocket.java
+++ b/service-t/src/com/android/server/connectivity/mdns/MdnsSocket.java
@@ -93,6 +93,10 @@
}
for (NetworkInterfaceWrapper networkInterface : networkInterfaces) {
multicastSocket.joinGroup(multicastAddress, networkInterface.getNetworkInterface());
+ if (!isOnIPv6OnlyNetwork) {
+ multicastSocket.joinGroup(
+ MULTICAST_IPV6_ADDRESS, networkInterface.getNetworkInterface());
+ }
}
}
@@ -105,6 +109,10 @@
}
for (NetworkInterfaceWrapper networkInterface : networkInterfaces) {
multicastSocket.leaveGroup(multicastAddress, networkInterface.getNetworkInterface());
+ if (!isOnIPv6OnlyNetwork) {
+ multicastSocket.leaveGroup(
+ MULTICAST_IPV6_ADDRESS, networkInterface.getNetworkInterface());
+ }
}
}
diff --git a/service-t/src/com/android/server/connectivity/mdns/MdnsSocketClient.java b/service-t/src/com/android/server/connectivity/mdns/MdnsSocketClient.java
index c03e6aa..9c9812d 100644
--- a/service-t/src/com/android/server/connectivity/mdns/MdnsSocketClient.java
+++ b/service-t/src/com/android/server/connectivity/mdns/MdnsSocketClient.java
@@ -31,6 +31,9 @@
import java.io.IOException;
import java.net.DatagramPacket;
+import java.net.Inet4Address;
+import java.net.Inet6Address;
+import java.net.InetSocketAddress;
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.List;
@@ -194,27 +197,58 @@
}
}
- /** Sends a mDNS request packet that asks for multicast response. */
@Override
- public void sendMulticastPacket(@NonNull DatagramPacket packet) {
- sendMdnsPacket(packet, multicastPacketQueue);
+ public void sendPacketRequestingMulticastResponse(@NonNull DatagramPacket packet,
+ boolean onlyUseIpv6OnIpv6OnlyNetworks) {
+ sendMdnsPacket(packet, multicastPacketQueue, onlyUseIpv6OnIpv6OnlyNetworks);
}
- /** Sends a mDNS request packet that asks for unicast response. */
@Override
- public void sendUnicastPacket(DatagramPacket packet) {
+ public void sendPacketRequestingUnicastResponse(@NonNull DatagramPacket packet,
+ boolean onlyUseIpv6OnIpv6OnlyNetworks) {
if (useSeparateSocketForUnicast) {
- sendMdnsPacket(packet, unicastPacketQueue);
+ sendMdnsPacket(packet, unicastPacketQueue, onlyUseIpv6OnIpv6OnlyNetworks);
} else {
- sendMdnsPacket(packet, multicastPacketQueue);
+ sendMdnsPacket(packet, multicastPacketQueue, onlyUseIpv6OnIpv6OnlyNetworks);
}
}
- private void sendMdnsPacket(DatagramPacket packet, Queue<DatagramPacket> packetQueueToUse) {
+ @Override
+ public void notifyNetworkRequested(
+ @NonNull MdnsServiceBrowserListener listener,
+ @Nullable Network network,
+ @NonNull SocketCreationCallback socketCreationCallback) {
+ if (network != null) {
+ throw new IllegalArgumentException("This socket client does not support requesting "
+ + "specific networks");
+ }
+ socketCreationCallback.onSocketCreated(new SocketKey(multicastSocket.getInterfaceIndex()));
+ }
+
+ @Override
+ public boolean supportsRequestingSpecificNetworks() {
+ return false;
+ }
+
+ private void sendMdnsPacket(DatagramPacket packet, Queue<DatagramPacket> packetQueueToUse,
+ boolean onlyUseIpv6OnIpv6OnlyNetworks) {
if (shouldStopSocketLoop && !MdnsConfigs.allowAddMdnsPacketAfterDiscoveryStops()) {
LOGGER.w("sendMdnsPacket() is called after discovery already stopped");
return;
}
+
+ final boolean isIpv4 = ((InetSocketAddress) packet.getSocketAddress()).getAddress()
+ instanceof Inet4Address;
+ final boolean isIpv6 = ((InetSocketAddress) packet.getSocketAddress()).getAddress()
+ instanceof Inet6Address;
+ final boolean ipv6Only = multicastSocket != null && multicastSocket.isOnIPv6OnlyNetwork();
+ if (isIpv4 && ipv6Only) {
+ return;
+ }
+ if (isIpv6 && !ipv6Only && onlyUseIpv6OnIpv6OnlyNetworks) {
+ return;
+ }
+
synchronized (packetQueueToUse) {
while (packetQueueToUse.size() >= MdnsConfigs.mdnsPacketQueueMaxSize()) {
packetQueueToUse.remove();
@@ -423,7 +457,8 @@
LOGGER.w(String.format("Error while decoding %s packet (%d): %d",
responseType, packetNumber, e.code));
if (callback != null) {
- callback.onFailedToParseMdnsResponse(packetNumber, e.code);
+ callback.onFailedToParseMdnsResponse(packetNumber, e.code,
+ new SocketKey(network, interfaceIndex));
}
return e.code;
}
@@ -433,7 +468,8 @@
}
if (callback != null) {
- callback.onResponseReceived(response, interfaceIndex, network);
+ callback.onResponseReceived(
+ response, new SocketKey(network, interfaceIndex));
}
return MdnsResponseErrorCode.SUCCESS;
@@ -500,8 +536,4 @@
}
packets.clear();
}
-
- public boolean isOnIPv6OnlyNetwork() {
- return multicastSocket != null && multicastSocket.isOnIPv6OnlyNetwork();
- }
}
\ No newline at end of file
diff --git a/service-t/src/com/android/server/connectivity/mdns/MdnsSocketClientBase.java b/service-t/src/com/android/server/connectivity/mdns/MdnsSocketClientBase.java
index 796dc83..b6000f0 100644
--- a/service-t/src/com/android/server/connectivity/mdns/MdnsSocketClientBase.java
+++ b/service-t/src/com/android/server/connectivity/mdns/MdnsSocketClientBase.java
@@ -19,6 +19,7 @@
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.net.Network;
+import android.os.Looper;
import java.io.IOException;
import java.net.DatagramPacket;
@@ -38,44 +39,49 @@
/*** Set callback for receiving mDns response */
void setCallback(@Nullable Callback callback);
- /*** Sends a mDNS request packet that asks for multicast response. */
- void sendMulticastPacket(@NonNull DatagramPacket packet);
+ /**
+ * Send a mDNS request packet via given network that asks for multicast response.
+ */
+ void sendPacketRequestingMulticastResponse(@NonNull DatagramPacket packet,
+ boolean onlyUseIpv6OnIpv6OnlyNetworks);
/**
- * Sends a mDNS request packet via given network that asks for multicast response. Null network
- * means sending packet via all networks.
+ * Send a mDNS request packet via given network that asks for unicast response.
*/
- default void sendMulticastPacket(@NonNull DatagramPacket packet, @Nullable Network network) {
- throw new UnsupportedOperationException(
- "This socket client doesn't support per-network sending");
- }
-
- /*** Sends a mDNS request packet that asks for unicast response. */
- void sendUnicastPacket(@NonNull DatagramPacket packet);
-
- /**
- * Sends a mDNS request packet via given network that asks for unicast response. Null network
- * means sending packet via all networks.
- */
- default void sendUnicastPacket(@NonNull DatagramPacket packet, @Nullable Network network) {
- throw new UnsupportedOperationException(
- "This socket client doesn't support per-network sending");
- }
+ void sendPacketRequestingUnicastResponse(@NonNull DatagramPacket packet,
+ boolean onlyUseIpv6OnIpv6OnlyNetworks);
/*** Notify that the given network is requested for mdns discovery / resolution */
- default void notifyNetworkRequested(@NonNull MdnsServiceBrowserListener listener,
- @Nullable Network network) { }
+ void notifyNetworkRequested(@NonNull MdnsServiceBrowserListener listener,
+ @Nullable Network network, @NonNull SocketCreationCallback socketCreationCallback);
/*** Notify that the network is unrequested */
default void notifyNetworkUnrequested(@NonNull MdnsServiceBrowserListener listener) { }
+ /*** Gets looper that used by the socket client */
+ default Looper getLooper() {
+ return null;
+ }
+
+ /** Returns whether the socket client support requesting per network */
+ boolean supportsRequestingSpecificNetworks();
+
/*** Callback for mdns response */
interface Callback {
/*** Receive a mdns response */
- void onResponseReceived(@NonNull MdnsPacket packet, int interfaceIndex,
- @Nullable Network network);
+ void onResponseReceived(@NonNull MdnsPacket packet, @NonNull SocketKey socketKey);
/*** Parse a mdns response failed */
- void onFailedToParseMdnsResponse(int receivedPacketNumber, int errorCode);
+ void onFailedToParseMdnsResponse(int receivedPacketNumber, int errorCode,
+ @NonNull SocketKey socketKey);
}
-}
+
+ /*** Callback for requested socket creation */
+ interface SocketCreationCallback {
+ /*** Notify requested socket is created */
+ void onSocketCreated(@NonNull SocketKey socketKey);
+
+ /*** Notify requested socket is destroyed */
+ void onSocketDestroyed(@NonNull SocketKey socketKey);
+ }
+}
\ No newline at end of file
diff --git a/service-t/src/com/android/server/connectivity/mdns/MdnsSocketProvider.java b/service-t/src/com/android/server/connectivity/mdns/MdnsSocketProvider.java
index 743f946..e963ab7 100644
--- a/service-t/src/com/android/server/connectivity/mdns/MdnsSocketProvider.java
+++ b/service-t/src/com/android/server/connectivity/mdns/MdnsSocketProvider.java
@@ -16,37 +16,48 @@
package com.android.server.connectivity.mdns;
+import static android.net.NetworkCapabilities.TRANSPORT_CELLULAR;
+import static android.net.NetworkCapabilities.TRANSPORT_VPN;
+import static android.net.NetworkCapabilities.TRANSPORT_WIFI;
+
+import static com.android.server.connectivity.mdns.util.MdnsUtils.ensureRunningOnHandlerThread;
+import static com.android.server.connectivity.mdns.util.MdnsUtils.isNetworkMatched;
+
import android.annotation.NonNull;
import android.annotation.Nullable;
+import android.content.BroadcastReceiver;
import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
import android.net.ConnectivityManager;
import android.net.ConnectivityManager.NetworkCallback;
-import android.net.INetd;
import android.net.LinkAddress;
import android.net.LinkProperties;
import android.net.Network;
+import android.net.NetworkCapabilities;
import android.net.NetworkRequest;
import android.net.TetheringManager;
import android.net.TetheringManager.TetheringEventCallback;
+import android.net.wifi.p2p.WifiP2pGroup;
+import android.net.wifi.p2p.WifiP2pInfo;
+import android.net.wifi.p2p.WifiP2pManager;
import android.os.Handler;
import android.os.Looper;
-import android.system.OsConstants;
import android.util.ArrayMap;
import android.util.Log;
+import android.util.SparseArray;
import com.android.internal.annotations.VisibleForTesting;
import com.android.net.module.util.CollectionUtils;
import com.android.net.module.util.LinkPropertiesUtils.CompareResult;
-import com.android.net.module.util.ip.NetlinkMonitor;
-import com.android.net.module.util.netlink.NetlinkConstants;
-import com.android.net.module.util.netlink.NetlinkMessage;
-import com.android.server.connectivity.mdns.util.MdnsLogger;
+import com.android.net.module.util.SharedLog;
import java.io.IOException;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.util.ArrayList;
import java.util.List;
+import java.util.Objects;
/**
* The {@link MdnsSocketProvider} manages the multiple sockets for mDns.
@@ -64,41 +75,114 @@
// But 1440 should generally be enough because of standard Ethernet.
// Note: mdnsresponder mDNSEmbeddedAPI.h uses 8940 for Ethernet jumbo frames.
private static final int READ_BUFFER_SIZE = 2048;
- private static final MdnsLogger LOGGER = new MdnsLogger(TAG);
+ private static final int IFACE_IDX_NOT_EXIST = -1;
@NonNull private final Context mContext;
@NonNull private final Looper mLooper;
@NonNull private final Handler mHandler;
@NonNull private final Dependencies mDependencies;
@NonNull private final NetworkCallback mNetworkCallback;
@NonNull private final TetheringEventCallback mTetheringEventCallback;
- @NonNull private final NetlinkMonitor mNetlinkMonitor;
+ @NonNull private final AbstractSocketNetlink mSocketNetlinkMonitor;
+ @NonNull private final SharedLog mSharedLog;
private final ArrayMap<Network, SocketInfo> mNetworkSockets = new ArrayMap<>();
private final ArrayMap<String, SocketInfo> mTetherInterfaceSockets = new ArrayMap<>();
private final ArrayMap<Network, LinkProperties> mActiveNetworksLinkProperties =
new ArrayMap<>();
+ private final ArrayMap<Network, int[]> mActiveNetworksTransports = new ArrayMap<>();
private final ArrayMap<SocketCallback, Network> mCallbacksToRequestedNetworks =
new ArrayMap<>();
private final List<String> mLocalOnlyInterfaces = new ArrayList<>();
private final List<String> mTetheredInterfaces = new ArrayList<>();
+ // mIfaceIdxToLinkProperties should not be cleared in maybeStopMonitoringSockets() because
+ // the netlink monitor is never stop and the old states must be kept.
+ private final SparseArray<LinkProperties> mIfaceIdxToLinkProperties = new SparseArray<>();
private final byte[] mPacketReadBuffer = new byte[READ_BUFFER_SIZE];
+ @NonNull
+ private final SocketRequestMonitor mSocketRequestMonitor;
private boolean mMonitoringSockets = false;
private boolean mRequestStop = false;
+ private String mWifiP2pTetherInterface = null;
- public MdnsSocketProvider(@NonNull Context context, @NonNull Looper looper) {
- this(context, looper, new Dependencies());
+ private final BroadcastReceiver mIntentReceiver = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ final String newP2pIface = getWifiP2pInterface(intent);
+
+ if (!mMonitoringSockets || !hasAllNetworksRequest()) {
+ mWifiP2pTetherInterface = newP2pIface;
+ return;
+ }
+
+ // If already serving from the correct interface, nothing to do.
+ if (Objects.equals(mWifiP2pTetherInterface, newP2pIface)) return;
+
+ if (mWifiP2pTetherInterface != null) {
+ if (newP2pIface != null) {
+ Log.wtf(TAG, "Wifi p2p interface is changed from " + mWifiP2pTetherInterface
+ + " to " + newP2pIface + " without null broadcast");
+ }
+ // Remove the socket.
+ removeTetherInterfaceSocket(mWifiP2pTetherInterface);
+ }
+
+ // Update mWifiP2pTetherInterface
+ mWifiP2pTetherInterface = newP2pIface;
+
+ // Check whether the socket for wifi p2p interface is created or not.
+ final boolean socketAlreadyExists = mTetherInterfaceSockets.get(newP2pIface) != null;
+ if (newP2pIface != null && !socketAlreadyExists) {
+ // Create a socket for wifi p2p interface.
+ final int ifaceIndex =
+ mDependencies.getNetworkInterfaceIndexByName(newP2pIface);
+ createSocket(LOCAL_NET, createLPForTetheredInterface(newP2pIface, ifaceIndex));
+ }
+ }
+ };
+
+ @Nullable
+ private static String getWifiP2pInterface(final Intent intent) {
+ final WifiP2pGroup group =
+ intent.getParcelableExtra(WifiP2pManager.EXTRA_WIFI_P2P_GROUP);
+ final WifiP2pInfo p2pInfo =
+ intent.getParcelableExtra(WifiP2pManager.EXTRA_WIFI_P2P_INFO);
+ if (group == null || p2pInfo == null) {
+ return null;
+ }
+
+ if (!p2pInfo.groupFormed) {
+ return null;
+ } else {
+ return group.getInterface();
+ }
+ }
+
+ public MdnsSocketProvider(@NonNull Context context, @NonNull Looper looper,
+ @NonNull SharedLog sharedLog,
+ @NonNull SocketRequestMonitor socketRequestMonitor) {
+ this(context, looper, new Dependencies(), sharedLog, socketRequestMonitor);
}
MdnsSocketProvider(@NonNull Context context, @NonNull Looper looper,
- @NonNull Dependencies deps) {
+ @NonNull Dependencies deps, @NonNull SharedLog sharedLog,
+ @NonNull SocketRequestMonitor socketRequestMonitor) {
mContext = context;
mLooper = looper;
mHandler = new Handler(looper);
mDependencies = deps;
+ mSharedLog = sharedLog;
+ mSocketRequestMonitor = socketRequestMonitor;
mNetworkCallback = new NetworkCallback() {
@Override
public void onLost(Network network) {
mActiveNetworksLinkProperties.remove(network);
- removeSocket(network, null /* interfaceName */);
+ mActiveNetworksTransports.remove(network);
+ removeNetworkSocket(network);
+ }
+
+ @Override
+ public void onCapabilitiesChanged(@NonNull Network network,
+ @NonNull NetworkCapabilities networkCapabilities) {
+ mActiveNetworksTransports.put(network, networkCapabilities.getTransportTypes());
}
@Override
@@ -118,7 +202,20 @@
}
};
- mNetlinkMonitor = new SocketNetlinkMonitor(mHandler);
+ mSocketNetlinkMonitor = mDependencies.createSocketNetlinkMonitor(mHandler,
+ mSharedLog.forSubComponent("NetlinkMonitor"), new NetLinkMessageProcessor());
+
+ // Register a intent receiver to listen wifi p2p interface changes.
+ // Note: The wifi p2p interface change is only notified via
+ // TetheringEventCallback#onLocalOnlyInterfacesChanged if the device is the wifi p2p group
+ // owner. In this case, MdnsSocketProvider will receive duplicate interface changes and must
+ // ignore the later notification because the socket has already been created. There is only
+ // one notification from the wifi p2p connection change intent if the device is not the wifi
+ // p2p group owner.
+ final IntentFilter intentFilter =
+ new IntentFilter(WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION);
+ mContext.registerReceiver(
+ mIntentReceiver, intentFilter, null /* broadcastPermission */, mHandler);
}
/**
@@ -133,47 +230,102 @@
return ni == null ? null : new NetworkInterfaceWrapper(ni);
}
- /*** Check whether given network interface can support mdns */
- public boolean canScanOnInterface(@NonNull NetworkInterfaceWrapper networkInterface) {
- return MulticastNetworkInterfaceProvider.canScanOnInterface(networkInterface);
- }
-
/*** Create a MdnsInterfaceSocket */
public MdnsInterfaceSocket createMdnsInterfaceSocket(
@NonNull NetworkInterface networkInterface, int port, @NonNull Looper looper,
@NonNull byte[] packetReadBuffer) throws IOException {
return new MdnsInterfaceSocket(networkInterface, port, looper, packetReadBuffer);
}
- }
+ /*** Get network interface by given interface name */
+ public int getNetworkInterfaceIndexByName(@NonNull final String ifaceName) {
+ final NetworkInterface iface;
+ try {
+ iface = NetworkInterface.getByName(ifaceName);
+ } catch (SocketException e) {
+ Log.e(TAG, "Error querying interface", e);
+ return IFACE_IDX_NOT_EXIST;
+ }
+ if (iface == null) {
+ Log.e(TAG, "Interface not found: " + ifaceName);
+ return IFACE_IDX_NOT_EXIST;
+ }
+ return iface.getIndex();
+ }
+ /*** Creates a SocketNetlinkMonitor */
+ public AbstractSocketNetlink createSocketNetlinkMonitor(@NonNull final Handler handler,
+ @NonNull final SharedLog log,
+ @NonNull final NetLinkMonitorCallBack cb) {
+ return SocketNetLinkMonitorFactory.createNetLinkMonitor(handler, log, cb);
+ }
+ }
+ /**
+ * The callback interface for the netlink monitor messages.
+ */
+ public interface NetLinkMonitorCallBack {
+ /**
+ * Handles the interface address add or update.
+ */
+ void addOrUpdateInterfaceAddress(int ifaceIdx, @NonNull LinkAddress newAddress);
+
+
+ /**
+ * Handles the interface address delete.
+ */
+ void deleteInterfaceAddress(int ifaceIdx, @NonNull LinkAddress deleteAddress);
+ }
+ private class NetLinkMessageProcessor implements NetLinkMonitorCallBack {
+
+ @Override
+ public void addOrUpdateInterfaceAddress(int ifaceIdx,
+ @NonNull final LinkAddress newAddress) {
+
+ LinkProperties linkProperties;
+ linkProperties = mIfaceIdxToLinkProperties.get(ifaceIdx);
+ if (linkProperties == null) {
+ linkProperties = new LinkProperties();
+ mIfaceIdxToLinkProperties.put(ifaceIdx, linkProperties);
+ }
+ boolean updated = linkProperties.addLinkAddress(newAddress);
+
+ if (!updated) {
+ return;
+ }
+ maybeUpdateTetheringSocketAddress(ifaceIdx, linkProperties.getLinkAddresses());
+ }
+
+ @Override
+ public void deleteInterfaceAddress(int ifaceIdx, @NonNull LinkAddress deleteAddress) {
+ LinkProperties linkProperties;
+ boolean updated = false;
+ linkProperties = mIfaceIdxToLinkProperties.get(ifaceIdx);
+ if (linkProperties != null) {
+ updated = linkProperties.removeLinkAddress(deleteAddress);
+ if (linkProperties.getLinkAddresses().isEmpty()) {
+ mIfaceIdxToLinkProperties.remove(ifaceIdx);
+ }
+ }
+
+ if (linkProperties == null || !updated) {
+ return;
+ }
+ maybeUpdateTetheringSocketAddress(ifaceIdx, linkProperties.getLinkAddresses());
+
+ }
+ }
/*** Data class for storing socket related info */
private static class SocketInfo {
final MdnsInterfaceSocket mSocket;
final List<LinkAddress> mAddresses;
+ final int[] mTransports;
+ @NonNull final SocketKey mSocketKey;
- SocketInfo(MdnsInterfaceSocket socket, List<LinkAddress> addresses) {
+ SocketInfo(MdnsInterfaceSocket socket, List<LinkAddress> addresses, int[] transports,
+ @NonNull SocketKey socketKey) {
mSocket = socket;
mAddresses = new ArrayList<>(addresses);
- }
- }
-
- private static class SocketNetlinkMonitor extends NetlinkMonitor {
- SocketNetlinkMonitor(Handler handler) {
- super(handler, LOGGER.mLog, TAG, OsConstants.NETLINK_ROUTE,
- NetlinkConstants.RTMGRP_IPV4_IFADDR | NetlinkConstants.RTMGRP_IPV6_IFADDR);
- }
-
- @Override
- public void processNetlinkMessage(NetlinkMessage nlMsg, long whenMs) {
- // TODO: Handle netlink message.
- }
- }
-
- /*** Ensure that current running thread is same as given handler thread */
- public static void ensureRunningOnHandlerThread(Handler handler) {
- if (handler.getLooper().getThread() != Thread.currentThread()) {
- throw new IllegalStateException(
- "Not running on Handler thread: " + Thread.currentThread().getName());
+ mTransports = transports;
+ mSocketKey = socketKey;
}
}
@@ -185,7 +337,7 @@
Log.d(TAG, "Already monitoring sockets.");
return;
}
- if (DBG) Log.d(TAG, "Start monitoring sockets.");
+ mSharedLog.i("Start monitoring sockets.");
mContext.getSystemService(ConnectivityManager.class).registerNetworkCallback(
new NetworkRequest.Builder().clearCapabilities().build(),
mNetworkCallback, mHandler);
@@ -193,9 +345,20 @@
final TetheringManager tetheringManager = mContext.getSystemService(TetheringManager.class);
tetheringManager.registerTetheringEventCallback(mHandler::post, mTetheringEventCallback);
- mHandler.post(mNetlinkMonitor::start);
+ if (mSocketNetlinkMonitor.isSupported()) {
+ mHandler.post(mSocketNetlinkMonitor::startMonitoring);
+ }
mMonitoringSockets = true;
}
+ /**
+ * Start netlink monitor.
+ */
+ public void startNetLinkMonitor() {
+ ensureRunningOnHandlerThread(mHandler);
+ if (mSocketNetlinkMonitor.isSupported()) {
+ mSocketNetlinkMonitor.startMonitoring();
+ }
+ }
private void maybeStopMonitoringSockets() {
if (!mMonitoringSockets) return; // Already unregistered.
@@ -203,16 +366,23 @@
// Only unregister the network callback if there is no socket request.
if (mCallbacksToRequestedNetworks.isEmpty()) {
+ mSharedLog.i("Stop monitoring sockets.");
mContext.getSystemService(ConnectivityManager.class)
.unregisterNetworkCallback(mNetworkCallback);
final TetheringManager tetheringManager = mContext.getSystemService(
TetheringManager.class);
tetheringManager.unregisterTetheringEventCallback(mTetheringEventCallback);
-
- mHandler.post(mNetlinkMonitor::stop);
+ // Clear all saved status.
+ mActiveNetworksLinkProperties.clear();
+ mNetworkSockets.clear();
+ mTetherInterfaceSockets.clear();
+ mLocalOnlyInterfaces.clear();
+ mTetheredInterfaces.clear();
mMonitoringSockets = false;
}
+ // The netlink monitor is not stopped here because the MdnsSocketProvider need to listen
+ // to all the netlink updates when the system is up and running.
}
/*** Request to stop monitoring sockets and unregister callbacks */
@@ -222,17 +392,10 @@
Log.d(TAG, "Monitoring sockets hasn't been started.");
return;
}
- if (DBG) Log.d(TAG, "Try to stop monitoring sockets.");
mRequestStop = true;
maybeStopMonitoringSockets();
}
- /*** Check whether the target network is matched current network */
- public static boolean isNetworkMatched(@Nullable Network targetNetwork,
- @NonNull Network currentNetwork) {
- return targetNetwork == null || targetNetwork.equals(currentNetwork);
- }
-
private boolean matchRequestedNetwork(Network network) {
return hasAllNetworksRequest()
|| mCallbacksToRequestedNetworks.containsValue(network);
@@ -252,25 +415,43 @@
return;
}
+ final NetworkAsKey networkKey = new NetworkAsKey(network);
final SocketInfo socketInfo = mNetworkSockets.get(network);
if (socketInfo == null) {
- createSocket(network, lp);
+ createSocket(networkKey, lp);
} else {
- // Update the addresses of this socket.
- final List<LinkAddress> addresses = lp.getLinkAddresses();
- socketInfo.mAddresses.clear();
- socketInfo.mAddresses.addAll(addresses);
- // Try to join the group again.
- socketInfo.mSocket.joinGroup(addresses);
-
- notifyAddressesChanged(network, socketInfo.mSocket, lp);
+ updateSocketInfoAddress(network, socketInfo, lp.getLinkAddresses());
+ }
+ }
+ private void maybeUpdateTetheringSocketAddress(int ifaceIndex,
+ @NonNull final List<LinkAddress> updatedAddresses) {
+ for (int i = 0; i < mTetherInterfaceSockets.size(); ++i) {
+ String tetheringInterfaceName = mTetherInterfaceSockets.keyAt(i);
+ if (mDependencies.getNetworkInterfaceIndexByName(tetheringInterfaceName)
+ == ifaceIndex) {
+ updateSocketInfoAddress(null /* network */,
+ mTetherInterfaceSockets.valueAt(i), updatedAddresses);
+ return;
+ }
}
}
- private static LinkProperties createLPForTetheredInterface(String interfaceName) {
- final LinkProperties linkProperties = new LinkProperties();
+ private void updateSocketInfoAddress(@Nullable final Network network,
+ @NonNull final SocketInfo socketInfo,
+ @NonNull final List<LinkAddress> addresses) {
+ // Update the addresses of this socket.
+ socketInfo.mAddresses.clear();
+ socketInfo.mAddresses.addAll(addresses);
+ // Try to join the group again.
+ socketInfo.mSocket.joinGroup(addresses);
+
+ notifyAddressesChanged(network, socketInfo, addresses);
+ }
+ private LinkProperties createLPForTetheredInterface(@NonNull final String interfaceName,
+ int ifaceIndex) {
+ final LinkProperties linkProperties =
+ new LinkProperties(mIfaceIdxToLinkProperties.get(ifaceIndex));
linkProperties.setInterfaceName(interfaceName);
- // TODO: Use NetlinkMonitor to update addresses for tethering interfaces.
return linkProperties;
}
@@ -278,27 +459,39 @@
if (!hasAllNetworksRequest()) {
// Currently, the network for tethering can not be requested, so the sockets for
// tethering are only created if there is a request for all networks (interfaces).
- // Therefore, this change can skip if there is no such request.
+ // Therefore, only update the interface list and skip this change if no such request.
if (DBG) {
Log.d(TAG, "Ignore tether interfaces change. There is no request for all"
+ " networks.");
}
+ current.clear();
+ current.addAll(updated);
return;
}
final CompareResult<String> interfaceDiff = new CompareResult<>(
current, updated);
for (String name : interfaceDiff.added) {
- createSocket(new Network(INetd.LOCAL_NET_ID), createLPForTetheredInterface(name));
+ // Check if a socket has been created for the interface
+ final SocketInfo socketInfo = mTetherInterfaceSockets.get(name);
+ if (socketInfo != null) {
+ if (DBG) {
+ mSharedLog.i("Socket is existed for interface:" + name);
+ }
+ continue;
+ }
+
+ int ifaceIndex = mDependencies.getNetworkInterfaceIndexByName(name);
+ createSocket(LOCAL_NET, createLPForTetheredInterface(name, ifaceIndex));
}
for (String name : interfaceDiff.removed) {
- removeSocket(new Network(INetd.LOCAL_NET_ID), name);
+ removeTetherInterfaceSocket(name);
}
current.clear();
current.addAll(updated);
}
- private void createSocket(Network network, LinkProperties lp) {
+ private void createSocket(NetworkKey networkKey, LinkProperties lp) {
final String interfaceName = lp.getInterfaceName();
if (interfaceName == null) {
Log.e(TAG, "Can not create socket with null interface name.");
@@ -308,72 +501,131 @@
try {
final NetworkInterfaceWrapper networkInterface =
mDependencies.getNetworkInterfaceByName(interfaceName);
- if (networkInterface == null || !mDependencies.canScanOnInterface(networkInterface)) {
+ // There are no transports for tethered interfaces. Other interfaces should always
+ // have transports since LinkProperties updates are always sent after
+ // NetworkCapabilities updates.
+ final int[] transports;
+ if (networkKey == LOCAL_NET) {
+ transports = new int[0];
+ } else {
+ final int[] knownTransports =
+ mActiveNetworksTransports.get(((NetworkAsKey) networkKey).mNetwork);
+ if (knownTransports != null) {
+ transports = knownTransports;
+ } else {
+ Log.wtf(TAG, "transports is missing for key: " + networkKey);
+ transports = new int[0];
+ }
+ }
+ if (networkInterface == null || !isMdnsCapableInterface(networkInterface, transports)) {
return;
}
- if (DBG) {
- Log.d(TAG, "Create a socket on network:" + network
- + " with interfaceName:" + interfaceName);
- }
+ mSharedLog.log("Create socket on net:" + networkKey + ", ifName:" + interfaceName);
final MdnsInterfaceSocket socket = mDependencies.createMdnsInterfaceSocket(
networkInterface.getNetworkInterface(), MdnsConstants.MDNS_PORT, mLooper,
mPacketReadBuffer);
- final List<LinkAddress> addresses;
- if (network.netId == INetd.LOCAL_NET_ID) {
- addresses = CollectionUtils.map(
- networkInterface.getInterfaceAddresses(), LinkAddress::new);
- mTetherInterfaceSockets.put(interfaceName, new SocketInfo(socket, addresses));
+ final List<LinkAddress> addresses = lp.getLinkAddresses();
+ final Network network =
+ networkKey == LOCAL_NET ? null : ((NetworkAsKey) networkKey).mNetwork;
+ final SocketKey socketKey = new SocketKey(network, networkInterface.getIndex());
+ // TODO: technically transport types are mutable, although generally not in ways that
+ // would meaningfully impact the logic using it here. Consider updating logic to
+ // support transports being added/removed.
+ final SocketInfo socketInfo = new SocketInfo(socket, addresses, transports, socketKey);
+ if (networkKey == LOCAL_NET) {
+ mTetherInterfaceSockets.put(interfaceName, socketInfo);
} else {
- addresses = lp.getLinkAddresses();
- mNetworkSockets.put(network, new SocketInfo(socket, addresses));
+ mNetworkSockets.put(network, socketInfo);
}
// Try to join IPv4/IPv6 group.
socket.joinGroup(addresses);
// Notify the listeners which need this socket.
- notifySocketCreated(network, socket, addresses);
+ notifySocketCreated(network, socketInfo);
} catch (IOException e) {
- Log.e(TAG, "Create a socket failed with interface=" + interfaceName, e);
+ mSharedLog.e("Create socket failed ifName:" + interfaceName, e);
}
}
- private void removeSocket(Network network, String interfaceName) {
- final SocketInfo socketInfo = network.netId == INetd.LOCAL_NET_ID
- ? mTetherInterfaceSockets.remove(interfaceName)
- : mNetworkSockets.remove(network);
+ private boolean isMdnsCapableInterface(
+ @NonNull NetworkInterfaceWrapper iface, @NonNull int[] transports) {
+ try {
+ // Never try mDNS on cellular, or on interfaces with incompatible flags
+ if (CollectionUtils.contains(transports, TRANSPORT_CELLULAR)
+ || iface.isLoopback()
+ || iface.isPointToPoint()
+ || iface.isVirtual()
+ || !iface.isUp()) {
+ return false;
+ }
+
+ // Otherwise, always try mDNS on non-VPN Wifi.
+ if (!CollectionUtils.contains(transports, TRANSPORT_VPN)
+ && CollectionUtils.contains(transports, TRANSPORT_WIFI)) {
+ return true;
+ }
+
+ // For other transports, or no transports (tethering downstreams), do mDNS based on the
+ // interface flags. This is not always reliable (for example some Wifi interfaces may
+ // not have the MULTICAST flag even though they can do mDNS, and some cellular
+ // interfaces may have the BROADCAST or MULTICAST flags), so checks are done based on
+ // transports above in priority.
+ return iface.supportsMulticast();
+ } catch (SocketException e) {
+ mSharedLog.e("Error checking interface flags", e);
+ return false;
+ }
+ }
+
+ private void removeNetworkSocket(Network network) {
+ final SocketInfo socketInfo = mNetworkSockets.remove(network);
if (socketInfo == null) return;
socketInfo.mSocket.destroy();
- notifyInterfaceDestroyed(network, socketInfo.mSocket);
+ notifyInterfaceDestroyed(network, socketInfo);
+ mSocketRequestMonitor.onSocketDestroyed(network, socketInfo.mSocket);
+ mSharedLog.log("Remove socket on net:" + network);
}
- private void notifySocketCreated(Network network, MdnsInterfaceSocket socket,
- List<LinkAddress> addresses) {
+ private void removeTetherInterfaceSocket(String interfaceName) {
+ final SocketInfo socketInfo = mTetherInterfaceSockets.remove(interfaceName);
+ if (socketInfo == null) return;
+ socketInfo.mSocket.destroy();
+ notifyInterfaceDestroyed(null /* network */, socketInfo);
+ mSocketRequestMonitor.onSocketDestroyed(null /* network */, socketInfo.mSocket);
+ mSharedLog.log("Remove socket on ifName:" + interfaceName);
+ }
+
+ private void notifySocketCreated(Network network, SocketInfo socketInfo) {
for (int i = 0; i < mCallbacksToRequestedNetworks.size(); i++) {
final Network requestedNetwork = mCallbacksToRequestedNetworks.valueAt(i);
if (isNetworkMatched(requestedNetwork, network)) {
- mCallbacksToRequestedNetworks.keyAt(i).onSocketCreated(network, socket, addresses);
+ mCallbacksToRequestedNetworks.keyAt(i).onSocketCreated(socketInfo.mSocketKey,
+ socketInfo.mSocket, socketInfo.mAddresses);
+ mSocketRequestMonitor.onSocketRequestFulfilled(network, socketInfo.mSocket,
+ socketInfo.mTransports);
}
}
}
- private void notifyInterfaceDestroyed(Network network, MdnsInterfaceSocket socket) {
- for (int i = 0; i < mCallbacksToRequestedNetworks.size(); i++) {
- final Network requestedNetwork = mCallbacksToRequestedNetworks.valueAt(i);
- if (isNetworkMatched(requestedNetwork, network)) {
- mCallbacksToRequestedNetworks.keyAt(i).onInterfaceDestroyed(network, socket);
- }
- }
- }
-
- private void notifyAddressesChanged(Network network, MdnsInterfaceSocket socket,
- LinkProperties lp) {
+ private void notifyInterfaceDestroyed(Network network, SocketInfo socketInfo) {
for (int i = 0; i < mCallbacksToRequestedNetworks.size(); i++) {
final Network requestedNetwork = mCallbacksToRequestedNetworks.valueAt(i);
if (isNetworkMatched(requestedNetwork, network)) {
mCallbacksToRequestedNetworks.keyAt(i)
- .onAddressesChanged(network, socket, lp.getLinkAddresses());
+ .onInterfaceDestroyed(socketInfo.mSocketKey, socketInfo.mSocket);
+ }
+ }
+ }
+
+ private void notifyAddressesChanged(Network network, SocketInfo socketInfo,
+ List<LinkAddress> addresses) {
+ for (int i = 0; i < mCallbacksToRequestedNetworks.size(); i++) {
+ final Network requestedNetwork = mCallbacksToRequestedNetworks.valueAt(i);
+ if (isNetworkMatched(requestedNetwork, network)) {
+ mCallbacksToRequestedNetworks.keyAt(i)
+ .onAddressesChanged(socketInfo.mSocketKey, socketInfo.mSocket, addresses);
}
}
}
@@ -387,22 +639,27 @@
if (DBG) Log.d(TAG, "There is no LinkProperties for this network:" + network);
return;
}
- createSocket(network, lp);
+ createSocket(new NetworkAsKey(network), lp);
} else {
// Notify the socket for requested network.
- cb.onSocketCreated(network, socketInfo.mSocket, socketInfo.mAddresses);
+ cb.onSocketCreated(socketInfo.mSocketKey, socketInfo.mSocket, socketInfo.mAddresses);
+ mSocketRequestMonitor.onSocketRequestFulfilled(network, socketInfo.mSocket,
+ socketInfo.mTransports);
}
}
private void retrieveAndNotifySocketFromInterface(String interfaceName, SocketCallback cb) {
final SocketInfo socketInfo = mTetherInterfaceSockets.get(interfaceName);
if (socketInfo == null) {
+ int ifaceIndex = mDependencies.getNetworkInterfaceIndexByName(interfaceName);
createSocket(
- new Network(INetd.LOCAL_NET_ID), createLPForTetheredInterface(interfaceName));
+ LOCAL_NET,
+ createLPForTetheredInterface(interfaceName, ifaceIndex));
} else {
// Notify the socket for requested network.
- cb.onSocketCreated(
- new Network(INetd.LOCAL_NET_ID), socketInfo.mSocket, socketInfo.mAddresses);
+ cb.onSocketCreated(socketInfo.mSocketKey, socketInfo.mSocket, socketInfo.mAddresses);
+ mSocketRequestMonitor.onSocketRequestFulfilled(null /* socketNetwork */,
+ socketInfo.mSocket, socketInfo.mTransports);
}
}
@@ -415,6 +672,7 @@
*/
public void requestSocket(@Nullable Network network, @NonNull SocketCallback cb) {
ensureRunningOnHandlerThread(mHandler);
+ mSharedLog.log("requestSocket for net:" + network);
mCallbacksToRequestedNetworks.put(cb, network);
if (network == null) {
// Does not specify a required network, create sockets for all possible
@@ -430,6 +688,11 @@
for (String tetheredInterface : mTetheredInterfaces) {
retrieveAndNotifySocketFromInterface(tetheredInterface, cb);
}
+
+ if (mWifiP2pTetherInterface != null
+ && !mLocalOnlyInterfaces.contains(mWifiP2pTetherInterface)) {
+ retrieveAndNotifySocketFromInterface(mWifiP2pTetherInterface, cb);
+ }
} else {
retrieveAndNotifySocketFromNetwork(network, cb);
}
@@ -438,6 +701,7 @@
/*** Unrequest the socket */
public void unrequestSocket(@NonNull SocketCallback cb) {
ensureRunningOnHandlerThread(mHandler);
+ mSharedLog.log("unrequestSocket");
mCallbacksToRequestedNetworks.remove(cb);
if (hasAllNetworksRequest()) {
// Still has a request for all networks (interfaces).
@@ -450,8 +714,8 @@
if (matchRequestedNetwork(network)) continue;
final SocketInfo info = mNetworkSockets.removeAt(i);
info.mSocket.destroy();
- // Still notify to unrequester for socket destroy.
- cb.onInterfaceDestroyed(network, info.mSocket);
+ mSocketRequestMonitor.onSocketDestroyed(network, info.mSocket);
+ mSharedLog.log("Remove socket on net:" + network + " after unrequestSocket");
}
// Remove all sockets for tethering interface because these sockets do not have associated
@@ -460,8 +724,9 @@
for (int i = mTetherInterfaceSockets.size() - 1; i >= 0; i--) {
final SocketInfo info = mTetherInterfaceSockets.valueAt(i);
info.mSocket.destroy();
- // Still notify to unrequester for socket destroy.
- cb.onInterfaceDestroyed(new Network(INetd.LOCAL_NET_ID), info.mSocket);
+ mSocketRequestMonitor.onSocketDestroyed(null /* network */, info.mSocket);
+ mSharedLog.log("Remove socket on ifName:" + mTetherInterfaceSockets.keyAt(i)
+ + " after unrequestSocket");
}
mTetherInterfaceSockets.clear();
@@ -469,16 +734,95 @@
maybeStopMonitoringSockets();
}
- /*** Callbacks for listening socket changes */
+
+ /**
+ * Callback used to register socket requests.
+ */
public interface SocketCallback {
- /*** Notify the socket is created */
- default void onSocketCreated(@NonNull Network network, @NonNull MdnsInterfaceSocket socket,
- @NonNull List<LinkAddress> addresses) {}
- /*** Notify the interface is destroyed */
- default void onInterfaceDestroyed(@NonNull Network network,
- @NonNull MdnsInterfaceSocket socket) {}
- /*** Notify the addresses is changed on the network */
- default void onAddressesChanged(@NonNull Network network,
+ /**
+ * Notify the socket was created for the registered request.
+ *
+ * This may be called immediately when the request is registered with an existing socket,
+ * if it had been created previously for other requests.
+ */
+ default void onSocketCreated(@NonNull SocketKey socketKey,
@NonNull MdnsInterfaceSocket socket, @NonNull List<LinkAddress> addresses) {}
+
+ /**
+ * Notify that the interface was destroyed, so the provided socket cannot be used anymore.
+ *
+ * This indicates that although the socket was still requested, it had to be destroyed.
+ */
+ default void onInterfaceDestroyed(@NonNull SocketKey socketKey,
+ @NonNull MdnsInterfaceSocket socket) {}
+
+ /**
+ * Notify the interface addresses have changed for the network.
+ */
+ default void onAddressesChanged(@NonNull SocketKey socketKey,
+ @NonNull MdnsInterfaceSocket socket, @NonNull List<LinkAddress> addresses) {}
+ }
+
+ /**
+ * Global callback indicating when sockets are created or destroyed for requests.
+ */
+ public interface SocketRequestMonitor {
+ /**
+ * Indicates that the socket was used to fulfill the request of one requester.
+ *
+ * There is always at most one socket created for each interface. The interface is available
+ * in {@link MdnsInterfaceSocket#getInterface()}.
+ * @param socketNetwork The network of the socket interface, if any.
+ * @param socket The socket that was provided to a requester.
+ * @param transports Array of TRANSPORT_* from {@link NetworkCapabilities}. Empty if the
+ * interface is not part of a network with known transports.
+ */
+ default void onSocketRequestFulfilled(@Nullable Network socketNetwork,
+ @NonNull MdnsInterfaceSocket socket, @NonNull int[] transports) {}
+
+ /**
+ * Indicates that a previously created socket was destroyed.
+ *
+ * @param socketNetwork The network of the socket interface, if any.
+ * @param socket The destroyed socket.
+ */
+ default void onSocketDestroyed(@Nullable Network socketNetwork,
+ @NonNull MdnsInterfaceSocket socket) {}
+ }
+
+ private interface NetworkKey {
+ }
+
+ private static final NetworkKey LOCAL_NET = new NetworkKey() {
+ @Override
+ public String toString() {
+ return "NetworkKey:LOCAL_NET";
+ }
+ };
+
+ private static class NetworkAsKey implements NetworkKey {
+ private final Network mNetwork;
+
+ NetworkAsKey(Network network) {
+ this.mNetwork = network;
+ }
+
+ @Override
+ public int hashCode() {
+ return mNetwork.hashCode();
+ }
+
+ @Override
+ public boolean equals(@Nullable Object other) {
+ if (!(other instanceof NetworkAsKey)) {
+ return false;
+ }
+ return mNetwork.equals(((NetworkAsKey) other).mNetwork);
+ }
+
+ @Override
+ public String toString() {
+ return "NetworkAsKey{ network=" + mNetwork + " }";
+ }
}
}
diff --git a/service-t/src/com/android/server/connectivity/mdns/MulticastNetworkInterfaceProvider.java b/service-t/src/com/android/server/connectivity/mdns/MulticastNetworkInterfaceProvider.java
index ade7b95..f248c98 100644
--- a/service-t/src/com/android/server/connectivity/mdns/MulticastNetworkInterfaceProvider.java
+++ b/service-t/src/com/android/server/connectivity/mdns/MulticastNetworkInterfaceProvider.java
@@ -148,7 +148,7 @@
}
/*** Check whether given network interface can support mdns */
- public static boolean canScanOnInterface(@Nullable NetworkInterfaceWrapper networkInterface) {
+ private static boolean canScanOnInterface(@Nullable NetworkInterfaceWrapper networkInterface) {
try {
if ((networkInterface == null)
|| networkInterface.isLoopback()
diff --git a/service-t/src/com/android/server/connectivity/mdns/MulticastPacketReader.java b/service-t/src/com/android/server/connectivity/mdns/MulticastPacketReader.java
index b597f0a..63119ac 100644
--- a/service-t/src/com/android/server/connectivity/mdns/MulticastPacketReader.java
+++ b/service-t/src/com/android/server/connectivity/mdns/MulticastPacketReader.java
@@ -16,7 +16,7 @@
package com.android.server.connectivity.mdns;
-import static com.android.server.connectivity.mdns.MdnsSocketProvider.ensureRunningOnHandlerThread;
+import static com.android.server.connectivity.mdns.util.MdnsUtils.ensureRunningOnHandlerThread;
import android.annotation.NonNull;
import android.os.Handler;
@@ -59,11 +59,14 @@
* Create a new {@link MulticastPacketReader}.
* @param socket Socket to read from. This will *not* be closed when the reader terminates.
* @param buffer Buffer to read packets into. Will only be used from the handler thread.
+ * @param port the port number for the socket
*/
protected MulticastPacketReader(@NonNull String interfaceTag,
@NonNull ParcelFileDescriptor socket, @NonNull Handler handler,
@NonNull byte[] buffer) {
- super(handler, new RecvBuffer(buffer, new InetSocketAddress()));
+ // Set the port to zero as placeholder as the recvfrom() call will fill the actual port
+ // value later.
+ super(handler, new RecvBuffer(buffer, new InetSocketAddress(0 /* port */)));
mLogTag = MulticastPacketReader.class.getSimpleName() + "/" + interfaceTag;
mSocket = socket;
mHandler = handler;
diff --git a/service-t/src/com/android/server/connectivity/mdns/NetworkInterfaceWrapper.java b/service-t/src/com/android/server/connectivity/mdns/NetworkInterfaceWrapper.java
index 0ecae48..48c396e 100644
--- a/service-t/src/com/android/server/connectivity/mdns/NetworkInterfaceWrapper.java
+++ b/service-t/src/com/android/server/connectivity/mdns/NetworkInterfaceWrapper.java
@@ -57,6 +57,10 @@
return networkInterface.getInterfaceAddresses();
}
+ public int getIndex() {
+ return networkInterface.getIndex();
+ }
+
@Override
public String toString() {
return networkInterface.toString();
diff --git a/service-t/src/com/android/server/connectivity/mdns/SocketKey.java b/service-t/src/com/android/server/connectivity/mdns/SocketKey.java
new file mode 100644
index 0000000..f13d0e0
--- /dev/null
+++ b/service-t/src/com/android/server/connectivity/mdns/SocketKey.java
@@ -0,0 +1,73 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.connectivity.mdns;
+
+import android.annotation.Nullable;
+import android.net.Network;
+
+import java.util.Objects;
+
+/**
+ * A class that identifies a socket.
+ *
+ * <p> A socket is typically created with an associated network. However, tethering interfaces do
+ * not have an associated network, only an interface index. This means that the socket cannot be
+ * identified in some places. Therefore, this class is necessary for identifying a socket. It
+ * includes both the network and interface index.
+ */
+public class SocketKey {
+ @Nullable
+ private final Network mNetwork;
+ private final int mInterfaceIndex;
+
+ SocketKey(int interfaceIndex) {
+ this(null /* network */, interfaceIndex);
+ }
+
+ SocketKey(@Nullable Network network, int interfaceIndex) {
+ mNetwork = network;
+ mInterfaceIndex = interfaceIndex;
+ }
+
+ @Nullable
+ public Network getNetwork() {
+ return mNetwork;
+ }
+
+ public int getInterfaceIndex() {
+ return mInterfaceIndex;
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(mNetwork, mInterfaceIndex);
+ }
+
+ @Override
+ public boolean equals(@Nullable Object other) {
+ if (!(other instanceof SocketKey)) {
+ return false;
+ }
+ return Objects.equals(mNetwork, ((SocketKey) other).mNetwork)
+ && mInterfaceIndex == ((SocketKey) other).mInterfaceIndex;
+ }
+
+ @Override
+ public String toString() {
+ return "SocketKey{ network=" + mNetwork + " interfaceIndex=" + mInterfaceIndex + " }";
+ }
+}
diff --git a/service-t/src/com/android/server/connectivity/mdns/SocketNetLinkMonitorFactory.java b/service-t/src/com/android/server/connectivity/mdns/SocketNetLinkMonitorFactory.java
new file mode 100644
index 0000000..6bc7941
--- /dev/null
+++ b/service-t/src/com/android/server/connectivity/mdns/SocketNetLinkMonitorFactory.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.connectivity.mdns;
+
+import android.annotation.NonNull;
+import android.os.Handler;
+
+import com.android.net.module.util.SharedLog;
+import com.android.server.connectivity.mdns.internal.SocketNetlinkMonitor;
+
+/**
+ * The factory class for creating the netlink monitor.
+ */
+public class SocketNetLinkMonitorFactory {
+
+ /**
+ * Creates a new netlink monitor.
+ */
+ public static AbstractSocketNetlink createNetLinkMonitor(@NonNull final Handler handler,
+ @NonNull SharedLog log, @NonNull MdnsSocketProvider.NetLinkMonitorCallBack cb) {
+ return new SocketNetlinkMonitor(handler, log, cb);
+ }
+
+ private SocketNetLinkMonitorFactory() {
+ }
+
+}
diff --git a/service-t/src/com/android/server/connectivity/mdns/internal/SocketNetlinkMonitor.java b/service-t/src/com/android/server/connectivity/mdns/internal/SocketNetlinkMonitor.java
new file mode 100644
index 0000000..451909c
--- /dev/null
+++ b/service-t/src/com/android/server/connectivity/mdns/internal/SocketNetlinkMonitor.java
@@ -0,0 +1,92 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.connectivity.mdns.internal;
+
+import android.annotation.NonNull;
+import android.net.LinkAddress;
+import android.os.Handler;
+import android.system.OsConstants;
+import android.util.Log;
+
+import com.android.net.module.util.SharedLog;
+import com.android.net.module.util.ip.NetlinkMonitor;
+import com.android.net.module.util.netlink.NetlinkConstants;
+import com.android.net.module.util.netlink.NetlinkMessage;
+import com.android.net.module.util.netlink.RtNetlinkAddressMessage;
+import com.android.net.module.util.netlink.StructIfaddrMsg;
+import com.android.server.connectivity.mdns.AbstractSocketNetlink;
+import com.android.server.connectivity.mdns.MdnsSocketProvider;
+
+/**
+ * The netlink monitor for MdnsSocketProvider.
+ */
+public class SocketNetlinkMonitor extends NetlinkMonitor implements AbstractSocketNetlink {
+
+ public static final String TAG = SocketNetlinkMonitor.class.getSimpleName();
+
+ @NonNull
+ private final MdnsSocketProvider.NetLinkMonitorCallBack mCb;
+ public SocketNetlinkMonitor(@NonNull final Handler handler,
+ @NonNull SharedLog log,
+ @NonNull final MdnsSocketProvider.NetLinkMonitorCallBack cb) {
+ super(handler, log, TAG, OsConstants.NETLINK_ROUTE,
+ NetlinkConstants.RTMGRP_IPV4_IFADDR | NetlinkConstants.RTMGRP_IPV6_IFADDR);
+ mCb = cb;
+ }
+ @Override
+ public void processNetlinkMessage(NetlinkMessage nlMsg, long whenMs) {
+ if (nlMsg instanceof RtNetlinkAddressMessage) {
+ processRtNetlinkAddressMessage((RtNetlinkAddressMessage) nlMsg);
+ }
+ }
+
+ /**
+ * Process the RTM_NEWADDR and RTM_DELADDR netlink message.
+ */
+ private void processRtNetlinkAddressMessage(RtNetlinkAddressMessage msg) {
+ final StructIfaddrMsg ifaddrMsg = msg.getIfaddrHeader();
+ final LinkAddress la = new LinkAddress(msg.getIpAddress(), ifaddrMsg.prefixLen,
+ msg.getFlags(), ifaddrMsg.scope);
+ switch (msg.getHeader().nlmsg_type) {
+ case NetlinkConstants.RTM_NEWADDR:
+ if (la.isPreferred()) {
+ mCb.addOrUpdateInterfaceAddress(ifaddrMsg.index, la);
+ }
+ break;
+ case NetlinkConstants.RTM_DELADDR:
+ mCb.deleteInterfaceAddress(ifaddrMsg.index, la);
+ break;
+ default:
+ Log.e(TAG, "Unknown rtnetlink address msg type " + msg.getHeader().nlmsg_type);
+ }
+ }
+
+ @Override
+ public boolean isSupported() {
+ return true;
+ }
+
+ @Override
+ public void startMonitoring() {
+ this.start();
+ }
+
+ @Override
+ public void stopMonitoring() {
+ this.stop();
+ }
+}
diff --git a/service-t/src/com/android/server/connectivity/mdns/util/MdnsUtils.java b/service-t/src/com/android/server/connectivity/mdns/util/MdnsUtils.java
new file mode 100644
index 0000000..3180a6f
--- /dev/null
+++ b/service-t/src/com/android/server/connectivity/mdns/util/MdnsUtils.java
@@ -0,0 +1,176 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.connectivity.mdns.util;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.net.Network;
+import android.os.Handler;
+import android.util.ArraySet;
+
+import com.android.server.connectivity.mdns.MdnsConstants;
+import com.android.server.connectivity.mdns.MdnsRecord;
+
+import java.nio.ByteBuffer;
+import java.nio.CharBuffer;
+import java.nio.charset.Charset;
+import java.nio.charset.CharsetEncoder;
+import java.nio.charset.StandardCharsets;
+
+/**
+ * Mdns utility functions.
+ */
+public class MdnsUtils {
+
+ private MdnsUtils() { }
+
+ /**
+ * Convert the string to DNS case-insensitive lowercase
+ *
+ * Per rfc6762#page-46, accented characters are not defined to be automatically equivalent to
+ * their unaccented counterparts. So the "DNS lowercase" should be if character is A-Z then they
+ * transform into a-z. Otherwise, they are kept as-is.
+ */
+ public static String toDnsLowerCase(@NonNull String string) {
+ final char[] outChars = new char[string.length()];
+ for (int i = 0; i < string.length(); i++) {
+ outChars[i] = toDnsLowerCase(string.charAt(i));
+ }
+ return new String(outChars);
+ }
+
+ /**
+ * Convert the array of labels to DNS case-insensitive lowercase.
+ */
+ public static String[] toDnsLabelsLowerCase(@NonNull String[] labels) {
+ final String[] outStrings = new String[labels.length];
+ for (int i = 0; i < labels.length; ++i) {
+ outStrings[i] = toDnsLowerCase(labels[i]);
+ }
+ return outStrings;
+ }
+
+ /**
+ * Compare two strings by DNS case-insensitive lowercase.
+ */
+ public static boolean equalsIgnoreDnsCase(@NonNull String a, @NonNull String b) {
+ if (a.length() != b.length()) return false;
+ for (int i = 0; i < a.length(); i++) {
+ if (toDnsLowerCase(a.charAt(i)) != toDnsLowerCase(b.charAt(i))) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ /**
+ * Compare two set of DNS labels by DNS case-insensitive lowercase.
+ */
+ public static boolean equalsDnsLabelIgnoreDnsCase(@NonNull String[] a, @NonNull String[] b) {
+ if (a == b) {
+ return true;
+ }
+ int length = a.length;
+ if (b.length != length) {
+ return false;
+ }
+ for (int i = 0; i < length; i++) {
+ if (!equalsIgnoreDnsCase(a[i], b[i])) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ /**
+ * Compare labels a equals b or a is suffix of b.
+ *
+ * @param a the type or subtype.
+ * @param b the base type
+ */
+ public static boolean typeEqualsOrIsSubtype(@NonNull String[] a,
+ @NonNull String[] b) {
+ return MdnsUtils.equalsDnsLabelIgnoreDnsCase(a, b)
+ || ((b.length == (a.length + 2))
+ && MdnsUtils.equalsIgnoreDnsCase(b[1], MdnsConstants.SUBTYPE_LABEL)
+ && MdnsRecord.labelsAreSuffix(a, b));
+ }
+
+ private static char toDnsLowerCase(char a) {
+ return a >= 'A' && a <= 'Z' ? (char) (a + ('a' - 'A')) : a;
+ }
+
+ /*** Ensure that current running thread is same as given handler thread */
+ public static void ensureRunningOnHandlerThread(@NonNull Handler handler) {
+ if (!isRunningOnHandlerThread(handler)) {
+ throw new IllegalStateException(
+ "Not running on Handler thread: " + Thread.currentThread().getName());
+ }
+ }
+
+ /*** Check that current running thread is same as given handler thread */
+ public static boolean isRunningOnHandlerThread(@NonNull Handler handler) {
+ if (handler.getLooper().getThread() == Thread.currentThread()) {
+ return true;
+ }
+ return false;
+ }
+
+ /*** Check whether the target network matches the current network */
+ public static boolean isNetworkMatched(@Nullable Network targetNetwork,
+ @Nullable Network currentNetwork) {
+ return targetNetwork == null || targetNetwork.equals(currentNetwork);
+ }
+
+ /*** Check whether the target network matches any of the current networks */
+ public static boolean isAnyNetworkMatched(@Nullable Network targetNetwork,
+ ArraySet<Network> currentNetworks) {
+ if (targetNetwork == null) {
+ return !currentNetworks.isEmpty();
+ }
+ return currentNetworks.contains(targetNetwork);
+ }
+
+ /**
+ * Truncate a service name to up to maxLength UTF-8 bytes.
+ */
+ public static String truncateServiceName(@NonNull String originalName, int maxLength) {
+ // UTF-8 is at most 4 bytes per character; return early in the common case where
+ // the name can't possibly be over the limit given its string length.
+ if (originalName.length() <= maxLength / 4) return originalName;
+
+ final Charset utf8 = StandardCharsets.UTF_8;
+ final CharsetEncoder encoder = utf8.newEncoder();
+ final ByteBuffer out = ByteBuffer.allocate(maxLength);
+ // encode will write as many characters as possible to the out buffer, and just
+ // return an overflow code if there were too many characters (no need to check the
+ // return code here, this method truncates the name on purpose).
+ encoder.encode(CharBuffer.wrap(originalName), out, true /* endOfInput */);
+ return new String(out.array(), 0, out.position(), utf8);
+ }
+
+ /**
+ * Checks if the MdnsRecord needs to be renewed or not.
+ *
+ * <p>As per RFC6762 7.1 no need to query if remaining TTL is more than half the original one,
+ * so send the queries if half the TTL has passed.
+ */
+ public static boolean isRecordRenewalNeeded(@NonNull MdnsRecord mdnsRecord, final long now) {
+ return mdnsRecord.getTtl() > 0
+ && mdnsRecord.getRemainingTTL(now) <= mdnsRecord.getTtl() / 2;
+ }
+}
\ No newline at end of file
diff --git a/service-t/src/com/android/server/ethernet/EthernetNetworkFactory.java b/service-t/src/com/android/server/ethernet/EthernetNetworkFactory.java
index eed9aeb..ece10f3 100644
--- a/service-t/src/com/android/server/ethernet/EthernetNetworkFactory.java
+++ b/service-t/src/com/android/server/ethernet/EthernetNetworkFactory.java
@@ -20,7 +20,6 @@
import android.annotation.Nullable;
import android.content.Context;
import android.net.ConnectivityManager;
-import android.net.ConnectivityResources;
import android.net.EthernetManager;
import android.net.EthernetNetworkSpecifier;
import android.net.IpConfiguration;
@@ -50,6 +49,7 @@
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.util.IndentingPrintWriter;
import com.android.net.module.util.InterfaceParams;
+import com.android.server.connectivity.ConnectivityResources;
import java.io.FileDescriptor;
import java.util.Objects;
@@ -313,17 +313,12 @@
mIpClientShutdownCv.block();
}
- // At the time IpClient is stopped, an IpClient event may have already been posted on
- // the back of the handler and is awaiting execution. Once that event is executed, the
- // associated callback object may not be valid anymore
- // (NetworkInterfaceState#mIpClientCallback points to a different object / null).
- private boolean isCurrentCallback() {
- return this == mIpClientCallback;
- }
-
- private void handleIpEvent(final @NonNull Runnable r) {
+ private void safelyPostOnHandler(Runnable r) {
mHandler.post(() -> {
- if (!isCurrentCallback()) {
+ if (this != mIpClientCallback) {
+ // At the time IpClient is stopped, an IpClient event may have already been
+ // posted on the handler and is awaiting execution. Once that event is
+ // executed, the associated callback object may not be valid anymore.
Log.i(TAG, "Ignoring stale IpClientCallbacks " + this);
return;
}
@@ -333,24 +328,24 @@
@Override
public void onProvisioningSuccess(LinkProperties newLp) {
- handleIpEvent(() -> onIpLayerStarted(newLp));
+ safelyPostOnHandler(() -> onIpLayerStarted(newLp));
}
@Override
public void onProvisioningFailure(LinkProperties newLp) {
// This cannot happen due to provisioning timeout, because our timeout is 0. It can
// happen due to errors while provisioning or on provisioning loss.
- handleIpEvent(() -> onIpLayerStopped());
+ safelyPostOnHandler(() -> onIpLayerStopped());
}
@Override
public void onLinkPropertiesChange(LinkProperties newLp) {
- handleIpEvent(() -> updateLinkProperties(newLp));
+ safelyPostOnHandler(() -> updateLinkProperties(newLp));
}
@Override
public void onReachabilityLost(String logMsg) {
- handleIpEvent(() -> updateNeighborLostEvent(logMsg));
+ safelyPostOnHandler(() -> updateNeighborLostEvent(logMsg));
}
@Override
diff --git a/service-t/src/com/android/server/ethernet/EthernetServiceImpl.java b/service-t/src/com/android/server/ethernet/EthernetServiceImpl.java
index f6a55c8..e7af569 100644
--- a/service-t/src/com/android/server/ethernet/EthernetServiceImpl.java
+++ b/service-t/src/com/android/server/ethernet/EthernetServiceImpl.java
@@ -92,7 +92,7 @@
@Override
public String[] getAvailableInterfaces() throws RemoteException {
PermissionUtils.enforceAccessNetworkStatePermission(mContext, TAG);
- return mTracker.getInterfaces(checkUseRestrictedNetworksPermission());
+ return mTracker.getClientModeInterfaces(checkUseRestrictedNetworksPermission());
}
/**
diff --git a/service-t/src/com/android/server/ethernet/EthernetTracker.java b/service-t/src/com/android/server/ethernet/EthernetTracker.java
index 852cf42..1f22b02 100644
--- a/service-t/src/com/android/server/ethernet/EthernetTracker.java
+++ b/service-t/src/com/android/server/ethernet/EthernetTracker.java
@@ -25,7 +25,6 @@
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.content.Context;
-import android.net.ConnectivityResources;
import android.net.EthernetManager;
import android.net.IEthernetServiceListener;
import android.net.INetd;
@@ -57,6 +56,7 @@
import com.android.net.module.util.netlink.NetlinkMessage;
import com.android.net.module.util.netlink.RtNetlinkLinkMessage;
import com.android.net.module.util.netlink.StructIfinfoMsg;
+import com.android.server.connectivity.ConnectivityResources;
import java.io.FileDescriptor;
import java.net.InetAddress;
@@ -385,7 +385,7 @@
return mFactory.hasInterface(iface);
}
- String[] getInterfaces(boolean includeRestricted) {
+ String[] getClientModeInterfaces(boolean includeRestricted) {
return mFactory.getAvailableInterfaces(includeRestricted);
}
@@ -428,9 +428,12 @@
// Remote process has already died
return;
}
- for (String iface : getInterfaces(canUseRestrictedNetworks)) {
+ for (String iface : getClientModeInterfaces(canUseRestrictedNetworks)) {
unicastInterfaceStateChange(listener, iface);
}
+ if (mTetheringInterfaceMode == INTERFACE_MODE_SERVER) {
+ unicastInterfaceStateChange(listener, mTetheringInterface);
+ }
unicastEthernetStateChange(listener, mEthernetState);
});
diff --git a/service-t/src/com/android/server/net/NetworkStatsFactory.java b/service-t/src/com/android/server/net/NetworkStatsFactory.java
index e0abdf1..5f66f47 100644
--- a/service-t/src/com/android/server/net/NetworkStatsFactory.java
+++ b/service-t/src/com/android/server/net/NetworkStatsFactory.java
@@ -34,8 +34,6 @@
import java.io.IOException;
import java.net.ProtocolException;
-import java.util.Arrays;
-import java.util.HashSet;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
@@ -86,12 +84,9 @@
* are expected to monotonically increase since device boot.
*/
@NonNull
- public NetworkStats getNetworkStatsDetail(int limitUid, @Nullable String[] limitIfaces,
- int limitTag) throws IOException {
+ public NetworkStats getNetworkStatsDetail() throws IOException {
final NetworkStats stats = new NetworkStats(SystemClock.elapsedRealtime(), 0);
- // TODO: remove both path and useBpfStats arguments.
- // The path is never used if useBpfStats is true.
- final int ret = nativeReadNetworkStatsDetail(stats, limitUid, limitIfaces, limitTag);
+ final int ret = nativeReadNetworkStatsDetail(stats);
if (ret != 0) {
throw new IOException("Failed to parse network stats");
}
@@ -147,36 +142,6 @@
}
/**
- * Get a set of interfaces containing specified ifaces and stacked interfaces.
- *
- * <p>The added stacked interfaces are ifaces stacked on top of the specified ones, or ifaces
- * on which the specified ones are stacked. Stacked interfaces are those noted with
- * {@link #noteStackedIface(String, String)}, but only interfaces noted before this method
- * is called are guaranteed to be included.
- */
- public String[] augmentWithStackedInterfaces(@Nullable String[] requiredIfaces) {
- if (requiredIfaces == NetworkStats.INTERFACES_ALL) {
- return null;
- }
-
- HashSet<String> relatedIfaces = new HashSet<>(Arrays.asList(requiredIfaces));
- // ConcurrentHashMap's EntrySet iterators are "guaranteed to traverse
- // elements as they existed upon construction exactly once, and may
- // (but are not guaranteed to) reflect any modifications subsequent to construction".
- // This is enough here.
- for (Map.Entry<String, String> entry : mStackedIfaces.entrySet()) {
- if (relatedIfaces.contains(entry.getKey())) {
- relatedIfaces.add(entry.getValue());
- } else if (relatedIfaces.contains(entry.getValue())) {
- relatedIfaces.add(entry.getKey());
- }
- }
-
- String[] outArray = new String[relatedIfaces.size()];
- return relatedIfaces.toArray(outArray);
- }
-
- /**
* Applies 464xlat adjustments with ifaces noted with {@link #noteStackedIface(String, String)}.
* @see NetworkStats#apply464xlatAdjustments(NetworkStats, NetworkStats, Map)
*/
@@ -245,8 +210,7 @@
requestSwapActiveStatsMapLocked();
// Stats are always read from the inactive map, so they must be read after the
// swap
- final NetworkStats stats = mDeps.getNetworkStatsDetail(
- UID_ALL, INTERFACES_ALL, TAG_ALL);
+ final NetworkStats stats = mDeps.getNetworkStatsDetail();
// BPF stats are incremental; fold into mPersistSnapshot.
mPersistSnapshot.setElapsedRealtime(stats.getElapsedRealtime());
mPersistSnapshot.combineAllValues(stats);
@@ -333,8 +297,7 @@
* are expected to monotonically increase since device boot.
*/
@VisibleForTesting
- public static native int nativeReadNetworkStatsDetail(NetworkStats stats, int limitUid,
- String[] limitIfaces, int limitTag);
+ public static native int nativeReadNetworkStatsDetail(NetworkStats stats);
@VisibleForTesting
public static native int nativeReadNetworkStatsDev(NetworkStats stats);
diff --git a/service-t/src/com/android/server/net/NetworkStatsService.java b/service-t/src/com/android/server/net/NetworkStatsService.java
index 9176ec2..e7ef510 100644
--- a/service-t/src/com/android/server/net/NetworkStatsService.java
+++ b/service-t/src/com/android/server/net/NetworkStatsService.java
@@ -46,6 +46,7 @@
import static android.net.NetworkStats.UID_ALL;
import static android.net.NetworkStatsHistory.FIELD_ALL;
import static android.net.NetworkTemplate.MATCH_MOBILE;
+import static android.net.NetworkTemplate.MATCH_TEST;
import static android.net.NetworkTemplate.MATCH_WIFI;
import static android.net.TrafficStats.KB_IN_BYTES;
import static android.net.TrafficStats.MB_IN_BYTES;
@@ -83,7 +84,6 @@
import android.content.res.Resources;
import android.database.ContentObserver;
import android.net.ConnectivityManager;
-import android.net.ConnectivityResources;
import android.net.DataUsageRequest;
import android.net.INetd;
import android.net.INetworkStatsService;
@@ -106,6 +106,7 @@
import android.net.TetherStatsParcel;
import android.net.TetheringManager;
import android.net.TrafficStats;
+import android.net.TransportInfo;
import android.net.UnderlyingNetworkInfo;
import android.net.Uri;
import android.net.netstats.IUsageCallback;
@@ -113,6 +114,7 @@
import android.net.netstats.provider.INetworkStatsProvider;
import android.net.netstats.provider.INetworkStatsProviderCallback;
import android.net.netstats.provider.NetworkStatsProvider;
+import android.net.wifi.WifiInfo;
import android.os.Binder;
import android.os.Build;
import android.os.Bundle;
@@ -173,6 +175,7 @@
import com.android.networkstack.apishim.ConstantsShim;
import com.android.networkstack.apishim.common.UnsupportedApiLevelException;
import com.android.server.BpfNetMaps;
+import com.android.server.connectivity.ConnectivityResources;
import java.io.File;
import java.io.FileDescriptor;
@@ -537,7 +540,8 @@
BroadcastOptions.makeBasic())
.setDeliveryGroupPolicy(
ConstantsShim.DELIVERY_GROUP_POLICY_MOST_RECENT)
- .setDeferUntilActive(true)
+ .setDeferralPolicy(
+ ConstantsShim.DEFERRAL_POLICY_UNTIL_ACTIVE)
.toBundle();
} catch (UnsupportedApiLevelException e) {
Log.wtf(TAG, "Using unsupported API" + e);
@@ -943,7 +947,11 @@
@GuardedBy("mStatsLock")
private void shutdownLocked() {
final TetheringManager tetheringManager = mContext.getSystemService(TetheringManager.class);
- tetheringManager.unregisterTetheringEventCallback(mTetherListener);
+ try {
+ tetheringManager.unregisterTetheringEventCallback(mTetherListener);
+ } catch (IllegalStateException e) {
+ Log.i(TAG, "shutdownLocked: error when unregister tethering, ignored. e=" + e);
+ }
mContext.unregisterReceiver(mPollReceiver);
mContext.unregisterReceiver(mRemovedReceiver);
mContext.unregisterReceiver(mUserReceiver);
@@ -1575,7 +1583,9 @@
// For a template with wifi network keys, it is possible for a malicious
// client to track the user locations via querying data usage. Thus, enforce
// fine location permission check.
- if (!template.getWifiNetworkKeys().isEmpty()) {
+ // For a template with MATCH_TEST, since the wifi network key is just a placeholder
+ // to identify a specific test network, it is not related to track user location.
+ if (!template.getWifiNetworkKeys().isEmpty() && template.getMatchRule() != MATCH_TEST) {
final boolean canAccessFineLocation = mLocationPermissionChecker
.checkCallersLocationPermission(callingPackage,
null /* featureId */,
@@ -1729,11 +1739,7 @@
PermissionUtils.enforceNetworkStackPermission(mContext);
try {
final String[] ifaceArray = getAllIfacesSinceBoot(transport);
- // TODO(b/215633405) : mMobileIfaces and mWifiIfaces already contain the stacked
- // interfaces, so this is not useful, remove it.
- final String[] ifacesToQuery =
- mStatsFactory.augmentWithStackedInterfaces(ifaceArray);
- final NetworkStats stats = getNetworkStatsUidDetail(ifacesToQuery);
+ final NetworkStats stats = getNetworkStatsUidDetail(ifaceArray);
// Clear the interfaces of the stats before returning, so callers won't get this
// information. This is because no caller needs this information for now, and it
// makes it easier to change the implementation later by using the histories in the
@@ -2125,6 +2131,14 @@
final NetworkIdentity ident = NetworkIdentity.buildNetworkIdentity(mContext, snapshot,
isDefault, ratType);
+ // If WifiInfo contains a null network key then this identity should not be added into
+ // the network identity set. See b/266598304.
+ final TransportInfo transportInfo = snapshot.getNetworkCapabilities()
+ .getTransportInfo();
+ if (transportInfo instanceof WifiInfo) {
+ final WifiInfo info = (WifiInfo) transportInfo;
+ if (info.getNetworkKey() == null) continue;
+ }
// Traffic occurring on the base interface is always counted for
// both total usage and UID details.
final String baseIface = snapshot.getLinkProperties().getInterfaceName();
diff --git a/service/Android.bp b/service/Android.bp
index 1523af9..e1376a1 100644
--- a/service/Android.bp
+++ b/service/Android.bp
@@ -138,6 +138,14 @@
name: "service-connectivity-pre-jarjar",
sdk_version: "system_server_current",
min_sdk_version: "30",
+ // NetworkStackApiShimSettingsForCurrentBranch provides the latest available shims depending on
+ // the branch to "service-connectivity".
+ // There are Tethering.apk and TetheringNext.apk variants for the tethering APEX,
+ // which use NetworkStackApiStableShims and NetworkStackApiCurrentShims respectively.
+ // Note that there can be no service-connectivity-next because it would need to be configured in
+ // default_art_config.mk which doesn't support conditionals, hence this scheme of using a
+ // variable here.
+ defaults: ["NetworkStackApiShimSettingsForCurrentBranch"],
srcs: [
"src/**/*.java",
":framework-connectivity-shared-srcs",
@@ -183,7 +191,6 @@
"PlatformProperties",
"service-connectivity-protos",
"service-connectivity-stats-protos",
- "NetworkStackApiStableShims",
],
apex_available: [
"com.android.tethering",
diff --git a/service/ServiceConnectivityResources/res/values-kn/strings.xml b/service/ServiceConnectivityResources/res/values-kn/strings.xml
index cde8fac..8046d0e 100644
--- a/service/ServiceConnectivityResources/res/values-kn/strings.xml
+++ b/service/ServiceConnectivityResources/res/values-kn/strings.xml
@@ -17,7 +17,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="connectivityResourcesAppLabel" msgid="2476261877900882974">"ಸಿಸ್ಟಂ ಸಂಪರ್ಕ ಕಲ್ಪಿಸುವಿಕೆ ಮಾಹಿತಿಯ ಮೂಲಗಳು"</string>
+ <string name="connectivityResourcesAppLabel" msgid="2476261877900882974">"ಸಿಸ್ಟಂ ಕನೆಕ್ಟಿವಿಟಿ ಮಾಹಿತಿಯ ಮೂಲಗಳು"</string>
<string name="wifi_available_sign_in" msgid="8041178343789805553">"ವೈ-ಫೈ ನೆಟ್ವರ್ಕ್ಗೆ ಸೈನ್ ಇನ್ ಮಾಡಿ"</string>
<string name="network_available_sign_in" msgid="2622520134876355561">"ನೆಟ್ವರ್ಕ್ಗೆ ಸೈನ್ ಇನ್ ಮಾಡಿ"</string>
<!-- no translation found for network_available_sign_in_detailed (8439369644697866359) -->
@@ -30,7 +30,7 @@
<string name="network_partial_connectivity" msgid="5549503845834993258">"<xliff:g id="NETWORK_SSID">%1$s</xliff:g> ಸೀಮಿತ ಸಂಪರ್ಕ ಕಲ್ಪಿಸುವಿಕೆಯನ್ನು ಹೊಂದಿದೆ"</string>
<string name="network_partial_connectivity_detailed" msgid="4732435946300249845">"ಹೇಗಾದರೂ ಸಂಪರ್ಕಿಸಲು ಟ್ಯಾಪ್ ಮಾಡಿ"</string>
<string name="network_switch_metered" msgid="5016937523571166319">"<xliff:g id="NETWORK_TYPE">%1$s</xliff:g> ಗೆ ಬದಲಾಯಿಸಲಾಗಿದೆ"</string>
- <string name="network_switch_metered_detail" msgid="1257300152739542096">"<xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g> ಇಂಟರ್ನೆಟ್ ಪ್ರವೇಶ ಹೊಂದಿಲ್ಲದಿರುವಾಗ, ಸಾಧನವು <xliff:g id="NEW_NETWORK">%1$s</xliff:g> ಬಳಸುತ್ತದೆ. ಶುಲ್ಕಗಳು ಅನ್ವಯವಾಗಬಹುದು."</string>
+ <string name="network_switch_metered_detail" msgid="1257300152739542096">"<xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g> ಇಂಟರ್ನೆಟ್ ಆ್ಯಕ್ಸೆಸ್ ಹೊಂದಿಲ್ಲದಿರುವಾಗ, ಸಾಧನವು <xliff:g id="NEW_NETWORK">%1$s</xliff:g> ಬಳಸುತ್ತದೆ. ಶುಲ್ಕಗಳು ಅನ್ವಯವಾಗಬಹುದು."</string>
<string name="network_switch_metered_toast" msgid="70691146054130335">"<xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g> ರಿಂದ <xliff:g id="NEW_NETWORK">%2$s</xliff:g> ಗೆ ಬದಲಾಯಿಸಲಾಗಿದೆ"</string>
<string-array name="network_switch_type_name">
<item msgid="3004933964374161223">"ಮೊಬೈಲ್ ಡೇಟಾ"</item>
diff --git a/service/ServiceConnectivityResources/res/values/config.xml b/service/ServiceConnectivityResources/res/values/config.xml
index 22d9b01..f30abc6 100644
--- a/service/ServiceConnectivityResources/res/values/config.xml
+++ b/service/ServiceConnectivityResources/res/values/config.xml
@@ -135,10 +135,17 @@
<!-- Whether to cancel network notifications automatically when tapped -->
<bool name="config_autoCancelNetworkNotifications">true</bool>
- <!-- When no internet or partial connectivity is detected on a network, and a high priority
- (heads up) notification would be shown due to the network being explicitly selected,
- directly show the dialog that would normally be shown when tapping the notification
- instead of showing the notification. -->
+ <!-- Configuration to let OEMs customize what to do when :
+ • Partial connectivity is detected on the network
+ • No internet is detected on the network, and
+ - the network was explicitly selected
+ - the system is configured to actively prefer bad wifi (see config_activelyPreferBadWifi)
+ The default behavior (false) is to post a notification with a PendingIntent so
+ the user is informed and can act if they wish.
+ Making this true instead will have the system fire the intent immediately instead
+ of showing a notification. OEMs who do this should have some intent receiver
+ listening to the intent and take the action they prefer (e.g. show a dialog,
+ show a customized notification etc). -->
<bool name="config_notifyNoInternetAsDialogWhenHighPriority">false</bool>
<!-- When showing notifications indicating partial connectivity, display the same notifications
diff --git a/service/jni/com_android_server_BpfNetMaps.cpp b/service/jni/com_android_server_BpfNetMaps.cpp
index 77cffda..9ced44e 100644
--- a/service/jni/com_android_server_BpfNetMaps.cpp
+++ b/service/jni/com_android_server_BpfNetMaps.cpp
@@ -54,6 +54,10 @@
if (!isOk(status)) {
uid_t uid = getuid();
ALOGE("BpfNetMaps jni init failure as uid=%d", uid);
+ // We probably only ever get called from system_server (ie. AID_SYSTEM)
+ // or from tests, and never from network_stack (ie. AID_NETWORK_STACK).
+ // However, if we ever do add calls from production network_stack code
+ // we do want to make sure this initializes correctly.
// TODO: Fix tests to not use this jni lib, so we can unconditionally abort()
if (uid == AID_SYSTEM || uid == AID_NETWORK_STACK) abort();
}
diff --git a/service/jni/com_android_server_TestNetworkService.cpp b/service/jni/com_android_server_TestNetworkService.cpp
index 7aeecfa..08d31a3 100644
--- a/service/jni/com_android_server_TestNetworkService.cpp
+++ b/service/jni/com_android_server_TestNetworkService.cpp
@@ -38,9 +38,14 @@
#include "jni.h"
#include <android-base/stringprintf.h>
#include <android-base/unique_fd.h>
+#include <bpf/KernelUtils.h>
#include <nativehelper/JNIHelp.h>
#include <nativehelper/ScopedUtfChars.h>
+#ifndef IFF_NO_CARRIER
+#define IFF_NO_CARRIER 0x0040
+#endif
+
namespace android {
//------------------------------------------------------------------------------
@@ -66,17 +71,21 @@
// Allocate interface.
ifr.ifr_flags = (isTun ? IFF_TUN : IFF_TAP) | IFF_NO_PI;
+ if (!hasCarrier) {
+ // Using IFF_NO_CARRIER is supported starting in kernel version >= 6.0
+ // Up until then, unsupported flags are ignored.
+ if (!bpf::isAtLeastKernelVersion(6, 0, 0)) {
+ throwException(env, EOPNOTSUPP, "IFF_NO_CARRIER not supported", ifr.ifr_name);
+ return -1;
+ }
+ ifr.ifr_flags |= IFF_NO_CARRIER;
+ }
strlcpy(ifr.ifr_name, iface, IFNAMSIZ);
if (ioctl(tun.get(), TUNSETIFF, &ifr)) {
throwException(env, errno, "allocating", ifr.ifr_name);
return -1;
}
- if (!hasCarrier) {
- // disable carrier before setting IFF_UP
- setTunTapCarrierEnabledImpl(env, iface, tun.get(), hasCarrier);
- }
-
// Mark some TAP interfaces as supporting multicast
if (setIffMulticast && !isTun) {
base::unique_fd inet6CtrlSock(socket(AF_INET6, SOCK_DGRAM, 0));
diff --git a/service/jni/com_android_server_connectivity_ClatCoordinator.cpp b/service/jni/com_android_server_connectivity_ClatCoordinator.cpp
index 5b42659..c125bd6 100644
--- a/service/jni/com_android_server_connectivity_ClatCoordinator.cpp
+++ b/service/jni/com_android_server_connectivity_ClatCoordinator.cpp
@@ -26,9 +26,14 @@
#include <nativehelper/JNIHelp.h>
#include <net/if.h>
#include <spawn.h>
+#include <sys/stat.h>
+#include <sys/types.h>
#include <sys/wait.h>
+#include <sys/xattr.h>
#include <string>
+#include <unistd.h>
+#include <android-modules-utils/sdk_level.h>
#include <bpf/BpfMap.h>
#include <bpf/BpfUtils.h>
#include <netjniutils/netjniutils.h>
@@ -45,14 +50,97 @@
#define DEVICEPREFIX "v4-"
namespace android {
-static const char* kClatdPath = "/apex/com.android.tethering/bin/for-system/clatd";
+
+static bool fatal = false;
+
+#define ALOGF(s ...) do { ALOGE(s); fatal = true; } while(0)
+
+enum verify { VERIFY_DIR, VERIFY_BIN, VERIFY_PROG, VERIFY_MAP_RO, VERIFY_MAP_RW };
+
+static void verifyPerms(const char * const path,
+ const mode_t mode, const uid_t uid, const gid_t gid,
+ const char * const ctxt,
+ const verify vtype) {
+ struct stat s = {};
+
+ if (lstat(path, &s)) ALOGF("lstat '%s' errno=%d", path, errno);
+ if (s.st_mode != mode) ALOGF("'%s' mode is 0%o != 0%o", path, s.st_mode, mode);
+ if (s.st_uid != uid) ALOGF("'%s' uid is %d != %d", path, s.st_uid, uid);
+ if (s.st_gid != gid) ALOGF("'%s' gid is %d != %d", path, s.st_gid, gid);
+
+ char b[255] = {};
+ int v = lgetxattr(path, "security.selinux", &b, sizeof(b));
+ if (v < 0) ALOGF("lgetxattr '%s' errno=%d", path, errno);
+ if (strncmp(ctxt, b, sizeof(b))) ALOGF("context of '%s' is '%s' != '%s'", path, b, ctxt);
+
+ int fd = -1;
+
+ switch (vtype) {
+ case VERIFY_DIR: return;
+ case VERIFY_BIN: return;
+ case VERIFY_PROG: fd = bpf::retrieveProgram(path); break;
+ case VERIFY_MAP_RO: fd = bpf::mapRetrieveRO(path); break;
+ case VERIFY_MAP_RW: fd = bpf::mapRetrieveRW(path); break;
+ }
+
+ if (fd < 0) ALOGF("bpf_obj_get '%s' failed, errno=%d", path, errno);
+
+ if (fd >= 0) close(fd);
+}
+
+#undef ALOGF
+
+static const char* kClatdDir = "/apex/com.android.tethering/bin/for-system";
+static const char* kClatdBin = "/apex/com.android.tethering/bin/for-system/clatd";
+
+#define V(path, md, uid, gid, ctx, vtype) \
+ verifyPerms((path), (md), AID_ ## uid, AID_ ## gid, "u:object_r:" ctx ":s0", VERIFY_ ## vtype)
+
+static void verifyClatPerms() {
+ // We might run as part of tests instead of as part of system server
+ if (getuid() != AID_SYSTEM) return;
+
+ // First verify the clatd directory and binary,
+ // since this is built into the apex file system image,
+ // failures here are 99% likely to be build problems.
+ V(kClatdDir, S_IFDIR|0750, ROOT, SYSTEM, "system_file", DIR);
+ V(kClatdBin, S_IFREG|S_ISUID|S_ISGID|0755, CLAT, CLAT, "clatd_exec", BIN);
+
+ // Move on to verifying that the bpf programs and maps are as expected.
+ // This relies on the kernel and bpfloader.
+
+ // Clat BPF was only mainlined during T.
+ if (!modules::sdklevel::IsAtLeastT()) return;
+
+ V("/sys/fs/bpf", S_IFDIR|S_ISVTX|0777, ROOT, ROOT, "fs_bpf", DIR);
+ V("/sys/fs/bpf/net_shared", S_IFDIR|S_ISVTX|0777, ROOT, ROOT, "fs_bpf_net_shared", DIR);
+
+ // pre-U we do not have selinux privs to getattr on bpf maps/progs
+ // so while the below *should* be as listed, we have no way to actually verify
+ if (!modules::sdklevel::IsAtLeastU()) return;
+
+#define V2(path, md, vtype) \
+ V("/sys/fs/bpf/net_shared/" path, (md), ROOT, SYSTEM, "fs_bpf_net_shared", vtype)
+
+ V2("prog_clatd_schedcls_egress4_clat_rawip", S_IFREG|0440, PROG);
+ V2("prog_clatd_schedcls_ingress6_clat_rawip", S_IFREG|0440, PROG);
+ V2("prog_clatd_schedcls_ingress6_clat_ether", S_IFREG|0440, PROG);
+ V2("map_clatd_clat_egress4_map", S_IFREG|0660, MAP_RW);
+ V2("map_clatd_clat_ingress6_map", S_IFREG|0660, MAP_RW);
+
+#undef V2
+
+ if (fatal) abort();
+}
+
+#undef V
static void throwIOException(JNIEnv* env, const char* msg, int error) {
jniThrowExceptionFmt(env, "java/io/IOException", "%s: %s", msg, strerror(error));
}
jstring com_android_server_connectivity_ClatCoordinator_selectIpv4Address(JNIEnv* env,
- jobject clazz,
+ jclass clazz,
jstring v4addr,
jint prefixlen) {
ScopedUtfChars address(env, v4addr);
@@ -84,7 +172,7 @@
// Picks a random interface ID that is checksum neutral with the IPv4 address and the NAT64 prefix.
jstring com_android_server_connectivity_ClatCoordinator_generateIpv6Address(
- JNIEnv* env, jobject clazz, jstring ifaceStr, jstring v4Str, jstring prefix64Str,
+ JNIEnv* env, jclass clazz, jstring ifaceStr, jstring v4Str, jstring prefix64Str,
jint mark) {
ScopedUtfChars iface(env, ifaceStr);
ScopedUtfChars addr4(env, v4Str);
@@ -125,7 +213,7 @@
}
static jint com_android_server_connectivity_ClatCoordinator_createTunInterface(JNIEnv* env,
- jobject clazz,
+ jclass clazz,
jstring tuniface) {
ScopedUtfChars v4interface(env, tuniface);
@@ -138,7 +226,7 @@
}
struct ifreq ifr = {
- .ifr_flags = IFF_TUN,
+ .ifr_flags = static_cast<short>(IFF_TUN | IFF_TUN_EXCL),
};
strlcpy(ifr.ifr_name, v4interface.c_str(), sizeof(ifr.ifr_name));
@@ -152,7 +240,7 @@
return fd;
}
-static jint com_android_server_connectivity_ClatCoordinator_detectMtu(JNIEnv* env, jobject clazz,
+static jint com_android_server_connectivity_ClatCoordinator_detectMtu(JNIEnv* env, jclass clazz,
jstring platSubnet,
jint plat_suffix, jint mark) {
ScopedUtfChars platSubnetStr(env, platSubnet);
@@ -174,25 +262,32 @@
}
static jint com_android_server_connectivity_ClatCoordinator_openPacketSocket(JNIEnv* env,
- jobject clazz) {
+ jclass clazz) {
// Will eventually be bound to htons(ETH_P_IPV6) protocol,
// but only after appropriate bpf filter is attached.
- int sock = socket(AF_PACKET, SOCK_DGRAM | SOCK_CLOEXEC, 0);
+ const int sock = socket(AF_PACKET, SOCK_RAW | SOCK_CLOEXEC, 0);
if (sock < 0) {
throwIOException(env, "packet socket failed", errno);
return -1;
}
- int on = 1;
+ const int on = 1;
+ // enable tpacket_auxdata cmsg delivery, which includes L2 header length
if (setsockopt(sock, SOL_PACKET, PACKET_AUXDATA, &on, sizeof(on))) {
throwIOException(env, "packet socket auxdata enablement failed", errno);
close(sock);
return -1;
}
+ // needed for virtio_net_hdr prepending, which includes checksum metadata
+ if (setsockopt(sock, SOL_PACKET, PACKET_VNET_HDR, &on, sizeof(on))) {
+ throwIOException(env, "packet socket vnet_hdr enablement failed", errno);
+ close(sock);
+ return -1;
+ }
return sock;
}
static jint com_android_server_connectivity_ClatCoordinator_openRawSocket6(JNIEnv* env,
- jobject clazz,
+ jclass clazz,
jint mark) {
int sock = socket(AF_INET6, SOCK_RAW | SOCK_NONBLOCK | SOCK_CLOEXEC, IPPROTO_RAW);
if (sock < 0) {
@@ -211,7 +306,7 @@
}
static void com_android_server_connectivity_ClatCoordinator_addAnycastSetsockopt(
- JNIEnv* env, jobject clazz, jobject javaFd, jstring addr6, jint ifindex) {
+ JNIEnv* env, jclass clazz, jobject javaFd, jstring addr6, jint ifindex) {
int sock = netjniutils::GetNativeFileDescriptor(env, javaFd);
if (sock < 0) {
jniThrowExceptionFmt(env, "java/io/IOException", "Invalid file descriptor");
@@ -237,7 +332,7 @@
}
static void com_android_server_connectivity_ClatCoordinator_configurePacketSocket(
- JNIEnv* env, jobject clazz, jobject javaFd, jstring addr6, jint ifindex) {
+ JNIEnv* env, jclass clazz, jobject javaFd, jstring addr6, jint ifindex) {
ScopedUtfChars addrStr(env, addr6);
int sock = netjniutils::GetNativeFileDescriptor(env, javaFd);
@@ -261,7 +356,7 @@
}
static jint com_android_server_connectivity_ClatCoordinator_startClatd(
- JNIEnv* env, jobject clazz, jobject tunJavaFd, jobject readSockJavaFd,
+ JNIEnv* env, jclass clazz, jobject tunJavaFd, jobject readSockJavaFd,
jobject writeSockJavaFd, jstring iface, jstring pfx96, jstring v4, jstring v6) {
ScopedUtfChars ifaceStr(env, iface);
ScopedUtfChars pfx96Str(env, pfx96);
@@ -358,7 +453,7 @@
// 5. actually perform vfork/dup2/execve
pid_t pid;
- if (int ret = posix_spawn(&pid, kClatdPath, &fa, &attr, (char* const*)args, nullptr)) {
+ if (int ret = posix_spawn(&pid, kClatdBin, &fa, &attr, (char* const*)args, nullptr)) {
posix_spawnattr_destroy(&attr);
posix_spawn_file_actions_destroy(&fa);
throwIOException(env, "posix_spawn failed", ret);
@@ -377,11 +472,15 @@
static constexpr int WAITPID_ATTEMPTS = 50;
static constexpr int WAITPID_RETRY_INTERVAL_US = 100000;
-static void stopClatdProcess(int pid) {
- int err = kill(pid, SIGTERM);
- if (err) {
- err = errno;
+static void com_android_server_connectivity_ClatCoordinator_stopClatd(JNIEnv* env, jclass clazz,
+ jint pid) {
+ if (pid <= 0) {
+ jniThrowExceptionFmt(env, "java/lang/IllegalArgumentException", "Invalid pid");
+ return;
}
+
+ int err = kill(pid, SIGTERM);
+ if (err) err = errno;
if (err == ESRCH) {
ALOGE("clatd child process %d unexpectedly disappeared", pid);
return;
@@ -398,7 +497,9 @@
if (ret == 0) {
ALOGE("Failed to SIGTERM clatd pid=%d, try SIGKILL", pid);
// TODO: fix that kill failed or waitpid doesn't return.
- kill(pid, SIGKILL);
+ if (kill(pid, SIGKILL)) {
+ ALOGE("Failed to SIGKILL clatd pid=%d: %s", pid, strerror(errno));
+ }
ret = waitpid(pid, &status, 0);
}
if (ret == -1) {
@@ -408,25 +509,8 @@
}
}
-static void com_android_server_connectivity_ClatCoordinator_stopClatd(JNIEnv* env, jobject clazz,
- jstring iface, jstring pfx96,
- jstring v4, jstring v6,
- jint pid) {
- ScopedUtfChars ifaceStr(env, iface);
- ScopedUtfChars pfx96Str(env, pfx96);
- ScopedUtfChars v4Str(env, v4);
- ScopedUtfChars v6Str(env, v6);
-
- if (pid <= 0) {
- jniThrowExceptionFmt(env, "java/io/IOException", "Invalid pid");
- return;
- }
-
- stopClatdProcess(pid);
-}
-
static jlong com_android_server_connectivity_ClatCoordinator_getSocketCookie(
- JNIEnv* env, jobject clazz, jobject sockJavaFd) {
+ JNIEnv* env, jclass clazz, jobject sockJavaFd) {
int sockFd = netjniutils::GetNativeFileDescriptor(env, sockJavaFd);
if (sockFd < 0) {
jniThrowExceptionFmt(env, "java/io/IOException", "Invalid socket file descriptor");
@@ -434,7 +518,7 @@
}
uint64_t sock_cookie = bpf::getSocketCookie(sockFd);
- if (sock_cookie == bpf::NONEXISTENT_COOKIE) {
+ if (!sock_cookie) {
throwIOException(env, "get socket cookie failed", errno);
return -1;
}
@@ -469,14 +553,14 @@
"(Ljava/io/FileDescriptor;Ljava/io/FileDescriptor;Ljava/io/FileDescriptor;Ljava/lang/"
"String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)I",
(void*)com_android_server_connectivity_ClatCoordinator_startClatd},
- {"native_stopClatd",
- "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;I)V",
+ {"native_stopClatd", "(I)V",
(void*)com_android_server_connectivity_ClatCoordinator_stopClatd},
{"native_getSocketCookie", "(Ljava/io/FileDescriptor;)J",
(void*)com_android_server_connectivity_ClatCoordinator_getSocketCookie},
};
int register_com_android_server_connectivity_ClatCoordinator(JNIEnv* env) {
+ verifyClatPerms();
return jniRegisterNativeMethods(env,
"android/net/connectivity/com/android/server/connectivity/ClatCoordinator",
gMethods, NELEM(gMethods));
diff --git a/service/jni/onload.cpp b/service/jni/onload.cpp
index 3d15d43..ed74430 100644
--- a/service/jni/onload.cpp
+++ b/service/jni/onload.cpp
@@ -22,8 +22,8 @@
namespace android {
int register_com_android_server_TestNetworkService(JNIEnv* env);
-int register_com_android_server_connectivity_ClatCoordinator(JNIEnv* env);
int register_com_android_server_BpfNetMaps(JNIEnv* env);
+int register_com_android_server_connectivity_ClatCoordinator(JNIEnv* env);
int register_android_server_net_NetworkStatsFactory(JNIEnv* env);
int register_android_server_net_NetworkStatsService(JNIEnv* env);
@@ -38,15 +38,15 @@
return JNI_ERR;
}
- if (register_com_android_server_connectivity_ClatCoordinator(env) < 0) {
- return JNI_ERR;
- }
-
- if (register_com_android_server_BpfNetMaps(env) < 0) {
- return JNI_ERR;
- }
-
if (android::modules::sdklevel::IsAtLeastT()) {
+ if (register_com_android_server_BpfNetMaps(env) < 0) {
+ return JNI_ERR;
+ }
+
+ if (register_com_android_server_connectivity_ClatCoordinator(env) < 0) {
+ return JNI_ERR;
+ }
+
if (register_android_server_net_NetworkStatsFactory(env) < 0) {
return JNI_ERR;
}
diff --git a/service/libconnectivity/Android.bp b/service/libconnectivity/Android.bp
index 391ceac..e063af7 100644
--- a/service/libconnectivity/Android.bp
+++ b/service/libconnectivity/Android.bp
@@ -27,6 +27,7 @@
min_sdk_version: "30",
static_libs: [
"connectivity_native_aidl_interface-V1-ndk",
+ "libmodules-utils-build",
],
export_include_dirs: ["include"],
cflags: [
diff --git a/service/libconnectivity/src/connectivity_native.cpp b/service/libconnectivity/src/connectivity_native.cpp
index 9545ed1..f39bb0a 100644
--- a/service/libconnectivity/src/connectivity_native.cpp
+++ b/service/libconnectivity/src/connectivity_native.cpp
@@ -17,14 +17,15 @@
#include "connectivity_native.h"
#include <android/binder_manager.h>
+#include <android-modules-utils/sdk_level.h>
#include <aidl/android/net/connectivity/aidl/ConnectivityNative.h>
using aidl::android::net::connectivity::aidl::IConnectivityNative;
static std::shared_ptr<IConnectivityNative> getBinder() {
- static ndk::SpAIBinder sBinder = ndk::SpAIBinder(reinterpret_cast<AIBinder*>(
- AServiceManager_getService("connectivity_native")));
+ ndk::SpAIBinder sBinder = ndk::SpAIBinder(reinterpret_cast<AIBinder*>(
+ AServiceManager_checkService("connectivity_native")));
return aidl::android::net::connectivity::aidl::IConnectivityNative::fromBinder(sBinder);
}
@@ -44,22 +45,38 @@
}
int AConnectivityNative_blockPortForBind(in_port_t port) {
+ if (!android::modules::sdklevel::IsAtLeastU()) return ENOSYS;
std::shared_ptr<IConnectivityNative> c = getBinder();
+ if (!c) {
+ return EAGAIN;
+ }
return getErrno(c->blockPortForBind(port));
}
int AConnectivityNative_unblockPortForBind(in_port_t port) {
+ if (!android::modules::sdklevel::IsAtLeastU()) return ENOSYS;
std::shared_ptr<IConnectivityNative> c = getBinder();
+ if (!c) {
+ return EAGAIN;
+ }
return getErrno(c->unblockPortForBind(port));
}
int AConnectivityNative_unblockAllPortsForBind() {
+ if (!android::modules::sdklevel::IsAtLeastU()) return ENOSYS;
std::shared_ptr<IConnectivityNative> c = getBinder();
+ if (!c) {
+ return EAGAIN;
+ }
return getErrno(c->unblockAllPortsForBind());
}
int AConnectivityNative_getPortsBlockedForBind(in_port_t *ports, size_t *count) {
+ if (!android::modules::sdklevel::IsAtLeastU()) return ENOSYS;
std::shared_ptr<IConnectivityNative> c = getBinder();
+ if (!c) {
+ return EAGAIN;
+ }
std::vector<int32_t> actualBlockedPorts;
int err = getErrno(c->getPortsBlockedForBind(&actualBlockedPorts));
if (err) {
diff --git a/service/native/libs/libclat/Android.bp b/service/native/libs/libclat/Android.bp
index 54d40ac..996706e 100644
--- a/service/native/libs/libclat/Android.bp
+++ b/service/native/libs/libclat/Android.bp
@@ -23,6 +23,9 @@
"clatutils.cpp",
],
stl: "libc++_static",
+ header_libs: [
+ "bpf_headers",
+ ],
static_libs: [
"libip_checksum",
],
diff --git a/service/native/libs/libclat/clatutils.cpp b/service/native/libs/libclat/clatutils.cpp
index c6a9781..6c5c9e3 100644
--- a/service/native/libs/libclat/clatutils.cpp
+++ b/service/native/libs/libclat/clatutils.cpp
@@ -25,6 +25,8 @@
#include <string.h>
#include <unistd.h>
+#include <bpf/BpfClassic.h>
+
extern "C" {
#include "checksum.h"
}
@@ -33,11 +35,9 @@
namespace net {
namespace clat {
-bool isIpv4AddressFree(in_addr_t addr) {
- int s = socket(AF_INET, SOCK_DGRAM | SOCK_CLOEXEC, 0);
- if (s == -1) {
- return 0;
- }
+bool isIpv4AddressFree(const in_addr_t addr) {
+ const int s = socket(AF_INET, SOCK_DGRAM | SOCK_CLOEXEC, 0);
+ if (s == -1) return 0;
// Attempt to connect to the address. If the connection succeeds and getsockname returns the
// same then the address is already assigned to the system and we can't use it.
@@ -47,9 +47,10 @@
.sin_addr = {addr},
};
socklen_t len = sizeof(sin);
- bool inuse = connect(s, (struct sockaddr*)&sin, sizeof(sin)) == 0 &&
- getsockname(s, (struct sockaddr*)&sin, &len) == 0 && (size_t)len >= sizeof(sin) &&
- sin.sin_addr.s_addr == addr;
+ const bool inuse = !connect(s, (struct sockaddr*)&sin, sizeof(sin)) &&
+ !getsockname(s, (struct sockaddr*)&sin, &len) &&
+ len == (socklen_t)sizeof(sin) &&
+ sin.sin_addr.s_addr == addr;
close(s);
return !inuse;
@@ -59,36 +60,30 @@
// ip - the IP address from the configuration file
// prefixlen - the length of the prefix from which addresses may be selected.
// returns: the IPv4 address, or INADDR_NONE if no addresses were available
-in_addr_t selectIpv4Address(const in_addr ip, int16_t prefixlen) {
+in_addr_t selectIpv4Address(const in_addr ip, const int16_t prefixlen) {
return selectIpv4AddressInternal(ip, prefixlen, isIpv4AddressFree);
}
// Only allow testing to use this function directly. Otherwise call selectIpv4Address(ip, pfxlen)
// which has applied valid isIpv4AddressFree function pointer.
-in_addr_t selectIpv4AddressInternal(const in_addr ip, int16_t prefixlen,
- isIpv4AddrFreeFn isIpv4AddressFreeFunc) {
+in_addr_t selectIpv4AddressInternal(const in_addr ip, const int16_t prefixlen,
+ const isIpv4AddrFreeFn isIpv4AddressFreeFunc) {
// Impossible! Only test allows to apply fn.
- if (isIpv4AddressFreeFunc == nullptr) {
- return INADDR_NONE;
- }
+ if (isIpv4AddressFreeFunc == nullptr) return INADDR_NONE;
// Don't accept prefixes that are too large because we scan addresses one by one.
- if (prefixlen < 16 || prefixlen > 32) {
- return INADDR_NONE;
- }
+ if (prefixlen < 16 || prefixlen > 32) return INADDR_NONE;
// All these are in host byte order.
- in_addr_t mask = 0xffffffff >> (32 - prefixlen) << (32 - prefixlen);
- in_addr_t ipv4 = ntohl(ip.s_addr);
- in_addr_t first_ipv4 = ipv4;
- in_addr_t prefix = ipv4 & mask;
+ const uint32_t mask = 0xffffffff >> (32 - prefixlen) << (32 - prefixlen);
+ uint32_t ipv4 = ntohl(ip.s_addr);
+ const uint32_t first_ipv4 = ipv4;
+ const uint32_t prefix = ipv4 & mask;
// Pick the first IPv4 address in the pool, wrapping around if necessary.
// So, for example, 192.0.0.4 -> 192.0.0.5 -> 192.0.0.6 -> 192.0.0.7 -> 192.0.0.0.
do {
- if (isIpv4AddressFreeFunc(htonl(ipv4))) {
- return htonl(ipv4);
- }
+ if (isIpv4AddressFreeFunc(htonl(ipv4))) return htonl(ipv4);
ipv4 = prefix | ((ipv4 + 1) & ~mask);
} while (ipv4 != first_ipv4);
@@ -96,7 +91,7 @@
}
// Alters the bits in the IPv6 address to make them checksum neutral with v4 and nat64Prefix.
-void makeChecksumNeutral(in6_addr* v6, const in_addr v4, const in6_addr& nat64Prefix) {
+void makeChecksumNeutral(in6_addr* const v6, const in_addr v4, const in6_addr& nat64Prefix) {
// Fill last 8 bytes of IPv6 address with random bits.
arc4random_buf(&v6->s6_addr[8], 8);
@@ -118,33 +113,35 @@
}
// Picks a random interface ID that is checksum neutral with the IPv4 address and the NAT64 prefix.
-int generateIpv6Address(const char* iface, const in_addr v4, const in6_addr& nat64Prefix,
- in6_addr* v6, uint32_t mark) {
- int s = socket(AF_INET6, SOCK_DGRAM | SOCK_CLOEXEC, 0);
+int generateIpv6Address(const char* const iface, const in_addr v4, const in6_addr& nat64Prefix,
+ in6_addr* const v6, const uint32_t mark) {
+ const int s = socket(AF_INET6, SOCK_DGRAM | SOCK_CLOEXEC, 0);
if (s == -1) return -errno;
// Socket's mark affects routing decisions (network selection)
// An fwmark is necessary for clat to bypass the VPN during initialization.
if (setsockopt(s, SOL_SOCKET, SO_MARK, &mark, sizeof(mark))) {
- int ret = errno;
- ALOGE("setsockopt(SOL_SOCKET, SO_MARK) failed: %s", strerror(errno));
+ const int err = errno;
+ ALOGE("setsockopt(SOL_SOCKET, SO_MARK) failed: %s", strerror(err));
close(s);
- return -ret;
+ return -err;
}
- if (setsockopt(s, SOL_SOCKET, SO_BINDTODEVICE, iface, strlen(iface) + 1) == -1) {
+ if (setsockopt(s, SOL_SOCKET, SO_BINDTODEVICE, iface, strlen(iface) + 1)) {
+ const int err = errno;
+ ALOGE("setsockopt(SOL_SOCKET, SO_BINDTODEVICE, '%s') failed: %s", iface, strerror(err));
close(s);
- return -errno;
+ return -err;
}
sockaddr_in6 sin6 = {.sin6_family = AF_INET6, .sin6_addr = nat64Prefix};
- if (connect(s, reinterpret_cast<struct sockaddr*>(&sin6), sizeof(sin6)) == -1) {
+ if (connect(s, reinterpret_cast<struct sockaddr*>(&sin6), sizeof(sin6))) {
close(s);
return -errno;
}
socklen_t len = sizeof(sin6);
- if (getsockname(s, reinterpret_cast<struct sockaddr*>(&sin6), &len) == -1) {
+ if (getsockname(s, reinterpret_cast<struct sockaddr*>(&sin6), &len)) {
close(s);
return -errno;
}
@@ -163,21 +160,22 @@
return 0;
}
-int detect_mtu(const struct in6_addr* plat_subnet, uint32_t plat_suffix, uint32_t mark) {
+int detect_mtu(const struct in6_addr* const plat_subnet, const uint32_t plat_suffix,
+ const uint32_t mark) {
// Create an IPv6 UDP socket.
- int s = socket(AF_INET6, SOCK_DGRAM | SOCK_CLOEXEC, 0);
+ const int s = socket(AF_INET6, SOCK_DGRAM | SOCK_CLOEXEC, 0);
if (s < 0) {
- int ret = errno;
- ALOGE("socket(AF_INET6, SOCK_DGRAM, 0) failed: %s", strerror(errno));
- return -ret;
+ const int err = errno;
+ ALOGE("socket(AF_INET6, SOCK_DGRAM, 0) failed: %s", strerror(err));
+ return -err;
}
// Socket's mark affects routing decisions (network selection)
if (setsockopt(s, SOL_SOCKET, SO_MARK, &mark, sizeof(mark))) {
- int ret = errno;
- ALOGE("setsockopt(SOL_SOCKET, SO_MARK) failed: %s", strerror(errno));
+ const int err = errno;
+ ALOGE("setsockopt(SOL_SOCKET, SO_MARK) failed: %s", strerror(err));
close(s);
- return -ret;
+ return -err;
}
// Try to connect udp socket to plat_subnet(96 bits):plat_suffix(32 bits)
@@ -187,20 +185,20 @@
};
dst.sin6_addr.s6_addr32[3] = plat_suffix;
if (connect(s, (struct sockaddr*)&dst, sizeof(dst))) {
- int ret = errno;
- ALOGE("connect() failed: %s", strerror(errno));
+ const int err = errno;
+ ALOGE("connect() failed: %s", strerror(err));
close(s);
- return -ret;
+ return -err;
}
// Fetch the socket's IPv6 mtu - this is effectively fetching mtu from routing table
int mtu;
socklen_t sz_mtu = sizeof(mtu);
if (getsockopt(s, SOL_IPV6, IPV6_MTU, &mtu, &sz_mtu)) {
- int ret = errno;
- ALOGE("getsockopt(SOL_IPV6, IPV6_MTU) failed: %s", strerror(errno));
+ const int err = errno;
+ ALOGE("getsockopt(SOL_IPV6, IPV6_MTU) failed: %s", strerror(err));
close(s);
- return -ret;
+ return -err;
}
if (sz_mtu != sizeof(mtu)) {
ALOGE("getsockopt(SOL_IPV6, IPV6_MTU) returned unexpected size: %d", sz_mtu);
@@ -219,34 +217,26 @@
* ifindex - index of interface to add the filter to
* returns: 0 on success, -errno on failure
*/
-int configure_packet_socket(int sock, in6_addr* addr, int ifindex) {
- uint32_t* ipv6 = addr->s6_addr32;
-
+int configure_packet_socket(const int sock, const in6_addr* const addr, const int ifindex) {
// clang-format off
struct sock_filter filter_code[] = {
- // Load the first four bytes of the IPv6 destination address (starts 24 bytes in).
- // Compare it against the first four bytes of our IPv6 address, in host byte order (BPF loads
- // are always in host byte order). If it matches, continue with next instruction (JMP 0). If it
- // doesn't match, jump ahead to statement that returns 0 (ignore packet). Repeat for the other
- // three words of the IPv6 address, and if they all match, return full packet (accept packet).
- BPF_STMT(BPF_LD | BPF_W | BPF_ABS, 24),
- BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, htonl(ipv6[0]), 0, 7),
- BPF_STMT(BPF_LD | BPF_W | BPF_ABS, 28),
- BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, htonl(ipv6[1]), 0, 5),
- BPF_STMT(BPF_LD | BPF_W | BPF_ABS, 32),
- BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, htonl(ipv6[2]), 0, 3),
- BPF_STMT(BPF_LD | BPF_W | BPF_ABS, 36),
- BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, htonl(ipv6[3]), 0, 1),
- BPF_STMT(BPF_RET | BPF_K, 0xFFFFFFFF),
- BPF_STMT(BPF_RET | BPF_K, 0),
+ BPF_LOAD_IPV6_BE32(daddr.s6_addr32[0]),
+ BPF2_REJECT_IF_NOT_EQUAL(ntohl(addr->s6_addr32[0])),
+ BPF_LOAD_IPV6_BE32(daddr.s6_addr32[1]),
+ BPF2_REJECT_IF_NOT_EQUAL(ntohl(addr->s6_addr32[1])),
+ BPF_LOAD_IPV6_BE32(daddr.s6_addr32[2]),
+ BPF2_REJECT_IF_NOT_EQUAL(ntohl(addr->s6_addr32[2])),
+ BPF_LOAD_IPV6_BE32(daddr.s6_addr32[3]),
+ BPF2_REJECT_IF_NOT_EQUAL(ntohl(addr->s6_addr32[3])),
+ BPF_ACCEPT,
};
// clang-format on
struct sock_fprog filter = {sizeof(filter_code) / sizeof(filter_code[0]), filter_code};
if (setsockopt(sock, SOL_SOCKET, SO_ATTACH_FILTER, &filter, sizeof(filter))) {
- int res = errno;
- ALOGE("attach packet filter failed: %s", strerror(errno));
- return -res;
+ const int err = errno;
+ ALOGE("attach packet filter failed: %s", strerror(err));
+ return -err;
}
struct sockaddr_ll sll = {
@@ -257,9 +247,9 @@
PACKET_OTHERHOST, // The 464xlat IPv6 address is not assigned to the kernel.
};
if (bind(sock, (struct sockaddr*)&sll, sizeof(sll))) {
- int res = errno;
- ALOGE("binding packet socket: %s", strerror(errno));
- return -res;
+ const int err = errno;
+ ALOGE("binding packet socket: %s", strerror(err));
+ return -err;
}
return 0;
diff --git a/service/native/libs/libclat/clatutils_test.cpp b/service/native/libs/libclat/clatutils_test.cpp
index abd4e81..f4f97db 100644
--- a/service/native/libs/libclat/clatutils_test.cpp
+++ b/service/native/libs/libclat/clatutils_test.cpp
@@ -165,7 +165,7 @@
TunInterface v6Iface;
ASSERT_EQ(0, v6Iface.init());
- int s = socket(AF_PACKET, SOCK_DGRAM | SOCK_CLOEXEC, htons(ETH_P_IPV6));
+ const int s = socket(AF_PACKET, SOCK_RAW | SOCK_CLOEXEC, htons(ETH_P_IPV6));
EXPECT_LE(0, s);
struct in6_addr addr6;
EXPECT_EQ(1, inet_pton(AF_INET6, "2001:db8::f00", &addr6));
diff --git a/service/native/libs/libclat/include/libclat/clatutils.h b/service/native/libs/libclat/include/libclat/clatutils.h
index 991b193..6e17e67 100644
--- a/service/native/libs/libclat/include/libclat/clatutils.h
+++ b/service/native/libs/libclat/include/libclat/clatutils.h
@@ -20,17 +20,19 @@
namespace net {
namespace clat {
-bool isIpv4AddressFree(in_addr_t addr);
-in_addr_t selectIpv4Address(const in_addr ip, int16_t prefixlen);
-void makeChecksumNeutral(in6_addr* v6, const in_addr v4, const in6_addr& nat64Prefix);
-int generateIpv6Address(const char* iface, const in_addr v4, const in6_addr& nat64Prefix,
- in6_addr* v6, uint32_t mark);
-int detect_mtu(const struct in6_addr* plat_subnet, uint32_t plat_suffix, uint32_t mark);
-int configure_packet_socket(int sock, in6_addr* addr, int ifindex);
+bool isIpv4AddressFree(const in_addr_t addr);
+in_addr_t selectIpv4Address(const in_addr ip, const int16_t prefixlen);
+void makeChecksumNeutral(in6_addr* const v6, const in_addr v4, const in6_addr& nat64Prefix);
+int generateIpv6Address(const char* const iface, const in_addr v4, const in6_addr& nat64Prefix,
+ in6_addr* const v6, const uint32_t mark);
+int detect_mtu(const struct in6_addr* const plat_subnet, const uint32_t plat_suffix,
+ const uint32_t mark);
+int configure_packet_socket(const int sock, const in6_addr* const addr, const int ifindex);
// For testing
-typedef bool (*isIpv4AddrFreeFn)(in_addr_t);
-in_addr_t selectIpv4AddressInternal(const in_addr ip, int16_t prefixlen, isIpv4AddrFreeFn fn);
+typedef bool (*isIpv4AddrFreeFn)(const in_addr_t);
+in_addr_t selectIpv4AddressInternal(const in_addr ip, const int16_t prefixlen,
+ const isIpv4AddrFreeFn fn);
} // namespace clat
} // namespace net
diff --git a/service/src/com/android/metrics/stats.proto b/service/src/com/android/metrics/stats.proto
index 8104632..006d20a 100644
--- a/service/src/com/android/metrics/stats.proto
+++ b/service/src/com/android/metrics/stats.proto
@@ -347,3 +347,89 @@
// How long(in seconds) this slice has been connected
optional int32 slice_connection_duration_sec = 6;
}
+
+/**
+ * Logs DailykeepaliveInfoReported
+ *
+ * Logs from: packages/modules/Connectivity/service/src/com/android/
+ * server/connectivity/AutomaticOnOffKeepaliveTracker.
+ */
+message DailykeepaliveInfoReported{
+ // Daily duration per number of concurrent keepalive
+ optional DurationPerNumOfKeepalive duration_per_num_of_keepalive = 1;
+
+ // Daily keepalive registered/active duration on each list of keepalive session, in
+ // milli-seconds
+ optional KeepaliveLifetimePerCarrier keepalive_lifetime_per_carrier = 2;
+
+ // Daily number of keepalive requests
+ optional int32 keepalive_requests = 3;
+
+ // Daily number of automatic keepalive requests
+ optional int32 automatic_keepalive_requests = 4;
+
+ // Daily number of distinct apps that requested keepalives
+ optional int32 distinct_user_count = 5;
+
+ // Daily distinct apps uid list that requested keepalives
+ repeated int32 uid = 6;
+}
+
+/**
+ * Daily duration per number of concurrent keepalive
+ *
+ * Logs from: packages/modules/Connectivity/service/src/com/android/
+ * server/connectivity/AutomaticOnOffKeepaliveTracker.
+ */
+message DurationPerNumOfKeepalive {
+ repeated DurationForNumOfKeepalive duration_for_num_of_keepalive = 1;
+}
+
+message DurationForNumOfKeepalive {
+ // The number of concurrent keepalives is in the device
+ optional int32 num_of_keepalive = 1;
+
+ // How many milliseconds the device has keepalive registration number is num_of_keepalive
+ optional int32 keepalive_registered_durations_msec = 2;
+
+ // How many milliseconds the device has keepalive active(not paused) number is num_of_keepalive
+ optional int32 keepalive_active_durations_msec = 3;
+}
+
+/**
+ * Daily keepalive registered/active duration on each list of Keepalive session, in milli-seconds
+ *
+ * Logs from: packages/modules/Connectivity/service/src/com/android/
+ * server/connectivity/AutomaticOnOffKeepaliveTracker.
+ */
+message KeepaliveLifetimePerCarrier {
+ // The number of network count on each list of carriers
+ repeated KeepaliveLifetimeForCarrier keepalive_lifetime_for_carrier = 1;
+}
+
+/**
+ * Logs the keepalive registered/active duration in milli-seconds and carrier
+ * info(carrier id, transport, keepalive interval).
+ *
+ * Logs from: packages/modules/Connectivity/service/src/com/android/
+ * server/connectivity/AutomaticOnOffKeepaliveTracker.
+ */
+message KeepaliveLifetimeForCarrier {
+ // The carrier ID for each keepalive, or TelephonyManager.UNKNOWN_CARRIER_ID(-1) if not cell
+ optional int32 carrier_id = 1;
+
+ // The transport types of the underlying network for each keepalive. A network may include
+ // multiple transport types. Each transfer type is represented by a different bit, defined in
+ // packages/modules/Connectivity/framework/src/android/net/NetworkCapabilities.java
+ optional int32 transport_types = 2;
+
+ // The keepalive interval for each keepalive
+ optional int32 intervals_msec = 3;
+
+ // The lifetime of the keepalive registered today
+ optional int32 lifetime_msec = 4;
+
+ // The duration for which the keepalive was active (not suspended)
+ optional int32 active_lifetime_msec = 5;
+}
+
diff --git a/service/src/com/android/server/BpfNetMaps.java b/service/src/com/android/server/BpfNetMaps.java
index b4fce37..ec168dd 100644
--- a/service/src/com/android/server/BpfNetMaps.java
+++ b/service/src/com/android/server/BpfNetMaps.java
@@ -281,8 +281,8 @@
if (sEnableJavaBpfMap == null) {
sEnableJavaBpfMap = SdkLevel.isAtLeastU() ||
DeviceConfigUtils.isFeatureEnabled(context,
- DeviceConfig.NAMESPACE_TETHERING, BPF_NET_MAPS_ENABLE_JAVA_BPF_MAP,
- false /* defaultValue */);
+ DeviceConfig.NAMESPACE_TETHERING, BPF_NET_MAPS_ENABLE_JAVA_BPF_MAP,
+ DeviceConfigUtils.TETHERING_MODULE_NAME, false /* defaultValue */);
}
Log.d(TAG, "BpfNetMaps is initialized with sEnableJavaBpfMap=" + sEnableJavaBpfMap);
@@ -384,7 +384,6 @@
* ALLOWLIST means the firewall denies all by default, uids must be explicitly allowed
* DENYLIST means the firewall allows all by default, uids must be explicitly denyed
*/
- @VisibleForTesting
public boolean isFirewallAllowList(final int chain) {
switch (chain) {
case FIREWALL_CHAIN_DOZABLE:
@@ -745,6 +744,65 @@
}
}
+ private Set<Integer> getUidsMatchEnabled(final int childChain) throws ErrnoException {
+ final long match = getMatchByFirewallChain(childChain);
+ Set<Integer> uids = new ArraySet<>();
+ synchronized (sUidOwnerMap) {
+ sUidOwnerMap.forEach((uid, val) -> {
+ if (val == null) {
+ Log.wtf(TAG, "sUidOwnerMap entry was deleted while holding a lock");
+ } else {
+ if ((val.rule & match) != 0) {
+ uids.add(uid.val);
+ }
+ }
+ });
+ }
+ return uids;
+ }
+
+ /**
+ * Get uids that has FIREWALL_RULE_ALLOW on allowlist chain.
+ * Allowlist means the firewall denies all by default, uids must be explicitly allowed.
+ *
+ * Note that uids that has FIREWALL_RULE_DENY on allowlist chain can not be computed from the
+ * bpf map, since all the uids that does not have explicit FIREWALL_RULE_ALLOW rule in bpf map
+ * are determined to have FIREWALL_RULE_DENY.
+ *
+ * @param childChain target chain
+ * @return Set of uids
+ */
+ public Set<Integer> getUidsWithAllowRuleOnAllowListChain(final int childChain)
+ throws ErrnoException {
+ if (!isFirewallAllowList(childChain)) {
+ throw new IllegalArgumentException("getUidsWithAllowRuleOnAllowListChain is called with"
+ + " denylist chain:" + childChain);
+ }
+ // Corresponding match is enabled for uids that has FIREWALL_RULE_ALLOW on allowlist chain.
+ return getUidsMatchEnabled(childChain);
+ }
+
+ /**
+ * Get uids that has FIREWALL_RULE_DENY on denylist chain.
+ * Denylist means the firewall allows all by default, uids must be explicitly denyed
+ *
+ * Note that uids that has FIREWALL_RULE_ALLOW on denylist chain can not be computed from the
+ * bpf map, since all the uids that does not have explicit FIREWALL_RULE_DENY rule in bpf map
+ * are determined to have the FIREWALL_RULE_ALLOW.
+ *
+ * @param childChain target chain
+ * @return Set of uids
+ */
+ public Set<Integer> getUidsWithDenyRuleOnDenyListChain(final int childChain)
+ throws ErrnoException {
+ if (isFirewallAllowList(childChain)) {
+ throw new IllegalArgumentException("getUidsWithDenyRuleOnDenyListChain is called with"
+ + " allowlist chain:" + childChain);
+ }
+ // Corresponding match is enabled for uids that has FIREWALL_RULE_DENY on denylist chain.
+ return getUidsMatchEnabled(childChain);
+ }
+
/**
* Add ingress interface filtering rules to a list of UIDs
*
diff --git a/service/src/com/android/server/ConnectivityService.java b/service/src/com/android/server/ConnectivityService.java
index 4c55afe..83afa83 100755
--- a/service/src/com/android/server/ConnectivityService.java
+++ b/service/src/com/android/server/ConnectivityService.java
@@ -17,6 +17,7 @@
package com.android.server;
import static android.Manifest.permission.RECEIVE_DATA_ACTIVITY_CHANGE;
+import static android.app.ActivityManager.UidFrozenStateChangedCallback.UID_FROZEN_STATE_FROZEN;
import static android.content.pm.PackageManager.FEATURE_BLUETOOTH;
import static android.content.pm.PackageManager.FEATURE_WATCH;
import static android.content.pm.PackageManager.FEATURE_WIFI;
@@ -33,6 +34,7 @@
import static android.net.ConnectivityManager.BLOCKED_METERED_REASON_MASK;
import static android.net.ConnectivityManager.BLOCKED_REASON_LOCKDOWN_VPN;
import static android.net.ConnectivityManager.BLOCKED_REASON_NONE;
+import static android.net.ConnectivityManager.CALLBACK_IP_CHANGED;
import static android.net.ConnectivityManager.CONNECTIVITY_ACTION;
import static android.net.ConnectivityManager.FIREWALL_RULE_ALLOW;
import static android.net.ConnectivityManager.FIREWALL_RULE_DEFAULT;
@@ -91,13 +93,14 @@
import static android.net.OemNetworkPreferences.OEM_NETWORK_PREFERENCE_TEST_ONLY;
import static android.os.Process.INVALID_UID;
import static android.os.Process.VPN_UID;
-import static android.provider.DeviceConfig.NAMESPACE_CONNECTIVITY;
+import static android.provider.DeviceConfig.NAMESPACE_TETHERING;
import static android.system.OsConstants.ETH_P_ALL;
import static android.system.OsConstants.IPPROTO_TCP;
import static android.system.OsConstants.IPPROTO_UDP;
import static com.android.net.module.util.DeviceConfigUtils.TETHERING_MODULE_NAME;
import static com.android.net.module.util.NetworkMonitorUtils.isPrivateDnsValidationRequired;
+import static com.android.net.module.util.PermissionUtils.checkAnyPermissionOf;
import static com.android.net.module.util.PermissionUtils.enforceAnyPermissionOf;
import static com.android.net.module.util.PermissionUtils.enforceNetworkStackPermission;
import static com.android.net.module.util.PermissionUtils.enforceNetworkStackPermissionOr;
@@ -107,8 +110,9 @@
import android.Manifest;
import android.annotation.NonNull;
import android.annotation.Nullable;
-import android.annotation.SuppressLint;
import android.annotation.TargetApi;
+import android.app.ActivityManager;
+import android.app.ActivityManager.UidFrozenStateChangedCallback;
import android.app.AppOpsManager;
import android.app.BroadcastOptions;
import android.app.PendingIntent;
@@ -133,7 +137,6 @@
import android.net.ConnectivityManager.BlockedReason;
import android.net.ConnectivityManager.NetworkCallback;
import android.net.ConnectivityManager.RestrictBackgroundStatus;
-import android.net.ConnectivityResources;
import android.net.ConnectivitySettingsManager;
import android.net.DataStallReportParcelable;
import android.net.DnsResolverServiceManager;
@@ -243,6 +246,7 @@
import android.util.LocalLog;
import android.util.Log;
import android.util.Pair;
+import android.util.Range;
import android.util.SparseArray;
import android.util.SparseIntArray;
@@ -279,11 +283,13 @@
import com.android.server.connectivity.CarrierPrivilegeAuthenticator;
import com.android.server.connectivity.ClatCoordinator;
import com.android.server.connectivity.ConnectivityFlags;
+import com.android.server.connectivity.ConnectivityResources;
import com.android.server.connectivity.DnsManager;
import com.android.server.connectivity.DnsManager.PrivateDnsValidationUpdate;
import com.android.server.connectivity.DscpPolicyTracker;
import com.android.server.connectivity.FullScore;
import com.android.server.connectivity.InvalidTagException;
+import com.android.server.connectivity.KeepaliveResourceUtil;
import com.android.server.connectivity.KeepaliveTracker;
import com.android.server.connectivity.LingerMonitor;
import com.android.server.connectivity.MockableSystemProperties;
@@ -309,11 +315,14 @@
import java.io.FileDescriptor;
import java.io.IOException;
+import java.io.InterruptedIOException;
import java.io.PrintWriter;
import java.io.Writer;
+import java.lang.IllegalArgumentException;
import java.net.Inet4Address;
import java.net.InetAddress;
import java.net.InetSocketAddress;
+import java.net.SocketException;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.Arrays;
@@ -381,7 +390,7 @@
// Timeout in case the "actively prefer bad wifi" feature is on
private static final int ACTIVELY_PREFER_BAD_WIFI_INITIAL_TIMEOUT_MS = 20 * 1000;
// Timeout in case the "actively prefer bad wifi" feature is off
- private static final int DONT_ACTIVELY_PREFER_BAD_WIFI_INITIAL_TIMEOUT_MS = 8 * 1000;
+ private static final int DEFAULT_EVALUATION_TIMEOUT_MS = 8 * 1000;
// Default to 30s linger time-out, and 5s for nascent network. Modifiable only for testing.
private static final String LINGER_DELAY_PROPERTY = "persist.netmon.linger";
@@ -434,6 +443,8 @@
private final Context mContext;
private final ConnectivityResources mResources;
+ private final int mWakeUpMark;
+ private final int mWakeUpMask;
// The Context is created for UserHandle.ALL.
private final Context mUserAllContext;
private final Dependencies mDeps;
@@ -463,7 +474,11 @@
private String mCurrentTcpBufferSizes;
private static final SparseArray<String> sMagicDecoderRing = MessageUtils.findMessageNames(
- new Class[] { ConnectivityService.class, NetworkAgent.class, NetworkAgentInfo.class });
+ new Class[] {
+ ConnectivityService.class,
+ NetworkAgent.class,
+ NetworkAgentInfo.class,
+ AutomaticOnOffKeepaliveTracker.class });
private enum ReapUnvalidatedNetworks {
// Tear down networks that have no chance (e.g. even if validated) of becoming
@@ -537,7 +552,7 @@
/**
* PAC manager has received new port.
*/
- private static final int EVENT_PROXY_HAS_CHANGED = 16;
+ private static final int EVENT_PAC_PROXY_HAS_CHANGED = 16;
/**
* used internally when registering NetworkProviders
@@ -778,6 +793,11 @@
private static final int EVENT_SET_LOW_TCP_POLLING_UNTIL = 60;
/**
+ * Event to inform the ConnectivityService handler when a uid has been frozen or unfrozen.
+ */
+ private static final int EVENT_UID_FROZEN_STATE_CHANGED = 61;
+
+ /**
* Argument for {@link #EVENT_PROVISIONING_NOTIFICATION} to indicate that the notification
* should be shown.
*/
@@ -845,8 +865,7 @@
// A helper object to track the current default HTTP proxy. ConnectivityService needs to tell
// the world when it changes.
- @VisibleForTesting
- protected final ProxyTracker mProxyTracker;
+ private final ProxyTracker mProxyTracker;
final private SettingsObserver mSettingsObserver;
@@ -911,7 +930,7 @@
// This is the cache for the packageName -> ApplicationSelfCertifiedNetworkCapabilities. This
// value can be accessed from both handler thread and any random binder thread. Therefore,
- // accessing this value requires holding a lock.
+ // accessing this value requires holding a lock. The cache is the same across all the users.
@GuardedBy("mSelfCertifiedCapabilityCache")
private final Map<String, ApplicationSelfCertifiedNetworkCapabilities>
mSelfCertifiedCapabilityCache = new HashMap<>();
@@ -1262,6 +1281,18 @@
return Binder.getCallingUid();
}
+ public boolean isAtLeastS() {
+ return SdkLevel.isAtLeastS();
+ }
+
+ public boolean isAtLeastT() {
+ return SdkLevel.isAtLeastT();
+ }
+
+ public boolean isAtLeastU() {
+ return SdkLevel.isAtLeastU();
+ }
+
/**
* Get system properties to use in ConnectivityService.
*/
@@ -1295,7 +1326,7 @@
*/
public ProxyTracker makeProxyTracker(@NonNull Context context,
@NonNull Handler connServiceHandler) {
- return new ProxyTracker(context, connServiceHandler, EVENT_PROXY_HAS_CHANGED);
+ return new ProxyTracker(context, connServiceHandler, EVENT_PAC_PROXY_HAS_CHANGED);
}
/**
@@ -1374,7 +1405,7 @@
@Nullable
public CarrierPrivilegeAuthenticator makeCarrierPrivilegeAuthenticator(
@NonNull final Context context, @NonNull final TelephonyManager tm) {
- if (SdkLevel.isAtLeastT()) {
+ if (isAtLeastT()) {
return new CarrierPrivilegeAuthenticator(context, tm);
} else {
return null;
@@ -1384,9 +1415,9 @@
/**
* @see DeviceConfigUtils#isFeatureEnabled
*/
- public boolean isFeatureEnabled(Context context, String name, boolean defaultEnabled) {
- return DeviceConfigUtils.isFeatureEnabled(context, NAMESPACE_CONNECTIVITY, name,
- TETHERING_MODULE_NAME, defaultEnabled);
+ public boolean isFeatureEnabled(Context context, String name) {
+ return DeviceConfigUtils.isFeatureEnabled(context, NAMESPACE_TETHERING, name,
+ TETHERING_MODULE_NAME, false /* defaultValue */);
}
/**
@@ -1401,6 +1432,7 @@
/**
* @see ClatCoordinator
*/
+ @RequiresApi(Build.VERSION_CODES.TIRAMISU)
public ClatCoordinator getClatCoordinator(INetd netd) {
return new ClatCoordinator(
new ClatCoordinator.Dependencies() {
@@ -1480,6 +1512,53 @@
@NonNull final UserHandle user) {
return CompatChanges.isChangeEnabled(changeId, packageName, user);
}
+
+ /**
+ * As above but with a UID.
+ * @see CompatChanges#isChangeEnabled(long, int)
+ */
+ public boolean isChangeEnabled(final long changeId, final int uid) {
+ return CompatChanges.isChangeEnabled(changeId, uid);
+ }
+
+ /**
+ * Call {@link InetDiagMessage#destroyLiveTcpSockets(Set, Set)}
+ *
+ * @param ranges target uid ranges
+ * @param exemptUids uids to skip close socket
+ */
+ public void destroyLiveTcpSockets(@NonNull final Set<Range<Integer>> ranges,
+ @NonNull final Set<Integer> exemptUids)
+ throws SocketException, InterruptedIOException, ErrnoException {
+ InetDiagMessage.destroyLiveTcpSockets(ranges, exemptUids);
+ }
+
+ /**
+ * Call {@link InetDiagMessage#destroyLiveTcpSocketsByOwnerUids(Set)}
+ *
+ * @param ownerUids target uids to close sockets
+ */
+ public void destroyLiveTcpSocketsByOwnerUids(final Set<Integer> ownerUids)
+ throws SocketException, InterruptedIOException, ErrnoException {
+ InetDiagMessage.destroyLiveTcpSocketsByOwnerUids(ownerUids);
+ }
+
+ /**
+ * Schedule the evaluation timeout.
+ *
+ * When a network connects, it's "not evaluated" yet. Detection events cause the network
+ * to be "evaluated" (typically, validation or detection of a captive portal). If none
+ * of these events happen, this time will run out, after which the network is considered
+ * "evaluated" even if nothing happened to it. Notionally that means the system gave up
+ * on this network and considers it won't provide connectivity. In particular, that means
+ * it's when the system prefers it to cell if it's wifi and configuration says it should
+ * prefer bad wifi to cell.
+ */
+ public void scheduleEvaluationTimeout(@NonNull Handler handler,
+ @NonNull final Network network, final long delayMs) {
+ handler.sendMessageDelayed(
+ handler.obtainMessage(EVENT_INITIAL_EVALUATION_TIMEOUT, network), delayMs);
+ }
}
public ConnectivityService(Context context) {
@@ -1536,6 +1615,29 @@
mCellularRadioTimesharingCapable =
mResources.get().getBoolean(R.bool.config_cellular_radio_timesharing_capable);
+ int mark = mResources.get().getInteger(R.integer.config_networkWakeupPacketMark);
+ int mask = mResources.get().getInteger(R.integer.config_networkWakeupPacketMask);
+
+ if (SdkLevel.isAtLeastU()) {
+ // U+ default value of both mark & mask, this is the top bit of the skb->mark,
+ // see //system/netd/include/FwMark.h union Fwmark, field ingress_cpu_wakeup
+ final int defaultUMarkMask = 0x80000000; // u32
+
+ if ((mark == 0) || (mask == 0)) {
+ // simply treat unset/disabled as the default U value
+ mark = defaultUMarkMask;
+ mask = defaultUMarkMask;
+ }
+ if ((mark != defaultUMarkMask) || (mask != defaultUMarkMask)) {
+ // invalid device overlay settings
+ throw new IllegalArgumentException(
+ "Bad config_networkWakeupPacketMark/Mask " + mark + "/" + mask);
+ }
+ }
+
+ mWakeUpMark = mark;
+ mWakeUpMask = mask;
+
mNetd = netd;
mBpfNetMaps = mDeps.getBpfNetMaps(mContext, netd);
mHandlerThread = mDeps.makeHandlerThread();
@@ -1602,7 +1704,8 @@
mUserAllContext.registerReceiver(mPackageIntentReceiver, packageIntentFilter,
null /* broadcastPermission */, mHandler);
- mNetworkActivityTracker = new LegacyNetworkActivityTracker(mContext, mHandler, mNetd);
+ mNetworkActivityTracker =
+ new LegacyNetworkActivityTracker(mContext, mNetd, mHandler, mDeps.isAtLeastU());
final NetdCallback netdCallback = new NetdCallback();
try {
@@ -1655,7 +1758,7 @@
// Even if it could, running on S would at least require mocking out the BPF map,
// otherwise the unit tests will fail on pre-T devices where the seccomp filter blocks
// the bpf syscall. http://aosp/1907693
- if (SdkLevel.isAtLeastT()) {
+ if (mDeps.isAtLeastT()) {
mDscpPolicyTracker = new DscpPolicyTracker();
}
} catch (ErrnoException e) {
@@ -1665,11 +1768,37 @@
mIngressRateLimit = ConnectivitySettingsManager.getIngressRateLimitInBytesPerSecond(
mContext);
- if (SdkLevel.isAtLeastT()) {
+ if (mDeps.isAtLeastT()) {
mCdmps = new CompanionDeviceManagerProxyService(context);
} else {
mCdmps = null;
}
+
+ if (mDeps.isAtLeastU()
+ && mDeps.isFeatureEnabled(context, KEY_DESTROY_FROZEN_SOCKETS_VERSION)) {
+ final UidFrozenStateChangedCallback frozenStateChangedCallback =
+ new UidFrozenStateChangedCallback() {
+ @Override
+ public void onUidFrozenStateChanged(int[] uids, int[] frozenStates) {
+ if (uids.length != frozenStates.length) {
+ Log.wtf(TAG, "uids has length " + uids.length
+ + " but frozenStates has length " + frozenStates.length);
+ return;
+ }
+
+ final UidFrozenStateChangedArgs args =
+ new UidFrozenStateChangedArgs(uids, frozenStates);
+
+ mHandler.sendMessage(
+ mHandler.obtainMessage(EVENT_UID_FROZEN_STATE_CHANGED, args));
+ }
+ };
+
+ final ActivityManager activityManager =
+ mContext.getSystemService(ActivityManager.class);
+ activityManager.registerUidFrozenStateChangedCallback(
+ (Runnable r) -> r.run(), frozenStateChangedCallback);
+ }
}
/**
@@ -1765,6 +1894,13 @@
mHandler.sendEmptyMessage(EVENT_INGRESS_RATE_LIMIT_CHANGED);
}
+ @VisibleForTesting
+ void simulateUpdateProxyInfo(@Nullable final Network network,
+ @NonNull final ProxyInfo proxyInfo) {
+ Message.obtain(mHandler, EVENT_PAC_PROXY_HAS_CHANGED,
+ new Pair<>(network, proxyInfo)).sendToTarget();
+ }
+
private void handleAlwaysOnNetworkRequest(
NetworkRequest networkRequest, String settingName, boolean defaultValue) {
final boolean enable = toBool(Settings.Global.getInt(
@@ -2324,11 +2460,12 @@
if (newNc.getNetworkSpecifier() != null) {
newNc.setNetworkSpecifier(newNc.getNetworkSpecifier().redact());
}
- if (!checkAnyPermissionOf(callerPid, callerUid, android.Manifest.permission.NETWORK_STACK,
+ if (!checkAnyPermissionOf(mContext, callerPid, callerUid,
+ android.Manifest.permission.NETWORK_STACK,
NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK)) {
newNc.setAdministratorUids(new int[0]);
}
- if (!checkAnyPermissionOf(
+ if (!checkAnyPermissionOf(mContext,
callerPid, callerUid, android.Manifest.permission.NETWORK_FACTORY)) {
newNc.setAllowedUids(new ArraySet<>());
newNc.setSubscriptionIds(Collections.emptySet());
@@ -2597,7 +2734,8 @@
final ArrayList<NetworkStateSnapshot> result = new ArrayList<>();
for (Network network : getAllNetworks()) {
final NetworkAgentInfo nai = getNetworkAgentInfoForNetwork(network);
- if (nai != null && nai.everConnected()) {
+ final boolean includeNetwork = (nai != null) && nai.isCreated();
+ if (includeNetwork) {
// TODO (b/73321673) : NetworkStateSnapshot contains a copy of the
// NetworkCapabilities, which may contain UIDs of apps to which the
// network applies. Should the UIDs be cleared so as not to leak or
@@ -2837,15 +2975,39 @@
setUidBlockedReasons(uid, blockedReasons);
}
- private boolean checkAnyPermissionOf(int pid, int uid, String... permissions) {
- for (String permission : permissions) {
- if (mContext.checkPermission(permission, pid, uid) == PERMISSION_GRANTED) {
- return true;
+ static final class UidFrozenStateChangedArgs {
+ final int[] mUids;
+ final int[] mFrozenStates;
+
+ UidFrozenStateChangedArgs(int[] uids, int[] frozenStates) {
+ mUids = uids;
+ mFrozenStates = frozenStates;
+ }
+ }
+
+ private void handleFrozenUids(int[] uids, int[] frozenStates) {
+ final ArraySet<Range<Integer>> ranges = new ArraySet<>();
+
+ for (int i = 0; i < uids.length; i++) {
+ if (frozenStates[i] == UID_FROZEN_STATE_FROZEN) {
+ Integer uidAsInteger = Integer.valueOf(uids[i]);
+ ranges.add(new Range(uidAsInteger, uidAsInteger));
}
}
- return false;
+
+ if (!ranges.isEmpty()) {
+ final Set<Integer> exemptUids = new ArraySet<>();
+ try {
+ mDeps.destroyLiveTcpSockets(ranges, exemptUids);
+ } catch (Exception e) {
+ loge("Exception in socket destroy: " + e);
+ }
+ }
}
+ @VisibleForTesting
+ static final String KEY_DESTROY_FROZEN_SOCKETS_VERSION = "destroy_frozen_sockets_version";
+
private void enforceInternetPermission() {
mContext.enforceCallingOrSelfPermission(
android.Manifest.permission.INTERNET,
@@ -3004,13 +3166,13 @@
}
private boolean checkNetworkStackPermission(int pid, int uid) {
- return checkAnyPermissionOf(pid, uid,
+ return checkAnyPermissionOf(mContext, pid, uid,
android.Manifest.permission.NETWORK_STACK,
NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK);
}
private boolean checkNetworkSignalStrengthWakeupPermission(int pid, int uid) {
- return checkAnyPermissionOf(pid, uid,
+ return checkAnyPermissionOf(mContext, pid, uid,
android.Manifest.permission.NETWORK_SIGNAL_STRENGTH_WAKEUP,
NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK,
android.Manifest.permission.NETWORK_SETTINGS);
@@ -3087,8 +3249,6 @@
sendStickyBroadcast(makeGeneralIntent(info, bcastType));
}
- // TODO(b/193460475): Remove when tooling supports SystemApi to public API.
- @SuppressLint("NewApi")
// TODO: Set the mini sdk to 31 and remove @TargetApi annotation when b/205923322 is addressed.
@TargetApi(Build.VERSION_CODES.S)
private void sendStickyBroadcast(Intent intent) {
@@ -3124,7 +3284,7 @@
private void applyMostRecentPolicyForConnectivityAction(BroadcastOptions options,
NetworkInfo info) {
// Delivery group policy APIs are only available on U+.
- if (!SdkLevel.isAtLeastU()) return;
+ if (!mDeps.isAtLeastU()) return;
final BroadcastOptionsShim optsShim = mDeps.makeBroadcastOptionsShim(options);
try {
@@ -3133,7 +3293,7 @@
optsShim.setDeliveryGroupPolicy(ConstantsShim.DELIVERY_GROUP_POLICY_MOST_RECENT);
optsShim.setDeliveryGroupMatchingKey(ConnectivityManager.CONNECTIVITY_ACTION,
createDeliveryGroupKeyForConnectivityAction(info));
- optsShim.setDeferUntilActive(true);
+ optsShim.setDeferralPolicy(ConstantsShim.DEFERRAL_POLICY_UNTIL_ACTIVE);
} catch (UnsupportedApiLevelException e) {
Log.wtf(TAG, "Using unsupported API" + e);
}
@@ -3202,7 +3362,7 @@
}
// On T+ devices, register callback for statsd to pull NETWORK_BPF_MAP_INFO atom
- if (SdkLevel.isAtLeastT()) {
+ if (mDeps.isAtLeastT()) {
mBpfNetMaps.setPullAtomCallback(mContext);
}
// Wait PermissionMonitor to finish the permission update. Then MultipathPolicyTracker won't
@@ -3799,9 +3959,9 @@
break;
}
case NetworkAgent.EVENT_UNREGISTER_AFTER_REPLACEMENT: {
- if (!nai.isCreated()) {
- Log.d(TAG, "unregisterAfterReplacement on uncreated " + nai.toShortString()
- + ", tearing down instead");
+ if (!nai.everConnected()) {
+ Log.d(TAG, "unregisterAfterReplacement on never-connected "
+ + nai.toShortString() + ", tearing down instead");
teardownUnneededNetwork(nai);
break;
}
@@ -4386,6 +4546,29 @@
}
}
+ @VisibleForTesting
+ protected static boolean shouldCreateNetworksImmediately() {
+ // The feature of creating the networks immediately was slated for U, but race conditions
+ // detected late required this was flagged off.
+ // TODO : enable this in a Mainline update or in V, and re-enable the test for this
+ // in NetworkAgentTest.
+ return false;
+ }
+
+ private static boolean shouldCreateNativeNetwork(@NonNull NetworkAgentInfo nai,
+ @NonNull NetworkInfo.State state) {
+ if (nai.isCreated()) return false;
+ if (state == NetworkInfo.State.CONNECTED) return true;
+ if (state != NetworkInfo.State.CONNECTING) {
+ // TODO: throw if no WTFs are observed in the field.
+ if (shouldCreateNetworksImmediately()) {
+ Log.wtf(TAG, "Uncreated network in invalid state: " + state);
+ }
+ return false;
+ }
+ return nai.isVPN() || shouldCreateNetworksImmediately();
+ }
+
private static boolean shouldDestroyNativeNetwork(@NonNull NetworkAgentInfo nai) {
return nai.isCreated() && !nai.isDestroyed();
}
@@ -4393,7 +4576,7 @@
@VisibleForTesting
boolean shouldIgnoreValidationFailureAfterRoam(NetworkAgentInfo nai) {
// T+ devices should use unregisterAfterReplacement.
- if (SdkLevel.isAtLeastT()) return false;
+ if (mDeps.isAtLeastT()) return false;
// If the network never roamed, return false. The check below is not sufficient if time
// since boot is less than blockTimeOut, though that's extremely unlikely to happen.
@@ -4436,7 +4619,7 @@
// 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);
}
@@ -4504,6 +4687,21 @@
rematchAllNetworksAndRequests();
mLingerMonitor.noteDisconnect(nai);
+ if (null == getDefaultNetwork() && nai.linkProperties.getHttpProxy() != null) {
+ // The obvious place to do this would be in makeDefault(), however makeDefault() is
+ // not called by the rematch in this case. This is because the code above unset
+ // this network from the default request's satisfier, and that is what the rematch
+ // is using as its source data to know what the old satisfier was. So as far as the
+ // rematch above is concerned, the old default network was null.
+ // Therefore if there is no new default, the default network was null and is still
+ // null, thus there was no change so makeDefault() is not called. So if the old
+ // network had a proxy and there is no new default, the proxy tracker should be told
+ // that there is no longer a default proxy.
+ // Strictly speaking this is not essential because having a proxy setting when
+ // there is no network is harmless, but it's still counter-intuitive so reset to null.
+ mProxyTracker.setDefaultProxy(null);
+ }
+
// Immediate teardown.
if (nai.teardownDelayMs == 0) {
destroyNetwork(nai);
@@ -4532,7 +4730,7 @@
// for an unnecessarily long time.
destroyNativeNetwork(nai);
}
- if (!nai.isCreated() && !SdkLevel.isAtLeastT()) {
+ if (!nai.isCreated() && !mDeps.isAtLeastT()) {
// Backwards compatibility: send onNetworkDestroyed even if network was never created.
// This can never run if the code above runs because shouldDestroyNativeNetwork is
// false if the network was never created.
@@ -4616,7 +4814,7 @@
}
private void checkNrisConsistency(final NetworkRequestInfo nri) {
- if (SdkLevel.isAtLeastT()) {
+ if (mDeps.isAtLeastT()) {
for (final NetworkRequestInfo n : mNetworkRequests.values()) {
if (n.mBinder != null && n.mBinder == nri.mBinder) {
// Temporary help to debug b/194394697 ; TODO : remove this function when the
@@ -5008,7 +5206,7 @@
}
private RequestInfoPerUidCounter getRequestCounter(NetworkRequestInfo nri) {
- return checkAnyPermissionOf(
+ return checkAnyPermissionOf(mContext,
nri.mPid, nri.mUid, NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK)
? mSystemNetworkRequestCounter : mNetworkRequestCounter;
}
@@ -5163,8 +5361,7 @@
/** Schedule evaluation timeout */
@VisibleForTesting
public void scheduleEvaluationTimeout(@NonNull final Network network, final long delayMs) {
- mHandler.sendMessageDelayed(
- mHandler.obtainMessage(EVENT_INITIAL_EVALUATION_TIMEOUT, network), delayMs);
+ mDeps.scheduleEvaluationTimeout(mHandler, network, delayMs);
}
@Override
@@ -5527,9 +5724,9 @@
mProxyTracker.loadDeprecatedGlobalHttpProxy();
break;
}
- case EVENT_PROXY_HAS_CHANGED: {
+ case EVENT_PAC_PROXY_HAS_CHANGED: {
final Pair<Network, ProxyInfo> arg = (Pair<Network, ProxyInfo>) msg.obj;
- handleApplyDefaultProxy(arg.second);
+ handlePacProxyServiceStarted(arg.first, arg.second);
break;
}
case EVENT_REGISTER_NETWORK_PROVIDER: {
@@ -5605,12 +5802,13 @@
handleConfigureAlwaysOnNetworks();
break;
}
- // Sent by KeepaliveTracker to process an app request on the state machine thread.
- case NetworkAgent.CMD_START_SOCKET_KEEPALIVE: {
+ // Sent by AutomaticOnOffKeepaliveTracker to process an app request on the
+ // handler thread.
+ case AutomaticOnOffKeepaliveTracker.CMD_REQUEST_START_KEEPALIVE: {
mKeepaliveTracker.handleStartKeepalive(msg);
break;
}
- case NetworkAgent.CMD_MONITOR_AUTOMATIC_KEEPALIVE: {
+ case AutomaticOnOffKeepaliveTracker.CMD_MONITOR_AUTOMATIC_KEEPALIVE: {
final AutomaticOnOffKeepalive ki =
mKeepaliveTracker.getKeepaliveForBinder((IBinder) msg.obj);
if (null == ki) return; // The callback was unregistered before the alarm fired
@@ -5682,7 +5880,8 @@
break;
}
case EVENT_REPORT_NETWORK_ACTIVITY:
- mNetworkActivityTracker.handleReportNetworkActivity();
+ final NetworkActivityParams arg = (NetworkActivityParams) msg.obj;
+ mNetworkActivityTracker.handleReportNetworkActivity(arg);
break;
case EVENT_MOBILE_DATA_PREFERRED_UIDS_CHANGED:
handleMobileDataPreferredUidsChanged();
@@ -5708,6 +5907,10 @@
mKeepaliveTracker.handleSetTestLowTcpPollingTimer(time);
break;
}
+ case EVENT_UID_FROZEN_STATE_CHANGED:
+ UidFrozenStateChangedArgs args = (UidFrozenStateChangedArgs) msg.obj;
+ handleFrozenUids(args.mUids, args.mFrozenStates);
+ break;
}
}
}
@@ -5979,12 +6182,19 @@
return mProxyTracker.getGlobalProxy();
}
- private void handleApplyDefaultProxy(@Nullable ProxyInfo proxy) {
- if (proxy != null && TextUtils.isEmpty(proxy.getHost())
- && Uri.EMPTY.equals(proxy.getPacFileUrl())) {
- proxy = null;
- }
+ private void handlePacProxyServiceStarted(@Nullable Network net, @Nullable ProxyInfo proxy) {
mProxyTracker.setDefaultProxy(proxy);
+ final NetworkAgentInfo nai = getDefaultNetwork();
+ // TODO : this method should check that net == nai.network, unfortunately at this point
+ // 'net' is always null in practice (see PacProxyService#sendPacBroadcast). PAC proxy
+ // is only ever installed on the default network so in practice this is okay.
+ if (null == nai) return;
+ // PAC proxies only work on the default network. Therefore, only the default network
+ // should have its link properties fixed up for PAC proxies.
+ mProxyTracker.updateDefaultNetworkProxyPortForPAC(nai.linkProperties, nai.network);
+ if (nai.everConnected()) {
+ notifyNetworkCallbacks(nai, ConnectivityManager.CALLBACK_IP_CHANGED);
+ }
}
// If the proxy has changed from oldLp to newLp, resend proxy broadcast. This method gets called
@@ -6202,7 +6412,7 @@
+ Arrays.toString(ranges) + "): netd command failed: " + e);
}
- if (SdkLevel.isAtLeastT()) {
+ if (mDeps.isAtLeastT()) {
mPermissionMonitor.updateVpnLockdownUidRanges(requireVpn, ranges);
}
@@ -6996,11 +7206,12 @@
@NonNull final NetworkCapabilities networkCapabilities) {
// This check is added to fix the linter error for "current min is 30", which is not going
// to happen because Connectivity service always run in S+.
- if (!SdkLevel.isAtLeastS()) {
+ if (!mDeps.isAtLeastS()) {
Log.wtf(TAG, "Connectivity service should always run in at least SDK S");
return;
}
ApplicationSelfCertifiedNetworkCapabilities applicationNetworkCapabilities;
+ final long ident = Binder.clearCallingIdentity();
try {
synchronized (mSelfCertifiedCapabilityCache) {
applicationNetworkCapabilities = mSelfCertifiedCapabilityCache.get(
@@ -7027,6 +7238,8 @@
+ " property");
} catch (XmlPullParserException | IOException | InvalidTagException e) {
throw new SecurityException(e.getMessage());
+ } finally {
+ Binder.restoreCallingIdentity(ident);
}
applicationNetworkCapabilities.enforceSelfCertifiedNetworkCapabilitiesDeclared(
@@ -7807,6 +8020,7 @@
// updateMtu(lp, null);
// }
if (isDefaultNetwork(networkAgent)) {
+ mProxyTracker.updateDefaultNetworkProxyPortForPAC(newLp, null);
updateTcpBufferSizes(newLp.getTcpBufferSizes());
}
@@ -7819,8 +8033,8 @@
mDnsManager.updatePrivateDnsStatus(netId, newLp);
if (isDefaultNetwork(networkAgent)) {
- handleApplyDefaultProxy(newLp.getHttpProxy());
- } else {
+ mProxyTracker.setDefaultProxy(newLp.getHttpProxy());
+ } else if (networkAgent.everConnected()) {
updateProxy(newLp, oldLp);
}
@@ -7854,6 +8068,10 @@
mKeepaliveTracker.handleCheckKeepalivesStillValid(networkAgent);
}
+ private void applyInitialLinkProperties(@NonNull NetworkAgentInfo nai) {
+ updateLinkProperties(nai, new LinkProperties(nai.linkProperties), null);
+ }
+
/**
* @param naData captive portal data from NetworkAgent
* @param apiData captive portal data from capport API
@@ -7903,34 +8121,42 @@
return captivePortalBuilder.build();
}
- private String makeNflogPrefix(String iface, long networkHandle) {
+ @VisibleForTesting
+ static String makeNflogPrefix(String iface, long networkHandle) {
// This needs to be kept in sync and backwards compatible with the decoding logic in
// NetdEventListenerService, which is non-mainline code.
return SdkLevel.isAtLeastU() ? (networkHandle + ":" + iface) : ("iface:" + iface);
}
+ private static boolean isWakeupMarkingSupported(NetworkCapabilities capabilities) {
+ if (capabilities.hasTransport(TRANSPORT_WIFI)) {
+ return true;
+ }
+ if (SdkLevel.isAtLeastU() && capabilities.hasTransport(TRANSPORT_CELLULAR)) {
+ return true;
+ }
+ return false;
+ }
+
private void wakeupModifyInterface(String iface, NetworkAgentInfo nai, boolean add) {
// Marks are only available on WiFi interfaces. Checking for
// marks on unsupported interfaces is harmless.
- if (!nai.networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)) {
+ if (!isWakeupMarkingSupported(nai.networkCapabilities)) {
return;
}
- int mark = mResources.get().getInteger(R.integer.config_networkWakeupPacketMark);
- int mask = mResources.get().getInteger(R.integer.config_networkWakeupPacketMask);
-
// Mask/mark of zero will not detect anything interesting.
// Don't install rules unless both values are nonzero.
- if (mark == 0 || mask == 0) {
+ if (mWakeUpMark == 0 || mWakeUpMask == 0) {
return;
}
final String prefix = makeNflogPrefix(iface, nai.network.getNetworkHandle());
try {
if (add) {
- mNetd.wakeupAddInterface(iface, prefix, mark, mask);
+ mNetd.wakeupAddInterface(iface, prefix, mWakeUpMark, mWakeUpMask);
} else {
- mNetd.wakeupDelInterface(iface, prefix, mark, mask);
+ mNetd.wakeupDelInterface(iface, prefix, mWakeUpMark, mWakeUpMask);
}
} catch (Exception e) {
loge("Exception modifying wakeup packet monitoring: " + e);
@@ -8415,7 +8641,7 @@
// On T and above, allow rules are needed for all VPNs. Allow rule with null iface is a
// wildcard to allow apps to receive packets on all interfaces. This is required to accept
// incoming traffic in Lockdown mode by overriding the Lockdown blocking rule.
- return SdkLevel.isAtLeastT() && nai.isVPN() && lp != null && lp.getInterfaceName() != null;
+ return mDeps.isAtLeastT() && nai.isVPN() && lp != null && lp.getInterfaceName() != null;
}
private static UidRangeParcel[] toUidRangeStableParcels(final @NonNull Set<UidRange> ranges) {
@@ -8447,11 +8673,19 @@
return stableRanges;
}
- private void maybeCloseSockets(NetworkAgentInfo nai, UidRangeParcel[] ranges,
- int[] exemptUids) {
+ private void maybeCloseSockets(NetworkAgentInfo nai, Set<UidRange> ranges,
+ UidRangeParcel[] uidRangeParcels, int[] exemptUids) {
if (nai.isVPN() && !nai.networkAgentConfig.allowBypass) {
try {
- mNetd.socketDestroy(ranges, exemptUids);
+ if (mDeps.isAtLeastU()) {
+ final Set<Integer> exemptUidSet = new ArraySet<>();
+ for (final int uid: exemptUids) {
+ exemptUidSet.add(uid);
+ }
+ mDeps.destroyLiveTcpSockets(UidRange.toIntRanges(ranges), exemptUidSet);
+ } else {
+ mNetd.socketDestroy(uidRangeParcels, exemptUids);
+ }
} catch (Exception e) {
loge("Exception in socket destroy: ", e);
}
@@ -8467,7 +8701,8 @@
exemptUids[1] = nai.networkCapabilities.getOwnerUid();
UidRangeParcel[] ranges = toUidRangeStableParcels(uidRanges);
- maybeCloseSockets(nai, ranges, exemptUids);
+ // Close sockets before modifying uid ranges so that RST packets can reach to the server.
+ maybeCloseSockets(nai, uidRanges, ranges, exemptUids);
try {
if (add) {
mNetd.networkAddUidRangesParcel(new NativeUidRangeConfig(
@@ -8480,7 +8715,8 @@
loge("Exception while " + (add ? "adding" : "removing") + " uid ranges " + uidRanges +
" on netId " + nai.network.netId + ". " + e);
}
- maybeCloseSockets(nai, ranges, exemptUids);
+ // Close sockets that established connection while requesting netd.
+ maybeCloseSockets(nai, uidRanges, ranges, exemptUids);
}
private boolean isProxySetOnAnyDefaultNetwork() {
@@ -8656,21 +8892,19 @@
// else not handled
}
- // TODO(b/193460475): Remove when tooling supports SystemApi to public API.
- @SuppressLint("NewApi")
private void sendIntent(PendingIntent pendingIntent, Intent intent) {
mPendingIntentWakeLock.acquire();
try {
if (DBG) log("Sending " + pendingIntent);
final BroadcastOptions options = BroadcastOptions.makeBasic();
- if (SdkLevel.isAtLeastT()) {
+ if (mDeps.isAtLeastT()) {
// Explicitly disallow the receiver from starting activities, to prevent apps from
// utilizing the PendingIntent as a backdoor to do this.
options.setPendingIntentBackgroundActivityLaunchAllowed(false);
}
pendingIntent.send(mContext, 0, intent, this /* onFinished */, null /* Handler */,
null /* requiredPermission */,
- SdkLevel.isAtLeastT() ? options.toBundle() : null);
+ mDeps.isAtLeastT() ? options.toBundle() : null);
} catch (PendingIntent.CanceledException e) {
if (DBG) log(pendingIntent + " was not sent, it had been canceled.");
mPendingIntentWakeLock.release();
@@ -8851,6 +9085,17 @@
}
}
+ private void resetHttpProxyForNonDefaultNetwork(NetworkAgentInfo oldDefaultNetwork) {
+ if (null == oldDefaultNetwork) return;
+ // The network stopped being the default. If it was using a PAC proxy, then the
+ // proxy needs to be reset, otherwise HTTP requests on this network may be sent
+ // to the local proxy server, which would forward them over the newly default network.
+ final ProxyInfo proxyInfo = oldDefaultNetwork.linkProperties.getHttpProxy();
+ if (null == proxyInfo || !proxyInfo.isPacProxy()) return;
+ oldDefaultNetwork.linkProperties.setHttpProxy(new ProxyInfo(proxyInfo.getPacFileUrl()));
+ notifyNetworkCallbacks(oldDefaultNetwork, CALLBACK_IP_CHANGED);
+ }
+
private void makeDefault(@NonNull final NetworkRequestInfo nri,
@Nullable final NetworkAgentInfo oldDefaultNetwork,
@Nullable final NetworkAgentInfo newDefaultNetwork) {
@@ -8876,8 +9121,9 @@
mLingerMonitor.noteLingerDefaultNetwork(oldDefaultNetwork, newDefaultNetwork);
}
mNetworkActivityTracker.updateDataActivityTracking(newDefaultNetwork, oldDefaultNetwork);
- handleApplyDefaultProxy(null != newDefaultNetwork
+ mProxyTracker.setDefaultProxy(null != newDefaultNetwork
? newDefaultNetwork.linkProperties.getHttpProxy() : null);
+ resetHttpProxyForNonDefaultNetwork(oldDefaultNetwork);
updateTcpBufferSizes(null != newDefaultNetwork
? newDefaultNetwork.linkProperties.getTcpBufferSizes() : null);
notifyIfacesChangedForNetworkStats();
@@ -8949,7 +9195,7 @@
private void updateProfileAllowedNetworks() {
// Netd command is not implemented before U.
- if (!SdkLevel.isAtLeastU()) return;
+ if (!mDeps.isAtLeastU()) return;
ensureRunningOnConnectivityServiceThread();
final ArrayList<NativeUidRangeConfig> configs = new ArrayList<>();
@@ -9603,21 +9849,32 @@
+ oldInfo.getState() + " to " + state);
}
- if (!networkAgent.isCreated()
- && (state == NetworkInfo.State.CONNECTED
- || (state == NetworkInfo.State.CONNECTING && networkAgent.isVPN()))) {
-
+ if (shouldCreateNativeNetwork(networkAgent, state)) {
// A network that has just connected has zero requests and is thus a foreground network.
networkAgent.networkCapabilities.addCapability(NET_CAPABILITY_FOREGROUND);
if (!createNativeNetwork(networkAgent)) return;
+
+ networkAgent.setCreated();
+
+ // If the network is created immediately on register, then apply the LinkProperties now.
+ // Otherwise, this is done further down when the network goes into connected state.
+ // Applying the LinkProperties means that the network is ready to carry traffic -
+ // interfaces and routing rules have been added, DNS servers programmed, etc.
+ // For VPNs, this must be done before the capabilities are updated, because as soon as
+ // that happens, UIDs are routed to the network.
+ if (shouldCreateNetworksImmediately()) {
+ applyInitialLinkProperties(networkAgent);
+ }
+
+ // TODO: should this move earlier? It doesn't seem to have anything to do with whether
+ // a network is created or not.
if (networkAgent.propagateUnderlyingCapabilities()) {
// Initialize the network's capabilities to their starting values according to the
// underlying networks. This ensures that the capabilities are correct before
// anything happens to the network.
updateCapabilitiesForNetwork(networkAgent);
}
- networkAgent.setCreated();
networkAgent.onNetworkCreated();
updateAllowedUids(networkAgent, null, networkAgent.networkCapabilities);
updateProfileAllowedNetworks();
@@ -9631,8 +9888,19 @@
networkAgent.getAndSetNetworkCapabilities(networkAgent.networkCapabilities);
handlePerNetworkPrivateDnsConfig(networkAgent, mDnsManager.getPrivateDnsConfig());
- updateLinkProperties(networkAgent, new LinkProperties(networkAgent.linkProperties),
- null);
+ if (!shouldCreateNetworksImmediately()) {
+ applyInitialLinkProperties(networkAgent);
+ } else {
+ // The network was created when the agent registered, and the LinkProperties are
+ // already up-to-date. However, updateLinkProperties also makes some changes only
+ // when the network connects. Apply those changes here. On T and below these are
+ // handled by the applyInitialLinkProperties call just above.
+ // TODO: stop relying on updateLinkProperties(..., null) to do this.
+ // If something depends on both LinkProperties and connected state, it should be in
+ // this method as well.
+ networkAgent.clatd.update();
+ updateProxy(networkAgent.linkProperties, null);
+ }
// If a rate limit has been configured and is applicable to this network (network
// provides internet connectivity), apply it. The tc police filter cannot be attached
@@ -9663,16 +9931,31 @@
// in the absence of a satisfactory, scalable solution which follows an easy/standard
// process to check the interface version, just use an SDK check. NetworkStack will
// always be new enough when running on T+.
- if (SdkLevel.isAtLeastT()) {
+ if (mDeps.isAtLeastT()) {
networkAgent.networkMonitor().notifyNetworkConnected(params);
} else {
networkAgent.networkMonitor().notifyNetworkConnected(params.linkProperties,
params.networkCapabilities);
}
- final long delay = activelyPreferBadWifi()
- ? ACTIVELY_PREFER_BAD_WIFI_INITIAL_TIMEOUT_MS
- : DONT_ACTIVELY_PREFER_BAD_WIFI_INITIAL_TIMEOUT_MS;
- scheduleEvaluationTimeout(networkAgent.network, delay);
+ final long evaluationDelay;
+ if (!networkAgent.networkCapabilities.hasSingleTransport(TRANSPORT_WIFI)) {
+ // If the network is anything other than pure wifi, use the default timeout.
+ evaluationDelay = DEFAULT_EVALUATION_TIMEOUT_MS;
+ } else if (networkAgent.networkAgentConfig.isExplicitlySelected()) {
+ // If the network is explicitly selected, use the default timeout because it's
+ // shorter and the user is likely staring at the screen expecting it to validate
+ // right away.
+ evaluationDelay = DEFAULT_EVALUATION_TIMEOUT_MS;
+ } else if (avoidBadWifi() || !activelyPreferBadWifi()) {
+ // If avoiding bad wifi, or if not avoiding but also not preferring bad wifi
+ evaluationDelay = DEFAULT_EVALUATION_TIMEOUT_MS;
+ } else {
+ // It's wifi, automatically connected, and bad wifi is preferred : use the
+ // longer timeout to avoid the device switching to captive portals with bad
+ // signal or very slow response.
+ evaluationDelay = ACTIVELY_PREFER_BAD_WIFI_INITIAL_TIMEOUT_MS;
+ }
+ scheduleEvaluationTimeout(networkAgent.network, evaluationDelay);
// Whether a particular NetworkRequest listen should cause signal strength thresholds to
// be communicated to a particular NetworkAgent depends only on the network's immutable,
@@ -10018,6 +10301,16 @@
}
@Override
+ public int[] getSupportedKeepalives() {
+ enforceAnyPermissionOf(mContext, android.Manifest.permission.NETWORK_SETTINGS,
+ // Backwards compatibility with CTS 13
+ android.Manifest.permission.QUERY_ALL_PACKAGES);
+
+ return BinderUtils.withCleanCallingIdentity(() ->
+ KeepaliveResourceUtil.getSupportedKeepalives(mContext));
+ }
+
+ @Override
public void factoryReset() {
enforceSettingsPermission();
@@ -10729,6 +11022,18 @@
callback));
}
+ private boolean hasUnderlyingTestNetworks(NetworkCapabilities nc) {
+ final List<Network> underlyingNetworks = nc.getUnderlyingNetworks();
+ if (underlyingNetworks == null) return false;
+
+ for (Network network : underlyingNetworks) {
+ if (getNetworkCapabilitiesInternal(network).hasTransport(TRANSPORT_TEST)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
@Override
public void simulateDataStall(int detectionMethod, long timestampMillis,
@NonNull Network network, @NonNull PersistableBundle extras) {
@@ -10739,14 +11044,18 @@
android.Manifest.permission.MANAGE_TEST_NETWORKS,
android.Manifest.permission.NETWORK_STACK);
final NetworkCapabilities nc = getNetworkCapabilitiesInternal(network);
- if (!nc.hasTransport(TRANSPORT_TEST)) {
- throw new SecurityException("Data Stall simulation is only possible for test networks");
+ if (!nc.hasTransport(TRANSPORT_TEST) && !hasUnderlyingTestNetworks(nc)) {
+ throw new SecurityException(
+ "Data Stall simulation is only possible for test networks or networks built on"
+ + " top of test networks");
}
final NetworkAgentInfo nai = getNetworkAgentInfoForNetwork(network);
- if (nai == null || nai.creatorUid != mDeps.getCallingUid()) {
- throw new SecurityException("Data Stall simulation is only possible for network "
- + "creators");
+ if (nai == null
+ || (nai.creatorUid != mDeps.getCallingUid()
+ && nai.creatorUid != Process.SYSTEM_UID)) {
+ throw new SecurityException(
+ "Data Stall simulation is only possible for network " + "creators");
}
// Instead of passing the data stall directly to the ConnectivityDiagnostics handler, treat
@@ -10770,11 +11079,34 @@
notifyDataStallSuspected(p, network.getNetId());
}
+ /**
+ * Class to hold the information for network activity change event from idle timers
+ * {@link NetdCallback#onInterfaceClassActivityChanged(boolean, int, long, int)}
+ */
+ private static final class NetworkActivityParams {
+ public final boolean isActive;
+ // Label used for idle timer. Transport type is used as label.
+ // label is int since NMS was using the identifier as int, and it has not been changed
+ public final int label;
+ public final long timestampNs;
+ // Uid represents the uid that was responsible for waking the radio.
+ // -1 for no uid and uid is -1 if isActive is false.
+ public final int uid;
+
+ NetworkActivityParams(boolean isActive, int label, long timestampNs, int uid) {
+ this.isActive = isActive;
+ this.label = label;
+ this.timestampNs = timestampNs;
+ this.uid = uid;
+ }
+ }
+
private class NetdCallback extends BaseNetdUnsolicitedEventListener {
@Override
- public void onInterfaceClassActivityChanged(boolean isActive, int transportType,
+ public void onInterfaceClassActivityChanged(boolean isActive, int label,
long timestampNs, int uid) {
- mNetworkActivityTracker.setAndReportNetworkActive(isActive, transportType, timestampNs);
+ mHandler.sendMessage(mHandler.obtainMessage(EVENT_REPORT_NETWORK_ACTIVITY,
+ new NetworkActivityParams(isActive, label, timestampNs, uid)));
}
@Override
@@ -10802,14 +11134,14 @@
private static final int NO_UID = -1;
private final Context mContext;
private final INetd mNetd;
+ private final Handler mHandler;
private final RemoteCallbackList<INetworkActivityListener> mNetworkActivityListeners =
new RemoteCallbackList<>();
// Indicate the current system default network activity is active or not.
- @GuardedBy("mActiveIdleTimers")
- private boolean mNetworkActive;
- @GuardedBy("mActiveIdleTimers")
+ // This needs to be volatile to allow non handler threads to read this value without lock.
+ private volatile boolean mIsDefaultNetworkActive;
private final ArrayMap<String, IdleTimerParams> mActiveIdleTimers = new ArrayMap<>();
- private final Handler mHandler;
+ private final boolean mIsAtLeastU;
private static class IdleTimerParams {
public final int timeout;
@@ -10821,34 +11153,37 @@
}
}
- LegacyNetworkActivityTracker(@NonNull Context context, @NonNull Handler handler,
- @NonNull INetd netd) {
+ LegacyNetworkActivityTracker(@NonNull Context context, @NonNull INetd netd,
+ @NonNull Handler handler, boolean isAtLeastU) {
mContext = context;
mNetd = netd;
mHandler = handler;
+ mIsAtLeastU = isAtLeastU;
}
- public void setAndReportNetworkActive(boolean active, int transportType, long tsNanos) {
- sendDataActivityBroadcast(transportTypeToLegacyType(transportType), active, tsNanos);
- synchronized (mActiveIdleTimers) {
- mNetworkActive = active;
- // If there are no idle timers, it means that system is not monitoring
- // activity, so the system default network for those default network
- // unspecified apps is always considered active.
- //
- // TODO: If the mActiveIdleTimers is empty, netd will actually not send
- // any network activity change event. Whenever this event is received,
- // the mActiveIdleTimers should be always not empty. The legacy behavior
- // is no-op. Remove to refer to mNetworkActive only.
- if (mNetworkActive || mActiveIdleTimers.isEmpty()) {
- mHandler.sendMessage(mHandler.obtainMessage(EVENT_REPORT_NETWORK_ACTIVITY));
- }
+ private void ensureRunningOnConnectivityServiceThread() {
+ if (mHandler.getLooper().getThread() != Thread.currentThread()) {
+ throw new IllegalStateException("Not running on ConnectivityService thread: "
+ + Thread.currentThread().getName());
}
}
- // The network activity should only be updated from ConnectivityService handler thread
- // when mActiveIdleTimers lock is held.
- @GuardedBy("mActiveIdleTimers")
+ public void handleReportNetworkActivity(NetworkActivityParams activityParams) {
+ ensureRunningOnConnectivityServiceThread();
+ if (mActiveIdleTimers.isEmpty()) {
+ // This activity change is not for the current default network.
+ // This can happen if netd callback post activity change event message but
+ // the default network is lost before processing this message.
+ return;
+ }
+ sendDataActivityBroadcast(transportTypeToLegacyType(activityParams.label),
+ activityParams.isActive, activityParams.timestampNs);
+ mIsDefaultNetworkActive = activityParams.isActive;
+ if (mIsDefaultNetworkActive) {
+ reportNetworkActive();
+ }
+ }
+
private void reportNetworkActive() {
final int length = mNetworkActivityListeners.beginBroadcast();
if (DDBG) log("reportNetworkActive, notify " + length + " listeners");
@@ -10865,13 +11200,6 @@
}
}
- @GuardedBy("mActiveIdleTimers")
- public void handleReportNetworkActivity() {
- synchronized (mActiveIdleTimers) {
- reportNetworkActive();
- }
- }
-
// This is deprecated and only to support legacy use cases.
private int transportTypeToLegacyType(int type) {
switch (type) {
@@ -10913,8 +11241,10 @@
*
* Every {@code setupDataActivityTracking} should be paired with a
* {@link #removeDataActivityTracking} for cleanup.
+ *
+ * @return true if the idleTimer is added to the network, false otherwise
*/
- private void setupDataActivityTracking(NetworkAgentInfo networkAgent) {
+ private boolean setupDataActivityTracking(NetworkAgentInfo networkAgent) {
final String iface = networkAgent.linkProperties.getInterfaceName();
final int timeout;
@@ -10933,25 +11263,22 @@
15);
type = NetworkCapabilities.TRANSPORT_WIFI;
} else {
- return; // do not track any other networks
+ return false; // do not track any other networks
}
updateRadioPowerState(true /* isActive */, type);
if (timeout > 0 && iface != null) {
try {
- synchronized (mActiveIdleTimers) {
- // Networks start up.
- mNetworkActive = true;
- mActiveIdleTimers.put(iface, new IdleTimerParams(timeout, type));
- mNetd.idletimerAddInterface(iface, timeout, Integer.toString(type));
- reportNetworkActive();
- }
+ mActiveIdleTimers.put(iface, new IdleTimerParams(timeout, type));
+ mNetd.idletimerAddInterface(iface, timeout, Integer.toString(type));
+ return true;
} catch (Exception e) {
// You shall not crash!
loge("Exception in setupDataActivityTracking " + e);
}
}
+ return false;
}
/**
@@ -10974,26 +11301,45 @@
try {
updateRadioPowerState(false /* isActive */, type);
- synchronized (mActiveIdleTimers) {
- final IdleTimerParams params = mActiveIdleTimers.remove(iface);
- // The call fails silently if no idle timer setup for this interface
- mNetd.idletimerRemoveInterface(iface, params.timeout,
- Integer.toString(params.transportType));
+ final IdleTimerParams params = mActiveIdleTimers.remove(iface);
+ if (params == null) {
+ // IdleTimer is not added if the configured timeout is 0 or negative value
+ return;
}
+ // The call fails silently if no idle timer setup for this interface
+ mNetd.idletimerRemoveInterface(iface, params.timeout,
+ Integer.toString(params.transportType));
} catch (Exception e) {
// You shall not crash!
loge("Exception in removeDataActivityTracking " + e);
}
}
+ private void updateDefaultNetworkActivity(NetworkAgentInfo defaultNetwork,
+ boolean hasIdleTimer) {
+ if (defaultNetwork != null) {
+ mIsDefaultNetworkActive = true;
+ // On T-, callbacks are called only when the network has the idle timer.
+ if (mIsAtLeastU || hasIdleTimer) {
+ reportNetworkActive();
+ }
+ } else {
+ // If there is no default network, default network is considered inactive.
+ mIsDefaultNetworkActive = false;
+ }
+ }
+
/**
* Update data activity tracking when network state is updated.
*/
public void updateDataActivityTracking(NetworkAgentInfo newNetwork,
NetworkAgentInfo oldNetwork) {
+ ensureRunningOnConnectivityServiceThread();
+ boolean hasIdleTimer = false;
if (newNetwork != null) {
- setupDataActivityTracking(newNetwork);
+ hasIdleTimer = setupDataActivityTracking(newNetwork);
}
+ updateDefaultNetworkActivity(newNetwork, hasIdleTimer);
if (oldNetwork != null) {
removeDataActivityTracking(oldNetwork);
}
@@ -11014,15 +11360,7 @@
}
public boolean isDefaultNetworkActive() {
- synchronized (mActiveIdleTimers) {
- // If there are no idle timers, it means that system is not monitoring activity,
- // so the default network is always considered active.
- //
- // TODO : Distinguish between the cases where mActiveIdleTimers is empty because
- // tracking is disabled (negative idle timer value configured), or no active default
- // network. In the latter case, this reports active but it should report inactive.
- return mNetworkActive || mActiveIdleTimers.isEmpty();
- }
+ return mIsDefaultNetworkActive;
}
public void registerNetworkActivityListener(@NonNull INetworkActivityListener l) {
@@ -11034,15 +11372,22 @@
}
public void dump(IndentingPrintWriter pw) {
- synchronized (mActiveIdleTimers) {
- pw.print("mNetworkActive="); pw.println(mNetworkActive);
- pw.println("Idle timers:");
- for (HashMap.Entry<String, IdleTimerParams> ent : mActiveIdleTimers.entrySet()) {
+ pw.print("mIsDefaultNetworkActive="); pw.println(mIsDefaultNetworkActive);
+ pw.println("Idle timers:");
+ try {
+ for (Map.Entry<String, IdleTimerParams> ent : mActiveIdleTimers.entrySet()) {
pw.print(" "); pw.print(ent.getKey()); pw.println(":");
final IdleTimerParams params = ent.getValue();
pw.print(" timeout="); pw.print(params.timeout);
pw.print(" type="); pw.println(params.transportType);
}
+ } catch (Exception e) {
+ // mActiveIdleTimers should only be accessed from handler thread, except dump().
+ // As dump() is never called in normal usage, it would be needlessly expensive
+ // to lock the collection only for its benefit.
+ // Also, mActiveIdleTimers is not expected to be updated frequently.
+ // So catching the exception and logging.
+ pw.println("Failed to dump NetworkActivityTracker: " + e);
}
}
}
@@ -11113,7 +11458,7 @@
if (um.isManagedProfile(profile.getIdentifier())) {
return true;
}
- if (SdkLevel.isAtLeastT() && dpm.getDeviceOwner() != null) return true;
+ if (mDeps.isAtLeastT() && dpm.getDeviceOwner() != null) return true;
return false;
}
@@ -11395,7 +11740,7 @@
private boolean canNetworkBeRateLimited(@NonNull final NetworkAgentInfo networkAgent) {
// Rate-limiting cannot run correctly before T because the BPF program is not loaded.
- if (!SdkLevel.isAtLeastT()) return false;
+ if (!mDeps.isAtLeastT()) return false;
final NetworkCapabilities agentCaps = networkAgent.networkCapabilities;
// Only test networks (they cannot hold NET_CAPABILITY_INTERNET) and networks that provide
@@ -11875,6 +12220,23 @@
return rule;
}
+ private void closeSocketsForFirewallChainLocked(final int chain)
+ throws ErrnoException, SocketException, InterruptedIOException {
+ if (mBpfNetMaps.isFirewallAllowList(chain)) {
+ // Allowlist means the firewall denies all by default, uids must be explicitly allowed
+ // So, close all non-system socket owned by uids that are not explicitly allowed
+ Set<Range<Integer>> ranges = new ArraySet<>();
+ ranges.add(new Range<>(Process.FIRST_APPLICATION_UID, Integer.MAX_VALUE));
+ final Set<Integer> exemptUids = mBpfNetMaps.getUidsWithAllowRuleOnAllowListChain(chain);
+ mDeps.destroyLiveTcpSockets(ranges, exemptUids);
+ } else {
+ // Denylist means the firewall allows all by default, uids must be explicitly denied
+ // So, close socket owned by uids that are explicitly denied
+ final Set<Integer> ownerUids = mBpfNetMaps.getUidsWithDenyRuleOnDenyListChain(chain);
+ mDeps.destroyLiveTcpSocketsByOwnerUids(ownerUids);
+ }
+ }
+
@Override
public void setFirewallChainEnabled(final int chain, final boolean enable) {
enforceNetworkStackOrSettingsPermission();
@@ -11884,6 +12246,14 @@
} catch (ServiceSpecificException e) {
throw new IllegalStateException(e);
}
+
+ if (mDeps.isAtLeastU() && enable) {
+ try {
+ closeSocketsForFirewallChainLocked(chain);
+ } catch (ErrnoException | SocketException | InterruptedIOException e) {
+ Log.e(TAG, "Failed to close sockets after enabling chain (" + chain + "): " + e);
+ }
+ }
}
@Override
diff --git a/service/src/com/android/server/TestNetworkService.java b/service/src/com/android/server/TestNetworkService.java
index 5549fbe..843b7b3 100644
--- a/service/src/com/android/server/TestNetworkService.java
+++ b/service/src/com/android/server/TestNetworkService.java
@@ -310,9 +310,11 @@
NetworkStackConstants.IPV6_ADDR_ANY, 0), null, iface));
}
+ // For testing purpose, fill legacy type for NetworkStatsService since it does not
+ // support transport types.
final TestNetworkAgent agent = new TestNetworkAgent(context, looper, nc, lp,
- new NetworkAgentConfig.Builder().build(), callingUid, binder,
- mNetworkProvider);
+ new NetworkAgentConfig.Builder().setLegacyType(ConnectivityManager.TYPE_TEST)
+ .build(), callingUid, binder, mNetworkProvider);
agent.register();
agent.markConnected();
return agent;
diff --git a/service/src/com/android/server/connectivity/AutomaticOnOffKeepaliveTracker.java b/service/src/com/android/server/connectivity/AutomaticOnOffKeepaliveTracker.java
index 9f9b496..6ba2033 100644
--- a/service/src/com/android/server/connectivity/AutomaticOnOffKeepaliveTracker.java
+++ b/service/src/com/android/server/connectivity/AutomaticOnOffKeepaliveTracker.java
@@ -16,8 +16,9 @@
package com.android.server.connectivity;
-import static android.net.NetworkAgent.CMD_START_SOCKET_KEEPALIVE;
import static android.net.SocketKeepalive.ERROR_INVALID_SOCKET;
+import static android.net.SocketKeepalive.MIN_INTERVAL_SEC;
+import static android.net.SocketKeepalive.SUCCESS;
import static android.net.SocketKeepalive.SUCCESS_PAUSED;
import static android.provider.DeviceConfig.NAMESPACE_TETHERING;
import static android.system.OsConstants.AF_INET;
@@ -39,7 +40,6 @@
import android.net.ISocketKeepaliveCallback;
import android.net.MarkMaskParcel;
import android.net.Network;
-import android.net.NetworkAgent;
import android.net.SocketKeepalive.InvalidSocketException;
import android.os.FileUtils;
import android.os.Handler;
@@ -51,7 +51,9 @@
import android.system.Os;
import android.system.OsConstants;
import android.system.StructTimeval;
+import android.util.LocalLog;
import android.util.Log;
+import android.util.Pair;
import android.util.SparseArray;
import com.android.internal.annotations.VisibleForTesting;
@@ -88,11 +90,34 @@
public class AutomaticOnOffKeepaliveTracker {
private static final String TAG = "AutomaticOnOffKeepaliveTracker";
private static final int[] ADDRESS_FAMILIES = new int[] {AF_INET6, AF_INET};
- private static final String EXTRA_BINDER_TOKEN = "token";
- private static final long DEFAULT_TCP_POLLING_INTERVAL_MS = 120_000L;
private static final long LOW_TCP_POLLING_INTERVAL_MS = 1_000L;
+ private static final int ADJUST_TCP_POLLING_DELAY_MS = 2000;
private static final String AUTOMATIC_ON_OFF_KEEPALIVE_VERSION =
"automatic_on_off_keepalive_version";
+ public static final long METRICS_COLLECTION_DURATION_MS = 24 * 60 * 60 * 1_000L;
+
+ // ConnectivityService parses message constants from itself and AutomaticOnOffKeepaliveTracker
+ // with MessageUtils for debugging purposes, and crashes if some messages have the same values.
+ private static final int BASE = 2000;
+ /**
+ * Sent by AutomaticOnOffKeepaliveTracker periodically (when relevant) to trigger monitor
+ * automatic keepalive request.
+ *
+ * NATT keepalives have an automatic mode where the system only sends keepalive packets when
+ * TCP sockets are open over a VPN. The system will check periodically for presence of
+ * such open sockets, and this message is what triggers the re-evaluation.
+ *
+ * obj = A Binder object associated with the keepalive.
+ */
+ public static final int CMD_MONITOR_AUTOMATIC_KEEPALIVE = BASE + 1;
+
+ /**
+ * Sent by AutomaticOnOffKeepaliveTracker to ConnectivityService to start a keepalive.
+ *
+ * obj = AutomaticKeepaliveInfo object
+ */
+ public static final int CMD_REQUEST_START_KEEPALIVE = BASE + 2;
+
/**
* States for {@code #AutomaticOnOffKeepalive}.
*
@@ -152,6 +177,13 @@
// TODO: Remove this when TCP polling design is replaced with callback.
private long mTestLowTcpPollingTimerUntilMs = 0;
+ private static final int MAX_EVENTS_LOGS = 40;
+ private final LocalLog mEventLog = new LocalLog(MAX_EVENTS_LOGS);
+
+ private final KeepaliveStatsTracker mKeepaliveStatsTracker;
+
+ private final long mMetricsWriteTimeBase;
+
/**
* Information about a managed keepalive.
*
@@ -179,14 +211,17 @@
private final Network mUnderpinnedNetwork;
AutomaticOnOffKeepalive(@NonNull final KeepaliveTracker.KeepaliveInfo ki,
- final boolean autoOnOff, @NonNull Context context,
- @Nullable Network underpinnedNetwork)
+ final boolean autoOnOff, @Nullable Network underpinnedNetwork)
throws InvalidSocketException {
this.mKi = Objects.requireNonNull(ki);
mCallback = ki.mCallback;
mUnderpinnedNetwork = underpinnedNetwork;
- if (autoOnOff && mDependencies.isFeatureEnabled(AUTOMATIC_ON_OFF_KEEPALIVE_VERSION,
- true /* defaultEnabled */)) {
+ // Reading DeviceConfig will check if the calling uid and calling package name are the
+ // same. Clear calling identity to align the calling uid and package
+ final boolean enabled = BinderUtils.withCleanCallingIdentity(
+ () -> mDependencies.isFeatureEnabled(AUTOMATIC_ON_OFF_KEEPALIVE_VERSION,
+ true /* defaultEnabled */));
+ if (autoOnOff && enabled) {
mAutomaticOnOffState = STATE_ENABLED;
if (null == ki.mFd) {
throw new IllegalArgumentException("fd can't be null with automatic "
@@ -199,7 +234,7 @@
throw new InvalidSocketException(ERROR_INVALID_SOCKET, e);
}
mAlarmListener = () -> mConnectivityServiceHandler.obtainMessage(
- NetworkAgent.CMD_MONITOR_AUTOMATIC_KEEPALIVE, mCallback.asBinder())
+ CMD_MONITOR_AUTOMATIC_KEEPALIVE, mCallback.asBinder())
.sendToTarget();
} else {
mAutomaticOnOffState = STATE_ALWAYS_ON;
@@ -217,7 +252,7 @@
}
public Network getNetwork() {
- return mKi.getNai().network;
+ return mKi.getNai().network();
}
@Nullable
@@ -231,6 +266,7 @@
@Override
public void binderDied() {
+ mEventLog.log("Binder died : " + mCallback);
mConnectivityServiceHandler.post(() -> cleanupAutoOnOffKeepalive(this));
}
@@ -279,14 +315,36 @@
mContext, mConnectivityServiceHandler);
mAlarmManager = mDependencies.getAlarmManager(context);
+ mKeepaliveStatsTracker =
+ mDependencies.newKeepaliveStatsTracker(context, handler);
+
+ final long time = mDependencies.getElapsedRealtime();
+ mMetricsWriteTimeBase = time % METRICS_COLLECTION_DURATION_MS;
+ final long triggerAtMillis = mMetricsWriteTimeBase + METRICS_COLLECTION_DURATION_MS;
+ mAlarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, triggerAtMillis, TAG,
+ this::writeMetricsAndRescheduleAlarm, handler);
}
- private void startTcpPollingAlarm(@NonNull final AlarmManager.OnAlarmListener listener) {
+ private void writeMetricsAndRescheduleAlarm() {
+ mKeepaliveStatsTracker.writeAndResetMetrics();
+
+ final long time = mDependencies.getElapsedRealtime();
final long triggerAtMillis =
- SystemClock.elapsedRealtime() + getTcpPollingInterval();
+ mMetricsWriteTimeBase
+ + (time - time % METRICS_COLLECTION_DURATION_MS)
+ + METRICS_COLLECTION_DURATION_MS;
+ mAlarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, triggerAtMillis, TAG,
+ this::writeMetricsAndRescheduleAlarm, mConnectivityServiceHandler);
+ }
+
+ private void startTcpPollingAlarm(@NonNull AutomaticOnOffKeepalive ki) {
+ if (ki.mAlarmListener == null) return;
+
+ final long triggerAtMillis =
+ mDependencies.getElapsedRealtime() + getTcpPollingIntervalMs(ki);
// Setup a non-wake up alarm.
mAlarmManager.setExact(AlarmManager.ELAPSED_REALTIME, triggerAtMillis, null /* tag */,
- listener, mConnectivityServiceHandler);
+ ki.mAlarmListener, mConnectivityServiceHandler);
}
/**
@@ -323,7 +381,7 @@
handleMaybeResumeKeepalive(ki);
}
// TODO: listen to socket status instead of periodically check.
- startTcpPollingAlarm(ki.mAlarmListener);
+ startTcpPollingAlarm(ki);
}
/**
@@ -331,6 +389,7 @@
* @param autoKi the keepalive to resume
*/
public void handleMaybeResumeKeepalive(@NonNull AutomaticOnOffKeepalive autoKi) {
+ mEventLog.log("Resume keepalive " + autoKi.mCallback + " on " + autoKi.getNetwork());
// Might happen if the automatic keepalive was removed by the app just as the alarm fires.
if (!mAutomaticOnOffKeepalives.contains(autoKi)) return;
if (STATE_ALWAYS_ON == autoKi.mAutomaticOnOffState) {
@@ -348,7 +407,11 @@
return;
}
autoKi.mAutomaticOnOffState = STATE_ENABLED;
- handleResumeKeepalive(newKi);
+ final int error = handleResumeKeepalive(newKi);
+ if (error != SUCCESS) {
+ // Failed to start the keepalive
+ cleanupAutoOnOffKeepalive(autoKi);
+ }
}
/**
@@ -369,17 +432,34 @@
* Forward to KeepaliveTracker.
*/
public void handleEventSocketKeepalive(@NonNull NetworkAgentInfo nai, int slot, int reason) {
- mKeepaliveTracker.handleEventSocketKeepalive(nai, slot, reason);
+ if (mKeepaliveTracker.handleEventSocketKeepalive(nai, slot, reason)) return;
+
+ // The keepalive was stopped and so the autoKi should be cleaned up.
+ final AutomaticOnOffKeepalive autoKi =
+ CollectionUtils.findFirst(
+ mAutomaticOnOffKeepalives, it -> it.match(nai.network(), slot));
+ if (autoKi == null) {
+ // This may occur when the autoKi gets cleaned up elsewhere (i.e
+ // handleCheckKeepalivesStillValid) while waiting for the network agent to
+ // start the keepalive and the network agent returns an error event.
+ Log.e(TAG, "Attempt cleanup on unknown network, slot");
+ return;
+ }
+ cleanupAutoOnOffKeepalive(autoKi);
}
/**
* Handle stop all keepalives on the specific network.
*/
public void handleStopAllKeepalives(NetworkAgentInfo nai, int reason) {
+ mEventLog.log("Stop all keepalives on " + nai.network + " because " + reason);
mKeepaliveTracker.handleStopAllKeepalives(nai, reason);
final List<AutomaticOnOffKeepalive> matches =
CollectionUtils.filter(mAutomaticOnOffKeepalives, it -> it.mKi.getNai() == nai);
for (final AutomaticOnOffKeepalive ki : matches) {
+ if (ki.mAutomaticOnOffState == STATE_SUSPENDED) {
+ mKeepaliveTracker.finalizePausedKeepalive(ki.mKi, reason);
+ }
cleanupAutoOnOffKeepalive(ki);
}
}
@@ -391,7 +471,20 @@
*/
public void handleStartKeepalive(Message message) {
final AutomaticOnOffKeepalive autoKi = (AutomaticOnOffKeepalive) message.obj;
- mKeepaliveTracker.handleStartKeepalive(autoKi.mKi);
+ final int error = mKeepaliveTracker.handleStartKeepalive(autoKi.mKi);
+ if (error != SUCCESS) {
+ mEventLog.log("Failed to start keepalive " + autoKi.mCallback + " on "
+ + autoKi.getNetwork() + " with error " + error);
+ return;
+ }
+ mEventLog.log("Start keepalive " + autoKi.mCallback + " on " + autoKi.getNetwork());
+ mKeepaliveStatsTracker.onStartKeepalive(
+ autoKi.getNetwork(),
+ autoKi.mKi.getSlot(),
+ autoKi.mKi.getNai().networkCapabilities,
+ autoKi.mKi.getKeepaliveIntervalSec(),
+ autoKi.mKi.getUid(),
+ STATE_ALWAYS_ON != autoKi.mAutomaticOnOffState);
// Add automatic on/off request into list to track its life cycle.
try {
@@ -403,15 +496,31 @@
}
mAutomaticOnOffKeepalives.add(autoKi);
if (STATE_ALWAYS_ON != autoKi.mAutomaticOnOffState) {
- startTcpPollingAlarm(autoKi.mAlarmListener);
+ startTcpPollingAlarm(autoKi);
}
}
- private void handleResumeKeepalive(@NonNull final KeepaliveTracker.KeepaliveInfo ki) {
- mKeepaliveTracker.handleStartKeepalive(ki);
+ /**
+ * Handle resume keepalive with the given KeepaliveInfo
+ *
+ * @return SUCCESS if the keepalive is successfully starting and the error reason otherwise.
+ */
+ private int handleResumeKeepalive(@NonNull final KeepaliveTracker.KeepaliveInfo ki) {
+ final int error = mKeepaliveTracker.handleStartKeepalive(ki);
+ if (error != SUCCESS) {
+ mEventLog.log("Failed to resume keepalive " + ki.mCallback + " on " + ki.mNai
+ + " with error " + error);
+ return error;
+ }
+ mKeepaliveStatsTracker.onResumeKeepalive(ki.getNai().network(), ki.getSlot());
+ mEventLog.log("Resumed successfully keepalive " + ki.mCallback + " on " + ki.mNai);
+
+ return SUCCESS;
}
private void handlePauseKeepalive(@NonNull final KeepaliveTracker.KeepaliveInfo ki) {
+ mEventLog.log("Suspend keepalive " + ki.mCallback + " on " + ki.mNai);
+ mKeepaliveStatsTracker.onPauseKeepalive(ki.getNai().network(), ki.getSlot());
// TODO : mKT.handleStopKeepalive should take a KeepaliveInfo instead
mKeepaliveTracker.handleStopKeepalive(ki.getNai(), ki.getSlot(), SUCCESS_PAUSED);
}
@@ -420,13 +529,14 @@
* Handle stop keepalives on the specific network with given slot.
*/
public void handleStopKeepalive(@NonNull final AutomaticOnOffKeepalive autoKi, int reason) {
+ mEventLog.log("Stop keepalive " + autoKi.mCallback + " because " + reason);
// Stop the keepalive unless it was suspended. This includes the case where it's managed
// but enabled, and the case where it's always on.
if (autoKi.mAutomaticOnOffState != STATE_SUSPENDED) {
final KeepaliveTracker.KeepaliveInfo ki = autoKi.mKi;
mKeepaliveTracker.handleStopKeepalive(ki.getNai(), ki.getSlot(), reason);
} else {
- mKeepaliveTracker.finalizePausedKeepalive(autoKi.mKi);
+ mKeepaliveTracker.finalizePausedKeepalive(autoKi.mKi, reason);
}
cleanupAutoOnOffKeepalive(autoKi);
@@ -434,6 +544,7 @@
private void cleanupAutoOnOffKeepalive(@NonNull final AutomaticOnOffKeepalive autoKi) {
ensureRunningOnHandlerThread();
+ mKeepaliveStatsTracker.onStopKeepalive(autoKi.getNetwork(), autoKi.mKi.getSlot());
autoKi.close();
if (null != autoKi.mAlarmListener) mAlarmManager.cancel(autoKi.mAlarmListener);
@@ -464,10 +575,14 @@
if (null == ki) return;
try {
final AutomaticOnOffKeepalive autoKi = new AutomaticOnOffKeepalive(ki,
- automaticOnOffKeepalives, mContext, underpinnedNetwork);
- mConnectivityServiceHandler.obtainMessage(NetworkAgent.CMD_START_SOCKET_KEEPALIVE,
- // TODO : move ConnectivityService#encodeBool to a static lib.
- automaticOnOffKeepalives ? 1 : 0, 0, autoKi).sendToTarget();
+ automaticOnOffKeepalives, underpinnedNetwork);
+ mEventLog.log("Start natt keepalive " + cb + " on " + nai.network
+ + " " + srcAddrString + ":" + srcPort
+ + " → " + dstAddrString + ":" + dstPort
+ + " auto=" + autoKi
+ + " underpinned=" + underpinnedNetwork);
+ mConnectivityServiceHandler.obtainMessage(CMD_REQUEST_START_KEEPALIVE, autoKi)
+ .sendToTarget();
} catch (InvalidSocketException e) {
mKeepaliveTracker.notifyErrorCallback(cb, e.error);
}
@@ -494,10 +609,14 @@
if (null == ki) return;
try {
final AutomaticOnOffKeepalive autoKi = new AutomaticOnOffKeepalive(ki,
- automaticOnOffKeepalives, mContext, underpinnedNetwork);
- mConnectivityServiceHandler.obtainMessage(NetworkAgent.CMD_START_SOCKET_KEEPALIVE,
- // TODO : move ConnectivityService#encodeBool to a static lib.
- automaticOnOffKeepalives ? 1 : 0, 0, autoKi).sendToTarget();
+ automaticOnOffKeepalives, underpinnedNetwork);
+ mEventLog.log("Start natt keepalive " + cb + " on " + nai.network
+ + " " + srcAddrString
+ + " → " + dstAddrString + ":" + dstPort
+ + " auto=" + autoKi
+ + " underpinned=" + underpinnedNetwork);
+ mConnectivityServiceHandler.obtainMessage(CMD_REQUEST_START_KEEPALIVE, autoKi)
+ .sendToTarget();
} catch (InvalidSocketException e) {
mKeepaliveTracker.notifyErrorCallback(cb, e.error);
}
@@ -524,8 +643,8 @@
try {
final AutomaticOnOffKeepalive autoKi = new AutomaticOnOffKeepalive(ki,
false /* autoOnOff, tcp keepalives are never auto on/off */,
- mContext, null /* underpinnedNetwork, tcp keepalives do not refer to this */);
- mConnectivityServiceHandler.obtainMessage(CMD_START_SOCKET_KEEPALIVE, autoKi)
+ null /* underpinnedNetwork, tcp keepalives do not refer to this */);
+ mConnectivityServiceHandler.obtainMessage(CMD_REQUEST_START_KEEPALIVE, autoKi)
.sendToTarget();
} catch (InvalidSocketException e) {
mKeepaliveTracker.notifyErrorCallback(cb, e.error);
@@ -539,7 +658,7 @@
mKeepaliveTracker.dump(pw);
// Reading DeviceConfig will check if the calling uid and calling package name are the same.
// Clear calling identity to align the calling uid and package so that it won't fail if cts
- // would like to do the dump()
+ // would like to call dump()
final boolean featureEnabled = BinderUtils.withCleanCallingIdentity(
() -> mDependencies.isFeatureEnabled(AUTOMATIC_ON_OFF_KEEPALIVE_VERSION,
true /* defaultEnabled */));
@@ -549,6 +668,11 @@
pw.println(autoKi.toString());
}
pw.decreaseIndent();
+
+ pw.println("Events (most recent first):");
+ pw.increaseIndent();
+ mEventLog.reverseDump(pw);
+ pw.decreaseIndent();
}
/**
@@ -557,7 +681,22 @@
* Forward to KeepaliveTracker.
*/
public void handleCheckKeepalivesStillValid(NetworkAgentInfo nai) {
- mKeepaliveTracker.handleCheckKeepalivesStillValid(nai);
+ ArrayList<Pair<AutomaticOnOffKeepalive, Integer>> invalidKeepalives = null;
+
+ for (final AutomaticOnOffKeepalive autoKi : mAutomaticOnOffKeepalives) {
+ if (!nai.equals(autoKi.mKi.mNai)) continue;
+ final int error = autoKi.mKi.isValid();
+ if (error != SUCCESS) {
+ if (invalidKeepalives == null) {
+ invalidKeepalives = new ArrayList<>();
+ }
+ invalidKeepalives.add(Pair.create(autoKi, error));
+ }
+ }
+ if (invalidKeepalives == null) return;
+ for (final Pair<AutomaticOnOffKeepalive, Integer> keepaliveAndError : invalidKeepalives) {
+ handleStopKeepalive(keepaliveAndError.first, keepaliveAndError.second);
+ }
}
@VisibleForTesting
@@ -678,9 +817,15 @@
}
}
- private long getTcpPollingInterval() {
+ private long getTcpPollingIntervalMs(@NonNull AutomaticOnOffKeepalive ki) {
final boolean useLowTimer = mTestLowTcpPollingTimerUntilMs > System.currentTimeMillis();
- return useLowTimer ? LOW_TCP_POLLING_INTERVAL_MS : DEFAULT_TCP_POLLING_INTERVAL_MS;
+ // Adjust the polling interval to be smaller than the keepalive delay to preserve
+ // some time for the system to restart the keepalive.
+ final int timer = ki.mKi.getKeepaliveIntervalSec() * 1000 - ADJUST_TCP_POLLING_DELAY_MS;
+ if (timer < MIN_INTERVAL_SEC) {
+ Log.wtf(TAG, "Unreasonably low keepalive delay: " + ki.mKi.getKeepaliveIntervalSec());
+ }
+ return useLowTimer ? LOW_TCP_POLLING_INTERVAL_MS : Math.max(timer, MIN_INTERVAL_SEC);
}
/**
@@ -776,6 +921,14 @@
}
/**
+ * Construct a new KeepaliveStatsTracker.
+ */
+ public KeepaliveStatsTracker newKeepaliveStatsTracker(@NonNull Context context,
+ @NonNull Handler connectivityserviceHander) {
+ return new KeepaliveStatsTracker(context, connectivityserviceHander);
+ }
+
+ /**
* Find out if a feature is enabled from DeviceConfig.
*
* @param name The name of the property to look up.
@@ -785,7 +938,16 @@
*/
public boolean isFeatureEnabled(@NonNull final String name, final boolean defaultEnabled) {
return DeviceConfigUtils.isFeatureEnabled(mContext, NAMESPACE_TETHERING, name,
- defaultEnabled);
+ DeviceConfigUtils.TETHERING_MODULE_NAME, defaultEnabled);
+ }
+
+ /**
+ * Returns milliseconds since boot, including time spent in sleep.
+ *
+ * @return elapsed milliseconds since boot.
+ */
+ public long getElapsedRealtime() {
+ return SystemClock.elapsedRealtime();
}
}
}
diff --git a/service/src/com/android/server/connectivity/ClatCoordinator.java b/service/src/com/android/server/connectivity/ClatCoordinator.java
index 5d04632..eb3e7ce 100644
--- a/service/src/com/android/server/connectivity/ClatCoordinator.java
+++ b/service/src/com/android/server/connectivity/ClatCoordinator.java
@@ -30,15 +30,17 @@
import android.net.InetAddresses;
import android.net.InterfaceConfigurationParcel;
import android.net.IpPrefix;
+import android.os.Build;
import android.os.ParcelFileDescriptor;
import android.os.RemoteException;
import android.os.ServiceSpecificException;
import android.system.ErrnoException;
import android.util.Log;
+import androidx.annotation.RequiresApi;
+
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.util.IndentingPrintWriter;
-import com.android.modules.utils.build.SdkLevel;
import com.android.net.module.util.BpfMap;
import com.android.net.module.util.IBpfMap;
import com.android.net.module.util.InterfaceParams;
@@ -63,6 +65,7 @@
*
* {@hide}
*/
+@RequiresApi(Build.VERSION_CODES.TIRAMISU)
public class ClatCoordinator {
private static final String TAG = ClatCoordinator.class.getSimpleName();
@@ -237,9 +240,8 @@
/**
* Stop clatd.
*/
- public void stopClatd(String iface, String pfx96, String v4, String v6, int pid)
- throws IOException {
- native_stopClatd(iface, pfx96, v4, v6, pid);
+ public void stopClatd(int pid) throws IOException {
+ native_stopClatd(pid);
}
/**
@@ -252,11 +254,6 @@
/** Get ingress6 BPF map. */
@Nullable
public IBpfMap<ClatIngress6Key, ClatIngress6Value> getBpfIngress6Map() {
- // Pre-T devices don't use ClatCoordinator to access clat map. Since Nat464Xlat
- // initializes a ClatCoordinator object to avoid redundant null pointer check
- // while using, ignore the BPF map initialization on pre-T devices.
- // TODO: probably don't initialize ClatCoordinator object on pre-T devices.
- if (!SdkLevel.isAtLeastT()) return null;
try {
return new BpfMap<>(CLAT_INGRESS6_MAP_PATH,
BpfMap.BPF_F_RDWR, ClatIngress6Key.class, ClatIngress6Value.class);
@@ -269,11 +266,6 @@
/** Get egress4 BPF map. */
@Nullable
public IBpfMap<ClatEgress4Key, ClatEgress4Value> getBpfEgress4Map() {
- // Pre-T devices don't use ClatCoordinator to access clat map. Since Nat464Xlat
- // initializes a ClatCoordinator object to avoid redundant null pointer check
- // while using, ignore the BPF map initialization on pre-T devices.
- // TODO: probably don't initialize ClatCoordinator object on pre-T devices.
- if (!SdkLevel.isAtLeastT()) return null;
try {
return new BpfMap<>(CLAT_EGRESS4_MAP_PATH,
BpfMap.BPF_F_RDWR, ClatEgress4Key.class, ClatEgress4Value.class);
@@ -286,11 +278,6 @@
/** Get cookie tag map */
@Nullable
public IBpfMap<CookieTagMapKey, CookieTagMapValue> getBpfCookieTagMap() {
- // Pre-T devices don't use ClatCoordinator to access clat map. Since Nat464Xlat
- // initializes a ClatCoordinator object to avoid redundant null pointer check
- // while using, ignore the BPF map initialization on pre-T devices.
- // TODO: probably don't initialize ClatCoordinator object on pre-T devices.
- if (!SdkLevel.isAtLeastT()) return null;
try {
return new BpfMap<>(COOKIE_TAG_MAP_PATH,
BpfMap.BPF_F_RDWR, CookieTagMapKey.class, CookieTagMapValue.class);
@@ -843,9 +830,7 @@
Log.i(TAG, "Stopping clatd pid=" + mClatdTracker.pid + " on " + mClatdTracker.iface);
maybeStopBpf(mClatdTracker);
- mDeps.stopClatd(mClatdTracker.iface, mClatdTracker.pfx96.getHostAddress(),
- mClatdTracker.v4.getHostAddress(), mClatdTracker.v6.getHostAddress(),
- mClatdTracker.pid);
+ mDeps.stopClatd(mClatdTracker.pid);
untagSocket(mClatdTracker.cookie);
Log.i(TAG, "clatd on " + mClatdTracker.iface + " stopped");
@@ -944,7 +929,6 @@
private static native int native_startClatd(FileDescriptor tunfd, FileDescriptor readsock6,
FileDescriptor writesock6, String iface, String pfx96, String v4, String v6)
throws IOException;
- private static native void native_stopClatd(String iface, String pfx96, String v4, String v6,
- int pid) throws IOException;
+ private static native void native_stopClatd(int pid) throws IOException;
private static native long native_getSocketCookie(FileDescriptor sock) throws IOException;
}
diff --git a/service/src/com/android/server/connectivity/ConnectivityFlags.java b/service/src/com/android/server/connectivity/ConnectivityFlags.java
index 122ea1c..9039a14 100644
--- a/service/src/com/android/server/connectivity/ConnectivityFlags.java
+++ b/service/src/com/android/server/connectivity/ConnectivityFlags.java
@@ -61,6 +61,6 @@
*/
public void loadFlags(ConnectivityService.Dependencies deps, Context ctx) {
mNoRematchAllRequestsOnRegister = deps.isFeatureEnabled(
- ctx, NO_REMATCH_ALL_REQUESTS_ON_REGISTER, false /* defaultEnabled */);
+ ctx, NO_REMATCH_ALL_REQUESTS_ON_REGISTER);
}
}
diff --git a/framework/src/android/net/ConnectivityResources.java b/service/src/com/android/server/connectivity/ConnectivityResources.java
similarity index 67%
rename from framework/src/android/net/ConnectivityResources.java
rename to service/src/com/android/server/connectivity/ConnectivityResources.java
index 18f0de0..9089e4a 100644
--- a/framework/src/android/net/ConnectivityResources.java
+++ b/service/src/com/android/server/connectivity/ConnectivityResources.java
@@ -14,22 +14,16 @@
* limitations under the License.
*/
-package android.net;
-
-import static android.content.pm.PackageManager.MATCH_SYSTEM_ONLY;
+package com.android.server.connectivity;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.content.Context;
-import android.content.Intent;
import android.content.pm.PackageManager;
-import android.content.pm.ResolveInfo;
import android.content.res.Resources;
-import android.util.Log;
import com.android.internal.annotations.VisibleForTesting;
-
-import java.util.List;
+import com.android.net.module.util.DeviceConfigUtils;
/**
* Utility to obtain the {@link com.android.server.ConnectivityService} {@link Resources}, in the
@@ -37,10 +31,6 @@
* @hide
*/
public class ConnectivityResources {
- private static final String RESOURCES_APK_INTENT =
- "com.android.server.connectivity.intent.action.SERVICE_CONNECTIVITY_RESOURCES_APK";
- private static final String RES_PKG_DIR = "/apex/com.android.tethering/";
-
@NonNull
private final Context mContext;
@@ -76,21 +66,10 @@
return mResourcesContext;
}
- final List<ResolveInfo> pkgs = mContext.getPackageManager()
- .queryIntentActivities(new Intent(RESOURCES_APK_INTENT), MATCH_SYSTEM_ONLY);
- pkgs.removeIf(pkg -> !pkg.activityInfo.applicationInfo.sourceDir.startsWith(RES_PKG_DIR));
- if (pkgs.size() > 1) {
- Log.wtf(ConnectivityResources.class.getSimpleName(),
- "More than one package found: " + pkgs);
- }
- if (pkgs.isEmpty()) {
- throw new IllegalStateException("No connectivity resource package found");
- }
-
+ final String resPkg = DeviceConfigUtils.getConnectivityResourcesPackageName(mContext);
final Context pkgContext;
try {
- pkgContext = mContext.createPackageContext(
- pkgs.get(0).activityInfo.applicationInfo.packageName, 0 /* flags */);
+ pkgContext = mContext.createPackageContext(resPkg, 0 /* flags */);
} catch (PackageManager.NameNotFoundException e) {
throw new IllegalStateException("Resolved package not found", e);
}
diff --git a/service/src/com/android/server/connectivity/KeepaliveResourceUtil.java b/service/src/com/android/server/connectivity/KeepaliveResourceUtil.java
new file mode 100644
index 0000000..92b080d
--- /dev/null
+++ b/service/src/com/android/server/connectivity/KeepaliveResourceUtil.java
@@ -0,0 +1,90 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.connectivity;
+
+import android.annotation.NonNull;
+import android.content.Context;
+import android.content.res.Resources;
+import android.net.NetworkCapabilities;
+import android.text.TextUtils;
+import android.util.AndroidRuntimeException;
+
+import com.android.connectivity.resources.R;
+
+/**
+ * Utilities to fetch keepalive configuration from resources.
+ */
+public abstract class KeepaliveResourceUtil {
+
+ /**
+ * Read supported keepalive count for each transport type from overlay resource.
+ *
+ * @param context The context to read resource from.
+ * @return An array of supported keepalive count for each transport type.
+ */
+ @NonNull
+ public static int[] getSupportedKeepalives(@NonNull Context context) {
+ String[] res = null;
+ try {
+ final ConnectivityResources connRes = new ConnectivityResources(context);
+ res = connRes.get().getStringArray(R.array.config_networkSupportedKeepaliveCount);
+ } catch (Resources.NotFoundException unused) {
+ }
+ if (res == null) throw new KeepaliveDeviceConfigurationException("invalid resource");
+
+ final int[] ret = new int[NetworkCapabilities.MAX_TRANSPORT + 1];
+ for (final String row : res) {
+ if (TextUtils.isEmpty(row)) {
+ throw new KeepaliveDeviceConfigurationException("Empty string");
+ }
+ final String[] arr = row.split(",");
+ if (arr.length != 2) {
+ throw new KeepaliveDeviceConfigurationException("Invalid parameter length");
+ }
+
+ int transport;
+ int supported;
+ try {
+ transport = Integer.parseInt(arr[0]);
+ supported = Integer.parseInt(arr[1]);
+ } catch (NumberFormatException e) {
+ throw new KeepaliveDeviceConfigurationException("Invalid number format");
+ }
+
+ if (!NetworkCapabilities.isValidTransport(transport)) {
+ throw new KeepaliveDeviceConfigurationException("Invalid transport " + transport);
+ }
+
+ if (supported < 0) {
+ throw new KeepaliveDeviceConfigurationException(
+ "Invalid supported count " + supported + " for "
+ + NetworkCapabilities.transportNameOf(transport));
+ }
+ ret[transport] = supported;
+ }
+ return ret;
+ }
+
+ /**
+ * An exception thrown when the keepalive resource configuration is invalid.
+ */
+ public static class KeepaliveDeviceConfigurationException extends AndroidRuntimeException {
+ public KeepaliveDeviceConfigurationException(final String msg) {
+ super(msg);
+ }
+ }
+}
diff --git a/service/src/com/android/server/connectivity/KeepaliveStatsTracker.java b/service/src/com/android/server/connectivity/KeepaliveStatsTracker.java
new file mode 100644
index 0000000..d59d526
--- /dev/null
+++ b/service/src/com/android/server/connectivity/KeepaliveStatsTracker.java
@@ -0,0 +1,657 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.connectivity;
+
+import static android.telephony.SubscriptionManager.OnSubscriptionsChangedListener;
+
+import android.annotation.NonNull;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.net.Network;
+import android.net.NetworkCapabilities;
+import android.net.NetworkSpecifier;
+import android.net.TelephonyNetworkSpecifier;
+import android.net.TransportInfo;
+import android.net.wifi.WifiInfo;
+import android.os.Handler;
+import android.os.SystemClock;
+import android.telephony.SubscriptionInfo;
+import android.telephony.SubscriptionManager;
+import android.telephony.TelephonyManager;
+import android.util.Log;
+import android.util.SparseArray;
+import android.util.SparseIntArray;
+
+import com.android.internal.annotations.VisibleForTesting;
+import com.android.metrics.DailykeepaliveInfoReported;
+import com.android.metrics.DurationForNumOfKeepalive;
+import com.android.metrics.DurationPerNumOfKeepalive;
+import com.android.metrics.KeepaliveLifetimeForCarrier;
+import com.android.metrics.KeepaliveLifetimePerCarrier;
+import com.android.modules.utils.BackgroundThread;
+import com.android.net.module.util.CollectionUtils;
+import com.android.server.ConnectivityStatsLog;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Set;
+
+/**
+ * Tracks carrier and duration metrics of automatic on/off keepalives.
+ *
+ * <p>This class follows AutomaticOnOffKeepaliveTracker closely and its on*Keepalive methods needs
+ * to be called in a timely manner to keep the metrics accurate. It is also not thread-safe and all
+ * public methods must be called by the same thread, namely the ConnectivityService handler thread.
+ */
+public class KeepaliveStatsTracker {
+ private static final String TAG = KeepaliveStatsTracker.class.getSimpleName();
+
+ @NonNull private final Handler mConnectivityServiceHandler;
+ @NonNull private final Dependencies mDependencies;
+
+ // Mapping of subId to carrierId. Updates are received from OnSubscriptionsChangedListener
+ private final SparseIntArray mCachedCarrierIdPerSubId = new SparseIntArray();
+ // The default subscription id obtained from SubscriptionManager.getDefaultSubscriptionId.
+ // Updates are received from the ACTION_DEFAULT_SUBSCRIPTION_CHANGED broadcast.
+ private int mCachedDefaultSubscriptionId = SubscriptionManager.INVALID_SUBSCRIPTION_ID;
+
+ // Class to store network information, lifetime durations and active state of a keepalive.
+ private static final class KeepaliveStats {
+ // The carrier ID for a keepalive, or TelephonyManager.UNKNOWN_CARRIER_ID(-1) if not set.
+ public final int carrierId;
+ // The transport types of the underlying network for each keepalive. A network may include
+ // multiple transport types. Each transport type is represented by a different bit, defined
+ // in NetworkCapabilities
+ public final int transportTypes;
+ // The keepalive interval in millis.
+ public final int intervalMs;
+ // The uid of the app that requested the keepalive.
+ public final int appUid;
+ // Indicates if the keepalive is an automatic keepalive.
+ public final boolean isAutoKeepalive;
+
+ // Snapshot of the lifetime stats
+ public static class LifetimeStats {
+ public final int lifetimeMs;
+ public final int activeLifetimeMs;
+
+ LifetimeStats(int lifetimeMs, int activeLifetimeMs) {
+ this.lifetimeMs = lifetimeMs;
+ this.activeLifetimeMs = activeLifetimeMs;
+ }
+ }
+
+ // The total time since the keepalive is started until it is stopped.
+ private int mLifetimeMs = 0;
+ // The total time the keepalive is active (not suspended).
+ private int mActiveLifetimeMs = 0;
+
+ // A timestamp of the most recent time the lifetime metrics was updated.
+ private long mLastUpdateLifetimeTimestamp;
+
+ // A flag to indicate if the keepalive is active.
+ private boolean mKeepaliveActive = true;
+
+ /**
+ * Gets the lifetime stats for the keepalive, updated to timeNow, and then resets it.
+ *
+ * @param timeNow a timestamp obtained using Dependencies.getElapsedRealtime
+ */
+ public LifetimeStats getAndResetLifetimeStats(long timeNow) {
+ updateLifetimeStatsAndSetActive(timeNow, mKeepaliveActive);
+ // Get a snapshot of the stats
+ final LifetimeStats lifetimeStats = new LifetimeStats(mLifetimeMs, mActiveLifetimeMs);
+ // Reset the stats
+ resetLifetimeStats(timeNow);
+
+ return lifetimeStats;
+ }
+
+ public boolean isKeepaliveActive() {
+ return mKeepaliveActive;
+ }
+
+ KeepaliveStats(
+ int carrierId,
+ int transportTypes,
+ int intervalSeconds,
+ int appUid,
+ boolean isAutoKeepalive,
+ long timeNow) {
+ this.carrierId = carrierId;
+ this.transportTypes = transportTypes;
+ this.intervalMs = intervalSeconds * 1000;
+ this.appUid = appUid;
+ this.isAutoKeepalive = isAutoKeepalive;
+ mLastUpdateLifetimeTimestamp = timeNow;
+ }
+
+ /**
+ * Updates the lifetime metrics to the given time and sets the active state. This should be
+ * called whenever the active state of the keepalive changes.
+ *
+ * @param timeNow a timestamp obtained using Dependencies.getElapsedRealtime
+ */
+ public void updateLifetimeStatsAndSetActive(long timeNow, boolean keepaliveActive) {
+ final int durationIncrease = (int) (timeNow - mLastUpdateLifetimeTimestamp);
+ mLifetimeMs += durationIncrease;
+ if (mKeepaliveActive) mActiveLifetimeMs += durationIncrease;
+
+ mLastUpdateLifetimeTimestamp = timeNow;
+ mKeepaliveActive = keepaliveActive;
+ }
+
+ /**
+ * Resets the lifetime metrics but does not reset the active/stopped state of the keepalive.
+ * This also updates the time to timeNow, ensuring stats will start from this time.
+ *
+ * @param timeNow a timestamp obtained using Dependencies.getElapsedRealtime
+ */
+ public void resetLifetimeStats(long timeNow) {
+ mLifetimeMs = 0;
+ mActiveLifetimeMs = 0;
+ mLastUpdateLifetimeTimestamp = timeNow;
+ }
+ }
+
+ // List of duration stats metric where the index is the number of concurrent keepalives.
+ // Each DurationForNumOfKeepalive message stores a registered duration and an active duration.
+ // Registered duration is the total time spent with mNumRegisteredKeepalive == index.
+ // Active duration is the total time spent with mNumActiveKeepalive == index.
+ private final List<DurationForNumOfKeepalive.Builder> mDurationPerNumOfKeepalive =
+ new ArrayList<>();
+
+ // Map of keepalives identified by the id from getKeepaliveId to their stats information.
+ private final SparseArray<KeepaliveStats> mKeepaliveStatsPerId = new SparseArray<>();
+
+ // Generate a unique integer using a given network's netId and the slot number.
+ // This is possible because netId is a 16 bit integer, so an integer with the first 16 bits as
+ // the netId and the last 16 bits as the slot number can be created. This allows slot numbers to
+ // be up to 2^16.
+ private int getKeepaliveId(@NonNull Network network, int slot) {
+ final int netId = network.getNetId();
+ if (netId < 0 || netId >= (1 << 16)) {
+ throw new IllegalArgumentException("Unexpected netId value: " + netId);
+ }
+ if (slot < 0 || slot >= (1 << 16)) {
+ throw new IllegalArgumentException("Unexpected slot value: " + slot);
+ }
+
+ return (netId << 16) + slot;
+ }
+
+ // Class to act as the key to aggregate the KeepaliveLifetimeForCarrier stats.
+ private static final class LifetimeKey {
+ public final int carrierId;
+ public final int transportTypes;
+ public final int intervalMs;
+
+ LifetimeKey(int carrierId, int transportTypes, int intervalMs) {
+ this.carrierId = carrierId;
+ this.transportTypes = transportTypes;
+ this.intervalMs = intervalMs;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+
+ final LifetimeKey that = (LifetimeKey) o;
+
+ return carrierId == that.carrierId && transportTypes == that.transportTypes
+ && intervalMs == that.intervalMs;
+ }
+
+ @Override
+ public int hashCode() {
+ return carrierId + 3 * transportTypes + 5 * intervalMs;
+ }
+ }
+
+ // Map to aggregate the KeepaliveLifetimeForCarrier stats using LifetimeKey as the key.
+ final Map<LifetimeKey, KeepaliveLifetimeForCarrier.Builder> mAggregateKeepaliveLifetime =
+ new HashMap<>();
+
+ private final Set<Integer> mAppUids = new HashSet<Integer>();
+ private int mNumKeepaliveRequests = 0;
+ private int mNumAutomaticKeepaliveRequests = 0;
+
+ private int mNumRegisteredKeepalive = 0;
+ private int mNumActiveKeepalive = 0;
+
+ // A timestamp of the most recent time the duration metrics was updated.
+ private long mLastUpdateDurationsTimestamp;
+
+ /** Dependency class */
+ @VisibleForTesting
+ public static class Dependencies {
+ // Returns a timestamp with the time base of SystemClock.elapsedRealtime to keep durations
+ // relative to start time and avoid timezone change, including time spent in deep sleep.
+ public long getElapsedRealtime() {
+ return SystemClock.elapsedRealtime();
+ }
+ }
+
+ public KeepaliveStatsTracker(@NonNull Context context, @NonNull Handler handler) {
+ this(context, handler, new Dependencies());
+ }
+
+ @VisibleForTesting
+ public KeepaliveStatsTracker(
+ @NonNull Context context,
+ @NonNull Handler handler,
+ @NonNull Dependencies dependencies) {
+ Objects.requireNonNull(context);
+ mDependencies = Objects.requireNonNull(dependencies);
+ mConnectivityServiceHandler = Objects.requireNonNull(handler);
+
+ final SubscriptionManager subscriptionManager =
+ Objects.requireNonNull(context.getSystemService(SubscriptionManager.class));
+
+ mLastUpdateDurationsTimestamp = mDependencies.getElapsedRealtime();
+ context.registerReceiver(
+ new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ mCachedDefaultSubscriptionId =
+ intent.getIntExtra(
+ SubscriptionManager.EXTRA_SUBSCRIPTION_INDEX,
+ SubscriptionManager.INVALID_SUBSCRIPTION_ID);
+ }
+ },
+ new IntentFilter(SubscriptionManager.ACTION_DEFAULT_SUBSCRIPTION_CHANGED),
+ /* broadcastPermission= */ null,
+ mConnectivityServiceHandler);
+
+ // The default constructor for OnSubscriptionsChangedListener will always implicitly grab
+ // the looper of the current thread. In the case the current thread does not have a looper,
+ // this will throw. Therefore, post a runnable that creates it there.
+ // When the callback is called on the BackgroundThread, post a message on the CS handler
+ // thread to update the caches, which can only be touched there.
+ BackgroundThread.getHandler().post(() ->
+ subscriptionManager.addOnSubscriptionsChangedListener(
+ r -> r.run(), new OnSubscriptionsChangedListener() {
+ @Override
+ public void onSubscriptionsChanged() {
+ final List<SubscriptionInfo> activeSubInfoList =
+ subscriptionManager.getActiveSubscriptionInfoList();
+ // A null subInfo list here indicates the current state is unknown
+ // but not necessarily empty, simply ignore it. Another call to the
+ // listener will be invoked in the future.
+ if (activeSubInfoList == null) return;
+ mConnectivityServiceHandler.post(() -> {
+ mCachedCarrierIdPerSubId.clear();
+
+ for (final SubscriptionInfo subInfo : activeSubInfoList) {
+ mCachedCarrierIdPerSubId.put(subInfo.getSubscriptionId(),
+ subInfo.getCarrierId());
+ }
+ });
+ }
+ }));
+ }
+
+ /** Ensures the list of duration metrics is large enough for number of registered keepalives. */
+ private void ensureDurationPerNumOfKeepaliveSize() {
+ if (mNumActiveKeepalive < 0 || mNumRegisteredKeepalive < 0) {
+ throw new IllegalStateException(
+ "Number of active or registered keepalives is negative");
+ }
+ if (mNumActiveKeepalive > mNumRegisteredKeepalive) {
+ throw new IllegalStateException(
+ "Number of active keepalives greater than registered keepalives");
+ }
+
+ while (mDurationPerNumOfKeepalive.size() <= mNumRegisteredKeepalive) {
+ final DurationForNumOfKeepalive.Builder durationForNumOfKeepalive =
+ DurationForNumOfKeepalive.newBuilder();
+ durationForNumOfKeepalive.setNumOfKeepalive(mDurationPerNumOfKeepalive.size());
+ durationForNumOfKeepalive.setKeepaliveRegisteredDurationsMsec(0);
+ durationForNumOfKeepalive.setKeepaliveActiveDurationsMsec(0);
+
+ mDurationPerNumOfKeepalive.add(durationForNumOfKeepalive);
+ }
+ }
+
+ /**
+ * Updates the durations metrics to the given time. This should always be called before making a
+ * change to mNumRegisteredKeepalive or mNumActiveKeepalive to keep the duration metrics
+ * correct.
+ *
+ * @param timeNow a timestamp obtained using Dependencies.getElapsedRealtime
+ */
+ private void updateDurationsPerNumOfKeepalive(long timeNow) {
+ if (mDurationPerNumOfKeepalive.size() < mNumRegisteredKeepalive) {
+ Log.e(TAG, "Unexpected jump in number of registered keepalive");
+ }
+ ensureDurationPerNumOfKeepaliveSize();
+
+ final int durationIncrease = (int) (timeNow - mLastUpdateDurationsTimestamp);
+ final DurationForNumOfKeepalive.Builder durationForNumOfRegisteredKeepalive =
+ mDurationPerNumOfKeepalive.get(mNumRegisteredKeepalive);
+
+ durationForNumOfRegisteredKeepalive.setKeepaliveRegisteredDurationsMsec(
+ durationForNumOfRegisteredKeepalive.getKeepaliveRegisteredDurationsMsec()
+ + durationIncrease);
+
+ final DurationForNumOfKeepalive.Builder durationForNumOfActiveKeepalive =
+ mDurationPerNumOfKeepalive.get(mNumActiveKeepalive);
+
+ durationForNumOfActiveKeepalive.setKeepaliveActiveDurationsMsec(
+ durationForNumOfActiveKeepalive.getKeepaliveActiveDurationsMsec()
+ + durationIncrease);
+
+ mLastUpdateDurationsTimestamp = timeNow;
+ }
+
+ // TODO: Move this function to frameworks/libs/net/.../NetworkCapabilitiesUtils.java
+ private static int getSubId(@NonNull NetworkCapabilities nc, int defaultSubId) {
+ if (nc.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)) {
+ final NetworkSpecifier networkSpecifier = nc.getNetworkSpecifier();
+ if (networkSpecifier instanceof TelephonyNetworkSpecifier) {
+ return ((TelephonyNetworkSpecifier) networkSpecifier).getSubscriptionId();
+ }
+ // Use the default subscriptionId.
+ return defaultSubId;
+ }
+ if (nc.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)) {
+ final TransportInfo info = nc.getTransportInfo();
+ if (info instanceof WifiInfo) {
+ return ((WifiInfo) info).getSubscriptionId();
+ }
+ }
+
+ return SubscriptionManager.INVALID_SUBSCRIPTION_ID;
+ }
+
+ private int getCarrierId(@NonNull NetworkCapabilities networkCapabilities) {
+ // Try to get the correct subscription id.
+ final int subId = getSubId(networkCapabilities, mCachedDefaultSubscriptionId);
+ if (subId == SubscriptionManager.INVALID_SUBSCRIPTION_ID) {
+ return TelephonyManager.UNKNOWN_CARRIER_ID;
+ }
+ return mCachedCarrierIdPerSubId.get(subId, TelephonyManager.UNKNOWN_CARRIER_ID);
+ }
+
+ private int getTransportTypes(@NonNull NetworkCapabilities networkCapabilities) {
+ // Transport types are internally packed as bits starting from bit 0. Casting to int works
+ // fine since for now and the foreseeable future, there will be less than 32 transports.
+ return (int) networkCapabilities.getTransportTypesInternal();
+ }
+
+ /** Inform the KeepaliveStatsTracker a keepalive has just started and is active. */
+ public void onStartKeepalive(
+ @NonNull Network network,
+ int slot,
+ @NonNull NetworkCapabilities nc,
+ int intervalSeconds,
+ int appUid,
+ boolean isAutoKeepalive) {
+ ensureRunningOnHandlerThread();
+ final int keepaliveId = getKeepaliveId(network, slot);
+ if (mKeepaliveStatsPerId.contains(keepaliveId)) {
+ throw new IllegalArgumentException(
+ "Attempt to start keepalive stats on a known network, slot pair");
+ }
+
+ mNumKeepaliveRequests++;
+ if (isAutoKeepalive) mNumAutomaticKeepaliveRequests++;
+ mAppUids.add(appUid);
+
+ final long timeNow = mDependencies.getElapsedRealtime();
+ updateDurationsPerNumOfKeepalive(timeNow);
+
+ mNumRegisteredKeepalive++;
+ mNumActiveKeepalive++;
+
+ final KeepaliveStats newKeepaliveStats =
+ new KeepaliveStats(
+ getCarrierId(nc),
+ getTransportTypes(nc),
+ intervalSeconds,
+ appUid,
+ isAutoKeepalive,
+ timeNow);
+
+ mKeepaliveStatsPerId.put(keepaliveId, newKeepaliveStats);
+ }
+
+ /**
+ * Inform the KeepaliveStatsTracker that the keepalive with the given network, slot pair has
+ * updated its active state to keepaliveActive.
+ *
+ * @return the KeepaliveStats associated with the network, slot pair or null if it is unknown.
+ */
+ private @NonNull KeepaliveStats onKeepaliveActive(
+ @NonNull Network network, int slot, boolean keepaliveActive) {
+ final long timeNow = mDependencies.getElapsedRealtime();
+ return onKeepaliveActive(network, slot, keepaliveActive, timeNow);
+ }
+
+ /**
+ * Inform the KeepaliveStatsTracker that the keepalive with the given network, slot pair has
+ * updated its active state to keepaliveActive.
+ *
+ * @param network the network of the keepalive
+ * @param slot the slot number of the keepalive
+ * @param keepaliveActive the new active state of the keepalive
+ * @param timeNow a timestamp obtained using Dependencies.getElapsedRealtime
+ * @return the KeepaliveStats associated with the network, slot pair or null if it is unknown.
+ */
+ private @NonNull KeepaliveStats onKeepaliveActive(
+ @NonNull Network network, int slot, boolean keepaliveActive, long timeNow) {
+ ensureRunningOnHandlerThread();
+
+ final int keepaliveId = getKeepaliveId(network, slot);
+ if (!mKeepaliveStatsPerId.contains(keepaliveId)) {
+ throw new IllegalArgumentException(
+ "Attempt to set active keepalive on an unknown network, slot pair");
+ }
+ updateDurationsPerNumOfKeepalive(timeNow);
+
+ final KeepaliveStats keepaliveStats = mKeepaliveStatsPerId.get(keepaliveId);
+ if (keepaliveActive != keepaliveStats.isKeepaliveActive()) {
+ mNumActiveKeepalive += keepaliveActive ? 1 : -1;
+ }
+
+ keepaliveStats.updateLifetimeStatsAndSetActive(timeNow, keepaliveActive);
+ return keepaliveStats;
+ }
+
+ /** Inform the KeepaliveStatsTracker a keepalive has just been paused. */
+ public void onPauseKeepalive(@NonNull Network network, int slot) {
+ onKeepaliveActive(network, slot, /* keepaliveActive= */ false);
+ }
+
+ /** Inform the KeepaliveStatsTracker a keepalive has just been resumed. */
+ public void onResumeKeepalive(@NonNull Network network, int slot) {
+ onKeepaliveActive(network, slot, /* keepaliveActive= */ true);
+ }
+
+ /** Inform the KeepaliveStatsTracker a keepalive has just been stopped. */
+ public void onStopKeepalive(@NonNull Network network, int slot) {
+ final int keepaliveId = getKeepaliveId(network, slot);
+ final long timeNow = mDependencies.getElapsedRealtime();
+
+ final KeepaliveStats keepaliveStats =
+ onKeepaliveActive(network, slot, /* keepaliveActive= */ false, timeNow);
+
+ mNumRegisteredKeepalive--;
+
+ // add to the aggregate since it will be removed.
+ addToAggregateKeepaliveLifetime(keepaliveStats, timeNow);
+ // free up the slot.
+ mKeepaliveStatsPerId.remove(keepaliveId);
+ }
+
+ /**
+ * Updates and adds the lifetime metric of keepaliveStats to the aggregate.
+ *
+ * @param keepaliveStats the stats to add to the aggregate
+ * @param timeNow a timestamp obtained using Dependencies.getElapsedRealtime
+ */
+ private void addToAggregateKeepaliveLifetime(
+ @NonNull KeepaliveStats keepaliveStats, long timeNow) {
+
+ final KeepaliveStats.LifetimeStats lifetimeStats =
+ keepaliveStats.getAndResetLifetimeStats(timeNow);
+
+ final LifetimeKey key =
+ new LifetimeKey(
+ keepaliveStats.carrierId,
+ keepaliveStats.transportTypes,
+ keepaliveStats.intervalMs);
+
+ KeepaliveLifetimeForCarrier.Builder keepaliveLifetimeForCarrier =
+ mAggregateKeepaliveLifetime.get(key);
+
+ if (keepaliveLifetimeForCarrier == null) {
+ keepaliveLifetimeForCarrier =
+ KeepaliveLifetimeForCarrier.newBuilder()
+ .setCarrierId(keepaliveStats.carrierId)
+ .setTransportTypes(keepaliveStats.transportTypes)
+ .setIntervalsMsec(keepaliveStats.intervalMs);
+ mAggregateKeepaliveLifetime.put(key, keepaliveLifetimeForCarrier);
+ }
+
+ keepaliveLifetimeForCarrier.setLifetimeMsec(
+ keepaliveLifetimeForCarrier.getLifetimeMsec() + lifetimeStats.lifetimeMs);
+ keepaliveLifetimeForCarrier.setActiveLifetimeMsec(
+ keepaliveLifetimeForCarrier.getActiveLifetimeMsec()
+ + lifetimeStats.activeLifetimeMs);
+ }
+
+ /**
+ * Builds and returns DailykeepaliveInfoReported proto.
+ *
+ * @return the DailykeepaliveInfoReported proto that was built.
+ */
+ @VisibleForTesting
+ public @NonNull DailykeepaliveInfoReported buildKeepaliveMetrics() {
+ ensureRunningOnHandlerThread();
+ final long timeNow = mDependencies.getElapsedRealtime();
+ return buildKeepaliveMetrics(timeNow);
+ }
+
+ /**
+ * Updates the metrics to timeNow and builds and returns DailykeepaliveInfoReported proto.
+ *
+ * @param timeNow a timestamp obtained using Dependencies.getElapsedRealtime
+ */
+ private @NonNull DailykeepaliveInfoReported buildKeepaliveMetrics(long timeNow) {
+ updateDurationsPerNumOfKeepalive(timeNow);
+
+ final DurationPerNumOfKeepalive.Builder durationPerNumOfKeepalive =
+ DurationPerNumOfKeepalive.newBuilder();
+
+ mDurationPerNumOfKeepalive.forEach(
+ durationForNumOfKeepalive ->
+ durationPerNumOfKeepalive.addDurationForNumOfKeepalive(
+ durationForNumOfKeepalive));
+
+ final KeepaliveLifetimePerCarrier.Builder keepaliveLifetimePerCarrier =
+ KeepaliveLifetimePerCarrier.newBuilder();
+
+ for (int i = 0; i < mKeepaliveStatsPerId.size(); i++) {
+ final KeepaliveStats keepaliveStats = mKeepaliveStatsPerId.valueAt(i);
+ addToAggregateKeepaliveLifetime(keepaliveStats, timeNow);
+ }
+
+ // Fill keepalive carrier stats to the proto
+ mAggregateKeepaliveLifetime
+ .values()
+ .forEach(
+ keepaliveLifetimeForCarrier ->
+ keepaliveLifetimePerCarrier.addKeepaliveLifetimeForCarrier(
+ keepaliveLifetimeForCarrier));
+
+ final DailykeepaliveInfoReported.Builder dailyKeepaliveInfoReported =
+ DailykeepaliveInfoReported.newBuilder();
+
+ dailyKeepaliveInfoReported.setDurationPerNumOfKeepalive(durationPerNumOfKeepalive);
+ dailyKeepaliveInfoReported.setKeepaliveLifetimePerCarrier(keepaliveLifetimePerCarrier);
+ dailyKeepaliveInfoReported.setKeepaliveRequests(mNumKeepaliveRequests);
+ dailyKeepaliveInfoReported.setAutomaticKeepaliveRequests(mNumAutomaticKeepaliveRequests);
+ dailyKeepaliveInfoReported.setDistinctUserCount(mAppUids.size());
+ dailyKeepaliveInfoReported.addAllUid(mAppUids);
+
+ return dailyKeepaliveInfoReported.build();
+ }
+
+ /**
+ * Builds and resets the stored metrics. Similar to buildKeepaliveMetrics but also resets the
+ * metrics while maintaining the state of the keepalives.
+ *
+ * @return the DailykeepaliveInfoReported proto that was built.
+ */
+ @VisibleForTesting
+ public @NonNull DailykeepaliveInfoReported buildAndResetMetrics() {
+ ensureRunningOnHandlerThread();
+ final long timeNow = mDependencies.getElapsedRealtime();
+
+ final DailykeepaliveInfoReported metrics = buildKeepaliveMetrics(timeNow);
+
+ mDurationPerNumOfKeepalive.clear();
+ mAggregateKeepaliveLifetime.clear();
+ mAppUids.clear();
+ mNumKeepaliveRequests = 0;
+ mNumAutomaticKeepaliveRequests = 0;
+
+ // Update the metrics with the existing keepalives.
+ ensureDurationPerNumOfKeepaliveSize();
+
+ mAggregateKeepaliveLifetime.clear();
+ // Reset the stats for existing keepalives
+ for (int i = 0; i < mKeepaliveStatsPerId.size(); i++) {
+ final KeepaliveStats keepaliveStats = mKeepaliveStatsPerId.valueAt(i);
+ keepaliveStats.resetLifetimeStats(timeNow);
+ mAppUids.add(keepaliveStats.appUid);
+ mNumKeepaliveRequests++;
+ if (keepaliveStats.isAutoKeepalive) mNumAutomaticKeepaliveRequests++;
+ }
+
+ return metrics;
+ }
+
+ /** Writes the stored metrics to ConnectivityStatsLog and resets. */
+ public void writeAndResetMetrics() {
+ ensureRunningOnHandlerThread();
+ final DailykeepaliveInfoReported dailyKeepaliveInfoReported = buildAndResetMetrics();
+ ConnectivityStatsLog.write(
+ ConnectivityStatsLog.DAILY_KEEPALIVE_INFO_REPORTED,
+ dailyKeepaliveInfoReported.getDurationPerNumOfKeepalive().toByteArray(),
+ dailyKeepaliveInfoReported.getKeepaliveLifetimePerCarrier().toByteArray(),
+ dailyKeepaliveInfoReported.getKeepaliveRequests(),
+ dailyKeepaliveInfoReported.getAutomaticKeepaliveRequests(),
+ dailyKeepaliveInfoReported.getDistinctUserCount(),
+ CollectionUtils.toIntArray(dailyKeepaliveInfoReported.getUidList()));
+ }
+
+ private void ensureRunningOnHandlerThread() {
+ if (mConnectivityServiceHandler.getLooper().getThread() != Thread.currentThread()) {
+ throw new IllegalStateException(
+ "Not running on handler thread: " + Thread.currentThread().getName());
+ }
+ }
+}
diff --git a/service/src/com/android/server/connectivity/KeepaliveTracker.java b/service/src/com/android/server/connectivity/KeepaliveTracker.java
index 06294db..76e97e2 100644
--- a/service/src/com/android/server/connectivity/KeepaliveTracker.java
+++ b/service/src/com/android/server/connectivity/KeepaliveTracker.java
@@ -37,7 +37,6 @@
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.content.Context;
-import android.net.ConnectivityResources;
import android.net.ISocketKeepaliveCallback;
import android.net.InetAddresses;
import android.net.InvalidPacketException;
@@ -55,7 +54,6 @@
import android.system.ErrnoException;
import android.system.Os;
import android.util.Log;
-import android.util.Pair;
import com.android.connectivity.resources.R;
import com.android.internal.annotations.VisibleForTesting;
@@ -106,14 +104,21 @@
// Allowed unprivileged keepalive slots per uid. Caller's permission will be enforced if
// the number of remaining keepalive slots is less than or equal to the threshold.
private final int mAllowedUnprivilegedSlotsForUid;
-
+ private final Dependencies mDependencies;
public KeepaliveTracker(Context context, Handler handler) {
- mTcpController = new TcpKeepaliveController(handler);
+ this(context, handler, new TcpKeepaliveController(handler), new Dependencies());
+ }
+
+ @VisibleForTesting
+ KeepaliveTracker(Context context, Handler handler, TcpKeepaliveController tcpController,
+ Dependencies deps) {
+ mTcpController = tcpController;
mContext = context;
+ mDependencies = deps;
- mSupportedKeepalives = KeepaliveUtils.getSupportedKeepalives(mContext);
+ mSupportedKeepalives = mDependencies.getSupportedKeepalives(mContext);
- final ConnectivityResources res = new ConnectivityResources(mContext);
+ final ConnectivityResources res = mDependencies.createConnectivityResources(mContext);
mReservedPrivilegedSlots = res.get().getInteger(
R.integer.config_reservedPrivilegedKeepaliveSlots);
mAllowedUnprivilegedSlotsForUid = res.get().getInteger(
@@ -145,8 +150,9 @@
public static final int TYPE_TCP = 2;
// Keepalive slot. A small integer that identifies this keepalive among the ones handled
- // by this network.
- private int mSlot = NO_KEEPALIVE;
+ // by this network. This is initialized to NO_KEEPALIVE for new keepalives, but to the
+ // old slot for resumed keepalives.
+ private int mSlot;
// Packet data.
private final KeepalivePacketData mPacket;
@@ -166,25 +172,30 @@
int interval,
int type,
@Nullable FileDescriptor fd) throws InvalidSocketException {
- this(callback, nai, packet, interval, type, fd, false /* resumed */);
+ this(callback, nai, packet, Binder.getCallingPid(), Binder.getCallingUid(), interval,
+ type, fd, NO_KEEPALIVE /* slot */, false /* resumed */);
}
KeepaliveInfo(@NonNull ISocketKeepaliveCallback callback,
@NonNull NetworkAgentInfo nai,
@NonNull KeepalivePacketData packet,
+ int pid,
+ int uid,
int interval,
int type,
@Nullable FileDescriptor fd,
+ int slot,
boolean resumed) throws InvalidSocketException {
mCallback = callback;
- mPid = Binder.getCallingPid();
- mUid = Binder.getCallingUid();
+ mPid = pid;
+ mUid = uid;
mPrivileged = (PERMISSION_GRANTED == mContext.checkPermission(PERMISSION, mPid, mUid));
mNai = nai;
mPacket = packet;
mInterval = interval;
mType = type;
+ mSlot = slot;
mResumed = resumed;
// For SocketKeepalive, a dup of fd is kept in mFd so the source port from which the
@@ -264,6 +275,14 @@
return mSlot;
}
+ int getKeepaliveIntervalSec() {
+ return mInterval;
+ }
+
+ public int getUid() {
+ return mUid;
+ }
+
private int checkNetworkConnected() {
if (!mNai.networkInfo.isConnectedOrConnecting()) {
return ERROR_INVALID_NETWORK;
@@ -334,7 +353,12 @@
return SUCCESS;
}
- private int isValid() {
+ /**
+ * Checks if the keepalive info is valid to start.
+ *
+ * @return SUCCESS if the keepalive is valid and the error reason otherwise.
+ */
+ public int isValid() {
synchronized (mNai) {
int error = checkInterval();
if (error == SUCCESS) error = checkLimit();
@@ -345,11 +369,17 @@
}
}
- void start(int slot) {
+ /**
+ * Attempt to start the keepalive on the given slot.
+ *
+ * @param slot the slot to start the keepalive on.
+ * @return SUCCESS if the keepalive is successfully starting and the error reason otherwise.
+ */
+ int start(int slot) {
// BINDER_DIED can happen if the binder died before the KeepaliveInfo was created and
// the constructor set the state to BINDER_DIED. If that's the case, the KI is already
// cleaned up.
- if (BINDER_DIED == mStartedState) return;
+ if (BINDER_DIED == mStartedState) return BINDER_DIED;
mSlot = slot;
int error = isValid();
if (error == SUCCESS) {
@@ -362,10 +392,10 @@
break;
case TYPE_TCP:
try {
- mTcpController.startSocketMonitor(mFd, this, mSlot);
+ mTcpController.startSocketMonitor(mFd, mCallback, mSlot);
} catch (InvalidSocketException e) {
handleStopKeepalive(mNai, mSlot, ERROR_INVALID_SOCKET);
- return;
+ return ERROR_INVALID_SOCKET;
}
final TcpKeepalivePacketData tcpData = (TcpKeepalivePacketData) mPacket;
mNai.onAddTcpKeepalivePacketFilter(slot, tcpData);
@@ -374,13 +404,14 @@
break;
default:
Log.wtf(TAG, "Starting keepalive with unknown type: " + mType);
- handleStopKeepalive(mNai, mSlot, error);
- return;
+ handleStopKeepalive(mNai, mSlot, ERROR_UNSUPPORTED);
+ return ERROR_UNSUPPORTED;
}
mStartedState = STARTING;
+ return SUCCESS;
} else {
handleStopKeepalive(mNai, mSlot, error);
- return;
+ return error;
}
}
@@ -441,16 +472,12 @@
}
}
- void onFileDescriptorInitiatedStop(final int socketKeepaliveReason) {
- handleStopKeepalive(mNai, mSlot, socketKeepaliveReason);
- }
-
/**
* Construct a new KeepaliveInfo from existing KeepaliveInfo with a new fd.
*/
public KeepaliveInfo withFd(@NonNull FileDescriptor fd) throws InvalidSocketException {
- return new KeepaliveInfo(mCallback, mNai, mPacket, mInterval, mType, fd,
- true /* resumed */);
+ return new KeepaliveInfo(mCallback, mNai, mPacket, mPid, mUid, mInterval, mType,
+ fd, mSlot, true /* resumed */);
}
}
@@ -483,12 +510,17 @@
/**
* Handle start keepalives with the message.
+ *
+ * @param ki the keepalive to start.
+ * @return SUCCESS if the keepalive is successfully starting and the error reason otherwise.
*/
- public void handleStartKeepalive(KeepaliveInfo ki) {
+ public int handleStartKeepalive(KeepaliveInfo ki) {
NetworkAgentInfo nai = ki.getNai();
- int slot = findFirstFreeSlot(nai);
+ // If this was a paused keepalive, then reuse the same slot that was kept for it. Otherwise,
+ // use the first free slot for this network agent.
+ final int slot = NO_KEEPALIVE != ki.mSlot ? ki.mSlot : findFirstFreeSlot(nai);
mKeepalives.get(nai).put(slot, ki);
- ki.start(slot);
+ return ki.start(slot);
}
public void handleStopAllKeepalives(NetworkAgentInfo nai, int reason) {
@@ -496,6 +528,12 @@
if (networkKeepalives != null) {
final ArrayList<KeepaliveInfo> kalist = new ArrayList(networkKeepalives.values());
for (KeepaliveInfo ki : kalist) {
+ // If the keepalive is paused, then it is already stopped with the hardware and so
+ // continue. Note that to send the appropriate stop reason callback,
+ // AutomaticOnOffKeepaliveTracker will call finalizePausedKeepalive which will also
+ // finally remove this keepalive slot from the array.
+ if (ki.mStopReason == SUCCESS_PAUSED) continue;
+
ki.stop(reason);
// Clean up keepalives since the network agent is disconnected and unable to pass
// back asynchronous result of stop().
@@ -534,17 +572,22 @@
return;
}
- // Remove the keepalive from hash table so the slot can be considered available when reusing
- // it.
- networkKeepalives.remove(slot);
- Log.d(TAG, "Remove keepalive " + slot + " on " + networkName + ", "
- + networkKeepalives.size() + " remains.");
+ // If the keepalive was stopped for good, remove it from the hash table so the slot can
+ // be considered available when reusing it. If it was only a pause, let it sit in the map
+ // so it sits on the slot.
+ final int reason = ki.mStopReason;
+ if (reason != SUCCESS_PAUSED) {
+ networkKeepalives.remove(slot);
+ Log.d(TAG, "Remove keepalive " + slot + " on " + networkName + ", "
+ + networkKeepalives.size() + " remains.");
+ } else {
+ Log.d(TAG, "Pause keepalive " + slot + " on " + networkName + ", keep slot reserved");
+ }
if (networkKeepalives.isEmpty()) {
mKeepalives.remove(nai);
}
// Notify app that the keepalive is stopped.
- final int reason = ki.mStopReason;
if (reason == SUCCESS) {
try {
ki.mCallback.onStopped();
@@ -566,7 +609,20 @@
} else if (reason == ERROR_STOP_REASON_UNINITIALIZED) {
throw new IllegalStateException("Unexpected stop reason: " + reason);
} else if (reason == ERROR_NO_SUCH_SLOT) {
- throw new IllegalStateException("No such slot: " + reason);
+ // There are multiple independent reasons a keepalive can stop. Some
+ // are software (e.g. the app stops the keepalive) and some are hardware
+ // (e.g. the SIM card gets removed). Therefore, there is a very low
+ // probability that both of these happen at the same time, which would
+ // result in the first stop attempt returning SUCCESS and the second
+ // stop attempt returning NO_SUCH_SLOT. Such a race condition can be
+ // ignored with a log.
+ // This should still be reported because if it happens with any frequency
+ // it probably means there is a bug where the system server is trying
+ // to use a non-existing hardware slot.
+ // TODO : separate the non-existing hardware slot from the case where
+ // there is no keepalive running on this slot.
+ Log.wtf(TAG, "Keepalive on slot " + slot + " can't be stopped : " + reason);
+ notifyErrorCallback(ki.mCallback, reason);
} else {
notifyErrorCallback(ki.mCallback, reason);
}
@@ -577,40 +633,41 @@
/**
* Finalize a paused keepalive.
*
- * This will simply send the onStopped() callback after checking that this keepalive is
- * indeed paused.
+ * This will send the appropriate callback after checking that this keepalive is indeed paused,
+ * and free the slot.
*
* @param ki the keepalive to finalize
+ * @param reason the reason the keepalive is stopped
*/
- public void finalizePausedKeepalive(@NonNull final KeepaliveInfo ki) {
+ public void finalizePausedKeepalive(@NonNull final KeepaliveInfo ki, int reason) {
if (SUCCESS_PAUSED != ki.mStopReason) {
throw new IllegalStateException("Keepalive is not paused");
}
- try {
- ki.mCallback.onStopped();
- } catch (RemoteException e) {
- Log.w(TAG, "Discarded onStopped callback while finalizing paused keepalive");
+ if (reason == SUCCESS) {
+ try {
+ ki.mCallback.onStopped();
+ } catch (RemoteException e) {
+ Log.w(TAG, "Discarded onStopped callback while finalizing paused keepalive");
+ }
+ } else {
+ notifyErrorCallback(ki.mCallback, reason);
}
+
+ final HashMap<Integer, KeepaliveInfo> networkKeepalives = mKeepalives.get(ki.mNai);
+ if (networkKeepalives == null) {
+ Log.e(TAG, "Attempt to finalize keepalive on nonexistent network " + ki.mNai);
+ return;
+ }
+ networkKeepalives.remove(ki.mSlot);
}
- public void handleCheckKeepalivesStillValid(NetworkAgentInfo nai) {
- HashMap <Integer, KeepaliveInfo> networkKeepalives = mKeepalives.get(nai);
- if (networkKeepalives != null) {
- ArrayList<Pair<Integer, Integer>> invalidKeepalives = new ArrayList<>();
- for (int slot : networkKeepalives.keySet()) {
- int error = networkKeepalives.get(slot).isValid();
- if (error != SUCCESS) {
- invalidKeepalives.add(Pair.create(slot, error));
- }
- }
- for (Pair<Integer, Integer> slotAndError: invalidKeepalives) {
- handleStopKeepalive(nai, slotAndError.first, slotAndError.second);
- }
- }
- }
-
- /** Handle keepalive events from lower layer. */
- public void handleEventSocketKeepalive(@NonNull NetworkAgentInfo nai, int slot, int reason) {
+ /**
+ * Handle keepalive events from lower layer.
+ *
+ * @return false if the event caused handleStopKeepalive to be called, i.e. the keepalive is
+ * forced to stop. Otherwise, return true.
+ */
+ public boolean handleEventSocketKeepalive(@NonNull NetworkAgentInfo nai, int slot, int reason) {
KeepaliveInfo ki = null;
try {
ki = mKeepalives.get(nai).get(slot);
@@ -618,7 +675,7 @@
if (ki == null) {
Log.e(TAG, "Event " + NetworkAgent.EVENT_SOCKET_KEEPALIVE + "," + slot + "," + reason
+ " for unknown keepalive " + slot + " on " + nai.toShortString());
- return;
+ return true;
}
// This can be called in a number of situations :
@@ -651,11 +708,13 @@
Log.w(TAG, "Discarded " + (ki.mResumed ? "onResumed" : "onStarted")
+ " callback for slot " + slot);
}
+ return true;
} else {
Log.d(TAG, "Failed to start keepalive " + slot + " on " + nai.toShortString()
+ ": " + reason);
// The message indicated some error trying to start: do call handleStopKeepalive.
handleStopKeepalive(nai, slot, reason);
+ return false;
}
} else if (KeepaliveInfo.STOPPING == ki.mStartedState) {
// The message indicated result of stopping : clean up keepalive slots.
@@ -663,9 +722,12 @@
+ " stopped: " + reason);
ki.mStartedState = KeepaliveInfo.NOT_STARTED;
cleanupStoppedKeepalive(nai, slot);
+ return true;
} else {
Log.wtf(TAG, "Event " + NetworkAgent.EVENT_SOCKET_KEEPALIVE + "," + slot + "," + reason
+ " for keepalive in wrong state: " + ki.toString());
+ // Although this is an unexpected event, the keepalive is not stopped here.
+ return true;
}
}
@@ -692,6 +754,7 @@
srcAddress = InetAddresses.parseNumericAddress(srcAddrString);
dstAddress = InetAddresses.parseNumericAddress(dstAddrString);
} catch (IllegalArgumentException e) {
+ Log.e(TAG, "Fail to construct address", e);
notifyErrorCallback(cb, ERROR_INVALID_IP_ADDRESS);
return null;
}
@@ -701,6 +764,7 @@
packet = NattKeepalivePacketData.nattKeepalivePacket(
srcAddress, srcPort, dstAddress, NATT_PORT);
} catch (InvalidPacketException e) {
+ Log.e(TAG, "Fail to construct keepalive packet", e);
notifyErrorCallback(cb, e.getError());
return null;
}
@@ -833,4 +897,31 @@
}
pw.decreaseIndent();
}
+
+ /**
+ * Dependencies class for testing.
+ */
+ @VisibleForTesting
+ public static class Dependencies {
+ /**
+ * Read supported keepalive count for each transport type from overlay resource. This should
+ * be used to create a local variable store of resource customization, and set as the
+ * input for {@link getSupportedKeepalivesForNetworkCapabilities}.
+ *
+ * @param context The context to read resource from.
+ * @return An array of supported keepalive count for each transport type.
+ */
+ @NonNull
+ public int[] getSupportedKeepalives(@NonNull Context context) {
+ return KeepaliveResourceUtil.getSupportedKeepalives(context);
+ }
+
+ /**
+ * Create a new {@link ConnectivityResources}.
+ */
+ @NonNull
+ public ConnectivityResources createConnectivityResources(@NonNull Context context) {
+ return new ConnectivityResources(context);
+ }
+ }
}
diff --git a/service/src/com/android/server/connectivity/LingerMonitor.java b/service/src/com/android/server/connectivity/LingerMonitor.java
index df34ce7..8503fcc 100644
--- a/service/src/com/android/server/connectivity/LingerMonitor.java
+++ b/service/src/com/android/server/connectivity/LingerMonitor.java
@@ -25,7 +25,6 @@
import android.content.Context;
import android.content.Intent;
import android.content.res.Resources;
-import android.net.ConnectivityResources;
import android.net.NetworkCapabilities;
import android.os.SystemClock;
import android.os.UserHandle;
diff --git a/service/src/com/android/server/connectivity/MultinetworkPolicyTracker.java b/service/src/com/android/server/connectivity/MultinetworkPolicyTracker.java
index 58196f7..93018bb 100644
--- a/service/src/com/android/server/connectivity/MultinetworkPolicyTracker.java
+++ b/service/src/com/android/server/connectivity/MultinetworkPolicyTracker.java
@@ -28,7 +28,6 @@
import android.content.IntentFilter;
import android.content.res.Resources;
import android.database.ContentObserver;
-import android.net.ConnectivityResources;
import android.net.Uri;
import android.os.Build;
import android.os.Handler;
diff --git a/service/src/com/android/server/connectivity/Nat464Xlat.java b/service/src/com/android/server/connectivity/Nat464Xlat.java
index 2ac2ad3..bbf9cef 100644
--- a/service/src/com/android/server/connectivity/Nat464Xlat.java
+++ b/service/src/com/android/server/connectivity/Nat464Xlat.java
@@ -44,7 +44,9 @@
import com.android.server.ConnectivityService;
import java.io.IOException;
+import java.net.Inet4Address;
import java.net.Inet6Address;
+import java.net.UnknownHostException;
import java.util.Objects;
/**
@@ -99,11 +101,12 @@
private IpPrefix mNat64PrefixFromRa;
private String mBaseIface;
private String mIface;
- private Inet6Address mIPv6Address;
+ @VisibleForTesting
+ Inet6Address mIPv6Address;
private State mState = State.IDLE;
- private ClatCoordinator mClatCoordinator;
+ private final ClatCoordinator mClatCoordinator; // non-null iff T+
- private boolean mEnableClatOnCellular;
+ private final boolean mEnableClatOnCellular;
private boolean mPrefixDiscoveryRunning;
public Nat464Xlat(NetworkAgentInfo nai, INetd netd, IDnsResolver dnsResolver,
@@ -112,7 +115,11 @@
mNetd = netd;
mNetwork = nai;
mEnableClatOnCellular = deps.getCellular464XlatEnabled();
- mClatCoordinator = deps.getClatCoordinator(mNetd);
+ if (SdkLevel.isAtLeastT()) {
+ mClatCoordinator = deps.getClatCoordinator(mNetd);
+ } else {
+ mClatCoordinator = null;
+ }
}
/**
@@ -235,6 +242,7 @@
mNat64PrefixInUse = null;
mIface = null;
mBaseIface = null;
+ mIPv6Address = null;
if (!mPrefixDiscoveryRunning) {
setPrefix64(null);
@@ -537,6 +545,52 @@
}
/**
+ * Translate the input v4 address to v6 clat address.
+ */
+ @Nullable
+ public Inet6Address translateV4toV6(@NonNull Inet4Address addr) {
+ // Variables in Nat464Xlat should only be accessed from handler thread.
+ ensureRunningOnHandlerThread();
+ if (!isStarted()) return null;
+
+ return convertv4ToClatv6(mNat64PrefixInUse, addr);
+ }
+
+ @Nullable
+ private static Inet6Address convertv4ToClatv6(
+ @NonNull IpPrefix prefix, @NonNull Inet4Address addr) {
+ final byte[] v6Addr = new byte[16];
+ // Generate a v6 address from Nat64 prefix. Prefix should be 12 bytes long.
+ System.arraycopy(prefix.getAddress().getAddress(), 0, v6Addr, 0, 12);
+ System.arraycopy(addr.getAddress(), 0, v6Addr, 12, 4);
+
+ try {
+ return (Inet6Address) Inet6Address.getByAddress(v6Addr);
+ } catch (UnknownHostException e) {
+ Log.wtf(TAG, "getByAddress should never throw for a numeric address", e);
+ return null;
+ }
+ }
+
+ /**
+ * Get the generated v6 address of clat.
+ */
+ @Nullable
+ public Inet6Address getClatv6SrcAddress() {
+ // Variables in Nat464Xlat should only be accessed from handler thread.
+ ensureRunningOnHandlerThread();
+
+ return mIPv6Address;
+ }
+
+ private void ensureRunningOnHandlerThread() {
+ if (mNetwork.handler().getLooper().getThread() != Thread.currentThread()) {
+ throw new IllegalStateException(
+ "Not running on handler thread: " + Thread.currentThread().getName());
+ }
+ }
+
+ /**
* Dump the NAT64 xlat information.
*
* @param pw print writer.
diff --git a/service/src/com/android/server/connectivity/NetworkAgentInfo.java b/service/src/com/android/server/connectivity/NetworkAgentInfo.java
index 85282cb..08c1455 100644
--- a/service/src/com/android/server/connectivity/NetworkAgentInfo.java
+++ b/service/src/com/android/server/connectivity/NetworkAgentInfo.java
@@ -68,6 +68,8 @@
import com.android.server.ConnectivityService;
import java.io.PrintWriter;
+import java.net.Inet4Address;
+import java.net.Inet6Address;
import java.time.Instant;
import java.util.ArrayList;
import java.util.Arrays;
@@ -1033,6 +1035,22 @@
}
/**
+ * Get the generated v6 address of clat.
+ */
+ @Nullable
+ public Inet6Address getClatv6SrcAddress() {
+ return clatd.getClatv6SrcAddress();
+ }
+
+ /**
+ * Translate the input v4 address to v6 clat address.
+ */
+ @Nullable
+ public Inet6Address translateV4toClatV6(@NonNull Inet4Address addr) {
+ return clatd.translateV4toV6(addr);
+ }
+
+ /**
* Get the NetworkMonitorManager in this NetworkAgentInfo.
*
* <p>This will be null before {@link #onNetworkMonitorCreated(INetworkMonitor)} is called.
diff --git a/service/src/com/android/server/connectivity/NetworkDiagnostics.java b/service/src/com/android/server/connectivity/NetworkDiagnostics.java
index 509110d..a367d9d 100644
--- a/service/src/com/android/server/connectivity/NetworkDiagnostics.java
+++ b/service/src/com/android/server/connectivity/NetworkDiagnostics.java
@@ -18,6 +18,13 @@
import static android.system.OsConstants.*;
+import static com.android.net.module.util.NetworkStackConstants.DNS_OVER_TLS_PORT;
+import static com.android.net.module.util.NetworkStackConstants.ETHER_MTU;
+import static com.android.net.module.util.NetworkStackConstants.ICMP_HEADER_LEN;
+import static com.android.net.module.util.NetworkStackConstants.IPV4_HEADER_MIN_LEN;
+import static com.android.net.module.util.NetworkStackConstants.IPV6_HEADER_LEN;
+import static com.android.net.module.util.NetworkStackConstants.IPV6_MIN_MTU;
+
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.net.InetAddresses;
@@ -33,6 +40,7 @@
import android.system.Os;
import android.system.StructTimeval;
import android.text.TextUtils;
+import android.util.Log;
import android.util.Pair;
import com.android.internal.util.IndentingPrintWriter;
@@ -172,7 +180,7 @@
}
}
- private final Map<InetAddress, Measurement> mIcmpChecks = new HashMap<>();
+ private final Map<Pair<InetAddress, Integer>, Measurement> mIcmpChecks = new HashMap<>();
private final Map<Pair<InetAddress, InetAddress>, Measurement> mExplicitSourceIcmpChecks =
new HashMap<>();
private final Map<InetAddress, Measurement> mDnsUdpChecks = new HashMap<>();
@@ -205,17 +213,22 @@
mLinkProperties.addDnsServer(TEST_DNS6);
}
+ final int lpMtu = mLinkProperties.getMtu();
+ final int mtu = lpMtu > 0 ? lpMtu : ETHER_MTU;
for (RouteInfo route : mLinkProperties.getRoutes()) {
if (route.getType() == RouteInfo.RTN_UNICAST && route.hasGateway()) {
InetAddress gateway = route.getGateway();
- prepareIcmpMeasurement(gateway);
+ // Use mtu in the route if exists. Otherwise, use the one in the link property.
+ final int routeMtu = route.getMtu();
+ prepareIcmpMeasurements(gateway, (routeMtu > 0) ? routeMtu : mtu);
if (route.isIPv6Default()) {
prepareExplicitSourceIcmpMeasurements(gateway);
}
}
}
+
for (InetAddress nameserver : mLinkProperties.getDnsServers()) {
- prepareIcmpMeasurement(nameserver);
+ prepareIcmpMeasurements(nameserver, mtu);
prepareDnsMeasurement(nameserver);
// Unlike the DnsResolver which doesn't do certificate validation in opportunistic mode,
@@ -261,11 +274,50 @@
localAddr.getHostAddress(), inetSockAddr.getPort());
}
- private void prepareIcmpMeasurement(InetAddress target) {
- if (!mIcmpChecks.containsKey(target)) {
- Measurement measurement = new Measurement();
- measurement.thread = new Thread(new IcmpCheck(target, measurement));
- mIcmpChecks.put(target, measurement);
+ private static int getHeaderLen(@NonNull InetAddress target) {
+ // Convert IPv4 mapped v6 address to v4 if any.
+ try {
+ final InetAddress addr = InetAddress.getByAddress(target.getAddress());
+ // An ICMPv6 header is technically 4 bytes, but the implementation in IcmpCheck#run()
+ // will always fill in another 4 bytes padding in the v6 diagnostic packets, so the size
+ // before icmp data is always 8 bytes in the implementation of ICMP diagnostics for both
+ // v4 and v6 packets. Thus, it's fine to use the v4 header size in the length
+ // calculation.
+ if (addr instanceof Inet6Address) {
+ return IPV6_HEADER_LEN + ICMP_HEADER_LEN;
+ }
+ } catch (UnknownHostException e) {
+ Log.e(TAG, "Create InetAddress fail(" + target + "): " + e);
+ }
+
+ return IPV4_HEADER_MIN_LEN + ICMP_HEADER_LEN;
+ }
+
+ private void prepareIcmpMeasurements(@NonNull InetAddress target, int targetNetworkMtu) {
+ // Test with different size payload ICMP.
+ // 1. Test with 0 payload.
+ addPayloadIcmpMeasurement(target, 0);
+ final int header = getHeaderLen(target);
+ // 2. Test with full size MTU.
+ addPayloadIcmpMeasurement(target, targetNetworkMtu - header);
+ // 3. If v6, make another measurement with the full v6 min MTU, unless that's what
+ // was done above.
+ if ((target instanceof Inet6Address) && (targetNetworkMtu != IPV6_MIN_MTU)) {
+ addPayloadIcmpMeasurement(target, IPV6_MIN_MTU - header);
+ }
+ }
+
+ private void addPayloadIcmpMeasurement(@NonNull InetAddress target, int payloadLen) {
+ // This can happen if the there is no mtu filled(which is 0) in the link property.
+ // The value becomes negative after minus header length.
+ if (payloadLen < 0) return;
+
+ final Pair<InetAddress, Integer> lenTarget =
+ new Pair<>(target, Integer.valueOf(payloadLen));
+ if (!mIcmpChecks.containsKey(lenTarget)) {
+ final Measurement measurement = new Measurement();
+ measurement.thread = new Thread(new IcmpCheck(target, payloadLen, measurement));
+ mIcmpChecks.put(lenTarget, measurement);
}
}
@@ -276,7 +328,7 @@
Pair<InetAddress, InetAddress> srcTarget = new Pair<>(source, target);
if (!mExplicitSourceIcmpChecks.containsKey(srcTarget)) {
Measurement measurement = new Measurement();
- measurement.thread = new Thread(new IcmpCheck(source, target, measurement));
+ measurement.thread = new Thread(new IcmpCheck(source, target, 0, measurement));
mExplicitSourceIcmpChecks.put(srcTarget, measurement);
}
}
@@ -334,8 +386,8 @@
ArrayList<Measurement> measurements = new ArrayList(totalMeasurementCount());
// Sort measurements IPv4 first.
- for (Map.Entry<InetAddress, Measurement> entry : mIcmpChecks.entrySet()) {
- if (entry.getKey() instanceof Inet4Address) {
+ for (Map.Entry<Pair<InetAddress, Integer>, Measurement> entry : mIcmpChecks.entrySet()) {
+ if (entry.getKey().first instanceof Inet4Address) {
measurements.add(entry.getValue());
}
}
@@ -357,8 +409,8 @@
}
// IPv6 measurements second.
- for (Map.Entry<InetAddress, Measurement> entry : mIcmpChecks.entrySet()) {
- if (entry.getKey() instanceof Inet6Address) {
+ for (Map.Entry<Pair<InetAddress, Integer>, Measurement> entry : mIcmpChecks.entrySet()) {
+ if (entry.getKey().first instanceof Inet6Address) {
measurements.add(entry.getValue());
}
}
@@ -489,8 +541,11 @@
private static final int PACKET_BUFSIZE = 512;
private final int mProtocol;
private final int mIcmpType;
+ private final int mPayloadSize;
+ // The length parameter is effectively the -s flag to ping/ping6 to specify the number of
+ // data bytes to be sent.
+ IcmpCheck(InetAddress source, InetAddress target, int length, Measurement measurement) {
- public IcmpCheck(InetAddress source, InetAddress target, Measurement measurement) {
super(source, target, measurement);
if (mAddressFamily == AF_INET6) {
@@ -502,12 +557,13 @@
mIcmpType = NetworkConstants.ICMPV4_ECHO_REQUEST_TYPE;
mMeasurement.description = "ICMPv4";
}
-
- mMeasurement.description += " dst{" + mTarget.getHostAddress() + "}";
+ mPayloadSize = length;
+ mMeasurement.description += " payloadLength{" + mPayloadSize + "}"
+ + " dst{" + mTarget.getHostAddress() + "}";
}
- public IcmpCheck(InetAddress target, Measurement measurement) {
- this(null, target, measurement);
+ IcmpCheck(InetAddress target, int length, Measurement measurement) {
+ this(null, target, length, measurement);
}
@Override
@@ -523,9 +579,11 @@
mMeasurement.description += " src{" + socketAddressToString(mSocketAddress) + "}";
// Build a trivial ICMP packet.
- final byte[] icmpPacket = {
- (byte) mIcmpType, 0, 0, 0, 0, 0, 0, 0 // ICMP header
- };
+ // The v4 ICMP header ICMP_HEADER_LEN (which is 8) and v6 is only 4 bytes (4 bytes
+ // message body followed by header before the payload).
+ // Use 8 bytes for both v4 and v6 for simplicity.
+ final byte[] icmpPacket = new byte[ICMP_HEADER_LEN + mPayloadSize];
+ icmpPacket[0] = (byte) mIcmpType;
int count = 0;
mMeasurement.startTime = now();
@@ -675,7 +733,6 @@
private class DnsTlsCheck extends DnsUdpCheck {
private static final int TCP_CONNECT_TIMEOUT_MS = 2500;
private static final int TCP_TIMEOUT_MS = 2000;
- private static final int DNS_TLS_PORT = 853;
private static final int DNS_HEADER_SIZE = 12;
private final String mHostname;
@@ -714,7 +771,8 @@
final byte[] dnsPacket = getDnsQueryPacket(sixRandomDigits);
mMeasurement.startTime = now();
- sslSocket.connect(new InetSocketAddress(mTarget, DNS_TLS_PORT), TCP_CONNECT_TIMEOUT_MS);
+ sslSocket.connect(new InetSocketAddress(mTarget, DNS_OVER_TLS_PORT),
+ TCP_CONNECT_TIMEOUT_MS);
// Synchronous call waiting for the TLS handshake complete.
sslSocket.startHandshake();
diff --git a/service/src/com/android/server/connectivity/NetworkNotificationManager.java b/service/src/com/android/server/connectivity/NetworkNotificationManager.java
index 45da0ea..bc13592 100644
--- a/service/src/com/android/server/connectivity/NetworkNotificationManager.java
+++ b/service/src/com/android/server/connectivity/NetworkNotificationManager.java
@@ -22,6 +22,7 @@
import static android.net.NetworkCapabilities.TRANSPORT_WIFI;
import android.annotation.NonNull;
+import android.app.ActivityOptions;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
@@ -29,10 +30,11 @@
import android.content.Intent;
import android.content.res.Resources;
import android.graphics.drawable.Icon;
-import android.net.ConnectivityResources;
import android.net.NetworkSpecifier;
import android.net.TelephonyNetworkSpecifier;
import android.net.wifi.WifiInfo;
+import android.os.Build;
+import android.os.Bundle;
import android.os.UserHandle;
import android.telephony.SubscriptionManager;
import android.telephony.TelephonyManager;
@@ -45,6 +47,7 @@
import com.android.connectivity.resources.R;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.messages.nano.SystemMessageProto.SystemMessage;
+import com.android.modules.utils.build.SdkLevel;
public class NetworkNotificationManager {
@@ -319,7 +322,8 @@
private boolean maybeNotifyViaDialog(Resources res, NotificationType notifyType,
PendingIntent intent) {
- if (notifyType != NotificationType.NO_INTERNET
+ if (notifyType != NotificationType.LOST_INTERNET
+ && notifyType != NotificationType.NO_INTERNET
&& notifyType != NotificationType.PARTIAL_CONNECTIVITY) {
return false;
}
@@ -328,7 +332,26 @@
}
try {
- intent.send();
+ Bundle options = null;
+
+ if (SdkLevel.isAtLeastU() && intent.isActivity()) {
+ // Also check SDK_INT >= T separately, as the linter in some T-based branches does
+ // not recognize "isAtLeastU && something" as an SDK check for T+ APIs.
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
+ // Android U requires pending intent background start mode to be specified:
+ // See #background-activity-restrictions in
+ // https://developer.android.com/about/versions/14/behavior-changes-14
+ // But setPendingIntentBackgroundActivityStartMode is U+, and replaces
+ // setPendingIntentBackgroundActivityLaunchAllowed which is T+ but deprecated.
+ // Use setPendingIntentBackgroundActivityLaunchAllowed as the U+ version is not
+ // yet available in all branches.
+ final ActivityOptions activityOptions = ActivityOptions.makeBasic();
+ activityOptions.setPendingIntentBackgroundActivityLaunchAllowed(true);
+ options = activityOptions.toBundle();
+ }
+ }
+
+ intent.send(null, 0, null, null, null, null, options);
} catch (PendingIntent.CanceledException e) {
Log.e(TAG, "Error sending dialog PendingIntent", e);
}
@@ -410,7 +433,8 @@
* A notification with a higher number will take priority over a notification with a lower
* number.
*/
- private static int priority(NotificationType t) {
+ @VisibleForTesting
+ public static int priority(NotificationType t) {
if (t == null) {
return 0;
}
diff --git a/service/src/com/android/server/connectivity/ProxyTracker.java b/service/src/com/android/server/connectivity/ProxyTracker.java
index bc0929c..6a0918b 100644
--- a/service/src/com/android/server/connectivity/ProxyTracker.java
+++ b/service/src/com/android/server/connectivity/ProxyTracker.java
@@ -27,6 +27,7 @@
import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
+import android.net.LinkProperties;
import android.net.Network;
import android.net.PacProxyManager;
import android.net.Proxy;
@@ -85,6 +86,7 @@
private final Handler mConnectivityServiceHandler;
+ @Nullable
private final PacProxyManager mPacProxyManager;
private class PacProxyInstalledListener implements PacProxyManager.PacProxyInstalledListener {
@@ -95,6 +97,7 @@
}
public void onPacProxyInstalled(@Nullable Network network, @NonNull ProxyInfo proxy) {
+ Log.i(TAG, "PAC proxy installed on network " + network + " : " + proxy);
mConnectivityServiceHandler
.sendMessage(mConnectivityServiceHandler
.obtainMessage(mEvent, new Pair<>(network, proxy)));
@@ -107,9 +110,11 @@
mConnectivityServiceHandler = connectivityServiceInternalHandler;
mPacProxyManager = context.getSystemService(PacProxyManager.class);
- PacProxyInstalledListener listener = new PacProxyInstalledListener(pacChangedEvent);
- mPacProxyManager.addPacProxyInstalledListener(
+ if (mPacProxyManager != null) {
+ PacProxyInstalledListener listener = new PacProxyInstalledListener(pacChangedEvent);
+ mPacProxyManager.addPacProxyInstalledListener(
mConnectivityServiceHandler::post, listener);
+ }
}
// Convert empty ProxyInfo's to null as null-checks are used to determine if proxies are present
@@ -203,7 +208,7 @@
mGlobalProxy = proxyProperties;
}
- if (!TextUtils.isEmpty(pacFileUrl)) {
+ if (!TextUtils.isEmpty(pacFileUrl) && mPacProxyManager != null) {
mConnectivityServiceHandler.post(
() -> mPacProxyManager.setCurrentProxyScriptUrl(proxyProperties));
}
@@ -249,7 +254,10 @@
final ProxyInfo defaultProxy = getDefaultProxy();
final ProxyInfo proxyInfo = null != defaultProxy ?
defaultProxy : ProxyInfo.buildDirectProxy("", 0, Collections.emptyList());
- mPacProxyManager.setCurrentProxyScriptUrl(proxyInfo);
+
+ if (mPacProxyManager != null) {
+ mPacProxyManager.setCurrentProxyScriptUrl(proxyInfo);
+ }
if (!shouldSendBroadcast(proxyInfo)) {
return;
@@ -328,9 +336,15 @@
* @param proxyInfo the proxy spec, or null for no proxy.
*/
public void setDefaultProxy(@Nullable ProxyInfo proxyInfo) {
+ // The code has been accepting empty proxy objects forever, so for backward
+ // compatibility it should continue doing so.
+ if (proxyInfo != null && TextUtils.isEmpty(proxyInfo.getHost())
+ && Uri.EMPTY.equals(proxyInfo.getPacFileUrl())) {
+ proxyInfo = null;
+ }
synchronized (mProxyLock) {
if (Objects.equals(mDefaultProxy, proxyInfo)) return;
- if (proxyInfo != null && !proxyInfo.isValid()) {
+ if (proxyInfo != null && !proxyInfo.isValid()) {
if (DBG) Log.d(TAG, "Invalid proxy properties, ignoring: " + proxyInfo);
return;
}
@@ -355,4 +369,51 @@
}
}
}
+
+ private boolean isPacProxy(@Nullable final ProxyInfo info) {
+ return null != info && info.isPacProxy();
+ }
+
+ /**
+ * Adjust the proxy in the link properties if necessary.
+ *
+ * It is necessary when the proxy in the passed property is for PAC, and the default proxy
+ * is also for PAC. This is because the original LinkProperties from the network agent don't
+ * include the port for the local proxy as it's not known at creation time, but this class
+ * knows it after the proxy service is started.
+ *
+ * This is safe because there can only ever be one proxy service running on the device, so
+ * if the ProxyInfo in the LinkProperties is for PAC, then the port is necessarily the one
+ * ProxyTracker knows about.
+ *
+ * @param lp the LinkProperties to fix up.
+ * @param network the network of the local proxy server.
+ */
+ // TODO: Leave network unused to support local proxy server per network in the future.
+ public void updateDefaultNetworkProxyPortForPAC(@NonNull final LinkProperties lp,
+ @Nullable Network network) {
+ final ProxyInfo defaultProxy = getDefaultProxy();
+ if (isPacProxy(lp.getHttpProxy()) && isPacProxy(defaultProxy)) {
+ synchronized (mProxyLock) {
+ // At this time, this method can only be called for the default network's LP.
+ // Therefore the PAC file URL in the LP must match the one in the default proxy,
+ // and we just update the port.
+ // Note that the global proxy, if any, is set out of band by the DPM and becomes
+ // the default proxy (it overrides it, see {@link getDefaultProxy}). The PAC URL
+ // in the global proxy might not be the one in the LP of the default
+ // network, so discount this case.
+ if (null == mGlobalProxy && !lp.getHttpProxy().getPacFileUrl()
+ .equals(defaultProxy.getPacFileUrl())) {
+ throw new IllegalStateException("Unexpected discrepancy between proxy in LP of "
+ + "default network and default proxy. The former has a PAC URL of "
+ + lp.getHttpProxy().getPacFileUrl() + " while the latter has "
+ + defaultProxy.getPacFileUrl());
+ }
+ }
+ // If this network has a PAC proxy and proxy tracker already knows about
+ // it, now is the right time to patch it in. If proxy tracker does not know
+ // about it yet, then it will be patched in when it learns about it.
+ lp.setHttpProxy(defaultProxy);
+ }
+ }
}
diff --git a/service/src/com/android/server/connectivity/TcpKeepaliveController.java b/service/src/com/android/server/connectivity/TcpKeepaliveController.java
index a9cb2fa..4124e36 100644
--- a/service/src/com/android/server/connectivity/TcpKeepaliveController.java
+++ b/service/src/com/android/server/connectivity/TcpKeepaliveController.java
@@ -15,6 +15,7 @@
*/
package com.android.server.connectivity;
+import static android.net.NetworkAgent.CMD_STOP_SOCKET_KEEPALIVE;
import static android.net.SocketKeepalive.DATA_RECEIVED;
import static android.net.SocketKeepalive.ERROR_INVALID_IP_ADDRESS;
import static android.net.SocketKeepalive.ERROR_INVALID_SOCKET;
@@ -33,6 +34,8 @@
import static com.android.net.module.util.NetworkStackConstants.IPV4_HEADER_MIN_LEN;
import android.annotation.NonNull;
+import android.annotation.SuppressLint;
+import android.net.ISocketKeepaliveCallback;
import android.net.InvalidPacketException;
import android.net.NetworkUtils;
import android.net.SocketKeepalive.InvalidSocketException;
@@ -50,7 +53,6 @@
import com.android.internal.annotations.GuardedBy;
import com.android.internal.annotations.VisibleForTesting;
import com.android.net.module.util.IpUtils;
-import com.android.server.connectivity.KeepaliveTracker.KeepaliveInfo;
import java.io.FileDescriptor;
import java.net.InetAddress;
@@ -88,6 +90,8 @@
private final MessageQueue mFdHandlerQueue;
+ private final Handler mConnectivityServiceHandler;
+
private static final int FD_EVENTS = EVENT_INPUT | EVENT_ERROR;
private static final int TCP_HEADER_LENGTH = 20;
@@ -103,6 +107,8 @@
private static final int TCP_REPAIR_ON = 1;
// Reference include/uapi/linux/sockios.h
private static final int SIOCINQ = FIONREAD;
+ // arch specific BSD socket API constant that predates Linux and Android
+ @SuppressLint("NewApi")
private static final int SIOCOUTQ = TIOCOUTQ;
/**
@@ -115,6 +121,7 @@
public TcpKeepaliveController(final Handler connectivityServiceHandler) {
mFdHandlerQueue = connectivityServiceHandler.getLooper().getQueue();
+ mConnectivityServiceHandler = connectivityServiceHandler;
}
/** Build tcp keepalive packet. */
@@ -324,12 +331,13 @@
* Start monitoring incoming packets.
*
* @param fd socket fd to monitor.
- * @param ki a {@link KeepaliveInfo} that tracks information about a socket keepalive.
+ * @param callback a {@link ISocketKeepaliveCallback} that tracks information about a socket
+ * keepalive.
* @param slot keepalive slot.
*/
- public void startSocketMonitor(@NonNull final FileDescriptor fd,
- @NonNull final KeepaliveInfo ki, final int slot)
- throws IllegalArgumentException, InvalidSocketException {
+ public void startSocketMonitor(
+ @NonNull final FileDescriptor fd, @NonNull final ISocketKeepaliveCallback callback,
+ final int slot) throws IllegalArgumentException, InvalidSocketException {
synchronized (mListeners) {
if (null != mListeners.get(slot)) {
throw new IllegalArgumentException("This slot is already taken");
@@ -350,7 +358,8 @@
} else {
reason = DATA_RECEIVED;
}
- ki.onFileDescriptorInitiatedStop(reason);
+ mConnectivityServiceHandler.obtainMessage(CMD_STOP_SOCKET_KEEPALIVE,
+ 0 /* unused */, reason, callback.asBinder()).sendToTarget();
// The listener returns the new set of events to listen to. Because 0 means no
// event, the listener gets unregistered.
return 0;
diff --git a/tests/common/Android.bp b/tests/common/Android.bp
index 8e47235..7b5c298 100644
--- a/tests/common/Android.bp
+++ b/tests/common/Android.bp
@@ -31,7 +31,7 @@
// (currently, CTS 10, 11, and 12).
java_defaults {
name: "ConnectivityTestsLatestSdkDefaults",
- target_sdk_version: "33",
+ target_sdk_version: "34",
}
java_library {
diff --git a/tests/common/OWNERS b/tests/common/OWNERS
new file mode 100644
index 0000000..3101da5
--- /dev/null
+++ b/tests/common/OWNERS
@@ -0,0 +1,2 @@
+# Bug template url: http://b/new?component=31808
+# TODO: move bug template config to common owners file once b/226427845 is resolved
\ No newline at end of file
diff --git a/tests/common/java/android/net/NattKeepalivePacketDataTest.kt b/tests/common/java/android/net/NattKeepalivePacketDataTest.kt
index ad7a526..dde1d86 100644
--- a/tests/common/java/android/net/NattKeepalivePacketDataTest.kt
+++ b/tests/common/java/android/net/NattKeepalivePacketDataTest.kt
@@ -22,15 +22,16 @@
import android.os.Build
import androidx.test.filters.SmallTest
import androidx.test.runner.AndroidJUnit4
-import com.android.testutils.assertEqualBothWays
+import com.android.testutils.ConnectivityModuleTest
import com.android.testutils.DevSdkIgnoreRule
import com.android.testutils.DevSdkIgnoreRule.IgnoreUpTo
+import com.android.testutils.assertEqualBothWays
import com.android.testutils.assertParcelingIsLossless
import com.android.testutils.parcelingRoundTrip
import java.net.InetAddress
+import kotlin.test.assertFailsWith
import org.junit.Assert.assertEquals
import org.junit.Assert.assertNotEquals
-import org.junit.Assert.fail
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
@@ -41,15 +42,13 @@
@Rule @JvmField
val ignoreRule: DevSdkIgnoreRule = DevSdkIgnoreRule()
- /* Refer to the definition in {@code NattKeepalivePacketData} */
- private val IPV4_HEADER_LENGTH = 20
- private val UDP_HEADER_LENGTH = 8
-
private val TEST_PORT = 4243
private val TEST_PORT2 = 4244
private val TEST_SRC_ADDRV4 = "198.168.0.2".address()
private val TEST_DST_ADDRV4 = "198.168.0.1".address()
private val TEST_ADDRV6 = "2001:db8::1".address()
+ private val TEST_ADDRV4MAPPEDV6 = "::ffff:1.2.3.4".address()
+ private val TEST_ADDRV4 = "1.2.3.4".address()
private fun String.address() = InetAddresses.parseNumericAddress(this)
private fun nattKeepalivePacket(
@@ -61,33 +60,52 @@
@Test @IgnoreUpTo(Build.VERSION_CODES.Q)
fun testConstructor() {
- try {
+ assertFailsWith<InvalidPacketException>(
+ "Dst port is not NATT port should cause exception") {
nattKeepalivePacket(dstPort = TEST_PORT)
- fail("Dst port is not NATT port should cause exception")
- } catch (e: InvalidPacketException) {
- assertEquals(e.error, ERROR_INVALID_PORT)
+ }.let {
+ assertEquals(it.error, ERROR_INVALID_PORT)
}
- try {
+ assertFailsWith<InvalidPacketException>("A v6 srcAddress should cause exception") {
nattKeepalivePacket(srcAddress = TEST_ADDRV6)
- fail("A v6 srcAddress should cause exception")
- } catch (e: InvalidPacketException) {
- assertEquals(e.error, ERROR_INVALID_IP_ADDRESS)
+ }.let {
+ assertEquals(it.error, ERROR_INVALID_IP_ADDRESS)
}
- try {
+ assertFailsWith<InvalidPacketException>("A v6 dstAddress should cause exception") {
nattKeepalivePacket(dstAddress = TEST_ADDRV6)
- fail("A v6 dstAddress should cause exception")
- } catch (e: InvalidPacketException) {
- assertEquals(e.error, ERROR_INVALID_IP_ADDRESS)
+ }.let {
+ assertEquals(it.error, ERROR_INVALID_IP_ADDRESS)
}
- try {
+ assertFailsWith<IllegalArgumentException>("Invalid data should cause exception") {
parcelingRoundTrip(
- NattKeepalivePacketData(TEST_SRC_ADDRV4, TEST_PORT, TEST_DST_ADDRV4, TEST_PORT,
+ NattKeepalivePacketData(TEST_SRC_ADDRV4, TEST_PORT, TEST_DST_ADDRV4, TEST_PORT,
byteArrayOf(12, 31, 22, 44)))
- fail("Invalid data should cause exception")
- } catch (e: IllegalArgumentException) { }
+ }
+ }
+
+ @Test @IgnoreUpTo(Build.VERSION_CODES.R) @ConnectivityModuleTest
+ fun testConstructor_afterR() {
+ // v4 mapped v6 will be translated to a v4 address.
+ assertFailsWith<InvalidPacketException> {
+ nattKeepalivePacket(srcAddress = TEST_ADDRV6, dstAddress = TEST_ADDRV4MAPPEDV6)
+ }
+ assertFailsWith<InvalidPacketException> {
+ nattKeepalivePacket(srcAddress = TEST_ADDRV4MAPPEDV6, dstAddress = TEST_ADDRV6)
+ }
+
+ // Both src and dst address will be v4 after translation, so it won't cause exception.
+ val packet1 = nattKeepalivePacket(
+ dstAddress = TEST_ADDRV4MAPPEDV6, srcAddress = TEST_ADDRV4MAPPEDV6)
+ assertEquals(TEST_ADDRV4, packet1.srcAddress)
+ assertEquals(TEST_ADDRV4, packet1.dstAddress)
+
+ // Packet with v6 src and v6 dst address is valid.
+ val packet2 = nattKeepalivePacket(srcAddress = TEST_ADDRV6, dstAddress = TEST_ADDRV6)
+ assertEquals(TEST_ADDRV6, packet2.srcAddress)
+ assertEquals(TEST_ADDRV6, packet2.dstAddress)
}
@Test @IgnoreUpTo(Build.VERSION_CODES.Q)
@@ -108,4 +126,4 @@
fun testHashCode() {
assertEquals(nattKeepalivePacket().hashCode(), nattKeepalivePacket().hashCode())
}
-}
\ No newline at end of file
+}
diff --git a/tests/common/java/android/net/NetworkCapabilitiesTest.java b/tests/common/java/android/net/NetworkCapabilitiesTest.java
index 7b374d2..aae3425 100644
--- a/tests/common/java/android/net/NetworkCapabilitiesTest.java
+++ b/tests/common/java/android/net/NetworkCapabilitiesTest.java
@@ -21,6 +21,7 @@
import static android.net.NetworkCapabilities.MIN_TRANSPORT;
import static android.net.NetworkCapabilities.NET_CAPABILITY_CAPTIVE_PORTAL;
import static android.net.NetworkCapabilities.NET_CAPABILITY_CBS;
+import static android.net.NetworkCapabilities.NET_CAPABILITY_DUN;
import static android.net.NetworkCapabilities.NET_CAPABILITY_EIMS;
import static android.net.NetworkCapabilities.NET_CAPABILITY_ENTERPRISE;
import static android.net.NetworkCapabilities.NET_CAPABILITY_FOREGROUND;
@@ -36,6 +37,7 @@
import static android.net.NetworkCapabilities.NET_CAPABILITY_PARTIAL_CONNECTIVITY;
import static android.net.NetworkCapabilities.NET_CAPABILITY_PRIORITIZE_BANDWIDTH;
import static android.net.NetworkCapabilities.NET_CAPABILITY_PRIORITIZE_LATENCY;
+import static android.net.NetworkCapabilities.NET_CAPABILITY_RCS;
import static android.net.NetworkCapabilities.NET_CAPABILITY_SUPL;
import static android.net.NetworkCapabilities.NET_CAPABILITY_TRUSTED;
import static android.net.NetworkCapabilities.NET_CAPABILITY_VALIDATED;
@@ -113,6 +115,9 @@
private static final int TEST_SUBID2 = 2;
private static final int TEST_SUBID3 = 3;
+ private static final Set<Integer> TEST_NETWORKS_EXTRA_ALLOWED_CAPS_ON_NON_CELL =
+ Set.of(NET_CAPABILITY_CBS, NET_CAPABILITY_DUN, NET_CAPABILITY_RCS);
+
@Rule
public DevSdkIgnoreRule mDevSdkIgnoreRule = new DevSdkIgnoreRule();
@@ -1321,16 +1326,31 @@
}
@Test
- public void testRestrictCapabilitiesForTestNetworkByNotOwnerWithRestrictedNc() {
- testRestrictCapabilitiesForTestNetworkWithRestrictedNc(false /* isOwner */);
+ public void testRestrictCapabilitiesForTestNetworkRestrictedNc_NotOwner_NotCell() {
+ testRestrictCapabilitiesForTestNetworkWithRestrictedNc(
+ false /* isOwner */, false /* isCell */);
}
@Test
- public void testRestrictCapabilitiesForTestNetworkByOwnerWithRestrictedNc() {
- testRestrictCapabilitiesForTestNetworkWithRestrictedNc(true /* isOwner */);
+ public void testRestrictCapabilitiesForTestNetworkRestrictedNc_Owner_NotCell() {
+ testRestrictCapabilitiesForTestNetworkWithRestrictedNc(
+ true /* isOwner */, false /* isCell */);
}
- private void testRestrictCapabilitiesForTestNetworkWithRestrictedNc(boolean isOwner) {
+ @Test
+ public void testRestrictCapabilitiesForTestNetworkRestrictedNc_NotOwner_Cell() {
+ testRestrictCapabilitiesForTestNetworkWithRestrictedNc(
+ false /* isOwner */, true /* isCell */);
+ }
+
+ @Test
+ public void testRestrictCapabilitiesForTestNetworkRestrictedNc_Owner_Cell() {
+ testRestrictCapabilitiesForTestNetworkWithRestrictedNc(
+ true /* isOwner */, false /* isCell */);
+ }
+
+ private void testRestrictCapabilitiesForTestNetworkWithRestrictedNc(
+ boolean isOwner, boolean isCell) {
final int ownerUid = 1234;
final int signalStrength = -80;
final int[] administratorUids = {1001, ownerUid};
@@ -1339,29 +1359,50 @@
// the networkCapabilities will contain more than one transport type. However,
// networkCapabilities must have a single transport specified to use NetworkSpecifier. Thus,
// do not verify this part since it's verified in other tests.
- final NetworkCapabilities restrictedNc = new NetworkCapabilities.Builder()
+ final NetworkCapabilities.Builder restrictedNcBuilder = new NetworkCapabilities.Builder()
.removeCapability(NET_CAPABILITY_NOT_RESTRICTED)
- .addTransportType(TRANSPORT_CELLULAR)
.addCapability(NET_CAPABILITY_MMS)
.addCapability(NET_CAPABILITY_NOT_METERED)
.setAdministratorUids(administratorUids)
.setOwnerUid(ownerUid)
.setSignalStrength(signalStrength)
.setTransportInfo(transportInfo)
- .setSubscriptionIds(Set.of(TEST_SUBID1)).build();
+ .setSubscriptionIds(Set.of(TEST_SUBID1));
+ for (int cap : TEST_NETWORKS_EXTRA_ALLOWED_CAPS_ON_NON_CELL) {
+ restrictedNcBuilder.addCapability(cap);
+ }
+
+ if (isCell) {
+ restrictedNcBuilder.addTransportType(TRANSPORT_CELLULAR);
+ }
+ final NetworkCapabilities restrictedNc = restrictedNcBuilder.build();
+
final int creatorUid = isOwner ? ownerUid : INVALID_UID;
restrictedNc.restrictCapabilitiesForTestNetwork(creatorUid);
final NetworkCapabilities.Builder expectedNcBuilder = new NetworkCapabilities.Builder()
.removeCapability(NET_CAPABILITY_NOT_RESTRICTED);
- // If the test network is restricted, then the network may declare any transport, and
- // appended with TRANSPORT_TEST.
- expectedNcBuilder.addTransportType(TRANSPORT_CELLULAR);
+
+ if (isCell) {
+ // If the test network is restricted, then the network may declare any transport, and
+ // appended with TRANSPORT_TEST.
+ expectedNcBuilder.addTransportType(TRANSPORT_CELLULAR);
+ } else {
+ // If the test network only has TRANSPORT_TEST, then it can keep the subscription IDs.
+ expectedNcBuilder.setSubscriptionIds(Set.of(TEST_SUBID1));
+ }
expectedNcBuilder.addTransportType(TRANSPORT_TEST);
+
// Only TEST_NETWORKS_ALLOWED_CAPABILITIES will be kept.
expectedNcBuilder.addCapability(NET_CAPABILITY_NOT_METERED);
expectedNcBuilder.removeCapability(NET_CAPABILITY_TRUSTED);
+ if (!isCell) {
+ for (int cap : TEST_NETWORKS_EXTRA_ALLOWED_CAPS_ON_NON_CELL) {
+ expectedNcBuilder.addCapability(cap);
+ }
+ }
+
expectedNcBuilder.setSignalStrength(signalStrength).setTransportInfo(transportInfo);
if (creatorUid == ownerUid) {
// Only retain the owner and administrator UIDs if they match the app registering the
diff --git a/tests/common/java/android/net/NetworkProviderTest.kt b/tests/common/java/android/net/NetworkProviderTest.kt
index c0e7f61..fcbb0dd 100644
--- a/tests/common/java/android/net/NetworkProviderTest.kt
+++ b/tests/common/java/android/net/NetworkProviderTest.kt
@@ -79,6 +79,7 @@
@After
fun tearDown() {
mHandlerThread.quitSafely()
+ mHandlerThread.join()
instrumentation.getUiAutomation().dropShellPermissionIdentity()
}
diff --git a/tests/common/java/android/net/netstats/NetworkTemplateTest.kt b/tests/common/java/android/net/netstats/NetworkTemplateTest.kt
index fb6759e..fd7bd74 100644
--- a/tests/common/java/android/net/netstats/NetworkTemplateTest.kt
+++ b/tests/common/java/android/net/netstats/NetworkTemplateTest.kt
@@ -30,16 +30,17 @@
import android.net.NetworkTemplate.MATCH_WIFI
import android.net.NetworkTemplate.NETWORK_TYPE_ALL
import android.net.NetworkTemplate.OEM_MANAGED_ALL
+import android.os.Build
import android.telephony.TelephonyManager
import com.android.testutils.ConnectivityModuleTest
import com.android.testutils.DevSdkIgnoreRule
import com.android.testutils.SC_V2
+import kotlin.test.assertEquals
+import kotlin.test.assertFailsWith
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
import org.junit.runners.JUnit4
-import kotlin.test.assertEquals
-import kotlin.test.assertFailsWith
private const val TEST_IMSI1 = "imsi"
private const val TEST_WIFI_KEY1 = "wifiKey1"
@@ -96,9 +97,27 @@
}
// Verify carrier and mobile template cannot contain one of subscriber Id is null.
- listOf(MATCH_MOBILE, MATCH_CARRIER).forEach {
+ assertFailsWith<IllegalArgumentException> {
+ NetworkTemplate.Builder(MATCH_CARRIER).setSubscriberIds(setOf(null)).build()
+ }
+ val firstSdk = Build.VERSION.DEVICE_INITIAL_SDK_INT
+ if (firstSdk > Build.VERSION_CODES.TIRAMISU) {
assertFailsWith<IllegalArgumentException> {
- NetworkTemplate.Builder(it).setSubscriberIds(setOf(null)).build()
+ NetworkTemplate.Builder(MATCH_MOBILE).setSubscriberIds(setOf(null)).build()
+ }
+ } else {
+ NetworkTemplate.Builder(MATCH_MOBILE).setSubscriberIds(setOf(null)).build().let {
+ val expectedTemplate = NetworkTemplate(
+ MATCH_MOBILE,
+ arrayOfNulls<String>(1) /*subscriberIds*/,
+ emptyArray<String>() /*wifiNetworkKey*/,
+ METERED_ALL,
+ ROAMING_ALL,
+ DEFAULT_NETWORK_ALL,
+ NETWORK_TYPE_ALL,
+ OEM_MANAGED_ALL
+ )
+ assertEquals(expectedTemplate, it)
}
}
diff --git a/tests/cts/OWNERS b/tests/cts/OWNERS
index 8388cb7..8c2408b 100644
--- a/tests/cts/OWNERS
+++ b/tests/cts/OWNERS
@@ -1,4 +1,5 @@
# Bug template url: http://b/new?component=31808
+# TODO: move bug template config to common owners file once b/226427845 is resolved
set noparent
file:platform/packages/modules/Connectivity:master:/OWNERS_core_networking_xts
diff --git a/tests/cts/hostside/AndroidTest.xml b/tests/cts/hostside/AndroidTest.xml
index 7a73313..e83e36a 100644
--- a/tests/cts/hostside/AndroidTest.xml
+++ b/tests/cts/hostside/AndroidTest.xml
@@ -16,6 +16,7 @@
<configuration description="Config for CTS net host test cases">
<option name="test-suite-tag" value="cts" />
<option name="config-descriptor:metadata" key="component" value="networking" />
+ <option name="config-descriptor:metadata" key="token" value="SIM_CARD" />
<option name="config-descriptor:metadata" key="parameter" value="instant_app" />
<option name="config-descriptor:metadata" key="parameter" value="not_multi_abi" />
<option name="config-descriptor:metadata" key="parameter" value="secondary_user" />
diff --git a/tests/cts/hostside/TEST_MAPPING b/tests/cts/hostside/TEST_MAPPING
index ab6de82..2cfd7af 100644
--- a/tests/cts/hostside/TEST_MAPPING
+++ b/tests/cts/hostside/TEST_MAPPING
@@ -8,6 +8,9 @@
},
{
"exclude-annotation": "android.platform.test.annotations.FlakyTest"
+ },
+ {
+ "exclude-annotation": "android.platform.test.annotations.RequiresDevice"
}
]
}
diff --git a/tests/cts/hostside/app/Android.bp b/tests/cts/hostside/app/Android.bp
index 12e7d33..2245382 100644
--- a/tests/cts/hostside/app/Android.bp
+++ b/tests/cts/hostside/app/Android.bp
@@ -30,7 +30,6 @@
"cts-net-utils",
"ctstestrunner-axt",
"modules-utils-build",
- "ub-uiautomator",
],
libs: [
"android.test.runner",
diff --git a/tests/cts/hostside/app/AndroidManifest.xml b/tests/cts/hostside/app/AndroidManifest.xml
index 56d3cb5..ca3397b 100644
--- a/tests/cts/hostside/app/AndroidManifest.xml
+++ b/tests/cts/hostside/app/AndroidManifest.xml
@@ -34,7 +34,8 @@
<application android:requestLegacyExternalStorage="true">
<uses-library android:name="android.test.runner"/>
- <activity android:name=".MyActivity"/>
+ <activity android:name=".MyActivity"
+ android:configChanges="density|fontScale|keyboard|keyboardHidden|layoutDirection|locale|mcc|mnc|navigation|screenLayout|screenSize|smallestScreenSize|touchscreen|uiMode"/>
<service android:name=".MyVpnService"
android:permission="android.permission.BIND_VPN_SERVICE"
android:exported="true">
diff --git a/tests/cts/hostside/app/src/com/android/cts/net/hostside/AbstractRestrictBackgroundNetworkTestCase.java b/tests/cts/hostside/app/src/com/android/cts/net/hostside/AbstractRestrictBackgroundNetworkTestCase.java
index a281aed..6b21dac 100644
--- a/tests/cts/hostside/app/src/com/android/cts/net/hostside/AbstractRestrictBackgroundNetworkTestCase.java
+++ b/tests/cts/hostside/app/src/com/android/cts/net/hostside/AbstractRestrictBackgroundNetworkTestCase.java
@@ -18,9 +18,7 @@
import static android.app.job.JobScheduler.RESULT_SUCCESS;
import static android.net.ConnectivityManager.ACTION_RESTRICT_BACKGROUND_CHANGED;
-import static android.os.BatteryManager.BATTERY_PLUGGED_AC;
-import static android.os.BatteryManager.BATTERY_PLUGGED_USB;
-import static android.os.BatteryManager.BATTERY_PLUGGED_WIRELESS;
+import static android.os.BatteryManager.BATTERY_PLUGGED_ANY;
import static com.android.cts.net.hostside.NetworkPolicyTestUtils.executeShellCommand;
import static com.android.cts.net.hostside.NetworkPolicyTestUtils.forceRunJob;
@@ -119,10 +117,6 @@
protected static final String NOTIFICATION_TYPE_ACTION_BUNDLE = "ACTION_BUNDLE";
protected static final String NOTIFICATION_TYPE_ACTION_REMOTE_INPUT = "ACTION_REMOTE_INPUT";
- // TODO: Update BatteryManager.BATTERY_PLUGGED_ANY as @TestApi
- public static final int BATTERY_PLUGGED_ANY =
- BATTERY_PLUGGED_AC | BATTERY_PLUGGED_USB | BATTERY_PLUGGED_WIRELESS;
-
private static final String NETWORK_STATUS_SEPARATOR = "\\|";
private static final int SECOND_IN_MS = 1000;
static final int NETWORK_TIMEOUT_MS = 15 * SECOND_IN_MS;
diff --git a/tests/cts/hostside/app/src/com/android/cts/net/hostside/DataWarningReceiverTest.java b/tests/cts/hostside/app/src/com/android/cts/net/hostside/DataWarningReceiverTest.java
index b2e81ff..13bbab6 100644
--- a/tests/cts/hostside/app/src/com/android/cts/net/hostside/DataWarningReceiverTest.java
+++ b/tests/cts/hostside/app/src/com/android/cts/net/hostside/DataWarningReceiverTest.java
@@ -19,18 +19,18 @@
import static com.android.cts.net.hostside.NetworkPolicyTestUtils.clearSnoozeTimestamps;
import android.content.pm.PackageManager;
-import android.support.test.uiautomator.By;
-import android.support.test.uiautomator.Direction;
-import android.support.test.uiautomator.UiObject2;
-import android.support.test.uiautomator.Until;
import android.telephony.SubscriptionManager;
import android.telephony.SubscriptionPlan;
import androidx.test.platform.app.InstrumentationRegistry;
+import androidx.test.uiautomator.By;
+import androidx.test.uiautomator.Direction;
import androidx.test.uiautomator.UiDevice;
+import androidx.test.uiautomator.UiObject2;
+import androidx.test.uiautomator.Until;
import com.android.compatibility.common.util.SystemUtil;
-import com.android.compatibility.common.util.UiAutomatorUtils;
+import com.android.compatibility.common.util.UiAutomatorUtils2;
import org.junit.After;
import org.junit.Assume;
@@ -84,7 +84,7 @@
final UiDevice uiDevice = UiDevice.getInstance(mInstrumentation);
uiDevice.openNotification();
try {
- final UiObject2 uiObject = UiAutomatorUtils.waitFindObject(
+ final UiObject2 uiObject = UiAutomatorUtils2.waitFindObject(
By.text("Data warning"));
Assume.assumeNotNull(uiObject);
uiObject.wait(Until.clickable(true), 10_000L);
diff --git a/tests/cts/hostside/app/src/com/android/cts/net/hostside/MyVpnService.java b/tests/cts/hostside/app/src/com/android/cts/net/hostside/MyVpnService.java
index 449454e..fe522a0 100644
--- a/tests/cts/hostside/app/src/com/android/cts/net/hostside/MyVpnService.java
+++ b/tests/cts/hostside/app/src/com/android/cts/net/hostside/MyVpnService.java
@@ -32,6 +32,7 @@
import com.android.networkstack.apishim.VpnServiceBuilderShimImpl;
import com.android.networkstack.apishim.common.UnsupportedApiLevelException;
import com.android.networkstack.apishim.common.VpnServiceBuilderShim;
+import com.android.testutils.PacketReflector;
import java.io.IOException;
import java.net.InetAddress;
diff --git a/tests/cts/hostside/app/src/com/android/cts/net/hostside/PacketReflector.java b/tests/cts/hostside/app/src/com/android/cts/net/hostside/PacketReflector.java
deleted file mode 100644
index 124c2c3..0000000
--- a/tests/cts/hostside/app/src/com/android/cts/net/hostside/PacketReflector.java
+++ /dev/null
@@ -1,254 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.cts.net.hostside;
-
-import static android.system.OsConstants.ICMP6_ECHO_REPLY;
-import static android.system.OsConstants.ICMP6_ECHO_REQUEST;
-import static android.system.OsConstants.ICMP_ECHO;
-import static android.system.OsConstants.ICMP_ECHOREPLY;
-
-import android.system.ErrnoException;
-import android.system.Os;
-import android.util.Log;
-
-import java.io.FileDescriptor;
-import java.io.IOException;
-
-public class PacketReflector extends Thread {
-
- private static int IPV4_HEADER_LENGTH = 20;
- private static int IPV6_HEADER_LENGTH = 40;
-
- private static int IPV4_ADDR_OFFSET = 12;
- private static int IPV6_ADDR_OFFSET = 8;
- private static int IPV4_ADDR_LENGTH = 4;
- private static int IPV6_ADDR_LENGTH = 16;
-
- private static int IPV4_PROTO_OFFSET = 9;
- private static int IPV6_PROTO_OFFSET = 6;
-
- private static final byte IPPROTO_ICMP = 1;
- private static final byte IPPROTO_TCP = 6;
- private static final byte IPPROTO_UDP = 17;
- private static final byte IPPROTO_ICMPV6 = 58;
-
- private static int ICMP_HEADER_LENGTH = 8;
- private static int TCP_HEADER_LENGTH = 20;
- private static int UDP_HEADER_LENGTH = 8;
-
- private static final byte ICMP_ECHO = 8;
- private static final byte ICMP_ECHOREPLY = 0;
-
- private static String TAG = "PacketReflector";
-
- private FileDescriptor mFd;
- private byte[] mBuf;
-
- public PacketReflector(FileDescriptor fd, int mtu) {
- super("PacketReflector");
- mFd = fd;
- mBuf = new byte[mtu];
- }
-
- private static void swapBytes(byte[] buf, int pos1, int pos2, int len) {
- for (int i = 0; i < len; i++) {
- byte b = buf[pos1 + i];
- buf[pos1 + i] = buf[pos2 + i];
- buf[pos2 + i] = b;
- }
- }
-
- private static void swapAddresses(byte[] buf, int version) {
- int addrPos, addrLen;
- switch(version) {
- case 4:
- addrPos = IPV4_ADDR_OFFSET;
- addrLen = IPV4_ADDR_LENGTH;
- break;
- case 6:
- addrPos = IPV6_ADDR_OFFSET;
- addrLen = IPV6_ADDR_LENGTH;
- break;
- default:
- throw new IllegalArgumentException();
- }
- swapBytes(buf, addrPos, addrPos + addrLen, addrLen);
- }
-
- // Reflect TCP packets: swap the source and destination addresses, but don't change the ports.
- // This is used by the test to "connect to itself" through the VPN.
- private void processTcpPacket(byte[] buf, int version, int len, int hdrLen) {
- if (len < hdrLen + TCP_HEADER_LENGTH) {
- return;
- }
-
- // Swap src and dst IP addresses.
- swapAddresses(buf, version);
-
- // Send the packet back.
- writePacket(buf, len);
- }
-
- // Echo UDP packets: swap source and destination addresses, and source and destination ports.
- // This is used by the test to check that the bytes it sends are echoed back.
- private void processUdpPacket(byte[] buf, int version, int len, int hdrLen) {
- if (len < hdrLen + UDP_HEADER_LENGTH) {
- return;
- }
-
- // Swap src and dst IP addresses.
- swapAddresses(buf, version);
-
- // Swap dst and src ports.
- int portOffset = hdrLen;
- swapBytes(buf, portOffset, portOffset + 2, 2);
-
- // Send the packet back.
- writePacket(buf, len);
- }
-
- private void processIcmpPacket(byte[] buf, int version, int len, int hdrLen) {
- if (len < hdrLen + ICMP_HEADER_LENGTH) {
- return;
- }
-
- byte type = buf[hdrLen];
- if (!(version == 4 && type == ICMP_ECHO) &&
- !(version == 6 && type == (byte) ICMP6_ECHO_REQUEST)) {
- return;
- }
-
- // Save the ping packet we received.
- byte[] request = buf.clone();
-
- // Swap src and dst IP addresses, and send the packet back.
- // This effectively pings the device to see if it replies.
- swapAddresses(buf, version);
- writePacket(buf, len);
-
- // The device should have replied, and buf should now contain a ping response.
- int received = readPacket(buf);
- if (received != len) {
- Log.i(TAG, "Reflecting ping did not result in ping response: " +
- "read=" + received + " expected=" + len);
- return;
- }
-
- byte replyType = buf[hdrLen];
- if ((type == ICMP_ECHO && replyType != ICMP_ECHOREPLY)
- || (type == (byte) ICMP6_ECHO_REQUEST && replyType != (byte) ICMP6_ECHO_REPLY)) {
- Log.i(TAG, "Received unexpected ICMP reply: original " + type
- + ", reply " + replyType);
- return;
- }
-
- // Compare the response we got with the original packet.
- // The only thing that should have changed are addresses, type and checksum.
- // Overwrite them with the received bytes and see if the packet is otherwise identical.
- request[hdrLen] = buf[hdrLen]; // Type
- request[hdrLen + 2] = buf[hdrLen + 2]; // Checksum byte 1.
- request[hdrLen + 3] = buf[hdrLen + 3]; // Checksum byte 2.
-
- // Since Linux kernel 4.2, net.ipv6.auto_flowlabels is set by default, and therefore
- // the request and reply may have different IPv6 flow label: ignore that as well.
- if (version == 6) {
- request[1] = (byte)(request[1] & 0xf0 | buf[1] & 0x0f);
- request[2] = buf[2];
- request[3] = buf[3];
- }
-
- for (int i = 0; i < len; i++) {
- if (buf[i] != request[i]) {
- Log.i(TAG, "Received non-matching packet when expecting ping response.");
- return;
- }
- }
-
- // Now swap the addresses again and reflect the packet. This sends a ping reply.
- swapAddresses(buf, version);
- writePacket(buf, len);
- }
-
- private void writePacket(byte[] buf, int len) {
- try {
- Os.write(mFd, buf, 0, len);
- } catch (ErrnoException|IOException e) {
- Log.e(TAG, "Error writing packet: " + e.getMessage());
- }
- }
-
- private int readPacket(byte[] buf) {
- int len;
- try {
- len = Os.read(mFd, buf, 0, buf.length);
- } catch (ErrnoException|IOException e) {
- Log.e(TAG, "Error reading packet: " + e.getMessage());
- len = -1;
- }
- return len;
- }
-
- // Reads one packet from our mFd, and possibly writes the packet back.
- private void processPacket() {
- int len = readPacket(mBuf);
- if (len < 1) {
- return;
- }
-
- int version = mBuf[0] >> 4;
- int addrPos, protoPos, hdrLen, addrLen;
- if (version == 4) {
- hdrLen = IPV4_HEADER_LENGTH;
- protoPos = IPV4_PROTO_OFFSET;
- addrPos = IPV4_ADDR_OFFSET;
- addrLen = IPV4_ADDR_LENGTH;
- } else if (version == 6) {
- hdrLen = IPV6_HEADER_LENGTH;
- protoPos = IPV6_PROTO_OFFSET;
- addrPos = IPV6_ADDR_OFFSET;
- addrLen = IPV6_ADDR_LENGTH;
- } else {
- return;
- }
-
- if (len < hdrLen) {
- return;
- }
-
- byte proto = mBuf[protoPos];
- switch (proto) {
- case IPPROTO_ICMP:
- case IPPROTO_ICMPV6:
- processIcmpPacket(mBuf, version, len, hdrLen);
- break;
- case IPPROTO_TCP:
- processTcpPacket(mBuf, version, len, hdrLen);
- break;
- case IPPROTO_UDP:
- processUdpPacket(mBuf, version, len, hdrLen);
- break;
- }
- }
-
- public void run() {
- Log.i(TAG, "PacketReflector starting fd=" + mFd + " valid=" + mFd.valid());
- while (!interrupted() && mFd.valid()) {
- processPacket();
- }
- Log.i(TAG, "PacketReflector exiting fd=" + mFd + " valid=" + mFd.valid());
- }
-}
diff --git a/tests/cts/hostside/app/src/com/android/cts/net/hostside/VpnTest.java b/tests/cts/hostside/app/src/com/android/cts/net/hostside/VpnTest.java
index a5bf000..cd3b650 100755
--- a/tests/cts/hostside/app/src/com/android/cts/net/hostside/VpnTest.java
+++ b/tests/cts/hostside/app/src/com/android/cts/net/hostside/VpnTest.java
@@ -18,6 +18,8 @@
import static android.Manifest.permission.MANAGE_TEST_NETWORKS;
import static android.Manifest.permission.NETWORK_SETTINGS;
+import static android.Manifest.permission.READ_DEVICE_CONFIG;
+import static android.Manifest.permission.WRITE_DEVICE_CONFIG;
import static android.content.pm.PackageManager.FEATURE_TELEPHONY;
import static android.content.pm.PackageManager.FEATURE_WIFI;
import static android.net.ConnectivityManager.TYPE_VPN;
@@ -36,6 +38,12 @@
import static androidx.test.platform.app.InstrumentationRegistry.getInstrumentation;
import static com.android.compatibility.common.util.SystemUtil.runWithShellPermissionIdentity;
+import static com.android.cts.net.hostside.VpnTest.TestSocketKeepaliveCallback.CallbackType.ON_DATA_RECEIVED;
+import static com.android.cts.net.hostside.VpnTest.TestSocketKeepaliveCallback.CallbackType.ON_ERROR;
+import static com.android.cts.net.hostside.VpnTest.TestSocketKeepaliveCallback.CallbackType.ON_PAUSED;
+import static com.android.cts.net.hostside.VpnTest.TestSocketKeepaliveCallback.CallbackType.ON_RESUMED;
+import static com.android.cts.net.hostside.VpnTest.TestSocketKeepaliveCallback.CallbackType.ON_STARTED;
+import static com.android.cts.net.hostside.VpnTest.TestSocketKeepaliveCallback.CallbackType.ON_STOPPED;
import static com.android.networkstack.apishim.ConstantsShim.BLOCKED_REASON_LOCKDOWN_VPN;
import static com.android.networkstack.apishim.ConstantsShim.BLOCKED_REASON_NONE;
import static com.android.networkstack.apishim.ConstantsShim.RECEIVER_EXPORTED;
@@ -64,6 +72,7 @@
import android.database.Cursor;
import android.net.ConnectivityManager;
import android.net.ConnectivityManager.NetworkCallback;
+import android.net.IpSecManager;
import android.net.LinkAddress;
import android.net.LinkProperties;
import android.net.Network;
@@ -71,6 +80,7 @@
import android.net.NetworkRequest;
import android.net.Proxy;
import android.net.ProxyInfo;
+import android.net.SocketKeepalive;
import android.net.TestNetworkInterface;
import android.net.TestNetworkManager;
import android.net.TransportInfo;
@@ -79,6 +89,7 @@
import android.net.VpnService;
import android.net.VpnTransportInfo;
import android.net.cts.util.CtsNetUtils;
+import android.net.util.KeepaliveUtils;
import android.net.wifi.WifiManager;
import android.os.Build;
import android.os.Handler;
@@ -87,10 +98,8 @@
import android.os.Process;
import android.os.SystemProperties;
import android.os.UserHandle;
+import android.provider.DeviceConfig;
import android.provider.Settings;
-import android.support.test.uiautomator.UiDevice;
-import android.support.test.uiautomator.UiObject;
-import android.support.test.uiautomator.UiSelector;
import android.system.ErrnoException;
import android.system.Os;
import android.system.OsConstants;
@@ -102,9 +111,14 @@
import android.util.Range;
import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.uiautomator.UiDevice;
+import androidx.test.uiautomator.UiObject;
+import androidx.test.uiautomator.UiSelector;
import com.android.compatibility.common.util.BlockingBroadcastReceiver;
import com.android.modules.utils.build.SdkLevel;
+import com.android.net.module.util.ArrayTrackRecord;
+import com.android.net.module.util.CollectionUtils;
import com.android.net.module.util.PacketBuilder;
import com.android.testutils.DevSdkIgnoreRule;
import com.android.testutils.DevSdkIgnoreRule.IgnoreUpTo;
@@ -140,7 +154,7 @@
import java.util.Random;
import java.util.UUID;
import java.util.concurrent.CompletableFuture;
-import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.Executor;
import java.util.concurrent.TimeUnit;
/**
@@ -190,6 +204,12 @@
public static int SOCKET_TIMEOUT_MS = 100;
public static String TEST_HOST = "connectivitycheck.gstatic.com";
+ private static final String AUTOMATIC_ON_OFF_KEEPALIVE_VERSION =
+ "automatic_on_off_keepalive_version";
+ // Enabled since version 1 means it's always enabled because the version is always above 1
+ private static final String AUTOMATIC_ON_OFF_KEEPALIVE_ENABLED = "1";
+ private static final long TEST_TCP_POLLING_TIMER_EXPIRED_PERIOD_MS = 60_000L;
+
private UiDevice mDevice;
private MyActivity mActivity;
private String mPackageName;
@@ -201,13 +221,15 @@
private Context mTestContext;
private Context mTargetContext;
Network mNetwork;
- NetworkCallback mCallback;
final Object mLock = new Object();
final Object mLockShutdown = new Object();
private String mOldPrivateDnsMode;
private String mOldPrivateDnsSpecifier;
+ // The registered callbacks.
+ private List<NetworkCallback> mRegisteredCallbacks = new ArrayList<>();
+
@Rule
public final DevSdkIgnoreRule mDevSdkIgnoreRule = new DevSdkIgnoreRule();
@@ -228,7 +250,6 @@
@Before
public void setUp() throws Exception {
mNetwork = null;
- mCallback = null;
mTestContext = getInstrumentation().getContext();
mTargetContext = getInstrumentation().getTargetContext();
storePrivateDnsSetting();
@@ -248,15 +269,40 @@
public void tearDown() throws Exception {
restorePrivateDnsSetting();
mRemoteSocketFactoryClient.unbind();
- if (mCallback != null) {
- mCM.unregisterNetworkCallback(mCallback);
- }
mCtsNetUtils.tearDown();
Log.i(TAG, "Stopping VPN");
stopVpn();
+ unregisterRegisteredCallbacks();
mActivity.finish();
}
+ private void registerNetworkCallback(NetworkRequest request, NetworkCallback callback) {
+ mCM.registerNetworkCallback(request, callback);
+ mRegisteredCallbacks.add(callback);
+ }
+
+ private void registerDefaultNetworkCallback(NetworkCallback callback) {
+ mCM.registerDefaultNetworkCallback(callback);
+ mRegisteredCallbacks.add(callback);
+ }
+
+ private void registerSystemDefaultNetworkCallback(NetworkCallback callback, Handler h) {
+ mCM.registerSystemDefaultNetworkCallback(callback, h);
+ mRegisteredCallbacks.add(callback);
+ }
+
+ private void registerDefaultNetworkCallbackForUid(int uid, NetworkCallback callback,
+ Handler h) {
+ mCM.registerDefaultNetworkCallbackForUid(uid, callback, h);
+ mRegisteredCallbacks.add(callback);
+ }
+
+ private void unregisterRegisteredCallbacks() {
+ for (NetworkCallback callback: mRegisteredCallbacks) {
+ mCM.unregisterNetworkCallback(callback);
+ }
+ }
+
private void prepareVpn() throws Exception {
final int REQUEST_ID = 42;
@@ -372,7 +418,7 @@
.removeCapability(NetworkCapabilities.NET_CAPABILITY_NOT_VPN)
.removeCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
.build();
- mCallback = new NetworkCallback() {
+ final NetworkCallback callback = new NetworkCallback() {
public void onAvailable(Network network) {
synchronized (mLock) {
Log.i(TAG, "Got available callback for network=" + network);
@@ -381,7 +427,7 @@
}
}
};
- mCM.registerNetworkCallback(request, mCallback); // Unregistered in tearDown.
+ registerNetworkCallback(request, callback);
// Start the service and wait up for TIMEOUT_MS ms for the VPN to come up.
establishVpn(addresses, routes, excludedRoutes, allowedApplications, disallowedApplications,
@@ -406,7 +452,7 @@
.removeCapability(NetworkCapabilities.NET_CAPABILITY_NOT_VPN)
.removeCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
.build();
- mCallback = new NetworkCallback() {
+ final NetworkCallback callback = new NetworkCallback() {
public void onLost(Network network) {
synchronized (mLockShutdown) {
Log.i(TAG, "Got lost callback for network=" + network
@@ -417,7 +463,7 @@
}
}
};
- mCM.registerNetworkCallback(request, mCallback); // Unregistered in tearDown.
+ registerNetworkCallback(request, callback);
// Simply calling mActivity.stopService() won't stop the service, because the system binds
// to the service for the purpose of sending it a revoke command if another VPN comes up,
// and stopping a bound service has no effect. Instead, "start" the service again with an
@@ -762,29 +808,11 @@
mOldPrivateDnsSpecifier);
}
- // TODO: replace with CtsNetUtils.awaitPrivateDnsSetting in Q or above.
private void expectPrivateDnsHostname(final String hostname) throws Exception {
- final NetworkRequest request = new NetworkRequest.Builder()
- .removeCapability(NetworkCapabilities.NET_CAPABILITY_NOT_VPN)
- .build();
- final CountDownLatch latch = new CountDownLatch(1);
- final NetworkCallback callback = new NetworkCallback() {
- @Override
- public void onLinkPropertiesChanged(Network network, LinkProperties lp) {
- if (network.equals(mNetwork) &&
- Objects.equals(lp.getPrivateDnsServerName(), hostname)) {
- latch.countDown();
- }
- }
- };
-
- mCM.registerNetworkCallback(request, callback);
-
- try {
- assertTrue("Private DNS hostname was not " + hostname + " after " + TIMEOUT_MS + "ms",
- latch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS));
- } finally {
- mCM.unregisterNetworkCallback(callback);
+ for (Network network : mCtsNetUtils.getTestableNetworks()) {
+ // Wait for private DNS setting to propagate.
+ mCtsNetUtils.awaitPrivateDnsSetting("Test wait private DNS setting timeout",
+ network, hostname, false);
}
}
@@ -872,7 +900,7 @@
false /* isAlwaysMetered */);
// Acquire the NETWORK_SETTINGS permission for getting the underlying networks.
runWithShellPermissionIdentity(() -> {
- mCM.registerNetworkCallback(makeVpnNetworkRequest(), callback);
+ registerNetworkCallback(makeVpnNetworkRequest(), callback);
// Check that this VPN doesn't have any underlying networks.
expectUnderlyingNetworks(callback, new ArrayList<Network>());
@@ -905,8 +933,6 @@
} else {
mCtsNetUtils.ensureWifiDisconnected(null);
}
- }, () -> {
- mCM.unregisterNetworkCallback(callback);
});
}
@@ -940,9 +966,9 @@
UserHandle.of(5 /* userId */).getUid(Process.FIRST_APPLICATION_UID);
final Handler h = new Handler(Looper.getMainLooper());
runWithShellPermissionIdentity(() -> {
- mCM.registerSystemDefaultNetworkCallback(systemDefaultCallback, h);
- mCM.registerDefaultNetworkCallbackForUid(otherUid, otherUidCallback, h);
- mCM.registerDefaultNetworkCallbackForUid(Process.myUid(), myUidCallback, h);
+ registerSystemDefaultNetworkCallback(systemDefaultCallback, h);
+ registerDefaultNetworkCallbackForUid(otherUid, otherUidCallback, h);
+ registerDefaultNetworkCallbackForUid(Process.myUid(), myUidCallback, h);
}, NETWORK_SETTINGS);
for (TestableNetworkCallback callback :
List.of(systemDefaultCallback, otherUidCallback, myUidCallback)) {
@@ -993,9 +1019,6 @@
// fail and could cause the default network to switch (e.g., from wifi to cellular).
systemDefaultCallback.assertNoCallback();
otherUidCallback.assertNoCallback();
- mCM.unregisterNetworkCallback(systemDefaultCallback);
- mCM.unregisterNetworkCallback(otherUidCallback);
- mCM.unregisterNetworkCallback(myUidCallback);
}
checkStrictModePrivateDns();
@@ -1024,6 +1047,183 @@
checkStrictModePrivateDns();
}
+ private int getSupportedKeepalives(NetworkCapabilities nc) throws Exception {
+ // Get number of supported concurrent keepalives for testing network.
+ final int[] keepalivesPerTransport = KeepaliveUtils.getSupportedKeepalives(
+ mTargetContext);
+ return KeepaliveUtils.getSupportedKeepalivesForNetworkCapabilities(
+ keepalivesPerTransport, nc);
+ }
+
+ // This class can't be private, otherwise the constants can't be static imported.
+ static class TestSocketKeepaliveCallback extends SocketKeepalive.Callback {
+ // This must be larger than the alarm delay in AutomaticOnOffKeepaliveTracker.
+ private static final int KEEPALIVE_TIMEOUT_MS = 10_000;
+ public enum CallbackType {
+ ON_STARTED,
+ ON_RESUMED,
+ ON_STOPPED,
+ ON_PAUSED,
+ ON_ERROR,
+ ON_DATA_RECEIVED
+ }
+ private ArrayTrackRecord<CallbackType> mHistory = new ArrayTrackRecord<>();
+ private ArrayTrackRecord<CallbackType>.ReadHead mEvents = mHistory.newReadHead();
+
+ @Override
+ public void onStarted() {
+ mHistory.add(ON_STARTED);
+ }
+
+ @Override
+ public void onResumed() {
+ mHistory.add(ON_RESUMED);
+ }
+
+ @Override
+ public void onStopped() {
+ mHistory.add(ON_STOPPED);
+ }
+
+ @Override
+ public void onPaused() {
+ mHistory.add(ON_PAUSED);
+ }
+
+ @Override
+ public void onError(final int error) {
+ mHistory.add(ON_ERROR);
+ }
+
+ @Override
+ public void onDataReceived() {
+ mHistory.add(ON_DATA_RECEIVED);
+ }
+
+ public CallbackType poll() {
+ return mEvents.poll(KEEPALIVE_TIMEOUT_MS, it -> true);
+ }
+ }
+
+ private InetAddress getV4AddrByName(final String hostname) throws Exception {
+ final InetAddress[] allAddrs = InetAddress.getAllByName(hostname);
+ for (InetAddress addr : allAddrs) {
+ if (addr instanceof Inet4Address) return addr;
+ }
+ return null;
+ }
+
+ @Test
+ public void testAutomaticOnOffKeepaliveModeNoClose() throws Exception {
+ doTestAutomaticOnOffKeepaliveMode(false);
+ }
+
+ @Test
+ public void testAutomaticOnOffKeepaliveModeClose() throws Exception {
+ doTestAutomaticOnOffKeepaliveMode(true);
+ }
+
+ private void startKeepalive(SocketKeepalive kp, TestSocketKeepaliveCallback callback) {
+ runWithShellPermissionIdentity(() -> {
+ // Only SocketKeepalive.start() requires READ_DEVICE_CONFIG because feature is protected
+ // by a feature flag. But also verify ON_STARTED callback received here to ensure
+ // keepalive is indeed started because start() runs in the executor thread and shell
+ // permission may be dropped before reading DeviceConfig.
+ kp.start(10 /* intervalSec */, SocketKeepalive.FLAG_AUTOMATIC_ON_OFF, mNetwork);
+
+ // Verify callback status.
+ assertEquals(ON_STARTED, callback.poll());
+ }, READ_DEVICE_CONFIG);
+ }
+
+ private void doTestAutomaticOnOffKeepaliveMode(final boolean closeSocket) throws Exception {
+ assumeTrue(supportedHardware());
+
+ // Get default network first before starting VPN
+ final Network defaultNetwork = mCM.getActiveNetwork();
+ final TestableNetworkCallback cb = new TestableNetworkCallback();
+ registerDefaultNetworkCallback(cb);
+ cb.expect(CallbackEntry.AVAILABLE, defaultNetwork);
+ final NetworkCapabilities cap =
+ cb.expect(CallbackEntry.NETWORK_CAPS_UPDATED, defaultNetwork).getCaps();
+ final LinkProperties lp =
+ cb.expect(CallbackEntry.LINK_PROPERTIES_CHANGED, defaultNetwork).getLp();
+ cb.expect(CallbackEntry.BLOCKED_STATUS, defaultNetwork);
+
+ // Setup VPN
+ final FileDescriptor fd = openSocketFdInOtherApp(TEST_HOST, 80, TIMEOUT_MS);
+ final String allowedApps = mRemoteSocketFactoryClient.getPackageName() + "," + mPackageName;
+ startVpn(new String[]{"192.0.2.2/32", "2001:db8:1:2::ffe/128"},
+ new String[]{"192.0.2.0/24", "2001:db8::/32"},
+ allowedApps, "" /* disallowedApplications */, null /* proxyInfo */,
+ null /* underlyingNetworks */, false /* isAlwaysMetered */);
+ assertSocketClosed(fd, TEST_HOST);
+
+ // Decrease the TCP polling timer for testing.
+ runWithShellPermissionIdentity(() -> mCM.setTestLowTcpPollingTimerForKeepalive(
+ System.currentTimeMillis() + TEST_TCP_POLLING_TIMER_EXPIRED_PERIOD_MS),
+ NETWORK_SETTINGS);
+
+ // Setup keepalive
+ final int supported = getSupportedKeepalives(cap);
+ assumeTrue("Network " + defaultNetwork + " does not support keepalive", supported != 0);
+ final InetAddress srcAddr = CollectionUtils.findFirst(lp.getAddresses(),
+ it -> it instanceof Inet4Address);
+ assumeTrue("This test requires native IPv4", srcAddr != null);
+
+ final TestSocketKeepaliveCallback callback = new TestSocketKeepaliveCallback();
+
+ final String origMode = runWithShellPermissionIdentity(() -> {
+ final String mode = DeviceConfig.getProperty(
+ DeviceConfig.NAMESPACE_TETHERING, AUTOMATIC_ON_OFF_KEEPALIVE_VERSION);
+ DeviceConfig.setProperty(DeviceConfig.NAMESPACE_TETHERING,
+ AUTOMATIC_ON_OFF_KEEPALIVE_VERSION,
+ AUTOMATIC_ON_OFF_KEEPALIVE_ENABLED, false /* makeDefault */);
+ return mode;
+ }, READ_DEVICE_CONFIG, WRITE_DEVICE_CONFIG);
+
+ final IpSecManager ipSec = mTargetContext.getSystemService(IpSecManager.class);
+ SocketKeepalive kp = null;
+ try (IpSecManager.UdpEncapsulationSocket nattSocket = ipSec.openUdpEncapsulationSocket()) {
+ final InetAddress dstAddr = getV4AddrByName(TEST_HOST);
+ assertNotNull(dstAddr);
+
+ // Start keepalive with dynamic keepalive mode enabled.
+ final Executor executor = mTargetContext.getMainExecutor();
+ kp = mCM.createSocketKeepalive(defaultNetwork, nattSocket,
+ srcAddr, dstAddr, executor, callback);
+ startKeepalive(kp, callback);
+
+ // There should be no open sockets on the VPN network, because any
+ // open sockets were closed when startVpn above was called. So the
+ // first TCP poll should trigger ON_PAUSED.
+ assertEquals(ON_PAUSED, callback.poll());
+
+ final Socket s = new Socket();
+ mNetwork.bindSocket(s);
+ s.connect(new InetSocketAddress(dstAddr, 80));
+ assertEquals(ON_RESUMED, callback.poll());
+
+ if (closeSocket) {
+ s.close();
+ assertEquals(ON_PAUSED, callback.poll());
+ }
+
+ kp.stop();
+ assertEquals(ON_STOPPED, callback.poll());
+ } finally {
+ if (kp != null) kp.stop();
+
+ runWithShellPermissionIdentity(() -> {
+ DeviceConfig.setProperty(
+ DeviceConfig.NAMESPACE_TETHERING,
+ AUTOMATIC_ON_OFF_KEEPALIVE_VERSION,
+ origMode, false);
+ mCM.setTestLowTcpPollingTimerForKeepalive(0);
+ }, WRITE_DEVICE_CONFIG, NETWORK_SETTINGS);
+ }
+ }
+
@Test
public void testAppDisallowed() throws Exception {
assumeTrue(supportedHardware());
@@ -1059,6 +1259,31 @@
}
@Test
+ public void testSocketClosed() throws Exception {
+ assumeTrue(supportedHardware());
+
+ final FileDescriptor localFd = openSocketFd(TEST_HOST, 80, TIMEOUT_MS);
+ final List<FileDescriptor> remoteFds = new ArrayList<>();
+
+ for (int i = 0; i < 30; i++) {
+ remoteFds.add(openSocketFdInOtherApp(TEST_HOST, 80, TIMEOUT_MS));
+ }
+
+ final String allowedApps = mRemoteSocketFactoryClient.getPackageName() + "," + mPackageName;
+ startVpn(new String[] {"192.0.2.2/32", "2001:db8:1:2::ffe/128"},
+ new String[] {"192.0.2.0/24", "2001:db8::/32"},
+ allowedApps, "", null, null /* underlyingNetworks */, false /* isAlwaysMetered */);
+
+ // Socket owned by VPN uid is not closed
+ assertSocketStillOpen(localFd, TEST_HOST);
+
+ // Sockets not owned by VPN uid are closed
+ for (final FileDescriptor remoteFd: remoteFds) {
+ assertSocketClosed(remoteFd, TEST_HOST);
+ }
+ }
+
+ @Test
public void testExcludedRoutes() throws Exception {
assumeTrue(supportedHardware());
assumeTrue(SdkLevel.isAtLeastT());
@@ -1623,7 +1848,7 @@
testAndCleanup(() -> {
runWithShellPermissionIdentity(() -> {
- mCM.registerDefaultNetworkCallbackForUid(remoteUid, remoteUidCallback,
+ registerDefaultNetworkCallbackForUid(remoteUid, remoteUidCallback,
new Handler(Looper.getMainLooper()));
}, NETWORK_SETTINGS);
remoteUidCallback.expectAvailableCallbacksWithBlockedReasonNone(network);
@@ -1659,8 +1884,6 @@
checkBlockIncomingPacket(tunFd, remoteUdpFd, EXPECT_BLOCK);
}, /* cleanup */ () -> {
- mCM.unregisterNetworkCallback(remoteUidCallback);
- }, /* cleanup */ () -> {
Os.close(tunFd);
}, /* cleanup */ () -> {
Os.close(remoteUdpFd);
@@ -1684,7 +1907,7 @@
final int myUid = Process.myUid();
testAndCleanup(() -> {
- mCM.registerDefaultNetworkCallback(defaultNetworkCallback);
+ registerDefaultNetworkCallback(defaultNetworkCallback);
defaultNetworkCallback.expectAvailableCallbacks(defaultNetwork);
final Range<Integer> myUidRange = new Range<>(myUid, myUid);
@@ -1716,8 +1939,6 @@
defaultNetworkCallback.eventuallyExpect(CallbackEntry.AVAILABLE,
NETWORK_CALLBACK_TIMEOUT_MS,
entry -> defaultNetwork.equals(entry.getNetwork()));
- }, /* cleanup */ () -> {
- mCM.unregisterNetworkCallback(defaultNetworkCallback);
});
}
diff --git a/tests/cts/hostside/app2/src/com/android/cts/net/hostside/app2/Common.java b/tests/cts/hostside/app2/src/com/android/cts/net/hostside/app2/Common.java
index 2e79182..37dc7a0 100644
--- a/tests/cts/hostside/app2/src/com/android/cts/net/hostside/app2/Common.java
+++ b/tests/cts/hostside/app2/src/com/android/cts/net/hostside/app2/Common.java
@@ -99,7 +99,8 @@
}
case TYPE_COMPONENT_EXPEDITED_JOB: {
final int capabilities = activityManager.getUidProcessCapabilities(Process.myUid());
- if ((capabilities & ActivityManager.PROCESS_CAPABILITY_NETWORK) == 0) {
+ if ((capabilities
+ & ActivityManager.PROCESS_CAPABILITY_POWER_RESTRICTED_NETWORK) == 0) {
observer.onNetworkStateChecked(
INetworkStateObserver.RESULT_ERROR_UNEXPECTED_CAPABILITIES,
"Unexpected capabilities: " + capabilities);
diff --git a/tests/cts/hostside/src/com/android/cts/net/HostsideVpnTests.java b/tests/cts/hostside/src/com/android/cts/net/HostsideVpnTests.java
index 10a2821..3ca4775 100644
--- a/tests/cts/hostside/src/com/android/cts/net/HostsideVpnTests.java
+++ b/tests/cts/hostside/src/com/android/cts/net/HostsideVpnTests.java
@@ -16,6 +16,8 @@
package com.android.cts.net;
+import android.platform.test.annotations.RequiresDevice;
+
public class HostsideVpnTests extends HostsideNetworkTestCase {
@Override
@@ -49,6 +51,10 @@
runDeviceTests(TEST_PKG, TEST_PKG + ".VpnTest", "testAppDisallowed");
}
+ public void testSocketClosed() throws Exception {
+ runDeviceTests(TEST_PKG, TEST_PKG + ".VpnTest", "testSocketClosed");
+ }
+
public void testGetConnectionOwnerUidSecurity() throws Exception {
runDeviceTests(TEST_PKG, TEST_PKG + ".VpnTest", "testGetConnectionOwnerUidSecurity");
}
@@ -89,6 +95,18 @@
TEST_PKG, TEST_PKG + ".VpnTest", "testAlwaysMeteredVpnWithNullUnderlyingNetwork");
}
+ @RequiresDevice // Keepalive is not supported on virtual hardware
+ public void testAutomaticOnOffKeepaliveModeClose() throws Exception {
+ runDeviceTests(
+ TEST_PKG, TEST_PKG + ".VpnTest", "testAutomaticOnOffKeepaliveModeClose");
+ }
+
+ @RequiresDevice // Keepalive is not supported on virtual hardware
+ public void testAutomaticOnOffKeepaliveModeNoClose() throws Exception {
+ runDeviceTests(
+ TEST_PKG, TEST_PKG + ".VpnTest", "testAutomaticOnOffKeepaliveModeNoClose");
+ }
+
public void testAlwaysMeteredVpnWithNonNullUnderlyingNetwork() throws Exception {
runDeviceTests(
TEST_PKG,
diff --git a/tests/cts/hostside/src/com/android/cts/net/ProcNetTest.java b/tests/cts/hostside/src/com/android/cts/net/ProcNetTest.java
index 19e61c6..ff06a90 100644
--- a/tests/cts/hostside/src/com/android/cts/net/ProcNetTest.java
+++ b/tests/cts/hostside/src/com/android/cts/net/ProcNetTest.java
@@ -157,13 +157,24 @@
for (String interfaceDir : mSysctlDirs) {
String path = IPV6_SYSCTL_DIR + "/" + interfaceDir + "/" + "router_solicitations";
int value = readIntFromPath(path);
- assertEquals(IPV6_WIFI_ROUTER_SOLICITATIONS, value);
+ assertEquals(path, IPV6_WIFI_ROUTER_SOLICITATIONS, value);
path = IPV6_SYSCTL_DIR + "/" + interfaceDir + "/" + "router_solicitation_max_interval";
int interval = readIntFromPath(path);
final int lowerBoundSec = 15 * 60;
final int upperBoundSec = 60 * 60;
- assertTrue(lowerBoundSec <= interval);
- assertTrue(interval <= upperBoundSec);
+ assertTrue(path, lowerBoundSec <= interval);
+ assertTrue(path, interval <= upperBoundSec);
}
}
+
+ /**
+ * Verify that cubic is used as the congestion control algorithm.
+ * (This repeats the VTS test, and is here for good performance of the internet as a whole.)
+ * TODO: revisit this once a better CC algorithm like BBR2 is available.
+ */
+ public void testCongestionControl() throws Exception {
+ String path = "/proc/sys/net/ipv4/tcp_congestion_control";
+ String value = mDevice.executeAdbCommand("shell", "cat", path).trim();
+ assertEquals(value, "cubic");
+ }
}
diff --git a/tests/cts/net/Android.bp b/tests/cts/net/Android.bp
index f9fe5b0..1276d59 100644
--- a/tests/cts/net/Android.bp
+++ b/tests/cts/net/Android.bp
@@ -61,7 +61,7 @@
// uncomment when b/13249961 is fixed
// sdk_version: "current",
platform_apis: true,
- data: [":ConnectivityChecker"],
+ data: [":ConnectivityTestPreparer"],
per_testcase_directory: true,
host_required: ["net-tests-utils-host-common"],
test_config_template: "AndroidTestTemplate.xml",
@@ -92,7 +92,7 @@
"NetworkStackApiStableShims",
],
jni_uses_sdk_apis: true,
- min_sdk_version: "29",
+ min_sdk_version: "30",
}
// Networking CTS tests that target the latest released SDK. These tests can be installed on release
diff --git a/tests/cts/net/AndroidManifest.xml b/tests/cts/net/AndroidManifest.xml
index 999614c..68e36ff 100644
--- a/tests/cts/net/AndroidManifest.xml
+++ b/tests/cts/net/AndroidManifest.xml
@@ -37,9 +37,6 @@
<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" />
<uses-permission android:name="android.permission.PACKAGE_USAGE_STATS" />
- <!-- TODO (b/186093901): remove after fixing resource querying -->
- <uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" />
-
<!-- This test also uses signature permissions through adopting the shell identity.
The permissions acquired that way include (probably not exhaustive) :
android.permission.MANAGE_TEST_NETWORKS
diff --git a/tests/cts/net/AndroidTestTemplate.xml b/tests/cts/net/AndroidTestTemplate.xml
index d2fb04a..8efa99f 100644
--- a/tests/cts/net/AndroidTestTemplate.xml
+++ b/tests/cts/net/AndroidTestTemplate.xml
@@ -28,7 +28,7 @@
<option name="cleanup-apks" value="true" />
<option name="test-file-name" value="{MODULE}.apk" />
</target_preparer>
- <target_preparer class="com.android.testutils.ConnectivityCheckTargetPreparer">
+ <target_preparer class="com.android.testutils.ConnectivityTestTargetPreparer">
</target_preparer>
<target_preparer class="com.android.testutils.DisableConfigSyncTargetPreparer">
</target_preparer>
diff --git a/tests/cts/net/jni/Android.bp b/tests/cts/net/jni/Android.bp
index 8f0d78f..a421349 100644
--- a/tests/cts/net/jni/Android.bp
+++ b/tests/cts/net/jni/Android.bp
@@ -31,9 +31,9 @@
"liblog",
],
stl: "libc++_static",
- // To be compatible with Q devices, the min_sdk_version must be 29.
+ // To be compatible with R devices, the min_sdk_version must be 30.
sdk_version: "current",
- min_sdk_version: "29",
+ min_sdk_version: "30",
}
cc_library_shared {
diff --git a/tests/cts/net/jni/NativeMultinetworkJni.cpp b/tests/cts/net/jni/NativeMultinetworkJni.cpp
index 6610d10..f2214a3 100644
--- a/tests/cts/net/jni/NativeMultinetworkJni.cpp
+++ b/tests/cts/net/jni/NativeMultinetworkJni.cpp
@@ -42,11 +42,14 @@
// Since the tests in this file commonly pass expression statements as parameters to these macros,
// get the returned value of the statements to avoid statement double-called.
+// By checking ExceptionCheck(), these macros don't throw another exception if an exception has
+// been thrown, because ART's JNI disallows to throw another exception while an exception is
+// pending (See CheckThread in check_jni.cc).
#define EXPECT_GE(env, actual_stmt, expected_stmt, msg) \
do { \
const auto expected = (expected_stmt); \
const auto actual = (actual_stmt); \
- if (actual < expected) { \
+ if (actual < expected && !env->ExceptionCheck()) { \
jniThrowExceptionFmt(env, "java/lang/AssertionError", \
"%s:%d: %s EXPECT_GE: expected %d, got %d", \
__FILE__, __LINE__, msg, expected, actual); \
@@ -57,7 +60,7 @@
do { \
const auto expected = (expected_stmt); \
const auto actual = (actual_stmt); \
- if (actual <= expected) { \
+ if (actual <= expected && !env->ExceptionCheck()) { \
jniThrowExceptionFmt(env, "java/lang/AssertionError", \
"%s:%d: %s EXPECT_GT: expected %d, got %d", \
__FILE__, __LINE__, msg, expected, actual); \
@@ -68,7 +71,7 @@
do { \
const auto expected = (expected_stmt); \
const auto actual = (actual_stmt); \
- if (actual != expected) { \
+ if (actual != expected && !env->ExceptionCheck()) { \
jniThrowExceptionFmt(env, "java/lang/AssertionError", \
"%s:%d: %s EXPECT_EQ: expected %d, got %d", \
__FILE__, __LINE__, msg, expected, actual); \
diff --git a/tests/cts/net/native/dns/Android.bp b/tests/cts/net/native/dns/Android.bp
index 49b9337..2469710 100644
--- a/tests/cts/net/native/dns/Android.bp
+++ b/tests/cts/net/native/dns/Android.bp
@@ -28,8 +28,8 @@
"libbase",
"libnetdutils",
],
- // To be compatible with Q devices, the min_sdk_version must be 29.
- min_sdk_version: "29",
+ // To be compatible with R devices, the min_sdk_version must be 30.
+ min_sdk_version: "30",
}
cc_test {
diff --git a/tests/cts/net/src/android/net/cts/CaptivePortalTest.kt b/tests/cts/net/src/android/net/cts/CaptivePortalTest.kt
index 7c24c95..dc22369 100644
--- a/tests/cts/net/src/android/net/cts/CaptivePortalTest.kt
+++ b/tests/cts/net/src/android/net/cts/CaptivePortalTest.kt
@@ -37,8 +37,6 @@
import android.net.cts.NetworkValidationTestUtil.setHttpsUrlDeviceConfig
import android.net.cts.NetworkValidationTestUtil.setUrlExpirationDeviceConfig
import android.net.cts.util.CtsNetUtils
-import com.android.net.module.util.NetworkStackConstants.TEST_CAPTIVE_PORTAL_HTTPS_URL
-import com.android.net.module.util.NetworkStackConstants.TEST_CAPTIVE_PORTAL_HTTP_URL
import android.platform.test.annotations.AppModeFull
import android.provider.DeviceConfig
import android.provider.DeviceConfig.NAMESPACE_CONNECTIVITY
@@ -47,28 +45,30 @@
import androidx.test.platform.app.InstrumentationRegistry.getInstrumentation
import androidx.test.runner.AndroidJUnit4
import com.android.modules.utils.build.SdkLevel.isAtLeastR
+import com.android.net.module.util.NetworkStackConstants.TEST_CAPTIVE_PORTAL_HTTPS_URL
+import com.android.net.module.util.NetworkStackConstants.TEST_CAPTIVE_PORTAL_HTTP_URL
import com.android.testutils.DeviceConfigRule
-import com.android.testutils.RecorderCallback
+import com.android.testutils.RecorderCallback.CallbackEntry.CapabilitiesChanged
import com.android.testutils.TestHttpServer
import com.android.testutils.TestHttpServer.Request
import com.android.testutils.TestableNetworkCallback
import com.android.testutils.runAsShell
import fi.iki.elonen.NanoHTTPD.Response.Status
-import junit.framework.AssertionFailedError
-import org.junit.After
-import org.junit.Assume.assumeTrue
-import org.junit.Assume.assumeFalse
-import org.junit.Before
-import org.junit.BeforeClass
-import org.junit.Rule
-import org.junit.runner.RunWith
import java.util.concurrent.CompletableFuture
import java.util.concurrent.TimeUnit
import java.util.concurrent.TimeoutException
+import junit.framework.AssertionFailedError
import kotlin.test.Test
import kotlin.test.assertNotEquals
import kotlin.test.assertNotNull
import kotlin.test.assertTrue
+import org.junit.After
+import org.junit.Assume.assumeFalse
+import org.junit.Assume.assumeTrue
+import org.junit.Before
+import org.junit.BeforeClass
+import org.junit.Rule
+import org.junit.runner.RunWith
private const val TEST_HTTPS_URL_PATH = "/https_path"
private const val TEST_HTTP_URL_PATH = "/http_path"
@@ -151,8 +151,8 @@
.build()
val cellCb = TestableNetworkCallback(timeoutMs = TEST_TIMEOUT_MS)
cm.registerNetworkCallback(cellReq, cellCb)
- val cb = cellCb.eventuallyExpectOrNull<RecorderCallback.CallbackEntry.CapabilitiesChanged> {
- it.network == cellNetwork && it.caps.hasCapability(NET_CAPABILITY_VALIDATED)
+ val cb = cellCb.poll { it.network == cellNetwork &&
+ it is CapabilitiesChanged && it.caps.hasCapability(NET_CAPABILITY_VALIDATED)
}
assertNotNull(cb, "Mobile network $cellNetwork has no access to the internet. " +
"Check the mobile data connection.")
diff --git a/tests/cts/net/src/android/net/cts/ConnectivityDiagnosticsManagerTest.java b/tests/cts/net/src/android/net/cts/ConnectivityDiagnosticsManagerTest.java
index 7662ba3..60befca 100644
--- a/tests/cts/net/src/android/net/cts/ConnectivityDiagnosticsManagerTest.java
+++ b/tests/cts/net/src/android/net/cts/ConnectivityDiagnosticsManagerTest.java
@@ -117,7 +117,7 @@
private static final int FAIL_RATE_PERCENTAGE = 100;
private static final int UNKNOWN_DETECTION_METHOD = 4;
private static final int FILTERED_UNKNOWN_DETECTION_METHOD = 0;
- private static final int CARRIER_CONFIG_CHANGED_BROADCAST_TIMEOUT = 5000;
+ private static final int CARRIER_CONFIG_CHANGED_BROADCAST_TIMEOUT = 10000;
private static final int DELAY_FOR_BROADCAST_IDLE = 30_000;
private static final Executor INLINE_EXECUTOR = x -> x.run();
diff --git a/tests/cts/net/src/android/net/cts/ConnectivityManagerTest.java b/tests/cts/net/src/android/net/cts/ConnectivityManagerTest.java
index 7985dc4..a0508e1 100644
--- a/tests/cts/net/src/android/net/cts/ConnectivityManagerTest.java
+++ b/tests/cts/net/src/android/net/cts/ConnectivityManagerTest.java
@@ -225,6 +225,7 @@
import java.net.InetSocketAddress;
import java.net.MalformedURLException;
import java.net.Socket;
+import java.net.SocketException;
import java.net.URL;
import java.net.UnknownHostException;
import java.nio.charset.StandardCharsets;
@@ -278,6 +279,7 @@
// TODO(b/252972908): reset the original timer when aosp/2188755 is ramped up.
private static final int LISTEN_ACTIVITY_TIMEOUT_MS = 30_000;
private static final int NO_CALLBACK_TIMEOUT_MS = 100;
+ private static final int NETWORK_REQUEST_TIMEOUT_MS = 3000;
private static final int SOCKET_TIMEOUT_MS = 100;
private static final int NUM_TRIES_MULTIPATH_PREF_CHECK = 20;
private static final long INTERVAL_MULTIPATH_PREF_CHECK_MS = 500;
@@ -845,7 +847,7 @@
assumeTrue(mPackageManager.hasSystemFeature(FEATURE_WIFI));
assumeTrue(mPackageManager.hasSystemFeature(FEATURE_TELEPHONY));
- Network wifiNetwork = mCtsNetUtils.connectToWifi();
+ Network wifiNetwork = mCtsNetUtils.ensureWifiConnected();
Network cellNetwork = mCtsNetUtils.connectToCell();
// This server returns the requestor's IP address as the response body.
URL url = new URL("http://google-ipv6test.appspot.com/ip.js?fmt=text");
@@ -1655,7 +1657,8 @@
final NetworkCapabilities nc = mCm.getNetworkCapabilities(network);
// Get number of supported concurrent keepalives for testing network.
- final int[] keepalivesPerTransport = KeepaliveUtils.getSupportedKeepalives(mContext);
+ final int[] keepalivesPerTransport = runAsShell(NETWORK_SETTINGS,
+ () -> mCm.getSupportedKeepalives());
return KeepaliveUtils.getSupportedKeepalivesForNetworkCapabilities(
keepalivesPerTransport, nc);
}
@@ -1670,6 +1673,9 @@
* keepalives is set to 0.
*/
@AppModeFull(reason = "Cannot get WifiManager in instant app mode")
+ // getSupportedKeepalives is available in updatable ConnectivityManager (S+)
+ // Also, this feature is not mainlined before S, and it's fine to skip on R- devices.
+ @DevSdkIgnoreRule.IgnoreUpTo(Build.VERSION_CODES.R) @ConnectivityModuleTest
@Test
public void testKeepaliveWifiUnsupported() throws Exception {
assumeTrue(mPackageManager.hasSystemFeature(FEATURE_WIFI));
@@ -1686,6 +1692,9 @@
}
@AppModeFull(reason = "Cannot get WifiManager in instant app mode")
+ // getSupportedKeepalives is available in updatable ConnectivityManager (S+)
+ // Also, this feature is not mainlined before S, and it's fine to skip on R- devices.
+ @DevSdkIgnoreRule.IgnoreUpTo(Build.VERSION_CODES.R) @ConnectivityModuleTest
@Test
@RequiresDevice // Keepalive is not supported on virtual hardware
public void testCreateTcpKeepalive() throws Exception {
@@ -1894,6 +1903,9 @@
*/
@AppModeFull(reason = "Cannot get WifiManager in instant app mode")
@Test
+ // getSupportedKeepalives is available in updatable ConnectivityManager (S+)
+ // Also, this feature is not mainlined before S, and it's fine to skip on R- devices.
+ @DevSdkIgnoreRule.IgnoreUpTo(Build.VERSION_CODES.R) @ConnectivityModuleTest
@RequiresDevice // Keepalive is not supported on virtual hardware
public void testSocketKeepaliveLimitWifi() throws Exception {
assumeTrue(mPackageManager.hasSystemFeature(FEATURE_WIFI));
@@ -1944,6 +1956,9 @@
*/
@AppModeFull(reason = "Cannot request network in instant app mode")
@Test
+ // getSupportedKeepalives is available in updatable ConnectivityManager (S+)
+ // Also, this feature is not mainlined before S, and it's fine to skip on R- devices.
+ @DevSdkIgnoreRule.IgnoreUpTo(Build.VERSION_CODES.R) @ConnectivityModuleTest
@RequiresDevice // Keepalive is not supported on virtual hardware
public void testSocketKeepaliveLimitTelephony() throws Exception {
if (!mPackageManager.hasSystemFeature(FEATURE_TELEPHONY)) {
@@ -1990,6 +2005,9 @@
*/
@AppModeFull(reason = "Cannot get WifiManager in instant app mode")
@Test
+ // getSupportedKeepalives is available in updatable ConnectivityManager (S+)
+ // Also, this feature is not mainlined before S, and it's fine to skip on R- devices.
+ @DevSdkIgnoreRule.IgnoreUpTo(Build.VERSION_CODES.R) @ConnectivityModuleTest
@RequiresDevice // Keepalive is not supported on virtual hardware
public void testSocketKeepaliveUnprivileged() throws Exception {
assumeTrue(mPackageManager.hasSystemFeature(FEATURE_WIFI));
@@ -2112,7 +2130,12 @@
@AppModeFull(reason = "NETWORK_AIRPLANE_MODE permission can't be granted to instant apps")
@Test
public void testSetAirplaneMode() throws Exception{
- final boolean supportWifi = mPackageManager.hasSystemFeature(FEATURE_WIFI);
+ // Starting from T, wifi supports airplane mode enhancement which may not disconnect wifi
+ // when airplane mode is on. The actual behavior that the device will have could only be
+ // checked with hidden wifi APIs(see Settings.Secure.WIFI_APM_STATE). Thus, stop verifying
+ // wifi on T+ device.
+ final boolean verifyWifi = mPackageManager.hasSystemFeature(FEATURE_WIFI)
+ && !SdkLevel.isAtLeastT();
final boolean supportTelephony = mPackageManager.hasSystemFeature(FEATURE_TELEPHONY);
// store the current state of airplane mode
final boolean isAirplaneModeEnabled = isAirplaneModeEnabled();
@@ -2123,7 +2146,7 @@
// Verify that networks are available as expected if wifi or cell is supported. Continue the
// test if none of them are supported since test should still able to verify the permission
// mechanism.
- if (supportWifi) {
+ if (verifyWifi) {
mCtsNetUtils.ensureWifiConnected();
registerCallbackAndWaitForAvailable(makeWifiNetworkRequest(), wifiCb);
}
@@ -2147,7 +2170,7 @@
// Verify that the enabling airplane mode takes effect as expected to prevent flakiness
// caused by fast airplane mode switches. Ensure network lost before turning off
// airplane mode.
- if (supportWifi) waitForLost(wifiCb);
+ if (verifyWifi) waitForLost(wifiCb);
if (supportTelephony) waitForLost(telephonyCb);
// Verify we can disable Airplane Mode with correct permission:
@@ -2156,7 +2179,7 @@
// Verify that turning airplane mode off takes effect as expected.
// connectToCell only registers a request, it cannot / does not need to be called twice
mCtsNetUtils.ensureWifiConnected();
- if (supportWifi) waitForAvailable(wifiCb);
+ if (verifyWifi) waitForAvailable(wifiCb);
if (supportTelephony) waitForAvailable(telephonyCb);
} finally {
// Restore the previous state of airplane mode and permissions:
@@ -2176,15 +2199,12 @@
c -> c instanceof CallbackEntry.Available);
}
- private void waitForAvailable(
+ private void waitForTransport(
@NonNull final TestableNetworkCallback cb, final int expectedTransport) {
- cb.eventuallyExpect(
- CallbackEntry.AVAILABLE, NETWORK_CALLBACK_TIMEOUT_MS,
- entry -> {
- final NetworkCapabilities nc = mCm.getNetworkCapabilities(entry.getNetwork());
- return nc.hasTransport(expectedTransport);
- }
- );
+ cb.eventuallyExpect(CallbackEntry.NETWORK_CAPS_UPDATED,
+ NETWORK_CALLBACK_TIMEOUT_MS,
+ entry -> ((CallbackEntry.CapabilitiesChanged) entry).getCaps()
+ .hasTransport(expectedTransport));
}
private void waitForAvailable(
@@ -2409,6 +2429,7 @@
}
}
+ @AppModeFull(reason = "Cannot get WifiManager in instant app mode")
@Test
public void testBlockedStatusCallback() throws Exception {
// Cannot use @IgnoreUpTo(Build.VERSION_CODES.R) because this test also requires API 31
@@ -2434,11 +2455,11 @@
runWithShellPermissionIdentity(() -> registerDefaultNetworkCallbackForUid(
otherUid, otherUidCallback, handler), NETWORK_SETTINGS);
- final Network defaultNetwork = mCm.getActiveNetwork();
+ final Network defaultNetwork = myUidCallback.expect(CallbackEntry.AVAILABLE).getNetwork();
final List<DetailedBlockedStatusCallback> allCallbacks =
List.of(myUidCallback, otherUidCallback);
for (DetailedBlockedStatusCallback callback : allCallbacks) {
- callback.expectAvailableCallbacksWithBlockedReasonNone(defaultNetwork);
+ callback.eventuallyExpectBlockedStatusCallback(defaultNetwork, BLOCKED_REASON_NONE);
}
final Range<Integer> myUidRange = new Range<>(myUid, myUid);
@@ -2539,9 +2560,10 @@
assertThrows(SecurityException.class, () -> mCm.factoryReset());
}
- @AppModeFull(reason = "Cannot get WifiManager in instant app mode")
- @Test
- public void testFactoryReset() throws Exception {
+ // @AppModeFull(reason = "Cannot get WifiManager in instant app mode")
+ // @Test
+ // Temporarily disable the unreliable test, which is blocked by b/254183718.
+ private void testFactoryReset() throws Exception {
assumeTrue(TestUtils.shouldTestSApis());
// Store current settings.
@@ -2554,16 +2576,23 @@
tetherUtils.registerTetheringEventCallback();
try {
tetherEventCallback.assumeWifiTetheringSupported(mContext);
+ // To prevent WiFi-to-WiFi interruption while entering APM:
+ // - If WiFi is retained while entering APM, hotspot will also remain enabled.
+ // - If WiFi is off before APM or disabled while entering APM, hotspot will be
+ // disabled.
+ //
+ // To ensure hotspot always be disabled after enabling APM, disable wifi before
+ // enabling the hotspot.
+ mCtsNetUtils.disableWifi();
- final TestableNetworkCallback wifiCb = new TestableNetworkCallback();
- mCtsNetUtils.ensureWifiConnected();
- registerCallbackAndWaitForAvailable(makeWifiNetworkRequest(), wifiCb);
+ tetherUtils.startWifiTethering(tetherEventCallback);
// Update setting to verify the behavior.
setAirplaneMode(true);
- // Verify wifi lost to make sure airplane mode takes effect. This could
+ // Verify softap lost to make sure airplane mode takes effect. This could
// prevent the race condition between airplane mode enabled and the followed
// up wifi tethering enabled.
- waitForLost(wifiCb);
+ tetherEventCallback.expectNoTetheringActive();
+
// start wifi tethering
tetherUtils.startWifiTethering(tetherEventCallback);
@@ -2588,6 +2617,7 @@
ConnectivitySettingsManager.setPrivateDnsMode(mContext, curPrivateDnsMode);
tetherUtils.unregisterTetheringEventCallback(tetherEventCallback);
tetherUtils.stopAllTethering();
+ mCtsNetUtils.ensureWifiConnected();
}
}
@@ -2672,7 +2702,8 @@
// Validate that an unmetered network is used over other networks.
waitForAvailable(defaultCallback, wifiNetwork);
- waitForAvailable(systemDefaultCallback, wifiNetwork);
+ systemDefaultCallback.eventuallyExpect(CallbackEntry.AVAILABLE,
+ NETWORK_CALLBACK_TIMEOUT_MS, cb -> wifiNetwork.equals(cb.getNetwork()));
// Validate that when setting unmetered to metered, unmetered is lost and replaced by
// the network with the TEST transport. Also wait for validation here, in case there
@@ -2684,11 +2715,14 @@
// callbacks may be received. Eventually, metered Wi-Fi should be the final available
// callback in any case therefore confirm its receipt before continuing to assure the
// system is in the expected state.
- waitForAvailable(systemDefaultCallback, TRANSPORT_WIFI);
+ waitForTransport(systemDefaultCallback, TRANSPORT_WIFI);
}, /* cleanup */ () -> {
- // Validate that removing the test network will fallback to the default network.
+ // Validate that removing the test network will fallback to the default network.
runWithShellPermissionIdentity(tnt::teardown);
- defaultCallback.expect(CallbackEntry.LOST, tnt, NETWORK_CALLBACK_TIMEOUT_MS);
+ // The other callbacks (LP or NC changes) would receive before LOST callback. Use
+ // eventuallyExpect to check callback for avoiding test flake.
+ defaultCallback.eventuallyExpect(CallbackEntry.LOST, NETWORK_CALLBACK_TIMEOUT_MS,
+ lost -> tnt.getNetwork().equals(lost.getNetwork()));
waitForAvailable(defaultCallback);
}, /* cleanup */ () -> {
setWifiMeteredStatusAndWait(ssid, oldMeteredValue, false /* waitForValidation */);
@@ -2708,6 +2742,7 @@
// Cannot use @IgnoreUpTo(Build.VERSION_CODES.R) because this test also requires API 31
// shims, and @IgnoreUpTo does not check that.
assumeTrue(TestUtils.shouldTestSApis());
+ assumeTrue(mPackageManager.hasSystemFeature(FEATURE_WIFI));
final TestNetworkTracker tnt = callWithShellPermissionIdentity(
() -> initTestNetwork(mContext, TEST_LINKADDR, NETWORK_CALLBACK_TIMEOUT_MS));
@@ -2721,7 +2756,8 @@
OemNetworkPreferences.OEM_NETWORK_PREFERENCE_TEST_ONLY);
registerTestOemNetworkPreferenceCallbacks(defaultCallback, systemDefaultCallback);
waitForAvailable(defaultCallback, tnt.getNetwork());
- waitForAvailable(systemDefaultCallback, wifiNetwork);
+ systemDefaultCallback.eventuallyExpect(CallbackEntry.AVAILABLE,
+ NETWORK_CALLBACK_TIMEOUT_MS, cb -> wifiNetwork.equals(cb.getNetwork()));
}, /* cleanup */ () -> {
runWithShellPermissionIdentity(tnt::teardown);
defaultCallback.expect(CallbackEntry.LOST, tnt, NETWORK_CALLBACK_TIMEOUT_MS);
@@ -2945,13 +2981,13 @@
allowBadWifi();
- final Network cellNetwork = mCtsNetUtils.connectToCell();
- final Network wifiNetwork = prepareValidatedNetwork();
-
- registerDefaultNetworkCallback(defaultCb);
- registerNetworkCallback(makeWifiNetworkRequest(), wifiCb);
-
try {
+ final Network cellNetwork = mCtsNetUtils.connectToCell();
+ final Network wifiNetwork = prepareValidatedNetwork();
+
+ registerDefaultNetworkCallback(defaultCb);
+ registerNetworkCallback(makeWifiNetworkRequest(), wifiCb);
+
// Verify wifi is the default network.
defaultCb.eventuallyExpect(CallbackEntry.AVAILABLE, NETWORK_CALLBACK_TIMEOUT_MS,
entry -> wifiNetwork.equals(entry.getNetwork()));
@@ -3116,7 +3152,8 @@
}
@AppModeFull(reason = "Need WiFi support to test the default active network")
- @Test
+ // NetworkActivityTracker is not mainlined before S.
+ @Test @DevSdkIgnoreRule.IgnoreUpTo(Build.VERSION_CODES.R)
public void testDefaultNetworkActiveListener() throws Exception {
final boolean supportWifi = mPackageManager.hasSystemFeature(FEATURE_WIFI);
final boolean supportTelephony = mPackageManager.hasSystemFeature(FEATURE_TELEPHONY);
@@ -3200,7 +3237,8 @@
newMobileDataPreferredUids.add(uid);
ConnectivitySettingsManager.setMobileDataPreferredUids(
mContext, newMobileDataPreferredUids);
- waitForAvailable(defaultTrackingCb, cellNetwork);
+ defaultTrackingCb.eventuallyExpect(CallbackEntry.AVAILABLE, NETWORK_CALLBACK_TIMEOUT_MS,
+ entry -> cellNetwork.equals(entry.getNetwork()));
// No change for system default network. Expect no callback except CapabilitiesChanged
// or LinkPropertiesChanged which may be triggered randomly from wifi network.
assertNoCallbackExceptCapOrLpChange(systemDefaultCb);
@@ -3212,7 +3250,8 @@
newMobileDataPreferredUids.remove(uid);
ConnectivitySettingsManager.setMobileDataPreferredUids(
mContext, newMobileDataPreferredUids);
- waitForAvailable(defaultTrackingCb, wifiNetwork);
+ defaultTrackingCb.eventuallyExpect(CallbackEntry.AVAILABLE, NETWORK_CALLBACK_TIMEOUT_MS,
+ entry -> wifiNetwork.equals(entry.getNetwork()));
// No change for system default network. Expect no callback except CapabilitiesChanged
// or LinkPropertiesChanged which may be triggered randomly from wifi network.
assertNoCallbackExceptCapOrLpChange(systemDefaultCb);
@@ -3375,6 +3414,7 @@
private void checkFirewallBlocking(final DatagramSocket srcSock, final DatagramSocket dstSock,
final boolean expectBlock, final int chain) throws Exception {
+ final int uid = Process.myUid();
final Random random = new Random();
final byte[] sendData = new byte[100];
random.nextBytes(sendData);
@@ -3390,22 +3430,27 @@
fail("Expect not to be blocked by firewall but sending packet was blocked:"
+ " chain=" + chain
+ " chainEnabled=" + mCm.getFirewallChainEnabled(chain)
- + " uidFirewallRule=" + mCm.getUidFirewallRule(chain, Process.myUid()));
+ + " uid=" + uid
+ + " uidFirewallRule=" + mCm.getUidFirewallRule(chain, uid));
}
+ dstSock.receive(pkt);
+ assertArrayEquals(sendData, pkt.getData());
+
if (expectBlock) {
fail("Expect to be blocked by firewall but sending packet was not blocked:"
+ " chain=" + chain
+ " chainEnabled=" + mCm.getFirewallChainEnabled(chain)
- + " uidFirewallRule=" + mCm.getUidFirewallRule(chain, Process.myUid()));
+ + " uid=" + uid
+ + " uidFirewallRule=" + mCm.getUidFirewallRule(chain, uid));
}
-
- dstSock.receive(pkt);
- assertArrayEquals(sendData, pkt.getData());
}
private static final boolean EXPECT_PASS = false;
private static final boolean EXPECT_BLOCK = true;
+
+ // ALLOWLIST means the firewall denies all by default, uids must be explicitly allowed
+ // DENYLIST means the firewall allows all by default, uids must be explicitly denyed
private static final boolean ALLOWLIST = true;
private static final boolean DENYLIST = false;
@@ -3471,20 +3516,149 @@
@Test @IgnoreUpTo(SC_V2) @ConnectivityModuleTest
@AppModeFull(reason = "Socket cannot bind in instant app mode")
- public void testFirewallBlocking() {
- // ALLOWLIST means the firewall denies all by default, uids must be explicitly allowed
+ public void testFirewallBlockingDozable() {
doTestFirewallBlocking(FIREWALL_CHAIN_DOZABLE, ALLOWLIST);
- doTestFirewallBlocking(FIREWALL_CHAIN_POWERSAVE, ALLOWLIST);
- doTestFirewallBlocking(FIREWALL_CHAIN_RESTRICTED, ALLOWLIST);
- doTestFirewallBlocking(FIREWALL_CHAIN_LOW_POWER_STANDBY, ALLOWLIST);
+ }
- // DENYLIST means the firewall allows all by default, uids must be explicitly denyed
+ @Test @IgnoreUpTo(SC_V2) @ConnectivityModuleTest
+ @AppModeFull(reason = "Socket cannot bind in instant app mode")
+ public void testFirewallBlockingPowersave() {
+ doTestFirewallBlocking(FIREWALL_CHAIN_POWERSAVE, ALLOWLIST);
+ }
+
+ @Test @IgnoreUpTo(SC_V2) @ConnectivityModuleTest
+ @AppModeFull(reason = "Socket cannot bind in instant app mode")
+ public void testFirewallBlockingRestricted() {
+ doTestFirewallBlocking(FIREWALL_CHAIN_RESTRICTED, ALLOWLIST);
+ }
+
+ @Test @IgnoreUpTo(SC_V2) @ConnectivityModuleTest
+ @AppModeFull(reason = "Socket cannot bind in instant app mode")
+ public void testFirewallBlockingLowPowerStandby() {
+ doTestFirewallBlocking(FIREWALL_CHAIN_LOW_POWER_STANDBY, ALLOWLIST);
+ }
+
+ @Test @IgnoreUpTo(SC_V2) @ConnectivityModuleTest
+ @AppModeFull(reason = "Socket cannot bind in instant app mode")
+ public void testFirewallBlockingStandby() {
doTestFirewallBlocking(FIREWALL_CHAIN_STANDBY, DENYLIST);
+ }
+
+ @Test @IgnoreUpTo(SC_V2) @ConnectivityModuleTest
+ @AppModeFull(reason = "Socket cannot bind in instant app mode")
+ public void testFirewallBlockingOemDeny1() {
doTestFirewallBlocking(FIREWALL_CHAIN_OEM_DENY_1, DENYLIST);
+ }
+
+ @Test @IgnoreUpTo(SC_V2) @ConnectivityModuleTest
+ @AppModeFull(reason = "Socket cannot bind in instant app mode")
+ public void testFirewallBlockingOemDeny2() {
doTestFirewallBlocking(FIREWALL_CHAIN_OEM_DENY_2, DENYLIST);
+ }
+
+ @Test @IgnoreUpTo(SC_V2) @ConnectivityModuleTest
+ @AppModeFull(reason = "Socket cannot bind in instant app mode")
+ public void testFirewallBlockingOemDeny3() {
doTestFirewallBlocking(FIREWALL_CHAIN_OEM_DENY_3, DENYLIST);
}
+ private void assertSocketOpen(final Socket socket) throws Exception {
+ mCtsNetUtils.testHttpRequest(socket);
+ }
+
+ private void assertSocketClosed(final Socket socket) throws Exception {
+ try {
+ mCtsNetUtils.testHttpRequest(socket);
+ fail("Socket is expected to be closed");
+ } catch (SocketException expected) {
+ }
+ }
+
+ private static final boolean EXPECT_OPEN = false;
+ private static final boolean EXPECT_CLOSE = true;
+
+ private void doTestFirewallCloseSocket(final int chain, final int rule, final int targetUid,
+ final boolean expectClose) {
+ runWithShellPermissionIdentity(() -> {
+ // Firewall chain status will be restored after the test.
+ final boolean wasChainEnabled = mCm.getFirewallChainEnabled(chain);
+ final int previousUidFirewallRule = mCm.getUidFirewallRule(chain, targetUid);
+ final Socket socket = new Socket(TEST_HOST, HTTP_PORT);
+ socket.setSoTimeout(NETWORK_REQUEST_TIMEOUT_MS);
+ testAndCleanup(() -> {
+ mCm.setFirewallChainEnabled(chain, false /* enable */);
+ assertSocketOpen(socket);
+
+ try {
+ mCm.setUidFirewallRule(chain, targetUid, rule);
+ } catch (IllegalStateException ignored) {
+ // Removing match causes an exception when the rule entry for the uid does
+ // not exist. But this is fine and can be ignored.
+ }
+ mCm.setFirewallChainEnabled(chain, true /* enable */);
+
+ if (expectClose) {
+ assertSocketClosed(socket);
+ } else {
+ assertSocketOpen(socket);
+ }
+ }, /* cleanup */ () -> {
+ // Restore the global chain status
+ mCm.setFirewallChainEnabled(chain, wasChainEnabled);
+ }, /* cleanup */ () -> {
+ // Restore the uid firewall rule status
+ try {
+ mCm.setUidFirewallRule(chain, targetUid, previousUidFirewallRule);
+ } catch (IllegalStateException ignored) {
+ // Removing match causes an exception when the rule entry for the uid does
+ // not exist. But this is fine and can be ignored.
+ }
+ }, /* cleanup */ () -> {
+ socket.close();
+ });
+ }, NETWORK_SETTINGS);
+ }
+
+ @Test @IgnoreUpTo(Build.VERSION_CODES.TIRAMISU) @ConnectivityModuleTest
+ public void testFirewallCloseSocketAllowlistChainAllow() {
+ doTestFirewallCloseSocket(FIREWALL_CHAIN_DOZABLE, FIREWALL_RULE_ALLOW,
+ Process.myUid(), EXPECT_OPEN);
+ }
+
+ @Test @IgnoreUpTo(Build.VERSION_CODES.TIRAMISU) @ConnectivityModuleTest
+ public void testFirewallCloseSocketAllowlistChainDeny() {
+ doTestFirewallCloseSocket(FIREWALL_CHAIN_DOZABLE, FIREWALL_RULE_DENY,
+ Process.myUid(), EXPECT_CLOSE);
+ }
+
+ @Test @IgnoreUpTo(Build.VERSION_CODES.TIRAMISU) @ConnectivityModuleTest
+ public void testFirewallCloseSocketAllowlistChainOtherUid() {
+ doTestFirewallCloseSocket(FIREWALL_CHAIN_DOZABLE, FIREWALL_RULE_ALLOW,
+ Process.myUid() + 1, EXPECT_CLOSE);
+ doTestFirewallCloseSocket(FIREWALL_CHAIN_DOZABLE, FIREWALL_RULE_DENY,
+ Process.myUid() + 1, EXPECT_CLOSE);
+ }
+
+ @Test @IgnoreUpTo(Build.VERSION_CODES.TIRAMISU) @ConnectivityModuleTest
+ public void testFirewallCloseSocketDenylistChainAllow() {
+ doTestFirewallCloseSocket(FIREWALL_CHAIN_STANDBY, FIREWALL_RULE_ALLOW,
+ Process.myUid(), EXPECT_OPEN);
+ }
+
+ @Test @IgnoreUpTo(Build.VERSION_CODES.TIRAMISU) @ConnectivityModuleTest
+ public void testFirewallCloseSocketDenylistChainDeny() {
+ doTestFirewallCloseSocket(FIREWALL_CHAIN_STANDBY, FIREWALL_RULE_DENY,
+ Process.myUid(), EXPECT_CLOSE);
+ }
+
+ @Test @IgnoreUpTo(Build.VERSION_CODES.TIRAMISU) @ConnectivityModuleTest
+ public void testFirewallCloseSocketDenylistChainOtherUid() {
+ doTestFirewallCloseSocket(FIREWALL_CHAIN_STANDBY, FIREWALL_RULE_ALLOW,
+ Process.myUid() + 1, EXPECT_OPEN);
+ doTestFirewallCloseSocket(FIREWALL_CHAIN_STANDBY, FIREWALL_RULE_DENY,
+ Process.myUid() + 1, EXPECT_OPEN);
+ }
+
private void assumeTestSApis() {
// Cannot use @IgnoreUpTo(Build.VERSION_CODES.R) because this test also requires API 31
// shims, and @IgnoreUpTo does not check that.
diff --git a/tests/cts/net/src/android/net/cts/EthernetManagerTest.kt b/tests/cts/net/src/android/net/cts/EthernetManagerTest.kt
index b924f65..732a42b 100644
--- a/tests/cts/net/src/android/net/cts/EthernetManagerTest.kt
+++ b/tests/cts/net/src/android/net/cts/EthernetManagerTest.kt
@@ -392,7 +392,15 @@
}
// Setting the carrier up / down relies on TUNSETCARRIER which was added in kernel version 5.0.
- private fun assumeChangingCarrierSupported() = assumeTrue(isKernelVersionAtLeast("5.0.0"))
+ private fun assumeChangingCarrierSupported() {
+ assumeTrue(isKernelVersionAtLeast("5.0.0"))
+ }
+
+ // Configuring a tap interface without carrier relies on IFF_NO_CARRIER
+ // which was added in kernel version 6.0.
+ private fun assumeCreateInterfaceWithoutCarrierSupported() {
+ assumeTrue(isKernelVersionAtLeast("6.0.0"))
+ }
private fun isAdbOverEthernet(): Boolean {
// If no ethernet interface is available, adb is not connected over ethernet.
@@ -417,7 +425,7 @@
}
// WARNING: setting hasCarrier to false requires kernel support. Call
- // assumeChangingCarrierSupported() at the top of your test.
+ // assumeCreateInterfaceWithoutCarrierSupported() at the top of your test.
private fun createInterface(hasCarrier: Boolean = true): EthernetTestInterface {
val iface = EthernetTestInterface(
context,
@@ -644,10 +652,9 @@
val listener = EthernetStateListener()
addInterfaceStateListener(listener)
- // TODO(b/236895792): THIS IS A BUG! Existing server mode interfaces are not reported when
- // an InterfaceStateListener is registered.
// Note: using eventuallyExpect as there may be other interfaces present.
- // listener.eventuallyExpect(iface, STATE_LINK_UP, ROLE_SERVER)
+ listener.eventuallyExpect(InterfaceStateChanged(iface.name,
+ STATE_LINK_UP, ROLE_SERVER, /* IpConfiguration */ null))
releaseTetheredInterface()
listener.eventuallyExpect(iface, STATE_LINK_UP, ROLE_CLIENT)
@@ -792,15 +799,13 @@
@Test
fun testNetworkRequest_forInterfaceWhileTogglingCarrier() {
+ assumeCreateInterfaceWithoutCarrierSupported()
assumeChangingCarrierSupported()
val iface = createInterface(false /* hasCarrier */)
val cb = requestNetwork(ETH_REQUEST)
- // TUNSETCARRIER races with the bring up code, so the network *can* become available despite
- // it being "created with no carrier".
- // TODO(b/249611919): re-enable assertion once kernel supports IFF_NO_CARRIER.
- // cb.assertNeverAvailable()
+ cb.assertNeverAvailable()
iface.setCarrierEnabled(true)
cb.expect<Available>()
diff --git a/tests/cts/net/src/android/net/cts/Ikev2VpnTest.java b/tests/cts/net/src/android/net/cts/Ikev2VpnTest.java
index 6ba0fda..805dd65 100644
--- a/tests/cts/net/src/android/net/cts/Ikev2VpnTest.java
+++ b/tests/cts/net/src/android/net/cts/Ikev2VpnTest.java
@@ -60,7 +60,11 @@
import com.android.internal.util.HexDump;
import com.android.networkstack.apishim.ConstantsShim;
+import com.android.networkstack.apishim.Ikev2VpnProfileBuilderShimImpl;
+import com.android.networkstack.apishim.Ikev2VpnProfileShimImpl;
import com.android.networkstack.apishim.VpnManagerShimImpl;
+import com.android.networkstack.apishim.common.Ikev2VpnProfileBuilderShim;
+import com.android.networkstack.apishim.common.Ikev2VpnProfileShim;
import com.android.networkstack.apishim.common.VpnManagerShim;
import com.android.networkstack.apishim.common.VpnProfileStateShim;
import com.android.testutils.DevSdkIgnoreRule;
@@ -223,17 +227,28 @@
}
private Ikev2VpnProfile buildIkev2VpnProfileCommon(
- @NonNull Ikev2VpnProfile.Builder builder, boolean isRestrictedToTestNetworks,
- boolean requiresValidation) throws Exception {
+ @NonNull Ikev2VpnProfileBuilderShim builderShim, boolean isRestrictedToTestNetworks,
+ boolean requiresValidation, boolean automaticIpVersionSelectionEnabled,
+ boolean automaticNattKeepaliveTimerEnabled) throws Exception {
- builder.setBypassable(true)
+ builderShim.setBypassable(true)
.setAllowedAlgorithms(TEST_ALLOWED_ALGORITHMS)
.setProxy(TEST_PROXY_INFO)
.setMaxMtu(TEST_MTU)
.setMetered(false);
if (TestUtils.shouldTestTApis()) {
- builder.setRequiresInternetValidation(requiresValidation);
+ builderShim.setRequiresInternetValidation(requiresValidation);
}
+
+ if (TestUtils.shouldTestUApis()) {
+ builderShim.setAutomaticIpVersionSelectionEnabled(automaticIpVersionSelectionEnabled);
+ builderShim.setAutomaticNattKeepaliveTimerEnabled(automaticNattKeepaliveTimerEnabled);
+ }
+
+ // Convert shim back to Ikev2VpnProfile.Builder since restrictToTestNetworks is a hidden
+ // method and is not defined in shims.
+ // TODO: replace it in alternative way to remove the hidden method usage
+ final Ikev2VpnProfile.Builder builder = (Ikev2VpnProfile.Builder) builderShim.getBuilder();
if (isRestrictedToTestNetworks) {
builder.restrictToTestNetworks();
}
@@ -249,13 +264,16 @@
? IkeSessionTestUtils.IKE_PARAMS_V6 : IkeSessionTestUtils.IKE_PARAMS_V4,
IkeSessionTestUtils.CHILD_PARAMS);
- final Ikev2VpnProfile.Builder builder =
- new Ikev2VpnProfile.Builder(params)
+ final Ikev2VpnProfileBuilderShim builderShim =
+ Ikev2VpnProfileBuilderShimImpl.newInstance(params)
.setRequiresInternetValidation(requiresValidation)
.setProxy(TEST_PROXY_INFO)
.setMaxMtu(TEST_MTU)
.setMetered(false);
-
+ // Convert shim back to Ikev2VpnProfile.Builder since restrictToTestNetworks is a hidden
+ // method and is not defined in shims.
+ // TODO: replace it in alternative way to remove the hidden method usage
+ final Ikev2VpnProfile.Builder builder = (Ikev2VpnProfile.Builder) builderShim.getBuilder();
if (isRestrictedToTestNetworks) {
builder.restrictToTestNetworks();
}
@@ -263,31 +281,35 @@
}
private Ikev2VpnProfile buildIkev2VpnProfilePsk(@NonNull String remote,
- boolean isRestrictedToTestNetworks, boolean requiresValidation) throws Exception {
- final Ikev2VpnProfile.Builder builder =
- new Ikev2VpnProfile.Builder(remote, TEST_IDENTITY).setAuthPsk(TEST_PSK);
+ boolean isRestrictedToTestNetworks, boolean requiresValidation)
+ throws Exception {
+ final Ikev2VpnProfileBuilderShim builder =
+ Ikev2VpnProfileBuilderShimImpl.newInstance(remote, TEST_IDENTITY)
+ .setAuthPsk(TEST_PSK);
return buildIkev2VpnProfileCommon(builder, isRestrictedToTestNetworks,
- requiresValidation);
+ requiresValidation, false /* automaticIpVersionSelectionEnabled */,
+ false /* automaticNattKeepaliveTimerEnabled */);
}
private Ikev2VpnProfile buildIkev2VpnProfileUsernamePassword(boolean isRestrictedToTestNetworks)
throws Exception {
-
- final Ikev2VpnProfile.Builder builder =
- new Ikev2VpnProfile.Builder(TEST_SERVER_ADDR_V6, TEST_IDENTITY)
+ final Ikev2VpnProfileBuilderShim builder =
+ Ikev2VpnProfileBuilderShimImpl.newInstance(TEST_SERVER_ADDR_V6, TEST_IDENTITY)
.setAuthUsernamePassword(TEST_USER, TEST_PASSWORD, mServerRootCa);
return buildIkev2VpnProfileCommon(builder, isRestrictedToTestNetworks,
- false /* requiresValidation */);
+ false /* requiresValidation */, false /* automaticIpVersionSelectionEnabled */,
+ false /* automaticNattKeepaliveTimerEnabled */);
}
private Ikev2VpnProfile buildIkev2VpnProfileDigitalSignature(boolean isRestrictedToTestNetworks)
throws Exception {
- final Ikev2VpnProfile.Builder builder =
- new Ikev2VpnProfile.Builder(TEST_SERVER_ADDR_V6, TEST_IDENTITY)
+ final Ikev2VpnProfileBuilderShim builder =
+ Ikev2VpnProfileBuilderShimImpl.newInstance(TEST_SERVER_ADDR_V6, TEST_IDENTITY)
.setAuthDigitalSignature(
mUserCertKey.cert, mUserCertKey.key, mServerRootCa);
return buildIkev2VpnProfileCommon(builder, isRestrictedToTestNetworks,
- false /* requiresValidation */);
+ false /* requiresValidation */, false /* automaticIpVersionSelectionEnabled */,
+ false /* automaticNattKeepaliveTimerEnabled */);
}
private void checkBasicIkev2VpnProfile(@NonNull Ikev2VpnProfile profile) throws Exception {
@@ -687,6 +709,56 @@
true /* testSessionKey */, false /* testIkeTunConnParams */);
}
+ @Test
+ public void testBuildIkev2VpnProfileWithAutomaticNattKeepaliveTimerEnabled() throws Exception {
+ // Cannot use @IgnoreUpTo(Build.VERSION_CODES.TIRAMISU) because this test also requires API
+ // 34 shims, and @IgnoreUpTo does not check that.
+ assumeTrue(TestUtils.shouldTestUApis());
+
+ final Ikev2VpnProfile profileWithDefaultValue = buildIkev2VpnProfilePsk(TEST_SERVER_ADDR_V6,
+ false /* isRestrictedToTestNetworks */, false /* requiresValidation */);
+ final Ikev2VpnProfileShim<Ikev2VpnProfile> shimWithDefaultValue =
+ Ikev2VpnProfileShimImpl.newInstance(profileWithDefaultValue);
+ assertFalse(shimWithDefaultValue.isAutomaticNattKeepaliveTimerEnabled());
+
+ final Ikev2VpnProfileBuilderShim builder =
+ Ikev2VpnProfileBuilderShimImpl.newInstance(TEST_SERVER_ADDR_V6, TEST_IDENTITY)
+ .setAuthPsk(TEST_PSK);
+ final Ikev2VpnProfile profile = buildIkev2VpnProfileCommon(builder,
+ false /* isRestrictedToTestNetworks */,
+ false /* requiresValidation */,
+ false /* automaticIpVersionSelectionEnabled */,
+ true /* automaticNattKeepaliveTimerEnabled */);
+ final Ikev2VpnProfileShim<Ikev2VpnProfile> shim =
+ Ikev2VpnProfileShimImpl.newInstance(profile);
+ assertTrue(shim.isAutomaticNattKeepaliveTimerEnabled());
+ }
+
+ @Test
+ public void testBuildIkev2VpnProfileWithAutomaticIpVersionSelectionEnabled() throws Exception {
+ // Cannot use @IgnoreUpTo(Build.VERSION_CODES.TIRAMISU) because this test also requires API
+ // 34 shims, and @IgnoreUpTo does not check that.
+ assumeTrue(TestUtils.shouldTestUApis());
+
+ final Ikev2VpnProfile profileWithDefaultValue = buildIkev2VpnProfilePsk(TEST_SERVER_ADDR_V6,
+ false /* isRestrictedToTestNetworks */, false /* requiresValidation */);
+ final Ikev2VpnProfileShim<Ikev2VpnProfile> shimWithDefaultValue =
+ Ikev2VpnProfileShimImpl.newInstance(profileWithDefaultValue);
+ assertFalse(shimWithDefaultValue.isAutomaticIpVersionSelectionEnabled());
+
+ final Ikev2VpnProfileBuilderShim builder =
+ Ikev2VpnProfileBuilderShimImpl.newInstance(TEST_SERVER_ADDR_V6, TEST_IDENTITY)
+ .setAuthPsk(TEST_PSK);
+ final Ikev2VpnProfile profile = buildIkev2VpnProfileCommon(builder,
+ false /* isRestrictedToTestNetworks */,
+ false /* requiresValidation */,
+ true /* automaticIpVersionSelectionEnabled */,
+ false /* automaticNattKeepaliveTimerEnabled */);
+ final Ikev2VpnProfileShim<Ikev2VpnProfile> shim =
+ Ikev2VpnProfileShimImpl.newInstance(profile);
+ assertTrue(shim.isAutomaticIpVersionSelectionEnabled());
+ }
+
private static class CertificateAndKey {
public final X509Certificate cert;
public final PrivateKey key;
diff --git a/tests/cts/net/src/android/net/cts/IpSecManagerTest.java b/tests/cts/net/src/android/net/cts/IpSecManagerTest.java
index 9c30811..cc0a5df 100644
--- a/tests/cts/net/src/android/net/cts/IpSecManagerTest.java
+++ b/tests/cts/net/src/android/net/cts/IpSecManagerTest.java
@@ -364,10 +364,20 @@
});
}
- private void assumeExperimentalIpv6UdpEncapSupported() throws Exception {
+ private static boolean isIpv6UdpEncapSupportedByKernel() {
+ return isKernelVersionAtLeast("5.15.31")
+ || (isKernelVersionAtLeast("5.10.108") && !isKernelVersionAtLeast("5.15.0"));
+ }
+
+ // Packet private for use in IpSecManagerTunnelTest
+ static boolean isIpv6UdpEncapSupported() {
+ return SdkLevel.isAtLeastU() && isIpv6UdpEncapSupportedByKernel();
+ }
+
+ // Packet private for use in IpSecManagerTunnelTest
+ static void assumeExperimentalIpv6UdpEncapSupported() throws Exception {
assumeTrue("Not supported before U", SdkLevel.isAtLeastU());
- assumeTrue("Not supported by kernel", isKernelVersionAtLeast("5.15.31")
- || (isKernelVersionAtLeast("5.10.108") && !isKernelVersionAtLeast("5.15.0")));
+ assumeTrue("Not supported by kernel", isIpv6UdpEncapSupportedByKernel());
}
@Test
@@ -447,9 +457,8 @@
long newUidRxPackets = TrafficStats.getUidRxPackets(Os.getuid());
assertEquals(expectedTxByteDelta, newUidTxBytes - uidTxBytes);
- assertTrue(
- newUidRxBytes - uidRxBytes >= minRxByteDelta
- && newUidRxBytes - uidRxBytes <= maxRxByteDelta);
+ assertTrue("Not enough bytes", newUidRxBytes - uidRxBytes >= minRxByteDelta);
+ assertTrue("Too many bytes", newUidRxBytes - uidRxBytes <= maxRxByteDelta);
assertEquals(expectedTxPacketDelta, newUidTxPackets - uidTxPackets);
assertEquals(expectedRxPacketDelta, newUidRxPackets - uidRxPackets);
}
diff --git a/tests/cts/net/src/android/net/cts/IpSecManagerTunnelTest.java b/tests/cts/net/src/android/net/cts/IpSecManagerTunnelTest.java
index 5fc3068..1ede5c1 100644
--- a/tests/cts/net/src/android/net/cts/IpSecManagerTunnelTest.java
+++ b/tests/cts/net/src/android/net/cts/IpSecManagerTunnelTest.java
@@ -18,6 +18,8 @@
import static android.app.AppOpsManager.OP_MANAGE_IPSEC_TUNNELS;
import static android.net.IpSecManager.UdpEncapsulationSocket;
+import static android.net.cts.IpSecManagerTest.assumeExperimentalIpv6UdpEncapSupported;
+import static android.net.cts.IpSecManagerTest.isIpv6UdpEncapSupported;
import static android.net.cts.PacketUtils.AES_CBC_BLK_SIZE;
import static android.net.cts.PacketUtils.AES_CBC_IV_LEN;
import static android.net.cts.PacketUtils.BytePayload;
@@ -76,6 +78,7 @@
import java.net.InetAddress;
import java.net.NetworkInterface;
+// TODO: b/268552823 Improve the readability of IpSecManagerTunnelTest
@RunWith(AndroidJUnit4.class)
@AppModeFull(reason = "MANAGE_TEST_NETWORKS permission can't be granted to instant apps")
public class IpSecManagerTunnelTest extends IpSecBaseTest {
@@ -83,11 +86,6 @@
private static final String TAG = IpSecManagerTunnelTest.class.getSimpleName();
- // Redefine this flag here so that IPsec code shipped in a mainline module can build on old
- // platforms before FEATURE_IPSEC_TUNNEL_MIGRATION API is released.
- private static final String FEATURE_IPSEC_TUNNEL_MIGRATION =
- "android.software.ipsec_tunnel_migration";
-
private static final InetAddress LOCAL_OUTER_4 = InetAddress.parseNumericAddress("192.0.2.1");
private static final InetAddress REMOTE_OUTER_4 = InetAddress.parseNumericAddress("192.0.2.2");
private static final InetAddress LOCAL_OUTER_6 =
@@ -115,6 +113,7 @@
private static final int IP4_PREFIX_LEN = 32;
private static final int IP6_PREFIX_LEN = 128;
+ private static final int IP6_UDP_ENCAP_SOCKET_PORT_ANY = 65536;
private static final int TIMEOUT_MS = 500;
@@ -263,14 +262,23 @@
*
* @param ipsecNetwork The IPsec Interface based Network for binding sockets on
* @param tunnelIface The IPsec tunnel interface that will be tested
- * @param underlyingTunUtils The utility of the IPsec tunnel interface's underlying TUN
- * network
- * @return the integer port of the inner socket if outbound, or 0 if inbound
- * IpSecTunnelTestRunnable
+ * @param tunUtils The utility of the IPsec tunnel interface's underlying TUN network
+ * @param inTunnelTransform The inbound tunnel mode transform
+ * @param outTunnelTransform The outbound tunnel mode transform
+ * @param localOuter The local address of the outer IP packet
+ * @param remoteOuter The remote address of the outer IP packet
+ * @param seqNum The expected sequence number of the inbound packet
* @throws Exception if any part of the test failed.
*/
public abstract int run(
- Network ipsecNetwork, IpSecTunnelInterface tunnelIface, TunUtils underlyingTunUtils)
+ Network ipsecNetwork,
+ IpSecTunnelInterface tunnelIface,
+ TunUtils tunUtils,
+ IpSecTransform inTunnelTransform,
+ IpSecTransform outTunnelTransform,
+ InetAddress localOuter,
+ InetAddress remoteOuter,
+ int seqNum)
throws Exception;
}
@@ -305,19 +313,41 @@
return expectedPacketSize;
}
+ private UdpEncapsulationSocket openUdpEncapsulationSocket(int ipVersion) throws Exception {
+ if (ipVersion == AF_INET) {
+ return mISM.openUdpEncapsulationSocket();
+ }
+
+ if (!isIpv6UdpEncapSupported()) {
+ throw new UnsupportedOperationException("IPv6 UDP encapsulation unsupported");
+ }
+
+ return mISM.openUdpEncapsulationSocket(IP6_UDP_ENCAP_SOCKET_PORT_ANY);
+ }
+
private interface IpSecTunnelTestRunnableFactory {
+ /**
+ * Build a IpSecTunnelTestRunnable.
+ *
+ * @param transportInTunnelMode indicate if there needs to be a transport mode transform
+ * inside the tunnel mode transform
+ * @param spi The IPsec SPI
+ * @param localInner The local address of the inner IP packet
+ * @param remoteInner The remote address of the inner IP packet
+ * @param inTransportTransform The inbound transport mode transform
+ * @param outTransportTransform The outbound transport mode transform
+ * @param encapSocket The UDP encapsulation socket or null
+ * @param innerSocketPort The inner socket port
+ */
IpSecTunnelTestRunnable getIpSecTunnelTestRunnable(
boolean transportInTunnelMode,
int spi,
InetAddress localInner,
InetAddress remoteInner,
- InetAddress localOuter,
- InetAddress remoteOuter,
IpSecTransform inTransportTransform,
IpSecTransform outTransportTransform,
- int encapPort,
- int innerSocketPort,
- int expectedPacketSize)
+ UdpEncapsulationSocket encapSocket,
+ int innerSocketPort)
throws Exception;
}
@@ -327,17 +357,21 @@
int spi,
InetAddress localInner,
InetAddress remoteInner,
- InetAddress localOuter,
- InetAddress remoteOuter,
IpSecTransform inTransportTransform,
IpSecTransform outTransportTransform,
- int encapPort,
- int unusedInnerSocketPort,
- int expectedPacketSize) {
+ UdpEncapsulationSocket encapSocket,
+ int unusedInnerSocketPort) {
return new IpSecTunnelTestRunnable() {
@Override
public int run(
- Network ipsecNetwork, IpSecTunnelInterface tunnelIface, TunUtils tunUtils)
+ Network ipsecNetwork,
+ IpSecTunnelInterface tunnelIface,
+ TunUtils tunUtils,
+ IpSecTransform inTunnelTransform,
+ IpSecTransform outTunnelTransform,
+ InetAddress localOuter,
+ InetAddress remoteOuter,
+ int seqNum)
throws Exception {
// Build a socket and send traffic
JavaUdpSocket socket = new JavaUdpSocket(localInner);
@@ -357,9 +391,14 @@
// Verify that an encrypted packet is sent. As of right now, checking encrypted
// body is not possible, due to the test not knowing some of the fields of the
// inner IP header (flow label, flags, etc)
+ int innerFamily = localInner instanceof Inet4Address ? AF_INET : AF_INET6;
+ int outerFamily = localOuter instanceof Inet4Address ? AF_INET : AF_INET6;
+ boolean useEncap = encapSocket != null;
+ int expectedPacketSize =
+ getPacketSize(
+ innerFamily, outerFamily, useEncap, transportInTunnelMode);
tunUtils.awaitEspPacketNoPlaintext(
- spi, TEST_DATA, encapPort != 0, expectedPacketSize);
-
+ spi, TEST_DATA, useEncap, expectedPacketSize);
socket.close();
return innerSocketPort;
@@ -375,18 +414,22 @@
int spi,
InetAddress localInner,
InetAddress remoteInner,
- InetAddress localOuter,
- InetAddress remoteOuter,
IpSecTransform inTransportTransform,
IpSecTransform outTransportTransform,
- int encapPort,
- int innerSocketPort,
- int expectedPacketSize)
+ UdpEncapsulationSocket encapSocket,
+ int innerSocketPort)
throws Exception {
return new IpSecTunnelTestRunnable() {
@Override
public int run(
- Network ipsecNetwork, IpSecTunnelInterface tunnelIface, TunUtils tunUtils)
+ Network ipsecNetwork,
+ IpSecTunnelInterface tunnelIface,
+ TunUtils tunUtils,
+ IpSecTransform inTunnelTransform,
+ IpSecTransform outTunnelTransform,
+ InetAddress localOuter,
+ InetAddress remoteOuter,
+ int seqNum)
throws Exception {
// Build a socket and receive traffic
JavaUdpSocket socket = new JavaUdpSocket(localInner, innerSocketPort);
@@ -420,18 +463,22 @@
int spi,
InetAddress localInner,
InetAddress remoteInner,
- InetAddress localOuter,
- InetAddress remoteOuter,
IpSecTransform inTransportTransform,
IpSecTransform outTransportTransform,
- int encapPort,
- int innerSocketPort,
- int expectedPacketSize)
+ UdpEncapsulationSocket encapSocket,
+ int innerSocketPort)
throws Exception {
return new IpSecTunnelTestRunnable() {
@Override
public int run(
- Network ipsecNetwork, IpSecTunnelInterface tunnelIface, TunUtils tunUtils)
+ Network ipsecNetwork,
+ IpSecTunnelInterface tunnelIface,
+ TunUtils tunUtils,
+ IpSecTransform inTunnelTransform,
+ IpSecTransform outTunnelTransform,
+ InetAddress localOuter,
+ InetAddress remoteOuter,
+ int seqNum)
throws Exception {
// Build a socket and receive traffic
JavaUdpSocket socket = new JavaUdpSocket(localInner);
@@ -456,7 +503,8 @@
remoteOuter,
localOuter,
socket.getPort(),
- encapPort);
+ encapSocket != null ? encapSocket.getPort() : 0,
+ seqNum);
} else {
pkt =
getTunnelModePacket(
@@ -466,7 +514,8 @@
remoteOuter,
localOuter,
socket.getPort(),
- encapPort);
+ encapSocket != null ? encapSocket.getPort() : 0,
+ seqNum);
}
tunUtils.injectPacket(pkt);
@@ -483,13 +532,16 @@
private class MigrateIpSecTunnelTestRunnableFactory implements IpSecTunnelTestRunnableFactory {
private final IpSecTunnelTestRunnableFactory mTestRunnableFactory;
+ private final boolean mTestEncapTypeChange;
- MigrateIpSecTunnelTestRunnableFactory(boolean isOutputTest) {
+ MigrateIpSecTunnelTestRunnableFactory(boolean isOutputTest, boolean testEncapTypeChange) {
if (isOutputTest) {
mTestRunnableFactory = new OutputIpSecTunnelTestRunnableFactory();
} else {
mTestRunnableFactory = new InputPacketGeneratorIpSecTunnelTestRunnableFactory();
}
+
+ mTestEncapTypeChange = testEncapTypeChange;
}
@Override
@@ -498,17 +550,21 @@
int spi,
InetAddress localInner,
InetAddress remoteInner,
- InetAddress localOuter,
- InetAddress remoteOuter,
IpSecTransform inTransportTransform,
IpSecTransform outTransportTransform,
- int encapPort,
- int unusedInnerSocketPort,
- int expectedPacketSize) {
+ UdpEncapsulationSocket encapSocket,
+ int unusedInnerSocketPort) {
return new IpSecTunnelTestRunnable() {
@Override
public int run(
- Network ipsecNetwork, IpSecTunnelInterface tunnelIface, TunUtils tunUtils)
+ Network ipsecNetwork,
+ IpSecTunnelInterface tunnelIface,
+ TunUtils tunUtils,
+ IpSecTransform inTunnelTransform,
+ IpSecTransform outTunnelTransform,
+ InetAddress localOuter,
+ InetAddress remoteOuter,
+ int seqNum)
throws Exception {
mTestRunnableFactory
.getIpSecTunnelTestRunnable(
@@ -516,17 +572,25 @@
spi,
localInner,
remoteInner,
- localOuter,
- remoteOuter,
inTransportTransform,
outTransportTransform,
- encapPort,
- unusedInnerSocketPort,
- expectedPacketSize)
- .run(ipsecNetwork, tunnelIface, sTunWrapper.utils);
-
+ encapSocket,
+ unusedInnerSocketPort)
+ .run(
+ ipsecNetwork,
+ tunnelIface,
+ tunUtils,
+ inTunnelTransform,
+ outTunnelTransform,
+ localOuter,
+ remoteOuter,
+ seqNum);
tunnelIface.setUnderlyingNetwork(sTunWrapperNew.network);
+ final boolean useEncapBeforeMigrate = encapSocket != null;
+ final boolean useEncapAfterMigrate =
+ mTestEncapTypeChange ? !useEncapBeforeMigrate : useEncapBeforeMigrate;
+
// Verify migrating to IPv4 and IPv6 addresses. It ensures that not only
// can IPsec tunnel migrate across interfaces, IPsec tunnel can also migrate to
// a different address on the same interface.
@@ -535,21 +599,24 @@
remoteInner,
LOCAL_OUTER_4_NEW,
REMOTE_OUTER_4_NEW,
- encapPort != 0,
+ useEncapAfterMigrate,
transportInTunnelMode,
sTunWrapperNew.utils,
tunnelIface,
ipsecNetwork);
- checkMigratedTunnel(
- localInner,
- remoteInner,
- LOCAL_OUTER_6_NEW,
- REMOTE_OUTER_6_NEW,
- false, // IPv6 does not support UDP encapsulation
- transportInTunnelMode,
- sTunWrapperNew.utils,
- tunnelIface,
- ipsecNetwork);
+
+ if (!useEncapAfterMigrate || isIpv6UdpEncapSupported()) {
+ checkMigratedTunnel(
+ localInner,
+ remoteInner,
+ LOCAL_OUTER_6_NEW,
+ REMOTE_OUTER_6_NEW,
+ useEncapAfterMigrate,
+ transportInTunnelMode,
+ sTunWrapperNew.utils,
+ tunnelIface,
+ ipsecNetwork);
+ }
return 0;
}
@@ -589,7 +656,8 @@
buildIpSecTransform(sContext, inTransportSpi, null, remoteInner);
IpSecTransform outTransportTransform =
buildIpSecTransform(sContext, outTransportSpi, null, localInner);
- UdpEncapsulationSocket encapSocket = mISM.openUdpEncapsulationSocket()) {
+ UdpEncapsulationSocket encapSocket =
+ useEncap ? openUdpEncapsulationSocket(outerFamily) : null) {
// Configure tunnel mode Transform parameters
IpSecTransform.Builder transformBuilder = new IpSecTransform.Builder(sContext);
@@ -599,7 +667,7 @@
new IpSecAlgorithm(
IpSecAlgorithm.AUTH_HMAC_SHA256, AUTH_KEY, AUTH_KEY.length * 4));
- if (useEncap) {
+ if (encapSocket != null) {
transformBuilder.setIpv4Encapsulation(encapSocket, encapSocket.getPort());
}
@@ -623,19 +691,152 @@
spi,
localInner,
remoteInner,
- localOuter,
- remoteOuter,
inTransportTransform,
outTransportTransform,
- useEncap ? encapSocket.getPort() : 0,
- 0,
- expectedPacketSize)
- .run(ipsecNetwork, tunnelIface, tunUtils);
+ encapSocket,
+ 0)
+ .run(
+ ipsecNetwork,
+ tunnelIface,
+ tunUtils,
+ inTransform,
+ outTransform,
+ localOuter,
+ remoteOuter,
+ 1 /* seqNum */);
}
}
}
}
+ private class MigrateTunnelModeIpSecTransformTestRunnableFactory
+ implements IpSecTunnelTestRunnableFactory {
+ private final IpSecTunnelTestRunnableFactory mTestRunnableFactory;
+
+ MigrateTunnelModeIpSecTransformTestRunnableFactory(boolean isOutputTest) {
+ if (isOutputTest) {
+ mTestRunnableFactory = new OutputIpSecTunnelTestRunnableFactory();
+ } else {
+ mTestRunnableFactory = new InputPacketGeneratorIpSecTunnelTestRunnableFactory();
+ }
+ }
+
+ @Override
+ public IpSecTunnelTestRunnable getIpSecTunnelTestRunnable(
+ boolean transportInTunnelMode,
+ int spi,
+ InetAddress localInner,
+ InetAddress remoteInner,
+ IpSecTransform inTransportTransform,
+ IpSecTransform outTransportTransform,
+ UdpEncapsulationSocket encapSocket,
+ int unusedInnerSocketPort) {
+ return new IpSecTunnelTestRunnable() {
+ @Override
+ public int run(
+ Network ipsecNetwork,
+ IpSecTunnelInterface tunnelIface,
+ TunUtils tunUtils,
+ IpSecTransform inTunnelTransform,
+ IpSecTransform outTunnelTransform,
+ InetAddress localOuter,
+ InetAddress remoteOuter,
+ int seqNum)
+ throws Exception {
+ final IpSecTunnelTestRunnable testRunnable =
+ mTestRunnableFactory.getIpSecTunnelTestRunnable(
+ transportInTunnelMode,
+ spi,
+ localInner,
+ remoteInner,
+ inTransportTransform,
+ outTransportTransform,
+ encapSocket,
+ unusedInnerSocketPort);
+ testRunnable.run(
+ ipsecNetwork,
+ tunnelIface,
+ tunUtils,
+ inTunnelTransform,
+ outTunnelTransform,
+ localOuter,
+ remoteOuter,
+ seqNum++);
+
+ tunnelIface.setUnderlyingNetwork(sTunWrapperNew.network);
+
+ final boolean useEncap = encapSocket != null;
+ if (useEncap) {
+ sTunWrapperNew.network.bindSocket(encapSocket.getFileDescriptor());
+ }
+
+ // Updating UDP encapsulation socket is not supported. Thus this runnable will
+ // only cover 1) migration from non-encap to non-encap and 2) migration from
+ // encap to encap with the same family
+ if (!useEncap || localOuter instanceof Inet4Address) {
+ checkMigrateTunnelModeTransform(
+ testRunnable,
+ inTunnelTransform,
+ outTunnelTransform,
+ tunnelIface,
+ ipsecNetwork,
+ sTunWrapperNew.utils,
+ LOCAL_OUTER_4_NEW,
+ REMOTE_OUTER_4_NEW,
+ seqNum++);
+ }
+ if (!useEncap || localOuter instanceof Inet6Address) {
+ checkMigrateTunnelModeTransform(
+ testRunnable,
+ inTunnelTransform,
+ outTunnelTransform,
+ tunnelIface,
+ ipsecNetwork,
+ sTunWrapperNew.utils,
+ LOCAL_OUTER_6_NEW,
+ REMOTE_OUTER_6_NEW,
+ seqNum++);
+ }
+
+ // Unused return value for MigrateTunnelModeIpSecTransformTest
+ return 0;
+ }
+ };
+ }
+
+ private void checkMigrateTunnelModeTransform(
+ IpSecTunnelTestRunnable testRunnable,
+ IpSecTransform inTunnelTransform,
+ IpSecTransform outTunnelTransform,
+ IpSecTunnelInterface tunnelIface,
+ Network ipsecNetwork,
+ TunUtils tunUtils,
+ InetAddress newLocalOuter,
+ InetAddress newRemoteOuter,
+ int seqNum)
+ throws Exception {
+ mISM.startTunnelModeTransformMigration(
+ inTunnelTransform, newRemoteOuter, newLocalOuter);
+ mISM.startTunnelModeTransformMigration(
+ outTunnelTransform, newLocalOuter, newRemoteOuter);
+
+ mISM.applyTunnelModeTransform(
+ tunnelIface, IpSecManager.DIRECTION_IN, inTunnelTransform);
+ mISM.applyTunnelModeTransform(
+ tunnelIface, IpSecManager.DIRECTION_OUT, outTunnelTransform);
+
+ testRunnable.run(
+ ipsecNetwork,
+ tunnelIface,
+ tunUtils,
+ inTunnelTransform,
+ outTunnelTransform,
+ newLocalOuter,
+ newRemoteOuter,
+ seqNum);
+ }
+ }
+
private void checkTunnelOutput(
int innerFamily, int outerFamily, boolean useEncap, boolean transportInTunnelMode)
throws Exception {
@@ -659,17 +860,36 @@
}
private void checkMigrateTunnelOutput(
- int innerFamily, int outerFamily, boolean useEncap, boolean transportInTunnelMode)
+ int innerFamily,
+ int outerFamily,
+ boolean useEncap,
+ boolean transportInTunnelMode,
+ boolean isEncapTypeChanged)
throws Exception {
checkTunnel(
innerFamily,
outerFamily,
useEncap,
transportInTunnelMode,
- new MigrateIpSecTunnelTestRunnableFactory(true));
+ new MigrateIpSecTunnelTestRunnableFactory(true, isEncapTypeChanged));
}
private void checkMigrateTunnelInput(
+ int innerFamily,
+ int outerFamily,
+ boolean useEncap,
+ boolean transportInTunnelMode,
+ boolean isEncapTypeChanged)
+ throws Exception {
+ checkTunnel(
+ innerFamily,
+ outerFamily,
+ useEncap,
+ transportInTunnelMode,
+ new MigrateIpSecTunnelTestRunnableFactory(false, isEncapTypeChanged));
+ }
+
+ private void checkMigrateTunnelModeTransformOutput(
int innerFamily, int outerFamily, boolean useEncap, boolean transportInTunnelMode)
throws Exception {
checkTunnel(
@@ -677,7 +897,18 @@
outerFamily,
useEncap,
transportInTunnelMode,
- new MigrateIpSecTunnelTestRunnableFactory(false));
+ new MigrateTunnelModeIpSecTransformTestRunnableFactory(true /* isOutputTest */));
+ }
+
+ private void checkMigrateTunnelModeTransformInput(
+ int innerFamily, int outerFamily, boolean useEncap, boolean transportInTunnelMode)
+ throws Exception {
+ checkTunnel(
+ innerFamily,
+ outerFamily,
+ useEncap,
+ transportInTunnelMode,
+ new MigrateTunnelModeIpSecTransformTestRunnableFactory(false /* isOutputTest */));
}
/**
@@ -709,7 +940,8 @@
buildIpSecTransform(sContext, inTransportSpi, null, remoteInner);
IpSecTransform outTransportTransform =
buildIpSecTransform(sContext, outTransportSpi, null, localInner);
- UdpEncapsulationSocket encapSocket = mISM.openUdpEncapsulationSocket()) {
+ UdpEncapsulationSocket encapSocket =
+ useEncap ? openUdpEncapsulationSocket(outerFamily) : null) {
// Run output direction tests
IpSecTunnelTestRunnable outputIpSecTunnelTestRunnable =
@@ -719,22 +951,19 @@
spi,
localInner,
remoteInner,
- localOuter,
- remoteOuter,
inTransportTransform,
outTransportTransform,
- useEncap ? encapSocket.getPort() : 0,
- 0,
- expectedPacketSize);
+ encapSocket,
+ 0);
int innerSocketPort =
buildTunnelNetworkAndRunTests(
- localInner,
- remoteInner,
- localOuter,
- remoteOuter,
- spi,
- useEncap ? encapSocket : null,
- outputIpSecTunnelTestRunnable);
+ localInner,
+ remoteInner,
+ localOuter,
+ remoteOuter,
+ spi,
+ encapSocket,
+ outputIpSecTunnelTestRunnable);
// Input direction tests, with matching inner socket ports.
IpSecTunnelTestRunnable inputIpSecTunnelTestRunnable =
@@ -744,20 +973,17 @@
spi,
remoteInner,
localInner,
- localOuter,
- remoteOuter,
inTransportTransform,
outTransportTransform,
- useEncap ? encapSocket.getPort() : 0,
- innerSocketPort,
- expectedPacketSize);
+ encapSocket,
+ innerSocketPort);
buildTunnelNetworkAndRunTests(
remoteInner,
localInner,
localOuter,
remoteOuter,
spi,
- useEncap ? encapSocket : null,
+ encapSocket,
inputIpSecTunnelTestRunnable);
}
}
@@ -791,7 +1017,8 @@
buildIpSecTransform(sContext, inTransportSpi, null, remoteInner);
IpSecTransform outTransportTransform =
buildIpSecTransform(sContext, outTransportSpi, null, localInner);
- UdpEncapsulationSocket encapSocket = mISM.openUdpEncapsulationSocket()) {
+ UdpEncapsulationSocket encapSocket =
+ useEncap ? openUdpEncapsulationSocket(outerFamily) : null) {
buildTunnelNetworkAndRunTests(
localInner,
@@ -799,19 +1026,16 @@
localOuter,
remoteOuter,
spi,
- useEncap ? encapSocket : null,
+ encapSocket,
factory.getIpSecTunnelTestRunnable(
transportInTunnelMode,
spi,
localInner,
remoteInner,
- localOuter,
- remoteOuter,
inTransportTransform,
outTransportTransform,
- useEncap ? encapSocket.getPort() : 0,
- 0,
- expectedPacketSize));
+ encapSocket,
+ 0));
}
}
@@ -859,6 +1083,7 @@
if (encapSocket != null) {
transformBuilder.setIpv4Encapsulation(encapSocket, encapSocket.getPort());
+ sTunWrapper.network.bindSocket(encapSocket.getFileDescriptor());
}
// Apply transform and check that traffic is properly encrypted
@@ -870,7 +1095,16 @@
mISM.applyTunnelModeTransform(
tunnelIface, IpSecManager.DIRECTION_OUT, outTransform);
- innerSocketPort = test.run(testNetwork, tunnelIface, sTunWrapper.utils);
+ innerSocketPort =
+ test.run(
+ testNetwork,
+ tunnelIface,
+ sTunWrapper.utils,
+ inTransform,
+ outTransform,
+ localOuter,
+ remoteOuter,
+ 1 /* seqNum */);
}
// Teardown the test network
@@ -909,13 +1143,14 @@
}
private EspHeader buildTransportModeEspPacket(
- int spi, InetAddress src, InetAddress dst, int port, Payload payload) throws Exception {
+ int spi, int seqNum, InetAddress src, InetAddress dst, Payload payload)
+ throws Exception {
IpHeader preEspIpHeader = getIpHeader(payload.getProtocolId(), src, dst, payload);
return new EspHeader(
payload.getProtocolId(),
spi,
- 1, // sequence number
+ seqNum,
CRYPT_KEY, // Same key for auth and crypt
payload.getPacketBytes(preEspIpHeader));
}
@@ -928,13 +1163,14 @@
InetAddress dstOuter,
int port,
int encapPort,
+ int seqNum,
Payload payload)
throws Exception {
IpHeader innerIp = getIpHeader(payload.getProtocolId(), srcInner, dstInner, payload);
return new EspHeader(
innerIp.getProtocolId(),
spi,
- 1, // sequence number
+ seqNum, // sequence number
CRYPT_KEY, // Same key for auth and crypt
innerIp.getPacketBytes());
}
@@ -958,13 +1194,14 @@
InetAddress srcOuter,
InetAddress dstOuter,
int port,
- int encapPort)
+ int encapPort,
+ int seqNum)
throws Exception {
UdpHeader udp = new UdpHeader(port, port, new BytePayload(TEST_DATA));
EspHeader espPayload =
buildTunnelModeEspPacket(
- spi, srcInner, dstInner, srcOuter, dstOuter, port, encapPort, udp);
+ spi, srcInner, dstInner, srcOuter, dstOuter, port, encapPort, seqNum, udp);
return maybeEncapPacket(srcOuter, dstOuter, encapPort, espPayload).getPacketBytes();
}
@@ -976,11 +1213,13 @@
InetAddress srcOuter,
InetAddress dstOuter,
int port,
- int encapPort)
+ int encapPort,
+ int seqNum)
throws Exception {
UdpHeader udp = new UdpHeader(port, port, new BytePayload(TEST_DATA));
- EspHeader espPayload = buildTransportModeEspPacket(spiInner, srcInner, dstInner, port, udp);
+ EspHeader espPayload =
+ buildTransportModeEspPacket(spiInner, seqNum, srcInner, dstInner, udp);
espPayload =
buildTunnelModeEspPacket(
spiOuter,
@@ -990,21 +1229,56 @@
dstOuter,
port,
encapPort,
+ seqNum,
espPayload);
return maybeEncapPacket(srcOuter, dstOuter, encapPort, espPayload).getPacketBytes();
}
private void doTestMigrateTunnel(
+ int innerFamily,
+ int outerFamily,
+ boolean useEncap,
+ boolean transportInTunnelMode,
+ boolean testEncapTypeChange)
+ throws Exception {
+ assumeTrue(mCtsNetUtils.hasIpsecTunnelsFeature());
+ checkMigrateTunnelOutput(
+ innerFamily, outerFamily, useEncap, transportInTunnelMode, testEncapTypeChange);
+ checkMigrateTunnelInput(
+ innerFamily, outerFamily, useEncap, transportInTunnelMode, testEncapTypeChange);
+ }
+
+ private void doTestMigrateTunnel(
+ int innerFamily, int outerFamily, boolean useEncap, boolean transportInTunnelMode)
+ throws Exception {
+ doTestMigrateTunnel(
+ innerFamily,
+ outerFamily,
+ useEncap,
+ transportInTunnelMode,
+ false /* testEncapTypeChange */);
+ }
+
+ private void doTestMigrateTunnelWithEncapTypeChange(
+ int innerFamily, int outerFamily, boolean useEncap, boolean transportInTunnelMode)
+ throws Exception {
+ doTestMigrateTunnel(
+ innerFamily,
+ outerFamily,
+ useEncap,
+ transportInTunnelMode,
+ true /* testEncapTypeChange */);
+ }
+
+ private void doTestMigrateTunnelModeTransform(
int innerFamily, int outerFamily, boolean useEncap, boolean transportInTunnelMode)
throws Exception {
assumeTrue(mCtsNetUtils.hasIpsecTunnelsFeature());
- checkTunnelOutput(innerFamily, outerFamily, useEncap, transportInTunnelMode);
- checkTunnelInput(innerFamily, outerFamily, useEncap, transportInTunnelMode);
- }
-
- /** Checks if FEATURE_IPSEC_TUNNEL_MIGRATION is enabled on the device */
- private static boolean hasIpsecTunnelMigrateFeature() {
- return sContext.getPackageManager().hasSystemFeature(FEATURE_IPSEC_TUNNEL_MIGRATION);
+ assumeTrue(mCtsNetUtils.hasIpsecTunnelMigrateFeature());
+ checkMigrateTunnelModeTransformOutput(
+ innerFamily, outerFamily, useEncap, transportInTunnelMode);
+ checkMigrateTunnelModeTransformInput(
+ innerFamily, outerFamily, useEncap, transportInTunnelMode);
}
@IgnoreUpTo(Build.VERSION_CODES.TIRAMISU)
@@ -1012,28 +1286,7 @@
public void testHasIpSecTunnelMigrateFeature() throws Exception {
// FEATURE_IPSEC_TUNNEL_MIGRATION is required when VSR API is U/U+
if (getVsrApiLevel() > Build.VERSION_CODES.TIRAMISU) {
- assertTrue(hasIpsecTunnelMigrateFeature());
- }
- }
-
- @IgnoreUpTo(Build.VERSION_CODES.TIRAMISU)
- @Test
- public void testMigrateTunnelModeTransform() throws Exception {
- assumeTrue(mCtsNetUtils.hasIpsecTunnelsFeature());
- assumeTrue(hasIpsecTunnelMigrateFeature());
-
- IpSecTransform.Builder transformBuilder = new IpSecTransform.Builder(sContext);
- transformBuilder.setEncryption(new IpSecAlgorithm(IpSecAlgorithm.CRYPT_AES_CBC, CRYPT_KEY));
- transformBuilder.setAuthentication(
- new IpSecAlgorithm(IpSecAlgorithm.AUTH_HMAC_SHA256, AUTH_KEY, AUTH_KEY.length * 4));
- int spi = getRandomSpi(LOCAL_OUTER_4, REMOTE_OUTER_4);
-
- try (IpSecManager.SecurityParameterIndex outSpi =
- mISM.allocateSecurityParameterIndex(REMOTE_OUTER_4, spi);
- IpSecTransform outTunnelTransform =
- transformBuilder.buildTunnelModeTransform(LOCAL_INNER_4, outSpi)) {
- mISM.startTunnelModeTransformMigration(
- outTunnelTransform, LOCAL_OUTER_4_NEW, REMOTE_OUTER_4_NEW);
+ assertTrue(mCtsNetUtils.hasIpsecTunnelMigrateFeature());
}
}
@@ -1051,6 +1304,12 @@
doTestMigrateTunnel(AF_INET, AF_INET, false, true);
}
+ @IgnoreUpTo(Build.VERSION_CODES.R)
+ @Test
+ public void testMigrateTransportInTunnelModeV4InV4_EncapTypeChange() throws Exception {
+ doTestMigrateTunnelWithEncapTypeChange(AF_INET, AF_INET, false, true);
+ }
+
@Test
public void testTransportInTunnelModeV4InV4Reflected() throws Exception {
assumeTrue(mCtsNetUtils.hasIpsecTunnelsFeature());
@@ -1070,6 +1329,12 @@
doTestMigrateTunnel(AF_INET, AF_INET, true, true);
}
+ @IgnoreUpTo(Build.VERSION_CODES.R)
+ @Test
+ public void testMigrateTransportInTunnelModeV4InV4UdpEncap_EncapTypeChange() throws Exception {
+ doTestMigrateTunnelWithEncapTypeChange(AF_INET, AF_INET, true, true);
+ }
+
@Test
public void testTransportInTunnelModeV4InV4UdpEncapReflected() throws Exception {
assumeTrue(mCtsNetUtils.hasIpsecTunnelsFeature());
@@ -1089,6 +1354,12 @@
doTestMigrateTunnel(AF_INET, AF_INET6, false, true);
}
+ @IgnoreUpTo(Build.VERSION_CODES.R)
+ @Test
+ public void testMigrateTransportInTunnelModeV4InV6_EncapTypeChange() throws Exception {
+ doTestMigrateTunnelWithEncapTypeChange(AF_INET, AF_INET6, false, true);
+ }
+
@Test
public void testTransportInTunnelModeV4InV6Reflected() throws Exception {
assumeTrue(mCtsNetUtils.hasIpsecTunnelsFeature());
@@ -1108,6 +1379,12 @@
doTestMigrateTunnel(AF_INET6, AF_INET, false, true);
}
+ @IgnoreUpTo(Build.VERSION_CODES.R)
+ @Test
+ public void testMigrateTransportInTunnelModeV6InV4_EncapTypeChange() throws Exception {
+ doTestMigrateTunnelWithEncapTypeChange(AF_INET6, AF_INET, false, true);
+ }
+
@Test
public void testTransportInTunnelModeV6InV4Reflected() throws Exception {
assumeTrue(mCtsNetUtils.hasIpsecTunnelsFeature());
@@ -1127,6 +1404,12 @@
doTestMigrateTunnel(AF_INET6, AF_INET, true, true);
}
+ @IgnoreUpTo(Build.VERSION_CODES.R)
+ @Test
+ public void testMigrateTransportInTunnelModeV6InV4UdpEncap_EncapTypeChange() throws Exception {
+ doTestMigrateTunnelWithEncapTypeChange(AF_INET6, AF_INET, true, true);
+ }
+
@Test
public void testTransportInTunnelModeV6InV4UdpEncapReflected() throws Exception {
assumeTrue(mCtsNetUtils.hasIpsecTunnelsFeature());
@@ -1146,6 +1429,12 @@
doTestMigrateTunnel(AF_INET, AF_INET6, false, true);
}
+ @IgnoreUpTo(Build.VERSION_CODES.R)
+ @Test
+ public void testMigrateTransportInTunnelModeV6InV6_EncapTypeChange() throws Exception {
+ doTestMigrateTunnelWithEncapTypeChange(AF_INET, AF_INET6, false, true);
+ }
+
@Test
public void testTransportInTunnelModeV6InV6Reflected() throws Exception {
assumeTrue(mCtsNetUtils.hasIpsecTunnelsFeature());
@@ -1166,6 +1455,12 @@
doTestMigrateTunnel(AF_INET, AF_INET, false, false);
}
+ @IgnoreUpTo(Build.VERSION_CODES.R)
+ @Test
+ public void testMigrateTunnelV4InV4_EncapTypeChange() throws Exception {
+ doTestMigrateTunnelWithEncapTypeChange(AF_INET, AF_INET, false, false);
+ }
+
@Test
public void testTunnelV4InV4Reflected() throws Exception {
assumeTrue(mCtsNetUtils.hasIpsecTunnelsFeature());
@@ -1185,6 +1480,12 @@
doTestMigrateTunnel(AF_INET, AF_INET, true, false);
}
+ @IgnoreUpTo(Build.VERSION_CODES.R)
+ @Test
+ public void testMigrateTunnelV4InV4UdpEncap_EncapTypeChange() throws Exception {
+ doTestMigrateTunnelWithEncapTypeChange(AF_INET, AF_INET, true, false);
+ }
+
@Test
public void testTunnelV4InV4UdpEncapReflected() throws Exception {
assumeTrue(mCtsNetUtils.hasIpsecTunnelsFeature());
@@ -1204,6 +1505,12 @@
doTestMigrateTunnel(AF_INET, AF_INET6, false, false);
}
+ @IgnoreUpTo(Build.VERSION_CODES.R)
+ @Test
+ public void testMigrateTunnelV4InV6_EncapTypeChange() throws Exception {
+ doTestMigrateTunnelWithEncapTypeChange(AF_INET, AF_INET6, false, false);
+ }
+
@Test
public void testTunnelV4InV6Reflected() throws Exception {
assumeTrue(mCtsNetUtils.hasIpsecTunnelsFeature());
@@ -1223,6 +1530,12 @@
doTestMigrateTunnel(AF_INET6, AF_INET, false, false);
}
+ @IgnoreUpTo(Build.VERSION_CODES.R)
+ @Test
+ public void testMigrateTunnelV6InV4_EncapTypeChange() throws Exception {
+ doTestMigrateTunnelWithEncapTypeChange(AF_INET6, AF_INET, false, false);
+ }
+
@Test
public void testTunnelV6InV4Reflected() throws Exception {
assumeTrue(mCtsNetUtils.hasIpsecTunnelsFeature());
@@ -1242,6 +1555,12 @@
doTestMigrateTunnel(AF_INET6, AF_INET, true, false);
}
+ @IgnoreUpTo(Build.VERSION_CODES.R)
+ @Test
+ public void testMigrateTunnelV6InV4UdpEncap_EncapTypeChange() throws Exception {
+ doTestMigrateTunnelWithEncapTypeChange(AF_INET6, AF_INET, true, false);
+ }
+
@Test
public void testTunnelV6InV4UdpEncapReflected() throws Exception {
assumeTrue(mCtsNetUtils.hasIpsecTunnelsFeature());
@@ -1261,9 +1580,115 @@
doTestMigrateTunnel(AF_INET6, AF_INET6, false, false);
}
+ @IgnoreUpTo(Build.VERSION_CODES.R)
+ @Test
+ public void testMigrateTunnelV6InV6_EncapTypeChange() throws Exception {
+ doTestMigrateTunnelWithEncapTypeChange(AF_INET6, AF_INET6, false, false);
+ }
+
@Test
public void testTunnelV6InV6Reflected() throws Exception {
assumeTrue(mCtsNetUtils.hasIpsecTunnelsFeature());
checkTunnelReflected(AF_INET6, AF_INET6, false, false);
}
+
+ @IgnoreUpTo(Build.VERSION_CODES.TIRAMISU)
+ @Test
+ public void testMigrateTransformTransportInTunnelModeV4InV4() throws Exception {
+ doTestMigrateTunnelModeTransform(AF_INET, AF_INET, false, true);
+ }
+
+ @IgnoreUpTo(Build.VERSION_CODES.TIRAMISU)
+ @Test
+ public void testMigrateTransformTransportInTunnelModeV6InV4() throws Exception {
+ doTestMigrateTunnelModeTransform(AF_INET6, AF_INET, false, true);
+ }
+
+ @IgnoreUpTo(Build.VERSION_CODES.TIRAMISU)
+ @Test
+ public void testMigrateTransformTransportInTunnelModeV4InV6() throws Exception {
+ doTestMigrateTunnelModeTransform(AF_INET, AF_INET6, false, true);
+ }
+
+ @IgnoreUpTo(Build.VERSION_CODES.TIRAMISU)
+ @Test
+ public void testMigrateTransformTransportInTunnelModeV6InV6() throws Exception {
+ doTestMigrateTunnelModeTransform(AF_INET, AF_INET6, false, true);
+ }
+
+ @IgnoreUpTo(Build.VERSION_CODES.TIRAMISU)
+ @Test
+ public void testMigrateTransformTransportInTunnelModeV4InV4UdpEncap() throws Exception {
+ doTestMigrateTunnelModeTransform(AF_INET, AF_INET, true, true);
+ }
+
+ @IgnoreUpTo(Build.VERSION_CODES.TIRAMISU)
+ @Test
+ public void testMigrateTransformTransportInTunnelModeV6InV4UdpEncap() throws Exception {
+ doTestMigrateTunnelModeTransform(AF_INET6, AF_INET, true, true);
+ }
+
+ @IgnoreUpTo(Build.VERSION_CODES.TIRAMISU)
+ @Test
+ public void testMigrateTransformTransportInTunnelModeV4InV6UdpEncap() throws Exception {
+ assumeExperimentalIpv6UdpEncapSupported();
+ doTestMigrateTunnelModeTransform(AF_INET, AF_INET6, true, true);
+ }
+
+ @IgnoreUpTo(Build.VERSION_CODES.TIRAMISU)
+ @Test
+ public void testMigrateTransformTransportInTunnelModeV6InV6UdpEncap() throws Exception {
+ assumeExperimentalIpv6UdpEncapSupported();
+ doTestMigrateTunnelModeTransform(AF_INET6, AF_INET6, true, true);
+ }
+
+ @IgnoreUpTo(Build.VERSION_CODES.TIRAMISU)
+ @Test
+ public void testMigrateTransformTunnelV4InV4() throws Exception {
+ doTestMigrateTunnelModeTransform(AF_INET, AF_INET, false, false);
+ }
+
+ @IgnoreUpTo(Build.VERSION_CODES.TIRAMISU)
+ @Test
+ public void testMigrateTransformTunnelV6InV4() throws Exception {
+ doTestMigrateTunnelModeTransform(AF_INET6, AF_INET, false, false);
+ }
+
+ @IgnoreUpTo(Build.VERSION_CODES.TIRAMISU)
+ @Test
+ public void testMigrateTransformTunnelV4InV6() throws Exception {
+ doTestMigrateTunnelModeTransform(AF_INET, AF_INET6, false, false);
+ }
+
+ @IgnoreUpTo(Build.VERSION_CODES.TIRAMISU)
+ @Test
+ public void testMigrateTransformTunnelV6InV6() throws Exception {
+ doTestMigrateTunnelModeTransform(AF_INET6, AF_INET6, false, false);
+ }
+
+ @IgnoreUpTo(Build.VERSION_CODES.TIRAMISU)
+ @Test
+ public void testMigrateTransformTunnelV4InV4UdpEncap() throws Exception {
+ doTestMigrateTunnelModeTransform(AF_INET, AF_INET, true, false);
+ }
+
+ @IgnoreUpTo(Build.VERSION_CODES.TIRAMISU)
+ @Test
+ public void testMigrateTransformTunnelV6InV4UdpEncap() throws Exception {
+ doTestMigrateTunnelModeTransform(AF_INET6, AF_INET, true, false);
+ }
+
+ @IgnoreUpTo(Build.VERSION_CODES.TIRAMISU)
+ @Test
+ public void testMigrateTransformTunnelV4InV6UdpEncap() throws Exception {
+ assumeExperimentalIpv6UdpEncapSupported();
+ doTestMigrateTunnelModeTransform(AF_INET, AF_INET6, true, false);
+ }
+
+ @IgnoreUpTo(Build.VERSION_CODES.TIRAMISU)
+ @Test
+ public void testMigrateTransformTunnelV6InV6UdpEncap() throws Exception {
+ assumeExperimentalIpv6UdpEncapSupported();
+ doTestMigrateTunnelModeTransform(AF_INET6, AF_INET6, true, false);
+ }
}
diff --git a/tests/cts/net/src/android/net/cts/MultinetworkApiTest.java b/tests/cts/net/src/android/net/cts/MultinetworkApiTest.java
index 691ab99..17a9ca2 100644
--- a/tests/cts/net/src/android/net/cts/MultinetworkApiTest.java
+++ b/tests/cts/net/src/android/net/cts/MultinetworkApiTest.java
@@ -18,21 +18,18 @@
import static android.net.NetworkCapabilities.TRANSPORT_CELLULAR;
-import android.content.Context;
import android.content.ContentResolver;
+import android.content.Context;
import android.net.ConnectivityManager;
import android.net.Network;
import android.net.NetworkCapabilities;
import android.net.NetworkUtils;
import android.net.cts.util.CtsNetUtils;
import android.platform.test.annotations.AppModeFull;
-import android.provider.Settings;
import android.system.ErrnoException;
import android.system.OsConstants;
import android.test.AndroidTestCase;
-import java.util.ArrayList;
-
public class MultinetworkApiTest extends AndroidTestCase {
static {
@@ -75,26 +72,8 @@
super.tearDown();
}
- private Network[] getTestableNetworks() {
- final ArrayList<Network> testableNetworks = new ArrayList<Network>();
- for (Network network : mCM.getAllNetworks()) {
- final NetworkCapabilities nc = mCM.getNetworkCapabilities(network);
- if (nc != null
- && nc.hasCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED)
- && nc.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)) {
- testableNetworks.add(network);
- }
- }
-
- assertTrue(
- "This test requires that at least one network be connected. " +
- "Please ensure that the device is connected to a network.",
- testableNetworks.size() >= 1);
- return testableNetworks.toArray(new Network[0]);
- }
-
public void testGetaddrinfo() throws ErrnoException {
- for (Network network : getTestableNetworks()) {
+ for (Network network : mCtsNetUtils.getTestableNetworks()) {
int errno = runGetaddrinfoCheck(network.getNetworkHandle());
if (errno != 0) {
throw new ErrnoException(
@@ -109,7 +88,7 @@
assertNull(mCM.getProcessDefaultNetwork());
assertEquals(0, NetworkUtils.getBoundNetworkForProcess());
- for (Network network : getTestableNetworks()) {
+ for (Network network : mCtsNetUtils.getTestableNetworks()) {
mCM.setProcessDefaultNetwork(null);
assertNull(mCM.getProcessDefaultNetwork());
@@ -128,7 +107,7 @@
mCM.setProcessDefaultNetwork(null);
}
- for (Network network : getTestableNetworks()) {
+ for (Network network : mCtsNetUtils.getTestableNetworks()) {
NetworkUtils.bindProcessToNetwork(0);
assertNull(mCM.getBoundNetworkForProcess());
@@ -148,7 +127,7 @@
@AppModeFull(reason = "CHANGE_NETWORK_STATE permission can't be granted to instant apps")
public void testSetsocknetwork() throws ErrnoException {
- for (Network network : getTestableNetworks()) {
+ for (Network network : mCtsNetUtils.getTestableNetworks()) {
int errno = runSetsocknetwork(network.getNetworkHandle());
if (errno != 0) {
throw new ErrnoException(
@@ -158,7 +137,7 @@
}
public void testNativeDatagramTransmission() throws ErrnoException {
- for (Network network : getTestableNetworks()) {
+ for (Network network : mCtsNetUtils.getTestableNetworks()) {
int errno = runDatagramCheck(network.getNetworkHandle());
if (errno != 0) {
throw new ErrnoException(
@@ -181,7 +160,7 @@
public void testNetworkHandle() {
// Test Network -> NetworkHandle -> Network results in the same Network.
- for (Network network : getTestableNetworks()) {
+ for (Network network : mCtsNetUtils.getTestableNetworks()) {
long networkHandle = network.getNetworkHandle();
Network newNetwork = Network.fromNetworkHandle(networkHandle);
assertEquals(newNetwork, network);
@@ -203,7 +182,7 @@
}
public void testResNApi() throws Exception {
- final Network[] testNetworks = getTestableNetworks();
+ final Network[] testNetworks = mCtsNetUtils.getTestableNetworks();
for (Network network : testNetworks) {
// Throws AssertionError directly in jni function if test fail.
@@ -229,7 +208,7 @@
// b/144521720
try {
mCtsNetUtils.setPrivateDnsStrictMode(GOOGLE_PRIVATE_DNS_SERVER);
- for (Network network : getTestableNetworks()) {
+ for (Network network : mCtsNetUtils.getTestableNetworks()) {
// Wait for private DNS setting to propagate.
mCtsNetUtils.awaitPrivateDnsSetting("NxDomain test wait private DNS setting timeout",
network, GOOGLE_PRIVATE_DNS_SERVER, true);
diff --git a/tests/cts/net/src/android/net/cts/NetworkAgentTest.kt b/tests/cts/net/src/android/net/cts/NetworkAgentTest.kt
index f578ff3..98ea224 100644
--- a/tests/cts/net/src/android/net/cts/NetworkAgentTest.kt
+++ b/tests/cts/net/src/android/net/cts/NetworkAgentTest.kt
@@ -29,9 +29,9 @@
import android.net.NattKeepalivePacketData
import android.net.Network
import android.net.NetworkAgent
-import android.net.NetworkAgentConfig
import android.net.NetworkAgent.INVALID_NETWORK
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
@@ -46,21 +46,23 @@
import android.net.NetworkCapabilities.NET_CAPABILITY_VALIDATED
import android.net.NetworkCapabilities.TRANSPORT_CELLULAR
import android.net.NetworkCapabilities.TRANSPORT_TEST
-import android.net.NetworkCapabilities.TRANSPORT_WIFI
import android.net.NetworkCapabilities.TRANSPORT_VPN
+import android.net.NetworkCapabilities.TRANSPORT_WIFI
import android.net.NetworkInfo
import android.net.NetworkProvider
import android.net.NetworkReleasedException
import android.net.NetworkRequest
import android.net.NetworkScore
-import android.net.RouteInfo
import android.net.QosCallback
-import android.net.QosCallbackException
import android.net.QosCallback.QosCallbackRegistrationException
+import android.net.QosCallbackException
import android.net.QosSession
import android.net.QosSessionAttributes
import android.net.QosSocketInfo
+import android.net.RouteInfo
import android.net.SocketKeepalive
+import android.net.TestNetworkInterface
+import android.net.TestNetworkManager
import android.net.Uri
import android.net.VpnManager
import android.net.VpnTransportInfo
@@ -71,6 +73,7 @@
import android.os.Handler
import android.os.HandlerThread
import android.os.Message
+import android.os.Process
import android.os.SystemClock
import android.platform.test.annotations.AppModeFull
import android.system.OsConstants.IPPROTO_TCP
@@ -89,6 +92,7 @@
import com.android.testutils.DevSdkIgnoreRunner
import com.android.testutils.RecorderCallback.CallbackEntry.Available
import com.android.testutils.RecorderCallback.CallbackEntry.BlockedStatus
+import com.android.testutils.RecorderCallback.CallbackEntry.CapabilitiesChanged
import com.android.testutils.RecorderCallback.CallbackEntry.LinkPropertiesChanged
import com.android.testutils.RecorderCallback.CallbackEntry.Losing
import com.android.testutils.RecorderCallback.CallbackEntry.Lost
@@ -108,17 +112,6 @@
import com.android.testutils.TestableNetworkAgent.CallbackEntry.OnValidationStatus
import com.android.testutils.TestableNetworkCallback
import com.android.testutils.assertThrows
-import org.junit.After
-import org.junit.Before
-import org.junit.Test
-import org.junit.runner.RunWith
-import org.mockito.ArgumentMatchers.any
-import org.mockito.ArgumentMatchers.argThat
-import org.mockito.ArgumentMatchers.eq
-import org.mockito.Mockito.doReturn
-import org.mockito.Mockito.mock
-import org.mockito.Mockito.timeout
-import org.mockito.Mockito.verify
import java.io.Closeable
import java.io.IOException
import java.net.DatagramSocket
@@ -136,6 +129,17 @@
import kotlin.test.assertNull
import kotlin.test.assertTrue
import kotlin.test.fail
+import org.junit.After
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.mockito.ArgumentMatchers.any
+import org.mockito.ArgumentMatchers.argThat
+import org.mockito.ArgumentMatchers.eq
+import org.mockito.Mockito.doReturn
+import org.mockito.Mockito.mock
+import org.mockito.Mockito.timeout
+import org.mockito.Mockito.verify
// This test doesn't really have a constraint on how fast the methods should return. If it's
// going to fail, it will simply wait forever, so setting a high timeout lowers the flake ratio
@@ -160,6 +164,12 @@
it.obj = obj
}
+// On T and below, the native network is only created when the agent connects.
+// Starting in U, the native network was to be created as soon as the agent is registered,
+// but this has been flagged off for now pending resolution of race conditions.
+// TODO : enable this in a Mainline update or in V.
+private const val SHOULD_CREATE_NETWORKS_IMMEDIATELY = false
+
@RunWith(DevSdkIgnoreRunner::class)
// NetworkAgent is not updatable in R-, so this test does not need to be compatible with older
// versions. NetworkAgent was also based on AsyncChannel before S so cannot be tested the same way.
@@ -168,6 +178,7 @@
// for modules other than Connectivity does not provide much value. Only run them in connectivity
// module MTS, so the tests only need to cover the case of an updated NetworkAgent.
@ConnectivityModuleTest
+@AppModeFull(reason = "Instant apps can't use NetworkAgent because it needs NETWORK_FACTORY'.")
class NetworkAgentTest {
private val LOCAL_IPV4_ADDRESS = InetAddresses.parseNumericAddress("192.0.2.1")
private val REMOTE_IPV4_ADDRESS = InetAddresses.parseNumericAddress("192.0.2.2")
@@ -178,6 +189,7 @@
private val agentsToCleanUp = mutableListOf<NetworkAgent>()
private val callbacksToCleanUp = mutableListOf<TestableNetworkCallback>()
private var qosTestSocket: Closeable? = null // either Socket or DatagramSocket
+ private val ifacesToCleanUp = mutableListOf<TestNetworkInterface>()
@Before
fun setUp() {
@@ -189,8 +201,10 @@
fun tearDown() {
agentsToCleanUp.forEach { it.unregister() }
callbacksToCleanUp.forEach { mCM.unregisterNetworkCallback(it) }
+ ifacesToCleanUp.forEach { it.fileDescriptor.close() }
qosTestSocket?.close()
mHandlerThread.quitSafely()
+ mHandlerThread.join()
instrumentation.getUiAutomation().dropShellPermissionIdentity()
}
@@ -268,7 +282,7 @@
removeCapability(NET_CAPABILITY_INTERNET)
addCapability(NET_CAPABILITY_NOT_SUSPENDED)
addCapability(NET_CAPABILITY_NOT_ROAMING)
- addCapability(NET_CAPABILITY_NOT_VPN)
+ if (!transports.contains(TRANSPORT_VPN)) addCapability(NET_CAPABILITY_NOT_VPN)
if (SdkLevel.isAtLeastS()) {
addCapability(NET_CAPABILITY_NOT_VCN_MANAGED)
}
@@ -303,7 +317,7 @@
context: Context = realContext,
specifier: String? = UUID.randomUUID().toString(),
initialConfig: NetworkAgentConfig? = null,
- expectedInitSignalStrengthThresholds: IntArray? = intArrayOf(),
+ expectedInitSignalStrengthThresholds: IntArray = intArrayOf(),
transports: IntArray = intArrayOf()
): Pair<TestableNetworkAgent, TestableNetworkCallback> {
val callback = TestableNetworkCallback()
@@ -316,8 +330,7 @@
agent.register()
agent.markConnected()
agent.expectCallback<OnNetworkCreated>()
- agent.expectSignalStrengths(expectedInitSignalStrengthThresholds)
- agent.expectValidationBypassedStatus()
+ agent.expectPostConnectionCallbacks(expectedInitSignalStrengthThresholds)
callback.expectAvailableThenValidatedCallbacks(agent.network!!)
return agent to callback
}
@@ -335,6 +348,19 @@
mFakeConnectivityService.connect(it.registerForTest(Network(FAKE_NET_ID)))
}
+ private fun TestableNetworkAgent.expectPostConnectionCallbacks(
+ thresholds: IntArray = intArrayOf()
+ ) {
+ expectSignalStrengths(thresholds)
+ expectValidationBypassedStatus()
+ assertNoCallback()
+ }
+
+ private fun createTunInterface(): TestNetworkInterface = realContext.getSystemService(
+ TestNetworkManager::class.java)!!.createTunInterface(emptyList()).also {
+ ifacesToCleanUp.add(it)
+ }
+
fun assertLinkPropertiesEventually(
n: Network,
description: String,
@@ -963,13 +989,11 @@
.also { assertNotNull(agent.network?.bindSocket(it)) }
}
- @AppModeFull(reason = "Instant apps don't have permission to bind sockets.")
@Test
fun testQosCallbackRegisterAndUnregister() {
validateQosCallbackRegisterAndUnregister(IPPROTO_TCP)
}
- @AppModeFull(reason = "Instant apps don't have permission to bind sockets.")
@Test
fun testQosCallbackRegisterAndUnregisterWithDatagramSocket() {
validateQosCallbackRegisterAndUnregister(IPPROTO_UDP)
@@ -1006,13 +1030,11 @@
}
}
- @AppModeFull(reason = "Instant apps don't have permission to bind sockets.")
@Test
fun testQosCallbackOnQosSession() {
validateQosCallbackOnQosSession(IPPROTO_TCP)
}
- @AppModeFull(reason = "Instant apps don't have permission to bind sockets.")
@Test
fun testQosCallbackOnQosSessionWithDatagramSocket() {
validateQosCallbackOnQosSession(IPPROTO_UDP)
@@ -1071,7 +1093,6 @@
}
}
- @AppModeFull(reason = "Instant apps don't have permission to bind sockets.")
@Test
fun testQosCallbackOnError() {
val (agent, qosTestSocket) = setupForQosSocket()
@@ -1110,7 +1131,6 @@
}
}
- @AppModeFull(reason = "Instant apps don't have permission to bind sockets.")
@Test
fun testQosCallbackIdsAreMappedCorrectly() {
val (agent, qosTestSocket) = setupForQosSocket()
@@ -1151,7 +1171,6 @@
}
}
- @AppModeFull(reason = "Instant apps don't have permission to bind sockets.")
@Test
fun testQosCallbackWhenNetworkReleased() {
val (agent, qosTestSocket) = setupForQosSocket()
@@ -1193,7 +1212,6 @@
)
}
- @AppModeFull(reason = "Instant apps don't have permission to bind sockets.")
@Test
fun testUnregisterAfterReplacement() {
// Keeps an eye on all test networks.
@@ -1290,8 +1308,12 @@
requestNetwork(makeTestNetworkRequest(specifier = specifier6), callback)
val agent6 = createNetworkAgent(specifier = specifier6)
val network6 = agent6.register()
- // No callbacks are sent, so check the LinkProperties to see if the network has connected.
- assertLinkPropertiesEventuallyNotNull(agent6.network!!)
+ if (SHOULD_CREATE_NETWORKS_IMMEDIATELY) {
+ agent6.expectCallback<OnNetworkCreated>()
+ } else {
+ // No callbacks are sent, so check LinkProperties to wait for the network to be created.
+ assertLinkPropertiesEventuallyNotNull(agent6.network!!)
+ }
// unregisterAfterReplacement tears down the network immediately.
// Approximately check that this is the case by picking an unregister timeout that's longer
@@ -1300,8 +1322,10 @@
val timeoutMs = agent6.DEFAULT_TIMEOUT_MS.toInt() + 1_000
agent6.unregisterAfterReplacement(timeoutMs)
agent6.expectCallback<OnNetworkUnwanted>()
- if (!SdkLevel.isAtLeastT()) {
+ if (!SdkLevel.isAtLeastT() || SHOULD_CREATE_NETWORKS_IMMEDIATELY) {
// Before T, onNetworkDestroyed is called even if the network was never created.
+ // If immediate native network creation is supported, the network was created by
+ // register(). Destroying it sends onNetworkDestroyed.
agent6.expectCallback<OnNetworkDestroyed>()
}
// Poll for LinkProperties becoming null, because when onNetworkUnwanted is called, the
@@ -1374,4 +1398,100 @@
callback.expect<Available>(agent.network!!)
callback.eventuallyExpect<Lost> { it.network == agent.network }
}
+
+ fun doTestNativeNetworkCreation(expectCreatedImmediately: Boolean, transports: IntArray) {
+ val iface = createTunInterface()
+ val ifName = iface.interfaceName
+ val nc = makeTestNetworkCapabilities(ifName, transports).also {
+ if (transports.contains(TRANSPORT_VPN)) {
+ val sessionId = "NetworkAgentTest-${Process.myPid()}"
+ it.transportInfo = VpnTransportInfo(VpnManager.TYPE_VPN_PLATFORM, sessionId,
+ /*bypassable=*/ false, /*longLivedTcpConnectionsExpensive=*/ false)
+ it.underlyingNetworks = listOf()
+ }
+ }
+ val lp = LinkProperties().apply {
+ interfaceName = ifName
+ addLinkAddress(LinkAddress("2001:db8::1/64"))
+ addRoute(RouteInfo(IpPrefix("2001:db8::/64"), null /* nextHop */, ifName))
+ addRoute(RouteInfo(IpPrefix("::/0"),
+ InetAddresses.parseNumericAddress("fe80::abcd"),
+ ifName))
+ }
+
+ // File a request containing the agent's specifier to receive callbacks and to ensure that
+ // the agent is not torn down due to being unneeded.
+ val request = makeTestNetworkRequest(specifier = ifName)
+ val requestCallback = TestableNetworkCallback()
+ requestNetwork(request, requestCallback)
+
+ val listenCallback = TestableNetworkCallback()
+ registerNetworkCallback(request, listenCallback)
+
+ // Register the NetworkAgent...
+ val agent = createNetworkAgent(realContext, initialNc = nc, initialLp = lp)
+ val network = agent.register()
+
+ // ... and then change the NetworkCapabilities and LinkProperties.
+ nc.addCapability(NET_CAPABILITY_TEMPORARILY_NOT_METERED)
+ agent.sendNetworkCapabilities(nc)
+ lp.addLinkAddress(LinkAddress("192.0.2.2/25"))
+ lp.addRoute(RouteInfo(IpPrefix("192.0.2.0/25"), null /* nextHop */, ifName))
+ agent.sendLinkProperties(lp)
+
+ requestCallback.assertNoCallback()
+ listenCallback.assertNoCallback()
+ if (!expectCreatedImmediately) {
+ agent.assertNoCallback()
+ agent.markConnected()
+ agent.expectCallback<OnNetworkCreated>()
+ } else {
+ agent.expectCallback<OnNetworkCreated>()
+ agent.markConnected()
+ }
+ agent.expectPostConnectionCallbacks()
+
+ // onAvailable must be called only when the network connects, and no other callbacks may be
+ // called before that happens. The callbacks report the state of the network as it was when
+ // it connected, so they reflect the NC and LP changes made after registration.
+ requestCallback.expect<Available>(network)
+ listenCallback.expect<Available>(network)
+
+ requestCallback.expect<CapabilitiesChanged>(network) { it.caps.hasCapability(
+ NET_CAPABILITY_TEMPORARILY_NOT_METERED) }
+ listenCallback.expect<CapabilitiesChanged>(network) { it.caps.hasCapability(
+ NET_CAPABILITY_TEMPORARILY_NOT_METERED) }
+
+ requestCallback.expect<LinkPropertiesChanged>(network) { it.lp.equals(lp) }
+ listenCallback.expect<LinkPropertiesChanged>(network) { it.lp.equals(lp) }
+
+ requestCallback.expect<BlockedStatus>()
+ listenCallback.expect<BlockedStatus>()
+
+ // Except for network validation, ensure no more callbacks are sent.
+ requestCallback.expectCaps(network) {
+ it.hasCapability(NET_CAPABILITY_VALIDATED)
+ }
+ listenCallback.expectCaps(network) {
+ it.hasCapability(NET_CAPABILITY_VALIDATED)
+ }
+ unregister(agent)
+ // Lost implicitly checks that no further callbacks happened after connect.
+ requestCallback.expect<Lost>(network)
+ listenCallback.expect<Lost>(network)
+ assertNull(mCM.getLinkProperties(network))
+ }
+
+ @Test
+ fun testNativeNetworkCreation_PhysicalNetwork() {
+ doTestNativeNetworkCreation(
+ expectCreatedImmediately = SHOULD_CREATE_NETWORKS_IMMEDIATELY,
+ intArrayOf(TRANSPORT_CELLULAR))
+ }
+
+ @Test
+ fun testNativeNetworkCreation_Vpn() {
+ // VPN networks are always created as soon as the agent is registered.
+ doTestNativeNetworkCreation(expectCreatedImmediately = true, intArrayOf(TRANSPORT_VPN))
+ }
}
diff --git a/tests/cts/net/src/android/net/cts/NetworkScoreTest.kt b/tests/cts/net/src/android/net/cts/NetworkScoreTest.kt
index eb41d71..2704dd3 100644
--- a/tests/cts/net/src/android/net/cts/NetworkScoreTest.kt
+++ b/tests/cts/net/src/android/net/cts/NetworkScoreTest.kt
@@ -30,6 +30,7 @@
import android.os.Build
import android.os.Handler
import android.os.HandlerThread
+import android.util.Log
import androidx.test.InstrumentationRegistry
import com.android.compatibility.common.util.SystemUtil.runWithShellPermissionIdentity
import com.android.testutils.DevSdkIgnoreRule.IgnoreUpTo
@@ -41,6 +42,7 @@
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
+import java.util.Collections
// This test doesn't really have a constraint on how fast the methods should return. If it's
// going to fail, it will simply wait forever, so setting a high timeout lowers the flake ratio
@@ -64,10 +66,11 @@
@IgnoreUpTo(Build.VERSION_CODES.R)
@RunWith(DevSdkIgnoreRunner::class)
class NetworkScoreTest {
+ private val TAG = javaClass.simpleName
private val mCm = testContext.getSystemService(ConnectivityManager::class.java)
- private val mHandlerThread = HandlerThread("${javaClass.simpleName} handler thread")
+ private val mHandlerThread = HandlerThread("$TAG handler thread")
private val mHandler by lazy { Handler(mHandlerThread.looper) }
- private val agentsToCleanUp = mutableListOf<NetworkAgent>()
+ private val agentsToCleanUp = Collections.synchronizedList(mutableListOf<NetworkAgent>())
private val callbacksToCleanUp = mutableListOf<TestableNetworkCallback>()
@Before
@@ -83,14 +86,18 @@
.addTransportType(NetworkCapabilities.TRANSPORT_TEST).build(), cb, mHandler
)
}
+ Log.i(TAG, "Teardown on thread ${System.identityHashCode(Thread.currentThread())} " +
+ "cleaning up ${agentsToCleanUp.size} agents")
agentsToCleanUp.forEach {
+ Log.i(TAG, "Unregister agent for net ${it.network}")
it.unregister()
agentCleanUpCb.eventuallyExpect<CallbackEntry.Lost> { cb -> cb.network == it.network }
}
mCm.unregisterNetworkCallback(agentCleanUpCb)
- mHandlerThread.quitSafely()
callbacksToCleanUp.forEach { mCm.unregisterNetworkCallback(it) }
+ mHandlerThread.quitSafely()
+ mHandlerThread.join()
}
// Returns a networkCallback that sends onAvailable on the best network with TRANSPORT_TEST.
@@ -144,6 +151,8 @@
val agent = object : NetworkAgent(context, looper, "NetworkScore test agent", nc,
LinkProperties(), score, config, NetworkProvider(context, looper,
"NetworkScore test provider")) {}.also {
+ Log.i(TAG, "Add on thread ${System.identityHashCode(Thread.currentThread())} " +
+ "agent to clean up $it")
agentsToCleanUp.add(it)
}
runWithShellPermissionIdentity({ agent.register() }, MANAGE_TEST_NETWORKS)
diff --git a/tests/cts/net/src/android/net/cts/NetworkStatsManagerTest.java b/tests/cts/net/src/android/net/cts/NetworkStatsManagerTest.java
index f86c5cd..83b9b81 100644
--- a/tests/cts/net/src/android/net/cts/NetworkStatsManagerTest.java
+++ b/tests/cts/net/src/android/net/cts/NetworkStatsManagerTest.java
@@ -210,7 +210,6 @@
private long mStartTime;
private long mEndTime;
- private long mBytesRead;
private String mWriteSettingsMode;
private String mUsageStatsMode;
@@ -229,6 +228,7 @@
TrafficStats.setThreadStatsTag(NETWORK_TAG);
urlc = (HttpURLConnection) network.openConnection(url);
urlc.setConnectTimeout(TIMEOUT_MILLIS);
+ urlc.setReadTimeout(TIMEOUT_MILLIS);
urlc.setUseCaches(false);
// Disable compression so we generate enough traffic that assertWithinPercentage will
// not be affected by the small amount of traffic (5-10kB) sent by the test harness.
@@ -236,11 +236,10 @@
urlc.connect();
boolean ping = urlc.getResponseCode() == 200;
if (ping) {
- in = new InputStreamReader(
- (InputStream) urlc.getContent());
-
- mBytesRead = 0;
- while (in.read() != -1) ++mBytesRead;
+ in = new InputStreamReader((InputStream) urlc.getContent());
+ // Since the test doesn't really care about the precise amount of data, instead
+ // of reading all contents, just read few bytes at the beginning.
+ in.read();
}
} catch (Exception e) {
Log.i(LOG_TAG, "Badness during exercising remote server: " + e);
@@ -379,7 +378,7 @@
.build(), callback);
synchronized (this) {
try {
- wait((int) (TIMEOUT_MILLIS * 1.2));
+ wait((int) (TIMEOUT_MILLIS * 2.4));
} catch (InterruptedException e) {
}
}
@@ -394,7 +393,7 @@
assertFalse(mNetworkInterfacesToTest[networkTypeIndex].getSystemFeature()
+ " is a reported system feature, "
+ "however no corresponding connected network interface was found or the attempt "
- + "to connect has timed out (timeout = " + TIMEOUT_MILLIS + "ms)."
+ + "to connect and read has timed out (timeout = " + (TIMEOUT_MILLIS * 2) + "ms)."
+ mNetworkInterfacesToTest[networkTypeIndex].getErrorMessage(), hasFeature);
return false;
}
@@ -800,7 +799,7 @@
// harness, which is untagged, won't cause a failure.
long firstTotal = resultsWithTraffic.get(0).total;
for (QueryResult queryResult : resultsWithTraffic) {
- assertWithinPercentage(queryResult + "", firstTotal, queryResult.total, 10);
+ assertWithinPercentage(queryResult + "", firstTotal, queryResult.total, 12);
}
// Expect to see no traffic when querying for any tag in tagsWithNoTraffic or any
diff --git a/tests/cts/net/src/android/net/cts/NetworkValidationTest.kt b/tests/cts/net/src/android/net/cts/NetworkValidationTest.kt
index 8e98dba..621af23 100644
--- a/tests/cts/net/src/android/net/cts/NetworkValidationTest.kt
+++ b/tests/cts/net/src/android/net/cts/NetworkValidationTest.kt
@@ -146,6 +146,7 @@
httpServer.stop()
handlerThread.threadHandler.post { reader.stop() }
handlerThread.quitSafely()
+ handlerThread.join()
iface.fileDescriptor.close()
}
diff --git a/tests/cts/net/src/android/net/cts/NsdManagerTest.kt b/tests/cts/net/src/android/net/cts/NsdManagerTest.kt
index de5e46f..6c411cf 100644
--- a/tests/cts/net/src/android/net/cts/NsdManagerTest.kt
+++ b/tests/cts/net/src/android/net/cts/NsdManagerTest.kt
@@ -19,6 +19,8 @@
import android.app.compat.CompatChanges
import android.net.ConnectivityManager
import android.net.ConnectivityManager.NetworkCallback
+import android.net.InetAddresses.parseNumericAddress
+import android.net.LinkAddress
import android.net.LinkProperties
import android.net.LocalSocket
import android.net.LocalSocketAddress
@@ -27,6 +29,7 @@
import android.net.NetworkCapabilities
import android.net.NetworkCapabilities.NET_CAPABILITY_TEMPORARILY_NOT_METERED
import android.net.NetworkCapabilities.NET_CAPABILITY_TRUSTED
+import android.net.NetworkCapabilities.NET_CAPABILITY_VALIDATED
import android.net.NetworkCapabilities.TRANSPORT_TEST
import android.net.NetworkRequest
import android.net.TestNetworkInterface
@@ -62,18 +65,31 @@
import android.os.HandlerThread
import android.os.Process.myTid
import android.platform.test.annotations.AppModeFull
+import android.system.ErrnoException
+import android.system.Os
+import android.system.OsConstants.AF_INET6
+import android.system.OsConstants.EADDRNOTAVAIL
+import android.system.OsConstants.ENETUNREACH
+import android.system.OsConstants.IPPROTO_UDP
+import android.system.OsConstants.SOCK_DGRAM
import android.util.Log
+import androidx.test.filters.SmallTest
import androidx.test.platform.app.InstrumentationRegistry
-import androidx.test.runner.AndroidJUnit4
import com.android.compatibility.common.util.PollingCheck
import com.android.compatibility.common.util.PropertyUtil
+import com.android.modules.utils.build.SdkLevel.isAtLeastU
import com.android.net.module.util.ArrayTrackRecord
import com.android.net.module.util.TrackRecord
import com.android.networkstack.apishim.NsdShimImpl
import com.android.networkstack.apishim.common.NsdShim
import com.android.testutils.ConnectivityModuleTest
import com.android.testutils.DevSdkIgnoreRule
+import com.android.testutils.DevSdkIgnoreRule.IgnoreUpTo
+import com.android.testutils.DevSdkIgnoreRunner
+import com.android.testutils.RecorderCallback.CallbackEntry.CapabilitiesChanged
+import com.android.testutils.RecorderCallback.CallbackEntry.LinkPropertiesChanged
import com.android.testutils.TestableNetworkAgent
+import com.android.testutils.TestableNetworkAgent.CallbackEntry.OnNetworkCreated
import com.android.testutils.TestableNetworkCallback
import com.android.testutils.filters.CtsNetTestCasesMaxTargetSdk30
import com.android.testutils.filters.CtsNetTestCasesMaxTargetSdk33
@@ -82,6 +98,9 @@
import com.android.testutils.waitForIdle
import java.io.File
import java.io.IOException
+import java.net.Inet6Address
+import java.net.InetAddress
+import java.net.NetworkInterface
import java.net.ServerSocket
import java.nio.charset.StandardCharsets
import java.util.Random
@@ -112,11 +131,15 @@
// tried sequentially
private const val REGISTRATION_TIMEOUT_MS = 10_000L
private const val DBG = false
+private const val TEST_PORT = 12345
private val nsdShim = NsdShimImpl.newInstance()
@AppModeFull(reason = "Socket cannot bind in instant app mode")
-@RunWith(AndroidJUnit4::class)
+@RunWith(DevSdkIgnoreRunner::class)
+@SmallTest
+@ConnectivityModuleTest
+@IgnoreUpTo(Build.VERSION_CODES.S_V2)
class NsdManagerTest {
// Rule used to filter CtsNetTestCasesMaxTargetSdkXX
@get:Rule
@@ -264,13 +287,17 @@
fun waitForServiceDiscovered(
serviceName: String,
+ serviceType: String,
expectedNetwork: Network? = null
): NsdServiceInfo {
- return expectCallbackEventually<ServiceFound> {
+ val serviceFound = expectCallbackEventually<ServiceFound> {
it.serviceInfo.serviceName == serviceName &&
(expectedNetwork == null ||
expectedNetwork == nsdShim.getNetwork(it.serviceInfo))
}.serviceInfo
+ // Discovered service types have a dot at the end
+ assertEquals("$serviceType.", serviceFound.serviceType)
+ return serviceFound
}
}
@@ -299,6 +326,7 @@
}
override fun onStopResolutionFailed(si: NsdServiceInfo, err: Int) {
+ super.onStopResolutionFailed(si, err)
add(StopResolutionFailed(si, err))
}
}
@@ -353,37 +381,85 @@
.build(), cb)
val agent = registerTestNetworkAgent(iface.interfaceName)
val network = agent.network ?: fail("Registered agent should have a network")
+
+ cb.eventuallyExpect<LinkPropertiesChanged>(TIMEOUT_MS) {
+ it.lp.linkAddresses.isNotEmpty()
+ }
+
// The network has no INTERNET capability, so will be marked validated immediately
- cb.expectAvailableThenValidatedCallbacks(network, TIMEOUT_MS)
+ // It does not matter if validated capabilities come before/after the link addresses change
+ cb.eventuallyExpect<CapabilitiesChanged>(TIMEOUT_MS, from = 0) {
+ it.caps.hasCapability(NET_CAPABILITY_VALIDATED)
+ }
return TestTapNetwork(iface, cb, agent, network)
}
private fun registerTestNetworkAgent(ifaceName: String): TestableNetworkAgent {
+ val lp = LinkProperties().apply {
+ interfaceName = ifaceName
+ }
+
val agent = TestableNetworkAgent(context, handlerThread.looper,
NetworkCapabilities().apply {
removeCapability(NET_CAPABILITY_TRUSTED)
addTransportType(TRANSPORT_TEST)
setNetworkSpecifier(TestNetworkSpecifier(ifaceName))
- },
- LinkProperties().apply {
- interfaceName = ifaceName
- },
- NetworkAgentConfig.Builder().build())
- agent.register()
+ }, lp, NetworkAgentConfig.Builder().build())
+ val network = agent.register()
agent.markConnected()
+ agent.expectCallback<OnNetworkCreated>()
+
+ // Wait until the link-local address can be used. Address flags are not available without
+ // elevated permissions, so check that bindSocket works.
+ PollingCheck.check("No usable v6 address on interface after $TIMEOUT_MS ms", TIMEOUT_MS) {
+ // To avoid race condition between socket connection succeeding and interface returning
+ // a non-empty address list. Verify that interface returns a non-empty list, before
+ // trying the socket connection.
+ if (NetworkInterface.getByName(ifaceName).interfaceAddresses.isEmpty()) {
+ return@check false
+ }
+
+ val sock = Os.socket(AF_INET6, SOCK_DGRAM, IPPROTO_UDP)
+ tryTest {
+ network.bindSocket(sock)
+ Os.connect(sock, parseNumericAddress("ff02::fb%$ifaceName"), 12345)
+ true
+ }.catch<ErrnoException> {
+ if (it.errno != ENETUNREACH && it.errno != EADDRNOTAVAIL) {
+ throw it
+ }
+ false
+ } cleanup {
+ Os.close(sock)
+ }
+ }
+
+ lp.setLinkAddresses(NetworkInterface.getByName(ifaceName).interfaceAddresses.map {
+ LinkAddress(it.address, it.networkPrefixLength.toInt())
+ })
+ agent.sendLinkProperties(lp)
return agent
}
+ private fun makeTestServiceInfo(network: Network? = null) = NsdServiceInfo().also {
+ it.serviceType = serviceType
+ it.serviceName = serviceName
+ it.network = network
+ it.port = TEST_PORT
+ }
+
@After
fun tearDown() {
if (TestUtils.shouldTestTApis()) {
runAsShell(MANAGE_TEST_NETWORKS) {
- testNetwork1.close(cm)
- testNetwork2.close(cm)
+ // Avoid throwing here if initializing failed in setUp
+ if (this::testNetwork1.isInitialized) testNetwork1.close(cm)
+ if (this::testNetwork2.isInitialized) testNetwork2.close(cm)
}
}
handlerThread.waitForIdle(TIMEOUT_MS)
handlerThread.quitSafely()
+ handlerThread.join()
}
@Test
@@ -437,6 +513,10 @@
val registeredInfo = registrationRecord.expectCallback<ServiceRegistered>(
REGISTRATION_TIMEOUT_MS).serviceInfo
+ // Only service name is included in ServiceRegistered callbacks
+ assertNull(registeredInfo.serviceType)
+ assertEquals(si.serviceName, registeredInfo.serviceName)
+
val discoveryRecord = NsdDiscoveryRecord()
// Test discovering without an Executor
nsdManager.discoverServices(serviceType, NsdManager.PROTOCOL_DNS_SD, discoveryRecord)
@@ -445,12 +525,15 @@
discoveryRecord.expectCallback<DiscoveryStarted>()
// Expect a service record to be discovered
- val foundInfo = discoveryRecord.waitForServiceDiscovered(registeredInfo.serviceName)
+ val foundInfo = discoveryRecord.waitForServiceDiscovered(
+ registeredInfo.serviceName, serviceType)
// Test resolving without an Executor
val resolveRecord = NsdResolveRecord()
nsdManager.resolveService(foundInfo, resolveRecord)
val resolvedService = resolveRecord.expectCallback<ServiceResolved>().serviceInfo
+ assertEquals(".$serviceType", resolvedService.serviceType)
+ assertEquals(registeredInfo.serviceName, resolvedService.serviceName)
// Check Txt attributes
assertEquals(8, resolvedService.attributes.size)
@@ -465,7 +548,13 @@
assertTrue(resolvedService.attributes.containsKey("nullBinaryDataAttr"))
assertNull(resolvedService.attributes["nullBinaryDataAttr"])
assertTrue(resolvedService.attributes.containsKey("emptyBinaryDataAttr"))
- assertNull(resolvedService.attributes["emptyBinaryDataAttr"])
+ if (isAtLeastU() || CompatChanges.isChangeEnabled(
+ ConnectivityCompatChanges.ENABLE_PLATFORM_MDNS_BACKEND
+ )) {
+ assertArrayEquals(byteArrayOf(), resolvedService.attributes["emptyBinaryDataAttr"])
+ } else {
+ assertNull(resolvedService.attributes["emptyBinaryDataAttr"])
+ }
assertEquals(localPort, resolvedService.port)
// Unregister the service
@@ -473,9 +562,11 @@
registrationRecord.expectCallback<ServiceUnregistered>()
// Expect a callback for service lost
- discoveryRecord.expectCallbackEventually<ServiceLost> {
+ val lostCb = discoveryRecord.expectCallbackEventually<ServiceLost> {
it.serviceInfo.serviceName == serviceName
}
+ // Lost service types have a dot at the end
+ assertEquals("$serviceType.", lostCb.serviceInfo.serviceType)
// Register service again to see if NsdManager can discover it
val si2 = NsdServiceInfo()
@@ -489,7 +580,8 @@
// Expect a service record to be discovered (and filter the ones
// that are unrelated to this test)
- val foundInfo2 = discoveryRecord.waitForServiceDiscovered(registeredInfo2.serviceName)
+ val foundInfo2 = discoveryRecord.waitForServiceDiscovered(
+ registeredInfo2.serviceName, serviceType)
// Resolve the service
val resolveRecord2 = NsdResolveRecord()
@@ -526,7 +618,7 @@
testNetwork1.network, Executor { it.run() }, discoveryRecord)
val foundInfo = discoveryRecord.waitForServiceDiscovered(
- serviceName, testNetwork1.network)
+ serviceName, serviceType, testNetwork1.network)
assertEquals(testNetwork1.network, nsdShim.getNetwork(foundInfo))
// Rewind to ensure the service is not found on the other interface
@@ -573,6 +665,8 @@
val serviceDiscovered = discoveryRecord.expectCallback<ServiceFound>()
assertEquals(registeredInfo1.serviceName, serviceDiscovered.serviceInfo.serviceName)
+ // Discovered service types have a dot at the end
+ assertEquals("$serviceType.", serviceDiscovered.serviceInfo.serviceType)
assertEquals(testNetwork1.network, nsdShim.getNetwork(serviceDiscovered.serviceInfo))
// Unregister, then register the service back: it should be lost and found again
@@ -585,6 +679,7 @@
val registeredInfo2 = registerService(registrationRecord, si, executor)
val serviceDiscovered2 = discoveryRecord.expectCallback<ServiceFound>()
assertEquals(registeredInfo2.serviceName, serviceDiscovered2.serviceInfo.serviceName)
+ assertEquals("$serviceType.", serviceDiscovered2.serviceInfo.serviceType)
assertEquals(testNetwork1.network, nsdShim.getNetwork(serviceDiscovered2.serviceInfo))
// Teardown, then bring back up a network on the test interface: the service should
@@ -600,6 +695,7 @@
val newNetwork = newAgent.network ?: fail("Registered agent should have a network")
val serviceDiscovered3 = discoveryRecord.expectCallback<ServiceFound>()
assertEquals(registeredInfo2.serviceName, serviceDiscovered3.serviceInfo.serviceName)
+ assertEquals("$serviceType.", serviceDiscovered3.serviceInfo.serviceType)
assertEquals(newNetwork, nsdShim.getNetwork(serviceDiscovered3.serviceInfo))
} cleanupStep {
nsdManager.stopServiceDiscovery(discoveryRecord)
@@ -642,6 +738,20 @@
}
}
+ private fun checkAddressScopeId(iface: TestNetworkInterface, address: List<InetAddress>) {
+ val targetSdkVersion = context.packageManager
+ .getTargetSdkVersion(context.applicationInfo.packageName)
+ if (targetSdkVersion <= Build.VERSION_CODES.TIRAMISU) {
+ return
+ }
+ val ifaceIdx = NetworkInterface.getByName(iface.interfaceName).index
+ address.forEach {
+ if (it is Inet6Address && it.isLinkLocalAddress) {
+ assertEquals(ifaceIdx, it.scopeId)
+ }
+ }
+ }
+
@Test
fun testNsdManager_ResolveOnNetwork() {
// This test requires shims supporting T+ APIs (NsdServiceInfo.network)
@@ -661,12 +771,12 @@
nsdManager.discoverServices(serviceType, NsdManager.PROTOCOL_DNS_SD, discoveryRecord)
val foundInfo1 = discoveryRecord.waitForServiceDiscovered(
- serviceName, testNetwork1.network)
+ serviceName, serviceType, testNetwork1.network)
assertEquals(testNetwork1.network, nsdShim.getNetwork(foundInfo1))
// Rewind as the service could be found on each interface in any order
discoveryRecord.nextEvents.rewind(0)
val foundInfo2 = discoveryRecord.waitForServiceDiscovered(
- serviceName, testNetwork2.network)
+ serviceName, serviceType, testNetwork2.network)
assertEquals(testNetwork2.network, nsdShim.getNetwork(foundInfo2))
nsdShim.resolveService(nsdManager, foundInfo1, Executor { it.run() }, resolveRecord)
@@ -677,6 +787,7 @@
assertEquals(registeredInfo.serviceName, it.serviceName)
assertEquals(si.port, it.port)
assertEquals(testNetwork1.network, nsdShim.getNetwork(it))
+ checkAddressScopeId(testNetwork1.iface, it.hostAddresses)
}
// TODO: check that MDNS packets are sent only on testNetwork1.
} cleanupStep {
@@ -710,7 +821,7 @@
testNetwork1.network, Executor { it.run() }, discoveryRecord)
// Expect that service is found on testNetwork1
val foundInfo = discoveryRecord.waitForServiceDiscovered(
- serviceName, testNetwork1.network)
+ serviceName, serviceType, testNetwork1.network)
assertEquals(testNetwork1.network, nsdShim.getNetwork(foundInfo))
// Discover service on testNetwork2.
@@ -725,7 +836,7 @@
null as Network? /* network */, Executor { it.run() }, discoveryRecord3)
// Expect that service is found on testNetwork1
val foundInfo3 = discoveryRecord3.waitForServiceDiscovered(
- serviceName, testNetwork1.network)
+ serviceName, serviceType, testNetwork1.network)
assertEquals(testNetwork1.network, nsdShim.getNetwork(foundInfo3))
} cleanupStep {
nsdManager.stopServiceDiscovery(discoveryRecord2)
@@ -755,7 +866,7 @@
nsdManager.discoverServices(
serviceType, NsdManager.PROTOCOL_DNS_SD, discoveryRecord
)
- val foundInfo = discoveryRecord.waitForServiceDiscovered(serviceNames)
+ val foundInfo = discoveryRecord.waitForServiceDiscovered(serviceNames, serviceType)
// Expect that resolving the service name works properly even service name contains
// non-standard characters.
@@ -879,12 +990,10 @@
@Test
fun testRegisterServiceInfoCallback() {
- // This test requires shims supporting U+ APIs (NsdManager.subscribeService)
+ // This test requires shims supporting U+ APIs (NsdManager.registerServiceInfoCallback)
assumeTrue(TestUtils.shouldTestUApis())
- // Ensure Wi-Fi network connected and get addresses
- val wifiNetwork = ctsNetUtils.ensureWifiConnected()
- val lp = cm.getLinkProperties(wifiNetwork)
+ val lp = cm.getLinkProperties(testNetwork1.network)
assertNotNull(lp)
val addresses = lp.addresses
assertFalse(addresses.isEmpty())
@@ -892,34 +1001,33 @@
val si = NsdServiceInfo().apply {
serviceType = this@NsdManagerTest.serviceType
serviceName = this@NsdManagerTest.serviceName
- network = wifiNetwork
+ network = testNetwork1.network
port = 12345 // Test won't try to connect so port does not matter
}
- // Register service on Wi-Fi network
+ // Register service on the network
val registrationRecord = NsdRegistrationRecord()
registerService(registrationRecord, si)
val discoveryRecord = NsdDiscoveryRecord()
val cbRecord = NsdServiceInfoCallbackRecord()
tryTest {
- // Discover service on Wi-Fi network.
+ // Discover service on the network.
nsdShim.discoverServices(nsdManager, serviceType, NsdManager.PROTOCOL_DNS_SD,
- wifiNetwork, Executor { it.run() }, discoveryRecord)
+ testNetwork1.network, Executor { it.run() }, discoveryRecord)
val foundInfo = discoveryRecord.waitForServiceDiscovered(
- serviceName, wifiNetwork)
+ serviceName, serviceType, testNetwork1.network)
- // Subscribe to service and check the addresses are the same as Wi-Fi addresses
+ // Register service callback and check the addresses are the same as network addresses
nsdShim.registerServiceInfoCallback(nsdManager, foundInfo, { it.run() }, cbRecord)
- for (i in addresses.indices) {
- val subscribeCb = cbRecord.expectCallback<ServiceUpdated>()
- assertEquals(foundInfo.serviceName, subscribeCb.serviceInfo.serviceName)
- val hostAddresses = subscribeCb.serviceInfo.hostAddresses
- assertEquals(i + 1, hostAddresses.size)
- for (hostAddress in hostAddresses) {
- assertTrue(addresses.contains(hostAddress))
- }
+ val serviceInfoCb = cbRecord.expectCallback<ServiceUpdated>()
+ assertEquals(foundInfo.serviceName, serviceInfoCb.serviceInfo.serviceName)
+ val hostAddresses = serviceInfoCb.serviceInfo.hostAddresses
+ assertEquals(addresses.size, hostAddresses.size)
+ for (hostAddress in hostAddresses) {
+ assertTrue(addresses.contains(hostAddress))
}
+ checkAddressScopeId(testNetwork1.iface, serviceInfoCb.serviceInfo.hostAddresses)
} cleanupStep {
nsdManager.unregisterService(registrationRecord)
registrationRecord.expectCallback<ServiceUnregistered>()
@@ -935,6 +1043,70 @@
}
}
+ @Test
+ fun testStopServiceResolutionFailedCallback() {
+ // This test requires shims supporting U+ APIs (NsdManager.stopServiceResolution)
+ assumeTrue(TestUtils.shouldTestUApis())
+
+ // It's not possible to make ResolutionListener#onStopResolutionFailed callback sending
+ // because it is only sent in very edge-case scenarios when the legacy implementation is
+ // used, and the legacy implementation is never used in the current AOSP builds. Considering
+ // that this callback isn't expected to be sent at all at the moment, and this is just an
+ // interface with no implementation. To verify this callback, just call
+ // onStopResolutionFailed on the record directly then verify it is received.
+ val resolveRecord = NsdResolveRecord()
+ resolveRecord.onStopResolutionFailed(
+ NsdServiceInfo(), NsdManager.FAILURE_OPERATION_NOT_RUNNING)
+ val failedCb = resolveRecord.expectCallback<StopResolutionFailed>()
+ assertEquals(NsdManager.FAILURE_OPERATION_NOT_RUNNING, failedCb.errorCode)
+ }
+
+ @Test
+ fun testSubtypeAdvertisingAndDiscovery() {
+ val si = makeTestServiceInfo(network = testNetwork1.network)
+ // Test "_type._tcp.local,_subtype" syntax with the registration
+ si.serviceType = si.serviceType + ",_subtype"
+
+ val registrationRecord = NsdRegistrationRecord()
+
+ val baseTypeDiscoveryRecord = NsdDiscoveryRecord()
+ val subtypeDiscoveryRecord = NsdDiscoveryRecord()
+ val otherSubtypeDiscoveryRecord = NsdDiscoveryRecord()
+ tryTest {
+ registerService(registrationRecord, si)
+
+ // Test "_subtype._type._tcp.local" syntax with discovery. Note this is not
+ // "_subtype._sub._type._tcp.local".
+ nsdManager.discoverServices(serviceType,
+ NsdManager.PROTOCOL_DNS_SD,
+ testNetwork1.network, Executor { it.run() }, baseTypeDiscoveryRecord)
+ nsdManager.discoverServices("_othersubtype.$serviceType",
+ NsdManager.PROTOCOL_DNS_SD,
+ testNetwork1.network, Executor { it.run() }, otherSubtypeDiscoveryRecord)
+ nsdManager.discoverServices("_subtype.$serviceType",
+ NsdManager.PROTOCOL_DNS_SD,
+ testNetwork1.network, Executor { it.run() }, subtypeDiscoveryRecord)
+
+ subtypeDiscoveryRecord.waitForServiceDiscovered(
+ serviceName, serviceType, testNetwork1.network)
+ baseTypeDiscoveryRecord.waitForServiceDiscovered(
+ serviceName, serviceType, testNetwork1.network)
+ otherSubtypeDiscoveryRecord.expectCallback<DiscoveryStarted>()
+ // The subtype callback was registered later but called, no need for an extra delay
+ otherSubtypeDiscoveryRecord.assertNoCallback(timeoutMs = 0)
+ } cleanupStep {
+ nsdManager.stopServiceDiscovery(baseTypeDiscoveryRecord)
+ nsdManager.stopServiceDiscovery(subtypeDiscoveryRecord)
+ nsdManager.stopServiceDiscovery(otherSubtypeDiscoveryRecord)
+
+ baseTypeDiscoveryRecord.expectCallback<DiscoveryStopped>()
+ subtypeDiscoveryRecord.expectCallback<DiscoveryStopped>()
+ otherSubtypeDiscoveryRecord.expectCallback<DiscoveryStopped>()
+ } cleanup {
+ nsdManager.unregisterService(registrationRecord)
+ }
+ }
+
/**
* Register a service and return its registration record.
*/
diff --git a/tests/cts/net/src/android/net/cts/PacProxyManagerTest.java b/tests/cts/net/src/android/net/cts/PacProxyManagerTest.java
index f0c87673..b462f71 100644
--- a/tests/cts/net/src/android/net/cts/PacProxyManagerTest.java
+++ b/tests/cts/net/src/android/net/cts/PacProxyManagerTest.java
@@ -23,12 +23,14 @@
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
+import static org.junit.Assume.assumeTrue;
import android.app.Instrumentation;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
+import android.content.pm.PackageManager;
import android.net.ConnectivityManager;
import android.net.Network;
import android.net.PacProxyManager;
@@ -42,12 +44,15 @@
import androidx.test.InstrumentationRegistry;
+import com.android.compatibility.common.util.RequiredFeatureRule;
+
import com.android.testutils.DevSdkIgnoreRule.IgnoreUpTo;
import com.android.testutils.DevSdkIgnoreRunner;
import com.android.testutils.TestHttpServer;
import org.junit.After;
import org.junit.Before;
+import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -74,6 +79,11 @@
private ServerSocket mServerSocket;
private Instrumentation mInstrumentation;
+ // Devices without WebView/JavaScript cannot support PAC proxies.
+ @Rule
+ public RequiredFeatureRule mRequiredWebviewFeatureRule =
+ new RequiredFeatureRule(PackageManager.FEATURE_WEBVIEW);
+
private static final String PAC_FILE = "function FindProxyForURL(url, host)"
+ "{"
+ " return \"PROXY 192.168.0.1:9091\";"
diff --git a/tests/cts/net/src/android/net/cts/RateLimitTest.java b/tests/cts/net/src/android/net/cts/RateLimitTest.java
index 36b98fc..5c93738 100644
--- a/tests/cts/net/src/android/net/cts/RateLimitTest.java
+++ b/tests/cts/net/src/android/net/cts/RateLimitTest.java
@@ -36,6 +36,7 @@
import android.icu.text.MessageFormat;
import android.net.ConnectivityManager;
import android.net.ConnectivitySettingsManager;
+import android.net.ConnectivityThread;
import android.net.InetAddresses;
import android.net.IpPrefix;
import android.net.LinkAddress;
@@ -189,7 +190,19 @@
// whatever happens, don't leave the device in rate limited state.
ConnectivitySettingsManager.setIngressRateLimitInBytesPerSecond(mContext, -1);
}
- if (mSocket != null) mSocket.close();
+ if (mSocket == null) {
+ // HACK(b/272147742): dump ConnectivityThread if test initialization failed.
+ final StackTraceElement[] elements = ConnectivityThread.get().getStackTrace();
+ final StringBuilder sb = new StringBuilder();
+ // Skip first element as it includes the invocation of getStackTrace()
+ for (int i = 1; i < elements.length; i++) {
+ sb.append(elements[i]);
+ sb.append("\n");
+ }
+ Log.e(TAG, sb.toString());
+ } else {
+ mSocket.close();
+ }
if (mNetworkAgent != null) mNetworkAgent.unregister();
if (mTunInterface != null) mTunInterface.getFileDescriptor().close();
if (mCm != null) mCm.unregisterNetworkCallback(mNetworkCallback);
diff --git a/tests/cts/net/src/android/net/cts/SSLCertificateSocketFactoryTest.java b/tests/cts/net/src/android/net/cts/SSLCertificateSocketFactoryTest.java
index cbe54f8..1a780a7 100644
--- a/tests/cts/net/src/android/net/cts/SSLCertificateSocketFactoryTest.java
+++ b/tests/cts/net/src/android/net/cts/SSLCertificateSocketFactoryTest.java
@@ -66,7 +66,6 @@
InetAddress[] addresses;
try {
addresses = InetAddress.getAllByName(TEST_HOST);
- mTestHostAddress = addresses[0];
} catch (UnknownHostException uhe) {
throw new AssertionError(
"Unable to test SSLCertificateSocketFactory: cannot resolve " + TEST_HOST, uhe);
@@ -76,10 +75,11 @@
.map(addr -> new InetSocketAddress(addr, HTTPS_PORT))
.collect(Collectors.toList());
- // Find the local IP address which will be used to connect to TEST_HOST.
+ // Find the local and remote IP addresses which will be used to connect to TEST_HOST.
try {
Socket testSocket = new Socket(TEST_HOST, HTTPS_PORT);
mLocalAddress = testSocket.getLocalAddress();
+ mTestHostAddress = testSocket.getInetAddress();
testSocket.close();
} catch (IOException ioe) {
throw new AssertionError(""
diff --git a/tests/cts/net/src/android/net/cts/TrafficStatsTest.java b/tests/cts/net/src/android/net/cts/TrafficStatsTest.java
index 1d9268a..bd9e03c 100755
--- a/tests/cts/net/src/android/net/cts/TrafficStatsTest.java
+++ b/tests/cts/net/src/android/net/cts/TrafficStatsTest.java
@@ -37,6 +37,9 @@
/** Verify the given value is in range [lower, upper] */
private void assertInRange(String tag, long value, long lower, long upper) {
+ if (lower > upper) {
+ fail("lower must be less than or equal to upper: [" + lower + "," + upper + "]");
+ }
final Range range = new Range(lower, upper);
assertTrue(tag + ": " + value + " is not within range [" + lower + ", " + upper + "]",
range.contains(value));
diff --git a/tests/cts/net/src/android/net/cts/TunUtils.java b/tests/cts/net/src/android/net/cts/TunUtils.java
index 0377160..268d8d2 100644
--- a/tests/cts/net/src/android/net/cts/TunUtils.java
+++ b/tests/cts/net/src/android/net/cts/TunUtils.java
@@ -22,7 +22,6 @@
import static android.net.cts.PacketUtils.UDP_HDRLEN;
import static android.system.OsConstants.IPPROTO_UDP;
-import static org.junit.Assert.assertEquals;
import static org.junit.Assert.fail;
import android.os.ParcelFileDescriptor;
@@ -32,6 +31,7 @@
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
+import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
@@ -140,10 +140,8 @@
public byte[] awaitEspPacketNoPlaintext(
int spi, byte[] plaintext, boolean useEncap, int expectedPacketSize) throws Exception {
final byte[] espPkt = awaitPacket(
- (pkt) -> isEspFailIfSpecifiedPlaintextFound(pkt, spi, useEncap, plaintext));
-
- // Validate packet size
- assertEquals(expectedPacketSize, espPkt.length);
+ (pkt) -> expectedPacketSize == pkt.length
+ && isEspFailIfSpecifiedPlaintextFound(pkt, spi, useEncap, plaintext));
return espPkt; // We've found the packet we're looking for.
}
@@ -153,11 +151,11 @@
}
private static boolean isSpiEqual(byte[] pkt, int espOffset, int spi) {
- // Check SPI byte by byte.
- return pkt[espOffset] == (byte) ((spi >>> 24) & 0xff)
- && pkt[espOffset + 1] == (byte) ((spi >>> 16) & 0xff)
- && pkt[espOffset + 2] == (byte) ((spi >>> 8) & 0xff)
- && pkt[espOffset + 3] == (byte) (spi & 0xff);
+ ByteBuffer buffer = ByteBuffer.wrap(pkt);
+ buffer.get(new byte[espOffset]); // Skip IP, UDP header
+ int actualSpi = buffer.getInt();
+
+ return actualSpi == spi;
}
/**
@@ -180,8 +178,13 @@
private static boolean isEsp(byte[] pkt, int spi, boolean encap) {
if (isIpv6(pkt)) {
- // IPv6 UDP encap not supported by kernels; assume non-encap.
- return pkt[IP6_PROTO_OFFSET] == IPPROTO_ESP && isSpiEqual(pkt, IP6_HDRLEN, spi);
+ if (encap) {
+ return pkt[IP6_PROTO_OFFSET] == IPPROTO_UDP
+ && isSpiEqual(pkt, IP6_HDRLEN + UDP_HDRLEN, spi);
+ } else {
+ return pkt[IP6_PROTO_OFFSET] == IPPROTO_ESP && isSpiEqual(pkt, IP6_HDRLEN, spi);
+ }
+
} else {
// Use default IPv4 header length (assuming no options)
if (encap) {
diff --git a/tests/cts/net/util/java/android/net/cts/util/CtsNetUtils.java b/tests/cts/net/util/java/android/net/cts/util/CtsNetUtils.java
index df3a4aa..21f1358 100644
--- a/tests/cts/net/util/java/android/net/cts/util/CtsNetUtils.java
+++ b/tests/cts/net/util/java/android/net/cts/util/CtsNetUtils.java
@@ -57,6 +57,8 @@
import android.text.TextUtils;
import android.util.Log;
+import androidx.annotation.Nullable;
+
import com.android.compatibility.common.util.PollingCheck;
import com.android.compatibility.common.util.ShellIdentityUtils;
import com.android.compatibility.common.util.SystemUtil;
@@ -68,6 +70,8 @@
import java.io.OutputStream;
import java.net.InetSocketAddress;
import java.net.Socket;
+import java.util.ArrayList;
+import java.util.Objects;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
@@ -75,7 +79,14 @@
public final class CtsNetUtils {
private static final String TAG = CtsNetUtils.class.getSimpleName();
- private static final int SOCKET_TIMEOUT_MS = 2000;
+
+ // Redefine this flag here so that IPsec code shipped in a mainline module can build on old
+ // platforms before FEATURE_IPSEC_TUNNEL_MIGRATION API is released.
+ // TODO: b/275378783 Remove this flag and use the platform API when it is available.
+ private static final String FEATURE_IPSEC_TUNNEL_MIGRATION =
+ "android.software.ipsec_tunnel_migration";
+
+ private static final int SOCKET_TIMEOUT_MS = 10_000;
private static final int PRIVATE_DNS_PROBE_MS = 1_000;
private static final int PRIVATE_DNS_SETTING_TIMEOUT_MS = 10_000;
@@ -115,6 +126,11 @@
|| getFirstApiLevel() >= Build.VERSION_CODES.Q;
}
+ /** Checks if FEATURE_IPSEC_TUNNEL_MIGRATION is enabled on the device */
+ public boolean hasIpsecTunnelMigrateFeature() {
+ return mContext.getPackageManager().hasSystemFeature(FEATURE_IPSEC_TUNNEL_MIGRATION);
+ }
+
/**
* Sets the given appop using shell commands
*
@@ -410,7 +426,7 @@
.build();
}
- private void testHttpRequest(Socket s) throws IOException {
+ public void testHttpRequest(Socket s) throws IOException {
OutputStream out = s.getOutputStream();
InputStream in = s.getInputStream();
@@ -418,7 +434,9 @@
byte[] responseBytes = new byte[4096];
out.write(requestBytes);
in.read(responseBytes);
- assertTrue(new String(responseBytes, "UTF-8").startsWith("HTTP/1.0 204 No Content\r\n"));
+ final String response = new String(responseBytes, "UTF-8");
+ assertTrue("Received unexpected response: " + response,
+ response.startsWith("HTTP/1.0 204 No Content\r\n"));
}
private Socket getBoundSocket(Network network, String host, int port) throws IOException {
@@ -494,17 +512,18 @@
* @throws InterruptedException If the thread is interrupted.
*/
public void awaitPrivateDnsSetting(@NonNull String msg, @NonNull Network network,
- @NonNull String server, boolean requiresValidatedServer) throws InterruptedException {
+ @Nullable String server, boolean requiresValidatedServer) throws InterruptedException {
final CountDownLatch latch = new CountDownLatch(1);
final NetworkRequest request = new NetworkRequest.Builder().clearCapabilities().build();
- NetworkCallback callback = new NetworkCallback() {
+ final NetworkCallback callback = new NetworkCallback() {
@Override
public void onLinkPropertiesChanged(Network n, LinkProperties lp) {
Log.i(TAG, "Link properties of network " + n + " changed to " + lp);
if (requiresValidatedServer && lp.getValidatedPrivateDnsServers().isEmpty()) {
return;
}
- if (network.equals(n) && server.equals(lp.getPrivateDnsServerName())) {
+ Log.i(TAG, "Set private DNS server to " + server);
+ if (network.equals(n) && Objects.equals(server, lp.getPrivateDnsServerName())) {
latch.countDown();
}
}
@@ -527,6 +546,27 @@
}
/**
+ * Get all testable Networks with internet capability.
+ */
+ public Network[] getTestableNetworks() {
+ final ArrayList<Network> testableNetworks = new ArrayList<Network>();
+ for (Network network : mCm.getAllNetworks()) {
+ final NetworkCapabilities nc = mCm.getNetworkCapabilities(network);
+ if (nc != null
+ && nc.hasCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED)
+ && nc.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)) {
+ testableNetworks.add(network);
+ }
+ }
+
+ assertTrue("This test requires that at least one public Internet-providing"
+ + " network be connected. Please ensure that the device is connected to"
+ + " a network.",
+ testableNetworks.size() >= 1);
+ return testableNetworks.toArray(new Network[0]);
+ }
+
+ /**
* Receiver that captures the last connectivity change's network type and state. Recognizes
* both {@code CONNECTIVITY_ACTION} and {@code NETWORK_CALLBACK_ACTION} intents.
*/
diff --git a/tests/cts/netpermission/internetpermission/Android.bp b/tests/cts/netpermission/internetpermission/Android.bp
index 37ad7cb..5314396 100644
--- a/tests/cts/netpermission/internetpermission/Android.bp
+++ b/tests/cts/netpermission/internetpermission/Android.bp
@@ -29,5 +29,5 @@
"cts",
"general-tests",
],
-
+ host_required: ["net-tests-utils-host-common"],
}
diff --git a/tests/cts/netpermission/internetpermission/AndroidTest.xml b/tests/cts/netpermission/internetpermission/AndroidTest.xml
index 3b23e72..e326844 100644
--- a/tests/cts/netpermission/internetpermission/AndroidTest.xml
+++ b/tests/cts/netpermission/internetpermission/AndroidTest.xml
@@ -24,6 +24,8 @@
<option name="cleanup-apks" value="true" />
<option name="test-file-name" value="CtsNetTestCasesInternetPermission.apk" />
</target_preparer>
+ <target_preparer class="com.android.testutils.ConnectivityTestTargetPreparer">
+ </target_preparer>
<test class="com.android.tradefed.testtype.AndroidJUnitTest" >
<option name="package" value="android.networkpermission.internetpermission.cts" />
<option name="runtime-hint" value="10s" />
diff --git a/tests/cts/netpermission/updatestatspermission/Android.bp b/tests/cts/netpermission/updatestatspermission/Android.bp
index 7a24886..40474db 100644
--- a/tests/cts/netpermission/updatestatspermission/Android.bp
+++ b/tests/cts/netpermission/updatestatspermission/Android.bp
@@ -29,5 +29,5 @@
"cts",
"general-tests",
],
-
+ host_required: ["net-tests-utils-host-common"],
}
diff --git a/tests/cts/netpermission/updatestatspermission/AndroidTest.xml b/tests/cts/netpermission/updatestatspermission/AndroidTest.xml
index c47cad9..a1019fa 100644
--- a/tests/cts/netpermission/updatestatspermission/AndroidTest.xml
+++ b/tests/cts/netpermission/updatestatspermission/AndroidTest.xml
@@ -24,6 +24,8 @@
<option name="cleanup-apks" value="true" />
<option name="test-file-name" value="CtsNetTestCasesUpdateStatsPermission.apk" />
</target_preparer>
+ <target_preparer class="com.android.testutils.ConnectivityTestTargetPreparer">
+ </target_preparer>
<test class="com.android.tradefed.testtype.AndroidJUnitTest" >
<option name="package" value="android.networkpermission.updatestatspermission.cts" />
<option name="runtime-hint" value="10s" />
diff --git a/tests/cts/tethering/Android.bp b/tests/cts/tethering/Android.bp
index 42949a4..4284f56 100644
--- a/tests/cts/tethering/Android.bp
+++ b/tests/cts/tethering/Android.bp
@@ -46,6 +46,7 @@
// Change to system current when TetheringManager move to bootclass path.
platform_apis: true,
+ host_required: ["net-tests-utils-host-common"],
}
// Tethering CTS tests that target the latest released SDK. These tests can be installed on release
diff --git a/tests/cts/tethering/AndroidTestTemplate.xml b/tests/cts/tethering/AndroidTestTemplate.xml
index 491b004..dd5b23e 100644
--- a/tests/cts/tethering/AndroidTestTemplate.xml
+++ b/tests/cts/tethering/AndroidTestTemplate.xml
@@ -20,11 +20,14 @@
<option name="config-descriptor:metadata" key="parameter" value="not_instant_app" />
<option name="config-descriptor:metadata" key="parameter" value="not_multi_abi" />
<option name="config-descriptor:metadata" key="parameter" value="secondary_user" />
+ <option name="config-descriptor:metadata" key="mainline-param" value="CaptivePortalLoginGoogle.apk+NetworkStackGoogle.apk+com.google.android.resolv.apex+com.google.android.tethering.apex" />
<option name="not-shardable" value="true" />
<target_preparer class="com.android.tradefed.targetprep.suite.SuiteApkInstaller">
<option name="cleanup-apks" value="true" />
<option name="test-file-name" value="{MODULE}.apk" />
</target_preparer>
+ <target_preparer class="com.android.testutils.ConnectivityTestTargetPreparer">
+ </target_preparer>
<test class="com.android.tradefed.testtype.AndroidJUnitTest" >
<option name="package" value="android.tethering.cts" />
</test>
diff --git a/tests/integration/Android.bp b/tests/integration/Android.bp
index e3d80a0..12919ae 100644
--- a/tests/integration/Android.bp
+++ b/tests/integration/Android.bp
@@ -21,7 +21,10 @@
android_test {
name: "FrameworksNetIntegrationTests",
- defaults: ["framework-connectivity-internal-test-defaults"],
+ defaults: [
+ "framework-connectivity-internal-test-defaults",
+ "NetworkStackApiShimSettingsForCurrentBranch",
+ ],
platform_apis: true,
certificate: "platform",
srcs: [
@@ -33,6 +36,13 @@
"ServiceConnectivityResources",
],
static_libs: [
+ // It does not matter if NetworkStackApiStableLib or NetworkStackApiCurrentLib is used here,
+ // since the shims for the branch are already included via
+ // NetworkStackApiShimSettingsForCurrentBranch, and will be used in priority as they are
+ // first in the classpath.
+ // If the wrong shims are used for some reason, tests that use newer APIs fail.
+ // TODO: have NetworkStackApiStableLib link dynamically against the shims to remove this
+ // order-dependent setup.
"NetworkStackApiStableLib",
"androidx.test.ext.junit",
"frameworks-net-integration-testutils",
diff --git a/tests/integration/OWNERS b/tests/integration/OWNERS
new file mode 100644
index 0000000..3101da5
--- /dev/null
+++ b/tests/integration/OWNERS
@@ -0,0 +1,2 @@
+# Bug template url: http://b/new?component=31808
+# TODO: move bug template config to common owners file once b/226427845 is resolved
\ No newline at end of file
diff --git a/tests/integration/src/com/android/server/net/integrationtests/ConnectivityServiceIntegrationTest.kt b/tests/integration/src/com/android/server/net/integrationtests/ConnectivityServiceIntegrationTest.kt
index 3c1340d..67e1296 100644
--- a/tests/integration/src/com/android/server/net/integrationtests/ConnectivityServiceIntegrationTest.kt
+++ b/tests/integration/src/com/android/server/net/integrationtests/ConnectivityServiceIntegrationTest.kt
@@ -25,7 +25,6 @@
import android.content.ServiceConnection
import android.content.res.Resources
import android.net.ConnectivityManager
-import android.net.ConnectivityResources
import android.net.IDnsResolver
import android.net.INetd
import android.net.LinkProperties
@@ -50,11 +49,15 @@
import com.android.server.ConnectivityService
import com.android.server.NetworkAgentWrapper
import com.android.server.TestNetIdManager
+import com.android.server.connectivity.ConnectivityResources
import com.android.server.connectivity.MockableSystemProperties
import com.android.server.connectivity.MultinetworkPolicyTracker
import com.android.server.connectivity.ProxyTracker
import com.android.testutils.RecorderCallback.CallbackEntry.LinkPropertiesChanged
import com.android.testutils.TestableNetworkCallback
+import kotlin.test.assertEquals
+import kotlin.test.assertTrue
+import kotlin.test.fail
import org.junit.After
import org.junit.Before
import org.junit.BeforeClass
@@ -73,9 +76,6 @@
import org.mockito.Mockito.spy
import org.mockito.MockitoAnnotations
import org.mockito.Spy
-import kotlin.test.assertEquals
-import kotlin.test.assertTrue
-import kotlin.test.fail
const val SERVICE_BIND_TIMEOUT_MS = 5_000L
const val TEST_TIMEOUT_MS = 10_000L
@@ -215,8 +215,8 @@
inv.getArgument(2),
object : MultinetworkPolicyTracker.Dependencies() {
override fun getResourcesForActiveSubId(
- connResources: ConnectivityResources,
- activeSubId: Int
+ connResources: ConnectivityResources,
+ activeSubId: Int
) = resources
})
}.`when`(deps).makeMultinetworkPolicyTracker(any(), any(), any())
diff --git a/tests/mts/Android.bp b/tests/mts/Android.bp
index 74fee3d..6425223 100644
--- a/tests/mts/Android.bp
+++ b/tests/mts/Android.bp
@@ -38,5 +38,5 @@
"bpf_existence_test.cpp",
],
compile_multilib: "first",
- min_sdk_version: "29", // Ensure test runs on Q and above.
+ min_sdk_version: "30", // Ensure test runs on R and above.
}
diff --git a/tests/mts/OWNERS b/tests/mts/OWNERS
new file mode 100644
index 0000000..3101da5
--- /dev/null
+++ b/tests/mts/OWNERS
@@ -0,0 +1,2 @@
+# Bug template url: http://b/new?component=31808
+# TODO: move bug template config to common owners file once b/226427845 is resolved
\ No newline at end of file
diff --git a/tests/native/connectivity_native_test/OWNERS b/tests/native/connectivity_native_test/OWNERS
index 8dfa455..fbfcf92 100644
--- a/tests/native/connectivity_native_test/OWNERS
+++ b/tests/native/connectivity_native_test/OWNERS
@@ -1,3 +1,4 @@
-# Bug component: 31808
+# Bug template url: http://b/new?component=31808
+# TODO: move bug template config to common owners file once b/226427845 is resolved
set noparent
file:platform/packages/modules/Connectivity:master:/OWNERS_core_networking_xts
diff --git a/tests/unit/Android.bp b/tests/unit/Android.bp
index 36b3356..8b286a0 100644
--- a/tests/unit/Android.bp
+++ b/tests/unit/Android.bp
@@ -26,7 +26,6 @@
"libandroid_net_frameworktests_util_jni",
"libbase",
"libbinder",
- "libbpf_bcc",
"libc++",
"libcrypto",
"libcutils",
diff --git a/tests/unit/OWNERS b/tests/unit/OWNERS
new file mode 100644
index 0000000..3101da5
--- /dev/null
+++ b/tests/unit/OWNERS
@@ -0,0 +1,2 @@
+# Bug template url: http://b/new?component=31808
+# TODO: move bug template config to common owners file once b/226427845 is resolved
\ No newline at end of file
diff --git a/tests/unit/java/android/net/KeepalivePacketDataUtilTest.java b/tests/unit/java/android/net/KeepalivePacketDataUtilTest.java
index 6afa4e9..7e245dc 100644
--- a/tests/unit/java/android/net/KeepalivePacketDataUtilTest.java
+++ b/tests/unit/java/android/net/KeepalivePacketDataUtilTest.java
@@ -168,12 +168,6 @@
assertEquals(resultData.rcvWndScale, wndScale);
assertEquals(resultData.tos, tos);
assertEquals(resultData.ttl, ttl);
-
- final String expected = TcpKeepalivePacketDataParcelable.class.getName()
- + "{srcAddress: [10, 0, 0, 1],"
- + " srcPort: 1234, dstAddress: [10, 0, 0, 5], dstPort: 4321, seq: 286331153,"
- + " ack: 572662306, rcvWnd: 48000, rcvWndScale: 2, tos: 4, ttl: 64}";
- assertEquals(expected, resultData.toString());
}
@Test
diff --git a/tests/unit/java/android/net/NetworkStatsAccessTest.java b/tests/unit/java/android/net/NetworkStatsAccessTest.java
index a74056b..8b86211 100644
--- a/tests/unit/java/android/net/NetworkStatsAccessTest.java
+++ b/tests/unit/java/android/net/NetworkStatsAccessTest.java
@@ -78,6 +78,7 @@
setHasAppOpsPermission(AppOpsManager.MODE_DEFAULT, false);
setHasReadHistoryPermission(false);
setHasNetworkStackPermission(false);
+ setHasMainlineNetworkStackPermission(false);
}
@After
@@ -154,6 +155,10 @@
setHasNetworkStackPermission(false);
assertEquals(NetworkStatsAccess.Level.DEFAULT,
NetworkStatsAccess.checkAccessLevel(mContext, TEST_PID, TEST_UID, TEST_PKG));
+
+ setHasMainlineNetworkStackPermission(true);
+ assertEquals(NetworkStatsAccess.Level.DEVICE,
+ NetworkStatsAccess.checkAccessLevel(mContext, TEST_PID, TEST_UID, TEST_PKG));
}
private void setHasCarrierPrivileges(boolean hasPrivileges) {
@@ -189,4 +194,10 @@
TEST_PID, TEST_UID)).thenReturn(hasPermission ? PackageManager.PERMISSION_GRANTED
: PackageManager.PERMISSION_DENIED);
}
+
+ private void setHasMainlineNetworkStackPermission(boolean hasPermission) {
+ when(mContext.checkPermission(NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK,
+ TEST_PID, TEST_UID)).thenReturn(hasPermission ? PackageManager.PERMISSION_GRANTED
+ : PackageManager.PERMISSION_DENIED);
+ }
}
diff --git a/tests/unit/java/android/net/NetworkTemplateTest.kt b/tests/unit/java/android/net/NetworkTemplateTest.kt
index edbcea9..2f6c76b 100644
--- a/tests/unit/java/android/net/NetworkTemplateTest.kt
+++ b/tests/unit/java/android/net/NetworkTemplateTest.kt
@@ -50,16 +50,17 @@
import com.android.testutils.DevSdkIgnoreRule
import com.android.testutils.DevSdkIgnoreRunner
import com.android.testutils.assertParcelSane
+import kotlin.test.assertEquals
+import kotlin.test.assertFalse
+import kotlin.test.assertNotEquals
+import kotlin.test.assertTrue
import org.junit.Before
+import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.Mockito.mock
import org.mockito.Mockito.`when`
import org.mockito.MockitoAnnotations
-import kotlin.test.assertEquals
-import kotlin.test.assertFalse
-import kotlin.test.assertNotEquals
-import kotlin.test.assertTrue
private const val TEST_IMSI1 = "imsi1"
private const val TEST_IMSI2 = "imsi2"
@@ -70,6 +71,8 @@
@RunWith(DevSdkIgnoreRunner::class)
@DevSdkIgnoreRule.IgnoreUpTo(Build.VERSION_CODES.S_V2)
class NetworkTemplateTest {
+ @get:Rule
+ val ignoreRule = DevSdkIgnoreRule()
private val mockContext = mock(Context::class.java)
private val mockWifiInfo = mock(WifiInfo::class.java)
@@ -130,10 +133,17 @@
mockContext, buildWifiNetworkState(null, TEST_WIFI_KEY1), true, 0)
val identWifiImsi1Key1 = buildNetworkIdentity(
mockContext, buildWifiNetworkState(TEST_IMSI1, TEST_WIFI_KEY1), true, 0)
+ // This identity with a null wifiNetworkKey is to test matchesWifiNetworkKey won't crash
+ // the system when a null wifiNetworkKey is provided, which happens because of a bug in wifi
+ // and it should still match the wifi wildcard template. See b/266598304.
+ val identWifiNullKey = buildNetworkIdentity(
+ mockContext, buildWifiNetworkState(null /* subscriberId */,
+ null /* wifiNetworkKey */), true, 0)
templateWifiWildcard.assertDoesNotMatch(identMobileImsi1)
templateWifiWildcard.assertMatches(identWifiImsiNullKey1)
templateWifiWildcard.assertMatches(identWifiImsi1Key1)
+ templateWifiWildcard.assertMatches(identWifiNullKey)
}
@Test
@@ -148,6 +158,9 @@
.setWifiNetworkKeys(setOf(TEST_WIFI_KEY1)).build()
val templateWifiKeyAllImsi1 = NetworkTemplate.Builder(MATCH_WIFI)
.setSubscriberIds(setOf(TEST_IMSI1)).build()
+ val templateNullWifiKey = NetworkTemplate(MATCH_WIFI,
+ emptyArray<String>() /* subscriberIds */, arrayOf(null) /* wifiNetworkKeys */,
+ METERED_ALL, ROAMING_ALL, DEFAULT_NETWORK_ALL, NETWORK_TYPE_ALL, OEM_MANAGED_ALL)
val identMobile1 = buildNetworkIdentity(mockContext, buildMobileNetworkState(TEST_IMSI1),
false, TelephonyManager.NETWORK_TYPE_UMTS)
@@ -159,6 +172,12 @@
mockContext, buildWifiNetworkState(TEST_IMSI2, TEST_WIFI_KEY1), true, 0)
val identWifiImsi1Key2 = buildNetworkIdentity(
mockContext, buildWifiNetworkState(TEST_IMSI1, TEST_WIFI_KEY2), true, 0)
+ // This identity with a null wifiNetworkKey is to test the matchesWifiNetworkKey won't crash
+ // the system when a null wifiNetworkKey is provided, which would happen in some unknown
+ // cases, see b/266598304.
+ val identWifiNullKey = buildNetworkIdentity(
+ mockContext, buildWifiNetworkState(null /* subscriberId */,
+ null /* wifiNetworkKey */), true, 0)
// Verify that template with WiFi Network Key only matches any subscriberId and
// specific WiFi Network Key.
@@ -191,6 +210,24 @@
templateWifiKeyAllImsi1.assertMatches(identWifiImsi1Key1)
templateWifiKeyAllImsi1.assertDoesNotMatch(identWifiImsi2Key1)
templateWifiKeyAllImsi1.assertMatches(identWifiImsi1Key2)
+
+ // Test a network identity with null wifiNetworkKey won't crash.
+ // It should not match a template with wifiNetworkKeys is non-null.
+ // Also, it should not match a template with wifiNetworkKeys that contains null.
+ templateWifiKey1.assertDoesNotMatch(identWifiNullKey)
+ templateNullWifiKey.assertDoesNotMatch(identWifiNullKey)
+ }
+
+ @DevSdkIgnoreRule.IgnoreAfter(Build.VERSION_CODES.TIRAMISU)
+ @Test
+ fun testBuildTemplateMobileAll_nullSubscriberId() {
+ val templateMobileAllWithNullImsi = buildTemplateMobileAll(null)
+ val setWithNull = HashSet<String?>().apply {
+ add(null)
+ }
+ val templateFromBuilder = NetworkTemplate.Builder(MATCH_MOBILE).setMeteredness(METERED_YES)
+ .setSubscriberIds(setWithNull).build()
+ assertEquals(templateFromBuilder, templateMobileAllWithNullImsi)
}
@Test
diff --git a/tests/unit/java/android/net/nsd/NsdManagerTest.java b/tests/unit/java/android/net/nsd/NsdManagerTest.java
index da65b62..0965193 100644
--- a/tests/unit/java/android/net/nsd/NsdManagerTest.java
+++ b/tests/unit/java/android/net/nsd/NsdManagerTest.java
@@ -21,6 +21,7 @@
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.fail;
+import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.Mockito.any;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
@@ -73,11 +74,11 @@
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
- doReturn(mServiceConn).when(mService).connect(any());
+ doReturn(mServiceConn).when(mService).connect(any(), anyBoolean());
mManager = new NsdManager(mContext, mService);
final ArgumentCaptor<INsdManagerCallback> cbCaptor = ArgumentCaptor.forClass(
INsdManagerCallback.class);
- verify(mService).connect(cbCaptor.capture());
+ verify(mService).connect(cbCaptor.capture(), anyBoolean());
mCallback = cbCaptor.getValue();
}
diff --git a/tests/unit/java/android/net/util/KeepaliveUtilsTest.kt b/tests/unit/java/android/net/util/KeepaliveUtilsTest.kt
index cca0b66..cb3a315 100644
--- a/tests/unit/java/android/net/util/KeepaliveUtilsTest.kt
+++ b/tests/unit/java/android/net/util/KeepaliveUtilsTest.kt
@@ -18,7 +18,6 @@
import android.content.Context
import android.content.res.Resources
-import android.net.ConnectivityResources
import android.net.NetworkCapabilities
import android.net.NetworkCapabilities.MAX_TRANSPORT
import android.net.NetworkCapabilities.TRANSPORT_CELLULAR
@@ -27,7 +26,9 @@
import android.net.NetworkCapabilities.TRANSPORT_WIFI
import android.os.Build
import androidx.test.filters.SmallTest
-import com.android.internal.R
+import com.android.connectivity.resources.R
+import com.android.server.connectivity.ConnectivityResources
+import com.android.server.connectivity.KeepaliveResourceUtil
import com.android.testutils.DevSdkIgnoreRule
import com.android.testutils.DevSdkIgnoreRunner
import org.junit.After
@@ -37,7 +38,6 @@
import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.ArgumentMatchers.eq
-import org.mockito.Mockito.any
import org.mockito.Mockito.doReturn
import org.mockito.Mockito.mock
@@ -53,14 +53,9 @@
class KeepaliveUtilsTest {
// Prepare mocked context with given resource strings.
- private fun getMockedContextWithStringArrayRes(
- id: Int,
- name: String,
- res: Array<out String?>?
- ): Context {
+ private fun getMockedContextWithStringArrayRes(id: Int, res: Array<out String?>?): Context {
val mockRes = mock(Resources::class.java)
doReturn(res).`when`(mockRes).getStringArray(eq(id))
- doReturn(id).`when`(mockRes).getIdentifier(eq(name), any(), any())
return mock(Context::class.java).apply {
doReturn(mockRes).`when`(this).getResources()
@@ -79,10 +74,10 @@
try {
val mockContext = getMockedContextWithStringArrayRes(
R.array.config_networkSupportedKeepaliveCount,
- "config_networkSupportedKeepaliveCount", res)
- KeepaliveUtils.getSupportedKeepalives(mockContext)
+ res)
+ KeepaliveResourceUtil.getSupportedKeepalives(mockContext)
fail("Expected KeepaliveDeviceConfigurationException")
- } catch (expected: KeepaliveUtils.KeepaliveDeviceConfigurationException) {
+ } catch (expected: KeepaliveResourceUtil.KeepaliveDeviceConfigurationException) {
}
}
@@ -108,8 +103,8 @@
val mockContext = getMockedContextWithStringArrayRes(
R.array.config_networkSupportedKeepaliveCount,
- "config_networkSupportedKeepaliveCount", validRes)
- val actual = KeepaliveUtils.getSupportedKeepalives(mockContext)
+ validRes)
+ val actual = KeepaliveResourceUtil.getSupportedKeepalives(mockContext)
assertArrayEquals(expectedValidRes, actual)
}
diff --git a/tests/unit/java/com/android/server/BpfNetMapsTest.java b/tests/unit/java/com/android/server/BpfNetMapsTest.java
index d189848..19fa41d 100644
--- a/tests/unit/java/com/android/server/BpfNetMapsTest.java
+++ b/tests/unit/java/com/android/server/BpfNetMapsTest.java
@@ -66,6 +66,7 @@
import android.os.Build;
import android.os.ServiceSpecificException;
import android.system.ErrnoException;
+import android.util.ArraySet;
import android.util.IndentingPrintWriter;
import androidx.test.filters.SmallTest;
@@ -1151,4 +1152,33 @@
mCookieTagMap.updateEntry(new CookieTagMapKey(123), new CookieTagMapValue(456, 0x789));
assertDumpContains(getDump(), "cookie=123 tag=0x789 uid=456");
}
+
+ @Test
+ public void testGetUids() throws ErrnoException {
+ final int uid0 = TEST_UIDS[0];
+ final int uid1 = TEST_UIDS[1];
+ final long match0 = DOZABLE_MATCH | POWERSAVE_MATCH;
+ final long match1 = DOZABLE_MATCH | STANDBY_MATCH;
+ mUidOwnerMap.updateEntry(new S32(uid0), new UidOwnerValue(NULL_IIF, match0));
+ mUidOwnerMap.updateEntry(new S32(uid1), new UidOwnerValue(NULL_IIF, match1));
+
+ assertEquals(new ArraySet<>(List.of(uid0, uid1)),
+ mBpfNetMaps.getUidsWithAllowRuleOnAllowListChain(FIREWALL_CHAIN_DOZABLE));
+ assertEquals(new ArraySet<>(List.of(uid0)),
+ mBpfNetMaps.getUidsWithAllowRuleOnAllowListChain(FIREWALL_CHAIN_POWERSAVE));
+
+ assertEquals(new ArraySet<>(List.of(uid1)),
+ mBpfNetMaps.getUidsWithDenyRuleOnDenyListChain(FIREWALL_CHAIN_STANDBY));
+ assertEquals(new ArraySet<>(),
+ mBpfNetMaps.getUidsWithDenyRuleOnDenyListChain(FIREWALL_CHAIN_OEM_DENY_1));
+ }
+
+ @Test
+ public void testGetUidsIllegalArgument() {
+ final Class<IllegalArgumentException> expected = IllegalArgumentException.class;
+ assertThrows(expected,
+ () -> mBpfNetMaps.getUidsWithDenyRuleOnDenyListChain(FIREWALL_CHAIN_DOZABLE));
+ assertThrows(expected,
+ () -> mBpfNetMaps.getUidsWithAllowRuleOnAllowListChain(FIREWALL_CHAIN_OEM_DENY_1));
+ }
}
diff --git a/tests/unit/java/com/android/server/ConnectivityServiceTest.java b/tests/unit/java/com/android/server/ConnectivityServiceTest.java
index 1a358b2..9406edd 100755
--- a/tests/unit/java/com/android/server/ConnectivityServiceTest.java
+++ b/tests/unit/java/com/android/server/ConnectivityServiceTest.java
@@ -30,6 +30,8 @@
import static android.Manifest.permission.NETWORK_SETUP_WIZARD;
import static android.Manifest.permission.NETWORK_STACK;
import static android.Manifest.permission.PACKET_KEEPALIVE_OFFLOAD;
+import static android.app.ActivityManager.UidFrozenStateChangedCallback.UID_FROZEN_STATE_FROZEN;
+import static android.app.ActivityManager.UidFrozenStateChangedCallback.UID_FROZEN_STATE_UNFROZEN;
import static android.app.PendingIntent.FLAG_IMMUTABLE;
import static android.content.Intent.ACTION_PACKAGE_ADDED;
import static android.content.Intent.ACTION_PACKAGE_REMOVED;
@@ -44,14 +46,18 @@
import static android.content.pm.PackageManager.PERMISSION_DENIED;
import static android.content.pm.PackageManager.PERMISSION_GRANTED;
import static android.net.ConnectivityManager.ACTION_CAPTIVE_PORTAL_SIGN_IN;
+import static android.net.ConnectivityManager.ACTION_DATA_ACTIVITY_CHANGE;
import static android.net.ConnectivityManager.BLOCKED_METERED_REASON_DATA_SAVER;
import static android.net.ConnectivityManager.BLOCKED_METERED_REASON_MASK;
import static android.net.ConnectivityManager.BLOCKED_METERED_REASON_USER_RESTRICTED;
import static android.net.ConnectivityManager.BLOCKED_REASON_BATTERY_SAVER;
import static android.net.ConnectivityManager.BLOCKED_REASON_NONE;
import static android.net.ConnectivityManager.CONNECTIVITY_ACTION;
+import static android.net.ConnectivityManager.EXTRA_DEVICE_TYPE;
+import static android.net.ConnectivityManager.EXTRA_IS_ACTIVE;
import static android.net.ConnectivityManager.EXTRA_NETWORK_INFO;
import static android.net.ConnectivityManager.EXTRA_NETWORK_TYPE;
+import static android.net.ConnectivityManager.EXTRA_REALTIME_NS;
import static android.net.ConnectivityManager.FIREWALL_CHAIN_DOZABLE;
import static android.net.ConnectivityManager.FIREWALL_CHAIN_LOW_POWER_STANDBY;
import static android.net.ConnectivityManager.FIREWALL_CHAIN_OEM_DENY_1;
@@ -148,21 +154,25 @@
import static android.os.Process.INVALID_UID;
import static android.system.OsConstants.IPPROTO_TCP;
+import static com.android.server.ConnectivityService.KEY_DESTROY_FROZEN_SOCKETS_VERSION;
import static com.android.server.ConnectivityService.MAX_NETWORK_REQUESTS_PER_SYSTEM_UID;
import static com.android.server.ConnectivityService.PREFERENCE_ORDER_MOBILE_DATA_PREFERERRED;
import static com.android.server.ConnectivityService.PREFERENCE_ORDER_OEM;
import static com.android.server.ConnectivityService.PREFERENCE_ORDER_PROFILE;
import static com.android.server.ConnectivityService.PREFERENCE_ORDER_VPN;
import static com.android.server.ConnectivityService.createDeliveryGroupKeyForConnectivityAction;
+import static com.android.server.ConnectivityService.makeNflogPrefix;
import static com.android.server.ConnectivityServiceTestUtils.transportToLegacyType;
import static com.android.server.NetworkAgentWrapper.CallbackType.OnQosCallbackRegister;
import static com.android.server.NetworkAgentWrapper.CallbackType.OnQosCallbackUnregister;
+import static com.android.testutils.Cleanup.testAndCleanup;
import static com.android.testutils.ConcurrentUtils.await;
import static com.android.testutils.ConcurrentUtils.durationOf;
import static com.android.testutils.DevSdkIgnoreRule.IgnoreAfter;
import static com.android.testutils.DevSdkIgnoreRule.IgnoreUpTo;
import static com.android.testutils.DevSdkIgnoreRuleKt.SC_V2;
import static com.android.testutils.FunctionalUtils.ignoreExceptions;
+import static com.android.testutils.HandlerUtils.visibleOnHandlerThread;
import static com.android.testutils.HandlerUtils.waitForIdleSerialExecutor;
import static com.android.testutils.MiscAsserts.assertContainsAll;
import static com.android.testutils.MiscAsserts.assertContainsExactly;
@@ -223,6 +233,8 @@
import android.Manifest;
import android.annotation.NonNull;
import android.annotation.Nullable;
+import android.app.ActivityManager;
+import android.app.ActivityManager.UidFrozenStateChangedCallback;
import android.app.AlarmManager;
import android.app.AppOpsManager;
import android.app.BroadcastOptions;
@@ -255,7 +267,6 @@
import android.net.ConnectivityManager.PacketKeepalive;
import android.net.ConnectivityManager.PacketKeepaliveCallback;
import android.net.ConnectivityManager.TooManyRequestsException;
-import android.net.ConnectivityResources;
import android.net.ConnectivitySettingsManager;
import android.net.ConnectivityThread;
import android.net.DataStallReportParcelable;
@@ -349,6 +360,7 @@
import android.provider.Settings;
import android.security.Credentials;
import android.system.Os;
+import android.telephony.SubscriptionManager;
import android.telephony.TelephonyManager;
import android.telephony.data.EpsBearerQosSessionAttributes;
import android.telephony.data.NrQosSessionAttributes;
@@ -371,8 +383,8 @@
import com.android.internal.util.WakeupMessage;
import com.android.internal.util.test.BroadcastInterceptingContext;
import com.android.internal.util.test.FakeSettingsProvider;
-import com.android.modules.utils.build.SdkLevel;
import com.android.net.module.util.ArrayTrackRecord;
+import com.android.net.module.util.BaseNetdUnsolicitedEventListener;
import com.android.net.module.util.CollectionUtils;
import com.android.net.module.util.LocationPermissionChecker;
import com.android.net.module.util.NetworkMonitorUtils;
@@ -382,12 +394,14 @@
import com.android.networkstack.apishim.common.UnsupportedApiLevelException;
import com.android.server.ConnectivityService.ConnectivityDiagnosticsCallbackInfo;
import com.android.server.ConnectivityService.NetworkRequestInfo;
+import com.android.server.ConnectivityServiceTest.ConnectivityServiceDependencies.DestroySocketsWrapper;
import com.android.server.ConnectivityServiceTest.ConnectivityServiceDependencies.ReportedInterfaces;
import com.android.server.connectivity.ApplicationSelfCertifiedNetworkCapabilities;
import com.android.server.connectivity.AutomaticOnOffKeepaliveTracker;
import com.android.server.connectivity.CarrierPrivilegeAuthenticator;
import com.android.server.connectivity.ClatCoordinator;
import com.android.server.connectivity.ConnectivityFlags;
+import com.android.server.connectivity.ConnectivityResources;
import com.android.server.connectivity.MultinetworkPolicyTracker;
import com.android.server.connectivity.MultinetworkPolicyTrackerTestDependencies;
import com.android.server.connectivity.Nat464Xlat;
@@ -502,7 +516,7 @@
// complete before callbacks are verified.
private static final int TEST_REQUEST_TIMEOUT_MS = 150;
- private static final int UNREASONABLY_LONG_ALARM_WAIT_MS = 1000;
+ private static final int UNREASONABLY_LONG_ALARM_WAIT_MS = 2_000;
private static final long TIMESTAMP = 1234L;
@@ -529,10 +543,15 @@
private static final String WIFI_IFNAME = "test_wlan0";
private static final String WIFI_WOL_IFNAME = "test_wlan_wol";
private static final String VPN_IFNAME = "tun10042";
+ private static final String ETHERNET_IFNAME = "eth0";
private static final String TEST_PACKAGE_NAME = "com.android.test.package";
private static final int TEST_PACKAGE_UID = 123;
private static final int TEST_PACKAGE_UID2 = 321;
private static final int TEST_PACKAGE_UID3 = 456;
+ private static final int NETWORK_ACTIVITY_NO_UID = -1;
+
+ private static final int PACKET_WAKEUP_MARK_MASK = 0x80000000;
+
private static final String ALWAYS_ON_PACKAGE = "com.android.test.alwaysonvpn";
private static final String INTERFACE_NAME = "interface";
@@ -604,6 +623,9 @@
@Mock CarrierPrivilegeAuthenticator mCarrierPrivilegeAuthenticator;
@Mock TetheringManager mTetheringManager;
@Mock BroadcastOptionsShim mBroadcastOptionsShim;
+ @Mock ActivityManager mActivityManager;
+ @Mock DestroySocketsWrapper mDestroySocketsWrapper;
+ @Mock SubscriptionManager mSubscriptionManager;
// BatteryStatsManager is final and cannot be mocked with regular mockito, so just mock the
// underlying binder calls.
@@ -727,6 +749,8 @@
if (Context.BATTERY_STATS_SERVICE.equals(name)) return mBatteryStatsManager;
if (Context.PAC_PROXY_SERVICE.equals(name)) return mPacProxyManager;
if (Context.TETHERING_SERVICE.equals(name)) return mTetheringManager;
+ if (Context.ACTIVITY_SERVICE.equals(name)) return mActivityManager;
+ if (Context.TELEPHONY_SUBSCRIPTION_SERVICE.equals(name)) return mSubscriptionManager;
return super.getSystemService(name);
}
@@ -855,7 +879,7 @@
@Override
public void sendStickyBroadcast(Intent intent, Bundle options) {
// Verify that delivery group policy APIs were used on U.
- if (SdkLevel.isAtLeastU() && CONNECTIVITY_ACTION.equals(intent.getAction())) {
+ if (mDeps.isAtLeastU() && CONNECTIVITY_ACTION.equals(intent.getAction())) {
final NetworkInfo ni = intent.getParcelableExtra(EXTRA_NETWORK_INFO,
NetworkInfo.class);
try {
@@ -864,13 +888,33 @@
verify(mBroadcastOptionsShim).setDeliveryGroupMatchingKey(
eq(CONNECTIVITY_ACTION),
eq(createDeliveryGroupKeyForConnectivityAction(ni)));
- verify(mBroadcastOptionsShim).setDeferUntilActive(eq(true));
+ verify(mBroadcastOptionsShim).setDeferralPolicy(
+ eq(ConstantsShim.DEFERRAL_POLICY_UNTIL_ACTIVE));
} catch (UnsupportedApiLevelException e) {
throw new RuntimeException(e);
}
}
super.sendStickyBroadcast(intent, options);
}
+
+ private final ArrayTrackRecord<Intent>.ReadHead mOrderedBroadcastAsUserHistory =
+ new ArrayTrackRecord<Intent>().newReadHead();
+
+ public void expectDataActivityBroadcast(int deviceType, boolean isActive, long tsNanos) {
+ assertNotNull(mOrderedBroadcastAsUserHistory.poll(BROADCAST_TIMEOUT_MS,
+ intent -> intent.getAction().equals(ACTION_DATA_ACTIVITY_CHANGE)
+ && intent.getIntExtra(EXTRA_DEVICE_TYPE, -1) == deviceType
+ && intent.getBooleanExtra(EXTRA_IS_ACTIVE, !isActive) == isActive
+ && intent.getLongExtra(EXTRA_REALTIME_NS, -1) == tsNanos
+ ));
+ }
+
+ @Override
+ public void sendOrderedBroadcastAsUser(Intent intent, UserHandle user,
+ String receiverPermission, BroadcastReceiver resultReceiver,
+ Handler scheduler, int initialCode, String initialData, Bundle initialExtras) {
+ mOrderedBroadcastAsUserHistory.add(intent);
+ }
}
// This was only added in the T SDK, but this test needs to build against the R+S SDKs, too.
@@ -1070,7 +1114,7 @@
}
private void onValidationRequested() throws Exception {
- if (SdkLevel.isAtLeastT()) {
+ if (mDeps.isAtLeastT()) {
verify(mNetworkMonitor).notifyNetworkConnectedParcel(any());
} else {
verify(mNetworkMonitor).notifyNetworkConnected(any(), any());
@@ -1909,10 +1953,15 @@
doReturn(0).when(mResources).getInteger(R.integer.config_activelyPreferBadWifi);
doReturn(true).when(mResources)
.getBoolean(R.bool.config_cellular_radio_timesharing_capable);
+ doReturn(PACKET_WAKEUP_MARK_MASK).when(mResources).getInteger(
+ R.integer.config_networkWakeupPacketMask);
+ doReturn(PACKET_WAKEUP_MARK_MASK).when(mResources).getInteger(
+ R.integer.config_networkWakeupPacketMark);
}
class ConnectivityServiceDependencies extends ConnectivityService.Dependencies {
final ConnectivityResources mConnRes;
+ final ArraySet<Pair<Long, Integer>> mEnabledChangeIds = new ArraySet<>();
ConnectivityServiceDependencies(final Context mockResContext) {
mConnRes = new ConnectivityResources(mockResContext);
@@ -1978,7 +2027,7 @@
@Override
public CarrierPrivilegeAuthenticator makeCarrierPrivilegeAuthenticator(
@NonNull final Context context, @NonNull final TelephonyManager tm) {
- return SdkLevel.isAtLeastT() ? mCarrierPrivilegeAuthenticator : null;
+ return mDeps.isAtLeastT() ? mCarrierPrivilegeAuthenticator : null;
}
@Override
@@ -2066,15 +2115,72 @@
}
@Override
- public boolean isFeatureEnabled(Context context, String name, boolean defaultEnabled) {
+ public boolean isFeatureEnabled(Context context, String name) {
switch (name) {
case ConnectivityFlags.NO_REMATCH_ALL_REQUESTS_ON_REGISTER:
return true;
+ case KEY_DESTROY_FROZEN_SOCKETS_VERSION:
+ return true;
default:
- return super.isFeatureEnabled(context, name, defaultEnabled);
+ return super.isFeatureEnabled(context, name);
}
}
+ public void setChangeIdEnabled(final boolean enabled, final long changeId, final int uid) {
+ final Pair<Long, Integer> data = new Pair<>(changeId, uid);
+ // mEnabledChangeIds is read on the handler thread and maybe the test thread, so
+ // make sure both threads see it before continuing.
+ visibleOnHandlerThread(mCsHandlerThread.getThreadHandler(), () -> {
+ if (enabled) {
+ mEnabledChangeIds.add(data);
+ } else {
+ mEnabledChangeIds.remove(data);
+ }
+ });
+ }
+
+ @Override
+ public boolean isChangeEnabled(final long changeId, final int uid) {
+ return mEnabledChangeIds.contains(new Pair<>(changeId, uid));
+ }
+
+ // In AOSP, build version codes are all over the place (e.g. at the time of this writing
+ // U == V). Define custom ones.
+ private static final int VERSION_UNMOCKED = -1;
+ private static final int VERSION_R = 1;
+ private static final int VERSION_S = 2;
+ private static final int VERSION_T = 3;
+ private static final int VERSION_U = 4;
+ private static final int VERSION_V = 5;
+ private static final int VERSION_MAX = VERSION_V;
+ private int mSdkLevel = VERSION_UNMOCKED;
+
+ private void setBuildSdk(final int sdkLevel) {
+ if (sdkLevel > VERSION_MAX) {
+ throw new IllegalArgumentException("setBuildSdk must not be called with"
+ + " Build.VERSION constants but Dependencies.VERSION_* constants");
+ }
+ visibleOnHandlerThread(mCsHandlerThread.getThreadHandler(), () -> mSdkLevel = sdkLevel);
+ }
+
+ @Override
+ public boolean isAtLeastS() {
+ return mSdkLevel == VERSION_UNMOCKED ? super.isAtLeastS()
+ : mSdkLevel >= VERSION_S;
+ }
+
+ @Override
+ public boolean isAtLeastT() {
+ return mSdkLevel == VERSION_UNMOCKED ? super.isAtLeastT()
+ : mSdkLevel >= VERSION_T;
+ }
+
+ @Override
+ public boolean isAtLeastU() {
+ return mSdkLevel == VERSION_UNMOCKED ? super.isAtLeastU()
+ : mSdkLevel >= VERSION_U;
+ }
+
@Override
public BpfNetMaps getBpfNetMaps(Context context, INetd netd) {
return mBpfNetMaps;
@@ -2147,6 +2253,35 @@
}
}
}
+
+ // Class to be mocked and used to verify destroy sockets methods call
+ public class DestroySocketsWrapper {
+ public void destroyLiveTcpSockets(final Set<Range<Integer>> ranges,
+ final Set<Integer> exemptUids){}
+ public void destroyLiveTcpSocketsByOwnerUids(final Set<Integer> ownerUids){}
+ }
+
+ @Override @SuppressWarnings("DirectInvocationOnMock")
+ public void destroyLiveTcpSockets(final Set<Range<Integer>> ranges,
+ final Set<Integer> exemptUids) {
+ // Call mocked destroyLiveTcpSockets so that test can verify this method call
+ mDestroySocketsWrapper.destroyLiveTcpSockets(ranges, exemptUids);
+ }
+
+ @Override @SuppressWarnings("DirectInvocationOnMock")
+ public void destroyLiveTcpSocketsByOwnerUids(final Set<Integer> ownerUids) {
+ // Call mocked destroyLiveTcpSocketsByOwnerUids so that test can verify this method call
+ mDestroySocketsWrapper.destroyLiveTcpSocketsByOwnerUids(ownerUids);
+ }
+
+ final ArrayTrackRecord<Pair<Integer, Long>>.ReadHead mScheduledEvaluationTimeouts =
+ new ArrayTrackRecord<Pair<Integer, Long>>().newReadHead();
+ @Override
+ public void scheduleEvaluationTimeout(@NonNull Handler handler,
+ @NonNull final Network network, final long delayMs) {
+ mScheduledEvaluationTimeouts.add(new Pair<>(network.netId, delayMs));
+ super.scheduleEvaluationTimeout(handler, network, delayMs);
+ }
}
private class AutomaticOnOffKeepaliveTrackerDependencies
@@ -2218,7 +2353,9 @@
ConnectivityResources.setResourcesContextForTest(null);
mCsHandlerThread.quitSafely();
+ mCsHandlerThread.join();
mAlarmManagerThread.quitSafely();
+ mAlarmManagerThread.join();
}
private void mockDefaultPackages() throws Exception {
@@ -2398,10 +2535,14 @@
}
private ExpectedBroadcast expectProxyChangeAction(ProxyInfo proxy) {
+ return expectProxyChangeAction(actualProxy -> proxy.equals(actualProxy));
+ }
+
+ private ExpectedBroadcast expectProxyChangeAction(Predicate<ProxyInfo> tester) {
return registerBroadcastReceiverThat(PROXY_CHANGE_ACTION, 1, intent -> {
final ProxyInfo actualProxy = (ProxyInfo) intent.getExtra(Proxy.EXTRA_PROXY_INFO,
ProxyInfo.buildPacProxy(Uri.EMPTY));
- return proxy.equals(actualProxy);
+ return tester.test(actualProxy);
});
}
@@ -3366,8 +3507,10 @@
// This test would be flaky with the default 120ms timer: that is short enough that
// lingered networks are torn down before assertions can be run. We don't want to mock the
// lingering timer to keep the WakeupMessage logic realistic: this has already proven useful
- // in detecting races.
- mService.mLingerDelayMs = 300;
+ // in detecting races. Furthermore, sometimes the test is running while Phenotype is running
+ // so hot that the test doesn't get the CPU for multiple hundreds of milliseconds, so this
+ // needs to be suitably long.
+ mService.mLingerDelayMs = 2_000;
NetworkRequest request = new NetworkRequest.Builder()
.clearCapabilities().addCapability(NET_CAPABILITY_NOT_METERED)
@@ -3780,6 +3923,12 @@
mWiFiAgent = new TestNetworkAgentWrapper(TRANSPORT_WIFI, callbacks);
+ if (mService.shouldCreateNetworksImmediately()) {
+ assertEquals("onNetworkCreated", eventOrder.poll(TIMEOUT_MS, TimeUnit.MILLISECONDS));
+ } else {
+ assertNull(eventOrder.poll());
+ }
+
// Connect a network, and file a request for it after it has come up, to ensure the nascent
// timer is cleared and the test does not have to wait for it. Filing the request after the
// network has come up is necessary because ConnectivityService does not appear to clear the
@@ -3787,7 +3936,12 @@
// connected.
// TODO: fix this bug, file the request before connecting, and remove the waitForIdle.
mWiFiAgent.connectWithoutInternet();
- waitForIdle();
+ if (!mService.shouldCreateNetworksImmediately()) {
+ assertEquals("onNetworkCreated", eventOrder.poll(TIMEOUT_MS, TimeUnit.MILLISECONDS));
+ } else {
+ waitForIdle();
+ assertNull(eventOrder.poll());
+ }
mCm.requestNetwork(request, callback);
callback.expectAvailableCallbacksUnvalidated(mWiFiAgent);
@@ -3804,7 +3958,6 @@
// Disconnect the network and check that events happened in the right order.
mCm.unregisterNetworkCallback(callback);
- assertEquals("onNetworkCreated", eventOrder.poll(TIMEOUT_MS, TimeUnit.MILLISECONDS));
assertEquals("onNetworkUnwanted", eventOrder.poll(TIMEOUT_MS, TimeUnit.MILLISECONDS));
assertEquals("timePasses", eventOrder.poll(TIMEOUT_MS, TimeUnit.MILLISECONDS));
assertEquals("onNetworkDisconnected", eventOrder.poll(TIMEOUT_MS, TimeUnit.MILLISECONDS));
@@ -3814,13 +3967,13 @@
@Test
public void testExplicitlySelected() throws Exception {
- NetworkRequest request = new NetworkRequest.Builder()
+ final NetworkRequest request = new NetworkRequest.Builder()
.clearCapabilities().addCapability(NET_CAPABILITY_INTERNET)
.build();
- TestNetworkCallback callback = new TestNetworkCallback();
+ final TestNetworkCallback callback = new TestNetworkCallback();
mCm.registerNetworkCallback(request, callback);
- // Bring up validated cell.
+ // Bring up validated cell
mCellAgent = new TestNetworkAgentWrapper(TRANSPORT_CELLULAR);
mCellAgent.connect(true);
callback.expectAvailableThenValidatedCallbacks(mCellAgent);
@@ -3878,6 +4031,12 @@
assertEquals(mWiFiAgent.getNetwork(), mCm.getActiveNetwork());
expectUnvalidationCheckWillNotNotify(mWiFiAgent);
+ // Now request cell so it doesn't disconnect during the test
+ final NetworkRequest cellRequest = new NetworkRequest.Builder()
+ .clearCapabilities().addTransportType(TRANSPORT_CELLULAR).build();
+ final TestNetworkCallback cellCallback = new TestNetworkCallback();
+ mCm.requestNetwork(cellRequest, cellCallback);
+
mEthernetAgent = new TestNetworkAgentWrapper(TRANSPORT_ETHERNET);
mEthernetAgent.connect(true);
callback.expectAvailableCallbacksUnvalidated(mEthernetAgent);
@@ -3919,6 +4078,7 @@
callback.expect(LOST, mWiFiAgent);
callback.expect(LOST, mCellAgent);
+ mCm.unregisterNetworkCallback(cellCallback);
}
private void doTestFirstEvaluation(
@@ -5862,7 +6022,7 @@
doReturn(0).when(mResources).getInteger(R.integer.config_activelyPreferBadWifi);
mPolicyTracker.reevaluate();
waitForIdle();
- if (SdkLevel.isAtLeastU()) {
+ if (mDeps.isAtLeastU()) {
// U+ ignore the setting and always actively prefers bad wifi
assertTrue(mService.mNetworkRanker.getConfiguration().activelyPreferBadWifi());
} else {
@@ -5990,10 +6150,13 @@
wifiCallback.assertNoCallback();
}
- public void doTestPreferBadWifi(final boolean preferBadWifi) throws Exception {
+ public void doTestPreferBadWifi(final boolean avoidBadWifi,
+ final boolean preferBadWifi, final boolean explicitlySelected,
+ @NonNull Predicate<Long> checkUnvalidationTimeout) throws Exception {
// Pretend we're on a carrier that restricts switching away from bad wifi, and
// depending on the parameter one that may indeed prefer bad wifi.
- doReturn(0).when(mResources).getInteger(R.integer.config_networkAvoidBadWifi);
+ doReturn(avoidBadWifi ? 1 : 0).when(mResources)
+ .getInteger(R.integer.config_networkAvoidBadWifi);
doReturn(preferBadWifi ? 1 : 0).when(mResources)
.getInteger(R.integer.config_activelyPreferBadWifi);
mPolicyTracker.reevaluate();
@@ -6012,10 +6175,15 @@
mDefaultNetworkCallback.expectAvailableThenValidatedCallbacks(mCellAgent);
mWiFiAgent = new TestNetworkAgentWrapper(TRANSPORT_WIFI);
+ mWiFiAgent.explicitlySelected(explicitlySelected, false /* acceptUnvalidated */);
mWiFiAgent.connect(false);
wifiCallback.expectAvailableCallbacksUnvalidated(mWiFiAgent);
- if (preferBadWifi) {
+ assertNotNull(mDeps.mScheduledEvaluationTimeouts.poll(TIMEOUT_MS,
+ t -> t.first == mWiFiAgent.getNetwork().netId
+ && checkUnvalidationTimeout.test(t.second)));
+
+ if (!avoidBadWifi && preferBadWifi) {
expectUnvalidationCheckWillNotify(mWiFiAgent, NotificationType.LOST_INTERNET);
mDefaultNetworkCallback.expectAvailableCallbacksUnvalidated(mWiFiAgent);
} else {
@@ -6025,15 +6193,37 @@
}
@Test
- public void testPreferBadWifi_doNotPrefer() throws Exception {
+ public void testPreferBadWifi_doNotAvoid_doNotPrefer() throws Exception {
// Starting with U this mode is no longer supported and can't actually be tested
- assumeFalse(SdkLevel.isAtLeastU());
- doTestPreferBadWifi(false /* preferBadWifi */);
+ assumeFalse(mDeps.isAtLeastU());
+ doTestPreferBadWifi(false /* avoidBadWifi */, false /* preferBadWifi */,
+ false /* explicitlySelected */, timeout -> timeout < 14_000);
}
@Test
- public void testPreferBadWifi_doPrefer() throws Exception {
- doTestPreferBadWifi(true /* preferBadWifi */);
+ public void testPreferBadWifi_doNotAvoid_doPrefer_notExplicit() throws Exception {
+ doTestPreferBadWifi(false /* avoidBadWifi */, true /* preferBadWifi */,
+ false /* explicitlySelected */, timeout -> timeout > 14_000);
+ }
+
+ @Test
+ public void testPreferBadWifi_doNotAvoid_doPrefer_explicitlySelected() throws Exception {
+ doTestPreferBadWifi(false /* avoidBadWifi */, true /* preferBadWifi */,
+ true /* explicitlySelected */, timeout -> timeout < 14_000);
+ }
+
+ @Test
+ public void testPreferBadWifi_doAvoid_doNotPrefer() throws Exception {
+ // If avoidBadWifi=true, then preferBadWifi should be irrelevant. Test anyway.
+ doTestPreferBadWifi(true /* avoidBadWifi */, false /* preferBadWifi */,
+ false /* explicitlySelected */, timeout -> timeout < 14_000);
+ }
+
+ @Test
+ public void testPreferBadWifi_doAvoid_doPrefer() throws Exception {
+ // If avoidBadWifi=true, then preferBadWifi should be irrelevant. Test anyway.
+ doTestPreferBadWifi(true /* avoidBadWifi */, true /* preferBadWifi */,
+ false /* explicitlySelected */, timeout -> timeout < 14_000);
}
@Test
@@ -6702,10 +6892,6 @@
ka = mCm.startNattKeepalive(myNet, validKaInterval, callback, myIPv6, 1234, dstIPv4);
callback.expectError(PacketKeepalive.ERROR_INVALID_IP_ADDRESS);
- // NAT-T is only supported for IPv4.
- ka = mCm.startNattKeepalive(myNet, validKaInterval, callback, myIPv6, 1234, dstIPv6);
- callback.expectError(PacketKeepalive.ERROR_INVALID_IP_ADDRESS);
-
ka = mCm.startNattKeepalive(myNet, validKaInterval, callback, myIPv4, 123456, dstIPv4);
callback.expectError(PacketKeepalive.ERROR_INVALID_PORT);
@@ -6856,13 +7042,6 @@
callback.expectError(SocketKeepalive.ERROR_INVALID_IP_ADDRESS);
}
- // NAT-T is only supported for IPv4.
- try (SocketKeepalive ka = mCm.createSocketKeepalive(
- myNet, testSocket, myIPv6, dstIPv6, executor, callback)) {
- ka.start(validKaInterval);
- callback.expectError(SocketKeepalive.ERROR_INVALID_IP_ADDRESS);
- }
-
// Basic check before testing started keepalive.
try (SocketKeepalive ka = mCm.createSocketKeepalive(
myNet, testSocket, myIPv4, dstIPv4, executor, callback)) {
@@ -7583,7 +7762,9 @@
// Simple connection with initial LP should have updated ifaces.
mCellAgent.connect(false);
waitForIdle();
- expectNotifyNetworkStatus(onlyCell(), onlyCell(), MOBILE_IFNAME);
+ List<Network> allNetworks = mService.shouldCreateNetworksImmediately()
+ ? cellAndWifi() : onlyCell();
+ expectNotifyNetworkStatus(allNetworks, onlyCell(), MOBILE_IFNAME);
reset(mStatsManager);
// Verify change fields other than interfaces does not trigger a notification to NSS.
@@ -7892,9 +8073,13 @@
setPrivateDnsSettings(PRIVATE_DNS_MODE_OPPORTUNISTIC, "ignored.example.com");
mCellAgent = new TestNetworkAgentWrapper(TRANSPORT_CELLULAR);
+ final int netId = mCellAgent.getNetwork().netId;
waitForIdle();
- verify(mMockDnsResolver, never()).setResolverConfiguration(any());
- verifyNoMoreInteractions(mMockDnsResolver);
+ if (mService.shouldCreateNetworksImmediately()) {
+ verify(mMockDnsResolver, times(1)).createNetworkCache(netId);
+ } else {
+ verify(mMockDnsResolver, never()).setResolverConfiguration(any());
+ }
final LinkProperties cellLp = new LinkProperties();
cellLp.setInterfaceName(MOBILE_IFNAME);
@@ -7910,10 +8095,13 @@
mCellAgent.sendLinkProperties(cellLp);
mCellAgent.connect(false);
waitForIdle();
-
- verify(mMockDnsResolver, times(1)).createNetworkCache(eq(mCellAgent.getNetwork().netId));
- // CS tells dnsresolver about the empty DNS config for this network.
+ if (!mService.shouldCreateNetworksImmediately()) {
+ // CS tells dnsresolver about the empty DNS config for this network.
+ verify(mMockDnsResolver, times(1)).createNetworkCache(netId);
+ }
verify(mMockDnsResolver, atLeastOnce()).setResolverConfiguration(any());
+
+ verifyNoMoreInteractions(mMockDnsResolver);
reset(mMockDnsResolver);
cellLp.addDnsServer(InetAddress.getByName("2001:db8::1"));
@@ -8028,10 +8216,13 @@
mCm.requestNetwork(cellRequest, cellNetworkCallback);
mCellAgent = new TestNetworkAgentWrapper(TRANSPORT_CELLULAR);
+ final int netId = mCellAgent.getNetwork().netId;
waitForIdle();
- // CS tells netd about the empty DNS config for this network.
- verify(mMockDnsResolver, never()).setResolverConfiguration(any());
- verifyNoMoreInteractions(mMockDnsResolver);
+ if (mService.shouldCreateNetworksImmediately()) {
+ verify(mMockDnsResolver, times(1)).createNetworkCache(netId);
+ } else {
+ verify(mMockDnsResolver, never()).setResolverConfiguration(any());
+ }
final LinkProperties cellLp = new LinkProperties();
cellLp.setInterfaceName(MOBILE_IFNAME);
@@ -8050,7 +8241,9 @@
mCellAgent.sendLinkProperties(cellLp);
mCellAgent.connect(false);
waitForIdle();
- verify(mMockDnsResolver, times(1)).createNetworkCache(eq(mCellAgent.getNetwork().netId));
+ if (!mService.shouldCreateNetworksImmediately()) {
+ verify(mMockDnsResolver, times(1)).createNetworkCache(netId);
+ }
verify(mMockDnsResolver, atLeastOnce()).setResolverConfiguration(
mResolverParamsParcelCaptor.capture());
ResolverParamsParcel resolvrParams = mResolverParamsParcelCaptor.getValue();
@@ -8061,6 +8254,7 @@
assertEquals(2, resolvrParams.tlsServers.length);
assertTrue(new ArraySet<>(resolvrParams.tlsServers).containsAll(
asList("2001:db8::1", "192.0.2.1")));
+ verifyNoMoreInteractions(mMockDnsResolver);
reset(mMockDnsResolver);
cellNetworkCallback.expect(AVAILABLE, mCellAgent);
cellNetworkCallback.expect(NETWORK_CAPS_UPDATED, mCellAgent);
@@ -9665,7 +9859,7 @@
final Set<Integer> excludedUids = new ArraySet<Integer>();
excludedUids.add(VPN_UID);
- if (SdkLevel.isAtLeastT()) {
+ if (mDeps.isAtLeastT()) {
// On T onwards, the corresponding SDK sandbox UID should also be excluded
excludedUids.add(toSdkSandboxUid(VPN_UID));
}
@@ -9713,7 +9907,7 @@
vpnDefaultCallbackAsUid.assertNoCallback();
excludedUids.add(uid);
- if (SdkLevel.isAtLeastT()) {
+ if (mDeps.isAtLeastT()) {
// On T onwards, the corresponding SDK sandbox UID should also be excluded
excludedUids.add(toSdkSandboxUid(uid));
}
@@ -10125,6 +10319,7 @@
b2.expectBroadcast();
VMSHandlerThread.quitSafely();
+ VMSHandlerThread.join();
}
@Test @IgnoreUpTo(Build.VERSION_CODES.S_V2)
@@ -10206,6 +10401,50 @@
}
}
+ private void doTestSetFirewallChainEnabledCloseSocket(final int chain,
+ final boolean isAllowList) throws Exception {
+ reset(mDestroySocketsWrapper);
+
+ mCm.setFirewallChainEnabled(chain, true /* enabled */);
+ final Set<Integer> uids =
+ new ArraySet<>(List.of(TEST_PACKAGE_UID, TEST_PACKAGE_UID2));
+ if (isAllowList) {
+ final Set<Range<Integer>> range = new ArraySet<>(
+ List.of(new Range<>(Process.FIRST_APPLICATION_UID, Integer.MAX_VALUE)));
+ verify(mDestroySocketsWrapper).destroyLiveTcpSockets(range, uids);
+ } else {
+ verify(mDestroySocketsWrapper).destroyLiveTcpSocketsByOwnerUids(uids);
+ }
+
+ mCm.setFirewallChainEnabled(chain, false /* enabled */);
+ verifyNoMoreInteractions(mDestroySocketsWrapper);
+ }
+
+ @Test @IgnoreUpTo(Build.VERSION_CODES.TIRAMISU)
+ public void testSetFirewallChainEnabledCloseSocket() throws Exception {
+ doReturn(new ArraySet<>(Arrays.asList(TEST_PACKAGE_UID, TEST_PACKAGE_UID2)))
+ .when(mBpfNetMaps)
+ .getUidsWithDenyRuleOnDenyListChain(anyInt());
+ doReturn(new ArraySet<>(Arrays.asList(TEST_PACKAGE_UID, TEST_PACKAGE_UID2)))
+ .when(mBpfNetMaps)
+ .getUidsWithAllowRuleOnAllowListChain(anyInt());
+
+ final boolean allowlist = true;
+ final boolean denylist = false;
+
+ doReturn(true).when(mBpfNetMaps).isFirewallAllowList(anyInt());
+ doTestSetFirewallChainEnabledCloseSocket(FIREWALL_CHAIN_DOZABLE, allowlist);
+ doTestSetFirewallChainEnabledCloseSocket(FIREWALL_CHAIN_POWERSAVE, allowlist);
+ doTestSetFirewallChainEnabledCloseSocket(FIREWALL_CHAIN_RESTRICTED, allowlist);
+ doTestSetFirewallChainEnabledCloseSocket(FIREWALL_CHAIN_LOW_POWER_STANDBY, allowlist);
+
+ doReturn(false).when(mBpfNetMaps).isFirewallAllowList(anyInt());
+ doTestSetFirewallChainEnabledCloseSocket(FIREWALL_CHAIN_STANDBY, denylist);
+ doTestSetFirewallChainEnabledCloseSocket(FIREWALL_CHAIN_OEM_DENY_1, denylist);
+ doTestSetFirewallChainEnabledCloseSocket(FIREWALL_CHAIN_OEM_DENY_2, denylist);
+ doTestSetFirewallChainEnabledCloseSocket(FIREWALL_CHAIN_OEM_DENY_3, denylist);
+ }
+
private void doTestReplaceFirewallChain(final int chain) {
final int[] uids = new int[] {1001, 1002};
mCm.replaceFirewallChain(chain, uids);
@@ -10373,11 +10612,22 @@
return event;
}
+ private void verifyWakeupModifyInterface(String iface, boolean add) throws RemoteException {
+ if (add) {
+ verify(mMockNetd).wakeupAddInterface(eq(iface), anyString(), anyInt(),
+ anyInt());
+ } else {
+ verify(mMockNetd).wakeupDelInterface(eq(iface), anyString(), anyInt(),
+ anyInt());
+ }
+ }
+
private <T> T verifyWithOrder(@Nullable InOrder inOrder, @NonNull T t) {
if (inOrder != null) {
return inOrder.verify(t);
} else {
- return verify(t);
+ // times(1) for consistency with the above. InOrder#verify always implies times(1).
+ return verify(t, times(1));
}
}
@@ -10391,7 +10641,7 @@
private void verifyClatdStart(@Nullable InOrder inOrder, @NonNull String iface, int netId,
@NonNull String nat64Prefix) throws Exception {
- if (SdkLevel.isAtLeastT()) {
+ if (mDeps.isAtLeastT()) {
verifyWithOrder(inOrder, mClatCoordinator)
.clatStart(eq(iface), eq(netId), eq(new IpPrefix(nat64Prefix)));
} else {
@@ -10401,7 +10651,7 @@
private void verifyNeverClatdStart(@Nullable InOrder inOrder, @NonNull String iface)
throws Exception {
- if (SdkLevel.isAtLeastT()) {
+ if (mDeps.isAtLeastT()) {
verifyNeverWithOrder(inOrder, mClatCoordinator).clatStart(eq(iface), anyInt(), any());
} else {
verifyNeverWithOrder(inOrder, mMockNetd).clatdStart(eq(iface), anyString());
@@ -10410,7 +10660,7 @@
private void verifyClatdStop(@Nullable InOrder inOrder, @NonNull String iface)
throws Exception {
- if (SdkLevel.isAtLeastT()) {
+ if (mDeps.isAtLeastT()) {
verifyWithOrder(inOrder, mClatCoordinator).clatStop();
} else {
verifyWithOrder(inOrder, mMockNetd).clatdStop(eq(iface));
@@ -10419,13 +10669,28 @@
private void verifyNeverClatdStop(@Nullable InOrder inOrder, @NonNull String iface)
throws Exception {
- if (SdkLevel.isAtLeastT()) {
+ if (mDeps.isAtLeastT()) {
verifyNeverWithOrder(inOrder, mClatCoordinator).clatStop();
} else {
verifyNeverWithOrder(inOrder, mMockNetd).clatdStop(eq(iface));
}
}
+ private void expectNativeNetworkCreated(int netId, int permission, String iface,
+ InOrder inOrder) throws Exception {
+ verifyWithOrder(inOrder, mMockNetd).networkCreate(nativeNetworkConfigPhysical(netId,
+ permission));
+ verifyWithOrder(inOrder, mMockDnsResolver).createNetworkCache(eq(netId));
+ if (iface != null) {
+ verifyWithOrder(inOrder, mMockNetd).networkAddInterface(netId, iface);
+ }
+ }
+
+ private void expectNativeNetworkCreated(int netId, int permission, String iface)
+ throws Exception {
+ expectNativeNetworkCreated(netId, permission, iface, null /* inOrder */);
+ }
+
@Test
public void testStackedLinkProperties() throws Exception {
final LinkAddress myIpv4 = new LinkAddress("1.2.3.4/24");
@@ -10463,11 +10728,8 @@
int cellNetId = mCellAgent.getNetwork().netId;
waitForIdle();
- verify(mMockNetd, times(1)).networkCreate(nativeNetworkConfigPhysical(cellNetId,
- INetd.PERMISSION_NONE));
+ expectNativeNetworkCreated(cellNetId, INetd.PERMISSION_NONE, MOBILE_IFNAME);
assertRoutesAdded(cellNetId, ipv6Subnet, ipv6Default);
- verify(mMockDnsResolver, times(1)).createNetworkCache(eq(cellNetId));
- verify(mMockNetd, times(1)).networkAddInterface(cellNetId, MOBILE_IFNAME);
final ArrayTrackRecord<ReportedInterfaces>.ReadHead readHead =
mDeps.mReportedInterfaceHistory.newReadHead();
assertNotNull(readHead.poll(TIMEOUT_MS, ri -> ri.contentEquals(mServiceContext,
@@ -10599,6 +10861,11 @@
clat.interfaceRemoved(CLAT_MOBILE_IFNAME);
networkCallback.assertNoCallback();
verify(mMockNetd, times(1)).networkRemoveInterface(cellNetId, CLAT_MOBILE_IFNAME);
+
+ if (mDeps.isAtLeastU()) {
+ verifyWakeupModifyInterface(CLAT_MOBILE_IFNAME, false);
+ }
+
verifyNoMoreInteractions(mMockNetd);
verifyNoMoreInteractions(mClatCoordinator);
verifyNoMoreInteractions(mMockDnsResolver);
@@ -10635,6 +10902,10 @@
assertRoutesAdded(cellNetId, stackedDefault);
verify(mMockNetd, times(1)).networkAddInterface(cellNetId, CLAT_MOBILE_IFNAME);
+ if (mDeps.isAtLeastU()) {
+ verifyWakeupModifyInterface(CLAT_MOBILE_IFNAME, true);
+ }
+
// NAT64 prefix is removed. Expect that clat is stopped.
mService.mResolverUnsolEventCallback.onNat64PrefixEvent(makeNat64PrefixEvent(
cellNetId, PREFIX_OPERATION_REMOVED, kNat64PrefixString, 96));
@@ -10649,6 +10920,11 @@
cb -> cb.getLp().getStackedLinks().size() == 0);
verify(mMockNetd, times(1)).networkRemoveInterface(cellNetId, CLAT_MOBILE_IFNAME);
verify(mMockNetd, times(1)).interfaceGetCfg(CLAT_MOBILE_IFNAME);
+
+ if (mDeps.isAtLeastU()) {
+ verifyWakeupModifyInterface(CLAT_MOBILE_IFNAME, false);
+ }
+
// Clean up.
mCellAgent.disconnect();
networkCallback.expect(LOST, mCellAgent);
@@ -10656,11 +10932,16 @@
verify(mMockNetd, times(1)).idletimerRemoveInterface(eq(MOBILE_IFNAME), anyInt(),
eq(Integer.toString(TRANSPORT_CELLULAR)));
verify(mMockNetd).networkDestroy(cellNetId);
- if (SdkLevel.isAtLeastU()) {
+ if (mDeps.isAtLeastU()) {
verify(mMockNetd).setNetworkAllowlist(any());
} else {
verify(mMockNetd, never()).setNetworkAllowlist(any());
}
+
+ if (mDeps.isAtLeastU()) {
+ verifyWakeupModifyInterface(MOBILE_IFNAME, false);
+ }
+
verifyNoMoreInteractions(mMockNetd);
verifyNoMoreInteractions(mClatCoordinator);
reset(mMockNetd);
@@ -10690,6 +10971,11 @@
verify(mMockNetd).networkAddInterface(cellNetId, CLAT_MOBILE_IFNAME);
// assertRoutesAdded sees all calls since last mMockNetd reset, so expect IPv6 routes again.
assertRoutesAdded(cellNetId, ipv6Subnet, ipv6Default, stackedDefault);
+
+ if (mDeps.isAtLeastU()) {
+ verifyWakeupModifyInterface(MOBILE_IFNAME, true);
+ }
+
reset(mMockNetd);
reset(mClatCoordinator);
@@ -10698,14 +10984,24 @@
networkCallback.expect(LOST, mCellAgent);
networkCallback.assertNoCallback();
verifyClatdStop(null /* inOrder */, MOBILE_IFNAME);
+
+ if (mDeps.isAtLeastU()) {
+ verifyWakeupModifyInterface(CLAT_MOBILE_IFNAME, false);
+ }
+
verify(mMockNetd).idletimerRemoveInterface(eq(MOBILE_IFNAME), anyInt(),
eq(Integer.toString(TRANSPORT_CELLULAR)));
verify(mMockNetd).networkDestroy(cellNetId);
- if (SdkLevel.isAtLeastU()) {
+ if (mDeps.isAtLeastU()) {
verify(mMockNetd).setNetworkAllowlist(any());
} else {
verify(mMockNetd, never()).setNetworkAllowlist(any());
}
+
+ if (mDeps.isAtLeastU()) {
+ verifyWakeupModifyInterface(MOBILE_IFNAME, false);
+ }
+
verifyNoMoreInteractions(mMockNetd);
verifyNoMoreInteractions(mClatCoordinator);
@@ -10924,6 +11220,127 @@
assertTrue("Nat464Xlat was not IDLE", !clat.isStarted());
}
+ final String transportToTestIfaceName(int transport) {
+ switch (transport) {
+ case TRANSPORT_WIFI:
+ return WIFI_IFNAME;
+ case TRANSPORT_CELLULAR:
+ return MOBILE_IFNAME;
+ case TRANSPORT_ETHERNET:
+ return ETHERNET_IFNAME;
+ default:
+ throw new AssertionError("Unsupported transport type");
+ }
+ }
+
+ private void doTestInterfaceClassActivityChanged(final int transportType) throws Exception {
+ final int legacyType = transportToLegacyType(transportType);
+ final LinkProperties lp = new LinkProperties();
+ lp.setInterfaceName(transportToTestIfaceName(transportType));
+ final TestNetworkAgentWrapper agent = new TestNetworkAgentWrapper(transportType, lp);
+
+ final ConditionVariable onNetworkActiveCv = new ConditionVariable();
+ final ConnectivityManager.OnNetworkActiveListener listener = onNetworkActiveCv::open;
+
+ testAndCleanup(() -> {
+ agent.connect(true);
+
+ // Network is considered active when the network becomes the default network.
+ assertTrue(mCm.isDefaultNetworkActive());
+
+ mCm.addDefaultNetworkActiveListener(listener);
+
+ ArgumentCaptor<BaseNetdUnsolicitedEventListener> netdCallbackCaptor =
+ ArgumentCaptor.forClass(BaseNetdUnsolicitedEventListener.class);
+ verify(mMockNetd).registerUnsolicitedEventListener(netdCallbackCaptor.capture());
+
+ // Interface goes to inactive state
+ netdCallbackCaptor.getValue().onInterfaceClassActivityChanged(false /* isActive */,
+ transportType, TIMESTAMP, NETWORK_ACTIVITY_NO_UID);
+ mServiceContext.expectDataActivityBroadcast(legacyType, false /* isActive */,
+ TIMESTAMP);
+ assertFalse(onNetworkActiveCv.block(TEST_CALLBACK_TIMEOUT_MS));
+ assertFalse(mCm.isDefaultNetworkActive());
+
+ // Interface goes to active state
+ netdCallbackCaptor.getValue().onInterfaceClassActivityChanged(true /* isActive */,
+ transportType, TIMESTAMP, TEST_PACKAGE_UID);
+ mServiceContext.expectDataActivityBroadcast(legacyType, true /* isActive */, TIMESTAMP);
+ assertTrue(onNetworkActiveCv.block(TEST_CALLBACK_TIMEOUT_MS));
+ assertTrue(mCm.isDefaultNetworkActive());
+ }, () -> { // Cleanup
+ mCm.removeDefaultNetworkActiveListener(listener);
+ }, () -> { // Cleanup
+ agent.disconnect();
+ });
+ }
+
+ @Test
+ public void testInterfaceClassActivityChangedWifi() throws Exception {
+ doTestInterfaceClassActivityChanged(TRANSPORT_WIFI);
+ }
+
+ @Test
+ public void testInterfaceClassActivityChangedCellular() throws Exception {
+ doTestInterfaceClassActivityChanged(TRANSPORT_CELLULAR);
+ }
+
+ private void doTestOnNetworkActive_NewNetworkConnects(int transportType, boolean expectCallback)
+ throws Exception {
+ final ConditionVariable onNetworkActiveCv = new ConditionVariable();
+ final ConnectivityManager.OnNetworkActiveListener listener = onNetworkActiveCv::open;
+
+ final LinkProperties lp = new LinkProperties();
+ lp.setInterfaceName(transportToTestIfaceName(transportType));
+ final TestNetworkAgentWrapper agent = new TestNetworkAgentWrapper(transportType, lp);
+
+ testAndCleanup(() -> {
+ mCm.addDefaultNetworkActiveListener(listener);
+ agent.connect(true);
+ if (expectCallback) {
+ assertTrue(onNetworkActiveCv.block(TEST_CALLBACK_TIMEOUT_MS));
+ } else {
+ assertFalse(onNetworkActiveCv.block(TEST_CALLBACK_TIMEOUT_MS));
+ }
+ assertTrue(mCm.isDefaultNetworkActive());
+ }, () -> { // Cleanup
+ mCm.removeDefaultNetworkActiveListener(listener);
+ }, () -> { // Cleanup
+ agent.disconnect();
+ });
+ }
+
+ @Test
+ public void testOnNetworkActive_NewCellConnects_CallbackCalled() throws Exception {
+ doTestOnNetworkActive_NewNetworkConnects(TRANSPORT_CELLULAR, true /* expectCallback */);
+ }
+
+ @Test
+ public void testOnNetworkActive_NewEthernetConnects_Callback() throws Exception {
+ // On T-, LegacyNetworkActivityTracker calls onNetworkActive callback only for networks that
+ // tracker adds the idle timer to. And the tracker does not set the idle timer for the
+ // ethernet network.
+ // So onNetworkActive is not called when the ethernet becomes the default network
+ doTestOnNetworkActive_NewNetworkConnects(TRANSPORT_ETHERNET, mDeps.isAtLeastU());
+ }
+
+ @Test
+ public void testIsDefaultNetworkActiveNoDefaultNetwork() throws Exception {
+ assertFalse(mCm.isDefaultNetworkActive());
+
+ final LinkProperties cellLp = new LinkProperties();
+ cellLp.setInterfaceName(MOBILE_IFNAME);
+ mCellAgent = new TestNetworkAgentWrapper(TRANSPORT_CELLULAR, cellLp);
+ mCellAgent.connect(true);
+ // Network is considered active when the network becomes the default network.
+ assertTrue(mCm.isDefaultNetworkActive());
+
+ mCellAgent.disconnect();
+ waitForIdle();
+
+ assertFalse(mCm.isDefaultNetworkActive());
+ }
+
@Test
public void testDataActivityTracking() throws Exception {
final TestNetworkCallback networkCallback = new TestNetworkCallback();
@@ -11067,6 +11484,278 @@
assertEquals(testProxyInfo, mService.getProxyForNetwork(null));
}
+ /*
+ * Note for maintainers about how PAC proxies are implemented in Android.
+ *
+ * Generally, a proxy is just a hostname and a port to which requests are sent, instead of
+ * sending them directly. Most HTTP libraries know to use this protocol, and the Java
+ * language has properties to help handling these :
+ * https://docs.oracle.com/javase/8/docs/technotes/guides/net/proxies.html
+ * Unfortunately these properties are very old and do not take multi-networking into account.
+ *
+ * A PAC proxy consists of a javascript file stored on a server, and the client is expected to
+ * download the file and interpret the javascript for each HTTP request to know where to direct
+ * it. The device must therefore run code (namely, a javascript interpreter) to interpret the
+ * PAC file correctly. Most HTTP libraries do not know how to do this, since they do not
+ * embark a javascript interpreter (and it would be generally unreasonable for them to do
+ * so). Some apps, notably browsers, do know how to do this, but they are the exception rather
+ * than the rule.
+ * So to support most apps, Android embarks the javascript interpreter. When a network is
+ * configured to have a PAC proxy, Android will first set the ProxyInfo object to an object
+ * that contains the PAC URL (to communicate that to apps that know how to use it), then
+ * download the PAC file and start a native process which will open a server on localhost,
+ * and uses the interpreter inside WebView to interpret the PAC file. This server takes
+ * a little bit of time to start and will listen on a random port. When the port is known,
+ * the framework receives a notification and it updates the ProxyInfo in LinkProperties
+ * as well as send a broadcast to inform apps. This new ProxyInfo still contains the PAC URL,
+ * but it also contains "localhost" as the host and the port that the server listens to as
+ * the port. This will let HTTP libraries that don't have a javascript interpreter work,
+ * because they'll send the requests to this server running on localhost on the correct port,
+ * and this server will do what is appropriate with each request according to the PAC file.
+ *
+ * Note that at the time of this writing, Android does not support starting multiple local
+ * PAC servers, though this would be possible in theory by just starting multiple instances
+ * of this process running their server on different ports. As a stopgap measure, Android
+ * keeps one local server which is always the one for the default network. If a non-default
+ * network has a PAC proxy, it will have a LinkProperties with a port of -1, which means it
+ * could still be used by apps that know how to use the PAC URL directly, but not by HTTP
+ * libs that don't know how to do that. When a network with a PAC proxy becomes the default,
+ * the local server is started. When a network without a PAC proxy becomes the default, the
+ * local server is stopped if it is running (and the LP for the old default network should
+ * be reset to have a port of -1).
+ *
+ * In principle, each network can be configured with a different proxy (typically in the
+ * network settings for a Wi-Fi network). These end up exposed in the LinkProperties of the
+ * relevant network.
+ * Android also exposes ConnectivityManager#getDefaultProxy, which is simply the proxy for
+ * the default network. This was retrofitted from a time where Android did not support multiple
+ * concurrent networks, hence the difficult architecture.
+ * Note that there is also a "global" proxy that can be set by the DPM. When this is set,
+ * it overrides the proxy settings for every single network at the same time – that is, the
+ * system behaves as if the global proxy is the configured proxy for each network.
+ *
+ * Generally there are four ways for apps to look up the proxy.
+ * - Looking up the ProxyInfo in the LinkProperties for a network.
+ * - Listening to the PROXY_CHANGED_ACTION broadcast
+ * - Calling ConnectivityManager#getDefaultProxy, or ConnectivityManager#getProxyForNetwork
+ * which can be used to retrieve the proxy for any given network or the default network by
+ * passing null.
+ * - Reading the standard JVM properties (http{s,}.proxy{Host,Port}). See the Java
+ * distribution documentation for details on how these are supposed to work :
+ * https://docs.oracle.com/javase/8/docs/technotes/guides/net/proxies.html
+ * In Android, these are set by ActivityThread in each process in response to the broadcast.
+ * Many apps actually use these, and it's important they work because it's part of the
+ * Java standard, meaning they need to be set for existing Java libs to work on Android.
+ */
+ @Test
+ public void testPacProxy() throws Exception {
+ final Uri pacUrl = Uri.parse("https://pac-url");
+
+ final TestNetworkCallback cellCallback = new TestNetworkCallback();
+ final NetworkRequest cellRequest = new NetworkRequest.Builder()
+ .addTransportType(TRANSPORT_CELLULAR).build();
+ // Request cell to make sure it doesn't disconnect at an arbitrary point in the test,
+ // which would make testing the callbacks on it difficult.
+ mCm.requestNetwork(cellRequest, cellCallback);
+ mCellAgent = new TestNetworkAgentWrapper(TRANSPORT_CELLULAR);
+ mCellAgent.connect(true);
+ cellCallback.expectAvailableThenValidatedCallbacks(mCellAgent);
+
+ final TestNetworkCallback wifiCallback = new TestNetworkCallback();
+ final NetworkRequest wifiRequest = new NetworkRequest.Builder()
+ .addTransportType(TRANSPORT_WIFI).build();
+ mCm.registerNetworkCallback(wifiRequest, wifiCallback);
+
+ mWiFiAgent = new TestNetworkAgentWrapper(TRANSPORT_WIFI);
+ mWiFiAgent.connect(true);
+ wifiCallback.expectAvailableThenValidatedCallbacks(mWiFiAgent);
+ cellCallback.assertNoCallback();
+
+ final ProxyInfo initialProxyInfo = ProxyInfo.buildPacProxy(pacUrl);
+ final LinkProperties testLinkProperties = new LinkProperties();
+ testLinkProperties.setHttpProxy(initialProxyInfo);
+ mWiFiAgent.sendLinkProperties(testLinkProperties);
+ wifiCallback.expect(CallbackEntry.LINK_PROPERTIES_CHANGED, mWiFiAgent);
+ cellCallback.assertNoCallback();
+
+ // At first the local PAC proxy server is unstarted (see the description of what the local
+ // server is in the comment at the top of this method). It will contain the PAC URL and a
+ // port of -1 because it is unstarted. Check that all ways of getting that proxy info
+ // returns the same object that was initially created.
+ final ProxyInfo unstartedDefaultProxyInfo = mService.getProxyForNetwork(null);
+ final ProxyInfo unstartedWifiProxyInfo = mService.getProxyForNetwork(
+ mWiFiAgent.getNetwork());
+ final LinkProperties unstartedLp =
+ mService.getLinkProperties(mWiFiAgent.getNetwork());
+
+ assertEquals(initialProxyInfo, unstartedDefaultProxyInfo);
+ assertEquals(initialProxyInfo, unstartedWifiProxyInfo);
+ assertEquals(initialProxyInfo, unstartedLp.getHttpProxy());
+
+ // Make sure the cell network is unaffected. The LP are per-network and each network has
+ // its own configuration. The default proxy and broadcast are system-wide, and the JVM
+ // properties are per-process, and therefore can have only one value at any given time,
+ // so the code sets them to the proxy of the default network (TODO : really, since the
+ // default process is per-network, the JVM properties (http.proxyHost family – see
+ // the comment at the top of the method for details about these) also should be per-network
+ // and even the broadcast contents should be but none of this is implemented). The LP are
+ // still per-network, and a process that wants to use a non-default network is supposed to
+ // look up the proxy in its LP and it has to be correct.
+ assertNull(mService.getLinkProperties(mCellAgent.getNetwork()).getHttpProxy());
+ assertNull(mService.getProxyForNetwork(mCellAgent.getNetwork()));
+
+ // Simulate PacManager sending the notification that the local server has started
+ final ProxyInfo servingProxyInfo = new ProxyInfo(pacUrl, 2097);
+ final ExpectedBroadcast servingProxyBroadcast = expectProxyChangeAction(servingProxyInfo);
+ mService.simulateUpdateProxyInfo(mWiFiAgent.getNetwork(), servingProxyInfo);
+ wifiCallback.expect(CallbackEntry.LINK_PROPERTIES_CHANGED, mWiFiAgent);
+ cellCallback.assertNoCallback();
+ servingProxyBroadcast.expectBroadcast();
+
+ final ProxyInfo startedDefaultProxyInfo = mService.getProxyForNetwork(null);
+ final ProxyInfo startedWifiProxyInfo = mService.getProxyForNetwork(
+ mWiFiAgent.getNetwork());
+ final LinkProperties startedLp = mService.getLinkProperties(mWiFiAgent.getNetwork());
+ assertEquals(servingProxyInfo, startedDefaultProxyInfo);
+ assertEquals(servingProxyInfo, startedWifiProxyInfo);
+ assertEquals(servingProxyInfo, startedLp.getHttpProxy());
+ // Make sure the cell network is still unaffected
+ assertNull(mService.getLinkProperties(mCellAgent.getNetwork()).getHttpProxy());
+ assertNull(mService.getProxyForNetwork(mCellAgent.getNetwork()));
+
+ // Start an ethernet network which will become the default, in order to test what happens
+ // to the proxy of wifi while manipulating the proxy of ethernet.
+ final Uri ethPacUrl = Uri.parse("https://ethernet-pac-url");
+ final TestableNetworkCallback ethernetCallback = new TestableNetworkCallback();
+ final NetworkRequest ethernetRequest = new NetworkRequest.Builder()
+ .addTransportType(TRANSPORT_ETHERNET).build();
+ mEthernetAgent = new TestNetworkAgentWrapper(TRANSPORT_ETHERNET);
+ mCm.registerNetworkCallback(ethernetRequest, ethernetCallback);
+ mEthernetAgent.connect(true);
+ ethernetCallback.expectAvailableThenValidatedCallbacks(mEthernetAgent);
+
+ // Wifi is no longer the default, so it should get a callback to LP changed with a PAC
+ // proxy but a port of -1 (since the local proxy doesn't serve wifi now)
+ wifiCallback.expect(LINK_PROPERTIES_CHANGED, mWiFiAgent,
+ lp -> lp.getLp().getHttpProxy().getPort() == -1
+ && lp.getLp().getHttpProxy().isPacProxy());
+ // Wifi is lingered as it was the default but is no longer serving any request.
+ wifiCallback.expect(CallbackEntry.LOSING, mWiFiAgent);
+
+ // Now arrange for Ethernet to have a PAC proxy.
+ final ProxyInfo ethProxy = ProxyInfo.buildPacProxy(ethPacUrl);
+ final LinkProperties ethLinkProperties = new LinkProperties();
+ ethLinkProperties.setHttpProxy(ethProxy);
+ mEthernetAgent.sendLinkProperties(ethLinkProperties);
+ ethernetCallback.expect(CallbackEntry.LINK_PROPERTIES_CHANGED, mEthernetAgent);
+ // Default network is Ethernet
+ assertEquals(ethProxy, mService.getProxyForNetwork(null));
+ assertEquals(ethProxy, mService.getProxyForNetwork(mEthernetAgent.getNetwork()));
+ // Proxy info for WiFi ideally should be the old one with the old server still running,
+ // but as the PAC code only handles one server at any given time, this can't work. Wifi
+ // having null as a proxy also won't work (apps using WiFi will try to access the network
+ // without proxy) but is not as bad as having the new proxy (that would send requests
+ // over the default network).
+ assertEquals(initialProxyInfo, mService.getProxyForNetwork(mWiFiAgent.getNetwork()));
+ assertNull(mService.getProxyForNetwork(mCellAgent.getNetwork()));
+
+ // Expect the local PAC proxy server starts to serve the proxy on Ethernet. Use
+ // simulateUpdateProxyInfo to simulate this, and check that the callback is called to
+ // inform apps of the port and that the various networks have the expected proxies in
+ // their link properties.
+ final ProxyInfo servingEthProxy = new ProxyInfo(ethPacUrl, 2099);
+ final ExpectedBroadcast servingEthProxyBroadcast = expectProxyChangeAction(servingEthProxy);
+ final ExpectedBroadcast servingProxyBroadcast2 = expectProxyChangeAction(servingProxyInfo);
+ mService.simulateUpdateProxyInfo(mEthernetAgent.getNetwork(), servingEthProxy);
+ ethernetCallback.expect(CallbackEntry.LINK_PROPERTIES_CHANGED, mEthernetAgent);
+ assertEquals(servingEthProxy, mService.getProxyForNetwork(null));
+ assertEquals(servingEthProxy, mService.getProxyForNetwork(mEthernetAgent.getNetwork()));
+ assertEquals(initialProxyInfo, mService.getProxyForNetwork(mWiFiAgent.getNetwork()));
+ assertNull(mService.getProxyForNetwork(mCellAgent.getNetwork()));
+ servingEthProxyBroadcast.expectBroadcast();
+
+ // Ethernet disconnects, back to WiFi
+ mEthernetAgent.disconnect();
+ ethernetCallback.expect(CallbackEntry.LOST, mEthernetAgent);
+
+ // WiFi is now the default network again. However, the local proxy server does not serve
+ // WiFi at this time, so at this time a proxy with port -1 is still the correct value.
+ // In time, the local proxy server for ethernet will be downed and the local proxy server
+ // for WiFi will be restarted, and WiFi will see an update to its LP with the new port,
+ // but in this test this won't happen until the test simulates the local proxy starting
+ // up for WiFi (which is done just a few lines below). This is therefore the perfect place
+ // to check that WiFi is unaffected until the new local proxy starts up.
+ wifiCallback.assertNoCallback();
+ assertEquals(initialProxyInfo, mService.getProxyForNetwork(null));
+ assertEquals(initialProxyInfo, mService.getProxyForNetwork(mWiFiAgent.getNetwork()));
+ assertNull(mService.getProxyForNetwork(mCellAgent.getNetwork()));
+ // Note : strictly speaking, for correctness here apps should expect a broadcast with a
+ // port of -1, since that's the current default proxy. The code does not send this
+ // broadcast. In practice though, not sending it is more useful since the new proxy will
+ // start momentarily, so broadcasting and getting all apps to update and retry once now
+ // and again in 250ms is kind of counter-productive, so don't fix this bug.
+
+ // After a while the PAC file for wifi is resolved again and the local proxy server
+ // starts up. This should cause a LP event to inform clients of the port to access the
+ // proxy server for wifi.
+ mService.simulateUpdateProxyInfo(mWiFiAgent.getNetwork(), servingProxyInfo);
+ wifiCallback.expect(CallbackEntry.LINK_PROPERTIES_CHANGED, mWiFiAgent);
+ assertEquals(servingProxyInfo, mService.getProxyForNetwork(null));
+ assertEquals(servingProxyInfo, mService.getProxyForNetwork(mWiFiAgent.getNetwork()));
+ assertNull(mService.getProxyForNetwork(mCellAgent.getNetwork()));
+ servingProxyBroadcast2.expectBroadcast();
+
+ // Expect a broadcast for an empty proxy after wifi disconnected, because cell is now
+ // the default network and it doesn't have a proxy. Whether "no proxy" is a null pointer
+ // or a ProxyInfo with an empty host doesn't matter because both are correct, so this test
+ // accepts both.
+ final ExpectedBroadcast emptyProxyBroadcast = expectProxyChangeAction(
+ proxy -> proxy == null || TextUtils.isEmpty(proxy.getHost()));
+ mWiFiAgent.disconnect();
+ emptyProxyBroadcast.expectBroadcast();
+ wifiCallback.expect(CallbackEntry.LOST, mWiFiAgent);
+ assertNull(mService.getProxyForNetwork(null));
+ assertNull(mService.getLinkProperties(mCellAgent.getNetwork()).getHttpProxy());
+ assertNull(mService.getGlobalProxy());
+
+ mCm.unregisterNetworkCallback(cellCallback);
+ }
+
+ @Test
+ public void testPacProxy_NetworkDisconnects_BroadcastSent() throws Exception {
+ // Make a WiFi network with a PAC URI.
+ final Uri pacUrl = Uri.parse("https://pac-url");
+ final ProxyInfo initialProxyInfo = ProxyInfo.buildPacProxy(pacUrl);
+ final LinkProperties testLinkProperties = new LinkProperties();
+ testLinkProperties.setHttpProxy(initialProxyInfo);
+
+ final TestNetworkCallback wifiCallback = new TestNetworkCallback();
+ final NetworkRequest wifiRequest = new NetworkRequest.Builder()
+ .addTransportType(TRANSPORT_WIFI).build();
+ mCm.registerNetworkCallback(wifiRequest, wifiCallback);
+
+ mWiFiAgent = new TestNetworkAgentWrapper(TRANSPORT_WIFI, testLinkProperties);
+ mWiFiAgent.connect(true);
+ // Wifi is up, but the local proxy server hasn't started yet.
+ wifiCallback.expectAvailableThenValidatedCallbacks(mWiFiAgent);
+
+ // Simulate PacManager sending the notification that the local server has started
+ final ProxyInfo servingProxyInfo = new ProxyInfo(pacUrl, 2097);
+ final ExpectedBroadcast servingProxyBroadcast = expectProxyChangeAction(servingProxyInfo);
+ mService.simulateUpdateProxyInfo(mWiFiAgent.getNetwork(), servingProxyInfo);
+ wifiCallback.expect(CallbackEntry.LINK_PROPERTIES_CHANGED, mWiFiAgent);
+ servingProxyBroadcast.expectBroadcast();
+
+ // Now disconnect Wi-Fi and make sure there is a broadcast for some empty proxy. Whether
+ // the "empty" proxy is a null pointer or a ProxyInfo with an empty host doesn't matter
+ // because both are correct, so this test accepts both.
+ final ExpectedBroadcast emptyProxyBroadcast = expectProxyChangeAction(
+ proxy -> proxy == null || TextUtils.isEmpty(proxy.getHost()));
+ mWiFiAgent.disconnect();
+ wifiCallback.expect(CallbackEntry.LOST, mWiFiAgent);
+ emptyProxyBroadcast.expectBroadcast();
+ }
+
@Test
public void testGetProxyForVPN() throws Exception {
final ProxyInfo testProxyInfo = ProxyInfo.buildDirectProxy("test", 8888);
@@ -11143,7 +11832,7 @@
mMockVpn.establish(lp, uid, vpnRange);
assertVpnUidRangesUpdated(true, vpnRange, uid);
- if (SdkLevel.isAtLeastT()) {
+ if (mDeps.isAtLeastT()) {
// On T and above, VPN should have rules for null interface. Null Interface is a
// wildcard and this accepts traffic from all the interfaces.
// There are two expected invocations, one during the VPN initial
@@ -12132,7 +12821,7 @@
@Test
public void testUnderlyingNetworksWillBeSetInNetworkAgentInfoConstructor() throws Exception {
- assumeTrue(SdkLevel.isAtLeastT());
+ assumeTrue(mDeps.isAtLeastT());
final Network network1 = new Network(100);
final Network network2 = new Network(101);
final List<Network> underlyingNetworks = new ArrayList<>();
@@ -12458,12 +13147,18 @@
private void assertVpnUidRangesUpdated(boolean add, Set<UidRange> vpnRanges, int exemptUid)
throws Exception {
- InOrder inOrder = inOrder(mMockNetd);
+ InOrder inOrder = inOrder(mMockNetd, mDestroySocketsWrapper);
+ final Set<Integer> exemptUidSet = new ArraySet<>(List.of(exemptUid, Process.VPN_UID));
ArgumentCaptor<int[]> exemptUidCaptor = ArgumentCaptor.forClass(int[].class);
- inOrder.verify(mMockNetd, times(1)).socketDestroy(eq(toUidRangeStableParcels(vpnRanges)),
- exemptUidCaptor.capture());
- assertContainsExactly(exemptUidCaptor.getValue(), Process.VPN_UID, exemptUid);
+ if (mDeps.isAtLeastU()) {
+ inOrder.verify(mDestroySocketsWrapper).destroyLiveTcpSockets(
+ UidRange.toIntRanges(vpnRanges), exemptUidSet);
+ } else {
+ inOrder.verify(mMockNetd).socketDestroy(eq(toUidRangeStableParcels(vpnRanges)),
+ exemptUidCaptor.capture());
+ assertContainsExactly(exemptUidCaptor.getValue(), Process.VPN_UID, exemptUid);
+ }
if (add) {
inOrder.verify(mMockNetd, times(1)).networkAddUidRangesParcel(
@@ -12475,9 +13170,14 @@
toUidRangeStableParcels(vpnRanges), PREFERENCE_ORDER_VPN));
}
- inOrder.verify(mMockNetd, times(1)).socketDestroy(eq(toUidRangeStableParcels(vpnRanges)),
- exemptUidCaptor.capture());
- assertContainsExactly(exemptUidCaptor.getValue(), Process.VPN_UID, exemptUid);
+ if (mDeps.isAtLeastU()) {
+ inOrder.verify(mDestroySocketsWrapper).destroyLiveTcpSockets(
+ UidRange.toIntRanges(vpnRanges), exemptUidSet);
+ } else {
+ inOrder.verify(mMockNetd).socketDestroy(eq(toUidRangeStableParcels(vpnRanges)),
+ exemptUidCaptor.capture());
+ assertContainsExactly(exemptUidCaptor.getValue(), Process.VPN_UID, exemptUid);
+ }
}
@Test
@@ -14982,7 +15682,7 @@
UserHandle testHandle,
TestNetworkCallback profileDefaultNetworkCallback,
TestNetworkCallback disAllowProfileDefaultNetworkCallback) throws Exception {
- final InOrder inOrder = inOrder(mMockNetd);
+ final InOrder inOrder = inOrder(mMockNetd, mMockDnsResolver);
mCellAgent = new TestNetworkAgentWrapper(TRANSPORT_CELLULAR);
mCellAgent.connect(true);
@@ -14998,8 +15698,16 @@
final TestNetworkAgentWrapper workAgent =
makeEnterpriseNetworkAgent(profileNetworkPreference.getPreferenceEnterpriseId());
+ if (mService.shouldCreateNetworksImmediately()) {
+ expectNativeNetworkCreated(workAgent.getNetwork().netId, INetd.PERMISSION_SYSTEM,
+ null /* iface */, inOrder);
+ }
if (connectWorkProfileAgentAhead) {
workAgent.connect(false);
+ if (!mService.shouldCreateNetworksImmediately()) {
+ expectNativeNetworkCreated(workAgent.getNetwork().netId, INetd.PERMISSION_SYSTEM,
+ null /* iface */, inOrder);
+ }
}
final TestOnCompleteListener listener = new TestOnCompleteListener();
@@ -15039,6 +15747,11 @@
if (!connectWorkProfileAgentAhead) {
workAgent.connect(false);
+ if (!mService.shouldCreateNetworksImmediately()) {
+ inOrder.verify(mMockNetd).networkCreate(
+ nativeNetworkConfigPhysical(workAgent.getNetwork().netId,
+ INetd.PERMISSION_SYSTEM));
+ }
}
profileDefaultNetworkCallback.expectAvailableCallbacksUnvalidated(workAgent);
@@ -15047,8 +15760,6 @@
}
mSystemDefaultNetworkCallback.assertNoCallback();
mDefaultNetworkCallback.assertNoCallback();
- inOrder.verify(mMockNetd).networkCreate(
- nativeNetworkConfigPhysical(workAgent.getNetwork().netId, INetd.PERMISSION_SYSTEM));
inOrder.verify(mMockNetd).networkAddUidRangesParcel(new NativeUidRangeConfig(
workAgent.getNetwork().netId,
uidRangeFor(testHandle, profileNetworkPreference),
@@ -16016,7 +16727,7 @@
mCellAgent.getNetwork().netId,
toUidRangeStableParcels(allowedRanges),
0 /* subPriority */);
- if (SdkLevel.isAtLeastU()) {
+ if (mDeps.isAtLeastU()) {
inOrder.verify(mMockNetd).setNetworkAllowlist(new NativeUidRangeConfig[]{config1User});
} else {
inOrder.verify(mMockNetd, never()).setNetworkAllowlist(any());
@@ -16034,7 +16745,7 @@
mCellAgent.getNetwork().netId,
toUidRangeStableParcels(allowedRanges),
0 /* subPriority */);
- if (SdkLevel.isAtLeastU()) {
+ if (mDeps.isAtLeastU()) {
inOrder.verify(mMockNetd).setNetworkAllowlist(new NativeUidRangeConfig[]{config2Users});
} else {
inOrder.verify(mMockNetd, never()).setNetworkAllowlist(any());
@@ -16065,7 +16776,7 @@
mCellAgent.getNetwork().netId,
allowAllUidRangesParcel,
0 /* subPriority */);
- if (SdkLevel.isAtLeastU()) {
+ if (mDeps.isAtLeastU()) {
inOrder.verify(mMockNetd).setNetworkAllowlist(
new NativeUidRangeConfig[]{cellAllAllowedConfig});
} else {
@@ -16084,7 +16795,7 @@
// making the order of the list undeterministic. Thus, verify this in order insensitive way.
final ArgumentCaptor<NativeUidRangeConfig[]> configsCaptor = ArgumentCaptor.forClass(
NativeUidRangeConfig[].class);
- if (SdkLevel.isAtLeastU()) {
+ if (mDeps.isAtLeastU()) {
inOrder.verify(mMockNetd).setNetworkAllowlist(configsCaptor.capture());
assertContainsAll(List.of(configsCaptor.getValue()),
List.of(cellAllAllowedConfig, enterpriseAllAllowedConfig));
@@ -16118,7 +16829,7 @@
mCellAgent.getNetwork().netId,
excludeAppRangesParcel,
0 /* subPriority */);
- if (SdkLevel.isAtLeastU()) {
+ if (mDeps.isAtLeastU()) {
inOrder.verify(mMockNetd).setNetworkAllowlist(configsCaptor.capture());
assertContainsAll(List.of(configsCaptor.getValue()),
List.of(cellExcludeAppConfig, enterpriseAllAllowedConfig));
@@ -16130,7 +16841,7 @@
mCm.setProfileNetworkPreference(testHandle, PROFILE_NETWORK_PREFERENCE_ENTERPRISE,
r -> r.run(), listener);
listener.expectOnComplete();
- if (SdkLevel.isAtLeastU()) {
+ if (mDeps.isAtLeastU()) {
inOrder.verify(mMockNetd).setNetworkAllowlist(configsCaptor.capture());
assertContainsAll(List.of(configsCaptor.getValue()),
List.of(cellAllAllowedConfig, enterpriseAllAllowedConfig));
@@ -16142,7 +16853,7 @@
// disconnects.
enterpriseAgent.disconnect();
waitForIdle();
- if (SdkLevel.isAtLeastU()) {
+ if (mDeps.isAtLeastU()) {
inOrder.verify(mMockNetd).setNetworkAllowlist(
new NativeUidRangeConfig[]{cellAllAllowedConfig});
} else {
@@ -16167,7 +16878,7 @@
List.of(prefBuilder.build()),
r -> r.run(), listener);
listener.expectOnComplete();
- if (SdkLevel.isAtLeastU()) {
+ if (mDeps.isAtLeastU()) {
inOrder.verify(mMockNetd).setNetworkAllowlist(new NativeUidRangeConfig[]{});
} else {
inOrder.verify(mMockNetd, never()).setNetworkAllowlist(any());
@@ -16195,7 +16906,7 @@
mCellAgent.getNetwork().netId,
excludeAppRangesParcel,
0 /* subPriority */);
- if (SdkLevel.isAtLeastU()) {
+ if (mDeps.isAtLeastU()) {
inOrder.verify(mMockNetd).setNetworkAllowlist(
new NativeUidRangeConfig[]{cellExcludeAppConfig});
} else {
@@ -16219,7 +16930,7 @@
// making the order of the list undeterministic. Thus, verify this in order insensitive way.
final ArgumentCaptor<NativeUidRangeConfig[]> configsCaptor = ArgumentCaptor.forClass(
NativeUidRangeConfig[].class);
- if (SdkLevel.isAtLeastU()) {
+ if (mDeps.isAtLeastU()) {
inOrder.verify(mMockNetd).setNetworkAllowlist(configsCaptor.capture());
assertContainsAll(List.of(configsCaptor.getValue()),
List.of(enterpriseAllAllowedConfig, cellExcludeAppConfig));
@@ -16230,7 +16941,7 @@
// Verify issuing with cellular set only when enterprise network disconnects.
enterpriseAgent.disconnect();
waitForIdle();
- if (SdkLevel.isAtLeastU()) {
+ if (mDeps.isAtLeastU()) {
inOrder.verify(mMockNetd).setNetworkAllowlist(
new NativeUidRangeConfig[]{cellExcludeAppConfig});
} else {
@@ -16239,7 +16950,7 @@
mCellAgent.disconnect();
waitForIdle();
- if (SdkLevel.isAtLeastU()) {
+ if (mDeps.isAtLeastU()) {
inOrder.verify(mMockNetd).setNetworkAllowlist(new NativeUidRangeConfig[]{});
} else {
inOrder.verify(mMockNetd, never()).setNetworkAllowlist(any());
@@ -16295,7 +17006,7 @@
profileNetworkPreferenceBuilder.setPreference(PROFILE_NETWORK_PREFERENCE_ENTERPRISE);
profileNetworkPreferenceBuilder.setPreferenceEnterpriseId(NET_ENTERPRISE_ID_1);
final TestOnCompleteListener listener = new TestOnCompleteListener();
- if (SdkLevel.isAtLeastT()) {
+ if (mDeps.isAtLeastT()) {
mCm.setProfileNetworkPreferences(testHandle,
List.of(profileNetworkPreferenceBuilder.build()),
r -> r.run(), listener);
@@ -16403,7 +17114,7 @@
agent.getNetwork().getNetId(),
intToUidRangeStableParcels(uids),
preferenceOrder);
- if (SdkLevel.isAtLeastT()) {
+ if (mDeps.isAtLeastT()) {
inOrder.verify(mMockNetd, times(1)).networkAddUidRangesParcel(uids200Parcel);
}
@@ -16411,7 +17122,7 @@
uids.add(400);
nc.setAllowedUids(uids);
agent.setNetworkCapabilities(nc, true /* sendToConnectivityService */);
- if (SdkLevel.isAtLeastT()) {
+ if (mDeps.isAtLeastT()) {
cb.expectCaps(agent, c -> c.getAllowedUids().equals(uids));
} else {
cb.assertNoCallback();
@@ -16422,13 +17133,13 @@
agent.getNetwork().getNetId(),
intToUidRangeStableParcels(uids),
preferenceOrder);
- if (SdkLevel.isAtLeastT()) {
+ if (mDeps.isAtLeastT()) {
inOrder.verify(mMockNetd, times(1)).networkAddUidRangesParcel(uids300400Parcel);
}
nc.setAllowedUids(uids);
agent.setNetworkCapabilities(nc, true /* sendToConnectivityService */);
- if (SdkLevel.isAtLeastT()) {
+ if (mDeps.isAtLeastT()) {
cb.expectCaps(agent, c -> c.getAllowedUids().equals(uids));
inOrder.verify(mMockNetd, times(1)).networkRemoveUidRangesParcel(uids200Parcel);
} else {
@@ -16439,7 +17150,7 @@
uids.add(600);
nc.setAllowedUids(uids);
agent.setNetworkCapabilities(nc, true /* sendToConnectivityService */);
- if (SdkLevel.isAtLeastT()) {
+ if (mDeps.isAtLeastT()) {
cb.expectCaps(agent, c -> c.getAllowedUids().equals(uids));
} else {
cb.assertNoCallback();
@@ -16448,7 +17159,7 @@
agent.getNetwork().getNetId(),
intToUidRangeStableParcels(uids),
preferenceOrder);
- if (SdkLevel.isAtLeastT()) {
+ if (mDeps.isAtLeastT()) {
inOrder.verify(mMockNetd, times(1)).networkAddUidRangesParcel(uids600Parcel);
inOrder.verify(mMockNetd, times(1)).networkRemoveUidRangesParcel(uids300400Parcel);
}
@@ -16456,7 +17167,7 @@
uids.clear();
nc.setAllowedUids(uids);
agent.setNetworkCapabilities(nc, true /* sendToConnectivityService */);
- if (SdkLevel.isAtLeastT()) {
+ if (mDeps.isAtLeastT()) {
cb.expectCaps(agent, c -> c.getAllowedUids().isEmpty());
inOrder.verify(mMockNetd, times(1)).networkRemoveUidRangesParcel(uids600Parcel);
} else {
@@ -16509,7 +17220,7 @@
// Cell gets to set the service UID as access UID
ncb.setAllowedUids(serviceUidSet);
mEthernetAgent.setNetworkCapabilities(ncb.build(), true /* sendToCS */);
- if (SdkLevel.isAtLeastT() && hasAutomotiveFeature) {
+ if (mDeps.isAtLeastT() && hasAutomotiveFeature) {
cb.expectCaps(mEthernetAgent, c -> c.getAllowedUids().equals(serviceUidSet));
} else {
// S and no automotive feature must ignore access UIDs.
@@ -16562,7 +17273,7 @@
cb.expectAvailableThenValidatedCallbacks(mCellAgent);
ncb.setAllowedUids(serviceUidSet);
mCellAgent.setNetworkCapabilities(ncb.build(), true /* sendToCS */);
- if (SdkLevel.isAtLeastT()) {
+ if (mDeps.isAtLeastT()) {
cb.expectCaps(mCellAgent, c -> c.getAllowedUids().equals(serviceUidSet));
} else {
// S must ignore access UIDs.
@@ -16572,7 +17283,7 @@
// ...but not to some other UID. Rejection sets UIDs to the empty set
ncb.setAllowedUids(nonServiceUidSet);
mCellAgent.setNetworkCapabilities(ncb.build(), true /* sendToCS */);
- if (SdkLevel.isAtLeastT()) {
+ if (mDeps.isAtLeastT()) {
cb.expectCaps(mCellAgent, c -> c.getAllowedUids().isEmpty());
} else {
// S must ignore access UIDs.
@@ -16973,6 +17684,7 @@
} finally {
cellFactory.terminate();
handlerThread.quitSafely();
+ handlerThread.join();
}
}
@@ -17493,14 +18205,14 @@
@Test
public void testIgnoreValidationAfterRoamEnabled() throws Exception {
- final boolean enabled = !SdkLevel.isAtLeastT();
+ final boolean enabled = !mDeps.isAtLeastT();
doTestIgnoreValidationAfterRoam(5_000, enabled);
}
@Test
public void testShouldIgnoreValidationFailureAfterRoam() {
// Always disabled on T+.
- assumeFalse(SdkLevel.isAtLeastT());
+ assumeFalse(mDeps.isAtLeastT());
NetworkAgentInfo nai = fakeWifiNai(new NetworkCapabilities());
@@ -17558,18 +18270,93 @@
});
}
+ private void verifyMtuSetOnWifiInterface(int mtu) throws Exception {
+ verify(mMockNetd, times(1)).interfaceSetMtu(WIFI_IFNAME, mtu);
+ }
+
+ private void verifyMtuNeverSetOnWifiInterface() throws Exception {
+ verify(mMockNetd, never()).interfaceSetMtu(eq(WIFI_IFNAME), anyInt());
+ }
+
+ private void verifyMtuSetOnWifiInterfaceOnlyUpToT(int mtu) throws Exception {
+ if (!mService.shouldCreateNetworksImmediately()) {
+ verify(mMockNetd, times(1)).interfaceSetMtu(WIFI_IFNAME, mtu);
+ } else {
+ verify(mMockNetd, never()).interfaceSetMtu(eq(WIFI_IFNAME), anyInt());
+ }
+ }
+
+ private void verifyMtuSetOnWifiInterfaceOnlyStartingFromU(int mtu) throws Exception {
+ if (mService.shouldCreateNetworksImmediately()) {
+ verify(mMockNetd, times(1)).interfaceSetMtu(WIFI_IFNAME, mtu);
+ } else {
+ verify(mMockNetd, never()).interfaceSetMtu(eq(WIFI_IFNAME), anyInt());
+ }
+ }
+
@Test
- public void testSendLinkPropertiesSetInterfaceMtu() throws Exception {
- final int mtu = 1327;
+ public void testSendLinkPropertiesSetInterfaceMtuBeforeConnect() throws Exception {
+ final int mtu = 1281;
LinkProperties lp = new LinkProperties();
lp.setInterfaceName(WIFI_IFNAME);
lp.setMtu(mtu);
mWiFiAgent = new TestNetworkAgentWrapper(TRANSPORT_WIFI);
mWiFiAgent.sendLinkProperties(lp);
-
waitForIdle();
- verify(mMockNetd).interfaceSetMtu(eq(WIFI_IFNAME), eq(mtu));
+ verifyMtuSetOnWifiInterface(mtu);
+ reset(mMockNetd);
+
+ mWiFiAgent.connect(false /* validated */);
+ // Before U, the MTU is always (re-)applied when the network connects.
+ verifyMtuSetOnWifiInterfaceOnlyUpToT(mtu);
+ }
+
+ @Test
+ public void testSendLinkPropertiesUpdateInterfaceMtuBeforeConnect() throws Exception {
+ final int mtu = 1327;
+ LinkProperties lp = new LinkProperties();
+ lp.setInterfaceName(WIFI_IFNAME);
+ lp.setMtu(mtu);
+
+ // Registering an agent with an MTU only sets the MTU on U+.
+ mWiFiAgent = new TestNetworkAgentWrapper(TRANSPORT_WIFI, lp);
+ waitForIdle();
+ verifyMtuSetOnWifiInterfaceOnlyStartingFromU(mtu);
+ reset(mMockNetd);
+
+ // Future updates with the same MTU don't set the MTU even on T when it's not set initially.
+ mWiFiAgent.sendLinkProperties(lp);
+ waitForIdle();
+ verifyMtuNeverSetOnWifiInterface();
+
+ // Updating with a different MTU does work.
+ lp.setMtu(mtu + 1);
+ mWiFiAgent.sendLinkProperties(lp);
+ waitForIdle();
+ verifyMtuSetOnWifiInterface(mtu + 1);
+ reset(mMockNetd);
+
+ mWiFiAgent.connect(false /* validated */);
+ // Before U, the MTU is always (re-)applied when the network connects.
+ verifyMtuSetOnWifiInterfaceOnlyUpToT(mtu + 1);
+ }
+
+ @Test
+ public void testSendLinkPropertiesUpdateInterfaceMtuAfterConnect() throws Exception {
+ final int mtu = 1327;
+ LinkProperties lp = new LinkProperties();
+ lp.setInterfaceName(WIFI_IFNAME);
+ lp.setMtu(mtu);
+
+ mWiFiAgent = new TestNetworkAgentWrapper(TRANSPORT_WIFI);
+ mWiFiAgent.connect(false /* validated */);
+ verifyMtuNeverSetOnWifiInterface();
+
+ mWiFiAgent.sendLinkProperties(lp);
+ waitForIdle();
+ // The MTU is always (re-)applied when the network connects.
+ verifyMtuSetOnWifiInterface(mtu);
}
@Test
@@ -17580,14 +18367,15 @@
lp.setMtu(mtu);
mWiFiAgent = new TestNetworkAgentWrapper(TRANSPORT_WIFI, lp);
+ mWiFiAgent.connect(false /* validated */);
+ verifyMtuSetOnWifiInterface(mtu);
+ reset(mMockNetd);
LinkProperties lp2 = new LinkProperties(lp);
lp2.setMtu(mtu2);
-
mWiFiAgent.sendLinkProperties(lp2);
-
waitForIdle();
- verify(mMockNetd).interfaceSetMtu(eq(WIFI_IFNAME), eq(mtu2));
+ verifyMtuSetOnWifiInterface(mtu2);
}
@Test
@@ -17598,10 +18386,13 @@
lp.setMtu(mtu);
mWiFiAgent = new TestNetworkAgentWrapper(TRANSPORT_WIFI, lp);
- mWiFiAgent.sendLinkProperties(new LinkProperties(lp));
+ mWiFiAgent.connect(false /* validated */);
+ verifyMtuSetOnWifiInterface(mtu);
+ reset(mMockNetd);
+ mWiFiAgent.sendLinkProperties(new LinkProperties(lp));
waitForIdle();
- verify(mMockNetd, never()).interfaceSetMtu(eq(WIFI_IFNAME), anyInt());
+ verifyMtuNeverSetOnWifiInterface();
}
@Test
@@ -17612,15 +18403,15 @@
lp.setMtu(mtu);
mWiFiAgent = new TestNetworkAgentWrapper(TRANSPORT_WIFI, lp);
+ mWiFiAgent.connect(false /* validated */);
+ verifyMtuSetOnWifiInterface(mtu);
+ reset(mMockNetd);
- LinkProperties lp2 = new LinkProperties();
- assertNull(lp2.getInterfaceName());
- lp2.setMtu(mtu);
-
+ LinkProperties lp2 = new LinkProperties(lp);
+ lp2.setInterfaceName(null);
mWiFiAgent.sendLinkProperties(new LinkProperties(lp2));
-
waitForIdle();
- verify(mMockNetd, never()).interfaceSetMtu(any(), anyInt());
+ verifyMtuNeverSetOnWifiInterface();
}
@Test
@@ -17631,16 +18422,18 @@
lp.setMtu(mtu);
mWiFiAgent = new TestNetworkAgentWrapper(TRANSPORT_WIFI, lp);
+ mWiFiAgent.connect(false /* validated */);
+ verifyMtuSetOnWifiInterface(mtu);
+ reset(mMockNetd);
final String ifaceName2 = WIFI_IFNAME + "_2";
- LinkProperties lp2 = new LinkProperties();
+ LinkProperties lp2 = new LinkProperties(lp);
lp2.setInterfaceName(ifaceName2);
- lp2.setMtu(mtu);
mWiFiAgent.sendLinkProperties(new LinkProperties(lp2));
-
waitForIdle();
- verify(mMockNetd).interfaceSetMtu(eq(ifaceName2), eq(mtu));
+ verify(mMockNetd, times(1)).interfaceSetMtu(eq(ifaceName2), eq(mtu));
+ verifyMtuNeverSetOnWifiInterface();
}
@Test
@@ -17652,4 +18445,108 @@
info.setExtraInfo("test_info");
assertEquals("0;2;test_info", createDeliveryGroupKeyForConnectivityAction(info));
}
+
+ @Test
+ public void testNetdWakeupAddInterfaceForWifiTransport() throws Exception {
+ final LinkProperties wifiLp = new LinkProperties();
+ wifiLp.setInterfaceName(WIFI_IFNAME);
+ mWiFiAgent = new TestNetworkAgentWrapper(TRANSPORT_WIFI, wifiLp);
+ mWiFiAgent.connect(false /* validated */);
+
+ final String expectedPrefix = makeNflogPrefix(WIFI_IFNAME,
+ mWiFiAgent.getNetwork().getNetworkHandle());
+ verify(mMockNetd).wakeupAddInterface(WIFI_IFNAME, expectedPrefix, PACKET_WAKEUP_MARK_MASK,
+ PACKET_WAKEUP_MARK_MASK);
+ }
+
+ @Test
+ public void testNetdWakeupAddInterfaceForCellularTransport() throws Exception {
+ final LinkProperties cellLp = new LinkProperties();
+ cellLp.setInterfaceName(MOBILE_IFNAME);
+ mCellAgent = new TestNetworkAgentWrapper(TRANSPORT_CELLULAR, cellLp);
+ mCellAgent.connect(false /* validated */);
+
+ if (mDeps.isAtLeastU()) {
+ final String expectedPrefix = makeNflogPrefix(MOBILE_IFNAME,
+ mCellAgent.getNetwork().getNetworkHandle());
+ verify(mMockNetd).wakeupAddInterface(MOBILE_IFNAME, expectedPrefix,
+ PACKET_WAKEUP_MARK_MASK, PACKET_WAKEUP_MARK_MASK);
+ } else {
+ verify(mMockNetd, never()).wakeupAddInterface(eq(MOBILE_IFNAME), anyString(), anyInt(),
+ anyInt());
+ }
+ }
+
+ @Test
+ public void testNetdWakeupAddInterfaceForEthernetTransport() throws Exception {
+ final String ethernetIface = "eth42";
+
+ final LinkProperties ethLp = new LinkProperties();
+ ethLp.setInterfaceName(ethernetIface);
+ mEthernetAgent = new TestNetworkAgentWrapper(TRANSPORT_ETHERNET, ethLp);
+ mEthernetAgent.connect(false /* validated */);
+
+ verify(mMockNetd, never()).wakeupAddInterface(eq(ethernetIface), anyString(), anyInt(),
+ anyInt());
+ }
+
+ private static final int TEST_FROZEN_UID = 1000;
+ private static final int TEST_UNFROZEN_UID = 2000;
+
+ /**
+ * Send a UidFrozenStateChanged message to ConnectivityService. Verify that only the frozen UID
+ * gets passed to socketDestroy().
+ */
+ @Test
+ @IgnoreUpTo(Build.VERSION_CODES.TIRAMISU)
+ public void testFrozenUidSocketDestroy() throws Exception {
+ ArgumentCaptor<UidFrozenStateChangedCallback> callbackArg =
+ ArgumentCaptor.forClass(UidFrozenStateChangedCallback.class);
+
+ verify(mActivityManager).registerUidFrozenStateChangedCallback(any(),
+ callbackArg.capture());
+
+ final int[] uids = {TEST_FROZEN_UID, TEST_UNFROZEN_UID};
+ final int[] frozenStates = {UID_FROZEN_STATE_FROZEN, UID_FROZEN_STATE_UNFROZEN};
+
+ callbackArg.getValue().onUidFrozenStateChanged(uids, frozenStates);
+
+ waitForIdle();
+
+ final Set<Integer> exemptUids = new ArraySet();
+ final UidRange frozenUidRange = new UidRange(TEST_FROZEN_UID, TEST_FROZEN_UID);
+ final Set<UidRange> ranges = Collections.singleton(frozenUidRange);
+
+ verify(mDestroySocketsWrapper).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();
+
+ verifyClatdStop(null /* inOrder */, MOBILE_IFNAME);
+ }
}
diff --git a/tests/unit/java/com/android/server/NsdServiceTest.java b/tests/unit/java/com/android/server/NsdServiceTest.java
index 3dc5647..f51b28d 100644
--- a/tests/unit/java/com/android/server/NsdServiceTest.java
+++ b/tests/unit/java/com/android/server/NsdServiceTest.java
@@ -16,12 +16,22 @@
package com.android.server;
+import static android.app.ActivityManager.RunningAppProcessInfo.IMPORTANCE_CACHED;
+import static android.app.ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND;
+import static android.app.ActivityManager.RunningAppProcessInfo.IMPORTANCE_GONE;
+import static android.app.ActivityManager.RunningAppProcessInfo.IMPORTANCE_VISIBLE;
import static android.net.InetAddresses.parseNumericAddress;
+import static android.net.NetworkCapabilities.TRANSPORT_ETHERNET;
+import static android.net.NetworkCapabilities.TRANSPORT_VPN;
+import static android.net.NetworkCapabilities.TRANSPORT_WIFI;
+import static android.net.connectivity.ConnectivityCompatChanges.ENABLE_PLATFORM_MDNS_BACKEND;
+import static android.net.connectivity.ConnectivityCompatChanges.RUN_NATIVE_NSD_ONLY_IF_LEGACY_APPS_T_AND_LATER;
import static android.net.nsd.NsdManager.FAILURE_BAD_PARAMETERS;
import static android.net.nsd.NsdManager.FAILURE_INTERNAL_ERROR;
import static android.net.nsd.NsdManager.FAILURE_OPERATION_NOT_RUNNING;
-import static com.android.server.NsdService.constructServiceType;
+import static com.android.server.NsdService.DEFAULT_RUNNING_APP_ACTIVE_IMPORTANCE_CUTOFF;
+import static com.android.server.NsdService.parseTypeAndSubtype;
import static com.android.testutils.ContextUtils.mockService;
import static libcore.junit.util.compat.CoreCompatChangeRule.DisableCompatChanges;
@@ -40,6 +50,7 @@
import static org.mockito.Mockito.doCallRealMethod;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.eq;
+import static org.mockito.Mockito.inOrder;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.reset;
@@ -49,12 +60,13 @@
import static org.mockito.Mockito.verifyNoMoreInteractions;
import static org.mockito.Mockito.when;
+import android.app.ActivityManager;
+import android.app.ActivityManager.OnUidImportanceListener;
import android.compat.testing.PlatformCompatChangeRule;
import android.content.ContentResolver;
import android.content.Context;
import android.net.INetd;
import android.net.Network;
-import android.net.connectivity.ConnectivityCompatChanges;
import android.net.mdns.aidl.DiscoveryInfo;
import android.net.mdns.aidl.GetAddressInfo;
import android.net.mdns.aidl.IMDnsEventListener;
@@ -67,7 +79,9 @@
import android.net.nsd.NsdManager.DiscoveryListener;
import android.net.nsd.NsdManager.RegistrationListener;
import android.net.nsd.NsdManager.ResolveListener;
+import android.net.nsd.NsdManager.ServiceInfoCallback;
import android.net.nsd.NsdServiceInfo;
+import android.net.wifi.WifiManager;
import android.os.Binder;
import android.os.Build;
import android.os.Handler;
@@ -76,6 +90,7 @@
import android.os.Looper;
import android.os.Message;
import android.os.RemoteException;
+import android.util.Pair;
import androidx.annotation.NonNull;
import androidx.test.filters.SmallTest;
@@ -83,9 +98,12 @@
import com.android.server.NsdService.Dependencies;
import com.android.server.connectivity.mdns.MdnsAdvertiser;
import com.android.server.connectivity.mdns.MdnsDiscoveryManager;
+import com.android.server.connectivity.mdns.MdnsInterfaceSocket;
+import com.android.server.connectivity.mdns.MdnsSearchOptions;
import com.android.server.connectivity.mdns.MdnsServiceBrowserListener;
import com.android.server.connectivity.mdns.MdnsServiceInfo;
import com.android.server.connectivity.mdns.MdnsSocketProvider;
+import com.android.server.connectivity.mdns.MdnsSocketProvider.SocketRequestMonitor;
import com.android.testutils.DevSdkIgnoreRule;
import com.android.testutils.DevSdkIgnoreRunner;
import com.android.testutils.HandlerUtils;
@@ -98,10 +116,13 @@
import org.junit.runner.RunWith;
import org.mockito.AdditionalAnswers;
import org.mockito.ArgumentCaptor;
+import org.mockito.InOrder;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
+import java.net.InetAddress;
import java.net.UnknownHostException;
+import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import java.util.Objects;
@@ -140,6 +161,11 @@
@Mock MdnsDiscoveryManager mDiscoveryManager;
@Mock MdnsAdvertiser mAdvertiser;
@Mock MdnsSocketProvider mSocketProvider;
+ @Mock WifiManager mWifiManager;
+ @Mock WifiManager.MulticastLock mMulticastLock;
+ @Mock ActivityManager mActivityManager;
+ SocketRequestMonitor mSocketRequestMonitor;
+ OnUidImportanceListener mUidImportanceListener;
HandlerThread mThread;
TestHandler mHandler;
NsdService mService;
@@ -162,9 +188,13 @@
mHandler = new TestHandler(mThread.getLooper());
when(mContext.getContentResolver()).thenReturn(mResolver);
mockService(mContext, MDnsManager.class, MDnsManager.MDNS_SERVICE, mMockMDnsM);
+ mockService(mContext, WifiManager.class, Context.WIFI_SERVICE, mWifiManager);
+ mockService(mContext, ActivityManager.class, Context.ACTIVITY_SERVICE, mActivityManager);
if (mContext.getSystemService(MDnsManager.class) == null) {
// Test is using mockito-extended
doCallRealMethod().when(mContext).getSystemService(MDnsManager.class);
+ doCallRealMethod().when(mContext).getSystemService(WifiManager.class);
+ doCallRealMethod().when(mContext).getSystemService(ActivityManager.class);
}
doReturn(true).when(mMockMDnsM).registerService(
anyInt(), anyString(), anyString(), anyInt(), any(), anyInt());
@@ -173,11 +203,23 @@
doReturn(true).when(mMockMDnsM).resolve(
anyInt(), anyString(), anyString(), anyString(), anyInt());
doReturn(false).when(mDeps).isMdnsDiscoveryManagerEnabled(any(Context.class));
- doReturn(mDiscoveryManager).when(mDeps).makeMdnsDiscoveryManager(any(), any());
- doReturn(mSocketProvider).when(mDeps).makeMdnsSocketProvider(any(), any());
- doReturn(mAdvertiser).when(mDeps).makeMdnsAdvertiser(any(), any(), any());
-
+ doReturn(mDiscoveryManager).when(mDeps)
+ .makeMdnsDiscoveryManager(any(), any(), any());
+ doReturn(mMulticastLock).when(mWifiManager).createMulticastLock(any());
+ doReturn(mSocketProvider).when(mDeps).makeMdnsSocketProvider(any(), any(), any(), any());
+ doReturn(DEFAULT_RUNNING_APP_ACTIVE_IMPORTANCE_CUTOFF).when(mDeps).getDeviceConfigInt(
+ eq(NsdService.MDNS_CONFIG_RUNNING_APP_ACTIVE_IMPORTANCE_CUTOFF), anyInt());
+ doReturn(mAdvertiser).when(mDeps).makeMdnsAdvertiser(any(), any(), any(), any());
mService = makeService();
+ final ArgumentCaptor<SocketRequestMonitor> cbMonitorCaptor =
+ ArgumentCaptor.forClass(SocketRequestMonitor.class);
+ verify(mDeps).makeMdnsSocketProvider(any(), any(), any(), cbMonitorCaptor.capture());
+ mSocketRequestMonitor = cbMonitorCaptor.getValue();
+
+ final ArgumentCaptor<OnUidImportanceListener> uidListenerCaptor =
+ ArgumentCaptor.forClass(OnUidImportanceListener.class);
+ verify(mActivityManager).addOnUidImportanceListener(uidListenerCaptor.capture(), anyInt());
+ mUidImportanceListener = uidListenerCaptor.getValue();
}
@After
@@ -189,7 +231,9 @@
}
@Test
- @DisableCompatChanges(ConnectivityCompatChanges.RUN_NATIVE_NSD_ONLY_IF_LEGACY_APPS_T_AND_LATER)
+ @DisableCompatChanges({
+ RUN_NATIVE_NSD_ONLY_IF_LEGACY_APPS_T_AND_LATER,
+ ENABLE_PLATFORM_MDNS_BACKEND})
public void testPreSClients() throws Exception {
// Pre S client connected, the daemon should be started.
connectClient(mService);
@@ -216,7 +260,8 @@
}
@Test
- @EnableCompatChanges(ConnectivityCompatChanges.RUN_NATIVE_NSD_ONLY_IF_LEGACY_APPS_T_AND_LATER)
+ @EnableCompatChanges(RUN_NATIVE_NSD_ONLY_IF_LEGACY_APPS_T_AND_LATER)
+ @DisableCompatChanges(ENABLE_PLATFORM_MDNS_BACKEND)
public void testNoDaemonStartedWhenClientsConnect() throws Exception {
// Creating an NsdManager will not cause daemon startup.
connectClient(mService);
@@ -250,7 +295,8 @@
}
@Test
- @EnableCompatChanges(ConnectivityCompatChanges.RUN_NATIVE_NSD_ONLY_IF_LEGACY_APPS_T_AND_LATER)
+ @EnableCompatChanges(RUN_NATIVE_NSD_ONLY_IF_LEGACY_APPS_T_AND_LATER)
+ @DisableCompatChanges(ENABLE_PLATFORM_MDNS_BACKEND)
public void testClientRequestsAreGCedAtDisconnection() throws Exception {
final NsdManager client = connectClient(mService);
final INsdManagerCallback cb1 = getCallback();
@@ -293,7 +339,8 @@
}
@Test
- @EnableCompatChanges(ConnectivityCompatChanges.RUN_NATIVE_NSD_ONLY_IF_LEGACY_APPS_T_AND_LATER)
+ @EnableCompatChanges(RUN_NATIVE_NSD_ONLY_IF_LEGACY_APPS_T_AND_LATER)
+ @DisableCompatChanges(ENABLE_PLATFORM_MDNS_BACKEND)
public void testCleanupDelayNoRequestActive() throws Exception {
final NsdManager client = connectClient(mService);
@@ -329,6 +376,7 @@
}
@Test
+ @DisableCompatChanges(ENABLE_PLATFORM_MDNS_BACKEND)
public void testDiscoverOnTetheringDownstream() throws Exception {
final NsdManager client = connectClient(mService);
final int interfaceIdx = 123;
@@ -419,6 +467,7 @@
}
@Test
+ @DisableCompatChanges(ENABLE_PLATFORM_MDNS_BACKEND)
public void testDiscoverOnBlackholeNetwork() throws Exception {
final NsdManager client = connectClient(mService);
final DiscoveryListener discListener = mock(DiscoveryListener.class);
@@ -448,6 +497,7 @@
}
@Test
+ @DisableCompatChanges(ENABLE_PLATFORM_MDNS_BACKEND)
public void testServiceRegistrationSuccessfulAndFailed() throws Exception {
final NsdManager client = connectClient(mService);
final NsdServiceInfo request = new NsdServiceInfo(SERVICE_NAME, SERVICE_TYPE);
@@ -494,6 +544,7 @@
}
@Test
+ @DisableCompatChanges(ENABLE_PLATFORM_MDNS_BACKEND)
public void testServiceDiscoveryFailed() throws Exception {
final NsdManager client = connectClient(mService);
final DiscoveryListener discListener = mock(DiscoveryListener.class);
@@ -520,6 +571,7 @@
}
@Test
+ @DisableCompatChanges(ENABLE_PLATFORM_MDNS_BACKEND)
public void testServiceResolutionFailed() throws Exception {
final NsdManager client = connectClient(mService);
final NsdServiceInfo request = new NsdServiceInfo(SERVICE_NAME, SERVICE_TYPE);
@@ -550,6 +602,7 @@
}
@Test
+ @DisableCompatChanges(ENABLE_PLATFORM_MDNS_BACKEND)
public void testGettingAddressFailed() throws Exception {
final NsdManager client = connectClient(mService);
final NsdServiceInfo request = new NsdServiceInfo(SERVICE_NAME, SERVICE_TYPE);
@@ -596,6 +649,7 @@
}
@Test
+ @DisableCompatChanges(ENABLE_PLATFORM_MDNS_BACKEND)
public void testNoCrashWhenProcessResolutionAfterBinderDied() throws Exception {
final NsdManager client = connectClient(mService);
final INsdManagerCallback cb = getCallback();
@@ -615,6 +669,7 @@
}
@Test
+ @DisableCompatChanges(ENABLE_PLATFORM_MDNS_BACKEND)
public void testStopServiceResolution() {
final NsdManager client = connectClient(mService);
final NsdServiceInfo request = new NsdServiceInfo(SERVICE_NAME, SERVICE_TYPE);
@@ -637,6 +692,7 @@
}
@Test
+ @DisableCompatChanges(ENABLE_PLATFORM_MDNS_BACKEND)
public void testStopResolutionFailed() {
final NsdManager client = connectClient(mService);
final NsdServiceInfo request = new NsdServiceInfo(SERVICE_NAME, SERVICE_TYPE);
@@ -661,6 +717,7 @@
}
@Test @DevSdkIgnoreRule.IgnoreUpTo(Build.VERSION_CODES.TIRAMISU)
+ @DisableCompatChanges(ENABLE_PLATFORM_MDNS_BACKEND)
public void testStopResolutionDuringGettingAddress() throws RemoteException {
final NsdManager client = connectClient(mService);
final NsdServiceInfo request = new NsdServiceInfo(SERVICE_NAME, SERVICE_TYPE);
@@ -704,127 +761,110 @@
}
private void verifyUpdatedServiceInfo(NsdServiceInfo info, String serviceName,
- String serviceType, String address, int port, int interfaceIndex, Network network) {
+ String serviceType, List<InetAddress> address, int port, int interfaceIndex,
+ Network network) {
assertEquals(serviceName, info.getServiceName());
assertEquals(serviceType, info.getServiceType());
- assertTrue(info.getHostAddresses().contains(parseNumericAddress(address)));
+ assertEquals(address, info.getHostAddresses());
assertEquals(port, info.getPort());
assertEquals(network, info.getNetwork());
assertEquals(interfaceIndex, info.getInterfaceIndex());
}
@Test
- public void testRegisterAndUnregisterServiceInfoCallback() throws RemoteException {
+ public void testRegisterAndUnregisterServiceInfoCallback() {
final NsdManager client = connectClient(mService);
final NsdServiceInfo request = new NsdServiceInfo(SERVICE_NAME, SERVICE_TYPE);
- final NsdManager.ServiceInfoCallback serviceInfoCallback = mock(
- NsdManager.ServiceInfoCallback.class);
+ final ServiceInfoCallback serviceInfoCallback = mock(
+ ServiceInfoCallback.class);
+ final String serviceTypeWithLocalDomain = SERVICE_TYPE + ".local";
+ final Network network = new Network(999);
+ request.setNetwork(network);
client.registerServiceInfoCallback(request, Runnable::run, serviceInfoCallback);
waitForIdle();
+ // Verify the registration callback start.
+ final ArgumentCaptor<MdnsServiceBrowserListener> listenerCaptor =
+ ArgumentCaptor.forClass(MdnsServiceBrowserListener.class);
+ verify(mSocketProvider).startMonitoringSockets();
+ verify(mDiscoveryManager).registerListener(eq(serviceTypeWithLocalDomain),
+ listenerCaptor.capture(), argThat(options -> network.equals(options.getNetwork())));
- final IMDnsEventListener eventListener = getEventListener();
- final ArgumentCaptor<Integer> resolvIdCaptor = ArgumentCaptor.forClass(Integer.class);
- verify(mMockMDnsM).resolve(resolvIdCaptor.capture(), eq(SERVICE_NAME), eq(SERVICE_TYPE),
- eq("local.") /* domain */, eq(IFACE_IDX_ANY));
-
- // Resolve service successfully.
- final ResolutionInfo resolutionInfo = new ResolutionInfo(
- resolvIdCaptor.getValue(),
- IMDnsEventListener.SERVICE_RESOLVED,
- null /* serviceName */,
- null /* serviceType */,
- null /* domain */,
- SERVICE_FULL_NAME,
- DOMAIN_NAME,
+ final MdnsServiceBrowserListener listener = listenerCaptor.getValue();
+ final MdnsServiceInfo mdnsServiceInfo = new MdnsServiceInfo(
+ SERVICE_NAME,
+ serviceTypeWithLocalDomain.split("\\."),
+ List.of(), /* subtypes */
+ new String[]{"android", "local"}, /* hostName */
PORT,
- new byte[0] /* txtRecord */,
- IFACE_IDX_ANY);
- doReturn(true).when(mMockMDnsM).getServiceAddress(anyInt(), any(), anyInt());
- eventListener.onServiceResolutionStatus(resolutionInfo);
- waitForIdle();
+ List.of(IPV4_ADDRESS),
+ List.of(IPV6_ADDRESS),
+ List.of() /* textStrings */,
+ List.of() /* textEntries */,
+ 1234,
+ network);
- final ArgumentCaptor<Integer> getAddrIdCaptor = ArgumentCaptor.forClass(Integer.class);
- verify(mMockMDnsM).getServiceAddress(getAddrIdCaptor.capture(), eq(DOMAIN_NAME),
- eq(IFACE_IDX_ANY));
-
- // First address info
- final String v4Address = "192.0.2.1";
- final String v6Address = "2001:db8::";
- final GetAddressInfo addressInfo1 = new GetAddressInfo(
- getAddrIdCaptor.getValue(),
- IMDnsEventListener.SERVICE_GET_ADDR_SUCCESS,
- SERVICE_FULL_NAME,
- v4Address,
- IFACE_IDX_ANY,
- 999 /* netId */);
- eventListener.onGettingServiceAddressStatus(addressInfo1);
- waitForIdle();
-
+ // Verify onServiceFound callback
+ listener.onServiceFound(mdnsServiceInfo);
final ArgumentCaptor<NsdServiceInfo> updateInfoCaptor =
ArgumentCaptor.forClass(NsdServiceInfo.class);
verify(serviceInfoCallback, timeout(TIMEOUT_MS).times(1))
.onServiceUpdated(updateInfoCaptor.capture());
verifyUpdatedServiceInfo(updateInfoCaptor.getAllValues().get(0) /* info */, SERVICE_NAME,
- "." + SERVICE_TYPE, v4Address, PORT, IFACE_IDX_ANY, new Network(999));
+ SERVICE_TYPE,
+ List.of(parseNumericAddress(IPV4_ADDRESS), parseNumericAddress(IPV6_ADDRESS)),
+ PORT, IFACE_IDX_ANY, new Network(999));
- // Second address info
- final GetAddressInfo addressInfo2 = new GetAddressInfo(
- getAddrIdCaptor.getValue(),
- IMDnsEventListener.SERVICE_GET_ADDR_SUCCESS,
- SERVICE_FULL_NAME,
- v6Address,
- IFACE_IDX_ANY,
- 999 /* netId */);
- eventListener.onGettingServiceAddressStatus(addressInfo2);
- waitForIdle();
+ // Service addresses changed.
+ final String v4Address = "192.0.2.1";
+ final String v6Address = "2001:db8::1";
+ final MdnsServiceInfo updatedServiceInfo = new MdnsServiceInfo(
+ SERVICE_NAME,
+ serviceTypeWithLocalDomain.split("\\."),
+ List.of(), /* subtypes */
+ new String[]{"android", "local"}, /* hostName */
+ PORT,
+ List.of(v4Address),
+ List.of(v6Address),
+ List.of() /* textStrings */,
+ List.of() /* textEntries */,
+ 1234,
+ network);
+ // Verify onServiceUpdated callback.
+ listener.onServiceUpdated(updatedServiceInfo);
verify(serviceInfoCallback, timeout(TIMEOUT_MS).times(2))
.onServiceUpdated(updateInfoCaptor.capture());
- verifyUpdatedServiceInfo(updateInfoCaptor.getAllValues().get(1) /* info */, SERVICE_NAME,
- "." + SERVICE_TYPE, v6Address, PORT, IFACE_IDX_ANY, new Network(999));
+ verifyUpdatedServiceInfo(updateInfoCaptor.getAllValues().get(2) /* info */, SERVICE_NAME,
+ SERVICE_TYPE,
+ List.of(parseNumericAddress(v4Address), parseNumericAddress(v6Address)),
+ PORT, IFACE_IDX_ANY, new Network(999));
+ // Verify service callback unregistration.
client.unregisterServiceInfoCallback(serviceInfoCallback);
waitForIdle();
-
verify(serviceInfoCallback, timeout(TIMEOUT_MS)).onServiceInfoCallbackUnregistered();
}
@Test
- public void testRegisterServiceCallbackFailed() throws Exception {
+ public void testRegisterServiceCallbackFailed() {
final NsdManager client = connectClient(mService);
- final NsdServiceInfo request = new NsdServiceInfo(SERVICE_NAME, SERVICE_TYPE);
- final NsdManager.ServiceInfoCallback subscribeListener = mock(
- NsdManager.ServiceInfoCallback.class);
- client.registerServiceInfoCallback(request, Runnable::run, subscribeListener);
+ final String invalidServiceType = "a_service";
+ final NsdServiceInfo request = new NsdServiceInfo(SERVICE_NAME, invalidServiceType);
+ final ServiceInfoCallback serviceInfoCallback = mock(
+ ServiceInfoCallback.class);
+ client.registerServiceInfoCallback(request, Runnable::run, serviceInfoCallback);
waitForIdle();
- final IMDnsEventListener eventListener = getEventListener();
- final ArgumentCaptor<Integer> resolvIdCaptor = ArgumentCaptor.forClass(Integer.class);
- verify(mMockMDnsM).resolve(resolvIdCaptor.capture(), eq(SERVICE_NAME), eq(SERVICE_TYPE),
- eq("local.") /* domain */, eq(IFACE_IDX_ANY));
-
- // Fail to resolve service.
- final ResolutionInfo resolutionFailedInfo = new ResolutionInfo(
- resolvIdCaptor.getValue(),
- IMDnsEventListener.SERVICE_RESOLUTION_FAILED,
- null /* serviceName */,
- null /* serviceType */,
- null /* domain */,
- null /* serviceFullName */,
- null /* domainName */,
- 0 /* port */,
- new byte[0] /* txtRecord */,
- IFACE_IDX_ANY);
- eventListener.onServiceResolutionStatus(resolutionFailedInfo);
- verify(subscribeListener, timeout(TIMEOUT_MS))
+ // Fail to register service callback.
+ verify(serviceInfoCallback, timeout(TIMEOUT_MS))
.onServiceInfoCallbackRegistrationFailed(eq(FAILURE_BAD_PARAMETERS));
}
@Test
public void testUnregisterNotRegisteredCallback() {
final NsdManager client = connectClient(mService);
- final NsdManager.ServiceInfoCallback serviceInfoCallback = mock(
- NsdManager.ServiceInfoCallback.class);
+ final ServiceInfoCallback serviceInfoCallback = mock(
+ ServiceInfoCallback.class);
assertThrows(IllegalArgumentException.class, () ->
client.unregisterServiceInfoCallback(serviceInfoCallback));
@@ -839,6 +879,7 @@
}
@Test
+ @DisableCompatChanges(ENABLE_PLATFORM_MDNS_BACKEND)
public void testMdnsDiscoveryManagerFeature() {
// Create NsdService w/o feature enabled.
final NsdManager client = connectClient(mService);
@@ -907,7 +948,8 @@
listener.onServiceNameDiscovered(foundInfo);
verify(discListener, timeout(TIMEOUT_MS)).onServiceFound(argThat(info ->
info.getServiceName().equals(SERVICE_NAME)
- && info.getServiceType().equals(SERVICE_TYPE)
+ // Service type in discovery callbacks has a dot at the end
+ && info.getServiceType().equals(SERVICE_TYPE + ".")
&& info.getNetwork().equals(network)));
final MdnsServiceInfo removedInfo = new MdnsServiceInfo(
@@ -926,7 +968,8 @@
listener.onServiceNameRemoved(removedInfo);
verify(discListener, timeout(TIMEOUT_MS)).onServiceLost(argThat(info ->
info.getServiceName().equals(SERVICE_NAME)
- && info.getServiceType().equals(SERVICE_TYPE)
+ // Service type in discovery callbacks has a dot at the end
+ && info.getServiceType().equals(SERVICE_TYPE + ".")
&& info.getNetwork().equals(network)));
client.stopServiceDiscovery(discListener);
@@ -966,6 +1009,34 @@
}
@Test
+ @EnableCompatChanges(ENABLE_PLATFORM_MDNS_BACKEND)
+ public void testDiscoveryWithMdnsDiscoveryManager_UsesSubtypes() {
+ final String typeWithSubtype = SERVICE_TYPE + ",_subtype";
+ final NsdManager client = connectClient(mService);
+ final NsdServiceInfo regInfo = new NsdServiceInfo("Instance", typeWithSubtype);
+ final Network network = new Network(999);
+ regInfo.setHostAddresses(List.of(parseNumericAddress("192.0.2.123")));
+ regInfo.setPort(12345);
+ regInfo.setNetwork(network);
+
+ final RegistrationListener regListener = mock(RegistrationListener.class);
+ client.registerService(regInfo, NsdManager.PROTOCOL_DNS_SD, Runnable::run, regListener);
+ waitForIdle();
+ verify(mAdvertiser).addService(anyInt(), argThat(s ->
+ "Instance".equals(s.getServiceName())
+ && SERVICE_TYPE.equals(s.getServiceType())), eq("_subtype"));
+
+ final DiscoveryListener discListener = mock(DiscoveryListener.class);
+ client.discoverServices(typeWithSubtype, PROTOCOL, network, Runnable::run, discListener);
+ waitForIdle();
+ final ArgumentCaptor<MdnsSearchOptions> optionsCaptor =
+ ArgumentCaptor.forClass(MdnsSearchOptions.class);
+ verify(mDiscoveryManager).registerListener(eq(SERVICE_TYPE + ".local"), any(),
+ optionsCaptor.capture());
+ assertEquals(Collections.singletonList("subtype"), optionsCaptor.getValue().getSubtypes());
+ }
+
+ @Test
public void testResolutionWithMdnsDiscoveryManager() throws UnknownHostException {
setMdnsDiscoveryManagerEnabled();
@@ -973,7 +1044,7 @@
final ResolveListener resolveListener = mock(ResolveListener.class);
final Network network = new Network(999);
final String serviceType = "_nsd._service._tcp";
- final String constructedServiceType = "_nsd._sub._service._tcp.local";
+ final String constructedServiceType = "_service._tcp.local";
final ArgumentCaptor<MdnsServiceBrowserListener> listenerCaptor =
ArgumentCaptor.forClass(MdnsServiceBrowserListener.class);
final NsdServiceInfo request = new NsdServiceInfo(SERVICE_NAME, serviceType);
@@ -981,10 +1052,14 @@
client.resolveService(request, resolveListener);
waitForIdle();
verify(mSocketProvider).startMonitoringSockets();
+ final ArgumentCaptor<MdnsSearchOptions> optionsCaptor =
+ ArgumentCaptor.forClass(MdnsSearchOptions.class);
verify(mDiscoveryManager).registerListener(eq(constructedServiceType),
- listenerCaptor.capture(), argThat(options ->
- network.equals(options.getNetwork())
- && SERVICE_NAME.equals(options.getResolveInstanceName())));
+ listenerCaptor.capture(),
+ optionsCaptor.capture());
+ assertEquals(network, optionsCaptor.getValue().getNetwork());
+ // Subtypes are not used for resolution, only for discovery
+ assertEquals(Collections.emptyList(), optionsCaptor.getValue().getSubtypes());
final MdnsServiceBrowserListener listener = listenerCaptor.getValue();
final MdnsServiceInfo mdnsServiceInfo = new MdnsServiceInfo(
@@ -1008,7 +1083,7 @@
verify(resolveListener, timeout(TIMEOUT_MS)).onServiceResolved(infoCaptor.capture());
final NsdServiceInfo info = infoCaptor.getValue();
assertEquals(SERVICE_NAME, info.getServiceName());
- assertEquals("." + serviceType, info.getServiceType());
+ assertEquals("._service._tcp", info.getServiceType());
assertEquals(PORT, info.getPort());
assertTrue(info.getAttributes().containsKey("key"));
assertEquals(1, info.getAttributes().size());
@@ -1028,6 +1103,7 @@
}
@Test
+ @DisableCompatChanges(ENABLE_PLATFORM_MDNS_BACKEND)
public void testMdnsAdvertiserFeatureFlagging() {
// Create NsdService w/o feature enabled.
final NsdManager client = connectClient(mService);
@@ -1050,7 +1126,7 @@
final ArgumentCaptor<Integer> serviceIdCaptor = ArgumentCaptor.forClass(Integer.class);
verify(mAdvertiser).addService(serviceIdCaptor.capture(),
- argThat(info -> matches(info, regInfo)));
+ argThat(info -> matches(info, regInfo)), eq(null) /* subtype */);
client.unregisterService(regListenerWithoutFeature);
waitForIdle();
@@ -1063,6 +1139,7 @@
}
@Test
+ @DisableCompatChanges(ENABLE_PLATFORM_MDNS_BACKEND)
public void testTypeSpecificFeatureFlagging() {
doReturn("_type1._tcp:flag1,_type2._tcp:flag2").when(mDeps).getTypeAllowlistFlags();
doReturn(true).when(mDeps).isFeatureEnabled(any(),
@@ -1106,8 +1183,10 @@
waitForIdle();
// The advertiser is enabled for _type2 but not _type1
- verify(mAdvertiser, never()).addService(anyInt(), argThat(info -> matches(info, service1)));
- verify(mAdvertiser).addService(anyInt(), argThat(info -> matches(info, service2)));
+ verify(mAdvertiser, never()).addService(
+ anyInt(), argThat(info -> matches(info, service1)), eq(null) /* subtype */);
+ verify(mAdvertiser).addService(
+ anyInt(), argThat(info -> matches(info, service2)), eq(null) /* subtype */);
}
@Test
@@ -1119,7 +1198,7 @@
// final String serviceTypeWithLocalDomain = SERVICE_TYPE + ".local";
final ArgumentCaptor<MdnsAdvertiser.AdvertiserCallback> cbCaptor =
ArgumentCaptor.forClass(MdnsAdvertiser.AdvertiserCallback.class);
- verify(mDeps).makeMdnsAdvertiser(any(), any(), cbCaptor.capture());
+ verify(mDeps).makeMdnsAdvertiser(any(), any(), cbCaptor.capture(), any());
final NsdServiceInfo regInfo = new NsdServiceInfo(SERVICE_NAME, SERVICE_TYPE);
regInfo.setHost(parseNumericAddress("192.0.2.123"));
@@ -1132,7 +1211,7 @@
verify(mSocketProvider).startMonitoringSockets();
final ArgumentCaptor<Integer> idCaptor = ArgumentCaptor.forClass(Integer.class);
verify(mAdvertiser).addService(idCaptor.capture(), argThat(info ->
- matches(info, regInfo)));
+ matches(info, regInfo)), eq(null) /* subtype */);
// Verify onServiceRegistered callback
final MdnsAdvertiser.AdvertiserCallback cb = cbCaptor.getValue();
@@ -1158,7 +1237,7 @@
// final String serviceTypeWithLocalDomain = SERVICE_TYPE + ".local";
final ArgumentCaptor<MdnsAdvertiser.AdvertiserCallback> cbCaptor =
ArgumentCaptor.forClass(MdnsAdvertiser.AdvertiserCallback.class);
- verify(mDeps).makeMdnsAdvertiser(any(), any(), cbCaptor.capture());
+ verify(mDeps).makeMdnsAdvertiser(any(), any(), cbCaptor.capture(), any());
final NsdServiceInfo regInfo = new NsdServiceInfo(SERVICE_NAME, "invalid_type");
regInfo.setHost(parseNumericAddress("192.0.2.123"));
@@ -1168,7 +1247,7 @@
client.registerService(regInfo, NsdManager.PROTOCOL_DNS_SD, Runnable::run, regListener);
waitForIdle();
- verify(mAdvertiser, never()).addService(anyInt(), any());
+ verify(mAdvertiser, never()).addService(anyInt(), any(), any());
verify(regListener, timeout(TIMEOUT_MS)).onRegistrationFailed(
argThat(info -> matches(info, regInfo)), eq(FAILURE_INTERNAL_ERROR));
@@ -1183,7 +1262,7 @@
// final String serviceTypeWithLocalDomain = SERVICE_TYPE + ".local";
final ArgumentCaptor<MdnsAdvertiser.AdvertiserCallback> cbCaptor =
ArgumentCaptor.forClass(MdnsAdvertiser.AdvertiserCallback.class);
- verify(mDeps).makeMdnsAdvertiser(any(), any(), cbCaptor.capture());
+ verify(mDeps).makeMdnsAdvertiser(any(), any(), cbCaptor.capture(), any());
final NsdServiceInfo regInfo = new NsdServiceInfo("a".repeat(70), SERVICE_TYPE);
regInfo.setHost(parseNumericAddress("192.0.2.123"));
@@ -1196,7 +1275,8 @@
final ArgumentCaptor<Integer> idCaptor = ArgumentCaptor.forClass(Integer.class);
// Service name is truncated to 63 characters
verify(mAdvertiser).addService(idCaptor.capture(),
- argThat(info -> info.getServiceName().equals("a".repeat(63))));
+ argThat(info -> info.getServiceName().equals("a".repeat(63))),
+ eq(null) /* subtype */);
// Verify onServiceRegistered callback
final MdnsAdvertiser.AdvertiserCallback cb = cbCaptor.getValue();
@@ -1214,7 +1294,7 @@
final ResolveListener resolveListener = mock(ResolveListener.class);
final Network network = new Network(999);
final String serviceType = "_nsd._service._tcp";
- final String constructedServiceType = "_nsd._sub._service._tcp.local";
+ final String constructedServiceType = "_service._tcp.local";
final ArgumentCaptor<MdnsServiceBrowserListener> listenerCaptor =
ArgumentCaptor.forClass(MdnsServiceBrowserListener.class);
final NsdServiceInfo request = new NsdServiceInfo(SERVICE_NAME, serviceType);
@@ -1222,8 +1302,14 @@
client.resolveService(request, resolveListener);
waitForIdle();
verify(mSocketProvider).startMonitoringSockets();
+ final ArgumentCaptor<MdnsSearchOptions> optionsCaptor =
+ ArgumentCaptor.forClass(MdnsSearchOptions.class);
verify(mDiscoveryManager).registerListener(eq(constructedServiceType),
- listenerCaptor.capture(), argThat(options -> network.equals(options.getNetwork())));
+ listenerCaptor.capture(),
+ optionsCaptor.capture());
+ assertEquals(network, optionsCaptor.getValue().getNetwork());
+ // Subtypes are not used for resolution, only for discovery
+ assertEquals(Collections.emptyList(), optionsCaptor.getValue().getSubtypes());
client.stopServiceResolution(resolveListener);
waitForIdle();
@@ -1238,16 +1324,241 @@
}
@Test
- public void testConstructServiceType() {
+ public void testParseTypeAndSubtype() {
final String serviceType1 = "test._tcp";
final String serviceType2 = "_test._quic";
- final String serviceType3 = "_123._udp.";
- final String serviceType4 = "_TEST._999._tcp.";
+ final String serviceType3 = "_test._quic,_test1,_test2";
+ final String serviceType4 = "_123._udp.";
+ final String serviceType5 = "_TEST._999._tcp.";
+ final String serviceType6 = "_998._tcp.,_TEST";
+ final String serviceType7 = "_997._tcp,_TEST";
- assertEquals(null, constructServiceType(serviceType1));
- assertEquals(null, constructServiceType(serviceType2));
- assertEquals("_123._udp", constructServiceType(serviceType3));
- assertEquals("_TEST._sub._999._tcp", constructServiceType(serviceType4));
+ assertNull(parseTypeAndSubtype(serviceType1));
+ assertNull(parseTypeAndSubtype(serviceType2));
+ assertNull(parseTypeAndSubtype(serviceType3));
+ assertEquals(new Pair<>("_123._udp", null), parseTypeAndSubtype(serviceType4));
+ assertEquals(new Pair<>("_999._tcp", "_TEST"), parseTypeAndSubtype(serviceType5));
+ assertEquals(new Pair<>("_998._tcp", "_TEST"), parseTypeAndSubtype(serviceType6));
+ assertEquals(new Pair<>("_997._tcp", "_TEST"), parseTypeAndSubtype(serviceType7));
+ }
+
+ @Test
+ @EnableCompatChanges(ENABLE_PLATFORM_MDNS_BACKEND)
+ public void testEnablePlatformMdnsBackend() {
+ final NsdManager client = connectClient(mService);
+ final NsdServiceInfo regInfo = new NsdServiceInfo("a".repeat(70), SERVICE_TYPE);
+ final Network network = new Network(999);
+ regInfo.setHostAddresses(List.of(parseNumericAddress("192.0.2.123")));
+ regInfo.setPort(12345);
+ regInfo.setAttribute("testattr", "testvalue");
+ regInfo.setNetwork(network);
+
+ // Verify the registration uses MdnsAdvertiser
+ final RegistrationListener regListener = mock(RegistrationListener.class);
+ client.registerService(regInfo, NsdManager.PROTOCOL_DNS_SD, Runnable::run, regListener);
+ waitForIdle();
+ verify(mSocketProvider).startMonitoringSockets();
+ verify(mAdvertiser).addService(anyInt(), any(), any());
+
+ // Verify the discovery uses MdnsDiscoveryManager
+ final DiscoveryListener discListener = mock(DiscoveryListener.class);
+ client.discoverServices(SERVICE_TYPE, PROTOCOL, network, r -> r.run(), discListener);
+ waitForIdle();
+ verify(mDiscoveryManager).registerListener(anyString(), any(), any());
+
+ // Verify the discovery uses MdnsDiscoveryManager
+ final ResolveListener resolveListener = mock(ResolveListener.class);
+ client.resolveService(regInfo, r -> r.run(), resolveListener);
+ waitForIdle();
+ verify(mDiscoveryManager, times(2)).registerListener(anyString(), any(), any());
+ }
+
+ @Test
+ @EnableCompatChanges(ENABLE_PLATFORM_MDNS_BACKEND)
+ public void testTakeMulticastLockOnBehalfOfClient_ForWifiNetworksOnly() {
+ // Test on one client in the foreground
+ mUidImportanceListener.onUidImportance(123, IMPORTANCE_FOREGROUND);
+ doReturn(123).when(mDeps).getCallingUid();
+ final NsdManager client = connectClient(mService);
+
+ final NsdServiceInfo regInfo = new NsdServiceInfo(SERVICE_NAME, SERVICE_TYPE);
+ regInfo.setHostAddresses(List.of(parseNumericAddress("192.0.2.123")));
+ regInfo.setPort(12345);
+ // File a request for all networks
+ regInfo.setNetwork(null);
+
+ final RegistrationListener regListener = mock(RegistrationListener.class);
+ client.registerService(regInfo, NsdManager.PROTOCOL_DNS_SD, Runnable::run, regListener);
+ waitForIdle();
+ verify(mSocketProvider).startMonitoringSockets();
+ verify(mAdvertiser).addService(anyInt(), any(), any());
+
+ final Network wifiNetwork1 = new Network(123);
+ final Network wifiNetwork2 = new Network(124);
+ final Network ethernetNetwork = new Network(125);
+
+ final MdnsInterfaceSocket wifiNetworkSocket1 = mock(MdnsInterfaceSocket.class);
+ final MdnsInterfaceSocket wifiNetworkSocket2 = mock(MdnsInterfaceSocket.class);
+ final MdnsInterfaceSocket ethernetNetworkSocket = mock(MdnsInterfaceSocket.class);
+
+ // Nothing happens for networks with no transports, no Wi-Fi transport, or VPN transport
+ mHandler.post(() -> {
+ mSocketRequestMonitor.onSocketRequestFulfilled(
+ new Network(125), mock(MdnsInterfaceSocket.class), new int[0]);
+ mSocketRequestMonitor.onSocketRequestFulfilled(
+ ethernetNetwork, ethernetNetworkSocket,
+ new int[] { TRANSPORT_ETHERNET });
+ mSocketRequestMonitor.onSocketRequestFulfilled(
+ new Network(127), mock(MdnsInterfaceSocket.class),
+ new int[] { TRANSPORT_WIFI, TRANSPORT_VPN });
+ });
+ waitForIdle();
+ verify(mWifiManager, never()).createMulticastLock(any());
+
+ // First Wi-Fi network
+ mHandler.post(() -> mSocketRequestMonitor.onSocketRequestFulfilled(
+ wifiNetwork1, wifiNetworkSocket1, new int[] { TRANSPORT_WIFI }));
+ waitForIdle();
+ verify(mWifiManager).createMulticastLock(any());
+ verify(mMulticastLock).acquire();
+
+ // Second Wi-Fi network
+ mHandler.post(() -> mSocketRequestMonitor.onSocketRequestFulfilled(
+ wifiNetwork2, wifiNetworkSocket2, new int[] { TRANSPORT_WIFI }));
+ waitForIdle();
+ verifyNoMoreInteractions(mMulticastLock);
+
+ // One Wi-Fi network becomes unused, nothing happens
+ mHandler.post(() -> mSocketRequestMonitor.onSocketDestroyed(
+ wifiNetwork1, wifiNetworkSocket1));
+ waitForIdle();
+ verifyNoMoreInteractions(mMulticastLock);
+
+ // Ethernet network becomes unused, still nothing
+ mHandler.post(() -> mSocketRequestMonitor.onSocketDestroyed(
+ ethernetNetwork, ethernetNetworkSocket));
+ waitForIdle();
+ verifyNoMoreInteractions(mMulticastLock);
+
+ // The second Wi-Fi network becomes unused, the lock is released
+ mHandler.post(() -> mSocketRequestMonitor.onSocketDestroyed(
+ wifiNetwork2, wifiNetworkSocket2));
+ waitForIdle();
+ verify(mMulticastLock).release();
+ }
+
+ @Test
+ @EnableCompatChanges(ENABLE_PLATFORM_MDNS_BACKEND)
+ public void testTakeMulticastLockOnBehalfOfClient_ForForegroundAppsOnly() {
+ final int uid1 = 12;
+ final int uid2 = 34;
+ final int uid3 = 56;
+ final int uid4 = 78;
+ final InOrder lockOrder = inOrder(mMulticastLock);
+ // Connect one client without any foreground info
+ doReturn(uid1).when(mDeps).getCallingUid();
+ final NsdManager client1 = connectClient(mService);
+
+ // Connect client2 as visible, but not foreground
+ mUidImportanceListener.onUidImportance(uid2, IMPORTANCE_VISIBLE);
+ waitForIdle();
+ doReturn(uid2).when(mDeps).getCallingUid();
+ final NsdManager client2 = connectClient(mService);
+
+ // Connect client3, client4 as foreground
+ mUidImportanceListener.onUidImportance(uid3, IMPORTANCE_FOREGROUND);
+ waitForIdle();
+ doReturn(uid3).when(mDeps).getCallingUid();
+ final NsdManager client3 = connectClient(mService);
+
+ mUidImportanceListener.onUidImportance(uid4, IMPORTANCE_FOREGROUND);
+ waitForIdle();
+ doReturn(uid4).when(mDeps).getCallingUid();
+ final NsdManager client4 = connectClient(mService);
+
+ // First client advertises on any network
+ final NsdServiceInfo regInfo = new NsdServiceInfo(SERVICE_NAME, SERVICE_TYPE);
+ regInfo.setHostAddresses(List.of(parseNumericAddress("192.0.2.123")));
+ regInfo.setPort(12345);
+ regInfo.setNetwork(null);
+ final RegistrationListener regListener = mock(RegistrationListener.class);
+ client1.registerService(regInfo, NsdManager.PROTOCOL_DNS_SD, Runnable::run, regListener);
+ waitForIdle();
+
+ final MdnsInterfaceSocket wifiSocket = mock(MdnsInterfaceSocket.class);
+ final Network wifiNetwork = new Network(123);
+
+ final MdnsInterfaceSocket ethSocket = mock(MdnsInterfaceSocket.class);
+ final Network ethNetwork = new Network(234);
+
+ mHandler.post(() -> {
+ mSocketRequestMonitor.onSocketRequestFulfilled(
+ wifiNetwork, wifiSocket, new int[] { TRANSPORT_WIFI });
+ mSocketRequestMonitor.onSocketRequestFulfilled(
+ ethNetwork, ethSocket, new int[] { TRANSPORT_ETHERNET });
+ });
+ waitForIdle();
+
+ // No multicast lock since client1 has no foreground info
+ lockOrder.verifyNoMoreInteractions();
+
+ // Second client discovers specifically on the Wi-Fi network
+ final DiscoveryListener discListener = mock(DiscoveryListener.class);
+ client2.discoverServices(SERVICE_TYPE, NsdManager.PROTOCOL_DNS_SD, wifiNetwork,
+ Runnable::run, discListener);
+ waitForIdle();
+ mHandler.post(() -> mSocketRequestMonitor.onSocketRequestFulfilled(
+ wifiNetwork, wifiSocket, new int[] { TRANSPORT_WIFI }));
+ waitForIdle();
+ // No multicast lock since client2 is not visible enough
+ lockOrder.verifyNoMoreInteractions();
+
+ // Third client registers a callback on all networks
+ final NsdServiceInfo cbInfo = new NsdServiceInfo(SERVICE_NAME, SERVICE_TYPE);
+ cbInfo.setNetwork(null);
+ final ServiceInfoCallback infoCb = mock(ServiceInfoCallback.class);
+ client3.registerServiceInfoCallback(cbInfo, Runnable::run, infoCb);
+ waitForIdle();
+ mHandler.post(() -> {
+ mSocketRequestMonitor.onSocketRequestFulfilled(
+ wifiNetwork, wifiSocket, new int[] { TRANSPORT_WIFI });
+ mSocketRequestMonitor.onSocketRequestFulfilled(
+ ethNetwork, ethSocket, new int[] { TRANSPORT_ETHERNET });
+ });
+ waitForIdle();
+
+ // Multicast lock is taken for third client
+ lockOrder.verify(mMulticastLock).acquire();
+
+ // Client3 goes to the background
+ mUidImportanceListener.onUidImportance(uid3, IMPORTANCE_CACHED);
+ waitForIdle();
+ lockOrder.verify(mMulticastLock).release();
+
+ // client4 resolves on a different network
+ final ResolveListener resolveListener = mock(ResolveListener.class);
+ final NsdServiceInfo resolveInfo = new NsdServiceInfo(SERVICE_NAME, SERVICE_TYPE);
+ resolveInfo.setNetwork(ethNetwork);
+ client4.resolveService(resolveInfo, Runnable::run, resolveListener);
+ waitForIdle();
+ mHandler.post(() -> mSocketRequestMonitor.onSocketRequestFulfilled(
+ ethNetwork, ethSocket, new int[] { TRANSPORT_ETHERNET }));
+ waitForIdle();
+
+ // client4 is foreground, but not Wi-Fi
+ lockOrder.verifyNoMoreInteractions();
+
+ // Second client becomes foreground
+ mUidImportanceListener.onUidImportance(uid2, IMPORTANCE_FOREGROUND);
+ waitForIdle();
+
+ lockOrder.verify(mMulticastLock).acquire();
+
+ // Second client is lost
+ mUidImportanceListener.onUidImportance(uid2, IMPORTANCE_GONE);
+ waitForIdle();
+
+ lockOrder.verify(mMulticastLock).release();
}
private void waitForIdle() {
@@ -1257,7 +1568,8 @@
NsdService makeService() {
final NsdService service = new NsdService(mContext, mHandler, CLEANUP_DELAY_MS, mDeps) {
@Override
- public INsdServiceConnector connect(INsdManagerCallback baseCb) {
+ public INsdServiceConnector connect(INsdManagerCallback baseCb,
+ boolean runNewMdnsBackend) {
// Wrap the callback in a transparent mock, to mock asBinder returning a
// LinkToDeathRecorder. This will allow recording the binder death recipient
// registered on the callback. Use a transparent mock and not a spy as the actual
@@ -1266,7 +1578,7 @@
AdditionalAnswers.delegatesTo(baseCb));
doReturn(new LinkToDeathRecorder()).when(cb).asBinder();
mCreatedCallbacks.add(cb);
- return super.connect(cb);
+ return super.connect(cb, runNewMdnsBackend);
}
};
return service;
diff --git a/tests/unit/java/com/android/server/VpnManagerServiceTest.java b/tests/unit/java/com/android/server/VpnManagerServiceTest.java
index deb56ef..bf23cd1 100644
--- a/tests/unit/java/com/android/server/VpnManagerServiceTest.java
+++ b/tests/unit/java/com/android/server/VpnManagerServiceTest.java
@@ -75,12 +75,15 @@
@IgnoreUpTo(R) // VpnManagerService is not available before R
@SmallTest
public class VpnManagerServiceTest extends VpnTestBase {
+ private static final String CONTEXT_ATTRIBUTION_TAG = "VPN_MANAGER";
+
@Rule
public final DevSdkIgnoreRule mIgnoreRule = new DevSdkIgnoreRule();
private static final int TIMEOUT_MS = 2_000;
@Mock Context mContext;
+ @Mock Context mContextWithoutAttributionTag;
@Mock Context mSystemContext;
@Mock Context mUserAllContext;
private HandlerThread mHandlerThread;
@@ -144,6 +147,13 @@
mHandlerThread = new HandlerThread("TestVpnManagerService");
mDeps = new VpnManagerServiceDependencies();
+
+ // The attribution tag is a dependency for IKE library to collect VPN metrics correctly
+ // and thus should not be changed without updating the IKE code.
+ doReturn(mContext)
+ .when(mContextWithoutAttributionTag)
+ .createAttributionContext(CONTEXT_ATTRIBUTION_TAG);
+
doReturn(mUserAllContext).when(mContext).createContextAsUser(UserHandle.ALL, 0);
doReturn(mSystemContext).when(mContext).createContextAsUser(UserHandle.SYSTEM, 0);
doReturn(mPackageManager).when(mContext).getPackageManager();
@@ -153,7 +163,7 @@
mockService(mContext, UserManager.class, Context.USER_SERVICE, mUserManager);
doReturn(SYSTEM_USER).when(mUserManager).getUserInfo(eq(SYSTEM_USER_ID));
- mService = new VpnManagerService(mContext, mDeps);
+ mService = new VpnManagerService(mContextWithoutAttributionTag, mDeps);
mService.systemReady();
final ArgumentCaptor<BroadcastReceiver> intentReceiverCaptor =
diff --git a/tests/unit/java/com/android/server/connectivity/AutomaticOnOffKeepaliveTrackerTest.java b/tests/unit/java/com/android/server/connectivity/AutomaticOnOffKeepaliveTrackerTest.java
index 4f0b9c4..9e604e3 100644
--- a/tests/unit/java/com/android/server/connectivity/AutomaticOnOffKeepaliveTrackerTest.java
+++ b/tests/unit/java/com/android/server/connectivity/AutomaticOnOffKeepaliveTrackerTest.java
@@ -18,27 +18,38 @@
import static android.content.pm.PackageManager.PERMISSION_GRANTED;
import static android.net.ConnectivityManager.TYPE_MOBILE;
+import static android.net.NetworkAgent.CMD_STOP_SOCKET_KEEPALIVE;
import static android.net.NetworkCapabilities.TRANSPORT_CELLULAR;
+import static com.android.server.connectivity.AutomaticOnOffKeepaliveTracker.METRICS_COLLECTION_DURATION_MS;
+import static com.android.testutils.HandlerUtils.visibleOnHandlerThread;
+
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertThrows;
import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.ArgumentMatchers.anyInt;
-import static org.mockito.ArgumentMatchers.anyLong;
import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.ArgumentMatchers.longThat;
+import static org.mockito.Mockito.clearInvocations;
+import static org.mockito.Mockito.doCallRealMethod;
import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.ignoreStubs;
import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
import android.app.AlarmManager;
import android.content.Context;
import android.content.res.Resources;
-import android.net.ConnectivityResources;
import android.net.INetd;
import android.net.ISocketKeepaliveCallback;
import android.net.KeepalivePacketData;
@@ -47,9 +58,10 @@
import android.net.MarkMaskParcel;
import android.net.NattKeepalivePacketData;
import android.net.Network;
-import android.net.NetworkAgent;
import android.net.NetworkCapabilities;
import android.net.NetworkInfo;
+import android.net.SocketKeepalive;
+import android.net.TcpKeepalivePacketData;
import android.os.Binder;
import android.os.Build;
import android.os.Handler;
@@ -57,12 +69,16 @@
import android.os.IBinder;
import android.os.Looper;
import android.os.Message;
+import android.os.SystemClock;
+import android.telephony.SubscriptionManager;
import android.test.suitebuilder.annotation.SmallTest;
import android.util.Log;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import com.android.connectivity.resources.R;
+import com.android.server.connectivity.AutomaticOnOffKeepaliveTracker.AutomaticOnOffKeepalive;
import com.android.server.connectivity.KeepaliveTracker.KeepaliveInfo;
import com.android.testutils.DevSdkIgnoreRule;
import com.android.testutils.DevSdkIgnoreRunner;
@@ -70,6 +86,7 @@
import libcore.util.HexEncoding;
+import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -82,18 +99,24 @@
import java.net.Socket;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
+import java.util.ArrayList;
+import java.util.List;
@RunWith(DevSdkIgnoreRunner.class)
@SmallTest
@DevSdkIgnoreRule.IgnoreUpTo(Build.VERSION_CODES.TIRAMISU)
public class AutomaticOnOffKeepaliveTrackerTest {
private static final String TAG = AutomaticOnOffKeepaliveTrackerTest.class.getSimpleName();
+ private static final int TEST_SLOT = 1;
private static final int TEST_NETID = 0xA85;
private static final int TEST_NETID_FWMARK = 0x0A85;
private static final int OTHER_NETID = 0x1A85;
private static final int NETID_MASK = 0xffff;
private static final int TIMEOUT_MS = 30_000;
private static final int MOCK_RESOURCE_ID = 5;
+ private static final int TEST_KEEPALIVE_INTERVAL_SEC = 10;
+ private static final int TEST_KEEPALIVE_INVALID_INTERVAL_SEC = 9;
+
private AutomaticOnOffKeepaliveTracker mAOOKeepaliveTracker;
private HandlerThread mHandlerThread;
@@ -101,8 +124,13 @@
@Mock AutomaticOnOffKeepaliveTracker.Dependencies mDependencies;
@Mock Context mCtx;
@Mock AlarmManager mAlarmManager;
+ @Mock NetworkAgentInfo mNai;
+ @Mock SubscriptionManager mSubscriptionManager;
+
+ KeepaliveStatsTracker mKeepaliveStatsTracker;
TestKeepaliveTracker mKeepaliveTracker;
AOOTestHandler mTestHandler;
+ TestTcpKeepaliveController mTcpController;
// Hexadecimal representation of a SOCK_DIAG response with tcp info.
private static final String SOCK_DIAG_TCP_INET_HEX =
@@ -201,11 +229,43 @@
private static final byte[] TEST_RESPONSE_BYTES =
HexEncoding.decode(TEST_RESPONSE_HEX.toCharArray(), false);
+ private static class TestKeepaliveInfo {
+ private static List<Socket> sOpenSockets = new ArrayList<>();
+
+ public static void closeAllSockets() throws Exception {
+ for (final Socket socket : sOpenSockets) {
+ socket.close();
+ }
+ sOpenSockets.clear();
+ }
+
+ public final Socket socket;
+ public final Binder binder;
+ public final FileDescriptor fd;
+ public final ISocketKeepaliveCallback socketKeepaliveCallback;
+ public final Network underpinnedNetwork;
+ public final KeepalivePacketData kpd;
+
+ TestKeepaliveInfo(KeepalivePacketData kpd) throws Exception {
+ this.kpd = kpd;
+ socket = new Socket();
+ socket.bind(null);
+ sOpenSockets.add(socket);
+ fd = socket.getFileDescriptor$();
+
+ binder = new Binder();
+ socketKeepaliveCallback = mock(ISocketKeepaliveCallback.class);
+ doReturn(binder).when(socketKeepaliveCallback).asBinder();
+ underpinnedNetwork = mock(Network.class);
+ }
+ }
+
private class TestKeepaliveTracker extends KeepaliveTracker {
private KeepaliveInfo mKi;
- TestKeepaliveTracker(@NonNull final Context context, @NonNull final Handler handler) {
- super(context, handler);
+ TestKeepaliveTracker(@NonNull final Context context, @NonNull final Handler handler,
+ @NonNull final TcpKeepaliveController tcpController) {
+ super(context, handler, tcpController, new Dependencies());
}
public void setReturnedKeepaliveInfo(@NonNull final KeepaliveInfo ki) {
@@ -224,20 +284,56 @@
}
return mKi;
}
+
+ @NonNull
+ @Override
+ public KeepaliveInfo makeTcpKeepaliveInfo(@Nullable final NetworkAgentInfo nai,
+ @Nullable final FileDescriptor fd, final int intervalSeconds,
+ @NonNull final ISocketKeepaliveCallback cb) {
+ if (null == mKi) {
+ throw new IllegalStateException("Please call `setReturnedKeepaliveInfo`"
+ + " before makeTcpKeepaliveInfo is called");
+ }
+ return mKi;
+ }
+ }
+
+ private static class TestTcpKeepaliveController extends TcpKeepaliveController {
+ TestTcpKeepaliveController(final Handler connectivityServiceHandler) {
+ super(connectivityServiceHandler);
+ }
+ }
+
+ private <T> void mockService(String serviceName, Class<T> serviceClass, T service) {
+ doReturn(serviceName).when(mCtx).getSystemServiceName(serviceClass);
+ doReturn(service).when(mCtx).getSystemService(serviceName);
+ if (mCtx.getSystemService(serviceClass) == null) {
+ // Test is using mockito-extended
+ doCallRealMethod().when(mCtx).getSystemService(serviceClass);
+ }
}
@Before
public void setup() throws Exception {
MockitoAnnotations.initMocks(this);
+ mockService(Context.TELEPHONY_SUBSCRIPTION_SERVICE, SubscriptionManager.class,
+ mSubscriptionManager);
+
+ mNai.networkCapabilities =
+ new NetworkCapabilities.Builder().addTransportType(TRANSPORT_CELLULAR).build();
+ mNai.networkInfo = new NetworkInfo(TYPE_MOBILE, 0 /* subtype */, "LTE", "LTE");
+ mNai.networkInfo.setDetailedState(
+ NetworkInfo.DetailedState.CONNECTED, "test reason", "test extra info");
+ doReturn(new Network(TEST_NETID)).when(mNai).network();
+ mNai.linkProperties = new LinkProperties();
+
doReturn(PERMISSION_GRANTED).when(mCtx).checkPermission(any() /* permission */,
anyInt() /* pid */, anyInt() /* uid */);
ConnectivityResources.setResourcesContextForTest(mCtx);
final Resources mockResources = mock(Resources.class);
- doReturn(MOCK_RESOURCE_ID).when(mockResources).getIdentifier(any() /* name */,
- any() /* defType */, any() /* defPackage */);
doReturn(new String[] { "0,3", "3,3" }).when(mockResources)
- .getStringArray(MOCK_RESOURCE_ID);
+ .getStringArray(R.array.config_networkSupportedKeepaliveCount);
doReturn(mockResources).when(mCtx).getResources();
doReturn(mNetd).when(mDependencies).getNetd();
doReturn(mAlarmManager).when(mDependencies).getAlarmManager(any());
@@ -249,13 +345,25 @@
mHandlerThread = new HandlerThread("KeepaliveTrackerTest");
mHandlerThread.start();
mTestHandler = new AOOTestHandler(mHandlerThread.getLooper());
- mKeepaliveTracker = new TestKeepaliveTracker(mCtx, mTestHandler);
+ mTcpController = new TestTcpKeepaliveController(mTestHandler);
+ mKeepaliveTracker = new TestKeepaliveTracker(mCtx, mTestHandler, mTcpController);
+ mKeepaliveStatsTracker = spy(new KeepaliveStatsTracker(mCtx, mTestHandler));
doReturn(mKeepaliveTracker).when(mDependencies).newKeepaliveTracker(mCtx, mTestHandler);
+ doReturn(mKeepaliveStatsTracker)
+ .when(mDependencies)
+ .newKeepaliveStatsTracker(mCtx, mTestHandler);
+
doReturn(true).when(mDependencies).isFeatureEnabled(any(), anyBoolean());
+ doReturn(0L).when(mDependencies).getElapsedRealtime();
mAOOKeepaliveTracker =
new AutomaticOnOffKeepaliveTracker(mCtx, mTestHandler, mDependencies);
}
+ @After
+ public void teardown() throws Exception {
+ TestKeepaliveInfo.closeAllSockets();
+ }
+
private final class AOOTestHandler extends Handler {
public AutomaticOnOffKeepaliveTracker.AutomaticOnOffKeepalive mLastAutoKi = null;
@@ -266,14 +374,22 @@
@Override
public void handleMessage(@NonNull final Message msg) {
switch (msg.what) {
- case NetworkAgent.CMD_START_SOCKET_KEEPALIVE:
- Log.d(TAG, "Test handler received CMD_START_SOCKET_KEEPALIVE : " + msg);
+ case AutomaticOnOffKeepaliveTracker.CMD_REQUEST_START_KEEPALIVE:
+ Log.d(TAG, "Test handler received CMD_REQUEST_START_KEEPALIVE : " + msg);
mAOOKeepaliveTracker.handleStartKeepalive(msg);
break;
- case NetworkAgent.CMD_MONITOR_AUTOMATIC_KEEPALIVE:
+ case AutomaticOnOffKeepaliveTracker.CMD_MONITOR_AUTOMATIC_KEEPALIVE:
Log.d(TAG, "Test handler received CMD_MONITOR_AUTOMATIC_KEEPALIVE : " + msg);
mLastAutoKi = mAOOKeepaliveTracker.getKeepaliveForBinder((IBinder) msg.obj);
break;
+ case CMD_STOP_SOCKET_KEEPALIVE:
+ Log.d(TAG, "Test handler received CMD_STOP_SOCKET_KEEPALIVE : " + msg);
+ mLastAutoKi = mAOOKeepaliveTracker.getKeepaliveForBinder((IBinder) msg.obj);
+ if (mLastAutoKi == null) {
+ fail("Attempt to stop an already stopped keepalive");
+ }
+ mAOOKeepaliveTracker.handleStopKeepalive(mLastAutoKi, msg.arg2);
+ break;
}
}
}
@@ -306,46 +422,78 @@
() -> assertFalse(mAOOKeepaliveTracker.isAnyTcpSocketConnected(TEST_NETID)));
}
- @Test
- public void testAlarm() throws Exception {
+ private void triggerEventKeepalive(int slot, int reason) {
+ visibleOnHandlerThread(
+ mTestHandler,
+ () -> mAOOKeepaliveTracker.handleEventSocketKeepalive(mNai, slot, reason));
+ }
+
+ private TestKeepaliveInfo doStartNattKeepalive(int intervalSeconds) throws Exception {
final InetAddress srcAddress = InetAddress.getByAddress(
new byte[] { (byte) 192, 0, 0, (byte) 129 });
final int srcPort = 12345;
- final InetAddress dstAddress = InetAddress.getByAddress(new byte[] { 8, 8, 8, 8});
+ final InetAddress dstAddress = InetAddress.getByAddress(new byte[] {8, 8, 8, 8});
final int dstPort = 12345;
- final NetworkAgentInfo nai = mock(NetworkAgentInfo.class);
- nai.networkCapabilities = new NetworkCapabilities.Builder()
- .addTransportType(TRANSPORT_CELLULAR).build();
- nai.networkInfo = new NetworkInfo(TYPE_MOBILE, 0 /* subtype */, "LTE", "LTE");
- nai.networkInfo.setDetailedState(NetworkInfo.DetailedState.CONNECTED, "test reason",
- "test extra info");
- nai.linkProperties = new LinkProperties();
- nai.linkProperties.addLinkAddress(new LinkAddress(srcAddress, 24));
+ mNai.linkProperties.addLinkAddress(new LinkAddress(srcAddress, 24));
- final Socket socket = new Socket();
- socket.bind(null);
- final FileDescriptor fd = socket.getFileDescriptor$();
- final IBinder binder = new Binder();
- final ISocketKeepaliveCallback cb = mock(ISocketKeepaliveCallback.class);
- doReturn(binder).when(cb).asBinder();
- final Network underpinnedNetwork = mock(Network.class);
-
- final KeepalivePacketData kpd = new NattKeepalivePacketData(srcAddress, srcPort,
+ final NattKeepalivePacketData kpd = new NattKeepalivePacketData(srcAddress, srcPort,
dstAddress, dstPort, new byte[] {1});
- final KeepaliveInfo ki = mKeepaliveTracker.new KeepaliveInfo(cb, nai, kpd,
- 10 /* interval */, KeepaliveInfo.TYPE_NATT, fd);
+
+ final TestKeepaliveInfo testInfo = new TestKeepaliveInfo(kpd);
+
+ final KeepaliveInfo ki = mKeepaliveTracker.new KeepaliveInfo(
+ testInfo.socketKeepaliveCallback, mNai, kpd, intervalSeconds,
+ KeepaliveInfo.TYPE_NATT, testInfo.fd);
mKeepaliveTracker.setReturnedKeepaliveInfo(ki);
- mAOOKeepaliveTracker.startNattKeepalive(nai, fd, 10 /* intervalSeconds */, cb,
- srcAddress.toString(), srcPort, dstAddress.toString(), dstPort,
- true /* automaticOnOffKeepalives */, underpinnedNetwork);
+ mAOOKeepaliveTracker.startNattKeepalive(mNai, testInfo.fd, intervalSeconds,
+ testInfo.socketKeepaliveCallback, srcAddress.toString(), srcPort,
+ dstAddress.toString(), dstPort, true /* automaticOnOffKeepalives */,
+ testInfo.underpinnedNetwork);
HandlerUtils.waitForIdle(mTestHandler, TIMEOUT_MS);
+ return testInfo;
+ }
+
+ private TestKeepaliveInfo doStartNattKeepalive() throws Exception {
+ return doStartNattKeepalive(TEST_KEEPALIVE_INTERVAL_SEC);
+ }
+
+ private void doPauseKeepalive(AutomaticOnOffKeepalive autoKi) throws Exception {
+ setupResponseWithoutSocketExisting();
+ visibleOnHandlerThread(
+ mTestHandler,
+ () -> mAOOKeepaliveTracker.handleMonitorAutomaticKeepalive(autoKi, TEST_NETID));
+ }
+
+ private void doResumeKeepalive(AutomaticOnOffKeepalive autoKi) throws Exception {
+ setupResponseWithSocketExisting();
+ visibleOnHandlerThread(
+ mTestHandler,
+ () -> mAOOKeepaliveTracker.handleMonitorAutomaticKeepalive(autoKi, TEST_NETID));
+ }
+
+ private void doStopKeepalive(AutomaticOnOffKeepalive autoKi) throws Exception {
+ visibleOnHandlerThread(
+ mTestHandler,
+ () -> mAOOKeepaliveTracker.handleStopKeepalive(autoKi, SocketKeepalive.SUCCESS));
+ }
+
+ @Test
+ public void testAlarm() throws Exception {
+ // Mock elapsed real time to verify the alarm timer.
+ final long time = SystemClock.elapsedRealtime();
+ doReturn(time).when(mDependencies).getElapsedRealtime();
+ final TestKeepaliveInfo testInfo = doStartNattKeepalive();
+
final ArgumentCaptor<AlarmManager.OnAlarmListener> listenerCaptor =
ArgumentCaptor.forClass(AlarmManager.OnAlarmListener.class);
- verify(mAlarmManager).setExact(eq(AlarmManager.ELAPSED_REALTIME), anyLong(),
- any(), listenerCaptor.capture(), eq(mTestHandler));
+ // The alarm timer should be smaller than the keepalive delay. Verify the alarm trigger time
+ // is higher than base time but smaller than the keepalive delay.
+ verify(mAlarmManager).setExact(eq(AlarmManager.ELAPSED_REALTIME),
+ longThat(t -> t > time + 1000L && t < time + TEST_KEEPALIVE_INTERVAL_SEC * 1000L),
+ any() /* tag */, listenerCaptor.capture(), eq(mTestHandler));
final AlarmManager.OnAlarmListener listener = listenerCaptor.getValue();
// For realism, the listener should be posted on the handler
@@ -356,9 +504,32 @@
HandlerUtils.waitForIdle(mTestHandler, TIMEOUT_MS);
assertNotNull(mTestHandler.mLastAutoKi);
- assertEquals(cb, mTestHandler.mLastAutoKi.getCallback());
- assertEquals(underpinnedNetwork, mTestHandler.mLastAutoKi.getUnderpinnedNetwork());
- socket.close();
+ assertEquals(testInfo.socketKeepaliveCallback, mTestHandler.mLastAutoKi.getCallback());
+ assertEquals(testInfo.underpinnedNetwork, mTestHandler.mLastAutoKi.getUnderpinnedNetwork());
+ }
+
+ @Test
+ public void testAlarm_writeMetrics() throws Exception {
+ final ArgumentCaptor<AlarmManager.OnAlarmListener> listenerCaptor =
+ ArgumentCaptor.forClass(AlarmManager.OnAlarmListener.class);
+
+ // First AlarmManager.set call from the constructor.
+ verify(mAlarmManager).set(eq(AlarmManager.ELAPSED_REALTIME_WAKEUP),
+ eq(METRICS_COLLECTION_DURATION_MS), any() /* tag */, listenerCaptor.capture(),
+ eq(mTestHandler));
+
+ final AlarmManager.OnAlarmListener listener = listenerCaptor.getValue();
+
+ doReturn(METRICS_COLLECTION_DURATION_MS).when(mDependencies).getElapsedRealtime();
+ // For realism, the listener should be posted on the handler
+ mTestHandler.post(() -> listener.onAlarm());
+ HandlerUtils.waitForIdle(mTestHandler, TIMEOUT_MS);
+
+ verify(mKeepaliveStatsTracker).writeAndResetMetrics();
+ // Alarm is rescheduled.
+ verify(mAlarmManager).set(eq(AlarmManager.ELAPSED_REALTIME_WAKEUP),
+ eq(METRICS_COLLECTION_DURATION_MS * 2),
+ any() /* tag */, listenerCaptor.capture(), eq(mTestHandler));
}
private void setupResponseWithSocketExisting() throws Exception {
@@ -385,4 +556,335 @@
buffer.order(ByteOrder.nativeOrder());
return buffer;
}
+
+ private AutomaticOnOffKeepalive getAutoKiForBinder(IBinder binder) {
+ return visibleOnHandlerThread(
+ mTestHandler, () -> mAOOKeepaliveTracker.getKeepaliveForBinder(binder));
+ }
+
+ private void checkAndProcessKeepaliveStart(final KeepalivePacketData kpd) throws Exception {
+ checkAndProcessKeepaliveStart(TEST_SLOT, kpd);
+ }
+
+ private void checkAndProcessKeepaliveStart(
+ int slot, final KeepalivePacketData kpd) throws Exception {
+ verify(mNai).onStartNattSocketKeepalive(
+ slot, TEST_KEEPALIVE_INTERVAL_SEC, (NattKeepalivePacketData) kpd);
+ verify(mNai).onAddNattKeepalivePacketFilter(slot, (NattKeepalivePacketData) kpd);
+ triggerEventKeepalive(slot, SocketKeepalive.SUCCESS);
+ }
+
+ private void checkAndProcessKeepaliveStop() throws Exception {
+ checkAndProcessKeepaliveStop(TEST_SLOT);
+ }
+
+ private void checkAndProcessKeepaliveStop(int slot) throws Exception {
+ verify(mNai).onStopSocketKeepalive(slot);
+ verify(mNai).onRemoveKeepalivePacketFilter(slot);
+ triggerEventKeepalive(slot, SocketKeepalive.SUCCESS);
+ }
+
+ @Test
+ public void testStartNattKeepalive_valid() throws Exception {
+ final TestKeepaliveInfo testInfo = doStartNattKeepalive();
+
+ checkAndProcessKeepaliveStart(testInfo.kpd);
+
+ final AutomaticOnOffKeepalive autoKi = getAutoKiForBinder(testInfo.binder);
+ assertNotNull(autoKi);
+ assertEquals(testInfo.socketKeepaliveCallback, autoKi.getCallback());
+
+ verify(testInfo.socketKeepaliveCallback).onStarted();
+ verifyNoMoreInteractions(ignoreStubs(testInfo.socketKeepaliveCallback));
+ }
+
+ @Test
+ public void testStartNattKeepalive_invalidInterval() throws Exception {
+ final TestKeepaliveInfo testInfo =
+ doStartNattKeepalive(TEST_KEEPALIVE_INVALID_INTERVAL_SEC);
+
+ assertNull(getAutoKiForBinder(testInfo.binder));
+
+ verify(testInfo.socketKeepaliveCallback).onError(SocketKeepalive.ERROR_INVALID_INTERVAL);
+ verifyNoMoreInteractions(ignoreStubs(testInfo.socketKeepaliveCallback));
+ }
+
+ @Test
+ public void testHandleEventSocketKeepalive_startingFailureHardwareError() throws Exception {
+ final TestKeepaliveInfo testInfo = doStartNattKeepalive();
+
+ verify(mNai).onStartNattSocketKeepalive(
+ TEST_SLOT, TEST_KEEPALIVE_INTERVAL_SEC, (NattKeepalivePacketData) testInfo.kpd);
+ verify(mNai).onAddNattKeepalivePacketFilter(
+ TEST_SLOT, (NattKeepalivePacketData) testInfo.kpd);
+ // Network agent returns an error, fails to start the keepalive.
+ triggerEventKeepalive(TEST_SLOT, SocketKeepalive.ERROR_HARDWARE_ERROR);
+
+ checkAndProcessKeepaliveStop();
+
+ assertNull(getAutoKiForBinder(testInfo.binder));
+
+ verify(testInfo.socketKeepaliveCallback).onError(SocketKeepalive.ERROR_HARDWARE_ERROR);
+ verifyNoMoreInteractions(ignoreStubs(testInfo.socketKeepaliveCallback));
+ }
+
+ @Test
+ public void testHandleCheckKeepalivesStillValid_linkPropertiesChanged() throws Exception {
+ // Successful start of NATT keepalive.
+ final TestKeepaliveInfo testInfo = doStartNattKeepalive();
+ checkAndProcessKeepaliveStart(testInfo.kpd);
+ verify(testInfo.socketKeepaliveCallback).onStarted();
+
+ // Source address is removed from link properties by clearing.
+ mNai.linkProperties.clear();
+
+ // Check for valid keepalives
+ visibleOnHandlerThread(
+ mTestHandler, () -> mAOOKeepaliveTracker.handleCheckKeepalivesStillValid(mNai));
+
+ checkAndProcessKeepaliveStop();
+
+ assertNull(getAutoKiForBinder(testInfo.binder));
+
+ verify(testInfo.socketKeepaliveCallback).onError(SocketKeepalive.ERROR_INVALID_IP_ADDRESS);
+ verifyNoMoreInteractions(ignoreStubs(testInfo.socketKeepaliveCallback));
+ }
+
+ @Test
+ public void testStopKeepalive() throws Exception {
+ // Successful start of NATT keepalive.
+ final TestKeepaliveInfo testInfo = doStartNattKeepalive();
+ checkAndProcessKeepaliveStart(testInfo.kpd);
+ verify(testInfo.socketKeepaliveCallback).onStarted();
+
+ doStopKeepalive(getAutoKiForBinder(testInfo.binder));
+ checkAndProcessKeepaliveStop();
+
+ assertNull(getAutoKiForBinder(testInfo.binder));
+ verify(testInfo.socketKeepaliveCallback).onStopped();
+ verifyNoMoreInteractions(ignoreStubs(testInfo.socketKeepaliveCallback));
+ }
+
+ @Test
+ public void testPauseKeepalive() throws Exception {
+ // Successful start of NATT keepalive.
+ final TestKeepaliveInfo testInfo = doStartNattKeepalive();
+ checkAndProcessKeepaliveStart(testInfo.kpd);
+ verify(testInfo.socketKeepaliveCallback).onStarted();
+
+ doPauseKeepalive(getAutoKiForBinder(testInfo.binder));
+
+ checkAndProcessKeepaliveStop();
+ verify(testInfo.socketKeepaliveCallback).onPaused();
+
+ // Pausing does not cleanup the autoKi
+ assertNotNull(getAutoKiForBinder(testInfo.binder));
+
+ clearInvocations(mNai);
+ doStopKeepalive(getAutoKiForBinder(testInfo.binder));
+ // The keepalive is already stopped.
+ verify(mNai, never()).onStopSocketKeepalive(TEST_SLOT);
+ verify(mNai, never()).onRemoveKeepalivePacketFilter(TEST_SLOT);
+
+ // Stopping while paused still calls onStopped.
+ verify(testInfo.socketKeepaliveCallback).onStopped();
+ // autoKi is cleaned up.
+ assertNull(getAutoKiForBinder(testInfo.binder));
+
+ verifyNoMoreInteractions(ignoreStubs(testInfo.socketKeepaliveCallback));
+
+ // Make sure the slot is free
+ final TestKeepaliveInfo testInfo2 = doStartNattKeepalive();
+ checkAndProcessKeepaliveStart(testInfo2.kpd);
+ }
+
+ @Test
+ public void testResumeKeepalive() throws Exception {
+ // Successful start of NATT keepalive.
+ final TestKeepaliveInfo testInfo = doStartNattKeepalive();
+ checkAndProcessKeepaliveStart(testInfo.kpd);
+ verify(testInfo.socketKeepaliveCallback).onStarted();
+
+ doPauseKeepalive(getAutoKiForBinder(testInfo.binder));
+ checkAndProcessKeepaliveStop();
+ verify(testInfo.socketKeepaliveCallback).onPaused();
+
+ clearInvocations(mNai);
+ doResumeKeepalive(getAutoKiForBinder(testInfo.binder));
+ checkAndProcessKeepaliveStart(testInfo.kpd);
+ assertNotNull(getAutoKiForBinder(testInfo.binder));
+ verify(testInfo.socketKeepaliveCallback).onResumed();
+
+ doStopKeepalive(getAutoKiForBinder(testInfo.binder));
+ checkAndProcessKeepaliveStop();
+ assertNull(getAutoKiForBinder(testInfo.binder));
+
+ verify(testInfo.socketKeepaliveCallback).onStopped();
+ verifyNoMoreInteractions(ignoreStubs(testInfo.socketKeepaliveCallback));
+ }
+
+ @Test
+ public void testResumeKeepalive_invalidSourceAddress() throws Exception {
+ // Successful start of NATT keepalive.
+ final TestKeepaliveInfo testInfo = doStartNattKeepalive();
+ checkAndProcessKeepaliveStart(testInfo.kpd);
+ verify(testInfo.socketKeepaliveCallback).onStarted();
+
+ doPauseKeepalive(getAutoKiForBinder(testInfo.binder));
+ checkAndProcessKeepaliveStop();
+ verify(testInfo.socketKeepaliveCallback).onPaused();
+
+ mNai.linkProperties.clear();
+
+ clearInvocations(mNai);
+ doResumeKeepalive(getAutoKiForBinder(testInfo.binder));
+ verify(mNai, never()).onStartNattSocketKeepalive(anyInt(), anyInt(), any());
+ verify(mNai, never()).onAddNattKeepalivePacketFilter(anyInt(), any());
+
+ assertNull(getAutoKiForBinder(testInfo.binder));
+
+ verify(testInfo.socketKeepaliveCallback).onError(SocketKeepalive.ERROR_INVALID_IP_ADDRESS);
+ verifyNoMoreInteractions(ignoreStubs(testInfo.socketKeepaliveCallback));
+ }
+
+ @Test
+ public void testResumeKeepalive_startingFailureHardwareError() throws Exception {
+ // Successful start of NATT keepalive.
+ final TestKeepaliveInfo testInfo = doStartNattKeepalive();
+ checkAndProcessKeepaliveStart(testInfo.kpd);
+ verify(testInfo.socketKeepaliveCallback).onStarted();
+
+ doPauseKeepalive(getAutoKiForBinder(testInfo.binder));
+ checkAndProcessKeepaliveStop();
+ verify(testInfo.socketKeepaliveCallback).onPaused();
+
+ clearInvocations(mNai);
+ doResumeKeepalive(getAutoKiForBinder(testInfo.binder));
+
+ verify(mNai).onStartNattSocketKeepalive(
+ TEST_SLOT, TEST_KEEPALIVE_INTERVAL_SEC, (NattKeepalivePacketData) testInfo.kpd);
+ verify(mNai).onAddNattKeepalivePacketFilter(
+ TEST_SLOT, (NattKeepalivePacketData) testInfo.kpd);
+ // Network agent returns error on starting the keepalive.
+ triggerEventKeepalive(TEST_SLOT, SocketKeepalive.ERROR_HARDWARE_ERROR);
+
+ checkAndProcessKeepaliveStop();
+
+ assertNull(getAutoKiForBinder(testInfo.binder));
+ verify(testInfo.socketKeepaliveCallback).onError(SocketKeepalive.ERROR_HARDWARE_ERROR);
+ verifyNoMoreInteractions(ignoreStubs(testInfo.socketKeepaliveCallback));
+ }
+
+ @Test
+ public void testStopAllKeepalives() throws Exception {
+ final TestKeepaliveInfo testInfo1 = doStartNattKeepalive();
+ final TestKeepaliveInfo testInfo2 = doStartNattKeepalive();
+ checkAndProcessKeepaliveStart(TEST_SLOT, testInfo1.kpd);
+ checkAndProcessKeepaliveStart(TEST_SLOT + 1, testInfo2.kpd);
+
+ verify(testInfo1.socketKeepaliveCallback).onStarted();
+ verify(testInfo2.socketKeepaliveCallback).onStarted();
+
+ // Pause the first keepalive
+ doPauseKeepalive(getAutoKiForBinder(testInfo1.binder));
+ checkAndProcessKeepaliveStop(TEST_SLOT);
+ verify(testInfo1.socketKeepaliveCallback).onPaused();
+
+ visibleOnHandlerThread(
+ mTestHandler,
+ () -> mAOOKeepaliveTracker.handleStopAllKeepalives(
+ mNai, SocketKeepalive.ERROR_INVALID_NETWORK));
+
+ // Note that checkAndProcessKeepaliveStop is not called since the network agent is assumed
+ // to be disconnected for a handleStopAllKeepalives call.
+ assertNull(getAutoKiForBinder(testInfo1.binder));
+ assertNull(getAutoKiForBinder(testInfo2.binder));
+
+ verify(testInfo1.socketKeepaliveCallback, never()).onStopped();
+ verify(testInfo2.socketKeepaliveCallback, never()).onStopped();
+ verify(testInfo1.socketKeepaliveCallback).onError(SocketKeepalive.ERROR_INVALID_NETWORK);
+ verify(testInfo2.socketKeepaliveCallback).onError(SocketKeepalive.ERROR_INVALID_NETWORK);
+
+ verifyNoMoreInteractions(ignoreStubs(testInfo1.socketKeepaliveCallback));
+ verifyNoMoreInteractions(ignoreStubs(testInfo2.socketKeepaliveCallback));
+ }
+
+ @Test
+ public void testTwoKeepalives_startAfterPause() throws Exception {
+ final TestKeepaliveInfo testInfo1 = doStartNattKeepalive();
+ checkAndProcessKeepaliveStart(testInfo1.kpd);
+ verify(testInfo1.socketKeepaliveCallback).onStarted();
+ assertNotNull(getAutoKiForBinder(testInfo1.binder));
+
+ final AutomaticOnOffKeepalive autoKi1 = getAutoKiForBinder(testInfo1.binder);
+ doPauseKeepalive(autoKi1);
+ checkAndProcessKeepaliveStop(TEST_SLOT);
+ verify(testInfo1.socketKeepaliveCallback).onPaused();
+ assertNotNull(getAutoKiForBinder(testInfo1.binder));
+
+ clearInvocations(mNai);
+ // Start the second keepalive while the first is paused.
+ final TestKeepaliveInfo testInfo2 = doStartNattKeepalive();
+ // The slot used is TEST_SLOT + 1 since TEST_SLOT is being taken by the paused keepalive.
+ checkAndProcessKeepaliveStart(TEST_SLOT + 1, testInfo2.kpd);
+ verify(testInfo2.socketKeepaliveCallback).onStarted();
+ assertNotNull(getAutoKiForBinder(testInfo2.binder));
+
+ clearInvocations(mNai);
+ doResumeKeepalive(autoKi1);
+ // Resume on TEST_SLOT.
+ checkAndProcessKeepaliveStart(TEST_SLOT, testInfo1.kpd);
+ verify(testInfo1.socketKeepaliveCallback).onResumed();
+
+ clearInvocations(mNai);
+ doStopKeepalive(autoKi1);
+ checkAndProcessKeepaliveStop(TEST_SLOT);
+ verify(testInfo1.socketKeepaliveCallback).onStopped();
+ verify(testInfo2.socketKeepaliveCallback, never()).onStopped();
+ assertNull(getAutoKiForBinder(testInfo1.binder));
+
+ clearInvocations(mNai);
+ assertNotNull(getAutoKiForBinder(testInfo2.binder));
+ doStopKeepalive(getAutoKiForBinder(testInfo2.binder));
+ checkAndProcessKeepaliveStop(TEST_SLOT + 1);
+ verify(testInfo2.socketKeepaliveCallback).onStopped();
+ assertNull(getAutoKiForBinder(testInfo2.binder));
+
+ verifyNoMoreInteractions(ignoreStubs(testInfo1.socketKeepaliveCallback));
+ verifyNoMoreInteractions(ignoreStubs(testInfo2.socketKeepaliveCallback));
+ }
+
+ @Test
+ public void testStartTcpKeepalive_fdInitiatedStop() throws Exception {
+ final InetAddress srcAddress = InetAddress.getByAddress(
+ new byte[] { (byte) 192, 0, 0, (byte) 129 });
+ mNai.linkProperties.addLinkAddress(new LinkAddress(srcAddress, 24));
+
+ final KeepalivePacketData kpd = new TcpKeepalivePacketData(
+ InetAddress.getByAddress(new byte[] { (byte) 192, 0, 0, (byte) 129 }) /* srcAddr */,
+ 12345 /* srcPort */,
+ InetAddress.getByAddress(new byte[] { 8, 8, 8, 8}) /* dstAddr */,
+ 12345 /* dstPort */, new byte[] {1}, 111 /* tcpSeq */,
+ 222 /* tcpAck */, 800 /* tcpWindow */, 2 /* tcpWindowScale */,
+ 4 /* ipTos */, 64 /* ipTtl */);
+ final TestKeepaliveInfo testInfo = new TestKeepaliveInfo(kpd);
+
+ final KeepaliveInfo ki = mKeepaliveTracker.new KeepaliveInfo(
+ testInfo.socketKeepaliveCallback, mNai, kpd,
+ TEST_KEEPALIVE_INTERVAL_SEC, KeepaliveInfo.TYPE_TCP, testInfo.fd);
+ mKeepaliveTracker.setReturnedKeepaliveInfo(ki);
+
+ // Setup TCP keepalive.
+ mAOOKeepaliveTracker.startTcpKeepalive(mNai, testInfo.fd, TEST_KEEPALIVE_INTERVAL_SEC,
+ testInfo.socketKeepaliveCallback);
+ HandlerUtils.waitForIdle(mTestHandler, TIMEOUT_MS);
+
+ // A closed socket will result in EVENT_HANGUP and trigger error to
+ // FileDescriptorEventListener.
+ testInfo.socket.close();
+ HandlerUtils.waitForIdle(mTestHandler, TIMEOUT_MS);
+
+ // The keepalive should be removed in AutomaticOnOffKeepaliveTracker.
+ getAutoKiForBinder(testInfo.binder);
+ }
}
diff --git a/tests/unit/java/com/android/server/connectivity/ClatCoordinatorTest.java b/tests/unit/java/com/android/server/connectivity/ClatCoordinatorTest.java
index b651c33..4158663 100644
--- a/tests/unit/java/com/android/server/connectivity/ClatCoordinatorTest.java
+++ b/tests/unit/java/com/android/server/connectivity/ClatCoordinatorTest.java
@@ -313,8 +313,7 @@
* Stop clatd.
*/
@Override
- public void stopClatd(@NonNull String iface, @NonNull String pfx96, @NonNull String v4,
- @NonNull String v6, int pid) throws IOException {
+ public void stopClatd(int pid) throws IOException {
if (pid == -1) {
fail("unsupported arg: " + pid);
}
@@ -479,8 +478,7 @@
eq((short) PRIO_CLAT), eq((short) ETH_P_IP));
inOrder.verify(mEgressMap).deleteEntry(eq(EGRESS_KEY));
inOrder.verify(mIngressMap).deleteEntry(eq(INGRESS_KEY));
- inOrder.verify(mDeps).stopClatd(eq(BASE_IFACE), eq(NAT64_PREFIX_STRING),
- eq(XLAT_LOCAL_IPV4ADDR_STRING), eq(XLAT_LOCAL_IPV6ADDR_STRING), eq(CLATD_PID));
+ inOrder.verify(mDeps).stopClatd(eq(CLATD_PID));
inOrder.verify(mCookieTagMap).deleteEntry(eq(COOKIE_TAG_KEY));
assertNull(coordinator.getClatdTrackerForTesting());
inOrder.verifyNoMoreInteractions();
diff --git a/tests/unit/java/com/android/server/connectivity/KeepaliveStatsTrackerTest.java b/tests/unit/java/com/android/server/connectivity/KeepaliveStatsTrackerTest.java
new file mode 100644
index 0000000..0d2e540
--- /dev/null
+++ b/tests/unit/java/com/android/server/connectivity/KeepaliveStatsTrackerTest.java
@@ -0,0 +1,1195 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.connectivity;
+
+import static android.net.NetworkCapabilities.TRANSPORT_CELLULAR;
+import static android.net.NetworkCapabilities.TRANSPORT_WIFI;
+
+import static com.android.testutils.HandlerUtils.visibleOnHandlerThread;
+
+import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertThrows;
+import static org.junit.Assert.fail;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyLong;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.doCallRealMethod;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.net.Network;
+import android.net.NetworkCapabilities;
+import android.net.TelephonyNetworkSpecifier;
+import android.net.wifi.WifiInfo;
+import android.os.Build;
+import android.os.Handler;
+import android.os.HandlerThread;
+import android.telephony.SubscriptionInfo;
+import android.telephony.SubscriptionManager;
+import android.telephony.SubscriptionManager.OnSubscriptionsChangedListener;
+import android.telephony.TelephonyManager;
+
+import androidx.test.filters.SmallTest;
+
+import com.android.metrics.DailykeepaliveInfoReported;
+import com.android.metrics.DurationForNumOfKeepalive;
+import com.android.metrics.DurationPerNumOfKeepalive;
+import com.android.metrics.KeepaliveLifetimeForCarrier;
+import com.android.metrics.KeepaliveLifetimePerCarrier;
+import com.android.modules.utils.BackgroundThread;
+import com.android.net.module.util.CollectionUtils;
+import com.android.testutils.DevSdkIgnoreRule;
+import com.android.testutils.DevSdkIgnoreRunner;
+import com.android.testutils.HandlerUtils;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+@RunWith(DevSdkIgnoreRunner.class)
+@SmallTest
+@DevSdkIgnoreRule.IgnoreUpTo(Build.VERSION_CODES.TIRAMISU)
+public class KeepaliveStatsTrackerTest {
+ private static final int TIMEOUT_MS = 30_000;
+
+ private static final int TEST_SLOT = 1;
+ private static final int TEST_SLOT2 = 2;
+ private static final int TEST_KEEPALIVE_INTERVAL_SEC = 10;
+ private static final int TEST_KEEPALIVE_INTERVAL2_SEC = 20;
+ private static final int TEST_SUB_ID_1 = 1;
+ private static final int TEST_SUB_ID_2 = 2;
+ private static final int TEST_CARRIER_ID_1 = 135;
+ private static final int TEST_CARRIER_ID_2 = 246;
+ private static final Network TEST_NETWORK = new Network(123);
+ private static final NetworkCapabilities TEST_NETWORK_CAPABILITIES =
+ buildCellNetworkCapabilitiesWithSubId(TEST_SUB_ID_1);
+ private static final NetworkCapabilities TEST_NETWORK_CAPABILITIES_2 =
+ buildCellNetworkCapabilitiesWithSubId(TEST_SUB_ID_2);
+ private static final int TEST_UID = 1234;
+
+ private static NetworkCapabilities buildCellNetworkCapabilitiesWithSubId(int subId) {
+ final TelephonyNetworkSpecifier telephonyNetworkSpecifier =
+ new TelephonyNetworkSpecifier.Builder().setSubscriptionId(subId).build();
+ return new NetworkCapabilities.Builder()
+ .addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR)
+ .setNetworkSpecifier(telephonyNetworkSpecifier)
+ .build();
+ }
+
+ private HandlerThread mHandlerThread;
+ private Handler mTestHandler;
+
+ private KeepaliveStatsTracker mKeepaliveStatsTracker;
+
+ @Mock private Context mContext;
+ @Mock private KeepaliveStatsTracker.Dependencies mDependencies;
+ @Mock private SubscriptionManager mSubscriptionManager;
+
+ private void triggerBroadcastDefaultSubId(int subId) {
+ final ArgumentCaptor<BroadcastReceiver> receiverCaptor =
+ ArgumentCaptor.forClass(BroadcastReceiver.class);
+ verify(mContext).registerReceiver(receiverCaptor.capture(), /* filter= */ any(),
+ /* broadcastPermission= */ any(), eq(mTestHandler));
+ final Intent intent =
+ new Intent(TelephonyManager.ACTION_SUBSCRIPTION_CARRIER_IDENTITY_CHANGED);
+ intent.putExtra(SubscriptionManager.EXTRA_SUBSCRIPTION_INDEX, subId);
+
+ receiverCaptor.getValue().onReceive(mContext, intent);
+ }
+
+ private OnSubscriptionsChangedListener getOnSubscriptionsChangedListener() {
+ final ArgumentCaptor<OnSubscriptionsChangedListener> listenerCaptor =
+ ArgumentCaptor.forClass(OnSubscriptionsChangedListener.class);
+ verify(mSubscriptionManager)
+ .addOnSubscriptionsChangedListener(any(), listenerCaptor.capture());
+ return listenerCaptor.getValue();
+ }
+
+ private static final class KeepaliveCarrierStats {
+ public final int carrierId;
+ public final int transportTypes;
+ public final int intervalMs;
+ public final int lifetimeMs;
+ public final int activeLifetimeMs;
+
+ KeepaliveCarrierStats(
+ int carrierId,
+ int transportTypes,
+ int intervalMs,
+ int lifetimeMs,
+ int activeLifetimeMs) {
+ this.carrierId = carrierId;
+ this.transportTypes = transportTypes;
+ this.intervalMs = intervalMs;
+ this.lifetimeMs = lifetimeMs;
+ this.activeLifetimeMs = activeLifetimeMs;
+ }
+
+ // Equals method on only the key, (carrierId, tranportTypes, intervalMs)
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+
+ final KeepaliveCarrierStats that = (KeepaliveCarrierStats) o;
+
+ return carrierId == that.carrierId && transportTypes == that.transportTypes
+ && intervalMs == that.intervalMs;
+ }
+
+ @Override
+ public int hashCode() {
+ return carrierId + 3 * transportTypes + 5 * intervalMs;
+ }
+ }
+
+ // Use the default test carrier id, transportType and keepalive interval.
+ private KeepaliveCarrierStats getDefaultCarrierStats(int lifetimeMs, int activeLifetimeMs) {
+ return new KeepaliveCarrierStats(
+ TEST_CARRIER_ID_1,
+ /* transportTypes= */ (1 << TRANSPORT_CELLULAR),
+ TEST_KEEPALIVE_INTERVAL_SEC * 1000,
+ lifetimeMs,
+ activeLifetimeMs);
+ }
+
+ private <T> void mockService(String serviceName, Class<T> serviceClass, T service) {
+ doReturn(serviceName).when(mContext).getSystemServiceName(serviceClass);
+ doReturn(service).when(mContext).getSystemService(serviceName);
+ if (mContext.getSystemService(serviceClass) == null) {
+ // Test is using mockito-extended
+ doCallRealMethod().when(mContext).getSystemService(serviceClass);
+ }
+ }
+
+ private SubscriptionInfo makeSubInfoMock(int subId, int carrierId) {
+ final SubscriptionInfo subInfo = mock(SubscriptionInfo.class);
+ doReturn(subId).when(subInfo).getSubscriptionId();
+ doReturn(carrierId).when(subInfo).getCarrierId();
+ return subInfo;
+ }
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ mockService(Context.TELEPHONY_SUBSCRIPTION_SERVICE, SubscriptionManager.class,
+ mSubscriptionManager);
+
+ final SubscriptionInfo subInfo1 = makeSubInfoMock(TEST_SUB_ID_1, TEST_CARRIER_ID_1);
+ final SubscriptionInfo subInfo2 = makeSubInfoMock(TEST_SUB_ID_2, TEST_CARRIER_ID_2);
+
+ doReturn(List.of(subInfo1, subInfo2))
+ .when(mSubscriptionManager)
+ .getActiveSubscriptionInfoList();
+
+ mHandlerThread = new HandlerThread("KeepaliveStatsTrackerTest");
+ mHandlerThread.start();
+ mTestHandler = new Handler(mHandlerThread.getLooper());
+
+ setElapsedRealtime(0);
+ mKeepaliveStatsTracker = new KeepaliveStatsTracker(mContext, mTestHandler, mDependencies);
+ HandlerUtils.waitForIdle(BackgroundThread.getHandler(), TIMEOUT_MS);
+
+ // Initial onSubscriptionsChanged.
+ getOnSubscriptionsChangedListener().onSubscriptionsChanged();
+ HandlerUtils.waitForIdle(mTestHandler, TIMEOUT_MS);
+ }
+
+ private void setElapsedRealtime(long time) {
+ doReturn(time).when(mDependencies).getElapsedRealtime();
+ }
+
+ private DailykeepaliveInfoReported buildKeepaliveMetrics(long time) {
+ setElapsedRealtime(time);
+
+ return visibleOnHandlerThread(
+ mTestHandler, () -> mKeepaliveStatsTracker.buildKeepaliveMetrics());
+ }
+
+ private DailykeepaliveInfoReported buildAndResetMetrics(long time) {
+ setElapsedRealtime(time);
+
+ return visibleOnHandlerThread(
+ mTestHandler, () -> mKeepaliveStatsTracker.buildAndResetMetrics());
+ }
+
+ private void onStartKeepalive(long time, int slot) {
+ onStartKeepalive(time, slot, TEST_KEEPALIVE_INTERVAL_SEC);
+ }
+
+ private void onStartKeepalive(long time, int slot, int intervalSeconds) {
+ onStartKeepalive(time, slot, TEST_NETWORK_CAPABILITIES, intervalSeconds);
+ }
+
+ private void onStartKeepalive(long time, int slot, NetworkCapabilities nc) {
+ onStartKeepalive(time, slot, nc, TEST_KEEPALIVE_INTERVAL_SEC);
+ }
+
+ private void onStartKeepalive(
+ long time, int slot, NetworkCapabilities nc, int intervalSeconds) {
+ onStartKeepalive(time, slot, nc, intervalSeconds, TEST_UID, /* isAutoKeepalive= */ true);
+ }
+
+ private void onStartKeepalive(long time, int slot, NetworkCapabilities nc, int intervalSeconds,
+ int uid, boolean isAutoKeepalive) {
+ setElapsedRealtime(time);
+ visibleOnHandlerThread(mTestHandler, () ->
+ mKeepaliveStatsTracker.onStartKeepalive(TEST_NETWORK, slot, nc, intervalSeconds,
+ uid, isAutoKeepalive));
+ }
+
+ private void onPauseKeepalive(long time, int slot) {
+ setElapsedRealtime(time);
+ visibleOnHandlerThread(
+ mTestHandler, () -> mKeepaliveStatsTracker.onPauseKeepalive(TEST_NETWORK, slot));
+ }
+
+ private void onResumeKeepalive(long time, int slot) {
+ setElapsedRealtime(time);
+ visibleOnHandlerThread(
+ mTestHandler, () -> mKeepaliveStatsTracker.onResumeKeepalive(TEST_NETWORK, slot));
+ }
+
+ private void onStopKeepalive(long time, int slot) {
+ setElapsedRealtime(time);
+ visibleOnHandlerThread(
+ mTestHandler, () -> mKeepaliveStatsTracker.onStopKeepalive(TEST_NETWORK, slot));
+ }
+
+ @Test
+ public void testEnsureRunningOnHandlerThread() {
+ // Not running on handler thread
+ assertThrows(
+ IllegalStateException.class,
+ () -> mKeepaliveStatsTracker.onStartKeepalive(
+ TEST_NETWORK,
+ TEST_SLOT,
+ TEST_NETWORK_CAPABILITIES,
+ TEST_KEEPALIVE_INTERVAL_SEC,
+ TEST_UID,
+ /* isAutoKeepalive */ true));
+ assertThrows(
+ IllegalStateException.class,
+ () -> mKeepaliveStatsTracker.onPauseKeepalive(TEST_NETWORK, TEST_SLOT));
+ assertThrows(
+ IllegalStateException.class,
+ () -> mKeepaliveStatsTracker.onResumeKeepalive(TEST_NETWORK, TEST_SLOT));
+ assertThrows(
+ IllegalStateException.class,
+ () -> mKeepaliveStatsTracker.onStopKeepalive(TEST_NETWORK, TEST_SLOT));
+ assertThrows(
+ IllegalStateException.class, () -> mKeepaliveStatsTracker.buildKeepaliveMetrics());
+ assertThrows(
+ IllegalStateException.class, () -> mKeepaliveStatsTracker.buildAndResetMetrics());
+ }
+
+ /**
+ * Asserts that a DurationPerNumOfKeepalive contains expected values
+ *
+ * @param expectRegisteredDurations integer array where the index is the number of concurrent
+ * keepalives and the value is the expected duration of time that the tracker is in a state
+ * with the given number of keepalives registered.
+ * @param expectActiveDurations integer array where the index is the number of concurrent
+ * keepalives and the value is the expected duration of time that the tracker is in a state
+ * with the given number of keepalives active.
+ * @param actualDurationsPerNumOfKeepalive the DurationPerNumOfKeepalive message to assert.
+ */
+ private void assertDurationMetrics(
+ int[] expectRegisteredDurations,
+ int[] expectActiveDurations,
+ DurationPerNumOfKeepalive actualDurationsPerNumOfKeepalive) {
+ final int maxNumOfKeepalive = expectRegisteredDurations.length;
+ assertEquals(maxNumOfKeepalive, expectActiveDurations.length);
+ assertEquals(
+ maxNumOfKeepalive,
+ actualDurationsPerNumOfKeepalive.getDurationForNumOfKeepaliveCount());
+ for (int numOfKeepalive = 0; numOfKeepalive < maxNumOfKeepalive; numOfKeepalive++) {
+ final DurationForNumOfKeepalive actualDurations =
+ actualDurationsPerNumOfKeepalive.getDurationForNumOfKeepalive(numOfKeepalive);
+
+ assertEquals(numOfKeepalive, actualDurations.getNumOfKeepalive());
+ assertEquals(
+ expectRegisteredDurations[numOfKeepalive],
+ actualDurations.getKeepaliveRegisteredDurationsMsec());
+ assertEquals(
+ expectActiveDurations[numOfKeepalive],
+ actualDurations.getKeepaliveActiveDurationsMsec());
+ }
+ }
+
+ /**
+ * Asserts the actual KeepaliveLifetimePerCarrier contains an expected KeepaliveCarrierStats.
+ * This finds and checks only for the (carrierId, transportTypes, intervalMs) of the given
+ * expectKeepaliveCarrierStats and asserts the lifetime metrics.
+ *
+ * @param expectKeepaliveCarrierStats a keepalive lifetime metric that is expected to be in the
+ * proto.
+ * @param actualKeepaliveLifetimePerCarrier the KeepaliveLifetimePerCarrier message to assert.
+ */
+ private void findAndAssertCarrierLifetimeMetrics(
+ KeepaliveCarrierStats expectKeepaliveCarrierStats,
+ KeepaliveLifetimePerCarrier actualKeepaliveLifetimePerCarrier) {
+ for (KeepaliveLifetimeForCarrier keepaliveLifetimeForCarrier :
+ actualKeepaliveLifetimePerCarrier.getKeepaliveLifetimeForCarrierList()) {
+ if (expectKeepaliveCarrierStats.carrierId == keepaliveLifetimeForCarrier.getCarrierId()
+ && expectKeepaliveCarrierStats.transportTypes
+ == keepaliveLifetimeForCarrier.getTransportTypes()
+ && expectKeepaliveCarrierStats.intervalMs
+ == keepaliveLifetimeForCarrier.getIntervalsMsec()) {
+ assertEquals(
+ expectKeepaliveCarrierStats.lifetimeMs,
+ keepaliveLifetimeForCarrier.getLifetimeMsec());
+ assertEquals(
+ expectKeepaliveCarrierStats.activeLifetimeMs,
+ keepaliveLifetimeForCarrier.getActiveLifetimeMsec());
+ return;
+ }
+ }
+ fail("KeepaliveLifetimeForCarrier not found for a given expected KeepaliveCarrierStats");
+ }
+
+ private void assertNoDuplicates(Object[] arr) {
+ final Set<Object> s = new HashSet<Object>(Arrays.asList(arr));
+ assertEquals(arr.length, s.size());
+ }
+
+ /**
+ * Asserts that a KeepaliveLifetimePerCarrier contains all the expected KeepaliveCarrierStats.
+ *
+ * @param expectKeepaliveCarrierStatsArray an array of keepalive lifetime metrics that is
+ * expected to be in the KeepaliveLifetimePerCarrier.
+ * @param actualKeepaliveLifetimePerCarrier the KeepaliveLifetimePerCarrier message to assert.
+ */
+ private void assertCarrierLifetimeMetrics(
+ KeepaliveCarrierStats[] expectKeepaliveCarrierStatsArray,
+ KeepaliveLifetimePerCarrier actualKeepaliveLifetimePerCarrier) {
+ assertNoDuplicates(expectKeepaliveCarrierStatsArray);
+ assertEquals(
+ expectKeepaliveCarrierStatsArray.length,
+ actualKeepaliveLifetimePerCarrier.getKeepaliveLifetimeForCarrierCount());
+ for (KeepaliveCarrierStats keepaliveCarrierStats : expectKeepaliveCarrierStatsArray) {
+ findAndAssertCarrierLifetimeMetrics(
+ keepaliveCarrierStats, actualKeepaliveLifetimePerCarrier);
+ }
+ }
+
+ private void assertDailyKeepaliveInfoReported(
+ DailykeepaliveInfoReported dailyKeepaliveInfoReported,
+ int expectRequestsCount,
+ int expectAutoRequestsCount,
+ int[] expectAppUids,
+ int[] expectRegisteredDurations,
+ int[] expectActiveDurations,
+ KeepaliveCarrierStats[] expectKeepaliveCarrierStatsArray) {
+ assertEquals(expectRequestsCount, dailyKeepaliveInfoReported.getKeepaliveRequests());
+ assertEquals(
+ expectAutoRequestsCount,
+ dailyKeepaliveInfoReported.getAutomaticKeepaliveRequests());
+ assertEquals(expectAppUids.length, dailyKeepaliveInfoReported.getDistinctUserCount());
+
+ final int[] uidArray = CollectionUtils.toIntArray(dailyKeepaliveInfoReported.getUidList());
+ assertArrayEquals(expectAppUids, uidArray);
+
+ final DurationPerNumOfKeepalive actualDurations =
+ dailyKeepaliveInfoReported.getDurationPerNumOfKeepalive();
+ assertDurationMetrics(expectRegisteredDurations, expectActiveDurations, actualDurations);
+
+ final KeepaliveLifetimePerCarrier actualCarrierLifetime =
+ dailyKeepaliveInfoReported.getKeepaliveLifetimePerCarrier();
+
+ assertCarrierLifetimeMetrics(expectKeepaliveCarrierStatsArray, actualCarrierLifetime);
+ }
+
+ @Test
+ public void testNoKeepalive() {
+ final int writeTime = 5000;
+
+ final DailykeepaliveInfoReported dailyKeepaliveInfoReported =
+ buildKeepaliveMetrics(writeTime);
+
+ // Expect that the durations are all in numOfKeepalive = 0.
+ final int[] expectRegisteredDurations = new int[] {writeTime};
+ final int[] expectActiveDurations = new int[] {writeTime};
+
+ assertDailyKeepaliveInfoReported(
+ dailyKeepaliveInfoReported,
+ /* expectRequestsCount= */ 0,
+ /* expectAutoRequestsCount= */ 0,
+ /* expectAppUids= */ new int[0],
+ expectRegisteredDurations,
+ expectActiveDurations,
+ new KeepaliveCarrierStats[0]);
+ }
+
+ /*
+ * Diagram of test (not to scale):
+ * Key: S - Start/Stop, P - Pause, R - Resume, W - Write
+ *
+ * Keepalive S W
+ * Timeline |------------------------------|
+ */
+ @Test
+ public void testOneKeepalive_startOnly() {
+ final int startTime = 1000;
+ final int writeTime = 5000;
+
+ onStartKeepalive(startTime, TEST_SLOT);
+
+ final DailykeepaliveInfoReported dailyKeepaliveInfoReported =
+ buildKeepaliveMetrics(writeTime);
+
+ // The keepalive is never stopped, expect the duration for numberOfKeepalive of 1 to range
+ // from startTime to writeTime.
+ final int[] expectRegisteredDurations = new int[] {startTime, writeTime - startTime};
+ final int[] expectActiveDurations = new int[] {startTime, writeTime - startTime};
+ assertDailyKeepaliveInfoReported(
+ dailyKeepaliveInfoReported,
+ /* expectRequestsCount= */ 1,
+ /* expectAutoRequestsCount= */ 1,
+ /* expectAppUids= */ new int[] {TEST_UID},
+ expectRegisteredDurations,
+ expectActiveDurations,
+ new KeepaliveCarrierStats[] {
+ getDefaultCarrierStats(expectRegisteredDurations[1], expectActiveDurations[1])
+ });
+ }
+
+ /*
+ * Diagram of test (not to scale):
+ * Key: S - Start/Stop, P - Pause, R - Resume, W - Write
+ *
+ * Keepalive S P W
+ * Timeline |------------------------------|
+ */
+ @Test
+ public void testOneKeepalive_paused() {
+ final int startTime = 1000;
+ final int pauseTime = 2030;
+ final int writeTime = 5000;
+
+ onStartKeepalive(startTime, TEST_SLOT);
+
+ onPauseKeepalive(pauseTime, TEST_SLOT);
+
+ final DailykeepaliveInfoReported dailyKeepaliveInfoReported =
+ buildKeepaliveMetrics(writeTime);
+
+ // The keepalive is paused but not stopped, expect the registered duration for
+ // numberOfKeepalive of 1 to still range from startTime to writeTime while the active
+ // duration stops at pauseTime.
+ final int[] expectRegisteredDurations = new int[] {startTime, writeTime - startTime};
+ final int[] expectActiveDurations =
+ new int[] {startTime + (writeTime - pauseTime), pauseTime - startTime};
+ assertDailyKeepaliveInfoReported(
+ dailyKeepaliveInfoReported,
+ /* expectRequestsCount= */ 1,
+ /* expectAutoRequestsCount= */ 1,
+ /* expectAppUids= */ new int[] {TEST_UID},
+ expectRegisteredDurations,
+ expectActiveDurations,
+ new KeepaliveCarrierStats[] {
+ getDefaultCarrierStats(expectRegisteredDurations[1], expectActiveDurations[1])
+ });
+ }
+
+ /*
+ * Diagram of test (not to scale):
+ * Key: S - Start/Stop, P - Pause, R - Resume, W - Write
+ *
+ * Keepalive S P R W
+ * Timeline |------------------------------|
+ */
+ @Test
+ public void testOneKeepalive_resumed() {
+ final int startTime = 1000;
+ final int pauseTime = 2030;
+ final int resumeTime = 3450;
+ final int writeTime = 5000;
+
+ onStartKeepalive(startTime, TEST_SLOT);
+
+ onPauseKeepalive(pauseTime, TEST_SLOT);
+
+ onResumeKeepalive(resumeTime, TEST_SLOT);
+
+ final DailykeepaliveInfoReported dailyKeepaliveInfoReported =
+ buildKeepaliveMetrics(writeTime);
+
+ // The keepalive is paused and resumed but not stopped, expect the registered duration for
+ // numberOfKeepalive of 1 to still range from startTime to writeTime while the active
+ // duration stops at pauseTime but resumes at resumeTime and stops at writeTime.
+ final int[] expectRegisteredDurations = new int[] {startTime, writeTime - startTime};
+ final int[] expectActiveDurations =
+ new int[] {
+ startTime + (resumeTime - pauseTime),
+ (pauseTime - startTime) + (writeTime - resumeTime)
+ };
+ assertDailyKeepaliveInfoReported(
+ dailyKeepaliveInfoReported,
+ /* expectRequestsCount= */ 1,
+ /* expectAutoRequestsCount= */ 1,
+ /* expectAppUids= */ new int[] {TEST_UID},
+ expectRegisteredDurations,
+ expectActiveDurations,
+ new KeepaliveCarrierStats[] {
+ getDefaultCarrierStats(expectRegisteredDurations[1], expectActiveDurations[1])
+ });
+ }
+
+ /*
+ * Diagram of test (not to scale):
+ * Key: S - Start/Stop, P - Pause, R - Resume, W - Write
+ *
+ * Keepalive S P R S W
+ * Timeline |------------------------------|
+ */
+ @Test
+ public void testOneKeepalive_stopped() {
+ final int startTime = 1000;
+ final int pauseTime = 2930;
+ final int resumeTime = 3452;
+ final int stopTime = 4157;
+ final int writeTime = 5000;
+
+ onStartKeepalive(startTime, TEST_SLOT);
+
+ onPauseKeepalive(pauseTime, TEST_SLOT);
+
+ onResumeKeepalive(resumeTime, TEST_SLOT);
+
+ onStopKeepalive(stopTime, TEST_SLOT);
+
+ final DailykeepaliveInfoReported dailyKeepaliveInfoReported =
+ buildKeepaliveMetrics(writeTime);
+
+ // The keepalive is now stopped, expect the registered duration for numberOfKeepalive of 1
+ // to now range from startTime to stopTime while the active duration stops at pauseTime but
+ // resumes at resumeTime and stops again at stopTime.
+ final int[] expectRegisteredDurations =
+ new int[] {startTime + (writeTime - stopTime), stopTime - startTime};
+ final int[] expectActiveDurations =
+ new int[] {
+ startTime + (resumeTime - pauseTime) + (writeTime - stopTime),
+ (pauseTime - startTime) + (stopTime - resumeTime)
+ };
+ assertDailyKeepaliveInfoReported(
+ dailyKeepaliveInfoReported,
+ /* expectRequestsCount= */ 1,
+ /* expectAutoRequestsCount= */ 1,
+ /* expectAppUids= */ new int[] {TEST_UID},
+ expectRegisteredDurations,
+ expectActiveDurations,
+ new KeepaliveCarrierStats[] {
+ getDefaultCarrierStats(expectRegisteredDurations[1], expectActiveDurations[1])
+ });
+ }
+
+ /*
+ * Diagram of test (not to scale):
+ * Key: S - Start/Stop, P - Pause, R - Resume, W - Write
+ *
+ * Keepalive S P S W
+ * Timeline |------------------------------|
+ */
+ @Test
+ public void testOneKeepalive_pausedStopped() {
+ final int startTime = 1000;
+ final int pauseTime = 2930;
+ final int stopTime = 4157;
+ final int writeTime = 5000;
+
+ onStartKeepalive(startTime, TEST_SLOT);
+
+ onPauseKeepalive(pauseTime, TEST_SLOT);
+
+ onStopKeepalive(stopTime, TEST_SLOT);
+
+ final DailykeepaliveInfoReported dailyKeepaliveInfoReported =
+ buildKeepaliveMetrics(writeTime);
+
+ // The keepalive is stopped while paused, expect the registered duration for
+ // numberOfKeepalive of 1 to range from startTime to stopTime while the active duration
+ // simply stops at pauseTime.
+ final int[] expectRegisteredDurations =
+ new int[] {startTime + (writeTime - stopTime), stopTime - startTime};
+ final int[] expectActiveDurations =
+ new int[] {startTime + (writeTime - pauseTime), (pauseTime - startTime)};
+ assertDailyKeepaliveInfoReported(
+ dailyKeepaliveInfoReported,
+ /* expectRequestsCount= */ 1,
+ /* expectAutoRequestsCount= */ 1,
+ /* expectAppUids= */ new int[] {TEST_UID},
+ expectRegisteredDurations,
+ expectActiveDurations,
+ new KeepaliveCarrierStats[] {
+ getDefaultCarrierStats(expectRegisteredDurations[1], expectActiveDurations[1])
+ });
+ }
+
+ /*
+ * Diagram of test (not to scale):
+ * Key: S - Start/Stop, P - Pause, R - Resume, W - Write
+ *
+ * Keepalive S P R P R P R S W
+ * Timeline |------------------------------|
+ */
+ @Test
+ public void testOneKeepalive_multiplePauses() {
+ final int startTime = 1000;
+ // Alternating timestamps of pause and resume
+ final int[] pauseResumeTimes = new int[] {1200, 1400, 1700, 2000, 2400, 2800};
+ final int stopTime = 4000;
+ final int writeTime = 5000;
+
+ onStartKeepalive(startTime, TEST_SLOT);
+
+ for (int i = 0; i < pauseResumeTimes.length; i++) {
+ if (i % 2 == 0) {
+ onPauseKeepalive(pauseResumeTimes[i], TEST_SLOT);
+ } else {
+ onResumeKeepalive(pauseResumeTimes[i], TEST_SLOT);
+ }
+ }
+
+ onStopKeepalive(stopTime, TEST_SLOT);
+
+ final DailykeepaliveInfoReported dailyKeepaliveInfoReported =
+ buildKeepaliveMetrics(writeTime);
+
+ final int[] expectRegisteredDurations =
+ new int[] {startTime + (writeTime - stopTime), stopTime - startTime};
+ final int[] expectActiveDurations =
+ new int[] {
+ startTime + /* sum of (Resume - Pause) */ (900) + (writeTime - stopTime),
+ (pauseResumeTimes[0] - startTime)
+ + /* sum of (Pause - Resume) */ (700)
+ + (stopTime - pauseResumeTimes[5])
+ };
+ assertDailyKeepaliveInfoReported(
+ dailyKeepaliveInfoReported,
+ /* expectRequestsCount= */ 1,
+ /* expectAutoRequestsCount= */ 1,
+ /* expectAppUids= */ new int[] {TEST_UID},
+ expectRegisteredDurations,
+ expectActiveDurations,
+ new KeepaliveCarrierStats[] {
+ getDefaultCarrierStats(expectRegisteredDurations[1], expectActiveDurations[1])
+ });
+ }
+
+ /*
+ * Diagram of test (not to scale):
+ * Key: S - Start/Stop, P - Pause, R - Resume, W - Write
+ *
+ * Keepalive1 S1 P1 R1 S1 W
+ * Keepalive2 S2 P2 R2 W
+ * Timeline |------------------------------|
+ */
+ @Test
+ public void testTwoKeepalives() {
+ // The suffix 1/2 indicates which keepalive it is referring to.
+ final int startTime1 = 1000;
+ final int pauseTime1 = 1500;
+ final int startTime2 = 2000;
+ final int resumeTime1 = 2500;
+ final int pauseTime2 = 3000;
+ final int resumeTime2 = 3500;
+ final int stopTime1 = 4157;
+ final int writeTime = 5000;
+
+ onStartKeepalive(startTime1, TEST_SLOT);
+
+ onPauseKeepalive(pauseTime1, TEST_SLOT);
+
+ onStartKeepalive(startTime2, TEST_SLOT2);
+
+ onResumeKeepalive(resumeTime1, TEST_SLOT);
+
+ onPauseKeepalive(pauseTime2, TEST_SLOT2);
+
+ onResumeKeepalive(resumeTime2, TEST_SLOT2);
+
+ onStopKeepalive(stopTime1, TEST_SLOT);
+
+ final DailykeepaliveInfoReported dailyKeepaliveInfoReported =
+ buildKeepaliveMetrics(writeTime);
+
+ // With two keepalives, the number of concurrent keepalives can vary from 0-2 depending on
+ // both keepalive states.
+ final int[] expectRegisteredDurations =
+ new int[] {
+ startTime1,
+ // 1 registered keepalive before keepalive2 starts and after keepalive1 stops.
+ (startTime2 - startTime1) + (writeTime - stopTime1),
+ // 2 registered keepalives between keepalive2 start and keepalive1 stop.
+ stopTime1 - startTime2
+ };
+
+ final int[] expectActiveDurations =
+ new int[] {
+ // 0 active keepalives when keepalive1 is paused before keepalive2 starts.
+ startTime1 + (startTime2 - pauseTime1),
+ // 1 active keepalive before keepalive1 is paused.
+ (pauseTime1 - startTime1)
+ // before keepalive1 is resumed and after keepalive2 starts.
+ + (resumeTime1 - startTime2)
+ // during keepalive2 is paused since keepalive1 has been resumed.
+ + (resumeTime2 - pauseTime2)
+ // after keepalive1 stops since keepalive2 has been resumed.
+ + (writeTime - stopTime1),
+ // 2 active keepalives before keepalive2 is paused and before keepalive1 stops.
+ (pauseTime2 - resumeTime1) + (stopTime1 - resumeTime2)
+ };
+
+ assertDailyKeepaliveInfoReported(
+ dailyKeepaliveInfoReported,
+ /* expectRequestsCount= */ 2,
+ /* expectAutoRequestsCount= */ 2,
+ /* expectAppUids= */ new int[] {TEST_UID},
+ expectRegisteredDurations,
+ expectActiveDurations,
+ // The carrier stats are aggregated here since the keepalives have the same
+ // (carrierId, transportTypes, intervalMs).
+ new KeepaliveCarrierStats[] {
+ getDefaultCarrierStats(
+ expectRegisteredDurations[1] + 2 * expectRegisteredDurations[2],
+ expectActiveDurations[1] + 2 * expectActiveDurations[2])
+ });
+ }
+
+ /*
+ * Diagram of test (not to scale):
+ * Key: S - Start/Stop, P - Pause, R - Resume, W - Write
+ *
+ * Keepalive S W(reset+W) S W
+ * Timeline |------------------------------|
+ */
+ @Test
+ public void testResetMetrics() {
+ final int startTime = 1000;
+ final int writeTime = 5000;
+ final int stopTime = 7000;
+ final int writeTime2 = 10000;
+
+ onStartKeepalive(startTime, TEST_SLOT);
+
+ final DailykeepaliveInfoReported dailyKeepaliveInfoReported =
+ buildAndResetMetrics(writeTime);
+
+ // Same expect as testOneKeepalive_startOnly
+ final int[] expectRegisteredDurations = new int[] {startTime, writeTime - startTime};
+ final int[] expectActiveDurations = new int[] {startTime, writeTime - startTime};
+ assertDailyKeepaliveInfoReported(
+ dailyKeepaliveInfoReported,
+ /* expectRequestsCount= */ 1,
+ /* expectAutoRequestsCount= */ 1,
+ /* expectAppUids= */ new int[] {TEST_UID},
+ expectRegisteredDurations,
+ expectActiveDurations,
+ new KeepaliveCarrierStats[] {
+ getDefaultCarrierStats(expectRegisteredDurations[1], expectActiveDurations[1])
+ });
+
+ // Check metrics was reset from above.
+ final DailykeepaliveInfoReported dailyKeepaliveInfoReported2 =
+ buildKeepaliveMetrics(writeTime);
+
+ // Expect the stored durations to be 0 but still contain the number of keepalive = 1.
+ assertDailyKeepaliveInfoReported(
+ dailyKeepaliveInfoReported2,
+ /* expectRequestsCount= */ 1,
+ /* expectAutoRequestsCount= */ 1,
+ /* expectAppUids= */ new int[] {TEST_UID},
+ /* expectRegisteredDurations= */ new int[] {0, 0},
+ /* expectActiveDurations= */ new int[] {0, 0},
+ new KeepaliveCarrierStats[] {getDefaultCarrierStats(0, 0)});
+
+ // Expect that the keepalive is still registered after resetting so it can be stopped.
+ onStopKeepalive(stopTime, TEST_SLOT);
+
+ final DailykeepaliveInfoReported dailyKeepaliveInfoReported3 =
+ buildKeepaliveMetrics(writeTime2);
+
+ final int[] expectRegisteredDurations2 =
+ new int[] {writeTime2 - stopTime, stopTime - writeTime};
+ final int[] expectActiveDurations2 =
+ new int[] {writeTime2 - stopTime, stopTime - writeTime};
+ assertDailyKeepaliveInfoReported(
+ dailyKeepaliveInfoReported3,
+ /* expectRequestsCount= */ 1,
+ /* expectAutoRequestsCount= */ 1,
+ /* expectAppUids= */ new int[] {TEST_UID},
+ expectRegisteredDurations2,
+ expectActiveDurations2,
+ new KeepaliveCarrierStats[] {
+ getDefaultCarrierStats(expectRegisteredDurations2[1], expectActiveDurations2[1])
+ });
+ }
+
+ /*
+ * Diagram of test (not to scale):
+ * Key: S - Start/Stop, P - Pause, R - Resume, W - Write
+ *
+ * Keepalive1 S1 S1 W+reset W
+ * Keepalive2 S2 W+reset W
+ * Timeline |------------------------------|
+ */
+ @Test
+ public void testResetMetrics_twoKeepalives() {
+ final int startTime1 = 1000;
+ final int startTime2 = 2000;
+ final int stopTime1 = 4157;
+ final int writeTime = 5000;
+ final int writeTime2 = 10000;
+
+ onStartKeepalive(startTime1, TEST_SLOT);
+
+ onStartKeepalive(startTime2, TEST_SLOT2, TEST_NETWORK_CAPABILITIES_2,
+ TEST_KEEPALIVE_INTERVAL2_SEC);
+
+ onStopKeepalive(stopTime1, TEST_SLOT);
+
+ final DailykeepaliveInfoReported dailyKeepaliveInfoReported =
+ buildAndResetMetrics(writeTime);
+
+ final int[] expectRegisteredDurations =
+ new int[] {
+ startTime1,
+ // 1 keepalive before keepalive2 starts and after keepalive1 stops.
+ (startTime2 - startTime1) + (writeTime - stopTime1),
+ stopTime1 - startTime2
+ };
+ // Since there is no pause, expect the same as registered durations.
+ final int[] expectActiveDurations =
+ new int[] {
+ startTime1,
+ (startTime2 - startTime1) + (writeTime - stopTime1),
+ stopTime1 - startTime2
+ };
+
+ // Lifetime carrier stats are independent of each other since they have different intervals.
+ final KeepaliveCarrierStats expectKeepaliveCarrierStats1 =
+ getDefaultCarrierStats(stopTime1 - startTime1, stopTime1 - startTime1);
+ final KeepaliveCarrierStats expectKeepaliveCarrierStats2 =
+ new KeepaliveCarrierStats(
+ TEST_CARRIER_ID_2,
+ /* transportTypes= */ (1 << TRANSPORT_CELLULAR),
+ TEST_KEEPALIVE_INTERVAL2_SEC * 1000,
+ writeTime - startTime2,
+ writeTime - startTime2);
+
+ assertDailyKeepaliveInfoReported(
+ dailyKeepaliveInfoReported,
+ /* expectRequestsCount= */ 2,
+ /* expectAutoRequestsCount= */ 2,
+ /* expectAppUids= */ new int[] {TEST_UID},
+ expectRegisteredDurations,
+ expectActiveDurations,
+ new KeepaliveCarrierStats[] {
+ expectKeepaliveCarrierStats1, expectKeepaliveCarrierStats2
+ });
+
+ final DailykeepaliveInfoReported dailyKeepaliveInfoReported2 =
+ buildKeepaliveMetrics(writeTime2);
+
+ // Only 1 keepalive is registered and active since the reset until the writeTime2.
+ final int[] expectRegisteredDurations2 = new int[] {0, writeTime2 - writeTime};
+ final int[] expectActiveDurations2 = new int[] {0, writeTime2 - writeTime};
+
+ // Only the keepalive with interval of intervalSec2 is present.
+ final KeepaliveCarrierStats expectKeepaliveCarrierStats3 =
+ new KeepaliveCarrierStats(
+ TEST_CARRIER_ID_2,
+ /* transportTypes= */ (1 << TRANSPORT_CELLULAR),
+ TEST_KEEPALIVE_INTERVAL2_SEC * 1000,
+ writeTime2 - writeTime,
+ writeTime2 - writeTime);
+
+ assertDailyKeepaliveInfoReported(
+ dailyKeepaliveInfoReported2,
+ /* expectRequestsCount= */ 1,
+ /* expectAutoRequestsCount= */ 1,
+ /* expectAppUids= */ new int[] {TEST_UID},
+ expectRegisteredDurations2,
+ expectActiveDurations2,
+ new KeepaliveCarrierStats[] {expectKeepaliveCarrierStats3});
+ }
+
+ @Test
+ public void testReusableSlot_keepaliveNotStopped() {
+ final int startTime1 = 1000;
+ final int startTime2 = 2000;
+ final int writeTime = 5000;
+
+ onStartKeepalive(startTime1, TEST_SLOT);
+
+ // Attempt to use the same (network, slot)
+ assertThrows(IllegalArgumentException.class, () -> onStartKeepalive(startTime2, TEST_SLOT));
+
+ final DailykeepaliveInfoReported dailyKeepaliveInfoReported =
+ buildKeepaliveMetrics(writeTime);
+
+ // Expect the duration to be from startTime1 and not startTime2, it should not start again.
+ final int[] expectRegisteredDurations = new int[] {startTime1, writeTime - startTime1};
+ final int[] expectActiveDurations = new int[] {startTime1, writeTime - startTime1};
+
+ assertDailyKeepaliveInfoReported(
+ dailyKeepaliveInfoReported,
+ /* expectRequestsCount= */ 1,
+ /* expectAutoRequestsCount= */ 1,
+ /* expectAppUids= */ new int[] {TEST_UID},
+ expectRegisteredDurations,
+ expectActiveDurations,
+ new KeepaliveCarrierStats[] {
+ getDefaultCarrierStats(expectRegisteredDurations[1], expectActiveDurations[1])
+ });
+ }
+
+ @Test
+ public void testReusableSlot_keepaliveStopped() {
+ final int startTime1 = 1000;
+ final int stopTime = 2000;
+ final int startTime2 = 3000;
+ final int writeTime = 5000;
+
+ onStartKeepalive(startTime1, TEST_SLOT);
+
+ onStopKeepalive(stopTime, TEST_SLOT);
+
+ // Attempt to use the same (network, slot)
+ onStartKeepalive(startTime2, TEST_SLOT);
+
+ final DailykeepaliveInfoReported dailyKeepaliveInfoReported =
+ buildKeepaliveMetrics(writeTime);
+
+ // Expect the durations to be an aggregate of both periods.
+ // i.e. onStartKeepalive works on the same (network, slot) if it has been stopped.
+ final int[] expectRegisteredDurations =
+ new int[] {
+ startTime1 + (startTime2 - stopTime),
+ (stopTime - startTime1) + (writeTime - startTime2)
+ };
+ final int[] expectActiveDurations =
+ new int[] {
+ startTime1 + (startTime2 - stopTime),
+ (stopTime - startTime1) + (writeTime - startTime2)
+ };
+
+ assertDailyKeepaliveInfoReported(
+ dailyKeepaliveInfoReported,
+ /* expectRequestsCount= */ 2,
+ /* expectAutoRequestsCount= */ 2,
+ /* expectAppUids= */ new int[] {TEST_UID},
+ expectRegisteredDurations,
+ expectActiveDurations,
+ new KeepaliveCarrierStats[] {
+ getDefaultCarrierStats(expectRegisteredDurations[1], expectActiveDurations[1])
+ });
+ }
+
+ @Test
+ public void testCarrierIdChange_changeBeforeStart() {
+ // Update the list to only have sub_id_2 with carrier_id_1.
+ final SubscriptionInfo subInfo = makeSubInfoMock(TEST_SUB_ID_2, TEST_CARRIER_ID_1);
+ doReturn(List.of(subInfo)).when(mSubscriptionManager).getActiveSubscriptionInfoList();
+
+ getOnSubscriptionsChangedListener().onSubscriptionsChanged();
+ HandlerUtils.waitForIdle(mTestHandler, TIMEOUT_MS);
+
+ final int startTime = 1000;
+ final int writeTime = 5000;
+
+ onStartKeepalive(startTime, TEST_SLOT, TEST_NETWORK_CAPABILITIES);
+ onStartKeepalive(startTime, TEST_SLOT2, TEST_NETWORK_CAPABILITIES_2);
+
+ final DailykeepaliveInfoReported dailyKeepaliveInfoReported =
+ buildKeepaliveMetrics(writeTime);
+
+ // The network with sub_id_1 has an unknown carrier id.
+ final KeepaliveCarrierStats expectKeepaliveCarrierStats1 =
+ new KeepaliveCarrierStats(
+ TelephonyManager.UNKNOWN_CARRIER_ID,
+ /* transportTypes= */ (1 << TRANSPORT_CELLULAR),
+ TEST_KEEPALIVE_INTERVAL_SEC * 1000,
+ writeTime - startTime,
+ writeTime - startTime);
+
+ // The network with sub_id_2 has carrier_id_1.
+ final KeepaliveCarrierStats expectKeepaliveCarrierStats2 =
+ new KeepaliveCarrierStats(
+ TEST_CARRIER_ID_1,
+ /* transportTypes= */ (1 << TRANSPORT_CELLULAR),
+ TEST_KEEPALIVE_INTERVAL_SEC * 1000,
+ writeTime - startTime,
+ writeTime - startTime);
+ assertDailyKeepaliveInfoReported(
+ dailyKeepaliveInfoReported,
+ /* expectRequestsCount= */ 2,
+ /* expectAutoRequestsCount= */ 2,
+ /* expectAppUids= */ new int[] {TEST_UID},
+ /* expectRegisteredDurations= */ new int[] {startTime, 0, writeTime - startTime},
+ /* expectActiveDurations= */ new int[] {startTime, 0, writeTime - startTime},
+ new KeepaliveCarrierStats[] {
+ expectKeepaliveCarrierStats1, expectKeepaliveCarrierStats2
+ });
+ }
+
+ @Test
+ public void testCarrierIdFromWifiInfo() {
+ final int startTime = 1000;
+ final int writeTime = 5000;
+
+ final WifiInfo wifiInfo = mock(WifiInfo.class);
+ final WifiInfo wifiInfoCopy = mock(WifiInfo.class);
+
+ // Building NetworkCapabilities stores a copy of the WifiInfo with makeCopy.
+ doReturn(wifiInfoCopy).when(wifiInfo).makeCopy(anyLong());
+ doReturn(TEST_SUB_ID_1).when(wifiInfo).getSubscriptionId();
+ doReturn(TEST_SUB_ID_1).when(wifiInfoCopy).getSubscriptionId();
+ final NetworkCapabilities nc =
+ new NetworkCapabilities.Builder()
+ .addTransportType(TRANSPORT_WIFI)
+ .setTransportInfo(wifiInfo)
+ .build();
+
+ onStartKeepalive(startTime, TEST_SLOT, nc);
+
+ final DailykeepaliveInfoReported dailyKeepaliveInfoReported =
+ buildKeepaliveMetrics(writeTime);
+
+ final KeepaliveCarrierStats expectKeepaliveCarrierStats =
+ new KeepaliveCarrierStats(
+ TEST_CARRIER_ID_1,
+ /* transportTypes= */ (1 << TRANSPORT_WIFI),
+ TEST_KEEPALIVE_INTERVAL_SEC * 1000,
+ writeTime - startTime,
+ writeTime - startTime);
+
+ assertDailyKeepaliveInfoReported(
+ dailyKeepaliveInfoReported,
+ /* expectRequestsCount= */ 1,
+ /* expectAutoRequestsCount= */ 1,
+ /* expectAppUids= */ new int[] {TEST_UID},
+ /* expectRegisteredDurations= */ new int[] {startTime, writeTime - startTime},
+ /* expectActiveDurations= */ new int[] {startTime, writeTime - startTime},
+ new KeepaliveCarrierStats[] {expectKeepaliveCarrierStats});
+ }
+
+ @Test
+ public void testKeepaliveCountsAndUids() {
+ final int startTime1 = 1000, startTime2 = 2000, startTime3 = 3000;
+ final int writeTime = 5000;
+ final int[] uids = new int[] {TEST_UID, TEST_UID + 1, TEST_UID + 2};
+ onStartKeepalive(startTime1, TEST_SLOT, TEST_NETWORK_CAPABILITIES,
+ TEST_KEEPALIVE_INTERVAL_SEC, uids[0], /* isAutoKeepalive= */ true);
+ onStartKeepalive(startTime2, TEST_SLOT + 1, TEST_NETWORK_CAPABILITIES,
+ TEST_KEEPALIVE_INTERVAL_SEC, uids[1], /* isAutoKeepalive= */ false);
+ onStartKeepalive(startTime3, TEST_SLOT + 2, TEST_NETWORK_CAPABILITIES,
+ TEST_KEEPALIVE_INTERVAL_SEC, uids[2], /* isAutoKeepalive= */ true);
+
+ final DailykeepaliveInfoReported dailyKeepaliveInfoReported =
+ buildKeepaliveMetrics(writeTime);
+ final int[] expectRegisteredDurations =
+ new int[] {
+ startTime1,
+ (startTime2 - startTime1),
+ (startTime3 - startTime2),
+ (writeTime - startTime3)
+ };
+ final int[] expectActiveDurations =
+ new int[] {
+ startTime1,
+ (startTime2 - startTime1),
+ (startTime3 - startTime2),
+ (writeTime - startTime3)
+ };
+ assertDailyKeepaliveInfoReported(
+ dailyKeepaliveInfoReported,
+ /* expectRequestsCount= */ 3,
+ /* expectAutoRequestsCount= */ 2,
+ /* expectAppUids= */ uids,
+ expectRegisteredDurations,
+ expectActiveDurations,
+ new KeepaliveCarrierStats[] {
+ getDefaultCarrierStats(
+ writeTime * 3 - startTime1 - startTime2 - startTime3,
+ writeTime * 3 - startTime1 - startTime2 - startTime3)
+ });
+ }
+
+ @Test
+ public void testUpdateDefaultSubId() {
+ final int startTime1 = 1000;
+ final int startTime2 = 3000;
+ final int writeTime = 5000;
+
+ // No TelephonyNetworkSpecifier set with subId to force the use of default subId.
+ final NetworkCapabilities nc =
+ new NetworkCapabilities.Builder().addTransportType(TRANSPORT_CELLULAR).build();
+ onStartKeepalive(startTime1, TEST_SLOT, nc);
+ // Update default subId
+ triggerBroadcastDefaultSubId(TEST_SUB_ID_1);
+ onStartKeepalive(startTime2, TEST_SLOT2, nc);
+
+ final DailykeepaliveInfoReported dailyKeepaliveInfoReported =
+ buildKeepaliveMetrics(writeTime);
+
+ final int[] expectRegisteredDurations =
+ new int[] {startTime1, startTime2 - startTime1, writeTime - startTime2};
+ final int[] expectActiveDurations =
+ new int[] {startTime1, startTime2 - startTime1, writeTime - startTime2};
+ // Expect the carrier id of the first keepalive to be unknown
+ final KeepaliveCarrierStats expectKeepaliveCarrierStats1 =
+ new KeepaliveCarrierStats(
+ TelephonyManager.UNKNOWN_CARRIER_ID,
+ /* transportTypes= */ (1 << TRANSPORT_CELLULAR),
+ TEST_KEEPALIVE_INTERVAL_SEC * 1000,
+ writeTime - startTime1,
+ writeTime - startTime1);
+ // Expect the carrier id of the second keepalive to be TEST_CARRIER_ID_1, from TEST_SUB_ID_1
+ final KeepaliveCarrierStats expectKeepaliveCarrierStats2 =
+ new KeepaliveCarrierStats(
+ TEST_CARRIER_ID_1,
+ /* transportTypes= */ (1 << TRANSPORT_CELLULAR),
+ TEST_KEEPALIVE_INTERVAL_SEC * 1000,
+ writeTime - startTime2,
+ writeTime - startTime2);
+ assertDailyKeepaliveInfoReported(
+ dailyKeepaliveInfoReported,
+ /* expectRequestsCount= */ 2,
+ /* expectAutoRequestsCount= */ 2,
+ /* expectAppUids= */ new int[] {TEST_UID},
+ expectRegisteredDurations,
+ expectActiveDurations,
+ new KeepaliveCarrierStats[] {
+ expectKeepaliveCarrierStats1, expectKeepaliveCarrierStats2
+ });
+ }
+}
diff --git a/tests/unit/java/com/android/server/connectivity/LingerMonitorTest.java b/tests/unit/java/com/android/server/connectivity/LingerMonitorTest.java
index 0d371fa..e6c0c83 100644
--- a/tests/unit/java/com/android/server/connectivity/LingerMonitorTest.java
+++ b/tests/unit/java/com/android/server/connectivity/LingerMonitorTest.java
@@ -34,7 +34,6 @@
import android.content.pm.PackageManager;
import android.content.res.Resources;
import android.net.ConnectivityManager;
-import android.net.ConnectivityResources;
import android.net.IDnsResolver;
import android.net.INetd;
import android.net.LinkProperties;
diff --git a/tests/unit/java/com/android/server/connectivity/MultinetworkPolicyTrackerTest.kt b/tests/unit/java/com/android/server/connectivity/MultinetworkPolicyTrackerTest.kt
index b52e8a8..f19ba4f 100644
--- a/tests/unit/java/com/android/server/connectivity/MultinetworkPolicyTrackerTest.kt
+++ b/tests/unit/java/com/android/server/connectivity/MultinetworkPolicyTrackerTest.kt
@@ -21,10 +21,8 @@
import android.net.ConnectivityManager.MULTIPATH_PREFERENCE_HANDOVER
import android.net.ConnectivityManager.MULTIPATH_PREFERENCE_PERFORMANCE
import android.net.ConnectivityManager.MULTIPATH_PREFERENCE_RELIABILITY
-import android.net.ConnectivityResources
import android.net.ConnectivitySettingsManager.NETWORK_AVOID_BAD_WIFI
import android.net.ConnectivitySettingsManager.NETWORK_METERED_MULTIPATH_PREFERENCE
-import com.android.server.connectivity.MultinetworkPolicyTracker.ActiveDataSubscriptionIdListener
import android.os.Build
import android.os.Handler
import android.os.test.TestLooper
@@ -37,6 +35,7 @@
import com.android.connectivity.resources.R
import com.android.internal.util.test.FakeSettingsProvider
import com.android.modules.utils.build.SdkLevel
+import com.android.server.connectivity.MultinetworkPolicyTracker.ActiveDataSubscriptionIdListener
import com.android.testutils.DevSdkIgnoreRule
import com.android.testutils.DevSdkIgnoreRunner
import org.junit.After
diff --git a/tests/unit/java/com/android/server/connectivity/MultinetworkPolicyTrackerTestDependencies.kt b/tests/unit/java/com/android/server/connectivity/MultinetworkPolicyTrackerTestDependencies.kt
index 744c020..4c82c76 100644
--- a/tests/unit/java/com/android/server/connectivity/MultinetworkPolicyTrackerTestDependencies.kt
+++ b/tests/unit/java/com/android/server/connectivity/MultinetworkPolicyTrackerTestDependencies.kt
@@ -1,7 +1,6 @@
package com.android.server.connectivity
import android.content.res.Resources
-import android.net.ConnectivityResources
import android.provider.DeviceConfig
import android.provider.DeviceConfig.NAMESPACE_CONNECTIVITY
import android.provider.DeviceConfig.OnPropertiesChangedListener
diff --git a/tests/unit/java/com/android/server/connectivity/Nat464XlatTest.java b/tests/unit/java/com/android/server/connectivity/Nat464XlatTest.java
index 06e0d6d..58c0114 100644
--- a/tests/unit/java/com/android/server/connectivity/Nat464XlatTest.java
+++ b/tests/unit/java/com/android/server/connectivity/Nat464XlatTest.java
@@ -20,10 +20,12 @@
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.any;
import static org.mockito.Mockito.anyInt;
import static org.mockito.Mockito.anyString;
+import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.eq;
import static org.mockito.Mockito.inOrder;
import static org.mockito.Mockito.never;
@@ -72,6 +74,7 @@
static final String STACKED_IFACE = "v4-test0";
static final LinkAddress V6ADDR = new LinkAddress("2001:db8:1::f00/64");
static final LinkAddress ADDR = new LinkAddress("192.0.2.5/29");
+ static final String CLAT_V6 = "64:ff9b::1";
static final String NAT64_PREFIX = "64:ff9b::/96";
static final String OTHER_NAT64_PREFIX = "2001:db8:0:64::/96";
static final int NETID = 42;
@@ -132,6 +135,8 @@
when(mNetd.interfaceGetCfg(eq(STACKED_IFACE))).thenReturn(mConfig);
mConfig.ipv4Addr = ADDR.getAddress().getHostAddress();
mConfig.prefixLength = ADDR.getPrefixLength();
+ doReturn(CLAT_V6).when(mClatCoordinator).clatStart(
+ BASE_IFACE, NETID, new IpPrefix(NAT64_PREFIX));
}
private void assertRequiresClat(boolean expected, NetworkAgentInfo nai) {
@@ -286,7 +291,8 @@
assertFalse(c.getValue().getAllInterfaceNames().contains(STACKED_IFACE));
verify(mDnsResolver).stopPrefix64Discovery(eq(NETID));
assertIdle(nat);
-
+ // Verify the generated v6 is reset when clat is stopped.
+ assertNull(nat.mIPv6Address);
// Stacked interface removed notification arrives and is ignored.
nat.interfaceRemoved(STACKED_IFACE);
mLooper.dispatchNext();
diff --git a/tests/unit/java/com/android/server/connectivity/NetdEventListenerServiceTest.java b/tests/unit/java/com/android/server/connectivity/NetdEventListenerServiceTest.java
index f4b6464..d667662 100644
--- a/tests/unit/java/com/android/server/connectivity/NetdEventListenerServiceTest.java
+++ b/tests/unit/java/com/android/server/connectivity/NetdEventListenerServiceTest.java
@@ -24,6 +24,7 @@
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.fail;
import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
@@ -41,6 +42,8 @@
import com.android.testutils.DevSdkIgnoreRule;
import com.android.testutils.DevSdkIgnoreRunner;
+import libcore.util.EmptyArray;
+
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -60,7 +63,8 @@
private static final String EXAMPLE_IPV4 = "192.0.2.1";
private static final String EXAMPLE_IPV6 = "2001:db8:1200::2:1";
- private static final long NET_HANDLE = new Network(5391).getNetworkHandle();
+ private static final Network TEST_WIFI_NETWORK = new Network(5391);
+ private static final Network TEST_CELL_NETWORK = new Network(5832);
private static final byte[] MAC_ADDR =
{(byte)0x84, (byte)0xc9, (byte)0xb2, (byte)0x6a, (byte)0xed, (byte)0x4b};
@@ -78,6 +82,8 @@
public void setUp() {
mCm = mock(ConnectivityManager.class);
mService = new NetdEventListenerService(mCm);
+ doReturn(CAPABILITIES_WIFI).when(mCm).getNetworkCapabilities(TEST_WIFI_NETWORK);
+ doReturn(CAPABILITIES_CELL).when(mCm).getNetworkCapabilities(TEST_CELL_NETWORK);
}
@Test
@@ -111,19 +117,25 @@
wakeupEvent(iface, uids[5], v4, tcp, mac, srcIp, dstIp, sport, dport, now);
wakeupEvent(iface, uids[6], v6, udp, mac, srcIp6, dstIp6, sport, dport, now);
wakeupEvent(iface, uids[7], v6, tcp, mac, srcIp6, dstIp6, sport, dport, now);
- wakeupEvent(iface, uids[8], v6, udp, mac, srcIp6, dstIp6, sport, dport, now);
+ wakeupEvent("rmnet0", uids[8], v6, udp, EmptyArray.BYTE, srcIp6, dstIp6, sport, dport, now,
+ TEST_CELL_NETWORK);
String[] events2 = remove(listNetdEvent(), baseline);
- int expectedLength2 = uids.length + 1; // +1 for the WakeupStats line
+ int expectedLength2 = uids.length + 2; // +2 for the WakeupStats headers
assertEquals(expectedLength2, events2.length);
+
assertStringContains(events2[0], "WakeupStats");
- assertStringContains(events2[0], "wlan0");
- assertStringContains(events2[0], "0x800");
+ assertStringContains(events2[0], "rmnet0");
assertStringContains(events2[0], "0x86dd");
+
+ assertStringContains(events2[1], "WakeupStats");
+ assertStringContains(events2[1], "wlan0");
+ assertStringContains(events2[1], "0x800");
+ assertStringContains(events2[1], "0x86dd");
for (int i = 0; i < uids.length; i++) {
- String got = events2[i+1];
+ String got = events2[i + 2];
assertStringContains(got, "WakeupEvent");
- assertStringContains(got, "wlan0");
+ assertStringContains(got, ((i == 8) ? "rmnet0" : "wlan0"));
assertStringContains(got, "uid: " + uids[i]);
}
@@ -134,11 +146,13 @@
}
String[] events3 = remove(listNetdEvent(), baseline);
- int expectedLength3 = BUFFER_LENGTH + 1; // +1 for the WakeupStats line
+ int expectedLength3 = BUFFER_LENGTH + 2; // +2 for the WakeupStats headers
assertEquals(expectedLength3, events3.length);
- assertStringContains(events2[0], "WakeupStats");
- assertStringContains(events2[0], "wlan0");
- for (int i = 1; i < expectedLength3; i++) {
+ assertStringContains(events3[0], "WakeupStats");
+ assertStringContains(events3[0], "rmnet0");
+ assertStringContains(events3[1], "WakeupStats");
+ assertStringContains(events3[1], "wlan0");
+ for (int i = 2; i < expectedLength3; i++) {
String got = events3[i];
assertStringContains(got, "WakeupEvent");
assertStringContains(got, "wlan0");
@@ -173,19 +187,24 @@
final int icmp6 = 58;
wakeupEvent("wlan0", 1000, v4, tcp, mac, srcIp, dstIp, sport, dport, now);
- wakeupEvent("rmnet0", 10123, v4, tcp, mac, srcIp, dstIp, sport, dport, now);
+ wakeupEvent("rmnet0", 10123, v4, tcp, mac, srcIp, dstIp, sport, dport, now,
+ TEST_CELL_NETWORK);
wakeupEvent("wlan0", 1000, v4, udp, mac, srcIp, dstIp, sport, dport, now);
- wakeupEvent("rmnet0", 10008, v4, tcp, mac, srcIp, dstIp, sport, dport, now);
+ wakeupEvent("rmnet0", 10008, v4, tcp, EmptyArray.BYTE, srcIp, dstIp, sport, dport, now,
+ TEST_CELL_NETWORK);
wakeupEvent("wlan0", -1, v6, icmp6, mac, srcIp6, dstIp6, sport, dport, now);
wakeupEvent("wlan0", 10008, v4, tcp, mac, srcIp, dstIp, sport, dport, now);
- wakeupEvent("rmnet0", 1000, v4, tcp, mac, srcIp, dstIp, sport, dport, now);
+ wakeupEvent("rmnet0", 1000, v4, tcp, mac, srcIp, dstIp, sport, dport, now,
+ TEST_CELL_NETWORK);
wakeupEvent("wlan0", 10004, v4, udp, mac, srcIp, dstIp, sport, dport, now);
wakeupEvent("wlan0", 1000, v6, tcp, mac, srcIp6, dstIp6, sport, dport, now);
wakeupEvent("wlan0", 0, v6, udp, mac, srcIp6, dstIp6, sport, dport, now);
wakeupEvent("wlan0", -1, v6, icmp6, mac, srcIp6, dstIp6, sport, dport, now);
- wakeupEvent("rmnet0", 10052, v4, tcp, mac, srcIp, dstIp, sport, dport, now);
+ wakeupEvent("rmnet0", 10052, v4, tcp, mac, srcIp, dstIp, sport, dport, now,
+ TEST_CELL_NETWORK);
wakeupEvent("wlan0", 0, v6, udp, mac, srcIp6, dstIp6, sport, dport, now);
- wakeupEvent("rmnet0", 1000, v6, tcp, mac, srcIp6, dstIp6, sport, dport, now);
+ wakeupEvent("rmnet0", 1000, v6, tcp, null, srcIp6, dstIp6, sport, dport, now,
+ TEST_CELL_NETWORK);
wakeupEvent("wlan0", 1010, v4, udp, mac, srcIp, dstIp, sport, dport, now);
String got = flushStatistics();
@@ -214,7 +233,7 @@
" >",
" l2_broadcast_count: 0",
" l2_multicast_count: 0",
- " l2_unicast_count: 5",
+ " l2_unicast_count: 3",
" no_uid_wakeups: 0",
" non_application_wakeups: 0",
" root_wakeups: 0",
@@ -499,8 +518,13 @@
}
void wakeupEvent(String iface, int uid, int ether, int ip, byte[] mac, String srcIp,
- String dstIp, int sport, int dport, long now) throws Exception {
- String prefix = NET_HANDLE + ":" + iface;
+ String dstIp, int sport, int dport, long now) {
+ wakeupEvent(iface, uid, ether, ip, mac, srcIp, dstIp, sport, dport, now, TEST_WIFI_NETWORK);
+ }
+
+ void wakeupEvent(String iface, int uid, int ether, int ip, byte[] mac, String srcIp,
+ String dstIp, int sport, int dport, long now, Network network) {
+ String prefix = network.getNetworkHandle() + ":" + iface;
mService.onWakeupEvent(prefix, uid, ether, ip, mac, srcIp, dstIp, sport, dport, now);
}
diff --git a/tests/unit/java/com/android/server/connectivity/NetworkNotificationManagerTest.java b/tests/unit/java/com/android/server/connectivity/NetworkNotificationManagerTest.java
index e038c44..967083e 100644
--- a/tests/unit/java/com/android/server/connectivity/NetworkNotificationManagerTest.java
+++ b/tests/unit/java/com/android/server/connectivity/NetworkNotificationManagerTest.java
@@ -51,7 +51,6 @@
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.content.res.Resources;
-import android.net.ConnectivityResources;
import android.net.NetworkCapabilities;
import android.net.NetworkInfo;
import android.os.Build;
@@ -63,6 +62,7 @@
import android.util.DisplayMetrics;
import android.widget.TextView;
+import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.StringRes;
import androidx.test.filters.SmallTest;
@@ -387,14 +387,37 @@
}
@Test
- public void testNotifyNoInternetAsDialogWhenHighPriority() throws Exception {
- doReturn(true).when(mResources).getBoolean(
+ public void testNotifyNoInternet_asNotification() throws Exception {
+ doTestNotifyNotificationAsDialogWhenHighPriority(false, NO_INTERNET);
+ }
+ @Test
+ public void testNotifyNoInternet_asDialog() throws Exception {
+ doTestNotifyNotificationAsDialogWhenHighPriority(true, NO_INTERNET);
+ }
+
+ @Test
+ public void testNotifyLostInternet_asNotification() throws Exception {
+ doTestNotifyNotificationAsDialogWhenHighPriority(false, LOST_INTERNET);
+ }
+
+ @Test
+ public void testNotifyLostInternet_asDialog() throws Exception {
+ doTestNotifyNotificationAsDialogWhenHighPriority(true, LOST_INTERNET);
+ }
+
+ public void doTestNotifyNotificationAsDialogWhenHighPriority(final boolean configActive,
+ @NonNull final NotificationType notifType) throws Exception {
+ doReturn(configActive).when(mResources).getBoolean(
R.bool.config_notifyNoInternetAsDialogWhenHighPriority);
final Instrumentation instr = InstrumentationRegistry.getInstrumentation();
final UiDevice uiDevice = UiDevice.getInstance(instr);
final Context ctx = instr.getContext();
final PowerManager pm = ctx.getSystemService(PowerManager.class);
+ // If the prio of this notif is < that of NETWORK_SWITCH, it's the lowest prio and
+ // therefore it can't be tested whether it cancels other lower-prio notifs.
+ final boolean isLowestPrioNotif = NetworkNotificationManager.priority(notifType)
+ < NetworkNotificationManager.priority(NETWORK_SWITCH);
// Wake up the device (it has no effect if the device is already awake).
uiDevice.executeShellCommand("input keyevent KEYCODE_WAKEUP");
@@ -410,9 +433,13 @@
uiDevice.wait(Until.hasObject(By.pkg(launcherPackageName)),
UI_AUTOMATOR_WAIT_TIME_MILLIS));
- mManager.showNotification(TEST_NOTIF_ID, NETWORK_SWITCH, mWifiNai, mCellNai, null, false);
- // Non-"no internet" notifications are not affected
- verify(mNotificationManager).notify(eq(TEST_NOTIF_TAG), eq(NETWORK_SWITCH.eventId), any());
+ if (!isLowestPrioNotif) {
+ mManager.showNotification(TEST_NOTIF_ID, NETWORK_SWITCH, mWifiNai, mCellNai,
+ null, false);
+ // Non-"no internet" notifications are not affected
+ verify(mNotificationManager).notify(eq(TEST_NOTIF_TAG), eq(NETWORK_SWITCH.eventId),
+ any());
+ }
final String testAction = "com.android.connectivity.coverage.TEST_DIALOG";
final Intent intent = new Intent(testAction)
@@ -421,22 +448,30 @@
final PendingIntent pendingIntent = PendingIntent.getActivity(ctx, 0 /* requestCode */,
intent, PendingIntent.FLAG_CANCEL_CURRENT | PendingIntent.FLAG_IMMUTABLE);
- mManager.showNotification(TEST_NOTIF_ID, NO_INTERNET, mWifiNai, null /* switchToNai */,
+ mManager.showNotification(TEST_NOTIF_ID, notifType, mWifiNai, null /* switchToNai */,
pendingIntent, true /* highPriority */);
- // Previous notifications are still dismissed
- verify(mNotificationManager).cancel(TEST_NOTIF_TAG, NETWORK_SWITCH.eventId);
+ if (!isLowestPrioNotif) {
+ // Previous notifications are still dismissed
+ verify(mNotificationManager).cancel(TEST_NOTIF_TAG, NETWORK_SWITCH.eventId);
+ }
- // Verify that the activity is shown (the activity shows the action on screen)
- final UiObject actionText = uiDevice.findObject(new UiSelector().text(testAction));
- assertTrue("Activity not shown", actionText.waitForExists(TEST_TIMEOUT_MS));
+ if (configActive) {
+ // Verify that the activity is shown (the activity shows the action on screen)
+ final UiObject actionText = uiDevice.findObject(new UiSelector().text(testAction));
+ assertTrue("Activity not shown", actionText.waitForExists(TEST_TIMEOUT_MS));
- // Tapping the text should dismiss the dialog
- actionText.click();
- assertTrue("Activity not dismissed", actionText.waitUntilGone(TEST_TIMEOUT_MS));
+ // Tapping the text should dismiss the dialog
+ actionText.click();
+ assertTrue("Activity not dismissed", actionText.waitUntilGone(TEST_TIMEOUT_MS));
- // Verify no NO_INTERNET notification was posted
- verify(mNotificationManager, never()).notify(any(), eq(NO_INTERNET.eventId), any());
+ // Verify that the notification was not posted
+ verify(mNotificationManager, never()).notify(any(), eq(notifType.eventId), any());
+ } else {
+ // Notification should have been posted, and will have overridden the previous
+ // one because it has the same id (hence no cancel).
+ verify(mNotificationManager).notify(eq(TEST_NOTIF_TAG), eq(notifType.eventId), any());
+ }
}
private void doNotificationTextTest(NotificationType type, @StringRes int expectedTitleRes,
diff --git a/tests/unit/java/com/android/server/connectivity/VpnTest.java b/tests/unit/java/com/android/server/connectivity/VpnTest.java
index 2d87728..dc50773 100644
--- a/tests/unit/java/com/android/server/connectivity/VpnTest.java
+++ b/tests/unit/java/com/android/server/connectivity/VpnTest.java
@@ -25,6 +25,11 @@
import static android.net.ConnectivityManager.NetworkCallback;
import static android.net.INetd.IF_STATE_DOWN;
import static android.net.INetd.IF_STATE_UP;
+import static android.net.NetworkCapabilities.NET_CAPABILITY_INTERNET;
+import static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED;
+import static android.net.NetworkCapabilities.NET_CAPABILITY_TEMPORARILY_NOT_METERED;
+import static android.net.NetworkCapabilities.TRANSPORT_CELLULAR;
+import static android.net.NetworkCapabilities.TRANSPORT_WIFI;
import static android.net.RouteInfo.RTN_UNREACHABLE;
import static android.net.VpnManager.TYPE_VPN_PLATFORM;
import static android.net.cts.util.IkeSessionTestUtils.CHILD_PARAMS;
@@ -33,15 +38,25 @@
import static android.net.cts.util.IkeSessionTestUtils.getTestIkeSessionParams;
import static android.net.ipsec.ike.IkeSessionConfiguration.EXTENSION_TYPE_MOBIKE;
import static android.net.ipsec.ike.IkeSessionParams.ESP_ENCAP_TYPE_AUTO;
+import static android.net.ipsec.ike.IkeSessionParams.ESP_ENCAP_TYPE_NONE;
+import static android.net.ipsec.ike.IkeSessionParams.ESP_ENCAP_TYPE_UDP;
import static android.net.ipsec.ike.IkeSessionParams.ESP_IP_VERSION_AUTO;
-import static android.os.Build.VERSION_CODES.S_V2;
+import static android.net.ipsec.ike.IkeSessionParams.ESP_IP_VERSION_IPV4;
+import static android.net.ipsec.ike.IkeSessionParams.ESP_IP_VERSION_IPV6;
import static android.os.UserHandle.PER_USER_RANGE;
+import static android.telephony.CarrierConfigManager.KEY_CARRIER_CONFIG_APPLIED_BOOL;
+import static android.telephony.CarrierConfigManager.KEY_MIN_UDP_PORT_4500_NAT_TIMEOUT_SEC_INT;
+import static android.telephony.CarrierConfigManager.KEY_PREFERRED_IKE_PROTOCOL_INT;
import static com.android.net.module.util.NetworkStackConstants.IPV6_MIN_MTU;
import static com.android.server.connectivity.Vpn.AUTOMATIC_KEEPALIVE_DELAY_SECONDS;
+import static com.android.server.connectivity.Vpn.DEFAULT_LONG_LIVED_TCP_CONNS_EXPENSIVE_TIMEOUT_SEC;
import static com.android.server.connectivity.Vpn.DEFAULT_UDP_PORT_4500_NAT_TIMEOUT_SEC_INT;
+import static com.android.server.connectivity.Vpn.PREFERRED_IKE_PROTOCOL_AUTO;
+import static com.android.server.connectivity.Vpn.PREFERRED_IKE_PROTOCOL_IPV4_UDP;
+import static com.android.server.connectivity.Vpn.PREFERRED_IKE_PROTOCOL_IPV6_ESP;
+import static com.android.server.connectivity.Vpn.PREFERRED_IKE_PROTOCOL_IPV6_UDP;
import static com.android.testutils.Cleanup.testAndCleanup;
-import static com.android.testutils.DevSdkIgnoreRule.IgnoreUpTo;
import static com.android.testutils.MiscAsserts.assertThrows;
import static org.junit.Assert.assertArrayEquals;
@@ -58,12 +73,14 @@
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.ArgumentMatchers.argThat;
import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.ArgumentMatchers.longThat;
import static org.mockito.Mockito.after;
import static org.mockito.Mockito.atLeastOnce;
import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.doCallRealMethod;
import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.doThrow;
import static org.mockito.Mockito.inOrder;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
@@ -107,6 +124,7 @@
import android.net.NetworkCapabilities;
import android.net.NetworkInfo.DetailedState;
import android.net.RouteInfo;
+import android.net.TelephonyNetworkSpecifier;
import android.net.UidRangeParcel;
import android.net.VpnManager;
import android.net.VpnProfileState;
@@ -126,6 +144,8 @@
import android.net.ipsec.ike.exceptions.IkeNonProtocolException;
import android.net.ipsec.ike.exceptions.IkeProtocolException;
import android.net.ipsec.ike.exceptions.IkeTimeoutException;
+import android.net.vcn.VcnTransportInfo;
+import android.net.wifi.WifiInfo;
import android.os.Build.VERSION_CODES;
import android.os.Bundle;
import android.os.ConditionVariable;
@@ -139,11 +159,16 @@
import android.os.test.TestLooper;
import android.provider.Settings;
import android.security.Credentials;
+import android.telephony.CarrierConfigManager;
+import android.telephony.SubscriptionInfo;
+import android.telephony.SubscriptionManager;
+import android.telephony.TelephonyManager;
import android.util.ArrayMap;
import android.util.ArraySet;
import android.util.Pair;
import android.util.Range;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.filters.SmallTest;
import com.android.internal.R;
@@ -151,14 +176,13 @@
import com.android.internal.net.VpnConfig;
import com.android.internal.net.VpnProfile;
import com.android.internal.util.HexDump;
+import com.android.internal.util.IndentingPrintWriter;
import com.android.server.DeviceIdleInternal;
import com.android.server.IpSecService;
import com.android.server.VpnTestBase;
import com.android.server.vcn.util.PersistableBundleUtils;
import com.android.testutils.DevSdkIgnoreRule;
-import com.android.testutils.DevSdkIgnoreRunner;
-import org.junit.After;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
@@ -175,6 +199,7 @@
import java.io.FileDescriptor;
import java.io.FileWriter;
import java.io.IOException;
+import java.io.StringWriter;
import java.net.Inet4Address;
import java.net.Inet6Address;
import java.net.InetAddress;
@@ -192,7 +217,8 @@
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
-import java.util.stream.Stream;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
/**
* Tests for {@link Vpn}.
@@ -200,9 +226,8 @@
* Build, install and run with:
* runtest frameworks-net -c com.android.server.connectivity.VpnTest
*/
-@RunWith(DevSdkIgnoreRunner.class)
+@RunWith(AndroidJUnit4.class)
@SmallTest
-@IgnoreUpTo(S_V2)
public class VpnTest extends VpnTestBase {
private static final String TAG = "VpnTest";
@@ -259,12 +284,15 @@
private static final String TEST_IFACE_NAME = "TEST_IFACE";
private static final int TEST_TUNNEL_RESOURCE_ID = 0x2345;
private static final long TEST_TIMEOUT_MS = 500L;
+ private static final long TIMEOUT_CROSSTHREAD_MS = 20_000L;
private static final String PRIMARY_USER_APP_EXCLUDE_KEY =
"VPNAPPEXCLUDED_27_com.testvpn.vpn";
static final String PKGS_BYTES = getPackageByteString(List.of(PKGS));
private static final Range<Integer> PRIMARY_USER_RANGE = uidRangeForUser(PRIMARY_USER.id);
- // Same as IkeSessionParams#IKE_NATT_KEEPALIVE_DELAY_SEC_DEFAULT
- private static final int IKE_NATT_KEEPALIVE_DELAY_SEC_DEFAULT = 10;
+ private static final int TEST_KEEPALIVE_TIMER = 800;
+ private static final int TEST_SUB_ID = 1234;
+ private static final String TEST_MCCMNC = "12345";
+
@Mock(answer = Answers.RETURNS_DEEP_STUBS) private Context mContext;
@Mock private UserManager mUserManager;
@Mock private PackageManager mPackageManager;
@@ -278,17 +306,57 @@
@Mock private Vpn.VpnNetworkAgentWrapper mMockNetworkAgent;
@Mock private ConnectivityManager mConnectivityManager;
@Mock private ConnectivityDiagnosticsManager mCdm;
+ @Mock private TelephonyManager mTelephonyManager;
+ @Mock private TelephonyManager mTmPerSub;
+ @Mock private CarrierConfigManager mConfigManager;
+ @Mock private SubscriptionManager mSubscriptionManager;
@Mock private IpSecService mIpSecService;
@Mock private VpnProfileStore mVpnProfileStore;
- @Mock private ScheduledThreadPoolExecutor mExecutor;
- @Mock private ScheduledFuture mScheduledFuture;
+ private final TestExecutor mExecutor;
@Mock DeviceIdleInternal mDeviceIdleInternal;
private final VpnProfile mVpnProfile;
private IpSecManager mIpSecManager;
-
private TestDeps mTestDeps;
+ public static class TestExecutor extends ScheduledThreadPoolExecutor {
+ public static final long REAL_DELAY = -1;
+
+ // For the purposes of the test, run all scheduled tasks after 10ms to save
+ // execution time, unless overridden by the specific test. Set to REAL_DELAY
+ // to actually wait for the delay specified by the real call to schedule().
+ public long delayMs = 10;
+ // If this is true, execute() will call the runnable inline. This is useful because
+ // super.execute() calls schedule(), which messes with checks that scheduled() is
+ // called a given number of times.
+ public boolean executeDirect = false;
+
+ public TestExecutor() {
+ super(1);
+ }
+
+ @Override
+ public void execute(final Runnable command) {
+ // See |executeDirect| for why this is necessary.
+ if (executeDirect) {
+ command.run();
+ } else {
+ super.execute(command);
+ }
+ }
+
+ @Override
+ public ScheduledFuture<?> schedule(final Runnable command, final long delay,
+ TimeUnit unit) {
+ if (0 == delay || delayMs == REAL_DELAY) {
+ // super.execute() calls schedule() with 0, so use the real delay if it's 0.
+ return super.schedule(command, delay, unit);
+ } else {
+ return super.schedule(command, delayMs, TimeUnit.MILLISECONDS);
+ }
+ }
+ }
+
public VpnTest() throws Exception {
// Build an actual VPN profile that is capable of being converted to and from an
// Ikev2VpnProfile
@@ -296,6 +364,7 @@
new Ikev2VpnProfile.Builder(TEST_VPN_SERVER, TEST_VPN_IDENTITY);
builder.setAuthPsk(TEST_VPN_PSK);
builder.setBypassable(true /* isBypassable */);
+ mExecutor = spy(new TestExecutor());
mVpnProfile = builder.build().toVpnProfile();
}
@@ -322,6 +391,11 @@
mockService(IpSecManager.class, Context.IPSEC_SERVICE, mIpSecManager);
mockService(ConnectivityDiagnosticsManager.class, Context.CONNECTIVITY_DIAGNOSTICS_SERVICE,
mCdm);
+ mockService(TelephonyManager.class, Context.TELEPHONY_SERVICE, mTelephonyManager);
+ mockService(CarrierConfigManager.class, Context.CARRIER_CONFIG_SERVICE, mConfigManager);
+ mockService(SubscriptionManager.class, Context.TELEPHONY_SUBSCRIPTION_SERVICE,
+ mSubscriptionManager);
+ doReturn(mTmPerSub).when(mTelephonyManager).createForSubscriptionId(anyInt());
when(mContext.getString(R.string.config_customVpnAlwaysOnDisconnectedDialogComponent))
.thenReturn(Resources.getSystem().getString(
R.string.config_customVpnAlwaysOnDisconnectedDialogComponent));
@@ -356,7 +430,6 @@
// Set up mIkev2SessionCreator and mExecutor
resetIkev2SessionCreator(mIkeSessionWrapper);
- resetExecutor(mScheduledFuture);
}
private void resetIkev2SessionCreator(Vpn.IkeSessionWrapper ikeSession) {
@@ -365,23 +438,6 @@
.thenReturn(ikeSession);
}
- private void resetExecutor(ScheduledFuture scheduledFuture) {
- doAnswer(
- (invocation) -> {
- ((Runnable) invocation.getArgument(0)).run();
- return null;
- })
- .when(mExecutor)
- .execute(any());
- when(mExecutor.schedule(
- any(Runnable.class), anyLong(), any())).thenReturn(mScheduledFuture);
- }
-
- @After
- public void tearDown() throws Exception {
- doReturn(PERMISSION_DENIED).when(mContext).checkCallingOrSelfPermission(any());
- }
-
private <T> void mockService(Class<T> clazz, String name, T service) {
doReturn(service).when(mContext).getSystemService(name);
doReturn(name).when(mContext).getSystemServiceName(clazz);
@@ -492,9 +548,9 @@
}
private void verifyPowerSaveTempWhitelistApp(String packageName) {
- verify(mDeviceIdleInternal).addPowerSaveTempWhitelistApp(anyInt(), eq(packageName),
- anyLong(), anyInt(), eq(false), eq(PowerWhitelistManager.REASON_VPN),
- eq("VpnManager event"));
+ verify(mDeviceIdleInternal, timeout(TEST_TIMEOUT_MS)).addPowerSaveTempWhitelistApp(
+ anyInt(), eq(packageName), anyLong(), anyInt(), eq(false),
+ eq(PowerWhitelistManager.REASON_VPN), eq("VpnManager event"));
}
@Test
@@ -733,7 +789,8 @@
@Test
public void testPrepare_throwSecurityExceptionWhenGivenPackageDoesNotBelongToTheCaller()
throws Exception {
- final Vpn vpn = createVpnAndSetupUidChecks();
+ mTestDeps.mIgnoreCallingUidChecks = false;
+ final Vpn vpn = createVpn();
assertThrows(SecurityException.class,
() -> vpn.prepare("com.not.vpn.owner", null, VpnManager.TYPE_VPN_SERVICE));
assertThrows(SecurityException.class,
@@ -745,12 +802,38 @@
@Test
public void testPrepare_bothOldPackageAndNewPackageAreNull() throws Exception {
- final Vpn vpn = createVpnAndSetupUidChecks();
+ final Vpn vpn = createVpn();
assertTrue(vpn.prepare(null, null, VpnManager.TYPE_VPN_SERVICE));
}
@Test
+ public void testPrepare_legacyVpnWithoutControlVpn()
+ throws Exception {
+ doThrow(new SecurityException("no CONTROL_VPN")).when(mContext)
+ .enforceCallingOrSelfPermission(eq(CONTROL_VPN), any());
+ final Vpn vpn = createVpn();
+ assertThrows(SecurityException.class,
+ () -> vpn.prepare(null, VpnConfig.LEGACY_VPN, VpnManager.TYPE_VPN_SERVICE));
+
+ // CONTROL_VPN can be held by the caller or another system server process - both are
+ // allowed. Just checking for `enforceCallingPermission` may not be sufficient.
+ verify(mContext, never()).enforceCallingPermission(eq(CONTROL_VPN), any());
+ }
+
+ @Test
+ public void testPrepare_legacyVpnWithControlVpn()
+ throws Exception {
+ doNothing().when(mContext).enforceCallingOrSelfPermission(eq(CONTROL_VPN), any());
+ final Vpn vpn = createVpn();
+ assertTrue(vpn.prepare(null, VpnConfig.LEGACY_VPN, VpnManager.TYPE_VPN_SERVICE));
+
+ // CONTROL_VPN can be held by the caller or another system server process - both are
+ // allowed. Just checking for `enforceCallingPermission` may not be sufficient.
+ verify(mContext, never()).enforceCallingPermission(eq(CONTROL_VPN), any());
+ }
+
+ @Test
public void testIsAlwaysOnPackageSupported() throws Exception {
final Vpn vpn = createVpn(PRIMARY_USER.id);
@@ -828,17 +911,14 @@
assertEquals(expected, vpn.getProfileNameForPackage(TEST_VPN_PKG));
}
- private Vpn createVpnAndSetupUidChecks(String... grantedOps) throws Exception {
- return createVpnAndSetupUidChecks(PRIMARY_USER, grantedOps);
+ private Vpn createVpn(String... grantedOps) throws Exception {
+ return createVpn(PRIMARY_USER, grantedOps);
}
- private Vpn createVpnAndSetupUidChecks(UserInfo user, String... grantedOps) throws Exception {
+ private Vpn createVpn(UserInfo user, String... grantedOps) throws Exception {
final Vpn vpn = createVpn(user.id);
setMockedUsers(user);
- when(mPackageManager.getPackageUidAsUser(eq(TEST_VPN_PKG), anyInt()))
- .thenReturn(Process.myUid());
-
for (final String opStr : grantedOps) {
when(mAppOps.noteOpNoThrow(opStr, Process.myUid(), TEST_VPN_PKG,
null /* attributionTag */, null /* message */))
@@ -867,7 +947,7 @@
public void testProvisionVpnProfileNoIpsecTunnels() throws Exception {
when(mPackageManager.hasSystemFeature(PackageManager.FEATURE_IPSEC_TUNNELS))
.thenReturn(false);
- final Vpn vpn = createVpnAndSetupUidChecks(AppOpsManager.OPSTR_ACTIVATE_PLATFORM_VPN);
+ final Vpn vpn = createVpn(AppOpsManager.OPSTR_ACTIVATE_PLATFORM_VPN);
try {
checkProvisionVpnProfile(
@@ -878,7 +958,7 @@
}
private Vpn prepareVpnForVerifyAppExclusionList() throws Exception {
- final Vpn vpn = createVpnAndSetupUidChecks(AppOpsManager.OPSTR_ACTIVATE_PLATFORM_VPN);
+ final Vpn vpn = createVpn(AppOpsManager.OPSTR_ACTIVATE_PLATFORM_VPN);
when(mVpnProfileStore.get(vpn.getProfileNameForPackage(TEST_VPN_PKG)))
.thenReturn(mVpnProfile.encode());
when(mVpnProfileStore.get(PRIMARY_USER_APP_EXCLUDE_KEY))
@@ -994,7 +1074,7 @@
@Test
public void testProvisionVpnProfilePreconsented() throws Exception {
- final Vpn vpn = createVpnAndSetupUidChecks(AppOpsManager.OPSTR_ACTIVATE_PLATFORM_VPN);
+ final Vpn vpn = createVpn(AppOpsManager.OPSTR_ACTIVATE_PLATFORM_VPN);
checkProvisionVpnProfile(
vpn, true /* expectedResult */, AppOpsManager.OPSTR_ACTIVATE_PLATFORM_VPN);
@@ -1002,7 +1082,7 @@
@Test
public void testProvisionVpnProfileNotPreconsented() throws Exception {
- final Vpn vpn = createVpnAndSetupUidChecks();
+ final Vpn vpn = createVpn();
// Expect that both the ACTIVATE_VPN and ACTIVATE_PLATFORM_VPN were tried, but the caller
// had neither.
@@ -1012,14 +1092,14 @@
@Test
public void testProvisionVpnProfileVpnServicePreconsented() throws Exception {
- final Vpn vpn = createVpnAndSetupUidChecks(AppOpsManager.OPSTR_ACTIVATE_VPN);
+ final Vpn vpn = createVpn(AppOpsManager.OPSTR_ACTIVATE_VPN);
checkProvisionVpnProfile(vpn, true /* expectedResult */, AppOpsManager.OPSTR_ACTIVATE_VPN);
}
@Test
public void testProvisionVpnProfileTooLarge() throws Exception {
- final Vpn vpn = createVpnAndSetupUidChecks(AppOpsManager.OPSTR_ACTIVATE_PLATFORM_VPN);
+ final Vpn vpn = createVpn(AppOpsManager.OPSTR_ACTIVATE_PLATFORM_VPN);
final VpnProfile bigProfile = new VpnProfile("");
bigProfile.name = new String(new byte[Vpn.MAX_VPN_PROFILE_SIZE_BYTES + 1]);
@@ -1034,7 +1114,7 @@
@Test
public void testProvisionVpnProfileRestrictedUser() throws Exception {
final Vpn vpn =
- createVpnAndSetupUidChecks(
+ createVpn(
RESTRICTED_PROFILE_A, AppOpsManager.OPSTR_ACTIVATE_PLATFORM_VPN);
try {
@@ -1046,7 +1126,7 @@
@Test
public void testDeleteVpnProfile() throws Exception {
- final Vpn vpn = createVpnAndSetupUidChecks();
+ final Vpn vpn = createVpn();
vpn.deleteVpnProfile(TEST_VPN_PKG);
@@ -1057,7 +1137,7 @@
@Test
public void testDeleteVpnProfileRestrictedUser() throws Exception {
final Vpn vpn =
- createVpnAndSetupUidChecks(
+ createVpn(
RESTRICTED_PROFILE_A, AppOpsManager.OPSTR_ACTIVATE_PLATFORM_VPN);
try {
@@ -1069,7 +1149,7 @@
@Test
public void testGetVpnProfilePrivileged() throws Exception {
- final Vpn vpn = createVpnAndSetupUidChecks();
+ final Vpn vpn = createVpn();
when(mVpnProfileStore.get(vpn.getProfileNameForPackage(TEST_VPN_PKG)))
.thenReturn(new VpnProfile("").encode());
@@ -1088,7 +1168,7 @@
eq(null) /* message */);
verify(mAppOps).startOp(
eq(AppOpsManager.OPSTR_ESTABLISH_VPN_MANAGER),
- eq(Process.myUid()),
+ eq(UserHandle.getUid(PRIMARY_USER.id, Process.myUid())),
eq(packageName),
eq(null) /* attributionTag */,
eq(null) /* message */);
@@ -1098,14 +1178,14 @@
// Add a small delay to double confirm that finishOp is only called once.
verify(mAppOps, after(100)).finishOp(
eq(AppOpsManager.OPSTR_ESTABLISH_VPN_MANAGER),
- eq(Process.myUid()),
+ eq(UserHandle.getUid(PRIMARY_USER.id, Process.myUid())),
eq(packageName),
eq(null) /* attributionTag */);
}
@Test
public void testStartVpnProfile() throws Exception {
- final Vpn vpn = createVpnAndSetupUidChecks(AppOpsManager.OPSTR_ACTIVATE_PLATFORM_VPN);
+ final Vpn vpn = createVpn(AppOpsManager.OPSTR_ACTIVATE_PLATFORM_VPN);
when(mVpnProfileStore.get(vpn.getProfileNameForPackage(TEST_VPN_PKG)))
.thenReturn(mVpnProfile.encode());
@@ -1118,7 +1198,7 @@
@Test
public void testStartVpnProfileVpnServicePreconsented() throws Exception {
- final Vpn vpn = createVpnAndSetupUidChecks(AppOpsManager.OPSTR_ACTIVATE_VPN);
+ final Vpn vpn = createVpn(AppOpsManager.OPSTR_ACTIVATE_VPN);
when(mVpnProfileStore.get(vpn.getProfileNameForPackage(TEST_VPN_PKG)))
.thenReturn(mVpnProfile.encode());
@@ -1132,7 +1212,7 @@
@Test
public void testStartVpnProfileNotConsented() throws Exception {
- final Vpn vpn = createVpnAndSetupUidChecks();
+ final Vpn vpn = createVpn();
try {
vpn.startVpnProfile(TEST_VPN_PKG);
@@ -1157,7 +1237,7 @@
@Test
public void testStartVpnProfileMissingProfile() throws Exception {
- final Vpn vpn = createVpnAndSetupUidChecks(AppOpsManager.OPSTR_ACTIVATE_PLATFORM_VPN);
+ final Vpn vpn = createVpn(AppOpsManager.OPSTR_ACTIVATE_PLATFORM_VPN);
when(mVpnProfileStore.get(vpn.getProfileNameForPackage(TEST_VPN_PKG))).thenReturn(null);
@@ -1179,9 +1259,7 @@
@Test
public void testStartVpnProfileRestrictedUser() throws Exception {
- final Vpn vpn =
- createVpnAndSetupUidChecks(
- RESTRICTED_PROFILE_A, AppOpsManager.OPSTR_ACTIVATE_PLATFORM_VPN);
+ final Vpn vpn = createVpn(RESTRICTED_PROFILE_A, AppOpsManager.OPSTR_ACTIVATE_PLATFORM_VPN);
try {
vpn.startVpnProfile(TEST_VPN_PKG);
@@ -1192,9 +1270,7 @@
@Test
public void testStopVpnProfileRestrictedUser() throws Exception {
- final Vpn vpn =
- createVpnAndSetupUidChecks(
- RESTRICTED_PROFILE_A, AppOpsManager.OPSTR_ACTIVATE_PLATFORM_VPN);
+ final Vpn vpn = createVpn(RESTRICTED_PROFILE_A, AppOpsManager.OPSTR_ACTIVATE_PLATFORM_VPN);
try {
vpn.stopVpnProfile(TEST_VPN_PKG);
@@ -1205,7 +1281,7 @@
@Test
public void testStartOpAndFinishOpWillBeCalledWhenPlatformVpnIsOnAndOff() throws Exception {
- final Vpn vpn = createVpnAndSetupUidChecks(AppOpsManager.OPSTR_ACTIVATE_PLATFORM_VPN);
+ final Vpn vpn = createVpn(AppOpsManager.OPSTR_ACTIVATE_PLATFORM_VPN);
when(mVpnProfileStore.get(vpn.getProfileNameForPackage(TEST_VPN_PKG)))
.thenReturn(mVpnProfile.encode());
vpn.startVpnProfile(TEST_VPN_PKG);
@@ -1213,14 +1289,14 @@
// Add a small delay to make sure that startOp is only called once.
verify(mAppOps, after(100).times(1)).startOp(
eq(AppOpsManager.OPSTR_ESTABLISH_VPN_MANAGER),
- eq(Process.myUid()),
+ eq(UserHandle.getUid(PRIMARY_USER.id, Process.myUid())),
eq(TEST_VPN_PKG),
eq(null) /* attributionTag */,
eq(null) /* message */);
// Check that the startOp is not called with OPSTR_ESTABLISH_VPN_SERVICE.
verify(mAppOps, never()).startOp(
eq(AppOpsManager.OPSTR_ESTABLISH_VPN_SERVICE),
- eq(Process.myUid()),
+ eq(UserHandle.getUid(PRIMARY_USER.id, Process.myUid())),
eq(TEST_VPN_PKG),
eq(null) /* attributionTag */,
eq(null) /* message */);
@@ -1230,7 +1306,9 @@
@Test
public void testStartOpWithSeamlessHandover() throws Exception {
- final Vpn vpn = createVpnAndSetupUidChecks(AppOpsManager.OPSTR_ACTIVATE_VPN);
+ // Create with SYSTEM_USER so that establish() will match the user ID when checking
+ // against Binder.getCallerUid
+ final Vpn vpn = createVpn(SYSTEM_USER, AppOpsManager.OPSTR_ACTIVATE_VPN);
assertTrue(vpn.prepare(TEST_VPN_PKG, null, VpnManager.TYPE_VPN_SERVICE));
final VpnConfig config = new VpnConfig();
config.user = "VpnTest";
@@ -1261,12 +1339,12 @@
}
private void verifyVpnManagerEvent(String sessionKey, String category, int errorClass,
- int errorCode, String[] packageName, VpnProfileState... profileState) {
+ int errorCode, String[] packageName, @NonNull VpnProfileState... profileState) {
final Context userContext =
mContext.createContextAsUser(UserHandle.of(PRIMARY_USER.id), 0 /* flags */);
final ArgumentCaptor<Intent> intentArgumentCaptor = ArgumentCaptor.forClass(Intent.class);
- final int verifyTimes = (profileState == null) ? 1 : profileState.length;
+ final int verifyTimes = profileState.length;
verify(userContext, times(verifyTimes)).startService(intentArgumentCaptor.capture());
for (int i = 0; i < verifyTimes; i++) {
@@ -1297,10 +1375,8 @@
VpnManager.EXTRA_UNDERLYING_LINK_PROPERTIES));
}
- if (profileState != null) {
- assertEquals(profileState[i], intent.getParcelableExtra(
- VpnManager.EXTRA_VPN_PROFILE_STATE, VpnProfileState.class));
- }
+ assertEquals(profileState[i], intent.getParcelableExtra(
+ VpnManager.EXTRA_VPN_PROFILE_STATE, VpnProfileState.class));
}
reset(userContext);
}
@@ -1309,7 +1385,11 @@
// CATEGORY_EVENT_DEACTIVATED_BY_USER is not an error event, so both of errorClass and
// errorCode won't be set.
verifyVpnManagerEvent(sessionKey, VpnManager.CATEGORY_EVENT_DEACTIVATED_BY_USER,
- -1 /* errorClass */, -1 /* errorCode */, packageName, null /* profileState */);
+ -1 /* errorClass */, -1 /* errorCode */, packageName,
+ // VPN NetworkAgnet does not switch to CONNECTED in the test, and the state is not
+ // important here. Verify that the state as it is, i.e. CONNECTING state.
+ new VpnProfileState(VpnProfileState.STATE_CONNECTING,
+ sessionKey, false /* alwaysOn */, false /* lockdown */));
}
private void verifyAlwaysOnStateChanged(String[] packageName, VpnProfileState... profileState) {
@@ -1326,7 +1406,7 @@
// this is checked with CONTROL_VPN so simulate holding CONTROL_VPN in order to pass the
// security checks.
doReturn(PERMISSION_GRANTED).when(mContext).checkCallingOrSelfPermission(CONTROL_VPN);
- final Vpn vpn = createVpnAndSetupUidChecks(AppOpsManager.OPSTR_ACTIVATE_PLATFORM_VPN);
+ final Vpn vpn = createVpn(AppOpsManager.OPSTR_ACTIVATE_PLATFORM_VPN);
when(mVpnProfileStore.get(vpn.getProfileNameForPackage(TEST_VPN_PKG)))
.thenReturn(mVpnProfile.encode());
@@ -1418,7 +1498,7 @@
@Test
public void testReconnectVpnManagerVpnWithAlwaysOnEnabled() throws Exception {
- final Vpn vpn = createVpnAndSetupUidChecks(AppOpsManager.OPSTR_ACTIVATE_PLATFORM_VPN);
+ final Vpn vpn = createVpn(AppOpsManager.OPSTR_ACTIVATE_PLATFORM_VPN);
when(mVpnProfileStore.get(vpn.getProfileNameForPackage(TEST_VPN_PKG)))
.thenReturn(mVpnProfile.encode());
vpn.startVpnProfile(TEST_VPN_PKG);
@@ -1442,51 +1522,83 @@
}
@Test
+ public void testLockdown_enableDisableWhileConnected() throws Exception {
+ final PlatformVpnSnapshot vpnSnapShot = verifySetupPlatformVpn(
+ createIkeConfig(createIkeConnectInfo(), true /* isMobikeEnabled */));
+
+ final InOrder order = inOrder(mTestDeps);
+ order.verify(mTestDeps, timeout(TIMEOUT_CROSSTHREAD_MS))
+ .newNetworkAgent(any(), any(), any(), any(), any(), any(),
+ argThat(config -> config.allowBypass), any(), any());
+
+ // Make VPN lockdown.
+ assertTrue(vpnSnapShot.vpn.setAlwaysOnPackage(TEST_VPN_PKG, true /* lockdown */,
+ null /* lockdownAllowlist */));
+
+ order.verify(mTestDeps, timeout(TIMEOUT_CROSSTHREAD_MS))
+ .newNetworkAgent(any(), any(), any(), any(), any(), any(),
+ argThat(config -> !config.allowBypass), any(), any());
+
+ // Disable lockdown.
+ assertTrue(vpnSnapShot.vpn.setAlwaysOnPackage(TEST_VPN_PKG, false /* lockdown */,
+ null /* lockdownAllowlist */));
+
+ order.verify(mTestDeps, timeout(TIMEOUT_CROSSTHREAD_MS))
+ .newNetworkAgent(any(), any(), any(), any(), any(), any(),
+ argThat(config -> config.allowBypass), any(), any());
+ }
+
+ @Test
public void testSetPackageAuthorizationVpnService() throws Exception {
- final Vpn vpn = createVpnAndSetupUidChecks();
+ final Vpn vpn = createVpn();
assertTrue(vpn.setPackageAuthorization(TEST_VPN_PKG, VpnManager.TYPE_VPN_SERVICE));
verify(mAppOps)
.setMode(
eq(AppOpsManager.OPSTR_ACTIVATE_VPN),
- eq(Process.myUid()),
+ eq(UserHandle.getUid(PRIMARY_USER.id, Process.myUid())),
eq(TEST_VPN_PKG),
eq(AppOpsManager.MODE_ALLOWED));
}
@Test
public void testSetPackageAuthorizationPlatformVpn() throws Exception {
- final Vpn vpn = createVpnAndSetupUidChecks();
+ final Vpn vpn = createVpn();
assertTrue(vpn.setPackageAuthorization(TEST_VPN_PKG, TYPE_VPN_PLATFORM));
verify(mAppOps)
.setMode(
eq(AppOpsManager.OPSTR_ACTIVATE_PLATFORM_VPN),
- eq(Process.myUid()),
+ eq(UserHandle.getUid(PRIMARY_USER.id, Process.myUid())),
eq(TEST_VPN_PKG),
eq(AppOpsManager.MODE_ALLOWED));
}
@Test
public void testSetPackageAuthorizationRevokeAuthorization() throws Exception {
- final Vpn vpn = createVpnAndSetupUidChecks();
+ final Vpn vpn = createVpn();
assertTrue(vpn.setPackageAuthorization(TEST_VPN_PKG, VpnManager.TYPE_VPN_NONE));
verify(mAppOps)
.setMode(
eq(AppOpsManager.OPSTR_ACTIVATE_VPN),
- eq(Process.myUid()),
+ eq(UserHandle.getUid(PRIMARY_USER.id, Process.myUid())),
eq(TEST_VPN_PKG),
eq(AppOpsManager.MODE_IGNORED));
verify(mAppOps)
.setMode(
eq(AppOpsManager.OPSTR_ACTIVATE_PLATFORM_VPN),
- eq(Process.myUid()),
+ eq(UserHandle.getUid(PRIMARY_USER.id, Process.myUid())),
eq(TEST_VPN_PKG),
eq(AppOpsManager.MODE_IGNORED));
}
private NetworkCallback triggerOnAvailableAndGetCallback() throws Exception {
+ return triggerOnAvailableAndGetCallback(new NetworkCapabilities.Builder().build());
+ }
+
+ private NetworkCallback triggerOnAvailableAndGetCallback(
+ @NonNull final NetworkCapabilities caps) throws Exception {
final ArgumentCaptor<NetworkCallback> networkCallbackCaptor =
ArgumentCaptor.forClass(NetworkCallback.class);
verify(mConnectivityManager, timeout(TEST_TIMEOUT_MS))
@@ -1503,7 +1615,7 @@
// if NetworkCapabilities and LinkProperties of underlying network will be sent/cleared or
// not.
// See verifyVpnManagerEvent().
- cb.onCapabilitiesChanged(TEST_NETWORK, new NetworkCapabilities());
+ cb.onCapabilitiesChanged(TEST_NETWORK, caps);
cb.onLinkPropertiesChanged(TEST_NETWORK, new LinkProperties());
return cb;
}
@@ -1519,7 +1631,7 @@
final ArgumentCaptor<IkeSessionCallback> captor =
ArgumentCaptor.forClass(IkeSessionCallback.class);
- final Vpn vpn = createVpnAndSetupUidChecks(AppOpsManager.OPSTR_ACTIVATE_PLATFORM_VPN);
+ final Vpn vpn = createVpn(AppOpsManager.OPSTR_ACTIVATE_PLATFORM_VPN);
when(mVpnProfileStore.get(vpn.getProfileNameForPackage(TEST_VPN_PKG)))
.thenReturn(mVpnProfile.encode());
@@ -1542,10 +1654,7 @@
// same process with the real case.
if (errorCode == VpnManager.ERROR_CODE_NETWORK_LOST) {
cb.onLost(TEST_NETWORK);
- final ArgumentCaptor<Runnable> runnableCaptor =
- ArgumentCaptor.forClass(Runnable.class);
- verify(mExecutor).schedule(runnableCaptor.capture(), anyLong(), any());
- runnableCaptor.getValue().run();
+ verify(mExecutor, atLeastOnce()).schedule(any(Runnable.class), anyLong(), any());
} else {
final IkeSessionCallback ikeCb = captor.getValue();
ikeCb.onClosedWithException(exception);
@@ -1554,7 +1663,10 @@
verifyPowerSaveTempWhitelistApp(TEST_VPN_PKG);
reset(mDeviceIdleInternal);
verifyVpnManagerEvent(sessionKey, category, errorType, errorCode,
- new String[] {TEST_VPN_PKG}, null /* profileState */);
+ // VPN NetworkAgnet does not switch to CONNECTED in the test, and the state is not
+ // important here. Verify that the state as it is, i.e. CONNECTING state.
+ new String[] {TEST_VPN_PKG}, new VpnProfileState(VpnProfileState.STATE_CONNECTING,
+ sessionKey, false /* alwaysOn */, false /* lockdown */));
if (errorType == VpnManager.ERROR_CLASS_NOT_RECOVERABLE) {
verify(mConnectivityManager, timeout(TEST_TIMEOUT_MS))
.unregisterNetworkCallback(eq(cb));
@@ -1570,25 +1682,23 @@
}
private IkeSessionCallback verifyRetryAndGetNewIkeCb(int retryIndex) {
- final ArgumentCaptor<Runnable> runnableCaptor =
- ArgumentCaptor.forClass(Runnable.class);
final ArgumentCaptor<IkeSessionCallback> ikeCbCaptor =
ArgumentCaptor.forClass(IkeSessionCallback.class);
// Verify retry is scheduled
- final long expectedDelay = mTestDeps.getNextRetryDelaySeconds(retryIndex);
- verify(mExecutor).schedule(runnableCaptor.capture(), eq(expectedDelay), any());
+ final long expectedDelayMs = mTestDeps.getNextRetryDelayMs(retryIndex);
+ final ArgumentCaptor<Long> delayCaptor = ArgumentCaptor.forClass(Long.class);
+ verify(mExecutor, atLeastOnce()).schedule(any(Runnable.class), delayCaptor.capture(),
+ eq(TimeUnit.MILLISECONDS));
+ final List<Long> delays = delayCaptor.getAllValues();
+ assertEquals(expectedDelayMs, (long) delays.get(delays.size() - 1));
- // Mock the event of firing the retry task
- runnableCaptor.getValue().run();
-
- verify(mIkev2SessionCreator)
+ verify(mIkev2SessionCreator, timeout(TEST_TIMEOUT_MS + expectedDelayMs))
.createIkeSession(any(), any(), any(), any(), ikeCbCaptor.capture(), any());
// Forget the mIkev2SessionCreator#createIkeSession call and mExecutor#schedule call
// for the next retry verification
resetIkev2SessionCreator(mIkeSessionWrapper);
- resetExecutor(mScheduledFuture);
return ikeCbCaptor.getValue();
}
@@ -1829,6 +1939,16 @@
private PlatformVpnSnapshot verifySetupPlatformVpn(VpnProfile vpnProfile,
IkeSessionConfiguration ikeConfig, boolean mtuSupportsIpv6) throws Exception {
+ return verifySetupPlatformVpn(vpnProfile, ikeConfig,
+ new NetworkCapabilities.Builder().build() /* underlying network caps */,
+ mtuSupportsIpv6, false /* areLongLivedTcpConnectionsExpensive */);
+ }
+
+ private PlatformVpnSnapshot verifySetupPlatformVpn(VpnProfile vpnProfile,
+ IkeSessionConfiguration ikeConfig,
+ @NonNull final NetworkCapabilities underlyingNetworkCaps,
+ boolean mtuSupportsIpv6,
+ boolean areLongLivedTcpConnectionsExpensive) throws Exception {
if (!mtuSupportsIpv6) {
doReturn(IPV6_MIN_MTU - 1).when(mTestDeps).calculateVpnMtu(any(), anyInt(), anyInt(),
anyBoolean());
@@ -1839,12 +1959,14 @@
any(), any(), anyString(), any(), any(), any(), any(), any(), any());
doReturn(TEST_NETWORK).when(mMockNetworkAgent).getNetwork();
- final Vpn vpn = createVpnAndSetupUidChecks(AppOpsManager.OPSTR_ACTIVATE_PLATFORM_VPN);
+ final Vpn vpn = createVpn(AppOpsManager.OPSTR_ACTIVATE_PLATFORM_VPN);
when(mVpnProfileStore.get(vpn.getProfileNameForPackage(TEST_VPN_PKG)))
.thenReturn(vpnProfile.encode());
vpn.startVpnProfile(TEST_VPN_PKG);
- final NetworkCallback nwCb = triggerOnAvailableAndGetCallback();
+ final NetworkCallback nwCb = triggerOnAvailableAndGetCallback(underlyingNetworkCaps);
+ verify(mExecutor, atLeastOnce()).schedule(any(Runnable.class), anyLong(), any());
+ reset(mExecutor);
// Mock the setup procedure by firing callbacks
final Pair<IkeSessionCallback, ChildSessionCallback> cbPair =
@@ -1911,8 +2033,10 @@
// Check if allowBypass is set or not.
assertTrue(nacCaptor.getValue().isBypassableVpn());
- assertTrue(((VpnTransportInfo) ncCaptor.getValue().getTransportInfo()).isBypassable());
-
+ final VpnTransportInfo info = (VpnTransportInfo) ncCaptor.getValue().getTransportInfo();
+ assertTrue(info.isBypassable());
+ assertEquals(areLongLivedTcpConnectionsExpensive,
+ info.areLongLivedTcpConnectionsExpensive());
return new PlatformVpnSnapshot(vpn, nwCb, ikeCb, childCb);
}
@@ -1924,43 +2048,54 @@
}
@Test
- public void testMigrateIkeSessionFromIkeTunnConnParams_AutoTimerNoTimer()
- throws Exception {
+ public void testMigrateIkeSession_FromIkeTunnConnParams_AutoTimerNoTimer() throws Exception {
doTestMigrateIkeSession_FromIkeTunnConnParams(
false /* isAutomaticIpVersionSelectionEnabled */,
true /* isAutomaticNattKeepaliveTimerEnabled */,
- TEST_KEEPALIVE_TIMEOUT_UNSET);
+ TEST_KEEPALIVE_TIMEOUT_UNSET /* keepaliveInProfile */,
+ ESP_IP_VERSION_AUTO /* ipVersionInProfile */,
+ ESP_ENCAP_TYPE_AUTO /* encapTypeInProfile */);
}
@Test
- public void testMigrateIkeSessionFromIkeTunnConnParams_AutoTimerTimerSet()
- throws Exception {
+ public void testMigrateIkeSession_FromIkeTunnConnParams_AutoTimerTimerSet() throws Exception {
doTestMigrateIkeSession_FromIkeTunnConnParams(
false /* isAutomaticIpVersionSelectionEnabled */,
true /* isAutomaticNattKeepaliveTimerEnabled */,
- 800 /* keepaliveTimeout */);
+ TEST_KEEPALIVE_TIMER /* keepaliveInProfile */,
+ ESP_IP_VERSION_AUTO /* ipVersionInProfile */,
+ ESP_ENCAP_TYPE_AUTO /* encapTypeInProfile */);
}
@Test
- public void testMigrateIkeSessionFromIkeTunnConnParams_AutoIp()
- throws Exception {
+ public void testMigrateIkeSession_FromIkeTunnConnParams_AutoIp() throws Exception {
doTestMigrateIkeSession_FromIkeTunnConnParams(
true /* isAutomaticIpVersionSelectionEnabled */,
false /* isAutomaticNattKeepaliveTimerEnabled */,
- TEST_KEEPALIVE_TIMEOUT_UNSET /* keepaliveTimeout */);
+ TEST_KEEPALIVE_TIMEOUT_UNSET /* keepaliveInProfile */,
+ ESP_IP_VERSION_AUTO /* ipVersionInProfile */,
+ ESP_ENCAP_TYPE_AUTO /* encapTypeInProfile */);
}
@Test
- public void testMigrateIkeSession_FromNotIkeTunnConnParams_AutoTimer()
- throws Exception {
+ public void testMigrateIkeSession_FromIkeTunnConnParams_AssignedIpProtocol() throws Exception {
+ doTestMigrateIkeSession_FromIkeTunnConnParams(
+ false /* isAutomaticIpVersionSelectionEnabled */,
+ false /* isAutomaticNattKeepaliveTimerEnabled */,
+ TEST_KEEPALIVE_TIMEOUT_UNSET /* keepaliveInProfile */,
+ ESP_IP_VERSION_IPV4 /* ipVersionInProfile */,
+ ESP_ENCAP_TYPE_UDP /* encapTypeInProfile */);
+ }
+
+ @Test
+ public void testMigrateIkeSession_FromNotIkeTunnConnParams_AutoTimer() throws Exception {
doTestMigrateIkeSession_FromNotIkeTunnConnParams(
false /* isAutomaticIpVersionSelectionEnabled */,
true /* isAutomaticNattKeepaliveTimerEnabled */);
}
@Test
- public void testMigrateIkeSession_FromNotIkeTunnConnParams_AutoIp()
- throws Exception {
+ public void testMigrateIkeSession_FromNotIkeTunnConnParams_AutoIp() throws Exception {
doTestMigrateIkeSession_FromNotIkeTunnConnParams(
true /* isAutomaticIpVersionSelectionEnabled */,
false /* isAutomaticNattKeepaliveTimerEnabled */);
@@ -1980,53 +2115,374 @@
final int expectedKeepalive = isAutomaticNattKeepaliveTimerEnabled
? AUTOMATIC_KEEPALIVE_DELAY_SECONDS
: DEFAULT_UDP_PORT_4500_NAT_TIMEOUT_SEC_INT;
- doTestMigrateIkeSession(ikeProfile.toVpnProfile(), expectedKeepalive,
- isAutomaticIpVersionSelectionEnabled);
+ doTestMigrateIkeSession(ikeProfile.toVpnProfile(),
+ expectedKeepalive,
+ ESP_IP_VERSION_AUTO /* expectedIpVersion */,
+ ESP_ENCAP_TYPE_AUTO /* expectedEncapType */,
+ new NetworkCapabilities.Builder().build());
+ }
+
+ private Ikev2VpnProfile makeIkeV2VpnProfile(
+ boolean isAutomaticIpVersionSelectionEnabled,
+ boolean isAutomaticNattKeepaliveTimerEnabled,
+ int keepaliveInProfile,
+ int ipVersionInProfile,
+ int encapTypeInProfile) {
+ // TODO: Update helper function in IkeSessionTestUtils to support building IkeSessionParams
+ // with IP version and encap type when mainline-prod branch support these two APIs.
+ final IkeSessionParams params = getTestIkeSessionParams(true /* testIpv6 */,
+ new IkeFqdnIdentification(TEST_IDENTITY), keepaliveInProfile);
+ final IkeSessionParams ikeSessionParams = new IkeSessionParams.Builder(params)
+ .setIpVersion(ipVersionInProfile)
+ .setEncapType(encapTypeInProfile)
+ .build();
+
+ final IkeTunnelConnectionParams tunnelParams =
+ new IkeTunnelConnectionParams(ikeSessionParams, CHILD_PARAMS);
+ return new Ikev2VpnProfile.Builder(tunnelParams)
+ .setBypassable(true)
+ .setAutomaticNattKeepaliveTimerEnabled(isAutomaticNattKeepaliveTimerEnabled)
+ .setAutomaticIpVersionSelectionEnabled(isAutomaticIpVersionSelectionEnabled)
+ .build();
}
private void doTestMigrateIkeSession_FromIkeTunnConnParams(
boolean isAutomaticIpVersionSelectionEnabled,
boolean isAutomaticNattKeepaliveTimerEnabled,
- int keepaliveInProfile) throws Exception {
- final IkeSessionParams ikeSessionParams = getTestIkeSessionParams(true /* testIpv6 */,
- new IkeFqdnIdentification(TEST_IDENTITY), keepaliveInProfile);
- final IkeTunnelConnectionParams tunnelParams =
- new IkeTunnelConnectionParams(ikeSessionParams, CHILD_PARAMS);
- final Ikev2VpnProfile ikeProfile = new Ikev2VpnProfile.Builder(tunnelParams)
- .setBypassable(true)
- .setAutomaticNattKeepaliveTimerEnabled(isAutomaticNattKeepaliveTimerEnabled)
- .setAutomaticIpVersionSelectionEnabled(isAutomaticIpVersionSelectionEnabled)
- .build();
+ int keepaliveInProfile,
+ int ipVersionInProfile,
+ int encapTypeInProfile) throws Exception {
+ doTestMigrateIkeSession_FromIkeTunnConnParams(isAutomaticIpVersionSelectionEnabled,
+ isAutomaticNattKeepaliveTimerEnabled, keepaliveInProfile, ipVersionInProfile,
+ encapTypeInProfile, new NetworkCapabilities.Builder().build());
+ }
+ private void doTestMigrateIkeSession_FromIkeTunnConnParams(
+ boolean isAutomaticIpVersionSelectionEnabled,
+ boolean isAutomaticNattKeepaliveTimerEnabled,
+ int keepaliveInProfile,
+ int ipVersionInProfile,
+ int encapTypeInProfile,
+ @NonNull final NetworkCapabilities nc) throws Exception {
+ final Ikev2VpnProfile ikeProfile = makeIkeV2VpnProfile(
+ isAutomaticIpVersionSelectionEnabled,
+ isAutomaticNattKeepaliveTimerEnabled,
+ keepaliveInProfile,
+ ipVersionInProfile,
+ encapTypeInProfile);
+
+ final IkeSessionParams ikeSessionParams =
+ ikeProfile.getIkeTunnelConnectionParams().getIkeSessionParams();
final int expectedKeepalive = isAutomaticNattKeepaliveTimerEnabled
? AUTOMATIC_KEEPALIVE_DELAY_SECONDS
: ikeSessionParams.getNattKeepAliveDelaySeconds();
+ final int expectedIpVersion = isAutomaticIpVersionSelectionEnabled
+ ? ESP_IP_VERSION_AUTO
+ : ikeSessionParams.getIpVersion();
+ final int expectedEncapType = isAutomaticIpVersionSelectionEnabled
+ ? ESP_ENCAP_TYPE_AUTO
+ : ikeSessionParams.getEncapType();
doTestMigrateIkeSession(ikeProfile.toVpnProfile(), expectedKeepalive,
- isAutomaticIpVersionSelectionEnabled);
+ expectedIpVersion, expectedEncapType, nc);
}
- private void doTestMigrateIkeSession(VpnProfile profile, int expectedKeepalive,
- boolean isAutomaticIpVersionSelectionEnabled) throws Exception {
- final int expectedIpVersion = isAutomaticIpVersionSelectionEnabled
- ? ESP_IP_VERSION_AUTO : ESP_IP_VERSION_AUTO;
- final int expectedEncapType = isAutomaticIpVersionSelectionEnabled
- ? ESP_ENCAP_TYPE_AUTO : ESP_IP_VERSION_AUTO;
+ @Test
+ public void doTestMigrateIkeSession_Vcn() throws Exception {
+ final int expectedKeepalive = 2097; // Any unlikely number will do
+ final NetworkCapabilities vcnNc = new NetworkCapabilities.Builder()
+ .addTransportType(TRANSPORT_CELLULAR)
+ .setTransportInfo(new VcnTransportInfo(TEST_SUB_ID, expectedKeepalive))
+ .build();
+ final Ikev2VpnProfile ikev2VpnProfile = makeIkeV2VpnProfile(
+ true /* isAutomaticIpVersionSelectionEnabled */,
+ true /* isAutomaticNattKeepaliveTimerEnabled */,
+ 234 /* keepaliveInProfile */, // Should be ignored, any value will do
+ ESP_IP_VERSION_IPV4, // Should be ignored
+ ESP_ENCAP_TYPE_UDP // Should be ignored
+ );
+ doTestMigrateIkeSession(
+ ikev2VpnProfile.toVpnProfile(),
+ expectedKeepalive,
+ ESP_IP_VERSION_AUTO /* expectedIpVersion */,
+ ESP_ENCAP_TYPE_AUTO /* expectedEncapType */,
+ vcnNc);
+ }
+ private void doTestMigrateIkeSession(
+ @NonNull final VpnProfile profile,
+ final int expectedKeepalive,
+ final int expectedIpVersion,
+ final int expectedEncapType,
+ @NonNull final NetworkCapabilities caps) throws Exception {
final PlatformVpnSnapshot vpnSnapShot =
verifySetupPlatformVpn(profile,
createIkeConfig(createIkeConnectInfo(), true /* isMobikeEnabled */),
- false /* mtuSupportsIpv6 */);
- // Mock new network comes up and the cleanup task is cancelled
+ caps /* underlying network capabilities */,
+ false /* mtuSupportsIpv6 */,
+ expectedKeepalive < DEFAULT_LONG_LIVED_TCP_CONNS_EXPENSIVE_TIMEOUT_SEC);
+ // Simulate a new network coming up
vpnSnapShot.nwCb.onAvailable(TEST_NETWORK_2);
+ verify(mIkeSessionWrapper, never()).setNetwork(any(), anyInt(), anyInt(), anyInt());
+ vpnSnapShot.nwCb.onCapabilitiesChanged(TEST_NETWORK_2, caps);
// Verify MOBIKE is triggered
- verify(mIkeSessionWrapper).setNetwork(TEST_NETWORK_2,
+ verify(mIkeSessionWrapper, timeout(TEST_TIMEOUT_MS)).setNetwork(TEST_NETWORK_2,
expectedIpVersion, expectedEncapType, expectedKeepalive);
vpnSnapShot.vpn.mVpnRunner.exitVpnRunner();
}
@Test
+ public void testLinkPropertiesUpdateTriggerReevaluation() throws Exception {
+ final boolean hasV6 = true;
+
+ mockCarrierConfig(TEST_SUB_ID, TelephonyManager.SIM_STATE_LOADED, TEST_KEEPALIVE_TIMER,
+ PREFERRED_IKE_PROTOCOL_IPV6_ESP);
+ final IkeSessionParams params = getTestIkeSessionParams(hasV6,
+ new IkeFqdnIdentification(TEST_IDENTITY), TEST_KEEPALIVE_TIMER);
+ final IkeTunnelConnectionParams tunnelParams =
+ new IkeTunnelConnectionParams(params, CHILD_PARAMS);
+ final Ikev2VpnProfile ikeProfile = new Ikev2VpnProfile.Builder(tunnelParams)
+ .setBypassable(true)
+ .setAutomaticNattKeepaliveTimerEnabled(false)
+ .setAutomaticIpVersionSelectionEnabled(true)
+ .build();
+ final PlatformVpnSnapshot vpnSnapShot =
+ verifySetupPlatformVpn(ikeProfile.toVpnProfile(),
+ createIkeConfig(createIkeConnectInfo(), true /* isMobikeEnabled */),
+ new NetworkCapabilities.Builder().build() /* underlying network caps */,
+ hasV6 /* mtuSupportsIpv6 */,
+ false /* areLongLivedTcpConnectionsExpensive */);
+ reset(mExecutor);
+
+ // Simulate a new network coming up
+ final LinkProperties lp = new LinkProperties();
+ lp.addLinkAddress(new LinkAddress("192.0.2.2/32"));
+
+ // Have the executor use the real delay to make sure schedule() was called only
+ // once for all calls. Also, arrange for execute() not to call schedule() to avoid
+ // messing with the checks for schedule().
+ mExecutor.delayMs = TestExecutor.REAL_DELAY;
+ mExecutor.executeDirect = true;
+ vpnSnapShot.nwCb.onAvailable(TEST_NETWORK_2);
+ vpnSnapShot.nwCb.onCapabilitiesChanged(
+ TEST_NETWORK_2, new NetworkCapabilities.Builder().build());
+ vpnSnapShot.nwCb.onLinkPropertiesChanged(TEST_NETWORK_2, new LinkProperties(lp));
+ verify(mExecutor).schedule(any(Runnable.class), longThat(it -> it > 0), any());
+ reset(mExecutor);
+
+ final InOrder order = inOrder(mIkeSessionWrapper);
+
+ // Verify the network is started
+ order.verify(mIkeSessionWrapper, timeout(TIMEOUT_CROSSTHREAD_MS)).setNetwork(TEST_NETWORK_2,
+ ESP_IP_VERSION_AUTO, ESP_ENCAP_TYPE_AUTO, TEST_KEEPALIVE_TIMER);
+
+ // Send the same properties, check that no migration is scheduled
+ vpnSnapShot.nwCb.onLinkPropertiesChanged(TEST_NETWORK_2, new LinkProperties(lp));
+ verify(mExecutor, never()).schedule(any(Runnable.class), anyLong(), any());
+
+ // Add v6 address, verify MOBIKE is triggered
+ lp.addLinkAddress(new LinkAddress("2001:db8::1/64"));
+ vpnSnapShot.nwCb.onLinkPropertiesChanged(TEST_NETWORK_2, new LinkProperties(lp));
+ order.verify(mIkeSessionWrapper, timeout(TIMEOUT_CROSSTHREAD_MS)).setNetwork(TEST_NETWORK_2,
+ ESP_IP_VERSION_AUTO, ESP_ENCAP_TYPE_AUTO, TEST_KEEPALIVE_TIMER);
+
+ // Add another v4 address, verify MOBIKE is triggered
+ final LinkProperties stacked = new LinkProperties();
+ stacked.setInterfaceName("v4-" + lp.getInterfaceName());
+ stacked.addLinkAddress(new LinkAddress("192.168.0.1/32"));
+ lp.addStackedLink(stacked);
+ vpnSnapShot.nwCb.onLinkPropertiesChanged(TEST_NETWORK_2, new LinkProperties(lp));
+ order.verify(mIkeSessionWrapper, timeout(TIMEOUT_CROSSTHREAD_MS)).setNetwork(TEST_NETWORK_2,
+ ESP_IP_VERSION_AUTO, ESP_ENCAP_TYPE_AUTO, TEST_KEEPALIVE_TIMER);
+
+ vpnSnapShot.vpn.mVpnRunner.exitVpnRunner();
+ }
+
+ private void mockCarrierConfig(int subId, int simStatus, int keepaliveTimer, int ikeProtocol) {
+ final SubscriptionInfo subscriptionInfo = mock(SubscriptionInfo.class);
+ doReturn(subId).when(subscriptionInfo).getSubscriptionId();
+ doReturn(List.of(subscriptionInfo)).when(mSubscriptionManager)
+ .getActiveSubscriptionInfoList();
+
+ doReturn(simStatus).when(mTmPerSub).getSimApplicationState();
+ doReturn(TEST_MCCMNC).when(mTmPerSub).getSimOperator(subId);
+
+ final PersistableBundle persistableBundle = new PersistableBundle();
+ persistableBundle.putInt(KEY_MIN_UDP_PORT_4500_NAT_TIMEOUT_SEC_INT, keepaliveTimer);
+ persistableBundle.putInt(KEY_PREFERRED_IKE_PROTOCOL_INT, ikeProtocol);
+ // For CarrierConfigManager.isConfigForIdentifiedCarrier check
+ persistableBundle.putBoolean(KEY_CARRIER_CONFIG_APPLIED_BOOL, true);
+ doReturn(persistableBundle).when(mConfigManager).getConfigForSubId(subId);
+ }
+
+ private CarrierConfigManager.CarrierConfigChangeListener getCarrierConfigListener() {
+ final ArgumentCaptor<CarrierConfigManager.CarrierConfigChangeListener> listenerCaptor =
+ ArgumentCaptor.forClass(CarrierConfigManager.CarrierConfigChangeListener.class);
+
+ verify(mConfigManager).registerCarrierConfigChangeListener(any(), listenerCaptor.capture());
+
+ return listenerCaptor.getValue();
+ }
+
+ @Test
+ public void testNattKeepaliveTimerFromCarrierConfig_noSubId() throws Exception {
+ doTestReadCarrierConfig(new NetworkCapabilities(),
+ TelephonyManager.SIM_STATE_LOADED,
+ PREFERRED_IKE_PROTOCOL_IPV4_UDP,
+ AUTOMATIC_KEEPALIVE_DELAY_SECONDS /* expectedKeepaliveTimer */,
+ ESP_IP_VERSION_AUTO /* expectedIpVersion */,
+ ESP_ENCAP_TYPE_AUTO /* expectedEncapType */,
+ false /* expectedReadFromCarrierConfig*/,
+ true /* areLongLivedTcpConnectionsExpensive */);
+ }
+
+ @Test
+ public void testNattKeepaliveTimerFromCarrierConfig_simAbsent() throws Exception {
+ doTestReadCarrierConfig(new NetworkCapabilities.Builder().build(),
+ TelephonyManager.SIM_STATE_ABSENT,
+ PREFERRED_IKE_PROTOCOL_IPV4_UDP,
+ AUTOMATIC_KEEPALIVE_DELAY_SECONDS /* expectedKeepaliveTimer */,
+ ESP_IP_VERSION_AUTO /* expectedIpVersion */,
+ ESP_ENCAP_TYPE_AUTO /* expectedEncapType */,
+ false /* expectedReadFromCarrierConfig*/,
+ true /* areLongLivedTcpConnectionsExpensive */);
+ }
+
+ @Test
+ public void testNattKeepaliveTimerFromCarrierConfig() throws Exception {
+ doTestReadCarrierConfig(createTestCellNc(),
+ TelephonyManager.SIM_STATE_LOADED,
+ PREFERRED_IKE_PROTOCOL_AUTO,
+ TEST_KEEPALIVE_TIMER /* expectedKeepaliveTimer */,
+ ESP_IP_VERSION_AUTO /* expectedIpVersion */,
+ ESP_ENCAP_TYPE_AUTO /* expectedEncapType */,
+ true /* expectedReadFromCarrierConfig*/,
+ false /* areLongLivedTcpConnectionsExpensive */);
+ }
+
+ @Test
+ public void testNattKeepaliveTimerFromCarrierConfig_NotCell() throws Exception {
+ final NetworkCapabilities nc = new NetworkCapabilities.Builder()
+ .addTransportType(TRANSPORT_WIFI)
+ .setTransportInfo(new WifiInfo.Builder().build())
+ .build();
+ doTestReadCarrierConfig(nc,
+ TelephonyManager.SIM_STATE_LOADED,
+ PREFERRED_IKE_PROTOCOL_IPV4_UDP,
+ AUTOMATIC_KEEPALIVE_DELAY_SECONDS /* expectedKeepaliveTimer */,
+ ESP_IP_VERSION_AUTO /* expectedIpVersion */,
+ ESP_ENCAP_TYPE_AUTO /* expectedEncapType */,
+ false /* expectedReadFromCarrierConfig*/,
+ true /* areLongLivedTcpConnectionsExpensive */);
+ }
+
+ @Test
+ public void testPreferredIpProtocolFromCarrierConfig_v4UDP() throws Exception {
+ doTestReadCarrierConfig(createTestCellNc(),
+ TelephonyManager.SIM_STATE_LOADED,
+ PREFERRED_IKE_PROTOCOL_IPV4_UDP,
+ TEST_KEEPALIVE_TIMER /* expectedKeepaliveTimer */,
+ ESP_IP_VERSION_IPV4 /* expectedIpVersion */,
+ ESP_ENCAP_TYPE_UDP /* expectedEncapType */,
+ true /* expectedReadFromCarrierConfig*/,
+ false /* areLongLivedTcpConnectionsExpensive */);
+ }
+
+ @Test
+ public void testPreferredIpProtocolFromCarrierConfig_v6ESP() throws Exception {
+ doTestReadCarrierConfig(createTestCellNc(),
+ TelephonyManager.SIM_STATE_LOADED,
+ PREFERRED_IKE_PROTOCOL_IPV6_ESP,
+ TEST_KEEPALIVE_TIMER /* expectedKeepaliveTimer */,
+ ESP_IP_VERSION_IPV6 /* expectedIpVersion */,
+ ESP_ENCAP_TYPE_NONE /* expectedEncapType */,
+ true /* expectedReadFromCarrierConfig*/,
+ false /* areLongLivedTcpConnectionsExpensive */);
+ }
+
+ @Test
+ public void testPreferredIpProtocolFromCarrierConfig_v6UDP() throws Exception {
+ doTestReadCarrierConfig(createTestCellNc(),
+ TelephonyManager.SIM_STATE_LOADED,
+ PREFERRED_IKE_PROTOCOL_IPV6_UDP,
+ TEST_KEEPALIVE_TIMER /* expectedKeepaliveTimer */,
+ ESP_IP_VERSION_IPV6 /* expectedIpVersion */,
+ ESP_ENCAP_TYPE_UDP /* expectedEncapType */,
+ true /* expectedReadFromCarrierConfig*/,
+ false /* areLongLivedTcpConnectionsExpensive */);
+ }
+
+ private NetworkCapabilities createTestCellNc() {
+ return new NetworkCapabilities.Builder()
+ .addTransportType(TRANSPORT_CELLULAR)
+ .setNetworkSpecifier(new TelephonyNetworkSpecifier.Builder()
+ .setSubscriptionId(TEST_SUB_ID)
+ .build())
+ .build();
+ }
+
+ private void doTestReadCarrierConfig(NetworkCapabilities nc, int simState, int preferredIpProto,
+ int expectedKeepaliveTimer, int expectedIpVersion, int expectedEncapType,
+ boolean expectedReadFromCarrierConfig,
+ boolean areLongLivedTcpConnectionsExpensive)
+ throws Exception {
+ final Ikev2VpnProfile ikeProfile =
+ new Ikev2VpnProfile.Builder(TEST_VPN_SERVER, TEST_VPN_IDENTITY)
+ .setAuthPsk(TEST_VPN_PSK)
+ .setBypassable(true /* isBypassable */)
+ .setAutomaticNattKeepaliveTimerEnabled(true)
+ .setAutomaticIpVersionSelectionEnabled(true)
+ .build();
+
+ final PlatformVpnSnapshot vpnSnapShot =
+ verifySetupPlatformVpn(ikeProfile.toVpnProfile(),
+ createIkeConfig(createIkeConnectInfo(), true /* isMobikeEnabled */),
+ new NetworkCapabilities.Builder().build() /* underlying network caps */,
+ false /* mtuSupportsIpv6 */,
+ true /* areLongLivedTcpConnectionsExpensive */);
+
+ final CarrierConfigManager.CarrierConfigChangeListener listener =
+ getCarrierConfigListener();
+
+ // Simulate a new network coming up
+ vpnSnapShot.nwCb.onAvailable(TEST_NETWORK_2);
+ // Migration will not be started until receiving network capabilities change.
+ verify(mIkeSessionWrapper, never()).setNetwork(any(), anyInt(), anyInt(), anyInt());
+
+ reset(mIkeSessionWrapper);
+ mockCarrierConfig(TEST_SUB_ID, simState, TEST_KEEPALIVE_TIMER, preferredIpProto);
+ vpnSnapShot.nwCb.onCapabilitiesChanged(TEST_NETWORK_2, nc);
+ verify(mIkeSessionWrapper, timeout(TEST_TIMEOUT_MS)).setNetwork(TEST_NETWORK_2,
+ expectedIpVersion, expectedEncapType, expectedKeepaliveTimer);
+ if (expectedReadFromCarrierConfig) {
+ final ArgumentCaptor<NetworkCapabilities> ncCaptor =
+ ArgumentCaptor.forClass(NetworkCapabilities.class);
+ verify(mMockNetworkAgent).doSendNetworkCapabilities(ncCaptor.capture());
+
+ final VpnTransportInfo info =
+ (VpnTransportInfo) ncCaptor.getValue().getTransportInfo();
+ assertEquals(areLongLivedTcpConnectionsExpensive,
+ info.areLongLivedTcpConnectionsExpensive());
+ } else {
+ verify(mMockNetworkAgent, never()).doSendNetworkCapabilities(any());
+ }
+
+ reset(mExecutor);
+ reset(mIkeSessionWrapper);
+ reset(mMockNetworkAgent);
+
+ // Trigger carrier config change
+ listener.onCarrierConfigChanged(1 /* logicalSlotIndex */, TEST_SUB_ID,
+ -1 /* carrierId */, -1 /* specificCarrierId */);
+ verify(mIkeSessionWrapper).setNetwork(TEST_NETWORK_2,
+ expectedIpVersion, expectedEncapType, expectedKeepaliveTimer);
+ // Expect no NetworkCapabilities change.
+ // Call to doSendNetworkCapabilities() will not be triggered.
+ verify(mMockNetworkAgent, never()).doSendNetworkCapabilities(any());
+ }
+
+ @Test
public void testStartPlatformVpn_mtuDoesNotSupportIpv6() throws Exception {
final PlatformVpnSnapshot vpnSnapShot =
verifySetupPlatformVpn(
@@ -2046,14 +2502,16 @@
// Mock network loss and verify a cleanup task is scheduled
vpnSnapShot.nwCb.onLost(TEST_NETWORK);
- verify(mExecutor).schedule(any(Runnable.class), anyLong(), any());
+ verify(mExecutor, atLeastOnce()).schedule(any(Runnable.class), anyLong(), any());
// Mock new network comes up and the cleanup task is cancelled
vpnSnapShot.nwCb.onAvailable(TEST_NETWORK_2);
- verify(mScheduledFuture).cancel(anyBoolean());
+ verify(mIkeSessionWrapper, never()).setNetwork(any(), anyInt(), anyInt(), anyInt());
+ vpnSnapShot.nwCb.onCapabilitiesChanged(TEST_NETWORK_2,
+ new NetworkCapabilities.Builder().build());
// Verify MOBIKE is triggered
- verify(mIkeSessionWrapper).setNetwork(eq(TEST_NETWORK_2),
+ verify(mIkeSessionWrapper, timeout(TEST_TIMEOUT_MS)).setNetwork(eq(TEST_NETWORK_2),
eq(ESP_IP_VERSION_AUTO) /* ipVersion */,
eq(ESP_ENCAP_TYPE_AUTO) /* encapType */,
eq(DEFAULT_UDP_PORT_4500_NAT_TIMEOUT_SEC_INT) /* keepaliveDelay */);
@@ -2146,9 +2604,13 @@
// Mock network switch
vpnSnapShot.nwCb.onLost(TEST_NETWORK);
vpnSnapShot.nwCb.onAvailable(TEST_NETWORK_2);
+ // The old IKE Session will not be killed until receiving network capabilities change.
+ verify(mIkeSessionWrapper, never()).kill();
+ vpnSnapShot.nwCb.onCapabilitiesChanged(
+ TEST_NETWORK_2, new NetworkCapabilities.Builder().build());
// Verify the old IKE Session is killed
- verify(mIkeSessionWrapper).kill();
+ verify(mIkeSessionWrapper, timeout(TEST_TIMEOUT_MS)).kill();
// Capture callbacks of the new IKE Session
final Pair<IkeSessionCallback, ChildSessionCallback> cbPair =
@@ -2176,23 +2638,95 @@
vpnSnapShot.vpn.mVpnRunner.exitVpnRunner();
}
+ private String getDump(@NonNull final Vpn vpn) {
+ final StringWriter sw = new StringWriter();
+ final IndentingPrintWriter writer = new IndentingPrintWriter(sw, "");
+ vpn.dump(writer);
+ writer.flush();
+ return sw.toString();
+ }
+
+ private int countMatches(@NonNull final Pattern regexp, @NonNull final String string) {
+ final Matcher m = regexp.matcher(string);
+ int i = 0;
+ while (m.find()) ++i;
+ return i;
+ }
+
+ @Test
+ public void testNCEventChanges() throws Exception {
+ final NetworkCapabilities.Builder ncBuilder = new NetworkCapabilities.Builder()
+ .addTransportType(TRANSPORT_CELLULAR)
+ .addCapability(NET_CAPABILITY_INTERNET)
+ .addCapability(NET_CAPABILITY_NOT_RESTRICTED)
+ .setLinkDownstreamBandwidthKbps(1000)
+ .setLinkUpstreamBandwidthKbps(500);
+
+ final Ikev2VpnProfile ikeProfile =
+ new Ikev2VpnProfile.Builder(TEST_VPN_SERVER, TEST_VPN_IDENTITY)
+ .setAuthPsk(TEST_VPN_PSK)
+ .setBypassable(true /* isBypassable */)
+ .setAutomaticNattKeepaliveTimerEnabled(true)
+ .setAutomaticIpVersionSelectionEnabled(true)
+ .build();
+
+ final PlatformVpnSnapshot vpnSnapShot =
+ verifySetupPlatformVpn(ikeProfile.toVpnProfile(),
+ createIkeConfig(createIkeConnectInfo(), true /* isMobikeEnabled */),
+ ncBuilder.build(), false /* mtuSupportsIpv6 */,
+ true /* areLongLivedTcpConnectionsExpensive */);
+
+ // Calls to onCapabilitiesChanged will be thrown to the executor for execution ; by
+ // default this will incur a 10ms delay before it's executed, messing with the timing
+ // of the log and having the checks for counts in equals() below flake.
+ mExecutor.executeDirect = true;
+
+ // First nc changed triggered by verifySetupPlatformVpn
+ final Pattern pattern = Pattern.compile("Cap changed from", Pattern.MULTILINE);
+ final String stage1 = getDump(vpnSnapShot.vpn);
+ assertEquals(1, countMatches(pattern, stage1));
+
+ vpnSnapShot.nwCb.onCapabilitiesChanged(TEST_NETWORK, ncBuilder.build());
+ final String stage2 = getDump(vpnSnapShot.vpn);
+ // Was the same caps, there should still be only 1 match
+ assertEquals(1, countMatches(pattern, stage2));
+
+ ncBuilder.setLinkDownstreamBandwidthKbps(1200)
+ .setLinkUpstreamBandwidthKbps(300);
+ vpnSnapShot.nwCb.onCapabilitiesChanged(TEST_NETWORK, ncBuilder.build());
+ final String stage3 = getDump(vpnSnapShot.vpn);
+ // Was not an important change, should not be logged, still only 1 match
+ assertEquals(1, countMatches(pattern, stage3));
+
+ ncBuilder.addCapability(NET_CAPABILITY_TEMPORARILY_NOT_METERED);
+ vpnSnapShot.nwCb.onCapabilitiesChanged(TEST_NETWORK, ncBuilder.build());
+ final String stage4 = getDump(vpnSnapShot.vpn);
+ // Change to caps is important, should cause a new match
+ assertEquals(2, countMatches(pattern, stage4));
+
+ ncBuilder.removeCapability(NET_CAPABILITY_TEMPORARILY_NOT_METERED);
+ ncBuilder.setLinkDownstreamBandwidthKbps(600);
+ vpnSnapShot.nwCb.onCapabilitiesChanged(TEST_NETWORK, ncBuilder.build());
+ final String stage5 = getDump(vpnSnapShot.vpn);
+ // Change to caps is important, should cause a new match even with the unimportant change
+ assertEquals(3, countMatches(pattern, stage5));
+ }
+ // TODO : beef up event logs tests
+
private void verifyHandlingNetworkLoss(PlatformVpnSnapshot vpnSnapShot) throws Exception {
// Forget the #sendLinkProperties during first setup.
reset(mMockNetworkAgent);
- final ArgumentCaptor<Runnable> runnableCaptor =
- ArgumentCaptor.forClass(Runnable.class);
-
// Mock network loss
vpnSnapShot.nwCb.onLost(TEST_NETWORK);
// Mock the grace period expires
- verify(mExecutor).schedule(runnableCaptor.capture(), anyLong(), any());
- runnableCaptor.getValue().run();
+ verify(mExecutor, atLeastOnce()).schedule(any(Runnable.class), anyLong(), any());
final ArgumentCaptor<LinkProperties> lpCaptor =
ArgumentCaptor.forClass(LinkProperties.class);
- verify(mMockNetworkAgent).doSendLinkProperties(lpCaptor.capture());
+ verify(mMockNetworkAgent, timeout(TEST_TIMEOUT_MS))
+ .doSendLinkProperties(lpCaptor.capture());
final LinkProperties lp = lpCaptor.getValue();
assertNull(lp.getInterfaceName());
@@ -2290,9 +2824,7 @@
// variables(timer counter and boolean) was reset.
((Vpn.IkeV2VpnRunner) vpnSnapShot.vpn.mVpnRunner).onValidationStatus(
NetworkAgent.VALIDATION_STATUS_NOT_VALID);
- final ArgumentCaptor<Runnable> runnableCaptor = ArgumentCaptor.forClass(Runnable.class);
- verify(mExecutor).schedule(runnableCaptor.capture(), anyLong(), any());
- runnableCaptor.getValue().run();
+ verify(mExecutor, atLeastOnce()).schedule(any(Runnable.class), anyLong(), any());
verify(mIkev2SessionCreator, never()).createIkeSession(
any(), any(), any(), any(), any(), any());
}
@@ -2318,17 +2850,16 @@
NetworkAgent.VALIDATION_STATUS_NOT_VALID);
// Verify reset is scheduled and run.
- final ArgumentCaptor<Runnable> runnableCaptor = ArgumentCaptor.forClass(Runnable.class);
- verify(mExecutor).schedule(runnableCaptor.capture(), anyLong(), any());
+ verify(mExecutor, atLeastOnce()).schedule(any(Runnable.class), anyLong(), any());
// Another invalid status reported should not trigger other scheduled recovery.
reset(mExecutor);
((Vpn.IkeV2VpnRunner) vpnSnapShot.vpn.mVpnRunner).onValidationStatus(
NetworkAgent.VALIDATION_STATUS_NOT_VALID);
- verify(mExecutor, never()).schedule(runnableCaptor.capture(), anyLong(), any());
+ verify(mExecutor, never()).schedule(any(Runnable.class), anyLong(), any());
- runnableCaptor.getValue().run();
- verify(mIkev2SessionCreator).createIkeSession(any(), any(), any(), any(), any(), any());
+ verify(mIkev2SessionCreator, timeout(TEST_TIMEOUT_MS))
+ .createIkeSession(any(), any(), any(), any(), any(), any());
}
@Test
@@ -2600,15 +3131,23 @@
}
@Override
- public long getNextRetryDelaySeconds(int retryCount) {
+ public long getNextRetryDelayMs(int retryCount) {
// Simply return retryCount as the delay seconds for retrying.
- return retryCount;
+ return retryCount * 1000;
}
@Override
public ScheduledThreadPoolExecutor newScheduledThreadPoolExecutor() {
return mExecutor;
}
+
+ public boolean mIgnoreCallingUidChecks = true;
+ @Override
+ public void verifyCallingUidAndPackage(Context context, String packageName, int userId) {
+ if (!mIgnoreCallingUidChecks) {
+ super.verifyCallingUidAndPackage(context, packageName, userId);
+ }
+ }
}
/**
@@ -2671,30 +3210,4 @@
} catch (Exception e) {
}
}
-
- private void setMockedNetworks(final Map<Network, NetworkCapabilities> networks) {
- doAnswer(invocation -> {
- final Network network = (Network) invocation.getArguments()[0];
- return networks.get(network);
- }).when(mConnectivityManager).getNetworkCapabilities(any());
- }
-
- // Need multiple copies of this, but Java's Stream objects can't be reused or
- // duplicated.
- private Stream<String> publicIpV4Routes() {
- return Stream.of(
- "0.0.0.0/5", "8.0.0.0/7", "11.0.0.0/8", "12.0.0.0/6", "16.0.0.0/4",
- "32.0.0.0/3", "64.0.0.0/2", "128.0.0.0/3", "160.0.0.0/5", "168.0.0.0/6",
- "172.0.0.0/12", "172.32.0.0/11", "172.64.0.0/10", "172.128.0.0/9",
- "173.0.0.0/8", "174.0.0.0/7", "176.0.0.0/4", "192.0.0.0/9", "192.128.0.0/11",
- "192.160.0.0/13", "192.169.0.0/16", "192.170.0.0/15", "192.172.0.0/14",
- "192.176.0.0/12", "192.192.0.0/10", "193.0.0.0/8", "194.0.0.0/7",
- "196.0.0.0/6", "200.0.0.0/5", "208.0.0.0/4");
- }
-
- private Stream<String> publicIpV6Routes() {
- return Stream.of(
- "::/1", "8000::/2", "c000::/3", "e000::/4", "f000::/5", "f800::/6",
- "fe00::/8", "2605:ef80:e:af1d::/64");
- }
}
diff --git a/tests/unit/java/com/android/server/connectivity/mdns/MdnsAdvertiserTest.kt b/tests/unit/java/com/android/server/connectivity/mdns/MdnsAdvertiserTest.kt
index 375c150..6a0334f 100644
--- a/tests/unit/java/com/android/server/connectivity/mdns/MdnsAdvertiserTest.kt
+++ b/tests/unit/java/com/android/server/connectivity/mdns/MdnsAdvertiserTest.kt
@@ -23,11 +23,13 @@
import android.os.Build
import android.os.Handler
import android.os.HandlerThread
+import com.android.net.module.util.SharedLog
import com.android.server.connectivity.mdns.MdnsAdvertiser.AdvertiserCallback
import com.android.server.connectivity.mdns.MdnsSocketProvider.SocketCallback
import com.android.testutils.DevSdkIgnoreRule.IgnoreUpTo
import com.android.testutils.DevSdkIgnoreRunner
import com.android.testutils.waitForIdle
+import java.net.NetworkInterface
import java.util.Objects
import org.junit.After
import org.junit.Before
@@ -47,25 +49,51 @@
private const val SERVICE_ID_1 = 1
private const val SERVICE_ID_2 = 2
+private const val LONG_SERVICE_ID_1 = 3
+private const val LONG_SERVICE_ID_2 = 4
+private const val CASE_INSENSITIVE_TEST_SERVICE_ID = 5
private const val TIMEOUT_MS = 10_000L
private val TEST_ADDR = parseNumericAddress("2001:db8::123")
private val TEST_LINKADDR = LinkAddress(TEST_ADDR, 64 /* prefixLength */)
private val TEST_NETWORK_1 = mock(Network::class.java)
-private val TEST_NETWORK_2 = mock(Network::class.java)
+private val TEST_SOCKETKEY_1 = SocketKey(1001 /* interfaceIndex */)
+private val TEST_SOCKETKEY_2 = SocketKey(1002 /* interfaceIndex */)
private val TEST_HOSTNAME = arrayOf("Android_test", "local")
+private const val TEST_SUBTYPE = "_subtype"
private val SERVICE_1 = NsdServiceInfo("TestServiceName", "_advertisertest._tcp").apply {
port = 12345
- host = TEST_ADDR
+ hostAddresses = listOf(TEST_ADDR)
network = TEST_NETWORK_1
}
+private val LONG_SERVICE_1 =
+ NsdServiceInfo("a".repeat(48) + "TestServiceName", "_longadvertisertest._tcp").apply {
+ port = 12345
+ hostAddresses = listOf(TEST_ADDR)
+ network = TEST_NETWORK_1
+ }
+
private val ALL_NETWORKS_SERVICE = NsdServiceInfo("TestServiceName", "_advertisertest._tcp").apply {
port = 12345
- host = TEST_ADDR
+ hostAddresses = listOf(TEST_ADDR)
network = null
}
+private val ALL_NETWORKS_SERVICE_2 =
+ NsdServiceInfo("TESTSERVICENAME", "_ADVERTISERTEST._tcp").apply {
+ port = 12345
+ hostAddresses = listOf(TEST_ADDR)
+ network = null
+ }
+
+private val LONG_ALL_NETWORKS_SERVICE =
+ NsdServiceInfo("a".repeat(48) + "TestServiceName", "_longadvertisertest._tcp").apply {
+ port = 12345
+ hostAddresses = listOf(TEST_ADDR)
+ network = null
+ }
+
@RunWith(DevSdkIgnoreRunner::class)
@IgnoreUpTo(Build.VERSION_CODES.S_V2)
class MdnsAdvertiserTest {
@@ -73,6 +101,7 @@
private val handler by lazy { Handler(thread.looper) }
private val socketProvider = mock(MdnsSocketProvider::class.java)
private val cb = mock(AdvertiserCallback::class.java)
+ private val sharedlog = mock(SharedLog::class.java)
private val mockSocket1 = mock(MdnsInterfaceSocket::class.java)
private val mockSocket2 = mock(MdnsInterfaceSocket::class.java)
@@ -85,30 +114,39 @@
thread.start()
doReturn(TEST_HOSTNAME).`when`(mockDeps).generateHostname()
doReturn(mockInterfaceAdvertiser1).`when`(mockDeps).makeAdvertiser(eq(mockSocket1),
- any(), any(), any(), any(), eq(TEST_HOSTNAME)
+ any(), any(), any(), any(), eq(TEST_HOSTNAME), any()
)
doReturn(mockInterfaceAdvertiser2).`when`(mockDeps).makeAdvertiser(eq(mockSocket2),
- any(), any(), any(), any(), eq(TEST_HOSTNAME)
+ any(), any(), any(), any(), eq(TEST_HOSTNAME), any()
)
doReturn(true).`when`(mockInterfaceAdvertiser1).isProbing(anyInt())
doReturn(true).`when`(mockInterfaceAdvertiser2).isProbing(anyInt())
+ doReturn(createEmptyNetworkInterface()).`when`(mockSocket1).getInterface()
+ doReturn(createEmptyNetworkInterface()).`when`(mockSocket2).getInterface()
}
@After
fun tearDown() {
thread.quitSafely()
+ thread.join()
+ }
+
+ private fun createEmptyNetworkInterface(): NetworkInterface {
+ val constructor = NetworkInterface::class.java.getDeclaredConstructor()
+ constructor.isAccessible = true
+ return constructor.newInstance()
}
@Test
fun testAddService_OneNetwork() {
- val advertiser = MdnsAdvertiser(thread.looper, socketProvider, cb, mockDeps)
- postSync { advertiser.addService(SERVICE_ID_1, SERVICE_1) }
+ val advertiser = MdnsAdvertiser(thread.looper, socketProvider, cb, mockDeps, sharedlog)
+ postSync { advertiser.addService(SERVICE_ID_1, SERVICE_1, null /* subtype */) }
val socketCbCaptor = ArgumentCaptor.forClass(SocketCallback::class.java)
verify(socketProvider).requestSocket(eq(TEST_NETWORK_1), socketCbCaptor.capture())
val socketCb = socketCbCaptor.value
- postSync { socketCb.onSocketCreated(TEST_NETWORK_1, mockSocket1, listOf(TEST_LINKADDR)) }
+ postSync { socketCb.onSocketCreated(TEST_SOCKETKEY_1, mockSocket1, listOf(TEST_LINKADDR)) }
val intAdvCbCaptor = ArgumentCaptor.forClass(MdnsInterfaceAdvertiser.Callback::class.java)
verify(mockDeps).makeAdvertiser(
@@ -117,7 +155,8 @@
eq(thread.looper),
any(),
intAdvCbCaptor.capture(),
- eq(TEST_HOSTNAME)
+ eq(TEST_HOSTNAME),
+ any()
)
doReturn(false).`when`(mockInterfaceAdvertiser1).isProbing(SERVICE_ID_1)
@@ -125,31 +164,35 @@
mockInterfaceAdvertiser1, SERVICE_ID_1) }
verify(cb).onRegisterServiceSucceeded(eq(SERVICE_ID_1), argThat { it.matches(SERVICE_1) })
- postSync { socketCb.onInterfaceDestroyed(TEST_NETWORK_1, mockSocket1) }
+ postSync { socketCb.onInterfaceDestroyed(TEST_SOCKETKEY_1, mockSocket1) }
verify(mockInterfaceAdvertiser1).destroyNow()
}
@Test
fun testAddService_AllNetworks() {
- val advertiser = MdnsAdvertiser(thread.looper, socketProvider, cb, mockDeps)
- postSync { advertiser.addService(SERVICE_ID_1, ALL_NETWORKS_SERVICE) }
+ val advertiser = MdnsAdvertiser(thread.looper, socketProvider, cb, mockDeps, sharedlog)
+ postSync { advertiser.addService(SERVICE_ID_1, ALL_NETWORKS_SERVICE, TEST_SUBTYPE) }
val socketCbCaptor = ArgumentCaptor.forClass(SocketCallback::class.java)
verify(socketProvider).requestSocket(eq(ALL_NETWORKS_SERVICE.network),
socketCbCaptor.capture())
val socketCb = socketCbCaptor.value
- postSync { socketCb.onSocketCreated(TEST_NETWORK_1, mockSocket1, listOf(TEST_LINKADDR)) }
- postSync { socketCb.onSocketCreated(TEST_NETWORK_2, mockSocket2, listOf(TEST_LINKADDR)) }
+ postSync { socketCb.onSocketCreated(TEST_SOCKETKEY_1, mockSocket1, listOf(TEST_LINKADDR)) }
+ postSync { socketCb.onSocketCreated(TEST_SOCKETKEY_2, mockSocket2, listOf(TEST_LINKADDR)) }
val intAdvCbCaptor1 = ArgumentCaptor.forClass(MdnsInterfaceAdvertiser.Callback::class.java)
val intAdvCbCaptor2 = ArgumentCaptor.forClass(MdnsInterfaceAdvertiser.Callback::class.java)
verify(mockDeps).makeAdvertiser(eq(mockSocket1), eq(listOf(TEST_LINKADDR)),
- eq(thread.looper), any(), intAdvCbCaptor1.capture(), eq(TEST_HOSTNAME)
+ eq(thread.looper), any(), intAdvCbCaptor1.capture(), eq(TEST_HOSTNAME), any()
)
verify(mockDeps).makeAdvertiser(eq(mockSocket2), eq(listOf(TEST_LINKADDR)),
- eq(thread.looper), any(), intAdvCbCaptor2.capture(), eq(TEST_HOSTNAME)
+ eq(thread.looper), any(), intAdvCbCaptor2.capture(), eq(TEST_HOSTNAME), any()
)
+ verify(mockInterfaceAdvertiser1).addService(
+ anyInt(), eq(ALL_NETWORKS_SERVICE), eq(TEST_SUBTYPE))
+ verify(mockInterfaceAdvertiser2).addService(
+ anyInt(), eq(ALL_NETWORKS_SERVICE), eq(TEST_SUBTYPE))
doReturn(false).`when`(mockInterfaceAdvertiser1).isProbing(SERVICE_ID_1)
postSync { intAdvCbCaptor1.value.onRegisterServiceSucceeded(
@@ -177,40 +220,69 @@
@Test
fun testAddService_Conflicts() {
- val advertiser = MdnsAdvertiser(thread.looper, socketProvider, cb, mockDeps)
- postSync { advertiser.addService(SERVICE_ID_1, SERVICE_1) }
+ val advertiser = MdnsAdvertiser(thread.looper, socketProvider, cb, mockDeps, sharedlog)
+ postSync { advertiser.addService(SERVICE_ID_1, SERVICE_1, null /* subtype */) }
val oneNetSocketCbCaptor = ArgumentCaptor.forClass(SocketCallback::class.java)
verify(socketProvider).requestSocket(eq(TEST_NETWORK_1), oneNetSocketCbCaptor.capture())
val oneNetSocketCb = oneNetSocketCbCaptor.value
// Register a service with the same name on all networks (name conflict)
- postSync { advertiser.addService(SERVICE_ID_2, ALL_NETWORKS_SERVICE) }
+ postSync { advertiser.addService(SERVICE_ID_2, ALL_NETWORKS_SERVICE, null /* subtype */) }
val allNetSocketCbCaptor = ArgumentCaptor.forClass(SocketCallback::class.java)
verify(socketProvider).requestSocket(eq(null), allNetSocketCbCaptor.capture())
val allNetSocketCb = allNetSocketCbCaptor.value
+ postSync { advertiser.addService(LONG_SERVICE_ID_1, LONG_SERVICE_1, null /* subtype */) }
+ postSync { advertiser.addService(LONG_SERVICE_ID_2, LONG_ALL_NETWORKS_SERVICE,
+ null /* subtype */) }
+
+ postSync { advertiser.addService(CASE_INSENSITIVE_TEST_SERVICE_ID, ALL_NETWORKS_SERVICE_2,
+ null /* subtype */) }
+
// Callbacks for matching network and all networks both get the socket
postSync {
- oneNetSocketCb.onSocketCreated(TEST_NETWORK_1, mockSocket1, listOf(TEST_LINKADDR))
- allNetSocketCb.onSocketCreated(TEST_NETWORK_1, mockSocket1, listOf(TEST_LINKADDR))
+ oneNetSocketCb.onSocketCreated(TEST_SOCKETKEY_1, mockSocket1, listOf(TEST_LINKADDR))
+ allNetSocketCb.onSocketCreated(TEST_SOCKETKEY_1, mockSocket1, listOf(TEST_LINKADDR))
}
val expectedRenamed = NsdServiceInfo(
"${ALL_NETWORKS_SERVICE.serviceName} (2)", ALL_NETWORKS_SERVICE.serviceType).apply {
port = ALL_NETWORKS_SERVICE.port
- host = ALL_NETWORKS_SERVICE.host
+ hostAddresses = ALL_NETWORKS_SERVICE.hostAddresses
network = ALL_NETWORKS_SERVICE.network
}
+ val expectedLongRenamed = NsdServiceInfo(
+ "${LONG_ALL_NETWORKS_SERVICE.serviceName.dropLast(4)} (2)",
+ LONG_ALL_NETWORKS_SERVICE.serviceType).apply {
+ port = LONG_ALL_NETWORKS_SERVICE.port
+ hostAddresses = LONG_ALL_NETWORKS_SERVICE.hostAddresses
+ network = LONG_ALL_NETWORKS_SERVICE.network
+ }
+
+ val expectedCaseInsensitiveRenamed = NsdServiceInfo(
+ "${ALL_NETWORKS_SERVICE_2.serviceName} (3)", ALL_NETWORKS_SERVICE_2.serviceType
+ ).apply {
+ port = ALL_NETWORKS_SERVICE_2.port
+ hostAddresses = ALL_NETWORKS_SERVICE_2.hostAddresses
+ network = ALL_NETWORKS_SERVICE_2.network
+ }
+
val intAdvCbCaptor = ArgumentCaptor.forClass(MdnsInterfaceAdvertiser.Callback::class.java)
verify(mockDeps).makeAdvertiser(eq(mockSocket1), eq(listOf(TEST_LINKADDR)),
- eq(thread.looper), any(), intAdvCbCaptor.capture(), eq(TEST_HOSTNAME)
+ eq(thread.looper), any(), intAdvCbCaptor.capture(), eq(TEST_HOSTNAME), any()
)
verify(mockInterfaceAdvertiser1).addService(eq(SERVICE_ID_1),
- argThat { it.matches(SERVICE_1) })
+ argThat { it.matches(SERVICE_1) }, eq(null))
verify(mockInterfaceAdvertiser1).addService(eq(SERVICE_ID_2),
- argThat { it.matches(expectedRenamed) })
+ argThat { it.matches(expectedRenamed) }, eq(null))
+ verify(mockInterfaceAdvertiser1).addService(eq(LONG_SERVICE_ID_1),
+ argThat { it.matches(LONG_SERVICE_1) }, eq(null))
+ verify(mockInterfaceAdvertiser1).addService(eq(LONG_SERVICE_ID_2),
+ argThat { it.matches(expectedLongRenamed) }, eq(null))
+ verify(mockInterfaceAdvertiser1).addService(eq(CASE_INSENSITIVE_TEST_SERVICE_ID),
+ argThat { it.matches(expectedCaseInsensitiveRenamed) }, eq(null))
doReturn(false).`when`(mockInterfaceAdvertiser1).isProbing(SERVICE_ID_1)
postSync { intAdvCbCaptor.value.onRegisterServiceSucceeded(
@@ -223,8 +295,8 @@
verify(cb).onRegisterServiceSucceeded(eq(SERVICE_ID_2),
argThat { it.matches(expectedRenamed) })
- postSync { oneNetSocketCb.onInterfaceDestroyed(TEST_NETWORK_1, mockSocket1) }
- postSync { allNetSocketCb.onInterfaceDestroyed(TEST_NETWORK_1, mockSocket1) }
+ postSync { oneNetSocketCb.onInterfaceDestroyed(TEST_SOCKETKEY_1, mockSocket1) }
+ postSync { allNetSocketCb.onInterfaceDestroyed(TEST_SOCKETKEY_1, mockSocket1) }
// destroyNow can be called multiple times
verify(mockInterfaceAdvertiser1, atLeastOnce()).destroyNow()
@@ -232,9 +304,9 @@
@Test
fun testRemoveService_whenAllServiceRemoved_thenUpdateHostName() {
- val advertiser = MdnsAdvertiser(thread.looper, socketProvider, cb, mockDeps)
+ val advertiser = MdnsAdvertiser(thread.looper, socketProvider, cb, mockDeps, sharedlog)
verify(mockDeps, times(1)).generateHostname()
- postSync { advertiser.addService(SERVICE_ID_1, SERVICE_1) }
+ postSync { advertiser.addService(SERVICE_ID_1, SERVICE_1, null /* subtype */) }
postSync { advertiser.removeService(SERVICE_ID_1) }
verify(mockDeps, times(2)).generateHostname()
}
@@ -250,7 +322,7 @@
return Objects.equals(serviceName, other.serviceName) &&
Objects.equals(serviceType, other.serviceType) &&
Objects.equals(attributes, other.attributes) &&
- Objects.equals(host, other.host) &&
+ Objects.equals(hostAddresses, other.hostAddresses) &&
port == other.port &&
Objects.equals(network, other.network)
}
diff --git a/tests/unit/java/com/android/server/connectivity/mdns/MdnsAnnouncerTest.kt b/tests/unit/java/com/android/server/connectivity/mdns/MdnsAnnouncerTest.kt
index 6c3f729..7c6cb3e 100644
--- a/tests/unit/java/com/android/server/connectivity/mdns/MdnsAnnouncerTest.kt
+++ b/tests/unit/java/com/android/server/connectivity/mdns/MdnsAnnouncerTest.kt
@@ -63,6 +63,7 @@
@After
fun tearDown() {
thread.quitSafely()
+ thread.join()
}
private class TestAnnouncementInfo(
diff --git a/tests/unit/java/com/android/server/connectivity/mdns/MdnsDiscoveryManagerTests.java b/tests/unit/java/com/android/server/connectivity/mdns/MdnsDiscoveryManagerTests.java
index e6b8326..1a4ae5d 100644
--- a/tests/unit/java/com/android/server/connectivity/mdns/MdnsDiscoveryManagerTests.java
+++ b/tests/unit/java/com/android/server/connectivity/mdns/MdnsDiscoveryManagerTests.java
@@ -18,21 +18,34 @@
import static com.android.testutils.DevSdkIgnoreRuleKt.SC_V2;
-import static org.mockito.Mockito.mock;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.eq;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import android.annotation.NonNull;
import android.net.Network;
+import android.os.Handler;
+import android.os.HandlerThread;
import android.text.TextUtils;
+import android.util.Pair;
+import com.android.net.module.util.SharedLog;
+import com.android.server.connectivity.mdns.MdnsSocketClientBase.SocketCreationCallback;
import com.android.testutils.DevSdkIgnoreRule;
import com.android.testutils.DevSdkIgnoreRunner;
+import com.android.testutils.HandlerUtils;
+import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
import org.mockito.Mock;
+import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
import java.io.IOException;
@@ -45,91 +58,277 @@
@RunWith(DevSdkIgnoreRunner.class)
@DevSdkIgnoreRule.IgnoreUpTo(SC_V2)
public class MdnsDiscoveryManagerTests {
-
+ private static final long DEFAULT_TIMEOUT = 2000L;
private static final String SERVICE_TYPE_1 = "_googlecast._tcp.local";
private static final String SERVICE_TYPE_2 = "_test._tcp.local";
-
+ private static final Network NETWORK_1 = Mockito.mock(Network.class);
+ private static final Network NETWORK_2 = Mockito.mock(Network.class);
+ private static final SocketKey SOCKET_KEY_NULL_NETWORK =
+ new SocketKey(null /* network */, 999 /* interfaceIndex */);
+ private static final SocketKey SOCKET_KEY_NETWORK_1 =
+ new SocketKey(NETWORK_1, 998 /* interfaceIndex */);
+ private static final SocketKey SOCKET_KEY_NETWORK_2 =
+ new SocketKey(NETWORK_2, 997 /* interfaceIndex */);
+ private static final Pair<String, SocketKey> PER_SOCKET_SERVICE_TYPE_1_NULL_NETWORK =
+ Pair.create(SERVICE_TYPE_1, SOCKET_KEY_NULL_NETWORK);
+ private static final Pair<String, SocketKey> PER_SOCKET_SERVICE_TYPE_2_NULL_NETWORK =
+ Pair.create(SERVICE_TYPE_2, SOCKET_KEY_NULL_NETWORK);
+ private static final Pair<String, SocketKey> PER_SOCKET_SERVICE_TYPE_1_NETWORK_1 =
+ Pair.create(SERVICE_TYPE_1, SOCKET_KEY_NETWORK_1);
+ private static final Pair<String, SocketKey> PER_SOCKET_SERVICE_TYPE_2_NETWORK_1 =
+ Pair.create(SERVICE_TYPE_2, SOCKET_KEY_NETWORK_1);
+ private static final Pair<String, SocketKey> PER_SOCKET_SERVICE_TYPE_2_NETWORK_2 =
+ Pair.create(SERVICE_TYPE_2, SOCKET_KEY_NETWORK_2);
@Mock private ExecutorProvider executorProvider;
@Mock private MdnsSocketClientBase socketClient;
- @Mock private MdnsServiceTypeClient mockServiceTypeClientOne;
- @Mock private MdnsServiceTypeClient mockServiceTypeClientTwo;
+ @Mock private MdnsServiceTypeClient mockServiceTypeClientType1NullNetwork;
+ @Mock private MdnsServiceTypeClient mockServiceTypeClientType1Network1;
+ @Mock private MdnsServiceTypeClient mockServiceTypeClientType2NullNetwork;
+ @Mock private MdnsServiceTypeClient mockServiceTypeClientType2Network1;
+ @Mock private MdnsServiceTypeClient mockServiceTypeClientType2Network2;
@Mock MdnsServiceBrowserListener mockListenerOne;
@Mock MdnsServiceBrowserListener mockListenerTwo;
+ @Mock SharedLog sharedLog;
private MdnsDiscoveryManager discoveryManager;
+ private HandlerThread thread;
+ private Handler handler;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
- when(mockServiceTypeClientOne.getServiceTypeLabels())
- .thenReturn(TextUtils.split(SERVICE_TYPE_1, "\\."));
- when(mockServiceTypeClientTwo.getServiceTypeLabels())
- .thenReturn(TextUtils.split(SERVICE_TYPE_2, "\\."));
-
- discoveryManager = new MdnsDiscoveryManager(executorProvider, socketClient) {
+ thread = new HandlerThread("MdnsDiscoveryManagerTests");
+ thread.start();
+ handler = new Handler(thread.getLooper());
+ doReturn(thread.getLooper()).when(socketClient).getLooper();
+ doReturn(true).when(socketClient).supportsRequestingSpecificNetworks();
+ discoveryManager = new MdnsDiscoveryManager(executorProvider, socketClient,
+ sharedLog) {
@Override
- MdnsServiceTypeClient createServiceTypeClient(@NonNull String serviceType) {
- if (serviceType.equals(SERVICE_TYPE_1)) {
- return mockServiceTypeClientOne;
- } else if (serviceType.equals(SERVICE_TYPE_2)) {
- return mockServiceTypeClientTwo;
+ MdnsServiceTypeClient createServiceTypeClient(@NonNull String serviceType,
+ @NonNull SocketKey socketKey) {
+ final Pair<String, SocketKey> perSocketServiceType =
+ Pair.create(serviceType, socketKey);
+ if (perSocketServiceType.equals(PER_SOCKET_SERVICE_TYPE_1_NULL_NETWORK)) {
+ return mockServiceTypeClientType1NullNetwork;
+ } else if (perSocketServiceType.equals(
+ PER_SOCKET_SERVICE_TYPE_1_NETWORK_1)) {
+ return mockServiceTypeClientType1Network1;
+ } else if (perSocketServiceType.equals(
+ PER_SOCKET_SERVICE_TYPE_2_NULL_NETWORK)) {
+ return mockServiceTypeClientType2NullNetwork;
+ } else if (perSocketServiceType.equals(
+ PER_SOCKET_SERVICE_TYPE_2_NETWORK_1)) {
+ return mockServiceTypeClientType2Network1;
+ } else if (perSocketServiceType.equals(
+ PER_SOCKET_SERVICE_TYPE_2_NETWORK_2)) {
+ return mockServiceTypeClientType2Network2;
}
return null;
}
};
}
+ @After
+ public void tearDown() {
+ if (thread != null) {
+ thread.quitSafely();
+ }
+ }
+
+ private void runOnHandler(Runnable r) {
+ handler.post(r);
+ HandlerUtils.waitForIdle(handler, DEFAULT_TIMEOUT);
+ }
+
+ private SocketCreationCallback expectSocketCreationCallback(String serviceType,
+ MdnsServiceBrowserListener listener, MdnsSearchOptions options) throws IOException {
+ final ArgumentCaptor<SocketCreationCallback> callbackCaptor =
+ ArgumentCaptor.forClass(SocketCreationCallback.class);
+ runOnHandler(() -> discoveryManager.registerListener(serviceType, listener, options));
+ verify(socketClient).startDiscovery();
+ verify(socketClient).notifyNetworkRequested(
+ eq(listener), eq(options.getNetwork()), callbackCaptor.capture());
+ return callbackCaptor.getValue();
+ }
+
@Test
public void registerListener_unregisterListener() throws IOException {
- discoveryManager.registerListener(
- SERVICE_TYPE_1, mockListenerOne, MdnsSearchOptions.getDefaultOptions());
- verify(socketClient).startDiscovery();
- verify(mockServiceTypeClientOne)
- .startSendAndReceive(mockListenerOne, MdnsSearchOptions.getDefaultOptions());
+ final MdnsSearchOptions options =
+ MdnsSearchOptions.newBuilder().setNetwork(null /* network */).build();
+ final SocketCreationCallback callback = expectSocketCreationCallback(
+ SERVICE_TYPE_1, mockListenerOne, options);
+ runOnHandler(() -> callback.onSocketCreated(SOCKET_KEY_NULL_NETWORK));
+ verify(mockServiceTypeClientType1NullNetwork).startSendAndReceive(mockListenerOne, options);
- when(mockServiceTypeClientOne.stopSendAndReceive(mockListenerOne)).thenReturn(true);
- discoveryManager.unregisterListener(SERVICE_TYPE_1, mockListenerOne);
- verify(mockServiceTypeClientOne).stopSendAndReceive(mockListenerOne);
+ when(mockServiceTypeClientType1NullNetwork.stopSendAndReceive(mockListenerOne))
+ .thenReturn(true);
+ runOnHandler(() -> discoveryManager.unregisterListener(SERVICE_TYPE_1, mockListenerOne));
+ verify(mockServiceTypeClientType1NullNetwork).stopSendAndReceive(mockListenerOne);
verify(socketClient).stopDiscovery();
}
@Test
public void registerMultipleListeners() throws IOException {
- discoveryManager.registerListener(
- SERVICE_TYPE_1, mockListenerOne, MdnsSearchOptions.getDefaultOptions());
- verify(socketClient).startDiscovery();
- verify(mockServiceTypeClientOne)
- .startSendAndReceive(mockListenerOne, MdnsSearchOptions.getDefaultOptions());
+ final MdnsSearchOptions options =
+ MdnsSearchOptions.newBuilder().setNetwork(null /* network */).build();
+ final SocketCreationCallback callback = expectSocketCreationCallback(
+ SERVICE_TYPE_1, mockListenerOne, options);
+ runOnHandler(() -> callback.onSocketCreated(SOCKET_KEY_NULL_NETWORK));
+ verify(mockServiceTypeClientType1NullNetwork).startSendAndReceive(mockListenerOne, options);
+ runOnHandler(() -> callback.onSocketCreated(SOCKET_KEY_NETWORK_1));
+ verify(mockServiceTypeClientType1Network1).startSendAndReceive(mockListenerOne, options);
- discoveryManager.registerListener(
- SERVICE_TYPE_2, mockListenerTwo, MdnsSearchOptions.getDefaultOptions());
- verify(mockServiceTypeClientTwo)
- .startSendAndReceive(mockListenerTwo, MdnsSearchOptions.getDefaultOptions());
+ final SocketCreationCallback callback2 = expectSocketCreationCallback(
+ SERVICE_TYPE_2, mockListenerTwo, options);
+ runOnHandler(() -> callback2.onSocketCreated(SOCKET_KEY_NULL_NETWORK));
+ verify(mockServiceTypeClientType2NullNetwork).startSendAndReceive(mockListenerTwo, options);
+ runOnHandler(() -> callback2.onSocketCreated(SOCKET_KEY_NETWORK_2));
+ verify(mockServiceTypeClientType2Network2).startSendAndReceive(mockListenerTwo, options);
}
@Test
- public void onResponseReceived() {
- discoveryManager.registerListener(
- SERVICE_TYPE_1, mockListenerOne, MdnsSearchOptions.getDefaultOptions());
- discoveryManager.registerListener(
- SERVICE_TYPE_2, mockListenerTwo, MdnsSearchOptions.getDefaultOptions());
+ public void onResponseReceived() throws IOException {
+ final MdnsSearchOptions options1 =
+ MdnsSearchOptions.newBuilder().setNetwork(null /* network */).build();
+ final SocketCreationCallback callback = expectSocketCreationCallback(
+ SERVICE_TYPE_1, mockListenerOne, options1);
+ runOnHandler(() -> callback.onSocketCreated(SOCKET_KEY_NULL_NETWORK));
+ verify(mockServiceTypeClientType1NullNetwork).startSendAndReceive(
+ mockListenerOne, options1);
+ runOnHandler(() -> callback.onSocketCreated(SOCKET_KEY_NETWORK_1));
+ verify(mockServiceTypeClientType1Network1).startSendAndReceive(mockListenerOne, options1);
- MdnsPacket responseForServiceTypeOne = createMdnsPacket(SERVICE_TYPE_1);
+ final MdnsSearchOptions options2 =
+ MdnsSearchOptions.newBuilder().setNetwork(NETWORK_2).build();
+ final SocketCreationCallback callback2 = expectSocketCreationCallback(
+ SERVICE_TYPE_2, mockListenerTwo, options2);
+ runOnHandler(() -> callback2.onSocketCreated(SOCKET_KEY_NETWORK_2));
+ verify(mockServiceTypeClientType2Network2).startSendAndReceive(mockListenerTwo, options2);
+
+ final MdnsPacket responseForServiceTypeOne = createMdnsPacket(SERVICE_TYPE_1);
+ runOnHandler(() -> discoveryManager.onResponseReceived(
+ responseForServiceTypeOne, SOCKET_KEY_NULL_NETWORK));
+ // Packets for network null are only processed by the ServiceTypeClient for network null
+ verify(mockServiceTypeClientType1NullNetwork).processResponse(
+ responseForServiceTypeOne, SOCKET_KEY_NULL_NETWORK);
+ verify(mockServiceTypeClientType1Network1, never()).processResponse(any(), any());
+ verify(mockServiceTypeClientType2Network2, never()).processResponse(any(), any());
+
+ final MdnsPacket responseForServiceTypeTwo = createMdnsPacket(SERVICE_TYPE_2);
+ runOnHandler(() -> discoveryManager.onResponseReceived(
+ responseForServiceTypeTwo, SOCKET_KEY_NETWORK_1));
+ verify(mockServiceTypeClientType1NullNetwork, never()).processResponse(any(),
+ eq(SOCKET_KEY_NETWORK_1));
+ verify(mockServiceTypeClientType1Network1).processResponse(
+ responseForServiceTypeTwo, SOCKET_KEY_NETWORK_1);
+ verify(mockServiceTypeClientType2Network2, never()).processResponse(any(),
+ eq(SOCKET_KEY_NETWORK_1));
+
+ final MdnsPacket responseForSubtype =
+ createMdnsPacket("subtype._sub._googlecast._tcp.local");
+ runOnHandler(() -> discoveryManager.onResponseReceived(
+ responseForSubtype, SOCKET_KEY_NETWORK_2));
+ verify(mockServiceTypeClientType1NullNetwork, never()).processResponse(any(),
+ eq(SOCKET_KEY_NETWORK_2));
+ verify(mockServiceTypeClientType1Network1, never()).processResponse(any(),
+ eq(SOCKET_KEY_NETWORK_2));
+ verify(mockServiceTypeClientType2Network2).processResponse(
+ responseForSubtype, SOCKET_KEY_NETWORK_2);
+ }
+
+ @Test
+ public void testSocketCreatedAndDestroyed() throws IOException {
+ // Create a ServiceTypeClient for SERVICE_TYPE_1 and NETWORK_1
+ final MdnsSearchOptions network1Options =
+ MdnsSearchOptions.newBuilder().setNetwork(NETWORK_1).build();
+ final SocketCreationCallback callback = expectSocketCreationCallback(
+ SERVICE_TYPE_1, mockListenerOne, network1Options);
+ runOnHandler(() -> callback.onSocketCreated(SOCKET_KEY_NETWORK_1));
+ verify(mockServiceTypeClientType1Network1).startSendAndReceive(
+ mockListenerOne, network1Options);
+
+ // Create a ServiceTypeClient for SERVICE_TYPE_2 and NETWORK_1
+ final SocketCreationCallback callback2 = expectSocketCreationCallback(
+ SERVICE_TYPE_2, mockListenerTwo, network1Options);
+ runOnHandler(() -> callback2.onSocketCreated(SOCKET_KEY_NETWORK_1));
+ verify(mockServiceTypeClientType2Network1).startSendAndReceive(
+ mockListenerTwo, network1Options);
+
+ // Receive a response, it should be processed on both clients.
+ final MdnsPacket response = createMdnsPacket(SERVICE_TYPE_1);
+ runOnHandler(() -> discoveryManager.onResponseReceived(response, SOCKET_KEY_NETWORK_1));
+ verify(mockServiceTypeClientType1Network1).processResponse(response, SOCKET_KEY_NETWORK_1);
+ verify(mockServiceTypeClientType2Network1).processResponse(response, SOCKET_KEY_NETWORK_1);
+
+ // The first callback receives a notification that the network has been destroyed,
+ // mockServiceTypeClientOne1 should send service removed notifications and remove from the
+ // list of clients.
+ runOnHandler(() -> callback.onSocketDestroyed(SOCKET_KEY_NETWORK_1));
+ verify(mockServiceTypeClientType1Network1).notifySocketDestroyed();
+
+ // Receive a response again, it should be processed only on
+ // mockServiceTypeClientType2Network1. Because the mockServiceTypeClientType1Network1 is
+ // removed from the list of clients, it is no longer able to process responses.
+ runOnHandler(() -> discoveryManager.onResponseReceived(response, SOCKET_KEY_NETWORK_1));
+ // Still times(1) as a response was received once previously
+ verify(mockServiceTypeClientType1Network1, times(1)).processResponse(
+ response, SOCKET_KEY_NETWORK_1);
+ verify(mockServiceTypeClientType2Network1, times(2)).processResponse(
+ response, SOCKET_KEY_NETWORK_1);
+
+ // The client for NETWORK_1 receives the callback that the NETWORK_2 has been destroyed,
+ // mockServiceTypeClientTwo2 shouldn't send any notifications.
+ runOnHandler(() -> callback2.onSocketDestroyed(SOCKET_KEY_NETWORK_2));
+ verify(mockServiceTypeClientType2Network1, never()).notifySocketDestroyed();
+
+ // Receive a response again, mockServiceTypeClientType2Network1 is still in the list of
+ // clients, it's still able to process responses.
+ runOnHandler(() -> discoveryManager.onResponseReceived(response, SOCKET_KEY_NETWORK_1));
+ verify(mockServiceTypeClientType1Network1, times(1)).processResponse(
+ response, SOCKET_KEY_NETWORK_1);
+ verify(mockServiceTypeClientType2Network1, times(3)).processResponse(
+ response, SOCKET_KEY_NETWORK_1);
+ }
+
+ @Test
+ public void testUnregisterListenerAfterSocketDestroyed() throws IOException {
+ // Create a ServiceTypeClient for SERVICE_TYPE_1
+ final MdnsSearchOptions network1Options =
+ MdnsSearchOptions.newBuilder().setNetwork(null /* network */).build();
+ final SocketCreationCallback callback = expectSocketCreationCallback(
+ SERVICE_TYPE_1, mockListenerOne, network1Options);
+ runOnHandler(() -> callback.onSocketCreated(SOCKET_KEY_NULL_NETWORK));
+ verify(mockServiceTypeClientType1NullNetwork).startSendAndReceive(
+ mockListenerOne, network1Options);
+
+ // Receive a response, it should be processed on the client.
+ final MdnsPacket response = createMdnsPacket(SERVICE_TYPE_1);
final int ifIndex = 1;
- final Network network = mock(Network.class);
- discoveryManager.onResponseReceived(responseForServiceTypeOne, ifIndex, network);
- verify(mockServiceTypeClientOne).processResponse(responseForServiceTypeOne, ifIndex,
- network);
+ runOnHandler(() -> discoveryManager.onResponseReceived(response, SOCKET_KEY_NULL_NETWORK));
+ verify(mockServiceTypeClientType1NullNetwork).processResponse(
+ response, SOCKET_KEY_NULL_NETWORK);
- MdnsPacket responseForServiceTypeTwo = createMdnsPacket(SERVICE_TYPE_2);
- discoveryManager.onResponseReceived(responseForServiceTypeTwo, ifIndex, network);
- verify(mockServiceTypeClientTwo).processResponse(responseForServiceTypeTwo, ifIndex,
- network);
+ runOnHandler(() -> callback.onSocketDestroyed(SOCKET_KEY_NULL_NETWORK));
+ verify(mockServiceTypeClientType1NullNetwork).notifySocketDestroyed();
- MdnsPacket responseForSubtype = createMdnsPacket("subtype._sub._googlecast._tcp.local");
- discoveryManager.onResponseReceived(responseForSubtype, ifIndex, network);
- verify(mockServiceTypeClientOne).processResponse(responseForSubtype, ifIndex, network);
+ // Receive a response again, it should not be processed.
+ runOnHandler(() -> discoveryManager.onResponseReceived(response, SOCKET_KEY_NULL_NETWORK));
+ // Still times(1) as a response was received once previously
+ verify(mockServiceTypeClientType1NullNetwork, times(1)).processResponse(
+ response, SOCKET_KEY_NULL_NETWORK);
+
+ // Unregister the listener, notifyNetworkUnrequested should be called but other stop methods
+ // won't be call because the service type client was unregistered and destroyed. But those
+ // cleanups were done in notifySocketDestroyed when the socket was destroyed.
+ runOnHandler(() -> discoveryManager.unregisterListener(SERVICE_TYPE_1, mockListenerOne));
+ verify(socketClient).notifyNetworkUnrequested(mockListenerOne);
+ verify(mockServiceTypeClientType1NullNetwork, never()).stopSendAndReceive(any());
+ // The stopDiscovery() is only used by MdnsSocketClient, which doesn't send
+ // onSocketDestroyed(). So the socket clients that send onSocketDestroyed() do not
+ // need to call stopDiscovery().
+ verify(socketClient, never()).stopDiscovery();
}
private MdnsPacket createMdnsPacket(String serviceType) {
diff --git a/tests/unit/java/com/android/server/connectivity/mdns/MdnsInterfaceAdvertiserTest.kt b/tests/unit/java/com/android/server/connectivity/mdns/MdnsInterfaceAdvertiserTest.kt
index 2d8d8f3..dd458b8 100644
--- a/tests/unit/java/com/android/server/connectivity/mdns/MdnsInterfaceAdvertiserTest.kt
+++ b/tests/unit/java/com/android/server/connectivity/mdns/MdnsInterfaceAdvertiserTest.kt
@@ -22,6 +22,7 @@
import android.os.Build
import android.os.HandlerThread
import com.android.net.module.util.HexDump
+import com.android.net.module.util.SharedLog
import com.android.server.connectivity.mdns.MdnsAnnouncer.AnnouncementInfo
import com.android.server.connectivity.mdns.MdnsAnnouncer.BaseAnnouncementInfo
import com.android.server.connectivity.mdns.MdnsAnnouncer.ExitAnnouncementInfo
@@ -75,6 +76,7 @@
private val replySender = mock(MdnsReplySender::class.java)
private val announcer = mock(MdnsAnnouncer::class.java)
private val prober = mock(MdnsProber::class.java)
+ private val sharedlog = SharedLog("MdnsInterfaceAdvertiserTest")
@Suppress("UNCHECKED_CAST")
private val probeCbCaptor = ArgumentCaptor.forClass(PacketRepeaterCallback::class.java)
as ArgumentCaptor<PacketRepeaterCallback<ProbingInfo>>
@@ -90,14 +92,14 @@
private val advertiser by lazy {
MdnsInterfaceAdvertiser(
- LOG_TAG,
socket,
TEST_ADDRS,
thread.looper,
TEST_BUFFER,
cb,
deps,
- TEST_HOSTNAME
+ TEST_HOSTNAME,
+ sharedlog
)
}
@@ -113,8 +115,9 @@
val knownServices = mutableSetOf<Int>()
doAnswer { inv ->
knownServices.add(inv.getArgument(0))
+
-1
- }.`when`(repository).addService(anyInt(), any())
+ }.`when`(repository).addService(anyInt(), any(), any())
doAnswer { inv ->
knownServices.remove(inv.getArgument(0))
null
@@ -136,6 +139,7 @@
@After
fun tearDown() {
thread.quitSafely()
+ thread.join()
}
@Test
@@ -274,8 +278,8 @@
doReturn(serviceId).`when`(testProbingInfo).serviceId
doReturn(testProbingInfo).`when`(repository).setServiceProbing(serviceId)
- advertiser.addService(serviceId, serviceInfo)
- verify(repository).addService(serviceId, serviceInfo)
+ advertiser.addService(serviceId, serviceInfo, null /* subtype */)
+ verify(repository).addService(serviceId, serviceInfo, null /* subtype */)
verify(prober).startProbing(testProbingInfo)
// Simulate probing success: continues to announcing
diff --git a/tests/unit/java/com/android/server/connectivity/mdns/MdnsMultinetworkSocketClientTest.java b/tests/unit/java/com/android/server/connectivity/mdns/MdnsMultinetworkSocketClientTest.java
index 1e322e4..29de272 100644
--- a/tests/unit/java/com/android/server/connectivity/mdns/MdnsMultinetworkSocketClientTest.java
+++ b/tests/unit/java/com/android/server/connectivity/mdns/MdnsMultinetworkSocketClientTest.java
@@ -21,10 +21,12 @@
import static org.junit.Assert.assertEquals;
import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.eq;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
import static org.mockito.Mockito.timeout;
+import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import android.net.InetAddresses;
@@ -34,6 +36,7 @@
import android.os.HandlerThread;
import com.android.net.module.util.HexDump;
+import com.android.server.connectivity.mdns.MdnsSocketClientBase.SocketCreationCallback;
import com.android.testutils.DevSdkIgnoreRule;
import com.android.testutils.DevSdkIgnoreRunner;
import com.android.testutils.HandlerUtils;
@@ -62,25 +65,35 @@
@Mock private MdnsInterfaceSocket mSocket;
@Mock private MdnsServiceBrowserListener mListener;
@Mock private MdnsSocketClientBase.Callback mCallback;
+ @Mock private SocketCreationCallback mSocketCreationCallback;
private MdnsMultinetworkSocketClient mSocketClient;
private Handler mHandler;
+ private SocketKey mSocketKey;
@Before
public void setUp() throws SocketException {
MockitoAnnotations.initMocks(this);
+
final HandlerThread thread = new HandlerThread("MdnsMultinetworkSocketClientTest");
thread.start();
mHandler = new Handler(thread.getLooper());
+ mSocketKey = new SocketKey(1000 /* interfaceIndex */);
mSocketClient = new MdnsMultinetworkSocketClient(thread.getLooper(), mProvider);
mHandler.post(() -> mSocketClient.setCallback(mCallback));
}
private SocketCallback expectSocketCallback() {
+ return expectSocketCallback(mListener, mNetwork);
+ }
+
+ private SocketCallback expectSocketCallback(MdnsServiceBrowserListener listener,
+ Network requestedNetwork) {
final ArgumentCaptor<SocketCallback> callbackCaptor =
ArgumentCaptor.forClass(SocketCallback.class);
- mHandler.post(() -> mSocketClient.notifyNetworkRequested(mListener, mNetwork));
+ mHandler.post(() -> mSocketClient.notifyNetworkRequested(
+ listener, requestedNetwork, mSocketCreationCallback));
verify(mProvider, timeout(DEFAULT_TIMEOUT))
- .requestSocket(eq(mNetwork), callbackCaptor.capture());
+ .requestSocket(eq(requestedNetwork), callbackCaptor.capture());
return callbackCaptor.getValue();
}
@@ -102,21 +115,58 @@
InetAddresses.parseNumericAddress("192.0.2.1"), 0 /* port */);
final DatagramPacket ipv6Packet = new DatagramPacket(BUFFER, 0 /* offset */, BUFFER.length,
InetAddresses.parseNumericAddress("2001:db8::"), 0 /* port */);
- doReturn(true).when(mSocket).hasJoinedIpv4();
- doReturn(true).when(mSocket).hasJoinedIpv6();
- doReturn(createEmptyNetworkInterface()).when(mSocket).getInterface();
- // Notify socket created
- callback.onSocketCreated(mNetwork, mSocket, List.of());
- // Send packet to IPv4 with target network and verify sending has been called.
- mSocketClient.sendMulticastPacket(ipv4Packet, mNetwork);
+ final MdnsInterfaceSocket tetherIfaceSock1 = mock(MdnsInterfaceSocket.class);
+ final MdnsInterfaceSocket tetherIfaceSock2 = mock(MdnsInterfaceSocket.class);
+ for (MdnsInterfaceSocket socket : List.of(mSocket, tetherIfaceSock1, tetherIfaceSock2)) {
+ doReturn(true).when(socket).hasJoinedIpv4();
+ doReturn(true).when(socket).hasJoinedIpv6();
+ doReturn(createEmptyNetworkInterface()).when(socket).getInterface();
+ }
+
+ final SocketKey tetherSocketKey1 = new SocketKey(1001 /* interfaceIndex */);
+ final SocketKey tetherSocketKey2 = new SocketKey(1002 /* interfaceIndex */);
+ // Notify socket created
+ callback.onSocketCreated(mSocketKey, mSocket, List.of());
+ verify(mSocketCreationCallback).onSocketCreated(mSocketKey);
+ callback.onSocketCreated(tetherSocketKey1, tetherIfaceSock1, List.of());
+ verify(mSocketCreationCallback).onSocketCreated(tetherSocketKey1);
+ callback.onSocketCreated(tetherSocketKey2, tetherIfaceSock2, List.of());
+ verify(mSocketCreationCallback).onSocketCreated(tetherSocketKey2);
+
+ // Send packet to IPv4 with mSocketKey and verify sending has been called.
+ mSocketClient.sendPacketRequestingMulticastResponse(ipv4Packet, mSocketKey,
+ false /* onlyUseIpv6OnIpv6OnlyNetworks */);
HandlerUtils.waitForIdle(mHandler, DEFAULT_TIMEOUT);
verify(mSocket).send(ipv4Packet);
+ verify(tetherIfaceSock1, never()).send(any());
+ verify(tetherIfaceSock2, never()).send(any());
- // Send packet to IPv6 without target network and verify sending has been called.
- mSocketClient.sendMulticastPacket(ipv6Packet);
+ // Send packet to IPv4 with onlyUseIpv6OnIpv6OnlyNetworks = true, the packet will be sent.
+ mSocketClient.sendPacketRequestingMulticastResponse(ipv4Packet, mSocketKey,
+ true /* onlyUseIpv6OnIpv6OnlyNetworks */);
HandlerUtils.waitForIdle(mHandler, DEFAULT_TIMEOUT);
- verify(mSocket).send(ipv6Packet);
+ verify(mSocket, times(2)).send(ipv4Packet);
+ verify(tetherIfaceSock1, never()).send(any());
+ verify(tetherIfaceSock2, never()).send(any());
+
+ // Send packet to IPv6 with tetherSocketKey1 and verify sending has been called.
+ mSocketClient.sendPacketRequestingMulticastResponse(ipv6Packet, tetherSocketKey1,
+ false /* onlyUseIpv6OnIpv6OnlyNetworks */);
+ HandlerUtils.waitForIdle(mHandler, DEFAULT_TIMEOUT);
+ verify(mSocket, never()).send(ipv6Packet);
+ verify(tetherIfaceSock1).send(ipv6Packet);
+ verify(tetherIfaceSock2, never()).send(ipv6Packet);
+
+ // Send packet to IPv6 with onlyUseIpv6OnIpv6OnlyNetworks = true, the packet will not be
+ // sent. Therefore, the tetherIfaceSock1.send() and tetherIfaceSock2.send() are still be
+ // called once.
+ mSocketClient.sendPacketRequestingMulticastResponse(ipv6Packet, tetherSocketKey1,
+ true /* onlyUseIpv6OnIpv6OnlyNetworks */);
+ HandlerUtils.waitForIdle(mHandler, DEFAULT_TIMEOUT);
+ verify(mSocket, never()).send(ipv6Packet);
+ verify(tetherIfaceSock1, times(1)).send(ipv6Packet);
+ verify(tetherIfaceSock2, never()).send(ipv6Packet);
}
@Test
@@ -137,7 +187,8 @@
doReturn(createEmptyNetworkInterface()).when(mSocket).getInterface();
// Notify socket created
- callback.onSocketCreated(mNetwork, mSocket, List.of());
+ callback.onSocketCreated(mSocketKey, mSocket, List.of());
+ verify(mSocketCreationCallback).onSocketCreated(mSocketKey);
final ArgumentCaptor<PacketHandler> handlerCaptor =
ArgumentCaptor.forClass(PacketHandler.class);
@@ -148,7 +199,7 @@
handler.handlePacket(data, data.length, null /* src */);
final ArgumentCaptor<MdnsPacket> responseCaptor =
ArgumentCaptor.forClass(MdnsPacket.class);
- verify(mCallback).onResponseReceived(responseCaptor.capture(), anyInt(), any());
+ verify(mCallback).onResponseReceived(responseCaptor.capture(), any());
final MdnsPacket response = responseCaptor.getValue();
assertEquals(0, response.questions.size());
assertEquals(0, response.additionalRecords.size());
@@ -165,4 +216,140 @@
new String[] { "Android", "local" } /* serviceHost */)
), response.answers);
}
+
+ @Test
+ public void testSocketRemovedAfterNetworkUnrequested() throws IOException {
+ // Request sockets on all networks
+ final SocketCallback callback = expectSocketCallback(mListener, null);
+ final DatagramPacket ipv4Packet = new DatagramPacket(BUFFER, 0 /* offset */, BUFFER.length,
+ InetAddresses.parseNumericAddress("192.0.2.1"), 0 /* port */);
+
+ // Notify 3 socket created, including 2 tethered interfaces (null network)
+ final MdnsInterfaceSocket socket2 = mock(MdnsInterfaceSocket.class);
+ final MdnsInterfaceSocket socket3 = mock(MdnsInterfaceSocket.class);
+ doReturn(true).when(mSocket).hasJoinedIpv4();
+ doReturn(true).when(mSocket).hasJoinedIpv6();
+ doReturn(true).when(socket2).hasJoinedIpv4();
+ doReturn(true).when(socket2).hasJoinedIpv6();
+ doReturn(true).when(socket3).hasJoinedIpv4();
+ doReturn(true).when(socket3).hasJoinedIpv6();
+ doReturn(createEmptyNetworkInterface()).when(mSocket).getInterface();
+ doReturn(createEmptyNetworkInterface()).when(socket2).getInterface();
+ doReturn(createEmptyNetworkInterface()).when(socket3).getInterface();
+
+ final SocketKey socketKey2 = new SocketKey(1001 /* interfaceIndex */);
+ final SocketKey socketKey3 = new SocketKey(1002 /* interfaceIndex */);
+ callback.onSocketCreated(mSocketKey, mSocket, List.of());
+ callback.onSocketCreated(socketKey2, socket2, List.of());
+ callback.onSocketCreated(socketKey3, socket3, List.of());
+ verify(mSocketCreationCallback).onSocketCreated(mSocketKey);
+ verify(mSocketCreationCallback).onSocketCreated(socketKey2);
+ verify(mSocketCreationCallback).onSocketCreated(socketKey3);
+
+ // Send IPv4 packet on the mSocketKey and verify sending has been called.
+ mSocketClient.sendPacketRequestingMulticastResponse(ipv4Packet, mSocketKey,
+ false /* onlyUseIpv6OnIpv6OnlyNetworks */);
+ HandlerUtils.waitForIdle(mHandler, DEFAULT_TIMEOUT);
+ verify(mSocket).send(ipv4Packet);
+ verify(socket2, never()).send(any());
+ verify(socket3, never()).send(any());
+
+ // Request another socket with null network, get the same interfaces
+ final SocketCreationCallback socketCreationCb2 = mock(SocketCreationCallback.class);
+ final MdnsServiceBrowserListener listener2 = mock(MdnsServiceBrowserListener.class);
+
+ // requestSocket is called a second time
+ final ArgumentCaptor<SocketCallback> callback2Captor =
+ ArgumentCaptor.forClass(SocketCallback.class);
+ mHandler.post(() -> mSocketClient.notifyNetworkRequested(
+ listener2, null, socketCreationCb2));
+ HandlerUtils.waitForIdle(mHandler, DEFAULT_TIMEOUT);
+ verify(mProvider, times(2)).requestSocket(eq(null), callback2Captor.capture());
+ final SocketCallback callback2 = callback2Captor.getAllValues().get(1);
+
+ // Notify socket created for all networks.
+ callback2.onSocketCreated(mSocketKey, mSocket, List.of());
+ callback2.onSocketCreated(socketKey2, socket2, List.of());
+ callback2.onSocketCreated(socketKey3, socket3, List.of());
+ verify(socketCreationCb2).onSocketCreated(mSocketKey);
+ verify(socketCreationCb2).onSocketCreated(socketKey2);
+ verify(socketCreationCb2).onSocketCreated(socketKey3);
+
+ // Send IPv4 packet on socket2 and verify sending to the socket2 only.
+ mSocketClient.sendPacketRequestingMulticastResponse(ipv4Packet, socketKey2,
+ false /* onlyUseIpv6OnIpv6OnlyNetworks */);
+ HandlerUtils.waitForIdle(mHandler, DEFAULT_TIMEOUT);
+ // ipv4Packet still sent only once on mSocket: times(1) matches the packet sent earlier on
+ // mNetwork
+ verify(mSocket, times(1)).send(ipv4Packet);
+ verify(socket2).send(ipv4Packet);
+ verify(socket3, never()).send(ipv4Packet);
+
+ // Unregister the second request
+ mHandler.post(() -> mSocketClient.notifyNetworkUnrequested(listener2));
+ verify(mProvider, timeout(DEFAULT_TIMEOUT)).unrequestSocket(callback2);
+
+ // Send IPv4 packet again and verify it's still sent a second time
+ mSocketClient.sendPacketRequestingMulticastResponse(ipv4Packet, socketKey2,
+ false /* onlyUseIpv6OnIpv6OnlyNetworks */);
+ HandlerUtils.waitForIdle(mHandler, DEFAULT_TIMEOUT);
+ verify(socket2, times(2)).send(ipv4Packet);
+ verify(socket3, never()).send(ipv4Packet);
+
+ // Unrequest remaining sockets
+ mHandler.post(() -> mSocketClient.notifyNetworkUnrequested(mListener));
+ verify(mProvider, timeout(DEFAULT_TIMEOUT)).unrequestSocket(callback);
+
+ // Send IPv4 packet and verify no more sending.
+ mSocketClient.sendPacketRequestingMulticastResponse(ipv4Packet, mSocketKey,
+ false /* onlyUseIpv6OnIpv6OnlyNetworks */);
+ HandlerUtils.waitForIdle(mHandler, DEFAULT_TIMEOUT);
+ verify(mSocket, times(1)).send(ipv4Packet);
+ verify(socket2, times(2)).send(ipv4Packet);
+ verify(socket3, never()).send(ipv4Packet);
+ }
+
+ @Test
+ public void testNotifyNetworkUnrequested_SocketsOnNullNetwork() {
+ final MdnsInterfaceSocket otherSocket = mock(MdnsInterfaceSocket.class);
+ final SocketKey otherSocketKey = new SocketKey(1001 /* interfaceIndex */);
+ final SocketCallback callback = expectSocketCallback(
+ mListener, null /* requestedNetwork */);
+ doReturn(createEmptyNetworkInterface()).when(mSocket).getInterface();
+ doReturn(createEmptyNetworkInterface()).when(otherSocket).getInterface();
+
+ callback.onSocketCreated(mSocketKey, mSocket, List.of());
+ verify(mSocketCreationCallback).onSocketCreated(mSocketKey);
+ callback.onSocketCreated(otherSocketKey, otherSocket, List.of());
+ verify(mSocketCreationCallback).onSocketCreated(otherSocketKey);
+
+ verify(mSocketCreationCallback, never()).onSocketDestroyed(mSocketKey);
+ verify(mSocketCreationCallback, never()).onSocketDestroyed(otherSocketKey);
+ mHandler.post(() -> mSocketClient.notifyNetworkUnrequested(mListener));
+ HandlerUtils.waitForIdle(mHandler, DEFAULT_TIMEOUT);
+
+ verify(mProvider).unrequestSocket(callback);
+ verify(mSocketCreationCallback).onSocketDestroyed(mSocketKey);
+ verify(mSocketCreationCallback).onSocketDestroyed(otherSocketKey);
+ }
+
+ @Test
+ public void testSocketCreatedAndDestroyed_NullNetwork() throws IOException {
+ final MdnsInterfaceSocket otherSocket = mock(MdnsInterfaceSocket.class);
+ final SocketKey otherSocketKey = new SocketKey(1001 /* interfaceIndex */);
+ final SocketCallback callback = expectSocketCallback(mListener, null /* network */);
+ doReturn(createEmptyNetworkInterface()).when(mSocket).getInterface();
+ doReturn(createEmptyNetworkInterface()).when(otherSocket).getInterface();
+
+ callback.onSocketCreated(mSocketKey, mSocket, List.of());
+ verify(mSocketCreationCallback).onSocketCreated(mSocketKey);
+ callback.onSocketCreated(otherSocketKey, otherSocket, List.of());
+ verify(mSocketCreationCallback).onSocketCreated(otherSocketKey);
+
+ // Notify socket destroyed
+ callback.onInterfaceDestroyed(mSocketKey, mSocket);
+ verify(mSocketCreationCallback).onSocketDestroyed(mSocketKey);
+ callback.onInterfaceDestroyed(otherSocketKey, otherSocket);
+ verify(mSocketCreationCallback).onSocketDestroyed(otherSocketKey);
+ }
}
diff --git a/tests/unit/java/com/android/server/connectivity/mdns/MdnsPacketWriterTest.kt b/tests/unit/java/com/android/server/connectivity/mdns/MdnsPacketWriterTest.kt
index 5c9c294..a545373 100644
--- a/tests/unit/java/com/android/server/connectivity/mdns/MdnsPacketWriterTest.kt
+++ b/tests/unit/java/com/android/server/connectivity/mdns/MdnsPacketWriterTest.kt
@@ -31,7 +31,7 @@
@Test
fun testNameCompression() {
val writer = MdnsPacketWriter(ByteArray(1000))
- writer.writeLabels(arrayOf("my", "first", "name"))
+ writer.writeLabels(arrayOf("my", "FIRST", "name"))
writer.writeLabels(arrayOf("my", "second", "name"))
writer.writeLabels(arrayOf("other", "first", "name"))
writer.writeLabels(arrayOf("my", "second", "name"))
@@ -41,7 +41,7 @@
InetSocketAddress(InetAddresses.parseNumericAddress("2001:db8::123"), 123))
// Each label takes length + 1. So "first.name" offset = 3, "name" offset = 9
- val expected = "my".label() + "first".label() + "name".label() + 0x00.toByte() +
+ val expected = "my".label() + "FIRST".label() + "name".label() + 0x00.toByte() +
// "my.second.name" offset = 15
"my".label() + "second".label() + byteArrayOf(0xC0.toByte(), 9) +
"other".label() + byteArrayOf(0xC0.toByte(), 3) +
diff --git a/tests/unit/java/com/android/server/connectivity/mdns/MdnsProberTest.kt b/tests/unit/java/com/android/server/connectivity/mdns/MdnsProberTest.kt
index a2dbbc6..0a8d78d 100644
--- a/tests/unit/java/com/android/server/connectivity/mdns/MdnsProberTest.kt
+++ b/tests/unit/java/com/android/server/connectivity/mdns/MdnsProberTest.kt
@@ -48,6 +48,7 @@
private val TEST_SERVICE_NAME_1 = arrayOf("testservice", "_nmt", "_tcp", "local")
private val TEST_SERVICE_NAME_2 = arrayOf("testservice2", "_nmt", "_tcp", "local")
+private val TEST_SERVICE_NAME_3 = arrayOf("Testservice", "_nmt", "_tcp", "local")
@RunWith(DevSdkIgnoreRunner::class)
@IgnoreUpTo(Build.VERSION_CODES.S_V2)
@@ -68,6 +69,7 @@
@After
fun tearDown() {
thread.quitSafely()
+ thread.join()
}
private class TestProbeInfo(probeRecords: List<MdnsRecord>, private val delayMs: Long = 1L) :
@@ -128,6 +130,15 @@
}
@Test
+ fun testCreateProberCaseInsensitive() {
+ val probeInfo = TestProbeInfo(
+ listOf(makeServiceRecord(TEST_SERVICE_NAME_1, 37890),
+ makeServiceRecord(TEST_SERVICE_NAME_2, 37890),
+ makeServiceRecord(TEST_SERVICE_NAME_3, 37890)))
+ assertEquals(2, probeInfo.getPacket(0).questions.size)
+ }
+
+ @Test
fun testProbeMultipleRecords() {
val replySender = MdnsReplySender("testiface", thread.looper, socket, buffer)
val prober = TestProber(thread.looper, replySender, cb)
diff --git a/tests/unit/java/com/android/server/connectivity/mdns/MdnsRecordRepositoryTest.kt b/tests/unit/java/com/android/server/connectivity/mdns/MdnsRecordRepositoryTest.kt
index 5665091..0033b5a 100644
--- a/tests/unit/java/com/android/server/connectivity/mdns/MdnsRecordRepositoryTest.kt
+++ b/tests/unit/java/com/android/server/connectivity/mdns/MdnsRecordRepositoryTest.kt
@@ -43,7 +43,9 @@
private const val TEST_SERVICE_ID_1 = 42
private const val TEST_SERVICE_ID_2 = 43
+private const val TEST_SERVICE_ID_3 = 44
private const val TEST_PORT = 12345
+private const val TEST_SUBTYPE = "_subtype"
private val TEST_HOSTNAME = arrayOf("Android_000102030405060708090A0B0C0D0E0F", "local")
private val TEST_ADDRESSES = listOf(
LinkAddress(parseNumericAddress("192.0.2.111"), 24),
@@ -62,6 +64,12 @@
port = TEST_PORT
}
+private val TEST_SERVICE_3 = NsdServiceInfo().apply {
+ serviceType = "_TESTSERVICE._tcp"
+ serviceName = "MyTESTSERVICE"
+ port = TEST_PORT
+}
+
@RunWith(DevSdkIgnoreRunner::class)
@DevSdkIgnoreRule.IgnoreUpTo(Build.VERSION_CODES.S_V2)
class MdnsRecordRepositoryTest {
@@ -79,13 +87,15 @@
@After
fun tearDown() {
thread.quitSafely()
+ thread.join()
}
@Test
fun testAddServiceAndProbe() {
val repository = MdnsRecordRepository(thread.looper, deps, TEST_HOSTNAME)
assertEquals(0, repository.servicesCount)
- assertEquals(-1, repository.addService(TEST_SERVICE_ID_1, TEST_SERVICE_1))
+ assertEquals(-1, repository.addService(TEST_SERVICE_ID_1, TEST_SERVICE_1,
+ null /* subtype */))
assertEquals(1, repository.servicesCount)
val probingInfo = repository.setServiceProbing(TEST_SERVICE_ID_1)
@@ -117,18 +127,21 @@
@Test
fun testAddAndConflicts() {
val repository = MdnsRecordRepository(thread.looper, deps, TEST_HOSTNAME)
- repository.addService(TEST_SERVICE_ID_1, TEST_SERVICE_1)
+ repository.addService(TEST_SERVICE_ID_1, TEST_SERVICE_1, null /* subtype */)
assertFailsWith(NameConflictException::class) {
- repository.addService(TEST_SERVICE_ID_2, TEST_SERVICE_1)
+ repository.addService(TEST_SERVICE_ID_2, TEST_SERVICE_1, null /* subtype */)
+ }
+ assertFailsWith(NameConflictException::class) {
+ repository.addService(TEST_SERVICE_ID_3, TEST_SERVICE_3, null /* subtype */)
}
}
@Test
fun testInvalidReuseOfServiceId() {
val repository = MdnsRecordRepository(thread.looper, deps, TEST_HOSTNAME)
- repository.addService(TEST_SERVICE_ID_1, TEST_SERVICE_1)
+ repository.addService(TEST_SERVICE_ID_1, TEST_SERVICE_1, null /* subtype */)
assertFailsWith(IllegalArgumentException::class) {
- repository.addService(TEST_SERVICE_ID_1, TEST_SERVICE_2)
+ repository.addService(TEST_SERVICE_ID_1, TEST_SERVICE_2, null /* subtype */)
}
}
@@ -137,7 +150,7 @@
val repository = MdnsRecordRepository(thread.looper, deps, TEST_HOSTNAME)
assertFalse(repository.hasActiveService(TEST_SERVICE_ID_1))
- repository.addService(TEST_SERVICE_ID_1, TEST_SERVICE_1)
+ repository.addService(TEST_SERVICE_ID_1, TEST_SERVICE_1, null /* subtype */)
assertTrue(repository.hasActiveService(TEST_SERVICE_ID_1))
val probingInfo = repository.setServiceProbing(TEST_SERVICE_ID_1)
@@ -179,13 +192,49 @@
}
@Test
+ fun testExitAnnouncements_WithSubtype() {
+ val repository = MdnsRecordRepository(thread.looper, deps, TEST_HOSTNAME)
+ repository.initWithService(TEST_SERVICE_ID_1, TEST_SERVICE_1, TEST_SUBTYPE)
+ repository.onAdvertisementSent(TEST_SERVICE_ID_1)
+
+ val exitAnnouncement = repository.exitService(TEST_SERVICE_ID_1)
+ assertNotNull(exitAnnouncement)
+ assertEquals(1, repository.servicesCount)
+ val packet = exitAnnouncement.getPacket(0)
+
+ assertEquals(0x8400 /* response, authoritative */, packet.flags)
+ assertEquals(0, packet.questions.size)
+ assertEquals(0, packet.authorityRecords.size)
+ assertEquals(0, packet.additionalRecords.size)
+
+ assertContentEquals(listOf(
+ MdnsPointerRecord(
+ arrayOf("_testservice", "_tcp", "local"),
+ 0L /* receiptTimeMillis */,
+ true /* cacheFlush */,
+ 0L /* ttlMillis */,
+ arrayOf("MyTestService", "_testservice", "_tcp", "local")),
+ MdnsPointerRecord(
+ arrayOf("_subtype", "_sub", "_testservice", "_tcp", "local"),
+ 0L /* receiptTimeMillis */,
+ true /* cacheFlush */,
+ 0L /* ttlMillis */,
+ arrayOf("MyTestService", "_testservice", "_tcp", "local")),
+ ), packet.answers)
+
+ repository.removeService(TEST_SERVICE_ID_1)
+ assertEquals(0, repository.servicesCount)
+ }
+
+ @Test
fun testExitingServiceReAdded() {
val repository = MdnsRecordRepository(thread.looper, deps, TEST_HOSTNAME)
repository.initWithService(TEST_SERVICE_ID_1, TEST_SERVICE_1)
repository.onAdvertisementSent(TEST_SERVICE_ID_1)
repository.exitService(TEST_SERVICE_ID_1)
- assertEquals(TEST_SERVICE_ID_1, repository.addService(TEST_SERVICE_ID_2, TEST_SERVICE_1))
+ assertEquals(TEST_SERVICE_ID_1,
+ repository.addService(TEST_SERVICE_ID_2, TEST_SERVICE_1, null /* subtype */))
assertEquals(1, repository.servicesCount)
repository.removeService(TEST_SERVICE_ID_2)
@@ -195,7 +244,8 @@
@Test
fun testOnProbingSucceeded() {
val repository = MdnsRecordRepository(thread.looper, deps, TEST_HOSTNAME)
- val announcementInfo = repository.initWithService(TEST_SERVICE_ID_1, TEST_SERVICE_1)
+ val announcementInfo = repository.initWithService(TEST_SERVICE_ID_1, TEST_SERVICE_1,
+ TEST_SUBTYPE)
repository.onAdvertisementSent(TEST_SERVICE_ID_1)
val packet = announcementInfo.getPacket(0)
@@ -204,6 +254,7 @@
assertEquals(0, packet.authorityRecords.size)
val serviceType = arrayOf("_testservice", "_tcp", "local")
+ val serviceSubtype = arrayOf(TEST_SUBTYPE, "_sub", "_testservice", "_tcp", "local")
val serviceName = arrayOf("MyTestService", "_testservice", "_tcp", "local")
val v4AddrRev = getReverseDnsAddress(TEST_ADDRESSES[0].address)
val v6Addr1Rev = getReverseDnsAddress(TEST_ADDRESSES[1].address)
@@ -249,6 +300,13 @@
false /* cacheFlush */,
4500000L /* ttlMillis */,
serviceName),
+ MdnsPointerRecord(
+ serviceSubtype,
+ 0L /* receiptTimeMillis */,
+ // Not a unique name owned by the announcer, so cacheFlush=false
+ false /* cacheFlush */,
+ 4500000L /* ttlMillis */,
+ serviceName),
MdnsServiceRecord(
serviceName,
0L /* receiptTimeMillis */,
@@ -317,10 +375,43 @@
}
@Test
- fun testGetReply() {
+ fun testGetReplyCaseInsensitive() {
val repository = MdnsRecordRepository(thread.looper, deps, TEST_HOSTNAME)
repository.initWithService(TEST_SERVICE_ID_1, TEST_SERVICE_1)
- val questions = listOf(MdnsPointerRecord(arrayOf("_testservice", "_tcp", "local"),
+ val questionsCaseInSensitive =
+ listOf(MdnsPointerRecord(arrayOf("_TESTSERVICE", "_TCP", "local"),
+ 0L /* receiptTimeMillis */,
+ false /* cacheFlush */,
+ // TTL and data is empty for a question
+ 0L /* ttlMillis */,
+ null /* pointer */))
+ val queryCaseInsensitive = MdnsPacket(0 /* flags */, questionsCaseInSensitive,
+ listOf() /* answers */, listOf() /* authorityRecords */,
+ listOf() /* additionalRecords */)
+ val src = InetSocketAddress(parseNumericAddress("192.0.2.123"), 5353)
+ val replyCaseInsensitive = repository.getReply(queryCaseInsensitive, src)
+ assertNotNull(replyCaseInsensitive)
+ assertEquals(1, replyCaseInsensitive.answers.size)
+ assertEquals(7, replyCaseInsensitive.additionalAnswers.size)
+ }
+
+ @Test
+ fun testGetReply() {
+ doGetReplyTest(subtype = null)
+ }
+
+ @Test
+ fun testGetReply_WithSubtype() {
+ doGetReplyTest(TEST_SUBTYPE)
+ }
+
+ private fun doGetReplyTest(subtype: String?) {
+ val repository = MdnsRecordRepository(thread.looper, deps, TEST_HOSTNAME)
+ repository.initWithService(TEST_SERVICE_ID_1, TEST_SERVICE_1, subtype)
+ val queriedName = if (subtype == null) arrayOf("_testservice", "_tcp", "local")
+ else arrayOf(subtype, "_sub", "_testservice", "_tcp", "local")
+
+ val questions = listOf(MdnsPointerRecord(queriedName,
0L /* receiptTimeMillis */,
false /* cacheFlush */,
// TTL and data is empty for a question
@@ -343,7 +434,7 @@
assertEquals(listOf(
MdnsPointerRecord(
- arrayOf("_testservice", "_tcp", "local"),
+ queriedName,
0L /* receiptTimeMillis */,
false /* cacheFlush */,
longTtl,
@@ -404,8 +495,8 @@
@Test
fun testGetConflictingServices() {
val repository = MdnsRecordRepository(thread.looper, deps, TEST_HOSTNAME)
- repository.addService(TEST_SERVICE_ID_1, TEST_SERVICE_1)
- repository.addService(TEST_SERVICE_ID_2, TEST_SERVICE_2)
+ repository.addService(TEST_SERVICE_ID_1, TEST_SERVICE_1, null /* subtype */)
+ repository.addService(TEST_SERVICE_ID_2, TEST_SERVICE_2, null /* subtype */)
val packet = MdnsPacket(
0 /* flags */,
@@ -430,10 +521,38 @@
}
@Test
+ fun testGetConflictingServicesCaseInsensitive() {
+ val repository = MdnsRecordRepository(thread.looper, deps, TEST_HOSTNAME)
+ repository.addService(TEST_SERVICE_ID_1, TEST_SERVICE_1, null /* subtype */)
+ repository.addService(TEST_SERVICE_ID_2, TEST_SERVICE_2, null /* subtype */)
+
+ val packet = MdnsPacket(
+ 0 /* flags */,
+ emptyList() /* questions */,
+ listOf(
+ MdnsServiceRecord(
+ arrayOf("MYTESTSERVICE", "_TESTSERVICE", "_tcp", "local"),
+ 0L /* receiptTimeMillis */, true /* cacheFlush */, 0L /* ttlMillis */,
+ 0 /* servicePriority */, 0 /* serviceWeight */,
+ TEST_SERVICE_1.port + 1,
+ TEST_HOSTNAME),
+ MdnsTextRecord(
+ arrayOf("MYOTHERTESTSERVICE", "_TESTSERVICE", "_tcp", "local"),
+ 0L /* receiptTimeMillis */, true /* cacheFlush */, 0L /* ttlMillis */,
+ listOf(TextEntry.fromString("somedifferent=entry"))),
+ ) /* answers */,
+ emptyList() /* authorityRecords */,
+ emptyList() /* additionalRecords */)
+
+ assertEquals(setOf(TEST_SERVICE_ID_1, TEST_SERVICE_ID_2),
+ repository.getConflictingServices(packet))
+ }
+
+ @Test
fun testGetConflictingServices_IdenticalService() {
val repository = MdnsRecordRepository(thread.looper, deps, TEST_HOSTNAME)
- repository.addService(TEST_SERVICE_ID_1, TEST_SERVICE_1)
- repository.addService(TEST_SERVICE_ID_2, TEST_SERVICE_2)
+ repository.addService(TEST_SERVICE_ID_1, TEST_SERVICE_1, null /* subtype */)
+ repository.addService(TEST_SERVICE_ID_2, TEST_SERVICE_2, null /* subtype */)
val otherTtlMillis = 1234L
val packet = MdnsPacket(
@@ -445,7 +564,7 @@
0L /* receiptTimeMillis */, true /* cacheFlush */,
otherTtlMillis, 0 /* servicePriority */, 0 /* serviceWeight */,
TEST_SERVICE_1.port,
- TEST_HOSTNAME),
+ arrayOf("ANDROID_000102030405060708090A0B0C0D0E0F", "local")),
MdnsTextRecord(
arrayOf("MyOtherTestService", "_testservice", "_tcp", "local"),
0L /* receiptTimeMillis */, true /* cacheFlush */,
@@ -457,12 +576,44 @@
// Above records are identical to the actual registrations: no conflict
assertEquals(emptySet(), repository.getConflictingServices(packet))
}
+
+ @Test
+ fun testGetConflictingServicesCaseInsensitive_IdenticalService() {
+ val repository = MdnsRecordRepository(thread.looper, deps, TEST_HOSTNAME)
+ repository.addService(TEST_SERVICE_ID_1, TEST_SERVICE_1, null /* subtype */)
+ repository.addService(TEST_SERVICE_ID_2, TEST_SERVICE_2, null /* subtype */)
+
+ val otherTtlMillis = 1234L
+ val packet = MdnsPacket(
+ 0 /* flags */,
+ emptyList() /* questions */,
+ listOf(
+ MdnsServiceRecord(
+ arrayOf("MYTESTSERVICE", "_TESTSERVICE", "_tcp", "local"),
+ 0L /* receiptTimeMillis */, true /* cacheFlush */,
+ otherTtlMillis, 0 /* servicePriority */, 0 /* serviceWeight */,
+ TEST_SERVICE_1.port,
+ TEST_HOSTNAME),
+ MdnsTextRecord(
+ arrayOf("MyOtherTestService", "_TESTSERVICE", "_tcp", "local"),
+ 0L /* receiptTimeMillis */, true /* cacheFlush */,
+ otherTtlMillis, emptyList()),
+ ) /* answers */,
+ emptyList() /* authorityRecords */,
+ emptyList() /* additionalRecords */)
+
+ // Above records are identical to the actual registrations: no conflict
+ assertEquals(emptySet(), repository.getConflictingServices(packet))
+ }
}
-private fun MdnsRecordRepository.initWithService(serviceId: Int, serviceInfo: NsdServiceInfo):
- AnnouncementInfo {
+private fun MdnsRecordRepository.initWithService(
+ serviceId: Int,
+ serviceInfo: NsdServiceInfo,
+ subtype: String? = null
+): AnnouncementInfo {
updateAddresses(TEST_ADDRESSES)
- addService(serviceId, serviceInfo)
+ addService(serviceId, serviceInfo, subtype)
val probingInfo = setServiceProbing(serviceId)
assertNotNull(probingInfo)
return onProbingSucceeded(probingInfo)
diff --git a/tests/unit/java/com/android/server/connectivity/mdns/MdnsRecordTest.kt b/tests/unit/java/com/android/server/connectivity/mdns/MdnsRecordTest.kt
new file mode 100644
index 0000000..8f819b7
--- /dev/null
+++ b/tests/unit/java/com/android/server/connectivity/mdns/MdnsRecordTest.kt
@@ -0,0 +1,124 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License")
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.connectivity.mdns
+
+import android.os.Build
+import com.android.testutils.DevSdkIgnoreRule
+import com.android.testutils.DevSdkIgnoreRunner
+import kotlin.test.assertEquals
+import kotlin.test.assertFalse
+import kotlin.test.assertTrue
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@RunWith(DevSdkIgnoreRunner::class)
+@DevSdkIgnoreRule.IgnoreUpTo(Build.VERSION_CODES.S_V2)
+class MdnsRecordTest {
+
+ @Test
+ fun testPointerRecordHasSubType() {
+ val ptrRecord1 = MdnsPointerRecord(
+ arrayOf("_testtype", "_sub", "_tcp", "local"),
+ 0L /* receiptTimeMillis */,
+ false /* cacheFlush */,
+ 4500000 /* ttlMillis */,
+ arrayOf("testservice", "_testtype", "_tcp", "local")
+ )
+ val ptrRecord2 = MdnsPointerRecord(
+ arrayOf("_testtype", "_SUB", "_tcp", "local"),
+ 0L /* receiptTimeMillis */,
+ false /* cacheFlush */,
+ 4500000 /* ttlMillis */,
+ arrayOf("testservice", "_testtype", "_tcp", "local")
+ )
+ assertTrue(ptrRecord1.hasSubtype())
+ assertTrue(ptrRecord2.hasSubtype())
+ }
+
+ @Test
+ fun testEqualsCaseInsensitive() {
+ val ptrRecord1 = MdnsPointerRecord(
+ arrayOf("_testtype", "_tcp", "local"),
+ 0L /* receiptTimeMillis */,
+ false /* cacheFlush */,
+ 4500000 /* ttlMillis */,
+ arrayOf("testservice", "_testtype", "_tcp", "local")
+ )
+ val ptrRecord2 = MdnsPointerRecord(
+ arrayOf("_testType", "_tcp", "local"),
+ 0L /* receiptTimeMillis */,
+ false /* cacheFlush */,
+ 4500000 /* ttlMillis */,
+ arrayOf("testsErvice", "_testtype", "_Tcp", "local")
+ )
+ assertEquals(ptrRecord1, ptrRecord2)
+ assertEquals(ptrRecord1.hashCode(), ptrRecord2.hashCode())
+
+ val srvRecord1 = MdnsServiceRecord(
+ arrayOf("testservice", "_testtype", "_tcp", "local"),
+ 123 /* receiptTimeMillis */,
+ false /* cacheFlush */,
+ 2000 /* ttlMillis */,
+ 0 /* servicePriority */,
+ 0 /* serviceWeight */,
+ 80 /* port */,
+ arrayOf("hostname")
+ )
+ val srvRecord2 = MdnsServiceRecord(
+ arrayOf("Testservice", "_testtype", "_tcp", "local"),
+ 123 /* receiptTimeMillis */,
+ false /* cacheFlush */,
+ 2000 /* ttlMillis */,
+ 0 /* servicePriority */,
+ 0 /* serviceWeight */,
+ 80 /* port */,
+ arrayOf("Hostname")
+ )
+ assertEquals(srvRecord1, srvRecord2)
+ assertEquals(srvRecord1.hashCode(), srvRecord2.hashCode())
+
+ val nsecRecord1 = MdnsNsecRecord(
+ arrayOf("hostname"),
+ 0L /* receiptTimeMillis */,
+ true /* cacheFlush */,
+ 2000L, /* ttlMillis */
+ arrayOf("hostname"),
+ intArrayOf(1, 2, 3) /* types */
+ )
+ val nsecRecord2 = MdnsNsecRecord(
+ arrayOf("HOSTNAME"),
+ 0L /* receiptTimeMillis */,
+ true /* cacheFlush */,
+ 2000L, /* ttlMillis */
+ arrayOf("HOSTNAME"),
+ intArrayOf(1, 2, 3) /* types */
+ )
+ assertEquals(nsecRecord1, nsecRecord2)
+ assertEquals(nsecRecord1.hashCode(), nsecRecord2.hashCode())
+ }
+
+ @Test
+ fun testLabelsAreSuffix() {
+ val labels1 = arrayOf("a", "b", "c")
+ val labels2 = arrayOf("B", "C")
+ val labels3 = arrayOf("b", "c")
+ val labels4 = arrayOf("b", "d")
+ assertTrue(MdnsRecord.labelsAreSuffix(labels2, labels1))
+ assertTrue(MdnsRecord.labelsAreSuffix(labels3, labels1))
+ assertFalse(MdnsRecord.labelsAreSuffix(labels4, labels1))
+ }
+}
diff --git a/tests/unit/java/com/android/server/connectivity/mdns/MdnsResponseDecoderTests.java b/tests/unit/java/com/android/server/connectivity/mdns/MdnsResponseDecoderTests.java
index a80c078..05eca84 100644
--- a/tests/unit/java/com/android/server/connectivity/mdns/MdnsResponseDecoderTests.java
+++ b/tests/unit/java/com/android/server/connectivity/mdns/MdnsResponseDecoderTests.java
@@ -28,6 +28,7 @@
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
+import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
import android.net.Network;
@@ -156,16 +157,20 @@
+ "010001000000780004C0A8018A0000000000000000000000000000"
+ "000000");
- // MDNS record for name "testhost1" with an IPv4 address of 10.1.2.3
+ // MDNS record for name "testhost1" with an IPv4 address of 10.1.2.3. Also set cache flush bit
+ // for the records changed.
private static final byte[] DATAIN_IPV4_1 = HexDump.hexStringToByteArray(
"0974657374686f73743100000180010000007800040a010203");
- // MDNS record for name "testhost1" with an IPv4 address of 10.1.2.4
+ // MDNS record for name "testhost1" with an IPv4 address of 10.1.2.4. Also set cache flush bit
+ // for the records changed.
private static final byte[] DATAIN_IPV4_2 = HexDump.hexStringToByteArray(
"0974657374686f73743100000180010000007800040a010204");
- // MDNS record w/name "testhost1" & IPv6 address of aabb:ccdd:1122:3344:a0b0:c0d0:1020:3040
+ // MDNS record w/name "testhost1" & IPv6 address of aabb:ccdd:1122:3344:a0b0:c0d0:1020:3040.
+ // Also set cache flush bit for the records changed.
private static final byte[] DATAIN_IPV6_1 = HexDump.hexStringToByteArray(
"0974657374686f73743100001c8001000000780010aabbccdd11223344a0b0c0d010203040");
- // MDNS record w/name "testhost1" & IPv6 address of aabb:ccdd:1122:3344:a0b0:c0d0:1020:3030
+ // MDNS record w/name "testhost1" & IPv6 address of aabb:ccdd:1122:3344:a0b0:c0d0:1020:3030.
+ // Also set cache flush bit for the records changed.
private static final byte[] DATAIN_IPV6_2 = HexDump.hexStringToByteArray(
"0974657374686f73743100001c8001000000780010aabbccdd11223344a0b0c0d010203030");
// MDNS record w/name "test" & PTR to foo.bar.quxx
@@ -265,14 +270,9 @@
assertEquals("st=0", textStrings.get(6));
}
- @Test
- public void testDecodeIPv6AnswerPacket() throws IOException {
- MdnsResponseDecoder decoder = new MdnsResponseDecoder(mClock, CAST_SERVICE_TYPE);
- assertNotNull(data6);
-
- responses = decode(decoder, data6);
- assertEquals(1, responses.size());
- MdnsResponse response = responses.valueAt(0);
+ private void verifyResponse(ArraySet<MdnsResponse> responseArraySet) {
+ assertEquals(1, responseArraySet.size());
+ MdnsResponse response = responseArraySet.valueAt(0);
assertTrue(response.isComplete());
MdnsInetAddressRecord inet6AddressRecord = response.getInet6AddressRecord();
@@ -286,6 +286,22 @@
}
@Test
+ public void testDecodeIPv6AnswerPacket() throws IOException {
+ MdnsResponseDecoder decoder = new MdnsResponseDecoder(mClock, CAST_SERVICE_TYPE);
+ assertNotNull(data6);
+ verifyResponse(decode(decoder, data6));
+ }
+
+ @Test
+ public void testDecodeCaseInsensitiveMatch() throws IOException {
+ final String[] castServiceTypeUpperCase =
+ new String[] {"_GOOGLECAST", "_TCP", "LOCAL"};
+ MdnsResponseDecoder decoder = new MdnsResponseDecoder(mClock, castServiceTypeUpperCase);
+ assertNotNull(data6);
+ verifyResponse(decode(decoder, data6));
+ }
+
+ @Test
public void testIsComplete() {
MdnsResponse response = new MdnsResponse(responses.valueAt(0));
assertTrue(response.isComplete());
@@ -329,7 +345,7 @@
final Network network = mock(Network.class);
responses = decoder.augmentResponses(parsedPacket,
/* existingResponses= */ Collections.emptyList(),
- /* interfaceIndex= */ 10, network /* expireOnExit= */);
+ /* interfaceIndex= */ 10, network /* expireOnExit= */).first;
assertEquals(responses.size(), 1);
assertEquals(responses.valueAt(0).getInterfaceIndex(), 10);
@@ -403,6 +419,31 @@
}
@Test
+ public void testDecodeWithIpv4AddressRemove() throws IOException {
+ MdnsResponse response = makeMdnsResponse(0, DATAIN_SERVICE_NAME_1, List.of(
+ new PacketAndRecordClass(DATAIN_PTR_1,
+ MdnsPointerRecord.class),
+ new PacketAndRecordClass(DATAIN_SERVICE_1,
+ MdnsServiceRecord.class),
+ new PacketAndRecordClass(DATAIN_IPV4_1,
+ MdnsInet4AddressRecord.class),
+ new PacketAndRecordClass(DATAIN_IPV4_2,
+ MdnsInet4AddressRecord.class)));
+ // Now update the response removing the second v4 address
+ final MdnsResponseDecoder decoder = new MdnsResponseDecoder(mClock, null);
+
+ final byte[] removedAddrResponse = makeResponsePacket(
+ List.of(DATAIN_PTR_1, DATAIN_SERVICE_1, DATAIN_IPV4_1));
+ final ArraySet<MdnsResponse> changes = decode(
+ decoder, removedAddrResponse, List.of(response));
+
+ assertEquals(1, changes.size());
+ assertEquals(1, changes.valueAt(0).getInet4AddressRecords().size());
+ assertEquals(parseNumericAddress("10.1.2.3"),
+ changes.valueAt(0).getInet4AddressRecords().get(0).getInet4Address());
+ }
+
+ @Test
public void testDecodeWithIpv6AddressChange() throws IOException {
MdnsResponse response = makeMdnsResponse(0, DATAIN_SERVICE_NAME_1, List.of(
new PacketAndRecordClass(DATAIN_PTR_1,
@@ -423,6 +464,29 @@
}
@Test
+ public void testDecodeWithIpv6AddressRemoved() throws IOException {
+ MdnsResponse response = makeMdnsResponse(0, DATAIN_SERVICE_NAME_1, List.of(
+ new PacketAndRecordClass(DATAIN_PTR_1,
+ MdnsPointerRecord.class),
+ new PacketAndRecordClass(DATAIN_SERVICE_1,
+ MdnsServiceRecord.class),
+ new PacketAndRecordClass(DATAIN_IPV6_1,
+ MdnsInet6AddressRecord.class),
+ new PacketAndRecordClass(DATAIN_IPV6_2,
+ MdnsInet6AddressRecord.class)));
+ // Now update the response adding an address
+ final MdnsResponseDecoder decoder = new MdnsResponseDecoder(mClock, null);
+ final byte[] removedAddrResponse = makeResponsePacket(
+ List.of(DATAIN_PTR_1, DATAIN_SERVICE_1, DATAIN_IPV6_1));
+ final ArraySet<MdnsResponse> updatedResponses = decode(
+ decoder, removedAddrResponse, List.of(response));
+ assertEquals(1, updatedResponses.size());
+ assertEquals(1, updatedResponses.valueAt(0).getInet6AddressRecords().size());
+ assertEquals(parseNumericAddress("aabb:ccdd:1122:3344:a0b0:c0d0:1020:3040"),
+ updatedResponses.valueAt(0).getInet6AddressRecords().get(0).getInet6Address());
+ }
+
+ @Test
public void testDecodeWithChangeOnText() throws IOException {
MdnsResponse response = makeMdnsResponse(0, DATAIN_SERVICE_NAME_1, List.of(
new PacketAndRecordClass(DATAIN_PTR_1,
@@ -489,11 +553,12 @@
new PacketAndRecordClass(DATAIN_IPV4_1, MdnsInet4AddressRecord.class),
new PacketAndRecordClass(DATAIN_IPV6_1, MdnsInet6AddressRecord.class),
new PacketAndRecordClass(DATAIN_PTR_1, MdnsPointerRecord.class),
- new PacketAndRecordClass(DATAIN_SERVICE_2, MdnsServiceRecord.class),
+ new PacketAndRecordClass(DATAIN_SERVICE_1, MdnsServiceRecord.class),
new PacketAndRecordClass(DATAIN_TEXT_1, MdnsTextRecord.class));
// Create a two identical responses.
- MdnsResponse response = makeMdnsResponse(0, DATAIN_SERVICE_NAME_1, recordList);
+ MdnsResponse response = makeMdnsResponse(12L /* time */, DATAIN_SERVICE_NAME_1, recordList);
+ doReturn(34L).when(mClock).elapsedRealtime();
final MdnsResponseDecoder decoder = new MdnsResponseDecoder(mClock, null);
final byte[] identicalResponse = makeResponsePacket(
recordList.stream().map(p -> p.packetData).collect(Collectors.toList()));
@@ -578,6 +643,6 @@
return decoder.augmentResponses(parsedPacket,
existingResponses,
- MdnsSocket.INTERFACE_INDEX_UNSPECIFIED, mock(Network.class));
+ MdnsSocket.INTERFACE_INDEX_UNSPECIFIED, mock(Network.class)).first;
}
}
\ No newline at end of file
diff --git a/tests/unit/java/com/android/server/connectivity/mdns/MdnsResponseTests.java b/tests/unit/java/com/android/server/connectivity/mdns/MdnsResponseTests.java
index 3f5e7a1..3e189f1 100644
--- a/tests/unit/java/com/android/server/connectivity/mdns/MdnsResponseTests.java
+++ b/tests/unit/java/com/android/server/connectivity/mdns/MdnsResponseTests.java
@@ -95,24 +95,24 @@
}
}
- private MdnsResponse makeCompleteResponse(int recordsTtlMillis) {
+ private MdnsResponse makeCompleteResponse(int recordsTtlMillis, int receiptTimeMillis) {
final String[] hostname = new String[] { "MyHostname" };
final String[] serviceName = new String[] { "MyService", "_type", "_tcp", "local" };
final String[] serviceType = new String[] { "_type", "_tcp", "local" };
final MdnsResponse response = new MdnsResponse(/* now= */ 0, serviceName, INTERFACE_INDEX,
mNetwork);
- response.addPointerRecord(new MdnsPointerRecord(serviceType, 0L /* receiptTimeMillis */,
+ response.addPointerRecord(new MdnsPointerRecord(serviceType, receiptTimeMillis,
false /* cacheFlush */, recordsTtlMillis, serviceName));
- response.setServiceRecord(new MdnsServiceRecord(serviceName, 0L /* receiptTimeMillis */,
+ response.setServiceRecord(new MdnsServiceRecord(serviceName, receiptTimeMillis,
true /* cacheFlush */, recordsTtlMillis, 0 /* servicePriority */,
0 /* serviceWeight */, 0 /* servicePort */, hostname));
- response.setTextRecord(new MdnsTextRecord(serviceName, 0L /* receiptTimeMillis */,
+ response.setTextRecord(new MdnsTextRecord(serviceName, receiptTimeMillis,
true /* cacheFlush */, recordsTtlMillis, emptyList() /* entries */));
response.addInet4AddressRecord(new MdnsInetAddressRecord(
- hostname, 0L /* receiptTimeMillis */, true /* cacheFlush */,
+ hostname, receiptTimeMillis, true /* cacheFlush */,
recordsTtlMillis, parseNumericAddress("192.0.2.123")));
response.addInet6AddressRecord(new MdnsInetAddressRecord(
- hostname, 0L /* receiptTimeMillis */, true /* cacheFlush */,
+ hostname, receiptTimeMillis, true /* cacheFlush */,
recordsTtlMillis, parseNumericAddress("2001:db8::123")));
return response;
}
@@ -210,7 +210,7 @@
@Test
public void copyConstructor() {
- final MdnsResponse response = makeCompleteResponse(TEST_TTL_MS);
+ final MdnsResponse response = makeCompleteResponse(TEST_TTL_MS, 0 /* receiptTimeMillis */);
final MdnsResponse copy = new MdnsResponse(response);
assertEquals(response.getInet6AddressRecord(), copy.getInet6AddressRecord());
@@ -225,9 +225,15 @@
@Test
public void addRecords_noChange() {
- final MdnsResponse response = makeCompleteResponse(TEST_TTL_MS);
+ final MdnsResponse response = makeCompleteResponse(TEST_TTL_MS, 0 /* receiptTimeMillis */);
assertFalse(response.addPointerRecord(response.getPointerRecords().get(0)));
+ final String[] serviceName = new String[] { "MYSERVICE", "_TYPE", "_tcp", "local" };
+ final String[] serviceType = new String[] { "_TYPE", "_tcp", "local" };
+ MdnsPointerRecord pointerRecordCaseInsensitive =
+ new MdnsPointerRecord(serviceType, 0L /* receiptTimeMillis */,
+ false /* cacheFlush */, TEST_TTL_MS, serviceName);
+ assertFalse(response.addPointerRecord(pointerRecordCaseInsensitive));
assertFalse(response.addInet6AddressRecord(response.getInet6AddressRecord()));
assertFalse(response.addInet4AddressRecord(response.getInet4AddressRecord()));
assertFalse(response.setServiceRecord(response.getServiceRecord()));
@@ -236,8 +242,8 @@
@Test
public void addRecords_ttlChange() {
- final MdnsResponse response = makeCompleteResponse(TEST_TTL_MS);
- final MdnsResponse ttlZeroResponse = makeCompleteResponse(0);
+ final MdnsResponse response = makeCompleteResponse(TEST_TTL_MS, 0 /* receiptTimeMillis */);
+ final MdnsResponse ttlZeroResponse = makeCompleteResponse(0, 0 /* receiptTimeMillis */);
assertTrue(response.addPointerRecord(ttlZeroResponse.getPointerRecords().get(0)));
assertEquals(1, response.getPointerRecords().size());
@@ -270,4 +276,70 @@
// All records were replaced, not added
assertEquals(ttlZeroResponse.getRecords().size(), response.getRecords().size());
}
+
+ @Test
+ public void addRecords_receiptTimeChange() {
+ final MdnsResponse response = makeCompleteResponse(TEST_TTL_MS, 0 /* receiptTimeMillis */);
+ final MdnsResponse receiptTimeChangedResponse = makeCompleteResponse(TEST_TTL_MS,
+ 1 /* receiptTimeMillis */);
+
+ assertFalse(
+ response.addPointerRecord(receiptTimeChangedResponse.getPointerRecords().get(0)));
+ assertEquals(1, response.getPointerRecords().get(0).getReceiptTime());
+ assertTrue(response.getRecords().stream().anyMatch(r ->
+ r == response.getPointerRecords().get(0)));
+
+ assertFalse(
+ response.addInet6AddressRecord(receiptTimeChangedResponse.getInet6AddressRecord()));
+ assertEquals(1, response.getInet6AddressRecords().size());
+ assertEquals(1, response.getInet6AddressRecord().getReceiptTime());
+ assertTrue(response.getRecords().stream().anyMatch(r ->
+ r == response.getInet6AddressRecord()));
+
+ assertFalse(
+ response.addInet4AddressRecord(receiptTimeChangedResponse.getInet4AddressRecord()));
+ assertEquals(1, response.getInet4AddressRecords().size());
+ assertEquals(1, response.getInet4AddressRecord().getReceiptTime());
+ assertTrue(response.getRecords().stream().anyMatch(r ->
+ r == response.getInet4AddressRecord()));
+
+ assertFalse(response.setServiceRecord(receiptTimeChangedResponse.getServiceRecord()));
+ assertEquals(1, response.getServiceRecord().getReceiptTime());
+ assertTrue(response.getRecords().stream().anyMatch(r ->
+ r == response.getServiceRecord()));
+
+ assertFalse(response.setTextRecord(receiptTimeChangedResponse.getTextRecord()));
+ assertEquals(1, response.getTextRecord().getReceiptTime());
+ assertTrue(response.getRecords().stream().anyMatch(r ->
+ r == response.getTextRecord()));
+
+ // All records were replaced, not added
+ assertEquals(receiptTimeChangedResponse.getRecords().size(), response.getRecords().size());
+ }
+
+ @Test
+ public void dropUnmatchedAddressRecords_caseInsensitive() {
+
+ final String[] hostname = new String[] { "MyHostname" };
+ final String[] upperCaseHostName = new String[] { "MYHOSTNAME" };
+ final String[] serviceName = new String[] { "MyService", "_type", "_tcp", "local" };
+ final String[] serviceType = new String[] { "_type", "_tcp", "local" };
+ final MdnsResponse response = new MdnsResponse(/* now= */ 0, serviceName, INTERFACE_INDEX,
+ mNetwork);
+ response.addPointerRecord(new MdnsPointerRecord(serviceType, 0L /* receiptTimeMillis */,
+ false /* cacheFlush */, TEST_TTL_MS, serviceName));
+ response.setServiceRecord(new MdnsServiceRecord(serviceName, 0L /* receiptTimeMillis */,
+ true /* cacheFlush */, TEST_TTL_MS, 0 /* servicePriority */,
+ 0 /* serviceWeight */, 0 /* servicePort */, hostname));
+ response.setTextRecord(new MdnsTextRecord(serviceName, 0L /* receiptTimeMillis */,
+ true /* cacheFlush */, TEST_TTL_MS, emptyList() /* entries */));
+ response.addInet4AddressRecord(new MdnsInetAddressRecord(
+ upperCaseHostName , 0L /* receiptTimeMillis */, true /* cacheFlush */,
+ TEST_TTL_MS, parseNumericAddress("192.0.2.123")));
+ response.addInet6AddressRecord(new MdnsInetAddressRecord(
+ upperCaseHostName, 0L /* receiptTimeMillis */, true /* cacheFlush */,
+ TEST_TTL_MS, parseNumericAddress("2001:db8::123")));
+
+ assertFalse(response.dropUnmatchedAddressRecords());
+ }
}
\ No newline at end of file
diff --git a/tests/unit/java/com/android/server/connectivity/mdns/MdnsServiceCacheTest.kt b/tests/unit/java/com/android/server/connectivity/mdns/MdnsServiceCacheTest.kt
new file mode 100644
index 0000000..f091eea
--- /dev/null
+++ b/tests/unit/java/com/android/server/connectivity/mdns/MdnsServiceCacheTest.kt
@@ -0,0 +1,136 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License")
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.connectivity.mdns
+
+import android.net.Network
+import android.os.Build
+import android.os.Handler
+import android.os.HandlerThread
+import com.android.testutils.DevSdkIgnoreRule
+import com.android.testutils.DevSdkIgnoreRunner
+import java.util.concurrent.CompletableFuture
+import java.util.concurrent.TimeUnit
+import kotlin.test.assertNotNull
+import org.junit.After
+import org.junit.Assert.assertEquals
+import org.junit.Assert.assertNull
+import org.junit.Assert.assertTrue
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.mockito.Mockito.mock
+
+private const val SERVICE_NAME_1 = "service-instance-1"
+private const val SERVICE_NAME_2 = "service-instance-2"
+private const val SERVICE_TYPE_1 = "_test1._tcp.local"
+private const val SERVICE_TYPE_2 = "_test2._tcp.local"
+private const val INTERFACE_INDEX = 999
+private const val DEFAULT_TIMEOUT_MS = 2000L
+
+@RunWith(DevSdkIgnoreRunner::class)
+@DevSdkIgnoreRule.IgnoreUpTo(Build.VERSION_CODES.S_V2)
+class MdnsServiceCacheTest {
+ private val network = mock(Network::class.java)
+ private val thread = HandlerThread(MdnsServiceCacheTest::class.simpleName)
+ private val handler by lazy {
+ Handler(thread.looper)
+ }
+ private val serviceCache by lazy {
+ MdnsServiceCache(thread.looper)
+ }
+
+ @Before
+ fun setUp() {
+ thread.start()
+ }
+
+ @After
+ fun tearDown() {
+ thread.quitSafely()
+ }
+
+ private fun <T> runningOnHandlerAndReturn(functor: (() -> T)): T {
+ val future = CompletableFuture<T>()
+ handler.post {
+ future.complete(functor())
+ }
+ return future.get(DEFAULT_TIMEOUT_MS, TimeUnit.MILLISECONDS)
+ }
+
+ private fun addOrUpdateService(serviceType: String, network: Network, service: MdnsResponse):
+ Unit = runningOnHandlerAndReturn {
+ serviceCache.addOrUpdateService(serviceType, network, service) }
+
+ private fun removeService(serviceName: String, serviceType: String, network: Network):
+ Unit = runningOnHandlerAndReturn {
+ serviceCache.removeService(serviceName, serviceType, network) }
+
+ private fun getService(serviceName: String, serviceType: String, network: Network):
+ MdnsResponse? = runningOnHandlerAndReturn {
+ serviceCache.getCachedService(serviceName, serviceType, network) }
+
+ private fun getServices(serviceType: String, network: Network): List<MdnsResponse> =
+ runningOnHandlerAndReturn { serviceCache.getCachedServices(serviceType, network) }
+
+ @Test
+ fun testAddAndRemoveService() {
+ addOrUpdateService(SERVICE_TYPE_1, network, createResponse(SERVICE_NAME_1, SERVICE_TYPE_1))
+ var response = getService(SERVICE_NAME_1, SERVICE_TYPE_1, network)
+ assertNotNull(response)
+ assertEquals(SERVICE_NAME_1, response.serviceInstanceName)
+ removeService(SERVICE_NAME_1, SERVICE_TYPE_1, network)
+ response = getService(SERVICE_NAME_1, SERVICE_TYPE_1, network)
+ assertNull(response)
+ }
+
+ @Test
+ fun testGetCachedServices_multipleServiceTypes() {
+ addOrUpdateService(SERVICE_TYPE_1, network, createResponse(SERVICE_NAME_1, SERVICE_TYPE_1))
+ addOrUpdateService(SERVICE_TYPE_1, network, createResponse(SERVICE_NAME_2, SERVICE_TYPE_1))
+ addOrUpdateService(SERVICE_TYPE_2, network, createResponse(SERVICE_NAME_2, SERVICE_TYPE_2))
+
+ val responses1 = getServices(SERVICE_TYPE_1, network)
+ assertEquals(2, responses1.size)
+ assertTrue(responses1.stream().anyMatch { response ->
+ response.serviceInstanceName == SERVICE_NAME_1
+ })
+ assertTrue(responses1.any { response ->
+ response.serviceInstanceName == SERVICE_NAME_2
+ })
+ val responses2 = getServices(SERVICE_TYPE_2, network)
+ assertEquals(1, responses2.size)
+ assertTrue(responses2.any { response ->
+ response.serviceInstanceName == SERVICE_NAME_2
+ })
+
+ removeService(SERVICE_NAME_2, SERVICE_TYPE_1, network)
+ val responses3 = getServices(SERVICE_TYPE_1, network)
+ assertEquals(1, responses3.size)
+ assertTrue(responses3.any { response ->
+ response.serviceInstanceName == SERVICE_NAME_1
+ })
+ val responses4 = getServices(SERVICE_TYPE_2, network)
+ assertEquals(1, responses4.size)
+ assertTrue(responses4.any { response ->
+ response.serviceInstanceName == SERVICE_NAME_2
+ })
+ }
+
+ private fun createResponse(serviceInstanceName: String, serviceType: String) = MdnsResponse(
+ 0 /* now */, "$serviceInstanceName.$serviceType".split(".").toTypedArray(),
+ INTERFACE_INDEX, network)
+}
diff --git a/tests/unit/java/com/android/server/connectivity/mdns/MdnsServiceTypeClientTests.java b/tests/unit/java/com/android/server/connectivity/mdns/MdnsServiceTypeClientTests.java
index d9fa10f..03e893f 100644
--- a/tests/unit/java/com/android/server/connectivity/mdns/MdnsServiceTypeClientTests.java
+++ b/tests/unit/java/com/android/server/connectivity/mdns/MdnsServiceTypeClientTests.java
@@ -21,9 +21,11 @@
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.argThat;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.doReturn;
@@ -41,6 +43,8 @@
import android.net.Network;
import android.text.TextUtils;
+import com.android.net.module.util.CollectionUtils;
+import com.android.net.module.util.SharedLog;
import com.android.server.connectivity.mdns.MdnsServiceInfo.TextEntry;
import com.android.server.connectivity.mdns.MdnsServiceTypeClient.QueryTaskConfig;
import com.android.testutils.DevSdkIgnoreRule;
@@ -51,6 +55,7 @@
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
+import org.mockito.ArgumentMatcher;
import org.mockito.Captor;
import org.mockito.InOrder;
import org.mockito.Mock;
@@ -86,6 +91,7 @@
private static final long TEST_TTL = 120000L;
private static final long TEST_ELAPSED_REALTIME = 123L;
+ private static final long TEST_TIMEOUT_MS = 10_000L;
@Mock
private MdnsServiceBrowserListener mockListenerOne;
@@ -99,6 +105,8 @@
private Network mockNetwork;
@Mock
private MdnsResponseDecoder.Clock mockDecoderClock;
+ @Mock
+ private SharedLog mockSharedLog;
@Captor
private ArgumentCaptor<MdnsServiceInfo> serviceInfoCaptor;
@@ -110,6 +118,7 @@
private FakeExecutor currentThreadExecutor = new FakeExecutor();
private MdnsServiceTypeClient client;
+ private SocketKey socketKey;
@Before
@SuppressWarnings("DoNotMock")
@@ -120,6 +129,7 @@
expectedIPv4Packets = new DatagramPacket[16];
expectedIPv6Packets = new DatagramPacket[16];
expectedSendFutures = new ScheduledFuture<?>[16];
+ socketKey = new SocketKey(mockNetwork, INTERFACE_INDEX);
for (int i = 0; i < expectedSendFutures.length; ++i) {
expectedIPv4Packets[i] = new DatagramPacket(buf, 0 /* offset */, 5 /* length */,
@@ -166,7 +176,7 @@
client =
new MdnsServiceTypeClient(SERVICE_TYPE, mockSocketClient, currentThreadExecutor,
- mockDecoderClock) {
+ mockDecoderClock, socketKey, mockSharedLog) {
@Override
MdnsPacketWriter createMdnsPacketWriter() {
return mockPacketWriter;
@@ -317,7 +327,8 @@
MdnsSearchOptions searchOptions =
MdnsSearchOptions.newBuilder().addSubtype("12345").setIsPassiveMode(false).build();
QueryTaskConfig config = new QueryTaskConfig(
- searchOptions.getSubtypes(), searchOptions.isPassiveMode(), 1, mockNetwork);
+ searchOptions.getSubtypes(), searchOptions.isPassiveMode(),
+ false /* onlyUseIpv6OnIpv6OnlyNetworks */, 1, socketKey);
// This is the first query. We will ask for unicast response.
assertTrue(config.expectUnicastResponse);
@@ -346,7 +357,8 @@
MdnsSearchOptions searchOptions =
MdnsSearchOptions.newBuilder().addSubtype("12345").setIsPassiveMode(false).build();
QueryTaskConfig config = new QueryTaskConfig(
- searchOptions.getSubtypes(), searchOptions.isPassiveMode(), 1, mockNetwork);
+ searchOptions.getSubtypes(), searchOptions.isPassiveMode(),
+ false /* onlyUseIpv6OnIpv6OnlyNetworks */, 1, socketKey);
// This is the first query. We will ask for unicast response.
assertTrue(config.expectUnicastResponse);
@@ -371,9 +383,7 @@
}
@Test
- @Ignore("MdnsConfigs is not configurable currently.")
public void testIfPreviousTaskIsCanceledWhenNewSessionStarts() {
- //MdnsConfigsFlagsImpl.useSessionIdToScheduleMdnsTask.override(true);
MdnsSearchOptions searchOptions =
MdnsSearchOptions.newBuilder().addSubtype("12345").setIsPassiveMode(true).build();
client.startSendAndReceive(mockListenerOne, searchOptions);
@@ -419,10 +429,37 @@
assertNull(currentThreadExecutor.getAndClearLastScheduledRunnable());
}
+ @Test
+ public void testQueryScheduledWhenAnsweredFromCache() {
+ final MdnsSearchOptions searchOptions = MdnsSearchOptions.getDefaultOptions();
+ client.startSendAndReceive(mockListenerOne, searchOptions);
+ assertNotNull(currentThreadExecutor.getAndClearSubmittedRunnable());
+
+ client.processResponse(createResponse(
+ "service-instance-1", "192.0.2.123", 5353,
+ SERVICE_TYPE_LABELS,
+ Collections.emptyMap(), TEST_TTL), socketKey);
+
+ verify(mockListenerOne).onServiceNameDiscovered(any());
+ verify(mockListenerOne).onServiceFound(any());
+
+ // File another identical query
+ client.startSendAndReceive(mockListenerTwo, searchOptions);
+
+ verify(mockListenerTwo).onServiceNameDiscovered(any());
+ verify(mockListenerTwo).onServiceFound(any());
+
+ // This time no query is submitted, only scheduled
+ assertNull(currentThreadExecutor.getAndClearSubmittedRunnable());
+ assertNotNull(currentThreadExecutor.getAndClearLastScheduledRunnable());
+ // This just skips the first query of the first burst
+ assertEquals(MdnsConfigs.timeBetweenQueriesInBurstMs(),
+ currentThreadExecutor.getAndClearLastScheduledDelayInMs());
+ }
+
private static void verifyServiceInfo(MdnsServiceInfo serviceInfo, String serviceName,
String[] serviceType, List<String> ipv4Addresses, List<String> ipv6Addresses, int port,
- List<String> subTypes, Map<String, String> attributes, int interfaceIndex,
- Network network) {
+ List<String> subTypes, Map<String, String> attributes, SocketKey socketKey) {
assertEquals(serviceName, serviceInfo.getServiceInstanceName());
assertArrayEquals(serviceType, serviceInfo.getServiceType());
assertEquals(ipv4Addresses, serviceInfo.getIpv4Addresses());
@@ -433,8 +470,8 @@
assertTrue(attributes.containsKey(key));
assertEquals(attributes.get(key), serviceInfo.getAttributeByKey(key));
}
- assertEquals(interfaceIndex, serviceInfo.getInterfaceIndex());
- assertEquals(network, serviceInfo.getNetwork());
+ assertEquals(socketKey.getInterfaceIndex(), serviceInfo.getInterfaceIndex());
+ assertEquals(socketKey.getNetwork(), serviceInfo.getNetwork());
}
@Test
@@ -444,18 +481,17 @@
client.processResponse(createResponse(
"service-instance-1", null /* host */, 0 /* port */,
SERVICE_TYPE_LABELS,
- Collections.emptyMap(), TEST_TTL), INTERFACE_INDEX, mockNetwork);
+ Collections.emptyMap(), TEST_TTL), socketKey);
verify(mockListenerOne).onServiceNameDiscovered(serviceInfoCaptor.capture());
verifyServiceInfo(serviceInfoCaptor.getAllValues().get(0),
"service-instance-1",
SERVICE_TYPE_LABELS,
- /* ipv4Address= */ List.of(),
- /* ipv6Address= */ List.of(),
+ /* ipv4Addresses= */ List.of(),
+ /* ipv6Addresses= */ List.of(),
/* port= */ 0,
/* subTypes= */ List.of(),
Collections.emptyMap(),
- INTERFACE_INDEX,
- mockNetwork);
+ socketKey);
verify(mockListenerOne, never()).onServiceFound(any(MdnsServiceInfo.class));
verify(mockListenerOne, never()).onServiceUpdated(any(MdnsServiceInfo.class));
@@ -470,14 +506,14 @@
client.processResponse(createResponse(
"service-instance-1", ipV4Address, 5353,
/* subtype= */ "ABCDE",
- Collections.emptyMap(), TEST_TTL), /* interfaceIndex= */ 20, mockNetwork);
+ Collections.emptyMap(), TEST_TTL), socketKey);
// Process a second response with a different port and updated text attributes.
client.processResponse(createResponse(
- "service-instance-1", ipV4Address, 5354,
- /* subtype= */ "ABCDE",
- Collections.singletonMap("key", "value"), TEST_TTL),
- /* interfaceIndex= */ 20, mockNetwork);
+ "service-instance-1", ipV4Address, 5354,
+ /* subtype= */ "ABCDE",
+ Collections.singletonMap("key", "value"), TEST_TTL),
+ socketKey);
// Verify onServiceNameDiscovered was called once for the initial response.
verify(mockListenerOne).onServiceNameDiscovered(serviceInfoCaptor.capture());
@@ -489,8 +525,7 @@
5353 /* port */,
Collections.singletonList("ABCDE") /* subTypes */,
Collections.singletonMap("key", null) /* attributes */,
- 20 /* interfaceIndex */,
- mockNetwork);
+ socketKey);
// Verify onServiceFound was called once for the initial response.
verify(mockListenerOne).onServiceFound(serviceInfoCaptor.capture());
@@ -500,8 +535,8 @@
assertEquals(initialServiceInfo.getPort(), 5353);
assertEquals(initialServiceInfo.getSubtypes(), Collections.singletonList("ABCDE"));
assertNull(initialServiceInfo.getAttributeByKey("key"));
- assertEquals(initialServiceInfo.getInterfaceIndex(), 20);
- assertEquals(mockNetwork, initialServiceInfo.getNetwork());
+ assertEquals(socketKey.getInterfaceIndex(), initialServiceInfo.getInterfaceIndex());
+ assertEquals(socketKey.getNetwork(), initialServiceInfo.getNetwork());
// Verify onServiceUpdated was called once for the second response.
verify(mockListenerOne).onServiceUpdated(serviceInfoCaptor.capture());
@@ -512,8 +547,8 @@
assertTrue(updatedServiceInfo.hasSubtypes());
assertEquals(updatedServiceInfo.getSubtypes(), Collections.singletonList("ABCDE"));
assertEquals(updatedServiceInfo.getAttributeByKey("key"), "value");
- assertEquals(updatedServiceInfo.getInterfaceIndex(), 20);
- assertEquals(mockNetwork, updatedServiceInfo.getNetwork());
+ assertEquals(socketKey.getInterfaceIndex(), updatedServiceInfo.getInterfaceIndex());
+ assertEquals(socketKey.getNetwork(), updatedServiceInfo.getNetwork());
}
@Test
@@ -525,14 +560,14 @@
client.processResponse(createResponse(
"service-instance-1", ipV6Address, 5353,
/* subtype= */ "ABCDE",
- Collections.emptyMap(), TEST_TTL), /* interfaceIndex= */ 20, mockNetwork);
+ Collections.emptyMap(), TEST_TTL), socketKey);
// Process a second response with a different port and updated text attributes.
client.processResponse(createResponse(
- "service-instance-1", ipV6Address, 5354,
- /* subtype= */ "ABCDE",
- Collections.singletonMap("key", "value"), TEST_TTL),
- /* interfaceIndex= */ 20, mockNetwork);
+ "service-instance-1", ipV6Address, 5354,
+ /* subtype= */ "ABCDE",
+ Collections.singletonMap("key", "value"), TEST_TTL),
+ socketKey);
// Verify onServiceNameDiscovered was called once for the initial response.
verify(mockListenerOne).onServiceNameDiscovered(serviceInfoCaptor.capture());
@@ -544,8 +579,7 @@
5353 /* port */,
Collections.singletonList("ABCDE") /* subTypes */,
Collections.singletonMap("key", null) /* attributes */,
- 20 /* interfaceIndex */,
- mockNetwork);
+ socketKey);
// Verify onServiceFound was called once for the initial response.
verify(mockListenerOne).onServiceFound(serviceInfoCaptor.capture());
@@ -555,8 +589,8 @@
assertEquals(initialServiceInfo.getPort(), 5353);
assertEquals(initialServiceInfo.getSubtypes(), Collections.singletonList("ABCDE"));
assertNull(initialServiceInfo.getAttributeByKey("key"));
- assertEquals(initialServiceInfo.getInterfaceIndex(), 20);
- assertEquals(mockNetwork, initialServiceInfo.getNetwork());
+ assertEquals(socketKey.getInterfaceIndex(), initialServiceInfo.getInterfaceIndex());
+ assertEquals(socketKey.getNetwork(), initialServiceInfo.getNetwork());
// Verify onServiceUpdated was called once for the second response.
verify(mockListenerOne).onServiceUpdated(serviceInfoCaptor.capture());
@@ -567,8 +601,8 @@
assertTrue(updatedServiceInfo.hasSubtypes());
assertEquals(updatedServiceInfo.getSubtypes(), Collections.singletonList("ABCDE"));
assertEquals(updatedServiceInfo.getAttributeByKey("key"), "value");
- assertEquals(updatedServiceInfo.getInterfaceIndex(), 20);
- assertEquals(mockNetwork, updatedServiceInfo.getNetwork());
+ assertEquals(socketKey.getInterfaceIndex(), updatedServiceInfo.getInterfaceIndex());
+ assertEquals(socketKey.getNetwork(), updatedServiceInfo.getNetwork());
}
private void verifyServiceRemovedNoCallback(MdnsServiceBrowserListener listener) {
@@ -577,17 +611,17 @@
}
private void verifyServiceRemovedCallback(MdnsServiceBrowserListener listener,
- String serviceName, String[] serviceType, int interfaceIndex, Network network) {
+ String serviceName, String[] serviceType, SocketKey socketKey) {
verify(listener).onServiceRemoved(argThat(
info -> serviceName.equals(info.getServiceInstanceName())
&& Arrays.equals(serviceType, info.getServiceType())
- && info.getInterfaceIndex() == interfaceIndex
- && network.equals(info.getNetwork())));
+ && info.getInterfaceIndex() == socketKey.getInterfaceIndex()
+ && socketKey.getNetwork().equals(info.getNetwork())));
verify(listener).onServiceNameRemoved(argThat(
info -> serviceName.equals(info.getServiceInstanceName())
&& Arrays.equals(serviceType, info.getServiceType())
- && info.getInterfaceIndex() == interfaceIndex
- && network.equals(info.getNetwork())));
+ && info.getInterfaceIndex() == socketKey.getInterfaceIndex()
+ && socketKey.getNetwork().equals(info.getNetwork())));
}
@Test
@@ -601,12 +635,12 @@
client.processResponse(createResponse(
serviceName, ipV6Address, 5353,
SERVICE_TYPE_LABELS,
- Collections.emptyMap(), TEST_TTL), INTERFACE_INDEX, mockNetwork);
+ Collections.emptyMap(), TEST_TTL), socketKey);
client.processResponse(createResponse(
"goodbye-service", ipV6Address, 5353,
SERVICE_TYPE_LABELS,
- Collections.emptyMap(), /* ptrTtlMillis= */ 0L), INTERFACE_INDEX, mockNetwork);
+ Collections.emptyMap(), /* ptrTtlMillis= */ 0L), socketKey);
// Verify removed callback won't be called if the service is not existed.
verifyServiceRemovedNoCallback(mockListenerOne);
@@ -616,11 +650,11 @@
client.processResponse(createResponse(
serviceName, ipV6Address, 5353,
SERVICE_TYPE_LABELS,
- Collections.emptyMap(), 0L), INTERFACE_INDEX, mockNetwork);
+ Collections.emptyMap(), 0L), socketKey);
verifyServiceRemovedCallback(
- mockListenerOne, serviceName, SERVICE_TYPE_LABELS, INTERFACE_INDEX, mockNetwork);
+ mockListenerOne, serviceName, SERVICE_TYPE_LABELS, socketKey);
verifyServiceRemovedCallback(
- mockListenerTwo, serviceName, SERVICE_TYPE_LABELS, INTERFACE_INDEX, mockNetwork);
+ mockListenerTwo, serviceName, SERVICE_TYPE_LABELS, socketKey);
}
@Test
@@ -629,7 +663,7 @@
client.processResponse(createResponse(
"service-instance-1", "192.168.1.1", 5353,
/* subtype= */ "ABCDE",
- Collections.emptyMap(), TEST_TTL), INTERFACE_INDEX, mockNetwork);
+ Collections.emptyMap(), TEST_TTL), socketKey);
client.startSendAndReceive(mockListenerOne, MdnsSearchOptions.getDefaultOptions());
@@ -643,8 +677,7 @@
5353 /* port */,
Collections.singletonList("ABCDE") /* subTypes */,
Collections.singletonMap("key", null) /* attributes */,
- INTERFACE_INDEX,
- mockNetwork);
+ socketKey);
// Verify onServiceFound was called once for the existing response.
verify(mockListenerOne).onServiceFound(serviceInfoCaptor.capture());
@@ -659,7 +692,7 @@
client.processResponse(createResponse(
"service-instance-1", "192.168.1.1", 5353,
SERVICE_TYPE_LABELS,
- Collections.emptyMap(), /* ptrTtlMillis= */ 0L), INTERFACE_INDEX, mockNetwork);
+ Collections.emptyMap(), /* ptrTtlMillis= */ 0L), socketKey);
client.startSendAndReceive(mockListenerTwo, MdnsSearchOptions.getDefaultOptions());
@@ -670,50 +703,26 @@
}
@Test
- public void processResponse_notAllowRemoveSearch_shouldNotRemove() throws Exception {
- final String serviceInstanceName = "service-instance-1";
- client.startSendAndReceive(
- mockListenerOne,
- MdnsSearchOptions.newBuilder().build());
- Runnable firstMdnsTask = currentThreadExecutor.getAndClearSubmittedRunnable();
-
- // Process the initial response.
- client.processResponse(createResponse(
- serviceInstanceName, "192.168.1.1", 5353, /* subtype= */ "ABCDE",
- Collections.emptyMap(), TEST_TTL), INTERFACE_INDEX, mockNetwork);
-
- // Clear the scheduled runnable.
- currentThreadExecutor.getAndClearLastScheduledRunnable();
-
- // Simulate the case where the response is after TTL.
- doReturn(TEST_ELAPSED_REALTIME + TEST_TTL + 1L).when(mockDecoderClock).elapsedRealtime();
- firstMdnsTask.run();
-
- // Verify removed callback was not called.
- verifyServiceRemovedNoCallback(mockListenerOne);
- }
-
- @Test
- @Ignore("MdnsConfigs is not configurable currently.")
- public void processResponse_allowSearchOptionsToRemoveExpiredService_shouldRemove()
+ public void processResponse_searchOptionsEnableServiceRemoval_shouldRemove()
throws Exception {
- //MdnsConfigsFlagsImpl.allowSearchOptionsToRemoveExpiredService.override(true);
final String serviceInstanceName = "service-instance-1";
client =
new MdnsServiceTypeClient(SERVICE_TYPE, mockSocketClient, currentThreadExecutor,
- mockDecoderClock) {
+ mockDecoderClock, socketKey, mockSharedLog) {
@Override
MdnsPacketWriter createMdnsPacketWriter() {
return mockPacketWriter;
}
};
- client.startSendAndReceive(mockListenerOne, MdnsSearchOptions.getDefaultOptions());
+ MdnsSearchOptions searchOptions = MdnsSearchOptions.newBuilder().setRemoveExpiredService(
+ true).build();
+ client.startSendAndReceive(mockListenerOne, searchOptions);
Runnable firstMdnsTask = currentThreadExecutor.getAndClearSubmittedRunnable();
// Process the initial response.
client.processResponse(createResponse(
serviceInstanceName, "192.168.1.1", 5353, /* subtype= */ "ABCDE",
- Collections.emptyMap(), TEST_TTL), INTERFACE_INDEX, mockNetwork);
+ Collections.emptyMap(), TEST_TTL), socketKey);
// Clear the scheduled runnable.
currentThreadExecutor.getAndClearLastScheduledRunnable();
@@ -730,8 +739,8 @@
firstMdnsTask.run();
// Verify removed callback was called.
- verifyServiceRemovedCallback(mockListenerOne, serviceInstanceName, SERVICE_TYPE_LABELS,
- INTERFACE_INDEX, mockNetwork);
+ verifyServiceRemovedCallback(
+ mockListenerOne, serviceInstanceName, SERVICE_TYPE_LABELS, socketKey);
}
@Test
@@ -740,7 +749,7 @@
final String serviceInstanceName = "service-instance-1";
client =
new MdnsServiceTypeClient(SERVICE_TYPE, mockSocketClient, currentThreadExecutor,
- mockDecoderClock) {
+ mockDecoderClock, socketKey, mockSharedLog) {
@Override
MdnsPacketWriter createMdnsPacketWriter() {
return mockPacketWriter;
@@ -752,7 +761,7 @@
// Process the initial response.
client.processResponse(createResponse(
serviceInstanceName, "192.168.1.1", 5353, /* subtype= */ "ABCDE",
- Collections.emptyMap(), TEST_TTL), INTERFACE_INDEX, mockNetwork);
+ Collections.emptyMap(), TEST_TTL), socketKey);
// Clear the scheduled runnable.
currentThreadExecutor.getAndClearLastScheduledRunnable();
@@ -773,7 +782,7 @@
final String serviceInstanceName = "service-instance-1";
client =
new MdnsServiceTypeClient(SERVICE_TYPE, mockSocketClient, currentThreadExecutor,
- mockDecoderClock) {
+ mockDecoderClock, socketKey, mockSharedLog) {
@Override
MdnsPacketWriter createMdnsPacketWriter() {
return mockPacketWriter;
@@ -785,7 +794,7 @@
// Process the initial response.
client.processResponse(createResponse(
serviceInstanceName, "192.168.1.1", 5353, /* subtype= */ "ABCDE",
- Collections.emptyMap(), TEST_TTL), INTERFACE_INDEX, mockNetwork);
+ Collections.emptyMap(), TEST_TTL), socketKey);
// Clear the scheduled runnable.
currentThreadExecutor.getAndClearLastScheduledRunnable();
@@ -795,8 +804,8 @@
firstMdnsTask.run();
// Verify removed callback was called.
- verifyServiceRemovedCallback(mockListenerOne, serviceInstanceName, SERVICE_TYPE_LABELS,
- INTERFACE_INDEX, mockNetwork);
+ verifyServiceRemovedCallback(
+ mockListenerOne, serviceInstanceName, SERVICE_TYPE_LABELS, socketKey);
}
@Test
@@ -811,23 +820,23 @@
final String subtype = "ABCDE";
client.processResponse(createResponse(
serviceName, null, 5353, subtype,
- Collections.emptyMap(), TEST_TTL), INTERFACE_INDEX, mockNetwork);
+ Collections.emptyMap(), TEST_TTL), socketKey);
// Process a second response which has ip address to make response become complete.
client.processResponse(createResponse(
serviceName, ipV4Address, 5353, subtype,
- Collections.emptyMap(), TEST_TTL), INTERFACE_INDEX, mockNetwork);
+ Collections.emptyMap(), TEST_TTL), socketKey);
// Process a third response with a different ip address, port and updated text attributes.
client.processResponse(createResponse(
serviceName, ipV6Address, 5354, subtype,
- Collections.singletonMap("key", "value"), TEST_TTL), INTERFACE_INDEX, mockNetwork);
+ Collections.singletonMap("key", "value"), TEST_TTL), socketKey);
// Process the last response which is goodbye message (with the main type, not subtype).
client.processResponse(createResponse(
- serviceName, ipV6Address, 5354, SERVICE_TYPE_LABELS,
- Collections.singletonMap("key", "value"), /* ptrTtlMillis= */ 0L),
- INTERFACE_INDEX, mockNetwork);
+ serviceName, ipV6Address, 5354, SERVICE_TYPE_LABELS,
+ Collections.singletonMap("key", "value"), /* ptrTtlMillis= */ 0L),
+ socketKey);
// Verify onServiceNameDiscovered was first called for the initial response.
inOrder.verify(mockListenerOne).onServiceNameDiscovered(serviceInfoCaptor.capture());
@@ -839,8 +848,7 @@
5353 /* port */,
Collections.singletonList(subtype) /* subTypes */,
Collections.singletonMap("key", null) /* attributes */,
- INTERFACE_INDEX,
- mockNetwork);
+ socketKey);
// Verify onServiceFound was second called for the second response.
inOrder.verify(mockListenerOne).onServiceFound(serviceInfoCaptor.capture());
@@ -852,8 +860,7 @@
5353 /* port */,
Collections.singletonList(subtype) /* subTypes */,
Collections.singletonMap("key", null) /* attributes */,
- INTERFACE_INDEX,
- mockNetwork);
+ socketKey);
// Verify onServiceUpdated was third called for the third response.
inOrder.verify(mockListenerOne).onServiceUpdated(serviceInfoCaptor.capture());
@@ -865,8 +872,7 @@
5354 /* port */,
Collections.singletonList(subtype) /* subTypes */,
Collections.singletonMap("key", "value") /* attributes */,
- INTERFACE_INDEX,
- mockNetwork);
+ socketKey);
// Verify onServiceRemoved was called for the last response.
inOrder.verify(mockListenerOne).onServiceRemoved(serviceInfoCaptor.capture());
@@ -878,8 +884,7 @@
5354 /* port */,
Collections.singletonList("ABCDE") /* subTypes */,
Collections.singletonMap("key", "value") /* attributes */,
- INTERFACE_INDEX,
- mockNetwork);
+ socketKey);
// Verify onServiceNameRemoved was called for the last response.
inOrder.verify(mockListenerOne).onServiceNameRemoved(serviceInfoCaptor.capture());
@@ -891,13 +896,13 @@
5354 /* port */,
Collections.singletonList("ABCDE") /* subTypes */,
Collections.singletonMap("key", "value") /* attributes */,
- INTERFACE_INDEX,
- mockNetwork);
+ socketKey);
}
@Test
public void testProcessResponse_Resolve() throws Exception {
- client = new MdnsServiceTypeClient(SERVICE_TYPE, mockSocketClient, currentThreadExecutor);
+ client = new MdnsServiceTypeClient(
+ SERVICE_TYPE, mockSocketClient, currentThreadExecutor, socketKey, mockSharedLog);
final String instanceName = "service-instance";
final String[] hostname = new String[] { "testhost "};
@@ -915,20 +920,16 @@
ArgumentCaptor.forClass(DatagramPacket.class);
currentThreadExecutor.getAndClearLastScheduledRunnable().run();
// Send twice for IPv4 and IPv6
- inOrder.verify(mockSocketClient, times(2)).sendUnicastPacket(srvTxtQueryCaptor.capture(),
- eq(null) /* network */);
+ inOrder.verify(mockSocketClient, times(2)).sendPacketRequestingUnicastResponse(
+ srvTxtQueryCaptor.capture(),
+ eq(socketKey), eq(false));
final MdnsPacket srvTxtQueryPacket = MdnsPacket.parse(
new MdnsPacketReader(srvTxtQueryCaptor.getValue()));
- final List<MdnsRecord> srvTxtQuestions = srvTxtQueryPacket.questions;
- final String[] serviceName = Stream.concat(Stream.of(instanceName),
- Arrays.stream(SERVICE_TYPE_LABELS)).toArray(String[]::new);
- assertFalse(srvTxtQuestions.stream().anyMatch(q -> q.getType() == MdnsRecord.TYPE_PTR));
- assertTrue(srvTxtQuestions.stream().anyMatch(q ->
- q.getType() == MdnsRecord.TYPE_SRV && Arrays.equals(q.name, serviceName)));
- assertTrue(srvTxtQuestions.stream().anyMatch(q ->
- q.getType() == MdnsRecord.TYPE_TXT && Arrays.equals(q.name, serviceName)));
+ final String[] serviceName = getTestServiceName(instanceName);
+ assertFalse(hasQuestion(srvTxtQueryPacket, MdnsRecord.TYPE_PTR));
+ assertTrue(hasQuestion(srvTxtQueryPacket, MdnsRecord.TYPE_ANY, serviceName));
// Process a response with SRV+TXT
final MdnsPacket srvTxtResponse = new MdnsPacket(
@@ -944,22 +945,20 @@
Collections.emptyList() /* authorityRecords */,
Collections.emptyList() /* additionalRecords */);
- client.processResponse(srvTxtResponse, INTERFACE_INDEX, mockNetwork);
+ client.processResponse(srvTxtResponse, socketKey);
// Expect a query for A/AAAA
final ArgumentCaptor<DatagramPacket> addressQueryCaptor =
ArgumentCaptor.forClass(DatagramPacket.class);
currentThreadExecutor.getAndClearLastScheduledRunnable().run();
- inOrder.verify(mockSocketClient, times(2)).sendMulticastPacket(addressQueryCaptor.capture(),
- eq(null) /* network */);
+ inOrder.verify(mockSocketClient, times(2)).sendPacketRequestingMulticastResponse(
+ addressQueryCaptor.capture(),
+ eq(socketKey), eq(false));
final MdnsPacket addressQueryPacket = MdnsPacket.parse(
new MdnsPacketReader(addressQueryCaptor.getValue()));
- final List<MdnsRecord> addressQueryQuestions = addressQueryPacket.questions;
- assertTrue(addressQueryQuestions.stream().anyMatch(q ->
- q.getType() == MdnsRecord.TYPE_A && Arrays.equals(q.name, hostname)));
- assertTrue(addressQueryQuestions.stream().anyMatch(q ->
- q.getType() == MdnsRecord.TYPE_AAAA && Arrays.equals(q.name, hostname)));
+ assertTrue(hasQuestion(addressQueryPacket, MdnsRecord.TYPE_A, hostname));
+ assertTrue(hasQuestion(addressQueryPacket, MdnsRecord.TYPE_AAAA, hostname));
// Process a response with address records
final MdnsPacket addressResponse = new MdnsPacket(
@@ -976,7 +975,7 @@
Collections.emptyList() /* additionalRecords */);
inOrder.verify(mockListenerOne, never()).onServiceNameDiscovered(any());
- client.processResponse(addressResponse, INTERFACE_INDEX, mockNetwork);
+ client.processResponse(addressResponse, socketKey);
inOrder.verify(mockListenerOne).onServiceFound(serviceInfoCaptor.capture());
verifyServiceInfo(serviceInfoCaptor.getValue(),
@@ -987,8 +986,326 @@
1234 /* port */,
Collections.emptyList() /* subTypes */,
Collections.emptyMap() /* attributes */,
- INTERFACE_INDEX,
- mockNetwork);
+ socketKey);
+ }
+
+ @Test
+ public void testRenewTxtSrvInResolve() throws Exception {
+ client = new MdnsServiceTypeClient(SERVICE_TYPE, mockSocketClient, currentThreadExecutor,
+ mockDecoderClock, socketKey, mockSharedLog);
+
+ final String instanceName = "service-instance";
+ final String[] hostname = new String[] { "testhost "};
+ final String ipV4Address = "192.0.2.0";
+ final String ipV6Address = "2001:db8::";
+
+ final MdnsSearchOptions resolveOptions = MdnsSearchOptions.newBuilder()
+ .setResolveInstanceName(instanceName).build();
+
+ client.startSendAndReceive(mockListenerOne, resolveOptions);
+ InOrder inOrder = inOrder(mockListenerOne, mockSocketClient);
+
+ // Get the query for SRV/TXT
+ final ArgumentCaptor<DatagramPacket> srvTxtQueryCaptor =
+ ArgumentCaptor.forClass(DatagramPacket.class);
+ currentThreadExecutor.getAndClearLastScheduledRunnable().run();
+ // Send twice for IPv4 and IPv6
+ inOrder.verify(mockSocketClient, times(2)).sendPacketRequestingUnicastResponse(
+ srvTxtQueryCaptor.capture(),
+ eq(socketKey), eq(false));
+
+ final MdnsPacket srvTxtQueryPacket = MdnsPacket.parse(
+ new MdnsPacketReader(srvTxtQueryCaptor.getValue()));
+
+ final String[] serviceName = getTestServiceName(instanceName);
+ assertTrue(hasQuestion(srvTxtQueryPacket, MdnsRecord.TYPE_ANY, serviceName));
+
+ // Process a response with all records
+ final MdnsPacket srvTxtResponse = new MdnsPacket(
+ 0 /* flags */,
+ Collections.emptyList() /* questions */,
+ List.of(
+ new MdnsServiceRecord(serviceName, TEST_ELAPSED_REALTIME,
+ true /* cacheFlush */, TEST_TTL, 0 /* servicePriority */,
+ 0 /* serviceWeight */, 1234 /* servicePort */, hostname),
+ new MdnsTextRecord(serviceName, TEST_ELAPSED_REALTIME,
+ true /* cacheFlush */, TEST_TTL,
+ Collections.emptyList() /* entries */),
+ new MdnsInetAddressRecord(hostname, TEST_ELAPSED_REALTIME,
+ true /* cacheFlush */, TEST_TTL,
+ InetAddresses.parseNumericAddress(ipV4Address)),
+ new MdnsInetAddressRecord(hostname, TEST_ELAPSED_REALTIME,
+ true /* cacheFlush */, TEST_TTL,
+ InetAddresses.parseNumericAddress(ipV6Address))),
+ Collections.emptyList() /* authorityRecords */,
+ Collections.emptyList() /* additionalRecords */);
+ client.processResponse(srvTxtResponse, socketKey);
+ inOrder.verify(mockListenerOne).onServiceNameDiscovered(any());
+ inOrder.verify(mockListenerOne).onServiceFound(any());
+
+ // Expect no query on the next run
+ currentThreadExecutor.getAndClearLastScheduledRunnable().run();
+ inOrder.verifyNoMoreInteractions();
+
+ // Advance time so 75% of TTL passes and re-execute
+ doReturn(TEST_ELAPSED_REALTIME + (long) (TEST_TTL * 0.75))
+ .when(mockDecoderClock).elapsedRealtime();
+ currentThreadExecutor.getAndClearLastScheduledRunnable().run();
+
+ // Expect a renewal query
+ final ArgumentCaptor<DatagramPacket> renewalQueryCaptor =
+ ArgumentCaptor.forClass(DatagramPacket.class);
+ // Second and later sends are sent as "expect multicast response" queries
+ inOrder.verify(mockSocketClient, times(2)).sendPacketRequestingMulticastResponse(
+ renewalQueryCaptor.capture(),
+ eq(socketKey), eq(false));
+ inOrder.verify(mockListenerOne).onDiscoveryQuerySent(any(), anyInt());
+ final MdnsPacket renewalPacket = MdnsPacket.parse(
+ new MdnsPacketReader(renewalQueryCaptor.getValue()));
+ assertTrue(hasQuestion(renewalPacket, MdnsRecord.TYPE_ANY, serviceName));
+ inOrder.verifyNoMoreInteractions();
+
+ long updatedReceiptTime = TEST_ELAPSED_REALTIME + TEST_TTL;
+ final MdnsPacket refreshedSrvTxtResponse = new MdnsPacket(
+ 0 /* flags */,
+ Collections.emptyList() /* questions */,
+ List.of(
+ new MdnsServiceRecord(serviceName, updatedReceiptTime,
+ true /* cacheFlush */, TEST_TTL, 0 /* servicePriority */,
+ 0 /* serviceWeight */, 1234 /* servicePort */, hostname),
+ new MdnsTextRecord(serviceName, updatedReceiptTime,
+ true /* cacheFlush */, TEST_TTL,
+ Collections.emptyList() /* entries */),
+ new MdnsInetAddressRecord(hostname, updatedReceiptTime,
+ true /* cacheFlush */, TEST_TTL,
+ InetAddresses.parseNumericAddress(ipV4Address)),
+ new MdnsInetAddressRecord(hostname, updatedReceiptTime,
+ true /* cacheFlush */, TEST_TTL,
+ InetAddresses.parseNumericAddress(ipV6Address))),
+ Collections.emptyList() /* authorityRecords */,
+ Collections.emptyList() /* additionalRecords */);
+ client.processResponse(refreshedSrvTxtResponse, socketKey);
+
+ // Advance time to updatedReceiptTime + 1, expected no refresh query because the cache
+ // should contain the record that have update last receipt time.
+ doReturn(updatedReceiptTime + 1).when(mockDecoderClock).elapsedRealtime();
+ currentThreadExecutor.getAndClearLastScheduledRunnable().run();
+ inOrder.verifyNoMoreInteractions();
+ }
+
+ @Test
+ public void testProcessResponse_ResolveExcludesOtherServices() {
+ client = new MdnsServiceTypeClient(
+ SERVICE_TYPE, mockSocketClient, currentThreadExecutor, socketKey, mockSharedLog);
+
+ final String requestedInstance = "instance1";
+ final String otherInstance = "instance2";
+ final String ipV4Address = "192.0.2.0";
+ final String ipV6Address = "2001:db8::";
+ final String capitalizedRequestInstance = "Instance1";
+
+ final MdnsSearchOptions resolveOptions = MdnsSearchOptions.newBuilder()
+ // Use different case in the options
+ .setResolveInstanceName(capitalizedRequestInstance).build();
+
+ client.startSendAndReceive(mockListenerOne, resolveOptions);
+ client.startSendAndReceive(mockListenerTwo, MdnsSearchOptions.getDefaultOptions());
+
+ // Complete response from instanceName
+ client.processResponse(createResponse(
+ requestedInstance, ipV4Address, 5353, SERVICE_TYPE_LABELS,
+ Collections.emptyMap() /* textAttributes */, TEST_TTL),
+ socketKey);
+
+ // Complete response from otherInstanceName
+ client.processResponse(createResponse(
+ otherInstance, ipV4Address, 5353, SERVICE_TYPE_LABELS,
+ Collections.emptyMap() /* textAttributes */, TEST_TTL),
+ socketKey);
+
+ // Address update from otherInstanceName
+ client.processResponse(createResponse(
+ otherInstance, ipV6Address, 5353, SERVICE_TYPE_LABELS,
+ Collections.emptyMap(), TEST_TTL), socketKey);
+
+ // Goodbye from otherInstanceName
+ client.processResponse(createResponse(
+ otherInstance, ipV6Address, 5353, SERVICE_TYPE_LABELS,
+ Collections.emptyMap(), 0L /* ttl */), socketKey);
+
+ // mockListenerOne gets notified for the requested instance
+ verify(mockListenerOne).onServiceNameDiscovered(
+ matchServiceName(capitalizedRequestInstance));
+ verify(mockListenerOne).onServiceFound(matchServiceName(capitalizedRequestInstance));
+
+ // ...but does not get any callback for the other instance
+ verify(mockListenerOne, never()).onServiceFound(matchServiceName(otherInstance));
+ verify(mockListenerOne, never()).onServiceNameDiscovered(matchServiceName(otherInstance));
+ verify(mockListenerOne, never()).onServiceUpdated(matchServiceName(otherInstance));
+ verify(mockListenerOne, never()).onServiceRemoved(matchServiceName(otherInstance));
+
+ // mockListenerTwo gets notified for both though
+ final InOrder inOrder = inOrder(mockListenerTwo);
+ inOrder.verify(mockListenerTwo).onServiceNameDiscovered(
+ matchServiceName(capitalizedRequestInstance));
+ inOrder.verify(mockListenerTwo).onServiceFound(
+ matchServiceName(capitalizedRequestInstance));
+
+ inOrder.verify(mockListenerTwo).onServiceNameDiscovered(matchServiceName(otherInstance));
+ inOrder.verify(mockListenerTwo).onServiceFound(matchServiceName(otherInstance));
+ inOrder.verify(mockListenerTwo).onServiceUpdated(matchServiceName(otherInstance));
+ inOrder.verify(mockListenerTwo).onServiceRemoved(matchServiceName(otherInstance));
+ }
+
+ @Test
+ public void testProcessResponse_SubtypeDiscoveryLimitedToSubtype() {
+ client = new MdnsServiceTypeClient(
+ SERVICE_TYPE, mockSocketClient, currentThreadExecutor, socketKey, mockSharedLog);
+
+ final String matchingInstance = "instance1";
+ final String subtype = "_subtype";
+ final String otherInstance = "instance2";
+ final String ipV4Address = "192.0.2.0";
+ final String ipV6Address = "2001:db8::";
+
+ final MdnsSearchOptions options = MdnsSearchOptions.newBuilder()
+ // Search with different case. Note MdnsSearchOptions subtype doesn't start with "_"
+ .addSubtype("Subtype").build();
+
+ client.startSendAndReceive(mockListenerOne, options);
+ client.startSendAndReceive(mockListenerTwo, MdnsSearchOptions.getDefaultOptions());
+
+ // Complete response from instanceName
+ final MdnsPacket packetWithoutSubtype = createResponse(
+ matchingInstance, ipV4Address, 5353, SERVICE_TYPE_LABELS,
+ Collections.emptyMap() /* textAttributes */, TEST_TTL);
+ final MdnsPointerRecord originalPtr = (MdnsPointerRecord) CollectionUtils.findFirst(
+ packetWithoutSubtype.answers, r -> r instanceof MdnsPointerRecord);
+
+ // Add a subtype PTR record
+ final ArrayList<MdnsRecord> newAnswers = new ArrayList<>(packetWithoutSubtype.answers);
+ newAnswers.add(new MdnsPointerRecord(
+ // PTR should be _subtype._sub._type._tcp.local -> instance1._type._tcp.local
+ Stream.concat(Stream.of(subtype, "_sub"), Arrays.stream(SERVICE_TYPE_LABELS))
+ .toArray(String[]::new),
+ originalPtr.getReceiptTime(), originalPtr.getCacheFlush(), originalPtr.getTtl(),
+ originalPtr.getPointer()));
+ final MdnsPacket packetWithSubtype = new MdnsPacket(
+ packetWithoutSubtype.flags,
+ packetWithoutSubtype.questions,
+ newAnswers,
+ packetWithoutSubtype.authorityRecords,
+ packetWithoutSubtype.additionalRecords);
+ client.processResponse(packetWithSubtype, socketKey);
+
+ // Complete response from otherInstanceName, without subtype
+ client.processResponse(createResponse(
+ otherInstance, ipV4Address, 5353, SERVICE_TYPE_LABELS,
+ Collections.emptyMap() /* textAttributes */, TEST_TTL),
+ socketKey);
+
+ // Address update from otherInstanceName
+ client.processResponse(createResponse(
+ otherInstance, ipV6Address, 5353, SERVICE_TYPE_LABELS,
+ Collections.emptyMap(), TEST_TTL), socketKey);
+
+ // Goodbye from otherInstanceName
+ client.processResponse(createResponse(
+ otherInstance, ipV6Address, 5353, SERVICE_TYPE_LABELS,
+ Collections.emptyMap(), 0L /* ttl */), socketKey);
+
+ // mockListenerOne gets notified for the requested instance
+ final ArgumentMatcher<MdnsServiceInfo> subtypeInstanceMatcher = info ->
+ info.getServiceInstanceName().equals(matchingInstance)
+ && info.getSubtypes().equals(Collections.singletonList(subtype));
+ verify(mockListenerOne).onServiceNameDiscovered(argThat(subtypeInstanceMatcher));
+ verify(mockListenerOne).onServiceFound(argThat(subtypeInstanceMatcher));
+
+ // ...but does not get any callback for the other instance
+ verify(mockListenerOne, never()).onServiceFound(matchServiceName(otherInstance));
+ verify(mockListenerOne, never()).onServiceNameDiscovered(matchServiceName(otherInstance));
+ verify(mockListenerOne, never()).onServiceUpdated(matchServiceName(otherInstance));
+ verify(mockListenerOne, never()).onServiceRemoved(matchServiceName(otherInstance));
+
+ // mockListenerTwo gets notified for both though
+ final InOrder inOrder = inOrder(mockListenerTwo);
+ inOrder.verify(mockListenerTwo).onServiceNameDiscovered(argThat(subtypeInstanceMatcher));
+ inOrder.verify(mockListenerTwo).onServiceFound(argThat(subtypeInstanceMatcher));
+
+ inOrder.verify(mockListenerTwo).onServiceNameDiscovered(matchServiceName(otherInstance));
+ inOrder.verify(mockListenerTwo).onServiceFound(matchServiceName(otherInstance));
+ inOrder.verify(mockListenerTwo).onServiceUpdated(matchServiceName(otherInstance));
+ inOrder.verify(mockListenerTwo).onServiceRemoved(matchServiceName(otherInstance));
+ }
+
+ @Test
+ public void testNotifySocketDestroyed() throws Exception {
+ client = new MdnsServiceTypeClient(
+ SERVICE_TYPE, mockSocketClient, currentThreadExecutor, socketKey, mockSharedLog);
+
+ final String requestedInstance = "instance1";
+ final String otherInstance = "instance2";
+ final String ipV4Address = "192.0.2.0";
+
+ final MdnsSearchOptions resolveOptions = MdnsSearchOptions.newBuilder()
+ .setResolveInstanceName("instance1").build();
+
+ client.startSendAndReceive(mockListenerOne, resolveOptions);
+ // Ensure the first task is executed so it schedules a future task
+ currentThreadExecutor.getAndClearSubmittedFuture().get(
+ TEST_TIMEOUT_MS, TimeUnit.MILLISECONDS);
+ client.startSendAndReceive(mockListenerTwo, MdnsSearchOptions.getDefaultOptions());
+
+ // Filing the second request cancels the first future
+ verify(expectedSendFutures[0]).cancel(true);
+
+ // Ensure it gets executed too
+ currentThreadExecutor.getAndClearSubmittedFuture().get(
+ TEST_TIMEOUT_MS, TimeUnit.MILLISECONDS);
+
+ // Complete response from instanceName
+ client.processResponse(createResponse(
+ requestedInstance, ipV4Address, 5353, SERVICE_TYPE_LABELS,
+ Collections.emptyMap() /* textAttributes */, TEST_TTL),
+ socketKey);
+
+ // Complete response from otherInstanceName
+ client.processResponse(createResponse(
+ otherInstance, ipV4Address, 5353, SERVICE_TYPE_LABELS,
+ Collections.emptyMap() /* textAttributes */, TEST_TTL),
+ socketKey);
+
+ verify(expectedSendFutures[1], never()).cancel(true);
+ client.notifySocketDestroyed();
+ verify(expectedSendFutures[1]).cancel(true);
+
+ // mockListenerOne gets notified for the requested instance
+ final InOrder inOrder1 = inOrder(mockListenerOne);
+ inOrder1.verify(mockListenerOne).onServiceNameDiscovered(
+ matchServiceName(requestedInstance));
+ inOrder1.verify(mockListenerOne).onServiceFound(matchServiceName(requestedInstance));
+ inOrder1.verify(mockListenerOne).onServiceRemoved(matchServiceName(requestedInstance));
+ inOrder1.verify(mockListenerOne).onServiceNameRemoved(matchServiceName(requestedInstance));
+ verify(mockListenerOne, never()).onServiceFound(matchServiceName(otherInstance));
+ verify(mockListenerOne, never()).onServiceNameDiscovered(matchServiceName(otherInstance));
+ verify(mockListenerOne, never()).onServiceRemoved(matchServiceName(otherInstance));
+ verify(mockListenerOne, never()).onServiceNameRemoved(matchServiceName(otherInstance));
+
+ // mockListenerTwo gets notified for both though
+ final InOrder inOrder2 = inOrder(mockListenerTwo);
+ inOrder2.verify(mockListenerTwo).onServiceNameDiscovered(
+ matchServiceName(requestedInstance));
+ inOrder2.verify(mockListenerTwo).onServiceFound(matchServiceName(requestedInstance));
+ inOrder2.verify(mockListenerTwo).onServiceNameDiscovered(matchServiceName(otherInstance));
+ inOrder2.verify(mockListenerTwo).onServiceFound(matchServiceName(otherInstance));
+ inOrder2.verify(mockListenerTwo).onServiceRemoved(matchServiceName(otherInstance));
+ inOrder2.verify(mockListenerTwo).onServiceNameRemoved(matchServiceName(otherInstance));
+ inOrder2.verify(mockListenerTwo).onServiceRemoved(matchServiceName(requestedInstance));
+ inOrder2.verify(mockListenerTwo).onServiceNameRemoved(matchServiceName(requestedInstance));
+ }
+
+ private static MdnsServiceInfo matchServiceName(String name) {
+ return argThat(info -> info.getServiceInstanceName().equals(name));
}
// verifies that the right query was enqueued with the right delay, and send query by executing
@@ -1003,28 +1320,43 @@
assertEquals(currentThreadExecutor.getAndClearLastScheduledDelayInMs(), timeInMs);
currentThreadExecutor.getAndClearLastScheduledRunnable().run();
if (expectsUnicastResponse) {
- verify(mockSocketClient).sendUnicastPacket(
- expectedIPv4Packets[index], null /* network */);
+ verify(mockSocketClient).sendPacketRequestingUnicastResponse(
+ expectedIPv4Packets[index], socketKey, false);
if (multipleSocketDiscovery) {
- verify(mockSocketClient).sendUnicastPacket(
- expectedIPv6Packets[index], null /* network */);
+ verify(mockSocketClient).sendPacketRequestingUnicastResponse(
+ expectedIPv6Packets[index], socketKey, false);
}
} else {
- verify(mockSocketClient).sendMulticastPacket(
- expectedIPv4Packets[index], null /* network */);
+ verify(mockSocketClient).sendPacketRequestingMulticastResponse(
+ expectedIPv4Packets[index], socketKey, false);
if (multipleSocketDiscovery) {
- verify(mockSocketClient).sendMulticastPacket(
- expectedIPv6Packets[index], null /* network */);
+ verify(mockSocketClient).sendPacketRequestingMulticastResponse(
+ expectedIPv6Packets[index], socketKey, false);
}
}
}
+ private static String[] getTestServiceName(String instanceName) {
+ return Stream.concat(Stream.of(instanceName),
+ Arrays.stream(SERVICE_TYPE_LABELS)).toArray(String[]::new);
+ }
+
+ private static boolean hasQuestion(MdnsPacket packet, int type) {
+ return hasQuestion(packet, type, null);
+ }
+
+ private static boolean hasQuestion(MdnsPacket packet, int type, @Nullable String[] name) {
+ return packet.questions.stream().anyMatch(q -> q.getType() == type
+ && (name == null || Arrays.equals(q.name, name)));
+ }
+
// A fake ScheduledExecutorService that keeps tracking the last scheduled Runnable and its delay
// time.
private class FakeExecutor extends ScheduledThreadPoolExecutor {
private long lastScheduledDelayInMs;
private Runnable lastScheduledRunnable;
private Runnable lastSubmittedRunnable;
+ private Future<?> lastSubmittedFuture;
private int futureIndex;
FakeExecutor() {
@@ -1036,6 +1368,7 @@
public Future<?> submit(Runnable command) {
Future<?> future = super.submit(command);
lastSubmittedRunnable = command;
+ lastSubmittedFuture = future;
return future;
}
@@ -1067,6 +1400,12 @@
lastSubmittedRunnable = null;
return val;
}
+
+ Future<?> getAndClearSubmittedFuture() {
+ Future<?> val = lastSubmittedFuture;
+ lastSubmittedFuture = null;
+ return val;
+ }
}
private MdnsPacket createResponse(
diff --git a/tests/unit/java/com/android/server/connectivity/mdns/MdnsSocketClientTests.java b/tests/unit/java/com/android/server/connectivity/mdns/MdnsSocketClientTests.java
index 9048686..69efc61 100644
--- a/tests/unit/java/com/android/server/connectivity/mdns/MdnsSocketClientTests.java
+++ b/tests/unit/java/com/android/server/connectivity/mdns/MdnsSocketClientTests.java
@@ -23,6 +23,7 @@
import static org.junit.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.argThat;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.never;
@@ -53,6 +54,7 @@
import java.io.IOException;
import java.net.DatagramPacket;
+import java.net.InetSocketAddress;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicBoolean;
@@ -220,15 +222,17 @@
assertTrue(unicastReceiverThread.isAlive());
// Sends a packet.
- DatagramPacket packet = new DatagramPacket(buf, 0, 5);
- mdnsClient.sendMulticastPacket(packet);
+ DatagramPacket packet = getTestDatagramPacket();
+ mdnsClient.sendPacketRequestingMulticastResponse(packet,
+ false /* onlyUseIpv6OnIpv6OnlyNetworks */);
// mockMulticastSocket.send() will be called on another thread. If we verify it immediately,
// it may not be called yet. So timeout is added.
verify(mockMulticastSocket, timeout(TIMEOUT).times(1)).send(packet);
verify(mockUnicastSocket, timeout(TIMEOUT).times(0)).send(packet);
// Verify the packet is sent by the unicast socket.
- mdnsClient.sendUnicastPacket(packet);
+ mdnsClient.sendPacketRequestingUnicastResponse(packet,
+ false /* onlyUseIpv6OnIpv6OnlyNetworks */);
verify(mockMulticastSocket, timeout(TIMEOUT).times(1)).send(packet);
verify(mockUnicastSocket, timeout(TIMEOUT).times(1)).send(packet);
@@ -271,15 +275,17 @@
assertNull(unicastReceiverThread);
// Sends a packet.
- DatagramPacket packet = new DatagramPacket(buf, 0, 5);
- mdnsClient.sendMulticastPacket(packet);
+ DatagramPacket packet = getTestDatagramPacket();
+ mdnsClient.sendPacketRequestingMulticastResponse(packet,
+ false /* onlyUseIpv6OnIpv6OnlyNetworks */);
// mockMulticastSocket.send() will be called on another thread. If we verify it immediately,
// it may not be called yet. So timeout is added.
verify(mockMulticastSocket, timeout(TIMEOUT).times(1)).send(packet);
verify(mockUnicastSocket, timeout(TIMEOUT).times(0)).send(packet);
// Verify the packet is sent by the multicast socket as well.
- mdnsClient.sendUnicastPacket(packet);
+ mdnsClient.sendPacketRequestingUnicastResponse(packet,
+ false /* onlyUseIpv6OnIpv6OnlyNetworks */);
verify(mockMulticastSocket, timeout(TIMEOUT).times(2)).send(packet);
verify(mockUnicastSocket, timeout(TIMEOUT).times(0)).send(packet);
@@ -331,7 +337,8 @@
public void testStopDiscovery_queueIsCleared() throws IOException {
mdnsClient.startDiscovery();
mdnsClient.stopDiscovery();
- mdnsClient.sendMulticastPacket(new DatagramPacket(buf, 0, 5));
+ mdnsClient.sendPacketRequestingMulticastResponse(getTestDatagramPacket(),
+ false /* onlyUseIpv6OnIpv6OnlyNetworks */);
synchronized (mdnsClient.multicastPacketQueue) {
assertTrue(mdnsClient.multicastPacketQueue.isEmpty());
@@ -342,7 +349,8 @@
public void testSendPacket_afterDiscoveryStops() throws IOException {
mdnsClient.startDiscovery();
mdnsClient.stopDiscovery();
- mdnsClient.sendMulticastPacket(new DatagramPacket(buf, 0, 5));
+ mdnsClient.sendPacketRequestingMulticastResponse(getTestDatagramPacket(),
+ false /* onlyUseIpv6OnIpv6OnlyNetworks */);
synchronized (mdnsClient.multicastPacketQueue) {
assertTrue(mdnsClient.multicastPacketQueue.isEmpty());
@@ -355,7 +363,8 @@
//MdnsConfigsFlagsImpl.mdnsPacketQueueMaxSize.override(2L);
mdnsClient.startDiscovery();
for (int i = 0; i < 100; i++) {
- mdnsClient.sendMulticastPacket(new DatagramPacket(buf, 0, 5));
+ mdnsClient.sendPacketRequestingMulticastResponse(getTestDatagramPacket(),
+ false /* onlyUseIpv6OnIpv6OnlyNetworks */);
}
synchronized (mdnsClient.multicastPacketQueue) {
@@ -370,7 +379,7 @@
mdnsClient.startDiscovery();
verify(mockCallback, timeout(TIMEOUT).atLeast(1))
- .onResponseReceived(any(MdnsPacket.class), anyInt(), any());
+ .onResponseReceived(any(MdnsPacket.class), any(SocketKey.class));
}
@Test
@@ -379,7 +388,7 @@
mdnsClient.startDiscovery();
verify(mockCallback, timeout(TIMEOUT).atLeastOnce())
- .onResponseReceived(any(MdnsPacket.class), anyInt(), any());
+ .onResponseReceived(any(MdnsPacket.class), any(SocketKey.class));
mdnsClient.stopDiscovery();
}
@@ -412,7 +421,8 @@
mdnsClient.startDiscovery();
verify(mockCallback, timeout(TIMEOUT).atLeast(1))
- .onFailedToParseMdnsResponse(anyInt(), eq(MdnsResponseErrorCode.ERROR_END_OF_FILE));
+ .onFailedToParseMdnsResponse(
+ anyInt(), eq(MdnsResponseErrorCode.ERROR_END_OF_FILE), any());
mdnsClient.stopDiscovery();
}
@@ -433,7 +443,8 @@
mdnsClient.startDiscovery();
verify(mockCallback, timeout(TIMEOUT).atLeast(1))
- .onFailedToParseMdnsResponse(1, MdnsResponseErrorCode.ERROR_END_OF_FILE);
+ .onFailedToParseMdnsResponse(
+ eq(1), eq(MdnsResponseErrorCode.ERROR_END_OF_FILE), any());
mdnsClient.stopDiscovery();
}
@@ -449,9 +460,11 @@
enableUnicastResponse.set(true);
mdnsClient.startDiscovery();
- DatagramPacket packet = new DatagramPacket(buf, 0, 5);
- mdnsClient.sendUnicastPacket(packet);
- mdnsClient.sendMulticastPacket(packet);
+ DatagramPacket packet = getTestDatagramPacket();
+ mdnsClient.sendPacketRequestingUnicastResponse(packet,
+ false /* onlyUseIpv6OnIpv6OnlyNetworks */);
+ mdnsClient.sendPacketRequestingMulticastResponse(packet,
+ false /* onlyUseIpv6OnIpv6OnlyNetworks */);
// Wait for the timer to be triggered.
Thread.sleep(MdnsConfigs.checkMulticastResponseIntervalMs() * 2);
@@ -481,8 +494,10 @@
assertFalse(mdnsClient.receivedUnicastResponse);
assertFalse(mdnsClient.cannotReceiveMulticastResponse.get());
- mdnsClient.sendUnicastPacket(packet);
- mdnsClient.sendMulticastPacket(packet);
+ mdnsClient.sendPacketRequestingUnicastResponse(packet,
+ false /* onlyUseIpv6OnIpv6OnlyNetworks */);
+ mdnsClient.sendPacketRequestingMulticastResponse(packet,
+ false /* onlyUseIpv6OnIpv6OnlyNetworks */);
Thread.sleep(MdnsConfigs.checkMulticastResponseIntervalMs() * 2);
// Verify cannotReceiveMulticastResponse is not set the true because we didn't receive the
@@ -511,7 +526,7 @@
mdnsClient.startDiscovery();
verify(mockCallback, timeout(TIMEOUT).atLeastOnce())
- .onResponseReceived(any(), eq(21), any());
+ .onResponseReceived(any(), argThat(key -> key.getInterfaceIndex() == 21));
}
@Test
@@ -534,6 +549,12 @@
mdnsClient.startDiscovery();
verify(mockMulticastSocket, never()).getInterfaceIndex();
- verify(mockCallback, timeout(TIMEOUT).atLeast(1)).onResponseReceived(any(), eq(-1), any());
+ verify(mockCallback, timeout(TIMEOUT).atLeast(1))
+ .onResponseReceived(any(), argThat(key -> key.getInterfaceIndex() == -1));
+ }
+
+ private DatagramPacket getTestDatagramPacket() {
+ return new DatagramPacket(buf, 0, 5,
+ new InetSocketAddress(MdnsConstants.getMdnsIPv4Address(), 5353 /* port */));
}
}
\ No newline at end of file
diff --git a/tests/unit/java/com/android/server/connectivity/mdns/MdnsSocketProviderTest.java b/tests/unit/java/com/android/server/connectivity/mdns/MdnsSocketProviderTest.java
index b9cb255..e971de7 100644
--- a/tests/unit/java/com/android/server/connectivity/mdns/MdnsSocketProviderTest.java
+++ b/tests/unit/java/com/android/server/connectivity/mdns/MdnsSocketProviderTest.java
@@ -16,6 +16,13 @@
package com.android.server.connectivity.mdns;
+import static android.net.NetworkCapabilities.TRANSPORT_BLUETOOTH;
+import static android.net.NetworkCapabilities.TRANSPORT_CELLULAR;
+import static android.net.NetworkCapabilities.TRANSPORT_VPN;
+import static android.net.NetworkCapabilities.TRANSPORT_WIFI;
+
+import static com.android.net.module.util.netlink.StructNlMsgHdr.NLM_F_ACK;
+import static com.android.net.module.util.netlink.StructNlMsgHdr.NLM_F_REQUEST;
import static com.android.testutils.ContextUtils.mockService;
import static org.junit.Assert.assertEquals;
@@ -23,29 +30,50 @@
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.ArgumentMatchers.argThat;
+import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.any;
+import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.doCallRealMethod;
import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.inOrder;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
+import android.content.BroadcastReceiver;
import android.content.Context;
+import android.content.Intent;
import android.net.ConnectivityManager;
import android.net.ConnectivityManager.NetworkCallback;
-import android.net.INetd;
import android.net.LinkAddress;
import android.net.LinkProperties;
import android.net.Network;
+import android.net.NetworkCapabilities;
import android.net.TetheringManager;
import android.net.TetheringManager.TetheringEventCallback;
+import android.net.wifi.p2p.WifiP2pGroup;
+import android.net.wifi.p2p.WifiP2pInfo;
+import android.net.wifi.p2p.WifiP2pManager;
import android.os.Build;
import android.os.Handler;
import android.os.HandlerThread;
+import android.system.OsConstants;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
import com.android.net.module.util.ArrayTrackRecord;
+import com.android.net.module.util.SharedLog;
+import com.android.net.module.util.netlink.NetlinkConstants;
+import com.android.net.module.util.netlink.RtNetlinkAddressMessage;
+import com.android.net.module.util.netlink.StructIfaddrMsg;
+import com.android.net.module.util.netlink.StructNlMsgHdr;
import com.android.server.connectivity.mdns.MdnsSocketProvider.Dependencies;
+import com.android.server.connectivity.mdns.MdnsSocketProvider.SocketRequestMonitor;
+import com.android.server.connectivity.mdns.internal.SocketNetlinkMonitor;
import com.android.testutils.DevSdkIgnoreRule;
import com.android.testutils.DevSdkIgnoreRunner;
import com.android.testutils.HandlerUtils;
@@ -54,27 +82,35 @@
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
+import org.mockito.InOrder;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import java.io.IOException;
+import java.net.Inet6Address;
+import java.net.InetAddress;
import java.util.Collections;
import java.util.List;
@RunWith(DevSdkIgnoreRunner.class)
@DevSdkIgnoreRule.IgnoreUpTo(Build.VERSION_CODES.S_V2)
public class MdnsSocketProviderTest {
+ private static final String TAG = MdnsSocketProviderTest.class.getSimpleName();
private static final String TEST_IFACE_NAME = "test";
private static final String LOCAL_ONLY_IFACE_NAME = "local_only";
+ private static final String WIFI_P2P_IFACE_NAME = "p2p_wifi";
private static final String TETHERED_IFACE_NAME = "tethered";
+ private static final int TETHERED_IFACE_IDX = 32;
private static final long DEFAULT_TIMEOUT = 2000L;
private static final long NO_CALLBACK_TIMEOUT = 200L;
private static final LinkAddress LINKADDRV4 = new LinkAddress("192.0.2.0/24");
private static final LinkAddress LINKADDRV6 =
new LinkAddress("2001:0db8:85a3:0000:0000:8a2e:0370:7334/64");
- private static final Network TEST_NETWORK = new Network(123);
- private static final Network LOCAL_NETWORK = new Network(INetd.LOCAL_NET_ID);
+ private static final LinkAddress LINKADDRV6_FLAG_CHANGE =
+ new LinkAddress("2001:0db8:85a3:0000:0000:8a2e:0370:7334/64", 1 /* flags */,
+ 0 /* scope */);
+ private static final Network TEST_NETWORK = new Network(123);
@Mock private Context mContext;
@Mock private Dependencies mDeps;
@Mock private ConnectivityManager mCm;
@@ -82,11 +118,14 @@
@Mock private NetworkInterfaceWrapper mTestNetworkIfaceWrapper;
@Mock private NetworkInterfaceWrapper mLocalOnlyIfaceWrapper;
@Mock private NetworkInterfaceWrapper mTetheredIfaceWrapper;
+ @Mock private SocketRequestMonitor mSocketRequestMonitor;
private Handler mHandler;
private MdnsSocketProvider mSocketProvider;
private NetworkCallback mNetworkCallback;
private TetheringEventCallback mTetheringEventCallback;
+ private SharedLog mLog = new SharedLog("MdnsSocketProviderTest");
+ private TestNetlinkMonitor mTestSocketNetLinkMonitor;
@Before
public void setUp() throws IOException {
MockitoAnnotations.initMocks(this);
@@ -100,17 +139,60 @@
// Test is using mockito-extended
doCallRealMethod().when(mContext).getSystemService(TetheringManager.class);
}
- doReturn(true).when(mDeps).canScanOnInterface(any());
- doReturn(mTestNetworkIfaceWrapper).when(mDeps).getNetworkInterfaceByName(TEST_IFACE_NAME);
+ doReturn(mTestNetworkIfaceWrapper).when(mDeps).getNetworkInterfaceByName(anyString());
+ doReturn(true).when(mTestNetworkIfaceWrapper).isUp();
+ doReturn(true).when(mLocalOnlyIfaceWrapper).isUp();
+ doReturn(true).when(mTetheredIfaceWrapper).isUp();
+ doReturn(true).when(mTestNetworkIfaceWrapper).supportsMulticast();
+ doReturn(true).when(mLocalOnlyIfaceWrapper).supportsMulticast();
+ doReturn(true).when(mTetheredIfaceWrapper).supportsMulticast();
doReturn(mLocalOnlyIfaceWrapper).when(mDeps)
.getNetworkInterfaceByName(LOCAL_ONLY_IFACE_NAME);
+ doReturn(mLocalOnlyIfaceWrapper).when(mDeps)
+ .getNetworkInterfaceByName(WIFI_P2P_IFACE_NAME);
doReturn(mTetheredIfaceWrapper).when(mDeps).getNetworkInterfaceByName(TETHERED_IFACE_NAME);
doReturn(mock(MdnsInterfaceSocket.class))
.when(mDeps).createMdnsInterfaceSocket(any(), anyInt(), any(), any());
+ doReturn(TETHERED_IFACE_IDX).when(mDeps).getNetworkInterfaceIndexByName(
+ TETHERED_IFACE_NAME);
+ doReturn(789).when(mDeps).getNetworkInterfaceIndexByName(
+ WIFI_P2P_IFACE_NAME);
final HandlerThread thread = new HandlerThread("MdnsSocketProviderTest");
thread.start();
mHandler = new Handler(thread.getLooper());
- mSocketProvider = new MdnsSocketProvider(mContext, thread.getLooper(), mDeps);
+
+ doReturn(mTestSocketNetLinkMonitor).when(mDeps).createSocketNetlinkMonitor(any(), any(),
+ any());
+ doAnswer(inv -> {
+ mTestSocketNetLinkMonitor = new TestNetlinkMonitor(inv.getArgument(0),
+ inv.getArgument(1),
+ inv.getArgument(2));
+ return mTestSocketNetLinkMonitor;
+ }).when(mDeps).createSocketNetlinkMonitor(any(), any(),
+ any());
+ mSocketProvider = new MdnsSocketProvider(mContext, thread.getLooper(), mDeps, mLog,
+ mSocketRequestMonitor);
+ }
+
+ private void runOnHandler(Runnable r) {
+ mHandler.post(r);
+ HandlerUtils.waitForIdle(mHandler, DEFAULT_TIMEOUT);
+ }
+
+ private BroadcastReceiver expectWifiP2PChangeBroadcastReceiver() {
+ final ArgumentCaptor<BroadcastReceiver> receiverCaptor =
+ ArgumentCaptor.forClass(BroadcastReceiver.class);
+ verify(mContext, times(1)).registerReceiver(receiverCaptor.capture(),
+ argThat(filter -> filter.hasAction(
+ WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION)),
+ any(), any());
+ final BroadcastReceiver originalReceiver = receiverCaptor.getValue();
+ return new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ runOnHandler(() -> originalReceiver.onReceive(context, intent));
+ }
+ };
}
private void startMonitoringSockets() {
@@ -119,41 +201,56 @@
final ArgumentCaptor<TetheringEventCallback> teCallbackCaptor =
ArgumentCaptor.forClass(TetheringEventCallback.class);
- mHandler.post(mSocketProvider::startMonitoringSockets);
- HandlerUtils.waitForIdle(mHandler, DEFAULT_TIMEOUT);
+ runOnHandler(mSocketProvider::startMonitoringSockets);
verify(mCm).registerNetworkCallback(any(), nwCallbackCaptor.capture(), any());
verify(mTm).registerTetheringEventCallback(any(), teCallbackCaptor.capture());
mNetworkCallback = nwCallbackCaptor.getValue();
mTetheringEventCallback = teCallbackCaptor.getValue();
+
+ runOnHandler(mSocketProvider::startNetLinkMonitor);
+ }
+
+ private static class TestNetlinkMonitor extends SocketNetlinkMonitor {
+ TestNetlinkMonitor(@NonNull Handler handler,
+ @NonNull SharedLog log,
+ @Nullable MdnsSocketProvider.NetLinkMonitorCallBack cb) {
+ super(handler, log, cb);
+ }
+
+ @Override
+ public void startMonitoring() { }
+
+ @Override
+ public void stopMonitoring() { }
}
private class TestSocketCallback implements MdnsSocketProvider.SocketCallback {
private class SocketEvent {
- public final Network mNetwork;
+ public final SocketKey mSocketKey;
public final List<LinkAddress> mAddresses;
- SocketEvent(Network network, List<LinkAddress> addresses) {
- mNetwork = network;
+ SocketEvent(SocketKey socketKey, List<LinkAddress> addresses) {
+ mSocketKey = socketKey;
mAddresses = Collections.unmodifiableList(addresses);
}
}
private class SocketCreatedEvent extends SocketEvent {
- SocketCreatedEvent(Network nw, List<LinkAddress> addresses) {
- super(nw, addresses);
+ SocketCreatedEvent(SocketKey socketKey, List<LinkAddress> addresses) {
+ super(socketKey, addresses);
}
}
private class InterfaceDestroyedEvent extends SocketEvent {
- InterfaceDestroyedEvent(Network nw, List<LinkAddress> addresses) {
- super(nw, addresses);
+ InterfaceDestroyedEvent(SocketKey socketKey, List<LinkAddress> addresses) {
+ super(socketKey, addresses);
}
}
private class AddressesChangedEvent extends SocketEvent {
- AddressesChangedEvent(Network nw, List<LinkAddress> addresses) {
- super(nw, addresses);
+ AddressesChangedEvent(SocketKey socketKey, List<LinkAddress> addresses) {
+ super(socketKey, addresses);
}
}
@@ -161,27 +258,27 @@
new ArrayTrackRecord<SocketEvent>().newReadHead();
@Override
- public void onSocketCreated(Network network, MdnsInterfaceSocket socket,
+ public void onSocketCreated(SocketKey socketKey, MdnsInterfaceSocket socket,
List<LinkAddress> addresses) {
- mHistory.add(new SocketCreatedEvent(network, addresses));
+ mHistory.add(new SocketCreatedEvent(socketKey, addresses));
}
@Override
- public void onInterfaceDestroyed(Network network, MdnsInterfaceSocket socket) {
- mHistory.add(new InterfaceDestroyedEvent(network, List.of()));
+ public void onInterfaceDestroyed(SocketKey socketKey, MdnsInterfaceSocket socket) {
+ mHistory.add(new InterfaceDestroyedEvent(socketKey, List.of()));
}
@Override
- public void onAddressesChanged(Network network, MdnsInterfaceSocket socket,
+ public void onAddressesChanged(SocketKey socketKey, MdnsInterfaceSocket socket,
List<LinkAddress> addresses) {
- mHistory.add(new AddressesChangedEvent(network, addresses));
+ mHistory.add(new AddressesChangedEvent(socketKey, addresses));
}
public void expectedSocketCreatedForNetwork(Network network, List<LinkAddress> addresses) {
final SocketEvent event = mHistory.poll(0L /* timeoutMs */, c -> true);
assertNotNull(event);
assertTrue(event instanceof SocketCreatedEvent);
- assertEquals(network, event.mNetwork);
+ assertEquals(network, event.mSocketKey.getNetwork());
assertEquals(addresses, event.mAddresses);
}
@@ -189,7 +286,7 @@
final SocketEvent event = mHistory.poll(0L /* timeoutMs */, c -> true);
assertNotNull(event);
assertTrue(event instanceof InterfaceDestroyedEvent);
- assertEquals(network, event.mNetwork);
+ assertEquals(network, event.mSocketKey.getNetwork());
}
public void expectedAddressesChangedForNetwork(Network network,
@@ -197,7 +294,7 @@
final SocketEvent event = mHistory.poll(0L /* timeoutMs */, c -> true);
assertNotNull(event);
assertTrue(event instanceof AddressesChangedEvent);
- assertEquals(network, event.mNetwork);
+ assertEquals(network, event.mSocketKey.getNetwork());
assertEquals(event.mAddresses, addresses);
}
@@ -207,76 +304,170 @@
}
}
+ private static NetworkCapabilities makeCapabilities(int... transports) {
+ final NetworkCapabilities nc = new NetworkCapabilities();
+ for (int transport : transports) {
+ nc.addTransportType(transport);
+ }
+ return nc;
+ }
+
+ private void postNetworkAvailable(int... transports) {
+ final LinkProperties testLp = new LinkProperties();
+ testLp.setInterfaceName(TEST_IFACE_NAME);
+ testLp.setLinkAddresses(List.of(LINKADDRV4));
+ final NetworkCapabilities testNc = makeCapabilities(transports);
+ runOnHandler(() -> mNetworkCallback.onCapabilitiesChanged(TEST_NETWORK, testNc));
+ runOnHandler(() -> mNetworkCallback.onLinkPropertiesChanged(TEST_NETWORK, testLp));
+ }
+
@Test
public void testSocketRequestAndUnrequestSocket() {
startMonitoringSockets();
+ final InOrder cbMonitorOrder = inOrder(mSocketRequestMonitor);
final TestSocketCallback testCallback1 = new TestSocketCallback();
- mHandler.post(() -> mSocketProvider.requestSocket(TEST_NETWORK, testCallback1));
- HandlerUtils.waitForIdle(mHandler, DEFAULT_TIMEOUT);
+ runOnHandler(() -> mSocketProvider.requestSocket(TEST_NETWORK, testCallback1));
testCallback1.expectedNoCallback();
- final LinkProperties testLp = new LinkProperties();
- testLp.setInterfaceName(TEST_IFACE_NAME);
- testLp.setLinkAddresses(List.of(LINKADDRV4));
- mHandler.post(() -> mNetworkCallback.onLinkPropertiesChanged(TEST_NETWORK, testLp));
- HandlerUtils.waitForIdle(mHandler, DEFAULT_TIMEOUT);
- verify(mTestNetworkIfaceWrapper).getNetworkInterface();
+ postNetworkAvailable(TRANSPORT_WIFI);
testCallback1.expectedSocketCreatedForNetwork(TEST_NETWORK, List.of(LINKADDRV4));
+ cbMonitorOrder.verify(mSocketRequestMonitor).onSocketRequestFulfilled(eq(TEST_NETWORK),
+ any(), eq(new int[] { TRANSPORT_WIFI }));
final TestSocketCallback testCallback2 = new TestSocketCallback();
- mHandler.post(() -> mSocketProvider.requestSocket(TEST_NETWORK, testCallback2));
- HandlerUtils.waitForIdle(mHandler, DEFAULT_TIMEOUT);
+ runOnHandler(() -> mSocketProvider.requestSocket(TEST_NETWORK, testCallback2));
testCallback1.expectedNoCallback();
testCallback2.expectedSocketCreatedForNetwork(TEST_NETWORK, List.of(LINKADDRV4));
+ cbMonitorOrder.verify(mSocketRequestMonitor).onSocketRequestFulfilled(eq(TEST_NETWORK),
+ any(), eq(new int[] { TRANSPORT_WIFI }));
final TestSocketCallback testCallback3 = new TestSocketCallback();
- mHandler.post(() -> mSocketProvider.requestSocket(null /* network */, testCallback3));
- HandlerUtils.waitForIdle(mHandler, DEFAULT_TIMEOUT);
+ runOnHandler(() -> mSocketProvider.requestSocket(null /* network */, testCallback3));
testCallback1.expectedNoCallback();
testCallback2.expectedNoCallback();
testCallback3.expectedSocketCreatedForNetwork(TEST_NETWORK, List.of(LINKADDRV4));
+ cbMonitorOrder.verify(mSocketRequestMonitor).onSocketRequestFulfilled(eq(TEST_NETWORK),
+ any(), eq(new int[] { TRANSPORT_WIFI }));
- mHandler.post(() -> mTetheringEventCallback.onLocalOnlyInterfacesChanged(
+ runOnHandler(() -> mTetheringEventCallback.onLocalOnlyInterfacesChanged(
List.of(LOCAL_ONLY_IFACE_NAME)));
- HandlerUtils.waitForIdle(mHandler, DEFAULT_TIMEOUT);
verify(mLocalOnlyIfaceWrapper).getNetworkInterface();
testCallback1.expectedNoCallback();
testCallback2.expectedNoCallback();
- testCallback3.expectedSocketCreatedForNetwork(LOCAL_NETWORK, List.of());
+ testCallback3.expectedSocketCreatedForNetwork(null /* network */, List.of());
+ cbMonitorOrder.verify(mSocketRequestMonitor).onSocketRequestFulfilled(eq(null),
+ any(), eq(new int[0]));
- mHandler.post(() -> mTetheringEventCallback.onTetheredInterfacesChanged(
+ runOnHandler(() -> mTetheringEventCallback.onTetheredInterfacesChanged(
List.of(TETHERED_IFACE_NAME)));
- HandlerUtils.waitForIdle(mHandler, DEFAULT_TIMEOUT);
verify(mTetheredIfaceWrapper).getNetworkInterface();
testCallback1.expectedNoCallback();
testCallback2.expectedNoCallback();
- testCallback3.expectedSocketCreatedForNetwork(LOCAL_NETWORK, List.of());
+ testCallback3.expectedSocketCreatedForNetwork(null /* network */, List.of());
+ cbMonitorOrder.verify(mSocketRequestMonitor).onSocketRequestFulfilled(eq(null),
+ any(), eq(new int[0]));
- mHandler.post(() -> mSocketProvider.unrequestSocket(testCallback1));
- HandlerUtils.waitForIdle(mHandler, DEFAULT_TIMEOUT);
+ runOnHandler(() -> mSocketProvider.unrequestSocket(testCallback1));
testCallback1.expectedNoCallback();
testCallback2.expectedNoCallback();
testCallback3.expectedNoCallback();
- mHandler.post(() -> mNetworkCallback.onLost(TEST_NETWORK));
- HandlerUtils.waitForIdle(mHandler, DEFAULT_TIMEOUT);
+ runOnHandler(() -> mNetworkCallback.onLost(TEST_NETWORK));
testCallback1.expectedNoCallback();
testCallback2.expectedInterfaceDestroyedForNetwork(TEST_NETWORK);
testCallback3.expectedInterfaceDestroyedForNetwork(TEST_NETWORK);
+ cbMonitorOrder.verify(mSocketRequestMonitor).onSocketDestroyed(eq(TEST_NETWORK), any());
- mHandler.post(() -> mTetheringEventCallback.onLocalOnlyInterfacesChanged(List.of()));
- HandlerUtils.waitForIdle(mHandler, DEFAULT_TIMEOUT);
+ runOnHandler(() -> mTetheringEventCallback.onLocalOnlyInterfacesChanged(List.of()));
testCallback1.expectedNoCallback();
testCallback2.expectedNoCallback();
- testCallback3.expectedInterfaceDestroyedForNetwork(LOCAL_NETWORK);
+ testCallback3.expectedInterfaceDestroyedForNetwork(null /* network */);
+ cbMonitorOrder.verify(mSocketRequestMonitor).onSocketDestroyed(eq(null), any());
- mHandler.post(() -> mSocketProvider.unrequestSocket(testCallback3));
- HandlerUtils.waitForIdle(mHandler, DEFAULT_TIMEOUT);
+ runOnHandler(() -> mSocketProvider.unrequestSocket(testCallback3));
testCallback1.expectedNoCallback();
testCallback2.expectedNoCallback();
- // Expect the socket destroy for tethered interface.
- testCallback3.expectedInterfaceDestroyedForNetwork(LOCAL_NETWORK);
+ // There was still a tethered interface, but no callback should be sent once unregistered
+ testCallback3.expectedNoCallback();
+
+ // However the socket is getting destroyed, so the callback monitor is notified
+ cbMonitorOrder.verify(mSocketRequestMonitor).onSocketDestroyed(eq(null), any());
+ }
+
+ private RtNetlinkAddressMessage createNetworkAddressUpdateNetLink(
+ short msgType, LinkAddress linkAddress, int ifIndex, int flags) {
+ final StructNlMsgHdr nlmsghdr = new StructNlMsgHdr();
+ nlmsghdr.nlmsg_type = msgType;
+ nlmsghdr.nlmsg_flags = NLM_F_REQUEST | NLM_F_ACK;
+ nlmsghdr.nlmsg_seq = 1;
+
+ InetAddress ip = linkAddress.getAddress();
+
+ final byte family =
+ (byte) ((ip instanceof Inet6Address) ? OsConstants.AF_INET6 : OsConstants.AF_INET);
+ StructIfaddrMsg structIfaddrMsg = new StructIfaddrMsg(family,
+ (short) linkAddress.getPrefixLength(),
+ (short) linkAddress.getFlags(), (short) linkAddress.getScope(), ifIndex);
+
+ return new RtNetlinkAddressMessage(nlmsghdr, structIfaddrMsg, ip,
+ null /* structIfacacheInfo */, flags);
+ }
+
+ @Test
+ public void testDownstreamNetworkAddressUpdateFromNetlink() {
+ startMonitoringSockets();
+ final TestSocketCallback testCallbackAll = new TestSocketCallback();
+ runOnHandler(() -> mSocketProvider.requestSocket(null /* network */, testCallbackAll));
+
+ // Address add message arrived before the interface is created.
+ RtNetlinkAddressMessage addIpv4AddrMsg = createNetworkAddressUpdateNetLink(
+ NetlinkConstants.RTM_NEWADDR,
+ LINKADDRV4,
+ TETHERED_IFACE_IDX,
+ 0 /* flags */);
+ runOnHandler(
+ () -> mTestSocketNetLinkMonitor.processNetlinkMessage(addIpv4AddrMsg,
+ 0 /* whenMs */));
+
+ // Interface is created.
+ runOnHandler(() -> mTetheringEventCallback.onTetheredInterfacesChanged(
+ List.of(TETHERED_IFACE_NAME)));
+ verify(mTetheredIfaceWrapper).getNetworkInterface();
+ testCallbackAll.expectedSocketCreatedForNetwork(null /* network */, List.of(LINKADDRV4));
+
+ // Old Address removed.
+ RtNetlinkAddressMessage removeIpv4AddrMsg = createNetworkAddressUpdateNetLink(
+ NetlinkConstants.RTM_DELADDR,
+ LINKADDRV4,
+ TETHERED_IFACE_IDX,
+ 0 /* flags */);
+ runOnHandler(
+ () -> mTestSocketNetLinkMonitor.processNetlinkMessage(removeIpv4AddrMsg,
+ 0 /* whenMs */));
+ testCallbackAll.expectedAddressesChangedForNetwork(null /* network */, List.of());
+
+ // New address added.
+ RtNetlinkAddressMessage addIpv6AddrMsg = createNetworkAddressUpdateNetLink(
+ NetlinkConstants.RTM_NEWADDR,
+ LINKADDRV6,
+ TETHERED_IFACE_IDX,
+ 0 /* flags */);
+ runOnHandler(() -> mTestSocketNetLinkMonitor.processNetlinkMessage(addIpv6AddrMsg,
+ 0 /* whenMs */));
+ testCallbackAll.expectedAddressesChangedForNetwork(null /* network */, List.of(LINKADDRV6));
+
+ // Address updated
+ RtNetlinkAddressMessage updateIpv6AddrMsg = createNetworkAddressUpdateNetLink(
+ NetlinkConstants.RTM_NEWADDR,
+ LINKADDRV6,
+ TETHERED_IFACE_IDX,
+ 1 /* flags */);
+ runOnHandler(
+ () -> mTestSocketNetLinkMonitor.processNetlinkMessage(updateIpv6AddrMsg,
+ 0 /* whenMs */));
+ testCallbackAll.expectedAddressesChangedForNetwork(null /* network */,
+ List.of(LINKADDRV6_FLAG_CHANGE));
}
@Test
@@ -284,24 +475,16 @@
startMonitoringSockets();
final TestSocketCallback testCallback = new TestSocketCallback();
- mHandler.post(() -> mSocketProvider.requestSocket(TEST_NETWORK, testCallback));
- HandlerUtils.waitForIdle(mHandler, DEFAULT_TIMEOUT);
+ runOnHandler(() -> mSocketProvider.requestSocket(TEST_NETWORK, testCallback));
testCallback.expectedNoCallback();
- final LinkProperties testLp = new LinkProperties();
- testLp.setInterfaceName(TEST_IFACE_NAME);
- testLp.setLinkAddresses(List.of(LINKADDRV4));
- mHandler.post(() -> mNetworkCallback.onLinkPropertiesChanged(TEST_NETWORK, testLp));
- HandlerUtils.waitForIdle(mHandler, DEFAULT_TIMEOUT);
- verify(mTestNetworkIfaceWrapper, times(1)).getNetworkInterface();
+ postNetworkAvailable(TRANSPORT_WIFI);
testCallback.expectedSocketCreatedForNetwork(TEST_NETWORK, List.of(LINKADDRV4));
final LinkProperties newTestLp = new LinkProperties();
newTestLp.setInterfaceName(TEST_IFACE_NAME);
newTestLp.setLinkAddresses(List.of(LINKADDRV4, LINKADDRV6));
- mHandler.post(() -> mNetworkCallback.onLinkPropertiesChanged(TEST_NETWORK, newTestLp));
- HandlerUtils.waitForIdle(mHandler, DEFAULT_TIMEOUT);
- verify(mTestNetworkIfaceWrapper, times(1)).getNetworkInterface();
+ runOnHandler(() -> mNetworkCallback.onLinkPropertiesChanged(TEST_NETWORK, newTestLp));
testCallback.expectedAddressesChangedForNetwork(
TEST_NETWORK, List.of(LINKADDRV4, LINKADDRV6));
}
@@ -309,8 +492,7 @@
@Test
public void testStartAndStopMonitoringSockets() {
// Stop monitoring sockets before start. Should not unregister any network callback.
- mHandler.post(mSocketProvider::requestStopWhenInactive);
- HandlerUtils.waitForIdle(mHandler, DEFAULT_TIMEOUT);
+ runOnHandler(mSocketProvider::requestStopWhenInactive);
verify(mCm, never()).unregisterNetworkCallback(any(NetworkCallback.class));
verify(mTm, never()).unregisterTetheringEventCallback(any(TetheringEventCallback.class));
@@ -318,40 +500,288 @@
startMonitoringSockets();
// Request a socket then unrequest it. Expect no network callback unregistration.
final TestSocketCallback testCallback = new TestSocketCallback();
- mHandler.post(() -> mSocketProvider.requestSocket(TEST_NETWORK, testCallback));
- HandlerUtils.waitForIdle(mHandler, DEFAULT_TIMEOUT);
+ runOnHandler(() -> mSocketProvider.requestSocket(TEST_NETWORK, testCallback));
testCallback.expectedNoCallback();
- mHandler.post(()-> mSocketProvider.unrequestSocket(testCallback));
- HandlerUtils.waitForIdle(mHandler, DEFAULT_TIMEOUT);
+ runOnHandler(()-> mSocketProvider.unrequestSocket(testCallback));
verify(mCm, never()).unregisterNetworkCallback(any(NetworkCallback.class));
verify(mTm, never()).unregisterTetheringEventCallback(any(TetheringEventCallback.class));
// Request stop and it should unregister network callback immediately because there is no
// socket request.
- mHandler.post(mSocketProvider::requestStopWhenInactive);
- HandlerUtils.waitForIdle(mHandler, DEFAULT_TIMEOUT);
+ runOnHandler(mSocketProvider::requestStopWhenInactive);
verify(mCm, times(1)).unregisterNetworkCallback(any(NetworkCallback.class));
verify(mTm, times(1)).unregisterTetheringEventCallback(any(TetheringEventCallback.class));
// Start sockets monitoring and request a socket again.
- mHandler.post(mSocketProvider::startMonitoringSockets);
- HandlerUtils.waitForIdle(mHandler, DEFAULT_TIMEOUT);
+ runOnHandler(mSocketProvider::startMonitoringSockets);
verify(mCm, times(2)).registerNetworkCallback(any(), any(NetworkCallback.class), any());
verify(mTm, times(2)).registerTetheringEventCallback(
any(), any(TetheringEventCallback.class));
final TestSocketCallback testCallback2 = new TestSocketCallback();
- mHandler.post(() -> mSocketProvider.requestSocket(TEST_NETWORK, testCallback2));
- HandlerUtils.waitForIdle(mHandler, DEFAULT_TIMEOUT);
+ runOnHandler(() -> mSocketProvider.requestSocket(TEST_NETWORK, testCallback2));
testCallback2.expectedNoCallback();
// Try to stop monitoring sockets but should be ignored and wait until all socket are
// unrequested.
- mHandler.post(mSocketProvider::requestStopWhenInactive);
- HandlerUtils.waitForIdle(mHandler, DEFAULT_TIMEOUT);
+ runOnHandler(mSocketProvider::requestStopWhenInactive);
verify(mCm, times(1)).unregisterNetworkCallback(any(NetworkCallback.class));
verify(mTm, times(1)).unregisterTetheringEventCallback(any());
// Unrequest the socket then network callbacks should be unregistered.
- mHandler.post(()-> mSocketProvider.unrequestSocket(testCallback2));
- HandlerUtils.waitForIdle(mHandler, DEFAULT_TIMEOUT);
+ runOnHandler(()-> mSocketProvider.unrequestSocket(testCallback2));
verify(mCm, times(2)).unregisterNetworkCallback(any(NetworkCallback.class));
verify(mTm, times(2)).unregisterTetheringEventCallback(any(TetheringEventCallback.class));
}
+
+ @Test
+ public void testLinkPropertiesAreClearedAfterStopMonitoringSockets() {
+ startMonitoringSockets();
+
+ // Request a socket with null network.
+ final TestSocketCallback testCallback = new TestSocketCallback();
+ runOnHandler(() -> mSocketProvider.requestSocket(null, testCallback));
+ testCallback.expectedNoCallback();
+
+ // Notify a LinkPropertiesChanged with TEST_NETWORK.
+ final LinkProperties testLp = new LinkProperties();
+ testLp.setInterfaceName(TEST_IFACE_NAME);
+ testLp.setLinkAddresses(List.of(LINKADDRV4));
+ runOnHandler(() -> mNetworkCallback.onLinkPropertiesChanged(TEST_NETWORK, testLp));
+ verify(mTestNetworkIfaceWrapper, times(1)).getNetworkInterface();
+ testCallback.expectedSocketCreatedForNetwork(TEST_NETWORK, List.of(LINKADDRV4));
+
+ // Try to stop monitoring and unrequest the socket.
+ runOnHandler(mSocketProvider::requestStopWhenInactive);
+ runOnHandler(()-> mSocketProvider.unrequestSocket(testCallback));
+ // No callback sent when unregistered
+ testCallback.expectedNoCallback();
+ verify(mCm, times(1)).unregisterNetworkCallback(any(NetworkCallback.class));
+ verify(mTm, times(1)).unregisterTetheringEventCallback(any());
+
+ // Start sockets monitoring and request a socket again. Expected no socket created callback
+ // because all saved LinkProperties has been cleared.
+ runOnHandler(mSocketProvider::startMonitoringSockets);
+ verify(mCm, times(2)).registerNetworkCallback(any(), any(NetworkCallback.class), any());
+ verify(mTm, times(2)).registerTetheringEventCallback(
+ any(), any(TetheringEventCallback.class));
+ runOnHandler(() -> mSocketProvider.requestSocket(null, testCallback));
+ testCallback.expectedNoCallback();
+
+ // Notify a LinkPropertiesChanged with another network.
+ final LinkProperties otherLp = new LinkProperties();
+ final LinkAddress otherAddress = new LinkAddress("192.0.2.1/24");
+ final Network otherNetwork = new Network(456);
+ otherLp.setInterfaceName("test2");
+ otherLp.setLinkAddresses(List.of(otherAddress));
+ runOnHandler(() -> mNetworkCallback.onLinkPropertiesChanged(otherNetwork, otherLp));
+ verify(mTestNetworkIfaceWrapper, times(2)).getNetworkInterface();
+ testCallback.expectedSocketCreatedForNetwork(otherNetwork, List.of(otherAddress));
+ }
+
+ @Test
+ public void testNoSocketCreatedForCellular() {
+ startMonitoringSockets();
+
+ final TestSocketCallback testCallback = new TestSocketCallback();
+ runOnHandler(() -> mSocketProvider.requestSocket(TEST_NETWORK, testCallback));
+
+ postNetworkAvailable(TRANSPORT_CELLULAR);
+ testCallback.expectedNoCallback();
+ }
+
+ @Test
+ public void testNoSocketCreatedForNonMulticastInterface() throws Exception {
+ doReturn(false).when(mTestNetworkIfaceWrapper).supportsMulticast();
+ startMonitoringSockets();
+
+ final TestSocketCallback testCallback = new TestSocketCallback();
+ runOnHandler(() -> mSocketProvider.requestSocket(TEST_NETWORK, testCallback));
+
+ postNetworkAvailable(TRANSPORT_BLUETOOTH);
+ testCallback.expectedNoCallback();
+ }
+
+ @Test
+ public void testSocketCreatedForMulticastInterface() throws Exception {
+ doReturn(true).when(mTestNetworkIfaceWrapper).supportsMulticast();
+ startMonitoringSockets();
+
+ final TestSocketCallback testCallback = new TestSocketCallback();
+ runOnHandler(() -> mSocketProvider.requestSocket(TEST_NETWORK, testCallback));
+
+ postNetworkAvailable(TRANSPORT_BLUETOOTH);
+ testCallback.expectedSocketCreatedForNetwork(TEST_NETWORK, List.of(LINKADDRV4));
+ }
+
+ @Test
+ public void testNoSocketCreatedForPTPInterface() throws Exception {
+ doReturn(true).when(mTestNetworkIfaceWrapper).isPointToPoint();
+ startMonitoringSockets();
+
+ final TestSocketCallback testCallback = new TestSocketCallback();
+ runOnHandler(() -> mSocketProvider.requestSocket(TEST_NETWORK, testCallback));
+
+ postNetworkAvailable(TRANSPORT_BLUETOOTH);
+ testCallback.expectedNoCallback();
+ }
+
+ @Test
+ public void testNoSocketCreatedForVPNInterface() throws Exception {
+ // VPN interfaces generally also have IFF_POINTOPOINT, but even if they don't, they should
+ // not be included even with TRANSPORT_WIFI.
+ doReturn(false).when(mTestNetworkIfaceWrapper).supportsMulticast();
+ startMonitoringSockets();
+
+ final TestSocketCallback testCallback = new TestSocketCallback();
+ runOnHandler(() -> mSocketProvider.requestSocket(TEST_NETWORK, testCallback));
+
+ postNetworkAvailable(TRANSPORT_VPN, TRANSPORT_WIFI);
+ testCallback.expectedNoCallback();
+ }
+
+ @Test
+ public void testSocketCreatedForWifiWithoutMulticastFlag() throws Exception {
+ doReturn(false).when(mTestNetworkIfaceWrapper).supportsMulticast();
+ startMonitoringSockets();
+
+ final TestSocketCallback testCallback = new TestSocketCallback();
+ runOnHandler(() -> mSocketProvider.requestSocket(TEST_NETWORK, testCallback));
+
+ postNetworkAvailable(TRANSPORT_WIFI);
+ testCallback.expectedSocketCreatedForNetwork(TEST_NETWORK, List.of(LINKADDRV4));
+ }
+
+ private Intent buildWifiP2PConnectionChangedIntent(boolean groupFormed) {
+ final Intent intent = new Intent(WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION);
+ final WifiP2pInfo formedInfo = new WifiP2pInfo();
+ formedInfo.groupFormed = groupFormed;
+ final WifiP2pGroup group;
+ if (groupFormed) {
+ group = mock(WifiP2pGroup.class);
+ doReturn(WIFI_P2P_IFACE_NAME).when(group).getInterface();
+ } else {
+ group = null;
+ }
+ intent.putExtra(WifiP2pManager.EXTRA_WIFI_P2P_INFO, formedInfo);
+ intent.putExtra(WifiP2pManager.EXTRA_WIFI_P2P_GROUP, group);
+ return intent;
+ }
+
+ @Test
+ public void testWifiP2PInterfaceChange() {
+ final BroadcastReceiver receiver = expectWifiP2PChangeBroadcastReceiver();
+ startMonitoringSockets();
+
+ // Request a socket with null network.
+ final TestSocketCallback testCallback = new TestSocketCallback();
+ runOnHandler(() -> mSocketProvider.requestSocket(null /* network */, testCallback));
+
+ // Wifi p2p is connected and the interface is up. Get a wifi p2p change intent then expect
+ // a socket creation.
+ final Intent formedIntent = buildWifiP2PConnectionChangedIntent(true /* groupFormed */);
+ receiver.onReceive(mContext, formedIntent);
+ verify(mLocalOnlyIfaceWrapper).getNetworkInterface();
+ testCallback.expectedSocketCreatedForNetwork(null /* network */, List.of());
+
+ // Wifi p2p is disconnected. Get a wifi p2p change intent then expect the socket destroy.
+ final Intent unformedIntent = buildWifiP2PConnectionChangedIntent(false /* groupFormed */);
+ receiver.onReceive(mContext, unformedIntent);
+ testCallback.expectedInterfaceDestroyedForNetwork(null /* network */);
+ }
+
+ @Test
+ public void testWifiP2PInterfaceChangeBeforeStartMonitoringSockets() {
+ final BroadcastReceiver receiver = expectWifiP2PChangeBroadcastReceiver();
+
+ // Get a wifi p2p change intent before start monitoring sockets.
+ final Intent formedIntent = buildWifiP2PConnectionChangedIntent(true /* groupFormed */);
+ receiver.onReceive(mContext, formedIntent);
+
+ // Start monitoring sockets and request a socket with null network.
+ startMonitoringSockets();
+ final TestSocketCallback testCallback = new TestSocketCallback();
+ runOnHandler(() -> mSocketProvider.requestSocket(null /* network */, testCallback));
+ verify(mLocalOnlyIfaceWrapper).getNetworkInterface();
+ testCallback.expectedSocketCreatedForNetwork(null /* network */, List.of());
+ }
+
+ @Test
+ public void testWifiP2PInterfaceChangeBeforeGetAllNetworksRequest() {
+ final BroadcastReceiver receiver = expectWifiP2PChangeBroadcastReceiver();
+ startMonitoringSockets();
+
+ // Get a wifi p2p change intent before request socket for all networks.
+ final Intent formedIntent = buildWifiP2PConnectionChangedIntent(true /* groupFormed */);
+ receiver.onReceive(mContext, formedIntent);
+
+ // Request a socket with null network.
+ final TestSocketCallback testCallback = new TestSocketCallback();
+ runOnHandler(() -> mSocketProvider.requestSocket(null /* network */, testCallback));
+ verify(mLocalOnlyIfaceWrapper).getNetworkInterface();
+ testCallback.expectedSocketCreatedForNetwork(null /* network */, List.of());
+ }
+
+ @Test
+ public void testNoDuplicatedSocketCreation() {
+ final BroadcastReceiver receiver = expectWifiP2PChangeBroadcastReceiver();
+ startMonitoringSockets();
+
+ // Request a socket with null network.
+ final TestSocketCallback testCallback = new TestSocketCallback();
+ runOnHandler(() -> mSocketProvider.requestSocket(null, testCallback));
+ testCallback.expectedNoCallback();
+
+ // Receive an interface added change for the wifi p2p interface. Expect a socket creation
+ // callback.
+ runOnHandler(() -> mTetheringEventCallback.onLocalOnlyInterfacesChanged(
+ List.of(WIFI_P2P_IFACE_NAME)));
+ verify(mLocalOnlyIfaceWrapper, times(1)).getNetworkInterface();
+ testCallback.expectedSocketCreatedForNetwork(null /* network */, List.of());
+
+ // Receive a wifi p2p connected intent. Expect no callback because the socket is created.
+ final Intent formedIntent = buildWifiP2PConnectionChangedIntent(true /* groupFormed */);
+ receiver.onReceive(mContext, formedIntent);
+ testCallback.expectedNoCallback();
+
+ // Request other socket with null network. Should receive socket created callback once.
+ final TestSocketCallback testCallback2 = new TestSocketCallback();
+ runOnHandler(() -> mSocketProvider.requestSocket(null, testCallback2));
+ testCallback2.expectedSocketCreatedForNetwork(null /* network */, List.of());
+ testCallback2.expectedNoCallback();
+
+ // Receive a wifi p2p disconnected intent. Expect a socket destroy callback.
+ final Intent unformedIntent = buildWifiP2PConnectionChangedIntent(false /* groupFormed */);
+ receiver.onReceive(mContext, unformedIntent);
+ testCallback.expectedInterfaceDestroyedForNetwork(null /* network */);
+
+ // Receive an interface removed change for the wifi p2p interface. Expect no callback
+ // because the socket is destroyed.
+ runOnHandler(() -> mTetheringEventCallback.onLocalOnlyInterfacesChanged(List.of()));
+ testCallback.expectedNoCallback();
+
+ // Receive a wifi p2p connected intent again. Expect a socket creation callback.
+ receiver.onReceive(mContext, formedIntent);
+ verify(mLocalOnlyIfaceWrapper, times(2)).getNetworkInterface();
+ testCallback.expectedSocketCreatedForNetwork(null /* network */, List.of());
+
+ // Receive an interface added change for the wifi p2p interface again. Expect no callback
+ // because the socket is created.
+ runOnHandler(() -> mTetheringEventCallback.onLocalOnlyInterfacesChanged(
+ List.of(WIFI_P2P_IFACE_NAME)));
+ testCallback.expectedNoCallback();
+ }
+
+ @Test
+ public void testTetherInterfacesChangedBeforeGetAllNetworksRequest() {
+ startMonitoringSockets();
+
+ // Receive an interface added change for the wifi p2p interface. Expect a socket creation
+ // callback.
+ runOnHandler(() -> mTetheringEventCallback.onLocalOnlyInterfacesChanged(
+ List.of(TETHERED_IFACE_NAME)));
+ verify(mTetheredIfaceWrapper, never()).getNetworkInterface();
+
+ // Request a socket with null network.
+ final TestSocketCallback testCallback = new TestSocketCallback();
+ runOnHandler(() -> mSocketProvider.requestSocket(null /* network */, testCallback));
+ verify(mTetheredIfaceWrapper).getNetworkInterface();
+ testCallback.expectedSocketCreatedForNetwork(null /* network */, List.of());
+ }
}
diff --git a/tests/unit/java/com/android/server/connectivity/mdns/internal/SocketNetlinkMonitorTest.kt b/tests/unit/java/com/android/server/connectivity/mdns/internal/SocketNetlinkMonitorTest.kt
new file mode 100644
index 0000000..c62a081
--- /dev/null
+++ b/tests/unit/java/com/android/server/connectivity/mdns/internal/SocketNetlinkMonitorTest.kt
@@ -0,0 +1,90 @@
+package com.android.server.connectivity.mdns.internal
+
+import android.net.LinkAddress
+import android.os.Build
+import android.os.Handler
+import android.os.HandlerThread
+import android.system.OsConstants
+import com.android.net.module.util.SharedLog
+import com.android.net.module.util.netlink.NetlinkConstants
+import com.android.net.module.util.netlink.RtNetlinkAddressMessage
+import com.android.net.module.util.netlink.StructIfaddrMsg
+import com.android.net.module.util.netlink.StructNlMsgHdr
+import com.android.server.connectivity.mdns.MdnsAdvertiserTest
+import com.android.server.connectivity.mdns.MdnsSocketProvider
+import com.android.testutils.DevSdkIgnoreRule
+import com.android.testutils.DevSdkIgnoreRunner
+import org.junit.After
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.mockito.ArgumentMatchers.eq
+import org.mockito.Mockito
+import org.mockito.Mockito.argThat
+import org.mockito.Mockito.never
+import org.mockito.Mockito.verify
+
+private val LINKADDRV4 = LinkAddress("192.0.2.0/24")
+private val IFACE_IDX = 32
+
+@RunWith(DevSdkIgnoreRunner::class)
+@DevSdkIgnoreRule.IgnoreUpTo(Build.VERSION_CODES.S_V2)
+internal class SocketNetlinkMonitorTest {
+ private val thread = HandlerThread(MdnsAdvertiserTest::class.simpleName)
+ private val sharedlog = Mockito.mock(SharedLog::class.java)
+ private val netlinkMonitorCallBack =
+ Mockito.mock(MdnsSocketProvider.NetLinkMonitorCallBack::class.java)
+
+ @Before
+ fun setUp() {
+ thread.start()
+ }
+
+ @After
+ fun tearDown() {
+ thread.quitSafely()
+ }
+
+ @Test
+ fun testHandleDeprecatedNetlinkMessage() {
+ val socketNetlinkMonitor = SocketNetlinkMonitor(Handler(thread.looper), sharedlog,
+ netlinkMonitorCallBack)
+ val nlmsghdr = StructNlMsgHdr().apply {
+ nlmsg_type = NetlinkConstants.RTM_NEWADDR
+ nlmsg_flags = (StructNlMsgHdr.NLM_F_REQUEST.toInt()
+ or StructNlMsgHdr.NLM_F_ACK.toInt()).toShort()
+ nlmsg_seq = 1
+ }
+ val structIfaddrMsg = StructIfaddrMsg(OsConstants.AF_INET.toShort(),
+ LINKADDRV4.prefixLength.toShort(),
+ LINKADDRV4.flags.toShort(),
+ LINKADDRV4.scope.toShort(), IFACE_IDX)
+ // If the LinkAddress is not preferred, RTM_NEWADDR will not trigger
+ // addOrUpdateInterfaceAddress() callback.
+ val deprecatedAddNetLinkMessage = RtNetlinkAddressMessage(nlmsghdr, structIfaddrMsg,
+ LINKADDRV4.address, null /* structIfacacheInfo */,
+ LINKADDRV4.flags or OsConstants.IFA_F_DEPRECATED)
+ socketNetlinkMonitor.processNetlinkMessage(deprecatedAddNetLinkMessage, 0L /* whenMs */)
+ verify(netlinkMonitorCallBack, never()).addOrUpdateInterfaceAddress(eq(IFACE_IDX),
+ argThat { it.address == LINKADDRV4.address })
+
+ // If the LinkAddress is preferred, RTM_NEWADDR will trigger addOrUpdateInterfaceAddress()
+ // callback.
+ val preferredAddNetLinkMessage = RtNetlinkAddressMessage(nlmsghdr, structIfaddrMsg,
+ LINKADDRV4.address, null /* structIfacacheInfo */,
+ LINKADDRV4.flags or OsConstants.IFA_F_OPTIMISTIC)
+ socketNetlinkMonitor.processNetlinkMessage(preferredAddNetLinkMessage, 0L /* whenMs */)
+ verify(netlinkMonitorCallBack).addOrUpdateInterfaceAddress(eq(IFACE_IDX),
+ argThat { it.address == LINKADDRV4.address })
+
+ // Even if the LinkAddress is not preferred, RTM_DELADDR will trigger
+ // deleteInterfaceAddress() callback.
+ nlmsghdr.nlmsg_type = NetlinkConstants.RTM_DELADDR
+ val deprecatedDelNetLinkMessage = RtNetlinkAddressMessage(nlmsghdr, structIfaddrMsg,
+ LINKADDRV4.address, null /* structIfacacheInfo */,
+ LINKADDRV4.flags or OsConstants.IFA_F_DEPRECATED)
+ socketNetlinkMonitor.processNetlinkMessage(deprecatedDelNetLinkMessage, 0L /* whenMs */)
+ verify(netlinkMonitorCallBack).deleteInterfaceAddress(eq(IFACE_IDX),
+ argThat { it.address == LINKADDRV4.address })
+ }
+}
diff --git a/tests/unit/java/com/android/server/connectivity/mdns/util/MdnsUtilsTest.kt b/tests/unit/java/com/android/server/connectivity/mdns/util/MdnsUtilsTest.kt
new file mode 100644
index 0000000..f705bcb
--- /dev/null
+++ b/tests/unit/java/com/android/server/connectivity/mdns/util/MdnsUtilsTest.kt
@@ -0,0 +1,105 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License")
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.connectivity.mdns.util
+
+import android.os.Build
+import com.android.server.connectivity.mdns.util.MdnsUtils.equalsDnsLabelIgnoreDnsCase
+import com.android.server.connectivity.mdns.util.MdnsUtils.equalsIgnoreDnsCase
+import com.android.server.connectivity.mdns.util.MdnsUtils.toDnsLabelsLowerCase
+import com.android.server.connectivity.mdns.util.MdnsUtils.toDnsLowerCase
+import com.android.server.connectivity.mdns.util.MdnsUtils.truncateServiceName
+import com.android.testutils.DevSdkIgnoreRule
+import com.android.testutils.DevSdkIgnoreRunner
+import org.junit.Assert.assertArrayEquals
+import org.junit.Assert.assertEquals
+import org.junit.Assert.assertFalse
+import org.junit.Assert.assertTrue
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@RunWith(DevSdkIgnoreRunner::class)
+@DevSdkIgnoreRule.IgnoreUpTo(Build.VERSION_CODES.S_V2)
+class MdnsUtilsTest {
+ @Test
+ fun testToDnsLowerCase() {
+ assertEquals("test", toDnsLowerCase("TEST"))
+ assertEquals("test", toDnsLowerCase("TeSt"))
+ assertEquals("test", toDnsLowerCase("test"))
+ assertEquals("tÉst", toDnsLowerCase("TÉST"))
+ assertEquals("ţést", toDnsLowerCase("ţést"))
+ // Unicode characters 0x10000 (𐀀), 0x10001 (𐀁), 0x10041 (𐁁)
+ // Note the last 2 bytes of 0x10041 are identical to 'A', but it should remain unchanged.
+ assertEquals("test: -->\ud800\udc00 \ud800\udc01 \ud800\udc41<-- ",
+ toDnsLowerCase("Test: -->\ud800\udc00 \ud800\udc01 \ud800\udc41<-- "))
+ // Also test some characters where the first surrogate is not \ud800
+ assertEquals("test: >\ud83c\udff4\udb40\udc67\udb40\udc62\udb40" +
+ "\udc77\udb40\udc6c\udb40\udc73\udb40\udc7f<",
+ toDnsLowerCase("Test: >\ud83c\udff4\udb40\udc67\udb40\udc62\udb40" +
+ "\udc77\udb40\udc6c\udb40\udc73\udb40\udc7f<"))
+ }
+
+ @Test
+ fun testToDnsLabelsLowerCase() {
+ assertArrayEquals(arrayOf("test", "tÉst", "ţést"),
+ toDnsLabelsLowerCase(arrayOf("TeSt", "TÉST", "ţést")))
+ }
+
+ @Test
+ fun testEqualsIgnoreDnsCase() {
+ assertTrue(equalsIgnoreDnsCase("TEST", "Test"))
+ assertTrue(equalsIgnoreDnsCase("TEST", "test"))
+ assertTrue(equalsIgnoreDnsCase("test", "TeSt"))
+ assertTrue(equalsIgnoreDnsCase("Tést", "tést"))
+ assertFalse(equalsIgnoreDnsCase("ŢÉST", "ţést"))
+ // Unicode characters 0x10000 (𐀀), 0x10001 (𐀁), 0x10041 (𐁁)
+ // Note the last 2 bytes of 0x10041 are identical to 'A', but it should remain unchanged.
+ assertTrue(equalsIgnoreDnsCase("test: -->\ud800\udc00 \ud800\udc01 \ud800\udc41<-- ",
+ "Test: -->\ud800\udc00 \ud800\udc01 \ud800\udc41<-- "))
+ // Also test some characters where the first surrogate is not \ud800
+ assertTrue(equalsIgnoreDnsCase("test: >\ud83c\udff4\udb40\udc67\udb40\udc62\udb40" +
+ "\udc77\udb40\udc6c\udb40\udc73\udb40\udc7f<",
+ "Test: >\ud83c\udff4\udb40\udc67\udb40\udc62\udb40" +
+ "\udc77\udb40\udc6c\udb40\udc73\udb40\udc7f<"))
+ }
+
+ @Test
+ fun testTruncateServiceName() {
+ assertEquals(truncateServiceName("测试abcde", 7), "测试a")
+ assertEquals(truncateServiceName("测试abcde", 100), "测试abcde")
+ }
+
+ @Test
+ fun testEqualsLabelIgnoreDnsCase() {
+ assertTrue(equalsDnsLabelIgnoreDnsCase(arrayOf("TEST", "Test"), arrayOf("test", "test")))
+ assertFalse(equalsDnsLabelIgnoreDnsCase(arrayOf("TEST", "Test"), arrayOf("test")))
+ assertFalse(equalsDnsLabelIgnoreDnsCase(arrayOf("Test"), arrayOf("test", "test")))
+ assertFalse(equalsDnsLabelIgnoreDnsCase(arrayOf("TEST", "Test"), arrayOf("test", "tést")))
+ }
+
+ @Test
+ fun testTypeEqualsOrIsSubtype() {
+ assertTrue(MdnsUtils.typeEqualsOrIsSubtype(arrayOf("_type", "_tcp", "local"),
+ arrayOf("_type", "_TCP", "local")))
+ assertTrue(MdnsUtils.typeEqualsOrIsSubtype(arrayOf("_type", "_tcp", "local"),
+ arrayOf("a", "_SUB", "_type", "_TCP", "local")))
+ assertFalse(MdnsUtils.typeEqualsOrIsSubtype(arrayOf("_sub", "_type", "_tcp", "local"),
+ arrayOf("_type", "_TCP", "local")))
+ assertFalse(MdnsUtils.typeEqualsOrIsSubtype(
+ arrayOf("a", "_other", "_type", "_tcp", "local"),
+ arrayOf("a", "_SUB", "_type", "_TCP", "local")))
+ }
+}
diff --git a/tests/unit/java/com/android/server/ethernet/EthernetTrackerTest.java b/tests/unit/java/com/android/server/ethernet/EthernetTrackerTest.java
index 5e7f0ff..e6aba22 100644
--- a/tests/unit/java/com/android/server/ethernet/EthernetTrackerTest.java
+++ b/tests/unit/java/com/android/server/ethernet/EthernetTrackerTest.java
@@ -86,8 +86,9 @@
}
@After
- public void cleanUp() {
+ public void cleanUp() throws InterruptedException {
mHandlerThread.quitSafely();
+ mHandlerThread.join();
}
private void initMockResources() {
diff --git a/tests/unit/java/com/android/server/net/IpConfigStoreTest.java b/tests/unit/java/com/android/server/net/IpConfigStoreTest.java
index 4adc999..dcf0f75 100644
--- a/tests/unit/java/com/android/server/net/IpConfigStoreTest.java
+++ b/tests/unit/java/com/android/server/net/IpConfigStoreTest.java
@@ -36,7 +36,6 @@
import com.android.testutils.DevSdkIgnoreRule;
import com.android.testutils.DevSdkIgnoreRunner;
-import com.android.testutils.HandlerUtils;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -58,7 +57,7 @@
@RunWith(DevSdkIgnoreRunner.class)
@DevSdkIgnoreRule.IgnoreUpTo(Build.VERSION_CODES.S_V2)
public class IpConfigStoreTest {
- private static final int TIMEOUT_MS = 2_000;
+ private static final int TIMEOUT_MS = 5_000;
private static final int KEY_CONFIG = 17;
private static final String IFACE_1 = "eth0";
private static final String IFACE_2 = "eth1";
@@ -139,6 +138,8 @@
}
@Override
public void quitHandlerThread(HandlerThread handlerThread) {
+ // Don't join in here, quitHandlerThread runs on the
+ // handler thread itself.
testHandlerThread.quitSafely();
}
};
@@ -155,7 +156,7 @@
final DelayedDiskWrite writer = new DelayedDiskWrite(dependencies);
final IpConfigStore store = new IpConfigStore(writer);
store.writeIpConfigurations(configFile.getPath(), expectedNetworks);
- HandlerUtils.waitForIdle(testHandlerThread, TIMEOUT_MS);
+ testHandlerThread.join();
// Read IP config from the file path.
final ArrayMap<String, IpConfiguration> actualNetworks =
diff --git a/tests/unit/java/com/android/server/net/NetworkStatsFactoryTest.java b/tests/unit/java/com/android/server/net/NetworkStatsFactoryTest.java
index 04db6d3..63daebc 100644
--- a/tests/unit/java/com/android/server/net/NetworkStatsFactoryTest.java
+++ b/tests/unit/java/com/android/server/net/NetworkStatsFactoryTest.java
@@ -472,8 +472,7 @@
256L, 16L, 512L, 32L, 0L)
.insertEntry(TEST_IFACE, UID_GREEN, SET_DEFAULT, TAG_NONE, 64L, 3L, 1024L, 8L, 0L);
- doReturn(stats).when(mDeps).getNetworkStatsDetail(anyInt(), any(),
- anyInt());
+ doReturn(stats).when(mDeps).getNetworkStatsDetail();
final String[] ifaces = new String[]{TEST_IFACE};
final NetworkStats res = mFactory.readNetworkStatsDetail(UID_ALL, ifaces, TAG_ALL);
@@ -488,8 +487,7 @@
mFactory.removeUidsLocked(removedUids);
// Return empty stats for reading the result of removing uids stats later.
- doReturn(buildEmptyStats()).when(mDeps).getNetworkStatsDetail(anyInt(), any(),
- anyInt());
+ doReturn(buildEmptyStats()).when(mDeps).getNetworkStatsDetail();
final NetworkStats removedUidsStats =
mFactory.readNetworkStatsDetail(UID_ALL, ifaces, TAG_ALL);
@@ -574,8 +572,7 @@
final NetworkStats statsFromResource = parseNetworkStatsFromGoldenSample(resourceId,
24 /* initialSize */, true /* consumeHeader */, false /* checkActive */,
true /* isUidData */);
- doReturn(statsFromResource).when(mDeps).getNetworkStatsDetail(anyInt(), any(),
- anyInt());
+ doReturn(statsFromResource).when(mDeps).getNetworkStatsDetail();
return mFactory.readNetworkStatsDetail();
}
diff --git a/tests/unit/java/com/android/server/net/NetworkStatsServiceTest.java b/tests/unit/java/com/android/server/net/NetworkStatsServiceTest.java
index 13a6a6f..b8b0289 100644
--- a/tests/unit/java/com/android/server/net/NetworkStatsServiceTest.java
+++ b/tests/unit/java/com/android/server/net/NetworkStatsServiceTest.java
@@ -82,7 +82,6 @@
import static org.mockito.ArgumentMatchers.anyLong;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.Matchers.eq;
-import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
@@ -97,7 +96,6 @@
import android.content.Intent;
import android.content.res.Resources;
import android.database.ContentObserver;
-import android.net.ConnectivityResources;
import android.net.DataUsageRequest;
import android.net.INetd;
import android.net.INetworkStatsSession;
@@ -146,6 +144,7 @@
import com.android.net.module.util.bpf.CookieTagMapKey;
import com.android.net.module.util.bpf.CookieTagMapValue;
import com.android.server.BpfNetMaps;
+import com.android.server.connectivity.ConnectivityResources;
import com.android.server.net.NetworkStatsService.AlertObserver;
import com.android.server.net.NetworkStatsService.NetworkStatsSettings;
import com.android.server.net.NetworkStatsService.NetworkStatsSettings.Config;
@@ -395,10 +394,6 @@
verify(mNetd).registerUnsolicitedEventListener(alertObserver.capture());
mAlertObserver = alertObserver.getValue();
- // Make augmentWithStackedInterfaces returns the interfaces that was passed to it.
- doAnswer(inv -> ((String[]) inv.getArgument(0)).clone())
- .when(mStatsFactory).augmentWithStackedInterfaces(any());
-
// Catch TetheringEventCallback during systemReady().
ArgumentCaptor<TetheringManager.TetheringEventCallback> tetheringEventCbCaptor =
ArgumentCaptor.forClass(TetheringManager.TetheringEventCallback.class);
@@ -544,6 +539,7 @@
mService = null;
mHandlerThread.quitSafely();
+ mHandlerThread.join();
}
private void initWifiStats(NetworkStateSnapshot snapshot) throws Exception {
@@ -1930,12 +1926,17 @@
// Templates w/o wifi network keys can query stats as usual.
assertNetworkTotal(sTemplateCarrierWifi1, 0L, 0L, 0L, 0L, 0);
assertNetworkTotal(sTemplateImsi1, 0L, 0L, 0L, 0L, 0);
+ // Templates for test network does not need to enforce location permission.
+ final NetworkTemplate templateTestIface1 = new NetworkTemplate.Builder(MATCH_TEST)
+ .setWifiNetworkKeys(Set.of(TEST_IFACE)).build();
+ assertNetworkTotal(templateTestIface1, 0L, 0L, 0L, 0L, 0);
doReturn(true).when(mLocationPermissionChecker)
.checkCallersLocationPermission(any(), any(), anyInt(), anyBoolean(), any());
assertNetworkTotal(sTemplateCarrierWifi1, 0L, 0L, 0L, 0L, 0);
assertNetworkTotal(sTemplateWifi, 0L, 0L, 0L, 0L, 0);
assertNetworkTotal(sTemplateImsi1, 0L, 0L, 0L, 0L, 0);
+ assertNetworkTotal(templateTestIface1, 0L, 0L, 0L, 0L, 0);
}
/**
diff --git a/tests/unit/vpn-jarjar-rules.txt b/tests/unit/vpn-jarjar-rules.txt
index 16661b9..1a6bddc 100644
--- a/tests/unit/vpn-jarjar-rules.txt
+++ b/tests/unit/vpn-jarjar-rules.txt
@@ -1,4 +1,4 @@
# Only keep classes imported by ConnectivityServiceTest
-keep com.android.server.VpnManagerService
keep com.android.server.connectivity.Vpn
-keep com.android.server.connectivity.VpnProfileStore
\ No newline at end of file
+keep com.android.server.connectivity.VpnProfileStore
+keep com.android.server.net.LockdownVpnTracker
diff --git a/tools/gen_jarjar.py b/tools/gen_jarjar.py
index eb686ce..5129128 100755
--- a/tools/gen_jarjar.py
+++ b/tools/gen_jarjar.py
@@ -120,9 +120,11 @@
_get_toplevel_class(clazz) not in excluded_classes and
not any(r.fullmatch(clazz) for r in exclude_regexes)):
outfile.write(f'rule {clazz} {args.prefix}.@0\n')
- # Also include jarjar rules for unit tests of the class, so the package matches
- outfile.write(f'rule {clazz}Test {args.prefix}.@0\n')
- outfile.write(f'rule {clazz}Test$* {args.prefix}.@0\n')
+ # Also include jarjar rules for unit tests of the class if it's not explicitly
+ # excluded, so the package matches
+ if not any(r.fullmatch(clazz + 'Test') for r in exclude_regexes):
+ outfile.write(f'rule {clazz}Test {args.prefix}.@0\n')
+ outfile.write(f'rule {clazz}Test$* {args.prefix}.@0\n')
def _main():
diff --git a/tools/gn2bp/Android.bp.swp b/tools/gn2bp/Android.bp.swp
deleted file mode 100644
index d22a576..0000000
--- a/tools/gn2bp/Android.bp.swp
+++ /dev/null
@@ -1,35277 +0,0 @@
-// Copyright (C) 2022 The Android Open Source Project
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-//
-// This file is automatically generated by gen_android_bp. Do not edit.
-
-build = ["Android.extras.bp"]
-
-// GN: PACKAGE
-package {
- default_applicable_licenses: [
- "external_cronet_license",
- ],
-}
-
-// GN: //components/cronet/android:cronet_api_java
-// TODO(danstahr): add the API helpers separately after the main API is checked in and thoroughly reviewed
-filegroup {
- name: "cronet_aml_api_sources",
- srcs: [
- ":cronet_aml_components_cronet_android_interface_api_version",
- "components/cronet/android/api/src/android/net/http/BidirectionalStream.java",
- "components/cronet/android/api/src/android/net/http/CallbackException.java",
- "components/cronet/android/api/src/android/net/http/ConnectionMigrationOptions.java",
- "components/cronet/android/api/src/android/net/http/DnsOptions.java",
- "components/cronet/android/api/src/android/net/http/ExperimentalBidirectionalStream.java",
- "components/cronet/android/api/src/android/net/http/ExperimentalHttpEngine.java",
- "components/cronet/android/api/src/android/net/http/ExperimentalUrlRequest.java",
- "components/cronet/android/api/src/android/net/http/HttpEngine.java",
- "components/cronet/android/api/src/android/net/http/HttpException.java",
- "components/cronet/android/api/src/android/net/http/IHttpEngineBuilder.java",
- "components/cronet/android/api/src/android/net/http/InlineExecutionProhibitedException.java",
- "components/cronet/android/api/src/android/net/http/NetworkException.java",
- "components/cronet/android/api/src/android/net/http/NetworkQualityRttListener.java",
- "components/cronet/android/api/src/android/net/http/NetworkQualityThroughputListener.java",
- "components/cronet/android/api/src/android/net/http/QuicException.java",
- "components/cronet/android/api/src/android/net/http/QuicOptions.java",
- "components/cronet/android/api/src/android/net/http/RequestFinishedInfo.java",
- "components/cronet/android/api/src/android/net/http/UploadDataProvider.java",
- "components/cronet/android/api/src/android/net/http/UploadDataSink.java",
- "components/cronet/android/api/src/android/net/http/UrlRequest.java",
- "components/cronet/android/api/src/android/net/http/UrlResponseInfo.java",
- ],
-}
-
-// GN: //base/allocator:buildflags
-cc_genrule {
- name: "cronet_aml_base_allocator_buildflags",
- cmd: "echo '--flags USE_ALLOCATOR_SHIM=\"true\" USE_PARTITION_ALLOC=\"false\" USE_PARTITION_ALLOC_AS_MALLOC=\"false\" USE_BACKUP_REF_PTR=\"false\" USE_ASAN_BACKUP_REF_PTR=\"false\" USE_PARTITION_ALLOC_AS_GWP_ASAN_STORE=\"false\" USE_MTE_CHECKED_PTR=\"false\" FORCE_ENABLE_RAW_PTR_EXCLUSION=\"false\"' | " +
- "$(location build/write_buildflag_header.py) --output " +
- "$(out) " +
- "--rulename " +
- "//base/allocator:buildflags " +
- "--gen-dir " +
- ". " +
- "--definitions " +
- "/dev/stdin",
- out: [
- "base/allocator/buildflags.h",
- ],
- tool_files: [
- "build/write_buildflag_header.py",
- ],
- apex_available: [
- "com.android.tethering",
- ],
-}
-
-// GN: //base/allocator:buildflags__testing
-cc_genrule {
- name: "cronet_aml_base_allocator_buildflags__testing",
- cmd: "echo '--flags USE_ALLOCATOR_SHIM=\"true\" USE_PARTITION_ALLOC=\"false\" USE_PARTITION_ALLOC_AS_MALLOC=\"false\" USE_BACKUP_REF_PTR=\"false\" USE_ASAN_BACKUP_REF_PTR=\"false\" USE_PARTITION_ALLOC_AS_GWP_ASAN_STORE=\"false\" USE_MTE_CHECKED_PTR=\"false\" FORCE_ENABLE_RAW_PTR_EXCLUSION=\"false\"' | " +
- "$(location build/write_buildflag_header.py) --output " +
- "$(out) " +
- "--rulename " +
- "//base/allocator:buildflags " +
- "--gen-dir " +
- ". " +
- "--definitions " +
- "/dev/stdin",
- host_supported: true,
- out: [
- "base/allocator/buildflags.h",
- ],
- tool_files: [
- "build/write_buildflag_header.py",
- ],
- apex_available: [
- "com.android.tethering",
- ],
-}
-
-// GN: //base/allocator/partition_allocator:chromecast_buildflags
-cc_genrule {
- name: "cronet_aml_base_allocator_partition_allocator_chromecast_buildflags",
- cmd: "echo '--flags PA_IS_CAST_ANDROID=\"false\" PA_IS_CASTOS=\"false\"' | " +
- "$(location build/write_buildflag_header.py) --output " +
- "$(out) " +
- "--rulename " +
- "//base/allocator/partition_allocator:chromecast_buildflags " +
- "--gen-dir " +
- ". " +
- "--definitions " +
- "/dev/stdin",
- out: [
- "base/allocator/partition_allocator/chromecast_buildflags.h",
- ],
- tool_files: [
- "build/write_buildflag_header.py",
- ],
- apex_available: [
- "com.android.tethering",
- ],
-}
-
-// GN: //base/allocator/partition_allocator:chromecast_buildflags__testing
-cc_genrule {
- name: "cronet_aml_base_allocator_partition_allocator_chromecast_buildflags__testing",
- cmd: "echo '--flags PA_IS_CAST_ANDROID=\"false\" PA_IS_CASTOS=\"false\"' | " +
- "$(location build/write_buildflag_header.py) --output " +
- "$(out) " +
- "--rulename " +
- "//base/allocator/partition_allocator:chromecast_buildflags " +
- "--gen-dir " +
- ". " +
- "--definitions " +
- "/dev/stdin",
- host_supported: true,
- out: [
- "base/allocator/partition_allocator/chromecast_buildflags.h",
- ],
- tool_files: [
- "build/write_buildflag_header.py",
- ],
- apex_available: [
- "com.android.tethering",
- ],
-}
-
-// GN: //base/allocator/partition_allocator:chromeos_buildflags
-cc_genrule {
- name: "cronet_aml_base_allocator_partition_allocator_chromeos_buildflags",
- cmd: "echo '--flags PA_IS_CHROMEOS_ASH=\"false\"' | " +
- "$(location build/write_buildflag_header.py) --output " +
- "$(out) " +
- "--rulename " +
- "//base/allocator/partition_allocator:chromeos_buildflags " +
- "--gen-dir " +
- ". " +
- "--definitions " +
- "/dev/stdin",
- out: [
- "base/allocator/partition_allocator/chromeos_buildflags.h",
- ],
- tool_files: [
- "build/write_buildflag_header.py",
- ],
- apex_available: [
- "com.android.tethering",
- ],
-}
-
-// GN: //base/allocator/partition_allocator:chromeos_buildflags__testing
-cc_genrule {
- name: "cronet_aml_base_allocator_partition_allocator_chromeos_buildflags__testing",
- cmd: "echo '--flags PA_IS_CHROMEOS_ASH=\"false\"' | " +
- "$(location build/write_buildflag_header.py) --output " +
- "$(out) " +
- "--rulename " +
- "//base/allocator/partition_allocator:chromeos_buildflags " +
- "--gen-dir " +
- ". " +
- "--definitions " +
- "/dev/stdin",
- host_supported: true,
- out: [
- "base/allocator/partition_allocator/chromeos_buildflags.h",
- ],
- tool_files: [
- "build/write_buildflag_header.py",
- ],
- apex_available: [
- "com.android.tethering",
- ],
-}
-
-// GN: //base/allocator/partition_allocator:debugging_buildflags
-cc_genrule {
- name: "cronet_aml_base_allocator_partition_allocator_debugging_buildflags",
- cmd: "echo '--flags PA_DCHECK_IS_ON=\"false\" PA_EXPENSIVE_DCHECKS_ARE_ON=\"false\" PA_DCHECK_IS_CONFIGURABLE=\"false\"' | " +
- "$(location build/write_buildflag_header.py) --output " +
- "$(out) " +
- "--rulename " +
- "//base/allocator/partition_allocator:debugging_buildflags " +
- "--gen-dir " +
- ". " +
- "--definitions " +
- "/dev/stdin",
- out: [
- "base/allocator/partition_allocator/partition_alloc_base/debug/debugging_buildflags.h",
- ],
- tool_files: [
- "build/write_buildflag_header.py",
- ],
- apex_available: [
- "com.android.tethering",
- ],
-}
-
-// GN: //base/allocator/partition_allocator:debugging_buildflags__testing
-cc_genrule {
- name: "cronet_aml_base_allocator_partition_allocator_debugging_buildflags__testing",
- cmd: "echo '--flags PA_DCHECK_IS_ON=\"false\" PA_EXPENSIVE_DCHECKS_ARE_ON=\"false\" PA_DCHECK_IS_CONFIGURABLE=\"false\"' | " +
- "$(location build/write_buildflag_header.py) --output " +
- "$(out) " +
- "--rulename " +
- "//base/allocator/partition_allocator:debugging_buildflags " +
- "--gen-dir " +
- ". " +
- "--definitions " +
- "/dev/stdin",
- host_supported: true,
- out: [
- "base/allocator/partition_allocator/partition_alloc_base/debug/debugging_buildflags.h",
- ],
- tool_files: [
- "build/write_buildflag_header.py",
- ],
- apex_available: [
- "com.android.tethering",
- ],
-}
-
-// GN: //base/allocator/partition_allocator:logging_buildflags
-cc_genrule {
- name: "cronet_aml_base_allocator_partition_allocator_logging_buildflags",
- cmd: "echo '--flags PA_ENABLE_LOG_ERROR_NOT_REACHED=\"false\"' | " +
- "$(location build/write_buildflag_header.py) --output " +
- "$(out) " +
- "--rulename " +
- "//base/allocator/partition_allocator:logging_buildflags " +
- "--gen-dir " +
- ". " +
- "--definitions " +
- "/dev/stdin",
- out: [
- "base/allocator/partition_allocator/logging_buildflags.h",
- ],
- tool_files: [
- "build/write_buildflag_header.py",
- ],
- apex_available: [
- "com.android.tethering",
- ],
-}
-
-// GN: //base/allocator/partition_allocator:logging_buildflags__testing
-cc_genrule {
- name: "cronet_aml_base_allocator_partition_allocator_logging_buildflags__testing",
- cmd: "echo '--flags PA_ENABLE_LOG_ERROR_NOT_REACHED=\"false\"' | " +
- "$(location build/write_buildflag_header.py) --output " +
- "$(out) " +
- "--rulename " +
- "//base/allocator/partition_allocator:logging_buildflags " +
- "--gen-dir " +
- ". " +
- "--definitions " +
- "/dev/stdin",
- host_supported: true,
- out: [
- "base/allocator/partition_allocator/logging_buildflags.h",
- ],
- tool_files: [
- "build/write_buildflag_header.py",
- ],
- apex_available: [
- "com.android.tethering",
- ],
-}
-
-// GN: //base/allocator/partition_allocator:partition_alloc
-cc_library_static {
- name: "cronet_aml_base_allocator_partition_allocator_partition_alloc",
- srcs: [
- "base/allocator/partition_allocator/address_pool_manager.cc",
- "base/allocator/partition_allocator/address_pool_manager_bitmap.cc",
- "base/allocator/partition_allocator/address_space_randomization.cc",
- "base/allocator/partition_allocator/allocation_guard.cc",
- "base/allocator/partition_allocator/dangling_raw_ptr_checks.cc",
- "base/allocator/partition_allocator/gwp_asan_support.cc",
- "base/allocator/partition_allocator/memory_reclaimer.cc",
- "base/allocator/partition_allocator/oom.cc",
- "base/allocator/partition_allocator/oom_callback.cc",
- "base/allocator/partition_allocator/page_allocator.cc",
- "base/allocator/partition_allocator/page_allocator_internals_posix.cc",
- "base/allocator/partition_allocator/partition_address_space.cc",
- "base/allocator/partition_allocator/partition_alloc.cc",
- "base/allocator/partition_allocator/partition_alloc_base/check.cc",
- "base/allocator/partition_allocator/partition_alloc_base/cpu.cc",
- "base/allocator/partition_allocator/partition_alloc_base/debug/alias.cc",
- "base/allocator/partition_allocator/partition_alloc_base/files/file_path.cc",
- "base/allocator/partition_allocator/partition_alloc_base/files/file_util_posix.cc",
- "base/allocator/partition_allocator/partition_alloc_base/logging.cc",
- "base/allocator/partition_allocator/partition_alloc_base/memory/ref_counted.cc",
- "base/allocator/partition_allocator/partition_alloc_base/native_library.cc",
- "base/allocator/partition_allocator/partition_alloc_base/native_library_posix.cc",
- "base/allocator/partition_allocator/partition_alloc_base/posix/safe_strerror.cc",
- "base/allocator/partition_allocator/partition_alloc_base/rand_util.cc",
- "base/allocator/partition_allocator/partition_alloc_base/rand_util_posix.cc",
- "base/allocator/partition_allocator/partition_alloc_base/strings/stringprintf.cc",
- "base/allocator/partition_allocator/partition_alloc_base/threading/platform_thread.cc",
- "base/allocator/partition_allocator/partition_alloc_base/threading/platform_thread_posix.cc",
- "base/allocator/partition_allocator/partition_alloc_base/time/time.cc",
- "base/allocator/partition_allocator/partition_alloc_base/time/time_android.cc",
- "base/allocator/partition_allocator/partition_alloc_base/time/time_conversion_posix.cc",
- "base/allocator/partition_allocator/partition_alloc_base/time/time_now_posix.cc",
- "base/allocator/partition_allocator/partition_alloc_base/time/time_override.cc",
- "base/allocator/partition_allocator/partition_alloc_hooks.cc",
- "base/allocator/partition_allocator/partition_bucket.cc",
- "base/allocator/partition_allocator/partition_oom.cc",
- "base/allocator/partition_allocator/partition_page.cc",
- "base/allocator/partition_allocator/partition_root.cc",
- "base/allocator/partition_allocator/partition_stats.cc",
- "base/allocator/partition_allocator/random.cc",
- "base/allocator/partition_allocator/reservation_offset_table.cc",
- "base/allocator/partition_allocator/spinning_mutex.cc",
- "base/allocator/partition_allocator/starscan/metadata_allocator.cc",
- "base/allocator/partition_allocator/starscan/pcscan.cc",
- "base/allocator/partition_allocator/starscan/pcscan_internal.cc",
- "base/allocator/partition_allocator/starscan/pcscan_scheduling.cc",
- "base/allocator/partition_allocator/starscan/snapshot.cc",
- "base/allocator/partition_allocator/starscan/stack/stack.cc",
- "base/allocator/partition_allocator/starscan/stats_collector.cc",
- "base/allocator/partition_allocator/starscan/write_protector.cc",
- "base/allocator/partition_allocator/tagging.cc",
- "base/allocator/partition_allocator/thread_cache.cc",
- ],
- static_libs: [
- "cronet_aml_third_party_android_ndk_cpu_features",
- ],
- generated_headers: [
- "cronet_aml_base_allocator_partition_allocator_chromecast_buildflags",
- "cronet_aml_base_allocator_partition_allocator_chromeos_buildflags",
- "cronet_aml_base_allocator_partition_allocator_debugging_buildflags",
- "cronet_aml_base_allocator_partition_allocator_logging_buildflags",
- "cronet_aml_base_allocator_partition_allocator_partition_alloc_buildflags",
- ],
- export_generated_headers: [
- "cronet_aml_base_allocator_partition_allocator_chromecast_buildflags",
- "cronet_aml_base_allocator_partition_allocator_chromeos_buildflags",
- "cronet_aml_base_allocator_partition_allocator_debugging_buildflags",
- "cronet_aml_base_allocator_partition_allocator_logging_buildflags",
- "cronet_aml_base_allocator_partition_allocator_partition_alloc_buildflags",
- ],
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DHAVE_SYS_UIO_H",
- "-DIS_PARTITION_ALLOC_IMPL",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-DPA_PCSCAN_STACK_SUPPORTED",
- "-D_FORTIFY_SOURCE=2",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D__STDC_CONSTANT_MACROS",
- "-D__STDC_FORMAT_MACROS",
- "-O3",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "third_party/android_ndk/sources/android/cpufeatures/",
- ],
- header_libs: [
- "libgtest_prod_headers",
- ],
- cpp_std: "c++17",
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- ],
- target: {
- android_arm: {
- srcs: [
- "base/allocator/partition_allocator/starscan/stack/asm/arm/push_registers_asm.cc",
- ],
- cflags: [
- "-fstack-protector",
- ],
- },
- android_arm64: {
- srcs: [
- "base/allocator/partition_allocator/starscan/stack/asm/arm64/push_registers_asm.cc",
- ],
- cflags: [
- "-fstack-protector",
- "-march=armv8-a+memtag",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- srcs: [
- "base/allocator/partition_allocator/starscan/stack/asm/x86/push_registers_asm.cc",
- ],
- cflags: [
- "-msse3",
- ],
- },
- android_x86_64: {
- srcs: [
- "base/allocator/partition_allocator/starscan/stack/asm/x64/push_registers_asm.cc",
- ],
- cflags: [
- "-fstack-protector",
- "-msse3",
- ],
- },
- },
-}
-
-// GN: //base/allocator/partition_allocator:partition_alloc__testing
-cc_library_static {
- name: "cronet_aml_base_allocator_partition_allocator_partition_alloc__testing",
- srcs: [
- "base/allocator/partition_allocator/address_pool_manager.cc",
- "base/allocator/partition_allocator/address_pool_manager_bitmap.cc",
- "base/allocator/partition_allocator/address_space_randomization.cc",
- "base/allocator/partition_allocator/allocation_guard.cc",
- "base/allocator/partition_allocator/dangling_raw_ptr_checks.cc",
- "base/allocator/partition_allocator/gwp_asan_support.cc",
- "base/allocator/partition_allocator/memory_reclaimer.cc",
- "base/allocator/partition_allocator/oom.cc",
- "base/allocator/partition_allocator/oom_callback.cc",
- "base/allocator/partition_allocator/page_allocator.cc",
- "base/allocator/partition_allocator/page_allocator_internals_posix.cc",
- "base/allocator/partition_allocator/partition_address_space.cc",
- "base/allocator/partition_allocator/partition_alloc.cc",
- "base/allocator/partition_allocator/partition_alloc_base/check.cc",
- "base/allocator/partition_allocator/partition_alloc_base/cpu.cc",
- "base/allocator/partition_allocator/partition_alloc_base/debug/alias.cc",
- "base/allocator/partition_allocator/partition_alloc_base/files/file_util_posix.cc",
- "base/allocator/partition_allocator/partition_alloc_base/logging.cc",
- "base/allocator/partition_allocator/partition_alloc_base/memory/ref_counted.cc",
- "base/allocator/partition_allocator/partition_alloc_base/posix/safe_strerror.cc",
- "base/allocator/partition_allocator/partition_alloc_base/rand_util.cc",
- "base/allocator/partition_allocator/partition_alloc_base/rand_util_posix.cc",
- "base/allocator/partition_allocator/partition_alloc_base/strings/stringprintf.cc",
- "base/allocator/partition_allocator/partition_alloc_base/threading/platform_thread.cc",
- "base/allocator/partition_allocator/partition_alloc_base/threading/platform_thread_posix.cc",
- "base/allocator/partition_allocator/partition_alloc_base/time/time.cc",
- "base/allocator/partition_allocator/partition_alloc_base/time/time_conversion_posix.cc",
- "base/allocator/partition_allocator/partition_alloc_base/time/time_now_posix.cc",
- "base/allocator/partition_allocator/partition_alloc_base/time/time_override.cc",
- "base/allocator/partition_allocator/partition_alloc_hooks.cc",
- "base/allocator/partition_allocator/partition_bucket.cc",
- "base/allocator/partition_allocator/partition_oom.cc",
- "base/allocator/partition_allocator/partition_page.cc",
- "base/allocator/partition_allocator/partition_root.cc",
- "base/allocator/partition_allocator/partition_stats.cc",
- "base/allocator/partition_allocator/random.cc",
- "base/allocator/partition_allocator/reservation_offset_table.cc",
- "base/allocator/partition_allocator/spinning_mutex.cc",
- "base/allocator/partition_allocator/starscan/metadata_allocator.cc",
- "base/allocator/partition_allocator/starscan/pcscan.cc",
- "base/allocator/partition_allocator/starscan/pcscan_internal.cc",
- "base/allocator/partition_allocator/starscan/pcscan_scheduling.cc",
- "base/allocator/partition_allocator/starscan/snapshot.cc",
- "base/allocator/partition_allocator/starscan/stack/stack.cc",
- "base/allocator/partition_allocator/starscan/stats_collector.cc",
- "base/allocator/partition_allocator/starscan/write_protector.cc",
- "base/allocator/partition_allocator/tagging.cc",
- "base/allocator/partition_allocator/thread_cache.cc",
- ],
- host_supported: true,
- generated_headers: [
- "cronet_aml_base_allocator_partition_allocator_chromecast_buildflags__testing",
- "cronet_aml_base_allocator_partition_allocator_chromeos_buildflags__testing",
- "cronet_aml_base_allocator_partition_allocator_debugging_buildflags__testing",
- "cronet_aml_base_allocator_partition_allocator_logging_buildflags__testing",
- "cronet_aml_base_allocator_partition_allocator_partition_alloc_buildflags__testing",
- ],
- export_generated_headers: [
- "cronet_aml_base_allocator_partition_allocator_chromecast_buildflags__testing",
- "cronet_aml_base_allocator_partition_allocator_chromeos_buildflags__testing",
- "cronet_aml_base_allocator_partition_allocator_debugging_buildflags__testing",
- "cronet_aml_base_allocator_partition_allocator_logging_buildflags__testing",
- "cronet_aml_base_allocator_partition_allocator_partition_alloc_buildflags__testing",
- ],
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DIS_PARTITION_ALLOC_IMPL",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-DPA_PCSCAN_STACK_SUPPORTED",
- "-D_FORTIFY_SOURCE=2",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D__STDC_CONSTANT_MACROS",
- "-D__STDC_FORMAT_MACROS",
- "-O3",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- ],
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- ],
- target: {
- android_arm: {
- srcs: [
- "base/allocator/partition_allocator/partition_alloc_base/files/file_path.cc",
- "base/allocator/partition_allocator/partition_alloc_base/native_library.cc",
- "base/allocator/partition_allocator/partition_alloc_base/native_library_posix.cc",
- "base/allocator/partition_allocator/partition_alloc_base/time/time_android.cc",
- "base/allocator/partition_allocator/starscan/stack/asm/arm/push_registers_asm.cc",
- ],
- static_libs: [
- "cronet_aml_third_party_android_ndk_cpu_features__testing",
- ],
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-fstack-protector",
- ],
- local_include_dirs: [
- "third_party/android_ndk/sources/android/cpufeatures/",
- ],
- },
- android_arm64: {
- srcs: [
- "base/allocator/partition_allocator/partition_alloc_base/files/file_path.cc",
- "base/allocator/partition_allocator/partition_alloc_base/native_library.cc",
- "base/allocator/partition_allocator/partition_alloc_base/native_library_posix.cc",
- "base/allocator/partition_allocator/partition_alloc_base/time/time_android.cc",
- "base/allocator/partition_allocator/starscan/stack/asm/arm64/push_registers_asm.cc",
- ],
- static_libs: [
- "cronet_aml_third_party_android_ndk_cpu_features__testing",
- ],
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-fstack-protector",
- "-march=armv8-a+memtag",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- local_include_dirs: [
- "third_party/android_ndk/sources/android/cpufeatures/",
- ],
- },
- android_x86: {
- srcs: [
- "base/allocator/partition_allocator/partition_alloc_base/files/file_path.cc",
- "base/allocator/partition_allocator/partition_alloc_base/native_library.cc",
- "base/allocator/partition_allocator/partition_alloc_base/native_library_posix.cc",
- "base/allocator/partition_allocator/partition_alloc_base/time/time_android.cc",
- "base/allocator/partition_allocator/starscan/stack/asm/x86/push_registers_asm.cc",
- ],
- static_libs: [
- "cronet_aml_third_party_android_ndk_cpu_features__testing",
- ],
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-msse3",
- ],
- local_include_dirs: [
- "third_party/android_ndk/sources/android/cpufeatures/",
- ],
- },
- android_x86_64: {
- srcs: [
- "base/allocator/partition_allocator/partition_alloc_base/files/file_path.cc",
- "base/allocator/partition_allocator/partition_alloc_base/native_library.cc",
- "base/allocator/partition_allocator/partition_alloc_base/native_library_posix.cc",
- "base/allocator/partition_allocator/partition_alloc_base/time/time_android.cc",
- "base/allocator/partition_allocator/starscan/stack/asm/x64/push_registers_asm.cc",
- ],
- static_libs: [
- "cronet_aml_third_party_android_ndk_cpu_features__testing",
- ],
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-fstack-protector",
- "-msse3",
- ],
- local_include_dirs: [
- "third_party/android_ndk/sources/android/cpufeatures/",
- ],
- },
- host: {
- srcs: [
- "base/allocator/partition_allocator/starscan/stack/asm/x64/push_registers_asm.cc",
- ],
- cflags: [
- "-DCR_SYSROOT_KEY=20220331T153654Z-0",
- "-DUSE_AURA=1",
- "-DUSE_OZONE=1",
- "-DUSE_UDEV",
- "-D_FILE_OFFSET_BITS=64",
- "-D_LARGEFILE64_SOURCE",
- "-D_LARGEFILE_SOURCE",
- "-fstack-protector",
- "-msse3",
- ],
- compile_multilib: "64",
- },
- },
-}
-
-// GN: //base/allocator/partition_allocator:partition_alloc_buildflags
-cc_genrule {
- name: "cronet_aml_base_allocator_partition_allocator_partition_alloc_buildflags",
- cmd: "echo '--flags ENABLE_PARTITION_ALLOC_AS_MALLOC_SUPPORT=\"true\" ENABLE_BACKUP_REF_PTR_SUPPORT=\"true\" ENABLE_BACKUP_REF_PTR_SLOW_CHECKS=\"false\" ENABLE_DANGLING_RAW_PTR_CHECKS=\"false\" PUT_REF_COUNT_IN_PREVIOUS_SLOT=\"true\" ENABLE_GWP_ASAN_SUPPORT=\"true\" ENABLE_MTE_CHECKED_PTR_SUPPORT=\"false\" RECORD_ALLOC_INFO=\"false\" USE_FREESLOT_BITMAP=\"false\" ENABLE_SHADOW_METADATA_FOR_64_BITS_POINTERS=\"false\" STARSCAN=\"true\" PA_USE_BASE_TRACING=\"true\" ENABLE_PKEYS=\"false\"' | " +
- "$(location build/write_buildflag_header.py) --output " +
- "$(out) " +
- "--rulename " +
- "//base/allocator/partition_allocator:partition_alloc_buildflags " +
- "--gen-dir " +
- ". " +
- "--definitions " +
- "/dev/stdin",
- out: [
- "base/allocator/partition_allocator/partition_alloc_buildflags.h",
- ],
- tool_files: [
- "build/write_buildflag_header.py",
- ],
- apex_available: [
- "com.android.tethering",
- ],
-}
-
-// GN: //base/allocator/partition_allocator:partition_alloc_buildflags__testing
-cc_genrule {
- name: "cronet_aml_base_allocator_partition_allocator_partition_alloc_buildflags__testing",
- cmd: "if [[ ( $$CC_ARCH == 'x86_64' && $$CC_OS == 'android' ) ]]; " +
- "then " +
- "echo '--flags ENABLE_PARTITION_ALLOC_AS_MALLOC_SUPPORT=\"true\" ENABLE_BACKUP_REF_PTR_SUPPORT=\"true\" ENABLE_BACKUP_REF_PTR_SLOW_CHECKS=\"false\" ENABLE_DANGLING_RAW_PTR_CHECKS=\"false\" PUT_REF_COUNT_IN_PREVIOUS_SLOT=\"true\" ENABLE_GWP_ASAN_SUPPORT=\"true\" ENABLE_MTE_CHECKED_PTR_SUPPORT=\"false\" RECORD_ALLOC_INFO=\"false\" USE_FREESLOT_BITMAP=\"false\" ENABLE_SHADOW_METADATA_FOR_64_BITS_POINTERS=\"false\" STARSCAN=\"true\" PA_USE_BASE_TRACING=\"true\" ENABLE_PKEYS=\"false\"' | " +
- "$(location build/write_buildflag_header.py) --output " +
- "$(out) " +
- "--rulename " +
- "//base/allocator/partition_allocator:partition_alloc_buildflags " +
- "--gen-dir " +
- ". " +
- "--definitions " +
- "/dev/stdin; " +
- "fi; " +
- "if [[ $$CC_OS != 'android' ]]; " +
- "then " +
- "echo '--flags ENABLE_PARTITION_ALLOC_AS_MALLOC_SUPPORT=\"true\" ENABLE_BACKUP_REF_PTR_SUPPORT=\"true\" ENABLE_BACKUP_REF_PTR_SLOW_CHECKS=\"false\" ENABLE_DANGLING_RAW_PTR_CHECKS=\"false\" PUT_REF_COUNT_IN_PREVIOUS_SLOT=\"true\" ENABLE_GWP_ASAN_SUPPORT=\"true\" ENABLE_MTE_CHECKED_PTR_SUPPORT=\"false\" RECORD_ALLOC_INFO=\"false\" USE_FREESLOT_BITMAP=\"false\" ENABLE_SHADOW_METADATA_FOR_64_BITS_POINTERS=\"false\" STARSCAN=\"true\" PA_USE_BASE_TRACING=\"true\" ENABLE_PKEYS=\"true\"' | " +
- "$(location build/write_buildflag_header.py) --output " +
- "$(out) " +
- "--rulename " +
- "//base/allocator/partition_allocator:partition_alloc_buildflags " +
- "--gen-dir " +
- ". " +
- "--definitions " +
- "/dev/stdin; " +
- "fi; " +
- "if [[ ( $$CC_ARCH == 'x86' && $$CC_OS == 'android' ) ]]; " +
- "then " +
- "echo '--flags ENABLE_PARTITION_ALLOC_AS_MALLOC_SUPPORT=\"true\" ENABLE_BACKUP_REF_PTR_SUPPORT=\"true\" ENABLE_BACKUP_REF_PTR_SLOW_CHECKS=\"false\" ENABLE_DANGLING_RAW_PTR_CHECKS=\"false\" PUT_REF_COUNT_IN_PREVIOUS_SLOT=\"true\" ENABLE_GWP_ASAN_SUPPORT=\"true\" ENABLE_MTE_CHECKED_PTR_SUPPORT=\"false\" RECORD_ALLOC_INFO=\"false\" USE_FREESLOT_BITMAP=\"false\" ENABLE_SHADOW_METADATA_FOR_64_BITS_POINTERS=\"false\" STARSCAN=\"true\" PA_USE_BASE_TRACING=\"true\" ENABLE_PKEYS=\"false\"' | " +
- "$(location build/write_buildflag_header.py) --output " +
- "$(out) " +
- "--rulename " +
- "//base/allocator/partition_allocator:partition_alloc_buildflags " +
- "--gen-dir " +
- ". " +
- "--definitions " +
- "/dev/stdin; " +
- "fi; " +
- "if [[ ( $$CC_ARCH == 'arm' && $$CC_OS == 'android' ) ]]; " +
- "then " +
- "echo '--flags ENABLE_PARTITION_ALLOC_AS_MALLOC_SUPPORT=\"true\" ENABLE_BACKUP_REF_PTR_SUPPORT=\"true\" ENABLE_BACKUP_REF_PTR_SLOW_CHECKS=\"false\" ENABLE_DANGLING_RAW_PTR_CHECKS=\"false\" PUT_REF_COUNT_IN_PREVIOUS_SLOT=\"true\" ENABLE_GWP_ASAN_SUPPORT=\"true\" ENABLE_MTE_CHECKED_PTR_SUPPORT=\"false\" RECORD_ALLOC_INFO=\"false\" USE_FREESLOT_BITMAP=\"false\" ENABLE_SHADOW_METADATA_FOR_64_BITS_POINTERS=\"false\" STARSCAN=\"true\" PA_USE_BASE_TRACING=\"true\" ENABLE_PKEYS=\"false\"' | " +
- "$(location build/write_buildflag_header.py) --output " +
- "$(out) " +
- "--rulename " +
- "//base/allocator/partition_allocator:partition_alloc_buildflags " +
- "--gen-dir " +
- ". " +
- "--definitions " +
- "/dev/stdin; " +
- "fi; " +
- "if [[ ( $$CC_ARCH == 'arm64' && $$CC_OS == 'android' ) ]]; " +
- "then " +
- "echo '--flags ENABLE_PARTITION_ALLOC_AS_MALLOC_SUPPORT=\"true\" ENABLE_BACKUP_REF_PTR_SUPPORT=\"true\" ENABLE_BACKUP_REF_PTR_SLOW_CHECKS=\"false\" ENABLE_DANGLING_RAW_PTR_CHECKS=\"false\" PUT_REF_COUNT_IN_PREVIOUS_SLOT=\"true\" ENABLE_GWP_ASAN_SUPPORT=\"true\" ENABLE_MTE_CHECKED_PTR_SUPPORT=\"false\" RECORD_ALLOC_INFO=\"false\" USE_FREESLOT_BITMAP=\"false\" ENABLE_SHADOW_METADATA_FOR_64_BITS_POINTERS=\"false\" STARSCAN=\"true\" PA_USE_BASE_TRACING=\"true\" ENABLE_PKEYS=\"false\"' | " +
- "$(location build/write_buildflag_header.py) --output " +
- "$(out) " +
- "--rulename " +
- "//base/allocator/partition_allocator:partition_alloc_buildflags " +
- "--gen-dir " +
- ". " +
- "--definitions " +
- "/dev/stdin; " +
- "fi;",
- host_supported: true,
- out: [
- "base/allocator/partition_allocator/partition_alloc_buildflags.h",
- ],
- tool_files: [
- "build/write_buildflag_header.py",
- ],
- apex_available: [
- "com.android.tethering",
- ],
-}
-
-// GN: //base:anchor_functions_buildflags
-cc_genrule {
- name: "cronet_aml_base_anchor_functions_buildflags",
- cmd: "echo '--flags USE_LLD=\"true\" SUPPORTS_CODE_ORDERING=\"true\"' | " +
- "$(location build/write_buildflag_header.py) --output " +
- "$(out) " +
- "--rulename " +
- "//base:anchor_functions_buildflags " +
- "--gen-dir " +
- ". " +
- "--definitions " +
- "/dev/stdin",
- out: [
- "base/android/library_loader/anchor_functions_buildflags.h",
- ],
- tool_files: [
- "build/write_buildflag_header.py",
- ],
- apex_available: [
- "com.android.tethering",
- ],
-}
-
-// GN: //base:anchor_functions_buildflags__testing
-cc_genrule {
- name: "cronet_aml_base_anchor_functions_buildflags__testing",
- cmd: "if [[ ( $$CC_ARCH == 'x86_64' && $$CC_OS == 'android' ) ]]; " +
- "then " +
- "echo '--flags USE_LLD=\"true\" SUPPORTS_CODE_ORDERING=\"true\"' | " +
- "$(location build/write_buildflag_header.py) --output " +
- "$(out) " +
- "--rulename " +
- "//base:anchor_functions_buildflags " +
- "--gen-dir " +
- ". " +
- "--definitions " +
- "/dev/stdin; " +
- "fi; " +
- "if [[ $$CC_OS != 'android' ]]; " +
- "then " +
- "echo '--flags USE_LLD=\"true\" SUPPORTS_CODE_ORDERING=\"false\"' | " +
- "$(location build/write_buildflag_header.py) --output " +
- "$(out) " +
- "--rulename " +
- "//base:anchor_functions_buildflags " +
- "--gen-dir " +
- ". " +
- "--definitions " +
- "/dev/stdin; " +
- "fi; " +
- "if [[ ( $$CC_ARCH == 'x86' && $$CC_OS == 'android' ) ]]; " +
- "then " +
- "echo '--flags USE_LLD=\"true\" SUPPORTS_CODE_ORDERING=\"true\"' | " +
- "$(location build/write_buildflag_header.py) --output " +
- "$(out) " +
- "--rulename " +
- "//base:anchor_functions_buildflags " +
- "--gen-dir " +
- ". " +
- "--definitions " +
- "/dev/stdin; " +
- "fi; " +
- "if [[ ( $$CC_ARCH == 'arm' && $$CC_OS == 'android' ) ]]; " +
- "then " +
- "echo '--flags USE_LLD=\"true\" SUPPORTS_CODE_ORDERING=\"true\"' | " +
- "$(location build/write_buildflag_header.py) --output " +
- "$(out) " +
- "--rulename " +
- "//base:anchor_functions_buildflags " +
- "--gen-dir " +
- ". " +
- "--definitions " +
- "/dev/stdin; " +
- "fi; " +
- "if [[ ( $$CC_ARCH == 'arm64' && $$CC_OS == 'android' ) ]]; " +
- "then " +
- "echo '--flags USE_LLD=\"true\" SUPPORTS_CODE_ORDERING=\"true\"' | " +
- "$(location build/write_buildflag_header.py) --output " +
- "$(out) " +
- "--rulename " +
- "//base:anchor_functions_buildflags " +
- "--gen-dir " +
- ". " +
- "--definitions " +
- "/dev/stdin; " +
- "fi;",
- host_supported: true,
- out: [
- "base/android/library_loader/anchor_functions_buildflags.h",
- ],
- tool_files: [
- "build/write_buildflag_header.py",
- ],
- apex_available: [
- "com.android.tethering",
- ],
-}
-
-// GN: //base:android_runtime_jni_headers
-cc_genrule {
- name: "cronet_aml_base_android_runtime_jni_headers",
- cmd: "$(location base/android/jni_generator/jni_generator.py) --ptr_type " +
- "long " +
- "--output_dir " +
- "$(genDir)/base/android_runtime_jni_headers " +
- "--includes " +
- "base/android/jni_generator/jni_generator_helper.h " +
- "--jar_file " +
- "$(location :current_android_jar) " +
- "--output_name " +
- "Runnable_jni.h " +
- "--output_name " +
- "Runtime_jni.h " +
- "--input_file " +
- "java/lang/Runnable.class " +
- "--input_file " +
- "java/lang/Runtime.class " +
- "--javap " +
- "$$(find $${OUT_DIR:-out}/.path -name javap) " +
- "--package_prefix " +
- "android.net.http.internal",
- out: [
- "base/android_runtime_jni_headers/Runnable_jni.h",
- "base/android_runtime_jni_headers/Runtime_jni.h",
- ],
- tool_files: [
- ":current_android_jar",
- "base/android/jni_generator/android_jar.classes",
- "base/android/jni_generator/jni_generator.py",
- "build/android/gyp/util/__init__.py",
- "build/android/gyp/util/build_utils.py",
- "build/gn_helpers.py",
- ],
- apex_available: [
- "com.android.tethering",
- ],
-}
-
-// GN: //base:android_runtime_jni_headers__testing
-cc_genrule {
- name: "cronet_aml_base_android_runtime_jni_headers__testing",
- cmd: "$(location base/android/jni_generator/jni_generator.py) --ptr_type " +
- "long " +
- "--output_dir " +
- "$(genDir)/base/android_runtime_jni_headers " +
- "--includes " +
- "base/android/jni_generator/jni_generator_helper.h " +
- "--jar_file " +
- "$(location :current_android_jar) " +
- "--output_name " +
- "Runnable_jni.h " +
- "--output_name " +
- "Runtime_jni.h " +
- "--input_file " +
- "java/lang/Runnable.class " +
- "--input_file " +
- "java/lang/Runtime.class " +
- "--javap " +
- "$$(find $${OUT_DIR:-out}/.path -name javap)",
- out: [
- "base/android_runtime_jni_headers/Runnable_jni.h",
- "base/android_runtime_jni_headers/Runtime_jni.h",
- ],
- tool_files: [
- ":current_android_jar",
- "base/android/jni_generator/android_jar.classes",
- "base/android/jni_generator/jni_generator.py",
- "build/android/gyp/util/__init__.py",
- "build/android/gyp/util/build_utils.py",
- "build/gn_helpers.py",
- ],
- apex_available: [
- "com.android.tethering",
- ],
-}
-
-// GN: //base:base
-cc_library_static {
- name: "cronet_aml_base_base",
- srcs: [
- "base/allocator/allocator_check.cc",
- "base/allocator/allocator_extension.cc",
- "base/allocator/dispatcher/dispatcher.cc",
- "base/allocator/dispatcher/internal/dispatch_data.cc",
- "base/allocator/dispatcher/reentry_guard.cc",
- "base/allocator/partition_allocator/shim/allocator_shim.cc",
- "base/allocator/partition_allocator/shim/allocator_shim_default_dispatch_to_linker_wrapped_symbols.cc",
- "base/android/android_hardware_buffer_compat.cc",
- "base/android/android_image_reader_compat.cc",
- "base/android/apk_assets.cc",
- "base/android/application_status_listener.cc",
- "base/android/base_feature_list.cc",
- "base/android/base_features.cc",
- "base/android/base_jni_onload.cc",
- "base/android/build_info.cc",
- "base/android/bundle_utils.cc",
- "base/android/callback_android.cc",
- "base/android/child_process_service.cc",
- "base/android/command_line_android.cc",
- "base/android/content_uri_utils.cc",
- "base/android/cpu_features.cc",
- "base/android/early_trace_event_binding.cc",
- "base/android/event_log.cc",
- "base/android/feature_list_jni.cc",
- "base/android/features_jni.cc",
- "base/android/field_trial_list.cc",
- "base/android/important_file_writer_android.cc",
- "base/android/int_string_callback.cc",
- "base/android/jank_metric_uma_recorder.cc",
- "base/android/java_exception_reporter.cc",
- "base/android/java_handler_thread.cc",
- "base/android/java_heap_dump_generator.cc",
- "base/android/java_runtime.cc",
- "base/android/jni_android.cc",
- "base/android/jni_array.cc",
- "base/android/jni_registrar.cc",
- "base/android/jni_string.cc",
- "base/android/jni_utils.cc",
- "base/android/jni_weak_ref.cc",
- "base/android/library_loader/anchor_functions.cc",
- "base/android/library_loader/library_loader_hooks.cc",
- "base/android/library_loader/library_prefetcher.cc",
- "base/android/library_loader/library_prefetcher_hooks.cc",
- "base/android/locale_utils.cc",
- "base/android/memory_pressure_listener_android.cc",
- "base/android/native_uma_recorder.cc",
- "base/android/path_service_android.cc",
- "base/android/path_utils.cc",
- "base/android/radio_utils.cc",
- "base/android/reached_addresses_bitset.cc",
- "base/android/remove_stale_data.cc",
- "base/android/scoped_hardware_buffer_fence_sync.cc",
- "base/android/scoped_hardware_buffer_handle.cc",
- "base/android/scoped_java_ref.cc",
- "base/android/statistics_recorder_android.cc",
- "base/android/sys_utils.cc",
- "base/android/task_scheduler/post_task_android.cc",
- "base/android/task_scheduler/task_runner_android.cc",
- "base/android/thread_instruction_count.cc",
- "base/android/timezone_utils.cc",
- "base/android/trace_event_binding.cc",
- "base/android/unguessable_token_android.cc",
- "base/at_exit.cc",
- "base/barrier_closure.cc",
- "base/base64.cc",
- "base/base64url.cc",
- "base/base_paths.cc",
- "base/base_paths_android.cc",
- "base/big_endian.cc",
- "base/build_time.cc",
- "base/callback_list.cc",
- "base/check.cc",
- "base/check_is_test.cc",
- "base/check_op.cc",
- "base/command_line.cc",
- "base/containers/flat_tree.cc",
- "base/containers/intrusive_heap.cc",
- "base/containers/linked_list.cc",
- "base/cpu.cc",
- "base/cpu_reduction_experiment.cc",
- "base/debug/activity_analyzer.cc",
- "base/debug/activity_tracker.cc",
- "base/debug/alias.cc",
- "base/debug/asan_invalid_access.cc",
- "base/debug/buffered_dwarf_reader.cc",
- "base/debug/crash_logging.cc",
- "base/debug/debugger.cc",
- "base/debug/debugger_posix.cc",
- "base/debug/dump_without_crashing.cc",
- "base/debug/dwarf_line_no.cc",
- "base/debug/elf_reader.cc",
- "base/debug/proc_maps_linux.cc",
- "base/debug/profiler.cc",
- "base/debug/stack_trace.cc",
- "base/debug/stack_trace_android.cc",
- "base/debug/task_trace.cc",
- "base/environment.cc",
- "base/feature_list.cc",
- "base/features.cc",
- "base/file_descriptor_posix.cc",
- "base/file_descriptor_store.cc",
- "base/files/file.cc",
- "base/files/file_descriptor_watcher_posix.cc",
- "base/files/file_enumerator.cc",
- "base/files/file_enumerator_posix.cc",
- "base/files/file_path.cc",
- "base/files/file_path_watcher.cc",
- "base/files/file_path_watcher_inotify.cc",
- "base/files/file_posix.cc",
- "base/files/file_proxy.cc",
- "base/files/file_tracing.cc",
- "base/files/file_util.cc",
- "base/files/file_util_android.cc",
- "base/files/file_util_posix.cc",
- "base/files/important_file_writer.cc",
- "base/files/important_file_writer_cleaner.cc",
- "base/files/memory_mapped_file.cc",
- "base/files/memory_mapped_file_posix.cc",
- "base/files/safe_base_name.cc",
- "base/files/scoped_file.cc",
- "base/files/scoped_file_android.cc",
- "base/files/scoped_temp_dir.cc",
- "base/functional/callback_helpers.cc",
- "base/functional/callback_internal.cc",
- "base/guid.cc",
- "base/hash/hash.cc",
- "base/hash/legacy_hash.cc",
- "base/hash/md5_boringssl.cc",
- "base/hash/sha1_boringssl.cc",
- "base/json/json_file_value_serializer.cc",
- "base/json/json_parser.cc",
- "base/json/json_reader.cc",
- "base/json/json_string_value_serializer.cc",
- "base/json/json_value_converter.cc",
- "base/json/json_writer.cc",
- "base/json/string_escape.cc",
- "base/json/values_util.cc",
- "base/lazy_instance_helpers.cc",
- "base/linux_util.cc",
- "base/location.cc",
- "base/logging.cc",
- "base/memory/aligned_memory.cc",
- "base/memory/discardable_memory.cc",
- "base/memory/discardable_memory_allocator.cc",
- "base/memory/discardable_shared_memory.cc",
- "base/memory/madv_free_discardable_memory_allocator_posix.cc",
- "base/memory/madv_free_discardable_memory_posix.cc",
- "base/memory/memory_pressure_listener.cc",
- "base/memory/memory_pressure_monitor.cc",
- "base/memory/nonscannable_memory.cc",
- "base/memory/page_size_posix.cc",
- "base/memory/platform_shared_memory_handle.cc",
- "base/memory/platform_shared_memory_mapper_android.cc",
- "base/memory/platform_shared_memory_region.cc",
- "base/memory/platform_shared_memory_region_android.cc",
- "base/memory/raw_ptr.cc",
- "base/memory/raw_ptr_asan_bound_arg_tracker.cc",
- "base/memory/raw_ptr_asan_service.cc",
- "base/memory/read_only_shared_memory_region.cc",
- "base/memory/ref_counted.cc",
- "base/memory/ref_counted_memory.cc",
- "base/memory/shared_memory_mapper.cc",
- "base/memory/shared_memory_mapping.cc",
- "base/memory/shared_memory_security_policy.cc",
- "base/memory/shared_memory_tracker.cc",
- "base/memory/unsafe_shared_memory_pool.cc",
- "base/memory/unsafe_shared_memory_region.cc",
- "base/memory/weak_ptr.cc",
- "base/memory/writable_shared_memory_region.cc",
- "base/message_loop/message_pump.cc",
- "base/message_loop/message_pump_android.cc",
- "base/message_loop/message_pump_default.cc",
- "base/message_loop/message_pump_epoll.cc",
- "base/message_loop/message_pump_libevent.cc",
- "base/message_loop/watchable_io_message_pump_posix.cc",
- "base/message_loop/work_id_provider.cc",
- "base/metrics/bucket_ranges.cc",
- "base/metrics/crc32.cc",
- "base/metrics/dummy_histogram.cc",
- "base/metrics/field_trial.cc",
- "base/metrics/field_trial_param_associator.cc",
- "base/metrics/field_trial_params.cc",
- "base/metrics/histogram.cc",
- "base/metrics/histogram_base.cc",
- "base/metrics/histogram_delta_serialization.cc",
- "base/metrics/histogram_functions.cc",
- "base/metrics/histogram_samples.cc",
- "base/metrics/histogram_snapshot_manager.cc",
- "base/metrics/metrics_hashes.cc",
- "base/metrics/persistent_histogram_allocator.cc",
- "base/metrics/persistent_histogram_storage.cc",
- "base/metrics/persistent_memory_allocator.cc",
- "base/metrics/persistent_sample_map.cc",
- "base/metrics/ranges_manager.cc",
- "base/metrics/sample_map.cc",
- "base/metrics/sample_vector.cc",
- "base/metrics/single_sample_metrics.cc",
- "base/metrics/sparse_histogram.cc",
- "base/metrics/statistics_recorder.cc",
- "base/metrics/user_metrics.cc",
- "base/native_library.cc",
- "base/native_library_posix.cc",
- "base/observer_list_internal.cc",
- "base/observer_list_threadsafe.cc",
- "base/observer_list_types.cc",
- "base/one_shot_event.cc",
- "base/os_compat_android.cc",
- "base/path_service.cc",
- "base/pending_task.cc",
- "base/pickle.cc",
- "base/posix/can_lower_nice_to.cc",
- "base/posix/file_descriptor_shuffle.cc",
- "base/posix/global_descriptors.cc",
- "base/posix/safe_strerror.cc",
- "base/posix/unix_domain_socket.cc",
- "base/power_monitor/battery_level_provider.cc",
- "base/power_monitor/battery_state_sampler.cc",
- "base/power_monitor/moving_average.cc",
- "base/power_monitor/power_monitor.cc",
- "base/power_monitor/power_monitor_device_source.cc",
- "base/power_monitor/power_monitor_device_source_android.cc",
- "base/power_monitor/power_monitor_features.cc",
- "base/power_monitor/power_monitor_source.cc",
- "base/power_monitor/sampling_event_source.cc",
- "base/power_monitor/timer_sampling_event_source.cc",
- "base/process/environment_internal.cc",
- "base/process/internal_linux.cc",
- "base/process/kill.cc",
- "base/process/kill_posix.cc",
- "base/process/launch.cc",
- "base/process/launch_posix.cc",
- "base/process/memory.cc",
- "base/process/memory_linux.cc",
- "base/process/process_android.cc",
- "base/process/process_handle.cc",
- "base/process/process_handle_linux.cc",
- "base/process/process_handle_posix.cc",
- "base/process/process_iterator.cc",
- "base/process/process_iterator_linux.cc",
- "base/process/process_metrics.cc",
- "base/process/process_metrics_linux.cc",
- "base/process/process_metrics_posix.cc",
- "base/process/process_posix.cc",
- "base/profiler/arm_cfi_table.cc",
- "base/profiler/frame.cc",
- "base/profiler/metadata_recorder.cc",
- "base/profiler/module_cache.cc",
- "base/profiler/module_cache_posix.cc",
- "base/profiler/sample_metadata.cc",
- "base/profiler/sampling_profiler_thread_token.cc",
- "base/profiler/stack_base_address_posix.cc",
- "base/profiler/stack_buffer.cc",
- "base/profiler/stack_copier.cc",
- "base/profiler/stack_copier_signal.cc",
- "base/profiler/stack_copier_suspend.cc",
- "base/profiler/stack_sampler.cc",
- "base/profiler/stack_sampler_android.cc",
- "base/profiler/stack_sampler_impl.cc",
- "base/profiler/stack_sampling_profiler.cc",
- "base/profiler/thread_delegate_posix.cc",
- "base/profiler/unwinder.cc",
- "base/rand_util.cc",
- "base/rand_util_posix.cc",
- "base/run_loop.cc",
- "base/sampling_heap_profiler/lock_free_address_hash_set.cc",
- "base/sampling_heap_profiler/poisson_allocation_sampler.cc",
- "base/sampling_heap_profiler/sampling_heap_profiler.cc",
- "base/scoped_add_feature_flags.cc",
- "base/scoped_environment_variable_override.cc",
- "base/scoped_native_library.cc",
- "base/sequence_checker.cc",
- "base/sequence_checker_impl.cc",
- "base/sequence_token.cc",
- "base/strings/abseil_string_conversions.cc",
- "base/strings/abseil_string_number_conversions.cc",
- "base/strings/escape.cc",
- "base/strings/latin1_string_conversions.cc",
- "base/strings/pattern.cc",
- "base/strings/safe_sprintf.cc",
- "base/strings/strcat.cc",
- "base/strings/string_number_conversions.cc",
- "base/strings/string_piece.cc",
- "base/strings/string_split.cc",
- "base/strings/string_util.cc",
- "base/strings/string_util_constants.cc",
- "base/strings/stringprintf.cc",
- "base/strings/sys_string_conversions_posix.cc",
- "base/strings/utf_offset_string_conversions.cc",
- "base/strings/utf_string_conversion_utils.cc",
- "base/strings/utf_string_conversions.cc",
- "base/substring_set_matcher/matcher_string_pattern.cc",
- "base/substring_set_matcher/substring_set_matcher.cc",
- "base/supports_user_data.cc",
- "base/sync_socket.cc",
- "base/sync_socket_posix.cc",
- "base/synchronization/atomic_flag.cc",
- "base/synchronization/condition_variable_posix.cc",
- "base/synchronization/lock.cc",
- "base/synchronization/lock_impl_posix.cc",
- "base/synchronization/waitable_event_posix.cc",
- "base/synchronization/waitable_event_watcher_posix.cc",
- "base/syslog_logging.cc",
- "base/system/sys_info.cc",
- "base/system/sys_info_android.cc",
- "base/system/sys_info_linux.cc",
- "base/system/sys_info_posix.cc",
- "base/system/system_monitor.cc",
- "base/task/cancelable_task_tracker.cc",
- "base/task/common/checked_lock_impl.cc",
- "base/task/common/lazy_now.cc",
- "base/task/common/operations_controller.cc",
- "base/task/common/scoped_defer_task_posting.cc",
- "base/task/common/task_annotator.cc",
- "base/task/current_thread.cc",
- "base/task/default_delayed_task_handle_delegate.cc",
- "base/task/deferred_sequenced_task_runner.cc",
- "base/task/delayed_task_handle.cc",
- "base/task/lazy_thread_pool_task_runner.cc",
- "base/task/post_job.cc",
- "base/task/scoped_set_task_priority_for_current_thread.cc",
- "base/task/sequence_manager/associated_thread_id.cc",
- "base/task/sequence_manager/atomic_flag_set.cc",
- "base/task/sequence_manager/delayed_task_handle_delegate.cc",
- "base/task/sequence_manager/enqueue_order_generator.cc",
- "base/task/sequence_manager/fence.cc",
- "base/task/sequence_manager/hierarchical_timing_wheel.cc",
- "base/task/sequence_manager/sequence_manager.cc",
- "base/task/sequence_manager/sequence_manager_impl.cc",
- "base/task/sequence_manager/sequenced_task_source.cc",
- "base/task/sequence_manager/task_order.cc",
- "base/task/sequence_manager/task_queue.cc",
- "base/task/sequence_manager/task_queue_impl.cc",
- "base/task/sequence_manager/task_queue_selector.cc",
- "base/task/sequence_manager/tasks.cc",
- "base/task/sequence_manager/thread_controller.cc",
- "base/task/sequence_manager/thread_controller_impl.cc",
- "base/task/sequence_manager/thread_controller_power_monitor.cc",
- "base/task/sequence_manager/thread_controller_with_message_pump_impl.cc",
- "base/task/sequence_manager/time_domain.cc",
- "base/task/sequence_manager/timing_wheel.cc",
- "base/task/sequence_manager/wake_up_queue.cc",
- "base/task/sequence_manager/work_deduplicator.cc",
- "base/task/sequence_manager/work_queue.cc",
- "base/task/sequence_manager/work_queue_sets.cc",
- "base/task/sequenced_task_runner.cc",
- "base/task/simple_task_executor.cc",
- "base/task/single_thread_task_executor.cc",
- "base/task/single_thread_task_runner.cc",
- "base/task/task_executor.cc",
- "base/task/task_features.cc",
- "base/task/task_runner.cc",
- "base/task/task_traits.cc",
- "base/task/thread_pool.cc",
- "base/task/thread_pool/delayed_priority_queue.cc",
- "base/task/thread_pool/delayed_task_manager.cc",
- "base/task/thread_pool/environment_config.cc",
- "base/task/thread_pool/initialization_util.cc",
- "base/task/thread_pool/job_task_source.cc",
- "base/task/thread_pool/pooled_parallel_task_runner.cc",
- "base/task/thread_pool/pooled_sequenced_task_runner.cc",
- "base/task/thread_pool/pooled_single_thread_task_runner_manager.cc",
- "base/task/thread_pool/pooled_task_runner_delegate.cc",
- "base/task/thread_pool/priority_queue.cc",
- "base/task/thread_pool/sequence.cc",
- "base/task/thread_pool/service_thread.cc",
- "base/task/thread_pool/task.cc",
- "base/task/thread_pool/task_source.cc",
- "base/task/thread_pool/task_source_sort_key.cc",
- "base/task/thread_pool/task_tracker.cc",
- "base/task/thread_pool/thread_group.cc",
- "base/task/thread_pool/thread_group_impl.cc",
- "base/task/thread_pool/thread_group_native.cc",
- "base/task/thread_pool/thread_pool_impl.cc",
- "base/task/thread_pool/thread_pool_instance.cc",
- "base/task/thread_pool/worker_thread.cc",
- "base/task/thread_pool/worker_thread_stack.cc",
- "base/third_party/cityhash/city.cc",
- "base/third_party/cityhash_v103/src/city_v103.cc",
- "base/third_party/nspr/prtime.cc",
- "base/third_party/superfasthash/superfasthash.c",
- "base/threading/hang_watcher.cc",
- "base/threading/platform_thread.cc",
- "base/threading/platform_thread_android.cc",
- "base/threading/platform_thread_internal_posix.cc",
- "base/threading/platform_thread_posix.cc",
- "base/threading/platform_thread_ref.cc",
- "base/threading/post_task_and_reply_impl.cc",
- "base/threading/scoped_blocking_call.cc",
- "base/threading/scoped_blocking_call_internal.cc",
- "base/threading/scoped_thread_priority.cc",
- "base/threading/sequence_local_storage_map.cc",
- "base/threading/sequence_local_storage_slot.cc",
- "base/threading/sequenced_task_runner_handle.cc",
- "base/threading/simple_thread.cc",
- "base/threading/thread.cc",
- "base/threading/thread_checker.cc",
- "base/threading/thread_checker_impl.cc",
- "base/threading/thread_collision_warner.cc",
- "base/threading/thread_id_name_manager.cc",
- "base/threading/thread_local_storage.cc",
- "base/threading/thread_local_storage_posix.cc",
- "base/threading/thread_restrictions.cc",
- "base/threading/thread_task_runner_handle.cc",
- "base/threading/watchdog.cc",
- "base/time/clock.cc",
- "base/time/default_clock.cc",
- "base/time/default_tick_clock.cc",
- "base/time/tick_clock.cc",
- "base/time/time.cc",
- "base/time/time_android.cc",
- "base/time/time_conversion_posix.cc",
- "base/time/time_delta_from_string.cc",
- "base/time/time_exploded_icu.cc",
- "base/time/time_exploded_posix.cc",
- "base/time/time_now_posix.cc",
- "base/time/time_override.cc",
- "base/time/time_to_iso8601.cc",
- "base/timer/elapsed_timer.cc",
- "base/timer/hi_res_timer_manager_posix.cc",
- "base/timer/lap_timer.cc",
- "base/timer/timer.cc",
- "base/timer/wall_clock_timer.cc",
- "base/token.cc",
- "base/trace_event/heap_profiler_allocation_context.cc",
- "base/trace_event/heap_profiler_allocation_context_tracker.cc",
- "base/trace_event/memory_allocator_dump_guid.cc",
- "base/trace_event/trace_event_stub.cc",
- "base/trace_event/trace_id_helper.cc",
- "base/unguessable_token.cc",
- "base/value_iterators.cc",
- "base/values.cc",
- "base/version.cc",
- "base/vlog.cc",
- ],
- shared_libs: [
- "libandroid",
- "liblog",
- ],
- static_libs: [
- "cronet_aml_base_allocator_partition_allocator_partition_alloc",
- "cronet_aml_base_base_static",
- "cronet_aml_base_nodebug_assertion",
- "cronet_aml_base_third_party_double_conversion_double_conversion",
- "cronet_aml_base_third_party_dynamic_annotations_dynamic_annotations",
- "cronet_aml_third_party_abseil_cpp_absl_base_base",
- "cronet_aml_third_party_abseil_cpp_absl_base_log_severity",
- "cronet_aml_third_party_abseil_cpp_absl_base_malloc_internal",
- "cronet_aml_third_party_abseil_cpp_absl_base_raw_logging_internal",
- "cronet_aml_third_party_abseil_cpp_absl_base_spinlock_wait",
- "cronet_aml_third_party_abseil_cpp_absl_base_strerror",
- "cronet_aml_third_party_abseil_cpp_absl_base_throw_delegate",
- "cronet_aml_third_party_abseil_cpp_absl_container_hashtablez_sampler",
- "cronet_aml_third_party_abseil_cpp_absl_container_raw_hash_set",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_debugging_internal",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_demangle_internal",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_examine_stack",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_failure_signal_handler",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_stacktrace",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_symbolize",
- "cronet_aml_third_party_abseil_cpp_absl_hash_city",
- "cronet_aml_third_party_abseil_cpp_absl_hash_hash",
- "cronet_aml_third_party_abseil_cpp_absl_hash_low_level_hash",
- "cronet_aml_third_party_abseil_cpp_absl_numeric_int128",
- "cronet_aml_third_party_abseil_cpp_absl_profiling_exponential_biased",
- "cronet_aml_third_party_abseil_cpp_absl_random_distributions",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_platform",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_pool_urbg",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_hwaes",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_hwaes_impl",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_slow",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_seed_material",
- "cronet_aml_third_party_abseil_cpp_absl_random_seed_gen_exception",
- "cronet_aml_third_party_abseil_cpp_absl_random_seed_sequences",
- "cronet_aml_third_party_abseil_cpp_absl_status_status",
- "cronet_aml_third_party_abseil_cpp_absl_status_statusor",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cord",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cord_internal",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_functions",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_handle",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_info",
- "cronet_aml_third_party_abseil_cpp_absl_strings_internal",
- "cronet_aml_third_party_abseil_cpp_absl_strings_str_format_internal",
- "cronet_aml_third_party_abseil_cpp_absl_strings_strings",
- "cronet_aml_third_party_abseil_cpp_absl_synchronization_graphcycles_internal",
- "cronet_aml_third_party_abseil_cpp_absl_synchronization_synchronization",
- "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_civil_time",
- "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_time_zone",
- "cronet_aml_third_party_abseil_cpp_absl_time_time",
- "cronet_aml_third_party_abseil_cpp_absl_types_bad_optional_access",
- "cronet_aml_third_party_abseil_cpp_absl_types_bad_variant_access",
- "cronet_aml_third_party_android_ndk_cpu_features",
- "cronet_aml_third_party_ashmem_ashmem",
- "cronet_aml_third_party_boringssl_boringssl",
- "cronet_aml_third_party_boringssl_boringssl_asm",
- "cronet_aml_third_party_icu_icui18n",
- "cronet_aml_third_party_icu_icuuc_private",
- "cronet_aml_third_party_libevent_libevent",
- "cronet_aml_third_party_modp_b64_modp_b64",
- ],
- generated_headers: [
- "cronet_aml_base_allocator_buildflags",
- "cronet_aml_base_anchor_functions_buildflags",
- "cronet_aml_base_android_runtime_jni_headers",
- "cronet_aml_base_base_jni_headers",
- "cronet_aml_base_build_date",
- "cronet_aml_base_cfi_buildflags",
- "cronet_aml_base_clang_profiling_buildflags",
- "cronet_aml_base_debugging_buildflags",
- "cronet_aml_base_feature_list_buildflags",
- "cronet_aml_base_ios_cronet_buildflags",
- "cronet_aml_base_logging_buildflags",
- "cronet_aml_base_message_pump_buildflags",
- "cronet_aml_base_orderfile_buildflags",
- "cronet_aml_base_parsing_buildflags",
- "cronet_aml_base_power_monitor_buildflags",
- "cronet_aml_base_profiler_buildflags",
- "cronet_aml_base_sanitizer_buildflags",
- "cronet_aml_base_synchronization_buildflags",
- "cronet_aml_base_tracing_buildflags",
- "cronet_aml_build_branding_buildflags",
- "cronet_aml_build_chromecast_buildflags",
- "cronet_aml_build_chromeos_buildflags",
- "cronet_aml_build_config_compiler_compiler_buildflags",
- ],
- export_generated_headers: [
- "cronet_aml_base_allocator_buildflags",
- "cronet_aml_base_anchor_functions_buildflags",
- "cronet_aml_base_android_runtime_jni_headers",
- "cronet_aml_base_base_jni_headers",
- "cronet_aml_base_build_date",
- "cronet_aml_base_cfi_buildflags",
- "cronet_aml_base_clang_profiling_buildflags",
- "cronet_aml_base_debugging_buildflags",
- "cronet_aml_base_feature_list_buildflags",
- "cronet_aml_base_ios_cronet_buildflags",
- "cronet_aml_base_logging_buildflags",
- "cronet_aml_base_message_pump_buildflags",
- "cronet_aml_base_orderfile_buildflags",
- "cronet_aml_base_parsing_buildflags",
- "cronet_aml_base_power_monitor_buildflags",
- "cronet_aml_base_profiler_buildflags",
- "cronet_aml_base_sanitizer_buildflags",
- "cronet_aml_base_synchronization_buildflags",
- "cronet_aml_base_tracing_buildflags",
- "cronet_aml_build_branding_buildflags",
- "cronet_aml_build_chromecast_buildflags",
- "cronet_aml_build_chromeos_buildflags",
- "cronet_aml_build_config_compiler_compiler_buildflags",
- ],
- export_header_lib_headers: [
- "libgtest_prod_headers",
- ],
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DBASE_IMPLEMENTATION",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DHAVE_SYS_UIO_H",
- "-DICU_UTIL_DATA_IMPL=ICU_UTIL_DATA_FILE",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-DUSE_CHROMIUM_ICU=1",
- "-DU_ENABLE_DYLOAD=0",
- "-DU_ENABLE_RESOURCE_TRACING=0",
- "-DU_ENABLE_TRACING=1",
- "-DU_STATIC_IMPLEMENTATION",
- "-DU_USING_ICU_NAMESPACE=0",
- "-D_FORTIFY_SOURCE=2",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D__STDC_CONSTANT_MACROS",
- "-D__STDC_FORMAT_MACROS",
- "-O2",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "third_party/abseil-cpp/",
- "third_party/android_ndk/sources/android/cpufeatures/",
- "third_party/boringssl/src/include/",
- "third_party/icu/source/common/",
- "third_party/icu/source/i18n/",
- ],
- header_libs: [
- "libgtest_prod_headers",
- ],
- cpp_std: "c++17",
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- "-Wl,--script,external/cronet/base/android/library_loader/anchor_functions.lds",
- "-Wl,-wrap,asprintf",
- "-Wl,-wrap,calloc",
- "-Wl,-wrap,free",
- "-Wl,-wrap,getcwd",
- "-Wl,-wrap,malloc",
- "-Wl,-wrap,malloc_usable_size",
- "-Wl,-wrap,memalign",
- "-Wl,-wrap,posix_memalign",
- "-Wl,-wrap,pvalloc",
- "-Wl,-wrap,realloc",
- "-Wl,-wrap,realpath",
- "-Wl,-wrap,strdup",
- "-Wl,-wrap,strndup",
- "-Wl,-wrap,valloc",
- "-Wl,-wrap,vasprintf",
- ],
- target: {
- android_arm: {
- srcs: [
- "base/android/reached_code_profiler.cc",
- "base/profiler/chrome_unwind_info_android.cc",
- "base/profiler/chrome_unwinder_android.cc",
- "base/profiler/chrome_unwinder_android_v2.cc",
- "base/trace_event/cfi_backtrace_android.cc",
- ],
- cflags: [
- "-fstack-protector",
- ],
- },
- android_arm64: {
- srcs: [
- "base/android/reached_code_profiler.cc",
- ],
- cflags: [
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- srcs: [
- "base/android/reached_code_profiler_stub.cc",
- ],
- cflags: [
- "-msse3",
- ],
- },
- android_x86_64: {
- srcs: [
- "base/android/reached_code_profiler_stub.cc",
- ],
- cflags: [
- "-fstack-protector",
- "-msse3",
- ],
- },
- },
-}
-
-// GN: //base:base__testing
-cc_library_static {
- name: "cronet_aml_base_base__testing",
- srcs: [
- "base/allocator/allocator_check.cc",
- "base/allocator/allocator_extension.cc",
- "base/allocator/dispatcher/dispatcher.cc",
- "base/allocator/dispatcher/internal/dispatch_data.cc",
- "base/allocator/dispatcher/reentry_guard.cc",
- "base/allocator/partition_allocator/shim/allocator_shim.cc",
- "base/at_exit.cc",
- "base/barrier_closure.cc",
- "base/base64.cc",
- "base/base64url.cc",
- "base/base_paths.cc",
- "base/big_endian.cc",
- "base/build_time.cc",
- "base/callback_list.cc",
- "base/check.cc",
- "base/check_is_test.cc",
- "base/check_op.cc",
- "base/command_line.cc",
- "base/containers/flat_tree.cc",
- "base/containers/intrusive_heap.cc",
- "base/containers/linked_list.cc",
- "base/cpu.cc",
- "base/cpu_reduction_experiment.cc",
- "base/debug/activity_analyzer.cc",
- "base/debug/activity_tracker.cc",
- "base/debug/alias.cc",
- "base/debug/asan_invalid_access.cc",
- "base/debug/buffered_dwarf_reader.cc",
- "base/debug/crash_logging.cc",
- "base/debug/debugger.cc",
- "base/debug/debugger_posix.cc",
- "base/debug/dump_without_crashing.cc",
- "base/debug/dwarf_line_no.cc",
- "base/debug/elf_reader.cc",
- "base/debug/proc_maps_linux.cc",
- "base/debug/profiler.cc",
- "base/debug/stack_trace.cc",
- "base/debug/task_trace.cc",
- "base/environment.cc",
- "base/feature_list.cc",
- "base/features.cc",
- "base/file_descriptor_posix.cc",
- "base/file_descriptor_store.cc",
- "base/files/file.cc",
- "base/files/file_descriptor_watcher_posix.cc",
- "base/files/file_enumerator.cc",
- "base/files/file_enumerator_posix.cc",
- "base/files/file_path.cc",
- "base/files/file_path_watcher.cc",
- "base/files/file_path_watcher_inotify.cc",
- "base/files/file_posix.cc",
- "base/files/file_proxy.cc",
- "base/files/file_tracing.cc",
- "base/files/file_util.cc",
- "base/files/file_util_posix.cc",
- "base/files/important_file_writer.cc",
- "base/files/important_file_writer_cleaner.cc",
- "base/files/memory_mapped_file.cc",
- "base/files/memory_mapped_file_posix.cc",
- "base/files/safe_base_name.cc",
- "base/files/scoped_file.cc",
- "base/files/scoped_temp_dir.cc",
- "base/functional/callback_helpers.cc",
- "base/functional/callback_internal.cc",
- "base/guid.cc",
- "base/hash/hash.cc",
- "base/hash/legacy_hash.cc",
- "base/hash/md5_boringssl.cc",
- "base/hash/sha1_boringssl.cc",
- "base/json/json_file_value_serializer.cc",
- "base/json/json_parser.cc",
- "base/json/json_reader.cc",
- "base/json/json_string_value_serializer.cc",
- "base/json/json_value_converter.cc",
- "base/json/json_writer.cc",
- "base/json/string_escape.cc",
- "base/json/values_util.cc",
- "base/lazy_instance_helpers.cc",
- "base/linux_util.cc",
- "base/location.cc",
- "base/logging.cc",
- "base/memory/aligned_memory.cc",
- "base/memory/discardable_memory.cc",
- "base/memory/discardable_memory_allocator.cc",
- "base/memory/discardable_shared_memory.cc",
- "base/memory/madv_free_discardable_memory_allocator_posix.cc",
- "base/memory/madv_free_discardable_memory_posix.cc",
- "base/memory/memory_pressure_listener.cc",
- "base/memory/memory_pressure_monitor.cc",
- "base/memory/nonscannable_memory.cc",
- "base/memory/page_size_posix.cc",
- "base/memory/platform_shared_memory_handle.cc",
- "base/memory/platform_shared_memory_region.cc",
- "base/memory/raw_ptr.cc",
- "base/memory/raw_ptr_asan_bound_arg_tracker.cc",
- "base/memory/raw_ptr_asan_service.cc",
- "base/memory/read_only_shared_memory_region.cc",
- "base/memory/ref_counted.cc",
- "base/memory/ref_counted_memory.cc",
- "base/memory/shared_memory_mapper.cc",
- "base/memory/shared_memory_mapping.cc",
- "base/memory/shared_memory_security_policy.cc",
- "base/memory/shared_memory_tracker.cc",
- "base/memory/unsafe_shared_memory_pool.cc",
- "base/memory/unsafe_shared_memory_region.cc",
- "base/memory/weak_ptr.cc",
- "base/memory/writable_shared_memory_region.cc",
- "base/message_loop/message_pump.cc",
- "base/message_loop/message_pump_default.cc",
- "base/message_loop/message_pump_epoll.cc",
- "base/message_loop/message_pump_libevent.cc",
- "base/message_loop/watchable_io_message_pump_posix.cc",
- "base/message_loop/work_id_provider.cc",
- "base/metrics/bucket_ranges.cc",
- "base/metrics/crc32.cc",
- "base/metrics/dummy_histogram.cc",
- "base/metrics/field_trial.cc",
- "base/metrics/field_trial_param_associator.cc",
- "base/metrics/field_trial_params.cc",
- "base/metrics/histogram.cc",
- "base/metrics/histogram_base.cc",
- "base/metrics/histogram_delta_serialization.cc",
- "base/metrics/histogram_functions.cc",
- "base/metrics/histogram_samples.cc",
- "base/metrics/histogram_snapshot_manager.cc",
- "base/metrics/metrics_hashes.cc",
- "base/metrics/persistent_histogram_allocator.cc",
- "base/metrics/persistent_histogram_storage.cc",
- "base/metrics/persistent_memory_allocator.cc",
- "base/metrics/persistent_sample_map.cc",
- "base/metrics/ranges_manager.cc",
- "base/metrics/sample_map.cc",
- "base/metrics/sample_vector.cc",
- "base/metrics/single_sample_metrics.cc",
- "base/metrics/sparse_histogram.cc",
- "base/metrics/statistics_recorder.cc",
- "base/metrics/user_metrics.cc",
- "base/native_library.cc",
- "base/native_library_posix.cc",
- "base/observer_list_internal.cc",
- "base/observer_list_threadsafe.cc",
- "base/observer_list_types.cc",
- "base/one_shot_event.cc",
- "base/path_service.cc",
- "base/pending_task.cc",
- "base/pickle.cc",
- "base/posix/can_lower_nice_to.cc",
- "base/posix/file_descriptor_shuffle.cc",
- "base/posix/global_descriptors.cc",
- "base/posix/safe_strerror.cc",
- "base/posix/unix_domain_socket.cc",
- "base/power_monitor/battery_level_provider.cc",
- "base/power_monitor/battery_state_sampler.cc",
- "base/power_monitor/moving_average.cc",
- "base/power_monitor/power_monitor.cc",
- "base/power_monitor/power_monitor_device_source.cc",
- "base/power_monitor/power_monitor_features.cc",
- "base/power_monitor/power_monitor_source.cc",
- "base/power_monitor/sampling_event_source.cc",
- "base/power_monitor/timer_sampling_event_source.cc",
- "base/process/environment_internal.cc",
- "base/process/internal_linux.cc",
- "base/process/kill.cc",
- "base/process/kill_posix.cc",
- "base/process/launch.cc",
- "base/process/launch_posix.cc",
- "base/process/memory.cc",
- "base/process/memory_linux.cc",
- "base/process/process_handle.cc",
- "base/process/process_handle_linux.cc",
- "base/process/process_handle_posix.cc",
- "base/process/process_iterator.cc",
- "base/process/process_iterator_linux.cc",
- "base/process/process_metrics.cc",
- "base/process/process_metrics_linux.cc",
- "base/process/process_metrics_posix.cc",
- "base/process/process_posix.cc",
- "base/profiler/arm_cfi_table.cc",
- "base/profiler/frame.cc",
- "base/profiler/metadata_recorder.cc",
- "base/profiler/module_cache.cc",
- "base/profiler/module_cache_posix.cc",
- "base/profiler/sample_metadata.cc",
- "base/profiler/sampling_profiler_thread_token.cc",
- "base/profiler/stack_base_address_posix.cc",
- "base/profiler/stack_buffer.cc",
- "base/profiler/stack_copier.cc",
- "base/profiler/stack_copier_signal.cc",
- "base/profiler/stack_copier_suspend.cc",
- "base/profiler/stack_sampler.cc",
- "base/profiler/stack_sampler_impl.cc",
- "base/profiler/stack_sampling_profiler.cc",
- "base/profiler/thread_delegate_posix.cc",
- "base/profiler/unwinder.cc",
- "base/rand_util.cc",
- "base/rand_util_posix.cc",
- "base/run_loop.cc",
- "base/sampling_heap_profiler/lock_free_address_hash_set.cc",
- "base/sampling_heap_profiler/poisson_allocation_sampler.cc",
- "base/sampling_heap_profiler/sampling_heap_profiler.cc",
- "base/scoped_add_feature_flags.cc",
- "base/scoped_environment_variable_override.cc",
- "base/scoped_native_library.cc",
- "base/sequence_checker.cc",
- "base/sequence_checker_impl.cc",
- "base/sequence_token.cc",
- "base/strings/abseil_string_conversions.cc",
- "base/strings/abseil_string_number_conversions.cc",
- "base/strings/escape.cc",
- "base/strings/latin1_string_conversions.cc",
- "base/strings/pattern.cc",
- "base/strings/safe_sprintf.cc",
- "base/strings/strcat.cc",
- "base/strings/string_number_conversions.cc",
- "base/strings/string_piece.cc",
- "base/strings/string_split.cc",
- "base/strings/string_util.cc",
- "base/strings/string_util_constants.cc",
- "base/strings/stringprintf.cc",
- "base/strings/sys_string_conversions_posix.cc",
- "base/strings/utf_offset_string_conversions.cc",
- "base/strings/utf_string_conversion_utils.cc",
- "base/strings/utf_string_conversions.cc",
- "base/substring_set_matcher/matcher_string_pattern.cc",
- "base/substring_set_matcher/substring_set_matcher.cc",
- "base/supports_user_data.cc",
- "base/sync_socket.cc",
- "base/sync_socket_posix.cc",
- "base/synchronization/atomic_flag.cc",
- "base/synchronization/condition_variable_posix.cc",
- "base/synchronization/lock.cc",
- "base/synchronization/lock_impl_posix.cc",
- "base/synchronization/waitable_event_posix.cc",
- "base/synchronization/waitable_event_watcher_posix.cc",
- "base/syslog_logging.cc",
- "base/system/sys_info.cc",
- "base/system/sys_info_linux.cc",
- "base/system/sys_info_posix.cc",
- "base/system/system_monitor.cc",
- "base/task/cancelable_task_tracker.cc",
- "base/task/common/checked_lock_impl.cc",
- "base/task/common/lazy_now.cc",
- "base/task/common/operations_controller.cc",
- "base/task/common/scoped_defer_task_posting.cc",
- "base/task/common/task_annotator.cc",
- "base/task/current_thread.cc",
- "base/task/default_delayed_task_handle_delegate.cc",
- "base/task/deferred_sequenced_task_runner.cc",
- "base/task/delayed_task_handle.cc",
- "base/task/lazy_thread_pool_task_runner.cc",
- "base/task/post_job.cc",
- "base/task/scoped_set_task_priority_for_current_thread.cc",
- "base/task/sequence_manager/associated_thread_id.cc",
- "base/task/sequence_manager/atomic_flag_set.cc",
- "base/task/sequence_manager/delayed_task_handle_delegate.cc",
- "base/task/sequence_manager/enqueue_order_generator.cc",
- "base/task/sequence_manager/fence.cc",
- "base/task/sequence_manager/hierarchical_timing_wheel.cc",
- "base/task/sequence_manager/sequence_manager.cc",
- "base/task/sequence_manager/sequence_manager_impl.cc",
- "base/task/sequence_manager/sequenced_task_source.cc",
- "base/task/sequence_manager/task_order.cc",
- "base/task/sequence_manager/task_queue.cc",
- "base/task/sequence_manager/task_queue_impl.cc",
- "base/task/sequence_manager/task_queue_selector.cc",
- "base/task/sequence_manager/tasks.cc",
- "base/task/sequence_manager/thread_controller.cc",
- "base/task/sequence_manager/thread_controller_impl.cc",
- "base/task/sequence_manager/thread_controller_power_monitor.cc",
- "base/task/sequence_manager/thread_controller_with_message_pump_impl.cc",
- "base/task/sequence_manager/time_domain.cc",
- "base/task/sequence_manager/timing_wheel.cc",
- "base/task/sequence_manager/wake_up_queue.cc",
- "base/task/sequence_manager/work_deduplicator.cc",
- "base/task/sequence_manager/work_queue.cc",
- "base/task/sequence_manager/work_queue_sets.cc",
- "base/task/sequenced_task_runner.cc",
- "base/task/simple_task_executor.cc",
- "base/task/single_thread_task_executor.cc",
- "base/task/single_thread_task_runner.cc",
- "base/task/task_executor.cc",
- "base/task/task_features.cc",
- "base/task/task_runner.cc",
- "base/task/task_traits.cc",
- "base/task/thread_pool.cc",
- "base/task/thread_pool/delayed_priority_queue.cc",
- "base/task/thread_pool/delayed_task_manager.cc",
- "base/task/thread_pool/environment_config.cc",
- "base/task/thread_pool/initialization_util.cc",
- "base/task/thread_pool/job_task_source.cc",
- "base/task/thread_pool/pooled_parallel_task_runner.cc",
- "base/task/thread_pool/pooled_sequenced_task_runner.cc",
- "base/task/thread_pool/pooled_single_thread_task_runner_manager.cc",
- "base/task/thread_pool/pooled_task_runner_delegate.cc",
- "base/task/thread_pool/priority_queue.cc",
- "base/task/thread_pool/sequence.cc",
- "base/task/thread_pool/service_thread.cc",
- "base/task/thread_pool/task.cc",
- "base/task/thread_pool/task_source.cc",
- "base/task/thread_pool/task_source_sort_key.cc",
- "base/task/thread_pool/task_tracker.cc",
- "base/task/thread_pool/thread_group.cc",
- "base/task/thread_pool/thread_group_impl.cc",
- "base/task/thread_pool/thread_group_native.cc",
- "base/task/thread_pool/thread_pool_impl.cc",
- "base/task/thread_pool/thread_pool_instance.cc",
- "base/task/thread_pool/worker_thread.cc",
- "base/task/thread_pool/worker_thread_stack.cc",
- "base/third_party/cityhash/city.cc",
- "base/third_party/cityhash_v103/src/city_v103.cc",
- "base/third_party/nspr/prtime.cc",
- "base/third_party/superfasthash/superfasthash.c",
- "base/threading/hang_watcher.cc",
- "base/threading/platform_thread.cc",
- "base/threading/platform_thread_internal_posix.cc",
- "base/threading/platform_thread_posix.cc",
- "base/threading/platform_thread_ref.cc",
- "base/threading/post_task_and_reply_impl.cc",
- "base/threading/scoped_blocking_call.cc",
- "base/threading/scoped_blocking_call_internal.cc",
- "base/threading/scoped_thread_priority.cc",
- "base/threading/sequence_local_storage_map.cc",
- "base/threading/sequence_local_storage_slot.cc",
- "base/threading/sequenced_task_runner_handle.cc",
- "base/threading/simple_thread.cc",
- "base/threading/thread.cc",
- "base/threading/thread_checker.cc",
- "base/threading/thread_checker_impl.cc",
- "base/threading/thread_collision_warner.cc",
- "base/threading/thread_id_name_manager.cc",
- "base/threading/thread_local_storage.cc",
- "base/threading/thread_local_storage_posix.cc",
- "base/threading/thread_restrictions.cc",
- "base/threading/thread_task_runner_handle.cc",
- "base/threading/watchdog.cc",
- "base/time/clock.cc",
- "base/time/default_clock.cc",
- "base/time/default_tick_clock.cc",
- "base/time/tick_clock.cc",
- "base/time/time.cc",
- "base/time/time_conversion_posix.cc",
- "base/time/time_delta_from_string.cc",
- "base/time/time_exploded_icu.cc",
- "base/time/time_exploded_posix.cc",
- "base/time/time_now_posix.cc",
- "base/time/time_override.cc",
- "base/time/time_to_iso8601.cc",
- "base/timer/elapsed_timer.cc",
- "base/timer/hi_res_timer_manager_posix.cc",
- "base/timer/lap_timer.cc",
- "base/timer/timer.cc",
- "base/timer/wall_clock_timer.cc",
- "base/token.cc",
- "base/trace_event/heap_profiler_allocation_context.cc",
- "base/trace_event/heap_profiler_allocation_context_tracker.cc",
- "base/trace_event/memory_allocator_dump_guid.cc",
- "base/trace_event/trace_event_stub.cc",
- "base/trace_event/trace_id_helper.cc",
- "base/unguessable_token.cc",
- "base/value_iterators.cc",
- "base/values.cc",
- "base/version.cc",
- "base/vlog.cc",
- ],
- static_libs: [
- "cronet_aml_base_allocator_partition_allocator_partition_alloc__testing",
- "cronet_aml_base_base_static__testing",
- "cronet_aml_base_nodebug_assertion__testing",
- "cronet_aml_base_third_party_double_conversion_double_conversion__testing",
- "cronet_aml_base_third_party_dynamic_annotations_dynamic_annotations__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_base__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_log_severity__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_malloc_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_raw_logging_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_spinlock_wait__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_strerror__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_throw_delegate__testing",
- "cronet_aml_third_party_abseil_cpp_absl_container_hashtablez_sampler__testing",
- "cronet_aml_third_party_abseil_cpp_absl_container_raw_hash_set__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_debugging_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_demangle_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_examine_stack__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_failure_signal_handler__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_stacktrace__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_symbolize__testing",
- "cronet_aml_third_party_abseil_cpp_absl_hash_city__testing",
- "cronet_aml_third_party_abseil_cpp_absl_hash_hash__testing",
- "cronet_aml_third_party_abseil_cpp_absl_hash_low_level_hash__testing",
- "cronet_aml_third_party_abseil_cpp_absl_numeric_int128__testing",
- "cronet_aml_third_party_abseil_cpp_absl_profiling_exponential_biased__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_distributions__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_platform__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_pool_urbg__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_hwaes__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_hwaes_impl__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_slow__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_seed_material__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_seed_gen_exception__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_seed_sequences__testing",
- "cronet_aml_third_party_abseil_cpp_absl_status_status__testing",
- "cronet_aml_third_party_abseil_cpp_absl_status_statusor__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cord__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cord_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_functions__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_handle__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_info__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_str_format_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_strings__testing",
- "cronet_aml_third_party_abseil_cpp_absl_synchronization_graphcycles_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_synchronization_synchronization__testing",
- "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_civil_time__testing",
- "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_time_zone__testing",
- "cronet_aml_third_party_abseil_cpp_absl_time_time__testing",
- "cronet_aml_third_party_abseil_cpp_absl_types_bad_optional_access__testing",
- "cronet_aml_third_party_abseil_cpp_absl_types_bad_variant_access__testing",
- "cronet_aml_third_party_boringssl_boringssl__testing",
- "cronet_aml_third_party_boringssl_boringssl_asm__testing",
- "cronet_aml_third_party_icu_icui18n__testing",
- "cronet_aml_third_party_icu_icuuc_private__testing",
- "cronet_aml_third_party_libevent_libevent__testing",
- "cronet_aml_third_party_modp_b64_modp_b64__testing",
- ],
- host_supported: true,
- generated_headers: [
- "cronet_aml_base_allocator_buildflags__testing",
- "cronet_aml_base_anchor_functions_buildflags__testing",
- "cronet_aml_base_build_date__testing",
- "cronet_aml_base_cfi_buildflags__testing",
- "cronet_aml_base_clang_profiling_buildflags__testing",
- "cronet_aml_base_debugging_buildflags__testing",
- "cronet_aml_base_feature_list_buildflags__testing",
- "cronet_aml_base_ios_cronet_buildflags__testing",
- "cronet_aml_base_logging_buildflags__testing",
- "cronet_aml_base_message_pump_buildflags__testing",
- "cronet_aml_base_orderfile_buildflags__testing",
- "cronet_aml_base_parsing_buildflags__testing",
- "cronet_aml_base_power_monitor_buildflags__testing",
- "cronet_aml_base_profiler_buildflags__testing",
- "cronet_aml_base_sanitizer_buildflags__testing",
- "cronet_aml_base_synchronization_buildflags__testing",
- "cronet_aml_base_tracing_buildflags__testing",
- "cronet_aml_build_branding_buildflags__testing",
- "cronet_aml_build_chromecast_buildflags__testing",
- "cronet_aml_build_chromeos_buildflags__testing",
- "cronet_aml_build_config_compiler_compiler_buildflags__testing",
- ],
- export_generated_headers: [
- "cronet_aml_base_allocator_buildflags__testing",
- "cronet_aml_base_anchor_functions_buildflags__testing",
- "cronet_aml_base_build_date__testing",
- "cronet_aml_base_cfi_buildflags__testing",
- "cronet_aml_base_clang_profiling_buildflags__testing",
- "cronet_aml_base_debugging_buildflags__testing",
- "cronet_aml_base_feature_list_buildflags__testing",
- "cronet_aml_base_ios_cronet_buildflags__testing",
- "cronet_aml_base_logging_buildflags__testing",
- "cronet_aml_base_message_pump_buildflags__testing",
- "cronet_aml_base_orderfile_buildflags__testing",
- "cronet_aml_base_parsing_buildflags__testing",
- "cronet_aml_base_power_monitor_buildflags__testing",
- "cronet_aml_base_profiler_buildflags__testing",
- "cronet_aml_base_sanitizer_buildflags__testing",
- "cronet_aml_base_synchronization_buildflags__testing",
- "cronet_aml_base_tracing_buildflags__testing",
- "cronet_aml_build_branding_buildflags__testing",
- "cronet_aml_build_chromecast_buildflags__testing",
- "cronet_aml_build_chromeos_buildflags__testing",
- "cronet_aml_build_config_compiler_compiler_buildflags__testing",
- ],
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DBASE_IMPLEMENTATION",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DICU_UTIL_DATA_IMPL=ICU_UTIL_DATA_FILE",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-DUSE_CHROMIUM_ICU=1",
- "-DU_ENABLE_DYLOAD=0",
- "-DU_ENABLE_RESOURCE_TRACING=0",
- "-DU_ENABLE_TRACING=1",
- "-DU_STATIC_IMPLEMENTATION",
- "-DU_USING_ICU_NAMESPACE=0",
- "-D_FORTIFY_SOURCE=2",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D__STDC_CONSTANT_MACROS",
- "-D__STDC_FORMAT_MACROS",
- "-O2",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "third_party/abseil-cpp/",
- "third_party/boringssl/src/include/",
- "third_party/icu/source/common/",
- "third_party/icu/source/i18n/",
- ],
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- "-Wl,--script,external/cronet/base/android/library_loader/anchor_functions.lds",
- ],
- target: {
- android: {
- shared_libs: [
- "libandroid",
- "liblog",
- ],
- },
- android_arm: {
- srcs: [
- "base/allocator/partition_allocator/shim/allocator_shim_default_dispatch_to_linker_wrapped_symbols.cc",
- "base/android/android_hardware_buffer_compat.cc",
- "base/android/android_image_reader_compat.cc",
- "base/android/apk_assets.cc",
- "base/android/application_status_listener.cc",
- "base/android/base_feature_list.cc",
- "base/android/base_features.cc",
- "base/android/base_jni_onload.cc",
- "base/android/build_info.cc",
- "base/android/bundle_utils.cc",
- "base/android/callback_android.cc",
- "base/android/child_process_service.cc",
- "base/android/command_line_android.cc",
- "base/android/content_uri_utils.cc",
- "base/android/cpu_features.cc",
- "base/android/early_trace_event_binding.cc",
- "base/android/event_log.cc",
- "base/android/feature_list_jni.cc",
- "base/android/features_jni.cc",
- "base/android/field_trial_list.cc",
- "base/android/important_file_writer_android.cc",
- "base/android/int_string_callback.cc",
- "base/android/jank_metric_uma_recorder.cc",
- "base/android/java_exception_reporter.cc",
- "base/android/java_handler_thread.cc",
- "base/android/java_heap_dump_generator.cc",
- "base/android/java_runtime.cc",
- "base/android/jni_android.cc",
- "base/android/jni_array.cc",
- "base/android/jni_registrar.cc",
- "base/android/jni_string.cc",
- "base/android/jni_utils.cc",
- "base/android/jni_weak_ref.cc",
- "base/android/library_loader/anchor_functions.cc",
- "base/android/library_loader/library_loader_hooks.cc",
- "base/android/library_loader/library_prefetcher.cc",
- "base/android/library_loader/library_prefetcher_hooks.cc",
- "base/android/locale_utils.cc",
- "base/android/memory_pressure_listener_android.cc",
- "base/android/native_uma_recorder.cc",
- "base/android/path_service_android.cc",
- "base/android/path_utils.cc",
- "base/android/radio_utils.cc",
- "base/android/reached_addresses_bitset.cc",
- "base/android/reached_code_profiler.cc",
- "base/android/remove_stale_data.cc",
- "base/android/scoped_hardware_buffer_fence_sync.cc",
- "base/android/scoped_hardware_buffer_handle.cc",
- "base/android/scoped_java_ref.cc",
- "base/android/statistics_recorder_android.cc",
- "base/android/sys_utils.cc",
- "base/android/task_scheduler/post_task_android.cc",
- "base/android/task_scheduler/task_runner_android.cc",
- "base/android/thread_instruction_count.cc",
- "base/android/timezone_utils.cc",
- "base/android/trace_event_binding.cc",
- "base/android/unguessable_token_android.cc",
- "base/base_paths_android.cc",
- "base/debug/stack_trace_android.cc",
- "base/files/file_util_android.cc",
- "base/files/scoped_file_android.cc",
- "base/memory/platform_shared_memory_mapper_android.cc",
- "base/memory/platform_shared_memory_region_android.cc",
- "base/message_loop/message_pump_android.cc",
- "base/os_compat_android.cc",
- "base/power_monitor/power_monitor_device_source_android.cc",
- "base/process/process_android.cc",
- "base/profiler/chrome_unwind_info_android.cc",
- "base/profiler/chrome_unwinder_android.cc",
- "base/profiler/chrome_unwinder_android_v2.cc",
- "base/profiler/stack_sampler_android.cc",
- "base/system/sys_info_android.cc",
- "base/threading/platform_thread_android.cc",
- "base/time/time_android.cc",
- "base/trace_event/cfi_backtrace_android.cc",
- ],
- static_libs: [
- "cronet_aml_third_party_android_ndk_cpu_features__testing",
- "cronet_aml_third_party_ashmem_ashmem__testing",
- ],
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-fstack-protector",
- ],
- local_include_dirs: [
- "third_party/android_ndk/sources/android/cpufeatures/",
- ],
- generated_headers: [
- "cronet_aml_base_android_runtime_jni_headers__testing",
- "cronet_aml_base_base_jni_headers__testing",
- "cronet_aml_base_debugging_buildflags__testing",
- "cronet_aml_base_logging_buildflags__testing",
- "cronet_aml_build_chromeos_buildflags__testing",
- ],
- ldflags: [
- "-Wl,-wrap,asprintf",
- "-Wl,-wrap,calloc",
- "-Wl,-wrap,free",
- "-Wl,-wrap,getcwd",
- "-Wl,-wrap,malloc",
- "-Wl,-wrap,malloc_usable_size",
- "-Wl,-wrap,memalign",
- "-Wl,-wrap,posix_memalign",
- "-Wl,-wrap,pvalloc",
- "-Wl,-wrap,realloc",
- "-Wl,-wrap,realpath",
- "-Wl,-wrap,strdup",
- "-Wl,-wrap,strndup",
- "-Wl,-wrap,valloc",
- "-Wl,-wrap,vasprintf",
- ],
- },
- android_arm64: {
- srcs: [
- "base/allocator/partition_allocator/shim/allocator_shim_default_dispatch_to_linker_wrapped_symbols.cc",
- "base/android/android_hardware_buffer_compat.cc",
- "base/android/android_image_reader_compat.cc",
- "base/android/apk_assets.cc",
- "base/android/application_status_listener.cc",
- "base/android/base_feature_list.cc",
- "base/android/base_features.cc",
- "base/android/base_jni_onload.cc",
- "base/android/build_info.cc",
- "base/android/bundle_utils.cc",
- "base/android/callback_android.cc",
- "base/android/child_process_service.cc",
- "base/android/command_line_android.cc",
- "base/android/content_uri_utils.cc",
- "base/android/cpu_features.cc",
- "base/android/early_trace_event_binding.cc",
- "base/android/event_log.cc",
- "base/android/feature_list_jni.cc",
- "base/android/features_jni.cc",
- "base/android/field_trial_list.cc",
- "base/android/important_file_writer_android.cc",
- "base/android/int_string_callback.cc",
- "base/android/jank_metric_uma_recorder.cc",
- "base/android/java_exception_reporter.cc",
- "base/android/java_handler_thread.cc",
- "base/android/java_heap_dump_generator.cc",
- "base/android/java_runtime.cc",
- "base/android/jni_android.cc",
- "base/android/jni_array.cc",
- "base/android/jni_registrar.cc",
- "base/android/jni_string.cc",
- "base/android/jni_utils.cc",
- "base/android/jni_weak_ref.cc",
- "base/android/library_loader/anchor_functions.cc",
- "base/android/library_loader/library_loader_hooks.cc",
- "base/android/library_loader/library_prefetcher.cc",
- "base/android/library_loader/library_prefetcher_hooks.cc",
- "base/android/locale_utils.cc",
- "base/android/memory_pressure_listener_android.cc",
- "base/android/native_uma_recorder.cc",
- "base/android/path_service_android.cc",
- "base/android/path_utils.cc",
- "base/android/radio_utils.cc",
- "base/android/reached_addresses_bitset.cc",
- "base/android/reached_code_profiler.cc",
- "base/android/remove_stale_data.cc",
- "base/android/scoped_hardware_buffer_fence_sync.cc",
- "base/android/scoped_hardware_buffer_handle.cc",
- "base/android/scoped_java_ref.cc",
- "base/android/statistics_recorder_android.cc",
- "base/android/sys_utils.cc",
- "base/android/task_scheduler/post_task_android.cc",
- "base/android/task_scheduler/task_runner_android.cc",
- "base/android/thread_instruction_count.cc",
- "base/android/timezone_utils.cc",
- "base/android/trace_event_binding.cc",
- "base/android/unguessable_token_android.cc",
- "base/base_paths_android.cc",
- "base/debug/stack_trace_android.cc",
- "base/files/file_util_android.cc",
- "base/files/scoped_file_android.cc",
- "base/memory/platform_shared_memory_mapper_android.cc",
- "base/memory/platform_shared_memory_region_android.cc",
- "base/message_loop/message_pump_android.cc",
- "base/os_compat_android.cc",
- "base/power_monitor/power_monitor_device_source_android.cc",
- "base/process/process_android.cc",
- "base/profiler/stack_sampler_android.cc",
- "base/system/sys_info_android.cc",
- "base/threading/platform_thread_android.cc",
- "base/time/time_android.cc",
- ],
- static_libs: [
- "cronet_aml_third_party_android_ndk_cpu_features__testing",
- "cronet_aml_third_party_ashmem_ashmem__testing",
- ],
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- local_include_dirs: [
- "third_party/android_ndk/sources/android/cpufeatures/",
- ],
- generated_headers: [
- "cronet_aml_base_android_runtime_jni_headers__testing",
- "cronet_aml_base_base_jni_headers__testing",
- "cronet_aml_base_debugging_buildflags__testing",
- "cronet_aml_base_logging_buildflags__testing",
- "cronet_aml_build_chromeos_buildflags__testing",
- ],
- ldflags: [
- "-Wl,-wrap,asprintf",
- "-Wl,-wrap,calloc",
- "-Wl,-wrap,free",
- "-Wl,-wrap,getcwd",
- "-Wl,-wrap,malloc",
- "-Wl,-wrap,malloc_usable_size",
- "-Wl,-wrap,memalign",
- "-Wl,-wrap,posix_memalign",
- "-Wl,-wrap,pvalloc",
- "-Wl,-wrap,realloc",
- "-Wl,-wrap,realpath",
- "-Wl,-wrap,strdup",
- "-Wl,-wrap,strndup",
- "-Wl,-wrap,valloc",
- "-Wl,-wrap,vasprintf",
- ],
- },
- android_x86: {
- srcs: [
- "base/allocator/partition_allocator/shim/allocator_shim_default_dispatch_to_linker_wrapped_symbols.cc",
- "base/android/android_hardware_buffer_compat.cc",
- "base/android/android_image_reader_compat.cc",
- "base/android/apk_assets.cc",
- "base/android/application_status_listener.cc",
- "base/android/base_feature_list.cc",
- "base/android/base_features.cc",
- "base/android/base_jni_onload.cc",
- "base/android/build_info.cc",
- "base/android/bundle_utils.cc",
- "base/android/callback_android.cc",
- "base/android/child_process_service.cc",
- "base/android/command_line_android.cc",
- "base/android/content_uri_utils.cc",
- "base/android/cpu_features.cc",
- "base/android/early_trace_event_binding.cc",
- "base/android/event_log.cc",
- "base/android/feature_list_jni.cc",
- "base/android/features_jni.cc",
- "base/android/field_trial_list.cc",
- "base/android/important_file_writer_android.cc",
- "base/android/int_string_callback.cc",
- "base/android/jank_metric_uma_recorder.cc",
- "base/android/java_exception_reporter.cc",
- "base/android/java_handler_thread.cc",
- "base/android/java_heap_dump_generator.cc",
- "base/android/java_runtime.cc",
- "base/android/jni_android.cc",
- "base/android/jni_array.cc",
- "base/android/jni_registrar.cc",
- "base/android/jni_string.cc",
- "base/android/jni_utils.cc",
- "base/android/jni_weak_ref.cc",
- "base/android/library_loader/anchor_functions.cc",
- "base/android/library_loader/library_loader_hooks.cc",
- "base/android/library_loader/library_prefetcher.cc",
- "base/android/library_loader/library_prefetcher_hooks.cc",
- "base/android/locale_utils.cc",
- "base/android/memory_pressure_listener_android.cc",
- "base/android/native_uma_recorder.cc",
- "base/android/path_service_android.cc",
- "base/android/path_utils.cc",
- "base/android/radio_utils.cc",
- "base/android/reached_addresses_bitset.cc",
- "base/android/reached_code_profiler_stub.cc",
- "base/android/remove_stale_data.cc",
- "base/android/scoped_hardware_buffer_fence_sync.cc",
- "base/android/scoped_hardware_buffer_handle.cc",
- "base/android/scoped_java_ref.cc",
- "base/android/statistics_recorder_android.cc",
- "base/android/sys_utils.cc",
- "base/android/task_scheduler/post_task_android.cc",
- "base/android/task_scheduler/task_runner_android.cc",
- "base/android/thread_instruction_count.cc",
- "base/android/timezone_utils.cc",
- "base/android/trace_event_binding.cc",
- "base/android/unguessable_token_android.cc",
- "base/base_paths_android.cc",
- "base/debug/stack_trace_android.cc",
- "base/files/file_util_android.cc",
- "base/files/scoped_file_android.cc",
- "base/memory/platform_shared_memory_mapper_android.cc",
- "base/memory/platform_shared_memory_region_android.cc",
- "base/message_loop/message_pump_android.cc",
- "base/os_compat_android.cc",
- "base/power_monitor/power_monitor_device_source_android.cc",
- "base/process/process_android.cc",
- "base/profiler/stack_sampler_android.cc",
- "base/system/sys_info_android.cc",
- "base/threading/platform_thread_android.cc",
- "base/time/time_android.cc",
- ],
- static_libs: [
- "cronet_aml_third_party_android_ndk_cpu_features__testing",
- "cronet_aml_third_party_ashmem_ashmem__testing",
- ],
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-msse3",
- ],
- local_include_dirs: [
- "third_party/android_ndk/sources/android/cpufeatures/",
- ],
- generated_headers: [
- "cronet_aml_base_android_runtime_jni_headers__testing",
- "cronet_aml_base_base_jni_headers__testing",
- "cronet_aml_base_debugging_buildflags__testing",
- "cronet_aml_base_logging_buildflags__testing",
- "cronet_aml_build_chromeos_buildflags__testing",
- ],
- ldflags: [
- "-Wl,-wrap,asprintf",
- "-Wl,-wrap,calloc",
- "-Wl,-wrap,free",
- "-Wl,-wrap,getcwd",
- "-Wl,-wrap,malloc",
- "-Wl,-wrap,malloc_usable_size",
- "-Wl,-wrap,memalign",
- "-Wl,-wrap,posix_memalign",
- "-Wl,-wrap,pvalloc",
- "-Wl,-wrap,realloc",
- "-Wl,-wrap,realpath",
- "-Wl,-wrap,strdup",
- "-Wl,-wrap,strndup",
- "-Wl,-wrap,valloc",
- "-Wl,-wrap,vasprintf",
- ],
- },
- android_x86_64: {
- srcs: [
- "base/allocator/partition_allocator/shim/allocator_shim_default_dispatch_to_linker_wrapped_symbols.cc",
- "base/android/android_hardware_buffer_compat.cc",
- "base/android/android_image_reader_compat.cc",
- "base/android/apk_assets.cc",
- "base/android/application_status_listener.cc",
- "base/android/base_feature_list.cc",
- "base/android/base_features.cc",
- "base/android/base_jni_onload.cc",
- "base/android/build_info.cc",
- "base/android/bundle_utils.cc",
- "base/android/callback_android.cc",
- "base/android/child_process_service.cc",
- "base/android/command_line_android.cc",
- "base/android/content_uri_utils.cc",
- "base/android/cpu_features.cc",
- "base/android/early_trace_event_binding.cc",
- "base/android/event_log.cc",
- "base/android/feature_list_jni.cc",
- "base/android/features_jni.cc",
- "base/android/field_trial_list.cc",
- "base/android/important_file_writer_android.cc",
- "base/android/int_string_callback.cc",
- "base/android/jank_metric_uma_recorder.cc",
- "base/android/java_exception_reporter.cc",
- "base/android/java_handler_thread.cc",
- "base/android/java_heap_dump_generator.cc",
- "base/android/java_runtime.cc",
- "base/android/jni_android.cc",
- "base/android/jni_array.cc",
- "base/android/jni_registrar.cc",
- "base/android/jni_string.cc",
- "base/android/jni_utils.cc",
- "base/android/jni_weak_ref.cc",
- "base/android/library_loader/anchor_functions.cc",
- "base/android/library_loader/library_loader_hooks.cc",
- "base/android/library_loader/library_prefetcher.cc",
- "base/android/library_loader/library_prefetcher_hooks.cc",
- "base/android/locale_utils.cc",
- "base/android/memory_pressure_listener_android.cc",
- "base/android/native_uma_recorder.cc",
- "base/android/path_service_android.cc",
- "base/android/path_utils.cc",
- "base/android/radio_utils.cc",
- "base/android/reached_addresses_bitset.cc",
- "base/android/reached_code_profiler_stub.cc",
- "base/android/remove_stale_data.cc",
- "base/android/scoped_hardware_buffer_fence_sync.cc",
- "base/android/scoped_hardware_buffer_handle.cc",
- "base/android/scoped_java_ref.cc",
- "base/android/statistics_recorder_android.cc",
- "base/android/sys_utils.cc",
- "base/android/task_scheduler/post_task_android.cc",
- "base/android/task_scheduler/task_runner_android.cc",
- "base/android/thread_instruction_count.cc",
- "base/android/timezone_utils.cc",
- "base/android/trace_event_binding.cc",
- "base/android/unguessable_token_android.cc",
- "base/base_paths_android.cc",
- "base/debug/stack_trace_android.cc",
- "base/files/file_util_android.cc",
- "base/files/scoped_file_android.cc",
- "base/memory/platform_shared_memory_mapper_android.cc",
- "base/memory/platform_shared_memory_region_android.cc",
- "base/message_loop/message_pump_android.cc",
- "base/os_compat_android.cc",
- "base/power_monitor/power_monitor_device_source_android.cc",
- "base/process/process_android.cc",
- "base/profiler/stack_sampler_android.cc",
- "base/system/sys_info_android.cc",
- "base/threading/platform_thread_android.cc",
- "base/time/time_android.cc",
- ],
- static_libs: [
- "cronet_aml_third_party_android_ndk_cpu_features__testing",
- "cronet_aml_third_party_ashmem_ashmem__testing",
- ],
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-fstack-protector",
- "-msse3",
- ],
- local_include_dirs: [
- "third_party/android_ndk/sources/android/cpufeatures/",
- ],
- generated_headers: [
- "cronet_aml_base_android_runtime_jni_headers__testing",
- "cronet_aml_base_base_jni_headers__testing",
- "cronet_aml_base_debugging_buildflags__testing",
- "cronet_aml_base_logging_buildflags__testing",
- "cronet_aml_build_chromeos_buildflags__testing",
- ],
- ldflags: [
- "-Wl,-wrap,asprintf",
- "-Wl,-wrap,calloc",
- "-Wl,-wrap,free",
- "-Wl,-wrap,getcwd",
- "-Wl,-wrap,malloc",
- "-Wl,-wrap,malloc_usable_size",
- "-Wl,-wrap,memalign",
- "-Wl,-wrap,posix_memalign",
- "-Wl,-wrap,pvalloc",
- "-Wl,-wrap,realloc",
- "-Wl,-wrap,realpath",
- "-Wl,-wrap,strdup",
- "-Wl,-wrap,strndup",
- "-Wl,-wrap,valloc",
- "-Wl,-wrap,vasprintf",
- ],
- },
- host: {
- srcs: [
- "base/allocator/partition_allocator/shim/allocator_shim_default_dispatch_to_glibc.cc",
- "base/base_paths_posix.cc",
- "base/debug/stack_trace_posix.cc",
- "base/files/file_util_linux.cc",
- "base/files/scoped_file_linux.cc",
- "base/memory/platform_shared_memory_mapper_posix.cc",
- "base/memory/platform_shared_memory_region_posix.cc",
- "base/power_monitor/power_monitor_device_source_stub.cc",
- "base/process/process_linux.cc",
- "base/profiler/stack_sampler_posix.cc",
- "base/stack_canary_linux.cc",
- "base/threading/platform_thread_linux.cc",
- ],
- cflags: [
- "-DCR_SYSROOT_KEY=20220331T153654Z-0",
- "-DUSE_AURA=1",
- "-DUSE_OZONE=1",
- "-DUSE_UDEV",
- "-D_FILE_OFFSET_BITS=64",
- "-D_LARGEFILE64_SOURCE",
- "-D_LARGEFILE_SOURCE",
- "-fstack-protector",
- "-msse3",
- ],
- compile_multilib: "64",
- },
- },
-}
-
-// GN: //base:base_android_java_enums_srcjar
-java_genrule {
- name: "cronet_aml_base_base_android_java_enums_srcjar",
- cmd: "$(location build/android/gyp/java_cpp_enum.py) --srcjar " +
- "$(out) " +
- "$(location base/android/application_status_listener.h) " +
- "$(location base/android/child_process_binding_types.h) " +
- "$(location base/android/library_loader/library_loader_hooks.h) " +
- "$(location base/android/linker/modern_linker_jni.h) " +
- "$(location base/android/task_scheduler/task_runner_android.h) " +
- "$(location base/memory/memory_pressure_listener.h) " +
- "$(location base/metrics/histogram_base.h) " +
- "$(location base/task/task_traits.h)",
- out: [
- "base/base_android_java_enums_srcjar.srcjar",
- ],
- tool_files: [
- "base/android/application_status_listener.h",
- "base/android/child_process_binding_types.h",
- "base/android/library_loader/library_loader_hooks.h",
- "base/android/linker/modern_linker_jni.h",
- "base/android/task_scheduler/task_runner_android.h",
- "base/memory/memory_pressure_listener.h",
- "base/metrics/histogram_base.h",
- "base/task/task_traits.h",
- "build/android/gyp/java_cpp_enum.py",
- "build/android/gyp/util/__init__.py",
- "build/android/gyp/util/build_utils.py",
- "build/android/gyp/util/java_cpp_utils.py",
- "build/gn_helpers.py",
- ],
-}
-
-// GN: //base:base_jni_headers
-cc_genrule {
- name: "cronet_aml_base_base_jni_headers",
- srcs: [
- "base/android/java/src/org/chromium/base/ApkAssets.java",
- "base/android/java/src/org/chromium/base/ApplicationStatus.java",
- "base/android/java/src/org/chromium/base/BaseFeatureList.java",
- "base/android/java/src/org/chromium/base/BuildInfo.java",
- "base/android/java/src/org/chromium/base/BundleUtils.java",
- "base/android/java/src/org/chromium/base/Callback.java",
- "base/android/java/src/org/chromium/base/CommandLine.java",
- "base/android/java/src/org/chromium/base/ContentUriUtils.java",
- "base/android/java/src/org/chromium/base/CpuFeatures.java",
- "base/android/java/src/org/chromium/base/EarlyTraceEvent.java",
- "base/android/java/src/org/chromium/base/EventLog.java",
- "base/android/java/src/org/chromium/base/FeatureList.java",
- "base/android/java/src/org/chromium/base/Features.java",
- "base/android/java/src/org/chromium/base/FieldTrialList.java",
- "base/android/java/src/org/chromium/base/FileUtils.java",
- "base/android/java/src/org/chromium/base/ImportantFileWriterAndroid.java",
- "base/android/java/src/org/chromium/base/IntStringCallback.java",
- "base/android/java/src/org/chromium/base/JNIUtils.java",
- "base/android/java/src/org/chromium/base/JavaExceptionReporter.java",
- "base/android/java/src/org/chromium/base/JavaHandlerThread.java",
- "base/android/java/src/org/chromium/base/LocaleUtils.java",
- "base/android/java/src/org/chromium/base/MemoryPressureListener.java",
- "base/android/java/src/org/chromium/base/PathService.java",
- "base/android/java/src/org/chromium/base/PathUtils.java",
- "base/android/java/src/org/chromium/base/PiiElider.java",
- "base/android/java/src/org/chromium/base/PowerMonitor.java",
- "base/android/java/src/org/chromium/base/RadioUtils.java",
- "base/android/java/src/org/chromium/base/SysUtils.java",
- "base/android/java/src/org/chromium/base/ThreadUtils.java",
- "base/android/java/src/org/chromium/base/TimezoneUtils.java",
- "base/android/java/src/org/chromium/base/TraceEvent.java",
- "base/android/java/src/org/chromium/base/UnguessableToken.java",
- "base/android/java/src/org/chromium/base/jank_tracker/JankMetricUMARecorder.java",
- "base/android/java/src/org/chromium/base/library_loader/LibraryLoader.java",
- "base/android/java/src/org/chromium/base/library_loader/LibraryPrefetcher.java",
- "base/android/java/src/org/chromium/base/memory/JavaHeapDumpGenerator.java",
- "base/android/java/src/org/chromium/base/metrics/NativeUmaRecorder.java",
- "base/android/java/src/org/chromium/base/metrics/StatisticsRecorderAndroid.java",
- "base/android/java/src/org/chromium/base/process_launcher/ChildProcessService.java",
- "base/android/java/src/org/chromium/base/task/PostTask.java",
- "base/android/java/src/org/chromium/base/task/TaskRunnerImpl.java",
- ],
- cmd: "$(location base/android/jni_generator/jni_generator.py) --ptr_type " +
- "long " +
- "--output_dir " +
- "$(genDir)/base/base_jni_headers " +
- "--includes " +
- "base/android/jni_generator/jni_generator_helper.h " +
- "--use_proxy_hash " +
- "--output_name " +
- "ApkAssets_jni.h " +
- "--output_name " +
- "ApplicationStatus_jni.h " +
- "--output_name " +
- "BaseFeatureList_jni.h " +
- "--output_name " +
- "BuildInfo_jni.h " +
- "--output_name " +
- "BundleUtils_jni.h " +
- "--output_name " +
- "Callback_jni.h " +
- "--output_name " +
- "CommandLine_jni.h " +
- "--output_name " +
- "ContentUriUtils_jni.h " +
- "--output_name " +
- "CpuFeatures_jni.h " +
- "--output_name " +
- "EarlyTraceEvent_jni.h " +
- "--output_name " +
- "EventLog_jni.h " +
- "--output_name " +
- "FeatureList_jni.h " +
- "--output_name " +
- "Features_jni.h " +
- "--output_name " +
- "FieldTrialList_jni.h " +
- "--output_name " +
- "FileUtils_jni.h " +
- "--output_name " +
- "ImportantFileWriterAndroid_jni.h " +
- "--output_name " +
- "IntStringCallback_jni.h " +
- "--output_name " +
- "JNIUtils_jni.h " +
- "--output_name " +
- "JavaExceptionReporter_jni.h " +
- "--output_name " +
- "JavaHandlerThread_jni.h " +
- "--output_name " +
- "LocaleUtils_jni.h " +
- "--output_name " +
- "MemoryPressureListener_jni.h " +
- "--output_name " +
- "PathService_jni.h " +
- "--output_name " +
- "PathUtils_jni.h " +
- "--output_name " +
- "PiiElider_jni.h " +
- "--output_name " +
- "PowerMonitor_jni.h " +
- "--output_name " +
- "RadioUtils_jni.h " +
- "--output_name " +
- "SysUtils_jni.h " +
- "--output_name " +
- "ThreadUtils_jni.h " +
- "--output_name " +
- "TimezoneUtils_jni.h " +
- "--output_name " +
- "TraceEvent_jni.h " +
- "--output_name " +
- "UnguessableToken_jni.h " +
- "--output_name " +
- "JankMetricUMARecorder_jni.h " +
- "--output_name " +
- "LibraryLoader_jni.h " +
- "--output_name " +
- "LibraryPrefetcher_jni.h " +
- "--output_name " +
- "JavaHeapDumpGenerator_jni.h " +
- "--output_name " +
- "NativeUmaRecorder_jni.h " +
- "--output_name " +
- "StatisticsRecorderAndroid_jni.h " +
- "--output_name " +
- "ChildProcessService_jni.h " +
- "--output_name " +
- "PostTask_jni.h " +
- "--output_name " +
- "TaskRunnerImpl_jni.h " +
- "--input_file " +
- "$(location base/android/java/src/org/chromium/base/ApkAssets.java) " +
- "--input_file " +
- "$(location base/android/java/src/org/chromium/base/ApplicationStatus.java) " +
- "--input_file " +
- "$(location base/android/java/src/org/chromium/base/BaseFeatureList.java) " +
- "--input_file " +
- "$(location base/android/java/src/org/chromium/base/BuildInfo.java) " +
- "--input_file " +
- "$(location base/android/java/src/org/chromium/base/BundleUtils.java) " +
- "--input_file " +
- "$(location base/android/java/src/org/chromium/base/Callback.java) " +
- "--input_file " +
- "$(location base/android/java/src/org/chromium/base/CommandLine.java) " +
- "--input_file " +
- "$(location base/android/java/src/org/chromium/base/ContentUriUtils.java) " +
- "--input_file " +
- "$(location base/android/java/src/org/chromium/base/CpuFeatures.java) " +
- "--input_file " +
- "$(location base/android/java/src/org/chromium/base/EarlyTraceEvent.java) " +
- "--input_file " +
- "$(location base/android/java/src/org/chromium/base/EventLog.java) " +
- "--input_file " +
- "$(location base/android/java/src/org/chromium/base/FeatureList.java) " +
- "--input_file " +
- "$(location base/android/java/src/org/chromium/base/Features.java) " +
- "--input_file " +
- "$(location base/android/java/src/org/chromium/base/FieldTrialList.java) " +
- "--input_file " +
- "$(location base/android/java/src/org/chromium/base/FileUtils.java) " +
- "--input_file " +
- "$(location base/android/java/src/org/chromium/base/ImportantFileWriterAndroid.java) " +
- "--input_file " +
- "$(location base/android/java/src/org/chromium/base/IntStringCallback.java) " +
- "--input_file " +
- "$(location base/android/java/src/org/chromium/base/JNIUtils.java) " +
- "--input_file " +
- "$(location base/android/java/src/org/chromium/base/JavaExceptionReporter.java) " +
- "--input_file " +
- "$(location base/android/java/src/org/chromium/base/JavaHandlerThread.java) " +
- "--input_file " +
- "$(location base/android/java/src/org/chromium/base/LocaleUtils.java) " +
- "--input_file " +
- "$(location base/android/java/src/org/chromium/base/MemoryPressureListener.java) " +
- "--input_file " +
- "$(location base/android/java/src/org/chromium/base/PathService.java) " +
- "--input_file " +
- "$(location base/android/java/src/org/chromium/base/PathUtils.java) " +
- "--input_file " +
- "$(location base/android/java/src/org/chromium/base/PiiElider.java) " +
- "--input_file " +
- "$(location base/android/java/src/org/chromium/base/PowerMonitor.java) " +
- "--input_file " +
- "$(location base/android/java/src/org/chromium/base/RadioUtils.java) " +
- "--input_file " +
- "$(location base/android/java/src/org/chromium/base/SysUtils.java) " +
- "--input_file " +
- "$(location base/android/java/src/org/chromium/base/ThreadUtils.java) " +
- "--input_file " +
- "$(location base/android/java/src/org/chromium/base/TimezoneUtils.java) " +
- "--input_file " +
- "$(location base/android/java/src/org/chromium/base/TraceEvent.java) " +
- "--input_file " +
- "$(location base/android/java/src/org/chromium/base/UnguessableToken.java) " +
- "--input_file " +
- "$(location base/android/java/src/org/chromium/base/jank_tracker/JankMetricUMARecorder.java) " +
- "--input_file " +
- "$(location base/android/java/src/org/chromium/base/library_loader/LibraryLoader.java) " +
- "--input_file " +
- "$(location base/android/java/src/org/chromium/base/library_loader/LibraryPrefetcher.java) " +
- "--input_file " +
- "$(location base/android/java/src/org/chromium/base/memory/JavaHeapDumpGenerator.java) " +
- "--input_file " +
- "$(location base/android/java/src/org/chromium/base/metrics/NativeUmaRecorder.java) " +
- "--input_file " +
- "$(location base/android/java/src/org/chromium/base/metrics/StatisticsRecorderAndroid.java) " +
- "--input_file " +
- "$(location base/android/java/src/org/chromium/base/process_launcher/ChildProcessService.java) " +
- "--input_file " +
- "$(location base/android/java/src/org/chromium/base/task/PostTask.java) " +
- "--input_file " +
- "$(location base/android/java/src/org/chromium/base/task/TaskRunnerImpl.java) " +
- "--package_prefix " +
- "android.net.http.internal",
- out: [
- "base/base_jni_headers/ApkAssets_jni.h",
- "base/base_jni_headers/ApplicationStatus_jni.h",
- "base/base_jni_headers/BaseFeatureList_jni.h",
- "base/base_jni_headers/BuildInfo_jni.h",
- "base/base_jni_headers/BundleUtils_jni.h",
- "base/base_jni_headers/Callback_jni.h",
- "base/base_jni_headers/ChildProcessService_jni.h",
- "base/base_jni_headers/CommandLine_jni.h",
- "base/base_jni_headers/ContentUriUtils_jni.h",
- "base/base_jni_headers/CpuFeatures_jni.h",
- "base/base_jni_headers/EarlyTraceEvent_jni.h",
- "base/base_jni_headers/EventLog_jni.h",
- "base/base_jni_headers/FeatureList_jni.h",
- "base/base_jni_headers/Features_jni.h",
- "base/base_jni_headers/FieldTrialList_jni.h",
- "base/base_jni_headers/FileUtils_jni.h",
- "base/base_jni_headers/ImportantFileWriterAndroid_jni.h",
- "base/base_jni_headers/IntStringCallback_jni.h",
- "base/base_jni_headers/JNIUtils_jni.h",
- "base/base_jni_headers/JankMetricUMARecorder_jni.h",
- "base/base_jni_headers/JavaExceptionReporter_jni.h",
- "base/base_jni_headers/JavaHandlerThread_jni.h",
- "base/base_jni_headers/JavaHeapDumpGenerator_jni.h",
- "base/base_jni_headers/LibraryLoader_jni.h",
- "base/base_jni_headers/LibraryPrefetcher_jni.h",
- "base/base_jni_headers/LocaleUtils_jni.h",
- "base/base_jni_headers/MemoryPressureListener_jni.h",
- "base/base_jni_headers/NativeUmaRecorder_jni.h",
- "base/base_jni_headers/PathService_jni.h",
- "base/base_jni_headers/PathUtils_jni.h",
- "base/base_jni_headers/PiiElider_jni.h",
- "base/base_jni_headers/PostTask_jni.h",
- "base/base_jni_headers/PowerMonitor_jni.h",
- "base/base_jni_headers/RadioUtils_jni.h",
- "base/base_jni_headers/StatisticsRecorderAndroid_jni.h",
- "base/base_jni_headers/SysUtils_jni.h",
- "base/base_jni_headers/TaskRunnerImpl_jni.h",
- "base/base_jni_headers/ThreadUtils_jni.h",
- "base/base_jni_headers/TimezoneUtils_jni.h",
- "base/base_jni_headers/TraceEvent_jni.h",
- "base/base_jni_headers/UnguessableToken_jni.h",
- ],
- tool_files: [
- "base/android/jni_generator/android_jar.classes",
- "base/android/jni_generator/jni_generator.py",
- "build/android/gyp/util/__init__.py",
- "build/android/gyp/util/build_utils.py",
- "build/gn_helpers.py",
- ],
- apex_available: [
- "com.android.tethering",
- ],
-}
-
-// GN: //base:base_jni_headers__testing
-cc_genrule {
- name: "cronet_aml_base_base_jni_headers__testing",
- srcs: [
- "base/android/java/src/org/chromium/base/ApkAssets.java",
- "base/android/java/src/org/chromium/base/ApplicationStatus.java",
- "base/android/java/src/org/chromium/base/BaseFeatureList.java",
- "base/android/java/src/org/chromium/base/BuildInfo.java",
- "base/android/java/src/org/chromium/base/BundleUtils.java",
- "base/android/java/src/org/chromium/base/Callback.java",
- "base/android/java/src/org/chromium/base/CommandLine.java",
- "base/android/java/src/org/chromium/base/ContentUriUtils.java",
- "base/android/java/src/org/chromium/base/CpuFeatures.java",
- "base/android/java/src/org/chromium/base/EarlyTraceEvent.java",
- "base/android/java/src/org/chromium/base/EventLog.java",
- "base/android/java/src/org/chromium/base/FeatureList.java",
- "base/android/java/src/org/chromium/base/Features.java",
- "base/android/java/src/org/chromium/base/FieldTrialList.java",
- "base/android/java/src/org/chromium/base/FileUtils.java",
- "base/android/java/src/org/chromium/base/ImportantFileWriterAndroid.java",
- "base/android/java/src/org/chromium/base/IntStringCallback.java",
- "base/android/java/src/org/chromium/base/JNIUtils.java",
- "base/android/java/src/org/chromium/base/JavaExceptionReporter.java",
- "base/android/java/src/org/chromium/base/JavaHandlerThread.java",
- "base/android/java/src/org/chromium/base/LocaleUtils.java",
- "base/android/java/src/org/chromium/base/MemoryPressureListener.java",
- "base/android/java/src/org/chromium/base/PathService.java",
- "base/android/java/src/org/chromium/base/PathUtils.java",
- "base/android/java/src/org/chromium/base/PiiElider.java",
- "base/android/java/src/org/chromium/base/PowerMonitor.java",
- "base/android/java/src/org/chromium/base/RadioUtils.java",
- "base/android/java/src/org/chromium/base/SysUtils.java",
- "base/android/java/src/org/chromium/base/ThreadUtils.java",
- "base/android/java/src/org/chromium/base/TimezoneUtils.java",
- "base/android/java/src/org/chromium/base/TraceEvent.java",
- "base/android/java/src/org/chromium/base/UnguessableToken.java",
- "base/android/java/src/org/chromium/base/jank_tracker/JankMetricUMARecorder.java",
- "base/android/java/src/org/chromium/base/library_loader/LibraryLoader.java",
- "base/android/java/src/org/chromium/base/library_loader/LibraryPrefetcher.java",
- "base/android/java/src/org/chromium/base/memory/JavaHeapDumpGenerator.java",
- "base/android/java/src/org/chromium/base/metrics/NativeUmaRecorder.java",
- "base/android/java/src/org/chromium/base/metrics/StatisticsRecorderAndroid.java",
- "base/android/java/src/org/chromium/base/process_launcher/ChildProcessService.java",
- "base/android/java/src/org/chromium/base/task/PostTask.java",
- "base/android/java/src/org/chromium/base/task/TaskRunnerImpl.java",
- ],
- cmd: "$(location base/android/jni_generator/jni_generator.py) --ptr_type " +
- "long " +
- "--output_dir " +
- "$(genDir)/base/base_jni_headers " +
- "--includes " +
- "base/android/jni_generator/jni_generator_helper.h " +
- "--use_proxy_hash " +
- "--output_name " +
- "ApkAssets_jni.h " +
- "--output_name " +
- "ApplicationStatus_jni.h " +
- "--output_name " +
- "BaseFeatureList_jni.h " +
- "--output_name " +
- "BuildInfo_jni.h " +
- "--output_name " +
- "BundleUtils_jni.h " +
- "--output_name " +
- "Callback_jni.h " +
- "--output_name " +
- "CommandLine_jni.h " +
- "--output_name " +
- "ContentUriUtils_jni.h " +
- "--output_name " +
- "CpuFeatures_jni.h " +
- "--output_name " +
- "EarlyTraceEvent_jni.h " +
- "--output_name " +
- "EventLog_jni.h " +
- "--output_name " +
- "FeatureList_jni.h " +
- "--output_name " +
- "Features_jni.h " +
- "--output_name " +
- "FieldTrialList_jni.h " +
- "--output_name " +
- "FileUtils_jni.h " +
- "--output_name " +
- "ImportantFileWriterAndroid_jni.h " +
- "--output_name " +
- "IntStringCallback_jni.h " +
- "--output_name " +
- "JNIUtils_jni.h " +
- "--output_name " +
- "JavaExceptionReporter_jni.h " +
- "--output_name " +
- "JavaHandlerThread_jni.h " +
- "--output_name " +
- "LocaleUtils_jni.h " +
- "--output_name " +
- "MemoryPressureListener_jni.h " +
- "--output_name " +
- "PathService_jni.h " +
- "--output_name " +
- "PathUtils_jni.h " +
- "--output_name " +
- "PiiElider_jni.h " +
- "--output_name " +
- "PowerMonitor_jni.h " +
- "--output_name " +
- "RadioUtils_jni.h " +
- "--output_name " +
- "SysUtils_jni.h " +
- "--output_name " +
- "ThreadUtils_jni.h " +
- "--output_name " +
- "TimezoneUtils_jni.h " +
- "--output_name " +
- "TraceEvent_jni.h " +
- "--output_name " +
- "UnguessableToken_jni.h " +
- "--output_name " +
- "JankMetricUMARecorder_jni.h " +
- "--output_name " +
- "LibraryLoader_jni.h " +
- "--output_name " +
- "LibraryPrefetcher_jni.h " +
- "--output_name " +
- "JavaHeapDumpGenerator_jni.h " +
- "--output_name " +
- "NativeUmaRecorder_jni.h " +
- "--output_name " +
- "StatisticsRecorderAndroid_jni.h " +
- "--output_name " +
- "ChildProcessService_jni.h " +
- "--output_name " +
- "PostTask_jni.h " +
- "--output_name " +
- "TaskRunnerImpl_jni.h " +
- "--input_file " +
- "$(location base/android/java/src/org/chromium/base/ApkAssets.java) " +
- "--input_file " +
- "$(location base/android/java/src/org/chromium/base/ApplicationStatus.java) " +
- "--input_file " +
- "$(location base/android/java/src/org/chromium/base/BaseFeatureList.java) " +
- "--input_file " +
- "$(location base/android/java/src/org/chromium/base/BuildInfo.java) " +
- "--input_file " +
- "$(location base/android/java/src/org/chromium/base/BundleUtils.java) " +
- "--input_file " +
- "$(location base/android/java/src/org/chromium/base/Callback.java) " +
- "--input_file " +
- "$(location base/android/java/src/org/chromium/base/CommandLine.java) " +
- "--input_file " +
- "$(location base/android/java/src/org/chromium/base/ContentUriUtils.java) " +
- "--input_file " +
- "$(location base/android/java/src/org/chromium/base/CpuFeatures.java) " +
- "--input_file " +
- "$(location base/android/java/src/org/chromium/base/EarlyTraceEvent.java) " +
- "--input_file " +
- "$(location base/android/java/src/org/chromium/base/EventLog.java) " +
- "--input_file " +
- "$(location base/android/java/src/org/chromium/base/FeatureList.java) " +
- "--input_file " +
- "$(location base/android/java/src/org/chromium/base/Features.java) " +
- "--input_file " +
- "$(location base/android/java/src/org/chromium/base/FieldTrialList.java) " +
- "--input_file " +
- "$(location base/android/java/src/org/chromium/base/FileUtils.java) " +
- "--input_file " +
- "$(location base/android/java/src/org/chromium/base/ImportantFileWriterAndroid.java) " +
- "--input_file " +
- "$(location base/android/java/src/org/chromium/base/IntStringCallback.java) " +
- "--input_file " +
- "$(location base/android/java/src/org/chromium/base/JNIUtils.java) " +
- "--input_file " +
- "$(location base/android/java/src/org/chromium/base/JavaExceptionReporter.java) " +
- "--input_file " +
- "$(location base/android/java/src/org/chromium/base/JavaHandlerThread.java) " +
- "--input_file " +
- "$(location base/android/java/src/org/chromium/base/LocaleUtils.java) " +
- "--input_file " +
- "$(location base/android/java/src/org/chromium/base/MemoryPressureListener.java) " +
- "--input_file " +
- "$(location base/android/java/src/org/chromium/base/PathService.java) " +
- "--input_file " +
- "$(location base/android/java/src/org/chromium/base/PathUtils.java) " +
- "--input_file " +
- "$(location base/android/java/src/org/chromium/base/PiiElider.java) " +
- "--input_file " +
- "$(location base/android/java/src/org/chromium/base/PowerMonitor.java) " +
- "--input_file " +
- "$(location base/android/java/src/org/chromium/base/RadioUtils.java) " +
- "--input_file " +
- "$(location base/android/java/src/org/chromium/base/SysUtils.java) " +
- "--input_file " +
- "$(location base/android/java/src/org/chromium/base/ThreadUtils.java) " +
- "--input_file " +
- "$(location base/android/java/src/org/chromium/base/TimezoneUtils.java) " +
- "--input_file " +
- "$(location base/android/java/src/org/chromium/base/TraceEvent.java) " +
- "--input_file " +
- "$(location base/android/java/src/org/chromium/base/UnguessableToken.java) " +
- "--input_file " +
- "$(location base/android/java/src/org/chromium/base/jank_tracker/JankMetricUMARecorder.java) " +
- "--input_file " +
- "$(location base/android/java/src/org/chromium/base/library_loader/LibraryLoader.java) " +
- "--input_file " +
- "$(location base/android/java/src/org/chromium/base/library_loader/LibraryPrefetcher.java) " +
- "--input_file " +
- "$(location base/android/java/src/org/chromium/base/memory/JavaHeapDumpGenerator.java) " +
- "--input_file " +
- "$(location base/android/java/src/org/chromium/base/metrics/NativeUmaRecorder.java) " +
- "--input_file " +
- "$(location base/android/java/src/org/chromium/base/metrics/StatisticsRecorderAndroid.java) " +
- "--input_file " +
- "$(location base/android/java/src/org/chromium/base/process_launcher/ChildProcessService.java) " +
- "--input_file " +
- "$(location base/android/java/src/org/chromium/base/task/PostTask.java) " +
- "--input_file " +
- "$(location base/android/java/src/org/chromium/base/task/TaskRunnerImpl.java)",
- out: [
- "base/base_jni_headers/ApkAssets_jni.h",
- "base/base_jni_headers/ApplicationStatus_jni.h",
- "base/base_jni_headers/BaseFeatureList_jni.h",
- "base/base_jni_headers/BuildInfo_jni.h",
- "base/base_jni_headers/BundleUtils_jni.h",
- "base/base_jni_headers/Callback_jni.h",
- "base/base_jni_headers/ChildProcessService_jni.h",
- "base/base_jni_headers/CommandLine_jni.h",
- "base/base_jni_headers/ContentUriUtils_jni.h",
- "base/base_jni_headers/CpuFeatures_jni.h",
- "base/base_jni_headers/EarlyTraceEvent_jni.h",
- "base/base_jni_headers/EventLog_jni.h",
- "base/base_jni_headers/FeatureList_jni.h",
- "base/base_jni_headers/Features_jni.h",
- "base/base_jni_headers/FieldTrialList_jni.h",
- "base/base_jni_headers/FileUtils_jni.h",
- "base/base_jni_headers/ImportantFileWriterAndroid_jni.h",
- "base/base_jni_headers/IntStringCallback_jni.h",
- "base/base_jni_headers/JNIUtils_jni.h",
- "base/base_jni_headers/JankMetricUMARecorder_jni.h",
- "base/base_jni_headers/JavaExceptionReporter_jni.h",
- "base/base_jni_headers/JavaHandlerThread_jni.h",
- "base/base_jni_headers/JavaHeapDumpGenerator_jni.h",
- "base/base_jni_headers/LibraryLoader_jni.h",
- "base/base_jni_headers/LibraryPrefetcher_jni.h",
- "base/base_jni_headers/LocaleUtils_jni.h",
- "base/base_jni_headers/MemoryPressureListener_jni.h",
- "base/base_jni_headers/NativeUmaRecorder_jni.h",
- "base/base_jni_headers/PathService_jni.h",
- "base/base_jni_headers/PathUtils_jni.h",
- "base/base_jni_headers/PiiElider_jni.h",
- "base/base_jni_headers/PostTask_jni.h",
- "base/base_jni_headers/PowerMonitor_jni.h",
- "base/base_jni_headers/RadioUtils_jni.h",
- "base/base_jni_headers/StatisticsRecorderAndroid_jni.h",
- "base/base_jni_headers/SysUtils_jni.h",
- "base/base_jni_headers/TaskRunnerImpl_jni.h",
- "base/base_jni_headers/ThreadUtils_jni.h",
- "base/base_jni_headers/TimezoneUtils_jni.h",
- "base/base_jni_headers/TraceEvent_jni.h",
- "base/base_jni_headers/UnguessableToken_jni.h",
- ],
- tool_files: [
- "base/android/jni_generator/android_jar.classes",
- "base/android/jni_generator/jni_generator.py",
- "build/android/gyp/util/__init__.py",
- "build/android/gyp/util/build_utils.py",
- "build/gn_helpers.py",
- ],
- apex_available: [
- "com.android.tethering",
- ],
-}
-
-// GN: //base:base_static
-cc_library_static {
- name: "cronet_aml_base_base_static",
- srcs: [
- "base/base_switches.cc",
- ],
- generated_headers: [
- "cronet_aml_build_chromeos_buildflags",
- ],
- export_generated_headers: [
- "cronet_aml_build_chromeos_buildflags",
- ],
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DHAVE_SYS_UIO_H",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_FORTIFY_SOURCE=2",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D__STDC_CONSTANT_MACROS",
- "-D__STDC_FORMAT_MACROS",
- "-O2",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- ],
- cpp_std: "c++17",
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- ],
- target: {
- android_arm: {
- cflags: [
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-fstack-protector",
- "-msse3",
- ],
- },
- },
-}
-
-// GN: //base:base_static__testing
-cc_library_static {
- name: "cronet_aml_base_base_static__testing",
- srcs: [
- "base/base_switches.cc",
- ],
- host_supported: true,
- generated_headers: [
- "cronet_aml_build_chromeos_buildflags__testing",
- ],
- export_generated_headers: [
- "cronet_aml_build_chromeos_buildflags__testing",
- ],
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_FORTIFY_SOURCE=2",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D__STDC_CONSTANT_MACROS",
- "-D__STDC_FORMAT_MACROS",
- "-O2",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- ],
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- ],
- target: {
- android_arm: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-fstack-protector",
- "-msse3",
- ],
- },
- host: {
- cflags: [
- "-DCR_SYSROOT_KEY=20220331T153654Z-0",
- "-DUSE_AURA=1",
- "-DUSE_OZONE=1",
- "-DUSE_UDEV",
- "-D_FILE_OFFSET_BITS=64",
- "-D_LARGEFILE64_SOURCE",
- "-D_LARGEFILE_SOURCE",
- "-fstack-protector",
- "-msse3",
- ],
- compile_multilib: "64",
- },
- },
-}
-
-// GN: //base:build_date
-cc_genrule {
- name: "cronet_aml_base_build_date",
- cmd: "$(location build/write_build_date_header.py) $(out) " +
- "1674644139",
- out: [
- "base/generated_build_date.h",
- ],
- tool_files: [
- "build/write_build_date_header.py",
- ],
- apex_available: [
- "com.android.tethering",
- ],
-}
-
-// GN: //base:build_date__testing
-cc_genrule {
- name: "cronet_aml_base_build_date__testing",
- cmd: "$(location build/write_build_date_header.py) $(out) " +
- "1674644139",
- host_supported: true,
- out: [
- "base/generated_build_date.h",
- ],
- tool_files: [
- "build/write_build_date_header.py",
- ],
- apex_available: [
- "com.android.tethering",
- ],
-}
-
-// GN: //base:cfi_buildflags
-cc_genrule {
- name: "cronet_aml_base_cfi_buildflags",
- cmd: "echo '--flags CFI_CAST_CHECK=\"false && false\" CFI_ICALL_CHECK=\"false && false\" CFI_ENFORCEMENT_TRAP=\"false && !false\" CFI_ENFORCEMENT_DIAGNOSTIC=\"false && false && !false\"' | " +
- "$(location build/write_buildflag_header.py) --output " +
- "$(out) " +
- "--rulename " +
- "//base:cfi_buildflags " +
- "--gen-dir " +
- ". " +
- "--definitions " +
- "/dev/stdin",
- out: [
- "base/cfi_buildflags.h",
- ],
- tool_files: [
- "build/write_buildflag_header.py",
- ],
- apex_available: [
- "com.android.tethering",
- ],
-}
-
-// GN: //base:cfi_buildflags__testing
-cc_genrule {
- name: "cronet_aml_base_cfi_buildflags__testing",
- cmd: "echo '--flags CFI_CAST_CHECK=\"false && false\" CFI_ICALL_CHECK=\"false && false\" CFI_ENFORCEMENT_TRAP=\"false && !false\" CFI_ENFORCEMENT_DIAGNOSTIC=\"false && false && !false\"' | " +
- "$(location build/write_buildflag_header.py) --output " +
- "$(out) " +
- "--rulename " +
- "//base:cfi_buildflags " +
- "--gen-dir " +
- ". " +
- "--definitions " +
- "/dev/stdin",
- host_supported: true,
- out: [
- "base/cfi_buildflags.h",
- ],
- tool_files: [
- "build/write_buildflag_header.py",
- ],
- apex_available: [
- "com.android.tethering",
- ],
-}
-
-// GN: //base:clang_profiling_buildflags
-cc_genrule {
- name: "cronet_aml_base_clang_profiling_buildflags",
- cmd: "echo '--flags CLANG_PROFILING=\"false\" CLANG_PROFILING_INSIDE_SANDBOX=\"false\" USE_CLANG_COVERAGE=\"false\"' | " +
- "$(location build/write_buildflag_header.py) --output " +
- "$(out) " +
- "--rulename " +
- "//base:clang_profiling_buildflags " +
- "--gen-dir " +
- ". " +
- "--definitions " +
- "/dev/stdin",
- out: [
- "base/clang_profiling_buildflags.h",
- ],
- tool_files: [
- "build/write_buildflag_header.py",
- ],
- apex_available: [
- "com.android.tethering",
- ],
-}
-
-// GN: //base:clang_profiling_buildflags__testing
-cc_genrule {
- name: "cronet_aml_base_clang_profiling_buildflags__testing",
- cmd: "echo '--flags CLANG_PROFILING=\"false\" CLANG_PROFILING_INSIDE_SANDBOX=\"false\" USE_CLANG_COVERAGE=\"false\"' | " +
- "$(location build/write_buildflag_header.py) --output " +
- "$(out) " +
- "--rulename " +
- "//base:clang_profiling_buildflags " +
- "--gen-dir " +
- ". " +
- "--definitions " +
- "/dev/stdin",
- host_supported: true,
- out: [
- "base/clang_profiling_buildflags.h",
- ],
- tool_files: [
- "build/write_buildflag_header.py",
- ],
- apex_available: [
- "com.android.tethering",
- ],
-}
-
-// GN: //base:debugging_buildflags
-cc_genrule {
- name: "cronet_aml_base_debugging_buildflags",
- cmd: "if [[ ( $$CC_ARCH == 'x86_64' && $$CC_OS == 'android' ) ]]; " +
- "then " +
- "echo '--flags DCHECK_IS_CONFIGURABLE=\"false\" ENABLE_LOCATION_SOURCE=\"true\" FROM_HERE_USES_LOCATION_BUILTINS=\"true\" ENABLE_PROFILING=\"false\" CAN_UNWIND_WITH_FRAME_POINTERS=\"false\" UNSAFE_DEVELOPER_BUILD=\"false\" CAN_UNWIND_WITH_CFI_TABLE=\"false\" EXCLUDE_UNWIND_TABLES=\"true\" ENABLE_GDBINIT_WARNING=\"false\" ENABLE_LLDBINIT_WARNING=\"false\" EXPENSIVE_DCHECKS_ARE_ON=\"false\" ENABLE_STACK_TRACE_LINE_NUMBERS=\"false\"' | " +
- "$(location build/write_buildflag_header.py) --output " +
- "$(out) " +
- "--rulename " +
- "//base:debugging_buildflags " +
- "--gen-dir " +
- ". " +
- "--definitions " +
- "/dev/stdin; " +
- "fi; " +
- "if [[ ( $$CC_ARCH == 'x86' && $$CC_OS == 'android' ) ]]; " +
- "then " +
- "echo '--flags DCHECK_IS_CONFIGURABLE=\"false\" ENABLE_LOCATION_SOURCE=\"true\" FROM_HERE_USES_LOCATION_BUILTINS=\"true\" ENABLE_PROFILING=\"false\" CAN_UNWIND_WITH_FRAME_POINTERS=\"false\" UNSAFE_DEVELOPER_BUILD=\"false\" CAN_UNWIND_WITH_CFI_TABLE=\"false\" EXCLUDE_UNWIND_TABLES=\"true\" ENABLE_GDBINIT_WARNING=\"false\" ENABLE_LLDBINIT_WARNING=\"false\" EXPENSIVE_DCHECKS_ARE_ON=\"false\" ENABLE_STACK_TRACE_LINE_NUMBERS=\"false\"' | " +
- "$(location build/write_buildflag_header.py) --output " +
- "$(out) " +
- "--rulename " +
- "//base:debugging_buildflags " +
- "--gen-dir " +
- ". " +
- "--definitions " +
- "/dev/stdin; " +
- "fi; " +
- "if [[ ( $$CC_ARCH == 'arm' && $$CC_OS == 'android' ) ]]; " +
- "then " +
- "echo '--flags DCHECK_IS_CONFIGURABLE=\"false\" ENABLE_LOCATION_SOURCE=\"true\" FROM_HERE_USES_LOCATION_BUILTINS=\"true\" ENABLE_PROFILING=\"false\" CAN_UNWIND_WITH_FRAME_POINTERS=\"false\" UNSAFE_DEVELOPER_BUILD=\"false\" CAN_UNWIND_WITH_CFI_TABLE=\"true\" EXCLUDE_UNWIND_TABLES=\"true\" ENABLE_GDBINIT_WARNING=\"false\" ENABLE_LLDBINIT_WARNING=\"false\" EXPENSIVE_DCHECKS_ARE_ON=\"false\" ENABLE_STACK_TRACE_LINE_NUMBERS=\"false\"' | " +
- "$(location build/write_buildflag_header.py) --output " +
- "$(out) " +
- "--rulename " +
- "//base:debugging_buildflags " +
- "--gen-dir " +
- ". " +
- "--definitions " +
- "/dev/stdin; " +
- "fi; " +
- "if [[ ( $$CC_ARCH == 'arm64' && $$CC_OS == 'android' ) ]]; " +
- "then " +
- "echo '--flags DCHECK_IS_CONFIGURABLE=\"false\" ENABLE_LOCATION_SOURCE=\"true\" FROM_HERE_USES_LOCATION_BUILTINS=\"true\" ENABLE_PROFILING=\"false\" CAN_UNWIND_WITH_FRAME_POINTERS=\"true\" UNSAFE_DEVELOPER_BUILD=\"false\" CAN_UNWIND_WITH_CFI_TABLE=\"false\" EXCLUDE_UNWIND_TABLES=\"true\" ENABLE_GDBINIT_WARNING=\"false\" ENABLE_LLDBINIT_WARNING=\"false\" EXPENSIVE_DCHECKS_ARE_ON=\"false\" ENABLE_STACK_TRACE_LINE_NUMBERS=\"false\"' | " +
- "$(location build/write_buildflag_header.py) --output " +
- "$(out) " +
- "--rulename " +
- "//base:debugging_buildflags " +
- "--gen-dir " +
- ". " +
- "--definitions " +
- "/dev/stdin; " +
- "fi;",
- out: [
- "base/debug/debugging_buildflags.h",
- ],
- tool_files: [
- "build/write_buildflag_header.py",
- ],
- apex_available: [
- "com.android.tethering",
- ],
-}
-
-// GN: //base:debugging_buildflags__testing
-cc_genrule {
- name: "cronet_aml_base_debugging_buildflags__testing",
- cmd: "if [[ ( $$CC_ARCH == 'x86_64' && $$CC_OS == 'android' ) ]]; " +
- "then " +
- "echo '--flags DCHECK_IS_CONFIGURABLE=\"false\" ENABLE_LOCATION_SOURCE=\"true\" FROM_HERE_USES_LOCATION_BUILTINS=\"true\" ENABLE_PROFILING=\"false\" CAN_UNWIND_WITH_FRAME_POINTERS=\"false\" UNSAFE_DEVELOPER_BUILD=\"false\" CAN_UNWIND_WITH_CFI_TABLE=\"false\" EXCLUDE_UNWIND_TABLES=\"true\" ENABLE_GDBINIT_WARNING=\"false\" ENABLE_LLDBINIT_WARNING=\"false\" EXPENSIVE_DCHECKS_ARE_ON=\"false\" ENABLE_STACK_TRACE_LINE_NUMBERS=\"false\"' | " +
- "$(location build/write_buildflag_header.py) --output " +
- "$(out) " +
- "--rulename " +
- "//base:debugging_buildflags " +
- "--gen-dir " +
- ". " +
- "--definitions " +
- "/dev/stdin; " +
- "fi; " +
- "if [[ $$CC_OS != 'android' ]]; " +
- "then " +
- "echo '--flags DCHECK_IS_CONFIGURABLE=\"false\" ENABLE_LOCATION_SOURCE=\"true\" FROM_HERE_USES_LOCATION_BUILTINS=\"true\" ENABLE_PROFILING=\"false\" CAN_UNWIND_WITH_FRAME_POINTERS=\"true\" UNSAFE_DEVELOPER_BUILD=\"false\" CAN_UNWIND_WITH_CFI_TABLE=\"false\" EXCLUDE_UNWIND_TABLES=\"true\" ENABLE_GDBINIT_WARNING=\"false\" ENABLE_LLDBINIT_WARNING=\"false\" EXPENSIVE_DCHECKS_ARE_ON=\"false\" ENABLE_STACK_TRACE_LINE_NUMBERS=\"false\"' | " +
- "$(location build/write_buildflag_header.py) --output " +
- "$(out) " +
- "--rulename " +
- "//base:debugging_buildflags " +
- "--gen-dir " +
- ". " +
- "--definitions " +
- "/dev/stdin; " +
- "fi; " +
- "if [[ ( $$CC_ARCH == 'x86' && $$CC_OS == 'android' ) ]]; " +
- "then " +
- "echo '--flags DCHECK_IS_CONFIGURABLE=\"false\" ENABLE_LOCATION_SOURCE=\"true\" FROM_HERE_USES_LOCATION_BUILTINS=\"true\" ENABLE_PROFILING=\"false\" CAN_UNWIND_WITH_FRAME_POINTERS=\"false\" UNSAFE_DEVELOPER_BUILD=\"false\" CAN_UNWIND_WITH_CFI_TABLE=\"false\" EXCLUDE_UNWIND_TABLES=\"true\" ENABLE_GDBINIT_WARNING=\"false\" ENABLE_LLDBINIT_WARNING=\"false\" EXPENSIVE_DCHECKS_ARE_ON=\"false\" ENABLE_STACK_TRACE_LINE_NUMBERS=\"false\"' | " +
- "$(location build/write_buildflag_header.py) --output " +
- "$(out) " +
- "--rulename " +
- "//base:debugging_buildflags " +
- "--gen-dir " +
- ". " +
- "--definitions " +
- "/dev/stdin; " +
- "fi; " +
- "if [[ ( $$CC_ARCH == 'arm' && $$CC_OS == 'android' ) ]]; " +
- "then " +
- "echo '--flags DCHECK_IS_CONFIGURABLE=\"false\" ENABLE_LOCATION_SOURCE=\"true\" FROM_HERE_USES_LOCATION_BUILTINS=\"true\" ENABLE_PROFILING=\"false\" CAN_UNWIND_WITH_FRAME_POINTERS=\"false\" UNSAFE_DEVELOPER_BUILD=\"false\" CAN_UNWIND_WITH_CFI_TABLE=\"true\" EXCLUDE_UNWIND_TABLES=\"true\" ENABLE_GDBINIT_WARNING=\"false\" ENABLE_LLDBINIT_WARNING=\"false\" EXPENSIVE_DCHECKS_ARE_ON=\"false\" ENABLE_STACK_TRACE_LINE_NUMBERS=\"false\"' | " +
- "$(location build/write_buildflag_header.py) --output " +
- "$(out) " +
- "--rulename " +
- "//base:debugging_buildflags " +
- "--gen-dir " +
- ". " +
- "--definitions " +
- "/dev/stdin; " +
- "fi; " +
- "if [[ ( $$CC_ARCH == 'arm64' && $$CC_OS == 'android' ) ]]; " +
- "then " +
- "echo '--flags DCHECK_IS_CONFIGURABLE=\"false\" ENABLE_LOCATION_SOURCE=\"true\" FROM_HERE_USES_LOCATION_BUILTINS=\"true\" ENABLE_PROFILING=\"false\" CAN_UNWIND_WITH_FRAME_POINTERS=\"true\" UNSAFE_DEVELOPER_BUILD=\"false\" CAN_UNWIND_WITH_CFI_TABLE=\"false\" EXCLUDE_UNWIND_TABLES=\"true\" ENABLE_GDBINIT_WARNING=\"false\" ENABLE_LLDBINIT_WARNING=\"false\" EXPENSIVE_DCHECKS_ARE_ON=\"false\" ENABLE_STACK_TRACE_LINE_NUMBERS=\"false\"' | " +
- "$(location build/write_buildflag_header.py) --output " +
- "$(out) " +
- "--rulename " +
- "//base:debugging_buildflags " +
- "--gen-dir " +
- ". " +
- "--definitions " +
- "/dev/stdin; " +
- "fi;",
- host_supported: true,
- out: [
- "base/debug/debugging_buildflags.h",
- ],
- tool_files: [
- "build/write_buildflag_header.py",
- ],
- apex_available: [
- "com.android.tethering",
- ],
-}
-
-// GN: //base:feature_list_buildflags
-cc_genrule {
- name: "cronet_aml_base_feature_list_buildflags",
- cmd: "echo '--flags ENABLE_BANNED_BASE_FEATURE_PREFIX=\"false\"' | " +
- "$(location build/write_buildflag_header.py) --output " +
- "$(out) " +
- "--rulename " +
- "//base:feature_list_buildflags " +
- "--gen-dir " +
- ". " +
- "--definitions " +
- "/dev/stdin",
- out: [
- "base/feature_list_buildflags.h",
- ],
- tool_files: [
- "build/write_buildflag_header.py",
- ],
- apex_available: [
- "com.android.tethering",
- ],
-}
-
-// GN: //base:feature_list_buildflags__testing
-cc_genrule {
- name: "cronet_aml_base_feature_list_buildflags__testing",
- cmd: "echo '--flags ENABLE_BANNED_BASE_FEATURE_PREFIX=\"false\"' | " +
- "$(location build/write_buildflag_header.py) --output " +
- "$(out) " +
- "--rulename " +
- "//base:feature_list_buildflags " +
- "--gen-dir " +
- ". " +
- "--definitions " +
- "/dev/stdin",
- host_supported: true,
- out: [
- "base/feature_list_buildflags.h",
- ],
- tool_files: [
- "build/write_buildflag_header.py",
- ],
- apex_available: [
- "com.android.tethering",
- ],
-}
-
-// GN: //base:i18n__testing
-cc_library_static {
- name: "cronet_aml_base_i18n__testing",
- srcs: [
- "base/i18n/base_i18n_switches.cc",
- "base/i18n/break_iterator.cc",
- "base/i18n/case_conversion.cc",
- "base/i18n/char_iterator.cc",
- "base/i18n/character_encoding.cc",
- "base/i18n/encoding_detection.cc",
- "base/i18n/file_util_icu.cc",
- "base/i18n/i18n_constants.cc",
- "base/i18n/icu_string_conversions.cc",
- "base/i18n/icu_util.cc",
- "base/i18n/message_formatter.cc",
- "base/i18n/number_formatting.cc",
- "base/i18n/rtl.cc",
- "base/i18n/streaming_utf8_validator.cc",
- "base/i18n/string_compare.cc",
- "base/i18n/string_search.cc",
- "base/i18n/time_formatting.cc",
- "base/i18n/timezone.cc",
- "base/i18n/utf8_validator_tables.cc",
- ],
- shared_libs: [
- "libandroid",
- "liblog",
- ],
- static_libs: [
- "cronet_aml_base_allocator_partition_allocator_partition_alloc__testing",
- "cronet_aml_base_base__testing",
- "cronet_aml_base_base_static__testing",
- "cronet_aml_base_nodebug_assertion__testing",
- "cronet_aml_base_third_party_double_conversion_double_conversion__testing",
- "cronet_aml_base_third_party_dynamic_annotations_dynamic_annotations__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_base__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_log_severity__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_malloc_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_raw_logging_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_spinlock_wait__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_strerror__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_throw_delegate__testing",
- "cronet_aml_third_party_abseil_cpp_absl_container_hashtablez_sampler__testing",
- "cronet_aml_third_party_abseil_cpp_absl_container_raw_hash_set__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_debugging_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_demangle_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_examine_stack__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_failure_signal_handler__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_stacktrace__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_symbolize__testing",
- "cronet_aml_third_party_abseil_cpp_absl_hash_city__testing",
- "cronet_aml_third_party_abseil_cpp_absl_hash_hash__testing",
- "cronet_aml_third_party_abseil_cpp_absl_hash_low_level_hash__testing",
- "cronet_aml_third_party_abseil_cpp_absl_numeric_int128__testing",
- "cronet_aml_third_party_abseil_cpp_absl_profiling_exponential_biased__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_distributions__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_platform__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_pool_urbg__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_hwaes__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_hwaes_impl__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_slow__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_seed_material__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_seed_gen_exception__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_seed_sequences__testing",
- "cronet_aml_third_party_abseil_cpp_absl_status_status__testing",
- "cronet_aml_third_party_abseil_cpp_absl_status_statusor__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cord__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cord_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_functions__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_handle__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_info__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_str_format_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_strings__testing",
- "cronet_aml_third_party_abseil_cpp_absl_synchronization_graphcycles_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_synchronization_synchronization__testing",
- "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_civil_time__testing",
- "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_time_zone__testing",
- "cronet_aml_third_party_abseil_cpp_absl_time_time__testing",
- "cronet_aml_third_party_abseil_cpp_absl_types_bad_optional_access__testing",
- "cronet_aml_third_party_abseil_cpp_absl_types_bad_variant_access__testing",
- "cronet_aml_third_party_android_ndk_cpu_features__testing",
- "cronet_aml_third_party_ashmem_ashmem__testing",
- "cronet_aml_third_party_boringssl_boringssl__testing",
- "cronet_aml_third_party_boringssl_boringssl_asm__testing",
- "cronet_aml_third_party_ced_ced__testing",
- "cronet_aml_third_party_icu_icui18n__testing",
- "cronet_aml_third_party_icu_icuuc_private__testing",
- "cronet_aml_third_party_libevent_libevent__testing",
- "cronet_aml_third_party_modp_b64_modp_b64__testing",
- ],
- generated_headers: [
- "cronet_aml_build_chromecast_buildflags__testing",
- "cronet_aml_build_chromeos_buildflags__testing",
- ],
- export_generated_headers: [
- "cronet_aml_build_chromecast_buildflags__testing",
- "cronet_aml_build_chromeos_buildflags__testing",
- ],
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DBASE_I18N_IMPLEMENTATION",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DHAVE_SYS_UIO_H",
- "-DICU_UTIL_DATA_IMPL=ICU_UTIL_DATA_FILE",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-DUSE_CHROMIUM_ICU=1",
- "-DU_ENABLE_DYLOAD=0",
- "-DU_ENABLE_RESOURCE_TRACING=0",
- "-DU_ENABLE_TRACING=1",
- "-DU_STATIC_IMPLEMENTATION",
- "-DU_USING_ICU_NAMESPACE=0",
- "-D_FORTIFY_SOURCE=2",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D__STDC_CONSTANT_MACROS",
- "-D__STDC_FORMAT_MACROS",
- "-O2",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "third_party/abseil-cpp/",
- "third_party/boringssl/src/include/",
- "third_party/ced/src/",
- "third_party/icu/source/common/",
- "third_party/icu/source/i18n/",
- ],
- cpp_std: "c++17",
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- "-Wl,--script,external/cronet/base/android/library_loader/anchor_functions.lds",
- "-Wl,-wrap,asprintf",
- "-Wl,-wrap,calloc",
- "-Wl,-wrap,free",
- "-Wl,-wrap,getcwd",
- "-Wl,-wrap,malloc",
- "-Wl,-wrap,malloc_usable_size",
- "-Wl,-wrap,memalign",
- "-Wl,-wrap,posix_memalign",
- "-Wl,-wrap,pvalloc",
- "-Wl,-wrap,realloc",
- "-Wl,-wrap,realpath",
- "-Wl,-wrap,strdup",
- "-Wl,-wrap,strndup",
- "-Wl,-wrap,valloc",
- "-Wl,-wrap,vasprintf",
- ],
- target: {
- android_arm: {
- cflags: [
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-fstack-protector",
- "-msse3",
- ],
- },
- },
-}
-
-// GN: //base:ios_cronet_buildflags
-cc_genrule {
- name: "cronet_aml_base_ios_cronet_buildflags",
- cmd: "echo '--flags CRONET_BUILD=\"true\"' | " +
- "$(location build/write_buildflag_header.py) --output " +
- "$(out) " +
- "--rulename " +
- "//base:ios_cronet_buildflags " +
- "--gen-dir " +
- ". " +
- "--definitions " +
- "/dev/stdin",
- out: [
- "base/message_loop/ios_cronet_buildflags.h",
- ],
- tool_files: [
- "build/write_buildflag_header.py",
- ],
- apex_available: [
- "com.android.tethering",
- ],
-}
-
-// GN: //base:ios_cronet_buildflags__testing
-cc_genrule {
- name: "cronet_aml_base_ios_cronet_buildflags__testing",
- cmd: "echo '--flags CRONET_BUILD=\"true\"' | " +
- "$(location build/write_buildflag_header.py) --output " +
- "$(out) " +
- "--rulename " +
- "//base:ios_cronet_buildflags " +
- "--gen-dir " +
- ". " +
- "--definitions " +
- "/dev/stdin",
- host_supported: true,
- out: [
- "base/message_loop/ios_cronet_buildflags.h",
- ],
- tool_files: [
- "build/write_buildflag_header.py",
- ],
- apex_available: [
- "com.android.tethering",
- ],
-}
-
-// GN: //base:java_features_srcjar
-java_genrule {
- name: "cronet_aml_base_java_features_srcjar",
- srcs: [
- "base/android/base_features.cc",
- "base/features.cc",
- "base/task/task_features.cc",
- ],
- cmd: "$(location build/android/gyp/java_cpp_features.py) --srcjar " +
- "$(out) " +
- "--template " +
- "$(location base/android/java/src/org/chromium/base/BaseFeatures.java.tmpl) " +
- "$(location base/android/base_features.cc) " +
- "$(location base/features.cc) " +
- "$(location base/task/task_features.cc)",
- out: [
- "base/java_features_srcjar.srcjar",
- ],
- tool_files: [
- "base/android/java/src/org/chromium/base/BaseFeatures.java.tmpl",
- "build/android/gyp/java_cpp_features.py",
- "build/android/gyp/util/__init__.py",
- "build/android/gyp/util/build_utils.py",
- "build/android/gyp/util/java_cpp_utils.py",
- "build/gn_helpers.py",
- ],
-}
-
-// GN: //base:java_switches_srcjar
-java_genrule {
- name: "cronet_aml_base_java_switches_srcjar",
- srcs: [
- "base/base_switches.cc",
- ],
- cmd: "$(location build/android/gyp/java_cpp_strings.py) --srcjar " +
- "$(out) " +
- "--template " +
- "$(location base/android/java/src/org/chromium/base/BaseSwitches.java.tmpl) " +
- "$(location base/base_switches.cc)",
- out: [
- "base/java_switches_srcjar.srcjar",
- ],
- tool_files: [
- "base/android/java/src/org/chromium/base/BaseSwitches.java.tmpl",
- "build/android/gyp/java_cpp_strings.py",
- "build/android/gyp/util/__init__.py",
- "build/android/gyp/util/build_utils.py",
- "build/android/gyp/util/java_cpp_utils.py",
- "build/gn_helpers.py",
- ],
-}
-
-// GN: //base:logging_buildflags
-cc_genrule {
- name: "cronet_aml_base_logging_buildflags",
- cmd: "echo '--flags ENABLE_LOG_ERROR_NOT_REACHED=\"false\" USE_RUNTIME_VLOG=\"true\"' | " +
- "$(location build/write_buildflag_header.py) --output " +
- "$(out) " +
- "--rulename " +
- "//base:logging_buildflags " +
- "--gen-dir " +
- ". " +
- "--definitions " +
- "/dev/stdin",
- out: [
- "base/logging_buildflags.h",
- ],
- tool_files: [
- "build/write_buildflag_header.py",
- ],
- apex_available: [
- "com.android.tethering",
- ],
-}
-
-// GN: //base:logging_buildflags__testing
-cc_genrule {
- name: "cronet_aml_base_logging_buildflags__testing",
- cmd: "echo '--flags ENABLE_LOG_ERROR_NOT_REACHED=\"false\" USE_RUNTIME_VLOG=\"true\"' | " +
- "$(location build/write_buildflag_header.py) --output " +
- "$(out) " +
- "--rulename " +
- "//base:logging_buildflags " +
- "--gen-dir " +
- ". " +
- "--definitions " +
- "/dev/stdin",
- host_supported: true,
- out: [
- "base/logging_buildflags.h",
- ],
- tool_files: [
- "build/write_buildflag_header.py",
- ],
- apex_available: [
- "com.android.tethering",
- ],
-}
-
-// GN: //base:message_pump_buildflags
-cc_genrule {
- name: "cronet_aml_base_message_pump_buildflags",
- cmd: "echo '--flags ENABLE_MESSAGE_PUMP_EPOLL=\"true\"' | " +
- "$(location build/write_buildflag_header.py) --output " +
- "$(out) " +
- "--rulename " +
- "//base:message_pump_buildflags " +
- "--gen-dir " +
- ". " +
- "--definitions " +
- "/dev/stdin",
- out: [
- "base/message_loop/message_pump_buildflags.h",
- ],
- tool_files: [
- "build/write_buildflag_header.py",
- ],
- apex_available: [
- "com.android.tethering",
- ],
-}
-
-// GN: //base:message_pump_buildflags__testing
-cc_genrule {
- name: "cronet_aml_base_message_pump_buildflags__testing",
- cmd: "echo '--flags ENABLE_MESSAGE_PUMP_EPOLL=\"true\"' | " +
- "$(location build/write_buildflag_header.py) --output " +
- "$(out) " +
- "--rulename " +
- "//base:message_pump_buildflags " +
- "--gen-dir " +
- ". " +
- "--definitions " +
- "/dev/stdin",
- host_supported: true,
- out: [
- "base/message_loop/message_pump_buildflags.h",
- ],
- tool_files: [
- "build/write_buildflag_header.py",
- ],
- apex_available: [
- "com.android.tethering",
- ],
-}
-
-// GN: //base:nodebug_assertion
-cc_library_static {
- name: "cronet_aml_base_nodebug_assertion",
- srcs: [
- "base/nodebug_assertion.cc",
- ],
- static_libs: [
- "cronet_aml_base_base_static",
- ],
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DBASE_IMPLEMENTATION",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DHAVE_SYS_UIO_H",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_FORTIFY_SOURCE=2",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D__STDC_CONSTANT_MACROS",
- "-D__STDC_FORMAT_MACROS",
- "-Oz",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- ],
- cpp_std: "c++17",
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- ],
- target: {
- android_arm: {
- cflags: [
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-fstack-protector",
- "-msse3",
- ],
- },
- },
-}
-
-// GN: //base:nodebug_assertion__testing
-cc_library_static {
- name: "cronet_aml_base_nodebug_assertion__testing",
- srcs: [
- "base/nodebug_assertion.cc",
- ],
- static_libs: [
- "cronet_aml_base_base_static__testing",
- ],
- host_supported: true,
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DBASE_IMPLEMENTATION",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_FORTIFY_SOURCE=2",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D__STDC_CONSTANT_MACROS",
- "-D__STDC_FORMAT_MACROS",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- ],
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- ],
- target: {
- android_arm: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- "-msse3",
- ],
- },
- host: {
- cflags: [
- "-DCR_SYSROOT_KEY=20220331T153654Z-0",
- "-DUSE_AURA=1",
- "-DUSE_OZONE=1",
- "-DUSE_UDEV",
- "-D_FILE_OFFSET_BITS=64",
- "-D_LARGEFILE64_SOURCE",
- "-D_LARGEFILE_SOURCE",
- "-O2",
- "-fstack-protector",
- "-msse3",
- ],
- compile_multilib: "64",
- },
- },
-}
-
-// GN: //base:orderfile_buildflags
-cc_genrule {
- name: "cronet_aml_base_orderfile_buildflags",
- cmd: "echo '--flags DEVTOOLS_INSTRUMENTATION_DUMPING=\"false\" ORDERFILE_INSTRUMENTATION=\"false\"' | " +
- "$(location build/write_buildflag_header.py) --output " +
- "$(out) " +
- "--rulename " +
- "//base:orderfile_buildflags " +
- "--gen-dir " +
- ". " +
- "--definitions " +
- "/dev/stdin",
- out: [
- "base/android/orderfile/orderfile_buildflags.h",
- ],
- tool_files: [
- "build/write_buildflag_header.py",
- ],
- apex_available: [
- "com.android.tethering",
- ],
-}
-
-// GN: //base:orderfile_buildflags__testing
-cc_genrule {
- name: "cronet_aml_base_orderfile_buildflags__testing",
- cmd: "echo '--flags DEVTOOLS_INSTRUMENTATION_DUMPING=\"false\" ORDERFILE_INSTRUMENTATION=\"false\"' | " +
- "$(location build/write_buildflag_header.py) --output " +
- "$(out) " +
- "--rulename " +
- "//base:orderfile_buildflags " +
- "--gen-dir " +
- ". " +
- "--definitions " +
- "/dev/stdin",
- host_supported: true,
- out: [
- "base/android/orderfile/orderfile_buildflags.h",
- ],
- tool_files: [
- "build/write_buildflag_header.py",
- ],
- apex_available: [
- "com.android.tethering",
- ],
-}
-
-// GN: //base:parsing_buildflags
-cc_genrule {
- name: "cronet_aml_base_parsing_buildflags",
- cmd: "echo '--flags BUILD_RUST_JSON_PARSER=\"false\"' | " +
- "$(location build/write_buildflag_header.py) --output " +
- "$(out) " +
- "--rulename " +
- "//base:parsing_buildflags " +
- "--gen-dir " +
- ". " +
- "--definitions " +
- "/dev/stdin",
- out: [
- "base/parsing_buildflags.h",
- ],
- tool_files: [
- "build/write_buildflag_header.py",
- ],
- apex_available: [
- "com.android.tethering",
- ],
-}
-
-// GN: //base:parsing_buildflags__testing
-cc_genrule {
- name: "cronet_aml_base_parsing_buildflags__testing",
- cmd: "echo '--flags BUILD_RUST_JSON_PARSER=\"false\"' | " +
- "$(location build/write_buildflag_header.py) --output " +
- "$(out) " +
- "--rulename " +
- "//base:parsing_buildflags " +
- "--gen-dir " +
- ". " +
- "--definitions " +
- "/dev/stdin",
- host_supported: true,
- out: [
- "base/parsing_buildflags.h",
- ],
- tool_files: [
- "build/write_buildflag_header.py",
- ],
- apex_available: [
- "com.android.tethering",
- ],
-}
-
-// GN: //base:power_monitor_buildflags
-cc_genrule {
- name: "cronet_aml_base_power_monitor_buildflags",
- cmd: "echo '--flags HAS_BATTERY_LEVEL_PROVIDER_IMPL=\"false\"' | " +
- "$(location build/write_buildflag_header.py) --output " +
- "$(out) " +
- "--rulename " +
- "//base:power_monitor_buildflags " +
- "--gen-dir " +
- ". " +
- "--definitions " +
- "/dev/stdin",
- out: [
- "base/power_monitor/power_monitor_buildflags.h",
- ],
- tool_files: [
- "build/write_buildflag_header.py",
- ],
- apex_available: [
- "com.android.tethering",
- ],
-}
-
-// GN: //base:power_monitor_buildflags__testing
-cc_genrule {
- name: "cronet_aml_base_power_monitor_buildflags__testing",
- cmd: "echo '--flags HAS_BATTERY_LEVEL_PROVIDER_IMPL=\"false\"' | " +
- "$(location build/write_buildflag_header.py) --output " +
- "$(out) " +
- "--rulename " +
- "//base:power_monitor_buildflags " +
- "--gen-dir " +
- ". " +
- "--definitions " +
- "/dev/stdin",
- host_supported: true,
- out: [
- "base/power_monitor/power_monitor_buildflags.h",
- ],
- tool_files: [
- "build/write_buildflag_header.py",
- ],
- apex_available: [
- "com.android.tethering",
- ],
-}
-
-// GN: //base:profiler_buildflags
-cc_genrule {
- name: "cronet_aml_base_profiler_buildflags",
- cmd: "if [[ ( $$CC_ARCH == 'x86_64' && $$CC_OS == 'android' ) ]]; " +
- "then " +
- "echo '--flags ENABLE_ARM_CFI_TABLE=\"false\" IOS_STACK_PROFILER_ENABLED=\"true\" USE_ANDROID_UNWINDER_V2=\"true\"' | " +
- "$(location build/write_buildflag_header.py) --output " +
- "$(out) " +
- "--rulename " +
- "//base:profiler_buildflags " +
- "--gen-dir " +
- ". " +
- "--definitions " +
- "/dev/stdin; " +
- "fi; " +
- "if [[ ( $$CC_ARCH == 'x86' && $$CC_OS == 'android' ) ]]; " +
- "then " +
- "echo '--flags ENABLE_ARM_CFI_TABLE=\"false\" IOS_STACK_PROFILER_ENABLED=\"true\" USE_ANDROID_UNWINDER_V2=\"true\"' | " +
- "$(location build/write_buildflag_header.py) --output " +
- "$(out) " +
- "--rulename " +
- "//base:profiler_buildflags " +
- "--gen-dir " +
- ". " +
- "--definitions " +
- "/dev/stdin; " +
- "fi; " +
- "if [[ ( $$CC_ARCH == 'arm' && $$CC_OS == 'android' ) ]]; " +
- "then " +
- "echo '--flags ENABLE_ARM_CFI_TABLE=\"true\" IOS_STACK_PROFILER_ENABLED=\"true\" USE_ANDROID_UNWINDER_V2=\"true\"' | " +
- "$(location build/write_buildflag_header.py) --output " +
- "$(out) " +
- "--rulename " +
- "//base:profiler_buildflags " +
- "--gen-dir " +
- ". " +
- "--definitions " +
- "/dev/stdin; " +
- "fi; " +
- "if [[ ( $$CC_ARCH == 'arm64' && $$CC_OS == 'android' ) ]]; " +
- "then " +
- "echo '--flags ENABLE_ARM_CFI_TABLE=\"false\" IOS_STACK_PROFILER_ENABLED=\"true\" USE_ANDROID_UNWINDER_V2=\"true\"' | " +
- "$(location build/write_buildflag_header.py) --output " +
- "$(out) " +
- "--rulename " +
- "//base:profiler_buildflags " +
- "--gen-dir " +
- ". " +
- "--definitions " +
- "/dev/stdin; " +
- "fi;",
- out: [
- "base/profiler/profiler_buildflags.h",
- ],
- tool_files: [
- "build/write_buildflag_header.py",
- ],
- apex_available: [
- "com.android.tethering",
- ],
-}
-
-// GN: //base:profiler_buildflags__testing
-cc_genrule {
- name: "cronet_aml_base_profiler_buildflags__testing",
- cmd: "if [[ ( $$CC_ARCH == 'x86_64' && $$CC_OS == 'android' ) ]]; " +
- "then " +
- "echo '--flags ENABLE_ARM_CFI_TABLE=\"false\" IOS_STACK_PROFILER_ENABLED=\"true\" USE_ANDROID_UNWINDER_V2=\"true\"' | " +
- "$(location build/write_buildflag_header.py) --output " +
- "$(out) " +
- "--rulename " +
- "//base:profiler_buildflags " +
- "--gen-dir " +
- ". " +
- "--definitions " +
- "/dev/stdin; " +
- "fi; " +
- "if [[ $$CC_OS != 'android' ]]; " +
- "then " +
- "echo '--flags ENABLE_ARM_CFI_TABLE=\"false\" IOS_STACK_PROFILER_ENABLED=\"true\" USE_ANDROID_UNWINDER_V2=\"true\"' | " +
- "$(location build/write_buildflag_header.py) --output " +
- "$(out) " +
- "--rulename " +
- "//base:profiler_buildflags " +
- "--gen-dir " +
- ". " +
- "--definitions " +
- "/dev/stdin; " +
- "fi; " +
- "if [[ ( $$CC_ARCH == 'x86' && $$CC_OS == 'android' ) ]]; " +
- "then " +
- "echo '--flags ENABLE_ARM_CFI_TABLE=\"false\" IOS_STACK_PROFILER_ENABLED=\"true\" USE_ANDROID_UNWINDER_V2=\"true\"' | " +
- "$(location build/write_buildflag_header.py) --output " +
- "$(out) " +
- "--rulename " +
- "//base:profiler_buildflags " +
- "--gen-dir " +
- ". " +
- "--definitions " +
- "/dev/stdin; " +
- "fi; " +
- "if [[ ( $$CC_ARCH == 'arm' && $$CC_OS == 'android' ) ]]; " +
- "then " +
- "echo '--flags ENABLE_ARM_CFI_TABLE=\"true\" IOS_STACK_PROFILER_ENABLED=\"true\" USE_ANDROID_UNWINDER_V2=\"true\"' | " +
- "$(location build/write_buildflag_header.py) --output " +
- "$(out) " +
- "--rulename " +
- "//base:profiler_buildflags " +
- "--gen-dir " +
- ". " +
- "--definitions " +
- "/dev/stdin; " +
- "fi; " +
- "if [[ ( $$CC_ARCH == 'arm64' && $$CC_OS == 'android' ) ]]; " +
- "then " +
- "echo '--flags ENABLE_ARM_CFI_TABLE=\"false\" IOS_STACK_PROFILER_ENABLED=\"true\" USE_ANDROID_UNWINDER_V2=\"true\"' | " +
- "$(location build/write_buildflag_header.py) --output " +
- "$(out) " +
- "--rulename " +
- "//base:profiler_buildflags " +
- "--gen-dir " +
- ". " +
- "--definitions " +
- "/dev/stdin; " +
- "fi;",
- host_supported: true,
- out: [
- "base/profiler/profiler_buildflags.h",
- ],
- tool_files: [
- "build/write_buildflag_header.py",
- ],
- apex_available: [
- "com.android.tethering",
- ],
-}
-
-// GN: //base:sanitizer_buildflags
-cc_genrule {
- name: "cronet_aml_base_sanitizer_buildflags",
- cmd: "echo '--flags IS_HWASAN=\"false\" USING_SANITIZER=\"false\"' | " +
- "$(location build/write_buildflag_header.py) --output " +
- "$(out) " +
- "--rulename " +
- "//base:sanitizer_buildflags " +
- "--gen-dir " +
- ". " +
- "--definitions " +
- "/dev/stdin",
- out: [
- "base/sanitizer_buildflags.h",
- ],
- tool_files: [
- "build/write_buildflag_header.py",
- ],
- apex_available: [
- "com.android.tethering",
- ],
-}
-
-// GN: //base:sanitizer_buildflags__testing
-cc_genrule {
- name: "cronet_aml_base_sanitizer_buildflags__testing",
- cmd: "echo '--flags IS_HWASAN=\"false\" USING_SANITIZER=\"false\"' | " +
- "$(location build/write_buildflag_header.py) --output " +
- "$(out) " +
- "--rulename " +
- "//base:sanitizer_buildflags " +
- "--gen-dir " +
- ". " +
- "--definitions " +
- "/dev/stdin",
- host_supported: true,
- out: [
- "base/sanitizer_buildflags.h",
- ],
- tool_files: [
- "build/write_buildflag_header.py",
- ],
- apex_available: [
- "com.android.tethering",
- ],
-}
-
-// GN: //base:synchronization_buildflags
-cc_genrule {
- name: "cronet_aml_base_synchronization_buildflags",
- cmd: "echo '--flags ENABLE_MUTEX_PRIORITY_INHERITANCE=\"false\"' | " +
- "$(location build/write_buildflag_header.py) --output " +
- "$(out) " +
- "--rulename " +
- "//base:synchronization_buildflags " +
- "--gen-dir " +
- ". " +
- "--definitions " +
- "/dev/stdin",
- out: [
- "base/synchronization/synchronization_buildflags.h",
- ],
- tool_files: [
- "build/write_buildflag_header.py",
- ],
- apex_available: [
- "com.android.tethering",
- ],
-}
-
-// GN: //base:synchronization_buildflags__testing
-cc_genrule {
- name: "cronet_aml_base_synchronization_buildflags__testing",
- cmd: "echo '--flags ENABLE_MUTEX_PRIORITY_INHERITANCE=\"false\"' | " +
- "$(location build/write_buildflag_header.py) --output " +
- "$(out) " +
- "--rulename " +
- "//base:synchronization_buildflags " +
- "--gen-dir " +
- ". " +
- "--definitions " +
- "/dev/stdin",
- host_supported: true,
- out: [
- "base/synchronization/synchronization_buildflags.h",
- ],
- tool_files: [
- "build/write_buildflag_header.py",
- ],
- apex_available: [
- "com.android.tethering",
- ],
-}
-
-// GN: //base/test:base_unittests_jni_headers__testing
-cc_genrule {
- name: "cronet_aml_base_test_base_unittests_jni_headers__testing",
- srcs: [
- "base/test/android/java/src/org/chromium/base/ContentUriTestUtils.java",
- "base/test/android/java/src/org/chromium/base/JavaHandlerThreadHelpers.java",
- ],
- cmd: "$(location base/android/jni_generator/jni_generator.py) --ptr_type " +
- "long " +
- "--output_dir " +
- "$(genDir)/base/test/base_unittests_jni_headers " +
- "--includes " +
- "base/android/jni_generator/jni_generator_helper.h " +
- "--use_proxy_hash " +
- "--output_name " +
- "ContentUriTestUtils_jni.h " +
- "--output_name " +
- "JavaHandlerThreadHelpers_jni.h " +
- "--input_file " +
- "$(location base/test/android/java/src/org/chromium/base/ContentUriTestUtils.java) " +
- "--input_file " +
- "$(location base/test/android/java/src/org/chromium/base/JavaHandlerThreadHelpers.java)",
- out: [
- "base/test/base_unittests_jni_headers/ContentUriTestUtils_jni.h",
- "base/test/base_unittests_jni_headers/JavaHandlerThreadHelpers_jni.h",
- ],
- tool_files: [
- "base/android/jni_generator/android_jar.classes",
- "base/android/jni_generator/jni_generator.py",
- "build/android/gyp/util/__init__.py",
- "build/android/gyp/util/build_utils.py",
- "build/gn_helpers.py",
- ],
- apex_available: [
- "com.android.tethering",
- ],
-}
-
-// GN: //base/test:test_config__testing
-cc_library_static {
- name: "cronet_aml_base_test_test_config__testing",
- srcs: [
- "base/test/test_switches.cc",
- "base/test/test_timeouts.cc",
- ],
- shared_libs: [
- "libandroid",
- "liblog",
- ],
- static_libs: [
- "cronet_aml_base_allocator_partition_allocator_partition_alloc__testing",
- "cronet_aml_base_base__testing",
- "cronet_aml_base_base_static__testing",
- "cronet_aml_base_nodebug_assertion__testing",
- "cronet_aml_base_third_party_double_conversion_double_conversion__testing",
- "cronet_aml_base_third_party_dynamic_annotations_dynamic_annotations__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_base__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_log_severity__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_malloc_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_raw_logging_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_spinlock_wait__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_strerror__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_throw_delegate__testing",
- "cronet_aml_third_party_abseil_cpp_absl_container_hashtablez_sampler__testing",
- "cronet_aml_third_party_abseil_cpp_absl_container_raw_hash_set__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_debugging_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_demangle_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_examine_stack__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_failure_signal_handler__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_stacktrace__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_symbolize__testing",
- "cronet_aml_third_party_abseil_cpp_absl_hash_city__testing",
- "cronet_aml_third_party_abseil_cpp_absl_hash_hash__testing",
- "cronet_aml_third_party_abseil_cpp_absl_hash_low_level_hash__testing",
- "cronet_aml_third_party_abseil_cpp_absl_numeric_int128__testing",
- "cronet_aml_third_party_abseil_cpp_absl_profiling_exponential_biased__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_distributions__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_platform__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_pool_urbg__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_hwaes__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_hwaes_impl__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_slow__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_seed_material__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_seed_gen_exception__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_seed_sequences__testing",
- "cronet_aml_third_party_abseil_cpp_absl_status_status__testing",
- "cronet_aml_third_party_abseil_cpp_absl_status_statusor__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cord__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cord_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_functions__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_handle__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_info__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_str_format_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_strings__testing",
- "cronet_aml_third_party_abseil_cpp_absl_synchronization_graphcycles_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_synchronization_synchronization__testing",
- "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_civil_time__testing",
- "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_time_zone__testing",
- "cronet_aml_third_party_abseil_cpp_absl_time_time__testing",
- "cronet_aml_third_party_abseil_cpp_absl_types_bad_optional_access__testing",
- "cronet_aml_third_party_abseil_cpp_absl_types_bad_variant_access__testing",
- "cronet_aml_third_party_android_ndk_cpu_features__testing",
- "cronet_aml_third_party_ashmem_ashmem__testing",
- "cronet_aml_third_party_boringssl_boringssl__testing",
- "cronet_aml_third_party_boringssl_boringssl_asm__testing",
- "cronet_aml_third_party_icu_icui18n__testing",
- "cronet_aml_third_party_icu_icuuc_private__testing",
- "cronet_aml_third_party_libevent_libevent__testing",
- "cronet_aml_third_party_modp_b64_modp_b64__testing",
- ],
- generated_headers: [
- "cronet_aml_base_clang_profiling_buildflags__testing",
- "cronet_aml_build_chromeos_buildflags__testing",
- ],
- export_generated_headers: [
- "cronet_aml_base_clang_profiling_buildflags__testing",
- "cronet_aml_build_chromeos_buildflags__testing",
- ],
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DHAVE_SYS_UIO_H",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_FORTIFY_SOURCE=2",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D__STDC_CONSTANT_MACROS",
- "-D__STDC_FORMAT_MACROS",
- "-Oz",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "third_party/abseil-cpp/",
- "third_party/boringssl/src/include/",
- ],
- cpp_std: "c++17",
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- "-Wl,--script,external/cronet/base/android/library_loader/anchor_functions.lds",
- "-Wl,-wrap,asprintf",
- "-Wl,-wrap,calloc",
- "-Wl,-wrap,free",
- "-Wl,-wrap,getcwd",
- "-Wl,-wrap,malloc",
- "-Wl,-wrap,malloc_usable_size",
- "-Wl,-wrap,memalign",
- "-Wl,-wrap,posix_memalign",
- "-Wl,-wrap,pvalloc",
- "-Wl,-wrap,realloc",
- "-Wl,-wrap,realpath",
- "-Wl,-wrap,strdup",
- "-Wl,-wrap,strndup",
- "-Wl,-wrap,valloc",
- "-Wl,-wrap,vasprintf",
- ],
- target: {
- android_arm: {
- cflags: [
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-fstack-protector",
- "-msse3",
- ],
- },
- },
-}
-
-// GN: //base/test:test_support__testing
-cc_library_static {
- name: "cronet_aml_base_test_test_support__testing",
- srcs: [
- "base/task/sequence_manager/test/fake_task.cc",
- "base/task/sequence_manager/test/mock_time_domain.cc",
- "base/task/sequence_manager/test/mock_time_message_pump.cc",
- "base/task/sequence_manager/test/sequence_manager_for_test.cc",
- "base/task/sequence_manager/test/test_task_queue.cc",
- "base/test/android/java_handler_thread_helpers.cc",
- "base/test/android/url_utils.cc",
- "base/test/bind.cc",
- "base/test/copy_only_int.cc",
- "base/test/gtest_links.cc",
- "base/test/gtest_util.cc",
- "base/test/gtest_xml_unittest_result_printer.cc",
- "base/test/gtest_xml_util.cc",
- "base/test/icu_test_util.cc",
- "base/test/launcher/test_launcher.cc",
- "base/test/launcher/test_launcher_test_utils.cc",
- "base/test/launcher/test_launcher_tracer.cc",
- "base/test/launcher/test_result.cc",
- "base/test/launcher/test_results_tracker.cc",
- "base/test/launcher/unit_test_launcher.cc",
- "base/test/metrics/histogram_enum_reader.cc",
- "base/test/metrics/histogram_tester.cc",
- "base/test/metrics/user_action_tester.cc",
- "base/test/mock_devices_changed_observer.cc",
- "base/test/mock_entropy_provider.cc",
- "base/test/mock_log.cc",
- "base/test/multiprocess_test.cc",
- "base/test/multiprocess_test_android.cc",
- "base/test/null_task_runner.cc",
- "base/test/perf_log.cc",
- "base/test/perf_test_suite.cc",
- "base/test/perf_time_logger.cc",
- "base/test/power_monitor_test.cc",
- "base/test/power_monitor_test_utils.cc",
- "base/test/reached_code_profiler_android.cc",
- "base/test/scoped_command_line.cc",
- "base/test/scoped_feature_list.cc",
- "base/test/scoped_locale.cc",
- "base/test/scoped_mock_clock_override.cc",
- "base/test/scoped_mock_time_message_loop_task_runner.cc",
- "base/test/scoped_path_override.cc",
- "base/test/scoped_run_loop_timeout.cc",
- "base/test/sequenced_task_runner_test_template.cc",
- "base/test/simple_test_clock.cc",
- "base/test/simple_test_tick_clock.cc",
- "base/test/task_environment.cc",
- "base/test/task_runner_test_template.cc",
- "base/test/test_discardable_memory_allocator.cc",
- "base/test/test_file_util.cc",
- "base/test/test_file_util_android.cc",
- "base/test/test_file_util_linux.cc",
- "base/test/test_file_util_posix.cc",
- "base/test/test_io_thread.cc",
- "base/test/test_message_loop.cc",
- "base/test/test_mock_time_task_runner.cc",
- "base/test/test_pending_task.cc",
- "base/test/test_shared_memory_util.cc",
- "base/test/test_simple_task_runner.cc",
- "base/test/test_suite.cc",
- "base/test/test_support_android.cc",
- "base/test/test_waitable_event.cc",
- "base/test/thread_pool_test_helpers_android.cc",
- "base/test/thread_test_helper.cc",
- "base/test/values_test_util.cc",
- "base/test/with_feature_override.cc",
- "base/timer/mock_timer.cc",
- ],
- shared_libs: [
- "libandroid",
- "liblog",
- "libz",
- ],
- static_libs: [
- "cronet_aml_base_allocator_partition_allocator_partition_alloc__testing",
- "cronet_aml_base_base__testing",
- "cronet_aml_base_base_static__testing",
- "cronet_aml_base_i18n__testing",
- "cronet_aml_base_nodebug_assertion__testing",
- "cronet_aml_base_test_test_config__testing",
- "cronet_aml_base_third_party_double_conversion_double_conversion__testing",
- "cronet_aml_base_third_party_dynamic_annotations_dynamic_annotations__testing",
- "cronet_aml_testing_gtest_gtest__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_base__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_log_severity__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_malloc_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_raw_logging_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_spinlock_wait__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_strerror__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_throw_delegate__testing",
- "cronet_aml_third_party_abseil_cpp_absl_container_hashtablez_sampler__testing",
- "cronet_aml_third_party_abseil_cpp_absl_container_raw_hash_set__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_debugging_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_demangle_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_examine_stack__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_failure_signal_handler__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_stacktrace__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_symbolize__testing",
- "cronet_aml_third_party_abseil_cpp_absl_hash_city__testing",
- "cronet_aml_third_party_abseil_cpp_absl_hash_hash__testing",
- "cronet_aml_third_party_abseil_cpp_absl_hash_low_level_hash__testing",
- "cronet_aml_third_party_abseil_cpp_absl_numeric_int128__testing",
- "cronet_aml_third_party_abseil_cpp_absl_profiling_exponential_biased__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_distributions__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_platform__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_pool_urbg__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_hwaes__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_hwaes_impl__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_slow__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_seed_material__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_seed_gen_exception__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_seed_sequences__testing",
- "cronet_aml_third_party_abseil_cpp_absl_status_status__testing",
- "cronet_aml_third_party_abseil_cpp_absl_status_statusor__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cord__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cord_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_functions__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_handle__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_info__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_str_format_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_strings__testing",
- "cronet_aml_third_party_abseil_cpp_absl_synchronization_graphcycles_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_synchronization_synchronization__testing",
- "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_civil_time__testing",
- "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_time_zone__testing",
- "cronet_aml_third_party_abseil_cpp_absl_time_time__testing",
- "cronet_aml_third_party_abseil_cpp_absl_types_bad_optional_access__testing",
- "cronet_aml_third_party_abseil_cpp_absl_types_bad_variant_access__testing",
- "cronet_aml_third_party_android_ndk_cpu_features__testing",
- "cronet_aml_third_party_ashmem_ashmem__testing",
- "cronet_aml_third_party_boringssl_boringssl__testing",
- "cronet_aml_third_party_boringssl_boringssl_asm__testing",
- "cronet_aml_third_party_ced_ced__testing",
- "cronet_aml_third_party_googletest_gmock__testing",
- "cronet_aml_third_party_googletest_gtest__testing",
- "cronet_aml_third_party_icu_icui18n__testing",
- "cronet_aml_third_party_icu_icuuc_private__testing",
- "cronet_aml_third_party_libevent_libevent__testing",
- "cronet_aml_third_party_libxml_libxml__testing",
- "cronet_aml_third_party_libxml_libxml_utils__testing",
- "cronet_aml_third_party_libxml_xml_reader__testing",
- "cronet_aml_third_party_modp_b64_modp_b64__testing",
- ],
- generated_headers: [
- "cronet_aml_base_debugging_buildflags__testing",
- "cronet_aml_base_logging_buildflags__testing",
- "cronet_aml_base_test_base_unittests_jni_headers__testing",
- "cronet_aml_base_test_test_support_jni_headers__testing",
- "cronet_aml_build_chromeos_buildflags__testing",
- ],
- export_generated_headers: [
- "cronet_aml_base_debugging_buildflags__testing",
- "cronet_aml_base_logging_buildflags__testing",
- "cronet_aml_base_test_base_unittests_jni_headers__testing",
- "cronet_aml_base_test_test_support_jni_headers__testing",
- "cronet_aml_build_chromeos_buildflags__testing",
- ],
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DGTEST_API_=",
- "-DGTEST_HAS_ABSL=1",
- "-DGTEST_HAS_POSIX_RE=0",
- "-DGTEST_HAS_TR1_TUPLE=0",
- "-DGTEST_LANG_CXX11=1",
- "-DHAVE_SYS_UIO_H",
- "-DICU_UTIL_DATA_IMPL=ICU_UTIL_DATA_FILE",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-DUNIT_TEST",
- "-DUSE_CHROMIUM_ICU=1",
- "-DU_ENABLE_DYLOAD=0",
- "-DU_ENABLE_RESOURCE_TRACING=0",
- "-DU_ENABLE_TRACING=1",
- "-DU_STATIC_IMPLEMENTATION",
- "-DU_USING_ICU_NAMESPACE=0",
- "-D_FORTIFY_SOURCE=2",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D__STDC_CONSTANT_MACROS",
- "-D__STDC_FORMAT_MACROS",
- "-Oz",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "third_party/abseil-cpp/",
- "third_party/boringssl/src/include/",
- "third_party/ced/src/",
- "third_party/googletest/custom/",
- "third_party/googletest/src/googlemock/include/",
- "third_party/googletest/src/googletest/include/",
- "third_party/icu/source/common/",
- "third_party/icu/source/i18n/",
- "third_party/libxml/linux/include/",
- "third_party/libxml/src/include/",
- ],
- cpp_std: "c++17",
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- "-Wl,--script,external/cronet/base/android/library_loader/anchor_functions.lds",
- "-Wl,-wrap,asprintf",
- "-Wl,-wrap,calloc",
- "-Wl,-wrap,free",
- "-Wl,-wrap,getcwd",
- "-Wl,-wrap,malloc",
- "-Wl,-wrap,malloc_usable_size",
- "-Wl,-wrap,memalign",
- "-Wl,-wrap,posix_memalign",
- "-Wl,-wrap,pvalloc",
- "-Wl,-wrap,realloc",
- "-Wl,-wrap,realpath",
- "-Wl,-wrap,strdup",
- "-Wl,-wrap,strndup",
- "-Wl,-wrap,valloc",
- "-Wl,-wrap,vasprintf",
- ],
- target: {
- android_arm: {
- cflags: [
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-fstack-protector",
- "-msse3",
- ],
- },
- },
-}
-
-// GN: //base/test:test_support_jni_headers__testing
-cc_genrule {
- name: "cronet_aml_base_test_test_support_jni_headers__testing",
- srcs: [
- "base/test/android/java/src/org/chromium/base/MainReturnCodeResult.java",
- "base/test/android/java/src/org/chromium/base/MultiprocessTestClientLauncher.java",
- "base/test/android/javatests/src/org/chromium/base/test/ReachedCodeProfiler.java",
- "base/test/android/javatests/src/org/chromium/base/test/task/ThreadPoolTestHelpers.java",
- "base/test/android/javatests/src/org/chromium/base/test/util/UrlUtils.java",
- ],
- cmd: "$(location base/android/jni_generator/jni_generator.py) --ptr_type " +
- "long " +
- "--output_dir " +
- "$(genDir)/base/test/test_support_jni_headers " +
- "--includes " +
- "base/android/jni_generator/jni_generator_helper.h " +
- "--use_proxy_hash " +
- "--output_name " +
- "MainReturnCodeResult_jni.h " +
- "--output_name " +
- "MultiprocessTestClientLauncher_jni.h " +
- "--output_name " +
- "ReachedCodeProfiler_jni.h " +
- "--output_name " +
- "ThreadPoolTestHelpers_jni.h " +
- "--output_name " +
- "UrlUtils_jni.h " +
- "--input_file " +
- "$(location base/test/android/java/src/org/chromium/base/MainReturnCodeResult.java) " +
- "--input_file " +
- "$(location base/test/android/java/src/org/chromium/base/MultiprocessTestClientLauncher.java) " +
- "--input_file " +
- "$(location base/test/android/javatests/src/org/chromium/base/test/ReachedCodeProfiler.java) " +
- "--input_file " +
- "$(location base/test/android/javatests/src/org/chromium/base/test/task/ThreadPoolTestHelpers.java) " +
- "--input_file " +
- "$(location base/test/android/javatests/src/org/chromium/base/test/util/UrlUtils.java)",
- out: [
- "base/test/test_support_jni_headers/MainReturnCodeResult_jni.h",
- "base/test/test_support_jni_headers/MultiprocessTestClientLauncher_jni.h",
- "base/test/test_support_jni_headers/ReachedCodeProfiler_jni.h",
- "base/test/test_support_jni_headers/ThreadPoolTestHelpers_jni.h",
- "base/test/test_support_jni_headers/UrlUtils_jni.h",
- ],
- tool_files: [
- "base/android/jni_generator/android_jar.classes",
- "base/android/jni_generator/jni_generator.py",
- "build/android/gyp/util/__init__.py",
- "build/android/gyp/util/build_utils.py",
- "build/gn_helpers.py",
- ],
- apex_available: [
- "com.android.tethering",
- ],
-}
-
-// GN: //base/third_party/double_conversion:double_conversion
-cc_library_static {
- name: "cronet_aml_base_third_party_double_conversion_double_conversion",
- srcs: [
- "base/third_party/double_conversion/double-conversion/bignum-dtoa.cc",
- "base/third_party/double_conversion/double-conversion/bignum.cc",
- "base/third_party/double_conversion/double-conversion/cached-powers.cc",
- "base/third_party/double_conversion/double-conversion/double-to-string.cc",
- "base/third_party/double_conversion/double-conversion/fast-dtoa.cc",
- "base/third_party/double_conversion/double-conversion/fixed-dtoa.cc",
- "base/third_party/double_conversion/double-conversion/string-to-double.cc",
- "base/third_party/double_conversion/double-conversion/strtod.cc",
- ],
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DHAVE_SYS_UIO_H",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_FORTIFY_SOURCE=2",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D__STDC_CONSTANT_MACROS",
- "-D__STDC_FORMAT_MACROS",
- "-Oz",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- ],
- cpp_std: "c++17",
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- ],
- target: {
- android_arm: {
- cflags: [
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-fstack-protector",
- "-msse3",
- ],
- },
- },
-}
-
-// GN: //base/third_party/double_conversion:double_conversion__testing
-cc_library_static {
- name: "cronet_aml_base_third_party_double_conversion_double_conversion__testing",
- srcs: [
- "base/third_party/double_conversion/double-conversion/bignum-dtoa.cc",
- "base/third_party/double_conversion/double-conversion/bignum.cc",
- "base/third_party/double_conversion/double-conversion/cached-powers.cc",
- "base/third_party/double_conversion/double-conversion/double-to-string.cc",
- "base/third_party/double_conversion/double-conversion/fast-dtoa.cc",
- "base/third_party/double_conversion/double-conversion/fixed-dtoa.cc",
- "base/third_party/double_conversion/double-conversion/string-to-double.cc",
- "base/third_party/double_conversion/double-conversion/strtod.cc",
- ],
- host_supported: true,
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_FORTIFY_SOURCE=2",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D__STDC_CONSTANT_MACROS",
- "-D__STDC_FORMAT_MACROS",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- ],
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- ],
- target: {
- android_arm: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- "-msse3",
- ],
- },
- host: {
- cflags: [
- "-DCR_SYSROOT_KEY=20220331T153654Z-0",
- "-DUSE_AURA=1",
- "-DUSE_OZONE=1",
- "-DUSE_UDEV",
- "-D_FILE_OFFSET_BITS=64",
- "-D_LARGEFILE64_SOURCE",
- "-D_LARGEFILE_SOURCE",
- "-O2",
- "-fstack-protector",
- "-msse3",
- ],
- compile_multilib: "64",
- },
- },
-}
-
-// GN: //base/third_party/dynamic_annotations:dynamic_annotations
-cc_library_static {
- name: "cronet_aml_base_third_party_dynamic_annotations_dynamic_annotations",
- srcs: [
- "base/third_party/dynamic_annotations/dynamic_annotations.c",
- ],
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DHAVE_SYS_UIO_H",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-O2",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- ],
- cpp_std: "c++17",
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- ],
- target: {
- android_arm: {
- cflags: [
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-fstack-protector",
- "-msse3",
- ],
- },
- },
-}
-
-// GN: //base/third_party/dynamic_annotations:dynamic_annotations__testing
-cc_library_static {
- name: "cronet_aml_base_third_party_dynamic_annotations_dynamic_annotations__testing",
- srcs: [
- "base/third_party/dynamic_annotations/dynamic_annotations.c",
- ],
- host_supported: true,
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-O2",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- ],
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- ],
- target: {
- android_arm: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-fstack-protector",
- "-msse3",
- ],
- },
- host: {
- cflags: [
- "-DCR_SYSROOT_KEY=20220331T153654Z-0",
- "-DUSE_AURA=1",
- "-DUSE_OZONE=1",
- "-DUSE_UDEV",
- "-D_FILE_OFFSET_BITS=64",
- "-D_LARGEFILE64_SOURCE",
- "-D_LARGEFILE_SOURCE",
- "-fstack-protector",
- "-msse3",
- ],
- compile_multilib: "64",
- },
- },
-}
-
-// GN: //base:tracing_buildflags
-cc_genrule {
- name: "cronet_aml_base_tracing_buildflags",
- cmd: "echo '--flags ENABLE_BASE_TRACING=\"false\" USE_PERFETTO_CLIENT_LIBRARY=\"false\" OPTIONAL_TRACE_EVENTS_ENABLED=\"false\"' | " +
- "$(location build/write_buildflag_header.py) --output " +
- "$(out) " +
- "--rulename " +
- "//base:tracing_buildflags " +
- "--gen-dir " +
- ". " +
- "--definitions " +
- "/dev/stdin",
- out: [
- "base/tracing_buildflags.h",
- ],
- tool_files: [
- "build/write_buildflag_header.py",
- ],
- apex_available: [
- "com.android.tethering",
- ],
-}
-
-// GN: //base:tracing_buildflags__testing
-cc_genrule {
- name: "cronet_aml_base_tracing_buildflags__testing",
- cmd: "if [[ ( $$CC_ARCH == 'x86_64' && $$CC_OS == 'android' ) ]]; " +
- "then " +
- "echo '--flags ENABLE_BASE_TRACING=\"false\" USE_PERFETTO_CLIENT_LIBRARY=\"false\" OPTIONAL_TRACE_EVENTS_ENABLED=\"false\"' | " +
- "$(location build/write_buildflag_header.py) --output " +
- "$(out) " +
- "--rulename " +
- "//base:tracing_buildflags " +
- "--gen-dir " +
- ". " +
- "--definitions " +
- "/dev/stdin; " +
- "fi; " +
- "if [[ $$CC_OS != 'android' ]]; " +
- "then " +
- "echo '--flags ENABLE_BASE_TRACING=\"false\" USE_PERFETTO_CLIENT_LIBRARY=\"false\" OPTIONAL_TRACE_EVENTS_ENABLED=\"true\"' | " +
- "$(location build/write_buildflag_header.py) --output " +
- "$(out) " +
- "--rulename " +
- "//base:tracing_buildflags " +
- "--gen-dir " +
- ". " +
- "--definitions " +
- "/dev/stdin; " +
- "fi; " +
- "if [[ ( $$CC_ARCH == 'x86' && $$CC_OS == 'android' ) ]]; " +
- "then " +
- "echo '--flags ENABLE_BASE_TRACING=\"false\" USE_PERFETTO_CLIENT_LIBRARY=\"false\" OPTIONAL_TRACE_EVENTS_ENABLED=\"false\"' | " +
- "$(location build/write_buildflag_header.py) --output " +
- "$(out) " +
- "--rulename " +
- "//base:tracing_buildflags " +
- "--gen-dir " +
- ". " +
- "--definitions " +
- "/dev/stdin; " +
- "fi; " +
- "if [[ ( $$CC_ARCH == 'arm' && $$CC_OS == 'android' ) ]]; " +
- "then " +
- "echo '--flags ENABLE_BASE_TRACING=\"false\" USE_PERFETTO_CLIENT_LIBRARY=\"false\" OPTIONAL_TRACE_EVENTS_ENABLED=\"false\"' | " +
- "$(location build/write_buildflag_header.py) --output " +
- "$(out) " +
- "--rulename " +
- "//base:tracing_buildflags " +
- "--gen-dir " +
- ". " +
- "--definitions " +
- "/dev/stdin; " +
- "fi; " +
- "if [[ ( $$CC_ARCH == 'arm64' && $$CC_OS == 'android' ) ]]; " +
- "then " +
- "echo '--flags ENABLE_BASE_TRACING=\"false\" USE_PERFETTO_CLIENT_LIBRARY=\"false\" OPTIONAL_TRACE_EVENTS_ENABLED=\"false\"' | " +
- "$(location build/write_buildflag_header.py) --output " +
- "$(out) " +
- "--rulename " +
- "//base:tracing_buildflags " +
- "--gen-dir " +
- ". " +
- "--definitions " +
- "/dev/stdin; " +
- "fi;",
- host_supported: true,
- out: [
- "base/tracing_buildflags.h",
- ],
- tool_files: [
- "build/write_buildflag_header.py",
- ],
- apex_available: [
- "com.android.tethering",
- ],
-}
-
-// GN: //build/android:build_config_gen
-genrule {
- name: "cronet_aml_build_android_build_config_gen",
- srcs: [
- ":cronet_aml_build_android_build_config_gen_preprocess",
- ],
- tools: [
- "soong_zip",
- ],
- cmd: "cp $(in) $(genDir)/BuildConfig.java && " +
- "$(location soong_zip) -o $(out) -srcjar -C $(genDir) -f $(genDir)/BuildConfig.java",
- out: [
- "BuildConfig.srcjar",
- ],
-}
-
-// GN: //build/android:build_config_gen
-cc_object {
- name: "cronet_aml_build_android_build_config_gen_preprocess",
- srcs: [
- ":cronet_aml_build_android_build_config_gen_rename",
- ],
- cflags: [
- "-DANDROID",
- "-E",
- "-P",
- ],
- compile_multilib: "first",
-}
-
-// GN: //build/android:build_config_gen
-genrule {
- name: "cronet_aml_build_android_build_config_gen_rename",
- srcs: [
- "build/android/java/templates/BuildConfig.template",
- ],
- cmd: "cp $(in) $(out)",
- out: [
- "BuildConfig.cc",
- ],
-}
-
-// GN: //build/android:native_libraries_gen
-java_genrule {
- name: "cronet_aml_build_android_native_libraries_gen",
- cmd: "$(location build/android/gyp/write_native_libraries_java.py) --output " +
- "$(out) " +
- "--cpu-family " +
- "CPU_FAMILY_ARM",
- out: [
- "build/android/native_libraries_gen.srcjar",
- ],
- tool_files: [
- "build/android/gyp/util/__init__.py",
- "build/android/gyp/util/build_utils.py",
- "build/android/gyp/write_native_libraries_java.py",
- "build/gn_helpers.py",
- ],
-}
-
-// GN: //build:branding_buildflags
-cc_genrule {
- name: "cronet_aml_build_branding_buildflags",
- cmd: "echo '--flags CHROMIUM_BRANDING=\"1\" GOOGLE_CHROME_BRANDING=\"0\"' | " +
- "$(location build/write_buildflag_header.py) --output " +
- "$(out) " +
- "--rulename " +
- "//build:branding_buildflags " +
- "--gen-dir " +
- ". " +
- "--definitions " +
- "/dev/stdin",
- out: [
- "build/branding_buildflags.h",
- ],
- tool_files: [
- "build/write_buildflag_header.py",
- ],
- apex_available: [
- "com.android.tethering",
- ],
-}
-
-// GN: //build:branding_buildflags__testing
-cc_genrule {
- name: "cronet_aml_build_branding_buildflags__testing",
- cmd: "echo '--flags CHROMIUM_BRANDING=\"1\" GOOGLE_CHROME_BRANDING=\"0\"' | " +
- "$(location build/write_buildflag_header.py) --output " +
- "$(out) " +
- "--rulename " +
- "//build:branding_buildflags " +
- "--gen-dir " +
- ". " +
- "--definitions " +
- "/dev/stdin",
- host_supported: true,
- out: [
- "build/branding_buildflags.h",
- ],
- tool_files: [
- "build/write_buildflag_header.py",
- ],
- apex_available: [
- "com.android.tethering",
- ],
-}
-
-// GN: //build:chromecast_buildflags
-cc_genrule {
- name: "cronet_aml_build_chromecast_buildflags",
- cmd: "echo '--flags IS_CASTOS=\"false\" IS_CAST_ANDROID=\"false\" ENABLE_CAST_RECEIVER=\"false\" IS_CHROMECAST=\"false\"' | " +
- "$(location build/write_buildflag_header.py) --output " +
- "$(out) " +
- "--rulename " +
- "//build:chromecast_buildflags " +
- "--gen-dir " +
- ". " +
- "--definitions " +
- "/dev/stdin",
- out: [
- "build/chromecast_buildflags.h",
- ],
- tool_files: [
- "build/write_buildflag_header.py",
- ],
- apex_available: [
- "com.android.tethering",
- ],
-}
-
-// GN: //build:chromecast_buildflags__testing
-cc_genrule {
- name: "cronet_aml_build_chromecast_buildflags__testing",
- cmd: "echo '--flags IS_CASTOS=\"false\" IS_CAST_ANDROID=\"false\" ENABLE_CAST_RECEIVER=\"false\" IS_CHROMECAST=\"false\"' | " +
- "$(location build/write_buildflag_header.py) --output " +
- "$(out) " +
- "--rulename " +
- "//build:chromecast_buildflags " +
- "--gen-dir " +
- ". " +
- "--definitions " +
- "/dev/stdin",
- host_supported: true,
- out: [
- "build/chromecast_buildflags.h",
- ],
- tool_files: [
- "build/write_buildflag_header.py",
- ],
- apex_available: [
- "com.android.tethering",
- ],
-}
-
-// GN: //build:chromeos_buildflags
-cc_genrule {
- name: "cronet_aml_build_chromeos_buildflags",
- cmd: "echo '--flags IS_CHROMEOS_DEVICE=\"false\" IS_CHROMEOS_LACROS=\"false\" IS_CHROMEOS_ASH=\"false\" IS_CHROMEOS_WITH_HW_DETAILS=\"false\" IS_REVEN=\"false\"' | " +
- "$(location build/write_buildflag_header.py) --output " +
- "$(out) " +
- "--rulename " +
- "//build:chromeos_buildflags " +
- "--gen-dir " +
- ". " +
- "--definitions " +
- "/dev/stdin",
- out: [
- "build/chromeos_buildflags.h",
- ],
- tool_files: [
- "build/write_buildflag_header.py",
- ],
- apex_available: [
- "com.android.tethering",
- ],
-}
-
-// GN: //build:chromeos_buildflags__testing
-cc_genrule {
- name: "cronet_aml_build_chromeos_buildflags__testing",
- cmd: "echo '--flags IS_CHROMEOS_DEVICE=\"false\" IS_CHROMEOS_LACROS=\"false\" IS_CHROMEOS_ASH=\"false\" IS_CHROMEOS_WITH_HW_DETAILS=\"false\" IS_REVEN=\"false\"' | " +
- "$(location build/write_buildflag_header.py) --output " +
- "$(out) " +
- "--rulename " +
- "//build:chromeos_buildflags " +
- "--gen-dir " +
- ". " +
- "--definitions " +
- "/dev/stdin",
- host_supported: true,
- out: [
- "build/chromeos_buildflags.h",
- ],
- tool_files: [
- "build/write_buildflag_header.py",
- ],
- apex_available: [
- "com.android.tethering",
- ],
-}
-
-// GN: //build/config/compiler:compiler_buildflags
-cc_genrule {
- name: "cronet_aml_build_config_compiler_compiler_buildflags",
- cmd: "echo '--flags CLANG_PGO=\"0\" SYMBOL_LEVEL=\"1\"' | " +
- "$(location build/write_buildflag_header.py) --output " +
- "$(out) " +
- "--rulename " +
- "//build/config/compiler:compiler_buildflags " +
- "--gen-dir " +
- ". " +
- "--definitions " +
- "/dev/stdin",
- out: [
- "build/config/compiler/compiler_buildflags.h",
- ],
- tool_files: [
- "build/write_buildflag_header.py",
- ],
- apex_available: [
- "com.android.tethering",
- ],
-}
-
-// GN: //build/config/compiler:compiler_buildflags__testing
-cc_genrule {
- name: "cronet_aml_build_config_compiler_compiler_buildflags__testing",
- cmd: "if [[ ( $$CC_ARCH == 'x86_64' && $$CC_OS == 'android' ) ]]; " +
- "then " +
- "echo '--flags CLANG_PGO=\"0\" SYMBOL_LEVEL=\"1\"' | " +
- "$(location build/write_buildflag_header.py) --output " +
- "$(out) " +
- "--rulename " +
- "//build/config/compiler:compiler_buildflags " +
- "--gen-dir " +
- ". " +
- "--definitions " +
- "/dev/stdin; " +
- "fi; " +
- "if [[ $$CC_OS != 'android' ]]; " +
- "then " +
- "echo '--flags CLANG_PGO=\"2\" SYMBOL_LEVEL=\"1\"' | " +
- "$(location build/write_buildflag_header.py) --output " +
- "$(out) " +
- "--rulename " +
- "//build/config/compiler:compiler_buildflags " +
- "--gen-dir " +
- ". " +
- "--definitions " +
- "/dev/stdin; " +
- "fi; " +
- "if [[ ( $$CC_ARCH == 'x86' && $$CC_OS == 'android' ) ]]; " +
- "then " +
- "echo '--flags CLANG_PGO=\"0\" SYMBOL_LEVEL=\"1\"' | " +
- "$(location build/write_buildflag_header.py) --output " +
- "$(out) " +
- "--rulename " +
- "//build/config/compiler:compiler_buildflags " +
- "--gen-dir " +
- ". " +
- "--definitions " +
- "/dev/stdin; " +
- "fi; " +
- "if [[ ( $$CC_ARCH == 'arm' && $$CC_OS == 'android' ) ]]; " +
- "then " +
- "echo '--flags CLANG_PGO=\"0\" SYMBOL_LEVEL=\"1\"' | " +
- "$(location build/write_buildflag_header.py) --output " +
- "$(out) " +
- "--rulename " +
- "//build/config/compiler:compiler_buildflags " +
- "--gen-dir " +
- ". " +
- "--definitions " +
- "/dev/stdin; " +
- "fi; " +
- "if [[ ( $$CC_ARCH == 'arm64' && $$CC_OS == 'android' ) ]]; " +
- "then " +
- "echo '--flags CLANG_PGO=\"0\" SYMBOL_LEVEL=\"1\"' | " +
- "$(location build/write_buildflag_header.py) --output " +
- "$(out) " +
- "--rulename " +
- "//build/config/compiler:compiler_buildflags " +
- "--gen-dir " +
- ". " +
- "--definitions " +
- "/dev/stdin; " +
- "fi;",
- host_supported: true,
- out: [
- "build/config/compiler/compiler_buildflags.h",
- ],
- tool_files: [
- "build/write_buildflag_header.py",
- ],
- apex_available: [
- "com.android.tethering",
- ],
-}
-
-// GN: //buildtools/third_party/libc++:libc++
-cc_library_static {
- name: "cronet_aml_buildtools_third_party_libc___libc__",
- srcs: [
- "buildtools/third_party/libc++/trunk/src/algorithm.cpp",
- "buildtools/third_party/libc++/trunk/src/any.cpp",
- "buildtools/third_party/libc++/trunk/src/atomic.cpp",
- "buildtools/third_party/libc++/trunk/src/barrier.cpp",
- "buildtools/third_party/libc++/trunk/src/bind.cpp",
- "buildtools/third_party/libc++/trunk/src/charconv.cpp",
- "buildtools/third_party/libc++/trunk/src/chrono.cpp",
- "buildtools/third_party/libc++/trunk/src/condition_variable.cpp",
- "buildtools/third_party/libc++/trunk/src/condition_variable_destructor.cpp",
- "buildtools/third_party/libc++/trunk/src/exception.cpp",
- "buildtools/third_party/libc++/trunk/src/format.cpp",
- "buildtools/third_party/libc++/trunk/src/functional.cpp",
- "buildtools/third_party/libc++/trunk/src/future.cpp",
- "buildtools/third_party/libc++/trunk/src/hash.cpp",
- "buildtools/third_party/libc++/trunk/src/ios.cpp",
- "buildtools/third_party/libc++/trunk/src/ios.instantiations.cpp",
- "buildtools/third_party/libc++/trunk/src/iostream.cpp",
- "buildtools/third_party/libc++/trunk/src/legacy_pointer_safety.cpp",
- "buildtools/third_party/libc++/trunk/src/locale.cpp",
- "buildtools/third_party/libc++/trunk/src/memory.cpp",
- "buildtools/third_party/libc++/trunk/src/mutex.cpp",
- "buildtools/third_party/libc++/trunk/src/mutex_destructor.cpp",
- "buildtools/third_party/libc++/trunk/src/new.cpp",
- "buildtools/third_party/libc++/trunk/src/optional.cpp",
- "buildtools/third_party/libc++/trunk/src/random.cpp",
- "buildtools/third_party/libc++/trunk/src/random_shuffle.cpp",
- "buildtools/third_party/libc++/trunk/src/regex.cpp",
- "buildtools/third_party/libc++/trunk/src/ryu/d2fixed.cpp",
- "buildtools/third_party/libc++/trunk/src/ryu/d2s.cpp",
- "buildtools/third_party/libc++/trunk/src/ryu/f2s.cpp",
- "buildtools/third_party/libc++/trunk/src/shared_mutex.cpp",
- "buildtools/third_party/libc++/trunk/src/stdexcept.cpp",
- "buildtools/third_party/libc++/trunk/src/string.cpp",
- "buildtools/third_party/libc++/trunk/src/strstream.cpp",
- "buildtools/third_party/libc++/trunk/src/system_error.cpp",
- "buildtools/third_party/libc++/trunk/src/thread.cpp",
- "buildtools/third_party/libc++/trunk/src/typeinfo.cpp",
- "buildtools/third_party/libc++/trunk/src/utility.cpp",
- "buildtools/third_party/libc++/trunk/src/valarray.cpp",
- "buildtools/third_party/libc++/trunk/src/variant.cpp",
- "buildtools/third_party/libc++/trunk/src/vector.cpp",
- "buildtools/third_party/libc++/trunk/src/verbose_abort.cpp",
- ],
- static_libs: [
- "cronet_aml_buildtools_third_party_libc__abi_libc__abi",
- ],
- host_supported: true,
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DLIBCXX_BUILDING_LIBCXXABI",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_AVAILABILITY_CUSTOM_VERBOSE_ABORT_PROVIDED=1",
- "-D_LIBCPP_BUILDING_LIBRARY",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCPP_OVERRIDABLE_FUNC_VIS=__attribute__((__visibility__(\"default\")))",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++/trunk/src/",
- "buildtools/third_party/libc++abi/trunk/include",
- ],
- cpp_std: "c++20",
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- ],
- cppflags: [
- "-fexceptions",
- ],
- rtti: true,
- target: {
- android_arm: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- "-msse3",
- ],
- },
- host: {
- cflags: [
- "-DCR_SYSROOT_KEY=20220331T153654Z-0",
- "-DUSE_AURA=1",
- "-DUSE_OZONE=1",
- "-DUSE_UDEV",
- "-D_FILE_OFFSET_BITS=64",
- "-D_LARGEFILE64_SOURCE",
- "-D_LARGEFILE_SOURCE",
- "-O2",
- "-fstack-protector",
- "-msse3",
- ],
- compile_multilib: "64",
- },
- },
-}
-
-// GN: //buildtools/third_party/libc++:libc++__testing
-cc_library_static {
- name: "cronet_aml_buildtools_third_party_libc___libc____testing",
- srcs: [
- "buildtools/third_party/libc++/trunk/src/algorithm.cpp",
- "buildtools/third_party/libc++/trunk/src/any.cpp",
- "buildtools/third_party/libc++/trunk/src/atomic.cpp",
- "buildtools/third_party/libc++/trunk/src/barrier.cpp",
- "buildtools/third_party/libc++/trunk/src/bind.cpp",
- "buildtools/third_party/libc++/trunk/src/charconv.cpp",
- "buildtools/third_party/libc++/trunk/src/chrono.cpp",
- "buildtools/third_party/libc++/trunk/src/condition_variable.cpp",
- "buildtools/third_party/libc++/trunk/src/condition_variable_destructor.cpp",
- "buildtools/third_party/libc++/trunk/src/exception.cpp",
- "buildtools/third_party/libc++/trunk/src/format.cpp",
- "buildtools/third_party/libc++/trunk/src/functional.cpp",
- "buildtools/third_party/libc++/trunk/src/future.cpp",
- "buildtools/third_party/libc++/trunk/src/hash.cpp",
- "buildtools/third_party/libc++/trunk/src/ios.cpp",
- "buildtools/third_party/libc++/trunk/src/ios.instantiations.cpp",
- "buildtools/third_party/libc++/trunk/src/iostream.cpp",
- "buildtools/third_party/libc++/trunk/src/legacy_pointer_safety.cpp",
- "buildtools/third_party/libc++/trunk/src/locale.cpp",
- "buildtools/third_party/libc++/trunk/src/memory.cpp",
- "buildtools/third_party/libc++/trunk/src/mutex.cpp",
- "buildtools/third_party/libc++/trunk/src/mutex_destructor.cpp",
- "buildtools/third_party/libc++/trunk/src/new.cpp",
- "buildtools/third_party/libc++/trunk/src/optional.cpp",
- "buildtools/third_party/libc++/trunk/src/random.cpp",
- "buildtools/third_party/libc++/trunk/src/random_shuffle.cpp",
- "buildtools/third_party/libc++/trunk/src/regex.cpp",
- "buildtools/third_party/libc++/trunk/src/ryu/d2fixed.cpp",
- "buildtools/third_party/libc++/trunk/src/ryu/d2s.cpp",
- "buildtools/third_party/libc++/trunk/src/ryu/f2s.cpp",
- "buildtools/third_party/libc++/trunk/src/shared_mutex.cpp",
- "buildtools/third_party/libc++/trunk/src/stdexcept.cpp",
- "buildtools/third_party/libc++/trunk/src/string.cpp",
- "buildtools/third_party/libc++/trunk/src/strstream.cpp",
- "buildtools/third_party/libc++/trunk/src/system_error.cpp",
- "buildtools/third_party/libc++/trunk/src/thread.cpp",
- "buildtools/third_party/libc++/trunk/src/typeinfo.cpp",
- "buildtools/third_party/libc++/trunk/src/utility.cpp",
- "buildtools/third_party/libc++/trunk/src/valarray.cpp",
- "buildtools/third_party/libc++/trunk/src/variant.cpp",
- "buildtools/third_party/libc++/trunk/src/vector.cpp",
- "buildtools/third_party/libc++/trunk/src/verbose_abort.cpp",
- ],
- static_libs: [
- "cronet_aml_buildtools_third_party_libc__abi_libc__abi__testing",
- ],
- host_supported: true,
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DLIBCXX_BUILDING_LIBCXXABI",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_AVAILABILITY_CUSTOM_VERBOSE_ABORT_PROVIDED=1",
- "-D_LIBCPP_BUILDING_LIBRARY",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCPP_OVERRIDABLE_FUNC_VIS=__attribute__((__visibility__(\"default\")))",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++/trunk/src/",
- "buildtools/third_party/libc++abi/trunk/include",
- ],
- cpp_std: "c++20",
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- ],
- cppflags: [
- "-fexceptions",
- ],
- rtti: true,
- target: {
- android_arm: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- "-msse3",
- ],
- },
- host: {
- cflags: [
- "-DCR_SYSROOT_KEY=20220331T153654Z-0",
- "-DUSE_AURA=1",
- "-DUSE_OZONE=1",
- "-DUSE_UDEV",
- "-D_FILE_OFFSET_BITS=64",
- "-D_LARGEFILE64_SOURCE",
- "-D_LARGEFILE_SOURCE",
- "-O2",
- "-fstack-protector",
- "-msse3",
- ],
- compile_multilib: "64",
- },
- },
-}
-
-// GN: //buildtools/third_party/libc++abi:libc++abi
-cc_library_static {
- name: "cronet_aml_buildtools_third_party_libc__abi_libc__abi",
- srcs: [
- "buildtools/third_party/libc++abi/trunk/src/abort_message.cpp",
- "buildtools/third_party/libc++abi/trunk/src/cxa_aux_runtime.cpp",
- "buildtools/third_party/libc++abi/trunk/src/cxa_default_handlers.cpp",
- "buildtools/third_party/libc++abi/trunk/src/cxa_exception.cpp",
- "buildtools/third_party/libc++abi/trunk/src/cxa_exception_storage.cpp",
- "buildtools/third_party/libc++abi/trunk/src/cxa_guard.cpp",
- "buildtools/third_party/libc++abi/trunk/src/cxa_handlers.cpp",
- "buildtools/third_party/libc++abi/trunk/src/cxa_personality.cpp",
- "buildtools/third_party/libc++abi/trunk/src/cxa_thread_atexit.cpp",
- "buildtools/third_party/libc++abi/trunk/src/cxa_vector.cpp",
- "buildtools/third_party/libc++abi/trunk/src/cxa_virtual.cpp",
- "buildtools/third_party/libc++abi/trunk/src/fallback_malloc.cpp",
- "buildtools/third_party/libc++abi/trunk/src/private_typeinfo.cpp",
- "buildtools/third_party/libc++abi/trunk/src/stdlib_exception.cpp",
- "buildtools/third_party/libc++abi/trunk/src/stdlib_stdexcept.cpp",
- "buildtools/third_party/libc++abi/trunk/src/stdlib_typeinfo.cpp",
- ],
- host_supported: true,
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DLIBCXXABI_SILENT_TERMINATE",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_BUILDING_LIBRARY",
- "-D_LIBCPP_CONSTINIT=constinit",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++/trunk/src/",
- "buildtools/third_party/libc++abi/trunk/include",
- ],
- cpp_std: "c++20",
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- ],
- cppflags: [
- "-fexceptions",
- ],
- rtti: true,
- target: {
- android_arm: {
- srcs: [
- "buildtools/third_party/libc++abi/cxa_demangle_stub.cc",
- ],
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- ],
- },
- android_arm64: {
- srcs: [
- "buildtools/third_party/libc++abi/cxa_demangle_stub.cc",
- ],
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- srcs: [
- "buildtools/third_party/libc++abi/cxa_demangle_stub.cc",
- ],
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-msse3",
- ],
- },
- android_x86_64: {
- srcs: [
- "buildtools/third_party/libc++abi/cxa_demangle_stub.cc",
- ],
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- "-msse3",
- ],
- },
- host: {
- srcs: [
- "buildtools/third_party/libc++abi/trunk/src/cxa_demangle.cpp",
- ],
- cflags: [
- "-DCR_SYSROOT_KEY=20220331T153654Z-0",
- "-DUSE_AURA=1",
- "-DUSE_OZONE=1",
- "-DUSE_UDEV",
- "-D_FILE_OFFSET_BITS=64",
- "-D_LARGEFILE64_SOURCE",
- "-D_LARGEFILE_SOURCE",
- "-O2",
- "-fstack-protector",
- "-msse3",
- ],
- compile_multilib: "64",
- },
- },
-}
-
-// GN: //buildtools/third_party/libc++abi:libc++abi__testing
-cc_library_static {
- name: "cronet_aml_buildtools_third_party_libc__abi_libc__abi__testing",
- srcs: [
- "buildtools/third_party/libc++abi/trunk/src/abort_message.cpp",
- "buildtools/third_party/libc++abi/trunk/src/cxa_aux_runtime.cpp",
- "buildtools/third_party/libc++abi/trunk/src/cxa_default_handlers.cpp",
- "buildtools/third_party/libc++abi/trunk/src/cxa_exception.cpp",
- "buildtools/third_party/libc++abi/trunk/src/cxa_exception_storage.cpp",
- "buildtools/third_party/libc++abi/trunk/src/cxa_guard.cpp",
- "buildtools/third_party/libc++abi/trunk/src/cxa_handlers.cpp",
- "buildtools/third_party/libc++abi/trunk/src/cxa_personality.cpp",
- "buildtools/third_party/libc++abi/trunk/src/cxa_thread_atexit.cpp",
- "buildtools/third_party/libc++abi/trunk/src/cxa_vector.cpp",
- "buildtools/third_party/libc++abi/trunk/src/cxa_virtual.cpp",
- "buildtools/third_party/libc++abi/trunk/src/fallback_malloc.cpp",
- "buildtools/third_party/libc++abi/trunk/src/private_typeinfo.cpp",
- "buildtools/third_party/libc++abi/trunk/src/stdlib_exception.cpp",
- "buildtools/third_party/libc++abi/trunk/src/stdlib_stdexcept.cpp",
- "buildtools/third_party/libc++abi/trunk/src/stdlib_typeinfo.cpp",
- ],
- host_supported: true,
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DLIBCXXABI_SILENT_TERMINATE",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_BUILDING_LIBRARY",
- "-D_LIBCPP_CONSTINIT=constinit",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++/trunk/src/",
- "buildtools/third_party/libc++abi/trunk/include",
- ],
- cpp_std: "c++20",
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- ],
- cppflags: [
- "-fexceptions",
- ],
- rtti: true,
- target: {
- android_arm: {
- srcs: [
- "buildtools/third_party/libc++abi/cxa_demangle_stub.cc",
- ],
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- ],
- },
- android_arm64: {
- srcs: [
- "buildtools/third_party/libc++abi/cxa_demangle_stub.cc",
- ],
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- srcs: [
- "buildtools/third_party/libc++abi/cxa_demangle_stub.cc",
- ],
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-msse3",
- ],
- },
- android_x86_64: {
- srcs: [
- "buildtools/third_party/libc++abi/cxa_demangle_stub.cc",
- ],
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- "-msse3",
- ],
- },
- host: {
- srcs: [
- "buildtools/third_party/libc++abi/trunk/src/cxa_demangle.cpp",
- ],
- cflags: [
- "-DCR_SYSROOT_KEY=20220331T153654Z-0",
- "-DUSE_AURA=1",
- "-DUSE_OZONE=1",
- "-DUSE_UDEV",
- "-D_FILE_OFFSET_BITS=64",
- "-D_LARGEFILE64_SOURCE",
- "-D_LARGEFILE_SOURCE",
- "-O2",
- "-fstack-protector",
- "-msse3",
- ],
- compile_multilib: "64",
- },
- },
-}
-
-// GN: //components/cronet/android:buildflags
-cc_genrule {
- name: "cronet_aml_components_cronet_android_buildflags",
- cmd: "echo '--flags INTEGRATED_MODE=\"false\"' | " +
- "$(location build/write_buildflag_header.py) --output " +
- "$(out) " +
- "--rulename " +
- "//components/cronet/android:buildflags " +
- "--gen-dir " +
- ". " +
- "--definitions " +
- "/dev/stdin",
- out: [
- "components/cronet/android/buildflags.h",
- ],
- tool_files: [
- "build/write_buildflag_header.py",
- ],
- apex_available: [
- "com.android.tethering",
- ],
-}
-
-// GN: //components/cronet/android:buildflags__testing
-cc_genrule {
- name: "cronet_aml_components_cronet_android_buildflags__testing",
- cmd: "echo '--flags INTEGRATED_MODE=\"false\"' | " +
- "$(location build/write_buildflag_header.py) --output " +
- "$(out) " +
- "--rulename " +
- "//components/cronet/android:buildflags " +
- "--gen-dir " +
- ". " +
- "--definitions " +
- "/dev/stdin",
- out: [
- "components/cronet/android/buildflags.h",
- ],
- tool_files: [
- "build/write_buildflag_header.py",
- ],
- apex_available: [
- "com.android.tethering",
- ],
-}
-
-// GN: //components/cronet/android:cronet
-cc_library_shared {
- name: "cronet_aml_components_cronet_android_cronet",
- srcs: [
- "components/cronet/android/cronet_jni.cc",
- ],
- shared_libs: [
- "libandroid",
- "liblog",
- "libz",
- ],
- static_libs: [
- "cronet_aml_base_allocator_partition_allocator_partition_alloc",
- "cronet_aml_base_base",
- "cronet_aml_base_base_static",
- "cronet_aml_base_nodebug_assertion",
- "cronet_aml_base_third_party_double_conversion_double_conversion",
- "cronet_aml_base_third_party_dynamic_annotations_dynamic_annotations",
- "cronet_aml_buildtools_third_party_libc___libc__",
- "cronet_aml_buildtools_third_party_libc__abi_libc__abi",
- "cronet_aml_components_cronet_android_cronet_static",
- "cronet_aml_components_cronet_cronet_common",
- "cronet_aml_components_cronet_cronet_version_header",
- "cronet_aml_components_cronet_metrics_util",
- "cronet_aml_components_metrics_library_support",
- "cronet_aml_components_prefs_prefs",
- "cronet_aml_crypto_crypto",
- "cronet_aml_net_dns_dns",
- "cronet_aml_net_dns_public_public",
- "cronet_aml_net_http_transport_security_state_generated_files",
- "cronet_aml_net_net",
- "cronet_aml_net_net_deps",
- "cronet_aml_net_net_public_deps",
- "cronet_aml_net_preload_decoder",
- "cronet_aml_net_third_party_quiche_quiche",
- "cronet_aml_net_traffic_annotation_traffic_annotation",
- "cronet_aml_net_uri_template",
- "cronet_aml_third_party_abseil_cpp_absl_base_base",
- "cronet_aml_third_party_abseil_cpp_absl_base_log_severity",
- "cronet_aml_third_party_abseil_cpp_absl_base_malloc_internal",
- "cronet_aml_third_party_abseil_cpp_absl_base_raw_logging_internal",
- "cronet_aml_third_party_abseil_cpp_absl_base_spinlock_wait",
- "cronet_aml_third_party_abseil_cpp_absl_base_strerror",
- "cronet_aml_third_party_abseil_cpp_absl_base_throw_delegate",
- "cronet_aml_third_party_abseil_cpp_absl_container_hashtablez_sampler",
- "cronet_aml_third_party_abseil_cpp_absl_container_raw_hash_set",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_debugging_internal",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_demangle_internal",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_examine_stack",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_failure_signal_handler",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_stacktrace",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_symbolize",
- "cronet_aml_third_party_abseil_cpp_absl_hash_city",
- "cronet_aml_third_party_abseil_cpp_absl_hash_hash",
- "cronet_aml_third_party_abseil_cpp_absl_hash_low_level_hash",
- "cronet_aml_third_party_abseil_cpp_absl_numeric_int128",
- "cronet_aml_third_party_abseil_cpp_absl_profiling_exponential_biased",
- "cronet_aml_third_party_abseil_cpp_absl_random_distributions",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_platform",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_pool_urbg",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_hwaes",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_hwaes_impl",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_slow",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_seed_material",
- "cronet_aml_third_party_abseil_cpp_absl_random_seed_gen_exception",
- "cronet_aml_third_party_abseil_cpp_absl_random_seed_sequences",
- "cronet_aml_third_party_abseil_cpp_absl_status_status",
- "cronet_aml_third_party_abseil_cpp_absl_status_statusor",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cord",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cord_internal",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_functions",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_handle",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_info",
- "cronet_aml_third_party_abseil_cpp_absl_strings_internal",
- "cronet_aml_third_party_abseil_cpp_absl_strings_str_format_internal",
- "cronet_aml_third_party_abseil_cpp_absl_strings_strings",
- "cronet_aml_third_party_abseil_cpp_absl_synchronization_graphcycles_internal",
- "cronet_aml_third_party_abseil_cpp_absl_synchronization_synchronization",
- "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_civil_time",
- "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_time_zone",
- "cronet_aml_third_party_abseil_cpp_absl_time_time",
- "cronet_aml_third_party_abseil_cpp_absl_types_bad_optional_access",
- "cronet_aml_third_party_abseil_cpp_absl_types_bad_variant_access",
- "cronet_aml_third_party_android_ndk_cpu_features",
- "cronet_aml_third_party_ashmem_ashmem",
- "cronet_aml_third_party_boringssl_boringssl",
- "cronet_aml_third_party_boringssl_boringssl_asm",
- "cronet_aml_third_party_brotli_common",
- "cronet_aml_third_party_brotli_dec",
- "cronet_aml_third_party_icu_icui18n",
- "cronet_aml_third_party_icu_icuuc_private",
- "cronet_aml_third_party_libevent_libevent",
- "cronet_aml_third_party_modp_b64_modp_b64",
- "cronet_aml_third_party_protobuf_protobuf_lite",
- "cronet_aml_url_url",
- ],
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DGOOGLE_PROTOBUF_INTERNAL_DONATE_STEAL_INLINE=0",
- "-DGOOGLE_PROTOBUF_NO_RTTI",
- "-DGOOGLE_PROTOBUF_NO_STATIC_INITIALIZER",
- "-DHAVE_PTHREAD",
- "-DHAVE_SYS_UIO_H",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_FORTIFY_SOURCE=2",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D__STDC_CONSTANT_MACROS",
- "-D__STDC_FORMAT_MACROS",
- "-Oz",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "net/third_party/quiche/overrides/",
- "net/third_party/quiche/src/",
- "net/third_party/quiche/src/quiche/common/platform/default/",
- "third_party/abseil-cpp/",
- "third_party/boringssl/src/include/",
- "third_party/protobuf/src/",
- ],
- cpp_std: "c++17",
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- "-Wl,--script,external/cronet/base/android/library_loader/anchor_functions.lds",
- "-Wl,-wrap,asprintf",
- "-Wl,-wrap,calloc",
- "-Wl,-wrap,free",
- "-Wl,-wrap,getcwd",
- "-Wl,-wrap,malloc",
- "-Wl,-wrap,malloc_usable_size",
- "-Wl,-wrap,memalign",
- "-Wl,-wrap,posix_memalign",
- "-Wl,-wrap,pvalloc",
- "-Wl,-wrap,realloc",
- "-Wl,-wrap,realpath",
- "-Wl,-wrap,strdup",
- "-Wl,-wrap,strndup",
- "-Wl,-wrap,valloc",
- "-Wl,-wrap,vasprintf",
- ],
- stem: "libcronet.108.0.5359.128",
- target: {
- android_arm: {
- cflags: [
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-fstack-protector",
- "-msse3",
- ],
- },
- },
-}
-
-// GN: //components/cronet/android:cronet_jni_headers
-cc_genrule {
- name: "cronet_aml_components_cronet_android_cronet_jni_headers",
- srcs: [
- "components/cronet/android/java/src/org/chromium/net/impl/CronetBidirectionalStream.java",
- "components/cronet/android/java/src/org/chromium/net/impl/CronetLibraryLoader.java",
- "components/cronet/android/java/src/org/chromium/net/impl/CronetUploadDataStream.java",
- "components/cronet/android/java/src/org/chromium/net/impl/CronetUrlRequest.java",
- "components/cronet/android/java/src/org/chromium/net/impl/CronetUrlRequestContext.java",
- ],
- cmd: "$(location base/android/jni_generator/jni_generator.py) --ptr_type " +
- "long " +
- "--output_dir " +
- "$(genDir)/components/cronet/android/cronet_jni_headers " +
- "--includes " +
- "base/android/jni_generator/jni_generator_helper.h " +
- "--use_proxy_hash " +
- "--output_name " +
- "CronetBidirectionalStream_jni.h " +
- "--output_name " +
- "CronetLibraryLoader_jni.h " +
- "--output_name " +
- "CronetUploadDataStream_jni.h " +
- "--output_name " +
- "CronetUrlRequest_jni.h " +
- "--output_name " +
- "CronetUrlRequestContext_jni.h " +
- "--input_file " +
- "$(location components/cronet/android/java/src/org/chromium/net/impl/CronetBidirectionalStream.java) " +
- "--input_file " +
- "$(location components/cronet/android/java/src/org/chromium/net/impl/CronetLibraryLoader.java) " +
- "--input_file " +
- "$(location components/cronet/android/java/src/org/chromium/net/impl/CronetUploadDataStream.java) " +
- "--input_file " +
- "$(location components/cronet/android/java/src/org/chromium/net/impl/CronetUrlRequest.java) " +
- "--input_file " +
- "$(location components/cronet/android/java/src/org/chromium/net/impl/CronetUrlRequestContext.java) " +
- "--package_prefix " +
- "android.net.http.internal",
- out: [
- "components/cronet/android/cronet_jni_headers/CronetBidirectionalStream_jni.h",
- "components/cronet/android/cronet_jni_headers/CronetLibraryLoader_jni.h",
- "components/cronet/android/cronet_jni_headers/CronetUploadDataStream_jni.h",
- "components/cronet/android/cronet_jni_headers/CronetUrlRequestContext_jni.h",
- "components/cronet/android/cronet_jni_headers/CronetUrlRequest_jni.h",
- ],
- tool_files: [
- "base/android/jni_generator/android_jar.classes",
- "base/android/jni_generator/jni_generator.py",
- "build/android/gyp/util/__init__.py",
- "build/android/gyp/util/build_utils.py",
- "build/gn_helpers.py",
- ],
- apex_available: [
- "com.android.tethering",
- ],
-}
-
-// GN: //components/cronet/android:cronet_jni_headers__testing
-cc_genrule {
- name: "cronet_aml_components_cronet_android_cronet_jni_headers__testing",
- srcs: [
- "components/cronet/android/java/src/org/chromium/net/impl/CronetBidirectionalStream.java",
- "components/cronet/android/java/src/org/chromium/net/impl/CronetLibraryLoader.java",
- "components/cronet/android/java/src/org/chromium/net/impl/CronetUploadDataStream.java",
- "components/cronet/android/java/src/org/chromium/net/impl/CronetUrlRequest.java",
- "components/cronet/android/java/src/org/chromium/net/impl/CronetUrlRequestContext.java",
- ],
- cmd: "$(location base/android/jni_generator/jni_generator.py) --ptr_type " +
- "long " +
- "--output_dir " +
- "$(genDir)/components/cronet/android/cronet_jni_headers " +
- "--includes " +
- "base/android/jni_generator/jni_generator_helper.h " +
- "--use_proxy_hash " +
- "--output_name " +
- "CronetBidirectionalStream_jni.h " +
- "--output_name " +
- "CronetLibraryLoader_jni.h " +
- "--output_name " +
- "CronetUploadDataStream_jni.h " +
- "--output_name " +
- "CronetUrlRequest_jni.h " +
- "--output_name " +
- "CronetUrlRequestContext_jni.h " +
- "--input_file " +
- "$(location components/cronet/android/java/src/org/chromium/net/impl/CronetBidirectionalStream.java) " +
- "--input_file " +
- "$(location components/cronet/android/java/src/org/chromium/net/impl/CronetLibraryLoader.java) " +
- "--input_file " +
- "$(location components/cronet/android/java/src/org/chromium/net/impl/CronetUploadDataStream.java) " +
- "--input_file " +
- "$(location components/cronet/android/java/src/org/chromium/net/impl/CronetUrlRequest.java) " +
- "--input_file " +
- "$(location components/cronet/android/java/src/org/chromium/net/impl/CronetUrlRequestContext.java)",
- out: [
- "components/cronet/android/cronet_jni_headers/CronetBidirectionalStream_jni.h",
- "components/cronet/android/cronet_jni_headers/CronetLibraryLoader_jni.h",
- "components/cronet/android/cronet_jni_headers/CronetUploadDataStream_jni.h",
- "components/cronet/android/cronet_jni_headers/CronetUrlRequestContext_jni.h",
- "components/cronet/android/cronet_jni_headers/CronetUrlRequest_jni.h",
- ],
- tool_files: [
- "base/android/jni_generator/android_jar.classes",
- "base/android/jni_generator/jni_generator.py",
- "build/android/gyp/util/__init__.py",
- "build/android/gyp/util/build_utils.py",
- "build/gn_helpers.py",
- ],
- apex_available: [
- "com.android.tethering",
- ],
-}
-
-// GN: //components/cronet/android:cronet_jni_registration
-cc_genrule {
- name: "cronet_aml_components_cronet_android_cronet_jni_registration",
- srcs: [
- "base/android/java/src/org/chromium/base/ActivityState.java",
- "base/android/java/src/org/chromium/base/ApiCompatibilityUtils.java",
- "base/android/java/src/org/chromium/base/ApkAssets.java",
- "base/android/java/src/org/chromium/base/ApplicationStatus.java",
- "base/android/java/src/org/chromium/base/BaseFeatureList.java",
- "base/android/java/src/org/chromium/base/BuildInfo.java",
- "base/android/java/src/org/chromium/base/BundleUtils.java",
- "base/android/java/src/org/chromium/base/ByteArrayGenerator.java",
- "base/android/java/src/org/chromium/base/Callback.java",
- "base/android/java/src/org/chromium/base/CallbackController.java",
- "base/android/java/src/org/chromium/base/CollectionUtil.java",
- "base/android/java/src/org/chromium/base/CommandLine.java",
- "base/android/java/src/org/chromium/base/CommandLineInitUtil.java",
- "base/android/java/src/org/chromium/base/Consumer.java",
- "base/android/java/src/org/chromium/base/ContentUriUtils.java",
- "base/android/java/src/org/chromium/base/ContextUtils.java",
- "base/android/java/src/org/chromium/base/CpuFeatures.java",
- "base/android/java/src/org/chromium/base/DiscardableReferencePool.java",
- "base/android/java/src/org/chromium/base/EarlyTraceEvent.java",
- "base/android/java/src/org/chromium/base/EventLog.java",
- "base/android/java/src/org/chromium/base/FeatureList.java",
- "base/android/java/src/org/chromium/base/Features.java",
- "base/android/java/src/org/chromium/base/FieldTrialList.java",
- "base/android/java/src/org/chromium/base/FileUtils.java",
- "base/android/java/src/org/chromium/base/Function.java",
- "base/android/java/src/org/chromium/base/ImportantFileWriterAndroid.java",
- "base/android/java/src/org/chromium/base/IntStringCallback.java",
- "base/android/java/src/org/chromium/base/JNIUtils.java",
- "base/android/java/src/org/chromium/base/JavaExceptionReporter.java",
- "base/android/java/src/org/chromium/base/JavaHandlerThread.java",
- "base/android/java/src/org/chromium/base/JniException.java",
- "base/android/java/src/org/chromium/base/JniStaticTestMocker.java",
- "base/android/java/src/org/chromium/base/LifetimeAssert.java",
- "base/android/java/src/org/chromium/base/LocaleUtils.java",
- "base/android/java/src/org/chromium/base/Log.java",
- "base/android/java/src/org/chromium/base/MathUtils.java",
- "base/android/java/src/org/chromium/base/MemoryPressureListener.java",
- "base/android/java/src/org/chromium/base/NativeLibraryLoadedStatus.java",
- "base/android/java/src/org/chromium/base/ObserverList.java",
- "base/android/java/src/org/chromium/base/PackageManagerUtils.java",
- "base/android/java/src/org/chromium/base/PackageUtils.java",
- "base/android/java/src/org/chromium/base/PathService.java",
- "base/android/java/src/org/chromium/base/PathUtils.java",
- "base/android/java/src/org/chromium/base/PiiElider.java",
- "base/android/java/src/org/chromium/base/PowerMonitor.java",
- "base/android/java/src/org/chromium/base/PowerMonitorForQ.java",
- "base/android/java/src/org/chromium/base/Predicate.java",
- "base/android/java/src/org/chromium/base/Promise.java",
- "base/android/java/src/org/chromium/base/RadioUtils.java",
- "base/android/java/src/org/chromium/base/StreamUtil.java",
- "base/android/java/src/org/chromium/base/StrictModeContext.java",
- "base/android/java/src/org/chromium/base/SysUtils.java",
- "base/android/java/src/org/chromium/base/ThreadUtils.java",
- "base/android/java/src/org/chromium/base/TimeUtils.java",
- "base/android/java/src/org/chromium/base/TimezoneUtils.java",
- "base/android/java/src/org/chromium/base/TraceEvent.java",
- "base/android/java/src/org/chromium/base/UnguessableToken.java",
- "base/android/java/src/org/chromium/base/UnownedUserData.java",
- "base/android/java/src/org/chromium/base/UnownedUserDataHost.java",
- "base/android/java/src/org/chromium/base/UnownedUserDataKey.java",
- "base/android/java/src/org/chromium/base/UserData.java",
- "base/android/java/src/org/chromium/base/UserDataHost.java",
- "base/android/java/src/org/chromium/base/WrappedClassLoader.java",
- "base/android/java/src/org/chromium/base/annotations/AccessedByNative.java",
- "base/android/java/src/org/chromium/base/annotations/CalledByNative.java",
- "base/android/java/src/org/chromium/base/annotations/CalledByNativeForTesting.java",
- "base/android/java/src/org/chromium/base/annotations/CalledByNativeUnchecked.java",
- "base/android/java/src/org/chromium/base/annotations/JNIAdditionalImport.java",
- "base/android/java/src/org/chromium/base/annotations/JNINamespace.java",
- "base/android/java/src/org/chromium/base/annotations/JniIgnoreNatives.java",
- "base/android/java/src/org/chromium/base/annotations/NativeClassQualifiedName.java",
- "base/android/java/src/org/chromium/base/annotations/NativeMethods.java",
- "base/android/java/src/org/chromium/base/compat/ApiHelperForM.java",
- "base/android/java/src/org/chromium/base/compat/ApiHelperForN.java",
- "base/android/java/src/org/chromium/base/compat/ApiHelperForO.java",
- "base/android/java/src/org/chromium/base/compat/ApiHelperForOMR1.java",
- "base/android/java/src/org/chromium/base/compat/ApiHelperForP.java",
- "base/android/java/src/org/chromium/base/compat/ApiHelperForQ.java",
- "base/android/java/src/org/chromium/base/compat/ApiHelperForR.java",
- "base/android/java/src/org/chromium/base/compat/ApiHelperForS.java",
- "base/android/java/src/org/chromium/base/jank_tracker/DummyJankTracker.java",
- "base/android/java/src/org/chromium/base/jank_tracker/FrameMetrics.java",
- "base/android/java/src/org/chromium/base/jank_tracker/FrameMetricsListener.java",
- "base/android/java/src/org/chromium/base/jank_tracker/FrameMetricsStore.java",
- "base/android/java/src/org/chromium/base/jank_tracker/JankActivityTracker.java",
- "base/android/java/src/org/chromium/base/jank_tracker/JankMetricCalculator.java",
- "base/android/java/src/org/chromium/base/jank_tracker/JankMetricUMARecorder.java",
- "base/android/java/src/org/chromium/base/jank_tracker/JankMetrics.java",
- "base/android/java/src/org/chromium/base/jank_tracker/JankReportingRunnable.java",
- "base/android/java/src/org/chromium/base/jank_tracker/JankReportingScheduler.java",
- "base/android/java/src/org/chromium/base/jank_tracker/JankScenario.java",
- "base/android/java/src/org/chromium/base/jank_tracker/JankTracker.java",
- "base/android/java/src/org/chromium/base/jank_tracker/JankTrackerImpl.java",
- "base/android/java/src/org/chromium/base/library_loader/LegacyLinker.java",
- "base/android/java/src/org/chromium/base/library_loader/LibraryLoader.java",
- "base/android/java/src/org/chromium/base/library_loader/LibraryPrefetcher.java",
- "base/android/java/src/org/chromium/base/library_loader/Linker.java",
- "base/android/java/src/org/chromium/base/library_loader/LinkerJni.java",
- "base/android/java/src/org/chromium/base/library_loader/LoaderErrors.java",
- "base/android/java/src/org/chromium/base/library_loader/ModernLinker.java",
- "base/android/java/src/org/chromium/base/library_loader/ModernLinkerJni.java",
- "base/android/java/src/org/chromium/base/library_loader/NativeLibraryPreloader.java",
- "base/android/java/src/org/chromium/base/library_loader/ProcessInitException.java",
- "base/android/java/src/org/chromium/base/lifetime/DestroyChecker.java",
- "base/android/java/src/org/chromium/base/lifetime/Destroyable.java",
- "base/android/java/src/org/chromium/base/memory/JavaHeapDumpGenerator.java",
- "base/android/java/src/org/chromium/base/memory/MemoryPressureCallback.java",
- "base/android/java/src/org/chromium/base/memory/MemoryPressureMonitor.java",
- "base/android/java/src/org/chromium/base/memory/MemoryPressureUma.java",
- "base/android/java/src/org/chromium/base/memory/MemoryPurgeManager.java",
- "base/android/java/src/org/chromium/base/metrics/CachingUmaRecorder.java",
- "base/android/java/src/org/chromium/base/metrics/NativeUmaRecorder.java",
- "base/android/java/src/org/chromium/base/metrics/NoopUmaRecorder.java",
- "base/android/java/src/org/chromium/base/metrics/RecordHistogram.java",
- "base/android/java/src/org/chromium/base/metrics/RecordUserAction.java",
- "base/android/java/src/org/chromium/base/metrics/ScopedSysTraceEvent.java",
- "base/android/java/src/org/chromium/base/metrics/StatisticsRecorderAndroid.java",
- "base/android/java/src/org/chromium/base/metrics/TimingMetric.java",
- "base/android/java/src/org/chromium/base/metrics/UmaRecorder.java",
- "base/android/java/src/org/chromium/base/metrics/UmaRecorderHolder.java",
- "base/android/java/src/org/chromium/base/supplier/BooleanSupplier.java",
- "base/android/java/src/org/chromium/base/supplier/DestroyableObservableSupplier.java",
- "base/android/java/src/org/chromium/base/supplier/ObservableSupplier.java",
- "base/android/java/src/org/chromium/base/supplier/ObservableSupplierImpl.java",
- "base/android/java/src/org/chromium/base/supplier/OneShotCallback.java",
- "base/android/java/src/org/chromium/base/supplier/OneshotSupplier.java",
- "base/android/java/src/org/chromium/base/supplier/OneshotSupplierImpl.java",
- "base/android/java/src/org/chromium/base/supplier/Supplier.java",
- "base/android/java/src/org/chromium/base/supplier/UnownedUserDataSupplier.java",
- "base/android/java/src/org/chromium/base/task/AsyncTask.java",
- "base/android/java/src/org/chromium/base/task/BackgroundOnlyAsyncTask.java",
- "base/android/java/src/org/chromium/base/task/ChainedTasks.java",
- "base/android/java/src/org/chromium/base/task/ChoreographerTaskRunner.java",
- "base/android/java/src/org/chromium/base/task/ChromeThreadPoolExecutor.java",
- "base/android/java/src/org/chromium/base/task/DefaultTaskExecutor.java",
- "base/android/java/src/org/chromium/base/task/PostTask.java",
- "base/android/java/src/org/chromium/base/task/SequencedTaskRunner.java",
- "base/android/java/src/org/chromium/base/task/SequencedTaskRunnerImpl.java",
- "base/android/java/src/org/chromium/base/task/SerialExecutor.java",
- "base/android/java/src/org/chromium/base/task/SingleThreadTaskRunner.java",
- "base/android/java/src/org/chromium/base/task/SingleThreadTaskRunnerImpl.java",
- "base/android/java/src/org/chromium/base/task/TaskExecutor.java",
- "base/android/java/src/org/chromium/base/task/TaskRunner.java",
- "base/android/java/src/org/chromium/base/task/TaskRunnerImpl.java",
- "base/android/java/src/org/chromium/base/task/TaskTraits.java",
- "base/android/java/src/org/chromium/base/task/TaskTraitsExtensionDescriptor.java",
- "build/android/java/src/org/chromium/build/annotations/AlwaysInline.java",
- "build/android/java/src/org/chromium/build/annotations/CheckDiscard.java",
- "build/android/java/src/org/chromium/build/annotations/DoNotClassMerge.java",
- "build/android/java/src/org/chromium/build/annotations/DoNotInline.java",
- "build/android/java/src/org/chromium/build/annotations/IdentifierNameString.java",
- "build/android/java/src/org/chromium/build/annotations/MainDex.java",
- "build/android/java/src/org/chromium/build/annotations/MockedInTests.java",
- "build/android/java/src/org/chromium/build/annotations/UsedByReflection.java",
- "components/cronet/android/java/src/org/chromium/net/impl/BidirectionalStreamBuilderImpl.java",
- "components/cronet/android/java/src/org/chromium/net/impl/BidirectionalStreamNetworkException.java",
- "components/cronet/android/java/src/org/chromium/net/impl/CallbackExceptionImpl.java",
- "components/cronet/android/java/src/org/chromium/net/impl/CronetBidirectionalStream.java",
- "components/cronet/android/java/src/org/chromium/net/impl/CronetEngineBase.java",
- "components/cronet/android/java/src/org/chromium/net/impl/CronetEngineBuilderImpl.java",
- "components/cronet/android/java/src/org/chromium/net/impl/CronetExceptionImpl.java",
- "components/cronet/android/java/src/org/chromium/net/impl/CronetLibraryLoader.java",
- "components/cronet/android/java/src/org/chromium/net/impl/CronetLogger.java",
- "components/cronet/android/java/src/org/chromium/net/impl/CronetLoggerFactory.java",
- "components/cronet/android/java/src/org/chromium/net/impl/CronetManifest.java",
- "components/cronet/android/java/src/org/chromium/net/impl/CronetMetrics.java",
- "components/cronet/android/java/src/org/chromium/net/impl/CronetUploadDataStream.java",
- "components/cronet/android/java/src/org/chromium/net/impl/CronetUrlRequest.java",
- "components/cronet/android/java/src/org/chromium/net/impl/CronetUrlRequestContext.java",
- "components/cronet/android/java/src/org/chromium/net/impl/NativeCronetEngineBuilderImpl.java",
- "components/cronet/android/java/src/org/chromium/net/impl/NetworkExceptionImpl.java",
- "components/cronet/android/java/src/org/chromium/net/impl/NoOpLogger.java",
- "components/cronet/android/java/src/org/chromium/net/impl/Preconditions.java",
- "components/cronet/android/java/src/org/chromium/net/impl/QuicExceptionImpl.java",
- "components/cronet/android/java/src/org/chromium/net/impl/RequestFinishedInfoImpl.java",
- "components/cronet/android/java/src/org/chromium/net/impl/UrlRequestBase.java",
- "components/cronet/android/java/src/org/chromium/net/impl/UrlRequestBuilderImpl.java",
- "components/cronet/android/java/src/org/chromium/net/impl/UrlResponseInfoImpl.java",
- "components/cronet/android/java/src/org/chromium/net/impl/UserAgent.java",
- "components/cronet/android/java/src/org/chromium/net/impl/VersionSafeCallbacks.java",
- "components/cronet/android/java/src/org/chromium/net/urlconnection/CronetBufferedOutputStream.java",
- "components/cronet/android/java/src/org/chromium/net/urlconnection/CronetChunkedOutputStream.java",
- "components/cronet/android/java/src/org/chromium/net/urlconnection/CronetFixedModeOutputStream.java",
- "components/cronet/android/java/src/org/chromium/net/urlconnection/CronetHttpURLConnection.java",
- "components/cronet/android/java/src/org/chromium/net/urlconnection/CronetHttpURLStreamHandler.java",
- "components/cronet/android/java/src/org/chromium/net/urlconnection/CronetInputStream.java",
- "components/cronet/android/java/src/org/chromium/net/urlconnection/CronetOutputStream.java",
- "components/cronet/android/java/src/org/chromium/net/urlconnection/CronetURLStreamHandlerFactory.java",
- "components/cronet/android/java/src/org/chromium/net/urlconnection/MessageLoop.java",
- "net/android/java/src/org/chromium/net/AndroidCertVerifyResult.java",
- "net/android/java/src/org/chromium/net/AndroidKeyStore.java",
- "net/android/java/src/org/chromium/net/AndroidNetworkLibrary.java",
- "net/android/java/src/org/chromium/net/AndroidTrafficStats.java",
- "net/android/java/src/org/chromium/net/ChromiumNetworkAdapter.java",
- "net/android/java/src/org/chromium/net/DnsStatus.java",
- "net/android/java/src/org/chromium/net/GURLUtils.java",
- "net/android/java/src/org/chromium/net/HttpNegotiateAuthenticator.java",
- "net/android/java/src/org/chromium/net/HttpNegotiateConstants.java",
- "net/android/java/src/org/chromium/net/HttpUtil.java",
- "net/android/java/src/org/chromium/net/MimeTypeFilter.java",
- "net/android/java/src/org/chromium/net/NetStringUtil.java",
- "net/android/java/src/org/chromium/net/NetworkActiveNotifier.java",
- "net/android/java/src/org/chromium/net/NetworkChangeNotifier.java",
- "net/android/java/src/org/chromium/net/NetworkChangeNotifierAutoDetect.java",
- "net/android/java/src/org/chromium/net/NetworkTrafficAnnotationTag.java",
- "net/android/java/src/org/chromium/net/ProxyBroadcastReceiver.java",
- "net/android/java/src/org/chromium/net/ProxyChangeListener.java",
- "net/android/java/src/org/chromium/net/RegistrationPolicyAlwaysRegister.java",
- "net/android/java/src/org/chromium/net/RegistrationPolicyApplicationStatus.java",
- "net/android/java/src/org/chromium/net/ThreadStatsUid.java",
- "net/android/java/src/org/chromium/net/X509Util.java",
- "url/android/java/src/org/chromium/url/IDNStringUtil.java",
- ],
- cmd: "current_dir=`basename \\`pwd\\``; " +
- "for f in $(in); " +
- "do " +
- "echo \"../$$current_dir/$$f\" >> $(genDir)/java.sources; " +
- "done; " +
- "python3 $(location base/android/jni_generator/jni_registration_generator.py) --srcjar-path " +
- "$(genDir)/components/cronet/android/cronet_jni_registration.srcjar " +
- "--depfile " +
- "$(genDir)/components/cronet/android/cronet_jni_registration.d " +
- "--sources-files " +
- "$(genDir)/java.sources " +
- "--include_test_only " +
- "--use_proxy_hash " +
- "--header-path " +
- "$(genDir)/components/cronet/android/cronet_jni_registration.h " +
- "--manual_jni_registration " +
- "--package_prefix " +
- "android.net.http.internal " +
- ";sed -i -e 's/OUT_SOONG_.TEMP_SBOX_.*_OUT/GEN/g' " +
- "$(genDir)/components/cronet/android/cronet_jni_registration.h",
- out: [
- "components/cronet/android/cronet_jni_registration.h",
- "components/cronet/android/cronet_jni_registration.srcjar",
- ],
- tool_files: [
- "base/android/jni_generator/jni_generator.py",
- "base/android/jni_generator/jni_registration_generator.py",
- "build/android/gyp/util/__init__.py",
- "build/android/gyp/util/build_utils.py",
- "build/gn_helpers.py",
- ],
- apex_available: [
- "com.android.tethering",
- ],
-}
-
-// GN: //components/cronet/android:cronet_jni_registration
-java_genrule {
- name: "cronet_aml_components_cronet_android_cronet_jni_registration__java",
- srcs: [
- "base/android/java/src/org/chromium/base/ActivityState.java",
- "base/android/java/src/org/chromium/base/ApiCompatibilityUtils.java",
- "base/android/java/src/org/chromium/base/ApkAssets.java",
- "base/android/java/src/org/chromium/base/ApplicationStatus.java",
- "base/android/java/src/org/chromium/base/BaseFeatureList.java",
- "base/android/java/src/org/chromium/base/BuildInfo.java",
- "base/android/java/src/org/chromium/base/BundleUtils.java",
- "base/android/java/src/org/chromium/base/ByteArrayGenerator.java",
- "base/android/java/src/org/chromium/base/Callback.java",
- "base/android/java/src/org/chromium/base/CallbackController.java",
- "base/android/java/src/org/chromium/base/CollectionUtil.java",
- "base/android/java/src/org/chromium/base/CommandLine.java",
- "base/android/java/src/org/chromium/base/CommandLineInitUtil.java",
- "base/android/java/src/org/chromium/base/Consumer.java",
- "base/android/java/src/org/chromium/base/ContentUriUtils.java",
- "base/android/java/src/org/chromium/base/ContextUtils.java",
- "base/android/java/src/org/chromium/base/CpuFeatures.java",
- "base/android/java/src/org/chromium/base/DiscardableReferencePool.java",
- "base/android/java/src/org/chromium/base/EarlyTraceEvent.java",
- "base/android/java/src/org/chromium/base/EventLog.java",
- "base/android/java/src/org/chromium/base/FeatureList.java",
- "base/android/java/src/org/chromium/base/Features.java",
- "base/android/java/src/org/chromium/base/FieldTrialList.java",
- "base/android/java/src/org/chromium/base/FileUtils.java",
- "base/android/java/src/org/chromium/base/Function.java",
- "base/android/java/src/org/chromium/base/ImportantFileWriterAndroid.java",
- "base/android/java/src/org/chromium/base/IntStringCallback.java",
- "base/android/java/src/org/chromium/base/JNIUtils.java",
- "base/android/java/src/org/chromium/base/JavaExceptionReporter.java",
- "base/android/java/src/org/chromium/base/JavaHandlerThread.java",
- "base/android/java/src/org/chromium/base/JniException.java",
- "base/android/java/src/org/chromium/base/JniStaticTestMocker.java",
- "base/android/java/src/org/chromium/base/LifetimeAssert.java",
- "base/android/java/src/org/chromium/base/LocaleUtils.java",
- "base/android/java/src/org/chromium/base/Log.java",
- "base/android/java/src/org/chromium/base/MathUtils.java",
- "base/android/java/src/org/chromium/base/MemoryPressureListener.java",
- "base/android/java/src/org/chromium/base/NativeLibraryLoadedStatus.java",
- "base/android/java/src/org/chromium/base/ObserverList.java",
- "base/android/java/src/org/chromium/base/PackageManagerUtils.java",
- "base/android/java/src/org/chromium/base/PackageUtils.java",
- "base/android/java/src/org/chromium/base/PathService.java",
- "base/android/java/src/org/chromium/base/PathUtils.java",
- "base/android/java/src/org/chromium/base/PiiElider.java",
- "base/android/java/src/org/chromium/base/PowerMonitor.java",
- "base/android/java/src/org/chromium/base/PowerMonitorForQ.java",
- "base/android/java/src/org/chromium/base/Predicate.java",
- "base/android/java/src/org/chromium/base/Promise.java",
- "base/android/java/src/org/chromium/base/RadioUtils.java",
- "base/android/java/src/org/chromium/base/StreamUtil.java",
- "base/android/java/src/org/chromium/base/StrictModeContext.java",
- "base/android/java/src/org/chromium/base/SysUtils.java",
- "base/android/java/src/org/chromium/base/ThreadUtils.java",
- "base/android/java/src/org/chromium/base/TimeUtils.java",
- "base/android/java/src/org/chromium/base/TimezoneUtils.java",
- "base/android/java/src/org/chromium/base/TraceEvent.java",
- "base/android/java/src/org/chromium/base/UnguessableToken.java",
- "base/android/java/src/org/chromium/base/UnownedUserData.java",
- "base/android/java/src/org/chromium/base/UnownedUserDataHost.java",
- "base/android/java/src/org/chromium/base/UnownedUserDataKey.java",
- "base/android/java/src/org/chromium/base/UserData.java",
- "base/android/java/src/org/chromium/base/UserDataHost.java",
- "base/android/java/src/org/chromium/base/WrappedClassLoader.java",
- "base/android/java/src/org/chromium/base/annotations/AccessedByNative.java",
- "base/android/java/src/org/chromium/base/annotations/CalledByNative.java",
- "base/android/java/src/org/chromium/base/annotations/CalledByNativeForTesting.java",
- "base/android/java/src/org/chromium/base/annotations/CalledByNativeUnchecked.java",
- "base/android/java/src/org/chromium/base/annotations/JNIAdditionalImport.java",
- "base/android/java/src/org/chromium/base/annotations/JNINamespace.java",
- "base/android/java/src/org/chromium/base/annotations/JniIgnoreNatives.java",
- "base/android/java/src/org/chromium/base/annotations/NativeClassQualifiedName.java",
- "base/android/java/src/org/chromium/base/annotations/NativeMethods.java",
- "base/android/java/src/org/chromium/base/compat/ApiHelperForM.java",
- "base/android/java/src/org/chromium/base/compat/ApiHelperForN.java",
- "base/android/java/src/org/chromium/base/compat/ApiHelperForO.java",
- "base/android/java/src/org/chromium/base/compat/ApiHelperForOMR1.java",
- "base/android/java/src/org/chromium/base/compat/ApiHelperForP.java",
- "base/android/java/src/org/chromium/base/compat/ApiHelperForQ.java",
- "base/android/java/src/org/chromium/base/compat/ApiHelperForR.java",
- "base/android/java/src/org/chromium/base/compat/ApiHelperForS.java",
- "base/android/java/src/org/chromium/base/jank_tracker/DummyJankTracker.java",
- "base/android/java/src/org/chromium/base/jank_tracker/FrameMetrics.java",
- "base/android/java/src/org/chromium/base/jank_tracker/FrameMetricsListener.java",
- "base/android/java/src/org/chromium/base/jank_tracker/FrameMetricsStore.java",
- "base/android/java/src/org/chromium/base/jank_tracker/JankActivityTracker.java",
- "base/android/java/src/org/chromium/base/jank_tracker/JankMetricCalculator.java",
- "base/android/java/src/org/chromium/base/jank_tracker/JankMetricUMARecorder.java",
- "base/android/java/src/org/chromium/base/jank_tracker/JankMetrics.java",
- "base/android/java/src/org/chromium/base/jank_tracker/JankReportingRunnable.java",
- "base/android/java/src/org/chromium/base/jank_tracker/JankReportingScheduler.java",
- "base/android/java/src/org/chromium/base/jank_tracker/JankScenario.java",
- "base/android/java/src/org/chromium/base/jank_tracker/JankTracker.java",
- "base/android/java/src/org/chromium/base/jank_tracker/JankTrackerImpl.java",
- "base/android/java/src/org/chromium/base/library_loader/LegacyLinker.java",
- "base/android/java/src/org/chromium/base/library_loader/LibraryLoader.java",
- "base/android/java/src/org/chromium/base/library_loader/LibraryPrefetcher.java",
- "base/android/java/src/org/chromium/base/library_loader/Linker.java",
- "base/android/java/src/org/chromium/base/library_loader/LinkerJni.java",
- "base/android/java/src/org/chromium/base/library_loader/LoaderErrors.java",
- "base/android/java/src/org/chromium/base/library_loader/ModernLinker.java",
- "base/android/java/src/org/chromium/base/library_loader/ModernLinkerJni.java",
- "base/android/java/src/org/chromium/base/library_loader/NativeLibraryPreloader.java",
- "base/android/java/src/org/chromium/base/library_loader/ProcessInitException.java",
- "base/android/java/src/org/chromium/base/lifetime/DestroyChecker.java",
- "base/android/java/src/org/chromium/base/lifetime/Destroyable.java",
- "base/android/java/src/org/chromium/base/memory/JavaHeapDumpGenerator.java",
- "base/android/java/src/org/chromium/base/memory/MemoryPressureCallback.java",
- "base/android/java/src/org/chromium/base/memory/MemoryPressureMonitor.java",
- "base/android/java/src/org/chromium/base/memory/MemoryPressureUma.java",
- "base/android/java/src/org/chromium/base/memory/MemoryPurgeManager.java",
- "base/android/java/src/org/chromium/base/metrics/CachingUmaRecorder.java",
- "base/android/java/src/org/chromium/base/metrics/NativeUmaRecorder.java",
- "base/android/java/src/org/chromium/base/metrics/NoopUmaRecorder.java",
- "base/android/java/src/org/chromium/base/metrics/RecordHistogram.java",
- "base/android/java/src/org/chromium/base/metrics/RecordUserAction.java",
- "base/android/java/src/org/chromium/base/metrics/ScopedSysTraceEvent.java",
- "base/android/java/src/org/chromium/base/metrics/StatisticsRecorderAndroid.java",
- "base/android/java/src/org/chromium/base/metrics/TimingMetric.java",
- "base/android/java/src/org/chromium/base/metrics/UmaRecorder.java",
- "base/android/java/src/org/chromium/base/metrics/UmaRecorderHolder.java",
- "base/android/java/src/org/chromium/base/supplier/BooleanSupplier.java",
- "base/android/java/src/org/chromium/base/supplier/DestroyableObservableSupplier.java",
- "base/android/java/src/org/chromium/base/supplier/ObservableSupplier.java",
- "base/android/java/src/org/chromium/base/supplier/ObservableSupplierImpl.java",
- "base/android/java/src/org/chromium/base/supplier/OneShotCallback.java",
- "base/android/java/src/org/chromium/base/supplier/OneshotSupplier.java",
- "base/android/java/src/org/chromium/base/supplier/OneshotSupplierImpl.java",
- "base/android/java/src/org/chromium/base/supplier/Supplier.java",
- "base/android/java/src/org/chromium/base/supplier/UnownedUserDataSupplier.java",
- "base/android/java/src/org/chromium/base/task/AsyncTask.java",
- "base/android/java/src/org/chromium/base/task/BackgroundOnlyAsyncTask.java",
- "base/android/java/src/org/chromium/base/task/ChainedTasks.java",
- "base/android/java/src/org/chromium/base/task/ChoreographerTaskRunner.java",
- "base/android/java/src/org/chromium/base/task/ChromeThreadPoolExecutor.java",
- "base/android/java/src/org/chromium/base/task/DefaultTaskExecutor.java",
- "base/android/java/src/org/chromium/base/task/PostTask.java",
- "base/android/java/src/org/chromium/base/task/SequencedTaskRunner.java",
- "base/android/java/src/org/chromium/base/task/SequencedTaskRunnerImpl.java",
- "base/android/java/src/org/chromium/base/task/SerialExecutor.java",
- "base/android/java/src/org/chromium/base/task/SingleThreadTaskRunner.java",
- "base/android/java/src/org/chromium/base/task/SingleThreadTaskRunnerImpl.java",
- "base/android/java/src/org/chromium/base/task/TaskExecutor.java",
- "base/android/java/src/org/chromium/base/task/TaskRunner.java",
- "base/android/java/src/org/chromium/base/task/TaskRunnerImpl.java",
- "base/android/java/src/org/chromium/base/task/TaskTraits.java",
- "base/android/java/src/org/chromium/base/task/TaskTraitsExtensionDescriptor.java",
- "build/android/java/src/org/chromium/build/annotations/AlwaysInline.java",
- "build/android/java/src/org/chromium/build/annotations/CheckDiscard.java",
- "build/android/java/src/org/chromium/build/annotations/DoNotClassMerge.java",
- "build/android/java/src/org/chromium/build/annotations/DoNotInline.java",
- "build/android/java/src/org/chromium/build/annotations/IdentifierNameString.java",
- "build/android/java/src/org/chromium/build/annotations/MainDex.java",
- "build/android/java/src/org/chromium/build/annotations/MockedInTests.java",
- "build/android/java/src/org/chromium/build/annotations/UsedByReflection.java",
- "components/cronet/android/java/src/org/chromium/net/impl/BidirectionalStreamBuilderImpl.java",
- "components/cronet/android/java/src/org/chromium/net/impl/BidirectionalStreamNetworkException.java",
- "components/cronet/android/java/src/org/chromium/net/impl/CallbackExceptionImpl.java",
- "components/cronet/android/java/src/org/chromium/net/impl/CronetBidirectionalStream.java",
- "components/cronet/android/java/src/org/chromium/net/impl/CronetEngineBase.java",
- "components/cronet/android/java/src/org/chromium/net/impl/CronetEngineBuilderImpl.java",
- "components/cronet/android/java/src/org/chromium/net/impl/CronetExceptionImpl.java",
- "components/cronet/android/java/src/org/chromium/net/impl/CronetLibraryLoader.java",
- "components/cronet/android/java/src/org/chromium/net/impl/CronetLogger.java",
- "components/cronet/android/java/src/org/chromium/net/impl/CronetLoggerFactory.java",
- "components/cronet/android/java/src/org/chromium/net/impl/CronetManifest.java",
- "components/cronet/android/java/src/org/chromium/net/impl/CronetMetrics.java",
- "components/cronet/android/java/src/org/chromium/net/impl/CronetUploadDataStream.java",
- "components/cronet/android/java/src/org/chromium/net/impl/CronetUrlRequest.java",
- "components/cronet/android/java/src/org/chromium/net/impl/CronetUrlRequestContext.java",
- "components/cronet/android/java/src/org/chromium/net/impl/NativeCronetEngineBuilderImpl.java",
- "components/cronet/android/java/src/org/chromium/net/impl/NetworkExceptionImpl.java",
- "components/cronet/android/java/src/org/chromium/net/impl/NoOpLogger.java",
- "components/cronet/android/java/src/org/chromium/net/impl/Preconditions.java",
- "components/cronet/android/java/src/org/chromium/net/impl/QuicExceptionImpl.java",
- "components/cronet/android/java/src/org/chromium/net/impl/RequestFinishedInfoImpl.java",
- "components/cronet/android/java/src/org/chromium/net/impl/UrlRequestBase.java",
- "components/cronet/android/java/src/org/chromium/net/impl/UrlRequestBuilderImpl.java",
- "components/cronet/android/java/src/org/chromium/net/impl/UrlResponseInfoImpl.java",
- "components/cronet/android/java/src/org/chromium/net/impl/UserAgent.java",
- "components/cronet/android/java/src/org/chromium/net/impl/VersionSafeCallbacks.java",
- "components/cronet/android/java/src/org/chromium/net/urlconnection/CronetBufferedOutputStream.java",
- "components/cronet/android/java/src/org/chromium/net/urlconnection/CronetChunkedOutputStream.java",
- "components/cronet/android/java/src/org/chromium/net/urlconnection/CronetFixedModeOutputStream.java",
- "components/cronet/android/java/src/org/chromium/net/urlconnection/CronetHttpURLConnection.java",
- "components/cronet/android/java/src/org/chromium/net/urlconnection/CronetHttpURLStreamHandler.java",
- "components/cronet/android/java/src/org/chromium/net/urlconnection/CronetInputStream.java",
- "components/cronet/android/java/src/org/chromium/net/urlconnection/CronetOutputStream.java",
- "components/cronet/android/java/src/org/chromium/net/urlconnection/CronetURLStreamHandlerFactory.java",
- "components/cronet/android/java/src/org/chromium/net/urlconnection/MessageLoop.java",
- "net/android/java/src/org/chromium/net/AndroidCertVerifyResult.java",
- "net/android/java/src/org/chromium/net/AndroidKeyStore.java",
- "net/android/java/src/org/chromium/net/AndroidNetworkLibrary.java",
- "net/android/java/src/org/chromium/net/AndroidTrafficStats.java",
- "net/android/java/src/org/chromium/net/ChromiumNetworkAdapter.java",
- "net/android/java/src/org/chromium/net/DnsStatus.java",
- "net/android/java/src/org/chromium/net/GURLUtils.java",
- "net/android/java/src/org/chromium/net/HttpNegotiateAuthenticator.java",
- "net/android/java/src/org/chromium/net/HttpNegotiateConstants.java",
- "net/android/java/src/org/chromium/net/HttpUtil.java",
- "net/android/java/src/org/chromium/net/MimeTypeFilter.java",
- "net/android/java/src/org/chromium/net/NetStringUtil.java",
- "net/android/java/src/org/chromium/net/NetworkActiveNotifier.java",
- "net/android/java/src/org/chromium/net/NetworkChangeNotifier.java",
- "net/android/java/src/org/chromium/net/NetworkChangeNotifierAutoDetect.java",
- "net/android/java/src/org/chromium/net/NetworkTrafficAnnotationTag.java",
- "net/android/java/src/org/chromium/net/ProxyBroadcastReceiver.java",
- "net/android/java/src/org/chromium/net/ProxyChangeListener.java",
- "net/android/java/src/org/chromium/net/RegistrationPolicyAlwaysRegister.java",
- "net/android/java/src/org/chromium/net/RegistrationPolicyApplicationStatus.java",
- "net/android/java/src/org/chromium/net/ThreadStatsUid.java",
- "net/android/java/src/org/chromium/net/X509Util.java",
- "url/android/java/src/org/chromium/url/IDNStringUtil.java",
- ],
- cmd: "current_dir=`basename \\`pwd\\``; " +
- "for f in $(in); " +
- "do " +
- "echo \"../$$current_dir/$$f\" >> $(genDir)/java.sources; " +
- "done; " +
- "python3 $(location base/android/jni_generator/jni_registration_generator.py) --srcjar-path " +
- "$(genDir)/components/cronet/android/cronet_jni_registration.srcjar " +
- "--depfile " +
- "$(genDir)/components/cronet/android/cronet_jni_registration.d " +
- "--sources-files " +
- "$(genDir)/java.sources " +
- "--include_test_only " +
- "--use_proxy_hash " +
- "--header-path " +
- "$(genDir)/components/cronet/android/cronet_jni_registration.h " +
- "--manual_jni_registration " +
- "--package_prefix " +
- "android.net.http.internal " +
- ";sed -i -e 's/OUT_SOONG_.TEMP_SBOX_.*_OUT/GEN/g' " +
- "$(genDir)/components/cronet/android/cronet_jni_registration.h",
- out: [
- "components/cronet/android/cronet_jni_registration.srcjar",
- ],
- tool_files: [
- "base/android/jni_generator/jni_generator.py",
- "base/android/jni_generator/jni_registration_generator.py",
- "build/android/gyp/util/__init__.py",
- "build/android/gyp/util/build_utils.py",
- "build/gn_helpers.py",
- ],
-}
-
-// GN: //components/cronet/android:cronet_jni_registration
-java_genrule {
- name: "cronet_aml_components_cronet_android_cronet_jni_registration__java__testing",
- srcs: [
- "base/android/java/src/org/chromium/base/ActivityState.java",
- "base/android/java/src/org/chromium/base/ApiCompatibilityUtils.java",
- "base/android/java/src/org/chromium/base/ApkAssets.java",
- "base/android/java/src/org/chromium/base/ApplicationStatus.java",
- "base/android/java/src/org/chromium/base/BaseFeatureList.java",
- "base/android/java/src/org/chromium/base/BuildInfo.java",
- "base/android/java/src/org/chromium/base/BundleUtils.java",
- "base/android/java/src/org/chromium/base/ByteArrayGenerator.java",
- "base/android/java/src/org/chromium/base/Callback.java",
- "base/android/java/src/org/chromium/base/CallbackController.java",
- "base/android/java/src/org/chromium/base/CollectionUtil.java",
- "base/android/java/src/org/chromium/base/CommandLine.java",
- "base/android/java/src/org/chromium/base/CommandLineInitUtil.java",
- "base/android/java/src/org/chromium/base/Consumer.java",
- "base/android/java/src/org/chromium/base/ContentUriUtils.java",
- "base/android/java/src/org/chromium/base/ContextUtils.java",
- "base/android/java/src/org/chromium/base/CpuFeatures.java",
- "base/android/java/src/org/chromium/base/DiscardableReferencePool.java",
- "base/android/java/src/org/chromium/base/EarlyTraceEvent.java",
- "base/android/java/src/org/chromium/base/EventLog.java",
- "base/android/java/src/org/chromium/base/FeatureList.java",
- "base/android/java/src/org/chromium/base/Features.java",
- "base/android/java/src/org/chromium/base/FieldTrialList.java",
- "base/android/java/src/org/chromium/base/FileUtils.java",
- "base/android/java/src/org/chromium/base/Function.java",
- "base/android/java/src/org/chromium/base/ImportantFileWriterAndroid.java",
- "base/android/java/src/org/chromium/base/IntStringCallback.java",
- "base/android/java/src/org/chromium/base/JNIUtils.java",
- "base/android/java/src/org/chromium/base/JavaExceptionReporter.java",
- "base/android/java/src/org/chromium/base/JavaHandlerThread.java",
- "base/android/java/src/org/chromium/base/JniException.java",
- "base/android/java/src/org/chromium/base/JniStaticTestMocker.java",
- "base/android/java/src/org/chromium/base/LifetimeAssert.java",
- "base/android/java/src/org/chromium/base/LocaleUtils.java",
- "base/android/java/src/org/chromium/base/Log.java",
- "base/android/java/src/org/chromium/base/MathUtils.java",
- "base/android/java/src/org/chromium/base/MemoryPressureListener.java",
- "base/android/java/src/org/chromium/base/NativeLibraryLoadedStatus.java",
- "base/android/java/src/org/chromium/base/ObserverList.java",
- "base/android/java/src/org/chromium/base/PackageManagerUtils.java",
- "base/android/java/src/org/chromium/base/PackageUtils.java",
- "base/android/java/src/org/chromium/base/PathService.java",
- "base/android/java/src/org/chromium/base/PathUtils.java",
- "base/android/java/src/org/chromium/base/PiiElider.java",
- "base/android/java/src/org/chromium/base/PowerMonitor.java",
- "base/android/java/src/org/chromium/base/PowerMonitorForQ.java",
- "base/android/java/src/org/chromium/base/Predicate.java",
- "base/android/java/src/org/chromium/base/Promise.java",
- "base/android/java/src/org/chromium/base/RadioUtils.java",
- "base/android/java/src/org/chromium/base/StreamUtil.java",
- "base/android/java/src/org/chromium/base/StrictModeContext.java",
- "base/android/java/src/org/chromium/base/SysUtils.java",
- "base/android/java/src/org/chromium/base/ThreadUtils.java",
- "base/android/java/src/org/chromium/base/TimeUtils.java",
- "base/android/java/src/org/chromium/base/TimezoneUtils.java",
- "base/android/java/src/org/chromium/base/TraceEvent.java",
- "base/android/java/src/org/chromium/base/UnguessableToken.java",
- "base/android/java/src/org/chromium/base/UnownedUserData.java",
- "base/android/java/src/org/chromium/base/UnownedUserDataHost.java",
- "base/android/java/src/org/chromium/base/UnownedUserDataKey.java",
- "base/android/java/src/org/chromium/base/UserData.java",
- "base/android/java/src/org/chromium/base/UserDataHost.java",
- "base/android/java/src/org/chromium/base/WrappedClassLoader.java",
- "base/android/java/src/org/chromium/base/annotations/AccessedByNative.java",
- "base/android/java/src/org/chromium/base/annotations/CalledByNative.java",
- "base/android/java/src/org/chromium/base/annotations/CalledByNativeForTesting.java",
- "base/android/java/src/org/chromium/base/annotations/CalledByNativeUnchecked.java",
- "base/android/java/src/org/chromium/base/annotations/JNIAdditionalImport.java",
- "base/android/java/src/org/chromium/base/annotations/JNINamespace.java",
- "base/android/java/src/org/chromium/base/annotations/JniIgnoreNatives.java",
- "base/android/java/src/org/chromium/base/annotations/NativeClassQualifiedName.java",
- "base/android/java/src/org/chromium/base/annotations/NativeMethods.java",
- "base/android/java/src/org/chromium/base/compat/ApiHelperForM.java",
- "base/android/java/src/org/chromium/base/compat/ApiHelperForN.java",
- "base/android/java/src/org/chromium/base/compat/ApiHelperForO.java",
- "base/android/java/src/org/chromium/base/compat/ApiHelperForOMR1.java",
- "base/android/java/src/org/chromium/base/compat/ApiHelperForP.java",
- "base/android/java/src/org/chromium/base/compat/ApiHelperForQ.java",
- "base/android/java/src/org/chromium/base/compat/ApiHelperForR.java",
- "base/android/java/src/org/chromium/base/compat/ApiHelperForS.java",
- "base/android/java/src/org/chromium/base/jank_tracker/DummyJankTracker.java",
- "base/android/java/src/org/chromium/base/jank_tracker/FrameMetrics.java",
- "base/android/java/src/org/chromium/base/jank_tracker/FrameMetricsListener.java",
- "base/android/java/src/org/chromium/base/jank_tracker/FrameMetricsStore.java",
- "base/android/java/src/org/chromium/base/jank_tracker/JankActivityTracker.java",
- "base/android/java/src/org/chromium/base/jank_tracker/JankMetricCalculator.java",
- "base/android/java/src/org/chromium/base/jank_tracker/JankMetricUMARecorder.java",
- "base/android/java/src/org/chromium/base/jank_tracker/JankMetrics.java",
- "base/android/java/src/org/chromium/base/jank_tracker/JankReportingRunnable.java",
- "base/android/java/src/org/chromium/base/jank_tracker/JankReportingScheduler.java",
- "base/android/java/src/org/chromium/base/jank_tracker/JankScenario.java",
- "base/android/java/src/org/chromium/base/jank_tracker/JankTracker.java",
- "base/android/java/src/org/chromium/base/jank_tracker/JankTrackerImpl.java",
- "base/android/java/src/org/chromium/base/library_loader/LegacyLinker.java",
- "base/android/java/src/org/chromium/base/library_loader/LibraryLoader.java",
- "base/android/java/src/org/chromium/base/library_loader/LibraryPrefetcher.java",
- "base/android/java/src/org/chromium/base/library_loader/Linker.java",
- "base/android/java/src/org/chromium/base/library_loader/LinkerJni.java",
- "base/android/java/src/org/chromium/base/library_loader/LoaderErrors.java",
- "base/android/java/src/org/chromium/base/library_loader/ModernLinker.java",
- "base/android/java/src/org/chromium/base/library_loader/ModernLinkerJni.java",
- "base/android/java/src/org/chromium/base/library_loader/NativeLibraryPreloader.java",
- "base/android/java/src/org/chromium/base/library_loader/ProcessInitException.java",
- "base/android/java/src/org/chromium/base/lifetime/DestroyChecker.java",
- "base/android/java/src/org/chromium/base/lifetime/Destroyable.java",
- "base/android/java/src/org/chromium/base/memory/JavaHeapDumpGenerator.java",
- "base/android/java/src/org/chromium/base/memory/MemoryPressureCallback.java",
- "base/android/java/src/org/chromium/base/memory/MemoryPressureMonitor.java",
- "base/android/java/src/org/chromium/base/memory/MemoryPressureUma.java",
- "base/android/java/src/org/chromium/base/memory/MemoryPurgeManager.java",
- "base/android/java/src/org/chromium/base/metrics/CachingUmaRecorder.java",
- "base/android/java/src/org/chromium/base/metrics/NativeUmaRecorder.java",
- "base/android/java/src/org/chromium/base/metrics/NoopUmaRecorder.java",
- "base/android/java/src/org/chromium/base/metrics/RecordHistogram.java",
- "base/android/java/src/org/chromium/base/metrics/RecordUserAction.java",
- "base/android/java/src/org/chromium/base/metrics/ScopedSysTraceEvent.java",
- "base/android/java/src/org/chromium/base/metrics/StatisticsRecorderAndroid.java",
- "base/android/java/src/org/chromium/base/metrics/TimingMetric.java",
- "base/android/java/src/org/chromium/base/metrics/UmaRecorder.java",
- "base/android/java/src/org/chromium/base/metrics/UmaRecorderHolder.java",
- "base/android/java/src/org/chromium/base/supplier/BooleanSupplier.java",
- "base/android/java/src/org/chromium/base/supplier/DestroyableObservableSupplier.java",
- "base/android/java/src/org/chromium/base/supplier/ObservableSupplier.java",
- "base/android/java/src/org/chromium/base/supplier/ObservableSupplierImpl.java",
- "base/android/java/src/org/chromium/base/supplier/OneShotCallback.java",
- "base/android/java/src/org/chromium/base/supplier/OneshotSupplier.java",
- "base/android/java/src/org/chromium/base/supplier/OneshotSupplierImpl.java",
- "base/android/java/src/org/chromium/base/supplier/Supplier.java",
- "base/android/java/src/org/chromium/base/supplier/UnownedUserDataSupplier.java",
- "base/android/java/src/org/chromium/base/task/AsyncTask.java",
- "base/android/java/src/org/chromium/base/task/BackgroundOnlyAsyncTask.java",
- "base/android/java/src/org/chromium/base/task/ChainedTasks.java",
- "base/android/java/src/org/chromium/base/task/ChoreographerTaskRunner.java",
- "base/android/java/src/org/chromium/base/task/ChromeThreadPoolExecutor.java",
- "base/android/java/src/org/chromium/base/task/DefaultTaskExecutor.java",
- "base/android/java/src/org/chromium/base/task/PostTask.java",
- "base/android/java/src/org/chromium/base/task/SequencedTaskRunner.java",
- "base/android/java/src/org/chromium/base/task/SequencedTaskRunnerImpl.java",
- "base/android/java/src/org/chromium/base/task/SerialExecutor.java",
- "base/android/java/src/org/chromium/base/task/SingleThreadTaskRunner.java",
- "base/android/java/src/org/chromium/base/task/SingleThreadTaskRunnerImpl.java",
- "base/android/java/src/org/chromium/base/task/TaskExecutor.java",
- "base/android/java/src/org/chromium/base/task/TaskRunner.java",
- "base/android/java/src/org/chromium/base/task/TaskRunnerImpl.java",
- "base/android/java/src/org/chromium/base/task/TaskTraits.java",
- "base/android/java/src/org/chromium/base/task/TaskTraitsExtensionDescriptor.java",
- "build/android/java/src/org/chromium/build/annotations/AlwaysInline.java",
- "build/android/java/src/org/chromium/build/annotations/CheckDiscard.java",
- "build/android/java/src/org/chromium/build/annotations/DoNotClassMerge.java",
- "build/android/java/src/org/chromium/build/annotations/DoNotInline.java",
- "build/android/java/src/org/chromium/build/annotations/IdentifierNameString.java",
- "build/android/java/src/org/chromium/build/annotations/MainDex.java",
- "build/android/java/src/org/chromium/build/annotations/MockedInTests.java",
- "build/android/java/src/org/chromium/build/annotations/UsedByReflection.java",
- "components/cronet/android/java/src/org/chromium/net/impl/BidirectionalStreamBuilderImpl.java",
- "components/cronet/android/java/src/org/chromium/net/impl/BidirectionalStreamNetworkException.java",
- "components/cronet/android/java/src/org/chromium/net/impl/CallbackExceptionImpl.java",
- "components/cronet/android/java/src/org/chromium/net/impl/CronetBidirectionalStream.java",
- "components/cronet/android/java/src/org/chromium/net/impl/CronetEngineBase.java",
- "components/cronet/android/java/src/org/chromium/net/impl/CronetEngineBuilderImpl.java",
- "components/cronet/android/java/src/org/chromium/net/impl/CronetExceptionImpl.java",
- "components/cronet/android/java/src/org/chromium/net/impl/CronetLibraryLoader.java",
- "components/cronet/android/java/src/org/chromium/net/impl/CronetLogger.java",
- "components/cronet/android/java/src/org/chromium/net/impl/CronetLoggerFactory.java",
- "components/cronet/android/java/src/org/chromium/net/impl/CronetManifest.java",
- "components/cronet/android/java/src/org/chromium/net/impl/CronetMetrics.java",
- "components/cronet/android/java/src/org/chromium/net/impl/CronetUploadDataStream.java",
- "components/cronet/android/java/src/org/chromium/net/impl/CronetUrlRequest.java",
- "components/cronet/android/java/src/org/chromium/net/impl/CronetUrlRequestContext.java",
- "components/cronet/android/java/src/org/chromium/net/impl/NativeCronetEngineBuilderImpl.java",
- "components/cronet/android/java/src/org/chromium/net/impl/NetworkExceptionImpl.java",
- "components/cronet/android/java/src/org/chromium/net/impl/NoOpLogger.java",
- "components/cronet/android/java/src/org/chromium/net/impl/Preconditions.java",
- "components/cronet/android/java/src/org/chromium/net/impl/QuicExceptionImpl.java",
- "components/cronet/android/java/src/org/chromium/net/impl/RequestFinishedInfoImpl.java",
- "components/cronet/android/java/src/org/chromium/net/impl/UrlRequestBase.java",
- "components/cronet/android/java/src/org/chromium/net/impl/UrlRequestBuilderImpl.java",
- "components/cronet/android/java/src/org/chromium/net/impl/UrlResponseInfoImpl.java",
- "components/cronet/android/java/src/org/chromium/net/impl/UserAgent.java",
- "components/cronet/android/java/src/org/chromium/net/impl/VersionSafeCallbacks.java",
- "components/cronet/android/java/src/org/chromium/net/urlconnection/CronetBufferedOutputStream.java",
- "components/cronet/android/java/src/org/chromium/net/urlconnection/CronetChunkedOutputStream.java",
- "components/cronet/android/java/src/org/chromium/net/urlconnection/CronetFixedModeOutputStream.java",
- "components/cronet/android/java/src/org/chromium/net/urlconnection/CronetHttpURLConnection.java",
- "components/cronet/android/java/src/org/chromium/net/urlconnection/CronetHttpURLStreamHandler.java",
- "components/cronet/android/java/src/org/chromium/net/urlconnection/CronetInputStream.java",
- "components/cronet/android/java/src/org/chromium/net/urlconnection/CronetOutputStream.java",
- "components/cronet/android/java/src/org/chromium/net/urlconnection/CronetURLStreamHandlerFactory.java",
- "components/cronet/android/java/src/org/chromium/net/urlconnection/MessageLoop.java",
- "net/android/java/src/org/chromium/net/AndroidCertVerifyResult.java",
- "net/android/java/src/org/chromium/net/AndroidKeyStore.java",
- "net/android/java/src/org/chromium/net/AndroidNetworkLibrary.java",
- "net/android/java/src/org/chromium/net/AndroidTrafficStats.java",
- "net/android/java/src/org/chromium/net/ChromiumNetworkAdapter.java",
- "net/android/java/src/org/chromium/net/DnsStatus.java",
- "net/android/java/src/org/chromium/net/GURLUtils.java",
- "net/android/java/src/org/chromium/net/HttpNegotiateAuthenticator.java",
- "net/android/java/src/org/chromium/net/HttpNegotiateConstants.java",
- "net/android/java/src/org/chromium/net/HttpUtil.java",
- "net/android/java/src/org/chromium/net/MimeTypeFilter.java",
- "net/android/java/src/org/chromium/net/NetStringUtil.java",
- "net/android/java/src/org/chromium/net/NetworkActiveNotifier.java",
- "net/android/java/src/org/chromium/net/NetworkChangeNotifier.java",
- "net/android/java/src/org/chromium/net/NetworkChangeNotifierAutoDetect.java",
- "net/android/java/src/org/chromium/net/NetworkTrafficAnnotationTag.java",
- "net/android/java/src/org/chromium/net/ProxyBroadcastReceiver.java",
- "net/android/java/src/org/chromium/net/ProxyChangeListener.java",
- "net/android/java/src/org/chromium/net/RegistrationPolicyAlwaysRegister.java",
- "net/android/java/src/org/chromium/net/RegistrationPolicyApplicationStatus.java",
- "net/android/java/src/org/chromium/net/ThreadStatsUid.java",
- "net/android/java/src/org/chromium/net/X509Util.java",
- "url/android/java/src/org/chromium/url/IDNStringUtil.java",
- ],
- cmd: "current_dir=`basename \\`pwd\\``; " +
- "for f in $(in); " +
- "do " +
- "echo \"../$$current_dir/$$f\" >> $(genDir)/java.sources; " +
- "done; " +
- "python3 $(location base/android/jni_generator/jni_registration_generator.py) --srcjar-path " +
- "$(genDir)/components/cronet/android/cronet_jni_registration.srcjar " +
- "--depfile " +
- "$(genDir)/components/cronet/android/cronet_jni_registration.d " +
- "--sources-files " +
- "$(genDir)/java.sources " +
- "--include_test_only " +
- "--use_proxy_hash " +
- "--header-path " +
- "$(genDir)/components/cronet/android/cronet_jni_registration.h " +
- "--manual_jni_registration " +
- ";sed -i -e 's/OUT_SOONG_.TEMP_SBOX_.*_OUT/GEN/g' " +
- "$(genDir)/components/cronet/android/cronet_jni_registration.h",
- out: [
- "components/cronet/android/cronet_jni_registration.srcjar",
- ],
- tool_files: [
- "base/android/jni_generator/jni_generator.py",
- "base/android/jni_generator/jni_registration_generator.py",
- "build/android/gyp/util/__init__.py",
- "build/android/gyp/util/build_utils.py",
- "build/gn_helpers.py",
- ],
-}
-
-// GN: //components/cronet/android:cronet_jni_registration__testing
-cc_genrule {
- name: "cronet_aml_components_cronet_android_cronet_jni_registration__testing",
- srcs: [
- "base/android/java/src/org/chromium/base/ActivityState.java",
- "base/android/java/src/org/chromium/base/ApiCompatibilityUtils.java",
- "base/android/java/src/org/chromium/base/ApkAssets.java",
- "base/android/java/src/org/chromium/base/ApplicationStatus.java",
- "base/android/java/src/org/chromium/base/BaseFeatureList.java",
- "base/android/java/src/org/chromium/base/BuildInfo.java",
- "base/android/java/src/org/chromium/base/BundleUtils.java",
- "base/android/java/src/org/chromium/base/ByteArrayGenerator.java",
- "base/android/java/src/org/chromium/base/Callback.java",
- "base/android/java/src/org/chromium/base/CallbackController.java",
- "base/android/java/src/org/chromium/base/CollectionUtil.java",
- "base/android/java/src/org/chromium/base/CommandLine.java",
- "base/android/java/src/org/chromium/base/CommandLineInitUtil.java",
- "base/android/java/src/org/chromium/base/Consumer.java",
- "base/android/java/src/org/chromium/base/ContentUriUtils.java",
- "base/android/java/src/org/chromium/base/ContextUtils.java",
- "base/android/java/src/org/chromium/base/CpuFeatures.java",
- "base/android/java/src/org/chromium/base/DiscardableReferencePool.java",
- "base/android/java/src/org/chromium/base/EarlyTraceEvent.java",
- "base/android/java/src/org/chromium/base/EventLog.java",
- "base/android/java/src/org/chromium/base/FeatureList.java",
- "base/android/java/src/org/chromium/base/Features.java",
- "base/android/java/src/org/chromium/base/FieldTrialList.java",
- "base/android/java/src/org/chromium/base/FileUtils.java",
- "base/android/java/src/org/chromium/base/Function.java",
- "base/android/java/src/org/chromium/base/ImportantFileWriterAndroid.java",
- "base/android/java/src/org/chromium/base/IntStringCallback.java",
- "base/android/java/src/org/chromium/base/JNIUtils.java",
- "base/android/java/src/org/chromium/base/JavaExceptionReporter.java",
- "base/android/java/src/org/chromium/base/JavaHandlerThread.java",
- "base/android/java/src/org/chromium/base/JniException.java",
- "base/android/java/src/org/chromium/base/JniStaticTestMocker.java",
- "base/android/java/src/org/chromium/base/LifetimeAssert.java",
- "base/android/java/src/org/chromium/base/LocaleUtils.java",
- "base/android/java/src/org/chromium/base/Log.java",
- "base/android/java/src/org/chromium/base/MathUtils.java",
- "base/android/java/src/org/chromium/base/MemoryPressureListener.java",
- "base/android/java/src/org/chromium/base/NativeLibraryLoadedStatus.java",
- "base/android/java/src/org/chromium/base/ObserverList.java",
- "base/android/java/src/org/chromium/base/PackageManagerUtils.java",
- "base/android/java/src/org/chromium/base/PackageUtils.java",
- "base/android/java/src/org/chromium/base/PathService.java",
- "base/android/java/src/org/chromium/base/PathUtils.java",
- "base/android/java/src/org/chromium/base/PiiElider.java",
- "base/android/java/src/org/chromium/base/PowerMonitor.java",
- "base/android/java/src/org/chromium/base/PowerMonitorForQ.java",
- "base/android/java/src/org/chromium/base/Predicate.java",
- "base/android/java/src/org/chromium/base/Promise.java",
- "base/android/java/src/org/chromium/base/RadioUtils.java",
- "base/android/java/src/org/chromium/base/StreamUtil.java",
- "base/android/java/src/org/chromium/base/StrictModeContext.java",
- "base/android/java/src/org/chromium/base/SysUtils.java",
- "base/android/java/src/org/chromium/base/ThreadUtils.java",
- "base/android/java/src/org/chromium/base/TimeUtils.java",
- "base/android/java/src/org/chromium/base/TimezoneUtils.java",
- "base/android/java/src/org/chromium/base/TraceEvent.java",
- "base/android/java/src/org/chromium/base/UnguessableToken.java",
- "base/android/java/src/org/chromium/base/UnownedUserData.java",
- "base/android/java/src/org/chromium/base/UnownedUserDataHost.java",
- "base/android/java/src/org/chromium/base/UnownedUserDataKey.java",
- "base/android/java/src/org/chromium/base/UserData.java",
- "base/android/java/src/org/chromium/base/UserDataHost.java",
- "base/android/java/src/org/chromium/base/WrappedClassLoader.java",
- "base/android/java/src/org/chromium/base/annotations/AccessedByNative.java",
- "base/android/java/src/org/chromium/base/annotations/CalledByNative.java",
- "base/android/java/src/org/chromium/base/annotations/CalledByNativeForTesting.java",
- "base/android/java/src/org/chromium/base/annotations/CalledByNativeUnchecked.java",
- "base/android/java/src/org/chromium/base/annotations/JNIAdditionalImport.java",
- "base/android/java/src/org/chromium/base/annotations/JNINamespace.java",
- "base/android/java/src/org/chromium/base/annotations/JniIgnoreNatives.java",
- "base/android/java/src/org/chromium/base/annotations/NativeClassQualifiedName.java",
- "base/android/java/src/org/chromium/base/annotations/NativeMethods.java",
- "base/android/java/src/org/chromium/base/compat/ApiHelperForM.java",
- "base/android/java/src/org/chromium/base/compat/ApiHelperForN.java",
- "base/android/java/src/org/chromium/base/compat/ApiHelperForO.java",
- "base/android/java/src/org/chromium/base/compat/ApiHelperForOMR1.java",
- "base/android/java/src/org/chromium/base/compat/ApiHelperForP.java",
- "base/android/java/src/org/chromium/base/compat/ApiHelperForQ.java",
- "base/android/java/src/org/chromium/base/compat/ApiHelperForR.java",
- "base/android/java/src/org/chromium/base/compat/ApiHelperForS.java",
- "base/android/java/src/org/chromium/base/jank_tracker/DummyJankTracker.java",
- "base/android/java/src/org/chromium/base/jank_tracker/FrameMetrics.java",
- "base/android/java/src/org/chromium/base/jank_tracker/FrameMetricsListener.java",
- "base/android/java/src/org/chromium/base/jank_tracker/FrameMetricsStore.java",
- "base/android/java/src/org/chromium/base/jank_tracker/JankActivityTracker.java",
- "base/android/java/src/org/chromium/base/jank_tracker/JankMetricCalculator.java",
- "base/android/java/src/org/chromium/base/jank_tracker/JankMetricUMARecorder.java",
- "base/android/java/src/org/chromium/base/jank_tracker/JankMetrics.java",
- "base/android/java/src/org/chromium/base/jank_tracker/JankReportingRunnable.java",
- "base/android/java/src/org/chromium/base/jank_tracker/JankReportingScheduler.java",
- "base/android/java/src/org/chromium/base/jank_tracker/JankScenario.java",
- "base/android/java/src/org/chromium/base/jank_tracker/JankTracker.java",
- "base/android/java/src/org/chromium/base/jank_tracker/JankTrackerImpl.java",
- "base/android/java/src/org/chromium/base/library_loader/LegacyLinker.java",
- "base/android/java/src/org/chromium/base/library_loader/LibraryLoader.java",
- "base/android/java/src/org/chromium/base/library_loader/LibraryPrefetcher.java",
- "base/android/java/src/org/chromium/base/library_loader/Linker.java",
- "base/android/java/src/org/chromium/base/library_loader/LinkerJni.java",
- "base/android/java/src/org/chromium/base/library_loader/LoaderErrors.java",
- "base/android/java/src/org/chromium/base/library_loader/ModernLinker.java",
- "base/android/java/src/org/chromium/base/library_loader/ModernLinkerJni.java",
- "base/android/java/src/org/chromium/base/library_loader/NativeLibraryPreloader.java",
- "base/android/java/src/org/chromium/base/library_loader/ProcessInitException.java",
- "base/android/java/src/org/chromium/base/lifetime/DestroyChecker.java",
- "base/android/java/src/org/chromium/base/lifetime/Destroyable.java",
- "base/android/java/src/org/chromium/base/memory/JavaHeapDumpGenerator.java",
- "base/android/java/src/org/chromium/base/memory/MemoryPressureCallback.java",
- "base/android/java/src/org/chromium/base/memory/MemoryPressureMonitor.java",
- "base/android/java/src/org/chromium/base/memory/MemoryPressureUma.java",
- "base/android/java/src/org/chromium/base/memory/MemoryPurgeManager.java",
- "base/android/java/src/org/chromium/base/metrics/CachingUmaRecorder.java",
- "base/android/java/src/org/chromium/base/metrics/NativeUmaRecorder.java",
- "base/android/java/src/org/chromium/base/metrics/NoopUmaRecorder.java",
- "base/android/java/src/org/chromium/base/metrics/RecordHistogram.java",
- "base/android/java/src/org/chromium/base/metrics/RecordUserAction.java",
- "base/android/java/src/org/chromium/base/metrics/ScopedSysTraceEvent.java",
- "base/android/java/src/org/chromium/base/metrics/StatisticsRecorderAndroid.java",
- "base/android/java/src/org/chromium/base/metrics/TimingMetric.java",
- "base/android/java/src/org/chromium/base/metrics/UmaRecorder.java",
- "base/android/java/src/org/chromium/base/metrics/UmaRecorderHolder.java",
- "base/android/java/src/org/chromium/base/supplier/BooleanSupplier.java",
- "base/android/java/src/org/chromium/base/supplier/DestroyableObservableSupplier.java",
- "base/android/java/src/org/chromium/base/supplier/ObservableSupplier.java",
- "base/android/java/src/org/chromium/base/supplier/ObservableSupplierImpl.java",
- "base/android/java/src/org/chromium/base/supplier/OneShotCallback.java",
- "base/android/java/src/org/chromium/base/supplier/OneshotSupplier.java",
- "base/android/java/src/org/chromium/base/supplier/OneshotSupplierImpl.java",
- "base/android/java/src/org/chromium/base/supplier/Supplier.java",
- "base/android/java/src/org/chromium/base/supplier/UnownedUserDataSupplier.java",
- "base/android/java/src/org/chromium/base/task/AsyncTask.java",
- "base/android/java/src/org/chromium/base/task/BackgroundOnlyAsyncTask.java",
- "base/android/java/src/org/chromium/base/task/ChainedTasks.java",
- "base/android/java/src/org/chromium/base/task/ChoreographerTaskRunner.java",
- "base/android/java/src/org/chromium/base/task/ChromeThreadPoolExecutor.java",
- "base/android/java/src/org/chromium/base/task/DefaultTaskExecutor.java",
- "base/android/java/src/org/chromium/base/task/PostTask.java",
- "base/android/java/src/org/chromium/base/task/SequencedTaskRunner.java",
- "base/android/java/src/org/chromium/base/task/SequencedTaskRunnerImpl.java",
- "base/android/java/src/org/chromium/base/task/SerialExecutor.java",
- "base/android/java/src/org/chromium/base/task/SingleThreadTaskRunner.java",
- "base/android/java/src/org/chromium/base/task/SingleThreadTaskRunnerImpl.java",
- "base/android/java/src/org/chromium/base/task/TaskExecutor.java",
- "base/android/java/src/org/chromium/base/task/TaskRunner.java",
- "base/android/java/src/org/chromium/base/task/TaskRunnerImpl.java",
- "base/android/java/src/org/chromium/base/task/TaskTraits.java",
- "base/android/java/src/org/chromium/base/task/TaskTraitsExtensionDescriptor.java",
- "build/android/java/src/org/chromium/build/annotations/AlwaysInline.java",
- "build/android/java/src/org/chromium/build/annotations/CheckDiscard.java",
- "build/android/java/src/org/chromium/build/annotations/DoNotClassMerge.java",
- "build/android/java/src/org/chromium/build/annotations/DoNotInline.java",
- "build/android/java/src/org/chromium/build/annotations/IdentifierNameString.java",
- "build/android/java/src/org/chromium/build/annotations/MainDex.java",
- "build/android/java/src/org/chromium/build/annotations/MockedInTests.java",
- "build/android/java/src/org/chromium/build/annotations/UsedByReflection.java",
- "components/cronet/android/java/src/org/chromium/net/impl/BidirectionalStreamBuilderImpl.java",
- "components/cronet/android/java/src/org/chromium/net/impl/BidirectionalStreamNetworkException.java",
- "components/cronet/android/java/src/org/chromium/net/impl/CallbackExceptionImpl.java",
- "components/cronet/android/java/src/org/chromium/net/impl/CronetBidirectionalStream.java",
- "components/cronet/android/java/src/org/chromium/net/impl/CronetEngineBase.java",
- "components/cronet/android/java/src/org/chromium/net/impl/CronetEngineBuilderImpl.java",
- "components/cronet/android/java/src/org/chromium/net/impl/CronetExceptionImpl.java",
- "components/cronet/android/java/src/org/chromium/net/impl/CronetLibraryLoader.java",
- "components/cronet/android/java/src/org/chromium/net/impl/CronetLogger.java",
- "components/cronet/android/java/src/org/chromium/net/impl/CronetLoggerFactory.java",
- "components/cronet/android/java/src/org/chromium/net/impl/CronetManifest.java",
- "components/cronet/android/java/src/org/chromium/net/impl/CronetMetrics.java",
- "components/cronet/android/java/src/org/chromium/net/impl/CronetUploadDataStream.java",
- "components/cronet/android/java/src/org/chromium/net/impl/CronetUrlRequest.java",
- "components/cronet/android/java/src/org/chromium/net/impl/CronetUrlRequestContext.java",
- "components/cronet/android/java/src/org/chromium/net/impl/NativeCronetEngineBuilderImpl.java",
- "components/cronet/android/java/src/org/chromium/net/impl/NetworkExceptionImpl.java",
- "components/cronet/android/java/src/org/chromium/net/impl/NoOpLogger.java",
- "components/cronet/android/java/src/org/chromium/net/impl/Preconditions.java",
- "components/cronet/android/java/src/org/chromium/net/impl/QuicExceptionImpl.java",
- "components/cronet/android/java/src/org/chromium/net/impl/RequestFinishedInfoImpl.java",
- "components/cronet/android/java/src/org/chromium/net/impl/UrlRequestBase.java",
- "components/cronet/android/java/src/org/chromium/net/impl/UrlRequestBuilderImpl.java",
- "components/cronet/android/java/src/org/chromium/net/impl/UrlResponseInfoImpl.java",
- "components/cronet/android/java/src/org/chromium/net/impl/UserAgent.java",
- "components/cronet/android/java/src/org/chromium/net/impl/VersionSafeCallbacks.java",
- "components/cronet/android/java/src/org/chromium/net/urlconnection/CronetBufferedOutputStream.java",
- "components/cronet/android/java/src/org/chromium/net/urlconnection/CronetChunkedOutputStream.java",
- "components/cronet/android/java/src/org/chromium/net/urlconnection/CronetFixedModeOutputStream.java",
- "components/cronet/android/java/src/org/chromium/net/urlconnection/CronetHttpURLConnection.java",
- "components/cronet/android/java/src/org/chromium/net/urlconnection/CronetHttpURLStreamHandler.java",
- "components/cronet/android/java/src/org/chromium/net/urlconnection/CronetInputStream.java",
- "components/cronet/android/java/src/org/chromium/net/urlconnection/CronetOutputStream.java",
- "components/cronet/android/java/src/org/chromium/net/urlconnection/CronetURLStreamHandlerFactory.java",
- "components/cronet/android/java/src/org/chromium/net/urlconnection/MessageLoop.java",
- "net/android/java/src/org/chromium/net/AndroidCertVerifyResult.java",
- "net/android/java/src/org/chromium/net/AndroidKeyStore.java",
- "net/android/java/src/org/chromium/net/AndroidNetworkLibrary.java",
- "net/android/java/src/org/chromium/net/AndroidTrafficStats.java",
- "net/android/java/src/org/chromium/net/ChromiumNetworkAdapter.java",
- "net/android/java/src/org/chromium/net/DnsStatus.java",
- "net/android/java/src/org/chromium/net/GURLUtils.java",
- "net/android/java/src/org/chromium/net/HttpNegotiateAuthenticator.java",
- "net/android/java/src/org/chromium/net/HttpNegotiateConstants.java",
- "net/android/java/src/org/chromium/net/HttpUtil.java",
- "net/android/java/src/org/chromium/net/MimeTypeFilter.java",
- "net/android/java/src/org/chromium/net/NetStringUtil.java",
- "net/android/java/src/org/chromium/net/NetworkActiveNotifier.java",
- "net/android/java/src/org/chromium/net/NetworkChangeNotifier.java",
- "net/android/java/src/org/chromium/net/NetworkChangeNotifierAutoDetect.java",
- "net/android/java/src/org/chromium/net/NetworkTrafficAnnotationTag.java",
- "net/android/java/src/org/chromium/net/ProxyBroadcastReceiver.java",
- "net/android/java/src/org/chromium/net/ProxyChangeListener.java",
- "net/android/java/src/org/chromium/net/RegistrationPolicyAlwaysRegister.java",
- "net/android/java/src/org/chromium/net/RegistrationPolicyApplicationStatus.java",
- "net/android/java/src/org/chromium/net/ThreadStatsUid.java",
- "net/android/java/src/org/chromium/net/X509Util.java",
- "url/android/java/src/org/chromium/url/IDNStringUtil.java",
- ],
- cmd: "current_dir=`basename \\`pwd\\``; " +
- "for f in $(in); " +
- "do " +
- "echo \"../$$current_dir/$$f\" >> $(genDir)/java.sources; " +
- "done; " +
- "python3 $(location base/android/jni_generator/jni_registration_generator.py) --srcjar-path " +
- "$(genDir)/components/cronet/android/cronet_jni_registration.srcjar " +
- "--depfile " +
- "$(genDir)/components/cronet/android/cronet_jni_registration.d " +
- "--sources-files " +
- "$(genDir)/java.sources " +
- "--include_test_only " +
- "--use_proxy_hash " +
- "--header-path " +
- "$(genDir)/components/cronet/android/cronet_jni_registration.h " +
- "--manual_jni_registration " +
- ";sed -i -e 's/OUT_SOONG_.TEMP_SBOX_.*_OUT/GEN/g' " +
- "$(genDir)/components/cronet/android/cronet_jni_registration.h",
- out: [
- "components/cronet/android/cronet_jni_registration.h",
- "components/cronet/android/cronet_jni_registration.srcjar",
- ],
- tool_files: [
- "base/android/jni_generator/jni_generator.py",
- "base/android/jni_generator/jni_registration_generator.py",
- "build/android/gyp/util/__init__.py",
- "build/android/gyp/util/build_utils.py",
- "build/gn_helpers.py",
- ],
- apex_available: [
- "com.android.tethering",
- ],
-}
-
-// GN: //components/cronet/android:cronet_static
-cc_library_static {
- name: "cronet_aml_components_cronet_android_cronet_static",
- srcs: [
- "components/cronet/android/cronet_bidirectional_stream_adapter.cc",
- "components/cronet/android/cronet_context_adapter.cc",
- "components/cronet/android/cronet_library_loader.cc",
- "components/cronet/android/cronet_upload_data_stream_adapter.cc",
- "components/cronet/android/cronet_url_request_adapter.cc",
- "components/cronet/android/io_buffer_with_byte_buffer.cc",
- "components/cronet/android/url_request_error.cc",
- ],
- shared_libs: [
- "libandroid",
- "liblog",
- "libz",
- ],
- static_libs: [
- "cronet_aml_base_allocator_partition_allocator_partition_alloc",
- "cronet_aml_base_base",
- "cronet_aml_base_base_static",
- "cronet_aml_base_nodebug_assertion",
- "cronet_aml_base_third_party_double_conversion_double_conversion",
- "cronet_aml_base_third_party_dynamic_annotations_dynamic_annotations",
- "cronet_aml_components_cronet_cronet_common",
- "cronet_aml_components_cronet_cronet_version_header",
- "cronet_aml_components_cronet_metrics_util",
- "cronet_aml_components_metrics_library_support",
- "cronet_aml_components_prefs_prefs",
- "cronet_aml_crypto_crypto",
- "cronet_aml_net_dns_dns",
- "cronet_aml_net_dns_public_public",
- "cronet_aml_net_http_transport_security_state_generated_files",
- "cronet_aml_net_net",
- "cronet_aml_net_net_deps",
- "cronet_aml_net_net_public_deps",
- "cronet_aml_net_preload_decoder",
- "cronet_aml_net_third_party_quiche_quiche",
- "cronet_aml_net_traffic_annotation_traffic_annotation",
- "cronet_aml_net_uri_template",
- "cronet_aml_third_party_abseil_cpp_absl_base_base",
- "cronet_aml_third_party_abseil_cpp_absl_base_log_severity",
- "cronet_aml_third_party_abseil_cpp_absl_base_malloc_internal",
- "cronet_aml_third_party_abseil_cpp_absl_base_raw_logging_internal",
- "cronet_aml_third_party_abseil_cpp_absl_base_spinlock_wait",
- "cronet_aml_third_party_abseil_cpp_absl_base_strerror",
- "cronet_aml_third_party_abseil_cpp_absl_base_throw_delegate",
- "cronet_aml_third_party_abseil_cpp_absl_container_hashtablez_sampler",
- "cronet_aml_third_party_abseil_cpp_absl_container_raw_hash_set",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_debugging_internal",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_demangle_internal",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_examine_stack",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_failure_signal_handler",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_stacktrace",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_symbolize",
- "cronet_aml_third_party_abseil_cpp_absl_hash_city",
- "cronet_aml_third_party_abseil_cpp_absl_hash_hash",
- "cronet_aml_third_party_abseil_cpp_absl_hash_low_level_hash",
- "cronet_aml_third_party_abseil_cpp_absl_numeric_int128",
- "cronet_aml_third_party_abseil_cpp_absl_profiling_exponential_biased",
- "cronet_aml_third_party_abseil_cpp_absl_random_distributions",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_platform",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_pool_urbg",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_hwaes",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_hwaes_impl",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_slow",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_seed_material",
- "cronet_aml_third_party_abseil_cpp_absl_random_seed_gen_exception",
- "cronet_aml_third_party_abseil_cpp_absl_random_seed_sequences",
- "cronet_aml_third_party_abseil_cpp_absl_status_status",
- "cronet_aml_third_party_abseil_cpp_absl_status_statusor",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cord",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cord_internal",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_functions",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_handle",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_info",
- "cronet_aml_third_party_abseil_cpp_absl_strings_internal",
- "cronet_aml_third_party_abseil_cpp_absl_strings_str_format_internal",
- "cronet_aml_third_party_abseil_cpp_absl_strings_strings",
- "cronet_aml_third_party_abseil_cpp_absl_synchronization_graphcycles_internal",
- "cronet_aml_third_party_abseil_cpp_absl_synchronization_synchronization",
- "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_civil_time",
- "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_time_zone",
- "cronet_aml_third_party_abseil_cpp_absl_time_time",
- "cronet_aml_third_party_abseil_cpp_absl_types_bad_optional_access",
- "cronet_aml_third_party_abseil_cpp_absl_types_bad_variant_access",
- "cronet_aml_third_party_android_ndk_cpu_features",
- "cronet_aml_third_party_ashmem_ashmem",
- "cronet_aml_third_party_boringssl_boringssl",
- "cronet_aml_third_party_boringssl_boringssl_asm",
- "cronet_aml_third_party_brotli_common",
- "cronet_aml_third_party_brotli_dec",
- "cronet_aml_third_party_icu_icui18n",
- "cronet_aml_third_party_icu_icuuc_private",
- "cronet_aml_third_party_libevent_libevent",
- "cronet_aml_third_party_modp_b64_modp_b64",
- "cronet_aml_third_party_protobuf_protobuf_lite",
- "cronet_aml_url_url",
- ],
- generated_headers: [
- "cronet_aml_base_debugging_buildflags",
- "cronet_aml_base_logging_buildflags",
- "cronet_aml_build_chromeos_buildflags",
- "cronet_aml_components_cronet_android_buildflags",
- "cronet_aml_components_cronet_android_cronet_jni_headers",
- "cronet_aml_components_cronet_android_cronet_jni_registration",
- "cronet_aml_url_buildflags",
- ],
- export_generated_headers: [
- "cronet_aml_base_debugging_buildflags",
- "cronet_aml_base_logging_buildflags",
- "cronet_aml_build_chromeos_buildflags",
- "cronet_aml_components_cronet_android_buildflags",
- "cronet_aml_components_cronet_android_cronet_jni_headers",
- "cronet_aml_components_cronet_android_cronet_jni_registration",
- "cronet_aml_url_buildflags",
- ],
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DGOOGLE_PROTOBUF_INTERNAL_DONATE_STEAL_INLINE=0",
- "-DGOOGLE_PROTOBUF_NO_RTTI",
- "-DGOOGLE_PROTOBUF_NO_STATIC_INITIALIZER",
- "-DHAVE_PTHREAD",
- "-DHAVE_SYS_UIO_H",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_FORTIFY_SOURCE=2",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D__STDC_CONSTANT_MACROS",
- "-D__STDC_FORMAT_MACROS",
- "-Oz",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "net/third_party/quiche/overrides/",
- "net/third_party/quiche/src/",
- "net/third_party/quiche/src/quiche/common/platform/default/",
- "third_party/abseil-cpp/",
- "third_party/boringssl/src/include/",
- "third_party/protobuf/src/",
- ],
- cpp_std: "c++17",
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- "-Wl,--script,external/cronet/base/android/library_loader/anchor_functions.lds",
- "-Wl,-wrap,asprintf",
- "-Wl,-wrap,calloc",
- "-Wl,-wrap,free",
- "-Wl,-wrap,getcwd",
- "-Wl,-wrap,malloc",
- "-Wl,-wrap,malloc_usable_size",
- "-Wl,-wrap,memalign",
- "-Wl,-wrap,posix_memalign",
- "-Wl,-wrap,pvalloc",
- "-Wl,-wrap,realloc",
- "-Wl,-wrap,realpath",
- "-Wl,-wrap,strdup",
- "-Wl,-wrap,strndup",
- "-Wl,-wrap,valloc",
- "-Wl,-wrap,vasprintf",
- ],
- target: {
- android_arm: {
- cflags: [
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-fstack-protector",
- "-msse3",
- ],
- },
- },
-}
-
-// GN: //components/cronet/android:cronet_static__testing
-cc_library_static {
- name: "cronet_aml_components_cronet_android_cronet_static__testing",
- srcs: [
- "components/cronet/android/cronet_bidirectional_stream_adapter.cc",
- "components/cronet/android/cronet_context_adapter.cc",
- "components/cronet/android/cronet_library_loader.cc",
- "components/cronet/android/cronet_upload_data_stream_adapter.cc",
- "components/cronet/android/cronet_url_request_adapter.cc",
- "components/cronet/android/io_buffer_with_byte_buffer.cc",
- "components/cronet/android/url_request_error.cc",
- ],
- shared_libs: [
- "libandroid",
- "liblog",
- "libz",
- ],
- static_libs: [
- "cronet_aml_base_allocator_partition_allocator_partition_alloc__testing",
- "cronet_aml_base_base__testing",
- "cronet_aml_base_base_static__testing",
- "cronet_aml_base_nodebug_assertion__testing",
- "cronet_aml_base_third_party_double_conversion_double_conversion__testing",
- "cronet_aml_base_third_party_dynamic_annotations_dynamic_annotations__testing",
- "cronet_aml_components_cronet_cronet_common__testing",
- "cronet_aml_components_cronet_cronet_version_header__testing",
- "cronet_aml_components_cronet_metrics_util__testing",
- "cronet_aml_components_metrics_library_support__testing",
- "cronet_aml_components_prefs_prefs__testing",
- "cronet_aml_crypto_crypto__testing",
- "cronet_aml_net_dns_dns__testing",
- "cronet_aml_net_dns_public_public__testing",
- "cronet_aml_net_http_transport_security_state_generated_files__testing",
- "cronet_aml_net_net__testing",
- "cronet_aml_net_net_deps__testing",
- "cronet_aml_net_net_public_deps__testing",
- "cronet_aml_net_preload_decoder__testing",
- "cronet_aml_net_third_party_quiche_quiche__testing",
- "cronet_aml_net_traffic_annotation_traffic_annotation__testing",
- "cronet_aml_net_uri_template__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_base__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_log_severity__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_malloc_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_raw_logging_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_spinlock_wait__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_strerror__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_throw_delegate__testing",
- "cronet_aml_third_party_abseil_cpp_absl_container_hashtablez_sampler__testing",
- "cronet_aml_third_party_abseil_cpp_absl_container_raw_hash_set__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_debugging_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_demangle_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_examine_stack__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_failure_signal_handler__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_stacktrace__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_symbolize__testing",
- "cronet_aml_third_party_abseil_cpp_absl_hash_city__testing",
- "cronet_aml_third_party_abseil_cpp_absl_hash_hash__testing",
- "cronet_aml_third_party_abseil_cpp_absl_hash_low_level_hash__testing",
- "cronet_aml_third_party_abseil_cpp_absl_numeric_int128__testing",
- "cronet_aml_third_party_abseil_cpp_absl_profiling_exponential_biased__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_distributions__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_platform__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_pool_urbg__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_hwaes__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_hwaes_impl__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_slow__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_seed_material__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_seed_gen_exception__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_seed_sequences__testing",
- "cronet_aml_third_party_abseil_cpp_absl_status_status__testing",
- "cronet_aml_third_party_abseil_cpp_absl_status_statusor__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cord__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cord_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_functions__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_handle__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_info__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_str_format_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_strings__testing",
- "cronet_aml_third_party_abseil_cpp_absl_synchronization_graphcycles_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_synchronization_synchronization__testing",
- "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_civil_time__testing",
- "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_time_zone__testing",
- "cronet_aml_third_party_abseil_cpp_absl_time_time__testing",
- "cronet_aml_third_party_abseil_cpp_absl_types_bad_optional_access__testing",
- "cronet_aml_third_party_abseil_cpp_absl_types_bad_variant_access__testing",
- "cronet_aml_third_party_android_ndk_cpu_features__testing",
- "cronet_aml_third_party_ashmem_ashmem__testing",
- "cronet_aml_third_party_boringssl_boringssl__testing",
- "cronet_aml_third_party_boringssl_boringssl_asm__testing",
- "cronet_aml_third_party_brotli_common__testing",
- "cronet_aml_third_party_brotli_dec__testing",
- "cronet_aml_third_party_icu_icui18n__testing",
- "cronet_aml_third_party_icu_icuuc_private__testing",
- "cronet_aml_third_party_libevent_libevent__testing",
- "cronet_aml_third_party_modp_b64_modp_b64__testing",
- "cronet_aml_third_party_protobuf_protobuf_lite__testing",
- "cronet_aml_url_url__testing",
- ],
- generated_headers: [
- "cronet_aml_base_debugging_buildflags__testing",
- "cronet_aml_base_logging_buildflags__testing",
- "cronet_aml_build_chromeos_buildflags__testing",
- "cronet_aml_components_cronet_android_buildflags__testing",
- "cronet_aml_components_cronet_android_cronet_jni_headers__testing",
- "cronet_aml_components_cronet_android_cronet_jni_registration__testing",
- "cronet_aml_url_buildflags__testing",
- ],
- export_generated_headers: [
- "cronet_aml_base_debugging_buildflags__testing",
- "cronet_aml_base_logging_buildflags__testing",
- "cronet_aml_build_chromeos_buildflags__testing",
- "cronet_aml_components_cronet_android_buildflags__testing",
- "cronet_aml_components_cronet_android_cronet_jni_headers__testing",
- "cronet_aml_components_cronet_android_cronet_jni_registration__testing",
- "cronet_aml_url_buildflags__testing",
- ],
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DGOOGLE_PROTOBUF_INTERNAL_DONATE_STEAL_INLINE=0",
- "-DGOOGLE_PROTOBUF_NO_RTTI",
- "-DGOOGLE_PROTOBUF_NO_STATIC_INITIALIZER",
- "-DHAVE_PTHREAD",
- "-DHAVE_SYS_UIO_H",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_FORTIFY_SOURCE=2",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D__STDC_CONSTANT_MACROS",
- "-D__STDC_FORMAT_MACROS",
- "-Oz",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "net/third_party/quiche/overrides/",
- "net/third_party/quiche/src/",
- "net/third_party/quiche/src/quiche/common/platform/default/",
- "third_party/abseil-cpp/",
- "third_party/boringssl/src/include/",
- "third_party/protobuf/src/",
- ],
- cpp_std: "c++17",
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- "-Wl,--script,external/cronet/base/android/library_loader/anchor_functions.lds",
- "-Wl,-wrap,asprintf",
- "-Wl,-wrap,calloc",
- "-Wl,-wrap,free",
- "-Wl,-wrap,getcwd",
- "-Wl,-wrap,malloc",
- "-Wl,-wrap,malloc_usable_size",
- "-Wl,-wrap,memalign",
- "-Wl,-wrap,posix_memalign",
- "-Wl,-wrap,pvalloc",
- "-Wl,-wrap,realloc",
- "-Wl,-wrap,realpath",
- "-Wl,-wrap,strdup",
- "-Wl,-wrap,strndup",
- "-Wl,-wrap,valloc",
- "-Wl,-wrap,vasprintf",
- ],
- target: {
- android_arm: {
- cflags: [
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-fstack-protector",
- "-msse3",
- ],
- },
- },
-}
-
-// GN: //components/cronet/android:cronet_unittests_android__library__testing
-cc_library_shared {
- name: "cronet_aml_components_cronet_android_cronet_unittests_android__library__testing",
- srcs: [
- "components/cronet/run_all_unittests.cc",
- ],
- shared_libs: [
- "libandroid",
- "liblog",
- "libz",
- ],
- static_libs: [
- "cronet_aml_base_allocator_partition_allocator_partition_alloc__testing",
- "cronet_aml_base_base__testing",
- "cronet_aml_base_base_static__testing",
- "cronet_aml_base_i18n__testing",
- "cronet_aml_base_nodebug_assertion__testing",
- "cronet_aml_base_test_test_config__testing",
- "cronet_aml_base_test_test_support__testing",
- "cronet_aml_base_third_party_double_conversion_double_conversion__testing",
- "cronet_aml_base_third_party_dynamic_annotations_dynamic_annotations__testing",
- "cronet_aml_buildtools_third_party_libc___libc____testing",
- "cronet_aml_buildtools_third_party_libc__abi_libc__abi__testing",
- "cronet_aml_components_cronet_android_cronet_static__testing",
- "cronet_aml_components_cronet_cronet_common__testing",
- "cronet_aml_components_cronet_cronet_common_unittests__testing",
- "cronet_aml_components_cronet_cronet_version_header__testing",
- "cronet_aml_components_cronet_metrics_util__testing",
- "cronet_aml_components_metrics_library_support__testing",
- "cronet_aml_components_prefs_prefs__testing",
- "cronet_aml_components_prefs_test_support__testing",
- "cronet_aml_crypto_crypto__testing",
- "cronet_aml_net_dns_dns__testing",
- "cronet_aml_net_dns_public_public__testing",
- "cronet_aml_net_dns_test_support__testing",
- "cronet_aml_net_gtest_util__testing",
- "cronet_aml_net_http_transport_security_state_generated_files__testing",
- "cronet_aml_net_net__testing",
- "cronet_aml_net_net_deps__testing",
- "cronet_aml_net_net_public_deps__testing",
- "cronet_aml_net_preload_decoder__testing",
- "cronet_aml_net_quic_test_flags_utils__testing",
- "cronet_aml_net_simple_quic_tools__testing",
- "cronet_aml_net_test_support__testing",
- "cronet_aml_net_third_party_quiche_quiche__testing",
- "cronet_aml_net_third_party_quiche_quiche_tool_support__testing",
- "cronet_aml_net_tools_tld_cleanup_tld_cleanup__testing",
- "cronet_aml_net_traffic_annotation_traffic_annotation__testing",
- "cronet_aml_net_uri_template__testing",
- "cronet_aml_testing_android_native_test_native_test_native_code__testing",
- "cronet_aml_testing_android_native_test_native_test_support__testing",
- "cronet_aml_testing_gtest_gtest__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_base__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_log_severity__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_malloc_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_raw_logging_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_spinlock_wait__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_strerror__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_throw_delegate__testing",
- "cronet_aml_third_party_abseil_cpp_absl_container_hashtablez_sampler__testing",
- "cronet_aml_third_party_abseil_cpp_absl_container_raw_hash_set__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_debugging_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_demangle_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_examine_stack__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_failure_signal_handler__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_stacktrace__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_symbolize__testing",
- "cronet_aml_third_party_abseil_cpp_absl_hash_city__testing",
- "cronet_aml_third_party_abseil_cpp_absl_hash_hash__testing",
- "cronet_aml_third_party_abseil_cpp_absl_hash_low_level_hash__testing",
- "cronet_aml_third_party_abseil_cpp_absl_numeric_int128__testing",
- "cronet_aml_third_party_abseil_cpp_absl_profiling_exponential_biased__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_distributions__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_platform__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_pool_urbg__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_hwaes__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_hwaes_impl__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_slow__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_seed_material__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_seed_gen_exception__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_seed_sequences__testing",
- "cronet_aml_third_party_abseil_cpp_absl_status_status__testing",
- "cronet_aml_third_party_abseil_cpp_absl_status_statusor__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cord__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cord_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_functions__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_handle__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_info__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_str_format_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_strings__testing",
- "cronet_aml_third_party_abseil_cpp_absl_synchronization_graphcycles_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_synchronization_synchronization__testing",
- "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_civil_time__testing",
- "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_time_zone__testing",
- "cronet_aml_third_party_abseil_cpp_absl_time_time__testing",
- "cronet_aml_third_party_abseil_cpp_absl_types_bad_optional_access__testing",
- "cronet_aml_third_party_abseil_cpp_absl_types_bad_variant_access__testing",
- "cronet_aml_third_party_android_ndk_cpu_features__testing",
- "cronet_aml_third_party_ashmem_ashmem__testing",
- "cronet_aml_third_party_boringssl_boringssl__testing",
- "cronet_aml_third_party_boringssl_boringssl_asm__testing",
- "cronet_aml_third_party_brotli_common__testing",
- "cronet_aml_third_party_brotli_dec__testing",
- "cronet_aml_third_party_ced_ced__testing",
- "cronet_aml_third_party_googletest_gmock__testing",
- "cronet_aml_third_party_googletest_gtest__testing",
- "cronet_aml_third_party_icu_icui18n__testing",
- "cronet_aml_third_party_icu_icuuc_private__testing",
- "cronet_aml_third_party_libevent_libevent__testing",
- "cronet_aml_third_party_libxml_libxml__testing",
- "cronet_aml_third_party_libxml_libxml_utils__testing",
- "cronet_aml_third_party_libxml_xml_reader__testing",
- "cronet_aml_third_party_modp_b64_modp_b64__testing",
- "cronet_aml_third_party_protobuf_protobuf_lite__testing",
- "cronet_aml_url_url__testing",
- ],
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DGOOGLE_PROTOBUF_INTERNAL_DONATE_STEAL_INLINE=0",
- "-DGOOGLE_PROTOBUF_NO_RTTI",
- "-DGOOGLE_PROTOBUF_NO_STATIC_INITIALIZER",
- "-DGTEST_API_=",
- "-DGTEST_HAS_ABSL=1",
- "-DGTEST_HAS_POSIX_RE=0",
- "-DGTEST_HAS_TR1_TUPLE=0",
- "-DGTEST_LANG_CXX11=1",
- "-DHAVE_PTHREAD",
- "-DHAVE_SYS_UIO_H",
- "-DICU_UTIL_DATA_IMPL=ICU_UTIL_DATA_FILE",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-DUNIT_TEST",
- "-DUSE_CHROMIUM_ICU=1",
- "-DUSE_REMOTE_TEST_SERVER",
- "-DU_ENABLE_DYLOAD=0",
- "-DU_ENABLE_RESOURCE_TRACING=0",
- "-DU_ENABLE_TRACING=1",
- "-DU_STATIC_IMPLEMENTATION",
- "-DU_USING_ICU_NAMESPACE=0",
- "-D_FORTIFY_SOURCE=2",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D__STDC_CONSTANT_MACROS",
- "-D__STDC_FORMAT_MACROS",
- "-Oz",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "net/third_party/quiche/overrides/",
- "net/third_party/quiche/src/",
- "net/third_party/quiche/src/quiche/common/platform/default/",
- "third_party/abseil-cpp/",
- "third_party/boringssl/src/include/",
- "third_party/ced/src/",
- "third_party/googletest/custom/",
- "third_party/googletest/src/googlemock/include/",
- "third_party/googletest/src/googletest/include/",
- "third_party/icu/source/common/",
- "third_party/icu/source/i18n/",
- "third_party/protobuf/src/",
- ],
- cpp_std: "c++17",
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- "-Wl,--script,external/cronet/base/android/library_loader/anchor_functions.lds",
- "-Wl,-wrap,asprintf",
- "-Wl,-wrap,calloc",
- "-Wl,-wrap,free",
- "-Wl,-wrap,getcwd",
- "-Wl,-wrap,malloc",
- "-Wl,-wrap,malloc_usable_size",
- "-Wl,-wrap,memalign",
- "-Wl,-wrap,posix_memalign",
- "-Wl,-wrap,pvalloc",
- "-Wl,-wrap,realloc",
- "-Wl,-wrap,realpath",
- "-Wl,-wrap,strdup",
- "-Wl,-wrap,strndup",
- "-Wl,-wrap,valloc",
- "-Wl,-wrap,vasprintf",
- ],
- stem: "libcronet_unittests_android__library",
- target: {
- android_arm: {
- cflags: [
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-fstack-protector",
- "-msse3",
- ],
- },
- },
-}
-
-// GN: //components/cronet/android:http_cache_type_java
-java_genrule {
- name: "cronet_aml_components_cronet_android_http_cache_type_java",
- cmd: "$(location build/android/gyp/java_cpp_enum.py) --srcjar " +
- "$(out) " +
- "$(location components/cronet/url_request_context_config.h)",
- out: [
- "components/cronet/android/http_cache_type_java.srcjar",
- ],
- tool_files: [
- "build/android/gyp/java_cpp_enum.py",
- "build/android/gyp/util/__init__.py",
- "build/android/gyp/util/build_utils.py",
- "build/android/gyp/util/java_cpp_utils.py",
- "build/gn_helpers.py",
- "components/cronet/url_request_context_config.h",
- ],
-}
-
-// GN: //components/cronet/android:implementation_api_version
-java_genrule {
- name: "cronet_aml_components_cronet_android_implementation_api_version",
- cmd: "$(location build/util/version.py) --official " +
- "-f " +
- "$(location chrome/VERSION) " +
- "-f " +
- "$(location build/util/LASTCHANGE) " +
- "-e " +
- "'API_LEVEL=19' " +
- "-o " +
- "$(out) " +
- "$(location components/cronet/android/java/src/org/chromium/net/impl/ImplVersion.template)",
- out: [
- "components/cronet/android/templates/org/chromium/net/impl/ImplVersion.java",
- ],
- tool_files: [
- "build/util/LASTCHANGE",
- "build/util/android_chrome_version.py",
- "build/util/version.py",
- "chrome/VERSION",
- "components/cronet/android/java/src/org/chromium/net/impl/ImplVersion.template",
- ],
-}
-
-// GN: //components/cronet/android:integrated_mode_state
-genrule {
- name: "cronet_aml_components_cronet_android_integrated_mode_state",
- srcs: [
- ":cronet_aml_components_cronet_android_integrated_mode_state_preprocess",
- ],
- tools: [
- "soong_zip",
- ],
- cmd: "cp $(in) $(genDir)/IntegratedModeState.java && " +
- "$(location soong_zip) -o $(out) -srcjar -C $(genDir) -f $(genDir)/IntegratedModeState.java",
- out: [
- "IntegratedModeState.srcjar",
- ],
-}
-
-// GN: //components/cronet/android:integrated_mode_state
-cc_object {
- name: "cronet_aml_components_cronet_android_integrated_mode_state_preprocess",
- srcs: [
- ":cronet_aml_components_cronet_android_integrated_mode_state_rename",
- ],
- cflags: [
- "-DANDROID",
- "-E",
- "-P",
- ],
- compile_multilib: "first",
-}
-
-// GN: //components/cronet/android:integrated_mode_state
-genrule {
- name: "cronet_aml_components_cronet_android_integrated_mode_state_rename",
- srcs: [
- "components/cronet/android/java/src/org/chromium/net/impl/IntegratedModeState.template",
- ],
- cmd: "cp $(in) $(out)",
- out: [
- "IntegratedModeState.cc",
- ],
-}
-
-// GN: //components/cronet/android:interface_api_version
-java_genrule {
- name: "cronet_aml_components_cronet_android_interface_api_version",
- cmd: "$(location build/util/version.py) --official " +
- "-f " +
- "$(location chrome/VERSION) " +
- "-f " +
- "$(location build/util/LASTCHANGE) " +
- "-e " +
- "'API_LEVEL=19' " +
- "-o " +
- "$(out) " +
- "$(location components/cronet/android/api/src/android/net/http/ApiVersion.template)",
- out: [
- "components/cronet/android/templates/org/chromium/net/ApiVersion.java",
- ],
- tool_files: [
- "build/util/LASTCHANGE",
- "build/util/android_chrome_version.py",
- "build/util/version.py",
- "chrome/VERSION",
- "components/cronet/android/api/src/android/net/http/ApiVersion.template",
- ],
-}
-
-// GN: //components/cronet/android:load_states_list
-genrule {
- name: "cronet_aml_components_cronet_android_load_states_list",
- srcs: [
- ":cronet_aml_components_cronet_android_load_states_list_preprocess",
- ],
- tools: [
- "soong_zip",
- ],
- cmd: "cp $(in) $(genDir)/LoadState.java && " +
- "$(location soong_zip) -o $(out) -srcjar -C $(genDir) -f $(genDir)/LoadState.java",
- out: [
- "LoadState.srcjar",
- ],
-}
-
-// GN: //components/cronet/android:load_states_list
-cc_object {
- name: "cronet_aml_components_cronet_android_load_states_list_preprocess",
- srcs: [
- ":cronet_aml_components_cronet_android_load_states_list_rename",
- ],
- cflags: [
- "-DANDROID",
- "-E",
- "-P",
- ],
- compile_multilib: "first",
-}
-
-// GN: //components/cronet/android:load_states_list
-genrule {
- name: "cronet_aml_components_cronet_android_load_states_list_rename",
- srcs: [
- "components/cronet/android/java/src/org/chromium/net/impl/LoadState.template",
- ],
- cmd: "cp $(in) $(out)",
- out: [
- "LoadState.cc",
- ],
-}
-
-// GN: //components/cronet/android:net_idempotency_java
-java_genrule {
- name: "cronet_aml_components_cronet_android_net_idempotency_java",
- cmd: "$(location build/android/gyp/java_cpp_enum.py) --srcjar " +
- "$(out) " +
- "$(location net/base/idempotency.h)",
- out: [
- "components/cronet/android/net_idempotency_java.srcjar",
- ],
- tool_files: [
- "build/android/gyp/java_cpp_enum.py",
- "build/android/gyp/util/__init__.py",
- "build/android/gyp/util/build_utils.py",
- "build/android/gyp/util/java_cpp_utils.py",
- "build/gn_helpers.py",
- "net/base/idempotency.h",
- ],
-}
-
-// GN: //components/cronet/android:net_request_priority_java
-java_genrule {
- name: "cronet_aml_components_cronet_android_net_request_priority_java",
- cmd: "$(location build/android/gyp/java_cpp_enum.py) --srcjar " +
- "$(out) " +
- "$(location net/base/request_priority.h)",
- out: [
- "components/cronet/android/net_request_priority_java.srcjar",
- ],
- tool_files: [
- "build/android/gyp/java_cpp_enum.py",
- "build/android/gyp/util/__init__.py",
- "build/android/gyp/util/build_utils.py",
- "build/android/gyp/util/java_cpp_utils.py",
- "build/gn_helpers.py",
- "net/base/request_priority.h",
- ],
-}
-
-// GN: //components/cronet/android:network_quality_observation_source_java
-java_genrule {
- name: "cronet_aml_components_cronet_android_network_quality_observation_source_java",
- cmd: "$(location build/android/gyp/java_cpp_enum.py) --srcjar " +
- "$(out) " +
- "$(location net/nqe/network_quality_observation_source.h)",
- out: [
- "components/cronet/android/network_quality_observation_source_java.srcjar",
- ],
- tool_files: [
- "build/android/gyp/java_cpp_enum.py",
- "build/android/gyp/util/__init__.py",
- "build/android/gyp/util/build_utils.py",
- "build/android/gyp/util/java_cpp_utils.py",
- "build/gn_helpers.py",
- "net/nqe/network_quality_observation_source.h",
- ],
-}
-
-// GN: //components/cronet/android:rtt_throughput_values_java
-java_genrule {
- name: "cronet_aml_components_cronet_android_rtt_throughput_values_java",
- cmd: "$(location build/android/gyp/java_cpp_enum.py) --srcjar " +
- "$(out) " +
- "$(location net/nqe/network_quality.h)",
- out: [
- "components/cronet/android/rtt_throughput_values_java.srcjar",
- ],
- tool_files: [
- "build/android/gyp/java_cpp_enum.py",
- "build/android/gyp/util/__init__.py",
- "build/android/gyp/util/build_utils.py",
- "build/android/gyp/util/java_cpp_utils.py",
- "build/gn_helpers.py",
- "net/nqe/network_quality.h",
- ],
-}
-
-// GN: //components/cronet/android:url_request_error_java
-java_genrule {
- name: "cronet_aml_components_cronet_android_url_request_error_java",
- cmd: "$(location build/android/gyp/java_cpp_enum.py) --srcjar " +
- "$(out) " +
- "$(location components/cronet/android/url_request_error.h)",
- out: [
- "components/cronet/android/url_request_error_java.srcjar",
- ],
- tool_files: [
- "build/android/gyp/java_cpp_enum.py",
- "build/android/gyp/util/__init__.py",
- "build/android/gyp/util/build_utils.py",
- "build/android/gyp/util/java_cpp_utils.py",
- "build/gn_helpers.py",
- "components/cronet/android/url_request_error.h",
- ],
-}
-
-// GN: //components/cronet:cronet_buildflags
-cc_genrule {
- name: "cronet_aml_components_cronet_cronet_buildflags",
- cmd: "echo '--flags DISABLE_HISTOGRAM_SUPPORT=\"false\"' | " +
- "$(location build/write_buildflag_header.py) --output " +
- "$(out) " +
- "--rulename " +
- "//components/cronet:cronet_buildflags " +
- "--gen-dir " +
- ". " +
- "--definitions " +
- "/dev/stdin",
- out: [
- "components/cronet/cronet_buildflags.h",
- ],
- tool_files: [
- "build/write_buildflag_header.py",
- ],
- apex_available: [
- "com.android.tethering",
- ],
-}
-
-// GN: //components/cronet:cronet_buildflags__testing
-cc_genrule {
- name: "cronet_aml_components_cronet_cronet_buildflags__testing",
- cmd: "echo '--flags DISABLE_HISTOGRAM_SUPPORT=\"false\"' | " +
- "$(location build/write_buildflag_header.py) --output " +
- "$(out) " +
- "--rulename " +
- "//components/cronet:cronet_buildflags " +
- "--gen-dir " +
- ". " +
- "--definitions " +
- "/dev/stdin",
- out: [
- "components/cronet/cronet_buildflags.h",
- ],
- tool_files: [
- "build/write_buildflag_header.py",
- ],
- apex_available: [
- "com.android.tethering",
- ],
-}
-
-// GN: //components/cronet:cronet_common
-cc_library_static {
- name: "cronet_aml_components_cronet_cronet_common",
- srcs: [
- "components/cronet/cronet_context.cc",
- "components/cronet/cronet_prefs_manager.cc",
- "components/cronet/cronet_upload_data_stream.cc",
- "components/cronet/cronet_url_request.cc",
- "components/cronet/host_cache_persistence_manager.cc",
- "components/cronet/stale_host_resolver.cc",
- "components/cronet/url_request_context_config.cc",
- ],
- shared_libs: [
- "libandroid",
- "liblog",
- "libz",
- ],
- static_libs: [
- "cronet_aml_base_allocator_partition_allocator_partition_alloc",
- "cronet_aml_base_base",
- "cronet_aml_base_base_static",
- "cronet_aml_base_nodebug_assertion",
- "cronet_aml_base_third_party_double_conversion_double_conversion",
- "cronet_aml_base_third_party_dynamic_annotations_dynamic_annotations",
- "cronet_aml_components_cronet_cronet_version_header",
- "cronet_aml_components_metrics_library_support",
- "cronet_aml_components_prefs_prefs",
- "cronet_aml_crypto_crypto",
- "cronet_aml_net_dns_dns",
- "cronet_aml_net_dns_public_public",
- "cronet_aml_net_http_transport_security_state_generated_files",
- "cronet_aml_net_net",
- "cronet_aml_net_net_deps",
- "cronet_aml_net_net_public_deps",
- "cronet_aml_net_preload_decoder",
- "cronet_aml_net_third_party_quiche_quiche",
- "cronet_aml_net_traffic_annotation_traffic_annotation",
- "cronet_aml_net_uri_template",
- "cronet_aml_third_party_abseil_cpp_absl_base_base",
- "cronet_aml_third_party_abseil_cpp_absl_base_log_severity",
- "cronet_aml_third_party_abseil_cpp_absl_base_malloc_internal",
- "cronet_aml_third_party_abseil_cpp_absl_base_raw_logging_internal",
- "cronet_aml_third_party_abseil_cpp_absl_base_spinlock_wait",
- "cronet_aml_third_party_abseil_cpp_absl_base_strerror",
- "cronet_aml_third_party_abseil_cpp_absl_base_throw_delegate",
- "cronet_aml_third_party_abseil_cpp_absl_container_hashtablez_sampler",
- "cronet_aml_third_party_abseil_cpp_absl_container_raw_hash_set",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_debugging_internal",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_demangle_internal",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_examine_stack",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_failure_signal_handler",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_stacktrace",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_symbolize",
- "cronet_aml_third_party_abseil_cpp_absl_hash_city",
- "cronet_aml_third_party_abseil_cpp_absl_hash_hash",
- "cronet_aml_third_party_abseil_cpp_absl_hash_low_level_hash",
- "cronet_aml_third_party_abseil_cpp_absl_numeric_int128",
- "cronet_aml_third_party_abseil_cpp_absl_profiling_exponential_biased",
- "cronet_aml_third_party_abseil_cpp_absl_random_distributions",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_platform",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_pool_urbg",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_hwaes",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_hwaes_impl",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_slow",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_seed_material",
- "cronet_aml_third_party_abseil_cpp_absl_random_seed_gen_exception",
- "cronet_aml_third_party_abseil_cpp_absl_random_seed_sequences",
- "cronet_aml_third_party_abseil_cpp_absl_status_status",
- "cronet_aml_third_party_abseil_cpp_absl_status_statusor",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cord",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cord_internal",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_functions",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_handle",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_info",
- "cronet_aml_third_party_abseil_cpp_absl_strings_internal",
- "cronet_aml_third_party_abseil_cpp_absl_strings_str_format_internal",
- "cronet_aml_third_party_abseil_cpp_absl_strings_strings",
- "cronet_aml_third_party_abseil_cpp_absl_synchronization_graphcycles_internal",
- "cronet_aml_third_party_abseil_cpp_absl_synchronization_synchronization",
- "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_civil_time",
- "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_time_zone",
- "cronet_aml_third_party_abseil_cpp_absl_time_time",
- "cronet_aml_third_party_abseil_cpp_absl_types_bad_optional_access",
- "cronet_aml_third_party_abseil_cpp_absl_types_bad_variant_access",
- "cronet_aml_third_party_android_ndk_cpu_features",
- "cronet_aml_third_party_ashmem_ashmem",
- "cronet_aml_third_party_boringssl_boringssl",
- "cronet_aml_third_party_boringssl_boringssl_asm",
- "cronet_aml_third_party_brotli_common",
- "cronet_aml_third_party_brotli_dec",
- "cronet_aml_third_party_icu_icui18n",
- "cronet_aml_third_party_icu_icuuc_private",
- "cronet_aml_third_party_libevent_libevent",
- "cronet_aml_third_party_modp_b64_modp_b64",
- "cronet_aml_third_party_protobuf_protobuf_lite",
- "cronet_aml_url_url",
- ],
- generated_headers: [
- "cronet_aml_components_cronet_cronet_buildflags",
- ],
- export_generated_headers: [
- "cronet_aml_components_cronet_cronet_buildflags",
- ],
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DGOOGLE_PROTOBUF_INTERNAL_DONATE_STEAL_INLINE=0",
- "-DGOOGLE_PROTOBUF_NO_RTTI",
- "-DGOOGLE_PROTOBUF_NO_STATIC_INITIALIZER",
- "-DHAVE_PTHREAD",
- "-DHAVE_SYS_UIO_H",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_FORTIFY_SOURCE=2",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D__STDC_CONSTANT_MACROS",
- "-D__STDC_FORMAT_MACROS",
- "-Oz",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "net/third_party/quiche/overrides/",
- "net/third_party/quiche/src/",
- "net/third_party/quiche/src/quiche/common/platform/default/",
- "third_party/abseil-cpp/",
- "third_party/boringssl/src/include/",
- "third_party/protobuf/src/",
- ],
- cpp_std: "c++17",
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- "-Wl,--script,external/cronet/base/android/library_loader/anchor_functions.lds",
- "-Wl,-wrap,asprintf",
- "-Wl,-wrap,calloc",
- "-Wl,-wrap,free",
- "-Wl,-wrap,getcwd",
- "-Wl,-wrap,malloc",
- "-Wl,-wrap,malloc_usable_size",
- "-Wl,-wrap,memalign",
- "-Wl,-wrap,posix_memalign",
- "-Wl,-wrap,pvalloc",
- "-Wl,-wrap,realloc",
- "-Wl,-wrap,realpath",
- "-Wl,-wrap,strdup",
- "-Wl,-wrap,strndup",
- "-Wl,-wrap,valloc",
- "-Wl,-wrap,vasprintf",
- ],
- target: {
- android_arm: {
- cflags: [
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-fstack-protector",
- "-msse3",
- ],
- },
- },
-}
-
-// GN: //components/cronet:cronet_common__testing
-cc_library_static {
- name: "cronet_aml_components_cronet_cronet_common__testing",
- srcs: [
- "components/cronet/cronet_context.cc",
- "components/cronet/cronet_prefs_manager.cc",
- "components/cronet/cronet_upload_data_stream.cc",
- "components/cronet/cronet_url_request.cc",
- "components/cronet/host_cache_persistence_manager.cc",
- "components/cronet/stale_host_resolver.cc",
- "components/cronet/url_request_context_config.cc",
- ],
- shared_libs: [
- "libandroid",
- "liblog",
- "libz",
- ],
- static_libs: [
- "cronet_aml_base_allocator_partition_allocator_partition_alloc__testing",
- "cronet_aml_base_base__testing",
- "cronet_aml_base_base_static__testing",
- "cronet_aml_base_nodebug_assertion__testing",
- "cronet_aml_base_third_party_double_conversion_double_conversion__testing",
- "cronet_aml_base_third_party_dynamic_annotations_dynamic_annotations__testing",
- "cronet_aml_components_cronet_cronet_version_header__testing",
- "cronet_aml_components_metrics_library_support__testing",
- "cronet_aml_components_prefs_prefs__testing",
- "cronet_aml_crypto_crypto__testing",
- "cronet_aml_net_dns_dns__testing",
- "cronet_aml_net_dns_public_public__testing",
- "cronet_aml_net_http_transport_security_state_generated_files__testing",
- "cronet_aml_net_net__testing",
- "cronet_aml_net_net_deps__testing",
- "cronet_aml_net_net_public_deps__testing",
- "cronet_aml_net_preload_decoder__testing",
- "cronet_aml_net_third_party_quiche_quiche__testing",
- "cronet_aml_net_traffic_annotation_traffic_annotation__testing",
- "cronet_aml_net_uri_template__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_base__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_log_severity__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_malloc_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_raw_logging_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_spinlock_wait__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_strerror__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_throw_delegate__testing",
- "cronet_aml_third_party_abseil_cpp_absl_container_hashtablez_sampler__testing",
- "cronet_aml_third_party_abseil_cpp_absl_container_raw_hash_set__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_debugging_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_demangle_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_examine_stack__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_failure_signal_handler__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_stacktrace__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_symbolize__testing",
- "cronet_aml_third_party_abseil_cpp_absl_hash_city__testing",
- "cronet_aml_third_party_abseil_cpp_absl_hash_hash__testing",
- "cronet_aml_third_party_abseil_cpp_absl_hash_low_level_hash__testing",
- "cronet_aml_third_party_abseil_cpp_absl_numeric_int128__testing",
- "cronet_aml_third_party_abseil_cpp_absl_profiling_exponential_biased__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_distributions__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_platform__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_pool_urbg__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_hwaes__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_hwaes_impl__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_slow__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_seed_material__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_seed_gen_exception__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_seed_sequences__testing",
- "cronet_aml_third_party_abseil_cpp_absl_status_status__testing",
- "cronet_aml_third_party_abseil_cpp_absl_status_statusor__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cord__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cord_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_functions__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_handle__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_info__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_str_format_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_strings__testing",
- "cronet_aml_third_party_abseil_cpp_absl_synchronization_graphcycles_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_synchronization_synchronization__testing",
- "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_civil_time__testing",
- "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_time_zone__testing",
- "cronet_aml_third_party_abseil_cpp_absl_time_time__testing",
- "cronet_aml_third_party_abseil_cpp_absl_types_bad_optional_access__testing",
- "cronet_aml_third_party_abseil_cpp_absl_types_bad_variant_access__testing",
- "cronet_aml_third_party_android_ndk_cpu_features__testing",
- "cronet_aml_third_party_ashmem_ashmem__testing",
- "cronet_aml_third_party_boringssl_boringssl__testing",
- "cronet_aml_third_party_boringssl_boringssl_asm__testing",
- "cronet_aml_third_party_brotli_common__testing",
- "cronet_aml_third_party_brotli_dec__testing",
- "cronet_aml_third_party_icu_icui18n__testing",
- "cronet_aml_third_party_icu_icuuc_private__testing",
- "cronet_aml_third_party_libevent_libevent__testing",
- "cronet_aml_third_party_modp_b64_modp_b64__testing",
- "cronet_aml_third_party_protobuf_protobuf_lite__testing",
- "cronet_aml_url_url__testing",
- ],
- generated_headers: [
- "cronet_aml_components_cronet_cronet_buildflags__testing",
- ],
- export_generated_headers: [
- "cronet_aml_components_cronet_cronet_buildflags__testing",
- ],
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DGOOGLE_PROTOBUF_INTERNAL_DONATE_STEAL_INLINE=0",
- "-DGOOGLE_PROTOBUF_NO_RTTI",
- "-DGOOGLE_PROTOBUF_NO_STATIC_INITIALIZER",
- "-DHAVE_PTHREAD",
- "-DHAVE_SYS_UIO_H",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_FORTIFY_SOURCE=2",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D__STDC_CONSTANT_MACROS",
- "-D__STDC_FORMAT_MACROS",
- "-Oz",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "net/third_party/quiche/overrides/",
- "net/third_party/quiche/src/",
- "net/third_party/quiche/src/quiche/common/platform/default/",
- "third_party/abseil-cpp/",
- "third_party/boringssl/src/include/",
- "third_party/protobuf/src/",
- ],
- cpp_std: "c++17",
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- "-Wl,--script,external/cronet/base/android/library_loader/anchor_functions.lds",
- "-Wl,-wrap,asprintf",
- "-Wl,-wrap,calloc",
- "-Wl,-wrap,free",
- "-Wl,-wrap,getcwd",
- "-Wl,-wrap,malloc",
- "-Wl,-wrap,malloc_usable_size",
- "-Wl,-wrap,memalign",
- "-Wl,-wrap,posix_memalign",
- "-Wl,-wrap,pvalloc",
- "-Wl,-wrap,realloc",
- "-Wl,-wrap,realpath",
- "-Wl,-wrap,strdup",
- "-Wl,-wrap,strndup",
- "-Wl,-wrap,valloc",
- "-Wl,-wrap,vasprintf",
- ],
- target: {
- android_arm: {
- cflags: [
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-fstack-protector",
- "-msse3",
- ],
- },
- },
-}
-
-// GN: //components/cronet:cronet_common_unittests__testing
-cc_library_static {
- name: "cronet_aml_components_cronet_cronet_common_unittests__testing",
- srcs: [
- "components/cronet/host_cache_persistence_manager_unittest.cc",
- "components/cronet/network_tasks_unittest.cc",
- "components/cronet/stale_host_resolver_unittest.cc",
- "components/cronet/url_request_context_config_unittest.cc",
- ],
- shared_libs: [
- "libandroid",
- "liblog",
- "libz",
- ],
- static_libs: [
- "cronet_aml_base_allocator_partition_allocator_partition_alloc__testing",
- "cronet_aml_base_base__testing",
- "cronet_aml_base_base_static__testing",
- "cronet_aml_base_i18n__testing",
- "cronet_aml_base_nodebug_assertion__testing",
- "cronet_aml_base_test_test_config__testing",
- "cronet_aml_base_test_test_support__testing",
- "cronet_aml_base_third_party_double_conversion_double_conversion__testing",
- "cronet_aml_base_third_party_dynamic_annotations_dynamic_annotations__testing",
- "cronet_aml_components_cronet_cronet_common__testing",
- "cronet_aml_components_cronet_cronet_version_header__testing",
- "cronet_aml_components_metrics_library_support__testing",
- "cronet_aml_components_prefs_prefs__testing",
- "cronet_aml_components_prefs_test_support__testing",
- "cronet_aml_crypto_crypto__testing",
- "cronet_aml_net_dns_dns__testing",
- "cronet_aml_net_dns_public_public__testing",
- "cronet_aml_net_dns_test_support__testing",
- "cronet_aml_net_gtest_util__testing",
- "cronet_aml_net_http_transport_security_state_generated_files__testing",
- "cronet_aml_net_net__testing",
- "cronet_aml_net_net_deps__testing",
- "cronet_aml_net_net_public_deps__testing",
- "cronet_aml_net_preload_decoder__testing",
- "cronet_aml_net_quic_test_flags_utils__testing",
- "cronet_aml_net_simple_quic_tools__testing",
- "cronet_aml_net_test_support__testing",
- "cronet_aml_net_third_party_quiche_quiche__testing",
- "cronet_aml_net_third_party_quiche_quiche_tool_support__testing",
- "cronet_aml_net_tools_tld_cleanup_tld_cleanup__testing",
- "cronet_aml_net_traffic_annotation_traffic_annotation__testing",
- "cronet_aml_net_uri_template__testing",
- "cronet_aml_testing_gtest_gtest__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_base__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_log_severity__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_malloc_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_raw_logging_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_spinlock_wait__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_strerror__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_throw_delegate__testing",
- "cronet_aml_third_party_abseil_cpp_absl_container_hashtablez_sampler__testing",
- "cronet_aml_third_party_abseil_cpp_absl_container_raw_hash_set__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_debugging_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_demangle_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_examine_stack__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_failure_signal_handler__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_stacktrace__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_symbolize__testing",
- "cronet_aml_third_party_abseil_cpp_absl_hash_city__testing",
- "cronet_aml_third_party_abseil_cpp_absl_hash_hash__testing",
- "cronet_aml_third_party_abseil_cpp_absl_hash_low_level_hash__testing",
- "cronet_aml_third_party_abseil_cpp_absl_numeric_int128__testing",
- "cronet_aml_third_party_abseil_cpp_absl_profiling_exponential_biased__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_distributions__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_platform__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_pool_urbg__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_hwaes__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_hwaes_impl__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_slow__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_seed_material__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_seed_gen_exception__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_seed_sequences__testing",
- "cronet_aml_third_party_abseil_cpp_absl_status_status__testing",
- "cronet_aml_third_party_abseil_cpp_absl_status_statusor__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cord__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cord_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_functions__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_handle__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_info__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_str_format_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_strings__testing",
- "cronet_aml_third_party_abseil_cpp_absl_synchronization_graphcycles_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_synchronization_synchronization__testing",
- "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_civil_time__testing",
- "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_time_zone__testing",
- "cronet_aml_third_party_abseil_cpp_absl_time_time__testing",
- "cronet_aml_third_party_abseil_cpp_absl_types_bad_optional_access__testing",
- "cronet_aml_third_party_abseil_cpp_absl_types_bad_variant_access__testing",
- "cronet_aml_third_party_android_ndk_cpu_features__testing",
- "cronet_aml_third_party_ashmem_ashmem__testing",
- "cronet_aml_third_party_boringssl_boringssl__testing",
- "cronet_aml_third_party_boringssl_boringssl_asm__testing",
- "cronet_aml_third_party_brotli_common__testing",
- "cronet_aml_third_party_brotli_dec__testing",
- "cronet_aml_third_party_ced_ced__testing",
- "cronet_aml_third_party_googletest_gmock__testing",
- "cronet_aml_third_party_googletest_gtest__testing",
- "cronet_aml_third_party_icu_icui18n__testing",
- "cronet_aml_third_party_icu_icuuc_private__testing",
- "cronet_aml_third_party_libevent_libevent__testing",
- "cronet_aml_third_party_libxml_libxml__testing",
- "cronet_aml_third_party_libxml_libxml_utils__testing",
- "cronet_aml_third_party_libxml_xml_reader__testing",
- "cronet_aml_third_party_modp_b64_modp_b64__testing",
- "cronet_aml_third_party_protobuf_protobuf_lite__testing",
- "cronet_aml_url_url__testing",
- ],
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DGOOGLE_PROTOBUF_INTERNAL_DONATE_STEAL_INLINE=0",
- "-DGOOGLE_PROTOBUF_NO_RTTI",
- "-DGOOGLE_PROTOBUF_NO_STATIC_INITIALIZER",
- "-DGTEST_API_=",
- "-DGTEST_HAS_ABSL=1",
- "-DGTEST_HAS_POSIX_RE=0",
- "-DGTEST_HAS_TR1_TUPLE=0",
- "-DGTEST_LANG_CXX11=1",
- "-DHAVE_PTHREAD",
- "-DHAVE_SYS_UIO_H",
- "-DICU_UTIL_DATA_IMPL=ICU_UTIL_DATA_FILE",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-DUNIT_TEST",
- "-DUSE_CHROMIUM_ICU=1",
- "-DUSE_REMOTE_TEST_SERVER",
- "-DU_ENABLE_DYLOAD=0",
- "-DU_ENABLE_RESOURCE_TRACING=0",
- "-DU_ENABLE_TRACING=1",
- "-DU_STATIC_IMPLEMENTATION",
- "-DU_USING_ICU_NAMESPACE=0",
- "-D_FORTIFY_SOURCE=2",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D__STDC_CONSTANT_MACROS",
- "-D__STDC_FORMAT_MACROS",
- "-Oz",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "net/third_party/quiche/overrides/",
- "net/third_party/quiche/src/",
- "net/third_party/quiche/src/quiche/common/platform/default/",
- "third_party/abseil-cpp/",
- "third_party/boringssl/src/include/",
- "third_party/ced/src/",
- "third_party/googletest/custom/",
- "third_party/googletest/src/googlemock/include/",
- "third_party/googletest/src/googletest/include/",
- "third_party/icu/source/common/",
- "third_party/icu/source/i18n/",
- "third_party/protobuf/src/",
- ],
- cpp_std: "c++17",
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- "-Wl,--script,external/cronet/base/android/library_loader/anchor_functions.lds",
- "-Wl,-wrap,asprintf",
- "-Wl,-wrap,calloc",
- "-Wl,-wrap,free",
- "-Wl,-wrap,getcwd",
- "-Wl,-wrap,malloc",
- "-Wl,-wrap,malloc_usable_size",
- "-Wl,-wrap,memalign",
- "-Wl,-wrap,posix_memalign",
- "-Wl,-wrap,pvalloc",
- "-Wl,-wrap,realloc",
- "-Wl,-wrap,realpath",
- "-Wl,-wrap,strdup",
- "-Wl,-wrap,strndup",
- "-Wl,-wrap,valloc",
- "-Wl,-wrap,vasprintf",
- ],
- target: {
- android_arm: {
- cflags: [
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-fstack-protector",
- "-msse3",
- ],
- },
- },
-}
-
-// GN: //components/cronet:cronet_version_header
-cc_library_static {
- name: "cronet_aml_components_cronet_cronet_version_header",
- generated_headers: [
- "cronet_aml_components_cronet_cronet_version_header_action",
- ],
- export_generated_headers: [
- "cronet_aml_components_cronet_cronet_version_header_action",
- ],
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DHAVE_SYS_UIO_H",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_FORTIFY_SOURCE=2",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D__STDC_CONSTANT_MACROS",
- "-D__STDC_FORMAT_MACROS",
- "-Oz",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- ],
- cpp_std: "c++17",
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- ],
- target: {
- android_arm: {
- cflags: [
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-fstack-protector",
- "-msse3",
- ],
- },
- },
-}
-
-// GN: //components/cronet:cronet_version_header__testing
-cc_library_static {
- name: "cronet_aml_components_cronet_cronet_version_header__testing",
- generated_headers: [
- "cronet_aml_components_cronet_cronet_version_header_action__testing",
- ],
- export_generated_headers: [
- "cronet_aml_components_cronet_cronet_version_header_action__testing",
- ],
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DHAVE_SYS_UIO_H",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_FORTIFY_SOURCE=2",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D__STDC_CONSTANT_MACROS",
- "-D__STDC_FORMAT_MACROS",
- "-Oz",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- ],
- cpp_std: "c++17",
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- ],
- target: {
- android_arm: {
- cflags: [
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-fstack-protector",
- "-msse3",
- ],
- },
- },
-}
-
-// GN: //components/cronet:cronet_version_header_action
-cc_genrule {
- name: "cronet_aml_components_cronet_cronet_version_header_action",
- cmd: "$(location build/util/version.py) --official " +
- "-f " +
- "$(location chrome/VERSION) " +
- "-e " +
- "'VERSION_FULL=\"%s.%s.%s.%s\" % (MAJOR,MINOR,BUILD,PATCH)' " +
- "-o " +
- "$(out) " +
- "$(location components/cronet/version.h.in)",
- out: [
- "components/cronet/version.h",
- ],
- tool_files: [
- "build/util/LASTCHANGE",
- "build/util/android_chrome_version.py",
- "build/util/version.py",
- "chrome/VERSION",
- "components/cronet/version.h.in",
- ],
- apex_available: [
- "com.android.tethering",
- ],
-}
-
-// GN: //components/cronet:cronet_version_header_action__testing
-cc_genrule {
- name: "cronet_aml_components_cronet_cronet_version_header_action__testing",
- cmd: "$(location build/util/version.py) --official " +
- "-f " +
- "$(location chrome/VERSION) " +
- "-e " +
- "'VERSION_FULL=\"%s.%s.%s.%s\" % (MAJOR,MINOR,BUILD,PATCH)' " +
- "-o " +
- "$(out) " +
- "$(location components/cronet/version.h.in)",
- out: [
- "components/cronet/version.h",
- ],
- tool_files: [
- "build/util/LASTCHANGE",
- "build/util/android_chrome_version.py",
- "build/util/version.py",
- "chrome/VERSION",
- "components/cronet/version.h.in",
- ],
- apex_available: [
- "com.android.tethering",
- ],
-}
-
-// GN: //components/cronet:metrics_util
-cc_library_static {
- name: "cronet_aml_components_cronet_metrics_util",
- srcs: [
- "components/cronet/metrics_util.cc",
- ],
- shared_libs: [
- "libandroid",
- "liblog",
- ],
- static_libs: [
- "cronet_aml_base_allocator_partition_allocator_partition_alloc",
- "cronet_aml_base_base",
- "cronet_aml_base_base_static",
- "cronet_aml_base_nodebug_assertion",
- "cronet_aml_base_third_party_double_conversion_double_conversion",
- "cronet_aml_base_third_party_dynamic_annotations_dynamic_annotations",
- "cronet_aml_third_party_abseil_cpp_absl_base_base",
- "cronet_aml_third_party_abseil_cpp_absl_base_log_severity",
- "cronet_aml_third_party_abseil_cpp_absl_base_malloc_internal",
- "cronet_aml_third_party_abseil_cpp_absl_base_raw_logging_internal",
- "cronet_aml_third_party_abseil_cpp_absl_base_spinlock_wait",
- "cronet_aml_third_party_abseil_cpp_absl_base_strerror",
- "cronet_aml_third_party_abseil_cpp_absl_base_throw_delegate",
- "cronet_aml_third_party_abseil_cpp_absl_container_hashtablez_sampler",
- "cronet_aml_third_party_abseil_cpp_absl_container_raw_hash_set",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_debugging_internal",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_demangle_internal",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_examine_stack",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_failure_signal_handler",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_stacktrace",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_symbolize",
- "cronet_aml_third_party_abseil_cpp_absl_hash_city",
- "cronet_aml_third_party_abseil_cpp_absl_hash_hash",
- "cronet_aml_third_party_abseil_cpp_absl_hash_low_level_hash",
- "cronet_aml_third_party_abseil_cpp_absl_numeric_int128",
- "cronet_aml_third_party_abseil_cpp_absl_profiling_exponential_biased",
- "cronet_aml_third_party_abseil_cpp_absl_random_distributions",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_platform",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_pool_urbg",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_hwaes",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_hwaes_impl",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_slow",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_seed_material",
- "cronet_aml_third_party_abseil_cpp_absl_random_seed_gen_exception",
- "cronet_aml_third_party_abseil_cpp_absl_random_seed_sequences",
- "cronet_aml_third_party_abseil_cpp_absl_status_status",
- "cronet_aml_third_party_abseil_cpp_absl_status_statusor",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cord",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cord_internal",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_functions",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_handle",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_info",
- "cronet_aml_third_party_abseil_cpp_absl_strings_internal",
- "cronet_aml_third_party_abseil_cpp_absl_strings_str_format_internal",
- "cronet_aml_third_party_abseil_cpp_absl_strings_strings",
- "cronet_aml_third_party_abseil_cpp_absl_synchronization_graphcycles_internal",
- "cronet_aml_third_party_abseil_cpp_absl_synchronization_synchronization",
- "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_civil_time",
- "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_time_zone",
- "cronet_aml_third_party_abseil_cpp_absl_time_time",
- "cronet_aml_third_party_abseil_cpp_absl_types_bad_optional_access",
- "cronet_aml_third_party_abseil_cpp_absl_types_bad_variant_access",
- "cronet_aml_third_party_android_ndk_cpu_features",
- "cronet_aml_third_party_ashmem_ashmem",
- "cronet_aml_third_party_boringssl_boringssl",
- "cronet_aml_third_party_boringssl_boringssl_asm",
- "cronet_aml_third_party_icu_icui18n",
- "cronet_aml_third_party_icu_icuuc_private",
- "cronet_aml_third_party_libevent_libevent",
- "cronet_aml_third_party_modp_b64_modp_b64",
- ],
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DHAVE_SYS_UIO_H",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_FORTIFY_SOURCE=2",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D__STDC_CONSTANT_MACROS",
- "-D__STDC_FORMAT_MACROS",
- "-Oz",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "third_party/abseil-cpp/",
- "third_party/boringssl/src/include/",
- ],
- cpp_std: "c++17",
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- "-Wl,--script,external/cronet/base/android/library_loader/anchor_functions.lds",
- "-Wl,-wrap,asprintf",
- "-Wl,-wrap,calloc",
- "-Wl,-wrap,free",
- "-Wl,-wrap,getcwd",
- "-Wl,-wrap,malloc",
- "-Wl,-wrap,malloc_usable_size",
- "-Wl,-wrap,memalign",
- "-Wl,-wrap,posix_memalign",
- "-Wl,-wrap,pvalloc",
- "-Wl,-wrap,realloc",
- "-Wl,-wrap,realpath",
- "-Wl,-wrap,strdup",
- "-Wl,-wrap,strndup",
- "-Wl,-wrap,valloc",
- "-Wl,-wrap,vasprintf",
- ],
- target: {
- android_arm: {
- cflags: [
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-fstack-protector",
- "-msse3",
- ],
- },
- },
-}
-
-// GN: //components/cronet:metrics_util__testing
-cc_library_static {
- name: "cronet_aml_components_cronet_metrics_util__testing",
- srcs: [
- "components/cronet/metrics_util.cc",
- ],
- shared_libs: [
- "libandroid",
- "liblog",
- ],
- static_libs: [
- "cronet_aml_base_allocator_partition_allocator_partition_alloc__testing",
- "cronet_aml_base_base__testing",
- "cronet_aml_base_base_static__testing",
- "cronet_aml_base_nodebug_assertion__testing",
- "cronet_aml_base_third_party_double_conversion_double_conversion__testing",
- "cronet_aml_base_third_party_dynamic_annotations_dynamic_annotations__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_base__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_log_severity__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_malloc_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_raw_logging_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_spinlock_wait__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_strerror__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_throw_delegate__testing",
- "cronet_aml_third_party_abseil_cpp_absl_container_hashtablez_sampler__testing",
- "cronet_aml_third_party_abseil_cpp_absl_container_raw_hash_set__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_debugging_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_demangle_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_examine_stack__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_failure_signal_handler__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_stacktrace__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_symbolize__testing",
- "cronet_aml_third_party_abseil_cpp_absl_hash_city__testing",
- "cronet_aml_third_party_abseil_cpp_absl_hash_hash__testing",
- "cronet_aml_third_party_abseil_cpp_absl_hash_low_level_hash__testing",
- "cronet_aml_third_party_abseil_cpp_absl_numeric_int128__testing",
- "cronet_aml_third_party_abseil_cpp_absl_profiling_exponential_biased__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_distributions__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_platform__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_pool_urbg__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_hwaes__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_hwaes_impl__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_slow__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_seed_material__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_seed_gen_exception__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_seed_sequences__testing",
- "cronet_aml_third_party_abseil_cpp_absl_status_status__testing",
- "cronet_aml_third_party_abseil_cpp_absl_status_statusor__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cord__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cord_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_functions__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_handle__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_info__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_str_format_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_strings__testing",
- "cronet_aml_third_party_abseil_cpp_absl_synchronization_graphcycles_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_synchronization_synchronization__testing",
- "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_civil_time__testing",
- "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_time_zone__testing",
- "cronet_aml_third_party_abseil_cpp_absl_time_time__testing",
- "cronet_aml_third_party_abseil_cpp_absl_types_bad_optional_access__testing",
- "cronet_aml_third_party_abseil_cpp_absl_types_bad_variant_access__testing",
- "cronet_aml_third_party_android_ndk_cpu_features__testing",
- "cronet_aml_third_party_ashmem_ashmem__testing",
- "cronet_aml_third_party_boringssl_boringssl__testing",
- "cronet_aml_third_party_boringssl_boringssl_asm__testing",
- "cronet_aml_third_party_icu_icui18n__testing",
- "cronet_aml_third_party_icu_icuuc_private__testing",
- "cronet_aml_third_party_libevent_libevent__testing",
- "cronet_aml_third_party_modp_b64_modp_b64__testing",
- ],
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DHAVE_SYS_UIO_H",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_FORTIFY_SOURCE=2",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D__STDC_CONSTANT_MACROS",
- "-D__STDC_FORMAT_MACROS",
- "-Oz",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "third_party/abseil-cpp/",
- "third_party/boringssl/src/include/",
- ],
- cpp_std: "c++17",
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- "-Wl,--script,external/cronet/base/android/library_loader/anchor_functions.lds",
- "-Wl,-wrap,asprintf",
- "-Wl,-wrap,calloc",
- "-Wl,-wrap,free",
- "-Wl,-wrap,getcwd",
- "-Wl,-wrap,malloc",
- "-Wl,-wrap,malloc_usable_size",
- "-Wl,-wrap,memalign",
- "-Wl,-wrap,posix_memalign",
- "-Wl,-wrap,pvalloc",
- "-Wl,-wrap,realloc",
- "-Wl,-wrap,realpath",
- "-Wl,-wrap,strdup",
- "-Wl,-wrap,strndup",
- "-Wl,-wrap,valloc",
- "-Wl,-wrap,vasprintf",
- ],
- target: {
- android_arm: {
- cflags: [
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-fstack-protector",
- "-msse3",
- ],
- },
- },
-}
-
-// GN: //components/metrics:library_support
-cc_library_static {
- name: "cronet_aml_components_metrics_library_support",
- srcs: [
- ":cronet_aml_third_party_metrics_proto_metrics_proto_gen",
- "components/metrics/histogram_encoder.cc",
- "components/metrics/library_support/histogram_manager.cc",
- ],
- shared_libs: [
- "libandroid",
- "liblog",
- "libprotobuf-cpp-lite",
- ],
- static_libs: [
- "cronet_aml_base_allocator_partition_allocator_partition_alloc",
- "cronet_aml_base_base",
- "cronet_aml_base_base_static",
- "cronet_aml_base_nodebug_assertion",
- "cronet_aml_base_third_party_double_conversion_double_conversion",
- "cronet_aml_base_third_party_dynamic_annotations_dynamic_annotations",
- "cronet_aml_third_party_abseil_cpp_absl_base_base",
- "cronet_aml_third_party_abseil_cpp_absl_base_log_severity",
- "cronet_aml_third_party_abseil_cpp_absl_base_malloc_internal",
- "cronet_aml_third_party_abseil_cpp_absl_base_raw_logging_internal",
- "cronet_aml_third_party_abseil_cpp_absl_base_spinlock_wait",
- "cronet_aml_third_party_abseil_cpp_absl_base_strerror",
- "cronet_aml_third_party_abseil_cpp_absl_base_throw_delegate",
- "cronet_aml_third_party_abseil_cpp_absl_container_hashtablez_sampler",
- "cronet_aml_third_party_abseil_cpp_absl_container_raw_hash_set",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_debugging_internal",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_demangle_internal",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_examine_stack",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_failure_signal_handler",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_stacktrace",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_symbolize",
- "cronet_aml_third_party_abseil_cpp_absl_hash_city",
- "cronet_aml_third_party_abseil_cpp_absl_hash_hash",
- "cronet_aml_third_party_abseil_cpp_absl_hash_low_level_hash",
- "cronet_aml_third_party_abseil_cpp_absl_numeric_int128",
- "cronet_aml_third_party_abseil_cpp_absl_profiling_exponential_biased",
- "cronet_aml_third_party_abseil_cpp_absl_random_distributions",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_platform",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_pool_urbg",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_hwaes",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_hwaes_impl",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_slow",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_seed_material",
- "cronet_aml_third_party_abseil_cpp_absl_random_seed_gen_exception",
- "cronet_aml_third_party_abseil_cpp_absl_random_seed_sequences",
- "cronet_aml_third_party_abseil_cpp_absl_status_status",
- "cronet_aml_third_party_abseil_cpp_absl_status_statusor",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cord",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cord_internal",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_functions",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_handle",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_info",
- "cronet_aml_third_party_abseil_cpp_absl_strings_internal",
- "cronet_aml_third_party_abseil_cpp_absl_strings_str_format_internal",
- "cronet_aml_third_party_abseil_cpp_absl_strings_strings",
- "cronet_aml_third_party_abseil_cpp_absl_synchronization_graphcycles_internal",
- "cronet_aml_third_party_abseil_cpp_absl_synchronization_synchronization",
- "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_civil_time",
- "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_time_zone",
- "cronet_aml_third_party_abseil_cpp_absl_time_time",
- "cronet_aml_third_party_abseil_cpp_absl_types_bad_optional_access",
- "cronet_aml_third_party_abseil_cpp_absl_types_bad_variant_access",
- "cronet_aml_third_party_android_ndk_cpu_features",
- "cronet_aml_third_party_ashmem_ashmem",
- "cronet_aml_third_party_boringssl_boringssl",
- "cronet_aml_third_party_boringssl_boringssl_asm",
- "cronet_aml_third_party_icu_icui18n",
- "cronet_aml_third_party_icu_icuuc_private",
- "cronet_aml_third_party_libevent_libevent",
- "cronet_aml_third_party_modp_b64_modp_b64",
- "cronet_aml_third_party_protobuf_protobuf_lite",
- ],
- generated_headers: [
- "cronet_aml_third_party_metrics_proto_metrics_proto_gen_headers",
- ],
- export_generated_headers: [
- "cronet_aml_third_party_metrics_proto_metrics_proto_gen_headers",
- ],
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DGOOGLE_PROTOBUF_INTERNAL_DONATE_STEAL_INLINE=0",
- "-DGOOGLE_PROTOBUF_NO_RTTI",
- "-DGOOGLE_PROTOBUF_NO_STATIC_INITIALIZER",
- "-DHAVE_PTHREAD",
- "-DHAVE_SYS_UIO_H",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_FORTIFY_SOURCE=2",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D__STDC_CONSTANT_MACROS",
- "-D__STDC_FORMAT_MACROS",
- "-Oz",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "third_party/abseil-cpp/",
- "third_party/boringssl/src/include/",
- "third_party/protobuf/src/",
- ],
- cpp_std: "c++17",
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- "-Wl,--script,external/cronet/base/android/library_loader/anchor_functions.lds",
- "-Wl,-wrap,asprintf",
- "-Wl,-wrap,calloc",
- "-Wl,-wrap,free",
- "-Wl,-wrap,getcwd",
- "-Wl,-wrap,malloc",
- "-Wl,-wrap,malloc_usable_size",
- "-Wl,-wrap,memalign",
- "-Wl,-wrap,posix_memalign",
- "-Wl,-wrap,pvalloc",
- "-Wl,-wrap,realloc",
- "-Wl,-wrap,realpath",
- "-Wl,-wrap,strdup",
- "-Wl,-wrap,strndup",
- "-Wl,-wrap,valloc",
- "-Wl,-wrap,vasprintf",
- ],
- target: {
- android_arm: {
- cflags: [
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-fstack-protector",
- "-msse3",
- ],
- },
- },
-}
-
-// GN: //components/metrics:library_support__testing
-cc_library_static {
- name: "cronet_aml_components_metrics_library_support__testing",
- srcs: [
- ":cronet_aml_third_party_metrics_proto_metrics_proto__testing_gen",
- "components/metrics/histogram_encoder.cc",
- "components/metrics/library_support/histogram_manager.cc",
- ],
- shared_libs: [
- "libandroid",
- "liblog",
- "libprotobuf-cpp-lite",
- ],
- static_libs: [
- "cronet_aml_base_allocator_partition_allocator_partition_alloc__testing",
- "cronet_aml_base_base__testing",
- "cronet_aml_base_base_static__testing",
- "cronet_aml_base_nodebug_assertion__testing",
- "cronet_aml_base_third_party_double_conversion_double_conversion__testing",
- "cronet_aml_base_third_party_dynamic_annotations_dynamic_annotations__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_base__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_log_severity__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_malloc_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_raw_logging_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_spinlock_wait__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_strerror__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_throw_delegate__testing",
- "cronet_aml_third_party_abseil_cpp_absl_container_hashtablez_sampler__testing",
- "cronet_aml_third_party_abseil_cpp_absl_container_raw_hash_set__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_debugging_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_demangle_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_examine_stack__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_failure_signal_handler__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_stacktrace__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_symbolize__testing",
- "cronet_aml_third_party_abseil_cpp_absl_hash_city__testing",
- "cronet_aml_third_party_abseil_cpp_absl_hash_hash__testing",
- "cronet_aml_third_party_abseil_cpp_absl_hash_low_level_hash__testing",
- "cronet_aml_third_party_abseil_cpp_absl_numeric_int128__testing",
- "cronet_aml_third_party_abseil_cpp_absl_profiling_exponential_biased__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_distributions__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_platform__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_pool_urbg__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_hwaes__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_hwaes_impl__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_slow__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_seed_material__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_seed_gen_exception__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_seed_sequences__testing",
- "cronet_aml_third_party_abseil_cpp_absl_status_status__testing",
- "cronet_aml_third_party_abseil_cpp_absl_status_statusor__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cord__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cord_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_functions__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_handle__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_info__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_str_format_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_strings__testing",
- "cronet_aml_third_party_abseil_cpp_absl_synchronization_graphcycles_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_synchronization_synchronization__testing",
- "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_civil_time__testing",
- "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_time_zone__testing",
- "cronet_aml_third_party_abseil_cpp_absl_time_time__testing",
- "cronet_aml_third_party_abseil_cpp_absl_types_bad_optional_access__testing",
- "cronet_aml_third_party_abseil_cpp_absl_types_bad_variant_access__testing",
- "cronet_aml_third_party_android_ndk_cpu_features__testing",
- "cronet_aml_third_party_ashmem_ashmem__testing",
- "cronet_aml_third_party_boringssl_boringssl__testing",
- "cronet_aml_third_party_boringssl_boringssl_asm__testing",
- "cronet_aml_third_party_icu_icui18n__testing",
- "cronet_aml_third_party_icu_icuuc_private__testing",
- "cronet_aml_third_party_libevent_libevent__testing",
- "cronet_aml_third_party_modp_b64_modp_b64__testing",
- "cronet_aml_third_party_protobuf_protobuf_lite__testing",
- ],
- generated_headers: [
- "cronet_aml_third_party_metrics_proto_metrics_proto__testing_gen_headers",
- ],
- export_generated_headers: [
- "cronet_aml_third_party_metrics_proto_metrics_proto__testing_gen_headers",
- ],
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DGOOGLE_PROTOBUF_INTERNAL_DONATE_STEAL_INLINE=0",
- "-DGOOGLE_PROTOBUF_NO_RTTI",
- "-DGOOGLE_PROTOBUF_NO_STATIC_INITIALIZER",
- "-DHAVE_PTHREAD",
- "-DHAVE_SYS_UIO_H",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_FORTIFY_SOURCE=2",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D__STDC_CONSTANT_MACROS",
- "-D__STDC_FORMAT_MACROS",
- "-Oz",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "third_party/abseil-cpp/",
- "third_party/boringssl/src/include/",
- "third_party/protobuf/src/",
- ],
- cpp_std: "c++17",
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- "-Wl,--script,external/cronet/base/android/library_loader/anchor_functions.lds",
- "-Wl,-wrap,asprintf",
- "-Wl,-wrap,calloc",
- "-Wl,-wrap,free",
- "-Wl,-wrap,getcwd",
- "-Wl,-wrap,malloc",
- "-Wl,-wrap,malloc_usable_size",
- "-Wl,-wrap,memalign",
- "-Wl,-wrap,posix_memalign",
- "-Wl,-wrap,pvalloc",
- "-Wl,-wrap,realloc",
- "-Wl,-wrap,realpath",
- "-Wl,-wrap,strdup",
- "-Wl,-wrap,strndup",
- "-Wl,-wrap,valloc",
- "-Wl,-wrap,vasprintf",
- ],
- target: {
- android_arm: {
- cflags: [
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-fstack-protector",
- "-msse3",
- ],
- },
- },
-}
-
-// GN: //components/prefs/android:jni_headers
-cc_genrule {
- name: "cronet_aml_components_prefs_android_jni_headers",
- srcs: [
- "components/prefs/android/java/src/org/chromium/components/prefs/PrefService.java",
- ],
- cmd: "$(location base/android/jni_generator/jni_generator.py) --ptr_type " +
- "long " +
- "--output_dir " +
- "$(genDir)/components/prefs/android/jni_headers " +
- "--includes " +
- "base/android/jni_generator/jni_generator_helper.h " +
- "--use_proxy_hash " +
- "--output_name " +
- "PrefService_jni.h " +
- "--input_file " +
- "$(location components/prefs/android/java/src/org/chromium/components/prefs/PrefService.java) " +
- "--package_prefix " +
- "android.net.http.internal",
- out: [
- "components/prefs/android/jni_headers/PrefService_jni.h",
- ],
- tool_files: [
- "base/android/jni_generator/android_jar.classes",
- "base/android/jni_generator/jni_generator.py",
- "build/android/gyp/util/__init__.py",
- "build/android/gyp/util/build_utils.py",
- "build/gn_helpers.py",
- ],
- apex_available: [
- "com.android.tethering",
- ],
-}
-
-// GN: //components/prefs/android:jni_headers__testing
-cc_genrule {
- name: "cronet_aml_components_prefs_android_jni_headers__testing",
- srcs: [
- "components/prefs/android/java/src/org/chromium/components/prefs/PrefService.java",
- ],
- cmd: "$(location base/android/jni_generator/jni_generator.py) --ptr_type " +
- "long " +
- "--output_dir " +
- "$(genDir)/components/prefs/android/jni_headers " +
- "--includes " +
- "base/android/jni_generator/jni_generator_helper.h " +
- "--use_proxy_hash " +
- "--output_name " +
- "PrefService_jni.h " +
- "--input_file " +
- "$(location components/prefs/android/java/src/org/chromium/components/prefs/PrefService.java)",
- out: [
- "components/prefs/android/jni_headers/PrefService_jni.h",
- ],
- tool_files: [
- "base/android/jni_generator/android_jar.classes",
- "base/android/jni_generator/jni_generator.py",
- "build/android/gyp/util/__init__.py",
- "build/android/gyp/util/build_utils.py",
- "build/gn_helpers.py",
- ],
- apex_available: [
- "com.android.tethering",
- ],
-}
-
-// GN: //components/prefs:prefs
-cc_library_static {
- name: "cronet_aml_components_prefs_prefs",
- srcs: [
- "components/prefs/android/pref_service_android.cc",
- "components/prefs/command_line_pref_store.cc",
- "components/prefs/default_pref_store.cc",
- "components/prefs/in_memory_pref_store.cc",
- "components/prefs/json_pref_store.cc",
- "components/prefs/overlay_user_pref_store.cc",
- "components/prefs/persistent_pref_store.cc",
- "components/prefs/pref_change_registrar.cc",
- "components/prefs/pref_member.cc",
- "components/prefs/pref_notifier_impl.cc",
- "components/prefs/pref_registry.cc",
- "components/prefs/pref_registry_simple.cc",
- "components/prefs/pref_service.cc",
- "components/prefs/pref_service_factory.cc",
- "components/prefs/pref_store.cc",
- "components/prefs/pref_value_map.cc",
- "components/prefs/pref_value_store.cc",
- "components/prefs/scoped_user_pref_update.cc",
- "components/prefs/segregated_pref_store.cc",
- "components/prefs/value_map_pref_store.cc",
- "components/prefs/writeable_pref_store.cc",
- ],
- shared_libs: [
- "libandroid",
- "liblog",
- ],
- static_libs: [
- "cronet_aml_base_allocator_partition_allocator_partition_alloc",
- "cronet_aml_base_base",
- "cronet_aml_base_base_static",
- "cronet_aml_base_nodebug_assertion",
- "cronet_aml_base_third_party_double_conversion_double_conversion",
- "cronet_aml_base_third_party_dynamic_annotations_dynamic_annotations",
- "cronet_aml_third_party_abseil_cpp_absl_base_base",
- "cronet_aml_third_party_abseil_cpp_absl_base_log_severity",
- "cronet_aml_third_party_abseil_cpp_absl_base_malloc_internal",
- "cronet_aml_third_party_abseil_cpp_absl_base_raw_logging_internal",
- "cronet_aml_third_party_abseil_cpp_absl_base_spinlock_wait",
- "cronet_aml_third_party_abseil_cpp_absl_base_strerror",
- "cronet_aml_third_party_abseil_cpp_absl_base_throw_delegate",
- "cronet_aml_third_party_abseil_cpp_absl_container_hashtablez_sampler",
- "cronet_aml_third_party_abseil_cpp_absl_container_raw_hash_set",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_debugging_internal",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_demangle_internal",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_examine_stack",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_failure_signal_handler",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_stacktrace",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_symbolize",
- "cronet_aml_third_party_abseil_cpp_absl_hash_city",
- "cronet_aml_third_party_abseil_cpp_absl_hash_hash",
- "cronet_aml_third_party_abseil_cpp_absl_hash_low_level_hash",
- "cronet_aml_third_party_abseil_cpp_absl_numeric_int128",
- "cronet_aml_third_party_abseil_cpp_absl_profiling_exponential_biased",
- "cronet_aml_third_party_abseil_cpp_absl_random_distributions",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_platform",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_pool_urbg",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_hwaes",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_hwaes_impl",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_slow",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_seed_material",
- "cronet_aml_third_party_abseil_cpp_absl_random_seed_gen_exception",
- "cronet_aml_third_party_abseil_cpp_absl_random_seed_sequences",
- "cronet_aml_third_party_abseil_cpp_absl_status_status",
- "cronet_aml_third_party_abseil_cpp_absl_status_statusor",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cord",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cord_internal",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_functions",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_handle",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_info",
- "cronet_aml_third_party_abseil_cpp_absl_strings_internal",
- "cronet_aml_third_party_abseil_cpp_absl_strings_str_format_internal",
- "cronet_aml_third_party_abseil_cpp_absl_strings_strings",
- "cronet_aml_third_party_abseil_cpp_absl_synchronization_graphcycles_internal",
- "cronet_aml_third_party_abseil_cpp_absl_synchronization_synchronization",
- "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_civil_time",
- "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_time_zone",
- "cronet_aml_third_party_abseil_cpp_absl_time_time",
- "cronet_aml_third_party_abseil_cpp_absl_types_bad_optional_access",
- "cronet_aml_third_party_abseil_cpp_absl_types_bad_variant_access",
- "cronet_aml_third_party_android_ndk_cpu_features",
- "cronet_aml_third_party_ashmem_ashmem",
- "cronet_aml_third_party_boringssl_boringssl",
- "cronet_aml_third_party_boringssl_boringssl_asm",
- "cronet_aml_third_party_icu_icui18n",
- "cronet_aml_third_party_icu_icuuc_private",
- "cronet_aml_third_party_libevent_libevent",
- "cronet_aml_third_party_modp_b64_modp_b64",
- ],
- generated_headers: [
- "cronet_aml_base_debugging_buildflags",
- "cronet_aml_base_logging_buildflags",
- "cronet_aml_build_chromeos_buildflags",
- "cronet_aml_components_prefs_android_jni_headers",
- ],
- export_generated_headers: [
- "cronet_aml_base_debugging_buildflags",
- "cronet_aml_base_logging_buildflags",
- "cronet_aml_build_chromeos_buildflags",
- "cronet_aml_components_prefs_android_jni_headers",
- ],
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DCOMPONENTS_PREFS_IMPLEMENTATION",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DHAVE_SYS_UIO_H",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_FORTIFY_SOURCE=2",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D__STDC_CONSTANT_MACROS",
- "-D__STDC_FORMAT_MACROS",
- "-Oz",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "third_party/abseil-cpp/",
- "third_party/boringssl/src/include/",
- ],
- cpp_std: "c++17",
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- "-Wl,--script,external/cronet/base/android/library_loader/anchor_functions.lds",
- "-Wl,-wrap,asprintf",
- "-Wl,-wrap,calloc",
- "-Wl,-wrap,free",
- "-Wl,-wrap,getcwd",
- "-Wl,-wrap,malloc",
- "-Wl,-wrap,malloc_usable_size",
- "-Wl,-wrap,memalign",
- "-Wl,-wrap,posix_memalign",
- "-Wl,-wrap,pvalloc",
- "-Wl,-wrap,realloc",
- "-Wl,-wrap,realpath",
- "-Wl,-wrap,strdup",
- "-Wl,-wrap,strndup",
- "-Wl,-wrap,valloc",
- "-Wl,-wrap,vasprintf",
- ],
- target: {
- android_arm: {
- cflags: [
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-fstack-protector",
- "-msse3",
- ],
- },
- },
-}
-
-// GN: //components/prefs:prefs__testing
-cc_library_static {
- name: "cronet_aml_components_prefs_prefs__testing",
- srcs: [
- "components/prefs/android/pref_service_android.cc",
- "components/prefs/command_line_pref_store.cc",
- "components/prefs/default_pref_store.cc",
- "components/prefs/in_memory_pref_store.cc",
- "components/prefs/json_pref_store.cc",
- "components/prefs/overlay_user_pref_store.cc",
- "components/prefs/persistent_pref_store.cc",
- "components/prefs/pref_change_registrar.cc",
- "components/prefs/pref_member.cc",
- "components/prefs/pref_notifier_impl.cc",
- "components/prefs/pref_registry.cc",
- "components/prefs/pref_registry_simple.cc",
- "components/prefs/pref_service.cc",
- "components/prefs/pref_service_factory.cc",
- "components/prefs/pref_store.cc",
- "components/prefs/pref_value_map.cc",
- "components/prefs/pref_value_store.cc",
- "components/prefs/scoped_user_pref_update.cc",
- "components/prefs/segregated_pref_store.cc",
- "components/prefs/value_map_pref_store.cc",
- "components/prefs/writeable_pref_store.cc",
- ],
- shared_libs: [
- "libandroid",
- "liblog",
- ],
- static_libs: [
- "cronet_aml_base_allocator_partition_allocator_partition_alloc__testing",
- "cronet_aml_base_base__testing",
- "cronet_aml_base_base_static__testing",
- "cronet_aml_base_nodebug_assertion__testing",
- "cronet_aml_base_third_party_double_conversion_double_conversion__testing",
- "cronet_aml_base_third_party_dynamic_annotations_dynamic_annotations__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_base__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_log_severity__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_malloc_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_raw_logging_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_spinlock_wait__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_strerror__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_throw_delegate__testing",
- "cronet_aml_third_party_abseil_cpp_absl_container_hashtablez_sampler__testing",
- "cronet_aml_third_party_abseil_cpp_absl_container_raw_hash_set__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_debugging_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_demangle_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_examine_stack__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_failure_signal_handler__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_stacktrace__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_symbolize__testing",
- "cronet_aml_third_party_abseil_cpp_absl_hash_city__testing",
- "cronet_aml_third_party_abseil_cpp_absl_hash_hash__testing",
- "cronet_aml_third_party_abseil_cpp_absl_hash_low_level_hash__testing",
- "cronet_aml_third_party_abseil_cpp_absl_numeric_int128__testing",
- "cronet_aml_third_party_abseil_cpp_absl_profiling_exponential_biased__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_distributions__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_platform__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_pool_urbg__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_hwaes__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_hwaes_impl__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_slow__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_seed_material__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_seed_gen_exception__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_seed_sequences__testing",
- "cronet_aml_third_party_abseil_cpp_absl_status_status__testing",
- "cronet_aml_third_party_abseil_cpp_absl_status_statusor__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cord__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cord_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_functions__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_handle__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_info__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_str_format_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_strings__testing",
- "cronet_aml_third_party_abseil_cpp_absl_synchronization_graphcycles_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_synchronization_synchronization__testing",
- "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_civil_time__testing",
- "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_time_zone__testing",
- "cronet_aml_third_party_abseil_cpp_absl_time_time__testing",
- "cronet_aml_third_party_abseil_cpp_absl_types_bad_optional_access__testing",
- "cronet_aml_third_party_abseil_cpp_absl_types_bad_variant_access__testing",
- "cronet_aml_third_party_android_ndk_cpu_features__testing",
- "cronet_aml_third_party_ashmem_ashmem__testing",
- "cronet_aml_third_party_boringssl_boringssl__testing",
- "cronet_aml_third_party_boringssl_boringssl_asm__testing",
- "cronet_aml_third_party_icu_icui18n__testing",
- "cronet_aml_third_party_icu_icuuc_private__testing",
- "cronet_aml_third_party_libevent_libevent__testing",
- "cronet_aml_third_party_modp_b64_modp_b64__testing",
- ],
- generated_headers: [
- "cronet_aml_base_debugging_buildflags__testing",
- "cronet_aml_base_logging_buildflags__testing",
- "cronet_aml_build_chromeos_buildflags__testing",
- "cronet_aml_components_prefs_android_jni_headers__testing",
- ],
- export_generated_headers: [
- "cronet_aml_base_debugging_buildflags__testing",
- "cronet_aml_base_logging_buildflags__testing",
- "cronet_aml_build_chromeos_buildflags__testing",
- "cronet_aml_components_prefs_android_jni_headers__testing",
- ],
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DCOMPONENTS_PREFS_IMPLEMENTATION",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DHAVE_SYS_UIO_H",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_FORTIFY_SOURCE=2",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D__STDC_CONSTANT_MACROS",
- "-D__STDC_FORMAT_MACROS",
- "-Oz",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "third_party/abseil-cpp/",
- "third_party/boringssl/src/include/",
- ],
- cpp_std: "c++17",
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- "-Wl,--script,external/cronet/base/android/library_loader/anchor_functions.lds",
- "-Wl,-wrap,asprintf",
- "-Wl,-wrap,calloc",
- "-Wl,-wrap,free",
- "-Wl,-wrap,getcwd",
- "-Wl,-wrap,malloc",
- "-Wl,-wrap,malloc_usable_size",
- "-Wl,-wrap,memalign",
- "-Wl,-wrap,posix_memalign",
- "-Wl,-wrap,pvalloc",
- "-Wl,-wrap,realloc",
- "-Wl,-wrap,realpath",
- "-Wl,-wrap,strdup",
- "-Wl,-wrap,strndup",
- "-Wl,-wrap,valloc",
- "-Wl,-wrap,vasprintf",
- ],
- target: {
- android_arm: {
- cflags: [
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-fstack-protector",
- "-msse3",
- ],
- },
- },
-}
-
-// GN: //components/prefs:test_support__testing
-cc_library_static {
- name: "cronet_aml_components_prefs_test_support__testing",
- srcs: [
- "components/prefs/mock_pref_change_callback.cc",
- "components/prefs/pref_store_observer_mock.cc",
- "components/prefs/pref_test_utils.cc",
- "components/prefs/testing_pref_service.cc",
- "components/prefs/testing_pref_store.cc",
- ],
- shared_libs: [
- "libandroid",
- "liblog",
- "libz",
- ],
- static_libs: [
- "cronet_aml_base_allocator_partition_allocator_partition_alloc__testing",
- "cronet_aml_base_base__testing",
- "cronet_aml_base_base_static__testing",
- "cronet_aml_base_i18n__testing",
- "cronet_aml_base_nodebug_assertion__testing",
- "cronet_aml_base_test_test_config__testing",
- "cronet_aml_base_test_test_support__testing",
- "cronet_aml_base_third_party_double_conversion_double_conversion__testing",
- "cronet_aml_base_third_party_dynamic_annotations_dynamic_annotations__testing",
- "cronet_aml_components_prefs_prefs__testing",
- "cronet_aml_testing_gtest_gtest__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_base__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_log_severity__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_malloc_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_raw_logging_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_spinlock_wait__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_strerror__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_throw_delegate__testing",
- "cronet_aml_third_party_abseil_cpp_absl_container_hashtablez_sampler__testing",
- "cronet_aml_third_party_abseil_cpp_absl_container_raw_hash_set__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_debugging_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_demangle_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_examine_stack__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_failure_signal_handler__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_stacktrace__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_symbolize__testing",
- "cronet_aml_third_party_abseil_cpp_absl_hash_city__testing",
- "cronet_aml_third_party_abseil_cpp_absl_hash_hash__testing",
- "cronet_aml_third_party_abseil_cpp_absl_hash_low_level_hash__testing",
- "cronet_aml_third_party_abseil_cpp_absl_numeric_int128__testing",
- "cronet_aml_third_party_abseil_cpp_absl_profiling_exponential_biased__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_distributions__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_platform__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_pool_urbg__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_hwaes__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_hwaes_impl__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_slow__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_seed_material__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_seed_gen_exception__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_seed_sequences__testing",
- "cronet_aml_third_party_abseil_cpp_absl_status_status__testing",
- "cronet_aml_third_party_abseil_cpp_absl_status_statusor__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cord__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cord_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_functions__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_handle__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_info__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_str_format_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_strings__testing",
- "cronet_aml_third_party_abseil_cpp_absl_synchronization_graphcycles_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_synchronization_synchronization__testing",
- "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_civil_time__testing",
- "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_time_zone__testing",
- "cronet_aml_third_party_abseil_cpp_absl_time_time__testing",
- "cronet_aml_third_party_abseil_cpp_absl_types_bad_optional_access__testing",
- "cronet_aml_third_party_abseil_cpp_absl_types_bad_variant_access__testing",
- "cronet_aml_third_party_android_ndk_cpu_features__testing",
- "cronet_aml_third_party_ashmem_ashmem__testing",
- "cronet_aml_third_party_boringssl_boringssl__testing",
- "cronet_aml_third_party_boringssl_boringssl_asm__testing",
- "cronet_aml_third_party_ced_ced__testing",
- "cronet_aml_third_party_googletest_gmock__testing",
- "cronet_aml_third_party_googletest_gtest__testing",
- "cronet_aml_third_party_icu_icui18n__testing",
- "cronet_aml_third_party_icu_icuuc_private__testing",
- "cronet_aml_third_party_libevent_libevent__testing",
- "cronet_aml_third_party_libxml_libxml__testing",
- "cronet_aml_third_party_libxml_libxml_utils__testing",
- "cronet_aml_third_party_libxml_xml_reader__testing",
- "cronet_aml_third_party_modp_b64_modp_b64__testing",
- ],
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DGTEST_API_=",
- "-DGTEST_HAS_ABSL=1",
- "-DGTEST_HAS_POSIX_RE=0",
- "-DGTEST_HAS_TR1_TUPLE=0",
- "-DGTEST_LANG_CXX11=1",
- "-DHAVE_SYS_UIO_H",
- "-DICU_UTIL_DATA_IMPL=ICU_UTIL_DATA_FILE",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-DUNIT_TEST",
- "-DUSE_CHROMIUM_ICU=1",
- "-DU_ENABLE_DYLOAD=0",
- "-DU_ENABLE_RESOURCE_TRACING=0",
- "-DU_ENABLE_TRACING=1",
- "-DU_STATIC_IMPLEMENTATION",
- "-DU_USING_ICU_NAMESPACE=0",
- "-D_FORTIFY_SOURCE=2",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D__STDC_CONSTANT_MACROS",
- "-D__STDC_FORMAT_MACROS",
- "-Oz",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "third_party/abseil-cpp/",
- "third_party/boringssl/src/include/",
- "third_party/ced/src/",
- "third_party/googletest/custom/",
- "third_party/googletest/src/googlemock/include/",
- "third_party/googletest/src/googletest/include/",
- "third_party/icu/source/common/",
- "third_party/icu/source/i18n/",
- ],
- cpp_std: "c++17",
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- "-Wl,--script,external/cronet/base/android/library_loader/anchor_functions.lds",
- "-Wl,-wrap,asprintf",
- "-Wl,-wrap,calloc",
- "-Wl,-wrap,free",
- "-Wl,-wrap,getcwd",
- "-Wl,-wrap,malloc",
- "-Wl,-wrap,malloc_usable_size",
- "-Wl,-wrap,memalign",
- "-Wl,-wrap,posix_memalign",
- "-Wl,-wrap,pvalloc",
- "-Wl,-wrap,realloc",
- "-Wl,-wrap,realpath",
- "-Wl,-wrap,strdup",
- "-Wl,-wrap,strndup",
- "-Wl,-wrap,valloc",
- "-Wl,-wrap,vasprintf",
- ],
- target: {
- android_arm: {
- cflags: [
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-fstack-protector",
- "-msse3",
- ],
- },
- },
-}
-
-// GN: //crypto:buildflags
-cc_genrule {
- name: "cronet_aml_crypto_buildflags",
- cmd: "echo '--flags USE_NSS_CERTS=\"false\"' | " +
- "$(location build/write_buildflag_header.py) --output " +
- "$(out) " +
- "--rulename " +
- "//crypto:buildflags " +
- "--gen-dir " +
- ". " +
- "--definitions " +
- "/dev/stdin",
- out: [
- "crypto/crypto_buildflags.h",
- ],
- tool_files: [
- "build/write_buildflag_header.py",
- ],
- apex_available: [
- "com.android.tethering",
- ],
-}
-
-// GN: //crypto:buildflags__testing
-cc_genrule {
- name: "cronet_aml_crypto_buildflags__testing",
- cmd: "echo '--flags USE_NSS_CERTS=\"false\"' | " +
- "$(location build/write_buildflag_header.py) --output " +
- "$(out) " +
- "--rulename " +
- "//crypto:buildflags " +
- "--gen-dir " +
- ". " +
- "--definitions " +
- "/dev/stdin",
- host_supported: true,
- out: [
- "crypto/crypto_buildflags.h",
- ],
- tool_files: [
- "build/write_buildflag_header.py",
- ],
- apex_available: [
- "com.android.tethering",
- ],
-}
-
-// GN: //crypto:crypto
-cc_library_static {
- name: "cronet_aml_crypto_crypto",
- srcs: [
- "crypto/aead.cc",
- "crypto/ec_private_key.cc",
- "crypto/ec_signature_creator.cc",
- "crypto/ec_signature_creator_impl.cc",
- "crypto/encryptor.cc",
- "crypto/hkdf.cc",
- "crypto/hmac.cc",
- "crypto/openssl_util.cc",
- "crypto/p224_spake.cc",
- "crypto/random.cc",
- "crypto/rsa_private_key.cc",
- "crypto/secure_hash.cc",
- "crypto/secure_util.cc",
- "crypto/sha2.cc",
- "crypto/signature_creator.cc",
- "crypto/signature_verifier.cc",
- "crypto/symmetric_key.cc",
- "crypto/unexportable_key.cc",
- "crypto/unexportable_key_metrics.cc",
- ],
- shared_libs: [
- "libandroid",
- "liblog",
- ],
- static_libs: [
- "cronet_aml_base_allocator_partition_allocator_partition_alloc",
- "cronet_aml_base_base",
- "cronet_aml_base_base_static",
- "cronet_aml_base_nodebug_assertion",
- "cronet_aml_base_third_party_double_conversion_double_conversion",
- "cronet_aml_base_third_party_dynamic_annotations_dynamic_annotations",
- "cronet_aml_third_party_abseil_cpp_absl_base_base",
- "cronet_aml_third_party_abseil_cpp_absl_base_log_severity",
- "cronet_aml_third_party_abseil_cpp_absl_base_malloc_internal",
- "cronet_aml_third_party_abseil_cpp_absl_base_raw_logging_internal",
- "cronet_aml_third_party_abseil_cpp_absl_base_spinlock_wait",
- "cronet_aml_third_party_abseil_cpp_absl_base_strerror",
- "cronet_aml_third_party_abseil_cpp_absl_base_throw_delegate",
- "cronet_aml_third_party_abseil_cpp_absl_container_hashtablez_sampler",
- "cronet_aml_third_party_abseil_cpp_absl_container_raw_hash_set",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_debugging_internal",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_demangle_internal",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_examine_stack",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_failure_signal_handler",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_stacktrace",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_symbolize",
- "cronet_aml_third_party_abseil_cpp_absl_hash_city",
- "cronet_aml_third_party_abseil_cpp_absl_hash_hash",
- "cronet_aml_third_party_abseil_cpp_absl_hash_low_level_hash",
- "cronet_aml_third_party_abseil_cpp_absl_numeric_int128",
- "cronet_aml_third_party_abseil_cpp_absl_profiling_exponential_biased",
- "cronet_aml_third_party_abseil_cpp_absl_random_distributions",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_platform",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_pool_urbg",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_hwaes",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_hwaes_impl",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_slow",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_seed_material",
- "cronet_aml_third_party_abseil_cpp_absl_random_seed_gen_exception",
- "cronet_aml_third_party_abseil_cpp_absl_random_seed_sequences",
- "cronet_aml_third_party_abseil_cpp_absl_status_status",
- "cronet_aml_third_party_abseil_cpp_absl_status_statusor",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cord",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cord_internal",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_functions",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_handle",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_info",
- "cronet_aml_third_party_abseil_cpp_absl_strings_internal",
- "cronet_aml_third_party_abseil_cpp_absl_strings_str_format_internal",
- "cronet_aml_third_party_abseil_cpp_absl_strings_strings",
- "cronet_aml_third_party_abseil_cpp_absl_synchronization_graphcycles_internal",
- "cronet_aml_third_party_abseil_cpp_absl_synchronization_synchronization",
- "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_civil_time",
- "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_time_zone",
- "cronet_aml_third_party_abseil_cpp_absl_time_time",
- "cronet_aml_third_party_abseil_cpp_absl_types_bad_optional_access",
- "cronet_aml_third_party_abseil_cpp_absl_types_bad_variant_access",
- "cronet_aml_third_party_android_ndk_cpu_features",
- "cronet_aml_third_party_ashmem_ashmem",
- "cronet_aml_third_party_boringssl_boringssl",
- "cronet_aml_third_party_boringssl_boringssl_asm",
- "cronet_aml_third_party_icu_icui18n",
- "cronet_aml_third_party_icu_icuuc_private",
- "cronet_aml_third_party_libevent_libevent",
- "cronet_aml_third_party_modp_b64_modp_b64",
- ],
- generated_headers: [
- "cronet_aml_crypto_buildflags",
- ],
- export_generated_headers: [
- "cronet_aml_crypto_buildflags",
- ],
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DCRYPTO_IMPLEMENTATION",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DHAVE_SYS_UIO_H",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_FORTIFY_SOURCE=2",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D__STDC_CONSTANT_MACROS",
- "-D__STDC_FORMAT_MACROS",
- "-Oz",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "third_party/abseil-cpp/",
- "third_party/boringssl/src/include/",
- ],
- cpp_std: "c++17",
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- "-Wl,--script,external/cronet/base/android/library_loader/anchor_functions.lds",
- "-Wl,-wrap,asprintf",
- "-Wl,-wrap,calloc",
- "-Wl,-wrap,free",
- "-Wl,-wrap,getcwd",
- "-Wl,-wrap,malloc",
- "-Wl,-wrap,malloc_usable_size",
- "-Wl,-wrap,memalign",
- "-Wl,-wrap,posix_memalign",
- "-Wl,-wrap,pvalloc",
- "-Wl,-wrap,realloc",
- "-Wl,-wrap,realpath",
- "-Wl,-wrap,strdup",
- "-Wl,-wrap,strndup",
- "-Wl,-wrap,valloc",
- "-Wl,-wrap,vasprintf",
- ],
- target: {
- android_arm: {
- cflags: [
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-fstack-protector",
- "-msse3",
- ],
- },
- },
-}
-
-// GN: //crypto:crypto__testing
-cc_library_static {
- name: "cronet_aml_crypto_crypto__testing",
- srcs: [
- "crypto/aead.cc",
- "crypto/ec_private_key.cc",
- "crypto/ec_signature_creator.cc",
- "crypto/ec_signature_creator_impl.cc",
- "crypto/encryptor.cc",
- "crypto/hkdf.cc",
- "crypto/hmac.cc",
- "crypto/openssl_util.cc",
- "crypto/p224_spake.cc",
- "crypto/random.cc",
- "crypto/rsa_private_key.cc",
- "crypto/secure_hash.cc",
- "crypto/secure_util.cc",
- "crypto/sha2.cc",
- "crypto/signature_creator.cc",
- "crypto/signature_verifier.cc",
- "crypto/symmetric_key.cc",
- "crypto/unexportable_key.cc",
- "crypto/unexportable_key_metrics.cc",
- ],
- static_libs: [
- "cronet_aml_base_allocator_partition_allocator_partition_alloc__testing",
- "cronet_aml_base_base__testing",
- "cronet_aml_base_base_static__testing",
- "cronet_aml_base_nodebug_assertion__testing",
- "cronet_aml_base_third_party_double_conversion_double_conversion__testing",
- "cronet_aml_base_third_party_dynamic_annotations_dynamic_annotations__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_base__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_log_severity__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_malloc_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_raw_logging_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_spinlock_wait__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_strerror__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_throw_delegate__testing",
- "cronet_aml_third_party_abseil_cpp_absl_container_hashtablez_sampler__testing",
- "cronet_aml_third_party_abseil_cpp_absl_container_raw_hash_set__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_debugging_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_demangle_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_examine_stack__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_failure_signal_handler__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_stacktrace__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_symbolize__testing",
- "cronet_aml_third_party_abseil_cpp_absl_hash_city__testing",
- "cronet_aml_third_party_abseil_cpp_absl_hash_hash__testing",
- "cronet_aml_third_party_abseil_cpp_absl_hash_low_level_hash__testing",
- "cronet_aml_third_party_abseil_cpp_absl_numeric_int128__testing",
- "cronet_aml_third_party_abseil_cpp_absl_profiling_exponential_biased__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_distributions__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_platform__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_pool_urbg__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_hwaes__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_hwaes_impl__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_slow__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_seed_material__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_seed_gen_exception__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_seed_sequences__testing",
- "cronet_aml_third_party_abseil_cpp_absl_status_status__testing",
- "cronet_aml_third_party_abseil_cpp_absl_status_statusor__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cord__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cord_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_functions__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_handle__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_info__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_str_format_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_strings__testing",
- "cronet_aml_third_party_abseil_cpp_absl_synchronization_graphcycles_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_synchronization_synchronization__testing",
- "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_civil_time__testing",
- "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_time_zone__testing",
- "cronet_aml_third_party_abseil_cpp_absl_time_time__testing",
- "cronet_aml_third_party_abseil_cpp_absl_types_bad_optional_access__testing",
- "cronet_aml_third_party_abseil_cpp_absl_types_bad_variant_access__testing",
- "cronet_aml_third_party_boringssl_boringssl__testing",
- "cronet_aml_third_party_boringssl_boringssl_asm__testing",
- "cronet_aml_third_party_icu_icui18n__testing",
- "cronet_aml_third_party_icu_icuuc_private__testing",
- "cronet_aml_third_party_libevent_libevent__testing",
- "cronet_aml_third_party_modp_b64_modp_b64__testing",
- ],
- host_supported: true,
- generated_headers: [
- "cronet_aml_crypto_buildflags__testing",
- ],
- export_generated_headers: [
- "cronet_aml_crypto_buildflags__testing",
- ],
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DCRYPTO_IMPLEMENTATION",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_FORTIFY_SOURCE=2",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D__STDC_CONSTANT_MACROS",
- "-D__STDC_FORMAT_MACROS",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "third_party/abseil-cpp/",
- "third_party/boringssl/src/include/",
- ],
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- "-Wl,--script,external/cronet/base/android/library_loader/anchor_functions.lds",
- ],
- target: {
- android: {
- shared_libs: [
- "libandroid",
- "liblog",
- ],
- },
- android_arm: {
- static_libs: [
- "cronet_aml_third_party_android_ndk_cpu_features__testing",
- "cronet_aml_third_party_ashmem_ashmem__testing",
- ],
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- ],
- ldflags: [
- "-Wl,-wrap,asprintf",
- "-Wl,-wrap,calloc",
- "-Wl,-wrap,free",
- "-Wl,-wrap,getcwd",
- "-Wl,-wrap,malloc",
- "-Wl,-wrap,malloc_usable_size",
- "-Wl,-wrap,memalign",
- "-Wl,-wrap,posix_memalign",
- "-Wl,-wrap,pvalloc",
- "-Wl,-wrap,realloc",
- "-Wl,-wrap,realpath",
- "-Wl,-wrap,strdup",
- "-Wl,-wrap,strndup",
- "-Wl,-wrap,valloc",
- "-Wl,-wrap,vasprintf",
- ],
- },
- android_arm64: {
- static_libs: [
- "cronet_aml_third_party_android_ndk_cpu_features__testing",
- "cronet_aml_third_party_ashmem_ashmem__testing",
- ],
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- ldflags: [
- "-Wl,-wrap,asprintf",
- "-Wl,-wrap,calloc",
- "-Wl,-wrap,free",
- "-Wl,-wrap,getcwd",
- "-Wl,-wrap,malloc",
- "-Wl,-wrap,malloc_usable_size",
- "-Wl,-wrap,memalign",
- "-Wl,-wrap,posix_memalign",
- "-Wl,-wrap,pvalloc",
- "-Wl,-wrap,realloc",
- "-Wl,-wrap,realpath",
- "-Wl,-wrap,strdup",
- "-Wl,-wrap,strndup",
- "-Wl,-wrap,valloc",
- "-Wl,-wrap,vasprintf",
- ],
- },
- android_x86: {
- static_libs: [
- "cronet_aml_third_party_android_ndk_cpu_features__testing",
- "cronet_aml_third_party_ashmem_ashmem__testing",
- ],
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-msse3",
- ],
- ldflags: [
- "-Wl,-wrap,asprintf",
- "-Wl,-wrap,calloc",
- "-Wl,-wrap,free",
- "-Wl,-wrap,getcwd",
- "-Wl,-wrap,malloc",
- "-Wl,-wrap,malloc_usable_size",
- "-Wl,-wrap,memalign",
- "-Wl,-wrap,posix_memalign",
- "-Wl,-wrap,pvalloc",
- "-Wl,-wrap,realloc",
- "-Wl,-wrap,realpath",
- "-Wl,-wrap,strdup",
- "-Wl,-wrap,strndup",
- "-Wl,-wrap,valloc",
- "-Wl,-wrap,vasprintf",
- ],
- },
- android_x86_64: {
- static_libs: [
- "cronet_aml_third_party_android_ndk_cpu_features__testing",
- "cronet_aml_third_party_ashmem_ashmem__testing",
- ],
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- "-msse3",
- ],
- ldflags: [
- "-Wl,-wrap,asprintf",
- "-Wl,-wrap,calloc",
- "-Wl,-wrap,free",
- "-Wl,-wrap,getcwd",
- "-Wl,-wrap,malloc",
- "-Wl,-wrap,malloc_usable_size",
- "-Wl,-wrap,memalign",
- "-Wl,-wrap,posix_memalign",
- "-Wl,-wrap,pvalloc",
- "-Wl,-wrap,realloc",
- "-Wl,-wrap,realpath",
- "-Wl,-wrap,strdup",
- "-Wl,-wrap,strndup",
- "-Wl,-wrap,valloc",
- "-Wl,-wrap,vasprintf",
- ],
- },
- host: {
- cflags: [
- "-DCR_SYSROOT_KEY=20220331T153654Z-0",
- "-DUSE_AURA=1",
- "-DUSE_OZONE=1",
- "-DUSE_UDEV",
- "-D_FILE_OFFSET_BITS=64",
- "-D_LARGEFILE64_SOURCE",
- "-D_LARGEFILE_SOURCE",
- "-O2",
- "-fstack-protector",
- "-msse3",
- ],
- compile_multilib: "64",
- },
- },
-}
-
-// GN: //gn:default_deps
-cc_defaults {
- name: "cronet_aml_defaults",
- cflags: [
- "-DGOOGLE_PROTOBUF_NO_RTTI",
- "-Wno-ambiguous-reversed-operator",
- "-Wno-c++11-narrowing",
- "-Wno-error=return-type",
- "-Wno-macro-redefined",
- "-Wno-missing-field-initializers",
- "-Wno-non-virtual-dtor",
- "-Wno-null-pointer-subtraction",
- "-Wno-sign-compare",
- "-Wno-sign-promo",
- "-Wno-unreachable-code-loop-increment",
- "-Wno-unused-parameter",
- "-fPIC",
- ],
- stl: "none",
- cpp_std: "c++17",
- apex_available: [
- "com.android.tethering",
- ],
- min_sdk_version: "29",
- target: {
- android: {
- shared_libs: [
- "libmediandk",
- ],
- header_libs: [
- "jni_headers",
- ],
- },
- host: {
- cflags: [
- "-UANDROID",
- ],
- compile_multilib: "64",
- },
- },
-}
-
-// GN: //gn:java
-java_library {
- name: "cronet_aml_java",
- srcs: [
- ":cronet_aml_base_base_android_java_enums_srcjar",
- ":cronet_aml_base_java_features_srcjar",
- ":cronet_aml_base_java_switches_srcjar",
- ":cronet_aml_build_android_build_config_gen",
- ":cronet_aml_build_android_native_libraries_gen",
- ":cronet_aml_components_cronet_android_cronet_jni_registration__java",
- ":cronet_aml_components_cronet_android_http_cache_type_java",
- ":cronet_aml_components_cronet_android_implementation_api_version",
- ":cronet_aml_components_cronet_android_integrated_mode_state",
- ":cronet_aml_components_cronet_android_interface_api_version",
- ":cronet_aml_components_cronet_android_load_states_list",
- ":cronet_aml_components_cronet_android_net_idempotency_java",
- ":cronet_aml_components_cronet_android_net_request_priority_java",
- ":cronet_aml_components_cronet_android_network_quality_observation_source_java",
- ":cronet_aml_components_cronet_android_rtt_throughput_values_java",
- ":cronet_aml_components_cronet_android_url_request_error_java",
- ":cronet_aml_net_android_net_android_java_enums_srcjar",
- ":cronet_aml_net_android_net_errors_java",
- ":cronet_aml_net_effective_connection_type_java",
- "base/android/java/src/org/chromium/base/ActivityState.java",
- "base/android/java/src/org/chromium/base/ApiCompatibilityUtils.java",
- "base/android/java/src/org/chromium/base/ApkAssets.java",
- "base/android/java/src/org/chromium/base/ApplicationStatus.java",
- "base/android/java/src/org/chromium/base/BaseFeatureList.java",
- "base/android/java/src/org/chromium/base/BuildInfo.java",
- "base/android/java/src/org/chromium/base/BundleUtils.java",
- "base/android/java/src/org/chromium/base/ByteArrayGenerator.java",
- "base/android/java/src/org/chromium/base/Callback.java",
- "base/android/java/src/org/chromium/base/CallbackController.java",
- "base/android/java/src/org/chromium/base/CollectionUtil.java",
- "base/android/java/src/org/chromium/base/CommandLine.java",
- "base/android/java/src/org/chromium/base/CommandLineInitUtil.java",
- "base/android/java/src/org/chromium/base/Consumer.java",
- "base/android/java/src/org/chromium/base/ContentUriUtils.java",
- "base/android/java/src/org/chromium/base/ContextUtils.java",
- "base/android/java/src/org/chromium/base/CpuFeatures.java",
- "base/android/java/src/org/chromium/base/DiscardableReferencePool.java",
- "base/android/java/src/org/chromium/base/EarlyTraceEvent.java",
- "base/android/java/src/org/chromium/base/EventLog.java",
- "base/android/java/src/org/chromium/base/FeatureList.java",
- "base/android/java/src/org/chromium/base/Features.java",
- "base/android/java/src/org/chromium/base/FieldTrialList.java",
- "base/android/java/src/org/chromium/base/FileUtils.java",
- "base/android/java/src/org/chromium/base/Function.java",
- "base/android/java/src/org/chromium/base/ImportantFileWriterAndroid.java",
- "base/android/java/src/org/chromium/base/IntStringCallback.java",
- "base/android/java/src/org/chromium/base/JNIUtils.java",
- "base/android/java/src/org/chromium/base/JavaExceptionReporter.java",
- "base/android/java/src/org/chromium/base/JavaHandlerThread.java",
- "base/android/java/src/org/chromium/base/JniException.java",
- "base/android/java/src/org/chromium/base/JniStaticTestMocker.java",
- "base/android/java/src/org/chromium/base/LifetimeAssert.java",
- "base/android/java/src/org/chromium/base/LocaleUtils.java",
- "base/android/java/src/org/chromium/base/Log.java",
- "base/android/java/src/org/chromium/base/MathUtils.java",
- "base/android/java/src/org/chromium/base/MemoryPressureListener.java",
- "base/android/java/src/org/chromium/base/NativeLibraryLoadedStatus.java",
- "base/android/java/src/org/chromium/base/ObserverList.java",
- "base/android/java/src/org/chromium/base/PackageManagerUtils.java",
- "base/android/java/src/org/chromium/base/PackageUtils.java",
- "base/android/java/src/org/chromium/base/PathService.java",
- "base/android/java/src/org/chromium/base/PathUtils.java",
- "base/android/java/src/org/chromium/base/PiiElider.java",
- "base/android/java/src/org/chromium/base/PowerMonitor.java",
- "base/android/java/src/org/chromium/base/PowerMonitorForQ.java",
- "base/android/java/src/org/chromium/base/Predicate.java",
- "base/android/java/src/org/chromium/base/Promise.java",
- "base/android/java/src/org/chromium/base/RadioUtils.java",
- "base/android/java/src/org/chromium/base/StreamUtil.java",
- "base/android/java/src/org/chromium/base/StrictModeContext.java",
- "base/android/java/src/org/chromium/base/SysUtils.java",
- "base/android/java/src/org/chromium/base/ThreadUtils.java",
- "base/android/java/src/org/chromium/base/TimeUtils.java",
- "base/android/java/src/org/chromium/base/TimezoneUtils.java",
- "base/android/java/src/org/chromium/base/TraceEvent.java",
- "base/android/java/src/org/chromium/base/UnguessableToken.java",
- "base/android/java/src/org/chromium/base/UnownedUserData.java",
- "base/android/java/src/org/chromium/base/UnownedUserDataHost.java",
- "base/android/java/src/org/chromium/base/UnownedUserDataKey.java",
- "base/android/java/src/org/chromium/base/UserData.java",
- "base/android/java/src/org/chromium/base/UserDataHost.java",
- "base/android/java/src/org/chromium/base/WrappedClassLoader.java",
- "base/android/java/src/org/chromium/base/annotations/AccessedByNative.java",
- "base/android/java/src/org/chromium/base/annotations/CalledByNative.java",
- "base/android/java/src/org/chromium/base/annotations/CalledByNativeForTesting.java",
- "base/android/java/src/org/chromium/base/annotations/CalledByNativeUnchecked.java",
- "base/android/java/src/org/chromium/base/annotations/JNIAdditionalImport.java",
- "base/android/java/src/org/chromium/base/annotations/JNINamespace.java",
- "base/android/java/src/org/chromium/base/annotations/JniIgnoreNatives.java",
- "base/android/java/src/org/chromium/base/annotations/NativeClassQualifiedName.java",
- "base/android/java/src/org/chromium/base/annotations/NativeMethods.java",
- "base/android/java/src/org/chromium/base/compat/ApiHelperForM.java",
- "base/android/java/src/org/chromium/base/compat/ApiHelperForN.java",
- "base/android/java/src/org/chromium/base/compat/ApiHelperForO.java",
- "base/android/java/src/org/chromium/base/compat/ApiHelperForOMR1.java",
- "base/android/java/src/org/chromium/base/compat/ApiHelperForP.java",
- "base/android/java/src/org/chromium/base/compat/ApiHelperForQ.java",
- "base/android/java/src/org/chromium/base/compat/ApiHelperForR.java",
- "base/android/java/src/org/chromium/base/compat/ApiHelperForS.java",
- "base/android/java/src/org/chromium/base/jank_tracker/DummyJankTracker.java",
- "base/android/java/src/org/chromium/base/jank_tracker/FrameMetrics.java",
- "base/android/java/src/org/chromium/base/jank_tracker/FrameMetricsListener.java",
- "base/android/java/src/org/chromium/base/jank_tracker/FrameMetricsStore.java",
- "base/android/java/src/org/chromium/base/jank_tracker/JankActivityTracker.java",
- "base/android/java/src/org/chromium/base/jank_tracker/JankMetricCalculator.java",
- "base/android/java/src/org/chromium/base/jank_tracker/JankMetricUMARecorder.java",
- "base/android/java/src/org/chromium/base/jank_tracker/JankMetrics.java",
- "base/android/java/src/org/chromium/base/jank_tracker/JankReportingRunnable.java",
- "base/android/java/src/org/chromium/base/jank_tracker/JankReportingScheduler.java",
- "base/android/java/src/org/chromium/base/jank_tracker/JankScenario.java",
- "base/android/java/src/org/chromium/base/jank_tracker/JankTracker.java",
- "base/android/java/src/org/chromium/base/jank_tracker/JankTrackerImpl.java",
- "base/android/java/src/org/chromium/base/library_loader/LegacyLinker.java",
- "base/android/java/src/org/chromium/base/library_loader/LibraryLoader.java",
- "base/android/java/src/org/chromium/base/library_loader/LibraryPrefetcher.java",
- "base/android/java/src/org/chromium/base/library_loader/Linker.java",
- "base/android/java/src/org/chromium/base/library_loader/LinkerJni.java",
- "base/android/java/src/org/chromium/base/library_loader/LoaderErrors.java",
- "base/android/java/src/org/chromium/base/library_loader/ModernLinker.java",
- "base/android/java/src/org/chromium/base/library_loader/ModernLinkerJni.java",
- "base/android/java/src/org/chromium/base/library_loader/NativeLibraryPreloader.java",
- "base/android/java/src/org/chromium/base/library_loader/ProcessInitException.java",
- "base/android/java/src/org/chromium/base/lifetime/DestroyChecker.java",
- "base/android/java/src/org/chromium/base/lifetime/Destroyable.java",
- "base/android/java/src/org/chromium/base/memory/JavaHeapDumpGenerator.java",
- "base/android/java/src/org/chromium/base/memory/MemoryPressureCallback.java",
- "base/android/java/src/org/chromium/base/memory/MemoryPressureMonitor.java",
- "base/android/java/src/org/chromium/base/memory/MemoryPressureUma.java",
- "base/android/java/src/org/chromium/base/memory/MemoryPurgeManager.java",
- "base/android/java/src/org/chromium/base/metrics/CachingUmaRecorder.java",
- "base/android/java/src/org/chromium/base/metrics/NativeUmaRecorder.java",
- "base/android/java/src/org/chromium/base/metrics/NoopUmaRecorder.java",
- "base/android/java/src/org/chromium/base/metrics/RecordHistogram.java",
- "base/android/java/src/org/chromium/base/metrics/RecordUserAction.java",
- "base/android/java/src/org/chromium/base/metrics/ScopedSysTraceEvent.java",
- "base/android/java/src/org/chromium/base/metrics/StatisticsRecorderAndroid.java",
- "base/android/java/src/org/chromium/base/metrics/TimingMetric.java",
- "base/android/java/src/org/chromium/base/metrics/UmaRecorder.java",
- "base/android/java/src/org/chromium/base/metrics/UmaRecorderHolder.java",
- "base/android/java/src/org/chromium/base/process_launcher/IChildProcessService.aidl",
- "base/android/java/src/org/chromium/base/process_launcher/IParentProcess.aidl",
- "base/android/java/src/org/chromium/base/supplier/BooleanSupplier.java",
- "base/android/java/src/org/chromium/base/supplier/DestroyableObservableSupplier.java",
- "base/android/java/src/org/chromium/base/supplier/ObservableSupplier.java",
- "base/android/java/src/org/chromium/base/supplier/ObservableSupplierImpl.java",
- "base/android/java/src/org/chromium/base/supplier/OneShotCallback.java",
- "base/android/java/src/org/chromium/base/supplier/OneshotSupplier.java",
- "base/android/java/src/org/chromium/base/supplier/OneshotSupplierImpl.java",
- "base/android/java/src/org/chromium/base/supplier/Supplier.java",
- "base/android/java/src/org/chromium/base/supplier/UnownedUserDataSupplier.java",
- "base/android/java/src/org/chromium/base/task/AsyncTask.java",
- "base/android/java/src/org/chromium/base/task/BackgroundOnlyAsyncTask.java",
- "base/android/java/src/org/chromium/base/task/ChainedTasks.java",
- "base/android/java/src/org/chromium/base/task/ChoreographerTaskRunner.java",
- "base/android/java/src/org/chromium/base/task/ChromeThreadPoolExecutor.java",
- "base/android/java/src/org/chromium/base/task/DefaultTaskExecutor.java",
- "base/android/java/src/org/chromium/base/task/PostTask.java",
- "base/android/java/src/org/chromium/base/task/SequencedTaskRunner.java",
- "base/android/java/src/org/chromium/base/task/SequencedTaskRunnerImpl.java",
- "base/android/java/src/org/chromium/base/task/SerialExecutor.java",
- "base/android/java/src/org/chromium/base/task/SingleThreadTaskRunner.java",
- "base/android/java/src/org/chromium/base/task/SingleThreadTaskRunnerImpl.java",
- "base/android/java/src/org/chromium/base/task/TaskExecutor.java",
- "base/android/java/src/org/chromium/base/task/TaskRunner.java",
- "base/android/java/src/org/chromium/base/task/TaskRunnerImpl.java",
- "base/android/java/src/org/chromium/base/task/TaskTraits.java",
- "base/android/java/src/org/chromium/base/task/TaskTraitsExtensionDescriptor.java",
- "base/test/android/java/src/org/chromium/base/ITestCallback.aidl",
- "base/test/android/java/src/org/chromium/base/ITestController.aidl",
- "build/android/java/src/org/chromium/build/annotations/AlwaysInline.java",
- "build/android/java/src/org/chromium/build/annotations/CheckDiscard.java",
- "build/android/java/src/org/chromium/build/annotations/DoNotClassMerge.java",
- "build/android/java/src/org/chromium/build/annotations/DoNotInline.java",
- "build/android/java/src/org/chromium/build/annotations/IdentifierNameString.java",
- "build/android/java/src/org/chromium/build/annotations/MainDex.java",
- "build/android/java/src/org/chromium/build/annotations/MockedInTests.java",
- "build/android/java/src/org/chromium/build/annotations/UsedByReflection.java",
- "components/cronet/android/java/src/org/chromium/net/impl/BidirectionalStreamBuilderImpl.java",
- "components/cronet/android/java/src/org/chromium/net/impl/BidirectionalStreamNetworkException.java",
- "components/cronet/android/java/src/org/chromium/net/impl/CallbackExceptionImpl.java",
- "components/cronet/android/java/src/org/chromium/net/impl/CronetBidirectionalStream.java",
- "components/cronet/android/java/src/org/chromium/net/impl/CronetEngineBase.java",
- "components/cronet/android/java/src/org/chromium/net/impl/CronetEngineBuilderImpl.java",
- "components/cronet/android/java/src/org/chromium/net/impl/CronetExceptionImpl.java",
- "components/cronet/android/java/src/org/chromium/net/impl/CronetLibraryLoader.java",
- "components/cronet/android/java/src/org/chromium/net/impl/CronetLogger.java",
- "components/cronet/android/java/src/org/chromium/net/impl/CronetLoggerFactory.java",
- "components/cronet/android/java/src/org/chromium/net/impl/CronetManifest.java",
- "components/cronet/android/java/src/org/chromium/net/impl/CronetMetrics.java",
- "components/cronet/android/java/src/org/chromium/net/impl/CronetUploadDataStream.java",
- "components/cronet/android/java/src/org/chromium/net/impl/CronetUrlRequest.java",
- "components/cronet/android/java/src/org/chromium/net/impl/CronetUrlRequestContext.java",
- "components/cronet/android/java/src/org/chromium/net/impl/NativeCronetEngineBuilderImpl.java",
- "components/cronet/android/java/src/org/chromium/net/impl/NetworkExceptionImpl.java",
- "components/cronet/android/java/src/org/chromium/net/impl/NoOpLogger.java",
- "components/cronet/android/java/src/org/chromium/net/impl/Preconditions.java",
- "components/cronet/android/java/src/org/chromium/net/impl/QuicExceptionImpl.java",
- "components/cronet/android/java/src/org/chromium/net/impl/RequestFinishedInfoImpl.java",
- "components/cronet/android/java/src/org/chromium/net/impl/UrlRequestBase.java",
- "components/cronet/android/java/src/org/chromium/net/impl/UrlRequestBuilderImpl.java",
- "components/cronet/android/java/src/org/chromium/net/impl/UrlResponseInfoImpl.java",
- "components/cronet/android/java/src/org/chromium/net/impl/UserAgent.java",
- "components/cronet/android/java/src/org/chromium/net/impl/VersionSafeCallbacks.java",
- "components/cronet/android/java/src/org/chromium/net/urlconnection/CronetBufferedOutputStream.java",
- "components/cronet/android/java/src/org/chromium/net/urlconnection/CronetChunkedOutputStream.java",
- "components/cronet/android/java/src/org/chromium/net/urlconnection/CronetFixedModeOutputStream.java",
- "components/cronet/android/java/src/org/chromium/net/urlconnection/CronetHttpURLConnection.java",
- "components/cronet/android/java/src/org/chromium/net/urlconnection/CronetHttpURLStreamHandler.java",
- "components/cronet/android/java/src/org/chromium/net/urlconnection/CronetInputStream.java",
- "components/cronet/android/java/src/org/chromium/net/urlconnection/CronetOutputStream.java",
- "components/cronet/android/java/src/org/chromium/net/urlconnection/CronetURLStreamHandlerFactory.java",
- "components/cronet/android/java/src/org/chromium/net/urlconnection/MessageLoop.java",
- "net/android/java/src/org/chromium/net/AndroidCertVerifyResult.java",
- "net/android/java/src/org/chromium/net/AndroidKeyStore.java",
- "net/android/java/src/org/chromium/net/AndroidNetworkLibrary.java",
- "net/android/java/src/org/chromium/net/AndroidTrafficStats.java",
- "net/android/java/src/org/chromium/net/ChromiumNetworkAdapter.java",
- "net/android/java/src/org/chromium/net/DnsStatus.java",
- "net/android/java/src/org/chromium/net/GURLUtils.java",
- "net/android/java/src/org/chromium/net/HttpNegotiateAuthenticator.java",
- "net/android/java/src/org/chromium/net/HttpNegotiateConstants.java",
- "net/android/java/src/org/chromium/net/HttpUtil.java",
- "net/android/java/src/org/chromium/net/MimeTypeFilter.java",
- "net/android/java/src/org/chromium/net/NetStringUtil.java",
- "net/android/java/src/org/chromium/net/NetworkActiveNotifier.java",
- "net/android/java/src/org/chromium/net/NetworkChangeNotifier.java",
- "net/android/java/src/org/chromium/net/NetworkChangeNotifierAutoDetect.java",
- "net/android/java/src/org/chromium/net/NetworkTrafficAnnotationTag.java",
- "net/android/java/src/org/chromium/net/ProxyBroadcastReceiver.java",
- "net/android/java/src/org/chromium/net/ProxyChangeListener.java",
- "net/android/java/src/org/chromium/net/RegistrationPolicyAlwaysRegister.java",
- "net/android/java/src/org/chromium/net/RegistrationPolicyApplicationStatus.java",
- "net/android/java/src/org/chromium/net/ThreadStatsUid.java",
- "net/android/java/src/org/chromium/net/X509Util.java",
- "url/android/java/src/org/chromium/url/IDNStringUtil.java",
- ],
- static_libs: [
- "modules-utils-build_system",
- ],
- apex_available: [
- "com.android.tethering",
- ],
- min_sdk_version: "30",
- libs: [
- "androidx.annotation_annotation",
- "androidx.annotation_annotation-experimental-nodeps",
- "cronet_aml_api_java",
- "framework-connectivity-t.stubs.module_lib",
- "framework-connectivity.stubs.module_lib",
- "framework-mediaprovider.stubs.module_lib",
- "framework-tethering.stubs.module_lib",
- "framework-wifi.stubs.module_lib",
- "jsr305",
- ],
- aidl: {
- include_dirs: [
- "frameworks/base/core/java/",
- ],
- local_include_dirs: [
- "base/android/java/src",
- "base/test/android/java/src",
- ],
- },
- plugins: [
- "cronet_aml_java_jni_annotation_preprocessor",
- ],
- sdk_version: "module_current",
- javacflags: [
- "-Aorg.chromium.chrome.skipGenJni",
- "-Apackage_prefix=android.net.http.internal",
- ],
-}
-
-// GN: //gn:java
-java_library {
- name: "cronet_aml_java__testing",
- srcs: [
- ":cronet_aml_base_base_android_java_enums_srcjar",
- ":cronet_aml_base_java_features_srcjar",
- ":cronet_aml_base_java_switches_srcjar",
- ":cronet_aml_build_android_build_config_gen",
- ":cronet_aml_build_android_native_libraries_gen",
- ":cronet_aml_components_cronet_android_cronet_jni_registration__java__testing",
- ":cronet_aml_components_cronet_android_http_cache_type_java",
- ":cronet_aml_components_cronet_android_implementation_api_version",
- ":cronet_aml_components_cronet_android_integrated_mode_state",
- ":cronet_aml_components_cronet_android_interface_api_version",
- ":cronet_aml_components_cronet_android_load_states_list",
- ":cronet_aml_components_cronet_android_net_idempotency_java",
- ":cronet_aml_components_cronet_android_net_request_priority_java",
- ":cronet_aml_components_cronet_android_network_quality_observation_source_java",
- ":cronet_aml_components_cronet_android_rtt_throughput_values_java",
- ":cronet_aml_components_cronet_android_url_request_error_java",
- ":cronet_aml_net_android_net_android_java_enums_srcjar",
- ":cronet_aml_net_android_net_errors_java",
- ":cronet_aml_net_effective_connection_type_java",
- "base/android/java/src/org/chromium/base/ActivityState.java",
- "base/android/java/src/org/chromium/base/ApiCompatibilityUtils.java",
- "base/android/java/src/org/chromium/base/ApkAssets.java",
- "base/android/java/src/org/chromium/base/ApplicationStatus.java",
- "base/android/java/src/org/chromium/base/BaseFeatureList.java",
- "base/android/java/src/org/chromium/base/BuildInfo.java",
- "base/android/java/src/org/chromium/base/BundleUtils.java",
- "base/android/java/src/org/chromium/base/ByteArrayGenerator.java",
- "base/android/java/src/org/chromium/base/Callback.java",
- "base/android/java/src/org/chromium/base/CallbackController.java",
- "base/android/java/src/org/chromium/base/CollectionUtil.java",
- "base/android/java/src/org/chromium/base/CommandLine.java",
- "base/android/java/src/org/chromium/base/CommandLineInitUtil.java",
- "base/android/java/src/org/chromium/base/Consumer.java",
- "base/android/java/src/org/chromium/base/ContentUriUtils.java",
- "base/android/java/src/org/chromium/base/ContextUtils.java",
- "base/android/java/src/org/chromium/base/CpuFeatures.java",
- "base/android/java/src/org/chromium/base/DiscardableReferencePool.java",
- "base/android/java/src/org/chromium/base/EarlyTraceEvent.java",
- "base/android/java/src/org/chromium/base/EventLog.java",
- "base/android/java/src/org/chromium/base/FeatureList.java",
- "base/android/java/src/org/chromium/base/Features.java",
- "base/android/java/src/org/chromium/base/FieldTrialList.java",
- "base/android/java/src/org/chromium/base/FileUtils.java",
- "base/android/java/src/org/chromium/base/Function.java",
- "base/android/java/src/org/chromium/base/ImportantFileWriterAndroid.java",
- "base/android/java/src/org/chromium/base/IntStringCallback.java",
- "base/android/java/src/org/chromium/base/JNIUtils.java",
- "base/android/java/src/org/chromium/base/JavaExceptionReporter.java",
- "base/android/java/src/org/chromium/base/JavaHandlerThread.java",
- "base/android/java/src/org/chromium/base/JniException.java",
- "base/android/java/src/org/chromium/base/JniStaticTestMocker.java",
- "base/android/java/src/org/chromium/base/LifetimeAssert.java",
- "base/android/java/src/org/chromium/base/LocaleUtils.java",
- "base/android/java/src/org/chromium/base/Log.java",
- "base/android/java/src/org/chromium/base/MathUtils.java",
- "base/android/java/src/org/chromium/base/MemoryPressureListener.java",
- "base/android/java/src/org/chromium/base/NativeLibraryLoadedStatus.java",
- "base/android/java/src/org/chromium/base/ObserverList.java",
- "base/android/java/src/org/chromium/base/PackageManagerUtils.java",
- "base/android/java/src/org/chromium/base/PackageUtils.java",
- "base/android/java/src/org/chromium/base/PathService.java",
- "base/android/java/src/org/chromium/base/PathUtils.java",
- "base/android/java/src/org/chromium/base/PiiElider.java",
- "base/android/java/src/org/chromium/base/PowerMonitor.java",
- "base/android/java/src/org/chromium/base/PowerMonitorForQ.java",
- "base/android/java/src/org/chromium/base/Predicate.java",
- "base/android/java/src/org/chromium/base/Promise.java",
- "base/android/java/src/org/chromium/base/RadioUtils.java",
- "base/android/java/src/org/chromium/base/StreamUtil.java",
- "base/android/java/src/org/chromium/base/StrictModeContext.java",
- "base/android/java/src/org/chromium/base/SysUtils.java",
- "base/android/java/src/org/chromium/base/ThreadUtils.java",
- "base/android/java/src/org/chromium/base/TimeUtils.java",
- "base/android/java/src/org/chromium/base/TimezoneUtils.java",
- "base/android/java/src/org/chromium/base/TraceEvent.java",
- "base/android/java/src/org/chromium/base/UnguessableToken.java",
- "base/android/java/src/org/chromium/base/UnownedUserData.java",
- "base/android/java/src/org/chromium/base/UnownedUserDataHost.java",
- "base/android/java/src/org/chromium/base/UnownedUserDataKey.java",
- "base/android/java/src/org/chromium/base/UserData.java",
- "base/android/java/src/org/chromium/base/UserDataHost.java",
- "base/android/java/src/org/chromium/base/WrappedClassLoader.java",
- "base/android/java/src/org/chromium/base/annotations/AccessedByNative.java",
- "base/android/java/src/org/chromium/base/annotations/CalledByNative.java",
- "base/android/java/src/org/chromium/base/annotations/CalledByNativeForTesting.java",
- "base/android/java/src/org/chromium/base/annotations/CalledByNativeUnchecked.java",
- "base/android/java/src/org/chromium/base/annotations/JNIAdditionalImport.java",
- "base/android/java/src/org/chromium/base/annotations/JNINamespace.java",
- "base/android/java/src/org/chromium/base/annotations/JniIgnoreNatives.java",
- "base/android/java/src/org/chromium/base/annotations/NativeClassQualifiedName.java",
- "base/android/java/src/org/chromium/base/annotations/NativeMethods.java",
- "base/android/java/src/org/chromium/base/compat/ApiHelperForM.java",
- "base/android/java/src/org/chromium/base/compat/ApiHelperForN.java",
- "base/android/java/src/org/chromium/base/compat/ApiHelperForO.java",
- "base/android/java/src/org/chromium/base/compat/ApiHelperForOMR1.java",
- "base/android/java/src/org/chromium/base/compat/ApiHelperForP.java",
- "base/android/java/src/org/chromium/base/compat/ApiHelperForQ.java",
- "base/android/java/src/org/chromium/base/compat/ApiHelperForR.java",
- "base/android/java/src/org/chromium/base/compat/ApiHelperForS.java",
- "base/android/java/src/org/chromium/base/jank_tracker/DummyJankTracker.java",
- "base/android/java/src/org/chromium/base/jank_tracker/FrameMetrics.java",
- "base/android/java/src/org/chromium/base/jank_tracker/FrameMetricsListener.java",
- "base/android/java/src/org/chromium/base/jank_tracker/FrameMetricsStore.java",
- "base/android/java/src/org/chromium/base/jank_tracker/JankActivityTracker.java",
- "base/android/java/src/org/chromium/base/jank_tracker/JankMetricCalculator.java",
- "base/android/java/src/org/chromium/base/jank_tracker/JankMetricUMARecorder.java",
- "base/android/java/src/org/chromium/base/jank_tracker/JankMetrics.java",
- "base/android/java/src/org/chromium/base/jank_tracker/JankReportingRunnable.java",
- "base/android/java/src/org/chromium/base/jank_tracker/JankReportingScheduler.java",
- "base/android/java/src/org/chromium/base/jank_tracker/JankScenario.java",
- "base/android/java/src/org/chromium/base/jank_tracker/JankTracker.java",
- "base/android/java/src/org/chromium/base/jank_tracker/JankTrackerImpl.java",
- "base/android/java/src/org/chromium/base/library_loader/LegacyLinker.java",
- "base/android/java/src/org/chromium/base/library_loader/LibraryLoader.java",
- "base/android/java/src/org/chromium/base/library_loader/LibraryPrefetcher.java",
- "base/android/java/src/org/chromium/base/library_loader/Linker.java",
- "base/android/java/src/org/chromium/base/library_loader/LinkerJni.java",
- "base/android/java/src/org/chromium/base/library_loader/LoaderErrors.java",
- "base/android/java/src/org/chromium/base/library_loader/ModernLinker.java",
- "base/android/java/src/org/chromium/base/library_loader/ModernLinkerJni.java",
- "base/android/java/src/org/chromium/base/library_loader/NativeLibraryPreloader.java",
- "base/android/java/src/org/chromium/base/library_loader/ProcessInitException.java",
- "base/android/java/src/org/chromium/base/lifetime/DestroyChecker.java",
- "base/android/java/src/org/chromium/base/lifetime/Destroyable.java",
- "base/android/java/src/org/chromium/base/memory/JavaHeapDumpGenerator.java",
- "base/android/java/src/org/chromium/base/memory/MemoryPressureCallback.java",
- "base/android/java/src/org/chromium/base/memory/MemoryPressureMonitor.java",
- "base/android/java/src/org/chromium/base/memory/MemoryPressureUma.java",
- "base/android/java/src/org/chromium/base/memory/MemoryPurgeManager.java",
- "base/android/java/src/org/chromium/base/metrics/CachingUmaRecorder.java",
- "base/android/java/src/org/chromium/base/metrics/NativeUmaRecorder.java",
- "base/android/java/src/org/chromium/base/metrics/NoopUmaRecorder.java",
- "base/android/java/src/org/chromium/base/metrics/RecordHistogram.java",
- "base/android/java/src/org/chromium/base/metrics/RecordUserAction.java",
- "base/android/java/src/org/chromium/base/metrics/ScopedSysTraceEvent.java",
- "base/android/java/src/org/chromium/base/metrics/StatisticsRecorderAndroid.java",
- "base/android/java/src/org/chromium/base/metrics/TimingMetric.java",
- "base/android/java/src/org/chromium/base/metrics/UmaRecorder.java",
- "base/android/java/src/org/chromium/base/metrics/UmaRecorderHolder.java",
- "base/android/java/src/org/chromium/base/process_launcher/IChildProcessService.aidl",
- "base/android/java/src/org/chromium/base/process_launcher/IParentProcess.aidl",
- "base/android/java/src/org/chromium/base/supplier/BooleanSupplier.java",
- "base/android/java/src/org/chromium/base/supplier/DestroyableObservableSupplier.java",
- "base/android/java/src/org/chromium/base/supplier/ObservableSupplier.java",
- "base/android/java/src/org/chromium/base/supplier/ObservableSupplierImpl.java",
- "base/android/java/src/org/chromium/base/supplier/OneShotCallback.java",
- "base/android/java/src/org/chromium/base/supplier/OneshotSupplier.java",
- "base/android/java/src/org/chromium/base/supplier/OneshotSupplierImpl.java",
- "base/android/java/src/org/chromium/base/supplier/Supplier.java",
- "base/android/java/src/org/chromium/base/supplier/UnownedUserDataSupplier.java",
- "base/android/java/src/org/chromium/base/task/AsyncTask.java",
- "base/android/java/src/org/chromium/base/task/BackgroundOnlyAsyncTask.java",
- "base/android/java/src/org/chromium/base/task/ChainedTasks.java",
- "base/android/java/src/org/chromium/base/task/ChoreographerTaskRunner.java",
- "base/android/java/src/org/chromium/base/task/ChromeThreadPoolExecutor.java",
- "base/android/java/src/org/chromium/base/task/DefaultTaskExecutor.java",
- "base/android/java/src/org/chromium/base/task/PostTask.java",
- "base/android/java/src/org/chromium/base/task/SequencedTaskRunner.java",
- "base/android/java/src/org/chromium/base/task/SequencedTaskRunnerImpl.java",
- "base/android/java/src/org/chromium/base/task/SerialExecutor.java",
- "base/android/java/src/org/chromium/base/task/SingleThreadTaskRunner.java",
- "base/android/java/src/org/chromium/base/task/SingleThreadTaskRunnerImpl.java",
- "base/android/java/src/org/chromium/base/task/TaskExecutor.java",
- "base/android/java/src/org/chromium/base/task/TaskRunner.java",
- "base/android/java/src/org/chromium/base/task/TaskRunnerImpl.java",
- "base/android/java/src/org/chromium/base/task/TaskTraits.java",
- "base/android/java/src/org/chromium/base/task/TaskTraitsExtensionDescriptor.java",
- "base/test/android/java/src/org/chromium/base/ITestCallback.aidl",
- "base/test/android/java/src/org/chromium/base/ITestController.aidl",
- "build/android/java/src/org/chromium/build/annotations/AlwaysInline.java",
- "build/android/java/src/org/chromium/build/annotations/CheckDiscard.java",
- "build/android/java/src/org/chromium/build/annotations/DoNotClassMerge.java",
- "build/android/java/src/org/chromium/build/annotations/DoNotInline.java",
- "build/android/java/src/org/chromium/build/annotations/IdentifierNameString.java",
- "build/android/java/src/org/chromium/build/annotations/MainDex.java",
- "build/android/java/src/org/chromium/build/annotations/MockedInTests.java",
- "build/android/java/src/org/chromium/build/annotations/UsedByReflection.java",
- "components/cronet/android/java/src/org/chromium/net/impl/BidirectionalStreamBuilderImpl.java",
- "components/cronet/android/java/src/org/chromium/net/impl/BidirectionalStreamNetworkException.java",
- "components/cronet/android/java/src/org/chromium/net/impl/CallbackExceptionImpl.java",
- "components/cronet/android/java/src/org/chromium/net/impl/CronetBidirectionalStream.java",
- "components/cronet/android/java/src/org/chromium/net/impl/CronetEngineBase.java",
- "components/cronet/android/java/src/org/chromium/net/impl/CronetEngineBuilderImpl.java",
- "components/cronet/android/java/src/org/chromium/net/impl/CronetExceptionImpl.java",
- "components/cronet/android/java/src/org/chromium/net/impl/CronetLibraryLoader.java",
- "components/cronet/android/java/src/org/chromium/net/impl/CronetLogger.java",
- "components/cronet/android/java/src/org/chromium/net/impl/CronetLoggerFactory.java",
- "components/cronet/android/java/src/org/chromium/net/impl/CronetManifest.java",
- "components/cronet/android/java/src/org/chromium/net/impl/CronetMetrics.java",
- "components/cronet/android/java/src/org/chromium/net/impl/CronetUploadDataStream.java",
- "components/cronet/android/java/src/org/chromium/net/impl/CronetUrlRequest.java",
- "components/cronet/android/java/src/org/chromium/net/impl/CronetUrlRequestContext.java",
- "components/cronet/android/java/src/org/chromium/net/impl/NativeCronetEngineBuilderImpl.java",
- "components/cronet/android/java/src/org/chromium/net/impl/NetworkExceptionImpl.java",
- "components/cronet/android/java/src/org/chromium/net/impl/NoOpLogger.java",
- "components/cronet/android/java/src/org/chromium/net/impl/Preconditions.java",
- "components/cronet/android/java/src/org/chromium/net/impl/QuicExceptionImpl.java",
- "components/cronet/android/java/src/org/chromium/net/impl/RequestFinishedInfoImpl.java",
- "components/cronet/android/java/src/org/chromium/net/impl/UrlRequestBase.java",
- "components/cronet/android/java/src/org/chromium/net/impl/UrlRequestBuilderImpl.java",
- "components/cronet/android/java/src/org/chromium/net/impl/UrlResponseInfoImpl.java",
- "components/cronet/android/java/src/org/chromium/net/impl/UserAgent.java",
- "components/cronet/android/java/src/org/chromium/net/impl/VersionSafeCallbacks.java",
- "components/cronet/android/java/src/org/chromium/net/urlconnection/CronetBufferedOutputStream.java",
- "components/cronet/android/java/src/org/chromium/net/urlconnection/CronetChunkedOutputStream.java",
- "components/cronet/android/java/src/org/chromium/net/urlconnection/CronetFixedModeOutputStream.java",
- "components/cronet/android/java/src/org/chromium/net/urlconnection/CronetHttpURLConnection.java",
- "components/cronet/android/java/src/org/chromium/net/urlconnection/CronetHttpURLStreamHandler.java",
- "components/cronet/android/java/src/org/chromium/net/urlconnection/CronetInputStream.java",
- "components/cronet/android/java/src/org/chromium/net/urlconnection/CronetOutputStream.java",
- "components/cronet/android/java/src/org/chromium/net/urlconnection/CronetURLStreamHandlerFactory.java",
- "components/cronet/android/java/src/org/chromium/net/urlconnection/MessageLoop.java",
- "net/android/java/src/org/chromium/net/AndroidCertVerifyResult.java",
- "net/android/java/src/org/chromium/net/AndroidKeyStore.java",
- "net/android/java/src/org/chromium/net/AndroidNetworkLibrary.java",
- "net/android/java/src/org/chromium/net/AndroidTrafficStats.java",
- "net/android/java/src/org/chromium/net/ChromiumNetworkAdapter.java",
- "net/android/java/src/org/chromium/net/DnsStatus.java",
- "net/android/java/src/org/chromium/net/GURLUtils.java",
- "net/android/java/src/org/chromium/net/HttpNegotiateAuthenticator.java",
- "net/android/java/src/org/chromium/net/HttpNegotiateConstants.java",
- "net/android/java/src/org/chromium/net/HttpUtil.java",
- "net/android/java/src/org/chromium/net/MimeTypeFilter.java",
- "net/android/java/src/org/chromium/net/NetStringUtil.java",
- "net/android/java/src/org/chromium/net/NetworkActiveNotifier.java",
- "net/android/java/src/org/chromium/net/NetworkChangeNotifier.java",
- "net/android/java/src/org/chromium/net/NetworkChangeNotifierAutoDetect.java",
- "net/android/java/src/org/chromium/net/NetworkTrafficAnnotationTag.java",
- "net/android/java/src/org/chromium/net/ProxyBroadcastReceiver.java",
- "net/android/java/src/org/chromium/net/ProxyChangeListener.java",
- "net/android/java/src/org/chromium/net/RegistrationPolicyAlwaysRegister.java",
- "net/android/java/src/org/chromium/net/RegistrationPolicyApplicationStatus.java",
- "net/android/java/src/org/chromium/net/ThreadStatsUid.java",
- "net/android/java/src/org/chromium/net/X509Util.java",
- "url/android/java/src/org/chromium/url/IDNStringUtil.java",
- ],
- static_libs: [
- "modules-utils-build_system",
- ],
- apex_available: [
- "com.android.tethering",
- ],
- min_sdk_version: "30",
- libs: [
- "androidx.annotation_annotation",
- "androidx.annotation_annotation-experimental-nodeps",
- "cronet_aml_api_java",
- "framework-connectivity-t.stubs.module_lib",
- "framework-connectivity.stubs.module_lib",
- "framework-mediaprovider.stubs.module_lib",
- "framework-tethering.stubs.module_lib",
- "framework-wifi.stubs.module_lib",
- "jsr305",
- ],
- aidl: {
- include_dirs: [
- "frameworks/base/core/java/",
- ],
- local_include_dirs: [
- "base/android/java/src",
- "base/test/android/java/src",
- ],
- },
- plugins: [
- "cronet_aml_java_jni_annotation_preprocessor",
- ],
- sdk_version: "module_current",
- javacflags: [
- "-Aorg.chromium.chrome.skipGenJni",
- ],
-}
-
-// GN: //base/android/jni_generator:jni_processor
-java_plugin {
- name: "cronet_aml_java_jni_annotation_preprocessor",
- srcs: [
- ":cronet_aml_build_android_build_config_gen",
- "base/android/java/src/org/chromium/base/JniException.java",
- "base/android/java/src/org/chromium/base/JniStaticTestMocker.java",
- "base/android/java/src/org/chromium/base/NativeLibraryLoadedStatus.java",
- "base/android/java/src/org/chromium/base/annotations/NativeMethods.java",
- "base/android/jni_generator/java/src/org/chromium/jni_generator/JniProcessor.java",
- "build/android/java/src/org/chromium/build/annotations/CheckDiscard.java",
- "build/android/java/src/org/chromium/build/annotations/MainDex.java",
- ],
- static_libs: [
- "auto_service_annotations",
- "guava",
- "javapoet",
- ],
- processor_class: "org.chromium.jni_generator.JniProcessor",
-}
-
-// GN: //net/android:net_android_java_enums_srcjar
-java_genrule {
- name: "cronet_aml_net_android_net_android_java_enums_srcjar",
- srcs: [
- "net/android/network_change_notifier_android.cc",
- "net/android/traffic_stats.cc",
- "net/socket/socket_tag.cc",
- ],
- cmd: "$(location build/android/gyp/java_cpp_enum.py) --srcjar " +
- "$(out) " +
- "$(location net/base/network_change_notifier.h) " +
- "$(location net/socket/socket_tag.cc) " +
- "$(location net/android/cert_verify_result_android.h) " +
- "$(location net/android/keystore.h) " +
- "$(location net/android/network_change_notifier_android.cc) " +
- "$(location net/android/traffic_stats.cc)",
- out: [
- "net/android/net_android_java_enums_srcjar.srcjar",
- ],
- tool_files: [
- "build/android/gyp/java_cpp_enum.py",
- "build/android/gyp/util/__init__.py",
- "build/android/gyp/util/build_utils.py",
- "build/android/gyp/util/java_cpp_utils.py",
- "build/gn_helpers.py",
- "net/android/cert_verify_result_android.h",
- "net/android/keystore.h",
- "net/base/network_change_notifier.h",
- ],
-}
-
-// GN: //net/android:net_errors_java
-genrule {
- name: "cronet_aml_net_android_net_errors_java",
- srcs: [
- ":cronet_aml_net_android_net_errors_java_preprocess",
- ],
- tools: [
- "soong_zip",
- ],
- cmd: "cp $(in) $(genDir)/NetError.java && " +
- "$(location soong_zip) -o $(out) -srcjar -C $(genDir) -f $(genDir)/NetError.java",
- out: [
- "NetError.srcjar",
- ],
-}
-
-// GN: //net/android:net_errors_java
-cc_object {
- name: "cronet_aml_net_android_net_errors_java_preprocess",
- srcs: [
- ":cronet_aml_net_android_net_errors_java_rename",
- ],
- cflags: [
- "-DANDROID",
- "-E",
- "-P",
- ],
- compile_multilib: "first",
-}
-
-// GN: //net/android:net_errors_java
-genrule {
- name: "cronet_aml_net_android_net_errors_java_rename",
- srcs: [
- "net/android/java/NetError.template",
- ],
- cmd: "cp $(in) $(out)",
- out: [
- "NetError.cc",
- ],
-}
-
-// GN: //net/base/registry_controlled_domains:registry_controlled_domains
-cc_genrule {
- name: "cronet_aml_net_base_registry_controlled_domains_registry_controlled_domains",
- cmd: "$(location net/tools/dafsa/make_dafsa.py) --reverse " +
- "$(location net/base/registry_controlled_domains/effective_tld_names.gperf) " +
- "$(location net/base/registry_controlled_domains/effective_tld_names-reversed-inc.cc) " +
- "&& python3 $(location net/tools/dafsa/make_dafsa.py) " +
- "--reverse " +
- "$(location net/base/registry_controlled_domains/effective_tld_names_unittest1.gperf) " +
- "$(location net/base/registry_controlled_domains/effective_tld_names_unittest1-reversed-inc.cc) " +
- "&& python3 $(location net/tools/dafsa/make_dafsa.py) " +
- "--reverse " +
- "$(location net/base/registry_controlled_domains/effective_tld_names_unittest2.gperf) " +
- "$(location net/base/registry_controlled_domains/effective_tld_names_unittest2-reversed-inc.cc) " +
- "&& python3 $(location net/tools/dafsa/make_dafsa.py) " +
- "--reverse " +
- "$(location net/base/registry_controlled_domains/effective_tld_names_unittest3.gperf) " +
- "$(location net/base/registry_controlled_domains/effective_tld_names_unittest3-reversed-inc.cc) " +
- "&& python3 $(location net/tools/dafsa/make_dafsa.py) " +
- "--reverse " +
- "$(location net/base/registry_controlled_domains/effective_tld_names_unittest4.gperf) " +
- "$(location net/base/registry_controlled_domains/effective_tld_names_unittest4-reversed-inc.cc) " +
- "&& python3 $(location net/tools/dafsa/make_dafsa.py) " +
- "--reverse " +
- "$(location net/base/registry_controlled_domains/effective_tld_names_unittest5.gperf) " +
- "$(location net/base/registry_controlled_domains/effective_tld_names_unittest5-reversed-inc.cc) " +
- "&& python3 $(location net/tools/dafsa/make_dafsa.py) " +
- "--reverse " +
- "$(location net/base/registry_controlled_domains/effective_tld_names_unittest6.gperf) " +
- "$(location net/base/registry_controlled_domains/effective_tld_names_unittest6-reversed-inc.cc)",
- out: [
- "net/base/registry_controlled_domains/effective_tld_names-reversed-inc.cc",
- "net/base/registry_controlled_domains/effective_tld_names_unittest1-reversed-inc.cc",
- "net/base/registry_controlled_domains/effective_tld_names_unittest2-reversed-inc.cc",
- "net/base/registry_controlled_domains/effective_tld_names_unittest3-reversed-inc.cc",
- "net/base/registry_controlled_domains/effective_tld_names_unittest4-reversed-inc.cc",
- "net/base/registry_controlled_domains/effective_tld_names_unittest5-reversed-inc.cc",
- "net/base/registry_controlled_domains/effective_tld_names_unittest6-reversed-inc.cc",
- ],
- tool_files: [
- "net/base/registry_controlled_domains/effective_tld_names.gperf",
- "net/base/registry_controlled_domains/effective_tld_names_unittest1.gperf",
- "net/base/registry_controlled_domains/effective_tld_names_unittest2.gperf",
- "net/base/registry_controlled_domains/effective_tld_names_unittest3.gperf",
- "net/base/registry_controlled_domains/effective_tld_names_unittest4.gperf",
- "net/base/registry_controlled_domains/effective_tld_names_unittest5.gperf",
- "net/base/registry_controlled_domains/effective_tld_names_unittest6.gperf",
- "net/tools/dafsa/make_dafsa.py",
- ],
- apex_available: [
- "com.android.tethering",
- ],
-}
-
-// GN: //net/base/registry_controlled_domains:registry_controlled_domains__testing
-cc_genrule {
- name: "cronet_aml_net_base_registry_controlled_domains_registry_controlled_domains__testing",
- cmd: "$(location net/tools/dafsa/make_dafsa.py) --reverse " +
- "$(location net/base/registry_controlled_domains/effective_tld_names.gperf) " +
- "$(location net/base/registry_controlled_domains/effective_tld_names-reversed-inc.cc) " +
- "&& python3 $(location net/tools/dafsa/make_dafsa.py) " +
- "--reverse " +
- "$(location net/base/registry_controlled_domains/effective_tld_names_unittest1.gperf) " +
- "$(location net/base/registry_controlled_domains/effective_tld_names_unittest1-reversed-inc.cc) " +
- "&& python3 $(location net/tools/dafsa/make_dafsa.py) " +
- "--reverse " +
- "$(location net/base/registry_controlled_domains/effective_tld_names_unittest2.gperf) " +
- "$(location net/base/registry_controlled_domains/effective_tld_names_unittest2-reversed-inc.cc) " +
- "&& python3 $(location net/tools/dafsa/make_dafsa.py) " +
- "--reverse " +
- "$(location net/base/registry_controlled_domains/effective_tld_names_unittest3.gperf) " +
- "$(location net/base/registry_controlled_domains/effective_tld_names_unittest3-reversed-inc.cc) " +
- "&& python3 $(location net/tools/dafsa/make_dafsa.py) " +
- "--reverse " +
- "$(location net/base/registry_controlled_domains/effective_tld_names_unittest4.gperf) " +
- "$(location net/base/registry_controlled_domains/effective_tld_names_unittest4-reversed-inc.cc) " +
- "&& python3 $(location net/tools/dafsa/make_dafsa.py) " +
- "--reverse " +
- "$(location net/base/registry_controlled_domains/effective_tld_names_unittest5.gperf) " +
- "$(location net/base/registry_controlled_domains/effective_tld_names_unittest5-reversed-inc.cc) " +
- "&& python3 $(location net/tools/dafsa/make_dafsa.py) " +
- "--reverse " +
- "$(location net/base/registry_controlled_domains/effective_tld_names_unittest6.gperf) " +
- "$(location net/base/registry_controlled_domains/effective_tld_names_unittest6-reversed-inc.cc)",
- out: [
- "net/base/registry_controlled_domains/effective_tld_names-reversed-inc.cc",
- "net/base/registry_controlled_domains/effective_tld_names_unittest1-reversed-inc.cc",
- "net/base/registry_controlled_domains/effective_tld_names_unittest2-reversed-inc.cc",
- "net/base/registry_controlled_domains/effective_tld_names_unittest3-reversed-inc.cc",
- "net/base/registry_controlled_domains/effective_tld_names_unittest4-reversed-inc.cc",
- "net/base/registry_controlled_domains/effective_tld_names_unittest5-reversed-inc.cc",
- "net/base/registry_controlled_domains/effective_tld_names_unittest6-reversed-inc.cc",
- ],
- tool_files: [
- "net/base/registry_controlled_domains/effective_tld_names.gperf",
- "net/base/registry_controlled_domains/effective_tld_names_unittest1.gperf",
- "net/base/registry_controlled_domains/effective_tld_names_unittest2.gperf",
- "net/base/registry_controlled_domains/effective_tld_names_unittest3.gperf",
- "net/base/registry_controlled_domains/effective_tld_names_unittest4.gperf",
- "net/base/registry_controlled_domains/effective_tld_names_unittest5.gperf",
- "net/base/registry_controlled_domains/effective_tld_names_unittest6.gperf",
- "net/tools/dafsa/make_dafsa.py",
- ],
- apex_available: [
- "com.android.tethering",
- ],
-}
-
-// GN: //net:buildflags
-cc_genrule {
- name: "cronet_aml_net_buildflags",
- cmd: "if [[ ( $$CC_ARCH == 'x86_64' && $$CC_OS == 'android' ) ]]; " +
- "then " +
- "echo '--flags POSIX_BYPASS_MMAP=\"true\" DISABLE_FILE_SUPPORT=\"true\" ENABLE_MDNS=\"false\" ENABLE_REPORTING=\"true\" ENABLE_WEBSOCKETS=\"false\" INCLUDE_TRANSPORT_SECURITY_STATE_PRELOAD_LIST=\"false\" USE_KERBEROS=\"true\" USE_EXTERNAL_GSSAPI=\"false\" TRIAL_COMPARISON_CERT_VERIFIER_SUPPORTED=\"false\" CHROME_ROOT_STORE_SUPPORTED=\"false\"' | " +
- "$(location build/write_buildflag_header.py) --output " +
- "$(out) " +
- "--rulename " +
- "//net:buildflags " +
- "--gen-dir " +
- ". " +
- "--definitions " +
- "/dev/stdin; " +
- "fi; " +
- "if [[ ( $$CC_ARCH == 'x86' && $$CC_OS == 'android' ) ]]; " +
- "then " +
- "echo '--flags POSIX_BYPASS_MMAP=\"false\" DISABLE_FILE_SUPPORT=\"true\" ENABLE_MDNS=\"false\" ENABLE_REPORTING=\"true\" ENABLE_WEBSOCKETS=\"false\" INCLUDE_TRANSPORT_SECURITY_STATE_PRELOAD_LIST=\"false\" USE_KERBEROS=\"true\" USE_EXTERNAL_GSSAPI=\"false\" TRIAL_COMPARISON_CERT_VERIFIER_SUPPORTED=\"false\" CHROME_ROOT_STORE_SUPPORTED=\"false\"' | " +
- "$(location build/write_buildflag_header.py) --output " +
- "$(out) " +
- "--rulename " +
- "//net:buildflags " +
- "--gen-dir " +
- ". " +
- "--definitions " +
- "/dev/stdin; " +
- "fi; " +
- "if [[ ( $$CC_ARCH == 'arm' && $$CC_OS == 'android' ) ]]; " +
- "then " +
- "echo '--flags POSIX_BYPASS_MMAP=\"true\" DISABLE_FILE_SUPPORT=\"true\" ENABLE_MDNS=\"false\" ENABLE_REPORTING=\"true\" ENABLE_WEBSOCKETS=\"false\" INCLUDE_TRANSPORT_SECURITY_STATE_PRELOAD_LIST=\"false\" USE_KERBEROS=\"true\" USE_EXTERNAL_GSSAPI=\"false\" TRIAL_COMPARISON_CERT_VERIFIER_SUPPORTED=\"false\" CHROME_ROOT_STORE_SUPPORTED=\"false\"' | " +
- "$(location build/write_buildflag_header.py) --output " +
- "$(out) " +
- "--rulename " +
- "//net:buildflags " +
- "--gen-dir " +
- ". " +
- "--definitions " +
- "/dev/stdin; " +
- "fi; " +
- "if [[ ( $$CC_ARCH == 'arm64' && $$CC_OS == 'android' ) ]]; " +
- "then " +
- "echo '--flags POSIX_BYPASS_MMAP=\"true\" DISABLE_FILE_SUPPORT=\"true\" ENABLE_MDNS=\"false\" ENABLE_REPORTING=\"true\" ENABLE_WEBSOCKETS=\"false\" INCLUDE_TRANSPORT_SECURITY_STATE_PRELOAD_LIST=\"false\" USE_KERBEROS=\"true\" USE_EXTERNAL_GSSAPI=\"false\" TRIAL_COMPARISON_CERT_VERIFIER_SUPPORTED=\"false\" CHROME_ROOT_STORE_SUPPORTED=\"false\"' | " +
- "$(location build/write_buildflag_header.py) --output " +
- "$(out) " +
- "--rulename " +
- "//net:buildflags " +
- "--gen-dir " +
- ". " +
- "--definitions " +
- "/dev/stdin; " +
- "fi;",
- out: [
- "net/net_buildflags.h",
- ],
- tool_files: [
- "build/write_buildflag_header.py",
- ],
- apex_available: [
- "com.android.tethering",
- ],
-}
-
-// GN: //net:buildflags__testing
-cc_genrule {
- name: "cronet_aml_net_buildflags__testing",
- cmd: "if [[ ( $$CC_ARCH == 'x86_64' && $$CC_OS == 'android' ) ]]; " +
- "then " +
- "echo '--flags POSIX_BYPASS_MMAP=\"true\" DISABLE_FILE_SUPPORT=\"true\" ENABLE_MDNS=\"false\" ENABLE_REPORTING=\"true\" ENABLE_WEBSOCKETS=\"false\" INCLUDE_TRANSPORT_SECURITY_STATE_PRELOAD_LIST=\"false\" USE_KERBEROS=\"true\" USE_EXTERNAL_GSSAPI=\"false\" TRIAL_COMPARISON_CERT_VERIFIER_SUPPORTED=\"false\" CHROME_ROOT_STORE_SUPPORTED=\"false\"' | " +
- "$(location build/write_buildflag_header.py) --output " +
- "$(out) " +
- "--rulename " +
- "//net:buildflags " +
- "--gen-dir " +
- ". " +
- "--definitions " +
- "/dev/stdin; " +
- "fi; " +
- "if [[ ( $$CC_ARCH == 'x86' && $$CC_OS == 'android' ) ]]; " +
- "then " +
- "echo '--flags POSIX_BYPASS_MMAP=\"false\" DISABLE_FILE_SUPPORT=\"true\" ENABLE_MDNS=\"false\" ENABLE_REPORTING=\"true\" ENABLE_WEBSOCKETS=\"false\" INCLUDE_TRANSPORT_SECURITY_STATE_PRELOAD_LIST=\"false\" USE_KERBEROS=\"true\" USE_EXTERNAL_GSSAPI=\"false\" TRIAL_COMPARISON_CERT_VERIFIER_SUPPORTED=\"false\" CHROME_ROOT_STORE_SUPPORTED=\"false\"' | " +
- "$(location build/write_buildflag_header.py) --output " +
- "$(out) " +
- "--rulename " +
- "//net:buildflags " +
- "--gen-dir " +
- ". " +
- "--definitions " +
- "/dev/stdin; " +
- "fi; " +
- "if [[ ( $$CC_ARCH == 'arm' && $$CC_OS == 'android' ) ]]; " +
- "then " +
- "echo '--flags POSIX_BYPASS_MMAP=\"true\" DISABLE_FILE_SUPPORT=\"true\" ENABLE_MDNS=\"false\" ENABLE_REPORTING=\"true\" ENABLE_WEBSOCKETS=\"false\" INCLUDE_TRANSPORT_SECURITY_STATE_PRELOAD_LIST=\"false\" USE_KERBEROS=\"true\" USE_EXTERNAL_GSSAPI=\"false\" TRIAL_COMPARISON_CERT_VERIFIER_SUPPORTED=\"false\" CHROME_ROOT_STORE_SUPPORTED=\"false\"' | " +
- "$(location build/write_buildflag_header.py) --output " +
- "$(out) " +
- "--rulename " +
- "//net:buildflags " +
- "--gen-dir " +
- ". " +
- "--definitions " +
- "/dev/stdin; " +
- "fi; " +
- "if [[ ( $$CC_ARCH == 'arm64' && $$CC_OS == 'android' ) ]]; " +
- "then " +
- "echo '--flags POSIX_BYPASS_MMAP=\"true\" DISABLE_FILE_SUPPORT=\"true\" ENABLE_MDNS=\"false\" ENABLE_REPORTING=\"true\" ENABLE_WEBSOCKETS=\"false\" INCLUDE_TRANSPORT_SECURITY_STATE_PRELOAD_LIST=\"false\" USE_KERBEROS=\"true\" USE_EXTERNAL_GSSAPI=\"false\" TRIAL_COMPARISON_CERT_VERIFIER_SUPPORTED=\"false\" CHROME_ROOT_STORE_SUPPORTED=\"false\"' | " +
- "$(location build/write_buildflag_header.py) --output " +
- "$(out) " +
- "--rulename " +
- "//net:buildflags " +
- "--gen-dir " +
- ". " +
- "--definitions " +
- "/dev/stdin; " +
- "fi;",
- out: [
- "net/net_buildflags.h",
- ],
- tool_files: [
- "build/write_buildflag_header.py",
- ],
- apex_available: [
- "com.android.tethering",
- ],
-}
-
-// GN: //net/dns:dns
-cc_library_static {
- name: "cronet_aml_net_dns_dns",
- srcs: [
- "net/dns/address_info.cc",
- "net/dns/address_sorter_posix.cc",
- "net/dns/context_host_resolver.cc",
- "net/dns/dns_alias_utility.cc",
- "net/dns/dns_client.cc",
- "net/dns/dns_config.cc",
- "net/dns/dns_config_service.cc",
- "net/dns/dns_config_service_android.cc",
- "net/dns/dns_hosts.cc",
- "net/dns/dns_query.cc",
- "net/dns/dns_reloader.cc",
- "net/dns/dns_response.cc",
- "net/dns/dns_response_result_extractor.cc",
- "net/dns/dns_server_iterator.cc",
- "net/dns/dns_session.cc",
- "net/dns/dns_transaction.cc",
- "net/dns/dns_udp_tracker.cc",
- "net/dns/dns_util.cc",
- "net/dns/host_cache.cc",
- "net/dns/host_resolver.cc",
- "net/dns/host_resolver_manager.cc",
- "net/dns/host_resolver_mdns_listener_impl.cc",
- "net/dns/host_resolver_mdns_task.cc",
- "net/dns/host_resolver_nat64_task.cc",
- "net/dns/host_resolver_proc.cc",
- "net/dns/host_resolver_system_task.cc",
- "net/dns/https_record_rdata.cc",
- "net/dns/httpssvc_metrics.cc",
- "net/dns/mapped_host_resolver.cc",
- "net/dns/nsswitch_reader.cc",
- "net/dns/opt_record_rdata.cc",
- "net/dns/record_parsed.cc",
- "net/dns/record_rdata.cc",
- "net/dns/resolve_context.cc",
- "net/dns/serial_worker.cc",
- "net/dns/system_dns_config_change_notifier.cc",
- "net/dns/test_dns_config_service.cc",
- ],
- shared_libs: [
- "libandroid",
- "liblog",
- "libz",
- ],
- static_libs: [
- "cronet_aml_base_allocator_partition_allocator_partition_alloc",
- "cronet_aml_base_base",
- "cronet_aml_base_base_static",
- "cronet_aml_base_nodebug_assertion",
- "cronet_aml_base_third_party_double_conversion_double_conversion",
- "cronet_aml_base_third_party_dynamic_annotations_dynamic_annotations",
- "cronet_aml_crypto_crypto",
- "cronet_aml_net_dns_public_public",
- "cronet_aml_net_net_deps",
- "cronet_aml_net_net_public_deps",
- "cronet_aml_net_preload_decoder",
- "cronet_aml_net_third_party_quiche_quiche",
- "cronet_aml_net_traffic_annotation_traffic_annotation",
- "cronet_aml_net_uri_template",
- "cronet_aml_third_party_abseil_cpp_absl_base_base",
- "cronet_aml_third_party_abseil_cpp_absl_base_log_severity",
- "cronet_aml_third_party_abseil_cpp_absl_base_malloc_internal",
- "cronet_aml_third_party_abseil_cpp_absl_base_raw_logging_internal",
- "cronet_aml_third_party_abseil_cpp_absl_base_spinlock_wait",
- "cronet_aml_third_party_abseil_cpp_absl_base_strerror",
- "cronet_aml_third_party_abseil_cpp_absl_base_throw_delegate",
- "cronet_aml_third_party_abseil_cpp_absl_container_hashtablez_sampler",
- "cronet_aml_third_party_abseil_cpp_absl_container_raw_hash_set",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_debugging_internal",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_demangle_internal",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_examine_stack",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_failure_signal_handler",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_stacktrace",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_symbolize",
- "cronet_aml_third_party_abseil_cpp_absl_hash_city",
- "cronet_aml_third_party_abseil_cpp_absl_hash_hash",
- "cronet_aml_third_party_abseil_cpp_absl_hash_low_level_hash",
- "cronet_aml_third_party_abseil_cpp_absl_numeric_int128",
- "cronet_aml_third_party_abseil_cpp_absl_profiling_exponential_biased",
- "cronet_aml_third_party_abseil_cpp_absl_random_distributions",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_platform",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_pool_urbg",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_hwaes",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_hwaes_impl",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_slow",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_seed_material",
- "cronet_aml_third_party_abseil_cpp_absl_random_seed_gen_exception",
- "cronet_aml_third_party_abseil_cpp_absl_random_seed_sequences",
- "cronet_aml_third_party_abseil_cpp_absl_status_status",
- "cronet_aml_third_party_abseil_cpp_absl_status_statusor",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cord",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cord_internal",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_functions",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_handle",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_info",
- "cronet_aml_third_party_abseil_cpp_absl_strings_internal",
- "cronet_aml_third_party_abseil_cpp_absl_strings_str_format_internal",
- "cronet_aml_third_party_abseil_cpp_absl_strings_strings",
- "cronet_aml_third_party_abseil_cpp_absl_synchronization_graphcycles_internal",
- "cronet_aml_third_party_abseil_cpp_absl_synchronization_synchronization",
- "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_civil_time",
- "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_time_zone",
- "cronet_aml_third_party_abseil_cpp_absl_time_time",
- "cronet_aml_third_party_abseil_cpp_absl_types_bad_optional_access",
- "cronet_aml_third_party_abseil_cpp_absl_types_bad_variant_access",
- "cronet_aml_third_party_android_ndk_cpu_features",
- "cronet_aml_third_party_ashmem_ashmem",
- "cronet_aml_third_party_boringssl_boringssl",
- "cronet_aml_third_party_boringssl_boringssl_asm",
- "cronet_aml_third_party_brotli_common",
- "cronet_aml_third_party_brotli_dec",
- "cronet_aml_third_party_icu_icui18n",
- "cronet_aml_third_party_icu_icuuc_private",
- "cronet_aml_third_party_libevent_libevent",
- "cronet_aml_third_party_modp_b64_modp_b64",
- "cronet_aml_third_party_protobuf_protobuf_lite",
- "cronet_aml_url_url",
- ],
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DENABLE_BUILT_IN_DNS",
- "-DGOOGLE_PROTOBUF_INTERNAL_DONATE_STEAL_INLINE=0",
- "-DGOOGLE_PROTOBUF_NO_RTTI",
- "-DGOOGLE_PROTOBUF_NO_STATIC_INITIALIZER",
- "-DHAVE_PTHREAD",
- "-DHAVE_SYS_UIO_H",
- "-DNDEBUG",
- "-DNET_IMPLEMENTATION",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_FORTIFY_SOURCE=2",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D__STDC_CONSTANT_MACROS",
- "-D__STDC_FORMAT_MACROS",
- "-Oz",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "net/third_party/quiche/overrides/",
- "net/third_party/quiche/src/",
- "net/third_party/quiche/src/quiche/common/platform/default/",
- "third_party/abseil-cpp/",
- "third_party/boringssl/src/include/",
- "third_party/brotli/include/",
- "third_party/protobuf/src/",
- ],
- cpp_std: "c++17",
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- "-Wl,--script,external/cronet/base/android/library_loader/anchor_functions.lds",
- "-Wl,-wrap,asprintf",
- "-Wl,-wrap,calloc",
- "-Wl,-wrap,free",
- "-Wl,-wrap,getcwd",
- "-Wl,-wrap,malloc",
- "-Wl,-wrap,malloc_usable_size",
- "-Wl,-wrap,memalign",
- "-Wl,-wrap,posix_memalign",
- "-Wl,-wrap,pvalloc",
- "-Wl,-wrap,realloc",
- "-Wl,-wrap,realpath",
- "-Wl,-wrap,strdup",
- "-Wl,-wrap,strndup",
- "-Wl,-wrap,valloc",
- "-Wl,-wrap,vasprintf",
- ],
- target: {
- android_arm: {
- cflags: [
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-fstack-protector",
- "-msse3",
- ],
- },
- },
-}
-
-// GN: //net/dns:dns__testing
-cc_library_static {
- name: "cronet_aml_net_dns_dns__testing",
- srcs: [
- "net/dns/address_info.cc",
- "net/dns/address_sorter_posix.cc",
- "net/dns/context_host_resolver.cc",
- "net/dns/dns_alias_utility.cc",
- "net/dns/dns_client.cc",
- "net/dns/dns_config.cc",
- "net/dns/dns_config_service.cc",
- "net/dns/dns_config_service_android.cc",
- "net/dns/dns_hosts.cc",
- "net/dns/dns_query.cc",
- "net/dns/dns_reloader.cc",
- "net/dns/dns_response.cc",
- "net/dns/dns_response_result_extractor.cc",
- "net/dns/dns_server_iterator.cc",
- "net/dns/dns_session.cc",
- "net/dns/dns_transaction.cc",
- "net/dns/dns_udp_tracker.cc",
- "net/dns/dns_util.cc",
- "net/dns/host_cache.cc",
- "net/dns/host_resolver.cc",
- "net/dns/host_resolver_manager.cc",
- "net/dns/host_resolver_mdns_listener_impl.cc",
- "net/dns/host_resolver_mdns_task.cc",
- "net/dns/host_resolver_nat64_task.cc",
- "net/dns/host_resolver_proc.cc",
- "net/dns/host_resolver_system_task.cc",
- "net/dns/https_record_rdata.cc",
- "net/dns/httpssvc_metrics.cc",
- "net/dns/mapped_host_resolver.cc",
- "net/dns/nsswitch_reader.cc",
- "net/dns/opt_record_rdata.cc",
- "net/dns/record_parsed.cc",
- "net/dns/record_rdata.cc",
- "net/dns/resolve_context.cc",
- "net/dns/serial_worker.cc",
- "net/dns/system_dns_config_change_notifier.cc",
- "net/dns/test_dns_config_service.cc",
- ],
- shared_libs: [
- "libandroid",
- "liblog",
- "libz",
- ],
- static_libs: [
- "cronet_aml_base_allocator_partition_allocator_partition_alloc__testing",
- "cronet_aml_base_base__testing",
- "cronet_aml_base_base_static__testing",
- "cronet_aml_base_nodebug_assertion__testing",
- "cronet_aml_base_third_party_double_conversion_double_conversion__testing",
- "cronet_aml_base_third_party_dynamic_annotations_dynamic_annotations__testing",
- "cronet_aml_crypto_crypto__testing",
- "cronet_aml_net_dns_public_public__testing",
- "cronet_aml_net_net_deps__testing",
- "cronet_aml_net_net_public_deps__testing",
- "cronet_aml_net_preload_decoder__testing",
- "cronet_aml_net_third_party_quiche_quiche__testing",
- "cronet_aml_net_traffic_annotation_traffic_annotation__testing",
- "cronet_aml_net_uri_template__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_base__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_log_severity__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_malloc_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_raw_logging_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_spinlock_wait__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_strerror__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_throw_delegate__testing",
- "cronet_aml_third_party_abseil_cpp_absl_container_hashtablez_sampler__testing",
- "cronet_aml_third_party_abseil_cpp_absl_container_raw_hash_set__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_debugging_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_demangle_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_examine_stack__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_failure_signal_handler__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_stacktrace__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_symbolize__testing",
- "cronet_aml_third_party_abseil_cpp_absl_hash_city__testing",
- "cronet_aml_third_party_abseil_cpp_absl_hash_hash__testing",
- "cronet_aml_third_party_abseil_cpp_absl_hash_low_level_hash__testing",
- "cronet_aml_third_party_abseil_cpp_absl_numeric_int128__testing",
- "cronet_aml_third_party_abseil_cpp_absl_profiling_exponential_biased__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_distributions__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_platform__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_pool_urbg__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_hwaes__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_hwaes_impl__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_slow__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_seed_material__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_seed_gen_exception__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_seed_sequences__testing",
- "cronet_aml_third_party_abseil_cpp_absl_status_status__testing",
- "cronet_aml_third_party_abseil_cpp_absl_status_statusor__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cord__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cord_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_functions__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_handle__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_info__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_str_format_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_strings__testing",
- "cronet_aml_third_party_abseil_cpp_absl_synchronization_graphcycles_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_synchronization_synchronization__testing",
- "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_civil_time__testing",
- "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_time_zone__testing",
- "cronet_aml_third_party_abseil_cpp_absl_time_time__testing",
- "cronet_aml_third_party_abseil_cpp_absl_types_bad_optional_access__testing",
- "cronet_aml_third_party_abseil_cpp_absl_types_bad_variant_access__testing",
- "cronet_aml_third_party_android_ndk_cpu_features__testing",
- "cronet_aml_third_party_ashmem_ashmem__testing",
- "cronet_aml_third_party_boringssl_boringssl__testing",
- "cronet_aml_third_party_boringssl_boringssl_asm__testing",
- "cronet_aml_third_party_brotli_common__testing",
- "cronet_aml_third_party_brotli_dec__testing",
- "cronet_aml_third_party_icu_icui18n__testing",
- "cronet_aml_third_party_icu_icuuc_private__testing",
- "cronet_aml_third_party_libevent_libevent__testing",
- "cronet_aml_third_party_modp_b64_modp_b64__testing",
- "cronet_aml_third_party_protobuf_protobuf_lite__testing",
- "cronet_aml_url_url__testing",
- ],
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DENABLE_BUILT_IN_DNS",
- "-DGOOGLE_PROTOBUF_INTERNAL_DONATE_STEAL_INLINE=0",
- "-DGOOGLE_PROTOBUF_NO_RTTI",
- "-DGOOGLE_PROTOBUF_NO_STATIC_INITIALIZER",
- "-DHAVE_PTHREAD",
- "-DHAVE_SYS_UIO_H",
- "-DNDEBUG",
- "-DNET_IMPLEMENTATION",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_FORTIFY_SOURCE=2",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D__STDC_CONSTANT_MACROS",
- "-D__STDC_FORMAT_MACROS",
- "-Oz",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "net/third_party/quiche/overrides/",
- "net/third_party/quiche/src/",
- "net/third_party/quiche/src/quiche/common/platform/default/",
- "third_party/abseil-cpp/",
- "third_party/boringssl/src/include/",
- "third_party/brotli/include/",
- "third_party/protobuf/src/",
- ],
- cpp_std: "c++17",
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- "-Wl,--script,external/cronet/base/android/library_loader/anchor_functions.lds",
- "-Wl,-wrap,asprintf",
- "-Wl,-wrap,calloc",
- "-Wl,-wrap,free",
- "-Wl,-wrap,getcwd",
- "-Wl,-wrap,malloc",
- "-Wl,-wrap,malloc_usable_size",
- "-Wl,-wrap,memalign",
- "-Wl,-wrap,posix_memalign",
- "-Wl,-wrap,pvalloc",
- "-Wl,-wrap,realloc",
- "-Wl,-wrap,realpath",
- "-Wl,-wrap,strdup",
- "-Wl,-wrap,strndup",
- "-Wl,-wrap,valloc",
- "-Wl,-wrap,vasprintf",
- ],
- target: {
- android_arm: {
- cflags: [
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-fstack-protector",
- "-msse3",
- ],
- },
- },
-}
-
-// GN: //net/dns/public:public
-cc_library_static {
- name: "cronet_aml_net_dns_public_public",
- srcs: [
- "net/dns/public/dns_config_overrides.cc",
- "net/dns/public/dns_over_https_config.cc",
- "net/dns/public/dns_over_https_server_config.cc",
- "net/dns/public/dns_query_type.cc",
- "net/dns/public/doh_provider_entry.cc",
- "net/dns/public/host_resolver_results.cc",
- "net/dns/public/resolve_error_info.cc",
- "net/dns/public/util.cc",
- ],
- shared_libs: [
- "libandroid",
- "liblog",
- "libz",
- ],
- static_libs: [
- "cronet_aml_base_allocator_partition_allocator_partition_alloc",
- "cronet_aml_base_base",
- "cronet_aml_base_base_static",
- "cronet_aml_base_nodebug_assertion",
- "cronet_aml_base_third_party_double_conversion_double_conversion",
- "cronet_aml_base_third_party_dynamic_annotations_dynamic_annotations",
- "cronet_aml_crypto_crypto",
- "cronet_aml_net_net_deps",
- "cronet_aml_net_net_public_deps",
- "cronet_aml_net_preload_decoder",
- "cronet_aml_net_third_party_quiche_quiche",
- "cronet_aml_net_traffic_annotation_traffic_annotation",
- "cronet_aml_net_uri_template",
- "cronet_aml_third_party_abseil_cpp_absl_base_base",
- "cronet_aml_third_party_abseil_cpp_absl_base_log_severity",
- "cronet_aml_third_party_abseil_cpp_absl_base_malloc_internal",
- "cronet_aml_third_party_abseil_cpp_absl_base_raw_logging_internal",
- "cronet_aml_third_party_abseil_cpp_absl_base_spinlock_wait",
- "cronet_aml_third_party_abseil_cpp_absl_base_strerror",
- "cronet_aml_third_party_abseil_cpp_absl_base_throw_delegate",
- "cronet_aml_third_party_abseil_cpp_absl_container_hashtablez_sampler",
- "cronet_aml_third_party_abseil_cpp_absl_container_raw_hash_set",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_debugging_internal",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_demangle_internal",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_examine_stack",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_failure_signal_handler",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_stacktrace",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_symbolize",
- "cronet_aml_third_party_abseil_cpp_absl_hash_city",
- "cronet_aml_third_party_abseil_cpp_absl_hash_hash",
- "cronet_aml_third_party_abseil_cpp_absl_hash_low_level_hash",
- "cronet_aml_third_party_abseil_cpp_absl_numeric_int128",
- "cronet_aml_third_party_abseil_cpp_absl_profiling_exponential_biased",
- "cronet_aml_third_party_abseil_cpp_absl_random_distributions",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_platform",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_pool_urbg",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_hwaes",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_hwaes_impl",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_slow",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_seed_material",
- "cronet_aml_third_party_abseil_cpp_absl_random_seed_gen_exception",
- "cronet_aml_third_party_abseil_cpp_absl_random_seed_sequences",
- "cronet_aml_third_party_abseil_cpp_absl_status_status",
- "cronet_aml_third_party_abseil_cpp_absl_status_statusor",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cord",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cord_internal",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_functions",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_handle",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_info",
- "cronet_aml_third_party_abseil_cpp_absl_strings_internal",
- "cronet_aml_third_party_abseil_cpp_absl_strings_str_format_internal",
- "cronet_aml_third_party_abseil_cpp_absl_strings_strings",
- "cronet_aml_third_party_abseil_cpp_absl_synchronization_graphcycles_internal",
- "cronet_aml_third_party_abseil_cpp_absl_synchronization_synchronization",
- "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_civil_time",
- "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_time_zone",
- "cronet_aml_third_party_abseil_cpp_absl_time_time",
- "cronet_aml_third_party_abseil_cpp_absl_types_bad_optional_access",
- "cronet_aml_third_party_abseil_cpp_absl_types_bad_variant_access",
- "cronet_aml_third_party_android_ndk_cpu_features",
- "cronet_aml_third_party_ashmem_ashmem",
- "cronet_aml_third_party_boringssl_boringssl",
- "cronet_aml_third_party_boringssl_boringssl_asm",
- "cronet_aml_third_party_brotli_common",
- "cronet_aml_third_party_brotli_dec",
- "cronet_aml_third_party_icu_icui18n",
- "cronet_aml_third_party_icu_icuuc_private",
- "cronet_aml_third_party_libevent_libevent",
- "cronet_aml_third_party_modp_b64_modp_b64",
- "cronet_aml_third_party_protobuf_protobuf_lite",
- "cronet_aml_url_url",
- ],
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DENABLE_BUILT_IN_DNS",
- "-DGOOGLE_PROTOBUF_INTERNAL_DONATE_STEAL_INLINE=0",
- "-DGOOGLE_PROTOBUF_NO_RTTI",
- "-DGOOGLE_PROTOBUF_NO_STATIC_INITIALIZER",
- "-DHAVE_PTHREAD",
- "-DHAVE_SYS_UIO_H",
- "-DNDEBUG",
- "-DNET_IMPLEMENTATION",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_FORTIFY_SOURCE=2",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D__STDC_CONSTANT_MACROS",
- "-D__STDC_FORMAT_MACROS",
- "-Oz",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "net/third_party/quiche/overrides/",
- "net/third_party/quiche/src/",
- "net/third_party/quiche/src/quiche/common/platform/default/",
- "third_party/abseil-cpp/",
- "third_party/boringssl/src/include/",
- "third_party/brotli/include/",
- "third_party/protobuf/src/",
- ],
- cpp_std: "c++17",
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- "-Wl,--script,external/cronet/base/android/library_loader/anchor_functions.lds",
- "-Wl,-wrap,asprintf",
- "-Wl,-wrap,calloc",
- "-Wl,-wrap,free",
- "-Wl,-wrap,getcwd",
- "-Wl,-wrap,malloc",
- "-Wl,-wrap,malloc_usable_size",
- "-Wl,-wrap,memalign",
- "-Wl,-wrap,posix_memalign",
- "-Wl,-wrap,pvalloc",
- "-Wl,-wrap,realloc",
- "-Wl,-wrap,realpath",
- "-Wl,-wrap,strdup",
- "-Wl,-wrap,strndup",
- "-Wl,-wrap,valloc",
- "-Wl,-wrap,vasprintf",
- ],
- target: {
- android_arm: {
- cflags: [
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-fstack-protector",
- "-msse3",
- ],
- },
- },
-}
-
-// GN: //net/dns/public:public__testing
-cc_library_static {
- name: "cronet_aml_net_dns_public_public__testing",
- srcs: [
- "net/dns/public/dns_config_overrides.cc",
- "net/dns/public/dns_over_https_config.cc",
- "net/dns/public/dns_over_https_server_config.cc",
- "net/dns/public/dns_query_type.cc",
- "net/dns/public/doh_provider_entry.cc",
- "net/dns/public/host_resolver_results.cc",
- "net/dns/public/resolve_error_info.cc",
- "net/dns/public/util.cc",
- ],
- shared_libs: [
- "libandroid",
- "liblog",
- "libz",
- ],
- static_libs: [
- "cronet_aml_base_allocator_partition_allocator_partition_alloc__testing",
- "cronet_aml_base_base__testing",
- "cronet_aml_base_base_static__testing",
- "cronet_aml_base_nodebug_assertion__testing",
- "cronet_aml_base_third_party_double_conversion_double_conversion__testing",
- "cronet_aml_base_third_party_dynamic_annotations_dynamic_annotations__testing",
- "cronet_aml_crypto_crypto__testing",
- "cronet_aml_net_net_deps__testing",
- "cronet_aml_net_net_public_deps__testing",
- "cronet_aml_net_preload_decoder__testing",
- "cronet_aml_net_third_party_quiche_quiche__testing",
- "cronet_aml_net_traffic_annotation_traffic_annotation__testing",
- "cronet_aml_net_uri_template__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_base__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_log_severity__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_malloc_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_raw_logging_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_spinlock_wait__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_strerror__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_throw_delegate__testing",
- "cronet_aml_third_party_abseil_cpp_absl_container_hashtablez_sampler__testing",
- "cronet_aml_third_party_abseil_cpp_absl_container_raw_hash_set__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_debugging_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_demangle_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_examine_stack__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_failure_signal_handler__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_stacktrace__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_symbolize__testing",
- "cronet_aml_third_party_abseil_cpp_absl_hash_city__testing",
- "cronet_aml_third_party_abseil_cpp_absl_hash_hash__testing",
- "cronet_aml_third_party_abseil_cpp_absl_hash_low_level_hash__testing",
- "cronet_aml_third_party_abseil_cpp_absl_numeric_int128__testing",
- "cronet_aml_third_party_abseil_cpp_absl_profiling_exponential_biased__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_distributions__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_platform__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_pool_urbg__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_hwaes__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_hwaes_impl__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_slow__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_seed_material__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_seed_gen_exception__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_seed_sequences__testing",
- "cronet_aml_third_party_abseil_cpp_absl_status_status__testing",
- "cronet_aml_third_party_abseil_cpp_absl_status_statusor__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cord__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cord_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_functions__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_handle__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_info__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_str_format_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_strings__testing",
- "cronet_aml_third_party_abseil_cpp_absl_synchronization_graphcycles_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_synchronization_synchronization__testing",
- "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_civil_time__testing",
- "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_time_zone__testing",
- "cronet_aml_third_party_abseil_cpp_absl_time_time__testing",
- "cronet_aml_third_party_abseil_cpp_absl_types_bad_optional_access__testing",
- "cronet_aml_third_party_abseil_cpp_absl_types_bad_variant_access__testing",
- "cronet_aml_third_party_android_ndk_cpu_features__testing",
- "cronet_aml_third_party_ashmem_ashmem__testing",
- "cronet_aml_third_party_boringssl_boringssl__testing",
- "cronet_aml_third_party_boringssl_boringssl_asm__testing",
- "cronet_aml_third_party_brotli_common__testing",
- "cronet_aml_third_party_brotli_dec__testing",
- "cronet_aml_third_party_icu_icui18n__testing",
- "cronet_aml_third_party_icu_icuuc_private__testing",
- "cronet_aml_third_party_libevent_libevent__testing",
- "cronet_aml_third_party_modp_b64_modp_b64__testing",
- "cronet_aml_third_party_protobuf_protobuf_lite__testing",
- "cronet_aml_url_url__testing",
- ],
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DENABLE_BUILT_IN_DNS",
- "-DGOOGLE_PROTOBUF_INTERNAL_DONATE_STEAL_INLINE=0",
- "-DGOOGLE_PROTOBUF_NO_RTTI",
- "-DGOOGLE_PROTOBUF_NO_STATIC_INITIALIZER",
- "-DHAVE_PTHREAD",
- "-DHAVE_SYS_UIO_H",
- "-DNDEBUG",
- "-DNET_IMPLEMENTATION",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_FORTIFY_SOURCE=2",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D__STDC_CONSTANT_MACROS",
- "-D__STDC_FORMAT_MACROS",
- "-Oz",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "net/third_party/quiche/overrides/",
- "net/third_party/quiche/src/",
- "net/third_party/quiche/src/quiche/common/platform/default/",
- "third_party/abseil-cpp/",
- "third_party/boringssl/src/include/",
- "third_party/brotli/include/",
- "third_party/protobuf/src/",
- ],
- cpp_std: "c++17",
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- "-Wl,--script,external/cronet/base/android/library_loader/anchor_functions.lds",
- "-Wl,-wrap,asprintf",
- "-Wl,-wrap,calloc",
- "-Wl,-wrap,free",
- "-Wl,-wrap,getcwd",
- "-Wl,-wrap,malloc",
- "-Wl,-wrap,malloc_usable_size",
- "-Wl,-wrap,memalign",
- "-Wl,-wrap,posix_memalign",
- "-Wl,-wrap,pvalloc",
- "-Wl,-wrap,realloc",
- "-Wl,-wrap,realpath",
- "-Wl,-wrap,strdup",
- "-Wl,-wrap,strndup",
- "-Wl,-wrap,valloc",
- "-Wl,-wrap,vasprintf",
- ],
- target: {
- android_arm: {
- cflags: [
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-fstack-protector",
- "-msse3",
- ],
- },
- },
-}
-
-// GN: //net/dns:test_support__testing
-cc_library_static {
- name: "cronet_aml_net_dns_test_support__testing",
- srcs: [
- "net/dns/dns_test_util.cc",
- "net/dns/host_resolver_results_test_util.cc",
- "net/dns/mock_host_resolver.cc",
- ],
- shared_libs: [
- "libandroid",
- "liblog",
- "libz",
- ],
- static_libs: [
- "cronet_aml_base_allocator_partition_allocator_partition_alloc__testing",
- "cronet_aml_base_base__testing",
- "cronet_aml_base_base_static__testing",
- "cronet_aml_base_nodebug_assertion__testing",
- "cronet_aml_base_third_party_double_conversion_double_conversion__testing",
- "cronet_aml_base_third_party_dynamic_annotations_dynamic_annotations__testing",
- "cronet_aml_crypto_crypto__testing",
- "cronet_aml_net_dns_dns__testing",
- "cronet_aml_net_dns_public_public__testing",
- "cronet_aml_net_http_transport_security_state_generated_files__testing",
- "cronet_aml_net_net__testing",
- "cronet_aml_net_net_deps__testing",
- "cronet_aml_net_net_public_deps__testing",
- "cronet_aml_net_preload_decoder__testing",
- "cronet_aml_net_third_party_quiche_quiche__testing",
- "cronet_aml_net_traffic_annotation_traffic_annotation__testing",
- "cronet_aml_net_uri_template__testing",
- "cronet_aml_testing_gtest_gtest__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_base__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_log_severity__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_malloc_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_raw_logging_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_spinlock_wait__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_strerror__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_throw_delegate__testing",
- "cronet_aml_third_party_abseil_cpp_absl_container_hashtablez_sampler__testing",
- "cronet_aml_third_party_abseil_cpp_absl_container_raw_hash_set__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_debugging_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_demangle_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_examine_stack__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_failure_signal_handler__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_stacktrace__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_symbolize__testing",
- "cronet_aml_third_party_abseil_cpp_absl_hash_city__testing",
- "cronet_aml_third_party_abseil_cpp_absl_hash_hash__testing",
- "cronet_aml_third_party_abseil_cpp_absl_hash_low_level_hash__testing",
- "cronet_aml_third_party_abseil_cpp_absl_numeric_int128__testing",
- "cronet_aml_third_party_abseil_cpp_absl_profiling_exponential_biased__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_distributions__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_platform__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_pool_urbg__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_hwaes__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_hwaes_impl__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_slow__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_seed_material__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_seed_gen_exception__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_seed_sequences__testing",
- "cronet_aml_third_party_abseil_cpp_absl_status_status__testing",
- "cronet_aml_third_party_abseil_cpp_absl_status_statusor__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cord__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cord_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_functions__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_handle__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_info__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_str_format_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_strings__testing",
- "cronet_aml_third_party_abseil_cpp_absl_synchronization_graphcycles_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_synchronization_synchronization__testing",
- "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_civil_time__testing",
- "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_time_zone__testing",
- "cronet_aml_third_party_abseil_cpp_absl_time_time__testing",
- "cronet_aml_third_party_abseil_cpp_absl_types_bad_optional_access__testing",
- "cronet_aml_third_party_abseil_cpp_absl_types_bad_variant_access__testing",
- "cronet_aml_third_party_android_ndk_cpu_features__testing",
- "cronet_aml_third_party_ashmem_ashmem__testing",
- "cronet_aml_third_party_boringssl_boringssl__testing",
- "cronet_aml_third_party_boringssl_boringssl_asm__testing",
- "cronet_aml_third_party_brotli_common__testing",
- "cronet_aml_third_party_brotli_dec__testing",
- "cronet_aml_third_party_googletest_gmock__testing",
- "cronet_aml_third_party_googletest_gtest__testing",
- "cronet_aml_third_party_icu_icui18n__testing",
- "cronet_aml_third_party_icu_icuuc_private__testing",
- "cronet_aml_third_party_libevent_libevent__testing",
- "cronet_aml_third_party_modp_b64_modp_b64__testing",
- "cronet_aml_third_party_protobuf_protobuf_lite__testing",
- "cronet_aml_url_url__testing",
- ],
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DGOOGLE_PROTOBUF_INTERNAL_DONATE_STEAL_INLINE=0",
- "-DGOOGLE_PROTOBUF_NO_RTTI",
- "-DGOOGLE_PROTOBUF_NO_STATIC_INITIALIZER",
- "-DGTEST_API_=",
- "-DGTEST_HAS_ABSL=1",
- "-DGTEST_HAS_POSIX_RE=0",
- "-DGTEST_HAS_TR1_TUPLE=0",
- "-DGTEST_LANG_CXX11=1",
- "-DHAVE_PTHREAD",
- "-DHAVE_SYS_UIO_H",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-DUNIT_TEST",
- "-D_FORTIFY_SOURCE=2",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D__STDC_CONSTANT_MACROS",
- "-D__STDC_FORMAT_MACROS",
- "-Oz",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "net/third_party/quiche/overrides/",
- "net/third_party/quiche/src/",
- "net/third_party/quiche/src/quiche/common/platform/default/",
- "third_party/abseil-cpp/",
- "third_party/boringssl/src/include/",
- "third_party/googletest/custom/",
- "third_party/googletest/src/googlemock/include/",
- "third_party/googletest/src/googletest/include/",
- "third_party/protobuf/src/",
- ],
- cpp_std: "c++17",
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- "-Wl,--script,external/cronet/base/android/library_loader/anchor_functions.lds",
- "-Wl,-wrap,asprintf",
- "-Wl,-wrap,calloc",
- "-Wl,-wrap,free",
- "-Wl,-wrap,getcwd",
- "-Wl,-wrap,malloc",
- "-Wl,-wrap,malloc_usable_size",
- "-Wl,-wrap,memalign",
- "-Wl,-wrap,posix_memalign",
- "-Wl,-wrap,pvalloc",
- "-Wl,-wrap,realloc",
- "-Wl,-wrap,realpath",
- "-Wl,-wrap,strdup",
- "-Wl,-wrap,strndup",
- "-Wl,-wrap,valloc",
- "-Wl,-wrap,vasprintf",
- ],
- target: {
- android_arm: {
- cflags: [
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-fstack-protector",
- "-msse3",
- ],
- },
- },
-}
-
-// GN: //net:effective_connection_type_java
-java_genrule {
- name: "cronet_aml_net_effective_connection_type_java",
- cmd: "$(location build/android/gyp/java_cpp_enum.py) --srcjar " +
- "$(out) " +
- "$(location net/nqe/effective_connection_type.h)",
- out: [
- "net/effective_connection_type_java.srcjar",
- ],
- tool_files: [
- "build/android/gyp/java_cpp_enum.py",
- "build/android/gyp/util/__init__.py",
- "build/android/gyp/util/build_utils.py",
- "build/android/gyp/util/java_cpp_utils.py",
- "build/gn_helpers.py",
- "net/nqe/effective_connection_type.h",
- ],
-}
-
-// GN: //net:gtest_util__testing
-cc_library_static {
- name: "cronet_aml_net_gtest_util__testing",
- srcs: [
- "net/test/scoped_disable_exit_on_dfatal.cc",
- ],
- shared_libs: [
- "libandroid",
- "liblog",
- "libz",
- ],
- static_libs: [
- "cronet_aml_base_allocator_partition_allocator_partition_alloc__testing",
- "cronet_aml_base_base__testing",
- "cronet_aml_base_base_static__testing",
- "cronet_aml_base_i18n__testing",
- "cronet_aml_base_nodebug_assertion__testing",
- "cronet_aml_base_test_test_config__testing",
- "cronet_aml_base_test_test_support__testing",
- "cronet_aml_base_third_party_double_conversion_double_conversion__testing",
- "cronet_aml_base_third_party_dynamic_annotations_dynamic_annotations__testing",
- "cronet_aml_crypto_crypto__testing",
- "cronet_aml_net_dns_dns__testing",
- "cronet_aml_net_dns_public_public__testing",
- "cronet_aml_net_http_transport_security_state_generated_files__testing",
- "cronet_aml_net_net__testing",
- "cronet_aml_net_net_deps__testing",
- "cronet_aml_net_net_public_deps__testing",
- "cronet_aml_net_preload_decoder__testing",
- "cronet_aml_net_third_party_quiche_quiche__testing",
- "cronet_aml_net_traffic_annotation_traffic_annotation__testing",
- "cronet_aml_net_uri_template__testing",
- "cronet_aml_testing_gtest_gtest__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_base__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_log_severity__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_malloc_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_raw_logging_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_spinlock_wait__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_strerror__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_throw_delegate__testing",
- "cronet_aml_third_party_abseil_cpp_absl_container_hashtablez_sampler__testing",
- "cronet_aml_third_party_abseil_cpp_absl_container_raw_hash_set__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_debugging_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_demangle_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_examine_stack__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_failure_signal_handler__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_stacktrace__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_symbolize__testing",
- "cronet_aml_third_party_abseil_cpp_absl_hash_city__testing",
- "cronet_aml_third_party_abseil_cpp_absl_hash_hash__testing",
- "cronet_aml_third_party_abseil_cpp_absl_hash_low_level_hash__testing",
- "cronet_aml_third_party_abseil_cpp_absl_numeric_int128__testing",
- "cronet_aml_third_party_abseil_cpp_absl_profiling_exponential_biased__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_distributions__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_platform__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_pool_urbg__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_hwaes__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_hwaes_impl__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_slow__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_seed_material__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_seed_gen_exception__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_seed_sequences__testing",
- "cronet_aml_third_party_abseil_cpp_absl_status_status__testing",
- "cronet_aml_third_party_abseil_cpp_absl_status_statusor__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cord__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cord_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_functions__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_handle__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_info__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_str_format_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_strings__testing",
- "cronet_aml_third_party_abseil_cpp_absl_synchronization_graphcycles_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_synchronization_synchronization__testing",
- "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_civil_time__testing",
- "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_time_zone__testing",
- "cronet_aml_third_party_abseil_cpp_absl_time_time__testing",
- "cronet_aml_third_party_abseil_cpp_absl_types_bad_optional_access__testing",
- "cronet_aml_third_party_abseil_cpp_absl_types_bad_variant_access__testing",
- "cronet_aml_third_party_android_ndk_cpu_features__testing",
- "cronet_aml_third_party_ashmem_ashmem__testing",
- "cronet_aml_third_party_boringssl_boringssl__testing",
- "cronet_aml_third_party_boringssl_boringssl_asm__testing",
- "cronet_aml_third_party_brotli_common__testing",
- "cronet_aml_third_party_brotli_dec__testing",
- "cronet_aml_third_party_ced_ced__testing",
- "cronet_aml_third_party_googletest_gmock__testing",
- "cronet_aml_third_party_googletest_gtest__testing",
- "cronet_aml_third_party_icu_icui18n__testing",
- "cronet_aml_third_party_icu_icuuc_private__testing",
- "cronet_aml_third_party_libevent_libevent__testing",
- "cronet_aml_third_party_libxml_libxml__testing",
- "cronet_aml_third_party_libxml_libxml_utils__testing",
- "cronet_aml_third_party_libxml_xml_reader__testing",
- "cronet_aml_third_party_modp_b64_modp_b64__testing",
- "cronet_aml_third_party_protobuf_protobuf_lite__testing",
- "cronet_aml_url_url__testing",
- ],
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DGOOGLE_PROTOBUF_INTERNAL_DONATE_STEAL_INLINE=0",
- "-DGOOGLE_PROTOBUF_NO_RTTI",
- "-DGOOGLE_PROTOBUF_NO_STATIC_INITIALIZER",
- "-DGTEST_API_=",
- "-DGTEST_HAS_ABSL=1",
- "-DGTEST_HAS_POSIX_RE=0",
- "-DGTEST_HAS_TR1_TUPLE=0",
- "-DGTEST_LANG_CXX11=1",
- "-DHAVE_PTHREAD",
- "-DHAVE_SYS_UIO_H",
- "-DICU_UTIL_DATA_IMPL=ICU_UTIL_DATA_FILE",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-DUNIT_TEST",
- "-DUSE_CHROMIUM_ICU=1",
- "-DU_ENABLE_DYLOAD=0",
- "-DU_ENABLE_RESOURCE_TRACING=0",
- "-DU_ENABLE_TRACING=1",
- "-DU_STATIC_IMPLEMENTATION",
- "-DU_USING_ICU_NAMESPACE=0",
- "-D_FORTIFY_SOURCE=2",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D__STDC_CONSTANT_MACROS",
- "-D__STDC_FORMAT_MACROS",
- "-Oz",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "net/third_party/quiche/overrides/",
- "net/third_party/quiche/src/",
- "net/third_party/quiche/src/quiche/common/platform/default/",
- "third_party/abseil-cpp/",
- "third_party/boringssl/src/include/",
- "third_party/ced/src/",
- "third_party/googletest/custom/",
- "third_party/googletest/src/googlemock/include/",
- "third_party/googletest/src/googletest/include/",
- "third_party/icu/source/common/",
- "third_party/icu/source/i18n/",
- "third_party/protobuf/src/",
- ],
- cpp_std: "c++17",
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- "-Wl,--script,external/cronet/base/android/library_loader/anchor_functions.lds",
- "-Wl,-wrap,asprintf",
- "-Wl,-wrap,calloc",
- "-Wl,-wrap,free",
- "-Wl,-wrap,getcwd",
- "-Wl,-wrap,malloc",
- "-Wl,-wrap,malloc_usable_size",
- "-Wl,-wrap,memalign",
- "-Wl,-wrap,posix_memalign",
- "-Wl,-wrap,pvalloc",
- "-Wl,-wrap,realloc",
- "-Wl,-wrap,realpath",
- "-Wl,-wrap,strdup",
- "-Wl,-wrap,strndup",
- "-Wl,-wrap,valloc",
- "-Wl,-wrap,vasprintf",
- ],
- target: {
- android_arm: {
- cflags: [
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-fstack-protector",
- "-msse3",
- ],
- },
- },
-}
-
-// GN: //net/http:transport_security_state_generated_files
-cc_library_static {
- name: "cronet_aml_net_http_transport_security_state_generated_files",
- srcs: [
- "net/http/transport_security_state.cc",
- ],
- shared_libs: [
- "libandroid",
- "liblog",
- "libz",
- ],
- static_libs: [
- "cronet_aml_base_allocator_partition_allocator_partition_alloc",
- "cronet_aml_base_base",
- "cronet_aml_base_base_static",
- "cronet_aml_base_nodebug_assertion",
- "cronet_aml_base_third_party_double_conversion_double_conversion",
- "cronet_aml_base_third_party_dynamic_annotations_dynamic_annotations",
- "cronet_aml_crypto_crypto",
- "cronet_aml_net_dns_dns",
- "cronet_aml_net_dns_public_public",
- "cronet_aml_net_net_deps",
- "cronet_aml_net_net_public_deps",
- "cronet_aml_net_preload_decoder",
- "cronet_aml_net_third_party_quiche_quiche",
- "cronet_aml_net_traffic_annotation_traffic_annotation",
- "cronet_aml_net_uri_template",
- "cronet_aml_third_party_abseil_cpp_absl_base_base",
- "cronet_aml_third_party_abseil_cpp_absl_base_log_severity",
- "cronet_aml_third_party_abseil_cpp_absl_base_malloc_internal",
- "cronet_aml_third_party_abseil_cpp_absl_base_raw_logging_internal",
- "cronet_aml_third_party_abseil_cpp_absl_base_spinlock_wait",
- "cronet_aml_third_party_abseil_cpp_absl_base_strerror",
- "cronet_aml_third_party_abseil_cpp_absl_base_throw_delegate",
- "cronet_aml_third_party_abseil_cpp_absl_container_hashtablez_sampler",
- "cronet_aml_third_party_abseil_cpp_absl_container_raw_hash_set",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_debugging_internal",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_demangle_internal",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_examine_stack",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_failure_signal_handler",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_stacktrace",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_symbolize",
- "cronet_aml_third_party_abseil_cpp_absl_hash_city",
- "cronet_aml_third_party_abseil_cpp_absl_hash_hash",
- "cronet_aml_third_party_abseil_cpp_absl_hash_low_level_hash",
- "cronet_aml_third_party_abseil_cpp_absl_numeric_int128",
- "cronet_aml_third_party_abseil_cpp_absl_profiling_exponential_biased",
- "cronet_aml_third_party_abseil_cpp_absl_random_distributions",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_platform",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_pool_urbg",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_hwaes",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_hwaes_impl",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_slow",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_seed_material",
- "cronet_aml_third_party_abseil_cpp_absl_random_seed_gen_exception",
- "cronet_aml_third_party_abseil_cpp_absl_random_seed_sequences",
- "cronet_aml_third_party_abseil_cpp_absl_status_status",
- "cronet_aml_third_party_abseil_cpp_absl_status_statusor",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cord",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cord_internal",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_functions",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_handle",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_info",
- "cronet_aml_third_party_abseil_cpp_absl_strings_internal",
- "cronet_aml_third_party_abseil_cpp_absl_strings_str_format_internal",
- "cronet_aml_third_party_abseil_cpp_absl_strings_strings",
- "cronet_aml_third_party_abseil_cpp_absl_synchronization_graphcycles_internal",
- "cronet_aml_third_party_abseil_cpp_absl_synchronization_synchronization",
- "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_civil_time",
- "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_time_zone",
- "cronet_aml_third_party_abseil_cpp_absl_time_time",
- "cronet_aml_third_party_abseil_cpp_absl_types_bad_optional_access",
- "cronet_aml_third_party_abseil_cpp_absl_types_bad_variant_access",
- "cronet_aml_third_party_android_ndk_cpu_features",
- "cronet_aml_third_party_ashmem_ashmem",
- "cronet_aml_third_party_boringssl_boringssl",
- "cronet_aml_third_party_boringssl_boringssl_asm",
- "cronet_aml_third_party_brotli_common",
- "cronet_aml_third_party_brotli_dec",
- "cronet_aml_third_party_icu_icui18n",
- "cronet_aml_third_party_icu_icuuc_private",
- "cronet_aml_third_party_libevent_libevent",
- "cronet_aml_third_party_modp_b64_modp_b64",
- "cronet_aml_third_party_protobuf_protobuf_lite",
- "cronet_aml_url_url",
- ],
- generated_headers: [
- "cronet_aml_build_branding_buildflags",
- ],
- export_generated_headers: [
- "cronet_aml_build_branding_buildflags",
- ],
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DENABLE_BUILT_IN_DNS",
- "-DGOOGLE_PROTOBUF_INTERNAL_DONATE_STEAL_INLINE=0",
- "-DGOOGLE_PROTOBUF_NO_RTTI",
- "-DGOOGLE_PROTOBUF_NO_STATIC_INITIALIZER",
- "-DHAVE_PTHREAD",
- "-DHAVE_SYS_UIO_H",
- "-DNDEBUG",
- "-DNET_IMPLEMENTATION",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_FORTIFY_SOURCE=2",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D__STDC_CONSTANT_MACROS",
- "-D__STDC_FORMAT_MACROS",
- "-Oz",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "net/third_party/quiche/overrides/",
- "net/third_party/quiche/src/",
- "net/third_party/quiche/src/quiche/common/platform/default/",
- "third_party/abseil-cpp/",
- "third_party/boringssl/src/include/",
- "third_party/brotli/include/",
- "third_party/protobuf/src/",
- ],
- cpp_std: "c++17",
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- "-Wl,--script,external/cronet/base/android/library_loader/anchor_functions.lds",
- "-Wl,-wrap,asprintf",
- "-Wl,-wrap,calloc",
- "-Wl,-wrap,free",
- "-Wl,-wrap,getcwd",
- "-Wl,-wrap,malloc",
- "-Wl,-wrap,malloc_usable_size",
- "-Wl,-wrap,memalign",
- "-Wl,-wrap,posix_memalign",
- "-Wl,-wrap,pvalloc",
- "-Wl,-wrap,realloc",
- "-Wl,-wrap,realpath",
- "-Wl,-wrap,strdup",
- "-Wl,-wrap,strndup",
- "-Wl,-wrap,valloc",
- "-Wl,-wrap,vasprintf",
- ],
- target: {
- android_arm: {
- cflags: [
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-fstack-protector",
- "-msse3",
- ],
- },
- },
-}
-
-// GN: //net/http:transport_security_state_generated_files__testing
-cc_library_static {
- name: "cronet_aml_net_http_transport_security_state_generated_files__testing",
- srcs: [
- "net/http/transport_security_state.cc",
- ],
- shared_libs: [
- "libandroid",
- "liblog",
- "libz",
- ],
- static_libs: [
- "cronet_aml_base_allocator_partition_allocator_partition_alloc__testing",
- "cronet_aml_base_base__testing",
- "cronet_aml_base_base_static__testing",
- "cronet_aml_base_nodebug_assertion__testing",
- "cronet_aml_base_third_party_double_conversion_double_conversion__testing",
- "cronet_aml_base_third_party_dynamic_annotations_dynamic_annotations__testing",
- "cronet_aml_crypto_crypto__testing",
- "cronet_aml_net_dns_dns__testing",
- "cronet_aml_net_dns_public_public__testing",
- "cronet_aml_net_net_deps__testing",
- "cronet_aml_net_net_public_deps__testing",
- "cronet_aml_net_preload_decoder__testing",
- "cronet_aml_net_third_party_quiche_quiche__testing",
- "cronet_aml_net_traffic_annotation_traffic_annotation__testing",
- "cronet_aml_net_uri_template__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_base__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_log_severity__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_malloc_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_raw_logging_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_spinlock_wait__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_strerror__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_throw_delegate__testing",
- "cronet_aml_third_party_abseil_cpp_absl_container_hashtablez_sampler__testing",
- "cronet_aml_third_party_abseil_cpp_absl_container_raw_hash_set__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_debugging_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_demangle_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_examine_stack__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_failure_signal_handler__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_stacktrace__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_symbolize__testing",
- "cronet_aml_third_party_abseil_cpp_absl_hash_city__testing",
- "cronet_aml_third_party_abseil_cpp_absl_hash_hash__testing",
- "cronet_aml_third_party_abseil_cpp_absl_hash_low_level_hash__testing",
- "cronet_aml_third_party_abseil_cpp_absl_numeric_int128__testing",
- "cronet_aml_third_party_abseil_cpp_absl_profiling_exponential_biased__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_distributions__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_platform__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_pool_urbg__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_hwaes__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_hwaes_impl__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_slow__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_seed_material__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_seed_gen_exception__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_seed_sequences__testing",
- "cronet_aml_third_party_abseil_cpp_absl_status_status__testing",
- "cronet_aml_third_party_abseil_cpp_absl_status_statusor__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cord__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cord_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_functions__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_handle__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_info__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_str_format_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_strings__testing",
- "cronet_aml_third_party_abseil_cpp_absl_synchronization_graphcycles_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_synchronization_synchronization__testing",
- "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_civil_time__testing",
- "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_time_zone__testing",
- "cronet_aml_third_party_abseil_cpp_absl_time_time__testing",
- "cronet_aml_third_party_abseil_cpp_absl_types_bad_optional_access__testing",
- "cronet_aml_third_party_abseil_cpp_absl_types_bad_variant_access__testing",
- "cronet_aml_third_party_android_ndk_cpu_features__testing",
- "cronet_aml_third_party_ashmem_ashmem__testing",
- "cronet_aml_third_party_boringssl_boringssl__testing",
- "cronet_aml_third_party_boringssl_boringssl_asm__testing",
- "cronet_aml_third_party_brotli_common__testing",
- "cronet_aml_third_party_brotli_dec__testing",
- "cronet_aml_third_party_icu_icui18n__testing",
- "cronet_aml_third_party_icu_icuuc_private__testing",
- "cronet_aml_third_party_libevent_libevent__testing",
- "cronet_aml_third_party_modp_b64_modp_b64__testing",
- "cronet_aml_third_party_protobuf_protobuf_lite__testing",
- "cronet_aml_url_url__testing",
- ],
- generated_headers: [
- "cronet_aml_build_branding_buildflags__testing",
- ],
- export_generated_headers: [
- "cronet_aml_build_branding_buildflags__testing",
- ],
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DENABLE_BUILT_IN_DNS",
- "-DGOOGLE_PROTOBUF_INTERNAL_DONATE_STEAL_INLINE=0",
- "-DGOOGLE_PROTOBUF_NO_RTTI",
- "-DGOOGLE_PROTOBUF_NO_STATIC_INITIALIZER",
- "-DHAVE_PTHREAD",
- "-DHAVE_SYS_UIO_H",
- "-DNDEBUG",
- "-DNET_IMPLEMENTATION",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_FORTIFY_SOURCE=2",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D__STDC_CONSTANT_MACROS",
- "-D__STDC_FORMAT_MACROS",
- "-Oz",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "net/third_party/quiche/overrides/",
- "net/third_party/quiche/src/",
- "net/third_party/quiche/src/quiche/common/platform/default/",
- "third_party/abseil-cpp/",
- "third_party/boringssl/src/include/",
- "third_party/brotli/include/",
- "third_party/protobuf/src/",
- ],
- cpp_std: "c++17",
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- "-Wl,--script,external/cronet/base/android/library_loader/anchor_functions.lds",
- "-Wl,-wrap,asprintf",
- "-Wl,-wrap,calloc",
- "-Wl,-wrap,free",
- "-Wl,-wrap,getcwd",
- "-Wl,-wrap,malloc",
- "-Wl,-wrap,malloc_usable_size",
- "-Wl,-wrap,memalign",
- "-Wl,-wrap,posix_memalign",
- "-Wl,-wrap,pvalloc",
- "-Wl,-wrap,realloc",
- "-Wl,-wrap,realpath",
- "-Wl,-wrap,strdup",
- "-Wl,-wrap,strndup",
- "-Wl,-wrap,valloc",
- "-Wl,-wrap,vasprintf",
- ],
- target: {
- android_arm: {
- cflags: [
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-fstack-protector",
- "-msse3",
- ],
- },
- },
-}
-
-// GN: //net/http:transport_security_state_unittest_data_default__testing
-cc_genrule {
- name: "cronet_aml_net_http_transport_security_state_unittest_data_default__testing",
- tools: [
- "cronet_aml_net_tools_transport_security_state_generator_transport_security_state_generator__testing",
- ],
- cmd: "$(location cronet_aml_net_tools_transport_security_state_generator_transport_security_state_generator__testing) " +
- "$(location net/http/transport_security_state_static_unittest_default.json) " +
- "$(location net/http/transport_security_state_static_unittest_default.pins) " +
- "$(location net/http/transport_security_state_static_unittest.template) " +
- "$(location net/http/transport_security_state_static_unittest_default.h)",
- out: [
- "net/http/transport_security_state_static_unittest_default.h",
- ],
- tool_files: [
- "build/gn_run_binary.py",
- "net/http/transport_security_state_static_unittest.template",
- "net/http/transport_security_state_static_unittest_default.json",
- "net/http/transport_security_state_static_unittest_default.pins",
- ],
- apex_available: [
- "com.android.tethering",
- ],
-}
-
-// GN: //net:ios_cronet_buildflags
-cc_genrule {
- name: "cronet_aml_net_ios_cronet_buildflags",
- cmd: "echo '--flags CRONET_BUILD=\"true\"' | " +
- "$(location build/write_buildflag_header.py) --output " +
- "$(out) " +
- "--rulename " +
- "//net:ios_cronet_buildflags " +
- "--gen-dir " +
- ". " +
- "--definitions " +
- "/dev/stdin",
- out: [
- "net/socket/ios_cronet_buildflags.h",
- ],
- tool_files: [
- "build/write_buildflag_header.py",
- ],
- apex_available: [
- "com.android.tethering",
- ],
-}
-
-// GN: //net:ios_cronet_buildflags__testing
-cc_genrule {
- name: "cronet_aml_net_ios_cronet_buildflags__testing",
- cmd: "echo '--flags CRONET_BUILD=\"true\"' | " +
- "$(location build/write_buildflag_header.py) --output " +
- "$(out) " +
- "--rulename " +
- "//net:ios_cronet_buildflags " +
- "--gen-dir " +
- ". " +
- "--definitions " +
- "/dev/stdin",
- out: [
- "net/socket/ios_cronet_buildflags.h",
- ],
- tool_files: [
- "build/write_buildflag_header.py",
- ],
- apex_available: [
- "com.android.tethering",
- ],
-}
-
-// GN: //net:isolation_info_proto__testing
-cc_genrule {
- name: "cronet_aml_net_isolation_info_proto__testing_gen",
- srcs: [
- "net/base/isolation_info.proto",
- ],
- tools: [
- "cronet_aml_third_party_protobuf_protoc",
- ],
- cmd: "$(location cronet_aml_third_party_protobuf_protoc) --proto_path=external/cronet/net/base --cpp_out=lite=true:$(genDir)/external/cronet/net/base/ $(in)",
- out: [
- "external/cronet/net/base/isolation_info.pb.cc",
- ],
- apex_available: [
- "com.android.tethering",
- ],
-}
-
-// GN: //net:isolation_info_proto__testing
-cc_genrule {
- name: "cronet_aml_net_isolation_info_proto__testing_gen_headers",
- srcs: [
- "net/base/isolation_info.proto",
- ],
- tools: [
- "cronet_aml_third_party_protobuf_protoc",
- ],
- cmd: "$(location cronet_aml_third_party_protobuf_protoc) --proto_path=external/cronet/net/base --cpp_out=lite=true:$(genDir)/external/cronet/net/base/ $(in)",
- out: [
- "external/cronet/net/base/isolation_info.pb.h",
- ],
- export_include_dirs: [
- ".",
- "net/base",
- "protos",
- ],
- apex_available: [
- "com.android.tethering",
- ],
-}
-
-// GN: //net:isolation_info_proto
-cc_genrule {
- name: "cronet_aml_net_isolation_info_proto_gen",
- srcs: [
- "net/base/isolation_info.proto",
- ],
- tools: [
- "cronet_aml_third_party_protobuf_protoc",
- ],
- cmd: "$(location cronet_aml_third_party_protobuf_protoc) --proto_path=external/cronet/net/base --cpp_out=lite=true:$(genDir)/external/cronet/net/base/ $(in)",
- out: [
- "external/cronet/net/base/isolation_info.pb.cc",
- ],
- apex_available: [
- "com.android.tethering",
- ],
-}
-
-// GN: //net:isolation_info_proto
-cc_genrule {
- name: "cronet_aml_net_isolation_info_proto_gen_headers",
- srcs: [
- "net/base/isolation_info.proto",
- ],
- tools: [
- "cronet_aml_third_party_protobuf_protoc",
- ],
- cmd: "$(location cronet_aml_third_party_protobuf_protoc) --proto_path=external/cronet/net/base --cpp_out=lite=true:$(genDir)/external/cronet/net/base/ $(in)",
- out: [
- "external/cronet/net/base/isolation_info.pb.h",
- ],
- export_include_dirs: [
- ".",
- "net/base",
- "protos",
- ],
- apex_available: [
- "com.android.tethering",
- ],
-}
-
-// GN: //net:net
-cc_library_static {
- name: "cronet_aml_net_net",
- srcs: [
- "net/android/android_http_util.cc",
- "net/android/cert_verify_result_android.cc",
- "net/android/gurl_utils.cc",
- "net/android/http_auth_negotiate_android.cc",
- "net/android/keystore.cc",
- "net/android/network_change_notifier_android.cc",
- "net/android/network_change_notifier_delegate_android.cc",
- "net/android/network_change_notifier_factory_android.cc",
- "net/android/network_library.cc",
- "net/android/radio_activity_tracker.cc",
- "net/android/traffic_stats.cc",
- "net/base/address_family.cc",
- "net/base/address_list.cc",
- "net/base/address_tracker_linux.cc",
- "net/base/auth.cc",
- "net/base/backoff_entry.cc",
- "net/base/backoff_entry_serializer.cc",
- "net/base/cache_metrics.cc",
- "net/base/chunked_upload_data_stream.cc",
- "net/base/connection_endpoint_metadata.cc",
- "net/base/data_url.cc",
- "net/base/datagram_buffer.cc",
- "net/base/elements_upload_data_stream.cc",
- "net/base/features.cc",
- "net/base/file_stream.cc",
- "net/base/file_stream_context.cc",
- "net/base/file_stream_context_posix.cc",
- "net/base/filename_util.cc",
- "net/base/filename_util_internal.cc",
- "net/base/hash_value.cc",
- "net/base/hex_utils.cc",
- "net/base/host_mapping_rules.cc",
- "net/base/host_port_pair.cc",
- "net/base/io_buffer.cc",
- "net/base/ip_address.cc",
- "net/base/ip_endpoint.cc",
- "net/base/isolation_info.cc",
- "net/base/load_timing_info.cc",
- "net/base/logging_network_change_observer.cc",
- "net/base/lookup_string_in_fixed_set.cc",
- "net/base/mime_sniffer.cc",
- "net/base/mime_util.cc",
- "net/base/net_errors.cc",
- "net/base/net_errors_posix.cc",
- "net/base/net_module.cc",
- "net/base/net_string_util_icu_alternatives_android.cc",
- "net/base/network_activity_monitor.cc",
- "net/base/network_anonymization_key.cc",
- "net/base/network_change_notifier.cc",
- "net/base/network_change_notifier_posix.cc",
- "net/base/network_delegate.cc",
- "net/base/network_delegate_impl.cc",
- "net/base/network_interfaces.cc",
- "net/base/network_interfaces_getifaddrs.cc",
- "net/base/network_interfaces_getifaddrs_android.cc",
- "net/base/network_interfaces_linux.cc",
- "net/base/network_interfaces_posix.cc",
- "net/base/network_isolation_key.cc",
- "net/base/parse_number.cc",
- "net/base/platform_mime_util_linux.cc",
- "net/base/port_util.cc",
- "net/base/prioritized_dispatcher.cc",
- "net/base/prioritized_task_runner.cc",
- "net/base/privacy_mode.cc",
- "net/base/proxy_server.cc",
- "net/base/proxy_string_util.cc",
- "net/base/registry_controlled_domains/registry_controlled_domain.cc",
- "net/base/request_priority.cc",
- "net/base/scheme_host_port_matcher.cc",
- "net/base/scheme_host_port_matcher_rule.cc",
- "net/base/schemeful_site.cc",
- "net/base/sockaddr_storage.cc",
- "net/base/sockaddr_util_posix.cc",
- "net/base/transport_info.cc",
- "net/base/upload_bytes_element_reader.cc",
- "net/base/upload_data_stream.cc",
- "net/base/upload_element_reader.cc",
- "net/base/upload_file_element_reader.cc",
- "net/base/url_util.cc",
- "net/cert/asn1_util.cc",
- "net/cert/caching_cert_verifier.cc",
- "net/cert/cert_and_ct_verifier.cc",
- "net/cert/cert_database.cc",
- "net/cert/cert_status_flags.cc",
- "net/cert/cert_verifier.cc",
- "net/cert/cert_verify_proc.cc",
- "net/cert/cert_verify_proc_android.cc",
- "net/cert/cert_verify_proc_builtin.cc",
- "net/cert/cert_verify_result.cc",
- "net/cert/coalescing_cert_verifier.cc",
- "net/cert/crl_set.cc",
- "net/cert/ct_log_response_parser.cc",
- "net/cert/ct_log_verifier.cc",
- "net/cert/ct_log_verifier_util.cc",
- "net/cert/ct_objects_extractor.cc",
- "net/cert/ct_policy_enforcer.cc",
- "net/cert/ct_sct_to_string.cc",
- "net/cert/ct_serialization.cc",
- "net/cert/ct_signed_certificate_timestamp_log_param.cc",
- "net/cert/do_nothing_ct_verifier.cc",
- "net/cert/ev_root_ca_metadata.cc",
- "net/cert/internal/cert_issuer_source_aia.cc",
- "net/cert/internal/revocation_checker.cc",
- "net/cert/internal/system_trust_store.cc",
- "net/cert/known_roots.cc",
- "net/cert/merkle_audit_proof.cc",
- "net/cert/merkle_consistency_proof.cc",
- "net/cert/merkle_tree_leaf.cc",
- "net/cert/multi_log_ct_verifier.cc",
- "net/cert/multi_threaded_cert_verifier.cc",
- "net/cert/ocsp_verify_result.cc",
- "net/cert/pem.cc",
- "net/cert/pki/cert_error_id.cc",
- "net/cert/pki/cert_error_params.cc",
- "net/cert/pki/cert_errors.cc",
- "net/cert/pki/cert_issuer_source_static.cc",
- "net/cert/pki/certificate_policies.cc",
- "net/cert/pki/common_cert_errors.cc",
- "net/cert/pki/crl.cc",
- "net/cert/pki/extended_key_usage.cc",
- "net/cert/pki/general_names.cc",
- "net/cert/pki/name_constraints.cc",
- "net/cert/pki/ocsp.cc",
- "net/cert/pki/parse_certificate.cc",
- "net/cert/pki/parse_name.cc",
- "net/cert/pki/parsed_certificate.cc",
- "net/cert/pki/path_builder.cc",
- "net/cert/pki/revocation_util.cc",
- "net/cert/pki/signature_algorithm.cc",
- "net/cert/pki/simple_path_builder_delegate.cc",
- "net/cert/pki/string_util.cc",
- "net/cert/pki/trust_store.cc",
- "net/cert/pki/trust_store_collection.cc",
- "net/cert/pki/trust_store_in_memory.cc",
- "net/cert/pki/verify_certificate_chain.cc",
- "net/cert/pki/verify_name_match.cc",
- "net/cert/pki/verify_signed_data.cc",
- "net/cert/sct_status_flags.cc",
- "net/cert/signed_certificate_timestamp.cc",
- "net/cert/signed_certificate_timestamp_and_status.cc",
- "net/cert/signed_tree_head.cc",
- "net/cert/symantec_certs.cc",
- "net/cert/test_root_certs.cc",
- "net/cert/test_root_certs_android.cc",
- "net/cert/trial_comparison_cert_verifier_util.cc",
- "net/cert/x509_cert_types.cc",
- "net/cert/x509_certificate.cc",
- "net/cert/x509_certificate_net_log_param.cc",
- "net/cert/x509_util.cc",
- "net/cert/x509_util_android.cc",
- "net/cert_net/cert_net_fetcher_url_request.cc",
- "net/cookies/canonical_cookie.cc",
- "net/cookies/cookie_access_delegate.cc",
- "net/cookies/cookie_access_result.cc",
- "net/cookies/cookie_change_dispatcher.cc",
- "net/cookies/cookie_constants.cc",
- "net/cookies/cookie_deletion_info.cc",
- "net/cookies/cookie_inclusion_status.cc",
- "net/cookies/cookie_monster.cc",
- "net/cookies/cookie_monster_change_dispatcher.cc",
- "net/cookies/cookie_monster_netlog_params.cc",
- "net/cookies/cookie_options.cc",
- "net/cookies/cookie_partition_key.cc",
- "net/cookies/cookie_partition_key_collection.cc",
- "net/cookies/cookie_store.cc",
- "net/cookies/cookie_util.cc",
- "net/cookies/parsed_cookie.cc",
- "net/cookies/site_for_cookies.cc",
- "net/cookies/static_cookie_policy.cc",
- "net/der/encode_values.cc",
- "net/der/input.cc",
- "net/der/parse_values.cc",
- "net/der/parser.cc",
- "net/der/tag.cc",
- "net/disk_cache/backend_cleanup_tracker.cc",
- "net/disk_cache/blockfile/addr.cc",
- "net/disk_cache/blockfile/backend_impl.cc",
- "net/disk_cache/blockfile/bitmap.cc",
- "net/disk_cache/blockfile/block_files.cc",
- "net/disk_cache/blockfile/disk_format.cc",
- "net/disk_cache/blockfile/entry_impl.cc",
- "net/disk_cache/blockfile/eviction.cc",
- "net/disk_cache/blockfile/file.cc",
- "net/disk_cache/blockfile/file_lock.cc",
- "net/disk_cache/blockfile/file_posix.cc",
- "net/disk_cache/blockfile/in_flight_backend_io.cc",
- "net/disk_cache/blockfile/in_flight_io.cc",
- "net/disk_cache/blockfile/mapped_file.cc",
- "net/disk_cache/blockfile/rankings.cc",
- "net/disk_cache/blockfile/sparse_control.cc",
- "net/disk_cache/blockfile/stats.cc",
- "net/disk_cache/cache_util.cc",
- "net/disk_cache/cache_util_posix.cc",
- "net/disk_cache/disk_cache.cc",
- "net/disk_cache/memory/mem_backend_impl.cc",
- "net/disk_cache/memory/mem_entry_impl.cc",
- "net/disk_cache/net_log_parameters.cc",
- "net/disk_cache/simple/post_doom_waiter.cc",
- "net/disk_cache/simple/simple_backend_impl.cc",
- "net/disk_cache/simple/simple_entry_format.cc",
- "net/disk_cache/simple/simple_entry_impl.cc",
- "net/disk_cache/simple/simple_entry_operation.cc",
- "net/disk_cache/simple/simple_file_enumerator.cc",
- "net/disk_cache/simple/simple_file_tracker.cc",
- "net/disk_cache/simple/simple_index.cc",
- "net/disk_cache/simple/simple_index_file.cc",
- "net/disk_cache/simple/simple_net_log_parameters.cc",
- "net/disk_cache/simple/simple_synchronous_entry.cc",
- "net/disk_cache/simple/simple_util.cc",
- "net/disk_cache/simple/simple_util_posix.cc",
- "net/disk_cache/simple/simple_version_upgrade.cc",
- "net/filter/brotli_source_stream.cc",
- "net/filter/filter_source_stream.cc",
- "net/filter/gzip_header.cc",
- "net/filter/gzip_source_stream.cc",
- "net/filter/source_stream.cc",
- "net/first_party_sets/addition_overlaps_union_find.cc",
- "net/first_party_sets/first_party_set_entry.cc",
- "net/first_party_sets/first_party_set_metadata.cc",
- "net/first_party_sets/first_party_sets_cache_filter.cc",
- "net/first_party_sets/first_party_sets_context_config.cc",
- "net/first_party_sets/global_first_party_sets.cc",
- "net/first_party_sets/same_party_context.cc",
- "net/http/alternative_service.cc",
- "net/http/bidirectional_stream.cc",
- "net/http/bidirectional_stream_impl.cc",
- "net/http/bidirectional_stream_request_info.cc",
- "net/http/broken_alternative_services.cc",
- "net/http/http_auth.cc",
- "net/http/http_auth_cache.cc",
- "net/http/http_auth_challenge_tokenizer.cc",
- "net/http/http_auth_controller.cc",
- "net/http/http_auth_filter.cc",
- "net/http/http_auth_handler.cc",
- "net/http/http_auth_handler_basic.cc",
- "net/http/http_auth_handler_digest.cc",
- "net/http/http_auth_handler_factory.cc",
- "net/http/http_auth_handler_negotiate.cc",
- "net/http/http_auth_handler_ntlm.cc",
- "net/http/http_auth_handler_ntlm_portable.cc",
- "net/http/http_auth_multi_round_parse.cc",
- "net/http/http_auth_ntlm_mechanism.cc",
- "net/http/http_auth_preferences.cc",
- "net/http/http_auth_scheme.cc",
- "net/http/http_basic_state.cc",
- "net/http/http_basic_stream.cc",
- "net/http/http_byte_range.cc",
- "net/http/http_cache.cc",
- "net/http/http_cache_lookup_manager.cc",
- "net/http/http_cache_transaction.cc",
- "net/http/http_cache_writers.cc",
- "net/http/http_chunked_decoder.cc",
- "net/http/http_content_disposition.cc",
- "net/http/http_log_util.cc",
- "net/http/http_network_layer.cc",
- "net/http/http_network_session.cc",
- "net/http/http_network_session_peer.cc",
- "net/http/http_network_transaction.cc",
- "net/http/http_proxy_client_socket.cc",
- "net/http/http_proxy_connect_job.cc",
- "net/http/http_raw_request_headers.cc",
- "net/http/http_request_headers.cc",
- "net/http/http_request_info.cc",
- "net/http/http_response_body_drainer.cc",
- "net/http/http_response_headers.cc",
- "net/http/http_response_info.cc",
- "net/http/http_security_headers.cc",
- "net/http/http_server_properties.cc",
- "net/http/http_server_properties_manager.cc",
- "net/http/http_status_code.cc",
- "net/http/http_stream_factory.cc",
- "net/http/http_stream_factory_job.cc",
- "net/http/http_stream_factory_job_controller.cc",
- "net/http/http_stream_parser.cc",
- "net/http/http_stream_request.cc",
- "net/http/http_util.cc",
- "net/http/http_vary_data.cc",
- "net/http/partial_data.cc",
- "net/http/proxy_client_socket.cc",
- "net/http/proxy_fallback.cc",
- "net/http/transport_security_persister.cc",
- "net/http/transport_security_state_source.cc",
- "net/http/url_security_manager.cc",
- "net/http/url_security_manager_posix.cc",
- "net/http/webfonts_histogram.cc",
- "net/log/file_net_log_observer.cc",
- "net/log/net_log.cc",
- "net/log/net_log_capture_mode.cc",
- "net/log/net_log_entry.cc",
- "net/log/net_log_event_type.cc",
- "net/log/net_log_source.cc",
- "net/log/net_log_util.cc",
- "net/log/net_log_values.cc",
- "net/log/net_log_with_source.cc",
- "net/log/trace_net_log_observer.cc",
- "net/network_error_logging/network_error_logging_service.cc",
- "net/nqe/cached_network_quality.cc",
- "net/nqe/effective_connection_type.cc",
- "net/nqe/event_creator.cc",
- "net/nqe/network_id.cc",
- "net/nqe/network_qualities_prefs_manager.cc",
- "net/nqe/network_quality.cc",
- "net/nqe/network_quality_estimator.cc",
- "net/nqe/network_quality_estimator_params.cc",
- "net/nqe/network_quality_estimator_util.cc",
- "net/nqe/network_quality_observation.cc",
- "net/nqe/network_quality_store.cc",
- "net/nqe/observation_buffer.cc",
- "net/nqe/pref_names.cc",
- "net/nqe/socket_watcher.cc",
- "net/nqe/socket_watcher_factory.cc",
- "net/nqe/throughput_analyzer.cc",
- "net/ntlm/ntlm.cc",
- "net/ntlm/ntlm_buffer_reader.cc",
- "net/ntlm/ntlm_buffer_writer.cc",
- "net/ntlm/ntlm_client.cc",
- "net/ntlm/ntlm_constants.cc",
- "net/proxy_resolution/configured_proxy_resolution_request.cc",
- "net/proxy_resolution/configured_proxy_resolution_service.cc",
- "net/proxy_resolution/dhcp_pac_file_fetcher.cc",
- "net/proxy_resolution/multi_threaded_proxy_resolver.cc",
- "net/proxy_resolution/network_delegate_error_observer.cc",
- "net/proxy_resolution/pac_file_data.cc",
- "net/proxy_resolution/pac_file_decider.cc",
- "net/proxy_resolution/pac_file_fetcher.cc",
- "net/proxy_resolution/pac_file_fetcher_impl.cc",
- "net/proxy_resolution/polling_proxy_config_service.cc",
- "net/proxy_resolution/proxy_bypass_rules.cc",
- "net/proxy_resolution/proxy_config.cc",
- "net/proxy_resolution/proxy_config_service.cc",
- "net/proxy_resolution/proxy_config_service_android.cc",
- "net/proxy_resolution/proxy_config_service_fixed.cc",
- "net/proxy_resolution/proxy_config_with_annotation.cc",
- "net/proxy_resolution/proxy_info.cc",
- "net/proxy_resolution/proxy_list.cc",
- "net/proxy_resolution/proxy_resolver_factory.cc",
- "net/quic/bidirectional_stream_quic_impl.cc",
- "net/quic/crypto/proof_source_chromium.cc",
- "net/quic/crypto/proof_verifier_chromium.cc",
- "net/quic/dedicated_web_transport_http3_client.cc",
- "net/quic/network_connection.cc",
- "net/quic/platform/impl/quic_chromium_clock.cc",
- "net/quic/properties_based_quic_server_info.cc",
- "net/quic/quic_address_mismatch.cc",
- "net/quic/quic_chromium_alarm_factory.cc",
- "net/quic/quic_chromium_client_session.cc",
- "net/quic/quic_chromium_client_stream.cc",
- "net/quic/quic_chromium_connection_helper.cc",
- "net/quic/quic_chromium_packet_reader.cc",
- "net/quic/quic_chromium_packet_writer.cc",
- "net/quic/quic_clock_skew_detector.cc",
- "net/quic/quic_connection_logger.cc",
- "net/quic/quic_connectivity_monitor.cc",
- "net/quic/quic_context.cc",
- "net/quic/quic_crypto_client_config_handle.cc",
- "net/quic/quic_crypto_client_stream_factory.cc",
- "net/quic/quic_event_logger.cc",
- "net/quic/quic_http3_logger.cc",
- "net/quic/quic_http_stream.cc",
- "net/quic/quic_http_utils.cc",
- "net/quic/quic_proxy_client_socket.cc",
- "net/quic/quic_server_info.cc",
- "net/quic/quic_session_key.cc",
- "net/quic/quic_stream_factory.cc",
- "net/quic/set_quic_flag.cc",
- "net/quic/web_transport_client.cc",
- "net/quic/web_transport_error.cc",
- "net/reporting/reporting_browsing_data_remover.cc",
- "net/reporting/reporting_cache.cc",
- "net/reporting/reporting_cache_impl.cc",
- "net/reporting/reporting_cache_observer.cc",
- "net/reporting/reporting_context.cc",
- "net/reporting/reporting_delegate.cc",
- "net/reporting/reporting_delivery_agent.cc",
- "net/reporting/reporting_endpoint.cc",
- "net/reporting/reporting_endpoint_manager.cc",
- "net/reporting/reporting_garbage_collector.cc",
- "net/reporting/reporting_header_parser.cc",
- "net/reporting/reporting_network_change_observer.cc",
- "net/reporting/reporting_policy.cc",
- "net/reporting/reporting_report.cc",
- "net/reporting/reporting_service.cc",
- "net/reporting/reporting_uploader.cc",
- "net/socket/client_socket_factory.cc",
- "net/socket/client_socket_handle.cc",
- "net/socket/client_socket_pool.cc",
- "net/socket/client_socket_pool_manager.cc",
- "net/socket/client_socket_pool_manager_impl.cc",
- "net/socket/connect_job.cc",
- "net/socket/connect_job_factory.cc",
- "net/socket/network_binding_client_socket_factory.cc",
- "net/socket/next_proto.cc",
- "net/socket/server_socket.cc",
- "net/socket/socket.cc",
- "net/socket/socket_bio_adapter.cc",
- "net/socket/socket_descriptor.cc",
- "net/socket/socket_net_log_params.cc",
- "net/socket/socket_options.cc",
- "net/socket/socket_posix.cc",
- "net/socket/socket_tag.cc",
- "net/socket/socks5_client_socket.cc",
- "net/socket/socks_client_socket.cc",
- "net/socket/socks_connect_job.cc",
- "net/socket/ssl_client_socket.cc",
- "net/socket/ssl_client_socket_impl.cc",
- "net/socket/ssl_connect_job.cc",
- "net/socket/ssl_server_socket_impl.cc",
- "net/socket/stream_socket.cc",
- "net/socket/tcp_client_socket.cc",
- "net/socket/tcp_server_socket.cc",
- "net/socket/tcp_socket_posix.cc",
- "net/socket/transport_client_socket.cc",
- "net/socket/transport_client_socket_pool.cc",
- "net/socket/transport_connect_job.cc",
- "net/socket/transport_connect_sub_job.cc",
- "net/socket/udp_client_socket.cc",
- "net/socket/udp_net_log_parameters.cc",
- "net/socket/udp_server_socket.cc",
- "net/socket/udp_socket_global_limits.cc",
- "net/socket/udp_socket_posix.cc",
- "net/socket/unix_domain_client_socket_posix.cc",
- "net/socket/unix_domain_server_socket_posix.cc",
- "net/socket/websocket_endpoint_lock_manager.cc",
- "net/socket/websocket_transport_client_socket_pool.cc",
- "net/spdy/alps_decoder.cc",
- "net/spdy/bidirectional_stream_spdy_impl.cc",
- "net/spdy/buffered_spdy_framer.cc",
- "net/spdy/header_coalescer.cc",
- "net/spdy/http2_priority_dependencies.cc",
- "net/spdy/http2_push_promise_index.cc",
- "net/spdy/multiplexed_http_stream.cc",
- "net/spdy/multiplexed_session.cc",
- "net/spdy/spdy_buffer.cc",
- "net/spdy/spdy_buffer_producer.cc",
- "net/spdy/spdy_http_stream.cc",
- "net/spdy/spdy_http_utils.cc",
- "net/spdy/spdy_log_util.cc",
- "net/spdy/spdy_proxy_client_socket.cc",
- "net/spdy/spdy_read_queue.cc",
- "net/spdy/spdy_session.cc",
- "net/spdy/spdy_session_key.cc",
- "net/spdy/spdy_session_pool.cc",
- "net/spdy/spdy_stream.cc",
- "net/spdy/spdy_write_queue.cc",
- "net/ssl/cert_compression.cc",
- "net/ssl/client_cert_identity.cc",
- "net/ssl/openssl_ssl_util.cc",
- "net/ssl/ssl_cert_request_info.cc",
- "net/ssl/ssl_cipher_suite_names.cc",
- "net/ssl/ssl_client_auth_cache.cc",
- "net/ssl/ssl_client_session_cache.cc",
- "net/ssl/ssl_config.cc",
- "net/ssl/ssl_config_service.cc",
- "net/ssl/ssl_config_service_defaults.cc",
- "net/ssl/ssl_info.cc",
- "net/ssl/ssl_key_logger.cc",
- "net/ssl/ssl_key_logger_impl.cc",
- "net/ssl/ssl_platform_key_android.cc",
- "net/ssl/ssl_platform_key_util.cc",
- "net/ssl/ssl_private_key.cc",
- "net/ssl/ssl_server_config.cc",
- "net/ssl/threaded_ssl_private_key.cc",
- "net/url_request/redirect_info.cc",
- "net/url_request/redirect_util.cc",
- "net/url_request/report_sender.cc",
- "net/url_request/static_http_user_agent_settings.cc",
- "net/url_request/url_request.cc",
- "net/url_request/url_request_context.cc",
- "net/url_request/url_request_context_builder.cc",
- "net/url_request/url_request_context_getter.cc",
- "net/url_request/url_request_error_job.cc",
- "net/url_request/url_request_filter.cc",
- "net/url_request/url_request_http_job.cc",
- "net/url_request/url_request_interceptor.cc",
- "net/url_request/url_request_job.cc",
- "net/url_request/url_request_job_factory.cc",
- "net/url_request/url_request_netlog_params.cc",
- "net/url_request/url_request_redirect_job.cc",
- "net/url_request/url_request_throttler_entry.cc",
- "net/url_request/url_request_throttler_manager.cc",
- "net/url_request/view_cache_helper.cc",
- "net/url_request/websocket_handshake_userdata_key.cc",
- ],
- shared_libs: [
- "libandroid",
- "liblog",
- "libz",
- ],
- static_libs: [
- "cronet_aml_base_allocator_partition_allocator_partition_alloc",
- "cronet_aml_base_base",
- "cronet_aml_base_base_static",
- "cronet_aml_base_nodebug_assertion",
- "cronet_aml_base_third_party_double_conversion_double_conversion",
- "cronet_aml_base_third_party_dynamic_annotations_dynamic_annotations",
- "cronet_aml_crypto_crypto",
- "cronet_aml_net_dns_dns",
- "cronet_aml_net_dns_public_public",
- "cronet_aml_net_http_transport_security_state_generated_files",
- "cronet_aml_net_net_deps",
- "cronet_aml_net_net_public_deps",
- "cronet_aml_net_preload_decoder",
- "cronet_aml_net_third_party_quiche_quiche",
- "cronet_aml_net_traffic_annotation_traffic_annotation",
- "cronet_aml_net_uri_template",
- "cronet_aml_third_party_abseil_cpp_absl_base_base",
- "cronet_aml_third_party_abseil_cpp_absl_base_log_severity",
- "cronet_aml_third_party_abseil_cpp_absl_base_malloc_internal",
- "cronet_aml_third_party_abseil_cpp_absl_base_raw_logging_internal",
- "cronet_aml_third_party_abseil_cpp_absl_base_spinlock_wait",
- "cronet_aml_third_party_abseil_cpp_absl_base_strerror",
- "cronet_aml_third_party_abseil_cpp_absl_base_throw_delegate",
- "cronet_aml_third_party_abseil_cpp_absl_container_hashtablez_sampler",
- "cronet_aml_third_party_abseil_cpp_absl_container_raw_hash_set",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_debugging_internal",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_demangle_internal",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_examine_stack",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_failure_signal_handler",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_stacktrace",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_symbolize",
- "cronet_aml_third_party_abseil_cpp_absl_hash_city",
- "cronet_aml_third_party_abseil_cpp_absl_hash_hash",
- "cronet_aml_third_party_abseil_cpp_absl_hash_low_level_hash",
- "cronet_aml_third_party_abseil_cpp_absl_numeric_int128",
- "cronet_aml_third_party_abseil_cpp_absl_profiling_exponential_biased",
- "cronet_aml_third_party_abseil_cpp_absl_random_distributions",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_platform",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_pool_urbg",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_hwaes",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_hwaes_impl",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_slow",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_seed_material",
- "cronet_aml_third_party_abseil_cpp_absl_random_seed_gen_exception",
- "cronet_aml_third_party_abseil_cpp_absl_random_seed_sequences",
- "cronet_aml_third_party_abseil_cpp_absl_status_status",
- "cronet_aml_third_party_abseil_cpp_absl_status_statusor",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cord",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cord_internal",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_functions",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_handle",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_info",
- "cronet_aml_third_party_abseil_cpp_absl_strings_internal",
- "cronet_aml_third_party_abseil_cpp_absl_strings_str_format_internal",
- "cronet_aml_third_party_abseil_cpp_absl_strings_strings",
- "cronet_aml_third_party_abseil_cpp_absl_synchronization_graphcycles_internal",
- "cronet_aml_third_party_abseil_cpp_absl_synchronization_synchronization",
- "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_civil_time",
- "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_time_zone",
- "cronet_aml_third_party_abseil_cpp_absl_time_time",
- "cronet_aml_third_party_abseil_cpp_absl_types_bad_optional_access",
- "cronet_aml_third_party_abseil_cpp_absl_types_bad_variant_access",
- "cronet_aml_third_party_android_ndk_cpu_features",
- "cronet_aml_third_party_ashmem_ashmem",
- "cronet_aml_third_party_boringssl_boringssl",
- "cronet_aml_third_party_boringssl_boringssl_asm",
- "cronet_aml_third_party_brotli_common",
- "cronet_aml_third_party_brotli_dec",
- "cronet_aml_third_party_icu_icui18n",
- "cronet_aml_third_party_icu_icuuc_private",
- "cronet_aml_third_party_libevent_libevent",
- "cronet_aml_third_party_modp_b64_modp_b64",
- "cronet_aml_third_party_protobuf_protobuf_lite",
- "cronet_aml_url_url",
- ],
- generated_headers: [
- "cronet_aml_build_chromeos_buildflags",
- "cronet_aml_net_ios_cronet_buildflags",
- ],
- export_generated_headers: [
- "cronet_aml_build_chromeos_buildflags",
- "cronet_aml_net_ios_cronet_buildflags",
- ],
- export_static_lib_headers: [
- "cronet_aml_crypto_crypto",
- "cronet_aml_net_third_party_quiche_quiche",
- ],
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DENABLE_BUILT_IN_DNS",
- "-DGOOGLE_PROTOBUF_INTERNAL_DONATE_STEAL_INLINE=0",
- "-DGOOGLE_PROTOBUF_NO_RTTI",
- "-DGOOGLE_PROTOBUF_NO_STATIC_INITIALIZER",
- "-DHAVE_PTHREAD",
- "-DHAVE_SYS_UIO_H",
- "-DNDEBUG",
- "-DNET_IMPLEMENTATION",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_FORTIFY_SOURCE=2",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D__STDC_CONSTANT_MACROS",
- "-D__STDC_FORMAT_MACROS",
- "-Oz",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "net/third_party/quiche/overrides/",
- "net/third_party/quiche/src/",
- "net/third_party/quiche/src/quiche/common/platform/default/",
- "third_party/abseil-cpp/",
- "third_party/boringssl/src/include/",
- "third_party/brotli/include/",
- "third_party/protobuf/src/",
- ],
- cpp_std: "c++17",
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- "-Wl,--script,external/cronet/base/android/library_loader/anchor_functions.lds",
- "-Wl,-wrap,asprintf",
- "-Wl,-wrap,calloc",
- "-Wl,-wrap,free",
- "-Wl,-wrap,getcwd",
- "-Wl,-wrap,malloc",
- "-Wl,-wrap,malloc_usable_size",
- "-Wl,-wrap,memalign",
- "-Wl,-wrap,posix_memalign",
- "-Wl,-wrap,pvalloc",
- "-Wl,-wrap,realloc",
- "-Wl,-wrap,realpath",
- "-Wl,-wrap,strdup",
- "-Wl,-wrap,strndup",
- "-Wl,-wrap,valloc",
- "-Wl,-wrap,vasprintf",
- ],
- target: {
- android_arm: {
- srcs: [
- "net/disk_cache/blockfile/mapped_file_bypass_mmap_posix.cc",
- ],
- cflags: [
- "-fstack-protector",
- ],
- },
- android_arm64: {
- srcs: [
- "net/disk_cache/blockfile/mapped_file_bypass_mmap_posix.cc",
- ],
- cflags: [
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- srcs: [
- "net/disk_cache/blockfile/mapped_file_posix.cc",
- ],
- cflags: [
- "-msse3",
- ],
- },
- android_x86_64: {
- srcs: [
- "net/disk_cache/blockfile/mapped_file_bypass_mmap_posix.cc",
- ],
- cflags: [
- "-fstack-protector",
- "-msse3",
- ],
- },
- },
-}
-
-// GN: //net:net__testing
-cc_library_static {
- name: "cronet_aml_net_net__testing",
- srcs: [
- "net/android/android_http_util.cc",
- "net/android/cert_verify_result_android.cc",
- "net/android/gurl_utils.cc",
- "net/android/http_auth_negotiate_android.cc",
- "net/android/keystore.cc",
- "net/android/network_change_notifier_android.cc",
- "net/android/network_change_notifier_delegate_android.cc",
- "net/android/network_change_notifier_factory_android.cc",
- "net/android/network_library.cc",
- "net/android/radio_activity_tracker.cc",
- "net/android/traffic_stats.cc",
- "net/base/address_family.cc",
- "net/base/address_list.cc",
- "net/base/address_tracker_linux.cc",
- "net/base/auth.cc",
- "net/base/backoff_entry.cc",
- "net/base/backoff_entry_serializer.cc",
- "net/base/cache_metrics.cc",
- "net/base/chunked_upload_data_stream.cc",
- "net/base/connection_endpoint_metadata.cc",
- "net/base/data_url.cc",
- "net/base/datagram_buffer.cc",
- "net/base/elements_upload_data_stream.cc",
- "net/base/features.cc",
- "net/base/file_stream.cc",
- "net/base/file_stream_context.cc",
- "net/base/file_stream_context_posix.cc",
- "net/base/filename_util.cc",
- "net/base/filename_util_internal.cc",
- "net/base/hash_value.cc",
- "net/base/hex_utils.cc",
- "net/base/host_mapping_rules.cc",
- "net/base/host_port_pair.cc",
- "net/base/io_buffer.cc",
- "net/base/ip_address.cc",
- "net/base/ip_endpoint.cc",
- "net/base/isolation_info.cc",
- "net/base/load_timing_info.cc",
- "net/base/logging_network_change_observer.cc",
- "net/base/lookup_string_in_fixed_set.cc",
- "net/base/mime_sniffer.cc",
- "net/base/mime_util.cc",
- "net/base/net_errors.cc",
- "net/base/net_errors_posix.cc",
- "net/base/net_module.cc",
- "net/base/net_string_util_icu_alternatives_android.cc",
- "net/base/network_activity_monitor.cc",
- "net/base/network_anonymization_key.cc",
- "net/base/network_change_notifier.cc",
- "net/base/network_change_notifier_posix.cc",
- "net/base/network_delegate.cc",
- "net/base/network_delegate_impl.cc",
- "net/base/network_interfaces.cc",
- "net/base/network_interfaces_getifaddrs.cc",
- "net/base/network_interfaces_getifaddrs_android.cc",
- "net/base/network_interfaces_linux.cc",
- "net/base/network_interfaces_posix.cc",
- "net/base/network_isolation_key.cc",
- "net/base/parse_number.cc",
- "net/base/platform_mime_util_linux.cc",
- "net/base/port_util.cc",
- "net/base/prioritized_dispatcher.cc",
- "net/base/prioritized_task_runner.cc",
- "net/base/privacy_mode.cc",
- "net/base/proxy_server.cc",
- "net/base/proxy_string_util.cc",
- "net/base/registry_controlled_domains/registry_controlled_domain.cc",
- "net/base/request_priority.cc",
- "net/base/scheme_host_port_matcher.cc",
- "net/base/scheme_host_port_matcher_rule.cc",
- "net/base/schemeful_site.cc",
- "net/base/sockaddr_storage.cc",
- "net/base/sockaddr_util_posix.cc",
- "net/base/transport_info.cc",
- "net/base/upload_bytes_element_reader.cc",
- "net/base/upload_data_stream.cc",
- "net/base/upload_element_reader.cc",
- "net/base/upload_file_element_reader.cc",
- "net/base/url_util.cc",
- "net/cert/asn1_util.cc",
- "net/cert/caching_cert_verifier.cc",
- "net/cert/cert_and_ct_verifier.cc",
- "net/cert/cert_database.cc",
- "net/cert/cert_status_flags.cc",
- "net/cert/cert_verifier.cc",
- "net/cert/cert_verify_proc.cc",
- "net/cert/cert_verify_proc_android.cc",
- "net/cert/cert_verify_proc_builtin.cc",
- "net/cert/cert_verify_result.cc",
- "net/cert/coalescing_cert_verifier.cc",
- "net/cert/crl_set.cc",
- "net/cert/ct_log_response_parser.cc",
- "net/cert/ct_log_verifier.cc",
- "net/cert/ct_log_verifier_util.cc",
- "net/cert/ct_objects_extractor.cc",
- "net/cert/ct_policy_enforcer.cc",
- "net/cert/ct_sct_to_string.cc",
- "net/cert/ct_serialization.cc",
- "net/cert/ct_signed_certificate_timestamp_log_param.cc",
- "net/cert/do_nothing_ct_verifier.cc",
- "net/cert/ev_root_ca_metadata.cc",
- "net/cert/internal/cert_issuer_source_aia.cc",
- "net/cert/internal/revocation_checker.cc",
- "net/cert/internal/system_trust_store.cc",
- "net/cert/known_roots.cc",
- "net/cert/merkle_audit_proof.cc",
- "net/cert/merkle_consistency_proof.cc",
- "net/cert/merkle_tree_leaf.cc",
- "net/cert/multi_log_ct_verifier.cc",
- "net/cert/multi_threaded_cert_verifier.cc",
- "net/cert/ocsp_verify_result.cc",
- "net/cert/pem.cc",
- "net/cert/pki/cert_error_id.cc",
- "net/cert/pki/cert_error_params.cc",
- "net/cert/pki/cert_errors.cc",
- "net/cert/pki/cert_issuer_source_static.cc",
- "net/cert/pki/certificate_policies.cc",
- "net/cert/pki/common_cert_errors.cc",
- "net/cert/pki/crl.cc",
- "net/cert/pki/extended_key_usage.cc",
- "net/cert/pki/general_names.cc",
- "net/cert/pki/name_constraints.cc",
- "net/cert/pki/ocsp.cc",
- "net/cert/pki/parse_certificate.cc",
- "net/cert/pki/parse_name.cc",
- "net/cert/pki/parsed_certificate.cc",
- "net/cert/pki/path_builder.cc",
- "net/cert/pki/revocation_util.cc",
- "net/cert/pki/signature_algorithm.cc",
- "net/cert/pki/simple_path_builder_delegate.cc",
- "net/cert/pki/string_util.cc",
- "net/cert/pki/trust_store.cc",
- "net/cert/pki/trust_store_collection.cc",
- "net/cert/pki/trust_store_in_memory.cc",
- "net/cert/pki/verify_certificate_chain.cc",
- "net/cert/pki/verify_name_match.cc",
- "net/cert/pki/verify_signed_data.cc",
- "net/cert/sct_status_flags.cc",
- "net/cert/signed_certificate_timestamp.cc",
- "net/cert/signed_certificate_timestamp_and_status.cc",
- "net/cert/signed_tree_head.cc",
- "net/cert/symantec_certs.cc",
- "net/cert/test_root_certs.cc",
- "net/cert/test_root_certs_android.cc",
- "net/cert/trial_comparison_cert_verifier_util.cc",
- "net/cert/x509_cert_types.cc",
- "net/cert/x509_certificate.cc",
- "net/cert/x509_certificate_net_log_param.cc",
- "net/cert/x509_util.cc",
- "net/cert/x509_util_android.cc",
- "net/cert_net/cert_net_fetcher_url_request.cc",
- "net/cookies/canonical_cookie.cc",
- "net/cookies/cookie_access_delegate.cc",
- "net/cookies/cookie_access_result.cc",
- "net/cookies/cookie_change_dispatcher.cc",
- "net/cookies/cookie_constants.cc",
- "net/cookies/cookie_deletion_info.cc",
- "net/cookies/cookie_inclusion_status.cc",
- "net/cookies/cookie_monster.cc",
- "net/cookies/cookie_monster_change_dispatcher.cc",
- "net/cookies/cookie_monster_netlog_params.cc",
- "net/cookies/cookie_options.cc",
- "net/cookies/cookie_partition_key.cc",
- "net/cookies/cookie_partition_key_collection.cc",
- "net/cookies/cookie_store.cc",
- "net/cookies/cookie_util.cc",
- "net/cookies/parsed_cookie.cc",
- "net/cookies/site_for_cookies.cc",
- "net/cookies/static_cookie_policy.cc",
- "net/der/encode_values.cc",
- "net/der/input.cc",
- "net/der/parse_values.cc",
- "net/der/parser.cc",
- "net/der/tag.cc",
- "net/disk_cache/backend_cleanup_tracker.cc",
- "net/disk_cache/blockfile/addr.cc",
- "net/disk_cache/blockfile/backend_impl.cc",
- "net/disk_cache/blockfile/bitmap.cc",
- "net/disk_cache/blockfile/block_files.cc",
- "net/disk_cache/blockfile/disk_format.cc",
- "net/disk_cache/blockfile/entry_impl.cc",
- "net/disk_cache/blockfile/eviction.cc",
- "net/disk_cache/blockfile/file.cc",
- "net/disk_cache/blockfile/file_lock.cc",
- "net/disk_cache/blockfile/file_posix.cc",
- "net/disk_cache/blockfile/in_flight_backend_io.cc",
- "net/disk_cache/blockfile/in_flight_io.cc",
- "net/disk_cache/blockfile/mapped_file.cc",
- "net/disk_cache/blockfile/rankings.cc",
- "net/disk_cache/blockfile/sparse_control.cc",
- "net/disk_cache/blockfile/stats.cc",
- "net/disk_cache/cache_util.cc",
- "net/disk_cache/cache_util_posix.cc",
- "net/disk_cache/disk_cache.cc",
- "net/disk_cache/memory/mem_backend_impl.cc",
- "net/disk_cache/memory/mem_entry_impl.cc",
- "net/disk_cache/net_log_parameters.cc",
- "net/disk_cache/simple/post_doom_waiter.cc",
- "net/disk_cache/simple/simple_backend_impl.cc",
- "net/disk_cache/simple/simple_entry_format.cc",
- "net/disk_cache/simple/simple_entry_impl.cc",
- "net/disk_cache/simple/simple_entry_operation.cc",
- "net/disk_cache/simple/simple_file_enumerator.cc",
- "net/disk_cache/simple/simple_file_tracker.cc",
- "net/disk_cache/simple/simple_index.cc",
- "net/disk_cache/simple/simple_index_file.cc",
- "net/disk_cache/simple/simple_net_log_parameters.cc",
- "net/disk_cache/simple/simple_synchronous_entry.cc",
- "net/disk_cache/simple/simple_util.cc",
- "net/disk_cache/simple/simple_util_posix.cc",
- "net/disk_cache/simple/simple_version_upgrade.cc",
- "net/filter/brotli_source_stream.cc",
- "net/filter/filter_source_stream.cc",
- "net/filter/gzip_header.cc",
- "net/filter/gzip_source_stream.cc",
- "net/filter/source_stream.cc",
- "net/first_party_sets/addition_overlaps_union_find.cc",
- "net/first_party_sets/first_party_set_entry.cc",
- "net/first_party_sets/first_party_set_metadata.cc",
- "net/first_party_sets/first_party_sets_cache_filter.cc",
- "net/first_party_sets/first_party_sets_context_config.cc",
- "net/first_party_sets/global_first_party_sets.cc",
- "net/first_party_sets/same_party_context.cc",
- "net/http/alternative_service.cc",
- "net/http/bidirectional_stream.cc",
- "net/http/bidirectional_stream_impl.cc",
- "net/http/bidirectional_stream_request_info.cc",
- "net/http/broken_alternative_services.cc",
- "net/http/http_auth.cc",
- "net/http/http_auth_cache.cc",
- "net/http/http_auth_challenge_tokenizer.cc",
- "net/http/http_auth_controller.cc",
- "net/http/http_auth_filter.cc",
- "net/http/http_auth_handler.cc",
- "net/http/http_auth_handler_basic.cc",
- "net/http/http_auth_handler_digest.cc",
- "net/http/http_auth_handler_factory.cc",
- "net/http/http_auth_handler_negotiate.cc",
- "net/http/http_auth_handler_ntlm.cc",
- "net/http/http_auth_handler_ntlm_portable.cc",
- "net/http/http_auth_multi_round_parse.cc",
- "net/http/http_auth_ntlm_mechanism.cc",
- "net/http/http_auth_preferences.cc",
- "net/http/http_auth_scheme.cc",
- "net/http/http_basic_state.cc",
- "net/http/http_basic_stream.cc",
- "net/http/http_byte_range.cc",
- "net/http/http_cache.cc",
- "net/http/http_cache_lookup_manager.cc",
- "net/http/http_cache_transaction.cc",
- "net/http/http_cache_writers.cc",
- "net/http/http_chunked_decoder.cc",
- "net/http/http_content_disposition.cc",
- "net/http/http_log_util.cc",
- "net/http/http_network_layer.cc",
- "net/http/http_network_session.cc",
- "net/http/http_network_session_peer.cc",
- "net/http/http_network_transaction.cc",
- "net/http/http_proxy_client_socket.cc",
- "net/http/http_proxy_connect_job.cc",
- "net/http/http_raw_request_headers.cc",
- "net/http/http_request_headers.cc",
- "net/http/http_request_info.cc",
- "net/http/http_response_body_drainer.cc",
- "net/http/http_response_headers.cc",
- "net/http/http_response_info.cc",
- "net/http/http_security_headers.cc",
- "net/http/http_server_properties.cc",
- "net/http/http_server_properties_manager.cc",
- "net/http/http_status_code.cc",
- "net/http/http_stream_factory.cc",
- "net/http/http_stream_factory_job.cc",
- "net/http/http_stream_factory_job_controller.cc",
- "net/http/http_stream_parser.cc",
- "net/http/http_stream_request.cc",
- "net/http/http_util.cc",
- "net/http/http_vary_data.cc",
- "net/http/partial_data.cc",
- "net/http/proxy_client_socket.cc",
- "net/http/proxy_fallback.cc",
- "net/http/transport_security_persister.cc",
- "net/http/transport_security_state_source.cc",
- "net/http/url_security_manager.cc",
- "net/http/url_security_manager_posix.cc",
- "net/http/webfonts_histogram.cc",
- "net/log/file_net_log_observer.cc",
- "net/log/net_log.cc",
- "net/log/net_log_capture_mode.cc",
- "net/log/net_log_entry.cc",
- "net/log/net_log_event_type.cc",
- "net/log/net_log_source.cc",
- "net/log/net_log_util.cc",
- "net/log/net_log_values.cc",
- "net/log/net_log_with_source.cc",
- "net/log/trace_net_log_observer.cc",
- "net/network_error_logging/network_error_logging_service.cc",
- "net/nqe/cached_network_quality.cc",
- "net/nqe/effective_connection_type.cc",
- "net/nqe/event_creator.cc",
- "net/nqe/network_id.cc",
- "net/nqe/network_qualities_prefs_manager.cc",
- "net/nqe/network_quality.cc",
- "net/nqe/network_quality_estimator.cc",
- "net/nqe/network_quality_estimator_params.cc",
- "net/nqe/network_quality_estimator_util.cc",
- "net/nqe/network_quality_observation.cc",
- "net/nqe/network_quality_store.cc",
- "net/nqe/observation_buffer.cc",
- "net/nqe/pref_names.cc",
- "net/nqe/socket_watcher.cc",
- "net/nqe/socket_watcher_factory.cc",
- "net/nqe/throughput_analyzer.cc",
- "net/ntlm/ntlm.cc",
- "net/ntlm/ntlm_buffer_reader.cc",
- "net/ntlm/ntlm_buffer_writer.cc",
- "net/ntlm/ntlm_client.cc",
- "net/ntlm/ntlm_constants.cc",
- "net/proxy_resolution/configured_proxy_resolution_request.cc",
- "net/proxy_resolution/configured_proxy_resolution_service.cc",
- "net/proxy_resolution/dhcp_pac_file_fetcher.cc",
- "net/proxy_resolution/multi_threaded_proxy_resolver.cc",
- "net/proxy_resolution/network_delegate_error_observer.cc",
- "net/proxy_resolution/pac_file_data.cc",
- "net/proxy_resolution/pac_file_decider.cc",
- "net/proxy_resolution/pac_file_fetcher.cc",
- "net/proxy_resolution/pac_file_fetcher_impl.cc",
- "net/proxy_resolution/polling_proxy_config_service.cc",
- "net/proxy_resolution/proxy_bypass_rules.cc",
- "net/proxy_resolution/proxy_config.cc",
- "net/proxy_resolution/proxy_config_service.cc",
- "net/proxy_resolution/proxy_config_service_android.cc",
- "net/proxy_resolution/proxy_config_service_fixed.cc",
- "net/proxy_resolution/proxy_config_with_annotation.cc",
- "net/proxy_resolution/proxy_info.cc",
- "net/proxy_resolution/proxy_list.cc",
- "net/proxy_resolution/proxy_resolver_factory.cc",
- "net/quic/bidirectional_stream_quic_impl.cc",
- "net/quic/crypto/proof_source_chromium.cc",
- "net/quic/crypto/proof_verifier_chromium.cc",
- "net/quic/dedicated_web_transport_http3_client.cc",
- "net/quic/network_connection.cc",
- "net/quic/platform/impl/quic_chromium_clock.cc",
- "net/quic/properties_based_quic_server_info.cc",
- "net/quic/quic_address_mismatch.cc",
- "net/quic/quic_chromium_alarm_factory.cc",
- "net/quic/quic_chromium_client_session.cc",
- "net/quic/quic_chromium_client_stream.cc",
- "net/quic/quic_chromium_connection_helper.cc",
- "net/quic/quic_chromium_packet_reader.cc",
- "net/quic/quic_chromium_packet_writer.cc",
- "net/quic/quic_clock_skew_detector.cc",
- "net/quic/quic_connection_logger.cc",
- "net/quic/quic_connectivity_monitor.cc",
- "net/quic/quic_context.cc",
- "net/quic/quic_crypto_client_config_handle.cc",
- "net/quic/quic_crypto_client_stream_factory.cc",
- "net/quic/quic_event_logger.cc",
- "net/quic/quic_http3_logger.cc",
- "net/quic/quic_http_stream.cc",
- "net/quic/quic_http_utils.cc",
- "net/quic/quic_proxy_client_socket.cc",
- "net/quic/quic_server_info.cc",
- "net/quic/quic_session_key.cc",
- "net/quic/quic_stream_factory.cc",
- "net/quic/set_quic_flag.cc",
- "net/quic/web_transport_client.cc",
- "net/quic/web_transport_error.cc",
- "net/reporting/reporting_browsing_data_remover.cc",
- "net/reporting/reporting_cache.cc",
- "net/reporting/reporting_cache_impl.cc",
- "net/reporting/reporting_cache_observer.cc",
- "net/reporting/reporting_context.cc",
- "net/reporting/reporting_delegate.cc",
- "net/reporting/reporting_delivery_agent.cc",
- "net/reporting/reporting_endpoint.cc",
- "net/reporting/reporting_endpoint_manager.cc",
- "net/reporting/reporting_garbage_collector.cc",
- "net/reporting/reporting_header_parser.cc",
- "net/reporting/reporting_network_change_observer.cc",
- "net/reporting/reporting_policy.cc",
- "net/reporting/reporting_report.cc",
- "net/reporting/reporting_service.cc",
- "net/reporting/reporting_uploader.cc",
- "net/socket/client_socket_factory.cc",
- "net/socket/client_socket_handle.cc",
- "net/socket/client_socket_pool.cc",
- "net/socket/client_socket_pool_manager.cc",
- "net/socket/client_socket_pool_manager_impl.cc",
- "net/socket/connect_job.cc",
- "net/socket/connect_job_factory.cc",
- "net/socket/network_binding_client_socket_factory.cc",
- "net/socket/next_proto.cc",
- "net/socket/server_socket.cc",
- "net/socket/socket.cc",
- "net/socket/socket_bio_adapter.cc",
- "net/socket/socket_descriptor.cc",
- "net/socket/socket_net_log_params.cc",
- "net/socket/socket_options.cc",
- "net/socket/socket_posix.cc",
- "net/socket/socket_tag.cc",
- "net/socket/socks5_client_socket.cc",
- "net/socket/socks_client_socket.cc",
- "net/socket/socks_connect_job.cc",
- "net/socket/ssl_client_socket.cc",
- "net/socket/ssl_client_socket_impl.cc",
- "net/socket/ssl_connect_job.cc",
- "net/socket/ssl_server_socket_impl.cc",
- "net/socket/stream_socket.cc",
- "net/socket/tcp_client_socket.cc",
- "net/socket/tcp_server_socket.cc",
- "net/socket/tcp_socket_posix.cc",
- "net/socket/transport_client_socket.cc",
- "net/socket/transport_client_socket_pool.cc",
- "net/socket/transport_connect_job.cc",
- "net/socket/transport_connect_sub_job.cc",
- "net/socket/udp_client_socket.cc",
- "net/socket/udp_net_log_parameters.cc",
- "net/socket/udp_server_socket.cc",
- "net/socket/udp_socket_global_limits.cc",
- "net/socket/udp_socket_posix.cc",
- "net/socket/unix_domain_client_socket_posix.cc",
- "net/socket/unix_domain_server_socket_posix.cc",
- "net/socket/websocket_endpoint_lock_manager.cc",
- "net/socket/websocket_transport_client_socket_pool.cc",
- "net/spdy/alps_decoder.cc",
- "net/spdy/bidirectional_stream_spdy_impl.cc",
- "net/spdy/buffered_spdy_framer.cc",
- "net/spdy/header_coalescer.cc",
- "net/spdy/http2_priority_dependencies.cc",
- "net/spdy/http2_push_promise_index.cc",
- "net/spdy/multiplexed_http_stream.cc",
- "net/spdy/multiplexed_session.cc",
- "net/spdy/spdy_buffer.cc",
- "net/spdy/spdy_buffer_producer.cc",
- "net/spdy/spdy_http_stream.cc",
- "net/spdy/spdy_http_utils.cc",
- "net/spdy/spdy_log_util.cc",
- "net/spdy/spdy_proxy_client_socket.cc",
- "net/spdy/spdy_read_queue.cc",
- "net/spdy/spdy_session.cc",
- "net/spdy/spdy_session_key.cc",
- "net/spdy/spdy_session_pool.cc",
- "net/spdy/spdy_stream.cc",
- "net/spdy/spdy_write_queue.cc",
- "net/ssl/cert_compression.cc",
- "net/ssl/client_cert_identity.cc",
- "net/ssl/openssl_ssl_util.cc",
- "net/ssl/ssl_cert_request_info.cc",
- "net/ssl/ssl_cipher_suite_names.cc",
- "net/ssl/ssl_client_auth_cache.cc",
- "net/ssl/ssl_client_session_cache.cc",
- "net/ssl/ssl_config.cc",
- "net/ssl/ssl_config_service.cc",
- "net/ssl/ssl_config_service_defaults.cc",
- "net/ssl/ssl_info.cc",
- "net/ssl/ssl_key_logger.cc",
- "net/ssl/ssl_key_logger_impl.cc",
- "net/ssl/ssl_platform_key_android.cc",
- "net/ssl/ssl_platform_key_util.cc",
- "net/ssl/ssl_private_key.cc",
- "net/ssl/ssl_server_config.cc",
- "net/ssl/threaded_ssl_private_key.cc",
- "net/url_request/redirect_info.cc",
- "net/url_request/redirect_util.cc",
- "net/url_request/report_sender.cc",
- "net/url_request/static_http_user_agent_settings.cc",
- "net/url_request/url_request.cc",
- "net/url_request/url_request_context.cc",
- "net/url_request/url_request_context_builder.cc",
- "net/url_request/url_request_context_getter.cc",
- "net/url_request/url_request_error_job.cc",
- "net/url_request/url_request_filter.cc",
- "net/url_request/url_request_http_job.cc",
- "net/url_request/url_request_interceptor.cc",
- "net/url_request/url_request_job.cc",
- "net/url_request/url_request_job_factory.cc",
- "net/url_request/url_request_netlog_params.cc",
- "net/url_request/url_request_redirect_job.cc",
- "net/url_request/url_request_throttler_entry.cc",
- "net/url_request/url_request_throttler_manager.cc",
- "net/url_request/view_cache_helper.cc",
- "net/url_request/websocket_handshake_userdata_key.cc",
- ],
- shared_libs: [
- "libandroid",
- "liblog",
- "libz",
- ],
- static_libs: [
- "cronet_aml_base_allocator_partition_allocator_partition_alloc__testing",
- "cronet_aml_base_base__testing",
- "cronet_aml_base_base_static__testing",
- "cronet_aml_base_nodebug_assertion__testing",
- "cronet_aml_base_third_party_double_conversion_double_conversion__testing",
- "cronet_aml_base_third_party_dynamic_annotations_dynamic_annotations__testing",
- "cronet_aml_crypto_crypto__testing",
- "cronet_aml_net_dns_dns__testing",
- "cronet_aml_net_dns_public_public__testing",
- "cronet_aml_net_http_transport_security_state_generated_files__testing",
- "cronet_aml_net_net_deps__testing",
- "cronet_aml_net_net_public_deps__testing",
- "cronet_aml_net_preload_decoder__testing",
- "cronet_aml_net_third_party_quiche_quiche__testing",
- "cronet_aml_net_traffic_annotation_traffic_annotation__testing",
- "cronet_aml_net_uri_template__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_base__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_log_severity__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_malloc_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_raw_logging_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_spinlock_wait__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_strerror__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_throw_delegate__testing",
- "cronet_aml_third_party_abseil_cpp_absl_container_hashtablez_sampler__testing",
- "cronet_aml_third_party_abseil_cpp_absl_container_raw_hash_set__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_debugging_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_demangle_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_examine_stack__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_failure_signal_handler__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_stacktrace__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_symbolize__testing",
- "cronet_aml_third_party_abseil_cpp_absl_hash_city__testing",
- "cronet_aml_third_party_abseil_cpp_absl_hash_hash__testing",
- "cronet_aml_third_party_abseil_cpp_absl_hash_low_level_hash__testing",
- "cronet_aml_third_party_abseil_cpp_absl_numeric_int128__testing",
- "cronet_aml_third_party_abseil_cpp_absl_profiling_exponential_biased__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_distributions__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_platform__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_pool_urbg__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_hwaes__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_hwaes_impl__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_slow__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_seed_material__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_seed_gen_exception__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_seed_sequences__testing",
- "cronet_aml_third_party_abseil_cpp_absl_status_status__testing",
- "cronet_aml_third_party_abseil_cpp_absl_status_statusor__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cord__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cord_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_functions__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_handle__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_info__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_str_format_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_strings__testing",
- "cronet_aml_third_party_abseil_cpp_absl_synchronization_graphcycles_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_synchronization_synchronization__testing",
- "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_civil_time__testing",
- "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_time_zone__testing",
- "cronet_aml_third_party_abseil_cpp_absl_time_time__testing",
- "cronet_aml_third_party_abseil_cpp_absl_types_bad_optional_access__testing",
- "cronet_aml_third_party_abseil_cpp_absl_types_bad_variant_access__testing",
- "cronet_aml_third_party_android_ndk_cpu_features__testing",
- "cronet_aml_third_party_ashmem_ashmem__testing",
- "cronet_aml_third_party_boringssl_boringssl__testing",
- "cronet_aml_third_party_boringssl_boringssl_asm__testing",
- "cronet_aml_third_party_brotli_common__testing",
- "cronet_aml_third_party_brotli_dec__testing",
- "cronet_aml_third_party_icu_icui18n__testing",
- "cronet_aml_third_party_icu_icuuc_private__testing",
- "cronet_aml_third_party_libevent_libevent__testing",
- "cronet_aml_third_party_modp_b64_modp_b64__testing",
- "cronet_aml_third_party_protobuf_protobuf_lite__testing",
- "cronet_aml_url_url__testing",
- ],
- generated_headers: [
- "cronet_aml_build_chromeos_buildflags__testing",
- "cronet_aml_net_ios_cronet_buildflags__testing",
- ],
- export_generated_headers: [
- "cronet_aml_build_chromeos_buildflags__testing",
- "cronet_aml_net_ios_cronet_buildflags__testing",
- ],
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DENABLE_BUILT_IN_DNS",
- "-DGOOGLE_PROTOBUF_INTERNAL_DONATE_STEAL_INLINE=0",
- "-DGOOGLE_PROTOBUF_NO_RTTI",
- "-DGOOGLE_PROTOBUF_NO_STATIC_INITIALIZER",
- "-DHAVE_PTHREAD",
- "-DHAVE_SYS_UIO_H",
- "-DNDEBUG",
- "-DNET_IMPLEMENTATION",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_FORTIFY_SOURCE=2",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D__STDC_CONSTANT_MACROS",
- "-D__STDC_FORMAT_MACROS",
- "-Oz",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "net/third_party/quiche/overrides/",
- "net/third_party/quiche/src/",
- "net/third_party/quiche/src/quiche/common/platform/default/",
- "third_party/abseil-cpp/",
- "third_party/boringssl/src/include/",
- "third_party/brotli/include/",
- "third_party/protobuf/src/",
- ],
- cpp_std: "c++17",
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- "-Wl,--script,external/cronet/base/android/library_loader/anchor_functions.lds",
- "-Wl,-wrap,asprintf",
- "-Wl,-wrap,calloc",
- "-Wl,-wrap,free",
- "-Wl,-wrap,getcwd",
- "-Wl,-wrap,malloc",
- "-Wl,-wrap,malloc_usable_size",
- "-Wl,-wrap,memalign",
- "-Wl,-wrap,posix_memalign",
- "-Wl,-wrap,pvalloc",
- "-Wl,-wrap,realloc",
- "-Wl,-wrap,realpath",
- "-Wl,-wrap,strdup",
- "-Wl,-wrap,strndup",
- "-Wl,-wrap,valloc",
- "-Wl,-wrap,vasprintf",
- ],
- target: {
- android_arm: {
- srcs: [
- "net/disk_cache/blockfile/mapped_file_bypass_mmap_posix.cc",
- ],
- cflags: [
- "-fstack-protector",
- ],
- },
- android_arm64: {
- srcs: [
- "net/disk_cache/blockfile/mapped_file_bypass_mmap_posix.cc",
- ],
- cflags: [
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- srcs: [
- "net/disk_cache/blockfile/mapped_file_posix.cc",
- ],
- cflags: [
- "-msse3",
- ],
- },
- android_x86_64: {
- srcs: [
- "net/disk_cache/blockfile/mapped_file_bypass_mmap_posix.cc",
- ],
- cflags: [
- "-fstack-protector",
- "-msse3",
- ],
- },
- },
-}
-
-// GN: //net:net_deps
-cc_library_static {
- name: "cronet_aml_net_net_deps",
- srcs: [
- ":cronet_aml_net_isolation_info_proto_gen",
- ],
- shared_libs: [
- "libandroid",
- "liblog",
- "libprotobuf-cpp-lite",
- "libz",
- ],
- static_libs: [
- "cronet_aml_base_allocator_partition_allocator_partition_alloc",
- "cronet_aml_base_base",
- "cronet_aml_base_base_static",
- "cronet_aml_base_nodebug_assertion",
- "cronet_aml_base_third_party_double_conversion_double_conversion",
- "cronet_aml_base_third_party_dynamic_annotations_dynamic_annotations",
- "cronet_aml_net_preload_decoder",
- "cronet_aml_third_party_abseil_cpp_absl_base_base",
- "cronet_aml_third_party_abseil_cpp_absl_base_log_severity",
- "cronet_aml_third_party_abseil_cpp_absl_base_malloc_internal",
- "cronet_aml_third_party_abseil_cpp_absl_base_raw_logging_internal",
- "cronet_aml_third_party_abseil_cpp_absl_base_spinlock_wait",
- "cronet_aml_third_party_abseil_cpp_absl_base_strerror",
- "cronet_aml_third_party_abseil_cpp_absl_base_throw_delegate",
- "cronet_aml_third_party_abseil_cpp_absl_container_hashtablez_sampler",
- "cronet_aml_third_party_abseil_cpp_absl_container_raw_hash_set",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_debugging_internal",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_demangle_internal",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_examine_stack",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_failure_signal_handler",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_stacktrace",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_symbolize",
- "cronet_aml_third_party_abseil_cpp_absl_hash_city",
- "cronet_aml_third_party_abseil_cpp_absl_hash_hash",
- "cronet_aml_third_party_abseil_cpp_absl_hash_low_level_hash",
- "cronet_aml_third_party_abseil_cpp_absl_numeric_int128",
- "cronet_aml_third_party_abseil_cpp_absl_profiling_exponential_biased",
- "cronet_aml_third_party_abseil_cpp_absl_random_distributions",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_platform",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_pool_urbg",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_hwaes",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_hwaes_impl",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_slow",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_seed_material",
- "cronet_aml_third_party_abseil_cpp_absl_random_seed_gen_exception",
- "cronet_aml_third_party_abseil_cpp_absl_random_seed_sequences",
- "cronet_aml_third_party_abseil_cpp_absl_status_status",
- "cronet_aml_third_party_abseil_cpp_absl_status_statusor",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cord",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cord_internal",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_functions",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_handle",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_info",
- "cronet_aml_third_party_abseil_cpp_absl_strings_internal",
- "cronet_aml_third_party_abseil_cpp_absl_strings_str_format_internal",
- "cronet_aml_third_party_abseil_cpp_absl_strings_strings",
- "cronet_aml_third_party_abseil_cpp_absl_synchronization_graphcycles_internal",
- "cronet_aml_third_party_abseil_cpp_absl_synchronization_synchronization",
- "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_civil_time",
- "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_time_zone",
- "cronet_aml_third_party_abseil_cpp_absl_time_time",
- "cronet_aml_third_party_abseil_cpp_absl_types_bad_optional_access",
- "cronet_aml_third_party_abseil_cpp_absl_types_bad_variant_access",
- "cronet_aml_third_party_android_ndk_cpu_features",
- "cronet_aml_third_party_ashmem_ashmem",
- "cronet_aml_third_party_boringssl_boringssl",
- "cronet_aml_third_party_boringssl_boringssl_asm",
- "cronet_aml_third_party_brotli_common",
- "cronet_aml_third_party_brotli_dec",
- "cronet_aml_third_party_icu_icui18n",
- "cronet_aml_third_party_icu_icuuc_private",
- "cronet_aml_third_party_libevent_libevent",
- "cronet_aml_third_party_modp_b64_modp_b64",
- "cronet_aml_third_party_protobuf_protobuf_lite",
- ],
- generated_headers: [
- "cronet_aml_base_debugging_buildflags",
- "cronet_aml_base_logging_buildflags",
- "cronet_aml_build_chromeos_buildflags",
- "cronet_aml_net_base_registry_controlled_domains_registry_controlled_domains",
- "cronet_aml_net_isolation_info_proto_gen_headers",
- "cronet_aml_net_net_jni_headers",
- "cronet_aml_url_buildflags",
- ],
- export_generated_headers: [
- "cronet_aml_base_debugging_buildflags",
- "cronet_aml_base_logging_buildflags",
- "cronet_aml_build_chromeos_buildflags",
- "cronet_aml_net_base_registry_controlled_domains_registry_controlled_domains",
- "cronet_aml_net_isolation_info_proto_gen_headers",
- "cronet_aml_net_net_jni_headers",
- "cronet_aml_url_buildflags",
- ],
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DENABLE_BUILT_IN_DNS",
- "-DGOOGLE_PROTOBUF_INTERNAL_DONATE_STEAL_INLINE=0",
- "-DGOOGLE_PROTOBUF_NO_RTTI",
- "-DGOOGLE_PROTOBUF_NO_STATIC_INITIALIZER",
- "-DHAVE_PTHREAD",
- "-DHAVE_SYS_UIO_H",
- "-DNDEBUG",
- "-DNET_IMPLEMENTATION",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_FORTIFY_SOURCE=2",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D__STDC_CONSTANT_MACROS",
- "-D__STDC_FORMAT_MACROS",
- "-Oz",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "third_party/abseil-cpp/",
- "third_party/boringssl/src/include/",
- "third_party/brotli/include/",
- "third_party/protobuf/src/",
- ],
- cpp_std: "c++17",
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- "-Wl,--script,external/cronet/base/android/library_loader/anchor_functions.lds",
- "-Wl,-wrap,asprintf",
- "-Wl,-wrap,calloc",
- "-Wl,-wrap,free",
- "-Wl,-wrap,getcwd",
- "-Wl,-wrap,malloc",
- "-Wl,-wrap,malloc_usable_size",
- "-Wl,-wrap,memalign",
- "-Wl,-wrap,posix_memalign",
- "-Wl,-wrap,pvalloc",
- "-Wl,-wrap,realloc",
- "-Wl,-wrap,realpath",
- "-Wl,-wrap,strdup",
- "-Wl,-wrap,strndup",
- "-Wl,-wrap,valloc",
- "-Wl,-wrap,vasprintf",
- ],
- target: {
- android_arm: {
- cflags: [
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-fstack-protector",
- "-msse3",
- ],
- },
- },
-}
-
-// GN: //net:net_deps__testing
-cc_library_static {
- name: "cronet_aml_net_net_deps__testing",
- srcs: [
- ":cronet_aml_net_isolation_info_proto__testing_gen",
- ],
- shared_libs: [
- "libandroid",
- "liblog",
- "libprotobuf-cpp-lite",
- "libz",
- ],
- static_libs: [
- "cronet_aml_base_allocator_partition_allocator_partition_alloc__testing",
- "cronet_aml_base_base__testing",
- "cronet_aml_base_base_static__testing",
- "cronet_aml_base_nodebug_assertion__testing",
- "cronet_aml_base_third_party_double_conversion_double_conversion__testing",
- "cronet_aml_base_third_party_dynamic_annotations_dynamic_annotations__testing",
- "cronet_aml_net_preload_decoder__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_base__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_log_severity__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_malloc_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_raw_logging_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_spinlock_wait__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_strerror__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_throw_delegate__testing",
- "cronet_aml_third_party_abseil_cpp_absl_container_hashtablez_sampler__testing",
- "cronet_aml_third_party_abseil_cpp_absl_container_raw_hash_set__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_debugging_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_demangle_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_examine_stack__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_failure_signal_handler__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_stacktrace__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_symbolize__testing",
- "cronet_aml_third_party_abseil_cpp_absl_hash_city__testing",
- "cronet_aml_third_party_abseil_cpp_absl_hash_hash__testing",
- "cronet_aml_third_party_abseil_cpp_absl_hash_low_level_hash__testing",
- "cronet_aml_third_party_abseil_cpp_absl_numeric_int128__testing",
- "cronet_aml_third_party_abseil_cpp_absl_profiling_exponential_biased__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_distributions__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_platform__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_pool_urbg__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_hwaes__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_hwaes_impl__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_slow__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_seed_material__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_seed_gen_exception__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_seed_sequences__testing",
- "cronet_aml_third_party_abseil_cpp_absl_status_status__testing",
- "cronet_aml_third_party_abseil_cpp_absl_status_statusor__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cord__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cord_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_functions__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_handle__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_info__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_str_format_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_strings__testing",
- "cronet_aml_third_party_abseil_cpp_absl_synchronization_graphcycles_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_synchronization_synchronization__testing",
- "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_civil_time__testing",
- "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_time_zone__testing",
- "cronet_aml_third_party_abseil_cpp_absl_time_time__testing",
- "cronet_aml_third_party_abseil_cpp_absl_types_bad_optional_access__testing",
- "cronet_aml_third_party_abseil_cpp_absl_types_bad_variant_access__testing",
- "cronet_aml_third_party_android_ndk_cpu_features__testing",
- "cronet_aml_third_party_ashmem_ashmem__testing",
- "cronet_aml_third_party_boringssl_boringssl__testing",
- "cronet_aml_third_party_boringssl_boringssl_asm__testing",
- "cronet_aml_third_party_brotli_common__testing",
- "cronet_aml_third_party_brotli_dec__testing",
- "cronet_aml_third_party_icu_icui18n__testing",
- "cronet_aml_third_party_icu_icuuc_private__testing",
- "cronet_aml_third_party_libevent_libevent__testing",
- "cronet_aml_third_party_modp_b64_modp_b64__testing",
- "cronet_aml_third_party_protobuf_protobuf_lite__testing",
- ],
- generated_headers: [
- "cronet_aml_base_debugging_buildflags__testing",
- "cronet_aml_base_logging_buildflags__testing",
- "cronet_aml_build_chromeos_buildflags__testing",
- "cronet_aml_net_base_registry_controlled_domains_registry_controlled_domains__testing",
- "cronet_aml_net_isolation_info_proto__testing_gen_headers",
- "cronet_aml_net_net_jni_headers__testing",
- "cronet_aml_url_buildflags__testing",
- ],
- export_generated_headers: [
- "cronet_aml_base_debugging_buildflags__testing",
- "cronet_aml_base_logging_buildflags__testing",
- "cronet_aml_build_chromeos_buildflags__testing",
- "cronet_aml_net_base_registry_controlled_domains_registry_controlled_domains__testing",
- "cronet_aml_net_isolation_info_proto__testing_gen_headers",
- "cronet_aml_net_net_jni_headers__testing",
- "cronet_aml_url_buildflags__testing",
- ],
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DENABLE_BUILT_IN_DNS",
- "-DGOOGLE_PROTOBUF_INTERNAL_DONATE_STEAL_INLINE=0",
- "-DGOOGLE_PROTOBUF_NO_RTTI",
- "-DGOOGLE_PROTOBUF_NO_STATIC_INITIALIZER",
- "-DHAVE_PTHREAD",
- "-DHAVE_SYS_UIO_H",
- "-DNDEBUG",
- "-DNET_IMPLEMENTATION",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_FORTIFY_SOURCE=2",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D__STDC_CONSTANT_MACROS",
- "-D__STDC_FORMAT_MACROS",
- "-Oz",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "third_party/abseil-cpp/",
- "third_party/boringssl/src/include/",
- "third_party/brotli/include/",
- "third_party/protobuf/src/",
- ],
- cpp_std: "c++17",
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- "-Wl,--script,external/cronet/base/android/library_loader/anchor_functions.lds",
- "-Wl,-wrap,asprintf",
- "-Wl,-wrap,calloc",
- "-Wl,-wrap,free",
- "-Wl,-wrap,getcwd",
- "-Wl,-wrap,malloc",
- "-Wl,-wrap,malloc_usable_size",
- "-Wl,-wrap,memalign",
- "-Wl,-wrap,posix_memalign",
- "-Wl,-wrap,pvalloc",
- "-Wl,-wrap,realloc",
- "-Wl,-wrap,realpath",
- "-Wl,-wrap,strdup",
- "-Wl,-wrap,strndup",
- "-Wl,-wrap,valloc",
- "-Wl,-wrap,vasprintf",
- ],
- target: {
- android_arm: {
- cflags: [
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-fstack-protector",
- "-msse3",
- ],
- },
- },
-}
-
-// GN: //net:net_jni_headers
-cc_genrule {
- name: "cronet_aml_net_net_jni_headers",
- srcs: [
- "net/android/java/src/org/chromium/net/AndroidCertVerifyResult.java",
- "net/android/java/src/org/chromium/net/AndroidKeyStore.java",
- "net/android/java/src/org/chromium/net/AndroidNetworkLibrary.java",
- "net/android/java/src/org/chromium/net/AndroidTrafficStats.java",
- "net/android/java/src/org/chromium/net/DnsStatus.java",
- "net/android/java/src/org/chromium/net/GURLUtils.java",
- "net/android/java/src/org/chromium/net/HttpNegotiateAuthenticator.java",
- "net/android/java/src/org/chromium/net/HttpUtil.java",
- "net/android/java/src/org/chromium/net/NetStringUtil.java",
- "net/android/java/src/org/chromium/net/NetworkActiveNotifier.java",
- "net/android/java/src/org/chromium/net/NetworkChangeNotifier.java",
- "net/android/java/src/org/chromium/net/ProxyChangeListener.java",
- "net/android/java/src/org/chromium/net/X509Util.java",
- ],
- cmd: "$(location base/android/jni_generator/jni_generator.py) --ptr_type " +
- "long " +
- "--output_dir " +
- "$(genDir)/net/net_jni_headers " +
- "--includes " +
- "base/android/jni_generator/jni_generator_helper.h " +
- "--use_proxy_hash " +
- "--output_name " +
- "AndroidCertVerifyResult_jni.h " +
- "--output_name " +
- "AndroidKeyStore_jni.h " +
- "--output_name " +
- "AndroidNetworkLibrary_jni.h " +
- "--output_name " +
- "AndroidTrafficStats_jni.h " +
- "--output_name " +
- "DnsStatus_jni.h " +
- "--output_name " +
- "GURLUtils_jni.h " +
- "--output_name " +
- "HttpNegotiateAuthenticator_jni.h " +
- "--output_name " +
- "HttpUtil_jni.h " +
- "--output_name " +
- "NetStringUtil_jni.h " +
- "--output_name " +
- "NetworkActiveNotifier_jni.h " +
- "--output_name " +
- "NetworkChangeNotifier_jni.h " +
- "--output_name " +
- "ProxyChangeListener_jni.h " +
- "--output_name " +
- "X509Util_jni.h " +
- "--input_file " +
- "$(location net/android/java/src/org/chromium/net/AndroidCertVerifyResult.java) " +
- "--input_file " +
- "$(location net/android/java/src/org/chromium/net/AndroidKeyStore.java) " +
- "--input_file " +
- "$(location net/android/java/src/org/chromium/net/AndroidNetworkLibrary.java) " +
- "--input_file " +
- "$(location net/android/java/src/org/chromium/net/AndroidTrafficStats.java) " +
- "--input_file " +
- "$(location net/android/java/src/org/chromium/net/DnsStatus.java) " +
- "--input_file " +
- "$(location net/android/java/src/org/chromium/net/GURLUtils.java) " +
- "--input_file " +
- "$(location net/android/java/src/org/chromium/net/HttpNegotiateAuthenticator.java) " +
- "--input_file " +
- "$(location net/android/java/src/org/chromium/net/HttpUtil.java) " +
- "--input_file " +
- "$(location net/android/java/src/org/chromium/net/NetStringUtil.java) " +
- "--input_file " +
- "$(location net/android/java/src/org/chromium/net/NetworkActiveNotifier.java) " +
- "--input_file " +
- "$(location net/android/java/src/org/chromium/net/NetworkChangeNotifier.java) " +
- "--input_file " +
- "$(location net/android/java/src/org/chromium/net/ProxyChangeListener.java) " +
- "--input_file " +
- "$(location net/android/java/src/org/chromium/net/X509Util.java) " +
- "--package_prefix " +
- "android.net.http.internal",
- out: [
- "net/net_jni_headers/AndroidCertVerifyResult_jni.h",
- "net/net_jni_headers/AndroidKeyStore_jni.h",
- "net/net_jni_headers/AndroidNetworkLibrary_jni.h",
- "net/net_jni_headers/AndroidTrafficStats_jni.h",
- "net/net_jni_headers/DnsStatus_jni.h",
- "net/net_jni_headers/GURLUtils_jni.h",
- "net/net_jni_headers/HttpNegotiateAuthenticator_jni.h",
- "net/net_jni_headers/HttpUtil_jni.h",
- "net/net_jni_headers/NetStringUtil_jni.h",
- "net/net_jni_headers/NetworkActiveNotifier_jni.h",
- "net/net_jni_headers/NetworkChangeNotifier_jni.h",
- "net/net_jni_headers/ProxyChangeListener_jni.h",
- "net/net_jni_headers/X509Util_jni.h",
- ],
- tool_files: [
- "base/android/jni_generator/android_jar.classes",
- "base/android/jni_generator/jni_generator.py",
- "build/android/gyp/util/__init__.py",
- "build/android/gyp/util/build_utils.py",
- "build/gn_helpers.py",
- ],
- apex_available: [
- "com.android.tethering",
- ],
-}
-
-// GN: //net:net_jni_headers__testing
-cc_genrule {
- name: "cronet_aml_net_net_jni_headers__testing",
- srcs: [
- "net/android/java/src/org/chromium/net/AndroidCertVerifyResult.java",
- "net/android/java/src/org/chromium/net/AndroidKeyStore.java",
- "net/android/java/src/org/chromium/net/AndroidNetworkLibrary.java",
- "net/android/java/src/org/chromium/net/AndroidTrafficStats.java",
- "net/android/java/src/org/chromium/net/DnsStatus.java",
- "net/android/java/src/org/chromium/net/GURLUtils.java",
- "net/android/java/src/org/chromium/net/HttpNegotiateAuthenticator.java",
- "net/android/java/src/org/chromium/net/HttpUtil.java",
- "net/android/java/src/org/chromium/net/NetStringUtil.java",
- "net/android/java/src/org/chromium/net/NetworkActiveNotifier.java",
- "net/android/java/src/org/chromium/net/NetworkChangeNotifier.java",
- "net/android/java/src/org/chromium/net/ProxyChangeListener.java",
- "net/android/java/src/org/chromium/net/X509Util.java",
- ],
- cmd: "$(location base/android/jni_generator/jni_generator.py) --ptr_type " +
- "long " +
- "--output_dir " +
- "$(genDir)/net/net_jni_headers " +
- "--includes " +
- "base/android/jni_generator/jni_generator_helper.h " +
- "--use_proxy_hash " +
- "--output_name " +
- "AndroidCertVerifyResult_jni.h " +
- "--output_name " +
- "AndroidKeyStore_jni.h " +
- "--output_name " +
- "AndroidNetworkLibrary_jni.h " +
- "--output_name " +
- "AndroidTrafficStats_jni.h " +
- "--output_name " +
- "DnsStatus_jni.h " +
- "--output_name " +
- "GURLUtils_jni.h " +
- "--output_name " +
- "HttpNegotiateAuthenticator_jni.h " +
- "--output_name " +
- "HttpUtil_jni.h " +
- "--output_name " +
- "NetStringUtil_jni.h " +
- "--output_name " +
- "NetworkActiveNotifier_jni.h " +
- "--output_name " +
- "NetworkChangeNotifier_jni.h " +
- "--output_name " +
- "ProxyChangeListener_jni.h " +
- "--output_name " +
- "X509Util_jni.h " +
- "--input_file " +
- "$(location net/android/java/src/org/chromium/net/AndroidCertVerifyResult.java) " +
- "--input_file " +
- "$(location net/android/java/src/org/chromium/net/AndroidKeyStore.java) " +
- "--input_file " +
- "$(location net/android/java/src/org/chromium/net/AndroidNetworkLibrary.java) " +
- "--input_file " +
- "$(location net/android/java/src/org/chromium/net/AndroidTrafficStats.java) " +
- "--input_file " +
- "$(location net/android/java/src/org/chromium/net/DnsStatus.java) " +
- "--input_file " +
- "$(location net/android/java/src/org/chromium/net/GURLUtils.java) " +
- "--input_file " +
- "$(location net/android/java/src/org/chromium/net/HttpNegotiateAuthenticator.java) " +
- "--input_file " +
- "$(location net/android/java/src/org/chromium/net/HttpUtil.java) " +
- "--input_file " +
- "$(location net/android/java/src/org/chromium/net/NetStringUtil.java) " +
- "--input_file " +
- "$(location net/android/java/src/org/chromium/net/NetworkActiveNotifier.java) " +
- "--input_file " +
- "$(location net/android/java/src/org/chromium/net/NetworkChangeNotifier.java) " +
- "--input_file " +
- "$(location net/android/java/src/org/chromium/net/ProxyChangeListener.java) " +
- "--input_file " +
- "$(location net/android/java/src/org/chromium/net/X509Util.java)",
- out: [
- "net/net_jni_headers/AndroidCertVerifyResult_jni.h",
- "net/net_jni_headers/AndroidKeyStore_jni.h",
- "net/net_jni_headers/AndroidNetworkLibrary_jni.h",
- "net/net_jni_headers/AndroidTrafficStats_jni.h",
- "net/net_jni_headers/DnsStatus_jni.h",
- "net/net_jni_headers/GURLUtils_jni.h",
- "net/net_jni_headers/HttpNegotiateAuthenticator_jni.h",
- "net/net_jni_headers/HttpUtil_jni.h",
- "net/net_jni_headers/NetStringUtil_jni.h",
- "net/net_jni_headers/NetworkActiveNotifier_jni.h",
- "net/net_jni_headers/NetworkChangeNotifier_jni.h",
- "net/net_jni_headers/ProxyChangeListener_jni.h",
- "net/net_jni_headers/X509Util_jni.h",
- ],
- tool_files: [
- "base/android/jni_generator/android_jar.classes",
- "base/android/jni_generator/jni_generator.py",
- "build/android/gyp/util/__init__.py",
- "build/android/gyp/util/build_utils.py",
- "build/gn_helpers.py",
- ],
- apex_available: [
- "com.android.tethering",
- ],
-}
-
-// GN: //net:net_nqe_proto__testing
-cc_genrule {
- name: "cronet_aml_net_net_nqe_proto__testing_gen",
- srcs: [
- "net/nqe/proto/network_id_proto.proto",
- ],
- tools: [
- "cronet_aml_third_party_protobuf_protoc",
- ],
- cmd: "$(location cronet_aml_third_party_protobuf_protoc) --proto_path=external/cronet/net/nqe/proto --cpp_out=lite=true:$(genDir)/external/cronet/net/nqe/proto/ $(in)",
- out: [
- "external/cronet/net/nqe/proto/network_id_proto.pb.cc",
- ],
- apex_available: [
- "com.android.tethering",
- ],
-}
-
-// GN: //net:net_nqe_proto__testing
-cc_genrule {
- name: "cronet_aml_net_net_nqe_proto__testing_gen_headers",
- srcs: [
- "net/nqe/proto/network_id_proto.proto",
- ],
- tools: [
- "cronet_aml_third_party_protobuf_protoc",
- ],
- cmd: "$(location cronet_aml_third_party_protobuf_protoc) --proto_path=external/cronet/net/nqe/proto --cpp_out=lite=true:$(genDir)/external/cronet/net/nqe/proto/ $(in)",
- out: [
- "external/cronet/net/nqe/proto/network_id_proto.pb.h",
- ],
- export_include_dirs: [
- ".",
- "net/nqe/proto",
- "protos",
- ],
- apex_available: [
- "com.android.tethering",
- ],
-}
-
-// GN: //net:net_nqe_proto
-cc_genrule {
- name: "cronet_aml_net_net_nqe_proto_gen",
- srcs: [
- "net/nqe/proto/network_id_proto.proto",
- ],
- tools: [
- "cronet_aml_third_party_protobuf_protoc",
- ],
- cmd: "$(location cronet_aml_third_party_protobuf_protoc) --proto_path=external/cronet/net/nqe/proto --cpp_out=lite=true:$(genDir)/external/cronet/net/nqe/proto/ $(in)",
- out: [
- "external/cronet/net/nqe/proto/network_id_proto.pb.cc",
- ],
- apex_available: [
- "com.android.tethering",
- ],
-}
-
-// GN: //net:net_nqe_proto
-cc_genrule {
- name: "cronet_aml_net_net_nqe_proto_gen_headers",
- srcs: [
- "net/nqe/proto/network_id_proto.proto",
- ],
- tools: [
- "cronet_aml_third_party_protobuf_protoc",
- ],
- cmd: "$(location cronet_aml_third_party_protobuf_protoc) --proto_path=external/cronet/net/nqe/proto --cpp_out=lite=true:$(genDir)/external/cronet/net/nqe/proto/ $(in)",
- out: [
- "external/cronet/net/nqe/proto/network_id_proto.pb.h",
- ],
- export_include_dirs: [
- ".",
- "net/nqe/proto",
- "protos",
- ],
- apex_available: [
- "com.android.tethering",
- ],
-}
-
-// GN: //net:net_public_deps
-cc_library_static {
- name: "cronet_aml_net_net_public_deps",
- srcs: [
- ":cronet_aml_net_net_nqe_proto_gen",
- ":cronet_aml_net_third_party_quiche_net_quic_test_tools_proto_gen",
- ],
- shared_libs: [
- "libandroid",
- "liblog",
- "libprotobuf-cpp-lite",
- "libz",
- ],
- static_libs: [
- "cronet_aml_base_allocator_partition_allocator_partition_alloc",
- "cronet_aml_base_base",
- "cronet_aml_base_base_static",
- "cronet_aml_base_nodebug_assertion",
- "cronet_aml_base_third_party_double_conversion_double_conversion",
- "cronet_aml_base_third_party_dynamic_annotations_dynamic_annotations",
- "cronet_aml_crypto_crypto",
- "cronet_aml_net_third_party_quiche_quiche",
- "cronet_aml_net_traffic_annotation_traffic_annotation",
- "cronet_aml_net_uri_template",
- "cronet_aml_third_party_abseil_cpp_absl_base_base",
- "cronet_aml_third_party_abseil_cpp_absl_base_log_severity",
- "cronet_aml_third_party_abseil_cpp_absl_base_malloc_internal",
- "cronet_aml_third_party_abseil_cpp_absl_base_raw_logging_internal",
- "cronet_aml_third_party_abseil_cpp_absl_base_spinlock_wait",
- "cronet_aml_third_party_abseil_cpp_absl_base_strerror",
- "cronet_aml_third_party_abseil_cpp_absl_base_throw_delegate",
- "cronet_aml_third_party_abseil_cpp_absl_container_hashtablez_sampler",
- "cronet_aml_third_party_abseil_cpp_absl_container_raw_hash_set",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_debugging_internal",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_demangle_internal",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_examine_stack",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_failure_signal_handler",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_stacktrace",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_symbolize",
- "cronet_aml_third_party_abseil_cpp_absl_hash_city",
- "cronet_aml_third_party_abseil_cpp_absl_hash_hash",
- "cronet_aml_third_party_abseil_cpp_absl_hash_low_level_hash",
- "cronet_aml_third_party_abseil_cpp_absl_numeric_int128",
- "cronet_aml_third_party_abseil_cpp_absl_profiling_exponential_biased",
- "cronet_aml_third_party_abseil_cpp_absl_random_distributions",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_platform",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_pool_urbg",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_hwaes",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_hwaes_impl",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_slow",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_seed_material",
- "cronet_aml_third_party_abseil_cpp_absl_random_seed_gen_exception",
- "cronet_aml_third_party_abseil_cpp_absl_random_seed_sequences",
- "cronet_aml_third_party_abseil_cpp_absl_status_status",
- "cronet_aml_third_party_abseil_cpp_absl_status_statusor",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cord",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cord_internal",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_functions",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_handle",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_info",
- "cronet_aml_third_party_abseil_cpp_absl_strings_internal",
- "cronet_aml_third_party_abseil_cpp_absl_strings_str_format_internal",
- "cronet_aml_third_party_abseil_cpp_absl_strings_strings",
- "cronet_aml_third_party_abseil_cpp_absl_synchronization_graphcycles_internal",
- "cronet_aml_third_party_abseil_cpp_absl_synchronization_synchronization",
- "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_civil_time",
- "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_time_zone",
- "cronet_aml_third_party_abseil_cpp_absl_time_time",
- "cronet_aml_third_party_abseil_cpp_absl_types_bad_optional_access",
- "cronet_aml_third_party_abseil_cpp_absl_types_bad_variant_access",
- "cronet_aml_third_party_android_ndk_cpu_features",
- "cronet_aml_third_party_ashmem_ashmem",
- "cronet_aml_third_party_boringssl_boringssl",
- "cronet_aml_third_party_boringssl_boringssl_asm",
- "cronet_aml_third_party_icu_icui18n",
- "cronet_aml_third_party_icu_icuuc_private",
- "cronet_aml_third_party_libevent_libevent",
- "cronet_aml_third_party_modp_b64_modp_b64",
- "cronet_aml_third_party_protobuf_protobuf_lite",
- "cronet_aml_url_url",
- ],
- generated_headers: [
- "cronet_aml_net_buildflags",
- "cronet_aml_net_net_nqe_proto_gen_headers",
- "cronet_aml_net_third_party_quiche_net_quic_test_tools_proto_gen_headers",
- ],
- export_generated_headers: [
- "cronet_aml_net_buildflags",
- "cronet_aml_net_net_nqe_proto_gen_headers",
- "cronet_aml_net_third_party_quiche_net_quic_test_tools_proto_gen_headers",
- ],
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DGOOGLE_PROTOBUF_INTERNAL_DONATE_STEAL_INLINE=0",
- "-DGOOGLE_PROTOBUF_NO_RTTI",
- "-DGOOGLE_PROTOBUF_NO_STATIC_INITIALIZER",
- "-DHAVE_PTHREAD",
- "-DHAVE_SYS_UIO_H",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_FORTIFY_SOURCE=2",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D__STDC_CONSTANT_MACROS",
- "-D__STDC_FORMAT_MACROS",
- "-Oz",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "net/third_party/quiche/overrides/",
- "net/third_party/quiche/src/",
- "net/third_party/quiche/src/quiche/common/platform/default/",
- "third_party/abseil-cpp/",
- "third_party/boringssl/src/include/",
- "third_party/protobuf/src/",
- ],
- cpp_std: "c++17",
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- "-Wl,--script,external/cronet/base/android/library_loader/anchor_functions.lds",
- "-Wl,-wrap,asprintf",
- "-Wl,-wrap,calloc",
- "-Wl,-wrap,free",
- "-Wl,-wrap,getcwd",
- "-Wl,-wrap,malloc",
- "-Wl,-wrap,malloc_usable_size",
- "-Wl,-wrap,memalign",
- "-Wl,-wrap,posix_memalign",
- "-Wl,-wrap,pvalloc",
- "-Wl,-wrap,realloc",
- "-Wl,-wrap,realpath",
- "-Wl,-wrap,strdup",
- "-Wl,-wrap,strndup",
- "-Wl,-wrap,valloc",
- "-Wl,-wrap,vasprintf",
- ],
- target: {
- android_arm: {
- cflags: [
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-fstack-protector",
- "-msse3",
- ],
- },
- },
-}
-
-// GN: //net:net_public_deps__testing
-cc_library_static {
- name: "cronet_aml_net_net_public_deps__testing",
- srcs: [
- ":cronet_aml_net_net_nqe_proto__testing_gen",
- ":cronet_aml_net_third_party_quiche_net_quic_test_tools_proto__testing_gen",
- ],
- shared_libs: [
- "libandroid",
- "liblog",
- "libprotobuf-cpp-lite",
- "libz",
- ],
- static_libs: [
- "cronet_aml_base_allocator_partition_allocator_partition_alloc__testing",
- "cronet_aml_base_base__testing",
- "cronet_aml_base_base_static__testing",
- "cronet_aml_base_nodebug_assertion__testing",
- "cronet_aml_base_third_party_double_conversion_double_conversion__testing",
- "cronet_aml_base_third_party_dynamic_annotations_dynamic_annotations__testing",
- "cronet_aml_crypto_crypto__testing",
- "cronet_aml_net_third_party_quiche_quiche__testing",
- "cronet_aml_net_traffic_annotation_traffic_annotation__testing",
- "cronet_aml_net_uri_template__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_base__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_log_severity__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_malloc_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_raw_logging_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_spinlock_wait__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_strerror__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_throw_delegate__testing",
- "cronet_aml_third_party_abseil_cpp_absl_container_hashtablez_sampler__testing",
- "cronet_aml_third_party_abseil_cpp_absl_container_raw_hash_set__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_debugging_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_demangle_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_examine_stack__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_failure_signal_handler__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_stacktrace__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_symbolize__testing",
- "cronet_aml_third_party_abseil_cpp_absl_hash_city__testing",
- "cronet_aml_third_party_abseil_cpp_absl_hash_hash__testing",
- "cronet_aml_third_party_abseil_cpp_absl_hash_low_level_hash__testing",
- "cronet_aml_third_party_abseil_cpp_absl_numeric_int128__testing",
- "cronet_aml_third_party_abseil_cpp_absl_profiling_exponential_biased__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_distributions__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_platform__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_pool_urbg__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_hwaes__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_hwaes_impl__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_slow__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_seed_material__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_seed_gen_exception__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_seed_sequences__testing",
- "cronet_aml_third_party_abseil_cpp_absl_status_status__testing",
- "cronet_aml_third_party_abseil_cpp_absl_status_statusor__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cord__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cord_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_functions__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_handle__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_info__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_str_format_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_strings__testing",
- "cronet_aml_third_party_abseil_cpp_absl_synchronization_graphcycles_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_synchronization_synchronization__testing",
- "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_civil_time__testing",
- "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_time_zone__testing",
- "cronet_aml_third_party_abseil_cpp_absl_time_time__testing",
- "cronet_aml_third_party_abseil_cpp_absl_types_bad_optional_access__testing",
- "cronet_aml_third_party_abseil_cpp_absl_types_bad_variant_access__testing",
- "cronet_aml_third_party_android_ndk_cpu_features__testing",
- "cronet_aml_third_party_ashmem_ashmem__testing",
- "cronet_aml_third_party_boringssl_boringssl__testing",
- "cronet_aml_third_party_boringssl_boringssl_asm__testing",
- "cronet_aml_third_party_icu_icui18n__testing",
- "cronet_aml_third_party_icu_icuuc_private__testing",
- "cronet_aml_third_party_libevent_libevent__testing",
- "cronet_aml_third_party_modp_b64_modp_b64__testing",
- "cronet_aml_third_party_protobuf_protobuf_lite__testing",
- "cronet_aml_url_url__testing",
- ],
- generated_headers: [
- "cronet_aml_net_buildflags__testing",
- "cronet_aml_net_net_nqe_proto__testing_gen_headers",
- "cronet_aml_net_third_party_quiche_net_quic_test_tools_proto__testing_gen_headers",
- ],
- export_generated_headers: [
- "cronet_aml_net_buildflags__testing",
- "cronet_aml_net_net_nqe_proto__testing_gen_headers",
- "cronet_aml_net_third_party_quiche_net_quic_test_tools_proto__testing_gen_headers",
- ],
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DGOOGLE_PROTOBUF_INTERNAL_DONATE_STEAL_INLINE=0",
- "-DGOOGLE_PROTOBUF_NO_RTTI",
- "-DGOOGLE_PROTOBUF_NO_STATIC_INITIALIZER",
- "-DHAVE_PTHREAD",
- "-DHAVE_SYS_UIO_H",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_FORTIFY_SOURCE=2",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D__STDC_CONSTANT_MACROS",
- "-D__STDC_FORMAT_MACROS",
- "-Oz",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "net/third_party/quiche/overrides/",
- "net/third_party/quiche/src/",
- "net/third_party/quiche/src/quiche/common/platform/default/",
- "third_party/abseil-cpp/",
- "third_party/boringssl/src/include/",
- "third_party/protobuf/src/",
- ],
- cpp_std: "c++17",
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- "-Wl,--script,external/cronet/base/android/library_loader/anchor_functions.lds",
- "-Wl,-wrap,asprintf",
- "-Wl,-wrap,calloc",
- "-Wl,-wrap,free",
- "-Wl,-wrap,getcwd",
- "-Wl,-wrap,malloc",
- "-Wl,-wrap,malloc_usable_size",
- "-Wl,-wrap,memalign",
- "-Wl,-wrap,posix_memalign",
- "-Wl,-wrap,pvalloc",
- "-Wl,-wrap,realloc",
- "-Wl,-wrap,realpath",
- "-Wl,-wrap,strdup",
- "-Wl,-wrap,strndup",
- "-Wl,-wrap,valloc",
- "-Wl,-wrap,vasprintf",
- ],
- target: {
- android_arm: {
- cflags: [
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-fstack-protector",
- "-msse3",
- ],
- },
- },
-}
-
-// GN: //net:preload_decoder
-cc_library_static {
- name: "cronet_aml_net_preload_decoder",
- srcs: [
- "net/extras/preload_data/decoder.cc",
- ],
- shared_libs: [
- "libandroid",
- "liblog",
- ],
- static_libs: [
- "cronet_aml_base_allocator_partition_allocator_partition_alloc",
- "cronet_aml_base_base",
- "cronet_aml_base_base_static",
- "cronet_aml_base_nodebug_assertion",
- "cronet_aml_base_third_party_double_conversion_double_conversion",
- "cronet_aml_base_third_party_dynamic_annotations_dynamic_annotations",
- "cronet_aml_third_party_abseil_cpp_absl_base_base",
- "cronet_aml_third_party_abseil_cpp_absl_base_log_severity",
- "cronet_aml_third_party_abseil_cpp_absl_base_malloc_internal",
- "cronet_aml_third_party_abseil_cpp_absl_base_raw_logging_internal",
- "cronet_aml_third_party_abseil_cpp_absl_base_spinlock_wait",
- "cronet_aml_third_party_abseil_cpp_absl_base_strerror",
- "cronet_aml_third_party_abseil_cpp_absl_base_throw_delegate",
- "cronet_aml_third_party_abseil_cpp_absl_container_hashtablez_sampler",
- "cronet_aml_third_party_abseil_cpp_absl_container_raw_hash_set",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_debugging_internal",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_demangle_internal",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_examine_stack",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_failure_signal_handler",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_stacktrace",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_symbolize",
- "cronet_aml_third_party_abseil_cpp_absl_hash_city",
- "cronet_aml_third_party_abseil_cpp_absl_hash_hash",
- "cronet_aml_third_party_abseil_cpp_absl_hash_low_level_hash",
- "cronet_aml_third_party_abseil_cpp_absl_numeric_int128",
- "cronet_aml_third_party_abseil_cpp_absl_profiling_exponential_biased",
- "cronet_aml_third_party_abseil_cpp_absl_random_distributions",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_platform",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_pool_urbg",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_hwaes",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_hwaes_impl",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_slow",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_seed_material",
- "cronet_aml_third_party_abseil_cpp_absl_random_seed_gen_exception",
- "cronet_aml_third_party_abseil_cpp_absl_random_seed_sequences",
- "cronet_aml_third_party_abseil_cpp_absl_status_status",
- "cronet_aml_third_party_abseil_cpp_absl_status_statusor",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cord",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cord_internal",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_functions",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_handle",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_info",
- "cronet_aml_third_party_abseil_cpp_absl_strings_internal",
- "cronet_aml_third_party_abseil_cpp_absl_strings_str_format_internal",
- "cronet_aml_third_party_abseil_cpp_absl_strings_strings",
- "cronet_aml_third_party_abseil_cpp_absl_synchronization_graphcycles_internal",
- "cronet_aml_third_party_abseil_cpp_absl_synchronization_synchronization",
- "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_civil_time",
- "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_time_zone",
- "cronet_aml_third_party_abseil_cpp_absl_time_time",
- "cronet_aml_third_party_abseil_cpp_absl_types_bad_optional_access",
- "cronet_aml_third_party_abseil_cpp_absl_types_bad_variant_access",
- "cronet_aml_third_party_android_ndk_cpu_features",
- "cronet_aml_third_party_ashmem_ashmem",
- "cronet_aml_third_party_boringssl_boringssl",
- "cronet_aml_third_party_boringssl_boringssl_asm",
- "cronet_aml_third_party_icu_icui18n",
- "cronet_aml_third_party_icu_icuuc_private",
- "cronet_aml_third_party_libevent_libevent",
- "cronet_aml_third_party_modp_b64_modp_b64",
- ],
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DHAVE_SYS_UIO_H",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_FORTIFY_SOURCE=2",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D__STDC_CONSTANT_MACROS",
- "-D__STDC_FORMAT_MACROS",
- "-Oz",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "third_party/abseil-cpp/",
- "third_party/boringssl/src/include/",
- ],
- cpp_std: "c++17",
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- "-Wl,--script,external/cronet/base/android/library_loader/anchor_functions.lds",
- "-Wl,-wrap,asprintf",
- "-Wl,-wrap,calloc",
- "-Wl,-wrap,free",
- "-Wl,-wrap,getcwd",
- "-Wl,-wrap,malloc",
- "-Wl,-wrap,malloc_usable_size",
- "-Wl,-wrap,memalign",
- "-Wl,-wrap,posix_memalign",
- "-Wl,-wrap,pvalloc",
- "-Wl,-wrap,realloc",
- "-Wl,-wrap,realpath",
- "-Wl,-wrap,strdup",
- "-Wl,-wrap,strndup",
- "-Wl,-wrap,valloc",
- "-Wl,-wrap,vasprintf",
- ],
- target: {
- android_arm: {
- cflags: [
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-fstack-protector",
- "-msse3",
- ],
- },
- },
-}
-
-// GN: //net:preload_decoder__testing
-cc_library_static {
- name: "cronet_aml_net_preload_decoder__testing",
- srcs: [
- "net/extras/preload_data/decoder.cc",
- ],
- shared_libs: [
- "libandroid",
- "liblog",
- ],
- static_libs: [
- "cronet_aml_base_allocator_partition_allocator_partition_alloc__testing",
- "cronet_aml_base_base__testing",
- "cronet_aml_base_base_static__testing",
- "cronet_aml_base_nodebug_assertion__testing",
- "cronet_aml_base_third_party_double_conversion_double_conversion__testing",
- "cronet_aml_base_third_party_dynamic_annotations_dynamic_annotations__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_base__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_log_severity__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_malloc_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_raw_logging_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_spinlock_wait__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_strerror__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_throw_delegate__testing",
- "cronet_aml_third_party_abseil_cpp_absl_container_hashtablez_sampler__testing",
- "cronet_aml_third_party_abseil_cpp_absl_container_raw_hash_set__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_debugging_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_demangle_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_examine_stack__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_failure_signal_handler__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_stacktrace__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_symbolize__testing",
- "cronet_aml_third_party_abseil_cpp_absl_hash_city__testing",
- "cronet_aml_third_party_abseil_cpp_absl_hash_hash__testing",
- "cronet_aml_third_party_abseil_cpp_absl_hash_low_level_hash__testing",
- "cronet_aml_third_party_abseil_cpp_absl_numeric_int128__testing",
- "cronet_aml_third_party_abseil_cpp_absl_profiling_exponential_biased__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_distributions__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_platform__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_pool_urbg__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_hwaes__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_hwaes_impl__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_slow__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_seed_material__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_seed_gen_exception__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_seed_sequences__testing",
- "cronet_aml_third_party_abseil_cpp_absl_status_status__testing",
- "cronet_aml_third_party_abseil_cpp_absl_status_statusor__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cord__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cord_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_functions__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_handle__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_info__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_str_format_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_strings__testing",
- "cronet_aml_third_party_abseil_cpp_absl_synchronization_graphcycles_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_synchronization_synchronization__testing",
- "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_civil_time__testing",
- "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_time_zone__testing",
- "cronet_aml_third_party_abseil_cpp_absl_time_time__testing",
- "cronet_aml_third_party_abseil_cpp_absl_types_bad_optional_access__testing",
- "cronet_aml_third_party_abseil_cpp_absl_types_bad_variant_access__testing",
- "cronet_aml_third_party_android_ndk_cpu_features__testing",
- "cronet_aml_third_party_ashmem_ashmem__testing",
- "cronet_aml_third_party_boringssl_boringssl__testing",
- "cronet_aml_third_party_boringssl_boringssl_asm__testing",
- "cronet_aml_third_party_icu_icui18n__testing",
- "cronet_aml_third_party_icu_icuuc_private__testing",
- "cronet_aml_third_party_libevent_libevent__testing",
- "cronet_aml_third_party_modp_b64_modp_b64__testing",
- ],
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DHAVE_SYS_UIO_H",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_FORTIFY_SOURCE=2",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D__STDC_CONSTANT_MACROS",
- "-D__STDC_FORMAT_MACROS",
- "-Oz",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "third_party/abseil-cpp/",
- "third_party/boringssl/src/include/",
- ],
- cpp_std: "c++17",
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- "-Wl,--script,external/cronet/base/android/library_loader/anchor_functions.lds",
- "-Wl,-wrap,asprintf",
- "-Wl,-wrap,calloc",
- "-Wl,-wrap,free",
- "-Wl,-wrap,getcwd",
- "-Wl,-wrap,malloc",
- "-Wl,-wrap,malloc_usable_size",
- "-Wl,-wrap,memalign",
- "-Wl,-wrap,posix_memalign",
- "-Wl,-wrap,pvalloc",
- "-Wl,-wrap,realloc",
- "-Wl,-wrap,realpath",
- "-Wl,-wrap,strdup",
- "-Wl,-wrap,strndup",
- "-Wl,-wrap,valloc",
- "-Wl,-wrap,vasprintf",
- ],
- target: {
- android_arm: {
- cflags: [
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-fstack-protector",
- "-msse3",
- ],
- },
- },
-}
-
-// GN: //net:quic_test_flags_utils__testing
-cc_library_static {
- name: "cronet_aml_net_quic_test_flags_utils__testing",
- srcs: [
- "net/quic/platform/impl/quic_test_flags_utils.cc",
- ],
- shared_libs: [
- "libandroid",
- "liblog",
- "libz",
- ],
- static_libs: [
- "cronet_aml_base_allocator_partition_allocator_partition_alloc__testing",
- "cronet_aml_base_base__testing",
- "cronet_aml_base_base_static__testing",
- "cronet_aml_base_nodebug_assertion__testing",
- "cronet_aml_base_third_party_double_conversion_double_conversion__testing",
- "cronet_aml_base_third_party_dynamic_annotations_dynamic_annotations__testing",
- "cronet_aml_crypto_crypto__testing",
- "cronet_aml_net_dns_dns__testing",
- "cronet_aml_net_dns_public_public__testing",
- "cronet_aml_net_http_transport_security_state_generated_files__testing",
- "cronet_aml_net_net__testing",
- "cronet_aml_net_net_deps__testing",
- "cronet_aml_net_net_public_deps__testing",
- "cronet_aml_net_preload_decoder__testing",
- "cronet_aml_net_third_party_quiche_quiche__testing",
- "cronet_aml_net_traffic_annotation_traffic_annotation__testing",
- "cronet_aml_net_uri_template__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_base__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_log_severity__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_malloc_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_raw_logging_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_spinlock_wait__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_strerror__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_throw_delegate__testing",
- "cronet_aml_third_party_abseil_cpp_absl_container_hashtablez_sampler__testing",
- "cronet_aml_third_party_abseil_cpp_absl_container_raw_hash_set__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_debugging_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_demangle_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_examine_stack__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_failure_signal_handler__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_stacktrace__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_symbolize__testing",
- "cronet_aml_third_party_abseil_cpp_absl_hash_city__testing",
- "cronet_aml_third_party_abseil_cpp_absl_hash_hash__testing",
- "cronet_aml_third_party_abseil_cpp_absl_hash_low_level_hash__testing",
- "cronet_aml_third_party_abseil_cpp_absl_numeric_int128__testing",
- "cronet_aml_third_party_abseil_cpp_absl_profiling_exponential_biased__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_distributions__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_platform__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_pool_urbg__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_hwaes__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_hwaes_impl__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_slow__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_seed_material__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_seed_gen_exception__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_seed_sequences__testing",
- "cronet_aml_third_party_abseil_cpp_absl_status_status__testing",
- "cronet_aml_third_party_abseil_cpp_absl_status_statusor__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cord__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cord_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_functions__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_handle__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_info__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_str_format_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_strings__testing",
- "cronet_aml_third_party_abseil_cpp_absl_synchronization_graphcycles_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_synchronization_synchronization__testing",
- "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_civil_time__testing",
- "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_time_zone__testing",
- "cronet_aml_third_party_abseil_cpp_absl_time_time__testing",
- "cronet_aml_third_party_abseil_cpp_absl_types_bad_optional_access__testing",
- "cronet_aml_third_party_abseil_cpp_absl_types_bad_variant_access__testing",
- "cronet_aml_third_party_android_ndk_cpu_features__testing",
- "cronet_aml_third_party_ashmem_ashmem__testing",
- "cronet_aml_third_party_boringssl_boringssl__testing",
- "cronet_aml_third_party_boringssl_boringssl_asm__testing",
- "cronet_aml_third_party_brotli_common__testing",
- "cronet_aml_third_party_brotli_dec__testing",
- "cronet_aml_third_party_icu_icui18n__testing",
- "cronet_aml_third_party_icu_icuuc_private__testing",
- "cronet_aml_third_party_libevent_libevent__testing",
- "cronet_aml_third_party_modp_b64_modp_b64__testing",
- "cronet_aml_third_party_protobuf_protobuf_lite__testing",
- "cronet_aml_url_url__testing",
- ],
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DGOOGLE_PROTOBUF_INTERNAL_DONATE_STEAL_INLINE=0",
- "-DGOOGLE_PROTOBUF_NO_RTTI",
- "-DGOOGLE_PROTOBUF_NO_STATIC_INITIALIZER",
- "-DHAVE_PTHREAD",
- "-DHAVE_SYS_UIO_H",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_FORTIFY_SOURCE=2",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D__STDC_CONSTANT_MACROS",
- "-D__STDC_FORMAT_MACROS",
- "-Oz",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "net/third_party/quiche/overrides/",
- "net/third_party/quiche/src/",
- "net/third_party/quiche/src/quiche/common/platform/default/",
- "third_party/abseil-cpp/",
- "third_party/boringssl/src/include/",
- "third_party/protobuf/src/",
- ],
- cpp_std: "c++17",
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- "-Wl,--script,external/cronet/base/android/library_loader/anchor_functions.lds",
- "-Wl,-wrap,asprintf",
- "-Wl,-wrap,calloc",
- "-Wl,-wrap,free",
- "-Wl,-wrap,getcwd",
- "-Wl,-wrap,malloc",
- "-Wl,-wrap,malloc_usable_size",
- "-Wl,-wrap,memalign",
- "-Wl,-wrap,posix_memalign",
- "-Wl,-wrap,pvalloc",
- "-Wl,-wrap,realloc",
- "-Wl,-wrap,realpath",
- "-Wl,-wrap,strdup",
- "-Wl,-wrap,strndup",
- "-Wl,-wrap,valloc",
- "-Wl,-wrap,vasprintf",
- ],
- target: {
- android_arm: {
- cflags: [
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-fstack-protector",
- "-msse3",
- ],
- },
- },
-}
-
-// GN: //net:simple_quic_tools__testing
-cc_library_static {
- name: "cronet_aml_net_simple_quic_tools__testing",
- srcs: [
- "net/tools/quic/quic_client_message_loop_network_helper.cc",
- "net/tools/quic/quic_simple_client.cc",
- "net/tools/quic/quic_simple_server.cc",
- "net/tools/quic/quic_simple_server_packet_writer.cc",
- "net/tools/quic/quic_simple_server_session_helper.cc",
- "net/tools/quic/quic_simple_server_socket.cc",
- "net/tools/quic/synchronous_host_resolver.cc",
- ],
- shared_libs: [
- "libandroid",
- "liblog",
- "libz",
- ],
- static_libs: [
- "cronet_aml_base_allocator_partition_allocator_partition_alloc__testing",
- "cronet_aml_base_base__testing",
- "cronet_aml_base_base_static__testing",
- "cronet_aml_base_nodebug_assertion__testing",
- "cronet_aml_base_third_party_double_conversion_double_conversion__testing",
- "cronet_aml_base_third_party_dynamic_annotations_dynamic_annotations__testing",
- "cronet_aml_crypto_crypto__testing",
- "cronet_aml_net_dns_dns__testing",
- "cronet_aml_net_dns_public_public__testing",
- "cronet_aml_net_http_transport_security_state_generated_files__testing",
- "cronet_aml_net_net__testing",
- "cronet_aml_net_net_deps__testing",
- "cronet_aml_net_net_public_deps__testing",
- "cronet_aml_net_preload_decoder__testing",
- "cronet_aml_net_third_party_quiche_quiche__testing",
- "cronet_aml_net_third_party_quiche_quiche_tool_support__testing",
- "cronet_aml_net_traffic_annotation_traffic_annotation__testing",
- "cronet_aml_net_uri_template__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_base__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_log_severity__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_malloc_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_raw_logging_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_spinlock_wait__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_strerror__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_throw_delegate__testing",
- "cronet_aml_third_party_abseil_cpp_absl_container_hashtablez_sampler__testing",
- "cronet_aml_third_party_abseil_cpp_absl_container_raw_hash_set__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_debugging_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_demangle_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_examine_stack__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_failure_signal_handler__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_stacktrace__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_symbolize__testing",
- "cronet_aml_third_party_abseil_cpp_absl_hash_city__testing",
- "cronet_aml_third_party_abseil_cpp_absl_hash_hash__testing",
- "cronet_aml_third_party_abseil_cpp_absl_hash_low_level_hash__testing",
- "cronet_aml_third_party_abseil_cpp_absl_numeric_int128__testing",
- "cronet_aml_third_party_abseil_cpp_absl_profiling_exponential_biased__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_distributions__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_platform__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_pool_urbg__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_hwaes__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_hwaes_impl__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_slow__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_seed_material__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_seed_gen_exception__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_seed_sequences__testing",
- "cronet_aml_third_party_abseil_cpp_absl_status_status__testing",
- "cronet_aml_third_party_abseil_cpp_absl_status_statusor__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cord__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cord_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_functions__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_handle__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_info__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_str_format_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_strings__testing",
- "cronet_aml_third_party_abseil_cpp_absl_synchronization_graphcycles_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_synchronization_synchronization__testing",
- "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_civil_time__testing",
- "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_time_zone__testing",
- "cronet_aml_third_party_abseil_cpp_absl_time_time__testing",
- "cronet_aml_third_party_abseil_cpp_absl_types_bad_optional_access__testing",
- "cronet_aml_third_party_abseil_cpp_absl_types_bad_variant_access__testing",
- "cronet_aml_third_party_android_ndk_cpu_features__testing",
- "cronet_aml_third_party_ashmem_ashmem__testing",
- "cronet_aml_third_party_boringssl_boringssl__testing",
- "cronet_aml_third_party_boringssl_boringssl_asm__testing",
- "cronet_aml_third_party_brotli_common__testing",
- "cronet_aml_third_party_brotli_dec__testing",
- "cronet_aml_third_party_icu_icui18n__testing",
- "cronet_aml_third_party_icu_icuuc_private__testing",
- "cronet_aml_third_party_libevent_libevent__testing",
- "cronet_aml_third_party_modp_b64_modp_b64__testing",
- "cronet_aml_third_party_protobuf_protobuf_lite__testing",
- "cronet_aml_url_url__testing",
- ],
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DGOOGLE_PROTOBUF_INTERNAL_DONATE_STEAL_INLINE=0",
- "-DGOOGLE_PROTOBUF_NO_RTTI",
- "-DGOOGLE_PROTOBUF_NO_STATIC_INITIALIZER",
- "-DHAVE_PTHREAD",
- "-DHAVE_SYS_UIO_H",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_FORTIFY_SOURCE=2",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D__STDC_CONSTANT_MACROS",
- "-D__STDC_FORMAT_MACROS",
- "-Oz",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "net/third_party/quiche/overrides/",
- "net/third_party/quiche/src/",
- "net/third_party/quiche/src/quiche/common/platform/default/",
- "third_party/abseil-cpp/",
- "third_party/boringssl/src/include/",
- "third_party/protobuf/src/",
- ],
- cpp_std: "c++17",
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- "-Wl,--script,external/cronet/base/android/library_loader/anchor_functions.lds",
- "-Wl,-wrap,asprintf",
- "-Wl,-wrap,calloc",
- "-Wl,-wrap,free",
- "-Wl,-wrap,getcwd",
- "-Wl,-wrap,malloc",
- "-Wl,-wrap,malloc_usable_size",
- "-Wl,-wrap,memalign",
- "-Wl,-wrap,posix_memalign",
- "-Wl,-wrap,pvalloc",
- "-Wl,-wrap,realloc",
- "-Wl,-wrap,realpath",
- "-Wl,-wrap,strdup",
- "-Wl,-wrap,strndup",
- "-Wl,-wrap,valloc",
- "-Wl,-wrap,vasprintf",
- ],
- target: {
- android_arm: {
- cflags: [
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-fstack-protector",
- "-msse3",
- ],
- },
- },
-}
-
-// GN: //net:test_support__testing
-cc_library_static {
- name: "cronet_aml_net_test_support__testing",
- srcs: [
- "net/base/connection_endpoint_metadata_test_util.cc",
- "net/base/load_timing_info_test_util.cc",
- "net/base/mock_file_stream.cc",
- "net/base/mock_network_change_notifier.cc",
- "net/base/test_completion_callback.cc",
- "net/base/test_data_stream.cc",
- "net/cert/mock_cert_net_fetcher.cc",
- "net/cert/mock_cert_verifier.cc",
- "net/cert/mock_client_cert_verifier.cc",
- "net/cookies/cookie_change_dispatcher_test_helpers.cc",
- "net/cookies/cookie_monster_store_test.cc",
- "net/cookies/cookie_store_test_callbacks.cc",
- "net/cookies/cookie_store_test_helpers.cc",
- "net/cookies/test_cookie_access_delegate.cc",
- "net/disk_cache/disk_cache_test_base.cc",
- "net/disk_cache/disk_cache_test_util.cc",
- "net/disk_cache/mock/mock_backend_impl.cc",
- "net/disk_cache/mock/mock_entry_impl.cc",
- "net/filter/filter_source_stream_test_util.cc",
- "net/filter/mock_source_stream.cc",
- "net/http/http_stream_factory_test_util.cc",
- "net/http/http_transaction_test_util.cc",
- "net/http/mock_http_cache.cc",
- "net/http/transport_security_state_test_util.cc",
- "net/log/test_net_log.cc",
- "net/log/test_net_log_util.cc",
- "net/network_error_logging/mock_persistent_nel_store.cc",
- "net/network_error_logging/network_error_logging_test_util.cc",
- "net/nqe/network_quality_estimator_test_util.cc",
- "net/proxy_resolution/mock_pac_file_fetcher.cc",
- "net/proxy_resolution/mock_proxy_resolver.cc",
- "net/proxy_resolution/proxy_config_service_common_unittest.cc",
- "net/quic/quic_test_packet_printer.cc",
- "net/reporting/mock_persistent_reporting_store.cc",
- "net/reporting/reporting_test_util.cc",
- "net/socket/read_buffering_stream_socket.cc",
- "net/socket/socket_test_util.cc",
- "net/socket/transport_client_socket_test_util.cc",
- "net/spdy/spdy_test_util_common.cc",
- "net/ssl/client_cert_identity_test_util.cc",
- "net/ssl/ssl_private_key_test_util.cc",
- "net/ssl/test_ssl_config_service.cc",
- "net/ssl/test_ssl_private_key.cc",
- "net/test/cert_builder.cc",
- "net/test/cert_test_util.cc",
- "net/test/ct_test_util.cc",
- "net/test/embedded_test_server/connection_tracker.cc",
- "net/test/embedded_test_server/controllable_http_response.cc",
- "net/test/embedded_test_server/default_handlers.cc",
- "net/test/embedded_test_server/embedded_test_server.cc",
- "net/test/embedded_test_server/embedded_test_server_connection_listener.cc",
- "net/test/embedded_test_server/http1_connection.cc",
- "net/test/embedded_test_server/http2_connection.cc",
- "net/test/embedded_test_server/http_connection.cc",
- "net/test/embedded_test_server/http_request.cc",
- "net/test/embedded_test_server/http_response.cc",
- "net/test/embedded_test_server/request_handler_util.cc",
- "net/test/embedded_test_server/simple_connection_listener.cc",
- "net/test/key_util.cc",
- "net/test/net_test_suite.cc",
- "net/test/quic_simple_test_server.cc",
- "net/test/revocation_builder.cc",
- "net/test/spawned_test_server/base_test_server.cc",
- "net/test/spawned_test_server/remote_test_server.cc",
- "net/test/spawned_test_server/remote_test_server_spawner_request.cc",
- "net/test/ssl_test_util.cc",
- "net/test/test_connection_cost_observer.cc",
- "net/test/test_data_directory.cc",
- "net/test/test_doh_server.cc",
- "net/test/url_request/ssl_certificate_error_job.cc",
- "net/test/url_request/url_request_failed_job.cc",
- "net/test/url_request/url_request_hanging_read_job.cc",
- "net/test/url_request/url_request_mock_data_job.cc",
- "net/url_request/url_request_test_job.cc",
- "net/url_request/url_request_test_util.cc",
- ],
- shared_libs: [
- "libandroid",
- "liblog",
- "libz",
- ],
- static_libs: [
- "cronet_aml_base_allocator_partition_allocator_partition_alloc__testing",
- "cronet_aml_base_base__testing",
- "cronet_aml_base_base_static__testing",
- "cronet_aml_base_i18n__testing",
- "cronet_aml_base_nodebug_assertion__testing",
- "cronet_aml_base_test_test_config__testing",
- "cronet_aml_base_test_test_support__testing",
- "cronet_aml_base_third_party_double_conversion_double_conversion__testing",
- "cronet_aml_base_third_party_dynamic_annotations_dynamic_annotations__testing",
- "cronet_aml_crypto_crypto__testing",
- "cronet_aml_net_dns_dns__testing",
- "cronet_aml_net_dns_public_public__testing",
- "cronet_aml_net_dns_test_support__testing",
- "cronet_aml_net_gtest_util__testing",
- "cronet_aml_net_http_transport_security_state_generated_files__testing",
- "cronet_aml_net_net__testing",
- "cronet_aml_net_net_deps__testing",
- "cronet_aml_net_net_public_deps__testing",
- "cronet_aml_net_preload_decoder__testing",
- "cronet_aml_net_quic_test_flags_utils__testing",
- "cronet_aml_net_simple_quic_tools__testing",
- "cronet_aml_net_third_party_quiche_quiche__testing",
- "cronet_aml_net_third_party_quiche_quiche_tool_support__testing",
- "cronet_aml_net_tools_tld_cleanup_tld_cleanup__testing",
- "cronet_aml_net_traffic_annotation_traffic_annotation__testing",
- "cronet_aml_net_uri_template__testing",
- "cronet_aml_testing_gtest_gtest__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_base__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_log_severity__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_malloc_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_raw_logging_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_spinlock_wait__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_strerror__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_throw_delegate__testing",
- "cronet_aml_third_party_abseil_cpp_absl_container_hashtablez_sampler__testing",
- "cronet_aml_third_party_abseil_cpp_absl_container_raw_hash_set__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_debugging_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_demangle_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_examine_stack__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_failure_signal_handler__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_stacktrace__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_symbolize__testing",
- "cronet_aml_third_party_abseil_cpp_absl_hash_city__testing",
- "cronet_aml_third_party_abseil_cpp_absl_hash_hash__testing",
- "cronet_aml_third_party_abseil_cpp_absl_hash_low_level_hash__testing",
- "cronet_aml_third_party_abseil_cpp_absl_numeric_int128__testing",
- "cronet_aml_third_party_abseil_cpp_absl_profiling_exponential_biased__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_distributions__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_platform__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_pool_urbg__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_hwaes__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_hwaes_impl__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_slow__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_seed_material__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_seed_gen_exception__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_seed_sequences__testing",
- "cronet_aml_third_party_abseil_cpp_absl_status_status__testing",
- "cronet_aml_third_party_abseil_cpp_absl_status_statusor__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cord__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cord_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_functions__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_handle__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_info__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_str_format_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_strings__testing",
- "cronet_aml_third_party_abseil_cpp_absl_synchronization_graphcycles_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_synchronization_synchronization__testing",
- "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_civil_time__testing",
- "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_time_zone__testing",
- "cronet_aml_third_party_abseil_cpp_absl_time_time__testing",
- "cronet_aml_third_party_abseil_cpp_absl_types_bad_optional_access__testing",
- "cronet_aml_third_party_abseil_cpp_absl_types_bad_variant_access__testing",
- "cronet_aml_third_party_android_ndk_cpu_features__testing",
- "cronet_aml_third_party_ashmem_ashmem__testing",
- "cronet_aml_third_party_boringssl_boringssl__testing",
- "cronet_aml_third_party_boringssl_boringssl_asm__testing",
- "cronet_aml_third_party_brotli_common__testing",
- "cronet_aml_third_party_brotli_dec__testing",
- "cronet_aml_third_party_ced_ced__testing",
- "cronet_aml_third_party_googletest_gmock__testing",
- "cronet_aml_third_party_googletest_gtest__testing",
- "cronet_aml_third_party_icu_icui18n__testing",
- "cronet_aml_third_party_icu_icuuc_private__testing",
- "cronet_aml_third_party_libevent_libevent__testing",
- "cronet_aml_third_party_libxml_libxml__testing",
- "cronet_aml_third_party_libxml_libxml_utils__testing",
- "cronet_aml_third_party_libxml_xml_reader__testing",
- "cronet_aml_third_party_modp_b64_modp_b64__testing",
- "cronet_aml_third_party_protobuf_protobuf_lite__testing",
- "cronet_aml_url_url__testing",
- ],
- generated_headers: [
- "cronet_aml_net_http_transport_security_state_unittest_data_default__testing",
- ],
- export_generated_headers: [
- "cronet_aml_net_http_transport_security_state_unittest_data_default__testing",
- ],
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DGOOGLE_PROTOBUF_INTERNAL_DONATE_STEAL_INLINE=0",
- "-DGOOGLE_PROTOBUF_NO_RTTI",
- "-DGOOGLE_PROTOBUF_NO_STATIC_INITIALIZER",
- "-DGTEST_API_=",
- "-DGTEST_HAS_ABSL=1",
- "-DGTEST_HAS_POSIX_RE=0",
- "-DGTEST_HAS_TR1_TUPLE=0",
- "-DGTEST_LANG_CXX11=1",
- "-DHAVE_PTHREAD",
- "-DHAVE_SYS_UIO_H",
- "-DICU_UTIL_DATA_IMPL=ICU_UTIL_DATA_FILE",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-DUNIT_TEST",
- "-DUSE_CHROMIUM_ICU=1",
- "-DUSE_REMOTE_TEST_SERVER",
- "-DU_ENABLE_DYLOAD=0",
- "-DU_ENABLE_RESOURCE_TRACING=0",
- "-DU_ENABLE_TRACING=1",
- "-DU_STATIC_IMPLEMENTATION",
- "-DU_USING_ICU_NAMESPACE=0",
- "-D_FORTIFY_SOURCE=2",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D__STDC_CONSTANT_MACROS",
- "-D__STDC_FORMAT_MACROS",
- "-Oz",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "net/third_party/quiche/overrides/",
- "net/third_party/quiche/src/",
- "net/third_party/quiche/src/quiche/common/platform/default/",
- "third_party/abseil-cpp/",
- "third_party/boringssl/src/include/",
- "third_party/ced/src/",
- "third_party/googletest/custom/",
- "third_party/googletest/src/googlemock/include/",
- "third_party/googletest/src/googletest/include/",
- "third_party/icu/source/common/",
- "third_party/icu/source/i18n/",
- "third_party/protobuf/src/",
- ],
- cpp_std: "c++17",
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- "-Wl,--script,external/cronet/base/android/library_loader/anchor_functions.lds",
- "-Wl,-wrap,asprintf",
- "-Wl,-wrap,calloc",
- "-Wl,-wrap,free",
- "-Wl,-wrap,getcwd",
- "-Wl,-wrap,malloc",
- "-Wl,-wrap,malloc_usable_size",
- "-Wl,-wrap,memalign",
- "-Wl,-wrap,posix_memalign",
- "-Wl,-wrap,pvalloc",
- "-Wl,-wrap,realloc",
- "-Wl,-wrap,realpath",
- "-Wl,-wrap,strdup",
- "-Wl,-wrap,strndup",
- "-Wl,-wrap,valloc",
- "-Wl,-wrap,vasprintf",
- ],
- target: {
- android_arm: {
- cflags: [
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-fstack-protector",
- "-msse3",
- ],
- },
- },
-}
-
-// GN: //net/third_party/quiche:net_quic_proto__testing
-cc_genrule {
- name: "cronet_aml_net_third_party_quiche_net_quic_proto__testing_gen",
- srcs: [
- "net/third_party/quiche/src/quiche/quic/core/proto/cached_network_parameters.proto",
- "net/third_party/quiche/src/quiche/quic/core/proto/crypto_server_config.proto",
- "net/third_party/quiche/src/quiche/quic/core/proto/source_address_token.proto",
- ],
- tools: [
- "cronet_aml_third_party_protobuf_protoc",
- ],
- cmd: "$(location cronet_aml_third_party_protobuf_protoc) --proto_path=external/cronet/net/third_party/quiche/src --cpp_out=lite=true:$(genDir)/external/cronet/net/third_party/quiche/src/ $(in)",
- out: [
- "external/cronet/net/third_party/quiche/src/quiche/quic/core/proto/cached_network_parameters.pb.cc",
- "external/cronet/net/third_party/quiche/src/quiche/quic/core/proto/crypto_server_config.pb.cc",
- "external/cronet/net/third_party/quiche/src/quiche/quic/core/proto/source_address_token.pb.cc",
- ],
- apex_available: [
- "com.android.tethering",
- ],
-}
-
-// GN: //net/third_party/quiche:net_quic_proto__testing
-cc_genrule {
- name: "cronet_aml_net_third_party_quiche_net_quic_proto__testing_gen_headers",
- srcs: [
- "net/third_party/quiche/src/quiche/quic/core/proto/cached_network_parameters.proto",
- "net/third_party/quiche/src/quiche/quic/core/proto/crypto_server_config.proto",
- "net/third_party/quiche/src/quiche/quic/core/proto/source_address_token.proto",
- ],
- tools: [
- "cronet_aml_third_party_protobuf_protoc",
- ],
- cmd: "$(location cronet_aml_third_party_protobuf_protoc) --proto_path=external/cronet/net/third_party/quiche/src --cpp_out=lite=true:$(genDir)/external/cronet/net/third_party/quiche/src/ $(in)",
- out: [
- "external/cronet/net/third_party/quiche/src/quiche/quic/core/proto/cached_network_parameters.pb.h",
- "external/cronet/net/third_party/quiche/src/quiche/quic/core/proto/crypto_server_config.pb.h",
- "external/cronet/net/third_party/quiche/src/quiche/quic/core/proto/source_address_token.pb.h",
- ],
- export_include_dirs: [
- ".",
- "net/third_party/quiche/src",
- "protos",
- ],
- apex_available: [
- "com.android.tethering",
- ],
-}
-
-// GN: //net/third_party/quiche:net_quic_proto
-cc_genrule {
- name: "cronet_aml_net_third_party_quiche_net_quic_proto_gen",
- srcs: [
- "net/third_party/quiche/src/quiche/quic/core/proto/cached_network_parameters.proto",
- "net/third_party/quiche/src/quiche/quic/core/proto/crypto_server_config.proto",
- "net/third_party/quiche/src/quiche/quic/core/proto/source_address_token.proto",
- ],
- tools: [
- "cronet_aml_third_party_protobuf_protoc",
- ],
- cmd: "$(location cronet_aml_third_party_protobuf_protoc) --proto_path=external/cronet/net/third_party/quiche/src --cpp_out=lite=true:$(genDir)/external/cronet/net/third_party/quiche/src/ $(in)",
- out: [
- "external/cronet/net/third_party/quiche/src/quiche/quic/core/proto/cached_network_parameters.pb.cc",
- "external/cronet/net/third_party/quiche/src/quiche/quic/core/proto/crypto_server_config.pb.cc",
- "external/cronet/net/third_party/quiche/src/quiche/quic/core/proto/source_address_token.pb.cc",
- ],
- apex_available: [
- "com.android.tethering",
- ],
-}
-
-// GN: //net/third_party/quiche:net_quic_proto
-cc_genrule {
- name: "cronet_aml_net_third_party_quiche_net_quic_proto_gen_headers",
- srcs: [
- "net/third_party/quiche/src/quiche/quic/core/proto/cached_network_parameters.proto",
- "net/third_party/quiche/src/quiche/quic/core/proto/crypto_server_config.proto",
- "net/third_party/quiche/src/quiche/quic/core/proto/source_address_token.proto",
- ],
- tools: [
- "cronet_aml_third_party_protobuf_protoc",
- ],
- cmd: "$(location cronet_aml_third_party_protobuf_protoc) --proto_path=external/cronet/net/third_party/quiche/src --cpp_out=lite=true:$(genDir)/external/cronet/net/third_party/quiche/src/ $(in)",
- out: [
- "external/cronet/net/third_party/quiche/src/quiche/quic/core/proto/cached_network_parameters.pb.h",
- "external/cronet/net/third_party/quiche/src/quiche/quic/core/proto/crypto_server_config.pb.h",
- "external/cronet/net/third_party/quiche/src/quiche/quic/core/proto/source_address_token.pb.h",
- ],
- export_include_dirs: [
- ".",
- "net/third_party/quiche/src",
- "protos",
- ],
- apex_available: [
- "com.android.tethering",
- ],
-}
-
-// GN: //net/third_party/quiche:net_quic_test_tools_proto__testing
-cc_genrule {
- name: "cronet_aml_net_third_party_quiche_net_quic_test_tools_proto__testing_gen",
- srcs: [
- "net/third_party/quiche/src/quiche/quic/test_tools/send_algorithm_test_result.proto",
- ],
- tools: [
- "cronet_aml_third_party_protobuf_protoc",
- ],
- cmd: "$(location cronet_aml_third_party_protobuf_protoc) --proto_path=external/cronet/net/third_party/quiche/src/quiche/quic/test_tools --cpp_out=lite=true:$(genDir)/external/cronet/net/third_party/quiche/src/quiche/quic/test_tools/ $(in)",
- out: [
- "external/cronet/net/third_party/quiche/src/quiche/quic/test_tools/send_algorithm_test_result.pb.cc",
- ],
- apex_available: [
- "com.android.tethering",
- ],
-}
-
-// GN: //net/third_party/quiche:net_quic_test_tools_proto__testing
-cc_genrule {
- name: "cronet_aml_net_third_party_quiche_net_quic_test_tools_proto__testing_gen_headers",
- srcs: [
- "net/third_party/quiche/src/quiche/quic/test_tools/send_algorithm_test_result.proto",
- ],
- tools: [
- "cronet_aml_third_party_protobuf_protoc",
- ],
- cmd: "$(location cronet_aml_third_party_protobuf_protoc) --proto_path=external/cronet/net/third_party/quiche/src/quiche/quic/test_tools --cpp_out=lite=true:$(genDir)/external/cronet/net/third_party/quiche/src/quiche/quic/test_tools/ $(in)",
- out: [
- "external/cronet/net/third_party/quiche/src/quiche/quic/test_tools/send_algorithm_test_result.pb.h",
- ],
- export_include_dirs: [
- ".",
- "net/third_party/quiche/src/quiche/quic/test_tools",
- "protos",
- ],
- apex_available: [
- "com.android.tethering",
- ],
-}
-
-// GN: //net/third_party/quiche:net_quic_test_tools_proto
-cc_genrule {
- name: "cronet_aml_net_third_party_quiche_net_quic_test_tools_proto_gen",
- srcs: [
- "net/third_party/quiche/src/quiche/quic/test_tools/send_algorithm_test_result.proto",
- ],
- tools: [
- "cronet_aml_third_party_protobuf_protoc",
- ],
- cmd: "$(location cronet_aml_third_party_protobuf_protoc) --proto_path=external/cronet/net/third_party/quiche/src/quiche/quic/test_tools --cpp_out=lite=true:$(genDir)/external/cronet/net/third_party/quiche/src/quiche/quic/test_tools/ $(in)",
- out: [
- "external/cronet/net/third_party/quiche/src/quiche/quic/test_tools/send_algorithm_test_result.pb.cc",
- ],
- apex_available: [
- "com.android.tethering",
- ],
-}
-
-// GN: //net/third_party/quiche:net_quic_test_tools_proto
-cc_genrule {
- name: "cronet_aml_net_third_party_quiche_net_quic_test_tools_proto_gen_headers",
- srcs: [
- "net/third_party/quiche/src/quiche/quic/test_tools/send_algorithm_test_result.proto",
- ],
- tools: [
- "cronet_aml_third_party_protobuf_protoc",
- ],
- cmd: "$(location cronet_aml_third_party_protobuf_protoc) --proto_path=external/cronet/net/third_party/quiche/src/quiche/quic/test_tools --cpp_out=lite=true:$(genDir)/external/cronet/net/third_party/quiche/src/quiche/quic/test_tools/ $(in)",
- out: [
- "external/cronet/net/third_party/quiche/src/quiche/quic/test_tools/send_algorithm_test_result.pb.h",
- ],
- export_include_dirs: [
- ".",
- "net/third_party/quiche/src/quiche/quic/test_tools",
- "protos",
- ],
- apex_available: [
- "com.android.tethering",
- ],
-}
-
-// GN: //net/third_party/quiche:quiche
-cc_library_static {
- name: "cronet_aml_net_third_party_quiche_quiche",
- srcs: [
- ":cronet_aml_net_third_party_quiche_net_quic_proto_gen",
- "net/third_party/quiche/overrides/quiche_platform_impl/quiche_mutex_impl.cc",
- "net/third_party/quiche/overrides/quiche_platform_impl/quiche_time_utils_impl.cc",
- "net/third_party/quiche/overrides/quiche_platform_impl/quiche_url_utils_impl.cc",
- "net/third_party/quiche/src/quiche/common/platform/api/quiche_hostname_utils.cc",
- "net/third_party/quiche/src/quiche/common/platform/api/quiche_mutex.cc",
- "net/third_party/quiche/src/quiche/common/platform/default/quiche_platform_impl/quiche_flags_impl.cc",
- "net/third_party/quiche/src/quiche/common/quiche_buffer_allocator.cc",
- "net/third_party/quiche/src/quiche/common/quiche_crypto_logging.cc",
- "net/third_party/quiche/src/quiche/common/quiche_data_reader.cc",
- "net/third_party/quiche/src/quiche/common/quiche_data_writer.cc",
- "net/third_party/quiche/src/quiche/common/quiche_ip_address.cc",
- "net/third_party/quiche/src/quiche/common/quiche_ip_address_family.cc",
- "net/third_party/quiche/src/quiche/common/quiche_mem_slice_storage.cc",
- "net/third_party/quiche/src/quiche/common/quiche_random.cc",
- "net/third_party/quiche/src/quiche/common/quiche_text_utils.cc",
- "net/third_party/quiche/src/quiche/common/simple_buffer_allocator.cc",
- "net/third_party/quiche/src/quiche/common/structured_headers.cc",
- "net/third_party/quiche/src/quiche/http2/adapter/event_forwarder.cc",
- "net/third_party/quiche/src/quiche/http2/adapter/header_validator.cc",
- "net/third_party/quiche/src/quiche/http2/adapter/http2_protocol.cc",
- "net/third_party/quiche/src/quiche/http2/adapter/http2_util.cc",
- "net/third_party/quiche/src/quiche/http2/adapter/noop_header_validator.cc",
- "net/third_party/quiche/src/quiche/http2/adapter/oghttp2_adapter.cc",
- "net/third_party/quiche/src/quiche/http2/adapter/oghttp2_session.cc",
- "net/third_party/quiche/src/quiche/http2/adapter/oghttp2_util.cc",
- "net/third_party/quiche/src/quiche/http2/adapter/window_manager.cc",
- "net/third_party/quiche/src/quiche/http2/core/http2_trace_logging.cc",
- "net/third_party/quiche/src/quiche/http2/decoder/decode_buffer.cc",
- "net/third_party/quiche/src/quiche/http2/decoder/decode_http2_structures.cc",
- "net/third_party/quiche/src/quiche/http2/decoder/decode_status.cc",
- "net/third_party/quiche/src/quiche/http2/decoder/frame_decoder_state.cc",
- "net/third_party/quiche/src/quiche/http2/decoder/http2_frame_decoder.cc",
- "net/third_party/quiche/src/quiche/http2/decoder/http2_frame_decoder_listener.cc",
- "net/third_party/quiche/src/quiche/http2/decoder/http2_structure_decoder.cc",
- "net/third_party/quiche/src/quiche/http2/decoder/payload_decoders/altsvc_payload_decoder.cc",
- "net/third_party/quiche/src/quiche/http2/decoder/payload_decoders/continuation_payload_decoder.cc",
- "net/third_party/quiche/src/quiche/http2/decoder/payload_decoders/data_payload_decoder.cc",
- "net/third_party/quiche/src/quiche/http2/decoder/payload_decoders/goaway_payload_decoder.cc",
- "net/third_party/quiche/src/quiche/http2/decoder/payload_decoders/headers_payload_decoder.cc",
- "net/third_party/quiche/src/quiche/http2/decoder/payload_decoders/ping_payload_decoder.cc",
- "net/third_party/quiche/src/quiche/http2/decoder/payload_decoders/priority_payload_decoder.cc",
- "net/third_party/quiche/src/quiche/http2/decoder/payload_decoders/priority_update_payload_decoder.cc",
- "net/third_party/quiche/src/quiche/http2/decoder/payload_decoders/push_promise_payload_decoder.cc",
- "net/third_party/quiche/src/quiche/http2/decoder/payload_decoders/rst_stream_payload_decoder.cc",
- "net/third_party/quiche/src/quiche/http2/decoder/payload_decoders/settings_payload_decoder.cc",
- "net/third_party/quiche/src/quiche/http2/decoder/payload_decoders/unknown_payload_decoder.cc",
- "net/third_party/quiche/src/quiche/http2/decoder/payload_decoders/window_update_payload_decoder.cc",
- "net/third_party/quiche/src/quiche/http2/hpack/decoder/hpack_block_decoder.cc",
- "net/third_party/quiche/src/quiche/http2/hpack/decoder/hpack_decoder.cc",
- "net/third_party/quiche/src/quiche/http2/hpack/decoder/hpack_decoder_listener.cc",
- "net/third_party/quiche/src/quiche/http2/hpack/decoder/hpack_decoder_state.cc",
- "net/third_party/quiche/src/quiche/http2/hpack/decoder/hpack_decoder_string_buffer.cc",
- "net/third_party/quiche/src/quiche/http2/hpack/decoder/hpack_decoder_tables.cc",
- "net/third_party/quiche/src/quiche/http2/hpack/decoder/hpack_decoding_error.cc",
- "net/third_party/quiche/src/quiche/http2/hpack/decoder/hpack_entry_decoder.cc",
- "net/third_party/quiche/src/quiche/http2/hpack/decoder/hpack_entry_decoder_listener.cc",
- "net/third_party/quiche/src/quiche/http2/hpack/decoder/hpack_entry_type_decoder.cc",
- "net/third_party/quiche/src/quiche/http2/hpack/decoder/hpack_string_decoder.cc",
- "net/third_party/quiche/src/quiche/http2/hpack/decoder/hpack_string_decoder_listener.cc",
- "net/third_party/quiche/src/quiche/http2/hpack/decoder/hpack_whole_entry_buffer.cc",
- "net/third_party/quiche/src/quiche/http2/hpack/decoder/hpack_whole_entry_listener.cc",
- "net/third_party/quiche/src/quiche/http2/hpack/http2_hpack_constants.cc",
- "net/third_party/quiche/src/quiche/http2/hpack/huffman/hpack_huffman_decoder.cc",
- "net/third_party/quiche/src/quiche/http2/hpack/huffman/hpack_huffman_encoder.cc",
- "net/third_party/quiche/src/quiche/http2/hpack/huffman/huffman_spec_tables.cc",
- "net/third_party/quiche/src/quiche/http2/hpack/varint/hpack_varint_decoder.cc",
- "net/third_party/quiche/src/quiche/http2/hpack/varint/hpack_varint_encoder.cc",
- "net/third_party/quiche/src/quiche/http2/http2_constants.cc",
- "net/third_party/quiche/src/quiche/http2/http2_structures.cc",
- "net/third_party/quiche/src/quiche/quic/core/congestion_control/bandwidth_sampler.cc",
- "net/third_party/quiche/src/quiche/quic/core/congestion_control/bbr2_drain.cc",
- "net/third_party/quiche/src/quiche/quic/core/congestion_control/bbr2_misc.cc",
- "net/third_party/quiche/src/quiche/quic/core/congestion_control/bbr2_probe_bw.cc",
- "net/third_party/quiche/src/quiche/quic/core/congestion_control/bbr2_probe_rtt.cc",
- "net/third_party/quiche/src/quiche/quic/core/congestion_control/bbr2_sender.cc",
- "net/third_party/quiche/src/quiche/quic/core/congestion_control/bbr2_startup.cc",
- "net/third_party/quiche/src/quiche/quic/core/congestion_control/bbr_sender.cc",
- "net/third_party/quiche/src/quiche/quic/core/congestion_control/cubic_bytes.cc",
- "net/third_party/quiche/src/quiche/quic/core/congestion_control/general_loss_algorithm.cc",
- "net/third_party/quiche/src/quiche/quic/core/congestion_control/hybrid_slow_start.cc",
- "net/third_party/quiche/src/quiche/quic/core/congestion_control/pacing_sender.cc",
- "net/third_party/quiche/src/quiche/quic/core/congestion_control/prr_sender.cc",
- "net/third_party/quiche/src/quiche/quic/core/congestion_control/rtt_stats.cc",
- "net/third_party/quiche/src/quiche/quic/core/congestion_control/send_algorithm_interface.cc",
- "net/third_party/quiche/src/quiche/quic/core/congestion_control/tcp_cubic_sender_bytes.cc",
- "net/third_party/quiche/src/quiche/quic/core/congestion_control/uber_loss_algorithm.cc",
- "net/third_party/quiche/src/quiche/quic/core/crypto/aead_base_decrypter.cc",
- "net/third_party/quiche/src/quiche/quic/core/crypto/aead_base_encrypter.cc",
- "net/third_party/quiche/src/quiche/quic/core/crypto/aes_128_gcm_12_decrypter.cc",
- "net/third_party/quiche/src/quiche/quic/core/crypto/aes_128_gcm_12_encrypter.cc",
- "net/third_party/quiche/src/quiche/quic/core/crypto/aes_128_gcm_decrypter.cc",
- "net/third_party/quiche/src/quiche/quic/core/crypto/aes_128_gcm_encrypter.cc",
- "net/third_party/quiche/src/quiche/quic/core/crypto/aes_256_gcm_decrypter.cc",
- "net/third_party/quiche/src/quiche/quic/core/crypto/aes_256_gcm_encrypter.cc",
- "net/third_party/quiche/src/quiche/quic/core/crypto/aes_base_decrypter.cc",
- "net/third_party/quiche/src/quiche/quic/core/crypto/aes_base_encrypter.cc",
- "net/third_party/quiche/src/quiche/quic/core/crypto/cert_compressor.cc",
- "net/third_party/quiche/src/quiche/quic/core/crypto/certificate_util.cc",
- "net/third_party/quiche/src/quiche/quic/core/crypto/certificate_view.cc",
- "net/third_party/quiche/src/quiche/quic/core/crypto/chacha20_poly1305_decrypter.cc",
- "net/third_party/quiche/src/quiche/quic/core/crypto/chacha20_poly1305_encrypter.cc",
- "net/third_party/quiche/src/quiche/quic/core/crypto/chacha20_poly1305_tls_decrypter.cc",
- "net/third_party/quiche/src/quiche/quic/core/crypto/chacha20_poly1305_tls_encrypter.cc",
- "net/third_party/quiche/src/quiche/quic/core/crypto/chacha_base_decrypter.cc",
- "net/third_party/quiche/src/quiche/quic/core/crypto/chacha_base_encrypter.cc",
- "net/third_party/quiche/src/quiche/quic/core/crypto/channel_id.cc",
- "net/third_party/quiche/src/quiche/quic/core/crypto/client_proof_source.cc",
- "net/third_party/quiche/src/quiche/quic/core/crypto/crypto_framer.cc",
- "net/third_party/quiche/src/quiche/quic/core/crypto/crypto_handshake.cc",
- "net/third_party/quiche/src/quiche/quic/core/crypto/crypto_handshake_message.cc",
- "net/third_party/quiche/src/quiche/quic/core/crypto/crypto_secret_boxer.cc",
- "net/third_party/quiche/src/quiche/quic/core/crypto/crypto_utils.cc",
- "net/third_party/quiche/src/quiche/quic/core/crypto/curve25519_key_exchange.cc",
- "net/third_party/quiche/src/quiche/quic/core/crypto/key_exchange.cc",
- "net/third_party/quiche/src/quiche/quic/core/crypto/null_decrypter.cc",
- "net/third_party/quiche/src/quiche/quic/core/crypto/null_encrypter.cc",
- "net/third_party/quiche/src/quiche/quic/core/crypto/p256_key_exchange.cc",
- "net/third_party/quiche/src/quiche/quic/core/crypto/proof_source.cc",
- "net/third_party/quiche/src/quiche/quic/core/crypto/proof_source_x509.cc",
- "net/third_party/quiche/src/quiche/quic/core/crypto/quic_client_session_cache.cc",
- "net/third_party/quiche/src/quiche/quic/core/crypto/quic_compressed_certs_cache.cc",
- "net/third_party/quiche/src/quiche/quic/core/crypto/quic_crypter.cc",
- "net/third_party/quiche/src/quiche/quic/core/crypto/quic_crypto_client_config.cc",
- "net/third_party/quiche/src/quiche/quic/core/crypto/quic_crypto_proof.cc",
- "net/third_party/quiche/src/quiche/quic/core/crypto/quic_crypto_server_config.cc",
- "net/third_party/quiche/src/quiche/quic/core/crypto/quic_decrypter.cc",
- "net/third_party/quiche/src/quiche/quic/core/crypto/quic_encrypter.cc",
- "net/third_party/quiche/src/quiche/quic/core/crypto/quic_hkdf.cc",
- "net/third_party/quiche/src/quiche/quic/core/crypto/tls_client_connection.cc",
- "net/third_party/quiche/src/quiche/quic/core/crypto/tls_connection.cc",
- "net/third_party/quiche/src/quiche/quic/core/crypto/tls_server_connection.cc",
- "net/third_party/quiche/src/quiche/quic/core/crypto/transport_parameters.cc",
- "net/third_party/quiche/src/quiche/quic/core/crypto/web_transport_fingerprint_proof_verifier.cc",
- "net/third_party/quiche/src/quiche/quic/core/deterministic_connection_id_generator.cc",
- "net/third_party/quiche/src/quiche/quic/core/frames/quic_ack_frame.cc",
- "net/third_party/quiche/src/quiche/quic/core/frames/quic_ack_frequency_frame.cc",
- "net/third_party/quiche/src/quiche/quic/core/frames/quic_blocked_frame.cc",
- "net/third_party/quiche/src/quiche/quic/core/frames/quic_connection_close_frame.cc",
- "net/third_party/quiche/src/quiche/quic/core/frames/quic_crypto_frame.cc",
- "net/third_party/quiche/src/quiche/quic/core/frames/quic_frame.cc",
- "net/third_party/quiche/src/quiche/quic/core/frames/quic_goaway_frame.cc",
- "net/third_party/quiche/src/quiche/quic/core/frames/quic_handshake_done_frame.cc",
- "net/third_party/quiche/src/quiche/quic/core/frames/quic_max_streams_frame.cc",
- "net/third_party/quiche/src/quiche/quic/core/frames/quic_message_frame.cc",
- "net/third_party/quiche/src/quiche/quic/core/frames/quic_new_connection_id_frame.cc",
- "net/third_party/quiche/src/quiche/quic/core/frames/quic_new_token_frame.cc",
- "net/third_party/quiche/src/quiche/quic/core/frames/quic_padding_frame.cc",
- "net/third_party/quiche/src/quiche/quic/core/frames/quic_path_challenge_frame.cc",
- "net/third_party/quiche/src/quiche/quic/core/frames/quic_path_response_frame.cc",
- "net/third_party/quiche/src/quiche/quic/core/frames/quic_ping_frame.cc",
- "net/third_party/quiche/src/quiche/quic/core/frames/quic_retire_connection_id_frame.cc",
- "net/third_party/quiche/src/quiche/quic/core/frames/quic_rst_stream_frame.cc",
- "net/third_party/quiche/src/quiche/quic/core/frames/quic_stop_sending_frame.cc",
- "net/third_party/quiche/src/quiche/quic/core/frames/quic_stop_waiting_frame.cc",
- "net/third_party/quiche/src/quiche/quic/core/frames/quic_stream_frame.cc",
- "net/third_party/quiche/src/quiche/quic/core/frames/quic_streams_blocked_frame.cc",
- "net/third_party/quiche/src/quiche/quic/core/frames/quic_window_update_frame.cc",
- "net/third_party/quiche/src/quiche/quic/core/http/capsule.cc",
- "net/third_party/quiche/src/quiche/quic/core/http/http_constants.cc",
- "net/third_party/quiche/src/quiche/quic/core/http/http_decoder.cc",
- "net/third_party/quiche/src/quiche/quic/core/http/http_encoder.cc",
- "net/third_party/quiche/src/quiche/quic/core/http/quic_client_promised_info.cc",
- "net/third_party/quiche/src/quiche/quic/core/http/quic_client_push_promise_index.cc",
- "net/third_party/quiche/src/quiche/quic/core/http/quic_header_list.cc",
- "net/third_party/quiche/src/quiche/quic/core/http/quic_headers_stream.cc",
- "net/third_party/quiche/src/quiche/quic/core/http/quic_receive_control_stream.cc",
- "net/third_party/quiche/src/quiche/quic/core/http/quic_send_control_stream.cc",
- "net/third_party/quiche/src/quiche/quic/core/http/quic_server_initiated_spdy_stream.cc",
- "net/third_party/quiche/src/quiche/quic/core/http/quic_server_session_base.cc",
- "net/third_party/quiche/src/quiche/quic/core/http/quic_spdy_client_session.cc",
- "net/third_party/quiche/src/quiche/quic/core/http/quic_spdy_client_session_base.cc",
- "net/third_party/quiche/src/quiche/quic/core/http/quic_spdy_client_stream.cc",
- "net/third_party/quiche/src/quiche/quic/core/http/quic_spdy_session.cc",
- "net/third_party/quiche/src/quiche/quic/core/http/quic_spdy_stream.cc",
- "net/third_party/quiche/src/quiche/quic/core/http/quic_spdy_stream_body_manager.cc",
- "net/third_party/quiche/src/quiche/quic/core/http/spdy_server_push_utils.cc",
- "net/third_party/quiche/src/quiche/quic/core/http/spdy_utils.cc",
- "net/third_party/quiche/src/quiche/quic/core/http/web_transport_http3.cc",
- "net/third_party/quiche/src/quiche/quic/core/http/web_transport_stream_adapter.cc",
- "net/third_party/quiche/src/quiche/quic/core/legacy_quic_stream_id_manager.cc",
- "net/third_party/quiche/src/quiche/quic/core/qpack/qpack_blocking_manager.cc",
- "net/third_party/quiche/src/quiche/quic/core/qpack/qpack_decoded_headers_accumulator.cc",
- "net/third_party/quiche/src/quiche/quic/core/qpack/qpack_decoder.cc",
- "net/third_party/quiche/src/quiche/quic/core/qpack/qpack_decoder_stream_receiver.cc",
- "net/third_party/quiche/src/quiche/quic/core/qpack/qpack_decoder_stream_sender.cc",
- "net/third_party/quiche/src/quiche/quic/core/qpack/qpack_encoder.cc",
- "net/third_party/quiche/src/quiche/quic/core/qpack/qpack_encoder_stream_receiver.cc",
- "net/third_party/quiche/src/quiche/quic/core/qpack/qpack_encoder_stream_sender.cc",
- "net/third_party/quiche/src/quiche/quic/core/qpack/qpack_header_table.cc",
- "net/third_party/quiche/src/quiche/quic/core/qpack/qpack_index_conversions.cc",
- "net/third_party/quiche/src/quiche/quic/core/qpack/qpack_instruction_decoder.cc",
- "net/third_party/quiche/src/quiche/quic/core/qpack/qpack_instruction_encoder.cc",
- "net/third_party/quiche/src/quiche/quic/core/qpack/qpack_instructions.cc",
- "net/third_party/quiche/src/quiche/quic/core/qpack/qpack_progressive_decoder.cc",
- "net/third_party/quiche/src/quiche/quic/core/qpack/qpack_receive_stream.cc",
- "net/third_party/quiche/src/quiche/quic/core/qpack/qpack_required_insert_count.cc",
- "net/third_party/quiche/src/quiche/quic/core/qpack/qpack_send_stream.cc",
- "net/third_party/quiche/src/quiche/quic/core/qpack/qpack_static_table.cc",
- "net/third_party/quiche/src/quiche/quic/core/qpack/value_splitting_header_list.cc",
- "net/third_party/quiche/src/quiche/quic/core/quic_ack_listener_interface.cc",
- "net/third_party/quiche/src/quiche/quic/core/quic_alarm.cc",
- "net/third_party/quiche/src/quiche/quic/core/quic_bandwidth.cc",
- "net/third_party/quiche/src/quiche/quic/core/quic_chaos_protector.cc",
- "net/third_party/quiche/src/quiche/quic/core/quic_clock.cc",
- "net/third_party/quiche/src/quiche/quic/core/quic_coalesced_packet.cc",
- "net/third_party/quiche/src/quiche/quic/core/quic_config.cc",
- "net/third_party/quiche/src/quiche/quic/core/quic_connection.cc",
- "net/third_party/quiche/src/quiche/quic/core/quic_connection_context.cc",
- "net/third_party/quiche/src/quiche/quic/core/quic_connection_id.cc",
- "net/third_party/quiche/src/quiche/quic/core/quic_connection_id_manager.cc",
- "net/third_party/quiche/src/quiche/quic/core/quic_connection_stats.cc",
- "net/third_party/quiche/src/quiche/quic/core/quic_constants.cc",
- "net/third_party/quiche/src/quiche/quic/core/quic_control_frame_manager.cc",
- "net/third_party/quiche/src/quiche/quic/core/quic_crypto_client_handshaker.cc",
- "net/third_party/quiche/src/quiche/quic/core/quic_crypto_client_stream.cc",
- "net/third_party/quiche/src/quiche/quic/core/quic_crypto_handshaker.cc",
- "net/third_party/quiche/src/quiche/quic/core/quic_crypto_server_stream.cc",
- "net/third_party/quiche/src/quiche/quic/core/quic_crypto_server_stream_base.cc",
- "net/third_party/quiche/src/quiche/quic/core/quic_crypto_stream.cc",
- "net/third_party/quiche/src/quiche/quic/core/quic_data_reader.cc",
- "net/third_party/quiche/src/quiche/quic/core/quic_data_writer.cc",
- "net/third_party/quiche/src/quiche/quic/core/quic_datagram_queue.cc",
- "net/third_party/quiche/src/quiche/quic/core/quic_error_codes.cc",
- "net/third_party/quiche/src/quiche/quic/core/quic_flow_controller.cc",
- "net/third_party/quiche/src/quiche/quic/core/quic_framer.cc",
- "net/third_party/quiche/src/quiche/quic/core/quic_idle_network_detector.cc",
- "net/third_party/quiche/src/quiche/quic/core/quic_legacy_version_encapsulator.cc",
- "net/third_party/quiche/src/quiche/quic/core/quic_mtu_discovery.cc",
- "net/third_party/quiche/src/quiche/quic/core/quic_network_blackhole_detector.cc",
- "net/third_party/quiche/src/quiche/quic/core/quic_packet_creator.cc",
- "net/third_party/quiche/src/quiche/quic/core/quic_packet_number.cc",
- "net/third_party/quiche/src/quiche/quic/core/quic_packets.cc",
- "net/third_party/quiche/src/quiche/quic/core/quic_path_validator.cc",
- "net/third_party/quiche/src/quiche/quic/core/quic_ping_manager.cc",
- "net/third_party/quiche/src/quiche/quic/core/quic_received_packet_manager.cc",
- "net/third_party/quiche/src/quiche/quic/core/quic_sent_packet_manager.cc",
- "net/third_party/quiche/src/quiche/quic/core/quic_server_id.cc",
- "net/third_party/quiche/src/quiche/quic/core/quic_session.cc",
- "net/third_party/quiche/src/quiche/quic/core/quic_socket_address_coder.cc",
- "net/third_party/quiche/src/quiche/quic/core/quic_stream.cc",
- "net/third_party/quiche/src/quiche/quic/core/quic_stream_id_manager.cc",
- "net/third_party/quiche/src/quiche/quic/core/quic_stream_send_buffer.cc",
- "net/third_party/quiche/src/quiche/quic/core/quic_stream_sequencer.cc",
- "net/third_party/quiche/src/quiche/quic/core/quic_stream_sequencer_buffer.cc",
- "net/third_party/quiche/src/quiche/quic/core/quic_sustained_bandwidth_recorder.cc",
- "net/third_party/quiche/src/quiche/quic/core/quic_tag.cc",
- "net/third_party/quiche/src/quiche/quic/core/quic_time.cc",
- "net/third_party/quiche/src/quiche/quic/core/quic_transmission_info.cc",
- "net/third_party/quiche/src/quiche/quic/core/quic_types.cc",
- "net/third_party/quiche/src/quiche/quic/core/quic_unacked_packet_map.cc",
- "net/third_party/quiche/src/quiche/quic/core/quic_utils.cc",
- "net/third_party/quiche/src/quiche/quic/core/quic_version_manager.cc",
- "net/third_party/quiche/src/quiche/quic/core/quic_versions.cc",
- "net/third_party/quiche/src/quiche/quic/core/quic_write_blocked_list.cc",
- "net/third_party/quiche/src/quiche/quic/core/tls_client_handshaker.cc",
- "net/third_party/quiche/src/quiche/quic/core/tls_handshaker.cc",
- "net/third_party/quiche/src/quiche/quic/core/tls_server_handshaker.cc",
- "net/third_party/quiche/src/quiche/quic/core/uber_quic_stream_id_manager.cc",
- "net/third_party/quiche/src/quiche/quic/core/uber_received_packet_manager.cc",
- "net/third_party/quiche/src/quiche/quic/platform/api/quic_socket_address.cc",
- "net/third_party/quiche/src/quiche/spdy/core/array_output_buffer.cc",
- "net/third_party/quiche/src/quiche/spdy/core/hpack/hpack_constants.cc",
- "net/third_party/quiche/src/quiche/spdy/core/hpack/hpack_decoder_adapter.cc",
- "net/third_party/quiche/src/quiche/spdy/core/hpack/hpack_encoder.cc",
- "net/third_party/quiche/src/quiche/spdy/core/hpack/hpack_entry.cc",
- "net/third_party/quiche/src/quiche/spdy/core/hpack/hpack_header_table.cc",
- "net/third_party/quiche/src/quiche/spdy/core/hpack/hpack_output_stream.cc",
- "net/third_party/quiche/src/quiche/spdy/core/hpack/hpack_static_table.cc",
- "net/third_party/quiche/src/quiche/spdy/core/http2_frame_decoder_adapter.cc",
- "net/third_party/quiche/src/quiche/spdy/core/http2_header_block.cc",
- "net/third_party/quiche/src/quiche/spdy/core/http2_header_storage.cc",
- "net/third_party/quiche/src/quiche/spdy/core/recording_headers_handler.cc",
- "net/third_party/quiche/src/quiche/spdy/core/spdy_alt_svc_wire_format.cc",
- "net/third_party/quiche/src/quiche/spdy/core/spdy_frame_builder.cc",
- "net/third_party/quiche/src/quiche/spdy/core/spdy_framer.cc",
- "net/third_party/quiche/src/quiche/spdy/core/spdy_no_op_visitor.cc",
- "net/third_party/quiche/src/quiche/spdy/core/spdy_pinnable_buffer_piece.cc",
- "net/third_party/quiche/src/quiche/spdy/core/spdy_prefixed_buffer_reader.cc",
- "net/third_party/quiche/src/quiche/spdy/core/spdy_protocol.cc",
- "net/third_party/quiche/src/quiche/spdy/core/spdy_simple_arena.cc",
- ],
- shared_libs: [
- "libandroid",
- "liblog",
- "libprotobuf-cpp-lite",
- "libz",
- ],
- static_libs: [
- "cronet_aml_base_allocator_partition_allocator_partition_alloc",
- "cronet_aml_base_base",
- "cronet_aml_base_base_static",
- "cronet_aml_base_nodebug_assertion",
- "cronet_aml_base_third_party_double_conversion_double_conversion",
- "cronet_aml_base_third_party_dynamic_annotations_dynamic_annotations",
- "cronet_aml_net_uri_template",
- "cronet_aml_third_party_abseil_cpp_absl_base_base",
- "cronet_aml_third_party_abseil_cpp_absl_base_log_severity",
- "cronet_aml_third_party_abseil_cpp_absl_base_malloc_internal",
- "cronet_aml_third_party_abseil_cpp_absl_base_raw_logging_internal",
- "cronet_aml_third_party_abseil_cpp_absl_base_spinlock_wait",
- "cronet_aml_third_party_abseil_cpp_absl_base_strerror",
- "cronet_aml_third_party_abseil_cpp_absl_base_throw_delegate",
- "cronet_aml_third_party_abseil_cpp_absl_container_hashtablez_sampler",
- "cronet_aml_third_party_abseil_cpp_absl_container_raw_hash_set",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_debugging_internal",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_demangle_internal",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_examine_stack",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_failure_signal_handler",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_stacktrace",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_symbolize",
- "cronet_aml_third_party_abseil_cpp_absl_hash_city",
- "cronet_aml_third_party_abseil_cpp_absl_hash_hash",
- "cronet_aml_third_party_abseil_cpp_absl_hash_low_level_hash",
- "cronet_aml_third_party_abseil_cpp_absl_numeric_int128",
- "cronet_aml_third_party_abseil_cpp_absl_profiling_exponential_biased",
- "cronet_aml_third_party_abseil_cpp_absl_random_distributions",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_platform",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_pool_urbg",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_hwaes",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_hwaes_impl",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_slow",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_seed_material",
- "cronet_aml_third_party_abseil_cpp_absl_random_seed_gen_exception",
- "cronet_aml_third_party_abseil_cpp_absl_random_seed_sequences",
- "cronet_aml_third_party_abseil_cpp_absl_status_status",
- "cronet_aml_third_party_abseil_cpp_absl_status_statusor",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cord",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cord_internal",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_functions",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_handle",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_info",
- "cronet_aml_third_party_abseil_cpp_absl_strings_internal",
- "cronet_aml_third_party_abseil_cpp_absl_strings_str_format_internal",
- "cronet_aml_third_party_abseil_cpp_absl_strings_strings",
- "cronet_aml_third_party_abseil_cpp_absl_synchronization_graphcycles_internal",
- "cronet_aml_third_party_abseil_cpp_absl_synchronization_synchronization",
- "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_civil_time",
- "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_time_zone",
- "cronet_aml_third_party_abseil_cpp_absl_time_time",
- "cronet_aml_third_party_abseil_cpp_absl_types_bad_optional_access",
- "cronet_aml_third_party_abseil_cpp_absl_types_bad_variant_access",
- "cronet_aml_third_party_android_ndk_cpu_features",
- "cronet_aml_third_party_ashmem_ashmem",
- "cronet_aml_third_party_boringssl_boringssl",
- "cronet_aml_third_party_boringssl_boringssl_asm",
- "cronet_aml_third_party_icu_icui18n",
- "cronet_aml_third_party_icu_icuuc_private",
- "cronet_aml_third_party_libevent_libevent",
- "cronet_aml_third_party_modp_b64_modp_b64",
- "cronet_aml_third_party_protobuf_protobuf_lite",
- "cronet_aml_url_url",
- ],
- generated_headers: [
- "cronet_aml_net_third_party_quiche_net_quic_proto_gen_headers",
- ],
- export_generated_headers: [
- "cronet_aml_net_third_party_quiche_net_quic_proto_gen_headers",
- ],
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DGOOGLE_PROTOBUF_INTERNAL_DONATE_STEAL_INLINE=0",
- "-DGOOGLE_PROTOBUF_NO_RTTI",
- "-DGOOGLE_PROTOBUF_NO_STATIC_INITIALIZER",
- "-DHAVE_PTHREAD",
- "-DHAVE_SYS_UIO_H",
- "-DIS_QUICHE_IMPL",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_FORTIFY_SOURCE=2",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D__STDC_CONSTANT_MACROS",
- "-D__STDC_FORMAT_MACROS",
- "-Oz",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "net/third_party/quiche/overrides/",
- "net/third_party/quiche/src/",
- "net/third_party/quiche/src/quiche/common/platform/default/",
- "third_party/abseil-cpp/",
- "third_party/boringssl/src/include/",
- "third_party/protobuf/src/",
- ],
- cpp_std: "c++17",
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- "-Wl,--script,external/cronet/base/android/library_loader/anchor_functions.lds",
- "-Wl,-wrap,asprintf",
- "-Wl,-wrap,calloc",
- "-Wl,-wrap,free",
- "-Wl,-wrap,getcwd",
- "-Wl,-wrap,malloc",
- "-Wl,-wrap,malloc_usable_size",
- "-Wl,-wrap,memalign",
- "-Wl,-wrap,posix_memalign",
- "-Wl,-wrap,pvalloc",
- "-Wl,-wrap,realloc",
- "-Wl,-wrap,realpath",
- "-Wl,-wrap,strdup",
- "-Wl,-wrap,strndup",
- "-Wl,-wrap,valloc",
- "-Wl,-wrap,vasprintf",
- ],
- target: {
- android_arm: {
- cflags: [
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-fstack-protector",
- "-msse3",
- ],
- },
- },
-}
-
-// GN: //net/third_party/quiche:quiche__testing
-cc_library_static {
- name: "cronet_aml_net_third_party_quiche_quiche__testing",
- srcs: [
- ":cronet_aml_net_third_party_quiche_net_quic_proto__testing_gen",
- "net/third_party/quiche/overrides/quiche_platform_impl/quiche_mutex_impl.cc",
- "net/third_party/quiche/overrides/quiche_platform_impl/quiche_time_utils_impl.cc",
- "net/third_party/quiche/overrides/quiche_platform_impl/quiche_url_utils_impl.cc",
- "net/third_party/quiche/src/quiche/common/platform/api/quiche_hostname_utils.cc",
- "net/third_party/quiche/src/quiche/common/platform/api/quiche_mutex.cc",
- "net/third_party/quiche/src/quiche/common/platform/default/quiche_platform_impl/quiche_flags_impl.cc",
- "net/third_party/quiche/src/quiche/common/quiche_buffer_allocator.cc",
- "net/third_party/quiche/src/quiche/common/quiche_crypto_logging.cc",
- "net/third_party/quiche/src/quiche/common/quiche_data_reader.cc",
- "net/third_party/quiche/src/quiche/common/quiche_data_writer.cc",
- "net/third_party/quiche/src/quiche/common/quiche_ip_address.cc",
- "net/third_party/quiche/src/quiche/common/quiche_ip_address_family.cc",
- "net/third_party/quiche/src/quiche/common/quiche_mem_slice_storage.cc",
- "net/third_party/quiche/src/quiche/common/quiche_random.cc",
- "net/third_party/quiche/src/quiche/common/quiche_text_utils.cc",
- "net/third_party/quiche/src/quiche/common/simple_buffer_allocator.cc",
- "net/third_party/quiche/src/quiche/common/structured_headers.cc",
- "net/third_party/quiche/src/quiche/http2/adapter/event_forwarder.cc",
- "net/third_party/quiche/src/quiche/http2/adapter/header_validator.cc",
- "net/third_party/quiche/src/quiche/http2/adapter/http2_protocol.cc",
- "net/third_party/quiche/src/quiche/http2/adapter/http2_util.cc",
- "net/third_party/quiche/src/quiche/http2/adapter/noop_header_validator.cc",
- "net/third_party/quiche/src/quiche/http2/adapter/oghttp2_adapter.cc",
- "net/third_party/quiche/src/quiche/http2/adapter/oghttp2_session.cc",
- "net/third_party/quiche/src/quiche/http2/adapter/oghttp2_util.cc",
- "net/third_party/quiche/src/quiche/http2/adapter/window_manager.cc",
- "net/third_party/quiche/src/quiche/http2/core/http2_trace_logging.cc",
- "net/third_party/quiche/src/quiche/http2/decoder/decode_buffer.cc",
- "net/third_party/quiche/src/quiche/http2/decoder/decode_http2_structures.cc",
- "net/third_party/quiche/src/quiche/http2/decoder/decode_status.cc",
- "net/third_party/quiche/src/quiche/http2/decoder/frame_decoder_state.cc",
- "net/third_party/quiche/src/quiche/http2/decoder/http2_frame_decoder.cc",
- "net/third_party/quiche/src/quiche/http2/decoder/http2_frame_decoder_listener.cc",
- "net/third_party/quiche/src/quiche/http2/decoder/http2_structure_decoder.cc",
- "net/third_party/quiche/src/quiche/http2/decoder/payload_decoders/altsvc_payload_decoder.cc",
- "net/third_party/quiche/src/quiche/http2/decoder/payload_decoders/continuation_payload_decoder.cc",
- "net/third_party/quiche/src/quiche/http2/decoder/payload_decoders/data_payload_decoder.cc",
- "net/third_party/quiche/src/quiche/http2/decoder/payload_decoders/goaway_payload_decoder.cc",
- "net/third_party/quiche/src/quiche/http2/decoder/payload_decoders/headers_payload_decoder.cc",
- "net/third_party/quiche/src/quiche/http2/decoder/payload_decoders/ping_payload_decoder.cc",
- "net/third_party/quiche/src/quiche/http2/decoder/payload_decoders/priority_payload_decoder.cc",
- "net/third_party/quiche/src/quiche/http2/decoder/payload_decoders/priority_update_payload_decoder.cc",
- "net/third_party/quiche/src/quiche/http2/decoder/payload_decoders/push_promise_payload_decoder.cc",
- "net/third_party/quiche/src/quiche/http2/decoder/payload_decoders/rst_stream_payload_decoder.cc",
- "net/third_party/quiche/src/quiche/http2/decoder/payload_decoders/settings_payload_decoder.cc",
- "net/third_party/quiche/src/quiche/http2/decoder/payload_decoders/unknown_payload_decoder.cc",
- "net/third_party/quiche/src/quiche/http2/decoder/payload_decoders/window_update_payload_decoder.cc",
- "net/third_party/quiche/src/quiche/http2/hpack/decoder/hpack_block_decoder.cc",
- "net/third_party/quiche/src/quiche/http2/hpack/decoder/hpack_decoder.cc",
- "net/third_party/quiche/src/quiche/http2/hpack/decoder/hpack_decoder_listener.cc",
- "net/third_party/quiche/src/quiche/http2/hpack/decoder/hpack_decoder_state.cc",
- "net/third_party/quiche/src/quiche/http2/hpack/decoder/hpack_decoder_string_buffer.cc",
- "net/third_party/quiche/src/quiche/http2/hpack/decoder/hpack_decoder_tables.cc",
- "net/third_party/quiche/src/quiche/http2/hpack/decoder/hpack_decoding_error.cc",
- "net/third_party/quiche/src/quiche/http2/hpack/decoder/hpack_entry_decoder.cc",
- "net/third_party/quiche/src/quiche/http2/hpack/decoder/hpack_entry_decoder_listener.cc",
- "net/third_party/quiche/src/quiche/http2/hpack/decoder/hpack_entry_type_decoder.cc",
- "net/third_party/quiche/src/quiche/http2/hpack/decoder/hpack_string_decoder.cc",
- "net/third_party/quiche/src/quiche/http2/hpack/decoder/hpack_string_decoder_listener.cc",
- "net/third_party/quiche/src/quiche/http2/hpack/decoder/hpack_whole_entry_buffer.cc",
- "net/third_party/quiche/src/quiche/http2/hpack/decoder/hpack_whole_entry_listener.cc",
- "net/third_party/quiche/src/quiche/http2/hpack/http2_hpack_constants.cc",
- "net/third_party/quiche/src/quiche/http2/hpack/huffman/hpack_huffman_decoder.cc",
- "net/third_party/quiche/src/quiche/http2/hpack/huffman/hpack_huffman_encoder.cc",
- "net/third_party/quiche/src/quiche/http2/hpack/huffman/huffman_spec_tables.cc",
- "net/third_party/quiche/src/quiche/http2/hpack/varint/hpack_varint_decoder.cc",
- "net/third_party/quiche/src/quiche/http2/hpack/varint/hpack_varint_encoder.cc",
- "net/third_party/quiche/src/quiche/http2/http2_constants.cc",
- "net/third_party/quiche/src/quiche/http2/http2_structures.cc",
- "net/third_party/quiche/src/quiche/quic/core/congestion_control/bandwidth_sampler.cc",
- "net/third_party/quiche/src/quiche/quic/core/congestion_control/bbr2_drain.cc",
- "net/third_party/quiche/src/quiche/quic/core/congestion_control/bbr2_misc.cc",
- "net/third_party/quiche/src/quiche/quic/core/congestion_control/bbr2_probe_bw.cc",
- "net/third_party/quiche/src/quiche/quic/core/congestion_control/bbr2_probe_rtt.cc",
- "net/third_party/quiche/src/quiche/quic/core/congestion_control/bbr2_sender.cc",
- "net/third_party/quiche/src/quiche/quic/core/congestion_control/bbr2_startup.cc",
- "net/third_party/quiche/src/quiche/quic/core/congestion_control/bbr_sender.cc",
- "net/third_party/quiche/src/quiche/quic/core/congestion_control/cubic_bytes.cc",
- "net/third_party/quiche/src/quiche/quic/core/congestion_control/general_loss_algorithm.cc",
- "net/third_party/quiche/src/quiche/quic/core/congestion_control/hybrid_slow_start.cc",
- "net/third_party/quiche/src/quiche/quic/core/congestion_control/pacing_sender.cc",
- "net/third_party/quiche/src/quiche/quic/core/congestion_control/prr_sender.cc",
- "net/third_party/quiche/src/quiche/quic/core/congestion_control/rtt_stats.cc",
- "net/third_party/quiche/src/quiche/quic/core/congestion_control/send_algorithm_interface.cc",
- "net/third_party/quiche/src/quiche/quic/core/congestion_control/tcp_cubic_sender_bytes.cc",
- "net/third_party/quiche/src/quiche/quic/core/congestion_control/uber_loss_algorithm.cc",
- "net/third_party/quiche/src/quiche/quic/core/crypto/aead_base_decrypter.cc",
- "net/third_party/quiche/src/quiche/quic/core/crypto/aead_base_encrypter.cc",
- "net/third_party/quiche/src/quiche/quic/core/crypto/aes_128_gcm_12_decrypter.cc",
- "net/third_party/quiche/src/quiche/quic/core/crypto/aes_128_gcm_12_encrypter.cc",
- "net/third_party/quiche/src/quiche/quic/core/crypto/aes_128_gcm_decrypter.cc",
- "net/third_party/quiche/src/quiche/quic/core/crypto/aes_128_gcm_encrypter.cc",
- "net/third_party/quiche/src/quiche/quic/core/crypto/aes_256_gcm_decrypter.cc",
- "net/third_party/quiche/src/quiche/quic/core/crypto/aes_256_gcm_encrypter.cc",
- "net/third_party/quiche/src/quiche/quic/core/crypto/aes_base_decrypter.cc",
- "net/third_party/quiche/src/quiche/quic/core/crypto/aes_base_encrypter.cc",
- "net/third_party/quiche/src/quiche/quic/core/crypto/cert_compressor.cc",
- "net/third_party/quiche/src/quiche/quic/core/crypto/certificate_util.cc",
- "net/third_party/quiche/src/quiche/quic/core/crypto/certificate_view.cc",
- "net/third_party/quiche/src/quiche/quic/core/crypto/chacha20_poly1305_decrypter.cc",
- "net/third_party/quiche/src/quiche/quic/core/crypto/chacha20_poly1305_encrypter.cc",
- "net/third_party/quiche/src/quiche/quic/core/crypto/chacha20_poly1305_tls_decrypter.cc",
- "net/third_party/quiche/src/quiche/quic/core/crypto/chacha20_poly1305_tls_encrypter.cc",
- "net/third_party/quiche/src/quiche/quic/core/crypto/chacha_base_decrypter.cc",
- "net/third_party/quiche/src/quiche/quic/core/crypto/chacha_base_encrypter.cc",
- "net/third_party/quiche/src/quiche/quic/core/crypto/channel_id.cc",
- "net/third_party/quiche/src/quiche/quic/core/crypto/client_proof_source.cc",
- "net/third_party/quiche/src/quiche/quic/core/crypto/crypto_framer.cc",
- "net/third_party/quiche/src/quiche/quic/core/crypto/crypto_handshake.cc",
- "net/third_party/quiche/src/quiche/quic/core/crypto/crypto_handshake_message.cc",
- "net/third_party/quiche/src/quiche/quic/core/crypto/crypto_secret_boxer.cc",
- "net/third_party/quiche/src/quiche/quic/core/crypto/crypto_utils.cc",
- "net/third_party/quiche/src/quiche/quic/core/crypto/curve25519_key_exchange.cc",
- "net/third_party/quiche/src/quiche/quic/core/crypto/key_exchange.cc",
- "net/third_party/quiche/src/quiche/quic/core/crypto/null_decrypter.cc",
- "net/third_party/quiche/src/quiche/quic/core/crypto/null_encrypter.cc",
- "net/third_party/quiche/src/quiche/quic/core/crypto/p256_key_exchange.cc",
- "net/third_party/quiche/src/quiche/quic/core/crypto/proof_source.cc",
- "net/third_party/quiche/src/quiche/quic/core/crypto/proof_source_x509.cc",
- "net/third_party/quiche/src/quiche/quic/core/crypto/quic_client_session_cache.cc",
- "net/third_party/quiche/src/quiche/quic/core/crypto/quic_compressed_certs_cache.cc",
- "net/third_party/quiche/src/quiche/quic/core/crypto/quic_crypter.cc",
- "net/third_party/quiche/src/quiche/quic/core/crypto/quic_crypto_client_config.cc",
- "net/third_party/quiche/src/quiche/quic/core/crypto/quic_crypto_proof.cc",
- "net/third_party/quiche/src/quiche/quic/core/crypto/quic_crypto_server_config.cc",
- "net/third_party/quiche/src/quiche/quic/core/crypto/quic_decrypter.cc",
- "net/third_party/quiche/src/quiche/quic/core/crypto/quic_encrypter.cc",
- "net/third_party/quiche/src/quiche/quic/core/crypto/quic_hkdf.cc",
- "net/third_party/quiche/src/quiche/quic/core/crypto/tls_client_connection.cc",
- "net/third_party/quiche/src/quiche/quic/core/crypto/tls_connection.cc",
- "net/third_party/quiche/src/quiche/quic/core/crypto/tls_server_connection.cc",
- "net/third_party/quiche/src/quiche/quic/core/crypto/transport_parameters.cc",
- "net/third_party/quiche/src/quiche/quic/core/crypto/web_transport_fingerprint_proof_verifier.cc",
- "net/third_party/quiche/src/quiche/quic/core/deterministic_connection_id_generator.cc",
- "net/third_party/quiche/src/quiche/quic/core/frames/quic_ack_frame.cc",
- "net/third_party/quiche/src/quiche/quic/core/frames/quic_ack_frequency_frame.cc",
- "net/third_party/quiche/src/quiche/quic/core/frames/quic_blocked_frame.cc",
- "net/third_party/quiche/src/quiche/quic/core/frames/quic_connection_close_frame.cc",
- "net/third_party/quiche/src/quiche/quic/core/frames/quic_crypto_frame.cc",
- "net/third_party/quiche/src/quiche/quic/core/frames/quic_frame.cc",
- "net/third_party/quiche/src/quiche/quic/core/frames/quic_goaway_frame.cc",
- "net/third_party/quiche/src/quiche/quic/core/frames/quic_handshake_done_frame.cc",
- "net/third_party/quiche/src/quiche/quic/core/frames/quic_max_streams_frame.cc",
- "net/third_party/quiche/src/quiche/quic/core/frames/quic_message_frame.cc",
- "net/third_party/quiche/src/quiche/quic/core/frames/quic_new_connection_id_frame.cc",
- "net/third_party/quiche/src/quiche/quic/core/frames/quic_new_token_frame.cc",
- "net/third_party/quiche/src/quiche/quic/core/frames/quic_padding_frame.cc",
- "net/third_party/quiche/src/quiche/quic/core/frames/quic_path_challenge_frame.cc",
- "net/third_party/quiche/src/quiche/quic/core/frames/quic_path_response_frame.cc",
- "net/third_party/quiche/src/quiche/quic/core/frames/quic_ping_frame.cc",
- "net/third_party/quiche/src/quiche/quic/core/frames/quic_retire_connection_id_frame.cc",
- "net/third_party/quiche/src/quiche/quic/core/frames/quic_rst_stream_frame.cc",
- "net/third_party/quiche/src/quiche/quic/core/frames/quic_stop_sending_frame.cc",
- "net/third_party/quiche/src/quiche/quic/core/frames/quic_stop_waiting_frame.cc",
- "net/third_party/quiche/src/quiche/quic/core/frames/quic_stream_frame.cc",
- "net/third_party/quiche/src/quiche/quic/core/frames/quic_streams_blocked_frame.cc",
- "net/third_party/quiche/src/quiche/quic/core/frames/quic_window_update_frame.cc",
- "net/third_party/quiche/src/quiche/quic/core/http/capsule.cc",
- "net/third_party/quiche/src/quiche/quic/core/http/http_constants.cc",
- "net/third_party/quiche/src/quiche/quic/core/http/http_decoder.cc",
- "net/third_party/quiche/src/quiche/quic/core/http/http_encoder.cc",
- "net/third_party/quiche/src/quiche/quic/core/http/quic_client_promised_info.cc",
- "net/third_party/quiche/src/quiche/quic/core/http/quic_client_push_promise_index.cc",
- "net/third_party/quiche/src/quiche/quic/core/http/quic_header_list.cc",
- "net/third_party/quiche/src/quiche/quic/core/http/quic_headers_stream.cc",
- "net/third_party/quiche/src/quiche/quic/core/http/quic_receive_control_stream.cc",
- "net/third_party/quiche/src/quiche/quic/core/http/quic_send_control_stream.cc",
- "net/third_party/quiche/src/quiche/quic/core/http/quic_server_initiated_spdy_stream.cc",
- "net/third_party/quiche/src/quiche/quic/core/http/quic_server_session_base.cc",
- "net/third_party/quiche/src/quiche/quic/core/http/quic_spdy_client_session.cc",
- "net/third_party/quiche/src/quiche/quic/core/http/quic_spdy_client_session_base.cc",
- "net/third_party/quiche/src/quiche/quic/core/http/quic_spdy_client_stream.cc",
- "net/third_party/quiche/src/quiche/quic/core/http/quic_spdy_session.cc",
- "net/third_party/quiche/src/quiche/quic/core/http/quic_spdy_stream.cc",
- "net/third_party/quiche/src/quiche/quic/core/http/quic_spdy_stream_body_manager.cc",
- "net/third_party/quiche/src/quiche/quic/core/http/spdy_server_push_utils.cc",
- "net/third_party/quiche/src/quiche/quic/core/http/spdy_utils.cc",
- "net/third_party/quiche/src/quiche/quic/core/http/web_transport_http3.cc",
- "net/third_party/quiche/src/quiche/quic/core/http/web_transport_stream_adapter.cc",
- "net/third_party/quiche/src/quiche/quic/core/legacy_quic_stream_id_manager.cc",
- "net/third_party/quiche/src/quiche/quic/core/qpack/qpack_blocking_manager.cc",
- "net/third_party/quiche/src/quiche/quic/core/qpack/qpack_decoded_headers_accumulator.cc",
- "net/third_party/quiche/src/quiche/quic/core/qpack/qpack_decoder.cc",
- "net/third_party/quiche/src/quiche/quic/core/qpack/qpack_decoder_stream_receiver.cc",
- "net/third_party/quiche/src/quiche/quic/core/qpack/qpack_decoder_stream_sender.cc",
- "net/third_party/quiche/src/quiche/quic/core/qpack/qpack_encoder.cc",
- "net/third_party/quiche/src/quiche/quic/core/qpack/qpack_encoder_stream_receiver.cc",
- "net/third_party/quiche/src/quiche/quic/core/qpack/qpack_encoder_stream_sender.cc",
- "net/third_party/quiche/src/quiche/quic/core/qpack/qpack_header_table.cc",
- "net/third_party/quiche/src/quiche/quic/core/qpack/qpack_index_conversions.cc",
- "net/third_party/quiche/src/quiche/quic/core/qpack/qpack_instruction_decoder.cc",
- "net/third_party/quiche/src/quiche/quic/core/qpack/qpack_instruction_encoder.cc",
- "net/third_party/quiche/src/quiche/quic/core/qpack/qpack_instructions.cc",
- "net/third_party/quiche/src/quiche/quic/core/qpack/qpack_progressive_decoder.cc",
- "net/third_party/quiche/src/quiche/quic/core/qpack/qpack_receive_stream.cc",
- "net/third_party/quiche/src/quiche/quic/core/qpack/qpack_required_insert_count.cc",
- "net/third_party/quiche/src/quiche/quic/core/qpack/qpack_send_stream.cc",
- "net/third_party/quiche/src/quiche/quic/core/qpack/qpack_static_table.cc",
- "net/third_party/quiche/src/quiche/quic/core/qpack/value_splitting_header_list.cc",
- "net/third_party/quiche/src/quiche/quic/core/quic_ack_listener_interface.cc",
- "net/third_party/quiche/src/quiche/quic/core/quic_alarm.cc",
- "net/third_party/quiche/src/quiche/quic/core/quic_bandwidth.cc",
- "net/third_party/quiche/src/quiche/quic/core/quic_chaos_protector.cc",
- "net/third_party/quiche/src/quiche/quic/core/quic_clock.cc",
- "net/third_party/quiche/src/quiche/quic/core/quic_coalesced_packet.cc",
- "net/third_party/quiche/src/quiche/quic/core/quic_config.cc",
- "net/third_party/quiche/src/quiche/quic/core/quic_connection.cc",
- "net/third_party/quiche/src/quiche/quic/core/quic_connection_context.cc",
- "net/third_party/quiche/src/quiche/quic/core/quic_connection_id.cc",
- "net/third_party/quiche/src/quiche/quic/core/quic_connection_id_manager.cc",
- "net/third_party/quiche/src/quiche/quic/core/quic_connection_stats.cc",
- "net/third_party/quiche/src/quiche/quic/core/quic_constants.cc",
- "net/third_party/quiche/src/quiche/quic/core/quic_control_frame_manager.cc",
- "net/third_party/quiche/src/quiche/quic/core/quic_crypto_client_handshaker.cc",
- "net/third_party/quiche/src/quiche/quic/core/quic_crypto_client_stream.cc",
- "net/third_party/quiche/src/quiche/quic/core/quic_crypto_handshaker.cc",
- "net/third_party/quiche/src/quiche/quic/core/quic_crypto_server_stream.cc",
- "net/third_party/quiche/src/quiche/quic/core/quic_crypto_server_stream_base.cc",
- "net/third_party/quiche/src/quiche/quic/core/quic_crypto_stream.cc",
- "net/third_party/quiche/src/quiche/quic/core/quic_data_reader.cc",
- "net/third_party/quiche/src/quiche/quic/core/quic_data_writer.cc",
- "net/third_party/quiche/src/quiche/quic/core/quic_datagram_queue.cc",
- "net/third_party/quiche/src/quiche/quic/core/quic_error_codes.cc",
- "net/third_party/quiche/src/quiche/quic/core/quic_flow_controller.cc",
- "net/third_party/quiche/src/quiche/quic/core/quic_framer.cc",
- "net/third_party/quiche/src/quiche/quic/core/quic_idle_network_detector.cc",
- "net/third_party/quiche/src/quiche/quic/core/quic_legacy_version_encapsulator.cc",
- "net/third_party/quiche/src/quiche/quic/core/quic_mtu_discovery.cc",
- "net/third_party/quiche/src/quiche/quic/core/quic_network_blackhole_detector.cc",
- "net/third_party/quiche/src/quiche/quic/core/quic_packet_creator.cc",
- "net/third_party/quiche/src/quiche/quic/core/quic_packet_number.cc",
- "net/third_party/quiche/src/quiche/quic/core/quic_packets.cc",
- "net/third_party/quiche/src/quiche/quic/core/quic_path_validator.cc",
- "net/third_party/quiche/src/quiche/quic/core/quic_ping_manager.cc",
- "net/third_party/quiche/src/quiche/quic/core/quic_received_packet_manager.cc",
- "net/third_party/quiche/src/quiche/quic/core/quic_sent_packet_manager.cc",
- "net/third_party/quiche/src/quiche/quic/core/quic_server_id.cc",
- "net/third_party/quiche/src/quiche/quic/core/quic_session.cc",
- "net/third_party/quiche/src/quiche/quic/core/quic_socket_address_coder.cc",
- "net/third_party/quiche/src/quiche/quic/core/quic_stream.cc",
- "net/third_party/quiche/src/quiche/quic/core/quic_stream_id_manager.cc",
- "net/third_party/quiche/src/quiche/quic/core/quic_stream_send_buffer.cc",
- "net/third_party/quiche/src/quiche/quic/core/quic_stream_sequencer.cc",
- "net/third_party/quiche/src/quiche/quic/core/quic_stream_sequencer_buffer.cc",
- "net/third_party/quiche/src/quiche/quic/core/quic_sustained_bandwidth_recorder.cc",
- "net/third_party/quiche/src/quiche/quic/core/quic_tag.cc",
- "net/third_party/quiche/src/quiche/quic/core/quic_time.cc",
- "net/third_party/quiche/src/quiche/quic/core/quic_transmission_info.cc",
- "net/third_party/quiche/src/quiche/quic/core/quic_types.cc",
- "net/third_party/quiche/src/quiche/quic/core/quic_unacked_packet_map.cc",
- "net/third_party/quiche/src/quiche/quic/core/quic_utils.cc",
- "net/third_party/quiche/src/quiche/quic/core/quic_version_manager.cc",
- "net/third_party/quiche/src/quiche/quic/core/quic_versions.cc",
- "net/third_party/quiche/src/quiche/quic/core/quic_write_blocked_list.cc",
- "net/third_party/quiche/src/quiche/quic/core/tls_client_handshaker.cc",
- "net/third_party/quiche/src/quiche/quic/core/tls_handshaker.cc",
- "net/third_party/quiche/src/quiche/quic/core/tls_server_handshaker.cc",
- "net/third_party/quiche/src/quiche/quic/core/uber_quic_stream_id_manager.cc",
- "net/third_party/quiche/src/quiche/quic/core/uber_received_packet_manager.cc",
- "net/third_party/quiche/src/quiche/quic/platform/api/quic_socket_address.cc",
- "net/third_party/quiche/src/quiche/spdy/core/array_output_buffer.cc",
- "net/third_party/quiche/src/quiche/spdy/core/hpack/hpack_constants.cc",
- "net/third_party/quiche/src/quiche/spdy/core/hpack/hpack_decoder_adapter.cc",
- "net/third_party/quiche/src/quiche/spdy/core/hpack/hpack_encoder.cc",
- "net/third_party/quiche/src/quiche/spdy/core/hpack/hpack_entry.cc",
- "net/third_party/quiche/src/quiche/spdy/core/hpack/hpack_header_table.cc",
- "net/third_party/quiche/src/quiche/spdy/core/hpack/hpack_output_stream.cc",
- "net/third_party/quiche/src/quiche/spdy/core/hpack/hpack_static_table.cc",
- "net/third_party/quiche/src/quiche/spdy/core/http2_frame_decoder_adapter.cc",
- "net/third_party/quiche/src/quiche/spdy/core/http2_header_block.cc",
- "net/third_party/quiche/src/quiche/spdy/core/http2_header_storage.cc",
- "net/third_party/quiche/src/quiche/spdy/core/recording_headers_handler.cc",
- "net/third_party/quiche/src/quiche/spdy/core/spdy_alt_svc_wire_format.cc",
- "net/third_party/quiche/src/quiche/spdy/core/spdy_frame_builder.cc",
- "net/third_party/quiche/src/quiche/spdy/core/spdy_framer.cc",
- "net/third_party/quiche/src/quiche/spdy/core/spdy_no_op_visitor.cc",
- "net/third_party/quiche/src/quiche/spdy/core/spdy_pinnable_buffer_piece.cc",
- "net/third_party/quiche/src/quiche/spdy/core/spdy_prefixed_buffer_reader.cc",
- "net/third_party/quiche/src/quiche/spdy/core/spdy_protocol.cc",
- "net/third_party/quiche/src/quiche/spdy/core/spdy_simple_arena.cc",
- ],
- shared_libs: [
- "libandroid",
- "liblog",
- "libprotobuf-cpp-lite",
- "libz",
- ],
- static_libs: [
- "cronet_aml_base_allocator_partition_allocator_partition_alloc__testing",
- "cronet_aml_base_base__testing",
- "cronet_aml_base_base_static__testing",
- "cronet_aml_base_nodebug_assertion__testing",
- "cronet_aml_base_third_party_double_conversion_double_conversion__testing",
- "cronet_aml_base_third_party_dynamic_annotations_dynamic_annotations__testing",
- "cronet_aml_net_uri_template__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_base__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_log_severity__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_malloc_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_raw_logging_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_spinlock_wait__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_strerror__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_throw_delegate__testing",
- "cronet_aml_third_party_abseil_cpp_absl_container_hashtablez_sampler__testing",
- "cronet_aml_third_party_abseil_cpp_absl_container_raw_hash_set__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_debugging_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_demangle_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_examine_stack__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_failure_signal_handler__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_stacktrace__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_symbolize__testing",
- "cronet_aml_third_party_abseil_cpp_absl_hash_city__testing",
- "cronet_aml_third_party_abseil_cpp_absl_hash_hash__testing",
- "cronet_aml_third_party_abseil_cpp_absl_hash_low_level_hash__testing",
- "cronet_aml_third_party_abseil_cpp_absl_numeric_int128__testing",
- "cronet_aml_third_party_abseil_cpp_absl_profiling_exponential_biased__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_distributions__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_platform__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_pool_urbg__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_hwaes__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_hwaes_impl__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_slow__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_seed_material__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_seed_gen_exception__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_seed_sequences__testing",
- "cronet_aml_third_party_abseil_cpp_absl_status_status__testing",
- "cronet_aml_third_party_abseil_cpp_absl_status_statusor__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cord__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cord_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_functions__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_handle__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_info__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_str_format_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_strings__testing",
- "cronet_aml_third_party_abseil_cpp_absl_synchronization_graphcycles_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_synchronization_synchronization__testing",
- "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_civil_time__testing",
- "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_time_zone__testing",
- "cronet_aml_third_party_abseil_cpp_absl_time_time__testing",
- "cronet_aml_third_party_abseil_cpp_absl_types_bad_optional_access__testing",
- "cronet_aml_third_party_abseil_cpp_absl_types_bad_variant_access__testing",
- "cronet_aml_third_party_android_ndk_cpu_features__testing",
- "cronet_aml_third_party_ashmem_ashmem__testing",
- "cronet_aml_third_party_boringssl_boringssl__testing",
- "cronet_aml_third_party_boringssl_boringssl_asm__testing",
- "cronet_aml_third_party_icu_icui18n__testing",
- "cronet_aml_third_party_icu_icuuc_private__testing",
- "cronet_aml_third_party_libevent_libevent__testing",
- "cronet_aml_third_party_modp_b64_modp_b64__testing",
- "cronet_aml_third_party_protobuf_protobuf_lite__testing",
- "cronet_aml_url_url__testing",
- ],
- generated_headers: [
- "cronet_aml_net_third_party_quiche_net_quic_proto__testing_gen_headers",
- ],
- export_generated_headers: [
- "cronet_aml_net_third_party_quiche_net_quic_proto__testing_gen_headers",
- ],
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DGOOGLE_PROTOBUF_INTERNAL_DONATE_STEAL_INLINE=0",
- "-DGOOGLE_PROTOBUF_NO_RTTI",
- "-DGOOGLE_PROTOBUF_NO_STATIC_INITIALIZER",
- "-DHAVE_PTHREAD",
- "-DHAVE_SYS_UIO_H",
- "-DIS_QUICHE_IMPL",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_FORTIFY_SOURCE=2",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D__STDC_CONSTANT_MACROS",
- "-D__STDC_FORMAT_MACROS",
- "-Oz",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "net/third_party/quiche/overrides/",
- "net/third_party/quiche/src/",
- "net/third_party/quiche/src/quiche/common/platform/default/",
- "third_party/abseil-cpp/",
- "third_party/boringssl/src/include/",
- "third_party/protobuf/src/",
- ],
- cpp_std: "c++17",
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- "-Wl,--script,external/cronet/base/android/library_loader/anchor_functions.lds",
- "-Wl,-wrap,asprintf",
- "-Wl,-wrap,calloc",
- "-Wl,-wrap,free",
- "-Wl,-wrap,getcwd",
- "-Wl,-wrap,malloc",
- "-Wl,-wrap,malloc_usable_size",
- "-Wl,-wrap,memalign",
- "-Wl,-wrap,posix_memalign",
- "-Wl,-wrap,pvalloc",
- "-Wl,-wrap,realloc",
- "-Wl,-wrap,realpath",
- "-Wl,-wrap,strdup",
- "-Wl,-wrap,strndup",
- "-Wl,-wrap,valloc",
- "-Wl,-wrap,vasprintf",
- ],
- target: {
- android_arm: {
- cflags: [
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-fstack-protector",
- "-msse3",
- ],
- },
- },
-}
-
-// GN: //net/third_party/quiche:quiche_tool_support__testing
-cc_library_static {
- name: "cronet_aml_net_third_party_quiche_quiche_tool_support__testing",
- srcs: [
- "net/third_party/quiche/overrides/quiche_platform_impl/quiche_command_line_flags_impl.cc",
- "net/third_party/quiche/overrides/quiche_platform_impl/quiche_default_proof_providers_impl.cc",
- "net/third_party/quiche/src/quiche/common/platform/api/quiche_file_utils.cc",
- "net/third_party/quiche/src/quiche/common/platform/default/quiche_platform_impl/quiche_file_utils_impl.cc",
- "net/third_party/quiche/src/quiche/quic/core/chlo_extractor.cc",
- "net/third_party/quiche/src/quiche/quic/core/http/quic_spdy_server_stream_base.cc",
- "net/third_party/quiche/src/quiche/quic/core/quic_buffered_packet_store.cc",
- "net/third_party/quiche/src/quiche/quic/core/quic_dispatcher.cc",
- "net/third_party/quiche/src/quiche/quic/core/quic_packet_writer_wrapper.cc",
- "net/third_party/quiche/src/quiche/quic/core/quic_time_wait_list_manager.cc",
- "net/third_party/quiche/src/quiche/quic/core/tls_chlo_extractor.cc",
- "net/third_party/quiche/src/quiche/quic/tools/quic_backend_response.cc",
- "net/third_party/quiche/src/quiche/quic/tools/quic_client_base.cc",
- "net/third_party/quiche/src/quiche/quic/tools/quic_memory_cache_backend.cc",
- "net/third_party/quiche/src/quiche/quic/tools/quic_simple_client_session.cc",
- "net/third_party/quiche/src/quiche/quic/tools/quic_simple_client_stream.cc",
- "net/third_party/quiche/src/quiche/quic/tools/quic_simple_crypto_server_stream_helper.cc",
- "net/third_party/quiche/src/quiche/quic/tools/quic_simple_dispatcher.cc",
- "net/third_party/quiche/src/quiche/quic/tools/quic_simple_server_session.cc",
- "net/third_party/quiche/src/quiche/quic/tools/quic_simple_server_stream.cc",
- "net/third_party/quiche/src/quiche/quic/tools/quic_spdy_client_base.cc",
- "net/third_party/quiche/src/quiche/quic/tools/quic_tcp_like_trace_converter.cc",
- "net/third_party/quiche/src/quiche/quic/tools/quic_url.cc",
- "net/third_party/quiche/src/quiche/quic/tools/simple_ticket_crypter.cc",
- ],
- shared_libs: [
- "libandroid",
- "liblog",
- "libz",
- ],
- static_libs: [
- "cronet_aml_base_allocator_partition_allocator_partition_alloc__testing",
- "cronet_aml_base_base__testing",
- "cronet_aml_base_base_static__testing",
- "cronet_aml_base_nodebug_assertion__testing",
- "cronet_aml_base_third_party_double_conversion_double_conversion__testing",
- "cronet_aml_base_third_party_dynamic_annotations_dynamic_annotations__testing",
- "cronet_aml_crypto_crypto__testing",
- "cronet_aml_net_dns_dns__testing",
- "cronet_aml_net_dns_public_public__testing",
- "cronet_aml_net_http_transport_security_state_generated_files__testing",
- "cronet_aml_net_net__testing",
- "cronet_aml_net_net_deps__testing",
- "cronet_aml_net_net_public_deps__testing",
- "cronet_aml_net_preload_decoder__testing",
- "cronet_aml_net_third_party_quiche_quiche__testing",
- "cronet_aml_net_traffic_annotation_traffic_annotation__testing",
- "cronet_aml_net_uri_template__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_base__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_log_severity__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_malloc_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_raw_logging_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_spinlock_wait__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_strerror__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_throw_delegate__testing",
- "cronet_aml_third_party_abseil_cpp_absl_container_hashtablez_sampler__testing",
- "cronet_aml_third_party_abseil_cpp_absl_container_raw_hash_set__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_debugging_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_demangle_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_examine_stack__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_failure_signal_handler__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_stacktrace__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_symbolize__testing",
- "cronet_aml_third_party_abseil_cpp_absl_hash_city__testing",
- "cronet_aml_third_party_abseil_cpp_absl_hash_hash__testing",
- "cronet_aml_third_party_abseil_cpp_absl_hash_low_level_hash__testing",
- "cronet_aml_third_party_abseil_cpp_absl_numeric_int128__testing",
- "cronet_aml_third_party_abseil_cpp_absl_profiling_exponential_biased__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_distributions__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_platform__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_pool_urbg__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_hwaes__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_hwaes_impl__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_slow__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_seed_material__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_seed_gen_exception__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_seed_sequences__testing",
- "cronet_aml_third_party_abseil_cpp_absl_status_status__testing",
- "cronet_aml_third_party_abseil_cpp_absl_status_statusor__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cord__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cord_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_functions__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_handle__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_info__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_str_format_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_strings__testing",
- "cronet_aml_third_party_abseil_cpp_absl_synchronization_graphcycles_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_synchronization_synchronization__testing",
- "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_civil_time__testing",
- "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_time_zone__testing",
- "cronet_aml_third_party_abseil_cpp_absl_time_time__testing",
- "cronet_aml_third_party_abseil_cpp_absl_types_bad_optional_access__testing",
- "cronet_aml_third_party_abseil_cpp_absl_types_bad_variant_access__testing",
- "cronet_aml_third_party_android_ndk_cpu_features__testing",
- "cronet_aml_third_party_ashmem_ashmem__testing",
- "cronet_aml_third_party_boringssl_boringssl__testing",
- "cronet_aml_third_party_boringssl_boringssl_asm__testing",
- "cronet_aml_third_party_brotli_common__testing",
- "cronet_aml_third_party_brotli_dec__testing",
- "cronet_aml_third_party_icu_icui18n__testing",
- "cronet_aml_third_party_icu_icuuc_private__testing",
- "cronet_aml_third_party_libevent_libevent__testing",
- "cronet_aml_third_party_modp_b64_modp_b64__testing",
- "cronet_aml_third_party_protobuf_protobuf_lite__testing",
- "cronet_aml_url_url__testing",
- ],
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DGOOGLE_PROTOBUF_INTERNAL_DONATE_STEAL_INLINE=0",
- "-DGOOGLE_PROTOBUF_NO_RTTI",
- "-DGOOGLE_PROTOBUF_NO_STATIC_INITIALIZER",
- "-DHAVE_PTHREAD",
- "-DHAVE_SYS_UIO_H",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_FORTIFY_SOURCE=2",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D__STDC_CONSTANT_MACROS",
- "-D__STDC_FORMAT_MACROS",
- "-Oz",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "net/third_party/quiche/overrides/",
- "net/third_party/quiche/src/",
- "net/third_party/quiche/src/quiche/common/platform/default/",
- "third_party/abseil-cpp/",
- "third_party/boringssl/src/include/",
- "third_party/protobuf/src/",
- ],
- cpp_std: "c++17",
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- "-Wl,--script,external/cronet/base/android/library_loader/anchor_functions.lds",
- "-Wl,-wrap,asprintf",
- "-Wl,-wrap,calloc",
- "-Wl,-wrap,free",
- "-Wl,-wrap,getcwd",
- "-Wl,-wrap,malloc",
- "-Wl,-wrap,malloc_usable_size",
- "-Wl,-wrap,memalign",
- "-Wl,-wrap,posix_memalign",
- "-Wl,-wrap,pvalloc",
- "-Wl,-wrap,realloc",
- "-Wl,-wrap,realpath",
- "-Wl,-wrap,strdup",
- "-Wl,-wrap,strndup",
- "-Wl,-wrap,valloc",
- "-Wl,-wrap,vasprintf",
- ],
- target: {
- android_arm: {
- cflags: [
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-fstack-protector",
- "-msse3",
- ],
- },
- },
-}
-
-// GN: //net/tools/huffman_trie:huffman_trie_generator_sources__testing
-cc_library_static {
- name: "cronet_aml_net_tools_huffman_trie_huffman_trie_generator_sources__testing",
- srcs: [
- "net/tools/huffman_trie/bit_writer.cc",
- "net/tools/huffman_trie/huffman/huffman_builder.cc",
- "net/tools/huffman_trie/trie/trie_bit_buffer.cc",
- "net/tools/huffman_trie/trie/trie_writer.cc",
- "net/tools/huffman_trie/trie_entry.cc",
- ],
- static_libs: [
- "cronet_aml_base_allocator_partition_allocator_partition_alloc__testing",
- "cronet_aml_base_base__testing",
- "cronet_aml_base_base_static__testing",
- "cronet_aml_base_nodebug_assertion__testing",
- "cronet_aml_base_third_party_double_conversion_double_conversion__testing",
- "cronet_aml_base_third_party_dynamic_annotations_dynamic_annotations__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_base__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_log_severity__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_malloc_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_raw_logging_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_spinlock_wait__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_strerror__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_throw_delegate__testing",
- "cronet_aml_third_party_abseil_cpp_absl_container_hashtablez_sampler__testing",
- "cronet_aml_third_party_abseil_cpp_absl_container_raw_hash_set__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_debugging_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_demangle_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_examine_stack__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_failure_signal_handler__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_stacktrace__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_symbolize__testing",
- "cronet_aml_third_party_abseil_cpp_absl_hash_city__testing",
- "cronet_aml_third_party_abseil_cpp_absl_hash_hash__testing",
- "cronet_aml_third_party_abseil_cpp_absl_hash_low_level_hash__testing",
- "cronet_aml_third_party_abseil_cpp_absl_numeric_int128__testing",
- "cronet_aml_third_party_abseil_cpp_absl_profiling_exponential_biased__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_distributions__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_platform__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_pool_urbg__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_hwaes__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_hwaes_impl__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_slow__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_seed_material__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_seed_gen_exception__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_seed_sequences__testing",
- "cronet_aml_third_party_abseil_cpp_absl_status_status__testing",
- "cronet_aml_third_party_abseil_cpp_absl_status_statusor__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cord__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cord_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_functions__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_handle__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_info__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_str_format_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_strings__testing",
- "cronet_aml_third_party_abseil_cpp_absl_synchronization_graphcycles_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_synchronization_synchronization__testing",
- "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_civil_time__testing",
- "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_time_zone__testing",
- "cronet_aml_third_party_abseil_cpp_absl_time_time__testing",
- "cronet_aml_third_party_abseil_cpp_absl_types_bad_optional_access__testing",
- "cronet_aml_third_party_abseil_cpp_absl_types_bad_variant_access__testing",
- "cronet_aml_third_party_boringssl_boringssl__testing",
- "cronet_aml_third_party_boringssl_boringssl_asm__testing",
- "cronet_aml_third_party_icu_icui18n__testing",
- "cronet_aml_third_party_icu_icuuc_private__testing",
- "cronet_aml_third_party_libevent_libevent__testing",
- "cronet_aml_third_party_modp_b64_modp_b64__testing",
- ],
- host_supported: true,
- device_supported: false,
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DCR_SYSROOT_KEY=20220331T153654Z-0",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-DUSE_AURA=1",
- "-DUSE_OZONE=1",
- "-DUSE_UDEV",
- "-D_FILE_OFFSET_BITS=64",
- "-D_FORTIFY_SOURCE=2",
- "-D_GNU_SOURCE",
- "-D_LARGEFILE64_SOURCE",
- "-D_LARGEFILE_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D__STDC_CONSTANT_MACROS",
- "-D__STDC_FORMAT_MACROS",
- "-O2",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fstack-protector",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- "-msse3",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "third_party/abseil-cpp/",
- "third_party/boringssl/src/include/",
- ],
- cpp_std: "c++20",
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- ],
-}
-
-// GN: //net/tools/tld_cleanup:tld_cleanup__testing
-cc_library_static {
- name: "cronet_aml_net_tools_tld_cleanup_tld_cleanup__testing",
- srcs: [
- "net/tools/tld_cleanup/tld_cleanup_util.cc",
- ],
- shared_libs: [
- "libandroid",
- "liblog",
- ],
- static_libs: [
- "cronet_aml_base_allocator_partition_allocator_partition_alloc__testing",
- "cronet_aml_base_base__testing",
- "cronet_aml_base_base_static__testing",
- "cronet_aml_base_nodebug_assertion__testing",
- "cronet_aml_base_third_party_double_conversion_double_conversion__testing",
- "cronet_aml_base_third_party_dynamic_annotations_dynamic_annotations__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_base__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_log_severity__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_malloc_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_raw_logging_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_spinlock_wait__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_strerror__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_throw_delegate__testing",
- "cronet_aml_third_party_abseil_cpp_absl_container_hashtablez_sampler__testing",
- "cronet_aml_third_party_abseil_cpp_absl_container_raw_hash_set__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_debugging_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_demangle_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_examine_stack__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_failure_signal_handler__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_stacktrace__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_symbolize__testing",
- "cronet_aml_third_party_abseil_cpp_absl_hash_city__testing",
- "cronet_aml_third_party_abseil_cpp_absl_hash_hash__testing",
- "cronet_aml_third_party_abseil_cpp_absl_hash_low_level_hash__testing",
- "cronet_aml_third_party_abseil_cpp_absl_numeric_int128__testing",
- "cronet_aml_third_party_abseil_cpp_absl_profiling_exponential_biased__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_distributions__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_platform__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_pool_urbg__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_hwaes__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_hwaes_impl__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_slow__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_seed_material__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_seed_gen_exception__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_seed_sequences__testing",
- "cronet_aml_third_party_abseil_cpp_absl_status_status__testing",
- "cronet_aml_third_party_abseil_cpp_absl_status_statusor__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cord__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cord_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_functions__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_handle__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_info__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_str_format_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_strings__testing",
- "cronet_aml_third_party_abseil_cpp_absl_synchronization_graphcycles_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_synchronization_synchronization__testing",
- "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_civil_time__testing",
- "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_time_zone__testing",
- "cronet_aml_third_party_abseil_cpp_absl_time_time__testing",
- "cronet_aml_third_party_abseil_cpp_absl_types_bad_optional_access__testing",
- "cronet_aml_third_party_abseil_cpp_absl_types_bad_variant_access__testing",
- "cronet_aml_third_party_android_ndk_cpu_features__testing",
- "cronet_aml_third_party_ashmem_ashmem__testing",
- "cronet_aml_third_party_boringssl_boringssl__testing",
- "cronet_aml_third_party_boringssl_boringssl_asm__testing",
- "cronet_aml_third_party_icu_icui18n__testing",
- "cronet_aml_third_party_icu_icuuc_private__testing",
- "cronet_aml_third_party_libevent_libevent__testing",
- "cronet_aml_third_party_modp_b64_modp_b64__testing",
- "cronet_aml_url_url__testing",
- ],
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DHAVE_SYS_UIO_H",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_FORTIFY_SOURCE=2",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D__STDC_CONSTANT_MACROS",
- "-D__STDC_FORMAT_MACROS",
- "-Oz",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "third_party/abseil-cpp/",
- "third_party/boringssl/src/include/",
- ],
- cpp_std: "c++17",
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- "-Wl,--script,external/cronet/base/android/library_loader/anchor_functions.lds",
- "-Wl,-wrap,asprintf",
- "-Wl,-wrap,calloc",
- "-Wl,-wrap,free",
- "-Wl,-wrap,getcwd",
- "-Wl,-wrap,malloc",
- "-Wl,-wrap,malloc_usable_size",
- "-Wl,-wrap,memalign",
- "-Wl,-wrap,posix_memalign",
- "-Wl,-wrap,pvalloc",
- "-Wl,-wrap,realloc",
- "-Wl,-wrap,realpath",
- "-Wl,-wrap,strdup",
- "-Wl,-wrap,strndup",
- "-Wl,-wrap,valloc",
- "-Wl,-wrap,vasprintf",
- ],
- target: {
- android_arm: {
- cflags: [
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-fstack-protector",
- "-msse3",
- ],
- },
- },
-}
-
-// GN: //net/tools/transport_security_state_generator:transport_security_state_generator__testing
-cc_binary {
- name: "cronet_aml_net_tools_transport_security_state_generator_transport_security_state_generator__testing",
- srcs: [
- "net/tools/transport_security_state_generator/transport_security_state_generator.cc",
- ],
- static_libs: [
- "cronet_aml_base_allocator_partition_allocator_partition_alloc__testing",
- "cronet_aml_base_base__testing",
- "cronet_aml_base_base_static__testing",
- "cronet_aml_base_nodebug_assertion__testing",
- "cronet_aml_base_third_party_double_conversion_double_conversion__testing",
- "cronet_aml_base_third_party_dynamic_annotations_dynamic_annotations__testing",
- "cronet_aml_buildtools_third_party_libc___libc____testing",
- "cronet_aml_buildtools_third_party_libc__abi_libc__abi__testing",
- "cronet_aml_crypto_crypto__testing",
- "cronet_aml_net_tools_huffman_trie_huffman_trie_generator_sources__testing",
- "cronet_aml_net_tools_transport_security_state_generator_transport_security_state_generator_sources__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_base__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_log_severity__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_malloc_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_raw_logging_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_spinlock_wait__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_strerror__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_throw_delegate__testing",
- "cronet_aml_third_party_abseil_cpp_absl_container_hashtablez_sampler__testing",
- "cronet_aml_third_party_abseil_cpp_absl_container_raw_hash_set__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_debugging_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_demangle_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_examine_stack__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_failure_signal_handler__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_stacktrace__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_symbolize__testing",
- "cronet_aml_third_party_abseil_cpp_absl_hash_city__testing",
- "cronet_aml_third_party_abseil_cpp_absl_hash_hash__testing",
- "cronet_aml_third_party_abseil_cpp_absl_hash_low_level_hash__testing",
- "cronet_aml_third_party_abseil_cpp_absl_numeric_int128__testing",
- "cronet_aml_third_party_abseil_cpp_absl_profiling_exponential_biased__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_distributions__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_platform__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_pool_urbg__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_hwaes__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_hwaes_impl__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_slow__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_seed_material__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_seed_gen_exception__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_seed_sequences__testing",
- "cronet_aml_third_party_abseil_cpp_absl_status_status__testing",
- "cronet_aml_third_party_abseil_cpp_absl_status_statusor__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cord__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cord_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_functions__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_handle__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_info__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_str_format_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_strings__testing",
- "cronet_aml_third_party_abseil_cpp_absl_synchronization_graphcycles_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_synchronization_synchronization__testing",
- "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_civil_time__testing",
- "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_time_zone__testing",
- "cronet_aml_third_party_abseil_cpp_absl_time_time__testing",
- "cronet_aml_third_party_abseil_cpp_absl_types_bad_optional_access__testing",
- "cronet_aml_third_party_abseil_cpp_absl_types_bad_variant_access__testing",
- "cronet_aml_third_party_boringssl_boringssl__testing",
- "cronet_aml_third_party_boringssl_boringssl_asm__testing",
- "cronet_aml_third_party_icu_icui18n__testing",
- "cronet_aml_third_party_icu_icuuc_private__testing",
- "cronet_aml_third_party_libevent_libevent__testing",
- "cronet_aml_third_party_modp_b64_modp_b64__testing",
- ],
- host_supported: true,
- device_supported: false,
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DCR_SYSROOT_KEY=20220331T153654Z-0",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-DUSE_AURA=1",
- "-DUSE_OZONE=1",
- "-DUSE_UDEV",
- "-D_FILE_OFFSET_BITS=64",
- "-D_FORTIFY_SOURCE=2",
- "-D_GNU_SOURCE",
- "-D_LARGEFILE64_SOURCE",
- "-D_LARGEFILE_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D__STDC_CONSTANT_MACROS",
- "-D__STDC_FORMAT_MACROS",
- "-O2",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fstack-protector",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- "-msse3",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "third_party/abseil-cpp/",
- "third_party/boringssl/src/include/",
- ],
- cpp_std: "c++20",
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- ],
-}
-
-// GN: //net/tools/transport_security_state_generator:transport_security_state_generator_sources__testing
-cc_library_static {
- name: "cronet_aml_net_tools_transport_security_state_generator_transport_security_state_generator_sources__testing",
- srcs: [
- "net/tools/transport_security_state_generator/cert_util.cc",
- "net/tools/transport_security_state_generator/input_file_parsers.cc",
- "net/tools/transport_security_state_generator/pinset.cc",
- "net/tools/transport_security_state_generator/pinsets.cc",
- "net/tools/transport_security_state_generator/preloaded_state_generator.cc",
- "net/tools/transport_security_state_generator/spki_hash.cc",
- "net/tools/transport_security_state_generator/transport_security_state_entry.cc",
- ],
- static_libs: [
- "cronet_aml_base_allocator_partition_allocator_partition_alloc__testing",
- "cronet_aml_base_base__testing",
- "cronet_aml_base_base_static__testing",
- "cronet_aml_base_nodebug_assertion__testing",
- "cronet_aml_base_third_party_double_conversion_double_conversion__testing",
- "cronet_aml_base_third_party_dynamic_annotations_dynamic_annotations__testing",
- "cronet_aml_net_tools_huffman_trie_huffman_trie_generator_sources__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_base__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_log_severity__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_malloc_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_raw_logging_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_spinlock_wait__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_strerror__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_throw_delegate__testing",
- "cronet_aml_third_party_abseil_cpp_absl_container_hashtablez_sampler__testing",
- "cronet_aml_third_party_abseil_cpp_absl_container_raw_hash_set__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_debugging_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_demangle_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_examine_stack__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_failure_signal_handler__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_stacktrace__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_symbolize__testing",
- "cronet_aml_third_party_abseil_cpp_absl_hash_city__testing",
- "cronet_aml_third_party_abseil_cpp_absl_hash_hash__testing",
- "cronet_aml_third_party_abseil_cpp_absl_hash_low_level_hash__testing",
- "cronet_aml_third_party_abseil_cpp_absl_numeric_int128__testing",
- "cronet_aml_third_party_abseil_cpp_absl_profiling_exponential_biased__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_distributions__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_platform__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_pool_urbg__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_hwaes__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_hwaes_impl__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_slow__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_seed_material__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_seed_gen_exception__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_seed_sequences__testing",
- "cronet_aml_third_party_abseil_cpp_absl_status_status__testing",
- "cronet_aml_third_party_abseil_cpp_absl_status_statusor__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cord__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cord_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_functions__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_handle__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_info__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_str_format_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_strings__testing",
- "cronet_aml_third_party_abseil_cpp_absl_synchronization_graphcycles_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_synchronization_synchronization__testing",
- "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_civil_time__testing",
- "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_time_zone__testing",
- "cronet_aml_third_party_abseil_cpp_absl_time_time__testing",
- "cronet_aml_third_party_abseil_cpp_absl_types_bad_optional_access__testing",
- "cronet_aml_third_party_abseil_cpp_absl_types_bad_variant_access__testing",
- "cronet_aml_third_party_boringssl_boringssl__testing",
- "cronet_aml_third_party_boringssl_boringssl_asm__testing",
- "cronet_aml_third_party_icu_icui18n__testing",
- "cronet_aml_third_party_icu_icuuc_private__testing",
- "cronet_aml_third_party_libevent_libevent__testing",
- "cronet_aml_third_party_modp_b64_modp_b64__testing",
- ],
- host_supported: true,
- device_supported: false,
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DCR_SYSROOT_KEY=20220331T153654Z-0",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-DUSE_AURA=1",
- "-DUSE_OZONE=1",
- "-DUSE_UDEV",
- "-D_FILE_OFFSET_BITS=64",
- "-D_FORTIFY_SOURCE=2",
- "-D_GNU_SOURCE",
- "-D_LARGEFILE64_SOURCE",
- "-D_LARGEFILE_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D__STDC_CONSTANT_MACROS",
- "-D__STDC_FORMAT_MACROS",
- "-O2",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fstack-protector",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- "-msse3",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "third_party/abseil-cpp/",
- "third_party/boringssl/src/include/",
- ],
- cpp_std: "c++20",
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- ],
-}
-
-// GN: //net/traffic_annotation:traffic_annotation
-cc_library_static {
- name: "cronet_aml_net_traffic_annotation_traffic_annotation",
- srcs: [
- "net/traffic_annotation/network_traffic_annotation_android.cc",
- ],
- shared_libs: [
- "libandroid",
- "liblog",
- ],
- static_libs: [
- "cronet_aml_base_allocator_partition_allocator_partition_alloc",
- "cronet_aml_base_base",
- "cronet_aml_base_base_static",
- "cronet_aml_base_nodebug_assertion",
- "cronet_aml_base_third_party_double_conversion_double_conversion",
- "cronet_aml_base_third_party_dynamic_annotations_dynamic_annotations",
- "cronet_aml_third_party_abseil_cpp_absl_base_base",
- "cronet_aml_third_party_abseil_cpp_absl_base_log_severity",
- "cronet_aml_third_party_abseil_cpp_absl_base_malloc_internal",
- "cronet_aml_third_party_abseil_cpp_absl_base_raw_logging_internal",
- "cronet_aml_third_party_abseil_cpp_absl_base_spinlock_wait",
- "cronet_aml_third_party_abseil_cpp_absl_base_strerror",
- "cronet_aml_third_party_abseil_cpp_absl_base_throw_delegate",
- "cronet_aml_third_party_abseil_cpp_absl_container_hashtablez_sampler",
- "cronet_aml_third_party_abseil_cpp_absl_container_raw_hash_set",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_debugging_internal",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_demangle_internal",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_examine_stack",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_failure_signal_handler",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_stacktrace",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_symbolize",
- "cronet_aml_third_party_abseil_cpp_absl_hash_city",
- "cronet_aml_third_party_abseil_cpp_absl_hash_hash",
- "cronet_aml_third_party_abseil_cpp_absl_hash_low_level_hash",
- "cronet_aml_third_party_abseil_cpp_absl_numeric_int128",
- "cronet_aml_third_party_abseil_cpp_absl_profiling_exponential_biased",
- "cronet_aml_third_party_abseil_cpp_absl_random_distributions",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_platform",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_pool_urbg",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_hwaes",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_hwaes_impl",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_slow",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_seed_material",
- "cronet_aml_third_party_abseil_cpp_absl_random_seed_gen_exception",
- "cronet_aml_third_party_abseil_cpp_absl_random_seed_sequences",
- "cronet_aml_third_party_abseil_cpp_absl_status_status",
- "cronet_aml_third_party_abseil_cpp_absl_status_statusor",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cord",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cord_internal",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_functions",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_handle",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_info",
- "cronet_aml_third_party_abseil_cpp_absl_strings_internal",
- "cronet_aml_third_party_abseil_cpp_absl_strings_str_format_internal",
- "cronet_aml_third_party_abseil_cpp_absl_strings_strings",
- "cronet_aml_third_party_abseil_cpp_absl_synchronization_graphcycles_internal",
- "cronet_aml_third_party_abseil_cpp_absl_synchronization_synchronization",
- "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_civil_time",
- "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_time_zone",
- "cronet_aml_third_party_abseil_cpp_absl_time_time",
- "cronet_aml_third_party_abseil_cpp_absl_types_bad_optional_access",
- "cronet_aml_third_party_abseil_cpp_absl_types_bad_variant_access",
- "cronet_aml_third_party_android_ndk_cpu_features",
- "cronet_aml_third_party_ashmem_ashmem",
- "cronet_aml_third_party_boringssl_boringssl",
- "cronet_aml_third_party_boringssl_boringssl_asm",
- "cronet_aml_third_party_icu_icui18n",
- "cronet_aml_third_party_icu_icuuc_private",
- "cronet_aml_third_party_libevent_libevent",
- "cronet_aml_third_party_modp_b64_modp_b64",
- ],
- generated_headers: [
- "cronet_aml_build_chromeos_buildflags",
- ],
- export_generated_headers: [
- "cronet_aml_build_chromeos_buildflags",
- ],
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DHAVE_SYS_UIO_H",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_FORTIFY_SOURCE=2",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D__STDC_CONSTANT_MACROS",
- "-D__STDC_FORMAT_MACROS",
- "-Oz",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "third_party/abseil-cpp/",
- "third_party/boringssl/src/include/",
- ],
- cpp_std: "c++17",
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- "-Wl,--script,external/cronet/base/android/library_loader/anchor_functions.lds",
- "-Wl,-wrap,asprintf",
- "-Wl,-wrap,calloc",
- "-Wl,-wrap,free",
- "-Wl,-wrap,getcwd",
- "-Wl,-wrap,malloc",
- "-Wl,-wrap,malloc_usable_size",
- "-Wl,-wrap,memalign",
- "-Wl,-wrap,posix_memalign",
- "-Wl,-wrap,pvalloc",
- "-Wl,-wrap,realloc",
- "-Wl,-wrap,realpath",
- "-Wl,-wrap,strdup",
- "-Wl,-wrap,strndup",
- "-Wl,-wrap,valloc",
- "-Wl,-wrap,vasprintf",
- ],
- target: {
- android_arm: {
- cflags: [
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-fstack-protector",
- "-msse3",
- ],
- },
- },
-}
-
-// GN: //net/traffic_annotation:traffic_annotation__testing
-cc_library_static {
- name: "cronet_aml_net_traffic_annotation_traffic_annotation__testing",
- srcs: [
- "net/traffic_annotation/network_traffic_annotation_android.cc",
- ],
- shared_libs: [
- "libandroid",
- "liblog",
- ],
- static_libs: [
- "cronet_aml_base_allocator_partition_allocator_partition_alloc__testing",
- "cronet_aml_base_base__testing",
- "cronet_aml_base_base_static__testing",
- "cronet_aml_base_nodebug_assertion__testing",
- "cronet_aml_base_third_party_double_conversion_double_conversion__testing",
- "cronet_aml_base_third_party_dynamic_annotations_dynamic_annotations__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_base__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_log_severity__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_malloc_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_raw_logging_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_spinlock_wait__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_strerror__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_throw_delegate__testing",
- "cronet_aml_third_party_abseil_cpp_absl_container_hashtablez_sampler__testing",
- "cronet_aml_third_party_abseil_cpp_absl_container_raw_hash_set__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_debugging_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_demangle_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_examine_stack__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_failure_signal_handler__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_stacktrace__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_symbolize__testing",
- "cronet_aml_third_party_abseil_cpp_absl_hash_city__testing",
- "cronet_aml_third_party_abseil_cpp_absl_hash_hash__testing",
- "cronet_aml_third_party_abseil_cpp_absl_hash_low_level_hash__testing",
- "cronet_aml_third_party_abseil_cpp_absl_numeric_int128__testing",
- "cronet_aml_third_party_abseil_cpp_absl_profiling_exponential_biased__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_distributions__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_platform__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_pool_urbg__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_hwaes__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_hwaes_impl__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_slow__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_seed_material__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_seed_gen_exception__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_seed_sequences__testing",
- "cronet_aml_third_party_abseil_cpp_absl_status_status__testing",
- "cronet_aml_third_party_abseil_cpp_absl_status_statusor__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cord__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cord_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_functions__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_handle__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_info__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_str_format_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_strings__testing",
- "cronet_aml_third_party_abseil_cpp_absl_synchronization_graphcycles_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_synchronization_synchronization__testing",
- "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_civil_time__testing",
- "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_time_zone__testing",
- "cronet_aml_third_party_abseil_cpp_absl_time_time__testing",
- "cronet_aml_third_party_abseil_cpp_absl_types_bad_optional_access__testing",
- "cronet_aml_third_party_abseil_cpp_absl_types_bad_variant_access__testing",
- "cronet_aml_third_party_android_ndk_cpu_features__testing",
- "cronet_aml_third_party_ashmem_ashmem__testing",
- "cronet_aml_third_party_boringssl_boringssl__testing",
- "cronet_aml_third_party_boringssl_boringssl_asm__testing",
- "cronet_aml_third_party_icu_icui18n__testing",
- "cronet_aml_third_party_icu_icuuc_private__testing",
- "cronet_aml_third_party_libevent_libevent__testing",
- "cronet_aml_third_party_modp_b64_modp_b64__testing",
- ],
- generated_headers: [
- "cronet_aml_build_chromeos_buildflags__testing",
- ],
- export_generated_headers: [
- "cronet_aml_build_chromeos_buildflags__testing",
- ],
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DHAVE_SYS_UIO_H",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_FORTIFY_SOURCE=2",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D__STDC_CONSTANT_MACROS",
- "-D__STDC_FORMAT_MACROS",
- "-Oz",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "third_party/abseil-cpp/",
- "third_party/boringssl/src/include/",
- ],
- cpp_std: "c++17",
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- "-Wl,--script,external/cronet/base/android/library_loader/anchor_functions.lds",
- "-Wl,-wrap,asprintf",
- "-Wl,-wrap,calloc",
- "-Wl,-wrap,free",
- "-Wl,-wrap,getcwd",
- "-Wl,-wrap,malloc",
- "-Wl,-wrap,malloc_usable_size",
- "-Wl,-wrap,memalign",
- "-Wl,-wrap,posix_memalign",
- "-Wl,-wrap,pvalloc",
- "-Wl,-wrap,realloc",
- "-Wl,-wrap,realpath",
- "-Wl,-wrap,strdup",
- "-Wl,-wrap,strndup",
- "-Wl,-wrap,valloc",
- "-Wl,-wrap,vasprintf",
- ],
- target: {
- android_arm: {
- cflags: [
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-fstack-protector",
- "-msse3",
- ],
- },
- },
-}
-
-// GN: //net:uri_template
-cc_library_static {
- name: "cronet_aml_net_uri_template",
- srcs: [
- "net/third_party/uri_template/uri_template.cc",
- ],
- shared_libs: [
- "libandroid",
- "liblog",
- ],
- static_libs: [
- "cronet_aml_base_allocator_partition_allocator_partition_alloc",
- "cronet_aml_base_base",
- "cronet_aml_base_base_static",
- "cronet_aml_base_nodebug_assertion",
- "cronet_aml_base_third_party_double_conversion_double_conversion",
- "cronet_aml_base_third_party_dynamic_annotations_dynamic_annotations",
- "cronet_aml_third_party_abseil_cpp_absl_base_base",
- "cronet_aml_third_party_abseil_cpp_absl_base_log_severity",
- "cronet_aml_third_party_abseil_cpp_absl_base_malloc_internal",
- "cronet_aml_third_party_abseil_cpp_absl_base_raw_logging_internal",
- "cronet_aml_third_party_abseil_cpp_absl_base_spinlock_wait",
- "cronet_aml_third_party_abseil_cpp_absl_base_strerror",
- "cronet_aml_third_party_abseil_cpp_absl_base_throw_delegate",
- "cronet_aml_third_party_abseil_cpp_absl_container_hashtablez_sampler",
- "cronet_aml_third_party_abseil_cpp_absl_container_raw_hash_set",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_debugging_internal",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_demangle_internal",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_examine_stack",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_failure_signal_handler",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_stacktrace",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_symbolize",
- "cronet_aml_third_party_abseil_cpp_absl_hash_city",
- "cronet_aml_third_party_abseil_cpp_absl_hash_hash",
- "cronet_aml_third_party_abseil_cpp_absl_hash_low_level_hash",
- "cronet_aml_third_party_abseil_cpp_absl_numeric_int128",
- "cronet_aml_third_party_abseil_cpp_absl_profiling_exponential_biased",
- "cronet_aml_third_party_abseil_cpp_absl_random_distributions",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_platform",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_pool_urbg",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_hwaes",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_hwaes_impl",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_slow",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_seed_material",
- "cronet_aml_third_party_abseil_cpp_absl_random_seed_gen_exception",
- "cronet_aml_third_party_abseil_cpp_absl_random_seed_sequences",
- "cronet_aml_third_party_abseil_cpp_absl_status_status",
- "cronet_aml_third_party_abseil_cpp_absl_status_statusor",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cord",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cord_internal",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_functions",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_handle",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_info",
- "cronet_aml_third_party_abseil_cpp_absl_strings_internal",
- "cronet_aml_third_party_abseil_cpp_absl_strings_str_format_internal",
- "cronet_aml_third_party_abseil_cpp_absl_strings_strings",
- "cronet_aml_third_party_abseil_cpp_absl_synchronization_graphcycles_internal",
- "cronet_aml_third_party_abseil_cpp_absl_synchronization_synchronization",
- "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_civil_time",
- "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_time_zone",
- "cronet_aml_third_party_abseil_cpp_absl_time_time",
- "cronet_aml_third_party_abseil_cpp_absl_types_bad_optional_access",
- "cronet_aml_third_party_abseil_cpp_absl_types_bad_variant_access",
- "cronet_aml_third_party_android_ndk_cpu_features",
- "cronet_aml_third_party_ashmem_ashmem",
- "cronet_aml_third_party_boringssl_boringssl",
- "cronet_aml_third_party_boringssl_boringssl_asm",
- "cronet_aml_third_party_icu_icui18n",
- "cronet_aml_third_party_icu_icuuc_private",
- "cronet_aml_third_party_libevent_libevent",
- "cronet_aml_third_party_modp_b64_modp_b64",
- ],
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DHAVE_SYS_UIO_H",
- "-DIS_URI_TEMPLATE_IMPL",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_FORTIFY_SOURCE=2",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D__STDC_CONSTANT_MACROS",
- "-D__STDC_FORMAT_MACROS",
- "-Oz",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "third_party/abseil-cpp/",
- "third_party/boringssl/src/include/",
- ],
- cpp_std: "c++17",
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- "-Wl,--script,external/cronet/base/android/library_loader/anchor_functions.lds",
- "-Wl,-wrap,asprintf",
- "-Wl,-wrap,calloc",
- "-Wl,-wrap,free",
- "-Wl,-wrap,getcwd",
- "-Wl,-wrap,malloc",
- "-Wl,-wrap,malloc_usable_size",
- "-Wl,-wrap,memalign",
- "-Wl,-wrap,posix_memalign",
- "-Wl,-wrap,pvalloc",
- "-Wl,-wrap,realloc",
- "-Wl,-wrap,realpath",
- "-Wl,-wrap,strdup",
- "-Wl,-wrap,strndup",
- "-Wl,-wrap,valloc",
- "-Wl,-wrap,vasprintf",
- ],
- target: {
- android_arm: {
- cflags: [
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-fstack-protector",
- "-msse3",
- ],
- },
- },
-}
-
-// GN: //net:uri_template__testing
-cc_library_static {
- name: "cronet_aml_net_uri_template__testing",
- srcs: [
- "net/third_party/uri_template/uri_template.cc",
- ],
- shared_libs: [
- "libandroid",
- "liblog",
- ],
- static_libs: [
- "cronet_aml_base_allocator_partition_allocator_partition_alloc__testing",
- "cronet_aml_base_base__testing",
- "cronet_aml_base_base_static__testing",
- "cronet_aml_base_nodebug_assertion__testing",
- "cronet_aml_base_third_party_double_conversion_double_conversion__testing",
- "cronet_aml_base_third_party_dynamic_annotations_dynamic_annotations__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_base__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_log_severity__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_malloc_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_raw_logging_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_spinlock_wait__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_strerror__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_throw_delegate__testing",
- "cronet_aml_third_party_abseil_cpp_absl_container_hashtablez_sampler__testing",
- "cronet_aml_third_party_abseil_cpp_absl_container_raw_hash_set__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_debugging_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_demangle_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_examine_stack__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_failure_signal_handler__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_stacktrace__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_symbolize__testing",
- "cronet_aml_third_party_abseil_cpp_absl_hash_city__testing",
- "cronet_aml_third_party_abseil_cpp_absl_hash_hash__testing",
- "cronet_aml_third_party_abseil_cpp_absl_hash_low_level_hash__testing",
- "cronet_aml_third_party_abseil_cpp_absl_numeric_int128__testing",
- "cronet_aml_third_party_abseil_cpp_absl_profiling_exponential_biased__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_distributions__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_platform__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_pool_urbg__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_hwaes__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_hwaes_impl__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_slow__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_seed_material__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_seed_gen_exception__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_seed_sequences__testing",
- "cronet_aml_third_party_abseil_cpp_absl_status_status__testing",
- "cronet_aml_third_party_abseil_cpp_absl_status_statusor__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cord__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cord_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_functions__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_handle__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_info__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_str_format_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_strings__testing",
- "cronet_aml_third_party_abseil_cpp_absl_synchronization_graphcycles_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_synchronization_synchronization__testing",
- "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_civil_time__testing",
- "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_time_zone__testing",
- "cronet_aml_third_party_abseil_cpp_absl_time_time__testing",
- "cronet_aml_third_party_abseil_cpp_absl_types_bad_optional_access__testing",
- "cronet_aml_third_party_abseil_cpp_absl_types_bad_variant_access__testing",
- "cronet_aml_third_party_android_ndk_cpu_features__testing",
- "cronet_aml_third_party_ashmem_ashmem__testing",
- "cronet_aml_third_party_boringssl_boringssl__testing",
- "cronet_aml_third_party_boringssl_boringssl_asm__testing",
- "cronet_aml_third_party_icu_icui18n__testing",
- "cronet_aml_third_party_icu_icuuc_private__testing",
- "cronet_aml_third_party_libevent_libevent__testing",
- "cronet_aml_third_party_modp_b64_modp_b64__testing",
- ],
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DHAVE_SYS_UIO_H",
- "-DIS_URI_TEMPLATE_IMPL",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_FORTIFY_SOURCE=2",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D__STDC_CONSTANT_MACROS",
- "-D__STDC_FORMAT_MACROS",
- "-Oz",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "third_party/abseil-cpp/",
- "third_party/boringssl/src/include/",
- ],
- cpp_std: "c++17",
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- "-Wl,--script,external/cronet/base/android/library_loader/anchor_functions.lds",
- "-Wl,-wrap,asprintf",
- "-Wl,-wrap,calloc",
- "-Wl,-wrap,free",
- "-Wl,-wrap,getcwd",
- "-Wl,-wrap,malloc",
- "-Wl,-wrap,malloc_usable_size",
- "-Wl,-wrap,memalign",
- "-Wl,-wrap,posix_memalign",
- "-Wl,-wrap,pvalloc",
- "-Wl,-wrap,realloc",
- "-Wl,-wrap,realpath",
- "-Wl,-wrap,strdup",
- "-Wl,-wrap,strndup",
- "-Wl,-wrap,valloc",
- "-Wl,-wrap,vasprintf",
- ],
- target: {
- android_arm: {
- cflags: [
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-fstack-protector",
- "-msse3",
- ],
- },
- },
-}
-
-// GN: //testing/android/native_test:native_test_jni_headers__testing
-cc_genrule {
- name: "cronet_aml_testing_android_native_test_native_test_jni_headers__testing",
- srcs: [
- "testing/android/native_test/java/src/org/chromium/native_test/MainRunner.java",
- "testing/android/native_test/java/src/org/chromium/native_test/NativeTest.java",
- ],
- cmd: "$(location base/android/jni_generator/jni_generator.py) --ptr_type " +
- "long " +
- "--output_dir " +
- "$(genDir)/testing/android/native_test/native_test_jni_headers " +
- "--includes " +
- "base/android/jni_generator/jni_generator_helper.h " +
- "--use_proxy_hash " +
- "--output_name " +
- "MainRunner_jni.h " +
- "--output_name " +
- "NativeTest_jni.h " +
- "--input_file " +
- "$(location testing/android/native_test/java/src/org/chromium/native_test/MainRunner.java) " +
- "--input_file " +
- "$(location testing/android/native_test/java/src/org/chromium/native_test/NativeTest.java)",
- out: [
- "testing/android/native_test/native_test_jni_headers/MainRunner_jni.h",
- "testing/android/native_test/native_test_jni_headers/NativeTest_jni.h",
- ],
- tool_files: [
- "base/android/jni_generator/android_jar.classes",
- "base/android/jni_generator/jni_generator.py",
- "build/android/gyp/util/__init__.py",
- "build/android/gyp/util/build_utils.py",
- "build/gn_helpers.py",
- ],
- apex_available: [
- "com.android.tethering",
- ],
-}
-
-// GN: //testing/android/native_test:native_test_native_code__testing
-cc_library_static {
- name: "cronet_aml_testing_android_native_test_native_test_native_code__testing",
- srcs: [
- "testing/android/native_test/native_test_jni_onload.cc",
- ],
- shared_libs: [
- "libandroid",
- "liblog",
- "libz",
- ],
- static_libs: [
- "cronet_aml_base_allocator_partition_allocator_partition_alloc__testing",
- "cronet_aml_base_base__testing",
- "cronet_aml_base_base_static__testing",
- "cronet_aml_base_i18n__testing",
- "cronet_aml_base_nodebug_assertion__testing",
- "cronet_aml_base_test_test_config__testing",
- "cronet_aml_base_test_test_support__testing",
- "cronet_aml_base_third_party_double_conversion_double_conversion__testing",
- "cronet_aml_base_third_party_dynamic_annotations_dynamic_annotations__testing",
- "cronet_aml_testing_android_native_test_native_test_support__testing",
- "cronet_aml_testing_gtest_gtest__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_base__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_log_severity__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_malloc_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_raw_logging_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_spinlock_wait__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_strerror__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_throw_delegate__testing",
- "cronet_aml_third_party_abseil_cpp_absl_container_hashtablez_sampler__testing",
- "cronet_aml_third_party_abseil_cpp_absl_container_raw_hash_set__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_debugging_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_demangle_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_examine_stack__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_failure_signal_handler__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_stacktrace__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_symbolize__testing",
- "cronet_aml_third_party_abseil_cpp_absl_hash_city__testing",
- "cronet_aml_third_party_abseil_cpp_absl_hash_hash__testing",
- "cronet_aml_third_party_abseil_cpp_absl_hash_low_level_hash__testing",
- "cronet_aml_third_party_abseil_cpp_absl_numeric_int128__testing",
- "cronet_aml_third_party_abseil_cpp_absl_profiling_exponential_biased__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_distributions__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_platform__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_pool_urbg__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_hwaes__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_hwaes_impl__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_slow__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_seed_material__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_seed_gen_exception__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_seed_sequences__testing",
- "cronet_aml_third_party_abseil_cpp_absl_status_status__testing",
- "cronet_aml_third_party_abseil_cpp_absl_status_statusor__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cord__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cord_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_functions__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_handle__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_info__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_str_format_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_strings__testing",
- "cronet_aml_third_party_abseil_cpp_absl_synchronization_graphcycles_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_synchronization_synchronization__testing",
- "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_civil_time__testing",
- "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_time_zone__testing",
- "cronet_aml_third_party_abseil_cpp_absl_time_time__testing",
- "cronet_aml_third_party_abseil_cpp_absl_types_bad_optional_access__testing",
- "cronet_aml_third_party_abseil_cpp_absl_types_bad_variant_access__testing",
- "cronet_aml_third_party_android_ndk_cpu_features__testing",
- "cronet_aml_third_party_ashmem_ashmem__testing",
- "cronet_aml_third_party_boringssl_boringssl__testing",
- "cronet_aml_third_party_boringssl_boringssl_asm__testing",
- "cronet_aml_third_party_ced_ced__testing",
- "cronet_aml_third_party_googletest_gmock__testing",
- "cronet_aml_third_party_googletest_gtest__testing",
- "cronet_aml_third_party_icu_icui18n__testing",
- "cronet_aml_third_party_icu_icuuc_private__testing",
- "cronet_aml_third_party_libevent_libevent__testing",
- "cronet_aml_third_party_libxml_libxml__testing",
- "cronet_aml_third_party_libxml_libxml_utils__testing",
- "cronet_aml_third_party_libxml_xml_reader__testing",
- "cronet_aml_third_party_modp_b64_modp_b64__testing",
- ],
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DHAVE_SYS_UIO_H",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_FORTIFY_SOURCE=2",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D__STDC_CONSTANT_MACROS",
- "-D__STDC_FORMAT_MACROS",
- "-Oz",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "third_party/abseil-cpp/",
- "third_party/boringssl/src/include/",
- ],
- cpp_std: "c++17",
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- "-Wl,--script,external/cronet/base/android/library_loader/anchor_functions.lds",
- "-Wl,-wrap,asprintf",
- "-Wl,-wrap,calloc",
- "-Wl,-wrap,free",
- "-Wl,-wrap,getcwd",
- "-Wl,-wrap,malloc",
- "-Wl,-wrap,malloc_usable_size",
- "-Wl,-wrap,memalign",
- "-Wl,-wrap,posix_memalign",
- "-Wl,-wrap,pvalloc",
- "-Wl,-wrap,realloc",
- "-Wl,-wrap,realpath",
- "-Wl,-wrap,strdup",
- "-Wl,-wrap,strndup",
- "-Wl,-wrap,valloc",
- "-Wl,-wrap,vasprintf",
- ],
- target: {
- android_arm: {
- cflags: [
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-fstack-protector",
- "-msse3",
- ],
- },
- },
-}
-
-// GN: //testing/android/native_test:native_test_support__testing
-cc_library_static {
- name: "cronet_aml_testing_android_native_test_native_test_support__testing",
- srcs: [
- "testing/android/native_test/main_runner.cc",
- "testing/android/native_test/native_test_launcher.cc",
- "testing/android/native_test/native_test_util.cc",
- ],
- shared_libs: [
- "libandroid",
- "liblog",
- "libz",
- ],
- static_libs: [
- "cronet_aml_base_allocator_partition_allocator_partition_alloc__testing",
- "cronet_aml_base_base__testing",
- "cronet_aml_base_base_static__testing",
- "cronet_aml_base_i18n__testing",
- "cronet_aml_base_nodebug_assertion__testing",
- "cronet_aml_base_test_test_config__testing",
- "cronet_aml_base_test_test_support__testing",
- "cronet_aml_base_third_party_double_conversion_double_conversion__testing",
- "cronet_aml_base_third_party_dynamic_annotations_dynamic_annotations__testing",
- "cronet_aml_testing_gtest_gtest__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_base__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_log_severity__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_malloc_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_raw_logging_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_spinlock_wait__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_strerror__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_throw_delegate__testing",
- "cronet_aml_third_party_abseil_cpp_absl_container_hashtablez_sampler__testing",
- "cronet_aml_third_party_abseil_cpp_absl_container_raw_hash_set__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_debugging_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_demangle_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_examine_stack__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_failure_signal_handler__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_stacktrace__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_symbolize__testing",
- "cronet_aml_third_party_abseil_cpp_absl_hash_city__testing",
- "cronet_aml_third_party_abseil_cpp_absl_hash_hash__testing",
- "cronet_aml_third_party_abseil_cpp_absl_hash_low_level_hash__testing",
- "cronet_aml_third_party_abseil_cpp_absl_numeric_int128__testing",
- "cronet_aml_third_party_abseil_cpp_absl_profiling_exponential_biased__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_distributions__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_platform__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_pool_urbg__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_hwaes__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_hwaes_impl__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_slow__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_seed_material__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_seed_gen_exception__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_seed_sequences__testing",
- "cronet_aml_third_party_abseil_cpp_absl_status_status__testing",
- "cronet_aml_third_party_abseil_cpp_absl_status_statusor__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cord__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cord_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_functions__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_handle__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_info__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_str_format_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_strings__testing",
- "cronet_aml_third_party_abseil_cpp_absl_synchronization_graphcycles_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_synchronization_synchronization__testing",
- "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_civil_time__testing",
- "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_time_zone__testing",
- "cronet_aml_third_party_abseil_cpp_absl_time_time__testing",
- "cronet_aml_third_party_abseil_cpp_absl_types_bad_optional_access__testing",
- "cronet_aml_third_party_abseil_cpp_absl_types_bad_variant_access__testing",
- "cronet_aml_third_party_android_ndk_cpu_features__testing",
- "cronet_aml_third_party_ashmem_ashmem__testing",
- "cronet_aml_third_party_boringssl_boringssl__testing",
- "cronet_aml_third_party_boringssl_boringssl_asm__testing",
- "cronet_aml_third_party_ced_ced__testing",
- "cronet_aml_third_party_googletest_gmock__testing",
- "cronet_aml_third_party_googletest_gtest__testing",
- "cronet_aml_third_party_icu_icui18n__testing",
- "cronet_aml_third_party_icu_icuuc_private__testing",
- "cronet_aml_third_party_libevent_libevent__testing",
- "cronet_aml_third_party_libxml_libxml__testing",
- "cronet_aml_third_party_libxml_libxml_utils__testing",
- "cronet_aml_third_party_libxml_xml_reader__testing",
- "cronet_aml_third_party_modp_b64_modp_b64__testing",
- ],
- generated_headers: [
- "cronet_aml_base_debugging_buildflags__testing",
- "cronet_aml_base_logging_buildflags__testing",
- "cronet_aml_build_chromeos_buildflags__testing",
- "cronet_aml_testing_android_native_test_native_test_jni_headers__testing",
- ],
- export_generated_headers: [
- "cronet_aml_base_debugging_buildflags__testing",
- "cronet_aml_base_logging_buildflags__testing",
- "cronet_aml_build_chromeos_buildflags__testing",
- "cronet_aml_testing_android_native_test_native_test_jni_headers__testing",
- ],
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DGTEST_API_=",
- "-DGTEST_HAS_ABSL=1",
- "-DGTEST_HAS_POSIX_RE=0",
- "-DGTEST_HAS_TR1_TUPLE=0",
- "-DGTEST_LANG_CXX11=1",
- "-DHAVE_SYS_UIO_H",
- "-DICU_UTIL_DATA_IMPL=ICU_UTIL_DATA_FILE",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-DUNIT_TEST",
- "-DUSE_CHROMIUM_ICU=1",
- "-DU_ENABLE_DYLOAD=0",
- "-DU_ENABLE_RESOURCE_TRACING=0",
- "-DU_ENABLE_TRACING=1",
- "-DU_STATIC_IMPLEMENTATION",
- "-DU_USING_ICU_NAMESPACE=0",
- "-D_FORTIFY_SOURCE=2",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D__STDC_CONSTANT_MACROS",
- "-D__STDC_FORMAT_MACROS",
- "-Oz",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "third_party/abseil-cpp/",
- "third_party/boringssl/src/include/",
- "third_party/ced/src/",
- "third_party/googletest/custom/",
- "third_party/googletest/src/googlemock/include/",
- "third_party/googletest/src/googletest/include/",
- "third_party/icu/source/common/",
- "third_party/icu/source/i18n/",
- ],
- cpp_std: "c++17",
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- "-Wl,--script,external/cronet/base/android/library_loader/anchor_functions.lds",
- "-Wl,-wrap,asprintf",
- "-Wl,-wrap,calloc",
- "-Wl,-wrap,free",
- "-Wl,-wrap,getcwd",
- "-Wl,-wrap,malloc",
- "-Wl,-wrap,malloc_usable_size",
- "-Wl,-wrap,memalign",
- "-Wl,-wrap,posix_memalign",
- "-Wl,-wrap,pvalloc",
- "-Wl,-wrap,realloc",
- "-Wl,-wrap,realpath",
- "-Wl,-wrap,strdup",
- "-Wl,-wrap,strndup",
- "-Wl,-wrap,valloc",
- "-Wl,-wrap,vasprintf",
- ],
- target: {
- android_arm: {
- cflags: [
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-fstack-protector",
- "-msse3",
- ],
- },
- },
-}
-
-// GN: //testing/gtest:gtest__testing
-cc_library_static {
- name: "cronet_aml_testing_gtest_gtest__testing",
- srcs: [
- "testing/gtest/empty.cc",
- "testing/multiprocess_func_list.cc",
- ],
- shared_libs: [
- "libandroid",
- "liblog",
- ],
- static_libs: [
- "cronet_aml_base_allocator_partition_allocator_partition_alloc__testing",
- "cronet_aml_base_base__testing",
- "cronet_aml_base_base_static__testing",
- "cronet_aml_base_nodebug_assertion__testing",
- "cronet_aml_base_third_party_double_conversion_double_conversion__testing",
- "cronet_aml_base_third_party_dynamic_annotations_dynamic_annotations__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_base__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_log_severity__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_malloc_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_raw_logging_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_spinlock_wait__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_strerror__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_throw_delegate__testing",
- "cronet_aml_third_party_abseil_cpp_absl_container_hashtablez_sampler__testing",
- "cronet_aml_third_party_abseil_cpp_absl_container_raw_hash_set__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_debugging_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_demangle_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_examine_stack__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_failure_signal_handler__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_stacktrace__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_symbolize__testing",
- "cronet_aml_third_party_abseil_cpp_absl_hash_city__testing",
- "cronet_aml_third_party_abseil_cpp_absl_hash_hash__testing",
- "cronet_aml_third_party_abseil_cpp_absl_hash_low_level_hash__testing",
- "cronet_aml_third_party_abseil_cpp_absl_numeric_int128__testing",
- "cronet_aml_third_party_abseil_cpp_absl_profiling_exponential_biased__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_distributions__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_platform__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_pool_urbg__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_hwaes__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_hwaes_impl__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_slow__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_seed_material__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_seed_gen_exception__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_seed_sequences__testing",
- "cronet_aml_third_party_abseil_cpp_absl_status_status__testing",
- "cronet_aml_third_party_abseil_cpp_absl_status_statusor__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cord__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cord_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_functions__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_handle__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_info__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_str_format_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_strings__testing",
- "cronet_aml_third_party_abseil_cpp_absl_synchronization_graphcycles_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_synchronization_synchronization__testing",
- "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_civil_time__testing",
- "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_time_zone__testing",
- "cronet_aml_third_party_abseil_cpp_absl_time_time__testing",
- "cronet_aml_third_party_abseil_cpp_absl_types_bad_optional_access__testing",
- "cronet_aml_third_party_abseil_cpp_absl_types_bad_variant_access__testing",
- "cronet_aml_third_party_android_ndk_cpu_features__testing",
- "cronet_aml_third_party_ashmem_ashmem__testing",
- "cronet_aml_third_party_boringssl_boringssl__testing",
- "cronet_aml_third_party_boringssl_boringssl_asm__testing",
- "cronet_aml_third_party_googletest_gtest__testing",
- "cronet_aml_third_party_icu_icui18n__testing",
- "cronet_aml_third_party_icu_icuuc_private__testing",
- "cronet_aml_third_party_libevent_libevent__testing",
- "cronet_aml_third_party_modp_b64_modp_b64__testing",
- ],
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DGTEST_API_=",
- "-DGTEST_HAS_ABSL=1",
- "-DGTEST_HAS_POSIX_RE=0",
- "-DGTEST_HAS_TR1_TUPLE=0",
- "-DGTEST_LANG_CXX11=1",
- "-DHAVE_SYS_UIO_H",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-DUNIT_TEST",
- "-D_FORTIFY_SOURCE=2",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D__STDC_CONSTANT_MACROS",
- "-D__STDC_FORMAT_MACROS",
- "-Oz",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "third_party/abseil-cpp/",
- "third_party/googletest/custom/",
- "third_party/googletest/src/googletest/include/",
- ],
- cpp_std: "c++17",
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- "-Wl,--script,external/cronet/base/android/library_loader/anchor_functions.lds",
- "-Wl,-wrap,asprintf",
- "-Wl,-wrap,calloc",
- "-Wl,-wrap,free",
- "-Wl,-wrap,getcwd",
- "-Wl,-wrap,malloc",
- "-Wl,-wrap,malloc_usable_size",
- "-Wl,-wrap,memalign",
- "-Wl,-wrap,posix_memalign",
- "-Wl,-wrap,pvalloc",
- "-Wl,-wrap,realloc",
- "-Wl,-wrap,realpath",
- "-Wl,-wrap,strdup",
- "-Wl,-wrap,strndup",
- "-Wl,-wrap,valloc",
- "-Wl,-wrap,vasprintf",
- ],
- target: {
- android_arm: {
- cflags: [
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-fstack-protector",
- "-msse3",
- ],
- },
- },
-}
-
-// GN: //third_party/abseil-cpp/absl/base:base
-cc_library_static {
- name: "cronet_aml_third_party_abseil_cpp_absl_base_base",
- srcs: [
- "third_party/abseil-cpp/absl/base/internal/cycleclock.cc",
- "third_party/abseil-cpp/absl/base/internal/spinlock.cc",
- "third_party/abseil-cpp/absl/base/internal/sysinfo.cc",
- "third_party/abseil-cpp/absl/base/internal/thread_identity.cc",
- "third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.cc",
- ],
- static_libs: [
- "cronet_aml_third_party_abseil_cpp_absl_base_log_severity",
- "cronet_aml_third_party_abseil_cpp_absl_base_raw_logging_internal",
- "cronet_aml_third_party_abseil_cpp_absl_base_spinlock_wait",
- ],
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DABSL_ALLOCATOR_NOTHROW=1",
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DHAVE_SYS_UIO_H",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-Oz",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "third_party/abseil-cpp/",
- ],
- cpp_std: "c++17",
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- ],
- target: {
- android_arm: {
- cflags: [
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-fstack-protector",
- "-msse3",
- ],
- },
- },
-}
-
-// GN: //third_party/abseil-cpp/absl/base:base__testing
-cc_library_static {
- name: "cronet_aml_third_party_abseil_cpp_absl_base_base__testing",
- srcs: [
- "third_party/abseil-cpp/absl/base/internal/cycleclock.cc",
- "third_party/abseil-cpp/absl/base/internal/spinlock.cc",
- "third_party/abseil-cpp/absl/base/internal/sysinfo.cc",
- "third_party/abseil-cpp/absl/base/internal/thread_identity.cc",
- "third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.cc",
- ],
- static_libs: [
- "cronet_aml_third_party_abseil_cpp_absl_base_log_severity__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_raw_logging_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_spinlock_wait__testing",
- ],
- host_supported: true,
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DABSL_ALLOCATOR_NOTHROW=1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "third_party/abseil-cpp/",
- ],
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- ],
- target: {
- android_arm: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- "-msse3",
- ],
- },
- host: {
- cflags: [
- "-DCR_SYSROOT_KEY=20220331T153654Z-0",
- "-DUSE_AURA=1",
- "-DUSE_OZONE=1",
- "-DUSE_UDEV",
- "-D_FILE_OFFSET_BITS=64",
- "-D_LARGEFILE64_SOURCE",
- "-D_LARGEFILE_SOURCE",
- "-O2",
- "-fstack-protector",
- "-msse3",
- ],
- compile_multilib: "64",
- },
- },
-}
-
-// GN: //third_party/abseil-cpp/absl/base:log_severity
-cc_library_static {
- name: "cronet_aml_third_party_abseil_cpp_absl_base_log_severity",
- srcs: [
- "third_party/abseil-cpp/absl/base/log_severity.cc",
- ],
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DABSL_ALLOCATOR_NOTHROW=1",
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DHAVE_SYS_UIO_H",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-Oz",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "third_party/abseil-cpp/",
- ],
- cpp_std: "c++17",
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- ],
- target: {
- android_arm: {
- cflags: [
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-fstack-protector",
- "-msse3",
- ],
- },
- },
-}
-
-// GN: //third_party/abseil-cpp/absl/base:log_severity__testing
-cc_library_static {
- name: "cronet_aml_third_party_abseil_cpp_absl_base_log_severity__testing",
- srcs: [
- "third_party/abseil-cpp/absl/base/log_severity.cc",
- ],
- host_supported: true,
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DABSL_ALLOCATOR_NOTHROW=1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "third_party/abseil-cpp/",
- ],
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- ],
- target: {
- android_arm: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- "-msse3",
- ],
- },
- host: {
- cflags: [
- "-DCR_SYSROOT_KEY=20220331T153654Z-0",
- "-DUSE_AURA=1",
- "-DUSE_OZONE=1",
- "-DUSE_UDEV",
- "-D_FILE_OFFSET_BITS=64",
- "-D_LARGEFILE64_SOURCE",
- "-D_LARGEFILE_SOURCE",
- "-O2",
- "-fstack-protector",
- "-msse3",
- ],
- compile_multilib: "64",
- },
- },
-}
-
-// GN: //third_party/abseil-cpp/absl/base:malloc_internal
-cc_library_static {
- name: "cronet_aml_third_party_abseil_cpp_absl_base_malloc_internal",
- srcs: [
- "third_party/abseil-cpp/absl/base/internal/low_level_alloc.cc",
- ],
- static_libs: [
- "cronet_aml_third_party_abseil_cpp_absl_base_base",
- "cronet_aml_third_party_abseil_cpp_absl_base_log_severity",
- "cronet_aml_third_party_abseil_cpp_absl_base_raw_logging_internal",
- "cronet_aml_third_party_abseil_cpp_absl_base_spinlock_wait",
- ],
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DABSL_ALLOCATOR_NOTHROW=1",
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DHAVE_SYS_UIO_H",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-Oz",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "third_party/abseil-cpp/",
- ],
- cpp_std: "c++17",
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- ],
- target: {
- android_arm: {
- cflags: [
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-fstack-protector",
- "-msse3",
- ],
- },
- },
-}
-
-// GN: //third_party/abseil-cpp/absl/base:malloc_internal__testing
-cc_library_static {
- name: "cronet_aml_third_party_abseil_cpp_absl_base_malloc_internal__testing",
- srcs: [
- "third_party/abseil-cpp/absl/base/internal/low_level_alloc.cc",
- ],
- static_libs: [
- "cronet_aml_third_party_abseil_cpp_absl_base_base__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_log_severity__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_raw_logging_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_spinlock_wait__testing",
- ],
- host_supported: true,
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DABSL_ALLOCATOR_NOTHROW=1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "third_party/abseil-cpp/",
- ],
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- ],
- target: {
- android_arm: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- "-msse3",
- ],
- },
- host: {
- cflags: [
- "-DCR_SYSROOT_KEY=20220331T153654Z-0",
- "-DUSE_AURA=1",
- "-DUSE_OZONE=1",
- "-DUSE_UDEV",
- "-D_FILE_OFFSET_BITS=64",
- "-D_LARGEFILE64_SOURCE",
- "-D_LARGEFILE_SOURCE",
- "-O2",
- "-fstack-protector",
- "-msse3",
- ],
- compile_multilib: "64",
- },
- },
-}
-
-// GN: //third_party/abseil-cpp/absl/base:raw_logging_internal
-cc_library_static {
- name: "cronet_aml_third_party_abseil_cpp_absl_base_raw_logging_internal",
- srcs: [
- "third_party/abseil-cpp/absl/base/internal/raw_logging.cc",
- ],
- static_libs: [
- "cronet_aml_third_party_abseil_cpp_absl_base_log_severity",
- ],
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DABSL_ALLOCATOR_NOTHROW=1",
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DHAVE_SYS_UIO_H",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-Oz",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "third_party/abseil-cpp/",
- ],
- cpp_std: "c++17",
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- ],
- target: {
- android_arm: {
- cflags: [
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-fstack-protector",
- "-msse3",
- ],
- },
- },
-}
-
-// GN: //third_party/abseil-cpp/absl/base:raw_logging_internal__testing
-cc_library_static {
- name: "cronet_aml_third_party_abseil_cpp_absl_base_raw_logging_internal__testing",
- srcs: [
- "third_party/abseil-cpp/absl/base/internal/raw_logging.cc",
- ],
- static_libs: [
- "cronet_aml_third_party_abseil_cpp_absl_base_log_severity__testing",
- ],
- host_supported: true,
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DABSL_ALLOCATOR_NOTHROW=1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "third_party/abseil-cpp/",
- ],
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- ],
- target: {
- android_arm: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- "-msse3",
- ],
- },
- host: {
- cflags: [
- "-DCR_SYSROOT_KEY=20220331T153654Z-0",
- "-DUSE_AURA=1",
- "-DUSE_OZONE=1",
- "-DUSE_UDEV",
- "-D_FILE_OFFSET_BITS=64",
- "-D_LARGEFILE64_SOURCE",
- "-D_LARGEFILE_SOURCE",
- "-O2",
- "-fstack-protector",
- "-msse3",
- ],
- compile_multilib: "64",
- },
- },
-}
-
-// GN: //third_party/abseil-cpp/absl/base:spinlock_wait
-cc_library_static {
- name: "cronet_aml_third_party_abseil_cpp_absl_base_spinlock_wait",
- srcs: [
- "third_party/abseil-cpp/absl/base/internal/spinlock_wait.cc",
- ],
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DABSL_ALLOCATOR_NOTHROW=1",
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DHAVE_SYS_UIO_H",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-Oz",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "third_party/abseil-cpp/",
- ],
- cpp_std: "c++17",
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- ],
- target: {
- android_arm: {
- cflags: [
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-fstack-protector",
- "-msse3",
- ],
- },
- },
-}
-
-// GN: //third_party/abseil-cpp/absl/base:spinlock_wait__testing
-cc_library_static {
- name: "cronet_aml_third_party_abseil_cpp_absl_base_spinlock_wait__testing",
- srcs: [
- "third_party/abseil-cpp/absl/base/internal/spinlock_wait.cc",
- ],
- host_supported: true,
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DABSL_ALLOCATOR_NOTHROW=1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "third_party/abseil-cpp/",
- ],
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- ],
- target: {
- android_arm: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- "-msse3",
- ],
- },
- host: {
- cflags: [
- "-DCR_SYSROOT_KEY=20220331T153654Z-0",
- "-DUSE_AURA=1",
- "-DUSE_OZONE=1",
- "-DUSE_UDEV",
- "-D_FILE_OFFSET_BITS=64",
- "-D_LARGEFILE64_SOURCE",
- "-D_LARGEFILE_SOURCE",
- "-O2",
- "-fstack-protector",
- "-msse3",
- ],
- compile_multilib: "64",
- },
- },
-}
-
-// GN: //third_party/abseil-cpp/absl/base:strerror
-cc_library_static {
- name: "cronet_aml_third_party_abseil_cpp_absl_base_strerror",
- srcs: [
- "third_party/abseil-cpp/absl/base/internal/strerror.cc",
- ],
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DABSL_ALLOCATOR_NOTHROW=1",
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DHAVE_SYS_UIO_H",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-Oz",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "third_party/abseil-cpp/",
- ],
- cpp_std: "c++17",
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- ],
- target: {
- android_arm: {
- cflags: [
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-fstack-protector",
- "-msse3",
- ],
- },
- },
-}
-
-// GN: //third_party/abseil-cpp/absl/base:strerror__testing
-cc_library_static {
- name: "cronet_aml_third_party_abseil_cpp_absl_base_strerror__testing",
- srcs: [
- "third_party/abseil-cpp/absl/base/internal/strerror.cc",
- ],
- host_supported: true,
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DABSL_ALLOCATOR_NOTHROW=1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "third_party/abseil-cpp/",
- ],
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- ],
- target: {
- android_arm: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- "-msse3",
- ],
- },
- host: {
- cflags: [
- "-DCR_SYSROOT_KEY=20220331T153654Z-0",
- "-DUSE_AURA=1",
- "-DUSE_OZONE=1",
- "-DUSE_UDEV",
- "-D_FILE_OFFSET_BITS=64",
- "-D_LARGEFILE64_SOURCE",
- "-D_LARGEFILE_SOURCE",
- "-O2",
- "-fstack-protector",
- "-msse3",
- ],
- compile_multilib: "64",
- },
- },
-}
-
-// GN: //third_party/abseil-cpp/absl/base:throw_delegate
-cc_library_static {
- name: "cronet_aml_third_party_abseil_cpp_absl_base_throw_delegate",
- srcs: [
- "third_party/abseil-cpp/absl/base/internal/throw_delegate.cc",
- ],
- static_libs: [
- "cronet_aml_third_party_abseil_cpp_absl_base_log_severity",
- "cronet_aml_third_party_abseil_cpp_absl_base_raw_logging_internal",
- ],
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DABSL_ALLOCATOR_NOTHROW=1",
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DHAVE_SYS_UIO_H",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-Oz",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "third_party/abseil-cpp/",
- ],
- cpp_std: "c++17",
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- ],
- target: {
- android_arm: {
- cflags: [
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-fstack-protector",
- "-msse3",
- ],
- },
- },
-}
-
-// GN: //third_party/abseil-cpp/absl/base:throw_delegate__testing
-cc_library_static {
- name: "cronet_aml_third_party_abseil_cpp_absl_base_throw_delegate__testing",
- srcs: [
- "third_party/abseil-cpp/absl/base/internal/throw_delegate.cc",
- ],
- static_libs: [
- "cronet_aml_third_party_abseil_cpp_absl_base_log_severity__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_raw_logging_internal__testing",
- ],
- host_supported: true,
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DABSL_ALLOCATOR_NOTHROW=1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "third_party/abseil-cpp/",
- ],
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- ],
- target: {
- android_arm: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- "-msse3",
- ],
- },
- host: {
- cflags: [
- "-DCR_SYSROOT_KEY=20220331T153654Z-0",
- "-DUSE_AURA=1",
- "-DUSE_OZONE=1",
- "-DUSE_UDEV",
- "-D_FILE_OFFSET_BITS=64",
- "-D_LARGEFILE64_SOURCE",
- "-D_LARGEFILE_SOURCE",
- "-O2",
- "-fstack-protector",
- "-msse3",
- ],
- compile_multilib: "64",
- },
- },
-}
-
-// GN: //third_party/abseil-cpp/absl/container:hashtablez_sampler
-cc_library_static {
- name: "cronet_aml_third_party_abseil_cpp_absl_container_hashtablez_sampler",
- srcs: [
- "third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.cc",
- "third_party/abseil-cpp/absl/container/internal/hashtablez_sampler_force_weak_definition.cc",
- ],
- static_libs: [
- "cronet_aml_third_party_abseil_cpp_absl_base_base",
- "cronet_aml_third_party_abseil_cpp_absl_base_log_severity",
- "cronet_aml_third_party_abseil_cpp_absl_base_malloc_internal",
- "cronet_aml_third_party_abseil_cpp_absl_base_raw_logging_internal",
- "cronet_aml_third_party_abseil_cpp_absl_base_spinlock_wait",
- "cronet_aml_third_party_abseil_cpp_absl_base_throw_delegate",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_debugging_internal",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_demangle_internal",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_stacktrace",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_symbolize",
- "cronet_aml_third_party_abseil_cpp_absl_numeric_int128",
- "cronet_aml_third_party_abseil_cpp_absl_profiling_exponential_biased",
- "cronet_aml_third_party_abseil_cpp_absl_strings_internal",
- "cronet_aml_third_party_abseil_cpp_absl_strings_strings",
- "cronet_aml_third_party_abseil_cpp_absl_synchronization_graphcycles_internal",
- "cronet_aml_third_party_abseil_cpp_absl_synchronization_synchronization",
- "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_civil_time",
- "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_time_zone",
- "cronet_aml_third_party_abseil_cpp_absl_time_time",
- ],
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DABSL_ALLOCATOR_NOTHROW=1",
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DHAVE_SYS_UIO_H",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-Oz",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "third_party/abseil-cpp/",
- ],
- cpp_std: "c++17",
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- ],
- target: {
- android_arm: {
- cflags: [
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-fstack-protector",
- "-msse3",
- ],
- },
- },
-}
-
-// GN: //third_party/abseil-cpp/absl/container:hashtablez_sampler__testing
-cc_library_static {
- name: "cronet_aml_third_party_abseil_cpp_absl_container_hashtablez_sampler__testing",
- srcs: [
- "third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.cc",
- "third_party/abseil-cpp/absl/container/internal/hashtablez_sampler_force_weak_definition.cc",
- ],
- static_libs: [
- "cronet_aml_third_party_abseil_cpp_absl_base_base__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_log_severity__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_malloc_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_raw_logging_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_spinlock_wait__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_throw_delegate__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_debugging_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_demangle_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_stacktrace__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_symbolize__testing",
- "cronet_aml_third_party_abseil_cpp_absl_numeric_int128__testing",
- "cronet_aml_third_party_abseil_cpp_absl_profiling_exponential_biased__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_strings__testing",
- "cronet_aml_third_party_abseil_cpp_absl_synchronization_graphcycles_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_synchronization_synchronization__testing",
- "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_civil_time__testing",
- "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_time_zone__testing",
- "cronet_aml_third_party_abseil_cpp_absl_time_time__testing",
- ],
- host_supported: true,
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DABSL_ALLOCATOR_NOTHROW=1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "third_party/abseil-cpp/",
- ],
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- ],
- target: {
- android_arm: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- "-msse3",
- ],
- },
- host: {
- cflags: [
- "-DCR_SYSROOT_KEY=20220331T153654Z-0",
- "-DUSE_AURA=1",
- "-DUSE_OZONE=1",
- "-DUSE_UDEV",
- "-D_FILE_OFFSET_BITS=64",
- "-D_LARGEFILE64_SOURCE",
- "-D_LARGEFILE_SOURCE",
- "-O2",
- "-fstack-protector",
- "-msse3",
- ],
- compile_multilib: "64",
- },
- },
-}
-
-// GN: //third_party/abseil-cpp/absl/container:raw_hash_set
-cc_library_static {
- name: "cronet_aml_third_party_abseil_cpp_absl_container_raw_hash_set",
- srcs: [
- "third_party/abseil-cpp/absl/container/internal/raw_hash_set.cc",
- ],
- static_libs: [
- "cronet_aml_third_party_abseil_cpp_absl_base_base",
- "cronet_aml_third_party_abseil_cpp_absl_base_log_severity",
- "cronet_aml_third_party_abseil_cpp_absl_base_malloc_internal",
- "cronet_aml_third_party_abseil_cpp_absl_base_raw_logging_internal",
- "cronet_aml_third_party_abseil_cpp_absl_base_spinlock_wait",
- "cronet_aml_third_party_abseil_cpp_absl_base_throw_delegate",
- "cronet_aml_third_party_abseil_cpp_absl_container_hashtablez_sampler",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_debugging_internal",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_demangle_internal",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_stacktrace",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_symbolize",
- "cronet_aml_third_party_abseil_cpp_absl_numeric_int128",
- "cronet_aml_third_party_abseil_cpp_absl_profiling_exponential_biased",
- "cronet_aml_third_party_abseil_cpp_absl_strings_internal",
- "cronet_aml_third_party_abseil_cpp_absl_strings_strings",
- "cronet_aml_third_party_abseil_cpp_absl_synchronization_graphcycles_internal",
- "cronet_aml_third_party_abseil_cpp_absl_synchronization_synchronization",
- "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_civil_time",
- "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_time_zone",
- "cronet_aml_third_party_abseil_cpp_absl_time_time",
- "cronet_aml_third_party_abseil_cpp_absl_types_bad_optional_access",
- ],
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DABSL_ALLOCATOR_NOTHROW=1",
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DHAVE_SYS_UIO_H",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-Oz",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "third_party/abseil-cpp/",
- ],
- cpp_std: "c++17",
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- ],
- target: {
- android_arm: {
- cflags: [
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-fstack-protector",
- "-msse3",
- ],
- },
- },
-}
-
-// GN: //third_party/abseil-cpp/absl/container:raw_hash_set__testing
-cc_library_static {
- name: "cronet_aml_third_party_abseil_cpp_absl_container_raw_hash_set__testing",
- srcs: [
- "third_party/abseil-cpp/absl/container/internal/raw_hash_set.cc",
- ],
- static_libs: [
- "cronet_aml_third_party_abseil_cpp_absl_base_base__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_log_severity__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_malloc_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_raw_logging_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_spinlock_wait__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_throw_delegate__testing",
- "cronet_aml_third_party_abseil_cpp_absl_container_hashtablez_sampler__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_debugging_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_demangle_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_stacktrace__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_symbolize__testing",
- "cronet_aml_third_party_abseil_cpp_absl_numeric_int128__testing",
- "cronet_aml_third_party_abseil_cpp_absl_profiling_exponential_biased__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_strings__testing",
- "cronet_aml_third_party_abseil_cpp_absl_synchronization_graphcycles_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_synchronization_synchronization__testing",
- "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_civil_time__testing",
- "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_time_zone__testing",
- "cronet_aml_third_party_abseil_cpp_absl_time_time__testing",
- "cronet_aml_third_party_abseil_cpp_absl_types_bad_optional_access__testing",
- ],
- host_supported: true,
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DABSL_ALLOCATOR_NOTHROW=1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "third_party/abseil-cpp/",
- ],
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- ],
- target: {
- android_arm: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- "-msse3",
- ],
- },
- host: {
- cflags: [
- "-DCR_SYSROOT_KEY=20220331T153654Z-0",
- "-DUSE_AURA=1",
- "-DUSE_OZONE=1",
- "-DUSE_UDEV",
- "-D_FILE_OFFSET_BITS=64",
- "-D_LARGEFILE64_SOURCE",
- "-D_LARGEFILE_SOURCE",
- "-O2",
- "-fstack-protector",
- "-msse3",
- ],
- compile_multilib: "64",
- },
- },
-}
-
-// GN: //third_party/abseil-cpp/absl/debugging:debugging_internal
-cc_library_static {
- name: "cronet_aml_third_party_abseil_cpp_absl_debugging_debugging_internal",
- srcs: [
- "third_party/abseil-cpp/absl/debugging/internal/address_is_readable.cc",
- "third_party/abseil-cpp/absl/debugging/internal/elf_mem_image.cc",
- "third_party/abseil-cpp/absl/debugging/internal/vdso_support.cc",
- ],
- static_libs: [
- "cronet_aml_third_party_abseil_cpp_absl_base_log_severity",
- "cronet_aml_third_party_abseil_cpp_absl_base_raw_logging_internal",
- ],
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DABSL_ALLOCATOR_NOTHROW=1",
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DHAVE_SYS_UIO_H",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-Oz",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "third_party/abseil-cpp/",
- ],
- cpp_std: "c++17",
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- ],
- target: {
- android_arm: {
- cflags: [
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-fstack-protector",
- "-msse3",
- ],
- },
- },
-}
-
-// GN: //third_party/abseil-cpp/absl/debugging:debugging_internal__testing
-cc_library_static {
- name: "cronet_aml_third_party_abseil_cpp_absl_debugging_debugging_internal__testing",
- srcs: [
- "third_party/abseil-cpp/absl/debugging/internal/address_is_readable.cc",
- "third_party/abseil-cpp/absl/debugging/internal/elf_mem_image.cc",
- "third_party/abseil-cpp/absl/debugging/internal/vdso_support.cc",
- ],
- static_libs: [
- "cronet_aml_third_party_abseil_cpp_absl_base_log_severity__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_raw_logging_internal__testing",
- ],
- host_supported: true,
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DABSL_ALLOCATOR_NOTHROW=1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "third_party/abseil-cpp/",
- ],
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- ],
- target: {
- android_arm: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- "-msse3",
- ],
- },
- host: {
- cflags: [
- "-DCR_SYSROOT_KEY=20220331T153654Z-0",
- "-DUSE_AURA=1",
- "-DUSE_OZONE=1",
- "-DUSE_UDEV",
- "-D_FILE_OFFSET_BITS=64",
- "-D_LARGEFILE64_SOURCE",
- "-D_LARGEFILE_SOURCE",
- "-O2",
- "-fstack-protector",
- "-msse3",
- ],
- compile_multilib: "64",
- },
- },
-}
-
-// GN: //third_party/abseil-cpp/absl/debugging:demangle_internal
-cc_library_static {
- name: "cronet_aml_third_party_abseil_cpp_absl_debugging_demangle_internal",
- srcs: [
- "third_party/abseil-cpp/absl/debugging/internal/demangle.cc",
- ],
- static_libs: [
- "cronet_aml_third_party_abseil_cpp_absl_base_base",
- "cronet_aml_third_party_abseil_cpp_absl_base_log_severity",
- "cronet_aml_third_party_abseil_cpp_absl_base_raw_logging_internal",
- "cronet_aml_third_party_abseil_cpp_absl_base_spinlock_wait",
- ],
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DABSL_ALLOCATOR_NOTHROW=1",
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DHAVE_SYS_UIO_H",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-Oz",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "third_party/abseil-cpp/",
- ],
- cpp_std: "c++17",
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- ],
- target: {
- android_arm: {
- cflags: [
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-fstack-protector",
- "-msse3",
- ],
- },
- },
-}
-
-// GN: //third_party/abseil-cpp/absl/debugging:demangle_internal__testing
-cc_library_static {
- name: "cronet_aml_third_party_abseil_cpp_absl_debugging_demangle_internal__testing",
- srcs: [
- "third_party/abseil-cpp/absl/debugging/internal/demangle.cc",
- ],
- static_libs: [
- "cronet_aml_third_party_abseil_cpp_absl_base_base__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_log_severity__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_raw_logging_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_spinlock_wait__testing",
- ],
- host_supported: true,
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DABSL_ALLOCATOR_NOTHROW=1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "third_party/abseil-cpp/",
- ],
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- ],
- target: {
- android_arm: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- "-msse3",
- ],
- },
- host: {
- cflags: [
- "-DCR_SYSROOT_KEY=20220331T153654Z-0",
- "-DUSE_AURA=1",
- "-DUSE_OZONE=1",
- "-DUSE_UDEV",
- "-D_FILE_OFFSET_BITS=64",
- "-D_LARGEFILE64_SOURCE",
- "-D_LARGEFILE_SOURCE",
- "-O2",
- "-fstack-protector",
- "-msse3",
- ],
- compile_multilib: "64",
- },
- },
-}
-
-// GN: //third_party/abseil-cpp/absl/debugging:examine_stack
-cc_library_static {
- name: "cronet_aml_third_party_abseil_cpp_absl_debugging_examine_stack",
- srcs: [
- "third_party/abseil-cpp/absl/debugging/internal/examine_stack.cc",
- ],
- static_libs: [
- "cronet_aml_third_party_abseil_cpp_absl_base_base",
- "cronet_aml_third_party_abseil_cpp_absl_base_log_severity",
- "cronet_aml_third_party_abseil_cpp_absl_base_malloc_internal",
- "cronet_aml_third_party_abseil_cpp_absl_base_raw_logging_internal",
- "cronet_aml_third_party_abseil_cpp_absl_base_spinlock_wait",
- "cronet_aml_third_party_abseil_cpp_absl_base_throw_delegate",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_debugging_internal",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_demangle_internal",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_stacktrace",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_symbolize",
- "cronet_aml_third_party_abseil_cpp_absl_numeric_int128",
- "cronet_aml_third_party_abseil_cpp_absl_strings_internal",
- "cronet_aml_third_party_abseil_cpp_absl_strings_strings",
- ],
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DABSL_ALLOCATOR_NOTHROW=1",
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DHAVE_SYS_UIO_H",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-Oz",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "third_party/abseil-cpp/",
- ],
- cpp_std: "c++17",
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- ],
- target: {
- android_arm: {
- cflags: [
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-fstack-protector",
- "-msse3",
- ],
- },
- },
-}
-
-// GN: //third_party/abseil-cpp/absl/debugging:examine_stack__testing
-cc_library_static {
- name: "cronet_aml_third_party_abseil_cpp_absl_debugging_examine_stack__testing",
- srcs: [
- "third_party/abseil-cpp/absl/debugging/internal/examine_stack.cc",
- ],
- static_libs: [
- "cronet_aml_third_party_abseil_cpp_absl_base_base__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_log_severity__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_malloc_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_raw_logging_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_spinlock_wait__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_throw_delegate__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_debugging_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_demangle_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_stacktrace__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_symbolize__testing",
- "cronet_aml_third_party_abseil_cpp_absl_numeric_int128__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_strings__testing",
- ],
- host_supported: true,
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DABSL_ALLOCATOR_NOTHROW=1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "third_party/abseil-cpp/",
- ],
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- ],
- target: {
- android_arm: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- "-msse3",
- ],
- },
- host: {
- cflags: [
- "-DCR_SYSROOT_KEY=20220331T153654Z-0",
- "-DUSE_AURA=1",
- "-DUSE_OZONE=1",
- "-DUSE_UDEV",
- "-D_FILE_OFFSET_BITS=64",
- "-D_LARGEFILE64_SOURCE",
- "-D_LARGEFILE_SOURCE",
- "-O2",
- "-fstack-protector",
- "-msse3",
- ],
- compile_multilib: "64",
- },
- },
-}
-
-// GN: //third_party/abseil-cpp/absl/debugging:failure_signal_handler
-cc_library_static {
- name: "cronet_aml_third_party_abseil_cpp_absl_debugging_failure_signal_handler",
- srcs: [
- "third_party/abseil-cpp/absl/debugging/failure_signal_handler.cc",
- ],
- static_libs: [
- "cronet_aml_third_party_abseil_cpp_absl_base_base",
- "cronet_aml_third_party_abseil_cpp_absl_base_log_severity",
- "cronet_aml_third_party_abseil_cpp_absl_base_malloc_internal",
- "cronet_aml_third_party_abseil_cpp_absl_base_raw_logging_internal",
- "cronet_aml_third_party_abseil_cpp_absl_base_spinlock_wait",
- "cronet_aml_third_party_abseil_cpp_absl_base_throw_delegate",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_debugging_internal",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_demangle_internal",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_examine_stack",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_stacktrace",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_symbolize",
- "cronet_aml_third_party_abseil_cpp_absl_numeric_int128",
- "cronet_aml_third_party_abseil_cpp_absl_strings_internal",
- "cronet_aml_third_party_abseil_cpp_absl_strings_strings",
- ],
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DABSL_ALLOCATOR_NOTHROW=1",
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DHAVE_SYS_UIO_H",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-Oz",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "third_party/abseil-cpp/",
- ],
- cpp_std: "c++17",
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- ],
- target: {
- android_arm: {
- cflags: [
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-fstack-protector",
- "-msse3",
- ],
- },
- },
-}
-
-// GN: //third_party/abseil-cpp/absl/debugging:failure_signal_handler__testing
-cc_library_static {
- name: "cronet_aml_third_party_abseil_cpp_absl_debugging_failure_signal_handler__testing",
- srcs: [
- "third_party/abseil-cpp/absl/debugging/failure_signal_handler.cc",
- ],
- static_libs: [
- "cronet_aml_third_party_abseil_cpp_absl_base_base__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_log_severity__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_malloc_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_raw_logging_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_spinlock_wait__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_throw_delegate__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_debugging_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_demangle_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_examine_stack__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_stacktrace__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_symbolize__testing",
- "cronet_aml_third_party_abseil_cpp_absl_numeric_int128__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_strings__testing",
- ],
- host_supported: true,
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DABSL_ALLOCATOR_NOTHROW=1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "third_party/abseil-cpp/",
- ],
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- ],
- target: {
- android_arm: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- "-msse3",
- ],
- },
- host: {
- cflags: [
- "-DCR_SYSROOT_KEY=20220331T153654Z-0",
- "-DUSE_AURA=1",
- "-DUSE_OZONE=1",
- "-DUSE_UDEV",
- "-D_FILE_OFFSET_BITS=64",
- "-D_LARGEFILE64_SOURCE",
- "-D_LARGEFILE_SOURCE",
- "-O2",
- "-fstack-protector",
- "-msse3",
- ],
- compile_multilib: "64",
- },
- },
-}
-
-// GN: //third_party/abseil-cpp/absl/debugging:stacktrace
-cc_library_static {
- name: "cronet_aml_third_party_abseil_cpp_absl_debugging_stacktrace",
- srcs: [
- "third_party/abseil-cpp/absl/debugging/stacktrace.cc",
- ],
- static_libs: [
- "cronet_aml_third_party_abseil_cpp_absl_base_log_severity",
- "cronet_aml_third_party_abseil_cpp_absl_base_raw_logging_internal",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_debugging_internal",
- ],
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DABSL_ALLOCATOR_NOTHROW=1",
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DHAVE_SYS_UIO_H",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-Oz",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "third_party/abseil-cpp/",
- ],
- cpp_std: "c++17",
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- ],
- target: {
- android_arm: {
- cflags: [
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-fstack-protector",
- "-msse3",
- ],
- },
- },
-}
-
-// GN: //third_party/abseil-cpp/absl/debugging:stacktrace__testing
-cc_library_static {
- name: "cronet_aml_third_party_abseil_cpp_absl_debugging_stacktrace__testing",
- srcs: [
- "third_party/abseil-cpp/absl/debugging/stacktrace.cc",
- ],
- static_libs: [
- "cronet_aml_third_party_abseil_cpp_absl_base_log_severity__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_raw_logging_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_debugging_internal__testing",
- ],
- host_supported: true,
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DABSL_ALLOCATOR_NOTHROW=1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "third_party/abseil-cpp/",
- ],
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- ],
- target: {
- android_arm: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- "-msse3",
- ],
- },
- host: {
- cflags: [
- "-DCR_SYSROOT_KEY=20220331T153654Z-0",
- "-DUSE_AURA=1",
- "-DUSE_OZONE=1",
- "-DUSE_UDEV",
- "-D_FILE_OFFSET_BITS=64",
- "-D_LARGEFILE64_SOURCE",
- "-D_LARGEFILE_SOURCE",
- "-O2",
- "-fstack-protector",
- "-msse3",
- ],
- compile_multilib: "64",
- },
- },
-}
-
-// GN: //third_party/abseil-cpp/absl/debugging:symbolize
-cc_library_static {
- name: "cronet_aml_third_party_abseil_cpp_absl_debugging_symbolize",
- srcs: [
- "third_party/abseil-cpp/absl/debugging/symbolize.cc",
- ],
- static_libs: [
- "cronet_aml_third_party_abseil_cpp_absl_base_base",
- "cronet_aml_third_party_abseil_cpp_absl_base_log_severity",
- "cronet_aml_third_party_abseil_cpp_absl_base_malloc_internal",
- "cronet_aml_third_party_abseil_cpp_absl_base_raw_logging_internal",
- "cronet_aml_third_party_abseil_cpp_absl_base_spinlock_wait",
- "cronet_aml_third_party_abseil_cpp_absl_base_throw_delegate",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_debugging_internal",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_demangle_internal",
- "cronet_aml_third_party_abseil_cpp_absl_numeric_int128",
- "cronet_aml_third_party_abseil_cpp_absl_strings_internal",
- "cronet_aml_third_party_abseil_cpp_absl_strings_strings",
- ],
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DABSL_ALLOCATOR_NOTHROW=1",
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DHAVE_SYS_UIO_H",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-Oz",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "third_party/abseil-cpp/",
- ],
- cpp_std: "c++17",
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- ],
- target: {
- android_arm: {
- cflags: [
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-fstack-protector",
- "-msse3",
- ],
- },
- },
-}
-
-// GN: //third_party/abseil-cpp/absl/debugging:symbolize__testing
-cc_library_static {
- name: "cronet_aml_third_party_abseil_cpp_absl_debugging_symbolize__testing",
- srcs: [
- "third_party/abseil-cpp/absl/debugging/symbolize.cc",
- ],
- static_libs: [
- "cronet_aml_third_party_abseil_cpp_absl_base_base__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_log_severity__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_malloc_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_raw_logging_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_spinlock_wait__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_throw_delegate__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_debugging_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_demangle_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_numeric_int128__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_strings__testing",
- ],
- host_supported: true,
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DABSL_ALLOCATOR_NOTHROW=1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "third_party/abseil-cpp/",
- ],
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- ],
- target: {
- android_arm: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- "-msse3",
- ],
- },
- host: {
- cflags: [
- "-DCR_SYSROOT_KEY=20220331T153654Z-0",
- "-DUSE_AURA=1",
- "-DUSE_OZONE=1",
- "-DUSE_UDEV",
- "-D_FILE_OFFSET_BITS=64",
- "-D_LARGEFILE64_SOURCE",
- "-D_LARGEFILE_SOURCE",
- "-O2",
- "-fstack-protector",
- "-msse3",
- ],
- compile_multilib: "64",
- },
- },
-}
-
-// GN: //third_party/abseil-cpp/absl/hash:city
-cc_library_static {
- name: "cronet_aml_third_party_abseil_cpp_absl_hash_city",
- srcs: [
- "third_party/abseil-cpp/absl/hash/internal/city.cc",
- ],
- static_libs: [
- "cronet_aml_third_party_abseil_cpp_absl_base_base",
- "cronet_aml_third_party_abseil_cpp_absl_base_log_severity",
- "cronet_aml_third_party_abseil_cpp_absl_base_raw_logging_internal",
- "cronet_aml_third_party_abseil_cpp_absl_base_spinlock_wait",
- ],
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DABSL_ALLOCATOR_NOTHROW=1",
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DHAVE_SYS_UIO_H",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-Oz",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "third_party/abseil-cpp/",
- ],
- cpp_std: "c++17",
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- ],
- target: {
- android_arm: {
- cflags: [
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-fstack-protector",
- "-msse3",
- ],
- },
- },
-}
-
-// GN: //third_party/abseil-cpp/absl/hash:city__testing
-cc_library_static {
- name: "cronet_aml_third_party_abseil_cpp_absl_hash_city__testing",
- srcs: [
- "third_party/abseil-cpp/absl/hash/internal/city.cc",
- ],
- static_libs: [
- "cronet_aml_third_party_abseil_cpp_absl_base_base__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_log_severity__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_raw_logging_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_spinlock_wait__testing",
- ],
- host_supported: true,
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DABSL_ALLOCATOR_NOTHROW=1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "third_party/abseil-cpp/",
- ],
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- ],
- target: {
- android_arm: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- "-msse3",
- ],
- },
- host: {
- cflags: [
- "-DCR_SYSROOT_KEY=20220331T153654Z-0",
- "-DUSE_AURA=1",
- "-DUSE_OZONE=1",
- "-DUSE_UDEV",
- "-D_FILE_OFFSET_BITS=64",
- "-D_LARGEFILE64_SOURCE",
- "-D_LARGEFILE_SOURCE",
- "-O2",
- "-fstack-protector",
- "-msse3",
- ],
- compile_multilib: "64",
- },
- },
-}
-
-// GN: //third_party/abseil-cpp/absl/hash:hash
-cc_library_static {
- name: "cronet_aml_third_party_abseil_cpp_absl_hash_hash",
- srcs: [
- "third_party/abseil-cpp/absl/hash/internal/hash.cc",
- ],
- static_libs: [
- "cronet_aml_third_party_abseil_cpp_absl_base_base",
- "cronet_aml_third_party_abseil_cpp_absl_base_log_severity",
- "cronet_aml_third_party_abseil_cpp_absl_base_raw_logging_internal",
- "cronet_aml_third_party_abseil_cpp_absl_base_spinlock_wait",
- "cronet_aml_third_party_abseil_cpp_absl_base_throw_delegate",
- "cronet_aml_third_party_abseil_cpp_absl_hash_city",
- "cronet_aml_third_party_abseil_cpp_absl_hash_low_level_hash",
- "cronet_aml_third_party_abseil_cpp_absl_numeric_int128",
- "cronet_aml_third_party_abseil_cpp_absl_strings_internal",
- "cronet_aml_third_party_abseil_cpp_absl_strings_strings",
- "cronet_aml_third_party_abseil_cpp_absl_types_bad_optional_access",
- "cronet_aml_third_party_abseil_cpp_absl_types_bad_variant_access",
- ],
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DABSL_ALLOCATOR_NOTHROW=1",
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DHAVE_SYS_UIO_H",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-Oz",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "third_party/abseil-cpp/",
- ],
- cpp_std: "c++17",
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- ],
- target: {
- android_arm: {
- cflags: [
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-fstack-protector",
- "-msse3",
- ],
- },
- },
-}
-
-// GN: //third_party/abseil-cpp/absl/hash:hash__testing
-cc_library_static {
- name: "cronet_aml_third_party_abseil_cpp_absl_hash_hash__testing",
- srcs: [
- "third_party/abseil-cpp/absl/hash/internal/hash.cc",
- ],
- static_libs: [
- "cronet_aml_third_party_abseil_cpp_absl_base_base__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_log_severity__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_raw_logging_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_spinlock_wait__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_throw_delegate__testing",
- "cronet_aml_third_party_abseil_cpp_absl_hash_city__testing",
- "cronet_aml_third_party_abseil_cpp_absl_hash_low_level_hash__testing",
- "cronet_aml_third_party_abseil_cpp_absl_numeric_int128__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_strings__testing",
- "cronet_aml_third_party_abseil_cpp_absl_types_bad_optional_access__testing",
- "cronet_aml_third_party_abseil_cpp_absl_types_bad_variant_access__testing",
- ],
- host_supported: true,
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DABSL_ALLOCATOR_NOTHROW=1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "third_party/abseil-cpp/",
- ],
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- ],
- target: {
- android_arm: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- "-msse3",
- ],
- },
- host: {
- cflags: [
- "-DCR_SYSROOT_KEY=20220331T153654Z-0",
- "-DUSE_AURA=1",
- "-DUSE_OZONE=1",
- "-DUSE_UDEV",
- "-D_FILE_OFFSET_BITS=64",
- "-D_LARGEFILE64_SOURCE",
- "-D_LARGEFILE_SOURCE",
- "-O2",
- "-fstack-protector",
- "-msse3",
- ],
- compile_multilib: "64",
- },
- },
-}
-
-// GN: //third_party/abseil-cpp/absl/hash:low_level_hash
-cc_library_static {
- name: "cronet_aml_third_party_abseil_cpp_absl_hash_low_level_hash",
- srcs: [
- "third_party/abseil-cpp/absl/hash/internal/low_level_hash.cc",
- ],
- static_libs: [
- "cronet_aml_third_party_abseil_cpp_absl_base_base",
- "cronet_aml_third_party_abseil_cpp_absl_base_log_severity",
- "cronet_aml_third_party_abseil_cpp_absl_base_raw_logging_internal",
- "cronet_aml_third_party_abseil_cpp_absl_base_spinlock_wait",
- "cronet_aml_third_party_abseil_cpp_absl_numeric_int128",
- ],
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DABSL_ALLOCATOR_NOTHROW=1",
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DHAVE_SYS_UIO_H",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-Oz",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "third_party/abseil-cpp/",
- ],
- cpp_std: "c++17",
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- ],
- target: {
- android_arm: {
- cflags: [
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-fstack-protector",
- "-msse3",
- ],
- },
- },
-}
-
-// GN: //third_party/abseil-cpp/absl/hash:low_level_hash__testing
-cc_library_static {
- name: "cronet_aml_third_party_abseil_cpp_absl_hash_low_level_hash__testing",
- srcs: [
- "third_party/abseil-cpp/absl/hash/internal/low_level_hash.cc",
- ],
- static_libs: [
- "cronet_aml_third_party_abseil_cpp_absl_base_base__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_log_severity__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_raw_logging_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_spinlock_wait__testing",
- "cronet_aml_third_party_abseil_cpp_absl_numeric_int128__testing",
- ],
- host_supported: true,
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DABSL_ALLOCATOR_NOTHROW=1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "third_party/abseil-cpp/",
- ],
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- ],
- target: {
- android_arm: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- "-msse3",
- ],
- },
- host: {
- cflags: [
- "-DCR_SYSROOT_KEY=20220331T153654Z-0",
- "-DUSE_AURA=1",
- "-DUSE_OZONE=1",
- "-DUSE_UDEV",
- "-D_FILE_OFFSET_BITS=64",
- "-D_LARGEFILE64_SOURCE",
- "-D_LARGEFILE_SOURCE",
- "-O2",
- "-fstack-protector",
- "-msse3",
- ],
- compile_multilib: "64",
- },
- },
-}
-
-// GN: //third_party/abseil-cpp/absl/numeric:int128
-cc_library_static {
- name: "cronet_aml_third_party_abseil_cpp_absl_numeric_int128",
- srcs: [
- "third_party/abseil-cpp/absl/numeric/int128.cc",
- ],
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DABSL_ALLOCATOR_NOTHROW=1",
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DHAVE_SYS_UIO_H",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-Oz",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "third_party/abseil-cpp/",
- ],
- cpp_std: "c++17",
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- ],
- target: {
- android_arm: {
- cflags: [
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-fstack-protector",
- "-msse3",
- ],
- },
- },
-}
-
-// GN: //third_party/abseil-cpp/absl/numeric:int128__testing
-cc_library_static {
- name: "cronet_aml_third_party_abseil_cpp_absl_numeric_int128__testing",
- srcs: [
- "third_party/abseil-cpp/absl/numeric/int128.cc",
- ],
- host_supported: true,
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DABSL_ALLOCATOR_NOTHROW=1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "third_party/abseil-cpp/",
- ],
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- ],
- target: {
- android_arm: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- "-msse3",
- ],
- },
- host: {
- cflags: [
- "-DCR_SYSROOT_KEY=20220331T153654Z-0",
- "-DUSE_AURA=1",
- "-DUSE_OZONE=1",
- "-DUSE_UDEV",
- "-D_FILE_OFFSET_BITS=64",
- "-D_LARGEFILE64_SOURCE",
- "-D_LARGEFILE_SOURCE",
- "-O2",
- "-fstack-protector",
- "-msse3",
- ],
- compile_multilib: "64",
- },
- },
-}
-
-// GN: //third_party/abseil-cpp/absl/profiling:exponential_biased
-cc_library_static {
- name: "cronet_aml_third_party_abseil_cpp_absl_profiling_exponential_biased",
- srcs: [
- "third_party/abseil-cpp/absl/profiling/internal/exponential_biased.cc",
- ],
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DABSL_ALLOCATOR_NOTHROW=1",
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DHAVE_SYS_UIO_H",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-Oz",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "third_party/abseil-cpp/",
- ],
- cpp_std: "c++17",
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- ],
- target: {
- android_arm: {
- cflags: [
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-fstack-protector",
- "-msse3",
- ],
- },
- },
-}
-
-// GN: //third_party/abseil-cpp/absl/profiling:exponential_biased__testing
-cc_library_static {
- name: "cronet_aml_third_party_abseil_cpp_absl_profiling_exponential_biased__testing",
- srcs: [
- "third_party/abseil-cpp/absl/profiling/internal/exponential_biased.cc",
- ],
- host_supported: true,
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DABSL_ALLOCATOR_NOTHROW=1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "third_party/abseil-cpp/",
- ],
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- ],
- target: {
- android_arm: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- "-msse3",
- ],
- },
- host: {
- cflags: [
- "-DCR_SYSROOT_KEY=20220331T153654Z-0",
- "-DUSE_AURA=1",
- "-DUSE_OZONE=1",
- "-DUSE_UDEV",
- "-D_FILE_OFFSET_BITS=64",
- "-D_LARGEFILE64_SOURCE",
- "-D_LARGEFILE_SOURCE",
- "-O2",
- "-fstack-protector",
- "-msse3",
- ],
- compile_multilib: "64",
- },
- },
-}
-
-// GN: //third_party/abseil-cpp/absl/random:distributions
-cc_library_static {
- name: "cronet_aml_third_party_abseil_cpp_absl_random_distributions",
- srcs: [
- "third_party/abseil-cpp/absl/random/discrete_distribution.cc",
- "third_party/abseil-cpp/absl/random/gaussian_distribution.cc",
- ],
- static_libs: [
- "cronet_aml_third_party_abseil_cpp_absl_base_base",
- "cronet_aml_third_party_abseil_cpp_absl_base_log_severity",
- "cronet_aml_third_party_abseil_cpp_absl_base_raw_logging_internal",
- "cronet_aml_third_party_abseil_cpp_absl_base_spinlock_wait",
- "cronet_aml_third_party_abseil_cpp_absl_base_throw_delegate",
- "cronet_aml_third_party_abseil_cpp_absl_numeric_int128",
- "cronet_aml_third_party_abseil_cpp_absl_strings_internal",
- "cronet_aml_third_party_abseil_cpp_absl_strings_strings",
- ],
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DABSL_ALLOCATOR_NOTHROW=1",
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DHAVE_SYS_UIO_H",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-Oz",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "third_party/abseil-cpp/",
- ],
- cpp_std: "c++17",
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- ],
- target: {
- android_arm: {
- cflags: [
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-fstack-protector",
- "-msse3",
- ],
- },
- },
-}
-
-// GN: //third_party/abseil-cpp/absl/random:distributions__testing
-cc_library_static {
- name: "cronet_aml_third_party_abseil_cpp_absl_random_distributions__testing",
- srcs: [
- "third_party/abseil-cpp/absl/random/discrete_distribution.cc",
- "third_party/abseil-cpp/absl/random/gaussian_distribution.cc",
- ],
- static_libs: [
- "cronet_aml_third_party_abseil_cpp_absl_base_base__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_log_severity__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_raw_logging_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_spinlock_wait__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_throw_delegate__testing",
- "cronet_aml_third_party_abseil_cpp_absl_numeric_int128__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_strings__testing",
- ],
- host_supported: true,
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DABSL_ALLOCATOR_NOTHROW=1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "third_party/abseil-cpp/",
- ],
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- ],
- target: {
- android_arm: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- "-msse3",
- ],
- },
- host: {
- cflags: [
- "-DCR_SYSROOT_KEY=20220331T153654Z-0",
- "-DUSE_AURA=1",
- "-DUSE_OZONE=1",
- "-DUSE_UDEV",
- "-D_FILE_OFFSET_BITS=64",
- "-D_LARGEFILE64_SOURCE",
- "-D_LARGEFILE_SOURCE",
- "-O2",
- "-fstack-protector",
- "-msse3",
- ],
- compile_multilib: "64",
- },
- },
-}
-
-// GN: //third_party/abseil-cpp/absl/random/internal:platform
-cc_library_static {
- name: "cronet_aml_third_party_abseil_cpp_absl_random_internal_platform",
- srcs: [
- "third_party/abseil-cpp/absl/random/internal/randen_round_keys.cc",
- ],
- generated_headers: [
- "cronet_aml_build_chromeos_buildflags",
- ],
- export_generated_headers: [
- "cronet_aml_build_chromeos_buildflags",
- ],
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DABSL_ALLOCATOR_NOTHROW=1",
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DHAVE_SYS_UIO_H",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-Oz",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "third_party/abseil-cpp/",
- ],
- cpp_std: "c++17",
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- ],
- target: {
- android_arm: {
- cflags: [
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-fstack-protector",
- "-msse3",
- ],
- },
- },
-}
-
-// GN: //third_party/abseil-cpp/absl/random/internal:platform__testing
-cc_library_static {
- name: "cronet_aml_third_party_abseil_cpp_absl_random_internal_platform__testing",
- srcs: [
- "third_party/abseil-cpp/absl/random/internal/randen_round_keys.cc",
- ],
- host_supported: true,
- generated_headers: [
- "cronet_aml_build_chromeos_buildflags__testing",
- ],
- export_generated_headers: [
- "cronet_aml_build_chromeos_buildflags__testing",
- ],
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DABSL_ALLOCATOR_NOTHROW=1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "third_party/abseil-cpp/",
- ],
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- ],
- target: {
- android_arm: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- "-msse3",
- ],
- },
- host: {
- cflags: [
- "-DCR_SYSROOT_KEY=20220331T153654Z-0",
- "-DUSE_AURA=1",
- "-DUSE_OZONE=1",
- "-DUSE_UDEV",
- "-D_FILE_OFFSET_BITS=64",
- "-D_LARGEFILE64_SOURCE",
- "-D_LARGEFILE_SOURCE",
- "-O2",
- "-fstack-protector",
- "-msse3",
- ],
- compile_multilib: "64",
- },
- },
-}
-
-// GN: //third_party/abseil-cpp/absl/random/internal:pool_urbg
-cc_library_static {
- name: "cronet_aml_third_party_abseil_cpp_absl_random_internal_pool_urbg",
- srcs: [
- "third_party/abseil-cpp/absl/random/internal/pool_urbg.cc",
- ],
- static_libs: [
- "cronet_aml_third_party_abseil_cpp_absl_base_base",
- "cronet_aml_third_party_abseil_cpp_absl_base_log_severity",
- "cronet_aml_third_party_abseil_cpp_absl_base_raw_logging_internal",
- "cronet_aml_third_party_abseil_cpp_absl_base_spinlock_wait",
- "cronet_aml_third_party_abseil_cpp_absl_base_throw_delegate",
- "cronet_aml_third_party_abseil_cpp_absl_numeric_int128",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_platform",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_hwaes",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_hwaes_impl",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_slow",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_seed_material",
- "cronet_aml_third_party_abseil_cpp_absl_random_seed_gen_exception",
- "cronet_aml_third_party_abseil_cpp_absl_strings_internal",
- "cronet_aml_third_party_abseil_cpp_absl_strings_strings",
- "cronet_aml_third_party_abseil_cpp_absl_types_bad_optional_access",
- ],
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DABSL_ALLOCATOR_NOTHROW=1",
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DHAVE_SYS_UIO_H",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-Oz",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "third_party/abseil-cpp/",
- ],
- cpp_std: "c++17",
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- ],
- target: {
- android_arm: {
- cflags: [
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-fstack-protector",
- "-msse3",
- ],
- },
- },
-}
-
-// GN: //third_party/abseil-cpp/absl/random/internal:pool_urbg__testing
-cc_library_static {
- name: "cronet_aml_third_party_abseil_cpp_absl_random_internal_pool_urbg__testing",
- srcs: [
- "third_party/abseil-cpp/absl/random/internal/pool_urbg.cc",
- ],
- static_libs: [
- "cronet_aml_third_party_abseil_cpp_absl_base_base__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_log_severity__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_raw_logging_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_spinlock_wait__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_throw_delegate__testing",
- "cronet_aml_third_party_abseil_cpp_absl_numeric_int128__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_platform__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_hwaes__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_hwaes_impl__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_slow__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_seed_material__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_seed_gen_exception__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_strings__testing",
- "cronet_aml_third_party_abseil_cpp_absl_types_bad_optional_access__testing",
- ],
- host_supported: true,
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DABSL_ALLOCATOR_NOTHROW=1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "third_party/abseil-cpp/",
- ],
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- ],
- target: {
- android_arm: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- "-msse3",
- ],
- },
- host: {
- cflags: [
- "-DCR_SYSROOT_KEY=20220331T153654Z-0",
- "-DUSE_AURA=1",
- "-DUSE_OZONE=1",
- "-DUSE_UDEV",
- "-D_FILE_OFFSET_BITS=64",
- "-D_LARGEFILE64_SOURCE",
- "-D_LARGEFILE_SOURCE",
- "-O2",
- "-fstack-protector",
- "-msse3",
- ],
- compile_multilib: "64",
- },
- },
-}
-
-// GN: //third_party/abseil-cpp/absl/random/internal:randen
-cc_library_static {
- name: "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen",
- srcs: [
- "third_party/abseil-cpp/absl/random/internal/randen.cc",
- ],
- static_libs: [
- "cronet_aml_third_party_abseil_cpp_absl_base_base",
- "cronet_aml_third_party_abseil_cpp_absl_base_log_severity",
- "cronet_aml_third_party_abseil_cpp_absl_base_raw_logging_internal",
- "cronet_aml_third_party_abseil_cpp_absl_base_spinlock_wait",
- "cronet_aml_third_party_abseil_cpp_absl_numeric_int128",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_platform",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_hwaes",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_hwaes_impl",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_slow",
- ],
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DABSL_ALLOCATOR_NOTHROW=1",
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DHAVE_SYS_UIO_H",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-Oz",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "third_party/abseil-cpp/",
- ],
- cpp_std: "c++17",
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- ],
- target: {
- android_arm: {
- cflags: [
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-fstack-protector",
- "-msse3",
- ],
- },
- },
-}
-
-// GN: //third_party/abseil-cpp/absl/random/internal:randen__testing
-cc_library_static {
- name: "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen__testing",
- srcs: [
- "third_party/abseil-cpp/absl/random/internal/randen.cc",
- ],
- static_libs: [
- "cronet_aml_third_party_abseil_cpp_absl_base_base__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_log_severity__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_raw_logging_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_spinlock_wait__testing",
- "cronet_aml_third_party_abseil_cpp_absl_numeric_int128__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_platform__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_hwaes__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_hwaes_impl__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_slow__testing",
- ],
- host_supported: true,
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DABSL_ALLOCATOR_NOTHROW=1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "third_party/abseil-cpp/",
- ],
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- ],
- target: {
- android_arm: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- "-msse3",
- ],
- },
- host: {
- cflags: [
- "-DCR_SYSROOT_KEY=20220331T153654Z-0",
- "-DUSE_AURA=1",
- "-DUSE_OZONE=1",
- "-DUSE_UDEV",
- "-D_FILE_OFFSET_BITS=64",
- "-D_LARGEFILE64_SOURCE",
- "-D_LARGEFILE_SOURCE",
- "-O2",
- "-fstack-protector",
- "-msse3",
- ],
- compile_multilib: "64",
- },
- },
-}
-
-// GN: //third_party/abseil-cpp/absl/random/internal:randen_hwaes
-cc_library_static {
- name: "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_hwaes",
- srcs: [
- "third_party/abseil-cpp/absl/random/internal/randen_detect.cc",
- ],
- static_libs: [
- "cronet_aml_third_party_abseil_cpp_absl_numeric_int128",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_platform",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_hwaes_impl",
- ],
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DABSL_ALLOCATOR_NOTHROW=1",
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DHAVE_SYS_UIO_H",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-Oz",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "third_party/abseil-cpp/",
- ],
- cpp_std: "c++17",
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- ],
- target: {
- android_arm: {
- cflags: [
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-fstack-protector",
- "-msse3",
- ],
- },
- },
-}
-
-// GN: //third_party/abseil-cpp/absl/random/internal:randen_hwaes__testing
-cc_library_static {
- name: "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_hwaes__testing",
- srcs: [
- "third_party/abseil-cpp/absl/random/internal/randen_detect.cc",
- ],
- static_libs: [
- "cronet_aml_third_party_abseil_cpp_absl_numeric_int128__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_platform__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_hwaes_impl__testing",
- ],
- host_supported: true,
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DABSL_ALLOCATOR_NOTHROW=1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "third_party/abseil-cpp/",
- ],
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- ],
- target: {
- android_arm: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- "-msse3",
- ],
- },
- host: {
- cflags: [
- "-DCR_SYSROOT_KEY=20220331T153654Z-0",
- "-DUSE_AURA=1",
- "-DUSE_OZONE=1",
- "-DUSE_UDEV",
- "-D_FILE_OFFSET_BITS=64",
- "-D_LARGEFILE64_SOURCE",
- "-D_LARGEFILE_SOURCE",
- "-O2",
- "-fstack-protector",
- "-msse3",
- ],
- compile_multilib: "64",
- },
- },
-}
-
-// GN: //third_party/abseil-cpp/absl/random/internal:randen_hwaes_impl
-cc_library_static {
- name: "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_hwaes_impl",
- srcs: [
- "third_party/abseil-cpp/absl/random/internal/randen_hwaes.cc",
- ],
- static_libs: [
- "cronet_aml_third_party_abseil_cpp_absl_numeric_int128",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_platform",
- ],
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DABSL_ALLOCATOR_NOTHROW=1",
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DHAVE_SYS_UIO_H",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-Oz",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "third_party/abseil-cpp/",
- ],
- cpp_std: "c++17",
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- ],
- target: {
- android_arm: {
- cflags: [
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-fstack-protector",
- "-msse3",
- ],
- },
- },
-}
-
-// GN: //third_party/abseil-cpp/absl/random/internal:randen_hwaes_impl__testing
-cc_library_static {
- name: "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_hwaes_impl__testing",
- srcs: [
- "third_party/abseil-cpp/absl/random/internal/randen_hwaes.cc",
- ],
- static_libs: [
- "cronet_aml_third_party_abseil_cpp_absl_numeric_int128__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_platform__testing",
- ],
- host_supported: true,
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DABSL_ALLOCATOR_NOTHROW=1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "third_party/abseil-cpp/",
- ],
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- ],
- target: {
- android_arm: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- "-msse3",
- ],
- },
- host: {
- cflags: [
- "-DCR_SYSROOT_KEY=20220331T153654Z-0",
- "-DUSE_AURA=1",
- "-DUSE_OZONE=1",
- "-DUSE_UDEV",
- "-D_FILE_OFFSET_BITS=64",
- "-D_LARGEFILE64_SOURCE",
- "-D_LARGEFILE_SOURCE",
- "-O2",
- "-fstack-protector",
- "-msse3",
- ],
- compile_multilib: "64",
- },
- },
-}
-
-// GN: //third_party/abseil-cpp/absl/random/internal:randen_slow
-cc_library_static {
- name: "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_slow",
- srcs: [
- "third_party/abseil-cpp/absl/random/internal/randen_slow.cc",
- ],
- static_libs: [
- "cronet_aml_third_party_abseil_cpp_absl_base_base",
- "cronet_aml_third_party_abseil_cpp_absl_base_log_severity",
- "cronet_aml_third_party_abseil_cpp_absl_base_raw_logging_internal",
- "cronet_aml_third_party_abseil_cpp_absl_base_spinlock_wait",
- "cronet_aml_third_party_abseil_cpp_absl_numeric_int128",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_platform",
- ],
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DABSL_ALLOCATOR_NOTHROW=1",
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DHAVE_SYS_UIO_H",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-Oz",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "third_party/abseil-cpp/",
- ],
- cpp_std: "c++17",
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- ],
- target: {
- android_arm: {
- cflags: [
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-fstack-protector",
- "-msse3",
- ],
- },
- },
-}
-
-// GN: //third_party/abseil-cpp/absl/random/internal:randen_slow__testing
-cc_library_static {
- name: "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_slow__testing",
- srcs: [
- "third_party/abseil-cpp/absl/random/internal/randen_slow.cc",
- ],
- static_libs: [
- "cronet_aml_third_party_abseil_cpp_absl_base_base__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_log_severity__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_raw_logging_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_spinlock_wait__testing",
- "cronet_aml_third_party_abseil_cpp_absl_numeric_int128__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_platform__testing",
- ],
- host_supported: true,
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DABSL_ALLOCATOR_NOTHROW=1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "third_party/abseil-cpp/",
- ],
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- ],
- target: {
- android_arm: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- "-msse3",
- ],
- },
- host: {
- cflags: [
- "-DCR_SYSROOT_KEY=20220331T153654Z-0",
- "-DUSE_AURA=1",
- "-DUSE_OZONE=1",
- "-DUSE_UDEV",
- "-D_FILE_OFFSET_BITS=64",
- "-D_LARGEFILE64_SOURCE",
- "-D_LARGEFILE_SOURCE",
- "-O2",
- "-fstack-protector",
- "-msse3",
- ],
- compile_multilib: "64",
- },
- },
-}
-
-// GN: //third_party/abseil-cpp/absl/random/internal:seed_material
-cc_library_static {
- name: "cronet_aml_third_party_abseil_cpp_absl_random_internal_seed_material",
- srcs: [
- "third_party/abseil-cpp/absl/random/internal/seed_material.cc",
- ],
- static_libs: [
- "cronet_aml_third_party_abseil_cpp_absl_base_base",
- "cronet_aml_third_party_abseil_cpp_absl_base_log_severity",
- "cronet_aml_third_party_abseil_cpp_absl_base_raw_logging_internal",
- "cronet_aml_third_party_abseil_cpp_absl_base_spinlock_wait",
- "cronet_aml_third_party_abseil_cpp_absl_base_throw_delegate",
- "cronet_aml_third_party_abseil_cpp_absl_numeric_int128",
- "cronet_aml_third_party_abseil_cpp_absl_strings_internal",
- "cronet_aml_third_party_abseil_cpp_absl_strings_strings",
- "cronet_aml_third_party_abseil_cpp_absl_types_bad_optional_access",
- ],
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DABSL_ALLOCATOR_NOTHROW=1",
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DHAVE_SYS_UIO_H",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-Oz",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "third_party/abseil-cpp/",
- ],
- cpp_std: "c++17",
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- ],
- target: {
- android_arm: {
- cflags: [
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-fstack-protector",
- "-msse3",
- ],
- },
- },
-}
-
-// GN: //third_party/abseil-cpp/absl/random/internal:seed_material__testing
-cc_library_static {
- name: "cronet_aml_third_party_abseil_cpp_absl_random_internal_seed_material__testing",
- srcs: [
- "third_party/abseil-cpp/absl/random/internal/seed_material.cc",
- ],
- static_libs: [
- "cronet_aml_third_party_abseil_cpp_absl_base_base__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_log_severity__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_raw_logging_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_spinlock_wait__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_throw_delegate__testing",
- "cronet_aml_third_party_abseil_cpp_absl_numeric_int128__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_strings__testing",
- "cronet_aml_third_party_abseil_cpp_absl_types_bad_optional_access__testing",
- ],
- host_supported: true,
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DABSL_ALLOCATOR_NOTHROW=1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "third_party/abseil-cpp/",
- ],
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- ],
- target: {
- android_arm: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- "-msse3",
- ],
- },
- host: {
- cflags: [
- "-DCR_SYSROOT_KEY=20220331T153654Z-0",
- "-DUSE_AURA=1",
- "-DUSE_OZONE=1",
- "-DUSE_UDEV",
- "-D_FILE_OFFSET_BITS=64",
- "-D_LARGEFILE64_SOURCE",
- "-D_LARGEFILE_SOURCE",
- "-O2",
- "-fstack-protector",
- "-msse3",
- ],
- compile_multilib: "64",
- },
- },
-}
-
-// GN: //third_party/abseil-cpp/absl/random:seed_gen_exception
-cc_library_static {
- name: "cronet_aml_third_party_abseil_cpp_absl_random_seed_gen_exception",
- srcs: [
- "third_party/abseil-cpp/absl/random/seed_gen_exception.cc",
- ],
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DABSL_ALLOCATOR_NOTHROW=1",
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DHAVE_SYS_UIO_H",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-Oz",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "third_party/abseil-cpp/",
- ],
- cpp_std: "c++17",
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- ],
- target: {
- android_arm: {
- cflags: [
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-fstack-protector",
- "-msse3",
- ],
- },
- },
-}
-
-// GN: //third_party/abseil-cpp/absl/random:seed_gen_exception__testing
-cc_library_static {
- name: "cronet_aml_third_party_abseil_cpp_absl_random_seed_gen_exception__testing",
- srcs: [
- "third_party/abseil-cpp/absl/random/seed_gen_exception.cc",
- ],
- host_supported: true,
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DABSL_ALLOCATOR_NOTHROW=1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "third_party/abseil-cpp/",
- ],
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- ],
- target: {
- android_arm: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- "-msse3",
- ],
- },
- host: {
- cflags: [
- "-DCR_SYSROOT_KEY=20220331T153654Z-0",
- "-DUSE_AURA=1",
- "-DUSE_OZONE=1",
- "-DUSE_UDEV",
- "-D_FILE_OFFSET_BITS=64",
- "-D_LARGEFILE64_SOURCE",
- "-D_LARGEFILE_SOURCE",
- "-O2",
- "-fstack-protector",
- "-msse3",
- ],
- compile_multilib: "64",
- },
- },
-}
-
-// GN: //third_party/abseil-cpp/absl/random:seed_sequences
-cc_library_static {
- name: "cronet_aml_third_party_abseil_cpp_absl_random_seed_sequences",
- srcs: [
- "third_party/abseil-cpp/absl/random/seed_sequences.cc",
- ],
- static_libs: [
- "cronet_aml_third_party_abseil_cpp_absl_base_base",
- "cronet_aml_third_party_abseil_cpp_absl_base_log_severity",
- "cronet_aml_third_party_abseil_cpp_absl_base_raw_logging_internal",
- "cronet_aml_third_party_abseil_cpp_absl_base_spinlock_wait",
- "cronet_aml_third_party_abseil_cpp_absl_base_throw_delegate",
- "cronet_aml_third_party_abseil_cpp_absl_numeric_int128",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_platform",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_pool_urbg",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_hwaes",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_hwaes_impl",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_slow",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_seed_material",
- "cronet_aml_third_party_abseil_cpp_absl_random_seed_gen_exception",
- "cronet_aml_third_party_abseil_cpp_absl_strings_internal",
- "cronet_aml_third_party_abseil_cpp_absl_strings_strings",
- "cronet_aml_third_party_abseil_cpp_absl_types_bad_optional_access",
- ],
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DABSL_ALLOCATOR_NOTHROW=1",
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DHAVE_SYS_UIO_H",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-Oz",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "third_party/abseil-cpp/",
- ],
- cpp_std: "c++17",
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- ],
- target: {
- android_arm: {
- cflags: [
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-fstack-protector",
- "-msse3",
- ],
- },
- },
-}
-
-// GN: //third_party/abseil-cpp/absl/random:seed_sequences__testing
-cc_library_static {
- name: "cronet_aml_third_party_abseil_cpp_absl_random_seed_sequences__testing",
- srcs: [
- "third_party/abseil-cpp/absl/random/seed_sequences.cc",
- ],
- static_libs: [
- "cronet_aml_third_party_abseil_cpp_absl_base_base__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_log_severity__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_raw_logging_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_spinlock_wait__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_throw_delegate__testing",
- "cronet_aml_third_party_abseil_cpp_absl_numeric_int128__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_platform__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_pool_urbg__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_hwaes__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_hwaes_impl__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_slow__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_seed_material__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_seed_gen_exception__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_strings__testing",
- "cronet_aml_third_party_abseil_cpp_absl_types_bad_optional_access__testing",
- ],
- host_supported: true,
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DABSL_ALLOCATOR_NOTHROW=1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "third_party/abseil-cpp/",
- ],
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- ],
- target: {
- android_arm: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- "-msse3",
- ],
- },
- host: {
- cflags: [
- "-DCR_SYSROOT_KEY=20220331T153654Z-0",
- "-DUSE_AURA=1",
- "-DUSE_OZONE=1",
- "-DUSE_UDEV",
- "-D_FILE_OFFSET_BITS=64",
- "-D_LARGEFILE64_SOURCE",
- "-D_LARGEFILE_SOURCE",
- "-O2",
- "-fstack-protector",
- "-msse3",
- ],
- compile_multilib: "64",
- },
- },
-}
-
-// GN: //third_party/abseil-cpp/absl/status:status
-cc_library_static {
- name: "cronet_aml_third_party_abseil_cpp_absl_status_status",
- srcs: [
- "third_party/abseil-cpp/absl/status/status.cc",
- "third_party/abseil-cpp/absl/status/status_payload_printer.cc",
- ],
- static_libs: [
- "cronet_aml_third_party_abseil_cpp_absl_base_base",
- "cronet_aml_third_party_abseil_cpp_absl_base_log_severity",
- "cronet_aml_third_party_abseil_cpp_absl_base_malloc_internal",
- "cronet_aml_third_party_abseil_cpp_absl_base_raw_logging_internal",
- "cronet_aml_third_party_abseil_cpp_absl_base_spinlock_wait",
- "cronet_aml_third_party_abseil_cpp_absl_base_strerror",
- "cronet_aml_third_party_abseil_cpp_absl_base_throw_delegate",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_debugging_internal",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_demangle_internal",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_stacktrace",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_symbolize",
- "cronet_aml_third_party_abseil_cpp_absl_numeric_int128",
- "cronet_aml_third_party_abseil_cpp_absl_profiling_exponential_biased",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cord",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cord_internal",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_functions",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_handle",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_info",
- "cronet_aml_third_party_abseil_cpp_absl_strings_internal",
- "cronet_aml_third_party_abseil_cpp_absl_strings_str_format_internal",
- "cronet_aml_third_party_abseil_cpp_absl_strings_strings",
- "cronet_aml_third_party_abseil_cpp_absl_synchronization_graphcycles_internal",
- "cronet_aml_third_party_abseil_cpp_absl_synchronization_synchronization",
- "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_civil_time",
- "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_time_zone",
- "cronet_aml_third_party_abseil_cpp_absl_time_time",
- "cronet_aml_third_party_abseil_cpp_absl_types_bad_optional_access",
- ],
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DABSL_ALLOCATOR_NOTHROW=1",
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DHAVE_SYS_UIO_H",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-Oz",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "third_party/abseil-cpp/",
- ],
- cpp_std: "c++17",
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- ],
- target: {
- android_arm: {
- cflags: [
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-fstack-protector",
- "-msse3",
- ],
- },
- },
-}
-
-// GN: //third_party/abseil-cpp/absl/status:status__testing
-cc_library_static {
- name: "cronet_aml_third_party_abseil_cpp_absl_status_status__testing",
- srcs: [
- "third_party/abseil-cpp/absl/status/status.cc",
- "third_party/abseil-cpp/absl/status/status_payload_printer.cc",
- ],
- static_libs: [
- "cronet_aml_third_party_abseil_cpp_absl_base_base__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_log_severity__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_malloc_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_raw_logging_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_spinlock_wait__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_strerror__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_throw_delegate__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_debugging_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_demangle_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_stacktrace__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_symbolize__testing",
- "cronet_aml_third_party_abseil_cpp_absl_numeric_int128__testing",
- "cronet_aml_third_party_abseil_cpp_absl_profiling_exponential_biased__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cord__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cord_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_functions__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_handle__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_info__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_str_format_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_strings__testing",
- "cronet_aml_third_party_abseil_cpp_absl_synchronization_graphcycles_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_synchronization_synchronization__testing",
- "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_civil_time__testing",
- "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_time_zone__testing",
- "cronet_aml_third_party_abseil_cpp_absl_time_time__testing",
- "cronet_aml_third_party_abseil_cpp_absl_types_bad_optional_access__testing",
- ],
- host_supported: true,
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DABSL_ALLOCATOR_NOTHROW=1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "third_party/abseil-cpp/",
- ],
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- ],
- target: {
- android_arm: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- "-msse3",
- ],
- },
- host: {
- cflags: [
- "-DCR_SYSROOT_KEY=20220331T153654Z-0",
- "-DUSE_AURA=1",
- "-DUSE_OZONE=1",
- "-DUSE_UDEV",
- "-D_FILE_OFFSET_BITS=64",
- "-D_LARGEFILE64_SOURCE",
- "-D_LARGEFILE_SOURCE",
- "-O2",
- "-fstack-protector",
- "-msse3",
- ],
- compile_multilib: "64",
- },
- },
-}
-
-// GN: //third_party/abseil-cpp/absl/status:statusor
-cc_library_static {
- name: "cronet_aml_third_party_abseil_cpp_absl_status_statusor",
- srcs: [
- "third_party/abseil-cpp/absl/status/statusor.cc",
- ],
- static_libs: [
- "cronet_aml_third_party_abseil_cpp_absl_base_base",
- "cronet_aml_third_party_abseil_cpp_absl_base_log_severity",
- "cronet_aml_third_party_abseil_cpp_absl_base_malloc_internal",
- "cronet_aml_third_party_abseil_cpp_absl_base_raw_logging_internal",
- "cronet_aml_third_party_abseil_cpp_absl_base_spinlock_wait",
- "cronet_aml_third_party_abseil_cpp_absl_base_strerror",
- "cronet_aml_third_party_abseil_cpp_absl_base_throw_delegate",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_debugging_internal",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_demangle_internal",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_stacktrace",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_symbolize",
- "cronet_aml_third_party_abseil_cpp_absl_numeric_int128",
- "cronet_aml_third_party_abseil_cpp_absl_profiling_exponential_biased",
- "cronet_aml_third_party_abseil_cpp_absl_status_status",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cord",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cord_internal",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_functions",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_handle",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_info",
- "cronet_aml_third_party_abseil_cpp_absl_strings_internal",
- "cronet_aml_third_party_abseil_cpp_absl_strings_str_format_internal",
- "cronet_aml_third_party_abseil_cpp_absl_strings_strings",
- "cronet_aml_third_party_abseil_cpp_absl_synchronization_graphcycles_internal",
- "cronet_aml_third_party_abseil_cpp_absl_synchronization_synchronization",
- "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_civil_time",
- "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_time_zone",
- "cronet_aml_third_party_abseil_cpp_absl_time_time",
- "cronet_aml_third_party_abseil_cpp_absl_types_bad_optional_access",
- "cronet_aml_third_party_abseil_cpp_absl_types_bad_variant_access",
- ],
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DABSL_ALLOCATOR_NOTHROW=1",
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DHAVE_SYS_UIO_H",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-Oz",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "third_party/abseil-cpp/",
- ],
- cpp_std: "c++17",
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- ],
- target: {
- android_arm: {
- cflags: [
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-fstack-protector",
- "-msse3",
- ],
- },
- },
-}
-
-// GN: //third_party/abseil-cpp/absl/status:statusor__testing
-cc_library_static {
- name: "cronet_aml_third_party_abseil_cpp_absl_status_statusor__testing",
- srcs: [
- "third_party/abseil-cpp/absl/status/statusor.cc",
- ],
- static_libs: [
- "cronet_aml_third_party_abseil_cpp_absl_base_base__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_log_severity__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_malloc_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_raw_logging_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_spinlock_wait__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_strerror__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_throw_delegate__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_debugging_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_demangle_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_stacktrace__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_symbolize__testing",
- "cronet_aml_third_party_abseil_cpp_absl_numeric_int128__testing",
- "cronet_aml_third_party_abseil_cpp_absl_profiling_exponential_biased__testing",
- "cronet_aml_third_party_abseil_cpp_absl_status_status__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cord__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cord_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_functions__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_handle__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_info__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_str_format_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_strings__testing",
- "cronet_aml_third_party_abseil_cpp_absl_synchronization_graphcycles_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_synchronization_synchronization__testing",
- "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_civil_time__testing",
- "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_time_zone__testing",
- "cronet_aml_third_party_abseil_cpp_absl_time_time__testing",
- "cronet_aml_third_party_abseil_cpp_absl_types_bad_optional_access__testing",
- "cronet_aml_third_party_abseil_cpp_absl_types_bad_variant_access__testing",
- ],
- host_supported: true,
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DABSL_ALLOCATOR_NOTHROW=1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "third_party/abseil-cpp/",
- ],
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- ],
- target: {
- android_arm: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- "-msse3",
- ],
- },
- host: {
- cflags: [
- "-DCR_SYSROOT_KEY=20220331T153654Z-0",
- "-DUSE_AURA=1",
- "-DUSE_OZONE=1",
- "-DUSE_UDEV",
- "-D_FILE_OFFSET_BITS=64",
- "-D_LARGEFILE64_SOURCE",
- "-D_LARGEFILE_SOURCE",
- "-O2",
- "-fstack-protector",
- "-msse3",
- ],
- compile_multilib: "64",
- },
- },
-}
-
-// GN: //third_party/abseil-cpp/absl/strings:cord
-cc_library_static {
- name: "cronet_aml_third_party_abseil_cpp_absl_strings_cord",
- srcs: [
- "third_party/abseil-cpp/absl/strings/cord.cc",
- "third_party/abseil-cpp/absl/strings/cord_analysis.cc",
- "third_party/abseil-cpp/absl/strings/cord_buffer.cc",
- ],
- static_libs: [
- "cronet_aml_third_party_abseil_cpp_absl_base_base",
- "cronet_aml_third_party_abseil_cpp_absl_base_log_severity",
- "cronet_aml_third_party_abseil_cpp_absl_base_malloc_internal",
- "cronet_aml_third_party_abseil_cpp_absl_base_raw_logging_internal",
- "cronet_aml_third_party_abseil_cpp_absl_base_spinlock_wait",
- "cronet_aml_third_party_abseil_cpp_absl_base_throw_delegate",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_debugging_internal",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_demangle_internal",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_stacktrace",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_symbolize",
- "cronet_aml_third_party_abseil_cpp_absl_numeric_int128",
- "cronet_aml_third_party_abseil_cpp_absl_profiling_exponential_biased",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cord_internal",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_functions",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_handle",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_info",
- "cronet_aml_third_party_abseil_cpp_absl_strings_internal",
- "cronet_aml_third_party_abseil_cpp_absl_strings_str_format_internal",
- "cronet_aml_third_party_abseil_cpp_absl_strings_strings",
- "cronet_aml_third_party_abseil_cpp_absl_synchronization_graphcycles_internal",
- "cronet_aml_third_party_abseil_cpp_absl_synchronization_synchronization",
- "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_civil_time",
- "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_time_zone",
- "cronet_aml_third_party_abseil_cpp_absl_time_time",
- "cronet_aml_third_party_abseil_cpp_absl_types_bad_optional_access",
- ],
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DABSL_ALLOCATOR_NOTHROW=1",
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DHAVE_SYS_UIO_H",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-Oz",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "third_party/abseil-cpp/",
- ],
- cpp_std: "c++17",
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- ],
- target: {
- android_arm: {
- cflags: [
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-fstack-protector",
- "-msse3",
- ],
- },
- },
-}
-
-// GN: //third_party/abseil-cpp/absl/strings:cord__testing
-cc_library_static {
- name: "cronet_aml_third_party_abseil_cpp_absl_strings_cord__testing",
- srcs: [
- "third_party/abseil-cpp/absl/strings/cord.cc",
- "third_party/abseil-cpp/absl/strings/cord_analysis.cc",
- "third_party/abseil-cpp/absl/strings/cord_buffer.cc",
- ],
- static_libs: [
- "cronet_aml_third_party_abseil_cpp_absl_base_base__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_log_severity__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_malloc_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_raw_logging_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_spinlock_wait__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_throw_delegate__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_debugging_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_demangle_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_stacktrace__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_symbolize__testing",
- "cronet_aml_third_party_abseil_cpp_absl_numeric_int128__testing",
- "cronet_aml_third_party_abseil_cpp_absl_profiling_exponential_biased__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cord_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_functions__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_handle__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_info__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_str_format_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_strings__testing",
- "cronet_aml_third_party_abseil_cpp_absl_synchronization_graphcycles_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_synchronization_synchronization__testing",
- "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_civil_time__testing",
- "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_time_zone__testing",
- "cronet_aml_third_party_abseil_cpp_absl_time_time__testing",
- "cronet_aml_third_party_abseil_cpp_absl_types_bad_optional_access__testing",
- ],
- host_supported: true,
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DABSL_ALLOCATOR_NOTHROW=1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "third_party/abseil-cpp/",
- ],
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- ],
- target: {
- android_arm: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- "-msse3",
- ],
- },
- host: {
- cflags: [
- "-DCR_SYSROOT_KEY=20220331T153654Z-0",
- "-DUSE_AURA=1",
- "-DUSE_OZONE=1",
- "-DUSE_UDEV",
- "-D_FILE_OFFSET_BITS=64",
- "-D_LARGEFILE64_SOURCE",
- "-D_LARGEFILE_SOURCE",
- "-O2",
- "-fstack-protector",
- "-msse3",
- ],
- compile_multilib: "64",
- },
- },
-}
-
-// GN: //third_party/abseil-cpp/absl/strings:cord_internal
-cc_library_static {
- name: "cronet_aml_third_party_abseil_cpp_absl_strings_cord_internal",
- srcs: [
- "third_party/abseil-cpp/absl/strings/internal/cord_internal.cc",
- "third_party/abseil-cpp/absl/strings/internal/cord_rep_btree.cc",
- "third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_navigator.cc",
- "third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_reader.cc",
- "third_party/abseil-cpp/absl/strings/internal/cord_rep_consume.cc",
- "third_party/abseil-cpp/absl/strings/internal/cord_rep_crc.cc",
- "third_party/abseil-cpp/absl/strings/internal/cord_rep_ring.cc",
- ],
- static_libs: [
- "cronet_aml_third_party_abseil_cpp_absl_base_base",
- "cronet_aml_third_party_abseil_cpp_absl_base_log_severity",
- "cronet_aml_third_party_abseil_cpp_absl_base_raw_logging_internal",
- "cronet_aml_third_party_abseil_cpp_absl_base_spinlock_wait",
- "cronet_aml_third_party_abseil_cpp_absl_base_throw_delegate",
- "cronet_aml_third_party_abseil_cpp_absl_numeric_int128",
- "cronet_aml_third_party_abseil_cpp_absl_strings_internal",
- "cronet_aml_third_party_abseil_cpp_absl_strings_strings",
- ],
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DABSL_ALLOCATOR_NOTHROW=1",
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DHAVE_SYS_UIO_H",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-Oz",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "third_party/abseil-cpp/",
- ],
- cpp_std: "c++17",
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- ],
- target: {
- android_arm: {
- cflags: [
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-fstack-protector",
- "-msse3",
- ],
- },
- },
-}
-
-// GN: //third_party/abseil-cpp/absl/strings:cord_internal__testing
-cc_library_static {
- name: "cronet_aml_third_party_abseil_cpp_absl_strings_cord_internal__testing",
- srcs: [
- "third_party/abseil-cpp/absl/strings/internal/cord_internal.cc",
- "third_party/abseil-cpp/absl/strings/internal/cord_rep_btree.cc",
- "third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_navigator.cc",
- "third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_reader.cc",
- "third_party/abseil-cpp/absl/strings/internal/cord_rep_consume.cc",
- "third_party/abseil-cpp/absl/strings/internal/cord_rep_crc.cc",
- "third_party/abseil-cpp/absl/strings/internal/cord_rep_ring.cc",
- ],
- static_libs: [
- "cronet_aml_third_party_abseil_cpp_absl_base_base__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_log_severity__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_raw_logging_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_spinlock_wait__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_throw_delegate__testing",
- "cronet_aml_third_party_abseil_cpp_absl_numeric_int128__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_strings__testing",
- ],
- host_supported: true,
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DABSL_ALLOCATOR_NOTHROW=1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "third_party/abseil-cpp/",
- ],
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- ],
- target: {
- android_arm: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- "-msse3",
- ],
- },
- host: {
- cflags: [
- "-DCR_SYSROOT_KEY=20220331T153654Z-0",
- "-DUSE_AURA=1",
- "-DUSE_OZONE=1",
- "-DUSE_UDEV",
- "-D_FILE_OFFSET_BITS=64",
- "-D_LARGEFILE64_SOURCE",
- "-D_LARGEFILE_SOURCE",
- "-O2",
- "-fstack-protector",
- "-msse3",
- ],
- compile_multilib: "64",
- },
- },
-}
-
-// GN: //third_party/abseil-cpp/absl/strings:cordz_functions
-cc_library_static {
- name: "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_functions",
- srcs: [
- "third_party/abseil-cpp/absl/strings/internal/cordz_functions.cc",
- ],
- static_libs: [
- "cronet_aml_third_party_abseil_cpp_absl_base_log_severity",
- "cronet_aml_third_party_abseil_cpp_absl_base_raw_logging_internal",
- "cronet_aml_third_party_abseil_cpp_absl_profiling_exponential_biased",
- ],
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DABSL_ALLOCATOR_NOTHROW=1",
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DHAVE_SYS_UIO_H",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-Oz",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "third_party/abseil-cpp/",
- ],
- cpp_std: "c++17",
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- ],
- target: {
- android_arm: {
- cflags: [
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-fstack-protector",
- "-msse3",
- ],
- },
- },
-}
-
-// GN: //third_party/abseil-cpp/absl/strings:cordz_functions__testing
-cc_library_static {
- name: "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_functions__testing",
- srcs: [
- "third_party/abseil-cpp/absl/strings/internal/cordz_functions.cc",
- ],
- static_libs: [
- "cronet_aml_third_party_abseil_cpp_absl_base_log_severity__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_raw_logging_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_profiling_exponential_biased__testing",
- ],
- host_supported: true,
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DABSL_ALLOCATOR_NOTHROW=1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "third_party/abseil-cpp/",
- ],
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- ],
- target: {
- android_arm: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- "-msse3",
- ],
- },
- host: {
- cflags: [
- "-DCR_SYSROOT_KEY=20220331T153654Z-0",
- "-DUSE_AURA=1",
- "-DUSE_OZONE=1",
- "-DUSE_UDEV",
- "-D_FILE_OFFSET_BITS=64",
- "-D_LARGEFILE64_SOURCE",
- "-D_LARGEFILE_SOURCE",
- "-O2",
- "-fstack-protector",
- "-msse3",
- ],
- compile_multilib: "64",
- },
- },
-}
-
-// GN: //third_party/abseil-cpp/absl/strings:cordz_handle
-cc_library_static {
- name: "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_handle",
- srcs: [
- "third_party/abseil-cpp/absl/strings/internal/cordz_handle.cc",
- ],
- static_libs: [
- "cronet_aml_third_party_abseil_cpp_absl_base_base",
- "cronet_aml_third_party_abseil_cpp_absl_base_log_severity",
- "cronet_aml_third_party_abseil_cpp_absl_base_malloc_internal",
- "cronet_aml_third_party_abseil_cpp_absl_base_raw_logging_internal",
- "cronet_aml_third_party_abseil_cpp_absl_base_spinlock_wait",
- "cronet_aml_third_party_abseil_cpp_absl_base_throw_delegate",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_debugging_internal",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_demangle_internal",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_stacktrace",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_symbolize",
- "cronet_aml_third_party_abseil_cpp_absl_numeric_int128",
- "cronet_aml_third_party_abseil_cpp_absl_strings_internal",
- "cronet_aml_third_party_abseil_cpp_absl_strings_strings",
- "cronet_aml_third_party_abseil_cpp_absl_synchronization_graphcycles_internal",
- "cronet_aml_third_party_abseil_cpp_absl_synchronization_synchronization",
- "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_civil_time",
- "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_time_zone",
- "cronet_aml_third_party_abseil_cpp_absl_time_time",
- ],
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DABSL_ALLOCATOR_NOTHROW=1",
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DHAVE_SYS_UIO_H",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-Oz",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "third_party/abseil-cpp/",
- ],
- cpp_std: "c++17",
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- ],
- target: {
- android_arm: {
- cflags: [
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-fstack-protector",
- "-msse3",
- ],
- },
- },
-}
-
-// GN: //third_party/abseil-cpp/absl/strings:cordz_handle__testing
-cc_library_static {
- name: "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_handle__testing",
- srcs: [
- "third_party/abseil-cpp/absl/strings/internal/cordz_handle.cc",
- ],
- static_libs: [
- "cronet_aml_third_party_abseil_cpp_absl_base_base__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_log_severity__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_malloc_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_raw_logging_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_spinlock_wait__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_throw_delegate__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_debugging_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_demangle_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_stacktrace__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_symbolize__testing",
- "cronet_aml_third_party_abseil_cpp_absl_numeric_int128__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_strings__testing",
- "cronet_aml_third_party_abseil_cpp_absl_synchronization_graphcycles_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_synchronization_synchronization__testing",
- "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_civil_time__testing",
- "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_time_zone__testing",
- "cronet_aml_third_party_abseil_cpp_absl_time_time__testing",
- ],
- host_supported: true,
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DABSL_ALLOCATOR_NOTHROW=1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "third_party/abseil-cpp/",
- ],
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- ],
- target: {
- android_arm: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- "-msse3",
- ],
- },
- host: {
- cflags: [
- "-DCR_SYSROOT_KEY=20220331T153654Z-0",
- "-DUSE_AURA=1",
- "-DUSE_OZONE=1",
- "-DUSE_UDEV",
- "-D_FILE_OFFSET_BITS=64",
- "-D_LARGEFILE64_SOURCE",
- "-D_LARGEFILE_SOURCE",
- "-O2",
- "-fstack-protector",
- "-msse3",
- ],
- compile_multilib: "64",
- },
- },
-}
-
-// GN: //third_party/abseil-cpp/absl/strings:cordz_info
-cc_library_static {
- name: "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_info",
- srcs: [
- "third_party/abseil-cpp/absl/strings/internal/cordz_info.cc",
- ],
- static_libs: [
- "cronet_aml_third_party_abseil_cpp_absl_base_base",
- "cronet_aml_third_party_abseil_cpp_absl_base_log_severity",
- "cronet_aml_third_party_abseil_cpp_absl_base_malloc_internal",
- "cronet_aml_third_party_abseil_cpp_absl_base_raw_logging_internal",
- "cronet_aml_third_party_abseil_cpp_absl_base_spinlock_wait",
- "cronet_aml_third_party_abseil_cpp_absl_base_throw_delegate",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_debugging_internal",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_demangle_internal",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_stacktrace",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_symbolize",
- "cronet_aml_third_party_abseil_cpp_absl_numeric_int128",
- "cronet_aml_third_party_abseil_cpp_absl_profiling_exponential_biased",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cord_internal",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_functions",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_handle",
- "cronet_aml_third_party_abseil_cpp_absl_strings_internal",
- "cronet_aml_third_party_abseil_cpp_absl_strings_strings",
- "cronet_aml_third_party_abseil_cpp_absl_synchronization_graphcycles_internal",
- "cronet_aml_third_party_abseil_cpp_absl_synchronization_synchronization",
- "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_civil_time",
- "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_time_zone",
- "cronet_aml_third_party_abseil_cpp_absl_time_time",
- ],
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DABSL_ALLOCATOR_NOTHROW=1",
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DHAVE_SYS_UIO_H",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-Oz",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "third_party/abseil-cpp/",
- ],
- cpp_std: "c++17",
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- ],
- target: {
- android_arm: {
- cflags: [
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-fstack-protector",
- "-msse3",
- ],
- },
- },
-}
-
-// GN: //third_party/abseil-cpp/absl/strings:cordz_info__testing
-cc_library_static {
- name: "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_info__testing",
- srcs: [
- "third_party/abseil-cpp/absl/strings/internal/cordz_info.cc",
- ],
- static_libs: [
- "cronet_aml_third_party_abseil_cpp_absl_base_base__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_log_severity__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_malloc_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_raw_logging_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_spinlock_wait__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_throw_delegate__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_debugging_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_demangle_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_stacktrace__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_symbolize__testing",
- "cronet_aml_third_party_abseil_cpp_absl_numeric_int128__testing",
- "cronet_aml_third_party_abseil_cpp_absl_profiling_exponential_biased__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cord_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_functions__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_handle__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_strings__testing",
- "cronet_aml_third_party_abseil_cpp_absl_synchronization_graphcycles_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_synchronization_synchronization__testing",
- "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_civil_time__testing",
- "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_time_zone__testing",
- "cronet_aml_third_party_abseil_cpp_absl_time_time__testing",
- ],
- host_supported: true,
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DABSL_ALLOCATOR_NOTHROW=1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "third_party/abseil-cpp/",
- ],
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- ],
- target: {
- android_arm: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- "-msse3",
- ],
- },
- host: {
- cflags: [
- "-DCR_SYSROOT_KEY=20220331T153654Z-0",
- "-DUSE_AURA=1",
- "-DUSE_OZONE=1",
- "-DUSE_UDEV",
- "-D_FILE_OFFSET_BITS=64",
- "-D_LARGEFILE64_SOURCE",
- "-D_LARGEFILE_SOURCE",
- "-O2",
- "-fstack-protector",
- "-msse3",
- ],
- compile_multilib: "64",
- },
- },
-}
-
-// GN: //third_party/abseil-cpp/absl/strings:internal
-cc_library_static {
- name: "cronet_aml_third_party_abseil_cpp_absl_strings_internal",
- srcs: [
- "third_party/abseil-cpp/absl/strings/internal/escaping.cc",
- "third_party/abseil-cpp/absl/strings/internal/ostringstream.cc",
- "third_party/abseil-cpp/absl/strings/internal/utf8.cc",
- ],
- static_libs: [
- "cronet_aml_third_party_abseil_cpp_absl_base_base",
- "cronet_aml_third_party_abseil_cpp_absl_base_log_severity",
- "cronet_aml_third_party_abseil_cpp_absl_base_raw_logging_internal",
- "cronet_aml_third_party_abseil_cpp_absl_base_spinlock_wait",
- ],
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DABSL_ALLOCATOR_NOTHROW=1",
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DHAVE_SYS_UIO_H",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-Oz",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "third_party/abseil-cpp/",
- ],
- cpp_std: "c++17",
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- ],
- target: {
- android_arm: {
- cflags: [
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-fstack-protector",
- "-msse3",
- ],
- },
- },
-}
-
-// GN: //third_party/abseil-cpp/absl/strings:internal__testing
-cc_library_static {
- name: "cronet_aml_third_party_abseil_cpp_absl_strings_internal__testing",
- srcs: [
- "third_party/abseil-cpp/absl/strings/internal/escaping.cc",
- "third_party/abseil-cpp/absl/strings/internal/ostringstream.cc",
- "third_party/abseil-cpp/absl/strings/internal/utf8.cc",
- ],
- static_libs: [
- "cronet_aml_third_party_abseil_cpp_absl_base_base__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_log_severity__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_raw_logging_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_spinlock_wait__testing",
- ],
- host_supported: true,
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DABSL_ALLOCATOR_NOTHROW=1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "third_party/abseil-cpp/",
- ],
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- ],
- target: {
- android_arm: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- "-msse3",
- ],
- },
- host: {
- cflags: [
- "-DCR_SYSROOT_KEY=20220331T153654Z-0",
- "-DUSE_AURA=1",
- "-DUSE_OZONE=1",
- "-DUSE_UDEV",
- "-D_FILE_OFFSET_BITS=64",
- "-D_LARGEFILE64_SOURCE",
- "-D_LARGEFILE_SOURCE",
- "-O2",
- "-fstack-protector",
- "-msse3",
- ],
- compile_multilib: "64",
- },
- },
-}
-
-// GN: //third_party/abseil-cpp/absl/strings:str_format_internal
-cc_library_static {
- name: "cronet_aml_third_party_abseil_cpp_absl_strings_str_format_internal",
- srcs: [
- "third_party/abseil-cpp/absl/strings/internal/str_format/arg.cc",
- "third_party/abseil-cpp/absl/strings/internal/str_format/bind.cc",
- "third_party/abseil-cpp/absl/strings/internal/str_format/extension.cc",
- "third_party/abseil-cpp/absl/strings/internal/str_format/float_conversion.cc",
- "third_party/abseil-cpp/absl/strings/internal/str_format/output.cc",
- "third_party/abseil-cpp/absl/strings/internal/str_format/parser.cc",
- ],
- static_libs: [
- "cronet_aml_third_party_abseil_cpp_absl_base_base",
- "cronet_aml_third_party_abseil_cpp_absl_base_log_severity",
- "cronet_aml_third_party_abseil_cpp_absl_base_raw_logging_internal",
- "cronet_aml_third_party_abseil_cpp_absl_base_spinlock_wait",
- "cronet_aml_third_party_abseil_cpp_absl_base_throw_delegate",
- "cronet_aml_third_party_abseil_cpp_absl_numeric_int128",
- "cronet_aml_third_party_abseil_cpp_absl_strings_internal",
- "cronet_aml_third_party_abseil_cpp_absl_strings_strings",
- "cronet_aml_third_party_abseil_cpp_absl_types_bad_optional_access",
- ],
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DABSL_ALLOCATOR_NOTHROW=1",
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DHAVE_SYS_UIO_H",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-Oz",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "third_party/abseil-cpp/",
- ],
- cpp_std: "c++17",
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- ],
- target: {
- android_arm: {
- cflags: [
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-fstack-protector",
- "-msse3",
- ],
- },
- },
-}
-
-// GN: //third_party/abseil-cpp/absl/strings:str_format_internal__testing
-cc_library_static {
- name: "cronet_aml_third_party_abseil_cpp_absl_strings_str_format_internal__testing",
- srcs: [
- "third_party/abseil-cpp/absl/strings/internal/str_format/arg.cc",
- "third_party/abseil-cpp/absl/strings/internal/str_format/bind.cc",
- "third_party/abseil-cpp/absl/strings/internal/str_format/extension.cc",
- "third_party/abseil-cpp/absl/strings/internal/str_format/float_conversion.cc",
- "third_party/abseil-cpp/absl/strings/internal/str_format/output.cc",
- "third_party/abseil-cpp/absl/strings/internal/str_format/parser.cc",
- ],
- static_libs: [
- "cronet_aml_third_party_abseil_cpp_absl_base_base__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_log_severity__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_raw_logging_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_spinlock_wait__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_throw_delegate__testing",
- "cronet_aml_third_party_abseil_cpp_absl_numeric_int128__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_strings__testing",
- "cronet_aml_third_party_abseil_cpp_absl_types_bad_optional_access__testing",
- ],
- host_supported: true,
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DABSL_ALLOCATOR_NOTHROW=1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "third_party/abseil-cpp/",
- ],
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- ],
- target: {
- android_arm: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- "-msse3",
- ],
- },
- host: {
- cflags: [
- "-DCR_SYSROOT_KEY=20220331T153654Z-0",
- "-DUSE_AURA=1",
- "-DUSE_OZONE=1",
- "-DUSE_UDEV",
- "-D_FILE_OFFSET_BITS=64",
- "-D_LARGEFILE64_SOURCE",
- "-D_LARGEFILE_SOURCE",
- "-O2",
- "-fstack-protector",
- "-msse3",
- ],
- compile_multilib: "64",
- },
- },
-}
-
-// GN: //third_party/abseil-cpp/absl/strings:strings
-cc_library_static {
- name: "cronet_aml_third_party_abseil_cpp_absl_strings_strings",
- srcs: [
- "third_party/abseil-cpp/absl/strings/ascii.cc",
- "third_party/abseil-cpp/absl/strings/charconv.cc",
- "third_party/abseil-cpp/absl/strings/escaping.cc",
- "third_party/abseil-cpp/absl/strings/internal/charconv_bigint.cc",
- "third_party/abseil-cpp/absl/strings/internal/charconv_parse.cc",
- "third_party/abseil-cpp/absl/strings/internal/memutil.cc",
- "third_party/abseil-cpp/absl/strings/match.cc",
- "third_party/abseil-cpp/absl/strings/numbers.cc",
- "third_party/abseil-cpp/absl/strings/str_cat.cc",
- "third_party/abseil-cpp/absl/strings/str_replace.cc",
- "third_party/abseil-cpp/absl/strings/str_split.cc",
- "third_party/abseil-cpp/absl/strings/string_view.cc",
- "third_party/abseil-cpp/absl/strings/substitute.cc",
- ],
- static_libs: [
- "cronet_aml_third_party_abseil_cpp_absl_base_base",
- "cronet_aml_third_party_abseil_cpp_absl_base_log_severity",
- "cronet_aml_third_party_abseil_cpp_absl_base_raw_logging_internal",
- "cronet_aml_third_party_abseil_cpp_absl_base_spinlock_wait",
- "cronet_aml_third_party_abseil_cpp_absl_base_throw_delegate",
- "cronet_aml_third_party_abseil_cpp_absl_numeric_int128",
- "cronet_aml_third_party_abseil_cpp_absl_strings_internal",
- ],
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DABSL_ALLOCATOR_NOTHROW=1",
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DHAVE_SYS_UIO_H",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-Oz",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "third_party/abseil-cpp/",
- ],
- cpp_std: "c++17",
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- ],
- target: {
- android_arm: {
- cflags: [
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-fstack-protector",
- "-msse3",
- ],
- },
- },
-}
-
-// GN: //third_party/abseil-cpp/absl/strings:strings__testing
-cc_library_static {
- name: "cronet_aml_third_party_abseil_cpp_absl_strings_strings__testing",
- srcs: [
- "third_party/abseil-cpp/absl/strings/ascii.cc",
- "third_party/abseil-cpp/absl/strings/charconv.cc",
- "third_party/abseil-cpp/absl/strings/escaping.cc",
- "third_party/abseil-cpp/absl/strings/internal/charconv_bigint.cc",
- "third_party/abseil-cpp/absl/strings/internal/charconv_parse.cc",
- "third_party/abseil-cpp/absl/strings/internal/memutil.cc",
- "third_party/abseil-cpp/absl/strings/match.cc",
- "third_party/abseil-cpp/absl/strings/numbers.cc",
- "third_party/abseil-cpp/absl/strings/str_cat.cc",
- "third_party/abseil-cpp/absl/strings/str_replace.cc",
- "third_party/abseil-cpp/absl/strings/str_split.cc",
- "third_party/abseil-cpp/absl/strings/string_view.cc",
- "third_party/abseil-cpp/absl/strings/substitute.cc",
- ],
- static_libs: [
- "cronet_aml_third_party_abseil_cpp_absl_base_base__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_log_severity__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_raw_logging_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_spinlock_wait__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_throw_delegate__testing",
- "cronet_aml_third_party_abseil_cpp_absl_numeric_int128__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_internal__testing",
- ],
- host_supported: true,
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DABSL_ALLOCATOR_NOTHROW=1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "third_party/abseil-cpp/",
- ],
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- ],
- target: {
- android_arm: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- "-msse3",
- ],
- },
- host: {
- cflags: [
- "-DCR_SYSROOT_KEY=20220331T153654Z-0",
- "-DUSE_AURA=1",
- "-DUSE_OZONE=1",
- "-DUSE_UDEV",
- "-D_FILE_OFFSET_BITS=64",
- "-D_LARGEFILE64_SOURCE",
- "-D_LARGEFILE_SOURCE",
- "-O2",
- "-fstack-protector",
- "-msse3",
- ],
- compile_multilib: "64",
- },
- },
-}
-
-// GN: //third_party/abseil-cpp/absl/synchronization:graphcycles_internal
-cc_library_static {
- name: "cronet_aml_third_party_abseil_cpp_absl_synchronization_graphcycles_internal",
- srcs: [
- "third_party/abseil-cpp/absl/synchronization/internal/graphcycles.cc",
- ],
- static_libs: [
- "cronet_aml_third_party_abseil_cpp_absl_base_base",
- "cronet_aml_third_party_abseil_cpp_absl_base_log_severity",
- "cronet_aml_third_party_abseil_cpp_absl_base_malloc_internal",
- "cronet_aml_third_party_abseil_cpp_absl_base_raw_logging_internal",
- "cronet_aml_third_party_abseil_cpp_absl_base_spinlock_wait",
- ],
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DABSL_ALLOCATOR_NOTHROW=1",
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DHAVE_SYS_UIO_H",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-Oz",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "third_party/abseil-cpp/",
- ],
- cpp_std: "c++17",
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- ],
- target: {
- android_arm: {
- cflags: [
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-fstack-protector",
- "-msse3",
- ],
- },
- },
-}
-
-// GN: //third_party/abseil-cpp/absl/synchronization:graphcycles_internal__testing
-cc_library_static {
- name: "cronet_aml_third_party_abseil_cpp_absl_synchronization_graphcycles_internal__testing",
- srcs: [
- "third_party/abseil-cpp/absl/synchronization/internal/graphcycles.cc",
- ],
- static_libs: [
- "cronet_aml_third_party_abseil_cpp_absl_base_base__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_log_severity__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_malloc_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_raw_logging_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_spinlock_wait__testing",
- ],
- host_supported: true,
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DABSL_ALLOCATOR_NOTHROW=1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "third_party/abseil-cpp/",
- ],
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- ],
- target: {
- android_arm: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- "-msse3",
- ],
- },
- host: {
- cflags: [
- "-DCR_SYSROOT_KEY=20220331T153654Z-0",
- "-DUSE_AURA=1",
- "-DUSE_OZONE=1",
- "-DUSE_UDEV",
- "-D_FILE_OFFSET_BITS=64",
- "-D_LARGEFILE64_SOURCE",
- "-D_LARGEFILE_SOURCE",
- "-O2",
- "-fstack-protector",
- "-msse3",
- ],
- compile_multilib: "64",
- },
- },
-}
-
-// GN: //third_party/abseil-cpp/absl/synchronization:synchronization
-cc_library_static {
- name: "cronet_aml_third_party_abseil_cpp_absl_synchronization_synchronization",
- srcs: [
- "third_party/abseil-cpp/absl/synchronization/barrier.cc",
- "third_party/abseil-cpp/absl/synchronization/blocking_counter.cc",
- "third_party/abseil-cpp/absl/synchronization/internal/create_thread_identity.cc",
- "third_party/abseil-cpp/absl/synchronization/internal/per_thread_sem.cc",
- "third_party/abseil-cpp/absl/synchronization/internal/waiter.cc",
- "third_party/abseil-cpp/absl/synchronization/mutex.cc",
- "third_party/abseil-cpp/absl/synchronization/notification.cc",
- ],
- static_libs: [
- "cronet_aml_third_party_abseil_cpp_absl_base_base",
- "cronet_aml_third_party_abseil_cpp_absl_base_log_severity",
- "cronet_aml_third_party_abseil_cpp_absl_base_malloc_internal",
- "cronet_aml_third_party_abseil_cpp_absl_base_raw_logging_internal",
- "cronet_aml_third_party_abseil_cpp_absl_base_spinlock_wait",
- "cronet_aml_third_party_abseil_cpp_absl_base_throw_delegate",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_debugging_internal",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_demangle_internal",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_stacktrace",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_symbolize",
- "cronet_aml_third_party_abseil_cpp_absl_numeric_int128",
- "cronet_aml_third_party_abseil_cpp_absl_strings_internal",
- "cronet_aml_third_party_abseil_cpp_absl_strings_strings",
- "cronet_aml_third_party_abseil_cpp_absl_synchronization_graphcycles_internal",
- "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_civil_time",
- "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_time_zone",
- "cronet_aml_third_party_abseil_cpp_absl_time_time",
- ],
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DABSL_ALLOCATOR_NOTHROW=1",
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DHAVE_SYS_UIO_H",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-Oz",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "third_party/abseil-cpp/",
- ],
- cpp_std: "c++17",
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- ],
- target: {
- android_arm: {
- cflags: [
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-fstack-protector",
- "-msse3",
- ],
- },
- },
-}
-
-// GN: //third_party/abseil-cpp/absl/synchronization:synchronization__testing
-cc_library_static {
- name: "cronet_aml_third_party_abseil_cpp_absl_synchronization_synchronization__testing",
- srcs: [
- "third_party/abseil-cpp/absl/synchronization/barrier.cc",
- "third_party/abseil-cpp/absl/synchronization/blocking_counter.cc",
- "third_party/abseil-cpp/absl/synchronization/internal/create_thread_identity.cc",
- "third_party/abseil-cpp/absl/synchronization/internal/per_thread_sem.cc",
- "third_party/abseil-cpp/absl/synchronization/internal/waiter.cc",
- "third_party/abseil-cpp/absl/synchronization/mutex.cc",
- "third_party/abseil-cpp/absl/synchronization/notification.cc",
- ],
- static_libs: [
- "cronet_aml_third_party_abseil_cpp_absl_base_base__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_log_severity__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_malloc_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_raw_logging_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_spinlock_wait__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_throw_delegate__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_debugging_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_demangle_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_stacktrace__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_symbolize__testing",
- "cronet_aml_third_party_abseil_cpp_absl_numeric_int128__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_strings__testing",
- "cronet_aml_third_party_abseil_cpp_absl_synchronization_graphcycles_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_civil_time__testing",
- "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_time_zone__testing",
- "cronet_aml_third_party_abseil_cpp_absl_time_time__testing",
- ],
- host_supported: true,
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DABSL_ALLOCATOR_NOTHROW=1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "third_party/abseil-cpp/",
- ],
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- ],
- target: {
- android_arm: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- "-msse3",
- ],
- },
- host: {
- cflags: [
- "-DCR_SYSROOT_KEY=20220331T153654Z-0",
- "-DUSE_AURA=1",
- "-DUSE_OZONE=1",
- "-DUSE_UDEV",
- "-D_FILE_OFFSET_BITS=64",
- "-D_LARGEFILE64_SOURCE",
- "-D_LARGEFILE_SOURCE",
- "-O2",
- "-fstack-protector",
- "-msse3",
- ],
- compile_multilib: "64",
- },
- },
-}
-
-// GN: //third_party/abseil-cpp/absl/time/internal/cctz:civil_time
-cc_library_static {
- name: "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_civil_time",
- srcs: [
- "third_party/abseil-cpp/absl/time/internal/cctz/src/civil_time_detail.cc",
- ],
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DABSL_ALLOCATOR_NOTHROW=1",
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DHAVE_SYS_UIO_H",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-Oz",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "third_party/abseil-cpp/",
- ],
- cpp_std: "c++17",
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- ],
- target: {
- android_arm: {
- cflags: [
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-fstack-protector",
- "-msse3",
- ],
- },
- },
-}
-
-// GN: //third_party/abseil-cpp/absl/time/internal/cctz:civil_time__testing
-cc_library_static {
- name: "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_civil_time__testing",
- srcs: [
- "third_party/abseil-cpp/absl/time/internal/cctz/src/civil_time_detail.cc",
- ],
- host_supported: true,
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DABSL_ALLOCATOR_NOTHROW=1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "third_party/abseil-cpp/",
- ],
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- ],
- target: {
- android_arm: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- "-msse3",
- ],
- },
- host: {
- cflags: [
- "-DCR_SYSROOT_KEY=20220331T153654Z-0",
- "-DUSE_AURA=1",
- "-DUSE_OZONE=1",
- "-DUSE_UDEV",
- "-D_FILE_OFFSET_BITS=64",
- "-D_LARGEFILE64_SOURCE",
- "-D_LARGEFILE_SOURCE",
- "-O2",
- "-fstack-protector",
- "-msse3",
- ],
- compile_multilib: "64",
- },
- },
-}
-
-// GN: //third_party/abseil-cpp/absl/time/internal/cctz:time_zone
-cc_library_static {
- name: "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_time_zone",
- srcs: [
- "third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_fixed.cc",
- "third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_format.cc",
- "third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_if.cc",
- "third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_impl.cc",
- "third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_info.cc",
- "third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_libc.cc",
- "third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_lookup.cc",
- "third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_posix.cc",
- "third_party/abseil-cpp/absl/time/internal/cctz/src/zone_info_source.cc",
- ],
- static_libs: [
- "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_civil_time",
- ],
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DABSL_ALLOCATOR_NOTHROW=1",
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DHAVE_SYS_UIO_H",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-Oz",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "third_party/abseil-cpp/",
- ],
- cpp_std: "c++17",
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- ],
- target: {
- android_arm: {
- cflags: [
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-fstack-protector",
- "-msse3",
- ],
- },
- },
-}
-
-// GN: //third_party/abseil-cpp/absl/time/internal/cctz:time_zone__testing
-cc_library_static {
- name: "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_time_zone__testing",
- srcs: [
- "third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_fixed.cc",
- "third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_format.cc",
- "third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_if.cc",
- "third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_impl.cc",
- "third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_info.cc",
- "third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_libc.cc",
- "third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_lookup.cc",
- "third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_posix.cc",
- "third_party/abseil-cpp/absl/time/internal/cctz/src/zone_info_source.cc",
- ],
- static_libs: [
- "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_civil_time__testing",
- ],
- host_supported: true,
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DABSL_ALLOCATOR_NOTHROW=1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "third_party/abseil-cpp/",
- ],
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- ],
- target: {
- android_arm: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- "-msse3",
- ],
- },
- host: {
- cflags: [
- "-DCR_SYSROOT_KEY=20220331T153654Z-0",
- "-DUSE_AURA=1",
- "-DUSE_OZONE=1",
- "-DUSE_UDEV",
- "-D_FILE_OFFSET_BITS=64",
- "-D_LARGEFILE64_SOURCE",
- "-D_LARGEFILE_SOURCE",
- "-O2",
- "-fstack-protector",
- "-msse3",
- ],
- compile_multilib: "64",
- },
- },
-}
-
-// GN: //third_party/abseil-cpp/absl/time:time
-cc_library_static {
- name: "cronet_aml_third_party_abseil_cpp_absl_time_time",
- srcs: [
- "third_party/abseil-cpp/absl/time/civil_time.cc",
- "third_party/abseil-cpp/absl/time/clock.cc",
- "third_party/abseil-cpp/absl/time/duration.cc",
- "third_party/abseil-cpp/absl/time/format.cc",
- "third_party/abseil-cpp/absl/time/time.cc",
- ],
- static_libs: [
- "cronet_aml_third_party_abseil_cpp_absl_base_base",
- "cronet_aml_third_party_abseil_cpp_absl_base_log_severity",
- "cronet_aml_third_party_abseil_cpp_absl_base_raw_logging_internal",
- "cronet_aml_third_party_abseil_cpp_absl_base_spinlock_wait",
- "cronet_aml_third_party_abseil_cpp_absl_base_throw_delegate",
- "cronet_aml_third_party_abseil_cpp_absl_numeric_int128",
- "cronet_aml_third_party_abseil_cpp_absl_strings_internal",
- "cronet_aml_third_party_abseil_cpp_absl_strings_strings",
- "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_civil_time",
- "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_time_zone",
- ],
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DABSL_ALLOCATOR_NOTHROW=1",
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DHAVE_SYS_UIO_H",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-Oz",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "third_party/abseil-cpp/",
- ],
- cpp_std: "c++17",
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- ],
- target: {
- android_arm: {
- cflags: [
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-fstack-protector",
- "-msse3",
- ],
- },
- },
-}
-
-// GN: //third_party/abseil-cpp/absl/time:time__testing
-cc_library_static {
- name: "cronet_aml_third_party_abseil_cpp_absl_time_time__testing",
- srcs: [
- "third_party/abseil-cpp/absl/time/civil_time.cc",
- "third_party/abseil-cpp/absl/time/clock.cc",
- "third_party/abseil-cpp/absl/time/duration.cc",
- "third_party/abseil-cpp/absl/time/format.cc",
- "third_party/abseil-cpp/absl/time/time.cc",
- ],
- static_libs: [
- "cronet_aml_third_party_abseil_cpp_absl_base_base__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_log_severity__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_raw_logging_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_spinlock_wait__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_throw_delegate__testing",
- "cronet_aml_third_party_abseil_cpp_absl_numeric_int128__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_strings__testing",
- "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_civil_time__testing",
- "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_time_zone__testing",
- ],
- host_supported: true,
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DABSL_ALLOCATOR_NOTHROW=1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "third_party/abseil-cpp/",
- ],
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- ],
- target: {
- android_arm: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- "-msse3",
- ],
- },
- host: {
- cflags: [
- "-DCR_SYSROOT_KEY=20220331T153654Z-0",
- "-DUSE_AURA=1",
- "-DUSE_OZONE=1",
- "-DUSE_UDEV",
- "-D_FILE_OFFSET_BITS=64",
- "-D_LARGEFILE64_SOURCE",
- "-D_LARGEFILE_SOURCE",
- "-O2",
- "-fstack-protector",
- "-msse3",
- ],
- compile_multilib: "64",
- },
- },
-}
-
-// GN: //third_party/abseil-cpp/absl/types:bad_optional_access
-cc_library_static {
- name: "cronet_aml_third_party_abseil_cpp_absl_types_bad_optional_access",
- srcs: [
- "third_party/abseil-cpp/absl/types/bad_optional_access.cc",
- ],
- static_libs: [
- "cronet_aml_third_party_abseil_cpp_absl_base_log_severity",
- "cronet_aml_third_party_abseil_cpp_absl_base_raw_logging_internal",
- ],
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DABSL_ALLOCATOR_NOTHROW=1",
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DHAVE_SYS_UIO_H",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-Oz",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "third_party/abseil-cpp/",
- ],
- cpp_std: "c++17",
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- ],
- target: {
- android_arm: {
- cflags: [
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-fstack-protector",
- "-msse3",
- ],
- },
- },
-}
-
-// GN: //third_party/abseil-cpp/absl/types:bad_optional_access__testing
-cc_library_static {
- name: "cronet_aml_third_party_abseil_cpp_absl_types_bad_optional_access__testing",
- srcs: [
- "third_party/abseil-cpp/absl/types/bad_optional_access.cc",
- ],
- static_libs: [
- "cronet_aml_third_party_abseil_cpp_absl_base_log_severity__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_raw_logging_internal__testing",
- ],
- host_supported: true,
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DABSL_ALLOCATOR_NOTHROW=1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "third_party/abseil-cpp/",
- ],
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- ],
- target: {
- android_arm: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- "-msse3",
- ],
- },
- host: {
- cflags: [
- "-DCR_SYSROOT_KEY=20220331T153654Z-0",
- "-DUSE_AURA=1",
- "-DUSE_OZONE=1",
- "-DUSE_UDEV",
- "-D_FILE_OFFSET_BITS=64",
- "-D_LARGEFILE64_SOURCE",
- "-D_LARGEFILE_SOURCE",
- "-O2",
- "-fstack-protector",
- "-msse3",
- ],
- compile_multilib: "64",
- },
- },
-}
-
-// GN: //third_party/abseil-cpp/absl/types:bad_variant_access
-cc_library_static {
- name: "cronet_aml_third_party_abseil_cpp_absl_types_bad_variant_access",
- srcs: [
- "third_party/abseil-cpp/absl/types/bad_variant_access.cc",
- ],
- static_libs: [
- "cronet_aml_third_party_abseil_cpp_absl_base_log_severity",
- "cronet_aml_third_party_abseil_cpp_absl_base_raw_logging_internal",
- ],
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DABSL_ALLOCATOR_NOTHROW=1",
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DHAVE_SYS_UIO_H",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-Oz",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "third_party/abseil-cpp/",
- ],
- cpp_std: "c++17",
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- ],
- target: {
- android_arm: {
- cflags: [
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-fstack-protector",
- "-msse3",
- ],
- },
- },
-}
-
-// GN: //third_party/abseil-cpp/absl/types:bad_variant_access__testing
-cc_library_static {
- name: "cronet_aml_third_party_abseil_cpp_absl_types_bad_variant_access__testing",
- srcs: [
- "third_party/abseil-cpp/absl/types/bad_variant_access.cc",
- ],
- static_libs: [
- "cronet_aml_third_party_abseil_cpp_absl_base_log_severity__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_raw_logging_internal__testing",
- ],
- host_supported: true,
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DABSL_ALLOCATOR_NOTHROW=1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "third_party/abseil-cpp/",
- ],
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- ],
- target: {
- android_arm: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- "-msse3",
- ],
- },
- host: {
- cflags: [
- "-DCR_SYSROOT_KEY=20220331T153654Z-0",
- "-DUSE_AURA=1",
- "-DUSE_OZONE=1",
- "-DUSE_UDEV",
- "-D_FILE_OFFSET_BITS=64",
- "-D_LARGEFILE64_SOURCE",
- "-D_LARGEFILE_SOURCE",
- "-O2",
- "-fstack-protector",
- "-msse3",
- ],
- compile_multilib: "64",
- },
- },
-}
-
-// GN: //third_party/android_ndk:cpu_features
-cc_library_static {
- name: "cronet_aml_third_party_android_ndk_cpu_features",
- srcs: [
- "third_party/android_ndk/sources/android/cpufeatures/cpu-features.c",
- ],
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DHAVE_SYS_UIO_H",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-Oz",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "third_party/android_ndk/sources/android/cpufeatures/",
- ],
- cpp_std: "c++17",
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- ],
- target: {
- android_arm: {
- cflags: [
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-fstack-protector",
- "-msse3",
- ],
- },
- },
-}
-
-// GN: //third_party/android_ndk:cpu_features__testing
-cc_library_static {
- name: "cronet_aml_third_party_android_ndk_cpu_features__testing",
- srcs: [
- "third_party/android_ndk/sources/android/cpufeatures/cpu-features.c",
- ],
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DHAVE_SYS_UIO_H",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-Oz",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "third_party/android_ndk/sources/android/cpufeatures/",
- ],
- cpp_std: "c++17",
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- ],
- target: {
- android_arm: {
- cflags: [
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-fstack-protector",
- "-msse3",
- ],
- },
- },
-}
-
-// GN: //third_party/ashmem:ashmem
-cc_library_static {
- name: "cronet_aml_third_party_ashmem_ashmem",
- srcs: [
- "third_party/ashmem/ashmem-dev.c",
- ],
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DHAVE_SYS_UIO_H",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_FORTIFY_SOURCE=2",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D__STDC_CONSTANT_MACROS",
- "-D__STDC_FORMAT_MACROS",
- "-Oz",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- ],
- cpp_std: "c++17",
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- ],
- target: {
- android_arm: {
- cflags: [
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-fstack-protector",
- "-msse3",
- ],
- },
- },
-}
-
-// GN: //third_party/ashmem:ashmem__testing
-cc_library_static {
- name: "cronet_aml_third_party_ashmem_ashmem__testing",
- srcs: [
- "third_party/ashmem/ashmem-dev.c",
- ],
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DHAVE_SYS_UIO_H",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_FORTIFY_SOURCE=2",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D__STDC_CONSTANT_MACROS",
- "-D__STDC_FORMAT_MACROS",
- "-Oz",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- ],
- cpp_std: "c++17",
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- ],
- target: {
- android_arm: {
- cflags: [
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-fstack-protector",
- "-msse3",
- ],
- },
- },
-}
-
-// GN: //third_party/boringssl:boringssl
-cc_library_static {
- name: "cronet_aml_third_party_boringssl_boringssl",
- srcs: [
- "third_party/boringssl/err_data.c",
- "third_party/boringssl/src/crypto/asn1/a_bitstr.c",
- "third_party/boringssl/src/crypto/asn1/a_bool.c",
- "third_party/boringssl/src/crypto/asn1/a_d2i_fp.c",
- "third_party/boringssl/src/crypto/asn1/a_dup.c",
- "third_party/boringssl/src/crypto/asn1/a_gentm.c",
- "third_party/boringssl/src/crypto/asn1/a_i2d_fp.c",
- "third_party/boringssl/src/crypto/asn1/a_int.c",
- "third_party/boringssl/src/crypto/asn1/a_mbstr.c",
- "third_party/boringssl/src/crypto/asn1/a_object.c",
- "third_party/boringssl/src/crypto/asn1/a_octet.c",
- "third_party/boringssl/src/crypto/asn1/a_print.c",
- "third_party/boringssl/src/crypto/asn1/a_strex.c",
- "third_party/boringssl/src/crypto/asn1/a_strnid.c",
- "third_party/boringssl/src/crypto/asn1/a_time.c",
- "third_party/boringssl/src/crypto/asn1/a_type.c",
- "third_party/boringssl/src/crypto/asn1/a_utctm.c",
- "third_party/boringssl/src/crypto/asn1/a_utf8.c",
- "third_party/boringssl/src/crypto/asn1/asn1_lib.c",
- "third_party/boringssl/src/crypto/asn1/asn1_par.c",
- "third_party/boringssl/src/crypto/asn1/asn_pack.c",
- "third_party/boringssl/src/crypto/asn1/f_int.c",
- "third_party/boringssl/src/crypto/asn1/f_string.c",
- "third_party/boringssl/src/crypto/asn1/posix_time.c",
- "third_party/boringssl/src/crypto/asn1/tasn_dec.c",
- "third_party/boringssl/src/crypto/asn1/tasn_enc.c",
- "third_party/boringssl/src/crypto/asn1/tasn_fre.c",
- "third_party/boringssl/src/crypto/asn1/tasn_new.c",
- "third_party/boringssl/src/crypto/asn1/tasn_typ.c",
- "third_party/boringssl/src/crypto/asn1/tasn_utl.c",
- "third_party/boringssl/src/crypto/base64/base64.c",
- "third_party/boringssl/src/crypto/bio/bio.c",
- "third_party/boringssl/src/crypto/bio/bio_mem.c",
- "third_party/boringssl/src/crypto/bio/connect.c",
- "third_party/boringssl/src/crypto/bio/fd.c",
- "third_party/boringssl/src/crypto/bio/file.c",
- "third_party/boringssl/src/crypto/bio/hexdump.c",
- "third_party/boringssl/src/crypto/bio/pair.c",
- "third_party/boringssl/src/crypto/bio/printf.c",
- "third_party/boringssl/src/crypto/bio/socket.c",
- "third_party/boringssl/src/crypto/bio/socket_helper.c",
- "third_party/boringssl/src/crypto/blake2/blake2.c",
- "third_party/boringssl/src/crypto/bn_extra/bn_asn1.c",
- "third_party/boringssl/src/crypto/bn_extra/convert.c",
- "third_party/boringssl/src/crypto/buf/buf.c",
- "third_party/boringssl/src/crypto/bytestring/asn1_compat.c",
- "third_party/boringssl/src/crypto/bytestring/ber.c",
- "third_party/boringssl/src/crypto/bytestring/cbb.c",
- "third_party/boringssl/src/crypto/bytestring/cbs.c",
- "third_party/boringssl/src/crypto/bytestring/unicode.c",
- "third_party/boringssl/src/crypto/chacha/chacha.c",
- "third_party/boringssl/src/crypto/cipher_extra/cipher_extra.c",
- "third_party/boringssl/src/crypto/cipher_extra/derive_key.c",
- "third_party/boringssl/src/crypto/cipher_extra/e_aesctrhmac.c",
- "third_party/boringssl/src/crypto/cipher_extra/e_aesgcmsiv.c",
- "third_party/boringssl/src/crypto/cipher_extra/e_chacha20poly1305.c",
- "third_party/boringssl/src/crypto/cipher_extra/e_des.c",
- "third_party/boringssl/src/crypto/cipher_extra/e_null.c",
- "third_party/boringssl/src/crypto/cipher_extra/e_rc2.c",
- "third_party/boringssl/src/crypto/cipher_extra/e_rc4.c",
- "third_party/boringssl/src/crypto/cipher_extra/e_tls.c",
- "third_party/boringssl/src/crypto/cipher_extra/tls_cbc.c",
- "third_party/boringssl/src/crypto/conf/conf.c",
- "third_party/boringssl/src/crypto/cpu_aarch64_apple.c",
- "third_party/boringssl/src/crypto/cpu_aarch64_fuchsia.c",
- "third_party/boringssl/src/crypto/cpu_aarch64_linux.c",
- "third_party/boringssl/src/crypto/cpu_aarch64_win.c",
- "third_party/boringssl/src/crypto/cpu_arm.c",
- "third_party/boringssl/src/crypto/cpu_arm_linux.c",
- "third_party/boringssl/src/crypto/cpu_intel.c",
- "third_party/boringssl/src/crypto/cpu_ppc64le.c",
- "third_party/boringssl/src/crypto/crypto.c",
- "third_party/boringssl/src/crypto/curve25519/curve25519.c",
- "third_party/boringssl/src/crypto/curve25519/spake25519.c",
- "third_party/boringssl/src/crypto/des/des.c",
- "third_party/boringssl/src/crypto/dh_extra/dh_asn1.c",
- "third_party/boringssl/src/crypto/dh_extra/params.c",
- "third_party/boringssl/src/crypto/digest_extra/digest_extra.c",
- "third_party/boringssl/src/crypto/dsa/dsa.c",
- "third_party/boringssl/src/crypto/dsa/dsa_asn1.c",
- "third_party/boringssl/src/crypto/ec_extra/ec_asn1.c",
- "third_party/boringssl/src/crypto/ec_extra/ec_derive.c",
- "third_party/boringssl/src/crypto/ec_extra/hash_to_curve.c",
- "third_party/boringssl/src/crypto/ecdh_extra/ecdh_extra.c",
- "third_party/boringssl/src/crypto/ecdsa_extra/ecdsa_asn1.c",
- "third_party/boringssl/src/crypto/engine/engine.c",
- "third_party/boringssl/src/crypto/err/err.c",
- "third_party/boringssl/src/crypto/evp/evp.c",
- "third_party/boringssl/src/crypto/evp/evp_asn1.c",
- "third_party/boringssl/src/crypto/evp/evp_ctx.c",
- "third_party/boringssl/src/crypto/evp/p_dsa_asn1.c",
- "third_party/boringssl/src/crypto/evp/p_ec.c",
- "third_party/boringssl/src/crypto/evp/p_ec_asn1.c",
- "third_party/boringssl/src/crypto/evp/p_ed25519.c",
- "third_party/boringssl/src/crypto/evp/p_ed25519_asn1.c",
- "third_party/boringssl/src/crypto/evp/p_hkdf.c",
- "third_party/boringssl/src/crypto/evp/p_rsa.c",
- "third_party/boringssl/src/crypto/evp/p_rsa_asn1.c",
- "third_party/boringssl/src/crypto/evp/p_x25519.c",
- "third_party/boringssl/src/crypto/evp/p_x25519_asn1.c",
- "third_party/boringssl/src/crypto/evp/pbkdf.c",
- "third_party/boringssl/src/crypto/evp/print.c",
- "third_party/boringssl/src/crypto/evp/scrypt.c",
- "third_party/boringssl/src/crypto/evp/sign.c",
- "third_party/boringssl/src/crypto/ex_data.c",
- "third_party/boringssl/src/crypto/fipsmodule/bcm.c",
- "third_party/boringssl/src/crypto/fipsmodule/fips_shared_support.c",
- "third_party/boringssl/src/crypto/hkdf/hkdf.c",
- "third_party/boringssl/src/crypto/hpke/hpke.c",
- "third_party/boringssl/src/crypto/hrss/hrss.c",
- "third_party/boringssl/src/crypto/lhash/lhash.c",
- "third_party/boringssl/src/crypto/mem.c",
- "third_party/boringssl/src/crypto/obj/obj.c",
- "third_party/boringssl/src/crypto/obj/obj_xref.c",
- "third_party/boringssl/src/crypto/pem/pem_all.c",
- "third_party/boringssl/src/crypto/pem/pem_info.c",
- "third_party/boringssl/src/crypto/pem/pem_lib.c",
- "third_party/boringssl/src/crypto/pem/pem_oth.c",
- "third_party/boringssl/src/crypto/pem/pem_pk8.c",
- "third_party/boringssl/src/crypto/pem/pem_pkey.c",
- "third_party/boringssl/src/crypto/pem/pem_x509.c",
- "third_party/boringssl/src/crypto/pem/pem_xaux.c",
- "third_party/boringssl/src/crypto/pkcs7/pkcs7.c",
- "third_party/boringssl/src/crypto/pkcs7/pkcs7_x509.c",
- "third_party/boringssl/src/crypto/pkcs8/p5_pbev2.c",
- "third_party/boringssl/src/crypto/pkcs8/pkcs8.c",
- "third_party/boringssl/src/crypto/pkcs8/pkcs8_x509.c",
- "third_party/boringssl/src/crypto/poly1305/poly1305.c",
- "third_party/boringssl/src/crypto/poly1305/poly1305_arm.c",
- "third_party/boringssl/src/crypto/poly1305/poly1305_vec.c",
- "third_party/boringssl/src/crypto/pool/pool.c",
- "third_party/boringssl/src/crypto/rand_extra/deterministic.c",
- "third_party/boringssl/src/crypto/rand_extra/forkunsafe.c",
- "third_party/boringssl/src/crypto/rand_extra/fuchsia.c",
- "third_party/boringssl/src/crypto/rand_extra/passive.c",
- "third_party/boringssl/src/crypto/rand_extra/rand_extra.c",
- "third_party/boringssl/src/crypto/rand_extra/windows.c",
- "third_party/boringssl/src/crypto/rc4/rc4.c",
- "third_party/boringssl/src/crypto/refcount_c11.c",
- "third_party/boringssl/src/crypto/refcount_lock.c",
- "third_party/boringssl/src/crypto/rsa_extra/rsa_asn1.c",
- "third_party/boringssl/src/crypto/rsa_extra/rsa_print.c",
- "third_party/boringssl/src/crypto/siphash/siphash.c",
- "third_party/boringssl/src/crypto/stack/stack.c",
- "third_party/boringssl/src/crypto/thread.c",
- "third_party/boringssl/src/crypto/thread_none.c",
- "third_party/boringssl/src/crypto/thread_pthread.c",
- "third_party/boringssl/src/crypto/thread_win.c",
- "third_party/boringssl/src/crypto/trust_token/pmbtoken.c",
- "third_party/boringssl/src/crypto/trust_token/trust_token.c",
- "third_party/boringssl/src/crypto/trust_token/voprf.c",
- "third_party/boringssl/src/crypto/x509/a_digest.c",
- "third_party/boringssl/src/crypto/x509/a_sign.c",
- "third_party/boringssl/src/crypto/x509/a_verify.c",
- "third_party/boringssl/src/crypto/x509/algorithm.c",
- "third_party/boringssl/src/crypto/x509/asn1_gen.c",
- "third_party/boringssl/src/crypto/x509/by_dir.c",
- "third_party/boringssl/src/crypto/x509/by_file.c",
- "third_party/boringssl/src/crypto/x509/i2d_pr.c",
- "third_party/boringssl/src/crypto/x509/name_print.c",
- "third_party/boringssl/src/crypto/x509/rsa_pss.c",
- "third_party/boringssl/src/crypto/x509/t_crl.c",
- "third_party/boringssl/src/crypto/x509/t_req.c",
- "third_party/boringssl/src/crypto/x509/t_x509.c",
- "third_party/boringssl/src/crypto/x509/t_x509a.c",
- "third_party/boringssl/src/crypto/x509/x509.c",
- "third_party/boringssl/src/crypto/x509/x509_att.c",
- "third_party/boringssl/src/crypto/x509/x509_cmp.c",
- "third_party/boringssl/src/crypto/x509/x509_d2.c",
- "third_party/boringssl/src/crypto/x509/x509_def.c",
- "third_party/boringssl/src/crypto/x509/x509_ext.c",
- "third_party/boringssl/src/crypto/x509/x509_lu.c",
- "third_party/boringssl/src/crypto/x509/x509_obj.c",
- "third_party/boringssl/src/crypto/x509/x509_req.c",
- "third_party/boringssl/src/crypto/x509/x509_set.c",
- "third_party/boringssl/src/crypto/x509/x509_trs.c",
- "third_party/boringssl/src/crypto/x509/x509_txt.c",
- "third_party/boringssl/src/crypto/x509/x509_v3.c",
- "third_party/boringssl/src/crypto/x509/x509_vfy.c",
- "third_party/boringssl/src/crypto/x509/x509_vpm.c",
- "third_party/boringssl/src/crypto/x509/x509cset.c",
- "third_party/boringssl/src/crypto/x509/x509name.c",
- "third_party/boringssl/src/crypto/x509/x509rset.c",
- "third_party/boringssl/src/crypto/x509/x509spki.c",
- "third_party/boringssl/src/crypto/x509/x_algor.c",
- "third_party/boringssl/src/crypto/x509/x_all.c",
- "third_party/boringssl/src/crypto/x509/x_attrib.c",
- "third_party/boringssl/src/crypto/x509/x_crl.c",
- "third_party/boringssl/src/crypto/x509/x_exten.c",
- "third_party/boringssl/src/crypto/x509/x_info.c",
- "third_party/boringssl/src/crypto/x509/x_name.c",
- "third_party/boringssl/src/crypto/x509/x_pkey.c",
- "third_party/boringssl/src/crypto/x509/x_pubkey.c",
- "third_party/boringssl/src/crypto/x509/x_req.c",
- "third_party/boringssl/src/crypto/x509/x_sig.c",
- "third_party/boringssl/src/crypto/x509/x_spki.c",
- "third_party/boringssl/src/crypto/x509/x_val.c",
- "third_party/boringssl/src/crypto/x509/x_x509.c",
- "third_party/boringssl/src/crypto/x509/x_x509a.c",
- "third_party/boringssl/src/crypto/x509v3/pcy_cache.c",
- "third_party/boringssl/src/crypto/x509v3/pcy_data.c",
- "third_party/boringssl/src/crypto/x509v3/pcy_map.c",
- "third_party/boringssl/src/crypto/x509v3/pcy_node.c",
- "third_party/boringssl/src/crypto/x509v3/pcy_tree.c",
- "third_party/boringssl/src/crypto/x509v3/v3_akey.c",
- "third_party/boringssl/src/crypto/x509v3/v3_akeya.c",
- "third_party/boringssl/src/crypto/x509v3/v3_alt.c",
- "third_party/boringssl/src/crypto/x509v3/v3_bcons.c",
- "third_party/boringssl/src/crypto/x509v3/v3_bitst.c",
- "third_party/boringssl/src/crypto/x509v3/v3_conf.c",
- "third_party/boringssl/src/crypto/x509v3/v3_cpols.c",
- "third_party/boringssl/src/crypto/x509v3/v3_crld.c",
- "third_party/boringssl/src/crypto/x509v3/v3_enum.c",
- "third_party/boringssl/src/crypto/x509v3/v3_extku.c",
- "third_party/boringssl/src/crypto/x509v3/v3_genn.c",
- "third_party/boringssl/src/crypto/x509v3/v3_ia5.c",
- "third_party/boringssl/src/crypto/x509v3/v3_info.c",
- "third_party/boringssl/src/crypto/x509v3/v3_int.c",
- "third_party/boringssl/src/crypto/x509v3/v3_lib.c",
- "third_party/boringssl/src/crypto/x509v3/v3_ncons.c",
- "third_party/boringssl/src/crypto/x509v3/v3_ocsp.c",
- "third_party/boringssl/src/crypto/x509v3/v3_pci.c",
- "third_party/boringssl/src/crypto/x509v3/v3_pcia.c",
- "third_party/boringssl/src/crypto/x509v3/v3_pcons.c",
- "third_party/boringssl/src/crypto/x509v3/v3_pmaps.c",
- "third_party/boringssl/src/crypto/x509v3/v3_prn.c",
- "third_party/boringssl/src/crypto/x509v3/v3_purp.c",
- "third_party/boringssl/src/crypto/x509v3/v3_skey.c",
- "third_party/boringssl/src/crypto/x509v3/v3_utl.c",
- "third_party/boringssl/src/ssl/bio_ssl.cc",
- "third_party/boringssl/src/ssl/d1_both.cc",
- "third_party/boringssl/src/ssl/d1_lib.cc",
- "third_party/boringssl/src/ssl/d1_pkt.cc",
- "third_party/boringssl/src/ssl/d1_srtp.cc",
- "third_party/boringssl/src/ssl/dtls_method.cc",
- "third_party/boringssl/src/ssl/dtls_record.cc",
- "third_party/boringssl/src/ssl/encrypted_client_hello.cc",
- "third_party/boringssl/src/ssl/extensions.cc",
- "third_party/boringssl/src/ssl/handoff.cc",
- "third_party/boringssl/src/ssl/handshake.cc",
- "third_party/boringssl/src/ssl/handshake_client.cc",
- "third_party/boringssl/src/ssl/handshake_server.cc",
- "third_party/boringssl/src/ssl/s3_both.cc",
- "third_party/boringssl/src/ssl/s3_lib.cc",
- "third_party/boringssl/src/ssl/s3_pkt.cc",
- "third_party/boringssl/src/ssl/ssl_aead_ctx.cc",
- "third_party/boringssl/src/ssl/ssl_asn1.cc",
- "third_party/boringssl/src/ssl/ssl_buffer.cc",
- "third_party/boringssl/src/ssl/ssl_cert.cc",
- "third_party/boringssl/src/ssl/ssl_cipher.cc",
- "third_party/boringssl/src/ssl/ssl_file.cc",
- "third_party/boringssl/src/ssl/ssl_key_share.cc",
- "third_party/boringssl/src/ssl/ssl_lib.cc",
- "third_party/boringssl/src/ssl/ssl_privkey.cc",
- "third_party/boringssl/src/ssl/ssl_session.cc",
- "third_party/boringssl/src/ssl/ssl_stat.cc",
- "third_party/boringssl/src/ssl/ssl_transcript.cc",
- "third_party/boringssl/src/ssl/ssl_versions.cc",
- "third_party/boringssl/src/ssl/ssl_x509.cc",
- "third_party/boringssl/src/ssl/t1_enc.cc",
- "third_party/boringssl/src/ssl/tls13_both.cc",
- "third_party/boringssl/src/ssl/tls13_client.cc",
- "third_party/boringssl/src/ssl/tls13_enc.cc",
- "third_party/boringssl/src/ssl/tls13_server.cc",
- "third_party/boringssl/src/ssl/tls_method.cc",
- "third_party/boringssl/src/ssl/tls_record.cc",
- ],
- static_libs: [
- "cronet_aml_third_party_boringssl_boringssl_asm",
- ],
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DBORINGSSL_ALLOW_CXX_RUNTIME",
- "-DBORINGSSL_IMPLEMENTATION",
- "-DBORINGSSL_NO_STATIC_INITIALIZER",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DHAVE_SYS_UIO_H",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-DOPENSSL_SMALL",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-Oz",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "third_party/boringssl/src/include/",
- ],
- cpp_std: "c++17",
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- ],
- target: {
- android_arm: {
- cflags: [
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-fstack-protector",
- "-msse3",
- ],
- },
- },
-}
-
-// GN: //third_party/boringssl:boringssl__testing
-cc_library_static {
- name: "cronet_aml_third_party_boringssl_boringssl__testing",
- srcs: [
- "third_party/boringssl/err_data.c",
- "third_party/boringssl/src/crypto/asn1/a_bitstr.c",
- "third_party/boringssl/src/crypto/asn1/a_bool.c",
- "third_party/boringssl/src/crypto/asn1/a_d2i_fp.c",
- "third_party/boringssl/src/crypto/asn1/a_dup.c",
- "third_party/boringssl/src/crypto/asn1/a_gentm.c",
- "third_party/boringssl/src/crypto/asn1/a_i2d_fp.c",
- "third_party/boringssl/src/crypto/asn1/a_int.c",
- "third_party/boringssl/src/crypto/asn1/a_mbstr.c",
- "third_party/boringssl/src/crypto/asn1/a_object.c",
- "third_party/boringssl/src/crypto/asn1/a_octet.c",
- "third_party/boringssl/src/crypto/asn1/a_print.c",
- "third_party/boringssl/src/crypto/asn1/a_strex.c",
- "third_party/boringssl/src/crypto/asn1/a_strnid.c",
- "third_party/boringssl/src/crypto/asn1/a_time.c",
- "third_party/boringssl/src/crypto/asn1/a_type.c",
- "third_party/boringssl/src/crypto/asn1/a_utctm.c",
- "third_party/boringssl/src/crypto/asn1/a_utf8.c",
- "third_party/boringssl/src/crypto/asn1/asn1_lib.c",
- "third_party/boringssl/src/crypto/asn1/asn1_par.c",
- "third_party/boringssl/src/crypto/asn1/asn_pack.c",
- "third_party/boringssl/src/crypto/asn1/f_int.c",
- "third_party/boringssl/src/crypto/asn1/f_string.c",
- "third_party/boringssl/src/crypto/asn1/posix_time.c",
- "third_party/boringssl/src/crypto/asn1/tasn_dec.c",
- "third_party/boringssl/src/crypto/asn1/tasn_enc.c",
- "third_party/boringssl/src/crypto/asn1/tasn_fre.c",
- "third_party/boringssl/src/crypto/asn1/tasn_new.c",
- "third_party/boringssl/src/crypto/asn1/tasn_typ.c",
- "third_party/boringssl/src/crypto/asn1/tasn_utl.c",
- "third_party/boringssl/src/crypto/base64/base64.c",
- "third_party/boringssl/src/crypto/bio/bio.c",
- "third_party/boringssl/src/crypto/bio/bio_mem.c",
- "third_party/boringssl/src/crypto/bio/connect.c",
- "third_party/boringssl/src/crypto/bio/fd.c",
- "third_party/boringssl/src/crypto/bio/file.c",
- "third_party/boringssl/src/crypto/bio/hexdump.c",
- "third_party/boringssl/src/crypto/bio/pair.c",
- "third_party/boringssl/src/crypto/bio/printf.c",
- "third_party/boringssl/src/crypto/bio/socket.c",
- "third_party/boringssl/src/crypto/bio/socket_helper.c",
- "third_party/boringssl/src/crypto/blake2/blake2.c",
- "third_party/boringssl/src/crypto/bn_extra/bn_asn1.c",
- "third_party/boringssl/src/crypto/bn_extra/convert.c",
- "third_party/boringssl/src/crypto/buf/buf.c",
- "third_party/boringssl/src/crypto/bytestring/asn1_compat.c",
- "third_party/boringssl/src/crypto/bytestring/ber.c",
- "third_party/boringssl/src/crypto/bytestring/cbb.c",
- "third_party/boringssl/src/crypto/bytestring/cbs.c",
- "third_party/boringssl/src/crypto/bytestring/unicode.c",
- "third_party/boringssl/src/crypto/chacha/chacha.c",
- "third_party/boringssl/src/crypto/cipher_extra/cipher_extra.c",
- "third_party/boringssl/src/crypto/cipher_extra/derive_key.c",
- "third_party/boringssl/src/crypto/cipher_extra/e_aesctrhmac.c",
- "third_party/boringssl/src/crypto/cipher_extra/e_aesgcmsiv.c",
- "third_party/boringssl/src/crypto/cipher_extra/e_chacha20poly1305.c",
- "third_party/boringssl/src/crypto/cipher_extra/e_des.c",
- "third_party/boringssl/src/crypto/cipher_extra/e_null.c",
- "third_party/boringssl/src/crypto/cipher_extra/e_rc2.c",
- "third_party/boringssl/src/crypto/cipher_extra/e_rc4.c",
- "third_party/boringssl/src/crypto/cipher_extra/e_tls.c",
- "third_party/boringssl/src/crypto/cipher_extra/tls_cbc.c",
- "third_party/boringssl/src/crypto/conf/conf.c",
- "third_party/boringssl/src/crypto/cpu_aarch64_apple.c",
- "third_party/boringssl/src/crypto/cpu_aarch64_fuchsia.c",
- "third_party/boringssl/src/crypto/cpu_aarch64_linux.c",
- "third_party/boringssl/src/crypto/cpu_aarch64_win.c",
- "third_party/boringssl/src/crypto/cpu_arm.c",
- "third_party/boringssl/src/crypto/cpu_arm_linux.c",
- "third_party/boringssl/src/crypto/cpu_intel.c",
- "third_party/boringssl/src/crypto/cpu_ppc64le.c",
- "third_party/boringssl/src/crypto/crypto.c",
- "third_party/boringssl/src/crypto/curve25519/curve25519.c",
- "third_party/boringssl/src/crypto/curve25519/spake25519.c",
- "third_party/boringssl/src/crypto/des/des.c",
- "third_party/boringssl/src/crypto/dh_extra/dh_asn1.c",
- "third_party/boringssl/src/crypto/dh_extra/params.c",
- "third_party/boringssl/src/crypto/digest_extra/digest_extra.c",
- "third_party/boringssl/src/crypto/dsa/dsa.c",
- "third_party/boringssl/src/crypto/dsa/dsa_asn1.c",
- "third_party/boringssl/src/crypto/ec_extra/ec_asn1.c",
- "third_party/boringssl/src/crypto/ec_extra/ec_derive.c",
- "third_party/boringssl/src/crypto/ec_extra/hash_to_curve.c",
- "third_party/boringssl/src/crypto/ecdh_extra/ecdh_extra.c",
- "third_party/boringssl/src/crypto/ecdsa_extra/ecdsa_asn1.c",
- "third_party/boringssl/src/crypto/engine/engine.c",
- "third_party/boringssl/src/crypto/err/err.c",
- "third_party/boringssl/src/crypto/evp/evp.c",
- "third_party/boringssl/src/crypto/evp/evp_asn1.c",
- "third_party/boringssl/src/crypto/evp/evp_ctx.c",
- "third_party/boringssl/src/crypto/evp/p_dsa_asn1.c",
- "third_party/boringssl/src/crypto/evp/p_ec.c",
- "third_party/boringssl/src/crypto/evp/p_ec_asn1.c",
- "third_party/boringssl/src/crypto/evp/p_ed25519.c",
- "third_party/boringssl/src/crypto/evp/p_ed25519_asn1.c",
- "third_party/boringssl/src/crypto/evp/p_hkdf.c",
- "third_party/boringssl/src/crypto/evp/p_rsa.c",
- "third_party/boringssl/src/crypto/evp/p_rsa_asn1.c",
- "third_party/boringssl/src/crypto/evp/p_x25519.c",
- "third_party/boringssl/src/crypto/evp/p_x25519_asn1.c",
- "third_party/boringssl/src/crypto/evp/pbkdf.c",
- "third_party/boringssl/src/crypto/evp/print.c",
- "third_party/boringssl/src/crypto/evp/scrypt.c",
- "third_party/boringssl/src/crypto/evp/sign.c",
- "third_party/boringssl/src/crypto/ex_data.c",
- "third_party/boringssl/src/crypto/fipsmodule/bcm.c",
- "third_party/boringssl/src/crypto/fipsmodule/fips_shared_support.c",
- "third_party/boringssl/src/crypto/hkdf/hkdf.c",
- "third_party/boringssl/src/crypto/hpke/hpke.c",
- "third_party/boringssl/src/crypto/hrss/hrss.c",
- "third_party/boringssl/src/crypto/lhash/lhash.c",
- "third_party/boringssl/src/crypto/mem.c",
- "third_party/boringssl/src/crypto/obj/obj.c",
- "third_party/boringssl/src/crypto/obj/obj_xref.c",
- "third_party/boringssl/src/crypto/pem/pem_all.c",
- "third_party/boringssl/src/crypto/pem/pem_info.c",
- "third_party/boringssl/src/crypto/pem/pem_lib.c",
- "third_party/boringssl/src/crypto/pem/pem_oth.c",
- "third_party/boringssl/src/crypto/pem/pem_pk8.c",
- "third_party/boringssl/src/crypto/pem/pem_pkey.c",
- "third_party/boringssl/src/crypto/pem/pem_x509.c",
- "third_party/boringssl/src/crypto/pem/pem_xaux.c",
- "third_party/boringssl/src/crypto/pkcs7/pkcs7.c",
- "third_party/boringssl/src/crypto/pkcs7/pkcs7_x509.c",
- "third_party/boringssl/src/crypto/pkcs8/p5_pbev2.c",
- "third_party/boringssl/src/crypto/pkcs8/pkcs8.c",
- "third_party/boringssl/src/crypto/pkcs8/pkcs8_x509.c",
- "third_party/boringssl/src/crypto/poly1305/poly1305.c",
- "third_party/boringssl/src/crypto/poly1305/poly1305_arm.c",
- "third_party/boringssl/src/crypto/poly1305/poly1305_vec.c",
- "third_party/boringssl/src/crypto/pool/pool.c",
- "third_party/boringssl/src/crypto/rand_extra/deterministic.c",
- "third_party/boringssl/src/crypto/rand_extra/forkunsafe.c",
- "third_party/boringssl/src/crypto/rand_extra/fuchsia.c",
- "third_party/boringssl/src/crypto/rand_extra/passive.c",
- "third_party/boringssl/src/crypto/rand_extra/rand_extra.c",
- "third_party/boringssl/src/crypto/rand_extra/windows.c",
- "third_party/boringssl/src/crypto/rc4/rc4.c",
- "third_party/boringssl/src/crypto/refcount_c11.c",
- "third_party/boringssl/src/crypto/refcount_lock.c",
- "third_party/boringssl/src/crypto/rsa_extra/rsa_asn1.c",
- "third_party/boringssl/src/crypto/rsa_extra/rsa_print.c",
- "third_party/boringssl/src/crypto/siphash/siphash.c",
- "third_party/boringssl/src/crypto/stack/stack.c",
- "third_party/boringssl/src/crypto/thread.c",
- "third_party/boringssl/src/crypto/thread_none.c",
- "third_party/boringssl/src/crypto/thread_pthread.c",
- "third_party/boringssl/src/crypto/thread_win.c",
- "third_party/boringssl/src/crypto/trust_token/pmbtoken.c",
- "third_party/boringssl/src/crypto/trust_token/trust_token.c",
- "third_party/boringssl/src/crypto/trust_token/voprf.c",
- "third_party/boringssl/src/crypto/x509/a_digest.c",
- "third_party/boringssl/src/crypto/x509/a_sign.c",
- "third_party/boringssl/src/crypto/x509/a_verify.c",
- "third_party/boringssl/src/crypto/x509/algorithm.c",
- "third_party/boringssl/src/crypto/x509/asn1_gen.c",
- "third_party/boringssl/src/crypto/x509/by_dir.c",
- "third_party/boringssl/src/crypto/x509/by_file.c",
- "third_party/boringssl/src/crypto/x509/i2d_pr.c",
- "third_party/boringssl/src/crypto/x509/name_print.c",
- "third_party/boringssl/src/crypto/x509/rsa_pss.c",
- "third_party/boringssl/src/crypto/x509/t_crl.c",
- "third_party/boringssl/src/crypto/x509/t_req.c",
- "third_party/boringssl/src/crypto/x509/t_x509.c",
- "third_party/boringssl/src/crypto/x509/t_x509a.c",
- "third_party/boringssl/src/crypto/x509/x509.c",
- "third_party/boringssl/src/crypto/x509/x509_att.c",
- "third_party/boringssl/src/crypto/x509/x509_cmp.c",
- "third_party/boringssl/src/crypto/x509/x509_d2.c",
- "third_party/boringssl/src/crypto/x509/x509_def.c",
- "third_party/boringssl/src/crypto/x509/x509_ext.c",
- "third_party/boringssl/src/crypto/x509/x509_lu.c",
- "third_party/boringssl/src/crypto/x509/x509_obj.c",
- "third_party/boringssl/src/crypto/x509/x509_req.c",
- "third_party/boringssl/src/crypto/x509/x509_set.c",
- "third_party/boringssl/src/crypto/x509/x509_trs.c",
- "third_party/boringssl/src/crypto/x509/x509_txt.c",
- "third_party/boringssl/src/crypto/x509/x509_v3.c",
- "third_party/boringssl/src/crypto/x509/x509_vfy.c",
- "third_party/boringssl/src/crypto/x509/x509_vpm.c",
- "third_party/boringssl/src/crypto/x509/x509cset.c",
- "third_party/boringssl/src/crypto/x509/x509name.c",
- "third_party/boringssl/src/crypto/x509/x509rset.c",
- "third_party/boringssl/src/crypto/x509/x509spki.c",
- "third_party/boringssl/src/crypto/x509/x_algor.c",
- "third_party/boringssl/src/crypto/x509/x_all.c",
- "third_party/boringssl/src/crypto/x509/x_attrib.c",
- "third_party/boringssl/src/crypto/x509/x_crl.c",
- "third_party/boringssl/src/crypto/x509/x_exten.c",
- "third_party/boringssl/src/crypto/x509/x_info.c",
- "third_party/boringssl/src/crypto/x509/x_name.c",
- "third_party/boringssl/src/crypto/x509/x_pkey.c",
- "third_party/boringssl/src/crypto/x509/x_pubkey.c",
- "third_party/boringssl/src/crypto/x509/x_req.c",
- "third_party/boringssl/src/crypto/x509/x_sig.c",
- "third_party/boringssl/src/crypto/x509/x_spki.c",
- "third_party/boringssl/src/crypto/x509/x_val.c",
- "third_party/boringssl/src/crypto/x509/x_x509.c",
- "third_party/boringssl/src/crypto/x509/x_x509a.c",
- "third_party/boringssl/src/crypto/x509v3/pcy_cache.c",
- "third_party/boringssl/src/crypto/x509v3/pcy_data.c",
- "third_party/boringssl/src/crypto/x509v3/pcy_map.c",
- "third_party/boringssl/src/crypto/x509v3/pcy_node.c",
- "third_party/boringssl/src/crypto/x509v3/pcy_tree.c",
- "third_party/boringssl/src/crypto/x509v3/v3_akey.c",
- "third_party/boringssl/src/crypto/x509v3/v3_akeya.c",
- "third_party/boringssl/src/crypto/x509v3/v3_alt.c",
- "third_party/boringssl/src/crypto/x509v3/v3_bcons.c",
- "third_party/boringssl/src/crypto/x509v3/v3_bitst.c",
- "third_party/boringssl/src/crypto/x509v3/v3_conf.c",
- "third_party/boringssl/src/crypto/x509v3/v3_cpols.c",
- "third_party/boringssl/src/crypto/x509v3/v3_crld.c",
- "third_party/boringssl/src/crypto/x509v3/v3_enum.c",
- "third_party/boringssl/src/crypto/x509v3/v3_extku.c",
- "third_party/boringssl/src/crypto/x509v3/v3_genn.c",
- "third_party/boringssl/src/crypto/x509v3/v3_ia5.c",
- "third_party/boringssl/src/crypto/x509v3/v3_info.c",
- "third_party/boringssl/src/crypto/x509v3/v3_int.c",
- "third_party/boringssl/src/crypto/x509v3/v3_lib.c",
- "third_party/boringssl/src/crypto/x509v3/v3_ncons.c",
- "third_party/boringssl/src/crypto/x509v3/v3_ocsp.c",
- "third_party/boringssl/src/crypto/x509v3/v3_pci.c",
- "third_party/boringssl/src/crypto/x509v3/v3_pcia.c",
- "third_party/boringssl/src/crypto/x509v3/v3_pcons.c",
- "third_party/boringssl/src/crypto/x509v3/v3_pmaps.c",
- "third_party/boringssl/src/crypto/x509v3/v3_prn.c",
- "third_party/boringssl/src/crypto/x509v3/v3_purp.c",
- "third_party/boringssl/src/crypto/x509v3/v3_skey.c",
- "third_party/boringssl/src/crypto/x509v3/v3_utl.c",
- "third_party/boringssl/src/ssl/bio_ssl.cc",
- "third_party/boringssl/src/ssl/d1_both.cc",
- "third_party/boringssl/src/ssl/d1_lib.cc",
- "third_party/boringssl/src/ssl/d1_pkt.cc",
- "third_party/boringssl/src/ssl/d1_srtp.cc",
- "third_party/boringssl/src/ssl/dtls_method.cc",
- "third_party/boringssl/src/ssl/dtls_record.cc",
- "third_party/boringssl/src/ssl/encrypted_client_hello.cc",
- "third_party/boringssl/src/ssl/extensions.cc",
- "third_party/boringssl/src/ssl/handoff.cc",
- "third_party/boringssl/src/ssl/handshake.cc",
- "third_party/boringssl/src/ssl/handshake_client.cc",
- "third_party/boringssl/src/ssl/handshake_server.cc",
- "third_party/boringssl/src/ssl/s3_both.cc",
- "third_party/boringssl/src/ssl/s3_lib.cc",
- "third_party/boringssl/src/ssl/s3_pkt.cc",
- "third_party/boringssl/src/ssl/ssl_aead_ctx.cc",
- "third_party/boringssl/src/ssl/ssl_asn1.cc",
- "third_party/boringssl/src/ssl/ssl_buffer.cc",
- "third_party/boringssl/src/ssl/ssl_cert.cc",
- "third_party/boringssl/src/ssl/ssl_cipher.cc",
- "third_party/boringssl/src/ssl/ssl_file.cc",
- "third_party/boringssl/src/ssl/ssl_key_share.cc",
- "third_party/boringssl/src/ssl/ssl_lib.cc",
- "third_party/boringssl/src/ssl/ssl_privkey.cc",
- "third_party/boringssl/src/ssl/ssl_session.cc",
- "third_party/boringssl/src/ssl/ssl_stat.cc",
- "third_party/boringssl/src/ssl/ssl_transcript.cc",
- "third_party/boringssl/src/ssl/ssl_versions.cc",
- "third_party/boringssl/src/ssl/ssl_x509.cc",
- "third_party/boringssl/src/ssl/t1_enc.cc",
- "third_party/boringssl/src/ssl/tls13_both.cc",
- "third_party/boringssl/src/ssl/tls13_client.cc",
- "third_party/boringssl/src/ssl/tls13_enc.cc",
- "third_party/boringssl/src/ssl/tls13_server.cc",
- "third_party/boringssl/src/ssl/tls_method.cc",
- "third_party/boringssl/src/ssl/tls_record.cc",
- ],
- static_libs: [
- "cronet_aml_third_party_boringssl_boringssl_asm__testing",
- ],
- host_supported: true,
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DBORINGSSL_ALLOW_CXX_RUNTIME",
- "-DBORINGSSL_IMPLEMENTATION",
- "-DBORINGSSL_NO_STATIC_INITIALIZER",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-DOPENSSL_SMALL",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "third_party/boringssl/src/include/",
- ],
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- ],
- target: {
- android_arm: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- "-msse3",
- ],
- },
- host: {
- cflags: [
- "-DCR_SYSROOT_KEY=20220331T153654Z-0",
- "-DUSE_AURA=1",
- "-DUSE_OZONE=1",
- "-DUSE_UDEV",
- "-D_FILE_OFFSET_BITS=64",
- "-D_LARGEFILE64_SOURCE",
- "-D_LARGEFILE_SOURCE",
- "-O2",
- "-fstack-protector",
- "-msse3",
- ],
- compile_multilib: "64",
- },
- },
-}
-
-// GN: //third_party/boringssl:boringssl_asm
-cc_library_static {
- name: "cronet_aml_third_party_boringssl_boringssl_asm",
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DHAVE_SYS_UIO_H",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_FORTIFY_SOURCE=2",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D__STDC_CONSTANT_MACROS",
- "-D__STDC_FORMAT_MACROS",
- "-Oz",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "third_party/boringssl/src/include/",
- ],
- cpp_std: "c++17",
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- ],
- target: {
- android_arm: {
- srcs: [
- "third_party/boringssl/linux-arm/crypto/chacha/chacha-armv4.S",
- "third_party/boringssl/linux-arm/crypto/fipsmodule/aesv8-armx32.S",
- "third_party/boringssl/linux-arm/crypto/fipsmodule/armv4-mont.S",
- "third_party/boringssl/linux-arm/crypto/fipsmodule/bsaes-armv7.S",
- "third_party/boringssl/linux-arm/crypto/fipsmodule/ghash-armv4.S",
- "third_party/boringssl/linux-arm/crypto/fipsmodule/ghashv8-armx32.S",
- "third_party/boringssl/linux-arm/crypto/fipsmodule/sha1-armv4-large.S",
- "third_party/boringssl/linux-arm/crypto/fipsmodule/sha256-armv4.S",
- "third_party/boringssl/linux-arm/crypto/fipsmodule/sha512-armv4.S",
- "third_party/boringssl/linux-arm/crypto/fipsmodule/vpaes-armv7.S",
- "third_party/boringssl/linux-arm/crypto/test/trampoline-armv4.S",
- "third_party/boringssl/src/crypto/curve25519/asm/x25519-asm-arm.S",
- "third_party/boringssl/src/crypto/poly1305/poly1305_arm_asm.S",
- ],
- cflags: [
- "-fstack-protector",
- ],
- },
- android_arm64: {
- srcs: [
- "third_party/boringssl/linux-aarch64/crypto/chacha/chacha-armv8.S",
- "third_party/boringssl/linux-aarch64/crypto/cipher_extra/chacha20_poly1305_armv8.S",
- "third_party/boringssl/linux-aarch64/crypto/fipsmodule/aesv8-armx64.S",
- "third_party/boringssl/linux-aarch64/crypto/fipsmodule/armv8-mont.S",
- "third_party/boringssl/linux-aarch64/crypto/fipsmodule/ghash-neon-armv8.S",
- "third_party/boringssl/linux-aarch64/crypto/fipsmodule/ghashv8-armx64.S",
- "third_party/boringssl/linux-aarch64/crypto/fipsmodule/p256-armv8-asm.S",
- "third_party/boringssl/linux-aarch64/crypto/fipsmodule/p256_beeu-armv8-asm.S",
- "third_party/boringssl/linux-aarch64/crypto/fipsmodule/sha1-armv8.S",
- "third_party/boringssl/linux-aarch64/crypto/fipsmodule/sha256-armv8.S",
- "third_party/boringssl/linux-aarch64/crypto/fipsmodule/sha512-armv8.S",
- "third_party/boringssl/linux-aarch64/crypto/fipsmodule/vpaes-armv8.S",
- "third_party/boringssl/linux-aarch64/crypto/test/trampoline-armv8.S",
- ],
- cflags: [
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- srcs: [
- "third_party/boringssl/linux-x86/crypto/chacha/chacha-x86.S",
- "third_party/boringssl/linux-x86/crypto/fipsmodule/aesni-x86.S",
- "third_party/boringssl/linux-x86/crypto/fipsmodule/bn-586.S",
- "third_party/boringssl/linux-x86/crypto/fipsmodule/co-586.S",
- "third_party/boringssl/linux-x86/crypto/fipsmodule/ghash-ssse3-x86.S",
- "third_party/boringssl/linux-x86/crypto/fipsmodule/ghash-x86.S",
- "third_party/boringssl/linux-x86/crypto/fipsmodule/md5-586.S",
- "third_party/boringssl/linux-x86/crypto/fipsmodule/sha1-586.S",
- "third_party/boringssl/linux-x86/crypto/fipsmodule/sha256-586.S",
- "third_party/boringssl/linux-x86/crypto/fipsmodule/sha512-586.S",
- "third_party/boringssl/linux-x86/crypto/fipsmodule/vpaes-x86.S",
- "third_party/boringssl/linux-x86/crypto/fipsmodule/x86-mont.S",
- "third_party/boringssl/linux-x86/crypto/test/trampoline-x86.S",
- ],
- cflags: [
- "-msse3",
- ],
- },
- android_x86_64: {
- srcs: [
- "third_party/boringssl/linux-x86_64/crypto/chacha/chacha-x86_64.S",
- "third_party/boringssl/linux-x86_64/crypto/cipher_extra/aes128gcmsiv-x86_64.S",
- "third_party/boringssl/linux-x86_64/crypto/cipher_extra/chacha20_poly1305_x86_64.S",
- "third_party/boringssl/linux-x86_64/crypto/fipsmodule/aesni-gcm-x86_64.S",
- "third_party/boringssl/linux-x86_64/crypto/fipsmodule/aesni-x86_64.S",
- "third_party/boringssl/linux-x86_64/crypto/fipsmodule/ghash-ssse3-x86_64.S",
- "third_party/boringssl/linux-x86_64/crypto/fipsmodule/ghash-x86_64.S",
- "third_party/boringssl/linux-x86_64/crypto/fipsmodule/md5-x86_64.S",
- "third_party/boringssl/linux-x86_64/crypto/fipsmodule/p256-x86_64-asm.S",
- "third_party/boringssl/linux-x86_64/crypto/fipsmodule/p256_beeu-x86_64-asm.S",
- "third_party/boringssl/linux-x86_64/crypto/fipsmodule/rdrand-x86_64.S",
- "third_party/boringssl/linux-x86_64/crypto/fipsmodule/rsaz-avx2.S",
- "third_party/boringssl/linux-x86_64/crypto/fipsmodule/sha1-x86_64.S",
- "third_party/boringssl/linux-x86_64/crypto/fipsmodule/sha256-x86_64.S",
- "third_party/boringssl/linux-x86_64/crypto/fipsmodule/sha512-x86_64.S",
- "third_party/boringssl/linux-x86_64/crypto/fipsmodule/vpaes-x86_64.S",
- "third_party/boringssl/linux-x86_64/crypto/fipsmodule/x86_64-mont.S",
- "third_party/boringssl/linux-x86_64/crypto/fipsmodule/x86_64-mont5.S",
- "third_party/boringssl/linux-x86_64/crypto/test/trampoline-x86_64.S",
- "third_party/boringssl/src/crypto/hrss/asm/poly_rq_mul.S",
- ],
- cflags: [
- "-fstack-protector",
- "-msse3",
- ],
- },
- },
-}
-
-// GN: //third_party/boringssl:boringssl_asm__testing
-cc_library_static {
- name: "cronet_aml_third_party_boringssl_boringssl_asm__testing",
- host_supported: true,
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_FORTIFY_SOURCE=2",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D__STDC_CONSTANT_MACROS",
- "-D__STDC_FORMAT_MACROS",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "third_party/boringssl/src/include/",
- ],
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- ],
- target: {
- android_arm: {
- srcs: [
- "third_party/boringssl/linux-arm/crypto/chacha/chacha-armv4.S",
- "third_party/boringssl/linux-arm/crypto/fipsmodule/aesv8-armx32.S",
- "third_party/boringssl/linux-arm/crypto/fipsmodule/armv4-mont.S",
- "third_party/boringssl/linux-arm/crypto/fipsmodule/bsaes-armv7.S",
- "third_party/boringssl/linux-arm/crypto/fipsmodule/ghash-armv4.S",
- "third_party/boringssl/linux-arm/crypto/fipsmodule/ghashv8-armx32.S",
- "third_party/boringssl/linux-arm/crypto/fipsmodule/sha1-armv4-large.S",
- "third_party/boringssl/linux-arm/crypto/fipsmodule/sha256-armv4.S",
- "third_party/boringssl/linux-arm/crypto/fipsmodule/sha512-armv4.S",
- "third_party/boringssl/linux-arm/crypto/fipsmodule/vpaes-armv7.S",
- "third_party/boringssl/linux-arm/crypto/test/trampoline-armv4.S",
- "third_party/boringssl/src/crypto/curve25519/asm/x25519-asm-arm.S",
- "third_party/boringssl/src/crypto/poly1305/poly1305_arm_asm.S",
- ],
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- ],
- },
- android_arm64: {
- srcs: [
- "third_party/boringssl/linux-aarch64/crypto/chacha/chacha-armv8.S",
- "third_party/boringssl/linux-aarch64/crypto/cipher_extra/chacha20_poly1305_armv8.S",
- "third_party/boringssl/linux-aarch64/crypto/fipsmodule/aesv8-armx64.S",
- "third_party/boringssl/linux-aarch64/crypto/fipsmodule/armv8-mont.S",
- "third_party/boringssl/linux-aarch64/crypto/fipsmodule/ghash-neon-armv8.S",
- "third_party/boringssl/linux-aarch64/crypto/fipsmodule/ghashv8-armx64.S",
- "third_party/boringssl/linux-aarch64/crypto/fipsmodule/p256-armv8-asm.S",
- "third_party/boringssl/linux-aarch64/crypto/fipsmodule/p256_beeu-armv8-asm.S",
- "third_party/boringssl/linux-aarch64/crypto/fipsmodule/sha1-armv8.S",
- "third_party/boringssl/linux-aarch64/crypto/fipsmodule/sha256-armv8.S",
- "third_party/boringssl/linux-aarch64/crypto/fipsmodule/sha512-armv8.S",
- "third_party/boringssl/linux-aarch64/crypto/fipsmodule/vpaes-armv8.S",
- "third_party/boringssl/linux-aarch64/crypto/test/trampoline-armv8.S",
- ],
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- srcs: [
- "third_party/boringssl/linux-x86/crypto/chacha/chacha-x86.S",
- "third_party/boringssl/linux-x86/crypto/fipsmodule/aesni-x86.S",
- "third_party/boringssl/linux-x86/crypto/fipsmodule/bn-586.S",
- "third_party/boringssl/linux-x86/crypto/fipsmodule/co-586.S",
- "third_party/boringssl/linux-x86/crypto/fipsmodule/ghash-ssse3-x86.S",
- "third_party/boringssl/linux-x86/crypto/fipsmodule/ghash-x86.S",
- "third_party/boringssl/linux-x86/crypto/fipsmodule/md5-586.S",
- "third_party/boringssl/linux-x86/crypto/fipsmodule/sha1-586.S",
- "third_party/boringssl/linux-x86/crypto/fipsmodule/sha256-586.S",
- "third_party/boringssl/linux-x86/crypto/fipsmodule/sha512-586.S",
- "third_party/boringssl/linux-x86/crypto/fipsmodule/vpaes-x86.S",
- "third_party/boringssl/linux-x86/crypto/fipsmodule/x86-mont.S",
- "third_party/boringssl/linux-x86/crypto/test/trampoline-x86.S",
- ],
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-msse3",
- ],
- },
- android_x86_64: {
- srcs: [
- "third_party/boringssl/linux-x86_64/crypto/chacha/chacha-x86_64.S",
- "third_party/boringssl/linux-x86_64/crypto/cipher_extra/aes128gcmsiv-x86_64.S",
- "third_party/boringssl/linux-x86_64/crypto/cipher_extra/chacha20_poly1305_x86_64.S",
- "third_party/boringssl/linux-x86_64/crypto/fipsmodule/aesni-gcm-x86_64.S",
- "third_party/boringssl/linux-x86_64/crypto/fipsmodule/aesni-x86_64.S",
- "third_party/boringssl/linux-x86_64/crypto/fipsmodule/ghash-ssse3-x86_64.S",
- "third_party/boringssl/linux-x86_64/crypto/fipsmodule/ghash-x86_64.S",
- "third_party/boringssl/linux-x86_64/crypto/fipsmodule/md5-x86_64.S",
- "third_party/boringssl/linux-x86_64/crypto/fipsmodule/p256-x86_64-asm.S",
- "third_party/boringssl/linux-x86_64/crypto/fipsmodule/p256_beeu-x86_64-asm.S",
- "third_party/boringssl/linux-x86_64/crypto/fipsmodule/rdrand-x86_64.S",
- "third_party/boringssl/linux-x86_64/crypto/fipsmodule/rsaz-avx2.S",
- "third_party/boringssl/linux-x86_64/crypto/fipsmodule/sha1-x86_64.S",
- "third_party/boringssl/linux-x86_64/crypto/fipsmodule/sha256-x86_64.S",
- "third_party/boringssl/linux-x86_64/crypto/fipsmodule/sha512-x86_64.S",
- "third_party/boringssl/linux-x86_64/crypto/fipsmodule/vpaes-x86_64.S",
- "third_party/boringssl/linux-x86_64/crypto/fipsmodule/x86_64-mont.S",
- "third_party/boringssl/linux-x86_64/crypto/fipsmodule/x86_64-mont5.S",
- "third_party/boringssl/linux-x86_64/crypto/test/trampoline-x86_64.S",
- "third_party/boringssl/src/crypto/hrss/asm/poly_rq_mul.S",
- ],
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- "-msse3",
- ],
- },
- host: {
- srcs: [
- "third_party/boringssl/linux-x86_64/crypto/chacha/chacha-x86_64.S",
- "third_party/boringssl/linux-x86_64/crypto/cipher_extra/aes128gcmsiv-x86_64.S",
- "third_party/boringssl/linux-x86_64/crypto/cipher_extra/chacha20_poly1305_x86_64.S",
- "third_party/boringssl/linux-x86_64/crypto/fipsmodule/aesni-gcm-x86_64.S",
- "third_party/boringssl/linux-x86_64/crypto/fipsmodule/aesni-x86_64.S",
- "third_party/boringssl/linux-x86_64/crypto/fipsmodule/ghash-ssse3-x86_64.S",
- "third_party/boringssl/linux-x86_64/crypto/fipsmodule/ghash-x86_64.S",
- "third_party/boringssl/linux-x86_64/crypto/fipsmodule/md5-x86_64.S",
- "third_party/boringssl/linux-x86_64/crypto/fipsmodule/p256-x86_64-asm.S",
- "third_party/boringssl/linux-x86_64/crypto/fipsmodule/p256_beeu-x86_64-asm.S",
- "third_party/boringssl/linux-x86_64/crypto/fipsmodule/rdrand-x86_64.S",
- "third_party/boringssl/linux-x86_64/crypto/fipsmodule/rsaz-avx2.S",
- "third_party/boringssl/linux-x86_64/crypto/fipsmodule/sha1-x86_64.S",
- "third_party/boringssl/linux-x86_64/crypto/fipsmodule/sha256-x86_64.S",
- "third_party/boringssl/linux-x86_64/crypto/fipsmodule/sha512-x86_64.S",
- "third_party/boringssl/linux-x86_64/crypto/fipsmodule/vpaes-x86_64.S",
- "third_party/boringssl/linux-x86_64/crypto/fipsmodule/x86_64-mont.S",
- "third_party/boringssl/linux-x86_64/crypto/fipsmodule/x86_64-mont5.S",
- "third_party/boringssl/linux-x86_64/crypto/test/trampoline-x86_64.S",
- "third_party/boringssl/src/crypto/hrss/asm/poly_rq_mul.S",
- ],
- cflags: [
- "-DCR_SYSROOT_KEY=20220331T153654Z-0",
- "-DUSE_AURA=1",
- "-DUSE_OZONE=1",
- "-DUSE_UDEV",
- "-D_FILE_OFFSET_BITS=64",
- "-D_LARGEFILE64_SOURCE",
- "-D_LARGEFILE_SOURCE",
- "-O2",
- "-fstack-protector",
- "-msse3",
- ],
- compile_multilib: "64",
- },
- },
-}
-
-// GN: //third_party/brotli:common
-cc_library_static {
- name: "cronet_aml_third_party_brotli_common",
- srcs: [
- "third_party/brotli/common/constants.c",
- "third_party/brotli/common/context.c",
- "third_party/brotli/common/dictionary.c",
- "third_party/brotli/common/platform.c",
- "third_party/brotli/common/shared_dictionary.c",
- "third_party/brotli/common/transform.c",
- ],
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DHAVE_SYS_UIO_H",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_FORTIFY_SOURCE=2",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D__STDC_CONSTANT_MACROS",
- "-D__STDC_FORMAT_MACROS",
- "-Oz",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "third_party/brotli/include/",
- ],
- cpp_std: "c++17",
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- ],
- target: {
- android_arm: {
- cflags: [
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-fstack-protector",
- "-msse3",
- ],
- },
- },
-}
-
-// GN: //third_party/brotli:common__testing
-cc_library_static {
- name: "cronet_aml_third_party_brotli_common__testing",
- srcs: [
- "third_party/brotli/common/constants.c",
- "third_party/brotli/common/context.c",
- "third_party/brotli/common/dictionary.c",
- "third_party/brotli/common/platform.c",
- "third_party/brotli/common/shared_dictionary.c",
- "third_party/brotli/common/transform.c",
- ],
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DHAVE_SYS_UIO_H",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_FORTIFY_SOURCE=2",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D__STDC_CONSTANT_MACROS",
- "-D__STDC_FORMAT_MACROS",
- "-Oz",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "third_party/brotli/include/",
- ],
- cpp_std: "c++17",
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- ],
- target: {
- android_arm: {
- cflags: [
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-fstack-protector",
- "-msse3",
- ],
- },
- },
-}
-
-// GN: //third_party/brotli:dec
-cc_library_static {
- name: "cronet_aml_third_party_brotli_dec",
- srcs: [
- "third_party/brotli/dec/bit_reader.c",
- "third_party/brotli/dec/decode.c",
- "third_party/brotli/dec/huffman.c",
- "third_party/brotli/dec/state.c",
- ],
- static_libs: [
- "cronet_aml_third_party_brotli_common",
- ],
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DHAVE_SYS_UIO_H",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-O2",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "third_party/brotli/include/",
- ],
- cpp_std: "c++17",
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- ],
- target: {
- android_arm: {
- cflags: [
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-fstack-protector",
- "-msse3",
- ],
- },
- },
-}
-
-// GN: //third_party/brotli:dec__testing
-cc_library_static {
- name: "cronet_aml_third_party_brotli_dec__testing",
- srcs: [
- "third_party/brotli/dec/bit_reader.c",
- "third_party/brotli/dec/decode.c",
- "third_party/brotli/dec/huffman.c",
- "third_party/brotli/dec/state.c",
- ],
- static_libs: [
- "cronet_aml_third_party_brotli_common__testing",
- ],
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DHAVE_SYS_UIO_H",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-O2",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "third_party/brotli/include/",
- ],
- cpp_std: "c++17",
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- ],
- target: {
- android_arm: {
- cflags: [
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-fstack-protector",
- "-msse3",
- ],
- },
- },
-}
-
-// GN: //third_party/ced:ced__testing
-cc_library_static {
- name: "cronet_aml_third_party_ced_ced__testing",
- srcs: [
- "third_party/ced/src/compact_enc_det/compact_enc_det.cc",
- "third_party/ced/src/compact_enc_det/compact_enc_det_hint_code.cc",
- "third_party/ced/src/util/encodings/encodings.cc",
- "third_party/ced/src/util/languages/languages.cc",
- ],
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DCOMPILER_GCC",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DHAVE_SYS_UIO_H",
- "-DHTML5_MODE",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-Oz",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "third_party/ced/src/",
- ],
- cpp_std: "c++17",
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- ],
- target: {
- android_arm: {
- cflags: [
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-fstack-protector",
- "-msse3",
- ],
- },
- },
-}
-
-// GN: //third_party/googletest:gmock__testing
-cc_library_static {
- name: "cronet_aml_third_party_googletest_gmock__testing",
- srcs: [
- "third_party/googletest/src/googlemock/src/gmock-cardinalities.cc",
- "third_party/googletest/src/googlemock/src/gmock-internal-utils.cc",
- "third_party/googletest/src/googlemock/src/gmock-matchers.cc",
- "third_party/googletest/src/googlemock/src/gmock-spec-builders.cc",
- "third_party/googletest/src/googlemock/src/gmock.cc",
- ],
- shared_libs: [
- "libandroid",
- "liblog",
- ],
- static_libs: [
- "cronet_aml_base_allocator_partition_allocator_partition_alloc__testing",
- "cronet_aml_base_base__testing",
- "cronet_aml_base_base_static__testing",
- "cronet_aml_base_nodebug_assertion__testing",
- "cronet_aml_base_third_party_double_conversion_double_conversion__testing",
- "cronet_aml_base_third_party_dynamic_annotations_dynamic_annotations__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_base__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_log_severity__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_malloc_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_raw_logging_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_spinlock_wait__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_strerror__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_throw_delegate__testing",
- "cronet_aml_third_party_abseil_cpp_absl_container_hashtablez_sampler__testing",
- "cronet_aml_third_party_abseil_cpp_absl_container_raw_hash_set__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_debugging_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_demangle_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_examine_stack__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_failure_signal_handler__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_stacktrace__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_symbolize__testing",
- "cronet_aml_third_party_abseil_cpp_absl_hash_city__testing",
- "cronet_aml_third_party_abseil_cpp_absl_hash_hash__testing",
- "cronet_aml_third_party_abseil_cpp_absl_hash_low_level_hash__testing",
- "cronet_aml_third_party_abseil_cpp_absl_numeric_int128__testing",
- "cronet_aml_third_party_abseil_cpp_absl_profiling_exponential_biased__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_distributions__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_platform__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_pool_urbg__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_hwaes__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_hwaes_impl__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_slow__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_seed_material__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_seed_gen_exception__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_seed_sequences__testing",
- "cronet_aml_third_party_abseil_cpp_absl_status_status__testing",
- "cronet_aml_third_party_abseil_cpp_absl_status_statusor__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cord__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cord_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_functions__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_handle__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_info__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_str_format_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_strings__testing",
- "cronet_aml_third_party_abseil_cpp_absl_synchronization_graphcycles_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_synchronization_synchronization__testing",
- "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_civil_time__testing",
- "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_time_zone__testing",
- "cronet_aml_third_party_abseil_cpp_absl_time_time__testing",
- "cronet_aml_third_party_abseil_cpp_absl_types_bad_optional_access__testing",
- "cronet_aml_third_party_abseil_cpp_absl_types_bad_variant_access__testing",
- "cronet_aml_third_party_android_ndk_cpu_features__testing",
- "cronet_aml_third_party_ashmem_ashmem__testing",
- "cronet_aml_third_party_boringssl_boringssl__testing",
- "cronet_aml_third_party_boringssl_boringssl_asm__testing",
- "cronet_aml_third_party_googletest_gtest__testing",
- "cronet_aml_third_party_icu_icui18n__testing",
- "cronet_aml_third_party_icu_icuuc_private__testing",
- "cronet_aml_third_party_libevent_libevent__testing",
- "cronet_aml_third_party_modp_b64_modp_b64__testing",
- ],
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DGTEST_API_=",
- "-DGTEST_HAS_ABSL=1",
- "-DGTEST_HAS_POSIX_RE=0",
- "-DGTEST_HAS_TR1_TUPLE=0",
- "-DGTEST_LANG_CXX11=1",
- "-DHAVE_SYS_UIO_H",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_FORTIFY_SOURCE=2",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D__STDC_CONSTANT_MACROS",
- "-D__STDC_FORMAT_MACROS",
- "-Oz",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "third_party/abseil-cpp/",
- "third_party/googletest/custom/",
- "third_party/googletest/src/googlemock/include/",
- "third_party/googletest/src/googletest/include/",
- ],
- cpp_std: "c++17",
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- "-Wl,--script,external/cronet/base/android/library_loader/anchor_functions.lds",
- "-Wl,-wrap,asprintf",
- "-Wl,-wrap,calloc",
- "-Wl,-wrap,free",
- "-Wl,-wrap,getcwd",
- "-Wl,-wrap,malloc",
- "-Wl,-wrap,malloc_usable_size",
- "-Wl,-wrap,memalign",
- "-Wl,-wrap,posix_memalign",
- "-Wl,-wrap,pvalloc",
- "-Wl,-wrap,realloc",
- "-Wl,-wrap,realpath",
- "-Wl,-wrap,strdup",
- "-Wl,-wrap,strndup",
- "-Wl,-wrap,valloc",
- "-Wl,-wrap,vasprintf",
- ],
- target: {
- android_arm: {
- cflags: [
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-fstack-protector",
- "-msse3",
- ],
- },
- },
-}
-
-// GN: //third_party/googletest:gtest__testing
-cc_library_static {
- name: "cronet_aml_third_party_googletest_gtest__testing",
- srcs: [
- "third_party/googletest/custom/gtest/internal/custom/chrome_custom_temp_dir.cc",
- "third_party/googletest/custom/gtest/internal/custom/gtest_port_wrapper.cc",
- "third_party/googletest/custom/gtest/internal/custom/stack_trace_getter.cc",
- "third_party/googletest/src/googletest/src/gtest-assertion-result.cc",
- "third_party/googletest/src/googletest/src/gtest-death-test.cc",
- "third_party/googletest/src/googletest/src/gtest-filepath.cc",
- "third_party/googletest/src/googletest/src/gtest-matchers.cc",
- "third_party/googletest/src/googletest/src/gtest-printers.cc",
- "third_party/googletest/src/googletest/src/gtest-test-part.cc",
- "third_party/googletest/src/googletest/src/gtest-typed-test.cc",
- "third_party/googletest/src/googletest/src/gtest.cc",
- ],
- shared_libs: [
- "libandroid",
- "liblog",
- ],
- static_libs: [
- "cronet_aml_base_allocator_partition_allocator_partition_alloc__testing",
- "cronet_aml_base_base__testing",
- "cronet_aml_base_base_static__testing",
- "cronet_aml_base_nodebug_assertion__testing",
- "cronet_aml_base_third_party_double_conversion_double_conversion__testing",
- "cronet_aml_base_third_party_dynamic_annotations_dynamic_annotations__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_base__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_log_severity__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_malloc_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_raw_logging_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_spinlock_wait__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_strerror__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_throw_delegate__testing",
- "cronet_aml_third_party_abseil_cpp_absl_container_hashtablez_sampler__testing",
- "cronet_aml_third_party_abseil_cpp_absl_container_raw_hash_set__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_debugging_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_demangle_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_examine_stack__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_failure_signal_handler__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_stacktrace__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_symbolize__testing",
- "cronet_aml_third_party_abseil_cpp_absl_hash_city__testing",
- "cronet_aml_third_party_abseil_cpp_absl_hash_hash__testing",
- "cronet_aml_third_party_abseil_cpp_absl_hash_low_level_hash__testing",
- "cronet_aml_third_party_abseil_cpp_absl_numeric_int128__testing",
- "cronet_aml_third_party_abseil_cpp_absl_profiling_exponential_biased__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_distributions__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_platform__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_pool_urbg__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_hwaes__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_hwaes_impl__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_slow__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_seed_material__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_seed_gen_exception__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_seed_sequences__testing",
- "cronet_aml_third_party_abseil_cpp_absl_status_status__testing",
- "cronet_aml_third_party_abseil_cpp_absl_status_statusor__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cord__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cord_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_functions__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_handle__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_info__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_str_format_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_strings__testing",
- "cronet_aml_third_party_abseil_cpp_absl_synchronization_graphcycles_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_synchronization_synchronization__testing",
- "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_civil_time__testing",
- "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_time_zone__testing",
- "cronet_aml_third_party_abseil_cpp_absl_time_time__testing",
- "cronet_aml_third_party_abseil_cpp_absl_types_bad_optional_access__testing",
- "cronet_aml_third_party_abseil_cpp_absl_types_bad_variant_access__testing",
- "cronet_aml_third_party_android_ndk_cpu_features__testing",
- "cronet_aml_third_party_ashmem_ashmem__testing",
- "cronet_aml_third_party_boringssl_boringssl__testing",
- "cronet_aml_third_party_boringssl_boringssl_asm__testing",
- "cronet_aml_third_party_icu_icui18n__testing",
- "cronet_aml_third_party_icu_icuuc_private__testing",
- "cronet_aml_third_party_libevent_libevent__testing",
- "cronet_aml_third_party_modp_b64_modp_b64__testing",
- ],
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DGTEST_API_=",
- "-DGTEST_HAS_ABSL=1",
- "-DGTEST_HAS_POSIX_RE=0",
- "-DGTEST_HAS_TR1_TUPLE=0",
- "-DGTEST_LANG_CXX11=1",
- "-DHAVE_SYS_UIO_H",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-Oz",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "third_party/abseil-cpp/",
- "third_party/boringssl/src/include/",
- "third_party/googletest/custom/",
- "third_party/googletest/src/googletest/",
- "third_party/googletest/src/googletest/include/",
- ],
- cpp_std: "c++17",
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- "-Wl,--script,external/cronet/base/android/library_loader/anchor_functions.lds",
- "-Wl,-wrap,asprintf",
- "-Wl,-wrap,calloc",
- "-Wl,-wrap,free",
- "-Wl,-wrap,getcwd",
- "-Wl,-wrap,malloc",
- "-Wl,-wrap,malloc_usable_size",
- "-Wl,-wrap,memalign",
- "-Wl,-wrap,posix_memalign",
- "-Wl,-wrap,pvalloc",
- "-Wl,-wrap,realloc",
- "-Wl,-wrap,realpath",
- "-Wl,-wrap,strdup",
- "-Wl,-wrap,strndup",
- "-Wl,-wrap,valloc",
- "-Wl,-wrap,vasprintf",
- ],
- target: {
- android_arm: {
- cflags: [
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-fstack-protector",
- "-msse3",
- ],
- },
- },
-}
-
-// GN: //third_party/icu:icui18n
-cc_library_static {
- name: "cronet_aml_third_party_icu_icui18n",
- srcs: [
- "third_party/icu/source/i18n/alphaindex.cpp",
- "third_party/icu/source/i18n/anytrans.cpp",
- "third_party/icu/source/i18n/astro.cpp",
- "third_party/icu/source/i18n/basictz.cpp",
- "third_party/icu/source/i18n/bocsu.cpp",
- "third_party/icu/source/i18n/brktrans.cpp",
- "third_party/icu/source/i18n/buddhcal.cpp",
- "third_party/icu/source/i18n/calendar.cpp",
- "third_party/icu/source/i18n/casetrn.cpp",
- "third_party/icu/source/i18n/cecal.cpp",
- "third_party/icu/source/i18n/chnsecal.cpp",
- "third_party/icu/source/i18n/choicfmt.cpp",
- "third_party/icu/source/i18n/coleitr.cpp",
- "third_party/icu/source/i18n/coll.cpp",
- "third_party/icu/source/i18n/collation.cpp",
- "third_party/icu/source/i18n/collationbuilder.cpp",
- "third_party/icu/source/i18n/collationcompare.cpp",
- "third_party/icu/source/i18n/collationdata.cpp",
- "third_party/icu/source/i18n/collationdatabuilder.cpp",
- "third_party/icu/source/i18n/collationdatareader.cpp",
- "third_party/icu/source/i18n/collationdatawriter.cpp",
- "third_party/icu/source/i18n/collationfastlatin.cpp",
- "third_party/icu/source/i18n/collationfastlatinbuilder.cpp",
- "third_party/icu/source/i18n/collationfcd.cpp",
- "third_party/icu/source/i18n/collationiterator.cpp",
- "third_party/icu/source/i18n/collationkeys.cpp",
- "third_party/icu/source/i18n/collationroot.cpp",
- "third_party/icu/source/i18n/collationrootelements.cpp",
- "third_party/icu/source/i18n/collationruleparser.cpp",
- "third_party/icu/source/i18n/collationsets.cpp",
- "third_party/icu/source/i18n/collationsettings.cpp",
- "third_party/icu/source/i18n/collationtailoring.cpp",
- "third_party/icu/source/i18n/collationweights.cpp",
- "third_party/icu/source/i18n/compactdecimalformat.cpp",
- "third_party/icu/source/i18n/coptccal.cpp",
- "third_party/icu/source/i18n/cpdtrans.cpp",
- "third_party/icu/source/i18n/csdetect.cpp",
- "third_party/icu/source/i18n/csmatch.cpp",
- "third_party/icu/source/i18n/csr2022.cpp",
- "third_party/icu/source/i18n/csrecog.cpp",
- "third_party/icu/source/i18n/csrmbcs.cpp",
- "third_party/icu/source/i18n/csrsbcs.cpp",
- "third_party/icu/source/i18n/csrucode.cpp",
- "third_party/icu/source/i18n/csrutf8.cpp",
- "third_party/icu/source/i18n/curramt.cpp",
- "third_party/icu/source/i18n/currfmt.cpp",
- "third_party/icu/source/i18n/currpinf.cpp",
- "third_party/icu/source/i18n/currunit.cpp",
- "third_party/icu/source/i18n/dangical.cpp",
- "third_party/icu/source/i18n/datefmt.cpp",
- "third_party/icu/source/i18n/dayperiodrules.cpp",
- "third_party/icu/source/i18n/dcfmtsym.cpp",
- "third_party/icu/source/i18n/decContext.cpp",
- "third_party/icu/source/i18n/decNumber.cpp",
- "third_party/icu/source/i18n/decimfmt.cpp",
- "third_party/icu/source/i18n/double-conversion-bignum-dtoa.cpp",
- "third_party/icu/source/i18n/double-conversion-bignum.cpp",
- "third_party/icu/source/i18n/double-conversion-cached-powers.cpp",
- "third_party/icu/source/i18n/double-conversion-double-to-string.cpp",
- "third_party/icu/source/i18n/double-conversion-fast-dtoa.cpp",
- "third_party/icu/source/i18n/double-conversion-string-to-double.cpp",
- "third_party/icu/source/i18n/double-conversion-strtod.cpp",
- "third_party/icu/source/i18n/dtfmtsym.cpp",
- "third_party/icu/source/i18n/dtitvfmt.cpp",
- "third_party/icu/source/i18n/dtitvinf.cpp",
- "third_party/icu/source/i18n/dtptngen.cpp",
- "third_party/icu/source/i18n/dtrule.cpp",
- "third_party/icu/source/i18n/erarules.cpp",
- "third_party/icu/source/i18n/esctrn.cpp",
- "third_party/icu/source/i18n/ethpccal.cpp",
- "third_party/icu/source/i18n/fmtable.cpp",
- "third_party/icu/source/i18n/fmtable_cnv.cpp",
- "third_party/icu/source/i18n/format.cpp",
- "third_party/icu/source/i18n/formatted_string_builder.cpp",
- "third_party/icu/source/i18n/formattedval_iterimpl.cpp",
- "third_party/icu/source/i18n/formattedval_sbimpl.cpp",
- "third_party/icu/source/i18n/formattedvalue.cpp",
- "third_party/icu/source/i18n/fphdlimp.cpp",
- "third_party/icu/source/i18n/fpositer.cpp",
- "third_party/icu/source/i18n/funcrepl.cpp",
- "third_party/icu/source/i18n/gender.cpp",
- "third_party/icu/source/i18n/gregocal.cpp",
- "third_party/icu/source/i18n/gregoimp.cpp",
- "third_party/icu/source/i18n/hebrwcal.cpp",
- "third_party/icu/source/i18n/indiancal.cpp",
- "third_party/icu/source/i18n/inputext.cpp",
- "third_party/icu/source/i18n/islamcal.cpp",
- "third_party/icu/source/i18n/japancal.cpp",
- "third_party/icu/source/i18n/listformatter.cpp",
- "third_party/icu/source/i18n/measfmt.cpp",
- "third_party/icu/source/i18n/measunit.cpp",
- "third_party/icu/source/i18n/measunit_extra.cpp",
- "third_party/icu/source/i18n/measure.cpp",
- "third_party/icu/source/i18n/msgfmt.cpp",
- "third_party/icu/source/i18n/name2uni.cpp",
- "third_party/icu/source/i18n/nfrs.cpp",
- "third_party/icu/source/i18n/nfrule.cpp",
- "third_party/icu/source/i18n/nfsubs.cpp",
- "third_party/icu/source/i18n/nortrans.cpp",
- "third_party/icu/source/i18n/nultrans.cpp",
- "third_party/icu/source/i18n/number_affixutils.cpp",
- "third_party/icu/source/i18n/number_asformat.cpp",
- "third_party/icu/source/i18n/number_capi.cpp",
- "third_party/icu/source/i18n/number_compact.cpp",
- "third_party/icu/source/i18n/number_currencysymbols.cpp",
- "third_party/icu/source/i18n/number_decimalquantity.cpp",
- "third_party/icu/source/i18n/number_decimfmtprops.cpp",
- "third_party/icu/source/i18n/number_fluent.cpp",
- "third_party/icu/source/i18n/number_formatimpl.cpp",
- "third_party/icu/source/i18n/number_grouping.cpp",
- "third_party/icu/source/i18n/number_integerwidth.cpp",
- "third_party/icu/source/i18n/number_longnames.cpp",
- "third_party/icu/source/i18n/number_mapper.cpp",
- "third_party/icu/source/i18n/number_modifiers.cpp",
- "third_party/icu/source/i18n/number_multiplier.cpp",
- "third_party/icu/source/i18n/number_notation.cpp",
- "third_party/icu/source/i18n/number_output.cpp",
- "third_party/icu/source/i18n/number_padding.cpp",
- "third_party/icu/source/i18n/number_patternmodifier.cpp",
- "third_party/icu/source/i18n/number_patternstring.cpp",
- "third_party/icu/source/i18n/number_rounding.cpp",
- "third_party/icu/source/i18n/number_scientific.cpp",
- "third_party/icu/source/i18n/number_skeletons.cpp",
- "third_party/icu/source/i18n/number_symbolswrapper.cpp",
- "third_party/icu/source/i18n/number_usageprefs.cpp",
- "third_party/icu/source/i18n/number_utils.cpp",
- "third_party/icu/source/i18n/numfmt.cpp",
- "third_party/icu/source/i18n/numparse_affixes.cpp",
- "third_party/icu/source/i18n/numparse_compositions.cpp",
- "third_party/icu/source/i18n/numparse_currency.cpp",
- "third_party/icu/source/i18n/numparse_decimal.cpp",
- "third_party/icu/source/i18n/numparse_impl.cpp",
- "third_party/icu/source/i18n/numparse_parsednumber.cpp",
- "third_party/icu/source/i18n/numparse_scientific.cpp",
- "third_party/icu/source/i18n/numparse_symbols.cpp",
- "third_party/icu/source/i18n/numparse_validators.cpp",
- "third_party/icu/source/i18n/numrange_capi.cpp",
- "third_party/icu/source/i18n/numrange_fluent.cpp",
- "third_party/icu/source/i18n/numrange_impl.cpp",
- "third_party/icu/source/i18n/numsys.cpp",
- "third_party/icu/source/i18n/olsontz.cpp",
- "third_party/icu/source/i18n/persncal.cpp",
- "third_party/icu/source/i18n/pluralranges.cpp",
- "third_party/icu/source/i18n/plurfmt.cpp",
- "third_party/icu/source/i18n/plurrule.cpp",
- "third_party/icu/source/i18n/quant.cpp",
- "third_party/icu/source/i18n/quantityformatter.cpp",
- "third_party/icu/source/i18n/rbnf.cpp",
- "third_party/icu/source/i18n/rbt.cpp",
- "third_party/icu/source/i18n/rbt_data.cpp",
- "third_party/icu/source/i18n/rbt_pars.cpp",
- "third_party/icu/source/i18n/rbt_rule.cpp",
- "third_party/icu/source/i18n/rbt_set.cpp",
- "third_party/icu/source/i18n/rbtz.cpp",
- "third_party/icu/source/i18n/regexcmp.cpp",
- "third_party/icu/source/i18n/regeximp.cpp",
- "third_party/icu/source/i18n/regexst.cpp",
- "third_party/icu/source/i18n/regextxt.cpp",
- "third_party/icu/source/i18n/region.cpp",
- "third_party/icu/source/i18n/reldatefmt.cpp",
- "third_party/icu/source/i18n/reldtfmt.cpp",
- "third_party/icu/source/i18n/rematch.cpp",
- "third_party/icu/source/i18n/remtrans.cpp",
- "third_party/icu/source/i18n/repattrn.cpp",
- "third_party/icu/source/i18n/rulebasedcollator.cpp",
- "third_party/icu/source/i18n/scientificnumberformatter.cpp",
- "third_party/icu/source/i18n/scriptset.cpp",
- "third_party/icu/source/i18n/search.cpp",
- "third_party/icu/source/i18n/selfmt.cpp",
- "third_party/icu/source/i18n/sharedbreakiterator.cpp",
- "third_party/icu/source/i18n/simpletz.cpp",
- "third_party/icu/source/i18n/smpdtfmt.cpp",
- "third_party/icu/source/i18n/smpdtfst.cpp",
- "third_party/icu/source/i18n/sortkey.cpp",
- "third_party/icu/source/i18n/standardplural.cpp",
- "third_party/icu/source/i18n/string_segment.cpp",
- "third_party/icu/source/i18n/strmatch.cpp",
- "third_party/icu/source/i18n/strrepl.cpp",
- "third_party/icu/source/i18n/stsearch.cpp",
- "third_party/icu/source/i18n/taiwncal.cpp",
- "third_party/icu/source/i18n/timezone.cpp",
- "third_party/icu/source/i18n/titletrn.cpp",
- "third_party/icu/source/i18n/tmunit.cpp",
- "third_party/icu/source/i18n/tmutamt.cpp",
- "third_party/icu/source/i18n/tmutfmt.cpp",
- "third_party/icu/source/i18n/tolowtrn.cpp",
- "third_party/icu/source/i18n/toupptrn.cpp",
- "third_party/icu/source/i18n/translit.cpp",
- "third_party/icu/source/i18n/transreg.cpp",
- "third_party/icu/source/i18n/tridpars.cpp",
- "third_party/icu/source/i18n/tzfmt.cpp",
- "third_party/icu/source/i18n/tzgnames.cpp",
- "third_party/icu/source/i18n/tznames.cpp",
- "third_party/icu/source/i18n/tznames_impl.cpp",
- "third_party/icu/source/i18n/tzrule.cpp",
- "third_party/icu/source/i18n/tztrans.cpp",
- "third_party/icu/source/i18n/ucal.cpp",
- "third_party/icu/source/i18n/ucln_in.cpp",
- "third_party/icu/source/i18n/ucol.cpp",
- "third_party/icu/source/i18n/ucol_res.cpp",
- "third_party/icu/source/i18n/ucol_sit.cpp",
- "third_party/icu/source/i18n/ucoleitr.cpp",
- "third_party/icu/source/i18n/ucsdet.cpp",
- "third_party/icu/source/i18n/udat.cpp",
- "third_party/icu/source/i18n/udateintervalformat.cpp",
- "third_party/icu/source/i18n/udatpg.cpp",
- "third_party/icu/source/i18n/ufieldpositer.cpp",
- "third_party/icu/source/i18n/uitercollationiterator.cpp",
- "third_party/icu/source/i18n/ulistformatter.cpp",
- "third_party/icu/source/i18n/ulocdata.cpp",
- "third_party/icu/source/i18n/umsg.cpp",
- "third_party/icu/source/i18n/unesctrn.cpp",
- "third_party/icu/source/i18n/uni2name.cpp",
- "third_party/icu/source/i18n/units_complexconverter.cpp",
- "third_party/icu/source/i18n/units_converter.cpp",
- "third_party/icu/source/i18n/units_data.cpp",
- "third_party/icu/source/i18n/units_router.cpp",
- "third_party/icu/source/i18n/unum.cpp",
- "third_party/icu/source/i18n/unumsys.cpp",
- "third_party/icu/source/i18n/upluralrules.cpp",
- "third_party/icu/source/i18n/uregex.cpp",
- "third_party/icu/source/i18n/uregexc.cpp",
- "third_party/icu/source/i18n/uregion.cpp",
- "third_party/icu/source/i18n/usearch.cpp",
- "third_party/icu/source/i18n/uspoof.cpp",
- "third_party/icu/source/i18n/uspoof_build.cpp",
- "third_party/icu/source/i18n/uspoof_conf.cpp",
- "third_party/icu/source/i18n/uspoof_impl.cpp",
- "third_party/icu/source/i18n/utf16collationiterator.cpp",
- "third_party/icu/source/i18n/utf8collationiterator.cpp",
- "third_party/icu/source/i18n/utmscale.cpp",
- "third_party/icu/source/i18n/utrans.cpp",
- "third_party/icu/source/i18n/vtzone.cpp",
- "third_party/icu/source/i18n/vzone.cpp",
- "third_party/icu/source/i18n/windtfmt.cpp",
- "third_party/icu/source/i18n/winnmfmt.cpp",
- "third_party/icu/source/i18n/wintzimpl.cpp",
- "third_party/icu/source/i18n/zonemeta.cpp",
- "third_party/icu/source/i18n/zrule.cpp",
- "third_party/icu/source/i18n/ztrans.cpp",
- ],
- static_libs: [
- "cronet_aml_third_party_icu_icuuc_private",
- ],
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DHAVE_DLOPEN=0",
- "-DHAVE_SYS_UIO_H",
- "-DICU_UTIL_DATA_IMPL=ICU_UTIL_DATA_FILE",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-DUCONFIG_ONLY_HTML_CONVERSION=1",
- "-DUCONFIG_USE_WINDOWS_LCID_MAPPING_API=0",
- "-DUSE_CHROMIUM_ICU=1",
- "-DU_CHARSET_IS_UTF8=1",
- "-DU_ENABLE_DYLOAD=0",
- "-DU_ENABLE_RESOURCE_TRACING=0",
- "-DU_ENABLE_TRACING=1",
- "-DU_I18N_IMPLEMENTATION",
- "-DU_STATIC_IMPLEMENTATION",
- "-DU_USING_ICU_NAMESPACE=0",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-Oz",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "third_party/icu/source/common/",
- "third_party/icu/source/i18n/",
- ],
- cpp_std: "c++17",
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- ],
- rtti: true,
- target: {
- android_arm: {
- cflags: [
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-fstack-protector",
- "-msse3",
- ],
- },
- },
-}
-
-// GN: //third_party/icu:icui18n__testing
-cc_library_static {
- name: "cronet_aml_third_party_icu_icui18n__testing",
- srcs: [
- "third_party/icu/source/i18n/alphaindex.cpp",
- "third_party/icu/source/i18n/anytrans.cpp",
- "third_party/icu/source/i18n/astro.cpp",
- "third_party/icu/source/i18n/basictz.cpp",
- "third_party/icu/source/i18n/bocsu.cpp",
- "third_party/icu/source/i18n/brktrans.cpp",
- "third_party/icu/source/i18n/buddhcal.cpp",
- "third_party/icu/source/i18n/calendar.cpp",
- "third_party/icu/source/i18n/casetrn.cpp",
- "third_party/icu/source/i18n/cecal.cpp",
- "third_party/icu/source/i18n/chnsecal.cpp",
- "third_party/icu/source/i18n/choicfmt.cpp",
- "third_party/icu/source/i18n/coleitr.cpp",
- "third_party/icu/source/i18n/coll.cpp",
- "third_party/icu/source/i18n/collation.cpp",
- "third_party/icu/source/i18n/collationbuilder.cpp",
- "third_party/icu/source/i18n/collationcompare.cpp",
- "third_party/icu/source/i18n/collationdata.cpp",
- "third_party/icu/source/i18n/collationdatabuilder.cpp",
- "third_party/icu/source/i18n/collationdatareader.cpp",
- "third_party/icu/source/i18n/collationdatawriter.cpp",
- "third_party/icu/source/i18n/collationfastlatin.cpp",
- "third_party/icu/source/i18n/collationfastlatinbuilder.cpp",
- "third_party/icu/source/i18n/collationfcd.cpp",
- "third_party/icu/source/i18n/collationiterator.cpp",
- "third_party/icu/source/i18n/collationkeys.cpp",
- "third_party/icu/source/i18n/collationroot.cpp",
- "third_party/icu/source/i18n/collationrootelements.cpp",
- "third_party/icu/source/i18n/collationruleparser.cpp",
- "third_party/icu/source/i18n/collationsets.cpp",
- "third_party/icu/source/i18n/collationsettings.cpp",
- "third_party/icu/source/i18n/collationtailoring.cpp",
- "third_party/icu/source/i18n/collationweights.cpp",
- "third_party/icu/source/i18n/compactdecimalformat.cpp",
- "third_party/icu/source/i18n/coptccal.cpp",
- "third_party/icu/source/i18n/cpdtrans.cpp",
- "third_party/icu/source/i18n/csdetect.cpp",
- "third_party/icu/source/i18n/csmatch.cpp",
- "third_party/icu/source/i18n/csr2022.cpp",
- "third_party/icu/source/i18n/csrecog.cpp",
- "third_party/icu/source/i18n/csrmbcs.cpp",
- "third_party/icu/source/i18n/csrsbcs.cpp",
- "third_party/icu/source/i18n/csrucode.cpp",
- "third_party/icu/source/i18n/csrutf8.cpp",
- "third_party/icu/source/i18n/curramt.cpp",
- "third_party/icu/source/i18n/currfmt.cpp",
- "third_party/icu/source/i18n/currpinf.cpp",
- "third_party/icu/source/i18n/currunit.cpp",
- "third_party/icu/source/i18n/dangical.cpp",
- "third_party/icu/source/i18n/datefmt.cpp",
- "third_party/icu/source/i18n/dayperiodrules.cpp",
- "third_party/icu/source/i18n/dcfmtsym.cpp",
- "third_party/icu/source/i18n/decContext.cpp",
- "third_party/icu/source/i18n/decNumber.cpp",
- "third_party/icu/source/i18n/decimfmt.cpp",
- "third_party/icu/source/i18n/double-conversion-bignum-dtoa.cpp",
- "third_party/icu/source/i18n/double-conversion-bignum.cpp",
- "third_party/icu/source/i18n/double-conversion-cached-powers.cpp",
- "third_party/icu/source/i18n/double-conversion-double-to-string.cpp",
- "third_party/icu/source/i18n/double-conversion-fast-dtoa.cpp",
- "third_party/icu/source/i18n/double-conversion-string-to-double.cpp",
- "third_party/icu/source/i18n/double-conversion-strtod.cpp",
- "third_party/icu/source/i18n/dtfmtsym.cpp",
- "third_party/icu/source/i18n/dtitvfmt.cpp",
- "third_party/icu/source/i18n/dtitvinf.cpp",
- "third_party/icu/source/i18n/dtptngen.cpp",
- "third_party/icu/source/i18n/dtrule.cpp",
- "third_party/icu/source/i18n/erarules.cpp",
- "third_party/icu/source/i18n/esctrn.cpp",
- "third_party/icu/source/i18n/ethpccal.cpp",
- "third_party/icu/source/i18n/fmtable.cpp",
- "third_party/icu/source/i18n/fmtable_cnv.cpp",
- "third_party/icu/source/i18n/format.cpp",
- "third_party/icu/source/i18n/formatted_string_builder.cpp",
- "third_party/icu/source/i18n/formattedval_iterimpl.cpp",
- "third_party/icu/source/i18n/formattedval_sbimpl.cpp",
- "third_party/icu/source/i18n/formattedvalue.cpp",
- "third_party/icu/source/i18n/fphdlimp.cpp",
- "third_party/icu/source/i18n/fpositer.cpp",
- "third_party/icu/source/i18n/funcrepl.cpp",
- "third_party/icu/source/i18n/gender.cpp",
- "third_party/icu/source/i18n/gregocal.cpp",
- "third_party/icu/source/i18n/gregoimp.cpp",
- "third_party/icu/source/i18n/hebrwcal.cpp",
- "third_party/icu/source/i18n/indiancal.cpp",
- "third_party/icu/source/i18n/inputext.cpp",
- "third_party/icu/source/i18n/islamcal.cpp",
- "third_party/icu/source/i18n/japancal.cpp",
- "third_party/icu/source/i18n/listformatter.cpp",
- "third_party/icu/source/i18n/measfmt.cpp",
- "third_party/icu/source/i18n/measunit.cpp",
- "third_party/icu/source/i18n/measunit_extra.cpp",
- "third_party/icu/source/i18n/measure.cpp",
- "third_party/icu/source/i18n/msgfmt.cpp",
- "third_party/icu/source/i18n/name2uni.cpp",
- "third_party/icu/source/i18n/nfrs.cpp",
- "third_party/icu/source/i18n/nfrule.cpp",
- "third_party/icu/source/i18n/nfsubs.cpp",
- "third_party/icu/source/i18n/nortrans.cpp",
- "third_party/icu/source/i18n/nultrans.cpp",
- "third_party/icu/source/i18n/number_affixutils.cpp",
- "third_party/icu/source/i18n/number_asformat.cpp",
- "third_party/icu/source/i18n/number_capi.cpp",
- "third_party/icu/source/i18n/number_compact.cpp",
- "third_party/icu/source/i18n/number_currencysymbols.cpp",
- "third_party/icu/source/i18n/number_decimalquantity.cpp",
- "third_party/icu/source/i18n/number_decimfmtprops.cpp",
- "third_party/icu/source/i18n/number_fluent.cpp",
- "third_party/icu/source/i18n/number_formatimpl.cpp",
- "third_party/icu/source/i18n/number_grouping.cpp",
- "third_party/icu/source/i18n/number_integerwidth.cpp",
- "third_party/icu/source/i18n/number_longnames.cpp",
- "third_party/icu/source/i18n/number_mapper.cpp",
- "third_party/icu/source/i18n/number_modifiers.cpp",
- "third_party/icu/source/i18n/number_multiplier.cpp",
- "third_party/icu/source/i18n/number_notation.cpp",
- "third_party/icu/source/i18n/number_output.cpp",
- "third_party/icu/source/i18n/number_padding.cpp",
- "third_party/icu/source/i18n/number_patternmodifier.cpp",
- "third_party/icu/source/i18n/number_patternstring.cpp",
- "third_party/icu/source/i18n/number_rounding.cpp",
- "third_party/icu/source/i18n/number_scientific.cpp",
- "third_party/icu/source/i18n/number_skeletons.cpp",
- "third_party/icu/source/i18n/number_symbolswrapper.cpp",
- "third_party/icu/source/i18n/number_usageprefs.cpp",
- "third_party/icu/source/i18n/number_utils.cpp",
- "third_party/icu/source/i18n/numfmt.cpp",
- "third_party/icu/source/i18n/numparse_affixes.cpp",
- "third_party/icu/source/i18n/numparse_compositions.cpp",
- "third_party/icu/source/i18n/numparse_currency.cpp",
- "third_party/icu/source/i18n/numparse_decimal.cpp",
- "third_party/icu/source/i18n/numparse_impl.cpp",
- "third_party/icu/source/i18n/numparse_parsednumber.cpp",
- "third_party/icu/source/i18n/numparse_scientific.cpp",
- "third_party/icu/source/i18n/numparse_symbols.cpp",
- "third_party/icu/source/i18n/numparse_validators.cpp",
- "third_party/icu/source/i18n/numrange_capi.cpp",
- "third_party/icu/source/i18n/numrange_fluent.cpp",
- "third_party/icu/source/i18n/numrange_impl.cpp",
- "third_party/icu/source/i18n/numsys.cpp",
- "third_party/icu/source/i18n/olsontz.cpp",
- "third_party/icu/source/i18n/persncal.cpp",
- "third_party/icu/source/i18n/pluralranges.cpp",
- "third_party/icu/source/i18n/plurfmt.cpp",
- "third_party/icu/source/i18n/plurrule.cpp",
- "third_party/icu/source/i18n/quant.cpp",
- "third_party/icu/source/i18n/quantityformatter.cpp",
- "third_party/icu/source/i18n/rbnf.cpp",
- "third_party/icu/source/i18n/rbt.cpp",
- "third_party/icu/source/i18n/rbt_data.cpp",
- "third_party/icu/source/i18n/rbt_pars.cpp",
- "third_party/icu/source/i18n/rbt_rule.cpp",
- "third_party/icu/source/i18n/rbt_set.cpp",
- "third_party/icu/source/i18n/rbtz.cpp",
- "third_party/icu/source/i18n/regexcmp.cpp",
- "third_party/icu/source/i18n/regeximp.cpp",
- "third_party/icu/source/i18n/regexst.cpp",
- "third_party/icu/source/i18n/regextxt.cpp",
- "third_party/icu/source/i18n/region.cpp",
- "third_party/icu/source/i18n/reldatefmt.cpp",
- "third_party/icu/source/i18n/reldtfmt.cpp",
- "third_party/icu/source/i18n/rematch.cpp",
- "third_party/icu/source/i18n/remtrans.cpp",
- "third_party/icu/source/i18n/repattrn.cpp",
- "third_party/icu/source/i18n/rulebasedcollator.cpp",
- "third_party/icu/source/i18n/scientificnumberformatter.cpp",
- "third_party/icu/source/i18n/scriptset.cpp",
- "third_party/icu/source/i18n/search.cpp",
- "third_party/icu/source/i18n/selfmt.cpp",
- "third_party/icu/source/i18n/sharedbreakiterator.cpp",
- "third_party/icu/source/i18n/simpletz.cpp",
- "third_party/icu/source/i18n/smpdtfmt.cpp",
- "third_party/icu/source/i18n/smpdtfst.cpp",
- "third_party/icu/source/i18n/sortkey.cpp",
- "third_party/icu/source/i18n/standardplural.cpp",
- "third_party/icu/source/i18n/string_segment.cpp",
- "third_party/icu/source/i18n/strmatch.cpp",
- "third_party/icu/source/i18n/strrepl.cpp",
- "third_party/icu/source/i18n/stsearch.cpp",
- "third_party/icu/source/i18n/taiwncal.cpp",
- "third_party/icu/source/i18n/timezone.cpp",
- "third_party/icu/source/i18n/titletrn.cpp",
- "third_party/icu/source/i18n/tmunit.cpp",
- "third_party/icu/source/i18n/tmutamt.cpp",
- "third_party/icu/source/i18n/tmutfmt.cpp",
- "third_party/icu/source/i18n/tolowtrn.cpp",
- "third_party/icu/source/i18n/toupptrn.cpp",
- "third_party/icu/source/i18n/translit.cpp",
- "third_party/icu/source/i18n/transreg.cpp",
- "third_party/icu/source/i18n/tridpars.cpp",
- "third_party/icu/source/i18n/tzfmt.cpp",
- "third_party/icu/source/i18n/tzgnames.cpp",
- "third_party/icu/source/i18n/tznames.cpp",
- "third_party/icu/source/i18n/tznames_impl.cpp",
- "third_party/icu/source/i18n/tzrule.cpp",
- "third_party/icu/source/i18n/tztrans.cpp",
- "third_party/icu/source/i18n/ucal.cpp",
- "third_party/icu/source/i18n/ucln_in.cpp",
- "third_party/icu/source/i18n/ucol.cpp",
- "third_party/icu/source/i18n/ucol_res.cpp",
- "third_party/icu/source/i18n/ucol_sit.cpp",
- "third_party/icu/source/i18n/ucoleitr.cpp",
- "third_party/icu/source/i18n/ucsdet.cpp",
- "third_party/icu/source/i18n/udat.cpp",
- "third_party/icu/source/i18n/udateintervalformat.cpp",
- "third_party/icu/source/i18n/udatpg.cpp",
- "third_party/icu/source/i18n/ufieldpositer.cpp",
- "third_party/icu/source/i18n/uitercollationiterator.cpp",
- "third_party/icu/source/i18n/ulistformatter.cpp",
- "third_party/icu/source/i18n/ulocdata.cpp",
- "third_party/icu/source/i18n/umsg.cpp",
- "third_party/icu/source/i18n/unesctrn.cpp",
- "third_party/icu/source/i18n/uni2name.cpp",
- "third_party/icu/source/i18n/units_complexconverter.cpp",
- "third_party/icu/source/i18n/units_converter.cpp",
- "third_party/icu/source/i18n/units_data.cpp",
- "third_party/icu/source/i18n/units_router.cpp",
- "third_party/icu/source/i18n/unum.cpp",
- "third_party/icu/source/i18n/unumsys.cpp",
- "third_party/icu/source/i18n/upluralrules.cpp",
- "third_party/icu/source/i18n/uregex.cpp",
- "third_party/icu/source/i18n/uregexc.cpp",
- "third_party/icu/source/i18n/uregion.cpp",
- "third_party/icu/source/i18n/usearch.cpp",
- "third_party/icu/source/i18n/uspoof.cpp",
- "third_party/icu/source/i18n/uspoof_build.cpp",
- "third_party/icu/source/i18n/uspoof_conf.cpp",
- "third_party/icu/source/i18n/uspoof_impl.cpp",
- "third_party/icu/source/i18n/utf16collationiterator.cpp",
- "third_party/icu/source/i18n/utf8collationiterator.cpp",
- "third_party/icu/source/i18n/utmscale.cpp",
- "third_party/icu/source/i18n/utrans.cpp",
- "third_party/icu/source/i18n/vtzone.cpp",
- "third_party/icu/source/i18n/vzone.cpp",
- "third_party/icu/source/i18n/windtfmt.cpp",
- "third_party/icu/source/i18n/winnmfmt.cpp",
- "third_party/icu/source/i18n/wintzimpl.cpp",
- "third_party/icu/source/i18n/zonemeta.cpp",
- "third_party/icu/source/i18n/zrule.cpp",
- "third_party/icu/source/i18n/ztrans.cpp",
- ],
- static_libs: [
- "cronet_aml_third_party_icu_icuuc_private__testing",
- ],
- host_supported: true,
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DHAVE_DLOPEN=0",
- "-DICU_UTIL_DATA_IMPL=ICU_UTIL_DATA_FILE",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-DUCONFIG_ONLY_HTML_CONVERSION=1",
- "-DUCONFIG_USE_WINDOWS_LCID_MAPPING_API=0",
- "-DUSE_CHROMIUM_ICU=1",
- "-DU_CHARSET_IS_UTF8=1",
- "-DU_ENABLE_DYLOAD=0",
- "-DU_ENABLE_RESOURCE_TRACING=0",
- "-DU_ENABLE_TRACING=1",
- "-DU_I18N_IMPLEMENTATION",
- "-DU_STATIC_IMPLEMENTATION",
- "-DU_USING_ICU_NAMESPACE=0",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "third_party/icu/source/common/",
- "third_party/icu/source/i18n/",
- ],
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- ],
- rtti: true,
- target: {
- android_arm: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- "-msse3",
- ],
- },
- host: {
- cflags: [
- "-DCR_SYSROOT_KEY=20220331T153654Z-0",
- "-DUSE_AURA=1",
- "-DUSE_OZONE=1",
- "-DUSE_UDEV",
- "-D_FILE_OFFSET_BITS=64",
- "-D_LARGEFILE64_SOURCE",
- "-D_LARGEFILE_SOURCE",
- "-O2",
- "-fstack-protector",
- "-msse3",
- ],
- compile_multilib: "64",
- },
- },
-}
-
-// GN: //third_party/icu:icuuc_private
-cc_library_static {
- name: "cronet_aml_third_party_icu_icuuc_private",
- srcs: [
- "third_party/icu/source/common/appendable.cpp",
- "third_party/icu/source/common/bmpset.cpp",
- "third_party/icu/source/common/brkeng.cpp",
- "third_party/icu/source/common/brkiter.cpp",
- "third_party/icu/source/common/bytesinkutil.cpp",
- "third_party/icu/source/common/bytestream.cpp",
- "third_party/icu/source/common/bytestrie.cpp",
- "third_party/icu/source/common/bytestriebuilder.cpp",
- "third_party/icu/source/common/bytestrieiterator.cpp",
- "third_party/icu/source/common/caniter.cpp",
- "third_party/icu/source/common/characterproperties.cpp",
- "third_party/icu/source/common/chariter.cpp",
- "third_party/icu/source/common/charstr.cpp",
- "third_party/icu/source/common/cmemory.cpp",
- "third_party/icu/source/common/cstr.cpp",
- "third_party/icu/source/common/cstring.cpp",
- "third_party/icu/source/common/cwchar.cpp",
- "third_party/icu/source/common/dictbe.cpp",
- "third_party/icu/source/common/dictionarydata.cpp",
- "third_party/icu/source/common/dtintrv.cpp",
- "third_party/icu/source/common/edits.cpp",
- "third_party/icu/source/common/emojiprops.cpp",
- "third_party/icu/source/common/errorcode.cpp",
- "third_party/icu/source/common/filteredbrk.cpp",
- "third_party/icu/source/common/filterednormalizer2.cpp",
- "third_party/icu/source/common/icudataver.cpp",
- "third_party/icu/source/common/icuplug.cpp",
- "third_party/icu/source/common/loadednormalizer2impl.cpp",
- "third_party/icu/source/common/localebuilder.cpp",
- "third_party/icu/source/common/localematcher.cpp",
- "third_party/icu/source/common/localeprioritylist.cpp",
- "third_party/icu/source/common/locavailable.cpp",
- "third_party/icu/source/common/locbased.cpp",
- "third_party/icu/source/common/locdispnames.cpp",
- "third_party/icu/source/common/locdistance.cpp",
- "third_party/icu/source/common/locdspnm.cpp",
- "third_party/icu/source/common/locid.cpp",
- "third_party/icu/source/common/loclikely.cpp",
- "third_party/icu/source/common/loclikelysubtags.cpp",
- "third_party/icu/source/common/locmap.cpp",
- "third_party/icu/source/common/locresdata.cpp",
- "third_party/icu/source/common/locutil.cpp",
- "third_party/icu/source/common/lsr.cpp",
- "third_party/icu/source/common/lstmbe.cpp",
- "third_party/icu/source/common/messagepattern.cpp",
- "third_party/icu/source/common/normalizer2.cpp",
- "third_party/icu/source/common/normalizer2impl.cpp",
- "third_party/icu/source/common/normlzr.cpp",
- "third_party/icu/source/common/parsepos.cpp",
- "third_party/icu/source/common/patternprops.cpp",
- "third_party/icu/source/common/pluralmap.cpp",
- "third_party/icu/source/common/propname.cpp",
- "third_party/icu/source/common/propsvec.cpp",
- "third_party/icu/source/common/punycode.cpp",
- "third_party/icu/source/common/putil.cpp",
- "third_party/icu/source/common/rbbi.cpp",
- "third_party/icu/source/common/rbbi_cache.cpp",
- "third_party/icu/source/common/rbbidata.cpp",
- "third_party/icu/source/common/rbbinode.cpp",
- "third_party/icu/source/common/rbbirb.cpp",
- "third_party/icu/source/common/rbbiscan.cpp",
- "third_party/icu/source/common/rbbisetb.cpp",
- "third_party/icu/source/common/rbbistbl.cpp",
- "third_party/icu/source/common/rbbitblb.cpp",
- "third_party/icu/source/common/resbund.cpp",
- "third_party/icu/source/common/resbund_cnv.cpp",
- "third_party/icu/source/common/resource.cpp",
- "third_party/icu/source/common/restrace.cpp",
- "third_party/icu/source/common/ruleiter.cpp",
- "third_party/icu/source/common/schriter.cpp",
- "third_party/icu/source/common/serv.cpp",
- "third_party/icu/source/common/servlk.cpp",
- "third_party/icu/source/common/servlkf.cpp",
- "third_party/icu/source/common/servls.cpp",
- "third_party/icu/source/common/servnotf.cpp",
- "third_party/icu/source/common/servrbf.cpp",
- "third_party/icu/source/common/servslkf.cpp",
- "third_party/icu/source/common/sharedobject.cpp",
- "third_party/icu/source/common/simpleformatter.cpp",
- "third_party/icu/source/common/static_unicode_sets.cpp",
- "third_party/icu/source/common/stringpiece.cpp",
- "third_party/icu/source/common/stringtriebuilder.cpp",
- "third_party/icu/source/common/uarrsort.cpp",
- "third_party/icu/source/common/ubidi.cpp",
- "third_party/icu/source/common/ubidi_props.cpp",
- "third_party/icu/source/common/ubidiln.cpp",
- "third_party/icu/source/common/ubiditransform.cpp",
- "third_party/icu/source/common/ubidiwrt.cpp",
- "third_party/icu/source/common/ubrk.cpp",
- "third_party/icu/source/common/ucase.cpp",
- "third_party/icu/source/common/ucasemap.cpp",
- "third_party/icu/source/common/ucasemap_titlecase_brkiter.cpp",
- "third_party/icu/source/common/ucat.cpp",
- "third_party/icu/source/common/uchar.cpp",
- "third_party/icu/source/common/ucharstrie.cpp",
- "third_party/icu/source/common/ucharstriebuilder.cpp",
- "third_party/icu/source/common/ucharstrieiterator.cpp",
- "third_party/icu/source/common/uchriter.cpp",
- "third_party/icu/source/common/ucln_cmn.cpp",
- "third_party/icu/source/common/ucmndata.cpp",
- "third_party/icu/source/common/ucnv.cpp",
- "third_party/icu/source/common/ucnv2022.cpp",
- "third_party/icu/source/common/ucnv_bld.cpp",
- "third_party/icu/source/common/ucnv_cb.cpp",
- "third_party/icu/source/common/ucnv_cnv.cpp",
- "third_party/icu/source/common/ucnv_ct.cpp",
- "third_party/icu/source/common/ucnv_err.cpp",
- "third_party/icu/source/common/ucnv_ext.cpp",
- "third_party/icu/source/common/ucnv_io.cpp",
- "third_party/icu/source/common/ucnv_lmb.cpp",
- "third_party/icu/source/common/ucnv_set.cpp",
- "third_party/icu/source/common/ucnv_u16.cpp",
- "third_party/icu/source/common/ucnv_u32.cpp",
- "third_party/icu/source/common/ucnv_u7.cpp",
- "third_party/icu/source/common/ucnv_u8.cpp",
- "third_party/icu/source/common/ucnvbocu.cpp",
- "third_party/icu/source/common/ucnvdisp.cpp",
- "third_party/icu/source/common/ucnvhz.cpp",
- "third_party/icu/source/common/ucnvisci.cpp",
- "third_party/icu/source/common/ucnvlat1.cpp",
- "third_party/icu/source/common/ucnvmbcs.cpp",
- "third_party/icu/source/common/ucnvscsu.cpp",
- "third_party/icu/source/common/ucnvsel.cpp",
- "third_party/icu/source/common/ucol_swp.cpp",
- "third_party/icu/source/common/ucptrie.cpp",
- "third_party/icu/source/common/ucurr.cpp",
- "third_party/icu/source/common/udata.cpp",
- "third_party/icu/source/common/udatamem.cpp",
- "third_party/icu/source/common/udataswp.cpp",
- "third_party/icu/source/common/uenum.cpp",
- "third_party/icu/source/common/uhash.cpp",
- "third_party/icu/source/common/uhash_us.cpp",
- "third_party/icu/source/common/uidna.cpp",
- "third_party/icu/source/common/uinit.cpp",
- "third_party/icu/source/common/uinvchar.cpp",
- "third_party/icu/source/common/uiter.cpp",
- "third_party/icu/source/common/ulist.cpp",
- "third_party/icu/source/common/uloc.cpp",
- "third_party/icu/source/common/uloc_keytype.cpp",
- "third_party/icu/source/common/uloc_tag.cpp",
- "third_party/icu/source/common/umapfile.cpp",
- "third_party/icu/source/common/umath.cpp",
- "third_party/icu/source/common/umutablecptrie.cpp",
- "third_party/icu/source/common/umutex.cpp",
- "third_party/icu/source/common/unames.cpp",
- "third_party/icu/source/common/unifiedcache.cpp",
- "third_party/icu/source/common/unifilt.cpp",
- "third_party/icu/source/common/unifunct.cpp",
- "third_party/icu/source/common/uniset.cpp",
- "third_party/icu/source/common/uniset_closure.cpp",
- "third_party/icu/source/common/uniset_props.cpp",
- "third_party/icu/source/common/unisetspan.cpp",
- "third_party/icu/source/common/unistr.cpp",
- "third_party/icu/source/common/unistr_case.cpp",
- "third_party/icu/source/common/unistr_case_locale.cpp",
- "third_party/icu/source/common/unistr_cnv.cpp",
- "third_party/icu/source/common/unistr_props.cpp",
- "third_party/icu/source/common/unistr_titlecase_brkiter.cpp",
- "third_party/icu/source/common/unorm.cpp",
- "third_party/icu/source/common/unormcmp.cpp",
- "third_party/icu/source/common/uobject.cpp",
- "third_party/icu/source/common/uprops.cpp",
- "third_party/icu/source/common/ures_cnv.cpp",
- "third_party/icu/source/common/uresbund.cpp",
- "third_party/icu/source/common/uresdata.cpp",
- "third_party/icu/source/common/usc_impl.cpp",
- "third_party/icu/source/common/uscript.cpp",
- "third_party/icu/source/common/uscript_props.cpp",
- "third_party/icu/source/common/uset.cpp",
- "third_party/icu/source/common/uset_props.cpp",
- "third_party/icu/source/common/usetiter.cpp",
- "third_party/icu/source/common/ushape.cpp",
- "third_party/icu/source/common/usprep.cpp",
- "third_party/icu/source/common/ustack.cpp",
- "third_party/icu/source/common/ustr_cnv.cpp",
- "third_party/icu/source/common/ustr_titlecase_brkiter.cpp",
- "third_party/icu/source/common/ustr_wcs.cpp",
- "third_party/icu/source/common/ustrcase.cpp",
- "third_party/icu/source/common/ustrcase_locale.cpp",
- "third_party/icu/source/common/ustrenum.cpp",
- "third_party/icu/source/common/ustrfmt.cpp",
- "third_party/icu/source/common/ustring.cpp",
- "third_party/icu/source/common/ustrtrns.cpp",
- "third_party/icu/source/common/utext.cpp",
- "third_party/icu/source/common/utf_impl.cpp",
- "third_party/icu/source/common/util.cpp",
- "third_party/icu/source/common/util_props.cpp",
- "third_party/icu/source/common/utrace.cpp",
- "third_party/icu/source/common/utrie.cpp",
- "third_party/icu/source/common/utrie2.cpp",
- "third_party/icu/source/common/utrie2_builder.cpp",
- "third_party/icu/source/common/utrie_swap.cpp",
- "third_party/icu/source/common/uts46.cpp",
- "third_party/icu/source/common/utypes.cpp",
- "third_party/icu/source/common/uvector.cpp",
- "third_party/icu/source/common/uvectr32.cpp",
- "third_party/icu/source/common/uvectr64.cpp",
- "third_party/icu/source/common/wintz.cpp",
- "third_party/icu/source/stubdata/stubdata.cpp",
- ],
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DHAVE_DLOPEN=0",
- "-DHAVE_SYS_UIO_H",
- "-DICU_UTIL_DATA_IMPL=ICU_UTIL_DATA_FILE",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-DUCONFIG_ONLY_HTML_CONVERSION=1",
- "-DUCONFIG_USE_WINDOWS_LCID_MAPPING_API=0",
- "-DUSE_CHROMIUM_ICU=1",
- "-DU_CHARSET_IS_UTF8=1",
- "-DU_COMMON_IMPLEMENTATION",
- "-DU_ENABLE_DYLOAD=0",
- "-DU_ENABLE_RESOURCE_TRACING=0",
- "-DU_ENABLE_TRACING=1",
- "-DU_ICUDATAENTRY_IN_COMMON",
- "-DU_STATIC_IMPLEMENTATION",
- "-DU_USING_ICU_NAMESPACE=0",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-Oz",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "third_party/icu/source/common/",
- "third_party/icu/source/i18n/",
- ],
- cpp_std: "c++17",
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- ],
- rtti: true,
- target: {
- android_arm: {
- cflags: [
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-fstack-protector",
- "-msse3",
- ],
- },
- },
-}
-
-// GN: //third_party/icu:icuuc_private__testing
-cc_library_static {
- name: "cronet_aml_third_party_icu_icuuc_private__testing",
- srcs: [
- "third_party/icu/source/common/appendable.cpp",
- "third_party/icu/source/common/bmpset.cpp",
- "third_party/icu/source/common/brkeng.cpp",
- "third_party/icu/source/common/brkiter.cpp",
- "third_party/icu/source/common/bytesinkutil.cpp",
- "third_party/icu/source/common/bytestream.cpp",
- "third_party/icu/source/common/bytestrie.cpp",
- "third_party/icu/source/common/bytestriebuilder.cpp",
- "third_party/icu/source/common/bytestrieiterator.cpp",
- "third_party/icu/source/common/caniter.cpp",
- "third_party/icu/source/common/characterproperties.cpp",
- "third_party/icu/source/common/chariter.cpp",
- "third_party/icu/source/common/charstr.cpp",
- "third_party/icu/source/common/cmemory.cpp",
- "third_party/icu/source/common/cstr.cpp",
- "third_party/icu/source/common/cstring.cpp",
- "third_party/icu/source/common/cwchar.cpp",
- "third_party/icu/source/common/dictbe.cpp",
- "third_party/icu/source/common/dictionarydata.cpp",
- "third_party/icu/source/common/dtintrv.cpp",
- "third_party/icu/source/common/edits.cpp",
- "third_party/icu/source/common/emojiprops.cpp",
- "third_party/icu/source/common/errorcode.cpp",
- "third_party/icu/source/common/filteredbrk.cpp",
- "third_party/icu/source/common/filterednormalizer2.cpp",
- "third_party/icu/source/common/icudataver.cpp",
- "third_party/icu/source/common/icuplug.cpp",
- "third_party/icu/source/common/loadednormalizer2impl.cpp",
- "third_party/icu/source/common/localebuilder.cpp",
- "third_party/icu/source/common/localematcher.cpp",
- "third_party/icu/source/common/localeprioritylist.cpp",
- "third_party/icu/source/common/locavailable.cpp",
- "third_party/icu/source/common/locbased.cpp",
- "third_party/icu/source/common/locdispnames.cpp",
- "third_party/icu/source/common/locdistance.cpp",
- "third_party/icu/source/common/locdspnm.cpp",
- "third_party/icu/source/common/locid.cpp",
- "third_party/icu/source/common/loclikely.cpp",
- "third_party/icu/source/common/loclikelysubtags.cpp",
- "third_party/icu/source/common/locmap.cpp",
- "third_party/icu/source/common/locresdata.cpp",
- "third_party/icu/source/common/locutil.cpp",
- "third_party/icu/source/common/lsr.cpp",
- "third_party/icu/source/common/lstmbe.cpp",
- "third_party/icu/source/common/messagepattern.cpp",
- "third_party/icu/source/common/normalizer2.cpp",
- "third_party/icu/source/common/normalizer2impl.cpp",
- "third_party/icu/source/common/normlzr.cpp",
- "third_party/icu/source/common/parsepos.cpp",
- "third_party/icu/source/common/patternprops.cpp",
- "third_party/icu/source/common/pluralmap.cpp",
- "third_party/icu/source/common/propname.cpp",
- "third_party/icu/source/common/propsvec.cpp",
- "third_party/icu/source/common/punycode.cpp",
- "third_party/icu/source/common/putil.cpp",
- "third_party/icu/source/common/rbbi.cpp",
- "third_party/icu/source/common/rbbi_cache.cpp",
- "third_party/icu/source/common/rbbidata.cpp",
- "third_party/icu/source/common/rbbinode.cpp",
- "third_party/icu/source/common/rbbirb.cpp",
- "third_party/icu/source/common/rbbiscan.cpp",
- "third_party/icu/source/common/rbbisetb.cpp",
- "third_party/icu/source/common/rbbistbl.cpp",
- "third_party/icu/source/common/rbbitblb.cpp",
- "third_party/icu/source/common/resbund.cpp",
- "third_party/icu/source/common/resbund_cnv.cpp",
- "third_party/icu/source/common/resource.cpp",
- "third_party/icu/source/common/restrace.cpp",
- "third_party/icu/source/common/ruleiter.cpp",
- "third_party/icu/source/common/schriter.cpp",
- "third_party/icu/source/common/serv.cpp",
- "third_party/icu/source/common/servlk.cpp",
- "third_party/icu/source/common/servlkf.cpp",
- "third_party/icu/source/common/servls.cpp",
- "third_party/icu/source/common/servnotf.cpp",
- "third_party/icu/source/common/servrbf.cpp",
- "third_party/icu/source/common/servslkf.cpp",
- "third_party/icu/source/common/sharedobject.cpp",
- "third_party/icu/source/common/simpleformatter.cpp",
- "third_party/icu/source/common/static_unicode_sets.cpp",
- "third_party/icu/source/common/stringpiece.cpp",
- "third_party/icu/source/common/stringtriebuilder.cpp",
- "third_party/icu/source/common/uarrsort.cpp",
- "third_party/icu/source/common/ubidi.cpp",
- "third_party/icu/source/common/ubidi_props.cpp",
- "third_party/icu/source/common/ubidiln.cpp",
- "third_party/icu/source/common/ubiditransform.cpp",
- "third_party/icu/source/common/ubidiwrt.cpp",
- "third_party/icu/source/common/ubrk.cpp",
- "third_party/icu/source/common/ucase.cpp",
- "third_party/icu/source/common/ucasemap.cpp",
- "third_party/icu/source/common/ucasemap_titlecase_brkiter.cpp",
- "third_party/icu/source/common/ucat.cpp",
- "third_party/icu/source/common/uchar.cpp",
- "third_party/icu/source/common/ucharstrie.cpp",
- "third_party/icu/source/common/ucharstriebuilder.cpp",
- "third_party/icu/source/common/ucharstrieiterator.cpp",
- "third_party/icu/source/common/uchriter.cpp",
- "third_party/icu/source/common/ucln_cmn.cpp",
- "third_party/icu/source/common/ucmndata.cpp",
- "third_party/icu/source/common/ucnv.cpp",
- "third_party/icu/source/common/ucnv2022.cpp",
- "third_party/icu/source/common/ucnv_bld.cpp",
- "third_party/icu/source/common/ucnv_cb.cpp",
- "third_party/icu/source/common/ucnv_cnv.cpp",
- "third_party/icu/source/common/ucnv_ct.cpp",
- "third_party/icu/source/common/ucnv_err.cpp",
- "third_party/icu/source/common/ucnv_ext.cpp",
- "third_party/icu/source/common/ucnv_io.cpp",
- "third_party/icu/source/common/ucnv_lmb.cpp",
- "third_party/icu/source/common/ucnv_set.cpp",
- "third_party/icu/source/common/ucnv_u16.cpp",
- "third_party/icu/source/common/ucnv_u32.cpp",
- "third_party/icu/source/common/ucnv_u7.cpp",
- "third_party/icu/source/common/ucnv_u8.cpp",
- "third_party/icu/source/common/ucnvbocu.cpp",
- "third_party/icu/source/common/ucnvdisp.cpp",
- "third_party/icu/source/common/ucnvhz.cpp",
- "third_party/icu/source/common/ucnvisci.cpp",
- "third_party/icu/source/common/ucnvlat1.cpp",
- "third_party/icu/source/common/ucnvmbcs.cpp",
- "third_party/icu/source/common/ucnvscsu.cpp",
- "third_party/icu/source/common/ucnvsel.cpp",
- "third_party/icu/source/common/ucol_swp.cpp",
- "third_party/icu/source/common/ucptrie.cpp",
- "third_party/icu/source/common/ucurr.cpp",
- "third_party/icu/source/common/udata.cpp",
- "third_party/icu/source/common/udatamem.cpp",
- "third_party/icu/source/common/udataswp.cpp",
- "third_party/icu/source/common/uenum.cpp",
- "third_party/icu/source/common/uhash.cpp",
- "third_party/icu/source/common/uhash_us.cpp",
- "third_party/icu/source/common/uidna.cpp",
- "third_party/icu/source/common/uinit.cpp",
- "third_party/icu/source/common/uinvchar.cpp",
- "third_party/icu/source/common/uiter.cpp",
- "third_party/icu/source/common/ulist.cpp",
- "third_party/icu/source/common/uloc.cpp",
- "third_party/icu/source/common/uloc_keytype.cpp",
- "third_party/icu/source/common/uloc_tag.cpp",
- "third_party/icu/source/common/umapfile.cpp",
- "third_party/icu/source/common/umath.cpp",
- "third_party/icu/source/common/umutablecptrie.cpp",
- "third_party/icu/source/common/umutex.cpp",
- "third_party/icu/source/common/unames.cpp",
- "third_party/icu/source/common/unifiedcache.cpp",
- "third_party/icu/source/common/unifilt.cpp",
- "third_party/icu/source/common/unifunct.cpp",
- "third_party/icu/source/common/uniset.cpp",
- "third_party/icu/source/common/uniset_closure.cpp",
- "third_party/icu/source/common/uniset_props.cpp",
- "third_party/icu/source/common/unisetspan.cpp",
- "third_party/icu/source/common/unistr.cpp",
- "third_party/icu/source/common/unistr_case.cpp",
- "third_party/icu/source/common/unistr_case_locale.cpp",
- "third_party/icu/source/common/unistr_cnv.cpp",
- "third_party/icu/source/common/unistr_props.cpp",
- "third_party/icu/source/common/unistr_titlecase_brkiter.cpp",
- "third_party/icu/source/common/unorm.cpp",
- "third_party/icu/source/common/unormcmp.cpp",
- "third_party/icu/source/common/uobject.cpp",
- "third_party/icu/source/common/uprops.cpp",
- "third_party/icu/source/common/ures_cnv.cpp",
- "third_party/icu/source/common/uresbund.cpp",
- "third_party/icu/source/common/uresdata.cpp",
- "third_party/icu/source/common/usc_impl.cpp",
- "third_party/icu/source/common/uscript.cpp",
- "third_party/icu/source/common/uscript_props.cpp",
- "third_party/icu/source/common/uset.cpp",
- "third_party/icu/source/common/uset_props.cpp",
- "third_party/icu/source/common/usetiter.cpp",
- "third_party/icu/source/common/ushape.cpp",
- "third_party/icu/source/common/usprep.cpp",
- "third_party/icu/source/common/ustack.cpp",
- "third_party/icu/source/common/ustr_cnv.cpp",
- "third_party/icu/source/common/ustr_titlecase_brkiter.cpp",
- "third_party/icu/source/common/ustr_wcs.cpp",
- "third_party/icu/source/common/ustrcase.cpp",
- "third_party/icu/source/common/ustrcase_locale.cpp",
- "third_party/icu/source/common/ustrenum.cpp",
- "third_party/icu/source/common/ustrfmt.cpp",
- "third_party/icu/source/common/ustring.cpp",
- "third_party/icu/source/common/ustrtrns.cpp",
- "third_party/icu/source/common/utext.cpp",
- "third_party/icu/source/common/utf_impl.cpp",
- "third_party/icu/source/common/util.cpp",
- "third_party/icu/source/common/util_props.cpp",
- "third_party/icu/source/common/utrace.cpp",
- "third_party/icu/source/common/utrie.cpp",
- "third_party/icu/source/common/utrie2.cpp",
- "third_party/icu/source/common/utrie2_builder.cpp",
- "third_party/icu/source/common/utrie_swap.cpp",
- "third_party/icu/source/common/uts46.cpp",
- "third_party/icu/source/common/utypes.cpp",
- "third_party/icu/source/common/uvector.cpp",
- "third_party/icu/source/common/uvectr32.cpp",
- "third_party/icu/source/common/uvectr64.cpp",
- "third_party/icu/source/common/wintz.cpp",
- "third_party/icu/source/stubdata/stubdata.cpp",
- ],
- host_supported: true,
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DHAVE_DLOPEN=0",
- "-DICU_UTIL_DATA_IMPL=ICU_UTIL_DATA_FILE",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-DUCONFIG_ONLY_HTML_CONVERSION=1",
- "-DUCONFIG_USE_WINDOWS_LCID_MAPPING_API=0",
- "-DUSE_CHROMIUM_ICU=1",
- "-DU_CHARSET_IS_UTF8=1",
- "-DU_COMMON_IMPLEMENTATION",
- "-DU_ENABLE_DYLOAD=0",
- "-DU_ENABLE_RESOURCE_TRACING=0",
- "-DU_ENABLE_TRACING=1",
- "-DU_ICUDATAENTRY_IN_COMMON",
- "-DU_STATIC_IMPLEMENTATION",
- "-DU_USING_ICU_NAMESPACE=0",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "third_party/icu/source/common/",
- "third_party/icu/source/i18n/",
- ],
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- ],
- rtti: true,
- target: {
- android_arm: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- "-msse3",
- ],
- },
- host: {
- cflags: [
- "-DCR_SYSROOT_KEY=20220331T153654Z-0",
- "-DUSE_AURA=1",
- "-DUSE_OZONE=1",
- "-DUSE_UDEV",
- "-D_FILE_OFFSET_BITS=64",
- "-D_LARGEFILE64_SOURCE",
- "-D_LARGEFILE_SOURCE",
- "-O2",
- "-fstack-protector",
- "-msse3",
- ],
- compile_multilib: "64",
- },
- },
-}
-
-// GN: //third_party/libevent:libevent
-cc_library_static {
- name: "cronet_aml_third_party_libevent_libevent",
- srcs: [
- "third_party/libevent/buffer.c",
- "third_party/libevent/epoll.c",
- "third_party/libevent/evbuffer.c",
- "third_party/libevent/evdns.c",
- "third_party/libevent/event.c",
- "third_party/libevent/event_tagging.c",
- "third_party/libevent/evrpc.c",
- "third_party/libevent/evutil.c",
- "third_party/libevent/http.c",
- "third_party/libevent/log.c",
- "third_party/libevent/poll.c",
- "third_party/libevent/select.c",
- "third_party/libevent/signal.c",
- "third_party/libevent/strlcpy.c",
- ],
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DHAVE_CONFIG_H",
- "-DHAVE_SYS_UIO_H",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-O2",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "third_party/libevent/android/",
- ],
- cpp_std: "c++17",
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- ],
- target: {
- android_arm: {
- cflags: [
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-fstack-protector",
- "-msse3",
- ],
- },
- },
-}
-
-// GN: //third_party/libevent:libevent__testing
-cc_library_static {
- name: "cronet_aml_third_party_libevent_libevent__testing",
- srcs: [
- "third_party/libevent/buffer.c",
- "third_party/libevent/epoll.c",
- "third_party/libevent/evbuffer.c",
- "third_party/libevent/evdns.c",
- "third_party/libevent/event.c",
- "third_party/libevent/event_tagging.c",
- "third_party/libevent/evrpc.c",
- "third_party/libevent/evutil.c",
- "third_party/libevent/http.c",
- "third_party/libevent/log.c",
- "third_party/libevent/poll.c",
- "third_party/libevent/select.c",
- "third_party/libevent/signal.c",
- "third_party/libevent/strlcpy.c",
- ],
- host_supported: true,
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DHAVE_CONFIG_H",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-O2",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- ],
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- ],
- target: {
- android_arm: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-fstack-protector",
- ],
- local_include_dirs: [
- "third_party/libevent/android/",
- ],
- },
- android_arm64: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- local_include_dirs: [
- "third_party/libevent/android/",
- ],
- },
- android_x86: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-msse3",
- ],
- local_include_dirs: [
- "third_party/libevent/android/",
- ],
- },
- android_x86_64: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-fstack-protector",
- "-msse3",
- ],
- local_include_dirs: [
- "third_party/libevent/android/",
- ],
- },
- host: {
- cflags: [
- "-DCR_SYSROOT_KEY=20220331T153654Z-0",
- "-DUSE_AURA=1",
- "-DUSE_OZONE=1",
- "-DUSE_UDEV",
- "-D_FILE_OFFSET_BITS=64",
- "-D_LARGEFILE64_SOURCE",
- "-D_LARGEFILE_SOURCE",
- "-fstack-protector",
- "-msse3",
- ],
- local_include_dirs: [
- "third_party/libevent/linux/",
- ],
- compile_multilib: "64",
- },
- },
-}
-
-// GN: //third_party/libxml:libxml__testing
-cc_library_static {
- name: "cronet_aml_third_party_libxml_libxml__testing",
- srcs: [
- "third_party/libxml/src/HTMLparser.c",
- "third_party/libxml/src/HTMLtree.c",
- "third_party/libxml/src/SAX2.c",
- "third_party/libxml/src/buf.c",
- "third_party/libxml/src/chvalid.c",
- "third_party/libxml/src/dict.c",
- "third_party/libxml/src/encoding.c",
- "third_party/libxml/src/entities.c",
- "third_party/libxml/src/error.c",
- "third_party/libxml/src/globals.c",
- "third_party/libxml/src/hash.c",
- "third_party/libxml/src/list.c",
- "third_party/libxml/src/parser.c",
- "third_party/libxml/src/parserInternals.c",
- "third_party/libxml/src/pattern.c",
- "third_party/libxml/src/threads.c",
- "third_party/libxml/src/tree.c",
- "third_party/libxml/src/uri.c",
- "third_party/libxml/src/valid.c",
- "third_party/libxml/src/xmlIO.c",
- "third_party/libxml/src/xmlmemory.c",
- "third_party/libxml/src/xmlreader.c",
- "third_party/libxml/src/xmlsave.c",
- "third_party/libxml/src/xmlstring.c",
- "third_party/libxml/src/xmlunicode.c",
- "third_party/libxml/src/xmlwriter.c",
- "third_party/libxml/src/xpath.c",
- ],
- shared_libs: [
- "libz",
- ],
- static_libs: [
- "cronet_aml_third_party_icu_icuuc_private__testing",
- ],
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DHAVE_SYS_UIO_H",
- "-DICU_UTIL_DATA_IMPL=ICU_UTIL_DATA_FILE",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-DUSE_CHROMIUM_ICU=1",
- "-DU_ENABLE_DYLOAD=0",
- "-DU_ENABLE_RESOURCE_TRACING=0",
- "-DU_ENABLE_TRACING=1",
- "-DU_STATIC_IMPLEMENTATION",
- "-DU_USING_ICU_NAMESPACE=0",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_REENTRANT",
- "-Oz",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "third_party/icu/source/common/",
- "third_party/icu/source/i18n/",
- "third_party/libxml/linux/",
- "third_party/libxml/linux/include/",
- "third_party/libxml/src/include/",
- ],
- cpp_std: "c++17",
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- ],
- target: {
- android_arm: {
- cflags: [
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-fstack-protector",
- "-msse3",
- ],
- },
- },
-}
-
-// GN: //third_party/libxml:libxml_utils__testing
-cc_library_static {
- name: "cronet_aml_third_party_libxml_libxml_utils__testing",
- srcs: [
- "third_party/libxml/chromium/libxml_utils.cc",
- ],
- shared_libs: [
- "libz",
- ],
- static_libs: [
- "cronet_aml_third_party_icu_icuuc_private__testing",
- "cronet_aml_third_party_libxml_libxml__testing",
- ],
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DHAVE_SYS_UIO_H",
- "-DICU_UTIL_DATA_IMPL=ICU_UTIL_DATA_FILE",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-DUSE_CHROMIUM_ICU=1",
- "-DU_ENABLE_DYLOAD=0",
- "-DU_ENABLE_RESOURCE_TRACING=0",
- "-DU_ENABLE_TRACING=1",
- "-DU_STATIC_IMPLEMENTATION",
- "-DU_USING_ICU_NAMESPACE=0",
- "-D_FORTIFY_SOURCE=2",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D__STDC_CONSTANT_MACROS",
- "-D__STDC_FORMAT_MACROS",
- "-Oz",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "third_party/icu/source/common/",
- "third_party/icu/source/i18n/",
- "third_party/libxml/linux/include/",
- "third_party/libxml/src/include/",
- ],
- cpp_std: "c++17",
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- ],
- target: {
- android_arm: {
- cflags: [
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-fstack-protector",
- "-msse3",
- ],
- },
- },
-}
-
-// GN: //third_party/libxml:xml_reader__testing
-cc_library_static {
- name: "cronet_aml_third_party_libxml_xml_reader__testing",
- srcs: [
- "third_party/libxml/chromium/xml_reader.cc",
- ],
- shared_libs: [
- "libz",
- ],
- static_libs: [
- "cronet_aml_third_party_icu_icuuc_private__testing",
- "cronet_aml_third_party_libxml_libxml__testing",
- "cronet_aml_third_party_libxml_libxml_utils__testing",
- ],
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DHAVE_SYS_UIO_H",
- "-DICU_UTIL_DATA_IMPL=ICU_UTIL_DATA_FILE",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-DUSE_CHROMIUM_ICU=1",
- "-DU_ENABLE_DYLOAD=0",
- "-DU_ENABLE_RESOURCE_TRACING=0",
- "-DU_ENABLE_TRACING=1",
- "-DU_STATIC_IMPLEMENTATION",
- "-DU_USING_ICU_NAMESPACE=0",
- "-D_FORTIFY_SOURCE=2",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D__STDC_CONSTANT_MACROS",
- "-D__STDC_FORMAT_MACROS",
- "-Oz",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "third_party/icu/source/common/",
- "third_party/icu/source/i18n/",
- "third_party/libxml/linux/include/",
- "third_party/libxml/src/include/",
- ],
- cpp_std: "c++17",
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- ],
- target: {
- android_arm: {
- cflags: [
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-fstack-protector",
- "-msse3",
- ],
- },
- },
-}
-
-// GN: //third_party/metrics_proto:metrics_proto__testing
-cc_genrule {
- name: "cronet_aml_third_party_metrics_proto_metrics_proto__testing_gen",
- srcs: [
- "third_party/metrics_proto/call_stack_profile.proto",
- "third_party/metrics_proto/cast_logs.proto",
- "third_party/metrics_proto/chrome_os_app_list_launch_event.proto",
- "third_party/metrics_proto/chrome_searchbox_stats.proto",
- "third_party/metrics_proto/chrome_user_metrics_extension.proto",
- "third_party/metrics_proto/custom_tab_session.proto",
- "third_party/metrics_proto/execution_context.proto",
- "third_party/metrics_proto/extension_install.proto",
- "third_party/metrics_proto/histogram_event.proto",
- "third_party/metrics_proto/omnibox_event.proto",
- "third_party/metrics_proto/omnibox_focus_type.proto",
- "third_party/metrics_proto/omnibox_input_type.proto",
- "third_party/metrics_proto/perf_data.proto",
- "third_party/metrics_proto/perf_stat.proto",
- "third_party/metrics_proto/printer_event.proto",
- "third_party/metrics_proto/reporting_info.proto",
- "third_party/metrics_proto/sampled_profile.proto",
- "third_party/metrics_proto/structured_data.proto",
- "third_party/metrics_proto/system_profile.proto",
- "third_party/metrics_proto/trace_log.proto",
- "third_party/metrics_proto/translate_event.proto",
- "third_party/metrics_proto/ukm/aggregate.proto",
- "third_party/metrics_proto/ukm/entry.proto",
- "third_party/metrics_proto/ukm/report.proto",
- "third_party/metrics_proto/ukm/source.proto",
- "third_party/metrics_proto/user_action_event.proto",
- "third_party/metrics_proto/user_demographics.proto",
- ],
- tools: [
- "cronet_aml_third_party_protobuf_protoc",
- ],
- cmd: "$(location cronet_aml_third_party_protobuf_protoc) --proto_path=external/cronet/third_party/metrics_proto --cpp_out=lite=true:$(genDir)/external/cronet/third_party/metrics_proto/ $(in)",
- out: [
- "external/cronet/third_party/metrics_proto/call_stack_profile.pb.cc",
- "external/cronet/third_party/metrics_proto/cast_logs.pb.cc",
- "external/cronet/third_party/metrics_proto/chrome_os_app_list_launch_event.pb.cc",
- "external/cronet/third_party/metrics_proto/chrome_searchbox_stats.pb.cc",
- "external/cronet/third_party/metrics_proto/chrome_user_metrics_extension.pb.cc",
- "external/cronet/third_party/metrics_proto/custom_tab_session.pb.cc",
- "external/cronet/third_party/metrics_proto/execution_context.pb.cc",
- "external/cronet/third_party/metrics_proto/extension_install.pb.cc",
- "external/cronet/third_party/metrics_proto/histogram_event.pb.cc",
- "external/cronet/third_party/metrics_proto/omnibox_event.pb.cc",
- "external/cronet/third_party/metrics_proto/omnibox_focus_type.pb.cc",
- "external/cronet/third_party/metrics_proto/omnibox_input_type.pb.cc",
- "external/cronet/third_party/metrics_proto/perf_data.pb.cc",
- "external/cronet/third_party/metrics_proto/perf_stat.pb.cc",
- "external/cronet/third_party/metrics_proto/printer_event.pb.cc",
- "external/cronet/third_party/metrics_proto/reporting_info.pb.cc",
- "external/cronet/third_party/metrics_proto/sampled_profile.pb.cc",
- "external/cronet/third_party/metrics_proto/structured_data.pb.cc",
- "external/cronet/third_party/metrics_proto/system_profile.pb.cc",
- "external/cronet/third_party/metrics_proto/trace_log.pb.cc",
- "external/cronet/third_party/metrics_proto/translate_event.pb.cc",
- "external/cronet/third_party/metrics_proto/ukm/aggregate.pb.cc",
- "external/cronet/third_party/metrics_proto/ukm/entry.pb.cc",
- "external/cronet/third_party/metrics_proto/ukm/report.pb.cc",
- "external/cronet/third_party/metrics_proto/ukm/source.pb.cc",
- "external/cronet/third_party/metrics_proto/user_action_event.pb.cc",
- "external/cronet/third_party/metrics_proto/user_demographics.pb.cc",
- ],
- apex_available: [
- "com.android.tethering",
- ],
-}
-
-// GN: //third_party/metrics_proto:metrics_proto__testing
-cc_genrule {
- name: "cronet_aml_third_party_metrics_proto_metrics_proto__testing_gen_headers",
- srcs: [
- "third_party/metrics_proto/call_stack_profile.proto",
- "third_party/metrics_proto/cast_logs.proto",
- "third_party/metrics_proto/chrome_os_app_list_launch_event.proto",
- "third_party/metrics_proto/chrome_searchbox_stats.proto",
- "third_party/metrics_proto/chrome_user_metrics_extension.proto",
- "third_party/metrics_proto/custom_tab_session.proto",
- "third_party/metrics_proto/execution_context.proto",
- "third_party/metrics_proto/extension_install.proto",
- "third_party/metrics_proto/histogram_event.proto",
- "third_party/metrics_proto/omnibox_event.proto",
- "third_party/metrics_proto/omnibox_focus_type.proto",
- "third_party/metrics_proto/omnibox_input_type.proto",
- "third_party/metrics_proto/perf_data.proto",
- "third_party/metrics_proto/perf_stat.proto",
- "third_party/metrics_proto/printer_event.proto",
- "third_party/metrics_proto/reporting_info.proto",
- "third_party/metrics_proto/sampled_profile.proto",
- "third_party/metrics_proto/structured_data.proto",
- "third_party/metrics_proto/system_profile.proto",
- "third_party/metrics_proto/trace_log.proto",
- "third_party/metrics_proto/translate_event.proto",
- "third_party/metrics_proto/ukm/aggregate.proto",
- "third_party/metrics_proto/ukm/entry.proto",
- "third_party/metrics_proto/ukm/report.proto",
- "third_party/metrics_proto/ukm/source.proto",
- "third_party/metrics_proto/user_action_event.proto",
- "third_party/metrics_proto/user_demographics.proto",
- ],
- tools: [
- "cronet_aml_third_party_protobuf_protoc",
- ],
- cmd: "$(location cronet_aml_third_party_protobuf_protoc) --proto_path=external/cronet/third_party/metrics_proto --cpp_out=lite=true:$(genDir)/external/cronet/third_party/metrics_proto/ $(in)",
- out: [
- "external/cronet/third_party/metrics_proto/call_stack_profile.pb.h",
- "external/cronet/third_party/metrics_proto/cast_logs.pb.h",
- "external/cronet/third_party/metrics_proto/chrome_os_app_list_launch_event.pb.h",
- "external/cronet/third_party/metrics_proto/chrome_searchbox_stats.pb.h",
- "external/cronet/third_party/metrics_proto/chrome_user_metrics_extension.pb.h",
- "external/cronet/third_party/metrics_proto/custom_tab_session.pb.h",
- "external/cronet/third_party/metrics_proto/execution_context.pb.h",
- "external/cronet/third_party/metrics_proto/extension_install.pb.h",
- "external/cronet/third_party/metrics_proto/histogram_event.pb.h",
- "external/cronet/third_party/metrics_proto/omnibox_event.pb.h",
- "external/cronet/third_party/metrics_proto/omnibox_focus_type.pb.h",
- "external/cronet/third_party/metrics_proto/omnibox_input_type.pb.h",
- "external/cronet/third_party/metrics_proto/perf_data.pb.h",
- "external/cronet/third_party/metrics_proto/perf_stat.pb.h",
- "external/cronet/third_party/metrics_proto/printer_event.pb.h",
- "external/cronet/third_party/metrics_proto/reporting_info.pb.h",
- "external/cronet/third_party/metrics_proto/sampled_profile.pb.h",
- "external/cronet/third_party/metrics_proto/structured_data.pb.h",
- "external/cronet/third_party/metrics_proto/system_profile.pb.h",
- "external/cronet/third_party/metrics_proto/trace_log.pb.h",
- "external/cronet/third_party/metrics_proto/translate_event.pb.h",
- "external/cronet/third_party/metrics_proto/ukm/aggregate.pb.h",
- "external/cronet/third_party/metrics_proto/ukm/entry.pb.h",
- "external/cronet/third_party/metrics_proto/ukm/report.pb.h",
- "external/cronet/third_party/metrics_proto/ukm/source.pb.h",
- "external/cronet/third_party/metrics_proto/user_action_event.pb.h",
- "external/cronet/third_party/metrics_proto/user_demographics.pb.h",
- ],
- export_include_dirs: [
- ".",
- "protos",
- "third_party/metrics_proto",
- ],
- apex_available: [
- "com.android.tethering",
- ],
-}
-
-// GN: //third_party/metrics_proto:metrics_proto
-cc_genrule {
- name: "cronet_aml_third_party_metrics_proto_metrics_proto_gen",
- srcs: [
- "third_party/metrics_proto/call_stack_profile.proto",
- "third_party/metrics_proto/cast_logs.proto",
- "third_party/metrics_proto/chrome_os_app_list_launch_event.proto",
- "third_party/metrics_proto/chrome_searchbox_stats.proto",
- "third_party/metrics_proto/chrome_user_metrics_extension.proto",
- "third_party/metrics_proto/custom_tab_session.proto",
- "third_party/metrics_proto/execution_context.proto",
- "third_party/metrics_proto/extension_install.proto",
- "third_party/metrics_proto/histogram_event.proto",
- "third_party/metrics_proto/omnibox_event.proto",
- "third_party/metrics_proto/omnibox_focus_type.proto",
- "third_party/metrics_proto/omnibox_input_type.proto",
- "third_party/metrics_proto/perf_data.proto",
- "third_party/metrics_proto/perf_stat.proto",
- "third_party/metrics_proto/printer_event.proto",
- "third_party/metrics_proto/reporting_info.proto",
- "third_party/metrics_proto/sampled_profile.proto",
- "third_party/metrics_proto/structured_data.proto",
- "third_party/metrics_proto/system_profile.proto",
- "third_party/metrics_proto/trace_log.proto",
- "third_party/metrics_proto/translate_event.proto",
- "third_party/metrics_proto/ukm/aggregate.proto",
- "third_party/metrics_proto/ukm/entry.proto",
- "third_party/metrics_proto/ukm/report.proto",
- "third_party/metrics_proto/ukm/source.proto",
- "third_party/metrics_proto/user_action_event.proto",
- "third_party/metrics_proto/user_demographics.proto",
- ],
- tools: [
- "cronet_aml_third_party_protobuf_protoc",
- ],
- cmd: "$(location cronet_aml_third_party_protobuf_protoc) --proto_path=external/cronet/third_party/metrics_proto --cpp_out=lite=true:$(genDir)/external/cronet/third_party/metrics_proto/ $(in)",
- out: [
- "external/cronet/third_party/metrics_proto/call_stack_profile.pb.cc",
- "external/cronet/third_party/metrics_proto/cast_logs.pb.cc",
- "external/cronet/third_party/metrics_proto/chrome_os_app_list_launch_event.pb.cc",
- "external/cronet/third_party/metrics_proto/chrome_searchbox_stats.pb.cc",
- "external/cronet/third_party/metrics_proto/chrome_user_metrics_extension.pb.cc",
- "external/cronet/third_party/metrics_proto/custom_tab_session.pb.cc",
- "external/cronet/third_party/metrics_proto/execution_context.pb.cc",
- "external/cronet/third_party/metrics_proto/extension_install.pb.cc",
- "external/cronet/third_party/metrics_proto/histogram_event.pb.cc",
- "external/cronet/third_party/metrics_proto/omnibox_event.pb.cc",
- "external/cronet/third_party/metrics_proto/omnibox_focus_type.pb.cc",
- "external/cronet/third_party/metrics_proto/omnibox_input_type.pb.cc",
- "external/cronet/third_party/metrics_proto/perf_data.pb.cc",
- "external/cronet/third_party/metrics_proto/perf_stat.pb.cc",
- "external/cronet/third_party/metrics_proto/printer_event.pb.cc",
- "external/cronet/third_party/metrics_proto/reporting_info.pb.cc",
- "external/cronet/third_party/metrics_proto/sampled_profile.pb.cc",
- "external/cronet/third_party/metrics_proto/structured_data.pb.cc",
- "external/cronet/third_party/metrics_proto/system_profile.pb.cc",
- "external/cronet/third_party/metrics_proto/trace_log.pb.cc",
- "external/cronet/third_party/metrics_proto/translate_event.pb.cc",
- "external/cronet/third_party/metrics_proto/ukm/aggregate.pb.cc",
- "external/cronet/third_party/metrics_proto/ukm/entry.pb.cc",
- "external/cronet/third_party/metrics_proto/ukm/report.pb.cc",
- "external/cronet/third_party/metrics_proto/ukm/source.pb.cc",
- "external/cronet/third_party/metrics_proto/user_action_event.pb.cc",
- "external/cronet/third_party/metrics_proto/user_demographics.pb.cc",
- ],
- apex_available: [
- "com.android.tethering",
- ],
-}
-
-// GN: //third_party/metrics_proto:metrics_proto
-cc_genrule {
- name: "cronet_aml_third_party_metrics_proto_metrics_proto_gen_headers",
- srcs: [
- "third_party/metrics_proto/call_stack_profile.proto",
- "third_party/metrics_proto/cast_logs.proto",
- "third_party/metrics_proto/chrome_os_app_list_launch_event.proto",
- "third_party/metrics_proto/chrome_searchbox_stats.proto",
- "third_party/metrics_proto/chrome_user_metrics_extension.proto",
- "third_party/metrics_proto/custom_tab_session.proto",
- "third_party/metrics_proto/execution_context.proto",
- "third_party/metrics_proto/extension_install.proto",
- "third_party/metrics_proto/histogram_event.proto",
- "third_party/metrics_proto/omnibox_event.proto",
- "third_party/metrics_proto/omnibox_focus_type.proto",
- "third_party/metrics_proto/omnibox_input_type.proto",
- "third_party/metrics_proto/perf_data.proto",
- "third_party/metrics_proto/perf_stat.proto",
- "third_party/metrics_proto/printer_event.proto",
- "third_party/metrics_proto/reporting_info.proto",
- "third_party/metrics_proto/sampled_profile.proto",
- "third_party/metrics_proto/structured_data.proto",
- "third_party/metrics_proto/system_profile.proto",
- "third_party/metrics_proto/trace_log.proto",
- "third_party/metrics_proto/translate_event.proto",
- "third_party/metrics_proto/ukm/aggregate.proto",
- "third_party/metrics_proto/ukm/entry.proto",
- "third_party/metrics_proto/ukm/report.proto",
- "third_party/metrics_proto/ukm/source.proto",
- "third_party/metrics_proto/user_action_event.proto",
- "third_party/metrics_proto/user_demographics.proto",
- ],
- tools: [
- "cronet_aml_third_party_protobuf_protoc",
- ],
- cmd: "$(location cronet_aml_third_party_protobuf_protoc) --proto_path=external/cronet/third_party/metrics_proto --cpp_out=lite=true:$(genDir)/external/cronet/third_party/metrics_proto/ $(in)",
- out: [
- "external/cronet/third_party/metrics_proto/call_stack_profile.pb.h",
- "external/cronet/third_party/metrics_proto/cast_logs.pb.h",
- "external/cronet/third_party/metrics_proto/chrome_os_app_list_launch_event.pb.h",
- "external/cronet/third_party/metrics_proto/chrome_searchbox_stats.pb.h",
- "external/cronet/third_party/metrics_proto/chrome_user_metrics_extension.pb.h",
- "external/cronet/third_party/metrics_proto/custom_tab_session.pb.h",
- "external/cronet/third_party/metrics_proto/execution_context.pb.h",
- "external/cronet/third_party/metrics_proto/extension_install.pb.h",
- "external/cronet/third_party/metrics_proto/histogram_event.pb.h",
- "external/cronet/third_party/metrics_proto/omnibox_event.pb.h",
- "external/cronet/third_party/metrics_proto/omnibox_focus_type.pb.h",
- "external/cronet/third_party/metrics_proto/omnibox_input_type.pb.h",
- "external/cronet/third_party/metrics_proto/perf_data.pb.h",
- "external/cronet/third_party/metrics_proto/perf_stat.pb.h",
- "external/cronet/third_party/metrics_proto/printer_event.pb.h",
- "external/cronet/third_party/metrics_proto/reporting_info.pb.h",
- "external/cronet/third_party/metrics_proto/sampled_profile.pb.h",
- "external/cronet/third_party/metrics_proto/structured_data.pb.h",
- "external/cronet/third_party/metrics_proto/system_profile.pb.h",
- "external/cronet/third_party/metrics_proto/trace_log.pb.h",
- "external/cronet/third_party/metrics_proto/translate_event.pb.h",
- "external/cronet/third_party/metrics_proto/ukm/aggregate.pb.h",
- "external/cronet/third_party/metrics_proto/ukm/entry.pb.h",
- "external/cronet/third_party/metrics_proto/ukm/report.pb.h",
- "external/cronet/third_party/metrics_proto/ukm/source.pb.h",
- "external/cronet/third_party/metrics_proto/user_action_event.pb.h",
- "external/cronet/third_party/metrics_proto/user_demographics.pb.h",
- ],
- export_include_dirs: [
- ".",
- "protos",
- "third_party/metrics_proto",
- ],
- apex_available: [
- "com.android.tethering",
- ],
-}
-
-// GN: //third_party/modp_b64:modp_b64
-cc_library_static {
- name: "cronet_aml_third_party_modp_b64_modp_b64",
- srcs: [
- "third_party/modp_b64/modp_b64.cc",
- ],
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DHAVE_SYS_UIO_H",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_FORTIFY_SOURCE=2",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D__STDC_CONSTANT_MACROS",
- "-D__STDC_FORMAT_MACROS",
- "-Oz",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- ],
- cpp_std: "c++17",
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- ],
- target: {
- android_arm: {
- cflags: [
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-fstack-protector",
- "-msse3",
- ],
- },
- },
-}
-
-// GN: //third_party/modp_b64:modp_b64__testing
-cc_library_static {
- name: "cronet_aml_third_party_modp_b64_modp_b64__testing",
- srcs: [
- "third_party/modp_b64/modp_b64.cc",
- ],
- host_supported: true,
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_FORTIFY_SOURCE=2",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D__STDC_CONSTANT_MACROS",
- "-D__STDC_FORMAT_MACROS",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- ],
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- ],
- target: {
- android_arm: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DHAVE_SYS_UIO_H",
- "-Oz",
- "-fstack-protector",
- "-msse3",
- ],
- },
- host: {
- cflags: [
- "-DCR_SYSROOT_KEY=20220331T153654Z-0",
- "-DUSE_AURA=1",
- "-DUSE_OZONE=1",
- "-DUSE_UDEV",
- "-D_FILE_OFFSET_BITS=64",
- "-D_LARGEFILE64_SOURCE",
- "-D_LARGEFILE_SOURCE",
- "-O2",
- "-fstack-protector",
- "-msse3",
- ],
- compile_multilib: "64",
- },
- },
-}
-
-// GN: //third_party/protobuf:protobuf_full
-cc_library_static {
- name: "cronet_aml_third_party_protobuf_protobuf_full",
- srcs: [
- "third_party/protobuf/src/google/protobuf/any.cc",
- "third_party/protobuf/src/google/protobuf/any.pb.cc",
- "third_party/protobuf/src/google/protobuf/any_lite.cc",
- "third_party/protobuf/src/google/protobuf/api.pb.cc",
- "third_party/protobuf/src/google/protobuf/arena.cc",
- "third_party/protobuf/src/google/protobuf/arenastring.cc",
- "third_party/protobuf/src/google/protobuf/arenaz_sampler.cc",
- "third_party/protobuf/src/google/protobuf/compiler/importer.cc",
- "third_party/protobuf/src/google/protobuf/compiler/parser.cc",
- "third_party/protobuf/src/google/protobuf/descriptor.cc",
- "third_party/protobuf/src/google/protobuf/descriptor.pb.cc",
- "third_party/protobuf/src/google/protobuf/descriptor_database.cc",
- "third_party/protobuf/src/google/protobuf/duration.pb.cc",
- "third_party/protobuf/src/google/protobuf/dynamic_message.cc",
- "third_party/protobuf/src/google/protobuf/empty.pb.cc",
- "third_party/protobuf/src/google/protobuf/extension_set.cc",
- "third_party/protobuf/src/google/protobuf/extension_set_heavy.cc",
- "third_party/protobuf/src/google/protobuf/field_mask.pb.cc",
- "third_party/protobuf/src/google/protobuf/generated_enum_util.cc",
- "third_party/protobuf/src/google/protobuf/generated_message_bases.cc",
- "third_party/protobuf/src/google/protobuf/generated_message_reflection.cc",
- "third_party/protobuf/src/google/protobuf/generated_message_tctable_full.cc",
- "third_party/protobuf/src/google/protobuf/generated_message_tctable_lite.cc",
- "third_party/protobuf/src/google/protobuf/generated_message_util.cc",
- "third_party/protobuf/src/google/protobuf/implicit_weak_message.cc",
- "third_party/protobuf/src/google/protobuf/inlined_string_field.cc",
- "third_party/protobuf/src/google/protobuf/io/coded_stream.cc",
- "third_party/protobuf/src/google/protobuf/io/gzip_stream.cc",
- "third_party/protobuf/src/google/protobuf/io/io_win32.cc",
- "third_party/protobuf/src/google/protobuf/io/printer.cc",
- "third_party/protobuf/src/google/protobuf/io/strtod.cc",
- "third_party/protobuf/src/google/protobuf/io/tokenizer.cc",
- "third_party/protobuf/src/google/protobuf/io/zero_copy_stream.cc",
- "third_party/protobuf/src/google/protobuf/io/zero_copy_stream_impl.cc",
- "third_party/protobuf/src/google/protobuf/io/zero_copy_stream_impl_lite.cc",
- "third_party/protobuf/src/google/protobuf/map.cc",
- "third_party/protobuf/src/google/protobuf/map_field.cc",
- "third_party/protobuf/src/google/protobuf/message.cc",
- "third_party/protobuf/src/google/protobuf/message_lite.cc",
- "third_party/protobuf/src/google/protobuf/parse_context.cc",
- "third_party/protobuf/src/google/protobuf/reflection_ops.cc",
- "third_party/protobuf/src/google/protobuf/repeated_field.cc",
- "third_party/protobuf/src/google/protobuf/repeated_ptr_field.cc",
- "third_party/protobuf/src/google/protobuf/service.cc",
- "third_party/protobuf/src/google/protobuf/source_context.pb.cc",
- "third_party/protobuf/src/google/protobuf/struct.pb.cc",
- "third_party/protobuf/src/google/protobuf/stubs/bytestream.cc",
- "third_party/protobuf/src/google/protobuf/stubs/common.cc",
- "third_party/protobuf/src/google/protobuf/stubs/int128.cc",
- "third_party/protobuf/src/google/protobuf/stubs/status.cc",
- "third_party/protobuf/src/google/protobuf/stubs/statusor.cc",
- "third_party/protobuf/src/google/protobuf/stubs/stringpiece.cc",
- "third_party/protobuf/src/google/protobuf/stubs/stringprintf.cc",
- "third_party/protobuf/src/google/protobuf/stubs/structurally_valid.cc",
- "third_party/protobuf/src/google/protobuf/stubs/strutil.cc",
- "third_party/protobuf/src/google/protobuf/stubs/substitute.cc",
- "third_party/protobuf/src/google/protobuf/stubs/time.cc",
- "third_party/protobuf/src/google/protobuf/text_format.cc",
- "third_party/protobuf/src/google/protobuf/timestamp.pb.cc",
- "third_party/protobuf/src/google/protobuf/type.pb.cc",
- "third_party/protobuf/src/google/protobuf/unknown_field_set.cc",
- "third_party/protobuf/src/google/protobuf/util/delimited_message_util.cc",
- "third_party/protobuf/src/google/protobuf/util/field_comparator.cc",
- "third_party/protobuf/src/google/protobuf/util/field_mask_util.cc",
- "third_party/protobuf/src/google/protobuf/util/internal/datapiece.cc",
- "third_party/protobuf/src/google/protobuf/util/internal/default_value_objectwriter.cc",
- "third_party/protobuf/src/google/protobuf/util/internal/error_listener.cc",
- "third_party/protobuf/src/google/protobuf/util/internal/field_mask_utility.cc",
- "third_party/protobuf/src/google/protobuf/util/internal/json_escaping.cc",
- "third_party/protobuf/src/google/protobuf/util/internal/json_objectwriter.cc",
- "third_party/protobuf/src/google/protobuf/util/internal/json_stream_parser.cc",
- "third_party/protobuf/src/google/protobuf/util/internal/object_writer.cc",
- "third_party/protobuf/src/google/protobuf/util/internal/proto_writer.cc",
- "third_party/protobuf/src/google/protobuf/util/internal/protostream_objectsource.cc",
- "third_party/protobuf/src/google/protobuf/util/internal/protostream_objectwriter.cc",
- "third_party/protobuf/src/google/protobuf/util/internal/type_info.cc",
- "third_party/protobuf/src/google/protobuf/util/internal/utility.cc",
- "third_party/protobuf/src/google/protobuf/util/json_util.cc",
- "third_party/protobuf/src/google/protobuf/util/message_differencer.cc",
- "third_party/protobuf/src/google/protobuf/util/time_util.cc",
- "third_party/protobuf/src/google/protobuf/util/type_resolver_util.cc",
- "third_party/protobuf/src/google/protobuf/wire_format.cc",
- "third_party/protobuf/src/google/protobuf/wire_format_lite.cc",
- "third_party/protobuf/src/google/protobuf/wrappers.pb.cc",
- ],
- shared_libs: [
- "libz",
- ],
- host_supported: true,
- device_supported: false,
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DCR_SYSROOT_KEY=20220331T153654Z-0",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DGOOGLE_PROTOBUF_INTERNAL_DONATE_STEAL_INLINE=0",
- "-DGOOGLE_PROTOBUF_NO_RTTI",
- "-DGOOGLE_PROTOBUF_NO_STATIC_INITIALIZER",
- "-DHAVE_PTHREAD",
- "-DHAVE_ZLIB",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-DUSE_AURA=1",
- "-DUSE_OZONE=1",
- "-DUSE_UDEV",
- "-D_FILE_OFFSET_BITS=64",
- "-D_GNU_SOURCE",
- "-D_LARGEFILE64_SOURCE",
- "-D_LARGEFILE_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-O2",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fstack-protector",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- "-msse3",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "third_party/protobuf/src/",
- ],
- cpp_std: "c++20",
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- ],
-}
-
-// GN: //third_party/protobuf:protobuf_lite
-cc_library_static {
- name: "cronet_aml_third_party_protobuf_protobuf_lite",
- srcs: [
- "third_party/protobuf/src/google/protobuf/any_lite.cc",
- "third_party/protobuf/src/google/protobuf/arena.cc",
- "third_party/protobuf/src/google/protobuf/arenastring.cc",
- "third_party/protobuf/src/google/protobuf/arenaz_sampler.cc",
- "third_party/protobuf/src/google/protobuf/extension_set.cc",
- "third_party/protobuf/src/google/protobuf/generated_enum_util.cc",
- "third_party/protobuf/src/google/protobuf/generated_message_tctable_lite.cc",
- "third_party/protobuf/src/google/protobuf/generated_message_util.cc",
- "third_party/protobuf/src/google/protobuf/implicit_weak_message.cc",
- "third_party/protobuf/src/google/protobuf/inlined_string_field.cc",
- "third_party/protobuf/src/google/protobuf/io/coded_stream.cc",
- "third_party/protobuf/src/google/protobuf/io/io_win32.cc",
- "third_party/protobuf/src/google/protobuf/io/strtod.cc",
- "third_party/protobuf/src/google/protobuf/io/zero_copy_stream.cc",
- "third_party/protobuf/src/google/protobuf/io/zero_copy_stream_impl.cc",
- "third_party/protobuf/src/google/protobuf/io/zero_copy_stream_impl_lite.cc",
- "third_party/protobuf/src/google/protobuf/map.cc",
- "third_party/protobuf/src/google/protobuf/message_lite.cc",
- "third_party/protobuf/src/google/protobuf/parse_context.cc",
- "third_party/protobuf/src/google/protobuf/repeated_field.cc",
- "third_party/protobuf/src/google/protobuf/repeated_ptr_field.cc",
- "third_party/protobuf/src/google/protobuf/stubs/bytestream.cc",
- "third_party/protobuf/src/google/protobuf/stubs/common.cc",
- "third_party/protobuf/src/google/protobuf/stubs/int128.cc",
- "third_party/protobuf/src/google/protobuf/stubs/status.cc",
- "third_party/protobuf/src/google/protobuf/stubs/statusor.cc",
- "third_party/protobuf/src/google/protobuf/stubs/stringpiece.cc",
- "third_party/protobuf/src/google/protobuf/stubs/stringprintf.cc",
- "third_party/protobuf/src/google/protobuf/stubs/structurally_valid.cc",
- "third_party/protobuf/src/google/protobuf/stubs/strutil.cc",
- "third_party/protobuf/src/google/protobuf/stubs/time.cc",
- "third_party/protobuf/src/google/protobuf/wire_format_lite.cc",
- ],
- shared_libs: [
- "liblog",
- ],
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DGOOGLE_PROTOBUF_INTERNAL_DONATE_STEAL_INLINE=0",
- "-DGOOGLE_PROTOBUF_NO_RTTI",
- "-DGOOGLE_PROTOBUF_NO_STATIC_INITIALIZER",
- "-DHAVE_PTHREAD",
- "-DHAVE_SYS_UIO_H",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-O2",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "third_party/protobuf/src/",
- ],
- cpp_std: "c++17",
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- ],
- target: {
- android_arm: {
- cflags: [
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-fstack-protector",
- "-msse3",
- ],
- },
- },
-}
-
-// GN: //third_party/protobuf:protobuf_lite__testing
-cc_library_static {
- name: "cronet_aml_third_party_protobuf_protobuf_lite__testing",
- srcs: [
- "third_party/protobuf/src/google/protobuf/any_lite.cc",
- "third_party/protobuf/src/google/protobuf/arena.cc",
- "third_party/protobuf/src/google/protobuf/arenastring.cc",
- "third_party/protobuf/src/google/protobuf/arenaz_sampler.cc",
- "third_party/protobuf/src/google/protobuf/extension_set.cc",
- "third_party/protobuf/src/google/protobuf/generated_enum_util.cc",
- "third_party/protobuf/src/google/protobuf/generated_message_tctable_lite.cc",
- "third_party/protobuf/src/google/protobuf/generated_message_util.cc",
- "third_party/protobuf/src/google/protobuf/implicit_weak_message.cc",
- "third_party/protobuf/src/google/protobuf/inlined_string_field.cc",
- "third_party/protobuf/src/google/protobuf/io/coded_stream.cc",
- "third_party/protobuf/src/google/protobuf/io/io_win32.cc",
- "third_party/protobuf/src/google/protobuf/io/strtod.cc",
- "third_party/protobuf/src/google/protobuf/io/zero_copy_stream.cc",
- "third_party/protobuf/src/google/protobuf/io/zero_copy_stream_impl.cc",
- "third_party/protobuf/src/google/protobuf/io/zero_copy_stream_impl_lite.cc",
- "third_party/protobuf/src/google/protobuf/map.cc",
- "third_party/protobuf/src/google/protobuf/message_lite.cc",
- "third_party/protobuf/src/google/protobuf/parse_context.cc",
- "third_party/protobuf/src/google/protobuf/repeated_field.cc",
- "third_party/protobuf/src/google/protobuf/repeated_ptr_field.cc",
- "third_party/protobuf/src/google/protobuf/stubs/bytestream.cc",
- "third_party/protobuf/src/google/protobuf/stubs/common.cc",
- "third_party/protobuf/src/google/protobuf/stubs/int128.cc",
- "third_party/protobuf/src/google/protobuf/stubs/status.cc",
- "third_party/protobuf/src/google/protobuf/stubs/statusor.cc",
- "third_party/protobuf/src/google/protobuf/stubs/stringpiece.cc",
- "third_party/protobuf/src/google/protobuf/stubs/stringprintf.cc",
- "third_party/protobuf/src/google/protobuf/stubs/structurally_valid.cc",
- "third_party/protobuf/src/google/protobuf/stubs/strutil.cc",
- "third_party/protobuf/src/google/protobuf/stubs/time.cc",
- "third_party/protobuf/src/google/protobuf/wire_format_lite.cc",
- ],
- shared_libs: [
- "liblog",
- ],
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DGOOGLE_PROTOBUF_INTERNAL_DONATE_STEAL_INLINE=0",
- "-DGOOGLE_PROTOBUF_NO_RTTI",
- "-DGOOGLE_PROTOBUF_NO_STATIC_INITIALIZER",
- "-DHAVE_PTHREAD",
- "-DHAVE_SYS_UIO_H",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-O2",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "third_party/protobuf/src/",
- ],
- cpp_std: "c++17",
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- ],
- target: {
- android_arm: {
- cflags: [
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-fstack-protector",
- "-msse3",
- ],
- },
- },
-}
-
-// GN: //third_party/protobuf:protoc
-cc_binary {
- name: "cronet_aml_third_party_protobuf_protoc",
- srcs: [
- "third_party/protobuf/src/google/protobuf/compiler/main.cc",
- ],
- shared_libs: [
- "libz",
- ],
- static_libs: [
- "cronet_aml_buildtools_third_party_libc___libc__",
- "cronet_aml_buildtools_third_party_libc__abi_libc__abi",
- "cronet_aml_third_party_protobuf_protobuf_full",
- "cronet_aml_third_party_protobuf_protoc_lib",
- ],
- host_supported: true,
- device_supported: false,
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DCR_SYSROOT_KEY=20220331T153654Z-0",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DGOOGLE_PROTOBUF_INTERNAL_DONATE_STEAL_INLINE=0",
- "-DGOOGLE_PROTOBUF_NO_RTTI",
- "-DGOOGLE_PROTOBUF_NO_STATIC_INITIALIZER",
- "-DHAVE_PTHREAD",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-DUSE_AURA=1",
- "-DUSE_OZONE=1",
- "-DUSE_UDEV",
- "-D_FILE_OFFSET_BITS=64",
- "-D_GNU_SOURCE",
- "-D_LARGEFILE64_SOURCE",
- "-D_LARGEFILE_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-O2",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fstack-protector",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- "-msse3",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "third_party/protobuf/src/",
- ],
- cpp_std: "c++20",
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- ],
-}
-
-// GN: //third_party/protobuf:protoc_lib
-cc_library_static {
- name: "cronet_aml_third_party_protobuf_protoc_lib",
- srcs: [
- "third_party/protobuf/src/google/protobuf/compiler/code_generator.cc",
- "third_party/protobuf/src/google/protobuf/compiler/command_line_interface.cc",
- "third_party/protobuf/src/google/protobuf/compiler/cpp/cpp_enum.cc",
- "third_party/protobuf/src/google/protobuf/compiler/cpp/cpp_enum_field.cc",
- "third_party/protobuf/src/google/protobuf/compiler/cpp/cpp_extension.cc",
- "third_party/protobuf/src/google/protobuf/compiler/cpp/cpp_field.cc",
- "third_party/protobuf/src/google/protobuf/compiler/cpp/cpp_file.cc",
- "third_party/protobuf/src/google/protobuf/compiler/cpp/cpp_generator.cc",
- "third_party/protobuf/src/google/protobuf/compiler/cpp/cpp_helpers.cc",
- "third_party/protobuf/src/google/protobuf/compiler/cpp/cpp_map_field.cc",
- "third_party/protobuf/src/google/protobuf/compiler/cpp/cpp_message.cc",
- "third_party/protobuf/src/google/protobuf/compiler/cpp/cpp_message_field.cc",
- "third_party/protobuf/src/google/protobuf/compiler/cpp/cpp_padding_optimizer.cc",
- "third_party/protobuf/src/google/protobuf/compiler/cpp/cpp_parse_function_generator.cc",
- "third_party/protobuf/src/google/protobuf/compiler/cpp/cpp_primitive_field.cc",
- "third_party/protobuf/src/google/protobuf/compiler/cpp/cpp_service.cc",
- "third_party/protobuf/src/google/protobuf/compiler/cpp/cpp_string_field.cc",
- "third_party/protobuf/src/google/protobuf/compiler/csharp/csharp_doc_comment.cc",
- "third_party/protobuf/src/google/protobuf/compiler/csharp/csharp_enum.cc",
- "third_party/protobuf/src/google/protobuf/compiler/csharp/csharp_enum_field.cc",
- "third_party/protobuf/src/google/protobuf/compiler/csharp/csharp_field_base.cc",
- "third_party/protobuf/src/google/protobuf/compiler/csharp/csharp_generator.cc",
- "third_party/protobuf/src/google/protobuf/compiler/csharp/csharp_helpers.cc",
- "third_party/protobuf/src/google/protobuf/compiler/csharp/csharp_map_field.cc",
- "third_party/protobuf/src/google/protobuf/compiler/csharp/csharp_message.cc",
- "third_party/protobuf/src/google/protobuf/compiler/csharp/csharp_message_field.cc",
- "third_party/protobuf/src/google/protobuf/compiler/csharp/csharp_primitive_field.cc",
- "third_party/protobuf/src/google/protobuf/compiler/csharp/csharp_reflection_class.cc",
- "third_party/protobuf/src/google/protobuf/compiler/csharp/csharp_repeated_enum_field.cc",
- "third_party/protobuf/src/google/protobuf/compiler/csharp/csharp_repeated_message_field.cc",
- "third_party/protobuf/src/google/protobuf/compiler/csharp/csharp_repeated_primitive_field.cc",
- "third_party/protobuf/src/google/protobuf/compiler/csharp/csharp_source_generator_base.cc",
- "third_party/protobuf/src/google/protobuf/compiler/csharp/csharp_wrapper_field.cc",
- "third_party/protobuf/src/google/protobuf/compiler/java/java_context.cc",
- "third_party/protobuf/src/google/protobuf/compiler/java/java_doc_comment.cc",
- "third_party/protobuf/src/google/protobuf/compiler/java/java_enum.cc",
- "third_party/protobuf/src/google/protobuf/compiler/java/java_enum_field.cc",
- "third_party/protobuf/src/google/protobuf/compiler/java/java_enum_field_lite.cc",
- "third_party/protobuf/src/google/protobuf/compiler/java/java_enum_lite.cc",
- "third_party/protobuf/src/google/protobuf/compiler/java/java_extension.cc",
- "third_party/protobuf/src/google/protobuf/compiler/java/java_extension_lite.cc",
- "third_party/protobuf/src/google/protobuf/compiler/java/java_field.cc",
- "third_party/protobuf/src/google/protobuf/compiler/java/java_file.cc",
- "third_party/protobuf/src/google/protobuf/compiler/java/java_generator.cc",
- "third_party/protobuf/src/google/protobuf/compiler/java/java_generator_factory.cc",
- "third_party/protobuf/src/google/protobuf/compiler/java/java_helpers.cc",
- "third_party/protobuf/src/google/protobuf/compiler/java/java_kotlin_generator.cc",
- "third_party/protobuf/src/google/protobuf/compiler/java/java_map_field.cc",
- "third_party/protobuf/src/google/protobuf/compiler/java/java_map_field_lite.cc",
- "third_party/protobuf/src/google/protobuf/compiler/java/java_message.cc",
- "third_party/protobuf/src/google/protobuf/compiler/java/java_message_builder.cc",
- "third_party/protobuf/src/google/protobuf/compiler/java/java_message_builder_lite.cc",
- "third_party/protobuf/src/google/protobuf/compiler/java/java_message_field.cc",
- "third_party/protobuf/src/google/protobuf/compiler/java/java_message_field_lite.cc",
- "third_party/protobuf/src/google/protobuf/compiler/java/java_message_lite.cc",
- "third_party/protobuf/src/google/protobuf/compiler/java/java_name_resolver.cc",
- "third_party/protobuf/src/google/protobuf/compiler/java/java_primitive_field.cc",
- "third_party/protobuf/src/google/protobuf/compiler/java/java_primitive_field_lite.cc",
- "third_party/protobuf/src/google/protobuf/compiler/java/java_service.cc",
- "third_party/protobuf/src/google/protobuf/compiler/java/java_shared_code_generator.cc",
- "third_party/protobuf/src/google/protobuf/compiler/java/java_string_field.cc",
- "third_party/protobuf/src/google/protobuf/compiler/java/java_string_field_lite.cc",
- "third_party/protobuf/src/google/protobuf/compiler/js/js_generator.cc",
- "third_party/protobuf/src/google/protobuf/compiler/js/well_known_types_embed.cc",
- "third_party/protobuf/src/google/protobuf/compiler/objectivec/objectivec_enum.cc",
- "third_party/protobuf/src/google/protobuf/compiler/objectivec/objectivec_enum_field.cc",
- "third_party/protobuf/src/google/protobuf/compiler/objectivec/objectivec_extension.cc",
- "third_party/protobuf/src/google/protobuf/compiler/objectivec/objectivec_field.cc",
- "third_party/protobuf/src/google/protobuf/compiler/objectivec/objectivec_file.cc",
- "third_party/protobuf/src/google/protobuf/compiler/objectivec/objectivec_generator.cc",
- "third_party/protobuf/src/google/protobuf/compiler/objectivec/objectivec_helpers.cc",
- "third_party/protobuf/src/google/protobuf/compiler/objectivec/objectivec_map_field.cc",
- "third_party/protobuf/src/google/protobuf/compiler/objectivec/objectivec_message.cc",
- "third_party/protobuf/src/google/protobuf/compiler/objectivec/objectivec_message_field.cc",
- "third_party/protobuf/src/google/protobuf/compiler/objectivec/objectivec_oneof.cc",
- "third_party/protobuf/src/google/protobuf/compiler/objectivec/objectivec_primitive_field.cc",
- "third_party/protobuf/src/google/protobuf/compiler/php/php_generator.cc",
- "third_party/protobuf/src/google/protobuf/compiler/plugin.cc",
- "third_party/protobuf/src/google/protobuf/compiler/plugin.pb.cc",
- "third_party/protobuf/src/google/protobuf/compiler/python/python_generator.cc",
- "third_party/protobuf/src/google/protobuf/compiler/python/python_helpers.cc",
- "third_party/protobuf/src/google/protobuf/compiler/python/python_pyi_generator.cc",
- "third_party/protobuf/src/google/protobuf/compiler/ruby/ruby_generator.cc",
- "third_party/protobuf/src/google/protobuf/compiler/subprocess.cc",
- "third_party/protobuf/src/google/protobuf/compiler/zip_writer.cc",
- ],
- shared_libs: [
- "libz",
- ],
- static_libs: [
- "cronet_aml_third_party_protobuf_protobuf_full",
- ],
- host_supported: true,
- device_supported: false,
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DCR_SYSROOT_KEY=20220331T153654Z-0",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DGOOGLE_PROTOBUF_INTERNAL_DONATE_STEAL_INLINE=0",
- "-DGOOGLE_PROTOBUF_NO_RTTI",
- "-DGOOGLE_PROTOBUF_NO_STATIC_INITIALIZER",
- "-DHAVE_PTHREAD",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-DUSE_AURA=1",
- "-DUSE_OZONE=1",
- "-DUSE_UDEV",
- "-D_FILE_OFFSET_BITS=64",
- "-D_GNU_SOURCE",
- "-D_LARGEFILE64_SOURCE",
- "-D_LARGEFILE_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-O2",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fstack-protector",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- "-msse3",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "third_party/protobuf/src/",
- ],
- cpp_std: "c++20",
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- ],
-}
-
-// GN: //url:buildflags
-cc_genrule {
- name: "cronet_aml_url_buildflags",
- cmd: "echo '--flags USE_PLATFORM_ICU_ALTERNATIVES=\"true\"' | " +
- "$(location build/write_buildflag_header.py) --output " +
- "$(out) " +
- "--rulename " +
- "//url:buildflags " +
- "--gen-dir " +
- ". " +
- "--definitions " +
- "/dev/stdin",
- out: [
- "url/buildflags.h",
- ],
- tool_files: [
- "build/write_buildflag_header.py",
- ],
- apex_available: [
- "com.android.tethering",
- ],
-}
-
-// GN: //url:buildflags__testing
-cc_genrule {
- name: "cronet_aml_url_buildflags__testing",
- cmd: "echo '--flags USE_PLATFORM_ICU_ALTERNATIVES=\"true\"' | " +
- "$(location build/write_buildflag_header.py) --output " +
- "$(out) " +
- "--rulename " +
- "//url:buildflags " +
- "--gen-dir " +
- ". " +
- "--definitions " +
- "/dev/stdin",
- out: [
- "url/buildflags.h",
- ],
- tool_files: [
- "build/write_buildflag_header.py",
- ],
- apex_available: [
- "com.android.tethering",
- ],
-}
-
-// GN: //url:url
-cc_library_static {
- name: "cronet_aml_url_url",
- srcs: [
- "url/gurl.cc",
- "url/origin.cc",
- "url/scheme_host_port.cc",
- "url/third_party/mozilla/url_parse.cc",
- "url/url_canon.cc",
- "url/url_canon_etc.cc",
- "url/url_canon_filesystemurl.cc",
- "url/url_canon_fileurl.cc",
- "url/url_canon_host.cc",
- "url/url_canon_internal.cc",
- "url/url_canon_ip.cc",
- "url/url_canon_mailtourl.cc",
- "url/url_canon_path.cc",
- "url/url_canon_pathurl.cc",
- "url/url_canon_query.cc",
- "url/url_canon_relative.cc",
- "url/url_canon_stdstring.cc",
- "url/url_canon_stdurl.cc",
- "url/url_constants.cc",
- "url/url_idna_icu_alternatives_android.cc",
- "url/url_parse_file.cc",
- "url/url_util.cc",
- ],
- shared_libs: [
- "libandroid",
- "liblog",
- ],
- static_libs: [
- "cronet_aml_base_allocator_partition_allocator_partition_alloc",
- "cronet_aml_base_base",
- "cronet_aml_base_base_static",
- "cronet_aml_base_nodebug_assertion",
- "cronet_aml_base_third_party_double_conversion_double_conversion",
- "cronet_aml_base_third_party_dynamic_annotations_dynamic_annotations",
- "cronet_aml_third_party_abseil_cpp_absl_base_base",
- "cronet_aml_third_party_abseil_cpp_absl_base_log_severity",
- "cronet_aml_third_party_abseil_cpp_absl_base_malloc_internal",
- "cronet_aml_third_party_abseil_cpp_absl_base_raw_logging_internal",
- "cronet_aml_third_party_abseil_cpp_absl_base_spinlock_wait",
- "cronet_aml_third_party_abseil_cpp_absl_base_strerror",
- "cronet_aml_third_party_abseil_cpp_absl_base_throw_delegate",
- "cronet_aml_third_party_abseil_cpp_absl_container_hashtablez_sampler",
- "cronet_aml_third_party_abseil_cpp_absl_container_raw_hash_set",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_debugging_internal",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_demangle_internal",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_examine_stack",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_failure_signal_handler",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_stacktrace",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_symbolize",
- "cronet_aml_third_party_abseil_cpp_absl_hash_city",
- "cronet_aml_third_party_abseil_cpp_absl_hash_hash",
- "cronet_aml_third_party_abseil_cpp_absl_hash_low_level_hash",
- "cronet_aml_third_party_abseil_cpp_absl_numeric_int128",
- "cronet_aml_third_party_abseil_cpp_absl_profiling_exponential_biased",
- "cronet_aml_third_party_abseil_cpp_absl_random_distributions",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_platform",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_pool_urbg",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_hwaes",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_hwaes_impl",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_slow",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_seed_material",
- "cronet_aml_third_party_abseil_cpp_absl_random_seed_gen_exception",
- "cronet_aml_third_party_abseil_cpp_absl_random_seed_sequences",
- "cronet_aml_third_party_abseil_cpp_absl_status_status",
- "cronet_aml_third_party_abseil_cpp_absl_status_statusor",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cord",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cord_internal",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_functions",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_handle",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_info",
- "cronet_aml_third_party_abseil_cpp_absl_strings_internal",
- "cronet_aml_third_party_abseil_cpp_absl_strings_str_format_internal",
- "cronet_aml_third_party_abseil_cpp_absl_strings_strings",
- "cronet_aml_third_party_abseil_cpp_absl_synchronization_graphcycles_internal",
- "cronet_aml_third_party_abseil_cpp_absl_synchronization_synchronization",
- "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_civil_time",
- "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_time_zone",
- "cronet_aml_third_party_abseil_cpp_absl_time_time",
- "cronet_aml_third_party_abseil_cpp_absl_types_bad_optional_access",
- "cronet_aml_third_party_abseil_cpp_absl_types_bad_variant_access",
- "cronet_aml_third_party_android_ndk_cpu_features",
- "cronet_aml_third_party_ashmem_ashmem",
- "cronet_aml_third_party_boringssl_boringssl",
- "cronet_aml_third_party_boringssl_boringssl_asm",
- "cronet_aml_third_party_icu_icui18n",
- "cronet_aml_third_party_icu_icuuc_private",
- "cronet_aml_third_party_libevent_libevent",
- "cronet_aml_third_party_modp_b64_modp_b64",
- ],
- generated_headers: [
- "cronet_aml_base_debugging_buildflags",
- "cronet_aml_base_logging_buildflags",
- "cronet_aml_build_chromeos_buildflags",
- "cronet_aml_url_buildflags",
- "cronet_aml_url_url_jni_headers",
- ],
- export_generated_headers: [
- "cronet_aml_base_debugging_buildflags",
- "cronet_aml_base_logging_buildflags",
- "cronet_aml_build_chromeos_buildflags",
- "cronet_aml_url_buildflags",
- "cronet_aml_url_url_jni_headers",
- ],
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DHAVE_SYS_UIO_H",
- "-DIS_URL_IMPL",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_FORTIFY_SOURCE=2",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D__STDC_CONSTANT_MACROS",
- "-D__STDC_FORMAT_MACROS",
- "-Oz",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "third_party/abseil-cpp/",
- "third_party/boringssl/src/include/",
- ],
- cpp_std: "c++17",
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- "-Wl,--script,external/cronet/base/android/library_loader/anchor_functions.lds",
- "-Wl,-wrap,asprintf",
- "-Wl,-wrap,calloc",
- "-Wl,-wrap,free",
- "-Wl,-wrap,getcwd",
- "-Wl,-wrap,malloc",
- "-Wl,-wrap,malloc_usable_size",
- "-Wl,-wrap,memalign",
- "-Wl,-wrap,posix_memalign",
- "-Wl,-wrap,pvalloc",
- "-Wl,-wrap,realloc",
- "-Wl,-wrap,realpath",
- "-Wl,-wrap,strdup",
- "-Wl,-wrap,strndup",
- "-Wl,-wrap,valloc",
- "-Wl,-wrap,vasprintf",
- ],
- target: {
- android_arm: {
- cflags: [
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-fstack-protector",
- "-msse3",
- ],
- },
- },
-}
-
-// GN: //url:url__testing
-cc_library_static {
- name: "cronet_aml_url_url__testing",
- srcs: [
- "url/gurl.cc",
- "url/origin.cc",
- "url/scheme_host_port.cc",
- "url/third_party/mozilla/url_parse.cc",
- "url/url_canon.cc",
- "url/url_canon_etc.cc",
- "url/url_canon_filesystemurl.cc",
- "url/url_canon_fileurl.cc",
- "url/url_canon_host.cc",
- "url/url_canon_internal.cc",
- "url/url_canon_ip.cc",
- "url/url_canon_mailtourl.cc",
- "url/url_canon_path.cc",
- "url/url_canon_pathurl.cc",
- "url/url_canon_query.cc",
- "url/url_canon_relative.cc",
- "url/url_canon_stdstring.cc",
- "url/url_canon_stdurl.cc",
- "url/url_constants.cc",
- "url/url_idna_icu_alternatives_android.cc",
- "url/url_parse_file.cc",
- "url/url_util.cc",
- ],
- shared_libs: [
- "libandroid",
- "liblog",
- ],
- static_libs: [
- "cronet_aml_base_allocator_partition_allocator_partition_alloc__testing",
- "cronet_aml_base_base__testing",
- "cronet_aml_base_base_static__testing",
- "cronet_aml_base_nodebug_assertion__testing",
- "cronet_aml_base_third_party_double_conversion_double_conversion__testing",
- "cronet_aml_base_third_party_dynamic_annotations_dynamic_annotations__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_base__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_log_severity__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_malloc_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_raw_logging_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_spinlock_wait__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_strerror__testing",
- "cronet_aml_third_party_abseil_cpp_absl_base_throw_delegate__testing",
- "cronet_aml_third_party_abseil_cpp_absl_container_hashtablez_sampler__testing",
- "cronet_aml_third_party_abseil_cpp_absl_container_raw_hash_set__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_debugging_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_demangle_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_examine_stack__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_failure_signal_handler__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_stacktrace__testing",
- "cronet_aml_third_party_abseil_cpp_absl_debugging_symbolize__testing",
- "cronet_aml_third_party_abseil_cpp_absl_hash_city__testing",
- "cronet_aml_third_party_abseil_cpp_absl_hash_hash__testing",
- "cronet_aml_third_party_abseil_cpp_absl_hash_low_level_hash__testing",
- "cronet_aml_third_party_abseil_cpp_absl_numeric_int128__testing",
- "cronet_aml_third_party_abseil_cpp_absl_profiling_exponential_biased__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_distributions__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_platform__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_pool_urbg__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_hwaes__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_hwaes_impl__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_randen_slow__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_internal_seed_material__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_seed_gen_exception__testing",
- "cronet_aml_third_party_abseil_cpp_absl_random_seed_sequences__testing",
- "cronet_aml_third_party_abseil_cpp_absl_status_status__testing",
- "cronet_aml_third_party_abseil_cpp_absl_status_statusor__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cord__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cord_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_functions__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_handle__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_cordz_info__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_str_format_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_strings_strings__testing",
- "cronet_aml_third_party_abseil_cpp_absl_synchronization_graphcycles_internal__testing",
- "cronet_aml_third_party_abseil_cpp_absl_synchronization_synchronization__testing",
- "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_civil_time__testing",
- "cronet_aml_third_party_abseil_cpp_absl_time_internal_cctz_time_zone__testing",
- "cronet_aml_third_party_abseil_cpp_absl_time_time__testing",
- "cronet_aml_third_party_abseil_cpp_absl_types_bad_optional_access__testing",
- "cronet_aml_third_party_abseil_cpp_absl_types_bad_variant_access__testing",
- "cronet_aml_third_party_android_ndk_cpu_features__testing",
- "cronet_aml_third_party_ashmem_ashmem__testing",
- "cronet_aml_third_party_boringssl_boringssl__testing",
- "cronet_aml_third_party_boringssl_boringssl_asm__testing",
- "cronet_aml_third_party_icu_icui18n__testing",
- "cronet_aml_third_party_icu_icuuc_private__testing",
- "cronet_aml_third_party_libevent_libevent__testing",
- "cronet_aml_third_party_modp_b64_modp_b64__testing",
- ],
- generated_headers: [
- "cronet_aml_base_debugging_buildflags__testing",
- "cronet_aml_base_logging_buildflags__testing",
- "cronet_aml_build_chromeos_buildflags__testing",
- "cronet_aml_url_buildflags__testing",
- "cronet_aml_url_url_jni_headers__testing",
- ],
- export_generated_headers: [
- "cronet_aml_base_debugging_buildflags__testing",
- "cronet_aml_base_logging_buildflags__testing",
- "cronet_aml_build_chromeos_buildflags__testing",
- "cronet_aml_url_buildflags__testing",
- "cronet_aml_url_url_jni_headers__testing",
- ],
- defaults: [
- "cronet_aml_defaults",
- ],
- cflags: [
- "-DANDROID",
- "-DANDROID_NDK_VERSION_ROLL=r23_1",
- "-DCR_CLANG_REVISION=\"llvmorg-16-init-6578-g0d30e92f-2\"",
- "-DCR_LIBCXX_REVISION=64d36e572d3f9719c5d75011a718f33f11126851",
- "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
- "-DHAVE_SYS_UIO_H",
- "-DIS_URL_IMPL",
- "-DNDEBUG",
- "-DNO_UNWIND_TABLES",
- "-DNVALGRIND",
- "-DOFFICIAL_BUILD",
- "-D_FORTIFY_SOURCE=2",
- "-D_GNU_SOURCE",
- "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
- "-D__STDC_CONSTANT_MACROS",
- "-D__STDC_FORMAT_MACROS",
- "-Oz",
- "-fdata-sections",
- "-ffunction-sections",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
- "-fvisibility-inlines-hidden",
- "-fvisibility=hidden",
- "-g1",
- ],
- local_include_dirs: [
- "./",
- "buildtools/third_party/libc++/",
- "buildtools/third_party/libc++/trunk/include",
- "buildtools/third_party/libc++abi/trunk/include",
- "third_party/abseil-cpp/",
- "third_party/boringssl/src/include/",
- ],
- cpp_std: "c++17",
- ldflags: [
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
- "-Wl,--script,external/cronet/base/android/library_loader/anchor_functions.lds",
- "-Wl,-wrap,asprintf",
- "-Wl,-wrap,calloc",
- "-Wl,-wrap,free",
- "-Wl,-wrap,getcwd",
- "-Wl,-wrap,malloc",
- "-Wl,-wrap,malloc_usable_size",
- "-Wl,-wrap,memalign",
- "-Wl,-wrap,posix_memalign",
- "-Wl,-wrap,pvalloc",
- "-Wl,-wrap,realloc",
- "-Wl,-wrap,realpath",
- "-Wl,-wrap,strdup",
- "-Wl,-wrap,strndup",
- "-Wl,-wrap,valloc",
- "-Wl,-wrap,vasprintf",
- ],
- target: {
- android_arm: {
- cflags: [
- "-fstack-protector",
- ],
- },
- android_arm64: {
- cflags: [
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- ],
- },
- android_x86: {
- cflags: [
- "-msse3",
- ],
- },
- android_x86_64: {
- cflags: [
- "-fstack-protector",
- "-msse3",
- ],
- },
- },
-}
-
-// GN: //url:url_jni_headers
-cc_genrule {
- name: "cronet_aml_url_url_jni_headers",
- srcs: [
- "url/android/java/src/org/chromium/url/IDNStringUtil.java",
- "url/android/java/src/org/chromium/url/Origin.java",
- ],
- cmd: "$(location base/android/jni_generator/jni_generator.py) --ptr_type " +
- "long " +
- "--output_dir " +
- "$(genDir)/url/url_jni_headers " +
- "--includes " +
- "base/android/jni_generator/jni_generator_helper.h " +
- "--use_proxy_hash " +
- "--output_name " +
- "IDNStringUtil_jni.h " +
- "--output_name " +
- "Origin_jni.h " +
- "--input_file " +
- "$(location url/android/java/src/org/chromium/url/IDNStringUtil.java) " +
- "--input_file " +
- "$(location url/android/java/src/org/chromium/url/Origin.java) " +
- "--package_prefix " +
- "android.net.http.internal",
- out: [
- "url/url_jni_headers/IDNStringUtil_jni.h",
- "url/url_jni_headers/Origin_jni.h",
- ],
- tool_files: [
- "base/android/jni_generator/android_jar.classes",
- "base/android/jni_generator/jni_generator.py",
- "build/android/gyp/util/__init__.py",
- "build/android/gyp/util/build_utils.py",
- "build/gn_helpers.py",
- ],
- apex_available: [
- "com.android.tethering",
- ],
-}
-
-// GN: //url:url_jni_headers__testing
-cc_genrule {
- name: "cronet_aml_url_url_jni_headers__testing",
- srcs: [
- "url/android/java/src/org/chromium/url/IDNStringUtil.java",
- "url/android/java/src/org/chromium/url/Origin.java",
- ],
- cmd: "$(location base/android/jni_generator/jni_generator.py) --ptr_type " +
- "long " +
- "--output_dir " +
- "$(genDir)/url/url_jni_headers " +
- "--includes " +
- "base/android/jni_generator/jni_generator_helper.h " +
- "--use_proxy_hash " +
- "--output_name " +
- "IDNStringUtil_jni.h " +
- "--output_name " +
- "Origin_jni.h " +
- "--input_file " +
- "$(location url/android/java/src/org/chromium/url/IDNStringUtil.java) " +
- "--input_file " +
- "$(location url/android/java/src/org/chromium/url/Origin.java)",
- out: [
- "url/url_jni_headers/IDNStringUtil_jni.h",
- "url/url_jni_headers/Origin_jni.h",
- ],
- tool_files: [
- "base/android/jni_generator/android_jar.classes",
- "base/android/jni_generator/jni_generator.py",
- "build/android/gyp/util/__init__.py",
- "build/android/gyp/util/build_utils.py",
- "build/gn_helpers.py",
- ],
- apex_available: [
- "com.android.tethering",
- ],
-}
-
-// GN: LICENSE
-license {
- name: "external_cronet_license",
- license_kinds: [
- "SPDX-license-identifier-AFL-2.0",
- "SPDX-license-identifier-Apache-2.0",
- "SPDX-license-identifier-BSD",
- "SPDX-license-identifier-BSL-1.0",
- "SPDX-license-identifier-ICU",
- "SPDX-license-identifier-ISC",
- "SPDX-license-identifier-MIT",
- "SPDX-license-identifier-MPL",
- "SPDX-license-identifier-MPL-1.1",
- "SPDX-license-identifier-MPL-2.0",
- "SPDX-license-identifier-NCSA",
- "SPDX-license-identifier-OpenSSL",
- "SPDX-license-identifier-Unicode-DFS",
- "legacy_unencumbered",
- ],
- license_text: [
- "LICENSE",
- "base/third_party/double_conversion/LICENSE",
- "base/third_party/dynamic_annotations/LICENSE",
- "base/third_party/icu/LICENSE",
- "base/third_party/nspr/LICENSE",
- "base/third_party/superfasthash/LICENSE",
- "base/third_party/symbolize/LICENSE",
- "base/third_party/valgrind/LICENSE",
- "base/third_party/xdg_user_dirs/LICENSE",
- "net/third_party/quiche/src/LICENSE",
- "net/third_party/uri_template/LICENSE",
- "third_party/abseil-cpp/LICENSE",
- "third_party/ashmem/LICENSE",
- "third_party/boringssl/src/LICENSE",
- "third_party/boringssl/src/third_party/fiat/LICENSE",
- "third_party/boringssl/src/third_party/googletest/LICENSE",
- "third_party/boringssl/src/third_party/wycheproof_testvectors/LICENSE",
- "third_party/brotli/LICENSE",
- "third_party/icu/LICENSE",
- "third_party/icu/scripts/LICENSE",
- "third_party/libevent/LICENSE",
- "third_party/metrics_proto/LICENSE",
- "third_party/modp_b64/LICENSE",
- "third_party/protobuf/LICENSE",
- "third_party/protobuf/third_party/utf8_range/LICENSE",
- ],
-}
-
diff --git a/tools/gn2bp/desc_arm.json b/tools/gn2bp/desc_arm.json
deleted file mode 100644
index 87b86e3..0000000
--- a/tools/gn2bp/desc_arm.json
+++ /dev/null
Binary files differ
diff --git a/tools/gn2bp/desc_arm64.json b/tools/gn2bp/desc_arm64.json
deleted file mode 100644
index 7b8bfe3..0000000
--- a/tools/gn2bp/desc_arm64.json
+++ /dev/null
Binary files differ
diff --git a/tools/gn2bp/desc_x64.json b/tools/gn2bp/desc_x64.json
deleted file mode 100644
index df8635a..0000000
--- a/tools/gn2bp/desc_x64.json
+++ /dev/null
Binary files differ
diff --git a/tools/gn2bp/desc_x86.json b/tools/gn2bp/desc_x86.json
deleted file mode 100644
index 707b9c7..0000000
--- a/tools/gn2bp/desc_x86.json
+++ /dev/null
Binary files differ
diff --git a/tools/gn2bp/gen_android_bp b/tools/gn2bp/gen_android_bp
deleted file mode 100755
index d714a90..0000000
--- a/tools/gn2bp/gen_android_bp
+++ /dev/null
@@ -1,1909 +0,0 @@
-#!/usr/bin/env python3
-# Copyright (C) 2022 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# This tool translates a collection of BUILD.gn files into a mostly equivalent
-# Android.bp file for the Android Soong build system. The input to the tool is a
-# JSON description of the GN build definition generated with the following
-# command:
-#
-# gn desc out --format=json --all-toolchains "//*" > desc.json
-#
-# The tool is then given a list of GN labels for which to generate Android.bp
-# build rules. The dependencies for the GN labels are squashed to the generated
-# Android.bp target, except for actions which get their own genrule. Some
-# libraries are also mapped to their Android equivalents -- see |builtin_deps|.
-
-import argparse
-import json
-import logging as log
-import operator
-import os
-import re
-import sys
-import copy
-from pathlib import Path
-
-import gn_utils
-
-ROOT_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
-
-# Default targets to translate to the blueprint file.
-DEFAULT_TARGETS = [
- '//components/cronet/android:cronet',
- '//components/cronet/android:cronet_android_mainline',
-]
-
-DEFAULT_TESTS = [
- '//components/cronet/android:cronet_unittests_android__library',
-]
-
-EXTRAS_ANDROID_BP_FILE = "Android.extras.bp"
-
-CRONET_API_MODULE_NAME = "cronet_aml_api_java"
-# Defines a custom init_rc argument to be applied to the corresponding output
-# blueprint target.
-target_initrc = {
- # TODO: this can probably be removed.
-}
-
-target_host_supported = [
- # TODO: remove if this is not useful for the cronet build.
-]
-
-# Proto target groups which will be made public.
-proto_groups = {
- # TODO: remove if this is not used for the cronet build.
-}
-
-# All module names are prefixed with this string to avoid collisions.
-module_prefix = 'cronet_aml_'
-
-# Shared libraries which are directly translated to Android system equivalents.
-shared_library_allowlist = [
- 'android',
- 'android.hardware.atrace@1.0',
- 'android.hardware.health@2.0',
- 'android.hardware.health-V1-ndk',
- 'android.hardware.power.stats@1.0',
- "android.hardware.power.stats-V1-cpp",
- 'base',
- 'binder',
- 'binder_ndk',
- 'cutils',
- 'hidlbase',
- 'hidltransport',
- 'hwbinder',
- 'incident',
- 'log',
- 'services',
- 'statssocket',
- "tracingproxy",
- 'utils',
-]
-
-# Static libraries which are directly translated to Android system equivalents.
-static_library_allowlist = [
- 'statslog_perfetto',
-]
-
-# Include directories that will be removed from all targets.
-local_include_dirs_denylist = [
- 'third_party/zlib/',
-]
-
-experimental_include_dirs_denylist = [
- 'third_party/brotli/include/',
-]
-
-# Name of the module which settings such as compiler flags for all other
-# modules.
-defaults_module = module_prefix + 'defaults'
-
-# Location of the project in the Android source tree.
-tree_path = 'external/cronet'
-
-# Path for the protobuf sources in the standalone build.
-buildtools_protobuf_src = '//buildtools/protobuf/src'
-
-# Location of the protobuf src dir in the Android source tree.
-android_protobuf_src = 'external/protobuf/src'
-
-# put all args on a new line for better diffs.
-NEWLINE = ' " +\n "'
-
-# Compiler flags which are passed through to the blueprint.
-cflag_allowlist = [
- # needed for zlib:zlib
- "-mpclmul",
- # needed for zlib:zlib
- "-mssse3",
- # needed for zlib:zlib
- "-msse3",
- # needed for zlib:zlib
- "-msse4.2",
- # flags to reduce binary size
- "-O1",
- "-O2",
- "-O3",
- "-Oz",
- "-g1",
- "-g2",
- "-fdata-sections",
- "-ffunction-sections",
- "-fvisibility=hidden",
- "-fvisibility-inlines-hidden",
- "-fstack-protector",
- "-mno-outline",
- "-mno-outline-atomics",
- "-fno-asynchronous-unwind-tables",
- "-fno-unwind-tables",
-]
-
-# Linker flags which are passed through to the blueprint.
-ldflag_allowlist = [
- # flags to reduce binary size
- "-Wl,--as-needed",
- "-Wl,--gc-sections",
- "-Wl,--icf=all",
-]
-
-def get_linker_script_ldflag(script_path):
- return f'-Wl,--script,{tree_path}/{script_path}'
-
-# Additional arguments to apply to Android.bp rules.
-additional_args = {
- 'cronet_aml_net_net': [
- ('export_static_lib_headers', {
- 'cronet_aml_net_third_party_quiche_quiche',
- 'cronet_aml_crypto_crypto',
- }),
- ],
- # TODO: fix upstream. Both //base:base and
- # //base/allocator/partition_allocator:partition_alloc do not create a
- # dependency on gtest despite using gtest_prod.h.
- 'cronet_aml_base_base': [
- ('header_libs', {
- 'libgtest_prod_headers',
- }),
- ('export_header_lib_headers', {
- 'libgtest_prod_headers',
- }),
- ],
- 'cronet_aml_base_allocator_partition_allocator_partition_alloc': [
- ('header_libs', {
- 'libgtest_prod_headers',
- }),
- ],
-}
-
-def enable_brotli(module, arch):
- # Requires crrev/c/4111690
- if arch is None:
- module.static_libs.add('libbrotli')
- else:
- module.arch[arch].static_libs.add('libbrotli')
-
-def enable_modp_b64(module, arch):
- # Requires crrev/c/4112845
- # Requires aosp/2359455
- # Requires aosp/2359456
- if not module.is_compiled():
- return
- if arch is None:
- module.static_libs.add('libmodpb64')
- else:
- module.arch[arch].static_libs.add('libmodpb64')
-
-def enable_zlib(module, arch):
- # Requires crrev/c/4109079
- if arch is None:
- module.shared_libs.add('libz')
- else:
- module.arch[arch].shared_libs.add('libz')
-
-# Android equivalents for third-party libraries that the upstream project
-# depends on.
-builtin_deps = {
- '//buildtools/third_party/libunwind:libunwind':
- lambda m, a: None, # disable libunwind
- '//buildtools/third_party/libunwind:libunwind__testing':
- lambda m, a: None, # disable libunwind
- '//net/data/ssl/chrome_root_store:gen_root_store_inc':
- lambda m, a: None,
- '//net/data/ssl/chrome_root_store:gen_root_store_inc__testing':
- lambda m, a: None,
- '//net/tools/root_store_tool:root_store_tool':
- lambda m, a: None,
- '//net/tools/root_store_tool:root_store_tool__testing':
- lambda m, a: None,
- '//third_party/zlib:zlib':
- enable_zlib,
- '//third_party/zlib:zlib__testing':
- enable_zlib,
-}
-
-experimental_android_deps = {
- '//third_party/brotli:common':
- enable_brotli,
- '//third_party/brotli:dec':
- enable_brotli,
- '//third_party/modp_b64:modp_b64':
- enable_modp_b64,
-}
-
-# Uncomment the following lines to use Android deps rather than their Chromium
-# equivalent:
-#builtin_deps.update(experimental_android_deps)
-#local_include_dirs_denylist.extend(experimental_include_dirs_denylist)
-
-# Name of tethering apex module
-tethering_apex = "com.android.tethering"
-
-# Name of cronet api target
-java_api_target_name = "//components/cronet/android:cronet_api_java"
-
-# ----------------------------------------------------------------------------
-# End of configuration.
-# ----------------------------------------------------------------------------
-
-
-class Error(Exception):
- pass
-
-
-class ThrowingArgumentParser(argparse.ArgumentParser):
-
- def __init__(self, context):
- super(ThrowingArgumentParser, self).__init__()
- self.context = context
-
- def error(self, message):
- raise Error('%s: %s' % (self.context, message))
-
-
-def write_blueprint_key_value(output, name, value, sort=True):
- """Writes a Blueprint key-value pair to the output"""
-
- if isinstance(value, bool):
- if value:
- output.append(' %s: true,' % name)
- else:
- output.append(' %s: false,' % name)
- return
- if not value:
- return
- if isinstance(value, set):
- value = sorted(value)
- if isinstance(value, list):
- output.append(' %s: [' % name)
- for item in sorted(value) if sort else value:
- output.append(' "%s",' % item)
- output.append(' ],')
- return
- if isinstance(value, Target):
- value.to_string(output)
- return
- if isinstance(value, dict):
- kv_output = []
- for k, v in value.items():
- write_blueprint_key_value(kv_output, k, v)
-
- output.append(' %s: {' % name)
- for line in kv_output:
- output.append(' %s' % line)
- output.append(' },')
- return
- output.append(' %s: "%s",' % (name, value))
-
-
-class Target(object):
- """A target-scoped part of a module"""
-
- def __init__(self, name):
- self.name = name
- self.srcs = set()
- self.shared_libs = set()
- self.static_libs = set()
- self.whole_static_libs = set()
- self.header_libs = set()
- self.cflags = set()
- self.dist = dict()
- self.strip = dict()
- self.stl = None
- self.cppflags = set()
- self.local_include_dirs = set()
- self.export_system_include_dirs = set()
- self.generated_headers = set()
- self.export_generated_headers = set()
- self.ldflags = set()
- self.compile_multilib = None
- if name == 'host':
- self.compile_multilib = '64'
-
- def to_string(self, output):
- nested_out = []
- self._output_field(nested_out, 'srcs')
- self._output_field(nested_out, 'shared_libs')
- self._output_field(nested_out, 'static_libs')
- self._output_field(nested_out, 'whole_static_libs')
- self._output_field(nested_out, 'header_libs')
- self._output_field(nested_out, 'cflags')
- self._output_field(nested_out, 'stl')
- self._output_field(nested_out, 'dist')
- self._output_field(nested_out, 'strip')
- self._output_field(nested_out, 'cppflags')
- self._output_field(nested_out, 'local_include_dirs')
- self._output_field(nested_out, 'export_system_include_dirs')
- self._output_field(nested_out, 'generated_headers')
- self._output_field(nested_out, 'export_generated_headers')
- self._output_field(nested_out, 'ldflags')
-
- if nested_out:
- # This is added here to make sure it doesn't add a `host` arch-specific module just for
- # `compile_multilib` flag.
- self._output_field(nested_out, 'compile_multilib')
- output.append(' %s: {' % self.name)
- for line in nested_out:
- output.append(' %s' % line)
- output.append(' },')
-
- def _output_field(self, output, name, sort=True):
- value = getattr(self, name)
- return write_blueprint_key_value(output, name, value, sort)
-
-
-class Module(object):
- """A single module (e.g., cc_binary, cc_test) in a blueprint."""
-
- def __init__(self, mod_type, name, gn_target):
- self.type = mod_type
- self.gn_target = gn_target
- self.name = name
- self.srcs = set()
- self.comment = 'GN: ' + gn_target
- self.shared_libs = set()
- self.static_libs = set()
- self.whole_static_libs = set()
- self.runtime_libs = set()
- self.tools = set()
- self.cmd = None
- self.host_supported = False
- self.device_supported = True
- self.vendor_available = False
- self.init_rc = set()
- self.out = set()
- self.export_include_dirs = set()
- self.generated_headers = set()
- self.export_generated_headers = set()
- self.export_static_lib_headers = set()
- self.export_header_lib_headers = set()
- self.defaults = set()
- self.cflags = set()
- self.include_dirs = set()
- self.local_include_dirs = set()
- self.header_libs = set()
- self.required = set()
- self.tool_files = set()
- # target contains a dict of Targets indexed by os_arch.
- # example: { 'android_x86': Target('android_x86')
- self.target = dict()
- self.target['android'] = Target('android')
- self.target['android_x86'] = Target('android_x86')
- self.target['android_x86_64'] = Target('android_x86_64')
- self.target['android_arm'] = Target('android_arm')
- self.target['android_arm64'] = Target('android_arm64')
- self.target['host'] = Target('host')
- self.stl = None
- self.cpp_std = None
- self.dist = dict()
- self.strip = dict()
- self.data = set()
- self.apex_available = set()
- self.min_sdk_version = None
- self.proto = dict()
- self.linker_scripts = set()
- self.ldflags = set()
- # The genrule_XXX below are properties that must to be propagated back
- # on the module(s) that depend on the genrule.
- self.genrule_headers = set()
- self.genrule_srcs = set()
- self.genrule_shared_libs = set()
- self.genrule_header_libs = set()
- self.version_script = None
- self.test_suites = set()
- self.test_config = None
- self.stubs = {}
- self.cppflags = set()
- self.rtti = False
- # Name of the output. Used for setting .so file name for libcronet
- self.libs = set()
- self.stem = None
- self.compile_multilib = None
- self.aidl = dict()
- self.plugins = set()
- self.processor_class = None
- self.sdk_version = None
- self.javacflags = set()
- self.license_kinds = set()
- self.license_text = set()
- self.default_applicable_licenses = set()
-
- def to_string(self, output):
- if self.comment:
- output.append('// %s' % self.comment)
- output.append('%s {' % self.type)
- self._output_field(output, 'name')
- self._output_field(output, 'srcs')
- self._output_field(output, 'shared_libs')
- self._output_field(output, 'static_libs')
- self._output_field(output, 'whole_static_libs')
- self._output_field(output, 'runtime_libs')
- self._output_field(output, 'tools')
- self._output_field(output, 'cmd', sort=False)
- if self.host_supported:
- self._output_field(output, 'host_supported')
- if not self.device_supported:
- self._output_field(output, 'device_supported')
- if self.vendor_available:
- self._output_field(output, 'vendor_available')
- self._output_field(output, 'init_rc')
- self._output_field(output, 'out')
- self._output_field(output, 'export_include_dirs')
- self._output_field(output, 'generated_headers')
- self._output_field(output, 'export_generated_headers')
- self._output_field(output, 'export_static_lib_headers')
- self._output_field(output, 'export_header_lib_headers')
- self._output_field(output, 'defaults')
- self._output_field(output, 'cflags')
- self._output_field(output, 'include_dirs')
- self._output_field(output, 'local_include_dirs')
- self._output_field(output, 'header_libs')
- self._output_field(output, 'required')
- self._output_field(output, 'dist')
- self._output_field(output, 'strip')
- self._output_field(output, 'tool_files')
- self._output_field(output, 'data')
- self._output_field(output, 'stl')
- self._output_field(output, 'cpp_std')
- self._output_field(output, 'apex_available')
- self._output_field(output, 'min_sdk_version')
- self._output_field(output, 'version_script')
- self._output_field(output, 'test_suites')
- self._output_field(output, 'test_config')
- self._output_field(output, 'stubs')
- self._output_field(output, 'proto')
- self._output_field(output, 'linker_scripts')
- self._output_field(output, 'ldflags')
- self._output_field(output, 'cppflags')
- self._output_field(output, 'libs')
- self._output_field(output, 'stem')
- self._output_field(output, 'compile_multilib')
- self._output_field(output, 'aidl')
- self._output_field(output, 'plugins')
- self._output_field(output, 'processor_class')
- self._output_field(output, 'sdk_version')
- self._output_field(output, 'javacflags')
- self._output_field(output, 'license_kinds')
- self._output_field(output, 'license_text')
- self._output_field(output, 'default_applicable_licenses')
- if self.rtti:
- self._output_field(output, 'rtti')
-
- target_out = []
- for arch, target in sorted(self.target.items()):
- # _output_field calls getattr(self, arch).
- setattr(self, arch, target)
- self._output_field(target_out, arch)
-
- if target_out:
- output.append(' target: {')
- for line in target_out:
- output.append(' %s' % line)
- output.append(' },')
-
- output.append('}')
- output.append('')
-
- def add_android_static_lib(self, lib):
- if self.type == 'cc_binary_host':
- raise Exception('Adding Android static lib for host tool is unsupported')
- elif self.host_supported:
- self.target['android'].static_libs.add(lib)
- else:
- self.static_libs.add(lib)
-
- def add_android_shared_lib(self, lib):
- if self.type == 'cc_binary_host':
- raise Exception('Adding Android shared lib for host tool is unsupported')
- elif self.host_supported:
- self.target['android'].shared_libs.add(lib)
- else:
- self.shared_libs.add(lib)
-
- def is_test(self):
- if gn_utils.TESTING_SUFFIX in self.name:
- name_without_prefix = self.name[:self.name.find(gn_utils.TESTING_SUFFIX)]
- return any([name_without_prefix == label_to_module_name(target) for target in DEFAULT_TESTS])
- return False
-
- def _output_field(self, output, name, sort=True):
- value = getattr(self, name)
- return write_blueprint_key_value(output, name, value, sort)
-
- def is_compiled(self):
- return self.type not in ('cc_genrule', 'filegroup', 'java_genrule')
-
- def is_genrule(self):
- return self.type == "cc_genrule"
-
- def has_input_files(self):
- if len(self.srcs) > 0:
- return True
- if any([len(target.srcs) > 0 for target in self.target.values()]):
- return True
- # Allow cc_static_library with export_generated_headers as those are crucial for
- # the depending modules
- return len(self.export_generated_headers) > 0
-
- def merge_attribute(self, key, source_module, allowed_archs, source_key = None):
- """
- Merges the value of the attribute `source_key` for the `dep_module` with
- the value of the attribute `key` for this module. If the value of the
- `source_key` is equal to None. Then `key` is used for both modules.
-
- This merges the attribute for both non-arch and archs
- specified in `allowed_archs`.
- :param key: The attribute used for merging in the calling module. Also
- used for `dep_module` if the `source_key` is None.
- :param source_module: The module where data is propagated from.
- :param allowed_archs: A list of archs to merge the attribute on.
- :param source_key: if the attribute merged from the `dep_module`
- is different from the `key`
- """
- if not source_key:
- source_key = key
- self.__dict__[key].update(source_module.__dict__[source_key])
- for arch_name in source_module.target.keys():
- if arch_name in allowed_archs:
- self.target[arch_name].__dict__[key].update(
- source_module.target[arch_name].__dict__[source_key])
-
-class Blueprint(object):
- """In-memory representation of an Android.bp file."""
-
- def __init__(self):
- self.modules = {}
-
- def add_module(self, module):
- """Adds a new module to the blueprint, replacing any existing module
- with the same name.
-
- Args:
- module: Module instance.
- """
- self.modules[module.name] = module
-
- def to_string(self, output):
- for m in sorted(self.modules.values(), key=lambda m: m.name):
- if m.type != "cc_library_static" or m.has_input_files():
- # Don't print cc_library_static with empty srcs. These attributes are already
- # propagated up the tree. Printing them messes the presubmits because
- # every module is compiled while those targets are not reachable in
- # a normal compilation path.
- m.to_string(output)
-
-
-def label_to_module_name(label):
- """Turn a GN label (e.g., //:perfetto_tests) into a module name."""
- module = re.sub(r'^//:?', '', label)
- module = re.sub(r'[^a-zA-Z0-9_]', '_', module)
-
- if not module.startswith(module_prefix):
- return module_prefix + module
- return module
-
-
-def is_supported_source_file(name):
- """Returns True if |name| can appear in a 'srcs' list."""
- return os.path.splitext(name)[1] in ['.c', '.cc', '.cpp', '.java', '.proto', '.S']
-
-
-def create_proto_modules(blueprint, gn, target):
- """Generate genrules for a proto GN target.
-
- GN actions are used to dynamically generate files during the build. The
- Soong equivalent is a genrule. This function turns a specific kind of
- genrule which turns .proto files into source and header files into a pair
- equivalent genrules.
-
- Args:
- blueprint: Blueprint instance which is being generated.
- target: gn_utils.Target object.
-
- Returns:
- The source_genrule module.
- """
- assert (target.type == 'proto_library')
-
- protoc_gn_target_name = gn.get_target('//third_party/protobuf:protoc').name
- protoc_module_name = label_to_module_name(protoc_gn_target_name)
- tools = {protoc_module_name}
- cpp_out_dir = '$(genDir)/%s/%s/' % (tree_path, target.proto_in_dir)
- target_module_name = label_to_module_name(target.name)
-
- # In GN builds the proto path is always relative to the output directory
- # (out/tmp.xxx).
- cmd = ['$(location %s)' % protoc_module_name]
- cmd += ['--proto_path=%s/%s' % (tree_path, target.proto_in_dir)]
-
- if buildtools_protobuf_src in target.proto_paths:
- cmd += ['--proto_path=%s' % android_protobuf_src]
-
- # We don't generate any targets for source_set proto modules because
- # they will be inlined into other modules if required.
- if target.proto_plugin == 'source_set':
- return None
-
- # Descriptor targets only generate a single target.
- if target.proto_plugin == 'descriptor':
- out = '{}.bin'.format(target_module_name)
-
- cmd += ['--descriptor_set_out=$(out)']
- cmd += ['$(in)']
-
- descriptor_module = Module('cc_genrule', target_module_name, target.name)
- descriptor_module.cmd = ' '.join(cmd)
- descriptor_module.out = [out]
- descriptor_module.tools = tools
- blueprint.add_module(descriptor_module)
-
- # Recursively extract the .proto files of all the dependencies and
- # add them to srcs.
- descriptor_module.srcs.update(
- gn_utils.label_to_path(src) for src in target.sources)
- for dep in target.transitive_proto_deps:
- current_target = gn.get_target(dep)
- descriptor_module.srcs.update(
- gn_utils.label_to_path(src) for src in current_target.sources)
-
- return descriptor_module
-
- # We create two genrules for each proto target: one for the headers and
- # another for the sources. This is because the module that depends on the
- # generated files needs to declare two different types of dependencies --
- # source files in 'srcs' and headers in 'generated_headers' -- and it's not
- # valid to generate .h files from a source dependency and vice versa.
- source_module_name = target_module_name + '_gen'
- source_module = Module('cc_genrule', source_module_name, target.name)
- blueprint.add_module(source_module)
- source_module.srcs.update(
- gn_utils.label_to_path(src) for src in target.sources)
-
- header_module = Module('cc_genrule', source_module_name + '_headers',
- target.name)
- blueprint.add_module(header_module)
- header_module.srcs = set(source_module.srcs)
-
- # TODO(primiano): at some point we should remove this. This was introduced
- # by aosp/1108421 when adding "protos/" to .proto include paths, in order to
- # avoid doing multi-repo changes and allow old clients in the android tree
- # to still do the old #include "perfetto/..." rather than
- # #include "protos/perfetto/...".
- header_module.export_include_dirs = {'.', 'protos'}
- # Since the .cc file and .h get created by a different gerule target, they
- # are not put in the same intermediate path, so local includes do not work
- # without explictily exporting the include dir.
- header_module.export_include_dirs.add(target.proto_in_dir)
-
- # This function does not return header_module so setting apex_available attribute here.
- header_module.apex_available.add(tethering_apex)
-
- source_module.genrule_srcs.add(':' + source_module.name)
- source_module.genrule_headers.add(header_module.name)
-
- if target.proto_plugin == 'proto':
- suffixes = ['pb']
- source_module.genrule_shared_libs.add('libprotobuf-cpp-lite')
- cmd += ['--cpp_out=lite=true:' + cpp_out_dir]
- elif target.proto_plugin == 'protozero':
- suffixes = ['pbzero']
- plugin = create_modules_from_target(blueprint, gn, protozero_plugin)
- tools.add(plugin.name)
- cmd += ['--plugin=protoc-gen-plugin=$(location %s)' % plugin.name]
- cmd += ['--plugin_out=wrapper_namespace=pbzero:' + cpp_out_dir]
- elif target.proto_plugin == 'cppgen':
- suffixes = ['gen']
- plugin = create_modules_from_target(blueprint, gn, cppgen_plugin)
- tools.add(plugin.name)
- cmd += ['--plugin=protoc-gen-plugin=$(location %s)' % plugin.name]
- cmd += ['--plugin_out=wrapper_namespace=gen:' + cpp_out_dir]
- elif target.proto_plugin == 'ipc':
- suffixes = ['ipc']
- plugin = create_modules_from_target(blueprint, gn, ipc_plugin)
- tools.add(plugin.name)
- cmd += ['--plugin=protoc-gen-plugin=$(location %s)' % plugin.name]
- cmd += ['--plugin_out=wrapper_namespace=gen:' + cpp_out_dir]
- else:
- raise Error('Unsupported proto plugin: %s' % target.proto_plugin)
-
- cmd += ['$(in)']
- source_module.cmd = ' '.join(cmd)
- header_module.cmd = source_module.cmd
- source_module.tools = tools
- header_module.tools = tools
-
- for sfx in suffixes:
- source_module.out.update('%s/%s' %
- (tree_path, src.replace('.proto', '.%s.cc' % sfx))
- for src in source_module.srcs)
- header_module.out.update('%s/%s' %
- (tree_path, src.replace('.proto', '.%s.h' % sfx))
- for src in header_module.srcs)
- return source_module
-
-
-def create_proto_group_modules(blueprint, gn, module_name, target_names):
- # TODO(lalitm): today, we're only adding a Java lite module because that's
- # the only one used in practice. In the future, if we need other target types
- # (e.g. C++, Java full etc.) add them here.
- bp_module_name = label_to_module_name(module_name) + '_java_protos'
- module = Module('java_library', bp_module_name, bp_module_name)
- module.comment = f'''GN: [{', '.join(target_names)}]'''
- module.proto = {'type': 'lite', 'canonical_path_from_root': False}
-
- for name in target_names:
- target = gn.get_target(name)
- module.srcs.update(gn_utils.label_to_path(src) for src in target.sources)
- for dep_label in target.transitive_proto_deps:
- dep = gn.get_target(dep_label)
- module.srcs.update(gn_utils.label_to_path(src) for src in dep.sources)
-
- blueprint.add_module(module)
-
-def create_gcc_preprocess_modules(blueprint, target):
- # gcc_preprocess.py internally execute host gcc which is not allowed in genrule.
- # So, this function create multiple modules and realize equivalent processing
- # TODO: Consider to support gcc_preprocess.py in different way
- # It's not great to have genrule and cc_object in the dependency from java_library
- assert (len(target.sources) == 1)
- source = list(target.sources)[0]
- assert (Path(source).suffix == '.template')
- stem = Path(source).stem
-
- bp_module_name = label_to_module_name(target.name)
-
- # Rename .template to .cc since cc_object does not accept .template file as srcs
- rename_module = Module('genrule', bp_module_name + '_rename', target.name)
- rename_module.srcs.add(gn_utils.label_to_path(source))
- rename_module.out.add(stem + '.cc')
- rename_module.cmd = 'cp $(in) $(out)'
- blueprint.add_module(rename_module)
-
- # Preprocess template file and generates java file
- preprocess_module = Module('cc_object', bp_module_name + '_preprocess', target.name)
- # -E: stop after preprocessing.
- # -P: disable line markers, i.e. '#line 309'
- preprocess_module.cflags.update(['-E', '-P', '-DANDROID'])
- preprocess_module.srcs.add(':' + rename_module.name)
- defines = ['-D' + target.args[i+1] for i, arg in enumerate(target.args) if arg == '--define']
- preprocess_module.cflags.update(defines)
- # HACK: Specifying compile_multilib to build cc_object only once.
- # Without this, soong complain to genrule that depends on cc_object when built for 64bit target.
- # It seems this is because cc object is a module with per-architecture variants and genrule is a
- # module with default variant. For 64bit target, cc_object is built multiple times for 32/64bit
- # modes and genrule doesn't know which one to depend on.
- preprocess_module.compile_multilib = 'first'
- blueprint.add_module(preprocess_module)
-
- # Generates srcjar using soong_zip
- module = Module('genrule', bp_module_name, target.name)
- module.srcs.add(':' + preprocess_module.name)
- module.out.add(stem + '.srcjar')
- module.cmd = NEWLINE.join([
- f'cp $(in) $(genDir)/{stem}.java &&',
- f'$(location soong_zip) -o $(out) -srcjar -C $(genDir) -f $(genDir)/{stem}.java'
- ])
- module.tools.add('soong_zip')
- blueprint.add_module(module)
- return module
-
-
-class BaseActionSanitizer():
- def __init__(self, target, arch):
- # Just to be on the safe side, create a deep-copy.
- self.target = copy.deepcopy(target)
- if arch:
- # Merge arch specific attributes
- self.target.sources |= arch.sources
- self.target.inputs |= arch.inputs
- self.target.outputs |= arch.outputs
- self.target.script = self.target.script or arch.script
- self.target.args = self.target.args or arch.args
- self.target.response_file_contents = \
- self.target.response_file_contents or arch.response_file_contents
- self.target.args = self._normalize_args()
-
- def get_name(self):
- return label_to_module_name(self.target.name)
-
- def _normalize_args(self):
- # Convert ['--param=value'] to ['--param', 'value'] for consistency.
- # Escape quotations.
- normalized_args = []
- for arg in self.target.args:
- arg = arg.replace('"', r'\"')
- if arg.startswith('-'):
- normalized_args.extend(arg.split('='))
- else:
- normalized_args.append(arg)
- return normalized_args
-
- # There are three types of args:
- # - flags (--flag)
- # - value args (--arg value)
- # - list args (--arg value1 --arg value2)
- # value args have exactly one arg value pair and list args have one or more arg value pairs.
- # Note that the set of list args contains the set of value args.
- # This is because list and value args are identical when the list args has only one arg value pair
- # Some functions provide special implementations for each type, while others
- # work on all of them.
- def _has_arg(self, arg):
- return arg in self.target.args
-
- def _get_arg_indices(self, target_arg):
- return [i for i, arg in enumerate(self.target.args) if arg == target_arg]
-
- # Whether an arg value pair appears once or more times
- def _is_list_arg(self, arg):
- indices = self._get_arg_indices(arg)
- return len(indices) > 0 and all([not self.target.args[i + 1].startswith('--') for i in indices])
-
- def _update_list_arg(self, arg, func, throw_if_absent = True):
- if self._should_fail_silently(arg, throw_if_absent):
- return
- assert(self._is_list_arg(arg))
- indices = self._get_arg_indices(arg)
- for i in indices:
- self._set_arg_at(i + 1, func(self.target.args[i + 1]))
-
- # Whether an arg value pair appears exactly once
- def _is_value_arg(self, arg):
- return operator.countOf(self.target.args, arg) == 1 and self._is_list_arg(arg)
-
- def _get_value_arg(self, arg):
- assert(self._is_value_arg(arg))
- i = self.target.args.index(arg)
- return self.target.args[i + 1]
-
- # used to check whether a function call should cause an error when an arg is
- # missing.
- def _should_fail_silently(self, arg, throw_if_absent):
- return not throw_if_absent and not self._has_arg(arg)
-
- def _set_value_arg(self, arg, value, throw_if_absent = True):
- if self._should_fail_silently(arg, throw_if_absent):
- return
- assert(self._is_value_arg(arg))
- i = self.target.args.index(arg)
- self.target.args[i + 1] = value
-
- def _update_value_arg(self, arg, func, throw_if_absent = True):
- if self._should_fail_silently(arg, throw_if_absent):
- return
- self._set_value_arg(arg, func(self._get_value_arg(arg)))
-
- def _set_arg_at(self, position, value):
- self.target.args[position] = value
-
- def _delete_value_arg(self, arg, throw_if_absent = True):
- if self._should_fail_silently(arg, throw_if_absent):
- return
- assert(self._is_value_arg(arg))
- i = self.target.args.index(arg)
- self.target.args.pop(i)
- self.target.args.pop(i)
-
- def _append_arg(self, arg, value):
- self.target.args.append(arg)
- self.target.args.append(value)
-
- def _sanitize_filepath_with_location_tag(self, arg):
- if arg.startswith('../../'):
- arg = self._sanitize_filepath(arg)
- arg = self._add_location_tag(arg)
- return arg
-
- # wrap filename in location tag.
- def _add_location_tag(self, filename):
- return '$(location %s)' % filename
-
- # applies common directory transformation that *should* be universally applicable.
- # TODO: verify if it actually *is* universally applicable.
- def _sanitize_filepath(self, filepath):
- # Careful, order matters!
- # delete all leading ../
- filepath = re.sub('^(\.\./)+', '', filepath)
- filepath = re.sub('^gen/jni_headers', '$(genDir)', filepath)
- filepath = re.sub('^gen', '$(genDir)', filepath)
- return filepath
-
- # Iterate through all the args and apply function
- def _update_all_args(self, func):
- self.target.args = [func(arg) for arg in self.target.args]
-
- def get_cmd(self):
- arg_string = NEWLINE.join(self.target.args)
- cmd = '$(location %s) %s' % (
- gn_utils.label_to_path(self.target.script), arg_string)
-
- if self.use_response_file:
- # Pipe response file contents into script
- cmd = 'echo \'%s\' |%s%s' % (self.target.response_file_contents, NEWLINE, cmd)
- return cmd
-
- def get_outputs(self):
- return self.target.outputs
-
- def get_srcs(self):
- # gn treats inputs and sources for actions equally.
- # soong only supports source files inside srcs, non-source files are added as
- # tool_files dependency.
- files = self.target.sources.union(self.target.inputs)
- return {gn_utils.label_to_path(file) for file in files if is_supported_source_file(file)}
-
- def get_tools(self):
- return set()
-
- def get_tool_files(self):
- # gn treats inputs and sources for actions equally.
- # soong only supports source files inside srcs, non-source files are added as
- # tool_files dependency.
- files = self.target.sources.union(self.target.inputs)
- tool_files = {gn_utils.label_to_path(file)
- for file in files if not is_supported_source_file(file)}
- tool_files.add(gn_utils.label_to_path(self.target.script))
- return tool_files
-
- def _sanitize_args(self):
- # Handle passing parameters via response file by piping them into the script
- # and reading them from /dev/stdin.
-
- self.use_response_file = gn_utils.RESPONSE_FILE in self.target.args
- if self.use_response_file:
- # Replace {{response_file_contents}} with /dev/stdin
- self.target.args = ['/dev/stdin' if it == gn_utils.RESPONSE_FILE else it
- for it in self.target.args]
-
- def _sanitize_outputs(self):
- pass
-
- def _sanitize_inputs(self):
- pass
-
- def sanitize(self):
- self._sanitize_args()
- self._sanitize_outputs()
- self._sanitize_inputs()
-
- # Whether this target generates header files
- def is_header_generated(self):
- return any(os.path.splitext(it)[1] == '.h' for it in self.target.outputs)
-
-class WriteBuildDateHeaderSanitizer(BaseActionSanitizer):
- def _sanitize_args(self):
- self._set_arg_at(0, '$(out)')
- super()._sanitize_args()
-
-class WriteBuildFlagHeaderSanitizer(BaseActionSanitizer):
- def _sanitize_args(self):
- self._set_value_arg('--gen-dir', '.')
- self._set_value_arg('--output', '$(out)')
- super()._sanitize_args()
-
-class GnRunBinary(BaseActionSanitizer):
- def __init__(self, target, arch):
- super().__init__(target, arch)
- self.binary_to_target = {
- "clang_x64/transport_security_state_generator":
- "cronet_aml_net_tools_transport_security_state_generator_transport_security_state_generator__testing",
- }
- self.binary = self.binary_to_target[self.target.args[0]]
-
- def _replace_gen_with_location_tag(self, arg):
- if arg.startswith("gen/"):
- return "$(location %s)" % arg.replace("gen/", "")
- return arg
-
- def _sanitize_args(self):
- self._update_all_args(self._sanitize_filepath_with_location_tag)
- self._update_all_args(self._replace_gen_with_location_tag)
- self._set_arg_at(0, '$(location %s)' % self.binary)
- super()._sanitize_args()
-
- def get_tools(self):
- tools = super().get_tools()
- tools.add(self.binary)
- return tools
-
- def get_cmd(self):
- # Remove the script and use the binary right away
- return NEWLINE.join(self.target.args)
-
-class JniGeneratorSanitizer(BaseActionSanitizer):
- def __init__(self, target, arch, is_test_target):
- self.is_test_target = is_test_target
- super().__init__(target, arch)
-
- def _add_location_tag_to_filepath(self, arg):
- if not arg.endswith('.class'):
- # --input_file supports both .class specifiers or source files as arguments.
- # Only source files need to be wrapped inside a $(location <label>) tag.
- arg = self._add_location_tag(arg)
- return arg
-
- def _sanitize_args(self):
- self._set_value_arg('--jar_file', '$(location :current_android_jar)', False)
- if self._has_arg('--jar_file'):
- self._append_arg('--javap', '$$(find $${OUT_DIR:-out}/.path -name javap)')
- self._update_value_arg('--output_dir', self._sanitize_filepath)
- self._update_value_arg('--includes', self._sanitize_filepath, False)
- self._delete_value_arg('--prev_output_dir', False)
- self._update_list_arg('--input_file', self._sanitize_filepath)
- self._update_list_arg('--input_file', self._add_location_tag_to_filepath)
- if not self.is_test_target:
- # Only jarjar platform code
- self._append_arg('--package_prefix', 'android.net.http.internal')
- super()._sanitize_args()
-
- def _sanitize_outputs(self):
- # fix target.output directory to match #include statements.
- self.target.outputs = {re.sub('^jni_headers/', '', out) for out in self.target.outputs}
- super()._sanitize_outputs()
-
- def get_tool_files(self):
- tool_files = super().get_tool_files()
- # android_jar.classes should be part of the tools as it list implicit classes
- # for the script to generate JNI headers.
- tool_files.add("base/android/jni_generator/android_jar.classes")
-
- # Filter android.jar and add :current_android_jar
- tool_files = {file if not file.endswith('android.jar') else ':current_android_jar'
- for file in tool_files }
- return tool_files
-
-class JniRegistrationGeneratorSanitizer(BaseActionSanitizer):
- def __init__(self, target, arch, is_test_target):
- self.is_test_target = is_test_target
- super().__init__(target, arch)
-
- def _sanitize_inputs(self):
- self.target.inputs = [file for file in self.target.inputs if not file.startswith('//out/')]
-
- def _sanitize_args(self):
- self._update_value_arg('--depfile', self._sanitize_filepath)
- self._update_value_arg('--srcjar-path', self._sanitize_filepath)
- self._update_value_arg('--header-path', self._sanitize_filepath)
- self._set_value_arg('--sources-files', '$(genDir)/java.sources')
- # update_jni_registration_module removes them from the srcs of the module
- # It might be better to remove sources by '--sources-exclusions'
- self._delete_value_arg('--sources-exclusions')
- if not self.is_test_target:
- # Only jarjar platform code
- self._append_arg('--package_prefix', 'android.net.http.internal')
- super()._sanitize_args()
-
- def get_cmd(self):
- # jni_registration_generator.py doesn't work with python2
- cmd = "python3 " + super().get_cmd()
- # Path in the original sources file does not work in genrule.
- # So creating sources file in cmd based on the srcs of this target.
- # Adding ../$(current_dir)/ to the head because jni_registration_generator.py uses the files
- # whose path startswith(..)
- commands = ["current_dir=`basename \\\`pwd\\\``;",
- "for f in $(in);",
- "do",
- "echo \\\"../$$current_dir/$$f\\\" >> $(genDir)/java.sources;",
- "done;",
- cmd]
-
- # .h file jni_registration_generator.py generates has #define with directory name.
- # With the genrule env that contains "." which is invalid. So replace that at the end of cmd.
- commands.append(";sed -i -e 's/OUT_SOONG_.TEMP_SBOX_.*_OUT/GEN/g' ")
- commands.append("$(genDir)/components/cronet/android/cronet_jni_registration.h")
- return NEWLINE.join(commands)
-
-class JavaJniRegistrationGeneratorSanitizer(JniRegistrationGeneratorSanitizer):
- def get_name(self):
- name = super().get_name() + "__java"
- if self.is_test_target:
- name += gn_utils.TESTING_SUFFIX
- return name
-
- def _sanitize_outputs(self):
- self.target.outputs = [out for out in self.target.outputs if
- out.endswith(".srcjar")]
- super()._sanitize_outputs()
-
-class VersionSanitizer(BaseActionSanitizer):
- def _sanitize_args(self):
- self._set_value_arg('-o', '$(out)')
- # args for the version.py contain file path without leading --arg key. So apply sanitize
- # function for all the args.
- self._update_all_args(self._sanitize_filepath_with_location_tag)
- self._set_value_arg('-e', "'%s'" % self._get_value_arg('-e'))
- super()._sanitize_args()
-
- def get_tool_files(self):
- tool_files = super().get_tool_files()
- # android_chrome_version.py is not specified in anywhere but version.py imports this file
- tool_files.add('build/util/android_chrome_version.py')
- return tool_files
-
-class JavaCppEnumSanitizer(BaseActionSanitizer):
- def _sanitize_args(self):
- self._update_all_args(self._sanitize_filepath_with_location_tag)
- self._set_value_arg('--srcjar', '$(out)')
- super()._sanitize_args()
-
-class MakeDafsaSanitizer(BaseActionSanitizer):
- def is_header_generated(self):
- # This script generates .cc files but they are #included by other sources
- # (e.g. registry_controlled_domain.cc)
- return True
-
-class JavaCppFeatureSanitizer(BaseActionSanitizer):
- def _sanitize_args(self):
- self._update_all_args(self._sanitize_filepath_with_location_tag)
- self._set_value_arg('--srcjar', '$(out)')
- super()._sanitize_args()
-
-class JavaCppStringSanitizer(BaseActionSanitizer):
- def _sanitize_args(self):
- self._update_all_args(self._sanitize_filepath_with_location_tag)
- self._set_value_arg('--srcjar', '$(out)')
- super()._sanitize_args()
-
-class WriteNativeLibrariesJavaSanitizer(BaseActionSanitizer):
- def _sanitize_args(self):
- self._set_value_arg('--output', '$(out)')
- super()._sanitize_args()
-
-def get_action_sanitizer(target, type, arch, is_test_target):
- if target.script == "//build/write_buildflag_header.py":
- return WriteBuildFlagHeaderSanitizer(target, arch)
- elif target.script == "//build/write_build_date_header.py":
- return WriteBuildDateHeaderSanitizer(target, arch)
- elif target.script == '//base/android/jni_generator/jni_generator.py':
- return JniGeneratorSanitizer(target, arch, is_test_target)
- elif target.script == '//base/android/jni_generator/jni_registration_generator.py':
- if type == 'java_genrule':
- return JavaJniRegistrationGeneratorSanitizer(target, arch, is_test_target)
- else:
- return JniRegistrationGeneratorSanitizer(target, arch, is_test_target)
- elif target.script == "//build/util/version.py":
- return VersionSanitizer(target, arch)
- elif target.script == "//build/android/gyp/java_cpp_enum.py":
- return JavaCppEnumSanitizer(target, arch)
- elif target.script == "//net/tools/dafsa/make_dafsa.py":
- return MakeDafsaSanitizer(target, arch)
- elif target.script == '//build/android/gyp/java_cpp_features.py':
- return JavaCppFeatureSanitizer(target, arch)
- elif target.script == '//build/android/gyp/java_cpp_strings.py':
- return JavaCppStringSanitizer(target, arch)
- elif target.script == '//build/android/gyp/write_native_libraries_java.py':
- return WriteNativeLibrariesJavaSanitizer(target, arch)
- elif target.script == '//build/gn_run_binary.py':
- return GnRunBinary(target, arch)
- else:
- # TODO: throw exception here once all script hacks have been converted.
- return BaseActionSanitizer(target, arch)
-
-def create_action_foreach_modules(blueprint, target, is_test_target):
- """ The following assumes that rebase_path exists in the args.
- The args of an action_foreach contains hints about which output files are generated
- by which source files.
- This is copied directly from the args
- "gen/net/base/registry_controlled_domains/{{source_name_part}}-reversed-inc.cc"
- So each source file will generate an output whose name is the {source_name-reversed-inc.cc}
- """
- new_args = []
- for i, src in enumerate(sorted(target.sources)):
- # don't add script arg for the first source -- create_action_module
- # already does this.
- if i != 0:
- new_args.append('&& python3 $(location %s)' %
- gn_utils.label_to_path(target.script))
- for arg in target.args:
- if '{{source}}' in arg:
- new_args.append('$(location %s)' % (gn_utils.label_to_path(src)))
- elif '{{source_name_part}}' in arg:
- source_name_part = src.split("/")[-1] # Get the file name only
- source_name_part = source_name_part.split(".")[0] # Remove the extension (Ex: .cc)
- file_name = arg.replace('{{source_name_part}}', source_name_part).split("/")[-1]
- # file_name represent the output file name. But we need the whole path
- # This can be found from target.outputs.
- for out in target.outputs:
- if out.endswith(file_name):
- new_args.append('$(location %s)' % out)
- else:
- new_args.append(arg)
-
- target.args = new_args
- return create_action_module(blueprint, target, 'cc_genrule', is_test_target)
-
-def create_action_module_internal(target, type, is_test_target, arch=None):
- sanitizer = get_action_sanitizer(target, type, arch, is_test_target)
- sanitizer.sanitize()
-
- module = Module(type, sanitizer.get_name(), target.name)
- module.cmd = sanitizer.get_cmd()
- module.out = sanitizer.get_outputs()
- if sanitizer.is_header_generated():
- module.genrule_headers.add(module.name)
- module.srcs = sanitizer.get_srcs()
- module.tool_files = sanitizer.get_tool_files()
- module.tools = sanitizer.get_tools()
-
- return module
-
-def get_cmd_condition(arch):
- '''
- :param arch: archtecture name e.g. android_x86_64, android_arm64
- :return: condition that can be used in cc_genrule cmd to switch the behavior based on arch
- '''
- if arch == "android_x86_64":
- return "( $$CC_ARCH == 'x86_64' && $$CC_OS == 'android' )"
- elif arch == "android_x86":
- return "( $$CC_ARCH == 'x86' && $$CC_OS == 'android' )"
- elif arch == "android_arm":
- return "( $$CC_ARCH == 'arm' && $$CC_OS == 'android' )"
- elif arch == "android_arm64":
- return "( $$CC_ARCH == 'arm64' && $$CC_OS == 'android' )"
- elif arch == "host":
- return "$$CC_OS != 'android'"
- else:
- raise Error(f'Unknown architecture type {arch}')
-
-def merge_cmd(modules, genrule_type):
- '''
- :param modules: dictionary whose key is arch name and value is module
- :param genrule_type: cc_genrule or java_genrule
- :return: merged command or common command if all the archs have the same command.
- '''
- commands = list({module.cmd for module in modules.values()})
- if len(commands) == 1:
- # If all the archs have the same command, return the command
- return commands[0]
-
- if genrule_type != 'cc_genrule':
- raise Error(f'{genrule_type} can not have different cmd between archs')
-
- merged_cmd = []
- for arch, module in modules.items():
- merged_cmd.append(f'if [[ {get_cmd_condition(arch)} ]];')
- merged_cmd.append('then')
- merged_cmd.append(module.cmd + ';')
- merged_cmd.append('fi;')
- return NEWLINE.join(merged_cmd)
-
-def merge_modules(modules, genrule_type):
- '''
- :param modules: dictionary whose key is arch name and value is module
- :param genrule_type: cc_genrule or java_genrule
- :return: merged module of input modules
- '''
- merged_module = list(modules.values())[0]
-
- # Following attributes must be the same between archs
- for key in ('out', 'genrule_headers', 'srcs', 'tool_files'):
- if any([getattr(merged_module, key) != getattr(module, key) for module in modules.values()]):
- raise Error(f'{merged_module.name} has different values for {key} between archs')
-
- merged_module.cmd = merge_cmd(modules, genrule_type)
- return merged_module
-
-def create_action_module(blueprint, target, genrule_type, is_test_target):
- '''
- Create module for action target and add to the blueprint. If target has arch specific attributes
- this function merge them and create a single module.
- :param blueprint:
- :param target: target which is converted to the module.
- :param genrule_type: cc_genrule or java_genrule
- :return: created module
- '''
- # TODO: Handle this target correctly, this target generates java_genrule but this target has
- # different value for cpu-family arg between archs
- if target.name in ['//build/android:native_libraries_gen',
- '//build/android:native_libraries_gen__testing']:
- module = create_action_module_internal(target, genrule_type, is_test_target, target.arch['android_arm'])
- blueprint.add_module(module)
- return module
-
- modules = {arch_name: create_action_module_internal(target, genrule_type, is_test_target, arch)
- for arch_name, arch in target.arch.items()}
- module = merge_modules(modules, genrule_type)
- blueprint.add_module(module)
- return module
-
-
-def _get_cflags(cflags, defines):
- cflags = {flag for flag in cflags if flag in cflag_allowlist}
- # Consider proper allowlist or denylist if needed
- cflags |= set("-D%s" % define.replace("\"", "\\\"") for define in defines)
- return cflags
-
-def _set_linker_script(module, libs):
- for lib in libs:
- if lib.endswith(".lds"):
- module.ldflags.add(get_linker_script_ldflag(gn_utils.label_to_path(lib)))
-
-def set_module_flags(module, module_type, cflags, defines, ldflags, libs):
- module.cflags.update(_get_cflags(cflags, defines))
- module.ldflags.update({flag for flag in ldflags
- if flag in ldflag_allowlist or flag.startswith("-Wl,-wrap,")})
- _set_linker_script(module, libs)
- # TODO: implement proper cflag parsing.
- for flag in cflags:
- if '-std=' in flag:
- module.cpp_std = flag[len('-std='):]
- if '-fexceptions' in flag:
- module.cppflags.add('-fexceptions')
-
-def set_module_include_dirs(module, cflags, include_dirs):
- for flag in cflags:
- if '-isystem' in flag:
- module.local_include_dirs.add(flag[len('-isystem../../'):])
-
- # Adding local_include_dirs is necessary due to source_sets / filegroups
- # which do not properly propagate include directories.
- # Filter any directory inside //out as a) this directory does not exist for
- # aosp / soong builds and b) the include directory should already be
- # configured via library dependency.
- module.local_include_dirs.update([gn_utils.label_to_path(d)
- for d in include_dirs if not d.startswith('//out')])
- # Remove prohibited include directories
- module.local_include_dirs = [d for d in module.local_include_dirs
- if d not in local_include_dirs_denylist]
-
-
-def create_modules_from_target(blueprint, gn, gn_target_name, is_test_target):
- """Generate module(s) for a given GN target.
-
- Given a GN target name, generate one or more corresponding modules into a
- blueprint. The only case when this generates >1 module is proto libraries.
-
- Args:
- blueprint: Blueprint instance which is being generated.
- gn: gn_utils.GnParser object.
- gn_target_name: GN target for module generation.
- """
- bp_module_name = label_to_module_name(gn_target_name)
- if bp_module_name in blueprint.modules:
- return blueprint.modules[bp_module_name]
- target = gn.get_target(gn_target_name)
- log.info('create modules for %s (%s)', target.name, target.type)
-
- if target.type == 'executable':
- if target.testonly:
- module_type = 'cc_test'
- else:
- # Can be used for both host and device targets.
- module_type = 'cc_binary'
- module = Module(module_type, bp_module_name, gn_target_name)
- elif target.type in ['static_library', 'source_set']:
- module = Module('cc_library_static', bp_module_name, gn_target_name)
- elif target.type == 'shared_library':
- module = Module('cc_library_shared', bp_module_name, gn_target_name)
- elif target.type == 'group':
- # "group" targets are resolved recursively by gn_utils.get_target().
- # There's nothing we need to do at this level for them.
- return None
- elif target.type == 'proto_library':
- module = create_proto_modules(blueprint, gn, target)
- if module is None:
- return None
- elif target.type == 'action':
- module = create_action_module(blueprint, target, 'cc_genrule', is_test_target)
- elif target.type == 'action_foreach':
- module = create_action_foreach_modules(blueprint, target, is_test_target)
- elif target.type == 'copy':
- # TODO: careful now! copy targets are not supported yet, but this will stop
- # traversing the dependency tree. For //base:base, this is not a big
- # problem as libicu contains the only copy target which happens to be a
- # leaf node.
- return None
- elif target.type == 'java_group':
- # Java targets are handled outside of create_modules_from_target.
- return None
- else:
- raise Error('Unknown target %s (%s)' % (target.name, target.type))
-
- blueprint.add_module(module)
- module.init_rc = target_initrc.get(target.name, [])
- module.srcs.update(gn_utils.label_to_path(src)
- for src in target.sources if is_supported_source_file(src))
-
- # Add arch-specific properties
- for arch_name, arch in target.arch.items():
- module.target[arch_name].srcs.update(gn_utils.label_to_path(src)
- for src in arch.sources if is_supported_source_file(src))
-
- module.rtti = target.rtti
-
- if target.type in gn_utils.LINKER_UNIT_TYPES:
- set_module_flags(module, module.type, target.cflags, target.defines, target.ldflags, target.libs)
- set_module_include_dirs(module, target.cflags, target.include_dirs)
- # TODO: set_module_xxx is confusing, apply similar function to module and target in better way.
- for arch_name, arch in target.arch.items():
- # TODO(aymanm): Make libs arch-specific.
- set_module_flags(module.target[arch_name], module.type,
- arch.cflags, arch.defines, arch.ldflags, [])
- # -Xclang -target-feature -Xclang +mte are used to enable MTE (Memory Tagging Extensions).
- # Flags which does not start with '-' could not be in the cflags so enabling MTE by
- # -march and -mcpu Feature Modifiers. MTE is only available on arm64. This is needed for
- # building //base/allocator/partition_allocator:partition_alloc for arm64.
- if '+mte' in arch.cflags and arch_name == 'android_arm64':
- module.target[arch_name].cflags.add('-march=armv8-a+memtag')
- set_module_include_dirs(module.target[arch_name], arch.cflags, arch.include_dirs)
-
- module.host_supported = target.host_supported()
- module.device_supported = target.device_supported()
-
- if module.is_genrule():
- module.apex_available.add(tethering_apex)
-
- if module.is_compiled():
- # Don't try to inject library/source dependencies into genrules or
- # filegroups because they are not compiled in the traditional sense.
- module.defaults = [defaults_module]
- for lib in target.libs:
- # Generally library names should be mangled as 'libXXX', unless they
- # are HAL libraries (e.g., android.hardware.health@2.0) or AIDL c++ / NDK
- # libraries (e.g. "android.hardware.power.stats-V1-cpp")
- android_lib = lib if '@' in lib or "-cpp" in lib or "-ndk" in lib \
- else 'lib' + lib
- if lib in shared_library_allowlist:
- module.add_android_shared_lib(android_lib)
- if lib in static_library_allowlist:
- module.add_android_static_lib(android_lib)
-
- # If the module is a static library, export all the generated headers.
- if module.type == 'cc_library_static':
- module.export_generated_headers = module.generated_headers
-
- if module.name == 'cronet_aml_components_cronet_android_cronet':
- if target.output_name is None:
- raise Error('Failed to get output_name for libcronet name')
- # .so file name needs to match with CronetLibraryLoader.java (e.g. libcronet.109.0.5386.0.so)
- # So setting the output name based on the output_name from the desc.json
- module.stem = 'lib' + target.output_name
-
- if module.is_test():
- # Tests output should be a shared library in the format of 'lib[module_name]'
- module.stem = 'lib' + target.get_target_name()[
- :target.get_target_name().find(gn_utils.TESTING_SUFFIX)]
-
- # dep_name is an unmangled GN target name (e.g. //foo:bar(toolchain)).
- # Currently, only one module is generated from target even target has multiple toolchains.
- # And module is generated based on the first visited target.
- # Sort deps before iteration to make result deterministic.
- all_deps = sorted(target.deps | target.source_set_deps | target.transitive_proto_deps)
- for dep_name in all_deps:
- # |builtin_deps| override GN deps with Android-specific ones. See the
- # config in the top of this file.
- if dep_name in builtin_deps:
- builtin_deps[dep_name](module, None)
- continue
-
- dep_module = create_modules_from_target(blueprint, gn, dep_name, is_test_target)
-
- if dep_module is None:
- continue
- # TODO: Proper dependency check for genrule.
- # Currently, only propagating genrule dependencies.
- # Also, currently, all the dependencies are propagated upwards.
- # in gn, public_deps should be propagated but deps should not.
- # Not sure this information is available in the desc.json.
- # Following rule works for adding android_runtime_jni_headers to base:base.
- # If this doesn't work for other target, hardcoding for specific target
- # might be better.
- if module.is_genrule() and dep_module.is_genrule():
- module.genrule_headers.add(dep_module.name)
- module.genrule_headers.update(dep_module.genrule_headers)
-
- # For filegroups, and genrule, recurse but don't apply the
- # deps.
- if not module.is_compiled() or module.is_genrule():
- continue
-
- # Drop compiled modules that doesn't provide any benefit. This is mostly
- # applicable to source_sets when converted to cc_static_library, sometimes
- # the source set only has header files which are dropped so the module becomes empty.
- if dep_module.is_compiled() and not dep_module.has_input_files():
- continue
-
- if dep_module.type == 'cc_library_shared':
- module.shared_libs.add(dep_module.name)
- elif dep_module.type == 'cc_library_static':
- module.static_libs.add(dep_module.name)
- elif dep_module.type == 'cc_genrule':
- module.merge_attribute('generated_headers', dep_module, [], 'genrule_headers')
- module.merge_attribute('srcs', dep_module, [], 'genrule_srcs')
- module.merge_attribute('shared_libs', dep_module, [], 'genrule_shared_libs')
- module.merge_attribute('header_libs', dep_module, [], 'genrule_header_libs')
- elif dep_module.type == 'cc_binary':
- continue # Ignore executables deps (used by cmdline integration tests).
- else:
- raise Error('Unknown dep %s (%s) for target %s' %
- (dep_module.name, dep_module.type, module.name))
-
- for arch_name, arch in target.arch.items():
- for dep_name in arch.deps:
- # |builtin_deps| override GN deps with Android-specific ones. See the
- # config in the top of this file.
- if dep_name in builtin_deps:
- builtin_deps[dep_name](module, arch_name)
- continue
- dep_module = create_modules_from_target(blueprint, gn, dep_name, is_test_target)
- # Arch-specific dependencies currently only include cc_library_static.
- # Revisit this approach once we need to support more target types.
- if dep_module.type == 'cc_library_static':
- if dep_module.has_input_files():
- module.target[arch_name].static_libs.add(dep_module.name)
- elif dep_module.type == 'cc_genrule':
- module.target[arch_name].generated_headers.update(dep_module.genrule_headers)
- module.target[arch_name].srcs.update(dep_module.genrule_srcs)
- module.target[arch_name].shared_libs.update(dep_module.genrule_shared_libs)
- module.target[arch_name].header_libs.update(dep_module.genrule_header_libs)
- else:
- raise Error('Unsupported arch-specific dependency %s of target %s with type %s' %
- (dep_module.name, target.name, dep_module.type))
- return module
-
-def create_java_jni_preprocessor(blueprint):
- bp_module_name = module_prefix + 'java_jni_annotation_preprocessor'
- module = Module('java_plugin', bp_module_name, '//base/android/jni_generator:jni_processor')
- module.srcs.update(
- [
- "base/android/jni_generator/java/src/org/chromium/jni_generator/JniProcessor.java",
- # Avoids a circular dependency with base:base_java. This is okay because
- # no target should ever expect to package an annotation processor.
- "build/android/java/src/org/chromium/build/annotations/CheckDiscard.java",
- "build/android/java/src/org/chromium/build/annotations/MainDex.java",
- "base/android/java/src/org/chromium/base/JniStaticTestMocker.java",
- "base/android/java/src/org/chromium/base/NativeLibraryLoadedStatus.java",
- "base/android/java/src/org/chromium/base/annotations/NativeMethods.java",
- "base/android/java/src/org/chromium/base/JniException.java",
- ":cronet_aml_build_android_build_config_gen",
- ])
- module.static_libs.update({
- "javapoet",
- "guava",
- "auto_service_annotations",
- })
- module.processor_class = "org.chromium.jni_generator.JniProcessor"
- blueprint.add_module(module)
- return module
-
-def get_java_sources(gn, predicate):
- java_sources = set()
- for target_name, sources in gn.java_sources.items():
- if predicate(target_name):
- java_sources.update(sources)
- return java_sources
-
-def get_java_actions(gn, predicate):
- java_actions = set()
- for target_name, actions in gn.java_actions.items():
- if predicate(target_name):
- java_actions.update(actions)
- return java_actions
-
-def get_non_api_java_sources(gn):
- return get_java_sources(gn, lambda name: name != java_api_target_name)
-
-def get_non_api_java_actions(gn):
- return get_java_actions(gn, lambda name: name != java_api_target_name)
-
-def get_api_java_sources(gn):
- return get_java_sources(gn, lambda name: name == java_api_target_name)
-
-def get_api_java_actions(gn):
- return get_java_actions(gn, lambda name: name == java_api_target_name)
-
-def create_java_module(blueprint, gn, is_test_target):
- bp_module_name = module_prefix + 'java'
- if is_test_target:
- bp_module_name += gn_utils.TESTING_SUFFIX
- module = Module('java_library', bp_module_name, '//gn:java')
- module.srcs.update([gn_utils.label_to_path(source) for source in get_non_api_java_sources(gn)])
- module.libs = {
- "androidx.annotation_annotation",
- "jsr305",
- "androidx.annotation_annotation-experimental-nodeps",
- "framework-connectivity.stubs.module_lib",
- "framework-connectivity-t.stubs.module_lib",
- "framework-tethering.stubs.module_lib",
- "framework-wifi.stubs.module_lib",
- "framework-mediaprovider.stubs.module_lib",
- }
- module.static_libs = {
- "modules-utils-build_system",
- }
- module.aidl["include_dirs"] = {"frameworks/base/core/java/"}
- module.aidl["local_include_dirs"] = gn.aidl_local_include_dirs
- module.sdk_version = "module_current"
- module.min_sdk_version = 30
- module.apex_available.add(tethering_apex)
- # TODO: support for this flag is removed upstream in crrev/c/4062652.
- # Consider reverting this change upstream, or worst-case downstream. As an
- # alternative hack, we could rename the generated file to not conflict. This
- # would be less likely to conflict with upstream changes if the revert is not
- # accepted.
- module.javacflags.add("-Aorg.chromium.chrome.skipGenJni")
- if not is_test_target:
- module.javacflags.add("-Apackage_prefix=android.net.http.internal")
- for dep in get_non_api_java_actions(gn):
- target = gn.get_target(dep)
- if target.script == '//build/android/gyp/gcc_preprocess.py':
- module.srcs.add(':' + create_gcc_preprocess_modules(blueprint, target).name)
- else:
- module.srcs.add(':' + create_action_module(blueprint, target, 'java_genrule', is_test_target).name)
- preprocessor_module = create_java_jni_preprocessor(blueprint)
- module.plugins.add(preprocessor_module.name)
- blueprint.add_module(module)
- return module
-
-def create_java_api_module(blueprint, gn):
- source_module = Module('filegroup', module_prefix + 'api_sources', java_api_target_name)
- # TODO add the API helpers separately after the main API is checked in and thoroughly reviewed
- source_module.srcs.update([gn_utils.label_to_path(source)
- for source in get_api_java_sources(gn)
- if "apihelpers" not in source])
- source_module.comment += "\n// TODO(danstahr): add the API helpers separately after the main" \
- " API is checked in and thoroughly reviewed"
- source_module.srcs.update([
- ':' + create_action_module(blueprint, gn.get_target(dep), 'java_genrule', False).name
- for dep in get_api_java_actions(gn)])
- blueprint.add_module(source_module)
- return source_module
-
-def update_jni_registration_module(module, gn):
- # TODO: java_sources might not contain all the required java files
- module.srcs.update([gn_utils.label_to_path(source)
- for source in get_non_api_java_sources(gn)
- if source.endswith('.java')])
-
-def create_blueprint_for_targets(gn, targets, test_targets):
- """Generate a blueprint for a list of GN targets."""
- blueprint = Blueprint()
-
- # Default settings used by all modules.
- defaults = Module('cc_defaults', defaults_module, '//gn:default_deps')
- defaults.cflags = [
- '-DGOOGLE_PROTOBUF_NO_RTTI',
- '-Wno-error=return-type',
- '-Wno-non-virtual-dtor',
- '-Wno-macro-redefined',
- '-Wno-missing-field-initializers',
- '-Wno-sign-compare',
- '-Wno-sign-promo',
- '-Wno-unused-parameter',
- '-Wno-null-pointer-subtraction', # Needed to libevent
- '-Wno-ambiguous-reversed-operator', # needed for icui18n
- '-Wno-unreachable-code-loop-increment', # needed for icui18n
- '-fPIC',
- '-Wno-c++11-narrowing',
- ]
- # Chromium builds do not add a dependency for headers found inside the
- # sysroot, so they are added globally via defaults.
- defaults.target['android'].header_libs = [
- 'jni_headers',
- ]
- defaults.target['android'].shared_libs = [
- 'libmediandk'
- ]
- defaults.target['host'].cflags = [
- # -DANDROID is added by default but target.defines contain -DANDROID if
- # it's required. So adding -UANDROID to cancel default -DANDROID if it's
- # not specified.
- # Note: -DANDROID is not consistently applied across the chromium code
- # base, so it is removed unconditionally for host targets.
- '-UANDROID',
- ]
- defaults.stl = 'none'
- defaults.cpp_std = 'c++17'
- defaults.min_sdk_version = 29
- defaults.apex_available.add(tethering_apex)
- blueprint.add_module(defaults)
-
- for target in targets:
- create_modules_from_target(blueprint, gn, target, is_test_target=False)
-
- for test_target in test_targets:
- create_modules_from_target(blueprint, gn, test_target + gn_utils.TESTING_SUFFIX, is_test_target=True)
-
- create_java_api_module(blueprint, gn)
- java_module = create_java_module(blueprint, gn, is_test_target=False)
- java_module.libs.add(CRONET_API_MODULE_NAME)
- java_module_testing = create_java_module(blueprint, gn, is_test_target=True)
- java_module_testing.libs.add(CRONET_API_MODULE_NAME)
- for module in blueprint.modules.values():
- if 'cronet_jni_registration' in module.name:
- update_jni_registration_module(module, gn)
-
- # Merge in additional hardcoded arguments.
- for module in blueprint.modules.values():
- for key, add_val in additional_args.get(module.name, []):
- curr = getattr(module, key)
- if add_val and isinstance(add_val, set) and isinstance(curr, set):
- curr.update(add_val)
- elif isinstance(add_val, str) and (not curr or isinstance(curr, str)):
- setattr(module, key, add_val)
- elif isinstance(add_val, bool) and (not curr or isinstance(curr, bool)):
- setattr(module, key, add_val)
- elif isinstance(add_val, dict) and isinstance(curr, dict):
- curr.update(add_val)
- elif isinstance(add_val, dict) and isinstance(curr, Target):
- curr.__dict__.update(add_val)
- else:
- raise Error('Unimplemented type %r of additional_args: %r' %
- (type(add_val), key))
-
- return blueprint
-
-def create_license_module(blueprint):
- module = Module("license", "external_cronet_license", "LICENSE")
- module.license_kinds.update({
- 'SPDX-license-identifier-MPL',
- 'SPDX-license-identifier-MPL-1.1',
- 'SPDX-license-identifier-ISC',
- 'SPDX-license-identifier-AFL-2.0',
- 'SPDX-license-identifier-MPL-2.0',
- 'SPDX-license-identifier-BSD',
- 'SPDX-license-identifier-Apache-2.0',
- 'SPDX-license-identifier-BSL-1.0',
- 'SPDX-license-identifier-Unicode-DFS',
- 'SPDX-license-identifier-NCSA',
- 'SPDX-license-identifier-OpenSSL',
- 'SPDX-license-identifier-MIT',
- "SPDX-license-identifier-ICU",
- 'legacy_unencumbered',
- })
- module.license_text.update({
- "LICENSE",
- "net/third_party/uri_template/LICENSE",
- "net/third_party/quiche/src/LICENSE",
- "base/third_party/symbolize/LICENSE",
- "base/third_party/superfasthash/LICENSE",
- "base/third_party/xdg_user_dirs/LICENSE",
- "base/third_party/double_conversion/LICENSE",
- "base/third_party/nspr/LICENSE",
- "base/third_party/dynamic_annotations/LICENSE",
- "base/third_party/icu/LICENSE",
- "base/third_party/valgrind/LICENSE",
- "third_party/brotli/LICENSE",
- "third_party/protobuf/LICENSE",
- "third_party/protobuf/third_party/utf8_range/LICENSE",
- "third_party/metrics_proto/LICENSE",
- "third_party/boringssl/src/LICENSE",
- "third_party/boringssl/src/third_party/googletest/LICENSE",
- "third_party/boringssl/src/third_party/wycheproof_testvectors/LICENSE",
- "third_party/boringssl/src/third_party/fiat/LICENSE",
- "third_party/libevent/LICENSE",
- "third_party/ashmem/LICENSE",
- "third_party/icu/LICENSE",
- "third_party/icu/scripts/LICENSE",
- "third_party/abseil-cpp/LICENSE",
- "third_party/modp_b64/LICENSE",
- })
- default_license = Module("package", "", "PACKAGE")
- default_license.default_applicable_licenses.add(module.name)
- blueprint.add_module(module)
- blueprint.add_module(default_license)
-
-def main():
- parser = argparse.ArgumentParser(
- description='Generate Android.bp from a GN description.')
- parser.add_argument(
- '--desc',
- help='GN description (e.g., gn desc out --format=json --all-toolchains "//*".' +
- 'You can specify multiple --desc options for different target_cpu',
- required=True,
- action='append'
- )
- parser.add_argument(
- '--extras',
- help='Extra targets to include at the end of the Blueprint file',
- default=os.path.join(gn_utils.repo_root(), 'Android.bp.extras'),
- )
- parser.add_argument(
- '--output',
- help='Blueprint file to create',
- default=os.path.join(gn_utils.repo_root(), 'Android.bp'),
- )
- parser.add_argument(
- '-v',
- '--verbose',
- help='Print debug logs.',
- action='store_true',
- )
- parser.add_argument(
- 'targets',
- nargs=argparse.REMAINDER,
- help='Targets to include in the blueprint (e.g., "//:perfetto_tests")'
- )
- args = parser.parse_args()
-
- if args.verbose:
- log.basicConfig(format='%(levelname)s:%(funcName)s:%(message)s', level=log.DEBUG)
-
- targets = args.targets or DEFAULT_TARGETS
- gn = gn_utils.GnParser(builtin_deps)
- for desc_file in args.desc:
- with open(desc_file) as f:
- desc = json.load(f)
- for target in targets:
- gn.parse_gn_desc(desc, target)
- for test_target in DEFAULT_TESTS:
- gn.parse_gn_desc(desc, test_target, is_test_target=True)
- blueprint = create_blueprint_for_targets(gn, targets, DEFAULT_TESTS)
- project_root = os.path.abspath(os.path.dirname(os.path.dirname(__file__)))
- tool_name = os.path.relpath(os.path.abspath(__file__), project_root)
-
- # Add any proto groups to the blueprint.
- for l_name, t_names in proto_groups.items():
- create_proto_group_modules(blueprint, gn, l_name, t_names)
- create_license_module(blueprint)
- output = [
- """// Copyright (C) 2022 The Android Open Source Project
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-//
-// This file is automatically generated by %s. Do not edit.
-
-build = ["Android.extras.bp"]
-""" % (tool_name)
- ]
- blueprint.to_string(output)
- if os.path.exists(args.extras):
- with open(args.extras, 'r') as r:
- for line in r:
- output.append(line.rstrip("\n\r"))
-
- out_files = []
-
- # Generate the Android.bp file.
- out_files.append(args.output + '.swp')
- with open(out_files[-1], 'w') as f:
- f.write('\n'.join(output))
- # Text files should have a trailing EOL.
- f.write('\n')
-
- return 0
-
-
-if __name__ == '__main__':
- sys.exit(main())
diff --git a/tools/gn2bp/gen_desc_json.sh b/tools/gn2bp/gen_desc_json.sh
deleted file mode 100755
index bf9b21d..0000000
--- a/tools/gn2bp/gen_desc_json.sh
+++ /dev/null
@@ -1,86 +0,0 @@
-#!/bin/bash
-set -x
-
-# Run this script inside a full chromium checkout.
-
-OUT_PATH="out/cronet"
-
-#######################################
-# Apply patches in external/cronet.
-# Globals:
-# ANDROID_BUILD_TOP
-# Arguments:
-# None
-#######################################
-function apply_patches() {
- local -r patch_root="${ANDROID_BUILD_TOP}/external/cronet/patches"
-
- local upstream_patches
- upstream_patches=$(ls "${patch_root}/upstream-next")
- local patch
- for patch in ${upstream_patches}; do
- git am --3way "${patch_root}/upstream-next/${patch}"
- done
-
- local local_patches
- local_patches=$(ls "${patch_root}/local")
- for patch in ${local_patches}; do
- git am --3way "${patch_root}/local/${patch}"
- done
-}
-
-#######################################
-# Generate desc.json for a specified architecture.
-# Globals:
-# OUT_PATH
-# Arguments:
-# target_cpu, string
-#######################################
-function gn_desc() {
- local -a gn_args=(
- "target_os = \"android\""
- "enable_websockets = false"
- "disable_file_support = true"
- "is_component_build = false"
- "use_crash_key_stubs = true"
- "use_partition_alloc = false"
- "include_transport_security_state_preload_list = false"
- "use_platform_icu_alternatives = true"
- "default_min_sdk_version = 19"
- "enable_reporting = true"
- "use_hashed_jni_names = true"
- "enable_base_tracing = false"
- "is_cronet_build = true"
- "is_debug = false"
- "is_official_build = true"
- "use_nss_certs = false"
- "clang_use_default_sample_profile = false"
- "media_use_ffmpeg=false"
- "use_thin_lto=false"
- "enable_resource_allowlist_generation=false"
- "enable_jdk_library_desugaring=false"
- "exclude_unwind_tables=true"
- "symbol_level=1"
- )
- gn_args+=("target_cpu = \"${1}\"")
-
- # Only set arm_use_neon on arm architectures to prevent warning from being
- # written to json output.
- if [[ "$1" = "arm" ]]; then
- gn_args+=("arm_use_neon = false")
- fi
-
- # Configure gn args.
- gn gen "${OUT_PATH}" --args="${gn_args[*]}"
-
- # Generate desc.json.
- local -r out_file="desc_${1}.json"
- gn desc "${OUT_PATH}" --format=json --all-toolchains "//*" > "${out_file}"
-}
-
-apply_patches
-gn_desc x86
-gn_desc x64
-gn_desc arm
-gn_desc arm64
-
diff --git a/tools/gn2bp/gn_utils.py b/tools/gn2bp/gn_utils.py
deleted file mode 100644
index 4066673..0000000
--- a/tools/gn2bp/gn_utils.py
+++ /dev/null
@@ -1,542 +0,0 @@
-# Copyright (C) 2022 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# A collection of utilities for extracting build rule information from GN
-# projects.
-
-import copy
-import json
-import logging as log
-import os
-import re
-import collections
-
-BUILDFLAGS_TARGET = '//gn:gen_buildflags'
-GEN_VERSION_TARGET = '//src/base:version_gen_h'
-LINKER_UNIT_TYPES = ('executable', 'shared_library', 'static_library', 'source_set')
-JAVA_BANNED_SCRIPTS = [
- "//build/android/gyp/turbine.py",
- "//build/android/gyp/compile_java.py",
- "//build/android/gyp/filter_zip.py",
- "//build/android/gyp/dex.py",
- "//build/android/gyp/write_build_config.py",
- "//build/android/gyp/create_r_java.py",
- "//build/android/gyp/ijar.py",
- "//build/android/gyp/create_r_java.py",
- "//build/android/gyp/bytecode_processor.py",
- "//build/android/gyp/prepare_resources.py",
- "//build/android/gyp/aar.py",
- "//build/android/gyp/zip.py",
-]
-# TODO(primiano): investigate these, they require further componentization.
-ODR_VIOLATION_IGNORE_TARGETS = {
- '//test/cts:perfetto_cts_deps',
- '//:perfetto_integrationtests',
-}
-ARCH_REGEX = r'(android_x86_64|android_x86|android_arm|android_arm64|host)'
-RESPONSE_FILE = '{{response_file_name}}'
-TESTING_SUFFIX = "__testing"
-AIDL_INCLUDE_DIRS_REGEX = r'--includes=\[(.*)\]'
-
-def repo_root():
- """Returns an absolute path to the repository root."""
- return os.path.join(
- os.path.realpath(os.path.dirname(__file__)), os.path.pardir)
-
-
-def _clean_string(str):
- return str.replace('\\', '').replace('../../', '').replace('"', '').strip()
-
-
-def _extract_includes_from_aidl_args(args):
- for arg in args:
- is_match = re.match(AIDL_INCLUDE_DIRS_REGEX, arg)
- if is_match:
- local_includes = is_match.group(1).split(",")
- return [_clean_string(local_include) for local_include in local_includes]
- return []
-
-def label_to_path(label):
- """Turn a GN output label (e.g., //some_dir/file.cc) into a path."""
- assert label.startswith('//')
- return label[2:] or "./"
-
-
-def label_without_toolchain(label):
- """Strips the toolchain from a GN label.
-
- Return a GN label (e.g //buildtools:protobuf(//gn/standalone/toolchain:
- gcc_like_host) without the parenthesised toolchain part.
- """
- return label.split('(')[0]
-
-
-def label_to_target_name_with_path(label):
- """
- Turn a GN label into a target name involving the full path.
- e.g., //src/perfetto:tests -> src_perfetto_tests
- """
- name = re.sub(r'^//:?', '', label)
- name = re.sub(r'[^a-zA-Z0-9_]', '_', name)
- return name
-
-def _is_java_source(src):
- return os.path.splitext(src)[1] == '.java' and not src.startswith("//out/")
-
-def is_java_action(script, outputs):
- return (script != "" and script not in JAVA_BANNED_SCRIPTS) and any(
- [file.endswith(".srcjar") or file.endswith(".java")
- for file in outputs])
-
-class GnParser(object):
- """A parser with some cleverness for GN json desc files
-
- The main goals of this parser are:
- 1) Deal with the fact that other build systems don't have an equivalent
- notion to GN's source_set. Conversely to Bazel's and Soong's filegroups,
- GN source_sets expect that dependencies, cflags and other source_set
- properties propagate up to the linker unit (static_library, executable or
- shared_library). This parser simulates the same behavior: when a
- source_set is encountered, some of its variables (cflags and such) are
- copied up to the dependent targets. This is to allow gen_xxx to create
- one filegroup for each source_set and then squash all the other flags
- onto the linker unit.
- 2) Detect and special-case protobuf targets, figuring out the protoc-plugin
- being used.
- """
-
- class Target(object):
- """Reperesents A GN target.
-
- Maked properties are propagated up the dependency chain when a
- source_set dependency is encountered.
- """
- class Arch():
- """Architecture-dependent properties
- """
- def __init__(self):
- self.sources = set()
- self.cflags = set()
- self.defines = set()
- self.include_dirs = set()
- self.deps = set()
- self.transitive_static_libs_deps = set()
- self.source_set_deps = set()
- self.ldflags = set()
-
- # These are valid only for type == 'action'
- self.inputs = set()
- self.outputs = set()
- self.args = []
- self.script = ''
- self.response_file_contents = ''
-
- def __init__(self, name, type):
- self.name = name # e.g. //src/ipc:ipc
-
- VALID_TYPES = ('static_library', 'shared_library', 'executable', 'group',
- 'action', 'source_set', 'proto_library', 'copy', 'action_foreach')
- assert (type in VALID_TYPES)
- self.type = type
- self.testonly = False
- self.toolchain = None
-
- # These are valid only for type == proto_library.
- # This is typically: 'proto', 'protozero', 'ipc'.
- self.proto_plugin = None
- self.proto_paths = set()
- self.proto_exports = set()
- self.proto_in_dir = ""
-
- self.sources = set()
- # TODO(primiano): consider whether the public section should be part of
- # bubbled-up sources.
- self.public_headers = set() # 'public'
-
- # These are valid only for type == 'action'
- self.inputs = set()
- self.outputs = set()
- self.script = ''
- self.args = []
- self.response_file_contents = ''
-
- # These variables are propagated up when encountering a dependency
- # on a source_set target.
- self.cflags = set()
- self.defines = set()
- self.deps = set()
- self.libs = set()
- self.include_dirs = set()
- self.ldflags = set()
- self.source_set_deps = set() # Transitive set of source_set deps.
- self.proto_deps = set()
- self.transitive_proto_deps = set()
- self.rtti = False
-
- # TODO: come up with a better way to only run this once.
- # is_finalized tracks whether finalize() was called on this target.
- self.is_finalized = False
- self.arch = dict()
-
- # This is used to get the name/version of libcronet
- self.output_name = None
-
- def host_supported(self):
- return 'host' in self.arch
-
- def device_supported(self):
- return any([name.startswith('android') for name in self.arch.keys()])
-
- def is_linker_unit_type(self):
- return self.type in LINKER_UNIT_TYPES
-
- def __lt__(self, other):
- if isinstance(other, self.__class__):
- return self.name < other.name
- raise TypeError(
- '\'<\' not supported between instances of \'%s\' and \'%s\'' %
- (type(self).__name__, type(other).__name__))
-
- def __repr__(self):
- return json.dumps({
- k: (list(sorted(v)) if isinstance(v, set) else v)
- for (k, v) in self.__dict__.items()
- },
- indent=4,
- sort_keys=True)
-
- def update(self, other, arch):
- for key in ('cflags', 'defines', 'deps', 'include_dirs', 'ldflags',
- 'source_set_deps', 'proto_deps', 'transitive_proto_deps',
- 'libs', 'proto_paths'):
- self.__dict__[key].update(other.__dict__.get(key, []))
-
- for key_in_arch in ('cflags', 'defines', 'include_dirs', 'source_set_deps', 'ldflags'):
- self.arch[arch].__dict__[key_in_arch].update(
- other.arch[arch].__dict__.get(key_in_arch, []))
-
- def _finalize_set_attribute(self, key):
- # Target contains the intersection of arch-dependent properties
- getattr(self, key)\
- .update(set.intersection(*[getattr(arch, key) for arch in self.arch.values()]))
-
- # Deduplicate arch-dependent properties
- for arch in self.arch.values():
- getattr(arch, key).difference_update(getattr(self, key))
-
- def _finalize_non_set_attribute(self, key):
- # Only when all the arch has the same non empty value, move the value to the target common
- val = getattr(list(self.arch.values())[0], key)
- if val and all([val == getattr(arch, key) for arch in self.arch.values()]):
- setattr(self, key, copy.deepcopy(val))
- for arch in self.arch.values():
- getattr(arch, key, None)
-
- def _finalize_attribute(self, key):
- val = getattr(self, key)
- if isinstance(val, set):
- self._finalize_set_attribute(key)
- elif isinstance(val, (list, str)):
- self._finalize_non_set_attribute(key)
- else:
- raise TypeError(f'Unsupported type: {type(val)}')
-
- def finalize(self):
- """Move common properties out of arch-dependent subobjects to Target object.
-
- TODO: find a better name for this function.
- """
- if self.is_finalized:
- return
- self.is_finalized = True
-
- if len(self.arch) == 0:
- return
-
- for key in ('sources', 'cflags', 'defines', 'include_dirs', 'deps', 'source_set_deps',
- 'inputs', 'outputs', 'args', 'script', 'response_file_contents', 'ldflags'):
- self._finalize_attribute(key)
-
- def get_target_name(self):
- return self.name[self.name.find(":") + 1:]
-
-
- def __init__(self, builtin_deps):
- self.builtin_deps = builtin_deps
- self.all_targets = {}
- self.linker_units = {} # Executables, shared or static libraries.
- self.source_sets = {}
- self.actions = {}
- self.proto_libs = {}
- self.java_sources = collections.defaultdict(set)
- self.aidl_local_include_dirs = set()
- self.java_actions = collections.defaultdict(set)
-
- def _get_response_file_contents(self, action_desc):
- # response_file_contents are formatted as:
- # ['--flags', '--flag=true && false'] and need to be formatted as:
- # '--flags --flag=\"true && false\"'
- flags = action_desc.get('response_file_contents', [])
- formatted_flags = []
- for flag in flags:
- if '=' in flag:
- key, val = flag.split('=')
- formatted_flags.append('%s=\\"%s\\"' % (key, val))
- else:
- formatted_flags.append(flag)
-
- return ' '.join(formatted_flags)
-
- def _is_java_group(self, type_, target_name):
- # Per https://chromium.googlesource.com/chromium/src/build/+/HEAD/android/docs/java_toolchain.md
- # java target names must end in "_java".
- # TODO: There are some other possible variations we might need to support.
- return type_ == 'group' and target_name.endswith('_java')
-
- def _get_arch(self, toolchain):
- if toolchain == '//build/toolchain/android:android_clang_x86':
- return 'android_x86'
- elif toolchain == '//build/toolchain/android:android_clang_x64':
- return 'android_x86_64'
- elif toolchain == '//build/toolchain/android:android_clang_arm':
- return 'android_arm'
- elif toolchain == '//build/toolchain/android:android_clang_arm64':
- return 'android_arm64'
- else:
- return 'host'
-
- def get_target(self, gn_target_name):
- """Returns a Target object from the fully qualified GN target name.
-
- get_target() requires that parse_gn_desc() has already been called.
- """
- # Run this every time as parse_gn_desc can be called at any time.
- for target in self.all_targets.values():
- target.finalize()
-
- return self.all_targets[label_without_toolchain(gn_target_name)]
-
- def parse_gn_desc(self, gn_desc, gn_target_name, java_group_name=None, is_test_target=False):
- """Parses a gn desc tree and resolves all target dependencies.
-
- It bubbles up variables from source_set dependencies as described in the
- class-level comments.
- """
- # Use name without toolchain for targets to support targets built for
- # multiple archs.
- target_name = label_without_toolchain(gn_target_name)
- desc = gn_desc[gn_target_name]
- type_ = desc['type']
- arch = self._get_arch(desc['toolchain'])
-
- if self._is_java_group(type_, target_name):
- java_group_name = target_name
-
- if is_test_target:
- target_name += TESTING_SUFFIX
-
- target = self.all_targets.get(target_name)
- if target is None:
- target = GnParser.Target(target_name, type_)
- self.all_targets[target_name] = target
-
- if arch not in target.arch:
- target.arch[arch] = GnParser.Target.Arch()
- else:
- return target # Target already processed.
-
- if target.name in self.builtin_deps:
- # return early, no need to parse any further as the module is a builtin.
- return target
-
- target.testonly = desc.get('testonly', False)
-
- proto_target_type, proto_desc = self.get_proto_target_type(gn_desc, gn_target_name)
- if proto_target_type is not None:
- self.proto_libs[target.name] = target
- target.type = 'proto_library'
- target.proto_plugin = proto_target_type
- target.proto_paths.update(self.get_proto_paths(proto_desc))
- target.proto_exports.update(self.get_proto_exports(proto_desc))
- target.proto_in_dir = self.get_proto_in_dir(proto_desc)
- for gn_proto_deps_name in proto_desc.get('deps', []):
- dep = self.parse_gn_desc(gn_desc, gn_proto_deps_name)
- target.deps.add(dep.name)
- target.arch[arch].sources.update(proto_desc.get('sources', []))
- assert (all(x.endswith('.proto') for x in target.arch[arch].sources))
- elif target.type == 'source_set':
- self.source_sets[gn_target_name] = target
- target.arch[arch].sources.update(desc.get('sources', []))
- elif target.is_linker_unit_type():
- self.linker_units[gn_target_name] = target
- target.arch[arch].sources.update(desc.get('sources', []))
- elif (desc.get("script", "") in JAVA_BANNED_SCRIPTS
- or self._is_java_group(target.type, target.name)):
- # java_group identifies the group target generated by the android_library
- # or java_library template. A java_group must not be added as a
- # dependency, but sources are collected.
- log.debug('Found java target %s', target.name)
- if target.type == "action":
- # Convert java actions into java_group and keep the inputs for collection.
- target.inputs.update(desc.get('inputs', []))
- target.type = 'java_group'
- elif target.type in ['action', 'action_foreach']:
- self.actions[gn_target_name] = target
- target.arch[arch].inputs.update(desc.get('inputs', []))
- target.arch[arch].sources.update(desc.get('sources', []))
- outs = [re.sub('^//out/.+?/gen/', '', x) for x in desc['outputs']]
- target.arch[arch].outputs.update(outs)
- target.arch[arch].script = desc['script']
- target.arch[arch].args = desc['args']
- target.arch[arch].response_file_contents = self._get_response_file_contents(desc)
- elif target.type == 'copy':
- # TODO: copy rules are not currently implemented.
- self.actions[gn_target_name] = target
-
- # Default for 'public' is //* - all headers in 'sources' are public.
- # TODO(primiano): if a 'public' section is specified (even if empty), then
- # the rest of 'sources' is considered inaccessible by gn. Consider
- # emulating that, so that generated build files don't end up with overly
- # accessible headers.
- public_headers = [x for x in desc.get('public', []) if x != '*']
- target.public_headers.update(public_headers)
-
- target.arch[arch].cflags.update(desc.get('cflags', []) + desc.get('cflags_cc', []))
- target.libs.update(desc.get('libs', []))
- target.arch[arch].ldflags.update(desc.get('ldflags', []))
- target.arch[arch].defines.update(desc.get('defines', []))
- target.arch[arch].include_dirs.update(desc.get('include_dirs', []))
- target.output_name = desc.get('output_name', None)
- if "-frtti" in target.arch[arch].cflags:
- target.rtti = True
-
- # Recurse in dependencies.
- for gn_dep_name in desc.get('deps', []):
- dep = self.parse_gn_desc(gn_desc, gn_dep_name, java_group_name, is_test_target)
- if dep.type == 'proto_library':
- target.proto_deps.add(dep.name)
- target.transitive_proto_deps.add(dep.name)
- target.proto_paths.update(dep.proto_paths)
- target.transitive_proto_deps.update(dep.transitive_proto_deps)
- elif dep.type == 'group':
- target.update(dep, arch) # Bubble up groups's cflags/ldflags etc.
- elif dep.type in ['action', 'action_foreach', 'copy']:
- if proto_target_type is None:
- target.arch[arch].deps.add(dep.name)
- elif dep.is_linker_unit_type():
- target.arch[arch].deps.add(dep.name)
- elif dep.type == 'java_group':
- # Explicitly break dependency chain when a java_group is added.
- # Java sources are collected and eventually compiled as one large
- # java_library.
- pass
-
- if dep.type in ['static_library', 'source_set']:
- # Bubble up static_libs and source_set. Necessary, since soong does not propagate
- # static_libs up the build tree.
- # Source sets are later translated to static_libraries, so it makes sense
- # to reuse transitive_static_libs_deps.
- target.arch[arch].transitive_static_libs_deps.add(dep.name)
-
- if arch in dep.arch:
- target.arch[arch].transitive_static_libs_deps.update(
- dep.arch[arch].transitive_static_libs_deps)
- target.arch[arch].deps.update(target.arch[arch].transitive_static_libs_deps)
-
- # Collect java sources. Java sources are kept inside the __compile_java target.
- # This target can be used for both host and target compilation; only add
- # the sources if they are destined for the target (i.e. they are a
- # dependency of the __dex target)
- # Note: this skips prebuilt java dependencies. These will have to be
- # added manually when building the jar.
- if target.name.endswith('__dex'):
- if dep.name.endswith('__compile_java'):
- log.debug('Adding java sources for %s', dep.name)
- java_srcs = [src for src in dep.inputs if _is_java_source(src)]
- if not is_test_target:
- # TODO(aymanm): Fix collecting sources for testing modules for java.
- # Don't collect java source files for test targets.
- # We only need a specific set of java sources which are hardcoded in gen_android_bp
- self.java_sources[java_group_name].update(java_srcs)
- if dep.type in ["action"] and target.type == "java_group":
- # GN uses an action to compile aidl files. However, this is not needed in soong
- # as soong can directly have .aidl files in srcs. So adding .aidl files to the java_sources.
- # TODO: Find a better way/place to do this.
- if '_aidl' in dep.name:
- self.java_sources[java_group_name].update(dep.arch[arch].sources)
- self.aidl_local_include_dirs.update(_extract_includes_from_aidl_args(dep.arch[arch].args))
- else:
- if not is_test_target:
- # TODO(aymanm): Fix collecting actions for testing modules for java.
- # Don't collect java actions for test targets.
- self.java_actions[java_group_name].add(dep.name)
- return target
-
- def get_proto_exports(self, proto_desc):
- # exports in metadata will be available for source_set targets.
- metadata = proto_desc.get('metadata', {})
- return metadata.get('exports', [])
-
- def get_proto_paths(self, proto_desc):
- # import_dirs in metadata will be available for source_set targets.
- metadata = proto_desc.get('metadata', {})
- return metadata.get('import_dirs', [])
-
-
- def get_proto_in_dir(self, proto_desc):
- args = proto_desc.get('args')
- return re.sub('^\.\./\.\./', '', args[args.index('--proto-in-dir') + 1])
-
- def get_proto_target_type(self, gn_desc, gn_target_name):
- """ Checks if the target is a proto library and return the plugin.
-
- Returns:
- (None, None): if the target is not a proto library.
- (plugin, proto_desc) where |plugin| is 'proto' in the default (lite)
- case or 'protozero' or 'ipc' or 'descriptor'; |proto_desc| is the GN
- json desc of the target with the .proto sources (_gen target for
- non-descriptor types or the target itself for descriptor type).
- """
- parts = gn_target_name.split('(', 1)
- name = parts[0]
- toolchain = '(' + parts[1] if len(parts) > 1 else ''
-
- # Descriptor targets don't have a _gen target; instead we look for the
- # characteristic flag in the args of the target itself.
- desc = gn_desc.get(gn_target_name)
- if '--descriptor_set_out' in desc.get('args', []):
- return 'descriptor', desc
-
- # Source set proto targets have a non-empty proto_library_sources in the
- # metadata of the description.
- metadata = desc.get('metadata', {})
- if 'proto_library_sources' in metadata:
- return 'source_set', desc
-
- # In all other cases, we want to look at the _gen target as that has the
- # important information.
- gen_desc = gn_desc.get('%s_gen%s' % (name, toolchain))
- if gen_desc is None or gen_desc['type'] != 'action':
- return None, None
- if gen_desc['script'] != '//tools/protoc_wrapper/protoc_wrapper.py':
- return None, None
- plugin = 'proto'
- args = gen_desc.get('args', [])
- for arg in (arg for arg in args if arg.startswith('--plugin=')):
- # |arg| at this point looks like:
- # --plugin=protoc-gen-plugin=gcc_like_host/protozero_plugin
- # or
- # --plugin=protoc-gen-plugin=protozero_plugin
- plugin = arg.split('=')[-1].split('/')[-1].replace('_plugin', '')
- return plugin, gen_desc
diff --git a/tools/gn2bp/update_results.sh b/tools/gn2bp/update_results.sh
deleted file mode 100755
index a464604..0000000
--- a/tools/gn2bp/update_results.sh
+++ /dev/null
@@ -1,16 +0,0 @@
-#!/bin/bash
-
-# This script is expected to run after gen_android_bp is modified.
-#
-# ./update_result.sh
-#
-# TARGETS contains targets which are supported by gen_android_bp and
-# this script generates Android.bp.swp from TARGETS.
-# This makes it easy to realize unintended impact/degression on
-# previously supported targets.
-
-set -eux
-
-BASEDIR=$(dirname "$0")
-$BASEDIR/gen_android_bp --desc $BASEDIR/desc_x64.json --desc $BASEDIR/desc_x86.json \
---desc $BASEDIR/desc_arm.json --desc $BASEDIR/desc_arm64.json --out $BASEDIR/Android.bp