3 * BlueZ - Bluetooth protocol stack for Linux
5 * Copyright (C) 2006-2010 Nokia Corporation
6 * Copyright (C) 2004-2010 Marcel Holtmann <marcel@holtmann.org>
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 2 of the License, or
12 * (at your option) any later version.
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
19 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, write to the Free Software
21 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
35 #include <sys/ioctl.h>
41 #include <dbus/dbus.h>
43 #include "bluetooth/bluetooth.h"
44 #include "bluetooth/hci.h"
45 #include "bluetooth/hci_lib.h"
46 #include "bluetooth/sdp.h"
47 #include "bluetooth/sdp_lib.h"
51 #include "gdbus/gdbus.h"
56 #include "src/shared/mgmt.h"
57 #include "src/shared/util.h"
58 #include "src/shared/queue.h"
59 #include "src/shared/att.h"
60 #include "src/shared/gatt-db.h"
67 #include "dbus-common.h"
69 #include "uuid-helper.h"
72 #include "attrib/gattrib.h"
73 #include "attrib/att.h"
74 #include "attrib/gatt.h"
75 #include "attrib-server.h"
76 #include "gatt-database.h"
77 #include "advertising.h"
80 #ifdef __TIZEN_PATCH__
81 #include "adapter_le_vsc_features.h"
84 #define ADAPTER_INTERFACE "org.bluez.Adapter1"
86 #ifdef __TIZEN_PATCH__
88 #define DEVICED_DEST "org.tizen.system.deviced"
89 #define DEVICED_BATT_INTERFACE "org.tizen.system.deviced.Battery"
90 #define DEVICED_BATT_OBJECT_PATH "/Org/Tizen/System/DeviceD/Battery"
91 #endif /* TIZEN_WEARABLE */
95 #define MODE_CONNECTABLE 0x01
96 #define MODE_DISCOVERABLE 0x02
97 #define MODE_UNKNOWN 0xff
99 #define CONN_SCAN_TIMEOUT (3)
100 #define IDLE_DISCOV_TIMEOUT (5)
101 #define TEMP_DEV_TIMEOUT (3 * 60)
102 #define BONDING_TIMEOUT (2 * 60)
104 #define SCAN_TYPE_BREDR (1 << BDADDR_BREDR)
105 #define SCAN_TYPE_LE ((1 << BDADDR_LE_PUBLIC) | (1 << BDADDR_LE_RANDOM))
106 #define SCAN_TYPE_DUAL (SCAN_TYPE_BREDR | SCAN_TYPE_LE)
108 #define HCI_RSSI_INVALID 127
109 #define DISTANCE_VAL_INVALID 0x7FFF
110 #define PATHLOSS_MAX 137
112 #ifdef __TIZEN_PATCH__
113 #define check_address(address) bachk(address)
114 #define ADV_DATA_MAX_LENGTH 31
115 #define SCAN_RESPONSE_DATA_LENGTH_MAX 31
116 #define MANUFACTURER_DATA_LENGTH_MAX 28
117 #define PRIVATE_ADDR_TIMEOUT (15 * 60)
119 #define BT_DISC_TYPE_BREDR 1
120 #define BT_DISC_TYPE_LE 2
121 #define IDLE_LE_DISCOV_TIMEOUT (3)
123 #define DISCOV_TYPE_BREDR 1
124 #define DISCOV_TYPE_LE 6
126 #endif /* __TIZEN_PATCH__ */
129 static DBusConnection *dbus_conn = NULL;
131 static bool kernel_conn_control = false;
133 static GList *adapter_list = NULL;
134 static unsigned int adapter_remaining = 0;
135 static bool powering_down = false;
137 static GSList *adapters = NULL;
139 static struct mgmt *mgmt_master = NULL;
141 static uint8_t mgmt_version = 0;
142 static uint8_t mgmt_revision = 0;
144 static GSList *adapter_drivers = NULL;
146 static GSList *disconnect_list = NULL;
147 static GSList *conn_fail_list = NULL;
149 struct link_key_info {
151 unsigned char key[16];
156 struct smp_ltk_info {
159 uint8_t authenticated;
176 uint16_t min_interval;
177 uint16_t max_interval;
182 struct discovery_filter {
189 struct watch_client {
190 struct btd_adapter *adapter;
193 struct discovery_filter *discovery_filter;
196 struct service_auth {
202 struct btd_device *device;
203 struct btd_adapter *adapter;
204 struct agent *agent; /* NULL for queued auths */
207 struct btd_adapter_pin_cb_iter {
208 GSList *it; /* current callback function */
209 unsigned int attempt; /* numer of times it() was called */
210 /* When the iterator reaches the end, it is NULL and attempt is 0 */
213 #ifdef __TIZEN_PATCH__
215 int slot_id; /* Reservied slot id is 0 (Single adv) */
216 bool status; /* Advertising status */
219 static GSList *read_requests = NULL;
221 struct le_data_length_read_request {
222 struct btd_adapter *adapter;
233 bdaddr_t bdaddr; /* controller Bluetooth address */
234 #ifdef __TIZEN_PATCH__
235 bdaddr_t le_static_addr;
236 bdaddr_t rpaddr; /* controller RPA */
238 uint32_t dev_class; /* controller class of device */
239 char *name; /* controller device name */
240 char *short_name; /* controller short name */
241 uint32_t supported_settings; /* controller supported settings */
242 uint32_t current_settings; /* current controller settings */
244 char *path; /* adapter object path */
245 uint8_t major_class; /* configured major class */
246 uint8_t minor_class; /* configured minor class */
247 char *system_name; /* configured system name */
248 char *modalias; /* device id (modalias) */
249 bool stored_discoverable; /* stored discoverable mode */
250 uint32_t discoverable_timeout; /* discoverable time(sec) */
251 uint32_t pairable_timeout; /* pairable time(sec) */
253 char *current_alias; /* current adapter name alias */
254 char *stored_alias; /* stored adapter name alias */
255 #ifdef __TIZEN_PATCH__
256 bool le_privacy_enabled; /* whether LE Privacy feature enabled */
257 char local_irk[MGMT_IRK_SIZE]; /* adapter local IRK */
259 bool ipsp_intialized; /* Ipsp Initialization state */
260 struct le_data_length_read_handler *read_handler;
261 struct le_data_length_read_default_data_length_handler *def_read_handler;
262 #ifdef TIZEN_WEARABLE
263 guint charging_watch;
264 guint charging_timeout;
265 charging_state_e charging;
266 #endif /* TIZEN_WEARABLE */
269 bool discovering; /* discovering property state */
270 bool filtered_discovery; /* we are doing filtered discovery */
271 bool no_scan_restart_delay; /* when this flag is set, restart scan
273 uint8_t discovery_type; /* current active discovery type */
274 uint8_t discovery_enable; /* discovery enabled/disabled */
275 bool discovery_suspended; /* discovery has been suspended */
276 GSList *discovery_list; /* list of discovery clients */
277 GSList *set_filter_list; /* list of clients that specified
278 * filter, but don't scan yet
280 /* current discovery filter, if any */
281 struct mgmt_cp_start_service_discovery *current_discovery_filter;
283 GSList *discovery_found; /* list of found devices */
284 guint discovery_idle_timeout; /* timeout between discovery runs */
285 guint passive_scan_timeout; /* timeout between passive scans */
286 guint temp_devices_timeout; /* timeout for temporary devices */
288 guint pairable_timeout_id; /* pairable timeout id */
289 guint auth_idle_id; /* Pending authorization dequeue */
290 GQueue *auths; /* Ongoing and pending auths */
291 bool pincode_requested; /* PIN requested during last bonding */
292 GSList *connections; /* Connected devices */
293 GSList *devices; /* Devices structure pointers */
294 GSList *connect_list; /* Devices to connect when found */
295 struct btd_device *connect_le; /* LE device waiting to be connected */
296 sdp_list_t *services; /* Services associated to adapter */
298 struct btd_gatt_database *database;
299 struct btd_advertising *adv_manager;
301 gboolean initialized;
302 #ifdef __TIZEN_PATCH__
303 GSList *adv_list; /* List of advertising instance */
304 bool advertising; /* Advertising active */
305 gchar *version; /* Bluetooth Version */
307 bool secure_connection; /* Secure Connection active*/
308 uint16_t auth_payload_timeout; /* Authenticated payload timeout value*/
310 bool set_new_rpa; /* RPA to be set */
311 bool rpa_is_set; /* RPA is set */
314 uint8_t adv_tx_power;
316 bool le_discovering; /* LE Discovery active */
317 GSList *le_discovery_list; /* list of LE discovery clients */
318 gboolean le_auto_connect; /* LE Auto connection */
321 GSList *pin_callbacks;
322 GSList *msd_callbacks;
327 struct oob_handler *oob_handler;
329 unsigned int load_ltks_id;
330 guint load_ltks_timeout;
332 unsigned int confirm_name_id;
333 guint confirm_name_timeout;
335 unsigned int pair_device_id;
336 guint pair_device_timeout;
338 unsigned int db_id; /* Service event handler for GATT db */
339 #ifdef __TIZEN_PATCH__
340 guint private_addr_timeout;
341 uint8_t central_rpa_res_support;
343 bool is_default; /* true if adapter is default one */
347 #ifdef __TIZEN_PATCH__
351 GEN_IRK_THEN_ENABLE_PRIVACY
360 static struct btd_adapter *btd_adapter_lookup(uint16_t index)
364 for (list = g_list_first(adapter_list); list;
365 list = g_list_next(list)) {
366 struct btd_adapter *adapter = list->data;
368 if (adapter->dev_id == index)
375 struct btd_adapter *btd_adapter_get_default(void)
379 for (list = g_list_first(adapter_list); list;
380 list = g_list_next(list)) {
381 struct btd_adapter *adapter = list->data;
383 if (adapter->is_default)
390 bool btd_adapter_is_default(struct btd_adapter *adapter)
395 return adapter->is_default;
398 uint16_t btd_adapter_get_index(struct btd_adapter *adapter)
401 return MGMT_INDEX_NONE;
403 return adapter->dev_id;
406 static gboolean process_auth_queue(gpointer user_data);
408 static void dev_class_changed_callback(uint16_t index, uint16_t length,
409 const void *param, void *user_data)
411 struct btd_adapter *adapter = user_data;
412 const struct mgmt_cod *rp = param;
415 if (length < sizeof(*rp)) {
416 btd_error(adapter->dev_id,
417 "Wrong size of class of device changed parameters");
421 dev_class = rp->val[0] | (rp->val[1] << 8) | (rp->val[2] << 16);
423 if (dev_class == adapter->dev_class)
426 DBG("Class: 0x%06x", dev_class);
428 adapter->dev_class = dev_class;
430 g_dbus_emit_property_changed(dbus_conn, adapter->path,
431 ADAPTER_INTERFACE, "Class");
434 static void set_dev_class_complete(uint8_t status, uint16_t length,
435 const void *param, void *user_data)
437 struct btd_adapter *adapter = user_data;
439 if (status != MGMT_STATUS_SUCCESS) {
440 btd_error(adapter->dev_id,
441 "Failed to set device class: %s (0x%02x)",
442 mgmt_errstr(status), status);
447 * The parameters are identical and also the task that is
448 * required in both cases. So it is safe to just call the
449 * event handling functions here.
451 dev_class_changed_callback(adapter->dev_id, length, param, adapter);
454 static void set_dev_class(struct btd_adapter *adapter)
456 struct mgmt_cp_set_dev_class cp;
459 * If the controller does not support BR/EDR operation,
460 * there is no point in trying to set a major and minor
463 * This is an optimization for Low Energy only controllers.
465 if (!(adapter->supported_settings & MGMT_SETTING_BREDR))
468 memset(&cp, 0, sizeof(cp));
471 * Silly workaround for a really stupid kernel bug :(
473 * All current kernel versions assign the major and minor numbers
474 * straight to dev_class[0] and dev_class[1] without considering
475 * the proper bit shifting.
477 * To make this work, shift the value in userspace for now until
478 * we get a fixed kernel version.
480 cp.major = adapter->major_class & 0x1f;
481 cp.minor = adapter->minor_class << 2;
483 DBG("sending set device class command for index %u", adapter->dev_id);
485 if (mgmt_send(adapter->mgmt, MGMT_OP_SET_DEV_CLASS,
486 adapter->dev_id, sizeof(cp), &cp,
487 set_dev_class_complete, adapter, NULL) > 0)
490 btd_error(adapter->dev_id,
491 "Failed to set class of device for index %u", adapter->dev_id);
494 void btd_adapter_set_class(struct btd_adapter *adapter, uint8_t major,
497 if (adapter->major_class == major && adapter->minor_class == minor)
500 DBG("class: major %u minor %u", major, minor);
502 adapter->major_class = major;
503 adapter->minor_class = minor;
505 set_dev_class(adapter);
508 static uint8_t get_mode(const char *mode)
510 if (strcasecmp("off", mode) == 0)
512 else if (strcasecmp("connectable", mode) == 0)
513 return MODE_CONNECTABLE;
514 else if (strcasecmp("discoverable", mode) == 0)
515 return MODE_DISCOVERABLE;
520 static void store_adapter_info(struct btd_adapter *adapter)
523 char filename[PATH_MAX];
527 gboolean discoverable;
528 #ifdef __TIZEN_PATCH__
530 static const char testblock[MGMT_IRK_SIZE];
534 key_file = g_key_file_new();
536 if (adapter->pairable_timeout != main_opts.pairto)
537 g_key_file_set_integer(key_file, "General", "PairableTimeout",
538 adapter->pairable_timeout);
540 if ((adapter->current_settings & MGMT_SETTING_DISCOVERABLE) &&
541 !adapter->discoverable_timeout)
544 discoverable = FALSE;
546 g_key_file_set_boolean(key_file, "General", "Discoverable",
549 if (adapter->discoverable_timeout != main_opts.discovto)
550 g_key_file_set_integer(key_file, "General",
551 "DiscoverableTimeout",
552 adapter->discoverable_timeout);
554 if (adapter->stored_alias)
555 g_key_file_set_string(key_file, "General", "Alias",
556 adapter->stored_alias);
557 #ifdef __TIZEN_PATCH__
558 if (memcmp(adapter->local_irk, testblock , MGMT_IRK_SIZE)) {
561 for (i = 0; i < MGMT_IRK_SIZE; i++)
562 sprintf(key_str + 2 + (i * 2), "%2.2X",
563 adapter->local_irk[i]);
564 g_key_file_set_string(key_file, "General",
565 "LocalIrk", key_str);
569 ba2str(&adapter->bdaddr, address);
570 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/settings", address);
572 create_file(filename, S_IRUSR | S_IWUSR);
574 str = g_key_file_to_data(key_file, &length, NULL);
575 g_file_set_contents(filename, str, length, NULL);
578 g_key_file_free(key_file);
581 static void trigger_pairable_timeout(struct btd_adapter *adapter);
582 static void adapter_start(struct btd_adapter *adapter);
583 static void adapter_stop(struct btd_adapter *adapter);
584 static void trigger_passive_scanning(struct btd_adapter *adapter);
585 static bool set_mode(struct btd_adapter *adapter, uint16_t opcode,
587 #ifdef __TIZEN_PATCH__
588 static bool set_privacy(struct btd_adapter *adapter, bool privacy);
591 #ifdef __TIZEN_PATCH__
592 #ifdef TIZEN_WEARABLE
593 static gboolean charging_state_timeout_cb(gpointer user_data)
595 struct btd_adapter *adapter = user_data;
596 int bredr_pkt_type = ACL_PTYPE_MASK;
598 adapter->charging_timeout = 0;
600 DBG("Set all connections to BR/EDR type");
601 g_slist_foreach(adapter->devices, device_change_pkt_type,
602 (gpointer)bredr_pkt_type);
607 static void set_charging_state(struct btd_adapter *adapter,
608 charging_state_e state)
610 int br_pkt_type = ACL_PTYPE_MASK |
611 HCI_2DH1 | HCI_2DH3 | HCI_2DH5 |
612 HCI_3DH1 | HCI_3DH3 | HCI_3DH5;
614 if (adapter->charging == state)
617 DBG("old charging state : %d, new charging_state : %d",
618 adapter->charging, state);
621 * Only none / wire charging <-> wireless charging state change should
624 if ((adapter->charging == NONE_CHARGING && state == WIRE_CHARGING) ||
625 (adapter->charging == WIRE_CHARGING && state == NONE_CHARGING)) {
626 DBG("Just update charging state");
627 adapter->charging = state;
631 if (adapter->charging_timeout) {
632 g_source_remove(adapter->charging_timeout);
633 adapter->charging_timeout = 0;
636 adapter->charging = state;
637 if (adapter->charging == NONE_CHARGING ||
638 adapter->charging == WIRE_CHARGING) {
639 DBG("Trigger timeout to set connection to BR/EDR type");
640 adapter->charging_timeout = g_timeout_add(2000,
641 charging_state_timeout_cb, adapter);
642 } else if (adapter->charging == WIRELESS_CHARGING) {
643 DBG("Set all connections to BR type");
644 g_slist_foreach(adapter->devices, device_change_pkt_type,
645 (gpointer)br_pkt_type);
651 static gboolean charging_state_changed(DBusConnection *connection,
652 DBusMessage *msg, void *user_data)
654 struct btd_adapter *adapter = user_data;
657 DBG("charging_state_changed");
659 if (!dbus_message_get_args(msg, NULL, DBUS_TYPE_INT32, &state,
663 set_charging_state(adapter, state);
668 charging_state_e get_charging_state(struct btd_adapter *adapter)
670 DBG("charging_state: %d", adapter->charging);
671 return adapter->charging;
673 #endif /* TIZEN_WEARABLE */
675 static int compare_slot(gconstpointer a, gconstpointer b)
677 const struct adv_info *adv = a;
678 const int id = *(int*)b;
680 return (adv->slot_id == id ? 0 : -1);
683 static struct adv_info *find_advertiser(struct btd_adapter *adapter,
688 list = g_slist_find_custom(adapter->adv_list, &slot_id,
696 static void create_advertiser(struct btd_adapter *adapter,
699 struct adv_info *adv;
704 if (find_advertiser(adapter, slot_id) != NULL) {
705 error("Aleady existed [%d]", slot_id);
709 DBG("Create adv slot id : %d", slot_id);
711 adv = g_new0(struct adv_info, 1);
715 adv->slot_id = slot_id;
717 adapter->adv_list= g_slist_append(adapter->adv_list, adv);
722 static void advertising_state_changed(struct btd_adapter *adapter,
723 int slot_id, bool enabled)
725 struct adv_info *adv;
732 adv = find_advertiser(adapter, slot_id);
734 DBG("Unable to find advertiser [%d]", slot_id);
738 adv->status = enabled;
739 DBG("slot_id %d, status %d", adv->slot_id, adv->status);
741 g_dbus_emit_signal(dbus_conn, adapter->path,
742 ADAPTER_INTERFACE, "AdvertisingEnabled",
743 DBUS_TYPE_INT32, &id,
744 DBUS_TYPE_BOOLEAN, &state,
748 static void clear_advertiser_cb(gpointer data, gpointer user_data)
750 struct adv_info *adv = data;
751 struct btd_adapter *adapter = user_data;
754 advertising_state_changed(adapter, adv->slot_id, 0);
757 static void advertiser_cleanup(struct btd_adapter *adapter)
759 if (!adapter->adv_list)
762 g_slist_foreach(adapter->adv_list, clear_advertiser_cb, adapter);
763 g_slist_free(adapter->adv_list);
764 adapter->adv_list = NULL;
768 #if defined __TIZEN_PATCH__ && defined __SPRD_PAGE_SCAN_PATCH__
769 #define OCF_PAGE_SCAN_TIMEOUT 0x0018
770 #define OGF_PAGE_SCAN_TIMEOUT 0x03
773 uint16_t timeout; /* Value */
774 } __attribute__ ((packed)) hci_page_scan_timeout;
775 #define HCI_PAGE_SCAN_TIMEOUT_CP_SIZE 2
777 static gboolean send_sprd_page_scan_timeout(gint value)
780 hci_page_scan_timeout cp;
782 dd = hci_open_dev(0);
784 if (hci_send_cmd(dd, OGF_PAGE_SCAN_TIMEOUT, OCF_PAGE_SCAN_TIMEOUT,
785 HCI_PAGE_SCAN_TIMEOUT_CP_SIZE, &cp) < 0) {
786 DBG("Error: While setting Page Timeout value");
790 DBG("Page Scan Timeout Value Patch %d", value);
798 static void settings_changed(struct btd_adapter *adapter, uint32_t settings)
800 uint32_t changed_mask;
802 changed_mask = adapter->current_settings ^ settings;
804 adapter->current_settings = settings;
806 DBG("Changed settings: 0x%08x", changed_mask);
808 if (changed_mask & MGMT_SETTING_POWERED) {
809 g_dbus_emit_property_changed(dbus_conn, adapter->path,
810 ADAPTER_INTERFACE, "Powered");
812 if (adapter->current_settings & MGMT_SETTING_POWERED) {
813 adapter_start(adapter);
814 #if defined __TIZEN_PATCH__ && defined __SPRD_PAGE_SCAN_PATCH__
815 /* Approx 6.4 Seconds of timeout */
816 /* This Added because Z3 device was not able to connect with
817 * some device as it was getting Page Timeout
818 * (LG HBS800, sony carkit) etc. So, Increasing Page timeout value
819 * from 5.12 Sec (which is default) to ~6.4sec*/
820 DBG("Setting value");
821 send_sprd_page_scan_timeout(10240);
822 #endif /* __SPRD_QOS_PATCH__ */
824 adapter_stop(adapter);
829 if (!adapter_remaining)
835 if (changed_mask & MGMT_SETTING_LE) {
836 if ((adapter->current_settings & MGMT_SETTING_POWERED) &&
837 (adapter->current_settings & MGMT_SETTING_LE))
838 trigger_passive_scanning(adapter);
841 if (changed_mask & MGMT_SETTING_CONNECTABLE)
842 g_dbus_emit_property_changed(dbus_conn, adapter->path,
843 ADAPTER_INTERFACE, "Connectable");
845 if (changed_mask & MGMT_SETTING_DISCOVERABLE) {
846 g_dbus_emit_property_changed(dbus_conn, adapter->path,
847 ADAPTER_INTERFACE, "Discoverable");
848 store_adapter_info(adapter);
851 if (changed_mask & MGMT_SETTING_BONDABLE) {
852 g_dbus_emit_property_changed(dbus_conn, adapter->path,
853 ADAPTER_INTERFACE, "Pairable");
855 trigger_pairable_timeout(adapter);
858 #ifdef __TIZEN_PATCH__
859 if (changed_mask & MGMT_SETTING_ADVERTISING) {
860 if ((adapter->current_settings & MGMT_SETTING_ADVERTISING) &&
861 (adapter->advertising)) {
865 adapter->advertising = adapter->current_settings & MGMT_SETTING_ADVERTISING;
866 advertising_state_changed(adapter, 0, adapter->advertising);
871 static void new_settings_callback(uint16_t index, uint16_t length,
872 const void *param, void *user_data)
874 struct btd_adapter *adapter = user_data;
877 if (length < sizeof(settings)) {
878 btd_error(adapter->dev_id,
879 "Wrong size of new settings parameters");
883 settings = get_le32(param);
885 if (settings == adapter->current_settings)
888 DBG("Settings: 0x%08x", settings);
890 settings_changed(adapter, settings);
893 static void set_mode_complete(uint8_t status, uint16_t length,
894 const void *param, void *user_data)
896 struct btd_adapter *adapter = user_data;
898 if (status != MGMT_STATUS_SUCCESS) {
899 btd_error(adapter->dev_id, "Failed to set mode: %s (0x%02x)",
900 mgmt_errstr(status), status);
905 * The parameters are identical and also the task that is
906 * required in both cases. So it is safe to just call the
907 * event handling functions here.
909 new_settings_callback(adapter->dev_id, length, param, adapter);
912 static bool set_mode(struct btd_adapter *adapter, uint16_t opcode,
917 memset(&cp, 0, sizeof(cp));
920 DBG("sending set mode command for index %u", adapter->dev_id);
922 if (mgmt_send(adapter->mgmt, opcode,
923 adapter->dev_id, sizeof(cp), &cp,
924 set_mode_complete, adapter, NULL) > 0)
927 btd_error(adapter->dev_id, "Failed to set mode for index %u",
933 static bool set_discoverable(struct btd_adapter *adapter, uint8_t mode,
936 struct mgmt_cp_set_discoverable cp;
938 memset(&cp, 0, sizeof(cp));
940 cp.timeout = htobs(timeout);
942 DBG("sending set mode command for index %u", adapter->dev_id);
944 if (kernel_conn_control) {
946 set_mode(adapter, MGMT_OP_SET_CONNECTABLE, mode);
948 /* This also disables discoverable so we're done */
949 return set_mode(adapter, MGMT_OP_SET_CONNECTABLE,
953 if (mgmt_send(adapter->mgmt, MGMT_OP_SET_DISCOVERABLE,
954 adapter->dev_id, sizeof(cp), &cp,
955 set_mode_complete, adapter, NULL) > 0)
958 btd_error(adapter->dev_id, "Failed to set mode for index %u",
964 static gboolean pairable_timeout_handler(gpointer user_data)
966 struct btd_adapter *adapter = user_data;
968 adapter->pairable_timeout_id = 0;
970 set_mode(adapter, MGMT_OP_SET_BONDABLE, 0x00);
975 static void trigger_pairable_timeout(struct btd_adapter *adapter)
977 if (adapter->pairable_timeout_id > 0) {
978 g_source_remove(adapter->pairable_timeout_id);
979 adapter->pairable_timeout_id = 0;
982 if (!(adapter->current_settings & MGMT_SETTING_BONDABLE))
985 if (adapter->pairable_timeout > 0)
986 g_timeout_add_seconds(adapter->pairable_timeout,
987 pairable_timeout_handler, adapter);
990 static void local_name_changed_callback(uint16_t index, uint16_t length,
991 const void *param, void *user_data)
993 struct btd_adapter *adapter = user_data;
994 const struct mgmt_cp_set_local_name *rp = param;
996 if (length < sizeof(*rp)) {
997 btd_error(adapter->dev_id,
998 "Wrong size of local name changed parameters");
1002 if (!g_strcmp0(adapter->short_name, (const char *) rp->short_name) &&
1003 !g_strcmp0(adapter->name, (const char *) rp->name))
1006 DBG("Name: %s", rp->name);
1007 DBG("Short name: %s", rp->short_name);
1009 g_free(adapter->name);
1010 adapter->name = g_strdup((const char *) rp->name);
1012 g_free(adapter->short_name);
1013 adapter->short_name = g_strdup((const char *) rp->short_name);
1016 * Changing the name (even manually via HCI) will update the
1017 * current alias property.
1019 * In case the name is empty, use the short name.
1021 * There is a difference between the stored alias (which is
1022 * configured by the user) and the current alias. The current
1023 * alias is temporary for the lifetime of the daemon.
1025 if (adapter->name && adapter->name[0] != '\0') {
1026 g_free(adapter->current_alias);
1027 adapter->current_alias = g_strdup(adapter->name);
1029 g_free(adapter->current_alias);
1030 adapter->current_alias = g_strdup(adapter->short_name);
1033 DBG("Current alias: %s", adapter->current_alias);
1035 if (!adapter->current_alias)
1038 g_dbus_emit_property_changed(dbus_conn, adapter->path,
1039 ADAPTER_INTERFACE, "Alias");
1041 attrib_gap_set(adapter, GATT_CHARAC_DEVICE_NAME,
1042 (const uint8_t *) adapter->current_alias,
1043 strlen(adapter->current_alias));
1046 static void set_local_name_complete(uint8_t status, uint16_t length,
1047 const void *param, void *user_data)
1049 struct btd_adapter *adapter = user_data;
1051 if (status != MGMT_STATUS_SUCCESS) {
1052 btd_error(adapter->dev_id,
1053 "Failed to set local name: %s (0x%02x)",
1054 mgmt_errstr(status), status);
1059 * The parameters are identical and also the task that is
1060 * required in both cases. So it is safe to just call the
1061 * event handling functions here.
1063 local_name_changed_callback(adapter->dev_id, length, param, adapter);
1066 static int set_name(struct btd_adapter *adapter, const char *name)
1068 struct mgmt_cp_set_local_name cp;
1069 char maxname[MAX_NAME_LENGTH + 1];
1071 memset(maxname, 0, sizeof(maxname));
1072 strncpy(maxname, name, MAX_NAME_LENGTH);
1074 if (!g_utf8_validate(maxname, -1, NULL)) {
1075 btd_error(adapter->dev_id,
1076 "Name change failed: supplied name isn't valid UTF-8");
1080 memset(&cp, 0, sizeof(cp));
1081 strncpy((char *) cp.name, maxname, sizeof(cp.name) - 1);
1083 DBG("sending set local name command for index %u", adapter->dev_id);
1085 if (mgmt_send(adapter->mgmt, MGMT_OP_SET_LOCAL_NAME,
1086 adapter->dev_id, sizeof(cp), &cp,
1087 set_local_name_complete, adapter, NULL) > 0)
1090 btd_error(adapter->dev_id, "Failed to set local name for index %u",
1096 int adapter_set_name(struct btd_adapter *adapter, const char *name)
1098 if (g_strcmp0(adapter->system_name, name) == 0)
1101 DBG("name: %s", name);
1103 g_free(adapter->system_name);
1104 adapter->system_name = g_strdup(name);
1106 g_dbus_emit_property_changed(dbus_conn, adapter->path,
1107 ADAPTER_INTERFACE, "Name");
1109 /* alias is preferred over system name */
1110 if (adapter->stored_alias)
1113 DBG("alias: %s", name);
1115 g_dbus_emit_property_changed(dbus_conn, adapter->path,
1116 ADAPTER_INTERFACE, "Alias");
1118 return set_name(adapter, name);
1121 struct btd_device *btd_adapter_find_device(struct btd_adapter *adapter,
1122 const bdaddr_t *dst,
1123 uint8_t bdaddr_type)
1125 struct device_addr_type addr;
1126 struct btd_device *device;
1132 bacpy(&addr.bdaddr, dst);
1133 addr.bdaddr_type = bdaddr_type;
1135 list = g_slist_find_custom(adapter->devices, &addr,
1136 device_addr_type_cmp);
1138 /* Find the device based on RPA */
1139 #ifdef __TIZEN_PATCH__
1144 ba2str(&addr.bdaddr, address);
1146 msb = addr.bdaddr.b[5] >> 6;
1148 /* Check whether address is RPA */
1149 if (msb == 0x00 || msb == 0x01) {
1150 list = g_slist_find_custom(adapter->devices,
1151 address, (GCompareFunc) device_rpa_cmp);
1154 device = list->data;
1156 if (device_get_rpa_exist(device) == true) {
1159 rpa_list = g_slist_find_custom(adapter->devices,
1160 device_get_address(device),
1164 bdaddr_type = BDADDR_LE_RANDOM;
1173 device = list->data;
1176 * If we're looking up based on public address and the address
1177 * was not previously used over this bearer we may need to
1178 * update LE or BR/EDR support information.
1180 if (bdaddr_type == BDADDR_BREDR)
1181 device_set_bredr_support(device);
1183 device_set_le_support(device, bdaddr_type);
1188 static void uuid_to_uuid128(uuid_t *uuid128, const uuid_t *uuid)
1190 if (uuid->type == SDP_UUID16)
1191 sdp_uuid16_to_uuid128(uuid128, uuid);
1192 else if (uuid->type == SDP_UUID32)
1193 sdp_uuid32_to_uuid128(uuid128, uuid);
1195 memcpy(uuid128, uuid, sizeof(*uuid));
1198 static bool is_supported_uuid(const uuid_t *uuid)
1202 /* mgmt versions from 1.3 onwards support all types of UUIDs */
1203 if (MGMT_VERSION(mgmt_version, mgmt_revision) >= MGMT_VERSION(1, 3))
1206 uuid_to_uuid128(&tmp, uuid);
1208 if (!sdp_uuid128_to_uuid(&tmp))
1211 if (tmp.type != SDP_UUID16)
1217 static void add_uuid_complete(uint8_t status, uint16_t length,
1218 const void *param, void *user_data)
1220 struct btd_adapter *adapter = user_data;
1222 if (status != MGMT_STATUS_SUCCESS) {
1223 btd_error(adapter->dev_id, "Failed to add UUID: %s (0x%02x)",
1224 mgmt_errstr(status), status);
1229 * The parameters are identical and also the task that is
1230 * required in both cases. So it is safe to just call the
1231 * event handling functions here.
1233 dev_class_changed_callback(adapter->dev_id, length, param, adapter);
1235 if (adapter->initialized)
1236 g_dbus_emit_property_changed(dbus_conn, adapter->path,
1237 ADAPTER_INTERFACE, "UUIDs");
1240 static int add_uuid(struct btd_adapter *adapter, uuid_t *uuid, uint8_t svc_hint)
1242 struct mgmt_cp_add_uuid cp;
1246 if (!is_supported_uuid(uuid)) {
1247 btd_warn(adapter->dev_id,
1248 "Ignoring unsupported UUID for addition");
1252 uuid_to_uuid128(&uuid128, uuid);
1254 ntoh128((uint128_t *) uuid128.value.uuid128.data, &uint128);
1255 htob128(&uint128, (uint128_t *) cp.uuid);
1256 cp.svc_hint = svc_hint;
1258 DBG("sending add uuid command for index %u", adapter->dev_id);
1260 if (mgmt_send(adapter->mgmt, MGMT_OP_ADD_UUID,
1261 adapter->dev_id, sizeof(cp), &cp,
1262 add_uuid_complete, adapter, NULL) > 0)
1265 btd_error(adapter->dev_id, "Failed to add UUID for index %u",
1271 static void remove_uuid_complete(uint8_t status, uint16_t length,
1272 const void *param, void *user_data)
1274 struct btd_adapter *adapter = user_data;
1276 if (status != MGMT_STATUS_SUCCESS) {
1277 btd_error(adapter->dev_id, "Failed to remove UUID: %s (0x%02x)",
1278 mgmt_errstr(status), status);
1283 * The parameters are identical and also the task that is
1284 * required in both cases. So it is safe to just call the
1285 * event handling functions here.
1287 dev_class_changed_callback(adapter->dev_id, length, param, adapter);
1289 if (adapter->initialized)
1290 g_dbus_emit_property_changed(dbus_conn, adapter->path,
1291 ADAPTER_INTERFACE, "UUIDs");
1294 static int remove_uuid(struct btd_adapter *adapter, uuid_t *uuid)
1296 struct mgmt_cp_remove_uuid cp;
1300 if (!is_supported_uuid(uuid)) {
1301 btd_warn(adapter->dev_id,
1302 "Ignoring unsupported UUID for removal");
1306 uuid_to_uuid128(&uuid128, uuid);
1308 ntoh128((uint128_t *) uuid128.value.uuid128.data, &uint128);
1309 htob128(&uint128, (uint128_t *) cp.uuid);
1311 DBG("sending remove uuid command for index %u", adapter->dev_id);
1313 if (mgmt_send(adapter->mgmt, MGMT_OP_REMOVE_UUID,
1314 adapter->dev_id, sizeof(cp), &cp,
1315 remove_uuid_complete, adapter, NULL) > 0)
1318 btd_error(adapter->dev_id, "Failed to remove UUID for index %u",
1324 static void clear_uuids_complete(uint8_t status, uint16_t length,
1325 const void *param, void *user_data)
1327 struct btd_adapter *adapter = user_data;
1329 if (status != MGMT_STATUS_SUCCESS) {
1330 btd_error(adapter->dev_id, "Failed to clear UUIDs: %s (0x%02x)",
1331 mgmt_errstr(status), status);
1336 * The parameters are identical and also the task that is
1337 * required in both cases. So it is safe to just call the
1338 * event handling functions here.
1340 dev_class_changed_callback(adapter->dev_id, length, param, adapter);
1343 static int clear_uuids(struct btd_adapter *adapter)
1345 struct mgmt_cp_remove_uuid cp;
1347 memset(&cp, 0, sizeof(cp));
1349 DBG("sending clear uuids command for index %u", adapter->dev_id);
1351 if (mgmt_send(adapter->mgmt, MGMT_OP_REMOVE_UUID,
1352 adapter->dev_id, sizeof(cp), &cp,
1353 clear_uuids_complete, adapter, NULL) > 0)
1356 btd_error(adapter->dev_id, "Failed to clear UUIDs for index %u",
1362 static uint8_t get_uuid_mask(uuid_t *uuid)
1364 if (uuid->type != SDP_UUID16)
1367 switch (uuid->value.uuid16) {
1368 case DIALUP_NET_SVCLASS_ID:
1369 case CIP_SVCLASS_ID:
1370 return 0x42; /* Telephony & Networking */
1371 case IRMC_SYNC_SVCLASS_ID:
1372 case OBEX_OBJPUSH_SVCLASS_ID:
1373 case OBEX_FILETRANS_SVCLASS_ID:
1374 case IRMC_SYNC_CMD_SVCLASS_ID:
1375 case PBAP_PSE_SVCLASS_ID:
1376 return 0x10; /* Object Transfer */
1377 case HEADSET_SVCLASS_ID:
1378 case HANDSFREE_SVCLASS_ID:
1379 return 0x20; /* Audio */
1380 case CORDLESS_TELEPHONY_SVCLASS_ID:
1381 case INTERCOM_SVCLASS_ID:
1382 case FAX_SVCLASS_ID:
1383 case SAP_SVCLASS_ID:
1385 * Setting the telephony bit for the handsfree audio gateway
1386 * role is not required by the HFP specification, but the
1387 * Nokia 616 carkit is just plain broken! It will refuse
1388 * pairing without this bit set.
1390 case HANDSFREE_AGW_SVCLASS_ID:
1391 return 0x40; /* Telephony */
1392 case AUDIO_SOURCE_SVCLASS_ID:
1393 case VIDEO_SOURCE_SVCLASS_ID:
1394 return 0x08; /* Capturing */
1395 case AUDIO_SINK_SVCLASS_ID:
1396 case VIDEO_SINK_SVCLASS_ID:
1397 return 0x04; /* Rendering */
1398 case PANU_SVCLASS_ID:
1399 case NAP_SVCLASS_ID:
1401 return 0x02; /* Networking */
1407 static int uuid_cmp(const void *a, const void *b)
1409 const sdp_record_t *rec = a;
1410 const uuid_t *uuid = b;
1412 return sdp_uuid_cmp(&rec->svclass, uuid);
1415 static void adapter_service_insert(struct btd_adapter *adapter, sdp_record_t *rec)
1417 sdp_list_t *browse_list = NULL;
1421 DBG("%s", adapter->path);
1423 #ifdef __TIZEN_PATCH__
1425 DBG("record is NULL return");
1430 /* skip record without a browse group */
1431 if (sdp_get_browse_groups(rec, &browse_list) < 0) {
1432 DBG("skipping record without browse group");
1436 sdp_uuid16_create(&browse_uuid, PUBLIC_BROWSE_GROUP);
1438 /* skip record without public browse group */
1439 if (!sdp_list_find(browse_list, &browse_uuid, sdp_uuid_cmp))
1442 if (sdp_list_find(adapter->services, &rec->svclass, uuid_cmp) == NULL)
1447 adapter->services = sdp_list_insert_sorted(adapter->services, rec,
1451 uint8_t svc_hint = get_uuid_mask(&rec->svclass);
1452 add_uuid(adapter, &rec->svclass, svc_hint);
1456 sdp_list_free(browse_list, free);
1459 int adapter_service_add(struct btd_adapter *adapter, sdp_record_t *rec)
1463 DBG("%s", adapter->path);
1465 ret = add_record_to_server(&adapter->bdaddr, rec);
1469 adapter_service_insert(adapter, rec);
1474 void adapter_service_remove(struct btd_adapter *adapter, uint32_t handle)
1476 sdp_record_t *rec = sdp_record_find(handle);
1478 DBG("%s", adapter->path);
1483 adapter->services = sdp_list_remove(adapter->services, rec);
1485 if (sdp_list_find(adapter->services, &rec->svclass, uuid_cmp) == NULL)
1486 remove_uuid(adapter, &rec->svclass);
1488 remove_record_from_server(rec->handle);
1491 static struct btd_device *adapter_create_device(struct btd_adapter *adapter,
1492 const bdaddr_t *bdaddr,
1493 uint8_t bdaddr_type)
1495 struct btd_device *device;
1497 device = device_create(adapter, bdaddr, bdaddr_type);
1501 adapter->devices = g_slist_append(adapter->devices, device);
1506 static void service_auth_cancel(struct service_auth *auth)
1510 if (auth->svc_id > 0)
1511 device_remove_svc_complete_callback(auth->device,
1514 dbus_error_init(&derr);
1515 dbus_set_error_const(&derr, ERROR_INTERFACE ".Canceled", NULL);
1517 auth->cb(&derr, auth->user_data);
1519 dbus_error_free(&derr);
1521 if (auth->agent != NULL) {
1522 agent_cancel(auth->agent);
1523 agent_unref(auth->agent);
1529 #ifdef __TIZEN_PATCH__
1530 void btd_adapter_unpair_device(struct btd_adapter *adapter,
1531 struct btd_device *dev)
1536 adapter->connect_list = g_slist_remove(adapter->connect_list, dev);
1538 // adapter->devices = g_slist_remove(adapter->devices, dev);
1540 // adapter->discovery_found = g_slist_remove(adapter->discovery_found,
1543 adapter->connections = g_slist_remove(adapter->connections, dev);
1545 if (adapter->connect_le == dev)
1546 adapter->connect_le = NULL;
1548 l = adapter->auths->head;
1550 struct service_auth *auth = l->data;
1551 GList *next = g_list_next(l);
1553 if (auth->device != dev) {
1558 g_queue_delete_link(adapter->auths, l);
1561 service_auth_cancel(auth);
1564 device_unpair(dev, TRUE);
1568 gboolean adapter_clear_le_white_list(struct btd_adapter *adapter)
1570 if (mgmt_send(adapter->mgmt, MGMT_OP_CLEAR_DEV_WHITE_LIST,
1571 adapter->dev_id, 0, NULL,
1572 NULL, NULL, NULL) > 0)
1578 gboolean adapter_add_le_white_list(struct btd_adapter *adapter, struct btd_device *device)
1580 struct mgmt_cp_add_dev_white_list cp;
1581 const bdaddr_t *dst;
1582 char device_addr[18];
1584 memset(&cp, 0, sizeof(cp));
1586 dst = device_get_address(device);
1588 ba2str(device_get_address(device), device_addr);
1589 DBG("addr %s bdaddr type %d", device_addr, btd_device_get_bdaddr_type(device));
1591 if ( btd_device_get_bdaddr_type(device) == BDADDR_LE_PUBLIC)
1592 cp.bdaddr_type = 0x0;
1594 cp.bdaddr_type = 0x1;
1596 memcpy(&cp.bdaddr, dst, sizeof(bdaddr_t));
1598 if (mgmt_send(adapter->mgmt, MGMT_OP_ADD_DEV_WHITE_LIST,
1599 adapter->dev_id, sizeof(cp), &cp,
1600 NULL, NULL, NULL) > 0)
1603 DBG("Unable to add white list");
1608 gboolean btd_adapter_is_le_auto_connect(struct btd_adapter *adapter)
1610 return adapter->le_auto_connect;
1613 void btd_adapter_set_le_auto_connect(struct btd_adapter *adapter, gboolean auto_connect)
1615 adapter->le_auto_connect = auto_connect;
1618 gboolean btd_adapter_disable_le_auto_connect(struct btd_adapter *adapter)
1620 if (btd_adapter_is_le_auto_connect(adapter) == FALSE) {
1621 error("le auto connection is not going on");
1625 DBG("disable le auto connect : %u", adapter->dev_id);
1627 if (mgmt_send(adapter->mgmt, MGMT_OP_DISABLE_LE_AUTO_CONNECT,
1628 adapter->dev_id, 0, NULL,
1629 NULL, NULL, NULL) > 0) {
1630 btd_adapter_set_le_auto_connect(adapter, FALSE);
1634 error("Failed to disable le auto conn : %u", adapter->dev_id);
1640 void btd_adapter_remove_device(struct btd_adapter *adapter,
1641 struct btd_device *dev)
1645 adapter->connect_list = g_slist_remove(adapter->connect_list, dev);
1647 adapter->devices = g_slist_remove(adapter->devices, dev);
1649 adapter->discovery_found = g_slist_remove(adapter->discovery_found,
1652 adapter->connections = g_slist_remove(adapter->connections, dev);
1654 if (adapter->connect_le == dev)
1655 adapter->connect_le = NULL;
1657 l = adapter->auths->head;
1659 struct service_auth *auth = l->data;
1660 GList *next = g_list_next(l);
1662 if (auth->device != dev) {
1667 g_queue_delete_link(adapter->auths, l);
1670 service_auth_cancel(auth);
1673 device_remove(dev, TRUE);
1676 struct btd_device *btd_adapter_get_device(struct btd_adapter *adapter,
1677 const bdaddr_t *addr,
1680 struct btd_device *device;
1685 #ifdef __TIZEN_PATCH__
1686 if (!bacmp(addr, BDADDR_ANY))
1690 device = btd_adapter_find_device(adapter, addr, addr_type);
1694 return adapter_create_device(adapter, addr, addr_type);
1697 sdp_list_t *btd_adapter_get_services(struct btd_adapter *adapter)
1699 return adapter->services;
1702 static void passive_scanning_complete(uint8_t status, uint16_t length,
1703 const void *param, void *user_data)
1705 struct btd_adapter *adapter = user_data;
1706 const struct mgmt_cp_start_discovery *rp = param;
1708 DBG("status 0x%02x", status);
1710 if (length < sizeof(*rp)) {
1711 btd_error(adapter->dev_id,
1712 "Wrong size of start scanning return parameters");
1716 if (status == MGMT_STATUS_SUCCESS) {
1717 adapter->discovery_type = rp->type;
1718 adapter->discovery_enable = 0x01;
1722 static gboolean passive_scanning_timeout(gpointer user_data)
1724 struct btd_adapter *adapter = user_data;
1725 struct mgmt_cp_start_discovery cp;
1727 adapter->passive_scan_timeout = 0;
1729 cp.type = SCAN_TYPE_LE;
1730 #ifdef __TIZEN_PATCH__
1731 mgmt_send(adapter->mgmt, MGMT_OP_START_LE_DISCOVERY,
1732 adapter->dev_id, sizeof(cp), &cp,
1733 passive_scanning_complete, adapter, NULL);
1735 mgmt_send(adapter->mgmt, MGMT_OP_START_DISCOVERY,
1736 adapter->dev_id, sizeof(cp), &cp,
1737 passive_scanning_complete, adapter, NULL);
1742 static void trigger_passive_scanning(struct btd_adapter *adapter)
1744 if (!(adapter->current_settings & MGMT_SETTING_LE))
1749 if (adapter->passive_scan_timeout > 0) {
1750 g_source_remove(adapter->passive_scan_timeout);
1751 adapter->passive_scan_timeout = 0;
1755 * When the kernel background scanning is available, there is
1756 * no need to start any discovery. The kernel will keep scanning
1757 * as long as devices are in its auto-connection list.
1759 if (kernel_conn_control)
1763 * If any client is running a discovery right now, then do not
1764 * even try to start passive scanning.
1766 * The discovery procedure is using interleaved scanning and
1767 * thus will discover Low Energy devices as well.
1769 #ifdef __TIZEN_PATCH__
1770 if (adapter->discovery_list || adapter->le_discovery_list)
1773 if (adapter->discovery_list)
1777 if (adapter->discovery_enable == 0x01)
1781 * In case the discovery is suspended (for example for an ongoing
1782 * pairing attempt), then also do not start passive scanning.
1784 if (adapter->discovery_suspended)
1788 * If the list of connectable Low Energy devices is empty,
1789 * then do not start passive scanning.
1791 if (!adapter->connect_list)
1794 adapter->passive_scan_timeout = g_timeout_add_seconds(CONN_SCAN_TIMEOUT,
1795 passive_scanning_timeout, adapter);
1798 static void stop_passive_scanning_complete(uint8_t status, uint16_t length,
1799 const void *param, void *user_data)
1801 struct btd_adapter *adapter = user_data;
1802 struct btd_device *dev;
1805 DBG("status 0x%02x (%s)", status, mgmt_errstr(status));
1807 dev = adapter->connect_le;
1808 adapter->connect_le = NULL;
1811 * When the kernel background scanning is available, there is
1812 * no need to stop any discovery. The kernel will handle the
1813 * auto-connection by itself.
1815 if (kernel_conn_control)
1819 * MGMT_STATUS_REJECTED may be returned from kernel because the passive
1820 * scan timer had expired in kernel and passive scan was disabled just
1821 * around the time we called stop_passive_scanning().
1823 if (status != MGMT_STATUS_SUCCESS && status != MGMT_STATUS_REJECTED) {
1824 btd_error(adapter->dev_id, "Stopping passive scanning failed: %s",
1825 mgmt_errstr(status));
1829 adapter->discovery_type = 0x00;
1830 adapter->discovery_enable = 0x00;
1833 DBG("Device removed while stopping passive scanning");
1834 trigger_passive_scanning(adapter);
1838 err = device_connect_le(dev);
1840 btd_error(adapter->dev_id, "LE auto connection failed: %s (%d)",
1841 strerror(-err), -err);
1842 trigger_passive_scanning(adapter);
1846 static void stop_passive_scanning(struct btd_adapter *adapter)
1848 struct mgmt_cp_stop_discovery cp;
1849 #ifdef __TIZEN_PATCH__
1850 struct mgmt_cp_stop_discovery le_cp;
1855 /* If there are any normal discovery clients passive scanning
1856 * wont be running */
1857 #ifdef __TIZEN_PATCH__
1858 if (adapter->discovery_list || adapter->le_discovery_list)
1861 if (adapter->discovery_list)
1865 if (adapter->discovery_enable == 0x00)
1868 #ifdef __TIZEN_PATCH__
1869 if ((adapter->discovery_type & 0x01) > 0)
1871 mgmt_send(adapter->mgmt, MGMT_OP_STOP_DISCOVERY,
1872 adapter->dev_id, sizeof(cp), &cp,
1873 stop_passive_scanning_complete, adapter, NULL);
1874 if ((adapter->discovery_type & 0x06) > 0)
1876 mgmt_send(adapter->mgmt, MGMT_OP_STOP_LE_DISCOVERY,
1877 adapter->dev_id, sizeof(le_cp), &le_cp,
1878 stop_passive_scanning_complete, adapter, NULL);
1880 cp.type = adapter->discovery_type;
1882 mgmt_send(adapter->mgmt, MGMT_OP_STOP_DISCOVERY,
1883 adapter->dev_id, sizeof(cp), &cp,
1884 stop_passive_scanning_complete, adapter, NULL);
1888 static void cancel_passive_scanning(struct btd_adapter *adapter)
1890 if (!(adapter->current_settings & MGMT_SETTING_LE))
1895 if (adapter->passive_scan_timeout > 0) {
1896 g_source_remove(adapter->passive_scan_timeout);
1897 adapter->passive_scan_timeout = 0;
1901 static uint8_t get_scan_type(struct btd_adapter *adapter)
1905 if (adapter->current_settings & MGMT_SETTING_BREDR)
1906 type = SCAN_TYPE_BREDR;
1910 if (adapter->current_settings & MGMT_SETTING_LE)
1911 type |= SCAN_TYPE_LE;
1916 static void free_discovery_filter(struct discovery_filter *discovery_filter)
1918 if (!discovery_filter)
1921 g_slist_free_full(discovery_filter->uuids, g_free);
1922 g_free(discovery_filter);
1925 static void trigger_start_discovery(struct btd_adapter *adapter, guint delay);
1927 static void start_discovery_complete(uint8_t status, uint16_t length,
1928 const void *param, void *user_data)
1930 struct btd_adapter *adapter = user_data;
1931 const struct mgmt_cp_start_discovery *rp = param;
1933 DBG("status 0x%02x", status);
1934 #ifndef __TIZEN_PATCH__
1935 DBG("Discovery Type 0x%02x", rp->type);
1938 if (length < sizeof(*rp)) {
1939 btd_error(adapter->dev_id,
1940 "Wrong size of start discovery return parameters");
1944 if (status == MGMT_STATUS_SUCCESS) {
1945 #ifdef __TIZEN_PATCH__
1946 DBG("Return param discovery type 0x%02x", rp->type);
1947 adapter->discovery_type |= rp->type;
1949 adapter->discovery_type = rp->type;
1951 adapter->discovery_enable = 0x01;
1953 if (adapter->current_discovery_filter)
1954 adapter->filtered_discovery = true;
1956 adapter->filtered_discovery = false;
1958 if (adapter->discovering)
1961 adapter->discovering = true;
1962 g_dbus_emit_property_changed(dbus_conn, adapter->path,
1963 ADAPTER_INTERFACE, "Discovering");
1966 #ifdef __TIZEN_PATCH__
1968 adapter->discovering = false;
1969 g_dbus_emit_property_changed(dbus_conn, adapter->path,
1970 ADAPTER_INTERFACE, "Discovering");
1976 * In case the restart of the discovery failed, then just trigger
1977 * it for the next idle timeout again.
1979 #ifndef __TIZEN_PATCH__
1980 trigger_start_discovery(adapter, IDLE_DISCOV_TIMEOUT * 2);
1984 #ifdef __TIZEN_PATCH__
1985 static void start_le_discovery_complete(uint8_t status, uint16_t length,
1986 const void *param, void *user_data)
1988 struct btd_adapter *adapter = user_data;
1989 const struct mgmt_cp_start_discovery *rp = param;
1991 DBG("status 0x%02x", status);
1992 if (length < sizeof(*rp)) {
1993 error("Wrong size of start discovery return parameters");
1997 if (status == MGMT_STATUS_SUCCESS) {
1998 adapter->discovery_type |= rp->type;
1999 adapter->discovery_enable = 0x01;
2001 DBG("Discovery Type 0x%02x", rp->type);
2003 if (adapter->le_discovering)
2006 adapter->le_discovering = true;
2007 g_dbus_emit_property_changed(dbus_conn, adapter->path,
2008 ADAPTER_INTERFACE, "LEDiscovering");
2012 adapter->le_discovering = false;
2013 g_dbus_emit_property_changed(dbus_conn, adapter->path,
2014 ADAPTER_INTERFACE, "LEDiscovering");
2019 * In case the restart of the discovery failed, then just trigger
2020 * it for the next idle timeout again.
2022 // trigger_start_discovery(adapter, IDLE_LE_DISCOV_TIMEOUT * 2);
2026 static gboolean start_discovery_timeout(gpointer user_data)
2028 struct btd_adapter *adapter = user_data;
2029 #ifdef __TIZEN_PATCH__
2030 struct mgmt_cp_start_discovery cp;
2031 uint8_t new_type = 0;
2033 struct mgmt_cp_start_service_discovery *sd_cp;
2039 adapter->discovery_idle_timeout = 0;
2041 #ifdef __TIZEN_PATCH__
2042 if (adapter->disc_type == BT_DISC_TYPE_BREDR_ONLY) {
2044 if (adapter->current_settings & MGMT_SETTING_BREDR)
2045 new_type = (1 << BDADDR_BREDR);
2049 } else if (adapter->disc_type == BT_DISC_TYPE_LE_ONLY) {
2051 if (adapter->current_settings & MGMT_SETTING_LE)
2052 new_type = (1 << BDADDR_LE_PUBLIC) | (1 << BDADDR_LE_RANDOM);
2054 } else if (adapter->disc_type == BT_DISC_TYPE_LE_BREDR) {
2056 if (adapter->current_settings & MGMT_SETTING_BREDR)
2057 new_type = (1 << BDADDR_BREDR);
2060 if (adapter->current_settings & MGMT_SETTING_LE)
2061 new_type |= (1 << BDADDR_LE_PUBLIC) | (1 << BDADDR_LE_RANDOM);
2064 if (adapter->discovery_enable == 0x01) {
2066 * If there is an already running discovery and it has the
2067 * same type, then just keep it.
2069 if (adapter->disc_type == BT_DISC_TYPE_BREDR_ONLY) {
2070 if ((adapter->discovery_type & new_type) == 0x01) {
2071 if (adapter->discovering)
2074 adapter->discovering = true;
2075 g_dbus_emit_property_changed(dbus_conn, adapter->path,
2076 ADAPTER_INTERFACE, "Discovering");
2081 } else if (adapter->disc_type == BT_DISC_TYPE_LE_ONLY) {
2082 if ((adapter->discovery_type & new_type) == 0x06) {
2083 if (adapter->le_discovering)
2086 adapter->le_discovering = true;
2087 g_dbus_emit_property_changed(dbus_conn, adapter->path,
2088 ADAPTER_INTERFACE, "LEDiscovering");
2095 DBG("adapter->disc_type [%d]", adapter->disc_type);
2096 if (adapter->disc_type == BT_DISC_TYPE_BREDR_ONLY) {
2098 mgmt_send(adapter->mgmt, MGMT_OP_START_DISCOVERY,
2099 adapter->dev_id, sizeof(cp), &cp,
2100 start_discovery_complete, adapter, NULL);
2102 } else if (adapter->disc_type == BT_DISC_TYPE_LE_ONLY) {
2104 mgmt_send(adapter->mgmt, MGMT_OP_START_LE_DISCOVERY,
2105 adapter->dev_id, sizeof(cp), &cp,
2106 start_le_discovery_complete, adapter, NULL);
2109 /* If we're doing filtered discovery, it must be quickly restarted */
2110 adapter->no_scan_restart_delay = !!adapter->current_discovery_filter;
2112 DBG("adapter->current_discovery_filter == %d",
2113 !!adapter->current_discovery_filter);
2115 new_type = get_scan_type(adapter);
2117 if (adapter->discovery_enable == 0x01) {
2118 struct mgmt_cp_stop_discovery cp;
2121 * If we're asked to start regular discovery, and there is an
2122 * already running regular discovery and it has the same type,
2123 * then just keep it.
2125 if (!adapter->current_discovery_filter &&
2126 !adapter->filtered_discovery &&
2127 adapter->discovery_type == new_type) {
2128 if (adapter->discovering)
2131 adapter->discovering = true;
2132 g_dbus_emit_property_changed(dbus_conn, adapter->path,
2133 ADAPTER_INTERFACE, "Discovering");
2138 * Otherwise the current discovery must be stopped. So
2139 * queue up a stop discovery command.
2141 * This can happen if a passive scanning for Low Energy
2142 * devices is ongoing, or scan type is changed between
2143 * regular and filtered, or filter was updated.
2145 cp.type = adapter->discovery_type;
2146 mgmt_send(adapter->mgmt, MGMT_OP_STOP_DISCOVERY,
2147 adapter->dev_id, sizeof(cp), &cp,
2150 /* Don't even bother to try to quickly start discovery
2151 * just after stopping it, it would fail with status
2152 * MGMT_BUSY. Instead discovering_callback will take
2159 /* Regular discovery is required */
2160 if (!adapter->current_discovery_filter) {
2161 struct mgmt_cp_start_discovery cp;
2164 mgmt_send(adapter->mgmt, MGMT_OP_START_DISCOVERY,
2165 adapter->dev_id, sizeof(cp), &cp,
2166 start_discovery_complete, adapter, NULL);
2170 /* Filtered discovery is required */
2171 sd_cp = adapter->current_discovery_filter;
2173 DBG("sending MGMT_OP_START_SERVICE_DISCOVERY %d, %d, %d",
2174 sd_cp->rssi, sd_cp->type, sd_cp->uuid_count);
2176 mgmt_send(adapter->mgmt, MGMT_OP_START_SERVICE_DISCOVERY,
2177 adapter->dev_id, sizeof(*sd_cp) + sd_cp->uuid_count * 16,
2178 sd_cp, start_discovery_complete, adapter, NULL);
2185 static void trigger_start_discovery(struct btd_adapter *adapter, guint delay)
2190 cancel_passive_scanning(adapter);
2192 if (adapter->discovery_idle_timeout > 0) {
2193 g_source_remove(adapter->discovery_idle_timeout);
2194 adapter->discovery_idle_timeout = 0;
2198 * If the controller got powered down in between, then ensure
2199 * that we do not keep trying to restart discovery.
2201 * This is safe-guard and should actually never trigger.
2203 if (!(adapter->current_settings & MGMT_SETTING_POWERED))
2206 #ifdef __TIZEN_PATCH__
2208 start_discovery_timeout((gpointer)adapter);
2212 adapter->discovery_idle_timeout = g_timeout_add_seconds(delay,
2213 start_discovery_timeout, adapter);
2216 #ifndef __TIZEN_PATCH__
2217 static void suspend_discovery_complete(uint8_t status, uint16_t length,
2218 const void *param, void *user_data)
2220 struct btd_adapter *adapter = user_data;
2222 DBG("status 0x%02x", status);
2224 if (status == MGMT_STATUS_SUCCESS) {
2225 #ifdef __TIZEN_PATCH__
2226 adapter->discovery_type &= (~0x01);
2228 adapter->discovery_type = 0x00;
2230 adapter->discovery_enable = 0x00;
2235 #ifdef __TIZEN_PATCH__
2236 static void suspend_le_discovery_complete(uint8_t status, uint16_t length,
2237 const void *param, void *user_data)
2239 struct btd_adapter *adapter = user_data;
2241 DBG("status 0x%02x", status);
2243 if (status == MGMT_STATUS_SUCCESS) {
2244 adapter->discovery_type &= (~0x06);
2245 adapter->discovery_enable = 0x00;
2251 static void suspend_discovery(struct btd_adapter *adapter)
2253 struct mgmt_cp_stop_discovery cp;
2254 #ifdef __TIZEN_PATCH__
2255 struct mgmt_cp_stop_le_discovery le_cp;
2260 adapter->discovery_suspended = true;
2263 * If there are no clients discovering right now, then there is
2264 * also nothing to suspend.
2266 #ifdef __TIZEN_PATCH__
2267 if (adapter->discovery_list == NULL && adapter->le_discovery_list == NULL )
2270 if (!adapter->discovery_list)
2276 * In case of being inside the idle phase, make sure to remove
2277 * the timeout to not trigger a restart.
2279 * The restart will be triggered when the discovery is resumed.
2281 if (adapter->discovery_idle_timeout > 0) {
2282 g_source_remove(adapter->discovery_idle_timeout);
2283 adapter->discovery_idle_timeout = 0;
2286 if (adapter->discovery_enable == 0x00)
2289 #ifdef __TIZEN_PATCH__
2290 if (adapter->discovery_list) {
2292 mgmt_send(adapter->mgmt, MGMT_OP_STOP_DISCOVERY,
2293 adapter->dev_id, sizeof(cp), &cp,
2294 suspend_discovery_complete, adapter, NULL);
2296 if (adapter->le_discovery_list) {
2298 mgmt_send(adapter->mgmt, MGMT_OP_STOP_LE_DISCOVERY,
2299 adapter->dev_id, sizeof(le_cp), &le_cp,
2300 suspend_le_discovery_complete, adapter, NULL);
2303 cp.type = adapter->discovery_type;
2305 mgmt_send(adapter->mgmt, MGMT_OP_STOP_DISCOVERY,
2306 adapter->dev_id, sizeof(cp), &cp,
2307 suspend_discovery_complete, adapter, NULL);
2311 static void resume_discovery(struct btd_adapter *adapter)
2315 adapter->discovery_suspended = false;
2318 * If there are no clients discovering right now, then there is
2319 * also nothing to resume.
2321 if (!adapter->discovery_list)
2325 * Treat a suspended discovery session the same as extra long
2326 * idle time for a normal discovery. So just trigger the default
2327 * restart procedure.
2329 #ifdef __TIZEN_PATCH__
2330 adapter->disc_type = BT_DISC_TYPE_BREDR_ONLY;
2332 trigger_start_discovery(adapter, IDLE_DISCOV_TIMEOUT);
2335 #ifdef __TIZEN_PATCH__
2336 static void resume_le_discovery(struct btd_adapter *adapter)
2340 adapter->discovery_suspended = false;
2343 * If there are no clients discovering right now, then there is
2344 * also nothing to resume.
2346 if (adapter->le_discovery_list == NULL)
2350 * Treat a suspended discovery session the same as extra long
2351 * idle time for a normal discovery. So just trigger the default
2352 * restart procedure.
2354 adapter->disc_type = BT_DISC_TYPE_LE_ONLY;
2355 trigger_start_discovery(adapter, IDLE_LE_DISCOV_TIMEOUT);
2360 static void discovering_callback(uint16_t index, uint16_t length,
2361 const void *param, void *user_data)
2363 const struct mgmt_ev_discovering *ev = param;
2364 struct btd_adapter *adapter = user_data;
2366 if (length < sizeof(*ev)) {
2367 btd_error(adapter->dev_id, "Too small discovering event");
2371 DBG("hci%u type %u discovering %u method %d", adapter->dev_id, ev->type,
2372 ev->discovering, adapter->filtered_discovery);
2374 #ifdef __TIZEN_PATCH__
2375 DBG("info discov_type %d", adapter->discovery_type);
2376 if (ev->type == DISCOV_TYPE_BREDR) {
2377 if (ev->discovering == FALSE) {
2378 hci_clear_bit(BDADDR_BREDR, &adapter->discovery_type);
2379 adapter->discovering = false;
2381 hci_set_bit(BDADDR_BREDR, &adapter->discovery_type);
2382 adapter->discovering = true;
2384 g_dbus_emit_property_changed(dbus_conn, adapter->path,
2385 ADAPTER_INTERFACE, "Discovering");
2387 } else if (ev->type == DISCOV_TYPE_LE) {
2388 if (ev->discovering == FALSE) {
2389 hci_clear_bit(BDADDR_LE_PUBLIC, &adapter->discovery_type);
2390 hci_clear_bit(BDADDR_LE_RANDOM, &adapter->discovery_type);
2391 adapter->le_discovering = false;
2393 hci_set_bit(BDADDR_LE_PUBLIC, &adapter->discovery_type);
2394 hci_set_bit(BDADDR_LE_RANDOM, &adapter->discovery_type);
2395 adapter->le_discovering = true;
2398 g_dbus_emit_property_changed(dbus_conn, adapter->path,
2399 ADAPTER_INTERFACE, "LEDiscovering");
2402 if (adapter->discovery_enable == ev->discovering)
2405 adapter->discovery_type = ev->type;
2406 adapter->discovery_enable = ev->discovering;
2410 * Check for existing discoveries triggered by client applications
2411 * and ignore all others.
2413 * If there are no clients, then it is good idea to trigger a
2414 * passive scanning attempt.
2416 #ifdef __TIZEN_PATCH__
2417 if (adapter->discovery_list == NULL && adapter->le_discovery_list == NULL) {
2418 if (!adapter->connect_le)
2419 trigger_passive_scanning(adapter);
2423 if (!adapter->discovery_list) {
2424 if (!adapter->connect_le)
2425 trigger_passive_scanning(adapter);
2430 if (adapter->discovery_suspended)
2433 switch (adapter->discovery_enable) {
2435 if (adapter->no_scan_restart_delay)
2436 trigger_start_discovery(adapter, 0);
2438 trigger_start_discovery(adapter, IDLE_DISCOV_TIMEOUT);
2442 if (adapter->discovery_idle_timeout > 0) {
2443 g_source_remove(adapter->discovery_idle_timeout);
2444 adapter->discovery_idle_timeout = 0;
2451 #ifdef __TIZEN_PATCH__
2452 static void stop_discovery_complete(uint8_t status, uint16_t length,
2453 const void *param, void *user_data)
2455 struct btd_adapter *adapter = user_data;
2457 DBG("status 0x%02x", status);
2459 if (status == MGMT_STATUS_SUCCESS) {
2460 adapter->discovery_type &= (~0x01);
2461 DBG("Discovery Type 0x%02x", adapter->discovery_type);
2463 adapter->filtered_discovery = false;
2464 adapter->no_scan_restart_delay = false;
2465 adapter->discovering = false;
2466 g_dbus_emit_property_changed(dbus_conn, adapter->path,
2467 ADAPTER_INTERFACE, "Discovering");
2469 if (adapter->discovery_list == NULL && adapter->le_discovery_list == NULL) {
2470 adapter->discovery_enable = 0x00;
2471 trigger_passive_scanning(adapter);
2476 static void stop_le_discovery_complete(uint8_t status, uint16_t length,
2477 const void *param, void *user_data)
2479 struct btd_adapter *adapter = user_data;
2481 DBG("status 0x%02x", status);
2483 if (status == MGMT_STATUS_SUCCESS) {
2484 adapter->discovery_type &= (~0x06);
2485 DBG("Discovery Type 0x%02x", adapter->discovery_type);
2487 adapter->filtered_discovery = false;
2488 adapter->no_scan_restart_delay = false;
2489 adapter->le_discovering = false;
2490 g_dbus_emit_property_changed(dbus_conn, adapter->path,
2491 ADAPTER_INTERFACE, "LEDiscovering");
2493 if (adapter->discovery_list == NULL && adapter->le_discovery_list == NULL) {
2494 adapter->discovery_enable = 0x00;
2495 trigger_passive_scanning(adapter);
2502 static void stop_discovery_complete(uint8_t status, uint16_t length,
2503 const void *param, void *user_data)
2505 struct btd_adapter *adapter = user_data;
2507 DBG("status 0x%02x", status);
2509 if (status == MGMT_STATUS_SUCCESS) {
2510 adapter->discovery_type = 0x00;
2511 adapter->discovery_enable = 0x00;
2512 adapter->filtered_discovery = false;
2513 adapter->no_scan_restart_delay = false;
2514 adapter->discovering = false;
2515 g_dbus_emit_property_changed(dbus_conn, adapter->path,
2516 ADAPTER_INTERFACE, "Discovering");
2518 trigger_passive_scanning(adapter);
2524 static int compare_sender(gconstpointer a, gconstpointer b)
2526 const struct watch_client *client = a;
2527 const char *sender = b;
2529 return g_strcmp0(client->owner, sender);
2532 static void invalidate_rssi_and_tx_power(gpointer a)
2534 struct btd_device *dev = a;
2536 device_set_rssi(dev, 0);
2537 device_set_tx_power(dev, 127);
2540 static void discovery_cleanup(struct btd_adapter *adapter)
2542 g_slist_free_full(adapter->discovery_found,
2543 invalidate_rssi_and_tx_power);
2544 adapter->discovery_found = NULL;
2547 #ifndef __TIZEN_PATCH__
2548 static gboolean remove_temp_devices(gpointer user_data)
2550 struct btd_adapter *adapter = user_data;
2553 DBG("%s", adapter->path);
2555 adapter->temp_devices_timeout = 0;
2557 for (l = adapter->devices; l != NULL; l = next) {
2558 struct btd_device *dev = l->data;
2560 next = g_slist_next(l);
2562 if (device_is_temporary(dev) && !btd_device_is_connected(dev))
2563 btd_adapter_remove_device(adapter, dev);
2570 static gint g_strcmp(gconstpointer a, gconstpointer b)
2572 return strcmp(a, b);
2575 static void extract_unique_uuids(gpointer data, gpointer user_data)
2577 char *uuid_str = data;
2578 GSList **uuids = user_data;
2580 if (!g_slist_find_custom(*uuids, uuid_str, g_strcmp))
2581 *uuids = g_slist_insert_sorted(*uuids, uuid_str, g_strcmp);
2585 * This method merges all adapter filters into rssi, transport and uuids.
2586 * Returns 1 if there was no filtered scan, 0 otherwise.
2588 static int merge_discovery_filters(struct btd_adapter *adapter, int *rssi,
2589 uint8_t *transport, GSList **uuids)
2592 bool empty_uuid = false;
2593 bool has_regular_discovery = false;
2594 bool has_filtered_discovery = false;
2596 for (l = adapter->discovery_list; l != NULL; l = g_slist_next(l)) {
2597 struct watch_client *client = l->data;
2598 struct discovery_filter *item = client->discovery_filter;
2601 has_regular_discovery = true;
2605 has_filtered_discovery = true;
2607 *transport |= item->type;
2610 * Rule for merging rssi and pathloss into rssi field of kernel
2611 * filter is as follow:
2612 * - if there's any client without proximity filter, then do no
2613 * proximity filtering,
2614 * - if all clients specified RSSI, then use lowest value,
2615 * - if any client specified pathloss, then kernel filter should
2616 * do no proximity, as kernel can't compute pathloss. We'll do
2617 * filtering on our own.
2619 if (item->rssi == DISTANCE_VAL_INVALID)
2620 *rssi = HCI_RSSI_INVALID;
2621 else if (*rssi != HCI_RSSI_INVALID && *rssi >= item->rssi)
2623 else if (item->pathloss != DISTANCE_VAL_INVALID)
2624 *rssi = HCI_RSSI_INVALID;
2626 if (!g_slist_length(item->uuids))
2629 g_slist_foreach(item->uuids, extract_unique_uuids, uuids);
2632 /* If no proximity filtering is set, disable it */
2633 if (*rssi == DISTANCE_VAL_INVALID)
2634 *rssi = HCI_RSSI_INVALID;
2637 * Empty_uuid variable determines wether there was any filter with no
2638 * uuids. In this case someone might be looking for all devices in
2639 * certain proximity, and we need to have empty uuids in kernel filter.
2642 g_slist_free(*uuids);
2646 if (has_regular_discovery) {
2647 if (!has_filtered_discovery)
2651 * It there is both regular and filtered scan running, then
2652 * clear whole fitler to report all devices.
2654 *transport = get_scan_type(adapter);
2655 *rssi = HCI_RSSI_INVALID;
2656 g_slist_free(*uuids);
2663 static void populate_mgmt_filter_uuids(uint8_t (*mgmt_uuids)[16], GSList *uuids)
2667 for (l = uuids; l != NULL; l = g_slist_next(l)) {
2668 bt_uuid_t uuid, u128;
2671 bt_string_to_uuid(&uuid, l->data);
2672 bt_uuid_to_uuid128(&uuid, &u128);
2674 ntoh128((uint128_t *) u128.value.u128.data, &uint128);
2675 htob128(&uint128, (uint128_t *) mgmt_uuids);
2682 * This method merges all adapter filters into one that will be send to kernel.
2683 * cp_ptr is set to null when regular non-filtered discovery is needed,
2684 * otherwise it's pointing to filter. Returns 0 on succes, -1 on error
2686 static int discovery_filter_to_mgmt_cp(struct btd_adapter *adapter,
2687 struct mgmt_cp_start_service_discovery **cp_ptr)
2689 GSList *uuids = NULL;
2690 struct mgmt_cp_start_service_discovery *cp;
2691 int rssi = DISTANCE_VAL_INVALID;
2693 uint8_t discovery_type = 0;
2697 if (merge_discovery_filters(adapter, &rssi, &discovery_type, &uuids)) {
2698 /* There are only regular scans, run just regular scan. */
2703 uuid_count = g_slist_length(uuids);
2705 cp = g_try_malloc(sizeof(*cp) + 16*uuid_count);
2708 g_slist_free(uuids);
2712 cp->type = discovery_type;
2714 cp->uuid_count = uuid_count;
2715 populate_mgmt_filter_uuids(cp->uuids, uuids);
2717 g_slist_free(uuids);
2721 static bool filters_equal(struct mgmt_cp_start_service_discovery *a,
2722 struct mgmt_cp_start_service_discovery *b) {
2726 if ((!a && b) || (a && !b))
2729 if (a->type != b->type)
2732 if (a->rssi != b->rssi)
2736 * When we create mgmt_cp_start_service_discovery structure inside
2737 * discovery_filter_to_mgmt_cp, we always keep uuids sorted, and
2738 * unique, so we're safe to compare uuid_count, and uuids like that.
2740 if (a->uuid_count != b->uuid_count)
2743 if (memcmp(a->uuids, b->uuids, 16 * a->uuid_count) != 0)
2749 static void update_discovery_filter(struct btd_adapter *adapter)
2751 struct mgmt_cp_start_service_discovery *sd_cp;
2755 if (discovery_filter_to_mgmt_cp(adapter, &sd_cp)) {
2756 btd_error(adapter->dev_id,
2757 "discovery_filter_to_mgmt_cp returned error");
2762 * If filters are equal, then don't update scan, except for when
2763 * starting discovery.
2765 if (filters_equal(adapter->current_discovery_filter, sd_cp) &&
2766 adapter->discovering != 0) {
2767 DBG("filters were equal, deciding to not restart the scan.");
2772 g_free(adapter->current_discovery_filter);
2773 adapter->current_discovery_filter = sd_cp;
2775 trigger_start_discovery(adapter, 0);
2778 static void discovery_destroy(void *user_data)
2780 struct watch_client *client = user_data;
2781 struct btd_adapter *adapter = client->adapter;
2783 DBG("owner %s", client->owner);
2785 adapter->set_filter_list = g_slist_remove(adapter->set_filter_list,
2788 adapter->discovery_list = g_slist_remove(adapter->discovery_list,
2791 if (client->discovery_filter) {
2792 free_discovery_filter(client->discovery_filter);
2793 client->discovery_filter = NULL;
2796 g_free(client->owner);
2800 * If there are other client discoveries in progress, then leave
2801 * it active. If not, then make sure to stop the restart timeout.
2804 #ifdef __TIZEN_PATCH__
2805 if (adapter->discovery_list || adapter->le_discovery_list)
2808 if (adapter->discovery_list)
2812 adapter->discovery_type = 0x00;
2814 if (adapter->discovery_idle_timeout > 0) {
2815 g_source_remove(adapter->discovery_idle_timeout);
2816 adapter->discovery_idle_timeout = 0;
2819 if (adapter->temp_devices_timeout > 0) {
2820 g_source_remove(adapter->temp_devices_timeout);
2821 adapter->temp_devices_timeout = 0;
2824 discovery_cleanup(adapter);
2825 #ifndef __TIZEN_PATCH__
2826 adapter->temp_devices_timeout = g_timeout_add_seconds(TEMP_DEV_TIMEOUT,
2827 remove_temp_devices, adapter);
2832 * Returns true if client was already discovering, false otherwise. *client
2833 * will point to discovering client, or client that have pre-set his filter.
2835 static bool get_discovery_client(struct btd_adapter *adapter,
2837 struct watch_client **client)
2839 GSList *list = g_slist_find_custom(adapter->discovery_list, owner,
2842 *client = list->data;
2846 list = g_slist_find_custom(adapter->set_filter_list, owner,
2849 *client = list->data;
2858 #ifdef __TIZEN_PATCH__
2859 static void le_discovery_destroy(void *user_data)
2861 struct watch_client *client = user_data;
2862 struct btd_adapter *adapter = client->adapter;
2864 DBG("owner %s", client->owner);
2866 adapter->le_discovery_list = g_slist_remove(adapter->le_discovery_list,
2869 g_free(client->owner);
2873 * If there are other client discoveries in progress, then leave
2874 * it active. If not, then make sure to stop the restart timeout.
2876 DBG("adapter->discovery_list[%p] adapter->le_discovery_list[%p]",
2877 adapter->discovery_list, adapter->le_discovery_list);
2878 if (adapter->discovery_list || adapter->le_discovery_list)
2881 adapter->discovery_type = 0x00;
2882 DBG("Restart Timer... adapter->discovery_type[%d]", adapter->discovery_type);
2883 if (adapter->discovery_idle_timeout > 0) {
2884 g_source_remove(adapter->discovery_idle_timeout);
2885 adapter->discovery_idle_timeout = 0;
2888 if (adapter->temp_devices_timeout > 0) {
2889 g_source_remove(adapter->temp_devices_timeout);
2890 adapter->temp_devices_timeout = 0;
2893 discovery_cleanup(adapter);
2894 #ifndef __TIZEN_PATCH__
2895 adapter->temp_devices_timeout = g_timeout_add_seconds(TEMP_DEV_TIMEOUT,
2896 remove_temp_devices, adapter);
2901 static void discovery_disconnect(DBusConnection *conn, void *user_data)
2903 struct watch_client *client = user_data;
2904 struct btd_adapter *adapter = client->adapter;
2905 struct mgmt_cp_stop_discovery cp;
2907 DBG("owner %s", client->owner);
2909 adapter->set_filter_list = g_slist_remove(adapter->set_filter_list,
2912 adapter->discovery_list = g_slist_remove(adapter->discovery_list,
2916 * There is no need for extra cleanup of the client since that
2917 * will be done by the destroy callback.
2919 * However in case this is the last client, the discovery in
2920 * the kernel needs to be disabled.
2922 if (adapter->discovery_list) {
2923 update_discovery_filter(adapter);
2928 * In the idle phase of a discovery, there is no need to stop it
2929 * and so it is enough to send out the signal and just return.
2931 if (adapter->discovery_enable == 0x00) {
2932 adapter->discovering = false;
2933 g_dbus_emit_property_changed(dbus_conn, adapter->path,
2934 ADAPTER_INTERFACE, "Discovering");
2936 #ifdef __TIZEN_PATCH__
2937 if (adapter->discovering == false && adapter->le_discovering == false) {
2938 trigger_passive_scanning(adapter);
2942 trigger_passive_scanning(adapter);
2947 #ifdef __TIZEN_PATCH__
2950 cp.type = adapter->discovery_type;
2953 mgmt_send(adapter->mgmt, MGMT_OP_STOP_DISCOVERY,
2954 adapter->dev_id, sizeof(cp), &cp,
2955 stop_discovery_complete, adapter, NULL);
2958 #ifdef __TIZEN_PATCH__
2959 static void le_discovery_disconnect(DBusConnection *conn, void *user_data)
2961 struct watch_client *client = user_data;
2962 struct btd_adapter *adapter = client->adapter;
2963 struct mgmt_cp_stop_le_discovery cp;
2965 DBG("owner %s", client->owner);
2967 adapter->le_discovery_list = g_slist_remove(adapter->le_discovery_list,
2971 * There is no need for extra cleanup of the client since that
2972 * will be done by the destroy callback.
2974 * However in case this is the last client, the discovery in
2975 * the kernel needs to be disabled.
2977 if (adapter->le_discovery_list)
2981 * In the idle phase of a discovery, there is no need to stop it
2982 * and so it is enough to send out the signal and just return.
2984 if (adapter->discovery_enable == 0x00) {
2985 adapter->le_discovering = false;
2986 g_dbus_emit_property_changed(dbus_conn, adapter->path,
2987 ADAPTER_INTERFACE, "LEDiscovering");
2989 if (adapter->discovering == false && adapter->le_discovering == false) {
2990 trigger_passive_scanning(adapter);
2997 mgmt_send(adapter->mgmt, MGMT_OP_STOP_LE_DISCOVERY,
2998 adapter->dev_id, sizeof(cp), &cp,
2999 stop_discovery_complete, adapter, NULL);
3003 static DBusMessage *start_discovery(DBusConnection *conn,
3004 DBusMessage *msg, void *user_data)
3006 struct btd_adapter *adapter = user_data;
3007 const char *sender = dbus_message_get_sender(msg);
3008 struct watch_client *client;
3009 bool is_discovering;
3011 DBG("sender %s", sender);
3013 if (!(adapter->current_settings & MGMT_SETTING_POWERED))
3014 return btd_error_not_ready(msg);
3016 is_discovering = get_discovery_client(adapter, sender, &client);
3019 * Every client can only start one discovery, if the client
3020 * already started a discovery then return an error.
3023 return btd_error_busy(msg);
3026 * If there was pre-set filter, just reconnect it to discovery_list,
3030 adapter->set_filter_list = g_slist_remove(
3031 adapter->set_filter_list, client);
3032 adapter->discovery_list = g_slist_prepend(
3033 adapter->discovery_list, client);
3034 update_discovery_filter(adapter);
3035 return dbus_message_new_method_return(msg);
3038 client = g_new0(struct watch_client, 1);
3040 client->adapter = adapter;
3041 client->owner = g_strdup(sender);
3042 client->discovery_filter = NULL;
3043 client->watch = g_dbus_add_disconnect_watch(dbus_conn, sender,
3044 discovery_disconnect, client,
3046 adapter->discovery_list = g_slist_prepend(adapter->discovery_list,
3049 #ifdef __TIZEN_PATCH__
3050 adapter->disc_type = BT_DISC_TYPE_BREDR_ONLY;
3054 * Just trigger the discovery here. In case an already running
3055 * discovery in idle phase exists, it will be restarted right
3058 update_discovery_filter(adapter);
3060 return dbus_message_new_method_return(msg);
3063 #ifdef __TIZEN_PATCH__
3064 static int set_adv_data_flag(uint8_t *adv_data, uint8_t *data, int data_len)
3067 adv_data[1] = EIR_FLAGS;
3068 adv_data[2] = EIR_GEN_DISC;
3070 memcpy(adv_data + 3, data, data_len);
3071 return data_len + 3;
3074 static int set_adv_data_device_name(uint8_t *adv_data, int adv_len, char *name)
3080 uint8_t *data = NULL;
3085 data = g_memdup(adv_data, adv_len);
3089 name_len = strlen(name);
3091 for (i = 0; i <adv_len ; i++) {
3093 ad_type = data[i + 1];
3095 if (ad_type == EIR_NAME_COMPLETE) {
3096 /* Move to last position and update local name */
3097 for (j = i; j < adv_len - 2; j++)
3098 adv_data[j] = data[j + 2];
3100 adv_data[j] = name_len + 1;
3101 if (name_len > ADV_DATA_MAX_LENGTH - adv_len) {
3102 adv_data[j] = ADV_DATA_MAX_LENGTH - adv_len + 1;
3103 adv_data[j + 1] = EIR_NAME_SHORT;
3104 memcpy(adv_data + j + 2, name, ADV_DATA_MAX_LENGTH - adv_len);
3106 return ADV_DATA_MAX_LENGTH;
3108 adv_data[j + 1] = EIR_NAME_COMPLETE;
3109 memcpy(adv_data + j + 2, name, name_len);
3111 return adv_len + name_len;
3115 memcpy(adv_data + i, &data[i], ad_len + 1);
3124 static int set_adv_data_tx_power(uint8_t *adv_data, int adv_len, int8_t tx_power)
3129 uint8_t *data = NULL;
3131 data = g_memdup(adv_data, adv_len);
3135 for (i = 0; i <adv_len ; i++) {
3137 ad_type = data[i + 1];
3139 if (ad_type == EIR_TX_POWER) {
3141 adv_data[i + 1] = EIR_TX_POWER;
3142 adv_data[i + 2] = tx_power;
3144 for(j = i + 2; j < adv_len; j++)
3145 adv_data[j + 1] = data[j];
3150 memcpy(adv_data + i, &data[i], ad_len + 1);
3160 int adapter_le_set_missed_adv_data(uint8_t *p_data, uint8_t data_len,
3161 gboolean is_scan_rsp, char *adapter_name, int8_t tx_power, uint8_t **adv_data, int *adv_len)
3166 data = g_malloc0(ADV_DATA_MAX_LENGTH);
3167 /* Fix : NULL_RETURNS */
3172 memcpy(data, p_data, data_len);
3175 /* In case multi advertising, need to update the below AD type
3176 since it handled into kernel */
3178 len = set_adv_data_flag(data, p_data, data_len);
3181 len = set_adv_data_tx_power(data, len, tx_power);
3183 len = set_adv_data_device_name(data, len, adapter_name);
3190 static DBusMessage *adapter_start_custom_discovery(DBusConnection *conn,
3191 DBusMessage *msg, void *user_data)
3193 struct btd_adapter *adapter = user_data;
3194 const char *sender = dbus_message_get_sender(msg);
3195 struct watch_client *client;
3197 const gchar *disc_type;
3199 DBG("sender %s", sender);
3201 if (!(adapter->current_settings & MGMT_SETTING_POWERED))
3202 return btd_error_not_ready(msg);
3204 if (!dbus_message_get_args(msg, NULL, DBUS_TYPE_STRING, &disc_type,
3205 DBUS_TYPE_INVALID)) {
3206 return btd_error_invalid_args(msg);
3209 DBG("discovery type = %s", disc_type);
3211 /*Valid strings: "BREDR", "LE", "LE_BREDR" */
3212 if (g_strcmp0(disc_type, "BREDR") == 0)
3213 adapter->disc_type = BT_DISC_TYPE_BREDR_ONLY;
3214 else if (g_strcmp0(disc_type, "LE") == 0)
3215 adapter->disc_type = BT_DISC_TYPE_LE_ONLY;
3216 else if (g_strcmp0(disc_type, "LE_BREDR") == 0)
3217 adapter->disc_type = BT_DISC_TYPE_LE_BREDR;
3219 return btd_error_invalid_args(msg);
3222 * Every client can only start one discovery, if the client
3223 * already started a discovery then return an error.
3225 list = g_slist_find_custom(adapter->discovery_list, sender,
3228 return btd_error_busy(msg);
3230 client = g_new0(struct watch_client, 1);
3232 client->adapter = adapter;
3233 client->owner = g_strdup(sender);
3234 client->watch = g_dbus_add_disconnect_watch(dbus_conn, sender,
3235 discovery_disconnect, client,
3238 adapter->discovery_list = g_slist_prepend(adapter->discovery_list,
3242 * Just trigger the discovery here. In case an already running
3243 * discovery in idle phase exists, it will be restarted right
3246 trigger_start_discovery(adapter, 0);
3248 return dbus_message_new_method_return(msg);
3251 static DBusMessage *adapter_start_le_discovery(DBusConnection *conn,
3252 DBusMessage *msg, void *user_data)
3254 struct btd_adapter *adapter = user_data;
3255 const char *sender = dbus_message_get_sender(msg);
3256 struct watch_client *client;
3259 DBG("sender %s", sender);
3261 if (!(adapter->current_settings & MGMT_SETTING_POWERED))
3262 return btd_error_not_ready(msg);
3265 * Every client can only start one discovery, if the client
3266 * already started a discovery then return an error.
3269 adapter->disc_type = BT_DISC_TYPE_LE_ONLY;
3270 DBG("adapter->disc_type[%d]", adapter->disc_type);
3271 DBG("adapter->discovery_type [%d]", adapter->discovery_type);
3273 list = g_slist_find_custom(adapter->le_discovery_list, sender,
3276 return btd_error_busy(msg);
3278 client = g_new0(struct watch_client, 1);
3280 client->adapter = adapter;
3281 client->owner = g_strdup(sender);
3282 client->watch = g_dbus_add_disconnect_watch(dbus_conn, sender,
3283 le_discovery_disconnect, client,
3284 le_discovery_destroy);
3286 adapter->le_discovery_list = g_slist_prepend(adapter->le_discovery_list,
3290 * Just trigger the discovery here. In case an already running
3291 * discovery in idle phase exists, it will be restarted right
3294 trigger_start_discovery(adapter, 0);
3296 return dbus_message_new_method_return(msg);
3299 static DBusMessage *adapter_stop_le_discovery(DBusConnection *conn,
3300 DBusMessage *msg, void *user_data)
3302 struct btd_adapter *adapter = user_data;
3303 const char *sender = dbus_message_get_sender(msg);
3304 struct mgmt_cp_stop_le_discovery cp;
3305 struct watch_client *client;
3308 DBG("sender %s", sender);
3310 if (!(adapter->current_settings & MGMT_SETTING_POWERED))
3311 return btd_error_not_ready(msg);
3313 list = g_slist_find_custom(adapter->le_discovery_list, sender,
3316 return btd_error_failed(msg, "No discovery started");
3318 client = list->data;
3320 adapter->disc_type = BT_DISC_TYPE_LE_ONLY;
3321 DBG("adapter->disc_type[%d]", adapter->disc_type);
3322 DBG("adapter->discovery_type [%d]", adapter->discovery_type);
3324 cp.type = adapter->discovery_type;
3325 DBG("cp.type %d", cp.type);
3328 * The destroy function will cleanup the client information and
3329 * also remove it from the list of discovery clients.
3331 g_dbus_remove_watch(dbus_conn, client->watch);
3334 * As long as other discovery clients are still active, just
3337 DBG("cp.type %d", cp.type);
3338 DBG("adapter->le_discovery_list %d", adapter->discovery_type);
3339 if (adapter->le_discovery_list)
3340 return dbus_message_new_method_return(msg);
3343 * In the idle phase of a discovery, there is no need to stop it
3344 * and so it is enough to send out the signal and just return.
3346 DBG("cp.type %d", cp.type);
3347 DBG("adapter->discovery_enable %d", adapter->discovery_enable);
3348 if (adapter->discovery_enable == 0x00) {
3349 adapter->le_discovering = false;
3350 g_dbus_emit_property_changed(dbus_conn, adapter->path,
3351 ADAPTER_INTERFACE, "LEDiscovering");
3353 trigger_passive_scanning(adapter);
3355 return dbus_message_new_method_return(msg);
3357 DBG("adapter->discovery_type %d", adapter->discovery_type);
3359 DBG("cp.type %d", cp.type);
3360 mgmt_send(adapter->mgmt, MGMT_OP_STOP_LE_DISCOVERY,
3361 adapter->dev_id, sizeof(cp), &cp,
3362 stop_le_discovery_complete, adapter, NULL);
3364 return dbus_message_new_method_return(msg);
3367 static DBusMessage *adapter_set_advertising(DBusConnection *conn,
3368 DBusMessage *msg, void *data)
3370 struct btd_adapter *adapter = data;
3372 dbus_bool_t enable = FALSE;
3373 dbus_int32_t slot_id;
3375 DBG("adapter_set_advertising");
3377 if (!(adapter->current_settings & MGMT_SETTING_POWERED))
3378 return btd_error_not_ready(msg);
3380 if (!dbus_message_get_args(msg, NULL, DBUS_TYPE_BOOLEAN, &enable,
3381 DBUS_TYPE_INT32, &slot_id,
3383 return btd_error_invalid_args(msg);
3385 if (adapter_le_is_supported_multi_advertising() && slot_id > 0)
3386 err = adapter_le_enable_multi_adv(enable, slot_id);
3388 err = set_mode(adapter, MGMT_OP_SET_ADVERTISING, enable);
3391 return btd_error_failed(msg, "Set Advertising failed");
3394 create_advertiser(adapter, slot_id);
3396 if (err && slot_id > 0)
3397 advertising_state_changed(adapter, slot_id, enable);
3399 return dbus_message_new_method_return(msg);
3402 static DBusMessage *adapter_set_advertising_params(DBusConnection *conn,
3403 DBusMessage *msg, void *data)
3405 struct btd_adapter *adapter = data;
3406 struct mgmt_cp_set_advertising_params cp;
3407 dbus_uint32_t interval_min;
3408 dbus_uint32_t interval_max;
3409 dbus_uint32_t filter_policy;
3411 dbus_int32_t slot_id;
3414 DBG("Set customised advertising parameters");
3416 if (!(adapter->current_settings & MGMT_SETTING_POWERED))
3417 return btd_error_not_ready(msg);
3419 if (!dbus_message_get_args(msg, NULL,
3420 DBUS_TYPE_UINT32, &interval_min,
3421 DBUS_TYPE_UINT32, &interval_max,
3422 DBUS_TYPE_UINT32, &filter_policy,
3423 DBUS_TYPE_UINT32, &type,
3424 DBUS_TYPE_INT32, &slot_id,
3426 return btd_error_invalid_args(msg);
3428 memset(&cp, 0, sizeof(cp));
3430 DBG("advertising interval min %x, max %x, filter %x type %x",
3431 interval_min, interval_max, filter_policy, type);
3433 if (filter_policy > 0x03)
3434 return btd_error_invalid_args(msg);
3437 return btd_error_invalid_args(msg);
3439 if (adapter_le_is_supported_multi_advertising() && slot_id > 0) {
3440 adapter_le_adv_inst_info_t *p_inst;
3441 adapter_le_adv_param_t *p_params;
3443 p_inst = malloc(sizeof(adapter_le_adv_inst_info_t));
3444 p_params = malloc(sizeof(adapter_le_adv_param_t));
3445 memset(p_inst, 0, sizeof(adapter_le_adv_inst_info_t));
3446 memset(p_params, 0, sizeof(adapter_le_adv_param_t));
3447 p_inst->inst_id = slot_id;
3448 p_params->adv_int_min = interval_min;
3449 p_params->adv_int_max = interval_max;
3450 p_params->adv_type = type;
3451 p_params->channel_map = 0x07; /* fixed channel :: will be used all */
3452 p_params->adv_filter_policy = filter_policy;
3453 p_params->tx_power = BLE_ADV_TX_POWER_MID; /* TODO:need to optimize */
3454 if (adapter->le_static_addr.b[5] != 0) {
3455 p_inst->bdaddr_type = 0x01;
3456 bacpy(&p_inst->bdaddr, &adapter->le_static_addr);
3458 p_inst->bdaddr_type = 0x00;
3459 bacpy(&p_inst->bdaddr, &adapter->bdaddr);
3462 ret = adapter_le_set_multi_adv_params(p_inst, p_params);
3468 return dbus_message_new_method_return(msg);
3470 return btd_error_failed(msg, "set advertising param failed");
3472 cp.interval_max = interval_max;
3473 cp.interval_min = interval_min;
3474 cp.filter_policy = filter_policy;
3477 if (mgmt_send(adapter->mgmt, MGMT_OP_SET_ADVERTISING_PARAMS,
3478 adapter->dev_id, sizeof(cp), &cp,
3479 NULL, NULL, NULL) > 0)
3480 return dbus_message_new_method_return(msg);
3482 return btd_error_failed(msg, "set advertising param failed");
3486 static DBusMessage *adapter_set_advertising_data(DBusConnection *conn,
3487 DBusMessage *msg, void *data)
3489 struct btd_adapter *adapter = data;
3490 struct mgmt_cp_set_advertising_data cp;
3493 dbus_int32_t slot_id;
3494 uint8_t *adv_data = NULL;
3497 DBG("Set advertising data");
3499 if (!(adapter->current_settings & MGMT_SETTING_POWERED))
3500 return btd_error_not_ready(msg);
3502 if (!dbus_message_get_args(msg, NULL,
3503 DBUS_TYPE_ARRAY, DBUS_TYPE_BYTE, &value, &len,
3504 DBUS_TYPE_INT32, &slot_id,
3506 return btd_error_invalid_args(msg);
3508 if (len > ADV_DATA_MAX_LENGTH - 3)
3509 return btd_error_invalid_args(msg);
3511 adapter_le_set_missed_adv_data(value, len, FALSE,
3512 adapter->name, adapter->adv_tx_power, &adv_data, &adv_len);
3514 if (adapter_le_is_supported_multi_advertising() && slot_id > 0) {
3515 if (adapter_le_set_multi_adv_data(slot_id, FALSE, adv_len, adv_data)) {
3517 return dbus_message_new_method_return(msg);
3520 return btd_error_failed(msg, "set advertising data failed");
3523 memcpy(&cp, adv_data, adv_len);
3525 if (mgmt_send(adapter->mgmt, MGMT_OP_SET_ADVERTISING_DATA,
3526 adapter->dev_id, adv_len,
3527 &cp, NULL, NULL, NULL) > 0) {
3529 return dbus_message_new_method_return(msg);
3533 return btd_error_failed(msg, "set advertising data failed");
3537 static DBusMessage *adapter_le_scan_filter_param_setup(DBusConnection *conn,
3538 DBusMessage *msg, void *data)
3540 struct btd_adapter *adapter = data;
3542 dbus_int32_t client_if, action, filt_index;
3543 dbus_int32_t feat_seln, list_logic_type, filt_logic_type;
3544 dbus_int32_t rssi_high_thres, rssi_low_thres, dely_mode;
3545 dbus_int32_t found_timeout, lost_timeout, found_timeout_cnt;
3546 adapter_le_scan_filter_param_t params;
3548 DBG("adapter_le_scan_filter_param_setup");
3550 if (!(adapter->current_settings & MGMT_SETTING_POWERED))
3551 return btd_error_not_ready(msg);
3553 if (adapter_le_get_scan_filter_size() == 0)
3554 return btd_error_not_supported(msg);
3556 if (!dbus_message_get_args(msg, NULL, DBUS_TYPE_INT32, &client_if,
3557 DBUS_TYPE_INT32, &action,
3558 DBUS_TYPE_INT32, &filt_index,
3559 DBUS_TYPE_INT32, &feat_seln,
3560 DBUS_TYPE_INT32, &list_logic_type,
3561 DBUS_TYPE_INT32, &filt_logic_type,
3562 DBUS_TYPE_INT32, &rssi_high_thres,
3563 DBUS_TYPE_INT32, &rssi_low_thres,
3564 DBUS_TYPE_INT32, &dely_mode,
3565 DBUS_TYPE_INT32, &found_timeout,
3566 DBUS_TYPE_INT32, &lost_timeout,
3567 DBUS_TYPE_INT32, &found_timeout_cnt,
3569 return btd_error_invalid_args(msg);
3571 memset(¶ms, 0, sizeof(params));
3573 params.action = action;
3574 params.index = filt_index;
3575 params.feature = feat_seln;
3576 params.filter_logic_type = filt_logic_type;
3577 params.list_logic_type = list_logic_type;
3578 params.delivery_mode = dely_mode;
3579 params.rssi_high_threshold = rssi_high_thres;
3581 if (params.delivery_mode == ON_FOUND) {
3582 params.rssi_low_threshold = rssi_low_thres;
3583 params.onfound_timeout = found_timeout;
3584 params.onfound_timeout_cnt = found_timeout_cnt;
3585 params.onlost_timeout = lost_timeout;
3588 err = adapter_le_set_scan_filter_params(¶ms);
3591 return btd_error_failed(msg, "Failed to scan filter param setup");
3593 return dbus_message_new_method_return(msg);
3596 static DBusMessage *adapter_le_scan_filter_add_remove(DBusConnection *conn,
3597 DBusMessage *msg, void *data)
3599 struct btd_adapter *adapter = data;
3600 struct btd_device *dev;
3603 dbus_int32_t client_if, action, filt_type, filt_index;
3604 dbus_int32_t company_id, company_id_mask;
3606 char ida_string[18];
3607 dbus_uint32_t address_type;
3608 uint8_t *p_uuid, *p_uuid_mask, *p_data, *p_mask;
3609 int32_t uuid_len = 0, uuid_mask_len = 0, data_len = 0, mask_len = 0;
3611 DBG("adapter_le_scan_filter_add_remove");
3613 if (!(adapter->current_settings & MGMT_SETTING_POWERED))
3614 return btd_error_not_ready(msg);
3616 if (adapter_le_get_scan_filter_size() == 0)
3617 return btd_error_not_supported(msg);
3619 if (!dbus_message_get_args(msg, NULL, DBUS_TYPE_INT32, &client_if,
3620 DBUS_TYPE_INT32, &action,
3621 DBUS_TYPE_INT32, &filt_type,
3622 DBUS_TYPE_INT32, &filt_index,
3623 DBUS_TYPE_INT32, &company_id,
3624 DBUS_TYPE_INT32, &company_id_mask,
3625 DBUS_TYPE_ARRAY, DBUS_TYPE_BYTE, &p_uuid, &uuid_len,
3626 DBUS_TYPE_ARRAY, DBUS_TYPE_BYTE, &p_uuid_mask, &uuid_mask_len,
3627 DBUS_TYPE_STRING, &string,
3628 DBUS_TYPE_UINT32, &address_type,
3629 DBUS_TYPE_ARRAY, DBUS_TYPE_BYTE, &p_data, &data_len,
3630 DBUS_TYPE_ARRAY, DBUS_TYPE_BYTE, &p_mask, &mask_len,
3632 return btd_error_invalid_args(msg);
3634 DBG("addr %s, type %d", string, address_type);
3636 str2ba(string, &bdaddr);
3638 dev = btd_adapter_find_device(adapter, &bdaddr, address_type);
3639 if (dev && device_get_rpa_exist(dev) == true) {
3640 ba2str(device_get_address(dev), ida_string);
3641 if (btd_device_get_bdaddr_type(dev) == BDADDR_LE_PUBLIC)
3646 memcpy(ida_string, string, sizeof(ida_string));
3649 err = adapter_le_set_scan_filter_data(client_if, action, filt_type,
3650 filt_index, company_id, company_id_mask,
3651 uuid_len, p_uuid, uuid_mask_len, p_uuid_mask,
3652 ida_string, address_type, data_len, p_data, mask_len, p_mask);
3655 return btd_error_failed(msg, "Failed to add/remove filter");
3657 return dbus_message_new_method_return(msg);
3660 static DBusMessage *adapter_le_scan_filter_clear(DBusConnection *conn,
3661 DBusMessage *msg, void *data)
3663 struct btd_adapter *adapter = data;
3665 dbus_int32_t client_if;
3666 dbus_int32_t filt_index;
3668 DBG("adapter_le_scan_filter_clear");
3670 if (!(adapter->current_settings & MGMT_SETTING_POWERED))
3671 return btd_error_not_ready(msg);
3673 if (adapter_le_get_scan_filter_size() == 0)
3674 return btd_error_not_supported(msg);
3676 if (!dbus_message_get_args(msg, NULL, DBUS_TYPE_INT32, &client_if,
3677 DBUS_TYPE_INT32, &filt_index,
3679 return btd_error_invalid_args(msg);
3681 err = adapter_le_clear_scan_filter_data(client_if, filt_index);
3684 return btd_error_failed(msg, "Failed to clear filter");
3686 return dbus_message_new_method_return(msg);
3690 static DBusMessage *adapter_le_scan_filter_enable(DBusConnection *conn,
3691 DBusMessage *msg, void *data)
3693 struct btd_adapter *adapter = data;
3695 dbus_bool_t enable = FALSE;
3696 dbus_int32_t client_if;
3698 DBG("adapter_le_scan_filter_enable");
3700 if (!(adapter->current_settings & MGMT_SETTING_POWERED))
3701 return btd_error_not_ready(msg);
3703 if (adapter_le_get_scan_filter_size() == 0)
3704 return btd_error_not_supported(msg);
3706 if (!dbus_message_get_args(msg, NULL, DBUS_TYPE_INT32, &client_if,
3707 DBUS_TYPE_BOOLEAN, &enable,
3709 return btd_error_invalid_args(msg);
3711 err = adapter_le_enable_scan_filtering(enable);
3714 return btd_error_failed(msg, "Failed to enable scan filtering");
3716 return dbus_message_new_method_return(msg);
3719 static DBusMessage *adapter_le_set_scan_params(DBusConnection *conn,
3720 DBusMessage *msg, void *data)
3722 struct btd_adapter *adapter = data;
3723 struct mgmt_cp_le_set_scan_params cp;
3728 DBG("Set scan parameters");
3730 if (!(adapter->current_settings & MGMT_SETTING_POWERED))
3731 return btd_error_not_ready(msg);
3733 if (!dbus_message_get_args(msg, NULL,
3734 DBUS_TYPE_UINT32, &type,
3735 DBUS_TYPE_UINT32, &interval,
3736 DBUS_TYPE_UINT32, &window,
3738 return btd_error_invalid_args(msg);
3740 DBG("scan type %x, interval %x, window %x",
3741 type, interval, window);
3742 memset(&cp, 0, sizeof(cp));
3745 cp.interval = interval;
3748 if (mgmt_send(adapter->mgmt, MGMT_OP_LE_SET_SCAN_PARAMS,
3749 adapter->dev_id, sizeof(cp), &cp,
3750 NULL, NULL, NULL) > 0)
3751 return dbus_message_new_method_return(msg);
3753 return btd_error_failed(msg, "set scan parameters failed");
3756 static DBusMessage *adapter_set_scan_rsp_data(DBusConnection *conn,
3757 DBusMessage *msg, void *data)
3759 struct btd_adapter *adapter = data;
3760 struct mgmt_cp_set_scan_rsp_data cp;
3763 dbus_int32_t slot_id;
3764 uint8_t *adv_data = NULL;
3767 DBG("Set scan response data");
3769 if (!(adapter->current_settings & MGMT_SETTING_POWERED))
3770 return btd_error_not_ready(msg);
3772 if (!dbus_message_get_args(msg, NULL,
3773 DBUS_TYPE_ARRAY, DBUS_TYPE_BYTE, &value, &len,
3774 DBUS_TYPE_INT32, &slot_id,
3776 return btd_error_invalid_args(msg);
3778 if (len > SCAN_RESPONSE_DATA_LENGTH_MAX)
3779 return btd_error_invalid_args(msg);
3781 adapter_le_set_missed_adv_data(value, len, TRUE,
3782 adapter->name, adapter->adv_tx_power, &adv_data, &adv_len);
3784 if (adapter_le_is_supported_multi_advertising() && slot_id > 0) {
3785 if (adapter_le_set_multi_adv_data(slot_id, TRUE, adv_len, (uint8_t *)adv_data)) {
3787 return dbus_message_new_method_return(msg);
3790 return btd_error_failed(msg, "set advertising data failed");
3793 memcpy(&cp, adv_data, adv_len);
3795 if (mgmt_send(adapter->mgmt, MGMT_OP_SET_SCAN_RSP_DATA,
3796 adapter->dev_id, adv_len, &cp,
3797 NULL, NULL, NULL) > 0) {
3799 return dbus_message_new_method_return(msg);
3803 return btd_error_failed(msg, "set scan reponse data failed");
3807 static DBusMessage *adapter_add_device_white_list(DBusConnection *conn,
3808 DBusMessage *msg, void *data)
3810 struct btd_adapter *adapter = data;
3811 struct mgmt_cp_add_dev_white_list cp;
3812 const gchar *address;
3814 dbus_uint32_t address_type;
3815 struct btd_device *dev;
3817 DBG("Add device whie list");
3818 if (dbus_message_get_args(msg, NULL,
3819 DBUS_TYPE_STRING, &address,
3820 DBUS_TYPE_UINT32, &address_type,
3821 DBUS_TYPE_INVALID) == FALSE)
3822 return btd_error_invalid_args(msg);
3824 if (check_address(address) < 0)
3825 return btd_error_invalid_args(msg);
3827 if (!(adapter->current_settings & MGMT_SETTING_POWERED))
3828 return btd_error_not_ready(msg);
3831 DBG("addr %s, type %d", address, address_type);
3832 str2ba(address, &bdaddr);
3834 dev = btd_adapter_find_device(adapter, &bdaddr, address_type);
3835 if (dev && device_get_rpa_exist(dev) == true) {
3836 if (adapter_le_is_supported_offloading() == FALSE) {
3837 error("Spec based command is not supported yet");
3838 return btd_error_not_supported(msg);
3841 /* Add IRK value to list */
3842 if (adapter_le_add_irk_to_list(device_get_irk_value(dev),
3843 device_get_address(dev),
3844 btd_device_get_bdaddr_type(dev))) {
3845 return dbus_message_new_method_return(msg);
3847 return btd_error_failed(msg, "Add LE IRK to list failed");
3851 memset(&cp, 0, sizeof(cp));
3853 cp.bdaddr_type = address_type;
3854 memcpy(&cp.bdaddr, &bdaddr, sizeof(bdaddr_t));
3856 if (mgmt_send(adapter->mgmt, MGMT_OP_ADD_DEV_WHITE_LIST,
3857 adapter->dev_id, sizeof(cp), &cp,
3858 NULL, NULL, NULL) > 0)
3859 return dbus_message_new_method_return(msg);
3861 return btd_error_failed(msg, "add device white list failed");
3864 static DBusMessage *adapter_remove_device_white_list(DBusConnection *conn,
3865 DBusMessage *msg, void *data)
3867 struct btd_adapter *adapter = data;
3868 struct mgmt_cp_remove_dev_white_list cp;
3869 const gchar *address;
3871 dbus_uint32_t address_type;
3872 struct btd_device *dev;
3874 DBG("Remove device whie list");
3876 if (!(adapter->current_settings & MGMT_SETTING_POWERED))
3877 return btd_error_not_ready(msg);
3879 if (dbus_message_get_args(msg, NULL,
3880 DBUS_TYPE_STRING, &address,
3881 DBUS_TYPE_UINT32, &address_type,
3882 DBUS_TYPE_INVALID) == FALSE)
3883 return btd_error_invalid_args(msg);
3885 if (check_address(address) < 0)
3886 return btd_error_invalid_args(msg);
3888 DBG("addr %s, type %d", address, address_type);
3889 str2ba(address, &bdaddr);
3891 dev = btd_adapter_find_device(adapter, &bdaddr, address_type);
3892 if (dev && device_get_rpa_exist(dev) == true) {
3893 if (adapter_le_is_supported_offloading() == FALSE) {
3894 error("Spec based command is not supported yet");
3895 return btd_error_not_supported(msg);
3898 /* Remove IRK value to list */
3899 if (adapter_le_remove_irk_to_list(device_get_address(dev),
3900 btd_device_get_bdaddr_type(dev))) {
3901 return dbus_message_new_method_return(msg);
3903 return btd_error_failed(msg, "Remove LE IRK to list failed");
3907 memset(&cp, 0, sizeof(cp));
3909 cp.bdaddr_type = address_type;
3910 memcpy(&cp.bdaddr, &bdaddr, sizeof(bdaddr_t));
3912 if (mgmt_send(adapter->mgmt, MGMT_OP_REMOVE_DEV_FROM_WHITE_LIST,
3913 adapter->dev_id, sizeof(cp), &cp,
3914 NULL, NULL, NULL) > 0)
3915 return dbus_message_new_method_return(msg);
3917 return btd_error_failed(msg, "remove device white list failed");
3920 static DBusMessage *adapter_clear_device_white_list(DBusConnection *conn,
3921 DBusMessage *msg, void *data)
3923 struct btd_adapter *adapter = data;
3925 DBG("Clear device whie list");
3927 if (!(adapter->current_settings & MGMT_SETTING_POWERED))
3928 return btd_error_not_ready(msg);
3930 if (mgmt_send(adapter->mgmt, MGMT_OP_CLEAR_DEV_WHITE_LIST,
3931 adapter->dev_id, 0, NULL,
3932 NULL, NULL, NULL) > 0)
3933 return dbus_message_new_method_return(msg);
3935 return btd_error_failed(msg, "clear white list failed");
3938 static DBusMessage *adapter_set_le_privacy(DBusConnection *conn,
3939 DBusMessage *msg, void *data)
3941 struct btd_adapter *adapter = data;
3943 dbus_bool_t enable_privacy = FALSE;
3945 if (!(adapter->supported_settings & MGMT_SETTING_PRIVACY))
3946 return btd_error_not_supported(msg);
3948 if (!dbus_message_get_args(msg, NULL, DBUS_TYPE_BOOLEAN,
3949 &enable_privacy, DBUS_TYPE_INVALID))
3950 return btd_error_invalid_args(msg);
3952 if (enable_privacy) {
3953 if (adapter->current_settings & MGMT_SETTING_PRIVACY)
3954 return btd_error_already_exists(msg);
3956 if (!(adapter->current_settings & MGMT_SETTING_PRIVACY))
3957 return btd_error_already_exists(msg);
3960 err = set_privacy(adapter, enable_privacy);
3963 return btd_error_failed(msg, "Set Le Privacy failed");
3965 return dbus_message_new_method_return(msg);
3968 static void set_le_static_address(struct btd_adapter *adapter)
3973 char dirname[PATH_MAX];
3975 snprintf(dirname, PATH_MAX, STORAGEDIR "/%s", "le_static_addr");
3976 if (access(dirname, F_OK) < 0) {
3978 bdaddr_t le_static_addr;
3980 le_static_addr.b[5] = adapter->bdaddr.b[5] | 0xc0;
3981 for (i = 0; i < 5; i++) {
3982 le_static_addr.b[i] =
3983 (adapter->bdaddr.b[i] & 0x7f) << 1 |
3984 (adapter->bdaddr.b[i] & 0x80) >> 7;
3988 * < How to get Public address from above static address >
3990 * for (i = 0; i < 5; i++) {
3992 * (adapter->le_static_addr.b[i] & 0xfe) >> 1 |
3993 * (adapter->le_static_addr.b[i] & 0x01) << 7;
3995 * bredr_addr.b[5] = {the value from advertising data}
3998 fd = open(dirname, O_WRONLY | O_CREAT, 0644);
4000 ba2str(&le_static_addr, address);
4001 DBG("LE static random : %s", address);
4002 ret = write(fd, address, strlen(address));
4004 error("Cannot save LE address : %s",
4009 error("Cannot save LE address");
4011 bacpy(&adapter->le_static_addr, &le_static_addr);
4013 fd = open(dirname, O_RDONLY);
4015 ret = read(fd, address, sizeof(address));
4017 /* xx:xx:xx:xx:xx:xx */
4019 DBG("LE static random : %s", address);
4020 str2ba(address, &adapter->le_static_addr);
4021 adapter->le_static_addr.b[5] |= 0xc0;
4023 error("Invalid LE address");
4026 error("Cannot get LE address");
4033 static void set_le_static_address_complete(uint8_t status, uint16_t length,
4034 const void *param, void *user_data)
4036 struct btd_adapter *adapter = user_data;
4038 DBG("index %u status 0x%02x", adapter->dev_id, status);
4040 if (status != MGMT_STATUS_SUCCESS) {
4041 error("Failed to set static address for index %u: %s (0x%02x)",
4042 adapter->dev_id, mgmt_errstr(status), status);
4043 if (adapter->le_static_addr.b[5] != 0)
4044 bacpy(&adapter->le_static_addr, BDADDR_ANY);
4046 set_le_static_address(adapter);
4053 static DBusMessage *adapter_set_le_static_address(DBusConnection *conn,
4054 DBusMessage *msg, void *data)
4056 struct btd_adapter *adapter = data;
4057 dbus_bool_t is_enable = FALSE;
4058 struct mgmt_cp_set_static_address cp;
4060 if (!(adapter->supported_settings & MGMT_OP_SET_STATIC_ADDRESS)) {
4061 error("LE static address is not supported");
4062 return btd_error_not_supported(msg);
4065 if (!dbus_message_get_args(msg, NULL, DBUS_TYPE_BOOLEAN, &is_enable,
4066 DBUS_TYPE_INVALID)) {
4067 error("Invalid arguments");
4068 return btd_error_invalid_args(msg);
4071 memset(&cp, 0x00, sizeof(cp));
4073 if (adapter->le_static_addr.b[5] != 0) {
4074 DBG("LE static address is already configured");
4075 return dbus_message_new_method_return(msg);
4077 set_le_static_address(adapter);
4078 bacpy(&cp.bdaddr, &adapter->le_static_addr);
4080 if (adapter->le_static_addr.b[5] == 0) {
4081 DBG("LE static address is not configured");
4082 return dbus_message_new_method_return(msg);
4084 bacpy(&adapter->le_static_addr, BDADDR_ANY);
4086 DBG("Set static random address : %d", is_enable);
4088 if (mgmt_send(mgmt_master, MGMT_OP_SET_STATIC_ADDRESS, adapter->dev_id,
4090 set_le_static_address_complete, adapter, NULL) <= 0) {
4091 error("Failed to set static address : %d", is_enable);
4093 bacpy(&adapter->le_static_addr, BDADDR_ANY);
4095 set_le_static_address(adapter);
4096 return btd_error_failed(msg, "Unable to set static address");
4099 return dbus_message_new_method_return(msg);
4103 static void read_sec_conn_host_support_complete(uint8_t status, uint16_t length,
4104 const void *param, void *user_data)
4106 const struct mgmt_rp_read_sec_conn_host_support *rp = param;
4107 struct btd_adapter *adapter = user_data;
4109 if (status != MGMT_STATUS_SUCCESS) {
4110 error("Failed to read secure conn parameter: %s (0x%02x)",
4111 mgmt_errstr(status), status);
4115 if (length < sizeof(*rp)) {
4116 error("Wrong size of read secure connections host support");
4120 if (rp->sec_conn_host_support)
4121 adapter->secure_connection = TRUE;
4123 adapter->secure_connection = FALSE;
4125 g_dbus_emit_property_changed(dbus_conn, adapter->path,
4126 ADAPTER_INTERFACE, "SecureConnection");
4129 static DBusMessage *read_sec_conn_host_support(DBusConnection *conn,
4130 DBusMessage *msg, void *user_data)
4132 struct btd_adapter *adapter = user_data;
4134 mgmt_send(adapter->mgmt, MGMT_OP_READ_SEC_CONN_HOST_SUPPORT,
4135 adapter->dev_id, 0, NULL,
4136 read_sec_conn_host_support_complete, adapter, NULL);
4138 return dbus_message_new_method_return(msg);
4141 static void write_sec_conn_host_support_complete(uint8_t status,
4142 uint16_t length, const void *param, void *user_data)
4144 const struct mgmt_rp_write_sec_conn_host_support *rp = param;
4145 if (status != MGMT_STATUS_SUCCESS) {
4146 error("Failed to write secure connections host \
4147 support parameter: %s (0x%02x)",
4148 mgmt_errstr(status), status);
4152 if (length < sizeof(*rp)) {
4153 error("Wrong size of write secure connections host\
4154 support parameter");
4159 static DBusMessage *write_sec_conn_host_support(DBusConnection *conn,
4160 DBusMessage *msg, void *user_data)
4163 struct mgmt_cp_write_sec_conn_host_support cp;
4164 dbus_bool_t enable = FALSE;
4165 struct btd_adapter *adapter = user_data;
4167 if (!dbus_message_get_args(msg, NULL, DBUS_TYPE_BOOLEAN,
4168 &enable, DBUS_TYPE_INVALID))
4169 return btd_error_invalid_args(msg);
4171 memset(&cp, 0, sizeof(cp));
4172 cp.secure_connection_host_support = enable;
4173 mgmt_send(adapter->mgmt, MGMT_OP_WRITE_SEC_CONN_HOST_SUPPORT,
4174 adapter->dev_id, sizeof(cp), &cp,
4175 write_sec_conn_host_support_complete,
4177 return dbus_message_new_method_return(msg);
4181 static DBusMessage *adapter_enable_rssi(DBusConnection *conn,
4182 DBusMessage *msg, void *data)
4184 struct btd_adapter *adapter = data;
4185 struct mgmt_cp_set_enable_rssi cp;
4186 struct mgmt_cp_disable_rssi cp_dis;
4187 bdaddr_t bt_addr = { { 0, } };
4188 const gchar *address = NULL;
4190 const char *sender = dbus_message_get_sender(msg);
4191 dbus_int32_t link_type;
4192 dbus_int32_t low_threshold;
4193 dbus_int32_t in_range_threshold;
4194 dbus_int32_t high_threshold;
4196 DBG("Enable RSSI called");
4197 DBG("sender %s", sender);
4198 if (!(adapter->current_settings & MGMT_SETTING_POWERED))
4199 return btd_error_not_ready(msg);
4201 if (!dbus_message_get_args(msg, NULL,
4202 DBUS_TYPE_STRING, &address,
4203 DBUS_TYPE_INT32, &link_type,
4204 DBUS_TYPE_INT32, &low_threshold,
4205 DBUS_TYPE_INT32, &in_range_threshold,
4206 DBUS_TYPE_INT32, &high_threshold,
4208 return btd_error_invalid_args(msg);
4210 DBG("Enable RSSI: [%s %d %d %d %d]", address, link_type,
4211 low_threshold, in_range_threshold, high_threshold);
4213 DBG("BT address [%s]", address);
4214 memset(&bt_addr, 0, sizeof(bdaddr_t));
4215 str2ba(address, &bt_addr);
4216 memset(&cp, 0, sizeof(struct mgmt_cp_set_enable_rssi));
4217 memset(&cp_dis, 0, sizeof(struct mgmt_cp_disable_rssi));
4219 if (check_address(address) < 0)
4220 return btd_error_invalid_args(msg);
4222 // if (!btd_adapter_find_device(adapter, address))
4223 // return btd_error_not_found(msg);
4225 if (low_threshold == 0 && in_range_threshold == 0 && high_threshold == 0) {
4226 cp_dis.bdaddr = bt_addr;
4227 cp_dis.link_type = link_type;
4228 DBG("Disable Request");
4229 if (mgmt_send(adapter->mgmt, MGMT_OP_SET_RSSI_DISABLE,
4230 adapter->dev_id, sizeof(cp_dis), &cp_dis,
4231 NULL, NULL, NULL) > 0)
4232 return dbus_message_new_method_return(msg);
4234 cp.low_th = low_threshold;
4235 cp.in_range_th = in_range_threshold;
4236 cp.high_th = high_threshold;
4237 cp.bdaddr = bt_addr;
4238 cp.link_type = link_type;
4239 DBG("Enable Request");
4240 if (mgmt_send(adapter->mgmt, MGMT_OP_SET_RSSI_ENABLE,
4241 adapter->dev_id, sizeof(cp), &cp,
4242 NULL, NULL, NULL) > 0)
4243 return dbus_message_new_method_return(msg);
4245 return btd_error_failed(msg, "Enable/Disable RSSI Failed");
4248 static DBusMessage *adapter_get_rssi(DBusConnection *conn,
4249 DBusMessage *msg, void *data)
4251 struct btd_adapter *adapter = data;
4252 struct mgmt_cp_get_raw_rssi cp;
4254 const gchar *address = NULL;
4255 dbus_int32_t link_type;
4256 const char *sender = dbus_message_get_sender(msg);
4258 DBG("Get RSSI called");
4259 DBG("sender %s", sender);
4260 if (!(adapter->current_settings & MGMT_SETTING_POWERED))
4261 return btd_error_not_ready(msg);
4263 if (!dbus_message_get_args(msg, NULL,
4264 DBUS_TYPE_STRING, &address,
4265 DBUS_TYPE_INT32, &link_type,
4267 return btd_error_invalid_args(msg);
4269 DBG("BT address [%s] link type [%d]", address, link_type);
4270 memset(&bt_addr, 0, sizeof(bdaddr_t));
4271 str2ba(address, &bt_addr);
4272 memset(&cp, 0, sizeof(struct mgmt_cp_get_raw_rssi));
4274 if (check_address(address) < 0)
4275 return btd_error_invalid_args(msg);
4277 // if (!btd_adapter_find_device(adapter, address))
4278 // return btd_error_not_found(msg);
4280 memcpy(&(cp.bt_address), &bt_addr, sizeof(bdaddr_t));
4281 cp.link_type = link_type;
4282 DBG("RAW RSSI Request");
4283 if (mgmt_send(adapter->mgmt, MGMT_OP_GET_RAW_RSSI,
4284 adapter->dev_id, sizeof(cp), &cp,
4285 NULL, NULL, NULL) > 0)
4286 return dbus_message_new_method_return(msg);
4288 return btd_error_failed(msg, "Get Raw RSSI Failed");
4291 #if !defined(__SPRD_PATCH__)
4292 static void get_adv_tx_power_complete(uint8_t status, uint16_t length,
4293 const void *param, void *user_data)
4295 struct btd_adapter *adapter = user_data;
4296 const struct mgmt_rp_get_adv_tx_power *rp = param;
4298 if (status != MGMT_STATUS_SUCCESS) {
4299 error("Failed to get adv tx power: %s (0x%02x)",
4300 mgmt_errstr(status), status);
4304 if (length < sizeof(*rp)) {
4305 error("Wrong size of get adv tx power");
4309 adapter->adv_tx_power = rp->adv_tx_power;
4313 static void adapter_get_adv_tx_power(void *data)
4315 struct btd_adapter *adapter = data;
4317 mgmt_send(adapter->mgmt, MGMT_OP_GET_ADV_TX_POWER,
4318 adapter->dev_id, 0, NULL,
4319 get_adv_tx_power_complete, adapter, NULL);
4324 #ifdef __BROADCOM_PATCH__
4325 static DBusMessage *set_wbs_parameters(DBusConnection *conn,
4326 DBusMessage *msg, void *data)
4328 struct btd_adapter *adapter = data;
4329 const gchar *role = NULL;
4330 const gchar *address = NULL;
4331 struct mgmt_cp_set_voice_setting cp;
4332 bdaddr_t bt_addr = { { 0, } };
4336 if (!dbus_message_get_args(msg, NULL,
4337 DBUS_TYPE_STRING, &role,
4338 DBUS_TYPE_STRING, &address,
4339 DBUS_TYPE_INVALID)) {
4340 return btd_error_invalid_args(msg);
4343 DBG("Role = %s", role);
4344 DBG("Address = %s", address);
4346 memset(&cp, 0, sizeof(cp));
4348 cp.voice_setting = BT_VOICE_TRANSPARENT | BT_VOICE_CVSD_16BIT;
4350 if (g_strcmp0(role, "Handsfree") == 0)
4351 cp.sco_role = MGMT_SCO_ROLE_HANDSFREE;
4352 else if (g_strcmp0(role, "Gateway") == 0)
4353 cp.sco_role = MGMT_SCO_ROLE_AUDIO_GATEWAY;
4355 str2ba(address, &bt_addr);
4356 memcpy(&(cp.bdaddr), &bt_addr, sizeof(bdaddr_t));
4358 if (mgmt_send(adapter->mgmt, MGMT_OP_SET_VOICE_SETTING,
4359 adapter->dev_id, sizeof(cp), &cp,
4360 NULL, NULL, NULL) == 0)
4361 error("mgmt_send failed for voice setting");
4364 return dbus_message_new_method_return(msg);
4367 static DBusMessage *set_nb_parameters(DBusConnection *conn,
4368 DBusMessage *msg, void *data)
4370 struct btd_adapter *adapter = data;
4372 const gchar *address = NULL;
4373 struct mgmt_cp_set_voice_setting cp;
4374 bdaddr_t bt_addr = { { 0, } };
4378 if (!dbus_message_get_args(msg, NULL,
4379 DBUS_TYPE_STRING, &role,
4380 DBUS_TYPE_STRING, &address,
4381 DBUS_TYPE_INVALID)) {
4382 return btd_error_invalid_args(msg);
4385 DBG("Role = %s", role);
4386 DBG("Address = %s", address);
4388 memset(&cp, 0, sizeof(cp));
4390 cp.voice_setting = BT_VOICE_CVSD_16BIT;
4392 if (g_strcmp0(role, "Handsfree") == 0)
4393 cp.sco_role = MGMT_SCO_ROLE_HANDSFREE;
4394 else if (g_strcmp0(role, "Gateway") == 0)
4395 cp.sco_role = MGMT_SCO_ROLE_AUDIO_GATEWAY;
4397 str2ba(address, &bt_addr);
4398 memcpy(&(cp.bdaddr), &bt_addr, sizeof(bdaddr_t));
4400 if (mgmt_send(adapter->mgmt, MGMT_OP_SET_VOICE_SETTING,
4401 adapter->dev_id, sizeof(cp), &cp,
4402 NULL, NULL, NULL) == 0)
4403 error("mgmt_send failed for voice setting");
4407 return dbus_message_new_method_return(msg);
4409 #endif /* __BROADCOM_PATCH__ */
4411 #ifdef __TIZEN_PATCH__
4412 void btd_adapter_set_read_le_data_length_handler(
4413 struct btd_adapter *adapter,
4414 struct le_data_length_read_handler *handler)
4416 adapter->read_handler = handler;
4419 static void le_read_maximum_data_length_return_param_complete(
4420 uint8_t status, uint16_t length,
4421 const void *param, void *user_data)
4423 struct btd_adapter *adapter = user_data;
4424 const struct mgmt_rp_le_read_maximum_data_length *rp = param;
4425 uint16_t max_tx_octects, max_tx_time;
4426 uint16_t max_rx_octects, max_rx_time;
4428 if (status != MGMT_STATUS_SUCCESS) {
4429 error("le read maximum data length failed: %s (0x%02x)",
4430 mgmt_errstr(status), status);
4438 if (length < sizeof(*rp)) {
4439 error("Too small le read maximum data length response");
4440 g_free(adapter->read_handler);
4443 max_tx_octects = rp->max_tx_octets;
4444 max_tx_time =rp->max_tx_time;
4445 max_rx_octects = rp->max_rx_octets;
4446 max_rx_time = rp->max_rx_time;
4449 if (!adapter->read_handler ||
4450 !adapter->read_handler->read_callback) {
4451 g_free(adapter->read_handler);
4455 adapter->read_handler->read_callback(adapter,
4456 max_tx_octects, max_tx_time,
4457 max_rx_octects, max_rx_time,
4458 adapter->read_handler->user_data);
4460 g_free(adapter->read_handler);
4461 adapter->read_handler = NULL;
4464 int btd_adapter_le_read_maximum_data_length(
4465 struct btd_adapter *adapter)
4467 if (mgmt_send(adapter->mgmt,
4468 MGMT_OP_LE_READ_MAXIMUM_DATA_LENGTH,
4469 adapter->dev_id, 0, NULL,
4470 le_read_maximum_data_length_return_param_complete,
4477 static gint read_request_cmp(gconstpointer a, gconstpointer b)
4479 const struct le_data_length_read_request *data = a;
4480 const struct btd_adapter *adapter = b;
4482 return data->adapter != adapter;
4485 static struct le_data_length_read_request *find_read_le_data_length_request(
4486 struct btd_adapter *adapter)
4490 match = g_slist_find_custom(read_requests, adapter, read_request_cmp);
4498 static void le_read_data_length_complete(
4499 struct btd_adapter *adapter,
4500 uint16_t max_tx_octects, uint16_t max_tx_time,
4501 uint16_t max_rx_octects, uint16_t max_rx_time,
4505 struct le_data_length_read_request *read_request;
4507 read_request = find_read_le_data_length_request(adapter);
4511 reply = g_dbus_create_reply(read_request->msg,
4512 DBUS_TYPE_UINT16, &max_tx_octects,
4513 DBUS_TYPE_UINT16, &max_tx_time,
4514 DBUS_TYPE_UINT16, &max_rx_octects,
4515 DBUS_TYPE_UINT16, &max_rx_time,
4519 btd_error_failed(read_request->msg,
4520 "Failed to read max data length.");
4524 read_requests = g_slist_remove(read_requests, read_request);
4525 dbus_message_unref(read_request->msg);
4526 g_free(read_request);
4528 if (!g_dbus_send_message(dbus_conn, reply))
4529 error("D-Bus send failed");
4532 static DBusMessage *le_read_maximum_data_length(
4533 DBusConnection *conn, DBusMessage *msg,
4536 struct btd_adapter *adapter = user_data;
4537 struct le_data_length_read_request *read_request;
4538 struct le_data_length_read_handler *handler;
4540 if (find_read_le_data_length_request(adapter))
4541 return btd_error_in_progress(msg);
4543 if (btd_adapter_le_read_maximum_data_length(adapter))
4544 return btd_error_failed(msg, "Unable to read maximum le data length");
4546 read_request = g_new(struct le_data_length_read_request, 1);
4548 read_request->msg = dbus_message_ref(msg);
4549 read_request->adapter = adapter;
4551 read_requests = g_slist_append(read_requests, read_request);
4553 handler = g_new0(struct le_data_length_read_handler, 1);
4555 handler->read_callback =
4556 (read_max_data_length_cb_t)le_read_data_length_complete;
4558 btd_adapter_set_read_le_data_length_handler(
4559 read_request->adapter, handler);
4565 void le_write_host_suggested_data_length_return_param_complete(
4566 uint8_t status, uint16_t length,
4567 const void *param, void *user_data)
4569 if (status != MGMT_STATUS_SUCCESS) {
4570 error("le write host suggested data length failed: %s (0x%02x)",
4571 mgmt_errstr(status), status);
4577 static DBusMessage *le_write_host_suggested_default_data_length(
4578 DBusConnection *conn, DBusMessage *msg,
4581 struct btd_adapter *adapter = user_data;
4582 struct mgmt_cp_le_write_host_suggested_data_length cp;
4583 dbus_uint16_t def_tx_Octets;
4584 dbus_uint16_t def_tx_time;
4586 if (!(adapter->current_settings & MGMT_SETTING_POWERED))
4587 return btd_error_not_ready(msg);
4589 if (!dbus_message_get_args(msg, NULL,
4590 DBUS_TYPE_UINT16, &def_tx_Octets,
4591 DBUS_TYPE_UINT16, &def_tx_time,
4593 return btd_error_invalid_args(msg);
4595 memset(&cp, 0, sizeof(cp));
4596 cp.def_tx_octets = def_tx_Octets;
4597 cp.def_tx_time = def_tx_time;
4599 if (mgmt_send(adapter->mgmt,
4600 MGMT_OP_LE_WRITE_HOST_SUGGESTED_DATA_LENGTH,
4601 adapter->dev_id, sizeof(cp), &cp,
4602 le_write_host_suggested_data_length_return_param_complete,
4604 return dbus_message_new_method_return(msg);
4606 return btd_error_failed(msg, "Unable to write host suggested le data length values");
4609 static void le_read_suggested_default_data_length_return_param_complete(
4610 uint8_t status, uint16_t length,
4611 const void *param, void *user_data)
4613 struct btd_adapter *adapter = user_data;
4614 const struct mgmt_rp_le_read_host_suggested_data_length *rp = param;
4615 uint16_t def_tx_octects, def_tx_time;
4617 if (status != MGMT_STATUS_SUCCESS) {
4618 error("Read host suggested def le data length values failed: %s (0x%02x)",
4619 mgmt_errstr(status), status);
4625 if (length < sizeof(*rp)) {
4628 def_tx_octects = rp->def_tx_octets;
4629 def_tx_time =rp->def_tx_time;
4630 DBG("retrieving host suggested data length values %d %d", def_tx_octects, def_tx_time);
4633 if (!adapter->def_read_handler)
4636 if(!adapter->def_read_handler->read_callback) {
4640 adapter->def_read_handler->read_callback(adapter,
4641 def_tx_octects, def_tx_time,
4642 adapter->def_read_handler->user_data);
4644 if (adapter->def_read_handler)
4645 g_free(adapter->def_read_handler->user_data);
4647 g_free(adapter->def_read_handler);
4648 adapter->def_read_handler = NULL;
4651 int btd_adapter_le_read_suggested_default_data_length(
4652 struct btd_adapter *adapter)
4654 if (mgmt_send(adapter->mgmt,
4655 MGMT_OP_LE_READ_HOST_SUGGESTED_DATA_LENGTH,
4656 adapter->dev_id, 0, NULL,
4657 le_read_suggested_default_data_length_return_param_complete,
4658 adapter, NULL) > 0) {
4665 static void le_read_host_suggested_default_length_complete(
4666 struct btd_adapter *adapter,
4667 uint16_t def_tx_octects, uint16_t def_tx_time,
4671 struct le_data_length_read_request *read_request;
4673 read_request = find_read_le_data_length_request(adapter);
4677 reply = g_dbus_create_reply(read_request->msg,
4678 DBUS_TYPE_UINT16, &def_tx_octects,
4679 DBUS_TYPE_UINT16, &def_tx_time,
4683 btd_error_failed(read_request->msg,
4684 "Failed to read host suggested def data length values");
4688 read_requests = g_slist_remove(read_requests, read_request);
4689 dbus_message_unref(read_request->msg);
4690 g_free(read_request);
4692 if (!g_dbus_send_message(dbus_conn, reply))
4693 error("D-Bus send failed");
4696 static DBusMessage *le_read_host_suggested_default_data_length(
4697 DBusConnection *conn, DBusMessage *msg,
4700 struct btd_adapter *adapter = user_data;
4701 struct le_data_length_read_request *read_request;
4702 struct le_data_length_read_default_data_length_handler *handler;
4704 if (find_read_le_data_length_request(adapter))
4705 return btd_error_in_progress(msg);
4707 if (btd_adapter_le_read_suggested_default_data_length(adapter))
4708 return btd_error_failed(msg, "Unable to read host suggested def data length");
4710 read_request = g_new(struct le_data_length_read_request, 1);
4712 read_request->msg = dbus_message_ref(msg);
4713 read_request->adapter = adapter;
4715 read_requests = g_slist_append(read_requests, read_request);
4717 handler = g_new0(struct le_data_length_read_default_data_length_handler, 1);
4719 handler->read_callback =
4720 (read_host_suggested_default_data_length_cb_t)le_read_host_suggested_default_length_complete;
4722 read_request->adapter->def_read_handler = handler;
4727 void le_set_data_length_return_param_complete(
4728 uint8_t status, uint16_t length,
4729 const void *param, void *user_data)
4731 if (status != MGMT_STATUS_SUCCESS) {
4732 error("le_set_data_length failed: %s (0x%02x)",
4733 mgmt_errstr(status), status);
4739 int btd_adapter_le_set_data_length(struct btd_adapter *adapter, bdaddr_t *bdaddr,
4740 uint16_t max_tx_octets, uint16_t max_tx_time)
4742 struct mgmt_cp_le_set_data_length cp;
4744 memset(&cp, 0, sizeof(cp));
4746 bacpy(&cp.bdaddr, bdaddr);
4748 cp.max_tx_octets = max_tx_octets;
4749 cp.max_tx_time = max_tx_time;
4751 if (mgmt_send(adapter->mgmt, MGMT_OP_LE_SET_DATA_LENGTH,
4752 adapter->dev_id, sizeof(cp), &cp,
4753 le_set_data_length_return_param_complete,
4762 static DBusMessage *adapter_set_manufacturer_data(DBusConnection *conn,
4763 DBusMessage *msg, void *data)
4765 struct btd_adapter *adapter = data;
4766 struct mgmt_cp_set_manufacturer_data cp;
4770 DBG("Set manufacturer data");
4772 if (!(adapter->current_settings & MGMT_SETTING_POWERED))
4773 return btd_error_not_ready(msg);
4775 if (!dbus_message_get_args(msg, NULL,
4776 DBUS_TYPE_ARRAY, DBUS_TYPE_BYTE, &value, &len,
4778 return btd_error_invalid_args(msg);
4780 if (len > MANUFACTURER_DATA_LENGTH_MAX)
4781 return btd_error_invalid_args(msg);
4783 memcpy(&cp, value, len);
4785 if (mgmt_send(adapter->mgmt, MGMT_OP_SET_MANUFACTURER_DATA,
4786 adapter->dev_id, MANUFACTURER_DATA_LENGTH_MAX,
4787 &cp, NULL, NULL, NULL) > 0)
4788 return dbus_message_new_method_return(msg);
4790 return btd_error_failed(msg, "Set manufacturer data failed");
4792 #endif /* __TIZEN_PATCH__ */
4794 static bool parse_uuids(DBusMessageIter *value, GSList **uuids)
4796 DBusMessageIter arriter;
4798 if (dbus_message_iter_get_arg_type(value) != DBUS_TYPE_ARRAY)
4801 dbus_message_iter_recurse(value, &arriter);
4802 while (dbus_message_iter_get_arg_type(&arriter) != DBUS_TYPE_INVALID) {
4803 bt_uuid_t uuid, u128;
4804 char uuidstr[MAX_LEN_UUID_STR + 1];
4807 if (dbus_message_iter_get_arg_type(&arriter) !=
4811 dbus_message_iter_get_basic(&arriter, &uuid_param);
4813 if (bt_string_to_uuid(&uuid, uuid_param))
4816 bt_uuid_to_uuid128(&uuid, &u128);
4817 bt_uuid_to_string(&u128, uuidstr, sizeof(uuidstr));
4819 *uuids = g_slist_prepend(*uuids, strdup(uuidstr));
4821 dbus_message_iter_next(&arriter);
4827 static bool parse_rssi(DBusMessageIter *value, int16_t *rssi)
4829 if (dbus_message_iter_get_arg_type(value) != DBUS_TYPE_INT16)
4832 dbus_message_iter_get_basic(value, rssi);
4833 /* -127 <= RSSI <= +20 (spec V4.2 [Vol 2, Part E] 7.7.65.2) */
4834 if (*rssi > 20 || *rssi < -127)
4840 static bool parse_pathloss(DBusMessageIter *value, uint16_t *pathloss)
4842 if (dbus_message_iter_get_arg_type(value) != DBUS_TYPE_UINT16)
4845 dbus_message_iter_get_basic(value, pathloss);
4846 /* pathloss filter must be smaller that PATHLOSS_MAX */
4847 if (*pathloss > PATHLOSS_MAX)
4853 static bool parse_transport(DBusMessageIter *value, uint8_t *transport)
4855 char *transport_str;
4857 if (dbus_message_iter_get_arg_type(value) != DBUS_TYPE_STRING)
4860 dbus_message_iter_get_basic(value, &transport_str);
4862 if (!strcmp(transport_str, "bredr"))
4863 *transport = SCAN_TYPE_BREDR;
4864 else if (!strcmp(transport_str, "le"))
4865 *transport = SCAN_TYPE_LE;
4866 else if (!strcmp(transport_str, "auto"))
4867 *transport = SCAN_TYPE_DUAL;
4874 static bool parse_discovery_filter_entry(char *key, DBusMessageIter *value,
4875 struct discovery_filter *filter)
4877 if (!strcmp("UUIDs", key))
4878 return parse_uuids(value, &filter->uuids);
4880 if (!strcmp("RSSI", key))
4881 return parse_rssi(value, &filter->rssi);
4883 if (!strcmp("Pathloss", key))
4884 return parse_pathloss(value, &filter->pathloss);
4886 if (!strcmp("Transport", key))
4887 return parse_transport(value, &filter->type);
4889 DBG("Unknown key parameter: %s!\n", key);
4894 * This method is responsible for parsing parameters to SetDiscoveryFilter. If
4895 * filter in msg was empty, sets *filter to NULL. If whole parsing was
4896 * successful, sets *filter to proper value.
4897 * Returns false on any error, and true on success.
4899 static bool parse_discovery_filter_dict(struct discovery_filter **filter,
4902 DBusMessageIter iter, subiter, dictiter, variantiter;
4903 bool is_empty = true;
4905 *filter = g_try_malloc(sizeof(**filter));
4909 (*filter)->uuids = NULL;
4910 (*filter)->pathloss = DISTANCE_VAL_INVALID;
4911 (*filter)->rssi = DISTANCE_VAL_INVALID;
4912 (*filter)->type = SCAN_TYPE_DUAL;
4914 dbus_message_iter_init(msg, &iter);
4915 if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_ARRAY ||
4916 dbus_message_iter_get_element_type(&iter) != DBUS_TYPE_DICT_ENTRY)
4919 dbus_message_iter_recurse(&iter, &subiter);
4921 int type = dbus_message_iter_get_arg_type(&subiter);
4924 if (type == DBUS_TYPE_INVALID)
4928 dbus_message_iter_recurse(&subiter, &dictiter);
4930 dbus_message_iter_get_basic(&dictiter, &key);
4931 if (!dbus_message_iter_next(&dictiter))
4934 if (dbus_message_iter_get_arg_type(&dictiter) !=
4938 dbus_message_iter_recurse(&dictiter, &variantiter);
4940 if (!parse_discovery_filter_entry(key, &variantiter, *filter))
4943 dbus_message_iter_next(&subiter);
4952 /* only pathlos or rssi can be set, never both */
4953 if ((*filter)->pathloss != DISTANCE_VAL_INVALID &&
4954 (*filter)->rssi != DISTANCE_VAL_INVALID)
4957 DBG("filtered discovery params: transport: %d rssi: %d pathloss: %d",
4958 (*filter)->type, (*filter)->rssi, (*filter)->pathloss);
4963 g_slist_free_full((*filter)->uuids, g_free);
4969 static DBusMessage *set_discovery_filter(DBusConnection *conn,
4970 DBusMessage *msg, void *user_data)
4972 struct btd_adapter *adapter = user_data;
4973 struct watch_client *client;
4974 struct discovery_filter *discovery_filter;
4975 const char *sender = dbus_message_get_sender(msg);
4976 bool is_discovering;
4978 DBG("sender %s", sender);
4980 if (!(adapter->current_settings & MGMT_SETTING_POWERED))
4981 return btd_error_not_ready(msg);
4983 if (MGMT_VERSION(mgmt_version, mgmt_revision) < MGMT_VERSION(1, 8))
4984 return btd_error_not_supported(msg);
4986 /* parse parameters */
4987 if (!parse_discovery_filter_dict(&discovery_filter, msg))
4988 return btd_error_invalid_args(msg);
4990 is_discovering = get_discovery_client(adapter, sender, &client);
4993 free_discovery_filter(client->discovery_filter);
4994 client->discovery_filter = discovery_filter;
4997 update_discovery_filter(adapter);
4999 if (discovery_filter || is_discovering)
5000 return dbus_message_new_method_return(msg);
5002 /* Removing pre-set filter */
5003 adapter->set_filter_list = g_slist_remove(
5004 adapter->set_filter_list,
5006 g_free(client->owner);
5008 DBG("successfully cleared pre-set filter");
5009 } else if (discovery_filter) {
5010 /* Client pre-setting his filter for first time */
5011 client = g_new0(struct watch_client, 1);
5012 client->adapter = adapter;
5013 client->owner = g_strdup(sender);
5014 client->discovery_filter = discovery_filter;
5015 client->watch = g_dbus_add_disconnect_watch(dbus_conn, sender,
5016 discovery_disconnect, client,
5018 adapter->set_filter_list = g_slist_prepend(
5019 adapter->set_filter_list, client);
5021 DBG("successfully pre-set filter");
5024 return dbus_message_new_method_return(msg);
5027 static DBusMessage *stop_discovery(DBusConnection *conn,
5028 DBusMessage *msg, void *user_data)
5030 struct btd_adapter *adapter = user_data;
5031 const char *sender = dbus_message_get_sender(msg);
5032 struct mgmt_cp_stop_discovery cp;
5033 struct watch_client *client;
5036 DBG("sender %s", sender);
5038 if (!(adapter->current_settings & MGMT_SETTING_POWERED))
5039 return btd_error_not_ready(msg);
5041 list = g_slist_find_custom(adapter->discovery_list, sender,
5044 return btd_error_failed(msg, "No discovery started");
5046 client = list->data;
5048 #ifdef __TIZEN_PATCH__
5049 adapter->disc_type = BT_DISC_TYPE_BREDR_ONLY;
5051 cp.type = adapter->discovery_type;
5054 * The destroy function will cleanup the client information and
5055 * also remove it from the list of discovery clients.
5057 g_dbus_remove_watch(dbus_conn, client->watch);
5059 if (adapter->discovery_list) {
5060 update_discovery_filter(adapter);
5061 return dbus_message_new_method_return(msg);
5065 * In the idle phase of a discovery, there is no need to stop it
5066 * and so it is enough to send out the signal and just return.
5068 if (adapter->discovery_enable == 0x00) {
5069 adapter->discovering = false;
5070 g_dbus_emit_property_changed(dbus_conn, adapter->path,
5071 ADAPTER_INTERFACE, "Discovering");
5073 trigger_passive_scanning(adapter);
5075 return dbus_message_new_method_return(msg);
5077 #ifdef __TIZEN_PATCH__
5080 mgmt_send(adapter->mgmt, MGMT_OP_STOP_DISCOVERY,
5081 adapter->dev_id, sizeof(cp), &cp,
5082 stop_discovery_complete, adapter, NULL);
5084 return dbus_message_new_method_return(msg);
5087 static gboolean property_get_address(const GDBusPropertyTable *property,
5088 DBusMessageIter *iter, void *user_data)
5090 struct btd_adapter *adapter = user_data;
5092 const char *str = addr;
5094 ba2str(&adapter->bdaddr, addr);
5096 dbus_message_iter_append_basic(iter, DBUS_TYPE_STRING, &str);
5101 #ifdef __TIZEN_PATCH__
5102 static gboolean property_get_le_address(const GDBusPropertyTable *property,
5103 DBusMessageIter *iter, void *user_data)
5105 struct btd_adapter *adapter = user_data;
5106 DBusMessageIter entry;
5108 const char *str = addr;
5111 dbus_message_iter_open_container(iter, DBUS_TYPE_ARRAY,
5112 DBUS_TYPE_STRING_AS_STRING, &entry);
5114 if (adapter->le_static_addr.b[5] != 0) {
5115 ba2str(&adapter->le_static_addr, addr);
5116 type = g_strdup_printf("%d", BDADDR_LE_RANDOM);
5118 ba2str(&adapter->bdaddr, addr);
5119 type = g_strdup_printf("%d", BDADDR_LE_PUBLIC);
5122 dbus_message_iter_append_basic(&entry, DBUS_TYPE_STRING, &type);
5123 g_free((void *)type);
5125 dbus_message_iter_append_basic(&entry, DBUS_TYPE_STRING, &str);
5127 dbus_message_iter_close_container(iter, &entry);
5133 static gboolean property_get_name(const GDBusPropertyTable *property,
5134 DBusMessageIter *iter, void *user_data)
5136 struct btd_adapter *adapter = user_data;
5137 const char *str = adapter->system_name ? : "";
5139 dbus_message_iter_append_basic(iter, DBUS_TYPE_STRING, &str);
5144 static gboolean property_get_alias(const GDBusPropertyTable *property,
5145 DBusMessageIter *iter, void *user_data)
5147 struct btd_adapter *adapter = user_data;
5150 if (adapter->current_alias)
5151 str = adapter->current_alias;
5152 else if (adapter->stored_alias)
5153 str = adapter->stored_alias;
5155 str = adapter->system_name ? : "";
5157 dbus_message_iter_append_basic(iter, DBUS_TYPE_STRING, &str);
5162 static void property_set_alias(const GDBusPropertyTable *property,
5163 DBusMessageIter *iter,
5164 GDBusPendingPropertySet id, void *user_data)
5166 struct btd_adapter *adapter = user_data;
5170 dbus_message_iter_get_basic(iter, &name);
5172 if (g_str_equal(name, "") == TRUE) {
5173 if (adapter->stored_alias == NULL) {
5174 /* no alias set, nothing to restore */
5175 g_dbus_pending_property_success(id);
5179 /* restore to system name */
5180 ret = set_name(adapter, adapter->system_name);
5182 if (g_strcmp0(adapter->stored_alias, name) == 0) {
5183 /* alias already set, nothing to do */
5184 g_dbus_pending_property_success(id);
5189 ret = set_name(adapter, name);
5193 g_free(adapter->stored_alias);
5195 if (g_str_equal(name, "") == TRUE)
5196 adapter->stored_alias = NULL;
5198 adapter->stored_alias = g_strdup(name);
5200 store_adapter_info(adapter);
5202 g_dbus_pending_property_success(id);
5207 g_dbus_pending_property_error(id,
5208 ERROR_INTERFACE ".InvalidArguments",
5209 "Invalid arguments in method call");
5211 g_dbus_pending_property_error(id, ERROR_INTERFACE ".Failed",
5215 static gboolean property_get_class(const GDBusPropertyTable *property,
5216 DBusMessageIter *iter, void *user_data)
5218 struct btd_adapter *adapter = user_data;
5219 dbus_uint32_t val = adapter->dev_class;
5221 dbus_message_iter_append_basic(iter, DBUS_TYPE_UINT32, &val);
5226 static gboolean property_get_mode(struct btd_adapter *adapter,
5227 uint32_t setting, DBusMessageIter *iter)
5231 enable = (adapter->current_settings & setting) ? TRUE : FALSE;
5233 dbus_message_iter_append_basic(iter, DBUS_TYPE_BOOLEAN, &enable);
5238 struct property_set_data {
5239 struct btd_adapter *adapter;
5240 GDBusPendingPropertySet id;
5243 static void property_set_mode_complete(uint8_t status, uint16_t length,
5244 const void *param, void *user_data)
5246 struct property_set_data *data = user_data;
5247 struct btd_adapter *adapter = data->adapter;
5249 DBG("%s (0x%02x)", mgmt_errstr(status), status);
5251 if (status != MGMT_STATUS_SUCCESS) {
5252 const char *dbus_err;
5254 btd_error(adapter->dev_id, "Failed to set mode: %s (0x%02x)",
5255 mgmt_errstr(status), status);
5257 if (status == MGMT_STATUS_RFKILLED)
5258 dbus_err = ERROR_INTERFACE ".Blocked";
5260 dbus_err = ERROR_INTERFACE ".Failed";
5262 g_dbus_pending_property_error(data->id, dbus_err,
5263 mgmt_errstr(status));
5267 g_dbus_pending_property_success(data->id);
5270 * The parameters are identical and also the task that is
5271 * required in both cases. So it is safe to just call the
5272 * event handling functions here.
5274 new_settings_callback(adapter->dev_id, length, param, adapter);
5277 static void property_set_mode(struct btd_adapter *adapter, uint32_t setting,
5278 DBusMessageIter *value,
5279 GDBusPendingPropertySet id)
5281 struct property_set_data *data;
5282 struct mgmt_cp_set_discoverable cp;
5284 dbus_bool_t enable, current_enable;
5285 uint16_t opcode, len;
5288 dbus_message_iter_get_basic(value, &enable);
5290 if (adapter->current_settings & setting)
5291 current_enable = TRUE;
5293 current_enable = FALSE;
5295 if (enable == current_enable) {
5296 g_dbus_pending_property_success(id);
5300 mode = (enable == TRUE) ? 0x01 : 0x00;
5303 case MGMT_SETTING_POWERED:
5304 opcode = MGMT_OP_SET_POWERED;
5308 case MGMT_SETTING_DISCOVERABLE:
5309 #ifndef __TIZEN_PATCH__
5310 if (kernel_conn_control) {
5312 set_mode(adapter, MGMT_OP_SET_CONNECTABLE,
5315 opcode = MGMT_OP_SET_CONNECTABLE;
5323 memset(&cp, 0, sizeof(cp));
5326 cp.timeout = htobs(adapter->discoverable_timeout);
5328 opcode = MGMT_OP_SET_DISCOVERABLE;
5332 case MGMT_SETTING_BONDABLE:
5333 opcode = MGMT_OP_SET_BONDABLE;
5337 #ifdef __TIZEN_PATCH__
5338 case MGMT_SETTING_CONNECTABLE:
5339 opcode = MGMT_OP_SET_CONNECTABLE;
5348 DBG("sending %s command for index %u", mgmt_opstr(opcode),
5351 data = g_try_new0(struct property_set_data, 1);
5355 data->adapter = adapter;
5358 /* Because of timing issue, sometimes pscan / iscan value was wrong. */
5360 /* #ifdef __TIZEN_PATCH__ */
5362 * Use mgmt_send_nowait to avoid dbus timeout in a state of bonding.
5364 if (mgmt_send_nowait(adapter->mgmt, opcode, adapter->dev_id, len, param,
5365 property_set_mode_complete, data, g_free) > 0)
5367 if (mgmt_send(adapter->mgmt, opcode, adapter->dev_id, len, param,
5368 property_set_mode_complete, data, g_free) > 0)
5375 btd_error(adapter->dev_id, "Failed to set mode for index %u",
5378 g_dbus_pending_property_error(id, ERROR_INTERFACE ".Failed", NULL);
5381 static gboolean property_get_powered(const GDBusPropertyTable *property,
5382 DBusMessageIter *iter, void *user_data)
5384 struct btd_adapter *adapter = user_data;
5386 return property_get_mode(adapter, MGMT_SETTING_POWERED, iter);
5389 static void property_set_powered(const GDBusPropertyTable *property,
5390 DBusMessageIter *iter,
5391 GDBusPendingPropertySet id, void *user_data)
5393 struct btd_adapter *adapter = user_data;
5395 if (powering_down) {
5396 g_dbus_pending_property_error(id, ERROR_INTERFACE ".Failed",
5401 property_set_mode(adapter, MGMT_SETTING_POWERED, iter, id);
5404 static gboolean property_get_discoverable(const GDBusPropertyTable *property,
5405 DBusMessageIter *iter, void *user_data)
5407 struct btd_adapter *adapter = user_data;
5409 return property_get_mode(adapter, MGMT_SETTING_DISCOVERABLE, iter);
5412 static void property_set_discoverable(const GDBusPropertyTable *property,
5413 DBusMessageIter *iter,
5414 GDBusPendingPropertySet id, void *user_data)
5416 struct btd_adapter *adapter = user_data;
5418 if (adapter->discoverable_timeout > 0 &&
5419 !(adapter->current_settings & MGMT_SETTING_POWERED)) {
5420 g_dbus_pending_property_error(id, ERROR_INTERFACE ".Failed",
5425 property_set_mode(adapter, MGMT_SETTING_DISCOVERABLE, iter, id);
5428 static gboolean property_get_discoverable_timeout(
5429 const GDBusPropertyTable *property,
5430 DBusMessageIter *iter, void *user_data)
5432 struct btd_adapter *adapter = user_data;
5433 dbus_uint32_t value = adapter->discoverable_timeout;
5435 dbus_message_iter_append_basic(iter, DBUS_TYPE_UINT32, &value);
5440 static void property_set_discoverable_timeout(
5441 const GDBusPropertyTable *property,
5442 DBusMessageIter *iter,
5443 GDBusPendingPropertySet id, void *user_data)
5445 struct btd_adapter *adapter = user_data;
5446 dbus_uint32_t value;
5448 dbus_message_iter_get_basic(iter, &value);
5450 adapter->discoverable_timeout = value;
5452 g_dbus_pending_property_success(id);
5454 store_adapter_info(adapter);
5456 g_dbus_emit_property_changed(dbus_conn, adapter->path,
5457 ADAPTER_INTERFACE, "DiscoverableTimeout");
5460 if (adapter->current_settings & MGMT_SETTING_DISCOVERABLE)
5461 set_discoverable(adapter, 0x01, adapter->discoverable_timeout);
5464 static gboolean property_get_pairable(const GDBusPropertyTable *property,
5465 DBusMessageIter *iter, void *user_data)
5467 struct btd_adapter *adapter = user_data;
5469 return property_get_mode(adapter, MGMT_SETTING_BONDABLE, iter);
5472 static void property_set_pairable(const GDBusPropertyTable *property,
5473 DBusMessageIter *iter,
5474 GDBusPendingPropertySet id, void *user_data)
5476 struct btd_adapter *adapter = user_data;
5478 property_set_mode(adapter, MGMT_SETTING_BONDABLE, iter, id);
5481 static gboolean property_get_pairable_timeout(
5482 const GDBusPropertyTable *property,
5483 DBusMessageIter *iter, void *user_data)
5485 struct btd_adapter *adapter = user_data;
5486 dbus_uint32_t value = adapter->pairable_timeout;
5488 dbus_message_iter_append_basic(iter, DBUS_TYPE_UINT32, &value);
5493 static void property_set_pairable_timeout(const GDBusPropertyTable *property,
5494 DBusMessageIter *iter,
5495 GDBusPendingPropertySet id, void *user_data)
5497 struct btd_adapter *adapter = user_data;
5498 dbus_uint32_t value;
5500 dbus_message_iter_get_basic(iter, &value);
5502 adapter->pairable_timeout = value;
5504 g_dbus_pending_property_success(id);
5506 store_adapter_info(adapter);
5508 g_dbus_emit_property_changed(dbus_conn, adapter->path,
5509 ADAPTER_INTERFACE, "PairableTimeout");
5511 trigger_pairable_timeout(adapter);
5514 static gboolean property_get_discovering(const GDBusPropertyTable *property,
5515 DBusMessageIter *iter, void *user_data)
5517 struct btd_adapter *adapter = user_data;
5518 dbus_bool_t discovering = adapter->discovering;
5520 dbus_message_iter_append_basic(iter, DBUS_TYPE_BOOLEAN, &discovering);
5525 static void add_gatt_uuid(struct gatt_db_attribute *attrib, void *user_data)
5527 GHashTable *uuids = user_data;
5528 bt_uuid_t uuid, u128;
5529 char uuidstr[MAX_LEN_UUID_STR + 1];
5531 if (!gatt_db_service_get_active(attrib))
5534 if (!gatt_db_attribute_get_service_uuid(attrib, &uuid))
5537 bt_uuid_to_uuid128(&uuid, &u128);
5538 bt_uuid_to_string(&u128, uuidstr, sizeof(uuidstr));
5540 g_hash_table_add(uuids, strdup(uuidstr));
5543 static void iter_append_uuid(gpointer key, gpointer value, gpointer user_data)
5545 DBusMessageIter *iter = user_data;
5546 const char *uuid = key;
5548 dbus_message_iter_append_basic(iter, DBUS_TYPE_STRING, &uuid);
5551 #ifdef __TIZEN_PATCH__
5553 static gboolean property_get_le_discovering(const GDBusPropertyTable *property,
5554 DBusMessageIter *iter, void *user_data)
5556 struct btd_adapter *adapter = user_data;
5557 dbus_bool_t discovering = adapter->le_discovering;
5559 dbus_message_iter_append_basic(iter, DBUS_TYPE_BOOLEAN, &discovering);
5565 static gboolean property_get_secure_connection(const GDBusPropertyTable
5566 *property, DBusMessageIter *iter, void *user_data)
5568 struct btd_adapter *adapter = user_data;
5569 dbus_bool_t secure_connection = adapter->secure_connection;
5571 dbus_message_iter_append_basic(iter, DBUS_TYPE_BOOLEAN,
5572 &secure_connection);
5578 static gboolean property_get_connectable(const GDBusPropertyTable *property,
5579 DBusMessageIter *iter, void *user_data)
5581 struct btd_adapter *adapter = user_data;
5583 return property_get_mode(adapter, MGMT_SETTING_CONNECTABLE, iter);
5586 static void property_set_connectable(const GDBusPropertyTable *property,
5587 DBusMessageIter *iter,
5588 GDBusPendingPropertySet id, void *user_data)
5590 struct btd_adapter *adapter = user_data;
5592 property_set_mode(adapter, MGMT_SETTING_CONNECTABLE, iter, id);
5595 static gboolean property_get_version(const GDBusPropertyTable *property,
5596 DBusMessageIter *iter, void *user_data)
5598 struct btd_adapter *adapter = user_data;
5599 const char *str = adapter->version ? : "";
5601 dbus_message_iter_append_basic(iter, DBUS_TYPE_STRING, &str);
5606 static gboolean property_get_supported_le_features(
5607 const GDBusPropertyTable *property,
5608 DBusMessageIter *iter, void *user_data)
5610 const char *str, *val;
5612 DBusMessageIter entry;
5614 dbus_message_iter_open_container(iter, DBUS_TYPE_ARRAY,
5615 DBUS_TYPE_STRING_AS_STRING, &entry);
5617 value = adapter_le_get_max_adv_instance();
5619 str = g_strdup("adv_inst_max");
5620 dbus_message_iter_append_basic(&entry, DBUS_TYPE_STRING, &str);
5622 val = g_strdup_printf("%d", value);
5623 dbus_message_iter_append_basic(&entry, DBUS_TYPE_STRING, &val);
5625 g_free((void *)str);
5626 g_free((void *)val);
5629 value = adapter_le_is_supported_offloading();
5631 str = g_strdup("rpa_offloading");
5632 dbus_message_iter_append_basic(&entry, DBUS_TYPE_STRING, &str);
5634 val = g_strdup_printf("%d", value);
5635 dbus_message_iter_append_basic(&entry, DBUS_TYPE_STRING, &val);
5637 g_free((void *)str);
5638 g_free((void *)val);
5641 value = adapter_le_get_scan_filter_size();
5643 str = g_strdup("max_filter");
5644 dbus_message_iter_append_basic(&entry, DBUS_TYPE_STRING, &str);
5646 val = g_strdup_printf("%d", value);
5647 dbus_message_iter_append_basic(&entry, DBUS_TYPE_STRING, &val);
5649 g_free((void *)str);
5650 g_free((void *)val);
5653 dbus_message_iter_close_container(iter, &entry);
5658 static gboolean property_get_ipsp_init_state(
5659 const GDBusPropertyTable *property,
5660 DBusMessageIter *iter, void *data)
5662 struct btd_adapter *adapter = data;
5663 dbus_bool_t ipsp_initialized;
5665 DBG("property_get_ipsp_init_state called");
5666 if (adapter->ipsp_intialized)
5667 ipsp_initialized = TRUE;
5669 ipsp_initialized = FALSE;
5671 dbus_message_iter_append_basic(iter, DBUS_TYPE_BOOLEAN,
5678 static gboolean property_get_uuids(const GDBusPropertyTable *property,
5679 DBusMessageIter *iter, void *user_data)
5681 struct btd_adapter *adapter = user_data;
5682 DBusMessageIter entry;
5687 uuids = g_hash_table_new_full(g_str_hash, g_str_equal, free, NULL);
5692 for (l = adapter->services; l != NULL; l = l->next) {
5693 sdp_record_t *rec = l->data;
5696 uuid = bt_uuid2string(&rec->svclass);
5700 g_hash_table_add(uuids, uuid);
5704 db = btd_gatt_database_get_db(adapter->database);
5706 gatt_db_foreach_service(db, NULL, add_gatt_uuid, uuids);
5708 dbus_message_iter_open_container(iter, DBUS_TYPE_ARRAY,
5709 DBUS_TYPE_STRING_AS_STRING, &entry);
5710 g_hash_table_foreach(uuids, iter_append_uuid, &entry);
5711 dbus_message_iter_close_container(iter, &entry);
5713 g_hash_table_destroy(uuids);
5718 static gboolean property_exists_modalias(const GDBusPropertyTable *property,
5721 struct btd_adapter *adapter = user_data;
5723 return adapter->modalias ? TRUE : FALSE;
5726 static gboolean property_get_modalias(const GDBusPropertyTable *property,
5727 DBusMessageIter *iter, void *user_data)
5729 struct btd_adapter *adapter = user_data;
5730 const char *str = adapter->modalias ? : "";
5732 dbus_message_iter_append_basic(iter, DBUS_TYPE_STRING, &str);
5737 static int device_path_cmp(gconstpointer a, gconstpointer b)
5739 const struct btd_device *device = a;
5740 const char *path = b;
5741 const char *dev_path = device_get_path(device);
5743 return strcasecmp(dev_path, path);
5746 #ifdef __TIZEN_PATCH__
5747 static DBusMessage *adapter_unpair_device(DBusConnection *conn,
5748 DBusMessage *msg, void *user_data)
5751 struct btd_adapter *adapter = user_data;
5752 struct btd_device *device;
5756 if (dbus_message_get_args(msg, NULL, DBUS_TYPE_OBJECT_PATH, &path,
5757 DBUS_TYPE_INVALID) == FALSE)
5758 return btd_error_invalid_args(msg);
5760 list = g_slist_find_custom(adapter->devices, path, device_path_cmp);
5762 return btd_error_does_not_exist(msg);
5764 if (!(adapter->current_settings & MGMT_SETTING_POWERED))
5765 return btd_error_not_ready(msg);
5767 device = list->data;
5769 btd_device_set_temporary(device, TRUE);
5771 if (!btd_device_is_connected(device)) {
5772 btd_adapter_unpair_device(adapter, device);
5773 return dbus_message_new_method_return(msg);
5776 device_request_disconnect(device, msg);
5782 static DBusMessage *create_device(DBusConnection *conn,
5783 DBusMessage *msg, void *data)
5785 struct btd_adapter *adapter = data;
5786 const gchar *address;
5790 if (dbus_message_get_args(msg, NULL, DBUS_TYPE_STRING, &address,
5791 DBUS_TYPE_INVALID) == FALSE)
5792 return btd_error_invalid_args(msg);
5794 if (check_address(address) < 0)
5795 return btd_error_invalid_args(msg);
5799 str2ba(address, &addr);
5800 btd_adapter_get_device(adapter, &addr, BDADDR_BREDR);
5803 return dbus_message_new_method_return(msg);
5806 static DBusMessage *find_device(DBusConnection *conn, DBusMessage *msg,
5809 struct btd_adapter *adapter = data;
5810 struct btd_device *device;
5812 const gchar *address;
5814 const gchar *dev_path;
5818 if (!dbus_message_get_args(msg, NULL, DBUS_TYPE_STRING, &address,
5820 return btd_error_invalid_args(msg);
5822 str2ba(address, &rpa);
5824 l = g_slist_find_custom(adapter->devices,
5825 address, (GCompareFunc) device_address_cmp);
5828 msb = rpa.b[5] >> 6;
5830 /* Check whether address is RPA */
5831 if (msb == 0x00 || msb == 0x01)
5832 l = g_slist_find_custom(adapter->devices,
5833 address, (GCompareFunc) device_rpa_cmp);
5837 return btd_error_does_not_exist(msg);
5841 reply = dbus_message_new_method_return(msg);
5845 dev_path = device_get_path(device);
5847 dbus_message_append_args(reply,
5848 DBUS_TYPE_OBJECT_PATH, &dev_path,
5854 static gboolean adapter_ipsp_connected(struct btd_adapter *adapter)
5858 DBG("%s", adapter->path);
5860 for (l = adapter->connections; l != NULL; l = next) {
5861 struct btd_device *dev = l->data;
5863 next = g_slist_next(l);
5865 if (device_is_ipsp_connected(dev))
5872 static void adapter_set_ipsp_init_state(struct btd_adapter *adapter, gboolean initialized)
5874 if (adapter->ipsp_intialized == initialized)
5877 adapter->ipsp_intialized = initialized;
5879 DBG("Set Ipsp init state for adapter %s", adapter->path);
5881 g_dbus_emit_property_changed(dbus_conn, adapter->path,
5882 ADAPTER_INTERFACE, "IpspInitStateChanged");
5885 static void deinitialize_6lowpan_complete(uint8_t status, uint16_t length,
5886 const void *param, void *user_data)
5888 struct btd_adapter *adapter = user_data;
5889 bool initialized = FALSE;
5891 if (status != MGMT_STATUS_SUCCESS)
5892 error("De-Initialize BT 6lowpan failed for hci%u: %s (0x%02x)",
5893 adapter->dev_id, mgmt_errstr(status), status);
5895 adapter_set_ipsp_init_state(adapter, initialized);
5896 DBG("De-Initialize BT 6lowpan successfully for hci%u",
5901 static bool deinitialize_6lowpan(struct btd_adapter *adapter)
5903 struct mgmt_cp_enable_6lowpan cp;
5905 memset(&cp, 0, sizeof(cp));
5907 cp.enable_6lowpan = DEINIT_6LOWPAN;
5908 if (mgmt_send(adapter->mgmt, MGMT_OP_ENABLE_6LOWPAN,
5909 adapter->dev_id, sizeof(cp), &cp,
5910 deinitialize_6lowpan_complete, adapter, NULL) > 0)
5913 error("Failed to de-initialize BT 6Lowpan for index %u",
5918 static void initialize_6lowpan_complete(uint8_t status, uint16_t length,
5919 const void *param, void *user_data)
5921 struct btd_adapter *adapter = user_data;
5922 bool initialized = TRUE;
5924 if (status != MGMT_STATUS_SUCCESS)
5925 error("Initialize BT 6lowpan failed for hci%u: %s (0x%02x)",
5926 adapter->dev_id, mgmt_errstr(status), status);
5928 adapter_set_ipsp_init_state(adapter, initialized);
5929 DBG("Initialize BT 6lowpan successfully for hci%u",
5934 static bool initialize_6lowpan(struct btd_adapter *adapter)
5936 struct mgmt_cp_enable_6lowpan cp;
5938 memset(&cp, 0, sizeof(cp));
5940 cp.enable_6lowpan = INIT_6LOWPAN;
5941 if (mgmt_send(adapter->mgmt, MGMT_OP_ENABLE_6LOWPAN,
5942 adapter->dev_id, sizeof(cp), &cp,
5943 initialize_6lowpan_complete, adapter, NULL) > 0)
5946 error("Failed to initialize BT 6Lowpan for index %u",
5951 static DBusMessage *adapter_initialize_ipsp(DBusConnection *conn,
5952 DBusMessage *msg, void *data)
5954 struct btd_adapter *adapter = data;
5957 DBG("Initialize IPSP");
5959 if (!(adapter->current_settings & MGMT_SETTING_POWERED))
5960 return btd_error_not_ready(msg);
5962 if (adapter->ipsp_intialized)
5963 return btd_error_already_exists(msg);
5965 /* Enable BT 6lowpan in kernel */
5966 err = initialize_6lowpan(adapter);
5969 return btd_error_failed(msg, "Failed to initialize BT 6lowpan");
5971 return dbus_message_new_method_return(msg);
5974 static DBusMessage *adapter_deinitialize_ipsp(DBusConnection *conn,
5975 DBusMessage *msg, void *data)
5977 struct btd_adapter *adapter = data;
5980 DBG("De-initialize IPSP");
5982 if (!(adapter->current_settings & MGMT_SETTING_POWERED))
5983 return btd_error_not_ready(msg);
5985 if (!adapter->ipsp_intialized)
5986 return btd_error_not_permitted(msg, "IPSP not initialized");
5988 if (adapter_ipsp_connected(adapter))
5989 return btd_error_not_permitted(msg, "IPSP Client device found connected");
5991 /* Disable BT 6lowpan in kernel */
5992 err = deinitialize_6lowpan(adapter);
5995 return btd_error_failed(msg, "Failed to deinitialize BT 6lowpan");
5997 return dbus_message_new_method_return(msg);
6001 static DBusMessage *remove_device(DBusConnection *conn,
6002 DBusMessage *msg, void *user_data)
6004 struct btd_adapter *adapter = user_data;
6005 struct btd_device *device;
6009 if (dbus_message_get_args(msg, NULL, DBUS_TYPE_OBJECT_PATH, &path,
6010 DBUS_TYPE_INVALID) == FALSE)
6011 return btd_error_invalid_args(msg);
6013 list = g_slist_find_custom(adapter->devices, path, device_path_cmp);
6015 return btd_error_does_not_exist(msg);
6017 if (!(adapter->current_settings & MGMT_SETTING_POWERED))
6018 return btd_error_not_ready(msg);
6020 device = list->data;
6022 btd_device_set_temporary(device, true);
6024 if (!btd_device_is_connected(device)) {
6025 btd_adapter_remove_device(adapter, device);
6026 return dbus_message_new_method_return(msg);
6029 device_request_disconnect(device, msg);
6034 static const GDBusMethodTable adapter_methods[] = {
6035 { GDBUS_METHOD("StartDiscovery", NULL, NULL, start_discovery) },
6036 { GDBUS_METHOD("SetDiscoveryFilter",
6037 GDBUS_ARGS({ "properties", "a{sv}" }), NULL,
6038 set_discovery_filter) },
6039 { GDBUS_METHOD("StopDiscovery", NULL, NULL, stop_discovery) },
6040 #ifdef __TIZEN_PATCH__
6041 { GDBUS_METHOD("StartCustomDiscovery",
6042 GDBUS_ARGS({ "type", "s" }), NULL,
6043 adapter_start_custom_discovery) },
6044 { GDBUS_METHOD("StartLEDiscovery", NULL, NULL,
6045 adapter_start_le_discovery) },
6046 { GDBUS_ASYNC_METHOD("StopLEDiscovery", NULL, NULL,
6047 adapter_stop_le_discovery) },
6049 { GDBUS_METHOD("EnableSecureConnection",
6050 GDBUS_ARGS({"enable", "b"}), NULL,
6051 write_sec_conn_host_support)},
6053 { GDBUS_METHOD("ReadSecureConnection", NULL,
6054 NULL, read_sec_conn_host_support)},
6057 { GDBUS_METHOD("SetAdvertising",
6058 GDBUS_ARGS({ "enable", "b" },
6059 { "slot_id", "i" }), NULL,
6060 adapter_set_advertising) },
6061 { GDBUS_METHOD("SetAdvertisingParameters",
6062 GDBUS_ARGS({ "interval_min", "u" },
6063 { "interval_max", "u" },
6064 { "filter_policy", "u" },
6066 { "slot_id", "i" }), NULL,
6067 adapter_set_advertising_params) },
6068 { GDBUS_METHOD("SetAdvertisingData",
6069 GDBUS_ARGS({ "value", "ay" },
6070 { "slot_id", "i" }), NULL,
6071 adapter_set_advertising_data) },
6072 { GDBUS_METHOD("SetScanParameters",
6073 GDBUS_ARGS({ "type", "u" },
6074 { "interval", "u" },
6075 { "window", "u" }), NULL,
6076 adapter_le_set_scan_params) },
6077 { GDBUS_ASYNC_METHOD("scan_filter_param_setup",
6078 GDBUS_ARGS({ "client_if", "i" }, { "action", "i" },
6079 { "filt_index", "i" }, { "feat_seln", "i"},
6080 { "list_logic_type", "i" }, { "filt_logic_type", "i"},
6081 { "rssi_high_thres", "i" }, { "rssi_low_thres", "i"},
6082 { "dely_mode", "i" }, { "found_timeout", "i"},
6083 { "lost_timeout", "i" }, { "found_timeout_cnt", "i"}), NULL,
6084 adapter_le_scan_filter_param_setup) },
6085 { GDBUS_ASYNC_METHOD("scan_filter_add_remove",
6086 GDBUS_ARGS({ "client_if", "i" }, { "action", "i" },
6087 { "filt_type", "i" }, { "filt_index", "i"},
6088 { "company_id", "i" }, { "company_id_mask", "i"},
6089 { "p_uuid", "ay" }, { "p_uuid_mask", "ay" },
6090 { "string", "s" }, { "address_type", "u" },
6091 /*{ "data_len", "i" },*/ { "p_data", "ay" },
6092 /*{ "mask_len", "i" },*/ { "p_mask", "ay" }), NULL,
6093 adapter_le_scan_filter_add_remove) },
6094 { GDBUS_ASYNC_METHOD("scan_filter_clear",
6095 GDBUS_ARGS({ "client_if", "i" }, { "filt_index", "i" }), NULL,
6096 adapter_le_scan_filter_clear) },
6097 { GDBUS_ASYNC_METHOD("scan_filter_enable",
6098 GDBUS_ARGS({ "client_if", "i" }, { "enable", "b" }), NULL,
6099 adapter_le_scan_filter_enable) },
6100 { GDBUS_METHOD("InitializeIpsp",
6102 adapter_initialize_ipsp) },
6103 { GDBUS_METHOD("DeinitializeIpsp",
6105 adapter_deinitialize_ipsp) },
6106 { GDBUS_METHOD("SetScanRespData",
6107 GDBUS_ARGS({ "value", "ay" },
6108 { "slot_id", "i" }), NULL,
6109 adapter_set_scan_rsp_data) },
6110 { GDBUS_METHOD("AddDeviceWhiteList",
6111 GDBUS_ARGS({ "address", "s" },
6112 { "address_type", "u" }), NULL,
6113 adapter_add_device_white_list) },
6114 { GDBUS_METHOD("RemoveDeviceWhiteList",
6115 GDBUS_ARGS({ "address", "s" },
6116 { "address_type", "u" }), NULL,
6117 adapter_remove_device_white_list) },
6118 { GDBUS_METHOD("ClearDeviceWhiteList",
6120 adapter_clear_device_white_list) },
6121 { GDBUS_METHOD("SetLePrivacy",
6122 GDBUS_ARGS({ "enable", "b" }), NULL,
6123 adapter_set_le_privacy) },
6124 { GDBUS_METHOD("SetLeStaticRandomAddress",
6125 GDBUS_ARGS({ "enable", "b" }), NULL,
6126 adapter_set_le_static_address) },
6127 { GDBUS_ASYNC_METHOD("EnableRssi",
6128 GDBUS_ARGS({ "bt_address", "s" },
6129 { "link_type", "i" },
6131 { "in_range_th", "i" },
6134 adapter_enable_rssi) },
6135 { GDBUS_ASYNC_METHOD("GetRssiStrength",
6136 GDBUS_ARGS({ "bt_address", "s" }, { "link_type", "i" }),
6138 adapter_get_rssi) },
6139 { GDBUS_ASYNC_METHOD("UnpairDevice",
6140 GDBUS_ARGS({ "device", "o" }), NULL, adapter_unpair_device) },
6141 { GDBUS_METHOD("FindDevice",
6142 GDBUS_ARGS({ "address", "s" }),
6143 GDBUS_ARGS({ "device", "o" }),
6145 #ifdef __TIZEN_PATCH__
6146 #ifdef __BROADCOM_PATCH__
6147 { GDBUS_METHOD("SetWbsParameters",
6148 GDBUS_ARGS({ "role", "s" }, { "bt_address", "s" }),
6150 set_wbs_parameters) },
6151 { GDBUS_METHOD("SetNbParameters",
6152 GDBUS_ARGS({ "role", "s" }, { "bt_address", "s" }),
6154 set_nb_parameters) },
6156 { GDBUS_METHOD("SetManufacturerData",
6157 GDBUS_ARGS({ "value", "ay" }), NULL,
6158 adapter_set_manufacturer_data) },
6160 { GDBUS_ASYNC_METHOD("CreateDevice",
6161 GDBUS_ARGS({ "address", "s" }), NULL,
6164 { GDBUS_ASYNC_METHOD("RemoveDevice",
6165 GDBUS_ARGS({ "device", "o" }), NULL, remove_device) },
6166 #ifdef __TIZEN_PATCH__
6167 { GDBUS_ASYNC_METHOD("LEReadMaximumDataLength", NULL,
6168 GDBUS_ARGS({"maxTxOctets", "q" }, { "maxTxTime", "q" },
6169 {"maxRxOctets", "q" }, { "maxRxTime", "q" }),
6170 le_read_maximum_data_length)},
6171 { GDBUS_ASYNC_METHOD("LEWriteHostSuggestedDataLength",
6172 GDBUS_ARGS({"def_tx_octets", "q" }, { "def_tx_time", "q" }), NULL,
6173 le_write_host_suggested_default_data_length)},
6174 { GDBUS_ASYNC_METHOD("LEReadHostSuggestedDataLength", NULL,
6175 GDBUS_ARGS({"def_tx_octets", "q" }, { "def_tx_time", "q" }),
6176 le_read_host_suggested_default_data_length)},
6181 #ifdef __TIZEN_PATCH__
6182 static const GDBusSignalTable adapter_signals[] = {
6183 { GDBUS_SIGNAL("AdvertisingEnabled",
6184 GDBUS_ARGS({ "slot_id", "i" },
6185 { "enabled", "b"})) },
6186 { GDBUS_SIGNAL("RssiEnabled",
6187 GDBUS_ARGS({"address","s"},
6188 { "link_type", "i" },
6189 { "enabled", "b"})) },
6190 { GDBUS_SIGNAL("RssiAlert",
6191 GDBUS_ARGS({"address","s"},
6192 { "link_type", "i" },
6193 { "alert_type", "i" },
6194 { "rssi_dbm", "i"})) },
6195 { GDBUS_SIGNAL("RawRssi",
6196 GDBUS_ARGS({"address","s"},
6197 { "link_type", "i" },
6198 { "rssi_dbm", "i"})) },
6199 { GDBUS_SIGNAL("HardwareError", NULL) },
6200 { GDBUS_SIGNAL("TxTimeoutError", NULL) },
6205 static const GDBusPropertyTable adapter_properties[] = {
6206 { "Address", "s", property_get_address },
6207 { "Name", "s", property_get_name },
6208 { "Alias", "s", property_get_alias, property_set_alias },
6209 { "Class", "u", property_get_class },
6210 { "Powered", "b", property_get_powered, property_set_powered },
6211 { "Discoverable", "b", property_get_discoverable,
6212 property_set_discoverable },
6213 { "DiscoverableTimeout", "u", property_get_discoverable_timeout,
6214 property_set_discoverable_timeout },
6215 { "Pairable", "b", property_get_pairable, property_set_pairable },
6216 { "PairableTimeout", "u", property_get_pairable_timeout,
6217 property_set_pairable_timeout },
6218 { "Discovering", "b", property_get_discovering },
6219 #ifdef __TIZEN_PATCH__
6220 { "LEDiscovering", "b", property_get_le_discovering },
6222 { "UUIDs", "as", property_get_uuids },
6223 { "Modalias", "s", property_get_modalias, NULL,
6224 property_exists_modalias },
6225 #ifdef __TIZEN_PATCH__
6227 { "SecureConnection", "b", property_get_secure_connection },
6229 { "Connectable", "b", property_get_connectable,
6230 property_set_connectable },
6231 { "Version", "s", property_get_version },
6232 { "SupportedLEFeatures", "as", property_get_supported_le_features},
6233 { "IpspInitStateChanged", "b", property_get_ipsp_init_state},
6234 { "LEAddress", "as", property_get_le_address },
6240 static int str2buf(const char *str, uint8_t *buf, size_t blen)
6247 memset(buf, 0, blen);
6249 dlen = MIN((strlen(str) / 2), blen);
6251 for (i = 0; i < dlen; i++)
6252 sscanf(str + (i * 2), "%02hhX", &buf[i]);
6257 static struct link_key_info *get_key_info(GKeyFile *key_file, const char *peer)
6259 struct link_key_info *info = NULL;
6262 str = g_key_file_get_string(key_file, "LinkKey", "Key", NULL);
6263 if (!str || strlen(str) < 32)
6266 info = g_new0(struct link_key_info, 1);
6268 str2ba(peer, &info->bdaddr);
6270 if (!strncmp(str, "0x", 2))
6271 str2buf(&str[2], info->key, sizeof(info->key));
6273 str2buf(&str[0], info->key, sizeof(info->key));
6275 info->type = g_key_file_get_integer(key_file, "LinkKey", "Type", NULL);
6276 info->pin_len = g_key_file_get_integer(key_file, "LinkKey", "PINLength",
6285 static struct smp_ltk_info *get_ltk(GKeyFile *key_file, const char *peer,
6286 uint8_t peer_type, const char *group)
6288 struct smp_ltk_info *ltk = NULL;
6289 GError *gerr = NULL;
6294 key = g_key_file_get_string(key_file, group, "Key", NULL);
6295 if (!key || strlen(key) < 32)
6298 rand = g_key_file_get_string(key_file, group, "Rand", NULL);
6302 ltk = g_new0(struct smp_ltk_info, 1);
6304 /* Default to assuming a master key */
6307 str2ba(peer, <k->bdaddr);
6308 ltk->bdaddr_type = peer_type;
6311 * Long term keys should respond to an identity address which can
6312 * either be a public address or a random static address. Keys
6313 * stored for resolvable random and unresolvable random addresses
6316 * This is an extra sanity check for older kernel versions or older
6317 * daemons that might have been instructed to store long term keys
6318 * for these temporary addresses.
6320 if (ltk->bdaddr_type == BDADDR_LE_RANDOM &&
6321 (ltk->bdaddr.b[5] & 0xc0) != 0xc0) {
6327 if (!strncmp(key, "0x", 2))
6328 str2buf(&key[2], ltk->val, sizeof(ltk->val));
6330 str2buf(&key[0], ltk->val, sizeof(ltk->val));
6332 if (!strncmp(rand, "0x", 2)) {
6334 str2buf(&rand[2], (uint8_t *) &rand_le, sizeof(rand_le));
6335 ltk->rand = le64_to_cpu(rand_le);
6337 sscanf(rand, "%" PRIu64, <k->rand);
6340 ltk->authenticated = g_key_file_get_integer(key_file, group,
6341 "Authenticated", NULL);
6342 ltk->enc_size = g_key_file_get_integer(key_file, group, "EncSize",
6344 ltk->ediv = g_key_file_get_integer(key_file, group, "EDiv", NULL);
6346 master = g_key_file_get_boolean(key_file, group, "Master", &gerr);
6350 ltk->master = master;
6359 static GSList *get_ltk_info(GKeyFile *key_file, const char *peer,
6360 uint8_t bdaddr_type)
6362 struct smp_ltk_info *ltk;
6367 ltk = get_ltk(key_file, peer, bdaddr_type, "LongTermKey");
6369 l = g_slist_append(l, ltk);
6371 ltk = get_ltk(key_file, peer, bdaddr_type, "SlaveLongTermKey");
6373 ltk->master = false;
6374 l = g_slist_append(l, ltk);
6380 static struct irk_info *get_irk_info(GKeyFile *key_file, const char *peer,
6381 uint8_t bdaddr_type)
6383 struct irk_info *irk;
6386 str = g_key_file_get_string(key_file, "IdentityResolvingKey", "Key", NULL);
6387 #ifdef __TIZEN_PATCH__
6390 if (strlen(str) < 32) {
6395 if (!str || strlen(str) < 32)
6398 irk = g_new0(struct irk_info, 1);
6400 str2ba(peer, &irk->bdaddr);
6401 irk->bdaddr_type = bdaddr_type;
6403 if (!strncmp(str, "0x", 2))
6404 str2buf(&str[2], irk->val, sizeof(irk->val));
6406 str2buf(&str[0], irk->val, sizeof(irk->val));
6413 static struct conn_param *get_conn_param(GKeyFile *key_file, const char *peer,
6414 uint8_t bdaddr_type)
6416 struct conn_param *param;
6418 if (!g_key_file_has_group(key_file, "ConnectionParameters"))
6421 param = g_new0(struct conn_param, 1);
6423 param->min_interval = g_key_file_get_integer(key_file,
6424 "ConnectionParameters",
6425 "MinInterval", NULL);
6426 param->max_interval = g_key_file_get_integer(key_file,
6427 "ConnectionParameters",
6428 "MaxInterval", NULL);
6429 param->latency = g_key_file_get_integer(key_file,
6430 "ConnectionParameters",
6432 param->timeout = g_key_file_get_integer(key_file,
6433 "ConnectionParameters",
6435 str2ba(peer, ¶m->bdaddr);
6436 param->bdaddr_type = bdaddr_type;
6441 static void load_link_keys_complete(uint8_t status, uint16_t length,
6442 const void *param, void *user_data)
6444 struct btd_adapter *adapter = user_data;
6446 if (status != MGMT_STATUS_SUCCESS) {
6447 btd_error(adapter->dev_id,
6448 "Failed to load link keys for hci%u: %s (0x%02x)",
6449 adapter->dev_id, mgmt_errstr(status), status);
6453 DBG("link keys loaded for hci%u", adapter->dev_id);
6456 static void load_link_keys(struct btd_adapter *adapter, GSList *keys,
6459 struct mgmt_cp_load_link_keys *cp;
6460 struct mgmt_link_key_info *key;
6461 size_t key_count, cp_size;
6466 * If the controller does not support BR/EDR operation,
6467 * there is no point in trying to load the link keys into
6470 * This is an optimization for Low Energy only controllers.
6472 if (!(adapter->supported_settings & MGMT_SETTING_BREDR))
6475 key_count = g_slist_length(keys);
6477 DBG("hci%u keys %zu debug_keys %d", adapter->dev_id, key_count,
6480 cp_size = sizeof(*cp) + (key_count * sizeof(*key));
6482 cp = g_try_malloc0(cp_size);
6484 btd_error(adapter->dev_id, "No memory for link keys for hci%u",
6490 * Even if the list of stored keys is empty, it is important to
6491 * load an empty list into the kernel. That way it is ensured
6492 * that no old keys from a previous daemon are present.
6494 * In addition it is also the only way to toggle the different
6495 * behavior for debug keys.
6497 cp->debug_keys = debug_keys;
6498 cp->key_count = htobs(key_count);
6500 for (l = keys, key = cp->keys; l != NULL; l = g_slist_next(l), key++) {
6501 struct link_key_info *info = l->data;
6503 bacpy(&key->addr.bdaddr, &info->bdaddr);
6504 key->addr.type = BDADDR_BREDR;
6505 key->type = info->type;
6506 memcpy(key->val, info->key, 16);
6507 key->pin_len = info->pin_len;
6510 id = mgmt_send(adapter->mgmt, MGMT_OP_LOAD_LINK_KEYS,
6511 adapter->dev_id, cp_size, cp,
6512 load_link_keys_complete, adapter, NULL);
6517 btd_error(adapter->dev_id, "Failed to load link keys for hci%u",
6521 static gboolean load_ltks_timeout(gpointer user_data)
6523 struct btd_adapter *adapter = user_data;
6525 btd_error(adapter->dev_id, "Loading LTKs timed out for hci%u",
6528 adapter->load_ltks_timeout = 0;
6530 mgmt_cancel(adapter->mgmt, adapter->load_ltks_id);
6531 adapter->load_ltks_id = 0;
6536 static void load_ltks_complete(uint8_t status, uint16_t length,
6537 const void *param, void *user_data)
6539 struct btd_adapter *adapter = user_data;
6541 if (status != MGMT_STATUS_SUCCESS) {
6542 btd_error(adapter->dev_id,
6543 "Failed to load LTKs for hci%u: %s (0x%02x)",
6544 adapter->dev_id, mgmt_errstr(status), status);
6547 adapter->load_ltks_id = 0;
6549 g_source_remove(adapter->load_ltks_timeout);
6550 adapter->load_ltks_timeout = 0;
6552 DBG("LTKs loaded for hci%u", adapter->dev_id);
6555 static void load_ltks(struct btd_adapter *adapter, GSList *keys)
6557 struct mgmt_cp_load_long_term_keys *cp;
6558 struct mgmt_ltk_info *key;
6559 size_t key_count, cp_size;
6563 * If the controller does not support Low Energy operation,
6564 * there is no point in trying to load the long term keys
6567 * While there is no harm in loading keys into the kernel,
6568 * this is an optimization to avoid a confusing warning
6569 * message when the loading of the keys timed out due to
6570 * a kernel bug (see comment below).
6572 if (!(adapter->supported_settings & MGMT_SETTING_LE))
6575 key_count = g_slist_length(keys);
6577 DBG("hci%u keys %zu", adapter->dev_id, key_count);
6579 cp_size = sizeof(*cp) + (key_count * sizeof(*key));
6581 cp = g_try_malloc0(cp_size);
6583 btd_error(adapter->dev_id, "No memory for LTKs for hci%u",
6589 * Even if the list of stored keys is empty, it is important to
6590 * load an empty list into the kernel. That way it is ensured
6591 * that no old keys from a previous daemon are present.
6593 cp->key_count = htobs(key_count);
6595 for (l = keys, key = cp->keys; l != NULL; l = g_slist_next(l), key++) {
6596 struct smp_ltk_info *info = l->data;
6598 bacpy(&key->addr.bdaddr, &info->bdaddr);
6599 key->addr.type = info->bdaddr_type;
6600 memcpy(key->val, info->val, sizeof(info->val));
6601 key->rand = cpu_to_le64(info->rand);
6602 key->ediv = cpu_to_le16(info->ediv);
6603 key->type = info->authenticated;
6604 key->master = info->master;
6605 key->enc_size = info->enc_size;
6608 adapter->load_ltks_id = mgmt_send(adapter->mgmt,
6609 MGMT_OP_LOAD_LONG_TERM_KEYS,
6610 adapter->dev_id, cp_size, cp,
6611 load_ltks_complete, adapter, NULL);
6615 if (adapter->load_ltks_id == 0) {
6616 btd_error(adapter->dev_id, "Failed to load LTKs for hci%u",
6622 * This timeout handling is needed since the kernel is stupid
6623 * and forgets to send a command complete response. However in
6624 * case of failures it does send a command status.
6626 adapter->load_ltks_timeout = g_timeout_add_seconds(2,
6627 load_ltks_timeout, adapter);
6630 static void load_irks_complete(uint8_t status, uint16_t length,
6631 const void *param, void *user_data)
6633 struct btd_adapter *adapter = user_data;
6635 if (status == MGMT_STATUS_UNKNOWN_COMMAND) {
6636 btd_info(adapter->dev_id,
6637 "Load IRKs failed: Kernel doesn't support LE Privacy");
6641 if (status != MGMT_STATUS_SUCCESS) {
6642 btd_error(adapter->dev_id,
6643 "Failed to load IRKs for hci%u: %s (0x%02x)",
6644 adapter->dev_id, mgmt_errstr(status), status);
6648 DBG("IRKs loaded for hci%u", adapter->dev_id);
6651 #ifdef __TIZEN_PATCH__
6652 static void load_devices_rpa_res_support(struct btd_adapter *adapter)
6656 DBG("%s", adapter->path);
6658 for (l = adapter->devices; l; l = l->next) {
6659 struct btd_device *device = l->data;
6661 btd_adapter_set_dev_rpa_res_support(adapter, device);
6666 static void load_irks(struct btd_adapter *adapter, GSList *irks)
6668 struct mgmt_cp_load_irks *cp;
6669 struct mgmt_irk_info *irk;
6670 size_t irk_count, cp_size;
6675 * If the controller does not support LE Privacy operation,
6676 * there is no support for loading identity resolving keys
6679 if (!(adapter->supported_settings & MGMT_SETTING_PRIVACY))
6682 irk_count = g_slist_length(irks);
6684 DBG("hci%u irks %zu", adapter->dev_id, irk_count);
6686 cp_size = sizeof(*cp) + (irk_count * sizeof(*irk));
6688 cp = g_try_malloc0(cp_size);
6690 btd_error(adapter->dev_id, "No memory for IRKs for hci%u",
6696 * Even if the list of stored keys is empty, it is important to
6697 * load an empty list into the kernel. That way we tell the
6698 * kernel that we are able to handle New IRK events.
6700 cp->irk_count = htobs(irk_count);
6702 for (l = irks, irk = cp->irks; l != NULL; l = g_slist_next(l), irk++) {
6703 struct irk_info *info = l->data;
6705 bacpy(&irk->addr.bdaddr, &info->bdaddr);
6706 irk->addr.type = info->bdaddr_type;
6707 memcpy(irk->val, info->val, sizeof(irk->val));
6710 id = mgmt_send(adapter->mgmt, MGMT_OP_LOAD_IRKS, adapter->dev_id,
6711 cp_size, cp, load_irks_complete, adapter, NULL);
6716 btd_error(adapter->dev_id, "Failed to IRKs for hci%u",
6720 static void load_conn_params_complete(uint8_t status, uint16_t length,
6721 const void *param, void *user_data)
6723 struct btd_adapter *adapter = user_data;
6725 if (status != MGMT_STATUS_SUCCESS) {
6726 btd_error(adapter->dev_id,
6727 "hci%u Load Connection Parameters failed: %s (0x%02x)",
6728 adapter->dev_id, mgmt_errstr(status), status);
6732 DBG("Connection Parameters loaded for hci%u", adapter->dev_id);
6735 static void load_conn_params(struct btd_adapter *adapter, GSList *params)
6737 struct mgmt_cp_load_conn_param *cp;
6738 struct mgmt_conn_param *param;
6739 size_t param_count, cp_size;
6744 * If the controller does not support Low Energy operation,
6745 * there is no point in trying to load the connection
6746 * parameters into the kernel.
6748 if (!(adapter->supported_settings & MGMT_SETTING_LE))
6751 param_count = g_slist_length(params);
6753 DBG("hci%u conn params %zu", adapter->dev_id, param_count);
6755 cp_size = sizeof(*cp) + (param_count * sizeof(*param));
6757 cp = g_try_malloc0(cp_size);
6759 btd_error(adapter->dev_id,
6760 "Failed to allocate memory for connection parameters");
6764 cp->param_count = htobs(param_count);
6766 for (l = params, param = cp->params; l; l = g_slist_next(l), param++) {
6767 struct conn_param *info = l->data;
6769 bacpy(¶m->addr.bdaddr, &info->bdaddr);
6770 param->addr.type = info->bdaddr_type;
6771 param->min_interval = htobs(info->min_interval);
6772 param->max_interval = htobs(info->max_interval);
6773 param->latency = htobs(info->latency);
6774 param->timeout = htobs(info->timeout);
6777 id = mgmt_send(adapter->mgmt, MGMT_OP_LOAD_CONN_PARAM, adapter->dev_id,
6778 cp_size, cp, load_conn_params_complete, adapter, NULL);
6783 btd_error(adapter->dev_id, "Load connection parameters failed");
6786 static uint8_t get_le_addr_type(GKeyFile *keyfile)
6791 type = g_key_file_get_string(keyfile, "General", "AddressType", NULL);
6793 return BDADDR_LE_PUBLIC;
6795 if (g_str_equal(type, "public"))
6796 addr_type = BDADDR_LE_PUBLIC;
6797 else if (g_str_equal(type, "static"))
6798 addr_type = BDADDR_LE_RANDOM;
6800 addr_type = BDADDR_LE_PUBLIC;
6807 static void probe_devices(void *user_data)
6809 struct btd_device *device = user_data;
6811 device_probe_profiles(device, btd_device_get_uuids(device));
6814 static void load_devices(struct btd_adapter *adapter)
6816 char dirname[PATH_MAX];
6818 GSList *keys = NULL;
6819 GSList *ltks = NULL;
6820 GSList *irks = NULL;
6821 GSList *params = NULL;
6822 GSList *added_devices = NULL;
6824 struct dirent *entry;
6826 ba2str(&adapter->bdaddr, srcaddr);
6828 snprintf(dirname, PATH_MAX, STORAGEDIR "/%s", srcaddr);
6830 dir = opendir(dirname);
6832 btd_error(adapter->dev_id,
6833 "Unable to open adapter storage directory: %s",
6838 while ((entry = readdir(dir)) != NULL) {
6839 struct btd_device *device;
6840 char filename[PATH_MAX];
6842 #ifdef __TIZEN_PATCH__
6843 struct link_key_info *key_info = NULL;
6844 GSList *list, *ltk_info = NULL;
6846 struct link_key_info *key_info;
6847 GSList *list, *ltk_info;
6849 struct irk_info *irk_info;
6850 struct conn_param *param;
6851 uint8_t bdaddr_type;
6853 if (entry->d_type == DT_UNKNOWN)
6854 entry->d_type = util_get_dt(dirname, entry->d_name);
6856 if (entry->d_type != DT_DIR || bachk(entry->d_name) < 0)
6859 #ifdef __TIZEN_PATCH__
6863 str2ba(entry->d_name, &bdaddr);
6865 if (!bacmp(&bdaddr, BDADDR_ANY)) {
6866 error("No Bluetooth address");
6871 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/%s/info", srcaddr,
6874 key_file = g_key_file_new();
6875 g_key_file_load_from_file(key_file, filename, 0, NULL);
6877 key_info = get_key_info(key_file, entry->d_name);
6879 keys = g_slist_append(keys, key_info);
6881 bdaddr_type = get_le_addr_type(key_file);
6883 ltk_info = get_ltk_info(key_file, entry->d_name, bdaddr_type);
6884 ltks = g_slist_concat(ltks, ltk_info);
6886 irk_info = get_irk_info(key_file, entry->d_name, bdaddr_type);
6888 irks = g_slist_append(irks, irk_info);
6890 param = get_conn_param(key_file, entry->d_name, bdaddr_type);
6892 params = g_slist_append(params, param);
6894 list = g_slist_find_custom(adapter->devices, entry->d_name,
6895 device_address_cmp);
6897 device = list->data;
6901 device = device_create_from_storage(adapter, entry->d_name,
6906 #ifdef __TIZEN_PATCH__
6910 /* After load IRK information from file, store it into device->bdaddr
6911 RPA is stored in device->rpa_addr */
6912 ba2str(device_get_address(device), irk_addr);
6914 DBG("irk address: %s, rpa_exist %d", irk_addr, device_get_rpa_exist(device));
6916 if (device_get_rpa_exist(device) == true) {
6918 str2ba(irk_addr, &key_info->bdaddr);
6921 ltks = g_slist_remove(ltks, ltk_info);
6922 ltk_info = get_ltk_info(key_file, irk_addr, bdaddr_type);
6923 ltks = g_slist_concat(ltks, ltk_info);
6927 str2ba(irk_addr, &irk_info->bdaddr);
6928 device_set_irk_value(device, irk_info->val);
6932 str2ba(irk_addr, ¶m->bdaddr);
6937 btd_device_set_temporary(device, false);
6938 adapter->devices = g_slist_append(adapter->devices, device);
6940 /* TODO: register services from pre-loaded list of primaries */
6942 added_devices = g_slist_append(added_devices, device);
6946 device_set_paired(device, BDADDR_BREDR);
6947 device_set_bonded(device, BDADDR_BREDR);
6951 device_set_paired(device, bdaddr_type);
6952 device_set_bonded(device, bdaddr_type);
6956 g_key_file_free(key_file);
6961 load_link_keys(adapter, keys, main_opts.debug_keys);
6962 g_slist_free_full(keys, g_free);
6964 load_ltks(adapter, ltks);
6965 g_slist_free_full(ltks, g_free);
6966 load_irks(adapter, irks);
6967 g_slist_free_full(irks, g_free);
6968 load_conn_params(adapter, params);
6969 g_slist_free_full(params, g_free);
6971 g_slist_free_full(added_devices, probe_devices);
6973 #ifdef __TIZEN_PATCH__
6974 load_devices_rpa_res_support(adapter);
6978 int btd_adapter_block_address(struct btd_adapter *adapter,
6979 const bdaddr_t *bdaddr, uint8_t bdaddr_type)
6981 struct mgmt_cp_block_device cp;
6984 ba2str(bdaddr, addr);
6985 DBG("hci%u %s", adapter->dev_id, addr);
6987 memset(&cp, 0, sizeof(cp));
6988 bacpy(&cp.addr.bdaddr, bdaddr);
6989 cp.addr.type = bdaddr_type;
6991 if (mgmt_send(adapter->mgmt, MGMT_OP_BLOCK_DEVICE,
6992 adapter->dev_id, sizeof(cp), &cp,
6993 NULL, NULL, NULL) > 0)
6999 int btd_adapter_unblock_address(struct btd_adapter *adapter,
7000 const bdaddr_t *bdaddr, uint8_t bdaddr_type)
7002 struct mgmt_cp_unblock_device cp;
7005 ba2str(bdaddr, addr);
7006 DBG("hci%u %s", adapter->dev_id, addr);
7008 memset(&cp, 0, sizeof(cp));
7009 bacpy(&cp.addr.bdaddr, bdaddr);
7010 cp.addr.type = bdaddr_type;
7012 if (mgmt_send(adapter->mgmt, MGMT_OP_UNBLOCK_DEVICE,
7013 adapter->dev_id, sizeof(cp), &cp,
7014 NULL, NULL, NULL) > 0)
7020 static int clear_blocked(struct btd_adapter *adapter)
7022 return btd_adapter_unblock_address(adapter, BDADDR_ANY, 0);
7025 static void probe_driver(struct btd_adapter *adapter, gpointer user_data)
7027 struct btd_adapter_driver *driver = user_data;
7030 if (driver->probe == NULL)
7033 err = driver->probe(adapter);
7035 btd_error(adapter->dev_id, "%s: %s (%d)", driver->name,
7036 strerror(-err), -err);
7040 adapter->drivers = g_slist_prepend(adapter->drivers, driver);
7043 static void load_drivers(struct btd_adapter *adapter)
7047 for (l = adapter_drivers; l; l = l->next)
7048 probe_driver(adapter, l->data);
7051 static void probe_profile(struct btd_profile *profile, void *data)
7053 struct btd_adapter *adapter = data;
7056 if (profile->adapter_probe == NULL)
7059 err = profile->adapter_probe(profile, adapter);
7061 btd_error(adapter->dev_id, "%s: %s (%d)", profile->name,
7062 strerror(-err), -err);
7066 adapter->profiles = g_slist_prepend(adapter->profiles, profile);
7069 void adapter_add_profile(struct btd_adapter *adapter, gpointer p)
7071 struct btd_profile *profile = p;
7073 if (!adapter->initialized)
7076 probe_profile(profile, adapter);
7078 g_slist_foreach(adapter->devices, device_probe_profile, profile);
7081 void adapter_remove_profile(struct btd_adapter *adapter, gpointer p)
7083 struct btd_profile *profile = p;
7085 if (!adapter->initialized)
7088 if (profile->device_remove)
7089 g_slist_foreach(adapter->devices, device_remove_profile, p);
7091 adapter->profiles = g_slist_remove(adapter->profiles, profile);
7093 if (profile->adapter_remove)
7094 profile->adapter_remove(profile, adapter);
7097 static void adapter_add_connection(struct btd_adapter *adapter,
7098 struct btd_device *device,
7099 uint8_t bdaddr_type)
7101 device_add_connection(device, bdaddr_type);
7103 if (g_slist_find(adapter->connections, device)) {
7104 btd_error(adapter->dev_id,
7105 "Device is already marked as connected");
7109 adapter->connections = g_slist_append(adapter->connections, device);
7112 static void get_connections_complete(uint8_t status, uint16_t length,
7113 const void *param, void *user_data)
7115 struct btd_adapter *adapter = user_data;
7116 const struct mgmt_rp_get_connections *rp = param;
7117 uint16_t i, conn_count;
7119 if (status != MGMT_STATUS_SUCCESS) {
7120 btd_error(adapter->dev_id,
7121 "Failed to get connections: %s (0x%02x)",
7122 mgmt_errstr(status), status);
7126 if (length < sizeof(*rp)) {
7127 btd_error(adapter->dev_id,
7128 "Wrong size of get connections response");
7132 conn_count = btohs(rp->conn_count);
7134 DBG("Connection count: %d", conn_count);
7136 if (conn_count * sizeof(struct mgmt_addr_info) +
7137 sizeof(*rp) != length) {
7138 btd_error(adapter->dev_id,
7139 "Incorrect packet size for get connections response");
7143 for (i = 0; i < conn_count; i++) {
7144 const struct mgmt_addr_info *addr = &rp->addr[i];
7145 struct btd_device *device;
7148 ba2str(&addr->bdaddr, address);
7149 DBG("Adding existing connection to %s", address);
7151 device = btd_adapter_get_device(adapter, &addr->bdaddr,
7154 adapter_add_connection(adapter, device, addr->type);
7158 static void load_connections(struct btd_adapter *adapter)
7160 DBG("sending get connections command for index %u", adapter->dev_id);
7162 if (mgmt_send(adapter->mgmt, MGMT_OP_GET_CONNECTIONS,
7163 adapter->dev_id, 0, NULL,
7164 get_connections_complete, adapter, NULL) > 0)
7167 btd_error(adapter->dev_id, "Failed to get connections for index %u",
7171 bool btd_adapter_get_pairable(struct btd_adapter *adapter)
7173 if (adapter->current_settings & MGMT_SETTING_BONDABLE)
7179 bool btd_adapter_get_powered(struct btd_adapter *adapter)
7181 if (adapter->current_settings & MGMT_SETTING_POWERED)
7187 bool btd_adapter_get_connectable(struct btd_adapter *adapter)
7189 if (adapter->current_settings & MGMT_SETTING_CONNECTABLE)
7195 struct btd_gatt_database *btd_adapter_get_database(struct btd_adapter *adapter)
7200 return adapter->database;
7203 uint32_t btd_adapter_get_class(struct btd_adapter *adapter)
7205 return adapter->dev_class;
7208 const char *btd_adapter_get_name(struct btd_adapter *adapter)
7210 if (adapter->stored_alias)
7211 return adapter->stored_alias;
7213 if (adapter->system_name)
7214 return adapter->system_name;
7219 int adapter_connect_list_add(struct btd_adapter *adapter,
7220 struct btd_device *device)
7223 * If the adapter->connect_le device is getting added back to
7224 * the connect list it probably means that the connect attempt
7225 * failed and hence we should clear this pointer
7227 if (device == adapter->connect_le)
7228 adapter->connect_le = NULL;
7231 * If kernel background scanning is supported then the
7232 * adapter_auto_connect_add() function is used to maintain what to
7235 if (kernel_conn_control)
7238 if (g_slist_find(adapter->connect_list, device)) {
7239 DBG("ignoring already added device %s",
7240 device_get_path(device));
7244 if (!(adapter->supported_settings & MGMT_SETTING_LE)) {
7245 btd_error(adapter->dev_id,
7246 "Can't add %s to non-LE capable adapter connect list",
7247 device_get_path(device));
7251 adapter->connect_list = g_slist_append(adapter->connect_list, device);
7252 DBG("%s added to %s's connect_list", device_get_path(device),
7253 adapter->system_name);
7256 if (!(adapter->current_settings & MGMT_SETTING_POWERED))
7259 trigger_passive_scanning(adapter);
7264 void adapter_connect_list_remove(struct btd_adapter *adapter,
7265 struct btd_device *device)
7268 * If the adapter->connect_le device is being removed from the
7269 * connect list it means the connection was successful and hence
7270 * the pointer should be cleared
7272 if (device == adapter->connect_le)
7273 adapter->connect_le = NULL;
7275 if (kernel_conn_control)
7278 if (!g_slist_find(adapter->connect_list, device)) {
7279 DBG("device %s is not on the list, ignoring",
7280 device_get_path(device));
7284 adapter->connect_list = g_slist_remove(adapter->connect_list, device);
7285 DBG("%s removed from %s's connect_list", device_get_path(device),
7286 adapter->system_name);
7288 if (!adapter->connect_list) {
7289 stop_passive_scanning(adapter);
7293 if (!(adapter->current_settings & MGMT_SETTING_POWERED))
7296 trigger_passive_scanning(adapter);
7299 static void add_whitelist_complete(uint8_t status, uint16_t length,
7300 const void *param, void *user_data)
7302 const struct mgmt_rp_add_device *rp = param;
7303 struct btd_adapter *adapter = user_data;
7304 struct btd_device *dev;
7307 if (length < sizeof(*rp)) {
7308 btd_error(adapter->dev_id,
7309 "Too small Add Device complete event");
7313 ba2str(&rp->addr.bdaddr, addr);
7315 dev = btd_adapter_find_device(adapter, &rp->addr.bdaddr,
7318 btd_error(adapter->dev_id,
7319 "Add Device complete for unknown device %s", addr);
7323 if (status != MGMT_STATUS_SUCCESS) {
7324 btd_error(adapter->dev_id,
7325 "Failed to add device %s: %s (0x%02x)",
7326 addr, mgmt_errstr(status), status);
7330 DBG("%s added to kernel whitelist", addr);
7333 void adapter_whitelist_add(struct btd_adapter *adapter, struct btd_device *dev)
7335 struct mgmt_cp_add_device cp;
7337 if (!kernel_conn_control)
7340 memset(&cp, 0, sizeof(cp));
7341 bacpy(&cp.addr.bdaddr, device_get_address(dev));
7342 cp.addr.type = BDADDR_BREDR;
7345 mgmt_send(adapter->mgmt, MGMT_OP_ADD_DEVICE,
7346 adapter->dev_id, sizeof(cp), &cp,
7347 add_whitelist_complete, adapter, NULL);
7350 static void remove_whitelist_complete(uint8_t status, uint16_t length,
7351 const void *param, void *user_data)
7353 const struct mgmt_rp_remove_device *rp = param;
7356 if (length < sizeof(*rp)) {
7357 error("Too small Remove Device complete event");
7361 ba2str(&rp->addr.bdaddr, addr);
7363 if (status != MGMT_STATUS_SUCCESS) {
7364 error("Failed to remove device %s: %s (0x%02x)",
7365 addr, mgmt_errstr(status), status);
7369 DBG("%s removed from kernel whitelist", addr);
7372 void adapter_whitelist_remove(struct btd_adapter *adapter, struct btd_device *dev)
7374 struct mgmt_cp_remove_device cp;
7376 if (!kernel_conn_control)
7379 memset(&cp, 0, sizeof(cp));
7380 bacpy(&cp.addr.bdaddr, device_get_address(dev));
7381 cp.addr.type = BDADDR_BREDR;
7383 mgmt_send(adapter->mgmt, MGMT_OP_REMOVE_DEVICE,
7384 adapter->dev_id, sizeof(cp), &cp,
7385 remove_whitelist_complete, adapter, NULL);
7388 static void add_device_complete(uint8_t status, uint16_t length,
7389 const void *param, void *user_data)
7391 const struct mgmt_rp_add_device *rp = param;
7392 struct btd_adapter *adapter = user_data;
7393 struct btd_device *dev;
7396 if (length < sizeof(*rp)) {
7397 btd_error(adapter->dev_id,
7398 "Too small Add Device complete event");
7402 ba2str(&rp->addr.bdaddr, addr);
7404 dev = btd_adapter_find_device(adapter, &rp->addr.bdaddr,
7407 btd_error(adapter->dev_id,
7408 "Add Device complete for unknown device %s", addr);
7412 if (status != MGMT_STATUS_SUCCESS) {
7413 btd_error(adapter->dev_id,
7414 "Failed to add device %s (%u): %s (0x%02x)",
7415 addr, rp->addr.type, mgmt_errstr(status), status);
7416 adapter->connect_list = g_slist_remove(adapter->connect_list,
7421 DBG("%s (%u) added to kernel connect list", addr, rp->addr.type);
7424 void adapter_auto_connect_add(struct btd_adapter *adapter,
7425 struct btd_device *device)
7427 struct mgmt_cp_add_device cp;
7428 const bdaddr_t *bdaddr;
7429 uint8_t bdaddr_type;
7432 if (!kernel_conn_control)
7435 if (g_slist_find(adapter->connect_list, device)) {
7436 DBG("ignoring already added device %s",
7437 device_get_path(device));
7441 bdaddr = device_get_address(device);
7442 bdaddr_type = btd_device_get_bdaddr_type(device);
7444 if (bdaddr_type == BDADDR_BREDR) {
7445 DBG("auto-connection feature is not avaiable for BR/EDR");
7449 memset(&cp, 0, sizeof(cp));
7450 bacpy(&cp.addr.bdaddr, bdaddr);
7451 cp.addr.type = bdaddr_type;
7454 id = mgmt_send(adapter->mgmt, MGMT_OP_ADD_DEVICE,
7455 adapter->dev_id, sizeof(cp), &cp, add_device_complete,
7460 adapter->connect_list = g_slist_append(adapter->connect_list, device);
7463 static void remove_device_complete(uint8_t status, uint16_t length,
7464 const void *param, void *user_data)
7466 const struct mgmt_rp_remove_device *rp = param;
7469 if (length < sizeof(*rp)) {
7470 error("Too small Remove Device complete event");
7474 ba2str(&rp->addr.bdaddr, addr);
7476 if (status != MGMT_STATUS_SUCCESS) {
7477 error("Failed to remove device %s (%u): %s (0x%02x)",
7478 addr, rp->addr.type, mgmt_errstr(status), status);
7482 DBG("%s (%u) removed from kernel connect list", addr, rp->addr.type);
7485 void adapter_auto_connect_remove(struct btd_adapter *adapter,
7486 struct btd_device *device)
7488 struct mgmt_cp_remove_device cp;
7489 const bdaddr_t *bdaddr;
7490 uint8_t bdaddr_type;
7493 if (!kernel_conn_control)
7496 if (!g_slist_find(adapter->connect_list, device)) {
7497 DBG("ignoring not added device %s", device_get_path(device));
7501 bdaddr = device_get_address(device);
7502 bdaddr_type = btd_device_get_bdaddr_type(device);
7504 if (bdaddr_type == BDADDR_BREDR) {
7505 DBG("auto-connection feature is not avaiable for BR/EDR");
7509 memset(&cp, 0, sizeof(cp));
7510 bacpy(&cp.addr.bdaddr, bdaddr);
7511 cp.addr.type = bdaddr_type;
7513 id = mgmt_send(adapter->mgmt, MGMT_OP_REMOVE_DEVICE,
7514 adapter->dev_id, sizeof(cp), &cp,
7515 remove_device_complete, adapter, NULL);
7519 adapter->connect_list = g_slist_remove(adapter->connect_list, device);
7522 static void adapter_start(struct btd_adapter *adapter)
7524 #if defined(__TIZEN_PATCH__) && !defined(__SPRD_PATCH__)
7525 if (adapter_le_read_ble_feature_info())
7526 g_dbus_emit_property_changed(dbus_conn, adapter->path,
7527 ADAPTER_INTERFACE, "SupportedLEFeatures");
7529 adapter_get_adv_tx_power(adapter);
7531 /* By default enable offloading for testing, this should be modified */
7532 if (adapter_le_is_supported_offloading())
7533 adapter_le_enable_offloading(TRUE);
7536 #ifndef __TIZEN_PATCH__
7537 g_dbus_emit_property_changed(dbus_conn, adapter->path,
7538 ADAPTER_INTERFACE, "Powered");
7540 g_dbus_emit_property_changed_full(dbus_conn, adapter->path,
7541 ADAPTER_INTERFACE, "Powered", 1);
7544 DBG("adapter %s has been enabled", adapter->path);
7546 trigger_passive_scanning(adapter);
7549 static void reply_pending_requests(struct btd_adapter *adapter)
7556 /* pending bonding */
7557 for (l = adapter->devices; l; l = l->next) {
7558 struct btd_device *device = l->data;
7560 if (device_is_bonding(device, NULL))
7561 device_bonding_failed(device,
7562 HCI_OE_USER_ENDED_CONNECTION);
7566 static void remove_driver(gpointer data, gpointer user_data)
7568 struct btd_adapter_driver *driver = data;
7569 struct btd_adapter *adapter = user_data;
7572 driver->remove(adapter);
7575 static void remove_profile(gpointer data, gpointer user_data)
7577 struct btd_profile *profile = data;
7578 struct btd_adapter *adapter = user_data;
7580 if (profile->adapter_remove)
7581 profile->adapter_remove(profile, adapter);
7584 static void unload_drivers(struct btd_adapter *adapter)
7586 g_slist_foreach(adapter->drivers, remove_driver, adapter);
7587 g_slist_free(adapter->drivers);
7588 adapter->drivers = NULL;
7590 g_slist_foreach(adapter->profiles, remove_profile, adapter);
7591 g_slist_free(adapter->profiles);
7592 adapter->profiles = NULL;
7595 static void free_service_auth(gpointer data, gpointer user_data)
7597 struct service_auth *auth = data;
7602 static void adapter_free(gpointer user_data)
7604 struct btd_adapter *adapter = user_data;
7608 if (adapter->load_ltks_timeout > 0)
7609 g_source_remove(adapter->load_ltks_timeout);
7611 if (adapter->confirm_name_timeout > 0)
7612 g_source_remove(adapter->confirm_name_timeout);
7614 if (adapter->pair_device_timeout > 0)
7615 g_source_remove(adapter->pair_device_timeout);
7617 if (adapter->auth_idle_id)
7618 g_source_remove(adapter->auth_idle_id);
7620 g_queue_foreach(adapter->auths, free_service_auth, NULL);
7621 g_queue_free(adapter->auths);
7624 * Unregister all handlers for this specific index since
7625 * the adapter bound to them is no longer valid.
7627 * This also avoids having multiple instances of the same
7628 * handler in case indexes got removed and re-added.
7630 mgmt_unregister_index(adapter->mgmt, adapter->dev_id);
7633 * Cancel all pending commands for this specific index
7634 * since the adapter bound to them is no longer valid.
7636 mgmt_cancel_index(adapter->mgmt, adapter->dev_id);
7638 mgmt_unref(adapter->mgmt);
7640 sdp_list_free(adapter->services, NULL);
7642 g_slist_free(adapter->connections);
7644 g_free(adapter->path);
7645 g_free(adapter->name);
7646 g_free(adapter->short_name);
7647 g_free(adapter->system_name);
7648 g_free(adapter->stored_alias);
7649 g_free(adapter->current_alias);
7650 free(adapter->modalias);
7654 struct btd_adapter *btd_adapter_ref(struct btd_adapter *adapter)
7656 __sync_fetch_and_add(&adapter->ref_count, 1);
7661 void btd_adapter_unref(struct btd_adapter *adapter)
7663 if (__sync_sub_and_fetch(&adapter->ref_count, 1))
7666 if (!adapter->path) {
7667 DBG("Freeing adapter %u", adapter->dev_id);
7669 adapter_free(adapter);
7673 DBG("Freeing adapter %s", adapter->path);
7675 g_dbus_unregister_interface(dbus_conn, adapter->path,
7679 static void convert_names_entry(char *key, char *value, void *user_data)
7681 char *address = user_data;
7683 char filename[PATH_MAX];
7688 if (strchr(key, '#'))
7691 if (bachk(str) != 0)
7694 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/cache/%s", address, str);
7695 create_file(filename, S_IRUSR | S_IWUSR);
7697 key_file = g_key_file_new();
7698 g_key_file_load_from_file(key_file, filename, 0, NULL);
7699 g_key_file_set_string(key_file, "General", "Name", value);
7701 data = g_key_file_to_data(key_file, &length, NULL);
7702 g_file_set_contents(filename, data, length, NULL);
7705 g_key_file_free(key_file);
7708 struct device_converter {
7710 void (*cb)(GKeyFile *key_file, void *value);
7714 static void set_device_type(GKeyFile *key_file, char type)
7717 char *addr_type = NULL;
7724 case BDADDR_LE_PUBLIC:
7726 addr_type = "public";
7728 case BDADDR_LE_RANDOM:
7730 addr_type = "static";
7736 str = g_key_file_get_string(key_file, "General",
7737 "SupportedTechnologies", NULL);
7739 g_key_file_set_string(key_file, "General",
7740 "SupportedTechnologies", techno);
7741 else if (!strstr(str, techno))
7742 g_key_file_set_string(key_file, "General",
7743 "SupportedTechnologies", "BR/EDR;LE");
7748 g_key_file_set_string(key_file, "General", "AddressType",
7752 static void convert_aliases_entry(GKeyFile *key_file, void *value)
7754 g_key_file_set_string(key_file, "General", "Alias", value);
7757 static void convert_trusts_entry(GKeyFile *key_file, void *value)
7759 g_key_file_set_boolean(key_file, "General", "Trusted", TRUE);
7762 static void convert_classes_entry(GKeyFile *key_file, void *value)
7764 g_key_file_set_string(key_file, "General", "Class", value);
7767 static void convert_blocked_entry(GKeyFile *key_file, void *value)
7769 g_key_file_set_boolean(key_file, "General", "Blocked", TRUE);
7772 static void convert_did_entry(GKeyFile *key_file, void *value)
7774 char *vendor_str, *product_str, *version_str;
7777 vendor_str = strchr(value, ' ');
7781 *(vendor_str++) = 0;
7783 if (g_str_equal(value, "FFFF"))
7786 product_str = strchr(vendor_str, ' ');
7790 *(product_str++) = 0;
7792 version_str = strchr(product_str, ' ');
7796 *(version_str++) = 0;
7798 val = (uint16_t) strtol(value, NULL, 16);
7799 g_key_file_set_integer(key_file, "DeviceID", "Source", val);
7801 val = (uint16_t) strtol(vendor_str, NULL, 16);
7802 g_key_file_set_integer(key_file, "DeviceID", "Vendor", val);
7804 val = (uint16_t) strtol(product_str, NULL, 16);
7805 g_key_file_set_integer(key_file, "DeviceID", "Product", val);
7807 val = (uint16_t) strtol(version_str, NULL, 16);
7808 g_key_file_set_integer(key_file, "DeviceID", "Version", val);
7811 static void convert_linkkey_entry(GKeyFile *key_file, void *value)
7813 char *type_str, *length_str, *str;
7816 type_str = strchr(value, ' ');
7822 length_str = strchr(type_str, ' ');
7826 *(length_str++) = 0;
7828 str = g_strconcat("0x", value, NULL);
7829 g_key_file_set_string(key_file, "LinkKey", "Key", str);
7832 val = strtol(type_str, NULL, 16);
7833 g_key_file_set_integer(key_file, "LinkKey", "Type", val);
7835 val = strtol(length_str, NULL, 16);
7836 g_key_file_set_integer(key_file, "LinkKey", "PINLength", val);
7839 static void convert_ltk_entry(GKeyFile *key_file, void *value)
7841 char *auth_str, *rand_str, *str;
7843 unsigned char auth, master, enc_size;
7844 unsigned short ediv;
7846 auth_str = strchr(value, ' ');
7852 for (i = 0, rand_str = auth_str; i < 4; i++) {
7853 rand_str = strchr(rand_str, ' ');
7854 if (!rand_str || rand_str[1] == '\0')
7860 ret = sscanf(auth_str, " %hhd %hhd %hhd %hd", &auth, &master,
7865 str = g_strconcat("0x", value, NULL);
7866 g_key_file_set_string(key_file, "LongTermKey", "Key", str);
7869 g_key_file_set_integer(key_file, "LongTermKey", "Authenticated", auth);
7870 g_key_file_set_integer(key_file, "LongTermKey", "Master", master);
7871 g_key_file_set_integer(key_file, "LongTermKey", "EncSize", enc_size);
7872 g_key_file_set_integer(key_file, "LongTermKey", "EDiv", ediv);
7874 str = g_strconcat("0x", rand_str, NULL);
7875 g_key_file_set_string(key_file, "LongTermKey", "Rand", str);
7879 static void convert_profiles_entry(GKeyFile *key_file, void *value)
7881 g_strdelimit(value, " ", ';');
7882 g_key_file_set_string(key_file, "General", "Services", value);
7885 static void convert_appearances_entry(GKeyFile *key_file, void *value)
7887 g_key_file_set_string(key_file, "General", "Appearance", value);
7890 static void convert_entry(char *key, char *value, void *user_data)
7892 struct device_converter *converter = user_data;
7893 char type = BDADDR_BREDR;
7894 char filename[PATH_MAX];
7899 if (strchr(key, '#')) {
7901 type = key[18] - '0';
7904 if (bachk(key) != 0)
7907 if (converter->force == FALSE) {
7911 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/%s",
7912 converter->address, key);
7914 err = stat(filename, &st);
7915 if (err || !S_ISDIR(st.st_mode))
7919 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/%s/info",
7920 converter->address, key);
7922 key_file = g_key_file_new();
7923 g_key_file_load_from_file(key_file, filename, 0, NULL);
7925 set_device_type(key_file, type);
7927 converter->cb(key_file, value);
7929 data = g_key_file_to_data(key_file, &length, NULL);
7931 create_file(filename, S_IRUSR | S_IWUSR);
7932 g_file_set_contents(filename, data, length, NULL);
7937 g_key_file_free(key_file);
7940 static void convert_file(char *file, char *address,
7941 void (*cb)(GKeyFile *key_file, void *value),
7944 char filename[PATH_MAX];
7945 struct device_converter converter;
7947 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/%s", address, file);
7949 converter.address = address;
7951 converter.force = force;
7953 textfile_foreach(filename, convert_entry, &converter);
7956 static gboolean record_has_uuid(const sdp_record_t *rec,
7957 const char *profile_uuid)
7961 for (pat = rec->pattern; pat != NULL; pat = pat->next) {
7965 uuid = bt_uuid2string(pat->data);
7969 ret = strcasecmp(uuid, profile_uuid);
7980 static void store_attribute_uuid(GKeyFile *key_file, uint16_t start,
7981 uint16_t end, char *att_uuid,
7984 char handle[6], uuid_str[33];
7987 switch (uuid.type) {
7989 sprintf(uuid_str, "%4.4X", uuid.value.uuid16);
7992 sprintf(uuid_str, "%8.8X", uuid.value.uuid32);
7995 for (i = 0; i < 16; i++)
7996 sprintf(uuid_str + (i * 2), "%2.2X",
7997 uuid.value.uuid128.data[i]);
8003 sprintf(handle, "%hu", start);
8004 g_key_file_set_string(key_file, handle, "UUID", att_uuid);
8005 g_key_file_set_string(key_file, handle, "Value", uuid_str);
8006 g_key_file_set_integer(key_file, handle, "EndGroupHandle", end);
8009 static void store_sdp_record(char *local, char *peer, int handle, char *value)
8011 char filename[PATH_MAX];
8013 char handle_str[11];
8017 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/cache/%s", local, peer);
8019 key_file = g_key_file_new();
8020 g_key_file_load_from_file(key_file, filename, 0, NULL);
8022 sprintf(handle_str, "0x%8.8X", handle);
8023 g_key_file_set_string(key_file, "ServiceRecords", handle_str, value);
8025 data = g_key_file_to_data(key_file, &length, NULL);
8027 create_file(filename, S_IRUSR | S_IWUSR);
8028 g_file_set_contents(filename, data, length, NULL);
8033 g_key_file_free(key_file);
8036 static void convert_sdp_entry(char *key, char *value, void *user_data)
8038 char *src_addr = user_data;
8040 char type = BDADDR_BREDR;
8042 char filename[PATH_MAX];
8047 char *att_uuid, *prim_uuid;
8048 uint16_t start = 0, end = 0, psm = 0;
8053 ret = sscanf(key, "%17s#%hhu#%08X", dst_addr, &type, &handle);
8055 ret = sscanf(key, "%17s#%08X", dst_addr, &handle);
8060 if (bachk(dst_addr) != 0)
8063 /* Check if the device directory has been created as records should
8064 * only be converted for known devices */
8065 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/%s", src_addr, dst_addr);
8067 err = stat(filename, &st);
8068 if (err || !S_ISDIR(st.st_mode))
8071 /* store device records in cache */
8072 store_sdp_record(src_addr, dst_addr, handle, value);
8074 /* Retrieve device record and check if there is an
8075 * attribute entry in it */
8076 sdp_uuid16_create(&uuid, ATT_UUID);
8077 att_uuid = bt_uuid2string(&uuid);
8079 sdp_uuid16_create(&uuid, GATT_PRIM_SVC_UUID);
8080 prim_uuid = bt_uuid2string(&uuid);
8082 rec = record_from_string(value);
8084 if (record_has_uuid(rec, att_uuid))
8087 /* TODO: Do this through btd_gatt_database */
8088 if (!gatt_parse_record(rec, &uuid, &psm, &start, &end))
8091 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/%s/attributes", src_addr,
8094 key_file = g_key_file_new();
8095 g_key_file_load_from_file(key_file, filename, 0, NULL);
8097 store_attribute_uuid(key_file, start, end, prim_uuid, uuid);
8099 data = g_key_file_to_data(key_file, &length, NULL);
8101 create_file(filename, S_IRUSR | S_IWUSR);
8102 g_file_set_contents(filename, data, length, NULL);
8106 g_key_file_free(key_file);
8109 sdp_record_free(rec);
8114 static void convert_primaries_entry(char *key, char *value, void *user_data)
8116 char *address = user_data;
8117 int device_type = -1;
8119 char **services, **service, *prim_uuid;
8120 char filename[PATH_MAX];
8123 uint16_t start, end;
8124 char uuid_str[MAX_LEN_UUID_STR + 1];
8128 if (strchr(key, '#')) {
8130 device_type = key[18] - '0';
8133 if (bachk(key) != 0)
8136 services = g_strsplit(value, " ", 0);
8137 if (services == NULL)
8140 sdp_uuid16_create(&uuid, GATT_PRIM_SVC_UUID);
8141 prim_uuid = bt_uuid2string(&uuid);
8143 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/%s/attributes", address,
8145 key_file = g_key_file_new();
8146 g_key_file_load_from_file(key_file, filename, 0, NULL);
8148 for (service = services; *service; service++) {
8149 ret = sscanf(*service, "%04hX#%04hX#%s", &start, &end,
8154 bt_string2uuid(&uuid, uuid_str);
8155 sdp_uuid128_to_uuid(&uuid);
8157 store_attribute_uuid(key_file, start, end, prim_uuid, uuid);
8160 g_strfreev(services);
8162 data = g_key_file_to_data(key_file, &length, NULL);
8166 create_file(filename, S_IRUSR | S_IWUSR);
8167 g_file_set_contents(filename, data, length, NULL);
8169 if (device_type < 0)
8173 g_key_file_free(key_file);
8175 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/%s/info", address, key);
8177 key_file = g_key_file_new();
8178 g_key_file_load_from_file(key_file, filename, 0, NULL);
8179 set_device_type(key_file, device_type);
8181 data = g_key_file_to_data(key_file, &length, NULL);
8183 create_file(filename, S_IRUSR | S_IWUSR);
8184 g_file_set_contents(filename, data, length, NULL);
8190 g_key_file_free(key_file);
8193 static void convert_ccc_entry(char *key, char *value, void *user_data)
8195 char *src_addr = user_data;
8197 char type = BDADDR_BREDR;
8200 char filename[PATH_MAX];
8207 ret = sscanf(key, "%17s#%hhu#%04hX", dst_addr, &type, &handle);
8211 if (bachk(dst_addr) != 0)
8214 /* Check if the device directory has been created as records should
8215 * only be converted for known devices */
8216 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/%s", src_addr, dst_addr);
8218 err = stat(filename, &st);
8219 if (err || !S_ISDIR(st.st_mode))
8222 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/%s/ccc", src_addr,
8224 key_file = g_key_file_new();
8225 g_key_file_load_from_file(key_file, filename, 0, NULL);
8227 sprintf(group, "%hu", handle);
8228 g_key_file_set_string(key_file, group, "Value", value);
8230 data = g_key_file_to_data(key_file, &length, NULL);
8232 create_file(filename, S_IRUSR | S_IWUSR);
8233 g_file_set_contents(filename, data, length, NULL);
8237 g_key_file_free(key_file);
8240 static void convert_gatt_entry(char *key, char *value, void *user_data)
8242 char *src_addr = user_data;
8244 char type = BDADDR_BREDR;
8247 char filename[PATH_MAX];
8254 ret = sscanf(key, "%17s#%hhu#%04hX", dst_addr, &type, &handle);
8258 if (bachk(dst_addr) != 0)
8261 /* Check if the device directory has been created as records should
8262 * only be converted for known devices */
8263 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/%s", src_addr, dst_addr);
8265 err = stat(filename, &st);
8266 if (err || !S_ISDIR(st.st_mode))
8269 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/%s/gatt", src_addr,
8271 key_file = g_key_file_new();
8272 g_key_file_load_from_file(key_file, filename, 0, NULL);
8274 sprintf(group, "%hu", handle);
8275 g_key_file_set_string(key_file, group, "Value", value);
8277 data = g_key_file_to_data(key_file, &length, NULL);
8279 create_file(filename, S_IRUSR | S_IWUSR);
8280 g_file_set_contents(filename, data, length, NULL);
8284 g_key_file_free(key_file);
8287 static void convert_proximity_entry(char *key, char *value, void *user_data)
8289 char *src_addr = user_data;
8291 char filename[PATH_MAX];
8298 if (!strchr(key, '#'))
8304 if (bachk(key) != 0)
8307 /* Check if the device directory has been created as records should
8308 * only be converted for known devices */
8309 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/%s", src_addr, key);
8311 err = stat(filename, &st);
8312 if (err || !S_ISDIR(st.st_mode))
8315 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/%s/proximity", src_addr,
8317 key_file = g_key_file_new();
8318 g_key_file_load_from_file(key_file, filename, 0, NULL);
8320 g_key_file_set_string(key_file, alert, "Level", value);
8322 data = g_key_file_to_data(key_file, &length, NULL);
8324 create_file(filename, S_IRUSR | S_IWUSR);
8325 g_file_set_contents(filename, data, length, NULL);
8329 g_key_file_free(key_file);
8332 static void convert_device_storage(struct btd_adapter *adapter)
8334 char filename[PATH_MAX];
8337 ba2str(&adapter->bdaddr, address);
8339 /* Convert device's name cache */
8340 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/names", address);
8341 textfile_foreach(filename, convert_names_entry, address);
8343 /* Convert aliases */
8344 convert_file("aliases", address, convert_aliases_entry, TRUE);
8346 /* Convert trusts */
8347 convert_file("trusts", address, convert_trusts_entry, TRUE);
8349 /* Convert blocked */
8350 convert_file("blocked", address, convert_blocked_entry, TRUE);
8352 /* Convert profiles */
8353 convert_file("profiles", address, convert_profiles_entry, TRUE);
8355 /* Convert primaries */
8356 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/primaries", address);
8357 textfile_foreach(filename, convert_primaries_entry, address);
8359 /* Convert linkkeys */
8360 convert_file("linkkeys", address, convert_linkkey_entry, TRUE);
8362 /* Convert longtermkeys */
8363 convert_file("longtermkeys", address, convert_ltk_entry, TRUE);
8365 /* Convert classes */
8366 convert_file("classes", address, convert_classes_entry, FALSE);
8368 /* Convert device ids */
8369 convert_file("did", address, convert_did_entry, FALSE);
8372 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/sdp", address);
8373 textfile_foreach(filename, convert_sdp_entry, address);
8376 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/ccc", address);
8377 textfile_foreach(filename, convert_ccc_entry, address);
8379 /* Convert appearances */
8380 convert_file("appearances", address, convert_appearances_entry, FALSE);
8383 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/gatt", address);
8384 textfile_foreach(filename, convert_gatt_entry, address);
8386 /* Convert proximity */
8387 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/proximity", address);
8388 textfile_foreach(filename, convert_proximity_entry, address);
8391 static void convert_config(struct btd_adapter *adapter, const char *filename,
8395 char str[MAX_NAME_LENGTH + 1];
8396 char config_path[PATH_MAX];
8402 ba2str(&adapter->bdaddr, address);
8403 snprintf(config_path, PATH_MAX, STORAGEDIR "/%s/config", address);
8405 if (read_pairable_timeout(address, &timeout) == 0)
8406 g_key_file_set_integer(key_file, "General",
8407 "PairableTimeout", timeout);
8409 if (read_discoverable_timeout(address, &timeout) == 0)
8410 g_key_file_set_integer(key_file, "General",
8411 "DiscoverableTimeout", timeout);
8413 if (read_on_mode(address, str, sizeof(str)) == 0) {
8414 mode = get_mode(str);
8415 g_key_file_set_boolean(key_file, "General", "Discoverable",
8416 mode == MODE_DISCOVERABLE);
8419 if (read_local_name(&adapter->bdaddr, str) == 0)
8420 g_key_file_set_string(key_file, "General", "Alias", str);
8422 create_file(filename, S_IRUSR | S_IWUSR);
8424 data = g_key_file_to_data(key_file, &length, NULL);
8425 g_file_set_contents(filename, data, length, NULL);
8429 static void fix_storage(struct btd_adapter *adapter)
8431 char filename[PATH_MAX];
8435 ba2str(&adapter->bdaddr, address);
8437 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/config", address);
8438 converted = textfile_get(filename, "converted");
8444 textfile_del(filename, "converted");
8446 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/names", address);
8447 textfile_del(filename, "converted");
8449 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/aliases", address);
8450 textfile_del(filename, "converted");
8452 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/trusts", address);
8453 textfile_del(filename, "converted");
8455 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/blocked", address);
8456 textfile_del(filename, "converted");
8458 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/profiles", address);
8459 textfile_del(filename, "converted");
8461 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/primaries", address);
8462 textfile_del(filename, "converted");
8464 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/linkkeys", address);
8465 textfile_del(filename, "converted");
8467 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/longtermkeys", address);
8468 textfile_del(filename, "converted");
8470 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/classes", address);
8471 textfile_del(filename, "converted");
8473 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/did", address);
8474 textfile_del(filename, "converted");
8476 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/sdp", address);
8477 textfile_del(filename, "converted");
8479 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/ccc", address);
8480 textfile_del(filename, "converted");
8482 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/appearances", address);
8483 textfile_del(filename, "converted");
8485 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/gatt", address);
8486 textfile_del(filename, "converted");
8488 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/proximity", address);
8489 textfile_del(filename, "converted");
8492 static void load_config(struct btd_adapter *adapter)
8495 char filename[PATH_MAX];
8498 GError *gerr = NULL;
8499 #ifdef __TIZEN_PATCH__
8503 ba2str(&adapter->bdaddr, address);
8505 key_file = g_key_file_new();
8507 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/settings", address);
8509 if (stat(filename, &st) < 0) {
8510 convert_config(adapter, filename, key_file);
8511 convert_device_storage(adapter);
8514 g_key_file_load_from_file(key_file, filename, 0, NULL);
8517 adapter->stored_alias = g_key_file_get_string(key_file, "General",
8519 if (!adapter->stored_alias) {
8521 adapter->stored_alias = g_key_file_get_string(key_file,
8522 "General", "Name", NULL);
8525 /* Get pairable timeout */
8526 adapter->pairable_timeout = g_key_file_get_integer(key_file, "General",
8527 "PairableTimeout", &gerr);
8529 adapter->pairable_timeout = main_opts.pairto;
8534 /* Get discoverable mode */
8535 adapter->stored_discoverable = g_key_file_get_boolean(key_file,
8536 "General", "Discoverable", &gerr);
8538 adapter->stored_discoverable = false;
8543 /* Get discoverable timeout */
8544 adapter->discoverable_timeout = g_key_file_get_integer(key_file,
8545 "General", "DiscoverableTimeout", &gerr);
8547 adapter->discoverable_timeout = main_opts.discovto;
8552 #ifdef __TIZEN_PATCH__
8553 /* Get Le Privacy feature support */
8554 adapter->le_privacy_enabled = main_opts.le_privacy;
8555 if (adapter->le_privacy_enabled) {
8557 str = g_key_file_get_string(key_file,
8558 "General", "LocalIrk", &gerr);
8559 if (gerr || !str || strlen(str) != 34) {
8560 memset(adapter->local_irk, 0, MGMT_IRK_SIZE);
8564 str2buf(&str[2], (uint8_t *)adapter->local_irk, MGMT_IRK_SIZE);
8568 g_key_file_free(key_file);
8571 static struct btd_adapter *btd_adapter_new(uint16_t index)
8573 struct btd_adapter *adapter;
8574 #ifdef __TIZEN_PATCH__
8575 #ifdef TIZEN_WEARABLE
8576 DBusConnection *conn = btd_get_dbus_connection();
8577 DBusMessage *msg = NULL;
8578 DBusMessage *reply = NULL;
8579 int charging_state = 0;
8580 #endif /* TIZEN_WEARABLE */
8583 adapter = g_try_new0(struct btd_adapter, 1);
8587 adapter->dev_id = index;
8588 adapter->mgmt = mgmt_ref(mgmt_master);
8589 adapter->pincode_requested = false;
8592 * Setup default configuration values. These are either adapter
8593 * defaults or from a system wide configuration file.
8595 * Some value might be overwritten later on by adapter specific
8596 * configuration. This is to make sure that sane defaults are
8599 adapter->system_name = g_strdup(main_opts.name);
8600 adapter->major_class = (main_opts.class & 0x001f00) >> 8;
8601 adapter->minor_class = (main_opts.class & 0x0000fc) >> 2;
8602 adapter->modalias = bt_modalias(main_opts.did_source,
8603 main_opts.did_vendor,
8604 main_opts.did_product,
8605 main_opts.did_version);
8606 adapter->discoverable_timeout = main_opts.discovto;
8607 adapter->pairable_timeout = main_opts.pairto;
8608 #ifdef __TIZEN_PATCH__
8609 adapter->advertising = FALSE;
8612 DBG("System name: %s", adapter->system_name);
8613 DBG("Major class: %u", adapter->major_class);
8614 DBG("Minor class: %u", adapter->minor_class);
8615 DBG("Modalias: %s", adapter->modalias);
8616 DBG("Discoverable timeout: %u seconds", adapter->discoverable_timeout);
8617 DBG("Pairable timeout: %u seconds", adapter->pairable_timeout);
8618 #ifdef __TIZEN_PATCH__
8619 if (main_opts.le_privacy)
8620 DBG("LE Privacy is enabled.");
8622 DBG("LE Privacy is disabled.");
8624 adapter->central_rpa_res_support = 0x00;
8626 adapter->auths = g_queue_new();
8628 #ifdef __TIZEN_PATCH__
8629 #ifdef TIZEN_WEARABLE
8630 adapter->charging_watch = g_dbus_add_signal_watch(conn, DEVICED_DEST,
8631 DEVICED_BATT_OBJECT_PATH,
8632 DEVICED_BATT_INTERFACE, "ChargerType",
8633 charging_state_changed, adapter, NULL);
8634 if (adapter->charging_watch == 0)
8635 error("Cannot add signal watch for ChargerType");
8637 msg = dbus_message_new_method_call(DEVICED_DEST,
8638 DEVICED_BATT_OBJECT_PATH,
8639 DEVICED_BATT_INTERFACE, "ChargerType");
8641 reply = dbus_connection_send_with_reply_and_block(conn,
8644 if (dbus_message_get_args(reply, NULL,
8645 DBUS_TYPE_INT32, &charging_state,
8646 DBUS_TYPE_INVALID) == TRUE) {
8647 set_charging_state(adapter, charging_state);
8649 dbus_message_unref(reply);
8651 error("Reply is NULL");
8653 dbus_message_unref(msg);
8655 error("Unable to create dbus message for charging state");
8657 #endif /* TIZEN_WEARABLE */
8660 return btd_adapter_ref(adapter);
8663 static void adapter_remove(struct btd_adapter *adapter)
8666 #ifndef __TIZEN_PATCH__
8670 DBG("Removing adapter %s", adapter->path);
8672 #ifdef __TIZEN_PATCH__
8673 #ifdef TIZEN_WEARABLE
8674 if (adapter->charging_watch > 0) {
8675 g_dbus_remove_watch(btd_get_dbus_connection(),
8676 adapter->charging_watch);
8677 adapter->charging_watch = 0;
8680 if (adapter->charging_timeout) {
8681 g_source_remove(adapter->charging_timeout);
8682 adapter->charging_timeout = 0;
8684 #endif /* TIZEN_WEARABLE */
8687 if (adapter->discovery_idle_timeout > 0) {
8688 g_source_remove(adapter->discovery_idle_timeout);
8689 adapter->discovery_idle_timeout = 0;
8692 if (adapter->temp_devices_timeout > 0) {
8693 g_source_remove(adapter->temp_devices_timeout);
8694 adapter->temp_devices_timeout = 0;
8697 discovery_cleanup(adapter);
8699 g_slist_free(adapter->connect_list);
8700 adapter->connect_list = NULL;
8702 for (l = adapter->devices; l; l = l->next)
8703 device_remove(l->data, FALSE);
8705 g_slist_free(adapter->devices);
8706 adapter->devices = NULL;
8708 unload_drivers(adapter);
8710 #ifndef __TIZEN_PATCH__
8711 db = btd_gatt_database_get_db(adapter->database);
8712 gatt_db_unregister(db, adapter->db_id);
8715 btd_gatt_database_destroy(adapter->database);
8716 adapter->database = NULL;
8718 btd_adapter_gatt_server_stop(adapter);
8721 btd_advertising_manager_destroy(adapter->adv_manager);
8722 adapter->adv_manager = NULL;
8724 g_slist_free(adapter->pin_callbacks);
8725 adapter->pin_callbacks = NULL;
8727 g_slist_free(adapter->msd_callbacks);
8728 adapter->msd_callbacks = NULL;
8731 const char *adapter_get_path(struct btd_adapter *adapter)
8736 return adapter->path;
8739 const bdaddr_t *btd_adapter_get_address(struct btd_adapter *adapter)
8741 return &adapter->bdaddr;
8744 static gboolean confirm_name_timeout(gpointer user_data)
8746 struct btd_adapter *adapter = user_data;
8748 btd_error(adapter->dev_id, "Confirm name timed out for hci%u",
8751 adapter->confirm_name_timeout = 0;
8753 mgmt_cancel(adapter->mgmt, adapter->confirm_name_id);
8754 adapter->confirm_name_id = 0;
8759 static void confirm_name_complete(uint8_t status, uint16_t length,
8760 const void *param, void *user_data)
8762 struct btd_adapter *adapter = user_data;
8764 if (status != MGMT_STATUS_SUCCESS) {
8765 btd_error(adapter->dev_id,
8766 "Failed to confirm name for hci%u: %s (0x%02x)",
8767 adapter->dev_id, mgmt_errstr(status), status);
8770 adapter->confirm_name_id = 0;
8772 g_source_remove(adapter->confirm_name_timeout);
8773 adapter->confirm_name_timeout = 0;
8775 DBG("Confirm name complete for hci%u", adapter->dev_id);
8778 static void confirm_name(struct btd_adapter *adapter, const bdaddr_t *bdaddr,
8779 uint8_t bdaddr_type, bool name_known)
8781 struct mgmt_cp_confirm_name cp;
8784 ba2str(bdaddr, addr);
8785 DBG("hci%d bdaddr %s name_known %u", adapter->dev_id, addr,
8789 * If the kernel does not answer the confirm name command with
8790 * a command complete or command status in time, this might
8791 * race against another device found event that also requires
8792 * to confirm the name. If there is a pending command, just
8793 * cancel it to be safe here.
8795 if (adapter->confirm_name_id > 0) {
8796 btd_warn(adapter->dev_id,
8797 "Found pending confirm name for hci%u",
8799 mgmt_cancel(adapter->mgmt, adapter->confirm_name_id);
8802 if (adapter->confirm_name_timeout > 0) {
8803 g_source_remove(adapter->confirm_name_timeout);
8804 adapter->confirm_name_timeout = 0;
8807 memset(&cp, 0, sizeof(cp));
8808 bacpy(&cp.addr.bdaddr, bdaddr);
8809 cp.addr.type = bdaddr_type;
8810 cp.name_known = name_known;
8812 adapter->confirm_name_id = mgmt_reply(adapter->mgmt,
8813 MGMT_OP_CONFIRM_NAME,
8814 adapter->dev_id, sizeof(cp), &cp,
8815 confirm_name_complete, adapter, NULL);
8817 if (adapter->confirm_name_id == 0) {
8818 btd_error(adapter->dev_id, "Failed to confirm name for hci%u",
8824 * This timeout handling is needed since the kernel is stupid
8825 * and forgets to send a command complete response. However in
8826 * case of failures it does send a command status.
8828 adapter->confirm_name_timeout = g_timeout_add_seconds(2,
8829 confirm_name_timeout, adapter);
8832 static void adapter_msd_notify(struct btd_adapter *adapter,
8833 struct btd_device *dev,
8836 GSList *cb_l, *cb_next;
8837 GSList *msd_l, *msd_next;
8839 for (cb_l = adapter->msd_callbacks; cb_l != NULL; cb_l = cb_next) {
8840 btd_msd_cb_t cb = cb_l->data;
8842 cb_next = g_slist_next(cb_l);
8844 for (msd_l = msd_list; msd_l != NULL; msd_l = msd_next) {
8845 const struct eir_msd *msd = msd_l->data;
8847 msd_next = g_slist_next(msd_l);
8849 cb(adapter, dev, msd->company, msd->data,
8855 static bool is_filter_match(GSList *discovery_filter, struct eir_data *eir_data,
8859 bool got_match = false;
8861 for (l = discovery_filter; l != NULL && got_match != true;
8862 l = g_slist_next(l)) {
8863 struct watch_client *client = l->data;
8864 struct discovery_filter *item = client->discovery_filter;
8867 * If one of currently running scans is regular scan, then
8868 * return all devices as matches
8875 /* if someone started discovery with empty uuids, he wants all
8876 * devices in given proximity.
8881 for (m = item->uuids; m != NULL && got_match != true;
8882 m = g_slist_next(m)) {
8883 /* m->data contains string representation of
8886 if (g_slist_find_custom(eir_data->services,
8894 /* we have service match, check proximity */
8895 if (item->rssi == DISTANCE_VAL_INVALID ||
8896 item->rssi <= rssi ||
8897 item->pathloss == DISTANCE_VAL_INVALID ||
8898 (eir_data->tx_power != 127 &&
8899 eir_data->tx_power - rssi <= item->pathloss))
8909 #ifdef __TIZEN_PATCH__
8910 static void update_found_devices(struct btd_adapter *adapter,
8911 const bdaddr_t *bdaddr,
8912 uint8_t bdaddr_type, int8_t rssi,
8913 bool confirm, bool legacy, uint8_t adv_type,
8914 const uint8_t *data, uint8_t data_len)
8916 static void update_found_devices(struct btd_adapter *adapter,
8917 const bdaddr_t *bdaddr,
8918 uint8_t bdaddr_type, int8_t rssi,
8919 bool confirm, bool legacy,
8920 bool not_connectable,
8921 const uint8_t *data, uint8_t data_len)
8924 struct btd_device *dev;
8925 struct eir_data eir_data;
8926 bool name_known, discoverable;
8929 memset(&eir_data, 0, sizeof(eir_data));
8930 eir_parse(&eir_data, data, data_len);
8932 if (bdaddr_type == BDADDR_BREDR)
8933 discoverable = true;
8935 discoverable = eir_data.flags & (EIR_LIM_DISC | EIR_GEN_DISC);
8937 ba2str(bdaddr, addr);
8939 dev = btd_adapter_find_device(adapter, bdaddr, bdaddr_type);
8942 * If no client has requested discovery or the device is
8943 * not marked as discoverable, then do not create new
8946 #ifdef __TIZEN_PATCH__
8947 /*DBG("List BREDR:%p LE:%p Discoverable:%d", adapter->discovery_list,
8948 adapter->le_discovery_list, discoverable);*/
8949 if ((adapter->discovery_list == NULL &&
8950 adapter->le_discovery_list == NULL) || !discoverable) {
8951 DBG("discovery list is NULL");
8952 eir_data_free(&eir_data);
8956 if (!adapter->discovery_list || !discoverable) {
8957 eir_data_free(&eir_data);
8962 dev = adapter_create_device(adapter, bdaddr, bdaddr_type);
8966 btd_error(adapter->dev_id,
8967 "Unable to create object for found device %s", addr);
8968 eir_data_free(&eir_data);
8972 #ifdef __TIZEN_PATCH__
8973 if(device_get_rpa_exist(dev) == true)
8974 bdaddr_type = BDADDR_LE_RANDOM;
8977 device_update_last_seen(dev, bdaddr_type);
8980 * FIXME: We need to check for non-zero flags first because
8981 * older kernels send separate adv_ind and scan_rsp. Newer
8982 * kernels send them merged, so once we know which mgmt version
8983 * supports this we can make the non-zero check conditional.
8985 if (bdaddr_type != BDADDR_BREDR && eir_data.flags &&
8986 !(eir_data.flags & EIR_BREDR_UNSUP))
8987 device_set_bredr_support(dev);
8989 if (eir_data.name != NULL && eir_data.name_complete)
8990 device_store_cached_name(dev, eir_data.name);
8993 * If no client has requested discovery, then only update
8994 * already paired devices (skip temporary ones).
8996 #ifdef __TIZEN_PATCH__
8997 if (device_is_temporary(dev) && adapter->discovery_list == NULL &&
8998 adapter->le_discovery_list == NULL) {
8999 DBG("discovery list is NULL");
9000 eir_data_free(&eir_data);
9004 device_set_last_addr_type(dev, bdaddr_type);
9005 device_set_ipsp_connected(dev, FALSE);
9007 if (device_is_temporary(dev) && !adapter->discovery_list) {
9008 eir_data_free(&eir_data);
9013 #ifdef __TIZEN_PATCH__
9014 if (bdaddr_type == BDADDR_BREDR) {
9016 if (adapter->filtered_discovery &&
9017 !is_filter_match(adapter->discovery_list, &eir_data, rssi)) {
9018 eir_data_free(&eir_data);
9022 device_set_legacy(dev, legacy);
9024 if (adapter->filtered_discovery)
9025 device_set_rssi_with_delta(dev, rssi, 0);
9027 device_set_rssi(dev, rssi);
9029 if (eir_data.tx_power != 127)
9030 device_set_tx_power(dev, eir_data.tx_power);
9031 #ifdef __TIZEN_PATCH__
9035 if (eir_data.appearance != 0)
9036 device_set_appearance(dev, eir_data.appearance);
9038 /* Report an unknown name to the kernel even if there is a short name
9039 * known, but still update the name with the known short name. */
9040 #ifdef __TIZEN_PATCH__
9041 if (eir_data.name_complete)
9042 name_known = device_name_known(dev);
9046 name_known = device_name_known(dev);
9049 if (eir_data.name && (eir_data.name_complete || !name_known))
9050 btd_device_device_set_name(dev, eir_data.name);
9052 if (eir_data.class != 0)
9053 device_set_class(dev, eir_data.class);
9055 if (eir_data.did_source || eir_data.did_vendor ||
9056 eir_data.did_product || eir_data.did_version)
9057 btd_device_set_pnpid(dev, eir_data.did_source,
9058 eir_data.did_vendor,
9059 eir_data.did_product,
9060 eir_data.did_version);
9062 device_add_eir_uuids(dev, eir_data.services);
9064 #ifdef __TIZEN_PATCH__
9065 if (eir_data.flags != 0)
9066 device_set_remote_feature_flag(dev, eir_data.flags);
9068 if (bdaddr_type == BDADDR_BREDR)
9069 device_set_manufacturer_info(dev, &eir_data);
9071 device_set_adv_report_info(dev, (void*)data, data_len, adv_type, rssi);
9074 if (eir_data.msd_list) {
9075 device_set_manufacturer_data(dev, eir_data.msd_list);
9076 adapter_msd_notify(adapter, dev, eir_data.msd_list);
9079 if (eir_data.sd_list)
9080 device_set_service_data(dev, eir_data.sd_list);
9082 eir_data_free(&eir_data);
9085 * Only if at least one client has requested discovery, maintain
9086 * list of found devices and name confirming for legacy devices.
9087 * Otherwise, this is an event from passive discovery and we
9088 * should check if the device needs connecting to.
9090 #ifdef __TIZEN_PATCH__
9091 if (!adapter->discovery_list && !adapter->le_discovery_list)
9093 if (!adapter->discovery_list)
9097 if (g_slist_find(adapter->discovery_found, dev))
9101 confirm_name(adapter, bdaddr, bdaddr_type, name_known);
9103 adapter->discovery_found = g_slist_prepend(adapter->discovery_found,
9109 #ifndef __TIZEN_PATCH__
9110 /* Ignore non-connectable events */
9111 if (not_connectable)
9116 * If we're in the process of stopping passive scanning and
9117 * connecting another (or maybe even the same) LE device just
9120 if (adapter->connect_le)
9124 * If kernel background scan is used then the kernel is
9125 * responsible for connecting.
9127 if (kernel_conn_control)
9131 * If this is an LE device that's not connected and part of the
9132 * connect_list stop passive scanning so that a connection
9133 * attempt to it can be made
9135 if (bdaddr_type != BDADDR_BREDR && !btd_device_is_connected(dev) &&
9136 g_slist_find(adapter->connect_list, dev)) {
9137 adapter->connect_le = dev;
9138 stop_passive_scanning(adapter);
9142 static void device_found_callback(uint16_t index, uint16_t length,
9143 const void *param, void *user_data)
9145 const struct mgmt_ev_device_found *ev = param;
9146 struct btd_adapter *adapter = user_data;
9154 if (length < sizeof(*ev)) {
9155 btd_error(adapter->dev_id,
9156 "Too short device found event (%u bytes)", length);
9160 eir_len = btohs(ev->eir_len);
9161 if (length != sizeof(*ev) + eir_len) {
9162 btd_error(adapter->dev_id,
9163 "Device found event size mismatch (%u != %zu)",
9164 length, sizeof(*ev) + eir_len);
9173 flags = btohl(ev->flags);
9175 ba2str(&ev->addr.bdaddr, addr);
9176 DBG("hci%u addr %s, rssi %d flags 0x%04x eir_len %u",
9177 index, addr, ev->rssi, flags, eir_len);
9179 confirm_name = (flags & MGMT_DEV_FOUND_CONFIRM_NAME);
9180 legacy = (flags & MGMT_DEV_FOUND_LEGACY_PAIRING);
9182 #ifdef __TIZEN_PATCH__
9183 update_found_devices(adapter, &ev->addr.bdaddr, ev->addr.type,
9184 ev->rssi, confirm_name, legacy, 0,
9187 update_found_devices(adapter, &ev->addr.bdaddr, ev->addr.type,
9188 ev->rssi, confirm_name, legacy,
9189 flags & MGMT_DEV_FOUND_NOT_CONNECTABLE,
9194 #ifdef __TIZEN_PATCH__
9195 static void le_device_found_callback(uint16_t index, uint16_t length,
9196 const void *param, void *user_data)
9198 const struct mgmt_ev_le_device_found *ev = param;
9199 struct btd_adapter *adapter = user_data;
9207 if (length < sizeof(*ev)) {
9208 error("Too short device found event (%u bytes)", length);
9212 eir_len = btohs(ev->eir_len);
9213 if (length != sizeof(*ev) + eir_len) {
9214 error("Device found event size mismatch (%u != %zu)",
9215 length, sizeof(*ev) + eir_len);
9224 flags = btohl(ev->flags);
9226 ba2str(&ev->addr.bdaddr, addr);
9227 /*DBG("hci%u addr %s, rssi %d flags 0x%04x eir_len %u",
9228 index, addr, ev->rssi, flags, eir_len);*/
9230 confirm_name = (flags & MGMT_DEV_FOUND_CONFIRM_NAME);
9231 legacy = (flags & MGMT_DEV_FOUND_LEGACY_PAIRING);
9233 /*DBG("hci%u addr %s, addr_type %d rssi %d flags 0x%04x eir_len %u confirm_name %d legacy %d, adv_type %02x",
9234 index, addr, ev->addr.type, ev->rssi, flags, eir_len, confirm_name, legacy, ev->adv_type);*/
9236 update_found_devices(adapter, &ev->addr.bdaddr, ev->addr.type,
9237 ev->rssi, confirm_name, legacy, ev->adv_type,
9242 struct agent *adapter_get_agent(struct btd_adapter *adapter)
9244 return agent_get(NULL);
9247 static void adapter_remove_connection(struct btd_adapter *adapter,
9248 struct btd_device *device,
9249 uint8_t bdaddr_type)
9253 if (!g_slist_find(adapter->connections, device)) {
9254 btd_error(adapter->dev_id, "No matching connection for device");
9258 device_remove_connection(device, bdaddr_type);
9260 #ifdef __TIZEN_PATCH__
9261 if (device_is_authenticating(device, bdaddr_type))
9263 if (device_is_authenticating(device))
9265 device_cancel_authentication(device, TRUE);
9267 /* If another bearer is still connected */
9268 if (btd_device_is_connected(device))
9271 adapter->connections = g_slist_remove(adapter->connections, device);
9273 if (device_is_temporary(device) && !device_is_retrying(device)) {
9274 const char *path = device_get_path(device);
9276 DBG("Removing temporary device %s", path);
9277 #ifdef __TIZEN_PATCH__
9278 /* device_is_paired is added incase of tempoary bonded
9279 * oop file transfer in that device is not bonded it's paired.
9281 if (!(device_is_bonded(device, bdaddr_type) ||
9282 device_is_paired(device, bdaddr_type))) {
9283 DBG("addr type %d, bonded", bdaddr_type);
9287 btd_adapter_unpair_device(adapter, device);
9289 btd_adapter_remove_device(adapter, device);
9294 static void adapter_stop(struct btd_adapter *adapter)
9296 /* check pending requests */
9297 reply_pending_requests(adapter);
9299 cancel_passive_scanning(adapter);
9301 while (adapter->set_filter_list) {
9302 struct watch_client *client;
9304 client = adapter->set_filter_list->data;
9306 /* g_dbus_remove_watch will remove the client from the
9307 * adapter's list and free it using the discovery_destroy
9310 g_dbus_remove_watch(dbus_conn, client->watch);
9313 while (adapter->discovery_list) {
9314 struct watch_client *client;
9316 client = adapter->discovery_list->data;
9318 /* g_dbus_remove_watch will remove the client from the
9319 * adapter's list and free it using the discovery_destroy
9322 g_dbus_remove_watch(dbus_conn, client->watch);
9325 adapter->filtered_discovery = false;
9326 adapter->no_scan_restart_delay = false;
9327 g_free(adapter->current_discovery_filter);
9328 adapter->current_discovery_filter = NULL;
9330 adapter->discovering = false;
9332 while (adapter->connections) {
9333 struct btd_device *device = adapter->connections->data;
9334 uint8_t addr_type = btd_device_get_bdaddr_type(device);
9336 adapter_remove_connection(adapter, device, BDADDR_BREDR);
9337 if (addr_type != BDADDR_BREDR)
9338 adapter_remove_connection(adapter, device, addr_type);
9341 g_dbus_emit_property_changed(dbus_conn, adapter->path,
9342 ADAPTER_INTERFACE, "Discovering");
9343 #ifdef __TIZEN_PATCH__
9344 g_dbus_emit_property_changed(dbus_conn, adapter->path,
9345 ADAPTER_INTERFACE, "LEDiscovering");
9348 if (adapter->dev_class) {
9349 /* the kernel should reset the class of device when powering
9350 * down, but it does not. So force it here ... */
9351 adapter->dev_class = 0;
9352 g_dbus_emit_property_changed(dbus_conn, adapter->path,
9353 ADAPTER_INTERFACE, "Class");
9356 #ifdef __TIZEN_PATCH__
9357 advertiser_cleanup(adapter);
9359 g_dbus_emit_property_changed(dbus_conn, adapter->path,
9360 ADAPTER_INTERFACE, "Powered");
9362 DBG("adapter %s has been disabled", adapter->path);
9365 int btd_register_adapter_driver(struct btd_adapter_driver *driver)
9367 adapter_drivers = g_slist_append(adapter_drivers, driver);
9369 if (driver->probe == NULL)
9372 adapter_foreach(probe_driver, driver);
9377 static void unload_driver(struct btd_adapter *adapter, gpointer data)
9379 struct btd_adapter_driver *driver = data;
9382 driver->remove(adapter);
9384 adapter->drivers = g_slist_remove(adapter->drivers, data);
9387 void btd_unregister_adapter_driver(struct btd_adapter_driver *driver)
9389 adapter_drivers = g_slist_remove(adapter_drivers, driver);
9391 adapter_foreach(unload_driver, driver);
9394 static void agent_auth_cb(struct agent *agent, DBusError *derr,
9397 struct btd_adapter *adapter = user_data;
9398 struct service_auth *auth = g_queue_pop_head(adapter->auths);
9401 DBG("No pending authorization");
9405 auth->cb(derr, auth->user_data);
9408 agent_unref(auth->agent);
9412 /* Stop processing if queue is empty */
9413 if (g_queue_is_empty(adapter->auths)) {
9414 if (adapter->auth_idle_id > 0)
9415 g_source_remove(adapter->auth_idle_id);
9419 if (adapter->auth_idle_id > 0)
9422 adapter->auth_idle_id = g_idle_add(process_auth_queue, adapter);
9425 static gboolean process_auth_queue(gpointer user_data)
9427 struct btd_adapter *adapter = user_data;
9430 adapter->auth_idle_id = 0;
9432 dbus_error_init(&err);
9433 dbus_set_error_const(&err, ERROR_INTERFACE ".Rejected", NULL);
9435 while (!g_queue_is_empty(adapter->auths)) {
9436 struct service_auth *auth = adapter->auths->head->data;
9437 struct btd_device *device = auth->device;
9438 const char *dev_path;
9440 /* Wait services to be resolved before asking authorization */
9441 if (auth->svc_id > 0) {
9442 #ifdef __TIZEN_PATCH__
9443 DBG("Wait services to be resolved before asking authorization");
9448 #ifndef __TIZEN_PATCH__
9449 if (device_is_trusted(device) == TRUE) {
9451 if (device_is_trusted(device) == TRUE ||
9452 device_is_profile_trusted(device, auth->uuid)) {
9454 auth->cb(NULL, auth->user_data);
9458 #ifdef __TIZEN_PATCH__
9459 /* If Profile is Blocked, Simply reject Authorization*/
9460 if (device_is_profile_blocked(device, auth->uuid) == TRUE) {
9461 auth->cb(&err, auth->user_data);
9466 /* If agent is set authorization is already ongoing */
9470 auth->agent = agent_get(NULL);
9471 if (auth->agent == NULL) {
9472 btd_warn(adapter->dev_id,
9473 "Authentication attempt without agent");
9474 auth->cb(&err, auth->user_data);
9478 dev_path = device_get_path(device);
9480 if (agent_authorize_service(auth->agent, dev_path, auth->uuid,
9481 agent_auth_cb, adapter, NULL) < 0) {
9482 auth->cb(&err, auth->user_data);
9490 agent_unref(auth->agent);
9494 g_queue_pop_head(adapter->auths);
9497 dbus_error_free(&err);
9502 static void svc_complete(struct btd_device *dev, int err, void *user_data)
9504 struct service_auth *auth = user_data;
9505 struct btd_adapter *adapter = auth->adapter;
9509 if (adapter->auth_idle_id != 0)
9512 adapter->auth_idle_id = g_idle_add(process_auth_queue, adapter);
9515 static int adapter_authorize(struct btd_adapter *adapter, const bdaddr_t *dst,
9516 const char *uuid, service_auth_cb cb,
9519 struct service_auth *auth;
9520 struct btd_device *device;
9521 static guint id = 0;
9523 device = btd_adapter_find_device(adapter, dst, BDADDR_BREDR);
9527 if (device_is_disconnecting(device)) {
9528 DBG("Authorization request while disconnecting");
9532 /* Device connected? */
9533 if (!g_slist_find(adapter->connections, device))
9534 btd_error(adapter->dev_id,
9535 "Authorization request for non-connected device!?");
9537 auth = g_try_new0(struct service_auth, 1);
9542 auth->user_data = user_data;
9544 auth->device = device;
9545 auth->adapter = adapter;
9547 auth->svc_id = device_wait_for_svc_complete(device, svc_complete, auth);
9549 g_queue_push_tail(adapter->auths, auth);
9554 guint btd_request_authorization(const bdaddr_t *src, const bdaddr_t *dst,
9555 const char *uuid, service_auth_cb cb,
9558 struct btd_adapter *adapter;
9561 if (bacmp(src, BDADDR_ANY) != 0) {
9562 adapter = adapter_find(src);
9566 return adapter_authorize(adapter, dst, uuid, cb, user_data);
9569 for (l = adapters; l != NULL; l = g_slist_next(l)) {
9574 id = adapter_authorize(adapter, dst, uuid, cb, user_data);
9582 static struct service_auth *find_authorization(guint id)
9587 for (l = adapters; l != NULL; l = g_slist_next(l)) {
9588 struct btd_adapter *adapter = l->data;
9590 for (l2 = adapter->auths->head; l2 != NULL; l2 = l2->next) {
9591 struct service_auth *auth = l2->data;
9601 int btd_cancel_authorization(guint id)
9603 struct service_auth *auth;
9605 auth = find_authorization(id);
9609 if (auth->svc_id > 0)
9610 device_remove_svc_complete_callback(auth->device,
9613 g_queue_remove(auth->adapter->auths, auth);
9616 agent_cancel(auth->agent);
9617 agent_unref(auth->agent);
9625 int btd_adapter_restore_powered(struct btd_adapter *adapter)
9627 if (adapter->current_settings & MGMT_SETTING_POWERED)
9630 set_mode(adapter, MGMT_OP_SET_POWERED, 0x01);
9635 void btd_adapter_register_pin_cb(struct btd_adapter *adapter,
9636 btd_adapter_pin_cb_t cb)
9638 adapter->pin_callbacks = g_slist_prepend(adapter->pin_callbacks, cb);
9641 void btd_adapter_unregister_pin_cb(struct btd_adapter *adapter,
9642 btd_adapter_pin_cb_t cb)
9644 adapter->pin_callbacks = g_slist_remove(adapter->pin_callbacks, cb);
9647 void btd_adapter_unregister_msd_cb(struct btd_adapter *adapter,
9650 adapter->msd_callbacks = g_slist_remove(adapter->msd_callbacks, cb);
9653 void btd_adapter_register_msd_cb(struct btd_adapter *adapter,
9656 adapter->msd_callbacks = g_slist_prepend(adapter->msd_callbacks, cb);
9659 int btd_adapter_set_fast_connectable(struct btd_adapter *adapter,
9662 if (!(adapter->current_settings & MGMT_SETTING_POWERED))
9665 set_mode(adapter, MGMT_OP_SET_FAST_CONNECTABLE, enable ? 0x01 : 0x00);
9670 int btd_adapter_read_clock(struct btd_adapter *adapter, const bdaddr_t *bdaddr,
9671 int which, int timeout, uint32_t *clock,
9674 if (!(adapter->current_settings & MGMT_SETTING_POWERED))
9680 int btd_adapter_remove_bonding(struct btd_adapter *adapter,
9681 const bdaddr_t *bdaddr, uint8_t bdaddr_type)
9683 struct mgmt_cp_unpair_device cp;
9685 memset(&cp, 0, sizeof(cp));
9686 bacpy(&cp.addr.bdaddr, bdaddr);
9687 cp.addr.type = bdaddr_type;
9690 if (mgmt_send(adapter->mgmt, MGMT_OP_UNPAIR_DEVICE,
9691 adapter->dev_id, sizeof(cp), &cp,
9692 NULL, NULL, NULL) > 0)
9698 static void pincode_reply_complete(uint8_t status, uint16_t length,
9699 const void *param, void *user_data)
9701 struct btd_device *device = user_data;
9703 /* If the MGMT_OP_PIN_CODE_REPLY command is acknowledged, move the
9704 * starting time to that point. This give a better sense of time
9705 * evaluating the pincode. */
9706 device_bonding_restart_timer(device);
9709 int btd_adapter_pincode_reply(struct btd_adapter *adapter,
9710 const bdaddr_t *bdaddr,
9711 const char *pin, size_t pin_len)
9713 struct btd_device *device;
9717 ba2str(bdaddr, addr);
9718 DBG("hci%u addr %s pinlen %zu", adapter->dev_id, addr, pin_len);
9721 struct mgmt_cp_pin_code_neg_reply cp;
9723 memset(&cp, 0, sizeof(cp));
9724 bacpy(&cp.addr.bdaddr, bdaddr);
9725 cp.addr.type = BDADDR_BREDR;
9727 id = mgmt_reply(adapter->mgmt, MGMT_OP_PIN_CODE_NEG_REPLY,
9728 adapter->dev_id, sizeof(cp), &cp,
9731 struct mgmt_cp_pin_code_reply cp;
9736 memset(&cp, 0, sizeof(cp));
9737 bacpy(&cp.addr.bdaddr, bdaddr);
9738 cp.addr.type = BDADDR_BREDR;
9739 cp.pin_len = pin_len;
9740 memcpy(cp.pin_code, pin, pin_len);
9742 /* Since a pincode was requested, update the starting time to
9743 * the point where the pincode is provided. */
9744 device = btd_adapter_find_device(adapter, bdaddr, BDADDR_BREDR);
9745 device_bonding_restart_timer(device);
9747 id = mgmt_reply(adapter->mgmt, MGMT_OP_PIN_CODE_REPLY,
9748 adapter->dev_id, sizeof(cp), &cp,
9749 pincode_reply_complete, device, NULL);
9758 int btd_adapter_confirm_reply(struct btd_adapter *adapter,
9759 const bdaddr_t *bdaddr, uint8_t bdaddr_type,
9762 struct mgmt_cp_user_confirm_reply cp;
9766 ba2str(bdaddr, addr);
9767 DBG("hci%u addr %s success %d", adapter->dev_id, addr, success);
9770 opcode = MGMT_OP_USER_CONFIRM_REPLY;
9772 opcode = MGMT_OP_USER_CONFIRM_NEG_REPLY;
9774 memset(&cp, 0, sizeof(cp));
9775 bacpy(&cp.addr.bdaddr, bdaddr);
9776 cp.addr.type = bdaddr_type;
9778 if (mgmt_reply(adapter->mgmt, opcode, adapter->dev_id, sizeof(cp), &cp,
9779 NULL, NULL, NULL) > 0)
9785 static void user_confirm_request_callback(uint16_t index, uint16_t length,
9786 const void *param, void *user_data)
9788 const struct mgmt_ev_user_confirm_request *ev = param;
9789 struct btd_adapter *adapter = user_data;
9790 struct btd_device *device;
9794 if (length < sizeof(*ev)) {
9795 btd_error(adapter->dev_id,
9796 "Too small user confirm request event");
9800 ba2str(&ev->addr.bdaddr, addr);
9801 DBG("hci%u %s confirm_hint %u", adapter->dev_id, addr,
9803 device = btd_adapter_get_device(adapter, &ev->addr.bdaddr,
9806 btd_error(adapter->dev_id,
9807 "Unable to get device object for %s", addr);
9811 #ifdef __TIZEN_PATCH__
9812 device_set_auth_addr_type(device, ev->addr.type);
9815 err = device_confirm_passkey(device, btohl(ev->value),
9818 btd_error(adapter->dev_id,
9819 "device_confirm_passkey: %s", strerror(-err));
9820 btd_adapter_confirm_reply(adapter, &ev->addr.bdaddr,
9821 ev->addr.type, FALSE);
9825 int btd_adapter_passkey_reply(struct btd_adapter *adapter,
9826 const bdaddr_t *bdaddr, uint8_t bdaddr_type,
9832 ba2str(bdaddr, addr);
9833 DBG("hci%u addr %s passkey %06u", adapter->dev_id, addr, passkey);
9835 if (passkey == INVALID_PASSKEY) {
9836 struct mgmt_cp_user_passkey_neg_reply cp;
9838 memset(&cp, 0, sizeof(cp));
9839 bacpy(&cp.addr.bdaddr, bdaddr);
9840 cp.addr.type = bdaddr_type;
9842 id = mgmt_reply(adapter->mgmt, MGMT_OP_USER_PASSKEY_NEG_REPLY,
9843 adapter->dev_id, sizeof(cp), &cp,
9846 struct mgmt_cp_user_passkey_reply cp;
9848 memset(&cp, 0, sizeof(cp));
9849 bacpy(&cp.addr.bdaddr, bdaddr);
9850 cp.addr.type = bdaddr_type;
9851 cp.passkey = htobl(passkey);
9853 id = mgmt_reply(adapter->mgmt, MGMT_OP_USER_PASSKEY_REPLY,
9854 adapter->dev_id, sizeof(cp), &cp,
9864 static void user_passkey_request_callback(uint16_t index, uint16_t length,
9865 const void *param, void *user_data)
9867 const struct mgmt_ev_user_passkey_request *ev = param;
9868 struct btd_adapter *adapter = user_data;
9869 struct btd_device *device;
9873 if (length < sizeof(*ev)) {
9874 btd_error(adapter->dev_id, "Too small passkey request event");
9878 ba2str(&ev->addr.bdaddr, addr);
9879 DBG("hci%u %s", index, addr);
9881 device = btd_adapter_get_device(adapter, &ev->addr.bdaddr,
9884 btd_error(adapter->dev_id,
9885 "Unable to get device object for %s", addr);
9889 #ifdef __TIZEN_PATCH__
9890 device_set_auth_addr_type(device, ev->addr.type);
9893 err = device_request_passkey(device);
9895 btd_error(adapter->dev_id,
9896 "device_request_passkey: %s", strerror(-err));
9897 btd_adapter_passkey_reply(adapter, &ev->addr.bdaddr,
9898 ev->addr.type, INVALID_PASSKEY);
9902 static void user_passkey_notify_callback(uint16_t index, uint16_t length,
9903 const void *param, void *user_data)
9905 const struct mgmt_ev_passkey_notify *ev = param;
9906 struct btd_adapter *adapter = user_data;
9907 struct btd_device *device;
9912 if (length < sizeof(*ev)) {
9913 btd_error(adapter->dev_id, "Too small passkey notify event");
9917 ba2str(&ev->addr.bdaddr, addr);
9918 DBG("hci%u %s", index, addr);
9920 device = btd_adapter_get_device(adapter, &ev->addr.bdaddr,
9923 btd_error(adapter->dev_id,
9924 "Unable to get device object for %s", addr);
9928 passkey = get_le32(&ev->passkey);
9930 DBG("passkey %06u entered %u", passkey, ev->entered);
9932 err = device_notify_passkey(device, passkey, ev->entered);
9934 btd_error(adapter->dev_id,
9935 "device_notify_passkey: %s", strerror(-err));
9938 #ifdef __TIZEN_PATCH__
9939 static void rssi_alert_callback(uint16_t index, uint16_t length,
9940 const void *param, void *user_data)
9942 const struct mgmt_ev_vendor_specific_rssi_alert *ev = param;
9943 struct btd_adapter *adapter = user_data;
9945 char *bt_addr = NULL;
9947 int alert_type = -1;
9950 if (length < sizeof(*ev)) {
9951 error("Too small rssi alert event");
9955 ba2str(&ev->bdaddr, addr);
9956 DBG("hci%u %s %d", index, addr, ev->link_type);
9957 DBG("RSSI Alert Params [%d %d]", ev->alert_type, ev->rssi_dbm);
9959 bt_addr = (char *)&addr;
9960 link_type = ev->link_type;
9961 alert_type = ev->alert_type;
9962 rssi_dbm = ev->rssi_dbm;
9963 g_dbus_emit_signal(dbus_conn, adapter->path,
9964 ADAPTER_INTERFACE, "RssiAlert",
9965 DBUS_TYPE_STRING, &bt_addr,
9966 DBUS_TYPE_INT32, &link_type,
9967 DBUS_TYPE_INT32, &alert_type,
9968 DBUS_TYPE_INT32, &rssi_dbm,
9972 static void get_raw_rssi_callback(uint16_t index, uint16_t length,
9973 const void *param, void *user_data)
9975 const struct mgmt_cc_rp_get_raw_rssi *ev = param;
9976 struct btd_adapter *adapter = user_data;
9978 char *bt_addr = NULL;
9982 if (length < sizeof(*ev)) {
9983 error("Too small raw RSSI event");
9987 ba2str(&ev->bt_address, addr);
9988 DBG("hci%u %s", index, addr);
9989 DBG("Raw RSSI Params [%d %d]", ev->link_type, ev->rssi_dbm);
9991 bt_addr = (char *)&addr;
9992 link_type = ev->link_type;
9993 rssi_dbm = ev->rssi_dbm;
9995 g_dbus_emit_signal(dbus_conn, adapter->path,
9996 ADAPTER_INTERFACE, "RawRssi",
9997 DBUS_TYPE_STRING, &bt_addr,
9998 DBUS_TYPE_INT32, &link_type,
9999 DBUS_TYPE_INT32, &rssi_dbm,
10000 DBUS_TYPE_INVALID);
10003 static void rssi_enabled_callback(uint16_t index, uint16_t length,
10004 const void *param, void *user_data)
10006 const struct mgmt_cc_rsp_enable_rssi *ev = param;
10007 struct btd_adapter *adapter = user_data;
10009 char *bt_addr = NULL;
10010 int enabled = TRUE;
10011 int link_type = -1;
10013 if (length < sizeof(*ev)) {
10014 error("Too small rssi enabled event");
10018 ba2str(&ev->bt_address, addr);
10019 DBG("hci%u %s %d", index, addr, ev->link_type);
10020 DBG("RSSI Enabled [%d %d]", ev->le_ext_opcode, ev->status);
10022 bt_addr = (char *)&addr;
10023 link_type = ev->link_type;
10025 g_dbus_emit_signal(dbus_conn, adapter->path,
10026 ADAPTER_INTERFACE, "RssiEnabled",
10027 DBUS_TYPE_STRING, &bt_addr,
10028 DBUS_TYPE_INT32, &link_type,
10029 DBUS_TYPE_BOOLEAN, &enabled,
10030 DBUS_TYPE_INVALID);
10033 static void rssi_disabled_callback(uint16_t index, uint16_t length,
10034 const void *param, void *user_data)
10036 const struct mgmt_cc_rp_disable_rssi *ev = param;
10037 struct btd_adapter *adapter = user_data;
10039 char *bt_addr = NULL;
10040 int disabled = FALSE;
10041 int link_type = -1;
10043 if (length < sizeof(*ev)) {
10044 error("Too small RSSI disabled event");
10048 ba2str(&ev->bt_address, addr);
10049 DBG("hci%u %s %d", index, addr, ev->link_type);
10050 DBG("RSSI Disabled Params [%d %d]", ev->le_ext_opcode, ev->status);
10052 bt_addr = (char *)&addr;
10053 link_type = ev->link_type;
10055 g_dbus_emit_signal(dbus_conn, adapter->path,
10056 ADAPTER_INTERFACE, "RssiEnabled",
10057 DBUS_TYPE_STRING, &bt_addr,
10058 DBUS_TYPE_INT32, &link_type,
10059 DBUS_TYPE_BOOLEAN, &disabled,
10060 DBUS_TYPE_INVALID);
10063 void adapter_check_version(struct btd_adapter *adapter, uint8_t hci_ver)
10069 ver = "Bluetooth 1.0b";
10072 ver = "Bluetooth 1.1";
10075 ver = "Bluetooth 1.2";
10078 ver = "Bluetooth 2.0 + EDR";
10081 ver = "Bluetooth 2.1 + EDR";
10084 ver = "Bluetooth 3.0 + HS";
10087 ver = "Bluetooth 4.0";
10090 ver = "Bluetooth 4.1";
10097 if (adapter->version)
10098 g_free(adapter->version);
10100 adapter->version = g_strdup(ver);
10104 static void new_local_irk_callback(uint16_t index, uint16_t length,
10105 const void *param, void *user_data)
10107 const struct mgmt_ev_new_local_irk *ev = param;
10108 struct btd_adapter *adapter = user_data;
10110 if (length < sizeof(*ev)) {
10111 error("Too small size of Local IRK generated");
10115 DBG("Local IRK generated for hci%u", index);
10117 memset(adapter->local_irk, 0, sizeof(adapter->local_irk));
10118 memcpy(adapter->local_irk, (char *)ev->irk, sizeof(adapter->local_irk));
10119 store_adapter_info(adapter);
10123 static void hardware_error_callback(uint16_t index, uint16_t length,
10124 const void *param, void *user_data)
10126 const struct mgmt_ev_hardware_error *ev = param;
10127 struct btd_adapter *adapter = user_data;
10129 if (length < sizeof(*ev)) {
10130 error("Too small Hardware error event");
10134 error("Hardware error occurred : %d", ev->error_code);
10135 g_dbus_emit_signal(dbus_conn, adapter->path,
10136 ADAPTER_INTERFACE, "HardwareError",
10137 DBUS_TYPE_INVALID);
10140 static void tx_timeout_error_callback(uint16_t index, uint16_t length,
10141 const void *param, void *user_data)
10143 struct btd_adapter *adapter = user_data;
10145 error("Tx Timeout error occurred");
10146 g_dbus_emit_signal(dbus_conn, adapter->path,
10147 ADAPTER_INTERFACE, "TxTimeoutError",
10148 DBUS_TYPE_INVALID);
10151 static void device_name_update_callback(uint16_t index, uint16_t length,
10152 const void *param, void *user_data)
10154 const struct mgmt_ev_device_name_update *ev = param;
10155 struct btd_adapter *adapter = user_data;
10156 struct btd_device *device;
10158 const uint8_t *eir_name;
10159 struct eir_data eir_data;
10161 if (length < sizeof(*ev)) {
10162 error("Name update error event");
10166 ba2str(&ev->addr.bdaddr, addr);
10167 DBG("hci%u %s", index, addr);
10169 device = btd_adapter_get_device(adapter, &ev->addr.bdaddr,
10172 error("Unable to get device object for %s", addr);
10176 if (ev->eir_len == 0)
10179 eir_name = ev->eir;
10181 memset(&eir_data, 0, sizeof(eir_data));
10182 eir_parse(&eir_data, eir_name, ev->eir_len);
10185 btd_device_device_set_name(device, eir_data.name);
10187 eir_data_free(&eir_data);
10190 static void multi_adv_state_change_callback(uint16_t index, uint16_t length,
10191 const void *param, void *user_data)
10193 const struct mgmt_ev_vendor_specific_multi_adv_state_changed *ev = param;
10195 if (length < sizeof(*ev)) {
10196 error("Too small adv state change event");
10200 DBG("adv id %d, state change reason %d, connection_handle %x",
10201 ev->adv_instance, ev->state_change_reason, ev->connection_handle);
10203 if ((ev->adv_instance > 0 && ev->adv_instance < adapter_le_get_max_adv_instance()) &&
10204 ev->state_change_reason == 0)
10205 adapter_le_enable_multi_adv(TRUE, ev->adv_instance);
10208 static void bt_6lowpan_conn_state_change_callback(uint16_t index, uint16_t length,
10209 const void *param, void *user_data)
10211 const struct mgmt_ev_6lowpan_conn_state_changed *ev = param;
10212 struct btd_adapter *adapter = user_data;
10213 struct btd_device *device;
10215 gboolean connected = 0;
10217 if (length < sizeof(*ev)) {
10218 btd_error(adapter->dev_id,
10219 "Too small device connected event");
10223 ba2str(&ev->addr.bdaddr, addr);
10225 DBG("hci%u device %s", index, addr);
10227 device = btd_adapter_find_device(adapter, &ev->addr.bdaddr,
10230 btd_error(adapter->dev_id,
10231 "Unable to get device object for %s", addr);
10240 device_set_ipsp_connected(device, connected);
10243 static void bt_le_data_length_changed_callback(uint16_t index, uint16_t length,
10244 const void *param, void *user_data)
10246 const struct mgmt_ev_le_data_length_changed *ev = param;
10247 struct btd_adapter *adapter = user_data;
10248 struct btd_device *device;
10251 if (length < sizeof(*ev)) {
10252 btd_error(adapter->dev_id,
10253 "Too small data length changed event");
10257 ba2str(&ev->addr.bdaddr, addr);
10259 DBG("hci%u device %s", index, addr);
10261 device = btd_adapter_find_device(adapter, &ev->addr.bdaddr,
10264 btd_error(adapter->dev_id,
10265 "Unable to get device object for %s", addr);
10269 device_le_data_length_changed(device, ev->max_tx_octets, ev->max_tx_time,
10270 ev->max_rx_octets, ev->max_rx_time);
10273 static void le_conn_update_completed_callback(uint16_t index, uint16_t length,
10274 const void *param, void *user_data)
10276 const struct mgmt_ev_conn_updated *ev = param;
10277 struct btd_adapter *adapter = user_data;
10278 struct btd_device *device;
10282 if (length < sizeof(*ev)) {
10283 error("Too small le conn update completed event");
10287 ba2str(&ev->addr.bdaddr, addr);
10288 list = g_slist_find_custom(adapter->devices, addr,
10289 device_address_cmp);
10291 device = list->data;
10292 if (device_get_conn_update_state(device))
10293 device_set_conn_update_state(device, false);
10298 struct btd_adapter_pin_cb_iter *btd_adapter_pin_cb_iter_new(
10299 struct btd_adapter *adapter)
10301 struct btd_adapter_pin_cb_iter *iter =
10302 g_new0(struct btd_adapter_pin_cb_iter, 1);
10304 iter->it = adapter->pin_callbacks;
10310 void btd_adapter_pin_cb_iter_free(struct btd_adapter_pin_cb_iter *iter)
10315 bool btd_adapter_pin_cb_iter_end(struct btd_adapter_pin_cb_iter *iter)
10317 return iter->it == NULL && iter->attempt == 0;
10320 static ssize_t btd_adapter_pin_cb_iter_next(
10321 struct btd_adapter_pin_cb_iter *iter,
10322 struct btd_adapter *adapter,
10323 struct btd_device *device,
10324 char *pin_buf, bool *display)
10326 btd_adapter_pin_cb_t cb;
10329 while (iter->it != NULL) {
10330 cb = iter->it->data;
10331 ret = cb(adapter, device, pin_buf, display, iter->attempt);
10336 iter->it = g_slist_next(iter->it);
10343 static void pin_code_request_callback(uint16_t index, uint16_t length,
10344 const void *param, void *user_data)
10346 const struct mgmt_ev_pin_code_request *ev = param;
10347 struct btd_adapter *adapter = user_data;
10348 struct btd_device *device;
10349 bool display = false;
10354 struct btd_adapter_pin_cb_iter *iter;
10356 if (length < sizeof(*ev)) {
10357 btd_error(adapter->dev_id, "Too small PIN code request event");
10361 ba2str(&ev->addr.bdaddr, addr);
10363 DBG("hci%u %s", adapter->dev_id, addr);
10365 device = btd_adapter_get_device(adapter, &ev->addr.bdaddr,
10368 btd_error(adapter->dev_id,
10369 "Unable to get device object for %s", addr);
10373 /* Flag the request of a pincode to allow a bonding retry. */
10374 adapter->pincode_requested = true;
10375 #ifdef __TIZEN_PATCH__
10376 btd_device_set_legacy_pairing(device, true);
10379 memset(pin, 0, sizeof(pin));
10381 iter = device_bonding_iter(device);
10385 pinlen = btd_adapter_pin_cb_iter_next(iter, adapter, device,
10388 if (pinlen > 0 && (!ev->secure || pinlen == 16)) {
10389 if (display && device_is_bonding(device, NULL)) {
10390 err = device_notify_pincode(device, ev->secure, pin);
10392 btd_error(adapter->dev_id,
10393 "device_notify_pin: %s",
10395 btd_adapter_pincode_reply(adapter,
10400 btd_adapter_pincode_reply(adapter, &ev->addr.bdaddr,
10406 err = device_request_pincode(device, ev->secure);
10408 btd_error(adapter->dev_id, "device_request_pin: %s",
10410 btd_adapter_pincode_reply(adapter, &ev->addr.bdaddr, NULL, 0);
10414 int adapter_cancel_bonding(struct btd_adapter *adapter, const bdaddr_t *bdaddr,
10417 struct mgmt_addr_info cp;
10420 ba2str(bdaddr, addr);
10421 DBG("hci%u bdaddr %s type %u", adapter->dev_id, addr, addr_type);
10423 memset(&cp, 0, sizeof(cp));
10424 bacpy(&cp.bdaddr, bdaddr);
10425 cp.type = addr_type;
10427 if (mgmt_reply(adapter->mgmt, MGMT_OP_CANCEL_PAIR_DEVICE,
10428 adapter->dev_id, sizeof(cp), &cp,
10429 NULL, NULL, NULL) > 0)
10435 static void check_oob_bonding_complete(struct btd_adapter *adapter,
10436 const bdaddr_t *bdaddr, uint8_t status)
10438 if (!adapter->oob_handler || !adapter->oob_handler->bonding_cb)
10441 if (bacmp(bdaddr, &adapter->oob_handler->remote_addr) != 0)
10444 adapter->oob_handler->bonding_cb(adapter, bdaddr, status,
10445 adapter->oob_handler->user_data);
10447 g_free(adapter->oob_handler);
10448 adapter->oob_handler = NULL;
10451 static void bonding_complete(struct btd_adapter *adapter,
10452 const bdaddr_t *bdaddr,
10453 uint8_t addr_type, uint8_t status)
10455 struct btd_device *device;
10458 device = btd_adapter_get_device(adapter, bdaddr, addr_type);
10460 device = btd_adapter_find_device(adapter, bdaddr, addr_type);
10462 if (device != NULL)
10463 device_bonding_complete(device, addr_type, status);
10465 #ifdef __TIZEN_PATCH__
10466 //resume_discovery(adapter);
10467 //resume_le_discovery(adapter);
10469 resume_discovery(adapter);
10471 check_oob_bonding_complete(adapter, bdaddr, status);
10474 /* bonding_attempt_complete() handles the end of a "bonding attempt" checking if
10475 * it should begin a new attempt or complete the bonding.
10477 static void bonding_attempt_complete(struct btd_adapter *adapter,
10478 const bdaddr_t *bdaddr,
10479 uint8_t addr_type, uint8_t status)
10481 struct btd_device *device;
10484 ba2str(bdaddr, addr);
10485 DBG("hci%u bdaddr %s type %u status 0x%x", adapter->dev_id, addr,
10486 addr_type, status);
10489 device = btd_adapter_get_device(adapter, bdaddr, addr_type);
10491 device = btd_adapter_find_device(adapter, bdaddr, addr_type);
10493 if (status == MGMT_STATUS_AUTH_FAILED && adapter->pincode_requested) {
10494 /* On faliure, issue a bonding_retry if possible. */
10495 if (device != NULL) {
10496 if (device_bonding_attempt_retry(device) == 0)
10501 /* Ignore disconnects during retry. */
10502 if (status == MGMT_STATUS_DISCONNECTED &&
10503 device && device_is_retrying(device))
10506 /* In any other case, finish the bonding. */
10507 bonding_complete(adapter, bdaddr, addr_type, status);
10510 struct pair_device_data {
10511 struct btd_adapter *adapter;
10516 static void free_pair_device_data(void *user_data)
10518 struct pair_device_data *data = user_data;
10523 static gboolean pair_device_timeout(gpointer user_data)
10525 struct pair_device_data *data = user_data;
10526 struct btd_adapter *adapter = data->adapter;
10528 btd_error(adapter->dev_id, "Pair device timed out for hci%u",
10531 adapter->pair_device_timeout = 0;
10533 adapter_cancel_bonding(adapter, &data->bdaddr, data->addr_type);
10538 static void pair_device_complete(uint8_t status, uint16_t length,
10539 const void *param, void *user_data)
10541 const struct mgmt_rp_pair_device *rp = param;
10542 struct pair_device_data *data = user_data;
10543 struct btd_adapter *adapter = data->adapter;
10545 DBG("%s (0x%02x)", mgmt_errstr(status), status);
10547 adapter->pair_device_id = 0;
10549 if (adapter->pair_device_timeout > 0) {
10550 g_source_remove(adapter->pair_device_timeout);
10551 adapter->pair_device_timeout = 0;
10554 /* Workaround for a kernel bug
10556 * Broken kernels may reply to device pairing command with command
10557 * status instead of command complete event e.g. if adapter was not
10560 if (status != MGMT_STATUS_SUCCESS && length < sizeof(*rp)) {
10561 btd_error(adapter->dev_id, "Pair device failed: %s (0x%02x)",
10562 mgmt_errstr(status), status);
10564 bonding_attempt_complete(adapter, &data->bdaddr,
10565 data->addr_type, status);
10569 if (length < sizeof(*rp)) {
10570 btd_error(adapter->dev_id, "Too small pair device response");
10574 bonding_attempt_complete(adapter, &rp->addr.bdaddr, rp->addr.type,
10578 int adapter_create_bonding(struct btd_adapter *adapter, const bdaddr_t *bdaddr,
10579 uint8_t addr_type, uint8_t io_cap)
10581 if (adapter->pair_device_id > 0) {
10582 btd_error(adapter->dev_id,
10583 "Unable pair since another pairing is in progress");
10587 #ifndef __TIZEN_PATCH__
10588 suspend_discovery(adapter);
10590 return adapter_bonding_attempt(adapter, bdaddr, addr_type, io_cap);
10593 /* Starts a new bonding attempt in a fresh new bonding_req or a retried one. */
10594 int adapter_bonding_attempt(struct btd_adapter *adapter, const bdaddr_t *bdaddr,
10595 uint8_t addr_type, uint8_t io_cap)
10597 struct mgmt_cp_pair_device cp;
10599 struct pair_device_data *data;
10602 ba2str(bdaddr, addr);
10603 DBG("hci%u bdaddr %s type %d io_cap 0x%02x",
10604 adapter->dev_id, addr, addr_type, io_cap);
10606 /* Reset the pincode_requested flag for a new bonding attempt. */
10607 adapter->pincode_requested = false;
10609 memset(&cp, 0, sizeof(cp));
10610 bacpy(&cp.addr.bdaddr, bdaddr);
10611 cp.addr.type = addr_type;
10612 cp.io_cap = io_cap;
10614 data = g_new0(struct pair_device_data, 1);
10615 data->adapter = adapter;
10616 bacpy(&data->bdaddr, bdaddr);
10617 data->addr_type = addr_type;
10619 id = mgmt_send(adapter->mgmt, MGMT_OP_PAIR_DEVICE,
10620 adapter->dev_id, sizeof(cp), &cp,
10621 pair_device_complete, data,
10622 free_pair_device_data);
10625 btd_error(adapter->dev_id, "Failed to pair %s for hci%u",
10626 addr, adapter->dev_id);
10627 free_pair_device_data(data);
10631 adapter->pair_device_id = id;
10633 /* Due to a bug in the kernel it is possible that a LE pairing
10634 * request never times out. Therefore, add a timer to clean up
10635 * if no response arrives
10637 adapter->pair_device_timeout = g_timeout_add_seconds(BONDING_TIMEOUT,
10638 pair_device_timeout, data);
10643 static void disconnect_notify(struct btd_device *dev, uint8_t reason)
10647 for (l = disconnect_list; l; l = g_slist_next(l)) {
10648 btd_disconnect_cb disconnect_cb = l->data;
10649 disconnect_cb(dev, reason);
10653 static void dev_disconnected(struct btd_adapter *adapter,
10654 const struct mgmt_addr_info *addr,
10657 struct btd_device *device;
10660 ba2str(&addr->bdaddr, dst);
10662 DBG("Device %s disconnected, reason %u", dst, reason);
10664 device = btd_adapter_find_device(adapter, &addr->bdaddr, addr->type);
10666 #ifdef __TIZEN_PATCH__
10668 device_set_disconnect_reason(device, reason);
10669 adapter_remove_connection(adapter, device, addr->type);
10670 disconnect_notify(device, reason);
10671 if (device_is_bonded(device, addr->type)) {
10672 DBG("addr type %d, bonded", addr->type);
10678 adapter_remove_connection(adapter, device, addr->type);
10679 disconnect_notify(device, reason);
10683 bonding_attempt_complete(adapter, &addr->bdaddr, addr->type,
10684 MGMT_STATUS_DISCONNECTED);
10687 void btd_add_disconnect_cb(btd_disconnect_cb func)
10689 disconnect_list = g_slist_append(disconnect_list, func);
10692 void btd_remove_disconnect_cb(btd_disconnect_cb func)
10694 disconnect_list = g_slist_remove(disconnect_list, func);
10697 static void disconnect_complete(uint8_t status, uint16_t length,
10698 const void *param, void *user_data)
10700 const struct mgmt_rp_disconnect *rp = param;
10701 struct btd_adapter *adapter = user_data;
10703 if (status == MGMT_STATUS_NOT_CONNECTED) {
10704 btd_warn(adapter->dev_id,
10705 "Disconnecting failed: already disconnected");
10706 } else if (status != MGMT_STATUS_SUCCESS) {
10707 btd_error(adapter->dev_id,
10708 "Failed to disconnect device: %s (0x%02x)",
10709 mgmt_errstr(status), status);
10713 if (length < sizeof(*rp)) {
10714 btd_error(adapter->dev_id,
10715 "Too small device disconnect response");
10719 #ifdef __TIZEN_PATCH__
10720 /* Use HCI error code instead of MGMT disconnection reason */
10721 dev_disconnected(adapter, &rp->addr, 0x16);
10723 dev_disconnected(adapter, &rp->addr, MGMT_DEV_DISCONN_LOCAL_HOST);
10727 int btd_adapter_disconnect_device(struct btd_adapter *adapter,
10728 const bdaddr_t *bdaddr,
10729 uint8_t bdaddr_type)
10732 struct mgmt_cp_disconnect cp;
10734 memset(&cp, 0, sizeof(cp));
10735 bacpy(&cp.addr.bdaddr, bdaddr);
10736 cp.addr.type = bdaddr_type;
10738 if (mgmt_send(adapter->mgmt, MGMT_OP_DISCONNECT,
10739 adapter->dev_id, sizeof(cp), &cp,
10740 disconnect_complete, adapter, NULL) > 0)
10746 static void auth_failed_callback(uint16_t index, uint16_t length,
10747 const void *param, void *user_data)
10749 const struct mgmt_ev_auth_failed *ev = param;
10750 struct btd_adapter *adapter = user_data;
10752 if (length < sizeof(*ev)) {
10753 btd_error(adapter->dev_id, "Too small auth failed mgmt event");
10757 bonding_attempt_complete(adapter, &ev->addr.bdaddr, ev->addr.type,
10761 static void store_link_key(struct btd_adapter *adapter,
10762 struct btd_device *device, const uint8_t *key,
10763 uint8_t type, uint8_t pin_length)
10765 char adapter_addr[18];
10766 char device_addr[18];
10767 char filename[PATH_MAX];
10768 GKeyFile *key_file;
10774 ba2str(btd_adapter_get_address(adapter), adapter_addr);
10775 ba2str(device_get_address(device), device_addr);
10777 #ifdef __TIZEN_PATCH__
10778 if (device_get_rpa_exist(device) == true)
10779 ba2str(device_get_rpa(device), device_addr);
10782 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/%s/info", adapter_addr,
10784 key_file = g_key_file_new();
10785 g_key_file_load_from_file(key_file, filename, 0, NULL);
10787 for (i = 0; i < 16; i++)
10788 sprintf(key_str + (i * 2), "%2.2X", key[i]);
10790 g_key_file_set_string(key_file, "LinkKey", "Key", key_str);
10792 g_key_file_set_integer(key_file, "LinkKey", "Type", type);
10793 g_key_file_set_integer(key_file, "LinkKey", "PINLength", pin_length);
10795 create_file(filename, S_IRUSR | S_IWUSR);
10797 str = g_key_file_to_data(key_file, &length, NULL);
10798 g_file_set_contents(filename, str, length, NULL);
10801 g_key_file_free(key_file);
10804 #ifdef __TIZEN_PATCH__
10805 static struct link_key_info *load_link_key(struct btd_adapter *adapter,
10808 struct link_key_info *key_info;
10809 GKeyFile *key_file;
10810 char filename[PATH_MAX];
10813 ba2str(&adapter->bdaddr, srcaddr);
10815 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/%s/info", srcaddr, peer);
10817 key_file = g_key_file_new();
10818 g_key_file_load_from_file(key_file, filename, 0, NULL);
10820 key_info = get_key_info(key_file, peer);
10826 static void new_link_key_callback(uint16_t index, uint16_t length,
10827 const void *param, void *user_data)
10829 const struct mgmt_ev_new_link_key *ev = param;
10830 const struct mgmt_addr_info *addr = &ev->key.addr;
10831 struct btd_adapter *adapter = user_data;
10832 struct btd_device *device;
10835 if (length < sizeof(*ev)) {
10836 btd_error(adapter->dev_id, "Too small new link key event");
10840 ba2str(&addr->bdaddr, dst);
10842 DBG("hci%u new key for %s type %u pin_len %u store_hint %u",
10843 adapter->dev_id, dst, ev->key.type, ev->key.pin_len,
10846 if (ev->key.pin_len > 16) {
10847 btd_error(adapter->dev_id,
10848 "Invalid PIN length (%u) in new_key event",
10853 device = btd_adapter_get_device(adapter, &addr->bdaddr, addr->type);
10855 btd_error(adapter->dev_id,
10856 "Unable to get device object for %s", dst);
10860 if (ev->store_hint) {
10861 const struct mgmt_link_key_info *key = &ev->key;
10863 store_link_key(adapter, device, key->val, key->type,
10866 device_set_bonded(device, BDADDR_BREDR);
10867 #if defined(__TIZEN_PATCH__) && defined(SUPPORT_LOCAL_DEVICE_A2DP_SINK)
10869 DBG("store_hint %d", ev->store_hint);
10870 btd_device_set_temporary(device, false);
10876 /* If BR/EDR linkkey exists in previous, update the linkkey into RPA based folder info */
10877 #ifdef __TIZEN_PATCH__
10878 if (device_get_rpa_exist(device) == true) {
10879 struct link_key_info *key_info;
10881 key_info = load_link_key(adapter, dst);
10882 if (key_info && key_info->type == 0x05) {
10883 DBG("Replace linkkey!");
10885 /* #define HCI_LK_AUTH_COMBINATION_P192 0x05
10886 Replace the linkkey as the orginal one
10888 store_link_key(adapter, device, key_info->key,
10889 key_info->type, key_info->pin_len);
10891 /* Delete irk based folder */
10892 device_remove_stored_folder(device);
10894 DBG("There is no original linkkey or type is not 0x05");
10899 bonding_complete(adapter, &addr->bdaddr, addr->type, 0);
10902 static void store_longtermkey(const bdaddr_t *local, const bdaddr_t *peer,
10903 uint8_t bdaddr_type, const unsigned char *key,
10904 uint8_t master, uint8_t authenticated,
10905 uint8_t enc_size, uint16_t ediv,
10908 const char *group = master ? "LongTermKey" : "SlaveLongTermKey";
10909 char adapter_addr[18];
10910 char device_addr[18];
10911 char filename[PATH_MAX];
10912 GKeyFile *key_file;
10918 if (master != 0x00 && master != 0x01) {
10919 error("Unsupported LTK type %u", master);
10923 ba2str(local, adapter_addr);
10924 ba2str(peer, device_addr);
10926 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/%s/info", adapter_addr,
10928 key_file = g_key_file_new();
10929 g_key_file_load_from_file(key_file, filename, 0, NULL);
10931 /* Old files may contain this so remove it in case it exists */
10932 g_key_file_remove_key(key_file, "LongTermKey", "Master", NULL);
10934 for (i = 0; i < 16; i++)
10935 sprintf(key_str + (i * 2), "%2.2X", key[i]);
10937 g_key_file_set_string(key_file, group, "Key", key_str);
10939 g_key_file_set_integer(key_file, group, "Authenticated",
10941 g_key_file_set_integer(key_file, group, "EncSize", enc_size);
10943 g_key_file_set_integer(key_file, group, "EDiv", ediv);
10944 g_key_file_set_uint64(key_file, group, "Rand", rand);
10946 create_file(filename, S_IRUSR | S_IWUSR);
10948 str = g_key_file_to_data(key_file, &length, NULL);
10949 g_file_set_contents(filename, str, length, NULL);
10952 g_key_file_free(key_file);
10955 static void new_long_term_key_callback(uint16_t index, uint16_t length,
10956 const void *param, void *user_data)
10958 const struct mgmt_ev_new_long_term_key *ev = param;
10959 const struct mgmt_addr_info *addr = &ev->key.addr;
10960 struct btd_adapter *adapter = user_data;
10961 struct btd_device *device;
10965 if (length < sizeof(*ev)) {
10966 btd_error(adapter->dev_id, "Too small long term key event");
10970 ba2str(&addr->bdaddr, dst);
10972 DBG("hci%u new LTK for %s type %u enc_size %u",
10973 adapter->dev_id, dst, ev->key.type, ev->key.enc_size);
10975 device = btd_adapter_get_device(adapter, &addr->bdaddr, addr->type);
10977 btd_error(adapter->dev_id,
10978 "Unable to get device object for %s", dst);
10983 * Some older kernel versions set store_hint for long term keys
10984 * from resolvable and unresolvable random addresses, but there
10985 * is no point in storing these. Next time around the device
10986 * address will be invalid.
10988 * So only for identity addresses (public and static random) use
10989 * the store_hint as an indication if the long term key should
10990 * be persistently stored.
10993 if (addr->type == BDADDR_LE_RANDOM &&
10994 (addr->bdaddr.b[5] & 0xc0) != 0xc0)
10995 persistent = false;
10997 persistent = !!ev->store_hint;
11000 const struct mgmt_ltk_info *key = &ev->key;
11001 const bdaddr_t *bdaddr = btd_adapter_get_address(adapter);
11005 ediv = le16_to_cpu(key->ediv);
11006 rand = le64_to_cpu(key->rand);
11008 #ifdef __TIZEN_PATCH__
11009 if (device_get_rpa_exist(device) == true) {
11010 store_longtermkey(bdaddr, device_get_rpa(device),
11011 key->addr.type, key->val, key->master,
11012 key->type, key->enc_size, ediv, rand);
11014 store_longtermkey(bdaddr, &key->addr.bdaddr,
11015 key->addr.type, key->val, key->master,
11016 key->type, key->enc_size, ediv, rand);
11019 store_longtermkey(bdaddr, &key->addr.bdaddr,
11020 key->addr.type, key->val, key->master,
11021 key->type, key->enc_size, ediv, rand);
11024 device_set_bonded(device, addr->type);
11027 bonding_complete(adapter, &addr->bdaddr, addr->type, 0);
11030 static void store_csrk(const bdaddr_t *local, const bdaddr_t *peer,
11031 uint8_t bdaddr_type, const unsigned char *key,
11032 uint32_t counter, uint8_t type)
11035 char adapter_addr[18];
11036 char device_addr[18];
11037 char filename[PATH_MAX];
11038 GKeyFile *key_file;
11047 group = "LocalSignatureKey";
11051 group = "RemoteSignatureKey";
11055 group = "LocalSignatureKey";
11059 group = "RemoteSignatureKey";
11063 warn("Unsupported CSRK type %u", type);
11067 ba2str(local, adapter_addr);
11068 ba2str(peer, device_addr);
11070 snprintf(filename, sizeof(filename), STORAGEDIR "/%s/%s/info",
11071 adapter_addr, device_addr);
11073 key_file = g_key_file_new();
11074 g_key_file_load_from_file(key_file, filename, 0, NULL);
11076 for (i = 0; i < 16; i++)
11077 sprintf(key_str + (i * 2), "%2.2X", key[i]);
11079 g_key_file_set_string(key_file, group, "Key", key_str);
11080 g_key_file_set_integer(key_file, group, "Counter", counter);
11081 g_key_file_set_boolean(key_file, group, "Authenticated", auth);
11083 create_file(filename, S_IRUSR | S_IWUSR);
11085 str = g_key_file_to_data(key_file, &length, NULL);
11086 g_file_set_contents(filename, str, length, NULL);
11089 g_key_file_free(key_file);
11092 static void new_csrk_callback(uint16_t index, uint16_t length,
11093 const void *param, void *user_data)
11095 const struct mgmt_ev_new_csrk *ev = param;
11096 const struct mgmt_addr_info *addr = &ev->key.addr;
11097 const struct mgmt_csrk_info *key = &ev->key;
11098 struct btd_adapter *adapter = user_data;
11099 const bdaddr_t *bdaddr = btd_adapter_get_address(adapter);
11100 struct btd_device *device;
11103 if (length < sizeof(*ev)) {
11104 btd_error(adapter->dev_id, "Too small CSRK event");
11108 ba2str(&addr->bdaddr, dst);
11110 DBG("hci%u new CSRK for %s type %u", adapter->dev_id, dst,
11113 device = btd_adapter_get_device(adapter, &addr->bdaddr, addr->type);
11115 btd_error(adapter->dev_id,
11116 "Unable to get device object for %s", dst);
11120 if (!ev->store_hint)
11123 store_csrk(bdaddr, &key->addr.bdaddr, key->addr.type, key->val, 0,
11126 btd_device_set_temporary(device, false);
11129 static void store_irk(struct btd_adapter *adapter, const bdaddr_t *peer,
11130 uint8_t bdaddr_type, const unsigned char *key)
11132 char adapter_addr[18];
11133 char device_addr[18];
11134 char filename[PATH_MAX];
11135 GKeyFile *key_file;
11141 ba2str(&adapter->bdaddr, adapter_addr);
11142 ba2str(peer, device_addr);
11144 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/%s/info", adapter_addr,
11146 key_file = g_key_file_new();
11147 g_key_file_load_from_file(key_file, filename, 0, NULL);
11149 for (i = 0; i < 16; i++)
11150 sprintf(str + (i * 2), "%2.2X", key[i]);
11152 g_key_file_set_string(key_file, "IdentityResolvingKey", "Key", str);
11154 create_file(filename, S_IRUSR | S_IWUSR);
11156 store_data = g_key_file_to_data(key_file, &length, NULL);
11157 g_file_set_contents(filename, store_data, length, NULL);
11158 g_free(store_data);
11160 g_key_file_free(key_file);
11163 static void new_irk_callback(uint16_t index, uint16_t length,
11164 const void *param, void *user_data)
11166 const struct mgmt_ev_new_irk *ev = param;
11167 const struct mgmt_addr_info *addr = &ev->key.addr;
11168 const struct mgmt_irk_info *irk = &ev->key;
11169 struct btd_adapter *adapter = user_data;
11170 struct btd_device *device, *duplicate;
11172 char dst[18], rpa[18];
11174 if (length < sizeof(*ev)) {
11175 btd_error(adapter->dev_id, "Too small New IRK event");
11179 ba2str(&addr->bdaddr, dst);
11180 ba2str(&ev->rpa, rpa);
11182 DBG("hci%u new IRK for %s RPA %s", adapter->dev_id, dst, rpa);
11184 if (bacmp(&ev->rpa, BDADDR_ANY)) {
11185 #ifdef __TIZEN_PATCH__
11187 * With new RPA, existing device can be found only when bonding is
11188 * initiated from local side using remote RPA; so first find the device
11189 * with RPA. If device is not found then find the device with IDA.
11192 device = btd_adapter_find_device(adapter, &ev->rpa,
11194 if (device == NULL)
11195 device = btd_adapter_find_device(adapter, &addr->bdaddr,
11197 if (device == NULL)
11198 device = btd_adapter_get_device(adapter, &ev->rpa,
11202 device = btd_adapter_get_device(adapter, &ev->rpa,
11206 duplicate = btd_adapter_find_device(adapter, &addr->bdaddr,
11208 if (duplicate == device)
11211 device = btd_adapter_get_device(adapter, &addr->bdaddr,
11217 btd_error(adapter->dev_id,
11218 "Unable to get device object for %s", dst);
11222 #ifdef __TIZEN_PATCH__
11223 if (bacmp(&ev->rpa, BDADDR_ANY) != 0) {
11224 device_set_rpa(device, &ev->rpa);
11227 device_set_rpa(duplicate, &ev->rpa);
11231 device_update_addr(device, &addr->bdaddr, addr->type);
11233 #ifdef __TIZEN_PATCH__
11235 device_merge_duplicate(device, duplicate);
11236 device_set_irk_value(duplicate, irk->val);
11238 /* If BR/EDR linkkey exists in previous, update the linkkey into RPA based folder info */
11239 if (device_get_rpa_exist(device) == true) {
11240 struct link_key_info *key_info;
11242 key_info = load_link_key(adapter, dst);
11243 if (key_info && key_info->type == 0x05) {
11244 DBG("Add linkkey of BR/EDR");
11246 /* #define HCI_LK_AUTH_COMBINATION_P192 0x05 */
11247 store_link_key(adapter, device, key_info->key,
11248 key_info->type, key_info->pin_len);
11250 /* Delete IDA based folder */
11251 device_remove_stored_folder(duplicate);
11253 DBG("There is no original linkkey or type is not 0x05");
11259 device_merge_duplicate(device, duplicate);
11262 persistent = !!ev->store_hint;
11266 #ifdef __TIZEN_PATCH__
11267 if (bacmp(&ev->rpa, BDADDR_ANY) != 0)
11268 store_irk(adapter, device_get_rpa(device), addr->type, irk->val);
11270 store_irk(adapter, &addr->bdaddr, addr->type, irk->val);
11272 device_set_irk_value(device, irk->val);
11274 store_irk(adapter, &addr->bdaddr, addr->type, irk->val);
11277 btd_device_set_temporary(device, false);
11279 #ifdef __TIZEN_PATCH__
11280 btd_adapter_set_dev_rpa_res_support(adapter, device);
11284 static void store_conn_param(struct btd_adapter *adapter, const bdaddr_t *peer,
11285 uint8_t bdaddr_type, uint16_t min_interval,
11286 uint16_t max_interval, uint16_t latency,
11289 char adapter_addr[18];
11290 char device_addr[18];
11291 char filename[PATH_MAX];
11292 GKeyFile *key_file;
11296 ba2str(&adapter->bdaddr, adapter_addr);
11297 ba2str(peer, device_addr);
11301 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/%s/info", adapter_addr,
11303 key_file = g_key_file_new();
11304 g_key_file_load_from_file(key_file, filename, 0, NULL);
11306 g_key_file_set_integer(key_file, "ConnectionParameters",
11307 "MinInterval", min_interval);
11308 g_key_file_set_integer(key_file, "ConnectionParameters",
11309 "MaxInterval", max_interval);
11310 g_key_file_set_integer(key_file, "ConnectionParameters",
11311 "Latency", latency);
11312 g_key_file_set_integer(key_file, "ConnectionParameters",
11313 "Timeout", timeout);
11315 create_file(filename, S_IRUSR | S_IWUSR);
11317 store_data = g_key_file_to_data(key_file, &length, NULL);
11318 g_file_set_contents(filename, store_data, length, NULL);
11319 g_free(store_data);
11321 g_key_file_free(key_file);
11324 static void new_conn_param(uint16_t index, uint16_t length,
11325 const void *param, void *user_data)
11327 const struct mgmt_ev_new_conn_param *ev = param;
11328 struct btd_adapter *adapter = user_data;
11329 uint16_t min, max, latency, timeout;
11330 struct btd_device *dev;
11334 if (length < sizeof(*ev)) {
11335 btd_error(adapter->dev_id,
11336 "Too small New Connection Parameter event");
11340 ba2str(&ev->addr.bdaddr, dst);
11342 min = btohs(ev->min_interval);
11343 max = btohs(ev->max_interval);
11344 latency = btohs(ev->latency);
11345 timeout = btohs(ev->timeout);
11347 DBG("hci%u %s (%u) min 0x%04x max 0x%04x latency 0x%04x timeout 0x%04x",
11348 adapter->dev_id, dst, ev->addr.type, min, max, latency, timeout);
11350 dev = btd_adapter_get_device(adapter, &ev->addr.bdaddr, ev->addr.type);
11352 btd_error(adapter->dev_id,
11353 "Unable to get device object for %s", dst);
11357 if (!ev->store_hint)
11360 store_conn_param(adapter, &ev->addr.bdaddr, ev->addr.type,
11361 ev->min_interval, ev->max_interval,
11362 ev->latency, ev->timeout);
11365 int adapter_set_io_capability(struct btd_adapter *adapter, uint8_t io_cap)
11367 struct mgmt_cp_set_io_capability cp;
11369 memset(&cp, 0, sizeof(cp));
11370 cp.io_capability = io_cap;
11372 if (mgmt_send(adapter->mgmt, MGMT_OP_SET_IO_CAPABILITY,
11373 adapter->dev_id, sizeof(cp), &cp,
11374 NULL, NULL, NULL) > 0)
11380 int btd_adapter_add_remote_oob_data(struct btd_adapter *adapter,
11381 const bdaddr_t *bdaddr,
11382 uint8_t *hash, uint8_t *randomizer)
11384 struct mgmt_cp_add_remote_oob_data cp;
11387 ba2str(bdaddr, addr);
11388 DBG("hci%d bdaddr %s", adapter->dev_id, addr);
11390 memset(&cp, 0, sizeof(cp));
11391 bacpy(&cp.addr.bdaddr, bdaddr);
11392 memcpy(cp.hash192, hash, 16);
11395 memcpy(cp.rand192, randomizer, 16);
11397 if (mgmt_send(adapter->mgmt, MGMT_OP_ADD_REMOTE_OOB_DATA,
11398 adapter->dev_id, sizeof(cp), &cp,
11399 NULL, NULL, NULL) > 0)
11405 int btd_adapter_remove_remote_oob_data(struct btd_adapter *adapter,
11406 const bdaddr_t *bdaddr)
11408 struct mgmt_cp_remove_remote_oob_data cp;
11411 ba2str(bdaddr, addr);
11412 DBG("hci%d bdaddr %s", adapter->dev_id, addr);
11414 memset(&cp, 0, sizeof(cp));
11415 bacpy(&cp.addr.bdaddr, bdaddr);
11417 if (mgmt_send(adapter->mgmt, MGMT_OP_REMOVE_REMOTE_OOB_DATA,
11418 adapter->dev_id, sizeof(cp), &cp,
11419 NULL, NULL, NULL) > 0)
11425 bool btd_adapter_ssp_enabled(struct btd_adapter *adapter)
11427 if (adapter->current_settings & MGMT_SETTING_SSP)
11433 void btd_adapter_set_oob_handler(struct btd_adapter *adapter,
11434 struct oob_handler *handler)
11436 adapter->oob_handler = handler;
11439 gboolean btd_adapter_check_oob_handler(struct btd_adapter *adapter)
11441 return adapter->oob_handler != NULL;
11444 static void read_local_oob_data_complete(uint8_t status, uint16_t length,
11445 const void *param, void *user_data)
11447 const struct mgmt_rp_read_local_oob_data *rp = param;
11448 struct btd_adapter *adapter = user_data;
11449 const uint8_t *hash, *randomizer;
11451 if (status != MGMT_STATUS_SUCCESS) {
11452 btd_error(adapter->dev_id,
11453 "Read local OOB data failed: %s (0x%02x)",
11454 mgmt_errstr(status), status);
11457 #ifdef __TIZEN_PATCH__
11458 } else if (length < 32) {
11460 } else if (length < sizeof(*rp)) {
11462 btd_error(adapter->dev_id,
11463 "Too small read local OOB data response");
11466 hash = rp->hash192;
11467 randomizer = rp->rand192;
11470 if (!adapter->oob_handler || !adapter->oob_handler->read_local_cb)
11473 adapter->oob_handler->read_local_cb(adapter, hash, randomizer,
11474 adapter->oob_handler->user_data);
11476 g_free(adapter->oob_handler);
11477 adapter->oob_handler = NULL;
11480 int btd_adapter_read_local_oob_data(struct btd_adapter *adapter)
11482 DBG("hci%u", adapter->dev_id);
11484 if (mgmt_send(adapter->mgmt, MGMT_OP_READ_LOCAL_OOB_DATA,
11485 adapter->dev_id, 0, NULL, read_local_oob_data_complete,
11486 adapter, NULL) > 0)
11492 void btd_adapter_for_each_device(struct btd_adapter *adapter,
11493 void (*cb)(struct btd_device *device, void *data),
11496 g_slist_foreach(adapter->devices, (GFunc) cb, data);
11499 static int adapter_cmp(gconstpointer a, gconstpointer b)
11501 struct btd_adapter *adapter = (struct btd_adapter *) a;
11502 const bdaddr_t *bdaddr = b;
11504 return bacmp(&adapter->bdaddr, bdaddr);
11507 static int adapter_id_cmp(gconstpointer a, gconstpointer b)
11509 struct btd_adapter *adapter = (struct btd_adapter *) a;
11510 uint16_t id = GPOINTER_TO_UINT(b);
11512 return adapter->dev_id == id ? 0 : -1;
11515 struct btd_adapter *adapter_find(const bdaddr_t *sba)
11519 match = g_slist_find_custom(adapters, sba, adapter_cmp);
11523 return match->data;
11526 struct btd_adapter *adapter_find_by_id(int id)
11530 match = g_slist_find_custom(adapters, GINT_TO_POINTER(id),
11535 return match->data;
11538 void adapter_foreach(adapter_cb func, gpointer user_data)
11540 g_slist_foreach(adapters, (GFunc) func, user_data);
11543 static int set_did(struct btd_adapter *adapter, uint16_t vendor,
11544 uint16_t product, uint16_t version, uint16_t source)
11546 struct mgmt_cp_set_device_id cp;
11548 DBG("hci%u source %x vendor %x product %x version %x",
11549 adapter->dev_id, source, vendor, product, version);
11551 memset(&cp, 0, sizeof(cp));
11553 cp.source = htobs(source);
11554 cp.vendor = htobs(vendor);
11555 cp.product = htobs(product);
11556 cp.version = htobs(version);
11558 if (mgmt_send(adapter->mgmt, MGMT_OP_SET_DEVICE_ID,
11559 adapter->dev_id, sizeof(cp), &cp,
11560 NULL, NULL, NULL) > 0)
11566 static void services_modified(struct gatt_db_attribute *attrib, void *user_data)
11568 struct btd_adapter *adapter = user_data;
11570 g_dbus_emit_property_changed(dbus_conn, adapter->path,
11571 ADAPTER_INTERFACE, "UUIDs");
11574 static int adapter_register(struct btd_adapter *adapter)
11576 struct agent *agent;
11577 struct gatt_db *db;
11582 adapter->path = g_strdup_printf("/org/bluez/hci%d", adapter->dev_id);
11584 if (!g_dbus_register_interface(dbus_conn,
11585 adapter->path, ADAPTER_INTERFACE,
11586 #ifdef __TIZEN_PATCH__
11587 adapter_methods, adapter_signals,
11589 adapter_methods, NULL,
11591 adapter_properties, adapter,
11593 btd_error(adapter->dev_id,
11594 "Adapter interface init failed on path %s",
11596 g_free(adapter->path);
11597 adapter->path = NULL;
11601 if (adapters == NULL)
11602 adapter->is_default = true;
11604 adapters = g_slist_append(adapters, adapter);
11606 agent = agent_get(NULL);
11608 uint8_t io_cap = agent_get_io_capability(agent);
11609 adapter_set_io_capability(adapter, io_cap);
11610 agent_unref(agent);
11613 adapter->database = btd_gatt_database_new(adapter);
11614 if (!adapter->database) {
11615 btd_error(adapter->dev_id,
11616 "Failed to create GATT database for adapter");
11617 adapters = g_slist_remove(adapters, adapter);
11621 if (g_dbus_get_flags() & G_DBUS_FLAG_ENABLE_EXPERIMENTAL) {
11622 /* Don't start advertising managers on non-LE controllers. */
11623 if (adapter->supported_settings & MGMT_SETTING_LE) {
11624 adapter->adv_manager =
11625 btd_advertising_manager_new(adapter);
11627 btd_info(adapter->dev_id,
11628 "LEAdvertisingManager skipped, LE unavailable");
11632 db = btd_gatt_database_get_db(adapter->database);
11633 adapter->db_id = gatt_db_register(db, services_modified,
11637 load_config(adapter);
11638 fix_storage(adapter);
11639 load_drivers(adapter);
11640 btd_profile_foreach(probe_profile, adapter);
11641 clear_blocked(adapter);
11642 load_devices(adapter);
11644 #ifdef __TIZEN_PATCH__
11645 if (adapter->le_privacy_enabled &&
11646 (adapter->supported_settings & MGMT_SETTING_PRIVACY))
11647 set_privacy(adapter, true);
11649 DBG("LE privacy feature not configured or supported");
11652 /* retrieve the active connections: address the scenario where
11653 * the are active connections before the daemon've started */
11654 if (adapter->current_settings & MGMT_SETTING_POWERED)
11655 load_connections(adapter);
11657 adapter->initialized = TRUE;
11659 if (main_opts.did_source) {
11660 /* DeviceID record is added by sdpd-server before any other
11661 * record is registered. */
11662 adapter_service_insert(adapter, sdp_record_find(0x10000));
11663 set_did(adapter, main_opts.did_vendor, main_opts.did_product,
11664 main_opts.did_version, main_opts.did_source);
11667 DBG("Adapter %s registered", adapter->path);
11672 static int adapter_unregister(struct btd_adapter *adapter)
11674 DBG("Unregister path: %s", adapter->path);
11676 adapters = g_slist_remove(adapters, adapter);
11678 if (adapter->is_default && adapters != NULL) {
11679 struct btd_adapter *new_default;
11681 new_default = adapter_find_by_id(hci_get_route(NULL));
11682 if (new_default == NULL)
11683 new_default = adapters->data;
11685 new_default->is_default = true;
11688 adapter_list = g_list_remove(adapter_list, adapter);
11690 adapter_remove(adapter);
11691 btd_adapter_unref(adapter);
11696 static void disconnected_callback(uint16_t index, uint16_t length,
11697 const void *param, void *user_data)
11699 const struct mgmt_ev_device_disconnected *ev = param;
11700 struct btd_adapter *adapter = user_data;
11703 if (length < sizeof(struct mgmt_addr_info)) {
11704 btd_error(adapter->dev_id,
11705 "Too small device disconnected event");
11709 if (length < sizeof(*ev))
11710 reason = MGMT_DEV_DISCONN_UNKNOWN;
11712 reason = ev->reason;
11714 dev_disconnected(adapter, &ev->addr, reason);
11717 static void connected_callback(uint16_t index, uint16_t length,
11718 const void *param, void *user_data)
11720 const struct mgmt_ev_device_connected *ev = param;
11721 struct btd_adapter *adapter = user_data;
11722 struct btd_device *device;
11723 struct eir_data eir_data;
11728 if (length < sizeof(*ev)) {
11729 btd_error(adapter->dev_id, "Too small device connected event");
11733 eir_len = btohs(ev->eir_len);
11734 if (length < sizeof(*ev) + eir_len) {
11735 btd_error(adapter->dev_id, "Too small device connected event");
11739 ba2str(&ev->addr.bdaddr, addr);
11741 DBG("hci%u device %s connected eir_len %u", index, addr, eir_len);
11743 device = btd_adapter_get_device(adapter, &ev->addr.bdaddr,
11746 btd_error(adapter->dev_id,
11747 "Unable to get device object for %s", addr);
11751 memset(&eir_data, 0, sizeof(eir_data));
11753 eir_parse(&eir_data, ev->eir, eir_len);
11755 if (eir_data.class != 0)
11756 device_set_class(device, eir_data.class);
11758 adapter_add_connection(adapter, device, ev->addr.type);
11760 name_known = device_name_known(device);
11762 if (eir_data.name && (eir_data.name_complete || !name_known)) {
11763 device_store_cached_name(device, eir_data.name);
11764 btd_device_device_set_name(device, eir_data.name);
11767 if (eir_data.msd_list)
11768 adapter_msd_notify(adapter, device, eir_data.msd_list);
11770 eir_data_free(&eir_data);
11773 static void device_blocked_callback(uint16_t index, uint16_t length,
11774 const void *param, void *user_data)
11776 const struct mgmt_ev_device_blocked *ev = param;
11777 struct btd_adapter *adapter = user_data;
11778 struct btd_device *device;
11781 if (length < sizeof(*ev)) {
11782 btd_error(adapter->dev_id, "Too small device blocked event");
11786 ba2str(&ev->addr.bdaddr, addr);
11787 DBG("hci%u %s blocked", index, addr);
11789 device = btd_adapter_find_device(adapter, &ev->addr.bdaddr,
11792 device_block(device, TRUE);
11795 static void device_unblocked_callback(uint16_t index, uint16_t length,
11796 const void *param, void *user_data)
11798 const struct mgmt_ev_device_unblocked *ev = param;
11799 struct btd_adapter *adapter = user_data;
11800 struct btd_device *device;
11803 if (length < sizeof(*ev)) {
11804 btd_error(adapter->dev_id, "Too small device unblocked event");
11808 ba2str(&ev->addr.bdaddr, addr);
11809 DBG("hci%u %s unblocked", index, addr);
11811 device = btd_adapter_find_device(adapter, &ev->addr.bdaddr,
11814 device_unblock(device, FALSE, TRUE);
11817 static void conn_fail_notify(struct btd_device *dev, uint8_t status)
11821 for (l = conn_fail_list; l; l = g_slist_next(l)) {
11822 btd_conn_fail_cb conn_fail_cb = l->data;
11823 conn_fail_cb(dev, status);
11827 void btd_add_conn_fail_cb(btd_conn_fail_cb func)
11829 conn_fail_list = g_slist_append(conn_fail_list, func);
11832 void btd_remove_conn_fail_cb(btd_conn_fail_cb func)
11834 conn_fail_list = g_slist_remove(conn_fail_list, func);
11837 static void connect_failed_callback(uint16_t index, uint16_t length,
11838 const void *param, void *user_data)
11840 const struct mgmt_ev_connect_failed *ev = param;
11841 struct btd_adapter *adapter = user_data;
11842 struct btd_device *device;
11845 if (length < sizeof(*ev)) {
11846 btd_error(adapter->dev_id, "Too small connect failed event");
11850 ba2str(&ev->addr.bdaddr, addr);
11852 DBG("hci%u %s status %u", index, addr, ev->status);
11854 device = btd_adapter_find_device(adapter, &ev->addr.bdaddr,
11857 conn_fail_notify(device, ev->status);
11859 /* If the device is in a bonding process cancel any auth request
11860 * sent to the agent before proceeding, but keep the bonding
11861 * request structure. */
11862 if (device_is_bonding(device, NULL))
11863 device_cancel_authentication(device, FALSE);
11866 /* In the case of security mode 3 devices */
11867 bonding_attempt_complete(adapter, &ev->addr.bdaddr, ev->addr.type,
11870 /* If the device is scheduled to retry the bonding wait until the retry
11871 * happens. In other case, proceed with cancel the bondig.
11873 if (device && device_is_bonding(device, NULL)
11874 && !device_is_retrying(device)) {
11875 device_cancel_authentication(device, TRUE);
11876 device_bonding_failed(device, ev->status);
11879 #ifndef __TIZEN_PATCH__
11880 /* In the case the bonding was canceled or did exists, remove the device
11881 * when it is temporary. */
11882 if (device && !device_is_bonding(device, NULL)
11883 && device_is_temporary(device))
11884 btd_adapter_remove_device(adapter, device);
11888 static void remove_keys(struct btd_adapter *adapter,
11889 struct btd_device *device, uint8_t type)
11891 char adapter_addr[18];
11892 char device_addr[18];
11893 char filename[PATH_MAX];
11894 GKeyFile *key_file;
11898 ba2str(btd_adapter_get_address(adapter), adapter_addr);
11899 ba2str(device_get_address(device), device_addr);
11901 #ifdef __TIZEN_PATCH__
11902 if (device_get_rpa_exist(device) == true)
11903 ba2str(device_get_rpa(device), device_addr);
11906 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/%s/info", adapter_addr,
11908 key_file = g_key_file_new();
11909 g_key_file_load_from_file(key_file, filename, 0, NULL);
11911 if (type == BDADDR_BREDR) {
11912 g_key_file_remove_group(key_file, "LinkKey", NULL);
11914 g_key_file_remove_group(key_file, "LongTermKey", NULL);
11915 g_key_file_remove_group(key_file, "LocalSignatureKey", NULL);
11916 g_key_file_remove_group(key_file, "RemoteSignatureKey", NULL);
11917 g_key_file_remove_group(key_file, "IdentityResolvingKey", NULL);
11920 str = g_key_file_to_data(key_file, &length, NULL);
11921 g_file_set_contents(filename, str, length, NULL);
11924 g_key_file_free(key_file);
11927 static void unpaired_callback(uint16_t index, uint16_t length,
11928 const void *param, void *user_data)
11930 const struct mgmt_ev_device_unpaired *ev = param;
11931 struct btd_adapter *adapter = user_data;
11932 struct btd_device *device;
11935 if (length < sizeof(*ev)) {
11936 btd_error(adapter->dev_id, "Too small device unpaired event");
11940 ba2str(&ev->addr.bdaddr, addr);
11942 DBG("hci%u addr %s", index, addr);
11944 device = btd_adapter_find_device(adapter, &ev->addr.bdaddr,
11947 btd_warn(adapter->dev_id,
11948 "No device object for unpaired device %s", addr);
11952 remove_keys(adapter, device, ev->addr.type);
11953 device_set_unpaired(device, ev->addr.type);
11956 #ifdef __TIZEN_PATCH__
11957 static void set_privacy_complete(uint8_t status, uint16_t length,
11958 const void *param, void *user_data)
11960 struct btd_adapter *adapter = user_data;
11962 if (status != MGMT_STATUS_SUCCESS)
11963 error("Setting privacy failed for hci%u: %s (0x%02x)",
11964 adapter->dev_id, mgmt_errstr(status), status);
11966 DBG("Privacy feature is set/unset successfully for hci%u",
11970 static bool set_privacy(struct btd_adapter *adapter, bool privacy)
11972 struct mgmt_cp_set_privacy cp;
11973 static const char testblock[MGMT_IRK_SIZE];
11975 memset(&cp, 0, sizeof(cp));
11978 if (!memcmp(adapter->local_irk, testblock, MGMT_IRK_SIZE)) {
11979 cp.privacy = GEN_IRK_THEN_ENABLE_PRIVACY;
11980 memset(cp.irk, 0, MGMT_IRK_SIZE);
11982 cp.privacy = ENABLE_PRIVACY;
11983 memcpy(cp.irk, adapter->local_irk, MGMT_IRK_SIZE);
11986 cp.privacy = DISABLE_PRIVACY;
11987 memset(cp.irk, 0, MGMT_IRK_SIZE);
11989 if (mgmt_send(adapter->mgmt, MGMT_OP_SET_PRIVACY,
11990 adapter->dev_id, sizeof(cp), &cp,
11991 set_privacy_complete, adapter, NULL) > 0)
11994 error("Failed to set privacy and load local irk for index %u",
12000 int btd_adapter_connect_ipsp(struct btd_adapter *adapter,
12001 const bdaddr_t *bdaddr,
12002 uint8_t bdaddr_type)
12005 struct mgmt_cp_connect_6lowpan cp;
12007 memset(&cp, 0, sizeof(cp));
12008 bacpy(&cp.addr.bdaddr, bdaddr);
12009 cp.addr.type = bdaddr_type;
12011 if (mgmt_send(adapter->mgmt, MGMT_OP_CONNECT_6LOWPAN,
12012 adapter->dev_id, sizeof(cp), &cp,
12013 NULL, NULL, NULL) > 0)
12019 int btd_adapter_disconnect_ipsp(struct btd_adapter *adapter,
12020 const bdaddr_t *bdaddr,
12021 uint8_t bdaddr_type)
12024 struct mgmt_cp_disconnect_6lowpan cp;
12026 memset(&cp, 0, sizeof(cp));
12027 bacpy(&cp.addr.bdaddr, bdaddr);
12028 cp.addr.type = bdaddr_type;
12030 if (mgmt_send(adapter->mgmt, MGMT_OP_DISCONNECT_6LOWPAN,
12031 adapter->dev_id, sizeof(cp), &cp,
12032 NULL, NULL, NULL) > 0)
12038 uint8_t btd_adapter_get_rpa_res_support_value(
12039 struct btd_adapter *adapter)
12041 return adapter->central_rpa_res_support;
12044 static void set_dev_rpa_res_support_complete(uint8_t status,
12045 uint16_t length, const void *param,
12048 if (status != MGMT_STATUS_SUCCESS)
12049 error("Failed to set RPA resolution support of device : %s (0x%02x)",
12050 mgmt_errstr(status), status);
12052 DBG("Set RPA resolution support successful");
12055 int btd_adapter_set_dev_rpa_res_support(struct btd_adapter *adapter,
12056 struct btd_device *device)
12059 struct mgmt_cp_set_dev_rpa_res_support cp;
12061 DBG("btd_adapter_set_dev_rpa_res_support called");
12063 memset(&cp, 0, sizeof(cp));
12065 bacpy(&cp.addr.bdaddr, device_get_address(device));
12066 cp.addr.type = btd_device_get_bdaddr_type(device);
12067 cp.res_support = device_get_rpa_res_char_value(device);
12069 if (mgmt_send(adapter->mgmt, MGMT_OP_SET_DEV_RPA_RES_SUPPORT,
12070 adapter->dev_id, sizeof(cp), &cp,
12071 set_dev_rpa_res_support_complete, NULL, NULL) > 0)
12078 static void clear_devices_complete(uint8_t status, uint16_t length,
12079 const void *param, void *user_data)
12081 if (status != MGMT_STATUS_SUCCESS) {
12082 error("Failed to clear devices: %s (0x%02x)",
12083 mgmt_errstr(status), status);
12088 static int clear_devices(struct btd_adapter *adapter)
12090 struct mgmt_cp_remove_device cp;
12092 if (!kernel_conn_control)
12095 memset(&cp, 0, sizeof(cp));
12097 DBG("sending clear devices command for index %u", adapter->dev_id);
12099 if (mgmt_send(adapter->mgmt, MGMT_OP_REMOVE_DEVICE,
12100 adapter->dev_id, sizeof(cp), &cp,
12101 clear_devices_complete, adapter, NULL) > 0)
12104 btd_error(adapter->dev_id, "Failed to clear devices for index %u",
12110 static void read_info_complete(uint8_t status, uint16_t length,
12111 const void *param, void *user_data)
12113 struct btd_adapter *adapter = user_data;
12114 const struct mgmt_rp_read_info *rp = param;
12115 uint32_t missing_settings;
12118 DBG("index %u status 0x%02x", adapter->dev_id, status);
12120 if (status != MGMT_STATUS_SUCCESS) {
12121 btd_error(adapter->dev_id,
12122 "Failed to read info for index %u: %s (0x%02x)",
12123 adapter->dev_id, mgmt_errstr(status), status);
12127 if (length < sizeof(*rp)) {
12128 btd_error(adapter->dev_id,
12129 "Too small read info complete response");
12133 if (bacmp(&rp->bdaddr, BDADDR_ANY) == 0) {
12134 btd_error(adapter->dev_id, "No Bluetooth address for index %u",
12140 * Store controller information for device address, class of device,
12141 * device name, short name and settings.
12143 * During the lifetime of the controller these will be updated by
12144 * events and the information is required to keep the current
12145 * state of the controller.
12147 bacpy(&adapter->bdaddr, &rp->bdaddr);
12148 adapter->dev_class = rp->dev_class[0] | (rp->dev_class[1] << 8) |
12149 (rp->dev_class[2] << 16);
12150 adapter->name = g_strdup((const char *) rp->name);
12151 adapter->short_name = g_strdup((const char *) rp->short_name);
12153 adapter->supported_settings = btohl(rp->supported_settings);
12154 adapter->current_settings = btohl(rp->current_settings);
12156 #ifdef __TIZEN_PATCH__
12157 adapter_check_version(adapter, rp->version);
12160 clear_uuids(adapter);
12161 clear_devices(adapter);
12163 missing_settings = adapter->current_settings ^
12164 adapter->supported_settings;
12166 switch (main_opts.mode) {
12168 if (missing_settings & MGMT_SETTING_SSP)
12169 set_mode(adapter, MGMT_OP_SET_SSP, 0x01);
12170 if (missing_settings & MGMT_SETTING_LE)
12171 set_mode(adapter, MGMT_OP_SET_LE, 0x01);
12172 if (missing_settings & MGMT_SETTING_BREDR)
12173 set_mode(adapter, MGMT_OP_SET_BREDR, 0x01);
12175 case BT_MODE_BREDR:
12176 if (!(adapter->supported_settings & MGMT_SETTING_BREDR)) {
12177 btd_error(adapter->dev_id,
12178 "Ignoring adapter withouth BR/EDR support");
12182 if (missing_settings & MGMT_SETTING_SSP)
12183 set_mode(adapter, MGMT_OP_SET_SSP, 0x01);
12184 if (missing_settings & MGMT_SETTING_BREDR)
12185 set_mode(adapter, MGMT_OP_SET_BREDR, 0x01);
12186 if (adapter->current_settings & MGMT_SETTING_LE)
12187 set_mode(adapter, MGMT_OP_SET_LE, 0x00);
12190 if (!(adapter->supported_settings & MGMT_SETTING_LE)) {
12191 btd_error(adapter->dev_id,
12192 "Ignoring adapter withouth LE support");
12196 if (missing_settings & MGMT_SETTING_LE)
12197 set_mode(adapter, MGMT_OP_SET_LE, 0x01);
12198 if (adapter->current_settings & MGMT_SETTING_BREDR)
12199 set_mode(adapter, MGMT_OP_SET_BREDR, 0x00);
12203 if (missing_settings & MGMT_SETTING_SECURE_CONN)
12204 set_mode(adapter, MGMT_OP_SET_SECURE_CONN, 0x01);
12206 if (main_opts.fast_conn &&
12207 (missing_settings & MGMT_SETTING_FAST_CONNECTABLE))
12208 set_mode(adapter, MGMT_OP_SET_FAST_CONNECTABLE, 0x01);
12210 #ifdef __TIZEN_PATCH__
12211 /* Set the RPA resolution value to '1' if privacy is supported */
12212 if (adapter->le_privacy_enabled &&
12213 adapter->supported_settings & MGMT_SETTING_PRIVACY)
12214 adapter->central_rpa_res_support = 0x01;
12217 err = adapter_register(adapter);
12219 btd_error(adapter->dev_id, "Unable to register new adapter");
12224 * Register all event notification handlers for controller.
12226 * The handlers are registered after a succcesful read of the
12227 * controller info. From now on they can track updates and
12230 mgmt_register(adapter->mgmt, MGMT_EV_NEW_SETTINGS, adapter->dev_id,
12231 new_settings_callback, adapter, NULL);
12233 mgmt_register(adapter->mgmt, MGMT_EV_CLASS_OF_DEV_CHANGED,
12235 dev_class_changed_callback,
12237 mgmt_register(adapter->mgmt, MGMT_EV_LOCAL_NAME_CHANGED,
12239 local_name_changed_callback,
12242 mgmt_register(adapter->mgmt, MGMT_EV_DISCOVERING,
12244 discovering_callback,
12247 mgmt_register(adapter->mgmt, MGMT_EV_DEVICE_FOUND,
12249 device_found_callback,
12252 #ifdef __TIZEN_PATCH__
12253 mgmt_register(adapter->mgmt, MGMT_EV_LE_DEVICE_FOUND,
12255 le_device_found_callback,
12259 mgmt_register(adapter->mgmt, MGMT_EV_DEVICE_DISCONNECTED,
12261 disconnected_callback,
12264 mgmt_register(adapter->mgmt, MGMT_EV_DEVICE_CONNECTED,
12266 connected_callback,
12269 mgmt_register(adapter->mgmt, MGMT_EV_CONNECT_FAILED,
12271 connect_failed_callback,
12274 mgmt_register(adapter->mgmt, MGMT_EV_DEVICE_UNPAIRED,
12279 mgmt_register(adapter->mgmt, MGMT_EV_AUTH_FAILED,
12281 auth_failed_callback,
12284 mgmt_register(adapter->mgmt, MGMT_EV_NEW_LINK_KEY,
12286 new_link_key_callback,
12289 mgmt_register(adapter->mgmt, MGMT_EV_NEW_LONG_TERM_KEY,
12291 new_long_term_key_callback,
12294 mgmt_register(adapter->mgmt, MGMT_EV_NEW_CSRK,
12299 mgmt_register(adapter->mgmt, MGMT_EV_NEW_IRK,
12304 mgmt_register(adapter->mgmt, MGMT_EV_NEW_CONN_PARAM,
12309 mgmt_register(adapter->mgmt, MGMT_EV_DEVICE_BLOCKED,
12311 device_blocked_callback,
12313 mgmt_register(adapter->mgmt, MGMT_EV_DEVICE_UNBLOCKED,
12315 device_unblocked_callback,
12318 mgmt_register(adapter->mgmt, MGMT_EV_PIN_CODE_REQUEST,
12320 pin_code_request_callback,
12323 mgmt_register(adapter->mgmt, MGMT_EV_USER_CONFIRM_REQUEST,
12325 user_confirm_request_callback,
12328 mgmt_register(adapter->mgmt, MGMT_EV_USER_PASSKEY_REQUEST,
12330 user_passkey_request_callback,
12333 mgmt_register(adapter->mgmt, MGMT_EV_PASSKEY_NOTIFY,
12335 user_passkey_notify_callback,
12338 #ifdef __TIZEN_PATCH__
12339 mgmt_register(adapter->mgmt, MGMT_EV_RSSI_ALERT,
12341 rssi_alert_callback,
12344 mgmt_register(adapter->mgmt, MGMT_EV_RAW_RSSI,
12346 get_raw_rssi_callback,
12349 mgmt_register(adapter->mgmt, MGMT_EV_RSSI_ENABLED,
12351 rssi_enabled_callback,
12354 mgmt_register(adapter->mgmt, MGMT_EV_RSSI_DISABLED,
12356 rssi_disabled_callback,
12360 mgmt_register(adapter->mgmt, MGMT_EV_NEW_LOCAL_IRK,
12362 new_local_irk_callback,
12366 mgmt_register(adapter->mgmt, MGMT_EV_HARDWARE_ERROR,
12368 hardware_error_callback,
12371 mgmt_register(adapter->mgmt, MGMT_EV_TX_TIMEOUT_ERROR,
12373 tx_timeout_error_callback,
12376 mgmt_register(adapter->mgmt, MGMT_EV_DEVICE_NAME_UPDATE,
12378 device_name_update_callback,
12381 mgmt_register(adapter->mgmt, MGMT_EV_MULTI_ADV_STATE_CHANGED,
12383 multi_adv_state_change_callback,
12386 mgmt_register(adapter->mgmt, MGMT_EV_6LOWPAN_CONN_STATE_CHANGED,
12388 bt_6lowpan_conn_state_change_callback,
12391 mgmt_register(adapter->mgmt, MGMT_EV_LE_DATA_LENGTH_CHANGED,
12393 bt_le_data_length_changed_callback,
12396 mgmt_register(adapter->mgmt, MGMT_EV_CONN_UPDATED,
12398 le_conn_update_completed_callback,
12402 set_dev_class(adapter);
12404 set_name(adapter, btd_adapter_get_name(adapter));
12406 if (!(adapter->current_settings & MGMT_SETTING_BONDABLE))
12407 set_mode(adapter, MGMT_OP_SET_BONDABLE, 0x01);
12409 if (!kernel_conn_control)
12410 set_mode(adapter, MGMT_OP_SET_CONNECTABLE, 0x01);
12411 else if (adapter->current_settings & MGMT_SETTING_CONNECTABLE)
12412 set_mode(adapter, MGMT_OP_SET_CONNECTABLE, 0x00);
12414 if (adapter->stored_discoverable && !adapter->discoverable_timeout)
12415 set_discoverable(adapter, 0x01, 0);
12417 if (adapter->current_settings & MGMT_SETTING_POWERED)
12418 adapter_start(adapter);
12419 #ifdef __TIZEN_PATCH__
12421 set_mode(adapter, MGMT_OP_SET_POWERED, 0x01);
12428 * Remove adapter from list in case of a failure.
12430 * Leaving an adapter structure around for a controller that can
12431 * not be initilized makes no sense at the moment.
12433 * This is a simplification to avoid constant checks if the
12434 * adapter is ready to do anything.
12436 adapter_list = g_list_remove(adapter_list, adapter);
12438 btd_adapter_unref(adapter);
12441 static void index_added(uint16_t index, uint16_t length, const void *param,
12444 struct btd_adapter *adapter;
12446 DBG("index %u", index);
12448 adapter = btd_adapter_lookup(index);
12450 btd_warn(adapter->dev_id,
12451 "Ignoring index added for an already existing adapter");
12455 adapter = btd_adapter_new(index);
12457 btd_error(adapter->dev_id,
12458 "Unable to create new adapter for index %u", index);
12463 * Protect against potential two executions of read controller info.
12465 * In case the start of the daemon and the action of adding a new
12466 * controller coincide this function might be called twice.
12468 * To avoid the double execution of reading the controller info,
12469 * add the adapter already to the list. If an adapter is already
12470 * present, the second notification will cause a warning. If the
12471 * command fails the adapter is removed from the list again.
12473 adapter_list = g_list_append(adapter_list, adapter);
12475 DBG("sending read info command for index %u", index);
12477 if (mgmt_send(mgmt_master, MGMT_OP_READ_INFO, index, 0, NULL,
12478 read_info_complete, adapter, NULL) > 0)
12481 btd_error(adapter->dev_id,
12482 "Failed to read controller info for index %u", index);
12484 adapter_list = g_list_remove(adapter_list, adapter);
12486 btd_adapter_unref(adapter);
12489 static void index_removed(uint16_t index, uint16_t length, const void *param,
12492 struct btd_adapter *adapter;
12494 DBG("index %u", index);
12496 adapter = btd_adapter_lookup(index);
12498 warn("Ignoring index removal for a non-existent adapter");
12502 adapter_unregister(adapter);
12505 static void read_index_list_complete(uint8_t status, uint16_t length,
12506 const void *param, void *user_data)
12508 const struct mgmt_rp_read_index_list *rp = param;
12512 if (status != MGMT_STATUS_SUCCESS) {
12513 error("Failed to read index list: %s (0x%02x)",
12514 mgmt_errstr(status), status);
12518 if (length < sizeof(*rp)) {
12519 error("Wrong size of read index list response");
12523 num = btohs(rp->num_controllers);
12525 DBG("Number of controllers: %d", num);
12527 if (num * sizeof(uint16_t) + sizeof(*rp) != length) {
12528 error("Incorrect packet size for index list response");
12532 for (i = 0; i < num; i++) {
12535 index = btohs(rp->index[i]);
12537 DBG("Found index %u", index);
12540 * Pretend to be index added event notification.
12542 * It is safe to just trigger the procedure for index
12543 * added notification. It does check against itself.
12545 index_added(index, 0, NULL, NULL);
12549 static void read_commands_complete(uint8_t status, uint16_t length,
12550 const void *param, void *user_data)
12552 const struct mgmt_rp_read_commands *rp = param;
12553 uint16_t num_commands, num_events;
12554 const uint16_t *opcode;
12555 size_t expected_len;
12558 if (status != MGMT_STATUS_SUCCESS) {
12559 error("Failed to read supported commands: %s (0x%02x)",
12560 mgmt_errstr(status), status);
12564 if (length < sizeof(*rp)) {
12565 error("Wrong size of read commands response");
12569 num_commands = btohs(rp->num_commands);
12570 num_events = btohs(rp->num_events);
12572 DBG("Number of commands: %d", num_commands);
12573 DBG("Number of events: %d", num_events);
12575 expected_len = sizeof(*rp) + num_commands * sizeof(uint16_t) +
12576 num_events * sizeof(uint16_t);
12578 if (length < expected_len) {
12579 error("Too small reply for supported commands: (%u != %zu)",
12580 length, expected_len);
12584 opcode = rp->opcodes;
12586 for (i = 0; i < num_commands; i++) {
12587 uint16_t op = get_le16(opcode++);
12589 if (op == MGMT_OP_ADD_DEVICE) {
12590 DBG("enabling kernel-side connection control");
12591 kernel_conn_control = true;
12596 static void read_version_complete(uint8_t status, uint16_t length,
12597 const void *param, void *user_data)
12599 const struct mgmt_rp_read_version *rp = param;
12601 if (status != MGMT_STATUS_SUCCESS) {
12602 error("Failed to read version information: %s (0x%02x)",
12603 mgmt_errstr(status), status);
12607 if (length < sizeof(*rp)) {
12608 error("Wrong size of read version response");
12612 mgmt_version = rp->version;
12613 mgmt_revision = btohs(rp->revision);
12615 info("Bluetooth management interface %u.%u initialized",
12616 mgmt_version, mgmt_revision);
12618 if (mgmt_version < 1) {
12619 error("Version 1.0 or later of management interface required");
12623 DBG("sending read supported commands command");
12626 * It is irrelevant if this command succeeds or fails. In case of
12627 * failure safe settings are assumed.
12629 mgmt_send(mgmt_master, MGMT_OP_READ_COMMANDS,
12630 MGMT_INDEX_NONE, 0, NULL,
12631 read_commands_complete, NULL, NULL);
12633 mgmt_register(mgmt_master, MGMT_EV_INDEX_ADDED, MGMT_INDEX_NONE,
12634 index_added, NULL, NULL);
12635 mgmt_register(mgmt_master, MGMT_EV_INDEX_REMOVED, MGMT_INDEX_NONE,
12636 index_removed, NULL, NULL);
12638 DBG("sending read index list command");
12640 if (mgmt_send(mgmt_master, MGMT_OP_READ_INDEX_LIST,
12641 MGMT_INDEX_NONE, 0, NULL,
12642 read_index_list_complete, NULL, NULL) > 0)
12645 error("Failed to read controller index list");
12648 static void mgmt_debug(const char *str, void *user_data)
12650 const char *prefix = user_data;
12652 info("%s%s", prefix, str);
12655 int adapter_init(void)
12657 dbus_conn = btd_get_dbus_connection();
12659 mgmt_master = mgmt_new_default();
12660 if (!mgmt_master) {
12661 error("Failed to access management interface");
12665 if (getenv("MGMT_DEBUG"))
12666 mgmt_set_debug(mgmt_master, mgmt_debug, "mgmt: ", NULL);
12668 DBG("sending read version command");
12670 if (mgmt_send(mgmt_master, MGMT_OP_READ_VERSION,
12671 MGMT_INDEX_NONE, 0, NULL,
12672 read_version_complete, NULL, NULL) > 0)
12675 error("Failed to read management version information");
12680 void adapter_cleanup(void)
12682 g_list_free(adapter_list);
12685 struct btd_adapter *adapter = adapters->data;
12687 adapter_remove(adapter);
12688 adapters = g_slist_remove(adapters, adapter);
12689 btd_adapter_unref(adapter);
12693 * In case there is another reference active, clear out
12694 * registered handlers for index added and index removed.
12696 * This is just an extra precaution to be safe, and in
12697 * reality should not make a difference.
12699 mgmt_unregister_index(mgmt_master, MGMT_INDEX_NONE);
12702 * In case there is another reference active, cancel
12703 * all pending global commands.
12705 * This is just an extra precaution to avoid callbacks
12706 * that potentially then could leak memory or access
12707 * an invalid structure.
12709 mgmt_cancel_index(mgmt_master, MGMT_INDEX_NONE);
12711 mgmt_unref(mgmt_master);
12712 mgmt_master = NULL;
12717 void adapter_shutdown(void)
12723 powering_down = true;
12725 for (list = g_list_first(adapter_list); list;
12726 list = g_list_next(list)) {
12727 struct btd_adapter *adapter = list->data;
12729 if (!(adapter->current_settings & MGMT_SETTING_POWERED))
12732 set_mode(adapter, MGMT_OP_SET_POWERED, 0x00);
12734 adapter_remaining++;
12737 if (!adapter_remaining)
12742 * Check if workaround for broken ATT server socket behavior is needed
12743 * where we need to connect an ATT client socket before pairing to get
12744 * early access to the ATT channel.
12746 bool btd_le_connect_before_pairing(void)
12748 if (MGMT_VERSION(mgmt_version, mgmt_revision) < MGMT_VERSION(1, 4))
12754 #ifdef __TIZEN_PATCH__
12756 static void read_rssi_complete(uint8_t status, uint16_t length,
12757 const void *param, void *user_data)
12759 const struct mgmt_rp_read_rssi *rp = param;
12760 struct btd_device *device = user_data;
12762 if (status != MGMT_STATUS_SUCCESS) {
12763 error("read RSSI failed: %s (0x%02x)",
12764 mgmt_errstr(status), status);
12768 if (length < sizeof(*rp)) {
12769 error("Too small read rssi response");
12774 device_set_rssi(device, rp->rssi);
12779 int btd_adapter_read_rssi(struct btd_adapter *adapter, bdaddr_t *bdaddr,
12780 struct btd_device *device)
12782 struct mgmt_cp_read_rssi cp;
12784 DBG("btd_adapter_read_rssi");
12785 memset(&cp, 0, sizeof(cp));
12786 bacpy(&cp.bdaddr, bdaddr);
12788 if (mgmt_send(adapter->mgmt, MGMT_OP_READ_RSSI,
12789 adapter->dev_id, sizeof(cp), &cp,
12790 read_rssi_complete, device, NULL) > 0)
12795 int btd_adapter_l2cap_conn_param_update(struct btd_adapter *adapter,
12796 bdaddr_t *bdaddr, uint16_t interval_min,
12797 uint16_t interval_max, uint16_t latency,
12798 uint16_t supervision_time_out)
12800 struct mgmt_cp_l2cap_conn_param_update cp;
12802 memset(&cp, 0, sizeof(cp));
12804 bacpy(&cp.bdaddr, bdaddr);
12808 cp.interval_min = interval_min;
12809 cp.interval_max = interval_max;
12810 cp.latency = latency;
12811 cp.supervision_time_out = supervision_time_out;
12812 if (mgmt_send(adapter->mgmt, MGMT_OP_L2CAP_CONN_PARAM_UPDATE,
12813 adapter->dev_id, sizeof(cp), &cp,
12814 NULL, NULL, NULL) > 0)
12820 static void write_auth_payload_timeout_complete(uint8_t status, uint16_t length,
12821 const void *param, void *user_data)
12823 const struct mgmt_rp_write_auth_payload_timeout *rp = param;
12825 if (status != MGMT_STATUS_SUCCESS) {
12826 error("Failed to write auth payload timeout: %s (0x%02x)",
12827 mgmt_errstr(status), status);
12831 if (length < sizeof(*rp)) {
12832 error("Wrong size of write auth payload timeout parameter");
12837 int btd_adapter_write_auth_payload_timeout(struct btd_adapter *adapter,
12838 bdaddr_t *bdaddr, uint32_t payload_timeout,
12839 struct btd_device *device)
12841 struct mgmt_cp_write_auth_payload_timeout cp;
12842 memset(&cp, 0, sizeof(cp));
12843 bacpy(&cp.bdaddr, bdaddr);
12845 if (payload_timeout > 65536)
12848 cp.auth_payload_timeout = payload_timeout;
12850 if (mgmt_send(adapter->mgmt, MGMT_OP_WRITE_AUTH_PAYLOAD_TIMEOUT,
12851 adapter->dev_id, sizeof(cp), &cp,
12852 write_auth_payload_timeout_complete, device, NULL) > 0)
12857 static void read_auth_payload_timeout_complete(uint8_t status, uint16_t length,
12858 const void *param, void *user_data)
12860 const struct mgmt_rp_read_auth_payload_timeout *rp = param;
12861 struct btd_device *device = user_data;
12862 if (status != MGMT_STATUS_SUCCESS) {
12863 error("read auth payload timeout failed: %s (0x%02x)",
12864 mgmt_errstr(status), status);
12868 if (length < sizeof(*rp)) {
12869 error("Too small read payload response");
12874 device_set_payload_timeout(device, rp->auth_payload_timeout);
12879 int btd_adapter_read_auth_payload_timeout(struct btd_adapter *adapter,
12880 bdaddr_t *bdaddr, struct btd_device *device)
12882 struct mgmt_cp_read_auth_payload_timeout cp;
12883 memset(&cp, 0, sizeof(cp));
12884 bacpy(&cp.bdaddr, bdaddr);
12886 if (mgmt_send(adapter->mgmt, MGMT_OP_READ_AUTH_PAYLOAD_TIMEOUT,
12887 adapter->dev_id, sizeof(cp), &cp,
12888 read_auth_payload_timeout_complete, device, NULL) > 0)
12894 int btd_adapter_le_conn_update(struct btd_adapter *adapter, bdaddr_t *bdaddr,
12895 uint16_t interval_min, uint16_t interval_max,
12896 uint16_t latency, uint16_t supervision_time_out)
12898 struct mgmt_cp_le_conn_update cp;
12900 memset(&cp, 0, sizeof(cp));
12902 if (NULL != bdaddr)
12903 bacpy(&cp.bdaddr, bdaddr);
12907 cp.interval_min = interval_min;
12908 cp.interval_max = interval_max;
12909 cp.latency = latency;
12910 cp.supervision_time_out = supervision_time_out;
12912 if (mgmt_send(adapter->mgmt, MGMT_OP_LE_CONN_UPDATE,
12913 adapter->dev_id, sizeof(cp), &cp,
12914 NULL, NULL, NULL) > 0)
12920 GSList *btd_adapter_get_connections(struct btd_adapter *adapter)
12922 /* Return the connected device list */
12923 return adapter->connections;
12925 #endif /* __TIZEN_PATCH__ */