Implement INetd.aidl getProcSysNet().

Also: a few "tidy-inspired" changes.

Test: as follows
    - built, flashed, booted
    - system/netd/tests/runtest.sh passes
Bug: 32163131
Change-Id: Icaa164af3c3d0d03af1ec083dfcbe856ac51529f
diff --git a/tests/binder_test.cpp b/tests/binder_test.cpp
index fdb5db6..febe50b 100644
--- a/tests/binder_test.cpp
+++ b/tests/binder_test.cpp
@@ -839,30 +839,68 @@
     }
 }
 
-TEST_F(BinderTest, SetProcSysNet) {
-    static const struct TestData {
-        const int family;
+TEST_F(BinderTest, GetProcSysNet) {
+    const char LOOPBACK[] = "lo";
+    static const struct {
+        const int ipversion;
         const int which;
-        const char *ifname;
-        const char *parameter;
-        const char *value;
+        const char* ifname;
+        const char* parameter;
+        const char* expectedValue;
         const int expectedReturnCode;
     } kTestData[] = {
-        { INetd::IPV4, INetd::CONF, sTun.name().c_str(), "arp_ignore", "1", 0 },
-        { -1, INetd::CONF, sTun.name().c_str(), "arp_ignore", "1", EAFNOSUPPORT },
-        { INetd::IPV4, -1, sTun.name().c_str(), "arp_ignore", "1", EINVAL },
-        { INetd::IPV4, INetd::CONF, "..", "conf/lo/arp_ignore", "1", EINVAL },
-        { INetd::IPV4, INetd::CONF, ".", "lo/arp_ignore", "1", EINVAL },
-        { INetd::IPV4, INetd::CONF, sTun.name().c_str(), "../all/arp_ignore", "1", EINVAL },
-        { INetd::IPV6, INetd::NEIGH, sTun.name().c_str(), "ucast_solicit", "7", 0 },
+            {INetd::IPV4, INetd::CONF, LOOPBACK, "arp_ignore", "0", 0},
+            {-1, INetd::CONF, sTun.name().c_str(), "arp_ignore", nullptr, EAFNOSUPPORT},
+            {INetd::IPV4, -1, sTun.name().c_str(), "arp_ignore", nullptr, EINVAL},
+            {INetd::IPV4, INetd::CONF, "..", "conf/lo/arp_ignore", nullptr, EINVAL},
+            {INetd::IPV4, INetd::CONF, ".", "lo/arp_ignore", nullptr, EINVAL},
+            {INetd::IPV4, INetd::CONF, sTun.name().c_str(), "../all/arp_ignore", nullptr, EINVAL},
+            {INetd::IPV6, INetd::NEIGH, LOOPBACK, "ucast_solicit", "3", 0},
     };
 
-    for (unsigned int i = 0; i < arraysize(kTestData); i++) {
-        const auto &td = kTestData[i];
+    for (int i = 0; i < arraysize(kTestData); i++) {
+        const auto& td = kTestData[i];
 
-        const binder::Status status = mNetd->setProcSysNet(
-                    td.family, td.which, td.ifname, td.parameter,
-                    td.value);
+        std::string value;
+        const binder::Status status =
+                mNetd->getProcSysNet(td.ipversion, td.which, td.ifname, td.parameter, &value);
+
+        if (td.expectedReturnCode == 0) {
+            SCOPED_TRACE(String8::format("test case %d should have passed", i));
+            EXPECT_EQ(0, status.exceptionCode());
+            EXPECT_EQ(0, status.serviceSpecificErrorCode());
+            EXPECT_EQ(td.expectedValue, value);
+        } else {
+            SCOPED_TRACE(String8::format("test case %d should have failed", i));
+            EXPECT_EQ(binder::Status::EX_SERVICE_SPECIFIC, status.exceptionCode());
+            EXPECT_EQ(td.expectedReturnCode, status.serviceSpecificErrorCode());
+        }
+    }
+}
+
+TEST_F(BinderTest, SetProcSysNet) {
+    static const struct {
+        const int ipversion;
+        const int which;
+        const char* ifname;
+        const char* parameter;
+        const char* value;
+        const int expectedReturnCode;
+    } kTestData[] = {
+            {INetd::IPV4, INetd::CONF, sTun.name().c_str(), "arp_ignore", "1", 0},
+            {-1, INetd::CONF, sTun.name().c_str(), "arp_ignore", "1", EAFNOSUPPORT},
+            {INetd::IPV4, -1, sTun.name().c_str(), "arp_ignore", "1", EINVAL},
+            {INetd::IPV4, INetd::CONF, "..", "conf/lo/arp_ignore", "1", EINVAL},
+            {INetd::IPV4, INetd::CONF, ".", "lo/arp_ignore", "1", EINVAL},
+            {INetd::IPV4, INetd::CONF, sTun.name().c_str(), "../all/arp_ignore", "1", EINVAL},
+            {INetd::IPV6, INetd::NEIGH, sTun.name().c_str(), "ucast_solicit", "7", 0},
+    };
+
+    for (int i = 0; i < arraysize(kTestData); i++) {
+        const auto& td = kTestData[i];
+
+        const binder::Status status =
+                mNetd->setProcSysNet(td.ipversion, td.which, td.ifname, td.parameter, td.value);
 
         if (td.expectedReturnCode == 0) {
             SCOPED_TRACE(String8::format("test case %d should have passed", i));
@@ -876,6 +914,29 @@
     }
 }
 
+TEST_F(BinderTest, GetSetProcSysNet) {
+    const int ipversion = INetd::IPV6;
+    const int category = INetd::NEIGH;
+    const std::string& tun = sTun.name();
+    const std::string parameter("ucast_solicit");
+
+    std::string value{};
+    EXPECT_TRUE(mNetd->getProcSysNet(ipversion, category, tun, parameter, &value).isOk());
+    EXPECT_FALSE(value.empty());
+    const int ival = std::stoi(value);
+    EXPECT_GT(ival, 0);
+    // Try doubling the parameter value (always best!).
+    EXPECT_TRUE(mNetd->setProcSysNet(ipversion, category, tun, parameter, std::to_string(2 * ival))
+            .isOk());
+    EXPECT_TRUE(mNetd->getProcSysNet(ipversion, category, tun, parameter, &value).isOk());
+    EXPECT_EQ(2 * ival, std::stoi(value));
+    // Try resetting the parameter.
+    EXPECT_TRUE(mNetd->setProcSysNet(ipversion, category, tun, parameter, std::to_string(ival))
+            .isOk());
+    EXPECT_TRUE(mNetd->getProcSysNet(ipversion, category, tun, parameter, &value).isOk());
+    EXPECT_EQ(ival, std::stoi(value));
+}
+
 static std::string base64Encode(const std::vector<uint8_t>& input) {
     size_t out_len;
     EXPECT_EQ(1, EVP_EncodedLength(&out_len, input.size()));