Merge "cronet: add script to generate desc_*.json"
diff --git a/Cronet/tests/cts/AndroidTest.xml b/Cronet/tests/cts/AndroidTest.xml
index 1f6bdb3..d2422f1 100644
--- a/Cronet/tests/cts/AndroidTest.xml
+++ b/Cronet/tests/cts/AndroidTest.xml
@@ -17,7 +17,8 @@
<configuration description="Config for CTS Cronet test cases">
<option name="test-suite-tag" value="cts" />
<option name="config-descriptor:metadata" key="component" value="networking" />
- <option name="config-descriptor:metadata" key="parameter" value="instant_app" />
+ <!-- Instant apps cannot create sockets. See b/264248246 -->
+ <option name="config-descriptor:metadata" key="parameter" value="not_instant_app" />
<option name="config-descriptor:metadata" key="parameter" value="multi_abi" />
<option name="config-descriptor:metadata" key="parameter" value="secondary_user" />
<target_preparer class="com.android.tradefed.targetprep.suite.SuiteApkInstaller">
diff --git a/Tethering/src/com/android/networkstack/tethering/BpfCoordinator.java b/Tethering/src/com/android/networkstack/tethering/BpfCoordinator.java
index 72f83fa..44d3ffc 100644
--- a/Tethering/src/com/android/networkstack/tethering/BpfCoordinator.java
+++ b/Tethering/src/com/android/networkstack/tethering/BpfCoordinator.java
@@ -27,6 +27,7 @@
import static android.system.OsConstants.ETH_P_IP;
import static android.system.OsConstants.ETH_P_IPV6;
+import static com.android.net.module.util.NetworkStackConstants.IPV4_MIN_MTU;
import static com.android.net.module.util.ip.ConntrackMonitor.ConntrackEvent;
import static com.android.networkstack.tethering.BpfUtils.DOWNSTREAM;
import static com.android.networkstack.tethering.BpfUtils.UPSTREAM;
@@ -82,6 +83,8 @@
import java.net.Inet4Address;
import java.net.Inet6Address;
import java.net.InetAddress;
+import java.net.NetworkInterface;
+import java.net.SocketException;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.Arrays;
@@ -143,6 +146,8 @@
static final int NF_CONNTRACK_TCP_TIMEOUT_ESTABLISHED = 432_000;
@VisibleForTesting
static final int NF_CONNTRACK_UDP_TIMEOUT_STREAM = 180;
+ @VisibleForTesting
+ static final int INVALID_MTU = 0;
// List of TCP port numbers which aren't offloaded because the packets require the netfilter
// conntrack helper. See also TetherController::setForwardRules in netd.
@@ -263,6 +268,10 @@
// TODO: Support multi-upstream interfaces.
private int mLastIPv4UpstreamIfindex = 0;
+ // Tracks the IPv4 upstream interface information.
+ @Nullable
+ private UpstreamInfo mIpv4UpstreamInfo = null;
+
// Runnable that used by scheduling next polling of stats.
private final Runnable mScheduledPollingStats = () -> {
updateForwardedStats();
@@ -320,6 +329,19 @@
return SdkLevel.isAtLeastS();
}
+ /**
+ * Gets the MTU of the given interface.
+ */
+ public int getNetworkInterfaceMtu(@NonNull String iface) {
+ try {
+ final NetworkInterface networkInterface = NetworkInterface.getByName(iface);
+ return networkInterface == null ? INVALID_MTU : networkInterface.getMTU();
+ } catch (SocketException e) {
+ Log.e(TAG, "Could not get MTU for interface " + iface, e);
+ return INVALID_MTU;
+ }
+ }
+
/** Get downstream4 BPF map. */
@Nullable public IBpfMap<Tether4Key, Tether4Value> getBpfDownstream4Map() {
if (!isAtLeastS()) return null;
@@ -868,6 +890,7 @@
if (!isUsingBpf()) return;
int upstreamIndex = 0;
+ int mtu = INVALID_MTU;
// This will not work on a network that is using 464xlat because hasIpv4Address will not be
// true.
@@ -877,6 +900,17 @@
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;
+
if (!isVcn && params != null && !params.hasMacAddress /* raw ip upstream only */) {
upstreamIndex = params.index;
}
@@ -905,8 +939,11 @@
// after the upstream is lost do not incorrectly add rules pointing at the upstream.
if (upstreamIndex == 0) {
mIpv4UpstreamIndices.clear();
+ mIpv4UpstreamInfo = null;
return;
}
+
+ mIpv4UpstreamInfo = new UpstreamInfo(upstreamIndex, mtu);
Collection<InetAddress> addresses = ns.linkProperties.getAddresses();
for (final InetAddress addr: addresses) {
if (isValidUpstreamIpv4Address(addr)) {
@@ -1051,6 +1088,9 @@
}
pw.decreaseIndent();
+ pw.println("IPv4 Upstream Information: "
+ + (mIpv4UpstreamInfo != null ? mIpv4UpstreamInfo : "<empty>"));
+
pw.println();
pw.println("Forwarding counters:");
pw.increaseIndent();
@@ -1258,10 +1298,10 @@
final String ageStr = (value.lastUsed == 0) ? "-"
: String.format("%dms", (now - value.lastUsed) / 1_000_000);
- return String.format("%s [%s] %d(%s) %s:%d -> %d(%s) %s:%d -> %s:%d [%s] %s",
+ return String.format("%s [%s] %d(%s) %s:%d -> %d(%s) %s:%d -> %s:%d [%s] %d %s",
l4protoToString(key.l4proto), key.dstMac, key.iif, getIfName(key.iif),
src4, key.srcPort, value.oif, getIfName(value.oif),
- public4, publicPort, dst4, value.dstPort, value.ethDstMac, ageStr);
+ public4, publicPort, dst4, value.dstPort, value.ethDstMac, value.pmtu, ageStr);
}
private void dumpIpv4ForwardingRuleMap(long now, boolean downstream,
@@ -1283,13 +1323,13 @@
try (IBpfMap<Tether4Key, Tether4Value> upstreamMap = mDeps.getBpfUpstream4Map();
IBpfMap<Tether4Key, Tether4Value> downstreamMap = mDeps.getBpfDownstream4Map()) {
pw.println("IPv4 Upstream: proto [inDstMac] iif(iface) src -> nat -> "
- + "dst [outDstMac] age");
+ + "dst [outDstMac] pmtu age");
pw.increaseIndent();
dumpIpv4ForwardingRuleMap(now, UPSTREAM, upstreamMap, pw);
pw.decreaseIndent();
pw.println("IPv4 Downstream: proto [inDstMac] iif(iface) src -> nat -> "
- + "dst [outDstMac] age");
+ + "dst [outDstMac] pmtu age");
pw.increaseIndent();
dumpIpv4ForwardingRuleMap(now, DOWNSTREAM, downstreamMap, pw);
pw.decreaseIndent();
@@ -1540,6 +1580,28 @@
}
}
+ /** Upstream information class. */
+ private static final class UpstreamInfo {
+ // TODO: add clat interface information
+ public final int ifIndex;
+ public final int mtu;
+
+ private UpstreamInfo(final int ifIndex, final int mtu) {
+ this.ifIndex = ifIndex;
+ this.mtu = mtu;
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(ifIndex, mtu);
+ }
+
+ @Override
+ public String toString() {
+ return String.format("ifIndex: %d, mtu: %d", ifIndex, mtu);
+ }
+ }
+
/**
* A BPF tethering stats provider to provide network statistics to the system.
* Note that this class' data may only be accessed on the handler thread.
@@ -1711,20 +1773,20 @@
@NonNull
private Tether4Value makeTetherUpstream4Value(@NonNull ConntrackEvent e,
- int upstreamIndex) {
- return new Tether4Value(upstreamIndex,
+ @NonNull UpstreamInfo upstreamInfo) {
+ return new Tether4Value(upstreamInfo.ifIndex,
NULL_MAC_ADDRESS /* ethDstMac (rawip) */,
NULL_MAC_ADDRESS /* ethSrcMac (rawip) */, ETH_P_IP,
- NetworkStackConstants.ETHER_MTU, toIpv4MappedAddressBytes(e.tupleReply.dstIp),
+ upstreamInfo.mtu, toIpv4MappedAddressBytes(e.tupleReply.dstIp),
toIpv4MappedAddressBytes(e.tupleReply.srcIp), e.tupleReply.dstPort,
e.tupleReply.srcPort, 0 /* lastUsed, filled by bpf prog only */);
}
@NonNull
private Tether4Value makeTetherDownstream4Value(@NonNull ConntrackEvent e,
- @NonNull ClientInfo c, int upstreamIndex) {
+ @NonNull ClientInfo c, @NonNull UpstreamInfo upstreamInfo) {
return new Tether4Value(c.downstreamIfindex,
- c.clientMac, c.downstreamMac, ETH_P_IP, NetworkStackConstants.ETHER_MTU,
+ c.clientMac, c.downstreamMac, ETH_P_IP, upstreamInfo.mtu,
toIpv4MappedAddressBytes(e.tupleOrig.dstIp),
toIpv4MappedAddressBytes(e.tupleOrig.srcIp),
e.tupleOrig.dstPort, e.tupleOrig.srcPort,
@@ -1773,9 +1835,11 @@
return;
}
- final Tether4Value upstream4Value = makeTetherUpstream4Value(e, upstreamIndex);
+ if (mIpv4UpstreamInfo == null || mIpv4UpstreamInfo.ifIndex != upstreamIndex) return;
+
+ final Tether4Value upstream4Value = makeTetherUpstream4Value(e, mIpv4UpstreamInfo);
final Tether4Value downstream4Value = makeTetherDownstream4Value(e, tetherClient,
- upstreamIndex);
+ mIpv4UpstreamInfo);
maybeAddDevMap(upstreamIndex, tetherClient.downstreamIfindex);
maybeSetLimit(upstreamIndex);
diff --git a/Tethering/tests/unit/src/com/android/networkstack/tethering/BpfCoordinatorTest.java b/Tethering/tests/unit/src/com/android/networkstack/tethering/BpfCoordinatorTest.java
index ace5f15..1978e99 100644
--- a/Tethering/tests/unit/src/com/android/networkstack/tethering/BpfCoordinatorTest.java
+++ b/Tethering/tests/unit/src/com/android/networkstack/tethering/BpfCoordinatorTest.java
@@ -32,6 +32,7 @@
import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.staticMockMarker;
+import static com.android.net.module.util.NetworkStackConstants.IPV4_MIN_MTU;
import static com.android.net.module.util.ip.ConntrackMonitor.ConntrackEvent;
import static com.android.net.module.util.netlink.ConntrackMessage.DYING_MASK;
import static com.android.net.module.util.netlink.ConntrackMessage.ESTABLISHED_MASK;
@@ -41,6 +42,7 @@
import static com.android.net.module.util.netlink.NetlinkConstants.IPCTNL_MSG_CT_DELETE;
import static com.android.net.module.util.netlink.NetlinkConstants.IPCTNL_MSG_CT_NEW;
import static com.android.networkstack.tethering.BpfCoordinator.CONNTRACK_TIMEOUT_UPDATE_INTERVAL_MS;
+import static com.android.networkstack.tethering.BpfCoordinator.INVALID_MTU;
import static com.android.networkstack.tethering.BpfCoordinator.NF_CONNTRACK_TCP_TIMEOUT_ESTABLISHED;
import static com.android.networkstack.tethering.BpfCoordinator.NF_CONNTRACK_UDP_TIMEOUT_STREAM;
import static com.android.networkstack.tethering.BpfCoordinator.NON_OFFLOADED_UPSTREAM_IPV4_TCP_PORTS;
@@ -283,6 +285,11 @@
private int mDstPort = REMOTE_PORT;
private long mLastUsed = 0;
+ public Builder setPmtu(short pmtu) {
+ mPmtu = pmtu;
+ return this;
+ }
+
public Tether4Value build() {
return new Tether4Value(mOif, mEthDstMac, mEthSrcMac, mEthProto, mPmtu,
mSrc46, mDst46, mSrcPort, mDstPort, mLastUsed);
@@ -303,6 +310,11 @@
private int mDstPort = PRIVATE_PORT;
private long mLastUsed = 0;
+ public Builder setPmtu(short pmtu) {
+ mPmtu = pmtu;
+ return this;
+ }
+
public Tether4Value build() {
return new Tether4Value(mOif, mEthDstMac, mEthSrcMac, mEthProto, mPmtu,
mSrc46, mDst46, mSrcPort, mDstPort, mLastUsed);
@@ -375,6 +387,7 @@
private HashMap<IpServer, HashMap<Inet4Address, ClientInfo>> mTetherClients;
private long mElapsedRealtimeNanos = 0;
+ private int mMtu = NetworkStackConstants.ETHER_MTU;
private final ArgumentCaptor<ArrayList> mStringArrayCaptor =
ArgumentCaptor.forClass(ArrayList.class);
private final TestLooper mTestLooper = new TestLooper();
@@ -430,6 +443,10 @@
return mElapsedRealtimeNanos;
}
+ public int getNetworkInterfaceMtu(@NonNull String iface) {
+ return mMtu;
+ }
+
@Nullable
public IBpfMap<Tether4Key, Tether4Value> getBpfDownstream4Map() {
return mBpfDownstream4Map;
@@ -1518,6 +1535,7 @@
final LinkProperties lp = new LinkProperties();
lp.setInterfaceName(upstreamInfo.interfaceParams.name);
lp.addLinkAddress(new LinkAddress(upstreamInfo.address, 32 /* prefix length */));
+ lp.setMtu(mMtu);
final NetworkCapabilities capabilities = new NetworkCapabilities()
.addTransportType(upstreamInfo.transportType);
coordinator.updateUpstreamNetworkState(new UpstreamNetworkState(lp, capabilities,
@@ -2195,4 +2213,72 @@
verifyDump(coordinator);
}
+
+ private void verifyAddTetherOffloadRule4Mtu(final int ifaceMtu, final boolean isKernelMtu,
+ final int expectedMtu) throws Exception {
+ // BpfCoordinator#updateUpstreamNetworkState geta mtu from LinkProperties. If not found,
+ // try to get from kernel.
+ if (isKernelMtu) {
+ // LinkProperties mtu is invalid and kernel mtu is valid.
+ mMtu = INVALID_MTU;
+ doReturn(ifaceMtu).when(mDeps).getNetworkInterfaceMtu(any());
+ } else {
+ // LinkProperties mtu is valid and kernel mtu is invalid.
+ mMtu = ifaceMtu;
+ doReturn(INVALID_MTU).when(mDeps).getNetworkInterfaceMtu(any());
+ }
+
+ final BpfCoordinator coordinator = makeBpfCoordinator();
+ initBpfCoordinatorForRule4(coordinator);
+
+ final Tether4Key expectedUpstream4KeyTcp = new TestUpstream4Key.Builder()
+ .setProto(IPPROTO_TCP)
+ .build();
+ final Tether4Key expectedDownstream4KeyTcp = new TestDownstream4Key.Builder()
+ .setProto(IPPROTO_TCP)
+ .build();
+ final Tether4Value expectedUpstream4ValueTcp = new TestUpstream4Value.Builder()
+ .setPmtu((short) expectedMtu)
+ .build();
+ final Tether4Value expectedDownstream4ValueTcp = new TestDownstream4Value.Builder()
+ .setPmtu((short) expectedMtu)
+ .build();
+
+ mConsumer.accept(new TestConntrackEvent.Builder()
+ .setMsgType(IPCTNL_MSG_CT_NEW)
+ .setProto(IPPROTO_TCP)
+ .build());
+ verify(mBpfUpstream4Map)
+ .insertEntry(eq(expectedUpstream4KeyTcp), eq(expectedUpstream4ValueTcp));
+ verify(mBpfDownstream4Map)
+ .insertEntry(eq(expectedDownstream4KeyTcp), eq(expectedDownstream4ValueTcp));
+ }
+
+ @Test
+ @IgnoreUpTo(Build.VERSION_CODES.R)
+ public void testAddTetherOffloadRule4LowMtuFromLinkProperties() throws Exception {
+ verifyAddTetherOffloadRule4Mtu(
+ IPV4_MIN_MTU, false /* isKernelMtu */, IPV4_MIN_MTU /* expectedMtu */);
+ }
+
+ @Test
+ @IgnoreUpTo(Build.VERSION_CODES.R)
+ public void testAddTetherOffloadRule4LowMtuFromKernel() throws Exception {
+ verifyAddTetherOffloadRule4Mtu(
+ IPV4_MIN_MTU, true /* isKernelMtu */, IPV4_MIN_MTU /* expectedMtu */);
+ }
+
+ @Test
+ @IgnoreUpTo(Build.VERSION_CODES.R)
+ public void testAddTetherOffloadRule4LessThanIpv4MinMtu() throws Exception {
+ verifyAddTetherOffloadRule4Mtu(
+ IPV4_MIN_MTU - 1, false /* isKernelMtu */, IPV4_MIN_MTU /* expectedMtu */);
+ }
+
+ @Test
+ @IgnoreUpTo(Build.VERSION_CODES.R)
+ public void testAddTetherOffloadRule4InvalidMtu() throws Exception {
+ verifyAddTetherOffloadRule4Mtu(INVALID_MTU, false /* isKernelMtu */,
+ NetworkStackConstants.ETHER_MTU /* expectedMtu */);
+ }
}
diff --git a/bpf_progs/clatd.c b/bpf_progs/clatd.c
index 14cddf6..7350209 100644
--- a/bpf_progs/clatd.c
+++ b/bpf_progs/clatd.c
@@ -52,9 +52,17 @@
__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, bool is_ethernet) {
+static inline __always_inline int nat64(struct __sk_buff* skb,
+ const bool is_ethernet,
+ 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;
@@ -106,6 +114,9 @@
__u16 tot_len = ntohs(ip6->payload_len) + sizeof(struct iphdr); // cannot overflow, see above
if (proto == IPPROTO_FRAGMENT) {
+ // Fragment handling requires bpf_skb_adjust_room which is 4.14+
+ if (kver < KVER_4_14) return TC_ACT_PIPE;
+
// Must have (ethernet and) ipv6 header and ipv6 fragment extension header
if (data + l2_header_size + sizeof(*ip6) + sizeof(struct frag_hdr) > data_end)
return TC_ACT_PIPE;
@@ -208,7 +219,20 @@
// return -ENOTSUPP;
bpf_csum_update(skb, sum6);
- if (frag_off != htons(IP_DF)) {
+ // Technically 'kver < KVER_4_14' already implies 'frag_off == htons(IP_DF)' due to logic above,
+ // thus the initial 'kver >= KVER_4_14' check here is entirely superfluous.
+ //
+ // However, we *need* the compiler (when compiling the program for 4.9) to entirely
+ // optimize out the call to bpf_skb_adjust_room() bpf helper: it's not enough for it to emit
+ // an unreachable call to it, it must *not* emit it at all (otherwise the 4.9 kernel's
+ // bpf verifier will refuse to load a program with an unknown bpf helper call)
+ //
+ // This is easiest to achieve by being very explicit in the if clause,
+ // better safe than sorry...
+ //
+ // Note: we currently have no TreeHugger coverage for 4.9-T devices (there are no such
+ // Pixel or cuttlefish devices), so likely you won't notice for months if this breaks...
+ if (kver >= KVER_4_14 && frag_off != htons(IP_DF)) {
// If we're converting an IPv6 Fragment, we need to trim off 8 more bytes
// We're beyond recovery on error here... but hard to imagine how this could fail.
if (bpf_skb_adjust_room(skb, -(__s32)sizeof(struct frag_hdr), BPF_ADJ_ROOM_NET, /*flags*/0))
@@ -243,14 +267,24 @@
return TC_ACT_PIPE;
}
-DEFINE_BPF_PROG("schedcls/ingress6/clat_ether", AID_ROOT, AID_SYSTEM, sched_cls_ingress6_clat_ether)
+DEFINE_BPF_PROG_KVER("schedcls/ingress6/clat_ether$4_14", AID_ROOT, AID_SYSTEM, sched_cls_ingress6_clat_ether_4_14, KVER_4_14)
(struct __sk_buff* skb) {
- return nat64(skb, true);
+ return nat64(skb, ETHER, KVER_4_14);
}
-DEFINE_BPF_PROG("schedcls/ingress6/clat_rawip", AID_ROOT, AID_SYSTEM, sched_cls_ingress6_clat_rawip)
+DEFINE_BPF_PROG_KVER_RANGE("schedcls/ingress6/clat_ether$4_9", AID_ROOT, AID_SYSTEM, sched_cls_ingress6_clat_ether_4_9, KVER_NONE, KVER_4_14)
(struct __sk_buff* skb) {
- return nat64(skb, false);
+ return nat64(skb, ETHER, KVER_NONE);
+}
+
+DEFINE_BPF_PROG_KVER("schedcls/ingress6/clat_rawip$4_14", AID_ROOT, AID_SYSTEM, sched_cls_ingress6_clat_rawip_4_14, KVER_4_14)
+(struct __sk_buff* skb) {
+ return nat64(skb, RAWIP, KVER_4_14);
+}
+
+DEFINE_BPF_PROG_KVER_RANGE("schedcls/ingress6/clat_rawip$4_9", AID_ROOT, AID_SYSTEM, sched_cls_ingress6_clat_rawip_4_9, KVER_NONE, KVER_4_14)
+(struct __sk_buff* skb) {
+ return nat64(skb, RAWIP, KVER_NONE);
}
DEFINE_BPF_MAP_GRW(clat_egress4_map, HASH, ClatEgress4Key, ClatEgress4Value, 16, AID_SYSTEM)
diff --git a/service/src/com/android/server/BpfNetMaps.java b/service/src/com/android/server/BpfNetMaps.java
index bce9f53..26ec37a 100644
--- a/service/src/com/android/server/BpfNetMaps.java
+++ b/service/src/com/android/server/BpfNetMaps.java
@@ -279,9 +279,10 @@
private static synchronized void ensureInitialized(final Context context) {
if (sInitialized) return;
if (sEnableJavaBpfMap == null) {
- sEnableJavaBpfMap = DeviceConfigUtils.isFeatureEnabled(context,
+ sEnableJavaBpfMap = SdkLevel.isAtLeastU() ||
+ DeviceConfigUtils.isFeatureEnabled(context,
DeviceConfig.NAMESPACE_TETHERING, BPF_NET_MAPS_ENABLE_JAVA_BPF_MAP,
- false /* defaultValue */) || SdkLevel.isAtLeastU();
+ false /* defaultValue */);
}
Log.d(TAG, "BpfNetMaps is initialized with sEnableJavaBpfMap=" + sEnableJavaBpfMap);
diff --git a/tools/gn2bp/Android.bp.swp b/tools/gn2bp/Android.bp.swp
index 708c9fd..60af5f7 100644
--- a/tools/gn2bp/Android.bp.swp
+++ b/tools/gn2bp/Android.bp.swp
@@ -4666,32 +4666,6 @@
],
}
-// GN: //net/data/ssl/chrome_root_store:gen_root_store_inc
-cc_genrule {
- name: "cronet_aml_net_data_ssl_chrome_root_store_gen_root_store_inc",
- cmd: "$(location build/gn_run_binary.py) clang_x64/root_store_tool " +
- "--root-store " +
- "../../net/data/ssl/chrome_root_store/root_store.textproto " +
- "--certs " +
- "../../net/data/ssl/chrome_root_store/root_store.certs " +
- "--write-cpp-root-store " +
- "gen/net/data/ssl/chrome_root_store/chrome-root-store-inc.cc " +
- "--write-cpp-ev-roots " +
- "gen/net/data/ssl/chrome_root_store/chrome-ev-roots-inc.cc",
- out: [
- "net/data/ssl/chrome_root_store/chrome-ev-roots-inc.cc",
- "net/data/ssl/chrome_root_store/chrome-root-store-inc.cc",
- ],
- tool_files: [
- "build/gn_run_binary.py",
- "net/data/ssl/chrome_root_store/root_store.certs",
- "net/data/ssl/chrome_root_store/root_store.textproto",
- ],
- apex_available: [
- "com.android.tethering",
- ],
-}
-
// GN: //net/dns:dns
cc_object {
name: "cronet_aml_net_dns_dns",
diff --git a/tools/gn2bp/gen_android_bp b/tools/gn2bp/gen_android_bp
index c750c2a..deb8f8a 100755
--- a/tools/gn2bp/gen_android_bp
+++ b/tools/gn2bp/gen_android_bp
@@ -190,6 +190,8 @@
builtin_deps = {
'//buildtools/third_party/libunwind:libunwind':
lambda m, a: None, # disable libunwind
+ '//net/data/ssl/chrome_root_store:gen_root_store_inc':
+ lambda m, a: None,
'//net/tools/root_store_tool:root_store_tool':
lambda m, a: None,
'//third_party/zlib:zlib':