Merge "Extend NetworkDnsEventReported and add new DnsCallReported to log per-query information"
diff --git a/cmds/statsd/src/atoms.proto b/cmds/statsd/src/atoms.proto
index 1ac6ea8..f04f017 100644
--- a/cmds/statsd/src/atoms.proto
+++ b/cmds/statsd/src/atoms.proto
@@ -33,6 +33,7 @@
 import "frameworks/base/core/proto/android/server/connectivity/data_stall_event.proto";
 import "frameworks/base/core/proto/android/server/enums.proto";
 import "frameworks/base/core/proto/android/stats/connectivity/network_stack.proto";
+import "frameworks/base/core/proto/android/stats/dnsresolver/dns_resolver.proto";
 import "frameworks/base/core/proto/android/stats/launcher/launcher.proto";
 import "frameworks/base/core/proto/android/telecomm/enums.proto";
 import "frameworks/base/core/proto/android/telephony/enums.proto";
@@ -133,7 +134,7 @@
         PhoneStateChanged phone_state_changed = 95;
         LowMemReported low_mem_reported = 81;
         ThermalThrottlingStateChanged thermal_throttling = 86;
-        NetworkDnsEventReported network_dns_event_reported = 116;
+        NetworkDnsEventReported network_dns_event_reported = 116 [(log_from_module) = "resolv"];
         DataStallEvent data_stall_event = 121 [(log_from_module) = "network_stack"];
         BluetoothLinkLayerConnectionEvent bluetooth_link_layer_connection_event = 125;
         BluetoothAclConnectionStateChanged bluetooth_acl_connection_state_changed = 126;
@@ -2794,51 +2795,37 @@
 }
 
 /**
- * Logs the latency period(in microseconds) and the return code of
- * the DNS(Domain Name System) lookups.
- * These 4 methods(GETADDRINFO,GETHOSTBYNAME,GETHOSTBYADDR,RES_NSEND)
- * to get info(address or hostname) from DNS server(or DNS cache).
- * Logged from:
- *   /system/netd/server/DnsProxyListener.cpp
+ * Logs a DNS lookup operation initiated by the system resolver on behalf of an application
+ * invoking native APIs such as getaddrinfo() or Java APIs such as Network#getAllByName().
+ *
+ * The NetworkDnsEventReported message represents the entire lookup operation, which may
+ * result one or more queries to the recursive DNS resolvers. Those are individually logged
+ * in DnsQueryEvents to enable computing error rates and network latency and timeouts
+ * broken up by query type, transport, network interface, etc.
  */
 message NetworkDnsEventReported {
-    // The types of the DNS lookups, as defined in
-    //system/netd/server/binder/android/net/metrics/INetdEventListener.aidl
-    enum EventType {
-        EVENT_UNKNOWN = 0;
-        EVENT_GETADDRINFO = 1;
-        EVENT_GETHOSTBYNAME = 2;
-        EVENT_GETHOSTBYADDR = 3;
-        EVENT_RES_NSEND = 4;
-    }
-    optional EventType event_type = 1;
+    optional android.stats.dnsresolver.EventType event_type = 1;
 
-    // The return value of the DNS resolver for each DNS lookups.
-    //bionic/libc/include/netdb.h
-    //system/netd/resolv/include/netd_resolv/resolv.h
-    enum ReturnCode {
-        EAI_NO_ERROR = 0;
-        EAI_ADDRFAMILY = 1;
-        EAI_AGAIN = 2;
-        EAI_BADFLAGS = 3;
-        EAI_FAIL = 4;
-        EAI_FAMILY = 5;
-        EAI_MEMORY = 6;
-        EAI_NODATA = 7;
-        EAI_NONAME = 8;
-        EAI_SERVICE = 9;
-        EAI_SOCKTYPE = 10;
-        EAI_SYSTEM = 11;
-        EAI_BADHINTS = 12;
-        EAI_PROTOCOL = 13;
-        EAI_OVERFLOW = 14;
-        RESOLV_TIMEOUT = 255;
-        EAI_MAX = 256;
-    }
-    optional ReturnCode return_code = 2;
+    optional android.stats.dnsresolver.ReturnCode return_code = 2;
 
-    // The latency period(in microseconds) it took for this DNS lookup to complete.
+    // The latency in microseconds of the entire DNS lookup operation.
     optional int32 latency_micros = 3;
+
+    // Only valid for event_type = EVENT_GETADDRINFO.
+    optional int32 hints_ai_flags = 4;
+
+    // Flags passed to android_res_nsend() defined in multinetwork.h
+    // Only valid for event_type = EVENT_RESNSEND.
+    optional int32 res_nsend_flags = 5;
+
+    optional android.stats.dnsresolver.Transport network_type = 6;
+
+    // The DNS over TLS mode on a specific netId.
+    optional android.stats.dnsresolver.PrivateDnsModes private_dns_modes = 7;
+
+    // Additional pass-through fields opaque to statsd.
+    // The DNS resolver Mainline module can add new fields here without requiring an OS update.
+    optional android.stats.dnsresolver.DnsQueryEvents dns_query_events = 8 [(log_mode) = MODE_BYTES];
 }
 
 /**
diff --git a/core/proto/android/stats/dnsresolver/Android.bp b/core/proto/android/stats/dnsresolver/Android.bp
new file mode 100644
index 0000000..0b5aa86
--- /dev/null
+++ b/core/proto/android/stats/dnsresolver/Android.bp
@@ -0,0 +1,25 @@
+// 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.
+
+java_library_static {
+    name: "dnsresolverprotosnano",
+    proto: {
+        type: "nano",
+    },
+    srcs: [
+        "dns_resolver.proto",
+    ],
+    sdk_version: "system_current",
+    no_framework_libs: true,
+}
diff --git a/core/proto/android/stats/dnsresolver/dns_resolver.proto b/core/proto/android/stats/dnsresolver/dns_resolver.proto
new file mode 100644
index 0000000..af6fea0
--- /dev/null
+++ b/core/proto/android/stats/dnsresolver/dns_resolver.proto
@@ -0,0 +1,214 @@
+/*

+ * 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.

+ */

+syntax = "proto2";

+package android.stats.dnsresolver;

+

+enum EventType {

+    EVENT_UNKNOWN = 0;

+    EVENT_GETADDRINFO = 1;

+    EVENT_GETHOSTBYNAME = 2;

+    EVENT_GETHOSTBYADDR = 3;

+    EVENT_RES_NSEND = 4;

+}

+

+// The return value of the DNS resolver for each DNS lookups.

+// bionic/libc/include/netdb.h

+// system/netd/resolv/include/netd_resolv/resolv.h

+enum ReturnCode {

+    RC_EAI_NO_ERROR = 0;

+    RC_EAI_ADDRFAMILY = 1;

+    RC_EAI_AGAIN = 2;

+    RC_EAI_BADFLAGS = 3;

+    RC_EAI_FAIL = 4;

+    RC_EAI_FAMILY = 5;

+    RC_EAI_MEMORY = 6;

+    RC_EAI_NODATA = 7;

+    RC_EAI_NONAME = 8;

+    RC_EAI_SERVICE = 9;

+    RC_EAI_SOCKTYPE = 10;

+    RC_EAI_SYSTEM = 11;

+    RC_EAI_BADHINTS = 12;

+    RC_EAI_PROTOCOL = 13;

+    RC_EAI_OVERFLOW = 14;

+    RC_RESOLV_TIMEOUT = 255;

+    RC_EAI_MAX = 256;

+}

+

+enum NsRcode {

+    NS_R_NO_ERROR = 0;  // No error occurred.

+    NS_R_FORMERR = 1;   // Format error.

+    NS_R_SERVFAIL = 2;  // Server failure.

+    NS_R_NXDOMAIN = 3;  // Name error.

+    NS_R_NOTIMPL = 4;   // Unimplemented.

+    NS_R_REFUSED = 5;   // Operation refused.

+    // these are for BIND_UPDATE

+    NS_R_YXDOMAIN = 6;  // Name exists

+    NS_R_YXRRSET = 7;   // RRset exists

+    NS_R_NXRRSET = 8;   // RRset does not exist

+    NS_R_NOTAUTH = 9;   // Not authoritative for zone

+    NS_R_NOTZONE = 10;  // Zone of record different from zone section

+    NS_R_MAX = 11;

+    // The following are EDNS extended rcodes

+    NS_R_BADVERS = 16;

+    // The following are TSIG errors

+    // NS_R_BADSIG  = 16,

+    NS_R_BADKEY = 17;

+    NS_R_BADTIME = 18;

+}

+

+// Currently defined type values for resources and queries.

+enum NsType {

+    NS_T_INVALID = 0;      // Cookie.

+    NS_T_A = 1;            // Host address.

+    NS_T_NS = 2;           // Authoritative server.

+    NS_T_MD = 3;           // Mail destination.

+    NS_T_MF = 4;           // Mail forwarder.

+    NS_T_CNAME = 5;        // Canonical name.

+    NS_T_SOA = 6;          // Start of authority zone.

+    NS_T_MB = 7;           // Mailbox domain name.

+    NS_T_MG = 8;           // Mail group member.

+    NS_T_MR = 9;           // Mail rename name.

+    NS_T_NULL = 10;        // Null resource record.

+    NS_T_WKS = 11;         // Well known service.

+    NS_T_PTR = 12;         // Domain name pointer.

+    NS_T_HINFO = 13;       // Host information.

+    NS_T_MINFO = 14;       // Mailbox information.

+    NS_T_MX = 15;          // Mail routing information.

+    NS_T_TXT = 16;         // Text strings.

+    NS_T_RP = 17;          // Responsible person.

+    NS_T_AFSDB = 18;       // AFS cell database.

+    NS_T_X25 = 19;         // X_25 calling address.

+    NS_T_ISDN = 20;        // ISDN calling address.

+    NS_T_RT = 21;          // Router.

+    NS_T_NSAP = 22;        // NSAP address.

+    NS_T_NSAP_PTR = 23;    // Reverse NSAP lookup (deprecated).

+    NS_T_SIG = 24;         // Security signature.

+    NS_T_KEY = 25;         // Security key.

+    NS_T_PX = 26;          // X.400 mail mapping.

+    NS_T_GPOS = 27;        // Geographical position (withdrawn).

+    NS_T_AAAA = 28;        // IPv6 Address.

+    NS_T_LOC = 29;         // Location Information.

+    NS_T_NXT = 30;         // Next domain (security).

+    NS_T_EID = 31;         // Endpoint identifier.

+    NS_T_NIMLOC = 32;      // Nimrod Locator.

+    NS_T_SRV = 33;         // Server Selection.

+    NS_T_ATMA = 34;        // ATM Address

+    NS_T_NAPTR = 35;       // Naming Authority PoinTeR

+    NS_T_KX = 36;          // Key Exchange

+    NS_T_CERT = 37;        // Certification record

+    NS_T_A6 = 38;          // IPv6 address (experimental)

+    NS_T_DNAME = 39;       // Non-terminal DNAME

+    NS_T_SINK = 40;        // Kitchen sink (experimentatl)

+    NS_T_OPT = 41;         // EDNS0 option (meta-RR)

+    NS_T_APL = 42;         // Address prefix list (RFC 3123)

+    NS_T_DS = 43;          // Delegation Signer

+    NS_T_SSHFP = 44;       // SSH Fingerprint

+    NS_T_IPSECKEY = 45;    // IPSEC Key

+    NS_T_RRSIG = 46;       // RRset Signature

+    NS_T_NSEC = 47;        // Negative security

+    NS_T_DNSKEY = 48;      // DNS Key

+    NS_T_DHCID = 49;       // Dynamic host configuratin identifier

+    NS_T_NSEC3 = 50;       // Negative security type 3

+    NS_T_NSEC3PARAM = 51;  // Negative security type 3 parameters

+    NS_T_HIP = 55;         // Host Identity Protocol

+    NS_T_SPF = 99;         // Sender Policy Framework

+    NS_T_TKEY = 249;       // Transaction key

+    NS_T_TSIG = 250;       // Transaction signature.

+    NS_T_IXFR = 251;       // Incremental zone transfer.

+    NS_T_AXFR = 252;       // Transfer zone of authority.

+    NS_T_MAILB = 253;      // Transfer mailbox records.

+    NS_T_MAILA = 254;      // Transfer mail agent records.

+    NS_T_ANY = 255;        // Wildcard match.

+    NS_T_ZXFR = 256;       // BIND-specific, nonstandard.

+    NS_T_DLV = 32769;      // DNSSEC look-aside validatation.

+    NS_T_MAX = 65536;

+}

+

+enum IpVersion {

+    IV_UNKNOWN = 0;

+    IV_IPV4 = 1;

+    IV_IPV6 = 2;

+}

+

+enum TransportType {

+    TT_UNKNOWN = 0;

+    TT_UDP = 1;

+    TT_TCP = 2;

+    TT_DOT = 3;

+}

+

+enum PrivateDnsModes {

+    PDM_UNKNOWN = 0;

+    PDM_OFF = 1;

+    PDM_OPPORTUNISTIC = 2;

+    PDM_STRICT = 3;

+}

+

+enum Transport {

+    // Indicates this network uses a Cellular transport.

+    TRANSPORT_DEFAULT = 0;  // TRANSPORT_CELLULAR

+    // Indicates this network uses a Wi-Fi transport.

+    TRANSPORT_WIFI = 1;

+    // Indicates this network uses a Bluetooth transport.

+    TRANSPORT_BLUETOOTH = 2;

+    // Indicates this network uses an Ethernet transport.

+    TRANSPORT_ETHERNET = 3;

+    // Indicates this network uses a VPN transport.

+    TRANSPORT_VPN = 4;

+    // Indicates this network uses a Wi-Fi Aware transport.

+    TRANSPORT_WIFI_AWARE = 5;

+    // Indicates this network uses a LoWPAN transport.

+    TRANSPORT_LOWPAN = 6;

+}

+

+enum CacheStatus{

+    // the cache can't handle that kind of queries.

+    // or the answer buffer is too small.

+    CS_UNSUPPORTED = 0;

+    // the cache doesn't know about this query.

+    CS_NOTFOUND = 1;

+    // the cache found the answer.

+    CS_FOUND = 2;

+    // Don't do anything on cache.

+    CS_SKIP = 3;

+}

+

+message DnsQueryEvent {

+    optional android.stats.dnsresolver.NsRcode rcode = 1;

+

+    optional android.stats.dnsresolver.NsType type = 2;

+

+    optional android.stats.dnsresolver.CacheStatus cache_hit = 3;

+

+    optional android.stats.dnsresolver.IpVersion ip_version = 4;

+

+    optional android.stats.dnsresolver.TransportType transport = 5;

+

+    // Number of DNS query retry times

+    optional int32 retry_times = 6;

+

+    // Ordinal number of name server.

+    optional int32 dns_server_count = 7;

+

+    // Used only by TCP and DOT. True for new connections.

+    optional bool connected = 8;

+

+    optional int32 latency_micros = 9;

+}

+

+message DnsQueryEvents {

+    repeated DnsQueryEvent dns_query_event = 1;

+}