1 /*
2  * Copyright (C) 2008 The Android Open Source Project
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  *  * Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  *  * Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in
12  *    the documentation and/or other materials provided with the
13  *    distribution.
14  *
15  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
16  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
17  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
18  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
19  * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
20  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
21  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
22  * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
23  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
24  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
25  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26  * SUCH DAMAGE.
27  */
28 
29 #pragma once
30 
31 #include <unordered_map>
32 #include <vector>
33 
34 #include <aidl/android/net/IDnsResolver.h>
35 #include <aidl/android/net/ResolverOptionsParcel.h>
36 
37 #include <netdutils/DumpWriter.h>
38 #include <netdutils/InternetAddresses.h>
39 #include <stats.pb.h>
40 
41 #include "ResolverStats.h"
42 #include "params.h"
43 #include "stats.h"
44 
45 // Sets the name server addresses to the provided ResState.
46 // The name servers are retrieved from the cache which is associated
47 // with the network to which ResState is associated.
48 struct ResState;
49 
50 typedef std::multimap<std::string /* hostname */, std::string /* IPv4/IPv6 address */> HostMapping;
51 
52 void resolv_populate_res_for_net(ResState* statp);
53 
54 std::vector<unsigned> resolv_list_caches();
55 
56 std::vector<std::string> resolv_cache_dump_subsampling_map(unsigned netid);
57 uint32_t resolv_cache_get_subsampling_denom(unsigned netid, int return_code);
58 
59 typedef enum {
60     RESOLV_CACHE_UNSUPPORTED, /* the cache can't handle that kind of queries */
61                               /* or the answer buffer is too small */
62     RESOLV_CACHE_NOTFOUND,    /* the cache doesn't know about this query */
63     RESOLV_CACHE_FOUND,       /* the cache found the answer */
64     RESOLV_CACHE_SKIP         /* Don't do anything on cache */
65 } ResolvCacheStatus;
66 
67 ResolvCacheStatus resolv_cache_lookup(unsigned netid, const void* query, int querylen, void* answer,
68                                       int answersize, int* answerlen, uint32_t flags);
69 
70 // add a (query,answer) to the cache. If the pair has been in the cache, no new entry will be added
71 // in the cache.
72 int resolv_cache_add(unsigned netid, const void* query, int querylen, const void* answer,
73                      int answerlen);
74 
75 /* Notify the cache a request failed */
76 void _resolv_cache_query_failed(unsigned netid, const void* query, int querylen, uint32_t flags);
77 
78 // Get a customized table for a given network.
79 std::vector<std::string> getCustomizedTableByName(const size_t netid, const char* hostname);
80 
81 // Sets name servers for a given network.
82 // TODO: Pass all of ResolverParamsParcel and remove the res_params argument.
83 int resolv_set_nameservers(unsigned netid, const std::vector<std::string>& servers,
84                            const std::vector<std::string>& domains, const res_params& params,
85                            const aidl::android::net::ResolverOptionsParcel& resolverOptions =
86                                    {{} /* hosts */,
87                                     aidl::android::net::IDnsResolver::TC_MODE_DEFAULT,
88                                     false /* enforceDnsUid */},
89                            const std::vector<int32_t>& transportTypes = {});
90 
91 // Creates the cache associated with the given network.
92 int resolv_create_cache_for_net(unsigned netid);
93 
94 // Deletes the cache associated with the given network.
95 void resolv_delete_cache_for_net(unsigned netid);
96 
97 // Flushes the cache associated with the given network.
98 int resolv_flush_cache_for_net(unsigned netid);
99 
100 // Get transport types to a given network.
101 android::net::NetworkType resolv_get_network_types_for_net(unsigned netid);
102 
103 // For test only.
104 // Return true if the cache is existent in the given network, false otherwise.
105 bool has_named_cache(unsigned netid);
106 
107 // For test only.
108 // Get the expiration time of a cache entry. Return 0 on success; otherwise, an negative error is
109 // returned if the expiration time can't be acquired.
110 int resolv_cache_get_expiration(unsigned netid, const std::vector<char>& query, time_t* expiration);
111 
112 // Set private DNS servers to DnsStats for a given network.
113 int resolv_stats_set_servers_for_dot(unsigned netid, const std::vector<std::string>& servers);
114 
115 // Add a statistics record to DnsStats for a given network.
116 bool resolv_stats_add(unsigned netid, const android::netdutils::IPSockAddr& server,
117                       const android::net::DnsQueryEvent* record);
118 
119 /* Retrieve a local copy of the stats for the given netid. The buffer must have space for
120  * MAXNS __resolver_stats. Returns the revision id of the resolvers used.
121  */
122 int resolv_cache_get_resolver_stats(
123         unsigned netid, res_params* params, res_stats stats[MAXNS],
124         const std::vector<android::netdutils::IPSockAddr>& serverSockAddrs);
125 
126 /* Add a sample to the shared struct for the given netid and server, provided that the
127  * revision_id of the stored servers has not changed.
128  */
129 void resolv_cache_add_resolver_stats_sample(unsigned netid, int revision_id,
130                                             const android::netdutils::IPSockAddr& serverSockAddr,
131                                             const res_sample& sample, int max_samples);
132 
133 // Convert TRANSPORT_* to NT_*. It's public only for unit testing.
134 android::net::NetworkType convert_network_type(const std::vector<int32_t>& transportTypes);
135 
136 // Dump net configuration log for a given network.
137 void resolv_netconfig_dump(android::netdutils::DumpWriter& dw, unsigned netid);
138