Use dlopen() and dlsym() for resolver functions
This is a workaround to allow us to use libnetd_resolv.so from
the resolver APEX before b/120661824 is fixed.
Test: builds, boots
Test: system/netd/tests/runtests.sh
Test: atest FrameworksNetTests android.net.cts.ConnectivityManagerTest
Change-Id: I752ae248bb59545b0a4fbc1a7b8c9bcd697a31d4
diff --git a/server/ResolverController.cpp b/server/ResolverController.cpp
index 5d1a694..5e88f78 100644
--- a/server/ResolverController.cpp
+++ b/server/ResolverController.cpp
@@ -48,6 +48,7 @@
#include "ResolverStats.h"
#include "netd_resolv/params.h"
#include "netd_resolv/resolv.h"
+#include "netd_resolv/resolv_stub.h"
#include "netd_resolv/stats.h"
namespace android {
@@ -121,16 +122,17 @@
if (DBG) {
ALOGD("setDnsServers netId = %u, numservers = %d", netId, numservers);
}
- return -resolv_set_nameservers_for_net(netId, servers, numservers, searchDomains, params);
+ return -RESOLV_STUB.resolv_set_nameservers_for_net(netId, servers, numservers, searchDomains,
+ params);
}
int ResolverController::clearDnsServers(unsigned netId) {
- resolv_set_nameservers_for_net(netId, nullptr, 0, "", nullptr);
+ RESOLV_STUB.resolv_set_nameservers_for_net(netId, nullptr, 0, "", nullptr);
if (DBG) {
ALOGD("clearDnsServers netId = %u\n", netId);
}
mDns64Configuration.stopPrefixDiscovery(netId);
- resolv_delete_private_dns_for_net(netId);
+ RESOLV_STUB.resolv_delete_private_dns_for_net(netId);
return 0;
}
@@ -139,7 +141,7 @@
ALOGD("flushDnsCache netId = %u\n", netId);
}
- resolv_flush_cache_for_net(netId);
+ RESOLV_STUB.resolv_delete_cache_for_net(netId);
return 0;
}
@@ -167,8 +169,8 @@
domains->clear();
*params = __res_params{};
stats->clear();
- int revision_id = android_net_res_stats_get_info_for_net(netId, &nscount, res_servers, &dcount,
- res_domains, params, res_stats);
+ int revision_id = RESOLV_STUB.android_net_res_stats_get_info_for_net(
+ netId, &nscount, res_servers, &dcount, res_domains, params, res_stats);
// If the netId is unknown (which can happen for valid net IDs for which no DNS servers have
// yet been configured), there is no revision ID. In this case there is no data to return.
@@ -185,7 +187,7 @@
// Determine which servers are considered usable by the resolver.
bool valid_servers[MAXNS];
std::fill_n(valid_servers, MAXNS, false);
- android_net_res_stats_get_usable_servers(params, res_stats, nscount, valid_servers);
+ RESOLV_STUB.android_net_res_stats_get_usable_servers(params, res_stats, nscount, valid_servers);
// Convert the server sockaddr structures to std::string.
stats->resize(nscount);
@@ -202,9 +204,9 @@
}
servers->push_back(std::move(server_str));
android::net::ResolverStats& cur_stats = (*stats)[i];
- android_net_res_stats_aggregate(&res_stats[i], &cur_stats.successes, &cur_stats.errors,
- &cur_stats.timeouts, &cur_stats.internal_errors, &cur_stats.rtt_avg,
- &cur_stats.last_sample_time);
+ RESOLV_STUB.android_net_res_stats_aggregate(
+ &res_stats[i], &cur_stats.successes, &cur_stats.errors, &cur_stats.timeouts,
+ &cur_stats.internal_errors, &cur_stats.rtt_avg, &cur_stats.last_sample_time);
cur_stats.usable = valid_servers[i];
}
@@ -251,13 +253,13 @@
fwmark.protectedFromVpn = true;
fwmark.permission = PERMISSION_SYSTEM;
- const int err = resolv_set_private_dns_for_net(
+ const int err = RESOLV_STUB.resolv_set_private_dns_for_net(
netId, fwmark.intValue, server_ptrs.data(), server_ptrs.size(), tlsName.c_str(),
fingerprint_ptrs.data(), fingerprint_ptrs.size());
if (err != 0) {
return err;
}
- resolv_register_private_dns_callback(&onPrivateDnsValidation);
+ RESOLV_STUB.resolv_register_private_dns_callback(&onPrivateDnsValidation);
// Convert network-assigned server list to bionic's format.
server_ptrs.clear();
@@ -328,7 +330,7 @@
ResolverStats::encodeAll(res_stats, stats);
ExternalPrivateDnsStatus privateDnsStatus = {PrivateDnsMode::OFF, 0, {}};
- resolv_get_private_dns_status_for_net(netId, &privateDnsStatus);
+ RESOLV_STUB.resolv_get_private_dns_status_for_net(netId, &privateDnsStatus);
for (unsigned i = 0; i < privateDnsStatus.numServers; i++) {
std::string tlsServer_str = addrToString(&(privateDnsStatus.serverStatus[i].ss));
tlsServers->push_back(std::move(tlsServer_str));
@@ -418,7 +420,7 @@
mDns64Configuration.dump(dw, netId);
ExternalPrivateDnsStatus privateDnsStatus = {PrivateDnsMode::OFF, 0, {}};
- resolv_get_private_dns_status_for_net(netId, &privateDnsStatus);
+ RESOLV_STUB.resolv_get_private_dns_status_for_net(netId, &privateDnsStatus);
dw.println("Private DNS mode: %s",
getPrivateDnsModeString(static_cast<PrivateDnsMode>(privateDnsStatus.mode)));
if (!privateDnsStatus.numServers) {