Move DnsProxyListener to libnetd_resolv
[1] Support APIs for netd to set callbacks and bring up
DnsProxyListener.
[2] Keep DnsProxyListener functioning as usual by function pointers,
including getNetworkContext(), checkCallingPermission(), and
getPrefix64().
[3] Use libbinder_ndk to report onDnsEvent().
Test: as follows
- built, flashed, booted
- system/netd/tests/runtests.sh passed
- netd_benchmark passed
- Browsing websites passed
Change-Id: Ib6575833c248579aa079e302795b6d6cddde1f2b
diff --git a/server/ResolverController.cpp b/server/ResolverController.cpp
index 39a0b83..c746f26 100644
--- a/server/ResolverController.cpp
+++ b/server/ResolverController.cpp
@@ -108,6 +108,24 @@
}
}
+void getNetworkContextCallback(uint32_t netId, uint32_t uid, android_net_context* netcontext) {
+ net::gCtls->netCtrl.getNetworkContext(netId, uid, netcontext);
+}
+
+bool getDns64PrefixCallback(unsigned netId, in6_addr* v6addr, uint8_t* prefix_len) {
+ netdutils::IPPrefix prefix{};
+ if (net::gCtls->resolverCtrl.getPrefix64(netId, &prefix) != 0) {
+ return false;
+ }
+ *v6addr = prefix.addr6();
+ *prefix_len = prefix.length();
+ return true;
+}
+
+bool checkCallingPermissionCallback(const char* permission) {
+ return checkCallingPermission(String16(permission));
+}
+
bool allIPv6Only(const std::vector<std::string>& servers) {
for (const auto& server : servers) {
if (server.find(':') == std::string::npos) return false;
@@ -356,6 +374,15 @@
args.prefixLength);
}
+bool ResolverController::initResolver() {
+ dnsproxylistener_callbacks callbacks = {
+ .get_network_context = &getNetworkContextCallback,
+ .get_dns64_prefix = &getDns64PrefixCallback,
+ .check_calling_permission = &checkCallingPermissionCallback,
+ };
+ return RESOLV_STUB.resolv_init(callbacks);
+}
+
void ResolverController::dump(DumpWriter& dw, unsigned netId) {
// No lock needed since Bionic's resolver locks all accessed data structures internally.
using android::net::ResolverStats;