文章目录
2.1.2 方案二,binder方式,未使用?
2.1.2.1 binder::Status NetdNativeService::setResolverConfiguration
system\netd\server\NetdNativeService.cpp
binder::Status NetdNativeService::setResolverConfiguration(int32_t netId,
const std::vector<std::string>& servers, const std::vector<std::string>& domains,
const std::vector<int32_t>& params, const std::string& tlsName,
const std::vector<std::string>& tlsServers,
const std::vector<std::string>& tlsFingerprints) {
// This function intentionally does not lock within Netd, as Bionic is thread-safe.
ENFORCE_PERMISSION(CONNECTIVITY_INTERNAL);
std::set<std::vector<uint8_t>> decoded_fingerprints;
for (const std::string& fingerprint : tlsFingerprints) {
std::vector<uint8_t> decoded = parseBase64(fingerprint);
if (decoded.empty()) {
return binder::Status::fromServiceSpecificError(EINVAL,
String8::format("ResolverController error: bad fingerprint"));
}
decoded_fingerprints.emplace(decoded);
}
int err = gCtls->resolverCtrl.setResolverConfiguration(netId, servers, domains, params,
tlsName, tlsServers, decoded_fingerprints);
if (err != 0) {
return binder::Status::fromServiceSpecificError(-err,
String8::format("ResolverController error: %s", strerror(-err)));
}
return binder::Status::ok();
}
2.1.2.2 native调用ResolverController::setResolverConfiguration
system\netd\server\ResolverController.cpp
int ResolverController::setResolverConfiguration(int32_t netId,
const std::vector<std::string>& servers, const std::vector<std::string>& domains,
const std::vector<int32_t>& params, const std::string& tlsName,
const std::vector<std::string>& tlsServers,
const std::set<std::vector<uint8_t>>& tlsFingerprints) {
using android::net::INetd;
if (params.size() != INetd::RESOLVER_PARAMS_COUNT) {
ALOGE("%s: params.size()=%zu", __FUNCTION__, params.size());
return -EINVAL;
}
const int err = privateDnsConfiguration.set(netId, tlsServers, tlsName, tlsFingerprints);
if (err != 0) {
return err;
}
// Convert network-assigned server list to bionic's format.
auto server_count = std::min<size_t>(MAXNS, servers.size());
std::vector<const char*> server_ptrs;
for (size_t i = 0 ; i < server_count ; ++i) {
server_ptrs.push_back(servers[i].c_str());
}
std::string domains_str;
if (!domains.empty()) {
domains_str = domains[0];
for (size_t i = 1 ; i < domains.size() ; ++i) {
domains_str += " " + domains[i];
}
}
__res_params res_params;
res_params.sample_validity = params[INetd::RESOLVER_PARAMS_SAMPLE_VALIDITY];
res_params.success_threshold = params[INetd::RESOLVER_PARAMS_SUCCESS_THRESHOLD];
res_params.min_samples = params[INetd::RESOLVER_PARAMS_MIN_SAMPLES];
res_params.max_samples = params[INetd::RESOLVER_PARAMS_MAX_SAMPLES];
return setDnsServers(netId, domains_str.c_str(), server_ptrs.data(), server_ptrs.size(),
&res_params);
}