• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 void resolv_populate_res_for_net(ResState* statp);
50 
51 std::vector<unsigned> resolv_list_caches();
52 
53 std::vector<std::string> resolv_cache_dump_subsampling_map(unsigned netid);
54 uint32_t resolv_cache_get_subsampling_denom(unsigned netid, int return_code);
55 
56 typedef enum {
57     RESOLV_CACHE_UNSUPPORTED, /* the cache can't handle that kind of queries */
58                               /* or the answer buffer is too small */
59     RESOLV_CACHE_NOTFOUND,    /* the cache doesn't know about this query */
60     RESOLV_CACHE_FOUND,       /* the cache found the answer */
61     RESOLV_CACHE_SKIP         /* Don't do anything on cache */
62 } ResolvCacheStatus;
63 
64 ResolvCacheStatus resolv_cache_lookup(unsigned netid, const void* query, int querylen, void* answer,
65                                       int answersize, int* answerlen, uint32_t flags);
66 
67 // add a (query,answer) to the cache. If the pair has been in the cache, no new entry will be added
68 // in the cache.
69 int resolv_cache_add(unsigned netid, const void* query, int querylen, const void* answer,
70                      int answerlen);
71 
72 /* Notify the cache a request failed */
73 void _resolv_cache_query_failed(unsigned netid, const void* query, int querylen, uint32_t flags);
74 
75 // Get a customized table for a given network.
76 std::vector<std::string> getCustomizedTableByName(const size_t netid, const char* hostname);
77 
78 // Sets name servers for a given network.
79 // TODO: Pass all of ResolverParamsParcel and remove the res_params argument.
80 int resolv_set_nameservers(unsigned netid, const std::vector<std::string>& servers,
81                            const std::vector<std::string>& domains, const res_params& params,
82                            std::optional<aidl::android::net::ResolverOptionsParcel> resolverOptions,
83                            const std::vector<int32_t>& transportTypes = {});
84 
85 // Sets options for a given network.
86 int resolv_set_options(unsigned netid, const aidl::android::net::ResolverOptionsParcel& options);
87 
88 // Creates the cache associated with the given network.
89 int resolv_create_cache_for_net(unsigned netid);
90 
91 // Deletes the cache associated with the given network.
92 void resolv_delete_cache_for_net(unsigned netid);
93 
94 // Flushes the cache associated with the given network.
95 int resolv_flush_cache_for_net(unsigned netid);
96 
97 // Get transport types to a given network.
98 android::net::NetworkType resolv_get_network_types_for_net(unsigned netid);
99 
100 // Return true if the cache is existent in the given network, false otherwise.
101 bool has_named_cache(unsigned netid);
102 
103 // For test only.
104 // Get the expiration time of a cache entry. Return 0 on success; otherwise, an negative error is
105 // returned if the expiration time can't be acquired.
106 int resolv_cache_get_expiration(unsigned netid, const std::vector<char>& query, time_t* expiration);
107 
108 // Set private DNS servers to DnsStats for a given network.
109 int resolv_stats_set_servers_for_dot(unsigned netid, const std::vector<std::string>& servers);
110 
111 // Add a statistics record to DnsStats for a given network.
112 bool resolv_stats_add(unsigned netid, const android::netdutils::IPSockAddr& server,
113                       const android::net::DnsQueryEvent* record);
114 
115 /* Retrieve a local copy of the stats for the given netid. The buffer must have space for
116  * MAXNS __resolver_stats. Returns the revision id of the resolvers used.
117  */
118 int resolv_cache_get_resolver_stats(
119         unsigned netid, res_params* params, res_stats stats[MAXNS],
120         const std::vector<android::netdutils::IPSockAddr>& serverSockAddrs);
121 
122 /* Add a sample to the shared struct for the given netid and server, provided that the
123  * revision_id of the stored servers has not changed.
124  */
125 void resolv_cache_add_resolver_stats_sample(unsigned netid, int revision_id,
126                                             const android::netdutils::IPSockAddr& serverSockAddr,
127                                             const res_sample& sample, int max_samples);
128 
129 // Convert TRANSPORT_* to NT_*. It's public only for unit testing.
130 android::net::NetworkType convert_network_type(const std::vector<int32_t>& transportTypes);
131 
132 // Dump net configuration log for a given network.
133 void resolv_netconfig_dump(android::netdutils::DumpWriter& dw, unsigned netid);
134