device-external_connection: Support hal-api passthrough and IPC mode selectively... 68/321868/5
authorYoungjae Cho <y0.cho@samsung.com>
Mon, 31 Mar 2025 02:31:10 +0000 (11:31 +0900)
committerYoungjae Cho <y0.cho@samsung.com>
Tue, 8 Apr 2025 01:26:49 +0000 (10:26 +0900)
To support two way communication mode, added switch to selectively
take passthrough or ipc functions by transport. The transport is
determined by searching transport version from manifest file that
matches to the installed backend version.

Before
- Passthrough
  - hal-api(external_connection) --(dlopen)--> hal-backend

After
- Passthrough and IPC
  - hal-api(external_connection) --(dlopen)--> hal-backend
           |
           |(proxy)
           |
           |-----------(IPC)-----> hal-backend-serivce(stub) --> hal-backend

Change-Id: I1ebc62d656fb95f5841ee19e117789a79daa8052
Signed-off-by: Youngjae Cho <y0.cho@samsung.com>
src/hal-api-device-external_connection.c

index 6316bcb4fa18e30eeaf4b09dec73a17ed0168015..01a0041c52ddec28dfc01fb679adf16e4299ff16 100644 (file)
 #include <hal/hal-common.h>
 
 #include "hal-device-external_connection-interface.h"
+#include "hal-api-device-external_connection-ipc.h"
+#include "hal-api-device-external_connection-passthrough.h"
 #include "common.h"
 
-static hal_backend_device_external_connection_funcs *hal_device_external_connection_funcs = NULL;
+static enum hal_common_transport g_hal_transport = HAL_COMMON_TRANSPORT_UNKNOWN;
 
-int hal_device_external_connection_get_backend(void)
+static void __attribute__((constructor)) hal_device_external_connection_constructor(void)
 {
-       int ret;
-
-       if (hal_device_external_connection_funcs)
-               return 0;
-
-       hal_device_external_connection_funcs = calloc(1, sizeof(hal_backend_device_external_connection_funcs));
-       if (!hal_device_external_connection_funcs)
-               return -ENOMEM;
-
-       ret = hal_common_get_backend(HAL_MODULE_DEVICE_EXTERNAL_CONNECTION, (void **)&hal_device_external_connection_funcs);
+       int ret = hal_common_get_transport(HAL_MODULE_DEVICE_EXTERNAL_CONNECTION,
+                                               &g_hal_transport);
        if (ret < 0) {
-               _E("Failed to get device-external-connection backend");
-               free(hal_device_external_connection_funcs);
-               hal_device_external_connection_funcs = NULL;
-               return -ENOTSUP;
+               if (ret != -ENOENT)
+                       _W("Failed to get HAL transport from HAL manifest\n");
+               g_hal_transport = HAL_COMMON_TRANSPORT_PASSTHROUGH;
        }
+}
 
-       return 0;
+int hal_device_external_connection_get_backend(void)
+{
+       switch (g_hal_transport) {
+       case HAL_COMMON_TRANSPORT_IPC:
+               return hal_device_external_connection_ipc_get_backend();
+       case HAL_COMMON_TRANSPORT_PASSTHROUGH:
+               return hal_device_external_connection_passthrough_get_backend();
+       case HAL_COMMON_TRANSPORT_UNKNOWN:
+       default:
+               return -ENOTSUP;
+       }
 }
 
 int hal_device_external_connection_put_backend(void)
 {
-       int ret = 0;
-
-       if (!hal_device_external_connection_funcs)
-               return 0;
-
-       ret = hal_common_put_backend(HAL_MODULE_DEVICE_EXTERNAL_CONNECTION, (void *)hal_device_external_connection_funcs);
-       if (ret < 0) {
-               _E("Failed to put device-exeternal-connection backend");
-               return ret;
+       switch (g_hal_transport) {
+       case HAL_COMMON_TRANSPORT_IPC:
+               return hal_device_external_connection_ipc_get_backend();
+       case HAL_COMMON_TRANSPORT_PASSTHROUGH:
+               return hal_device_external_connection_passthrough_get_backend();
+       case HAL_COMMON_TRANSPORT_UNKNOWN:
+       default:
+               return -ENOTSUP;
        }
-
-       free(hal_device_external_connection_funcs);
-       hal_device_external_connection_funcs = NULL;
-
-       return 0;
 }
 
-
 int hal_device_external_connection_register_changed_event(hal_device_external_connection_updated_cb updated_cb, void *user_data)
 {
-       int ret;
-
        if (!updated_cb)
                return -EINVAL;
 
-       if (!hal_device_external_connection_funcs) {
-               if ((ret = hal_device_external_connection_get_backend()) < 0)
-                       return ret;
-       }
-
-       if (!hal_device_external_connection_funcs ||
-               !hal_device_external_connection_funcs->register_changed_event)
+       switch (g_hal_transport) {
+       case HAL_COMMON_TRANSPORT_IPC:
+               return hal_device_external_connection_ipc_register_changed_event(updated_cb, user_data);
+       case HAL_COMMON_TRANSPORT_PASSTHROUGH:
+               return hal_device_external_connection_passthrough_register_changed_event(updated_cb, user_data);
+       case HAL_COMMON_TRANSPORT_UNKNOWN:
+       default:
                return -ENOTSUP;
-
-       return hal_device_external_connection_funcs->register_changed_event(updated_cb, user_data);
+       }
 }
 
 int hal_device_external_connection_unregister_changed_event(hal_device_external_connection_updated_cb updated_cb)
 {
-       int ret;
-
        if (!updated_cb)
                return -EINVAL;
 
-       if (!hal_device_external_connection_funcs) {
-               if ((ret = hal_device_external_connection_get_backend()) < 0)
-                       return ret;
-       }
-
-       if (!hal_device_external_connection_funcs ||
-               !hal_device_external_connection_funcs->unregister_changed_event)
+       switch (g_hal_transport) {
+       case HAL_COMMON_TRANSPORT_IPC:
+               return hal_device_external_connection_ipc_unregister_changed_event(updated_cb);
+       case HAL_COMMON_TRANSPORT_PASSTHROUGH:
+               return hal_device_external_connection_passthrough_unregister_changed_event(updated_cb);
+       case HAL_COMMON_TRANSPORT_UNKNOWN:
+       default:
                return -ENOTSUP;
-
-       hal_device_external_connection_funcs->unregister_changed_event(updated_cb);
-       return 0;
+       }
 }
 
 int hal_device_external_connection_get_current_state(hal_device_external_connection_updated_cb updated_cb, void *user_data)
 {
-       int ret;
-
        if (!updated_cb)
                return -EINVAL;
 
-       if (!hal_device_external_connection_funcs) {
-               if ((ret = hal_device_external_connection_get_backend()) < 0)
-                       return ret;
-       }
-
-       if (!hal_device_external_connection_funcs ||
-               !hal_device_external_connection_funcs->get_current_state)
+       switch (g_hal_transport) {
+       case HAL_COMMON_TRANSPORT_IPC:
+               return hal_device_external_connection_ipc_get_current_state(updated_cb, user_data);
+       case HAL_COMMON_TRANSPORT_PASSTHROUGH:
+               return hal_device_external_connection_passthrough_get_current_state(updated_cb, user_data);
+       case HAL_COMMON_TRANSPORT_UNKNOWN:
+       default:
                return -ENOTSUP;
-
-       return hal_device_external_connection_funcs->get_current_state(updated_cb, user_data);
+       }
 }
 
 int hal_device_external_connection_get_device_name(hal_device_external_connection_device_type_e deivce_type, const char **device_name)