Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a17ba5ae authored by Ken Chen's avatar Ken Chen
Browse files

Exclude VPN and mobile data from .local resolution

There is no point in sending multicast DNS over VPN or mobile data.

Bug: 209492138
Test: atest
Test: adb root; adb shell dumpsys dnsresolver
Change-Id: I8987d3c9f219c42247e9fd8f85880a1d49fcedad
parent a4d7bb98
Loading
Loading
Loading
Loading
+5 −4
Original line number Diff line number Diff line
@@ -332,7 +332,8 @@ void maybeLogQuery(int eventType, const android_net_context& netContext,
void reportDnsEvent(int eventType, const android_net_context& netContext, int latencyUs,
                    int returnCode, NetworkDnsEventReported& event, const std::string& query_name,
                    const std::vector<std::string>& ip_addrs = {}, int total_ip_addr_count = 0) {
    uint32_t rate = (query_name.ends_with(".local") &&
    uint32_t rate =
            (query_name.ends_with(".local") && is_mdns_supported_network(netContext.dns_netid) &&
             android::net::Experiments::getInstance()->getFlag("mdns_resolution", 1))
                    ? getDnsEventSubsamplingRate(netContext.dns_netid, returnCode, true)
                    : getDnsEventSubsamplingRate(netContext.dns_netid, returnCode, false);
+6 −4
Original line number Diff line number Diff line
@@ -219,11 +219,13 @@ int ResolverController::setResolverConfiguration(const ResolverParamsParcel& res
        return err;
    }

    if (err = resolv_stats_set_addrs(resolverParams.netId, PROTO_MDNS, {"ff02::fb", "224.0.0.251"},
                                     5353);
    if (is_mdns_supported_transport_types(resolverParams.transportTypes)) {
        if (err = resolv_stats_set_addrs(resolverParams.netId, PROTO_MDNS,
                                         {"ff02::fb", "224.0.0.251"}, 5353);
            err != 0) {
            return err;
        }
    }

    if (isDoHEnabled()) {
        err = privateDnsConfiguration.setDoh(resolverParams.netId, netcontext.app_mark, tlsServers,
+1 −1
Original line number Diff line number Diff line
@@ -1437,7 +1437,7 @@ static int dns_getaddrinfo(const char* name, const addrinfo* pai,

    ResState res(netcontext, event);

    setMdnsFlag(name, &(res.flags));
    setMdnsFlag(name, res.netid, &(res.flags));

    if (isMdnsResolution(res.flags)) {
        q.qclass |= C_UNICAST;
+3 −3
Original line number Diff line number Diff line
@@ -377,7 +377,7 @@ int resolv_gethostbyname(const char* name, int af, hostent* hp, char* buf, size_
    getnamaddr info;
    ResState res(netcontext, event);

    setMdnsFlag(name, &(res.flags));
    setMdnsFlag(name, res.netid, &(res.flags));

    size_t size;
    switch (af) {
@@ -756,8 +756,8 @@ int herrnoToAiErrno(int he) {
    }
}

void setMdnsFlag(std::string_view hostname, uint32_t* flags) {
    if (hostname.ends_with(".local") &&
void setMdnsFlag(std::string_view hostname, unsigned netid, uint32_t* flags) {
    if (hostname.ends_with(".local") && is_mdns_supported_network(netid) &&
        android::net::Experiments::getInstance()->getFlag("mdns_resolution", 1))
        *flags |= RES_F_MDNS;
}
+16 −0
Original line number Diff line number Diff line
@@ -1562,6 +1562,22 @@ android::net::NetworkType resolv_get_network_types_for_net(unsigned netid) {
    return convert_network_type(netconfig->transportTypes);
}

bool is_mdns_supported_transport_types(const std::vector<int32_t>& transportTypes) {
    for (const auto& tp : transportTypes) {
        if (tp == IDnsResolver::TRANSPORT_CELLULAR || tp == IDnsResolver::TRANSPORT_VPN) {
            return false;
        }
    }
    return true;
}

bool is_mdns_supported_network(unsigned netid) {
    std::lock_guard guard(cache_mutex);
    NetConfig* netconfig = find_netconfig_locked(netid);
    if (netconfig == nullptr) return false;
    return is_mdns_supported_transport_types(netconfig->transportTypes);
}

namespace {

// Returns valid domains without duplicates which are limited to max size |MAXDNSRCH|.
Loading