Add initial dump() method to NetdNativeService

This is called by "dumpsys netd".

Bug: 27239233
Change-Id: I27fb308f8067243ff241a6f8fd6a83f406087d2a
diff --git a/server/NetdNativeService.cpp b/server/NetdNativeService.cpp
index 678d19a..d39bdfa 100644
--- a/server/NetdNativeService.cpp
+++ b/server/NetdNativeService.cpp
@@ -27,6 +27,7 @@
 #include "android/net/BnNetd.h"
 
 #include "Controllers.h"
+#include "DumpWriter.h"
 #include "NetdConstants.h"
 #include "NetdNativeService.h"
 
@@ -38,6 +39,7 @@
 namespace {
 
 const char CONNECTIVITY_INTERNAL[] = "android.permission.CONNECTIVITY_INTERNAL";
+const char DUMP[] = "android.permission.DUMP";
 
 binder::Status checkPermission(const char *permission) {
     pid_t pid;
@@ -79,6 +81,24 @@
     return android::OK;
 }
 
+status_t NetdNativeService::dump(int fd, const Vector<String16> & /* args */) {
+    const binder::Status dump_permission = checkPermission(DUMP);
+    if (!dump_permission.isOk()) {
+        const String8 msg(dump_permission.toString8());
+        write(fd, msg.string(), msg.size());
+        return PERMISSION_DENIED;
+    }
+
+    // This method does not grab any locks. If individual classes need locking
+    // their dump() methods MUST handle locking appropriately.
+    DumpWriter dw(fd);
+    dw.blankline();
+    gCtls->netCtrl.dump(dw);
+    dw.blankline();
+
+    return NO_ERROR;
+}
+
 binder::Status NetdNativeService::isAlive(bool *alive) {
     NETD_BIG_LOCK_RPC(CONNECTIVITY_INTERNAL);