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() :