2 * Copyright (c) 2015 2016 Samsung Electronics Co., Ltd All Rights Reserved
4 * Contact: Anupam Roy <anupam.r@samsung.com>
6 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
10 * http://www.apache.org/licenses/LICENSE-2.0
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
26 #include <vconf-internal-keys.h>
28 #include <bundle_internal.h>
29 #include <eventsystem.h>
31 /*bt-service headers */
32 #include "bt-internal-types.h"
33 #include "bt-service-common.h"
34 #include "bt-service-util.h"
35 #include "bt-service-main.h"
36 #include "bt-service-core-device.h"
37 #include "bt-service-core-adapter.h"
38 #include "bt-service-event-receiver.h"
39 #include "bt-request-handler.h"
40 #include "bt-service-event.h"
41 #include "bt-service-agent-util.h"
42 #include "bt-service-a2dp-src.h"
43 #include "bt-service-a2dp-sink.h"
44 #ifdef TIZEN_FEATURE_BT_OBEX
45 #include "bt-service-obex-server.h"
47 #include "bt-service-device-internal.h"
49 #ifdef TIZEN_GATT_CLIENT
50 #include "bt-service-gatt.h"
54 #include <oal-event.h>
55 #include <oal-manager.h>
56 #include <oal-adapter-mgr.h>
57 #include <oal-device-mgr.h>
59 #define MAX_BOND_RETRY_COUNT 3
60 #define BT_PASSKEY_MAX_LENGTH 4
62 #define BT_LE_CONN_PARAM_DEFAULT_SUPERVISION_TIMEOUT 6000 /* msec */
64 #define BT_LE_CONN_PARAM_BALANCED_MIN_INTERVAL 30 /* msec */
65 #define BT_LE_CONN_PARAM_BALANCED_MAX_INTERVAL 50 /* msec */
66 #define BT_LE_CONN_PARAM_BALANCED_SLAVE_LATENCY 0 /* event */
68 #define BT_LE_CONN_PARAM_LOW_LATENCY_MIN_INTERVAL 10 /* msec */
69 #define BT_LE_CONN_PARAM_LOW_LATENCY_MAX_INTERVAL 30 /* msec */
70 #define BT_LE_CONN_PARAM_LOW_LATENCY_SLAVE_LATENCY 0 /* event */
72 #define BT_LE_CONN_PARAM_LOW_POWER_MIN_INTERVAL 80 /* msec */
73 #define BT_LE_CONN_PARAM_LOW_POWER_MAX_INTERVAL 100 /* msec */
74 #define BT_LE_CONN_PARAM_LOW_POWER_SLAVE_LATENCY 2 /* event */
76 /* Bonding Info structure */
81 unsigned short conn_type;
82 gboolean is_cancelled_by_user;
83 gboolean is_device_creating;
84 bluetooth_device_address_t *dev_addr;
85 bt_remote_dev_info_t *dev_info;
88 /* Searching Info structure */
92 gboolean is_cancelled_by_user;
93 bluetooth_device_address_t *dev_addr;
94 bt_remote_dev_info_t *dev_info;
95 } bt_service_search_info_data_t;
97 /* Pairing Info structure */
100 gboolean is_autopair;
105 char addr[BT_ADDRESS_STRING_SIZE];
106 bt_remote_dev_info_t *dev_info;
107 } bt_incoming_bond_data_t;
109 /* Bonding and Pairing Informations */
110 bt_bond_data_t *trigger_bond_info;
111 bt_bond_data_t *trigger_unbond_info;
112 bt_pairing_data_t *trigger_pairing_info;
113 bt_service_search_info_data_t *service_search_info;
115 bt_incoming_bond_data_t *incoming_bond_info;
118 BT_DEVICE_BOND_STATE_NONE,
119 BT_DEVICE_BOND_STATE_CANCEL_DISCOVERY,
120 BT_DEVICE_BOND_STATE_DISCOVERY_CANCELLED,
121 BT_DEVICE_BOND_STATE_REMOVE_BONDING,
122 BT_DEVICE_BOND_STATE_REMOVED_BONDING,
123 BT_DEVICE_BOND_STATE_STARTED,
124 BT_DEVICE_BOND_STATE_WAIT_PROP,
125 BT_DEVICE_BOND_STATE_WAIT_DID
130 BT_DEVICE_INCOMING_BOND_INFO,
131 BT_DEVICE_UNBOND_INFO
134 /* BT device bond state variable */
135 static bt_bond_state_e bt_device_bond_state;
136 static int bond_retry_count;
138 static char *passkey_watcher;
139 static GSList *pin_info_list = NULL;
141 /** DBFW+ Event Code */
143 BT_DBFW_PLUS_EVENT_CODE_LINK_LOSS_INFO = 0x10,
144 BT_DBFW_PLUS_EVENT_CODE_LINK_LOSS_CLOCK_INFO = 0x11,
145 BT_DBFW_PLUS_EVENT_CODE_LINK_LOSS_PAGE_SLOTS = 0x12,
146 BT_DBFW_PLUS_EVENT_CODE_LINK_LOSS_LMP_TRACE = 0x13,
147 BT_DBFW_PLUS_EVENT_CODE_A2DP_INFO = 0x20,
148 BT_DBFW_PLUS_EVENT_CODE_HFP_INFO = 0x31,
149 BT_DBFW_PLUS_EVENT_CODE_HFP_SCO_PACKET_TYPE_INFO = 0x32,
150 } bt_dbfw_plus_event_code_t;
152 static int dbfw_rssi;
154 #ifdef TIZEN_GATT_CLIENT
160 } bt_connected_le_dev_t;
169 } bt_le_conn_param_t;
171 static GSList *le_connected_dev_list = NULL;
173 #define BT_LE_CONN_INTERVAL_MIN 7.5 /* msec */
174 #define BT_LE_CONN_INTERVAL_MAX 4000 /* msec */
175 #define BT_LE_CONN_SUPER_TO_MIN 100 /* msec */
176 #define BT_LE_CONN_SUPER_TO_MAX 32000 /* msec */
177 #define BT_LE_CONN_SLAVE_LATENCY_MAX 499
178 #define BT_LE_CONN_TO_SPLIT 10 /* msec */
179 #define BT_LE_CONN_INTERVAL_SPLIT 1.25 /* msec */
181 static void _bt_handle_le_connected_dev_info(const char *address, gboolean connected);
184 /* Forward declaration */
185 static void __bt_device_event_handler(int event_type, gpointer event_data);
186 static void __bt_device_remote_device_found_callback(gpointer event_data, gboolean is_ble);
189 static int __bt_device_handle_bond_state(void);
190 static void __bt_free_bond_info(uint8_t type);
191 static void __bt_free_service_search_info(bt_service_search_info_data_t **p_info);
192 static void __bt_device_handle_bond_completion_event(bt_address_t *bd_addr);
193 static void __bt_device_handle_bond_removal_event(bt_address_t *bd_addr);
194 static void __bt_device_handle_bond_failed_event(event_dev_bond_failed_t* bond_fail_event);
195 static void __bt_handle_ongoing_bond(bt_remote_dev_info_t *remote_dev_info, gboolean incoming_bond);
196 static void __bt_device_acl_state_changed_callback(event_dev_conn_status_t *acl_event,
197 gboolean connected, unsigned char type);
198 static void __bt_free_pairing_info(bt_pairing_data_t **p_info);
200 static void __bt_device_ssp_consent_callback(remote_device_t* dev_info);
201 static void __bt_device_pin_request_callback(remote_device_t* pin_req_event);
202 static void __bt_device_ssp_passkey_display_callback(event_dev_passkey_t *dev_info);
203 static void __bt_device_ssp_passkey_confirmation_callback(event_dev_passkey_t *dev_info);
204 static void __bt_device_ssp_passkey_entry_callback(remote_device_t* dev_info);
205 static void __bt_device_authorization_request_callback(event_dev_authorize_req_t* auth_event);
207 static void __bt_device_services_callback(event_dev_services_t* uuid_list);
208 static void __bt_handle_ongoing_device_service_search(bt_remote_dev_info_t *remote_dev_info);
210 static void __bt_device_trusted_callback(gboolean trusted, event_dev_trust_t* info);
212 static int __bt_get_device_pin_code(const char *address, char *pin_code);
214 gboolean _bt_is_device_creating(void)
216 if (!trigger_bond_info)
218 return trigger_bond_info->is_device_creating;
221 void _bt_device_state_handle_callback_set_request(void)
223 _bt_service_register_event_handler_callback(
224 BT_DEVICE_MODULE, __bt_device_event_handler);
227 void __bt_device_handle_pending_requests(int result, int service_function,
228 void *user_data, unsigned int size)
232 invocation_info_t *req_info = NULL;
236 /* Get method invocation context */
237 for (l = _bt_get_invocation_list(); l != NULL; ) {
240 if (req_info == NULL || req_info->service_function != service_function)
243 switch (service_function) {
244 case BT_SEARCH_SERVICE: {
245 char *address = (char *)user_data;
246 if (strncmp((char*)req_info->user_data, address, BT_ADDRESS_STRING_SIZE)) {
247 BT_ERR("Unexpected: Info request pending for a different address!!");
250 BT_INFO("Found info request addr [%s]", (char*)req_info->user_data);
251 bt_sdp_info_t sdp_info;
253 memset(&sdp_info, 0x00, sizeof(bt_sdp_info_t));
254 _bt_convert_addr_string_to_type(sdp_info.device_addr.addr, address);
256 out_param = g_array_new(FALSE, FALSE, sizeof(gchar));
257 g_array_append_vals(out_param, &sdp_info, sizeof(bt_sdp_info_t));
258 _bt_service_method_return(req_info->context, out_param, result);
260 g_free(req_info->user_data);
261 _bt_free_info_from_invocation_list(req_info);
262 g_array_free(out_param, TRUE);
266 case BT_BOND_DEVICE: {
267 char *address = (char *)user_data;
268 if (strncmp((char*)req_info->user_data, address, BT_ADDRESS_STRING_SIZE)) {
269 BT_ERR("Unexpected: Info request pending for a different address!!");
272 BT_INFO("Found info request addr [%s]", (char*)req_info->user_data);
273 bluetooth_device_info_t dev_info;
274 memset(&dev_info, 0x00, sizeof(bluetooth_device_info_t));
275 _bt_convert_addr_string_to_type(dev_info.device_address.addr,
277 out_param = g_array_new(FALSE, FALSE, sizeof(gchar));
278 g_array_append_vals(out_param, &dev_info,
279 sizeof(bluetooth_device_info_t));
280 _bt_service_method_return(req_info->context, out_param, result);
282 g_free(req_info->user_data);
283 _bt_free_info_from_invocation_list(req_info);
284 g_array_free(out_param, TRUE);
288 case BT_UNBOND_DEVICE: {
289 char *address = (char *)user_data;
290 if (strncmp((char*)req_info->user_data, address, BT_ADDRESS_STRING_SIZE)) {
291 BT_ERR("Unexpected: Info request pending for a different address!!");
294 BT_INFO("Found info request addr [%s]", (char*)req_info->user_data);
295 bluetooth_device_address_t dev_addr;
296 _bt_convert_addr_string_to_type(dev_addr.addr, address);
297 out_param = g_array_new(FALSE, FALSE, sizeof(gchar));
298 g_array_append_vals(out_param, &dev_addr,
299 sizeof(bluetooth_device_address_t));
300 _bt_service_method_return(req_info->context, out_param, result);
302 g_free(req_info->user_data);
303 _bt_free_info_from_invocation_list(req_info);
304 g_array_free(out_param, TRUE);
309 BT_ERR("Unhandled case");
317 * Remote device properties are received on all following conditions
318 * a. When Bonding in on-going
319 * b. When device properties are updated\changed for a connected device
320 * (due to SDP or any other reason)
322 static void __bt_device_remote_properties_callback(event_dev_properties_t *oal_dev_props)
324 bt_remote_dev_info_t *rem_info = NULL;
327 rem_info = g_malloc0(sizeof(bt_remote_dev_info_t));
328 _bt_copy_remote_dev(rem_info, &(oal_dev_props->device_info));
330 if (oal_dev_props->adv_len > 0) {
333 rem_info->manufacturer_data_len = oal_dev_props->adv_len;
334 rem_info->manufacturer_data =
335 g_memdup(oal_dev_props->adv_data,
336 oal_dev_props->adv_len);
337 BT_DBG("----Advertising Data Length: %d",
338 rem_info->manufacturer_data_len);
340 for (k = 0; k < rem_info->manufacturer_data_len; k++) {
341 BT_INFO("Check data[%d] = [[0x%x]",
342 k, oal_dev_props->adv_data[k]);
345 rem_info->manufacturer_data = NULL;
346 rem_info->manufacturer_data_len = 0;
349 /* a. Check if bonding is on-going, if yes, we MUST update the bonding device properties */
350 if (trigger_bond_info && !strcmp(trigger_bond_info->addr, rem_info->address)) {
351 BT_INFO("Bonding is ongoing, try update properties");
352 if (!trigger_bond_info->dev_info ||
353 (!trigger_bond_info->dev_info->name &&
354 !trigger_bond_info->dev_info->alias) ||
355 !trigger_bond_info->dev_info->address ||
356 trigger_bond_info->dev_info->uuid_count == 0) {
357 BT_INFO("Complete data is not present, Assigning rem_info");
358 if (!trigger_bond_info->dev_info)
359 trigger_bond_info->dev_info = g_malloc0(sizeof(bt_remote_dev_info_t));
360 _bt_copy_remote_dev_info(trigger_bond_info->dev_info, rem_info);
363 BT_DBG("Bonding dev addr has matched with remote dev properties address [%s]", rem_info->address);
364 __bt_handle_ongoing_bond(trigger_bond_info->dev_info, FALSE);
365 } else if (incoming_bond_info && !g_strcmp0(incoming_bond_info->addr, rem_info->address)) {
366 BT_INFO("Incoming Bond is ongoing, try update properties");
367 if (!incoming_bond_info->dev_info ||
368 (!incoming_bond_info->dev_info->name &&
369 !incoming_bond_info->dev_info->alias) ||
370 !incoming_bond_info->dev_info->address ||
371 incoming_bond_info->dev_info->uuid_count == 0) {
372 BT_INFO("Complete data is not present, Assigning rem_info");
373 if (!incoming_bond_info->dev_info)
374 incoming_bond_info->dev_info = g_malloc0(sizeof(bt_remote_dev_info_t));
375 _bt_copy_remote_dev_info(incoming_bond_info->dev_info, rem_info);
378 BT_DBG("Incoming Bond addr matches with remote dev properties address [%s]", rem_info->address);
379 __bt_handle_ongoing_bond(incoming_bond_info->dev_info, TRUE);
382 /* Add device to bonded list */
383 _bt_service_add_device_to_bonded_list(rem_info);
385 /* Handle SDP Device properties update */
386 if (service_search_info && service_search_info->dev_info) {
387 if (!strcmp(service_search_info->addr, rem_info->address)) {
388 BT_DBG("Properties received and SDP request pending, fill device properties and send event");
389 service_search_info->dev_info->class = rem_info->class;
390 service_search_info->dev_info->paired = rem_info->paired;
391 service_search_info->dev_info->connected = rem_info->connected;
392 service_search_info->dev_info->rssi = rem_info->rssi;
393 service_search_info->dev_info->addr_type = rem_info->addr_type;
394 service_search_info->dev_info->trust = rem_info->trust;
397 service_search_info->dev_info->manufacturer_data = NULL;
398 service_search_info->dev_info->manufacturer_data_len = 0;
400 __bt_handle_ongoing_device_service_search(service_search_info->dev_info);
404 _bt_free_remote_dev(rem_info);
408 static int __get_oal_trusted_profile(bluetooth_trusted_profile_t profile)
411 case TRUSTED_PROFILE_PBAP:
412 return OAL_TRUSTED_PROFILE_PBAP;
413 case TRUSTED_PROFILE_MAP:
414 return OAL_TRUSTED_PROFILE_MAP;
415 case TRUSTED_PROFILE_SAP:
416 return OAL_TRUSTED_PROFILE_SAP;
417 case TRUSTED_PROFILE_HFP_HF:
418 return OAL_TRUSTED_PROFILE_HFP_HF;
419 case TRUSTED_PROFILE_A2DP:
420 return OAL_TRUSTED_PROFILE_A2DP;
421 case TRUSTED_PROFILE_ALL:
422 return OAL_TRUSTED_PROFILE_ALL;
428 int _bt_set_trust_profile(bluetooth_device_address_t *addr,
429 bluetooth_trusted_profile_t profile, gboolean trust)
432 bt_address_t bd_addr;
433 oal_trusted_profile_e oal_profile;
437 retv_if(!addr, BLUETOOTH_ERROR_INVALID_PARAM);
439 memcpy(bd_addr.addr, addr, BLUETOOTH_ADDRESS_LENGTH);
440 oal_profile = __get_oal_trusted_profile(profile);
441 retv_if(0 == oal_profile, BLUETOOTH_ERROR_NOT_SUPPORT);
443 result = device_set_trust_profile(&bd_addr, oal_profile, trust);
444 if (result != OAL_STATUS_SUCCESS) {
445 BT_ERR("device_set_trust_profile error: [%d]", result);
446 return BLUETOOTH_ERROR_INTERNAL;
450 return BLUETOOTH_ERROR_NONE;
453 int _bt_get_trust_profile(bluetooth_device_address_t *addr,
454 bluetooth_trusted_profile_t profile, guint *trust)
457 bt_address_t bd_addr;
458 oal_trusted_profile_e oal_profile;
462 retv_if(!addr, BLUETOOTH_ERROR_INVALID_PARAM);
464 memcpy(bd_addr.addr, addr, BLUETOOTH_ADDRESS_LENGTH);
465 oal_profile = __get_oal_trusted_profile(profile);
466 retv_if(0 == oal_profile, BLUETOOTH_ERROR_NOT_SUPPORT);
468 result = device_get_trust_profile(&bd_addr, oal_profile, trust);
469 if (result != OAL_STATUS_SUCCESS) {
470 BT_ERR("device_set_trust_profile error: [%d]", result);
471 return BLUETOOTH_ERROR_INTERNAL;
475 return BLUETOOTH_ERROR_NONE;
478 static void __bt_handle_ongoing_device_service_search(bt_remote_dev_info_t *remote_dev_info)
480 GVariant *param = NULL;
481 GVariant *uuids = NULL;
482 GVariantBuilder *builder = NULL;
483 GVariant *manufacturer_data;
487 BT_INFO("Send Service Search request event");
489 if (remote_dev_info->alias)
490 name = remote_dev_info->alias;
492 name = remote_dev_info->name;
494 builder = g_variant_builder_new(G_VARIANT_TYPE("as"));
495 for (i = 0; i < remote_dev_info->uuid_count; i++) {
496 g_variant_builder_add(builder, "s",
497 remote_dev_info->uuids[i]);
499 uuids = g_variant_new("as", builder);
500 g_variant_builder_unref(builder);
501 manufacturer_data = g_variant_new_from_data((const GVariantType *)"ay",
502 remote_dev_info->manufacturer_data, remote_dev_info->manufacturer_data_len,
505 param = g_variant_new("(isunsbub@asn@ay)",
506 BLUETOOTH_ERROR_NONE,
507 remote_dev_info->address,
508 remote_dev_info->class,
509 remote_dev_info->rssi,
511 remote_dev_info->paired,
512 remote_dev_info->connected,
513 remote_dev_info->trust,
515 remote_dev_info->manufacturer_data_len,
517 /* Send the event to application */
518 _bt_send_event(BT_ADAPTER_EVENT,
519 BLUETOOTH_EVENT_SERVICE_SEARCHED,
522 __bt_free_service_search_info(&service_search_info);
526 static void __bt_device_services_callback(event_dev_services_t* uuid_list)
528 bt_remote_dev_info_t *rem_info = NULL;
532 if (trigger_bond_info && _bt_compare_adddress(trigger_bond_info->dev_addr,
533 (bluetooth_device_address_t *)&uuid_list->address) == TRUE) {
534 bluetooth_device_address_t *dev_addr = trigger_bond_info->dev_addr;
536 BT_DBG("Bonding dev addr has matched");
537 /* Bonding ongoing, Query device properties again */
538 if (BLUETOOTH_ERROR_NONE ==
539 _bt_device_get_bonded_device_info(dev_addr))
540 BT_DBG("_bt_device_get_bonded_device_info success");
542 BT_ERR("_bt_device_get_bonded_device_info failed");
545 if (service_search_info == NULL) {
547 BT_DBG("searching_info == NULL");
551 if (_bt_compare_adddress(service_search_info->dev_addr,
552 (bluetooth_device_address_t *)&uuid_list->address) == FALSE) {
553 BT_DBG("This device is not queried");
557 rem_info = g_malloc0(sizeof(bt_remote_dev_info_t));
558 memset(rem_info, 0x00, sizeof(bt_remote_dev_info_t));
560 rem_info->address = g_new0(char, BT_ADDRESS_STRING_SIZE);
561 _bt_convert_addr_type_to_string(rem_info->address, uuid_list->address.addr);
563 rem_info->uuid_count = uuid_list->num;
565 BT_INFO("Address [%s]", rem_info->address);
566 BT_INFO("Number of UUID's [%d]", rem_info->uuid_count);
567 if (rem_info->uuid_count > 0)
568 rem_info->uuids = g_new0(char *, rem_info->uuid_count);
570 /* Fill Remote Device Service List list */
571 for (i = 0; i < rem_info->uuid_count; i++) {
572 rem_info->uuids[i] = g_malloc0(BLUETOOTH_UUID_STRING_MAX);
573 _bt_uuid_to_string((service_uuid_t *)&uuid_list->service_list[i].uuid, rem_info->uuids[i]);
574 BT_DBG("UUID value=%s", rem_info->uuids[i]);
577 /* Update local cache */
578 _bt_update_remote_dev_property(rem_info->address, DEV_PROP_SERVICES, (void *)rem_info);
580 BT_DBG("DBUS return");
581 __bt_device_handle_pending_requests(BLUETOOTH_ERROR_NONE, BT_SEARCH_SERVICE,
582 service_search_info->addr, BT_ADDRESS_STRING_SIZE);
584 /* Save UUID List of remote devices */
585 if (service_search_info->dev_info)
586 _bt_free_remote_dev(service_search_info->dev_info);
587 service_search_info->dev_info = rem_info;
589 /* Query Other device properties */
590 if (_bt_device_get_bonded_device_info(service_search_info->dev_addr) == BLUETOOTH_ERROR_NONE) {
591 BT_DBG("Bonded device info query posted to stack successfully");
593 BT_DBG("Possibly internal stack error in bonded device info query, perform cleanup");
594 __bt_free_service_search_info(&service_search_info);
599 static void __bt_device_authorization_request_callback(event_dev_authorize_req_t* auth_event)
601 oal_service_t service_d = auth_event->service_id;
602 gchar address[BT_ADDRESS_STR_LEN];
605 _bt_convert_addr_type_to_string(address, auth_event->address.addr);
607 BT_INFO("service_d: %d", service_d);
611 BT_INFO("Incoming HID Profile conn Req from device addr [%s]", address);
613 case A2DP_SERVICE_ID:
614 BT_INFO("Incoming A2DP(Remote Sink) profile conn Req from device addr [%s]", address);
615 _bt_a2dp_src_handle_incoming_authorization(address, service_d);
617 case A2DP_SRC_SERVICE_ID:
618 BT_INFO("Incoming A2DP(Remote Source) Profile conn Req from device addr [%s]", address);
619 _bt_a2dp_sink_handle_incoming_authorization(address, service_d);
621 case AVRCP_SERVICE_ID:
622 BT_INFO("Incoming AVRCP (Remote) Profile conn Req from device addr [%s]", address);
624 case AVRCP_CT_SERVICE_ID:
625 BT_INFO("Incoming AVRCP (Controller) Profile conn Req from device addr [%s]", address);
627 #ifdef TIZEN_FEATURE_BT_OBEX
628 case OPP_SERVICE_ID: {
629 GVariant *param = NULL;
632 if (_bt_obex_server_is_custom() == false) {
633 /* Allow the connection for native OPP server */
637 name = g_strdup(address);
639 BT_INFO("Incoming OPP conn Req from device addr [%s]", address);
640 _bt_obex_server_set_pending_conn_auth_device_addr(address);
641 param = g_variant_new("(iss)", BLUETOOTH_ERROR_NONE, address, name);
642 _bt_send_event(BT_OPP_SERVER_EVENT,
643 BLUETOOTH_EVENT_OBEX_SERVER_CONNECTION_AUTHORIZE, param);
649 BT_INFO("Incoming HSP_SERVICE_ID conn Req from device addr [%s]", address);
652 BT_INFO("Incoming HFP_SERVICE_ID conn Req from device addr [%s]", address);
655 BT_INFO("Incoming SAP_SERVICE_ID conn Req from device addr [%s]", address);
657 case HSP_HS_SERVICE_ID:
658 BT_INFO("Incoming HSP_HS_SERVICE_ID conn Req from device addr [%s]", address);
660 case HFP_HS_SERVICE_ID:
661 BT_INFO("Incoming HFP_HS_SERVICE_ID conn Req from device addr [%s]", address);
664 case IOTIVITY_SERVICE_ID:
665 BT_INFO("Incoming IOTIVITY_SERVICE_ID conn Req from device addr [%s]", address);
669 /* For now, reject authorization for any service apart from above switch cases */
670 BT_INFO("Incoming Profile conn req with service ID [%d] from device addr [%s]", service_d, address);
671 res = device_reply_auth_request((bt_address_t*)&auth_event->address, service_d, FALSE, FALSE);
672 if (res != OAL_STATUS_SUCCESS)
673 BT_ERR("authorize_response: %d", res);
677 /* Auto accept authorization request for HID, A2DP and AVRCP profiles */
678 BT_INFO("Auto Accept authorization");
679 res = device_reply_auth_request((bt_address_t*)&auth_event->address, service_d, TRUE, FALSE);
680 if (res != OAL_STATUS_SUCCESS)
681 BT_ERR("authorize_response: %d", res);
685 static void __bt_handle_ongoing_bond(bt_remote_dev_info_t *remote_dev_info, gboolean incoming_bond)
687 GVariant *param = NULL;
690 if ((remote_dev_info->name || remote_dev_info->alias)
691 && remote_dev_info->address
692 && remote_dev_info->uuids) {
693 BT_INFO("All properties updated, time to send bonding finished event");
694 GVariant *uuids = NULL;
695 GVariantBuilder *builder = NULL;
696 GVariant *manufacturer_data;
700 if (remote_dev_info->alias)
701 name = remote_dev_info->alias;
703 name = remote_dev_info->name;
705 builder = g_variant_builder_new(G_VARIANT_TYPE("as"));
706 for (i = 0; i < remote_dev_info->uuid_count; i++) {
707 g_variant_builder_add(builder, "s",
708 remote_dev_info->uuids[i]);
710 uuids = g_variant_new("as", builder);
711 g_variant_builder_unref(builder);
712 manufacturer_data = g_variant_new_from_data((const GVariantType *)"ay",
713 remote_dev_info->manufacturer_data, remote_dev_info->manufacturer_data_len,
716 param = g_variant_new("(isunsbub@asn@ay)",
717 BLUETOOTH_ERROR_NONE,
718 remote_dev_info->address,
719 remote_dev_info->class,
720 remote_dev_info->rssi,
722 remote_dev_info->paired,
723 remote_dev_info->connected,
724 remote_dev_info->trust,
726 remote_dev_info->manufacturer_data_len,
728 /* Send the event to application */
729 _bt_send_event(BT_ADAPTER_EVENT,
730 BLUETOOTH_EVENT_BONDING_FINISHED,
732 BT_PERMANENT_LOG("Paired %s", remote_dev_info->address + 12);
734 __bt_free_bond_info(BT_DEVICE_INCOMING_BOND_INFO);
736 __bt_free_bond_info(BT_DEVICE_BOND_INFO);
737 __bt_free_pairing_info(&trigger_pairing_info);
740 BT_INFO("Lets wait for more remote device properties");
744 static void __handle_incoming_bond_created_event(bt_address_t *bd_addr)
746 char address[BT_ADDRESS_STRING_SIZE];
747 bluetooth_device_address_t dev_addr;
752 * BlueZ sends paired signal for each paired device, during activation,
753 * We should ignore this, otherwise application thinks that a new device
756 if (_bt_adapter_get_status() != BT_ACTIVATED) {
757 BT_DBG("BT is not activated, so ignore this");
761 _bt_convert_addr_type_to_string(address, bd_addr->addr);
762 if (!incoming_bond_info) {
763 incoming_bond_info = g_malloc0(sizeof(bt_incoming_bond_data_t));
765 if (g_strcmp0(incoming_bond_info->addr, address)) {
766 BT_DBG("Previous Bond address: [%s] differs from new address: [%s]",
767 address, incoming_bond_info->addr);
768 __bt_free_bond_info(BT_DEVICE_INCOMING_BOND_INFO);
769 incoming_bond_info = g_malloc0(sizeof(bt_incoming_bond_data_t));
773 BT_INFO("Incoming bond successfully completed");
774 g_strlcpy(incoming_bond_info->addr, address, BT_ADDRESS_STRING_SIZE);
775 incoming_bond_info->dev_info = NULL;
777 _bt_convert_addr_string_to_type(dev_addr.addr, incoming_bond_info->addr);
778 if (BLUETOOTH_ERROR_NONE == _bt_device_get_bonded_device_info(&dev_addr)) {
779 BT_DBG("Bonded device info query posted to stack successfully");
781 BT_ERR("Bonded device info query failed");
782 __bt_free_bond_info(BT_DEVICE_INCOMING_BOND_INFO);
788 static void __bt_device_handle_bond_completion_event(bt_address_t *bd_addr)
790 gchar address[BT_ADDRESS_STR_LEN];
791 bluetooth_device_address_t dev_addr;
795 if (trigger_bond_info == NULL) {
797 BT_DBG("trigger_bond_info == NULL, Handle incomming bond event");
798 __handle_incoming_bond_created_event(bd_addr);
802 _bt_convert_addr_type_to_string(address, bd_addr->addr);
803 if (g_strcmp0(trigger_bond_info->addr, address)) {
804 BT_DBG("Bonding address= [%s] is different from requested address =[%s]",
805 address, trigger_bond_info->addr);
806 __handle_incoming_bond_created_event(bd_addr);
810 BT_INFO("Bonding successfully completed");
811 /* Bonding state will be cleaned up & BONDING FINISHED EVENT
812 will be sent only when Properties are fetched from stack
813 Till that time lets not free trigger_bond_info.
814 However it is possible that while fetching device properties, internal
815 stack error can occur which can lead to no valid properties or
816 no properties at all. So in such cases, we must not wait for properties,
817 otherwise, it can lead to infinite wait */
818 _bt_convert_addr_string_to_type(dev_addr.addr,
819 trigger_bond_info->addr);
821 if (_bt_device_get_bonded_device_info(&dev_addr) == BLUETOOTH_ERROR_NONE) {
822 BT_DBG("BOnded device info query posted to stack successfully");
823 __bt_device_handle_pending_requests(BLUETOOTH_ERROR_NONE, BT_BOND_DEVICE,
824 trigger_bond_info->addr, BT_ADDRESS_STRING_SIZE);
826 BT_DBG("Possibly internal stack error in bonded device info query, perform cleanup");
827 __bt_device_handle_pending_requests(BLUETOOTH_ERROR_INTERNAL, BT_BOND_DEVICE,
828 trigger_bond_info->addr, BT_ADDRESS_STRING_SIZE);
829 /* Destroy if at all device got bonded at stack level */
830 device_destroy_bond((bt_address_t *)trigger_bond_info->dev_addr);
832 __bt_free_bond_info(BT_DEVICE_BOND_INFO);
833 __bt_free_pairing_info(&trigger_pairing_info);
839 /**********************************************************************************************
840 * Bond removal event can be triggered for following reasons -
841 * a. If Bonding procedure if failed (for Auth failed, Page timeout, cancelled by user etc)
842 * b. If Application requests for explicitly removing the bond
843 * c. When application attempt to create bond,bond is removed first which triggers this event
844 * c. is in-line with Bluedroid bond create\emoval architecture
845 *********************************************************************************************/
846 static void __bt_device_handle_bond_removal_event(bt_address_t *bd_addr)
848 char address[BT_ADDRESS_STRING_SIZE];
852 _bt_convert_addr_type_to_string(address, bd_addr->addr);
853 _bt_service_remove_device_from_bonded_list(address);
855 if (trigger_unbond_info) {
856 BT_INFO("Bond removal request successfully handled, return DBUS and send event");
857 GVariant *param = NULL;
858 __bt_device_handle_pending_requests(BLUETOOTH_ERROR_NONE, BT_UNBOND_DEVICE,
859 trigger_unbond_info->addr, BT_ADDRESS_STRING_SIZE);
860 param = g_variant_new("(is)", BLUETOOTH_ERROR_NONE, trigger_unbond_info->addr);
861 _bt_send_event(BT_ADAPTER_EVENT,
862 BLUETOOTH_EVENT_BONDED_DEVICE_REMOVED,
864 BT_PERMANENT_LOG("Unpaired %s", trigger_unbond_info->addr + 12);
865 __bt_free_bond_info(BT_DEVICE_UNBOND_INFO);
866 __bt_free_pairing_info(&trigger_pairing_info);
867 } else if (trigger_bond_info) {
868 BT_ERR("Bonding was removed");
869 __bt_device_handle_bond_state();
874 static void __bt_device_handle_bond_failed_event(event_dev_bond_failed_t* bond_fail_event)
877 oal_status_t status = bond_fail_event->status;
878 BT_INFO("Bonding failed, reason: %d", status);
881 case OAL_STATUS_RMT_DEVICE_DOWN:
883 if (trigger_bond_info) {
884 BT_INFO("OAL_STATUS_RMT_DEVICE_DOWN:Lets retry bonding!! retry count [%d]",
886 int ret = OAL_STATUS_SUCCESS;
887 if (bond_retry_count < MAX_BOND_RETRY_COUNT) {
888 ret = device_create_bond((bt_address_t *)trigger_bond_info->dev_addr, trigger_bond_info->conn_type);
889 if (ret != OAL_STATUS_SUCCESS) {
890 BT_ERR("Create Bond procedure could not suceed");
891 __bt_device_handle_pending_requests(BLUETOOTH_ERROR_INTERNAL, BT_BOND_DEVICE,
892 trigger_bond_info->addr, BT_ADDRESS_STRING_SIZE);
893 __bt_free_bond_info(BT_DEVICE_BOND_INFO);
894 __bt_free_pairing_info(&trigger_pairing_info);
895 bond_retry_count = 0;
899 BT_ERR("Create Bond failed MAX_BOND_RETRY_COUNT TIMES!!");
900 __bt_device_handle_pending_requests(BLUETOOTH_ERROR_INTERNAL, BT_BOND_DEVICE,
901 trigger_bond_info->addr, BT_ADDRESS_STRING_SIZE);
902 __bt_free_bond_info(BT_DEVICE_BOND_INFO);
903 __bt_free_pairing_info(&trigger_pairing_info);
904 bond_retry_count = 0;
909 case OAL_STATUS_AUTH_FAILED:
911 /*TODO Auto pairing status set & ignore auto pairing logics can be done at this point.
912 To be considered later*/
913 int result = BLUETOOTH_ERROR_INTERNAL;
914 BT_INFO("BT_OPERATION_STATUS_AUTH_FAILED");
915 if (trigger_bond_info) {
916 BT_ERR("Create Bond procedure could not suceed, check if cancelled by User");
917 if (trigger_bond_info->is_cancelled_by_user) {
918 BT_ERR("Bonding is cancelled by user");
919 result = BLUETOOTH_ERROR_CANCEL_BY_USER;
921 __bt_device_handle_pending_requests(result, BT_BOND_DEVICE,
922 trigger_bond_info->addr, BT_ADDRESS_STRING_SIZE);
923 __bt_free_bond_info(BT_DEVICE_BOND_INFO);
926 __bt_free_pairing_info(&trigger_pairing_info);
929 case OAL_STATUS_INTERNAL_ERROR:
931 BT_INFO("OAL_STATUS_INTERNAL_ERROR");
932 if (trigger_unbond_info) {
933 BT_INFO("Bond removal request failed, return DBUS and send event");
934 GVariant *param = NULL;
935 __bt_device_handle_pending_requests(BLUETOOTH_ERROR_INTERNAL, BT_UNBOND_DEVICE,
936 trigger_unbond_info->addr, BT_ADDRESS_STRING_SIZE);
937 param = g_variant_new("(is)", BLUETOOTH_ERROR_INTERNAL, trigger_unbond_info->addr);
938 _bt_send_event(BT_ADAPTER_EVENT,
939 BLUETOOTH_EVENT_BONDED_DEVICE_REMOVED,
941 __bt_free_bond_info(BT_DEVICE_UNBOND_INFO);
942 } else if (trigger_bond_info) {
943 if (__bt_device_handle_bond_state() != BLUETOOTH_ERROR_NONE) {
944 if (trigger_bond_info) {
945 __bt_device_handle_pending_requests(BLUETOOTH_ERROR_INTERNAL, BT_BOND_DEVICE,
946 trigger_bond_info->addr, BT_ADDRESS_STRING_SIZE);
947 __bt_free_bond_info(BT_DEVICE_BOND_INFO);
952 __bt_free_pairing_info(&trigger_pairing_info);
957 BT_ERR("Unknown status of Bond failed event status [%d]", status);
965 static gboolean __bt_device_init_dbfw_rssi_cb(gpointer user_data)
971 static void __bt_device_parse_dbfw_set_rssi(unsigned char *data, uint32_t length)
974 dbfw_rssi = 0xFFFFFF00 | data[4];
975 BT_INFO("dbfw_rssi = %d", dbfw_rssi);
976 g_timeout_add(1000, __bt_device_init_dbfw_rssi_cb, NULL);
979 static void __bt_device_dbfw_plus_info_callback(event_dev_dbfw_plus_info_t *dbfw_info)
982 char *data_str = NULL;
985 data_str = g_malloc0(dbfw_info->length * 2 + 1);
986 for (i = 0; i < dbfw_info->length; i++)
987 snprintf(&data_str[i * 2], 3, "%02X", dbfw_info->data[i]);
988 data_str[i * 2] = '\0';
990 switch(dbfw_info->event_code) {
991 case BT_DBFW_PLUS_EVENT_CODE_LINK_LOSS_INFO:
992 BT_DBG("## Event Code: Linkloss Debug Info");
993 snprintf(evt_str, 18, "[DBFW]Linkloss(D)");
994 __bt_device_parse_dbfw_set_rssi(dbfw_info->data, dbfw_info->length);
996 case BT_DBFW_PLUS_EVENT_CODE_LINK_LOSS_CLOCK_INFO:
997 BT_DBG("## Event Code: Linkloss Clock Info");
998 snprintf(evt_str, 18, "[DBFW]Linkloss(C)");
1000 case BT_DBFW_PLUS_EVENT_CODE_LINK_LOSS_PAGE_SLOTS:
1001 BT_DBG("## Event Code: Linkloss Page slots");
1002 snprintf(evt_str, 18, "[DBFW]Linkloss(P)");
1004 case BT_DBFW_PLUS_EVENT_CODE_LINK_LOSS_LMP_TRACE:
1005 BT_DBG("## Event Code: Linkloss LMP trace");
1006 snprintf(evt_str, 18, "[DBFW]Linkloss(L)");
1008 case BT_DBFW_PLUS_EVENT_CODE_A2DP_INFO:
1009 BT_DBG("## Event Code: A2DP Info");
1010 snprintf(evt_str, 18, "[DBFW]A2DP");
1012 case BT_DBFW_PLUS_EVENT_CODE_HFP_INFO:
1013 BT_DBG("## Event Code: HFP Info");
1014 snprintf(evt_str, 18, "[DBFW]HFP");
1016 case BT_DBFW_PLUS_EVENT_CODE_HFP_SCO_PACKET_TYPE_INFO:
1017 BT_DBG("## Event Code: HFP SCO Packet Type");
1018 snprintf(evt_str, 18, "[DBFW]SCO");
1021 BT_DBG("## Unknown event code (0x%02x)", dbfw_info->event_code);
1022 snprintf(evt_str, 18, "[DBFW]0x%02X", dbfw_info->event_code);
1026 BT_PERMANENT_LOG("%s 0x%s", evt_str, data_str);
1030 static void __bt_device_event_handler(int event_type, gpointer event_data)
1032 int eventcheck = OAL_EVENT_DEVICE_PROPERTIES;
1033 BT_INFO("event [%d] Event check = [%d]", event_type, eventcheck);
1035 switch (event_type) {
1036 case OAL_EVENT_ADAPTER_INQUIRY_RESULT_BREDR_ONLY: {
1037 BT_INFO("BREDR Device Found");
1038 __bt_device_remote_device_found_callback(event_data, FALSE);
1041 case OAL_EVENT_ADAPTER_INQUIRY_RESULT_BLE: {
1042 BT_INFO("Dual Device Found");
1043 __bt_device_remote_device_found_callback(event_data, FALSE);
1046 case OAL_EVENT_DEVICE_PROPERTIES: {
1047 BT_INFO("Remote Device properties Received");
1048 __bt_device_remote_properties_callback((event_dev_properties_t *)event_data);
1051 case OAL_EVENT_DEVICE_BONDING_SUCCESS: {
1052 BT_INFO("Bonding Success event Received");
1053 __bt_device_handle_bond_completion_event((bt_address_t *)event_data);
1056 case OAL_EVENT_DEVICE_BONDING_REMOVED: {
1057 BT_INFO("Bonding Removed event Received");
1058 __bt_device_handle_bond_removal_event((bt_address_t *)event_data);
1061 case OAL_EVENT_DEVICE_BONDING_FAILED: {
1062 BT_INFO("Bonding Failed event Received");
1063 __bt_device_handle_bond_failed_event((event_dev_bond_failed_t*) event_data);
1066 case OAL_EVENT_DEVICE_ACL_CONNECTED: {
1067 BT_INFO("ACL Connected event Received");
1068 event_dev_conn_status_t* param = event_data;
1069 __bt_device_acl_state_changed_callback(param, TRUE, 0);
1072 case OAL_EVENT_DEVICE_ACL_DISCONNECTED: {
1073 BT_INFO("ACL Disconnected event Received");
1074 __bt_device_acl_state_changed_callback((event_dev_conn_status_t *)event_data, FALSE, 0);
1077 case OAL_EVENT_DEVICE_LE_CONNECTED: {
1078 BT_INFO("LE Connected event Received");
1079 event_dev_conn_status_t* param = event_data;
1080 __bt_device_acl_state_changed_callback(param, TRUE, 1);
1083 case OAL_EVENT_DEVICE_LE_DISCONNECTED: {
1084 BT_INFO("LE Disconnected event Received");
1085 __bt_device_acl_state_changed_callback((event_dev_conn_status_t *)event_data, FALSE, 1);
1088 case OAL_EVENT_DEVICE_PIN_REQUEST: {
1089 BT_INFO("PIN Request Received");
1090 __bt_device_pin_request_callback((remote_device_t*)event_data);
1093 case OAL_EVENT_DEVICE_PASSKEY_ENTRY_REQUEST: {
1094 BT_INFO("Passkey Entry request Received");
1095 __bt_device_ssp_passkey_entry_callback((remote_device_t*)event_data);
1098 case OAL_EVENT_DEVICE_PASSKEY_CONFIRMATION_REQUEST:{
1099 BT_INFO("Passkey Confirmation Request Received");
1100 __bt_device_ssp_passkey_confirmation_callback((event_dev_passkey_t *)event_data);
1103 case OAL_EVENT_DEVICE_PASSKEY_DISPLAY: {
1104 BT_INFO("Passkey Display Request Received");
1105 __bt_device_ssp_passkey_display_callback((event_dev_passkey_t *)event_data);
1108 case OAL_EVENT_DEVICE_SSP_CONSENT_REQUEST: {
1109 BT_INFO("SSP Consent Request Received");
1110 __bt_device_ssp_consent_callback((remote_device_t*)event_data);
1113 case OAL_EVENT_DEVICE_SERVICES: {
1114 BT_INFO("Remote Device Services Received");
1115 __bt_device_services_callback((event_dev_services_t*)event_data);
1118 case OAL_EVENT_DEVICE_AUTHORIZE_REQUEST: {
1119 BT_INFO("Remote Device Authorization Request");
1120 __bt_device_authorization_request_callback((event_dev_authorize_req_t*)event_data);
1123 case OAL_EVENT_DEVICE_TRUSTED: {
1124 BT_INFO("Remote Device Trusted");
1125 __bt_device_trusted_callback(TRUE, (event_dev_trust_t*)event_data);
1128 case OAL_EVENT_DEVICE_UNTRUSTED: {
1129 BT_INFO("Remote Device UnTrusted");
1130 __bt_device_trusted_callback(FALSE, (event_dev_trust_t*)event_data);
1133 case OAL_EVENT_DEVICE_NAME: {
1134 remote_device_t *rem_dev = event_data;
1135 gchar address[BT_ADDRESS_STR_LEN];
1137 _bt_convert_addr_type_to_string(address, rem_dev->address.addr);
1138 BT_INFO("Remote Device name Received");
1139 BT_INFO("Name: %s, Address: %s", rem_dev->name, address);
1141 /* Update local cache */
1142 _bt_update_remote_dev_property(address, DEV_PROP_NAME, (void *)rem_dev->name);
1145 case OAL_EVENT_DEVICE_TRUSTED_PROFILES_CHANGED: {
1146 event_device_trusted_profiles_t *ev = event_data;
1147 char address[BT_ADDRESS_STRING_SIZE];
1151 _bt_convert_addr_type_to_string(address, ev->address.addr);
1152 _bt_send_event(BT_DEVICE_EVENT,
1153 BLUETOOTH_EVENT_SUPPORTED_PROFILE_TRUSTED,
1154 g_variant_new("(isi)", BLUETOOTH_ERROR_NONE,
1155 address, ev->trust_val));
1158 case OAL_EVENT_RSSI_MONITORING_ENABLED: {
1159 event_dev_rssi_info_t *ev = event_data;
1160 char address[BT_ADDRESS_STRING_SIZE];
1165 _bt_convert_addr_type_to_string(address, ev->address.addr);
1166 param = g_variant_new("(isib)", BLUETOOTH_ERROR_NONE,
1167 address, ev->link_type, TRUE);
1168 _bt_send_event(BT_DEVICE_EVENT, BLUETOOTH_EVENT_RSSI_ENABLED, param);
1171 case OAL_EVENT_RSSI_MONITORING_DISABLED: {
1172 event_dev_rssi_info_t *ev = event_data;
1173 char address[BT_ADDRESS_STRING_SIZE];
1178 _bt_convert_addr_type_to_string(address, ev->address.addr);
1179 param = g_variant_new("(isib)", BLUETOOTH_ERROR_NONE,
1180 address, ev->link_type, FALSE);
1181 _bt_send_event(BT_DEVICE_EVENT, BLUETOOTH_EVENT_RSSI_ENABLED, param);
1184 case OAL_EVENT_RSSI_ALERT_RECEIVED: {
1185 event_dev_rssi_info_t *ev = event_data;
1186 char address[BT_ADDRESS_STRING_SIZE];
1191 _bt_convert_addr_type_to_string(address, ev->address.addr);
1192 param = g_variant_new("(isiii)", BLUETOOTH_ERROR_NONE,
1193 address, ev->link_type, ev->alert_type, ev->rssi);
1194 _bt_send_event(BT_DEVICE_EVENT, BLUETOOTH_EVENT_RSSI_ALERT, param);
1197 case OAL_EVENT_RAW_RSSI_RECEIVED: {
1198 event_dev_rssi_info_t *ev = event_data;
1199 char address[BT_ADDRESS_STRING_SIZE];
1204 _bt_convert_addr_type_to_string(address, ev->address.addr);
1205 param = g_variant_new("(isii)", BLUETOOTH_ERROR_NONE,
1206 address, ev->link_type, ev->rssi);
1207 _bt_send_event(BT_DEVICE_EVENT, BLUETOOTH_EVENT_RAW_RSSI, param);
1210 case OAL_EVENT_DEVICE_DBFW_PLUS_INFO: {
1211 __bt_device_dbfw_plus_info_callback((event_dev_dbfw_plus_info_t*)event_data);
1215 BT_INFO("Unhandled event..");
1219 /* Legacy Pairing event handler */
1220 static void __bt_device_pin_request_callback(remote_device_t* pin_req_event)
1223 char address[BT_ADDRESS_STRING_SIZE];
1224 char pin_code[BLUETOOTH_PIN_CODE_MAX_LENGTH + 1];
1225 bool incoming = false;
1228 _bt_convert_addr_type_to_string(address, pin_req_event->address.addr);
1230 BT_INFO("Address[%s]", address);
1231 BT_INFO("Name[%s]", pin_req_event->name);
1232 BT_INFO("COD[%d]", pin_req_event->cod);
1234 if (trigger_pairing_info) {
1235 /* BTAPI support only one pairing at a time */
1236 BT_ERR("Already Pairing address [%s]", trigger_pairing_info->addr);
1237 BT_ERR("New PIN request address [%s]", address);
1238 device_reject_pin_request(&pin_req_event->address);
1242 /* If user initiated bonding and auto response is possible, just reply with default 0000*/
1243 if (_bt_is_bonding_device_address(address) == TRUE &&
1244 _bt_agent_is_auto_response(pin_req_event->cod, address, pin_req_event->name)) {
1245 /* Note: Currently even if SYSPOPUP is supported, we use Fixed PIN "0000" for basic pairing
1246 as BT SYSPOPUP is currently not working for PIN KEY entry in Tizen platform. This needs
1247 to be checked and fixed apropriately */
1248 _bt_set_autopair_status_in_bonding_info(TRUE);
1249 device_accept_pin_request(&pin_req_event->address, "0000");
1250 } else if (_bt_agent_is_hid_keyboard(pin_req_event->cod)) {
1251 BT_DBG("Remote Device is HID keyboard Type..");
1252 char str_passkey[BT_PASSKEY_MAX_LENGTH + 1] = { 0 };
1254 if (_bt_agent_generate_passkey(str_passkey,
1255 BT_PASSKEY_MAX_LENGTH) != 0) {
1256 device_reject_pin_request(&pin_req_event->address);
1259 device_accept_pin_request(&pin_req_event->address, str_passkey);
1261 BT_DBG("Send BLUETOOTH_EVENT_KEYBOARD_PASSKEY_DISPLAY");
1263 if(trigger_bond_info == NULL)
1266 param = g_variant_new("(bsss)", incoming, address, pin_req_event->name, str_passkey);
1267 _bt_send_event(BT_ADAPTER_EVENT,
1268 BLUETOOTH_EVENT_KEYBOARD_PASSKEY_DISPLAY, param);
1269 BT_DBG("Key board pairing in process");
1270 } else if (BLUETOOTH_ERROR_NONE == __bt_get_device_pin_code(address, pin_code)) {
1271 BT_DBG("Use stored PIN code [%s]", pin_code);
1272 device_accept_pin_request(&pin_req_event->address, pin_code);
1274 if (_bt_is_bonding_device_address(address) == TRUE) {
1275 BT_DBG("Show Pin entry");
1276 trigger_pairing_info = g_malloc0(sizeof(bt_pairing_data_t));
1277 trigger_pairing_info->addr = g_strdup(address);
1278 trigger_pairing_info->is_ssp = FALSE;
1280 BT_DBG("Send BLUETOOTH_EVENT_PIN_REQUEST");
1282 if(trigger_bond_info == NULL)
1285 param = g_variant_new("(bss)", incoming, address, pin_req_event->name);
1286 _bt_send_event(BT_ADAPTER_EVENT,
1287 BLUETOOTH_EVENT_PIN_REQUEST, param);
1292 _bt_agent_release_memory();
1296 /* SSP Pairing event handler */
1297 static void __bt_device_ssp_passkey_entry_callback(remote_device_t* dev_info)
1300 gchar address[BT_ADDRESS_STR_LEN];
1303 bool incoming = false;
1307 _bt_convert_addr_type_to_string(address, dev_info->address.addr);
1309 name = dev_info->name;
1311 BT_INFO("Address[%s]", address);
1312 BT_INFO("Name[%s]", name);
1313 BT_INFO("COD[%d]", dev_info->cod);
1315 if (trigger_pairing_info) {
1316 /* BTAPI support only one pairing at a time */
1317 BT_ERR("Already Pairing address [%s]", trigger_pairing_info->addr);
1318 BT_ERR("New PIN request address [%s]", address);
1319 device_reject_pin_request(&dev_info->address);
1324 /* Set pairing data */
1325 trigger_pairing_info = g_malloc0(sizeof(bt_pairing_data_t));
1326 trigger_pairing_info->addr = g_strdup(address);
1327 trigger_pairing_info->is_ssp = TRUE;
1329 if(trigger_bond_info == NULL)
1332 param = g_variant_new("(bss)", incoming, p_addr, name);
1333 _bt_send_event(BT_ADAPTER_EVENT,
1334 BLUETOOTH_EVENT_PASSKEY_REQUEST, param);
1338 static void __bt_device_ssp_passkey_confirmation_callback(event_dev_passkey_t *dev_info)
1341 gchar address[BT_ADDRESS_STR_LEN];
1344 char str_passkey[7];
1345 bool incoming = false; /*Stores if bonding request is incoming(true) or outgoing(false) */
1348 _bt_convert_addr_type_to_string(address, dev_info->device_info.address.addr);
1350 name = dev_info->device_info.name;
1352 BT_INFO("Address[%s]", address);
1353 BT_INFO("Name[%s]", name);
1354 BT_INFO("COD[%d]", dev_info->device_info.cod);
1356 if (trigger_pairing_info) {
1357 /* BTAPI support only one pairing at a time */
1358 BT_ERR("Already Pairing address [%s]", trigger_pairing_info->addr);
1359 BT_ERR("New PIN request address [%s]", address);
1360 device_reject_pin_request(&dev_info->device_info.address);
1365 /* Set pairing data */
1366 trigger_pairing_info = g_malloc0(sizeof(bt_pairing_data_t));
1367 trigger_pairing_info->addr = g_strdup(address);
1368 trigger_pairing_info->is_ssp = TRUE;
1370 BT_DBG("Send BLUETOOTH_EVENT_PASSKEY_CONFIRMATION");
1371 snprintf(str_passkey, sizeof(str_passkey), "%.6d", dev_info->pass_key);
1373 /*Storing if bond is incoming or outgoing*/
1374 if(trigger_bond_info == NULL)
1377 param = g_variant_new("(bsss)", incoming, p_addr, name, str_passkey);
1378 _bt_send_event(BT_ADAPTER_EVENT,
1379 BLUETOOTH_EVENT_PASSKEY_CONFIRM_REQUEST, param);
1383 static void __bt_device_ssp_passkey_display_callback(event_dev_passkey_t *dev_info)
1386 gchar address[BT_ADDRESS_STR_LEN];
1389 char str_passkey[7];
1390 bool incoming = false;
1393 _bt_convert_addr_type_to_string(address, dev_info->device_info.address.addr);
1395 name = dev_info->device_info.name;
1397 BT_INFO("Address[%s]", address);
1398 BT_INFO("Name[%s]", name);
1399 BT_INFO("COD[%d]", dev_info->device_info.cod);
1401 if (trigger_pairing_info) {
1402 /* BTAPI support only one pairing at a time */
1403 BT_ERR("Already Pairing address [%s]", trigger_pairing_info->addr);
1404 BT_ERR("New PIN request address [%s]", address);
1405 device_reject_pin_request(&dev_info->device_info.address);
1410 /* Set pairing data */
1411 trigger_pairing_info = g_malloc0(sizeof(bt_pairing_data_t));
1412 trigger_pairing_info->addr = g_strdup(address);
1413 trigger_pairing_info->is_ssp = TRUE;
1415 BT_DBG("Send BLUETOOTH_EVENT_KEYBOARD_PASSKEY_DISPLAY");
1416 snprintf(str_passkey, sizeof(str_passkey), "%06d", dev_info->pass_key);
1418 if(trigger_bond_info == NULL)
1421 param = g_variant_new("(bsss)", incoming, p_addr, name, str_passkey);
1423 if (passkey_watcher) {
1424 BT_INFO("Send passkey to %s", passkey_watcher);
1425 _bt_send_event_to_dest(passkey_watcher, BT_ADAPTER_EVENT,
1426 BLUETOOTH_EVENT_PASSKEY_NOTIFICATION, param);
1428 _bt_send_event(BT_ADAPTER_EVENT,
1429 BLUETOOTH_EVENT_KEYBOARD_PASSKEY_DISPLAY, param);
1434 static void __bt_device_ssp_consent_callback(remote_device_t* dev_info)
1436 gchar address[BT_ADDRESS_STR_LEN];
1443 _bt_convert_addr_type_to_string(address, dev_info->address.addr);
1444 name = dev_info->name;
1445 cod = dev_info->cod;
1447 BT_INFO("Address[%s]", address);
1448 BT_INFO("Name[%s]", name);
1449 BT_INFO("COD[%d]", cod);
1451 if (trigger_pairing_info) {
1452 /* BTAPI support only one pairing at a time */
1453 BT_ERR("Already Pairing address [%s]", trigger_pairing_info->addr);
1454 BT_ERR("New PIN request address [%s]", address);
1455 device_reject_pin_request(&dev_info->address);
1460 /* Set pairing data */
1461 trigger_pairing_info = g_malloc0(sizeof(bt_pairing_data_t));
1462 trigger_pairing_info->addr = g_strdup(address);
1463 trigger_pairing_info->is_ssp = TRUE;
1465 local_major = ((cod >> 8) & 0x001f);
1466 local_minor = (cod & 0x00fc);
1467 BT_DBG("SSP_CONSENT: Major type=[0x%x] and Minor type=[0x%x]", local_major, local_minor);
1469 /*TODO: BLUETOOTH_EVENT_SSP_CONSENT_REQUEST to be handled in Tizen */
1473 static int __bt_oal_status_to_bt_error(int oal_status)
1477 switch (oal_status) {
1478 case OAL_STATUS_SUCCESS:
1479 ret = BLUETOOTH_ERROR_NONE;
1481 case OAL_STATUS_CONN_TIMEOUT:
1482 case OAL_STATUS_LINK_LOSS:
1483 BT_INFO("Connection Timeout");
1484 ret = BLUETOOTH_ERROR_CONNECTION_TIMEOUT;
1487 case OAL_STATUS_CONN_TERM_LOCAL_HOST:
1488 ret = BLUETOOTH_ERROR_LOCAL_HOST_TERM;
1490 case OAL_STATUS_CONN_TERM_RMT_HOST:
1491 ret = BLUETOOTH_ERROR_REMOTE_USER_TERM;
1494 case OAL_STATUS_INTERNAL_ERROR:
1495 ret = BLUETOOTH_ERROR_INTERNAL;
1498 ret = BLUETOOTH_ERROR_INTERNAL;
1504 static void __bt_device_acl_state_changed_callback(event_dev_conn_status_t *acl_event,
1505 gboolean connected, unsigned char type)
1507 gchar address[BT_ADDRESS_STR_LEN];
1508 int result = BLUETOOTH_ERROR_NONE;
1509 GVariant *param = NULL;
1510 bt_device_conn_info_t conn_info;
1513 _bt_convert_addr_type_to_string(address, acl_event->address.addr);
1515 _bt_logging_connection(connected, type);
1517 result = __bt_oal_status_to_bt_error(acl_event->status);
1518 BT_INFO("Result [0x%x]", result);
1521 param = g_variant_new("(isy)", result, address, type);
1522 _bt_send_event(BT_DEVICE_EVENT,
1523 BLUETOOTH_EVENT_DEVICE_CONNECTED,
1526 param = g_variant_new("(isyi)", result, address, type, dbfw_rssi);
1527 _bt_send_event(BT_DEVICE_EVENT,
1528 BLUETOOTH_EVENT_DEVICE_DISCONNECTED,
1531 BT_PERMANENT_LOG("%sonnected %s %s",
1532 connected ? "C" : "Disc", !type ? "EDR" : "LE", address + 12);
1534 conn_info.connected = connected;
1535 conn_info.type = type;
1536 /* Update local cache */
1537 _bt_update_remote_dev_property(address, DEV_PROP_CONNECTED, (void *)&conn_info);
1539 #ifdef TIZEN_GATT_CLIENT
1540 /*handle LE connected device info*/
1542 BT_DBG("handle LE connected device info");
1543 _bt_handle_le_connected_dev_info(address, connected);
1550 static void __bt_device_remote_device_found_callback(gpointer event_data, gboolean is_ble)
1552 bt_remote_dev_info_t *dev_info = NULL;
1553 int result = BLUETOOTH_ERROR_NONE;
1554 GVariant *param = NULL;
1555 GVariant *uuids = NULL;
1556 GVariant *manufacturer_data = NULL;
1557 GVariantBuilder *builder = NULL;
1561 ret_if(_bt_is_discovering() == FALSE);
1562 ret_if(event_data == NULL);
1564 dev_info = g_malloc0(sizeof(bt_remote_dev_info_t));
1567 event_ble_dev_found_t * oal_ble_dev = event_data;
1568 BT_INFO("Device type [%d]", oal_ble_dev->device_info.type);
1570 _bt_copy_remote_dev(dev_info, &oal_ble_dev->device_info);
1572 dev_info->manufacturer_data_len = oal_ble_dev->adv_len;
1573 if (dev_info->manufacturer_data_len)
1574 dev_info->manufacturer_data = g_memdup(oal_ble_dev->adv_data,
1575 dev_info->manufacturer_data_len);
1577 dev_info->manufacturer_data = NULL;
1578 BT_DBG("----Advertising Data Length: %d", dev_info->manufacturer_data_len);
1580 event_dev_found_t * oal_dev = event_data;
1581 _bt_copy_remote_dev(dev_info, &oal_dev->device_info);
1584 /* If Remote device name is NULL or still RNR is not done then display address as name. */
1585 if (dev_info->name == NULL)
1586 dev_info->name = g_strdup(dev_info->address);
1587 BT_DBG("Name %s", dev_info->name);
1589 builder = g_variant_builder_new(G_VARIANT_TYPE("as"));
1590 for (i = 0; i < dev_info->uuid_count; i++)
1591 g_variant_builder_add(builder, "s", dev_info->uuids[i]);
1593 uuids = g_variant_new("as", builder);
1594 g_variant_builder_unref(builder);
1596 manufacturer_data = g_variant_new_from_data(G_VARIANT_TYPE_BYTESTRING,
1597 dev_info->manufacturer_data,
1598 dev_info->manufacturer_data_len,
1602 param = g_variant_new("(isunsbub@asn@ay)", result,
1608 dev_info->connected,
1611 dev_info->manufacturer_data_len,
1614 _bt_send_event(BT_ADAPTER_EVENT,
1615 BLUETOOTH_EVENT_REMOTE_DEVICE_FOUND,
1618 _bt_free_remote_dev(dev_info);
1622 static void __bt_device_trusted_callback(gboolean trusted, event_dev_trust_t* info)
1624 gchar address[BT_ADDRESS_STR_LEN];
1625 int result = BLUETOOTH_ERROR_NONE;
1626 GVariant *param = NULL;
1630 _bt_convert_addr_type_to_string(address, info->address.addr);
1632 /* Update local cache */
1633 _bt_update_remote_dev_property(address, DEV_PROP_TRUST, (void *)&trusted);
1635 param = g_variant_new("(is)", result, address);
1636 event = trusted ? BLUETOOTH_EVENT_DEVICE_AUTHORIZED :
1637 BLUETOOTH_EVENT_DEVICE_UNAUTHORIZED;
1638 /* Send event to application */
1639 _bt_send_event(BT_DEVICE_EVENT,
1646 static void __bt_free_pairing_info(bt_pairing_data_t **p_info)
1649 bt_pairing_data_t * info = *p_info;
1660 static void __bt_free_bond_info(uint8_t type)
1665 case BT_DEVICE_BOND_INFO:
1666 if (!trigger_bond_info)
1669 if (trigger_bond_info->addr)
1670 g_free(trigger_bond_info->addr);
1671 if (trigger_bond_info->dev_addr)
1672 g_free(trigger_bond_info->dev_addr);
1673 if (trigger_bond_info->dev_info)
1674 _bt_free_remote_dev(trigger_bond_info->dev_info);
1675 g_free(trigger_bond_info);
1676 trigger_bond_info = NULL;
1678 case BT_DEVICE_INCOMING_BOND_INFO:
1679 if (!incoming_bond_info)
1682 if (incoming_bond_info->dev_info)
1683 _bt_free_remote_dev(incoming_bond_info->dev_info);
1684 g_free(incoming_bond_info);
1685 incoming_bond_info = NULL;
1687 case BT_DEVICE_UNBOND_INFO:
1688 if (!trigger_unbond_info)
1691 if (trigger_unbond_info->addr)
1692 g_free(trigger_unbond_info->addr);
1693 if (trigger_unbond_info->dev_addr)
1694 g_free(trigger_unbond_info->dev_addr);
1695 if (trigger_unbond_info->dev_info)
1696 _bt_free_remote_dev(trigger_unbond_info->dev_info);
1697 g_free(trigger_unbond_info);
1698 trigger_unbond_info = NULL;
1704 static void __bt_free_service_search_info(bt_service_search_info_data_t **p_info)
1706 bt_service_search_info_data_t * info = *p_info;
1713 if (info->dev_addr) {
1714 g_free(info->dev_addr);
1715 info->dev_addr = NULL;
1718 if (info->dev_info) {
1719 _bt_free_remote_dev(info->dev_info);
1720 info->dev_info = NULL;
1728 static int __bt_device_handle_bond_state(void)
1730 BT_INFO("Current Bond state: %d", bt_device_bond_state);
1731 int ret = OAL_STATUS_INTERNAL_ERROR;
1733 switch (bt_device_bond_state) {
1734 case BT_DEVICE_BOND_STATE_CANCEL_DISCOVERY:
1735 /*TODO:Bonding during discovery: Unhandled!!*/
1736 BT_INFO("Bonding during discovery: Unhandled!!");
1738 case BT_DEVICE_BOND_STATE_DISCOVERY_CANCELLED:
1739 /*TODO:Bonding during discovery: Unhandled!!*/
1740 BT_INFO("Bonding during discovery: Unhandled!!");
1742 case BT_DEVICE_BOND_STATE_REMOVE_BONDING:
1743 bt_device_bond_state = BT_DEVICE_BOND_STATE_REMOVED_BONDING;
1744 ret = device_destroy_bond((bt_address_t *)trigger_bond_info->dev_addr);
1745 if (ret != OAL_STATUS_SUCCESS)
1746 ret = __bt_device_handle_bond_state();
1748 case BT_DEVICE_BOND_STATE_REMOVED_BONDING:
1749 bt_device_bond_state = BT_DEVICE_BOND_STATE_NONE;
1750 ret = device_create_bond((bt_address_t *)trigger_bond_info->dev_addr, trigger_bond_info->conn_type);
1751 /* Bonding procedure was started but unfortunately could not complete.
1752 Basically removed bonding was success, but create bond request could not proceed
1753 So lets cleanup the context */
1754 if (ret != OAL_STATUS_SUCCESS) {
1755 BT_ERR("Create Bond procedure could not suceed");
1756 __bt_device_handle_pending_requests(BLUETOOTH_ERROR_INTERNAL, BT_BOND_DEVICE,
1757 trigger_bond_info->addr, BT_ADDRESS_STRING_SIZE);
1758 __bt_free_bond_info(BT_DEVICE_BOND_INFO);
1759 __bt_free_pairing_info(&trigger_pairing_info);
1762 case BT_DEVICE_BOND_STATE_NONE:
1763 BT_INFO("Create Bond failed!!");
1764 if (trigger_bond_info) {
1765 __bt_device_handle_pending_requests(BLUETOOTH_ERROR_INTERNAL, BT_BOND_DEVICE,
1766 trigger_bond_info->addr, BT_ADDRESS_STRING_SIZE);
1767 __bt_free_bond_info(BT_DEVICE_BOND_INFO);
1768 __bt_free_pairing_info(&trigger_pairing_info);
1775 if (ret != OAL_STATUS_SUCCESS)
1776 return BLUETOOTH_ERROR_INTERNAL;
1778 return BLUETOOTH_ERROR_NONE;
1781 int _bt_device_get_bonded_device_info(bluetooth_device_address_t *addr)
1784 bt_address_t bd_addr;
1788 retv_if(!addr, BLUETOOTH_ERROR_INVALID_PARAM);
1790 memcpy(bd_addr.addr, addr, BLUETOOTH_ADDRESS_LENGTH);
1791 result = device_query_attributes(&bd_addr);
1792 if (result != OAL_STATUS_SUCCESS) {
1793 BT_ERR("device_query_attributes error: [%d]", result);
1794 return BLUETOOTH_ERROR_INTERNAL;
1798 return BLUETOOTH_ERROR_NONE;
1801 int _bt_set_alias(bluetooth_device_address_t *device_address, const char *alias)
1804 char address[BT_ADDRESS_STRING_SIZE];
1807 BT_CHECK_PARAMETER(alias, return);
1809 ret = device_set_alias((bt_address_t *)device_address, (char *)alias);
1810 if (ret != OAL_STATUS_SUCCESS) {
1811 BT_ERR("device_set_alias: %d", ret);
1812 return BLUETOOTH_ERROR_INTERNAL;
1815 /* Update local cache */
1816 _bt_convert_addr_type_to_string(address, device_address->addr);
1817 _bt_update_remote_dev_property(address, DEV_PROP_ALIAS, (void *)alias);
1820 return BLUETOOTH_ERROR_NONE;
1823 int _bt_bond_device(bluetooth_device_address_t *device_address,
1824 unsigned short conn_type, GArray **out_param1)
1826 int result = BLUETOOTH_ERROR_NONE;
1827 char address[BT_ADDRESS_STRING_SIZE] = { 0 };
1828 bluetooth_device_info_t dev_info;
1831 retv_if(device_address == NULL, BLUETOOTH_ERROR_INVALID_PARAM);
1833 /* If bonding or discovery already going on */
1834 if (trigger_bond_info || _bt_is_discovering()) {
1835 BT_ERR("Device is buzy, bonding can not proceed now..");
1836 result = BLUETOOTH_ERROR_DEVICE_BUSY;
1840 /*TODO: If unbonding with same device going on */
1841 _bt_convert_addr_type_to_string(address, device_address->addr);
1843 trigger_bond_info = g_malloc0(sizeof(bt_bond_data_t));
1844 trigger_bond_info->addr = g_strdup(address);
1845 trigger_bond_info->conn_type = conn_type;
1846 trigger_bond_info->is_device_creating = TRUE;
1847 trigger_bond_info->dev_addr = g_memdup(device_address, sizeof(bluetooth_device_address_t));
1848 trigger_bond_info->dev_info = NULL;
1850 /* Ready to initiate bonding */
1852 /* In Tizen, we will first remove bond and then attempt to create bond to keep
1853 consistency with bluedroid. Even if remove bond fails due to device not already
1854 bonded, then straight away create bond is triggered. This is because, remove bond
1855 is handled differently in bluedroid and bluez. In Bluez, if device is
1856 already removed, remove bond call fails.
1857 However in bluedroid, remove bond on already removed device returns success. So we will
1858 handle the cases transparently*/
1859 bt_device_bond_state = BT_DEVICE_BOND_STATE_REMOVE_BONDING;
1860 bond_retry_count = 0;
1861 result = __bt_device_handle_bond_state();
1863 if (result != BLUETOOTH_ERROR_NONE)
1870 memset(&dev_info, 0x00, sizeof(bluetooth_device_info_t));
1871 memcpy(dev_info.device_address.addr, device_address->addr,
1872 BLUETOOTH_ADDRESS_LENGTH);
1874 g_array_append_vals(*out_param1, &dev_info,
1875 sizeof(bluetooth_device_info_t));
1876 __bt_free_bond_info(BT_DEVICE_BOND_INFO);
1882 int _bt_unbond_device(bluetooth_device_address_t *device_address,
1883 GArray **out_param1)
1885 int result = OAL_STATUS_SUCCESS;
1886 char address[BT_ADDRESS_STRING_SIZE] = { 0 };
1887 bluetooth_device_info_t dev_info;
1890 retv_if(device_address == NULL, BLUETOOTH_ERROR_INVALID_PARAM);
1892 _bt_convert_addr_type_to_string(address, device_address->addr);
1894 trigger_unbond_info = g_malloc0(sizeof(bt_bond_data_t));
1895 trigger_unbond_info->addr = g_malloc0(BT_ADDRESS_STRING_SIZE);
1896 trigger_unbond_info->addr = g_strdup(address);
1897 trigger_unbond_info->dev_addr = g_memdup(device_address, sizeof(bluetooth_device_address_t));
1899 /* Check if Bonding is already going on, we should not abruptly remove bonding*/
1900 if (trigger_bond_info && strncmp(trigger_bond_info->addr, trigger_unbond_info->addr, BT_ADDRESS_STRING_SIZE) == 0) {
1901 BT_ERR("Bonding with same device already ongoing");
1902 result = BLUETOOTH_ERROR_PERMISSION_DEINED;
1906 result = device_destroy_bond((bt_address_t *)device_address);
1907 if (result != OAL_STATUS_SUCCESS)
1913 memset(&dev_info, 0x00, sizeof(bluetooth_device_info_t));
1914 _bt_convert_addr_string_to_type(dev_info.device_address.addr,
1915 trigger_unbond_info->addr);
1917 g_array_append_vals(*out_param1, &dev_info,
1918 sizeof(bluetooth_device_info_t));
1919 __bt_free_bond_info(BT_DEVICE_UNBOND_INFO);
1924 int _bt_cancel_bonding(void)
1926 int result = OAL_STATUS_SUCCESS;
1929 retv_if(trigger_bond_info == NULL, BLUETOOTH_ERROR_NOT_IN_OPERATION);
1931 result = device_stop_bond((bt_address_t *)trigger_bond_info->dev_addr);
1933 if (result == OAL_STATUS_SUCCESS)
1934 trigger_bond_info->is_cancelled_by_user = TRUE;
1939 int _bt_passkey_reply(const char *passkey, gboolean cnfm_reply)
1941 bluetooth_device_address_t device_address;
1942 int ret = OAL_STATUS_SUCCESS;
1943 BT_INFO("reply: %d", cnfm_reply);
1945 retv_if(trigger_pairing_info == NULL, BLUETOOTH_ERROR_INTERNAL);
1946 retv_if(trigger_pairing_info->addr == NULL, BLUETOOTH_ERROR_INTERNAL);
1948 _bt_convert_addr_string_to_type(device_address.addr, trigger_pairing_info->addr);
1950 if (trigger_pairing_info->is_ssp) {
1952 ret = device_accept_passkey_entry((bt_address_t *)&device_address, atoi(passkey));
1954 ret = device_reject_passkey_entry((bt_address_t *)&device_address);
1955 trigger_pairing_info->is_ssp = FALSE;
1958 ret = device_accept_pin_request((bt_address_t *)&device_address, passkey);
1960 ret = device_reject_pin_request((bt_address_t *)&device_address);
1963 __bt_free_pairing_info(&trigger_pairing_info);
1965 if (ret != OAL_STATUS_SUCCESS) {
1966 BT_ERR("_bt_device_handle_passkey_reply: err [%d]", ret);
1967 return BLUETOOTH_ERROR_INTERNAL;
1971 return BLUETOOTH_ERROR_NONE;
1974 int _bt_passkey_confirmation_reply(gboolean cnfm_reply)
1976 BT_INFO("BT_PASSKEY_CONFIRMATION_REPLY");
1977 bluetooth_device_address_t device_address;
1978 int ret = OAL_STATUS_SUCCESS;
1979 BT_INFO("reply: %d", cnfm_reply);
1981 retv_if(trigger_pairing_info == NULL, BLUETOOTH_ERROR_INTERNAL);
1982 retv_if(trigger_pairing_info->addr == NULL, BLUETOOTH_ERROR_INTERNAL);
1984 _bt_convert_addr_string_to_type(device_address.addr, trigger_pairing_info->addr);
1986 ret = device_reply_passkey_confirmation((bt_address_t *)&device_address, cnfm_reply);
1988 __bt_free_pairing_info(&trigger_pairing_info);
1989 if (ret != OAL_STATUS_SUCCESS) {
1990 BT_ERR("_bt_device_handle_passkey_confirmation_reply: err [%d]", ret);
1991 return BLUETOOTH_ERROR_INTERNAL;
1995 return BLUETOOTH_ERROR_NONE;
1998 gboolean _bt_device_is_pairing(void)
2000 return (trigger_pairing_info) ? TRUE : FALSE;
2003 gboolean _bt_device_is_bonding(void)
2005 return (trigger_bond_info) ? TRUE : FALSE;
2008 gboolean _bt_is_bonding_device_address(const char *address)
2010 if (trigger_bond_info == NULL || trigger_bond_info->addr == NULL)
2013 if (g_strcmp0(trigger_bond_info->addr, address) == 0) {
2014 BT_DBG("[%s] is bonding device", address);
2018 BT_DBG("[%s] is NOT bonding device", address);
2022 void _bt_set_autopair_status_in_bonding_info(gboolean is_autopair)
2024 ret_if(trigger_bond_info == NULL);
2025 trigger_bond_info->is_autopair = is_autopair;
2028 int _bt_search_device(bluetooth_device_address_t *device_address)
2030 int result = OAL_STATUS_SUCCESS;
2033 BT_CHECK_PARAMETER(device_address, return);
2035 if (trigger_bond_info) {
2036 BT_ERR("Bonding in progress");
2037 return BLUETOOTH_ERROR_DEVICE_BUSY;
2040 if (service_search_info) {
2041 BT_ERR("Service searching in progress");
2042 return BLUETOOTH_ERROR_DEVICE_BUSY;
2045 /* allocate user data so that it can be retrieved in callback */
2046 service_search_info = g_malloc0(sizeof(bt_service_search_info_data_t));
2047 service_search_info->addr = g_malloc0(BT_ADDRESS_STRING_SIZE);
2048 service_search_info->dev_addr = g_memdup(device_address, sizeof(bluetooth_device_address_t));
2050 _bt_convert_addr_type_to_string(service_search_info->addr,
2051 device_address->addr);
2053 result = device_query_services((bt_address_t *)device_address);
2055 if (result != OAL_STATUS_SUCCESS) {
2056 BT_ERR("Device Service Search Failed..: %d", result);
2057 __bt_free_service_search_info(&service_search_info);
2058 return BLUETOOTH_ERROR_INTERNAL;
2060 return BLUETOOTH_ERROR_NONE;
2063 int _bt_cancel_search_device(void)
2065 int ret = OAL_STATUS_SUCCESS;
2066 retv_if(service_search_info == NULL, BLUETOOTH_ERROR_NOT_IN_OPERATION);
2068 ret = device_stop_query_sevices((bt_address_t *)service_search_info->dev_addr);
2070 if (ret != OAL_STATUS_SUCCESS) {
2071 BT_ERR("SDP Cancel request failed [%d]", ret);
2072 return BLUETOOTH_ERROR_INTERNAL;
2075 __bt_device_handle_pending_requests(BLUETOOTH_ERROR_CANCEL_BY_USER, BT_SEARCH_SERVICE,
2076 service_search_info->addr, BT_ADDRESS_STRING_SIZE);
2078 __bt_free_service_search_info(&service_search_info);
2080 return BLUETOOTH_ERROR_NONE;
2084 int _bt_set_authorization(bluetooth_device_address_t *device_address,
2087 int ret = OAL_STATUS_SUCCESS;
2090 BT_CHECK_PARAMETER(device_address, return);
2091 BT_INFO("Device to be Trusted? [%d]", authorize);
2093 ret = device_set_authorized((bt_address_t*)device_address, authorize);
2094 if (ret != OAL_STATUS_SUCCESS) {
2095 BT_ERR("device_set_authorized: %d", ret);
2096 return BLUETOOTH_ERROR_INTERNAL;
2099 return BLUETOOTH_ERROR_NONE;
2102 gboolean _bt_is_device_connected(bluetooth_device_address_t *device_address, int svc_type)
2104 gboolean is_connected;
2105 oal_service_t svc_id;
2107 retv_if(device_address == NULL, BLUETOOTH_ERROR_INVALID_PARAM);
2110 * TODO: While adding support for new profiles, need to add more
2111 * <svc_type, svc_id> mapping here.
2114 case BT_PROFILE_CONN_HID:
2115 svc_id = HID_SERVICE_ID;
2117 case BT_PROFILE_CONN_A2DP:
2118 svc_id = A2DP_SERVICE_ID; /* Remote is A2DP Sink */
2120 case BT_PROFILE_CONN_A2DP_SINK:
2121 svc_id = A2DP_SRC_SERVICE_ID; /* Remote is A2DP Source*/
2123 case BT_PROFILE_CONN_HSP:
2124 svc_id = HFP_HS_SERVICE_ID; /* Remote is HFP HF Unit */
2126 #ifdef TIZEN_GATT_CLIENT
2127 case BT_PROFILE_CONN_GATT:
2128 return _bt_is_remote_gatt_device_connected(device_address); /* Remote is GATT client or Server */
2131 BT_DBG("Unknown svc_type: %d", svc_type);
2135 is_connected = device_get_svc_conn_state((bt_address_t*)device_address, svc_id);
2137 BT_DBG("svc_type: %d, is_connected: %s",
2138 svc_type, is_connected ? "TRUE" : "FALSE");
2140 return is_connected;
2143 int _bt_rfcomm_reply_conn_authorization(char *address, gboolean reply)
2145 bt_address_t bd_addr;
2150 retv_if(NULL == address, BLUETOOTH_ERROR_INVALID_PARAM);
2151 _bt_convert_addr_string_to_type(bd_addr.addr, address);
2152 res = device_reply_auth_request(&bd_addr, 0, reply, FALSE);
2153 if (res != OAL_STATUS_SUCCESS) {
2154 BT_ERR("authorize_response: %d", res);
2155 return BLUETOOTH_ERROR_INTERNAL;
2159 return BLUETOOTH_ERROR_NONE;
2162 int _bt_enable_rssi(bluetooth_device_address_t *addr, int link_type,
2163 int low_threshold, int in_range_threshold, int high_threshold)
2166 bt_address_t bd_addr;
2170 retv_if(!addr, BLUETOOTH_ERROR_INVALID_PARAM);
2172 memcpy(bd_addr.addr, addr, BLUETOOTH_ADDRESS_LENGTH);
2173 result = device_enable_rssi_monitoring(&bd_addr, link_type,
2174 low_threshold, in_range_threshold, high_threshold);
2175 if (result != OAL_STATUS_SUCCESS) {
2176 BT_ERR("device_get_connected_link_rssi_strength error: [%d]", result);
2177 return BLUETOOTH_ERROR_INTERNAL;
2181 return BLUETOOTH_ERROR_NONE;
2184 int _bt_get_rssi_strength(bluetooth_device_address_t *addr, int link_type)
2187 bt_address_t bd_addr;
2191 retv_if(!addr, BLUETOOTH_ERROR_INVALID_PARAM);
2193 memcpy(bd_addr.addr, addr, BLUETOOTH_ADDRESS_LENGTH);
2194 result = device_get_connected_link_rssi_strength(&bd_addr, link_type);
2195 if (result != OAL_STATUS_SUCCESS) {
2196 BT_ERR("device_get_connected_link_rssi_strength error: [%d]", result);
2197 return BLUETOOTH_ERROR_INTERNAL;
2201 return BLUETOOTH_ERROR_NONE;
2204 int _bt_set_passkey_notification(const char *sender, gboolean enable)
2208 BT_INFO("Set passkey notification(sender:%s, %s)",
2209 sender, enable ? "Enable" : "Disable");
2211 result = device_enable_gap_auth_notifications(OAL_PASSKEY_DISPLAY, enable);
2212 if (OAL_STATUS_SUCCESS != result) {
2213 BT_ERR("device_enable_gap_auth_notifications error: [%d]", result);
2214 return BLUETOOTH_ERROR_INTERNAL;
2217 g_free(passkey_watcher);
2219 passkey_watcher = g_strdup(sender);
2221 passkey_watcher = NULL;
2223 return BLUETOOTH_ERROR_NONE;
2226 static int __bt_get_device_pin_code(const char *address, char *pin_code)
2230 BT_CHECK_PARAMETER(address, return);
2231 BT_CHECK_PARAMETER(pin_code, return);
2233 for (l = pin_info_list; l != NULL; l = l->next) {
2234 bt_pin_code_info_t *pin_info = l->data;
2236 if (!pin_info || !pin_info->address)
2239 if (g_strcmp0(pin_info->address, address) == 0) {
2240 g_strlcpy(pin_code, pin_info->pin_code,
2241 BLUETOOTH_PIN_CODE_MAX_LENGTH + 1);
2242 return BLUETOOTH_ERROR_NONE;
2246 return BLUETOOTH_ERROR_NOT_FOUND;
2249 int _bt_set_pin_code(bluetooth_device_address_t *device_address,
2250 bluetooth_device_pin_code_t *pin_code)
2252 char address[BT_ADDRESS_STRING_SIZE] = { 0 };
2253 bt_pin_code_info_t *pin_info = NULL;
2256 BT_CHECK_PARAMETER(device_address, return);
2257 BT_CHECK_PARAMETER(pin_code, return);
2258 retv_if(g_slist_length(pin_info_list) >= BT_DEVICE_PIN_CODE_SLOT_MAX,
2259 BLUETOOTH_ERROR_NO_RESOURCES);
2261 _bt_convert_addr_type_to_string(address, device_address->addr);
2263 for (l = pin_info_list; l != NULL; l = l->next) {
2266 if (!pin_info || !pin_info->address)
2269 if (g_strcmp0(pin_info->address, address) == 0) {
2270 g_free(pin_info->pin_code);
2271 pin_info->pin_code = g_strdup(pin_code->pin_code);
2272 return BLUETOOTH_ERROR_NONE;
2276 pin_info = g_malloc0(sizeof(bt_pin_code_info_t));
2277 pin_info->address = g_strdup(address);
2278 pin_info->pin_code = g_strdup(pin_code->pin_code);
2279 pin_info_list = g_slist_append(pin_info_list, pin_info);
2281 return BLUETOOTH_ERROR_NONE;
2284 int _bt_unset_pin_code(bluetooth_device_address_t *device_address)
2286 char address[BT_ADDRESS_STRING_SIZE] = { 0 };
2287 bt_pin_code_info_t *pin_info = NULL;
2292 BT_CHECK_PARAMETER(device_address, return);
2294 _bt_convert_addr_type_to_string(address, device_address->addr);
2296 for (l = pin_info_list; l != NULL; l = l->next) {
2299 if (!pin_info || !pin_info->address)
2302 if (g_strcmp0(pin_info->address, address) == 0) {
2303 pin_info_list = g_slist_remove(pin_info_list, pin_info);
2304 g_free(pin_info->address);
2305 g_free(pin_info->pin_code);
2312 return BLUETOOTH_ERROR_NONE;
2315 #ifdef TIZEN_GATT_CLIENT
2316 static bt_connected_le_dev_t *__bt_get_le_connected_dev_info(const char *address)
2319 bt_connected_le_dev_t *dev;
2324 for (l = le_connected_dev_list; l; l = g_slist_next(l)) {
2327 if (g_strcmp0(dev->address, address) == 0)
2333 static void __bt_le_conn_param_free(void *data)
2335 bt_le_conn_param_t *param = (bt_le_conn_param_t *)data;
2337 BT_DBG("%s", param->sender);
2338 g_free(param->sender);
2342 static void _bt_add_le_connected_dev_info(const char *address)
2344 bt_connected_le_dev_t *dev = NULL;
2349 dev = g_malloc0(sizeof(bt_connected_le_dev_t));
2350 dev->address = g_strdup(address);
2352 le_connected_dev_list = g_slist_append(le_connected_dev_list, dev);
2357 static void _bt_remove_le_connected_dev_info(const char *address)
2359 bt_connected_le_dev_t *dev = NULL;
2364 dev = __bt_get_le_connected_dev_info(address);
2368 g_slist_free_full(dev->senders, __bt_le_conn_param_free);
2369 le_connected_dev_list = g_slist_remove(le_connected_dev_list, dev);
2370 g_free(dev->address);
2377 static void _bt_handle_le_connected_dev_info(const char *address, gboolean connected)
2382 _bt_add_le_connected_dev_info(address);
2384 _bt_remove_le_connected_dev_info(address);
2387 static bt_le_conn_param_t *__bt_get_le_conn_param_info(bt_connected_le_dev_t *dev, const char *sender)
2390 bt_le_conn_param_t *param = NULL;
2392 if (!dev || !sender)
2395 for (l = dev->senders; l; l = g_slist_next(l)) {
2397 if (g_strcmp0(param->sender, sender) == 0)
2404 static gint __bt_compare_le_conn_param_key(gpointer *a, gpointer *b)
2406 bt_le_conn_param_t *parama = (bt_le_conn_param_t *)a;
2407 bt_le_conn_param_t *paramb = (bt_le_conn_param_t *)b;
2409 return parama->key > paramb->key;
2413 int _bt_add_le_conn_param_info(const char *address, const char *sender,
2414 float interval_min, float interval_max, guint16 latency, guint16 time_out)
2416 bt_connected_le_dev_t *dev = NULL;
2417 bt_le_conn_param_t *param = NULL;
2418 bt_le_conn_param_t *data = NULL;
2422 if (!address || !sender)
2423 return BLUETOOTH_ERROR_INVALID_PARAM;
2425 dev = __bt_get_le_connected_dev_info(address);
2427 return BLUETOOTH_ERROR_INTERNAL;
2429 param = __bt_get_le_conn_param_info(dev, sender);
2431 data = g_malloc0(sizeof(bt_le_conn_param_t));
2432 data->sender = g_strdup(sender);
2433 data->interval_min = interval_min;
2434 data->interval_max = interval_max;
2435 data->latency = latency;
2436 data->time_out = time_out;
2437 data->key = interval_min + (interval_max - interval_min)/2;
2439 if (param == NULL) {
2440 BT_DBG("Add param %s %s %f %f", address, sender, interval_min, interval_max);
2441 dev->senders = g_slist_append(dev->senders, data);
2443 BT_DBG("Update param %s %s %f %f", address, sender, interval_min, interval_max);
2444 dev->senders = g_slist_remove(dev->senders, param);
2445 g_free(param->sender);
2447 dev->senders = g_slist_append(dev->senders, data);
2450 /* Sorting. First element have the minimum interval */
2451 dev->senders = g_slist_sort(dev->senders,
2452 (GCompareFunc)__bt_compare_le_conn_param_key);
2454 return BLUETOOTH_ERROR_NONE;
2458 static int __bt_le_set_conn_parameter(const char *address,
2459 float interval_min, float interval_max,
2460 guint16 latency, guint16 time_out)
2462 bt_address_t dev_addr = { {0} };
2463 guint32 min, max, to;
2465 BT_INFO("Min interval: %f, Max interval: %f, Latency: %u, Supervision timeout: %u",
2466 interval_min, interval_max, latency, time_out);
2468 min = interval_min / BT_LE_CONN_INTERVAL_SPLIT;
2469 max = interval_max / BT_LE_CONN_INTERVAL_SPLIT;
2470 to = time_out / BT_LE_CONN_TO_SPLIT;
2472 BT_INFO("updating: Min interval: %d, Max interval: %d, Latency: %d, Supervision timeout: %d",
2473 min, max, latency, to);
2475 _bt_convert_addr_string_to_type(dev_addr.addr, address);
2477 return gattc_conn_param_update(&dev_addr, min, max, latency, to);
2480 int _bt_remove_le_conn_param_info(const char *address, const char *sender)
2482 bt_connected_le_dev_t *dev = NULL;
2483 bt_le_conn_param_t *param = NULL;
2485 if (!address || !sender)
2486 return BLUETOOTH_ERROR_INVALID_PARAM;
2488 dev = __bt_get_le_connected_dev_info(address);
2490 return BLUETOOTH_ERROR_INTERNAL;
2492 param = __bt_get_le_conn_param_info(dev, sender);
2494 BT_DBG("Remove param %s %s ", address, sender);
2495 dev->senders = g_slist_remove(dev->senders, param);
2496 g_free(param->sender);
2500 return BLUETOOTH_ERROR_NONE;
2503 int _bt_get_le_connection_parameter(bluetooth_le_connection_mode_t mode,
2504 bluetooth_le_connection_param_t *param)
2507 return BLUETOOTH_ERROR_INVALID_PARAM;
2509 memset(param, 0x00, sizeof(bluetooth_le_connection_param_t));
2512 case BLUETOOTH_LE_CONNECTION_MODE_BALANCED:
2513 param->interval_min = BT_LE_CONN_PARAM_BALANCED_MIN_INTERVAL;
2514 param->interval_max = BT_LE_CONN_PARAM_BALANCED_MAX_INTERVAL;
2515 param->latency = BT_LE_CONN_PARAM_BALANCED_SLAVE_LATENCY;
2516 param->timeout = BT_LE_CONN_PARAM_DEFAULT_SUPERVISION_TIMEOUT;
2519 case BLUETOOTH_LE_CONNECTION_MODE_LOW_LATENCY:
2520 param->interval_min = BT_LE_CONN_PARAM_LOW_LATENCY_MIN_INTERVAL;
2521 param->interval_max = BT_LE_CONN_PARAM_LOW_LATENCY_MAX_INTERVAL;
2522 param->latency = BT_LE_CONN_PARAM_LOW_LATENCY_SLAVE_LATENCY;
2523 param->timeout = BT_LE_CONN_PARAM_DEFAULT_SUPERVISION_TIMEOUT;
2526 case BLUETOOTH_LE_CONNECTION_MODE_LOW_POWER:
2527 param->interval_min = BT_LE_CONN_PARAM_LOW_POWER_MIN_INTERVAL;
2528 param->interval_max = BT_LE_CONN_PARAM_LOW_POWER_MAX_INTERVAL;
2529 param->latency = BT_LE_CONN_PARAM_LOW_POWER_SLAVE_LATENCY;
2530 param->timeout = BT_LE_CONN_PARAM_DEFAULT_SUPERVISION_TIMEOUT;
2534 BT_ERR("Unhandled mode : %d", mode);
2538 return BLUETOOTH_ERROR_NONE;
2541 int _bt_le_connection_update(const char *sender,
2542 unsigned char *device_address,
2543 float interval_min, float interval_max,
2544 guint16 latency, guint16 time_out)
2546 char address[BT_ADDRESS_STRING_SIZE] = { 0 };
2547 guint32 min_supervision_to;
2548 bt_connected_le_dev_t *dev = NULL;
2549 bt_le_conn_param_t *param = NULL;
2550 int ret = BLUETOOTH_ERROR_NONE;
2552 BT_CHECK_PARAMETER(device_address, return);
2554 BT_INFO("Sender %s, Min interval: %f, Max interval: %f, Latency: %u, Supervision timeout: %u",
2555 sender, interval_min, interval_max, latency, time_out);
2557 if (interval_min > interval_max ||
2558 interval_min < BT_LE_CONN_INTERVAL_MIN ||
2559 interval_max > BT_LE_CONN_INTERVAL_MAX) {
2560 ret = BLUETOOTH_ERROR_INVALID_PARAM;
2564 if (time_out < BT_LE_CONN_SUPER_TO_MIN ||
2565 time_out > BT_LE_CONN_SUPER_TO_MAX) {
2566 ret = BLUETOOTH_ERROR_INVALID_PARAM;
2570 if (latency > BT_LE_CONN_SLAVE_LATENCY_MAX) {
2571 ret = BLUETOOTH_ERROR_INVALID_PARAM;
2576 * The Supervision_Timeout in milliseconds shall be larger than
2577 * (1 + Conn_Latency) * Conn_Interval_Max * 2,
2578 * where Conn_Interval_Max is given in milliseconds.
2581 min_supervision_to = (1 + latency) * interval_max * 2;
2582 if (time_out <= min_supervision_to) {
2583 ret = BLUETOOTH_ERROR_INVALID_PARAM;
2587 _bt_convert_addr_type_to_string(address, device_address);
2588 BT_DBG("Remote device address: %s", address);
2590 _bt_add_le_conn_param_info(address, sender, interval_min, interval_max, 0, 2000);
2592 dev = __bt_get_le_connected_dev_info(address);
2594 BT_DBG("device not found in the list");
2595 ret = BLUETOOTH_ERROR_NOT_CONNECTED;
2599 if (g_slist_length(dev->senders) == 1)
2602 param = dev->senders->data;
2604 BT_DBG("dev %f, param %f, input %f", dev->interval_min, param->interval_min, interval_min);
2606 if (dev->interval_min == param->interval_min && dev->interval_max == param->interval_max) {
2607 BT_DBG("Skip due to same interval");
2611 interval_min = param->interval_min;
2612 interval_max = param->interval_max;
2616 ret = __bt_le_set_conn_parameter(address, interval_min, interval_max, latency, time_out);
2618 if (ret != OAL_STATUS_SUCCESS) {
2619 _bt_remove_le_conn_param_info(address, sender);
2620 BT_DBG("fail to update the LE connection parameter");
2621 ret = BLUETOOTH_ERROR_INTERNAL;
2625 BT_DBG("updated LE connection parameter");
2626 dev->interval_min = interval_min;
2627 dev->interval_max = interval_max;
2629 return BLUETOOTH_ERROR_NONE;
2634 int _bt_disconnect_device(bluetooth_device_address_t *device_address)
2636 int result = OAL_STATUS_SUCCESS;
2640 retv_if(!device_address, BLUETOOTH_ERROR_INVALID_PARAM);
2642 result = device_disconnect((bt_address_t *)device_address);
2643 if (result != OAL_STATUS_SUCCESS) {
2644 BT_DBG("Failed to disconnect device");
2645 return BLUETOOTH_ERROR_INTERNAL;
2649 return BLUETOOTH_ERROR_NONE;