Fix remote device address in case of l2cap connection timeout 95/292195/2
authorAyush Garg <ayush.garg@samsung.com>
Fri, 28 Apr 2023 10:59:31 +0000 (16:29 +0530)
committerAyush Garg <ayush.garg@samsung.com>
Fri, 28 Apr 2023 11:54:51 +0000 (17:24 +0530)
This patch will fill the correct remote address in the
connectionStateChangedCb when the le coc socket connection
got timeout error.

Change-Id: I483380029091ed9e1f8956132d44aca9f1fbba20
Signed-off-by: Ayush Garg <ayush.garg@samsung.com>
bt-api/bt-l2cap-le-client.c
bt-api/include/bt-common.h

index 1f7b73b..d8678f9 100644 (file)
@@ -262,17 +262,36 @@ static void __async_req_cb_with_unix_fd_list(GDBusProxy *proxy,
        gboolean fail = false;
 
        bt_req_info_t *cb_data = user_data;
-       bluetooth_event_param_t bt_event;       
+       bluetooth_event_param_t bt_event;
        GArray *out_param1 = NULL;
        GUnixFDList *out_fd_list = NULL;
+       bt_l2cap_user_info_t *l2cap_user_info = NULL;
 
        BT_DBG("+");
 
+       if (cb_data)
+               l2cap_user_info = (bt_l2cap_user_info_t *)cb_data->user_data;
+
+       if (l2cap_user_info)
+               cb_data->user_data = (void *)l2cap_user_info->user_data;
+
        _bt_get_fd_list_info(proxy, res, user_data, &bt_event, &out_param1,
                &event_type, &out_fd_list, &result, &fail);
 
-       if (fail)
+       if (fail) {
+               BT_INFO("Connection failed due to error: %d", result);
+               bluetooth_l2cap_le_connection_t *conn_info;
+
+               conn_info = g_malloc0(sizeof(bluetooth_l2cap_le_connection_t));
+               memset(conn_info, 0x00, sizeof(bluetooth_l2cap_le_connection_t));
+
+               conn_info->psm = l2cap_user_info->psm;
+               memcpy(&conn_info->device_addr, &l2cap_user_info->device_addr,
+                       sizeof(bluetooth_device_address_t));
+
+               bt_event.param_data = (void *)conn_info;
                goto failed;
+       }
 
        if (!cb_data)
                goto done;
@@ -329,6 +348,7 @@ done:
        if (out_param1)
                g_array_free(out_param1, TRUE);
 
+       g_free(l2cap_user_info);
        g_free(cb_data);
        BT_DBG("-");
 }
@@ -339,6 +359,7 @@ BT_EXPORT_API int bluetooth_l2cap_le_connect(
        int result;
        bt_user_info_t *user_info;
        int t_psm;
+       bt_l2cap_user_info_t *l2cap_user_info;
 
        BT_CHECK_PARAMETER(remote_bt_address, return);
        BT_CHECK_ENABLED_LE(return);
@@ -353,6 +374,12 @@ BT_EXPORT_API int bluetooth_l2cap_le_connect(
                BT_ERR("Don't have a privilege to use this API");
        }
 
+       l2cap_user_info = g_malloc0(sizeof(bt_l2cap_user_info_t));
+       l2cap_user_info->psm = psm;
+       l2cap_user_info->user_data = user_info->user_data;
+       memcpy(&l2cap_user_info->device_addr, remote_bt_address,
+                       sizeof(bluetooth_device_address_t));
+
        BT_INIT_PARAMS();
        BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
 
@@ -366,7 +393,7 @@ BT_EXPORT_API int bluetooth_l2cap_le_connect(
                                BT_L2CAP_LE_CLIENT_CONNECT,
                                in_param1, in_param2,
                                in_param3, in_param4,
-                               user_info->cb, user_info->user_data,
+                               user_info->cb, (void *)l2cap_user_info,
                                NULL, (GAsyncReadyCallback)__async_req_cb_with_unix_fd_list);
 
        BT_INFO("result: %x", result);
index fc2c76d..39758bb 100644 (file)
@@ -270,6 +270,12 @@ typedef struct {
        void *user_data;
 } bt_user_info_t;
 
+typedef struct {
+       int psm;
+       bluetooth_device_address_t device_addr;
+       void *user_data;
+} bt_l2cap_user_info_t;
+
 void _bt_set_user_data(int type, void *callback, void *user_data);
 
 void _bt_print_device_address_t(const bluetooth_device_address_t *addr);