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

Commit a32c8c1d authored by Hungming Chen's avatar Hungming Chen
Browse files

resolv: Register multiple metrics event listeners

Currently, Netd unit test can't verify metrics event content because framework
is the only one metrics event listener of Netd. Add a support that Netd allows
multiple metrics event listeners registration. Netd unit test could verify
event content via registering its event listener.

Test: built, flashed, booted
      system/netd/tests/runtests.sh passes

Change-Id: I6f7f3240aa23cadcda59e037d7a027136525bc97
parent c5077892
Loading
Loading
Loading
Loading
+21 −0
Original line number Diff line number Diff line
@@ -9,10 +9,30 @@ aidl_interface {
    srcs: [
        "binder/android/net/IDnsResolver.aidl",
    ],
    imports: [
        "netd_event_listener_interface",
    ],
    api_dir: "binder/api",
    // Enable gen_log after it is supported in NDK backend. b/126501406
}

cc_test_library {
    name: "libnetd_test_metrics_listener",
    defaults: ["netd_defaults"],
    srcs: [
        "tests/BaseTestMetricsListener.cpp",
        "tests/TestMetrics.cpp",
    ],
    include_dirs: [
        "system/netd/include",
    ],
    shared_libs: [
        "libbinder",
        "libutils",
        "netd_event_listener_interface-cpp",
    ],
}

cc_library {
    name: "libnetd_resolv",
    version_script: "libnetd_resolv.map.txt",
@@ -102,6 +122,7 @@ cc_test {
    ],
    static_libs: [
        "libnetd_test_dnsresponder",
        "libnetd_test_metrics_listener",
        "libnetd_test_tun_interface",
        "liblogwrap",
        "libnetdutils",
+7 −5
Original line number Diff line number Diff line
@@ -297,15 +297,17 @@ void reportDnsEvent(int eventType, const android_net_context& netContext, int la
    android::util::stats_write(android::util::NETWORK_DNS_EVENT_REPORTED, eventType, returnCode,
                               latencyUs);

    const std::shared_ptr<INetdEventListener> listener = ResolverEventReporter::getListener();
    if (!listener) {
    const auto& listeners = ResolverEventReporter::getInstance().getListeners();
    if (listeners.size() == 0) {
        LOG(ERROR) << __func__
                   << ": DNS event not sent since NetdEventListenerService is unavailable.";
                   << ": DNS event not sent since no INetdEventListener receiver is available.";
        return;
    }
    const int latencyMs = latencyUs / 1000;
    listener->onDnsEvent(netContext.dns_netid, eventType, returnCode, latencyMs, query_name,
                         ip_addrs, total_ip_addr_count, netContext.uid);
    for (const auto& it : listeners) {
        it->onDnsEvent(netContext.dns_netid, eventType, returnCode, latencyMs, query_name, ip_addrs,
                       total_ip_addr_count, netContext.uid);
    }
}

bool onlyIPv4Answers(const addrinfo* res) {
+18 −0
Original line number Diff line number Diff line
@@ -30,6 +30,7 @@

#include "DnsResolver.h"
#include "NetdPermissions.h"  // PERM_*
#include "ResolverEventReporter.h"

using android::base::Join;
using android::base::StringPrintf;
@@ -53,6 +54,14 @@ namespace {
#define ENFORCE_NETWORK_STACK_PERMISSIONS() \
    ENFORCE_ANY_PERMISSION(PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK)

inline ::ndk::ScopedAStatus statusFromErrcode(int ret) {
    if (ret) {
        return ::ndk::ScopedAStatus(
                AStatus_fromServiceSpecificErrorWithMessage(-ret, strerror(-ret)));
    }
    return ::ndk::ScopedAStatus(AStatus_newOk());
}

}  // namespace

binder_status_t DnsResolverService::start() {
@@ -80,6 +89,15 @@ binder_status_t DnsResolverService::start() {
    return ::ndk::ScopedAStatus(AStatus_newOk());
}

::ndk::ScopedAStatus DnsResolverService::registerEventListener(
        const std::shared_ptr<aidl::android::net::metrics::INetdEventListener>& listener) {
    ENFORCE_NETWORK_STACK_PERMISSIONS();

    int res = ResolverEventReporter::getInstance().addListener(listener);

    return statusFromErrcode(res);
}

::ndk::ScopedAStatus DnsResolverService::checkAnyPermission(
        const std::vector<const char*>& permissions) {
    // TODO: Remove callback and move this to unnamed namespace after libbiner_ndk supports
+3 −0
Original line number Diff line number Diff line
@@ -34,6 +34,9 @@ class DnsResolverService : public aidl::android::net::BnDnsResolver {
    // TODO: Add dump() after libbinder_ndk support it.

    ::ndk::ScopedAStatus isAlive(bool* alive) override;
    ::ndk::ScopedAStatus registerEventListener(
            const std::shared_ptr<aidl::android::net::metrics::INetdEventListener>& listener)
            override;

  private:
    DnsResolverService() {}
+6 −5
Original line number Diff line number Diff line
@@ -307,17 +307,18 @@ bool PrivateDnsConfiguration::recordPrivateDnsValidation(const DnsTlsServer& ser
    }

    // Send a validation event to NetdEventListenerService.
    const std::shared_ptr<INetdEventListener> listener = ResolverEventReporter::getListener();
    if (listener != nullptr) {
        listener->onPrivateDnsValidationEvent(netId, addrToString(&server.ss), server.name,
                                              success);
    const auto& listeners = ResolverEventReporter::getInstance().getListeners();
    if (listeners.size() != 0) {
        for (const auto& it : listeners) {
            it->onPrivateDnsValidationEvent(netId, addrToString(&server.ss), server.name, success);
        }
        if (DBG) {
            ALOGD("Sent validation %s event on netId %u for %s with hostname %s",
                  success ? "success" : "failure", netId, addrToString(&server.ss).c_str(),
                  server.name.c_str());
        }
    } else {
        ALOGE("Validation event not sent since NetdEventListenerService is unavailable.");
        ALOGE("Validation event not sent since no INetdEventListener receiver is available.");
    }

    if (success) {
Loading