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

Commit 46079f72 authored by Ken Chen's avatar Ken Chen
Browse files

Add debug trace for MdnsIPv6LinkLocalWithDefaultRoute

The test is flaky and not local reproducible. Add logs with DEBUG level
and set logging level to DEBUG in the test. This commit is for debugging
purpose, which should be reverted when root cause is found.

Bug: 247693272
Bug: 246688231
Test: atest
Change-Id: I7bee788381ff245ae321f4816b81f71087bbeec2
parent c84b0fbd
Loading
Loading
Loading
Loading
+16 −2
Original line number Diff line number Diff line
@@ -1269,25 +1269,32 @@ static int _rfc6724_compare(const void* ptr1, const void* ptr2) {

static int _find_src_addr(const struct sockaddr* addr, struct sockaddr* src_addr, unsigned mark,
                          uid_t uid, bool allow_v6_linklocal) {
    if (src_addr == nullptr) return -1;
    if (src_addr == nullptr) {
        LOG(DEBUG) << __func__ << ": src_addr==nullptr";
        return -1;
    }

    int ret;
    socklen_t len;

    switch (addr->sa_family) {
        case AF_INET:
            LOG(DEBUG) << __func__ << ": sa_family AF_INET";
            len = sizeof(struct sockaddr_in);
            break;
        case AF_INET6:
            LOG(DEBUG) << __func__ << ": sa_family AF_INET6";
            len = sizeof(struct sockaddr_in6);
            break;
        default:
            /* No known usable source address for non-INET families. */
            LOG(DEBUG) << __func__ << ": non-INET families " << addr->sa_family;
            return 0;
    }

    android::base::unique_fd sock(socket(addr->sa_family, SOCK_DGRAM | SOCK_CLOEXEC, IPPROTO_UDP));
    if (sock.get() == -1) {
        LOG(DEBUG) << __func__ << ": sock() error, " << strerror(errno);
        if (errno == EAFNOSUPPORT) {
            return 0;
        } else {
@@ -1295,9 +1302,11 @@ static int _find_src_addr(const struct sockaddr* addr, struct sockaddr* src_addr
        }
    }
    if (mark != MARK_UNSET && setsockopt(sock, SOL_SOCKET, SO_MARK, &mark, sizeof(mark)) < 0) {
        LOG(DEBUG) << __func__ << ": setsockopt() error, " << strerror(errno);
        return 0;
    }
    if (uid > 0 && uid != NET_CONTEXT_INVALID_UID && fchown(sock, uid, (gid_t) -1) < 0) {
        LOG(DEBUG) << __func__ << ": fchown() error, " << strerror(errno);
        return 0;
    }
    do {
@@ -1305,20 +1314,25 @@ static int _find_src_addr(const struct sockaddr* addr, struct sockaddr* src_addr
    } while (ret == -1 && errno == EINTR);

    if (ret == -1) {
        LOG(DEBUG) << __func__ << ": connect() return -1, " << strerror(errno);
        return 0;
    }

    if (getsockname(sock, src_addr, &len) == -1) {
        LOG(DEBUG) << __func__ << ": getsockname() return -1, " << strerror(errno);
        return -1;
    }

    if (src_addr->sa_family == AF_INET6) {
        sockaddr_in6* sin6 = reinterpret_cast<sockaddr_in6*>(src_addr);
        if (!allow_v6_linklocal && IN6_IS_ADDR_LINKLOCAL(&sin6->sin6_addr)) {
            LOG(DEBUG) << __func__ << ": !allow_v6_linklocal && IN6_IS_ADDR_LINKLOCAL";
            return 0;
        }
        LOG(DEBUG) << __func__ << ": AF_INET6. allow_v6_linklocal=" << allow_v6_linklocal
                   << " IN6_IS_ADDR_LINKLOCAL=" << IN6_IS_ADDR_LINKLOCAL(&sin6->sin6_addr);
    }

    LOG(DEBUG) << __func__ << ": return 1";
    return 1;
}

+4 −1
Original line number Diff line number Diff line
@@ -757,10 +757,13 @@ int herrnoToAiErrno(int he) {

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))
        android::net::Experiments::getInstance()->getFlag("mdns_resolution", 1)) {
        LOG(DEBUG) << __func__ << ": *flags |= RES_F_MDNS";
        *flags |= RES_F_MDNS;
    }
}

bool isMdnsResolution(uint32_t flags) {
    LOG(DEBUG) << __func__ << ": " << (bool)(flags & RES_F_MDNS);
    return flags & RES_F_MDNS;
}
+6 −1
Original line number Diff line number Diff line
@@ -1567,16 +1567,21 @@ android::net::NetworkType resolv_get_network_types_for_net(unsigned netid) {
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) {
            LOG(DEBUG) << __func__ << ": return false, tp=" << tp;
            return false;
        }
    }
    LOG(DEBUG) << __func__ << ": return true";
    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;
    if (netconfig == nullptr) {
        LOG(DEBUG) << __func__ << ": netconfig == nullptr";
        return false;
    }
    return is_mdns_supported_transport_types(netconfig->transportTypes);
}

+13 −1
Original line number Diff line number Diff line
@@ -7606,6 +7606,12 @@ TEST_F(ResolverMultinetworkTest, MdnsIPv6LinkLocalWithDefaultRoute) {
    constexpr char v6addr[] = "::127.0.0.3";
    constexpr char v4addr[] = "127.0.0.3";
    constexpr char host_name[] = "hello.local.";

    // TODO: remove debugging log when b/247693272 is clarified.
    ASSERT_TRUE(mDnsClient.resolvService()
                        ->setLogSeverity(aidl::android::net::IDnsResolver::DNS_RESOLVER_LOG_DEBUG)
                        .isOk());

    ScopedPhysicalNetwork network = CreateScopedPhysicalNetwork(ConnectivityType::V4);
    ASSERT_RESULT_OK(network.init());

@@ -7638,6 +7644,12 @@ TEST_F(ResolverMultinetworkTest, MdnsIPv6LinkLocalWithDefaultRoute) {
    EXPECT_EQ(GetNumQueries(mdnsv6, host_name), 1U);
    EXPECT_EQ(GetNumQueriesForType(*dnsPair->dnsServer, ns_type::ns_t_a, host_name), 0U);
    EXPECT_EQ(GetNumQueriesForType(*dnsPair->dnsServer, ns_type::ns_t_aaaa, host_name), 0U);

    // Reset logging level to "default" without checking the previous logging level, since no
    // public function to get current level, and it's for temporary debugging only.
    ASSERT_TRUE(mDnsClient.resolvService()
                        ->setLogSeverity(aidl::android::net::IDnsResolver::DNS_RESOLVER_LOG_INFO)
                        .isOk());
}

TEST_F(ResolverTest, NegativeValueInExperimentFlag) {