Synthesize DNS64 prefix in netd
Synthesize DNS64 prefix with IPv4 dns query result in the following
conditions:
1. If specify address family to IPv6 and no IPv6 addresses result is
obtained, then if IPv4 addresses result could be obtained
2. If address family is unspecified and query results are all IPv4
addresses
Test: built, flashed, booted
system/netd/tests/runtests.sh passes
Bug: 78545619
Change-Id: Ia7c5963c054772f8c95b95849282e9d9d5761515
diff --git a/server/ResolverController.cpp b/server/ResolverController.cpp
index c96e90e..5d1a694 100644
--- a/server/ResolverController.cpp
+++ b/server/ResolverController.cpp
@@ -343,6 +343,27 @@
return 0;
}
+// TODO: use StatusOr<T> to wrap the result.
+int ResolverController::getPrefix64(unsigned netId, netdutils::IPPrefix* prefix) {
+ netdutils::IPPrefix p = mDns64Configuration.getPrefix64(netId);
+ if (p.family() != AF_INET6 || p.length() == 0) {
+ ALOGE("No valid NAT64 prefix (%d,%s)\n", netId, p.toString().c_str());
+ return -ENOENT;
+ }
+ *prefix = p;
+ return 0;
+}
+
+void ResolverController::sendNat64PrefixEvent(const Dns64Configuration::Nat64PrefixInfo& args) {
+ const auto netdEventListener = net::gCtls->eventReporter.getNetdEventListener();
+ if (netdEventListener == nullptr) {
+ gLog.error("getNetdEventListener() returned nullptr. dropping NAT64 prefix event");
+ return;
+ }
+ netdEventListener->onNat64PrefixEvent(args.netId, args.added, args.prefixString,
+ args.prefixLength);
+}
+
void ResolverController::dump(DumpWriter& dw, unsigned netId) {
// No lock needed since Bionic's resolver locks all accessed data structures internally.
using android::net::ResolverStats;