Trigger events from netd upon private dns validation successes
and failures.
The new events are handled in aosp/591294.
Test: Have observed validation events being sent by netd on a Pixel.
Bug: 71828272
Change-Id: Iba9fb2bcb9b515be71f4b2d71f3a9208bb329d05
diff --git a/server/ResolverController.cpp b/server/ResolverController.cpp
index 1b55f29..a5074e2 100644
--- a/server/ResolverController.cpp
+++ b/server/ResolverController.cpp
@@ -42,8 +42,10 @@
#include <android-base/strings.h>
#include <android-base/thread_annotations.h>
#include <android/net/INetd.h>
+#include <android/net/metrics/INetdEventListener.h>
#include "DumpWriter.h"
+#include "EventReporter.h"
#include "NetdConstants.h"
#include "ResolverController.h"
#include "ResolverStats.h"
@@ -55,7 +57,6 @@
namespace {
-// Only used for debug logging
std::string addrToString(const sockaddr_storage* addr) {
char out[INET6_ADDRSTRLEN] = {0};
getnameinfo((const sockaddr*)addr, sizeof(sockaddr_storage), out,
@@ -87,6 +88,8 @@
AddressComparator> PrivateDnsTracker;
std::mutex privateDnsLock;
std::map<unsigned, PrivateDnsTracker> privateDnsTransports GUARDED_BY(privateDnsLock);
+EventReporter eventReporter;
+android::sp<android::net::metrics::INetdEventListener> netdEventListener;
void checkPrivateDnsProvider(const DnsTlsServer& server,
PrivateDnsTracker& tracker, unsigned netId) REQUIRES(privateDnsLock) {
@@ -125,6 +128,24 @@
addrToString(&(server.ss)).c_str());
success = false;
}
+
+ // Send a validation event to NetdEventListenerService.
+ if (netdEventListener == nullptr) {
+ netdEventListener = eventReporter.getNetdEventListener();
+ }
+ if (netdEventListener != nullptr) {
+ netdEventListener->onPrivateDnsValidationEvent(netId,
+ String16(addrToString(&(server.ss)).c_str()),
+ String16(server.name.c_str()), success);
+ if (DBG) {
+ ALOGD("Sending 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.");
+ }
+
if (success) {
tracker[server] = ResolverController::Validation::success;
if (DBG) {
@@ -135,10 +156,10 @@
// Validation failure is expected if a user is on a captive portal.
// TODO: Trigger a second validation attempt after captive portal login
// succeeds.
+ tracker[server] = ResolverController::Validation::fail;
if (DBG) {
ALOGD("Validation failed for %s!", addrToString(&(server.ss)).c_str());
}
- tracker[server] = ResolverController::Validation::fail;
}
});
validate_thread.detach();