diff options
author | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | 2023-09-23 22:15:37 +0000 |
---|---|---|
committer | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | 2023-09-23 22:15:37 +0000 |
commit | f816008ae14dec98aa2abb5f26a9a781f8978b20 (patch) | |
tree | 9adecea3f78630452ebc0d347a5b235595224341 | |
parent | f5d037950cee6155d9ec08fb65145821b4c7436f (diff) | |
parent | 20012bac489f05d0cf8ee8c83560d5346222905d (diff) | |
download | DnsResolver-android11-platform-release.tar.gz |
Merge cherrypicks of ['googleplex-android-review.googlesource.com/24365338'] into rvc-platform-release.android-platform-11.0.0_r40android-platform-11.0.0_r39android-platform-11.0.0_r38android-platform-11.0.0_r37android-platform-11.0.0_r36android11-platform-release
Change-Id: I3e2b9b52d3f179f865ced86c21723e200376db9f
-rw-r--r-- | Android.bp | 1 | ||||
-rw-r--r-- | Dns64Configuration.cpp | 17 | ||||
-rw-r--r-- | Dns64Configuration.h | 3 | ||||
-rw-r--r-- | ResolverController.cpp | 15 | ||||
-rw-r--r-- | ResolverController.h | 6 |
5 files changed, 23 insertions, 19 deletions
@@ -136,6 +136,7 @@ cc_library { "libstatspush_compat", "libsysutils", "netd_event_listener_interface-ndk_platform", + "libutils", "server_configurable_flags", "stats_proto", ], diff --git a/Dns64Configuration.cpp b/Dns64Configuration.cpp index 77a27e79..94abedae 100644 --- a/Dns64Configuration.cpp +++ b/Dns64Configuration.cpp @@ -24,6 +24,7 @@ #include <netdutils/DumpWriter.h> #include <netdutils/InternetAddresses.h> #include <netdutils/ThreadUtil.h> +#include <utils/StrongPointer.h> #include <thread> #include <utility> @@ -38,6 +39,7 @@ namespace android { using android::base::StringPrintf; using android::net::NetworkDnsEventReported; +using android::sp; using netdutils::DumpWriter; using netdutils::IPAddress; using netdutils::IPPrefix; @@ -63,8 +65,9 @@ void Dns64Configuration::startPrefixDiscovery(unsigned netId) { // Emplace a copy of |cfg| in the map. mDns64Configs.emplace(std::make_pair(netId, cfg)); + const sp<Dns64Configuration> thiz = this; // Note that capturing |cfg| in this lambda creates a copy. - std::thread discovery_thread([this, cfg, netId] { + std::thread discovery_thread([thiz, cfg, netId] { setThreadName(StringPrintf("Nat64Pfx_%u", netId).c_str()); // Make a mutable copy rather than mark the whole lambda mutable. @@ -77,28 +80,28 @@ void Dns64Configuration::startPrefixDiscovery(unsigned netId) { .build(); while (true) { - if (!this->shouldContinueDiscovery(evalCfg)) break; + if (!thiz->shouldContinueDiscovery(evalCfg)) break; android_net_context netcontext{}; - mGetNetworkContextCallback(evalCfg.netId, 0, &netcontext); + thiz->mGetNetworkContextCallback(evalCfg.netId, 0, &netcontext); // Prefix discovery must bypass private DNS because in strict mode // the server generally won't know the NAT64 prefix. netcontext.flags |= NET_CONTEXT_FLAG_USE_LOCAL_NAMESERVERS; if (doRfc7050PrefixDiscovery(netcontext, &evalCfg)) { - this->recordDns64Config(evalCfg); + thiz->recordDns64Config(evalCfg); break; } - if (!this->shouldContinueDiscovery(evalCfg)) break; + if (!thiz->shouldContinueDiscovery(evalCfg)) break; if (!backoff.hasNextTimeout()) break; { - std::unique_lock<std::mutex> cvGuard(mMutex); + std::unique_lock<std::mutex> cvGuard(thiz->mMutex); // TODO: Consider some chrono math, combined with wait_until() // perhaps, to prevent early re-resolves from the removal of // other netids with IPv6-only nameservers. - mCv.wait_for(cvGuard, backoff.getNextTimeout()); + thiz->mCv.wait_for(cvGuard, backoff.getNextTimeout()); } } }); diff --git a/Dns64Configuration.h b/Dns64Configuration.h index 387de785..ebc63dbe 100644 --- a/Dns64Configuration.h +++ b/Dns64Configuration.h @@ -26,6 +26,7 @@ #include <android-base/thread_annotations.h> #include <netdutils/DumpWriter.h> #include <netdutils/InternetAddresses.h> +#include <utils/RefBase.h> struct android_net_context; @@ -47,7 +48,7 @@ namespace net { * Thread-safety: All public methods in this class MUST be thread-safe. * (In other words: this class handles all its locking privately.) */ -class Dns64Configuration { +class Dns64Configuration : virtual public RefBase { public: // Simple data struct for passing back packet NAT64 prefix event information to the // Dns64PrefixCallback callback. diff --git a/ResolverController.cpp b/ResolverController.cpp index be0b989f..f4790837 100644 --- a/ResolverController.cpp +++ b/ResolverController.cpp @@ -173,17 +173,17 @@ int getDnsInfo(unsigned netId, std::vector<std::string>* servers, std::vector<st } // namespace ResolverController::ResolverController() - : mDns64Configuration( + : mDns64Configuration(new Dns64Configuration( [](uint32_t netId, uint32_t uid, android_net_context* netcontext) { gResNetdCallbacks.get_network_context(netId, uid, netcontext); }, - std::bind(sendNat64PrefixEvent, std::placeholders::_1)) {} + std::bind(sendNat64PrefixEvent, std::placeholders::_1))) {} void ResolverController::destroyNetworkCache(unsigned netId) { LOG(VERBOSE) << __func__ << ": netId = " << netId; resolv_delete_cache_for_net(netId); - mDns64Configuration.stopPrefixDiscovery(netId); + mDns64Configuration->stopPrefixDiscovery(netId); gPrivateDnsConfiguration.clear(netId); } @@ -270,16 +270,16 @@ int ResolverController::getResolverInfo(int32_t netId, std::vector<std::string>* } void ResolverController::startPrefix64Discovery(int32_t netId) { - mDns64Configuration.startPrefixDiscovery(netId); + mDns64Configuration->startPrefixDiscovery(netId); } void ResolverController::stopPrefix64Discovery(int32_t netId) { - return mDns64Configuration.stopPrefixDiscovery(netId); + return mDns64Configuration->stopPrefixDiscovery(netId); } // TODO: use StatusOr<T> to wrap the result. int ResolverController::getPrefix64(unsigned netId, netdutils::IPPrefix* prefix) { - netdutils::IPPrefix p = mDns64Configuration.getPrefix64(netId); + netdutils::IPPrefix p = mDns64Configuration->getPrefix64(netId); if (p.family() != AF_INET6 || p.length() == 0) { LOG(INFO) << "No valid NAT64 prefix (" << netId << ", " << p.toString().c_str() << ")"; @@ -345,8 +345,7 @@ void ResolverController::dump(DumpWriter& dw, unsigned netId) { params.sample_validity, params.success_threshold, params.min_samples, params.max_samples, params.base_timeout_msec, params.retry_count); } - - mDns64Configuration.dump(dw, netId); + mDns64Configuration->dump(dw, netId); const auto privateDnsStatus = gPrivateDnsConfiguration.getStatus(netId); dw.println("Private DNS mode: %s", getPrivateDnsModeString(privateDnsStatus.mode)); if (privateDnsStatus.serversMap.size() == 0) { diff --git a/ResolverController.h b/ResolverController.h index e81e1edb..3802e36c 100644 --- a/ResolverController.h +++ b/ResolverController.h @@ -55,10 +55,10 @@ class ResolverController { // Set or clear a NAT64 prefix discovered by other sources (e.g., RA). int setPrefix64(unsigned netId, const netdutils::IPPrefix& prefix) { - return mDns64Configuration.setPrefix64(netId, prefix); + return mDns64Configuration->setPrefix64(netId, prefix); } - int clearPrefix64(unsigned netId) { return mDns64Configuration.clearPrefix64(netId); } + int clearPrefix64(unsigned netId) { return mDns64Configuration->clearPrefix64(netId); } // Return the current NAT64 prefix network, regardless of how it was discovered. int getPrefix64(unsigned netId, netdutils::IPPrefix* prefix); @@ -66,7 +66,7 @@ class ResolverController { void dump(netdutils::DumpWriter& dw, unsigned netId); private: - Dns64Configuration mDns64Configuration; + android::sp<Dns64Configuration> mDns64Configuration; }; } // namespace net } // namespace android |