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_FEATURE_BLUEZ_MODIFY
81 #include "adapter_le_vsc_features.h"
82 #include "../profile.h"
85 #define ADAPTER_INTERFACE "org.bluez.Adapter1"
87 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
88 #ifdef TIZEN_FEATURE_BLUEZ_BATTERY_WATCH
89 #define DEVICED_DEST "org.tizen.system.deviced"
90 #define DEVICED_BATT_INTERFACE "org.tizen.system.deviced.Battery"
91 #define DEVICED_BATT_OBJECT_PATH "/Org/Tizen/System/DeviceD/Battery"
92 #endif /* TIZEN_FEATURE_BLUEZ_BATTERY_WATCH */
96 #define MODE_CONNECTABLE 0x01
97 #define MODE_DISCOVERABLE 0x02
98 #define MODE_UNKNOWN 0xff
100 #define CONN_SCAN_TIMEOUT (3)
101 #define IDLE_DISCOV_TIMEOUT (5)
102 #define TEMP_DEV_TIMEOUT (3 * 60)
103 #define BONDING_TIMEOUT (2 * 60)
105 #define SCAN_TYPE_BREDR (1 << BDADDR_BREDR)
106 #define SCAN_TYPE_LE ((1 << BDADDR_LE_PUBLIC) | (1 << BDADDR_LE_RANDOM))
107 #define SCAN_TYPE_DUAL (SCAN_TYPE_BREDR | SCAN_TYPE_LE)
109 #define HCI_RSSI_INVALID 127
110 #define DISTANCE_VAL_INVALID 0x7FFF
111 #define PATHLOSS_MAX 137
113 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
114 #define ADV_DATA_MAX_LENGTH 31
115 #define SCAN_RESPONSE_DATA_LENGTH_MAX 31
116 #define EIR_MANUFACTURER_DATA_LENGTH_MAX 100
118 #define LE_BEARER_POSTFIX " LE"
119 #define LE_BEARER_POSTFIX_LEN 3
120 #endif /* TIZEN_FEATURE_BLUEZ_MODIFY */
123 static DBusConnection *dbus_conn = NULL;
125 static bool kernel_conn_control = false;
127 static GList *adapter_list = NULL;
128 static unsigned int adapter_remaining = 0;
129 static bool powering_down = false;
131 static GSList *adapters = NULL;
133 static struct mgmt *mgmt_master = NULL;
135 static uint8_t mgmt_version = 0;
136 static uint8_t mgmt_revision = 0;
138 static GSList *adapter_drivers = NULL;
140 static GSList *disconnect_list = NULL;
141 static GSList *conn_fail_list = NULL;
143 struct link_key_info {
145 unsigned char key[16];
150 struct smp_ltk_info {
153 uint8_t authenticated;
170 uint16_t min_interval;
171 uint16_t max_interval;
176 struct discovery_filter {
184 struct watch_client {
185 struct btd_adapter *adapter;
189 struct discovery_filter *discovery_filter;
192 struct service_auth {
198 struct btd_device *device;
199 struct btd_adapter *adapter;
200 struct agent *agent; /* NULL for queued auths */
203 struct btd_adapter_pin_cb_iter {
204 GSList *it; /* current callback function */
205 unsigned int attempt; /* numer of times it() was called */
206 /* When the iterator reaches the end, it is NULL and attempt is 0 */
209 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
211 int slot_id; /* Reservied slot id is 0 (Single adv) */
212 bool status; /* Advertising status */
215 static GSList *read_requests = NULL;
217 struct le_data_length_read_request {
218 struct btd_adapter *adapter;
229 bdaddr_t bdaddr; /* controller Bluetooth address */
230 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
231 bdaddr_t le_static_addr;
233 uint8_t bdaddr_type; /* address type */
234 uint32_t dev_class; /* controller class of device */
235 char *name; /* controller device name */
236 char *short_name; /* controller short name */
237 uint32_t supported_settings; /* controller supported settings */
238 uint32_t current_settings; /* current controller settings */
240 char *path; /* adapter object path */
241 uint16_t manufacturer; /* adapter manufacturer */
242 uint8_t major_class; /* configured major class */
243 uint8_t minor_class; /* configured minor class */
244 char *system_name; /* configured system name */
245 char *modalias; /* device id (modalias) */
246 bool stored_discoverable; /* stored discoverable mode */
247 uint32_t discoverable_timeout; /* discoverable time(sec) */
248 uint32_t pairable_timeout; /* pairable time(sec) */
250 char *current_alias; /* current adapter name alias */
251 char *stored_alias; /* stored adapter name alias */
252 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
253 uint8_t *local_irk; /* adapter local IRK */
255 bool ipsp_intialized; /* Ipsp Initialization state */
256 struct le_data_length_read_handler *read_handler;
257 struct le_data_length_read_default_data_length_handler *def_read_handler;
258 #ifdef TIZEN_FEATURE_BLUEZ_BATTERY_WATCH
259 guint charging_watch;
260 guint charging_timeout;
261 charging_state_e charging;
262 #endif /* TIZEN_FEATURE_BLUEZ_BATTERY_WATCH */
265 bool discovering; /* discovering property state */
266 bool filtered_discovery; /* we are doing filtered discovery */
267 bool no_scan_restart_delay; /* when this flag is set, restart scan
269 uint8_t discovery_type; /* current active discovery type */
270 uint8_t discovery_enable; /* discovery enabled/disabled */
271 bool discovery_suspended; /* discovery has been suspended */
272 GSList *discovery_list; /* list of discovery clients */
273 GSList *set_filter_list; /* list of clients that specified
274 * filter, but don't scan yet
276 /* current discovery filter, if any */
277 struct mgmt_cp_start_service_discovery *current_discovery_filter;
279 GSList *discovery_found; /* list of found devices */
280 guint discovery_idle_timeout; /* timeout between discovery runs */
281 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
282 guint le_discovery_idle_timeout; /* timeout between le discovery runs */
284 guint passive_scan_timeout; /* timeout between passive scans */
285 guint temp_devices_timeout; /* timeout for temporary devices */
287 guint pairable_timeout_id; /* pairable timeout id */
288 guint auth_idle_id; /* Pending authorization dequeue */
289 GQueue *auths; /* Ongoing and pending auths */
290 bool pincode_requested; /* PIN requested during last bonding */
291 GSList *connections; /* Connected devices */
292 GSList *devices; /* Devices structure pointers */
293 GSList *connect_list; /* Devices to connect when found */
294 struct btd_device *connect_le; /* LE device waiting to be connected */
295 sdp_list_t *services; /* Services associated to adapter */
297 struct btd_gatt_database *database;
298 struct btd_adv_manager *adv_manager;
300 gboolean initialized;
301 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
302 GSList *adv_list; /* List of advertising instance */
303 bool advertising; /* Advertising active */
304 gchar *version; /* Bluetooth Version */
305 uint8_t adv_tx_power;
306 bool le_discovering; /* LE Discovery active */
307 GSList *le_discovery_list; /* list of LE discovery clients */
310 GSList *pin_callbacks;
311 GSList *msd_callbacks;
316 struct oob_handler *oob_handler;
318 unsigned int load_ltks_id;
319 guint load_ltks_timeout;
321 unsigned int confirm_name_id;
322 guint confirm_name_timeout;
324 unsigned int pair_device_id;
325 guint pair_device_timeout;
327 unsigned int db_id; /* Service event handler for GATT db */
328 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
329 uint8_t central_rpa_res_support;
330 bluetooth_a2dp_role_t a2dp_role;
331 #ifdef TIZEN_FEATURE_PLATFROM_SCAN_FILTER
332 bool scan_filter_support; /* platform's scan filtering support */
333 uint8_t scan_type; /* scan type */
334 GSList *scan_params; /* scan filter parameters */
335 GSList *addr_filters; /* adress scan filters list */
336 GSList *service_data_changed_filters; /* service data changed scan filters list */
337 GSList *service_uuid_filters; /* service uuid scan filters list */
338 GSList *solicit_data_filters; /* solicitation data scan filters list */
339 GSList *local_name_filters; /* local name scan filters list */
340 GSList *manufaturer_data_filters; /* manufacturer data scan filters list */
341 GSList *service_data_filters; /* service data scan filters list */
344 bool is_default; /* true if adapter is default one */
348 ADAPTER_AUTHORIZE_DISCONNECTED = 0,
349 ADAPTER_AUTHORIZE_CHECK_CONNECTED
350 } adapter_authorize_type;
352 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
359 static struct btd_adapter *btd_adapter_lookup(uint16_t index)
363 for (list = g_list_first(adapter_list); list;
364 list = g_list_next(list)) {
365 struct btd_adapter *adapter = list->data;
367 if (adapter->dev_id == index)
374 struct btd_adapter *btd_adapter_get_default(void)
378 for (list = g_list_first(adapter_list); list;
379 list = g_list_next(list)) {
380 struct btd_adapter *adapter = list->data;
382 if (adapter->is_default)
389 bool btd_adapter_is_default(struct btd_adapter *adapter)
394 return adapter->is_default;
397 uint16_t btd_adapter_get_index(struct btd_adapter *adapter)
400 return MGMT_INDEX_NONE;
402 return adapter->dev_id;
405 static gboolean process_auth_queue(gpointer user_data);
407 static void dev_class_changed_callback(uint16_t index, uint16_t length,
408 const void *param, void *user_data)
410 struct btd_adapter *adapter = user_data;
411 const struct mgmt_cod *rp = param;
414 if (length < sizeof(*rp)) {
415 btd_error(adapter->dev_id,
416 "Wrong size of class of device changed parameters");
420 dev_class = rp->val[0] | (rp->val[1] << 8) | (rp->val[2] << 16);
422 if (dev_class == adapter->dev_class)
425 DBG("Class: 0x%06x", dev_class);
427 adapter->dev_class = dev_class;
429 g_dbus_emit_property_changed(dbus_conn, adapter->path,
430 ADAPTER_INTERFACE, "Class");
433 static void set_dev_class_complete(uint8_t status, uint16_t length,
434 const void *param, void *user_data)
436 struct btd_adapter *adapter = user_data;
438 if (status != MGMT_STATUS_SUCCESS) {
439 btd_error(adapter->dev_id,
440 "Failed to set device class: %s (0x%02x)",
441 mgmt_errstr(status), status);
446 * The parameters are identical and also the task that is
447 * required in both cases. So it is safe to just call the
448 * event handling functions here.
450 dev_class_changed_callback(adapter->dev_id, length, param, adapter);
453 static void set_dev_class(struct btd_adapter *adapter)
455 struct mgmt_cp_set_dev_class cp;
458 * If the controller does not support BR/EDR operation,
459 * there is no point in trying to set a major and minor
462 * This is an optimization for Low Energy only controllers.
464 if (!(adapter->supported_settings & MGMT_SETTING_BREDR))
467 memset(&cp, 0, sizeof(cp));
470 * Silly workaround for a really stupid kernel bug :(
472 * All current kernel versions assign the major and minor numbers
473 * straight to dev_class[0] and dev_class[1] without considering
474 * the proper bit shifting.
476 * To make this work, shift the value in userspace for now until
477 * we get a fixed kernel version.
479 cp.major = adapter->major_class & 0x1f;
480 cp.minor = adapter->minor_class << 2;
482 DBG("sending set device class command for index %u", adapter->dev_id);
484 if (mgmt_send(adapter->mgmt, MGMT_OP_SET_DEV_CLASS,
485 adapter->dev_id, sizeof(cp), &cp,
486 set_dev_class_complete, adapter, NULL) > 0)
489 btd_error(adapter->dev_id,
490 "Failed to set class of device for index %u", adapter->dev_id);
493 void btd_adapter_set_class(struct btd_adapter *adapter, uint8_t major,
496 if (adapter->major_class == major && adapter->minor_class == minor)
499 DBG("class: major %u minor %u", major, minor);
501 adapter->major_class = major;
502 adapter->minor_class = minor;
504 set_dev_class(adapter);
507 static uint8_t get_mode(const char *mode)
509 if (strcasecmp("off", mode) == 0)
511 else if (strcasecmp("connectable", mode) == 0)
512 return MODE_CONNECTABLE;
513 else if (strcasecmp("discoverable", mode) == 0)
514 return MODE_DISCOVERABLE;
519 static const char *adapter_dir(struct btd_adapter *adapter)
523 if (adapter->bdaddr_type == BDADDR_LE_RANDOM) {
524 strcpy(dir, "static-");
525 ba2str(&adapter->bdaddr, dir + 7);
527 ba2str(&adapter->bdaddr, dir);
533 uint8_t btd_adapter_get_address_type(struct btd_adapter *adapter)
535 return adapter->bdaddr_type;
538 static void store_adapter_info(struct btd_adapter *adapter)
541 char filename[PATH_MAX];
544 gboolean discoverable;
546 key_file = g_key_file_new();
548 if (adapter->pairable_timeout != main_opts.pairto)
549 g_key_file_set_integer(key_file, "General", "PairableTimeout",
550 adapter->pairable_timeout);
552 if ((adapter->current_settings & MGMT_SETTING_DISCOVERABLE) &&
553 !adapter->discoverable_timeout)
556 discoverable = FALSE;
558 g_key_file_set_boolean(key_file, "General", "Discoverable",
561 if (adapter->discoverable_timeout != main_opts.discovto)
562 g_key_file_set_integer(key_file, "General",
563 "DiscoverableTimeout",
564 adapter->discoverable_timeout);
566 if (adapter->stored_alias)
567 g_key_file_set_string(key_file, "General", "Alias",
568 adapter->stored_alias);
569 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
570 /* Store A2DP Role */
571 if (adapter->a2dp_role == BLUETOOTH_A2DP_SINK_ROLE)
572 g_key_file_set_string(key_file, "General", "DefaultA2DPRole", "sink");
574 g_key_file_set_string(key_file, "General", "DefaultA2DPRole", "source");
577 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/settings",
578 adapter_dir(adapter));
580 create_file(filename, S_IRUSR | S_IWUSR);
582 str = g_key_file_to_data(key_file, &length, NULL);
583 g_file_set_contents(filename, str, length, NULL);
586 g_key_file_free(key_file);
589 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
590 bluetooth_a2dp_role_t btd_adapter_get_a2dp_role(struct btd_adapter *adapter)
593 return BLUETOOTH_A2DP_SOURCE_ROLE;
595 return adapter->a2dp_role;
598 void btd_adapter_set_a2dp_role(struct btd_adapter *adapter, bluetooth_a2dp_role_t role)
601 DBG("Could not set a2dp role");
605 if (role == BLUETOOTH_A2DP_SOURCE_ROLE) {
606 DBG("Set audio source role");
607 adapter->a2dp_role = BLUETOOTH_A2DP_SOURCE_ROLE;
608 } else if (role == BLUETOOTH_A2DP_SINK_ROLE) {
609 DBG("Set audio sink role");
610 adapter->a2dp_role = BLUETOOTH_A2DP_SINK_ROLE;
613 store_adapter_info(adapter);
617 static void trigger_pairable_timeout(struct btd_adapter *adapter);
618 static void adapter_start(struct btd_adapter *adapter);
619 static void adapter_stop(struct btd_adapter *adapter);
620 static void trigger_passive_scanning(struct btd_adapter *adapter);
621 static bool set_mode(struct btd_adapter *adapter, uint16_t opcode,
623 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
624 static bool load_local_irk(struct btd_adapter *adapter);
625 static bool set_local_irk(struct btd_adapter *adapter);
626 static bool set_privacy(struct btd_adapter *adapter, bool privacy);
629 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
630 #ifdef TIZEN_FEATURE_BLUEZ_BATTERY_WATCH
631 static gboolean charging_state_timeout_cb(gpointer user_data)
633 struct btd_adapter *adapter = user_data;
634 int bredr_pkt_type = ACL_PTYPE_MASK;
636 adapter->charging_timeout = 0;
638 DBG("Set all connections to BR/EDR type");
639 g_slist_foreach(adapter->devices, device_change_pkt_type,
640 (gpointer)bredr_pkt_type);
645 static void set_charging_state(struct btd_adapter *adapter,
646 charging_state_e state)
648 int br_pkt_type = ACL_PTYPE_MASK |
649 HCI_2DH1 | HCI_2DH3 | HCI_2DH5 |
650 HCI_3DH1 | HCI_3DH3 | HCI_3DH5;
652 if (adapter->charging == state)
655 DBG("old charging state : %d, new charging_state : %d",
656 adapter->charging, state);
659 * Only none / wire charging <-> wireless charging state change should
662 if ((adapter->charging == NONE_CHARGING && state == WIRE_CHARGING) ||
663 (adapter->charging == WIRE_CHARGING && state == NONE_CHARGING)) {
664 DBG("Just update charging state");
665 adapter->charging = state;
669 if (adapter->charging_timeout) {
670 g_source_remove(adapter->charging_timeout);
671 adapter->charging_timeout = 0;
674 adapter->charging = state;
675 if (adapter->charging == NONE_CHARGING ||
676 adapter->charging == WIRE_CHARGING) {
677 DBG("Trigger timeout to set connection to BR/EDR type");
678 adapter->charging_timeout = g_timeout_add(2000,
679 charging_state_timeout_cb, adapter);
680 } else if (adapter->charging == WIRELESS_CHARGING) {
681 DBG("Set all connections to BR type");
682 g_slist_foreach(adapter->devices, device_change_pkt_type,
683 (gpointer)br_pkt_type);
689 static gboolean charging_state_changed(DBusConnection *connection,
690 DBusMessage *msg, void *user_data)
692 struct btd_adapter *adapter = user_data;
695 DBG("charging_state_changed");
697 if (!dbus_message_get_args(msg, NULL, DBUS_TYPE_INT32, &state,
701 set_charging_state(adapter, state);
706 charging_state_e get_charging_state(struct btd_adapter *adapter)
708 DBG("charging_state: %d", adapter->charging);
709 return adapter->charging;
711 #endif /* TIZEN_FEATURE_BLUEZ_BATTERY_WATCH */
713 static int compare_slot(gconstpointer a, gconstpointer b)
715 const struct adv_info *adv = a;
716 const int id = *(int*)b;
718 return (adv->slot_id == id ? 0 : -1);
721 static struct adv_info *find_advertiser(struct btd_adapter *adapter,
726 list = g_slist_find_custom(adapter->adv_list, &slot_id,
734 static void create_advertiser(struct btd_adapter *adapter,
737 struct adv_info *adv;
742 if (find_advertiser(adapter, slot_id) != NULL) {
743 error("Aleady existed [%d]", slot_id);
747 DBG("Create adv slot id : %d", slot_id);
749 adv = g_new0(struct adv_info, 1);
753 adv->slot_id = slot_id;
755 adapter->adv_list = g_slist_append(adapter->adv_list, adv);
760 static void advertising_state_changed(struct btd_adapter *adapter,
761 int slot_id, bool enabled)
763 struct adv_info *adv;
770 adv = find_advertiser(adapter, slot_id);
772 DBG("Unable to find advertiser [%d]", slot_id);
776 adv->status = enabled;
777 DBG("slot_id %d, status %d", adv->slot_id, adv->status);
779 g_dbus_emit_signal(dbus_conn, adapter->path,
780 ADAPTER_INTERFACE, "AdvertisingEnabled",
781 DBUS_TYPE_INT32, &id,
782 DBUS_TYPE_BOOLEAN, &state,
786 static void clear_advertiser_cb(gpointer data, gpointer user_data)
788 struct adv_info *adv = data;
789 struct btd_adapter *adapter = user_data;
792 advertising_state_changed(adapter, adv->slot_id, 0);
795 static void advertiser_cleanup(struct btd_adapter *adapter)
797 if (!adapter->adv_list)
800 g_slist_foreach(adapter->adv_list, clear_advertiser_cb, adapter);
801 g_slist_free(adapter->adv_list);
802 adapter->adv_list = NULL;
806 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
807 #define OCF_PAGE_SCAN_TIMEOUT 0x0018
808 #define OGF_PAGE_SCAN_TIMEOUT 0x03
811 uint16_t timeout; /* Value */
812 } __attribute__ ((packed)) hci_page_scan_timeout;
813 #define HCI_PAGE_SCAN_TIMEOUT_CP_SIZE 2
815 static gboolean send_sprd_page_scan_timeout(gint value)
818 hci_page_scan_timeout cp;
820 dd = hci_open_dev(0);
822 if (hci_send_cmd(dd, OGF_PAGE_SCAN_TIMEOUT, OCF_PAGE_SCAN_TIMEOUT,
823 HCI_PAGE_SCAN_TIMEOUT_CP_SIZE, &cp) < 0) {
824 DBG("Error: While setting Page Timeout value");
828 DBG("Page Scan Timeout Value Patch %d", value);
836 static void settings_changed(struct btd_adapter *adapter, uint32_t settings)
838 uint32_t changed_mask;
840 changed_mask = adapter->current_settings ^ settings;
842 adapter->current_settings = settings;
844 DBG("Changed settings: 0x%08x", changed_mask);
846 if (changed_mask & MGMT_SETTING_POWERED) {
847 g_dbus_emit_property_changed(dbus_conn, adapter->path,
848 ADAPTER_INTERFACE, "Powered");
850 if (adapter->current_settings & MGMT_SETTING_POWERED) {
851 adapter_start(adapter);
853 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
854 if (TIZEN_FEATURE_BLUEZ_SPRD_PAGE_SCAN) {
855 /* Approx 6.4 Seconds of timeout */
856 /* This Added because Z3 device was not able to connect with
857 * some device as it was getting Page Timeout
858 * (LG HBS800, sony carkit) etc. So, Increasing Page timeout value
859 * from 5.12 Sec (which is default) to ~6.4sec*/
860 DBG("Setting value");
861 send_sprd_page_scan_timeout(10240);
865 adapter_stop(adapter);
870 if (!adapter_remaining)
876 if (changed_mask & MGMT_SETTING_LE) {
877 if ((adapter->current_settings & MGMT_SETTING_POWERED) &&
878 (adapter->current_settings & MGMT_SETTING_LE))
879 trigger_passive_scanning(adapter);
882 if (changed_mask & MGMT_SETTING_CONNECTABLE)
883 g_dbus_emit_property_changed(dbus_conn, adapter->path,
884 ADAPTER_INTERFACE, "Connectable");
886 if (changed_mask & MGMT_SETTING_DISCOVERABLE) {
887 g_dbus_emit_property_changed(dbus_conn, adapter->path,
888 ADAPTER_INTERFACE, "Discoverable");
889 store_adapter_info(adapter);
892 if (changed_mask & MGMT_SETTING_BONDABLE) {
893 g_dbus_emit_property_changed(dbus_conn, adapter->path,
894 ADAPTER_INTERFACE, "Pairable");
896 trigger_pairable_timeout(adapter);
899 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
900 if (changed_mask & MGMT_SETTING_ADVERTISING) {
901 if ((adapter->current_settings & MGMT_SETTING_ADVERTISING) &&
902 (adapter->advertising)) {
906 adapter->advertising = adapter->current_settings & MGMT_SETTING_ADVERTISING;
907 advertising_state_changed(adapter, 0, adapter->advertising);
910 if ((changed_mask & MGMT_SETTING_PRIVACY) &&
911 !(adapter->current_settings & MGMT_SETTING_PRIVACY)) {
912 DBG("LE Privacy feature is disabled");
915 * Some Android devices don't consider the device as LE one,
916 * if the device doesn't distribute IRK when pairing.
917 * Because of this compatibility issue, set IRK
918 * even though privacy feature is disabled.
920 set_local_irk(adapter);
925 static void new_settings_callback(uint16_t index, uint16_t length,
926 const void *param, void *user_data)
928 struct btd_adapter *adapter = user_data;
931 if (length < sizeof(settings)) {
932 btd_error(adapter->dev_id,
933 "Wrong size of new settings parameters");
937 settings = get_le32(param);
939 if (settings == adapter->current_settings)
942 DBG("Settings: 0x%08x", settings);
944 settings_changed(adapter, settings);
947 static void set_mode_complete(uint8_t status, uint16_t length,
948 const void *param, void *user_data)
950 struct btd_adapter *adapter = user_data;
952 if (status != MGMT_STATUS_SUCCESS) {
953 btd_error(adapter->dev_id, "Failed to set mode: %s (0x%02x)",
954 mgmt_errstr(status), status);
959 * The parameters are identical and also the task that is
960 * required in both cases. So it is safe to just call the
961 * event handling functions here.
963 new_settings_callback(adapter->dev_id, length, param, adapter);
966 static bool set_mode(struct btd_adapter *adapter, uint16_t opcode,
971 memset(&cp, 0, sizeof(cp));
974 DBG("sending set mode command for index %u", adapter->dev_id);
976 if (mgmt_send(adapter->mgmt, opcode,
977 adapter->dev_id, sizeof(cp), &cp,
978 set_mode_complete, adapter, NULL) > 0)
981 btd_error(adapter->dev_id, "Failed to set mode for index %u",
987 static bool set_discoverable(struct btd_adapter *adapter, uint8_t mode,
990 struct mgmt_cp_set_discoverable cp;
992 memset(&cp, 0, sizeof(cp));
994 cp.timeout = htobs(timeout);
996 DBG("sending set mode command for index %u", adapter->dev_id);
998 if (kernel_conn_control) {
1000 set_mode(adapter, MGMT_OP_SET_CONNECTABLE, mode);
1002 /* This also disables discoverable so we're done */
1003 return set_mode(adapter, MGMT_OP_SET_CONNECTABLE,
1007 if (mgmt_send(adapter->mgmt, MGMT_OP_SET_DISCOVERABLE,
1008 adapter->dev_id, sizeof(cp), &cp,
1009 set_mode_complete, adapter, NULL) > 0)
1012 btd_error(adapter->dev_id, "Failed to set mode for index %u",
1018 static gboolean pairable_timeout_handler(gpointer user_data)
1020 struct btd_adapter *adapter = user_data;
1022 adapter->pairable_timeout_id = 0;
1024 set_mode(adapter, MGMT_OP_SET_BONDABLE, 0x00);
1029 static void trigger_pairable_timeout(struct btd_adapter *adapter)
1031 if (adapter->pairable_timeout_id > 0) {
1032 g_source_remove(adapter->pairable_timeout_id);
1033 adapter->pairable_timeout_id = 0;
1036 if (!(adapter->current_settings & MGMT_SETTING_BONDABLE))
1039 if (adapter->pairable_timeout > 0)
1040 adapter->pairable_timeout_id =
1041 g_timeout_add_seconds(adapter->pairable_timeout,
1042 pairable_timeout_handler, adapter);
1045 static void local_name_changed_callback(uint16_t index, uint16_t length,
1046 const void *param, void *user_data)
1048 struct btd_adapter *adapter = user_data;
1049 const struct mgmt_cp_set_local_name *rp = param;
1051 if (length < sizeof(*rp)) {
1052 btd_error(adapter->dev_id,
1053 "Wrong size of local name changed parameters");
1057 if (!g_strcmp0(adapter->short_name, (const char *) rp->short_name) &&
1058 !g_strcmp0(adapter->name, (const char *) rp->name))
1061 DBG("Name: %s", rp->name);
1062 DBG("Short name: %s", rp->short_name);
1064 g_free(adapter->name);
1065 adapter->name = g_strdup((const char *) rp->name);
1067 g_free(adapter->short_name);
1068 adapter->short_name = g_strdup((const char *) rp->short_name);
1071 * Changing the name (even manually via HCI) will update the
1072 * current alias property.
1074 * In case the name is empty, use the short name.
1076 * There is a difference between the stored alias (which is
1077 * configured by the user) and the current alias. The current
1078 * alias is temporary for the lifetime of the daemon.
1080 if (adapter->name && adapter->name[0] != '\0') {
1081 g_free(adapter->current_alias);
1082 adapter->current_alias = g_strdup(adapter->name);
1084 g_free(adapter->current_alias);
1085 adapter->current_alias = g_strdup(adapter->short_name);
1088 DBG("Current alias: %s", adapter->current_alias);
1090 if (!adapter->current_alias)
1093 g_dbus_emit_property_changed(dbus_conn, adapter->path,
1094 ADAPTER_INTERFACE, "Alias");
1096 attrib_gap_set(adapter, GATT_CHARAC_DEVICE_NAME,
1097 (const uint8_t *) adapter->current_alias,
1098 strlen(adapter->current_alias));
1101 static void set_local_name_complete(uint8_t status, uint16_t length,
1102 const void *param, void *user_data)
1104 struct btd_adapter *adapter = user_data;
1106 if (status != MGMT_STATUS_SUCCESS) {
1107 btd_error(adapter->dev_id,
1108 "Failed to set local name: %s (0x%02x)",
1109 mgmt_errstr(status), status);
1114 * The parameters are identical and also the task that is
1115 * required in both cases. So it is safe to just call the
1116 * event handling functions here.
1118 local_name_changed_callback(adapter->dev_id, length, param, adapter);
1121 static int set_name(struct btd_adapter *adapter, const char *name)
1123 struct mgmt_cp_set_local_name cp;
1124 char maxname[MAX_NAME_LENGTH + 1];
1126 memset(maxname, 0, sizeof(maxname));
1127 strncpy(maxname, name, MAX_NAME_LENGTH);
1129 if (!g_utf8_validate(maxname, -1, NULL)) {
1130 btd_error(adapter->dev_id,
1131 "Name change failed: supplied name isn't valid UTF-8");
1135 memset(&cp, 0, sizeof(cp));
1136 strncpy((char *) cp.name, maxname, sizeof(cp.name) - 1);
1138 DBG("sending set local name command for index %u", adapter->dev_id);
1140 if (mgmt_send(adapter->mgmt, MGMT_OP_SET_LOCAL_NAME,
1141 adapter->dev_id, sizeof(cp), &cp,
1142 set_local_name_complete, adapter, NULL) > 0)
1145 btd_error(adapter->dev_id, "Failed to set local name for index %u",
1151 int adapter_set_name(struct btd_adapter *adapter, const char *name)
1153 if (g_strcmp0(adapter->system_name, name) == 0)
1156 DBG("name: %s", name);
1158 g_free(adapter->system_name);
1159 adapter->system_name = g_strdup(name);
1161 g_dbus_emit_property_changed(dbus_conn, adapter->path,
1162 ADAPTER_INTERFACE, "Name");
1164 /* alias is preferred over system name */
1165 if (adapter->stored_alias)
1168 DBG("alias: %s", name);
1170 g_dbus_emit_property_changed(dbus_conn, adapter->path,
1171 ADAPTER_INTERFACE, "Alias");
1173 return set_name(adapter, name);
1176 struct btd_device *btd_adapter_find_device(struct btd_adapter *adapter,
1177 const bdaddr_t *dst,
1178 uint8_t bdaddr_type)
1180 struct device_addr_type addr;
1181 struct btd_device *device;
1187 bacpy(&addr.bdaddr, dst);
1188 addr.bdaddr_type = bdaddr_type;
1190 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
1191 list = g_slist_find_custom(adapter->devices, &addr,
1192 device_addr_type_strict_cmp);
1194 device = list->data;
1198 list = g_slist_find_custom(adapter->devices, &addr,
1199 device_addr_type_cmp);
1203 device = list->data;
1206 * If we're looking up based on public address and the address
1207 * was not previously used over this bearer we may need to
1208 * update LE or BR/EDR support information.
1210 if (bdaddr_type == BDADDR_BREDR)
1211 device_set_bredr_support(device);
1213 device_set_le_support(device, bdaddr_type);
1218 static void uuid_to_uuid128(uuid_t *uuid128, const uuid_t *uuid)
1220 if (uuid->type == SDP_UUID16)
1221 sdp_uuid16_to_uuid128(uuid128, uuid);
1222 else if (uuid->type == SDP_UUID32)
1223 sdp_uuid32_to_uuid128(uuid128, uuid);
1225 memcpy(uuid128, uuid, sizeof(*uuid));
1228 static bool is_supported_uuid(const uuid_t *uuid)
1232 /* mgmt versions from 1.3 onwards support all types of UUIDs */
1233 if (MGMT_VERSION(mgmt_version, mgmt_revision) >= MGMT_VERSION(1, 3))
1236 uuid_to_uuid128(&tmp, uuid);
1238 if (!sdp_uuid128_to_uuid(&tmp))
1241 if (tmp.type != SDP_UUID16)
1247 static void add_uuid_complete(uint8_t status, uint16_t length,
1248 const void *param, void *user_data)
1250 struct btd_adapter *adapter = user_data;
1252 if (status != MGMT_STATUS_SUCCESS) {
1253 btd_error(adapter->dev_id, "Failed to add UUID: %s (0x%02x)",
1254 mgmt_errstr(status), status);
1259 * The parameters are identical and also the task that is
1260 * required in both cases. So it is safe to just call the
1261 * event handling functions here.
1263 dev_class_changed_callback(adapter->dev_id, length, param, adapter);
1265 if (adapter->initialized)
1266 g_dbus_emit_property_changed(dbus_conn, adapter->path,
1267 ADAPTER_INTERFACE, "UUIDs");
1270 static int add_uuid(struct btd_adapter *adapter, uuid_t *uuid, uint8_t svc_hint)
1272 struct mgmt_cp_add_uuid cp;
1276 if (!is_supported_uuid(uuid)) {
1277 btd_warn(adapter->dev_id,
1278 "Ignoring unsupported UUID for addition");
1282 uuid_to_uuid128(&uuid128, uuid);
1284 ntoh128((uint128_t *) uuid128.value.uuid128.data, &uint128);
1285 htob128(&uint128, (uint128_t *) cp.uuid);
1286 cp.svc_hint = svc_hint;
1288 DBG("sending add uuid command for index %u", adapter->dev_id);
1290 if (mgmt_send(adapter->mgmt, MGMT_OP_ADD_UUID,
1291 adapter->dev_id, sizeof(cp), &cp,
1292 add_uuid_complete, adapter, NULL) > 0)
1295 btd_error(adapter->dev_id, "Failed to add UUID for index %u",
1301 static void remove_uuid_complete(uint8_t status, uint16_t length,
1302 const void *param, void *user_data)
1304 struct btd_adapter *adapter = user_data;
1306 if (status != MGMT_STATUS_SUCCESS) {
1307 btd_error(adapter->dev_id, "Failed to remove UUID: %s (0x%02x)",
1308 mgmt_errstr(status), status);
1313 * The parameters are identical and also the task that is
1314 * required in both cases. So it is safe to just call the
1315 * event handling functions here.
1317 dev_class_changed_callback(adapter->dev_id, length, param, adapter);
1319 if (adapter->initialized)
1320 g_dbus_emit_property_changed(dbus_conn, adapter->path,
1321 ADAPTER_INTERFACE, "UUIDs");
1324 static int remove_uuid(struct btd_adapter *adapter, uuid_t *uuid)
1326 struct mgmt_cp_remove_uuid cp;
1330 if (!is_supported_uuid(uuid)) {
1331 btd_warn(adapter->dev_id,
1332 "Ignoring unsupported UUID for removal");
1336 uuid_to_uuid128(&uuid128, uuid);
1338 ntoh128((uint128_t *) uuid128.value.uuid128.data, &uint128);
1339 htob128(&uint128, (uint128_t *) cp.uuid);
1341 DBG("sending remove uuid command for index %u", adapter->dev_id);
1343 if (mgmt_send(adapter->mgmt, MGMT_OP_REMOVE_UUID,
1344 adapter->dev_id, sizeof(cp), &cp,
1345 remove_uuid_complete, adapter, NULL) > 0)
1348 btd_error(adapter->dev_id, "Failed to remove UUID for index %u",
1354 static void clear_uuids_complete(uint8_t status, uint16_t length,
1355 const void *param, void *user_data)
1357 struct btd_adapter *adapter = user_data;
1359 if (status != MGMT_STATUS_SUCCESS) {
1360 btd_error(adapter->dev_id, "Failed to clear UUIDs: %s (0x%02x)",
1361 mgmt_errstr(status), status);
1366 * The parameters are identical and also the task that is
1367 * required in both cases. So it is safe to just call the
1368 * event handling functions here.
1370 dev_class_changed_callback(adapter->dev_id, length, param, adapter);
1373 static int clear_uuids(struct btd_adapter *adapter)
1375 struct mgmt_cp_remove_uuid cp;
1377 memset(&cp, 0, sizeof(cp));
1379 DBG("sending clear uuids command for index %u", adapter->dev_id);
1381 if (mgmt_send(adapter->mgmt, MGMT_OP_REMOVE_UUID,
1382 adapter->dev_id, sizeof(cp), &cp,
1383 clear_uuids_complete, adapter, NULL) > 0)
1386 btd_error(adapter->dev_id, "Failed to clear UUIDs for index %u",
1392 static uint8_t get_uuid_mask(uuid_t *uuid)
1394 if (uuid->type != SDP_UUID16)
1397 switch (uuid->value.uuid16) {
1398 case DIALUP_NET_SVCLASS_ID:
1399 case CIP_SVCLASS_ID:
1400 return 0x42; /* Telephony & Networking */
1401 case IRMC_SYNC_SVCLASS_ID:
1402 case OBEX_OBJPUSH_SVCLASS_ID:
1403 case OBEX_FILETRANS_SVCLASS_ID:
1404 case IRMC_SYNC_CMD_SVCLASS_ID:
1405 case PBAP_PSE_SVCLASS_ID:
1406 return 0x10; /* Object Transfer */
1407 case HEADSET_SVCLASS_ID:
1408 case HANDSFREE_SVCLASS_ID:
1409 return 0x20; /* Audio */
1410 case CORDLESS_TELEPHONY_SVCLASS_ID:
1411 case INTERCOM_SVCLASS_ID:
1412 case FAX_SVCLASS_ID:
1413 case SAP_SVCLASS_ID:
1415 * Setting the telephony bit for the handsfree audio gateway
1416 * role is not required by the HFP specification, but the
1417 * Nokia 616 carkit is just plain broken! It will refuse
1418 * pairing without this bit set.
1420 case HANDSFREE_AGW_SVCLASS_ID:
1421 return 0x40; /* Telephony */
1422 case AUDIO_SOURCE_SVCLASS_ID:
1423 case VIDEO_SOURCE_SVCLASS_ID:
1424 return 0x08; /* Capturing */
1425 case AUDIO_SINK_SVCLASS_ID:
1426 case VIDEO_SINK_SVCLASS_ID:
1427 return 0x04; /* Rendering */
1428 case PANU_SVCLASS_ID:
1429 case NAP_SVCLASS_ID:
1431 return 0x02; /* Networking */
1437 static int uuid_cmp(const void *a, const void *b)
1439 const sdp_record_t *rec = a;
1440 const uuid_t *uuid = b;
1442 return sdp_uuid_cmp(&rec->svclass, uuid);
1445 static void adapter_service_insert(struct btd_adapter *adapter, sdp_record_t *rec)
1447 sdp_list_t *browse_list = NULL;
1451 DBG("%s", adapter->path);
1453 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
1455 DBG("record is NULL return");
1460 /* skip record without a browse group */
1461 if (sdp_get_browse_groups(rec, &browse_list) < 0) {
1462 DBG("skipping record without browse group");
1466 sdp_uuid16_create(&browse_uuid, PUBLIC_BROWSE_GROUP);
1468 /* skip record without public browse group */
1469 if (!sdp_list_find(browse_list, &browse_uuid, sdp_uuid_cmp))
1472 if (sdp_list_find(adapter->services, &rec->svclass, uuid_cmp) == NULL)
1477 adapter->services = sdp_list_insert_sorted(adapter->services, rec,
1481 uint8_t svc_hint = get_uuid_mask(&rec->svclass);
1482 add_uuid(adapter, &rec->svclass, svc_hint);
1486 sdp_list_free(browse_list, free);
1489 int adapter_service_add(struct btd_adapter *adapter, sdp_record_t *rec)
1493 DBG("%s", adapter->path);
1495 ret = add_record_to_server(&adapter->bdaddr, rec);
1499 adapter_service_insert(adapter, rec);
1504 void adapter_service_remove(struct btd_adapter *adapter, uint32_t handle)
1506 sdp_record_t *rec = sdp_record_find(handle);
1508 DBG("%s", adapter->path);
1513 adapter->services = sdp_list_remove(adapter->services, rec);
1515 if (sdp_list_find(adapter->services, &rec->svclass, uuid_cmp) == NULL)
1516 remove_uuid(adapter, &rec->svclass);
1518 remove_record_from_server(rec->handle);
1521 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
1522 static void adapter_print_devices(struct btd_adapter *adapter)
1526 dev = adapter->devices;
1527 for (; dev; dev = dev->next)
1528 device_print_addr(dev->data);
1532 static struct btd_device *adapter_create_device(struct btd_adapter *adapter,
1533 const bdaddr_t *bdaddr,
1534 uint8_t bdaddr_type)
1536 struct btd_device *device;
1538 device = device_create(adapter, bdaddr, bdaddr_type);
1542 adapter->devices = g_slist_append(adapter->devices, device);
1544 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
1545 adapter_print_devices(adapter);
1551 static void service_auth_cancel(struct service_auth *auth)
1555 if (auth->svc_id > 0)
1556 device_remove_svc_complete_callback(auth->device,
1559 dbus_error_init(&derr);
1560 dbus_set_error_const(&derr, ERROR_INTERFACE ".Canceled", NULL);
1562 auth->cb(&derr, auth->user_data);
1564 dbus_error_free(&derr);
1566 if (auth->agent != NULL) {
1567 agent_cancel(auth->agent);
1568 agent_unref(auth->agent);
1574 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
1575 void btd_adapter_unpair_device(struct btd_adapter *adapter,
1576 struct btd_device *dev)
1581 adapter->connect_list = g_slist_remove(adapter->connect_list, dev);
1583 // adapter->devices = g_slist_remove(adapter->devices, dev);
1585 // adapter->discovery_found = g_slist_remove(adapter->discovery_found,
1588 adapter->connections = g_slist_remove(adapter->connections, dev);
1590 if (adapter->connect_le == dev)
1591 adapter->connect_le = NULL;
1593 l = adapter->auths->head;
1595 struct service_auth *auth = l->data;
1596 GList *next = g_list_next(l);
1598 if (auth->device != dev) {
1603 g_queue_delete_link(adapter->auths, l);
1606 service_auth_cancel(auth);
1609 device_unpair(dev, TRUE);
1614 void btd_adapter_remove_device(struct btd_adapter *adapter,
1615 struct btd_device *dev)
1619 adapter->connect_list = g_slist_remove(adapter->connect_list, dev);
1621 adapter->devices = g_slist_remove(adapter->devices, dev);
1623 adapter->discovery_found = g_slist_remove(adapter->discovery_found,
1626 adapter->connections = g_slist_remove(adapter->connections, dev);
1628 if (adapter->connect_le == dev)
1629 adapter->connect_le = NULL;
1631 l = adapter->auths->head;
1633 struct service_auth *auth = l->data;
1634 GList *next = g_list_next(l);
1636 if (auth->device != dev) {
1641 g_queue_delete_link(adapter->auths, l);
1644 service_auth_cancel(auth);
1647 device_remove(dev, TRUE);
1650 struct btd_device *btd_adapter_get_device(struct btd_adapter *adapter,
1651 const bdaddr_t *addr,
1654 struct btd_device *device;
1659 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
1660 if (!bacmp(addr, BDADDR_ANY))
1664 device = btd_adapter_find_device(adapter, addr, addr_type);
1668 return adapter_create_device(adapter, addr, addr_type);
1671 sdp_list_t *btd_adapter_get_services(struct btd_adapter *adapter)
1673 return adapter->services;
1676 static void passive_scanning_complete(uint8_t status, uint16_t length,
1677 const void *param, void *user_data)
1679 struct btd_adapter *adapter = user_data;
1680 const struct mgmt_cp_start_discovery *rp = param;
1682 DBG("status 0x%02x", status);
1684 if (length < sizeof(*rp)) {
1685 btd_error(adapter->dev_id,
1686 "Wrong size of start scanning return parameters");
1690 if (status == MGMT_STATUS_SUCCESS) {
1691 adapter->discovery_type = rp->type;
1692 adapter->discovery_enable = 0x01;
1696 static gboolean passive_scanning_timeout(gpointer user_data)
1698 struct btd_adapter *adapter = user_data;
1699 struct mgmt_cp_start_discovery cp;
1701 adapter->passive_scan_timeout = 0;
1703 cp.type = SCAN_TYPE_LE;
1704 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
1705 mgmt_send(adapter->mgmt, MGMT_OP_START_LE_DISCOVERY,
1706 adapter->dev_id, sizeof(cp), &cp,
1707 passive_scanning_complete, adapter, NULL);
1709 mgmt_send(adapter->mgmt, MGMT_OP_START_DISCOVERY,
1710 adapter->dev_id, sizeof(cp), &cp,
1711 passive_scanning_complete, adapter, NULL);
1716 static void trigger_passive_scanning(struct btd_adapter *adapter)
1718 if (!(adapter->current_settings & MGMT_SETTING_LE))
1723 if (adapter->passive_scan_timeout > 0) {
1724 g_source_remove(adapter->passive_scan_timeout);
1725 adapter->passive_scan_timeout = 0;
1729 * When the kernel background scanning is available, there is
1730 * no need to start any discovery. The kernel will keep scanning
1731 * as long as devices are in its auto-connection list.
1733 if (kernel_conn_control)
1737 * If any client is running a discovery right now, then do not
1738 * even try to start passive scanning.
1740 * The discovery procedure is using interleaved scanning and
1741 * thus will discover Low Energy devices as well.
1743 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
1744 if (adapter->discovery_list || adapter->le_discovery_list)
1747 if (adapter->discovery_list)
1751 if (adapter->discovery_enable == 0x01)
1755 * In case the discovery is suspended (for example for an ongoing
1756 * pairing attempt), then also do not start passive scanning.
1758 if (adapter->discovery_suspended)
1762 * If the list of connectable Low Energy devices is empty,
1763 * then do not start passive scanning.
1765 if (!adapter->connect_list)
1768 adapter->passive_scan_timeout = g_timeout_add_seconds(CONN_SCAN_TIMEOUT,
1769 passive_scanning_timeout, adapter);
1772 static void stop_passive_scanning_complete(uint8_t status, uint16_t length,
1773 const void *param, void *user_data)
1775 struct btd_adapter *adapter = user_data;
1776 struct btd_device *dev;
1779 DBG("status 0x%02x (%s)", status, mgmt_errstr(status));
1781 dev = adapter->connect_le;
1782 adapter->connect_le = NULL;
1785 * When the kernel background scanning is available, there is
1786 * no need to stop any discovery. The kernel will handle the
1787 * auto-connection by itself.
1789 if (kernel_conn_control)
1793 * MGMT_STATUS_REJECTED may be returned from kernel because the passive
1794 * scan timer had expired in kernel and passive scan was disabled just
1795 * around the time we called stop_passive_scanning().
1797 if (status != MGMT_STATUS_SUCCESS && status != MGMT_STATUS_REJECTED) {
1798 btd_error(adapter->dev_id, "Stopping passive scanning failed: %s",
1799 mgmt_errstr(status));
1803 adapter->discovery_type = 0x00;
1804 adapter->discovery_enable = 0x00;
1807 DBG("Device removed while stopping passive scanning");
1808 trigger_passive_scanning(adapter);
1812 err = device_connect_le(dev);
1814 btd_error(adapter->dev_id, "LE auto connection failed: %s (%d)",
1815 strerror(-err), -err);
1816 trigger_passive_scanning(adapter);
1820 static void stop_passive_scanning(struct btd_adapter *adapter)
1822 struct mgmt_cp_stop_discovery cp;
1823 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
1824 struct mgmt_cp_stop_discovery le_cp;
1829 /* If there are any normal discovery clients passive scanning
1830 * wont be running */
1831 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
1832 if (adapter->discovery_list || adapter->le_discovery_list)
1835 if (adapter->discovery_list)
1839 if (adapter->discovery_enable == 0x00)
1842 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
1843 if ((adapter->discovery_type & 0x01) > 0) {
1845 mgmt_send(adapter->mgmt, MGMT_OP_STOP_DISCOVERY,
1846 adapter->dev_id, sizeof(cp), &cp,
1847 stop_passive_scanning_complete, adapter, NULL);
1849 if ((adapter->discovery_type & 0x06) > 0) {
1851 mgmt_send(adapter->mgmt, MGMT_OP_STOP_LE_DISCOVERY,
1852 adapter->dev_id, sizeof(le_cp), &le_cp,
1853 stop_passive_scanning_complete, adapter, NULL);
1856 cp.type = adapter->discovery_type;
1858 mgmt_send(adapter->mgmt, MGMT_OP_STOP_DISCOVERY,
1859 adapter->dev_id, sizeof(cp), &cp,
1860 stop_passive_scanning_complete, adapter, NULL);
1864 static void cancel_passive_scanning(struct btd_adapter *adapter)
1866 if (!(adapter->current_settings & MGMT_SETTING_LE))
1871 if (adapter->passive_scan_timeout > 0) {
1872 g_source_remove(adapter->passive_scan_timeout);
1873 adapter->passive_scan_timeout = 0;
1877 static uint8_t get_scan_type(struct btd_adapter *adapter)
1881 if (adapter->current_settings & MGMT_SETTING_BREDR)
1882 type = SCAN_TYPE_BREDR;
1886 if (adapter->current_settings & MGMT_SETTING_LE)
1887 type |= SCAN_TYPE_LE;
1892 static void free_discovery_filter(struct discovery_filter *discovery_filter)
1894 if (!discovery_filter)
1897 g_slist_free_full(discovery_filter->uuids, g_free);
1898 g_free(discovery_filter);
1901 static void trigger_start_discovery(struct btd_adapter *adapter, guint delay);
1903 static void start_discovery_complete(uint8_t status, uint16_t length,
1904 const void *param, void *user_data)
1906 struct btd_adapter *adapter = user_data;
1907 struct watch_client *client;
1908 const struct mgmt_cp_start_discovery *rp = param;
1911 DBG("status 0x%02x", status);
1913 /* Is there are no clients the discovery must have been stopped while
1914 * discovery command was pending.
1916 if (!adapter->discovery_list) {
1917 struct mgmt_cp_stop_discovery cp;
1919 if (status != MGMT_STATUS_SUCCESS)
1922 /* Stop discovering as there are no clients left */
1924 mgmt_send(adapter->mgmt, MGMT_OP_STOP_DISCOVERY,
1925 adapter->dev_id, sizeof(cp), &cp,
1930 client = adapter->discovery_list->data;
1932 if (length < sizeof(*rp)) {
1933 btd_error(adapter->dev_id,
1934 "Wrong size of start discovery return parameters");
1940 if (status == MGMT_STATUS_SUCCESS) {
1941 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
1942 DBG("Return param discovery type 0x%02x", rp->type);
1943 adapter->discovery_type |= rp->type;
1945 adapter->discovery_type = rp->type;
1947 adapter->discovery_enable = 0x01;
1949 if (adapter->current_discovery_filter)
1950 adapter->filtered_discovery = true;
1952 adapter->filtered_discovery = false;
1955 reply = g_dbus_create_reply(client->msg,
1957 g_dbus_send_message(dbus_conn, reply);
1958 dbus_message_unref(client->msg);
1962 if (adapter->discovering)
1965 adapter->discovering = true;
1966 g_dbus_emit_property_changed(dbus_conn, adapter->path,
1967 ADAPTER_INTERFACE, "Discovering");
1969 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
1971 adapter->discovering = false;
1972 g_dbus_emit_property_changed(dbus_conn, adapter->path,
1973 ADAPTER_INTERFACE, "Discovering");
1978 /* Reply with an error if the first discovery has failed */
1980 reply = btd_error_busy(client->msg);
1981 g_dbus_send_message(dbus_conn, reply);
1982 g_dbus_remove_watch(dbus_conn, client->watch);
1987 * In case the restart of the discovery failed, then just trigger
1988 * it for the next idle timeout again.
1990 #ifndef TIZEN_FEATURE_BLUEZ_MODIFY
1991 trigger_start_discovery(adapter, IDLE_DISCOV_TIMEOUT * 2);
1995 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
1996 static void start_le_discovery_complete(uint8_t status, uint16_t length,
1997 const void *param, void *user_data)
1999 struct btd_adapter *adapter = user_data;
2000 const struct mgmt_cp_start_discovery *rp = param;
2003 error("Error ocurred in LEDiscovering, rp is NULL");
2007 DBG("status 0x%02x", status);
2008 if (length < sizeof(*rp)) {
2009 error("Wrong size of start discovery return parameters");
2013 DBG("Discovery Type 0x%02x", rp->type);
2014 if (status == MGMT_STATUS_SUCCESS) {
2015 adapter->discovery_type |= rp->type;
2016 adapter->discovery_enable = 0x01;
2018 if (adapter->le_discovering)
2021 adapter->le_discovering = true;
2022 g_dbus_emit_property_changed(dbus_conn, adapter->path,
2023 ADAPTER_INTERFACE, "LEDiscovering");
2027 adapter->le_discovering = false;
2028 g_dbus_emit_property_changed(dbus_conn, adapter->path,
2029 ADAPTER_INTERFACE, "LEDiscovering");
2035 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
2036 static gboolean start_le_discovery_timeout(gpointer user_data)
2038 struct btd_adapter *adapter = user_data;
2043 adapter->le_discovery_idle_timeout = 0;
2045 new_type = SCAN_TYPE_LE;
2047 if (adapter->discovery_enable == 0x01) {
2049 * If there is an already running discovery and it has the
2050 * same type, then just keep it.
2053 if ((adapter->discovery_type & new_type) == SCAN_TYPE_LE) {
2054 if (adapter->le_discovering)
2057 adapter->le_discovering = true;
2058 g_dbus_emit_property_changed(dbus_conn, adapter->path,
2059 ADAPTER_INTERFACE, "LEDiscovering");
2065 struct mgmt_cp_start_discovery cp;
2068 mgmt_send(adapter->mgmt, MGMT_OP_START_LE_DISCOVERY,
2069 adapter->dev_id, sizeof(cp), &cp,
2070 start_le_discovery_complete, adapter, NULL);
2076 static gboolean start_discovery_timeout(gpointer user_data)
2078 struct btd_adapter *adapter = user_data;
2079 #ifndef TIZEN_FEATURE_BLUEZ_MODIFY
2080 struct mgmt_cp_start_service_discovery *sd_cp;
2086 adapter->discovery_idle_timeout = 0;
2088 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
2089 new_type = SCAN_TYPE_BREDR;
2091 if (adapter->discovery_enable == 0x01) {
2093 * If there is an already running discovery and it has the
2094 * same type, then just keep it.
2096 if ((adapter->discovery_type & new_type) == SCAN_TYPE_BREDR) {
2097 if (adapter->discovering)
2100 adapter->discovering = true;
2101 g_dbus_emit_property_changed(dbus_conn, adapter->path,
2102 ADAPTER_INTERFACE, "Discovering");
2108 struct mgmt_cp_start_discovery cp;
2110 mgmt_send(adapter->mgmt, MGMT_OP_START_DISCOVERY,
2111 adapter->dev_id, sizeof(cp), &cp,
2112 start_discovery_complete, adapter, NULL);
2115 /* If we're doing filtered discovery, it must be quickly restarted */
2116 adapter->no_scan_restart_delay = !!adapter->current_discovery_filter;
2118 DBG("adapter->current_discovery_filter == %d",
2119 !!adapter->current_discovery_filter);
2121 new_type = get_scan_type(adapter);
2123 if (adapter->discovery_enable == 0x01) {
2124 struct mgmt_cp_stop_discovery cp;
2127 * If we're asked to start regular discovery, and there is an
2128 * already running regular discovery and it has the same type,
2129 * then just keep it.
2131 if (!adapter->current_discovery_filter &&
2132 !adapter->filtered_discovery &&
2133 adapter->discovery_type == new_type) {
2134 if (adapter->discovering)
2137 adapter->discovering = true;
2138 g_dbus_emit_property_changed(dbus_conn, adapter->path,
2139 ADAPTER_INTERFACE, "Discovering");
2144 * Otherwise the current discovery must be stopped. So
2145 * queue up a stop discovery command.
2147 * This can happen if a passive scanning for Low Energy
2148 * devices is ongoing, or scan type is changed between
2149 * regular and filtered, or filter was updated.
2151 cp.type = adapter->discovery_type;
2152 mgmt_send(adapter->mgmt, MGMT_OP_STOP_DISCOVERY,
2153 adapter->dev_id, sizeof(cp), &cp,
2156 /* Don't even bother to try to quickly start discovery
2157 * just after stopping it, it would fail with status
2158 * MGMT_BUSY. Instead discovering_callback will take
2165 /* Regular discovery is required */
2166 if (!adapter->current_discovery_filter) {
2167 struct mgmt_cp_start_discovery cp;
2170 mgmt_send(adapter->mgmt, MGMT_OP_START_DISCOVERY,
2171 adapter->dev_id, sizeof(cp), &cp,
2172 start_discovery_complete, adapter, NULL);
2176 /* Filtered discovery is required */
2177 sd_cp = adapter->current_discovery_filter;
2179 DBG("sending MGMT_OP_START_SERVICE_DISCOVERY %d, %d, %d",
2180 sd_cp->rssi, sd_cp->type, sd_cp->uuid_count);
2182 mgmt_send(adapter->mgmt, MGMT_OP_START_SERVICE_DISCOVERY,
2183 adapter->dev_id, sizeof(*sd_cp) + sd_cp->uuid_count * 16,
2184 sd_cp, start_discovery_complete, adapter, NULL);
2191 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
2192 static void trigger_start_le_discovery(struct btd_adapter *adapter, guint delay)
2197 cancel_passive_scanning(adapter);
2199 if (adapter->le_discovery_idle_timeout > 0) {
2200 g_source_remove(adapter->le_discovery_idle_timeout);
2201 adapter->le_discovery_idle_timeout = 0;
2205 * If the controller got powered down in between, then ensure
2206 * that we do not keep trying to restart discovery.
2208 * This is safe-guard and should actually never trigger.
2210 if (!(adapter->current_settings & MGMT_SETTING_POWERED))
2213 adapter->le_discovery_idle_timeout = g_timeout_add_seconds(delay,
2214 start_le_discovery_timeout, adapter);
2218 static void trigger_start_discovery(struct btd_adapter *adapter, guint delay)
2223 cancel_passive_scanning(adapter);
2225 if (adapter->discovery_idle_timeout > 0) {
2226 g_source_remove(adapter->discovery_idle_timeout);
2227 adapter->discovery_idle_timeout = 0;
2231 * If the controller got powered down in between, then ensure
2232 * that we do not keep trying to restart discovery.
2234 * This is safe-guard and should actually never trigger.
2236 if (!(adapter->current_settings & MGMT_SETTING_POWERED))
2239 adapter->discovery_idle_timeout = g_timeout_add_seconds(delay,
2240 start_discovery_timeout, adapter);
2243 #ifndef TIZEN_FEATURE_BLUEZ_MODIFY
2244 static void suspend_discovery_complete(uint8_t status, uint16_t length,
2245 const void *param, void *user_data)
2247 struct btd_adapter *adapter = user_data;
2249 DBG("status 0x%02x", status);
2251 if (status == MGMT_STATUS_SUCCESS) {
2252 adapter->discovery_type = 0x00;
2253 adapter->discovery_enable = 0x00;
2258 static void suspend_discovery(struct btd_adapter *adapter)
2260 struct mgmt_cp_stop_discovery cp;
2264 adapter->discovery_suspended = true;
2267 * If there are no clients discovering right now, then there is
2268 * also nothing to suspend.
2270 if (!adapter->discovery_list)
2274 * In case of being inside the idle phase, make sure to remove
2275 * the timeout to not trigger a restart.
2277 * The restart will be triggered when the discovery is resumed.
2279 if (adapter->discovery_idle_timeout > 0) {
2280 g_source_remove(adapter->discovery_idle_timeout);
2281 adapter->discovery_idle_timeout = 0;
2284 if (adapter->discovery_enable == 0x00)
2287 cp.type = adapter->discovery_type;
2289 mgmt_send(adapter->mgmt, MGMT_OP_STOP_DISCOVERY,
2290 adapter->dev_id, sizeof(cp), &cp,
2291 suspend_discovery_complete, adapter, NULL);
2294 static void resume_discovery(struct btd_adapter *adapter)
2298 adapter->discovery_suspended = false;
2301 * If there are no clients discovering right now, then there is
2302 * also nothing to resume.
2304 if (!adapter->discovery_list)
2308 * Treat a suspended discovery session the same as extra long
2309 * idle time for a normal discovery. So just trigger the default
2310 * restart procedure.
2312 trigger_start_discovery(adapter, IDLE_DISCOV_TIMEOUT);
2316 static void discovering_callback(uint16_t index, uint16_t length,
2317 const void *param, void *user_data)
2319 const struct mgmt_ev_discovering *ev = param;
2320 struct btd_adapter *adapter = user_data;
2322 if (length < sizeof(*ev)) {
2323 btd_error(adapter->dev_id, "Too small discovering event");
2327 DBG("hci%u type %u discovering %u method %d", adapter->dev_id, ev->type,
2328 ev->discovering, adapter->filtered_discovery);
2330 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
2331 DBG("info discov_type %d", adapter->discovery_type);
2332 if (ev->type == SCAN_TYPE_BREDR) {
2333 if (ev->discovering == FALSE) {
2334 hci_clear_bit(BDADDR_BREDR, &adapter->discovery_type);
2335 adapter->discovering = false;
2337 hci_set_bit(BDADDR_BREDR, &adapter->discovery_type);
2338 adapter->discovering = true;
2340 g_dbus_emit_property_changed(dbus_conn, adapter->path,
2341 ADAPTER_INTERFACE, "Discovering");
2343 } else if (ev->type == SCAN_TYPE_LE) {
2344 if (ev->discovering == FALSE) {
2345 hci_clear_bit(BDADDR_LE_PUBLIC, &adapter->discovery_type);
2346 hci_clear_bit(BDADDR_LE_RANDOM, &adapter->discovery_type);
2347 adapter->le_discovering = false;
2349 hci_set_bit(BDADDR_LE_PUBLIC, &adapter->discovery_type);
2350 hci_set_bit(BDADDR_LE_RANDOM, &adapter->discovery_type);
2351 adapter->le_discovering = true;
2354 g_dbus_emit_property_changed(dbus_conn, adapter->path,
2355 ADAPTER_INTERFACE, "LEDiscovering");
2358 if (adapter->discovery_enable == ev->discovering)
2361 adapter->discovery_type = ev->type;
2362 adapter->discovery_enable = ev->discovering;
2366 * Check for existing discoveries triggered by client applications
2367 * and ignore all others.
2369 * If there are no clients, then it is good idea to trigger a
2370 * passive scanning attempt.
2372 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
2373 if (adapter->discovery_list == NULL && adapter->le_discovery_list == NULL) {
2374 if (!adapter->connect_le)
2375 trigger_passive_scanning(adapter);
2379 if (!adapter->discovery_list) {
2380 if (!adapter->connect_le)
2381 trigger_passive_scanning(adapter);
2386 if (adapter->discovery_suspended)
2389 switch (adapter->discovery_enable) {
2391 if (adapter->no_scan_restart_delay)
2392 trigger_start_discovery(adapter, 0);
2394 trigger_start_discovery(adapter, IDLE_DISCOV_TIMEOUT);
2398 if (adapter->discovery_idle_timeout > 0) {
2399 g_source_remove(adapter->discovery_idle_timeout);
2400 adapter->discovery_idle_timeout = 0;
2407 static void invalidate_rssi_and_tx_power(gpointer a)
2409 struct btd_device *dev = a;
2411 device_set_rssi(dev, 0);
2412 device_set_tx_power(dev, 127);
2415 static gboolean remove_temp_devices(gpointer user_data)
2417 struct btd_adapter *adapter = user_data;
2420 DBG("%s", adapter->path);
2422 adapter->temp_devices_timeout = 0;
2424 for (l = adapter->devices; l != NULL; l = next) {
2425 struct btd_device *dev = l->data;
2427 next = g_slist_next(l);
2429 if (device_is_temporary(dev) && !btd_device_is_connected(dev))
2430 btd_adapter_remove_device(adapter, dev);
2436 static void discovery_cleanup(struct btd_adapter *adapter)
2440 adapter->discovery_type = 0x00;
2442 if (adapter->discovery_idle_timeout > 0) {
2443 g_source_remove(adapter->discovery_idle_timeout);
2444 adapter->discovery_idle_timeout = 0;
2447 if (adapter->temp_devices_timeout > 0) {
2448 g_source_remove(adapter->temp_devices_timeout);
2449 adapter->temp_devices_timeout = 0;
2452 g_slist_free_full(adapter->discovery_found,
2453 invalidate_rssi_and_tx_power);
2454 adapter->discovery_found = NULL;
2456 if (!adapter->devices)
2459 for (l = adapter->devices; l != NULL; l = next) {
2460 struct btd_device *dev = l->data;
2462 next = g_slist_next(l);
2464 if (device_is_temporary(dev) && !device_is_connectable(dev))
2465 btd_adapter_remove_device(adapter, dev);
2468 adapter->temp_devices_timeout = g_timeout_add_seconds(TEMP_DEV_TIMEOUT,
2469 remove_temp_devices, adapter);
2472 static void discovery_free(void *user_data)
2474 struct watch_client *client = user_data;
2477 g_dbus_remove_watch(dbus_conn, client->watch);
2479 if (client->discovery_filter) {
2480 free_discovery_filter(client->discovery_filter);
2481 client->discovery_filter = NULL;
2485 dbus_message_unref(client->msg);
2487 g_free(client->owner);
2491 static void discovery_remove(struct watch_client *client)
2493 struct btd_adapter *adapter = client->adapter;
2495 DBG("owner %s", client->owner);
2497 adapter->set_filter_list = g_slist_remove(adapter->set_filter_list,
2500 adapter->discovery_list = g_slist_remove(adapter->discovery_list,
2503 discovery_free(client);
2506 * If there are other client discoveries in progress, then leave
2507 * it active. If not, then make sure to stop the restart timeout.
2509 if (adapter->discovery_list)
2512 discovery_cleanup(adapter);
2515 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
2516 static void stop_discovery_complete(uint8_t status, uint16_t length,
2517 const void *param, void *user_data)
2519 struct watch_client *client = user_data;
2520 struct btd_adapter *adapter = client->adapter;
2523 DBG("status 0x%02x", status);
2525 if (status != MGMT_STATUS_SUCCESS) {
2527 reply = btd_error_busy(client->msg);
2528 g_dbus_send_message(dbus_conn, reply);
2535 reply = g_dbus_create_reply(client->msg, DBUS_TYPE_INVALID);
2536 g_dbus_send_message(dbus_conn, reply);
2539 adapter->discovery_type &= (~0x01);
2540 DBG("Discovery Type 0x%02x", adapter->discovery_type);
2542 adapter->filtered_discovery = false;
2543 adapter->no_scan_restart_delay = false;
2544 adapter->discovering = false;
2545 g_dbus_emit_property_changed(dbus_conn, adapter->path,
2546 ADAPTER_INTERFACE, "Discovering");
2548 if (adapter->discovery_list == NULL && adapter->le_discovery_list == NULL) {
2549 adapter->discovery_enable = 0x00;
2550 trigger_passive_scanning(adapter);
2554 discovery_remove(client);
2557 static void stop_le_discovery_complete(uint8_t status, uint16_t length,
2558 const void *param, void *user_data)
2560 struct watch_client *client = user_data;
2561 struct btd_adapter *adapter = client->adapter;
2564 DBG("status 0x%02x", status);
2566 if (status != MGMT_STATUS_SUCCESS) {
2568 reply = btd_error_busy(client->msg);
2569 g_dbus_send_message(dbus_conn, reply);
2576 reply = g_dbus_create_reply(client->msg, DBUS_TYPE_INVALID);
2577 g_dbus_send_message(dbus_conn, reply);
2580 adapter->discovery_type &= (~0x06);
2581 DBG("Discovery Type 0x%02x", adapter->discovery_type);
2583 adapter->filtered_discovery = false;
2584 adapter->no_scan_restart_delay = false;
2585 adapter->le_discovering = false;
2586 g_dbus_emit_property_changed(dbus_conn, adapter->path,
2587 ADAPTER_INTERFACE, "LEDiscovering");
2589 if (adapter->discovery_list == NULL && adapter->le_discovery_list == NULL) {
2590 adapter->discovery_enable = 0x00;
2591 trigger_passive_scanning(adapter);
2596 * The destroy function will cleanup the client information and
2597 * also remove it from the list of discovery clients.
2599 g_dbus_remove_watch(dbus_conn, client->watch);
2603 static void stop_discovery_complete(uint8_t status, uint16_t length,
2604 const void *param, void *user_data)
2606 struct watch_client *client = user_data;
2607 struct btd_adapter *adapter = client->adapter;
2610 DBG("status 0x%02x", status);
2612 if (status != MGMT_STATUS_SUCCESS) {
2614 reply = btd_error_busy(client->msg);
2615 g_dbus_send_message(dbus_conn, reply);
2621 reply = g_dbus_create_reply(client->msg, DBUS_TYPE_INVALID);
2622 g_dbus_send_message(dbus_conn, reply);
2625 adapter->discovery_type = 0x00;
2626 adapter->discovery_enable = 0x00;
2627 adapter->filtered_discovery = false;
2628 adapter->no_scan_restart_delay = false;
2629 adapter->discovering = false;
2630 g_dbus_emit_property_changed(dbus_conn, adapter->path,
2631 ADAPTER_INTERFACE, "Discovering");
2633 trigger_passive_scanning(adapter);
2636 discovery_remove(client);
2640 static int compare_sender(gconstpointer a, gconstpointer b)
2642 const struct watch_client *client = a;
2643 const char *sender = b;
2645 return g_strcmp0(client->owner, sender);
2648 static gint g_strcmp(gconstpointer a, gconstpointer b)
2650 return strcmp(a, b);
2653 static void extract_unique_uuids(gpointer data, gpointer user_data)
2655 char *uuid_str = data;
2656 GSList **uuids = user_data;
2658 if (!g_slist_find_custom(*uuids, uuid_str, g_strcmp))
2659 *uuids = g_slist_insert_sorted(*uuids, uuid_str, g_strcmp);
2663 * This method merges all adapter filters into rssi, transport and uuids.
2664 * Returns 1 if there was no filtered scan, 0 otherwise.
2666 static int merge_discovery_filters(struct btd_adapter *adapter, int *rssi,
2667 uint8_t *transport, GSList **uuids)
2670 bool empty_uuid = false;
2671 bool has_regular_discovery = false;
2672 bool has_filtered_discovery = false;
2674 for (l = adapter->discovery_list; l != NULL; l = g_slist_next(l)) {
2675 struct watch_client *client = l->data;
2676 struct discovery_filter *item = client->discovery_filter;
2679 has_regular_discovery = true;
2683 has_filtered_discovery = true;
2685 *transport |= item->type;
2688 * Rule for merging rssi and pathloss into rssi field of kernel
2689 * filter is as follow:
2690 * - if there's any client without proximity filter, then do no
2691 * proximity filtering,
2692 * - if all clients specified RSSI, then use lowest value,
2693 * - if any client specified pathloss, then kernel filter should
2694 * do no proximity, as kernel can't compute pathloss. We'll do
2695 * filtering on our own.
2697 if (item->rssi == DISTANCE_VAL_INVALID)
2698 *rssi = HCI_RSSI_INVALID;
2699 else if (*rssi != HCI_RSSI_INVALID && *rssi >= item->rssi)
2701 else if (item->pathloss != DISTANCE_VAL_INVALID)
2702 *rssi = HCI_RSSI_INVALID;
2704 if (!g_slist_length(item->uuids))
2707 g_slist_foreach(item->uuids, extract_unique_uuids, uuids);
2710 /* If no proximity filtering is set, disable it */
2711 if (*rssi == DISTANCE_VAL_INVALID)
2712 *rssi = HCI_RSSI_INVALID;
2715 * Empty_uuid variable determines wether there was any filter with no
2716 * uuids. In this case someone might be looking for all devices in
2717 * certain proximity, and we need to have empty uuids in kernel filter.
2720 g_slist_free(*uuids);
2724 if (has_regular_discovery) {
2725 if (!has_filtered_discovery)
2729 * It there is both regular and filtered scan running, then
2730 * clear whole fitler to report all devices.
2732 *transport = get_scan_type(adapter);
2733 *rssi = HCI_RSSI_INVALID;
2734 g_slist_free(*uuids);
2741 static void populate_mgmt_filter_uuids(uint8_t (*mgmt_uuids)[16], GSList *uuids)
2745 for (l = uuids; l != NULL; l = g_slist_next(l)) {
2746 bt_uuid_t uuid, u128;
2749 bt_string_to_uuid(&uuid, l->data);
2750 bt_uuid_to_uuid128(&uuid, &u128);
2752 ntoh128((uint128_t *) u128.value.u128.data, &uint128);
2753 htob128(&uint128, (uint128_t *) mgmt_uuids);
2760 * This method merges all adapter filters into one that will be send to kernel.
2761 * cp_ptr is set to null when regular non-filtered discovery is needed,
2762 * otherwise it's pointing to filter. Returns 0 on succes, -1 on error
2764 static int discovery_filter_to_mgmt_cp(struct btd_adapter *adapter,
2765 struct mgmt_cp_start_service_discovery **cp_ptr)
2767 GSList *uuids = NULL;
2768 struct mgmt_cp_start_service_discovery *cp;
2769 int rssi = DISTANCE_VAL_INVALID;
2771 uint8_t discovery_type = 0;
2775 if (merge_discovery_filters(adapter, &rssi, &discovery_type, &uuids)) {
2776 /* There are only regular scans, run just regular scan. */
2781 uuid_count = g_slist_length(uuids);
2783 cp = g_try_malloc(sizeof(*cp) + 16*uuid_count);
2786 g_slist_free(uuids);
2790 cp->type = discovery_type;
2792 cp->uuid_count = uuid_count;
2793 populate_mgmt_filter_uuids(cp->uuids, uuids);
2795 g_slist_free(uuids);
2799 static bool filters_equal(struct mgmt_cp_start_service_discovery *a,
2800 struct mgmt_cp_start_service_discovery *b) {
2804 if ((!a && b) || (a && !b))
2807 if (a->type != b->type)
2810 if (a->rssi != b->rssi)
2814 * When we create mgmt_cp_start_service_discovery structure inside
2815 * discovery_filter_to_mgmt_cp, we always keep uuids sorted, and
2816 * unique, so we're safe to compare uuid_count, and uuids like that.
2818 if (a->uuid_count != b->uuid_count)
2821 if (memcmp(a->uuids, b->uuids, 16 * a->uuid_count) != 0)
2827 static int update_discovery_filter(struct btd_adapter *adapter)
2829 struct mgmt_cp_start_service_discovery *sd_cp;
2833 if (discovery_filter_to_mgmt_cp(adapter, &sd_cp)) {
2834 btd_error(adapter->dev_id,
2835 "discovery_filter_to_mgmt_cp returned error");
2840 * If filters are equal, then don't update scan, except for when
2841 * starting discovery.
2843 if (filters_equal(adapter->current_discovery_filter, sd_cp) &&
2844 adapter->discovering != 0) {
2845 DBG("filters were equal, deciding to not restart the scan.");
2850 g_free(adapter->current_discovery_filter);
2851 adapter->current_discovery_filter = sd_cp;
2853 trigger_start_discovery(adapter, 0);
2855 return -EINPROGRESS;
2858 static int discovery_stop(struct watch_client *client)
2860 struct btd_adapter *adapter = client->adapter;
2861 struct mgmt_cp_stop_discovery cp;
2863 /* Check if there are more client discovering */
2864 if (g_slist_next(adapter->discovery_list)) {
2865 discovery_remove(client);
2866 update_discovery_filter(adapter);
2871 * In the idle phase of a discovery, there is no need to stop it
2872 * and so it is enough to send out the signal and just return.
2874 if (adapter->discovery_enable == 0x00) {
2875 discovery_remove(client);
2876 adapter->discovering = false;
2877 g_dbus_emit_property_changed(dbus_conn, adapter->path,
2878 ADAPTER_INTERFACE, "Discovering");
2880 trigger_passive_scanning(adapter);
2884 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
2885 adapter->disc_type = BT_DISC_TYPE_BREDR_ONLY;
2887 cp.type = adapter->discovery_type;
2889 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
2892 mgmt_send(adapter->mgmt, MGMT_OP_STOP_DISCOVERY,
2893 adapter->dev_id, sizeof(cp), &cp,
2894 stop_discovery_complete, client, NULL);
2896 return -EINPROGRESS;
2899 static void discovery_destroy(void *user_data)
2901 struct watch_client *client = user_data;
2902 struct btd_adapter *adapter = client->adapter;
2904 DBG("owner %s", client->owner);
2906 adapter->set_filter_list = g_slist_remove(adapter->set_filter_list,
2909 adapter->discovery_list = g_slist_remove(adapter->discovery_list,
2912 if (client->discovery_filter) {
2913 free_discovery_filter(client->discovery_filter);
2914 client->discovery_filter = NULL;
2917 g_free(client->owner);
2921 * If there are other client discoveries in progress, then leave
2922 * it active. If not, then make sure to stop the restart timeout.
2924 if (adapter->discovery_list)
2927 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
2928 hci_clear_bit(BDADDR_BREDR, &adapter->discovery_type);
2930 adapter->discovery_type = 0x00;
2933 if (adapter->discovery_idle_timeout > 0) {
2934 g_source_remove(adapter->discovery_idle_timeout);
2935 adapter->discovery_idle_timeout = 0;
2938 if (adapter->temp_devices_timeout > 0) {
2939 g_source_remove(adapter->temp_devices_timeout);
2940 adapter->temp_devices_timeout = 0;
2943 discovery_cleanup(adapter);
2945 adapter->temp_devices_timeout = g_timeout_add_seconds(TEMP_DEV_TIMEOUT,
2946 remove_temp_devices, adapter);
2949 static void discovery_disconnect(DBusConnection *conn, void *user_data)
2951 struct watch_client *client = user_data;
2953 DBG("owner %s", client->owner);
2955 discovery_stop(client);
2959 * Returns true if client was already discovering, false otherwise. *client
2960 * will point to discovering client, or client that have pre-set his filter.
2962 static bool get_discovery_client(struct btd_adapter *adapter,
2964 struct watch_client **client)
2966 GSList *list = g_slist_find_custom(adapter->discovery_list, owner,
2969 *client = list->data;
2973 list = g_slist_find_custom(adapter->set_filter_list, owner,
2976 *client = list->data;
2984 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
2985 static void le_discovery_destroy(void *user_data)
2987 struct watch_client *client = user_data;
2988 struct btd_adapter *adapter = client->adapter;
2990 DBG("owner %s", client->owner);
2992 adapter->le_discovery_list = g_slist_remove(adapter->le_discovery_list,
2995 g_free(client->owner);
2999 * If there are other client discoveries in progress, then leave
3000 * it active. If not, then make sure to stop the restart timeout.
3002 DBG("adapter->discovery_list[%p] adapter->le_discovery_list[%p]",
3003 adapter->discovery_list, adapter->le_discovery_list);
3004 if (adapter->discovery_list || adapter->le_discovery_list)
3007 hci_clear_bit(BDADDR_LE_PUBLIC, &adapter->discovery_type);
3008 hci_clear_bit(BDADDR_LE_RANDOM, &adapter->discovery_type);
3010 DBG("Restart Timer... adapter->discovery_type[%d]", adapter->discovery_type);
3011 if (adapter->discovery_idle_timeout > 0) {
3012 g_source_remove(adapter->discovery_idle_timeout);
3013 adapter->discovery_idle_timeout = 0;
3016 if (adapter->temp_devices_timeout > 0) {
3017 g_source_remove(adapter->temp_devices_timeout);
3018 adapter->temp_devices_timeout = 0;
3021 discovery_cleanup(adapter);
3024 static void le_discovery_disconnect(DBusConnection *conn, void *user_data)
3026 struct watch_client *client = user_data;
3027 struct btd_adapter *adapter = client->adapter;
3028 struct mgmt_cp_stop_le_discovery cp;
3030 DBG("owner %s", client->owner);
3032 adapter->le_discovery_list = g_slist_remove(adapter->le_discovery_list,
3036 * There is no need for extra cleanup of the client since that
3037 * will be done by the destroy callback.
3039 * However in case this is the last client, the discovery in
3040 * the kernel needs to be disabled.
3042 if (adapter->le_discovery_list)
3046 * In the idle phase of a discovery, there is no need to stop it
3047 * and so it is enough to send out the signal and just return.
3049 if (adapter->discovery_enable == 0x00) {
3050 adapter->le_discovering = false;
3051 g_dbus_emit_property_changed(dbus_conn, adapter->path,
3052 ADAPTER_INTERFACE, "LEDiscovering");
3054 if (adapter->discovering == false && adapter->le_discovering == false) {
3055 trigger_passive_scanning(adapter);
3062 mgmt_send(adapter->mgmt, MGMT_OP_STOP_LE_DISCOVERY,
3063 adapter->dev_id, sizeof(cp), &cp,
3064 stop_discovery_complete, client, NULL);
3067 #ifdef TIZEN_FEATURE_PLATFROM_SCAN_FILTER
3068 static void addr_filter_params_free(gpointer data)
3070 adapter_le_address_filter_params_t *params = data;
3075 static void uuid_filter_params_free(gpointer data)
3077 adapter_le_uuid_params_t *params = data;
3079 g_free((char *)params->uuid);
3080 g_free((char *)params->uuid_mask);
3084 static void manufacturer_filter_params_free(gpointer data)
3086 adapter_le_manf_data_params_t *params = data;
3088 g_free((char *)params->man_data);
3089 g_free((char *)params->man_data_mask);
3093 static void local_name_filter_params_free(gpointer data)
3095 adapter_le_local_name_params_t *params = data;
3097 g_free((char *)params->local_name);
3101 static void service_data_filter_params_free(gpointer data)
3103 adapter_le_service_data_params_t *params = data;
3105 g_free((char *)params->service_data);
3106 g_free((char *)params->service_data_mask);
3110 static void scan_filter_params_free(gpointer data)
3112 adapter_le_scan_filter_param_t *params = data;
3116 int adapter_le_address_cmp(gconstpointer a, gconstpointer b)
3118 const adapter_le_address_filter_params_t *params = a;
3119 const char *address = b;
3122 ba2str(¶ms->broadcaster_addr, addr);
3123 return strcasecmp(addr, address);
3126 int adapter_le_uuid_cmp(gconstpointer a, gconstpointer b)
3128 const adapter_le_uuid_params_t *params = a;
3129 const char *uuid = b;
3131 return strcasecmp((const char *)params->uuid, uuid);
3134 int adapter_le_manufacturer_data_cmp(gconstpointer a, gconstpointer b)
3136 const adapter_le_manf_data_params_t *params = a;
3137 const struct eir_msd *msd = b;
3139 if (msd->company == params->company_id) {
3140 /* if the advertisiement packet is an iBeacon */
3141 if (msd->company == COMPANY_ID_APPLE)
3143 return strncasecmp((const char *)params->man_data,
3144 (const char *)msd->data,
3145 params->man_data_len);
3151 int adapter_le_local_name_cmp(gconstpointer a, gconstpointer b)
3153 const adapter_le_local_name_params_t *params = a;
3154 const char *name = b;
3156 return strcasecmp(params->local_name, name);
3159 int adapter_le_service_data_cmp(gconstpointer a, gconstpointer b)
3161 const adapter_le_service_data_params_t *params = a;
3162 const struct eir_sd *sd = b;
3163 /* Todo, the service data format for 16 bit, 32bit and
3164 * 128 bit uuids needs to addressed */
3165 return strncasecmp((const char *)(params->service_data),
3166 (const char *)sd->data,
3170 int adapter_le_address_filter_index_cmp(gconstpointer a, gconstpointer b)
3172 const adapter_le_address_filter_params_t *params = a;
3173 uint16_t filter_inex = GPOINTER_TO_UINT(b);
3175 return params->filter_index - filter_inex;
3178 int adapter_le_uuid_filter_index_cmp(gconstpointer a, gconstpointer b)
3180 const adapter_le_uuid_params_t *params = a;
3181 uint16_t filter_inex = GPOINTER_TO_UINT(b);
3183 return params->filter_index - filter_inex;
3186 int adapter_le_manufacturer_data_filter_index_cmp(gconstpointer a, gconstpointer b)
3188 const adapter_le_manf_data_params_t *params = a;
3189 uint16_t filter_inex = GPOINTER_TO_UINT(b);
3191 return params->filter_index - filter_inex;
3194 int adapter_le_local_name_filter_index_cmp(gconstpointer a, gconstpointer b)
3196 const adapter_le_local_name_params_t *params = a;
3197 uint16_t filter_inex = GPOINTER_TO_UINT(b);
3199 return params->filter_index - filter_inex;
3202 int adapter_le_service_data_filter_index_cmp(gconstpointer a, gconstpointer b)
3204 const adapter_le_service_data_params_t *params = a;
3205 uint16_t filter_inex = GPOINTER_TO_UINT(b);
3207 return params->filter_index - filter_inex;
3210 int adapter_le_scan_params_filter_index_cmp(gconstpointer a, gconstpointer b)
3212 const adapter_le_scan_filter_param_t *params = a;
3213 uint16_t filter_inex = GPOINTER_TO_UINT(b);
3215 return params->index - filter_inex;
3218 static gboolean adapter_le_clear_platform_scan_filter_data(
3219 struct btd_adapter *adapter, int filter_index)
3226 list = g_slist_find_custom(adapter->addr_filters,
3227 GINT_TO_POINTER(filter_index), adapter_le_address_filter_index_cmp);
3228 if (list && list->data) {
3229 /* Delete info from the struct to list */
3230 adapter->addr_filters = g_slist_delete_link(adapter->addr_filters, list);
3232 list = g_slist_find_custom(adapter->service_data_changed_filters,
3233 GINT_TO_POINTER(filter_index), adapter_le_service_data_filter_index_cmp);
3234 if (list && list->data) {
3235 /* Delete info from the struct to list */
3236 adapter->service_data_changed_filters = g_slist_delete_link(adapter->service_data_changed_filters, list);
3239 list = g_slist_find_custom(adapter->service_uuid_filters,
3240 GINT_TO_POINTER(filter_index), adapter_le_uuid_filter_index_cmp);
3241 if (list && list->data) {
3242 /* Delete info from the struct to list */
3243 adapter->service_uuid_filters = g_slist_delete_link(adapter->service_uuid_filters, list);
3246 list = g_slist_find_custom(adapter->solicit_data_filters,
3247 GINT_TO_POINTER(filter_index), adapter_le_uuid_filter_index_cmp);
3248 if (list && list->data) {
3249 /* Delete info from the struct to list */
3250 adapter->solicit_data_filters = g_slist_delete_link(adapter->solicit_data_filters, list);
3253 list = g_slist_find_custom(adapter->local_name_filters,
3254 GINT_TO_POINTER(filter_index), adapter_le_local_name_filter_index_cmp);
3255 if (list && list->data) {
3256 /* Delete info from the struct to list */
3257 adapter->local_name_filters = g_slist_delete_link(adapter->local_name_filters, list);
3260 list = g_slist_find_custom(adapter->manufaturer_data_filters,
3261 GINT_TO_POINTER(filter_index), adapter_le_manufacturer_data_filter_index_cmp);
3262 if (list && list->data) {
3263 /* Delete info from the struct to list */
3264 adapter->manufaturer_data_filters = g_slist_delete_link(adapter->manufaturer_data_filters, list);
3267 list = g_slist_find_custom(adapter->service_data_filters,
3268 GINT_TO_POINTER(filter_index), adapter_le_service_data_filter_index_cmp);
3269 if (list && list->data) {
3270 /* Delete info from the struct to list */
3271 adapter->service_data_filters = g_slist_delete_link(adapter->service_data_filters, list);
3274 list = g_slist_find_custom(adapter->scan_params,
3275 GINT_TO_POINTER(filter_index), adapter_le_scan_params_filter_index_cmp);
3276 if (list && list->data) {
3277 /* Delete info from the struct to list */
3278 adapter->scan_params = g_slist_delete_link(adapter->scan_params, list);
3284 static gboolean adapter_le_enable_platform_scan_filtering(
3285 struct btd_adapter *adapter, gboolean enable)
3290 DBG("Platform scan filtering enable[%d]", enable);
3292 adapter->scan_filter_support = enable;
3298 static gboolean adapter_le_service_add_addr_scan_filter_data(struct btd_adapter *adapter,
3299 int filter_index, gchar *string, int addr_type)
3301 /* TYPE_DEVICE_ADDRESS */
3302 adapter_le_address_filter_params_t *params;
3306 params = g_new0(adapter_le_address_filter_params_t, 1);
3310 params->filter_index = filter_index;
3311 str2ba(string, ¶ms->broadcaster_addr);
3312 params->bdaddr_type = addr_type;
3314 /* Store the struct to list */
3315 adapter->addr_filters = g_slist_append(adapter->addr_filters, params);
3319 static const char *adapter_le_service_find_addr_scan_filter_data(
3320 struct btd_adapter *adapter, gchar *string)
3325 list = g_slist_find_custom(adapter->addr_filters, string, adapter_le_address_cmp);
3334 static gboolean adapter_le_service_delete_addr_scan_filter_data(struct btd_adapter *adapter,
3335 int filter_index, gchar *string, int addr_type)
3340 list = g_slist_find_custom(adapter->addr_filters, string, adapter_le_address_cmp);
3344 /* Delete info from the struct to list */
3345 adapter->addr_filters = g_slist_delete_link(adapter->addr_filters, list);
3350 static gboolean adapter_le_service_clear_addr_scan_filter_data(struct btd_adapter *adapter)
3354 g_slist_free_full(adapter->addr_filters, addr_filter_params_free);
3355 adapter->addr_filters = NULL;
3360 static gboolean adapter_le_service_add_uuid_scan_filter_data(struct btd_adapter *adapter,
3361 int filter_index, gboolean is_solicited, uint8_t *p_uuid,
3362 uint8_t *p_uuid_mask, int uuid_mask_len)
3365 adapter_le_uuid_params_t *params;
3370 params = g_new0(adapter_le_uuid_params_t, 1);
3374 if (uuid_mask_len == UUID_16_LEN) {
3375 uint16_t *uuid16 = (void *)p_uuid;
3376 sdp_uuid16_create((uuid_t *)&uuid, get_be16(uuid16));
3377 } else if (uuid_mask_len == UUID_32_LEN) {
3378 uint32_t *uuid32 = (void *)p_uuid;
3379 sdp_uuid32_create((uuid_t *)&uuid, get_be32(uuid32));
3381 sdp_uuid128_create((uuid_t *)&uuid, p_uuid);
3383 params->filter_index = filter_index;
3384 params->uuid = (uint8_t *)bt_uuid2string((uuid_t *)&uuid);
3385 params->uuid_mask = g_new0(uint8_t, uuid_mask_len);
3386 memcpy(params->uuid_mask, p_uuid_mask, uuid_mask_len);
3387 params->uuid_len = uuid_mask_len;
3389 /* Store the struct to list */
3390 adapter->solicit_data_filters = g_slist_append(adapter->solicit_data_filters, params);
3395 static adapter_le_uuid_params_t *adapter_le_service_find_uuid_scan_filter_data(struct btd_adapter *adapter,
3401 list = g_slist_find_custom(adapter->solicit_data_filters, p_uuid, adapter_le_uuid_cmp);
3405 /* Delete info from the struct to list */
3411 static gboolean adapter_le_service_delete_uuid_scan_filter_data(struct btd_adapter *adapter,
3412 int filter_index, gboolean is_solicited, uint8_t *p_uuid,
3413 uint8_t *p_uuid_mask, int uuid_mask_len)
3418 list = g_slist_find_custom(adapter->solicit_data_filters, GINT_TO_POINTER(filter_index), adapter_le_uuid_filter_index_cmp);
3422 adapter_le_uuid_params_t *params = list->data;
3423 /* Delete info from the struct to list */
3424 if (params && strcasecmp((const char *)params->uuid, (const char *)p_uuid)) {
3425 adapter->solicit_data_filters = g_slist_delete_link(adapter->solicit_data_filters, list);
3432 static gboolean adapter_le_service_clear_uuid_scan_filter_data(struct btd_adapter *adapter)
3436 g_slist_free_full(adapter->solicit_data_filters, uuid_filter_params_free);
3437 adapter->solicit_data_filters = NULL;
3442 static gboolean adapter_le_service_add_manufacturer_scan_filter_data(struct btd_adapter *adapter,
3443 int filter_index, int company_id, int company_id_mask,
3444 uint8_t *p_data, uint8_t *p_mask, int data_len)
3447 adapter_le_manf_data_params_t *params;
3451 params = g_new0(adapter_le_manf_data_params_t, 1);
3455 params->filter_index = filter_index;
3456 params->company_id = company_id;
3457 params->company_id_mask = company_id_mask;
3458 params->man_data = g_new0(uint8_t, data_len);
3459 memcpy(params->man_data, p_data, data_len);
3460 params->man_data_mask = g_new0(uint8_t, data_len);
3461 memcpy(params->man_data_mask, p_mask, data_len);
3462 params->man_data_len = data_len;
3464 /* Store the struct to list */
3465 adapter->manufaturer_data_filters = g_slist_append(adapter->manufaturer_data_filters, params);
3470 static adapter_le_manf_data_params_t *adapter_le_service_find_manufacturer_scan_filter_data(struct btd_adapter *adapter,
3471 struct eir_msd *msd)
3475 list = g_slist_find_custom(adapter->manufaturer_data_filters, msd, adapter_le_manufacturer_data_cmp);
3484 static gboolean adapter_le_service_delete_manufacturer_scan_filter_data(struct btd_adapter *adapter,
3485 int filter_index, int company_id, int company_id_mask,
3486 uint8_t *p_data, uint8_t *p_mask, int data_len)
3490 list = g_slist_find_custom(adapter->manufaturer_data_filters, GINT_TO_POINTER(filter_index), adapter_le_manufacturer_data_filter_index_cmp);
3494 adapter_le_manf_data_params_t *params = list->data;
3495 /* Delete info from the struct to list */
3496 if (params && strcasecmp((const char *)params->man_data, (const char *)p_data)) {
3497 adapter->manufaturer_data_filters = g_slist_delete_link(adapter->manufaturer_data_filters, list);
3504 static gboolean adapter_le_service_clear_manufacturer_scan_filter_data(struct btd_adapter *adapter)
3508 g_slist_free_full(adapter->manufaturer_data_filters, manufacturer_filter_params_free);
3509 adapter->manufaturer_data_filters = NULL;
3514 static gboolean adapter_le_service_add_local_name_scan_filter_data(struct btd_adapter *adapter,
3515 int filter_index, gchar *name)
3518 adapter_le_local_name_params_t *params;
3522 params = g_new0(adapter_le_local_name_params_t, 1);
3526 params->filter_index = filter_index;
3527 params->local_name = g_strdup(name);
3528 params->name_len = strlen(name);
3530 /* Store the struct to list */
3531 adapter->local_name_filters = g_slist_append(adapter->local_name_filters, params);
3536 static adapter_le_local_name_params_t *adapter_le_service_find_local_name_scan_filter_data(
3537 struct btd_adapter *adapter,
3542 list = g_slist_find_custom(adapter->local_name_filters, name, adapter_le_local_name_cmp);
3551 static gboolean adapter_le_service_delete_local_name_scan_filter_data(struct btd_adapter *adapter,
3552 int filter_index, gchar *name)
3556 list = g_slist_find_custom(adapter->local_name_filters, GINT_TO_POINTER(filter_index), adapter_le_local_name_filter_index_cmp);
3560 adapter_le_local_name_params_t *params = list->data;
3561 /* Delete info from the struct to list */
3562 if (params && strcasecmp((const char *)params->local_name, (const char *)name)) {
3563 adapter->local_name_filters = g_slist_delete_link(adapter->local_name_filters, list);
3570 static gboolean adapter_le_service_clear_local_name_scan_filter_data(struct btd_adapter *adapter)
3574 g_slist_free_full(adapter->local_name_filters, local_name_filter_params_free);
3575 adapter->local_name_filters = NULL;
3580 static gboolean adapter_le_service_add_service_scan_filter_data(struct btd_adapter *adapter,
3581 int filter_index, uint8_t *p_data, uint8_t *p_mask, int data_len)
3583 adapter_le_service_data_params_t *params;
3587 params = g_new0(adapter_le_service_data_params_t, 1);
3591 params->filter_index = filter_index;
3592 params->service_data = g_new0(uint8_t, data_len);
3593 memcpy(params->service_data, p_data, data_len);
3594 params->service_data_mask = g_new0(uint8_t, data_len);
3595 memcpy(params->service_data_mask, p_mask, data_len);
3596 params->service_data_len = data_len;
3598 /* Store the struct to list */
3599 adapter->service_data_filters = g_slist_append(adapter->service_data_filters, params);
3604 static adapter_le_service_data_params_t* adapter_le_service_find_service_scan_filter_data(
3605 struct btd_adapter *adapter, struct eir_sd *sd)
3610 list = g_slist_find_custom(adapter->service_data_filters, sd, adapter_le_service_data_cmp);
3619 static gboolean adapter_le_service_delete_service_scan_filter_data(struct btd_adapter *adapter,
3620 int filter_index, uint8_t *p_data, uint8_t *p_mask, int data_len)
3625 list = g_slist_find_custom(adapter->service_data_filters, GINT_TO_POINTER(filter_index), adapter_le_service_data_filter_index_cmp);
3629 adapter_le_service_data_params_t *params = list->data;
3630 /* Delete info from the struct to list */
3631 if (params && strcasecmp((const char *)params->service_data, (const char *)p_data)) {
3632 adapter->service_data_filters = g_slist_delete_link(adapter->service_data_filters, list);
3638 static gboolean adapter_le_service_clear_service_scan_filter_data(struct btd_adapter *adapter)
3642 g_slist_free_full(adapter->service_data_filters, service_data_filter_params_free);
3643 adapter->service_data_filters = NULL;
3648 static gboolean adapter_le_service_add_scan_filter_params(struct btd_adapter *adapter,
3649 adapter_le_scan_filter_param_t *params)
3651 adapter_le_scan_filter_param_t *l_params;
3655 l_params = g_new0(adapter_le_scan_filter_param_t, 1);
3659 l_params->action = params->action;
3660 l_params->delivery_mode = params->delivery_mode;
3661 l_params->feature = params->feature;
3662 l_params->filter_logic_type = params->filter_logic_type;
3663 l_params->index = params->index;
3664 l_params->list_logic_type = params->list_logic_type;
3665 l_params->onfound_timeout = params->onfound_timeout;
3666 l_params->onfound_timeout_cnt = params->onfound_timeout_cnt;
3667 l_params->rssi_high_threshold = params->rssi_high_threshold;
3668 l_params->rssi_low_threshold = params->rssi_low_threshold;
3670 /* Store the struct to list */
3671 adapter->scan_params = g_slist_append(adapter->scan_params, l_params);
3676 static adapter_le_scan_filter_param_t *adapter_le_service_find_scan_filter_params(
3677 struct btd_adapter *adapter, int filter_index)
3682 list = g_slist_find_custom(adapter->scan_params, GINT_TO_POINTER(filter_index), adapter_le_scan_params_filter_index_cmp);
3691 static gboolean adapter_le_service_delete_scan_filter_params(struct btd_adapter *adapter,
3692 adapter_le_scan_filter_param_t *params)
3697 list = g_slist_find_custom(adapter->scan_params, GINT_TO_POINTER(params->index), adapter_le_scan_params_filter_index_cmp);
3701 adapter->scan_params = g_slist_remove(adapter->scan_params, list);
3706 static gboolean adapter_le_service_clear_scan_filter_params(struct btd_adapter *adapter)
3710 g_slist_free_full(adapter->scan_params, scan_filter_params_free);
3711 adapter->scan_params = NULL;
3716 int adapter_byte_arr_cmp_with_mask(const char *data1, const char *data2,
3717 const char *mask, int data_len)
3721 if (data1 == NULL || data2 == NULL || mask == NULL)
3723 for (i = 0; i < data_len; i++) {
3724 a = data1[i] & mask[i];
3725 b = data2[i] & mask[i];
3727 return (int)(a - b);
3732 static uint8_t validate_for_filter_policy(struct btd_adapter *adapter,
3733 const struct eir_data *eir, gchar *addr)
3735 uint8_t allow_report = NONE_REPORT;
3738 if (adapter->scan_filter_support == FALSE)
3739 allow_report = SCAN_REPORT;
3741 if (adapter_le_service_find_addr_scan_filter_data(adapter, addr))
3742 allow_report = SCAN_REPORT;
3744 if(adapter_le_service_find_local_name_scan_filter_data(adapter, eir->name))
3745 allow_report = SCAN_REPORT;
3748 GSList *list = NULL;
3749 for (list = eir->sd_list; list != NULL; list = g_slist_next(list)) {
3750 struct eir_sd *sd = list->data;
3752 static adapter_le_uuid_params_t *uuid_data = NULL;
3753 static adapter_le_service_data_params_t *service_data = NULL;
3754 static adapter_le_scan_filter_param_t *scan_param_data = NULL;
3755 uuid_data = adapter_le_service_find_uuid_scan_filter_data(adapter, (uint8_t *)sd->uuid);
3756 service_data = adapter_le_service_find_service_scan_filter_data(adapter, sd);
3757 if (service_data != NULL) {
3758 if (!adapter_byte_arr_cmp_with_mask((const char *)service_data->service_data,
3759 (const char *)sd->data, (const char *)service_data->service_data_mask,
3760 service_data->service_data_len)) {
3761 scan_param_data = adapter_le_service_find_scan_filter_params(adapter,
3762 service_data->filter_index);
3763 if (scan_param_data && scan_param_data->rssi_high_threshold > eir->tx_power &&
3764 scan_param_data->rssi_low_threshold < eir->tx_power)
3765 allow_report = SCAN_REPORT;
3768 if (uuid_data != NULL) {
3769 if (!adapter_byte_arr_cmp_with_mask((const char *)uuid_data->uuid,
3770 (const char *)sd->uuid, (const char *)uuid_data->uuid_mask,
3771 uuid_data->uuid_len)) {
3772 scan_param_data = adapter_le_service_find_scan_filter_params(adapter,
3773 uuid_data->filter_index);
3774 if (scan_param_data && scan_param_data->rssi_high_threshold > eir->tx_power &&
3775 scan_param_data->rssi_low_threshold < eir->tx_power)
3776 allow_report = SCAN_REPORT;
3784 if (eir->msd_list) {
3785 GSList *list = NULL;
3786 for (list = eir->msd_list; list != NULL; list = g_slist_next(list)) {
3787 struct eir_msd *msd = list->data;
3789 static adapter_le_manf_data_params_t *manuf_data;
3790 static adapter_le_scan_filter_param_t *scan_param_data = NULL;
3791 manuf_data = adapter_le_service_find_manufacturer_scan_filter_data(adapter,
3793 if (manuf_data != NULL) {
3794 if (!adapter_byte_arr_cmp_with_mask((const char *)msd->data,
3795 (const char *)manuf_data->man_data, (const char *)manuf_data->man_data_mask,
3796 manuf_data->man_data_len)) {
3797 scan_param_data = adapter_le_service_find_scan_filter_params(adapter,
3798 manuf_data->filter_index);
3799 if (scan_param_data && scan_param_data->rssi_high_threshold > eir->tx_power &&
3800 scan_param_data->rssi_low_threshold < eir->tx_power)
3801 allow_report = SCAN_REPORT;
3803 if (msd->company == COMPANY_ID_APPLE)
3804 allow_report = IBEACON_REPORT;
3810 return allow_report;
3813 gboolean adapter_le_set_platform_scan_filter_params(struct btd_adapter *adapter,
3814 adapter_le_scan_filter_param_t *params)
3816 gboolean ret = TRUE;
3817 DBG("adapter_le_scan_filter_param_t [%d]", params->index);
3818 adapter_le_scan_filter_action_type action_type = params->action;
3820 if (action_type == ADD) {
3821 ret = adapter_le_service_add_scan_filter_params(adapter, params);
3822 } else if (action_type == DELETE) {
3823 ret = adapter_le_service_delete_scan_filter_params(adapter, params);
3824 } else if (action_type == CLEAR) {
3825 ret = adapter_le_service_clear_scan_filter_params(adapter);
3827 DBG("filter_action error");
3831 DBG("Scan Filter VSC :: Action [%x]",
3836 gboolean adapter_le_set_platform_scan_filter_data(struct btd_adapter *adapter,
3837 int client_if, int action,
3838 int filt_type, int filter_index,
3840 int company_id_mask,
3841 int uuid_len, uint8_t *p_uuid,
3842 int uuid_mask_len, uint8_t *p_uuid_mask,
3843 gchar *string, int addr_type,
3844 int data_len, uint8_t *p_data,
3845 int mask_len, uint8_t *p_mask)
3847 gboolean ret = TRUE;
3851 switch (filt_type) {
3852 case TYPE_DEVICE_ADDRESS: {
3853 /* TYPE_DEVICE_ADDRESS */
3854 adapter_le_scan_filter_action_type action_type = action;
3856 if (action_type == ADD) {
3857 ret = adapter_le_service_add_addr_scan_filter_data(adapter,
3858 filter_index, string, addr_type);
3859 } else if (action_type == DELETE) {
3860 ret = adapter_le_service_delete_addr_scan_filter_data(adapter,
3861 filter_index, string, addr_type);
3862 } else if (action_type == CLEAR) {
3863 ret = adapter_le_service_clear_addr_scan_filter_data(adapter);
3865 DBG("filter_action error");
3872 case TYPE_SERVICE_UUID:
3873 case TYPE_SOLICIT_UUID: {
3874 adapter_le_scan_filter_action_type action_type = action;
3876 gboolean is_solicited = (filt_type == TYPE_SOLICIT_UUID) ? TRUE : FALSE;
3878 if (uuid_len != UUID_16_LEN && uuid_len != UUID_32_LEN
3879 && uuid_len != UUID_128_LEN) {
3880 DBG("UUID length error");
3884 if (uuid_len != uuid_mask_len) {
3885 DBG("Both UUID and UUID_MASK length shoule be samed");
3889 if (action_type == ADD) {
3890 ret = adapter_le_service_add_uuid_scan_filter_data(adapter,
3891 filter_index, is_solicited, p_uuid,
3892 p_uuid_mask, uuid_len);
3893 } else if (action_type == DELETE) {
3894 ret = adapter_le_service_delete_uuid_scan_filter_data(adapter,
3895 filter_index, is_solicited, p_uuid,
3896 p_uuid_mask, uuid_len);
3897 } else if (action_type == CLEAR) {
3898 ret = adapter_le_service_clear_uuid_scan_filter_data(adapter);
3900 DBG("filter_action error");
3907 case TYPE_LOCAL_NAME: {
3908 adapter_le_scan_filter_action_type action_type = action;
3910 if (action_type == ADD) {
3911 ret = adapter_le_service_add_local_name_scan_filter_data(adapter,
3912 filter_index, (gchar*)string);
3913 } else if (action_type == DELETE) {
3914 ret = adapter_le_service_delete_local_name_scan_filter_data(adapter,
3915 filter_index, (gchar*)string);
3916 } else if (action_type == CLEAR) {
3917 ret = adapter_le_service_clear_local_name_scan_filter_data(adapter);
3919 DBG("filter_action error");
3926 case TYPE_MANUFACTURER_DATA: {
3927 adapter_le_scan_filter_action_type action_type = action;
3929 if (data_len == 0 || (data_len != mask_len)) {
3930 DBG("parameter length error");
3934 if (action_type == ADD) {
3935 ret = adapter_le_service_add_manufacturer_scan_filter_data(adapter,
3936 filter_index,company_id, company_id_mask, p_data, p_mask, data_len);
3937 } else if (action_type == DELETE) {
3938 ret = adapter_le_service_delete_manufacturer_scan_filter_data(adapter,
3939 filter_index, company_id, company_id_mask, p_data, p_mask, data_len);
3940 } else if (action_type == CLEAR) {
3941 ret = adapter_le_service_clear_manufacturer_scan_filter_data(adapter);
3943 DBG("filter_action error");
3950 case TYPE_SERVICE_DATA: {
3951 adapter_le_scan_filter_action_type action_type = action;
3953 if (data_len == 0 || (data_len != mask_len)) {
3954 DBG("parameter length error");
3958 if (action_type == ADD) {
3959 ret = adapter_le_service_add_service_scan_filter_data(adapter,
3960 filter_index, p_data, p_mask, data_len);
3961 } else if (action_type == DELETE) {
3962 ret = adapter_le_service_delete_service_scan_filter_data(adapter,
3963 filter_index, p_data, p_mask, data_len);
3964 } else if (action_type == CLEAR) {
3965 ret = adapter_le_service_clear_service_scan_filter_data(adapter);
3967 DBG("filter_action error");
3975 DBG("filter_type error");
3983 static int set_adv_data_flag(uint8_t *adv_data, uint8_t *data, int data_len, void *user_data)
3985 struct btd_adapter *adapter = user_data;
3988 adv_data[1] = EIR_FLAGS;
3990 if (adapter->le_static_addr.b[5] != 0)
3991 adv_data[2] = EIR_GEN_DISC | EIR_CONTROLLER |
3992 EIR_SIM_HOST | EIR_BREDR_UNSUP;
3994 adv_data[2] = EIR_GEN_DISC | EIR_CONTROLLER | EIR_SIM_HOST;
3996 memcpy(adv_data + 3, data, data_len);
3997 return data_len + 3;
4000 static int set_adv_data_device_name(uint8_t *adv_data, int adv_len, char *name)
4006 uint8_t *data = NULL;
4011 data = g_memdup(adv_data, adv_len);
4015 name_len = strlen(name);
4017 for (i = 0; i <adv_len ; i++) {
4019 ad_type = data[i + 1];
4021 if (ad_type == EIR_NAME_COMPLETE) {
4022 /* Move to last position and update local name */
4023 for (j = i; j < adv_len - 2; j++)
4024 adv_data[j] = data[j + 2];
4026 adv_data[j] = name_len + 1;
4027 if (name_len > ADV_DATA_MAX_LENGTH - adv_len) {
4028 adv_data[j] = ADV_DATA_MAX_LENGTH - adv_len + 1;
4029 adv_data[j + 1] = EIR_NAME_SHORT;
4030 memcpy(adv_data + j + 2, name, ADV_DATA_MAX_LENGTH - adv_len);
4032 return ADV_DATA_MAX_LENGTH;
4034 adv_data[j + 1] = EIR_NAME_COMPLETE;
4035 memcpy(adv_data + j + 2, name, name_len);
4037 return adv_len + name_len;
4041 memcpy(adv_data + i, &data[i], ad_len + 1);
4050 static int set_adv_data_tx_power(uint8_t *adv_data, int adv_len, int8_t tx_power)
4055 uint8_t *data = NULL;
4057 data = g_memdup(adv_data, adv_len);
4061 for (i = 0; i <adv_len ; i++) {
4063 ad_type = data[i + 1];
4065 if (ad_type == EIR_TX_POWER) {
4067 adv_data[i + 1] = EIR_TX_POWER;
4068 adv_data[i + 2] = tx_power;
4070 for(j = i + 2; j < adv_len; j++)
4071 adv_data[j + 1] = data[j];
4076 memcpy(adv_data + i, &data[i], ad_len + 1);
4086 static int adapter_le_set_missed_adv_data(uint8_t *p_data, uint8_t data_len,
4087 gboolean is_scan_rsp, char *adapter_name, int8_t tx_power, uint8_t **adv_data, int *adv_len,
4093 data = g_malloc0(ADV_DATA_MAX_LENGTH);
4094 memcpy(data, p_data, data_len);
4097 /* In case multi advertising, need to update the below AD type
4098 since it handled into kernel */
4100 len = set_adv_data_flag(data, p_data, data_len, user_data);
4103 len = set_adv_data_tx_power(data, len, tx_power);
4105 len = set_adv_data_device_name(data, len, adapter_name);
4112 static DBusMessage *adapter_start_custom_discovery(DBusConnection *conn,
4113 DBusMessage *msg, void *user_data)
4115 struct btd_adapter *adapter = user_data;
4116 const char *sender = dbus_message_get_sender(msg);
4117 struct watch_client *client;
4119 const gchar *disc_type;
4121 DBG("sender %s", sender);
4123 if (!(adapter->current_settings & MGMT_SETTING_POWERED))
4124 return btd_error_not_ready(msg);
4126 if (!dbus_message_get_args(msg, NULL, DBUS_TYPE_STRING, &disc_type,
4127 DBUS_TYPE_INVALID)) {
4128 return btd_error_invalid_args(msg);
4131 DBG("discovery type = %s", disc_type);
4133 /*Valid strings: "BREDR", "LE", "LE_BREDR" */
4134 if (g_strcmp0(disc_type, "BREDR") == 0)
4135 adapter->disc_type = BT_DISC_TYPE_BREDR_ONLY;
4136 else if (g_strcmp0(disc_type, "LE") == 0)
4137 adapter->disc_type = BT_DISC_TYPE_LE_ONLY;
4138 else if (g_strcmp0(disc_type, "LE_BREDR") == 0)
4139 adapter->disc_type = BT_DISC_TYPE_LE_BREDR;
4141 return btd_error_invalid_args(msg);
4144 * Every client can only start one discovery, if the client
4145 * already started a discovery then return an error.
4147 list = g_slist_find_custom(adapter->discovery_list, sender,
4150 return btd_error_busy(msg);
4152 client = g_new0(struct watch_client, 1);
4154 client->adapter = adapter;
4155 client->owner = g_strdup(sender);
4156 client->watch = g_dbus_add_disconnect_watch(dbus_conn, sender,
4157 discovery_disconnect, client,
4160 adapter->discovery_list = g_slist_prepend(adapter->discovery_list,
4164 * Just trigger the discovery here. In case an already running
4165 * discovery in idle phase exists, it will be restarted right
4168 trigger_start_discovery(adapter, 0);
4170 return dbus_message_new_method_return(msg);
4173 static DBusMessage *adapter_start_le_discovery(DBusConnection *conn,
4174 DBusMessage *msg, void *user_data)
4176 struct btd_adapter *adapter = user_data;
4177 const char *sender = dbus_message_get_sender(msg);
4178 struct watch_client *client;
4181 DBG("sender %s", sender);
4183 if (!(adapter->current_settings & MGMT_SETTING_POWERED))
4184 return btd_error_not_ready(msg);
4187 * Every client can only start one discovery, if the client
4188 * already started a discovery then return an error.
4191 adapter->disc_type = BT_DISC_TYPE_LE_ONLY;
4192 DBG("adapter->disc_type[%d]", adapter->disc_type);
4193 DBG("adapter->discovery_type [%d]", adapter->discovery_type);
4195 list = g_slist_find_custom(adapter->le_discovery_list, sender,
4198 return btd_error_busy(msg);
4200 client = g_new0(struct watch_client, 1);
4202 client->adapter = adapter;
4203 client->owner = g_strdup(sender);
4204 client->watch = g_dbus_add_disconnect_watch(dbus_conn, sender,
4205 le_discovery_disconnect, client,
4206 le_discovery_destroy);
4208 adapter->le_discovery_list = g_slist_prepend(adapter->le_discovery_list,
4212 * Just trigger the discovery here. In case an already running
4213 * discovery in idle phase exists, it will be restarted right
4216 trigger_start_le_discovery(adapter, 0);
4218 return dbus_message_new_method_return(msg);
4221 static DBusMessage *adapter_stop_le_discovery(DBusConnection *conn,
4222 DBusMessage *msg, void *user_data)
4224 struct btd_adapter *adapter = user_data;
4225 const char *sender = dbus_message_get_sender(msg);
4226 struct mgmt_cp_stop_le_discovery cp;
4227 struct watch_client *client;
4230 DBG("sender %s", sender);
4232 if (adapter->le_discovery_idle_timeout > 0) {
4233 DBG("Remove LE scan trigger");
4234 g_source_remove(adapter->le_discovery_idle_timeout);
4235 adapter->le_discovery_idle_timeout = 0;
4238 if (!(adapter->current_settings & MGMT_SETTING_POWERED))
4239 return btd_error_not_ready(msg);
4241 list = g_slist_find_custom(adapter->le_discovery_list, sender,
4244 return btd_error_failed(msg, "No discovery started");
4246 client = list->data;
4248 adapter->disc_type = BT_DISC_TYPE_LE_ONLY;
4249 DBG("adapter->disc_type[%d]", adapter->disc_type);
4250 DBG("adapter->discovery_type [%d]", adapter->discovery_type);
4252 cp.type = adapter->discovery_type;
4253 DBG("cp.type %d", cp.type);
4256 * As long as other discovery clients are still active, just
4257 * clenup client info and return success.
4259 DBG("adapter->le_discovery_list %p", adapter->le_discovery_list);
4260 if (g_slist_next(adapter->le_discovery_list)) {
4262 * The destroy function will cleanup the client information and
4263 * also remove it from the list of discovery clients.
4265 g_dbus_remove_watch(dbus_conn, client->watch);
4266 return dbus_message_new_method_return(msg);
4270 * In the idle phase of a discovery, there is no need to stop it
4271 * and so it is enough to send out the signal and just return.
4273 DBG("cp.type %d", cp.type);
4274 DBG("adapter->discovery_enable %d", adapter->discovery_enable);
4275 if (adapter->discovery_enable == 0x00) {
4276 g_dbus_remove_watch(dbus_conn, client->watch);
4277 adapter->le_discovering = false;
4278 g_dbus_emit_property_changed(dbus_conn, adapter->path,
4279 ADAPTER_INTERFACE, "LEDiscovering");
4281 trigger_passive_scanning(adapter);
4282 return dbus_message_new_method_return(msg);
4285 DBG("adapter->discovery_type %d", adapter->discovery_type);
4287 DBG("cp.type %d", cp.type);
4288 mgmt_send(adapter->mgmt, MGMT_OP_STOP_LE_DISCOVERY,
4289 adapter->dev_id, sizeof(cp), &cp,
4290 stop_le_discovery_complete, client, NULL);
4292 client->msg = dbus_message_ref(msg);
4296 static DBusMessage *adapter_set_advertising(DBusConnection *conn,
4297 DBusMessage *msg, void *data)
4299 struct btd_adapter *adapter = data;
4301 dbus_bool_t enable = FALSE;
4302 dbus_int32_t slot_id;
4304 if (!(adapter->current_settings & MGMT_SETTING_POWERED))
4305 return btd_error_not_ready(msg);
4307 if (!dbus_message_get_args(msg, NULL, DBUS_TYPE_BOOLEAN, &enable,
4308 DBUS_TYPE_INT32, &slot_id,
4310 return btd_error_invalid_args(msg);
4312 DBG("%s advertising slot_id %d", enable ? "Enable" : "Disable", slot_id);
4314 if (adapter_le_is_supported_multi_advertising() && slot_id > 0)
4315 err = adapter_le_enable_multi_adv(adapter, enable, slot_id);
4317 err = set_mode(adapter, MGMT_OP_SET_ADVERTISING, enable);
4320 return btd_error_failed(msg, "Set Advertising failed");
4323 create_advertiser(adapter, slot_id);
4325 if (err && slot_id > 0)
4326 advertising_state_changed(adapter, slot_id, enable);
4328 return dbus_message_new_method_return(msg);
4331 static DBusMessage *adapter_set_advertising_params(DBusConnection *conn,
4332 DBusMessage *msg, void *data)
4334 struct btd_adapter *adapter = data;
4335 struct mgmt_cp_set_advertising_params cp;
4336 dbus_uint32_t interval_min;
4337 dbus_uint32_t interval_max;
4338 dbus_uint32_t filter_policy;
4340 dbus_int32_t slot_id;
4343 DBG("Set customised advertising parameters");
4345 if (!(adapter->current_settings & MGMT_SETTING_POWERED))
4346 return btd_error_not_ready(msg);
4348 if (!dbus_message_get_args(msg, NULL,
4349 DBUS_TYPE_UINT32, &interval_min,
4350 DBUS_TYPE_UINT32, &interval_max,
4351 DBUS_TYPE_UINT32, &filter_policy,
4352 DBUS_TYPE_UINT32, &type,
4353 DBUS_TYPE_INT32, &slot_id,
4355 return btd_error_invalid_args(msg);
4357 memset(&cp, 0, sizeof(cp));
4359 DBG("advertising interval min %x, max %x, filter %x type %x",
4360 interval_min, interval_max, filter_policy, type);
4362 if (filter_policy > 0x03)
4363 return btd_error_invalid_args(msg);
4366 return btd_error_invalid_args(msg);
4368 if (adapter_le_is_supported_multi_advertising() && slot_id > 0) {
4369 adapter_le_adv_inst_info_t *p_inst;
4370 adapter_le_adv_param_t *p_params;
4372 p_inst = malloc(sizeof(adapter_le_adv_inst_info_t));
4373 p_params = malloc(sizeof(adapter_le_adv_param_t));
4374 memset(p_inst, 0, sizeof(adapter_le_adv_inst_info_t));
4375 memset(p_params, 0, sizeof(adapter_le_adv_param_t));
4376 p_inst->inst_id = slot_id;
4377 p_params->adv_int_min = interval_min;
4378 p_params->adv_int_max = interval_max;
4379 p_params->adv_type = type;
4380 p_params->channel_map = 0x07; /* fixed channel :: will be used all */
4381 p_params->adv_filter_policy = filter_policy;
4382 p_params->tx_power = BLE_ADV_TX_POWER_MID; /* TODO:need to optimize */
4383 if (adapter->le_static_addr.b[5] != 0) {
4384 p_inst->bdaddr_type = 0x01;
4385 bacpy(&p_inst->bdaddr, &adapter->le_static_addr);
4387 p_inst->bdaddr_type = 0x00;
4388 bacpy(&p_inst->bdaddr, &adapter->bdaddr);
4391 ret = adapter_le_set_multi_adv_params(p_inst, p_params);
4397 return dbus_message_new_method_return(msg);
4399 return btd_error_failed(msg, "set advertising param failed");
4401 cp.interval_max = interval_max;
4402 cp.interval_min = interval_min;
4403 cp.filter_policy = filter_policy;
4406 if (mgmt_send(adapter->mgmt, MGMT_OP_SET_ADVERTISING_PARAMS,
4407 adapter->dev_id, sizeof(cp), &cp,
4408 NULL, NULL, NULL) > 0)
4409 return dbus_message_new_method_return(msg);
4411 return btd_error_failed(msg, "set advertising param failed");
4415 static DBusMessage *adapter_set_advertising_data(DBusConnection *conn,
4416 DBusMessage *msg, void *data)
4418 struct btd_adapter *adapter = data;
4419 struct mgmt_cp_set_advertising_data cp;
4422 dbus_int32_t slot_id;
4423 uint8_t *adv_data = NULL;
4425 char *adapter_name = adapter->name;
4426 char le_name[MAX_NAME_LENGTH + 1] = { 0 };
4428 DBG("Set advertising data");
4430 if (!(adapter->current_settings & MGMT_SETTING_POWERED))
4431 return btd_error_not_ready(msg);
4433 if (!dbus_message_get_args(msg, NULL,
4434 DBUS_TYPE_ARRAY, DBUS_TYPE_BYTE, &value, &len,
4435 DBUS_TYPE_INT32, &slot_id,
4437 return btd_error_invalid_args(msg);
4439 if (len > ADV_DATA_MAX_LENGTH - 3)
4440 return btd_error_invalid_args(msg);
4442 if (adapter->le_static_addr.b[5] != 0) {
4445 g_strlcpy(le_name, adapter_name,
4446 sizeof(le_name) - LE_BEARER_POSTFIX_LEN);
4447 if (!g_utf8_validate(le_name, -1, (const char **)&ptr))
4450 g_strlcat(le_name, LE_BEARER_POSTFIX, sizeof(le_name));
4451 adapter_name = le_name;
4454 adapter_le_set_missed_adv_data(value, len, FALSE,
4455 adapter_name, adapter->adv_tx_power, &adv_data, &adv_len, adapter);
4457 if (adapter_le_is_supported_multi_advertising() && slot_id > 0) {
4458 if (adapter_le_set_multi_adv_data(slot_id, FALSE, adv_len, adv_data)) {
4460 return dbus_message_new_method_return(msg);
4463 return btd_error_failed(msg, "set advertising data failed");
4466 memcpy(&cp, adv_data, adv_len);
4468 if (mgmt_send(adapter->mgmt, MGMT_OP_SET_ADVERTISING_DATA,
4469 adapter->dev_id, adv_len,
4470 &cp, NULL, NULL, NULL) > 0) {
4472 return dbus_message_new_method_return(msg);
4476 return btd_error_failed(msg, "set advertising data failed");
4480 static DBusMessage *adapter_le_scan_filter_param_setup(DBusConnection *conn,
4481 DBusMessage *msg, void *data)
4483 struct btd_adapter *adapter = data;
4484 #ifdef TIZEN_FEATURE_PLATFROM_SCAN_FILTER
4485 dbus_bool_t ctlr_filter_support = TRUE;
4487 dbus_int32_t client_if, action, filt_index;
4488 dbus_int32_t feat_seln, list_logic_type, filt_logic_type;
4489 dbus_int32_t rssi_high_thres, rssi_low_thres, dely_mode;
4490 dbus_int32_t found_timeout, lost_timeout, found_timeout_cnt;
4491 adapter_le_scan_filter_param_t params;
4494 DBG("adapter_le_scan_filter_param_setup");
4496 if (!(adapter->current_settings & MGMT_SETTING_POWERED))
4497 return btd_error_not_ready(msg);
4499 if (adapter_le_get_scan_filter_size() == 0)
4500 #ifndef TIZEN_FEATURE_PLATFROM_SCAN_FILTER
4501 return btd_error_not_supported(msg);
4503 ctlr_filter_support = FALSE;
4506 if (!dbus_message_get_args(msg, NULL, DBUS_TYPE_INT32, &client_if,
4507 DBUS_TYPE_INT32, &action,
4508 DBUS_TYPE_INT32, &filt_index,
4509 DBUS_TYPE_INT32, &feat_seln,
4510 DBUS_TYPE_INT32, &list_logic_type,
4511 DBUS_TYPE_INT32, &filt_logic_type,
4512 DBUS_TYPE_INT32, &rssi_high_thres,
4513 DBUS_TYPE_INT32, &rssi_low_thres,
4514 DBUS_TYPE_INT32, &dely_mode,
4515 DBUS_TYPE_INT32, &found_timeout,
4516 DBUS_TYPE_INT32, &lost_timeout,
4517 DBUS_TYPE_INT32, &found_timeout_cnt,
4519 return btd_error_invalid_args(msg);
4521 memset(¶ms, 0, sizeof(params));
4523 params.action = action;
4524 params.index = filt_index;
4525 params.feature = feat_seln;
4526 params.filter_logic_type = filt_logic_type;
4527 params.list_logic_type = list_logic_type;
4528 params.delivery_mode = dely_mode;
4529 params.rssi_high_threshold = rssi_high_thres;
4531 if (params.delivery_mode == ON_FOUND) {
4532 params.rssi_low_threshold = rssi_low_thres;
4533 params.onfound_timeout = found_timeout;
4534 params.onfound_timeout_cnt = found_timeout_cnt;
4535 params.onlost_timeout = lost_timeout;
4538 #ifdef TIZEN_FEATURE_PLATFROM_SCAN_FILTER
4539 if (ctlr_filter_support)
4541 err = adapter_le_set_scan_filter_params(¶ms);
4542 #ifdef TIZEN_FEATURE_PLATFROM_SCAN_FILTER
4544 err = adapter_le_set_platform_scan_filter_params(adapter, ¶ms);
4548 return btd_error_failed(msg, "Failed to scan filter param setup");
4550 return dbus_message_new_method_return(msg);
4553 static DBusMessage *adapter_le_scan_filter_add_remove(DBusConnection *conn,
4554 DBusMessage *msg, void *data)
4556 struct btd_adapter *adapter = data;
4557 struct btd_device *dev = NULL;
4558 dbus_int32_t client_if, action, filt_type, filt_index;
4559 dbus_int32_t company_id, company_id_mask;
4560 gchar *address = NULL;
4561 dbus_uint32_t address_type = 0;
4564 char ida_string[18];
4565 uint8_t *p_uuid, *p_uuid_mask, *p_data, *p_mask;
4566 int32_t uuid_len = 0, uuid_mask_len = 0, data_len = 0, mask_len = 0;
4568 #ifdef TIZEN_FEATURE_PLATFROM_SCAN_FILTER
4569 dbus_bool_t ctlr_filter_support = TRUE;
4572 DBG("adapter_le_scan_filter_add_remove");
4574 if (!(adapter->current_settings & MGMT_SETTING_POWERED))
4575 return btd_error_not_ready(msg);
4577 /* if controller does not support vendor specific scan filtering feature
4578 * then add the filter into platform supported scan filters.
4580 if (adapter_le_get_scan_filter_size() == 0) {
4581 #ifndef TIZEN_FEATURE_PLATFROM_SCAN_FILTER
4582 return btd_error_not_supported(msg);
4584 ctlr_filter_support = FALSE;
4588 if (!dbus_message_get_args(msg, NULL, DBUS_TYPE_INT32, &client_if,
4589 DBUS_TYPE_INT32, &action,
4590 DBUS_TYPE_INT32, &filt_type,
4591 DBUS_TYPE_INT32, &filt_index,
4592 DBUS_TYPE_INT32, &company_id,
4593 DBUS_TYPE_INT32, &company_id_mask,
4594 DBUS_TYPE_ARRAY, DBUS_TYPE_BYTE, &p_uuid, &uuid_len,
4595 DBUS_TYPE_ARRAY, DBUS_TYPE_BYTE, &p_uuid_mask, &uuid_mask_len,
4596 DBUS_TYPE_STRING, &address,
4597 DBUS_TYPE_UINT32, &address_type,
4598 DBUS_TYPE_ARRAY, DBUS_TYPE_BYTE, &p_data, &data_len,
4599 DBUS_TYPE_ARRAY, DBUS_TYPE_BYTE, &p_mask, &mask_len,
4601 return btd_error_invalid_args(msg);
4603 list = g_slist_find_custom(adapter->devices, address, device_rpa_cmp);
4605 list = g_slist_find_custom(adapter->devices, address,
4606 device_address_cmp);
4609 if (dev && device_get_rpa_exist(dev) == true) {
4610 ba2str(device_get_address(dev), ida_string);
4611 if (btd_device_get_bdaddr_type(dev) == BDADDR_LE_PUBLIC)
4616 memcpy(ida_string, address, sizeof(ida_string));
4620 DBG("addr %s, type %d", ida_string, addr_type);
4622 #ifdef TIZEN_FEATURE_PLATFROM_SCAN_FILTER
4623 if (ctlr_filter_support)
4625 err = adapter_le_set_scan_filter_data(client_if, action, filt_type,
4626 filt_index, company_id, company_id_mask,
4627 uuid_len, p_uuid, uuid_mask_len, p_uuid_mask,
4628 ida_string, addr_type, data_len, p_data, mask_len, p_mask);
4629 #ifdef TIZEN_FEATURE_PLATFROM_SCAN_FILTER
4631 err = adapter_le_set_platform_scan_filter_data(adapter, client_if, action, filt_type,
4632 filt_index, company_id, company_id_mask,
4633 uuid_len, p_uuid, uuid_mask_len, p_uuid_mask,
4634 ida_string, addr_type, data_len, p_data, mask_len, p_mask);
4637 return btd_error_failed(msg, "Failed to add/remove filter");
4639 return dbus_message_new_method_return(msg);
4642 static DBusMessage *adapter_le_scan_filter_clear(DBusConnection *conn,
4643 DBusMessage *msg, void *data)
4645 struct btd_adapter *adapter = data;
4646 dbus_int32_t client_if = 0;
4647 dbus_int32_t filt_index = 0;
4649 #ifdef TIZEN_FEATURE_PLATFROM_SCAN_FILTER
4650 dbus_bool_t ctlr_filter_support = TRUE;
4653 DBG("adapter_le_scan_filter_clear");
4655 if (!(adapter->current_settings & MGMT_SETTING_POWERED))
4656 return btd_error_not_ready(msg);
4658 if (adapter_le_get_scan_filter_size() == 0)
4659 #ifndef TIZEN_FEATURE_PLATFROM_SCAN_FILTER
4660 return btd_error_not_supported(msg);
4662 ctlr_filter_support = FALSE;
4665 if (!dbus_message_get_args(msg, NULL, DBUS_TYPE_INT32, &client_if,
4666 DBUS_TYPE_INT32, &filt_index,
4668 return btd_error_invalid_args(msg);
4670 #ifdef TIZEN_FEATURE_PLATFROM_SCAN_FILTER
4671 if (ctlr_filter_support)
4673 err = adapter_le_clear_scan_filter_data(client_if, filt_index);
4674 #ifdef TIZEN_FEATURE_PLATFROM_SCAN_FILTER
4676 err = adapter_le_clear_platform_scan_filter_data(adapter, filt_index);
4680 return btd_error_failed(msg, "Failed to clear filter");
4682 return dbus_message_new_method_return(msg);
4686 static DBusMessage *adapter_le_scan_filter_enable(DBusConnection *conn,
4687 DBusMessage *msg, void *data)
4689 struct btd_adapter *adapter = data;
4690 dbus_bool_t enable = FALSE;
4691 dbus_int32_t client_if = 0;
4693 #ifdef TIZEN_FEATURE_PLATFROM_SCAN_FILTER
4694 dbus_bool_t ctlr_filter_support = TRUE;
4697 DBG("adapter_le_scan_filter_enable");
4699 if (!(adapter->current_settings & MGMT_SETTING_POWERED))
4700 return btd_error_not_ready(msg);
4702 #ifdef TIZEN_FEATURE_PLATFROM_SCAN_FILTER
4703 /* if controller does not support vendor specific scan filtering feature
4704 * then enable platform supported scan filtering functionalites.
4707 if (adapter_le_get_scan_filter_size() == 0)
4708 #ifndef TIZEN_FEATURE_PLATFROM_SCAN_FILTER
4709 return btd_error_not_supported(msg);
4711 ctlr_filter_support = FALSE;
4714 if (!dbus_message_get_args(msg, NULL, DBUS_TYPE_INT32, &client_if,
4715 DBUS_TYPE_BOOLEAN, &enable,
4717 return btd_error_invalid_args(msg);
4719 #ifdef TIZEN_FEATURE_PLATFROM_SCAN_FILTER
4720 if (ctlr_filter_support)
4722 err = adapter_le_enable_scan_filtering(enable);
4723 #ifdef TIZEN_FEATURE_PLATFROM_SCAN_FILTER
4725 err = adapter_le_enable_platform_scan_filtering(adapter, enable);
4729 return btd_error_failed(msg, "Failed to enable scan filtering");
4731 return dbus_message_new_method_return(msg);
4734 static DBusMessage *adapter_le_set_scan_params(DBusConnection *conn,
4735 DBusMessage *msg, void *data)
4737 struct btd_adapter *adapter = data;
4738 struct mgmt_cp_le_set_scan_params cp;
4743 DBG("Set scan parameters");
4745 if (!(adapter->current_settings & MGMT_SETTING_POWERED))
4746 return btd_error_not_ready(msg);
4748 if (!dbus_message_get_args(msg, NULL,
4749 DBUS_TYPE_UINT32, &type,
4750 DBUS_TYPE_UINT32, &interval,
4751 DBUS_TYPE_UINT32, &window,
4753 return btd_error_invalid_args(msg);
4755 DBG("scan type %x, interval %x, window %x",
4756 type, interval, window);
4757 memset(&cp, 0, sizeof(cp));
4760 cp.interval = interval;
4762 adapter->scan_type = type;
4764 if (mgmt_send(adapter->mgmt, MGMT_OP_LE_SET_SCAN_PARAMS,
4765 adapter->dev_id, sizeof(cp), &cp,
4766 NULL, NULL, NULL) > 0)
4767 return dbus_message_new_method_return(msg);
4769 return btd_error_failed(msg, "set scan parameters failed");
4772 static DBusMessage *adapter_set_scan_rsp_data(DBusConnection *conn,
4773 DBusMessage *msg, void *data)
4775 struct btd_adapter *adapter = data;
4776 struct mgmt_cp_set_scan_rsp_data cp;
4779 dbus_int32_t slot_id;
4780 uint8_t *adv_data = NULL;
4783 char *adapter_name = adapter->name;
4784 char le_name[MAX_NAME_LENGTH + 1] = { 0 };
4786 DBG("Set scan response data");
4788 if (!(adapter->current_settings & MGMT_SETTING_POWERED))
4789 return btd_error_not_ready(msg);
4791 if (!dbus_message_get_args(msg, NULL,
4792 DBUS_TYPE_ARRAY, DBUS_TYPE_BYTE, &value, &len,
4793 DBUS_TYPE_INT32, &slot_id,
4795 return btd_error_invalid_args(msg);
4797 if (len > SCAN_RESPONSE_DATA_LENGTH_MAX)
4798 return btd_error_invalid_args(msg);
4800 if (adapter->le_static_addr.b[5] != 0) {
4803 g_strlcpy(le_name, adapter_name,
4804 sizeof(le_name) - LE_BEARER_POSTFIX_LEN);
4805 if (!g_utf8_validate(le_name, -1, (const char **)&ptr))
4808 g_strlcat(le_name, LE_BEARER_POSTFIX, sizeof(le_name));
4809 adapter_name = le_name;
4812 adapter_le_set_missed_adv_data(value, len, TRUE,
4813 adapter_name, adapter->adv_tx_power, &adv_data, &adv_len, adapter);
4815 if (adapter_le_is_supported_multi_advertising() && slot_id > 0) {
4816 if (adapter_le_set_multi_adv_data(slot_id, TRUE, adv_len, (uint8_t *)adv_data)) {
4818 return dbus_message_new_method_return(msg);
4821 return btd_error_failed(msg, "set advertising data failed");
4824 memcpy(&cp, adv_data, adv_len);
4826 if (mgmt_send(adapter->mgmt, MGMT_OP_SET_SCAN_RSP_DATA,
4827 adapter->dev_id, adv_len, &cp,
4828 NULL, NULL, NULL) > 0) {
4830 return dbus_message_new_method_return(msg);
4834 return btd_error_failed(msg, "set scan reponse data failed");
4838 static DBusMessage *adapter_add_device_white_list(DBusConnection *conn,
4839 DBusMessage *msg, void *data)
4841 struct btd_adapter *adapter = data;
4842 struct mgmt_cp_add_dev_white_list cp;
4843 const gchar *address;
4845 dbus_uint32_t address_type;
4846 struct btd_device *dev;
4848 DBG("Add device whie list");
4849 if (dbus_message_get_args(msg, NULL,
4850 DBUS_TYPE_STRING, &address,
4851 DBUS_TYPE_UINT32, &address_type,
4852 DBUS_TYPE_INVALID) == FALSE)
4853 return btd_error_invalid_args(msg);
4855 if (bachk(address) < 0)
4856 return btd_error_invalid_args(msg);
4858 if (!(adapter->current_settings & MGMT_SETTING_POWERED))
4859 return btd_error_not_ready(msg);
4861 DBG("addr %s, type %d", address, address_type);
4862 str2ba(address, &bdaddr);
4864 dev = btd_adapter_find_device(adapter, &bdaddr,
4865 address_type ? BDADDR_LE_RANDOM : BDADDR_LE_PUBLIC);
4866 if (dev && device_get_rpa_exist(dev) == true) {
4867 if (adapter_le_is_supported_offloading() == FALSE) {
4868 error("Spec based command is not supported yet");
4869 return btd_error_not_supported(msg);
4872 /* Add IRK value to list */
4873 if (adapter_le_add_irk_to_list(device_get_irk_value(dev),
4874 device_get_address(dev),
4875 btd_device_get_bdaddr_type(dev))) {
4876 return dbus_message_new_method_return(msg);
4878 return btd_error_failed(msg, "Add LE IRK to list failed");
4882 memset(&cp, 0, sizeof(cp));
4884 cp.bdaddr_type = address_type;
4885 memcpy(&cp.bdaddr, &bdaddr, sizeof(bdaddr_t));
4887 if (mgmt_send(adapter->mgmt, MGMT_OP_ADD_DEV_WHITE_LIST,
4888 adapter->dev_id, sizeof(cp), &cp,
4889 NULL, NULL, NULL) > 0)
4890 return dbus_message_new_method_return(msg);
4892 return btd_error_failed(msg, "add device white list failed");
4895 static DBusMessage *adapter_remove_device_white_list(DBusConnection *conn,
4896 DBusMessage *msg, void *data)
4898 struct btd_adapter *adapter = data;
4899 struct mgmt_cp_remove_dev_white_list cp;
4900 const gchar *address;
4902 dbus_uint32_t address_type;
4903 struct btd_device *dev;
4905 DBG("Remove device whie list");
4907 if (!(adapter->current_settings & MGMT_SETTING_POWERED))
4908 return btd_error_not_ready(msg);
4910 if (dbus_message_get_args(msg, NULL,
4911 DBUS_TYPE_STRING, &address,
4912 DBUS_TYPE_UINT32, &address_type,
4913 DBUS_TYPE_INVALID) == FALSE)
4914 return btd_error_invalid_args(msg);
4916 if (bachk(address) < 0)
4917 return btd_error_invalid_args(msg);
4919 DBG("addr %s, type %d", address, address_type);
4920 str2ba(address, &bdaddr);
4922 dev = btd_adapter_find_device(adapter, &bdaddr,
4923 address_type ? BDADDR_LE_RANDOM : BDADDR_LE_PUBLIC);
4924 if (dev && device_get_rpa_exist(dev) == true) {
4925 if (adapter_le_is_supported_offloading() == FALSE) {
4926 error("Spec based command is not supported yet");
4927 return btd_error_not_supported(msg);
4930 /* Remove IRK value to list */
4931 if (adapter_le_remove_irk_to_list(device_get_address(dev),
4932 btd_device_get_bdaddr_type(dev))) {
4933 return dbus_message_new_method_return(msg);
4935 return btd_error_failed(msg, "Remove IRK is failed");
4939 memset(&cp, 0, sizeof(cp));
4941 cp.bdaddr_type = address_type;
4942 memcpy(&cp.bdaddr, &bdaddr, sizeof(bdaddr_t));
4944 if (mgmt_send(adapter->mgmt, MGMT_OP_REMOVE_DEV_FROM_WHITE_LIST,
4945 adapter->dev_id, sizeof(cp), &cp,
4946 NULL, NULL, NULL) > 0)
4947 return dbus_message_new_method_return(msg);
4949 return btd_error_failed(msg, "remove device white list failed");
4952 static DBusMessage *adapter_clear_device_white_list(DBusConnection *conn,
4953 DBusMessage *msg, void *data)
4955 struct btd_adapter *adapter = data;
4957 DBG("Clear device whie list");
4959 if (!(adapter->current_settings & MGMT_SETTING_POWERED))
4960 return btd_error_not_ready(msg);
4962 if (mgmt_send(adapter->mgmt, MGMT_OP_CLEAR_DEV_WHITE_LIST,
4963 adapter->dev_id, 0, NULL,
4964 NULL, NULL, NULL) > 0)
4965 return dbus_message_new_method_return(msg);
4967 return btd_error_failed(msg, "clear white list failed");
4970 static DBusMessage *adapter_set_le_privacy(DBusConnection *conn,
4971 DBusMessage *msg, void *data)
4973 struct btd_adapter *adapter = data;
4975 dbus_bool_t enable_privacy = FALSE;
4977 if (!(adapter->supported_settings & MGMT_SETTING_PRIVACY))
4978 return btd_error_not_supported(msg);
4980 if (!dbus_message_get_args(msg, NULL, DBUS_TYPE_BOOLEAN,
4981 &enable_privacy, DBUS_TYPE_INVALID))
4982 return btd_error_invalid_args(msg);
4984 if (enable_privacy) {
4985 if (adapter->current_settings & MGMT_SETTING_PRIVACY)
4986 return btd_error_already_exists(msg);
4988 if (!(adapter->current_settings & MGMT_SETTING_PRIVACY))
4989 return btd_error_already_exists(msg);
4992 err = set_privacy(adapter, enable_privacy);
4995 return btd_error_failed(msg, "Set Le Privacy failed");
4997 return dbus_message_new_method_return(msg);
5000 static void set_le_static_address(struct btd_adapter *adapter)
5005 char dirname[PATH_MAX];
5007 snprintf(dirname, PATH_MAX, STORAGEDIR "/%s", "le_static_addr");
5008 if (access(dirname, F_OK) < 0) {
5010 bdaddr_t le_static_addr;
5012 le_static_addr.b[5] = adapter->bdaddr.b[5] | 0xc0;
5013 for (i = 0; i < 5; i++) {
5014 le_static_addr.b[i] =
5015 (adapter->bdaddr.b[i] & 0x7f) << 1 |
5016 (adapter->bdaddr.b[i] & 0x80) >> 7;
5020 * < How to get Public address from above static address >
5022 * for (i = 0; i < 5; i++) {
5024 * (adapter->le_static_addr.b[i] & 0xfe) >> 1 |
5025 * (adapter->le_static_addr.b[i] & 0x01) << 7;
5027 * bredr_addr.b[5] = {the value from advertising data}
5030 fd = open(dirname, O_WRONLY | O_CREAT, 0644);
5032 ba2str(&le_static_addr, address);
5033 DBG("LE static random : %s", address);
5034 ret = write(fd, address, strlen(address));
5036 error("Cannot save LE address : %s",
5040 ret = fdatasync(fd);
5042 error("sync failed : %s", strerror(errno));
5046 error("Cannot save LE address");
5048 bacpy(&adapter->le_static_addr, &le_static_addr);
5050 fd = open(dirname, O_RDONLY);
5052 ret = read(fd, address, sizeof(address));
5054 /* xx:xx:xx:xx:xx:xx */
5056 DBG("LE static random : %s", address);
5057 str2ba(address, &adapter->le_static_addr);
5058 adapter->le_static_addr.b[5] |= 0xc0;
5060 error("Invalid LE address");
5063 error("Cannot get LE address");
5070 static void set_le_static_address_complete(uint8_t status, uint16_t length,
5071 const void *param, void *user_data)
5073 struct btd_adapter *adapter = user_data;
5075 DBG("index %u status 0x%02x", adapter->dev_id, status);
5077 if (status != MGMT_STATUS_SUCCESS) {
5078 error("Failed to set static address for index %u: %s (0x%02x)",
5079 adapter->dev_id, mgmt_errstr(status), status);
5080 if (adapter->le_static_addr.b[5] != 0)
5081 bacpy(&adapter->le_static_addr, BDADDR_ANY);
5083 set_le_static_address(adapter);
5090 static DBusMessage *adapter_set_le_static_address(DBusConnection *conn,
5091 DBusMessage *msg, void *data)
5093 struct btd_adapter *adapter = data;
5094 dbus_bool_t is_enable = FALSE;
5095 struct mgmt_cp_set_static_address cp;
5097 if (!(adapter->supported_settings & MGMT_OP_SET_STATIC_ADDRESS)) {
5098 error("LE static address is not supported");
5099 return btd_error_not_supported(msg);
5102 if (!dbus_message_get_args(msg, NULL, DBUS_TYPE_BOOLEAN, &is_enable,
5103 DBUS_TYPE_INVALID)) {
5104 error("Invalid arguments");
5105 return btd_error_invalid_args(msg);
5108 memset(&cp, 0x00, sizeof(cp));
5110 if (adapter->le_static_addr.b[5] != 0) {
5111 DBG("LE static address is already configured");
5112 return dbus_message_new_method_return(msg);
5114 set_le_static_address(adapter);
5115 bacpy(&cp.bdaddr, &adapter->le_static_addr);
5117 if (adapter->le_static_addr.b[5] == 0) {
5118 DBG("LE static address is not configured");
5119 return dbus_message_new_method_return(msg);
5121 bacpy(&adapter->le_static_addr, BDADDR_ANY);
5123 DBG("Set static random address : %d", is_enable);
5125 if (mgmt_send(mgmt_master, MGMT_OP_SET_STATIC_ADDRESS, adapter->dev_id,
5127 set_le_static_address_complete, adapter, NULL) <= 0) {
5128 error("Failed to set static address : %d", is_enable);
5130 bacpy(&adapter->le_static_addr, BDADDR_ANY);
5132 set_le_static_address(adapter);
5133 return btd_error_failed(msg, "Unable to set static address");
5136 return dbus_message_new_method_return(msg);
5139 static DBusMessage *adapter_enable_rssi(DBusConnection *conn,
5140 DBusMessage *msg, void *data)
5142 struct btd_adapter *adapter = data;
5143 struct mgmt_cp_set_enable_rssi cp;
5144 struct mgmt_cp_disable_rssi cp_dis;
5145 bdaddr_t bt_addr = { { 0, } };
5146 const gchar *address = NULL;
5148 const char *sender = dbus_message_get_sender(msg);
5149 dbus_int32_t link_type;
5150 dbus_int32_t low_threshold;
5151 dbus_int32_t in_range_threshold;
5152 dbus_int32_t high_threshold;
5154 DBG("Enable RSSI called");
5155 DBG("sender %s", sender);
5156 if (!(adapter->current_settings & MGMT_SETTING_POWERED))
5157 return btd_error_not_ready(msg);
5159 if (!dbus_message_get_args(msg, NULL,
5160 DBUS_TYPE_STRING, &address,
5161 DBUS_TYPE_INT32, &link_type,
5162 DBUS_TYPE_INT32, &low_threshold,
5163 DBUS_TYPE_INT32, &in_range_threshold,
5164 DBUS_TYPE_INT32, &high_threshold,
5166 return btd_error_invalid_args(msg);
5168 DBG("Enable RSSI: [%s %d %d %d %d]", address, link_type,
5169 low_threshold, in_range_threshold, high_threshold);
5171 DBG("BT address [%s]", address);
5172 memset(&bt_addr, 0, sizeof(bdaddr_t));
5173 str2ba(address, &bt_addr);
5174 memset(&cp, 0, sizeof(struct mgmt_cp_set_enable_rssi));
5175 memset(&cp_dis, 0, sizeof(struct mgmt_cp_disable_rssi));
5177 if (bachk(address) < 0)
5178 return btd_error_invalid_args(msg);
5180 // if (!btd_adapter_find_device(adapter, address))
5181 // return btd_error_not_found(msg);
5183 if (low_threshold == 0 && in_range_threshold == 0 && high_threshold == 0) {
5184 cp_dis.bdaddr = bt_addr;
5185 cp_dis.link_type = link_type;
5186 DBG("Disable Request");
5187 if (mgmt_send(adapter->mgmt, MGMT_OP_SET_RSSI_DISABLE,
5188 adapter->dev_id, sizeof(cp_dis), &cp_dis,
5189 NULL, NULL, NULL) > 0)
5190 return dbus_message_new_method_return(msg);
5192 cp.low_th = low_threshold;
5193 cp.in_range_th = in_range_threshold;
5194 cp.high_th = high_threshold;
5195 cp.bdaddr = bt_addr;
5196 cp.link_type = link_type;
5197 DBG("Enable Request");
5198 if (mgmt_send(adapter->mgmt, MGMT_OP_SET_RSSI_ENABLE,
5199 adapter->dev_id, sizeof(cp), &cp,
5200 NULL, NULL, NULL) > 0)
5201 return dbus_message_new_method_return(msg);
5203 return btd_error_failed(msg, "Enable/Disable RSSI Failed");
5206 static DBusMessage *adapter_get_rssi(DBusConnection *conn,
5207 DBusMessage *msg, void *data)
5209 struct btd_adapter *adapter = data;
5210 struct mgmt_cp_get_raw_rssi cp;
5212 const gchar *address = NULL;
5213 dbus_int32_t link_type;
5214 const char *sender = dbus_message_get_sender(msg);
5216 DBG("Get RSSI called");
5217 DBG("sender %s", sender);
5218 if (!(adapter->current_settings & MGMT_SETTING_POWERED))
5219 return btd_error_not_ready(msg);
5221 if (!dbus_message_get_args(msg, NULL,
5222 DBUS_TYPE_STRING, &address,
5223 DBUS_TYPE_INT32, &link_type,
5225 return btd_error_invalid_args(msg);
5227 DBG("BT address [%s] link type [%d]", address, link_type);
5228 memset(&bt_addr, 0, sizeof(bdaddr_t));
5229 str2ba(address, &bt_addr);
5230 memset(&cp, 0, sizeof(struct mgmt_cp_get_raw_rssi));
5232 if (bachk(address) < 0)
5233 return btd_error_invalid_args(msg);
5235 // if (!btd_adapter_find_device(adapter, address))
5236 // return btd_error_not_found(msg);
5238 memcpy(&(cp.bt_address), &bt_addr, sizeof(bdaddr_t));
5239 cp.link_type = link_type;
5240 DBG("RAW RSSI Request");
5241 if (mgmt_send(adapter->mgmt, MGMT_OP_GET_RAW_RSSI,
5242 adapter->dev_id, sizeof(cp), &cp,
5243 NULL, NULL, NULL) > 0)
5244 return dbus_message_new_method_return(msg);
5246 return btd_error_failed(msg, "Get Raw RSSI Failed");
5249 #if !defined(__SPRD_PATCH__)
5250 static void get_adv_tx_power_complete(uint8_t status, uint16_t length,
5251 const void *param, void *user_data)
5253 struct btd_adapter *adapter = user_data;
5254 const struct mgmt_rp_get_adv_tx_power *rp = param;
5257 error("Error ocurred in Getting adv tx power, rp is NULL");
5261 if (status != MGMT_STATUS_SUCCESS) {
5262 error("Failed to get adv tx power: %s (0x%02x)",
5263 mgmt_errstr(status), status);
5267 if (length < sizeof(*rp)) {
5268 error("Wrong size of get adv tx power");
5272 adapter->adv_tx_power = rp->adv_tx_power;
5276 static void adapter_get_adv_tx_power(void *data)
5278 struct btd_adapter *adapter = data;
5280 mgmt_send(adapter->mgmt, MGMT_OP_GET_ADV_TX_POWER,
5281 adapter->dev_id, 0, NULL,
5282 get_adv_tx_power_complete, adapter, NULL);
5287 static DBusMessage *set_wbs_parameters(DBusConnection *conn,
5288 DBusMessage *msg, void *data)
5290 struct btd_adapter *adapter = data;
5291 const gchar *role = NULL;
5292 const gchar *address = NULL;
5293 struct mgmt_cp_set_voice_setting cp;
5294 bdaddr_t bt_addr = { { 0, } };
5298 if (!dbus_message_get_args(msg, NULL,
5299 DBUS_TYPE_STRING, &role,
5300 DBUS_TYPE_STRING, &address,
5301 DBUS_TYPE_INVALID)) {
5302 return btd_error_invalid_args(msg);
5305 DBG("Role = %s", role);
5306 DBG("Address = %s", address);
5308 memset(&cp, 0, sizeof(cp));
5310 cp.voice_setting = BT_VOICE_TRANSPARENT | BT_VOICE_CVSD_16BIT;
5312 if (g_strcmp0(role, "Handsfree") == 0)
5313 cp.sco_role = MGMT_SCO_ROLE_HANDSFREE;
5314 else if (g_strcmp0(role, "Gateway") == 0)
5315 cp.sco_role = MGMT_SCO_ROLE_AUDIO_GATEWAY;
5317 str2ba(address, &bt_addr);
5318 memcpy(&(cp.bdaddr), &bt_addr, sizeof(bdaddr_t));
5320 if (mgmt_send(adapter->mgmt, MGMT_OP_SET_VOICE_SETTING,
5321 adapter->dev_id, sizeof(cp), &cp,
5322 NULL, NULL, NULL) == 0)
5323 error("mgmt_send failed for voice setting");
5326 return dbus_message_new_method_return(msg);
5329 static DBusMessage *set_nb_parameters(DBusConnection *conn,
5330 DBusMessage *msg, void *data)
5332 struct btd_adapter *adapter = data;
5334 const gchar *address = NULL;
5335 struct mgmt_cp_set_voice_setting cp;
5336 bdaddr_t bt_addr = { { 0, } };
5340 if (!dbus_message_get_args(msg, NULL,
5341 DBUS_TYPE_STRING, &role,
5342 DBUS_TYPE_STRING, &address,
5343 DBUS_TYPE_INVALID)) {
5344 return btd_error_invalid_args(msg);
5347 DBG("Role = %s", role);
5348 DBG("Address = %s", address);
5350 memset(&cp, 0, sizeof(cp));
5352 cp.voice_setting = BT_VOICE_CVSD_16BIT;
5354 if (g_strcmp0(role, "Handsfree") == 0)
5355 cp.sco_role = MGMT_SCO_ROLE_HANDSFREE;
5356 else if (g_strcmp0(role, "Gateway") == 0)
5357 cp.sco_role = MGMT_SCO_ROLE_AUDIO_GATEWAY;
5359 str2ba(address, &bt_addr);
5360 memcpy(&(cp.bdaddr), &bt_addr, sizeof(bdaddr_t));
5362 if (mgmt_send(adapter->mgmt, MGMT_OP_SET_VOICE_SETTING,
5363 adapter->dev_id, sizeof(cp), &cp,
5364 NULL, NULL, NULL) == 0)
5365 error("mgmt_send failed for voice setting");
5369 return dbus_message_new_method_return(msg);
5372 void btd_adapter_set_read_le_data_length_handler(
5373 struct btd_adapter *adapter,
5374 struct le_data_length_read_handler *handler)
5376 adapter->read_handler = handler;
5379 static void le_read_maximum_data_length_return_param_complete(
5380 uint8_t status, uint16_t length,
5381 const void *param, void *user_data)
5383 struct btd_adapter *adapter = user_data;
5384 const struct mgmt_rp_le_read_maximum_data_length *rp = param;
5385 uint16_t max_tx_octects = 0;
5386 uint16_t max_tx_time = 0;
5387 uint16_t max_rx_octects = 0;
5388 uint16_t max_rx_time = 0;
5392 error("Error ocurred in Reading maximum data length, rp is NULL");
5397 if (status != MGMT_STATUS_SUCCESS) {
5398 error("le read maximum data length failed: %s (0x%02x)",
5399 mgmt_errstr(status), status);
5404 if (length < sizeof(*rp)) {
5405 error("Too small le read maximum data length response");
5409 max_tx_octects = rp->max_tx_octets;
5410 max_tx_time =rp->max_tx_time;
5411 max_rx_octects = rp->max_rx_octets;
5412 max_rx_time = rp->max_rx_time;
5416 if (!adapter->read_handler ||
5417 !adapter->read_handler->read_callback) {
5418 g_free(adapter->read_handler);
5422 adapter->read_handler->read_callback(adapter, err,
5423 max_tx_octects, max_tx_time,
5424 max_rx_octects, max_rx_time,
5425 adapter->read_handler->user_data);
5427 g_free(adapter->read_handler);
5428 adapter->read_handler = NULL;
5431 int btd_adapter_le_read_maximum_data_length(
5432 struct btd_adapter *adapter)
5434 if (mgmt_send(adapter->mgmt,
5435 MGMT_OP_LE_READ_MAXIMUM_DATA_LENGTH,
5436 adapter->dev_id, 0, NULL,
5437 le_read_maximum_data_length_return_param_complete,
5444 static gint read_request_cmp(gconstpointer a, gconstpointer b)
5446 const struct le_data_length_read_request *data = a;
5447 const struct btd_adapter *adapter = b;
5449 return data->adapter != adapter;
5452 static struct le_data_length_read_request *find_read_le_data_length_request(
5453 struct btd_adapter *adapter)
5457 match = g_slist_find_custom(read_requests, adapter, read_request_cmp);
5465 static void le_read_data_length_complete(
5466 struct btd_adapter *adapter,
5468 uint16_t max_tx_octects, uint16_t max_tx_time,
5469 uint16_t max_rx_octects, uint16_t max_rx_time,
5473 struct le_data_length_read_request *read_request;
5475 read_request = find_read_le_data_length_request(adapter);
5481 DBG("Failed to read max data length. errno[%d]", err);
5482 reply = btd_error_failed(read_request->msg,
5483 "Failed to read max data length");
5485 reply = g_dbus_create_reply(read_request->msg,
5486 DBUS_TYPE_UINT16, &max_tx_octects,
5487 DBUS_TYPE_UINT16, &max_tx_time,
5488 DBUS_TYPE_UINT16, &max_rx_octects,
5489 DBUS_TYPE_UINT16, &max_rx_time,
5493 reply = btd_error_failed(read_request->msg,
5494 "Failed to create reply.");
5498 read_requests = g_slist_remove(read_requests, read_request);
5499 dbus_message_unref(read_request->msg);
5500 g_free(read_request);
5502 if (!g_dbus_send_message(dbus_conn, reply))
5503 error("D-Bus send failed");
5506 static DBusMessage *le_read_maximum_data_length(
5507 DBusConnection *conn, DBusMessage *msg,
5510 struct btd_adapter *adapter = user_data;
5511 struct le_data_length_read_request *read_request;
5512 struct le_data_length_read_handler *handler;
5514 if (find_read_le_data_length_request(adapter))
5515 return btd_error_in_progress(msg);
5517 if (btd_adapter_le_read_maximum_data_length(adapter))
5518 return btd_error_failed(msg, "Unable to read maximum le data length");
5520 read_request = g_new(struct le_data_length_read_request, 1);
5522 read_request->msg = dbus_message_ref(msg);
5523 read_request->adapter = adapter;
5525 read_requests = g_slist_append(read_requests, read_request);
5527 handler = g_new0(struct le_data_length_read_handler, 1);
5529 handler->read_callback =
5530 (read_max_data_length_cb_t)le_read_data_length_complete;
5532 btd_adapter_set_read_le_data_length_handler(
5533 read_request->adapter, handler);
5539 void le_write_host_suggested_data_length_return_param_complete(
5540 uint8_t status, uint16_t length,
5541 const void *param, void *user_data)
5543 if (status != MGMT_STATUS_SUCCESS) {
5544 error("le write host suggested data length failed: %s (0x%02x)",
5545 mgmt_errstr(status), status);
5551 static DBusMessage *le_write_host_suggested_default_data_length(
5552 DBusConnection *conn, DBusMessage *msg,
5555 struct btd_adapter *adapter = user_data;
5556 struct mgmt_cp_le_write_host_suggested_data_length cp;
5557 dbus_uint16_t def_tx_Octets;
5558 dbus_uint16_t def_tx_time;
5560 if (!(adapter->current_settings & MGMT_SETTING_POWERED))
5561 return btd_error_not_ready(msg);
5563 if (!dbus_message_get_args(msg, NULL,
5564 DBUS_TYPE_UINT16, &def_tx_Octets,
5565 DBUS_TYPE_UINT16, &def_tx_time,
5567 return btd_error_invalid_args(msg);
5569 memset(&cp, 0, sizeof(cp));
5570 cp.def_tx_octets = def_tx_Octets;
5571 cp.def_tx_time = def_tx_time;
5573 if (mgmt_send(adapter->mgmt,
5574 MGMT_OP_LE_WRITE_HOST_SUGGESTED_DATA_LENGTH,
5575 adapter->dev_id, sizeof(cp), &cp,
5576 le_write_host_suggested_data_length_return_param_complete,
5578 return dbus_message_new_method_return(msg);
5580 return btd_error_failed(msg, "Unable to write host suggested le data length values");
5583 static void le_read_suggested_default_data_length_return_param_complete(
5584 uint8_t status, uint16_t length,
5585 const void *param, void *user_data)
5587 struct btd_adapter *adapter = user_data;
5588 const struct mgmt_rp_le_read_host_suggested_data_length *rp = param;
5589 uint16_t def_tx_octects, def_tx_time;
5592 error("Error ocurred in Reading suggested data length, rp is NULL");
5593 if (adapter->def_read_handler)
5594 g_free(adapter->def_read_handler->user_data);
5596 g_free(adapter->def_read_handler);
5600 if (status != MGMT_STATUS_SUCCESS) {
5601 error("Read host suggested def le data length values failed: %s (0x%02x)",
5602 mgmt_errstr(status), status);
5606 if (adapter->def_read_handler)
5607 g_free(adapter->def_read_handler->user_data);
5609 g_free(adapter->def_read_handler);
5613 if (length < sizeof(*rp)) {
5616 def_tx_octects = rp->def_tx_octets;
5617 def_tx_time =rp->def_tx_time;
5618 DBG("retrieving host suggested data length values %d %d", def_tx_octects, def_tx_time);
5621 if (!adapter->def_read_handler)
5624 if(!adapter->def_read_handler->read_callback) {
5628 adapter->def_read_handler->read_callback(adapter,
5629 def_tx_octects, def_tx_time,
5630 adapter->def_read_handler->user_data);
5632 if (adapter->def_read_handler)
5633 g_free(adapter->def_read_handler->user_data);
5635 g_free(adapter->def_read_handler);
5636 adapter->def_read_handler = NULL;
5639 int btd_adapter_le_read_suggested_default_data_length(
5640 struct btd_adapter *adapter)
5642 if (mgmt_send(adapter->mgmt,
5643 MGMT_OP_LE_READ_HOST_SUGGESTED_DATA_LENGTH,
5644 adapter->dev_id, 0, NULL,
5645 le_read_suggested_default_data_length_return_param_complete,
5646 adapter, NULL) > 0) {
5653 static void le_read_host_suggested_default_length_complete(
5654 struct btd_adapter *adapter,
5655 uint16_t def_tx_octects, uint16_t def_tx_time,
5659 struct le_data_length_read_request *read_request;
5661 read_request = find_read_le_data_length_request(adapter);
5665 reply = g_dbus_create_reply(read_request->msg,
5666 DBUS_TYPE_UINT16, &def_tx_octects,
5667 DBUS_TYPE_UINT16, &def_tx_time,
5671 btd_error_failed(read_request->msg,
5672 "Failed to read host suggested def data length values");
5676 read_requests = g_slist_remove(read_requests, read_request);
5677 dbus_message_unref(read_request->msg);
5678 g_free(read_request);
5680 if (!g_dbus_send_message(dbus_conn, reply))
5681 error("D-Bus send failed");
5684 static DBusMessage *le_read_host_suggested_default_data_length(
5685 DBusConnection *conn, DBusMessage *msg,
5688 struct btd_adapter *adapter = user_data;
5689 struct le_data_length_read_request *read_request;
5690 struct le_data_length_read_default_data_length_handler *handler;
5692 if (find_read_le_data_length_request(adapter))
5693 return btd_error_in_progress(msg);
5695 if (btd_adapter_le_read_suggested_default_data_length(adapter))
5696 return btd_error_failed(msg, "Unable to read host suggested def data length");
5698 read_request = g_new(struct le_data_length_read_request, 1);
5700 read_request->msg = dbus_message_ref(msg);
5701 read_request->adapter = adapter;
5703 read_requests = g_slist_append(read_requests, read_request);
5705 handler = g_new0(struct le_data_length_read_default_data_length_handler, 1);
5707 handler->read_callback =
5708 (read_host_suggested_default_data_length_cb_t)le_read_host_suggested_default_length_complete;
5710 read_request->adapter->def_read_handler = handler;
5715 void le_set_data_length_return_param_complete(
5716 uint8_t status, uint16_t length,
5717 const void *param, void *user_data)
5719 if (status != MGMT_STATUS_SUCCESS) {
5720 error("le_set_data_length failed: %s (0x%02x)",
5721 mgmt_errstr(status), status);
5727 int btd_adapter_le_set_data_length(struct btd_adapter *adapter, bdaddr_t *bdaddr,
5728 uint16_t max_tx_octets, uint16_t max_tx_time)
5730 struct mgmt_cp_le_set_data_length cp;
5732 memset(&cp, 0, sizeof(cp));
5734 bacpy(&cp.bdaddr, bdaddr);
5736 cp.max_tx_octets = max_tx_octets;
5737 cp.max_tx_time = max_tx_time;
5739 if (mgmt_send(adapter->mgmt, MGMT_OP_LE_SET_DATA_LENGTH,
5740 adapter->dev_id, sizeof(cp), &cp,
5741 le_set_data_length_return_param_complete,
5748 static DBusMessage *adapter_set_manufacturer_data(DBusConnection *conn,
5749 DBusMessage *msg, void *data)
5751 struct btd_adapter *adapter = data;
5752 struct mgmt_cp_set_manufacturer_data cp;
5756 DBG("Set manufacturer data");
5758 if (!(adapter->current_settings & MGMT_SETTING_POWERED))
5759 return btd_error_not_ready(msg);
5761 if (!dbus_message_get_args(msg, NULL,
5762 DBUS_TYPE_ARRAY, DBUS_TYPE_BYTE, &value, &len,
5764 return btd_error_invalid_args(msg);
5766 if (len > EIR_MANUFACTURER_DATA_LENGTH_MAX)
5767 return btd_error_invalid_args(msg);
5769 memcpy(&cp, value, len);
5771 if (mgmt_send(adapter->mgmt, MGMT_OP_SET_MANUFACTURER_DATA,
5772 adapter->dev_id, EIR_MANUFACTURER_DATA_LENGTH_MAX,
5773 &cp, NULL, NULL, NULL) > 0)
5774 return dbus_message_new_method_return(msg);
5776 return btd_error_failed(msg, "Set manufacturer data failed");
5778 #endif /* TIZEN_FEATURE_BLUEZ_MODIFY */
5780 static DBusMessage *start_discovery(DBusConnection *conn,
5781 DBusMessage *msg, void *user_data)
5783 struct btd_adapter *adapter = user_data;
5784 const char *sender = dbus_message_get_sender(msg);
5785 struct watch_client *client;
5786 bool is_discovering;
5789 DBG("sender %s", sender);
5791 if (!(adapter->current_settings & MGMT_SETTING_POWERED))
5792 return btd_error_not_ready(msg);
5794 is_discovering = get_discovery_client(adapter, sender, &client);
5797 * Every client can only start one discovery, if the client
5798 * already started a discovery then return an error.
5801 return btd_error_busy(msg);
5804 * If there was pre-set filter, just reconnect it to discovery_list,
5809 return btd_error_busy(msg);
5811 adapter->set_filter_list = g_slist_remove(
5812 adapter->set_filter_list, client);
5813 adapter->discovery_list = g_slist_prepend(
5814 adapter->discovery_list, client);
5818 client = g_new0(struct watch_client, 1);
5820 client->adapter = adapter;
5821 client->owner = g_strdup(sender);
5822 client->discovery_filter = NULL;
5823 client->watch = g_dbus_add_disconnect_watch(dbus_conn, sender,
5824 discovery_disconnect, client,
5826 adapter->discovery_list = g_slist_prepend(adapter->discovery_list,
5831 * Just trigger the discovery here. In case an already running
5832 * discovery in idle phase exists, it will be restarted right
5835 err = update_discovery_filter(adapter);
5837 return dbus_message_new_method_return(msg);
5839 /* If the discovery has to be started wait it complete to reply */
5840 if (err == -EINPROGRESS) {
5841 client->msg = dbus_message_ref(msg);
5845 return btd_error_failed(msg, strerror(-err));
5848 static bool parse_uuids(DBusMessageIter *value, struct discovery_filter *filter)
5850 DBusMessageIter arriter;
5852 if (dbus_message_iter_get_arg_type(value) != DBUS_TYPE_ARRAY)
5855 dbus_message_iter_recurse(value, &arriter);
5856 while (dbus_message_iter_get_arg_type(&arriter) != DBUS_TYPE_INVALID) {
5857 bt_uuid_t uuid, u128;
5858 char uuidstr[MAX_LEN_UUID_STR + 1];
5861 if (dbus_message_iter_get_arg_type(&arriter) !=
5865 dbus_message_iter_get_basic(&arriter, &uuid_param);
5867 if (bt_string_to_uuid(&uuid, uuid_param))
5870 bt_uuid_to_uuid128(&uuid, &u128);
5871 bt_uuid_to_string(&u128, uuidstr, sizeof(uuidstr));
5873 filter->uuids = g_slist_prepend(filter->uuids, g_strdup(uuidstr));
5875 dbus_message_iter_next(&arriter);
5881 static bool parse_rssi(DBusMessageIter *value, struct discovery_filter *filter)
5883 if (dbus_message_iter_get_arg_type(value) != DBUS_TYPE_INT16)
5886 dbus_message_iter_get_basic(value, &filter->rssi);
5887 /* -127 <= RSSI <= +20 (spec V4.2 [Vol 2, Part E] 7.7.65.2) */
5888 if (filter->rssi > 20 || filter->rssi < -127)
5894 static bool parse_pathloss(DBusMessageIter *value,
5895 struct discovery_filter *filter)
5897 if (dbus_message_iter_get_arg_type(value) != DBUS_TYPE_UINT16)
5900 dbus_message_iter_get_basic(value, &filter->pathloss);
5901 /* pathloss filter must be smaller that PATHLOSS_MAX */
5902 if (filter->pathloss > PATHLOSS_MAX)
5908 static bool parse_transport(DBusMessageIter *value,
5909 struct discovery_filter *filter)
5911 char *transport_str;
5913 if (dbus_message_iter_get_arg_type(value) != DBUS_TYPE_STRING)
5916 dbus_message_iter_get_basic(value, &transport_str);
5918 if (!strcmp(transport_str, "bredr"))
5919 filter->type = SCAN_TYPE_BREDR;
5920 else if (!strcmp(transport_str, "le"))
5921 filter->type = SCAN_TYPE_LE;
5922 else if (strcmp(transport_str, "auto"))
5928 static bool parse_duplicate_data(DBusMessageIter *value,
5929 struct discovery_filter *filter)
5931 if (dbus_message_iter_get_arg_type(value) != DBUS_TYPE_BOOLEAN)
5934 dbus_message_iter_get_basic(value, &filter->duplicate);
5939 struct filter_parser {
5941 bool (*func)(DBusMessageIter *iter, struct discovery_filter *filter);
5943 { "UUIDs", parse_uuids },
5944 { "RSSI", parse_rssi },
5945 { "Pathloss", parse_pathloss },
5946 { "Transport", parse_transport },
5947 { "DuplicateData", parse_duplicate_data },
5951 static bool parse_discovery_filter_entry(char *key, DBusMessageIter *value,
5952 struct discovery_filter *filter)
5954 struct filter_parser *parser;
5956 for (parser = parsers; parser && parser->name; parser++) {
5957 if (!strcmp(parser->name, key))
5958 return parser->func(value, filter);
5961 DBG("Unknown key parameter: %s!\n", key);
5966 * This method is responsible for parsing parameters to SetDiscoveryFilter. If
5967 * filter in msg was empty, sets *filter to NULL. If whole parsing was
5968 * successful, sets *filter to proper value.
5969 * Returns false on any error, and true on success.
5971 static bool parse_discovery_filter_dict(struct btd_adapter *adapter,
5972 struct discovery_filter **filter,
5975 DBusMessageIter iter, subiter, dictiter, variantiter;
5976 bool is_empty = true;
5978 *filter = g_try_malloc(sizeof(**filter));
5982 (*filter)->uuids = NULL;
5983 (*filter)->pathloss = DISTANCE_VAL_INVALID;
5984 (*filter)->rssi = DISTANCE_VAL_INVALID;
5985 (*filter)->type = get_scan_type(adapter);
5986 (*filter)->duplicate = false;
5988 dbus_message_iter_init(msg, &iter);
5989 if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_ARRAY ||
5990 dbus_message_iter_get_element_type(&iter) != DBUS_TYPE_DICT_ENTRY)
5993 dbus_message_iter_recurse(&iter, &subiter);
5995 int type = dbus_message_iter_get_arg_type(&subiter);
5998 if (type == DBUS_TYPE_INVALID)
6002 dbus_message_iter_recurse(&subiter, &dictiter);
6004 dbus_message_iter_get_basic(&dictiter, &key);
6005 if (!dbus_message_iter_next(&dictiter))
6008 if (dbus_message_iter_get_arg_type(&dictiter) !=
6012 dbus_message_iter_recurse(&dictiter, &variantiter);
6014 if (!parse_discovery_filter_entry(key, &variantiter, *filter))
6017 dbus_message_iter_next(&subiter);
6026 /* only pathlos or rssi can be set, never both */
6027 if ((*filter)->pathloss != DISTANCE_VAL_INVALID &&
6028 (*filter)->rssi != DISTANCE_VAL_INVALID)
6031 DBG("filtered discovery params: transport: %d rssi: %d pathloss: %d "
6032 " duplicate data: %s ", (*filter)->type, (*filter)->rssi,
6033 (*filter)->pathloss, (*filter)->duplicate ? "true" : "false");
6038 g_slist_free_full((*filter)->uuids, g_free);
6044 static DBusMessage *set_discovery_filter(DBusConnection *conn,
6045 DBusMessage *msg, void *user_data)
6047 struct btd_adapter *adapter = user_data;
6048 struct watch_client *client;
6049 struct discovery_filter *discovery_filter;
6050 const char *sender = dbus_message_get_sender(msg);
6051 bool is_discovering;
6053 DBG("sender %s", sender);
6055 if (!(adapter->current_settings & MGMT_SETTING_POWERED))
6056 return btd_error_not_ready(msg);
6058 if (MGMT_VERSION(mgmt_version, mgmt_revision) < MGMT_VERSION(1, 8))
6059 return btd_error_not_supported(msg);
6061 /* parse parameters */
6062 if (!parse_discovery_filter_dict(adapter, &discovery_filter, msg))
6063 return btd_error_invalid_args(msg);
6065 is_discovering = get_discovery_client(adapter, sender, &client);
6068 free_discovery_filter(client->discovery_filter);
6069 client->discovery_filter = discovery_filter;
6072 update_discovery_filter(adapter);
6074 if (discovery_filter || is_discovering)
6075 return dbus_message_new_method_return(msg);
6077 /* Removing pre-set filter */
6078 adapter->set_filter_list = g_slist_remove(
6079 adapter->set_filter_list,
6081 discovery_free(client);
6082 DBG("successfully cleared pre-set filter");
6083 } else if (discovery_filter) {
6084 /* Client pre-setting his filter for first time */
6085 client = g_new0(struct watch_client, 1);
6086 client->adapter = adapter;
6087 client->owner = g_strdup(sender);
6088 client->discovery_filter = discovery_filter;
6089 client->watch = g_dbus_add_disconnect_watch(dbus_conn, sender,
6090 discovery_disconnect, client,
6092 adapter->set_filter_list = g_slist_prepend(
6093 adapter->set_filter_list, client);
6095 DBG("successfully pre-set filter");
6098 return dbus_message_new_method_return(msg);
6101 static DBusMessage *stop_discovery(DBusConnection *conn,
6102 DBusMessage *msg, void *user_data)
6104 struct btd_adapter *adapter = user_data;
6105 const char *sender = dbus_message_get_sender(msg);
6106 struct watch_client *client;
6110 DBG("sender %s", sender);
6112 if (!(adapter->current_settings & MGMT_SETTING_POWERED))
6113 return btd_error_not_ready(msg);
6115 list = g_slist_find_custom(adapter->discovery_list, sender,
6118 return btd_error_failed(msg, "No discovery started");
6120 client = list->data;
6123 return btd_error_busy(msg);
6125 err = discovery_stop(client);
6128 return dbus_message_new_method_return(msg);
6130 client->msg = dbus_message_ref(msg);
6133 return btd_error_failed(msg, strerror(-err));
6137 static gboolean property_get_address(const GDBusPropertyTable *property,
6138 DBusMessageIter *iter, void *user_data)
6140 struct btd_adapter *adapter = user_data;
6142 const char *str = addr;
6144 ba2str(&adapter->bdaddr, addr);
6146 dbus_message_iter_append_basic(iter, DBUS_TYPE_STRING, &str);
6151 static gboolean property_get_address_type(const GDBusPropertyTable *property,
6152 DBusMessageIter *iter, void *user_data)
6154 struct btd_adapter *adapter = user_data;
6157 if ((adapter->current_settings & MGMT_SETTING_LE) &&
6158 (adapter->bdaddr_type == BDADDR_LE_RANDOM))
6163 dbus_message_iter_append_basic(iter, DBUS_TYPE_STRING, &str);
6168 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
6169 static gboolean property_get_le_address(const GDBusPropertyTable *property,
6170 DBusMessageIter *iter, void *user_data)
6172 struct btd_adapter *adapter = user_data;
6173 DBusMessageIter entry;
6175 const char *str = addr;
6178 dbus_message_iter_open_container(iter, DBUS_TYPE_ARRAY,
6179 DBUS_TYPE_STRING_AS_STRING, &entry);
6181 if (adapter->le_static_addr.b[5] != 0) {
6182 ba2str(&adapter->le_static_addr, addr);
6183 type = g_strdup_printf("%d", BDADDR_LE_RANDOM);
6185 ba2str(&adapter->bdaddr, addr);
6186 type = g_strdup_printf("%d", BDADDR_LE_PUBLIC);
6189 dbus_message_iter_append_basic(&entry, DBUS_TYPE_STRING, &type);
6190 g_free((void *)type);
6192 dbus_message_iter_append_basic(&entry, DBUS_TYPE_STRING, &str);
6194 dbus_message_iter_close_container(iter, &entry);
6200 static gboolean property_get_name(const GDBusPropertyTable *property,
6201 DBusMessageIter *iter, void *user_data)
6203 struct btd_adapter *adapter = user_data;
6204 const char *str = adapter->system_name ? : "";
6206 dbus_message_iter_append_basic(iter, DBUS_TYPE_STRING, &str);
6211 static gboolean property_get_alias(const GDBusPropertyTable *property,
6212 DBusMessageIter *iter, void *user_data)
6214 struct btd_adapter *adapter = user_data;
6217 if (adapter->current_alias)
6218 str = adapter->current_alias;
6219 else if (adapter->stored_alias)
6220 str = adapter->stored_alias;
6222 str = adapter->system_name ? : "";
6224 dbus_message_iter_append_basic(iter, DBUS_TYPE_STRING, &str);
6229 static void property_set_alias(const GDBusPropertyTable *property,
6230 DBusMessageIter *iter,
6231 GDBusPendingPropertySet id, void *user_data)
6233 struct btd_adapter *adapter = user_data;
6237 dbus_message_iter_get_basic(iter, &name);
6239 if (g_str_equal(name, "") == TRUE) {
6240 if (adapter->stored_alias == NULL) {
6241 /* no alias set, nothing to restore */
6242 g_dbus_pending_property_success(id);
6246 /* restore to system name */
6247 ret = set_name(adapter, adapter->system_name);
6249 if (g_strcmp0(adapter->stored_alias, name) == 0) {
6250 /* alias already set, nothing to do */
6251 g_dbus_pending_property_success(id);
6256 ret = set_name(adapter, name);
6260 g_free(adapter->stored_alias);
6262 if (g_str_equal(name, "") == TRUE)
6263 adapter->stored_alias = NULL;
6265 adapter->stored_alias = g_strdup(name);
6267 store_adapter_info(adapter);
6269 g_dbus_pending_property_success(id);
6274 g_dbus_pending_property_error(id,
6275 ERROR_INTERFACE ".InvalidArguments",
6276 "Invalid arguments in method call");
6278 g_dbus_pending_property_error(id, ERROR_INTERFACE ".Failed",
6282 static gboolean property_get_class(const GDBusPropertyTable *property,
6283 DBusMessageIter *iter, void *user_data)
6285 struct btd_adapter *adapter = user_data;
6286 dbus_uint32_t val = adapter->dev_class;
6288 dbus_message_iter_append_basic(iter, DBUS_TYPE_UINT32, &val);
6293 static gboolean property_get_mode(struct btd_adapter *adapter,
6294 uint32_t setting, DBusMessageIter *iter)
6298 enable = (adapter->current_settings & setting) ? TRUE : FALSE;
6300 dbus_message_iter_append_basic(iter, DBUS_TYPE_BOOLEAN, &enable);
6305 struct property_set_data {
6306 struct btd_adapter *adapter;
6307 GDBusPendingPropertySet id;
6310 static void property_set_mode_complete(uint8_t status, uint16_t length,
6311 const void *param, void *user_data)
6313 struct property_set_data *data = user_data;
6314 struct btd_adapter *adapter = data->adapter;
6316 DBG("%s (0x%02x)", mgmt_errstr(status), status);
6318 if (status != MGMT_STATUS_SUCCESS) {
6319 const char *dbus_err;
6321 btd_error(adapter->dev_id, "Failed to set mode: %s (0x%02x)",
6322 mgmt_errstr(status), status);
6324 if (status == MGMT_STATUS_RFKILLED)
6325 dbus_err = ERROR_INTERFACE ".Blocked";
6327 dbus_err = ERROR_INTERFACE ".Failed";
6329 g_dbus_pending_property_error(data->id, dbus_err,
6330 mgmt_errstr(status));
6334 g_dbus_pending_property_success(data->id);
6337 * The parameters are identical and also the task that is
6338 * required in both cases. So it is safe to just call the
6339 * event handling functions here.
6341 new_settings_callback(adapter->dev_id, length, param, adapter);
6344 static void property_set_mode(struct btd_adapter *adapter, uint32_t setting,
6345 DBusMessageIter *value,
6346 GDBusPendingPropertySet id)
6348 struct property_set_data *data;
6349 struct mgmt_cp_set_discoverable cp;
6351 dbus_bool_t enable, current_enable;
6352 uint16_t opcode, len;
6355 dbus_message_iter_get_basic(value, &enable);
6357 if (adapter->current_settings & setting)
6358 current_enable = TRUE;
6360 current_enable = FALSE;
6362 if (enable == current_enable) {
6363 g_dbus_pending_property_success(id);
6367 mode = (enable == TRUE) ? 0x01 : 0x00;
6370 case MGMT_SETTING_POWERED:
6371 opcode = MGMT_OP_SET_POWERED;
6375 case MGMT_SETTING_DISCOVERABLE:
6376 #ifndef TIZEN_FEATURE_BLUEZ_MODIFY
6377 if (kernel_conn_control) {
6379 set_mode(adapter, MGMT_OP_SET_CONNECTABLE,
6382 opcode = MGMT_OP_SET_CONNECTABLE;
6390 memset(&cp, 0, sizeof(cp));
6393 cp.timeout = htobs(adapter->discoverable_timeout);
6395 opcode = MGMT_OP_SET_DISCOVERABLE;
6399 case MGMT_SETTING_BONDABLE:
6400 opcode = MGMT_OP_SET_BONDABLE;
6404 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
6405 case MGMT_SETTING_CONNECTABLE:
6406 opcode = MGMT_OP_SET_CONNECTABLE;
6415 DBG("sending %s command for index %u", mgmt_opstr(opcode),
6418 data = g_try_new0(struct property_set_data, 1);
6422 data->adapter = adapter;
6425 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
6427 * Use mgmt_send_nowait to avoid dbus timeout in a state of bonding.
6429 if (mgmt_send_nowait(adapter->mgmt, opcode, adapter->dev_id, len, param,
6430 property_set_mode_complete, data, g_free) > 0)
6432 if (mgmt_send(adapter->mgmt, opcode, adapter->dev_id, len, param,
6433 property_set_mode_complete, data, g_free) > 0)
6440 btd_error(adapter->dev_id, "Failed to set mode for index %u",
6443 g_dbus_pending_property_error(id, ERROR_INTERFACE ".Failed", NULL);
6446 static gboolean property_get_powered(const GDBusPropertyTable *property,
6447 DBusMessageIter *iter, void *user_data)
6449 struct btd_adapter *adapter = user_data;
6451 return property_get_mode(adapter, MGMT_SETTING_POWERED, iter);
6454 static void property_set_powered(const GDBusPropertyTable *property,
6455 DBusMessageIter *iter,
6456 GDBusPendingPropertySet id, void *user_data)
6458 struct btd_adapter *adapter = user_data;
6460 if (powering_down) {
6461 g_dbus_pending_property_error(id, ERROR_INTERFACE ".Failed",
6466 property_set_mode(adapter, MGMT_SETTING_POWERED, iter, id);
6469 static gboolean property_get_discoverable(const GDBusPropertyTable *property,
6470 DBusMessageIter *iter, void *user_data)
6472 struct btd_adapter *adapter = user_data;
6474 return property_get_mode(adapter, MGMT_SETTING_DISCOVERABLE, iter);
6477 static void property_set_discoverable(const GDBusPropertyTable *property,
6478 DBusMessageIter *iter,
6479 GDBusPendingPropertySet id, void *user_data)
6481 struct btd_adapter *adapter = user_data;
6483 if (adapter->discoverable_timeout > 0 &&
6484 !(adapter->current_settings & MGMT_SETTING_POWERED)) {
6485 g_dbus_pending_property_error(id, ERROR_INTERFACE ".Failed",
6490 property_set_mode(adapter, MGMT_SETTING_DISCOVERABLE, iter, id);
6493 static gboolean property_get_discoverable_timeout(
6494 const GDBusPropertyTable *property,
6495 DBusMessageIter *iter, void *user_data)
6497 struct btd_adapter *adapter = user_data;
6498 dbus_uint32_t value = adapter->discoverable_timeout;
6500 dbus_message_iter_append_basic(iter, DBUS_TYPE_UINT32, &value);
6505 static void property_set_discoverable_timeout(
6506 const GDBusPropertyTable *property,
6507 DBusMessageIter *iter,
6508 GDBusPendingPropertySet id, void *user_data)
6510 struct btd_adapter *adapter = user_data;
6511 dbus_uint32_t value;
6513 dbus_message_iter_get_basic(iter, &value);
6515 adapter->discoverable_timeout = value;
6517 g_dbus_pending_property_success(id);
6519 store_adapter_info(adapter);
6521 g_dbus_emit_property_changed(dbus_conn, adapter->path,
6522 ADAPTER_INTERFACE, "DiscoverableTimeout");
6525 if (adapter->current_settings & MGMT_SETTING_DISCOVERABLE)
6526 set_discoverable(adapter, 0x01, adapter->discoverable_timeout);
6529 static gboolean property_get_pairable(const GDBusPropertyTable *property,
6530 DBusMessageIter *iter, void *user_data)
6532 struct btd_adapter *adapter = user_data;
6534 return property_get_mode(adapter, MGMT_SETTING_BONDABLE, iter);
6537 static void property_set_pairable(const GDBusPropertyTable *property,
6538 DBusMessageIter *iter,
6539 GDBusPendingPropertySet id, void *user_data)
6541 struct btd_adapter *adapter = user_data;
6543 property_set_mode(adapter, MGMT_SETTING_BONDABLE, iter, id);
6546 static gboolean property_get_pairable_timeout(
6547 const GDBusPropertyTable *property,
6548 DBusMessageIter *iter, void *user_data)
6550 struct btd_adapter *adapter = user_data;
6551 dbus_uint32_t value = adapter->pairable_timeout;
6553 dbus_message_iter_append_basic(iter, DBUS_TYPE_UINT32, &value);
6558 static void property_set_pairable_timeout(const GDBusPropertyTable *property,
6559 DBusMessageIter *iter,
6560 GDBusPendingPropertySet id, void *user_data)
6562 struct btd_adapter *adapter = user_data;
6563 dbus_uint32_t value;
6565 dbus_message_iter_get_basic(iter, &value);
6567 adapter->pairable_timeout = value;
6569 g_dbus_pending_property_success(id);
6571 store_adapter_info(adapter);
6573 g_dbus_emit_property_changed(dbus_conn, adapter->path,
6574 ADAPTER_INTERFACE, "PairableTimeout");
6576 trigger_pairable_timeout(adapter);
6579 static gboolean property_get_discovering(const GDBusPropertyTable *property,
6580 DBusMessageIter *iter, void *user_data)
6582 struct btd_adapter *adapter = user_data;
6583 dbus_bool_t discovering = adapter->discovering;
6585 dbus_message_iter_append_basic(iter, DBUS_TYPE_BOOLEAN, &discovering);
6590 static void add_gatt_uuid(struct gatt_db_attribute *attrib, void *user_data)
6592 GHashTable *uuids = user_data;
6593 bt_uuid_t uuid, u128;
6594 char uuidstr[MAX_LEN_UUID_STR + 1];
6596 if (!gatt_db_service_get_active(attrib))
6599 if (!gatt_db_attribute_get_service_uuid(attrib, &uuid))
6602 bt_uuid_to_uuid128(&uuid, &u128);
6603 bt_uuid_to_string(&u128, uuidstr, sizeof(uuidstr));
6605 g_hash_table_add(uuids, strdup(uuidstr));
6608 static void iter_append_uuid(gpointer key, gpointer value, gpointer user_data)
6610 DBusMessageIter *iter = user_data;
6611 const char *uuid = key;
6613 dbus_message_iter_append_basic(iter, DBUS_TYPE_STRING, &uuid);
6616 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
6617 static gboolean property_get_le_discovering(const GDBusPropertyTable *property,
6618 DBusMessageIter *iter, void *user_data)
6620 struct btd_adapter *adapter = user_data;
6621 dbus_bool_t discovering = adapter->le_discovering;
6623 dbus_message_iter_append_basic(iter, DBUS_TYPE_BOOLEAN, &discovering);
6628 static gboolean property_get_connectable(const GDBusPropertyTable *property,
6629 DBusMessageIter *iter, void *user_data)
6631 struct btd_adapter *adapter = user_data;
6633 return property_get_mode(adapter, MGMT_SETTING_CONNECTABLE, iter);
6636 static void property_set_connectable(const GDBusPropertyTable *property,
6637 DBusMessageIter *iter,
6638 GDBusPendingPropertySet id, void *user_data)
6640 struct btd_adapter *adapter = user_data;
6642 property_set_mode(adapter, MGMT_SETTING_CONNECTABLE, iter, id);
6645 static gboolean property_get_version(const GDBusPropertyTable *property,
6646 DBusMessageIter *iter, void *user_data)
6648 struct btd_adapter *adapter = user_data;
6649 const char *str = adapter->version ? : "";
6651 dbus_message_iter_append_basic(iter, DBUS_TYPE_STRING, &str);
6656 static gboolean property_get_supported_le_features(
6657 const GDBusPropertyTable *property,
6658 DBusMessageIter *iter, void *user_data)
6660 const char *str, *val;
6662 DBusMessageIter entry;
6664 dbus_message_iter_open_container(iter, DBUS_TYPE_ARRAY,
6665 DBUS_TYPE_STRING_AS_STRING, &entry);
6667 value = adapter_le_get_max_adv_instance();
6669 str = g_strdup("adv_inst_max");
6670 dbus_message_iter_append_basic(&entry, DBUS_TYPE_STRING, &str);
6672 val = g_strdup_printf("%d", value);
6673 dbus_message_iter_append_basic(&entry, DBUS_TYPE_STRING, &val);
6675 g_free((void *)str);
6676 g_free((void *)val);
6679 value = adapter_le_is_supported_offloading();
6681 str = g_strdup("rpa_offloading");
6682 dbus_message_iter_append_basic(&entry, DBUS_TYPE_STRING, &str);
6684 val = g_strdup_printf("%d", value);
6685 dbus_message_iter_append_basic(&entry, DBUS_TYPE_STRING, &val);
6687 g_free((void *)str);
6688 g_free((void *)val);
6691 value = adapter_le_get_scan_filter_size();
6692 #ifdef TIZEN_FEATURE_PLATFROM_SCAN_FILTER
6694 value = SCAN_FILTER_SLOTS_MAX;
6697 str = g_strdup("max_filter");
6698 dbus_message_iter_append_basic(&entry, DBUS_TYPE_STRING, &str);
6700 val = g_strdup_printf("%d", value);
6701 dbus_message_iter_append_basic(&entry, DBUS_TYPE_STRING, &val);
6703 g_free((void *)str);
6704 g_free((void *)val);
6707 dbus_message_iter_close_container(iter, &entry);
6712 static gboolean property_get_ipsp_init_state(
6713 const GDBusPropertyTable *property,
6714 DBusMessageIter *iter, void *data)
6716 struct btd_adapter *adapter = data;
6717 dbus_bool_t ipsp_initialized;
6719 if (adapter->ipsp_intialized)
6720 ipsp_initialized = TRUE;
6722 ipsp_initialized = FALSE;
6724 dbus_message_iter_append_basic(iter, DBUS_TYPE_BOOLEAN,
6731 static gboolean property_get_uuids(const GDBusPropertyTable *property,
6732 DBusMessageIter *iter, void *user_data)
6734 struct btd_adapter *adapter = user_data;
6735 DBusMessageIter entry;
6740 uuids = g_hash_table_new_full(g_str_hash, g_str_equal, free, NULL);
6745 for (l = adapter->services; l != NULL; l = l->next) {
6746 sdp_record_t *rec = l->data;
6749 uuid = bt_uuid2string(&rec->svclass);
6753 g_hash_table_add(uuids, uuid);
6757 db = btd_gatt_database_get_db(adapter->database);
6759 gatt_db_foreach_service(db, NULL, add_gatt_uuid, uuids);
6761 dbus_message_iter_open_container(iter, DBUS_TYPE_ARRAY,
6762 DBUS_TYPE_STRING_AS_STRING, &entry);
6763 g_hash_table_foreach(uuids, iter_append_uuid, &entry);
6764 dbus_message_iter_close_container(iter, &entry);
6766 g_hash_table_destroy(uuids);
6771 static gboolean property_exists_modalias(const GDBusPropertyTable *property,
6774 struct btd_adapter *adapter = user_data;
6776 return adapter->modalias ? TRUE : FALSE;
6779 static gboolean property_get_modalias(const GDBusPropertyTable *property,
6780 DBusMessageIter *iter, void *user_data)
6782 struct btd_adapter *adapter = user_data;
6783 const char *str = adapter->modalias ? : "";
6785 dbus_message_iter_append_basic(iter, DBUS_TYPE_STRING, &str);
6790 static int device_path_cmp(gconstpointer a, gconstpointer b)
6792 const struct btd_device *device = a;
6793 const char *path = b;
6794 const char *dev_path = device_get_path(device);
6796 return strcasecmp(dev_path, path);
6799 static DBusMessage *remove_device(DBusConnection *conn,
6800 DBusMessage *msg, void *user_data)
6802 struct btd_adapter *adapter = user_data;
6803 struct btd_device *device;
6807 if (dbus_message_get_args(msg, NULL, DBUS_TYPE_OBJECT_PATH, &path,
6808 DBUS_TYPE_INVALID) == FALSE)
6809 return btd_error_invalid_args(msg);
6811 list = g_slist_find_custom(adapter->devices, path, device_path_cmp);
6813 return btd_error_does_not_exist(msg);
6815 if (!(adapter->current_settings & MGMT_SETTING_POWERED))
6816 return btd_error_not_ready(msg);
6818 device = list->data;
6820 btd_device_set_temporary(device, true);
6822 if (!btd_device_is_connected(device)) {
6823 btd_adapter_remove_device(adapter, device);
6824 return dbus_message_new_method_return(msg);
6827 device_request_disconnect(device, msg);
6832 static DBusMessage *get_discovery_filters(DBusConnection *conn,
6833 DBusMessage *msg, void *user_data)
6836 DBusMessageIter iter, array;
6837 struct filter_parser *parser;
6839 reply = dbus_message_new_method_return(msg);
6841 dbus_message_iter_init_append(reply, &iter);
6843 dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY,
6844 DBUS_TYPE_STRING_AS_STRING, &array);
6846 for (parser = parsers; parser && parser->name; parser++) {
6847 dbus_message_iter_append_basic(&array, DBUS_TYPE_STRING,
6851 dbus_message_iter_close_container(&iter, &array);
6857 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
6858 static DBusMessage *adapter_unpair_device(DBusConnection *conn,
6859 DBusMessage *msg, void *user_data)
6862 struct btd_adapter *adapter = user_data;
6863 struct btd_device *device;
6867 if (dbus_message_get_args(msg, NULL, DBUS_TYPE_OBJECT_PATH, &path,
6868 DBUS_TYPE_INVALID) == FALSE)
6869 return btd_error_invalid_args(msg);
6871 list = g_slist_find_custom(adapter->devices, path, device_path_cmp);
6873 return btd_error_does_not_exist(msg);
6875 if (!(adapter->current_settings & MGMT_SETTING_POWERED))
6876 return btd_error_not_ready(msg);
6878 device = list->data;
6880 btd_device_set_temporary(device, TRUE);
6882 if (!btd_device_is_connected(device)) {
6883 btd_adapter_unpair_device(adapter, device);
6884 return dbus_message_new_method_return(msg);
6887 device_request_disconnect(device, msg);
6893 static DBusMessage *create_device(DBusConnection *conn,
6894 DBusMessage *msg, void *data)
6896 struct btd_adapter *adapter = data;
6897 const gchar *address;
6901 if (dbus_message_get_args(msg, NULL, DBUS_TYPE_STRING, &address,
6902 DBUS_TYPE_INVALID) == FALSE)
6903 return btd_error_invalid_args(msg);
6905 if (bachk(address) < 0)
6906 return btd_error_invalid_args(msg);
6910 str2ba(address, &addr);
6911 btd_adapter_get_device(adapter, &addr, BDADDR_BREDR);
6914 return dbus_message_new_method_return(msg);
6917 static DBusMessage *find_device(DBusConnection *conn, DBusMessage *msg,
6920 struct btd_adapter *adapter = data;
6921 struct btd_device *device;
6923 const gchar *address;
6925 const gchar *dev_path;
6927 if (!dbus_message_get_args(msg, NULL, DBUS_TYPE_STRING, &address,
6929 return btd_error_invalid_args(msg);
6931 l = g_slist_find_custom(adapter->devices, address, device_rpa_cmp);
6933 l = g_slist_find_custom(adapter->devices, address,
6934 device_address_cmp);
6936 return btd_error_does_not_exist(msg);
6940 reply = dbus_message_new_method_return(msg);
6944 dev_path = device_get_path(device);
6946 dbus_message_append_args(reply,
6947 DBUS_TYPE_OBJECT_PATH, &dev_path,
6953 static gboolean adapter_ipsp_connected(struct btd_adapter *adapter)
6957 DBG("%s", adapter->path);
6959 for (l = adapter->connections; l != NULL; l = next) {
6960 struct btd_device *dev = l->data;
6962 next = g_slist_next(l);
6964 if (device_is_ipsp_connected(dev))
6971 static void adapter_set_ipsp_init_state(struct btd_adapter *adapter, gboolean initialized)
6973 if (adapter->ipsp_intialized == initialized)
6976 adapter->ipsp_intialized = initialized;
6978 g_dbus_emit_property_changed(dbus_conn, adapter->path,
6979 ADAPTER_INTERFACE, "IpspInitStateChanged");
6982 static void deinitialize_6lowpan_complete(uint8_t status, uint16_t length,
6983 const void *param, void *user_data)
6985 struct btd_adapter *adapter = user_data;
6986 bool initialized = FALSE;
6988 if (status != MGMT_STATUS_SUCCESS)
6989 error("De-Initialize BT 6lowpan failed for hci%u: %s (0x%02x)",
6990 adapter->dev_id, mgmt_errstr(status), status);
6992 adapter_set_ipsp_init_state(adapter, initialized);
6993 DBG("De-Initialize BT 6lowpan successfully for hci%u",
6998 static bool deinitialize_6lowpan(struct btd_adapter *adapter)
7000 struct mgmt_cp_enable_6lowpan cp;
7002 memset(&cp, 0, sizeof(cp));
7004 cp.enable_6lowpan = DEINIT_6LOWPAN;
7005 if (mgmt_send(adapter->mgmt, MGMT_OP_ENABLE_6LOWPAN,
7006 adapter->dev_id, sizeof(cp), &cp,
7007 deinitialize_6lowpan_complete, adapter, NULL) > 0)
7010 error("Failed to de-initialize BT 6Lowpan for index %u",
7015 static void initialize_6lowpan_complete(uint8_t status, uint16_t length,
7016 const void *param, void *user_data)
7018 struct btd_adapter *adapter = user_data;
7019 bool initialized = TRUE;
7021 if (status != MGMT_STATUS_SUCCESS)
7022 error("Initialize BT 6lowpan failed for hci%u: %s (0x%02x)",
7023 adapter->dev_id, mgmt_errstr(status), status);
7025 adapter_set_ipsp_init_state(adapter, initialized);
7026 DBG("Initialize BT 6lowpan successfully for hci%u",
7031 static bool initialize_6lowpan(struct btd_adapter *adapter)
7033 struct mgmt_cp_enable_6lowpan cp;
7035 memset(&cp, 0, sizeof(cp));
7037 cp.enable_6lowpan = INIT_6LOWPAN;
7038 if (mgmt_send(adapter->mgmt, MGMT_OP_ENABLE_6LOWPAN,
7039 adapter->dev_id, sizeof(cp), &cp,
7040 initialize_6lowpan_complete, adapter, NULL) > 0)
7043 error("Failed to initialize BT 6Lowpan for index %u",
7048 static DBusMessage *adapter_initialize_ipsp(DBusConnection *conn,
7049 DBusMessage *msg, void *data)
7051 struct btd_adapter *adapter = data;
7054 DBG("Initialize IPSP");
7056 if (!(adapter->current_settings & MGMT_SETTING_POWERED))
7057 return btd_error_not_ready(msg);
7059 if (adapter->ipsp_intialized)
7060 return btd_error_already_exists(msg);
7062 /* Enable BT 6lowpan in kernel */
7063 err = initialize_6lowpan(adapter);
7066 return btd_error_failed(msg, "Failed to initialize BT 6lowpan");
7068 return dbus_message_new_method_return(msg);
7071 static DBusMessage *adapter_deinitialize_ipsp(DBusConnection *conn,
7072 DBusMessage *msg, void *data)
7074 struct btd_adapter *adapter = data;
7077 DBG("De-initialize IPSP");
7079 if (!(adapter->current_settings & MGMT_SETTING_POWERED))
7080 return btd_error_not_ready(msg);
7082 if (!adapter->ipsp_intialized)
7083 return btd_error_not_permitted(msg, "IPSP not initialized");
7085 if (adapter_ipsp_connected(adapter))
7086 return btd_error_not_permitted(msg, "IPSP Client device found connected");
7088 /* Disable BT 6lowpan in kernel */
7089 err = deinitialize_6lowpan(adapter);
7092 return btd_error_failed(msg, "Failed to deinitialize BT 6lowpan");
7094 return dbus_message_new_method_return(msg);
7098 static const GDBusMethodTable adapter_methods[] = {
7099 { GDBUS_ASYNC_METHOD("StartDiscovery", NULL, NULL, start_discovery) },
7100 { GDBUS_METHOD("SetDiscoveryFilter",
7101 GDBUS_ARGS({ "properties", "a{sv}" }), NULL,
7102 set_discovery_filter) },
7103 { GDBUS_ASYNC_METHOD("StopDiscovery", NULL, NULL, stop_discovery) },
7104 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
7105 { GDBUS_METHOD("StartCustomDiscovery",
7106 GDBUS_ARGS({ "type", "s" }), NULL,
7107 adapter_start_custom_discovery) },
7108 { GDBUS_METHOD("StartLEDiscovery", NULL, NULL,
7109 adapter_start_le_discovery) },
7110 { GDBUS_ASYNC_METHOD("StopLEDiscovery", NULL, NULL,
7111 adapter_stop_le_discovery) },
7112 { GDBUS_METHOD("SetAdvertising",
7113 GDBUS_ARGS({ "enable", "b" },
7114 { "slot_id", "i" }), NULL,
7115 adapter_set_advertising) },
7116 { GDBUS_METHOD("SetAdvertisingParameters",
7117 GDBUS_ARGS({ "interval_min", "u" },
7118 { "interval_max", "u" },
7119 { "filter_policy", "u" },
7121 { "slot_id", "i" }), NULL,
7122 adapter_set_advertising_params) },
7123 { GDBUS_METHOD("SetAdvertisingData",
7124 GDBUS_ARGS({ "value", "ay" },
7125 { "slot_id", "i" }), NULL,
7126 adapter_set_advertising_data) },
7127 { GDBUS_METHOD("SetScanParameters",
7128 GDBUS_ARGS({ "type", "u" },
7129 { "interval", "u" },
7130 { "window", "u" }), NULL,
7131 adapter_le_set_scan_params) },
7132 { GDBUS_ASYNC_METHOD("scan_filter_param_setup",
7133 GDBUS_ARGS({ "client_if", "i" }, { "action", "i" },
7134 { "filt_index", "i" }, { "feat_seln", "i"},
7135 { "list_logic_type", "i" }, { "filt_logic_type", "i"},
7136 { "rssi_high_thres", "i" }, { "rssi_low_thres", "i"},
7137 { "dely_mode", "i" }, { "found_timeout", "i"},
7138 { "lost_timeout", "i" }, { "found_timeout_cnt", "i"}), NULL,
7139 adapter_le_scan_filter_param_setup) },
7140 { GDBUS_ASYNC_METHOD("scan_filter_add_remove",
7141 GDBUS_ARGS({ "client_if", "i" }, { "action", "i" },
7142 { "filt_type", "i" }, { "filt_index", "i"},
7143 { "company_id", "i" }, { "company_id_mask", "i"},
7144 { "p_uuid", "ay" }, { "p_uuid_mask", "ay" },
7145 { "string", "s" }, { "address_type", "u" },
7146 /*{ "data_len", "i" },*/ { "p_data", "ay" },
7147 /*{ "mask_len", "i" },*/ { "p_mask", "ay" }), NULL,
7148 adapter_le_scan_filter_add_remove) },
7149 { GDBUS_ASYNC_METHOD("scan_filter_clear",
7150 GDBUS_ARGS({ "client_if", "i" }, { "filt_index", "i" }), NULL,
7151 adapter_le_scan_filter_clear) },
7152 { GDBUS_ASYNC_METHOD("scan_filter_enable",
7153 GDBUS_ARGS({ "client_if", "i" }, { "enable", "b" }), NULL,
7154 adapter_le_scan_filter_enable) },
7155 { GDBUS_METHOD("InitializeIpsp",
7157 adapter_initialize_ipsp) },
7158 { GDBUS_METHOD("DeinitializeIpsp",
7160 adapter_deinitialize_ipsp) },
7161 { GDBUS_METHOD("SetScanRespData",
7162 GDBUS_ARGS({ "value", "ay" },
7163 { "slot_id", "i" }), NULL,
7164 adapter_set_scan_rsp_data) },
7165 { GDBUS_METHOD("AddDeviceWhiteList",
7166 GDBUS_ARGS({ "address", "s" },
7167 { "address_type", "u" }), NULL,
7168 adapter_add_device_white_list) },
7169 { GDBUS_METHOD("RemoveDeviceWhiteList",
7170 GDBUS_ARGS({ "address", "s" },
7171 { "address_type", "u" }), NULL,
7172 adapter_remove_device_white_list) },
7173 { GDBUS_METHOD("ClearDeviceWhiteList",
7175 adapter_clear_device_white_list) },
7176 { GDBUS_METHOD("SetLePrivacy",
7177 GDBUS_ARGS({ "enable", "b" }), NULL,
7178 adapter_set_le_privacy) },
7179 { GDBUS_METHOD("SetLeStaticRandomAddress",
7180 GDBUS_ARGS({ "enable", "b" }), NULL,
7181 adapter_set_le_static_address) },
7182 { GDBUS_ASYNC_METHOD("EnableRssi",
7183 GDBUS_ARGS({ "bt_address", "s" },
7184 { "link_type", "i" },
7186 { "in_range_th", "i" },
7189 adapter_enable_rssi) },
7190 { GDBUS_ASYNC_METHOD("GetRssiStrength",
7191 GDBUS_ARGS({ "bt_address", "s" }, { "link_type", "i" }),
7193 adapter_get_rssi) },
7194 { GDBUS_ASYNC_METHOD("UnpairDevice",
7195 GDBUS_ARGS({ "device", "o" }), NULL, adapter_unpair_device) },
7196 { GDBUS_METHOD("FindDevice",
7197 GDBUS_ARGS({ "address", "s" }),
7198 GDBUS_ARGS({ "device", "o" }),
7200 { GDBUS_METHOD("SetWbsParameters",
7201 GDBUS_ARGS({ "role", "s" }, { "bt_address", "s" }),
7203 set_wbs_parameters) },
7204 { GDBUS_METHOD("SetNbParameters",
7205 GDBUS_ARGS({ "role", "s" }, { "bt_address", "s" }),
7207 set_nb_parameters) },
7208 { GDBUS_METHOD("SetManufacturerData",
7209 GDBUS_ARGS({ "value", "ay" }), NULL,
7210 adapter_set_manufacturer_data) },
7211 { GDBUS_ASYNC_METHOD("CreateDevice",
7212 GDBUS_ARGS({ "address", "s" }), NULL,
7215 { GDBUS_ASYNC_METHOD("RemoveDevice",
7216 GDBUS_ARGS({ "device", "o" }), NULL, remove_device) },
7217 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
7218 { GDBUS_ASYNC_METHOD("LEReadMaximumDataLength", NULL,
7219 GDBUS_ARGS({"maxTxOctets", "q" }, { "maxTxTime", "q" },
7220 {"maxRxOctets", "q" }, { "maxRxTime", "q" }),
7221 le_read_maximum_data_length)},
7222 { GDBUS_ASYNC_METHOD("LEWriteHostSuggestedDataLength",
7223 GDBUS_ARGS({"def_tx_octets", "q" }, { "def_tx_time", "q" }), NULL,
7224 le_write_host_suggested_default_data_length)},
7225 { GDBUS_ASYNC_METHOD("LEReadHostSuggestedDataLength", NULL,
7226 GDBUS_ARGS({"def_tx_octets", "q" }, { "def_tx_time", "q" }),
7227 le_read_host_suggested_default_data_length)},
7229 { GDBUS_METHOD("GetDiscoveryFilters", NULL,
7230 GDBUS_ARGS({ "filters", "as" }),
7231 get_discovery_filters) },
7235 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
7236 static const GDBusSignalTable adapter_signals[] = {
7237 { GDBUS_SIGNAL("AdvertisingEnabled",
7238 GDBUS_ARGS({ "slot_id", "i" },
7239 { "enabled", "b"})) },
7240 { GDBUS_SIGNAL("RssiEnabled",
7241 GDBUS_ARGS({"address","s"},
7242 { "link_type", "i" },
7243 { "enabled", "b"})) },
7244 { GDBUS_SIGNAL("RssiAlert",
7245 GDBUS_ARGS({"address","s"},
7246 { "link_type", "i" },
7247 { "alert_type", "i" },
7248 { "rssi_dbm", "i"})) },
7249 { GDBUS_SIGNAL("RawRssi",
7250 GDBUS_ARGS({"address","s"},
7251 { "link_type", "i" },
7252 { "rssi_dbm", "i"})) },
7253 { GDBUS_SIGNAL("HardwareError", NULL) },
7254 { GDBUS_SIGNAL("TxTimeoutError", NULL) },
7259 static const GDBusPropertyTable adapter_properties[] = {
7260 { "Address", "s", property_get_address },
7261 { "AddressType", "s", property_get_address_type },
7262 { "Name", "s", property_get_name },
7263 { "Alias", "s", property_get_alias, property_set_alias },
7264 { "Class", "u", property_get_class },
7265 { "Powered", "b", property_get_powered, property_set_powered },
7266 { "Discoverable", "b", property_get_discoverable,
7267 property_set_discoverable },
7268 { "DiscoverableTimeout", "u", property_get_discoverable_timeout,
7269 property_set_discoverable_timeout },
7270 { "Pairable", "b", property_get_pairable, property_set_pairable },
7271 { "PairableTimeout", "u", property_get_pairable_timeout,
7272 property_set_pairable_timeout },
7273 { "Discovering", "b", property_get_discovering },
7274 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
7275 { "LEDiscovering", "b", property_get_le_discovering },
7277 { "UUIDs", "as", property_get_uuids },
7278 { "Modalias", "s", property_get_modalias, NULL,
7279 property_exists_modalias },
7280 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
7281 { "Connectable", "b", property_get_connectable,
7282 property_set_connectable },
7283 { "Version", "s", property_get_version },
7284 { "SupportedLEFeatures", "as", property_get_supported_le_features},
7285 { "IpspInitStateChanged", "b", property_get_ipsp_init_state},
7286 { "LEAddress", "as", property_get_le_address },
7292 static int str2buf(const char *str, uint8_t *buf, size_t blen)
7299 memset(buf, 0, blen);
7301 dlen = MIN((strlen(str) / 2), blen);
7303 for (i = 0; i < dlen; i++)
7304 sscanf(str + (i * 2), "%02hhX", &buf[i]);
7309 static struct link_key_info *get_key_info(GKeyFile *key_file, const char *peer)
7311 struct link_key_info *info = NULL;
7314 str = g_key_file_get_string(key_file, "LinkKey", "Key", NULL);
7315 if (!str || strlen(str) < 32)
7318 info = g_new0(struct link_key_info, 1);
7320 str2ba(peer, &info->bdaddr);
7322 if (!strncmp(str, "0x", 2))
7323 str2buf(&str[2], info->key, sizeof(info->key));
7325 str2buf(&str[0], info->key, sizeof(info->key));
7327 info->type = g_key_file_get_integer(key_file, "LinkKey", "Type", NULL);
7328 info->pin_len = g_key_file_get_integer(key_file, "LinkKey", "PINLength",
7337 static struct smp_ltk_info *get_ltk(GKeyFile *key_file, const char *peer,
7338 uint8_t peer_type, const char *group)
7340 struct smp_ltk_info *ltk = NULL;
7341 GError *gerr = NULL;
7346 key = g_key_file_get_string(key_file, group, "Key", NULL);
7347 if (!key || strlen(key) < 32)
7350 rand = g_key_file_get_string(key_file, group, "Rand", NULL);
7354 ltk = g_new0(struct smp_ltk_info, 1);
7356 /* Default to assuming a master key */
7359 str2ba(peer, <k->bdaddr);
7360 ltk->bdaddr_type = peer_type;
7363 * Long term keys should respond to an identity address which can
7364 * either be a public address or a random static address. Keys
7365 * stored for resolvable random and unresolvable random addresses
7368 * This is an extra sanity check for older kernel versions or older
7369 * daemons that might have been instructed to store long term keys
7370 * for these temporary addresses.
7372 if (ltk->bdaddr_type == BDADDR_LE_RANDOM &&
7373 (ltk->bdaddr.b[5] & 0xc0) != 0xc0) {
7379 if (!strncmp(key, "0x", 2))
7380 str2buf(&key[2], ltk->val, sizeof(ltk->val));
7382 str2buf(&key[0], ltk->val, sizeof(ltk->val));
7384 if (!strncmp(rand, "0x", 2)) {
7386 str2buf(&rand[2], (uint8_t *) &rand_le, sizeof(rand_le));
7387 ltk->rand = le64_to_cpu(rand_le);
7389 sscanf(rand, "%" PRIu64, <k->rand);
7392 ltk->authenticated = g_key_file_get_integer(key_file, group,
7393 "Authenticated", NULL);
7394 ltk->enc_size = g_key_file_get_integer(key_file, group, "EncSize",
7396 ltk->ediv = g_key_file_get_integer(key_file, group, "EDiv", NULL);
7398 master = g_key_file_get_boolean(key_file, group, "Master", &gerr);
7402 ltk->master = master;
7411 static GSList *get_ltk_info(GKeyFile *key_file, const char *peer,
7412 uint8_t bdaddr_type)
7414 struct smp_ltk_info *ltk;
7419 ltk = get_ltk(key_file, peer, bdaddr_type, "LongTermKey");
7421 l = g_slist_append(l, ltk);
7423 ltk = get_ltk(key_file, peer, bdaddr_type, "SlaveLongTermKey");
7425 ltk->master = false;
7426 l = g_slist_append(l, ltk);
7432 static struct irk_info *get_irk_info(GKeyFile *key_file, const char *peer,
7433 uint8_t bdaddr_type)
7435 struct irk_info *irk = NULL;
7438 str = g_key_file_get_string(key_file, "IdentityResolvingKey", "Key", NULL);
7439 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
7442 if (strlen(str) < 32) {
7447 if (!str || strlen(str) < 32)
7451 irk = g_new0(struct irk_info, 1);
7453 str2ba(peer, &irk->bdaddr);
7454 irk->bdaddr_type = bdaddr_type;
7456 if (!strncmp(str, "0x", 2))
7457 str2buf(&str[2], irk->val, sizeof(irk->val));
7459 str2buf(&str[0], irk->val, sizeof(irk->val));
7460 #ifndef TIZEN_FEATURE_BLUEZ_MODIFY
7468 static struct conn_param *get_conn_param(GKeyFile *key_file, const char *peer,
7469 uint8_t bdaddr_type)
7471 struct conn_param *param;
7473 if (!g_key_file_has_group(key_file, "ConnectionParameters"))
7476 param = g_new0(struct conn_param, 1);
7478 param->min_interval = g_key_file_get_integer(key_file,
7479 "ConnectionParameters",
7480 "MinInterval", NULL);
7481 param->max_interval = g_key_file_get_integer(key_file,
7482 "ConnectionParameters",
7483 "MaxInterval", NULL);
7484 param->latency = g_key_file_get_integer(key_file,
7485 "ConnectionParameters",
7487 param->timeout = g_key_file_get_integer(key_file,
7488 "ConnectionParameters",
7490 str2ba(peer, ¶m->bdaddr);
7491 param->bdaddr_type = bdaddr_type;
7497 static int generate_and_write_irk(uint8_t *irk, GKeyFile *key_file,
7498 const char *filename)
7500 struct bt_crypto *crypto;
7501 char str_irk_out[33];
7506 crypto = bt_crypto_new();
7508 error("Failed to open crypto");
7512 if (!bt_crypto_random_bytes(crypto, irk, 16)) {
7513 error("Failed to generate IRK");
7514 bt_crypto_unref(crypto);
7518 bt_crypto_unref(crypto);
7520 for (i = 0; i < 16; i++)
7521 sprintf(str_irk_out + (i * 2), "%02x", irk[i]);
7523 str_irk_out[32] = '\0';
7524 info("Generated IRK successfully");
7526 g_key_file_set_string(key_file, "General", "IdentityResolvingKey",
7528 str = g_key_file_to_data(key_file, &length, NULL);
7529 g_file_set_contents(filename, str, length, NULL);
7531 DBG("Generated IRK written to file");
7535 static int load_irk(struct btd_adapter *adapter, uint8_t *irk)
7537 char filename[PATH_MAX];
7542 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/identity",
7543 adapter_dir(adapter));
7545 key_file = g_key_file_new();
7546 g_key_file_load_from_file(key_file, filename, 0, NULL);
7548 str_irk = g_key_file_get_string(key_file, "General",
7549 "IdentityResolvingKey", NULL);
7551 info("No IRK stored");
7552 ret = generate_and_write_irk(irk, key_file, filename);
7553 g_key_file_free(key_file);
7557 g_key_file_free(key_file);
7559 if (strlen(str_irk) != 32 || str2buf(str_irk, irk, 16)) {
7560 /* TODO re-create new IRK here? */
7561 error("Invalid IRK format, disabling privacy");
7567 DBG("Successfully read IRK from file");
7571 static void set_privacy_complete(uint8_t status, uint16_t length,
7572 const void *param, void *user_data)
7574 struct btd_adapter *adapter = user_data;
7576 if (status != MGMT_STATUS_SUCCESS) {
7577 btd_error(adapter->dev_id, "Failed to set privacy: %s (0x%02x)",
7578 mgmt_errstr(status), status);
7582 DBG("Successfuly set privacy for index %u", adapter->dev_id);
7585 static int set_privacy(struct btd_adapter *adapter, uint8_t privacy)
7587 struct mgmt_cp_set_privacy cp;
7589 memset(&cp, 0, sizeof(cp));
7594 if (load_irk(adapter, irk) == 0) {
7595 cp.privacy = privacy;
7596 memcpy(cp.irk, irk, 16);
7600 DBG("sending set privacy command for index %u", adapter->dev_id);
7601 DBG("setting privacy mode 0x%02x for index %u", cp.privacy,
7604 if (mgmt_send(adapter->mgmt, MGMT_OP_SET_PRIVACY,
7605 adapter->dev_id, sizeof(cp), &cp,
7606 set_privacy_complete, adapter, NULL) > 0)
7609 btd_error(adapter->dev_id, "Failed to set privacy for index %u",
7616 static void load_link_keys_complete(uint8_t status, uint16_t length,
7617 const void *param, void *user_data)
7619 struct btd_adapter *adapter = user_data;
7621 if (status != MGMT_STATUS_SUCCESS) {
7622 btd_error(adapter->dev_id,
7623 "Failed to load link keys for hci%u: %s (0x%02x)",
7624 adapter->dev_id, mgmt_errstr(status), status);
7628 DBG("link keys loaded for hci%u", adapter->dev_id);
7631 static void load_link_keys(struct btd_adapter *adapter, GSList *keys,
7634 struct mgmt_cp_load_link_keys *cp;
7635 struct mgmt_link_key_info *key;
7636 size_t key_count, cp_size;
7641 * If the controller does not support BR/EDR operation,
7642 * there is no point in trying to load the link keys into
7645 * This is an optimization for Low Energy only controllers.
7647 if (!(adapter->supported_settings & MGMT_SETTING_BREDR))
7650 key_count = g_slist_length(keys);
7652 DBG("hci%u keys %zu debug_keys %d", adapter->dev_id, key_count,
7655 cp_size = sizeof(*cp) + (key_count * sizeof(*key));
7657 cp = g_try_malloc0(cp_size);
7659 btd_error(adapter->dev_id, "No memory for link keys for hci%u",
7665 * Even if the list of stored keys is empty, it is important to
7666 * load an empty list into the kernel. That way it is ensured
7667 * that no old keys from a previous daemon are present.
7669 * In addition it is also the only way to toggle the different
7670 * behavior for debug keys.
7672 cp->debug_keys = debug_keys;
7673 cp->key_count = htobs(key_count);
7675 for (l = keys, key = cp->keys; l != NULL; l = g_slist_next(l), key++) {
7676 struct link_key_info *info = l->data;
7678 bacpy(&key->addr.bdaddr, &info->bdaddr);
7679 key->addr.type = BDADDR_BREDR;
7680 key->type = info->type;
7681 memcpy(key->val, info->key, 16);
7682 key->pin_len = info->pin_len;
7685 id = mgmt_send(adapter->mgmt, MGMT_OP_LOAD_LINK_KEYS,
7686 adapter->dev_id, cp_size, cp,
7687 load_link_keys_complete, adapter, NULL);
7692 btd_error(adapter->dev_id, "Failed to load link keys for hci%u",
7696 static gboolean load_ltks_timeout(gpointer user_data)
7698 struct btd_adapter *adapter = user_data;
7700 btd_error(adapter->dev_id, "Loading LTKs timed out for hci%u",
7703 adapter->load_ltks_timeout = 0;
7705 mgmt_cancel(adapter->mgmt, adapter->load_ltks_id);
7706 adapter->load_ltks_id = 0;
7711 static void load_ltks_complete(uint8_t status, uint16_t length,
7712 const void *param, void *user_data)
7714 struct btd_adapter *adapter = user_data;
7716 if (status != MGMT_STATUS_SUCCESS) {
7717 btd_error(adapter->dev_id,
7718 "Failed to load LTKs for hci%u: %s (0x%02x)",
7719 adapter->dev_id, mgmt_errstr(status), status);
7722 adapter->load_ltks_id = 0;
7724 g_source_remove(adapter->load_ltks_timeout);
7725 adapter->load_ltks_timeout = 0;
7727 DBG("LTKs loaded for hci%u", adapter->dev_id);
7730 static void load_ltks(struct btd_adapter *adapter, GSList *keys)
7732 struct mgmt_cp_load_long_term_keys *cp;
7733 struct mgmt_ltk_info *key;
7734 size_t key_count, cp_size;
7738 * If the controller does not support Low Energy operation,
7739 * there is no point in trying to load the long term keys
7742 * While there is no harm in loading keys into the kernel,
7743 * this is an optimization to avoid a confusing warning
7744 * message when the loading of the keys timed out due to
7745 * a kernel bug (see comment below).
7747 if (!(adapter->supported_settings & MGMT_SETTING_LE))
7750 key_count = g_slist_length(keys);
7752 DBG("hci%u keys %zu", adapter->dev_id, key_count);
7754 cp_size = sizeof(*cp) + (key_count * sizeof(*key));
7756 cp = g_try_malloc0(cp_size);
7758 btd_error(adapter->dev_id, "No memory for LTKs for hci%u",
7764 * Even if the list of stored keys is empty, it is important to
7765 * load an empty list into the kernel. That way it is ensured
7766 * that no old keys from a previous daemon are present.
7768 cp->key_count = htobs(key_count);
7770 for (l = keys, key = cp->keys; l != NULL; l = g_slist_next(l), key++) {
7771 struct smp_ltk_info *info = l->data;
7773 bacpy(&key->addr.bdaddr, &info->bdaddr);
7774 key->addr.type = info->bdaddr_type;
7775 memcpy(key->val, info->val, sizeof(info->val));
7776 key->rand = cpu_to_le64(info->rand);
7777 key->ediv = cpu_to_le16(info->ediv);
7778 key->type = info->authenticated;
7779 key->master = info->master;
7780 key->enc_size = info->enc_size;
7783 adapter->load_ltks_id = mgmt_send(adapter->mgmt,
7784 MGMT_OP_LOAD_LONG_TERM_KEYS,
7785 adapter->dev_id, cp_size, cp,
7786 load_ltks_complete, adapter, NULL);
7790 if (adapter->load_ltks_id == 0) {
7791 btd_error(adapter->dev_id, "Failed to load LTKs for hci%u",
7797 * This timeout handling is needed since the kernel is stupid
7798 * and forgets to send a command complete response. However in
7799 * case of failures it does send a command status.
7801 adapter->load_ltks_timeout = g_timeout_add_seconds(2,
7802 load_ltks_timeout, adapter);
7805 static void load_irks_complete(uint8_t status, uint16_t length,
7806 const void *param, void *user_data)
7808 struct btd_adapter *adapter = user_data;
7810 if (status == MGMT_STATUS_UNKNOWN_COMMAND) {
7811 btd_info(adapter->dev_id,
7812 "Load IRKs failed: Kernel doesn't support LE Privacy");
7816 if (status != MGMT_STATUS_SUCCESS) {
7817 btd_error(adapter->dev_id,
7818 "Failed to load IRKs for hci%u: %s (0x%02x)",
7819 adapter->dev_id, mgmt_errstr(status), status);
7823 DBG("IRKs loaded for hci%u", adapter->dev_id);
7826 static void load_irks(struct btd_adapter *adapter, GSList *irks)
7828 struct mgmt_cp_load_irks *cp;
7829 struct mgmt_irk_info *irk;
7830 size_t irk_count, cp_size;
7835 * If the controller does not support LE Privacy operation,
7836 * there is no support for loading identity resolving keys
7839 if (!(adapter->supported_settings & MGMT_SETTING_PRIVACY))
7842 irk_count = g_slist_length(irks);
7844 DBG("hci%u irks %zu", adapter->dev_id, irk_count);
7846 cp_size = sizeof(*cp) + (irk_count * sizeof(*irk));
7848 cp = g_try_malloc0(cp_size);
7850 btd_error(adapter->dev_id, "No memory for IRKs for hci%u",
7856 * Even if the list of stored keys is empty, it is important to
7857 * load an empty list into the kernel. That way we tell the
7858 * kernel that we are able to handle New IRK events.
7860 cp->irk_count = htobs(irk_count);
7862 for (l = irks, irk = cp->irks; l != NULL; l = g_slist_next(l), irk++) {
7863 struct irk_info *info = l->data;
7865 bacpy(&irk->addr.bdaddr, &info->bdaddr);
7866 irk->addr.type = info->bdaddr_type;
7867 memcpy(irk->val, info->val, sizeof(irk->val));
7870 id = mgmt_send(adapter->mgmt, MGMT_OP_LOAD_IRKS, adapter->dev_id,
7871 cp_size, cp, load_irks_complete, adapter, NULL);
7876 btd_error(adapter->dev_id, "Failed to IRKs for hci%u",
7880 static void load_conn_params_complete(uint8_t status, uint16_t length,
7881 const void *param, void *user_data)
7883 struct btd_adapter *adapter = user_data;
7885 if (status != MGMT_STATUS_SUCCESS) {
7886 btd_error(adapter->dev_id,
7887 "hci%u Load Connection Parameters failed: %s (0x%02x)",
7888 adapter->dev_id, mgmt_errstr(status), status);
7892 DBG("Connection Parameters loaded for hci%u", adapter->dev_id);
7895 static void load_conn_params(struct btd_adapter *adapter, GSList *params)
7897 struct mgmt_cp_load_conn_param *cp;
7898 struct mgmt_conn_param *param;
7899 size_t param_count, cp_size;
7904 * If the controller does not support Low Energy operation,
7905 * there is no point in trying to load the connection
7906 * parameters into the kernel.
7908 if (!(adapter->supported_settings & MGMT_SETTING_LE))
7911 param_count = g_slist_length(params);
7913 DBG("hci%u conn params %zu", adapter->dev_id, param_count);
7915 cp_size = sizeof(*cp) + (param_count * sizeof(*param));
7917 cp = g_try_malloc0(cp_size);
7919 btd_error(adapter->dev_id,
7920 "Failed to allocate memory for connection parameters");
7924 cp->param_count = htobs(param_count);
7926 for (l = params, param = cp->params; l; l = g_slist_next(l), param++) {
7927 struct conn_param *info = l->data;
7929 bacpy(¶m->addr.bdaddr, &info->bdaddr);
7930 param->addr.type = info->bdaddr_type;
7931 param->min_interval = htobs(info->min_interval);
7932 param->max_interval = htobs(info->max_interval);
7933 param->latency = htobs(info->latency);
7934 param->timeout = htobs(info->timeout);
7937 id = mgmt_send(adapter->mgmt, MGMT_OP_LOAD_CONN_PARAM, adapter->dev_id,
7938 cp_size, cp, load_conn_params_complete, adapter, NULL);
7943 btd_error(adapter->dev_id, "Load connection parameters failed");
7946 static uint8_t get_le_addr_type(GKeyFile *keyfile)
7951 type = g_key_file_get_string(keyfile, "General", "AddressType", NULL);
7953 return BDADDR_LE_PUBLIC;
7955 if (g_str_equal(type, "public"))
7956 addr_type = BDADDR_LE_PUBLIC;
7957 else if (g_str_equal(type, "static"))
7958 addr_type = BDADDR_LE_RANDOM;
7960 addr_type = BDADDR_LE_PUBLIC;
7967 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
7968 static uint8_t get_addr_type(GKeyFile *keyfile)
7972 uint8_t bdaddr_type = BDADDR_BREDR;
7975 /* Load device technology */
7976 techno = g_key_file_get_string_list(keyfile, "General",
7977 "SupportedTechnologies", NULL, NULL);
7981 for (t = techno; *t; t++) {
7982 if (g_str_equal(*t, "LE"))
7987 bdaddr_type = BDADDR_BREDR;
7989 str = g_key_file_get_string(keyfile, "General",
7990 "AddressType", NULL);
7992 if (str && g_str_equal(str, "public"))
7993 bdaddr_type = BDADDR_LE_PUBLIC;
7994 else if (str && g_str_equal(str, "static"))
7995 bdaddr_type = BDADDR_LE_RANDOM;
7997 error("Unknown LE device technology");
8008 static void probe_devices(void *user_data)
8010 struct btd_device *device = user_data;
8012 device_probe_profiles(device, btd_device_get_uuids(device));
8015 static void load_devices(struct btd_adapter *adapter)
8017 char dirname[PATH_MAX];
8018 GSList *keys = NULL;
8019 GSList *ltks = NULL;
8020 GSList *irks = NULL;
8021 GSList *params = NULL;
8022 GSList *added_devices = NULL;
8024 struct dirent *entry;
8026 snprintf(dirname, PATH_MAX, STORAGEDIR "/%s", adapter_dir(adapter));
8028 dir = opendir(dirname);
8030 btd_error(adapter->dev_id,
8031 "Unable to open adapter storage directory: %s",
8036 while ((entry = readdir(dir)) != NULL) {
8037 struct btd_device *device;
8038 char filename[PATH_MAX];
8040 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
8041 struct link_key_info *key_info = NULL;
8042 GSList *list, *ltk_info = NULL;
8043 struct device_addr_type addr;
8045 struct link_key_info *key_info;
8046 GSList *list, *ltk_info;
8048 struct irk_info *irk_info;
8049 struct conn_param *param;
8050 uint8_t bdaddr_type;
8052 if (entry->d_type == DT_UNKNOWN)
8053 entry->d_type = util_get_dt(dirname, entry->d_name);
8055 if (entry->d_type != DT_DIR || bachk(entry->d_name) < 0)
8058 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
8062 str2ba(entry->d_name, &bdaddr);
8064 if (!bacmp(&bdaddr, BDADDR_ANY)) {
8065 error("No Bluetooth address");
8070 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/%s/info",
8071 adapter_dir(adapter), entry->d_name);
8073 key_file = g_key_file_new();
8074 g_key_file_load_from_file(key_file, filename, 0, NULL);
8076 key_info = get_key_info(key_file, entry->d_name);
8078 keys = g_slist_append(keys, key_info);
8080 bdaddr_type = get_le_addr_type(key_file);
8082 ltk_info = get_ltk_info(key_file, entry->d_name, bdaddr_type);
8083 ltks = g_slist_concat(ltks, ltk_info);
8085 irk_info = get_irk_info(key_file, entry->d_name, bdaddr_type);
8087 irks = g_slist_append(irks, irk_info);
8089 param = get_conn_param(key_file, entry->d_name, bdaddr_type);
8091 params = g_slist_append(params, param);
8093 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
8094 str2ba(entry->d_name, &addr.bdaddr);
8095 addr.bdaddr_type = get_addr_type(key_file);
8096 if (addr.bdaddr_type == 0xff) {
8097 error("No SupportedTechnologies. Skipping");
8101 list = g_slist_find_custom(adapter->devices, &addr,
8102 device_addr_type_strict_cmp);
8104 list = g_slist_find_custom(adapter->devices, entry->d_name,
8105 device_address_cmp);
8108 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
8109 DBG("Skip already loaded device [%s] [%d]",
8110 entry->d_name, addr.bdaddr_type);
8112 device = list->data;
8116 device = device_create_from_storage(adapter, entry->d_name,
8121 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
8126 * After loading IRK information from file,
8127 * store it into device->bdaddr.
8128 * RPA is stored in device->rpa_addr
8130 ba2str(device_get_address(device), idaddr);
8132 DBG("irk address: %s, rpa_exist %d",
8133 idaddr, device_get_rpa_exist(device));
8135 if (device_get_rpa_exist(device) == true) {
8137 str2ba(idaddr, &key_info->bdaddr);
8140 ltks = g_slist_remove(ltks, ltk_info);
8141 ltk_info = get_ltk_info(key_file,
8142 idaddr, bdaddr_type);
8143 ltks = g_slist_concat(ltks, ltk_info);
8147 str2ba(idaddr, &irk_info->bdaddr);
8148 device_set_irk_value(device, irk_info->val);
8152 str2ba(idaddr, ¶m->bdaddr);
8157 btd_device_set_temporary(device, false);
8158 adapter->devices = g_slist_append(adapter->devices, device);
8160 /* TODO: register services from pre-loaded list of primaries */
8162 added_devices = g_slist_append(added_devices, device);
8166 device_set_paired(device, BDADDR_BREDR);
8167 device_set_bonded(device, BDADDR_BREDR);
8171 device_set_paired(device, bdaddr_type);
8172 device_set_bonded(device, bdaddr_type);
8176 g_key_file_free(key_file);
8181 load_link_keys(adapter, keys, main_opts.debug_keys);
8182 g_slist_free_full(keys, g_free);
8184 load_ltks(adapter, ltks);
8185 g_slist_free_full(ltks, g_free);
8186 load_irks(adapter, irks);
8187 g_slist_free_full(irks, g_free);
8188 load_conn_params(adapter, params);
8189 g_slist_free_full(params, g_free);
8191 g_slist_free_full(added_devices, probe_devices);
8194 int btd_adapter_block_address(struct btd_adapter *adapter,
8195 const bdaddr_t *bdaddr, uint8_t bdaddr_type)
8197 struct mgmt_cp_block_device cp;
8200 ba2str(bdaddr, addr);
8201 DBG("hci%u %s", adapter->dev_id, addr);
8203 memset(&cp, 0, sizeof(cp));
8204 bacpy(&cp.addr.bdaddr, bdaddr);
8205 cp.addr.type = bdaddr_type;
8207 if (mgmt_send(adapter->mgmt, MGMT_OP_BLOCK_DEVICE,
8208 adapter->dev_id, sizeof(cp), &cp,
8209 NULL, NULL, NULL) > 0)
8215 int btd_adapter_unblock_address(struct btd_adapter *adapter,
8216 const bdaddr_t *bdaddr, uint8_t bdaddr_type)
8218 struct mgmt_cp_unblock_device cp;
8221 ba2str(bdaddr, addr);
8222 DBG("hci%u %s", adapter->dev_id, addr);
8224 memset(&cp, 0, sizeof(cp));
8225 bacpy(&cp.addr.bdaddr, bdaddr);
8226 cp.addr.type = bdaddr_type;
8228 if (mgmt_send(adapter->mgmt, MGMT_OP_UNBLOCK_DEVICE,
8229 adapter->dev_id, sizeof(cp), &cp,
8230 NULL, NULL, NULL) > 0)
8236 static int clear_blocked(struct btd_adapter *adapter)
8238 return btd_adapter_unblock_address(adapter, BDADDR_ANY, 0);
8241 static void probe_driver(struct btd_adapter *adapter, gpointer user_data)
8243 struct btd_adapter_driver *driver = user_data;
8246 if (driver->probe == NULL)
8249 err = driver->probe(adapter);
8251 btd_error(adapter->dev_id, "%s: %s (%d)", driver->name,
8252 strerror(-err), -err);
8256 adapter->drivers = g_slist_prepend(adapter->drivers, driver);
8259 static void load_drivers(struct btd_adapter *adapter)
8263 for (l = adapter_drivers; l; l = l->next)
8264 probe_driver(adapter, l->data);
8267 static void probe_profile(struct btd_profile *profile, void *data)
8269 struct btd_adapter *adapter = data;
8272 if (profile->adapter_probe == NULL)
8275 err = profile->adapter_probe(profile, adapter);
8277 btd_error(adapter->dev_id, "%s: %s (%d)", profile->name,
8278 strerror(-err), -err);
8282 adapter->profiles = g_slist_prepend(adapter->profiles, profile);
8285 void adapter_add_profile(struct btd_adapter *adapter, gpointer p)
8287 struct btd_profile *profile = p;
8289 if (!adapter->initialized)
8292 probe_profile(profile, adapter);
8294 g_slist_foreach(adapter->devices, device_probe_profile, profile);
8297 void adapter_remove_profile(struct btd_adapter *adapter, gpointer p)
8299 struct btd_profile *profile = p;
8301 if (!adapter->initialized)
8304 if (profile->device_remove)
8305 g_slist_foreach(adapter->devices, device_remove_profile, p);
8307 adapter->profiles = g_slist_remove(adapter->profiles, profile);
8309 if (profile->adapter_remove)
8310 profile->adapter_remove(profile, adapter);
8313 static void adapter_add_connection(struct btd_adapter *adapter,
8314 struct btd_device *device,
8315 uint8_t bdaddr_type)
8317 device_add_connection(device, bdaddr_type);
8319 if (g_slist_find(adapter->connections, device)) {
8320 btd_error(adapter->dev_id,
8321 "Device is already marked as connected");
8325 adapter->connections = g_slist_append(adapter->connections, device);
8328 static void get_connections_complete(uint8_t status, uint16_t length,
8329 const void *param, void *user_data)
8331 struct btd_adapter *adapter = user_data;
8332 const struct mgmt_rp_get_connections *rp = param;
8333 uint16_t i, conn_count;
8335 if (status != MGMT_STATUS_SUCCESS) {
8336 btd_error(adapter->dev_id,
8337 "Failed to get connections: %s (0x%02x)",
8338 mgmt_errstr(status), status);
8342 if (length < sizeof(*rp)) {
8343 btd_error(adapter->dev_id,
8344 "Wrong size of get connections response");
8348 conn_count = btohs(rp->conn_count);
8350 DBG("Connection count: %d", conn_count);
8352 if (conn_count * sizeof(struct mgmt_addr_info) +
8353 sizeof(*rp) != length) {
8354 btd_error(adapter->dev_id,
8355 "Incorrect packet size for get connections response");
8359 for (i = 0; i < conn_count; i++) {
8360 const struct mgmt_addr_info *addr = &rp->addr[i];
8361 struct btd_device *device;
8364 ba2str(&addr->bdaddr, address);
8365 DBG("Adding existing connection to %s", address);
8367 device = btd_adapter_get_device(adapter, &addr->bdaddr,
8370 adapter_add_connection(adapter, device, addr->type);
8374 static void load_connections(struct btd_adapter *adapter)
8376 DBG("sending get connections command for index %u", adapter->dev_id);
8378 if (mgmt_send(adapter->mgmt, MGMT_OP_GET_CONNECTIONS,
8379 adapter->dev_id, 0, NULL,
8380 get_connections_complete, adapter, NULL) > 0)
8383 btd_error(adapter->dev_id, "Failed to get connections for index %u",
8387 bool btd_adapter_get_pairable(struct btd_adapter *adapter)
8389 if (adapter->current_settings & MGMT_SETTING_BONDABLE)
8395 bool btd_adapter_get_powered(struct btd_adapter *adapter)
8397 if (adapter->current_settings & MGMT_SETTING_POWERED)
8403 bool btd_adapter_get_connectable(struct btd_adapter *adapter)
8405 if (adapter->current_settings & MGMT_SETTING_CONNECTABLE)
8411 struct btd_gatt_database *btd_adapter_get_database(struct btd_adapter *adapter)
8416 return adapter->database;
8419 uint32_t btd_adapter_get_class(struct btd_adapter *adapter)
8421 return adapter->dev_class;
8424 const char *btd_adapter_get_name(struct btd_adapter *adapter)
8426 if (adapter->stored_alias)
8427 return adapter->stored_alias;
8429 if (adapter->system_name)
8430 return adapter->system_name;
8435 int adapter_connect_list_add(struct btd_adapter *adapter,
8436 struct btd_device *device)
8439 * If the adapter->connect_le device is getting added back to
8440 * the connect list it probably means that the connect attempt
8441 * failed and hence we should clear this pointer
8443 if (device == adapter->connect_le)
8444 adapter->connect_le = NULL;
8447 * If kernel background scanning is supported then the
8448 * adapter_auto_connect_add() function is used to maintain what to
8451 if (kernel_conn_control)
8454 if (g_slist_find(adapter->connect_list, device)) {
8455 DBG("ignoring already added device %s",
8456 device_get_path(device));
8460 if (!(adapter->supported_settings & MGMT_SETTING_LE)) {
8461 btd_error(adapter->dev_id,
8462 "Can't add %s to non-LE capable adapter connect list",
8463 device_get_path(device));
8467 adapter->connect_list = g_slist_append(adapter->connect_list, device);
8468 DBG("%s added to %s's connect_list", device_get_path(device),
8469 adapter->system_name);
8472 if (!(adapter->current_settings & MGMT_SETTING_POWERED))
8475 trigger_passive_scanning(adapter);
8480 void adapter_connect_list_remove(struct btd_adapter *adapter,
8481 struct btd_device *device)
8484 * If the adapter->connect_le device is being removed from the
8485 * connect list it means the connection was successful and hence
8486 * the pointer should be cleared
8488 if (device == adapter->connect_le)
8489 adapter->connect_le = NULL;
8491 if (kernel_conn_control)
8494 if (!g_slist_find(adapter->connect_list, device)) {
8495 DBG("device %s is not on the list, ignoring",
8496 device_get_path(device));
8500 adapter->connect_list = g_slist_remove(adapter->connect_list, device);
8501 DBG("%s removed from %s's connect_list", device_get_path(device),
8502 adapter->system_name);
8504 if (!adapter->connect_list) {
8505 stop_passive_scanning(adapter);
8509 if (!(adapter->current_settings & MGMT_SETTING_POWERED))
8512 trigger_passive_scanning(adapter);
8515 static void add_whitelist_complete(uint8_t status, uint16_t length,
8516 const void *param, void *user_data)
8518 const struct mgmt_rp_add_device *rp = param;
8519 struct btd_adapter *adapter = user_data;
8520 struct btd_device *dev;
8523 if (length < sizeof(*rp)) {
8524 btd_error(adapter->dev_id,
8525 "Too small Add Device complete event");
8529 ba2str(&rp->addr.bdaddr, addr);
8531 dev = btd_adapter_find_device(adapter, &rp->addr.bdaddr,
8534 btd_error(adapter->dev_id,
8535 "Add Device complete for unknown device %s", addr);
8539 if (status != MGMT_STATUS_SUCCESS) {
8540 btd_error(adapter->dev_id,
8541 "Failed to add device %s: %s (0x%02x)",
8542 addr, mgmt_errstr(status), status);
8546 DBG("%s added to kernel whitelist", addr);
8549 void adapter_whitelist_add(struct btd_adapter *adapter, struct btd_device *dev)
8551 struct mgmt_cp_add_device cp;
8553 if (!kernel_conn_control)
8556 memset(&cp, 0, sizeof(cp));
8557 bacpy(&cp.addr.bdaddr, device_get_address(dev));
8558 cp.addr.type = BDADDR_BREDR;
8561 mgmt_send(adapter->mgmt, MGMT_OP_ADD_DEVICE,
8562 adapter->dev_id, sizeof(cp), &cp,
8563 add_whitelist_complete, adapter, NULL);
8566 static void remove_whitelist_complete(uint8_t status, uint16_t length,
8567 const void *param, void *user_data)
8569 const struct mgmt_rp_remove_device *rp = param;
8572 if (length < sizeof(*rp)) {
8573 error("Too small Remove Device complete event");
8577 ba2str(&rp->addr.bdaddr, addr);
8579 if (status != MGMT_STATUS_SUCCESS) {
8580 error("Failed to remove device %s: %s (0x%02x)",
8581 addr, mgmt_errstr(status), status);
8585 DBG("%s removed from kernel whitelist", addr);
8588 void adapter_whitelist_remove(struct btd_adapter *adapter, struct btd_device *dev)
8590 struct mgmt_cp_remove_device cp;
8592 if (!kernel_conn_control)
8595 memset(&cp, 0, sizeof(cp));
8596 bacpy(&cp.addr.bdaddr, device_get_address(dev));
8597 cp.addr.type = BDADDR_BREDR;
8599 mgmt_send(adapter->mgmt, MGMT_OP_REMOVE_DEVICE,
8600 adapter->dev_id, sizeof(cp), &cp,
8601 remove_whitelist_complete, adapter, NULL);
8604 static void add_device_complete(uint8_t status, uint16_t length,
8605 const void *param, void *user_data)
8607 const struct mgmt_rp_add_device *rp = param;
8608 struct btd_adapter *adapter = user_data;
8609 struct btd_device *dev;
8612 if (length < sizeof(*rp)) {
8613 btd_error(adapter->dev_id,
8614 "Too small Add Device complete event");
8618 ba2str(&rp->addr.bdaddr, addr);
8620 dev = btd_adapter_find_device(adapter, &rp->addr.bdaddr,
8623 btd_error(adapter->dev_id,
8624 "Add Device complete for unknown device %s", addr);
8628 if (status != MGMT_STATUS_SUCCESS) {
8629 btd_error(adapter->dev_id,
8630 "Failed to add device %s (%u): %s (0x%02x)",
8631 addr, rp->addr.type, mgmt_errstr(status), status);
8632 adapter->connect_list = g_slist_remove(adapter->connect_list,
8637 DBG("%s (%u) added to kernel connect list", addr, rp->addr.type);
8640 void adapter_auto_connect_add(struct btd_adapter *adapter,
8641 struct btd_device *device)
8643 struct mgmt_cp_add_device cp;
8644 const bdaddr_t *bdaddr;
8645 uint8_t bdaddr_type;
8648 if (!kernel_conn_control)
8651 if (g_slist_find(adapter->connect_list, device)) {
8652 DBG("ignoring already added device %s",
8653 device_get_path(device));
8657 bdaddr = device_get_address(device);
8658 bdaddr_type = btd_device_get_bdaddr_type(device);
8660 if (bdaddr_type == BDADDR_BREDR) {
8661 DBG("auto-connection feature is not avaiable for BR/EDR");
8665 memset(&cp, 0, sizeof(cp));
8666 bacpy(&cp.addr.bdaddr, bdaddr);
8667 cp.addr.type = bdaddr_type;
8670 id = mgmt_send(adapter->mgmt, MGMT_OP_ADD_DEVICE,
8671 adapter->dev_id, sizeof(cp), &cp, add_device_complete,
8676 adapter->connect_list = g_slist_append(adapter->connect_list, device);
8679 static void remove_device_complete(uint8_t status, uint16_t length,
8680 const void *param, void *user_data)
8682 const struct mgmt_rp_remove_device *rp = param;
8685 if (length < sizeof(*rp)) {
8686 error("Too small Remove Device complete event");
8690 ba2str(&rp->addr.bdaddr, addr);
8692 if (status != MGMT_STATUS_SUCCESS) {
8693 error("Failed to remove device %s (%u): %s (0x%02x)",
8694 addr, rp->addr.type, mgmt_errstr(status), status);
8698 DBG("%s (%u) removed from kernel connect list", addr, rp->addr.type);
8701 void adapter_auto_connect_remove(struct btd_adapter *adapter,
8702 struct btd_device *device)
8704 struct mgmt_cp_remove_device cp;
8705 const bdaddr_t *bdaddr;
8706 uint8_t bdaddr_type;
8709 if (!kernel_conn_control)
8712 if (!g_slist_find(adapter->connect_list, device)) {
8713 DBG("ignoring not added device %s", device_get_path(device));
8717 bdaddr = device_get_address(device);
8718 bdaddr_type = btd_device_get_bdaddr_type(device);
8720 if (bdaddr_type == BDADDR_BREDR) {
8721 DBG("auto-connection feature is not avaiable for BR/EDR");
8725 memset(&cp, 0, sizeof(cp));
8726 bacpy(&cp.addr.bdaddr, bdaddr);
8727 cp.addr.type = bdaddr_type;
8729 id = mgmt_send(adapter->mgmt, MGMT_OP_REMOVE_DEVICE,
8730 adapter->dev_id, sizeof(cp), &cp,
8731 remove_device_complete, adapter, NULL);
8735 adapter->connect_list = g_slist_remove(adapter->connect_list, device);
8738 static void adapter_start(struct btd_adapter *adapter)
8740 #if defined(TIZEN_FEATURE_BLUEZ_MODIFY) && !defined(__SPRD_PATCH__)
8741 if (adapter_le_read_ble_feature_info())
8742 g_dbus_emit_property_changed(dbus_conn, adapter->path,
8743 ADAPTER_INTERFACE, "SupportedLEFeatures");
8744 #ifdef TIZEN_FEATURE_PLATFROM_SCAN_FILTER
8746 g_dbus_emit_property_changed(dbus_conn, adapter->path,
8747 ADAPTER_INTERFACE, "SupportedLEFeatures");
8750 adapter_get_adv_tx_power(adapter);
8752 /* By default enable offloading for testing, this should be modified */
8753 if (adapter_le_is_supported_offloading())
8754 adapter_le_enable_offloading(TRUE);
8757 #ifndef TIZEN_FEATURE_BLUEZ_MODIFY
8758 g_dbus_emit_property_changed(dbus_conn, adapter->path,
8759 ADAPTER_INTERFACE, "Powered");
8761 g_dbus_emit_property_changed_full(dbus_conn, adapter->path,
8762 ADAPTER_INTERFACE, "Powered", 1);
8765 DBG("adapter %s has been enabled", adapter->path);
8767 trigger_passive_scanning(adapter);
8770 static void reply_pending_requests(struct btd_adapter *adapter)
8777 /* pending bonding */
8778 for (l = adapter->devices; l; l = l->next) {
8779 struct btd_device *device = l->data;
8781 if (device_is_bonding(device, NULL))
8782 device_bonding_failed(device,
8783 HCI_OE_USER_ENDED_CONNECTION);
8787 static void remove_driver(gpointer data, gpointer user_data)
8789 struct btd_adapter_driver *driver = data;
8790 struct btd_adapter *adapter = user_data;
8793 driver->remove(adapter);
8796 static void remove_profile(gpointer data, gpointer user_data)
8798 struct btd_profile *profile = data;
8799 struct btd_adapter *adapter = user_data;
8801 if (profile->adapter_remove)
8802 profile->adapter_remove(profile, adapter);
8805 static void unload_drivers(struct btd_adapter *adapter)
8807 g_slist_foreach(adapter->drivers, remove_driver, adapter);
8808 g_slist_free(adapter->drivers);
8809 adapter->drivers = NULL;
8811 g_slist_foreach(adapter->profiles, remove_profile, adapter);
8812 g_slist_free(adapter->profiles);
8813 adapter->profiles = NULL;
8816 static void free_service_auth(gpointer data, gpointer user_data)
8818 struct service_auth *auth = data;
8823 static void adapter_free(gpointer user_data)
8825 struct btd_adapter *adapter = user_data;
8829 if (adapter->pairable_timeout_id > 0) {
8830 g_source_remove(adapter->pairable_timeout_id);
8831 adapter->pairable_timeout_id = 0;
8834 if (adapter->passive_scan_timeout > 0) {
8835 g_source_remove(adapter->passive_scan_timeout);
8836 adapter->passive_scan_timeout = 0;
8839 if (adapter->load_ltks_timeout > 0)
8840 g_source_remove(adapter->load_ltks_timeout);
8842 if (adapter->confirm_name_timeout > 0)
8843 g_source_remove(adapter->confirm_name_timeout);
8845 if (adapter->pair_device_timeout > 0)
8846 g_source_remove(adapter->pair_device_timeout);
8848 if (adapter->auth_idle_id)
8849 g_source_remove(adapter->auth_idle_id);
8851 g_queue_foreach(adapter->auths, free_service_auth, NULL);
8852 g_queue_free(adapter->auths);
8855 * Unregister all handlers for this specific index since
8856 * the adapter bound to them is no longer valid.
8858 * This also avoids having multiple instances of the same
8859 * handler in case indexes got removed and re-added.
8861 mgmt_unregister_index(adapter->mgmt, adapter->dev_id);
8864 * Cancel all pending commands for this specific index
8865 * since the adapter bound to them is no longer valid.
8867 mgmt_cancel_index(adapter->mgmt, adapter->dev_id);
8869 mgmt_unref(adapter->mgmt);
8871 sdp_list_free(adapter->services, NULL);
8873 g_slist_free(adapter->connections);
8875 g_free(adapter->path);
8876 g_free(adapter->name);
8877 g_free(adapter->short_name);
8878 g_free(adapter->system_name);
8879 g_free(adapter->stored_alias);
8880 g_free(adapter->current_alias);
8881 free(adapter->modalias);
8885 struct btd_adapter *btd_adapter_ref(struct btd_adapter *adapter)
8887 __sync_fetch_and_add(&adapter->ref_count, 1);
8892 void btd_adapter_unref(struct btd_adapter *adapter)
8894 if (__sync_sub_and_fetch(&adapter->ref_count, 1))
8897 if (!adapter->path) {
8898 DBG("Freeing adapter %u", adapter->dev_id);
8900 adapter_free(adapter);
8904 DBG("Freeing adapter %s", adapter->path);
8906 g_dbus_unregister_interface(dbus_conn, adapter->path,
8910 static void convert_names_entry(char *key, char *value, void *user_data)
8912 char *address = user_data;
8914 char filename[PATH_MAX];
8919 if (strchr(key, '#'))
8922 if (bachk(str) != 0)
8925 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/cache/%s", address, str);
8926 create_file(filename, S_IRUSR | S_IWUSR);
8928 key_file = g_key_file_new();
8929 g_key_file_load_from_file(key_file, filename, 0, NULL);
8930 g_key_file_set_string(key_file, "General", "Name", value);
8932 data = g_key_file_to_data(key_file, &length, NULL);
8933 g_file_set_contents(filename, data, length, NULL);
8936 g_key_file_free(key_file);
8939 struct device_converter {
8941 void (*cb)(GKeyFile *key_file, void *value);
8945 static void set_device_type(GKeyFile *key_file, char type)
8948 char *addr_type = NULL;
8955 case BDADDR_LE_PUBLIC:
8957 addr_type = "public";
8959 case BDADDR_LE_RANDOM:
8961 addr_type = "static";
8967 str = g_key_file_get_string(key_file, "General",
8968 "SupportedTechnologies", NULL);
8970 g_key_file_set_string(key_file, "General",
8971 "SupportedTechnologies", techno);
8972 else if (!strstr(str, techno))
8973 g_key_file_set_string(key_file, "General",
8974 "SupportedTechnologies", "BR/EDR;LE");
8979 g_key_file_set_string(key_file, "General", "AddressType",
8983 static void convert_aliases_entry(GKeyFile *key_file, void *value)
8985 g_key_file_set_string(key_file, "General", "Alias", value);
8988 static void convert_trusts_entry(GKeyFile *key_file, void *value)
8990 g_key_file_set_boolean(key_file, "General", "Trusted", TRUE);
8993 static void convert_classes_entry(GKeyFile *key_file, void *value)
8995 g_key_file_set_string(key_file, "General", "Class", value);
8998 static void convert_blocked_entry(GKeyFile *key_file, void *value)
9000 g_key_file_set_boolean(key_file, "General", "Blocked", TRUE);
9003 static void convert_did_entry(GKeyFile *key_file, void *value)
9005 char *vendor_str, *product_str, *version_str;
9008 vendor_str = strchr(value, ' ');
9012 *(vendor_str++) = 0;
9014 if (g_str_equal(value, "FFFF"))
9017 product_str = strchr(vendor_str, ' ');
9021 *(product_str++) = 0;
9023 version_str = strchr(product_str, ' ');
9027 *(version_str++) = 0;
9029 val = (uint16_t) strtol(value, NULL, 16);
9030 g_key_file_set_integer(key_file, "DeviceID", "Source", val);
9032 val = (uint16_t) strtol(vendor_str, NULL, 16);
9033 g_key_file_set_integer(key_file, "DeviceID", "Vendor", val);
9035 val = (uint16_t) strtol(product_str, NULL, 16);
9036 g_key_file_set_integer(key_file, "DeviceID", "Product", val);
9038 val = (uint16_t) strtol(version_str, NULL, 16);
9039 g_key_file_set_integer(key_file, "DeviceID", "Version", val);
9042 static void convert_linkkey_entry(GKeyFile *key_file, void *value)
9044 char *type_str, *length_str, *str;
9047 type_str = strchr(value, ' ');
9053 length_str = strchr(type_str, ' ');
9057 *(length_str++) = 0;
9059 str = g_strconcat("0x", value, NULL);
9060 g_key_file_set_string(key_file, "LinkKey", "Key", str);
9063 val = strtol(type_str, NULL, 16);
9064 g_key_file_set_integer(key_file, "LinkKey", "Type", val);
9066 val = strtol(length_str, NULL, 16);
9067 g_key_file_set_integer(key_file, "LinkKey", "PINLength", val);
9070 static void convert_ltk_entry(GKeyFile *key_file, void *value)
9072 char *auth_str, *rand_str, *str;
9074 unsigned char auth, master, enc_size;
9075 unsigned short ediv;
9077 auth_str = strchr(value, ' ');
9083 for (i = 0, rand_str = auth_str; i < 4; i++) {
9084 rand_str = strchr(rand_str, ' ');
9085 if (!rand_str || rand_str[1] == '\0')
9091 ret = sscanf(auth_str, " %hhd %hhd %hhd %hd", &auth, &master,
9096 str = g_strconcat("0x", value, NULL);
9097 g_key_file_set_string(key_file, "LongTermKey", "Key", str);
9100 g_key_file_set_integer(key_file, "LongTermKey", "Authenticated", auth);
9101 g_key_file_set_integer(key_file, "LongTermKey", "Master", master);
9102 g_key_file_set_integer(key_file, "LongTermKey", "EncSize", enc_size);
9103 g_key_file_set_integer(key_file, "LongTermKey", "EDiv", ediv);
9105 str = g_strconcat("0x", rand_str, NULL);
9106 g_key_file_set_string(key_file, "LongTermKey", "Rand", str);
9110 static void convert_profiles_entry(GKeyFile *key_file, void *value)
9112 g_strdelimit(value, " ", ';');
9113 g_key_file_set_string(key_file, "General", "Services", value);
9116 static void convert_appearances_entry(GKeyFile *key_file, void *value)
9118 g_key_file_set_string(key_file, "General", "Appearance", value);
9121 static void convert_entry(char *key, char *value, void *user_data)
9123 struct device_converter *converter = user_data;
9124 char type = BDADDR_BREDR;
9125 char filename[PATH_MAX];
9130 if (strchr(key, '#')) {
9132 type = key[18] - '0';
9135 if (bachk(key) != 0)
9138 if (converter->force == FALSE) {
9142 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/%s",
9143 converter->address, key);
9145 err = stat(filename, &st);
9146 if (err || !S_ISDIR(st.st_mode))
9150 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/%s/info",
9151 converter->address, key);
9153 key_file = g_key_file_new();
9154 g_key_file_load_from_file(key_file, filename, 0, NULL);
9156 set_device_type(key_file, type);
9158 converter->cb(key_file, value);
9160 data = g_key_file_to_data(key_file, &length, NULL);
9162 create_file(filename, S_IRUSR | S_IWUSR);
9163 g_file_set_contents(filename, data, length, NULL);
9168 g_key_file_free(key_file);
9171 static void convert_file(char *file, char *address,
9172 void (*cb)(GKeyFile *key_file, void *value),
9175 char filename[PATH_MAX];
9176 struct device_converter converter;
9178 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/%s", address, file);
9180 converter.address = address;
9182 converter.force = force;
9184 textfile_foreach(filename, convert_entry, &converter);
9187 static gboolean record_has_uuid(const sdp_record_t *rec,
9188 const char *profile_uuid)
9192 for (pat = rec->pattern; pat != NULL; pat = pat->next) {
9196 uuid = bt_uuid2string(pat->data);
9200 ret = strcasecmp(uuid, profile_uuid);
9211 static void store_attribute_uuid(GKeyFile *key_file, uint16_t start,
9212 uint16_t end, char *att_uuid,
9215 char handle[6], uuid_str[33];
9218 switch (uuid.type) {
9220 sprintf(uuid_str, "%4.4X", uuid.value.uuid16);
9223 sprintf(uuid_str, "%8.8X", uuid.value.uuid32);
9226 for (i = 0; i < 16; i++)
9227 sprintf(uuid_str + (i * 2), "%2.2X",
9228 uuid.value.uuid128.data[i]);
9234 sprintf(handle, "%hu", start);
9235 g_key_file_set_string(key_file, handle, "UUID", att_uuid);
9236 g_key_file_set_string(key_file, handle, "Value", uuid_str);
9237 g_key_file_set_integer(key_file, handle, "EndGroupHandle", end);
9240 static void store_sdp_record(char *local, char *peer, int handle, char *value)
9242 char filename[PATH_MAX];
9244 char handle_str[11];
9248 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/cache/%s", local, peer);
9250 key_file = g_key_file_new();
9251 g_key_file_load_from_file(key_file, filename, 0, NULL);
9253 sprintf(handle_str, "0x%8.8X", handle);
9254 g_key_file_set_string(key_file, "ServiceRecords", handle_str, value);
9256 data = g_key_file_to_data(key_file, &length, NULL);
9258 create_file(filename, S_IRUSR | S_IWUSR);
9259 g_file_set_contents(filename, data, length, NULL);
9264 g_key_file_free(key_file);
9267 static void convert_sdp_entry(char *key, char *value, void *user_data)
9269 char *src_addr = user_data;
9271 char type = BDADDR_BREDR;
9273 char filename[PATH_MAX];
9278 char *att_uuid, *prim_uuid;
9279 uint16_t start = 0, end = 0, psm = 0;
9284 ret = sscanf(key, "%17s#%hhu#%08X", dst_addr, &type, &handle);
9286 ret = sscanf(key, "%17s#%08X", dst_addr, &handle);
9291 if (bachk(dst_addr) != 0)
9294 /* Check if the device directory has been created as records should
9295 * only be converted for known devices */
9296 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/%s", src_addr, dst_addr);
9298 err = stat(filename, &st);
9299 if (err || !S_ISDIR(st.st_mode))
9302 /* store device records in cache */
9303 store_sdp_record(src_addr, dst_addr, handle, value);
9305 /* Retrieve device record and check if there is an
9306 * attribute entry in it */
9307 sdp_uuid16_create(&uuid, ATT_UUID);
9308 att_uuid = bt_uuid2string(&uuid);
9310 sdp_uuid16_create(&uuid, GATT_PRIM_SVC_UUID);
9311 prim_uuid = bt_uuid2string(&uuid);
9313 rec = record_from_string(value);
9315 if (record_has_uuid(rec, att_uuid))
9318 /* TODO: Do this through btd_gatt_database */
9319 if (!gatt_parse_record(rec, &uuid, &psm, &start, &end))
9322 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/%s/attributes", src_addr,
9325 key_file = g_key_file_new();
9326 g_key_file_load_from_file(key_file, filename, 0, NULL);
9328 store_attribute_uuid(key_file, start, end, prim_uuid, uuid);
9330 data = g_key_file_to_data(key_file, &length, NULL);
9332 create_file(filename, S_IRUSR | S_IWUSR);
9333 g_file_set_contents(filename, data, length, NULL);
9337 g_key_file_free(key_file);
9340 sdp_record_free(rec);
9345 static void convert_primaries_entry(char *key, char *value, void *user_data)
9347 char *address = user_data;
9348 int device_type = -1;
9350 char **services, **service, *prim_uuid;
9351 char filename[PATH_MAX];
9354 uint16_t start, end;
9355 char uuid_str[MAX_LEN_UUID_STR + 1];
9359 if (strchr(key, '#')) {
9361 device_type = key[18] - '0';
9364 if (bachk(key) != 0)
9367 services = g_strsplit(value, " ", 0);
9368 if (services == NULL)
9371 sdp_uuid16_create(&uuid, GATT_PRIM_SVC_UUID);
9372 prim_uuid = bt_uuid2string(&uuid);
9374 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/%s/attributes", address,
9376 key_file = g_key_file_new();
9377 g_key_file_load_from_file(key_file, filename, 0, NULL);
9379 for (service = services; *service; service++) {
9380 ret = sscanf(*service, "%04hX#%04hX#%s", &start, &end,
9385 bt_string2uuid(&uuid, uuid_str);
9386 sdp_uuid128_to_uuid(&uuid);
9388 store_attribute_uuid(key_file, start, end, prim_uuid, uuid);
9391 g_strfreev(services);
9393 data = g_key_file_to_data(key_file, &length, NULL);
9397 create_file(filename, S_IRUSR | S_IWUSR);
9398 g_file_set_contents(filename, data, length, NULL);
9400 if (device_type < 0)
9404 g_key_file_free(key_file);
9406 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/%s/info", address, key);
9408 key_file = g_key_file_new();
9409 g_key_file_load_from_file(key_file, filename, 0, NULL);
9410 set_device_type(key_file, device_type);
9412 data = g_key_file_to_data(key_file, &length, NULL);
9414 create_file(filename, S_IRUSR | S_IWUSR);
9415 g_file_set_contents(filename, data, length, NULL);
9421 g_key_file_free(key_file);
9424 static void convert_ccc_entry(char *key, char *value, void *user_data)
9426 char *src_addr = user_data;
9428 char type = BDADDR_BREDR;
9431 char filename[PATH_MAX];
9438 ret = sscanf(key, "%17s#%hhu#%04hX", dst_addr, &type, &handle);
9442 if (bachk(dst_addr) != 0)
9445 /* Check if the device directory has been created as records should
9446 * only be converted for known devices */
9447 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/%s", src_addr, dst_addr);
9449 err = stat(filename, &st);
9450 if (err || !S_ISDIR(st.st_mode))
9453 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/%s/ccc", src_addr,
9455 key_file = g_key_file_new();
9456 g_key_file_load_from_file(key_file, filename, 0, NULL);
9458 sprintf(group, "%hu", handle);
9459 g_key_file_set_string(key_file, group, "Value", value);
9461 data = g_key_file_to_data(key_file, &length, NULL);
9463 create_file(filename, S_IRUSR | S_IWUSR);
9464 g_file_set_contents(filename, data, length, NULL);
9468 g_key_file_free(key_file);
9471 static void convert_gatt_entry(char *key, char *value, void *user_data)
9473 char *src_addr = user_data;
9475 char type = BDADDR_BREDR;
9478 char filename[PATH_MAX];
9485 ret = sscanf(key, "%17s#%hhu#%04hX", dst_addr, &type, &handle);
9489 if (bachk(dst_addr) != 0)
9492 /* Check if the device directory has been created as records should
9493 * only be converted for known devices */
9494 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/%s", src_addr, dst_addr);
9496 err = stat(filename, &st);
9497 if (err || !S_ISDIR(st.st_mode))
9500 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/%s/gatt", src_addr,
9502 key_file = g_key_file_new();
9503 g_key_file_load_from_file(key_file, filename, 0, NULL);
9505 sprintf(group, "%hu", handle);
9506 g_key_file_set_string(key_file, group, "Value", value);
9508 data = g_key_file_to_data(key_file, &length, NULL);
9510 create_file(filename, S_IRUSR | S_IWUSR);
9511 g_file_set_contents(filename, data, length, NULL);
9515 g_key_file_free(key_file);
9518 static void convert_proximity_entry(char *key, char *value, void *user_data)
9520 char *src_addr = user_data;
9522 char filename[PATH_MAX];
9529 if (!strchr(key, '#'))
9535 if (bachk(key) != 0)
9538 /* Check if the device directory has been created as records should
9539 * only be converted for known devices */
9540 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/%s", src_addr, key);
9542 err = stat(filename, &st);
9543 if (err || !S_ISDIR(st.st_mode))
9546 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/%s/proximity", src_addr,
9548 key_file = g_key_file_new();
9549 g_key_file_load_from_file(key_file, filename, 0, NULL);
9551 g_key_file_set_string(key_file, alert, "Level", value);
9553 data = g_key_file_to_data(key_file, &length, NULL);
9555 create_file(filename, S_IRUSR | S_IWUSR);
9556 g_file_set_contents(filename, data, length, NULL);
9560 g_key_file_free(key_file);
9563 static void convert_device_storage(struct btd_adapter *adapter)
9565 char filename[PATH_MAX];
9568 ba2str(&adapter->bdaddr, address);
9570 /* Convert device's name cache */
9571 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/names", address);
9572 textfile_foreach(filename, convert_names_entry, address);
9574 /* Convert aliases */
9575 convert_file("aliases", address, convert_aliases_entry, TRUE);
9577 /* Convert trusts */
9578 convert_file("trusts", address, convert_trusts_entry, TRUE);
9580 /* Convert blocked */
9581 convert_file("blocked", address, convert_blocked_entry, TRUE);
9583 /* Convert profiles */
9584 convert_file("profiles", address, convert_profiles_entry, TRUE);
9586 /* Convert primaries */
9587 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/primaries", address);
9588 textfile_foreach(filename, convert_primaries_entry, address);
9590 /* Convert linkkeys */
9591 convert_file("linkkeys", address, convert_linkkey_entry, TRUE);
9593 /* Convert longtermkeys */
9594 convert_file("longtermkeys", address, convert_ltk_entry, TRUE);
9596 /* Convert classes */
9597 convert_file("classes", address, convert_classes_entry, FALSE);
9599 /* Convert device ids */
9600 convert_file("did", address, convert_did_entry, FALSE);
9603 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/sdp", address);
9604 textfile_foreach(filename, convert_sdp_entry, address);
9607 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/ccc", address);
9608 textfile_foreach(filename, convert_ccc_entry, address);
9610 /* Convert appearances */
9611 convert_file("appearances", address, convert_appearances_entry, FALSE);
9614 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/gatt", address);
9615 textfile_foreach(filename, convert_gatt_entry, address);
9617 /* Convert proximity */
9618 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/proximity", address);
9619 textfile_foreach(filename, convert_proximity_entry, address);
9622 static void convert_config(struct btd_adapter *adapter, const char *filename,
9626 char str[MAX_NAME_LENGTH + 1];
9627 char config_path[PATH_MAX];
9633 ba2str(&adapter->bdaddr, address);
9634 snprintf(config_path, PATH_MAX, STORAGEDIR "/%s/config", address);
9636 if (read_pairable_timeout(address, &timeout) == 0)
9637 g_key_file_set_integer(key_file, "General",
9638 "PairableTimeout", timeout);
9640 if (read_discoverable_timeout(address, &timeout) == 0)
9641 g_key_file_set_integer(key_file, "General",
9642 "DiscoverableTimeout", timeout);
9644 if (read_on_mode(address, str, sizeof(str)) == 0) {
9645 mode = get_mode(str);
9646 g_key_file_set_boolean(key_file, "General", "Discoverable",
9647 mode == MODE_DISCOVERABLE);
9650 if (read_local_name(&adapter->bdaddr, str) == 0)
9651 g_key_file_set_string(key_file, "General", "Alias", str);
9653 create_file(filename, S_IRUSR | S_IWUSR);
9655 data = g_key_file_to_data(key_file, &length, NULL);
9656 g_file_set_contents(filename, data, length, NULL);
9660 static void fix_storage(struct btd_adapter *adapter)
9662 char filename[PATH_MAX];
9666 ba2str(&adapter->bdaddr, address);
9668 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/config", address);
9669 converted = textfile_get(filename, "converted");
9675 textfile_del(filename, "converted");
9677 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/names", address);
9678 textfile_del(filename, "converted");
9680 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/aliases", address);
9681 textfile_del(filename, "converted");
9683 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/trusts", address);
9684 textfile_del(filename, "converted");
9686 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/blocked", address);
9687 textfile_del(filename, "converted");
9689 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/profiles", address);
9690 textfile_del(filename, "converted");
9692 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/primaries", address);
9693 textfile_del(filename, "converted");
9695 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/linkkeys", address);
9696 textfile_del(filename, "converted");
9698 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/longtermkeys", address);
9699 textfile_del(filename, "converted");
9701 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/classes", address);
9702 textfile_del(filename, "converted");
9704 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/did", address);
9705 textfile_del(filename, "converted");
9707 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/sdp", address);
9708 textfile_del(filename, "converted");
9710 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/ccc", address);
9711 textfile_del(filename, "converted");
9713 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/appearances", address);
9714 textfile_del(filename, "converted");
9716 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/gatt", address);
9717 textfile_del(filename, "converted");
9719 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/proximity", address);
9720 textfile_del(filename, "converted");
9723 static void load_config(struct btd_adapter *adapter)
9726 char filename[PATH_MAX];
9728 GError *gerr = NULL;
9729 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
9733 key_file = g_key_file_new();
9735 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/settings",
9736 adapter_dir(adapter));
9738 if (stat(filename, &st) < 0) {
9739 convert_config(adapter, filename, key_file);
9740 convert_device_storage(adapter);
9743 g_key_file_load_from_file(key_file, filename, 0, NULL);
9746 adapter->stored_alias = g_key_file_get_string(key_file, "General",
9748 if (!adapter->stored_alias) {
9750 adapter->stored_alias = g_key_file_get_string(key_file,
9751 "General", "Name", NULL);
9754 /* Get pairable timeout */
9755 adapter->pairable_timeout = g_key_file_get_integer(key_file, "General",
9756 "PairableTimeout", &gerr);
9758 adapter->pairable_timeout = main_opts.pairto;
9763 /* Get discoverable mode */
9764 adapter->stored_discoverable = g_key_file_get_boolean(key_file,
9765 "General", "Discoverable", &gerr);
9767 adapter->stored_discoverable = false;
9772 /* Get discoverable timeout */
9773 adapter->discoverable_timeout = g_key_file_get_integer(key_file,
9774 "General", "DiscoverableTimeout", &gerr);
9776 adapter->discoverable_timeout = main_opts.discovto;
9781 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
9783 str = g_key_file_get_string(key_file, "General", "DefaultA2DPRole", &gerr);
9785 adapter->a2dp_role = BLUETOOTH_A2DP_SOURCE_ROLE;
9789 if (g_strcmp0(str, "sink") == 0)
9790 adapter->a2dp_role = BLUETOOTH_A2DP_SINK_ROLE;
9791 else if (g_strcmp0(str, "source") == 0)
9792 adapter->a2dp_role = BLUETOOTH_A2DP_SOURCE_ROLE;
9796 g_key_file_free(key_file);
9799 static struct btd_adapter *btd_adapter_new(uint16_t index)
9801 struct btd_adapter *adapter;
9802 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
9803 #ifdef TIZEN_FEATURE_BLUEZ_BATTERY_WATCH
9804 DBusConnection *conn = btd_get_dbus_connection();
9805 DBusMessage *msg = NULL;
9806 DBusMessage *reply = NULL;
9807 int charging_state = 0;
9808 #endif /* TIZEN_FEATURE_BLUEZ_BATTERY_WATCH */
9811 adapter = g_try_new0(struct btd_adapter, 1);
9815 adapter->dev_id = index;
9816 adapter->mgmt = mgmt_ref(mgmt_master);
9817 adapter->pincode_requested = false;
9820 * Setup default configuration values. These are either adapter
9821 * defaults or from a system wide configuration file.
9823 * Some value might be overwritten later on by adapter specific
9824 * configuration. This is to make sure that sane defaults are
9827 adapter->system_name = g_strdup(main_opts.name);
9828 adapter->major_class = (main_opts.class & 0x001f00) >> 8;
9829 adapter->minor_class = (main_opts.class & 0x0000fc) >> 2;
9830 adapter->modalias = bt_modalias(main_opts.did_source,
9831 main_opts.did_vendor,
9832 main_opts.did_product,
9833 main_opts.did_version);
9834 adapter->discoverable_timeout = main_opts.discovto;
9835 adapter->pairable_timeout = main_opts.pairto;
9836 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
9837 adapter->advertising = FALSE;
9840 DBG("System name: %s", adapter->system_name);
9841 DBG("Major class: %u", adapter->major_class);
9842 DBG("Minor class: %u", adapter->minor_class);
9843 DBG("Modalias: %s", adapter->modalias);
9844 DBG("Discoverable timeout: %u seconds", adapter->discoverable_timeout);
9845 DBG("Pairable timeout: %u seconds", adapter->pairable_timeout);
9846 adapter->auths = g_queue_new();
9848 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
9849 #ifdef TIZEN_FEATURE_BLUEZ_BATTERY_WATCH
9850 adapter->charging_watch = g_dbus_add_signal_watch(conn, DEVICED_DEST,
9851 DEVICED_BATT_OBJECT_PATH,
9852 DEVICED_BATT_INTERFACE, "ChargerType",
9853 charging_state_changed, adapter, NULL);
9854 if (adapter->charging_watch == 0)
9855 error("Cannot add signal watch for ChargerType");
9857 msg = dbus_message_new_method_call(DEVICED_DEST,
9858 DEVICED_BATT_OBJECT_PATH,
9859 DEVICED_BATT_INTERFACE, "ChargerType");
9861 reply = dbus_connection_send_with_reply_and_block(conn,
9864 if (dbus_message_get_args(reply, NULL,
9865 DBUS_TYPE_INT32, &charging_state,
9866 DBUS_TYPE_INVALID) == TRUE) {
9867 set_charging_state(adapter, charging_state);
9869 dbus_message_unref(reply);
9871 error("Reply is NULL");
9873 dbus_message_unref(msg);
9875 error("Unable to create dbus message for charging state");
9877 #endif /* TIZEN_FEATURE_BLUEZ_BATTERY_WATCH */
9880 return btd_adapter_ref(adapter);
9883 static void adapter_remove(struct btd_adapter *adapter)
9886 #ifndef TIZEN_FEATURE_BLUEZ_MODIFY
9890 DBG("Removing adapter %s", adapter->path);
9892 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
9893 #ifdef TIZEN_FEATURE_BLUEZ_BATTERY_WATCH
9894 if (adapter->charging_watch > 0) {
9895 g_dbus_remove_watch(btd_get_dbus_connection(),
9896 adapter->charging_watch);
9897 adapter->charging_watch = 0;
9900 if (adapter->charging_timeout) {
9901 g_source_remove(adapter->charging_timeout);
9902 adapter->charging_timeout = 0;
9904 #endif /* TIZEN_FEATURE_BLUEZ_BATTERY_WATCH */
9907 if (adapter->discovery_idle_timeout > 0) {
9908 g_source_remove(adapter->discovery_idle_timeout);
9909 adapter->discovery_idle_timeout = 0;
9912 if (adapter->temp_devices_timeout > 0) {
9913 g_source_remove(adapter->temp_devices_timeout);
9914 adapter->temp_devices_timeout = 0;
9917 discovery_cleanup(adapter);
9919 g_slist_free(adapter->connect_list);
9920 adapter->connect_list = NULL;
9922 for (l = adapter->devices; l; l = l->next)
9923 device_remove(l->data, FALSE);
9925 g_slist_free(adapter->devices);
9926 adapter->devices = NULL;
9928 discovery_cleanup(adapter);
9930 unload_drivers(adapter);
9932 #ifndef TIZEN_FEATURE_BLUEZ_MODIFY
9933 db = btd_gatt_database_get_db(adapter->database);
9934 gatt_db_unregister(db, adapter->db_id);
9937 btd_gatt_database_destroy(adapter->database);
9938 adapter->database = NULL;
9940 btd_adapter_gatt_server_stop(adapter);
9942 btd_adv_manager_destroy(adapter->adv_manager);
9943 adapter->adv_manager = NULL;
9945 g_slist_free(adapter->pin_callbacks);
9946 adapter->pin_callbacks = NULL;
9948 g_slist_free(adapter->msd_callbacks);
9949 adapter->msd_callbacks = NULL;
9952 const char *adapter_get_path(struct btd_adapter *adapter)
9957 return adapter->path;
9960 const bdaddr_t *btd_adapter_get_address(struct btd_adapter *adapter)
9962 return &adapter->bdaddr;
9965 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
9966 const bdaddr_t *btd_adapter_get_le_address(struct btd_adapter *adapter)
9968 if (adapter->le_static_addr.b[5] != 0)
9969 return &adapter->le_static_addr;
9971 return &adapter->bdaddr;
9974 uint8_t btd_adapter_get_le_address_type(struct btd_adapter * adapter)
9976 if (adapter->le_static_addr.b[5] != 0)
9977 return BDADDR_LE_RANDOM;
9979 return BDADDR_LE_PUBLIC;
9983 static gboolean confirm_name_timeout(gpointer user_data)
9985 struct btd_adapter *adapter = user_data;
9987 btd_error(adapter->dev_id, "Confirm name timed out for hci%u",
9990 adapter->confirm_name_timeout = 0;
9992 mgmt_cancel(adapter->mgmt, adapter->confirm_name_id);
9993 adapter->confirm_name_id = 0;
9998 static void confirm_name_complete(uint8_t status, uint16_t length,
9999 const void *param, void *user_data)
10001 struct btd_adapter *adapter = user_data;
10003 if (status != MGMT_STATUS_SUCCESS) {
10004 btd_error(adapter->dev_id,
10005 "Failed to confirm name for hci%u: %s (0x%02x)",
10006 adapter->dev_id, mgmt_errstr(status), status);
10009 adapter->confirm_name_id = 0;
10011 g_source_remove(adapter->confirm_name_timeout);
10012 adapter->confirm_name_timeout = 0;
10014 DBG("Confirm name complete for hci%u", adapter->dev_id);
10017 static void confirm_name(struct btd_adapter *adapter, const bdaddr_t *bdaddr,
10018 uint8_t bdaddr_type, bool name_known)
10020 struct mgmt_cp_confirm_name cp;
10023 ba2str(bdaddr, addr);
10024 DBG("hci%d bdaddr %s name_known %u", adapter->dev_id, addr,
10028 * If the kernel does not answer the confirm name command with
10029 * a command complete or command status in time, this might
10030 * race against another device found event that also requires
10031 * to confirm the name. If there is a pending command, just
10032 * cancel it to be safe here.
10034 if (adapter->confirm_name_id > 0) {
10035 btd_warn(adapter->dev_id,
10036 "Found pending confirm name for hci%u",
10038 mgmt_cancel(adapter->mgmt, adapter->confirm_name_id);
10041 if (adapter->confirm_name_timeout > 0) {
10042 g_source_remove(adapter->confirm_name_timeout);
10043 adapter->confirm_name_timeout = 0;
10046 memset(&cp, 0, sizeof(cp));
10047 bacpy(&cp.addr.bdaddr, bdaddr);
10048 cp.addr.type = bdaddr_type;
10049 cp.name_known = name_known;
10051 adapter->confirm_name_id = mgmt_reply(adapter->mgmt,
10052 MGMT_OP_CONFIRM_NAME,
10053 adapter->dev_id, sizeof(cp), &cp,
10054 confirm_name_complete, adapter, NULL);
10056 if (adapter->confirm_name_id == 0) {
10057 btd_error(adapter->dev_id, "Failed to confirm name for hci%u",
10063 * This timeout handling is needed since the kernel is stupid
10064 * and forgets to send a command complete response. However in
10065 * case of failures it does send a command status.
10067 adapter->confirm_name_timeout = g_timeout_add_seconds(2,
10068 confirm_name_timeout, adapter);
10071 static void adapter_msd_notify(struct btd_adapter *adapter,
10072 struct btd_device *dev,
10075 GSList *cb_l, *cb_next;
10076 GSList *msd_l, *msd_next;
10078 for (cb_l = adapter->msd_callbacks; cb_l != NULL; cb_l = cb_next) {
10079 btd_msd_cb_t cb = cb_l->data;
10081 cb_next = g_slist_next(cb_l);
10083 for (msd_l = msd_list; msd_l != NULL; msd_l = msd_next) {
10084 const struct eir_msd *msd = msd_l->data;
10086 msd_next = g_slist_next(msd_l);
10088 cb(adapter, dev, msd->company, msd->data,
10094 static bool is_filter_match(GSList *discovery_filter, struct eir_data *eir_data,
10098 bool got_match = false;
10100 for (l = discovery_filter; l != NULL && got_match != true;
10101 l = g_slist_next(l)) {
10102 struct watch_client *client = l->data;
10103 struct discovery_filter *item = client->discovery_filter;
10106 * If one of currently running scans is regular scan, then
10107 * return all devices as matches
10114 /* if someone started discovery with empty uuids, he wants all
10115 * devices in given proximity.
10120 for (m = item->uuids; m != NULL && got_match != true;
10121 m = g_slist_next(m)) {
10122 /* m->data contains string representation of
10125 if (g_slist_find_custom(eir_data->services,
10133 /* we have service match, check proximity */
10134 if (item->rssi == DISTANCE_VAL_INVALID ||
10135 item->rssi <= rssi ||
10136 item->pathloss == DISTANCE_VAL_INVALID ||
10137 (eir_data->tx_power != 127 &&
10138 eir_data->tx_power - rssi <= item->pathloss))
10148 static void filter_duplicate_data(void *data, void *user_data)
10150 struct watch_client *client = data;
10151 bool *duplicate = user_data;
10153 if (*duplicate || !client->discovery_filter)
10156 *duplicate = client->discovery_filter->duplicate;
10159 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
10160 static void update_found_devices(struct btd_adapter *adapter,
10161 const bdaddr_t *bdaddr,
10162 uint8_t bdaddr_type, int8_t rssi,
10163 bool confirm, bool legacy, uint8_t adv_type,
10164 const uint8_t *data, uint8_t data_len)
10166 static void update_found_devices(struct btd_adapter *adapter,
10167 const bdaddr_t *bdaddr,
10168 uint8_t bdaddr_type, int8_t rssi,
10169 bool confirm, bool legacy,
10170 bool not_connectable,
10171 const uint8_t *data, uint8_t data_len)
10174 struct btd_device *dev;
10175 struct eir_data eir_data;
10176 #ifndef TIZEN_FEATURE_BLUEZ_MODIFY
10177 bool name_known, discoverable;
10181 #ifdef TIZEN_FEATURE_PLATFROM_SCAN_FILTER
10182 uint8_t allow_report;
10185 bool duplicate = false;
10187 memset(&eir_data, 0, sizeof(eir_data));
10188 eir_parse(&eir_data, data, data_len);
10189 #ifndef TIZEN_FEATURE_BLUEZ_MODIFY
10190 if (bdaddr_type == BDADDR_BREDR || adapter->filtered_discovery)
10191 discoverable = true;
10193 discoverable = eir_data.flags & (EIR_LIM_DISC | EIR_GEN_DISC);
10195 ba2str(bdaddr, addr);
10197 #ifdef TIZEN_FEATURE_PLATFROM_SCAN_FILTER
10198 /* Check if the any filter policy */
10199 allow_report = validate_for_filter_policy(adapter, &eir_data, addr);
10200 if (allow_report == NONE_REPORT &&
10201 ((adapter->scan_type == LE_ACTIVE_SCAN && adv_type == ADV_TYPE_SCAN_RESPONSE) ||
10202 adapter->scan_type == LE_PASSIVE_SCAN)) {
10203 eir_data_free(&eir_data);
10207 dev = btd_adapter_find_device(adapter, bdaddr, bdaddr_type);
10210 * If no client has requested discovery or the device is
10211 * not marked as discoverable, then do not create new
10214 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
10215 /*DBG("List BREDR:%p LE:%p Discoverable:%d", adapter->discovery_list,
10216 adapter->le_discovery_list, discoverable);*/
10217 if ((adapter->discovery_list == NULL &&
10218 adapter->le_discovery_list == NULL)) {
10219 DBG("discovery list is NULL");
10220 eir_data_free(&eir_data);
10224 if (!adapter->discovery_list || !discoverable) {
10225 eir_data_free(&eir_data);
10230 dev = adapter_create_device(adapter, bdaddr, bdaddr_type);
10234 btd_error(adapter->dev_id,
10235 "Unable to create object for found device %s", addr);
10236 eir_data_free(&eir_data);
10240 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
10241 if (device_get_rpa_exist(dev) == true)
10242 bdaddr_type = BDADDR_LE_RANDOM;
10245 device_update_last_seen(dev, bdaddr_type);
10248 * FIXME: We need to check for non-zero flags first because
10249 * older kernels send separate adv_ind and scan_rsp. Newer
10250 * kernels send them merged, so once we know which mgmt version
10251 * supports this we can make the non-zero check conditional.
10253 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
10254 if (bdaddr_type == BDADDR_LE_PUBLIC && eir_data.flags &&
10255 !(eir_data.flags & EIR_BREDR_UNSUP)) {
10256 device_set_bredr_support(dev);
10257 /* Update last seen for BR/EDR in case its flag is set */
10258 device_update_last_seen(dev, BDADDR_BREDR);
10261 if (bdaddr_type != BDADDR_BREDR && eir_data.flags &&
10262 !(eir_data.flags & EIR_BREDR_UNSUP)) {
10263 device_set_bredr_support(dev);
10264 /* Update last seen for BR/EDR in case its flag is set */
10265 device_update_last_seen(dev, BDADDR_BREDR);
10269 if (eir_data.name != NULL && eir_data.name_complete)
10270 device_store_cached_name(dev, eir_data.name);
10273 * Only skip devices that are not connected, are temporary and there
10274 * is no active discovery session ongoing.
10276 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
10277 if (device_is_temporary(dev) && adapter->discovery_list == NULL &&
10278 adapter->le_discovery_list == NULL) {
10279 DBG("discovery list is NULL");
10280 eir_data_free(&eir_data);
10284 device_set_last_addr_type(dev, bdaddr_type);
10285 device_set_ipsp_connected(dev, FALSE, NULL);
10287 if (!btd_device_is_connected(dev) && (device_is_temporary(dev) &&
10288 !adapter->discovery_list)) {
10289 eir_data_free(&eir_data);
10294 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
10295 if (bdaddr_type == BDADDR_BREDR) {
10297 if (adapter->filtered_discovery &&
10298 !is_filter_match(adapter->discovery_list, &eir_data, rssi)) {
10299 eir_data_free(&eir_data);
10303 device_set_legacy(dev, legacy);
10305 if (adapter->filtered_discovery)
10306 device_set_rssi_with_delta(dev, rssi, 0);
10308 device_set_rssi(dev, rssi);
10310 if (eir_data.tx_power != 127)
10311 device_set_tx_power(dev, eir_data.tx_power);
10312 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
10316 if (eir_data.appearance != 0)
10317 device_set_appearance(dev, eir_data.appearance);
10319 /* Report an unknown name to the kernel even if there is a short name
10320 * known, but still update the name with the known short name. */
10321 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
10322 if (eir_data.name_complete)
10323 name_known = device_name_known(dev);
10325 name_known = false;
10327 name_known = device_name_known(dev);
10330 if (eir_data.name && (eir_data.name_complete || !name_known))
10331 btd_device_device_set_name(dev, eir_data.name);
10333 if (eir_data.class != 0)
10334 device_set_class(dev, eir_data.class);
10336 if (eir_data.did_source || eir_data.did_vendor ||
10337 eir_data.did_product || eir_data.did_version)
10338 btd_device_set_pnpid(dev, eir_data.did_source,
10339 eir_data.did_vendor,
10340 eir_data.did_product,
10341 eir_data.did_version);
10343 device_add_eir_uuids(dev, eir_data.services);
10345 if (adapter->discovery_list)
10346 g_slist_foreach(adapter->discovery_list, filter_duplicate_data,
10348 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
10349 if (eir_data.flags != 0)
10350 device_set_remote_feature_flag(dev, eir_data.flags);
10352 if (bdaddr_type == BDADDR_BREDR)
10353 device_set_manufacturer_info(dev, &eir_data);
10355 /* if the application has registered for iBeacon report,
10356 * then send ibeacon report along with advertisement report */
10357 device_set_adv_report_info(dev, (void*)data, data_len, adv_type, rssi);
10361 if (eir_data.msd_list) {
10362 device_set_manufacturer_data(dev, eir_data.msd_list, duplicate);
10363 adapter_msd_notify(adapter, dev, eir_data.msd_list);
10366 if (eir_data.sd_list)
10367 device_set_service_data(dev, eir_data.sd_list, duplicate);
10369 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
10370 if (bdaddr_type != BDADDR_BREDR && adv_type != ADV_TYPE_SCAN_RESPONSE)
10371 device_set_flags(dev, eir_data.flags);
10373 if (bdaddr_type != BDADDR_BREDR)
10374 device_set_flags(dev, eir_data.flags);
10377 eir_data_free(&eir_data);
10380 * Only if at least one client has requested discovery, maintain
10381 * list of found devices and name confirming for legacy devices.
10382 * Otherwise, this is an event from passive discovery and we
10383 * should check if the device needs connecting to.
10385 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
10386 if (!adapter->discovery_list && !adapter->le_discovery_list)
10388 if (!adapter->discovery_list)
10392 if (g_slist_find(adapter->discovery_found, dev))
10396 confirm_name(adapter, bdaddr, bdaddr_type, name_known);
10398 adapter->discovery_found = g_slist_prepend(adapter->discovery_found,
10404 #ifndef TIZEN_FEATURE_BLUEZ_MODIFY
10405 /* Ignore non-connectable events */
10406 if (not_connectable)
10411 * If we're in the process of stopping passive scanning and
10412 * connecting another (or maybe even the same) LE device just
10415 if (adapter->connect_le)
10419 * If kernel background scan is used then the kernel is
10420 * responsible for connecting.
10422 if (kernel_conn_control)
10426 * If this is an LE device that's not connected and part of the
10427 * connect_list stop passive scanning so that a connection
10428 * attempt to it can be made
10430 if (bdaddr_type != BDADDR_BREDR && !btd_device_is_connected(dev) &&
10431 g_slist_find(adapter->connect_list, dev)) {
10432 adapter->connect_le = dev;
10433 stop_passive_scanning(adapter);
10437 static void device_found_callback(uint16_t index, uint16_t length,
10438 const void *param, void *user_data)
10440 const struct mgmt_ev_device_found *ev = param;
10441 struct btd_adapter *adapter = user_data;
10442 const uint8_t *eir;
10449 if (length < sizeof(*ev)) {
10450 btd_error(adapter->dev_id,
10451 "Too short device found event (%u bytes)", length);
10455 eir_len = btohs(ev->eir_len);
10456 if (length != sizeof(*ev) + eir_len) {
10457 btd_error(adapter->dev_id,
10458 "Device found event size mismatch (%u != %zu)",
10459 length, sizeof(*ev) + eir_len);
10468 flags = btohl(ev->flags);
10470 ba2str(&ev->addr.bdaddr, addr);
10471 DBG("hci%u addr %s, rssi %d flags 0x%04x eir_len %u",
10472 index, addr, ev->rssi, flags, eir_len);
10474 confirm_name = (flags & MGMT_DEV_FOUND_CONFIRM_NAME);
10475 legacy = (flags & MGMT_DEV_FOUND_LEGACY_PAIRING);
10477 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
10478 update_found_devices(adapter, &ev->addr.bdaddr, ev->addr.type,
10479 ev->rssi, confirm_name, legacy, 0,
10482 update_found_devices(adapter, &ev->addr.bdaddr, ev->addr.type,
10483 ev->rssi, confirm_name, legacy,
10484 flags & MGMT_DEV_FOUND_NOT_CONNECTABLE,
10489 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
10490 static void le_device_found_callback(uint16_t index, uint16_t length,
10491 const void *param, void *user_data)
10493 const struct mgmt_ev_le_device_found *ev = param;
10494 struct btd_adapter *adapter = user_data;
10495 const uint8_t *eir;
10502 if (length < sizeof(*ev)) {
10503 error("Too short device found event (%u bytes)", length);
10507 eir_len = btohs(ev->eir_len);
10508 if (length != sizeof(*ev) + eir_len) {
10509 error("Device found event size mismatch (%u != %zu)",
10510 length, sizeof(*ev) + eir_len);
10519 flags = btohl(ev->flags);
10521 ba2str(&ev->addr.bdaddr, addr);
10522 /*DBG("hci%u addr %s, rssi %d flags 0x%04x eir_len %u",
10523 index, addr, ev->rssi, flags, eir_len);*/
10525 confirm_name = (flags & MGMT_DEV_FOUND_CONFIRM_NAME);
10526 legacy = (flags & MGMT_DEV_FOUND_LEGACY_PAIRING);
10528 /*DBG("hci%u addr %s, addr_type %d rssi %d flags 0x%04x eir_len %u confirm_name %d legacy %d, adv_type %02x",
10529 index, addr, ev->addr.type, ev->rssi, flags, eir_len, confirm_name, legacy, ev->adv_type);*/
10531 update_found_devices(adapter, &ev->addr.bdaddr, ev->addr.type,
10532 ev->rssi, confirm_name, legacy, ev->adv_type,
10537 struct agent *adapter_get_agent(struct btd_adapter *adapter)
10539 return agent_get(NULL);
10542 static void adapter_remove_connection(struct btd_adapter *adapter,
10543 struct btd_device *device,
10544 uint8_t bdaddr_type)
10548 if (!g_slist_find(adapter->connections, device)) {
10549 btd_error(adapter->dev_id, "No matching connection for device");
10553 device_remove_connection(device, bdaddr_type);
10555 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
10556 if (device_is_authenticating(device, bdaddr_type))
10558 if (device_is_authenticating(device))
10560 device_cancel_authentication(device, TRUE);
10562 /* If another bearer is still connected */
10563 if (btd_device_is_connected(device))
10566 adapter->connections = g_slist_remove(adapter->connections, device);
10567 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
10568 DBG("isPaired %d, isBonded %d", device_is_paired(device, bdaddr_type),
10569 device_is_bonded(device, bdaddr_type));
10570 if ((device_is_temporary(device) && !device_is_retrying(device)) ||
10571 (!device_is_bonded(device, bdaddr_type))) {
10573 if (device_is_temporary(device) && !device_is_retrying(device)) {
10575 const char *path = device_get_path(device);
10577 DBG("Removing temporary device %s", path);
10578 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
10579 /* device_is_paired is added incase of tempoary bonded
10580 * oop file transfer in that device is not bonded it's paired.
10582 if (!(device_is_bonded(device, bdaddr_type) ||
10583 device_is_paired(device, bdaddr_type))) {
10584 DBG("addr type %d, bonded", bdaddr_type);
10588 btd_adapter_unpair_device(adapter, device);
10590 btd_adapter_remove_device(adapter, device);
10595 static void adapter_stop(struct btd_adapter *adapter)
10597 /* check pending requests */
10598 reply_pending_requests(adapter);
10600 cancel_passive_scanning(adapter);
10602 g_slist_free_full(adapter->set_filter_list, discovery_free);
10603 adapter->set_filter_list = NULL;
10605 g_slist_free_full(adapter->discovery_list, discovery_free);
10606 adapter->discovery_list = NULL;
10608 discovery_cleanup(adapter);
10610 adapter->filtered_discovery = false;
10611 adapter->no_scan_restart_delay = false;
10612 g_free(adapter->current_discovery_filter);
10613 adapter->current_discovery_filter = NULL;
10615 adapter->discovering = false;
10617 while (adapter->connections) {
10618 struct btd_device *device = adapter->connections->data;
10619 uint8_t addr_type = btd_device_get_bdaddr_type(device);
10621 adapter_remove_connection(adapter, device, BDADDR_BREDR);
10622 if (addr_type != BDADDR_BREDR)
10623 adapter_remove_connection(adapter, device, addr_type);
10626 g_dbus_emit_property_changed(dbus_conn, adapter->path,
10627 ADAPTER_INTERFACE, "Discovering");
10628 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
10629 g_dbus_emit_property_changed(dbus_conn, adapter->path,
10630 ADAPTER_INTERFACE, "LEDiscovering");
10633 if (adapter->dev_class) {
10634 /* the kernel should reset the class of device when powering
10635 * down, but it does not. So force it here ... */
10636 adapter->dev_class = 0;
10637 g_dbus_emit_property_changed(dbus_conn, adapter->path,
10638 ADAPTER_INTERFACE, "Class");
10641 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
10642 advertiser_cleanup(adapter);
10644 g_dbus_emit_property_changed(dbus_conn, adapter->path,
10645 ADAPTER_INTERFACE, "Powered");
10647 DBG("adapter %s has been disabled", adapter->path);
10650 int btd_register_adapter_driver(struct btd_adapter_driver *driver)
10652 adapter_drivers = g_slist_append(adapter_drivers, driver);
10654 if (driver->probe == NULL)
10657 adapter_foreach(probe_driver, driver);
10662 static void unload_driver(struct btd_adapter *adapter, gpointer data)
10664 struct btd_adapter_driver *driver = data;
10666 if (driver->remove)
10667 driver->remove(adapter);
10669 adapter->drivers = g_slist_remove(adapter->drivers, data);
10672 void btd_unregister_adapter_driver(struct btd_adapter_driver *driver)
10674 adapter_drivers = g_slist_remove(adapter_drivers, driver);
10676 adapter_foreach(unload_driver, driver);
10679 static void agent_auth_cb(struct agent *agent, DBusError *derr,
10682 struct btd_adapter *adapter = user_data;
10683 struct service_auth *auth = g_queue_pop_head(adapter->auths);
10686 DBG("No pending authorization");
10690 auth->cb(derr, auth->user_data);
10693 agent_unref(auth->agent);
10697 /* Stop processing if queue is empty */
10698 if (g_queue_is_empty(adapter->auths)) {
10699 if (adapter->auth_idle_id > 0)
10700 g_source_remove(adapter->auth_idle_id);
10704 if (adapter->auth_idle_id > 0)
10707 adapter->auth_idle_id = g_idle_add(process_auth_queue, adapter);
10710 static gboolean process_auth_queue(gpointer user_data)
10712 struct btd_adapter *adapter = user_data;
10715 adapter->auth_idle_id = 0;
10717 dbus_error_init(&err);
10718 dbus_set_error_const(&err, ERROR_INTERFACE ".Rejected", NULL);
10720 while (!g_queue_is_empty(adapter->auths)) {
10721 struct service_auth *auth = adapter->auths->head->data;
10722 struct btd_device *device = auth->device;
10723 const char *dev_path;
10725 /* Wait services to be resolved before asking authorization */
10726 if (auth->svc_id > 0) {
10727 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
10728 DBG("Wait services to be resolved before asking authorization");
10733 #ifndef TIZEN_FEATURE_BLUEZ_MODIFY
10734 if (device_is_trusted(device) == TRUE) {
10736 if (device_is_trusted(device) == TRUE
10737 || device_is_profile_trusted(device, auth->uuid)
10738 || main_opts.pin_code) {
10739 /* In headless device(pin_code is existing),
10740 no need to request to agent */
10742 auth->cb(NULL, auth->user_data);
10746 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
10747 /* If Profile is Blocked, Simply reject Authorization*/
10748 if (device_is_profile_blocked(device, auth->uuid) == TRUE) {
10749 auth->cb(&err, auth->user_data);
10754 /* If agent is set authorization is already ongoing */
10758 auth->agent = agent_get(NULL);
10759 if (auth->agent == NULL) {
10760 btd_warn(adapter->dev_id,
10761 "Authentication attempt without agent");
10762 auth->cb(&err, auth->user_data);
10766 dev_path = device_get_path(device);
10768 if (agent_authorize_service(auth->agent, dev_path, auth->uuid,
10769 agent_auth_cb, adapter, NULL) < 0) {
10770 auth->cb(&err, auth->user_data);
10778 agent_unref(auth->agent);
10782 g_queue_pop_head(adapter->auths);
10785 dbus_error_free(&err);
10790 static void svc_complete(struct btd_device *dev, int err, void *user_data)
10792 struct service_auth *auth = user_data;
10793 struct btd_adapter *adapter = auth->adapter;
10797 if (adapter->auth_idle_id != 0)
10800 adapter->auth_idle_id = g_idle_add(process_auth_queue, adapter);
10803 static int adapter_authorize(struct btd_adapter *adapter, const bdaddr_t *dst,
10805 adapter_authorize_type check_for_connection,
10806 service_auth_cb cb, void *user_data)
10808 struct service_auth *auth;
10809 struct btd_device *device;
10810 static guint id = 0;
10812 device = btd_adapter_find_device(adapter, dst, BDADDR_BREDR);
10816 if (device_is_disconnecting(device)) {
10817 DBG("Authorization request while disconnecting");
10821 /* Device connected? */
10822 if (check_for_connection && !g_slist_find(adapter->connections, device))
10823 btd_error(adapter->dev_id,
10824 "Authorization request for non-connected device!?");
10826 auth = g_try_new0(struct service_auth, 1);
10831 auth->user_data = user_data;
10833 auth->device = device;
10834 auth->adapter = adapter;
10836 if (check_for_connection)
10837 auth->svc_id = device_wait_for_svc_complete(device, svc_complete, auth);
10839 if (adapter->auth_idle_id == 0)
10840 adapter->auth_idle_id = g_idle_add(process_auth_queue, adapter);
10843 g_queue_push_tail(adapter->auths, auth);
10848 guint btd_request_authorization(const bdaddr_t *src, const bdaddr_t *dst,
10849 const char *uuid, service_auth_cb cb,
10852 struct btd_adapter *adapter;
10855 if (bacmp(src, BDADDR_ANY) != 0) {
10856 adapter = adapter_find(src);
10860 return adapter_authorize(adapter, dst, uuid,
10861 ADAPTER_AUTHORIZE_CHECK_CONNECTED, cb, user_data);
10864 for (l = adapters; l != NULL; l = g_slist_next(l)) {
10869 id = adapter_authorize(adapter, dst, uuid,
10870 ADAPTER_AUTHORIZE_CHECK_CONNECTED, cb, user_data);
10878 guint btd_request_authorization_cable_configured(const bdaddr_t *src, const bdaddr_t *dst,
10879 const char *uuid, service_auth_cb cb,
10882 struct btd_adapter *adapter;
10884 if (bacmp(src, BDADDR_ANY) == 0)
10887 adapter = adapter_find(src);
10891 return adapter_authorize(adapter, dst, uuid,
10892 ADAPTER_AUTHORIZE_DISCONNECTED, cb, user_data);
10895 static struct service_auth *find_authorization(guint id)
10900 for (l = adapters; l != NULL; l = g_slist_next(l)) {
10901 struct btd_adapter *adapter = l->data;
10903 for (l2 = adapter->auths->head; l2 != NULL; l2 = l2->next) {
10904 struct service_auth *auth = l2->data;
10906 if (auth->id == id)
10914 int btd_cancel_authorization(guint id)
10916 struct service_auth *auth;
10918 auth = find_authorization(id);
10922 if (auth->svc_id > 0)
10923 device_remove_svc_complete_callback(auth->device,
10926 g_queue_remove(auth->adapter->auths, auth);
10929 agent_cancel(auth->agent);
10930 agent_unref(auth->agent);
10938 int btd_adapter_restore_powered(struct btd_adapter *adapter)
10940 if (adapter->current_settings & MGMT_SETTING_POWERED)
10943 set_mode(adapter, MGMT_OP_SET_POWERED, 0x01);
10948 void btd_adapter_register_pin_cb(struct btd_adapter *adapter,
10949 btd_adapter_pin_cb_t cb)
10951 adapter->pin_callbacks = g_slist_prepend(adapter->pin_callbacks, cb);
10954 void btd_adapter_unregister_pin_cb(struct btd_adapter *adapter,
10955 btd_adapter_pin_cb_t cb)
10957 adapter->pin_callbacks = g_slist_remove(adapter->pin_callbacks, cb);
10960 void btd_adapter_unregister_msd_cb(struct btd_adapter *adapter,
10963 adapter->msd_callbacks = g_slist_remove(adapter->msd_callbacks, cb);
10966 void btd_adapter_register_msd_cb(struct btd_adapter *adapter,
10969 adapter->msd_callbacks = g_slist_prepend(adapter->msd_callbacks, cb);
10972 int btd_adapter_set_fast_connectable(struct btd_adapter *adapter,
10975 if (!(adapter->current_settings & MGMT_SETTING_POWERED))
10978 set_mode(adapter, MGMT_OP_SET_FAST_CONNECTABLE, enable ? 0x01 : 0x00);
10983 int btd_adapter_read_clock(struct btd_adapter *adapter, const bdaddr_t *bdaddr,
10984 int which, int timeout, uint32_t *clock,
10985 uint16_t *accuracy)
10987 if (!(adapter->current_settings & MGMT_SETTING_POWERED))
10993 int btd_adapter_remove_bonding(struct btd_adapter *adapter,
10994 const bdaddr_t *bdaddr, uint8_t bdaddr_type)
10996 struct mgmt_cp_unpair_device cp;
10998 memset(&cp, 0, sizeof(cp));
10999 bacpy(&cp.addr.bdaddr, bdaddr);
11000 cp.addr.type = bdaddr_type;
11003 if (mgmt_send(adapter->mgmt, MGMT_OP_UNPAIR_DEVICE,
11004 adapter->dev_id, sizeof(cp), &cp,
11005 NULL, NULL, NULL) > 0)
11011 static void pincode_reply_complete(uint8_t status, uint16_t length,
11012 const void *param, void *user_data)
11014 struct btd_device *device = user_data;
11016 /* If the MGMT_OP_PIN_CODE_REPLY command is acknowledged, move the
11017 * starting time to that point. This give a better sense of time
11018 * evaluating the pincode. */
11019 device_bonding_restart_timer(device);
11022 int btd_adapter_pincode_reply(struct btd_adapter *adapter,
11023 const bdaddr_t *bdaddr,
11024 const char *pin, size_t pin_len)
11026 struct btd_device *device;
11030 ba2str(bdaddr, addr);
11031 DBG("hci%u addr %s pinlen %zu", adapter->dev_id, addr, pin_len);
11034 struct mgmt_cp_pin_code_neg_reply cp;
11036 memset(&cp, 0, sizeof(cp));
11037 bacpy(&cp.addr.bdaddr, bdaddr);
11038 cp.addr.type = BDADDR_BREDR;
11040 id = mgmt_reply(adapter->mgmt, MGMT_OP_PIN_CODE_NEG_REPLY,
11041 adapter->dev_id, sizeof(cp), &cp,
11044 struct mgmt_cp_pin_code_reply cp;
11049 memset(&cp, 0, sizeof(cp));
11050 bacpy(&cp.addr.bdaddr, bdaddr);
11051 cp.addr.type = BDADDR_BREDR;
11052 cp.pin_len = pin_len;
11053 memcpy(cp.pin_code, pin, pin_len);
11055 /* Since a pincode was requested, update the starting time to
11056 * the point where the pincode is provided. */
11057 device = btd_adapter_find_device(adapter, bdaddr, BDADDR_BREDR);
11058 device_bonding_restart_timer(device);
11060 id = mgmt_reply(adapter->mgmt, MGMT_OP_PIN_CODE_REPLY,
11061 adapter->dev_id, sizeof(cp), &cp,
11062 pincode_reply_complete, device, NULL);
11071 int btd_adapter_confirm_reply(struct btd_adapter *adapter,
11072 const bdaddr_t *bdaddr, uint8_t bdaddr_type,
11075 struct mgmt_cp_user_confirm_reply cp;
11079 ba2str(bdaddr, addr);
11080 DBG("hci%u addr %s success %d", adapter->dev_id, addr, success);
11083 opcode = MGMT_OP_USER_CONFIRM_REPLY;
11085 opcode = MGMT_OP_USER_CONFIRM_NEG_REPLY;
11087 memset(&cp, 0, sizeof(cp));
11088 bacpy(&cp.addr.bdaddr, bdaddr);
11089 cp.addr.type = bdaddr_type;
11091 if (mgmt_reply(adapter->mgmt, opcode, adapter->dev_id, sizeof(cp), &cp,
11092 NULL, NULL, NULL) > 0)
11098 static void user_confirm_request_callback(uint16_t index, uint16_t length,
11099 const void *param, void *user_data)
11101 const struct mgmt_ev_user_confirm_request *ev = param;
11102 struct btd_adapter *adapter = user_data;
11103 struct btd_device *device;
11107 if (length < sizeof(*ev)) {
11108 btd_error(adapter->dev_id,
11109 "Too small user confirm request event");
11113 ba2str(&ev->addr.bdaddr, addr);
11114 DBG("hci%u %s confirm_hint %u", adapter->dev_id, addr,
11116 device = btd_adapter_get_device(adapter, &ev->addr.bdaddr,
11119 btd_error(adapter->dev_id,
11120 "Unable to get device object for %s", addr);
11124 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
11125 device_set_auth_addr_type(device, ev->addr.type);
11127 err = device_confirm_passkey(device, ev->addr.type, btohl(ev->value),
11130 btd_error(adapter->dev_id,
11131 "device_confirm_passkey: %s", strerror(-err));
11132 btd_adapter_confirm_reply(adapter, &ev->addr.bdaddr,
11133 ev->addr.type, FALSE);
11137 int btd_adapter_passkey_reply(struct btd_adapter *adapter,
11138 const bdaddr_t *bdaddr, uint8_t bdaddr_type,
11144 ba2str(bdaddr, addr);
11145 DBG("hci%u addr %s passkey %06u", adapter->dev_id, addr, passkey);
11147 if (passkey == INVALID_PASSKEY) {
11148 struct mgmt_cp_user_passkey_neg_reply cp;
11150 memset(&cp, 0, sizeof(cp));
11151 bacpy(&cp.addr.bdaddr, bdaddr);
11152 cp.addr.type = bdaddr_type;
11154 id = mgmt_reply(adapter->mgmt, MGMT_OP_USER_PASSKEY_NEG_REPLY,
11155 adapter->dev_id, sizeof(cp), &cp,
11158 struct mgmt_cp_user_passkey_reply cp;
11160 memset(&cp, 0, sizeof(cp));
11161 bacpy(&cp.addr.bdaddr, bdaddr);
11162 cp.addr.type = bdaddr_type;
11163 cp.passkey = htobl(passkey);
11165 id = mgmt_reply(adapter->mgmt, MGMT_OP_USER_PASSKEY_REPLY,
11166 adapter->dev_id, sizeof(cp), &cp,
11176 static void user_passkey_request_callback(uint16_t index, uint16_t length,
11177 const void *param, void *user_data)
11179 const struct mgmt_ev_user_passkey_request *ev = param;
11180 struct btd_adapter *adapter = user_data;
11181 struct btd_device *device;
11185 if (length < sizeof(*ev)) {
11186 btd_error(adapter->dev_id, "Too small passkey request event");
11190 ba2str(&ev->addr.bdaddr, addr);
11191 DBG("hci%u %s", index, addr);
11193 device = btd_adapter_get_device(adapter, &ev->addr.bdaddr,
11196 btd_error(adapter->dev_id,
11197 "Unable to get device object for %s", addr);
11201 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
11202 device_set_auth_addr_type(device, ev->addr.type);
11204 err = device_request_passkey(device, ev->addr.type);
11206 btd_error(adapter->dev_id,
11207 "device_request_passkey: %s", strerror(-err));
11208 btd_adapter_passkey_reply(adapter, &ev->addr.bdaddr,
11209 ev->addr.type, INVALID_PASSKEY);
11213 static void user_passkey_notify_callback(uint16_t index, uint16_t length,
11214 const void *param, void *user_data)
11216 const struct mgmt_ev_passkey_notify *ev = param;
11217 struct btd_adapter *adapter = user_data;
11218 struct btd_device *device;
11223 if (length < sizeof(*ev)) {
11224 btd_error(adapter->dev_id, "Too small passkey notify event");
11228 ba2str(&ev->addr.bdaddr, addr);
11229 DBG("hci%u %s", index, addr);
11231 device = btd_adapter_get_device(adapter, &ev->addr.bdaddr,
11234 btd_error(adapter->dev_id,
11235 "Unable to get device object for %s", addr);
11239 passkey = get_le32(&ev->passkey);
11241 DBG("passkey %06u entered %u", passkey, ev->entered);
11243 err = device_notify_passkey(device, ev->addr.type, passkey,
11246 btd_error(adapter->dev_id,
11247 "device_notify_passkey: %s", strerror(-err));
11250 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
11251 static void rssi_alert_callback(uint16_t index, uint16_t length,
11252 const void *param, void *user_data)
11254 const struct mgmt_ev_vendor_specific_rssi_alert *ev = param;
11255 struct btd_adapter *adapter = user_data;
11257 char *bt_addr = NULL;
11258 int link_type = -1;
11259 int alert_type = -1;
11262 if (length < sizeof(*ev)) {
11263 error("Too small rssi alert event");
11267 ba2str(&ev->bdaddr, addr);
11268 DBG("hci%u %s %d", index, addr, ev->link_type);
11269 DBG("RSSI Alert Params [%d %d]", ev->alert_type, ev->rssi_dbm);
11271 bt_addr = (char *)&addr;
11272 link_type = ev->link_type;
11273 alert_type = ev->alert_type;
11274 rssi_dbm = ev->rssi_dbm;
11275 g_dbus_emit_signal(dbus_conn, adapter->path,
11276 ADAPTER_INTERFACE, "RssiAlert",
11277 DBUS_TYPE_STRING, &bt_addr,
11278 DBUS_TYPE_INT32, &link_type,
11279 DBUS_TYPE_INT32, &alert_type,
11280 DBUS_TYPE_INT32, &rssi_dbm,
11281 DBUS_TYPE_INVALID);
11284 static void get_raw_rssi_callback(uint16_t index, uint16_t length,
11285 const void *param, void *user_data)
11287 const struct mgmt_cc_rp_get_raw_rssi *ev = param;
11288 struct btd_adapter *adapter = user_data;
11290 char *bt_addr = NULL;
11291 int link_type = -1;
11294 if (length < sizeof(*ev)) {
11295 error("Too small raw RSSI event");
11299 ba2str(&ev->bt_address, addr);
11300 DBG("hci%u %s", index, addr);
11301 DBG("Raw RSSI Params [%d %d]", ev->link_type, ev->rssi_dbm);
11303 bt_addr = (char *)&addr;
11304 link_type = ev->link_type;
11305 rssi_dbm = ev->rssi_dbm;
11307 g_dbus_emit_signal(dbus_conn, adapter->path,
11308 ADAPTER_INTERFACE, "RawRssi",
11309 DBUS_TYPE_STRING, &bt_addr,
11310 DBUS_TYPE_INT32, &link_type,
11311 DBUS_TYPE_INT32, &rssi_dbm,
11312 DBUS_TYPE_INVALID);
11315 static void rssi_enabled_callback(uint16_t index, uint16_t length,
11316 const void *param, void *user_data)
11318 const struct mgmt_cc_rsp_enable_rssi *ev = param;
11319 struct btd_adapter *adapter = user_data;
11321 char *bt_addr = NULL;
11322 int enabled = TRUE;
11323 int link_type = -1;
11325 if (length < sizeof(*ev)) {
11326 error("Too small rssi enabled event");
11330 ba2str(&ev->bt_address, addr);
11331 DBG("hci%u %s %d", index, addr, ev->link_type);
11332 DBG("RSSI Enabled [%d %d]", ev->le_ext_opcode, ev->status);
11334 bt_addr = (char *)&addr;
11335 link_type = ev->link_type;
11337 g_dbus_emit_signal(dbus_conn, adapter->path,
11338 ADAPTER_INTERFACE, "RssiEnabled",
11339 DBUS_TYPE_STRING, &bt_addr,
11340 DBUS_TYPE_INT32, &link_type,
11341 DBUS_TYPE_BOOLEAN, &enabled,
11342 DBUS_TYPE_INVALID);
11345 static void rssi_disabled_callback(uint16_t index, uint16_t length,
11346 const void *param, void *user_data)
11348 const struct mgmt_cc_rp_disable_rssi *ev = param;
11349 struct btd_adapter *adapter = user_data;
11351 char *bt_addr = NULL;
11352 int disabled = FALSE;
11353 int link_type = -1;
11355 if (length < sizeof(*ev)) {
11356 error("Too small RSSI disabled event");
11360 ba2str(&ev->bt_address, addr);
11361 DBG("hci%u %s %d", index, addr, ev->link_type);
11362 DBG("RSSI Disabled Params [%d %d]", ev->le_ext_opcode, ev->status);
11364 bt_addr = (char *)&addr;
11365 link_type = ev->link_type;
11367 g_dbus_emit_signal(dbus_conn, adapter->path,
11368 ADAPTER_INTERFACE, "RssiEnabled",
11369 DBUS_TYPE_STRING, &bt_addr,
11370 DBUS_TYPE_INT32, &link_type,
11371 DBUS_TYPE_BOOLEAN, &disabled,
11372 DBUS_TYPE_INVALID);
11375 void adapter_check_version(struct btd_adapter *adapter, uint8_t hci_ver)
11381 ver = "Bluetooth 1.0b";
11384 ver = "Bluetooth 1.1";
11387 ver = "Bluetooth 1.2";
11390 ver = "Bluetooth 2.0 + EDR";
11393 ver = "Bluetooth 2.1 + EDR";
11396 ver = "Bluetooth 3.0 + HS";
11399 ver = "Bluetooth 4.0";
11402 ver = "Bluetooth 4.1";
11409 if (adapter->version)
11410 g_free(adapter->version);
11412 adapter->version = g_strdup(ver);
11415 static void hardware_error_callback(uint16_t index, uint16_t length,
11416 const void *param, void *user_data)
11418 const struct mgmt_ev_hardware_error *ev = param;
11419 struct btd_adapter *adapter = user_data;
11421 if (length < sizeof(*ev)) {
11422 error("Too small Hardware error event");
11426 error("Hardware error occurred : %d", ev->error_code);
11427 g_dbus_emit_signal(dbus_conn, adapter->path,
11428 ADAPTER_INTERFACE, "HardwareError",
11429 DBUS_TYPE_INVALID);
11432 static void tx_timeout_error_callback(uint16_t index, uint16_t length,
11433 const void *param, void *user_data)
11435 struct btd_adapter *adapter = user_data;
11437 error("Tx Timeout error occurred");
11438 g_dbus_emit_signal(dbus_conn, adapter->path,
11439 ADAPTER_INTERFACE, "TxTimeoutError",
11440 DBUS_TYPE_INVALID);
11443 static void device_name_update_callback(uint16_t index, uint16_t length,
11444 const void *param, void *user_data)
11446 const struct mgmt_ev_device_name_update *ev = param;
11447 struct btd_adapter *adapter = user_data;
11448 struct btd_device *device;
11450 const uint8_t *eir_name;
11451 struct eir_data eir_data;
11453 if (length < sizeof(*ev)) {
11454 error("Name update error event");
11458 ba2str(&ev->addr.bdaddr, addr);
11459 DBG("hci%u %s", index, addr);
11461 device = btd_adapter_get_device(adapter, &ev->addr.bdaddr,
11464 error("Unable to get device object for %s", addr);
11468 if (ev->eir_len == 0)
11471 eir_name = ev->eir;
11473 memset(&eir_data, 0, sizeof(eir_data));
11474 eir_parse(&eir_data, eir_name, ev->eir_len);
11477 btd_device_device_set_name(device, eir_data.name);
11479 eir_data_free(&eir_data);
11482 static void multi_adv_state_change_callback(uint16_t index, uint16_t length,
11483 const void *param, void *user_data)
11485 const struct mgmt_ev_vendor_specific_multi_adv_state_changed *ev = param;
11486 struct btd_adapter *adapter = user_data;
11488 if (length < sizeof(*ev)) {
11489 error("Too small adv state change event");
11493 DBG("adv id %d, state change reason %d, connection_handle %x",
11494 ev->adv_instance, ev->state_change_reason, ev->connection_handle);
11496 if ((ev->adv_instance > 0 && ev->adv_instance < adapter_le_get_max_adv_instance()) &&
11497 ev->state_change_reason == 0)
11498 adapter_le_enable_multi_adv(adapter, TRUE, ev->adv_instance);
11501 static void le_conn_update_completed_callback(uint16_t index, uint16_t length,
11502 const void *param, void *user_data)
11504 const struct mgmt_ev_conn_updated *ev = param;
11505 struct btd_adapter *adapter = user_data;
11506 struct btd_device *device;
11510 if (length < sizeof(*ev)) {
11511 error("Too small le conn update completed event");
11515 ba2str(&ev->addr.bdaddr, addr);
11516 list = g_slist_find_custom(adapter->devices, addr,
11517 device_address_cmp);
11519 device = list->data;
11520 if (device_get_conn_update_state(device))
11521 device_set_conn_update_state(device, false);
11525 static void bt_6lowpan_conn_state_change_callback(uint16_t index, uint16_t length,
11526 const void *param, void *user_data)
11528 const struct mgmt_ev_6lowpan_conn_state_changed *ev = param;
11529 struct btd_adapter *adapter = user_data;
11530 struct btd_device *device;
11532 gboolean connected = 0;
11534 if (length < sizeof(*ev)) {
11535 btd_error(adapter->dev_id,
11536 "Too small device connected event");
11540 ba2str(&ev->addr.bdaddr, addr);
11542 DBG("hci%u device %s", index, addr);
11544 device = btd_adapter_find_device(adapter, &ev->addr.bdaddr,
11547 btd_error(adapter->dev_id,
11548 "Unable to get device object for %s", addr);
11557 device_set_ipsp_connected(device, connected, ev->ifname);
11560 static void bt_le_data_length_changed_callback(uint16_t index, uint16_t length,
11561 const void *param, void *user_data)
11563 const struct mgmt_ev_le_data_length_changed *ev = param;
11564 struct btd_adapter *adapter = user_data;
11565 struct btd_device *device;
11568 if (length < sizeof(*ev)) {
11569 btd_error(adapter->dev_id,
11570 "Too small data length changed event");
11574 ba2str(&ev->addr.bdaddr, addr);
11576 DBG("hci%u device %s", index, addr);
11578 device = btd_adapter_find_device(adapter, &ev->addr.bdaddr,
11581 btd_error(adapter->dev_id,
11582 "Unable to get device object for %s", addr);
11586 device_le_data_length_changed(device, ev->max_tx_octets, ev->max_tx_time,
11587 ev->max_rx_octets, ev->max_rx_time);
11592 struct btd_adapter_pin_cb_iter *btd_adapter_pin_cb_iter_new(
11593 struct btd_adapter *adapter)
11595 struct btd_adapter_pin_cb_iter *iter =
11596 g_new0(struct btd_adapter_pin_cb_iter, 1);
11598 iter->it = adapter->pin_callbacks;
11604 void btd_adapter_pin_cb_iter_free(struct btd_adapter_pin_cb_iter *iter)
11609 bool btd_adapter_pin_cb_iter_end(struct btd_adapter_pin_cb_iter *iter)
11611 return iter->it == NULL && iter->attempt == 0;
11614 static ssize_t btd_adapter_pin_cb_iter_next(
11615 struct btd_adapter_pin_cb_iter *iter,
11616 struct btd_adapter *adapter,
11617 struct btd_device *device,
11618 char *pin_buf, bool *display)
11620 btd_adapter_pin_cb_t cb;
11623 while (iter->it != NULL) {
11624 cb = iter->it->data;
11625 ret = cb(adapter, device, pin_buf, display, iter->attempt);
11630 iter->it = g_slist_next(iter->it);
11637 static void pin_code_request_callback(uint16_t index, uint16_t length,
11638 const void *param, void *user_data)
11640 const struct mgmt_ev_pin_code_request *ev = param;
11641 struct btd_adapter *adapter = user_data;
11642 struct btd_device *device;
11643 bool display = false;
11648 struct btd_adapter_pin_cb_iter *iter;
11650 if (length < sizeof(*ev)) {
11651 btd_error(adapter->dev_id, "Too small PIN code request event");
11655 ba2str(&ev->addr.bdaddr, addr);
11657 DBG("hci%u %s", adapter->dev_id, addr);
11659 device = btd_adapter_get_device(adapter, &ev->addr.bdaddr,
11662 btd_error(adapter->dev_id,
11663 "Unable to get device object for %s", addr);
11667 /* Flag the request of a pincode to allow a bonding retry. */
11668 adapter->pincode_requested = true;
11669 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
11670 btd_device_set_legacy_pairing(device, true);
11673 memset(pin, 0, sizeof(pin));
11675 iter = device_bonding_iter(device);
11679 pinlen = btd_adapter_pin_cb_iter_next(iter, adapter, device,
11682 if (pinlen > 0 && (!ev->secure || pinlen == 16)) {
11683 if (display && device_is_bonding(device, NULL)) {
11684 err = device_notify_pincode(device, ev->secure, pin);
11686 btd_error(adapter->dev_id,
11687 "device_notify_pin: %s",
11689 btd_adapter_pincode_reply(adapter,
11694 btd_adapter_pincode_reply(adapter, &ev->addr.bdaddr,
11700 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
11701 if (main_opts.pin_code) {
11702 /* Because we can't receive user input on headless device,
11703 no need to request pincode. Use the 'PinCode' in headless conf file */
11704 DBG("Use configured PinCode in headless device");
11705 btd_adapter_pincode_reply(adapter, &ev->addr.bdaddr,
11706 main_opts.pin_code, strlen(main_opts.pin_code));
11711 err = device_request_pincode(device, ev->secure);
11713 btd_error(adapter->dev_id, "device_request_pin: %s",
11715 btd_adapter_pincode_reply(adapter, &ev->addr.bdaddr, NULL, 0);
11719 int adapter_cancel_bonding(struct btd_adapter *adapter, const bdaddr_t *bdaddr,
11722 struct mgmt_addr_info cp;
11725 ba2str(bdaddr, addr);
11726 DBG("hci%u bdaddr %s type %u", adapter->dev_id, addr, addr_type);
11728 memset(&cp, 0, sizeof(cp));
11729 bacpy(&cp.bdaddr, bdaddr);
11730 cp.type = addr_type;
11732 if (mgmt_reply(adapter->mgmt, MGMT_OP_CANCEL_PAIR_DEVICE,
11733 adapter->dev_id, sizeof(cp), &cp,
11734 NULL, NULL, NULL) > 0)
11740 static void check_oob_bonding_complete(struct btd_adapter *adapter,
11741 const bdaddr_t *bdaddr, uint8_t status)
11743 if (!adapter->oob_handler || !adapter->oob_handler->bonding_cb)
11746 if (bacmp(bdaddr, &adapter->oob_handler->remote_addr) != 0)
11749 adapter->oob_handler->bonding_cb(adapter, bdaddr, status,
11750 adapter->oob_handler->user_data);
11752 g_free(adapter->oob_handler);
11753 adapter->oob_handler = NULL;
11756 static void bonding_complete(struct btd_adapter *adapter,
11757 const bdaddr_t *bdaddr,
11758 uint8_t addr_type, uint8_t status)
11760 struct btd_device *device;
11763 device = btd_adapter_get_device(adapter, bdaddr, addr_type);
11765 device = btd_adapter_find_device(adapter, bdaddr, addr_type);
11767 if (device != NULL)
11768 device_bonding_complete(device, addr_type, status);
11770 #ifndef TIZEN_FEATURE_BLUEZ_MODIFY
11771 resume_discovery(adapter);
11773 check_oob_bonding_complete(adapter, bdaddr, status);
11776 /* bonding_attempt_complete() handles the end of a "bonding attempt" checking if
11777 * it should begin a new attempt or complete the bonding.
11779 static void bonding_attempt_complete(struct btd_adapter *adapter,
11780 const bdaddr_t *bdaddr,
11781 uint8_t addr_type, uint8_t status)
11783 struct btd_device *device;
11786 ba2str(bdaddr, addr);
11787 DBG("hci%u bdaddr %s type %u status 0x%x", adapter->dev_id, addr,
11788 addr_type, status);
11791 device = btd_adapter_get_device(adapter, bdaddr, addr_type);
11793 device = btd_adapter_find_device(adapter, bdaddr, addr_type);
11795 if (status == MGMT_STATUS_AUTH_FAILED && adapter->pincode_requested) {
11796 /* On faliure, issue a bonding_retry if possible. */
11797 if (device != NULL) {
11798 if (device_bonding_attempt_retry(device) == 0)
11803 /* Ignore disconnects during retry. */
11804 if (status == MGMT_STATUS_DISCONNECTED &&
11805 device && device_is_retrying(device))
11808 /* In any other case, finish the bonding. */
11809 bonding_complete(adapter, bdaddr, addr_type, status);
11812 struct pair_device_data {
11813 struct btd_adapter *adapter;
11818 static void free_pair_device_data(void *user_data)
11820 struct pair_device_data *data = user_data;
11825 static gboolean pair_device_timeout(gpointer user_data)
11827 struct pair_device_data *data = user_data;
11828 struct btd_adapter *adapter = data->adapter;
11830 btd_error(adapter->dev_id, "Pair device timed out for hci%u",
11833 adapter->pair_device_timeout = 0;
11835 adapter_cancel_bonding(adapter, &data->bdaddr, data->addr_type);
11840 static void pair_device_complete(uint8_t status, uint16_t length,
11841 const void *param, void *user_data)
11843 const struct mgmt_rp_pair_device *rp = param;
11844 struct pair_device_data *data = user_data;
11845 struct btd_adapter *adapter = data->adapter;
11847 DBG("%s (0x%02x)", mgmt_errstr(status), status);
11849 adapter->pair_device_id = 0;
11851 if (adapter->pair_device_timeout > 0) {
11852 g_source_remove(adapter->pair_device_timeout);
11853 adapter->pair_device_timeout = 0;
11856 /* Workaround for a kernel bug
11858 * Broken kernels may reply to device pairing command with command
11859 * status instead of command complete event e.g. if adapter was not
11862 if (status != MGMT_STATUS_SUCCESS && length < sizeof(*rp)) {
11863 btd_error(adapter->dev_id, "Pair device failed: %s (0x%02x)",
11864 mgmt_errstr(status), status);
11866 bonding_attempt_complete(adapter, &data->bdaddr,
11867 data->addr_type, status);
11871 if (length < sizeof(*rp)) {
11872 btd_error(adapter->dev_id, "Too small pair device response");
11876 bonding_attempt_complete(adapter, &rp->addr.bdaddr, rp->addr.type,
11880 int adapter_create_bonding(struct btd_adapter *adapter, const bdaddr_t *bdaddr,
11881 uint8_t addr_type, uint8_t io_cap)
11883 if (adapter->pair_device_id > 0) {
11884 btd_error(adapter->dev_id,
11885 "Unable pair since another pairing is in progress");
11889 #ifndef TIZEN_FEATURE_BLUEZ_MODIFY
11890 suspend_discovery(adapter);
11892 return adapter_bonding_attempt(adapter, bdaddr, addr_type, io_cap);
11895 /* Starts a new bonding attempt in a fresh new bonding_req or a retried one. */
11896 int adapter_bonding_attempt(struct btd_adapter *adapter, const bdaddr_t *bdaddr,
11897 uint8_t addr_type, uint8_t io_cap)
11899 struct mgmt_cp_pair_device cp;
11901 struct pair_device_data *data;
11904 ba2str(bdaddr, addr);
11905 DBG("hci%u bdaddr %s type %d io_cap 0x%02x",
11906 adapter->dev_id, addr, addr_type, io_cap);
11908 /* Reset the pincode_requested flag for a new bonding attempt. */
11909 adapter->pincode_requested = false;
11911 memset(&cp, 0, sizeof(cp));
11912 bacpy(&cp.addr.bdaddr, bdaddr);
11913 cp.addr.type = addr_type;
11914 cp.io_cap = io_cap;
11916 data = g_new0(struct pair_device_data, 1);
11917 data->adapter = adapter;
11918 bacpy(&data->bdaddr, bdaddr);
11919 data->addr_type = addr_type;
11921 id = mgmt_send(adapter->mgmt, MGMT_OP_PAIR_DEVICE,
11922 adapter->dev_id, sizeof(cp), &cp,
11923 pair_device_complete, data,
11924 free_pair_device_data);
11927 btd_error(adapter->dev_id, "Failed to pair %s for hci%u",
11928 addr, adapter->dev_id);
11929 free_pair_device_data(data);
11933 adapter->pair_device_id = id;
11935 /* Due to a bug in the kernel it is possible that a LE pairing
11936 * request never times out. Therefore, add a timer to clean up
11937 * if no response arrives
11939 adapter->pair_device_timeout = g_timeout_add_seconds(BONDING_TIMEOUT,
11940 pair_device_timeout, data);
11945 static void disconnect_notify(struct btd_device *dev, uint8_t reason)
11949 for (l = disconnect_list; l; l = g_slist_next(l)) {
11950 btd_disconnect_cb disconnect_cb = l->data;
11951 disconnect_cb(dev, reason);
11955 static void dev_disconnected(struct btd_adapter *adapter,
11956 const struct mgmt_addr_info *addr,
11959 struct btd_device *device;
11961 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
11962 struct device_addr_type t_addr;
11965 ba2str(&addr->bdaddr, dst);
11967 DBG("Device %s disconnected, reason %u", dst, reason);
11969 device = btd_adapter_find_device(adapter, &addr->bdaddr, addr->type);
11971 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
11973 device_get_tizen_addr(device, addr->type, &t_addr);
11975 device_set_disconnect_reason(device, reason);
11976 adapter_remove_connection(adapter, device, t_addr.bdaddr_type);
11977 disconnect_notify(device, reason);
11978 if (device_is_bonded(device, t_addr.bdaddr_type)) {
11979 DBG("addr type %d, bonded", t_addr.bdaddr_type);
11983 bonding_attempt_complete(adapter, &t_addr.bdaddr,
11984 t_addr.bdaddr_type, MGMT_STATUS_DISCONNECTED);
11989 adapter_remove_connection(adapter, device, addr->type);
11990 disconnect_notify(device, reason);
11994 bonding_attempt_complete(adapter, &addr->bdaddr, addr->type,
11995 MGMT_STATUS_DISCONNECTED);
11998 void btd_add_disconnect_cb(btd_disconnect_cb func)
12000 disconnect_list = g_slist_append(disconnect_list, func);
12003 void btd_remove_disconnect_cb(btd_disconnect_cb func)
12005 disconnect_list = g_slist_remove(disconnect_list, func);
12008 static void disconnect_complete(uint8_t status, uint16_t length,
12009 const void *param, void *user_data)
12011 const struct mgmt_rp_disconnect *rp = param;
12012 struct btd_adapter *adapter = user_data;
12014 if (status == MGMT_STATUS_NOT_CONNECTED) {
12015 btd_warn(adapter->dev_id,
12016 "Disconnecting failed: already disconnected");
12017 } else if (status != MGMT_STATUS_SUCCESS) {
12018 btd_error(adapter->dev_id,
12019 "Failed to disconnect device: %s (0x%02x)",
12020 mgmt_errstr(status), status);
12024 if (length < sizeof(*rp)) {
12025 btd_error(adapter->dev_id,
12026 "Too small device disconnect response");
12030 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
12031 /* Use HCI error code instead of MGMT disconnection reason */
12032 dev_disconnected(adapter, &rp->addr, 0x16);
12034 dev_disconnected(adapter, &rp->addr, MGMT_DEV_DISCONN_LOCAL_HOST);
12038 int btd_adapter_disconnect_device(struct btd_adapter *adapter,
12039 const bdaddr_t *bdaddr,
12040 uint8_t bdaddr_type)
12043 struct mgmt_cp_disconnect cp;
12045 memset(&cp, 0, sizeof(cp));
12046 bacpy(&cp.addr.bdaddr, bdaddr);
12047 cp.addr.type = bdaddr_type;
12049 if (mgmt_send(adapter->mgmt, MGMT_OP_DISCONNECT,
12050 adapter->dev_id, sizeof(cp), &cp,
12051 disconnect_complete, adapter, NULL) > 0)
12057 static void auth_failed_callback(uint16_t index, uint16_t length,
12058 const void *param, void *user_data)
12060 const struct mgmt_ev_auth_failed *ev = param;
12061 struct btd_adapter *adapter = user_data;
12063 if (length < sizeof(*ev)) {
12064 btd_error(adapter->dev_id, "Too small auth failed mgmt event");
12068 bonding_attempt_complete(adapter, &ev->addr.bdaddr, ev->addr.type,
12072 static void store_link_key(struct btd_adapter *adapter,
12073 struct btd_device *device, const uint8_t *key,
12074 uint8_t type, uint8_t pin_length)
12076 char device_addr[18];
12077 char filename[PATH_MAX];
12078 GKeyFile *key_file;
12084 ba2str(device_get_address(device), device_addr);
12086 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/%s/info",
12087 adapter_dir(adapter), device_addr);
12088 key_file = g_key_file_new();
12089 g_key_file_load_from_file(key_file, filename, 0, NULL);
12091 for (i = 0; i < 16; i++)
12092 sprintf(key_str + (i * 2), "%2.2X", key[i]);
12094 g_key_file_set_string(key_file, "LinkKey", "Key", key_str);
12096 g_key_file_set_integer(key_file, "LinkKey", "Type", type);
12097 g_key_file_set_integer(key_file, "LinkKey", "PINLength", pin_length);
12099 create_file(filename, S_IRUSR | S_IWUSR);
12101 str = g_key_file_to_data(key_file, &length, NULL);
12102 g_file_set_contents(filename, str, length, NULL);
12105 g_key_file_free(key_file);
12108 static void new_link_key_callback(uint16_t index, uint16_t length,
12109 const void *param, void *user_data)
12111 const struct mgmt_ev_new_link_key *ev = param;
12112 const struct mgmt_addr_info *addr = &ev->key.addr;
12113 struct btd_adapter *adapter = user_data;
12114 struct btd_device *device;
12117 if (length < sizeof(*ev)) {
12118 btd_error(adapter->dev_id, "Too small new link key event");
12122 ba2str(&addr->bdaddr, dst);
12124 DBG("hci%u new key for %s type %u pin_len %u store_hint %u",
12125 adapter->dev_id, dst, ev->key.type, ev->key.pin_len,
12128 if (ev->key.pin_len > 16) {
12129 btd_error(adapter->dev_id,
12130 "Invalid PIN length (%u) in new_key event",
12135 device = btd_adapter_get_device(adapter, &addr->bdaddr, addr->type);
12137 btd_error(adapter->dev_id,
12138 "Unable to get device object for %s", dst);
12142 if (ev->store_hint) {
12143 const struct mgmt_link_key_info *key = &ev->key;
12145 store_link_key(adapter, device, key->val, key->type,
12148 device_set_bonded(device, BDADDR_BREDR);
12149 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
12151 if (btd_adapter_get_a2dp_role(adapter) == BLUETOOTH_A2DP_SINK_ROLE) {
12152 DBG("store_hint %d", ev->store_hint);
12153 btd_device_set_temporary(device, false);
12160 bonding_complete(adapter, &addr->bdaddr, addr->type, 0);
12163 static void store_longtermkey(struct btd_adapter *adapter, const bdaddr_t *peer,
12164 uint8_t bdaddr_type, const unsigned char *key,
12165 uint8_t master, uint8_t authenticated,
12166 uint8_t enc_size, uint16_t ediv,
12169 const char *group = master ? "LongTermKey" : "SlaveLongTermKey";
12170 char device_addr[18];
12171 char filename[PATH_MAX];
12172 GKeyFile *key_file;
12178 if (master != 0x00 && master != 0x01) {
12179 error("Unsupported LTK type %u", master);
12183 ba2str(peer, device_addr);
12185 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/%s/info",
12186 adapter_dir(adapter), device_addr);
12187 key_file = g_key_file_new();
12188 g_key_file_load_from_file(key_file, filename, 0, NULL);
12190 /* Old files may contain this so remove it in case it exists */
12191 g_key_file_remove_key(key_file, "LongTermKey", "Master", NULL);
12193 for (i = 0; i < 16; i++)
12194 sprintf(key_str + (i * 2), "%2.2X", key[i]);
12196 g_key_file_set_string(key_file, group, "Key", key_str);
12198 g_key_file_set_integer(key_file, group, "Authenticated",
12200 g_key_file_set_integer(key_file, group, "EncSize", enc_size);
12202 g_key_file_set_integer(key_file, group, "EDiv", ediv);
12203 g_key_file_set_uint64(key_file, group, "Rand", rand);
12205 create_file(filename, S_IRUSR | S_IWUSR);
12207 str = g_key_file_to_data(key_file, &length, NULL);
12208 g_file_set_contents(filename, str, length, NULL);
12211 g_key_file_free(key_file);
12214 static void new_long_term_key_callback(uint16_t index, uint16_t length,
12215 const void *param, void *user_data)
12217 const struct mgmt_ev_new_long_term_key *ev = param;
12218 const struct mgmt_addr_info *addr = &ev->key.addr;
12219 struct btd_adapter *adapter = user_data;
12220 struct btd_device *device;
12223 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
12224 struct device_addr_type t_addr;
12227 if (length < sizeof(*ev)) {
12228 btd_error(adapter->dev_id, "Too small long term key event");
12232 ba2str(&addr->bdaddr, dst);
12234 DBG("hci%u new LTK for %s type %u enc_size %u",
12235 adapter->dev_id, dst, ev->key.type, ev->key.enc_size);
12237 device = btd_adapter_get_device(adapter, &addr->bdaddr, addr->type);
12239 btd_error(adapter->dev_id,
12240 "Unable to get device object for %s", dst);
12245 * Some older kernel versions set store_hint for long term keys
12246 * from resolvable and unresolvable random addresses, but there
12247 * is no point in storing these. Next time around the device
12248 * address will be invalid.
12250 * So only for identity addresses (public and static random) use
12251 * the store_hint as an indication if the long term key should
12252 * be persistently stored.
12255 if (addr->type == BDADDR_LE_RANDOM &&
12256 (addr->bdaddr.b[5] & 0xc0) != 0xc0)
12257 persistent = false;
12259 persistent = !!ev->store_hint;
12262 const struct mgmt_ltk_info *key = &ev->key;
12266 ediv = le16_to_cpu(key->ediv);
12267 rand = le64_to_cpu(key->rand);
12269 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
12270 device_get_tizen_addr(device, addr->type, &t_addr);
12271 store_longtermkey(adapter, &t_addr.bdaddr, t_addr.bdaddr_type,
12272 key->val, key->master, key->type,
12273 key->enc_size, ediv, rand);
12275 store_longtermkey(adapter, &key->addr.bdaddr,
12276 key->addr.type, key->val, key->master,
12277 key->type, key->enc_size, ediv, rand);
12280 device_set_bonded(device, addr->type);
12283 bonding_complete(adapter, &addr->bdaddr, addr->type, 0);
12286 static void store_csrk(struct btd_adapter *adapter, const bdaddr_t *peer,
12287 uint8_t bdaddr_type, const unsigned char *key,
12288 uint32_t counter, uint8_t type)
12291 char device_addr[18];
12292 char filename[PATH_MAX];
12293 GKeyFile *key_file;
12302 group = "LocalSignatureKey";
12306 group = "RemoteSignatureKey";
12310 group = "LocalSignatureKey";
12314 group = "RemoteSignatureKey";
12318 warn("Unsupported CSRK type %u", type);
12322 ba2str(peer, device_addr);
12324 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/%s/info",
12325 adapter_dir(adapter), device_addr);
12327 key_file = g_key_file_new();
12328 g_key_file_load_from_file(key_file, filename, 0, NULL);
12330 for (i = 0; i < 16; i++)
12331 sprintf(key_str + (i * 2), "%2.2X", key[i]);
12333 g_key_file_set_string(key_file, group, "Key", key_str);
12334 g_key_file_set_integer(key_file, group, "Counter", counter);
12335 g_key_file_set_boolean(key_file, group, "Authenticated", auth);
12337 create_file(filename, S_IRUSR | S_IWUSR);
12339 str = g_key_file_to_data(key_file, &length, NULL);
12340 g_file_set_contents(filename, str, length, NULL);
12343 g_key_file_free(key_file);
12346 static void new_csrk_callback(uint16_t index, uint16_t length,
12347 const void *param, void *user_data)
12349 const struct mgmt_ev_new_csrk *ev = param;
12350 const struct mgmt_addr_info *addr = &ev->key.addr;
12351 const struct mgmt_csrk_info *key = &ev->key;
12352 struct btd_adapter *adapter = user_data;
12353 struct btd_device *device;
12355 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
12356 struct device_addr_type t_addr;
12359 if (length < sizeof(*ev)) {
12360 btd_error(adapter->dev_id, "Too small CSRK event");
12364 ba2str(&addr->bdaddr, dst);
12366 DBG("hci%u new CSRK for %s type %u", adapter->dev_id, dst,
12369 device = btd_adapter_get_device(adapter, &addr->bdaddr, addr->type);
12371 btd_error(adapter->dev_id,
12372 "Unable to get device object for %s", dst);
12376 if (!ev->store_hint)
12379 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
12380 device_get_tizen_addr(device, addr->type, &t_addr);
12381 store_csrk(adapter, &t_addr.bdaddr, t_addr.bdaddr_type, key->val, 0,
12384 store_csrk(adapter, &key->addr.bdaddr, key->addr.type, key->val, 0,
12388 btd_device_set_temporary(device, false);
12391 static void store_irk(struct btd_adapter *adapter, const bdaddr_t *peer,
12392 uint8_t bdaddr_type, const unsigned char *key)
12394 char device_addr[18];
12395 char filename[PATH_MAX];
12396 GKeyFile *key_file;
12402 ba2str(peer, device_addr);
12404 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/%s/info",
12405 adapter_dir(adapter), device_addr);
12406 key_file = g_key_file_new();
12407 g_key_file_load_from_file(key_file, filename, 0, NULL);
12409 for (i = 0; i < 16; i++)
12410 sprintf(str + (i * 2), "%2.2X", key[i]);
12412 g_key_file_set_string(key_file, "IdentityResolvingKey", "Key", str);
12414 create_file(filename, S_IRUSR | S_IWUSR);
12416 store_data = g_key_file_to_data(key_file, &length, NULL);
12417 g_file_set_contents(filename, store_data, length, NULL);
12418 g_free(store_data);
12420 g_key_file_free(key_file);
12423 static void new_irk_callback(uint16_t index, uint16_t length,
12424 const void *param, void *user_data)
12426 const struct mgmt_ev_new_irk *ev = param;
12427 const struct mgmt_addr_info *addr = &ev->key.addr;
12428 const struct mgmt_irk_info *irk = &ev->key;
12429 struct btd_adapter *adapter = user_data;
12430 struct btd_device *device, *duplicate;
12432 char dst[18], rpa[18];
12433 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
12434 struct device_addr_type t_addr;
12437 if (length < sizeof(*ev)) {
12438 btd_error(adapter->dev_id, "Too small New IRK event");
12442 ba2str(&addr->bdaddr, dst);
12443 ba2str(&ev->rpa, rpa);
12445 DBG("hci%u new IRK for %s RPA %s", adapter->dev_id, dst, rpa);
12447 if (bacmp(&ev->rpa, BDADDR_ANY)) {
12448 device = btd_adapter_get_device(adapter, &ev->rpa,
12450 #ifndef TIZEN_FEATURE_BLUEZ_MODIFY
12451 device = btd_adapter_get_device(adapter, &ev->rpa,
12453 duplicate = btd_adapter_find_device(adapter, &addr->bdaddr,
12455 if (duplicate == device)
12458 device_set_rpa(device, &ev->rpa);
12462 device = btd_adapter_get_device(adapter, &addr->bdaddr,
12468 btd_error(adapter->dev_id,
12469 "Unable to get device object for %s", dst);
12473 device_update_addr(device, &addr->bdaddr, addr->type);
12476 device_merge_duplicate(device, duplicate);
12478 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
12479 device_set_irk_value(device, irk->val);
12482 persistent = !!ev->store_hint;
12486 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
12487 device_get_tizen_addr(device, addr->type, &t_addr);
12488 store_irk(adapter, &t_addr.bdaddr, t_addr.bdaddr_type, irk->val);
12490 store_irk(adapter, &addr->bdaddr, addr->type, irk->val);
12493 btd_device_set_temporary(device, false);
12496 static void store_conn_param(struct btd_adapter *adapter, const bdaddr_t *peer,
12497 uint8_t bdaddr_type, uint16_t min_interval,
12498 uint16_t max_interval, uint16_t latency,
12501 char device_addr[18];
12502 char filename[PATH_MAX];
12503 GKeyFile *key_file;
12507 ba2str(peer, device_addr);
12511 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/%s/info",
12512 adapter_dir(adapter), device_addr);
12513 key_file = g_key_file_new();
12514 g_key_file_load_from_file(key_file, filename, 0, NULL);
12516 g_key_file_set_integer(key_file, "ConnectionParameters",
12517 "MinInterval", min_interval);
12518 g_key_file_set_integer(key_file, "ConnectionParameters",
12519 "MaxInterval", max_interval);
12520 g_key_file_set_integer(key_file, "ConnectionParameters",
12521 "Latency", latency);
12522 g_key_file_set_integer(key_file, "ConnectionParameters",
12523 "Timeout", timeout);
12525 create_file(filename, S_IRUSR | S_IWUSR);
12527 store_data = g_key_file_to_data(key_file, &length, NULL);
12528 g_file_set_contents(filename, store_data, length, NULL);
12529 g_free(store_data);
12531 g_key_file_free(key_file);
12534 static void new_conn_param(uint16_t index, uint16_t length,
12535 const void *param, void *user_data)
12537 const struct mgmt_ev_new_conn_param *ev = param;
12538 struct btd_adapter *adapter = user_data;
12539 uint16_t min, max, latency, timeout;
12540 struct btd_device *dev;
12542 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
12543 struct device_addr_type t_addr;
12546 if (length < sizeof(*ev)) {
12547 btd_error(adapter->dev_id,
12548 "Too small New Connection Parameter event");
12552 ba2str(&ev->addr.bdaddr, dst);
12554 min = btohs(ev->min_interval);
12555 max = btohs(ev->max_interval);
12556 latency = btohs(ev->latency);
12557 timeout = btohs(ev->timeout);
12559 DBG("hci%u %s (%u) min 0x%04x max 0x%04x latency 0x%04x timeout 0x%04x",
12560 adapter->dev_id, dst, ev->addr.type, min, max, latency, timeout);
12562 dev = btd_adapter_get_device(adapter, &ev->addr.bdaddr, ev->addr.type);
12564 btd_error(adapter->dev_id,
12565 "Unable to get device object for %s", dst);
12569 if (!ev->store_hint)
12572 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
12573 device_get_tizen_addr(dev, ev->addr.type, &t_addr);
12574 store_conn_param(adapter, &t_addr.bdaddr, t_addr.bdaddr_type,
12575 ev->min_interval, ev->max_interval,
12576 ev->latency, ev->timeout);
12578 store_conn_param(adapter, &ev->addr.bdaddr, ev->addr.type,
12579 ev->min_interval, ev->max_interval,
12580 ev->latency, ev->timeout);
12584 int adapter_set_io_capability(struct btd_adapter *adapter, uint8_t io_cap)
12586 struct mgmt_cp_set_io_capability cp;
12588 memset(&cp, 0, sizeof(cp));
12589 cp.io_capability = io_cap;
12591 if (mgmt_send(adapter->mgmt, MGMT_OP_SET_IO_CAPABILITY,
12592 adapter->dev_id, sizeof(cp), &cp,
12593 NULL, NULL, NULL) > 0)
12599 int btd_adapter_add_remote_oob_data(struct btd_adapter *adapter,
12600 const bdaddr_t *bdaddr,
12601 uint8_t *hash, uint8_t *randomizer)
12603 struct mgmt_cp_add_remote_oob_data cp;
12606 ba2str(bdaddr, addr);
12607 DBG("hci%d bdaddr %s", adapter->dev_id, addr);
12609 memset(&cp, 0, sizeof(cp));
12610 bacpy(&cp.addr.bdaddr, bdaddr);
12611 memcpy(cp.hash192, hash, 16);
12614 memcpy(cp.rand192, randomizer, 16);
12616 if (mgmt_send(adapter->mgmt, MGMT_OP_ADD_REMOTE_OOB_DATA,
12617 adapter->dev_id, sizeof(cp), &cp,
12618 NULL, NULL, NULL) > 0)
12624 int btd_adapter_remove_remote_oob_data(struct btd_adapter *adapter,
12625 const bdaddr_t *bdaddr)
12627 struct mgmt_cp_remove_remote_oob_data cp;
12630 ba2str(bdaddr, addr);
12631 DBG("hci%d bdaddr %s", adapter->dev_id, addr);
12633 memset(&cp, 0, sizeof(cp));
12634 bacpy(&cp.addr.bdaddr, bdaddr);
12636 if (mgmt_send(adapter->mgmt, MGMT_OP_REMOVE_REMOTE_OOB_DATA,
12637 adapter->dev_id, sizeof(cp), &cp,
12638 NULL, NULL, NULL) > 0)
12644 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
12645 int btd_adapter_add_remote_oob_ext_data(struct btd_adapter *adapter,
12646 const bdaddr_t *bdaddr, uint8_t bdaddr_type,
12647 uint8_t *hash192, uint8_t *randomizer192,
12648 uint8_t *hash256, uint8_t *randomizer256)
12650 struct mgmt_cp_add_remote_oob_data cp;
12653 ba2str(bdaddr, addr);
12654 DBG("hci%d bdaddr %s type %d", adapter->dev_id, addr, bdaddr_type);
12656 memset(&cp, 0, sizeof(cp));
12657 bacpy(&cp.addr.bdaddr, bdaddr);
12658 cp.addr.type = bdaddr_type;
12660 if (hash192 && randomizer192) {
12661 memcpy(cp.hash192, hash192, 16);
12662 memcpy(cp.rand192, randomizer192, 16);
12665 if (hash256 && randomizer256) {
12666 memcpy(cp.hash256, hash256, 16);
12667 memcpy(cp.rand256, randomizer256, 16);
12670 if (mgmt_send(adapter->mgmt, MGMT_OP_ADD_REMOTE_OOB_DATA,
12671 adapter->dev_id, sizeof(cp), &cp,
12672 NULL, NULL, NULL) > 0)
12678 int btd_adapter_remove_remote_oob_ext_data(struct btd_adapter *adapter,
12679 const bdaddr_t *bdaddr, uint8_t bdaddr_type)
12681 struct mgmt_cp_remove_remote_oob_data cp;
12684 ba2str(bdaddr, addr);
12685 DBG("hci%d bdaddr %s type %d", adapter->dev_id, addr, bdaddr_type);
12687 memset(&cp, 0, sizeof(cp));
12688 bacpy(&cp.addr.bdaddr, bdaddr);
12689 cp.addr.type = bdaddr_type;
12691 if (mgmt_send(adapter->mgmt, MGMT_OP_REMOVE_REMOTE_OOB_DATA,
12692 adapter->dev_id, sizeof(cp), &cp,
12693 NULL, NULL, NULL) > 0)
12700 bool btd_adapter_ssp_enabled(struct btd_adapter *adapter)
12702 if (adapter->current_settings & MGMT_SETTING_SSP)
12708 void btd_adapter_set_oob_handler(struct btd_adapter *adapter,
12709 struct oob_handler *handler)
12711 adapter->oob_handler = handler;
12714 gboolean btd_adapter_check_oob_handler(struct btd_adapter *adapter)
12716 return adapter->oob_handler != NULL;
12719 static void read_local_oob_data_complete(uint8_t status, uint16_t length,
12720 const void *param, void *user_data)
12722 const struct mgmt_rp_read_local_oob_data *rp = param;
12723 struct btd_adapter *adapter = user_data;
12724 const uint8_t *hash, *randomizer;
12725 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
12726 const uint8_t *hash256 = NULL;
12727 const uint8_t *randomizer256 = NULL;
12730 if (status != MGMT_STATUS_SUCCESS) {
12731 btd_error(adapter->dev_id,
12732 "Read local OOB data failed: %s (0x%02x)",
12733 mgmt_errstr(status), status);
12736 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
12737 } else if (length < 32) {
12739 } else if (length < sizeof(*rp)) {
12741 btd_error(adapter->dev_id,
12742 "Too small read local OOB data response");
12745 hash = rp->hash192;
12746 randomizer = rp->rand192;
12747 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
12749 hash256 = rp->hash256;
12750 randomizer256 = rp->rand256;
12755 if (!adapter->oob_handler || !adapter->oob_handler->read_local_cb)
12758 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
12759 adapter->oob_handler->read_local_cb(adapter, hash, randomizer,
12760 hash256, randomizer256,
12761 adapter->oob_handler->user_data);
12763 adapter->oob_handler->read_local_cb(adapter, hash, randomizer,
12764 adapter->oob_handler->user_data);
12767 g_free(adapter->oob_handler);
12768 adapter->oob_handler = NULL;
12771 int btd_adapter_read_local_oob_data(struct btd_adapter *adapter)
12773 DBG("hci%u", adapter->dev_id);
12775 if (mgmt_send(adapter->mgmt, MGMT_OP_READ_LOCAL_OOB_DATA,
12776 adapter->dev_id, 0, NULL, read_local_oob_data_complete,
12777 adapter, NULL) > 0)
12783 void btd_adapter_for_each_device(struct btd_adapter *adapter,
12784 void (*cb)(struct btd_device *device, void *data),
12787 g_slist_foreach(adapter->devices, (GFunc) cb, data);
12790 static int adapter_cmp(gconstpointer a, gconstpointer b)
12792 struct btd_adapter *adapter = (struct btd_adapter *) a;
12793 const bdaddr_t *bdaddr = b;
12795 return bacmp(&adapter->bdaddr, bdaddr);
12798 static int adapter_id_cmp(gconstpointer a, gconstpointer b)
12800 struct btd_adapter *adapter = (struct btd_adapter *) a;
12801 uint16_t id = GPOINTER_TO_UINT(b);
12803 return adapter->dev_id == id ? 0 : -1;
12806 struct btd_adapter *adapter_find(const bdaddr_t *sba)
12810 match = g_slist_find_custom(adapters, sba, adapter_cmp);
12814 return match->data;
12817 struct btd_adapter *adapter_find_by_id(int id)
12821 match = g_slist_find_custom(adapters, GINT_TO_POINTER(id),
12826 return match->data;
12829 void adapter_foreach(adapter_cb func, gpointer user_data)
12831 g_slist_foreach(adapters, (GFunc) func, user_data);
12834 static int set_did(struct btd_adapter *adapter, uint16_t vendor,
12835 uint16_t product, uint16_t version, uint16_t source)
12837 struct mgmt_cp_set_device_id cp;
12839 DBG("hci%u source %x vendor %x product %x version %x",
12840 adapter->dev_id, source, vendor, product, version);
12842 memset(&cp, 0, sizeof(cp));
12844 cp.source = htobs(source);
12845 cp.vendor = htobs(vendor);
12846 cp.product = htobs(product);
12847 cp.version = htobs(version);
12849 if (mgmt_send(adapter->mgmt, MGMT_OP_SET_DEVICE_ID,
12850 adapter->dev_id, sizeof(cp), &cp,
12851 NULL, NULL, NULL) > 0)
12857 static void services_modified(struct gatt_db_attribute *attrib, void *user_data)
12859 struct btd_adapter *adapter = user_data;
12861 g_dbus_emit_property_changed(dbus_conn, adapter->path,
12862 ADAPTER_INTERFACE, "UUIDs");
12865 static int adapter_register(struct btd_adapter *adapter)
12867 struct agent *agent;
12868 struct gatt_db *db;
12873 adapter->path = g_strdup_printf("/org/bluez/hci%d", adapter->dev_id);
12875 if (!g_dbus_register_interface(dbus_conn,
12876 adapter->path, ADAPTER_INTERFACE,
12877 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
12878 adapter_methods, adapter_signals,
12880 adapter_methods, NULL,
12882 adapter_properties, adapter,
12884 btd_error(adapter->dev_id,
12885 "Adapter interface init failed on path %s",
12887 g_free(adapter->path);
12888 adapter->path = NULL;
12892 if (adapters == NULL)
12893 adapter->is_default = true;
12895 adapters = g_slist_append(adapters, adapter);
12897 agent = agent_get(NULL);
12899 uint8_t io_cap = agent_get_io_capability(agent);
12900 adapter_set_io_capability(adapter, io_cap);
12901 agent_unref(agent);
12904 adapter->database = btd_gatt_database_new(adapter);
12905 if (!adapter->database) {
12906 btd_error(adapter->dev_id,
12907 "Failed to create GATT database for adapter");
12908 adapters = g_slist_remove(adapters, adapter);
12912 /* Don't start advertising managers on non-LE controllers. */
12913 if (adapter->supported_settings & MGMT_SETTING_LE)
12914 adapter->adv_manager = btd_adv_manager_new(adapter);
12916 btd_info(adapter->dev_id,
12917 "LEAdvertisingManager skipped, LE unavailable");
12919 db = btd_gatt_database_get_db(adapter->database);
12920 adapter->db_id = gatt_db_register(db, services_modified,
12924 load_config(adapter);
12925 fix_storage(adapter);
12926 load_drivers(adapter);
12927 btd_profile_foreach(probe_profile, adapter);
12928 clear_blocked(adapter);
12929 load_devices(adapter);
12931 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
12932 adapter_print_devices(adapter);
12934 if (load_local_irk(adapter)) {
12935 if (!(adapter->supported_settings & MGMT_SETTING_PRIVACY))
12936 main_opts.le_privacy = false;
12939 * Some Android devices don't consider the device as LE one,
12940 * if the device doesn't distribute IRK when pairing.
12941 * Because of this compatibility issue, set IRK
12942 * even though privacy feature is disabled.
12944 set_local_irk(adapter);
12946 if (main_opts.le_privacy) {
12947 DBG("Enable LE Privacy feature");
12948 set_privacy(adapter, true);
12950 DBG("Disable LE Privacy feature");
12955 /* retrieve the active connections: address the scenario where
12956 * the are active connections before the daemon've started */
12957 if (adapter->current_settings & MGMT_SETTING_POWERED)
12958 load_connections(adapter);
12960 adapter->initialized = TRUE;
12962 if (main_opts.did_source) {
12963 /* DeviceID record is added by sdpd-server before any other
12964 * record is registered. */
12965 adapter_service_insert(adapter, sdp_record_find(0x10000));
12966 set_did(adapter, main_opts.did_vendor, main_opts.did_product,
12967 main_opts.did_version, main_opts.did_source);
12970 DBG("Adapter %s registered", adapter->path);
12975 static int adapter_unregister(struct btd_adapter *adapter)
12977 DBG("Unregister path: %s", adapter->path);
12979 adapters = g_slist_remove(adapters, adapter);
12981 if (adapter->is_default && adapters != NULL) {
12982 struct btd_adapter *new_default;
12984 new_default = adapter_find_by_id(hci_get_route(NULL));
12985 if (new_default == NULL)
12986 new_default = adapters->data;
12988 new_default->is_default = true;
12991 adapter_list = g_list_remove(adapter_list, adapter);
12993 adapter_remove(adapter);
12994 btd_adapter_unref(adapter);
12999 static void disconnected_callback(uint16_t index, uint16_t length,
13000 const void *param, void *user_data)
13002 const struct mgmt_ev_device_disconnected *ev = param;
13003 struct btd_adapter *adapter = user_data;
13006 if (length < sizeof(struct mgmt_addr_info)) {
13007 btd_error(adapter->dev_id,
13008 "Too small device disconnected event");
13012 if (length < sizeof(*ev))
13013 reason = MGMT_DEV_DISCONN_UNKNOWN;
13015 reason = ev->reason;
13017 dev_disconnected(adapter, &ev->addr, reason);
13020 static void connected_callback(uint16_t index, uint16_t length,
13021 const void *param, void *user_data)
13023 const struct mgmt_ev_device_connected *ev = param;
13024 struct btd_adapter *adapter = user_data;
13025 struct btd_device *device;
13026 struct eir_data eir_data;
13031 if (length < sizeof(*ev)) {
13032 btd_error(adapter->dev_id, "Too small device connected event");
13036 eir_len = btohs(ev->eir_len);
13037 if (length < sizeof(*ev) + eir_len) {
13038 btd_error(adapter->dev_id, "Too small device connected event");
13042 ba2str(&ev->addr.bdaddr, addr);
13044 DBG("hci%u device %s connected eir_len %u", index, addr, eir_len);
13046 device = btd_adapter_get_device(adapter, &ev->addr.bdaddr,
13049 btd_error(adapter->dev_id,
13050 "Unable to get device object for %s", addr);
13054 memset(&eir_data, 0, sizeof(eir_data));
13056 eir_parse(&eir_data, ev->eir, eir_len);
13058 if (eir_data.class != 0)
13059 device_set_class(device, eir_data.class);
13061 adapter_add_connection(adapter, device, ev->addr.type);
13063 name_known = device_name_known(device);
13065 if (eir_data.name && (eir_data.name_complete || !name_known)) {
13066 device_store_cached_name(device, eir_data.name);
13067 btd_device_device_set_name(device, eir_data.name);
13070 if (eir_data.msd_list)
13071 adapter_msd_notify(adapter, device, eir_data.msd_list);
13073 eir_data_free(&eir_data);
13076 static void device_blocked_callback(uint16_t index, uint16_t length,
13077 const void *param, void *user_data)
13079 const struct mgmt_ev_device_blocked *ev = param;
13080 struct btd_adapter *adapter = user_data;
13081 struct btd_device *device;
13084 if (length < sizeof(*ev)) {
13085 btd_error(adapter->dev_id, "Too small device blocked event");
13089 ba2str(&ev->addr.bdaddr, addr);
13090 DBG("hci%u %s blocked", index, addr);
13092 device = btd_adapter_find_device(adapter, &ev->addr.bdaddr,
13095 device_block(device, TRUE);
13098 static void device_unblocked_callback(uint16_t index, uint16_t length,
13099 const void *param, void *user_data)
13101 const struct mgmt_ev_device_unblocked *ev = param;
13102 struct btd_adapter *adapter = user_data;
13103 struct btd_device *device;
13106 if (length < sizeof(*ev)) {
13107 btd_error(adapter->dev_id, "Too small device unblocked event");
13111 ba2str(&ev->addr.bdaddr, addr);
13112 DBG("hci%u %s unblocked", index, addr);
13114 device = btd_adapter_find_device(adapter, &ev->addr.bdaddr,
13117 device_unblock(device, FALSE, TRUE);
13120 static void conn_fail_notify(struct btd_device *dev, uint8_t status)
13124 for (l = conn_fail_list; l; l = g_slist_next(l)) {
13125 btd_conn_fail_cb conn_fail_cb = l->data;
13126 conn_fail_cb(dev, status);
13130 void btd_add_conn_fail_cb(btd_conn_fail_cb func)
13132 conn_fail_list = g_slist_append(conn_fail_list, func);
13135 void btd_remove_conn_fail_cb(btd_conn_fail_cb func)
13137 conn_fail_list = g_slist_remove(conn_fail_list, func);
13140 static void connect_failed_callback(uint16_t index, uint16_t length,
13141 const void *param, void *user_data)
13143 const struct mgmt_ev_connect_failed *ev = param;
13144 struct btd_adapter *adapter = user_data;
13145 struct btd_device *device;
13148 if (length < sizeof(*ev)) {
13149 btd_error(adapter->dev_id, "Too small connect failed event");
13153 ba2str(&ev->addr.bdaddr, addr);
13155 DBG("hci%u %s status %u", index, addr, ev->status);
13157 device = btd_adapter_find_device(adapter, &ev->addr.bdaddr,
13160 conn_fail_notify(device, ev->status);
13162 /* If the device is in a bonding process cancel any auth request
13163 * sent to the agent before proceeding, but keep the bonding
13164 * request structure. */
13165 if (device_is_bonding(device, NULL))
13166 device_cancel_authentication(device, FALSE);
13169 /* In the case of security mode 3 devices */
13170 bonding_attempt_complete(adapter, &ev->addr.bdaddr, ev->addr.type,
13173 /* If the device is scheduled to retry the bonding wait until the retry
13174 * happens. In other case, proceed with cancel the bondig.
13176 if (device && device_is_bonding(device, NULL)
13177 && !device_is_retrying(device)) {
13178 device_cancel_authentication(device, TRUE);
13179 device_bonding_failed(device, ev->status);
13182 #ifndef TIZEN_FEATURE_BLUEZ_MODIFY
13183 /* In the case the bonding was canceled or did exists, remove the device
13184 * when it is temporary. */
13185 if (device && !device_is_bonding(device, NULL)
13186 && device_is_temporary(device))
13187 btd_adapter_remove_device(adapter, device);
13191 static void remove_keys(struct btd_adapter *adapter,
13192 struct btd_device *device, uint8_t type)
13194 char device_addr[18];
13195 char filename[PATH_MAX];
13196 GKeyFile *key_file;
13200 ba2str(device_get_address(device), device_addr);
13202 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
13203 if (device_get_rpa_exist(device) == true)
13204 ba2str(device_get_rpa(device), device_addr);
13207 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/%s/info",
13208 adapter_dir(adapter), device_addr);
13209 key_file = g_key_file_new();
13210 g_key_file_load_from_file(key_file, filename, 0, NULL);
13212 if (type == BDADDR_BREDR) {
13213 g_key_file_remove_group(key_file, "LinkKey", NULL);
13215 g_key_file_remove_group(key_file, "LongTermKey", NULL);
13216 g_key_file_remove_group(key_file, "LocalSignatureKey", NULL);
13217 g_key_file_remove_group(key_file, "RemoteSignatureKey", NULL);
13218 g_key_file_remove_group(key_file, "IdentityResolvingKey", NULL);
13221 str = g_key_file_to_data(key_file, &length, NULL);
13222 g_file_set_contents(filename, str, length, NULL);
13225 g_key_file_free(key_file);
13228 static void unpaired_callback(uint16_t index, uint16_t length,
13229 const void *param, void *user_data)
13231 const struct mgmt_ev_device_unpaired *ev = param;
13232 struct btd_adapter *adapter = user_data;
13233 struct btd_device *device;
13236 if (length < sizeof(*ev)) {
13237 btd_error(adapter->dev_id, "Too small device unpaired event");
13241 ba2str(&ev->addr.bdaddr, addr);
13243 DBG("hci%u addr %s", index, addr);
13245 device = btd_adapter_find_device(adapter, &ev->addr.bdaddr,
13248 btd_warn(adapter->dev_id,
13249 "No device object for unpaired device %s", addr);
13253 remove_keys(adapter, device, ev->addr.type);
13254 device_set_unpaired(device, ev->addr.type);
13257 static void clear_devices_complete(uint8_t status, uint16_t length,
13258 const void *param, void *user_data)
13260 if (status != MGMT_STATUS_SUCCESS) {
13261 error("Failed to clear devices: %s (0x%02x)",
13262 mgmt_errstr(status), status);
13267 static int clear_devices(struct btd_adapter *adapter)
13269 struct mgmt_cp_remove_device cp;
13271 if (!kernel_conn_control)
13274 memset(&cp, 0, sizeof(cp));
13276 DBG("sending clear devices command for index %u", adapter->dev_id);
13278 if (mgmt_send(adapter->mgmt, MGMT_OP_REMOVE_DEVICE,
13279 adapter->dev_id, sizeof(cp), &cp,
13280 clear_devices_complete, adapter, NULL) > 0)
13283 btd_error(adapter->dev_id, "Failed to clear devices for index %u",
13289 static bool get_static_addr(struct btd_adapter *adapter)
13291 struct bt_crypto *crypto;
13299 snprintf(mfg, sizeof(mfg), "0x%04x", adapter->manufacturer);
13301 file = g_key_file_new();
13302 g_key_file_load_from_file(file, STORAGEDIR "/addresses", 0, NULL);
13303 addrs = g_key_file_get_string_list(file, "Static", mfg, &len, NULL);
13305 for (i = 0; i < len; i++) {
13308 str2ba(addrs[i], &addr);
13309 if (adapter_find(&addr))
13312 /* Usable address found in list */
13313 bacpy(&adapter->bdaddr, &addr);
13314 adapter->bdaddr_type = BDADDR_LE_RANDOM;
13320 addrs = g_renew(char *, addrs, len + 1);
13323 addrs = g_new(char *, len + 1);
13326 /* Initialize slot for new address */
13327 addrs[len - 1] = g_malloc(18);
13330 crypto = bt_crypto_new();
13332 error("Failed to open crypto");
13337 ret = bt_crypto_random_bytes(crypto, &adapter->bdaddr,
13338 sizeof(adapter->bdaddr));
13340 error("Failed to generate static address");
13341 bt_crypto_unref(crypto);
13345 bt_crypto_unref(crypto);
13347 adapter->bdaddr.b[5] |= 0xc0;
13348 adapter->bdaddr_type = BDADDR_LE_RANDOM;
13350 ba2str(&adapter->bdaddr, addrs[len - 1]);
13352 g_key_file_set_string_list(file, "Static", mfg,
13353 (const char **)addrs, len);
13355 str = g_key_file_to_data(file, &len, NULL);
13356 g_file_set_contents(STORAGEDIR "/addresses", str, len, NULL);
13362 g_key_file_free(file);
13368 static bool set_static_addr(struct btd_adapter *adapter)
13370 struct mgmt_cp_set_static_address cp;
13372 /* dual-mode adapters must have a public address */
13373 if (adapter->supported_settings & MGMT_SETTING_BREDR)
13376 if (!(adapter->supported_settings & MGMT_SETTING_LE))
13379 DBG("Setting static address");
13381 if (!get_static_addr(adapter))
13384 bacpy(&cp.bdaddr, &adapter->bdaddr);
13385 if (mgmt_send(adapter->mgmt, MGMT_OP_SET_STATIC_ADDRESS,
13386 adapter->dev_id, sizeof(cp), &cp,
13387 NULL, NULL, NULL) > 0) {
13394 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
13395 static uint8_t *generate_irk(void)
13400 DBG("Generate IRK");
13402 fd = open("/dev/urandom", O_RDONLY);
13406 irk = g_malloc0(MGMT_IRK_SIZE);
13407 if (read(fd, irk, MGMT_IRK_SIZE) != MGMT_IRK_SIZE) {
13408 error("Cannot read random bytes");
13418 #define LOCAL_IRK_DIRNAME "/csa/bluetooth"
13419 #define LOCAL_IRK_FILENAME ".local_irk"
13421 static bool store_local_irk(struct btd_adapter *adapter)
13426 if (adapter->local_irk == NULL) {
13427 error("Local IRK is not proper");
13431 if (access(LOCAL_IRK_DIRNAME, F_OK) < 0) {
13432 if (mkdir(LOCAL_IRK_DIRNAME, 0755) < 0) {
13433 error("Cannot create a directory for local IRK : %s",
13439 fd = open(LOCAL_IRK_DIRNAME"/"LOCAL_IRK_FILENAME,
13440 O_WRONLY | O_CREAT | O_TRUNC, 0644);
13442 error("Cannot open a file for local IRK : %s", strerror(errno));
13446 ret = write(fd, adapter->local_irk, MGMT_IRK_SIZE);
13447 if (ret != MGMT_IRK_SIZE) {
13448 error("Cannot write local IRK [%d] : %s", ret, strerror(errno));
13451 unlink(LOCAL_IRK_DIRNAME"/"LOCAL_IRK_FILENAME);
13455 ret = fdatasync(fd);
13457 error("sync failed : %s", strerror(errno));
13463 static bool load_local_irk(struct btd_adapter *adapter)
13468 if (access(LOCAL_IRK_DIRNAME"/"LOCAL_IRK_FILENAME, F_OK) < 0) {
13469 adapter->local_irk = generate_irk();
13470 if (store_local_irk(adapter) == false) {
13471 error("Cannot store Local IRK");
13472 g_free(adapter->local_irk);
13479 if (adapter->local_irk) {
13480 DBG("Local IRK is already loaded");
13484 fd = open(LOCAL_IRK_DIRNAME"/"LOCAL_IRK_FILENAME, O_RDONLY);
13486 error("Cannot open local IRK file : %s", strerror(errno));
13490 adapter->local_irk = g_malloc0(MGMT_IRK_SIZE);
13492 ret = read(fd, adapter->local_irk, MGMT_IRK_SIZE);
13493 if (ret != MGMT_IRK_SIZE) {
13494 error("Cannot read local IRK [%d] : %s", ret, strerror(errno));
13495 g_free(adapter->local_irk);
13504 static void set_privacy_complete(uint8_t status, uint16_t length,
13505 const void *param, void *user_data)
13507 struct btd_adapter *adapter = user_data;
13509 if (status != MGMT_STATUS_SUCCESS)
13510 error("Setting privacy failed for hci%u: %s (0x%02x)",
13511 adapter->dev_id, mgmt_errstr(status), status);
13513 DBG("Privacy feature is set/unset successfully for hci%u",
13517 static bool set_privacy(struct btd_adapter *adapter, bool privacy)
13519 struct mgmt_cp_set_privacy cp;
13521 if (!adapter->local_irk) {
13522 error("Local IRK is not available");
13526 memset(&cp, 0, sizeof(cp));
13527 memcpy(cp.irk, adapter->local_irk, MGMT_IRK_SIZE);
13532 if (mgmt_send(adapter->mgmt, MGMT_OP_SET_PRIVACY,
13533 adapter->dev_id, sizeof(cp), &cp,
13534 set_privacy_complete, adapter, NULL) > 0)
13537 error("Failed to set privacy and load local irk for index %u",
13542 static void set_irk_complete(uint8_t status, uint16_t length,
13543 const void *param, void *user_data)
13545 struct btd_adapter *adapter = user_data;
13547 if (status != MGMT_STATUS_SUCCESS)
13548 error("Setting IRK is failed for hci%u: %s (0x%02x)",
13549 adapter->dev_id, mgmt_errstr(status), status);
13551 DBG("Setting IRK is succeed for hci%u", adapter->dev_id);
13554 static bool set_local_irk(struct btd_adapter *adapter)
13556 struct mgmt_cp_set_irk cp;
13558 if (!adapter->local_irk) {
13559 error("Local IRK is not available");
13563 memcpy(cp.irk, adapter->local_irk, MGMT_IRK_SIZE);
13565 if (mgmt_send(adapter->mgmt, MGMT_OP_SET_IRK,
13566 adapter->dev_id, sizeof(cp), &cp,
13567 set_irk_complete, adapter, NULL) > 0)
13570 error("Failed to set irk %u", adapter->dev_id);
13574 int btd_adapter_connect_ipsp(struct btd_adapter *adapter,
13575 const bdaddr_t *bdaddr,
13576 uint8_t bdaddr_type)
13579 struct mgmt_cp_connect_6lowpan cp;
13581 memset(&cp, 0, sizeof(cp));
13582 bacpy(&cp.addr.bdaddr, bdaddr);
13583 cp.addr.type = bdaddr_type;
13585 if (mgmt_send(adapter->mgmt, MGMT_OP_CONNECT_6LOWPAN,
13586 adapter->dev_id, sizeof(cp), &cp,
13587 NULL, NULL, NULL) > 0)
13593 int btd_adapter_disconnect_ipsp(struct btd_adapter *adapter,
13594 const bdaddr_t *bdaddr,
13595 uint8_t bdaddr_type)
13598 struct mgmt_cp_disconnect_6lowpan cp;
13600 memset(&cp, 0, sizeof(cp));
13601 bacpy(&cp.addr.bdaddr, bdaddr);
13602 cp.addr.type = bdaddr_type;
13604 if (mgmt_send(adapter->mgmt, MGMT_OP_DISCONNECT_6LOWPAN,
13605 adapter->dev_id, sizeof(cp), &cp,
13606 NULL, NULL, NULL) > 0)
13612 uint8_t btd_adapter_get_rpa_res_support_value(
13613 struct btd_adapter *adapter)
13615 return adapter->central_rpa_res_support;
13618 static void set_dev_rpa_res_support_complete(uint8_t status,
13619 uint16_t length, const void *param,
13622 if (status != MGMT_STATUS_SUCCESS)
13623 error("Failed to set RPA resolution support of device : %s (0x%02x)",
13624 mgmt_errstr(status), status);
13626 DBG("Set RPA resolution support successful");
13629 int btd_adapter_set_dev_rpa_res_support(struct btd_adapter *adapter,
13630 struct btd_device *device)
13633 struct mgmt_cp_set_dev_rpa_res_support cp;
13635 DBG("btd_adapter_set_dev_rpa_res_support called");
13637 memset(&cp, 0, sizeof(cp));
13639 bacpy(&cp.addr.bdaddr, device_get_address(device));
13640 cp.addr.type = btd_device_get_bdaddr_type(device);
13641 cp.res_support = device_get_rpa_res_char_value(device);
13643 if (mgmt_send(adapter->mgmt, MGMT_OP_SET_DEV_RPA_RES_SUPPORT,
13644 adapter->dev_id, sizeof(cp), &cp,
13645 set_dev_rpa_res_support_complete, NULL, NULL) > 0)
13652 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
13653 static gboolean adapter_start_idle_cb(gpointer user_data)
13655 struct btd_adapter *adapter = (struct btd_adapter*)user_data;
13657 adapter_start(adapter);
13663 static void read_info_complete(uint8_t status, uint16_t length,
13664 const void *param, void *user_data)
13666 struct btd_adapter *adapter = user_data;
13667 const struct mgmt_rp_read_info *rp = param;
13668 uint32_t missing_settings;
13671 DBG("index %u status 0x%02x", adapter->dev_id, status);
13673 if (status != MGMT_STATUS_SUCCESS) {
13674 btd_error(adapter->dev_id,
13675 "Failed to read info for index %u: %s (0x%02x)",
13676 adapter->dev_id, mgmt_errstr(status), status);
13680 if (length < sizeof(*rp)) {
13681 btd_error(adapter->dev_id,
13682 "Too small read info complete response");
13687 * Store controller information for class of device, device
13688 * name, short name and settings.
13690 * During the lifetime of the controller these will be updated by
13691 * events and the information is required to keep the current
13692 * state of the controller.
13694 adapter->dev_class = rp->dev_class[0] | (rp->dev_class[1] << 8) |
13695 (rp->dev_class[2] << 16);
13696 adapter->name = g_strdup((const char *) rp->name);
13697 adapter->short_name = g_strdup((const char *) rp->short_name);
13699 adapter->manufacturer = btohs(rp->manufacturer);
13701 adapter->supported_settings = btohl(rp->supported_settings);
13702 adapter->current_settings = btohl(rp->current_settings);
13704 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
13705 adapter_check_version(adapter, rp->version);
13708 clear_uuids(adapter);
13709 clear_devices(adapter);
13711 if (bacmp(&rp->bdaddr, BDADDR_ANY) == 0) {
13712 if (!set_static_addr(adapter)) {
13713 btd_error(adapter->dev_id,
13714 "No Bluetooth address for index %u",
13719 bacpy(&adapter->bdaddr, &rp->bdaddr);
13720 if (!(adapter->supported_settings & MGMT_SETTING_LE))
13721 adapter->bdaddr_type = BDADDR_BREDR;
13723 adapter->bdaddr_type = BDADDR_LE_PUBLIC;
13726 missing_settings = adapter->current_settings ^
13727 adapter->supported_settings;
13729 switch (main_opts.mode) {
13731 if (missing_settings & MGMT_SETTING_SSP) {
13732 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
13733 if (main_opts.pin_code)
13734 set_mode(adapter, MGMT_OP_SET_SSP, 0x00);
13737 set_mode(adapter, MGMT_OP_SET_SSP, 0x01);
13739 if (missing_settings & MGMT_SETTING_LE)
13740 set_mode(adapter, MGMT_OP_SET_LE, 0x01);
13741 if (missing_settings & MGMT_SETTING_BREDR)
13742 set_mode(adapter, MGMT_OP_SET_BREDR, 0x01);
13744 case BT_MODE_BREDR:
13745 if (!(adapter->supported_settings & MGMT_SETTING_BREDR)) {
13746 btd_error(adapter->dev_id,
13747 "Ignoring adapter withouth BR/EDR support");
13751 if (missing_settings & MGMT_SETTING_SSP)
13752 set_mode(adapter, MGMT_OP_SET_SSP, 0x01);
13753 if (missing_settings & MGMT_SETTING_BREDR)
13754 set_mode(adapter, MGMT_OP_SET_BREDR, 0x01);
13755 if (adapter->current_settings & MGMT_SETTING_LE)
13756 set_mode(adapter, MGMT_OP_SET_LE, 0x00);
13759 if (!(adapter->supported_settings & MGMT_SETTING_LE)) {
13760 btd_error(adapter->dev_id,
13761 "Ignoring adapter withouth LE support");
13765 if (missing_settings & MGMT_SETTING_LE)
13766 set_mode(adapter, MGMT_OP_SET_LE, 0x01);
13767 if (adapter->current_settings & MGMT_SETTING_BREDR)
13768 set_mode(adapter, MGMT_OP_SET_BREDR, 0x00);
13772 if (missing_settings & MGMT_SETTING_SECURE_CONN)
13773 set_mode(adapter, MGMT_OP_SET_SECURE_CONN, 0x01);
13775 if (adapter->supported_settings & MGMT_SETTING_PRIVACY)
13776 set_privacy(adapter, main_opts.privacy);
13778 if (main_opts.fast_conn &&
13779 (missing_settings & MGMT_SETTING_FAST_CONNECTABLE))
13780 set_mode(adapter, MGMT_OP_SET_FAST_CONNECTABLE, 0x01);
13782 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
13783 /* Set the RPA resolution value to '1' if privacy is supported */
13784 if (main_opts.le_privacy &&
13785 adapter->supported_settings & MGMT_SETTING_PRIVACY)
13786 adapter->central_rpa_res_support = 0x01;
13789 err = adapter_register(adapter);
13791 btd_error(adapter->dev_id, "Unable to register new adapter");
13796 * Register all event notification handlers for controller.
13798 * The handlers are registered after a succcesful read of the
13799 * controller info. From now on they can track updates and
13802 mgmt_register(adapter->mgmt, MGMT_EV_NEW_SETTINGS, adapter->dev_id,
13803 new_settings_callback, adapter, NULL);
13805 mgmt_register(adapter->mgmt, MGMT_EV_CLASS_OF_DEV_CHANGED,
13807 dev_class_changed_callback,
13809 mgmt_register(adapter->mgmt, MGMT_EV_LOCAL_NAME_CHANGED,
13811 local_name_changed_callback,
13814 mgmt_register(adapter->mgmt, MGMT_EV_DISCOVERING,
13816 discovering_callback,
13819 mgmt_register(adapter->mgmt, MGMT_EV_DEVICE_FOUND,
13821 device_found_callback,
13824 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
13825 mgmt_register(adapter->mgmt, MGMT_EV_LE_DEVICE_FOUND,
13827 le_device_found_callback,
13831 mgmt_register(adapter->mgmt, MGMT_EV_DEVICE_DISCONNECTED,
13833 disconnected_callback,
13836 mgmt_register(adapter->mgmt, MGMT_EV_DEVICE_CONNECTED,
13838 connected_callback,
13841 mgmt_register(adapter->mgmt, MGMT_EV_CONNECT_FAILED,
13843 connect_failed_callback,
13846 mgmt_register(adapter->mgmt, MGMT_EV_DEVICE_UNPAIRED,
13851 mgmt_register(adapter->mgmt, MGMT_EV_AUTH_FAILED,
13853 auth_failed_callback,
13856 mgmt_register(adapter->mgmt, MGMT_EV_NEW_LINK_KEY,
13858 new_link_key_callback,
13861 mgmt_register(adapter->mgmt, MGMT_EV_NEW_LONG_TERM_KEY,
13863 new_long_term_key_callback,
13866 mgmt_register(adapter->mgmt, MGMT_EV_NEW_CSRK,
13871 mgmt_register(adapter->mgmt, MGMT_EV_NEW_IRK,
13876 mgmt_register(adapter->mgmt, MGMT_EV_NEW_CONN_PARAM,
13881 mgmt_register(adapter->mgmt, MGMT_EV_DEVICE_BLOCKED,
13883 device_blocked_callback,
13885 mgmt_register(adapter->mgmt, MGMT_EV_DEVICE_UNBLOCKED,
13887 device_unblocked_callback,
13890 mgmt_register(adapter->mgmt, MGMT_EV_PIN_CODE_REQUEST,
13892 pin_code_request_callback,
13895 mgmt_register(adapter->mgmt, MGMT_EV_USER_CONFIRM_REQUEST,
13897 user_confirm_request_callback,
13900 mgmt_register(adapter->mgmt, MGMT_EV_USER_PASSKEY_REQUEST,
13902 user_passkey_request_callback,
13905 mgmt_register(adapter->mgmt, MGMT_EV_PASSKEY_NOTIFY,
13907 user_passkey_notify_callback,
13910 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
13911 mgmt_register(adapter->mgmt, MGMT_EV_RSSI_ALERT,
13913 rssi_alert_callback,
13916 mgmt_register(adapter->mgmt, MGMT_EV_RAW_RSSI,
13918 get_raw_rssi_callback,
13921 mgmt_register(adapter->mgmt, MGMT_EV_RSSI_ENABLED,
13923 rssi_enabled_callback,
13926 mgmt_register(adapter->mgmt, MGMT_EV_RSSI_DISABLED,
13928 rssi_disabled_callback,
13931 mgmt_register(adapter->mgmt, MGMT_EV_HARDWARE_ERROR,
13933 hardware_error_callback,
13936 mgmt_register(adapter->mgmt, MGMT_EV_TX_TIMEOUT_ERROR,
13938 tx_timeout_error_callback,
13941 mgmt_register(adapter->mgmt, MGMT_EV_DEVICE_NAME_UPDATE,
13943 device_name_update_callback,
13946 mgmt_register(adapter->mgmt, MGMT_EV_MULTI_ADV_STATE_CHANGED,
13948 multi_adv_state_change_callback,
13951 mgmt_register(adapter->mgmt, MGMT_EV_6LOWPAN_CONN_STATE_CHANGED,
13953 bt_6lowpan_conn_state_change_callback,
13956 mgmt_register(adapter->mgmt, MGMT_EV_LE_DATA_LENGTH_CHANGED,
13958 bt_le_data_length_changed_callback,
13961 mgmt_register(adapter->mgmt, MGMT_EV_CONN_UPDATED,
13963 le_conn_update_completed_callback,
13967 set_dev_class(adapter);
13969 set_name(adapter, btd_adapter_get_name(adapter));
13971 if (!(adapter->current_settings & MGMT_SETTING_BONDABLE))
13972 set_mode(adapter, MGMT_OP_SET_BONDABLE, 0x01);
13974 if (!kernel_conn_control)
13975 set_mode(adapter, MGMT_OP_SET_CONNECTABLE, 0x01);
13976 else if (adapter->current_settings & MGMT_SETTING_CONNECTABLE)
13977 set_mode(adapter, MGMT_OP_SET_CONNECTABLE, 0x00);
13979 if (adapter->stored_discoverable && !adapter->discoverable_timeout)
13980 set_discoverable(adapter, 0x01, 0);
13982 if (adapter->current_settings & MGMT_SETTING_POWERED)
13983 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
13984 g_idle_add(adapter_start_idle_cb, adapter);
13986 adapter_start(adapter);
13988 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
13990 set_mode(adapter, MGMT_OP_SET_POWERED, 0x01);
13997 * Remove adapter from list in case of a failure.
13999 * Leaving an adapter structure around for a controller that can
14000 * not be initilized makes no sense at the moment.
14002 * This is a simplification to avoid constant checks if the
14003 * adapter is ready to do anything.
14005 adapter_list = g_list_remove(adapter_list, adapter);
14007 btd_adapter_unref(adapter);
14010 static void index_added(uint16_t index, uint16_t length, const void *param,
14013 struct btd_adapter *adapter;
14015 DBG("index %u", index);
14017 adapter = btd_adapter_lookup(index);
14019 btd_warn(adapter->dev_id,
14020 "Ignoring index added for an already existing adapter");
14024 adapter = btd_adapter_new(index);
14027 "Unable to create new adapter for index %u", index);
14032 * Protect against potential two executions of read controller info.
14034 * In case the start of the daemon and the action of adding a new
14035 * controller coincide this function might be called twice.
14037 * To avoid the double execution of reading the controller info,
14038 * add the adapter already to the list. If an adapter is already
14039 * present, the second notification will cause a warning. If the
14040 * command fails the adapter is removed from the list again.
14042 adapter_list = g_list_append(adapter_list, adapter);
14044 DBG("sending read info command for index %u", index);
14046 if (mgmt_send(mgmt_master, MGMT_OP_READ_INFO, index, 0, NULL,
14047 read_info_complete, adapter, NULL) > 0)
14050 btd_error(adapter->dev_id,
14051 "Failed to read controller info for index %u", index);
14053 adapter_list = g_list_remove(adapter_list, adapter);
14055 btd_adapter_unref(adapter);
14058 static void index_removed(uint16_t index, uint16_t length, const void *param,
14061 struct btd_adapter *adapter;
14063 DBG("index %u", index);
14065 adapter = btd_adapter_lookup(index);
14067 warn("Ignoring index removal for a non-existent adapter");
14071 adapter_unregister(adapter);
14074 static void read_index_list_complete(uint8_t status, uint16_t length,
14075 const void *param, void *user_data)
14077 const struct mgmt_rp_read_index_list *rp = param;
14081 if (status != MGMT_STATUS_SUCCESS) {
14082 error("Failed to read index list: %s (0x%02x)",
14083 mgmt_errstr(status), status);
14087 if (length < sizeof(*rp)) {
14088 error("Wrong size of read index list response");
14092 num = btohs(rp->num_controllers);
14094 DBG("Number of controllers: %d", num);
14096 if (num * sizeof(uint16_t) + sizeof(*rp) != length) {
14097 error("Incorrect packet size for index list response");
14101 for (i = 0; i < num; i++) {
14104 index = btohs(rp->index[i]);
14106 DBG("Found index %u", index);
14109 * Pretend to be index added event notification.
14111 * It is safe to just trigger the procedure for index
14112 * added notification. It does check against itself.
14114 index_added(index, 0, NULL, NULL);
14118 static void read_commands_complete(uint8_t status, uint16_t length,
14119 const void *param, void *user_data)
14121 const struct mgmt_rp_read_commands *rp = param;
14122 uint16_t num_commands, num_events;
14123 const uint16_t *opcode;
14124 size_t expected_len;
14127 if (status != MGMT_STATUS_SUCCESS) {
14128 error("Failed to read supported commands: %s (0x%02x)",
14129 mgmt_errstr(status), status);
14133 if (length < sizeof(*rp)) {
14134 error("Wrong size of read commands response");
14138 num_commands = btohs(rp->num_commands);
14139 num_events = btohs(rp->num_events);
14141 DBG("Number of commands: %d", num_commands);
14142 DBG("Number of events: %d", num_events);
14144 expected_len = sizeof(*rp) + num_commands * sizeof(uint16_t) +
14145 num_events * sizeof(uint16_t);
14147 if (length < expected_len) {
14148 error("Too small reply for supported commands: (%u != %zu)",
14149 length, expected_len);
14153 opcode = rp->opcodes;
14155 for (i = 0; i < num_commands; i++) {
14156 uint16_t op = get_le16(opcode++);
14158 if (op == MGMT_OP_ADD_DEVICE) {
14159 DBG("enabling kernel-side connection control");
14160 kernel_conn_control = true;
14165 static void read_version_complete(uint8_t status, uint16_t length,
14166 const void *param, void *user_data)
14168 const struct mgmt_rp_read_version *rp = param;
14170 if (status != MGMT_STATUS_SUCCESS) {
14171 error("Failed to read version information: %s (0x%02x)",
14172 mgmt_errstr(status), status);
14176 if (length < sizeof(*rp)) {
14177 error("Wrong size of read version response");
14181 mgmt_version = rp->version;
14182 mgmt_revision = btohs(rp->revision);
14184 info("Bluetooth management interface %u.%u initialized",
14185 mgmt_version, mgmt_revision);
14187 if (mgmt_version < 1) {
14188 error("Version 1.0 or later of management interface required");
14192 DBG("sending read supported commands command");
14195 * It is irrelevant if this command succeeds or fails. In case of
14196 * failure safe settings are assumed.
14198 mgmt_send(mgmt_master, MGMT_OP_READ_COMMANDS,
14199 MGMT_INDEX_NONE, 0, NULL,
14200 read_commands_complete, NULL, NULL);
14202 mgmt_register(mgmt_master, MGMT_EV_INDEX_ADDED, MGMT_INDEX_NONE,
14203 index_added, NULL, NULL);
14204 mgmt_register(mgmt_master, MGMT_EV_INDEX_REMOVED, MGMT_INDEX_NONE,
14205 index_removed, NULL, NULL);
14207 DBG("sending read index list command");
14209 if (mgmt_send(mgmt_master, MGMT_OP_READ_INDEX_LIST,
14210 MGMT_INDEX_NONE, 0, NULL,
14211 read_index_list_complete, NULL, NULL) > 0)
14214 error("Failed to read controller index list");
14217 static void mgmt_debug(const char *str, void *user_data)
14219 const char *prefix = user_data;
14221 info("%s%s", prefix, str);
14224 int adapter_init(void)
14226 dbus_conn = btd_get_dbus_connection();
14228 mgmt_master = mgmt_new_default();
14229 if (!mgmt_master) {
14230 error("Failed to access management interface");
14234 if (getenv("MGMT_DEBUG"))
14235 mgmt_set_debug(mgmt_master, mgmt_debug, "mgmt: ", NULL);
14237 DBG("sending read version command");
14239 if (mgmt_send(mgmt_master, MGMT_OP_READ_VERSION,
14240 MGMT_INDEX_NONE, 0, NULL,
14241 read_version_complete, NULL, NULL) > 0)
14244 error("Failed to read management version information");
14249 void adapter_cleanup(void)
14251 g_list_free(adapter_list);
14254 struct btd_adapter *adapter = adapters->data;
14256 adapter_remove(adapter);
14257 adapters = g_slist_remove(adapters, adapter);
14258 btd_adapter_unref(adapter);
14262 * In case there is another reference active, clear out
14263 * registered handlers for index added and index removed.
14265 * This is just an extra precaution to be safe, and in
14266 * reality should not make a difference.
14268 mgmt_unregister_index(mgmt_master, MGMT_INDEX_NONE);
14271 * In case there is another reference active, cancel
14272 * all pending global commands.
14274 * This is just an extra precaution to avoid callbacks
14275 * that potentially then could leak memory or access
14276 * an invalid structure.
14278 mgmt_cancel_index(mgmt_master, MGMT_INDEX_NONE);
14280 mgmt_unref(mgmt_master);
14281 mgmt_master = NULL;
14286 void adapter_shutdown(void)
14292 powering_down = true;
14294 for (list = g_list_first(adapter_list); list;
14295 list = g_list_next(list)) {
14296 struct btd_adapter *adapter = list->data;
14298 if (!(adapter->current_settings & MGMT_SETTING_POWERED))
14301 set_mode(adapter, MGMT_OP_SET_POWERED, 0x00);
14303 adapter_remaining++;
14306 if (!adapter_remaining)
14311 * Check if workaround for broken ATT server socket behavior is needed
14312 * where we need to connect an ATT client socket before pairing to get
14313 * early access to the ATT channel.
14315 bool btd_le_connect_before_pairing(void)
14317 if (MGMT_VERSION(mgmt_version, mgmt_revision) < MGMT_VERSION(1, 4))
14323 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
14324 int btd_adapter_set_streaming_mode(struct btd_adapter *adapter,
14325 const bdaddr_t *bdaddr, gboolean enable)
14327 struct mgmt_cp_set_streaming_mode cp;
14330 ba2str(bdaddr, addr);
14331 DBG("hci%u device %s", adapter->dev_id, addr);
14333 memset(&cp, 0, sizeof(cp));
14335 cp.streaming_mode = enable ? 1 : 0;
14336 bacpy(&cp.bdaddr, bdaddr);
14338 if (mgmt_send(adapter->mgmt, MGMT_OP_SET_STREAMING_MODE,
14339 adapter->dev_id, sizeof(cp), &cp,
14340 NULL, NULL, NULL) > 0)