Loading Android.bp +49 −1 Original line number Diff line number Diff line Loading @@ -84,14 +84,18 @@ cc_library { "liblog", "libnetdutils", "libssl", "libstatslog_resolv", "libstatssocket", "libsysutils", "libutils", "netd_event_listener_interface-ndk_platform", "dnsresolver_aidl_interface-ndk_platform", "server_configurable_flags", "stats_proto", "libprotobuf-cpp-lite", ], shared_libs: [ "libbinder_ndk", "libstatslog", ], include_dirs: [ "system/netd/include", Loading @@ -109,6 +113,50 @@ cc_library { }, } cc_library_static { name: "stats_proto", defaults: ["netd_defaults"], proto: { export_proto_headers: true, type: "lite", }, srcs: [ "stats.proto", ], } genrule { name: "statslog_resolv.h", tools: ["stats-log-api-gen"], cmd: "$(location stats-log-api-gen) --header $(genDir)/statslog_resolv.h --module resolv --namespace android,net,stats", out: [ "statslog_resolv.h", ], } genrule { name: "statslog_resolv.cpp", tools: ["stats-log-api-gen"], cmd: "$(location stats-log-api-gen) --cpp $(genDir)/statslog_resolv.cpp --module resolv --namespace android,net,stats --importHeader statslog_resolv.h", out: [ "statslog_resolv.cpp", ], } cc_library_static { name: "libstatslog_resolv", generated_sources: ["statslog_resolv.cpp"], generated_headers: ["statslog_resolv.h"], defaults: ["netd_defaults"], export_generated_headers: ["statslog_resolv.h"], static_libs: [ "libcutils", "liblog", "libstatssocket", "libutils", ], } cc_test { name: "resolv_integration_test", test_suites: ["device-tests"], Loading DnsProxyListener.cpp +25 −12 Original line number Diff line number Diff line Loading @@ -46,7 +46,7 @@ #include <netdutils/ThreadUtil.h> #include <private/android_filesystem_config.h> // AID_SYSTEM #include <resolv.h> #include <statslog.h> #include <statslog_resolv.h> #include <sysutils/SocketClient.h> #include "DnsResolver.h" Loading @@ -55,8 +55,10 @@ #include "ResolverEventReporter.h" #include "netd_resolv/stats.h" // RCODE_TIMEOUT #include "resolv_private.h" #include "stats.pb.h" using aidl::android::net::metrics::INetdEventListener; using android::net::NetworkDnsEventReported; namespace android { Loading Loading @@ -294,10 +296,16 @@ bool parseQuery(const uint8_t* msg, size_t msgLen, uint16_t* query_id, int* rr_t } void reportDnsEvent(int eventType, const android_net_context& netContext, int latencyUs, int returnCode, const std::string& query_name, const std::vector<std::string>& ip_addrs = {}, int total_ip_addr_count = 0) { android::util::stats_write(android::util::NETWORK_DNS_EVENT_REPORTED, eventType, returnCode, latencyUs); int returnCode, const NetworkDnsEventReported& dnsEvent, const std::string& query_name, const std::vector<std::string>& ip_addrs = {}, int total_ip_addr_count = 0) { std::string dnsQueryStats = dnsEvent.dns_query_events().SerializeAsString(); char const* dnsQueryStatsBytes = dnsQueryStats.c_str(); stats::BytesField dnsQueryBytesField{dnsQueryStatsBytes, dnsQueryStats.size()}; android::net::stats::stats_write(android::net::stats::NETWORK_DNS_EVENT_REPORTED, eventType, returnCode, latencyUs, dnsEvent.hints_ai_flags(), dnsEvent.res_nsend_flags(), dnsEvent.network_type(), dnsEvent.private_dns_modes(), dnsQueryBytesField); const auto& listeners = ResolverEventReporter::getInstance().getListeners(); if (listeners.size() == 0) { Loading Loading @@ -635,6 +643,7 @@ void DnsProxyListener::GetAddrInfoHandler::run() { maybeFixupNetContext(&mNetContext); const uid_t uid = mClient->getUid(); int32_t rv = 0; NetworkDnsEventReported dnsEvent; if (queryLimiter.start(uid)) { rv = android_getaddrinfofornetcontext(mHost, mService, mHints, &mNetContext, &result); queryLimiter.finish(uid); Loading Loading @@ -666,8 +675,8 @@ void DnsProxyListener::GetAddrInfoHandler::run() { } std::vector<std::string> ip_addrs; const int total_ip_addr_count = extractGetAddrInfoAnswers(result, &ip_addrs); reportDnsEvent(INetdEventListener::EVENT_GETADDRINFO, mNetContext, latencyUs, rv, mHost, ip_addrs, total_ip_addr_count); reportDnsEvent(INetdEventListener::EVENT_GETADDRINFO, mNetContext, latencyUs, rv, dnsEvent, mHost, ip_addrs, total_ip_addr_count); freeaddrinfo(result); mClient->decRef(); } Loading Loading @@ -837,6 +846,7 @@ void DnsProxyListener::ResNSendHandler::run() { // Send DNS query std::vector<uint8_t> ansBuf(MAXPACKET, 0); int arcode, nsendAns = -1; NetworkDnsEventReported dnsEvent; if (queryLimiter.start(uid)) { nsendAns = resolv_res_nsend(&mNetContext, msg.data(), msgLen, ansBuf.data(), MAXPACKET, &arcode, static_cast<ResNsendFlags>(mFlags)); Loading @@ -854,7 +864,7 @@ void DnsProxyListener::ResNSendHandler::run() { sendBE32(mClient, nsendAns); if (rr_type == ns_t_a || rr_type == ns_t_aaaa) { reportDnsEvent(INetdEventListener::EVENT_RES_NSEND, mNetContext, latencyUs, resNSendToAiError(nsendAns, arcode), rr_name); resNSendToAiError(nsendAns, arcode), dnsEvent, rr_name); } return; } Loading @@ -877,7 +887,8 @@ void DnsProxyListener::ResNSendHandler::run() { const int total_ip_addr_count = extractResNsendAnswers((uint8_t*) ansBuf.data(), nsendAns, rr_type, &ip_addrs); reportDnsEvent(INetdEventListener::EVENT_RES_NSEND, mNetContext, latencyUs, resNSendToAiError(nsendAns, arcode), rr_name, ip_addrs, total_ip_addr_count); resNSendToAiError(nsendAns, arcode), dnsEvent, rr_name, ip_addrs, total_ip_addr_count); } } Loading Loading @@ -973,6 +984,7 @@ void DnsProxyListener::GetHostByNameHandler::run() { const uid_t uid = mClient->getUid(); hostent* hp = nullptr; int32_t rv = 0; NetworkDnsEventReported dnsEvent; if (queryLimiter.start(uid)) { rv = android_gethostbynamefornetcontext(mName, mAf, &mNetContext, &hp); queryLimiter.finish(uid); Loading Loading @@ -1001,8 +1013,8 @@ void DnsProxyListener::GetHostByNameHandler::run() { std::vector<std::string> ip_addrs; const int total_ip_addr_count = extractGetHostByNameAnswers(hp, &ip_addrs); reportDnsEvent(INetdEventListener::EVENT_GETHOSTBYNAME, mNetContext, latencyUs, rv, mName, ip_addrs, total_ip_addr_count); reportDnsEvent(INetdEventListener::EVENT_GETHOSTBYNAME, mNetContext, latencyUs, rv, dnsEvent, mName, ip_addrs, total_ip_addr_count); mClient->decRef(); } Loading Loading @@ -1121,6 +1133,7 @@ void DnsProxyListener::GetHostByAddrHandler::run() { const uid_t uid = mClient->getUid(); hostent* hp = nullptr; int32_t rv = 0; NetworkDnsEventReported dnsEvent; if (queryLimiter.start(uid)) { rv = android_gethostbyaddrfornetcontext(mAddress, mAddressLen, mAddressFamily, &mNetContext, &hp); Loading Loading @@ -1148,7 +1161,7 @@ void DnsProxyListener::GetHostByAddrHandler::run() { LOG(WARNING) << "GetHostByAddrHandler::run: Error writing DNS result to client"; } reportDnsEvent(INetdEventListener::EVENT_GETHOSTBYADDR, mNetContext, latencyUs, rv, reportDnsEvent(INetdEventListener::EVENT_GETHOSTBYADDR, mNetContext, latencyUs, rv, dnsEvent, (hp && hp->h_name) ? hp->h_name : "null", {}, 0); mClient->decRef(); } Loading stats.proto 0 → 100644 +249 −0 Original line number Diff line number Diff line /* * 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"; option optimize_for = LITE_RUNTIME; package android.net; 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 NsRcode rcode = 1; optional NsType type = 2; optional CacheStatus cache_hit = 3; optional IpVersion ip_version = 4; optional 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; } /** * 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 { optional EventType event_type = 1; optional ReturnCode return_code = 2; // 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 Transport network_type = 6; // The DNS over TLS mode on a specific netId. optional 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 DnsQueryEvents dns_query_events = 8; } No newline at end of file Loading
Android.bp +49 −1 Original line number Diff line number Diff line Loading @@ -84,14 +84,18 @@ cc_library { "liblog", "libnetdutils", "libssl", "libstatslog_resolv", "libstatssocket", "libsysutils", "libutils", "netd_event_listener_interface-ndk_platform", "dnsresolver_aidl_interface-ndk_platform", "server_configurable_flags", "stats_proto", "libprotobuf-cpp-lite", ], shared_libs: [ "libbinder_ndk", "libstatslog", ], include_dirs: [ "system/netd/include", Loading @@ -109,6 +113,50 @@ cc_library { }, } cc_library_static { name: "stats_proto", defaults: ["netd_defaults"], proto: { export_proto_headers: true, type: "lite", }, srcs: [ "stats.proto", ], } genrule { name: "statslog_resolv.h", tools: ["stats-log-api-gen"], cmd: "$(location stats-log-api-gen) --header $(genDir)/statslog_resolv.h --module resolv --namespace android,net,stats", out: [ "statslog_resolv.h", ], } genrule { name: "statslog_resolv.cpp", tools: ["stats-log-api-gen"], cmd: "$(location stats-log-api-gen) --cpp $(genDir)/statslog_resolv.cpp --module resolv --namespace android,net,stats --importHeader statslog_resolv.h", out: [ "statslog_resolv.cpp", ], } cc_library_static { name: "libstatslog_resolv", generated_sources: ["statslog_resolv.cpp"], generated_headers: ["statslog_resolv.h"], defaults: ["netd_defaults"], export_generated_headers: ["statslog_resolv.h"], static_libs: [ "libcutils", "liblog", "libstatssocket", "libutils", ], } cc_test { name: "resolv_integration_test", test_suites: ["device-tests"], Loading
DnsProxyListener.cpp +25 −12 Original line number Diff line number Diff line Loading @@ -46,7 +46,7 @@ #include <netdutils/ThreadUtil.h> #include <private/android_filesystem_config.h> // AID_SYSTEM #include <resolv.h> #include <statslog.h> #include <statslog_resolv.h> #include <sysutils/SocketClient.h> #include "DnsResolver.h" Loading @@ -55,8 +55,10 @@ #include "ResolverEventReporter.h" #include "netd_resolv/stats.h" // RCODE_TIMEOUT #include "resolv_private.h" #include "stats.pb.h" using aidl::android::net::metrics::INetdEventListener; using android::net::NetworkDnsEventReported; namespace android { Loading Loading @@ -294,10 +296,16 @@ bool parseQuery(const uint8_t* msg, size_t msgLen, uint16_t* query_id, int* rr_t } void reportDnsEvent(int eventType, const android_net_context& netContext, int latencyUs, int returnCode, const std::string& query_name, const std::vector<std::string>& ip_addrs = {}, int total_ip_addr_count = 0) { android::util::stats_write(android::util::NETWORK_DNS_EVENT_REPORTED, eventType, returnCode, latencyUs); int returnCode, const NetworkDnsEventReported& dnsEvent, const std::string& query_name, const std::vector<std::string>& ip_addrs = {}, int total_ip_addr_count = 0) { std::string dnsQueryStats = dnsEvent.dns_query_events().SerializeAsString(); char const* dnsQueryStatsBytes = dnsQueryStats.c_str(); stats::BytesField dnsQueryBytesField{dnsQueryStatsBytes, dnsQueryStats.size()}; android::net::stats::stats_write(android::net::stats::NETWORK_DNS_EVENT_REPORTED, eventType, returnCode, latencyUs, dnsEvent.hints_ai_flags(), dnsEvent.res_nsend_flags(), dnsEvent.network_type(), dnsEvent.private_dns_modes(), dnsQueryBytesField); const auto& listeners = ResolverEventReporter::getInstance().getListeners(); if (listeners.size() == 0) { Loading Loading @@ -635,6 +643,7 @@ void DnsProxyListener::GetAddrInfoHandler::run() { maybeFixupNetContext(&mNetContext); const uid_t uid = mClient->getUid(); int32_t rv = 0; NetworkDnsEventReported dnsEvent; if (queryLimiter.start(uid)) { rv = android_getaddrinfofornetcontext(mHost, mService, mHints, &mNetContext, &result); queryLimiter.finish(uid); Loading Loading @@ -666,8 +675,8 @@ void DnsProxyListener::GetAddrInfoHandler::run() { } std::vector<std::string> ip_addrs; const int total_ip_addr_count = extractGetAddrInfoAnswers(result, &ip_addrs); reportDnsEvent(INetdEventListener::EVENT_GETADDRINFO, mNetContext, latencyUs, rv, mHost, ip_addrs, total_ip_addr_count); reportDnsEvent(INetdEventListener::EVENT_GETADDRINFO, mNetContext, latencyUs, rv, dnsEvent, mHost, ip_addrs, total_ip_addr_count); freeaddrinfo(result); mClient->decRef(); } Loading Loading @@ -837,6 +846,7 @@ void DnsProxyListener::ResNSendHandler::run() { // Send DNS query std::vector<uint8_t> ansBuf(MAXPACKET, 0); int arcode, nsendAns = -1; NetworkDnsEventReported dnsEvent; if (queryLimiter.start(uid)) { nsendAns = resolv_res_nsend(&mNetContext, msg.data(), msgLen, ansBuf.data(), MAXPACKET, &arcode, static_cast<ResNsendFlags>(mFlags)); Loading @@ -854,7 +864,7 @@ void DnsProxyListener::ResNSendHandler::run() { sendBE32(mClient, nsendAns); if (rr_type == ns_t_a || rr_type == ns_t_aaaa) { reportDnsEvent(INetdEventListener::EVENT_RES_NSEND, mNetContext, latencyUs, resNSendToAiError(nsendAns, arcode), rr_name); resNSendToAiError(nsendAns, arcode), dnsEvent, rr_name); } return; } Loading @@ -877,7 +887,8 @@ void DnsProxyListener::ResNSendHandler::run() { const int total_ip_addr_count = extractResNsendAnswers((uint8_t*) ansBuf.data(), nsendAns, rr_type, &ip_addrs); reportDnsEvent(INetdEventListener::EVENT_RES_NSEND, mNetContext, latencyUs, resNSendToAiError(nsendAns, arcode), rr_name, ip_addrs, total_ip_addr_count); resNSendToAiError(nsendAns, arcode), dnsEvent, rr_name, ip_addrs, total_ip_addr_count); } } Loading Loading @@ -973,6 +984,7 @@ void DnsProxyListener::GetHostByNameHandler::run() { const uid_t uid = mClient->getUid(); hostent* hp = nullptr; int32_t rv = 0; NetworkDnsEventReported dnsEvent; if (queryLimiter.start(uid)) { rv = android_gethostbynamefornetcontext(mName, mAf, &mNetContext, &hp); queryLimiter.finish(uid); Loading Loading @@ -1001,8 +1013,8 @@ void DnsProxyListener::GetHostByNameHandler::run() { std::vector<std::string> ip_addrs; const int total_ip_addr_count = extractGetHostByNameAnswers(hp, &ip_addrs); reportDnsEvent(INetdEventListener::EVENT_GETHOSTBYNAME, mNetContext, latencyUs, rv, mName, ip_addrs, total_ip_addr_count); reportDnsEvent(INetdEventListener::EVENT_GETHOSTBYNAME, mNetContext, latencyUs, rv, dnsEvent, mName, ip_addrs, total_ip_addr_count); mClient->decRef(); } Loading Loading @@ -1121,6 +1133,7 @@ void DnsProxyListener::GetHostByAddrHandler::run() { const uid_t uid = mClient->getUid(); hostent* hp = nullptr; int32_t rv = 0; NetworkDnsEventReported dnsEvent; if (queryLimiter.start(uid)) { rv = android_gethostbyaddrfornetcontext(mAddress, mAddressLen, mAddressFamily, &mNetContext, &hp); Loading Loading @@ -1148,7 +1161,7 @@ void DnsProxyListener::GetHostByAddrHandler::run() { LOG(WARNING) << "GetHostByAddrHandler::run: Error writing DNS result to client"; } reportDnsEvent(INetdEventListener::EVENT_GETHOSTBYADDR, mNetContext, latencyUs, rv, reportDnsEvent(INetdEventListener::EVENT_GETHOSTBYADDR, mNetContext, latencyUs, rv, dnsEvent, (hp && hp->h_name) ? hp->h_name : "null", {}, 0); mClient->decRef(); } Loading
stats.proto 0 → 100644 +249 −0 Original line number Diff line number Diff line /* * 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"; option optimize_for = LITE_RUNTIME; package android.net; 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 NsRcode rcode = 1; optional NsType type = 2; optional CacheStatus cache_hit = 3; optional IpVersion ip_version = 4; optional 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; } /** * 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 { optional EventType event_type = 1; optional ReturnCode return_code = 2; // 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 Transport network_type = 6; // The DNS over TLS mode on a specific netId. optional 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 DnsQueryEvents dns_query_events = 8; } No newline at end of file