#include "bt-service-event.h"
#define L2CAP_LE_UUID_SUBSTR "FFFFFFFF-FFFF-FFFF-FFFF-"
+#define L2CAP_LE_REQUEST_TIMEOUT 15 /* 15 sec */
typedef struct {
int sock_fd;
+ guint req_timer;
int chan;
char uuid[BT_UUID_STRING_SIZE];
char address[BT_ADDRESS_STRING_SIZE];
static bt_socket_info_t *pending_conn_info;
+static bool __bt_socket_l2cap_timeout_cb(void)
+{
+ BT_INFO("No response from bluez, so forcely clear timer");
+
+ if (pending_conn_info == NULL) {
+ BT_ERR("pending info does not exist!");
+ return FALSE;
+ }
+
+ BT_INFO("channel: %d", pending_conn_info->chan);
+
+ pending_conn_info->conn_cb(BLUETOOTH_ERROR_INTERNAL, pending_conn_info->sock_fd, pending_conn_info->address,
+ pending_conn_info->uuid, pending_conn_info->chan);
+
+ g_free(pending_conn_info);
+ pending_conn_info = NULL;
+
+ return FALSE;
+}
+
/* Function to handle socket disconnection */
void __handle_socket_disconnected(event_socket_client_conn_t *client_info)
{
pending_conn_info->conn_cb(BLUETOOTH_ERROR_INTERNAL, client_info->fd, address,
pending_conn_info->uuid, pending_conn_info->chan);
+ if (pending_conn_info->req_timer)
+ g_source_remove(pending_conn_info->req_timer);
+
g_free(pending_conn_info);
pending_conn_info = NULL;
} else {
return;
}
+ if (pending_conn_info->req_timer)
+ g_source_remove(pending_conn_info->req_timer);
+
BT_INFO("socket_fd: %d, address: %s, uuid: %s, channel: %d",
client_info->fd, address,
pending_conn_info->uuid,
else
memset(pending_conn_info->uuid, 0x00, BT_UUID_STRING_SIZE);
+ pending_conn_info->req_timer = g_timeout_add_seconds(L2CAP_LE_REQUEST_TIMEOUT,
+ (GSourceFunc)__bt_socket_l2cap_timeout_cb, NULL);
+
BT_DBG("-");
return BLUETOOTH_ERROR_NONE;
}