1 // SPDX-License-Identifier: GPL-2.0-or-later
4 * BlueZ - Bluetooth protocol stack for Linux
6 * Copyright (C) 2006-2010 Nokia Corporation
7 * Copyright (C) 2004-2010 Marcel Holtmann <marcel@holtmann.org>
22 #include <sys/ioctl.h>
28 #include <dbus/dbus.h>
30 #include "bluetooth/bluetooth.h"
31 #include "bluetooth/hci.h"
32 #include "bluetooth/hci_lib.h"
33 #include "bluetooth/sdp.h"
34 #include "bluetooth/sdp_lib.h"
38 #include "gdbus/gdbus.h"
43 #include "src/shared/mgmt.h"
44 #include "src/shared/util.h"
45 #include "src/shared/queue.h"
46 #include "src/shared/att.h"
47 #include "src/shared/gatt-db.h"
48 #include "src/shared/timeout.h"
50 #include "btio/btio.h"
56 #include "dbus-common.h"
58 #include "uuid-helper.h"
61 #include "attrib/gattrib.h"
62 #include "attrib/att.h"
63 #include "attrib/gatt.h"
64 #include "attrib-server.h"
65 #include "gatt-database.h"
66 #include "advertising.h"
67 #include "adv_monitor.h"
71 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
73 #include "adapter_le_vsc_features.h"
74 #include "../profile.h"
77 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
78 #ifdef TIZEN_FEATURE_BLUEZ_BATTERY_WATCH
79 #define DEVICED_DEST "org.tizen.system.deviced"
80 #define DEVICED_BATT_INTERFACE "org.tizen.system.deviced.Battery"
81 #define DEVICED_BATT_OBJECT_PATH "/Org/Tizen/System/DeviceD/Battery"
82 #endif /* TIZEN_FEATURE_BLUEZ_BATTERY_WATCH */
86 #define MODE_CONNECTABLE 0x01
87 #define MODE_DISCOVERABLE 0x02
88 #define MODE_UNKNOWN 0xff
90 #define CONN_SCAN_TIMEOUT (3)
91 #define IDLE_DISCOV_TIMEOUT (5)
92 #define TEMP_DEV_TIMEOUT (3 * 60)
93 #define BONDING_TIMEOUT (2 * 60)
95 #define SCAN_TYPE_BREDR (1 << BDADDR_BREDR)
96 #define SCAN_TYPE_LE ((1 << BDADDR_LE_PUBLIC) | (1 << BDADDR_LE_RANDOM))
97 #define SCAN_TYPE_DUAL (SCAN_TYPE_BREDR | SCAN_TYPE_LE)
98 #define SETTING_PRIVACY_MASK (1<<13)
100 #define HCI_RSSI_INVALID 127
101 #define DISTANCE_VAL_INVALID 0x7FFF
102 #define PATHLOSS_MAX 137
105 * These are known security keys that have been compromised.
106 * If this grows or there are needs to be platform specific, it is
107 * conceivable that these could be read from a config file.
109 static const struct mgmt_blocked_key_info blocked_keys[] = {
110 /* Google Titan Security Keys */
111 { HCI_BLOCKED_KEY_TYPE_LTK,
112 {0xbf, 0x01, 0xfb, 0x9d, 0x4e, 0xf3, 0xbc, 0x36,
113 0xd8, 0x74, 0xf5, 0x39, 0x41, 0x38, 0x68, 0x4c}},
114 { HCI_BLOCKED_KEY_TYPE_IRK,
115 {0xa5, 0x99, 0xba, 0xe4, 0xe1, 0x7c, 0xa6, 0x18,
116 0x22, 0x8e, 0x07, 0x56, 0xb4, 0xe8, 0x5f, 0x01}},
119 struct mgmt_exp_uuid {
124 /* d4992530-b9ec-469f-ab01-6c481c47da1c */
125 static const struct mgmt_exp_uuid debug_uuid = {
126 .val = { 0x1c, 0xda, 0x47, 0x1c, 0x48, 0x6c, 0x01, 0xab,
127 0x9f, 0x46, 0xec, 0xb9, 0x30, 0x25, 0x99, 0xd4 },
128 .str = "d4992530-b9ec-469f-ab01-6c481c47da1c"
131 /* 671b10b5-42c0-4696-9227-eb28d1b049d6 */
132 static const struct mgmt_exp_uuid le_simult_central_peripheral_uuid = {
133 .val = { 0xd6, 0x49, 0xb0, 0xd1, 0x28, 0xeb, 0x27, 0x92,
134 0x96, 0x46, 0xc0, 0x42, 0xb5, 0x10, 0x1b, 0x67 },
135 .str = "671b10b5-42c0-4696-9227-eb28d1b049d6"
138 /* 330859bc-7506-492d-9370-9a6f0614037f */
139 static const struct mgmt_exp_uuid quality_report_uuid = {
140 .val = { 0x7f, 0x03, 0x14, 0x06, 0x6f, 0x9a, 0x70, 0x93,
141 0x2d, 0x49, 0x06, 0x75, 0xbc, 0x59, 0x08, 0x33 },
142 .str = "330859bc-7506-492d-9370-9a6f0614037f"
145 /* 15c0a148-c273-11ea-b3de-0242ac130004 */
146 static const struct mgmt_exp_uuid rpa_resolution_uuid = {
147 .val = { 0x04, 0x00, 0x13, 0xac, 0x42, 0x02, 0xde, 0xb3,
148 0xea, 0x11, 0x73, 0xc2, 0x48, 0xa1, 0xc0, 0x15 },
149 .str = "15c0a148-c273-11ea-b3de-0242ac130004"
152 /* a6695ace-ee7f-4fb9-881a-5fac66c629af */
153 static const struct mgmt_exp_uuid codec_offload_uuid = {
154 .val = { 0xaf, 0x29, 0xc6, 0x66, 0xac, 0x5f, 0x1a, 0x88,
155 0xb9, 0x4f, 0x7f, 0xee, 0xce, 0x5a, 0x69, 0xa6 },
156 .str = "a6695ace-ee7f-4fb9-881a-5fac66c629af"
159 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
160 #define ADV_DATA_MAX_LENGTH 31
161 #define SCAN_RESPONSE_DATA_LENGTH_MAX 31
162 #define EIR_MANUFACTURER_DATA_LENGTH_MAX 100
164 #define LE_BEARER_POSTFIX " LE"
165 #define LE_BEARER_POSTFIX_LEN 3
166 #endif /* TIZEN_FEATURE_BLUEZ_MODIFY */
169 static DBusConnection *dbus_conn = NULL;
171 static uint32_t kernel_features = 0;
173 static GList *adapter_list = NULL;
174 static unsigned int adapter_remaining = 0;
175 static bool powering_down = false;
177 static GSList *adapters = NULL;
179 static struct mgmt *mgmt_primary = NULL;
181 static uint8_t mgmt_version = 0;
182 static uint8_t mgmt_revision = 0;
184 static GSList *adapter_drivers = NULL;
186 static GSList *disconnect_list = NULL;
187 static GSList *conn_fail_list = NULL;
189 struct link_key_info {
191 unsigned char key[16];
197 struct smp_ltk_info {
200 uint8_t authenticated;
219 uint16_t min_interval;
220 uint16_t max_interval;
225 struct discovery_filter {
235 struct discovery_client {
236 struct btd_adapter *adapter;
240 struct discovery_filter *discovery_filter;
243 struct service_auth {
249 struct btd_device *device;
250 struct btd_adapter *adapter;
251 struct agent *agent; /* NULL for queued auths */
254 struct btd_adapter_pin_cb_iter {
255 GSList *it; /* current callback function */
256 unsigned int attempt; /* numer of times it() was called */
257 /* When the iterator reaches the end, it is NULL and attempt is 0 */
260 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
262 int slot_id; /* Reservied slot id is 0 (Single adv) */
263 bool status; /* Advertising status */
266 static GSList *read_requests = NULL;
268 struct le_data_length_read_request {
269 struct btd_adapter *adapter;
273 struct le_batching_request {
274 struct btd_adapter *adapter;
278 struct le_batching_set_param_request {
279 struct btd_adapter *adapter;
291 bdaddr_t bdaddr; /* controller Bluetooth address */
292 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
293 bdaddr_t le_static_addr;
296 uint8_t bdaddr_type; /* address type */
297 uint32_t dev_class; /* controller class of device */
298 char *name; /* controller device name */
299 char *short_name; /* controller short name */
300 uint32_t supported_settings; /* controller supported settings */
301 uint32_t pending_settings; /* pending controller settings */
302 uint32_t current_settings; /* current controller settings */
304 char *path; /* adapter object path */
305 uint16_t manufacturer; /* adapter manufacturer */
306 uint8_t major_class; /* configured major class */
307 uint8_t minor_class; /* configured minor class */
308 char *system_name; /* configured system name */
309 char *modalias; /* device id (modalias) */
310 bool stored_discoverable; /* stored discoverable mode */
311 uint32_t discoverable_timeout; /* discoverable time(sec) */
312 uint32_t pairable_timeout; /* pairable time(sec) */
314 char *current_alias; /* current adapter name alias */
315 char *stored_alias; /* stored adapter name alias */
316 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
317 uint8_t *local_irk; /* adapter local IRK */
319 bool ipsp_intialized; /* Ipsp Initialization state */
320 struct le_data_length_read_handler *read_handler;
321 struct le_data_length_read_default_data_length_handler *def_read_handler;
322 #ifdef TIZEN_FEATURE_BLUEZ_BATTERY_WATCH
323 guint charging_watch;
324 guint charging_timeout;
325 charging_state_e charging;
326 #endif /* TIZEN_FEATURE_BLUEZ_BATTERY_WATCH */
329 bool discovering; /* discovering property state */
330 bool filtered_discovery; /* we are doing filtered discovery */
331 bool no_scan_restart_delay; /* when this flag is set, restart scan
333 uint8_t discovery_type; /* current active discovery type */
334 uint8_t discovery_enable; /* discovery enabled/disabled */
335 bool discovery_suspended; /* discovery has been suspended */
336 bool discovery_discoverable; /* discoverable while discovering */
337 GSList *discovery_list; /* list of discovery clients */
338 GSList *set_filter_list; /* list of clients that specified
339 * filter, but don't scan yet
341 /* current discovery filter, if any */
342 struct mgmt_cp_start_service_discovery *current_discovery_filter;
344 struct discovery_client *client; /* active discovery client */
346 GSList *discovery_found; /* list of found devices */
347 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
348 guint le_discovery_idle_timeout; /* timeout between le discovery runs */
350 unsigned int discovery_idle_timeout; /* timeout between discovery
353 unsigned int passive_scan_timeout; /* timeout between passive scans */
355 unsigned int pairable_timeout_id; /* pairable timeout id */
356 guint auth_idle_id; /* Pending authorization dequeue */
357 GQueue *auths; /* Ongoing and pending auths */
358 bool pincode_requested; /* PIN requested during last bonding */
359 GSList *connections; /* Connected devices */
360 GSList *devices; /* Devices structure pointers */
361 GSList *connect_list; /* Devices to connect when found */
362 struct btd_device *connect_le; /* LE device waiting to be connected */
363 sdp_list_t *services; /* Services associated to adapter */
365 struct btd_gatt_database *database;
366 struct btd_adv_manager *adv_manager;
368 struct btd_adv_monitor_manager *adv_monitor_manager;
370 struct btd_battery_provider_manager *battery_provider_manager;
371 GHashTable *allowed_uuid_set; /* Set of allowed service UUIDs */
373 gboolean initialized;
374 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
375 GSList *adv_list; /* List of advertising instance */
376 bool advertising; /* Advertising active */
377 gchar *version; /* Bluetooth Version */
378 uint8_t adv_tx_power;
379 guint adv_restart_timeout;
380 bool le_discovering; /* LE Discovery active */
381 GSList *le_discovery_list; /* list of LE discovery clients */
384 GSList *pin_callbacks;
385 GSList *msd_callbacks;
390 struct oob_handler *oob_handler;
392 unsigned int load_ltks_id;
393 unsigned int load_ltks_timeout;
395 unsigned int confirm_name_id;
396 unsigned int confirm_name_timeout;
398 unsigned int pair_device_id;
399 unsigned int pair_device_timeout;
401 unsigned int db_id; /* Service event handler for GATT db */
402 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
403 uint8_t central_rpa_res_support;
404 bluetooth_a2dp_role_t a2dp_role;
405 #ifdef TIZEN_FEATURE_PLATFROM_SCAN_FILTER
406 bool scan_filter_support; /* platform's scan filtering support */
407 uint8_t scan_type; /* scan type */
408 GSList *scan_params; /* scan filter parameters */
409 GSList *addr_filters; /* adress scan filters list */
410 GSList *service_data_changed_filters; /* service data changed scan filters list */
411 GSList *service_uuid_filters; /* service uuid scan filters list */
412 GSList *solicit_data_filters; /* solicitation data scan filters list */
413 GSList *local_name_filters; /* local name scan filters list */
414 GSList *manufaturer_data_filters; /* manufacturer data scan filters list */
415 GSList *service_data_filters; /* service data scan filters list */
418 bool is_default; /* true if adapter is default one */
421 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
422 bool le_2m_phy_supported;
423 bool le_coded_phy_supported;
424 guint le_batching_available_pkts;
429 ADAPTER_AUTHORIZE_DISCONNECTED = 0,
430 ADAPTER_AUTHORIZE_CHECK_CONNECTED
431 } adapter_authorize_type;
433 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
440 static struct btd_adapter *btd_adapter_lookup(uint16_t index)
444 for (list = g_list_first(adapter_list); list;
445 list = g_list_next(list)) {
446 struct btd_adapter *adapter = list->data;
448 if (adapter->dev_id == index)
455 struct btd_adapter *btd_adapter_get_default(void)
459 for (list = g_list_first(adapter_list); list;
460 list = g_list_next(list)) {
461 struct btd_adapter *adapter = list->data;
463 if (adapter->is_default)
470 bool btd_adapter_is_default(struct btd_adapter *adapter)
475 return adapter->is_default;
478 uint16_t btd_adapter_get_index(struct btd_adapter *adapter)
481 return MGMT_INDEX_NONE;
483 return adapter->dev_id;
486 static gboolean process_auth_queue(gpointer user_data);
488 static void dev_class_changed_callback(uint16_t index, uint16_t length,
489 const void *param, void *user_data)
491 struct btd_adapter *adapter = user_data;
492 const struct mgmt_cod *rp = param;
495 if (length < sizeof(*rp)) {
496 btd_error(adapter->dev_id,
497 "Wrong size of class of device changed parameters");
501 dev_class = rp->val[0] | (rp->val[1] << 8) | (rp->val[2] << 16);
503 if (dev_class == adapter->dev_class)
506 DBG("Class: 0x%06x", dev_class);
508 adapter->dev_class = dev_class;
510 g_dbus_emit_property_changed(dbus_conn, adapter->path,
511 ADAPTER_INTERFACE, "Class");
514 static void set_dev_class_complete(uint8_t status, uint16_t length,
515 const void *param, void *user_data)
517 struct btd_adapter *adapter = user_data;
519 if (status != MGMT_STATUS_SUCCESS) {
520 btd_error(adapter->dev_id,
521 "Failed to set device class: %s (0x%02x)",
522 mgmt_errstr(status), status);
527 * The parameters are identical and also the task that is
528 * required in both cases. So it is safe to just call the
529 * event handling functions here.
531 dev_class_changed_callback(adapter->dev_id, length, param, adapter);
534 static void set_dev_class(struct btd_adapter *adapter)
536 struct mgmt_cp_set_dev_class cp;
539 * If the controller does not support BR/EDR operation,
540 * there is no point in trying to set a major and minor
543 * This is an optimization for Low Energy only controllers.
545 if (!(adapter->supported_settings & MGMT_SETTING_BREDR))
548 memset(&cp, 0, sizeof(cp));
551 * Silly workaround for a really stupid kernel bug :(
553 * All current kernel versions assign the major and minor numbers
554 * straight to dev_class[0] and dev_class[1] without considering
555 * the proper bit shifting.
557 * To make this work, shift the value in userspace for now until
558 * we get a fixed kernel version.
560 cp.major = adapter->major_class & 0x1f;
561 cp.minor = adapter->minor_class << 2;
563 DBG("sending set device class command for index %u", adapter->dev_id);
565 if (mgmt_send(adapter->mgmt, MGMT_OP_SET_DEV_CLASS,
566 adapter->dev_id, sizeof(cp), &cp,
567 set_dev_class_complete, adapter, NULL) > 0)
570 btd_error(adapter->dev_id,
571 "Failed to set class of device for index %u", adapter->dev_id);
574 void btd_adapter_set_class(struct btd_adapter *adapter, uint8_t major,
577 if (adapter->major_class == major && adapter->minor_class == minor)
580 DBG("class: major %u minor %u", major, minor);
582 adapter->major_class = major;
583 adapter->minor_class = minor;
585 set_dev_class(adapter);
588 static uint8_t get_mode(const char *mode)
590 if (strcasecmp("off", mode) == 0)
592 else if (strcasecmp("connectable", mode) == 0)
593 return MODE_CONNECTABLE;
594 else if (strcasecmp("discoverable", mode) == 0)
595 return MODE_DISCOVERABLE;
600 const char *btd_adapter_get_storage_dir(struct btd_adapter *adapter)
604 if (adapter->bdaddr_type == BDADDR_LE_RANDOM) {
605 strcpy(dir, "static-");
606 ba2str(&adapter->bdaddr, dir + 7);
608 ba2str(&adapter->bdaddr, dir);
614 uint8_t btd_adapter_get_address_type(struct btd_adapter *adapter)
616 return adapter->bdaddr_type;
619 static void store_adapter_info(struct btd_adapter *adapter)
623 char filename[PATH_MAX];
626 gboolean discoverable;
628 key_file = g_key_file_new();
630 if (adapter->pairable_timeout != btd_opts.pairto)
631 g_key_file_set_integer(key_file, "General", "PairableTimeout",
632 adapter->pairable_timeout);
634 if ((adapter->current_settings & MGMT_SETTING_DISCOVERABLE) &&
635 !adapter->discoverable_timeout)
638 discoverable = FALSE;
640 g_key_file_set_boolean(key_file, "General", "Discoverable",
643 if (adapter->discoverable_timeout != btd_opts.discovto)
644 g_key_file_set_integer(key_file, "General",
645 "DiscoverableTimeout",
646 adapter->discoverable_timeout);
648 if (adapter->stored_alias)
649 g_key_file_set_string(key_file, "General", "Alias",
650 adapter->stored_alias);
651 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
652 /* Store A2DP Role */
653 if (adapter->a2dp_role == BLUETOOTH_A2DP_SINK_ROLE)
654 g_key_file_set_string(key_file, "General", "DefaultA2DPRole", "sink");
656 g_key_file_set_string(key_file, "General", "DefaultA2DPRole", "source");
659 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/settings",
660 btd_adapter_get_storage_dir(adapter));
662 create_file(filename, 0600);
664 str = g_key_file_to_data(key_file, &length, NULL);
665 if (!g_file_set_contents(filename, str, length, &gerr)) {
666 error("Unable set contents for %s: (%s)", filename,
672 g_key_file_free(key_file);
675 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
676 bluetooth_a2dp_role_t btd_adapter_get_a2dp_role(struct btd_adapter *adapter)
679 return BLUETOOTH_A2DP_SOURCE_ROLE;
681 return adapter->a2dp_role;
684 void btd_adapter_set_a2dp_role(struct btd_adapter *adapter, bluetooth_a2dp_role_t role)
687 DBG("Could not set a2dp role");
691 if (role == BLUETOOTH_A2DP_SOURCE_ROLE) {
692 DBG("Set audio source role");
693 adapter->a2dp_role = BLUETOOTH_A2DP_SOURCE_ROLE;
694 } else if (role == BLUETOOTH_A2DP_SINK_ROLE) {
695 DBG("Set audio sink role");
696 adapter->a2dp_role = BLUETOOTH_A2DP_SINK_ROLE;
699 store_adapter_info(adapter);
702 void btd_adapter_emit_a2dp_role_changed(struct btd_adapter *adapter)
705 DBG("Could not emit signal for a2dp role");
709 DBG("A2dp role: %u", adapter->a2dp_role);
711 g_dbus_emit_property_changed(dbus_conn, adapter->path,
712 ADAPTER_INTERFACE, "A2dpRole");
716 static void trigger_pairable_timeout(struct btd_adapter *adapter);
717 static void adapter_start(struct btd_adapter *adapter);
718 static void adapter_stop(struct btd_adapter *adapter);
719 static void trigger_passive_scanning(struct btd_adapter *adapter);
720 static bool set_mode(struct btd_adapter *adapter, uint16_t opcode,
722 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
723 static bool load_local_irk(struct btd_adapter *adapter);
724 static bool set_local_irk(struct btd_adapter *adapter);
725 static bool set_privacy(struct btd_adapter *adapter, bool privacy);
728 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
729 #ifdef TIZEN_FEATURE_BLUEZ_BATTERY_WATCH
730 static gboolean charging_state_timeout_cb(gpointer user_data)
732 struct btd_adapter *adapter = user_data;
733 int bredr_pkt_type = ACL_PTYPE_MASK;
735 adapter->charging_timeout = 0;
737 DBG("Set all connections to BR/EDR type");
738 g_slist_foreach(adapter->devices, device_change_pkt_type,
739 (gpointer)bredr_pkt_type);
744 static void set_charging_state(struct btd_adapter *adapter,
745 charging_state_e state)
747 int br_pkt_type = ACL_PTYPE_MASK |
748 HCI_2DH1 | HCI_2DH3 | HCI_2DH5 |
749 HCI_3DH1 | HCI_3DH3 | HCI_3DH5;
751 if (adapter->charging == state)
754 DBG("old charging state : %d, new charging_state : %d",
755 adapter->charging, state);
758 * Only none / wire charging <-> wireless charging state change should
761 if ((adapter->charging == NONE_CHARGING && state == WIRE_CHARGING) ||
762 (adapter->charging == WIRE_CHARGING && state == NONE_CHARGING)) {
763 DBG("Just update charging state");
764 adapter->charging = state;
768 if (adapter->charging_timeout) {
769 g_source_remove(adapter->charging_timeout);
770 adapter->charging_timeout = 0;
773 adapter->charging = state;
774 if (adapter->charging == NONE_CHARGING ||
775 adapter->charging == WIRE_CHARGING) {
776 DBG("Trigger timeout to set connection to BR/EDR type");
777 adapter->charging_timeout = g_timeout_add(2000,
778 charging_state_timeout_cb, adapter);
779 } else if (adapter->charging == WIRELESS_CHARGING) {
780 DBG("Set all connections to BR type");
781 g_slist_foreach(adapter->devices, device_change_pkt_type,
782 (gpointer)br_pkt_type);
788 static gboolean charging_state_changed(DBusConnection *connection,
789 DBusMessage *msg, void *user_data)
791 struct btd_adapter *adapter = user_data;
794 DBG("charging_state_changed");
796 if (!dbus_message_get_args(msg, NULL, DBUS_TYPE_INT32, &state,
800 set_charging_state(adapter, state);
805 charging_state_e get_charging_state(struct btd_adapter *adapter)
807 DBG("charging_state: %d", adapter->charging);
808 return adapter->charging;
810 #endif /* TIZEN_FEATURE_BLUEZ_BATTERY_WATCH */
812 static int compare_slot(gconstpointer a, gconstpointer b)
814 const struct adv_info *adv = a;
815 const int id = *(int*)b;
817 return (adv->slot_id == id ? 0 : -1);
820 static struct adv_info *find_advertiser(struct btd_adapter *adapter,
825 list = g_slist_find_custom(adapter->adv_list, &slot_id,
833 static struct adv_info *create_advertiser(struct btd_adapter *adapter,
836 struct adv_info *adv;
841 adv = find_advertiser(adapter, slot_id);
843 DBG("Aleady existed. solt_id [%d]", slot_id);
847 DBG("Create adv slot id : %d", slot_id);
849 adv = g_new0(struct adv_info, 1);
853 adv->slot_id = slot_id;
855 adapter->adv_list = g_slist_append(adapter->adv_list, adv);
860 static void advertising_state_changed(struct btd_adapter *adapter,
861 int slot_id, bool enabled)
863 struct adv_info *adv;
870 adv = find_advertiser(adapter, slot_id);
872 DBG("Unable to find advertiser [%d]", slot_id);
876 adv->status = enabled;
877 DBG("slot_id %d, status %d", adv->slot_id, adv->status);
879 g_dbus_emit_signal(dbus_conn, adapter->path,
880 ADAPTER_INTERFACE, "AdvertisingEnabled",
881 DBUS_TYPE_INT32, &id,
882 DBUS_TYPE_BOOLEAN, &state,
886 static void clear_advertiser_cb(gpointer data, gpointer user_data)
888 struct adv_info *adv = data;
889 struct btd_adapter *adapter = user_data;
892 advertising_state_changed(adapter, adv->slot_id, 0);
895 static void advertiser_cleanup(struct btd_adapter *adapter)
897 if (!adapter->adv_list)
900 g_slist_foreach(adapter->adv_list, clear_advertiser_cb, adapter);
901 g_slist_free(adapter->adv_list);
902 adapter->adv_list = NULL;
905 static void update_advertiser_address(gpointer data, gpointer user_data)
907 struct adv_info *adv = data;
908 struct btd_adapter *adapter = user_data;
910 if (adv->slot_id > 0 && adv->status == 1)
911 adapter_le_set_random_address(adapter, &adapter->rpa, adv->slot_id);
914 static void rpa_changed_callback(uint16_t index, uint16_t length,
915 const void *param, void *user_data)
917 const struct mgmt_ev_rpa_changed *ev = param;
918 struct btd_adapter *adapter = user_data;
921 if (length < sizeof(*ev)) {
922 error("Too small rpa changed event");
926 ba2str(&ev->bdaddr, addr);
927 DBG("RPA changed %s", addr);
928 bacpy(&adapter->rpa, &ev->bdaddr);
930 if (!adapter->adv_list)
933 g_slist_foreach(adapter->adv_list, update_advertiser_address, adapter);
938 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
939 #define OCF_PAGE_SCAN_TIMEOUT 0x0018
940 #define OGF_PAGE_SCAN_TIMEOUT 0x03
943 uint16_t timeout; /* Value */
944 } __attribute__ ((packed)) hci_page_scan_timeout;
945 #define HCI_PAGE_SCAN_TIMEOUT_CP_SIZE 2
947 static gboolean send_sprd_page_scan_timeout(gint value)
950 hci_page_scan_timeout cp;
952 dd = hci_open_dev(0);
954 if (hci_send_cmd(dd, OGF_PAGE_SCAN_TIMEOUT, OCF_PAGE_SCAN_TIMEOUT,
955 HCI_PAGE_SCAN_TIMEOUT_CP_SIZE, &cp) < 0) {
956 DBG("Error: While setting Page Timeout value");
960 DBG("Page Scan Timeout Value Patch %d", value);
968 static void settings_changed(struct btd_adapter *adapter, uint32_t settings)
970 uint32_t changed_mask;
972 changed_mask = adapter->current_settings ^ settings;
974 adapter->current_settings = settings;
975 adapter->pending_settings &= ~changed_mask;
977 DBG("Changed settings: 0x%08x", changed_mask);
978 DBG("Pending settings: 0x%08x", adapter->pending_settings);
980 if (changed_mask & MGMT_SETTING_POWERED) {
981 g_dbus_emit_property_changed(dbus_conn, adapter->path,
982 ADAPTER_INTERFACE, "Powered");
984 if (adapter->current_settings & MGMT_SETTING_POWERED) {
985 adapter_start(adapter);
987 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
988 if (TIZEN_FEATURE_BLUEZ_SPRD_PAGE_SCAN) {
989 /* Approx 6.4 Seconds of timeout */
990 /* This Added because Z3 device was not able to connect with
991 * some device as it was getting Page Timeout
992 * (LG HBS800, sony carkit) etc. So, Increasing Page timeout value
993 * from 5.12 Sec (which is default) to ~6.4sec*/
994 DBG("Setting value");
995 send_sprd_page_scan_timeout(10240);
999 adapter_stop(adapter);
1001 if (powering_down) {
1002 adapter_remaining--;
1004 if (!adapter_remaining)
1010 if ((changed_mask & MGMT_SETTING_LE) &&
1011 btd_adapter_get_powered(adapter) &&
1012 (adapter->current_settings & MGMT_SETTING_LE))
1013 trigger_passive_scanning(adapter);
1015 if (changed_mask & MGMT_SETTING_DISCOVERABLE) {
1016 g_dbus_emit_property_changed(dbus_conn, adapter->path,
1017 ADAPTER_INTERFACE, "Discoverable");
1018 /* Only persist discoverable setting if it was not set
1019 * temporarily by discovery.
1021 if (!adapter->discovery_discoverable)
1022 store_adapter_info(adapter);
1023 btd_adv_manager_refresh(adapter->adv_manager);
1026 if (changed_mask & MGMT_SETTING_BONDABLE) {
1027 g_dbus_emit_property_changed(dbus_conn, adapter->path,
1028 ADAPTER_INTERFACE, "Pairable");
1030 trigger_pairable_timeout(adapter);
1033 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
1034 if (changed_mask & MGMT_SETTING_ADVERTISING) {
1035 if ((adapter->current_settings & MGMT_SETTING_ADVERTISING) &&
1036 (adapter->advertising)) {
1040 adapter->advertising = adapter->current_settings & MGMT_SETTING_ADVERTISING;
1041 advertising_state_changed(adapter, 0, adapter->advertising);
1044 if ((changed_mask & MGMT_SETTING_PRIVACY) &&
1045 !(adapter->current_settings & MGMT_SETTING_PRIVACY)) {
1046 DBG("LE Privacy feature is disabled");
1049 * Some Android devices don't consider the device as LE one,
1050 * if the device doesn't distribute IRK when pairing.
1051 * Because of this compatibility issue, set IRK
1052 * even though privacy feature is disabled.
1054 set_local_irk(adapter);
1059 static void new_settings_callback(uint16_t index, uint16_t length,
1060 const void *param, void *user_data)
1062 struct btd_adapter *adapter = user_data;
1065 if (length < sizeof(settings)) {
1066 btd_error(adapter->dev_id,
1067 "Wrong size of new settings parameters");
1071 settings = get_le32(param);
1073 if (settings == adapter->current_settings)
1076 DBG("Settings: 0x%08x", settings);
1078 settings_changed(adapter, settings);
1081 static void set_mode_complete(uint8_t status, uint16_t length,
1082 const void *param, void *user_data)
1084 struct btd_adapter *adapter = user_data;
1086 if (status != MGMT_STATUS_SUCCESS) {
1087 btd_error(adapter->dev_id, "Failed to set mode: %s (0x%02x)",
1088 mgmt_errstr(status), status);
1093 * The parameters are identical and also the task that is
1094 * required in both cases. So it is safe to just call the
1095 * event handling functions here.
1097 new_settings_callback(adapter->dev_id, length, param, adapter);
1100 static void remove_temporary_devices(struct btd_adapter *adapter)
1104 for (l = adapter->devices; l; l = next) {
1105 struct btd_device *dev = l->data;
1107 next = g_slist_next(l);
1108 if (device_is_temporary(dev))
1109 btd_adapter_remove_device(adapter, dev);
1113 static bool set_mode(struct btd_adapter *adapter, uint16_t opcode,
1116 struct mgmt_mode cp;
1117 uint32_t setting = 0;
1119 memset(&cp, 0, sizeof(cp));
1123 case MGMT_OP_SET_POWERED:
1124 setting = MGMT_SETTING_POWERED;
1126 case MGMT_OP_SET_CONNECTABLE:
1127 setting = MGMT_SETTING_CONNECTABLE;
1129 case MGMT_OP_SET_FAST_CONNECTABLE:
1130 setting = MGMT_SETTING_FAST_CONNECTABLE;
1132 case MGMT_OP_SET_DISCOVERABLE:
1133 setting = MGMT_SETTING_DISCOVERABLE;
1135 case MGMT_OP_SET_BONDABLE:
1136 setting = MGMT_SETTING_BONDABLE;
1140 adapter->pending_settings |= setting;
1142 DBG("sending set mode command for index %u", adapter->dev_id);
1144 if (mgmt_send(adapter->mgmt, opcode,
1145 adapter->dev_id, sizeof(cp), &cp,
1146 set_mode_complete, adapter, NULL) > 0)
1149 btd_error(adapter->dev_id, "Failed to set mode for index %u",
1155 static bool set_discoverable(struct btd_adapter *adapter, uint8_t mode,
1158 struct mgmt_cp_set_discoverable cp;
1160 memset(&cp, 0, sizeof(cp));
1162 cp.timeout = htobs(timeout);
1164 DBG("sending set mode command for index %u", adapter->dev_id);
1166 if (btd_has_kernel_features(KERNEL_CONN_CONTROL)) {
1168 set_mode(adapter, MGMT_OP_SET_CONNECTABLE, mode);
1170 /* This also disables discoverable so we're done */
1171 return set_mode(adapter, MGMT_OP_SET_CONNECTABLE,
1175 if (mgmt_send(adapter->mgmt, MGMT_OP_SET_DISCOVERABLE,
1176 adapter->dev_id, sizeof(cp), &cp,
1177 set_mode_complete, adapter, NULL) > 0)
1180 btd_error(adapter->dev_id, "Failed to set mode for index %u",
1186 static bool pairable_timeout_handler(gpointer user_data)
1188 struct btd_adapter *adapter = user_data;
1190 adapter->pairable_timeout_id = 0;
1192 set_mode(adapter, MGMT_OP_SET_BONDABLE, 0x00);
1197 static void trigger_pairable_timeout(struct btd_adapter *adapter)
1199 if (adapter->pairable_timeout_id > 0) {
1200 timeout_remove(adapter->pairable_timeout_id);
1201 adapter->pairable_timeout_id = 0;
1204 if (!(adapter->current_settings & MGMT_SETTING_BONDABLE))
1207 if (adapter->pairable_timeout > 0)
1208 adapter->pairable_timeout_id =
1209 timeout_add_seconds(adapter->pairable_timeout,
1210 pairable_timeout_handler, adapter,
1214 static void local_name_changed_callback(uint16_t index, uint16_t length,
1215 const void *param, void *user_data)
1217 struct btd_adapter *adapter = user_data;
1218 const struct mgmt_cp_set_local_name *rp = param;
1220 if (length < sizeof(*rp)) {
1221 btd_error(adapter->dev_id,
1222 "Wrong size of local name changed parameters");
1226 if (!g_strcmp0(adapter->short_name, (const char *) rp->short_name) &&
1227 !g_strcmp0(adapter->name, (const char *) rp->name))
1230 DBG("Name: %s", rp->name);
1231 DBG("Short name: %s", rp->short_name);
1233 g_free(adapter->name);
1234 adapter->name = g_strdup((const char *) rp->name);
1236 g_free(adapter->short_name);
1237 adapter->short_name = g_strdup((const char *) rp->short_name);
1240 * Changing the name (even manually via HCI) will update the
1241 * current alias property.
1243 * In case the name is empty, use the short name.
1245 * There is a difference between the stored alias (which is
1246 * configured by the user) and the current alias. The current
1247 * alias is temporary for the lifetime of the daemon.
1249 if (adapter->name && adapter->name[0] != '\0') {
1250 g_free(adapter->current_alias);
1251 adapter->current_alias = g_strdup(adapter->name);
1253 g_free(adapter->current_alias);
1254 adapter->current_alias = g_strdup(adapter->short_name);
1257 DBG("Current alias: %s", adapter->current_alias);
1259 if (!adapter->current_alias)
1262 g_dbus_emit_property_changed(dbus_conn, adapter->path,
1263 ADAPTER_INTERFACE, "Alias");
1265 attrib_gap_set(adapter, GATT_CHARAC_DEVICE_NAME,
1266 (const uint8_t *) adapter->current_alias,
1267 strlen(adapter->current_alias));
1270 static void set_local_name_complete(uint8_t status, uint16_t length,
1271 const void *param, void *user_data)
1273 struct btd_adapter *adapter = user_data;
1275 if (status != MGMT_STATUS_SUCCESS) {
1276 btd_error(adapter->dev_id,
1277 "Failed to set local name: %s (0x%02x)",
1278 mgmt_errstr(status), status);
1283 * The parameters are identical and also the task that is
1284 * required in both cases. So it is safe to just call the
1285 * event handling functions here.
1287 local_name_changed_callback(adapter->dev_id, length, param, adapter);
1290 static int set_name(struct btd_adapter *adapter, const char *name)
1292 struct mgmt_cp_set_local_name cp;
1293 char maxname[MAX_NAME_LENGTH];
1295 memset(maxname, 0, sizeof(maxname));
1296 strncpy(maxname, name, MAX_NAME_LENGTH - 1);
1298 if (!g_utf8_validate(maxname, -1, NULL)) {
1299 btd_error(adapter->dev_id,
1300 "Name change failed: supplied name isn't valid UTF-8");
1304 memset(&cp, 0, sizeof(cp));
1305 strncpy((char *) cp.name, maxname, sizeof(cp.name) - 1);
1307 DBG("sending set local name command for index %u", adapter->dev_id);
1309 if (mgmt_send(adapter->mgmt, MGMT_OP_SET_LOCAL_NAME,
1310 adapter->dev_id, sizeof(cp), &cp,
1311 set_local_name_complete, adapter, NULL) > 0)
1314 btd_error(adapter->dev_id, "Failed to set local name for index %u",
1320 int adapter_set_name(struct btd_adapter *adapter, const char *name)
1322 if (g_strcmp0(adapter->system_name, name) == 0)
1325 DBG("name: %s", name);
1327 g_free(adapter->system_name);
1328 adapter->system_name = g_strdup(name);
1330 g_dbus_emit_property_changed(dbus_conn, adapter->path,
1331 ADAPTER_INTERFACE, "Name");
1333 /* alias is preferred over system name */
1334 if (adapter->stored_alias)
1337 DBG("alias: %s", name);
1339 g_dbus_emit_property_changed(dbus_conn, adapter->path,
1340 ADAPTER_INTERFACE, "Alias");
1342 return set_name(adapter, name);
1345 struct btd_device *btd_adapter_find_device(struct btd_adapter *adapter,
1346 const bdaddr_t *dst,
1347 uint8_t bdaddr_type)
1349 struct device_addr_type addr;
1350 struct btd_device *device;
1356 bacpy(&addr.bdaddr, dst);
1357 addr.bdaddr_type = bdaddr_type;
1359 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
1360 list = g_slist_find_custom(adapter->devices, &addr,
1361 device_addr_type_strict_cmp);
1363 device = list->data;
1367 list = g_slist_find_custom(adapter->devices, &addr,
1368 device_addr_type_cmp);
1372 device = list->data;
1375 * If we're looking up based on public address and the address
1376 * was not previously used over this bearer we may need to
1377 * update LE or BR/EDR support information.
1379 if (bdaddr_type == BDADDR_BREDR)
1380 device_set_bredr_support(device);
1382 device_set_le_support(device, bdaddr_type);
1387 static int device_path_cmp(gconstpointer a, gconstpointer b)
1389 const struct btd_device *device = a;
1390 const char *path = b;
1391 const char *dev_path = device_get_path(device);
1393 return strcasecmp(dev_path, path);
1396 struct btd_device *btd_adapter_find_device_by_path(struct btd_adapter *adapter,
1404 list = g_slist_find_custom(adapter->devices, path, device_path_cmp);
1411 static void uuid_to_uuid128(uuid_t *uuid128, const uuid_t *uuid)
1413 if (uuid->type == SDP_UUID16)
1414 sdp_uuid16_to_uuid128(uuid128, uuid);
1415 else if (uuid->type == SDP_UUID32)
1416 sdp_uuid32_to_uuid128(uuid128, uuid);
1418 memcpy(uuid128, uuid, sizeof(*uuid));
1421 static bool is_supported_uuid(const uuid_t *uuid)
1425 /* mgmt versions from 1.3 onwards support all types of UUIDs */
1426 if (MGMT_VERSION(mgmt_version, mgmt_revision) >= MGMT_VERSION(1, 3))
1429 uuid_to_uuid128(&tmp, uuid);
1431 if (!sdp_uuid128_to_uuid(&tmp))
1434 if (tmp.type != SDP_UUID16)
1440 static void add_uuid_complete(uint8_t status, uint16_t length,
1441 const void *param, void *user_data)
1443 struct btd_adapter *adapter = user_data;
1445 if (status != MGMT_STATUS_SUCCESS) {
1446 btd_error(adapter->dev_id, "Failed to add UUID: %s (0x%02x)",
1447 mgmt_errstr(status), status);
1452 * The parameters are identical and also the task that is
1453 * required in both cases. So it is safe to just call the
1454 * event handling functions here.
1456 dev_class_changed_callback(adapter->dev_id, length, param, adapter);
1458 if (adapter->initialized)
1459 g_dbus_emit_property_changed(dbus_conn, adapter->path,
1460 ADAPTER_INTERFACE, "UUIDs");
1463 static int add_uuid(struct btd_adapter *adapter, uuid_t *uuid, uint8_t svc_hint)
1465 struct mgmt_cp_add_uuid cp;
1469 if (!is_supported_uuid(uuid)) {
1470 btd_warn(adapter->dev_id,
1471 "Ignoring unsupported UUID for addition");
1475 uuid_to_uuid128(&uuid128, uuid);
1477 ntoh128((uint128_t *) uuid128.value.uuid128.data, &uint128);
1478 htob128(&uint128, (uint128_t *) cp.uuid);
1479 cp.svc_hint = svc_hint;
1481 DBG("sending add uuid command for index %u", adapter->dev_id);
1483 if (mgmt_send(adapter->mgmt, MGMT_OP_ADD_UUID,
1484 adapter->dev_id, sizeof(cp), &cp,
1485 add_uuid_complete, adapter, NULL) > 0)
1488 btd_error(adapter->dev_id, "Failed to add UUID for index %u",
1494 static void remove_uuid_complete(uint8_t status, uint16_t length,
1495 const void *param, void *user_data)
1497 struct btd_adapter *adapter = user_data;
1499 if (status != MGMT_STATUS_SUCCESS) {
1500 btd_error(adapter->dev_id, "Failed to remove UUID: %s (0x%02x)",
1501 mgmt_errstr(status), status);
1506 * The parameters are identical and also the task that is
1507 * required in both cases. So it is safe to just call the
1508 * event handling functions here.
1510 dev_class_changed_callback(adapter->dev_id, length, param, adapter);
1512 if (adapter->initialized)
1513 g_dbus_emit_property_changed(dbus_conn, adapter->path,
1514 ADAPTER_INTERFACE, "UUIDs");
1517 static int remove_uuid(struct btd_adapter *adapter, uuid_t *uuid)
1519 struct mgmt_cp_remove_uuid cp;
1523 if (!is_supported_uuid(uuid)) {
1524 btd_warn(adapter->dev_id,
1525 "Ignoring unsupported UUID for removal");
1529 uuid_to_uuid128(&uuid128, uuid);
1531 ntoh128((uint128_t *) uuid128.value.uuid128.data, &uint128);
1532 htob128(&uint128, (uint128_t *) cp.uuid);
1534 DBG("sending remove uuid command for index %u", adapter->dev_id);
1536 if (mgmt_send(adapter->mgmt, MGMT_OP_REMOVE_UUID,
1537 adapter->dev_id, sizeof(cp), &cp,
1538 remove_uuid_complete, adapter, NULL) > 0)
1541 btd_error(adapter->dev_id, "Failed to remove UUID for index %u",
1547 static void clear_uuids_complete(uint8_t status, uint16_t length,
1548 const void *param, void *user_data)
1550 struct btd_adapter *adapter = user_data;
1552 if (status != MGMT_STATUS_SUCCESS) {
1553 btd_error(adapter->dev_id, "Failed to clear UUIDs: %s (0x%02x)",
1554 mgmt_errstr(status), status);
1559 * The parameters are identical and also the task that is
1560 * required in both cases. So it is safe to just call the
1561 * event handling functions here.
1563 dev_class_changed_callback(adapter->dev_id, length, param, adapter);
1566 static int clear_uuids(struct btd_adapter *adapter)
1568 struct mgmt_cp_remove_uuid cp;
1570 memset(&cp, 0, sizeof(cp));
1572 DBG("sending clear uuids command for index %u", adapter->dev_id);
1574 if (mgmt_send(adapter->mgmt, MGMT_OP_REMOVE_UUID,
1575 adapter->dev_id, sizeof(cp), &cp,
1576 clear_uuids_complete, adapter, NULL) > 0)
1579 btd_error(adapter->dev_id, "Failed to clear UUIDs for index %u",
1585 static uint8_t get_uuid_mask(uuid_t *uuid)
1587 if (uuid->type != SDP_UUID16)
1590 switch (uuid->value.uuid16) {
1591 case DIALUP_NET_SVCLASS_ID:
1592 case CIP_SVCLASS_ID:
1593 return 0x42; /* Telephony & Networking */
1594 case IRMC_SYNC_SVCLASS_ID:
1595 case OBEX_OBJPUSH_SVCLASS_ID:
1596 case OBEX_FILETRANS_SVCLASS_ID:
1597 case IRMC_SYNC_CMD_SVCLASS_ID:
1598 case PBAP_PSE_SVCLASS_ID:
1599 return 0x10; /* Object Transfer */
1600 case HEADSET_SVCLASS_ID:
1601 case HANDSFREE_SVCLASS_ID:
1602 return 0x20; /* Audio */
1603 case CORDLESS_TELEPHONY_SVCLASS_ID:
1604 case INTERCOM_SVCLASS_ID:
1605 case FAX_SVCLASS_ID:
1606 case SAP_SVCLASS_ID:
1608 * Setting the telephony bit for the handsfree audio gateway
1609 * role is not required by the HFP specification, but the
1610 * Nokia 616 carkit is just plain broken! It will refuse
1611 * pairing without this bit set.
1613 case HANDSFREE_AGW_SVCLASS_ID:
1614 return 0x40; /* Telephony */
1615 case AUDIO_SOURCE_SVCLASS_ID:
1616 case VIDEO_SOURCE_SVCLASS_ID:
1617 return 0x08; /* Capturing */
1618 case AUDIO_SINK_SVCLASS_ID:
1619 case VIDEO_SINK_SVCLASS_ID:
1620 return 0x04; /* Rendering */
1621 case PANU_SVCLASS_ID:
1622 case NAP_SVCLASS_ID:
1624 return 0x02; /* Networking */
1630 static int uuid_cmp(const void *a, const void *b)
1632 const sdp_record_t *rec = a;
1633 const uuid_t *uuid = b;
1635 return sdp_uuid_cmp(&rec->svclass, uuid);
1638 static void adapter_service_insert(struct btd_adapter *adapter, sdp_record_t *rec)
1640 sdp_list_t *browse_list = NULL;
1644 DBG("%s", adapter->path);
1646 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
1648 DBG("record is NULL return");
1653 /* skip record without a browse group */
1654 if (sdp_get_browse_groups(rec, &browse_list) < 0) {
1655 DBG("skipping record without browse group");
1659 sdp_uuid16_create(&browse_uuid, PUBLIC_BROWSE_GROUP);
1661 /* skip record without public browse group */
1662 if (!sdp_list_find(browse_list, &browse_uuid, sdp_uuid_cmp))
1665 if (sdp_list_find(adapter->services, &rec->svclass, uuid_cmp) == NULL)
1670 adapter->services = sdp_list_insert_sorted(adapter->services, rec,
1674 uint8_t svc_hint = get_uuid_mask(&rec->svclass);
1675 add_uuid(adapter, &rec->svclass, svc_hint);
1679 sdp_list_free(browse_list, free);
1682 int adapter_service_add(struct btd_adapter *adapter, sdp_record_t *rec)
1686 DBG("%s", adapter->path);
1688 ret = add_record_to_server(&adapter->bdaddr, rec);
1692 adapter_service_insert(adapter, rec);
1697 void adapter_service_remove(struct btd_adapter *adapter, uint32_t handle)
1699 sdp_record_t *rec = sdp_record_find(handle);
1701 DBG("%s", adapter->path);
1706 adapter->services = sdp_list_remove(adapter->services, rec);
1708 if (sdp_list_find(adapter->services, &rec->svclass, uuid_cmp) == NULL)
1709 remove_uuid(adapter, &rec->svclass);
1711 remove_record_from_server(rec->handle);
1714 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
1715 static void adapter_print_devices(struct btd_adapter *adapter)
1719 dev = adapter->devices;
1720 for (; dev; dev = dev->next)
1721 device_print_addr(dev->data);
1725 static void adapter_add_device(struct btd_adapter *adapter,
1726 struct btd_device *device);
1728 static struct btd_device *adapter_create_device(struct btd_adapter *adapter,
1729 const bdaddr_t *bdaddr,
1730 uint8_t bdaddr_type)
1732 struct btd_device *device;
1734 device = device_create(adapter, bdaddr, bdaddr_type);
1738 adapter_add_device(adapter, device);
1740 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
1741 device_print_addr(device);
1742 DBG("devices list count : %d", g_slist_length(adapter->devices));
1748 static void service_auth_cancel(struct service_auth *auth)
1752 if (auth->svc_id > 0)
1753 device_remove_svc_complete_callback(auth->device,
1756 dbus_error_init(&derr);
1757 dbus_set_error_const(&derr, ERROR_INTERFACE ".Canceled", NULL);
1759 auth->cb(&derr, auth->user_data);
1761 dbus_error_free(&derr);
1763 if (auth->agent != NULL) {
1764 agent_cancel(auth->agent);
1765 agent_unref(auth->agent);
1771 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
1772 void btd_adapter_unpair_device(struct btd_adapter *adapter,
1773 struct btd_device *dev)
1778 adapter->connect_list = g_slist_remove(adapter->connect_list, dev);
1780 // adapter->devices = g_slist_remove(adapter->devices, dev);
1782 // adapter->discovery_found = g_slist_remove(adapter->discovery_found,
1785 adapter->connections = g_slist_remove(adapter->connections, dev);
1787 if (adapter->connect_le == dev)
1788 adapter->connect_le = NULL;
1790 l = adapter->auths->head;
1792 struct service_auth *auth = l->data;
1793 GList *next = g_list_next(l);
1795 if (auth->device != dev) {
1800 g_queue_delete_link(adapter->auths, l);
1803 service_auth_cancel(auth);
1806 device_unpair(dev, TRUE);
1811 static void adapter_remove_device(struct btd_adapter *adapter,
1812 struct btd_device *device);
1814 void btd_adapter_remove_device(struct btd_adapter *adapter,
1815 struct btd_device *dev)
1819 adapter->connect_list = g_slist_remove(adapter->connect_list, dev);
1821 adapter_remove_device(adapter, dev);
1822 #ifndef TIZEN_FEATURE_BLUEZ_MODIFY
1823 btd_adv_monitor_device_remove(adapter->adv_monitor_manager, dev);
1825 adapter->discovery_found = g_slist_remove(adapter->discovery_found,
1828 adapter->connections = g_slist_remove(adapter->connections, dev);
1830 if (adapter->connect_le == dev)
1831 adapter->connect_le = NULL;
1833 l = adapter->auths->head;
1835 struct service_auth *auth = l->data;
1836 GList *next = g_list_next(l);
1838 if (auth->device != dev) {
1843 g_queue_delete_link(adapter->auths, l);
1846 service_auth_cancel(auth);
1849 device_remove(dev, TRUE);
1852 struct btd_device *btd_adapter_get_device(struct btd_adapter *adapter,
1853 const bdaddr_t *addr,
1856 struct btd_device *device;
1861 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
1862 if (!bacmp(addr, BDADDR_ANY))
1866 device = btd_adapter_find_device(adapter, addr, addr_type);
1870 return adapter_create_device(adapter, addr, addr_type);
1873 sdp_list_t *btd_adapter_get_services(struct btd_adapter *adapter)
1875 return adapter->services;
1878 static void passive_scanning_complete(uint8_t status, uint16_t length,
1879 const void *param, void *user_data)
1881 struct btd_adapter *adapter = user_data;
1882 const struct mgmt_cp_start_discovery *rp = param;
1884 DBG("status 0x%02x", status);
1886 if (length < sizeof(*rp)) {
1887 btd_error(adapter->dev_id,
1888 "Wrong size of start scanning return parameters");
1892 if (status == MGMT_STATUS_SUCCESS) {
1893 adapter->discovery_type = rp->type;
1894 adapter->discovery_enable = 0x01;
1898 static bool passive_scanning_timeout(gpointer user_data)
1900 struct btd_adapter *adapter = user_data;
1901 struct mgmt_cp_start_discovery cp;
1903 adapter->passive_scan_timeout = 0;
1905 cp.type = SCAN_TYPE_LE;
1906 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
1907 mgmt_send(adapter->mgmt, MGMT_OP_START_LE_DISCOVERY,
1908 adapter->dev_id, sizeof(cp), &cp,
1909 passive_scanning_complete, adapter, NULL);
1911 mgmt_send(adapter->mgmt, MGMT_OP_START_DISCOVERY,
1912 adapter->dev_id, sizeof(cp), &cp,
1913 passive_scanning_complete, adapter, NULL);
1918 static void trigger_passive_scanning(struct btd_adapter *adapter)
1920 if (!(adapter->current_settings & MGMT_SETTING_LE))
1925 if (adapter->passive_scan_timeout > 0) {
1926 timeout_remove(adapter->passive_scan_timeout);
1927 adapter->passive_scan_timeout = 0;
1931 * When the kernel background scanning is available, there is
1932 * no need to start any discovery. The kernel will keep scanning
1933 * as long as devices are in its auto-connection list.
1935 if (btd_has_kernel_features(KERNEL_CONN_CONTROL))
1939 * If any client is running a discovery right now, then do not
1940 * even try to start passive scanning.
1942 * The discovery procedure is using interleaved scanning and
1943 * thus will discover Low Energy devices as well.
1945 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
1946 if (adapter->discovery_list || adapter->le_discovery_list)
1949 if (adapter->discovery_list)
1953 if (adapter->discovery_enable == 0x01)
1957 * In case the discovery is suspended (for example for an ongoing
1958 * pairing attempt), then also do not start passive scanning.
1960 if (adapter->discovery_suspended)
1964 * If the list of connectable Low Energy devices is empty,
1965 * then do not start passive scanning.
1967 if (!adapter->connect_list)
1970 adapter->passive_scan_timeout = timeout_add_seconds(CONN_SCAN_TIMEOUT,
1971 passive_scanning_timeout, adapter,
1975 static void stop_passive_scanning_complete(uint8_t status, uint16_t length,
1976 const void *param, void *user_data)
1978 struct btd_adapter *adapter = user_data;
1979 struct btd_device *dev;
1982 DBG("status 0x%02x (%s)", status, mgmt_errstr(status));
1984 dev = adapter->connect_le;
1985 adapter->connect_le = NULL;
1988 * When the kernel background scanning is available, there is
1989 * no need to stop any discovery. The kernel will handle the
1990 * auto-connection by itself.
1992 if (btd_has_kernel_features(KERNEL_CONN_CONTROL))
1996 * MGMT_STATUS_REJECTED may be returned from kernel because the passive
1997 * scan timer had expired in kernel and passive scan was disabled just
1998 * around the time we called stop_passive_scanning().
2000 if (status != MGMT_STATUS_SUCCESS && status != MGMT_STATUS_REJECTED) {
2001 btd_error(adapter->dev_id, "Stopping passive scanning failed: %s",
2002 mgmt_errstr(status));
2006 adapter->discovery_type = 0x00;
2007 adapter->discovery_enable = 0x00;
2010 DBG("Device removed while stopping passive scanning");
2011 trigger_passive_scanning(adapter);
2015 err = device_connect_le(dev);
2017 btd_error(adapter->dev_id, "LE auto connection failed: %s (%d)",
2018 strerror(-err), -err);
2019 trigger_passive_scanning(adapter);
2023 static void stop_passive_scanning(struct btd_adapter *adapter)
2025 struct mgmt_cp_stop_discovery cp;
2026 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
2027 struct mgmt_cp_stop_discovery le_cp;
2032 /* If there are any normal discovery clients passive scanning
2033 * wont be running */
2034 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
2035 if (adapter->discovery_list || adapter->le_discovery_list)
2038 if (adapter->discovery_list)
2042 if (adapter->discovery_enable == 0x00)
2045 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
2046 if ((adapter->discovery_type & 0x01) > 0) {
2048 mgmt_send(adapter->mgmt, MGMT_OP_STOP_DISCOVERY,
2049 adapter->dev_id, sizeof(cp), &cp,
2050 stop_passive_scanning_complete, adapter, NULL);
2052 if ((adapter->discovery_type & 0x06) > 0) {
2054 mgmt_send(adapter->mgmt, MGMT_OP_STOP_LE_DISCOVERY,
2055 adapter->dev_id, sizeof(le_cp), &le_cp,
2056 stop_passive_scanning_complete, adapter, NULL);
2059 cp.type = adapter->discovery_type;
2061 mgmt_send(adapter->mgmt, MGMT_OP_STOP_DISCOVERY,
2062 adapter->dev_id, sizeof(cp), &cp,
2063 stop_passive_scanning_complete, adapter, NULL);
2067 static void cancel_passive_scanning(struct btd_adapter *adapter)
2069 if (!(adapter->current_settings & MGMT_SETTING_LE))
2074 if (adapter->passive_scan_timeout > 0) {
2075 timeout_remove(adapter->passive_scan_timeout);
2076 adapter->passive_scan_timeout = 0;
2080 static uint8_t get_scan_type(struct btd_adapter *adapter)
2084 if (adapter->current_settings & MGMT_SETTING_BREDR)
2085 type = SCAN_TYPE_BREDR;
2089 if (adapter->current_settings & MGMT_SETTING_LE)
2090 type |= SCAN_TYPE_LE;
2095 static void free_discovery_filter(struct discovery_filter *discovery_filter)
2097 if (!discovery_filter)
2100 g_slist_free_full(discovery_filter->uuids, free);
2101 free(discovery_filter->pattern);
2102 g_free(discovery_filter);
2105 static void invalidate_rssi_and_tx_power(gpointer a)
2107 struct btd_device *dev = a;
2109 device_set_rssi(dev, 0);
2110 device_set_tx_power(dev, 127);
2113 static void discovery_cleanup(struct btd_adapter *adapter, int timeout)
2117 adapter->discovery_type = 0x00;
2119 if (adapter->discovery_idle_timeout > 0) {
2120 timeout_remove(adapter->discovery_idle_timeout);
2121 adapter->discovery_idle_timeout = 0;
2124 g_slist_free_full(adapter->discovery_found,
2125 invalidate_rssi_and_tx_power);
2126 adapter->discovery_found = NULL;
2128 if (!adapter->devices)
2131 for (l = adapter->devices; l != NULL; l = next) {
2132 struct btd_device *dev = l->data;
2134 next = g_slist_next(l);
2136 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
2137 if (device_is_temporary(dev) && !device_is_connectable(dev)
2138 && !btd_device_is_connected(dev))
2140 if (device_is_temporary(dev) && !device_is_connectable(dev))
2142 btd_adapter_remove_device(adapter, dev);
2147 static void discovery_free(void *user_data)
2149 struct discovery_client *client = user_data;
2150 struct btd_adapter *adapter = client->adapter;
2152 #ifndef TIZEN_FEATURE_BLUEZ_MODIFY
2156 g_dbus_remove_watch(dbus_conn, client->watch);
2158 if (client->discovery_filter) {
2159 free_discovery_filter(client->discovery_filter);
2160 client->discovery_filter = NULL;
2164 if (client == adapter->client) {
2165 g_dbus_send_message(dbus_conn,
2166 btd_error_busy(client->msg));
2167 adapter->client = NULL;
2169 dbus_message_unref(client->msg);
2172 g_free(client->owner);
2176 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
2177 static void discovery_remove(struct discovery_client *client, bool exit)
2179 static void discovery_remove(struct discovery_client *client)
2183 struct btd_adapter *adapter = client->adapter;
2185 DBG("owner %s", client->owner);
2187 adapter->set_filter_list = g_slist_remove(adapter->set_filter_list,
2190 adapter->discovery_list = g_slist_remove(adapter->discovery_list,
2193 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
2194 if (!exit && client->discovery_filter)
2196 if (adapter->client == client)
2197 adapter->client = NULL;
2199 if (client->watch && client->discovery_filter)
2201 adapter->set_filter_list = g_slist_prepend(
2202 adapter->set_filter_list, client);
2204 discovery_free(client);
2207 * If there are other client discoveries in progress, then leave
2208 * it active. If not, then make sure to stop the restart timeout.
2210 if (adapter->discovery_list)
2213 discovery_cleanup(adapter, TEMP_DEV_TIMEOUT);
2216 static void trigger_start_discovery(struct btd_adapter *adapter, guint delay);
2218 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
2219 static void discovery_reply(struct discovery_client *client, uint8_t status)
2221 static struct discovery_client *discovery_complete(struct btd_adapter *adapter,
2225 #ifndef TIZEN_FEATURE_BLUEZ_MODIFY
2226 struct discovery_client *client = adapter->client;
2229 #ifndef TIZEN_FEATURE_BLUEZ_MODIFY
2234 adapter->client = NULL;
2238 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
2244 g_dbus_send_reply(dbus_conn, client->msg, DBUS_TYPE_INVALID);
2246 reply = btd_error_busy(client->msg);
2247 g_dbus_send_message(dbus_conn, reply);
2250 dbus_message_unref(client->msg);
2252 #ifndef TIZEN_FEATURE_BLUEZ_MODIFY
2257 static void start_discovery_complete(uint8_t status, uint16_t length,
2258 const void *param, void *user_data)
2260 struct btd_adapter *adapter = user_data;
2261 struct discovery_client *client;
2262 const struct mgmt_cp_start_discovery *rp = param;
2264 DBG("status 0x%02x", status);
2266 /* Is there are no clients the discovery must have been stopped while
2267 * discovery command was pending.
2269 if (!adapter->discovery_list) {
2270 struct mgmt_cp_stop_discovery cp;
2272 if (status != MGMT_STATUS_SUCCESS)
2275 /* Stop discovering as there are no clients left */
2277 mgmt_send(adapter->mgmt, MGMT_OP_STOP_DISCOVERY,
2278 adapter->dev_id, sizeof(cp), &cp,
2283 client = adapter->discovery_list->data;
2285 if (length < sizeof(*rp)) {
2286 btd_error(adapter->dev_id,
2287 "Wrong size of start discovery return parameters");
2293 if (status == MGMT_STATUS_SUCCESS) {
2294 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
2295 DBG("Return param discovery type 0x%02x", rp->type);
2296 adapter->discovery_type |= rp->type;
2298 adapter->discovery_type = rp->type;
2300 adapter->discovery_enable = 0x01;
2302 if (adapter->current_discovery_filter)
2303 adapter->filtered_discovery = true;
2305 adapter->filtered_discovery = false;
2307 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
2308 discovery_reply(client, status);
2310 discovery_complete(adapter, status);
2312 if (adapter->discovering)
2315 adapter->discovering = true;
2316 g_dbus_emit_property_changed(dbus_conn, adapter->path,
2317 ADAPTER_INTERFACE, "Discovering");
2319 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
2321 adapter->discovering = false;
2322 g_dbus_emit_property_changed(dbus_conn, adapter->path,
2323 ADAPTER_INTERFACE, "Discovering");
2327 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
2329 /* Reply with an error if the first discovery has failed */
2331 discovery_reply(client, status);
2332 discovery_remove(client, false);
2334 client = discovery_complete(adapter, status);
2336 discovery_remove(client);
2342 * In case the restart of the discovery failed, then just trigger
2343 * it for the next idle timeout again.
2345 #ifndef TIZEN_FEATURE_BLUEZ_MODIFY
2346 trigger_start_discovery(adapter, IDLE_DISCOV_TIMEOUT * 2);
2350 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
2351 static void start_le_discovery_complete(uint8_t status, uint16_t length,
2352 const void *param, void *user_data)
2354 struct btd_adapter *adapter = user_data;
2355 const struct mgmt_cp_start_discovery *rp = param;
2358 error("Error ocurred in LEDiscovering, rp is NULL");
2362 DBG("status 0x%02x", status);
2363 if (length < sizeof(*rp)) {
2364 error("Wrong size of start discovery return parameters");
2368 DBG("Discovery Type 0x%02x", rp->type);
2369 if (status == MGMT_STATUS_SUCCESS) {
2370 adapter->discovery_type |= rp->type;
2371 adapter->discovery_enable = 0x01;
2373 if (adapter->le_discovering)
2376 adapter->le_discovering = true;
2377 g_dbus_emit_property_changed(dbus_conn, adapter->path,
2378 ADAPTER_INTERFACE, "LEDiscovering");
2382 adapter->le_discovering = false;
2383 g_dbus_emit_property_changed(dbus_conn, adapter->path,
2384 ADAPTER_INTERFACE, "LEDiscovering");
2390 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
2391 static gboolean start_le_discovery_timeout(gpointer user_data)
2393 struct btd_adapter *adapter = user_data;
2398 adapter->le_discovery_idle_timeout = 0;
2400 new_type = SCAN_TYPE_LE;
2402 if (adapter->discovery_enable == 0x01) {
2404 * If there is an already running discovery and it has the
2405 * same type, then just keep it.
2408 if ((adapter->discovery_type & new_type) == SCAN_TYPE_LE) {
2409 if (adapter->le_discovering)
2412 adapter->le_discovering = true;
2413 g_dbus_emit_property_changed(dbus_conn, adapter->path,
2414 ADAPTER_INTERFACE, "LEDiscovering");
2420 struct mgmt_cp_start_discovery cp;
2423 mgmt_send(adapter->mgmt, MGMT_OP_START_LE_DISCOVERY,
2424 adapter->dev_id, sizeof(cp), &cp,
2425 start_le_discovery_complete, adapter, NULL);
2431 static bool start_discovery_timeout(gpointer user_data)
2433 struct btd_adapter *adapter = user_data;
2434 #ifndef TIZEN_FEATURE_BLUEZ_MODIFY
2435 struct mgmt_cp_start_service_discovery *sd_cp;
2441 adapter->discovery_idle_timeout = 0;
2443 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
2444 new_type = SCAN_TYPE_BREDR;
2446 if (adapter->discovery_enable == 0x01) {
2448 * If there is an already running discovery and it has the
2449 * same type, then just keep it.
2451 if ((adapter->discovery_type & new_type) == SCAN_TYPE_BREDR) {
2452 if (adapter->discovering)
2455 adapter->discovering = true;
2456 g_dbus_emit_property_changed(dbus_conn, adapter->path,
2457 ADAPTER_INTERFACE, "Discovering");
2463 struct mgmt_cp_start_discovery cp;
2465 mgmt_send(adapter->mgmt, MGMT_OP_START_DISCOVERY,
2466 adapter->dev_id, sizeof(cp), &cp,
2467 start_discovery_complete, adapter,
2472 /* If we're doing filtered discovery, it must be quickly restarted */
2473 adapter->no_scan_restart_delay = !!adapter->current_discovery_filter;
2475 DBG("adapter->current_discovery_filter == %d",
2476 !!adapter->current_discovery_filter);
2478 new_type = get_scan_type(adapter);
2480 if (adapter->discovery_enable == 0x01) {
2481 struct mgmt_cp_stop_discovery cp;
2484 * If we're asked to start regular discovery, and there is an
2485 * already running regular discovery and it has the same type,
2486 * then just keep it.
2488 if (!adapter->current_discovery_filter &&
2489 !adapter->filtered_discovery &&
2490 adapter->discovery_type == new_type) {
2491 if (adapter->discovering)
2494 adapter->discovering = true;
2495 g_dbus_emit_property_changed(dbus_conn, adapter->path,
2496 ADAPTER_INTERFACE, "Discovering");
2501 * Otherwise the current discovery must be stopped. So
2502 * queue up a stop discovery command.
2504 * This can happen if a passive scanning for Low Energy
2505 * devices is ongoing, or scan type is changed between
2506 * regular and filtered, or filter was updated.
2508 cp.type = adapter->discovery_type;
2509 mgmt_send(adapter->mgmt, MGMT_OP_STOP_DISCOVERY,
2510 adapter->dev_id, sizeof(cp), &cp,
2513 /* Don't even bother to try to quickly start discovery
2514 * just after stopping it, it would fail with status
2515 * MGMT_BUSY. Instead discovering_callback will take
2522 /* Regular discovery is required */
2523 if (!adapter->current_discovery_filter) {
2524 struct mgmt_cp_start_discovery cp;
2527 mgmt_send(adapter->mgmt, MGMT_OP_START_DISCOVERY,
2528 adapter->dev_id, sizeof(cp), &cp,
2529 start_discovery_complete, adapter,
2535 /* Filtered discovery is required */
2536 sd_cp = adapter->current_discovery_filter;
2538 DBG("sending MGMT_OP_START_SERVICE_DISCOVERY %d, %d, %d",
2539 sd_cp->rssi, sd_cp->type,
2540 btohs(sd_cp->uuid_count));
2542 mgmt_send(adapter->mgmt, MGMT_OP_START_SERVICE_DISCOVERY,
2543 adapter->dev_id, sizeof(*sd_cp) +
2544 btohs(sd_cp->uuid_count) * 16,
2545 sd_cp, start_discovery_complete, adapter, NULL);
2552 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
2553 static void trigger_start_le_discovery(struct btd_adapter *adapter, guint delay)
2558 cancel_passive_scanning(adapter);
2560 if (adapter->le_discovery_idle_timeout > 0) {
2561 g_source_remove(adapter->le_discovery_idle_timeout);
2562 adapter->le_discovery_idle_timeout = 0;
2566 * If the controller got powered down in between, then ensure
2567 * that we do not keep trying to restart discovery.
2569 * This is safe-guard and should actually never trigger.
2571 if (!(adapter->current_settings & MGMT_SETTING_POWERED))
2574 adapter->le_discovery_idle_timeout = g_timeout_add_seconds(delay,
2575 start_le_discovery_timeout, adapter);
2579 static void trigger_start_discovery(struct btd_adapter *adapter, guint delay)
2584 cancel_passive_scanning(adapter);
2586 if (adapter->discovery_idle_timeout > 0) {
2587 timeout_remove(adapter->discovery_idle_timeout);
2588 adapter->discovery_idle_timeout = 0;
2592 * If the controller got powered down in between, then ensure
2593 * that we do not keep trying to restart discovery.
2595 * This is safe-guard and should actually never trigger.
2597 if (!btd_adapter_get_powered(adapter))
2600 adapter->discovery_idle_timeout = timeout_add_seconds(delay,
2601 start_discovery_timeout, adapter, NULL);
2604 #ifndef TIZEN_FEATURE_BLUEZ_MODIFY
2605 static void suspend_discovery_complete(uint8_t status, uint16_t length,
2606 const void *param, void *user_data)
2608 struct btd_adapter *adapter = user_data;
2610 DBG("status 0x%02x", status);
2612 if (status == MGMT_STATUS_SUCCESS) {
2613 adapter->discovery_type = 0x00;
2614 adapter->discovery_enable = 0x00;
2619 static void suspend_discovery(struct btd_adapter *adapter)
2621 struct mgmt_cp_stop_discovery cp;
2625 adapter->discovery_suspended = true;
2628 * If there are no clients discovering right now, then there is
2629 * also nothing to suspend.
2631 if (!adapter->discovery_list)
2635 * In case of being inside the idle phase, make sure to remove
2636 * the timeout to not trigger a restart.
2638 * The restart will be triggered when the discovery is resumed.
2640 if (adapter->discovery_idle_timeout > 0) {
2641 timeout_remove(adapter->discovery_idle_timeout);
2642 adapter->discovery_idle_timeout = 0;
2645 if (adapter->discovery_enable == 0x00)
2648 cp.type = adapter->discovery_type;
2650 mgmt_send(adapter->mgmt, MGMT_OP_STOP_DISCOVERY,
2651 adapter->dev_id, sizeof(cp), &cp,
2652 suspend_discovery_complete, adapter, NULL);
2655 static void resume_discovery(struct btd_adapter *adapter)
2659 adapter->discovery_suspended = false;
2662 * If there are no clients discovering right now, then there is
2663 * also nothing to resume.
2665 if (!adapter->discovery_list)
2669 * Treat a suspended discovery session the same as extra long
2670 * idle time for a normal discovery. So just trigger the default
2671 * restart procedure.
2673 trigger_start_discovery(adapter, IDLE_DISCOV_TIMEOUT);
2677 static void discovering_callback(uint16_t index, uint16_t length,
2678 const void *param, void *user_data)
2680 const struct mgmt_ev_discovering *ev = param;
2681 struct btd_adapter *adapter = user_data;
2683 if (length < sizeof(*ev)) {
2684 btd_error(adapter->dev_id, "Too small discovering event");
2688 DBG("hci%u type %u discovering %u method %d", adapter->dev_id, ev->type,
2689 ev->discovering, adapter->filtered_discovery);
2691 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
2692 DBG("info discov_type %d", adapter->discovery_type);
2693 if (ev->type == SCAN_TYPE_BREDR) {
2694 if (ev->discovering == FALSE) {
2695 hci_clear_bit(BDADDR_BREDR, &adapter->discovery_type);
2696 adapter->discovering = false;
2698 hci_set_bit(BDADDR_BREDR, &adapter->discovery_type);
2699 adapter->discovering = true;
2701 g_dbus_emit_property_changed(dbus_conn, adapter->path,
2702 ADAPTER_INTERFACE, "Discovering");
2704 } else if (ev->type == SCAN_TYPE_LE) {
2705 if (ev->discovering == FALSE) {
2706 hci_clear_bit(BDADDR_LE_PUBLIC, &adapter->discovery_type);
2707 hci_clear_bit(BDADDR_LE_RANDOM, &adapter->discovery_type);
2709 if (adapter->le_discovering == true) {
2710 if (adapter->le_discovery_list) {
2711 struct discovery_client *client;
2713 client = adapter->le_discovery_list->data;
2714 g_dbus_remove_watch(dbus_conn, client->watch);
2717 adapter->le_discovering = false;
2720 hci_set_bit(BDADDR_LE_PUBLIC, &adapter->discovery_type);
2721 hci_set_bit(BDADDR_LE_RANDOM, &adapter->discovery_type);
2722 adapter->le_discovering = true;
2725 g_dbus_emit_property_changed(dbus_conn, adapter->path,
2726 ADAPTER_INTERFACE, "LEDiscovering");
2729 if (adapter->discovery_enable == ev->discovering)
2732 adapter->discovery_type = ev->type;
2733 adapter->discovery_enable = ev->discovering;
2737 * Check for existing discoveries triggered by client applications
2738 * and ignore all others.
2740 * If there are no clients, then it is good idea to trigger a
2741 * passive scanning attempt.
2743 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
2744 if (adapter->discovery_list == NULL && adapter->le_discovery_list == NULL) {
2745 if (!adapter->connect_le)
2746 trigger_passive_scanning(adapter);
2750 if (!adapter->discovery_list) {
2751 if (!adapter->connect_le)
2752 trigger_passive_scanning(adapter);
2757 if (adapter->discovery_suspended)
2760 switch (adapter->discovery_enable) {
2762 if (adapter->no_scan_restart_delay)
2763 trigger_start_discovery(adapter, 0);
2765 trigger_start_discovery(adapter, IDLE_DISCOV_TIMEOUT);
2769 if (adapter->discovery_idle_timeout > 0) {
2770 timeout_remove(adapter->discovery_idle_timeout);
2771 adapter->discovery_idle_timeout = 0;
2778 static bool set_discovery_discoverable(struct btd_adapter *adapter, bool enable)
2780 if (adapter->discovery_discoverable == enable)
2783 /* Reset discoverable filter if already set */
2784 if (enable && (adapter->current_settings & MGMT_OP_SET_DISCOVERABLE))
2787 adapter->discovery_discoverable = enable;
2789 return set_discoverable(adapter, enable, 0);
2792 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
2793 static void stop_discovery_complete(uint8_t status, uint16_t length,
2794 const void *param, void *user_data)
2796 struct discovery_client *client = user_data;
2797 struct btd_adapter *adapter = client->adapter;
2800 DBG("status 0x%02x", status);
2802 if (status != MGMT_STATUS_SUCCESS) {
2804 reply = btd_error_busy(client->msg);
2805 g_dbus_send_message(dbus_conn, reply);
2812 reply = g_dbus_create_reply(client->msg, DBUS_TYPE_INVALID);
2813 g_dbus_send_message(dbus_conn, reply);
2816 adapter->discovery_type &= (~0x01);
2817 DBG("Discovery Type 0x%02x", adapter->discovery_type);
2819 adapter->filtered_discovery = false;
2820 adapter->no_scan_restart_delay = false;
2821 adapter->discovering = false;
2822 g_dbus_emit_property_changed(dbus_conn, adapter->path,
2823 ADAPTER_INTERFACE, "Discovering");
2825 if (adapter->discovery_list == NULL && adapter->le_discovery_list == NULL) {
2826 adapter->discovery_enable = 0x00;
2827 trigger_passive_scanning(adapter);
2831 discovery_remove(client, false);
2834 static void stop_le_discovery_complete(uint8_t status, uint16_t length,
2835 const void *param, void *user_data)
2837 struct btd_adapter *adapter = user_data;
2838 struct discovery_client *client;
2841 DBG("status 0x%02x", status);
2843 /* Is there are no clients the discovery must have been stopped while
2844 * discovery command was pending.
2846 if (!adapter->le_discovery_list)
2849 client = adapter->le_discovery_list->data;
2851 if (status != MGMT_STATUS_SUCCESS) {
2853 reply = btd_error_busy(client->msg);
2854 g_dbus_send_message(dbus_conn, reply);
2861 reply = g_dbus_create_reply(client->msg, DBUS_TYPE_INVALID);
2862 g_dbus_send_message(dbus_conn, reply);
2865 adapter->discovery_type &= (~0x06);
2866 DBG("Discovery Type 0x%02x", adapter->discovery_type);
2868 adapter->filtered_discovery = false;
2869 adapter->no_scan_restart_delay = false;
2870 adapter->le_discovering = false;
2871 g_dbus_emit_property_changed(dbus_conn, adapter->path,
2872 ADAPTER_INTERFACE, "LEDiscovering");
2874 if (adapter->discovery_list == NULL && adapter->le_discovery_list == NULL) {
2875 adapter->discovery_enable = 0x00;
2876 trigger_passive_scanning(adapter);
2881 * The destroy function will cleanup the client information and
2882 * also remove it from the list of discovery clients.
2884 g_dbus_remove_watch(dbus_conn, client->watch);
2888 static void stop_discovery_complete(uint8_t status, uint16_t length,
2889 const void *param, void *user_data)
2891 struct btd_adapter *adapter = user_data;
2892 struct discovery_client *client;
2894 DBG("status 0x%02x", status);
2896 client = discovery_complete(adapter, status);
2898 discovery_remove(client);
2900 if (status != MGMT_STATUS_SUCCESS)
2903 adapter->discovery_type = 0x00;
2904 adapter->discovery_enable = 0x00;
2905 adapter->filtered_discovery = false;
2906 adapter->no_scan_restart_delay = false;
2907 adapter->discovering = false;
2908 g_dbus_emit_property_changed(dbus_conn, adapter->path,
2909 ADAPTER_INTERFACE, "Discovering");
2911 trigger_passive_scanning(adapter);
2915 static int compare_sender(gconstpointer a, gconstpointer b)
2917 const struct discovery_client *client = a;
2918 const char *sender = b;
2920 return g_strcmp0(client->owner, sender);
2923 static gint g_strcmp(gconstpointer a, gconstpointer b)
2925 return strcmp(a, b);
2928 static void extract_unique_uuids(gpointer data, gpointer user_data)
2930 char *uuid_str = data;
2931 GSList **uuids = user_data;
2933 if (!g_slist_find_custom(*uuids, uuid_str, g_strcmp))
2934 *uuids = g_slist_insert_sorted(*uuids, uuid_str, g_strcmp);
2938 * This method merges all adapter filters into rssi, transport and uuids.
2939 * Returns 1 if there was no filtered scan, 0 otherwise.
2941 static int merge_discovery_filters(struct btd_adapter *adapter, int *rssi,
2942 uint8_t *transport, GSList **uuids)
2945 bool empty_uuid = false;
2946 bool has_regular_discovery = false;
2947 bool has_filtered_discovery = false;
2949 for (l = adapter->discovery_list; l != NULL; l = g_slist_next(l)) {
2950 struct discovery_client *client = l->data;
2951 struct discovery_filter *item = client->discovery_filter;
2954 has_regular_discovery = true;
2958 has_filtered_discovery = true;
2960 *transport |= item->type;
2963 * Rule for merging rssi and pathloss into rssi field of kernel
2964 * filter is as follow:
2965 * - if there's any client without proximity filter, then do no
2966 * proximity filtering,
2967 * - if all clients specified RSSI, then use lowest value,
2968 * - if any client specified pathloss, then kernel filter should
2969 * do no proximity, as kernel can't compute pathloss. We'll do
2970 * filtering on our own.
2972 if (item->rssi == DISTANCE_VAL_INVALID)
2973 *rssi = HCI_RSSI_INVALID;
2974 else if (*rssi != HCI_RSSI_INVALID && *rssi >= item->rssi)
2976 else if (item->pathloss != DISTANCE_VAL_INVALID)
2977 *rssi = HCI_RSSI_INVALID;
2979 if (!g_slist_length(item->uuids))
2982 g_slist_foreach(item->uuids, extract_unique_uuids, uuids);
2985 /* If no proximity filtering is set, disable it */
2986 if (*rssi == DISTANCE_VAL_INVALID)
2987 *rssi = HCI_RSSI_INVALID;
2990 * Empty_uuid variable determines wether there was any filter with no
2991 * uuids. In this case someone might be looking for all devices in
2992 * certain proximity, and we need to have empty uuids in kernel filter.
2995 g_slist_free(*uuids);
2999 if (has_regular_discovery) {
3000 if (!has_filtered_discovery)
3004 * It there is both regular and filtered scan running, then
3005 * clear whole fitler to report all devices.
3007 *transport = get_scan_type(adapter);
3008 *rssi = HCI_RSSI_INVALID;
3009 g_slist_free(*uuids);
3016 static void populate_mgmt_filter_uuids(uint8_t (*mgmt_uuids)[16], GSList *uuids)
3020 for (l = uuids; l != NULL; l = g_slist_next(l)) {
3021 bt_uuid_t uuid, u128;
3024 bt_string_to_uuid(&uuid, l->data);
3025 bt_uuid_to_uuid128(&uuid, &u128);
3027 ntoh128((uint128_t *) u128.value.u128.data, &uint128);
3028 htob128(&uint128, (uint128_t *) mgmt_uuids);
3035 * This method merges all adapter filters into one that will be send to kernel.
3036 * cp_ptr is set to null when regular non-filtered discovery is needed,
3037 * otherwise it's pointing to filter. Returns 0 on succes, -1 on error
3039 static int discovery_filter_to_mgmt_cp(struct btd_adapter *adapter,
3040 struct mgmt_cp_start_service_discovery **cp_ptr)
3042 GSList *uuids = NULL;
3043 struct mgmt_cp_start_service_discovery *cp;
3044 int rssi = DISTANCE_VAL_INVALID;
3046 uint8_t discovery_type = 0;
3050 if (merge_discovery_filters(adapter, &rssi, &discovery_type, &uuids)) {
3051 /* There are only regular scans, run just regular scan. */
3056 uuid_count = g_slist_length(uuids);
3058 cp = g_try_malloc(sizeof(*cp) + 16*uuid_count);
3061 g_slist_free(uuids);
3065 cp->type = discovery_type;
3067 cp->uuid_count = htobs(uuid_count);
3068 populate_mgmt_filter_uuids(cp->uuids, uuids);
3070 g_slist_free(uuids);
3074 static bool filters_equal(struct mgmt_cp_start_service_discovery *a,
3075 struct mgmt_cp_start_service_discovery *b) {
3079 if ((!a && b) || (a && !b))
3082 if (a->type != b->type)
3085 if (a->rssi != b->rssi)
3089 * When we create mgmt_cp_start_service_discovery structure inside
3090 * discovery_filter_to_mgmt_cp, we always keep uuids sorted, and
3091 * unique, so we're safe to compare uuid_count, and uuids like that.
3093 if (a->uuid_count != b->uuid_count)
3096 if (memcmp(a->uuids, b->uuids, 16 * a->uuid_count) != 0)
3102 static int update_discovery_filter(struct btd_adapter *adapter)
3104 struct mgmt_cp_start_service_discovery *sd_cp;
3108 if (discovery_filter_to_mgmt_cp(adapter, &sd_cp)) {
3109 btd_error(adapter->dev_id,
3110 "discovery_filter_to_mgmt_cp returned error");
3114 /* Only attempt to overwrite current discoverable setting when not
3117 if (!(adapter->current_settings & MGMT_OP_SET_DISCOVERABLE)) {
3120 for (l = adapter->discovery_list; l; l = g_slist_next(l)) {
3121 struct discovery_client *client = l->data;
3123 if (!client->discovery_filter)
3126 if (client->discovery_filter->discoverable) {
3127 set_discovery_discoverable(adapter, true);
3134 * If filters are equal, then don't update scan, except for when
3135 * starting discovery.
3137 if (filters_equal(adapter->current_discovery_filter, sd_cp) &&
3138 adapter->discovering != 0) {
3139 DBG("filters were equal, deciding to not restart the scan.");
3144 g_free(adapter->current_discovery_filter);
3145 adapter->current_discovery_filter = sd_cp;
3147 trigger_start_discovery(adapter, 0);
3149 return -EINPROGRESS;
3152 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
3153 static int discovery_stop(struct discovery_client *client, bool exit)
3155 static int discovery_stop(struct discovery_client *client)
3158 struct btd_adapter *adapter = client->adapter;
3159 struct mgmt_cp_stop_discovery cp;
3161 /* Check if there are more client discovering */
3162 if (g_slist_next(adapter->discovery_list)) {
3163 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
3164 discovery_remove(client, exit);
3166 discovery_remove(client);
3168 update_discovery_filter(adapter);
3172 set_discovery_discoverable(adapter, false);
3175 * In the idle phase of a discovery, there is no need to stop it
3176 * and so it is enough to send out the signal and just return.
3178 if (adapter->discovery_enable == 0x00) {
3179 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
3180 discovery_remove(client, exit);
3182 discovery_remove(client);
3184 adapter->discovering = false;
3185 g_dbus_emit_property_changed(dbus_conn, adapter->path,
3186 ADAPTER_INTERFACE, "Discovering");
3188 trigger_passive_scanning(adapter);
3192 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
3193 adapter->disc_type = BT_DISC_TYPE_BREDR_ONLY;
3195 cp.type = adapter->discovery_type;
3196 #ifndef TIZEN_FEATURE_BLUEZ_MODIFY
3197 adapter->client = client;
3199 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
3202 mgmt_send(adapter->mgmt, MGMT_OP_STOP_DISCOVERY,
3203 adapter->dev_id, sizeof(cp), &cp,
3204 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
3205 stop_discovery_complete, client, NULL);
3207 stop_discovery_complete, adapter, NULL);
3210 return -EINPROGRESS;
3213 static void discovery_destroy(void *user_data)
3215 struct discovery_client *client = user_data;
3216 struct btd_adapter *adapter = client->adapter;
3218 DBG("owner %s", client->owner);
3220 adapter->set_filter_list = g_slist_remove(adapter->set_filter_list,
3223 adapter->discovery_list = g_slist_remove(adapter->discovery_list,
3226 if (client->discovery_filter) {
3227 free_discovery_filter(client->discovery_filter);
3228 client->discovery_filter = NULL;
3231 g_free(client->owner);
3235 * If there are other client discoveries in progress, then leave
3236 * it active. If not, then make sure to stop the restart timeout.
3238 if (adapter->discovery_list)
3241 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
3242 hci_clear_bit(BDADDR_BREDR, &adapter->discovery_type);
3244 adapter->discovery_type = 0x00;
3247 discovery_cleanup(adapter, 0);
3251 static void discovery_disconnect(DBusConnection *conn, void *user_data)
3253 struct discovery_client *client = user_data;
3255 DBG("owner %s", client->owner);
3256 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
3257 discovery_stop(client, true);
3261 discovery_stop(client);
3266 * Returns true if client was already discovering, false otherwise. *client
3267 * will point to discovering client, or client that have pre-set his filter.
3269 static bool get_discovery_client(struct btd_adapter *adapter,
3271 struct discovery_client **client)
3273 GSList *list = g_slist_find_custom(adapter->discovery_list, owner,
3276 *client = list->data;
3280 list = g_slist_find_custom(adapter->set_filter_list, owner,
3283 *client = list->data;
3291 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
3292 static void le_discovery_destroy(void *user_data)
3294 struct discovery_client *client = user_data;
3295 struct btd_adapter *adapter = client->adapter;
3297 DBG("owner %s", client->owner);
3299 adapter->le_discovery_list = g_slist_remove(adapter->le_discovery_list,
3302 g_free(client->owner);
3306 * If there are other client discoveries in progress, then leave
3307 * it active. If not, then make sure to stop the restart timeout.
3309 DBG("adapter->discovery_list[%p] adapter->le_discovery_list[%p]",
3310 adapter->discovery_list, adapter->le_discovery_list);
3311 if (adapter->discovery_list || adapter->le_discovery_list)
3314 hci_clear_bit(BDADDR_LE_PUBLIC, &adapter->discovery_type);
3315 hci_clear_bit(BDADDR_LE_RANDOM, &adapter->discovery_type);
3317 DBG("Restart Timer... adapter->discovery_type[%d]", adapter->discovery_type);
3318 if (adapter->discovery_idle_timeout > 0) {
3319 g_source_remove(adapter->discovery_idle_timeout);
3320 adapter->discovery_idle_timeout = 0;
3323 discovery_cleanup(adapter, 0);
3326 static void le_discovery_disconnect(DBusConnection *conn, void *user_data)
3328 struct discovery_client *client = user_data;
3329 struct btd_adapter *adapter = client->adapter;
3330 struct mgmt_cp_stop_le_discovery cp;
3332 DBG("owner %s", client->owner);
3334 adapter->le_discovery_list = g_slist_remove(adapter->le_discovery_list,
3338 * There is no need for extra cleanup of the client since that
3339 * will be done by the destroy callback.
3341 * However in case this is the last client, the discovery in
3342 * the kernel needs to be disabled.
3344 if (adapter->le_discovery_list)
3348 * In the idle phase of a discovery, there is no need to stop it
3349 * and so it is enough to send out the signal and just return.
3351 if (adapter->discovery_enable == 0x00) {
3352 adapter->le_discovering = false;
3353 g_dbus_emit_property_changed(dbus_conn, adapter->path,
3354 ADAPTER_INTERFACE, "LEDiscovering");
3356 if (adapter->discovering == false && adapter->le_discovering == false) {
3357 trigger_passive_scanning(adapter);
3364 mgmt_send(adapter->mgmt, MGMT_OP_STOP_LE_DISCOVERY,
3365 adapter->dev_id, sizeof(cp), &cp,
3366 stop_le_discovery_complete, adapter, NULL);
3369 #ifdef TIZEN_FEATURE_PLATFROM_SCAN_FILTER
3370 static void addr_filter_params_free(gpointer data)
3372 adapter_le_address_filter_params_t *params = data;
3377 static void uuid_filter_params_free(gpointer data)
3379 adapter_le_uuid_params_t *params = data;
3381 g_free((char *)params->uuid);
3382 g_free((char *)params->uuid_mask);
3386 static void manufacturer_filter_params_free(gpointer data)
3388 adapter_le_manf_data_params_t *params = data;
3390 g_free((char *)params->man_data);
3391 g_free((char *)params->man_data_mask);
3395 static void local_name_filter_params_free(gpointer data)
3397 adapter_le_local_name_params_t *params = data;
3399 g_free((char *)params->local_name);
3403 static void service_data_filter_params_free(gpointer data)
3405 adapter_le_service_data_params_t *params = data;
3407 g_free((char *)params->service_data);
3408 g_free((char *)params->service_data_mask);
3412 static void scan_filter_params_free(gpointer data)
3414 adapter_le_scan_filter_param_t *params = data;
3418 int adapter_le_address_cmp(gconstpointer a, gconstpointer b)
3420 const adapter_le_address_filter_params_t *params = a;
3421 const char *address = b;
3424 ba2str(¶ms->broadcaster_addr, addr);
3425 return strcasecmp(addr, address);
3428 int adapter_le_uuid_cmp(gconstpointer a, gconstpointer b)
3430 const adapter_le_uuid_params_t *params = a;
3431 const char *uuid = b;
3433 return strcasecmp((const char *)params->uuid, uuid);
3436 int adapter_le_manufacturer_data_cmp(gconstpointer a, gconstpointer b)
3438 const adapter_le_manf_data_params_t *params = a;
3439 const struct eir_msd *msd = b;
3441 if (msd->company == params->company_id) {
3442 /* if the advertisiement packet is an iBeacon */
3443 if (msd->company == COMPANY_ID_APPLE)
3445 return strncasecmp((const char *)params->man_data,
3446 (const char *)msd->data,
3447 params->man_data_len);
3453 int adapter_le_local_name_cmp(gconstpointer a, gconstpointer b)
3455 const adapter_le_local_name_params_t *params = a;
3456 const char *name = b;
3458 return strcasecmp(params->local_name, name);
3461 int adapter_le_service_data_cmp(gconstpointer a, gconstpointer b)
3463 const adapter_le_service_data_params_t *params = a;
3464 const struct eir_sd *sd = b;
3465 /* Todo, the service data format for 16 bit, 32bit and
3466 * 128 bit uuids needs to addressed */
3467 return strncasecmp((const char *)(params->service_data),
3468 (const char *)sd->data,
3472 int adapter_le_address_filter_index_cmp(gconstpointer a, gconstpointer b)
3474 const adapter_le_address_filter_params_t *params = a;
3475 uint16_t filter_inex = GPOINTER_TO_UINT(b);
3477 return params->filter_index - filter_inex;
3480 int adapter_le_uuid_filter_index_cmp(gconstpointer a, gconstpointer b)
3482 const adapter_le_uuid_params_t *params = a;
3483 uint16_t filter_inex = GPOINTER_TO_UINT(b);
3485 return params->filter_index - filter_inex;
3488 int adapter_le_manufacturer_data_filter_index_cmp(gconstpointer a, gconstpointer b)
3490 const adapter_le_manf_data_params_t *params = a;
3491 uint16_t filter_inex = GPOINTER_TO_UINT(b);
3493 return params->filter_index - filter_inex;
3496 int adapter_le_local_name_filter_index_cmp(gconstpointer a, gconstpointer b)
3498 const adapter_le_local_name_params_t *params = a;
3499 uint16_t filter_inex = GPOINTER_TO_UINT(b);
3501 return params->filter_index - filter_inex;
3504 int adapter_le_service_data_filter_index_cmp(gconstpointer a, gconstpointer b)
3506 const adapter_le_service_data_params_t *params = a;
3507 uint16_t filter_inex = GPOINTER_TO_UINT(b);
3509 return params->filter_index - filter_inex;
3512 int adapter_le_scan_params_filter_index_cmp(gconstpointer a, gconstpointer b)
3514 const adapter_le_scan_filter_param_t *params = a;
3515 uint16_t filter_inex = GPOINTER_TO_UINT(b);
3517 return params->index - filter_inex;
3520 static gboolean adapter_le_clear_platform_scan_filter_data(
3521 struct btd_adapter *adapter, int filter_index)
3528 list = g_slist_find_custom(adapter->addr_filters,
3529 GINT_TO_POINTER(filter_index), adapter_le_address_filter_index_cmp);
3530 if (list && list->data) {
3531 /* Delete info from the struct to list */
3532 adapter->addr_filters = g_slist_delete_link(adapter->addr_filters, list);
3534 list = g_slist_find_custom(adapter->service_data_changed_filters,
3535 GINT_TO_POINTER(filter_index), adapter_le_service_data_filter_index_cmp);
3536 if (list && list->data) {
3537 /* Delete info from the struct to list */
3538 adapter->service_data_changed_filters = g_slist_delete_link(adapter->service_data_changed_filters, list);
3541 list = g_slist_find_custom(adapter->service_uuid_filters,
3542 GINT_TO_POINTER(filter_index), adapter_le_uuid_filter_index_cmp);
3543 if (list && list->data) {
3544 /* Delete info from the struct to list */
3545 adapter->service_uuid_filters = g_slist_delete_link(adapter->service_uuid_filters, list);
3548 list = g_slist_find_custom(adapter->solicit_data_filters,
3549 GINT_TO_POINTER(filter_index), adapter_le_uuid_filter_index_cmp);
3550 if (list && list->data) {
3551 /* Delete info from the struct to list */
3552 adapter->solicit_data_filters = g_slist_delete_link(adapter->solicit_data_filters, list);
3555 list = g_slist_find_custom(adapter->local_name_filters,
3556 GINT_TO_POINTER(filter_index), adapter_le_local_name_filter_index_cmp);
3557 if (list && list->data) {
3558 /* Delete info from the struct to list */
3559 adapter->local_name_filters = g_slist_delete_link(adapter->local_name_filters, list);
3562 list = g_slist_find_custom(adapter->manufaturer_data_filters,
3563 GINT_TO_POINTER(filter_index), adapter_le_manufacturer_data_filter_index_cmp);
3564 if (list && list->data) {
3565 /* Delete info from the struct to list */
3566 adapter->manufaturer_data_filters = g_slist_delete_link(adapter->manufaturer_data_filters, list);
3569 list = g_slist_find_custom(adapter->service_data_filters,
3570 GINT_TO_POINTER(filter_index), adapter_le_service_data_filter_index_cmp);
3571 if (list && list->data) {
3572 /* Delete info from the struct to list */
3573 adapter->service_data_filters = g_slist_delete_link(adapter->service_data_filters, list);
3576 list = g_slist_find_custom(adapter->scan_params,
3577 GINT_TO_POINTER(filter_index), adapter_le_scan_params_filter_index_cmp);
3578 if (list && list->data) {
3579 /* Delete info from the struct to list */
3580 adapter->scan_params = g_slist_delete_link(adapter->scan_params, list);
3586 static gboolean adapter_le_enable_platform_scan_filtering(
3587 struct btd_adapter *adapter, gboolean enable)
3592 DBG("Platform scan filtering enable[%d]", enable);
3594 adapter->scan_filter_support = enable;
3600 static gboolean adapter_le_service_add_addr_scan_filter_data(struct btd_adapter *adapter,
3601 int filter_index, gchar *string, int addr_type)
3603 /* TYPE_DEVICE_ADDRESS */
3604 adapter_le_address_filter_params_t *params;
3608 params = g_new0(adapter_le_address_filter_params_t, 1);
3612 params->filter_index = filter_index;
3613 str2ba(string, ¶ms->broadcaster_addr);
3614 params->bdaddr_type = addr_type;
3616 /* Store the struct to list */
3617 adapter->addr_filters = g_slist_append(adapter->addr_filters, params);
3621 static const char *adapter_le_service_find_addr_scan_filter_data(
3622 struct btd_adapter *adapter, gchar *string)
3627 list = g_slist_find_custom(adapter->addr_filters, string, adapter_le_address_cmp);
3636 static gboolean adapter_le_service_delete_addr_scan_filter_data(struct btd_adapter *adapter,
3637 int filter_index, gchar *string, int addr_type)
3642 list = g_slist_find_custom(adapter->addr_filters, string, adapter_le_address_cmp);
3646 /* Delete info from the struct to list */
3647 adapter->addr_filters = g_slist_delete_link(adapter->addr_filters, list);
3652 static gboolean adapter_le_service_clear_addr_scan_filter_data(struct btd_adapter *adapter)
3656 g_slist_free_full(adapter->addr_filters, addr_filter_params_free);
3657 adapter->addr_filters = NULL;
3662 static gboolean adapter_le_service_add_uuid_scan_filter_data(struct btd_adapter *adapter,
3663 int filter_index, gboolean is_solicited, uint8_t *p_uuid,
3664 uint8_t *p_uuid_mask, int uuid_mask_len)
3667 adapter_le_uuid_params_t *params;
3672 params = g_new0(adapter_le_uuid_params_t, 1);
3676 if (uuid_mask_len == UUID_16_LEN) {
3677 uint16_t *uuid16 = (void *)p_uuid;
3678 sdp_uuid16_create((uuid_t *)&uuid, get_be16(uuid16));
3679 } else if (uuid_mask_len == UUID_32_LEN) {
3680 uint32_t *uuid32 = (void *)p_uuid;
3681 sdp_uuid32_create((uuid_t *)&uuid, get_be32(uuid32));
3683 sdp_uuid128_create((uuid_t *)&uuid, p_uuid);
3685 params->filter_index = filter_index;
3686 params->uuid = (uint8_t *)bt_uuid2string((uuid_t *)&uuid);
3687 params->uuid_mask = g_new0(uint8_t, uuid_mask_len);
3688 memcpy(params->uuid_mask, p_uuid_mask, uuid_mask_len);
3689 params->uuid_len = uuid_mask_len;
3691 /* Store the struct to list */
3692 adapter->solicit_data_filters = g_slist_append(adapter->solicit_data_filters, params);
3697 static adapter_le_uuid_params_t *adapter_le_service_find_uuid_scan_filter_data(struct btd_adapter *adapter,
3703 list = g_slist_find_custom(adapter->solicit_data_filters, p_uuid, adapter_le_uuid_cmp);
3707 /* Delete info from the struct to list */
3713 static gboolean adapter_le_service_delete_uuid_scan_filter_data(struct btd_adapter *adapter,
3714 int filter_index, gboolean is_solicited, uint8_t *p_uuid,
3715 uint8_t *p_uuid_mask, int uuid_mask_len)
3720 list = g_slist_find_custom(adapter->solicit_data_filters, GINT_TO_POINTER(filter_index), adapter_le_uuid_filter_index_cmp);
3724 adapter_le_uuid_params_t *params = list->data;
3725 /* Delete info from the struct to list */
3726 if (params && strcasecmp((const char *)params->uuid, (const char *)p_uuid)) {
3727 adapter->solicit_data_filters = g_slist_delete_link(adapter->solicit_data_filters, list);
3734 static gboolean adapter_le_service_clear_uuid_scan_filter_data(struct btd_adapter *adapter)
3738 g_slist_free_full(adapter->solicit_data_filters, uuid_filter_params_free);
3739 adapter->solicit_data_filters = NULL;
3744 static gboolean adapter_le_service_add_manufacturer_scan_filter_data(struct btd_adapter *adapter,
3745 int filter_index, int company_id, int company_id_mask,
3746 uint8_t *p_data, uint8_t *p_mask, int data_len)
3749 adapter_le_manf_data_params_t *params;
3753 params = g_new0(adapter_le_manf_data_params_t, 1);
3757 params->filter_index = filter_index;
3758 params->company_id = company_id;
3759 params->company_id_mask = company_id_mask;
3760 params->man_data = g_new0(uint8_t, data_len);
3761 memcpy(params->man_data, p_data, data_len);
3762 params->man_data_mask = g_new0(uint8_t, data_len);
3763 memcpy(params->man_data_mask, p_mask, data_len);
3764 params->man_data_len = data_len;
3766 /* Store the struct to list */
3767 adapter->manufaturer_data_filters = g_slist_append(adapter->manufaturer_data_filters, params);
3772 static adapter_le_manf_data_params_t *adapter_le_service_find_manufacturer_scan_filter_data(struct btd_adapter *adapter,
3773 struct eir_msd *msd)
3777 list = g_slist_find_custom(adapter->manufaturer_data_filters, msd, adapter_le_manufacturer_data_cmp);
3786 static gboolean adapter_le_service_delete_manufacturer_scan_filter_data(struct btd_adapter *adapter,
3787 int filter_index, int company_id, int company_id_mask,
3788 uint8_t *p_data, uint8_t *p_mask, int data_len)
3792 list = g_slist_find_custom(adapter->manufaturer_data_filters, GINT_TO_POINTER(filter_index), adapter_le_manufacturer_data_filter_index_cmp);
3796 adapter_le_manf_data_params_t *params = list->data;
3797 /* Delete info from the struct to list */
3798 if (params && strcasecmp((const char *)params->man_data, (const char *)p_data)) {
3799 adapter->manufaturer_data_filters = g_slist_delete_link(adapter->manufaturer_data_filters, list);
3806 static gboolean adapter_le_service_clear_manufacturer_scan_filter_data(struct btd_adapter *adapter)
3810 g_slist_free_full(adapter->manufaturer_data_filters, manufacturer_filter_params_free);
3811 adapter->manufaturer_data_filters = NULL;
3816 static gboolean adapter_le_service_add_local_name_scan_filter_data(struct btd_adapter *adapter,
3817 int filter_index, gchar *name)
3820 adapter_le_local_name_params_t *params;
3824 params = g_new0(adapter_le_local_name_params_t, 1);
3828 params->filter_index = filter_index;
3829 params->local_name = g_strdup(name);
3830 params->name_len = strlen(name);
3832 /* Store the struct to list */
3833 adapter->local_name_filters = g_slist_append(adapter->local_name_filters, params);
3838 static adapter_le_local_name_params_t *adapter_le_service_find_local_name_scan_filter_data(
3839 struct btd_adapter *adapter,
3844 list = g_slist_find_custom(adapter->local_name_filters, name, adapter_le_local_name_cmp);
3853 static gboolean adapter_le_service_delete_local_name_scan_filter_data(struct btd_adapter *adapter,
3854 int filter_index, gchar *name)
3858 list = g_slist_find_custom(adapter->local_name_filters, GINT_TO_POINTER(filter_index), adapter_le_local_name_filter_index_cmp);
3862 adapter_le_local_name_params_t *params = list->data;
3863 /* Delete info from the struct to list */
3864 if (params && strcasecmp((const char *)params->local_name, (const char *)name)) {
3865 adapter->local_name_filters = g_slist_delete_link(adapter->local_name_filters, list);
3872 static gboolean adapter_le_service_clear_local_name_scan_filter_data(struct btd_adapter *adapter)
3876 g_slist_free_full(adapter->local_name_filters, local_name_filter_params_free);
3877 adapter->local_name_filters = NULL;
3882 static gboolean adapter_le_service_add_service_scan_filter_data(struct btd_adapter *adapter,
3883 int filter_index, uint8_t *p_data, uint8_t *p_mask, int data_len)
3885 adapter_le_service_data_params_t *params;
3889 params = g_new0(adapter_le_service_data_params_t, 1);
3893 params->filter_index = filter_index;
3894 params->service_data = g_new0(uint8_t, data_len);
3895 memcpy(params->service_data, p_data, data_len);
3896 params->service_data_mask = g_new0(uint8_t, data_len);
3897 memcpy(params->service_data_mask, p_mask, data_len);
3898 params->service_data_len = data_len;
3900 /* Store the struct to list */
3901 adapter->service_data_filters = g_slist_append(adapter->service_data_filters, params);
3906 static adapter_le_service_data_params_t* adapter_le_service_find_service_scan_filter_data(
3907 struct btd_adapter *adapter, struct eir_sd *sd)
3912 list = g_slist_find_custom(adapter->service_data_filters, sd, adapter_le_service_data_cmp);
3921 static gboolean adapter_le_service_delete_service_scan_filter_data(struct btd_adapter *adapter,
3922 int filter_index, uint8_t *p_data, uint8_t *p_mask, int data_len)
3927 list = g_slist_find_custom(adapter->service_data_filters, GINT_TO_POINTER(filter_index), adapter_le_service_data_filter_index_cmp);
3931 adapter_le_service_data_params_t *params = list->data;
3932 /* Delete info from the struct to list */
3933 if (params && strcasecmp((const char *)params->service_data, (const char *)p_data)) {
3934 adapter->service_data_filters = g_slist_delete_link(adapter->service_data_filters, list);
3940 static gboolean adapter_le_service_clear_service_scan_filter_data(struct btd_adapter *adapter)
3944 g_slist_free_full(adapter->service_data_filters, service_data_filter_params_free);
3945 adapter->service_data_filters = NULL;
3950 static gboolean adapter_le_service_add_scan_filter_params(struct btd_adapter *adapter,
3951 adapter_le_scan_filter_param_t *params)
3953 adapter_le_scan_filter_param_t *l_params;
3957 l_params = g_new0(adapter_le_scan_filter_param_t, 1);
3961 l_params->action = params->action;
3962 l_params->delivery_mode = params->delivery_mode;
3963 l_params->feature = params->feature;
3964 l_params->filter_logic_type = params->filter_logic_type;
3965 l_params->index = params->index;
3966 l_params->list_logic_type = params->list_logic_type;
3967 l_params->onfound_timeout = params->onfound_timeout;
3968 l_params->onfound_timeout_cnt = params->onfound_timeout_cnt;
3969 l_params->rssi_high_threshold = params->rssi_high_threshold;
3970 l_params->rssi_low_threshold = params->rssi_low_threshold;
3972 /* Store the struct to list */
3973 adapter->scan_params = g_slist_append(adapter->scan_params, l_params);
3978 static adapter_le_scan_filter_param_t *adapter_le_service_find_scan_filter_params(
3979 struct btd_adapter *adapter, int filter_index)
3984 list = g_slist_find_custom(adapter->scan_params, GINT_TO_POINTER(filter_index), adapter_le_scan_params_filter_index_cmp);
3993 static gboolean adapter_le_service_delete_scan_filter_params(struct btd_adapter *adapter,
3994 adapter_le_scan_filter_param_t *params)
3999 list = g_slist_find_custom(adapter->scan_params, GINT_TO_POINTER(params->index), adapter_le_scan_params_filter_index_cmp);
4003 adapter->scan_params = g_slist_remove(adapter->scan_params, list);
4008 static gboolean adapter_le_service_clear_scan_filter_params(struct btd_adapter *adapter)
4012 g_slist_free_full(adapter->scan_params, scan_filter_params_free);
4013 adapter->scan_params = NULL;
4018 int adapter_byte_arr_cmp_with_mask(const char *data1, const char *data2,
4019 const char *mask, int data_len)
4023 if (data1 == NULL || data2 == NULL || mask == NULL)
4025 for (i = 0; i < data_len; i++) {
4026 a = data1[i] & mask[i];
4027 b = data2[i] & mask[i];
4029 return (int)(a - b);
4034 static uint8_t validate_for_filter_policy(struct btd_adapter *adapter,
4035 const struct eir_data *eir, gchar *addr)
4037 uint8_t allow_report = NONE_REPORT;
4039 if (adapter->scan_filter_support == FALSE)
4040 allow_report = SCAN_REPORT;
4042 if (adapter_le_service_find_addr_scan_filter_data(adapter, addr))
4043 allow_report = SCAN_REPORT;
4045 if(adapter_le_service_find_local_name_scan_filter_data(adapter, eir->name))
4046 allow_report = SCAN_REPORT;
4049 GSList *list = NULL;
4050 for (list = eir->sd_list; list != NULL; list = g_slist_next(list)) {
4051 struct eir_sd *sd = list->data;
4053 static adapter_le_uuid_params_t *uuid_data = NULL;
4054 static adapter_le_service_data_params_t *service_data = NULL;
4055 static adapter_le_scan_filter_param_t *scan_param_data = NULL;
4056 uuid_data = adapter_le_service_find_uuid_scan_filter_data(adapter, (uint8_t *)sd->uuid);
4057 service_data = adapter_le_service_find_service_scan_filter_data(adapter, sd);
4058 if (service_data != NULL) {
4059 if (!adapter_byte_arr_cmp_with_mask((const char *)service_data->service_data,
4060 (const char *)sd->data, (const char *)service_data->service_data_mask,
4061 service_data->service_data_len)) {
4062 scan_param_data = adapter_le_service_find_scan_filter_params(adapter,
4063 service_data->filter_index);
4064 if (scan_param_data && scan_param_data->rssi_high_threshold > eir->tx_power &&
4065 scan_param_data->rssi_low_threshold < eir->tx_power)
4066 allow_report = SCAN_REPORT;
4069 if (uuid_data != NULL) {
4070 if (!adapter_byte_arr_cmp_with_mask((const char *)uuid_data->uuid,
4071 (const char *)sd->uuid, (const char *)uuid_data->uuid_mask,
4072 uuid_data->uuid_len)) {
4073 scan_param_data = adapter_le_service_find_scan_filter_params(adapter,
4074 uuid_data->filter_index);
4075 if (scan_param_data && scan_param_data->rssi_high_threshold > eir->tx_power &&
4076 scan_param_data->rssi_low_threshold < eir->tx_power)
4077 allow_report = SCAN_REPORT;
4085 if (eir->msd_list) {
4086 GSList *list = NULL;
4087 for (list = eir->msd_list; list != NULL; list = g_slist_next(list)) {
4088 struct eir_msd *msd = list->data;
4090 static adapter_le_manf_data_params_t *manuf_data;
4091 static adapter_le_scan_filter_param_t *scan_param_data = NULL;
4092 manuf_data = adapter_le_service_find_manufacturer_scan_filter_data(adapter,
4094 if (manuf_data != NULL) {
4095 if (!adapter_byte_arr_cmp_with_mask((const char *)msd->data,
4096 (const char *)manuf_data->man_data, (const char *)manuf_data->man_data_mask,
4097 manuf_data->man_data_len)) {
4098 scan_param_data = adapter_le_service_find_scan_filter_params(adapter,
4099 manuf_data->filter_index);
4100 if (scan_param_data && scan_param_data->rssi_high_threshold > eir->tx_power &&
4101 scan_param_data->rssi_low_threshold < eir->tx_power)
4102 allow_report = SCAN_REPORT;
4104 if (msd->company == COMPANY_ID_APPLE)
4105 allow_report = IBEACON_REPORT;
4111 return allow_report;
4114 gboolean adapter_le_set_platform_scan_filter_params(struct btd_adapter *adapter,
4115 adapter_le_scan_filter_param_t *params)
4117 gboolean ret = TRUE;
4118 DBG("adapter_le_scan_filter_param_t [%d]", params->index);
4119 adapter_le_scan_filter_action_type action_type = params->action;
4121 if (action_type == ADD) {
4122 ret = adapter_le_service_add_scan_filter_params(adapter, params);
4123 } else if (action_type == DELETE) {
4124 ret = adapter_le_service_delete_scan_filter_params(adapter, params);
4125 } else if (action_type == CLEAR) {
4126 ret = adapter_le_service_clear_scan_filter_params(adapter);
4128 DBG("filter_action error");
4132 DBG("Scan Filter VSC :: Action [%x]",
4137 gboolean adapter_le_set_platform_scan_filter_data(struct btd_adapter *adapter,
4138 int client_if, int action,
4139 int filt_type, int filter_index,
4141 int company_id_mask,
4142 int uuid_len, uint8_t *p_uuid,
4143 int uuid_mask_len, uint8_t *p_uuid_mask,
4144 gchar *string, int addr_type,
4145 int data_len, uint8_t *p_data,
4146 int mask_len, uint8_t *p_mask)
4148 gboolean ret = TRUE;
4152 switch (filt_type) {
4153 case TYPE_DEVICE_ADDRESS: {
4154 /* TYPE_DEVICE_ADDRESS */
4155 adapter_le_scan_filter_action_type action_type = action;
4157 if (action_type == ADD) {
4158 ret = adapter_le_service_add_addr_scan_filter_data(adapter,
4159 filter_index, string, addr_type);
4160 } else if (action_type == DELETE) {
4161 ret = adapter_le_service_delete_addr_scan_filter_data(adapter,
4162 filter_index, string, addr_type);
4163 } else if (action_type == CLEAR) {
4164 ret = adapter_le_service_clear_addr_scan_filter_data(adapter);
4166 DBG("filter_action error");
4173 case TYPE_SERVICE_UUID:
4174 case TYPE_SOLICIT_UUID: {
4175 adapter_le_scan_filter_action_type action_type = action;
4177 gboolean is_solicited = (filt_type == TYPE_SOLICIT_UUID) ? TRUE : FALSE;
4179 if (uuid_len != UUID_16_LEN && uuid_len != UUID_32_LEN
4180 && uuid_len != UUID_128_LEN) {
4181 DBG("UUID length error");
4185 if (uuid_len != uuid_mask_len) {
4186 DBG("Both UUID and UUID_MASK length shoule be samed");
4190 if (action_type == ADD) {
4191 ret = adapter_le_service_add_uuid_scan_filter_data(adapter,
4192 filter_index, is_solicited, p_uuid,
4193 p_uuid_mask, uuid_len);
4194 } else if (action_type == DELETE) {
4195 ret = adapter_le_service_delete_uuid_scan_filter_data(adapter,
4196 filter_index, is_solicited, p_uuid,
4197 p_uuid_mask, uuid_len);
4198 } else if (action_type == CLEAR) {
4199 ret = adapter_le_service_clear_uuid_scan_filter_data(adapter);
4201 DBG("filter_action error");
4208 case TYPE_LOCAL_NAME: {
4209 adapter_le_scan_filter_action_type action_type = action;
4211 if (action_type == ADD) {
4212 ret = adapter_le_service_add_local_name_scan_filter_data(adapter,
4213 filter_index, (gchar*)string);
4214 } else if (action_type == DELETE) {
4215 ret = adapter_le_service_delete_local_name_scan_filter_data(adapter,
4216 filter_index, (gchar*)string);
4217 } else if (action_type == CLEAR) {
4218 ret = adapter_le_service_clear_local_name_scan_filter_data(adapter);
4220 DBG("filter_action error");
4227 case TYPE_MANUFACTURER_DATA: {
4228 adapter_le_scan_filter_action_type action_type = action;
4230 if (data_len == 0 || (data_len != mask_len)) {
4231 DBG("parameter length error");
4235 if (action_type == ADD) {
4236 ret = adapter_le_service_add_manufacturer_scan_filter_data(adapter,
4237 filter_index,company_id, company_id_mask, p_data, p_mask, data_len);
4238 } else if (action_type == DELETE) {
4239 ret = adapter_le_service_delete_manufacturer_scan_filter_data(adapter,
4240 filter_index, company_id, company_id_mask, p_data, p_mask, data_len);
4241 } else if (action_type == CLEAR) {
4242 ret = adapter_le_service_clear_manufacturer_scan_filter_data(adapter);
4244 DBG("filter_action error");
4251 case TYPE_SERVICE_DATA: {
4252 adapter_le_scan_filter_action_type action_type = action;
4254 if (data_len == 0 || (data_len != mask_len)) {
4255 DBG("parameter length error");
4259 if (action_type == ADD) {
4260 ret = adapter_le_service_add_service_scan_filter_data(adapter,
4261 filter_index, p_data, p_mask, data_len);
4262 } else if (action_type == DELETE) {
4263 ret = adapter_le_service_delete_service_scan_filter_data(adapter,
4264 filter_index, p_data, p_mask, data_len);
4265 } else if (action_type == CLEAR) {
4266 ret = adapter_le_service_clear_service_scan_filter_data(adapter);
4268 DBG("filter_action error");
4276 DBG("filter_type error");
4284 static int set_adv_data_flag(uint8_t *adv_data, uint8_t *data, int data_len, void *user_data)
4286 struct btd_adapter *adapter = user_data;
4289 adv_data[1] = EIR_FLAGS;
4291 if (adapter->le_static_addr.b[5] != 0)
4292 adv_data[2] = EIR_GEN_DISC | EIR_CONTROLLER |
4293 EIR_SIM_HOST | EIR_BREDR_UNSUP;
4295 adv_data[2] = EIR_GEN_DISC | EIR_CONTROLLER | EIR_SIM_HOST;
4297 memcpy(adv_data + 3, data, data_len);
4298 return data_len + 3;
4301 static int set_adv_data_device_name(uint8_t *adv_data, int adv_len, char *name)
4307 uint8_t *data = NULL;
4312 data = g_memdup(adv_data, adv_len);
4316 name_len = strlen(name);
4318 for (i = 0; i <adv_len ; i++) {
4320 ad_type = data[i + 1];
4322 if (ad_type == EIR_NAME_COMPLETE) {
4323 /* Move to last position and update local name */
4324 for (j = i; j < adv_len - 2; j++)
4325 adv_data[j] = data[j + 2];
4327 adv_data[j] = name_len + 1;
4328 if (name_len > ADV_DATA_MAX_LENGTH - adv_len) {
4329 adv_data[j] = ADV_DATA_MAX_LENGTH - adv_len + 1;
4330 adv_data[j + 1] = EIR_NAME_SHORT;
4331 memcpy(adv_data + j + 2, name, ADV_DATA_MAX_LENGTH - adv_len);
4333 return ADV_DATA_MAX_LENGTH;
4335 adv_data[j + 1] = EIR_NAME_COMPLETE;
4336 memcpy(adv_data + j + 2, name, name_len);
4338 return adv_len + name_len;
4342 memcpy(adv_data + i, &data[i], ad_len + 1);
4351 static int set_adv_data_tx_power(uint8_t *adv_data, int adv_len, int8_t tx_power)
4356 uint8_t *data = NULL;
4358 data = g_memdup(adv_data, adv_len);
4362 for (i = 0; i <adv_len ; i++) {
4364 ad_type = data[i + 1];
4366 if (ad_type == EIR_TX_POWER) {
4368 adv_data[i + 1] = EIR_TX_POWER;
4369 adv_data[i + 2] = tx_power;
4371 for(j = i + 2; j < adv_len; j++)
4372 adv_data[j + 1] = data[j];
4377 memcpy(adv_data + i, &data[i], ad_len + 1);
4387 static int adapter_le_set_missed_adv_data(uint8_t *p_data, uint8_t data_len,
4388 gboolean is_scan_rsp, char *adapter_name, int8_t tx_power, uint8_t **adv_data, int *adv_len,
4394 data = g_malloc0(ADV_DATA_MAX_LENGTH);
4395 memcpy(data, p_data, data_len);
4398 /* In case multi advertising, need to update the below AD type
4399 since it handled into kernel */
4401 len = set_adv_data_flag(data, p_data, data_len, user_data);
4404 len = set_adv_data_tx_power(data, len, tx_power);
4406 len = set_adv_data_device_name(data, len, adapter_name);
4413 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
4414 static DBusMessage *adapter_get_psm_l2cap_le(DBusConnection *conn,
4415 DBusMessage *msg, void *user_data)
4417 return get_psm_l2cap_le(conn, msg);
4420 static DBusMessage *adapter_listen_l2cap_le_socket(DBusConnection *conn,
4421 DBusMessage *msg, void *user_data)
4423 return listen_l2cap_le_socket(conn, msg, user_data);
4426 static DBusMessage *adapter_remove_l2cap_le_socket(DBusConnection *conn,
4427 DBusMessage *msg, void *user_data)
4429 return remove_l2cap_le_socket(conn, msg);
4434 static DBusMessage *adapter_start_custom_discovery(DBusConnection *conn,
4435 DBusMessage *msg, void *user_data)
4437 struct btd_adapter *adapter = user_data;
4438 const char *sender = dbus_message_get_sender(msg);
4439 struct discovery_client *client;
4441 const gchar *disc_type;
4443 DBG("sender %s", sender);
4445 if (!(adapter->current_settings & MGMT_SETTING_POWERED))
4446 return btd_error_not_ready(msg);
4448 if (!dbus_message_get_args(msg, NULL, DBUS_TYPE_STRING, &disc_type,
4449 DBUS_TYPE_INVALID)) {
4450 return btd_error_invalid_args(msg);
4453 DBG("discovery type = %s", disc_type);
4455 /*Valid strings: "BREDR", "LE", "LE_BREDR" */
4456 if (g_strcmp0(disc_type, "BREDR") == 0)
4457 adapter->disc_type = BT_DISC_TYPE_BREDR_ONLY;
4458 else if (g_strcmp0(disc_type, "LE") == 0)
4459 adapter->disc_type = BT_DISC_TYPE_LE_ONLY;
4460 else if (g_strcmp0(disc_type, "LE_BREDR") == 0)
4461 adapter->disc_type = BT_DISC_TYPE_LE_BREDR;
4463 return btd_error_invalid_args(msg);
4466 * Every client can only start one discovery, if the client
4467 * already started a discovery then return an error.
4469 list = g_slist_find_custom(adapter->discovery_list, sender,
4472 return btd_error_busy(msg);
4474 client = g_new0(struct discovery_client, 1);
4476 client->adapter = adapter;
4477 client->owner = g_strdup(sender);
4478 client->watch = g_dbus_add_disconnect_watch(dbus_conn, sender,
4479 discovery_disconnect, client,
4482 adapter->discovery_list = g_slist_prepend(adapter->discovery_list,
4486 * Just trigger the discovery here. In case an already running
4487 * discovery in idle phase exists, it will be restarted right
4490 trigger_start_discovery(adapter, 0);
4492 return dbus_message_new_method_return(msg);
4495 static DBusMessage *adapter_start_le_discovery(DBusConnection *conn,
4496 DBusMessage *msg, void *user_data)
4498 struct btd_adapter *adapter = user_data;
4499 const char *sender = dbus_message_get_sender(msg);
4500 struct discovery_client *client;
4503 DBG("sender %s", sender);
4505 if (!(adapter->current_settings & MGMT_SETTING_POWERED))
4506 return btd_error_not_ready(msg);
4509 * Every client can only start one discovery, if the client
4510 * already started a discovery then return an error.
4513 adapter->disc_type = BT_DISC_TYPE_LE_ONLY;
4514 DBG("adapter->disc_type[%d]", adapter->disc_type);
4515 DBG("adapter->discovery_type [%d]", adapter->discovery_type);
4517 list = g_slist_find_custom(adapter->le_discovery_list, sender,
4520 return btd_error_busy(msg);
4522 client = g_new0(struct discovery_client, 1);
4524 client->adapter = adapter;
4525 client->owner = g_strdup(sender);
4526 client->watch = g_dbus_add_disconnect_watch(dbus_conn, sender,
4527 le_discovery_disconnect, client,
4528 le_discovery_destroy);
4530 adapter->le_discovery_list = g_slist_prepend(adapter->le_discovery_list,
4534 * Just trigger the discovery here. In case an already running
4535 * discovery in idle phase exists, it will be restarted right
4538 trigger_start_le_discovery(adapter, 0);
4540 return dbus_message_new_method_return(msg);
4543 static DBusMessage *adapter_stop_le_discovery(DBusConnection *conn,
4544 DBusMessage *msg, void *user_data)
4546 struct btd_adapter *adapter = user_data;
4547 const char *sender = dbus_message_get_sender(msg);
4548 struct mgmt_cp_stop_le_discovery cp;
4549 struct discovery_client *client;
4552 DBG("sender %s", sender);
4554 if (adapter->le_discovery_idle_timeout > 0) {
4555 DBG("Remove LE scan trigger");
4556 g_source_remove(adapter->le_discovery_idle_timeout);
4557 adapter->le_discovery_idle_timeout = 0;
4560 if (!(adapter->current_settings & MGMT_SETTING_POWERED))
4561 return btd_error_not_ready(msg);
4563 list = g_slist_find_custom(adapter->le_discovery_list, sender,
4566 return btd_error_failed(msg, "No discovery started");
4568 client = list->data;
4570 adapter->disc_type = BT_DISC_TYPE_LE_ONLY;
4571 DBG("adapter->disc_type[%d]", adapter->disc_type);
4572 DBG("adapter->discovery_type [%d]", adapter->discovery_type);
4574 cp.type = adapter->discovery_type;
4575 DBG("cp.type %d", cp.type);
4578 * As long as other discovery clients are still active, just
4579 * clenup client info and return success.
4581 DBG("adapter->le_discovery_list %p", adapter->le_discovery_list);
4582 if (g_slist_next(adapter->le_discovery_list)) {
4584 * The destroy function will cleanup the client information and
4585 * also remove it from the list of discovery clients.
4587 g_dbus_remove_watch(dbus_conn, client->watch);
4588 return dbus_message_new_method_return(msg);
4592 * In the idle phase of a discovery, there is no need to stop it
4593 * and so it is enough to send out the signal and just return.
4595 DBG("cp.type %d", cp.type);
4596 DBG("adapter->discovery_enable %d", adapter->discovery_enable);
4597 if (adapter->discovery_enable == 0x00) {
4598 adapter->le_discovering = false;
4599 g_dbus_remove_watch(dbus_conn, client->watch);
4600 g_dbus_emit_property_changed(dbus_conn, adapter->path,
4601 ADAPTER_INTERFACE, "LEDiscovering");
4603 trigger_passive_scanning(adapter);
4604 return dbus_message_new_method_return(msg);
4607 DBG("adapter->discovery_type %d", adapter->discovery_type);
4609 DBG("cp.type %d", cp.type);
4610 mgmt_send(adapter->mgmt, MGMT_OP_STOP_LE_DISCOVERY,
4611 adapter->dev_id, sizeof(cp), &cp,
4612 stop_le_discovery_complete, adapter, NULL);
4614 client->msg = dbus_message_ref(msg);
4618 static DBusMessage *adapter_set_advertising(DBusConnection *conn,
4619 DBusMessage *msg, void *data)
4621 struct btd_adapter *adapter = data;
4623 dbus_bool_t enable = FALSE;
4624 dbus_int32_t slot_id;
4626 if (!(adapter->current_settings & MGMT_SETTING_POWERED))
4627 return btd_error_not_ready(msg);
4629 if (!dbus_message_get_args(msg, NULL, DBUS_TYPE_BOOLEAN, &enable,
4630 DBUS_TYPE_INT32, &slot_id,
4632 return btd_error_invalid_args(msg);
4634 if (adapter->adv_restart_timeout > 0)
4635 return btd_error_in_progress(msg);
4637 DBG("%s advertising slot_id %d", enable ? "Enable" : "Disable", slot_id);
4639 if (adapter_le_is_supported_multi_advertising() && slot_id > 0)
4640 err = adapter_le_enable_multi_adv(adapter, enable, slot_id);
4642 err = set_mode(adapter, MGMT_OP_SET_ADVERTISING, enable);
4645 return btd_error_failed(msg, "Set Advertising failed");
4648 create_advertiser(adapter, slot_id);
4650 if (err && slot_id > 0)
4651 advertising_state_changed(adapter, slot_id, enable);
4653 return dbus_message_new_method_return(msg);
4656 static DBusMessage *adapter_set_advertising_params(DBusConnection *conn,
4657 DBusMessage *msg, void *data)
4659 struct btd_adapter *adapter = data;
4660 struct mgmt_cp_set_advertising_params cp;
4661 dbus_uint32_t interval_min;
4662 dbus_uint32_t interval_max;
4663 dbus_uint32_t filter_policy;
4665 dbus_int32_t tx_power_level;
4666 dbus_int32_t slot_id;
4669 DBG("Set customised advertising parameters");
4671 if (!(adapter->current_settings & MGMT_SETTING_POWERED))
4672 return btd_error_not_ready(msg);
4674 if (!dbus_message_get_args(msg, NULL,
4675 DBUS_TYPE_UINT32, &interval_min,
4676 DBUS_TYPE_UINT32, &interval_max,
4677 DBUS_TYPE_UINT32, &filter_policy,
4678 DBUS_TYPE_UINT32, &type,
4679 DBUS_TYPE_INT32, &tx_power_level,
4680 DBUS_TYPE_INT32, &slot_id,
4682 return btd_error_invalid_args(msg);
4684 memset(&cp, 0, sizeof(cp));
4686 DBG("advertising interval min %x, max %x, filter %x type %x, tx power %d",
4687 interval_min, interval_max, filter_policy, type, tx_power_level);
4689 if (filter_policy > 0x03)
4690 return btd_error_invalid_args(msg);
4693 return btd_error_invalid_args(msg);
4695 if (adapter_le_is_supported_multi_advertising() && slot_id > 0) {
4696 adapter_le_adv_inst_info_t *p_inst;
4697 adapter_le_adv_param_t *p_params;
4699 p_inst = g_malloc0(sizeof(adapter_le_adv_inst_info_t));
4700 p_params = g_malloc0(sizeof(adapter_le_adv_param_t));
4701 p_inst->inst_id = slot_id;
4702 p_params->adv_int_min = interval_min;
4703 p_params->adv_int_max = interval_max;
4704 p_params->adv_type = type;
4705 p_params->channel_map = 0x07; /* fixed channel :: will be used all */
4706 p_params->adv_filter_policy = filter_policy;
4707 p_params->tx_power = tx_power_level;
4709 if (adapter->current_settings & MGMT_SETTING_PRIVACY) {
4710 p_inst->bdaddr_type = 0x01;
4711 bacpy(&p_inst->bdaddr, &adapter->rpa);
4712 } else if (adapter->le_static_addr.b[5] != 0) {
4713 p_inst->bdaddr_type = 0x01;
4714 bacpy(&p_inst->bdaddr, &adapter->le_static_addr);
4716 p_inst->bdaddr_type = 0x00;
4717 bacpy(&p_inst->bdaddr, &adapter->bdaddr);
4720 ret = adapter_le_set_multi_adv_params(p_inst, p_params);
4726 return dbus_message_new_method_return(msg);
4728 return btd_error_failed(msg, "set advertising param failed");
4730 cp.interval_max = interval_max;
4731 cp.interval_min = interval_min;
4732 cp.filter_policy = filter_policy;
4735 if (mgmt_send(adapter->mgmt, MGMT_OP_SET_ADVERTISING_PARAMS,
4736 adapter->dev_id, sizeof(cp), &cp,
4737 NULL, NULL, NULL) > 0)
4738 return dbus_message_new_method_return(msg);
4740 return btd_error_failed(msg, "set advertising param failed");
4744 static DBusMessage *adapter_set_advertising_data(DBusConnection *conn,
4745 DBusMessage *msg, void *data)
4747 struct btd_adapter *adapter = data;
4748 struct mgmt_cp_set_advertising_data cp;
4751 dbus_int32_t slot_id;
4752 uint8_t *adv_data = NULL;
4754 char *adapter_name = adapter->name;
4755 char le_name[MAX_NAME_LENGTH + 1] = { 0 };
4757 DBG("Set advertising data");
4759 if (!(adapter->current_settings & MGMT_SETTING_POWERED))
4760 return btd_error_not_ready(msg);
4762 if (!dbus_message_get_args(msg, NULL,
4763 DBUS_TYPE_ARRAY, DBUS_TYPE_BYTE, &value, &len,
4764 DBUS_TYPE_INT32, &slot_id,
4766 return btd_error_invalid_args(msg);
4768 if (len > ADV_DATA_MAX_LENGTH - 3)
4769 return btd_error_invalid_args(msg);
4771 if (adapter->le_static_addr.b[5] != 0) {
4774 g_strlcpy(le_name, adapter_name,
4775 sizeof(le_name) - LE_BEARER_POSTFIX_LEN);
4776 if (!g_utf8_validate(le_name, -1, (const char **)&ptr))
4779 g_strlcat(le_name, LE_BEARER_POSTFIX, sizeof(le_name));
4780 adapter_name = le_name;
4783 adapter_le_set_missed_adv_data(value, len, FALSE,
4784 adapter_name, adapter->adv_tx_power, &adv_data, &adv_len, adapter);
4786 if (adapter_le_is_supported_multi_advertising() && slot_id > 0) {
4787 if (adapter_le_set_multi_adv_data(slot_id, FALSE, adv_len, adv_data)) {
4789 return dbus_message_new_method_return(msg);
4792 return btd_error_failed(msg, "set advertising data failed");
4795 memcpy(&cp, adv_data, adv_len);
4797 if (mgmt_send(adapter->mgmt, MGMT_OP_SET_ADVERTISING_DATA,
4798 adapter->dev_id, adv_len,
4799 &cp, NULL, NULL, NULL) > 0) {
4801 return dbus_message_new_method_return(msg);
4805 return btd_error_failed(msg, "set advertising data failed");
4809 static DBusMessage *adapter_le_scan_filter_param_setup(DBusConnection *conn,
4810 DBusMessage *msg, void *data)
4812 struct btd_adapter *adapter = data;
4813 #ifdef TIZEN_FEATURE_PLATFROM_SCAN_FILTER
4814 dbus_bool_t ctlr_filter_support = TRUE;
4816 dbus_int32_t client_if, action, filt_index;
4817 dbus_int32_t feat_seln, list_logic_type, filt_logic_type;
4818 dbus_int32_t rssi_high_thres, rssi_low_thres, dely_mode;
4819 dbus_int32_t found_timeout, lost_timeout, found_timeout_cnt;
4820 adapter_le_scan_filter_param_t params;
4823 DBG("adapter_le_scan_filter_param_setup");
4825 if (!(adapter->current_settings & MGMT_SETTING_POWERED))
4826 return btd_error_not_ready(msg);
4828 if (adapter_le_get_scan_filter_size() == 0)
4829 #ifndef TIZEN_FEATURE_PLATFROM_SCAN_FILTER
4830 return btd_error_not_supported(msg);
4832 ctlr_filter_support = FALSE;
4835 if (!dbus_message_get_args(msg, NULL, DBUS_TYPE_INT32, &client_if,
4836 DBUS_TYPE_INT32, &action,
4837 DBUS_TYPE_INT32, &filt_index,
4838 DBUS_TYPE_INT32, &feat_seln,
4839 DBUS_TYPE_INT32, &list_logic_type,
4840 DBUS_TYPE_INT32, &filt_logic_type,
4841 DBUS_TYPE_INT32, &rssi_high_thres,
4842 DBUS_TYPE_INT32, &rssi_low_thres,
4843 DBUS_TYPE_INT32, &dely_mode,
4844 DBUS_TYPE_INT32, &found_timeout,
4845 DBUS_TYPE_INT32, &lost_timeout,
4846 DBUS_TYPE_INT32, &found_timeout_cnt,
4848 return btd_error_invalid_args(msg);
4850 memset(¶ms, 0, sizeof(params));
4852 params.action = action;
4853 params.index = filt_index;
4854 params.feature = feat_seln;
4855 params.filter_logic_type = filt_logic_type;
4856 params.list_logic_type = list_logic_type;
4857 params.delivery_mode = dely_mode;
4858 params.rssi_high_threshold = rssi_high_thres;
4860 if (params.delivery_mode == ON_FOUND) {
4861 params.rssi_low_threshold = rssi_low_thres;
4862 params.onfound_timeout = found_timeout;
4863 params.onfound_timeout_cnt = found_timeout_cnt;
4864 params.onlost_timeout = lost_timeout;
4867 #ifdef TIZEN_FEATURE_PLATFROM_SCAN_FILTER
4868 if (ctlr_filter_support)
4870 err = adapter_le_set_scan_filter_params(¶ms);
4871 #ifdef TIZEN_FEATURE_PLATFROM_SCAN_FILTER
4873 err = adapter_le_set_platform_scan_filter_params(adapter, ¶ms);
4877 return btd_error_failed(msg, "Failed to scan filter param setup");
4879 return dbus_message_new_method_return(msg);
4882 static DBusMessage *adapter_le_scan_filter_add_remove(DBusConnection *conn,
4883 DBusMessage *msg, void *data)
4885 struct btd_adapter *adapter = data;
4886 struct btd_device *dev = NULL;
4887 dbus_int32_t client_if, action, filt_type, filt_index;
4888 dbus_int32_t company_id, company_id_mask;
4890 dbus_uint32_t address_type = 0;
4891 uint8_t addr_type = 0;
4894 uint8_t *p_uuid, *p_uuid_mask, *p_data, *p_mask;
4895 int32_t uuid_len = 0, uuid_mask_len = 0, data_len = 0, mask_len = 0;
4897 #ifdef TIZEN_FEATURE_PLATFROM_SCAN_FILTER
4898 dbus_bool_t ctlr_filter_support = TRUE;
4901 DBG("adapter_le_scan_filter_add_remove");
4903 if (!(adapter->current_settings & MGMT_SETTING_POWERED))
4904 return btd_error_not_ready(msg);
4906 /* if controller does not support vendor specific scan filtering feature
4907 * then add the filter into platform supported scan filters.
4909 if (adapter_le_get_scan_filter_size() == 0) {
4910 #ifndef TIZEN_FEATURE_PLATFROM_SCAN_FILTER
4911 return btd_error_not_supported(msg);
4913 ctlr_filter_support = FALSE;
4917 if (!dbus_message_get_args(msg, NULL, DBUS_TYPE_INT32, &client_if,
4918 DBUS_TYPE_INT32, &action,
4919 DBUS_TYPE_INT32, &filt_type,
4920 DBUS_TYPE_INT32, &filt_index,
4921 DBUS_TYPE_INT32, &company_id,
4922 DBUS_TYPE_INT32, &company_id_mask,
4923 DBUS_TYPE_ARRAY, DBUS_TYPE_BYTE, &p_uuid, &uuid_len,
4924 DBUS_TYPE_ARRAY, DBUS_TYPE_BYTE, &p_uuid_mask, &uuid_mask_len,
4925 DBUS_TYPE_STRING, &str,
4926 DBUS_TYPE_UINT32, &address_type,
4927 DBUS_TYPE_ARRAY, DBUS_TYPE_BYTE, &p_data, &data_len,
4928 DBUS_TYPE_ARRAY, DBUS_TYPE_BYTE, &p_mask, &mask_len,
4930 return btd_error_invalid_args(msg);
4932 if (filt_type == TYPE_DEVICE_ADDRESS) {
4933 list = g_slist_find_custom(adapter->devices, str, device_rpa_cmp);
4935 list = g_slist_find_custom(adapter->devices, str,
4936 device_address_cmp);
4939 if (dev && device_get_rpa_exist(dev) == true) {
4940 ba2str(device_get_address(dev), string);
4941 if (btd_device_get_bdaddr_type(dev) == BDADDR_LE_PUBLIC)
4946 strncpy(string, str, sizeof(string) - 1);
4950 DBG("addr %s, type %d", string, addr_type);
4952 strncpy(string, str, sizeof(string) - 1 );
4955 #ifdef TIZEN_FEATURE_PLATFROM_SCAN_FILTER
4956 if (ctlr_filter_support)
4958 err = adapter_le_set_scan_filter_data(client_if, action, filt_type,
4959 filt_index, company_id, company_id_mask,
4960 uuid_len, p_uuid, uuid_mask_len, p_uuid_mask,
4961 string, addr_type, data_len, p_data, mask_len, p_mask);
4962 #ifdef TIZEN_FEATURE_PLATFROM_SCAN_FILTER
4964 err = adapter_le_set_platform_scan_filter_data(adapter, client_if, action, filt_type,
4965 filt_index, company_id, company_id_mask,
4966 uuid_len, p_uuid, uuid_mask_len, p_uuid_mask,
4967 string, addr_type, data_len, p_data, mask_len, p_mask);
4970 return btd_error_failed(msg, "Failed to add/remove filter");
4972 return dbus_message_new_method_return(msg);
4975 static DBusMessage *adapter_le_scan_filter_clear(DBusConnection *conn,
4976 DBusMessage *msg, void *data)
4978 struct btd_adapter *adapter = data;
4979 dbus_int32_t client_if = 0;
4980 dbus_int32_t filt_index = 0;
4982 #ifdef TIZEN_FEATURE_PLATFROM_SCAN_FILTER
4983 dbus_bool_t ctlr_filter_support = TRUE;
4986 DBG("adapter_le_scan_filter_clear");
4988 if (!(adapter->current_settings & MGMT_SETTING_POWERED))
4989 return btd_error_not_ready(msg);
4991 if (adapter_le_get_scan_filter_size() == 0)
4992 #ifndef TIZEN_FEATURE_PLATFROM_SCAN_FILTER
4993 return btd_error_not_supported(msg);
4995 ctlr_filter_support = FALSE;
4998 if (!dbus_message_get_args(msg, NULL, DBUS_TYPE_INT32, &client_if,
4999 DBUS_TYPE_INT32, &filt_index,
5001 return btd_error_invalid_args(msg);
5003 #ifdef TIZEN_FEATURE_PLATFROM_SCAN_FILTER
5004 if (ctlr_filter_support)
5006 err = adapter_le_clear_scan_filter_data(client_if, filt_index);
5007 #ifdef TIZEN_FEATURE_PLATFROM_SCAN_FILTER
5009 err = adapter_le_clear_platform_scan_filter_data(adapter, filt_index);
5013 return btd_error_failed(msg, "Failed to clear filter");
5015 return dbus_message_new_method_return(msg);
5019 static DBusMessage *adapter_le_scan_filter_enable(DBusConnection *conn,
5020 DBusMessage *msg, void *data)
5022 struct btd_adapter *adapter = data;
5023 dbus_bool_t enable = FALSE;
5024 dbus_int32_t client_if = 0;
5026 #ifdef TIZEN_FEATURE_PLATFROM_SCAN_FILTER
5027 dbus_bool_t ctlr_filter_support = TRUE;
5030 DBG("adapter_le_scan_filter_enable");
5032 if (!(adapter->current_settings & MGMT_SETTING_POWERED))
5033 return btd_error_not_ready(msg);
5035 #ifdef TIZEN_FEATURE_PLATFROM_SCAN_FILTER
5036 /* if controller does not support vendor specific scan filtering feature
5037 * then enable platform supported scan filtering functionalites.
5040 if (adapter_le_get_scan_filter_size() == 0)
5041 #ifndef TIZEN_FEATURE_PLATFROM_SCAN_FILTER
5042 return btd_error_not_supported(msg);
5044 ctlr_filter_support = FALSE;
5047 if (!dbus_message_get_args(msg, NULL, DBUS_TYPE_INT32, &client_if,
5048 DBUS_TYPE_BOOLEAN, &enable,
5050 return btd_error_invalid_args(msg);
5052 #ifdef TIZEN_FEATURE_PLATFROM_SCAN_FILTER
5053 if (ctlr_filter_support)
5055 err = adapter_le_enable_scan_filtering(enable);
5056 #ifdef TIZEN_FEATURE_PLATFROM_SCAN_FILTER
5058 err = adapter_le_enable_platform_scan_filtering(adapter, enable);
5062 return btd_error_failed(msg, "Failed to enable scan filtering");
5064 return dbus_message_new_method_return(msg);
5067 static DBusMessage *adapter_le_set_scan_params(DBusConnection *conn,
5068 DBusMessage *msg, void *data)
5070 struct btd_adapter *adapter = data;
5071 struct mgmt_cp_le_set_scan_params cp;
5076 DBG("Set scan parameters");
5078 if (!(adapter->current_settings & MGMT_SETTING_POWERED))
5079 return btd_error_not_ready(msg);
5081 if (!dbus_message_get_args(msg, NULL,
5082 DBUS_TYPE_UINT32, &type,
5083 DBUS_TYPE_UINT32, &interval,
5084 DBUS_TYPE_UINT32, &window,
5086 return btd_error_invalid_args(msg);
5088 DBG("scan type %x, interval %x, window %x",
5089 type, interval, window);
5090 memset(&cp, 0, sizeof(cp));
5093 cp.interval = interval;
5095 adapter->scan_type = type;
5097 if (mgmt_send(adapter->mgmt, MGMT_OP_LE_SET_SCAN_PARAMS,
5098 adapter->dev_id, sizeof(cp), &cp,
5099 NULL, NULL, NULL) > 0)
5100 return dbus_message_new_method_return(msg);
5102 return btd_error_failed(msg, "set scan parameters failed");
5105 static DBusMessage *adapter_set_scan_rsp_data(DBusConnection *conn,
5106 DBusMessage *msg, void *data)
5108 struct btd_adapter *adapter = data;
5109 struct mgmt_cp_set_scan_rsp_data cp;
5112 dbus_int32_t slot_id;
5113 uint8_t *adv_data = NULL;
5116 char *adapter_name = adapter->name;
5117 char le_name[MAX_NAME_LENGTH + 1] = { 0 };
5119 DBG("Set scan response data");
5121 if (!(adapter->current_settings & MGMT_SETTING_POWERED))
5122 return btd_error_not_ready(msg);
5124 if (!dbus_message_get_args(msg, NULL,
5125 DBUS_TYPE_ARRAY, DBUS_TYPE_BYTE, &value, &len,
5126 DBUS_TYPE_INT32, &slot_id,
5128 return btd_error_invalid_args(msg);
5130 if (len > SCAN_RESPONSE_DATA_LENGTH_MAX)
5131 return btd_error_invalid_args(msg);
5133 if (adapter->le_static_addr.b[5] != 0) {
5136 g_strlcpy(le_name, adapter_name,
5137 sizeof(le_name) - LE_BEARER_POSTFIX_LEN);
5138 if (!g_utf8_validate(le_name, -1, (const char **)&ptr))
5141 g_strlcat(le_name, LE_BEARER_POSTFIX, sizeof(le_name));
5142 adapter_name = le_name;
5145 adapter_le_set_missed_adv_data(value, len, TRUE,
5146 adapter_name, adapter->adv_tx_power, &adv_data, &adv_len, adapter);
5148 if (adapter_le_is_supported_multi_advertising() && slot_id > 0) {
5149 if (adapter_le_set_multi_adv_data(slot_id, TRUE, adv_len, (uint8_t *)adv_data)) {
5151 return dbus_message_new_method_return(msg);
5154 return btd_error_failed(msg, "set advertising data failed");
5157 memcpy(&cp, adv_data, adv_len);
5159 if (mgmt_send(adapter->mgmt, MGMT_OP_SET_SCAN_RSP_DATA,
5160 adapter->dev_id, adv_len, &cp,
5161 NULL, NULL, NULL) > 0) {
5163 return dbus_message_new_method_return(msg);
5167 return btd_error_failed(msg, "set scan reponse data failed");
5171 static DBusMessage *adapter_add_device_white_list(DBusConnection *conn,
5172 DBusMessage *msg, void *data)
5174 struct btd_adapter *adapter = data;
5175 struct mgmt_cp_add_dev_white_list cp;
5176 const gchar *address;
5178 dbus_uint32_t address_type;
5179 struct btd_device *dev;
5181 DBG("Add device whie list");
5182 if (dbus_message_get_args(msg, NULL,
5183 DBUS_TYPE_STRING, &address,
5184 DBUS_TYPE_UINT32, &address_type,
5185 DBUS_TYPE_INVALID) == FALSE)
5186 return btd_error_invalid_args(msg);
5188 if (bachk(address) < 0)
5189 return btd_error_invalid_args(msg);
5191 if (!(adapter->current_settings & MGMT_SETTING_POWERED))
5192 return btd_error_not_ready(msg);
5194 DBG("addr %s, type %d", address, address_type);
5195 str2ba(address, &bdaddr);
5197 dev = btd_adapter_find_device(adapter, &bdaddr,
5198 address_type ? BDADDR_LE_RANDOM : BDADDR_LE_PUBLIC);
5199 if (dev && device_get_rpa_exist(dev) == true) {
5200 if (adapter_le_is_supported_offloading() == FALSE) {
5201 error("Spec based command is not supported yet");
5202 return btd_error_not_supported(msg);
5205 /* Add IRK value to list */
5206 if (adapter_le_add_irk_to_list(device_get_irk_value(dev),
5207 device_get_address(dev),
5208 btd_device_get_bdaddr_type(dev))) {
5209 return dbus_message_new_method_return(msg);
5211 return btd_error_failed(msg, "Add LE IRK to list failed");
5215 memset(&cp, 0, sizeof(cp));
5217 cp.bdaddr_type = address_type;
5218 memcpy(&cp.bdaddr, &bdaddr, sizeof(bdaddr_t));
5220 if (mgmt_send(adapter->mgmt, MGMT_OP_ADD_DEV_WHITE_LIST,
5221 adapter->dev_id, sizeof(cp), &cp,
5222 NULL, NULL, NULL) > 0)
5223 return dbus_message_new_method_return(msg);
5225 return btd_error_failed(msg, "add device white list failed");
5228 static DBusMessage *adapter_remove_device_white_list(DBusConnection *conn,
5229 DBusMessage *msg, void *data)
5231 struct btd_adapter *adapter = data;
5232 struct mgmt_cp_remove_dev_white_list cp;
5233 const gchar *address;
5235 dbus_uint32_t address_type;
5236 struct btd_device *dev;
5238 DBG("Remove device whie list");
5240 if (!(adapter->current_settings & MGMT_SETTING_POWERED))
5241 return btd_error_not_ready(msg);
5243 if (dbus_message_get_args(msg, NULL,
5244 DBUS_TYPE_STRING, &address,
5245 DBUS_TYPE_UINT32, &address_type,
5246 DBUS_TYPE_INVALID) == FALSE)
5247 return btd_error_invalid_args(msg);
5249 if (bachk(address) < 0)
5250 return btd_error_invalid_args(msg);
5252 DBG("addr %s, type %d", address, address_type);
5253 str2ba(address, &bdaddr);
5255 dev = btd_adapter_find_device(adapter, &bdaddr,
5256 address_type ? BDADDR_LE_RANDOM : BDADDR_LE_PUBLIC);
5257 if (dev && device_get_rpa_exist(dev) == true) {
5258 if (adapter_le_is_supported_offloading() == FALSE) {
5259 error("Spec based command is not supported yet");
5260 return btd_error_not_supported(msg);
5263 /* Remove IRK value to list */
5264 if (adapter_le_remove_irk_to_list(device_get_address(dev),
5265 btd_device_get_bdaddr_type(dev))) {
5266 return dbus_message_new_method_return(msg);
5268 return btd_error_failed(msg, "Remove IRK is failed");
5272 memset(&cp, 0, sizeof(cp));
5274 cp.bdaddr_type = address_type;
5275 memcpy(&cp.bdaddr, &bdaddr, sizeof(bdaddr_t));
5277 if (mgmt_send(adapter->mgmt, MGMT_OP_REMOVE_DEV_FROM_WHITE_LIST,
5278 adapter->dev_id, sizeof(cp), &cp,
5279 NULL, NULL, NULL) > 0)
5280 return dbus_message_new_method_return(msg);
5282 return btd_error_failed(msg, "remove device white list failed");
5285 static DBusMessage *adapter_clear_device_white_list(DBusConnection *conn,
5286 DBusMessage *msg, void *data)
5288 struct btd_adapter *adapter = data;
5290 DBG("Clear device whie list");
5292 if (!(adapter->current_settings & MGMT_SETTING_POWERED))
5293 return btd_error_not_ready(msg);
5295 if (mgmt_send(adapter->mgmt, MGMT_OP_CLEAR_DEV_WHITE_LIST,
5296 adapter->dev_id, 0, NULL,
5297 NULL, NULL, NULL) > 0)
5298 return dbus_message_new_method_return(msg);
5300 return btd_error_failed(msg, "clear white list failed");
5303 static DBusMessage *adapter_set_le_privacy(DBusConnection *conn,
5304 DBusMessage *msg, void *data)
5306 struct btd_adapter *adapter = data;
5308 dbus_bool_t enable_privacy = FALSE;
5310 if (!(adapter->supported_settings & MGMT_SETTING_PRIVACY))
5311 return btd_error_not_supported(msg);
5313 if (!dbus_message_get_args(msg, NULL, DBUS_TYPE_BOOLEAN,
5314 &enable_privacy, DBUS_TYPE_INVALID))
5315 return btd_error_invalid_args(msg);
5317 if (enable_privacy) {
5318 if (adapter->current_settings & MGMT_SETTING_PRIVACY)
5319 return btd_error_already_exists(msg);
5321 if (!(adapter->current_settings & MGMT_SETTING_PRIVACY))
5322 return btd_error_already_exists(msg);
5325 err = set_privacy(adapter, enable_privacy);
5328 return btd_error_failed(msg, "Set Le Privacy failed");
5331 adapter->current_settings = adapter->current_settings | MGMT_SETTING_PRIVACY;
5333 adapter->current_settings = adapter->current_settings & ~(SETTING_PRIVACY_MASK);
5336 return dbus_message_new_method_return(msg);
5339 static void init_le_static_address(struct btd_adapter *adapter)
5344 char dirname[PATH_MAX];
5346 bdaddr_t le_static_addr;
5348 le_static_addr.b[5] = adapter->bdaddr.b[5] | 0xc0;
5349 for (i = 0; i < 5; i++) {
5350 le_static_addr.b[i] =
5351 (adapter->bdaddr.b[i] & 0x7f) << 1 |
5352 (adapter->bdaddr.b[i] & 0x80) >> 7;
5356 * < How to get Public address from above static address >
5358 * for (i = 0; i < 5; i++) {
5360 * (adapter->le_static_addr.b[i] & 0xfe) >> 1 |
5361 * (adapter->le_static_addr.b[i] & 0x01) << 7;
5363 * bredr_addr.b[5] = {the value from advertising data}
5366 snprintf(dirname, PATH_MAX, STORAGEDIR "/%s", "le_static_addr");
5367 fd = open(dirname, O_WRONLY | O_CREAT, 0644);
5370 ba2str(&le_static_addr, address);
5371 DBG("LE static random : %s", address);
5372 ret = write(fd, address, strlen(address));
5374 error("Cannot save LE address : %s",
5378 ret = fdatasync(fd);
5380 error("sync failed : %s", strerror(errno));
5384 error("Cannot save LE address");
5388 static void set_le_static_address(struct btd_adapter *adapter)
5393 char dirname[PATH_MAX];
5395 snprintf(dirname, PATH_MAX, STORAGEDIR "/%s", "le_static_addr");
5396 if (access(dirname, F_OK) < 0)
5397 init_le_static_address(adapter);
5399 fd = open(dirname, O_RDONLY);
5401 ret = read(fd, address, sizeof(address));
5403 /* xx:xx:xx:xx:xx:xx */
5405 DBG("LE static random : %s", address);
5406 str2ba(address, &adapter->le_static_addr);
5407 adapter->le_static_addr.b[5] |= 0xc0;
5409 error("Invalid LE address");
5412 error("Cannot get LE address");
5418 static void set_le_static_address_complete(uint8_t status, uint16_t length,
5419 const void *param, void *user_data)
5421 struct btd_adapter *adapter = user_data;
5423 DBG("index %u status 0x%02x", adapter->dev_id, status);
5425 if (status != MGMT_STATUS_SUCCESS) {
5426 error("Failed to set static address for index %u: %s (0x%02x)",
5427 adapter->dev_id, mgmt_errstr(status), status);
5428 if (adapter->le_static_addr.b[5] != 0)
5429 bacpy(&adapter->le_static_addr, BDADDR_ANY);
5431 set_le_static_address(adapter);
5438 static DBusMessage *adapter_set_le_static_address(DBusConnection *conn,
5439 DBusMessage *msg, void *data)
5441 struct btd_adapter *adapter = data;
5442 dbus_bool_t is_enable = FALSE;
5443 struct mgmt_cp_set_static_address cp;
5445 if (!(adapter->supported_settings & MGMT_OP_SET_STATIC_ADDRESS)) {
5446 error("LE static address is not supported");
5447 return btd_error_not_supported(msg);
5450 if (!dbus_message_get_args(msg, NULL, DBUS_TYPE_BOOLEAN, &is_enable,
5451 DBUS_TYPE_INVALID)) {
5452 error("Invalid arguments");
5453 return btd_error_invalid_args(msg);
5456 memset(&cp, 0x00, sizeof(cp));
5458 if (adapter->le_static_addr.b[5] != 0) {
5459 DBG("LE static address is already configured");
5460 return dbus_message_new_method_return(msg);
5462 set_le_static_address(adapter);
5463 bacpy(&cp.bdaddr, &adapter->le_static_addr);
5465 if (adapter->le_static_addr.b[5] == 0) {
5466 DBG("LE static address is not configured");
5467 return dbus_message_new_method_return(msg);
5469 bacpy(&adapter->le_static_addr, BDADDR_ANY);
5471 DBG("Set static random address : %d", is_enable);
5473 if (mgmt_send(mgmt_primary, MGMT_OP_SET_STATIC_ADDRESS, adapter->dev_id,
5475 set_le_static_address_complete, adapter, NULL) <= 0) {
5476 error("Failed to set static address : %d", is_enable);
5478 bacpy(&adapter->le_static_addr, BDADDR_ANY);
5480 set_le_static_address(adapter);
5481 return btd_error_failed(msg, "Unable to set static address");
5484 return dbus_message_new_method_return(msg);
5487 static DBusMessage *adapter_enable_rssi(DBusConnection *conn,
5488 DBusMessage *msg, void *data)
5490 struct btd_adapter *adapter = data;
5491 struct mgmt_cp_set_enable_rssi cp;
5492 struct mgmt_cp_disable_rssi cp_dis;
5493 bdaddr_t bt_addr = { { 0, } };
5494 const gchar *address = NULL;
5496 const char *sender = dbus_message_get_sender(msg);
5497 dbus_int32_t link_type;
5498 dbus_int32_t low_threshold;
5499 dbus_int32_t in_range_threshold;
5500 dbus_int32_t high_threshold;
5502 DBG("Enable RSSI called");
5503 DBG("sender %s", sender);
5504 if (!(adapter->current_settings & MGMT_SETTING_POWERED))
5505 return btd_error_not_ready(msg);
5507 if (!dbus_message_get_args(msg, NULL,
5508 DBUS_TYPE_STRING, &address,
5509 DBUS_TYPE_INT32, &link_type,
5510 DBUS_TYPE_INT32, &low_threshold,
5511 DBUS_TYPE_INT32, &in_range_threshold,
5512 DBUS_TYPE_INT32, &high_threshold,
5514 return btd_error_invalid_args(msg);
5516 DBG("Enable RSSI: [%s %d %d %d %d]", address, link_type,
5517 low_threshold, in_range_threshold, high_threshold);
5519 DBG("BT address [%s]", address);
5520 memset(&bt_addr, 0, sizeof(bdaddr_t));
5521 str2ba(address, &bt_addr);
5522 memset(&cp, 0, sizeof(struct mgmt_cp_set_enable_rssi));
5523 memset(&cp_dis, 0, sizeof(struct mgmt_cp_disable_rssi));
5525 if (bachk(address) < 0)
5526 return btd_error_invalid_args(msg);
5528 // if (!btd_adapter_find_device(adapter, address))
5529 // return btd_error_not_found(msg);
5531 if (low_threshold == 0 && in_range_threshold == 0 && high_threshold == 0) {
5532 cp_dis.bdaddr = bt_addr;
5533 cp_dis.link_type = link_type;
5534 DBG("Disable Request");
5535 if (mgmt_send(adapter->mgmt, MGMT_OP_SET_RSSI_DISABLE,
5536 adapter->dev_id, sizeof(cp_dis), &cp_dis,
5537 NULL, NULL, NULL) > 0)
5538 return dbus_message_new_method_return(msg);
5540 cp.low_th = low_threshold;
5541 cp.in_range_th = in_range_threshold;
5542 cp.high_th = high_threshold;
5543 cp.bdaddr = bt_addr;
5544 cp.link_type = link_type;
5545 DBG("Enable Request");
5546 if (mgmt_send(adapter->mgmt, MGMT_OP_SET_RSSI_ENABLE,
5547 adapter->dev_id, sizeof(cp), &cp,
5548 NULL, NULL, NULL) > 0)
5549 return dbus_message_new_method_return(msg);
5551 return btd_error_failed(msg, "Enable/Disable RSSI Failed");
5554 static DBusMessage *adapter_get_rssi(DBusConnection *conn,
5555 DBusMessage *msg, void *data)
5557 struct btd_adapter *adapter = data;
5558 struct mgmt_cp_get_raw_rssi cp;
5560 const gchar *address = NULL;
5561 dbus_int32_t link_type;
5562 const char *sender = dbus_message_get_sender(msg);
5564 DBG("Get RSSI called");
5565 DBG("sender %s", sender);
5566 if (!(adapter->current_settings & MGMT_SETTING_POWERED))
5567 return btd_error_not_ready(msg);
5569 if (!dbus_message_get_args(msg, NULL,
5570 DBUS_TYPE_STRING, &address,
5571 DBUS_TYPE_INT32, &link_type,
5573 return btd_error_invalid_args(msg);
5575 DBG("BT address [%s] link type [%d]", address, link_type);
5576 memset(&bt_addr, 0, sizeof(bdaddr_t));
5577 str2ba(address, &bt_addr);
5578 memset(&cp, 0, sizeof(struct mgmt_cp_get_raw_rssi));
5580 if (bachk(address) < 0)
5581 return btd_error_invalid_args(msg);
5583 // if (!btd_adapter_find_device(adapter, address))
5584 // return btd_error_not_found(msg);
5586 memcpy(&(cp.bt_address), &bt_addr, sizeof(bdaddr_t));
5587 cp.link_type = link_type;
5588 DBG("RAW RSSI Request");
5589 if (mgmt_send(adapter->mgmt, MGMT_OP_GET_RAW_RSSI,
5590 adapter->dev_id, sizeof(cp), &cp,
5591 NULL, NULL, NULL) > 0)
5592 return dbus_message_new_method_return(msg);
5594 return btd_error_failed(msg, "Get Raw RSSI Failed");
5597 #if !defined(__SPRD_PATCH__)
5598 static void get_adv_tx_power_complete(uint8_t status, uint16_t length,
5599 const void *param, void *user_data)
5601 struct btd_adapter *adapter = user_data;
5602 const struct mgmt_rp_get_adv_tx_power *rp = param;
5605 error("Error ocurred in Getting adv tx power, rp is NULL");
5609 if (status != MGMT_STATUS_SUCCESS) {
5610 error("Failed to get adv tx power: %s (0x%02x)",
5611 mgmt_errstr(status), status);
5615 if (length < sizeof(*rp)) {
5616 error("Wrong size of get adv tx power");
5620 adapter->adv_tx_power = rp->adv_tx_power;
5624 static void adapter_get_adv_tx_power(void *data)
5626 struct btd_adapter *adapter = data;
5628 mgmt_send(adapter->mgmt, MGMT_OP_GET_ADV_TX_POWER,
5629 adapter->dev_id, 0, NULL,
5630 get_adv_tx_power_complete, adapter, NULL);
5635 static DBusMessage *set_wbs_parameters(DBusConnection *conn,
5636 DBusMessage *msg, void *data)
5638 struct btd_adapter *adapter = data;
5639 const gchar *role = NULL;
5640 const gchar *address = NULL;
5641 struct mgmt_cp_set_voice_setting cp;
5642 bdaddr_t bt_addr = { { 0, } };
5646 if (!dbus_message_get_args(msg, NULL,
5647 DBUS_TYPE_STRING, &role,
5648 DBUS_TYPE_STRING, &address,
5649 DBUS_TYPE_INVALID)) {
5650 return btd_error_invalid_args(msg);
5653 DBG("Role = %s", role);
5654 DBG("Address = %s", address);
5656 memset(&cp, 0, sizeof(cp));
5658 cp.voice_setting = BT_VOICE_TRANSPARENT | BT_VOICE_CVSD_16BIT;
5660 if (g_strcmp0(role, "Handsfree") == 0)
5661 cp.sco_role = MGMT_SCO_ROLE_HANDSFREE;
5662 else if (g_strcmp0(role, "Gateway") == 0)
5663 cp.sco_role = MGMT_SCO_ROLE_AUDIO_GATEWAY;
5665 str2ba(address, &bt_addr);
5666 memcpy(&(cp.bdaddr), &bt_addr, sizeof(bdaddr_t));
5668 if (mgmt_send(adapter->mgmt, MGMT_OP_SET_VOICE_SETTING,
5669 adapter->dev_id, sizeof(cp), &cp,
5670 NULL, NULL, NULL) == 0)
5671 error("mgmt_send failed for voice setting");
5674 return dbus_message_new_method_return(msg);
5677 static DBusMessage *set_nb_parameters(DBusConnection *conn,
5678 DBusMessage *msg, void *data)
5680 struct btd_adapter *adapter = data;
5682 const gchar *address = NULL;
5683 struct mgmt_cp_set_voice_setting cp;
5684 bdaddr_t bt_addr = { { 0, } };
5688 if (!dbus_message_get_args(msg, NULL,
5689 DBUS_TYPE_STRING, &role,
5690 DBUS_TYPE_STRING, &address,
5691 DBUS_TYPE_INVALID)) {
5692 return btd_error_invalid_args(msg);
5695 DBG("Role = %s", role);
5696 DBG("Address = %s", address);
5698 memset(&cp, 0, sizeof(cp));
5700 cp.voice_setting = BT_VOICE_CVSD_16BIT;
5702 if (g_strcmp0(role, "Handsfree") == 0)
5703 cp.sco_role = MGMT_SCO_ROLE_HANDSFREE;
5704 else if (g_strcmp0(role, "Gateway") == 0)
5705 cp.sco_role = MGMT_SCO_ROLE_AUDIO_GATEWAY;
5707 str2ba(address, &bt_addr);
5708 memcpy(&(cp.bdaddr), &bt_addr, sizeof(bdaddr_t));
5710 if (mgmt_send(adapter->mgmt, MGMT_OP_SET_VOICE_SETTING,
5711 adapter->dev_id, sizeof(cp), &cp,
5712 NULL, NULL, NULL) == 0)
5713 error("mgmt_send failed for voice setting");
5717 return dbus_message_new_method_return(msg);
5720 void btd_adapter_set_read_le_data_length_handler(
5721 struct btd_adapter *adapter,
5722 struct le_data_length_read_handler *handler)
5724 adapter->read_handler = handler;
5727 static void le_read_maximum_data_length_return_param_complete(
5728 uint8_t status, uint16_t length,
5729 const void *param, void *user_data)
5731 struct btd_adapter *adapter = user_data;
5732 const struct mgmt_rp_le_read_maximum_data_length *rp = param;
5733 uint16_t max_tx_octects = 0;
5734 uint16_t max_tx_time = 0;
5735 uint16_t max_rx_octects = 0;
5736 uint16_t max_rx_time = 0;
5740 error("Error ocurred in Reading maximum data length, rp is NULL");
5745 if (status != MGMT_STATUS_SUCCESS) {
5746 error("le read maximum data length failed: %s (0x%02x)",
5747 mgmt_errstr(status), status);
5752 if (length < sizeof(*rp)) {
5753 error("Too small le read maximum data length response");
5757 max_tx_octects = rp->max_tx_octets;
5758 max_tx_time =rp->max_tx_time;
5759 max_rx_octects = rp->max_rx_octets;
5760 max_rx_time = rp->max_rx_time;
5764 if (!adapter->read_handler ||
5765 !adapter->read_handler->read_callback) {
5766 g_free(adapter->read_handler);
5770 adapter->read_handler->read_callback(adapter, err,
5771 max_tx_octects, max_tx_time,
5772 max_rx_octects, max_rx_time,
5773 adapter->read_handler->user_data);
5775 g_free(adapter->read_handler);
5776 adapter->read_handler = NULL;
5779 int btd_adapter_le_read_maximum_data_length(
5780 struct btd_adapter *adapter)
5782 if (mgmt_send(adapter->mgmt,
5783 MGMT_OP_LE_READ_MAXIMUM_DATA_LENGTH,
5784 adapter->dev_id, 0, NULL,
5785 le_read_maximum_data_length_return_param_complete,
5792 static gint read_request_cmp(gconstpointer a, gconstpointer b)
5794 const struct le_data_length_read_request *data = a;
5795 const struct btd_adapter *adapter = b;
5797 return data->adapter != adapter;
5800 static struct le_data_length_read_request *find_read_le_data_length_request(
5801 struct btd_adapter *adapter)
5805 match = g_slist_find_custom(read_requests, adapter, read_request_cmp);
5813 static void le_read_data_length_complete(
5814 struct btd_adapter *adapter,
5816 uint16_t max_tx_octects, uint16_t max_tx_time,
5817 uint16_t max_rx_octects, uint16_t max_rx_time,
5821 struct le_data_length_read_request *read_request;
5823 read_request = find_read_le_data_length_request(adapter);
5829 DBG("Failed to read max data length. errno[%d]", err);
5830 reply = btd_error_failed(read_request->msg,
5831 "Failed to read max data length");
5833 reply = g_dbus_create_reply(read_request->msg,
5834 DBUS_TYPE_UINT16, &max_tx_octects,
5835 DBUS_TYPE_UINT16, &max_tx_time,
5836 DBUS_TYPE_UINT16, &max_rx_octects,
5837 DBUS_TYPE_UINT16, &max_rx_time,
5841 reply = btd_error_failed(read_request->msg,
5842 "Failed to create reply.");
5846 read_requests = g_slist_remove(read_requests, read_request);
5847 dbus_message_unref(read_request->msg);
5848 g_free(read_request);
5850 if (!g_dbus_send_message(dbus_conn, reply))
5851 error("D-Bus send failed");
5854 static DBusMessage *le_read_maximum_data_length(
5855 DBusConnection *conn, DBusMessage *msg,
5858 struct btd_adapter *adapter = user_data;
5859 struct le_data_length_read_request *read_request;
5860 struct le_data_length_read_handler *handler;
5862 if (find_read_le_data_length_request(adapter))
5863 return btd_error_in_progress(msg);
5865 if (btd_adapter_le_read_maximum_data_length(adapter))
5866 return btd_error_failed(msg, "Unable to read maximum le data length");
5868 read_request = g_new(struct le_data_length_read_request, 1);
5870 read_request->msg = dbus_message_ref(msg);
5871 read_request->adapter = adapter;
5873 read_requests = g_slist_append(read_requests, read_request);
5875 handler = g_new0(struct le_data_length_read_handler, 1);
5877 handler->read_callback =
5878 (read_max_data_length_cb_t)le_read_data_length_complete;
5880 btd_adapter_set_read_le_data_length_handler(
5881 read_request->adapter, handler);
5887 void le_write_host_suggested_data_length_return_param_complete(
5888 uint8_t status, uint16_t length,
5889 const void *param, void *user_data)
5891 if (status != MGMT_STATUS_SUCCESS) {
5892 error("le write host suggested data length failed: %s (0x%02x)",
5893 mgmt_errstr(status), status);
5899 static DBusMessage *le_write_host_suggested_default_data_length(
5900 DBusConnection *conn, DBusMessage *msg,
5903 struct btd_adapter *adapter = user_data;
5904 struct mgmt_cp_le_write_host_suggested_data_length cp;
5905 dbus_uint16_t def_tx_Octets;
5906 dbus_uint16_t def_tx_time;
5908 if (!(adapter->current_settings & MGMT_SETTING_POWERED))
5909 return btd_error_not_ready(msg);
5911 if (!dbus_message_get_args(msg, NULL,
5912 DBUS_TYPE_UINT16, &def_tx_Octets,
5913 DBUS_TYPE_UINT16, &def_tx_time,
5915 return btd_error_invalid_args(msg);
5917 memset(&cp, 0, sizeof(cp));
5918 cp.def_tx_octets = def_tx_Octets;
5919 cp.def_tx_time = def_tx_time;
5921 if (mgmt_send(adapter->mgmt,
5922 MGMT_OP_LE_WRITE_HOST_SUGGESTED_DATA_LENGTH,
5923 adapter->dev_id, sizeof(cp), &cp,
5924 le_write_host_suggested_data_length_return_param_complete,
5926 return dbus_message_new_method_return(msg);
5928 return btd_error_failed(msg, "Unable to write host suggested le data length values");
5931 static void le_read_suggested_default_data_length_return_param_complete(
5932 uint8_t status, uint16_t length,
5933 const void *param, void *user_data)
5935 struct btd_adapter *adapter = user_data;
5936 const struct mgmt_rp_le_read_host_suggested_data_length *rp = param;
5937 uint16_t def_tx_octects, def_tx_time;
5940 error("Error ocurred in Reading suggested data length, rp is NULL");
5941 if (adapter->def_read_handler)
5942 g_free(adapter->def_read_handler->user_data);
5944 g_free(adapter->def_read_handler);
5948 if (status != MGMT_STATUS_SUCCESS) {
5949 error("Read host suggested def le data length values failed: %s (0x%02x)",
5950 mgmt_errstr(status), status);
5954 if (adapter->def_read_handler)
5955 g_free(adapter->def_read_handler->user_data);
5957 g_free(adapter->def_read_handler);
5961 if (length < sizeof(*rp)) {
5964 def_tx_octects = rp->def_tx_octets;
5965 def_tx_time =rp->def_tx_time;
5966 DBG("retrieving host suggested data length values %d %d", def_tx_octects, def_tx_time);
5969 if (!adapter->def_read_handler)
5972 if(!adapter->def_read_handler->read_callback) {
5976 adapter->def_read_handler->read_callback(adapter,
5977 def_tx_octects, def_tx_time,
5978 adapter->def_read_handler->user_data);
5980 if (adapter->def_read_handler)
5981 g_free(adapter->def_read_handler->user_data);
5983 g_free(adapter->def_read_handler);
5984 adapter->def_read_handler = NULL;
5987 int btd_adapter_le_read_suggested_default_data_length(
5988 struct btd_adapter *adapter)
5990 if (mgmt_send(adapter->mgmt,
5991 MGMT_OP_LE_READ_HOST_SUGGESTED_DATA_LENGTH,
5992 adapter->dev_id, 0, NULL,
5993 le_read_suggested_default_data_length_return_param_complete,
5994 adapter, NULL) > 0) {
6001 static void le_read_host_suggested_default_length_complete(
6002 struct btd_adapter *adapter,
6003 uint16_t def_tx_octects, uint16_t def_tx_time,
6007 struct le_data_length_read_request *read_request;
6009 read_request = find_read_le_data_length_request(adapter);
6013 reply = g_dbus_create_reply(read_request->msg,
6014 DBUS_TYPE_UINT16, &def_tx_octects,
6015 DBUS_TYPE_UINT16, &def_tx_time,
6019 btd_error_failed(read_request->msg,
6020 "Failed to read host suggested def data length values");
6024 read_requests = g_slist_remove(read_requests, read_request);
6025 dbus_message_unref(read_request->msg);
6026 g_free(read_request);
6028 if (!g_dbus_send_message(dbus_conn, reply))
6029 error("D-Bus send failed");
6032 static DBusMessage *le_read_host_suggested_default_data_length(
6033 DBusConnection *conn, DBusMessage *msg,
6036 struct btd_adapter *adapter = user_data;
6037 struct le_data_length_read_request *read_request;
6038 struct le_data_length_read_default_data_length_handler *handler;
6040 if (find_read_le_data_length_request(adapter))
6041 return btd_error_in_progress(msg);
6043 if (btd_adapter_le_read_suggested_default_data_length(adapter))
6044 return btd_error_failed(msg, "Unable to read host suggested def data length");
6046 read_request = g_new(struct le_data_length_read_request, 1);
6048 read_request->msg = dbus_message_ref(msg);
6049 read_request->adapter = adapter;
6051 read_requests = g_slist_append(read_requests, read_request);
6053 handler = g_new0(struct le_data_length_read_default_data_length_handler, 1);
6055 handler->read_callback =
6056 (read_host_suggested_default_data_length_cb_t)le_read_host_suggested_default_length_complete;
6058 read_request->adapter->def_read_handler = handler;
6063 static void get_le_batching_available_pkts_complete(
6064 uint8_t status, uint16_t length,
6065 const void *param, void *user_data)
6067 const struct mgmt_rp_get_le_batching_buffer *rp = param;
6068 struct le_batching_request *request =
6069 (struct le_batching_request*)user_data;
6072 if (status != MGMT_STATUS_SUCCESS) {
6073 error("mgmt fail: %s (0x%02x)", mgmt_errstr(status), status);
6074 if (status == MGMT_STATUS_UNKNOWN_COMMAND)
6075 reply = btd_error_not_supported(request->msg);
6077 reply = btd_error_failed(request->msg, mgmt_errstr(status));
6081 if (length < sizeof(*rp)) {
6082 reply = btd_error_failed(request->msg,
6083 "Wrong size of get le batching buffer");
6087 DBG("LE Batching buffer: [%u]", rp->buffer);
6088 request->adapter->le_batching_available_pkts = rp->buffer;
6089 reply = g_dbus_create_reply(request->msg,
6090 DBUS_TYPE_UINT32, &rp->buffer,
6093 reply = btd_error_failed(request->msg,
6094 "Failed to create reply.");
6097 if (!g_dbus_send_message(dbus_conn, reply))
6098 error("D-Bus send failed");
6100 dbus_message_unref(request->msg);
6104 static DBusMessage *adapter_get_le_batching_available_pkts(DBusConnection *conn,
6105 DBusMessage *msg, void *data)
6107 struct btd_adapter *adapter = data;
6108 struct le_batching_request *request;
6112 if (!(adapter->current_settings & MGMT_SETTING_POWERED))
6113 return btd_error_not_ready(msg);
6115 if (adapter->le_batching_available_pkts < 0)
6116 return btd_error_not_supported(msg);
6118 if (adapter->le_batching_available_pkts > 0) {
6119 reply = dbus_message_new_method_return(msg);
6123 val = adapter->le_batching_available_pkts;
6124 dbus_message_append_args(reply, DBUS_TYPE_UINT32, &val,
6126 DBG("LE Batching buffer: [%u]", val);
6130 request = g_new(struct le_batching_request, 1);
6132 request->msg = dbus_message_ref(msg);
6133 request->adapter = adapter;
6135 if (mgmt_send(adapter->mgmt, MGMT_OP_GET_LE_BATCHING_BUFFER,
6136 adapter->dev_id, 0, NULL,
6137 get_le_batching_available_pkts_complete, request, NULL) == 0) {
6138 dbus_message_unref(request->msg);
6140 return btd_error_failed(msg, "Unable to get le batching buffer");
6146 static void set_le_batching_enable_complete(
6147 uint8_t status, uint16_t length,
6148 const void *param, void *user_data)
6150 const struct mgmt_rp_set_le_batching_enable *rp = param;
6151 struct le_batching_request *request =
6152 (struct le_batching_request*)user_data;
6156 if (status != MGMT_STATUS_SUCCESS) {
6157 error("mgmt fail: %s (0x%02x)", mgmt_errstr(status), status);
6158 if (status == MGMT_STATUS_UNKNOWN_COMMAND)
6159 reply = btd_error_not_supported(request->msg);
6161 reply = btd_error_failed(request->msg, mgmt_errstr(status));
6165 if (length < sizeof(*rp)) {
6166 reply = btd_error_failed(request->msg,
6167 "Wrong size of set le batching enable");
6171 reply = g_dbus_create_reply(request->msg,
6174 reply = btd_error_failed(request->msg,
6175 "Failed to create reply.");
6178 if (!g_dbus_send_message(dbus_conn, reply))
6179 error("D-Bus send failed");
6181 dbus_message_unref(request->msg);
6185 static void set_le_batching_param_complete(
6186 uint8_t status, uint16_t length,
6187 const void *param, void *user_data)
6189 const struct mgmt_rp_set_le_batching_param *rp = param;
6190 struct mgmt_cp_set_le_batching_enable cp;
6191 struct le_batching_set_param_request *request =
6192 (struct le_batching_set_param_request*)user_data;
6195 if (status != MGMT_STATUS_SUCCESS) {
6196 error("mgmt fail: %s (0x%02x)", mgmt_errstr(status), status);
6197 if (status == MGMT_STATUS_UNKNOWN_COMMAND)
6198 reply = btd_error_not_supported(request->msg);
6200 reply = btd_error_failed(request->msg, mgmt_errstr(status));
6204 if (length < sizeof(*rp)) {
6205 reply = btd_error_failed(request->msg,
6206 "Wrong size of set le batching param");
6210 memset(&cp, 0, sizeof(struct mgmt_cp_set_le_batching_enable));
6211 cp.bdaddr = request->bdaddr;
6213 if (mgmt_send(request->adapter->mgmt, MGMT_OP_SET_LE_BATCHING_ENABLE,
6214 request->adapter->dev_id, sizeof(cp), &cp,
6215 set_le_batching_enable_complete, request, NULL) == 0) {
6216 reply = btd_error_failed(request->msg, "Unable to set le batching enable");
6222 if (!g_dbus_send_message(dbus_conn, reply))
6223 error("D-Bus send failed");
6225 dbus_message_unref(request->msg);
6229 static DBusMessage *adapter_enable_le_batching(DBusConnection *conn,
6230 DBusMessage *msg, void *data)
6232 struct btd_adapter *adapter = data;
6233 struct mgmt_cp_set_le_batching_param cp;
6234 struct le_batching_set_param_request *request;
6235 bdaddr_t bt_addr = { { 0, } };
6236 const gchar *address = NULL;
6237 dbus_int32_t packet_threshold;
6238 dbus_int32_t timeout;
6240 if (!(adapter->current_settings & MGMT_SETTING_POWERED))
6241 return btd_error_not_ready(msg);
6243 if (!dbus_message_get_args(msg, NULL,
6244 DBUS_TYPE_STRING, &address,
6245 DBUS_TYPE_INT32, &packet_threshold,
6246 DBUS_TYPE_INT32, &timeout,
6248 return btd_error_invalid_args(msg);
6250 if (packet_threshold < 0 || packet_threshold > 0x7fff ||
6251 timeout < 0 || timeout > 0x7fff)
6252 return btd_error_invalid_args(msg);
6254 DBG("Set LE batching param: [%s %d %d]", address,
6255 packet_threshold, timeout);
6257 memset(&bt_addr, 0, sizeof(bdaddr_t));
6258 str2ba(address, &bt_addr);
6259 memset(&cp, 0, sizeof(struct mgmt_cp_set_le_batching_param));
6261 if (bachk(address) < 0)
6262 return btd_error_invalid_args(msg);
6264 cp.bdaddr = bt_addr;
6265 cp.pkt_th = packet_threshold;
6267 cp.timeout = timeout * 100;
6269 request = g_new(struct le_batching_set_param_request, 1);
6270 request->msg = dbus_message_ref(msg);
6271 request->adapter = adapter;
6272 request->bdaddr = bt_addr;
6273 if (mgmt_send(adapter->mgmt, MGMT_OP_SET_LE_BATCHING_PARAM,
6274 adapter->dev_id, sizeof(cp), &cp,
6275 set_le_batching_param_complete, request, NULL) == 0) {
6276 dbus_message_unref(request->msg);
6278 return btd_error_failed(msg, "Unable to set le batching param");
6284 static DBusMessage *adapter_disable_le_batching(DBusConnection *conn,
6285 DBusMessage *msg, void *data)
6287 struct btd_adapter *adapter = data;
6288 struct le_batching_request *request;
6289 struct mgmt_cp_set_le_batching_enable cp;
6290 bdaddr_t bt_addr = { { 0, } };
6291 const gchar *address = NULL;
6293 if (!(adapter->current_settings & MGMT_SETTING_POWERED))
6294 return btd_error_not_ready(msg);
6296 if (!dbus_message_get_args(msg, NULL,
6297 DBUS_TYPE_STRING, &address,
6299 return btd_error_invalid_args(msg);
6301 DBG("Disable LE Batching: [%s]", address);
6303 memset(&bt_addr, 0, sizeof(bdaddr_t));
6304 str2ba(address, &bt_addr);
6305 memset(&cp, 0, sizeof(struct mgmt_cp_set_le_batching_enable));
6307 if (bachk(address) < 0)
6308 return btd_error_invalid_args(msg);
6310 cp.bdaddr = bt_addr;
6313 request = g_new(struct le_batching_request, 1);
6314 request->msg = dbus_message_ref(msg);
6315 request->adapter = adapter;
6316 if (mgmt_send(adapter->mgmt, MGMT_OP_SET_LE_BATCHING_ENABLE,
6317 adapter->dev_id, sizeof(cp), &cp,
6318 set_le_batching_enable_complete, request, NULL) == 0) {
6319 dbus_message_unref(request->msg);
6321 return btd_error_failed(msg, "Unable to set le batching enable");
6327 void le_set_data_length_return_param_complete(
6328 uint8_t status, uint16_t length,
6329 const void *param, void *user_data)
6331 if (status != MGMT_STATUS_SUCCESS) {
6332 error("le_set_data_length failed: %s (0x%02x)",
6333 mgmt_errstr(status), status);
6339 int btd_adapter_le_set_data_length(struct btd_adapter *adapter, bdaddr_t *bdaddr,
6340 uint16_t max_tx_octets, uint16_t max_tx_time)
6342 struct mgmt_cp_le_set_data_length cp;
6344 memset(&cp, 0, sizeof(cp));
6346 bacpy(&cp.bdaddr, bdaddr);
6348 cp.max_tx_octets = max_tx_octets;
6349 cp.max_tx_time = max_tx_time;
6351 if (mgmt_send(adapter->mgmt, MGMT_OP_LE_SET_DATA_LENGTH,
6352 adapter->dev_id, sizeof(cp), &cp,
6353 le_set_data_length_return_param_complete,
6360 static DBusMessage *adapter_set_manufacturer_data(DBusConnection *conn,
6361 DBusMessage *msg, void *data)
6363 struct btd_adapter *adapter = data;
6364 struct mgmt_cp_set_manufacturer_data cp;
6368 DBG("Set manufacturer data");
6370 if (!(adapter->current_settings & MGMT_SETTING_POWERED))
6371 return btd_error_not_ready(msg);
6373 if (!dbus_message_get_args(msg, NULL,
6374 DBUS_TYPE_ARRAY, DBUS_TYPE_BYTE, &value, &len,
6376 return btd_error_invalid_args(msg);
6378 if (len > EIR_MANUFACTURER_DATA_LENGTH_MAX)
6379 return btd_error_invalid_args(msg);
6381 memcpy(&cp, value, len);
6383 if (mgmt_send(adapter->mgmt, MGMT_OP_SET_MANUFACTURER_DATA,
6384 adapter->dev_id, EIR_MANUFACTURER_DATA_LENGTH_MAX,
6385 &cp, NULL, NULL, NULL) > 0)
6386 return dbus_message_new_method_return(msg);
6388 return btd_error_failed(msg, "Set manufacturer data failed");
6391 static DBusMessage *adapter_get_energy_info(DBusConnection *conn,
6392 DBusMessage *msg, void *user_data)
6395 uint32_t tx_time = 0;
6396 uint32_t rx_time = 0;
6397 uint32_t idle_time = 0;
6398 uint32_t energy_used = 0;
6400 if (adapter_le_get_energy_info(&tx_time, &rx_time,
6401 &idle_time, &energy_used) == FALSE) {
6402 error("Fail to send vcs for getting energy info");
6403 reply = btd_error_not_supported(msg);
6407 reply = g_dbus_create_reply(msg,
6408 DBUS_TYPE_UINT32, &tx_time,
6409 DBUS_TYPE_UINT32, &rx_time,
6410 DBUS_TYPE_UINT32, &idle_time,
6411 DBUS_TYPE_UINT32, &energy_used,
6415 reply = btd_error_failed(msg,
6416 "Failed to create reply.");
6423 #endif /* TIZEN_FEATURE_BLUEZ_MODIFY */
6425 static DBusMessage *start_discovery(DBusConnection *conn,
6426 DBusMessage *msg, void *user_data)
6428 struct btd_adapter *adapter = user_data;
6429 const char *sender = dbus_message_get_sender(msg);
6430 struct discovery_client *client;
6431 bool is_discovering;
6434 DBG("sender %s", sender);
6436 if (!btd_adapter_get_powered(adapter))
6437 return btd_error_not_ready(msg);
6439 is_discovering = get_discovery_client(adapter, sender, &client);
6442 * Every client can only start one discovery, if the client
6443 * already started a discovery then return an error.
6446 return btd_error_busy(msg);
6449 * If there was pre-set filter, just reconnect it to discovery_list,
6454 return btd_error_busy(msg);
6456 adapter->set_filter_list = g_slist_remove(
6457 adapter->set_filter_list, client);
6458 adapter->discovery_list = g_slist_prepend(
6459 adapter->discovery_list, client);
6464 client = g_new0(struct discovery_client, 1);
6466 client->adapter = adapter;
6467 client->owner = g_strdup(sender);
6468 client->discovery_filter = NULL;
6469 client->watch = g_dbus_add_disconnect_watch(dbus_conn, sender,
6470 discovery_disconnect, client,
6472 adapter->discovery_list = g_slist_prepend(adapter->discovery_list,
6477 * Just trigger the discovery here. In case an already running
6478 * discovery in idle phase exists, it will be restarted right
6481 err = update_discovery_filter(adapter);
6483 return dbus_message_new_method_return(msg);
6485 /* If the discovery has to be started wait it complete to reply */
6486 if (err == -EINPROGRESS) {
6487 client->msg = dbus_message_ref(msg);
6488 #ifndef TIZEN_FEATURE_BLUEZ_MODIFY
6489 adapter->client = client;
6495 return btd_error_failed(msg, strerror(-err));
6498 static bool parse_uuids(DBusMessageIter *value, struct discovery_filter *filter)
6500 DBusMessageIter arriter;
6502 if (dbus_message_iter_get_arg_type(value) != DBUS_TYPE_ARRAY)
6505 dbus_message_iter_recurse(value, &arriter);
6506 while (dbus_message_iter_get_arg_type(&arriter) != DBUS_TYPE_INVALID) {
6507 bt_uuid_t uuid, u128;
6508 char uuidstr[MAX_LEN_UUID_STR + 1];
6511 if (dbus_message_iter_get_arg_type(&arriter) !=
6515 dbus_message_iter_get_basic(&arriter, &uuid_param);
6517 if (bt_string_to_uuid(&uuid, uuid_param))
6520 bt_uuid_to_uuid128(&uuid, &u128);
6521 bt_uuid_to_string(&u128, uuidstr, sizeof(uuidstr));
6523 filter->uuids = g_slist_prepend(filter->uuids, g_strdup(uuidstr));
6525 dbus_message_iter_next(&arriter);
6531 static bool parse_rssi(DBusMessageIter *value, struct discovery_filter *filter)
6533 if (dbus_message_iter_get_arg_type(value) != DBUS_TYPE_INT16)
6536 dbus_message_iter_get_basic(value, &filter->rssi);
6537 /* -127 <= RSSI <= +20 (spec V4.2 [Vol 2, Part E] 7.7.65.2) */
6538 if (filter->rssi > 20 || filter->rssi < -127)
6544 static bool parse_pathloss(DBusMessageIter *value,
6545 struct discovery_filter *filter)
6547 if (dbus_message_iter_get_arg_type(value) != DBUS_TYPE_UINT16)
6550 dbus_message_iter_get_basic(value, &filter->pathloss);
6551 /* pathloss filter must be smaller that PATHLOSS_MAX */
6552 if (filter->pathloss > PATHLOSS_MAX)
6558 static bool parse_transport(DBusMessageIter *value,
6559 struct discovery_filter *filter)
6561 char *transport_str;
6563 if (dbus_message_iter_get_arg_type(value) != DBUS_TYPE_STRING)
6566 dbus_message_iter_get_basic(value, &transport_str);
6568 if (!strcmp(transport_str, "bredr"))
6569 filter->type = SCAN_TYPE_BREDR;
6570 else if (!strcmp(transport_str, "le"))
6571 filter->type = SCAN_TYPE_LE;
6572 else if (strcmp(transport_str, "auto"))
6578 static bool parse_duplicate_data(DBusMessageIter *value,
6579 struct discovery_filter *filter)
6581 if (dbus_message_iter_get_arg_type(value) != DBUS_TYPE_BOOLEAN)
6584 dbus_message_iter_get_basic(value, &filter->duplicate);
6589 static bool parse_discoverable(DBusMessageIter *value,
6590 struct discovery_filter *filter)
6592 if (dbus_message_iter_get_arg_type(value) != DBUS_TYPE_BOOLEAN)
6595 dbus_message_iter_get_basic(value, &filter->discoverable);
6600 static bool parse_pattern(DBusMessageIter *value,
6601 struct discovery_filter *filter)
6603 const char *pattern;
6605 if (dbus_message_iter_get_arg_type(value) != DBUS_TYPE_STRING)
6608 dbus_message_iter_get_basic(value, &pattern);
6610 free(filter->pattern);
6611 filter->pattern = strdup(pattern);
6616 struct filter_parser {
6618 bool (*func)(DBusMessageIter *iter, struct discovery_filter *filter);
6620 { "UUIDs", parse_uuids },
6621 { "RSSI", parse_rssi },
6622 { "Pathloss", parse_pathloss },
6623 { "Transport", parse_transport },
6624 { "DuplicateData", parse_duplicate_data },
6625 { "Discoverable", parse_discoverable },
6626 { "Pattern", parse_pattern },
6630 static bool parse_discovery_filter_entry(char *key, DBusMessageIter *value,
6631 struct discovery_filter *filter)
6633 struct filter_parser *parser;
6635 for (parser = parsers; parser && parser->name; parser++) {
6636 if (!strcmp(parser->name, key))
6637 return parser->func(value, filter);
6640 DBG("Unknown key parameter: %s!\n", key);
6645 * This method is responsible for parsing parameters to SetDiscoveryFilter. If
6646 * filter in msg was empty, sets *filter to NULL. If whole parsing was
6647 * successful, sets *filter to proper value.
6648 * Returns false on any error, and true on success.
6650 static bool parse_discovery_filter_dict(struct btd_adapter *adapter,
6651 struct discovery_filter **filter,
6654 DBusMessageIter iter, subiter, dictiter, variantiter;
6655 bool is_empty = true;
6657 *filter = g_try_malloc(sizeof(**filter));
6661 (*filter)->uuids = NULL;
6662 (*filter)->pathloss = DISTANCE_VAL_INVALID;
6663 (*filter)->rssi = DISTANCE_VAL_INVALID;
6664 (*filter)->type = get_scan_type(adapter);
6665 (*filter)->duplicate = false;
6666 (*filter)->discoverable = false;
6667 (*filter)->pattern = NULL;
6669 dbus_message_iter_init(msg, &iter);
6670 if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_ARRAY ||
6671 dbus_message_iter_get_element_type(&iter) != DBUS_TYPE_DICT_ENTRY)
6674 dbus_message_iter_recurse(&iter, &subiter);
6676 int type = dbus_message_iter_get_arg_type(&subiter);
6679 if (type == DBUS_TYPE_INVALID)
6683 dbus_message_iter_recurse(&subiter, &dictiter);
6685 dbus_message_iter_get_basic(&dictiter, &key);
6686 if (!dbus_message_iter_next(&dictiter))
6689 if (dbus_message_iter_get_arg_type(&dictiter) !=
6693 dbus_message_iter_recurse(&dictiter, &variantiter);
6695 if (!parse_discovery_filter_entry(key, &variantiter, *filter))
6698 dbus_message_iter_next(&subiter);
6707 /* only pathlos or rssi can be set, never both */
6708 if ((*filter)->pathloss != DISTANCE_VAL_INVALID &&
6709 (*filter)->rssi != DISTANCE_VAL_INVALID)
6712 DBG("filtered discovery params: transport: %d rssi: %d pathloss: %d "
6713 " duplicate data: %s discoverable %s pattern %s",
6714 (*filter)->type, (*filter)->rssi, (*filter)->pathloss,
6715 (*filter)->duplicate ? "true" : "false",
6716 (*filter)->discoverable ? "true" : "false",
6717 (*filter)->pattern);
6722 g_slist_free_full((*filter)->uuids, g_free);
6728 static DBusMessage *set_discovery_filter(DBusConnection *conn,
6729 DBusMessage *msg, void *user_data)
6731 struct btd_adapter *adapter = user_data;
6732 struct discovery_client *client;
6733 struct discovery_filter *discovery_filter;
6734 const char *sender = dbus_message_get_sender(msg);
6735 bool is_discovering;
6737 DBG("sender %s", sender);
6739 if (!btd_adapter_get_powered(adapter))
6740 return btd_error_not_ready(msg);
6742 if (MGMT_VERSION(mgmt_version, mgmt_revision) < MGMT_VERSION(1, 8))
6743 return btd_error_not_supported(msg);
6745 /* parse parameters */
6746 if (!parse_discovery_filter_dict(adapter, &discovery_filter, msg))
6747 return btd_error_invalid_args(msg);
6749 is_discovering = get_discovery_client(adapter, sender, &client);
6752 free_discovery_filter(client->discovery_filter);
6753 client->discovery_filter = discovery_filter;
6756 update_discovery_filter(adapter);
6758 if (discovery_filter || is_discovering)
6759 return dbus_message_new_method_return(msg);
6761 /* Removing pre-set filter */
6762 adapter->set_filter_list = g_slist_remove(
6763 adapter->set_filter_list,
6765 discovery_free(client);
6766 DBG("successfully cleared pre-set filter");
6767 } else if (discovery_filter) {
6768 /* Client pre-setting his filter for first time */
6769 client = g_new0(struct discovery_client, 1);
6770 client->adapter = adapter;
6771 client->owner = g_strdup(sender);
6772 client->discovery_filter = discovery_filter;
6773 client->watch = g_dbus_add_disconnect_watch(dbus_conn, sender,
6774 discovery_disconnect, client,
6776 adapter->set_filter_list = g_slist_prepend(
6777 adapter->set_filter_list, client);
6779 DBG("successfully pre-set filter");
6782 return dbus_message_new_method_return(msg);
6785 static DBusMessage *stop_discovery(DBusConnection *conn,
6786 DBusMessage *msg, void *user_data)
6788 struct btd_adapter *adapter = user_data;
6789 const char *sender = dbus_message_get_sender(msg);
6790 struct discovery_client *client;
6794 DBG("sender %s", sender);
6796 if (!btd_adapter_get_powered(adapter))
6797 return btd_error_not_ready(msg);
6799 list = g_slist_find_custom(adapter->discovery_list, sender,
6802 return btd_error_failed(msg, "No discovery started");
6804 client = list->data;
6807 return btd_error_busy(msg);
6809 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
6810 err = discovery_stop(client, false);
6812 err = discovery_stop(client);
6816 return dbus_message_new_method_return(msg);
6818 client->msg = dbus_message_ref(msg);
6819 #ifndef TIZEN_FEATURE_BLUEZ_MODIFY
6820 adapter->client = client;
6824 return btd_error_failed(msg, strerror(-err));
6828 static gboolean property_get_address(const GDBusPropertyTable *property,
6829 DBusMessageIter *iter, void *user_data)
6831 struct btd_adapter *adapter = user_data;
6833 const char *str = addr;
6835 ba2str(&adapter->bdaddr, addr);
6837 dbus_message_iter_append_basic(iter, DBUS_TYPE_STRING, &str);
6842 static gboolean property_get_address_type(const GDBusPropertyTable *property,
6843 DBusMessageIter *iter, void *user_data)
6845 struct btd_adapter *adapter = user_data;
6848 if ((adapter->current_settings & MGMT_SETTING_LE) &&
6849 (adapter->bdaddr_type == BDADDR_LE_RANDOM))
6854 dbus_message_iter_append_basic(iter, DBUS_TYPE_STRING, &str);
6859 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
6860 static gboolean property_get_le_address(const GDBusPropertyTable *property,
6861 DBusMessageIter *iter, void *user_data)
6863 struct btd_adapter *adapter = user_data;
6864 DBusMessageIter entry;
6866 const char *str = addr;
6869 dbus_message_iter_open_container(iter, DBUS_TYPE_ARRAY,
6870 DBUS_TYPE_STRING_AS_STRING, &entry);
6872 if (adapter->le_static_addr.b[5] != 0) {
6873 ba2str(&adapter->le_static_addr, addr);
6874 type = g_strdup_printf("%d", BDADDR_LE_RANDOM);
6876 ba2str(&adapter->bdaddr, addr);
6877 type = g_strdup_printf("%d", BDADDR_LE_PUBLIC);
6880 dbus_message_iter_append_basic(&entry, DBUS_TYPE_STRING, &type);
6881 g_free((void *)type);
6883 dbus_message_iter_append_basic(&entry, DBUS_TYPE_STRING, &str);
6885 dbus_message_iter_close_container(iter, &entry);
6891 static gboolean property_get_name(const GDBusPropertyTable *property,
6892 DBusMessageIter *iter, void *user_data)
6894 struct btd_adapter *adapter = user_data;
6895 const char *str = adapter->system_name ? : "";
6897 dbus_message_iter_append_basic(iter, DBUS_TYPE_STRING, &str);
6902 static gboolean property_get_alias(const GDBusPropertyTable *property,
6903 DBusMessageIter *iter, void *user_data)
6905 struct btd_adapter *adapter = user_data;
6908 if (adapter->current_alias)
6909 str = adapter->current_alias;
6910 else if (adapter->stored_alias)
6911 str = adapter->stored_alias;
6913 str = adapter->system_name ? : "";
6915 dbus_message_iter_append_basic(iter, DBUS_TYPE_STRING, &str);
6920 static void property_set_alias(const GDBusPropertyTable *property,
6921 DBusMessageIter *iter,
6922 GDBusPendingPropertySet id, void *user_data)
6924 struct btd_adapter *adapter = user_data;
6928 dbus_message_iter_get_basic(iter, &name);
6930 if (g_str_equal(name, "") == TRUE) {
6931 if (adapter->stored_alias == NULL) {
6932 /* no alias set, nothing to restore */
6933 g_dbus_pending_property_success(id);
6937 /* restore to system name */
6938 ret = set_name(adapter, adapter->system_name);
6940 if (g_strcmp0(adapter->stored_alias, name) == 0) {
6941 /* alias already set, nothing to do */
6942 g_dbus_pending_property_success(id);
6947 ret = set_name(adapter, name);
6951 g_free(adapter->stored_alias);
6953 if (g_str_equal(name, "") == TRUE)
6954 adapter->stored_alias = NULL;
6956 adapter->stored_alias = g_strdup(name);
6958 store_adapter_info(adapter);
6960 g_dbus_pending_property_success(id);
6965 g_dbus_pending_property_error(id,
6966 ERROR_INTERFACE ".InvalidArguments",
6967 "Invalid arguments in method call");
6969 g_dbus_pending_property_error(id, ERROR_INTERFACE ".Failed",
6973 static gboolean property_get_class(const GDBusPropertyTable *property,
6974 DBusMessageIter *iter, void *user_data)
6976 struct btd_adapter *adapter = user_data;
6977 dbus_uint32_t val = adapter->dev_class;
6979 dbus_message_iter_append_basic(iter, DBUS_TYPE_UINT32, &val);
6984 static gboolean property_get_a2dp_role(const GDBusPropertyTable *property,
6985 DBusMessageIter *iter, void *user_data)
6987 struct btd_adapter *adapter = user_data;
6988 dbus_uint32_t val = adapter->a2dp_role;
6990 dbus_message_iter_append_basic(iter, DBUS_TYPE_UINT32, &val);
6995 static gboolean property_get_mode(struct btd_adapter *adapter,
6996 uint32_t setting, DBusMessageIter *iter)
7000 enable = (adapter->current_settings & setting) ? TRUE : FALSE;
7002 dbus_message_iter_append_basic(iter, DBUS_TYPE_BOOLEAN, &enable);
7007 struct property_set_data {
7008 struct btd_adapter *adapter;
7009 GDBusPendingPropertySet id;
7012 static void property_set_mode_complete(uint8_t status, uint16_t length,
7013 const void *param, void *user_data)
7015 struct property_set_data *data = user_data;
7016 struct btd_adapter *adapter = data->adapter;
7018 DBG("%s (0x%02x)", mgmt_errstr(status), status);
7020 if (status != MGMT_STATUS_SUCCESS) {
7021 const char *dbus_err;
7023 btd_error(adapter->dev_id, "Failed to set mode: %s (0x%02x)",
7024 mgmt_errstr(status), status);
7026 if (status == MGMT_STATUS_RFKILLED)
7027 dbus_err = ERROR_INTERFACE ".Blocked";
7029 dbus_err = ERROR_INTERFACE ".Failed";
7031 g_dbus_pending_property_error(data->id, dbus_err,
7032 mgmt_errstr(status));
7036 g_dbus_pending_property_success(data->id);
7039 * The parameters are identical and also the task that is
7040 * required in both cases. So it is safe to just call the
7041 * event handling functions here.
7043 new_settings_callback(adapter->dev_id, length, param, adapter);
7046 static void clear_discoverable(struct btd_adapter *adapter)
7048 if (!btd_has_kernel_features(KERNEL_CONN_CONTROL))
7051 if (!(adapter->current_settings & MGMT_SETTING_DISCOVERABLE))
7054 /* If no timeout is set do nothing as both connectable and discoverable
7055 * flags are persistent on power toggle.
7057 if (!adapter->discoverable_timeout)
7060 /* If timeout was set kernel clears discoverable on its own when
7061 * powering off controller. This would leave connectable flag set
7064 * With kernel control clearing connectable clear also discoverable
7065 * flag so we need to clear connectable.
7067 set_mode(adapter, MGMT_OP_SET_CONNECTABLE, 0x00);
7070 static void property_set_mode(struct btd_adapter *adapter, uint32_t setting,
7071 DBusMessageIter *value,
7072 GDBusPendingPropertySet id)
7074 struct property_set_data *data;
7075 struct mgmt_cp_set_discoverable cp;
7077 dbus_bool_t enable, current_enable;
7078 uint16_t opcode, len;
7081 dbus_message_iter_get_basic(value, &enable);
7083 if (adapter->pending_settings & setting) {
7084 g_dbus_pending_property_error(id, ERROR_INTERFACE ".Busy",
7089 if (adapter->current_settings & setting)
7090 current_enable = TRUE;
7092 current_enable = FALSE;
7094 if (enable == current_enable) {
7095 g_dbus_pending_property_success(id);
7099 mode = (enable == TRUE) ? 0x01 : 0x00;
7101 adapter->pending_settings |= setting;
7104 case MGMT_SETTING_POWERED:
7105 opcode = MGMT_OP_SET_POWERED;
7110 btd_adv_monitor_power_down(
7111 adapter->adv_monitor_manager);
7112 clear_discoverable(adapter);
7113 remove_temporary_devices(adapter);
7117 case MGMT_SETTING_DISCOVERABLE:
7118 #ifndef TIZEN_FEATURE_BLUEZ_MODIFY
7119 if (btd_has_kernel_features(KERNEL_CONN_CONTROL)) {
7121 set_mode(adapter, MGMT_OP_SET_CONNECTABLE,
7124 opcode = MGMT_OP_SET_CONNECTABLE;
7132 memset(&cp, 0, sizeof(cp));
7135 cp.timeout = htobs(adapter->discoverable_timeout);
7137 opcode = MGMT_OP_SET_DISCOVERABLE;
7141 case MGMT_SETTING_BONDABLE:
7142 opcode = MGMT_OP_SET_BONDABLE;
7146 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
7147 case MGMT_SETTING_CONNECTABLE:
7148 opcode = MGMT_OP_SET_CONNECTABLE;
7157 DBG("sending %s command for index %u", mgmt_opstr(opcode),
7160 data = g_try_new0(struct property_set_data, 1);
7164 data->adapter = adapter;
7167 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
7169 * Use mgmt_send_nowait to avoid dbus timeout in a state of bonding.
7171 if (mgmt_send_nowait(adapter->mgmt, opcode, adapter->dev_id, len, param,
7172 property_set_mode_complete, data, g_free) > 0)
7174 if (mgmt_send(adapter->mgmt, opcode, adapter->dev_id, len, param,
7175 property_set_mode_complete, data, g_free) > 0)
7182 btd_error(adapter->dev_id, "Failed to set mode for index %u",
7185 g_dbus_pending_property_error(id, ERROR_INTERFACE ".Failed", NULL);
7188 static gboolean property_get_powered(const GDBusPropertyTable *property,
7189 DBusMessageIter *iter, void *user_data)
7191 struct btd_adapter *adapter = user_data;
7193 return property_get_mode(adapter, MGMT_SETTING_POWERED, iter);
7196 static void property_set_powered(const GDBusPropertyTable *property,
7197 DBusMessageIter *iter,
7198 GDBusPendingPropertySet id, void *user_data)
7200 struct btd_adapter *adapter = user_data;
7202 if (powering_down) {
7203 g_dbus_pending_property_error(id, ERROR_INTERFACE ".Failed",
7208 property_set_mode(adapter, MGMT_SETTING_POWERED, iter, id);
7211 static gboolean property_get_discoverable(const GDBusPropertyTable *property,
7212 DBusMessageIter *iter, void *user_data)
7214 struct btd_adapter *adapter = user_data;
7216 return property_get_mode(adapter, MGMT_SETTING_DISCOVERABLE, iter);
7219 static void property_set_discoverable(const GDBusPropertyTable *property,
7220 DBusMessageIter *iter,
7221 GDBusPendingPropertySet id, void *user_data)
7223 struct btd_adapter *adapter = user_data;
7225 if (adapter->discoverable_timeout > 0 &&
7226 !btd_adapter_get_powered(adapter)) {
7227 g_dbus_pending_property_error(id, ERROR_INTERFACE ".Failed",
7232 /* Reset discovery_discoverable as Discoverable takes precedence */
7233 adapter->discovery_discoverable = false;
7235 property_set_mode(adapter, MGMT_SETTING_DISCOVERABLE, iter, id);
7238 static gboolean property_get_discoverable_timeout(
7239 const GDBusPropertyTable *property,
7240 DBusMessageIter *iter, void *user_data)
7242 struct btd_adapter *adapter = user_data;
7243 dbus_uint32_t value = adapter->discoverable_timeout;
7245 dbus_message_iter_append_basic(iter, DBUS_TYPE_UINT32, &value);
7250 static void property_set_discoverable_timeout(
7251 const GDBusPropertyTable *property,
7252 DBusMessageIter *iter,
7253 GDBusPendingPropertySet id, void *user_data)
7255 struct btd_adapter *adapter = user_data;
7257 dbus_uint32_t value;
7259 dbus_message_iter_get_basic(iter, &value);
7261 adapter->discoverable_timeout = value;
7263 g_dbus_pending_property_success(id);
7265 store_adapter_info(adapter);
7267 g_dbus_emit_property_changed(dbus_conn, adapter->path,
7268 ADAPTER_INTERFACE, "DiscoverableTimeout");
7270 if (adapter->pending_settings & MGMT_SETTING_DISCOVERABLE) {
7271 if (adapter->current_settings & MGMT_SETTING_DISCOVERABLE)
7276 if (adapter->current_settings & MGMT_SETTING_DISCOVERABLE)
7283 set_discoverable(adapter, 0x01, adapter->discoverable_timeout);
7286 static gboolean property_get_pairable(const GDBusPropertyTable *property,
7287 DBusMessageIter *iter, void *user_data)
7289 struct btd_adapter *adapter = user_data;
7291 return property_get_mode(adapter, MGMT_SETTING_BONDABLE, iter);
7294 static void property_set_pairable(const GDBusPropertyTable *property,
7295 DBusMessageIter *iter,
7296 GDBusPendingPropertySet id, void *user_data)
7298 struct btd_adapter *adapter = user_data;
7300 property_set_mode(adapter, MGMT_SETTING_BONDABLE, iter, id);
7303 static gboolean property_get_pairable_timeout(
7304 const GDBusPropertyTable *property,
7305 DBusMessageIter *iter, void *user_data)
7307 struct btd_adapter *adapter = user_data;
7308 dbus_uint32_t value = adapter->pairable_timeout;
7310 dbus_message_iter_append_basic(iter, DBUS_TYPE_UINT32, &value);
7315 static void property_set_pairable_timeout(const GDBusPropertyTable *property,
7316 DBusMessageIter *iter,
7317 GDBusPendingPropertySet id, void *user_data)
7319 struct btd_adapter *adapter = user_data;
7320 dbus_uint32_t value;
7322 dbus_message_iter_get_basic(iter, &value);
7324 adapter->pairable_timeout = value;
7326 g_dbus_pending_property_success(id);
7328 store_adapter_info(adapter);
7330 g_dbus_emit_property_changed(dbus_conn, adapter->path,
7331 ADAPTER_INTERFACE, "PairableTimeout");
7333 trigger_pairable_timeout(adapter);
7336 static gboolean property_get_discovering(const GDBusPropertyTable *property,
7337 DBusMessageIter *iter, void *user_data)
7339 struct btd_adapter *adapter = user_data;
7340 dbus_bool_t discovering = adapter->discovering;
7342 dbus_message_iter_append_basic(iter, DBUS_TYPE_BOOLEAN, &discovering);
7347 static void add_gatt_uuid(struct gatt_db_attribute *attrib, void *user_data)
7349 GHashTable *uuids = user_data;
7350 bt_uuid_t uuid, u128;
7351 char uuidstr[MAX_LEN_UUID_STR + 1];
7353 if (!gatt_db_service_get_active(attrib))
7356 if (!gatt_db_attribute_get_service_uuid(attrib, &uuid))
7359 bt_uuid_to_uuid128(&uuid, &u128);
7360 bt_uuid_to_string(&u128, uuidstr, sizeof(uuidstr));
7362 g_hash_table_add(uuids, strdup(uuidstr));
7365 static void iter_append_uuid(gpointer key, gpointer value, gpointer user_data)
7367 DBusMessageIter *iter = user_data;
7368 const char *uuid = key;
7370 dbus_message_iter_append_basic(iter, DBUS_TYPE_STRING, &uuid);
7373 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
7374 static gboolean property_get_le_discovering(const GDBusPropertyTable *property,
7375 DBusMessageIter *iter, void *user_data)
7377 struct btd_adapter *adapter = user_data;
7378 dbus_bool_t discovering = adapter->le_discovering;
7380 dbus_message_iter_append_basic(iter, DBUS_TYPE_BOOLEAN, &discovering);
7385 static gboolean property_get_connectable(const GDBusPropertyTable *property,
7386 DBusMessageIter *iter, void *user_data)
7388 struct btd_adapter *adapter = user_data;
7390 return property_get_mode(adapter, MGMT_SETTING_CONNECTABLE, iter);
7393 static void property_set_connectable(const GDBusPropertyTable *property,
7394 DBusMessageIter *iter,
7395 GDBusPendingPropertySet id, void *user_data)
7397 struct btd_adapter *adapter = user_data;
7399 property_set_mode(adapter, MGMT_SETTING_CONNECTABLE, iter, id);
7402 static gboolean property_get_version(const GDBusPropertyTable *property,
7403 DBusMessageIter *iter, void *user_data)
7405 struct btd_adapter *adapter = user_data;
7406 const char *str = adapter->version ? : "";
7408 dbus_message_iter_append_basic(iter, DBUS_TYPE_STRING, &str);
7413 static gboolean property_get_supported_le_features(
7414 const GDBusPropertyTable *property,
7415 DBusMessageIter *iter, void *user_data)
7417 const char *str, *val;
7419 DBusMessageIter entry;
7420 struct btd_adapter *adapter = user_data;
7422 dbus_message_iter_open_container(iter, DBUS_TYPE_ARRAY,
7423 DBUS_TYPE_STRING_AS_STRING, &entry);
7425 value = adapter_le_get_max_adv_instance();
7427 str = g_strdup("adv_inst_max");
7428 dbus_message_iter_append_basic(&entry, DBUS_TYPE_STRING, &str);
7430 val = g_strdup_printf("%d", value);
7431 dbus_message_iter_append_basic(&entry, DBUS_TYPE_STRING, &val);
7433 g_free((void *)str);
7434 g_free((void *)val);
7437 value = adapter_le_is_supported_offloading();
7439 str = g_strdup("rpa_offloading");
7440 dbus_message_iter_append_basic(&entry, DBUS_TYPE_STRING, &str);
7442 val = g_strdup_printf("%d", value);
7443 dbus_message_iter_append_basic(&entry, DBUS_TYPE_STRING, &val);
7445 g_free((void *)str);
7446 g_free((void *)val);
7449 value = adapter_le_get_scan_filter_size();
7450 #ifdef TIZEN_FEATURE_PLATFROM_SCAN_FILTER
7452 value = SCAN_FILTER_SLOTS_MAX;
7455 str = g_strdup("max_filter");
7456 dbus_message_iter_append_basic(&entry, DBUS_TYPE_STRING, &str);
7458 val = g_strdup_printf("%d", value);
7459 dbus_message_iter_append_basic(&entry, DBUS_TYPE_STRING, &val);
7461 g_free((void *)str);
7462 g_free((void *)val);
7465 if (adapter->supported_settings & MGMT_SETTING_PHY_CONFIGURATION) {
7466 /* 2M PHY Support */
7467 str = g_strdup("2m_phy");
7468 dbus_message_iter_append_basic(&entry, DBUS_TYPE_STRING, &str);
7470 if (adapter->le_2m_phy_supported)
7471 val = g_strdup("true");
7473 val = g_strdup("false");
7475 dbus_message_iter_append_basic(&entry, DBUS_TYPE_STRING, &val);
7477 g_free((void *)str);
7478 g_free((void *)val);
7480 /* CODED PHY Support */
7481 str = g_strdup("coded_phy");
7482 dbus_message_iter_append_basic(&entry, DBUS_TYPE_STRING, &str);
7484 if (adapter->le_coded_phy_supported)
7485 val = g_strdup("true");
7487 val = g_strdup("false");
7489 dbus_message_iter_append_basic(&entry, DBUS_TYPE_STRING, &val);
7491 g_free((void *)str);
7492 g_free((void *)val);
7495 dbus_message_iter_close_container(iter, &entry);
7500 static gboolean property_get_ipsp_init_state(
7501 const GDBusPropertyTable *property,
7502 DBusMessageIter *iter, void *data)
7504 struct btd_adapter *adapter = data;
7505 dbus_bool_t ipsp_initialized;
7507 if (adapter->ipsp_intialized)
7508 ipsp_initialized = TRUE;
7510 ipsp_initialized = FALSE;
7512 dbus_message_iter_append_basic(iter, DBUS_TYPE_BOOLEAN,
7519 static gboolean property_get_uuids(const GDBusPropertyTable *property,
7520 DBusMessageIter *iter, void *user_data)
7522 struct btd_adapter *adapter = user_data;
7523 DBusMessageIter entry;
7528 uuids = g_hash_table_new_full(g_str_hash, g_str_equal, free, NULL);
7533 for (l = adapter->services; l != NULL; l = l->next) {
7534 sdp_record_t *rec = l->data;
7537 uuid = bt_uuid2string(&rec->svclass);
7541 g_hash_table_add(uuids, uuid);
7545 db = btd_gatt_database_get_db(adapter->database);
7547 gatt_db_foreach_service(db, NULL, add_gatt_uuid, uuids);
7549 dbus_message_iter_open_container(iter, DBUS_TYPE_ARRAY,
7550 DBUS_TYPE_STRING_AS_STRING, &entry);
7551 g_hash_table_foreach(uuids, iter_append_uuid, &entry);
7552 dbus_message_iter_close_container(iter, &entry);
7554 g_hash_table_destroy(uuids);
7559 static gboolean property_exists_modalias(const GDBusPropertyTable *property,
7562 struct btd_adapter *adapter = user_data;
7564 return adapter->modalias ? TRUE : FALSE;
7567 static gboolean property_get_modalias(const GDBusPropertyTable *property,
7568 DBusMessageIter *iter, void *user_data)
7570 struct btd_adapter *adapter = user_data;
7571 const char *str = adapter->modalias ? : "";
7573 dbus_message_iter_append_basic(iter, DBUS_TYPE_STRING, &str);
7578 static gboolean property_get_roles(const GDBusPropertyTable *property,
7579 DBusMessageIter *iter, void *user_data)
7581 struct btd_adapter *adapter = user_data;
7582 DBusMessageIter entry;
7584 dbus_message_iter_open_container(iter, DBUS_TYPE_ARRAY,
7585 DBUS_TYPE_STRING_AS_STRING, &entry);
7587 if (adapter->supported_settings & MGMT_SETTING_LE) {
7588 const char *str = "central";
7589 dbus_message_iter_append_basic(&entry, DBUS_TYPE_STRING, &str);
7592 if (adapter->supported_settings & MGMT_SETTING_ADVERTISING) {
7593 const char *str = "peripheral";
7594 dbus_message_iter_append_basic(&entry, DBUS_TYPE_STRING, &str);
7597 if (queue_find(adapter->exps, NULL,
7598 le_simult_central_peripheral_uuid.val)) {
7599 const char *str = "central-peripheral";
7600 dbus_message_iter_append_basic(&entry, DBUS_TYPE_STRING, &str);
7603 dbus_message_iter_close_container(iter, &entry);
7608 static void property_append_experimental(void *data, void *user_data)
7610 uint8_t *feature = data;
7611 DBusMessageIter *iter = user_data;
7614 char str[MAX_LEN_UUID_STR + 1];
7617 bswap_128(feature, &value);
7618 bt_uuid128_create(&uuid, value);
7619 bt_uuid_to_string(&uuid, str, sizeof(str));
7623 dbus_message_iter_append_basic(iter, DBUS_TYPE_STRING, &ptr);
7626 static gboolean property_get_experimental(const GDBusPropertyTable *property,
7627 DBusMessageIter *iter, void *user_data)
7629 struct btd_adapter *adapter = user_data;
7630 DBusMessageIter entry;
7632 dbus_message_iter_open_container(iter, DBUS_TYPE_ARRAY,
7633 DBUS_TYPE_STRING_AS_STRING, &entry);
7635 queue_foreach(adapter->exps, property_append_experimental, &entry);
7637 dbus_message_iter_close_container(iter, &entry);
7642 static gboolean property_experimental_exits(const GDBusPropertyTable *property,
7645 struct btd_adapter *adapter = data;
7647 return !queue_isempty(adapter->exps);
7650 static DBusMessage *remove_device(DBusConnection *conn,
7651 DBusMessage *msg, void *user_data)
7653 struct btd_adapter *adapter = user_data;
7654 struct btd_device *device;
7658 if (dbus_message_get_args(msg, NULL, DBUS_TYPE_OBJECT_PATH, &path,
7659 DBUS_TYPE_INVALID) == FALSE)
7660 return btd_error_invalid_args(msg);
7662 list = g_slist_find_custom(adapter->devices, path, device_path_cmp);
7664 return btd_error_does_not_exist(msg);
7666 if (!btd_adapter_get_powered(adapter))
7667 return btd_error_not_ready(msg);
7669 device = list->data;
7671 btd_device_set_temporary(device, true);
7673 if (!btd_device_is_connected(device)) {
7674 btd_adapter_remove_device(adapter, device);
7675 return dbus_message_new_method_return(msg);
7678 device_request_disconnect(device, msg);
7683 static DBusMessage *get_discovery_filters(DBusConnection *conn,
7684 DBusMessage *msg, void *user_data)
7687 DBusMessageIter iter, array;
7688 struct filter_parser *parser;
7690 reply = dbus_message_new_method_return(msg);
7692 dbus_message_iter_init_append(reply, &iter);
7694 dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY,
7695 DBUS_TYPE_STRING_AS_STRING, &array);
7697 for (parser = parsers; parser && parser->name; parser++) {
7698 dbus_message_iter_append_basic(&array, DBUS_TYPE_STRING,
7702 dbus_message_iter_close_container(&iter, &array);
7707 struct device_connect_data {
7708 struct btd_adapter *adapter;
7714 static void device_browse_cb(struct btd_device *dev, int err, void *user_data)
7716 DBG("err %d (%s)", err, strerror(-err));
7719 btd_device_connect_services(dev, NULL);
7722 static void device_connect_cb(GIOChannel *io, GError *gerr, gpointer user_data)
7724 struct device_connect_data *data = user_data;
7725 struct btd_adapter *adapter = data->adapter;
7726 struct btd_device *device;
7729 DBG("%s", gerr ? gerr->message : "");
7734 /* object might already exist due to mgmt socket event */
7735 device = btd_adapter_get_device(adapter, &data->dst, data->dst_type);
7739 path = device_get_path(device);
7741 g_dbus_send_reply(dbus_conn, data->msg, DBUS_TYPE_OBJECT_PATH, &path,
7744 /* continue with service discovery and connection */
7745 btd_device_set_temporary(device, false);
7746 device_update_last_seen(device, data->dst_type);
7748 if (data->dst_type != BDADDR_BREDR){
7749 g_io_channel_set_close_on_unref(io, FALSE);
7750 device_attach_att(device, io);
7753 device_discover_services(device);
7754 device_wait_for_svc_complete(device, device_browse_cb, NULL);
7756 g_io_channel_unref(io);
7757 dbus_message_unref(data->msg);
7762 g_dbus_send_error(dbus_conn, data->msg, "org.bluez.Failed", NULL);
7763 g_io_channel_unref(io);
7764 dbus_message_unref(data->msg);
7768 static void device_connect(struct btd_adapter *adapter, const bdaddr_t *dst,
7769 uint8_t dst_type, DBusMessage *msg)
7771 struct device_connect_data *data;
7774 data = new0(struct device_connect_data, 1);
7775 data->adapter = adapter;
7776 bacpy(&data->dst, dst);
7777 data->dst_type = dst_type;
7778 data->msg = dbus_message_ref(msg);
7780 if (dst_type == BDADDR_BREDR)
7781 io = bt_io_connect(device_connect_cb, data, NULL, NULL,
7782 BT_IO_OPT_SOURCE_BDADDR, &adapter->bdaddr,
7783 BT_IO_OPT_SOURCE_TYPE, BDADDR_BREDR,
7784 BT_IO_OPT_DEST_BDADDR, dst,
7785 BT_IO_OPT_DEST_TYPE, BDADDR_BREDR,
7786 BT_IO_OPT_PSM, SDP_PSM,
7787 BT_IO_OPT_SEC_LEVEL, BT_IO_SEC_LOW,
7790 io = bt_io_connect(device_connect_cb, data, NULL, NULL,
7791 BT_IO_OPT_SOURCE_BDADDR, &adapter->bdaddr,
7792 BT_IO_OPT_SOURCE_TYPE, adapter->bdaddr_type,
7793 BT_IO_OPT_DEST_BDADDR, dst,
7794 BT_IO_OPT_DEST_TYPE, dst_type,
7795 BT_IO_OPT_CID, ATT_CID,
7796 BT_IO_OPT_SEC_LEVEL, BT_IO_SEC_LOW,
7800 g_dbus_send_message(dbus_conn,
7801 btd_error_failed(msg, "Connect failed"));
7802 dbus_message_unref(data->msg);
7807 static DBusMessage *connect_device(DBusConnection *conn,
7808 DBusMessage *msg, void *user_data)
7810 struct btd_adapter *adapter = user_data;
7811 DBusMessageIter iter, subiter, dictiter, value;
7812 uint8_t addr_type = BDADDR_BREDR;
7813 bdaddr_t addr = *BDADDR_ANY;
7815 DBG("sender %s", dbus_message_get_sender(msg));
7817 if (!btd_adapter_get_powered(adapter))
7818 return btd_error_not_ready(msg);
7820 dbus_message_iter_init(msg, &iter);
7821 if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_ARRAY ||
7822 dbus_message_iter_get_element_type(&iter) != DBUS_TYPE_DICT_ENTRY)
7823 return btd_error_invalid_args(msg);
7825 dbus_message_iter_recurse(&iter, &subiter);
7827 int type = dbus_message_iter_get_arg_type(&subiter);
7831 if (type == DBUS_TYPE_INVALID)
7834 dbus_message_iter_recurse(&subiter, &dictiter);
7836 dbus_message_iter_get_basic(&dictiter, &key);
7837 if (!dbus_message_iter_next(&dictiter))
7838 return btd_error_invalid_args(msg);
7840 if (dbus_message_iter_get_arg_type(&dictiter) !=
7842 return btd_error_invalid_args(msg);
7844 dbus_message_iter_recurse(&dictiter, &value);
7846 if (!strcmp(key, "Address")) {
7847 if (dbus_message_iter_get_arg_type(&value) !=
7849 return btd_error_invalid_args(msg);
7851 dbus_message_iter_get_basic(&value, &str);
7853 if (str2ba(str, &addr) < 0 )
7854 return btd_error_invalid_args(msg);
7855 } else if (!strcmp(key, "AddressType")) {
7856 if (dbus_message_iter_get_arg_type(&value) !=
7858 return btd_error_invalid_args(msg);
7860 dbus_message_iter_get_basic(&value, &str);
7863 if (!strcmp(str, "public"))
7864 addr_type = BDADDR_LE_PUBLIC;
7865 else if (!strcmp(str, "random"))
7866 addr_type = BDADDR_LE_RANDOM;
7868 return btd_error_invalid_args(msg);
7870 return btd_error_invalid_args(msg);
7873 dbus_message_iter_next(&subiter);
7876 if (!bacmp(&addr, BDADDR_ANY))
7877 return btd_error_invalid_args(msg);
7879 if (btd_adapter_find_device(adapter, &addr, addr_type))
7880 return btd_error_already_exists(msg);
7882 device_connect(adapter, &addr, addr_type, msg);
7886 static void update_device_allowed_services(void *data, void *user_data)
7888 struct btd_device *device = data;
7890 btd_device_update_allowed_services(device);
7893 static void add_uuid_to_uuid_set(void *data, void *user_data)
7895 bt_uuid_t *uuid = data;
7896 GHashTable *uuid_set = user_data;
7899 error("Found NULL in UUID allowed list");
7903 g_hash_table_add(uuid_set, uuid);
7906 static guint bt_uuid_hash(gconstpointer key)
7908 const bt_uuid_t *uuid = key;
7915 bt_uuid_to_uuid128(uuid, &uuid_128);
7916 val = (uint64_t *)&uuid_128.value.u128;
7918 return g_int64_hash(val) ^ g_int64_hash(val+1);
7921 static gboolean bt_uuid_equal(gconstpointer v1, gconstpointer v2)
7923 const bt_uuid_t *uuid1 = v1;
7924 const bt_uuid_t *uuid2 = v2;
7926 if (!uuid1 || !uuid2)
7927 return !uuid1 && !uuid2;
7929 return bt_uuid_cmp(uuid1, uuid2) == 0;
7932 bool btd_adapter_set_allowed_uuids(struct btd_adapter *adapter,
7933 struct queue *uuids)
7938 if (adapter->allowed_uuid_set)
7939 g_hash_table_destroy(adapter->allowed_uuid_set);
7941 adapter->allowed_uuid_set = g_hash_table_new(bt_uuid_hash,
7943 if (!adapter->allowed_uuid_set) {
7944 btd_error(adapter->dev_id,
7945 "Failed to allocate allowed_uuid_set");
7949 queue_foreach(uuids, add_uuid_to_uuid_set, adapter->allowed_uuid_set);
7950 g_slist_foreach(adapter->devices, update_device_allowed_services, NULL);
7955 bool btd_adapter_is_uuid_allowed(struct btd_adapter *adapter,
7956 const char *uuid_str)
7960 if (!adapter || !adapter->allowed_uuid_set)
7963 if (bt_string_to_uuid(&uuid, uuid_str)) {
7964 btd_error(adapter->dev_id,
7965 "Failed to parse UUID string '%s'", uuid_str);
7969 return !g_hash_table_size(adapter->allowed_uuid_set) ||
7970 g_hash_table_contains(adapter->allowed_uuid_set, &uuid);
7973 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
7974 static DBusMessage *adapter_unpair_device(DBusConnection *conn,
7975 DBusMessage *msg, void *user_data)
7978 struct btd_adapter *adapter = user_data;
7979 struct btd_device *device;
7983 if (dbus_message_get_args(msg, NULL, DBUS_TYPE_OBJECT_PATH, &path,
7984 DBUS_TYPE_INVALID) == FALSE)
7985 return btd_error_invalid_args(msg);
7987 list = g_slist_find_custom(adapter->devices, path, device_path_cmp);
7989 return btd_error_does_not_exist(msg);
7991 if (!(adapter->current_settings & MGMT_SETTING_POWERED))
7992 return btd_error_not_ready(msg);
7994 device = list->data;
7996 btd_device_set_temporary(device, TRUE);
7998 if (!btd_device_is_connected(device)) {
7999 btd_adapter_unpair_device(adapter, device);
8000 return dbus_message_new_method_return(msg);
8003 device_request_disconnect(device, msg);
8009 static DBusMessage *create_device(DBusConnection *conn,
8010 DBusMessage *msg, void *data)
8012 struct btd_adapter *adapter = data;
8013 const gchar *address;
8017 if (dbus_message_get_args(msg, NULL, DBUS_TYPE_STRING, &address,
8018 DBUS_TYPE_INVALID) == FALSE)
8019 return btd_error_invalid_args(msg);
8021 if (bachk(address) < 0)
8022 return btd_error_invalid_args(msg);
8026 str2ba(address, &addr);
8027 btd_adapter_get_device(adapter, &addr, BDADDR_BREDR);
8030 return dbus_message_new_method_return(msg);
8033 static DBusMessage *find_device(DBusConnection *conn, DBusMessage *msg,
8036 struct btd_adapter *adapter = data;
8037 struct btd_device *device;
8039 const gchar *address;
8041 const gchar *dev_path;
8043 if (!dbus_message_get_args(msg, NULL, DBUS_TYPE_STRING, &address,
8045 return btd_error_invalid_args(msg);
8047 l = g_slist_find_custom(adapter->devices, address, device_rpa_cmp);
8049 l = g_slist_find_custom(adapter->devices, address,
8050 device_address_cmp);
8052 return btd_error_does_not_exist(msg);
8056 reply = dbus_message_new_method_return(msg);
8060 dev_path = device_get_path(device);
8062 dbus_message_append_args(reply,
8063 DBUS_TYPE_OBJECT_PATH, &dev_path,
8069 static gboolean adapter_ipsp_connected(struct btd_adapter *adapter)
8073 DBG("%s", adapter->path);
8075 for (l = adapter->connections; l != NULL; l = next) {
8076 struct btd_device *dev = l->data;
8078 next = g_slist_next(l);
8080 if (device_is_ipsp_connected(dev))
8087 static void adapter_set_ipsp_init_state(struct btd_adapter *adapter, gboolean initialized)
8089 if (adapter->ipsp_intialized == initialized)
8092 adapter->ipsp_intialized = initialized;
8094 g_dbus_emit_property_changed(dbus_conn, adapter->path,
8095 ADAPTER_INTERFACE, "IpspInitStateChanged");
8098 static void deinitialize_6lowpan_complete(uint8_t status, uint16_t length,
8099 const void *param, void *user_data)
8101 struct btd_adapter *adapter = user_data;
8102 bool initialized = FALSE;
8104 if (status != MGMT_STATUS_SUCCESS)
8105 error("De-Initialize BT 6lowpan failed for hci%u: %s (0x%02x)",
8106 adapter->dev_id, mgmt_errstr(status), status);
8108 adapter_set_ipsp_init_state(adapter, initialized);
8109 DBG("De-Initialize BT 6lowpan successfully for hci%u",
8114 static bool deinitialize_6lowpan(struct btd_adapter *adapter)
8116 struct mgmt_cp_enable_6lowpan cp;
8118 memset(&cp, 0, sizeof(cp));
8120 cp.enable_6lowpan = DEINIT_6LOWPAN;
8121 if (mgmt_send(adapter->mgmt, MGMT_OP_ENABLE_6LOWPAN,
8122 adapter->dev_id, sizeof(cp), &cp,
8123 deinitialize_6lowpan_complete, adapter, NULL) > 0)
8126 error("Failed to de-initialize BT 6Lowpan for index %u",
8131 static void initialize_6lowpan_complete(uint8_t status, uint16_t length,
8132 const void *param, void *user_data)
8134 struct btd_adapter *adapter = user_data;
8135 bool initialized = TRUE;
8137 if (status != MGMT_STATUS_SUCCESS)
8138 error("Initialize BT 6lowpan failed for hci%u: %s (0x%02x)",
8139 adapter->dev_id, mgmt_errstr(status), status);
8141 adapter_set_ipsp_init_state(adapter, initialized);
8142 DBG("Initialize BT 6lowpan successfully for hci%u",
8147 static bool initialize_6lowpan(struct btd_adapter *adapter)
8149 struct mgmt_cp_enable_6lowpan cp;
8151 memset(&cp, 0, sizeof(cp));
8153 cp.enable_6lowpan = INIT_6LOWPAN;
8154 if (mgmt_send(adapter->mgmt, MGMT_OP_ENABLE_6LOWPAN,
8155 adapter->dev_id, sizeof(cp), &cp,
8156 initialize_6lowpan_complete, adapter, NULL) > 0)
8159 error("Failed to initialize BT 6Lowpan for index %u",
8164 static DBusMessage *adapter_initialize_ipsp(DBusConnection *conn,
8165 DBusMessage *msg, void *data)
8167 struct btd_adapter *adapter = data;
8170 DBG("Initialize IPSP");
8172 if (!(adapter->current_settings & MGMT_SETTING_POWERED))
8173 return btd_error_not_ready(msg);
8175 if (adapter->ipsp_intialized)
8176 return btd_error_already_exists(msg);
8178 /* Enable BT 6lowpan in kernel */
8179 err = initialize_6lowpan(adapter);
8182 return btd_error_failed(msg, "Failed to initialize BT 6lowpan");
8184 return dbus_message_new_method_return(msg);
8187 static DBusMessage *adapter_deinitialize_ipsp(DBusConnection *conn,
8188 DBusMessage *msg, void *data)
8190 struct btd_adapter *adapter = data;
8193 DBG("De-initialize IPSP");
8195 if (!(adapter->current_settings & MGMT_SETTING_POWERED))
8196 return btd_error_not_ready(msg);
8198 if (!adapter->ipsp_intialized)
8199 return btd_error_not_permitted(msg, "IPSP not initialized");
8201 if (adapter_ipsp_connected(adapter))
8202 return btd_error_not_permitted(msg, "IPSP Client device found connected");
8204 /* Disable BT 6lowpan in kernel */
8205 err = deinitialize_6lowpan(adapter);
8208 return btd_error_failed(msg, "Failed to deinitialize BT 6lowpan");
8210 return dbus_message_new_method_return(msg);
8214 static const GDBusMethodTable adapter_methods[] = {
8215 { GDBUS_ASYNC_METHOD("StartDiscovery", NULL, NULL, start_discovery) },
8216 { GDBUS_METHOD("SetDiscoveryFilter",
8217 GDBUS_ARGS({ "properties", "a{sv}" }), NULL,
8218 set_discovery_filter) },
8219 { GDBUS_ASYNC_METHOD("StopDiscovery", NULL, NULL, stop_discovery) },
8220 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
8221 { GDBUS_METHOD("GetPSML2capLE",
8222 GDBUS_ARGS({ "path", "o"}),
8223 GDBUS_ARGS({ "psm", "i" }),
8224 adapter_get_psm_l2cap_le) },
8225 { GDBUS_METHOD("ListenL2capLESocket",
8226 GDBUS_ARGS({ "path", "o"}, { "psm", "i" }, { "options", "a{sv}" }),
8227 NULL, adapter_listen_l2cap_le_socket) },
8228 { GDBUS_METHOD("RemoveL2capLESocket", GDBUS_ARGS({ "path", "o" }),
8229 NULL, adapter_remove_l2cap_le_socket) },
8230 { GDBUS_METHOD("StartCustomDiscovery",
8231 GDBUS_ARGS({ "type", "s" }), NULL,
8232 adapter_start_custom_discovery) },
8233 { GDBUS_METHOD("StartLEDiscovery", NULL, NULL,
8234 adapter_start_le_discovery) },
8235 { GDBUS_ASYNC_METHOD("StopLEDiscovery", NULL, NULL,
8236 adapter_stop_le_discovery) },
8237 { GDBUS_METHOD("SetAdvertising",
8238 GDBUS_ARGS({ "enable", "b" },
8239 { "slot_id", "i" }), NULL,
8240 adapter_set_advertising) },
8241 { GDBUS_METHOD("SetAdvertisingParameters",
8242 GDBUS_ARGS({ "interval_min", "u" },
8243 { "interval_max", "u" },
8244 { "filter_policy", "u" },
8246 { "tx_power_level", "i" },
8247 { "slot_id", "i" }), NULL,
8248 adapter_set_advertising_params) },
8249 { GDBUS_METHOD("SetAdvertisingData",
8250 GDBUS_ARGS({ "value", "ay" },
8251 { "slot_id", "i" }), NULL,
8252 adapter_set_advertising_data) },
8253 { GDBUS_METHOD("SetScanParameters",
8254 GDBUS_ARGS({ "type", "u" },
8255 { "interval", "u" },
8256 { "window", "u" }), NULL,
8257 adapter_le_set_scan_params) },
8258 { GDBUS_ASYNC_METHOD("scan_filter_param_setup",
8259 GDBUS_ARGS({ "client_if", "i" }, { "action", "i" },
8260 { "filt_index", "i" }, { "feat_seln", "i"},
8261 { "list_logic_type", "i" }, { "filt_logic_type", "i"},
8262 { "rssi_high_thres", "i" }, { "rssi_low_thres", "i"},
8263 { "dely_mode", "i" }, { "found_timeout", "i"},
8264 { "lost_timeout", "i" }, { "found_timeout_cnt", "i"}), NULL,
8265 adapter_le_scan_filter_param_setup) },
8266 { GDBUS_ASYNC_METHOD("scan_filter_add_remove",
8267 GDBUS_ARGS({ "client_if", "i" }, { "action", "i" },
8268 { "filt_type", "i" }, { "filt_index", "i"},
8269 { "company_id", "i" }, { "company_id_mask", "i"},
8270 { "p_uuid", "ay" }, { "p_uuid_mask", "ay" },
8271 { "string", "s" }, { "address_type", "u" },
8272 /*{ "data_len", "i" },*/ { "p_data", "ay" },
8273 /*{ "mask_len", "i" },*/ { "p_mask", "ay" }), NULL,
8274 adapter_le_scan_filter_add_remove) },
8275 { GDBUS_ASYNC_METHOD("scan_filter_clear",
8276 GDBUS_ARGS({ "client_if", "i" }, { "filt_index", "i" }), NULL,
8277 adapter_le_scan_filter_clear) },
8278 { GDBUS_ASYNC_METHOD("scan_filter_enable",
8279 GDBUS_ARGS({ "client_if", "i" }, { "enable", "b" }), NULL,
8280 adapter_le_scan_filter_enable) },
8281 { GDBUS_METHOD("InitializeIpsp",
8283 adapter_initialize_ipsp) },
8284 { GDBUS_METHOD("DeinitializeIpsp",
8286 adapter_deinitialize_ipsp) },
8287 { GDBUS_METHOD("SetScanRespData",
8288 GDBUS_ARGS({ "value", "ay" },
8289 { "slot_id", "i" }), NULL,
8290 adapter_set_scan_rsp_data) },
8291 { GDBUS_METHOD("AddDeviceWhiteList",
8292 GDBUS_ARGS({ "address", "s" },
8293 { "address_type", "u" }), NULL,
8294 adapter_add_device_white_list) },
8295 { GDBUS_METHOD("RemoveDeviceWhiteList",
8296 GDBUS_ARGS({ "address", "s" },
8297 { "address_type", "u" }), NULL,
8298 adapter_remove_device_white_list) },
8299 { GDBUS_METHOD("ClearDeviceWhiteList",
8301 adapter_clear_device_white_list) },
8302 { GDBUS_METHOD("SetLePrivacy",
8303 GDBUS_ARGS({ "enable", "b" }), NULL,
8304 adapter_set_le_privacy) },
8305 { GDBUS_METHOD("SetLeStaticRandomAddress",
8306 GDBUS_ARGS({ "enable", "b" }), NULL,
8307 adapter_set_le_static_address) },
8308 { GDBUS_ASYNC_METHOD("EnableRssi",
8309 GDBUS_ARGS({ "bt_address", "s" },
8310 { "link_type", "i" },
8312 { "in_range_th", "i" },
8315 adapter_enable_rssi) },
8316 { GDBUS_ASYNC_METHOD("GetRssiStrength",
8317 GDBUS_ARGS({ "bt_address", "s" }, { "link_type", "i" }),
8319 adapter_get_rssi) },
8320 { GDBUS_ASYNC_METHOD("UnpairDevice",
8321 GDBUS_ARGS({ "device", "o" }), NULL, adapter_unpair_device) },
8322 { GDBUS_METHOD("FindDevice",
8323 GDBUS_ARGS({ "address", "s" }),
8324 GDBUS_ARGS({ "device", "o" }),
8326 { GDBUS_METHOD("SetWbsParameters",
8327 GDBUS_ARGS({ "role", "s" }, { "bt_address", "s" }),
8329 set_wbs_parameters) },
8330 { GDBUS_METHOD("SetNbParameters",
8331 GDBUS_ARGS({ "role", "s" }, { "bt_address", "s" }),
8333 set_nb_parameters) },
8334 { GDBUS_METHOD("SetManufacturerData",
8335 GDBUS_ARGS({ "value", "ay" }), NULL,
8336 adapter_set_manufacturer_data) },
8337 { GDBUS_ASYNC_METHOD("CreateDevice",
8338 GDBUS_ARGS({ "address", "s" }), NULL,
8340 { GDBUS_METHOD("GetEnergyInfo",
8342 GDBUS_ARGS({ "tx_time", "u" },
8344 { "idle_time", "u" },
8345 { "energy_used", "u" }),
8346 adapter_get_energy_info) },
8348 { GDBUS_ASYNC_METHOD("RemoveDevice",
8349 GDBUS_ARGS({ "device", "o" }), NULL, remove_device) },
8350 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
8351 { GDBUS_ASYNC_METHOD("LEReadMaximumDataLength", NULL,
8352 GDBUS_ARGS({"maxTxOctets", "q" }, { "maxTxTime", "q" },
8353 {"maxRxOctets", "q" }, { "maxRxTime", "q" }),
8354 le_read_maximum_data_length)},
8355 { GDBUS_ASYNC_METHOD("LEWriteHostSuggestedDataLength",
8356 GDBUS_ARGS({"def_tx_octets", "q" }, { "def_tx_time", "q" }), NULL,
8357 le_write_host_suggested_default_data_length)},
8358 { GDBUS_ASYNC_METHOD("LEReadHostSuggestedDataLength", NULL,
8359 GDBUS_ARGS({"def_tx_octets", "q" }, { "def_tx_time", "q" }),
8360 le_read_host_suggested_default_data_length)},
8361 { GDBUS_ASYNC_METHOD("GetLeBatchingAvailablePkts",
8363 GDBUS_ARGS({ "AvailablePkts", "u" }),
8364 adapter_get_le_batching_available_pkts) },
8365 { GDBUS_ASYNC_METHOD("EnableLeBatching",
8366 GDBUS_ARGS({ "bt_address", "s" },
8367 { "packet_threshold", "i" },
8370 adapter_enable_le_batching) },
8371 { GDBUS_ASYNC_METHOD("DisableLeBatching",
8372 GDBUS_ARGS({ "bt_address", "s" }),
8374 adapter_disable_le_batching) },
8376 { GDBUS_METHOD("GetDiscoveryFilters", NULL,
8377 GDBUS_ARGS({ "filters", "as" }),
8378 get_discovery_filters) },
8379 { GDBUS_EXPERIMENTAL_ASYNC_METHOD("ConnectDevice",
8380 GDBUS_ARGS({ "properties", "a{sv}" }), NULL,
8385 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
8386 static const GDBusSignalTable adapter_signals[] = {
8387 { GDBUS_SIGNAL("AdvertisingEnabled",
8388 GDBUS_ARGS({ "slot_id", "i" },
8389 { "enabled", "b"})) },
8390 { GDBUS_SIGNAL("RssiEnabled",
8391 GDBUS_ARGS({"address","s"},
8392 { "link_type", "i" },
8393 { "enabled", "b"})) },
8394 { GDBUS_SIGNAL("RssiAlert",
8395 GDBUS_ARGS({"address","s"},
8396 { "link_type", "i" },
8397 { "alert_type", "i" },
8398 { "rssi_dbm", "i"})) },
8399 { GDBUS_SIGNAL("RawRssi",
8400 GDBUS_ARGS({"address","s"},
8401 { "link_type", "i" },
8402 { "rssi_dbm", "i"})) },
8403 { GDBUS_SIGNAL("HardwareError", NULL) },
8404 { GDBUS_SIGNAL("TxTimeoutError", NULL) },
8409 static const GDBusPropertyTable adapter_properties[] = {
8410 { "Address", "s", property_get_address },
8411 { "AddressType", "s", property_get_address_type },
8412 { "Name", "s", property_get_name },
8413 { "Alias", "s", property_get_alias, property_set_alias },
8414 { "Class", "u", property_get_class },
8415 { "Powered", "b", property_get_powered, property_set_powered },
8416 { "Discoverable", "b", property_get_discoverable,
8417 property_set_discoverable },
8418 { "DiscoverableTimeout", "u", property_get_discoverable_timeout,
8419 property_set_discoverable_timeout },
8420 { "Pairable", "b", property_get_pairable, property_set_pairable },
8421 { "PairableTimeout", "u", property_get_pairable_timeout,
8422 property_set_pairable_timeout },
8423 { "Discovering", "b", property_get_discovering },
8424 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
8425 { "LEDiscovering", "b", property_get_le_discovering },
8427 { "UUIDs", "as", property_get_uuids },
8428 { "Modalias", "s", property_get_modalias, NULL,
8429 property_exists_modalias },
8430 { "Roles", "as", property_get_roles },
8431 { "ExperimentalFeatures", "as", property_get_experimental, NULL,
8432 property_experimental_exits },
8433 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
8434 { "Connectable", "b", property_get_connectable,
8435 property_set_connectable },
8436 { "Version", "s", property_get_version },
8437 { "SupportedLEFeatures", "as", property_get_supported_le_features},
8438 { "IpspInitStateChanged", "b", property_get_ipsp_init_state},
8439 { "LEAddress", "as", property_get_le_address },
8440 { "A2dpRole", "u", property_get_a2dp_role },
8446 static int str2buf(const char *str, uint8_t *buf, size_t blen)
8453 memset(buf, 0, blen);
8455 dlen = MIN((strlen(str) / 2), blen);
8457 for (i = 0; i < dlen; i++)
8458 sscanf(str + (i * 2), "%02hhX", &buf[i]);
8463 static bool is_blocked_key(uint8_t key_type, uint8_t *key_value)
8467 for (i = 0; i < ARRAY_SIZE(blocked_keys); ++i) {
8468 if (key_type == blocked_keys[i].type &&
8469 !memcmp(blocked_keys[i].val, key_value,
8470 sizeof(blocked_keys[i].val)))
8477 static struct link_key_info *get_key_info(GKeyFile *key_file, const char *peer)
8479 struct link_key_info *info = NULL;
8482 str = g_key_file_get_string(key_file, "LinkKey", "Key", NULL);
8483 if (!str || strlen(str) < 32)
8486 info = g_new0(struct link_key_info, 1);
8488 str2ba(peer, &info->bdaddr);
8490 if (!strncmp(str, "0x", 2))
8491 str2buf(&str[2], info->key, sizeof(info->key));
8493 str2buf(&str[0], info->key, sizeof(info->key));
8495 info->type = g_key_file_get_integer(key_file, "LinkKey", "Type", NULL);
8496 info->pin_len = g_key_file_get_integer(key_file, "LinkKey", "PINLength",
8499 info->is_blocked = is_blocked_key(HCI_BLOCKED_KEY_TYPE_LINKKEY,
8508 static struct smp_ltk_info *get_ltk(GKeyFile *key_file, const char *peer,
8509 uint8_t peer_type, const char *group)
8511 struct smp_ltk_info *ltk = NULL;
8515 key = g_key_file_get_string(key_file, group, "Key", NULL);
8516 if (!key || strlen(key) < 32)
8519 rand = g_key_file_get_string(key_file, group, "Rand", NULL);
8523 ltk = g_new0(struct smp_ltk_info, 1);
8525 /* Default to assuming a central key */
8526 ltk->central = true;
8528 str2ba(peer, <k->bdaddr);
8529 ltk->bdaddr_type = peer_type;
8532 * Long term keys should respond to an identity address which can
8533 * either be a public address or a random static address. Keys
8534 * stored for resolvable random and unresolvable random addresses
8537 * This is an extra sanity check for older kernel versions or older
8538 * daemons that might have been instructed to store long term keys
8539 * for these temporary addresses.
8541 if (ltk->bdaddr_type == BDADDR_LE_RANDOM &&
8542 (ltk->bdaddr.b[5] & 0xc0) != 0xc0) {
8548 if (!strncmp(key, "0x", 2))
8549 str2buf(&key[2], ltk->val, sizeof(ltk->val));
8551 str2buf(&key[0], ltk->val, sizeof(ltk->val));
8553 if (!strncmp(rand, "0x", 2)) {
8555 str2buf(&rand[2], (uint8_t *) &rand_le, sizeof(rand_le));
8556 ltk->rand = le64_to_cpu(rand_le);
8558 sscanf(rand, "%" PRIu64, <k->rand);
8561 ltk->authenticated = g_key_file_get_integer(key_file, group,
8562 "Authenticated", NULL);
8563 ltk->enc_size = g_key_file_get_integer(key_file, group, "EncSize",
8565 ltk->ediv = g_key_file_get_integer(key_file, group, "EDiv", NULL);
8567 ltk->is_blocked = is_blocked_key(HCI_BLOCKED_KEY_TYPE_LTK,
8577 static struct smp_ltk_info *get_ltk_info(GKeyFile *key_file, const char *peer,
8578 uint8_t bdaddr_type)
8582 return get_ltk(key_file, peer, bdaddr_type, "LongTermKey");
8585 static struct smp_ltk_info *get_peripheral_ltk_info(GKeyFile *key_file,
8587 uint8_t bdaddr_type)
8589 struct smp_ltk_info *ltk;
8593 /* Peripheral* is the proper term, but for now read both entries
8594 * so it won't break when user up/downgrades. Remove the other
8595 * term after a few releases.
8597 ltk = get_ltk(key_file, peer, bdaddr_type, "PeripheralLongTermKey");
8599 ltk = get_ltk(key_file, peer, bdaddr_type, "SlaveLongTermKey");
8602 ltk->central = false;
8607 static struct irk_info *get_irk_info(GKeyFile *key_file, const char *peer,
8608 uint8_t bdaddr_type)
8610 struct irk_info *irk = NULL;
8613 str = g_key_file_get_string(key_file, "IdentityResolvingKey", "Key", NULL);
8614 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
8617 if (strlen(str) < 32) {
8622 if (!str || strlen(str) < 32)
8626 irk = g_new0(struct irk_info, 1);
8628 str2ba(peer, &irk->bdaddr);
8629 irk->bdaddr_type = bdaddr_type;
8631 if (!strncmp(str, "0x", 2))
8632 str2buf(&str[2], irk->val, sizeof(irk->val));
8634 str2buf(&str[0], irk->val, sizeof(irk->val));
8636 irk->is_blocked = is_blocked_key(HCI_BLOCKED_KEY_TYPE_LINKKEY,
8639 #ifndef TIZEN_FEATURE_BLUEZ_MODIFY
8647 static struct conn_param *get_conn_param(GKeyFile *key_file, const char *peer,
8648 uint8_t bdaddr_type)
8650 struct conn_param *param;
8652 if (!g_key_file_has_group(key_file, "ConnectionParameters"))
8655 param = g_new0(struct conn_param, 1);
8657 param->min_interval = g_key_file_get_integer(key_file,
8658 "ConnectionParameters",
8659 "MinInterval", NULL);
8660 param->max_interval = g_key_file_get_integer(key_file,
8661 "ConnectionParameters",
8662 "MaxInterval", NULL);
8663 param->latency = g_key_file_get_integer(key_file,
8664 "ConnectionParameters",
8666 param->timeout = g_key_file_get_integer(key_file,
8667 "ConnectionParameters",
8669 str2ba(peer, ¶m->bdaddr);
8670 param->bdaddr_type = bdaddr_type;
8676 static int generate_and_write_irk(uint8_t *irk, GKeyFile *key_file,
8677 const char *filename)
8679 struct bt_crypto *crypto;
8680 char str_irk_out[33];
8682 GError *gerr = NULL;
8686 crypto = bt_crypto_new();
8688 error("Failed to open crypto");
8692 if (!bt_crypto_random_bytes(crypto, irk, 16)) {
8693 error("Failed to generate IRK");
8694 bt_crypto_unref(crypto);
8698 bt_crypto_unref(crypto);
8700 for (i = 0; i < 16; i++)
8701 sprintf(str_irk_out + (i * 2), "%02x", irk[i]);
8703 str_irk_out[32] = '\0';
8704 info("Generated IRK successfully");
8706 g_key_file_set_string(key_file, "General", "IdentityResolvingKey",
8708 str = g_key_file_to_data(key_file, &length, NULL);
8709 if (!g_file_set_contents(filename, str, length, &gerr)) {
8710 error("Unable set contents for %s: (%s)", filename,
8715 DBG("Generated IRK written to file");
8719 static int load_irk(struct btd_adapter *adapter, uint8_t *irk)
8721 char filename[PATH_MAX];
8723 GError *gerr = NULL;
8727 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/identity",
8728 btd_adapter_get_storage_dir(adapter));
8730 key_file = g_key_file_new();
8731 if (!g_key_file_load_from_file(key_file, filename, 0, &gerr)) {
8732 error("Unable to load key file from %s: (%s)", filename,
8737 str_irk = g_key_file_get_string(key_file, "General",
8738 "IdentityResolvingKey", NULL);
8740 info("No IRK stored");
8741 ret = generate_and_write_irk(irk, key_file, filename);
8742 g_key_file_free(key_file);
8746 g_key_file_free(key_file);
8748 if (strlen(str_irk) != 32 || str2buf(str_irk, irk, 16)) {
8749 /* TODO re-create new IRK here? */
8750 error("Invalid IRK format, disabling privacy");
8756 DBG("Successfully read IRK from file");
8760 static void set_privacy_complete(uint8_t status, uint16_t length,
8761 const void *param, void *user_data)
8763 struct btd_adapter *adapter = user_data;
8765 if (status != MGMT_STATUS_SUCCESS) {
8766 btd_error(adapter->dev_id, "Failed to set privacy: %s (0x%02x)",
8767 mgmt_errstr(status), status);
8771 DBG("Successfuly set privacy for index %u", adapter->dev_id);
8774 static int set_privacy(struct btd_adapter *adapter, uint8_t privacy)
8776 struct mgmt_cp_set_privacy cp;
8778 memset(&cp, 0, sizeof(cp));
8783 if (load_irk(adapter, irk) == 0) {
8784 cp.privacy = privacy;
8785 memcpy(cp.irk, irk, 16);
8789 DBG("sending set privacy command for index %u", adapter->dev_id);
8790 DBG("setting privacy mode 0x%02x for index %u", cp.privacy,
8793 if (mgmt_send(adapter->mgmt, MGMT_OP_SET_PRIVACY,
8794 adapter->dev_id, sizeof(cp), &cp,
8795 set_privacy_complete, adapter, NULL) > 0)
8798 btd_error(adapter->dev_id, "Failed to set privacy for index %u",
8805 static void load_link_keys_complete(uint8_t status, uint16_t length,
8806 const void *param, void *user_data)
8808 struct btd_adapter *adapter = user_data;
8810 if (status != MGMT_STATUS_SUCCESS) {
8811 btd_error(adapter->dev_id,
8812 "Failed to load link keys for hci%u: %s (0x%02x)",
8813 adapter->dev_id, mgmt_errstr(status), status);
8817 DBG("link keys loaded for hci%u", adapter->dev_id);
8820 static void load_link_keys(struct btd_adapter *adapter, GSList *keys,
8823 struct mgmt_cp_load_link_keys *cp;
8824 struct mgmt_link_key_info *key;
8825 size_t key_count, cp_size;
8830 * If the controller does not support BR/EDR operation,
8831 * there is no point in trying to load the link keys into
8834 * This is an optimization for Low Energy only controllers.
8836 if (!(adapter->supported_settings & MGMT_SETTING_BREDR))
8839 key_count = g_slist_length(keys);
8841 DBG("hci%u keys %zu debug_keys %d", adapter->dev_id, key_count,
8844 cp_size = sizeof(*cp) + (key_count * sizeof(*key));
8846 cp = g_try_malloc0(cp_size);
8848 btd_error(adapter->dev_id, "No memory for link keys for hci%u",
8854 * Even if the list of stored keys is empty, it is important to
8855 * load an empty list into the kernel. That way it is ensured
8856 * that no old keys from a previous daemon are present.
8858 * In addition it is also the only way to toggle the different
8859 * behavior for debug keys.
8861 cp->debug_keys = debug_keys;
8862 cp->key_count = htobs(key_count);
8864 for (l = keys, key = cp->keys; l != NULL; l = g_slist_next(l), key++) {
8865 struct link_key_info *info = l->data;
8867 bacpy(&key->addr.bdaddr, &info->bdaddr);
8868 key->addr.type = BDADDR_BREDR;
8869 key->type = info->type;
8870 memcpy(key->val, info->key, 16);
8871 key->pin_len = info->pin_len;
8874 id = mgmt_send(adapter->mgmt, MGMT_OP_LOAD_LINK_KEYS,
8875 adapter->dev_id, cp_size, cp,
8876 load_link_keys_complete, adapter, NULL);
8881 btd_error(adapter->dev_id, "Failed to load link keys for hci%u",
8885 static bool load_ltks_timeout(gpointer user_data)
8887 struct btd_adapter *adapter = user_data;
8889 btd_error(adapter->dev_id, "Loading LTKs timed out for hci%u",
8892 adapter->load_ltks_timeout = 0;
8894 mgmt_cancel(adapter->mgmt, adapter->load_ltks_id);
8895 adapter->load_ltks_id = 0;
8900 static void load_ltks_complete(uint8_t status, uint16_t length,
8901 const void *param, void *user_data)
8903 struct btd_adapter *adapter = user_data;
8905 if (status != MGMT_STATUS_SUCCESS) {
8906 btd_error(adapter->dev_id,
8907 "Failed to load LTKs for hci%u: %s (0x%02x)",
8908 adapter->dev_id, mgmt_errstr(status), status);
8911 adapter->load_ltks_id = 0;
8913 timeout_remove(adapter->load_ltks_timeout);
8914 adapter->load_ltks_timeout = 0;
8916 DBG("LTKs loaded for hci%u", adapter->dev_id);
8919 static void load_ltks(struct btd_adapter *adapter, GSList *keys)
8921 struct mgmt_cp_load_long_term_keys *cp;
8922 struct mgmt_ltk_info *key;
8923 size_t key_count, max_key_count, cp_size;
8928 * If the controller does not support Low Energy operation,
8929 * there is no point in trying to load the long term keys
8932 * While there is no harm in loading keys into the kernel,
8933 * this is an optimization to avoid a confusing warning
8934 * message when the loading of the keys timed out due to
8935 * a kernel bug (see comment below).
8937 if (!(adapter->supported_settings & MGMT_SETTING_LE))
8940 key_count = g_slist_length(keys);
8941 mtu = mgmt_get_mtu(adapter->mgmt);
8942 max_key_count = (mtu - sizeof(*cp)) / sizeof(*key);
8943 key_count = MIN(max_key_count, key_count);
8945 DBG("hci%u keys %zu", adapter->dev_id, key_count);
8947 cp_size = sizeof(*cp) + (key_count * sizeof(*key));
8949 cp = g_try_malloc0(cp_size);
8951 btd_error(adapter->dev_id, "No memory for LTKs for hci%u",
8957 * Even if the list of stored keys is empty, it is important to
8958 * load an empty list into the kernel. That way it is ensured
8959 * that no old keys from a previous daemon are present.
8961 cp->key_count = htobs(key_count);
8963 for (l = keys, key = cp->keys; l && key_count;
8964 l = g_slist_next(l), key++, key_count--) {
8965 struct smp_ltk_info *info = l->data;
8966 struct btd_device *dev;
8968 bacpy(&key->addr.bdaddr, &info->bdaddr);
8969 key->addr.type = info->bdaddr_type;
8970 memcpy(key->val, info->val, sizeof(info->val));
8971 key->rand = cpu_to_le64(info->rand);
8972 key->ediv = cpu_to_le16(info->ediv);
8973 key->type = info->authenticated;
8974 key->central = info->central;
8975 key->enc_size = info->enc_size;
8977 /* Mark device as paired as their LTKs can be loaded. */
8978 dev = btd_adapter_find_device(adapter, &info->bdaddr,
8981 device_set_paired(dev, info->bdaddr_type);
8982 device_set_bonded(dev, info->bdaddr_type);
8983 device_set_ltk_enc_size(dev, info->enc_size);
8984 device_set_ltk_enc_size(dev, info->enc_size);
8988 adapter->load_ltks_id = mgmt_send(adapter->mgmt,
8989 MGMT_OP_LOAD_LONG_TERM_KEYS,
8990 adapter->dev_id, cp_size, cp,
8991 load_ltks_complete, adapter, NULL);
8995 if (adapter->load_ltks_id == 0) {
8996 btd_error(adapter->dev_id, "Failed to load LTKs for hci%u",
9002 * This timeout handling is needed since the kernel is stupid
9003 * and forgets to send a command complete response. However in
9004 * case of failures it does send a command status.
9006 adapter->load_ltks_timeout = timeout_add_seconds(2,
9007 load_ltks_timeout, adapter,
9011 static void load_irks_complete(uint8_t status, uint16_t length,
9012 const void *param, void *user_data)
9014 struct btd_adapter *adapter = user_data;
9016 if (status == MGMT_STATUS_UNKNOWN_COMMAND) {
9017 btd_info(adapter->dev_id,
9018 "Load IRKs failed: Kernel doesn't support LE Privacy");
9022 if (status != MGMT_STATUS_SUCCESS) {
9023 btd_error(adapter->dev_id,
9024 "Failed to load IRKs for hci%u: %s (0x%02x)",
9025 adapter->dev_id, mgmt_errstr(status), status);
9029 DBG("IRKs loaded for hci%u", adapter->dev_id);
9032 static void load_irks(struct btd_adapter *adapter, GSList *irks)
9034 struct mgmt_cp_load_irks *cp;
9035 struct mgmt_irk_info *irk;
9036 size_t irk_count, cp_size;
9041 * If the controller does not support LE Privacy operation,
9042 * there is no support for loading identity resolving keys
9045 if (!(adapter->supported_settings & MGMT_SETTING_PRIVACY))
9048 irk_count = g_slist_length(irks);
9050 DBG("hci%u irks %zu", adapter->dev_id, irk_count);
9052 cp_size = sizeof(*cp) + (irk_count * sizeof(*irk));
9054 cp = g_try_malloc0(cp_size);
9056 btd_error(adapter->dev_id, "No memory for IRKs for hci%u",
9062 * Even if the list of stored keys is empty, it is important to
9063 * load an empty list into the kernel. That way we tell the
9064 * kernel that we are able to handle New IRK events.
9066 cp->irk_count = htobs(irk_count);
9068 for (l = irks, irk = cp->irks; l != NULL; l = g_slist_next(l), irk++) {
9069 struct irk_info *info = l->data;
9071 bacpy(&irk->addr.bdaddr, &info->bdaddr);
9072 irk->addr.type = info->bdaddr_type;
9073 memcpy(irk->val, info->val, sizeof(irk->val));
9076 id = mgmt_send(adapter->mgmt, MGMT_OP_LOAD_IRKS, adapter->dev_id,
9077 cp_size, cp, load_irks_complete, adapter, NULL);
9082 btd_error(adapter->dev_id, "Failed to IRKs for hci%u",
9086 static void load_conn_params_complete(uint8_t status, uint16_t length,
9087 const void *param, void *user_data)
9089 struct btd_adapter *adapter = user_data;
9091 if (status != MGMT_STATUS_SUCCESS) {
9092 btd_error(adapter->dev_id,
9093 "hci%u Load Connection Parameters failed: %s (0x%02x)",
9094 adapter->dev_id, mgmt_errstr(status), status);
9098 DBG("Connection Parameters loaded for hci%u", adapter->dev_id);
9101 static void load_conn_params(struct btd_adapter *adapter, GSList *params)
9103 struct mgmt_cp_load_conn_param *cp;
9104 struct mgmt_conn_param *param;
9105 size_t param_count, cp_size;
9110 * If the controller does not support Low Energy operation,
9111 * there is no point in trying to load the connection
9112 * parameters into the kernel.
9114 if (!(adapter->supported_settings & MGMT_SETTING_LE))
9117 param_count = g_slist_length(params);
9119 DBG("hci%u conn params %zu", adapter->dev_id, param_count);
9121 cp_size = sizeof(*cp) + (param_count * sizeof(*param));
9123 cp = g_try_malloc0(cp_size);
9125 btd_error(adapter->dev_id,
9126 "Failed to allocate memory for connection parameters");
9130 cp->param_count = htobs(param_count);
9132 for (l = params, param = cp->params; l; l = g_slist_next(l), param++) {
9133 struct conn_param *info = l->data;
9135 bacpy(¶m->addr.bdaddr, &info->bdaddr);
9136 param->addr.type = info->bdaddr_type;
9137 param->min_interval = htobs(info->min_interval);
9138 param->max_interval = htobs(info->max_interval);
9139 param->latency = htobs(info->latency);
9140 param->timeout = htobs(info->timeout);
9143 id = mgmt_send(adapter->mgmt, MGMT_OP_LOAD_CONN_PARAM, adapter->dev_id,
9144 cp_size, cp, load_conn_params_complete, adapter, NULL);
9149 btd_error(adapter->dev_id, "Load connection parameters failed");
9152 static uint8_t get_le_addr_type(GKeyFile *keyfile)
9157 type = g_key_file_get_string(keyfile, "General", "AddressType", NULL);
9159 return BDADDR_LE_PUBLIC;
9161 if (g_str_equal(type, "public"))
9162 addr_type = BDADDR_LE_PUBLIC;
9163 else if (g_str_equal(type, "static"))
9164 addr_type = BDADDR_LE_RANDOM;
9166 addr_type = BDADDR_LE_PUBLIC;
9173 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
9174 static uint8_t get_addr_type(GKeyFile *keyfile)
9178 uint8_t bdaddr_type = BDADDR_BREDR;
9181 /* Load device technology */
9182 techno = g_key_file_get_string_list(keyfile, "General",
9183 "SupportedTechnologies", NULL, NULL);
9187 for (t = techno; *t; t++) {
9188 if (g_str_equal(*t, "LE"))
9193 bdaddr_type = BDADDR_BREDR;
9195 str = g_key_file_get_string(keyfile, "General",
9196 "AddressType", NULL);
9198 if (str && g_str_equal(str, "public"))
9199 bdaddr_type = BDADDR_LE_PUBLIC;
9200 else if (str && g_str_equal(str, "static"))
9201 bdaddr_type = BDADDR_LE_RANDOM;
9203 error("Unknown LE device technology");
9214 static void probe_devices(void *user_data)
9216 struct btd_device *device = user_data;
9218 device_probe_profiles(device, btd_device_get_uuids(device));
9219 device_resolved_drivers(device_get_adapter(device), device);
9222 static bool load_bredr_defaults(struct btd_adapter *adapter,
9223 struct mgmt_tlv_list *list,
9224 struct btd_br_defaults *defaults)
9226 if (btd_opts.mode == BT_MODE_LE)
9229 if (defaults->page_scan_type != 0xFFFF) {
9230 if (!mgmt_tlv_add_fixed(list, 0x0000,
9231 &defaults->page_scan_type))
9235 if (defaults->page_scan_interval) {
9236 if (!mgmt_tlv_add_fixed(list, 0x0001,
9237 &defaults->page_scan_interval))
9241 if (defaults->page_scan_win) {
9242 if (!mgmt_tlv_add_fixed(list, 0x0002,
9243 &defaults->page_scan_win))
9247 if (defaults->scan_type != 0xFFFF) {
9248 if (!mgmt_tlv_add_fixed(list, 0x0003,
9249 &defaults->scan_type))
9253 if (defaults->scan_interval) {
9254 if (!mgmt_tlv_add_fixed(list, 0x0004,
9255 &defaults->scan_interval))
9259 if (defaults->scan_win) {
9260 if (!mgmt_tlv_add_fixed(list, 0x0005,
9261 &defaults->scan_win))
9265 if (defaults->link_supervision_timeout) {
9266 if (!mgmt_tlv_add_fixed(list, 0x0006,
9267 &defaults->link_supervision_timeout))
9271 if (defaults->page_timeout) {
9272 if (!mgmt_tlv_add_fixed(list, 0x0007,
9273 &defaults->page_timeout))
9277 if (defaults->min_sniff_interval) {
9278 if (!mgmt_tlv_add_fixed(list, 0x0008,
9279 &defaults->min_sniff_interval))
9283 if (defaults->max_sniff_interval) {
9284 if (!mgmt_tlv_add_fixed(list, 0x0009,
9285 &defaults->max_sniff_interval))
9292 static bool load_le_defaults(struct btd_adapter *adapter,
9293 struct mgmt_tlv_list *list,
9294 struct btd_le_defaults *defaults)
9296 if (btd_opts.mode == BT_MODE_BREDR)
9299 if (defaults->min_adv_interval) {
9300 if (!mgmt_tlv_add_fixed(list, 0x000a,
9301 &defaults->min_adv_interval))
9305 if (defaults->max_adv_interval) {
9306 if (!mgmt_tlv_add_fixed(list, 0x000b,
9307 &defaults->max_adv_interval))
9311 if (defaults->adv_rotation_interval) {
9312 if (!mgmt_tlv_add_fixed(list, 0x000c,
9313 &defaults->adv_rotation_interval))
9317 if (defaults->scan_interval_autoconnect) {
9318 if (!mgmt_tlv_add_fixed(list, 0x000d,
9319 &defaults->scan_interval_autoconnect))
9323 if (defaults->scan_win_autoconnect) {
9324 if (!mgmt_tlv_add_fixed(list, 0x000e,
9325 &defaults->scan_win_autoconnect))
9329 if (defaults->scan_interval_suspend) {
9330 if (!mgmt_tlv_add_fixed(list, 0x000f,
9331 &defaults->scan_interval_suspend))
9335 if (defaults->scan_win_suspend) {
9336 if (!mgmt_tlv_add_fixed(list, 0x0010,
9337 &defaults->scan_win_suspend))
9341 if (defaults->scan_interval_discovery) {
9342 if (!mgmt_tlv_add_fixed(list, 0x0011,
9343 &defaults->scan_interval_discovery))
9347 if (defaults->scan_win_discovery) {
9348 if (!mgmt_tlv_add_fixed(list, 0x0012,
9349 &defaults->scan_win_discovery))
9353 if (defaults->scan_interval_adv_monitor) {
9354 if (!mgmt_tlv_add_fixed(list, 0x0013,
9355 &defaults->scan_interval_adv_monitor))
9359 if (defaults->scan_win_adv_monitor) {
9360 if (!mgmt_tlv_add_fixed(list, 0x0014,
9361 &defaults->scan_win_adv_monitor))
9365 if (defaults->scan_interval_connect) {
9366 if (!mgmt_tlv_add_fixed(list, 0x0015,
9367 &defaults->scan_interval_connect))
9371 if (defaults->scan_win_connect) {
9372 if (!mgmt_tlv_add_fixed(list, 0x0016,
9373 &defaults->scan_win_connect))
9377 if (defaults->min_conn_interval) {
9378 if (!mgmt_tlv_add_fixed(list, 0x0017,
9379 &defaults->min_conn_interval))
9383 if (defaults->max_conn_interval) {
9384 if (!mgmt_tlv_add_fixed(list, 0x0018,
9385 &defaults->max_conn_interval))
9389 if (defaults->conn_latency) {
9390 if (!mgmt_tlv_add_fixed(list, 0x0019,
9391 &defaults->conn_latency))
9395 if (defaults->conn_lsto) {
9396 if (!mgmt_tlv_add_fixed(list, 0x001a,
9397 &defaults->conn_lsto))
9401 if (defaults->autoconnect_timeout) {
9402 if (!mgmt_tlv_add_fixed(list, 0x001b,
9403 &defaults->autoconnect_timeout))
9407 if (defaults->advmon_allowlist_scan_duration) {
9408 if (!mgmt_tlv_add_fixed(list, 0x001d,
9409 &defaults->advmon_allowlist_scan_duration))
9413 if (defaults->advmon_no_filter_scan_duration) {
9414 if (!mgmt_tlv_add_fixed(list, 0x001e,
9415 &defaults->advmon_no_filter_scan_duration))
9419 if (defaults->enable_advmon_interleave_scan != 0xFF) {
9420 if (!mgmt_tlv_add_fixed(list, 0x001f,
9421 &defaults->enable_advmon_interleave_scan))
9428 static void load_defaults(struct btd_adapter *adapter)
9430 struct mgmt_tlv_list *list;
9431 unsigned int err = 0;
9433 if (!btd_opts.defaults.num_entries ||
9434 !btd_has_kernel_features(KERNEL_SET_SYSTEM_CONFIG))
9437 list = mgmt_tlv_list_new();
9439 if (!load_bredr_defaults(adapter, list, &btd_opts.defaults.br))
9442 if (!load_le_defaults(adapter, list, &btd_opts.defaults.le))
9445 err = mgmt_send_tlv(adapter->mgmt, MGMT_OP_SET_DEF_SYSTEM_CONFIG,
9446 adapter->dev_id, list, NULL, NULL, NULL);
9450 btd_error(adapter->dev_id,
9451 "Failed to set default system config for hci%u",
9454 mgmt_tlv_list_free(list);
9457 static void load_devices(struct btd_adapter *adapter)
9459 char dirname[PATH_MAX];
9460 GSList *keys = NULL;
9461 GSList *ltks = NULL;
9462 GSList *irks = NULL;
9463 GSList *params = NULL;
9464 GSList *added_devices = NULL;
9465 GError *gerr = NULL;
9467 struct dirent *entry;
9469 snprintf(dirname, PATH_MAX, STORAGEDIR "/%s",
9470 btd_adapter_get_storage_dir(adapter));
9472 dir = opendir(dirname);
9474 btd_error(adapter->dev_id,
9475 "Unable to open adapter storage directory: %s",
9480 while ((entry = readdir(dir)) != NULL) {
9481 struct btd_device *device;
9482 char filename[PATH_MAX];
9484 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
9485 struct link_key_info *key_info = NULL;
9486 struct smp_ltk_info *ltk_info = NULL;
9487 struct smp_ltk_info *peripheral_ltk_info;
9488 GSList *list = NULL;
9489 struct device_addr_type addr;
9491 struct link_key_info *key_info;
9492 struct smp_ltk_info *ltk_info;
9493 struct smp_ltk_info *peripheral_ltk_info;
9496 struct irk_info *irk_info;
9497 struct conn_param *param;
9498 uint8_t bdaddr_type;
9500 if (entry->d_type == DT_UNKNOWN)
9501 entry->d_type = util_get_dt(dirname, entry->d_name);
9503 if (entry->d_type != DT_DIR || bachk(entry->d_name) < 0)
9506 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
9510 str2ba(entry->d_name, &bdaddr);
9512 if (!bacmp(&bdaddr, BDADDR_ANY)) {
9513 error("No Bluetooth address");
9518 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/%s/info",
9519 btd_adapter_get_storage_dir(adapter),
9522 key_file = g_key_file_new();
9523 if (!g_key_file_load_from_file(key_file, filename, 0, &gerr)) {
9524 error("Unable to load key file from %s: (%s)", filename,
9529 key_info = get_key_info(key_file, entry->d_name);
9531 bdaddr_type = get_le_addr_type(key_file);
9533 ltk_info = get_ltk_info(key_file, entry->d_name, bdaddr_type);
9535 peripheral_ltk_info = get_peripheral_ltk_info(key_file,
9536 entry->d_name, bdaddr_type);
9538 irk_info = get_irk_info(key_file, entry->d_name, bdaddr_type);
9540 // If any key for the device is blocked, we discard all.
9541 if ((key_info && key_info->is_blocked) ||
9542 (ltk_info && ltk_info->is_blocked) ||
9543 (peripheral_ltk_info &&
9544 peripheral_ltk_info->is_blocked) ||
9545 (irk_info && irk_info->is_blocked)) {
9557 if (peripheral_ltk_info) {
9558 g_free(peripheral_ltk_info);
9559 peripheral_ltk_info = NULL;
9571 keys = g_slist_append(keys, key_info);
9574 ltks = g_slist_append(ltks, ltk_info);
9576 if (peripheral_ltk_info)
9577 ltks = g_slist_append(ltks, peripheral_ltk_info);
9580 irks = g_slist_append(irks, irk_info);
9582 param = get_conn_param(key_file, entry->d_name, bdaddr_type);
9584 params = g_slist_append(params, param);
9586 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
9587 str2ba(entry->d_name, &addr.bdaddr);
9588 addr.bdaddr_type = get_addr_type(key_file);
9589 if (addr.bdaddr_type == 0xff) {
9590 error("No SupportedTechnologies. Skipping");
9594 list = g_slist_find_custom(adapter->devices, &addr,
9595 device_addr_type_strict_cmp);
9597 list = g_slist_find_custom(adapter->devices, entry->d_name,
9598 device_address_cmp);
9601 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
9602 DBG("Skip already loaded device [%s] [%d]",
9603 entry->d_name, addr.bdaddr_type);
9605 device = list->data;
9609 device = device_create_from_storage(adapter, entry->d_name,
9614 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
9619 * After loading IRK information from file,
9620 * store it into device->bdaddr.
9621 * RPA is stored in device->rpa_addr
9623 ba2str(device_get_address(device), idaddr);
9625 DBG("irk address: %s, rpa_exist %d",
9626 idaddr, device_get_rpa_exist(device));
9628 if (device_get_rpa_exist(device) == true) {
9630 str2ba(idaddr, &key_info->bdaddr);
9633 ltks = g_slist_remove(ltks, ltk_info);
9634 ltk_info = get_ltk_info(key_file,
9635 idaddr, bdaddr_type);
9637 ltks = g_slist_append(ltks, ltk_info);
9640 if (peripheral_ltk_info) {
9641 ltks = g_slist_remove(ltks, peripheral_ltk_info);
9642 peripheral_ltk_info = get_peripheral_ltk_info(key_file,
9643 idaddr, bdaddr_type);
9644 if (peripheral_ltk_info)
9645 ltks = g_slist_append(ltks, peripheral_ltk_info);
9649 str2ba(idaddr, &irk_info->bdaddr);
9650 device_set_irk_value(device, irk_info->val);
9654 str2ba(idaddr, ¶m->bdaddr);
9659 btd_device_set_temporary(device, false);
9660 adapter_add_device(adapter, device);
9662 /* TODO: register services from pre-loaded list of primaries */
9664 added_devices = g_slist_append(added_devices, device);
9668 device_set_paired(device, BDADDR_BREDR);
9669 device_set_bonded(device, BDADDR_BREDR);
9673 g_key_file_free(key_file);
9678 load_link_keys(adapter, keys, btd_opts.debug_keys);
9679 g_slist_free_full(keys, g_free);
9681 load_ltks(adapter, ltks);
9682 g_slist_free_full(ltks, g_free);
9683 load_irks(adapter, irks);
9684 g_slist_free_full(irks, g_free);
9685 load_conn_params(adapter, params);
9686 g_slist_free_full(params, g_free);
9688 g_slist_free_full(added_devices, probe_devices);
9691 int btd_adapter_block_address(struct btd_adapter *adapter,
9692 const bdaddr_t *bdaddr, uint8_t bdaddr_type)
9694 struct mgmt_cp_block_device cp;
9697 ba2str(bdaddr, addr);
9698 DBG("hci%u %s", adapter->dev_id, addr);
9700 memset(&cp, 0, sizeof(cp));
9701 bacpy(&cp.addr.bdaddr, bdaddr);
9702 cp.addr.type = bdaddr_type;
9704 if (mgmt_send(adapter->mgmt, MGMT_OP_BLOCK_DEVICE,
9705 adapter->dev_id, sizeof(cp), &cp,
9706 NULL, NULL, NULL) > 0)
9712 int btd_adapter_unblock_address(struct btd_adapter *adapter,
9713 const bdaddr_t *bdaddr, uint8_t bdaddr_type)
9715 struct mgmt_cp_unblock_device cp;
9718 ba2str(bdaddr, addr);
9719 DBG("hci%u %s", adapter->dev_id, addr);
9721 memset(&cp, 0, sizeof(cp));
9722 bacpy(&cp.addr.bdaddr, bdaddr);
9723 cp.addr.type = bdaddr_type;
9725 if (mgmt_send(adapter->mgmt, MGMT_OP_UNBLOCK_DEVICE,
9726 adapter->dev_id, sizeof(cp), &cp,
9727 NULL, NULL, NULL) > 0)
9733 static int clear_blocked(struct btd_adapter *adapter)
9735 return btd_adapter_unblock_address(adapter, BDADDR_ANY, 0);
9738 static void probe_driver(struct btd_adapter *adapter, gpointer user_data)
9740 struct btd_adapter_driver *driver = user_data;
9743 if (driver->probe == NULL)
9746 err = driver->probe(adapter);
9748 btd_error(adapter->dev_id, "%s: %s (%d)", driver->name,
9749 strerror(-err), -err);
9753 adapter->drivers = g_slist_prepend(adapter->drivers, driver);
9756 static void load_drivers(struct btd_adapter *adapter)
9760 for (l = adapter_drivers; l; l = l->next)
9761 probe_driver(adapter, l->data);
9764 static void probe_profile(struct btd_profile *profile, void *data)
9766 struct btd_adapter *adapter = data;
9769 if (profile->adapter_probe == NULL)
9772 err = profile->adapter_probe(profile, adapter);
9774 btd_error(adapter->dev_id, "%s: %s (%d)", profile->name,
9775 strerror(-err), -err);
9779 adapter->profiles = g_slist_prepend(adapter->profiles, profile);
9782 void adapter_add_profile(struct btd_adapter *adapter, gpointer p)
9784 struct btd_profile *profile = p;
9786 if (!adapter->initialized)
9789 probe_profile(profile, adapter);
9791 g_slist_foreach(adapter->devices, device_probe_profile, profile);
9794 void adapter_remove_profile(struct btd_adapter *adapter, gpointer p)
9796 struct btd_profile *profile = p;
9798 if (!adapter->initialized)
9801 if (profile->device_remove)
9802 g_slist_foreach(adapter->devices, device_remove_profile, p);
9804 adapter->profiles = g_slist_remove(adapter->profiles, profile);
9806 if (profile->adapter_remove)
9807 profile->adapter_remove(profile, adapter);
9810 static void device_added_drivers(struct btd_adapter *adapter,
9811 struct btd_device *device)
9813 struct btd_adapter_driver *driver;
9816 for (l = adapter_drivers; l; l = l->next) {
9819 if (driver->device_added)
9820 driver->device_added(adapter, device);
9824 static void device_removed_drivers(struct btd_adapter *adapter,
9825 struct btd_device *device)
9827 struct btd_adapter_driver *driver;
9830 for (l = adapter_drivers; l; l = l->next) {
9833 if (driver->device_removed)
9834 driver->device_removed(adapter, device);
9838 void device_resolved_drivers(struct btd_adapter *adapter,
9839 struct btd_device *device)
9841 struct btd_adapter_driver *driver;
9844 for (l = adapter_drivers; l; l = l->next) {
9847 if (driver->device_resolved)
9848 driver->device_resolved(adapter, device);
9852 static void adapter_add_device(struct btd_adapter *adapter,
9853 struct btd_device *device)
9855 adapter->devices = g_slist_append(adapter->devices, device);
9856 device_added_drivers(adapter, device);
9859 static void adapter_remove_device(struct btd_adapter *adapter,
9860 struct btd_device *device)
9862 adapter->devices = g_slist_remove(adapter->devices, device);
9863 device_removed_drivers(adapter, device);
9866 static void adapter_add_connection(struct btd_adapter *adapter,
9867 struct btd_device *device,
9868 uint8_t bdaddr_type)
9870 device_add_connection(device, bdaddr_type);
9872 if (g_slist_find(adapter->connections, device)) {
9873 btd_error(adapter->dev_id,
9874 "Device is already marked as connected");
9878 adapter->connections = g_slist_append(adapter->connections, device);
9881 static void get_connections_complete(uint8_t status, uint16_t length,
9882 const void *param, void *user_data)
9884 struct btd_adapter *adapter = user_data;
9885 const struct mgmt_rp_get_connections *rp = param;
9886 uint16_t i, conn_count;
9888 if (status != MGMT_STATUS_SUCCESS) {
9889 btd_error(adapter->dev_id,
9890 "Failed to get connections: %s (0x%02x)",
9891 mgmt_errstr(status), status);
9895 if (length < sizeof(*rp)) {
9896 btd_error(adapter->dev_id,
9897 "Wrong size of get connections response");
9901 conn_count = btohs(rp->conn_count);
9903 DBG("Connection count: %d", conn_count);
9905 if (conn_count * sizeof(struct mgmt_addr_info) +
9906 sizeof(*rp) != length) {
9907 btd_error(adapter->dev_id,
9908 "Incorrect packet size for get connections response");
9912 for (i = 0; i < conn_count; i++) {
9913 const struct mgmt_addr_info *addr = &rp->addr[i];
9914 struct btd_device *device;
9917 ba2str(&addr->bdaddr, address);
9918 DBG("Adding existing connection to %s", address);
9920 device = btd_adapter_get_device(adapter, &addr->bdaddr,
9923 adapter_add_connection(adapter, device, addr->type);
9927 static void load_connections(struct btd_adapter *adapter)
9929 DBG("sending get connections command for index %u", adapter->dev_id);
9931 if (mgmt_send(adapter->mgmt, MGMT_OP_GET_CONNECTIONS,
9932 adapter->dev_id, 0, NULL,
9933 get_connections_complete, adapter, NULL) > 0)
9936 btd_error(adapter->dev_id, "Failed to get connections for index %u",
9940 bool btd_adapter_get_pairable(struct btd_adapter *adapter)
9942 if (adapter->current_settings & MGMT_SETTING_BONDABLE)
9948 bool btd_adapter_get_powered(struct btd_adapter *adapter)
9950 if ((adapter->current_settings & MGMT_SETTING_POWERED) &&
9951 !(adapter->pending_settings & MGMT_SETTING_POWERED))
9957 bool btd_adapter_get_connectable(struct btd_adapter *adapter)
9959 if (adapter->current_settings & MGMT_SETTING_CONNECTABLE)
9965 bool btd_adapter_get_discoverable(struct btd_adapter *adapter)
9967 if (adapter->current_settings & MGMT_SETTING_DISCOVERABLE)
9973 bool btd_adapter_get_bredr(struct btd_adapter *adapter)
9975 if (adapter->current_settings & MGMT_SETTING_BREDR)
9981 struct btd_gatt_database *btd_adapter_get_database(struct btd_adapter *adapter)
9986 return adapter->database;
9989 uint32_t btd_adapter_get_class(struct btd_adapter *adapter)
9991 return adapter->dev_class;
9994 const char *btd_adapter_get_name(struct btd_adapter *adapter)
9996 if (adapter->stored_alias)
9997 return adapter->stored_alias;
9999 if (adapter->system_name)
10000 return adapter->system_name;
10005 int adapter_connect_list_add(struct btd_adapter *adapter,
10006 struct btd_device *device)
10009 * If the adapter->connect_le device is getting added back to
10010 * the connect list it probably means that the connect attempt
10011 * failed and hence we should clear this pointer
10013 if (device == adapter->connect_le)
10014 adapter->connect_le = NULL;
10017 * If kernel background scanning is supported then the
10018 * adapter_auto_connect_add() function is used to maintain what to
10021 if (btd_has_kernel_features(KERNEL_CONN_CONTROL))
10024 if (g_slist_find(adapter->connect_list, device)) {
10025 DBG("ignoring already added device %s",
10026 device_get_path(device));
10030 if (!(adapter->supported_settings & MGMT_SETTING_LE)) {
10031 btd_error(adapter->dev_id,
10032 "Can't add %s to non-LE capable adapter connect list",
10033 device_get_path(device));
10037 adapter->connect_list = g_slist_append(adapter->connect_list, device);
10038 DBG("%s added to %s's connect_list", device_get_path(device),
10039 adapter->system_name);
10042 if (!btd_adapter_get_powered(adapter))
10045 trigger_passive_scanning(adapter);
10050 void adapter_connect_list_remove(struct btd_adapter *adapter,
10051 struct btd_device *device)
10054 * If the adapter->connect_le device is being removed from the
10055 * connect list it means the connection was successful and hence
10056 * the pointer should be cleared
10058 if (device == adapter->connect_le)
10059 adapter->connect_le = NULL;
10061 if (btd_has_kernel_features(KERNEL_CONN_CONTROL))
10064 if (!g_slist_find(adapter->connect_list, device)) {
10065 DBG("device %s is not on the list, ignoring",
10066 device_get_path(device));
10070 adapter->connect_list = g_slist_remove(adapter->connect_list, device);
10071 DBG("%s removed from %s's connect_list", device_get_path(device),
10072 adapter->system_name);
10074 if (!adapter->connect_list) {
10075 stop_passive_scanning(adapter);
10079 if (!btd_adapter_get_powered(adapter))
10082 trigger_passive_scanning(adapter);
10085 static void add_accept_list_complete(uint8_t status, uint16_t length,
10086 const void *param, void *user_data)
10088 const struct mgmt_rp_add_device *rp = param;
10089 struct btd_adapter *adapter = user_data;
10090 struct btd_device *dev;
10093 if (length < sizeof(*rp)) {
10094 btd_error(adapter->dev_id,
10095 "Too small Add Device complete event");
10099 ba2str(&rp->addr.bdaddr, addr);
10101 dev = btd_adapter_find_device(adapter, &rp->addr.bdaddr,
10104 btd_error(adapter->dev_id,
10105 "Add Device complete for unknown device %s", addr);
10109 if (status != MGMT_STATUS_SUCCESS) {
10110 btd_error(adapter->dev_id,
10111 "Failed to add device %s: %s (0x%02x)",
10112 addr, mgmt_errstr(status), status);
10116 DBG("%s added to kernel accept list", addr);
10119 void adapter_accept_list_add(struct btd_adapter *adapter,
10120 struct btd_device *dev)
10122 struct mgmt_cp_add_device cp;
10124 if (!btd_has_kernel_features(KERNEL_CONN_CONTROL))
10127 memset(&cp, 0, sizeof(cp));
10128 bacpy(&cp.addr.bdaddr, device_get_address(dev));
10129 cp.addr.type = BDADDR_BREDR;
10132 mgmt_send(adapter->mgmt, MGMT_OP_ADD_DEVICE,
10133 adapter->dev_id, sizeof(cp), &cp,
10134 add_accept_list_complete, adapter, NULL);
10137 static void remove_accept_list_complete(uint8_t status, uint16_t length,
10138 const void *param, void *user_data)
10140 const struct mgmt_rp_remove_device *rp = param;
10143 if (length < sizeof(*rp)) {
10144 error("Too small Remove Device complete event");
10148 ba2str(&rp->addr.bdaddr, addr);
10150 if (status != MGMT_STATUS_SUCCESS) {
10151 error("Failed to remove device %s: %s (0x%02x)",
10152 addr, mgmt_errstr(status), status);
10156 DBG("%s removed from kernel accept list", addr);
10159 void adapter_accept_list_remove(struct btd_adapter *adapter,
10160 struct btd_device *dev)
10162 struct mgmt_cp_remove_device cp;
10164 if (!btd_has_kernel_features(KERNEL_CONN_CONTROL))
10167 memset(&cp, 0, sizeof(cp));
10168 bacpy(&cp.addr.bdaddr, device_get_address(dev));
10169 cp.addr.type = BDADDR_BREDR;
10171 mgmt_send(adapter->mgmt, MGMT_OP_REMOVE_DEVICE,
10172 adapter->dev_id, sizeof(cp), &cp,
10173 remove_accept_list_complete, adapter, NULL);
10176 static void set_device_privacy_complete(uint8_t status, uint16_t length,
10177 const void *param, void *user_data)
10179 const struct mgmt_rp_set_device_flags *rp = param;
10181 if (status != MGMT_STATUS_SUCCESS) {
10182 error("Set device flags return status: %s",
10183 mgmt_errstr(status));
10187 if (length < sizeof(*rp)) {
10188 error("Too small Set Device Flags complete event: %d", length);
10193 static void add_device_complete(uint8_t status, uint16_t length,
10194 const void *param, void *user_data)
10196 const struct mgmt_rp_add_device *rp = param;
10197 struct btd_adapter *adapter = user_data;
10198 struct btd_device *dev;
10201 if (length < sizeof(*rp)) {
10202 btd_error(adapter->dev_id,
10203 "Too small Add Device complete event");
10207 ba2str(&rp->addr.bdaddr, addr);
10209 dev = btd_adapter_find_device(adapter, &rp->addr.bdaddr,
10212 btd_error(adapter->dev_id,
10213 "Add Device complete for unknown device %s", addr);
10217 if (status != MGMT_STATUS_SUCCESS) {
10218 btd_error(adapter->dev_id,
10219 "Failed to add device %s (%u): %s (0x%02x)",
10220 addr, rp->addr.type, mgmt_errstr(status), status);
10221 adapter->connect_list = g_slist_remove(adapter->connect_list,
10226 DBG("%s (%u) added to kernel connect list", addr, rp->addr.type);
10228 if (btd_opts.device_privacy) {
10229 uint32_t flags = btd_device_get_current_flags(dev);
10231 /* Set Device Privacy Mode has not set the flag yet. */
10232 if (!(flags & DEVICE_FLAG_DEVICE_PRIVACY)) {
10233 adapter_set_device_flags(adapter, dev, flags |
10234 DEVICE_FLAG_DEVICE_PRIVACY,
10235 set_device_privacy_complete,
10241 void adapter_auto_connect_add(struct btd_adapter *adapter,
10242 struct btd_device *device)
10244 struct mgmt_cp_add_device cp;
10245 const bdaddr_t *bdaddr;
10246 uint8_t bdaddr_type;
10249 if (!btd_has_kernel_features(KERNEL_CONN_CONTROL))
10252 if (g_slist_find(adapter->connect_list, device)) {
10253 DBG("ignoring already added device %s",
10254 device_get_path(device));
10258 bdaddr = device_get_address(device);
10259 bdaddr_type = btd_device_get_bdaddr_type(device);
10261 if (bdaddr_type == BDADDR_BREDR) {
10262 DBG("auto-connection feature is not avaiable for BR/EDR");
10266 memset(&cp, 0, sizeof(cp));
10267 bacpy(&cp.addr.bdaddr, bdaddr);
10268 cp.addr.type = bdaddr_type;
10271 id = mgmt_send(adapter->mgmt, MGMT_OP_ADD_DEVICE,
10272 adapter->dev_id, sizeof(cp), &cp, add_device_complete,
10277 adapter->connect_list = g_slist_append(adapter->connect_list, device);
10280 void adapter_set_device_flags(struct btd_adapter *adapter,
10281 struct btd_device *device, uint32_t flags,
10282 mgmt_request_func_t func, void *user_data)
10284 struct mgmt_cp_set_device_flags cp;
10285 const bdaddr_t *bdaddr;
10286 uint8_t bdaddr_type;
10288 if (!btd_has_kernel_features(KERNEL_CONN_CONTROL))
10291 bdaddr = device_get_address(device);
10292 bdaddr_type = btd_device_get_bdaddr_type(device);
10294 memset(&cp, 0, sizeof(cp));
10295 bacpy(&cp.addr.bdaddr, bdaddr);
10296 cp.addr.type = bdaddr_type;
10297 cp.current_flags = cpu_to_le32(flags);
10299 mgmt_send(adapter->mgmt, MGMT_OP_SET_DEVICE_FLAGS, adapter->dev_id,
10300 sizeof(cp), &cp, func, user_data, NULL);
10303 static void device_flags_changed_callback(uint16_t index, uint16_t length,
10304 const void *param, void *user_data)
10306 const struct mgmt_ev_device_flags_changed *ev = param;
10307 struct btd_adapter *adapter = user_data;
10308 struct btd_device *dev;
10311 if (length < sizeof(*ev)) {
10312 btd_error(adapter->dev_id,
10313 "Too small Device Flags Changed event: %d",
10318 ba2str(&ev->addr.bdaddr, addr);
10320 dev = btd_adapter_find_device(adapter, &ev->addr.bdaddr, ev->addr.type);
10322 btd_error(adapter->dev_id,
10323 "Device Flags Changed for unknown device %s", addr);
10327 btd_device_flags_changed(dev, ev->supported_flags, ev->current_flags);
10331 static void remove_device_complete(uint8_t status, uint16_t length,
10332 const void *param, void *user_data)
10334 const struct mgmt_rp_remove_device *rp = param;
10337 if (length < sizeof(*rp)) {
10338 error("Too small Remove Device complete event");
10342 ba2str(&rp->addr.bdaddr, addr);
10344 if (status != MGMT_STATUS_SUCCESS) {
10345 error("Failed to remove device %s (%u): %s (0x%02x)",
10346 addr, rp->addr.type, mgmt_errstr(status), status);
10350 DBG("%s (%u) removed from kernel connect list", addr, rp->addr.type);
10353 void adapter_auto_connect_remove(struct btd_adapter *adapter,
10354 struct btd_device *device)
10356 struct mgmt_cp_remove_device cp;
10357 const bdaddr_t *bdaddr;
10358 uint8_t bdaddr_type;
10361 if (!btd_has_kernel_features(KERNEL_CONN_CONTROL))
10364 if (!g_slist_find(adapter->connect_list, device)) {
10365 DBG("ignoring not added device %s", device_get_path(device));
10369 bdaddr = device_get_address(device);
10370 bdaddr_type = btd_device_get_bdaddr_type(device);
10372 if (bdaddr_type == BDADDR_BREDR) {
10373 DBG("auto-connection feature is not avaiable for BR/EDR");
10377 memset(&cp, 0, sizeof(cp));
10378 bacpy(&cp.addr.bdaddr, bdaddr);
10379 cp.addr.type = bdaddr_type;
10381 id = mgmt_send(adapter->mgmt, MGMT_OP_REMOVE_DEVICE,
10382 adapter->dev_id, sizeof(cp), &cp,
10383 remove_device_complete, adapter, NULL);
10387 adapter->connect_list = g_slist_remove(adapter->connect_list, device);
10390 #if defined (TIZEN_FEATURE_BLUEZ_MODIFY)
10391 static void get_phy_configuration_resp(uint8_t status, uint16_t len, const void *param,
10394 uint32_t supported_phys;
10395 uint32_t configurable_phys;
10396 uint32_t selected_phys;
10398 const struct mgmt_rp_get_phy_confguration *rp = param;
10399 struct btd_adapter *adapter = user_data;
10401 if (status != MGMT_STATUS_SUCCESS) {
10402 error("Get PHY Configuration failed with status 0x%02x (%s)",
10403 status, mgmt_errstr(status));
10407 if (len < sizeof(*rp)) {
10408 error("Too small get-phy reply (%u bytes)", len);
10412 supported_phys = get_le32(&rp->supported_phys);
10413 configurable_phys = get_le32(&rp-> configurable_phys);
10414 selected_phys = get_le16(&rp->selected_phys);
10416 DBG("Supported phys: [0x%x]", supported_phys);
10417 DBG("Configurable phys: [0x%x]", configurable_phys);
10418 DBG("Selected phys: [0x%x]", selected_phys);
10420 if (adapter->supported_settings & MGMT_SETTING_LE) {
10421 if ((supported_phys & MGMT_PHY_LE_2M_TX) &&
10422 (supported_phys & MGMT_PHY_LE_2M_RX)) {
10423 DBG("Adapter supports LE 2M PHY");
10424 adapter->le_2m_phy_supported = TRUE;
10426 DBG("Adapter does not support LE 2M PHY");
10428 if ((supported_phys & MGMT_PHY_LE_CODED_TX) &&
10429 (supported_phys & MGMT_PHY_LE_CODED_RX)) {
10430 adapter->le_coded_phy_supported = TRUE;
10431 DBG("Adapter supports LE CODED PHY");
10433 DBG("Adapter does not support LE CODED PHY");
10436 /* Emit Property Changed Signal */
10437 g_dbus_emit_property_changed(dbus_conn, adapter->path,
10438 ADAPTER_INTERFACE, "SupportedLEFeatures");
10443 static void adapter_start(struct btd_adapter *adapter)
10446 #if defined(TIZEN_FEATURE_BLUEZ_MODIFY) && !defined(__SPRD_PATCH__)
10447 if (adapter_le_read_ble_feature_info())
10448 g_dbus_emit_property_changed(dbus_conn, adapter->path,
10449 ADAPTER_INTERFACE, "SupportedLEFeatures");
10450 #ifdef TIZEN_FEATURE_PLATFROM_SCAN_FILTER
10452 g_dbus_emit_property_changed(dbus_conn, adapter->path,
10453 ADAPTER_INTERFACE, "SupportedLEFeatures");
10456 adapter_get_adv_tx_power(adapter);
10458 /* By default enable offloading for testing, this should be modified */
10459 if (adapter_le_is_supported_offloading())
10460 adapter_le_enable_offloading(TRUE);
10463 #ifndef TIZEN_FEATURE_BLUEZ_MODIFY
10464 g_dbus_emit_property_changed(dbus_conn, adapter->path,
10465 ADAPTER_INTERFACE, "Powered");
10467 g_dbus_emit_property_changed_full(dbus_conn, adapter->path,
10468 ADAPTER_INTERFACE, "Powered", 1);
10471 DBG("adapter %s has been enabled", adapter->path);
10473 trigger_passive_scanning(adapter);
10476 static void reply_pending_requests(struct btd_adapter *adapter)
10483 /* pending bonding */
10484 for (l = adapter->devices; l; l = l->next) {
10485 struct btd_device *device = l->data;
10487 if (device_is_bonding(device, NULL))
10488 device_bonding_failed(device,
10489 HCI_OE_USER_ENDED_CONNECTION);
10493 static void remove_driver(gpointer data, gpointer user_data)
10495 struct btd_adapter_driver *driver = data;
10496 struct btd_adapter *adapter = user_data;
10498 if (driver->remove)
10499 driver->remove(adapter);
10502 static void remove_profile(gpointer data, gpointer user_data)
10504 struct btd_profile *profile = data;
10505 struct btd_adapter *adapter = user_data;
10507 if (profile->adapter_remove)
10508 profile->adapter_remove(profile, adapter);
10511 static void unload_drivers(struct btd_adapter *adapter)
10513 g_slist_foreach(adapter->drivers, remove_driver, adapter);
10514 g_slist_free(adapter->drivers);
10515 adapter->drivers = NULL;
10517 g_slist_foreach(adapter->profiles, remove_profile, adapter);
10518 g_slist_free(adapter->profiles);
10519 adapter->profiles = NULL;
10522 static void free_service_auth(gpointer data, gpointer user_data)
10524 struct service_auth *auth = data;
10529 static void remove_discovery_list(struct btd_adapter *adapter)
10531 g_slist_free_full(adapter->set_filter_list, discovery_free);
10532 adapter->set_filter_list = NULL;
10534 g_slist_free_full(adapter->discovery_list, discovery_free);
10535 adapter->discovery_list = NULL;
10538 static void adapter_free(gpointer user_data)
10540 struct btd_adapter *adapter = user_data;
10542 DBG("%p", adapter);
10544 /* Make sure the adapter's discovery list is cleaned up before freeing
10547 remove_discovery_list(adapter);
10549 if (adapter->pairable_timeout_id > 0) {
10550 timeout_remove(adapter->pairable_timeout_id);
10551 adapter->pairable_timeout_id = 0;
10554 if (adapter->passive_scan_timeout > 0) {
10555 timeout_remove(adapter->passive_scan_timeout);
10556 adapter->passive_scan_timeout = 0;
10559 if (adapter->load_ltks_timeout > 0)
10560 timeout_remove(adapter->load_ltks_timeout);
10562 if (adapter->confirm_name_timeout > 0)
10563 timeout_remove(adapter->confirm_name_timeout);
10565 if (adapter->pair_device_timeout > 0)
10566 timeout_remove(adapter->pair_device_timeout);
10568 if (adapter->auth_idle_id)
10569 timeout_remove(adapter->auth_idle_id);
10571 g_queue_foreach(adapter->auths, free_service_auth, NULL);
10572 g_queue_free(adapter->auths);
10573 queue_destroy(adapter->exps, NULL);
10576 * Unregister all handlers for this specific index since
10577 * the adapter bound to them is no longer valid.
10579 * This also avoids having multiple instances of the same
10580 * handler in case indexes got removed and re-added.
10582 mgmt_unregister_index(adapter->mgmt, adapter->dev_id);
10585 * Cancel all pending commands for this specific index
10586 * since the adapter bound to them is no longer valid.
10588 mgmt_cancel_index(adapter->mgmt, adapter->dev_id);
10590 mgmt_unref(adapter->mgmt);
10592 sdp_list_free(adapter->services, NULL);
10594 g_slist_free(adapter->connections);
10596 g_free(adapter->path);
10597 g_free(adapter->name);
10598 g_free(adapter->short_name);
10599 g_free(adapter->system_name);
10600 g_free(adapter->stored_alias);
10601 g_free(adapter->current_alias);
10602 free(adapter->modalias);
10604 if (adapter->allowed_uuid_set)
10605 g_hash_table_destroy(adapter->allowed_uuid_set);
10610 struct btd_adapter *btd_adapter_ref(struct btd_adapter *adapter)
10612 __sync_fetch_and_add(&adapter->ref_count, 1);
10617 void btd_adapter_unref(struct btd_adapter *adapter)
10619 if (__sync_sub_and_fetch(&adapter->ref_count, 1))
10622 if (!adapter->path) {
10623 DBG("Freeing adapter %u", adapter->dev_id);
10625 adapter_free(adapter);
10629 DBG("Freeing adapter %s", adapter->path);
10631 g_dbus_unregister_interface(dbus_conn, adapter->path,
10632 ADAPTER_INTERFACE);
10635 static void convert_names_entry(char *key, char *value, void *user_data)
10637 char *address = user_data;
10639 char filename[PATH_MAX];
10640 GKeyFile *key_file;
10641 GError *gerr = NULL;
10645 if (strchr(key, '#'))
10648 if (bachk(str) != 0)
10651 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/cache/%s", address, str);
10652 create_file(filename, 0600);
10654 key_file = g_key_file_new();
10655 if (!g_key_file_load_from_file(key_file, filename, 0, &gerr)) {
10656 error("Unable to load key file from %s: (%s)", filename,
10658 g_error_free(gerr);
10660 g_key_file_set_string(key_file, "General", "Name", value);
10662 data = g_key_file_to_data(key_file, &length, NULL);
10663 if (!g_file_set_contents(filename, data, length, &gerr)) {
10664 error("Unable set contents for %s: (%s)", filename,
10666 g_error_free(gerr);
10670 g_key_file_free(key_file);
10673 struct device_converter {
10675 void (*cb)(GKeyFile *key_file, void *value);
10679 static void set_device_type(GKeyFile *key_file, char type)
10682 char *addr_type = NULL;
10689 case BDADDR_LE_PUBLIC:
10691 addr_type = "public";
10693 case BDADDR_LE_RANDOM:
10695 addr_type = "static";
10701 str = g_key_file_get_string(key_file, "General",
10702 "SupportedTechnologies", NULL);
10704 g_key_file_set_string(key_file, "General",
10705 "SupportedTechnologies", techno);
10706 else if (!strstr(str, techno))
10707 g_key_file_set_string(key_file, "General",
10708 "SupportedTechnologies", "BR/EDR;LE");
10713 g_key_file_set_string(key_file, "General", "AddressType",
10717 static void convert_aliases_entry(GKeyFile *key_file, void *value)
10719 g_key_file_set_string(key_file, "General", "Alias", value);
10722 static void convert_trusts_entry(GKeyFile *key_file, void *value)
10724 g_key_file_set_boolean(key_file, "General", "Trusted", TRUE);
10727 static void convert_classes_entry(GKeyFile *key_file, void *value)
10729 g_key_file_set_string(key_file, "General", "Class", value);
10732 static void convert_blocked_entry(GKeyFile *key_file, void *value)
10734 g_key_file_set_boolean(key_file, "General", "Blocked", TRUE);
10737 static void convert_did_entry(GKeyFile *key_file, void *value)
10739 char *vendor_str, *product_str, *version_str;
10742 vendor_str = strchr(value, ' ');
10746 *(vendor_str++) = 0;
10748 if (g_str_equal(value, "FFFF"))
10751 product_str = strchr(vendor_str, ' ');
10755 *(product_str++) = 0;
10757 version_str = strchr(product_str, ' ');
10761 *(version_str++) = 0;
10763 val = (uint16_t) strtol(value, NULL, 16);
10764 g_key_file_set_integer(key_file, "DeviceID", "Source", val);
10766 val = (uint16_t) strtol(vendor_str, NULL, 16);
10767 g_key_file_set_integer(key_file, "DeviceID", "Vendor", val);
10769 val = (uint16_t) strtol(product_str, NULL, 16);
10770 g_key_file_set_integer(key_file, "DeviceID", "Product", val);
10772 val = (uint16_t) strtol(version_str, NULL, 16);
10773 g_key_file_set_integer(key_file, "DeviceID", "Version", val);
10776 static void convert_linkkey_entry(GKeyFile *key_file, void *value)
10778 char *type_str, *length_str, *str;
10781 type_str = strchr(value, ' ');
10787 length_str = strchr(type_str, ' ');
10791 *(length_str++) = 0;
10793 str = g_strconcat("0x", value, NULL);
10794 g_key_file_set_string(key_file, "LinkKey", "Key", str);
10797 val = strtol(type_str, NULL, 16);
10798 g_key_file_set_integer(key_file, "LinkKey", "Type", val);
10800 val = strtol(length_str, NULL, 16);
10801 g_key_file_set_integer(key_file, "LinkKey", "PINLength", val);
10804 static void convert_ltk_entry(GKeyFile *key_file, void *value)
10806 char *auth_str, *rand_str, *str;
10808 unsigned char auth, central, enc_size;
10809 unsigned short ediv;
10811 auth_str = strchr(value, ' ');
10817 for (i = 0, rand_str = auth_str; i < 4; i++) {
10818 rand_str = strchr(rand_str, ' ');
10819 if (!rand_str || rand_str[1] == '\0')
10825 ret = sscanf(auth_str, " %hhd %hhd %hhd %hd", &auth, ¢ral,
10830 str = g_strconcat("0x", value, NULL);
10831 g_key_file_set_string(key_file, "LongTermKey", "Key", str);
10834 g_key_file_set_integer(key_file, "LongTermKey", "Authenticated", auth);
10835 g_key_file_set_integer(key_file, "LongTermKey", "EncSize", enc_size);
10836 g_key_file_set_integer(key_file, "LongTermKey", "EDiv", ediv);
10838 str = g_strconcat("0x", rand_str, NULL);
10839 g_key_file_set_string(key_file, "LongTermKey", "Rand", str);
10843 static void convert_profiles_entry(GKeyFile *key_file, void *value)
10845 g_strdelimit(value, " ", ';');
10846 g_key_file_set_string(key_file, "General", "Services", value);
10849 static void convert_appearances_entry(GKeyFile *key_file, void *value)
10851 g_key_file_set_string(key_file, "General", "Appearance", value);
10854 static void convert_entry(char *key, char *value, void *user_data)
10856 struct device_converter *converter = user_data;
10857 char type = BDADDR_BREDR;
10858 char filename[PATH_MAX];
10859 GKeyFile *key_file;
10860 GError *gerr = NULL;
10864 if (strchr(key, '#')) {
10866 type = key[18] - '0';
10869 if (bachk(key) != 0)
10872 if (converter->force == FALSE) {
10876 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/%s",
10877 converter->address, key);
10879 err = stat(filename, &st);
10880 if (err || !S_ISDIR(st.st_mode))
10884 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/%s/info",
10885 converter->address, key);
10887 key_file = g_key_file_new();
10888 if (!g_key_file_load_from_file(key_file, filename, 0, &gerr)) {
10889 error("Unable to load key file from %s: (%s)", filename,
10891 g_error_free(gerr);
10894 set_device_type(key_file, type);
10896 converter->cb(key_file, value);
10898 data = g_key_file_to_data(key_file, &length, NULL);
10900 create_file(filename, 0600);
10901 if (!g_file_set_contents(filename, data, length, &gerr)) {
10902 error("Unable set contents for %s: (%s)", filename,
10904 g_error_free(gerr);
10910 g_key_file_free(key_file);
10913 static void convert_file(char *file, char *address,
10914 void (*cb)(GKeyFile *key_file, void *value),
10917 char filename[PATH_MAX];
10918 struct device_converter converter;
10920 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/%s", address, file);
10922 converter.address = address;
10924 converter.force = force;
10926 textfile_foreach(filename, convert_entry, &converter);
10929 static gboolean record_has_uuid(const sdp_record_t *rec,
10930 const char *profile_uuid)
10934 for (pat = rec->pattern; pat != NULL; pat = pat->next) {
10938 uuid = bt_uuid2string(pat->data);
10942 ret = strcasecmp(uuid, profile_uuid);
10953 static void store_attribute_uuid(GKeyFile *key_file, uint16_t start,
10954 uint16_t end, char *att_uuid,
10957 char handle[6], uuid_str[33];
10960 switch (uuid.type) {
10962 sprintf(uuid_str, "%4.4X", uuid.value.uuid16);
10965 sprintf(uuid_str, "%8.8X", uuid.value.uuid32);
10968 for (i = 0; i < 16; i++)
10969 sprintf(uuid_str + (i * 2), "%2.2X",
10970 uuid.value.uuid128.data[i]);
10973 uuid_str[0] = '\0';
10976 sprintf(handle, "%hu", start);
10977 g_key_file_set_string(key_file, handle, "UUID", att_uuid);
10978 g_key_file_set_string(key_file, handle, "Value", uuid_str);
10979 g_key_file_set_integer(key_file, handle, "EndGroupHandle", end);
10982 static void store_sdp_record(char *local, char *peer, int handle, char *value)
10984 char filename[PATH_MAX];
10985 GKeyFile *key_file;
10986 GError *gerr = NULL;
10987 char handle_str[11];
10991 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/cache/%s", local, peer);
10993 key_file = g_key_file_new();
10994 if (!g_key_file_load_from_file(key_file, filename, 0, &gerr)) {
10995 error("Unable to load key file from %s: (%s)", filename,
10997 g_error_free(gerr);
11000 sprintf(handle_str, "0x%8.8X", handle);
11001 g_key_file_set_string(key_file, "ServiceRecords", handle_str, value);
11003 data = g_key_file_to_data(key_file, &length, NULL);
11005 create_file(filename, 0600);
11006 if (!g_file_set_contents(filename, data, length, &gerr)) {
11007 error("Unable set contents for %s: (%s)", filename,
11009 g_error_free(gerr);
11015 g_key_file_free(key_file);
11018 static void convert_sdp_entry(char *key, char *value, void *user_data)
11020 char *src_addr = user_data;
11022 char type = BDADDR_BREDR;
11024 char filename[PATH_MAX];
11025 GKeyFile *key_file;
11026 GError *gerr = NULL;
11030 char *att_uuid, *prim_uuid;
11031 uint16_t start = 0, end = 0, psm = 0;
11036 ret = sscanf(key, "%17s#%hhu#%08X", dst_addr, &type, &handle);
11038 ret = sscanf(key, "%17s#%08X", dst_addr, &handle);
11043 if (bachk(dst_addr) != 0)
11046 /* Check if the device directory has been created as records should
11047 * only be converted for known devices */
11048 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/%s", src_addr, dst_addr);
11050 err = stat(filename, &st);
11051 if (err || !S_ISDIR(st.st_mode))
11054 /* store device records in cache */
11055 store_sdp_record(src_addr, dst_addr, handle, value);
11057 /* Retrieve device record and check if there is an
11058 * attribute entry in it */
11059 sdp_uuid16_create(&uuid, ATT_UUID);
11060 att_uuid = bt_uuid2string(&uuid);
11062 sdp_uuid16_create(&uuid, GATT_PRIM_SVC_UUID);
11063 prim_uuid = bt_uuid2string(&uuid);
11065 rec = record_from_string(value);
11067 if (record_has_uuid(rec, att_uuid))
11070 /* TODO: Do this through btd_gatt_database */
11071 if (!gatt_parse_record(rec, &uuid, &psm, &start, &end))
11074 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/%s/attributes", src_addr,
11077 key_file = g_key_file_new();
11078 if (!g_key_file_load_from_file(key_file, filename, 0, &gerr)) {
11079 error("Unable to load key file from %s: (%s)", filename,
11081 g_error_free(gerr);
11084 store_attribute_uuid(key_file, start, end, prim_uuid, uuid);
11086 data = g_key_file_to_data(key_file, &length, NULL);
11088 create_file(filename, 0600);
11089 if (!g_file_set_contents(filename, data, length, &gerr)) {
11090 error("Unable set contents for %s: (%s)", filename,
11092 g_error_free(gerr);
11097 g_key_file_free(key_file);
11100 sdp_record_free(rec);
11105 static void convert_primaries_entry(char *key, char *value, void *user_data)
11107 char *address = user_data;
11108 int device_type = -1;
11110 char **services, **service, *prim_uuid;
11111 char filename[PATH_MAX];
11112 GKeyFile *key_file;
11113 GError *gerr = NULL;
11115 uint16_t start, end;
11116 char uuid_str[MAX_LEN_UUID_STR + 1];
11120 if (strchr(key, '#')) {
11122 device_type = key[18] - '0';
11125 if (bachk(key) != 0)
11128 services = g_strsplit(value, " ", 0);
11129 if (services == NULL)
11132 sdp_uuid16_create(&uuid, GATT_PRIM_SVC_UUID);
11133 prim_uuid = bt_uuid2string(&uuid);
11135 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/%s/attributes", address,
11137 key_file = g_key_file_new();
11138 if (!g_key_file_load_from_file(key_file, filename, 0, &gerr)) {
11139 error("Unable to load key file from %s: (%s)", filename,
11141 g_error_free(gerr);
11144 for (service = services; *service; service++) {
11145 ret = sscanf(*service, "%04hX#%04hX#%s", &start, &end,
11150 bt_string2uuid(&uuid, uuid_str);
11151 sdp_uuid128_to_uuid(&uuid);
11153 store_attribute_uuid(key_file, start, end, prim_uuid, uuid);
11156 g_strfreev(services);
11158 data = g_key_file_to_data(key_file, &length, NULL);
11162 create_file(filename, 0600);
11163 if (!g_file_set_contents(filename, data, length, &gerr)) {
11164 error("Unable set contents for %s: (%s)", filename,
11166 g_error_free(gerr);
11169 if (device_type < 0)
11173 g_key_file_free(key_file);
11175 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/%s/info", address, key);
11177 key_file = g_key_file_new();
11178 if (!g_key_file_load_from_file(key_file, filename, 0, &gerr)) {
11179 error("Unable to load key file from %s: (%s)", filename,
11181 g_error_free(gerr);
11183 set_device_type(key_file, device_type);
11185 data = g_key_file_to_data(key_file, &length, NULL);
11187 create_file(filename, 0600);
11188 if (!g_file_set_contents(filename, data, length, &gerr)) {
11189 error("Unable set contents for %s: (%s)", filename,
11191 g_error_free(gerr);
11198 g_key_file_free(key_file);
11201 static void convert_ccc_entry(char *key, char *value, void *user_data)
11203 char *src_addr = user_data;
11205 char type = BDADDR_BREDR;
11208 char filename[PATH_MAX];
11209 GKeyFile *key_file;
11210 GError *gerr = NULL;
11216 ret = sscanf(key, "%17s#%hhu#%04hX", dst_addr, &type, &handle);
11220 if (bachk(dst_addr) != 0)
11223 /* Check if the device directory has been created as records should
11224 * only be converted for known devices */
11225 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/%s", src_addr, dst_addr);
11227 err = stat(filename, &st);
11228 if (err || !S_ISDIR(st.st_mode))
11231 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/%s/ccc", src_addr,
11233 key_file = g_key_file_new();
11234 if (!g_key_file_load_from_file(key_file, filename, 0, &gerr)) {
11235 error("Unable to load key file from %s: (%s)", filename,
11237 g_error_free(gerr);
11240 sprintf(group, "%hu", handle);
11241 g_key_file_set_string(key_file, group, "Value", value);
11243 data = g_key_file_to_data(key_file, &length, NULL);
11245 create_file(filename, 0600);
11246 if (!g_file_set_contents(filename, data, length, &gerr)) {
11247 error("Unable set contents for %s: (%s)", filename,
11249 g_error_free(gerr);
11254 g_key_file_free(key_file);
11257 static void convert_gatt_entry(char *key, char *value, void *user_data)
11259 char *src_addr = user_data;
11261 char type = BDADDR_BREDR;
11264 char filename[PATH_MAX];
11265 GKeyFile *key_file;
11266 GError *gerr = NULL;
11272 ret = sscanf(key, "%17s#%hhu#%04hX", dst_addr, &type, &handle);
11276 if (bachk(dst_addr) != 0)
11279 /* Check if the device directory has been created as records should
11280 * only be converted for known devices */
11281 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/%s", src_addr, dst_addr);
11283 err = stat(filename, &st);
11284 if (err || !S_ISDIR(st.st_mode))
11287 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/%s/gatt", src_addr,
11289 key_file = g_key_file_new();
11290 if (!g_key_file_load_from_file(key_file, filename, 0, &gerr)) {
11291 error("Unable to load key file from %s: (%s)", filename,
11293 g_error_free(gerr);
11296 sprintf(group, "%hu", handle);
11297 g_key_file_set_string(key_file, group, "Value", value);
11299 data = g_key_file_to_data(key_file, &length, NULL);
11301 create_file(filename, 0600);
11302 if (!g_file_set_contents(filename, data, length, &gerr)) {
11303 error("Unable set contents for %s: (%s)", filename,
11305 g_error_free(gerr);
11310 g_key_file_free(key_file);
11313 static void convert_proximity_entry(char *key, char *value, void *user_data)
11315 char *src_addr = user_data;
11317 char filename[PATH_MAX];
11318 GKeyFile *key_file;
11319 GError *gerr = NULL;
11325 if (!strchr(key, '#'))
11331 if (bachk(key) != 0)
11334 /* Check if the device directory has been created as records should
11335 * only be converted for known devices */
11336 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/%s", src_addr, key);
11338 err = stat(filename, &st);
11339 if (err || !S_ISDIR(st.st_mode))
11342 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/%s/proximity", src_addr,
11344 key_file = g_key_file_new();
11345 if (!g_key_file_load_from_file(key_file, filename, 0, &gerr)) {
11346 error("Unable to load key file from %s: (%s)", filename,
11348 g_error_free(gerr);
11351 g_key_file_set_string(key_file, alert, "Level", value);
11353 data = g_key_file_to_data(key_file, &length, NULL);
11355 create_file(filename, 0600);
11356 if (!g_file_set_contents(filename, data, length, &gerr)) {
11357 error("Unable set contents for %s: (%s)", filename,
11359 g_error_free(gerr);
11364 g_key_file_free(key_file);
11367 static void convert_device_storage(struct btd_adapter *adapter)
11369 char filename[PATH_MAX];
11372 ba2str(&adapter->bdaddr, address);
11374 /* Convert device's name cache */
11375 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/names", address);
11376 textfile_foreach(filename, convert_names_entry, address);
11378 /* Convert aliases */
11379 convert_file("aliases", address, convert_aliases_entry, TRUE);
11381 /* Convert trusts */
11382 convert_file("trusts", address, convert_trusts_entry, TRUE);
11384 /* Convert blocked */
11385 convert_file("blocked", address, convert_blocked_entry, TRUE);
11387 /* Convert profiles */
11388 convert_file("profiles", address, convert_profiles_entry, TRUE);
11390 /* Convert primaries */
11391 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/primaries", address);
11392 textfile_foreach(filename, convert_primaries_entry, address);
11394 /* Convert linkkeys */
11395 convert_file("linkkeys", address, convert_linkkey_entry, TRUE);
11397 /* Convert longtermkeys */
11398 convert_file("longtermkeys", address, convert_ltk_entry, TRUE);
11400 /* Convert classes */
11401 convert_file("classes", address, convert_classes_entry, FALSE);
11403 /* Convert device ids */
11404 convert_file("did", address, convert_did_entry, FALSE);
11407 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/sdp", address);
11408 textfile_foreach(filename, convert_sdp_entry, address);
11411 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/ccc", address);
11412 textfile_foreach(filename, convert_ccc_entry, address);
11414 /* Convert appearances */
11415 convert_file("appearances", address, convert_appearances_entry, FALSE);
11418 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/gatt", address);
11419 textfile_foreach(filename, convert_gatt_entry, address);
11421 /* Convert proximity */
11422 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/proximity", address);
11423 textfile_foreach(filename, convert_proximity_entry, address);
11426 static void convert_config(struct btd_adapter *adapter, const char *filename,
11427 GKeyFile *key_file)
11430 char str[MAX_NAME_LENGTH + 1];
11431 char config_path[PATH_MAX];
11436 GError *gerr = NULL;
11438 ba2str(&adapter->bdaddr, address);
11439 snprintf(config_path, PATH_MAX, STORAGEDIR "/%s/config", address);
11441 if (read_pairable_timeout(address, &timeout) == 0)
11442 g_key_file_set_integer(key_file, "General",
11443 "PairableTimeout", timeout);
11445 if (read_discoverable_timeout(address, &timeout) == 0)
11446 g_key_file_set_integer(key_file, "General",
11447 "DiscoverableTimeout", timeout);
11449 if (read_on_mode(address, str, sizeof(str)) == 0) {
11450 mode = get_mode(str);
11451 g_key_file_set_boolean(key_file, "General", "Discoverable",
11452 mode == MODE_DISCOVERABLE);
11455 if (read_local_name(&adapter->bdaddr, str) == 0)
11456 g_key_file_set_string(key_file, "General", "Alias", str);
11458 create_file(filename, 0600);
11460 data = g_key_file_to_data(key_file, &length, NULL);
11461 if (!g_file_set_contents(filename, data, length, &gerr)) {
11462 error("Unable set contents for %s: (%s)", filename,
11464 g_error_free(gerr);
11469 static void fix_storage(struct btd_adapter *adapter)
11471 char filename[PATH_MAX];
11475 ba2str(&adapter->bdaddr, address);
11477 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/config", address);
11478 converted = textfile_get(filename, "converted");
11484 textfile_del(filename, "converted");
11486 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/names", address);
11487 textfile_del(filename, "converted");
11489 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/aliases", address);
11490 textfile_del(filename, "converted");
11492 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/trusts", address);
11493 textfile_del(filename, "converted");
11495 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/blocked", address);
11496 textfile_del(filename, "converted");
11498 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/profiles", address);
11499 textfile_del(filename, "converted");
11501 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/primaries", address);
11502 textfile_del(filename, "converted");
11504 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/linkkeys", address);
11505 textfile_del(filename, "converted");
11507 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/longtermkeys", address);
11508 textfile_del(filename, "converted");
11510 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/classes", address);
11511 textfile_del(filename, "converted");
11513 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/did", address);
11514 textfile_del(filename, "converted");
11516 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/sdp", address);
11517 textfile_del(filename, "converted");
11519 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/ccc", address);
11520 textfile_del(filename, "converted");
11522 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/appearances", address);
11523 textfile_del(filename, "converted");
11525 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/gatt", address);
11526 textfile_del(filename, "converted");
11528 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/proximity", address);
11529 textfile_del(filename, "converted");
11532 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
11533 static bool is_tempfile(const char *filename)
11538 /* tempfile has ^[A-Z0-9]{6}$ suffix (e.g. "settings.1LS4BZ") */
11539 p = strrchr(filename, '.');
11543 if (strlen(++p) != 6)
11546 for (i = 0; i < 6; i++) {
11547 if (isdigit(p[i]) || isupper(p[i]))
11555 static void delete_tempfiles(const char *dirname)
11558 struct dirent *entry;
11559 char filename[PATH_MAX];
11561 dir = opendir(dirname);
11565 while ((entry = readdir(dir)) != NULL) {
11566 if (g_str_equal(entry->d_name, ".") || g_str_equal(entry->d_name, ".."))
11569 if (entry->d_type == DT_UNKNOWN)
11570 entry->d_type = util_get_dt(dirname, entry->d_name);
11572 snprintf(filename, PATH_MAX, "%s/%s", dirname, entry->d_name);
11574 if (entry->d_type == DT_DIR) {
11575 delete_tempfiles(filename);
11576 } else if (entry->d_type == DT_REG && is_tempfile(entry->d_name)) {
11584 static void load_config(struct btd_adapter *adapter)
11586 GKeyFile *key_file;
11587 char filename[PATH_MAX];
11589 GError *gerr = NULL;
11590 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
11594 key_file = g_key_file_new();
11596 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/settings",
11597 btd_adapter_get_storage_dir(adapter));
11599 if (stat(filename, &st) < 0) {
11600 convert_config(adapter, filename, key_file);
11601 convert_device_storage(adapter);
11604 if (!g_key_file_load_from_file(key_file, filename, 0, &gerr)) {
11605 error("Unable to load key file from %s: (%s)", filename,
11607 g_error_free(gerr);
11611 adapter->stored_alias = g_key_file_get_string(key_file, "General",
11613 if (!adapter->stored_alias) {
11615 adapter->stored_alias = g_key_file_get_string(key_file,
11616 "General", "Name", NULL);
11619 /* Get pairable timeout */
11620 adapter->pairable_timeout = g_key_file_get_integer(key_file, "General",
11621 "PairableTimeout", &gerr);
11623 adapter->pairable_timeout = btd_opts.pairto;
11624 g_error_free(gerr);
11628 /* Get discoverable mode */
11629 adapter->stored_discoverable = g_key_file_get_boolean(key_file,
11630 "General", "Discoverable", &gerr);
11632 adapter->stored_discoverable = false;
11633 g_error_free(gerr);
11637 /* Get discoverable timeout */
11638 adapter->discoverable_timeout = g_key_file_get_integer(key_file,
11639 "General", "DiscoverableTimeout", &gerr);
11641 adapter->discoverable_timeout = btd_opts.discovto;
11642 g_error_free(gerr);
11646 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
11647 /* Get A2DP Role */
11648 str = g_key_file_get_string(key_file, "General", "DefaultA2DPRole", &gerr);
11649 if (gerr || !str) {
11650 if (btd_opts.default_a2dp_role_sink) {
11651 DBG("Default A2DP role is sink");
11652 adapter->a2dp_role = BLUETOOTH_A2DP_SINK_ROLE;
11654 adapter->a2dp_role = BLUETOOTH_A2DP_SOURCE_ROLE;
11656 g_error_free(gerr);
11659 if (g_strcmp0(str, "sink") == 0)
11660 adapter->a2dp_role = BLUETOOTH_A2DP_SINK_ROLE;
11661 else if (g_strcmp0(str, "source") == 0)
11662 adapter->a2dp_role = BLUETOOTH_A2DP_SOURCE_ROLE;
11667 g_key_file_free(key_file);
11670 static struct btd_adapter *btd_adapter_new(uint16_t index)
11672 struct btd_adapter *adapter;
11673 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
11674 #ifdef TIZEN_FEATURE_BLUEZ_BATTERY_WATCH
11675 DBusConnection *conn = btd_get_dbus_connection();
11676 DBusMessage *msg = NULL;
11677 DBusMessage *reply = NULL;
11678 int charging_state = 0;
11679 #endif /* TIZEN_FEATURE_BLUEZ_BATTERY_WATCH */
11682 adapter = g_try_new0(struct btd_adapter, 1);
11686 adapter->dev_id = index;
11687 adapter->mgmt = mgmt_ref(mgmt_primary);
11688 adapter->pincode_requested = false;
11691 * Setup default configuration values. These are either adapter
11692 * defaults or from a system wide configuration file.
11694 * Some value might be overwritten later on by adapter specific
11695 * configuration. This is to make sure that sane defaults are
11698 adapter->system_name = g_strdup(btd_opts.name);
11699 adapter->major_class = (btd_opts.class & 0x001f00) >> 8;
11700 adapter->minor_class = (btd_opts.class & 0x0000fc) >> 2;
11701 adapter->modalias = bt_modalias(btd_opts.did_source,
11702 btd_opts.did_vendor,
11703 btd_opts.did_product,
11704 btd_opts.did_version);
11705 adapter->discoverable_timeout = btd_opts.discovto;
11706 adapter->pairable_timeout = btd_opts.pairto;
11707 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
11708 adapter->advertising = FALSE;
11711 DBG("System name: %s", adapter->system_name);
11712 DBG("Major class: %u", adapter->major_class);
11713 DBG("Minor class: %u", adapter->minor_class);
11714 DBG("Modalias: %s", adapter->modalias);
11715 DBG("Discoverable timeout: %u seconds", adapter->discoverable_timeout);
11716 DBG("Pairable timeout: %u seconds", adapter->pairable_timeout);
11717 adapter->auths = g_queue_new();
11718 adapter->exps = queue_new();
11720 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
11721 #ifdef TIZEN_FEATURE_BLUEZ_BATTERY_WATCH
11722 adapter->charging_watch = g_dbus_add_signal_watch(conn, DEVICED_DEST,
11723 DEVICED_BATT_OBJECT_PATH,
11724 DEVICED_BATT_INTERFACE, "ChargerType",
11725 charging_state_changed, adapter, NULL);
11726 if (adapter->charging_watch == 0)
11727 error("Cannot add signal watch for ChargerType");
11729 msg = dbus_message_new_method_call(DEVICED_DEST,
11730 DEVICED_BATT_OBJECT_PATH,
11731 DEVICED_BATT_INTERFACE, "ChargerType");
11733 reply = dbus_connection_send_with_reply_and_block(conn,
11736 if (dbus_message_get_args(reply, NULL,
11737 DBUS_TYPE_INT32, &charging_state,
11738 DBUS_TYPE_INVALID) == TRUE) {
11739 set_charging_state(adapter, charging_state);
11741 dbus_message_unref(reply);
11743 error("Reply is NULL");
11745 dbus_message_unref(msg);
11747 error("Unable to create dbus message for charging state");
11749 #endif /* TIZEN_FEATURE_BLUEZ_BATTERY_WATCH */
11752 return btd_adapter_ref(adapter);
11755 static void adapter_remove(struct btd_adapter *adapter)
11758 #ifndef TIZEN_FEATURE_BLUEZ_MODIFY
11759 struct gatt_db *db;
11762 DBG("Removing adapter %s", adapter->path);
11764 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
11765 #ifdef TIZEN_FEATURE_BLUEZ_BATTERY_WATCH
11766 if (adapter->charging_watch > 0) {
11767 g_dbus_remove_watch(btd_get_dbus_connection(),
11768 adapter->charging_watch);
11769 adapter->charging_watch = 0;
11772 if (adapter->charging_timeout) {
11773 g_source_remove(adapter->charging_timeout);
11774 adapter->charging_timeout = 0;
11776 #endif /* TIZEN_FEATURE_BLUEZ_BATTERY_WATCH */
11779 if (adapter->discovery_idle_timeout > 0) {
11780 g_source_remove(adapter->discovery_idle_timeout);
11781 adapter->discovery_idle_timeout = 0;
11784 discovery_cleanup(adapter, 0);
11786 g_slist_free(adapter->connect_list);
11787 adapter->connect_list = NULL;
11789 for (l = adapter->devices; l; l = l->next) {
11790 device_removed_drivers(adapter, l->data);
11791 device_remove(l->data, FALSE);
11794 g_slist_free(adapter->devices);
11795 adapter->devices = NULL;
11797 discovery_cleanup(adapter, 0);
11799 unload_drivers(adapter);
11801 #ifndef TIZEN_FEATURE_BLUEZ_MODIFY
11802 db = btd_gatt_database_get_db(adapter->database);
11803 gatt_db_unregister(db, adapter->db_id);
11804 adapter->db_id = 0;
11806 btd_gatt_database_destroy(adapter->database);
11807 adapter->database = NULL;
11809 btd_adapter_gatt_server_stop(adapter);
11811 btd_adv_manager_destroy(adapter->adv_manager);
11812 adapter->adv_manager = NULL;
11814 btd_adv_monitor_manager_destroy(adapter->adv_monitor_manager);
11815 adapter->adv_monitor_manager = NULL;
11817 btd_battery_provider_manager_destroy(adapter->battery_provider_manager);
11818 adapter->battery_provider_manager = NULL;
11820 g_slist_free(adapter->pin_callbacks);
11821 adapter->pin_callbacks = NULL;
11823 g_slist_free(adapter->msd_callbacks);
11824 adapter->msd_callbacks = NULL;
11827 const char *adapter_get_path(struct btd_adapter *adapter)
11832 return adapter->path;
11835 const bdaddr_t *btd_adapter_get_address(struct btd_adapter *adapter)
11837 return &adapter->bdaddr;
11840 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
11841 const bdaddr_t *btd_adapter_get_le_address(struct btd_adapter *adapter)
11843 if (adapter->current_settings & MGMT_SETTING_PRIVACY)
11844 return &adapter->rpa;
11845 else if (adapter->le_static_addr.b[5] != 0)
11846 return &adapter->le_static_addr;
11848 return &adapter->bdaddr;
11851 uint8_t btd_adapter_get_le_address_type(struct btd_adapter * adapter)
11853 if (adapter->current_settings & MGMT_SETTING_PRIVACY ||
11854 adapter->le_static_addr.b[5] != 0)
11855 return BDADDR_LE_RANDOM;
11857 return BDADDR_LE_PUBLIC;
11861 static bool confirm_name_timeout(gpointer user_data)
11863 struct btd_adapter *adapter = user_data;
11865 btd_error(adapter->dev_id, "Confirm name timed out for hci%u",
11868 adapter->confirm_name_timeout = 0;
11870 mgmt_cancel(adapter->mgmt, adapter->confirm_name_id);
11871 adapter->confirm_name_id = 0;
11876 static void confirm_name_complete(uint8_t status, uint16_t length,
11877 const void *param, void *user_data)
11879 struct btd_adapter *adapter = user_data;
11881 if (status != MGMT_STATUS_SUCCESS) {
11882 btd_error(adapter->dev_id,
11883 "Failed to confirm name for hci%u: %s (0x%02x)",
11884 adapter->dev_id, mgmt_errstr(status), status);
11887 adapter->confirm_name_id = 0;
11889 timeout_remove(adapter->confirm_name_timeout);
11890 adapter->confirm_name_timeout = 0;
11892 DBG("Confirm name complete for hci%u", adapter->dev_id);
11895 static void confirm_name(struct btd_adapter *adapter, const bdaddr_t *bdaddr,
11896 uint8_t bdaddr_type, bool name_known)
11898 struct mgmt_cp_confirm_name cp;
11901 ba2str(bdaddr, addr);
11902 DBG("hci%d bdaddr %s name_known %u", adapter->dev_id, addr,
11906 * If the kernel does not answer the confirm name command with
11907 * a command complete or command status in time, this might
11908 * race against another device found event that also requires
11909 * to confirm the name. If there is a pending command, just
11910 * cancel it to be safe here.
11912 if (adapter->confirm_name_id > 0) {
11913 btd_warn(adapter->dev_id,
11914 "Found pending confirm name for hci%u",
11916 mgmt_cancel(adapter->mgmt, adapter->confirm_name_id);
11919 if (adapter->confirm_name_timeout > 0) {
11920 timeout_remove(adapter->confirm_name_timeout);
11921 adapter->confirm_name_timeout = 0;
11924 memset(&cp, 0, sizeof(cp));
11925 bacpy(&cp.addr.bdaddr, bdaddr);
11926 cp.addr.type = bdaddr_type;
11927 cp.name_known = name_known;
11929 adapter->confirm_name_id = mgmt_reply(adapter->mgmt,
11930 MGMT_OP_CONFIRM_NAME,
11931 adapter->dev_id, sizeof(cp), &cp,
11932 confirm_name_complete, adapter, NULL);
11934 if (adapter->confirm_name_id == 0) {
11935 btd_error(adapter->dev_id, "Failed to confirm name for hci%u",
11941 * This timeout handling is needed since the kernel is stupid
11942 * and forgets to send a command complete response. However in
11943 * case of failures it does send a command status.
11945 adapter->confirm_name_timeout = timeout_add_seconds(2,
11946 confirm_name_timeout, adapter,
11950 static void adapter_msd_notify(struct btd_adapter *adapter,
11951 struct btd_device *dev,
11954 GSList *cb_l, *cb_next;
11955 GSList *msd_l, *msd_next;
11957 for (cb_l = adapter->msd_callbacks; cb_l != NULL; cb_l = cb_next) {
11958 btd_msd_cb_t cb = cb_l->data;
11960 cb_next = g_slist_next(cb_l);
11962 for (msd_l = msd_list; msd_l != NULL; msd_l = msd_next) {
11963 const struct eir_msd *msd = msd_l->data;
11965 msd_next = g_slist_next(msd_l);
11967 cb(adapter, dev, msd->company, msd->data,
11973 static bool is_filter_match(GSList *discovery_filter, struct eir_data *eir_data,
11977 bool got_match = false;
11979 for (l = discovery_filter; l != NULL && got_match != true;
11980 l = g_slist_next(l)) {
11981 struct discovery_client *client = l->data;
11982 struct discovery_filter *item = client->discovery_filter;
11985 * If one of currently running scans is regular scan, then
11986 * return all devices as matches
11993 /* if someone started discovery with empty uuids, he wants all
11994 * devices in given proximity.
11999 for (m = item->uuids; m != NULL && got_match != true;
12000 m = g_slist_next(m)) {
12001 /* m->data contains string representation of
12004 if (g_slist_find_custom(eir_data->services,
12012 /* we have service match, check proximity */
12013 if (item->rssi == DISTANCE_VAL_INVALID ||
12014 item->rssi <= rssi ||
12015 item->pathloss == DISTANCE_VAL_INVALID ||
12016 (eir_data->tx_power != 127 &&
12017 eir_data->tx_power - rssi <= item->pathloss))
12027 static void filter_duplicate_data(void *data, void *user_data)
12029 struct discovery_client *client = data;
12030 bool *duplicate = user_data;
12032 if (*duplicate || !client->discovery_filter)
12035 *duplicate = client->discovery_filter->duplicate;
12038 #ifndef TIZEN_FEATURE_BLUEZ_MODIFY
12039 static bool device_is_discoverable(struct btd_adapter *adapter,
12040 struct eir_data *eir, const char *addr,
12041 uint8_t bdaddr_type)
12046 if (bdaddr_type == BDADDR_BREDR || adapter->filtered_discovery)
12047 discoverable = true;
12049 discoverable = eir->flags & (EIR_LIM_DISC | EIR_GEN_DISC);
12052 * Mark as not discoverable if no client has requested discovery and
12053 * report has not set any discoverable flags.
12055 if (!adapter->discovery_list && !discoverable)
12058 /* Do a prefix match for both address and name if pattern is set */
12059 for (l = adapter->discovery_list; l; l = g_slist_next(l)) {
12060 struct dicovery_client *client = l->data;
12061 struct discovery_filter *filter = client->discovery_filter;
12062 size_t pattern_len;
12064 if (!filter || !filter->pattern)
12067 /* Reset discoverable if a client has a pattern filter */
12068 discoverable = false;
12070 pattern_len = strlen(filter->pattern);
12074 if (!strncmp(filter->pattern, addr, pattern_len))
12077 if (eir->name && !strncmp(filter->pattern, eir->name,
12082 return discoverable;
12086 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
12087 void btd_adapter_update_found_device(struct btd_adapter *adapter,
12088 const bdaddr_t *bdaddr,
12089 uint8_t bdaddr_type, int8_t rssi,
12090 bool confirm, bool legacy, uint8_t adv_type,
12091 bool name_resolve_failed,
12092 const uint8_t *data, uint8_t data_len,
12095 void btd_adapter_update_found_device(struct btd_adapter *adapter,
12096 const bdaddr_t *bdaddr,
12097 uint8_t bdaddr_type, int8_t rssi,
12098 bool confirm, bool legacy,
12099 bool not_connectable,
12100 bool name_resolve_failed,
12101 const uint8_t *data, uint8_t data_len,
12105 struct btd_device *dev;
12106 #ifndef TIZEN_FEATURE_BLUEZ_MODIFY
12107 struct bt_ad *ad = NULL;
12109 struct eir_data eir_data;
12110 #ifndef TIZEN_FEATURE_BLUEZ_MODIFY
12111 bool name_known, discoverable;
12115 #ifdef TIZEN_FEATURE_PLATFROM_SCAN_FILTER
12116 uint8_t allow_report;
12119 bool duplicate = false;
12120 #ifndef TIZEN_FEATURE_BLUEZ_MODIFY
12121 struct queue *matched_monitors = NULL;
12123 if (!btd_adv_monitor_offload_supported(adapter->adv_monitor_manager)) {
12124 if (bdaddr_type != BDADDR_BREDR)
12125 ad = bt_ad_new_with_data(data_len, data);
12127 /* During the background scanning, update the device only when
12128 * the data match at least one Adv monitor
12131 matched_monitors = btd_adv_monitor_content_filter(
12132 adapter->adv_monitor_manager,
12136 monitoring = matched_monitors ? true : false;
12140 if (!adapter->discovering && !monitoring)
12143 memset(&eir_data, 0, sizeof(eir_data));
12144 eir_parse(&eir_data, data, data_len);
12145 ba2str(bdaddr, addr);
12146 #ifndef TIZEN_FEATURE_BLUEZ_MODIFY
12147 discoverable = device_is_discoverable(adapter, &eir_data, addr,
12152 #ifdef TIZEN_FEATURE_PLATFROM_SCAN_FILTER
12153 /* Check if the any filter policy */
12154 allow_report = validate_for_filter_policy(adapter, &eir_data, addr);
12155 if (allow_report == NONE_REPORT &&
12156 ((adapter->scan_type == LE_ACTIVE_SCAN && adv_type == ADV_TYPE_SCAN_RESPONSE) ||
12157 adapter->scan_type == LE_PASSIVE_SCAN)) {
12158 eir_data_free(&eir_data);
12162 dev = btd_adapter_find_device(adapter, bdaddr, bdaddr_type);
12165 * If no client has requested discovery or the device is
12166 * not marked as discoverable, then do not create new
12169 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
12170 /*DBG("List BREDR:%p LE:%p Discoverable:%d", adapter->discovery_list,
12171 adapter->le_discovery_list, discoverable);*/
12172 if ((adapter->discovery_list == NULL &&
12173 adapter->le_discovery_list == NULL)) {
12174 DBG("discovery list is NULL");
12175 eir_data_free(&eir_data);
12179 if (!adapter->discovery_list || !discoverable && !matched_monitors) {
12180 eir_data_free(&eir_data);
12185 dev = adapter_create_device(adapter, bdaddr, bdaddr_type);
12189 btd_error(adapter->dev_id,
12190 "Unable to create object for found device %s", addr);
12191 eir_data_free(&eir_data);
12195 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
12196 if (device_get_rpa_exist(dev) == true)
12197 bdaddr_type = BDADDR_LE_RANDOM;
12200 device_update_last_seen(dev, bdaddr_type);
12203 * FIXME: We need to check for non-zero flags first because
12204 * older kernels send separate adv_ind and scan_rsp. Newer
12205 * kernels send them merged, so once we know which mgmt version
12206 * supports this we can make the non-zero check conditional.
12208 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
12209 if (bdaddr_type == BDADDR_LE_PUBLIC && eir_data.flags &&
12210 !(eir_data.flags & EIR_BREDR_UNSUP)) {
12211 device_set_bredr_support(dev);
12212 /* Update last seen for BR/EDR in case its flag is set */
12213 device_update_last_seen(dev, BDADDR_BREDR);
12216 if (bdaddr_type != BDADDR_BREDR && eir_data.flags &&
12217 !(eir_data.flags & EIR_BREDR_UNSUP)) {
12218 device_set_bredr_support(dev);
12219 /* Update last seen for BR/EDR in case its flag is set */
12220 device_update_last_seen(dev, BDADDR_BREDR);
12224 if (eir_data.name != NULL && eir_data.name_complete)
12225 device_store_cached_name(dev, eir_data.name);
12228 * Only skip devices that are not connected, are temporary, and there
12229 * is no active discovery session ongoing and no matched Adv monitors
12231 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
12232 if (device_is_temporary(dev) && adapter->discovery_list == NULL &&
12233 adapter->le_discovery_list == NULL) {
12234 DBG("discovery list is NULL");
12235 eir_data_free(&eir_data);
12239 device_set_last_addr_type(dev, bdaddr_type);
12240 device_set_ipsp_connected(dev, FALSE, NULL);
12242 if (!btd_device_is_connected(dev) &&
12243 (device_is_temporary(dev) && !adapter->discovery_list) &&
12245 eir_data_free(&eir_data);
12250 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
12251 if (bdaddr_type == BDADDR_BREDR) {
12252 if (adapter->filtered_discovery &&
12253 !is_filter_match(adapter->discovery_list, &eir_data, rssi)) {
12255 /* If there is no matched Adv monitors, don't continue if not
12256 * discoverable or if active discovery filter don't match.
12258 if (!monitoring && (!discoverable ||
12259 (adapter->filtered_discovery && !is_filter_match(
12260 adapter->discovery_list, &eir_data, rssi)))) {
12262 eir_data_free(&eir_data);
12266 device_set_legacy(dev, legacy);
12268 if (name_resolve_failed)
12269 device_name_resolve_fail(dev);
12271 if (adapter->filtered_discovery)
12272 device_set_rssi_with_delta(dev, rssi, 0);
12274 device_set_rssi(dev, rssi);
12276 if (eir_data.tx_power != 127)
12277 device_set_tx_power(dev, eir_data.tx_power);
12278 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
12282 if (eir_data.appearance != 0)
12283 device_set_appearance(dev, eir_data.appearance);
12285 /* Report an unknown name to the kernel even if there is a short name
12286 * known, but still update the name with the known short name. */
12287 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
12288 if (eir_data.name_complete)
12289 name_known = device_name_known(dev);
12291 name_known = false;
12293 name_known = device_name_known(dev);
12296 if (eir_data.name && (eir_data.name_complete || !name_known))
12297 btd_device_device_set_name(dev, eir_data.name);
12299 if (eir_data.class != 0)
12300 device_set_class(dev, eir_data.class);
12302 if (eir_data.did_source || eir_data.did_vendor ||
12303 eir_data.did_product || eir_data.did_version)
12304 btd_device_set_pnpid(dev, eir_data.did_source,
12305 eir_data.did_vendor,
12306 eir_data.did_product,
12307 eir_data.did_version);
12309 device_add_eir_uuids(dev, eir_data.services);
12311 if (adapter->discovery_list)
12312 g_slist_foreach(adapter->discovery_list, filter_duplicate_data,
12314 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
12315 if (eir_data.flags != 0)
12316 device_set_remote_feature_flag(dev, eir_data.flags);
12318 if (bdaddr_type == BDADDR_BREDR)
12319 device_set_manufacturer_info(dev, &eir_data);
12321 /* if the application has registered for iBeacon report,
12322 * then send ibeacon report along with advertisement report */
12323 device_set_adv_report_info(dev, (void*)data, data_len, adv_type, rssi);
12327 if (eir_data.msd_list) {
12328 device_set_manufacturer_data(dev, eir_data.msd_list, duplicate);
12329 adapter_msd_notify(adapter, dev, eir_data.msd_list);
12332 if (eir_data.sd_list)
12333 device_set_service_data(dev, eir_data.sd_list, duplicate);
12335 if (eir_data.data_list)
12336 device_set_data(dev, eir_data.data_list, duplicate);
12338 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
12339 if (bdaddr_type != BDADDR_BREDR && adv_type != ADV_TYPE_SCAN_RESPONSE) {
12340 device_set_flags(dev, eir_data.flags);
12341 device_set_le_connectable(dev, adv_type);
12344 if (bdaddr_type != BDADDR_BREDR)
12345 device_set_flags(dev, eir_data.flags);
12348 eir_data_free(&eir_data);
12350 #ifndef TIZEN_FEATURE_BLUEZ_MODIFY
12351 /* After the device is updated, notify the matched Adv monitors */
12352 if (matched_monitors) {
12353 btd_adv_monitor_notify_monitors(adapter->adv_monitor_manager,
12354 dev, rssi, matched_monitors);
12355 queue_destroy(matched_monitors, NULL);
12356 matched_monitors = NULL;
12360 * Only if at least one client has requested discovery, maintain
12361 * list of found devices and name confirming for legacy devices.
12362 * Otherwise, this is an event from passive discovery and we
12363 * should check if the device needs connecting to.
12365 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
12366 if (!adapter->discovery_list && !adapter->le_discovery_list)
12368 if (!adapter->discovery_list)
12372 if (g_slist_find(adapter->discovery_found, dev))
12375 /* If name is unknown but it's not allowed to resolve, don't send
12376 * MGMT_OP_CONFIRM_NAME.
12378 if (confirm && (name_known || device_is_name_resolve_allowed(dev)))
12379 confirm_name(adapter, bdaddr, bdaddr_type, name_known);
12381 adapter->discovery_found = g_slist_prepend(adapter->discovery_found,
12387 #ifndef TIZEN_FEATURE_BLUEZ_MODIFY
12388 /* Ignore non-connectable events */
12389 if (not_connectable)
12394 * If we're in the process of stopping passive scanning and
12395 * connecting another (or maybe even the same) LE device just
12398 if (adapter->connect_le)
12402 * If kernel background scan is used then the kernel is
12403 * responsible for connecting.
12405 if (btd_has_kernel_features(KERNEL_CONN_CONTROL))
12409 * If this is an LE device that's not connected and part of the
12410 * connect_list stop passive scanning so that a connection
12411 * attempt to it can be made
12413 if (bdaddr_type != BDADDR_BREDR && !btd_device_is_connected(dev) &&
12414 g_slist_find(adapter->connect_list, dev)) {
12415 adapter->connect_le = dev;
12416 stop_passive_scanning(adapter);
12420 static void device_found_callback(uint16_t index, uint16_t length,
12421 const void *param, void *user_data)
12423 const struct mgmt_ev_device_found *ev = param;
12424 struct btd_adapter *adapter = user_data;
12425 const uint8_t *eir;
12430 #ifndef TIZEN_FEATURE_BLUEZ_MODIFY
12431 bool not_connectable;
12433 bool name_resolve_failed;
12435 if (length < sizeof(*ev)) {
12436 btd_error(adapter->dev_id,
12437 "Too short device found event (%u bytes)", length);
12441 eir_len = btohs(ev->eir_len);
12442 if (length != sizeof(*ev) + eir_len) {
12443 btd_error(adapter->dev_id,
12444 "Device found event size mismatch (%u != %zu)",
12445 length, sizeof(*ev) + eir_len);
12454 flags = btohl(ev->flags);
12456 ba2str(&ev->addr.bdaddr, addr);
12457 DBG("hci%u addr %s, rssi %d flags 0x%04x eir_len %u",
12458 index, addr, ev->rssi, flags, eir_len);
12460 confirm_name = (flags & MGMT_DEV_FOUND_CONFIRM_NAME);
12461 legacy = (flags & MGMT_DEV_FOUND_LEGACY_PAIRING);
12462 #ifndef TIZEN_FEATURE_BLUEZ_MODIFY
12463 not_connectable = (flags & MGMT_DEV_FOUND_NOT_CONNECTABLE);
12465 name_resolve_failed = (flags & MGMT_DEV_FOUND_NAME_REQUEST_FAILED);
12466 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
12467 btd_adapter_update_found_device(adapter, &ev->addr.bdaddr, ev->addr.type,
12468 ev->rssi, confirm_name, legacy, 0,
12469 name_resolve_failed,
12470 eir, eir_len, false);
12472 btd_adapter_update_found_device(adapter, &ev->addr.bdaddr, ev->addr.type,
12473 ev->rssi, confirm_name, legacy,
12474 not_connectable, name_resolve_failed,
12475 eir, eir_len, false);
12479 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
12480 static void le_device_found_callback(uint16_t index, uint16_t length,
12481 const void *param, void *user_data)
12483 const struct mgmt_ev_le_device_found *ev = param;
12484 struct btd_adapter *adapter = user_data;
12485 const uint8_t *eir;
12491 bool name_resolve_failed;
12493 if (length < sizeof(*ev)) {
12494 error("Too short device found event (%u bytes)", length);
12498 eir_len = btohs(ev->eir_len);
12499 if (length != sizeof(*ev) + eir_len) {
12500 error("Device found event size mismatch (%u != %zu)",
12501 length, sizeof(*ev) + eir_len);
12510 flags = btohl(ev->flags);
12512 ba2str(&ev->addr.bdaddr, addr);
12513 /*DBG("hci%u addr %s, rssi %d flags 0x%04x eir_len %u",
12514 index, addr, ev->rssi, flags, eir_len);*/
12516 confirm_name = (flags & MGMT_DEV_FOUND_CONFIRM_NAME);
12517 legacy = (flags & MGMT_DEV_FOUND_LEGACY_PAIRING);
12519 /*DBG("hci%u addr %s, addr_type %d rssi %d flags 0x%04x eir_len %u confirm_name %d legacy %d, adv_type %02x",
12520 index, addr, ev->addr.type, ev->rssi, flags, eir_len, confirm_name, legacy, ev->adv_type);*/
12521 name_resolve_failed = (flags & MGMT_DEV_FOUND_NAME_REQUEST_FAILED);
12522 btd_adapter_update_found_device(adapter, &ev->addr.bdaddr, ev->addr.type,
12523 ev->rssi, confirm_name, legacy, ev->adv_type,
12524 name_resolve_failed, eir, eir_len, false);
12528 struct agent *adapter_get_agent(struct btd_adapter *adapter)
12530 return agent_get(NULL);
12533 static void adapter_remove_connection(struct btd_adapter *adapter,
12534 struct btd_device *device,
12535 uint8_t bdaddr_type)
12539 if (!g_slist_find(adapter->connections, device)) {
12540 btd_error(adapter->dev_id, "No matching connection for device");
12544 device_remove_connection(device, bdaddr_type);
12546 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
12547 if (device_is_authenticating(device, bdaddr_type))
12549 if (device_is_authenticating(device))
12551 device_cancel_authentication(device, TRUE);
12553 /* If another bearer is still connected */
12554 if (btd_device_is_connected(device))
12557 adapter->connections = g_slist_remove(adapter->connections, device);
12558 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
12559 DBG("isPaired %d, isBonded %d", device_is_paired(device, bdaddr_type),
12560 device_is_bonded(device, bdaddr_type));
12561 if ((device_is_temporary(device) && !device_is_retrying(device)) ||
12562 (!device_is_bonded(device, bdaddr_type))) {
12564 const char *path = device_get_path(device);
12566 DBG("Removing temporary device %s", path);
12568 /* device_is_paired is added incase of tempoary bonded
12569 * oop file transfer in that device is not bonded it's paired.
12571 if (!(device_is_bonded(device, bdaddr_type) ||
12572 device_is_paired(device, bdaddr_type))) {
12573 DBG("addr type %d, bonded", bdaddr_type);
12577 btd_adapter_unpair_device(adapter, device);
12582 static void adapter_stop(struct btd_adapter *adapter)
12584 /* check pending requests */
12585 reply_pending_requests(adapter);
12587 cancel_passive_scanning(adapter);
12589 remove_discovery_list(adapter);
12591 discovery_cleanup(adapter, 0);
12593 adapter->filtered_discovery = false;
12594 adapter->no_scan_restart_delay = false;
12595 g_free(adapter->current_discovery_filter);
12596 adapter->current_discovery_filter = NULL;
12598 set_discovery_discoverable(adapter, false);
12599 adapter->discovering = false;
12601 while (adapter->connections) {
12602 struct btd_device *device = adapter->connections->data;
12603 uint8_t addr_type = btd_device_get_bdaddr_type(device);
12605 adapter_remove_connection(adapter, device, BDADDR_BREDR);
12606 if (addr_type != BDADDR_BREDR)
12607 adapter_remove_connection(adapter, device, addr_type);
12610 g_dbus_emit_property_changed(dbus_conn, adapter->path,
12611 ADAPTER_INTERFACE, "Discovering");
12612 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
12613 g_dbus_emit_property_changed(dbus_conn, adapter->path,
12614 ADAPTER_INTERFACE, "LEDiscovering");
12617 if (adapter->dev_class) {
12618 /* the kernel should reset the class of device when powering
12619 * down, but it does not. So force it here ... */
12620 adapter->dev_class = 0;
12621 g_dbus_emit_property_changed(dbus_conn, adapter->path,
12622 ADAPTER_INTERFACE, "Class");
12625 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
12626 advertiser_cleanup(adapter);
12628 g_dbus_emit_property_changed(dbus_conn, adapter->path,
12629 ADAPTER_INTERFACE, "Powered");
12631 DBG("adapter %s has been disabled", adapter->path);
12634 int btd_register_adapter_driver(struct btd_adapter_driver *driver)
12636 adapter_drivers = g_slist_append(adapter_drivers, driver);
12638 if (driver->probe == NULL)
12641 adapter_foreach(probe_driver, driver);
12646 static void unload_driver(struct btd_adapter *adapter, gpointer data)
12648 struct btd_adapter_driver *driver = data;
12650 if (driver->remove)
12651 driver->remove(adapter);
12653 adapter->drivers = g_slist_remove(adapter->drivers, data);
12656 void btd_unregister_adapter_driver(struct btd_adapter_driver *driver)
12658 adapter_drivers = g_slist_remove(adapter_drivers, driver);
12660 adapter_foreach(unload_driver, driver);
12663 static void agent_auth_cb(struct agent *agent, DBusError *derr,
12666 struct btd_adapter *adapter = user_data;
12667 struct service_auth *auth = g_queue_pop_head(adapter->auths);
12670 DBG("No pending authorization");
12674 auth->cb(derr, auth->user_data);
12677 agent_unref(auth->agent);
12681 /* Stop processing if queue is empty */
12682 if (g_queue_is_empty(adapter->auths)) {
12683 if (adapter->auth_idle_id > 0)
12684 g_source_remove(adapter->auth_idle_id);
12688 if (adapter->auth_idle_id > 0)
12691 adapter->auth_idle_id = g_idle_add(process_auth_queue, adapter);
12694 static gboolean process_auth_queue(gpointer user_data)
12696 struct btd_adapter *adapter = user_data;
12699 adapter->auth_idle_id = 0;
12701 dbus_error_init(&err);
12702 dbus_set_error_const(&err, ERROR_INTERFACE ".Rejected", NULL);
12704 while (!g_queue_is_empty(adapter->auths)) {
12705 struct service_auth *auth = adapter->auths->head->data;
12706 struct btd_device *device = auth->device;
12708 /* Wait services to be resolved before asking authorization */
12709 if (auth->svc_id > 0) {
12710 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
12711 DBG("Wait services to be resolved before asking authorization");
12715 if (!btd_adapter_is_uuid_allowed(adapter, auth->uuid)) {
12716 auth->cb(&err, auth->user_data);
12720 #ifndef TIZEN_FEATURE_BLUEZ_MODIFY
12721 if (device_is_trusted(device) == TRUE) {
12723 if (device_is_trusted(device) == TRUE
12724 || device_is_profile_trusted(device, auth->uuid)
12725 || btd_opts.pin_code) {
12726 /* In headless device(pin_code is existing),
12727 no need to request to agent */
12729 auth->cb(NULL, auth->user_data);
12733 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
12734 /* If Profile is Blocked, Simply reject Authorization*/
12735 if (device_is_profile_blocked(device, auth->uuid) == TRUE) {
12736 auth->cb(&err, auth->user_data);
12741 /* If agent is set authorization is already ongoing */
12745 auth->agent = agent_get(NULL);
12746 if (auth->agent == NULL) {
12747 btd_warn(adapter->dev_id,
12748 "Authentication attempt without agent");
12749 auth->cb(&err, auth->user_data);
12753 if (agent_authorize_service(auth->agent, device, auth->uuid,
12754 agent_auth_cb, adapter, NULL) < 0) {
12755 auth->cb(&err, auth->user_data);
12763 agent_unref(auth->agent);
12767 g_queue_pop_head(adapter->auths);
12770 dbus_error_free(&err);
12775 static void svc_complete(struct btd_device *dev, int err, void *user_data)
12777 struct service_auth *auth = user_data;
12778 struct btd_adapter *adapter = auth->adapter;
12782 if (adapter->auth_idle_id != 0)
12785 adapter->auth_idle_id = g_idle_add(process_auth_queue, adapter);
12788 static int adapter_authorize(struct btd_adapter *adapter, const bdaddr_t *dst,
12790 adapter_authorize_type check_for_connection,
12791 service_auth_cb cb, void *user_data)
12793 struct service_auth *auth;
12794 struct btd_device *device;
12795 static guint id = 0;
12797 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
12798 if (!strncmp(uuid, L2CAP_LE_UUID_SUBSTR, strlen(L2CAP_LE_UUID_SUBSTR)))
12799 device = btd_adapter_find_device(adapter, dst, BDADDR_LE_PUBLIC);
12801 device = btd_adapter_find_device(adapter, dst, BDADDR_BREDR);
12803 device = btd_adapter_find_device(adapter, dst, BDADDR_BREDR);
12809 if (device_is_disconnecting(device)) {
12810 DBG("Authorization request while disconnecting");
12814 /* Device connected? */
12815 if (check_for_connection && !g_slist_find(adapter->connections, device))
12816 btd_error(adapter->dev_id,
12817 "Authorization request for non-connected device!?");
12819 auth = g_try_new0(struct service_auth, 1);
12824 auth->user_data = user_data;
12826 auth->device = device;
12827 auth->adapter = adapter;
12829 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
12830 if (check_for_connection &&
12831 strncmp(uuid, L2CAP_LE_UUID_SUBSTR, strlen(L2CAP_LE_UUID_SUBSTR)))
12833 if (check_for_connection)
12835 auth->svc_id = device_wait_for_svc_complete(device, svc_complete, auth);
12837 if (adapter->auth_idle_id == 0)
12838 adapter->auth_idle_id = g_idle_add(process_auth_queue, adapter);
12841 g_queue_push_tail(adapter->auths, auth);
12846 guint btd_request_authorization(const bdaddr_t *src, const bdaddr_t *dst,
12847 const char *uuid, service_auth_cb cb,
12850 struct btd_adapter *adapter;
12853 if (bacmp(src, BDADDR_ANY) != 0) {
12854 adapter = adapter_find(src);
12858 return adapter_authorize(adapter, dst, uuid,
12859 ADAPTER_AUTHORIZE_CHECK_CONNECTED, cb, user_data);
12862 for (l = adapters; l != NULL; l = g_slist_next(l)) {
12867 id = adapter_authorize(adapter, dst, uuid,
12868 ADAPTER_AUTHORIZE_CHECK_CONNECTED, cb, user_data);
12876 guint btd_request_authorization_cable_configured(const bdaddr_t *src, const bdaddr_t *dst,
12877 const char *uuid, service_auth_cb cb,
12880 struct btd_adapter *adapter;
12882 if (bacmp(src, BDADDR_ANY) == 0)
12885 adapter = adapter_find(src);
12889 return adapter_authorize(adapter, dst, uuid,
12890 ADAPTER_AUTHORIZE_DISCONNECTED, cb, user_data);
12893 static struct service_auth *find_authorization(guint id)
12898 for (l = adapters; l != NULL; l = g_slist_next(l)) {
12899 struct btd_adapter *adapter = l->data;
12901 for (l2 = adapter->auths->head; l2 != NULL; l2 = l2->next) {
12902 struct service_auth *auth = l2->data;
12904 if (auth->id == id)
12912 int btd_cancel_authorization(guint id)
12914 struct service_auth *auth;
12916 auth = find_authorization(id);
12920 if (auth->svc_id > 0)
12921 device_remove_svc_complete_callback(auth->device,
12924 g_queue_remove(auth->adapter->auths, auth);
12927 agent_cancel(auth->agent);
12928 agent_unref(auth->agent);
12936 int btd_adapter_restore_powered(struct btd_adapter *adapter)
12938 if (btd_adapter_get_powered(adapter))
12941 set_mode(adapter, MGMT_OP_SET_POWERED, 0x01);
12946 void btd_adapter_register_pin_cb(struct btd_adapter *adapter,
12947 btd_adapter_pin_cb_t cb)
12949 adapter->pin_callbacks = g_slist_prepend(adapter->pin_callbacks, cb);
12952 void btd_adapter_unregister_pin_cb(struct btd_adapter *adapter,
12953 btd_adapter_pin_cb_t cb)
12955 adapter->pin_callbacks = g_slist_remove(adapter->pin_callbacks, cb);
12958 void btd_adapter_unregister_msd_cb(struct btd_adapter *adapter,
12961 adapter->msd_callbacks = g_slist_remove(adapter->msd_callbacks, cb);
12964 void btd_adapter_register_msd_cb(struct btd_adapter *adapter,
12967 adapter->msd_callbacks = g_slist_prepend(adapter->msd_callbacks, cb);
12970 int btd_adapter_set_fast_connectable(struct btd_adapter *adapter,
12973 if (!btd_adapter_get_powered(adapter))
12976 set_mode(adapter, MGMT_OP_SET_FAST_CONNECTABLE, enable ? 0x01 : 0x00);
12981 int btd_adapter_read_clock(struct btd_adapter *adapter, const bdaddr_t *bdaddr,
12982 int which, int timeout, uint32_t *clock,
12983 uint16_t *accuracy)
12985 if (!btd_adapter_get_powered(adapter))
12991 int btd_adapter_remove_bonding(struct btd_adapter *adapter,
12992 const bdaddr_t *bdaddr, uint8_t bdaddr_type)
12994 struct mgmt_cp_unpair_device cp;
12996 memset(&cp, 0, sizeof(cp));
12997 bacpy(&cp.addr.bdaddr, bdaddr);
12998 cp.addr.type = bdaddr_type;
13001 if (mgmt_send(adapter->mgmt, MGMT_OP_UNPAIR_DEVICE,
13002 adapter->dev_id, sizeof(cp), &cp,
13003 NULL, NULL, NULL) > 0)
13009 static void pincode_reply_complete(uint8_t status, uint16_t length,
13010 const void *param, void *user_data)
13012 struct btd_device *device = user_data;
13014 /* If the MGMT_OP_PIN_CODE_REPLY command is acknowledged, move the
13015 * starting time to that point. This give a better sense of time
13016 * evaluating the pincode. */
13017 device_bonding_restart_timer(device);
13020 int btd_adapter_pincode_reply(struct btd_adapter *adapter,
13021 const bdaddr_t *bdaddr,
13022 const char *pin, size_t pin_len)
13024 struct btd_device *device;
13028 ba2str(bdaddr, addr);
13029 DBG("hci%u addr %s pinlen %zu", adapter->dev_id, addr, pin_len);
13032 struct mgmt_cp_pin_code_neg_reply cp;
13034 memset(&cp, 0, sizeof(cp));
13035 bacpy(&cp.addr.bdaddr, bdaddr);
13036 cp.addr.type = BDADDR_BREDR;
13038 id = mgmt_reply(adapter->mgmt, MGMT_OP_PIN_CODE_NEG_REPLY,
13039 adapter->dev_id, sizeof(cp), &cp,
13042 struct mgmt_cp_pin_code_reply cp;
13047 memset(&cp, 0, sizeof(cp));
13048 bacpy(&cp.addr.bdaddr, bdaddr);
13049 cp.addr.type = BDADDR_BREDR;
13050 cp.pin_len = pin_len;
13051 memcpy(cp.pin_code, pin, pin_len);
13053 /* Since a pincode was requested, update the starting time to
13054 * the point where the pincode is provided. */
13055 device = btd_adapter_find_device(adapter, bdaddr, BDADDR_BREDR);
13056 device_bonding_restart_timer(device);
13058 id = mgmt_reply(adapter->mgmt, MGMT_OP_PIN_CODE_REPLY,
13059 adapter->dev_id, sizeof(cp), &cp,
13060 pincode_reply_complete, device, NULL);
13069 int btd_adapter_confirm_reply(struct btd_adapter *adapter,
13070 const bdaddr_t *bdaddr, uint8_t bdaddr_type,
13073 struct mgmt_cp_user_confirm_reply cp;
13077 ba2str(bdaddr, addr);
13078 DBG("hci%u addr %s success %d", adapter->dev_id, addr, success);
13081 opcode = MGMT_OP_USER_CONFIRM_REPLY;
13083 opcode = MGMT_OP_USER_CONFIRM_NEG_REPLY;
13085 memset(&cp, 0, sizeof(cp));
13086 bacpy(&cp.addr.bdaddr, bdaddr);
13087 cp.addr.type = bdaddr_type;
13089 if (mgmt_reply(adapter->mgmt, opcode, adapter->dev_id, sizeof(cp), &cp,
13090 NULL, NULL, NULL) > 0)
13096 static void user_confirm_request_callback(uint16_t index, uint16_t length,
13097 const void *param, void *user_data)
13099 const struct mgmt_ev_user_confirm_request *ev = param;
13100 struct btd_adapter *adapter = user_data;
13101 struct btd_device *device;
13105 if (length < sizeof(*ev)) {
13106 btd_error(adapter->dev_id,
13107 "Too small user confirm request event");
13111 ba2str(&ev->addr.bdaddr, addr);
13112 DBG("hci%u %s confirm_hint %u", adapter->dev_id, addr,
13114 device = btd_adapter_get_device(adapter, &ev->addr.bdaddr,
13117 btd_error(adapter->dev_id,
13118 "Unable to get device object for %s", addr);
13122 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
13123 device_set_auth_addr_type(device, ev->addr.type);
13125 err = device_confirm_passkey(device, ev->addr.type, btohl(ev->value),
13128 btd_error(adapter->dev_id,
13129 "device_confirm_passkey: %s", strerror(-err));
13130 btd_adapter_confirm_reply(adapter, &ev->addr.bdaddr,
13131 ev->addr.type, FALSE);
13135 int btd_adapter_passkey_reply(struct btd_adapter *adapter,
13136 const bdaddr_t *bdaddr, uint8_t bdaddr_type,
13142 ba2str(bdaddr, addr);
13143 DBG("hci%u addr %s passkey %06u", adapter->dev_id, addr, passkey);
13145 if (passkey == INVALID_PASSKEY) {
13146 struct mgmt_cp_user_passkey_neg_reply cp;
13148 memset(&cp, 0, sizeof(cp));
13149 bacpy(&cp.addr.bdaddr, bdaddr);
13150 cp.addr.type = bdaddr_type;
13152 id = mgmt_reply(adapter->mgmt, MGMT_OP_USER_PASSKEY_NEG_REPLY,
13153 adapter->dev_id, sizeof(cp), &cp,
13156 struct mgmt_cp_user_passkey_reply cp;
13158 memset(&cp, 0, sizeof(cp));
13159 bacpy(&cp.addr.bdaddr, bdaddr);
13160 cp.addr.type = bdaddr_type;
13161 cp.passkey = htobl(passkey);
13163 id = mgmt_reply(adapter->mgmt, MGMT_OP_USER_PASSKEY_REPLY,
13164 adapter->dev_id, sizeof(cp), &cp,
13174 static void user_passkey_request_callback(uint16_t index, uint16_t length,
13175 const void *param, void *user_data)
13177 const struct mgmt_ev_user_passkey_request *ev = param;
13178 struct btd_adapter *adapter = user_data;
13179 struct btd_device *device;
13183 if (length < sizeof(*ev)) {
13184 btd_error(adapter->dev_id, "Too small passkey request event");
13188 ba2str(&ev->addr.bdaddr, addr);
13189 DBG("hci%u %s", index, addr);
13191 device = btd_adapter_get_device(adapter, &ev->addr.bdaddr,
13194 btd_error(adapter->dev_id,
13195 "Unable to get device object for %s", addr);
13199 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
13200 device_set_auth_addr_type(device, ev->addr.type);
13202 err = device_request_passkey(device, ev->addr.type);
13204 btd_error(adapter->dev_id,
13205 "device_request_passkey: %s", strerror(-err));
13206 btd_adapter_passkey_reply(adapter, &ev->addr.bdaddr,
13207 ev->addr.type, INVALID_PASSKEY);
13211 static void user_passkey_notify_callback(uint16_t index, uint16_t length,
13212 const void *param, void *user_data)
13214 const struct mgmt_ev_passkey_notify *ev = param;
13215 struct btd_adapter *adapter = user_data;
13216 struct btd_device *device;
13221 if (length < sizeof(*ev)) {
13222 btd_error(adapter->dev_id, "Too small passkey notify event");
13226 ba2str(&ev->addr.bdaddr, addr);
13227 DBG("hci%u %s", index, addr);
13229 device = btd_adapter_get_device(adapter, &ev->addr.bdaddr,
13232 btd_error(adapter->dev_id,
13233 "Unable to get device object for %s", addr);
13237 passkey = get_le32(&ev->passkey);
13239 DBG("passkey %06u entered %u", passkey, ev->entered);
13241 err = device_notify_passkey(device, ev->addr.type, passkey,
13244 btd_error(adapter->dev_id,
13245 "device_notify_passkey: %s", strerror(-err));
13248 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
13249 static void rssi_alert_callback(uint16_t index, uint16_t length,
13250 const void *param, void *user_data)
13252 const struct mgmt_ev_vendor_specific_rssi_alert *ev = param;
13253 struct btd_adapter *adapter = user_data;
13255 char *bt_addr = NULL;
13256 int link_type = -1;
13257 int alert_type = -1;
13260 if (length < sizeof(*ev)) {
13261 error("Too small rssi alert event");
13265 ba2str(&ev->bdaddr, addr);
13266 DBG("hci%u %s %d", index, addr, ev->link_type);
13267 DBG("RSSI Alert Params [%d %d]", ev->alert_type, ev->rssi_dbm);
13269 bt_addr = (char *)&addr;
13270 link_type = ev->link_type;
13271 alert_type = ev->alert_type;
13272 rssi_dbm = ev->rssi_dbm;
13273 g_dbus_emit_signal(dbus_conn, adapter->path,
13274 ADAPTER_INTERFACE, "RssiAlert",
13275 DBUS_TYPE_STRING, &bt_addr,
13276 DBUS_TYPE_INT32, &link_type,
13277 DBUS_TYPE_INT32, &alert_type,
13278 DBUS_TYPE_INT32, &rssi_dbm,
13279 DBUS_TYPE_INVALID);
13282 static void get_raw_rssi_callback(uint16_t index, uint16_t length,
13283 const void *param, void *user_data)
13285 const struct mgmt_cc_rp_get_raw_rssi *ev = param;
13286 struct btd_adapter *adapter = user_data;
13288 char *bt_addr = NULL;
13289 int link_type = -1;
13292 if (length < sizeof(*ev)) {
13293 error("Too small raw RSSI event");
13297 ba2str(&ev->bt_address, addr);
13298 DBG("hci%u %s", index, addr);
13299 DBG("Raw RSSI Params [%d %d]", ev->link_type, ev->rssi_dbm);
13301 bt_addr = (char *)&addr;
13302 link_type = ev->link_type;
13303 rssi_dbm = ev->rssi_dbm;
13305 g_dbus_emit_signal(dbus_conn, adapter->path,
13306 ADAPTER_INTERFACE, "RawRssi",
13307 DBUS_TYPE_STRING, &bt_addr,
13308 DBUS_TYPE_INT32, &link_type,
13309 DBUS_TYPE_INT32, &rssi_dbm,
13310 DBUS_TYPE_INVALID);
13313 static void rssi_enabled_callback(uint16_t index, uint16_t length,
13314 const void *param, void *user_data)
13316 const struct mgmt_cc_rsp_enable_rssi *ev = param;
13317 struct btd_adapter *adapter = user_data;
13319 char *bt_addr = NULL;
13320 int enabled = TRUE;
13321 int link_type = -1;
13323 if (length < sizeof(*ev)) {
13324 error("Too small rssi enabled event");
13328 ba2str(&ev->bt_address, addr);
13329 DBG("hci%u %s %d", index, addr, ev->link_type);
13330 DBG("RSSI Enabled [%d %d]", ev->le_ext_opcode, ev->status);
13332 bt_addr = (char *)&addr;
13333 link_type = ev->link_type;
13335 g_dbus_emit_signal(dbus_conn, adapter->path,
13336 ADAPTER_INTERFACE, "RssiEnabled",
13337 DBUS_TYPE_STRING, &bt_addr,
13338 DBUS_TYPE_INT32, &link_type,
13339 DBUS_TYPE_BOOLEAN, &enabled,
13340 DBUS_TYPE_INVALID);
13343 static void rssi_disabled_callback(uint16_t index, uint16_t length,
13344 const void *param, void *user_data)
13346 const struct mgmt_cc_rp_disable_rssi *ev = param;
13347 struct btd_adapter *adapter = user_data;
13349 char *bt_addr = NULL;
13350 int disabled = FALSE;
13351 int link_type = -1;
13353 if (length < sizeof(*ev)) {
13354 error("Too small RSSI disabled event");
13358 ba2str(&ev->bt_address, addr);
13359 DBG("hci%u %s %d", index, addr, ev->link_type);
13360 DBG("RSSI Disabled Params [%d %d]", ev->le_ext_opcode, ev->status);
13362 bt_addr = (char *)&addr;
13363 link_type = ev->link_type;
13365 g_dbus_emit_signal(dbus_conn, adapter->path,
13366 ADAPTER_INTERFACE, "RssiEnabled",
13367 DBUS_TYPE_STRING, &bt_addr,
13368 DBUS_TYPE_INT32, &link_type,
13369 DBUS_TYPE_BOOLEAN, &disabled,
13370 DBUS_TYPE_INVALID);
13373 void adapter_check_version(struct btd_adapter *adapter, uint8_t hci_ver)
13379 ver = "Bluetooth 1.0b";
13382 ver = "Bluetooth 1.1";
13385 ver = "Bluetooth 1.2";
13388 ver = "Bluetooth 2.0 + EDR";
13391 ver = "Bluetooth 2.1 + EDR";
13394 ver = "Bluetooth 3.0 + HS";
13397 ver = "Bluetooth 4.0";
13400 ver = "Bluetooth 4.1";
13407 if (adapter->version)
13408 g_free(adapter->version);
13410 adapter->version = g_strdup(ver);
13413 static void hardware_error_callback(uint16_t index, uint16_t length,
13414 const void *param, void *user_data)
13416 const struct mgmt_ev_hardware_error *ev = param;
13417 struct btd_adapter *adapter = user_data;
13419 if (length < sizeof(*ev)) {
13420 error("Too small Hardware error event");
13424 error("Hardware error occurred : %d", ev->error_code);
13425 g_dbus_emit_signal(dbus_conn, adapter->path,
13426 ADAPTER_INTERFACE, "HardwareError",
13427 DBUS_TYPE_INVALID);
13430 static void tx_timeout_error_callback(uint16_t index, uint16_t length,
13431 const void *param, void *user_data)
13433 struct btd_adapter *adapter = user_data;
13435 error("Tx Timeout error occurred");
13436 g_dbus_emit_signal(dbus_conn, adapter->path,
13437 ADAPTER_INTERFACE, "TxTimeoutError",
13438 DBUS_TYPE_INVALID);
13441 static void device_name_update_callback(uint16_t index, uint16_t length,
13442 const void *param, void *user_data)
13444 const struct mgmt_ev_device_name_update *ev = param;
13445 struct btd_adapter *adapter = user_data;
13446 struct btd_device *device;
13448 const uint8_t *eir_name;
13449 struct eir_data eir_data;
13451 if (length < sizeof(*ev)) {
13452 error("Name update error event");
13456 ba2str(&ev->addr.bdaddr, addr);
13457 DBG("hci%u %s", index, addr);
13459 device = btd_adapter_get_device(adapter, &ev->addr.bdaddr,
13462 error("Unable to get device object for %s", addr);
13466 if (ev->eir_len == 0)
13469 eir_name = ev->eir;
13471 memset(&eir_data, 0, sizeof(eir_data));
13472 eir_parse(&eir_data, eir_name, ev->eir_len);
13475 btd_device_device_set_name(device, eir_data.name);
13477 eir_data_free(&eir_data);
13480 struct multi_adv_data {
13481 struct btd_adapter *adapter;
13485 static gboolean multi_adv_start_timeout_cb(gpointer user_data)
13487 struct multi_adv_data *data = user_data;
13488 struct btd_adapter *adapter = data->adapter;
13491 adapter->adv_restart_timeout = 0;
13493 err = adapter_le_enable_multi_adv(adapter, TRUE, data->slot_id);
13495 advertising_state_changed(adapter, data->slot_id, FALSE);
13501 static void multi_adv_state_change_callback(uint16_t index, uint16_t length,
13502 const void *param, void *user_data)
13504 const struct mgmt_ev_vendor_specific_multi_adv_state_changed *ev = param;
13505 struct btd_adapter *adapter = user_data;
13506 struct multi_adv_data *data;
13508 if (length < sizeof(*ev)) {
13509 error("Too small adv state change event");
13513 DBG("adv id %d, state change reason %d, connection_handle %x",
13514 ev->adv_instance, ev->state_change_reason, ev->connection_handle);
13516 if ((ev->adv_instance > 0 && ev->adv_instance < adapter_le_get_max_adv_instance()) &&
13517 ev->state_change_reason == 0) {
13518 /* advertising is stopped by controller, it should be enabled again.
13519 * If fails, state should be changed to FALSE */
13520 data = g_new0(struct multi_adv_data, 1);
13521 data->adapter = adapter;
13522 data->slot_id = ev->adv_instance;
13524 adapter->adv_restart_timeout =
13525 g_timeout_add(300, multi_adv_start_timeout_cb, data);
13529 static void le_conn_update_completed_callback(uint16_t index, uint16_t length,
13530 const void *param, void *user_data)
13532 const struct mgmt_ev_conn_updated *ev = param;
13533 struct btd_adapter *adapter = user_data;
13534 struct btd_device *device;
13536 GSList *list = NULL;
13538 if (length < sizeof(*ev)) {
13539 error("Too small le conn update completed event");
13543 ba2str(&ev->addr.bdaddr, addr);
13544 if (ev->addr.type == BDADDR_LE_PUBLIC) {
13545 /* Private Random Address */
13546 list = g_slist_find_custom(adapter->devices, addr,
13547 device_rpa_ida_cmp);
13550 list = g_slist_find_custom(adapter->devices, addr,
13551 device_address_cmp);
13552 } else if (ev->addr.type == BDADDR_LE_RANDOM) {
13553 /* LE Static Random address */
13554 list = g_slist_find_custom(adapter->devices, addr,
13555 device_address_cmp);
13559 device = list->data;
13560 device_print_addr(device);
13562 if (device_get_conn_update_state(device))
13563 device_set_conn_update_state(device, false);
13567 static void bt_6lowpan_conn_state_change_callback(uint16_t index, uint16_t length,
13568 const void *param, void *user_data)
13570 const struct mgmt_ev_6lowpan_conn_state_changed *ev = param;
13571 struct btd_adapter *adapter = user_data;
13572 struct btd_device *device;
13574 gboolean connected = 0;
13576 if (length < sizeof(*ev)) {
13577 btd_error(adapter->dev_id,
13578 "Too small device connected event");
13582 ba2str(&ev->addr.bdaddr, addr);
13584 DBG("hci%u device %s", index, addr);
13586 device = btd_adapter_find_device(adapter, &ev->addr.bdaddr,
13589 btd_error(adapter->dev_id,
13590 "Unable to get device object for %s", addr);
13599 device_set_ipsp_connected(device, connected, ev->ifname);
13602 static void bt_le_data_length_changed_callback(uint16_t index, uint16_t length,
13603 const void *param, void *user_data)
13605 const struct mgmt_ev_le_data_length_changed *ev = param;
13606 struct btd_adapter *adapter = user_data;
13607 struct btd_device *device;
13610 if (length < sizeof(*ev)) {
13611 btd_error(adapter->dev_id,
13612 "Too small data length changed event");
13616 ba2str(&ev->addr.bdaddr, addr);
13618 DBG("hci%u device %s", index, addr);
13620 device = btd_adapter_find_device(adapter, &ev->addr.bdaddr,
13623 btd_error(adapter->dev_id,
13624 "Unable to get device object for %s", addr);
13628 device_le_data_length_changed(device, ev->max_tx_octets, ev->max_tx_time,
13629 ev->max_rx_octets, ev->max_rx_time);
13634 struct btd_adapter_pin_cb_iter *btd_adapter_pin_cb_iter_new(
13635 struct btd_adapter *adapter)
13637 struct btd_adapter_pin_cb_iter *iter =
13638 g_new0(struct btd_adapter_pin_cb_iter, 1);
13640 iter->it = adapter->pin_callbacks;
13646 void btd_adapter_pin_cb_iter_free(struct btd_adapter_pin_cb_iter *iter)
13651 bool btd_adapter_pin_cb_iter_end(struct btd_adapter_pin_cb_iter *iter)
13653 return iter->it == NULL && iter->attempt == 0;
13656 static ssize_t btd_adapter_pin_cb_iter_next(
13657 struct btd_adapter_pin_cb_iter *iter,
13658 struct btd_adapter *adapter,
13659 struct btd_device *device,
13660 char *pin_buf, bool *display)
13662 btd_adapter_pin_cb_t cb;
13665 while (iter->it != NULL) {
13666 cb = iter->it->data;
13667 ret = cb(adapter, device, pin_buf, display, iter->attempt);
13672 iter->it = g_slist_next(iter->it);
13679 static void pin_code_request_callback(uint16_t index, uint16_t length,
13680 const void *param, void *user_data)
13682 const struct mgmt_ev_pin_code_request *ev = param;
13683 struct btd_adapter *adapter = user_data;
13684 struct btd_device *device;
13685 bool display = false;
13690 struct btd_adapter_pin_cb_iter *iter;
13692 if (length < sizeof(*ev)) {
13693 btd_error(adapter->dev_id, "Too small PIN code request event");
13697 ba2str(&ev->addr.bdaddr, addr);
13699 DBG("hci%u %s", adapter->dev_id, addr);
13701 device = btd_adapter_get_device(adapter, &ev->addr.bdaddr,
13704 btd_error(adapter->dev_id,
13705 "Unable to get device object for %s", addr);
13709 /* Flag the request of a pincode to allow a bonding retry. */
13710 adapter->pincode_requested = true;
13711 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
13712 btd_device_set_legacy_pairing(device, true);
13715 memset(pin, 0, sizeof(pin));
13717 iter = device_bonding_iter(device);
13721 pinlen = btd_adapter_pin_cb_iter_next(iter, adapter, device,
13724 if (pinlen > 0 && (!ev->secure || pinlen == 16)) {
13725 if (display && device_is_bonding(device, NULL)) {
13726 err = device_notify_pincode(device, ev->secure, pin);
13728 btd_error(adapter->dev_id,
13729 "device_notify_pin: %s",
13731 btd_adapter_pincode_reply(adapter,
13736 btd_adapter_pincode_reply(adapter, &ev->addr.bdaddr,
13742 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
13743 if (btd_opts.pin_code) {
13744 /* Because we can't receive user input on headless device,
13745 no need to request pincode. Use the 'PinCode' in headless conf file */
13746 DBG("Use configured PinCode in headless device");
13747 btd_adapter_pincode_reply(adapter, &ev->addr.bdaddr,
13748 btd_opts.pin_code, strlen(btd_opts.pin_code));
13753 err = device_request_pincode(device, ev->secure);
13755 btd_error(adapter->dev_id, "device_request_pin: %s",
13757 btd_adapter_pincode_reply(adapter, &ev->addr.bdaddr, NULL, 0);
13761 int adapter_cancel_bonding(struct btd_adapter *adapter, const bdaddr_t *bdaddr,
13764 struct mgmt_addr_info cp;
13767 ba2str(bdaddr, addr);
13768 DBG("hci%u bdaddr %s type %u", adapter->dev_id, addr, addr_type);
13770 memset(&cp, 0, sizeof(cp));
13771 bacpy(&cp.bdaddr, bdaddr);
13772 cp.type = addr_type;
13774 if (mgmt_reply(adapter->mgmt, MGMT_OP_CANCEL_PAIR_DEVICE,
13775 adapter->dev_id, sizeof(cp), &cp,
13776 NULL, NULL, NULL) > 0)
13782 static void check_oob_bonding_complete(struct btd_adapter *adapter,
13783 const bdaddr_t *bdaddr, uint8_t status)
13785 if (!adapter->oob_handler || !adapter->oob_handler->bonding_cb)
13788 if (bacmp(bdaddr, &adapter->oob_handler->remote_addr) != 0)
13791 adapter->oob_handler->bonding_cb(adapter, bdaddr, status,
13792 adapter->oob_handler->user_data);
13794 g_free(adapter->oob_handler);
13795 adapter->oob_handler = NULL;
13798 static void bonding_complete(struct btd_adapter *adapter,
13799 const bdaddr_t *bdaddr,
13800 uint8_t addr_type, uint8_t status)
13802 struct btd_device *device;
13805 device = btd_adapter_get_device(adapter, bdaddr, addr_type);
13807 device = btd_adapter_find_device(adapter, bdaddr, addr_type);
13809 if (device != NULL)
13810 device_bonding_complete(device, addr_type, status);
13812 #ifndef TIZEN_FEATURE_BLUEZ_MODIFY
13813 resume_discovery(adapter);
13815 check_oob_bonding_complete(adapter, bdaddr, status);
13818 /* bonding_attempt_complete() handles the end of a "bonding attempt" checking if
13819 * it should begin a new attempt or complete the bonding.
13821 static void bonding_attempt_complete(struct btd_adapter *adapter,
13822 const bdaddr_t *bdaddr,
13823 uint8_t addr_type, uint8_t status)
13825 struct btd_device *device;
13828 ba2str(bdaddr, addr);
13829 DBG("hci%u bdaddr %s type %u status 0x%x", adapter->dev_id, addr,
13830 addr_type, status);
13833 device = btd_adapter_get_device(adapter, bdaddr, addr_type);
13835 device = btd_adapter_find_device(adapter, bdaddr, addr_type);
13837 if (status == MGMT_STATUS_AUTH_FAILED && adapter->pincode_requested) {
13838 /* On faliure, issue a bonding_retry if possible. */
13839 if (device != NULL) {
13840 if (device_bonding_attempt_retry(device) == 0)
13845 /* Ignore disconnects during retry. */
13846 if (status == MGMT_STATUS_DISCONNECTED &&
13847 device && device_is_retrying(device))
13850 /* In any other case, finish the bonding. */
13851 bonding_complete(adapter, bdaddr, addr_type, status);
13854 struct pair_device_data {
13855 struct btd_adapter *adapter;
13860 static void free_pair_device_data(void *user_data)
13862 struct pair_device_data *data = user_data;
13867 static bool pair_device_timeout(gpointer user_data)
13869 struct pair_device_data *data = user_data;
13870 struct btd_adapter *adapter = data->adapter;
13872 btd_error(adapter->dev_id, "Pair device timed out for hci%u",
13875 adapter->pair_device_timeout = 0;
13877 adapter_cancel_bonding(adapter, &data->bdaddr, data->addr_type);
13882 static void pair_device_complete(uint8_t status, uint16_t length,
13883 const void *param, void *user_data)
13885 const struct mgmt_rp_pair_device *rp = param;
13886 struct pair_device_data *data = user_data;
13887 struct btd_adapter *adapter = data->adapter;
13889 DBG("%s (0x%02x)", mgmt_errstr(status), status);
13891 adapter->pair_device_id = 0;
13893 if (adapter->pair_device_timeout > 0) {
13894 timeout_remove(adapter->pair_device_timeout);
13895 adapter->pair_device_timeout = 0;
13898 /* Workaround for a kernel bug
13900 * Broken kernels may reply to device pairing command with command
13901 * status instead of command complete event e.g. if adapter was not
13904 if (status != MGMT_STATUS_SUCCESS && length < sizeof(*rp)) {
13905 btd_error(adapter->dev_id, "Pair device failed: %s (0x%02x)",
13906 mgmt_errstr(status), status);
13908 bonding_attempt_complete(adapter, &data->bdaddr,
13909 data->addr_type, status);
13913 if (length < sizeof(*rp)) {
13914 btd_error(adapter->dev_id, "Too small pair device response");
13918 bonding_attempt_complete(adapter, &rp->addr.bdaddr, rp->addr.type,
13922 int adapter_create_bonding(struct btd_adapter *adapter, const bdaddr_t *bdaddr,
13923 uint8_t addr_type, uint8_t io_cap)
13925 if (adapter->pair_device_id > 0) {
13926 btd_error(adapter->dev_id,
13927 "Unable pair since another pairing is in progress");
13931 #ifndef TIZEN_FEATURE_BLUEZ_MODIFY
13932 suspend_discovery(adapter);
13934 return adapter_bonding_attempt(adapter, bdaddr, addr_type, io_cap);
13937 /* Starts a new bonding attempt in a fresh new bonding_req or a retried one. */
13938 int adapter_bonding_attempt(struct btd_adapter *adapter, const bdaddr_t *bdaddr,
13939 uint8_t addr_type, uint8_t io_cap)
13941 struct mgmt_cp_pair_device cp;
13943 struct pair_device_data *data;
13946 ba2str(bdaddr, addr);
13947 DBG("hci%u bdaddr %s type %d io_cap 0x%02x",
13948 adapter->dev_id, addr, addr_type, io_cap);
13950 /* Reset the pincode_requested flag for a new bonding attempt. */
13951 adapter->pincode_requested = false;
13953 memset(&cp, 0, sizeof(cp));
13954 bacpy(&cp.addr.bdaddr, bdaddr);
13955 cp.addr.type = addr_type;
13956 cp.io_cap = io_cap;
13958 data = g_new0(struct pair_device_data, 1);
13959 data->adapter = adapter;
13960 bacpy(&data->bdaddr, bdaddr);
13961 data->addr_type = addr_type;
13963 id = mgmt_send(adapter->mgmt, MGMT_OP_PAIR_DEVICE,
13964 adapter->dev_id, sizeof(cp), &cp,
13965 pair_device_complete, data,
13966 free_pair_device_data);
13969 btd_error(adapter->dev_id, "Failed to pair %s for hci%u",
13970 addr, adapter->dev_id);
13971 free_pair_device_data(data);
13975 adapter->pair_device_id = id;
13977 /* Due to a bug in the kernel it is possible that a LE pairing
13978 * request never times out. Therefore, add a timer to clean up
13979 * if no response arrives
13981 adapter->pair_device_timeout = timeout_add_seconds(BONDING_TIMEOUT,
13982 pair_device_timeout, data,
13988 static void disconnect_notify(struct btd_device *dev, uint8_t reason)
13992 for (l = disconnect_list; l; l = g_slist_next(l)) {
13993 btd_disconnect_cb disconnect_cb = l->data;
13994 disconnect_cb(dev, reason);
13998 static void dev_disconnected(struct btd_adapter *adapter,
13999 const struct mgmt_addr_info *addr,
14002 struct btd_device *device;
14004 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
14005 struct device_addr_type t_addr;
14008 ba2str(&addr->bdaddr, dst);
14010 DBG("Device %s disconnected, reason %u", dst, reason);
14012 device = btd_adapter_find_device(adapter, &addr->bdaddr, addr->type);
14014 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
14016 device_get_tizen_addr(device, addr->type, &t_addr);
14018 device_set_disconnect_reason(device, reason);
14019 adapter_remove_connection(adapter, device, t_addr.bdaddr_type);
14020 disconnect_notify(device, reason);
14021 if (device_is_bonded(device, t_addr.bdaddr_type)) {
14022 DBG("addr type %d, bonded", t_addr.bdaddr_type);
14026 bonding_attempt_complete(adapter, &t_addr.bdaddr,
14027 t_addr.bdaddr_type, MGMT_STATUS_DISCONNECTED);
14032 adapter_remove_connection(adapter, device, addr->type);
14033 disconnect_notify(device, reason);
14037 bonding_attempt_complete(adapter, &addr->bdaddr, addr->type,
14038 MGMT_STATUS_DISCONNECTED);
14041 void btd_add_disconnect_cb(btd_disconnect_cb func)
14043 disconnect_list = g_slist_append(disconnect_list, func);
14046 void btd_remove_disconnect_cb(btd_disconnect_cb func)
14048 disconnect_list = g_slist_remove(disconnect_list, func);
14051 static void disconnect_complete(uint8_t status, uint16_t length,
14052 const void *param, void *user_data)
14054 const struct mgmt_rp_disconnect *rp = param;
14055 struct btd_adapter *adapter = user_data;
14057 if (status == MGMT_STATUS_NOT_CONNECTED) {
14058 btd_warn(adapter->dev_id,
14059 "Disconnecting failed: already disconnected");
14060 } else if (status != MGMT_STATUS_SUCCESS) {
14061 btd_error(adapter->dev_id,
14062 "Failed to disconnect device: %s (0x%02x)",
14063 mgmt_errstr(status), status);
14067 if (length < sizeof(*rp)) {
14068 btd_error(adapter->dev_id,
14069 "Too small device disconnect response");
14073 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
14074 /* Use HCI error code instead of MGMT disconnection reason */
14075 dev_disconnected(adapter, &rp->addr, 0x16);
14077 dev_disconnected(adapter, &rp->addr, MGMT_DEV_DISCONN_LOCAL_HOST);
14081 int btd_adapter_disconnect_device(struct btd_adapter *adapter,
14082 const bdaddr_t *bdaddr,
14083 uint8_t bdaddr_type)
14086 struct mgmt_cp_disconnect cp;
14088 memset(&cp, 0, sizeof(cp));
14089 bacpy(&cp.addr.bdaddr, bdaddr);
14090 cp.addr.type = bdaddr_type;
14092 if (mgmt_send(adapter->mgmt, MGMT_OP_DISCONNECT,
14093 adapter->dev_id, sizeof(cp), &cp,
14094 disconnect_complete, adapter, NULL) > 0)
14100 static void auth_failed_callback(uint16_t index, uint16_t length,
14101 const void *param, void *user_data)
14103 const struct mgmt_ev_auth_failed *ev = param;
14104 struct btd_adapter *adapter = user_data;
14106 if (length < sizeof(*ev)) {
14107 btd_error(adapter->dev_id, "Too small auth failed mgmt event");
14111 bonding_attempt_complete(adapter, &ev->addr.bdaddr, ev->addr.type,
14115 static void store_link_key(struct btd_adapter *adapter,
14116 struct btd_device *device, const uint8_t *key,
14117 uint8_t type, uint8_t pin_length)
14119 char device_addr[18];
14120 char filename[PATH_MAX];
14121 GKeyFile *key_file;
14122 GError *gerr = NULL;
14128 ba2str(device_get_address(device), device_addr);
14130 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/%s/info",
14131 btd_adapter_get_storage_dir(adapter), device_addr);
14132 create_file(filename, 0600);
14134 key_file = g_key_file_new();
14135 if (!g_key_file_load_from_file(key_file, filename, 0, &gerr)) {
14136 error("Unable to load key file from %s: (%s)", filename,
14138 g_error_free(gerr);
14139 g_key_file_free(key_file);
14143 for (i = 0; i < 16; i++)
14144 sprintf(key_str + (i * 2), "%2.2X", key[i]);
14146 g_key_file_set_string(key_file, "LinkKey", "Key", key_str);
14148 g_key_file_set_integer(key_file, "LinkKey", "Type", type);
14149 g_key_file_set_integer(key_file, "LinkKey", "PINLength", pin_length);
14151 create_file(filename, 0600);
14153 str = g_key_file_to_data(key_file, &length, NULL);
14154 if (!g_file_set_contents(filename, str, length, &gerr)) {
14155 error("Unable set contents for %s: (%s)", filename,
14157 g_error_free(gerr);
14161 g_key_file_free(key_file);
14164 static void new_link_key_callback(uint16_t index, uint16_t length,
14165 const void *param, void *user_data)
14167 const struct mgmt_ev_new_link_key *ev = param;
14168 const struct mgmt_addr_info *addr = &ev->key.addr;
14169 struct btd_adapter *adapter = user_data;
14170 struct btd_device *device;
14173 if (length < sizeof(*ev)) {
14174 btd_error(adapter->dev_id, "Too small new link key event");
14178 ba2str(&addr->bdaddr, dst);
14180 DBG("hci%u new key for %s type %u pin_len %u store_hint %u",
14181 adapter->dev_id, dst, ev->key.type, ev->key.pin_len,
14184 if (ev->key.pin_len > 16) {
14185 btd_error(adapter->dev_id,
14186 "Invalid PIN length (%u) in new_key event",
14191 device = btd_adapter_get_device(adapter, &addr->bdaddr, addr->type);
14193 btd_error(adapter->dev_id,
14194 "Unable to get device object for %s", dst);
14198 if (ev->store_hint) {
14199 const struct mgmt_link_key_info *key = &ev->key;
14201 store_link_key(adapter, device, key->val, key->type,
14204 device_set_bonded(device, BDADDR_BREDR);
14205 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
14207 if (btd_adapter_get_a2dp_role(adapter) == BLUETOOTH_A2DP_SINK_ROLE) {
14208 DBG("store_hint %d", ev->store_hint);
14209 btd_device_set_temporary(device, false);
14216 bonding_complete(adapter, &addr->bdaddr, addr->type, 0);
14219 static void store_ltk_group(struct btd_adapter *adapter, const bdaddr_t *peer,
14220 uint8_t bdaddr_type, const unsigned char *key,
14221 const char *group, uint8_t authenticated,
14222 uint8_t enc_size, uint16_t ediv,
14225 char device_addr[18];
14226 char filename[PATH_MAX];
14227 GKeyFile *key_file;
14228 GError *gerr = NULL;
14234 ba2str(peer, device_addr);
14236 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/%s/info",
14237 btd_adapter_get_storage_dir(adapter), device_addr);
14238 key_file = g_key_file_new();
14239 if (!g_key_file_load_from_file(key_file, filename, 0, &gerr)) {
14240 error("Unable to load key file from %s: (%s)", filename,
14242 g_error_free(gerr);
14245 for (i = 0; i < 16; i++)
14246 sprintf(key_str + (i * 2), "%2.2X", key[i]);
14248 g_key_file_set_string(key_file, group, "Key", key_str);
14250 g_key_file_set_integer(key_file, group, "Authenticated",
14252 g_key_file_set_integer(key_file, group, "EncSize", enc_size);
14254 g_key_file_set_integer(key_file, group, "EDiv", ediv);
14255 g_key_file_set_uint64(key_file, group, "Rand", rand);
14257 create_file(filename, 0600);
14259 str = g_key_file_to_data(key_file, &length, NULL);
14260 if (!g_file_set_contents(filename, str, length, &gerr)) {
14261 error("Unable set contents for %s: (%s)", filename,
14263 g_error_free(gerr);
14267 g_key_file_free(key_file);
14270 static void store_longtermkey(struct btd_adapter *adapter, const bdaddr_t *peer,
14271 uint8_t bdaddr_type, const unsigned char *key,
14272 uint8_t central, uint8_t authenticated,
14273 uint8_t enc_size, uint16_t ediv,
14276 if (central != 0x00 && central != 0x01) {
14277 error("Unsupported LTK type %u", central);
14282 store_ltk_group(adapter, peer, bdaddr_type, key, "LongTermKey",
14283 authenticated, enc_size, ediv, rand);
14285 /* Peripheral* is the proper term, but for now keep duplicates
14286 * so it won't break when user up/downgrades. Remove the other
14287 * term after a few releases.
14289 store_ltk_group(adapter, peer, bdaddr_type, key,
14290 "PeripheralLongTermKey", authenticated,
14291 enc_size, ediv, rand);
14292 store_ltk_group(adapter, peer, bdaddr_type, key,
14293 "SlaveLongTermKey", authenticated,
14294 enc_size, ediv, rand);
14298 static void new_long_term_key_callback(uint16_t index, uint16_t length,
14299 const void *param, void *user_data)
14301 const struct mgmt_ev_new_long_term_key *ev = param;
14302 const struct mgmt_addr_info *addr = &ev->key.addr;
14303 struct btd_adapter *adapter = user_data;
14304 struct btd_device *device;
14307 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
14308 struct device_addr_type t_addr;
14311 if (length < sizeof(*ev)) {
14312 btd_error(adapter->dev_id, "Too small long term key event");
14316 ba2str(&addr->bdaddr, dst);
14318 DBG("hci%u new LTK for %s type %u enc_size %u",
14319 adapter->dev_id, dst, ev->key.type, ev->key.enc_size);
14321 device = btd_adapter_get_device(adapter, &addr->bdaddr, addr->type);
14323 btd_error(adapter->dev_id,
14324 "Unable to get device object for %s", dst);
14329 * Some older kernel versions set store_hint for long term keys
14330 * from resolvable and unresolvable random addresses, but there
14331 * is no point in storing these. Next time around the device
14332 * address will be invalid.
14334 * So only for identity addresses (public and static random) use
14335 * the store_hint as an indication if the long term key should
14336 * be persistently stored.
14339 if (addr->type == BDADDR_LE_RANDOM &&
14340 (addr->bdaddr.b[5] & 0xc0) != 0xc0)
14341 persistent = false;
14343 persistent = !!ev->store_hint;
14346 const struct mgmt_ltk_info *key = &ev->key;
14350 ediv = le16_to_cpu(key->ediv);
14351 rand = le64_to_cpu(key->rand);
14353 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
14354 device_get_tizen_addr(device, addr->type, &t_addr);
14355 store_longtermkey(adapter, &t_addr.bdaddr, t_addr.bdaddr_type,
14356 key->val, key->central, key->type,
14357 key->enc_size, ediv, rand);
14359 store_longtermkey(adapter, &key->addr.bdaddr,
14360 key->addr.type, key->val, key->central,
14361 key->type, key->enc_size, ediv, rand);
14364 device_set_bonded(device, addr->type);
14367 device_set_ltk_enc_size(device, ev->key.enc_size);
14369 bonding_complete(adapter, &addr->bdaddr, addr->type, 0);
14372 static void store_csrk(struct btd_adapter *adapter, const bdaddr_t *peer,
14373 uint8_t bdaddr_type, const unsigned char *key,
14374 uint32_t counter, uint8_t type)
14377 char device_addr[18];
14378 char filename[PATH_MAX];
14379 GKeyFile *key_file;
14380 GError *gerr = NULL;
14389 group = "LocalSignatureKey";
14393 group = "RemoteSignatureKey";
14397 group = "LocalSignatureKey";
14401 group = "RemoteSignatureKey";
14405 warn("Unsupported CSRK type %u", type);
14409 ba2str(peer, device_addr);
14411 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/%s/info",
14412 btd_adapter_get_storage_dir(adapter), device_addr);
14414 key_file = g_key_file_new();
14415 if (!g_key_file_load_from_file(key_file, filename, 0, &gerr)) {
14416 error("Unable to load key file from %s: (%s)", filename,
14418 g_error_free(gerr);
14421 for (i = 0; i < 16; i++)
14422 sprintf(key_str + (i * 2), "%2.2X", key[i]);
14424 g_key_file_set_string(key_file, group, "Key", key_str);
14425 g_key_file_set_integer(key_file, group, "Counter", counter);
14426 g_key_file_set_boolean(key_file, group, "Authenticated", auth);
14428 create_file(filename, 0600);
14430 str = g_key_file_to_data(key_file, &length, NULL);
14431 if (!g_file_set_contents(filename, str, length, &gerr)) {
14432 error("Unable set contents for %s: (%s)", filename,
14434 g_error_free(gerr);
14438 g_key_file_free(key_file);
14441 static void new_csrk_callback(uint16_t index, uint16_t length,
14442 const void *param, void *user_data)
14444 const struct mgmt_ev_new_csrk *ev = param;
14445 const struct mgmt_addr_info *addr = &ev->key.addr;
14446 const struct mgmt_csrk_info *key = &ev->key;
14447 struct btd_adapter *adapter = user_data;
14448 struct btd_device *device;
14450 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
14451 struct device_addr_type t_addr;
14454 if (length < sizeof(*ev)) {
14455 btd_error(adapter->dev_id, "Too small CSRK event");
14459 ba2str(&addr->bdaddr, dst);
14461 DBG("hci%u new CSRK for %s type %u", adapter->dev_id, dst,
14464 device = btd_adapter_get_device(adapter, &addr->bdaddr, addr->type);
14466 btd_error(adapter->dev_id,
14467 "Unable to get device object for %s", dst);
14471 if (!ev->store_hint)
14474 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
14475 device_get_tizen_addr(device, addr->type, &t_addr);
14476 store_csrk(adapter, &t_addr.bdaddr, t_addr.bdaddr_type, key->val, 0,
14479 store_csrk(adapter, &key->addr.bdaddr, key->addr.type, key->val, 0,
14483 btd_device_set_temporary(device, false);
14486 static void store_irk(struct btd_adapter *adapter, const bdaddr_t *peer,
14487 uint8_t bdaddr_type, const unsigned char *key)
14489 char device_addr[18];
14490 char filename[PATH_MAX];
14491 GKeyFile *key_file;
14492 GError *gerr = NULL;
14498 ba2str(peer, device_addr);
14500 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/%s/info",
14501 btd_adapter_get_storage_dir(adapter), device_addr);
14502 key_file = g_key_file_new();
14503 if (!g_key_file_load_from_file(key_file, filename, 0, &gerr)) {
14504 error("Unable to load key file from %s: (%s)", filename,
14506 g_error_free(gerr);
14509 for (i = 0; i < 16; i++)
14510 sprintf(str + (i * 2), "%2.2X", key[i]);
14512 g_key_file_set_string(key_file, "IdentityResolvingKey", "Key", str);
14514 store_data = g_key_file_to_data(key_file, &length, NULL);
14515 if (!g_file_set_contents(filename, store_data, length, &gerr)) {
14516 error("Unable set contents for %s: (%s)", filename,
14518 g_error_free(gerr);
14520 g_free(store_data);
14522 g_key_file_free(key_file);
14525 static void new_irk_callback(uint16_t index, uint16_t length,
14526 const void *param, void *user_data)
14528 const struct mgmt_ev_new_irk *ev = param;
14529 const struct mgmt_addr_info *addr = &ev->key.addr;
14530 const struct mgmt_irk_info *irk = &ev->key;
14531 struct btd_adapter *adapter = user_data;
14532 struct btd_device *device, *duplicate;
14534 char dst[18], rpa[18];
14535 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
14536 struct device_addr_type t_addr;
14539 if (length < sizeof(*ev)) {
14540 btd_error(adapter->dev_id, "Too small New IRK event");
14544 ba2str(&addr->bdaddr, dst);
14545 ba2str(&ev->rpa, rpa);
14547 DBG("hci%u new IRK for %s RPA %s", adapter->dev_id, dst, rpa);
14549 if (bacmp(&ev->rpa, BDADDR_ANY)) {
14550 device = btd_adapter_get_device(adapter, &ev->rpa,
14552 #ifndef TIZEN_FEATURE_BLUEZ_MODIFY
14553 device = btd_adapter_get_device(adapter, &ev->rpa,
14555 duplicate = btd_adapter_find_device(adapter, &addr->bdaddr,
14557 if (duplicate == device)
14560 device_set_rpa(device, &ev->rpa);
14564 device = btd_adapter_get_device(adapter, &addr->bdaddr,
14570 btd_error(adapter->dev_id,
14571 "Unable to get device object for %s", dst);
14575 device_update_addr(device, &addr->bdaddr, addr->type);
14578 device_merge_duplicate(device, duplicate);
14580 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
14581 device_set_irk_value(device, irk->val);
14584 persistent = !!ev->store_hint;
14588 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
14589 device_get_tizen_addr(device, addr->type, &t_addr);
14590 store_irk(adapter, &t_addr.bdaddr, t_addr.bdaddr_type, irk->val);
14592 store_irk(adapter, &addr->bdaddr, addr->type, irk->val);
14595 btd_device_set_temporary(device, false);
14598 static void store_conn_param(struct btd_adapter *adapter, const bdaddr_t *peer,
14599 uint8_t bdaddr_type, uint16_t min_interval,
14600 uint16_t max_interval, uint16_t latency,
14603 char device_addr[18];
14604 char filename[PATH_MAX];
14605 GKeyFile *key_file;
14606 GError *gerr = NULL;
14610 ba2str(peer, device_addr);
14614 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/%s/info",
14615 btd_adapter_get_storage_dir(adapter), device_addr);
14616 key_file = g_key_file_new();
14617 if (!g_key_file_load_from_file(key_file, filename, 0, &gerr)) {
14618 error("Unable to load key file from %s: (%s)", filename,
14620 g_error_free(gerr);
14623 g_key_file_set_integer(key_file, "ConnectionParameters",
14624 "MinInterval", min_interval);
14625 g_key_file_set_integer(key_file, "ConnectionParameters",
14626 "MaxInterval", max_interval);
14627 g_key_file_set_integer(key_file, "ConnectionParameters",
14628 "Latency", latency);
14629 g_key_file_set_integer(key_file, "ConnectionParameters",
14630 "Timeout", timeout);
14632 create_file(filename, 0600);
14634 store_data = g_key_file_to_data(key_file, &length, NULL);
14635 if (!g_file_set_contents(filename, store_data, length, &gerr)) {
14636 error("Unable set contents for %s: (%s)", filename,
14638 g_error_free(gerr);
14640 g_free(store_data);
14642 g_key_file_free(key_file);
14645 static void new_conn_param(uint16_t index, uint16_t length,
14646 const void *param, void *user_data)
14648 const struct mgmt_ev_new_conn_param *ev = param;
14649 struct btd_adapter *adapter = user_data;
14650 uint16_t min, max, latency, timeout;
14651 struct btd_device *dev;
14653 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
14654 struct device_addr_type t_addr;
14657 if (length < sizeof(*ev)) {
14658 btd_error(adapter->dev_id,
14659 "Too small New Connection Parameter event");
14663 ba2str(&ev->addr.bdaddr, dst);
14665 min = btohs(ev->min_interval);
14666 max = btohs(ev->max_interval);
14667 latency = btohs(ev->latency);
14668 timeout = btohs(ev->timeout);
14670 DBG("hci%u %s (%u) min 0x%04x max 0x%04x latency 0x%04x timeout 0x%04x",
14671 adapter->dev_id, dst, ev->addr.type, min, max, latency, timeout);
14673 dev = btd_adapter_get_device(adapter, &ev->addr.bdaddr, ev->addr.type);
14675 btd_error(adapter->dev_id,
14676 "Unable to get device object for %s", dst);
14680 if (!ev->store_hint)
14683 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
14684 device_get_tizen_addr(dev, ev->addr.type, &t_addr);
14685 store_conn_param(adapter, &t_addr.bdaddr, t_addr.bdaddr_type,
14686 ev->min_interval, ev->max_interval,
14687 ev->latency, ev->timeout);
14689 store_conn_param(adapter, &ev->addr.bdaddr, ev->addr.type,
14690 ev->min_interval, ev->max_interval,
14691 ev->latency, ev->timeout);
14695 int adapter_set_io_capability(struct btd_adapter *adapter, uint8_t io_cap)
14697 struct mgmt_cp_set_io_capability cp;
14699 if (!btd_opts.pairable) {
14700 if (io_cap == IO_CAPABILITY_INVALID) {
14701 if (adapter->current_settings & MGMT_SETTING_BONDABLE)
14702 set_mode(adapter, MGMT_OP_SET_BONDABLE, 0x00);
14707 if (!(adapter->current_settings & MGMT_SETTING_BONDABLE))
14708 set_mode(adapter, MGMT_OP_SET_BONDABLE, 0x01);
14709 } else if (io_cap == IO_CAPABILITY_INVALID)
14710 io_cap = IO_CAPABILITY_NOINPUTNOOUTPUT;
14712 memset(&cp, 0, sizeof(cp));
14713 cp.io_capability = io_cap;
14715 if (mgmt_send(adapter->mgmt, MGMT_OP_SET_IO_CAPABILITY,
14716 adapter->dev_id, sizeof(cp), &cp,
14717 NULL, NULL, NULL) > 0)
14723 int btd_adapter_add_remote_oob_data(struct btd_adapter *adapter,
14724 const bdaddr_t *bdaddr,
14725 uint8_t *hash, uint8_t *randomizer)
14727 struct mgmt_cp_add_remote_oob_data cp;
14730 ba2str(bdaddr, addr);
14731 DBG("hci%d bdaddr %s", adapter->dev_id, addr);
14733 memset(&cp, 0, sizeof(cp));
14734 bacpy(&cp.addr.bdaddr, bdaddr);
14735 memcpy(cp.hash192, hash, 16);
14738 memcpy(cp.rand192, randomizer, 16);
14740 if (mgmt_send(adapter->mgmt, MGMT_OP_ADD_REMOTE_OOB_DATA,
14741 adapter->dev_id, sizeof(cp), &cp,
14742 NULL, NULL, NULL) > 0)
14748 int btd_adapter_remove_remote_oob_data(struct btd_adapter *adapter,
14749 const bdaddr_t *bdaddr)
14751 struct mgmt_cp_remove_remote_oob_data cp;
14754 ba2str(bdaddr, addr);
14755 DBG("hci%d bdaddr %s", adapter->dev_id, addr);
14757 memset(&cp, 0, sizeof(cp));
14758 bacpy(&cp.addr.bdaddr, bdaddr);
14760 if (mgmt_send(adapter->mgmt, MGMT_OP_REMOVE_REMOTE_OOB_DATA,
14761 adapter->dev_id, sizeof(cp), &cp,
14762 NULL, NULL, NULL) > 0)
14768 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
14769 int btd_adapter_add_remote_oob_ext_data(struct btd_adapter *adapter,
14770 const bdaddr_t *bdaddr, uint8_t bdaddr_type,
14771 uint8_t *hash192, uint8_t *randomizer192,
14772 uint8_t *hash256, uint8_t *randomizer256)
14774 struct mgmt_cp_add_remote_oob_data cp;
14777 ba2str(bdaddr, addr);
14778 DBG("hci%d bdaddr %s type %d", adapter->dev_id, addr, bdaddr_type);
14780 memset(&cp, 0, sizeof(cp));
14781 bacpy(&cp.addr.bdaddr, bdaddr);
14782 cp.addr.type = bdaddr_type;
14784 if (hash192 && randomizer192) {
14785 memcpy(cp.hash192, hash192, 16);
14786 memcpy(cp.rand192, randomizer192, 16);
14789 if (hash256 && randomizer256) {
14790 memcpy(cp.hash256, hash256, 16);
14791 memcpy(cp.rand256, randomizer256, 16);
14794 if (mgmt_send(adapter->mgmt, MGMT_OP_ADD_REMOTE_OOB_DATA,
14795 adapter->dev_id, sizeof(cp), &cp,
14796 NULL, NULL, NULL) > 0)
14802 int btd_adapter_remove_remote_oob_ext_data(struct btd_adapter *adapter,
14803 const bdaddr_t *bdaddr, uint8_t bdaddr_type)
14805 struct mgmt_cp_remove_remote_oob_data cp;
14808 ba2str(bdaddr, addr);
14809 DBG("hci%d bdaddr %s type %d", adapter->dev_id, addr, bdaddr_type);
14811 memset(&cp, 0, sizeof(cp));
14812 bacpy(&cp.addr.bdaddr, bdaddr);
14813 cp.addr.type = bdaddr_type;
14815 if (mgmt_send(adapter->mgmt, MGMT_OP_REMOVE_REMOTE_OOB_DATA,
14816 adapter->dev_id, sizeof(cp), &cp,
14817 NULL, NULL, NULL) > 0)
14824 bool btd_adapter_ssp_enabled(struct btd_adapter *adapter)
14826 if (adapter->current_settings & MGMT_SETTING_SSP)
14832 void btd_adapter_set_oob_handler(struct btd_adapter *adapter,
14833 struct oob_handler *handler)
14835 adapter->oob_handler = handler;
14838 gboolean btd_adapter_check_oob_handler(struct btd_adapter *adapter)
14840 return adapter->oob_handler != NULL;
14843 static void read_local_oob_data_complete(uint8_t status, uint16_t length,
14844 const void *param, void *user_data)
14846 const struct mgmt_rp_read_local_oob_data *rp = param;
14847 struct btd_adapter *adapter = user_data;
14848 const uint8_t *hash, *randomizer;
14849 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
14850 const uint8_t *hash256 = NULL;
14851 const uint8_t *randomizer256 = NULL;
14854 if (status != MGMT_STATUS_SUCCESS) {
14855 btd_error(adapter->dev_id,
14856 "Read local OOB data failed: %s (0x%02x)",
14857 mgmt_errstr(status), status);
14860 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
14861 } else if (length < 32) {
14863 } else if (length < sizeof(*rp)) {
14865 btd_error(adapter->dev_id,
14866 "Too small read local OOB data response");
14869 hash = rp->hash192;
14870 randomizer = rp->rand192;
14871 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
14873 hash256 = rp->hash256;
14874 randomizer256 = rp->rand256;
14879 if (!adapter->oob_handler || !adapter->oob_handler->read_local_cb)
14882 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
14883 adapter->oob_handler->read_local_cb(adapter, hash, randomizer,
14884 hash256, randomizer256,
14885 adapter->oob_handler->user_data);
14887 adapter->oob_handler->read_local_cb(adapter, hash, randomizer,
14888 adapter->oob_handler->user_data);
14891 g_free(adapter->oob_handler);
14892 adapter->oob_handler = NULL;
14895 int btd_adapter_read_local_oob_data(struct btd_adapter *adapter)
14897 DBG("hci%u", adapter->dev_id);
14899 if (mgmt_send(adapter->mgmt, MGMT_OP_READ_LOCAL_OOB_DATA,
14900 adapter->dev_id, 0, NULL, read_local_oob_data_complete,
14901 adapter, NULL) > 0)
14907 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
14908 static void le_read_local_oob_data_complete(uint8_t status, uint16_t length,
14909 const void *param, void *user_data)
14911 const struct mgmt_rp_read_local_oob_ext_data *rp = param;
14912 struct btd_adapter *adapter = user_data;
14914 if (status != MGMT_STATUS_SUCCESS) {
14915 btd_error(adapter->dev_id, "LE Read local OOB data failed: %s (0x%02x)",
14916 mgmt_errstr(status), status);
14917 } else if (length < sizeof(struct mgmt_rp_read_local_oob_ext_data)) {
14918 btd_error(adapter->dev_id,
14919 "Too small read local OOB ext data response");
14923 if (!adapter->oob_handler || !adapter->oob_handler->le_read_local_cb) {
14924 btd_error(adapter->dev_id, "oob_handler is not valid : %p",
14925 adapter->oob_handler);
14929 adapter->oob_handler->le_read_local_cb(adapter, rp->eir_len, rp->eir,
14930 adapter->oob_handler->user_data);
14932 g_free(adapter->oob_handler);
14933 adapter->oob_handler = NULL;
14936 int btd_adapter_le_read_local_oob_data(struct btd_adapter *adapter)
14938 struct mgmt_cp_read_local_oob_ext_data cp;
14940 DBG("hci%u", adapter->dev_id);
14942 memset(&cp, 0, sizeof(cp));
14943 cp.type = (1 << BDADDR_LE_PUBLIC) | (1 << BDADDR_LE_RANDOM);
14945 if (mgmt_send(adapter->mgmt, MGMT_OP_READ_LOCAL_OOB_EXT_DATA,
14946 adapter->dev_id, sizeof(cp), &cp, le_read_local_oob_data_complete,
14947 adapter, NULL) > 0)
14954 void btd_adapter_for_each_device(struct btd_adapter *adapter,
14955 void (*cb)(struct btd_device *device, void *data),
14958 g_slist_foreach(adapter->devices, (GFunc) cb, data);
14961 static int adapter_cmp(gconstpointer a, gconstpointer b)
14963 struct btd_adapter *adapter = (struct btd_adapter *) a;
14964 const bdaddr_t *bdaddr = b;
14966 return bacmp(&adapter->bdaddr, bdaddr);
14969 static int adapter_id_cmp(gconstpointer a, gconstpointer b)
14971 struct btd_adapter *adapter = (struct btd_adapter *) a;
14972 uint16_t id = GPOINTER_TO_UINT(b);
14974 return adapter->dev_id == id ? 0 : -1;
14977 struct btd_adapter *adapter_find(const bdaddr_t *sba)
14981 match = g_slist_find_custom(adapters, sba, adapter_cmp);
14985 return match->data;
14988 struct btd_adapter *adapter_find_by_id(int id)
14992 match = g_slist_find_custom(adapters, GINT_TO_POINTER(id),
14997 return match->data;
15000 void adapter_foreach(adapter_cb func, gpointer user_data)
15002 g_slist_foreach(adapters, (GFunc) func, user_data);
15005 static int set_did(struct btd_adapter *adapter, uint16_t vendor,
15006 uint16_t product, uint16_t version, uint16_t source)
15008 struct mgmt_cp_set_device_id cp;
15010 DBG("hci%u source %x vendor %x product %x version %x",
15011 adapter->dev_id, source, vendor, product, version);
15013 memset(&cp, 0, sizeof(cp));
15015 cp.source = htobs(source);
15016 cp.vendor = htobs(vendor);
15017 cp.product = htobs(product);
15018 cp.version = htobs(version);
15020 if (mgmt_send(adapter->mgmt, MGMT_OP_SET_DEVICE_ID,
15021 adapter->dev_id, sizeof(cp), &cp,
15022 NULL, NULL, NULL) > 0)
15028 static void services_modified(struct gatt_db_attribute *attrib, void *user_data)
15030 struct btd_adapter *adapter = user_data;
15032 g_dbus_emit_property_changed(dbus_conn, adapter->path,
15033 ADAPTER_INTERFACE, "UUIDs");
15036 static int adapter_register(struct btd_adapter *adapter)
15038 struct agent *agent;
15039 struct gatt_db *db;
15040 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
15041 char address[18] = { 0 };
15042 char filename[PATH_MAX] = { 0 };
15048 adapter->path = g_strdup_printf("/org/bluez/hci%d", adapter->dev_id);
15050 if (!g_dbus_register_interface(dbus_conn,
15051 adapter->path, ADAPTER_INTERFACE,
15052 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
15053 adapter_methods, adapter_signals,
15055 adapter_methods, NULL,
15057 adapter_properties, adapter,
15059 btd_error(adapter->dev_id,
15060 "Adapter interface init failed on path %s",
15062 g_free(adapter->path);
15063 adapter->path = NULL;
15067 if (adapters == NULL)
15068 adapter->is_default = true;
15070 adapters = g_slist_append(adapters, adapter);
15072 agent = agent_get(NULL);
15074 uint8_t io_cap = agent_get_io_capability(agent);
15075 adapter_set_io_capability(adapter, io_cap);
15076 agent_unref(agent);
15079 /* Don't start GATT database and advertising managers on
15080 * non-LE controllers.
15082 if (!(adapter->supported_settings & MGMT_SETTING_LE) ||
15083 btd_opts.mode == BT_MODE_BREDR)
15086 adapter->database = btd_gatt_database_new(adapter);
15087 if (!adapter->database) {
15088 btd_error(adapter->dev_id,
15089 "Failed to create GATT database for adapter");
15090 adapters = g_slist_remove(adapters, adapter);
15094 adapter->adv_manager = btd_adv_manager_new(adapter, adapter->mgmt);
15096 if (g_dbus_get_flags() & G_DBUS_FLAG_ENABLE_EXPERIMENTAL) {
15097 if (adapter->supported_settings & MGMT_SETTING_LE) {
15098 adapter->adv_monitor_manager =
15099 btd_adv_monitor_manager_create(adapter,
15101 if (!adapter->adv_monitor_manager) {
15102 btd_error(adapter->dev_id,
15103 "Failed to create Adv Monitor "
15104 "Manager for adapter");
15108 btd_info(adapter->dev_id, "Adv Monitor Manager "
15109 "skipped, LE unavailable");
15113 if (g_dbus_get_flags() & G_DBUS_FLAG_ENABLE_EXPERIMENTAL) {
15114 adapter->battery_provider_manager =
15115 btd_battery_provider_manager_create(adapter);
15118 db = btd_gatt_database_get_db(adapter->database);
15119 adapter->db_id = gatt_db_register(db, services_modified,
15123 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
15124 ba2str(&adapter->bdaddr, address);
15125 snprintf(filename, PATH_MAX, STORAGEDIR "/%s", address);
15126 delete_tempfiles(filename);
15129 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
15130 adapter_print_devices(adapter);
15132 if (load_local_irk(adapter)) {
15133 if (!(adapter->supported_settings & MGMT_SETTING_PRIVACY))
15134 btd_opts.le_privacy = false;
15137 * Some Android devices don't consider the device as LE one,
15138 * if the device doesn't distribute IRK when pairing.
15139 * Because of this compatibility issue, set IRK
15140 * even though privacy feature is disabled.
15142 set_local_irk(adapter);
15144 if (btd_opts.le_privacy) {
15145 DBG("Enable LE Privacy feature");
15146 set_privacy(adapter, true);
15148 DBG("Disable LE Privacy feature");
15154 mgmt_register(adapter->mgmt, MGMT_EV_DEVICE_FLAGS_CHANGED,
15156 device_flags_changed_callback,
15159 load_config(adapter);
15160 fix_storage(adapter);
15161 load_drivers(adapter);
15162 btd_profile_foreach(probe_profile, adapter);
15163 clear_blocked(adapter);
15164 load_defaults(adapter);
15165 load_devices(adapter);
15167 /* restore Service Changed CCC value for bonded devices */
15168 btd_gatt_database_restore_svc_chng_ccc(adapter->database);
15170 /* retrieve the active connections: address the scenario where
15171 * the are active connections before the daemon've started */
15172 if (btd_adapter_get_powered(adapter))
15173 load_connections(adapter);
15175 adapter->initialized = TRUE;
15177 if (btd_opts.did_source) {
15178 /* DeviceID record is added by sdpd-server before any other
15179 * record is registered. */
15180 adapter_service_insert(adapter, sdp_record_find(0x10000));
15181 set_did(adapter, btd_opts.did_vendor, btd_opts.did_product,
15182 btd_opts.did_version, btd_opts.did_source);
15185 DBG("Adapter %s registered", adapter->path);
15190 static int adapter_unregister(struct btd_adapter *adapter)
15192 DBG("Unregister path: %s", adapter->path);
15194 adapters = g_slist_remove(adapters, adapter);
15196 if (adapter->is_default && adapters != NULL) {
15197 struct btd_adapter *new_default;
15199 new_default = adapter_find_by_id(hci_get_route(NULL));
15200 if (new_default == NULL)
15201 new_default = adapters->data;
15203 new_default->is_default = true;
15206 adapter_list = g_list_remove(adapter_list, adapter);
15208 adapter_remove(adapter);
15209 btd_adapter_unref(adapter);
15214 static void disconnected_callback(uint16_t index, uint16_t length,
15215 const void *param, void *user_data)
15217 const struct mgmt_ev_device_disconnected *ev = param;
15218 struct btd_adapter *adapter = user_data;
15221 if (length < sizeof(struct mgmt_addr_info)) {
15222 btd_error(adapter->dev_id,
15223 "Too small device disconnected event");
15227 if (length < sizeof(*ev))
15228 reason = MGMT_DEV_DISCONN_UNKNOWN;
15230 reason = ev->reason;
15232 dev_disconnected(adapter, &ev->addr, reason);
15235 static void connected_callback(uint16_t index, uint16_t length,
15236 const void *param, void *user_data)
15238 const struct mgmt_ev_device_connected *ev = param;
15239 struct btd_adapter *adapter = user_data;
15240 struct btd_device *device;
15241 struct eir_data eir_data;
15246 if (length < sizeof(*ev)) {
15247 btd_error(adapter->dev_id, "Too small device connected event");
15251 eir_len = btohs(ev->eir_len);
15252 if (length < sizeof(*ev) + eir_len) {
15253 btd_error(adapter->dev_id, "Too small device connected event");
15257 ba2str(&ev->addr.bdaddr, addr);
15259 DBG("hci%u device %s connected eir_len %u", index, addr, eir_len);
15261 device = btd_adapter_get_device(adapter, &ev->addr.bdaddr,
15264 btd_error(adapter->dev_id,
15265 "Unable to get device object for %s", addr);
15269 memset(&eir_data, 0, sizeof(eir_data));
15271 eir_parse(&eir_data, ev->eir, eir_len);
15273 if (eir_data.class != 0)
15274 device_set_class(device, eir_data.class);
15276 adapter_add_connection(adapter, device, ev->addr.type);
15278 name_known = device_name_known(device);
15280 if (eir_data.name && (eir_data.name_complete || !name_known)) {
15281 device_store_cached_name(device, eir_data.name);
15282 btd_device_device_set_name(device, eir_data.name);
15285 if (eir_data.msd_list)
15286 adapter_msd_notify(adapter, device, eir_data.msd_list);
15288 eir_data_free(&eir_data);
15291 static void controller_resume_notify(struct btd_adapter *adapter)
15295 for (l = adapter->drivers; l; l = g_slist_next(l)) {
15296 struct btd_adapter_driver *driver = l->data;
15297 if (driver->resume)
15298 driver->resume(adapter);
15302 static void controller_resume_callback(uint16_t index, uint16_t length,
15303 const void *param, void *user_data)
15305 const struct mgmt_ev_controller_resume *ev = param;
15306 struct btd_adapter *adapter = user_data;
15308 if (length < sizeof(*ev)) {
15309 btd_error(adapter->dev_id, "Too small device resume event");
15313 info("Controller resume with wake event 0x%x", ev->wake_reason);
15315 controller_resume_notify(adapter);
15318 static void device_blocked_callback(uint16_t index, uint16_t length,
15319 const void *param, void *user_data)
15321 const struct mgmt_ev_device_blocked *ev = param;
15322 struct btd_adapter *adapter = user_data;
15323 struct btd_device *device;
15326 if (length < sizeof(*ev)) {
15327 btd_error(adapter->dev_id, "Too small device blocked event");
15331 ba2str(&ev->addr.bdaddr, addr);
15332 DBG("hci%u %s blocked", index, addr);
15334 device = btd_adapter_find_device(adapter, &ev->addr.bdaddr,
15337 device_block(device, TRUE);
15340 static void device_unblocked_callback(uint16_t index, uint16_t length,
15341 const void *param, void *user_data)
15343 const struct mgmt_ev_device_unblocked *ev = param;
15344 struct btd_adapter *adapter = user_data;
15345 struct btd_device *device;
15348 if (length < sizeof(*ev)) {
15349 btd_error(adapter->dev_id, "Too small device unblocked event");
15353 ba2str(&ev->addr.bdaddr, addr);
15354 DBG("hci%u %s unblocked", index, addr);
15356 device = btd_adapter_find_device(adapter, &ev->addr.bdaddr,
15359 device_unblock(device, FALSE, TRUE);
15362 static void conn_fail_notify(struct btd_device *dev, uint8_t status)
15366 for (l = conn_fail_list; l; l = g_slist_next(l)) {
15367 btd_conn_fail_cb conn_fail_cb = l->data;
15368 conn_fail_cb(dev, status);
15372 void btd_add_conn_fail_cb(btd_conn_fail_cb func)
15374 conn_fail_list = g_slist_append(conn_fail_list, func);
15377 void btd_remove_conn_fail_cb(btd_conn_fail_cb func)
15379 conn_fail_list = g_slist_remove(conn_fail_list, func);
15382 static void connect_failed_callback(uint16_t index, uint16_t length,
15383 const void *param, void *user_data)
15385 const struct mgmt_ev_connect_failed *ev = param;
15386 struct btd_adapter *adapter = user_data;
15387 struct btd_device *device;
15390 if (length < sizeof(*ev)) {
15391 btd_error(adapter->dev_id, "Too small connect failed event");
15395 ba2str(&ev->addr.bdaddr, addr);
15397 DBG("hci%u %s status %u", index, addr, ev->status);
15399 device = btd_adapter_find_device(adapter, &ev->addr.bdaddr,
15402 conn_fail_notify(device, ev->status);
15404 /* If the device is in a bonding process cancel any auth request
15405 * sent to the agent before proceeding, but keep the bonding
15406 * request structure. */
15407 if (device_is_bonding(device, NULL))
15408 device_cancel_authentication(device, FALSE);
15411 /* In the case of security mode 3 devices */
15412 bonding_attempt_complete(adapter, &ev->addr.bdaddr, ev->addr.type,
15415 /* If the device is scheduled to retry the bonding wait until the retry
15416 * happens. In other case, proceed with cancel the bondig.
15418 if (device && device_is_bonding(device, NULL)
15419 && !device_is_retrying(device)) {
15420 device_cancel_authentication(device, TRUE);
15421 device_bonding_failed(device, ev->status);
15424 #ifndef TIZEN_FEATURE_BLUEZ_MODIFY
15425 /* In the case the bonding was canceled or did exists, remove the device
15426 * when it is temporary. */
15427 if (device && !device_is_bonding(device, NULL)
15428 && device_is_temporary(device))
15429 btd_adapter_remove_device(adapter, device);
15433 static void remove_keys(struct btd_adapter *adapter,
15434 struct btd_device *device, uint8_t type)
15436 char device_addr[18];
15437 char filename[PATH_MAX];
15438 GKeyFile *key_file;
15439 GError *gerr = NULL;
15443 ba2str(device_get_address(device), device_addr);
15445 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
15446 if (device_get_rpa_exist(device) == true)
15447 ba2str(device_get_rpa(device), device_addr);
15450 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/%s/info",
15451 btd_adapter_get_storage_dir(adapter), device_addr);
15452 key_file = g_key_file_new();
15453 if (!g_key_file_load_from_file(key_file, filename, 0, &gerr)) {
15454 error("Unable to load key file from %s: (%s)", filename,
15456 g_error_free(gerr);
15459 if (type == BDADDR_BREDR) {
15460 g_key_file_remove_group(key_file, "LinkKey", NULL);
15462 g_key_file_remove_group(key_file, "LongTermKey", NULL);
15463 g_key_file_remove_group(key_file, "LocalSignatureKey", NULL);
15464 g_key_file_remove_group(key_file, "RemoteSignatureKey", NULL);
15465 g_key_file_remove_group(key_file, "IdentityResolvingKey", NULL);
15468 str = g_key_file_to_data(key_file, &length, NULL);
15469 if (!g_file_set_contents(filename, str, length, &gerr)) {
15470 error("Unable set contents for %s: (%s)", filename,
15472 g_error_free(gerr);
15476 g_key_file_free(key_file);
15479 static void unpaired_callback(uint16_t index, uint16_t length,
15480 const void *param, void *user_data)
15482 const struct mgmt_ev_device_unpaired *ev = param;
15483 struct btd_adapter *adapter = user_data;
15484 struct btd_device *device;
15487 if (length < sizeof(*ev)) {
15488 btd_error(adapter->dev_id, "Too small device unpaired event");
15492 ba2str(&ev->addr.bdaddr, addr);
15494 DBG("hci%u addr %s", index, addr);
15496 device = btd_adapter_find_device(adapter, &ev->addr.bdaddr,
15499 btd_warn(adapter->dev_id,
15500 "No device object for unpaired device %s", addr);
15504 remove_keys(adapter, device, ev->addr.type);
15505 device_set_unpaired(device, ev->addr.type);
15508 static void clear_devices_complete(uint8_t status, uint16_t length,
15509 const void *param, void *user_data)
15511 if (status != MGMT_STATUS_SUCCESS) {
15512 error("Failed to clear devices: %s (0x%02x)",
15513 mgmt_errstr(status), status);
15518 static int clear_devices(struct btd_adapter *adapter)
15520 struct mgmt_cp_remove_device cp;
15522 if (!btd_has_kernel_features(KERNEL_CONN_CONTROL))
15525 memset(&cp, 0, sizeof(cp));
15527 DBG("sending clear devices command for index %u", adapter->dev_id);
15529 if (mgmt_send(adapter->mgmt, MGMT_OP_REMOVE_DEVICE,
15530 adapter->dev_id, sizeof(cp), &cp,
15531 clear_devices_complete, adapter, NULL) > 0)
15534 btd_error(adapter->dev_id, "Failed to clear devices for index %u",
15540 static bool get_static_addr(struct btd_adapter *adapter)
15542 struct bt_crypto *crypto;
15544 GError *gerr = NULL;
15551 snprintf(mfg, sizeof(mfg), "0x%04x", adapter->manufacturer);
15553 file = g_key_file_new();
15554 if (!g_key_file_load_from_file(file, STORAGEDIR "/addresses", 0,
15556 error("Unable to load key file from %s: (%s)",
15557 STORAGEDIR "/addresses", gerr->message);
15558 g_error_free(gerr);
15560 addrs = g_key_file_get_string_list(file, "Static", mfg, &len, NULL);
15562 for (i = 0; i < len; i++) {
15565 str2ba(addrs[i], &addr);
15566 if (adapter_find(&addr))
15569 /* Usable address found in list */
15570 bacpy(&adapter->bdaddr, &addr);
15571 adapter->bdaddr_type = BDADDR_LE_RANDOM;
15577 addrs = g_renew(char *, addrs, len + 1);
15580 addrs = g_new(char *, len + 1);
15583 /* Initialize slot for new address */
15584 addrs[len - 1] = g_malloc(18);
15587 crypto = bt_crypto_new();
15589 error("Failed to open crypto");
15594 ret = bt_crypto_random_bytes(crypto, &adapter->bdaddr,
15595 sizeof(adapter->bdaddr));
15597 error("Failed to generate static address");
15598 bt_crypto_unref(crypto);
15602 bt_crypto_unref(crypto);
15604 adapter->bdaddr.b[5] |= 0xc0;
15605 adapter->bdaddr_type = BDADDR_LE_RANDOM;
15607 ba2str(&adapter->bdaddr, addrs[len - 1]);
15609 g_key_file_set_string_list(file, "Static", mfg,
15610 (const char **)addrs, len);
15612 str = g_key_file_to_data(file, &len, NULL);
15613 if (!g_file_set_contents(STORAGEDIR "/addresses", str, len, &gerr)) {
15614 error("Unable set contents for %s: (%s)",
15615 STORAGEDIR "/addresses", gerr->message);
15616 g_error_free(gerr);
15623 g_key_file_free(file);
15629 static bool set_static_addr(struct btd_adapter *adapter)
15631 struct mgmt_cp_set_static_address cp;
15633 /* dual-mode adapters must have a public address */
15634 if (adapter->supported_settings & MGMT_SETTING_BREDR)
15637 if (!(adapter->supported_settings & MGMT_SETTING_LE))
15640 DBG("Setting static address");
15642 if (!get_static_addr(adapter))
15645 bacpy(&cp.bdaddr, &adapter->bdaddr);
15646 if (mgmt_send(adapter->mgmt, MGMT_OP_SET_STATIC_ADDRESS,
15647 adapter->dev_id, sizeof(cp), &cp,
15648 NULL, NULL, NULL) > 0) {
15655 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
15656 static uint8_t *generate_irk(void)
15661 DBG("Generate IRK");
15663 fd = open("/dev/urandom", O_RDONLY);
15667 irk = g_malloc0(MGMT_IRK_SIZE);
15668 if (read(fd, irk, MGMT_IRK_SIZE) != MGMT_IRK_SIZE) {
15669 error("Cannot read random bytes");
15679 #define LOCAL_IRK_DIRNAME "/csa/bluetooth"
15680 #define LOCAL_IRK_FILENAME ".local_irk"
15682 static bool store_local_irk(struct btd_adapter *adapter)
15687 if (adapter->local_irk == NULL) {
15688 error("Local IRK is not proper");
15692 if (access(LOCAL_IRK_DIRNAME, F_OK) < 0) {
15693 if (mkdir(LOCAL_IRK_DIRNAME, 0755) < 0) {
15694 error("Cannot create a directory for local IRK : %s",
15700 fd = open(LOCAL_IRK_DIRNAME"/"LOCAL_IRK_FILENAME,
15701 O_WRONLY | O_CREAT | O_TRUNC, 0644);
15703 error("Cannot open a file for local IRK : %s", strerror(errno));
15707 ret = write(fd, adapter->local_irk, MGMT_IRK_SIZE);
15708 if (ret != MGMT_IRK_SIZE) {
15709 error("Cannot write local IRK [%d] : %s", ret, strerror(errno));
15712 unlink(LOCAL_IRK_DIRNAME"/"LOCAL_IRK_FILENAME);
15716 ret = fdatasync(fd);
15718 error("sync failed : %s", strerror(errno));
15724 static bool load_local_irk(struct btd_adapter *adapter)
15729 if (access(LOCAL_IRK_DIRNAME"/"LOCAL_IRK_FILENAME, F_OK) < 0) {
15730 adapter->local_irk = generate_irk();
15731 if (store_local_irk(adapter) == false) {
15732 error("Cannot store Local IRK");
15733 g_free(adapter->local_irk);
15740 if (adapter->local_irk) {
15741 DBG("Local IRK is already loaded");
15745 fd = open(LOCAL_IRK_DIRNAME"/"LOCAL_IRK_FILENAME, O_RDONLY);
15747 error("Cannot open local IRK file : %s", strerror(errno));
15751 adapter->local_irk = g_malloc0(MGMT_IRK_SIZE);
15753 ret = read(fd, adapter->local_irk, MGMT_IRK_SIZE);
15754 if (ret != MGMT_IRK_SIZE) {
15755 error("Cannot read local IRK [%d] : %s", ret, strerror(errno));
15756 g_free(adapter->local_irk);
15765 static void set_privacy_complete(uint8_t status, uint16_t length,
15766 const void *param, void *user_data)
15768 struct btd_adapter *adapter = user_data;
15770 if (status != MGMT_STATUS_SUCCESS)
15771 error("Setting privacy failed for hci%u: %s (0x%02x)",
15772 adapter->dev_id, mgmt_errstr(status), status);
15774 DBG("Privacy feature is set/unset successfully for hci%u",
15778 static bool set_privacy(struct btd_adapter *adapter, bool privacy)
15780 struct mgmt_cp_set_privacy cp;
15782 if (!adapter->local_irk) {
15783 error("Local IRK is not available");
15787 memset(&cp, 0, sizeof(cp));
15788 memcpy(cp.irk, adapter->local_irk, MGMT_IRK_SIZE);
15793 if (mgmt_send(adapter->mgmt, MGMT_OP_SET_PRIVACY,
15794 adapter->dev_id, sizeof(cp), &cp,
15795 set_privacy_complete, adapter, NULL) > 0)
15798 error("Failed to set privacy and load local irk for index %u",
15803 static void set_irk_complete(uint8_t status, uint16_t length,
15804 const void *param, void *user_data)
15806 struct btd_adapter *adapter = user_data;
15808 if (status != MGMT_STATUS_SUCCESS)
15809 error("Setting IRK is failed for hci%u: %s (0x%02x)",
15810 adapter->dev_id, mgmt_errstr(status), status);
15812 DBG("Setting IRK is succeed for hci%u", adapter->dev_id);
15815 static bool set_local_irk(struct btd_adapter *adapter)
15817 struct mgmt_cp_set_irk cp;
15819 if (!adapter->local_irk) {
15820 error("Local IRK is not available");
15824 memcpy(cp.irk, adapter->local_irk, MGMT_IRK_SIZE);
15826 if (mgmt_send(adapter->mgmt, MGMT_OP_SET_IRK,
15827 adapter->dev_id, sizeof(cp), &cp,
15828 set_irk_complete, adapter, NULL) > 0)
15831 error("Failed to set irk %u", adapter->dev_id);
15835 int btd_adapter_connect_ipsp(struct btd_adapter *adapter,
15836 const bdaddr_t *bdaddr,
15837 uint8_t bdaddr_type)
15840 struct mgmt_cp_connect_6lowpan cp;
15842 memset(&cp, 0, sizeof(cp));
15843 bacpy(&cp.addr.bdaddr, bdaddr);
15844 cp.addr.type = bdaddr_type;
15846 if (mgmt_send(adapter->mgmt, MGMT_OP_CONNECT_6LOWPAN,
15847 adapter->dev_id, sizeof(cp), &cp,
15848 NULL, NULL, NULL) > 0)
15854 int btd_adapter_disconnect_ipsp(struct btd_adapter *adapter,
15855 const bdaddr_t *bdaddr,
15856 uint8_t bdaddr_type)
15859 struct mgmt_cp_disconnect_6lowpan cp;
15861 memset(&cp, 0, sizeof(cp));
15862 bacpy(&cp.addr.bdaddr, bdaddr);
15863 cp.addr.type = bdaddr_type;
15865 if (mgmt_send(adapter->mgmt, MGMT_OP_DISCONNECT_6LOWPAN,
15866 adapter->dev_id, sizeof(cp), &cp,
15867 NULL, NULL, NULL) > 0)
15873 uint8_t btd_adapter_get_rpa_res_support_value(
15874 struct btd_adapter *adapter)
15876 return adapter->central_rpa_res_support;
15879 static void set_dev_rpa_res_support_complete(uint8_t status,
15880 uint16_t length, const void *param,
15883 if (status != MGMT_STATUS_SUCCESS)
15884 error("Failed to set RPA resolution support of device : %s (0x%02x)",
15885 mgmt_errstr(status), status);
15887 DBG("Set RPA resolution support successful");
15890 int btd_adapter_set_dev_rpa_res_support(struct btd_adapter *adapter,
15891 struct btd_device *device)
15894 struct mgmt_cp_set_dev_rpa_res_support cp;
15896 DBG("btd_adapter_set_dev_rpa_res_support called");
15898 memset(&cp, 0, sizeof(cp));
15900 bacpy(&cp.addr.bdaddr, device_get_address(device));
15901 cp.addr.type = btd_device_get_bdaddr_type(device);
15902 cp.res_support = device_get_rpa_res_char_value(device);
15904 if (mgmt_send(adapter->mgmt, MGMT_OP_SET_DEV_RPA_RES_SUPPORT,
15905 adapter->dev_id, sizeof(cp), &cp,
15906 set_dev_rpa_res_support_complete, NULL, NULL) > 0)
15913 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
15914 static gboolean adapter_start_idle_cb(gpointer user_data)
15916 struct btd_adapter *adapter = (struct btd_adapter*)user_data;
15918 adapter_start(adapter);
15924 static void set_blocked_keys_complete(uint8_t status, uint16_t length,
15925 const void *param, void *user_data)
15927 struct btd_adapter *adapter = user_data;
15929 if (status != MGMT_STATUS_SUCCESS) {
15930 btd_error(adapter->dev_id,
15931 "Failed to set blocked keys: %s (0x%02x)",
15932 mgmt_errstr(status), status);
15936 DBG("Successfully set blocked keys for index %u", adapter->dev_id);
15939 static bool set_blocked_keys(struct btd_adapter *adapter)
15941 uint8_t buffer[sizeof(struct mgmt_cp_set_blocked_keys) +
15942 sizeof(blocked_keys)] = { 0 };
15943 struct mgmt_cp_set_blocked_keys *cp =
15944 (struct mgmt_cp_set_blocked_keys *)buffer;
15947 cp->key_count = ARRAY_SIZE(blocked_keys);
15948 for (i = 0; i < cp->key_count; ++i) {
15949 cp->keys[i].type = blocked_keys[i].type;
15950 memcpy(cp->keys[i].val, blocked_keys[i].val,
15951 sizeof(cp->keys[i].val));
15954 return mgmt_send(mgmt_primary, MGMT_OP_SET_BLOCKED_KEYS,
15956 sizeof(buffer), buffer,
15957 set_blocked_keys_complete,
15961 #define EXP_FEAT(_uuid, _func) \
15967 static void set_exp_debug_complete(uint8_t status, uint16_t len,
15968 const void *param, void *user_data)
15970 struct btd_adapter *adapter = user_data;
15971 uint8_t action = btd_opts.experimental ? 0x01 : 0x00;
15974 error("Set Experimental Debug failed with status 0x%02x (%s)",
15975 status, mgmt_errstr(status));
15979 DBG("Experimental Debug successfully set");
15982 queue_push_tail(adapter->exps, (void *)debug_uuid.val);
15985 static void exp_debug_func(struct btd_adapter *adapter, uint8_t action)
15987 struct mgmt_cp_set_exp_feature cp;
15989 memset(&cp, 0, sizeof(cp));
15990 memcpy(cp.uuid, debug_uuid.val, 16);
15991 cp.action = action;
15993 if (mgmt_send(adapter->mgmt, MGMT_OP_SET_EXP_FEATURE,
15994 adapter->dev_id, sizeof(cp), &cp,
15995 set_exp_debug_complete, adapter, NULL) > 0)
15998 btd_error(adapter->dev_id, "Failed to set exp debug");
16001 static void le_simult_central_peripheral_func(struct btd_adapter *adapter,
16005 queue_push_tail(adapter->exps,
16006 (void *)le_simult_central_peripheral_uuid.val);
16009 static void quality_report_func(struct btd_adapter *adapter, uint8_t action)
16012 queue_push_tail(adapter->exps, (void *)quality_report_uuid.val);
16015 static void set_rpa_resolution_complete(uint8_t status, uint16_t len,
16016 const void *param, void *user_data)
16018 struct btd_adapter *adapter = user_data;
16019 uint8_t action = btd_opts.experimental ? 0x01 : 0x00;
16022 error("Set RPA Resolution failed with status 0x%02x (%s)",
16023 status, mgmt_errstr(status));
16027 DBG("RPA Resolution successfully set");
16030 queue_push_tail(adapter->exps, (void *)rpa_resolution_uuid.val);
16033 static void rpa_resolution_func(struct btd_adapter *adapter, uint8_t action)
16035 struct mgmt_cp_set_exp_feature cp;
16037 memset(&cp, 0, sizeof(cp));
16038 memcpy(cp.uuid, rpa_resolution_uuid.val, 16);
16039 cp.action = action;
16041 if (mgmt_send(adapter->mgmt, MGMT_OP_SET_EXP_FEATURE,
16042 adapter->dev_id, sizeof(cp), &cp,
16043 set_rpa_resolution_complete, adapter, NULL) > 0)
16046 btd_error(adapter->dev_id, "Failed to set RPA Resolution");
16049 static void codec_offload_complete(uint8_t status, uint16_t len,
16050 const void *param, void *user_data)
16052 struct btd_adapter *adapter = user_data;
16053 uint8_t action = btd_opts.experimental ? 0x01 : 0x00;
16056 error("Set Codec Offload failed with status 0x%02x (%s)",
16057 status, mgmt_errstr(status));
16061 DBG("Codec Offload successfully set");
16064 queue_push_tail(adapter->exps, (void *)codec_offload_uuid.val);
16067 static void codec_offload_func(struct btd_adapter *adapter, uint8_t action)
16069 struct mgmt_cp_set_exp_feature cp;
16071 memset(&cp, 0, sizeof(cp));
16072 memcpy(cp.uuid, codec_offload_uuid.val, 16);
16073 cp.action = action;
16075 if (mgmt_send(adapter->mgmt, MGMT_OP_SET_EXP_FEATURE,
16076 adapter->dev_id, sizeof(cp), &cp,
16077 codec_offload_complete, adapter, NULL) > 0)
16080 btd_error(adapter->dev_id, "Failed to set Codec Offload");
16083 static const struct exp_feat {
16084 const struct mgmt_exp_uuid *uuid;
16085 void (*func)(struct btd_adapter *adapter, uint8_t action);
16087 EXP_FEAT(&debug_uuid, exp_debug_func),
16088 EXP_FEAT(&le_simult_central_peripheral_uuid,
16089 le_simult_central_peripheral_func),
16090 EXP_FEAT(&quality_report_uuid, quality_report_func),
16091 EXP_FEAT(&rpa_resolution_uuid, rpa_resolution_func),
16092 EXP_FEAT(&codec_offload_uuid, codec_offload_func),
16095 static void read_exp_features_complete(uint8_t status, uint16_t length,
16096 const void *param, void *user_data)
16098 struct btd_adapter *adapter = user_data;
16099 const struct mgmt_rp_read_exp_features_info *rp = param;
16100 size_t feature_count = 0;
16103 DBG("index %u status 0x%02x", adapter->dev_id, status);
16105 if (status != MGMT_STATUS_SUCCESS) {
16106 btd_error(adapter->dev_id,
16107 "Failed to read exp features info: %s (0x%02x)",
16108 mgmt_errstr(status), status);
16112 if (length < sizeof(*rp)) {
16113 btd_error(adapter->dev_id, "Response too small");
16117 feature_count = le16_to_cpu(rp->feature_count);
16119 if (length < sizeof(*rp) + (sizeof(*rp->features) * feature_count)) {
16120 btd_error(adapter->dev_id, "Response too small");
16124 for (i = 0; i < feature_count; ++i) {
16126 for (j = 0; j < ARRAY_SIZE(exp_table); j++) {
16127 const struct exp_feat *feat = &exp_table[j];
16130 if (memcmp(rp->features[i].uuid, feat->uuid->val,
16131 sizeof(rp->features[i].uuid)))
16134 action = btd_experimental_enabled(feat->uuid->str);
16136 DBG("%s flags %u action %u", feat->uuid->str,
16137 rp->features[i].flags, action);
16139 /* If already set don't attempt to set it again */
16140 if (action == (rp->features[i].flags & BIT(0))) {
16142 queue_push_tail(adapter->exps,
16143 (void *)feat->uuid->val);
16148 feat->func(adapter, action);
16153 static void read_exp_features(struct btd_adapter *adapter)
16155 if (mgmt_send(adapter->mgmt, MGMT_OP_READ_EXP_FEATURES_INFO,
16156 adapter->dev_id, 0, NULL, read_exp_features_complete,
16157 adapter, NULL) > 0)
16160 btd_error(adapter->dev_id, "Failed to read exp features info");
16163 static void read_info_complete(uint8_t status, uint16_t length,
16164 const void *param, void *user_data)
16166 struct btd_adapter *adapter = user_data;
16167 const struct mgmt_rp_read_info *rp = param;
16168 uint32_t missing_settings;
16171 DBG("index %u status 0x%02x", adapter->dev_id, status);
16173 if (status != MGMT_STATUS_SUCCESS) {
16174 btd_error(adapter->dev_id,
16175 "Failed to read info for index %u: %s (0x%02x)",
16176 adapter->dev_id, mgmt_errstr(status), status);
16180 if (length < sizeof(*rp)) {
16181 btd_error(adapter->dev_id,
16182 "Too small read info complete response");
16187 * Store controller information for class of device, device
16188 * name, short name and settings.
16190 * During the lifetime of the controller these will be updated by
16191 * events and the information is required to keep the current
16192 * state of the controller.
16194 adapter->dev_class = rp->dev_class[0] | (rp->dev_class[1] << 8) |
16195 (rp->dev_class[2] << 16);
16196 adapter->name = g_strdup((const char *) rp->name);
16197 adapter->short_name = g_strdup((const char *) rp->short_name);
16199 adapter->manufacturer = btohs(rp->manufacturer);
16201 adapter->supported_settings = btohl(rp->supported_settings);
16202 adapter->current_settings = btohl(rp->current_settings);
16204 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
16205 adapter_check_version(adapter, rp->version);
16207 clear_uuids(adapter);
16208 clear_devices(adapter);
16210 if (bacmp(&rp->bdaddr, BDADDR_ANY) == 0) {
16211 if (!set_static_addr(adapter)) {
16212 btd_error(adapter->dev_id,
16213 "No Bluetooth address for index %u",
16218 bacpy(&adapter->bdaddr, &rp->bdaddr);
16219 if (!(adapter->supported_settings & MGMT_SETTING_LE))
16220 adapter->bdaddr_type = BDADDR_BREDR;
16222 adapter->bdaddr_type = BDADDR_LE_PUBLIC;
16225 missing_settings = adapter->current_settings ^
16226 adapter->supported_settings;
16228 /* If adapter supports PHY CONFIGURATION SETTING, then read PHY configuration and save them */
16229 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
16230 if (adapter->supported_settings & MGMT_SETTING_PHY_CONFIGURATION) {
16231 if (mgmt_send(adapter->mgmt, MGMT_OP_GET_PHY_CONFIGURATION, adapter->dev_id, 0, NULL,
16232 get_phy_configuration_resp, adapter, NULL) == 0)
16233 error("Unable to send %s cmd",
16234 mgmt_opstr(MGMT_OP_GET_PHY_CONFIGURATION));
16237 switch (btd_opts.mode) {
16239 if (missing_settings & MGMT_SETTING_SSP) {
16240 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
16241 if (btd_opts.pin_code || (btd_opts.class & 0x1f00) >> 8 == 0x05)
16242 set_mode(adapter, MGMT_OP_SET_SSP, 0x00);
16245 set_mode(adapter, MGMT_OP_SET_SSP, 0x01);
16247 if (missing_settings & MGMT_SETTING_LE)
16248 set_mode(adapter, MGMT_OP_SET_LE, 0x01);
16249 if (missing_settings & MGMT_SETTING_BREDR)
16250 set_mode(adapter, MGMT_OP_SET_BREDR, 0x01);
16252 case BT_MODE_BREDR:
16253 if (!(adapter->supported_settings & MGMT_SETTING_BREDR)) {
16254 btd_error(adapter->dev_id,
16255 "Ignoring adapter withouth BR/EDR support");
16259 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
16260 if (btd_opts.pin_code || (btd_opts.class & 0x1f00) >> 8 == 0x05)
16261 set_mode(adapter, MGMT_OP_SET_SSP, 0x00);
16263 set_mode(adapter, MGMT_OP_SET_SSP, 0x01);
16265 if (missing_settings & MGMT_SETTING_SSP)
16266 set_mode(adapter, MGMT_OP_SET_SSP, 0x01);
16268 if (missing_settings & MGMT_SETTING_BREDR)
16269 set_mode(adapter, MGMT_OP_SET_BREDR, 0x01);
16270 if (adapter->current_settings & MGMT_SETTING_LE)
16271 set_mode(adapter, MGMT_OP_SET_LE, 0x00);
16274 if (!(adapter->supported_settings & MGMT_SETTING_LE)) {
16275 btd_error(adapter->dev_id,
16276 "Ignoring adapter withouth LE support");
16280 if (missing_settings & MGMT_SETTING_LE)
16281 set_mode(adapter, MGMT_OP_SET_LE, 0x01);
16282 if (adapter->current_settings & MGMT_SETTING_BREDR)
16283 set_mode(adapter, MGMT_OP_SET_BREDR, 0x00);
16287 if (missing_settings & MGMT_SETTING_SECURE_CONN)
16288 set_mode(adapter, MGMT_OP_SET_SECURE_CONN, 0x01);
16290 if (adapter->supported_settings & MGMT_SETTING_PRIVACY)
16291 set_privacy(adapter, btd_opts.privacy);
16293 if (btd_opts.fast_conn &&
16294 (missing_settings & MGMT_SETTING_FAST_CONNECTABLE))
16295 set_mode(adapter, MGMT_OP_SET_FAST_CONNECTABLE, 0x01);
16297 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
16298 /* Set the RPA resolution value to '1' if privacy is supported */
16299 if (btd_opts.le_privacy &&
16300 adapter->supported_settings & MGMT_SETTING_PRIVACY)
16301 adapter->central_rpa_res_support = 0x01;
16304 err = adapter_register(adapter);
16306 btd_error(adapter->dev_id, "Unable to register new adapter");
16311 * Register all event notification handlers for controller.
16313 * The handlers are registered after a succcesful read of the
16314 * controller info. From now on they can track updates and
16317 mgmt_register(adapter->mgmt, MGMT_EV_NEW_SETTINGS, adapter->dev_id,
16318 new_settings_callback, adapter, NULL);
16320 mgmt_register(adapter->mgmt, MGMT_EV_CLASS_OF_DEV_CHANGED,
16322 dev_class_changed_callback,
16324 mgmt_register(adapter->mgmt, MGMT_EV_LOCAL_NAME_CHANGED,
16326 local_name_changed_callback,
16329 mgmt_register(adapter->mgmt, MGMT_EV_DISCOVERING,
16331 discovering_callback,
16334 mgmt_register(adapter->mgmt, MGMT_EV_DEVICE_FOUND,
16336 device_found_callback,
16339 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
16340 mgmt_register(adapter->mgmt, MGMT_EV_LE_DEVICE_FOUND,
16342 le_device_found_callback,
16346 mgmt_register(adapter->mgmt, MGMT_EV_DEVICE_DISCONNECTED,
16348 disconnected_callback,
16351 mgmt_register(adapter->mgmt, MGMT_EV_DEVICE_CONNECTED,
16353 connected_callback,
16356 mgmt_register(adapter->mgmt, MGMT_EV_CONNECT_FAILED,
16358 connect_failed_callback,
16361 mgmt_register(adapter->mgmt, MGMT_EV_DEVICE_UNPAIRED,
16366 mgmt_register(adapter->mgmt, MGMT_EV_AUTH_FAILED,
16368 auth_failed_callback,
16371 mgmt_register(adapter->mgmt, MGMT_EV_NEW_LINK_KEY,
16373 new_link_key_callback,
16376 mgmt_register(adapter->mgmt, MGMT_EV_NEW_LONG_TERM_KEY,
16378 new_long_term_key_callback,
16381 mgmt_register(adapter->mgmt, MGMT_EV_NEW_CSRK,
16386 mgmt_register(adapter->mgmt, MGMT_EV_NEW_IRK,
16391 mgmt_register(adapter->mgmt, MGMT_EV_NEW_CONN_PARAM,
16396 mgmt_register(adapter->mgmt, MGMT_EV_DEVICE_BLOCKED,
16398 device_blocked_callback,
16400 mgmt_register(adapter->mgmt, MGMT_EV_DEVICE_UNBLOCKED,
16402 device_unblocked_callback,
16405 mgmt_register(adapter->mgmt, MGMT_EV_PIN_CODE_REQUEST,
16407 pin_code_request_callback,
16410 mgmt_register(adapter->mgmt, MGMT_EV_USER_CONFIRM_REQUEST,
16412 user_confirm_request_callback,
16415 mgmt_register(adapter->mgmt, MGMT_EV_USER_PASSKEY_REQUEST,
16417 user_passkey_request_callback,
16420 mgmt_register(adapter->mgmt, MGMT_EV_PASSKEY_NOTIFY,
16422 user_passkey_notify_callback,
16425 mgmt_register(adapter->mgmt, MGMT_EV_CONTROLLER_RESUME,
16427 controller_resume_callback,
16430 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
16431 mgmt_register(adapter->mgmt, MGMT_EV_RSSI_ALERT,
16433 rssi_alert_callback,
16436 mgmt_register(adapter->mgmt, MGMT_EV_RAW_RSSI,
16438 get_raw_rssi_callback,
16441 mgmt_register(adapter->mgmt, MGMT_EV_RSSI_ENABLED,
16443 rssi_enabled_callback,
16446 mgmt_register(adapter->mgmt, MGMT_EV_RSSI_DISABLED,
16448 rssi_disabled_callback,
16451 mgmt_register(adapter->mgmt, MGMT_EV_HARDWARE_ERROR,
16453 hardware_error_callback,
16456 mgmt_register(adapter->mgmt, MGMT_EV_TX_TIMEOUT_ERROR,
16458 tx_timeout_error_callback,
16461 mgmt_register(adapter->mgmt, MGMT_EV_DEVICE_NAME_UPDATE,
16463 device_name_update_callback,
16466 mgmt_register(adapter->mgmt, MGMT_EV_MULTI_ADV_STATE_CHANGED,
16468 multi_adv_state_change_callback,
16471 mgmt_register(adapter->mgmt, MGMT_EV_6LOWPAN_CONN_STATE_CHANGED,
16473 bt_6lowpan_conn_state_change_callback,
16476 mgmt_register(adapter->mgmt, MGMT_EV_LE_DATA_LENGTH_CHANGED,
16478 bt_le_data_length_changed_callback,
16481 mgmt_register(adapter->mgmt, MGMT_EV_CONN_UPDATED,
16483 le_conn_update_completed_callback,
16486 mgmt_register(adapter->mgmt, MGMT_EV_RPA_CHANGED,
16488 rpa_changed_callback,
16492 set_dev_class(adapter);
16494 set_name(adapter, btd_adapter_get_name(adapter));
16496 if (btd_has_kernel_features(KERNEL_BLOCKED_KEYS_SUPPORTED) &&
16497 !set_blocked_keys(adapter)) {
16498 btd_error(adapter->dev_id,
16499 "Failed to set blocked keys for index %u",
16504 if (btd_opts.pairable &&
16505 !(adapter->current_settings & MGMT_SETTING_BONDABLE))
16506 set_mode(adapter, MGMT_OP_SET_BONDABLE, 0x01);
16508 if (!btd_has_kernel_features(KERNEL_CONN_CONTROL))
16509 set_mode(adapter, MGMT_OP_SET_CONNECTABLE, 0x01);
16510 else if (adapter->current_settings & MGMT_SETTING_CONNECTABLE)
16511 set_mode(adapter, MGMT_OP_SET_CONNECTABLE, 0x00);
16513 if (adapter->stored_discoverable && !adapter->discoverable_timeout)
16514 set_discoverable(adapter, 0x01, 0);
16516 if (btd_adapter_get_powered(adapter))
16517 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
16518 g_idle_add(adapter_start_idle_cb, adapter);
16520 adapter_start(adapter);
16522 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
16524 set_mode(adapter, MGMT_OP_SET_POWERED, 0x01);
16527 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
16528 init_le_static_address(adapter);
16535 * Remove adapter from list in case of a failure.
16537 * Leaving an adapter structure around for a controller that can
16538 * not be initilized makes no sense at the moment.
16540 * This is a simplification to avoid constant checks if the
16541 * adapter is ready to do anything.
16543 adapter_list = g_list_remove(adapter_list, adapter);
16545 btd_adapter_unref(adapter);
16548 static void reset_adv_monitors_complete(uint8_t status, uint16_t length,
16549 const void *param, void *user_data)
16551 const struct mgmt_rp_remove_adv_monitor *rp = param;
16553 if (status != MGMT_STATUS_SUCCESS) {
16554 error("Failed to reset Adv Monitors: %s (0x%02x)",
16555 mgmt_errstr(status), status);
16559 if (length < sizeof(*rp)) {
16560 error("Wrong size of remove Adv Monitor response for reset "
16561 "all Adv Monitors");
16565 DBG("Removed all Adv Monitors");
16568 static void reset_adv_monitors(uint16_t index)
16570 struct mgmt_cp_remove_adv_monitor cp;
16572 DBG("sending remove Adv Monitor command with handle 0");
16574 /* Handle 0 indicates to remove all */
16575 cp.monitor_handle = 0;
16576 if (mgmt_send(mgmt_primary, MGMT_OP_REMOVE_ADV_MONITOR, index,
16577 sizeof(cp), &cp, reset_adv_monitors_complete, NULL,
16582 error("Failed to reset Adv Monitors");
16585 static void index_added(uint16_t index, uint16_t length, const void *param,
16588 struct btd_adapter *adapter;
16590 DBG("index %u", index);
16592 adapter = btd_adapter_lookup(index);
16594 btd_warn(adapter->dev_id,
16595 "Ignoring index added for an already existing adapter");
16599 reset_adv_monitors(index);
16601 adapter = btd_adapter_new(index);
16604 "Unable to create new adapter for index %u", index);
16608 if (btd_has_kernel_features(KERNEL_EXP_FEATURES))
16609 read_exp_features(adapter);
16612 * Protect against potential two executions of read controller info.
16614 * In case the start of the daemon and the action of adding a new
16615 * controller coincide this function might be called twice.
16617 * To avoid the double execution of reading the controller info,
16618 * add the adapter already to the list. If an adapter is already
16619 * present, the second notification will cause a warning. If the
16620 * command fails the adapter is removed from the list again.
16622 adapter_list = g_list_append(adapter_list, adapter);
16624 DBG("sending read info command for index %u", index);
16626 if (mgmt_send(mgmt_primary, MGMT_OP_READ_INFO, index, 0, NULL,
16627 read_info_complete, adapter, NULL) > 0)
16630 btd_error(adapter->dev_id,
16631 "Failed to read controller info for index %u", index);
16633 adapter_list = g_list_remove(adapter_list, adapter);
16635 btd_adapter_unref(adapter);
16638 static void index_removed(uint16_t index, uint16_t length, const void *param,
16641 struct btd_adapter *adapter;
16643 DBG("index %u", index);
16645 adapter = btd_adapter_lookup(index);
16647 warn("Ignoring index removal for a non-existent adapter");
16651 adapter_unregister(adapter);
16654 static void read_index_list_complete(uint8_t status, uint16_t length,
16655 const void *param, void *user_data)
16657 const struct mgmt_rp_read_index_list *rp = param;
16661 if (status != MGMT_STATUS_SUCCESS) {
16662 error("Failed to read index list: %s (0x%02x)",
16663 mgmt_errstr(status), status);
16667 if (length < sizeof(*rp)) {
16668 error("Wrong size of read index list response");
16672 num = btohs(rp->num_controllers);
16674 DBG("Number of controllers: %d", num);
16676 if (num * sizeof(uint16_t) + sizeof(*rp) != length) {
16677 error("Incorrect packet size for index list response");
16681 for (i = 0; i < num; i++) {
16684 index = btohs(rp->index[i]);
16686 DBG("Found index %u", index);
16689 * Pretend to be index added event notification.
16691 * It is safe to just trigger the procedure for index
16692 * added notification. It does check against itself.
16694 index_added(index, 0, NULL, NULL);
16698 static void read_commands_complete(uint8_t status, uint16_t length,
16699 const void *param, void *user_data)
16701 const struct mgmt_rp_read_commands *rp = param;
16702 uint16_t num_commands, num_events;
16703 size_t expected_len;
16706 if (status != MGMT_STATUS_SUCCESS) {
16707 error("Failed to read supported commands: %s (0x%02x)",
16708 mgmt_errstr(status), status);
16712 if (length < sizeof(*rp)) {
16713 error("Wrong size of read commands response");
16717 num_commands = btohs(rp->num_commands);
16718 num_events = btohs(rp->num_events);
16720 DBG("Number of commands: %d", num_commands);
16721 DBG("Number of events: %d", num_events);
16723 expected_len = sizeof(*rp) + num_commands * sizeof(uint16_t) +
16724 num_events * sizeof(uint16_t);
16726 if (length < expected_len) {
16727 error("Too small reply for supported commands: (%u != %zu)",
16728 length, expected_len);
16732 for (i = 0; i < num_commands; i++) {
16733 uint16_t op = get_le16(rp->opcodes + i);
16736 case MGMT_OP_ADD_DEVICE:
16737 DBG("enabling kernel-side connection control");
16738 kernel_features |= KERNEL_CONN_CONTROL;
16740 case MGMT_OP_SET_BLOCKED_KEYS:
16741 DBG("kernel supports the set_blocked_keys op");
16742 kernel_features |= KERNEL_BLOCKED_KEYS_SUPPORTED;
16744 case MGMT_OP_SET_DEF_SYSTEM_CONFIG:
16745 DBG("kernel supports set system confic");
16746 kernel_features |= KERNEL_SET_SYSTEM_CONFIG;
16748 case MGMT_OP_READ_EXP_FEATURES_INFO:
16749 DBG("kernel supports exp features");
16750 kernel_features |= KERNEL_EXP_FEATURES;
16752 case MGMT_OP_ADD_EXT_ADV_PARAMS:
16753 DBG("kernel supports ext adv commands");
16754 kernel_features |= KERNEL_HAS_EXT_ADV_ADD_CMDS;
16756 case MGMT_OP_READ_CONTROLLER_CAP:
16757 DBG("kernel supports controller cap command");
16758 kernel_features |= KERNEL_HAS_CONTROLLER_CAP_CMD;
16765 for (i = 0; i < num_events; i++) {
16766 uint16_t ev = get_le16(rp->opcodes + num_commands + i);
16769 case MGMT_EV_CONTROLLER_RESUME:
16770 DBG("kernel supports suspend/resume events");
16771 kernel_features |= KERNEL_HAS_RESUME_EVT;
16777 static void read_version_complete(uint8_t status, uint16_t length,
16778 const void *param, void *user_data)
16780 const struct mgmt_rp_read_version *rp = param;
16782 if (status != MGMT_STATUS_SUCCESS) {
16783 error("Failed to read version information: %s (0x%02x)",
16784 mgmt_errstr(status), status);
16788 if (length < sizeof(*rp)) {
16789 error("Wrong size of read version response");
16793 mgmt_version = rp->version;
16794 mgmt_revision = btohs(rp->revision);
16796 info("Bluetooth management interface %u.%u initialized",
16797 mgmt_version, mgmt_revision);
16799 if (mgmt_version < 1) {
16800 error("Version 1.0 or later of management interface required");
16804 DBG("sending read supported commands command");
16807 * It is irrelevant if this command succeeds or fails. In case of
16808 * failure safe settings are assumed.
16810 mgmt_send(mgmt_primary, MGMT_OP_READ_COMMANDS,
16811 MGMT_INDEX_NONE, 0, NULL,
16812 read_commands_complete, NULL, NULL);
16814 mgmt_register(mgmt_primary, MGMT_EV_INDEX_ADDED, MGMT_INDEX_NONE,
16815 index_added, NULL, NULL);
16816 mgmt_register(mgmt_primary, MGMT_EV_INDEX_REMOVED, MGMT_INDEX_NONE,
16817 index_removed, NULL, NULL);
16819 DBG("sending read index list command");
16821 if (mgmt_send(mgmt_primary, MGMT_OP_READ_INDEX_LIST,
16822 MGMT_INDEX_NONE, 0, NULL,
16823 read_index_list_complete, NULL, NULL) > 0)
16826 error("Failed to read controller index list");
16829 static void mgmt_debug(const char *str, void *user_data)
16831 const char *prefix = user_data;
16833 info("%s%s", prefix, str);
16836 int adapter_init(void)
16838 dbus_conn = btd_get_dbus_connection();
16840 mgmt_primary = mgmt_new_default();
16841 if (!mgmt_primary) {
16842 error("Failed to access management interface");
16846 if (getenv("MGMT_DEBUG"))
16847 mgmt_set_debug(mgmt_primary, mgmt_debug, "mgmt: ", NULL);
16849 DBG("sending read version command");
16851 if (mgmt_send(mgmt_primary, MGMT_OP_READ_VERSION,
16852 MGMT_INDEX_NONE, 0, NULL,
16853 read_version_complete, NULL, NULL) > 0)
16856 error("Failed to read management version information");
16861 void adapter_cleanup(void)
16863 g_list_free(adapter_list);
16866 struct btd_adapter *adapter = adapters->data;
16868 adapter_remove(adapter);
16869 adapters = g_slist_remove(adapters, adapter);
16870 btd_adapter_unref(adapter);
16874 * In case there is another reference active, clear out
16875 * registered handlers for index added and index removed.
16877 * This is just an extra precaution to be safe, and in
16878 * reality should not make a difference.
16880 mgmt_unregister_index(mgmt_primary, MGMT_INDEX_NONE);
16883 * In case there is another reference active, cancel
16884 * all pending global commands.
16886 * This is just an extra precaution to avoid callbacks
16887 * that potentially then could leak memory or access
16888 * an invalid structure.
16890 mgmt_cancel_index(mgmt_primary, MGMT_INDEX_NONE);
16892 mgmt_unref(mgmt_primary);
16893 mgmt_primary = NULL;
16898 void adapter_shutdown(void)
16904 powering_down = true;
16906 for (list = g_list_first(adapter_list); list;
16907 list = g_list_next(list)) {
16908 struct btd_adapter *adapter = list->data;
16910 if (!(adapter->current_settings & MGMT_SETTING_POWERED))
16913 clear_discoverable(adapter);
16914 remove_temporary_devices(adapter);
16915 set_mode(adapter, MGMT_OP_SET_POWERED, 0x00);
16917 adapter_remaining++;
16920 if (!adapter_remaining)
16925 * Check if workaround for broken ATT server socket behavior is needed
16926 * where we need to connect an ATT client socket before pairing to get
16927 * early access to the ATT channel.
16929 bool btd_le_connect_before_pairing(void)
16931 if (MGMT_VERSION(mgmt_version, mgmt_revision) < MGMT_VERSION(1, 4))
16937 bool btd_has_kernel_features(uint32_t features)
16939 return !!(kernel_features & features);
16941 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
16942 int btd_adapter_set_streaming_mode(struct btd_adapter *adapter,
16943 const bdaddr_t *bdaddr, gboolean enable)
16945 struct mgmt_cp_set_streaming_mode cp;
16948 ba2str(bdaddr, addr);
16949 DBG("hci%u device %s", adapter->dev_id, addr);
16951 memset(&cp, 0, sizeof(cp));
16953 cp.streaming_mode = enable ? 1 : 0;
16954 bacpy(&cp.bdaddr, bdaddr);
16956 if (mgmt_send(adapter->mgmt, MGMT_OP_SET_STREAMING_MODE,
16957 adapter->dev_id, sizeof(cp), &cp,
16958 NULL, NULL, NULL) > 0)
16964 void adapter_send_event(const char *event)
16966 struct btd_adapter *adapter = btd_adapter_get_default();
16967 if (adapter == NULL) {
16968 error("adapter is NULL");
16972 g_dbus_emit_signal(dbus_conn, adapter->path,
16973 ADAPTER_INTERFACE, event,
16974 DBUS_TYPE_INVALID);