Add basic logging infrastructure for bugreports
Test: as follows
- built, flashed, booted
- "adb shell dumpsys netd" shows logs
- tests/runtests.sh passes
Change-Id: I0e44da7f9a9cc53074ffc396b958e9e2dbcd2603
diff --git a/server/NetdNativeService.cpp b/server/NetdNativeService.cpp
index 70aad71..5253096 100644
--- a/server/NetdNativeService.cpp
+++ b/server/NetdNativeService.cpp
@@ -54,6 +54,7 @@
const char CONNECTIVITY_INTERNAL[] = "android.permission.CONNECTIVITY_INTERNAL";
const char NETWORK_STACK[] = "android.permission.NETWORK_STACK";
const char DUMP[] = "android.permission.DUMP";
+const char OPT_SHORT[] = "--short";
binder::Status checkPermission(const char *permission) {
pid_t pid;
@@ -98,12 +99,19 @@
return binder::Status::ok();
}
-} // namespace
+bool contains(const Vector<String16>& words, const String16& word) {
+ for (const auto& w : words) {
+ if (w == word) return true;
+ }
+ return false;
+}
+
+} // namespace
status_t NetdNativeService::start() {
IPCThreadState::self()->disableBackgroundScheduling(true);
- status_t ret = BinderService<NetdNativeService>::publish();
+ const status_t ret = BinderService<NetdNativeService>::publish();
if (ret != android::OK) {
return ret;
}
@@ -148,37 +156,63 @@
gCtls->trafficCtrl.dump(dw, false);
dw.blankline();
+ {
+ ScopedIndent indentLog(dw);
+ if (contains(args, String16(OPT_SHORT))) {
+ dw.println("Log: <omitted>");
+ } else {
+ dw.println("Log:");
+ ScopedIndent indentLogEntries(dw);
+ gLog.forEachEntry([&dw](const std::string& entry) mutable { dw.println(entry); });
+ }
+ dw.blankline();
+ }
+
return NO_ERROR;
}
binder::Status NetdNativeService::isAlive(bool *alive) {
NETD_BIG_LOCK_RPC(CONNECTIVITY_INTERNAL);
+ auto entry = gLog.newEntry().prettyFunction(__PRETTY_FUNCTION__);
*alive = true;
+
+ gLog.log(entry.returns(*alive));
return binder::Status::ok();
}
binder::Status NetdNativeService::firewallReplaceUidChain(const std::string& chainName,
bool isWhitelist, const std::vector<int32_t>& uids, bool *ret) {
NETD_LOCKING_RPC(CONNECTIVITY_INTERNAL, gCtls->firewallCtrl.lock);
+ auto entry = gLog.newEntry()
+ .prettyFunction(__PRETTY_FUNCTION__)
+ .arg(chainName)
+ .arg(isWhitelist)
+ .arg(uids);
int err = gCtls->firewallCtrl.replaceUidChain(chainName, isWhitelist, uids);
*ret = (err == 0);
+
+ gLog.log(entry.returns(*ret).withAutomaticDuration());
return binder::Status::ok();
}
binder::Status NetdNativeService::bandwidthEnableDataSaver(bool enable, bool *ret) {
NETD_LOCKING_RPC(CONNECTIVITY_INTERNAL, gCtls->bandwidthCtrl.lock);
+ auto entry = gLog.newEntry().prettyFunction(__PRETTY_FUNCTION__).arg(enable);
int err = gCtls->bandwidthCtrl.enableDataSaver(enable);
*ret = (err == 0);
+ gLog.log(entry.returns(*ret).withAutomaticDuration());
return binder::Status::ok();
}
binder::Status NetdNativeService::networkCreatePhysical(int32_t netId,
const std::string& permission) {
ENFORCE_PERMISSION(CONNECTIVITY_INTERNAL);
+ auto entry = gLog.newEntry().prettyFunction(__PRETTY_FUNCTION__).arg(netId).arg(permission);
int ret = gCtls->netCtrl.createPhysicalNetwork(netId, stringToPermission(permission.c_str()));
+ gLog.log(entry.returns(ret).withAutomaticDuration());
return statusFromErrcode(ret);
}
@@ -297,6 +331,15 @@
const std::vector<std::string>& tlsFingerprints) {
// This function intentionally does not lock within Netd, as Bionic is thread-safe.
ENFORCE_PERMISSION(CONNECTIVITY_INTERNAL);
+ auto entry = gLog.newEntry()
+ .prettyFunction(__PRETTY_FUNCTION__)
+ .arg(netId)
+ .arg(servers)
+ .arg(domains)
+ .arg(params)
+ .arg(tlsName)
+ .arg(tlsServers)
+ .arg(tlsFingerprints);
std::set<std::vector<uint8_t>> decoded_fingerprints;
for (const std::string& fingerprint : tlsFingerprints) {
@@ -310,6 +353,7 @@
int err = gCtls->resolverCtrl.setResolverConfiguration(netId, servers, domains, params,
tlsName, tlsServers, decoded_fingerprints);
+ gLog.log(entry.returns(err).withAutomaticDuration());
if (err != 0) {
return binder::Status::fromServiceSpecificError(-err,
String8::format("ResolverController error: %s", strerror(-err)));
@@ -463,7 +507,7 @@
binder::Status NetdNativeService::ipSecSetEncapSocketOwner(const android::base::unique_fd& socket,
int newUid) {
ENFORCE_PERMISSION(NETWORK_STACK)
- ALOGD("ipSecSetEncapSocketOwner()");
+ gLog.log("ipSecSetEncapSocketOwner()");
uid_t callerUid = IPCThreadState::self()->getCallingUid();
return asBinderStatus(gCtls->xfrmCtrl.ipSecSetEncapSocketOwner(socket, newUid, callerUid));
@@ -477,7 +521,7 @@
int32_t* outSpi) {
// Necessary locking done in IpSecService and kernel
ENFORCE_PERMISSION(CONNECTIVITY_INTERNAL);
- ALOGD("ipSecAllocateSpi()");
+ gLog.log("ipSecAllocateSpi()");
return asBinderStatus(gCtls->xfrmCtrl.ipSecAllocateSpi(
transformId,
sourceAddress,
@@ -503,7 +547,7 @@
int32_t encapRemotePort) {
// Necessary locking done in IpSecService and kernel
ENFORCE_PERMISSION(CONNECTIVITY_INTERNAL);
- ALOGD("ipSecAddSecurityAssociation()");
+ gLog.log("ipSecAddSecurityAssociation()");
return asBinderStatus(gCtls->xfrmCtrl.ipSecAddSecurityAssociation(
transformId, mode, sourceAddress, destinationAddress,
underlyingNetId,
@@ -523,7 +567,7 @@
int32_t markMask) {
// Necessary locking done in IpSecService and kernel
ENFORCE_PERMISSION(CONNECTIVITY_INTERNAL);
- ALOGD("ipSecDeleteSecurityAssociation()");
+ gLog.log("ipSecDeleteSecurityAssociation()");
return asBinderStatus(gCtls->xfrmCtrl.ipSecDeleteSecurityAssociation(
transformId,
sourceAddress,
@@ -542,7 +586,7 @@
int32_t spi) {
// Necessary locking done in IpSecService and kernel
ENFORCE_PERMISSION(CONNECTIVITY_INTERNAL);
- ALOGD("ipSecApplyTransportModeTransform()");
+ gLog.log("ipSecApplyTransportModeTransform()");
return asBinderStatus(gCtls->xfrmCtrl.ipSecApplyTransportModeTransform(
socket,
transformId,
@@ -556,7 +600,7 @@
const android::base::unique_fd& socket) {
// Necessary locking done in IpSecService and kernel
ENFORCE_PERMISSION(CONNECTIVITY_INTERNAL);
- ALOGD("ipSecRemoveTransportModeTransform()");
+ gLog.log("ipSecRemoveTransportModeTransform()");
return asBinderStatus(gCtls->xfrmCtrl.ipSecRemoveTransportModeTransform(
socket));
}
@@ -571,7 +615,7 @@
int32_t markMask){
// Necessary locking done in IpSecService and kernel
ENFORCE_PERMISSION(NETWORK_STACK);
- ALOGD("ipSecAddSecurityPolicy()");
+ gLog.log("ipSecAddSecurityPolicy()");
return asBinderStatus(gCtls->xfrmCtrl.ipSecAddSecurityPolicy(
transformId,
direction,
@@ -592,7 +636,7 @@
int32_t markMask){
// Necessary locking done in IpSecService and kernel
ENFORCE_PERMISSION(NETWORK_STACK);
- ALOGD("ipSecAddSecurityPolicy()");
+ gLog.log("ipSecAddSecurityPolicy()");
return asBinderStatus(gCtls->xfrmCtrl.ipSecUpdateSecurityPolicy(
transformId,
direction,
@@ -612,7 +656,7 @@
int32_t markMask){
// Necessary locking done in IpSecService and kernel
ENFORCE_PERMISSION(NETWORK_STACK);
- ALOGD("ipSecAddSecurityPolicy()");
+ gLog.log("ipSecAddSecurityPolicy()");
return asBinderStatus(gCtls->xfrmCtrl.ipSecDeleteSecurityPolicy(
transformId,
direction,
@@ -630,7 +674,7 @@
int32_t oKey) {
// Necessary locking done in IpSecService and kernel
ENFORCE_PERMISSION(NETWORK_STACK);
- ALOGD("addVirtualTunnelInterface()");
+ gLog.log("addVirtualTunnelInterface()");
int ret = gCtls->xfrmCtrl.addVirtualTunnelInterface(
deviceName,
localAddress,
@@ -652,7 +696,7 @@
int32_t oKey) {
// Necessary locking done in IpSecService and kernel
ENFORCE_PERMISSION(NETWORK_STACK);
- ALOGD("updateVirtualTunnelInterface()");
+ gLog.log("updateVirtualTunnelInterface()");
int ret = gCtls->xfrmCtrl.addVirtualTunnelInterface(
deviceName,
localAddress,
@@ -669,7 +713,7 @@
binder::Status NetdNativeService::removeVirtualTunnelInterface(const std::string& deviceName) {
// Necessary locking done in IpSecService and kernel
ENFORCE_PERMISSION(NETWORK_STACK);
- ALOGD("removeVirtualTunnelInterface()");
+ gLog.log("removeVirtualTunnelInterface()");
int ret = gCtls->xfrmCtrl.removeVirtualTunnelInterface(deviceName);
return (ret == 0) ? binder::Status::ok() :