aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndroid Build Coastguard Worker <android-build-coastguard-worker@google.com>2023-09-23 22:15:37 +0000
committerAndroid Build Coastguard Worker <android-build-coastguard-worker@google.com>2023-09-23 22:15:37 +0000
commitf816008ae14dec98aa2abb5f26a9a781f8978b20 (patch)
tree9adecea3f78630452ebc0d347a5b235595224341
parentf5d037950cee6155d9ec08fb65145821b4c7436f (diff)
parent20012bac489f05d0cf8ee8c83560d5346222905d (diff)
downloadDnsResolver-android11-platform-release.tar.gz
Change-Id: I3e2b9b52d3f179f865ced86c21723e200376db9f
-rw-r--r--Android.bp1
-rw-r--r--Dns64Configuration.cpp17
-rw-r--r--Dns64Configuration.h3
-rw-r--r--ResolverController.cpp15
-rw-r--r--ResolverController.h6
5 files changed, 23 insertions, 19 deletions
diff --git a/Android.bp b/Android.bp
index db610a63..86af506a 100644
--- a/Android.bp
+++ b/Android.bp
@@ -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