Add libconnectivity_native
The library provides an interface to interface with the
ConnectivityNative service, and implement port blocking APIs.
Bug: 179733303
Test: atest connectivity_native_test
Change-Id: Iad1c84b5eeab835aca14a2db72a900e099aa3c1c
diff --git a/service/libconnectivity/src/connectivity_native.cpp b/service/libconnectivity/src/connectivity_native.cpp
new file mode 100644
index 0000000..9545ed1
--- /dev/null
+++ b/service/libconnectivity/src/connectivity_native.cpp
@@ -0,0 +1,74 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "connectivity_native.h"
+
+#include <android/binder_manager.h>
+#include <aidl/android/net/connectivity/aidl/ConnectivityNative.h>
+
+using aidl::android::net::connectivity::aidl::IConnectivityNative;
+
+
+static std::shared_ptr<IConnectivityNative> getBinder() {
+ static ndk::SpAIBinder sBinder = ndk::SpAIBinder(reinterpret_cast<AIBinder*>(
+ AServiceManager_getService("connectivity_native")));
+ return aidl::android::net::connectivity::aidl::IConnectivityNative::fromBinder(sBinder);
+}
+
+static int getErrno(const ::ndk::ScopedAStatus& status) {
+ switch (status.getExceptionCode()) {
+ case EX_NONE:
+ return 0;
+ case EX_ILLEGAL_ARGUMENT:
+ return EINVAL;
+ case EX_SECURITY:
+ return EPERM;
+ case EX_SERVICE_SPECIFIC:
+ return status.getServiceSpecificError();
+ default:
+ return EPROTO;
+ }
+}
+
+int AConnectivityNative_blockPortForBind(in_port_t port) {
+ std::shared_ptr<IConnectivityNative> c = getBinder();
+ return getErrno(c->blockPortForBind(port));
+}
+
+int AConnectivityNative_unblockPortForBind(in_port_t port) {
+ std::shared_ptr<IConnectivityNative> c = getBinder();
+ return getErrno(c->unblockPortForBind(port));
+}
+
+int AConnectivityNative_unblockAllPortsForBind() {
+ std::shared_ptr<IConnectivityNative> c = getBinder();
+ return getErrno(c->unblockAllPortsForBind());
+}
+
+int AConnectivityNative_getPortsBlockedForBind(in_port_t *ports, size_t *count) {
+ std::shared_ptr<IConnectivityNative> c = getBinder();
+ std::vector<int32_t> actualBlockedPorts;
+ int err = getErrno(c->getPortsBlockedForBind(&actualBlockedPorts));
+ if (err) {
+ return err;
+ }
+
+ for (int i = 0; i < *count && i < actualBlockedPorts.size(); i++) {
+ ports[i] = actualBlockedPorts[i];
+ }
+ *count = actualBlockedPorts.size();
+ return 0;
+}