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 /* 6fbaf188-05e0-496a-9885-d6ddfdb4e03e */
160 static const struct mgmt_exp_uuid iso_socket_uuid = {
161 .val = { 0x3e, 0xe0, 0xb4, 0xfd, 0xdd, 0xd6, 0x85, 0x98,
162 0x6a, 0x49, 0xe0, 0x05, 0x88, 0xf1, 0xba, 0x6f },
163 .str = "6fbaf188-05e0-496a-9885-d6ddfdb4e03e"
166 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
167 #define ADV_DATA_MAX_LENGTH 31
168 #define SCAN_RESPONSE_DATA_LENGTH_MAX 31
169 #define EIR_MANUFACTURER_DATA_LENGTH_MAX 100
171 #define LE_BEARER_POSTFIX " LE"
172 #define LE_BEARER_POSTFIX_LEN 3
173 #endif /* TIZEN_FEATURE_BLUEZ_MODIFY */
176 static DBusConnection *dbus_conn = NULL;
178 static uint32_t kernel_features = 0;
180 static GList *adapter_list = NULL;
181 static unsigned int adapter_remaining = 0;
182 static bool powering_down = false;
184 static GSList *adapters = NULL;
186 static struct mgmt *mgmt_primary = NULL;
188 static uint8_t mgmt_version = 0;
189 static uint8_t mgmt_revision = 0;
191 static GSList *adapter_drivers = NULL;
193 static GSList *disconnect_list = NULL;
194 static GSList *conn_fail_list = NULL;
196 struct link_key_info {
198 unsigned char key[16];
204 struct smp_ltk_info {
207 uint8_t authenticated;
226 uint16_t min_interval;
227 uint16_t max_interval;
232 struct discovery_filter {
242 struct discovery_client {
243 struct btd_adapter *adapter;
247 struct discovery_filter *discovery_filter;
250 struct service_auth {
256 struct btd_device *device;
257 struct btd_adapter *adapter;
258 struct agent *agent; /* NULL for queued auths */
261 struct btd_adapter_pin_cb_iter {
262 GSList *it; /* current callback function */
263 unsigned int attempt; /* numer of times it() was called */
264 /* When the iterator reaches the end, it is NULL and attempt is 0 */
268 struct btd_adapter *adapter;
273 ADAPTER_POWER_STATE_OFF,
274 ADAPTER_POWER_STATE_ON,
275 ADAPTER_POWER_STATE_ON_DISABLING,
276 ADAPTER_POWER_STATE_OFF_ENABLING,
277 ADAPTER_POWER_STATE_OFF_BLOCKED,
280 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
282 int slot_id; /* Reservied slot id is 0 (Single adv) */
283 bool status; /* Advertising status */
286 static GSList *read_requests = NULL;
288 struct le_data_length_read_request {
289 struct btd_adapter *adapter;
293 struct le_batching_request {
294 struct btd_adapter *adapter;
298 struct le_batching_set_param_request {
299 struct btd_adapter *adapter;
311 bdaddr_t bdaddr; /* controller Bluetooth address */
312 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
313 bdaddr_t le_static_addr;
316 uint8_t bdaddr_type; /* address type */
317 uint32_t dev_class; /* controller class of device */
318 char *name; /* controller device name */
319 char *short_name; /* controller short name */
320 uint32_t supported_settings; /* controller supported settings */
321 uint32_t pending_settings; /* pending controller settings */
322 uint32_t power_state; /* the power state */
323 uint32_t current_settings; /* current controller settings */
325 char *path; /* adapter object path */
326 uint16_t manufacturer; /* adapter manufacturer */
327 uint8_t major_class; /* configured major class */
328 uint8_t minor_class; /* configured minor class */
329 char *system_name; /* configured system name */
330 char *modalias; /* device id (modalias) */
331 bool stored_discoverable; /* stored discoverable mode */
332 uint32_t discoverable_timeout; /* discoverable time(sec) */
333 uint32_t pairable_timeout; /* pairable time(sec) */
335 char *current_alias; /* current adapter name alias */
336 char *stored_alias; /* stored adapter name alias */
337 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
338 uint8_t *local_irk; /* adapter local IRK */
340 bool ipsp_intialized; /* Ipsp Initialization state */
341 struct le_data_length_read_handler *read_handler;
342 struct le_data_length_read_default_data_length_handler *def_read_handler;
343 #ifdef TIZEN_FEATURE_BLUEZ_BATTERY_WATCH
344 guint charging_watch;
345 guint charging_timeout;
346 charging_state_e charging;
347 #endif /* TIZEN_FEATURE_BLUEZ_BATTERY_WATCH */
350 bool discovering; /* discovering property state */
351 bool filtered_discovery; /* we are doing filtered discovery */
352 bool no_scan_restart_delay; /* when this flag is set, restart scan
354 uint8_t discovery_type; /* current active discovery type */
355 uint8_t discovery_enable; /* discovery enabled/disabled */
356 bool discovery_suspended; /* discovery has been suspended */
357 bool discovery_discoverable; /* discoverable while discovering */
358 GSList *discovery_list; /* list of discovery clients */
359 GSList *set_filter_list; /* list of clients that specified
360 * filter, but don't scan yet
362 /* current discovery filter, if any */
363 struct mgmt_cp_start_service_discovery *current_discovery_filter;
365 struct discovery_client *client; /* active discovery client */
367 GSList *discovery_found; /* list of found devices */
368 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
369 guint le_discovery_idle_timeout; /* timeout between le discovery runs */
371 unsigned int discovery_idle_timeout; /* timeout between discovery
374 unsigned int passive_scan_timeout; /* timeout between passive scans */
376 unsigned int pairable_timeout_id; /* pairable timeout id */
377 guint auth_idle_id; /* Pending authorization dequeue */
378 GQueue *auths; /* Ongoing and pending auths */
379 bool pincode_requested; /* PIN requested during last bonding */
380 GSList *connections; /* Connected devices */
381 GSList *devices; /* Devices structure pointers */
382 GSList *connect_list; /* Devices to connect when found */
383 struct btd_device *connect_le; /* LE device waiting to be connected */
384 sdp_list_t *services; /* Services associated to adapter */
386 struct btd_gatt_database *database;
387 struct btd_adv_manager *adv_manager;
389 struct btd_adv_monitor_manager *adv_monitor_manager;
391 struct btd_battery_provider_manager *battery_provider_manager;
392 GHashTable *allowed_uuid_set; /* Set of allowed service UUIDs */
394 gboolean initialized;
395 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
396 GSList *adv_list; /* List of advertising instance */
397 bool advertising; /* Advertising active */
398 gchar *version; /* Bluetooth Version */
399 uint8_t adv_tx_power;
400 uint8_t adv_restart_instance;
401 guint adv_restart_timeout;
402 bool le_discovering; /* LE Discovery active */
403 GSList *le_discovery_list; /* list of LE discovery clients */
406 GSList *pin_callbacks;
407 GSList *msd_callbacks;
412 struct oob_handler *oob_handler;
414 unsigned int db_id; /* Service event handler for GATT db */
415 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
416 uint8_t central_rpa_res_support;
417 bluetooth_a2dp_role_t a2dp_role;
418 #ifdef TIZEN_FEATURE_PLATFROM_SCAN_FILTER
419 bool scan_filter_support; /* platform's scan filtering support */
420 uint8_t scan_type; /* scan type */
421 GSList *scan_params; /* scan filter parameters */
422 GSList *addr_filters; /* adress scan filters list */
423 GSList *service_data_changed_filters; /* service data changed scan filters list */
424 GSList *service_uuid_filters; /* service uuid scan filters list */
425 GSList *solicit_data_filters; /* solicitation data scan filters list */
426 GSList *local_name_filters; /* local name scan filters list */
427 GSList *manufaturer_data_filters; /* manufacturer data scan filters list */
428 GSList *service_data_filters; /* service data scan filters list */
431 bool is_default; /* true if adapter is default one */
433 struct queue *exp_pending;
435 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
436 bool le_2m_phy_supported;
437 bool le_coded_phy_supported;
438 guint le_batching_available_pkts;
442 static char *adapter_power_state_str(uint32_t power_state)
444 switch (power_state) {
445 case ADAPTER_POWER_STATE_OFF:
447 case ADAPTER_POWER_STATE_ON:
449 case ADAPTER_POWER_STATE_ON_DISABLING:
450 return "on-disabling";
451 case ADAPTER_POWER_STATE_OFF_ENABLING:
452 return "off-enabling";
453 case ADAPTER_POWER_STATE_OFF_BLOCKED:
454 return "off-blocked";
456 DBG("Invalid power state %d", power_state);
461 ADAPTER_AUTHORIZE_DISCONNECTED = 0,
462 ADAPTER_AUTHORIZE_CHECK_CONNECTED
463 } adapter_authorize_type;
465 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
472 static struct btd_adapter *btd_adapter_lookup(uint16_t index)
476 for (list = g_list_first(adapter_list); list;
477 list = g_list_next(list)) {
478 struct btd_adapter *adapter = list->data;
480 if (adapter->dev_id == index)
487 struct btd_adapter *btd_adapter_get_default(void)
491 for (list = g_list_first(adapter_list); list;
492 list = g_list_next(list)) {
493 struct btd_adapter *adapter = list->data;
495 if (adapter->is_default)
502 bool btd_adapter_is_default(struct btd_adapter *adapter)
507 return adapter->is_default;
510 uint16_t btd_adapter_get_index(struct btd_adapter *adapter)
513 return MGMT_INDEX_NONE;
515 return adapter->dev_id;
518 static gboolean process_auth_queue(gpointer user_data);
520 static void dev_class_changed_callback(uint16_t index, uint16_t length,
521 const void *param, void *user_data)
523 struct btd_adapter *adapter = user_data;
524 const struct mgmt_cod *rp = param;
527 if (length < sizeof(*rp)) {
528 btd_error(adapter->dev_id,
529 "Wrong size of class of device changed parameters");
533 dev_class = rp->val[0] | (rp->val[1] << 8) | (rp->val[2] << 16);
535 if (dev_class == adapter->dev_class)
538 DBG("Class: 0x%06x", dev_class);
540 adapter->dev_class = dev_class;
542 g_dbus_emit_property_changed(dbus_conn, adapter->path,
543 ADAPTER_INTERFACE, "Class");
546 static void set_dev_class_complete(uint8_t status, uint16_t length,
547 const void *param, void *user_data)
549 struct btd_adapter *adapter = user_data;
551 if (status != MGMT_STATUS_SUCCESS) {
552 btd_error(adapter->dev_id,
553 "Failed to set device class: %s (0x%02x)",
554 mgmt_errstr(status), status);
559 * The parameters are identical and also the task that is
560 * required in both cases. So it is safe to just call the
561 * event handling functions here.
563 dev_class_changed_callback(adapter->dev_id, length, param, adapter);
566 static void set_dev_class(struct btd_adapter *adapter)
568 struct mgmt_cp_set_dev_class cp;
571 * If the controller does not support BR/EDR operation,
572 * there is no point in trying to set a major and minor
575 * This is an optimization for Low Energy only controllers.
577 if (!(adapter->supported_settings & MGMT_SETTING_BREDR))
580 memset(&cp, 0, sizeof(cp));
583 * Silly workaround for a really stupid kernel bug :(
585 * All current kernel versions assign the major and minor numbers
586 * straight to dev_class[0] and dev_class[1] without considering
587 * the proper bit shifting.
589 * To make this work, shift the value in userspace for now until
590 * we get a fixed kernel version.
592 cp.major = adapter->major_class & 0x1f;
593 cp.minor = adapter->minor_class << 2;
595 DBG("sending set device class command for index %u", adapter->dev_id);
597 if (mgmt_send(adapter->mgmt, MGMT_OP_SET_DEV_CLASS,
598 adapter->dev_id, sizeof(cp), &cp,
599 set_dev_class_complete, adapter, NULL) > 0)
602 btd_error(adapter->dev_id,
603 "Failed to set class of device for index %u", adapter->dev_id);
606 void btd_adapter_set_class(struct btd_adapter *adapter, uint8_t major,
609 if (adapter->major_class == major && adapter->minor_class == minor)
612 DBG("class: major %u minor %u", major, minor);
614 adapter->major_class = major;
615 adapter->minor_class = minor;
617 set_dev_class(adapter);
620 static uint8_t get_mode(const char *mode)
622 if (strcasecmp("off", mode) == 0)
624 else if (strcasecmp("connectable", mode) == 0)
625 return MODE_CONNECTABLE;
626 else if (strcasecmp("discoverable", mode) == 0)
627 return MODE_DISCOVERABLE;
632 const char *btd_adapter_get_storage_dir(struct btd_adapter *adapter)
636 if (adapter->bdaddr_type == BDADDR_LE_RANDOM) {
637 strcpy(dir, "static-");
638 ba2str(&adapter->bdaddr, dir + 7);
640 ba2str(&adapter->bdaddr, dir);
646 uint8_t btd_adapter_get_address_type(struct btd_adapter *adapter)
648 return adapter->bdaddr_type;
651 static void store_adapter_info(struct btd_adapter *adapter)
655 char filename[PATH_MAX];
658 gboolean discoverable;
660 key_file = g_key_file_new();
662 if (adapter->pairable_timeout != btd_opts.pairto)
663 g_key_file_set_integer(key_file, "General", "PairableTimeout",
664 adapter->pairable_timeout);
666 if ((adapter->current_settings & MGMT_SETTING_DISCOVERABLE) &&
667 !adapter->discoverable_timeout)
670 discoverable = FALSE;
672 g_key_file_set_boolean(key_file, "General", "Discoverable",
675 if (adapter->discoverable_timeout != btd_opts.discovto)
676 g_key_file_set_integer(key_file, "General",
677 "DiscoverableTimeout",
678 adapter->discoverable_timeout);
680 if (adapter->stored_alias)
681 g_key_file_set_string(key_file, "General", "Alias",
682 adapter->stored_alias);
683 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
684 /* Store A2DP Role */
685 if (adapter->a2dp_role == BLUETOOTH_A2DP_SINK_ROLE)
686 g_key_file_set_string(key_file, "General", "DefaultA2DPRole", "sink");
687 else if (adapter->a2dp_role == BLUETOOTH_A2DP_BOTH_ROLE)
688 g_key_file_set_string(key_file, "General", "DefaultA2DPRole", "both");
690 g_key_file_set_string(key_file, "General", "DefaultA2DPRole", "source");
693 create_filename(filename, PATH_MAX, "/%s/settings",
694 btd_adapter_get_storage_dir(adapter));
695 create_file(filename, 0600);
697 str = g_key_file_to_data(key_file, &length, NULL);
698 if (!g_file_set_contents(filename, str, length, &gerr)) {
699 error("Unable set contents for %s: (%s)", filename,
705 g_key_file_free(key_file);
708 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
709 bluetooth_a2dp_role_t btd_adapter_get_a2dp_role(struct btd_adapter *adapter)
712 return BLUETOOTH_A2DP_SOURCE_ROLE;
714 return adapter->a2dp_role;
717 void btd_adapter_set_a2dp_role(struct btd_adapter *adapter, bluetooth_a2dp_role_t role)
720 DBG("Could not set a2dp role");
724 if (role == BLUETOOTH_A2DP_SOURCE_ROLE) {
725 DBG("Set audio source role");
726 adapter->a2dp_role = BLUETOOTH_A2DP_SOURCE_ROLE;
727 } else if (role == BLUETOOTH_A2DP_SINK_ROLE) {
728 DBG("Set audio sink role");
729 adapter->a2dp_role = BLUETOOTH_A2DP_SINK_ROLE;
730 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
731 } else if (role == BLUETOOTH_A2DP_BOTH_ROLE) {
732 DBG("Set audio both role");
733 adapter->a2dp_role = BLUETOOTH_A2DP_BOTH_ROLE;
737 store_adapter_info(adapter);
740 void btd_adapter_emit_a2dp_role_changed(struct btd_adapter *adapter)
743 DBG("Could not emit signal for a2dp role");
747 DBG("A2dp role: %u", adapter->a2dp_role);
749 g_dbus_emit_property_changed(dbus_conn, adapter->path,
750 ADAPTER_INTERFACE, "A2dpRole");
754 static void trigger_pairable_timeout(struct btd_adapter *adapter);
755 static void adapter_start(struct btd_adapter *adapter);
756 static void adapter_stop(struct btd_adapter *adapter);
757 static void trigger_passive_scanning(struct btd_adapter *adapter);
758 static bool set_mode(struct btd_adapter *adapter, uint16_t opcode,
760 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
761 static bool load_local_irk(struct btd_adapter *adapter);
762 static bool set_local_irk(struct btd_adapter *adapter);
763 static bool set_privacy(struct btd_adapter *adapter, bool privacy);
766 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
767 #ifdef TIZEN_FEATURE_BLUEZ_BATTERY_WATCH
768 static gboolean charging_state_timeout_cb(gpointer user_data)
770 struct btd_adapter *adapter = user_data;
771 int bredr_pkt_type = ACL_PTYPE_MASK;
773 adapter->charging_timeout = 0;
775 DBG("Set all connections to BR/EDR type");
776 g_slist_foreach(adapter->devices, device_change_pkt_type,
777 (gpointer)bredr_pkt_type);
782 static void set_charging_state(struct btd_adapter *adapter,
783 charging_state_e state)
785 int br_pkt_type = ACL_PTYPE_MASK |
786 HCI_2DH1 | HCI_2DH3 | HCI_2DH5 |
787 HCI_3DH1 | HCI_3DH3 | HCI_3DH5;
789 if (adapter->charging == state)
792 DBG("old charging state : %d, new charging_state : %d",
793 adapter->charging, state);
796 * Only none / wire charging <-> wireless charging state change should
799 if ((adapter->charging == NONE_CHARGING && state == WIRE_CHARGING) ||
800 (adapter->charging == WIRE_CHARGING && state == NONE_CHARGING)) {
801 DBG("Just update charging state");
802 adapter->charging = state;
806 if (adapter->charging_timeout) {
807 g_source_remove(adapter->charging_timeout);
808 adapter->charging_timeout = 0;
811 adapter->charging = state;
812 if (adapter->charging == NONE_CHARGING ||
813 adapter->charging == WIRE_CHARGING) {
814 DBG("Trigger timeout to set connection to BR/EDR type");
815 adapter->charging_timeout = g_timeout_add(2000,
816 charging_state_timeout_cb, adapter);
817 } else if (adapter->charging == WIRELESS_CHARGING) {
818 DBG("Set all connections to BR type");
819 g_slist_foreach(adapter->devices, device_change_pkt_type,
820 (gpointer)br_pkt_type);
826 static gboolean charging_state_changed(DBusConnection *connection,
827 DBusMessage *msg, void *user_data)
829 struct btd_adapter *adapter = user_data;
832 DBG("charging_state_changed");
834 if (!dbus_message_get_args(msg, NULL, DBUS_TYPE_INT32, &state,
838 set_charging_state(adapter, state);
843 charging_state_e get_charging_state(struct btd_adapter *adapter)
845 DBG("charging_state: %d", adapter->charging);
846 return adapter->charging;
848 #endif /* TIZEN_FEATURE_BLUEZ_BATTERY_WATCH */
850 static int compare_slot(gconstpointer a, gconstpointer b)
852 const struct adv_info *adv = a;
853 const int id = *(int*)b;
855 return (adv->slot_id == id ? 0 : -1);
858 static struct adv_info *find_advertiser(struct btd_adapter *adapter,
863 list = g_slist_find_custom(adapter->adv_list, &slot_id,
871 static struct adv_info *create_advertiser(struct btd_adapter *adapter,
874 struct adv_info *adv;
879 adv = find_advertiser(adapter, slot_id);
881 DBG("Aleady existed. solt_id [%d]", slot_id);
885 DBG("Create adv slot id : %d", slot_id);
887 adv = g_new0(struct adv_info, 1);
891 adv->slot_id = slot_id;
893 adapter->adv_list = g_slist_append(adapter->adv_list, adv);
898 static void advertising_state_changed(struct btd_adapter *adapter,
899 int slot_id, bool enabled)
901 struct adv_info *adv;
908 adv = find_advertiser(adapter, slot_id);
910 DBG("Unable to find advertiser [%d]", slot_id);
914 adv->status = enabled;
915 DBG("slot_id %d, status %d", adv->slot_id, adv->status);
917 g_dbus_emit_signal(dbus_conn, adapter->path,
918 ADAPTER_INTERFACE, "AdvertisingEnabled",
919 DBUS_TYPE_INT32, &id,
920 DBUS_TYPE_BOOLEAN, &state,
924 static void clear_advertiser_cb(gpointer data, gpointer user_data)
926 struct adv_info *adv = data;
927 struct btd_adapter *adapter = user_data;
930 advertising_state_changed(adapter, adv->slot_id, 0);
933 static void advertiser_cleanup(struct btd_adapter *adapter)
935 if (!adapter->adv_list)
938 g_slist_foreach(adapter->adv_list, clear_advertiser_cb, adapter);
939 g_slist_free(adapter->adv_list);
940 adapter->adv_list = NULL;
943 static void update_advertiser_address(gpointer data, gpointer user_data)
945 struct adv_info *adv = data;
946 struct btd_adapter *adapter = user_data;
948 if (adv->slot_id > 0 && adv->status == 1)
949 adapter_le_set_random_address(adapter, &adapter->rpa, adv->slot_id);
952 static void rpa_changed_callback(uint16_t index, uint16_t length,
953 const void *param, void *user_data)
955 const struct mgmt_ev_rpa_changed *ev = param;
956 struct btd_adapter *adapter = user_data;
959 if (length < sizeof(*ev)) {
960 error("Too small rpa changed event");
964 ba2str(&ev->bdaddr, addr);
965 DBG("RPA changed %s", addr);
966 bacpy(&adapter->rpa, &ev->bdaddr);
968 if (!adapter->adv_list)
971 g_slist_foreach(adapter->adv_list, update_advertiser_address, adapter);
976 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
977 #define OCF_PAGE_SCAN_TIMEOUT 0x0018
978 #define OGF_PAGE_SCAN_TIMEOUT 0x03
981 uint16_t timeout; /* Value */
982 } __attribute__ ((packed)) hci_page_scan_timeout;
983 #define HCI_PAGE_SCAN_TIMEOUT_CP_SIZE 2
985 static gboolean send_sprd_page_scan_timeout(gint value)
988 hci_page_scan_timeout cp;
990 dd = hci_open_dev(0);
992 if (hci_send_cmd(dd, OGF_PAGE_SCAN_TIMEOUT, OCF_PAGE_SCAN_TIMEOUT,
993 HCI_PAGE_SCAN_TIMEOUT_CP_SIZE, &cp) < 0) {
994 DBG("Error: While setting Page Timeout value");
998 DBG("Page Scan Timeout Value Patch %d", value);
1006 static void settings_changed(struct btd_adapter *adapter, uint32_t settings)
1008 uint32_t changed_mask;
1010 changed_mask = adapter->current_settings ^ settings;
1012 adapter->current_settings = settings;
1013 adapter->pending_settings &= ~changed_mask;
1015 DBG("Changed settings: 0x%08x", changed_mask);
1016 DBG("Pending settings: 0x%08x", adapter->pending_settings);
1018 if (changed_mask & MGMT_SETTING_POWERED) {
1019 g_dbus_emit_property_changed(dbus_conn, adapter->path,
1020 ADAPTER_INTERFACE, "Powered");
1022 if (adapter->current_settings & MGMT_SETTING_POWERED) {
1023 adapter_start(adapter);
1025 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
1026 if (TIZEN_FEATURE_BLUEZ_SPRD_PAGE_SCAN) {
1027 /* Approx 6.4 Seconds of timeout */
1028 /* This Added because Z3 device was not able to connect with
1029 * some device as it was getting Page Timeout
1030 * (LG HBS800, sony carkit) etc. So, Increasing Page timeout value
1031 * from 5.12 Sec (which is default) to ~6.4sec*/
1032 DBG("Setting value");
1033 send_sprd_page_scan_timeout(10240);
1037 adapter_stop(adapter);
1039 if (powering_down) {
1040 adapter_remaining--;
1042 if (!adapter_remaining)
1048 if ((changed_mask & MGMT_SETTING_LE) &&
1049 btd_adapter_get_powered(adapter) &&
1050 (adapter->current_settings & MGMT_SETTING_LE))
1051 trigger_passive_scanning(adapter);
1053 if (changed_mask & MGMT_SETTING_DISCOVERABLE) {
1054 g_dbus_emit_property_changed(dbus_conn, adapter->path,
1055 ADAPTER_INTERFACE, "Discoverable");
1056 /* Only persist discoverable setting if it was not set
1057 * temporarily by discovery.
1059 if (!adapter->discovery_discoverable)
1060 store_adapter_info(adapter);
1061 btd_adv_manager_refresh(adapter->adv_manager);
1064 if (changed_mask & MGMT_SETTING_BONDABLE) {
1065 g_dbus_emit_property_changed(dbus_conn, adapter->path,
1066 ADAPTER_INTERFACE, "Pairable");
1068 trigger_pairable_timeout(adapter);
1071 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
1072 if (changed_mask & MGMT_SETTING_ADVERTISING) {
1073 if ((adapter->current_settings & MGMT_SETTING_ADVERTISING) &&
1074 (adapter->advertising)) {
1078 adapter->advertising = adapter->current_settings & MGMT_SETTING_ADVERTISING;
1079 advertising_state_changed(adapter, 0, adapter->advertising);
1082 if ((changed_mask & MGMT_SETTING_PRIVACY) &&
1083 !(adapter->current_settings & MGMT_SETTING_PRIVACY)) {
1084 DBG("LE Privacy feature is disabled");
1087 * Some Android devices don't consider the device as LE one,
1088 * if the device doesn't distribute IRK when pairing.
1089 * Because of this compatibility issue, set IRK
1090 * even though privacy feature is disabled.
1092 set_local_irk(adapter);
1097 static void adapter_set_power_state(struct btd_adapter *adapter, uint32_t value)
1099 if (adapter->power_state == value)
1102 DBG("%s", adapter_power_state_str(value));
1103 adapter->power_state = value;
1104 g_dbus_emit_property_changed(dbus_conn, adapter->path,
1105 ADAPTER_INTERFACE, "PowerState");
1108 static void reset_power_state_target(struct btd_adapter *adapter,
1112 adapter->power_state == ADAPTER_POWER_STATE_OFF_ENABLING) {
1113 adapter_set_power_state(adapter, ADAPTER_POWER_STATE_ON);
1114 } else if (!value &&
1115 adapter->power_state == ADAPTER_POWER_STATE_ON_DISABLING) {
1116 adapter_set_power_state(adapter, ADAPTER_POWER_STATE_OFF);
1120 static void new_settings_callback(uint16_t index, uint16_t length,
1121 const void *param, void *user_data)
1123 struct btd_adapter *adapter = user_data;
1126 if (length < sizeof(settings)) {
1127 btd_error(adapter->dev_id,
1128 "Wrong size of new settings parameters");
1132 settings = get_le32(param);
1134 if (settings == adapter->current_settings)
1137 if ((adapter->current_settings ^ settings) & MGMT_SETTING_POWERED) {
1138 reset_power_state_target(adapter,
1139 settings & MGMT_SETTING_POWERED ?
1143 DBG("Settings: 0x%08x", settings);
1145 settings_changed(adapter, settings);
1148 struct set_mode_data {
1149 struct btd_adapter *adapter;
1154 static void set_mode_complete(uint8_t status, uint16_t length,
1155 const void *param, void *user_data)
1157 struct set_mode_data *data = user_data;
1158 struct btd_adapter *adapter = data->adapter;
1160 if (status != MGMT_STATUS_SUCCESS) {
1161 btd_error(adapter->dev_id, "Failed to set mode: %s (0x%02x)",
1162 mgmt_errstr(status), status);
1163 if (status == MGMT_STATUS_RFKILLED)
1164 adapter_set_power_state(adapter,
1165 ADAPTER_POWER_STATE_OFF_BLOCKED);
1166 adapter->pending_settings &= ~data->setting;
1167 if (status != MGMT_STATUS_RFKILLED &&
1168 data->setting & MGMT_SETTING_POWERED)
1169 reset_power_state_target(adapter, data->value);
1174 * The parameters are identical and also the task that is
1175 * required in both cases. So it is safe to just call the
1176 * event handling functions here.
1178 new_settings_callback(adapter->dev_id, length, param, adapter);
1181 static void remove_temporary_devices(struct btd_adapter *adapter)
1185 for (l = adapter->devices; l; l = next) {
1186 struct btd_device *dev = l->data;
1188 next = g_slist_next(l);
1189 if (device_is_temporary(dev))
1190 btd_adapter_remove_device(adapter, dev);
1194 static bool set_mode(struct btd_adapter *adapter, uint16_t opcode,
1197 struct mgmt_mode cp;
1198 uint32_t setting = 0;
1199 struct set_mode_data *data;
1201 memset(&cp, 0, sizeof(cp));
1205 case MGMT_OP_SET_POWERED:
1206 setting = MGMT_SETTING_POWERED;
1207 if (adapter->power_state != ADAPTER_POWER_STATE_OFF_BLOCKED) {
1208 adapter_set_power_state(adapter, mode ?
1209 ADAPTER_POWER_STATE_OFF_ENABLING :
1210 ADAPTER_POWER_STATE_ON_DISABLING);
1213 case MGMT_OP_SET_CONNECTABLE:
1214 setting = MGMT_SETTING_CONNECTABLE;
1216 case MGMT_OP_SET_FAST_CONNECTABLE:
1217 setting = MGMT_SETTING_FAST_CONNECTABLE;
1219 case MGMT_OP_SET_DISCOVERABLE:
1220 setting = MGMT_SETTING_DISCOVERABLE;
1222 case MGMT_OP_SET_BONDABLE:
1223 setting = MGMT_SETTING_BONDABLE;
1227 adapter->pending_settings |= setting;
1229 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
1230 DBG("sending 0x%4.4x set mode %d command for index %u", opcode, mode, adapter->dev_id);
1232 DBG("sending set mode command for index %u", adapter->dev_id);
1235 data = g_new0(struct set_mode_data, 1);
1236 data->adapter = adapter;
1237 data->setting = setting;
1240 if (mgmt_send(adapter->mgmt, opcode,
1241 adapter->dev_id, sizeof(cp), &cp,
1242 set_mode_complete, data, g_free) > 0){
1243 adapter->pending_settings |= setting;
1247 if (setting == MGMT_SETTING_POWERED) {
1248 /* cancel the earlier setting */
1249 adapter_set_power_state(adapter, mode ?
1250 ADAPTER_POWER_STATE_OFF :
1251 ADAPTER_POWER_STATE_ON);
1253 btd_error(adapter->dev_id, "Failed to set mode for index %u",
1259 static bool set_discoverable(struct btd_adapter *adapter, uint8_t mode,
1262 struct mgmt_cp_set_discoverable cp;
1263 struct set_mode_data *data;
1265 memset(&cp, 0, sizeof(cp));
1267 cp.timeout = htobs(timeout);
1269 DBG("sending set mode command for index %u", adapter->dev_id);
1271 #ifndef TIZEN_FEATURE_BLUEZ_MODIFY
1272 if (btd_has_kernel_features(KERNEL_CONN_CONTROL)) {
1274 set_mode(adapter, MGMT_OP_SET_CONNECTABLE, mode);
1276 /* This also disables discoverable so we're done */
1277 return set_mode(adapter, MGMT_OP_SET_CONNECTABLE,
1282 data = g_new0(struct set_mode_data, 1);
1283 data->adapter = adapter;
1286 if (mgmt_send(adapter->mgmt, MGMT_OP_SET_DISCOVERABLE,
1287 adapter->dev_id, sizeof(cp), &cp,
1288 set_mode_complete, data, g_free) > 0)
1292 btd_error(adapter->dev_id, "Failed to set mode for index %u",
1298 static bool pairable_timeout_handler(gpointer user_data)
1300 struct btd_adapter *adapter = user_data;
1302 adapter->pairable_timeout_id = 0;
1304 set_mode(adapter, MGMT_OP_SET_BONDABLE, 0x00);
1309 static void trigger_pairable_timeout(struct btd_adapter *adapter)
1311 if (adapter->pairable_timeout_id > 0) {
1312 timeout_remove(adapter->pairable_timeout_id);
1313 adapter->pairable_timeout_id = 0;
1316 if (!(adapter->current_settings & MGMT_SETTING_BONDABLE))
1319 if (adapter->pairable_timeout > 0)
1320 adapter->pairable_timeout_id =
1321 timeout_add_seconds(adapter->pairable_timeout,
1322 pairable_timeout_handler, adapter,
1326 static void local_name_changed_callback(uint16_t index, uint16_t length,
1327 const void *param, void *user_data)
1329 struct btd_adapter *adapter = user_data;
1330 const struct mgmt_cp_set_local_name *rp = param;
1332 if (length < sizeof(*rp)) {
1333 btd_error(adapter->dev_id,
1334 "Wrong size of local name changed parameters");
1338 if (!g_strcmp0(adapter->short_name, (const char *) rp->short_name) &&
1339 !g_strcmp0(adapter->name, (const char *) rp->name))
1342 DBG("Name: %s", rp->name);
1343 DBG("Short name: %s", rp->short_name);
1345 g_free(adapter->name);
1346 adapter->name = g_strdup((const char *) rp->name);
1348 g_free(adapter->short_name);
1349 adapter->short_name = g_strdup((const char *) rp->short_name);
1352 * Changing the name (even manually via HCI) will update the
1353 * current alias property.
1355 * In case the name is empty, use the short name.
1357 * There is a difference between the stored alias (which is
1358 * configured by the user) and the current alias. The current
1359 * alias is temporary for the lifetime of the daemon.
1361 if (adapter->name && adapter->name[0] != '\0') {
1362 g_free(adapter->current_alias);
1363 adapter->current_alias = g_strdup(adapter->name);
1365 g_free(adapter->current_alias);
1366 adapter->current_alias = g_strdup(adapter->short_name);
1369 DBG("Current alias: %s", adapter->current_alias);
1371 if (!adapter->current_alias)
1374 g_dbus_emit_property_changed(dbus_conn, adapter->path,
1375 ADAPTER_INTERFACE, "Alias");
1377 attrib_gap_set(adapter, GATT_CHARAC_DEVICE_NAME,
1378 (const uint8_t *) adapter->current_alias,
1379 strlen(adapter->current_alias));
1382 static void set_local_name_complete(uint8_t status, uint16_t length,
1383 const void *param, void *user_data)
1385 struct btd_adapter *adapter = user_data;
1387 if (status != MGMT_STATUS_SUCCESS) {
1388 btd_error(adapter->dev_id,
1389 "Failed to set local name: %s (0x%02x)",
1390 mgmt_errstr(status), status);
1395 * The parameters are identical and also the task that is
1396 * required in both cases. So it is safe to just call the
1397 * event handling functions here.
1399 local_name_changed_callback(adapter->dev_id, length, param, adapter);
1402 static int set_name(struct btd_adapter *adapter, const char *name)
1404 struct mgmt_cp_set_local_name cp;
1405 char maxname[MAX_NAME_LENGTH];
1407 memset(maxname, 0, sizeof(maxname));
1408 strncpy(maxname, name, MAX_NAME_LENGTH - 1);
1410 if (!g_utf8_validate(maxname, -1, NULL)) {
1411 btd_error(adapter->dev_id,
1412 "Name change failed: supplied name isn't valid UTF-8");
1416 memset(&cp, 0, sizeof(cp));
1417 strncpy((char *) cp.name, maxname, sizeof(cp.name) - 1);
1419 DBG("sending set local name command for index %u", adapter->dev_id);
1421 if (mgmt_send(adapter->mgmt, MGMT_OP_SET_LOCAL_NAME,
1422 adapter->dev_id, sizeof(cp), &cp,
1423 set_local_name_complete, adapter, NULL) > 0)
1426 btd_error(adapter->dev_id, "Failed to set local name for index %u",
1432 int adapter_set_name(struct btd_adapter *adapter, const char *name)
1434 if (g_strcmp0(adapter->system_name, name) == 0)
1437 DBG("name: %s", name);
1439 g_free(adapter->system_name);
1440 adapter->system_name = g_strdup(name);
1442 g_dbus_emit_property_changed(dbus_conn, adapter->path,
1443 ADAPTER_INTERFACE, "Name");
1445 /* alias is preferred over system name */
1446 if (adapter->stored_alias)
1449 DBG("alias: %s", name);
1451 g_dbus_emit_property_changed(dbus_conn, adapter->path,
1452 ADAPTER_INTERFACE, "Alias");
1454 return set_name(adapter, name);
1457 struct btd_device *btd_adapter_find_device(struct btd_adapter *adapter,
1458 const bdaddr_t *dst,
1459 uint8_t bdaddr_type)
1461 struct device_addr_type addr;
1462 struct btd_device *device;
1468 bacpy(&addr.bdaddr, dst);
1469 addr.bdaddr_type = bdaddr_type;
1471 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
1472 list = g_slist_find_custom(adapter->devices, &addr,
1473 device_addr_type_strict_cmp);
1475 device = list->data;
1479 list = g_slist_find_custom(adapter->devices, &addr,
1480 device_addr_type_cmp);
1484 device = list->data;
1487 * If we're looking up based on public address and the address
1488 * was not previously used over this bearer we may need to
1489 * update LE or BR/EDR support information.
1491 if (bdaddr_type == BDADDR_BREDR)
1492 device_set_bredr_support(device);
1494 device_set_le_support(device, bdaddr_type);
1499 static int device_path_cmp(gconstpointer a, gconstpointer b)
1501 const struct btd_device *device = a;
1502 const char *path = b;
1503 const char *dev_path = device_get_path(device);
1505 return strcasecmp(dev_path, path);
1508 struct btd_device *btd_adapter_find_device_by_path(struct btd_adapter *adapter,
1516 list = g_slist_find_custom(adapter->devices, path, device_path_cmp);
1523 static void uuid_to_uuid128(uuid_t *uuid128, const uuid_t *uuid)
1525 if (uuid->type == SDP_UUID16)
1526 sdp_uuid16_to_uuid128(uuid128, uuid);
1527 else if (uuid->type == SDP_UUID32)
1528 sdp_uuid32_to_uuid128(uuid128, uuid);
1530 memcpy(uuid128, uuid, sizeof(*uuid));
1533 static bool is_supported_uuid(const uuid_t *uuid)
1537 /* mgmt versions from 1.3 onwards support all types of UUIDs */
1538 if (MGMT_VERSION(mgmt_version, mgmt_revision) >= MGMT_VERSION(1, 3))
1541 uuid_to_uuid128(&tmp, uuid);
1543 if (!sdp_uuid128_to_uuid(&tmp))
1546 if (tmp.type != SDP_UUID16)
1552 static void add_uuid_complete(uint8_t status, uint16_t length,
1553 const void *param, void *user_data)
1555 struct btd_adapter *adapter = user_data;
1557 if (status != MGMT_STATUS_SUCCESS) {
1558 btd_error(adapter->dev_id, "Failed to add UUID: %s (0x%02x)",
1559 mgmt_errstr(status), status);
1564 * The parameters are identical and also the task that is
1565 * required in both cases. So it is safe to just call the
1566 * event handling functions here.
1568 dev_class_changed_callback(adapter->dev_id, length, param, adapter);
1570 if (adapter->initialized)
1571 g_dbus_emit_property_changed(dbus_conn, adapter->path,
1572 ADAPTER_INTERFACE, "UUIDs");
1575 static int add_uuid(struct btd_adapter *adapter, uuid_t *uuid, uint8_t svc_hint)
1577 struct mgmt_cp_add_uuid cp;
1581 if (!is_supported_uuid(uuid)) {
1582 btd_warn(adapter->dev_id,
1583 "Ignoring unsupported UUID for addition");
1587 uuid_to_uuid128(&uuid128, uuid);
1589 ntoh128((uint128_t *) uuid128.value.uuid128.data, &uint128);
1590 htob128(&uint128, (uint128_t *) cp.uuid);
1591 cp.svc_hint = svc_hint;
1593 DBG("sending add uuid command for index %u", adapter->dev_id);
1595 if (mgmt_send(adapter->mgmt, MGMT_OP_ADD_UUID,
1596 adapter->dev_id, sizeof(cp), &cp,
1597 add_uuid_complete, adapter, NULL) > 0)
1600 btd_error(adapter->dev_id, "Failed to add UUID for index %u",
1606 static void remove_uuid_complete(uint8_t status, uint16_t length,
1607 const void *param, void *user_data)
1609 struct btd_adapter *adapter = user_data;
1611 if (status != MGMT_STATUS_SUCCESS) {
1612 btd_error(adapter->dev_id, "Failed to remove UUID: %s (0x%02x)",
1613 mgmt_errstr(status), status);
1618 * The parameters are identical and also the task that is
1619 * required in both cases. So it is safe to just call the
1620 * event handling functions here.
1622 dev_class_changed_callback(adapter->dev_id, length, param, adapter);
1624 if (adapter->initialized)
1625 g_dbus_emit_property_changed(dbus_conn, adapter->path,
1626 ADAPTER_INTERFACE, "UUIDs");
1629 static int remove_uuid(struct btd_adapter *adapter, uuid_t *uuid)
1631 struct mgmt_cp_remove_uuid cp;
1635 if (!is_supported_uuid(uuid)) {
1636 btd_warn(adapter->dev_id,
1637 "Ignoring unsupported UUID for removal");
1641 uuid_to_uuid128(&uuid128, uuid);
1643 ntoh128((uint128_t *) uuid128.value.uuid128.data, &uint128);
1644 htob128(&uint128, (uint128_t *) cp.uuid);
1646 DBG("sending remove uuid command for index %u", adapter->dev_id);
1648 if (mgmt_send(adapter->mgmt, MGMT_OP_REMOVE_UUID,
1649 adapter->dev_id, sizeof(cp), &cp,
1650 remove_uuid_complete, adapter, NULL) > 0)
1653 btd_error(adapter->dev_id, "Failed to remove UUID for index %u",
1659 static void clear_uuids_complete(uint8_t status, uint16_t length,
1660 const void *param, void *user_data)
1662 struct btd_adapter *adapter = user_data;
1664 if (status != MGMT_STATUS_SUCCESS) {
1665 btd_error(adapter->dev_id, "Failed to clear UUIDs: %s (0x%02x)",
1666 mgmt_errstr(status), status);
1671 * The parameters are identical and also the task that is
1672 * required in both cases. So it is safe to just call the
1673 * event handling functions here.
1675 dev_class_changed_callback(adapter->dev_id, length, param, adapter);
1678 static int clear_uuids(struct btd_adapter *adapter)
1680 struct mgmt_cp_remove_uuid cp;
1682 memset(&cp, 0, sizeof(cp));
1684 DBG("sending clear uuids command for index %u", adapter->dev_id);
1686 if (mgmt_send(adapter->mgmt, MGMT_OP_REMOVE_UUID,
1687 adapter->dev_id, sizeof(cp), &cp,
1688 clear_uuids_complete, adapter, NULL) > 0)
1691 btd_error(adapter->dev_id, "Failed to clear UUIDs for index %u",
1697 static uint8_t get_uuid_mask(uuid_t *uuid)
1699 if (uuid->type != SDP_UUID16)
1702 switch (uuid->value.uuid16) {
1703 case DIALUP_NET_SVCLASS_ID:
1704 case CIP_SVCLASS_ID:
1705 return 0x42; /* Telephony & Networking */
1706 case IRMC_SYNC_SVCLASS_ID:
1707 case OBEX_OBJPUSH_SVCLASS_ID:
1708 case OBEX_FILETRANS_SVCLASS_ID:
1709 case IRMC_SYNC_CMD_SVCLASS_ID:
1710 case PBAP_PSE_SVCLASS_ID:
1711 return 0x10; /* Object Transfer */
1712 case HEADSET_SVCLASS_ID:
1713 case HANDSFREE_SVCLASS_ID:
1714 return 0x20; /* Audio */
1715 case CORDLESS_TELEPHONY_SVCLASS_ID:
1716 case INTERCOM_SVCLASS_ID:
1717 case FAX_SVCLASS_ID:
1718 case SAP_SVCLASS_ID:
1720 * Setting the telephony bit for the handsfree audio gateway
1721 * role is not required by the HFP specification, but the
1722 * Nokia 616 carkit is just plain broken! It will refuse
1723 * pairing without this bit set.
1725 case HANDSFREE_AGW_SVCLASS_ID:
1726 return 0x40; /* Telephony */
1727 case AUDIO_SOURCE_SVCLASS_ID:
1728 case VIDEO_SOURCE_SVCLASS_ID:
1729 return 0x08; /* Capturing */
1730 case AUDIO_SINK_SVCLASS_ID:
1731 case VIDEO_SINK_SVCLASS_ID:
1732 return 0x04; /* Rendering */
1733 case PANU_SVCLASS_ID:
1734 case NAP_SVCLASS_ID:
1736 return 0x02; /* Networking */
1742 static int uuid_cmp(const void *a, const void *b)
1744 const sdp_record_t *rec = a;
1745 const uuid_t *uuid = b;
1747 return sdp_uuid_cmp(&rec->svclass, uuid);
1750 static void adapter_service_insert(struct btd_adapter *adapter, sdp_record_t *rec)
1752 sdp_list_t *browse_list = NULL;
1756 DBG("%s", adapter->path);
1758 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
1760 DBG("record is NULL return");
1765 /* skip record without a browse group */
1766 if (sdp_get_browse_groups(rec, &browse_list) < 0) {
1767 DBG("skipping record without browse group");
1771 sdp_uuid16_create(&browse_uuid, PUBLIC_BROWSE_GROUP);
1773 /* skip record without public browse group */
1774 if (!sdp_list_find(browse_list, &browse_uuid, sdp_uuid_cmp))
1777 if (sdp_list_find(adapter->services, &rec->svclass, uuid_cmp) == NULL)
1782 adapter->services = sdp_list_insert_sorted(adapter->services, rec,
1786 uint8_t svc_hint = get_uuid_mask(&rec->svclass);
1787 add_uuid(adapter, &rec->svclass, svc_hint);
1791 sdp_list_free(browse_list, free);
1794 int adapter_service_add(struct btd_adapter *adapter, sdp_record_t *rec)
1799 * If the controller does not support BR/EDR operation,
1800 * there is no point in trying to add SDP records.
1802 if (btd_opts.mode == BT_MODE_LE)
1805 DBG("%s", adapter->path);
1807 ret = add_record_to_server(&adapter->bdaddr, rec);
1811 adapter_service_insert(adapter, rec);
1816 void adapter_service_remove(struct btd_adapter *adapter, uint32_t handle)
1820 * If the controller does not support BR/EDR operation,
1821 * there is no point in trying to remote SDP records.
1823 if (btd_opts.mode == BT_MODE_LE)
1826 DBG("%s", adapter->path);
1828 rec = sdp_record_find(handle);
1832 adapter->services = sdp_list_remove(adapter->services, rec);
1834 if (sdp_list_find(adapter->services, &rec->svclass, uuid_cmp) == NULL)
1835 remove_uuid(adapter, &rec->svclass);
1837 remove_record_from_server(rec->handle);
1840 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
1841 static void adapter_print_devices(struct btd_adapter *adapter)
1845 dev = adapter->devices;
1846 for (; dev; dev = dev->next)
1847 device_print_addr(dev->data);
1851 static void adapter_add_device(struct btd_adapter *adapter,
1852 struct btd_device *device);
1854 static struct btd_device *adapter_create_device(struct btd_adapter *adapter,
1855 const bdaddr_t *bdaddr,
1856 uint8_t bdaddr_type)
1858 struct btd_device *device;
1860 device = device_create(adapter, bdaddr, bdaddr_type);
1864 adapter_add_device(adapter, device);
1866 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
1867 device_print_addr(device);
1868 DBG("devices list count : %d", g_slist_length(adapter->devices));
1874 static void service_auth_cancel(struct service_auth *auth)
1878 if (auth->svc_id > 0)
1879 device_remove_svc_complete_callback(auth->device,
1882 dbus_error_init(&derr);
1883 dbus_set_error_const(&derr, ERROR_INTERFACE ".Canceled", NULL);
1885 auth->cb(&derr, auth->user_data);
1887 dbus_error_free(&derr);
1889 if (auth->agent != NULL) {
1890 agent_cancel(auth->agent);
1891 agent_unref(auth->agent);
1897 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
1898 void btd_adapter_unpair_device(struct btd_adapter *adapter,
1899 struct btd_device *dev)
1904 adapter->connect_list = g_slist_remove(adapter->connect_list, dev);
1906 // adapter->devices = g_slist_remove(adapter->devices, dev);
1908 // adapter->discovery_found = g_slist_remove(adapter->discovery_found,
1911 adapter->connections = g_slist_remove(adapter->connections, dev);
1913 if (adapter->connect_le == dev)
1914 adapter->connect_le = NULL;
1916 l = adapter->auths->head;
1918 struct service_auth *auth = l->data;
1919 GList *next = g_list_next(l);
1921 if (auth->device != dev) {
1926 g_queue_delete_link(adapter->auths, l);
1929 service_auth_cancel(auth);
1932 device_unpair(dev, TRUE);
1937 static void adapter_remove_device(struct btd_adapter *adapter,
1938 struct btd_device *device);
1940 void btd_adapter_remove_device(struct btd_adapter *adapter,
1941 struct btd_device *dev)
1945 adapter->connect_list = g_slist_remove(adapter->connect_list, dev);
1947 adapter_remove_device(adapter, dev);
1948 #ifndef TIZEN_FEATURE_BLUEZ_MODIFY
1949 btd_adv_monitor_device_remove(adapter->adv_monitor_manager, dev);
1951 adapter->discovery_found = g_slist_remove(adapter->discovery_found,
1954 adapter->connections = g_slist_remove(adapter->connections, dev);
1956 if (adapter->connect_le == dev)
1957 adapter->connect_le = NULL;
1959 l = adapter->auths->head;
1961 struct service_auth *auth = l->data;
1962 GList *next = g_list_next(l);
1964 if (auth->device != dev) {
1969 g_queue_delete_link(adapter->auths, l);
1972 service_auth_cancel(auth);
1975 device_remove(dev, TRUE);
1978 struct btd_device *btd_adapter_get_device(struct btd_adapter *adapter,
1979 const bdaddr_t *addr,
1982 struct btd_device *device;
1987 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
1988 if (!bacmp(addr, BDADDR_ANY))
1992 device = btd_adapter_find_device(adapter, addr, addr_type);
1996 return adapter_create_device(adapter, addr, addr_type);
1999 struct btd_device *btd_adapter_find_device_by_fd(int fd)
2003 GIOChannel *io = NULL;
2004 GError *gerr = NULL;
2005 struct btd_adapter *adapter;
2007 io = g_io_channel_unix_new(fd);
2011 bt_io_get(io, &gerr,
2012 BT_IO_OPT_SOURCE_BDADDR, &src,
2013 BT_IO_OPT_DEST_BDADDR, &dst,
2014 BT_IO_OPT_DEST_TYPE, &dst_type,
2017 error("bt_io_get: %s", gerr->message);
2019 g_io_channel_unref(io);
2023 g_io_channel_unref(io);
2025 adapter = adapter_find(&src);
2029 return btd_adapter_find_device(adapter, &dst, dst_type);
2032 sdp_list_t *btd_adapter_get_services(struct btd_adapter *adapter)
2034 return adapter->services;
2037 static void passive_scanning_complete(uint8_t status, uint16_t length,
2038 const void *param, void *user_data)
2040 struct btd_adapter *adapter = user_data;
2041 const struct mgmt_cp_start_discovery *rp = param;
2043 DBG("status 0x%02x", status);
2045 if (length < sizeof(*rp)) {
2046 btd_error(adapter->dev_id,
2047 "Wrong size of start scanning return parameters");
2051 if (status == MGMT_STATUS_SUCCESS) {
2052 adapter->discovery_type = rp->type;
2053 adapter->discovery_enable = 0x01;
2057 static bool passive_scanning_timeout(gpointer user_data)
2059 struct btd_adapter *adapter = user_data;
2060 struct mgmt_cp_start_discovery cp;
2062 adapter->passive_scan_timeout = 0;
2064 cp.type = SCAN_TYPE_LE;
2065 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
2066 mgmt_send(adapter->mgmt, MGMT_OP_START_LE_DISCOVERY,
2067 adapter->dev_id, sizeof(cp), &cp,
2068 passive_scanning_complete, adapter, NULL);
2070 mgmt_send(adapter->mgmt, MGMT_OP_START_DISCOVERY,
2071 adapter->dev_id, sizeof(cp), &cp,
2072 passive_scanning_complete, adapter, NULL);
2077 static void trigger_passive_scanning(struct btd_adapter *adapter)
2079 if (!(adapter->current_settings & MGMT_SETTING_LE))
2084 if (adapter->passive_scan_timeout > 0) {
2085 timeout_remove(adapter->passive_scan_timeout);
2086 adapter->passive_scan_timeout = 0;
2090 * When the kernel background scanning is available, there is
2091 * no need to start any discovery. The kernel will keep scanning
2092 * as long as devices are in its auto-connection list.
2094 if (btd_has_kernel_features(KERNEL_CONN_CONTROL))
2098 * If any client is running a discovery right now, then do not
2099 * even try to start passive scanning.
2101 * The discovery procedure is using interleaved scanning and
2102 * thus will discover Low Energy devices as well.
2104 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
2105 if (adapter->discovery_list || adapter->le_discovery_list)
2108 if (adapter->discovery_list)
2112 if (adapter->discovery_enable == 0x01)
2116 * In case the discovery is suspended (for example for an ongoing
2117 * pairing attempt), then also do not start passive scanning.
2119 if (adapter->discovery_suspended)
2123 * If the list of connectable Low Energy devices is empty,
2124 * then do not start passive scanning.
2126 if (!adapter->connect_list)
2129 adapter->passive_scan_timeout = timeout_add_seconds(CONN_SCAN_TIMEOUT,
2130 passive_scanning_timeout, adapter,
2134 static void stop_passive_scanning_complete(uint8_t status, uint16_t length,
2135 const void *param, void *user_data)
2137 struct btd_adapter *adapter = user_data;
2138 struct btd_device *dev;
2141 DBG("status 0x%02x (%s)", status, mgmt_errstr(status));
2143 dev = adapter->connect_le;
2144 adapter->connect_le = NULL;
2147 * When the kernel background scanning is available, there is
2148 * no need to stop any discovery. The kernel will handle the
2149 * auto-connection by itself.
2151 if (btd_has_kernel_features(KERNEL_CONN_CONTROL))
2155 * MGMT_STATUS_REJECTED may be returned from kernel because the passive
2156 * scan timer had expired in kernel and passive scan was disabled just
2157 * around the time we called stop_passive_scanning().
2159 if (status != MGMT_STATUS_SUCCESS && status != MGMT_STATUS_REJECTED) {
2160 btd_error(adapter->dev_id, "Stopping passive scanning failed: %s",
2161 mgmt_errstr(status));
2165 adapter->discovery_type = 0x00;
2166 adapter->discovery_enable = 0x00;
2169 DBG("Device removed while stopping passive scanning");
2170 trigger_passive_scanning(adapter);
2174 err = device_connect_le(dev);
2176 btd_error(adapter->dev_id, "LE auto connection failed: %s (%d)",
2177 strerror(-err), -err);
2178 trigger_passive_scanning(adapter);
2182 static void stop_passive_scanning(struct btd_adapter *adapter)
2184 struct mgmt_cp_stop_discovery cp;
2185 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
2186 struct mgmt_cp_stop_discovery le_cp;
2191 /* If there are any normal discovery clients passive scanning
2192 * wont be running */
2193 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
2194 if (adapter->discovery_list || adapter->le_discovery_list)
2197 if (adapter->discovery_list)
2201 if (adapter->discovery_enable == 0x00)
2204 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
2205 if ((adapter->discovery_type & 0x01) > 0) {
2207 mgmt_send(adapter->mgmt, MGMT_OP_STOP_DISCOVERY,
2208 adapter->dev_id, sizeof(cp), &cp,
2209 stop_passive_scanning_complete, adapter, NULL);
2211 if ((adapter->discovery_type & 0x06) > 0) {
2213 mgmt_send(adapter->mgmt, MGMT_OP_STOP_LE_DISCOVERY,
2214 adapter->dev_id, sizeof(le_cp), &le_cp,
2215 stop_passive_scanning_complete, adapter, NULL);
2218 cp.type = adapter->discovery_type;
2220 mgmt_send(adapter->mgmt, MGMT_OP_STOP_DISCOVERY,
2221 adapter->dev_id, sizeof(cp), &cp,
2222 stop_passive_scanning_complete, adapter, NULL);
2226 static void cancel_passive_scanning(struct btd_adapter *adapter)
2228 if (!(adapter->current_settings & MGMT_SETTING_LE))
2233 if (adapter->passive_scan_timeout > 0) {
2234 timeout_remove(adapter->passive_scan_timeout);
2235 adapter->passive_scan_timeout = 0;
2239 static uint8_t get_scan_type(struct btd_adapter *adapter)
2243 if (adapter->current_settings & MGMT_SETTING_BREDR)
2244 type = SCAN_TYPE_BREDR;
2248 if (adapter->current_settings & MGMT_SETTING_LE)
2249 type |= SCAN_TYPE_LE;
2254 static void free_discovery_filter(struct discovery_filter *discovery_filter)
2256 if (!discovery_filter)
2259 g_slist_free_full(discovery_filter->uuids, free);
2260 free(discovery_filter->pattern);
2261 g_free(discovery_filter);
2264 static void invalidate_rssi_and_tx_power(gpointer a)
2266 struct btd_device *dev = a;
2268 device_set_rssi(dev, 0);
2269 device_set_tx_power(dev, 127);
2272 static void discovery_cleanup(struct btd_adapter *adapter, int timeout)
2276 adapter->discovery_type = 0x00;
2278 if (adapter->discovery_idle_timeout > 0) {
2279 timeout_remove(adapter->discovery_idle_timeout);
2280 adapter->discovery_idle_timeout = 0;
2283 g_slist_free_full(adapter->discovery_found,
2284 invalidate_rssi_and_tx_power);
2285 adapter->discovery_found = NULL;
2287 if (!adapter->devices)
2290 for (l = adapter->devices; l != NULL; l = next) {
2291 struct btd_device *dev = l->data;
2293 next = g_slist_next(l);
2295 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
2296 if (device_is_temporary(dev) && !device_is_connectable(dev)
2297 && !btd_device_is_connected(dev))
2299 if (device_is_temporary(dev) && !device_is_connectable(dev))
2301 btd_adapter_remove_device(adapter, dev);
2306 static void discovery_free(void *user_data)
2308 struct discovery_client *client = user_data;
2309 struct btd_adapter *adapter = client->adapter;
2311 #ifndef TIZEN_FEATURE_BLUEZ_MODIFY
2315 g_dbus_remove_watch(dbus_conn, client->watch);
2317 if (client->discovery_filter) {
2318 free_discovery_filter(client->discovery_filter);
2319 client->discovery_filter = NULL;
2323 if (client == adapter->client) {
2324 g_dbus_send_message(dbus_conn,
2325 btd_error_busy(client->msg));
2326 adapter->client = NULL;
2328 dbus_message_unref(client->msg);
2331 g_free(client->owner);
2335 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
2336 static void discovery_remove(struct discovery_client *client, bool exit)
2338 static void discovery_remove(struct discovery_client *client)
2342 struct btd_adapter *adapter = client->adapter;
2344 DBG("owner %s", client->owner);
2346 adapter->set_filter_list = g_slist_remove(adapter->set_filter_list,
2349 adapter->discovery_list = g_slist_remove(adapter->discovery_list,
2352 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
2353 if (!exit && client->discovery_filter)
2355 if (adapter->client == client)
2356 adapter->client = NULL;
2358 if (client->watch && client->discovery_filter)
2360 adapter->set_filter_list = g_slist_prepend(
2361 adapter->set_filter_list, client);
2363 discovery_free(client);
2366 * If there are other client discoveries in progress, then leave
2367 * it active. If not, then make sure to stop the restart timeout.
2369 if (adapter->discovery_list)
2372 discovery_cleanup(adapter, TEMP_DEV_TIMEOUT);
2375 static void trigger_start_discovery(struct btd_adapter *adapter, guint delay);
2377 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
2378 static void discovery_reply(struct discovery_client *client, uint8_t status)
2380 static struct discovery_client *discovery_complete(struct btd_adapter *adapter,
2384 #ifndef TIZEN_FEATURE_BLUEZ_MODIFY
2385 struct discovery_client *client = adapter->client;
2388 #ifndef TIZEN_FEATURE_BLUEZ_MODIFY
2393 adapter->client = NULL;
2397 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
2403 g_dbus_send_reply(dbus_conn, client->msg, DBUS_TYPE_INVALID);
2405 reply = btd_error_busy(client->msg);
2406 g_dbus_send_message(dbus_conn, reply);
2409 dbus_message_unref(client->msg);
2411 #ifndef TIZEN_FEATURE_BLUEZ_MODIFY
2416 static void start_discovery_complete(uint8_t status, uint16_t length,
2417 const void *param, void *user_data)
2419 struct btd_adapter *adapter = user_data;
2420 struct discovery_client *client;
2421 const struct mgmt_cp_start_discovery *rp = param;
2423 DBG("status 0x%02x", status);
2425 /* Is there are no clients the discovery must have been stopped while
2426 * discovery command was pending.
2428 if (!adapter->discovery_list) {
2429 struct mgmt_cp_stop_discovery cp;
2431 if (status != MGMT_STATUS_SUCCESS)
2434 /* Stop discovering as there are no clients left */
2436 mgmt_send(adapter->mgmt, MGMT_OP_STOP_DISCOVERY,
2437 adapter->dev_id, sizeof(cp), &cp,
2442 client = adapter->discovery_list->data;
2444 if (length < sizeof(*rp)) {
2445 btd_error(adapter->dev_id,
2446 "Wrong size of start discovery return parameters");
2452 if (status == MGMT_STATUS_SUCCESS) {
2453 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
2454 DBG("Return param discovery type 0x%02x", rp->type);
2455 adapter->discovery_type |= rp->type;
2457 adapter->discovery_type = rp->type;
2459 adapter->discovery_enable = 0x01;
2461 if (adapter->current_discovery_filter)
2462 adapter->filtered_discovery = true;
2464 adapter->filtered_discovery = false;
2466 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
2467 discovery_reply(client, status);
2469 discovery_complete(adapter, status);
2471 if (adapter->discovering)
2474 adapter->discovering = true;
2475 g_dbus_emit_property_changed(dbus_conn, adapter->path,
2476 ADAPTER_INTERFACE, "Discovering");
2478 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
2480 adapter->discovering = false;
2481 g_dbus_emit_property_changed(dbus_conn, adapter->path,
2482 ADAPTER_INTERFACE, "Discovering");
2486 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
2488 /* Reply with an error if the first discovery has failed */
2490 discovery_reply(client, status);
2491 discovery_remove(client, false);
2493 client = discovery_complete(adapter, status);
2495 discovery_remove(client);
2501 * In case the restart of the discovery failed, then just trigger
2502 * it for the next idle timeout again.
2504 #ifndef TIZEN_FEATURE_BLUEZ_MODIFY
2505 trigger_start_discovery(adapter, IDLE_DISCOV_TIMEOUT * 2);
2509 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
2510 static void start_le_discovery_complete(uint8_t status, uint16_t length,
2511 const void *param, void *user_data)
2513 struct btd_adapter *adapter = user_data;
2514 const struct mgmt_cp_start_discovery *rp = param;
2517 error("Error ocurred in LEDiscovering, rp is NULL");
2521 DBG("status 0x%02x", status);
2522 if (length < sizeof(*rp)) {
2523 error("Wrong size of start discovery return parameters");
2527 DBG("Discovery Type 0x%02x", rp->type);
2528 if (status == MGMT_STATUS_SUCCESS) {
2529 adapter->discovery_type |= rp->type;
2530 adapter->discovery_enable = 0x01;
2532 if (adapter->le_discovering)
2535 adapter->le_discovering = true;
2536 g_dbus_emit_property_changed(dbus_conn, adapter->path,
2537 ADAPTER_INTERFACE, "LEDiscovering");
2541 adapter->le_discovering = false;
2542 g_dbus_emit_property_changed(dbus_conn, adapter->path,
2543 ADAPTER_INTERFACE, "LEDiscovering");
2549 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
2550 static bool start_le_discovery_timeout(gpointer user_data)
2552 struct btd_adapter *adapter = user_data;
2557 adapter->le_discovery_idle_timeout = 0;
2559 new_type = SCAN_TYPE_LE;
2561 if (adapter->discovery_enable == 0x01) {
2563 * If there is an already running discovery and it has the
2564 * same type, then just keep it.
2567 if ((adapter->discovery_type & new_type) == SCAN_TYPE_LE) {
2568 if (adapter->le_discovering)
2571 adapter->le_discovering = true;
2572 g_dbus_emit_property_changed(dbus_conn, adapter->path,
2573 ADAPTER_INTERFACE, "LEDiscovering");
2579 struct mgmt_cp_start_discovery cp;
2582 mgmt_send(adapter->mgmt, MGMT_OP_START_LE_DISCOVERY,
2583 adapter->dev_id, sizeof(cp), &cp,
2584 start_le_discovery_complete, adapter, NULL);
2590 static bool start_discovery_timeout(gpointer user_data)
2592 struct btd_adapter *adapter = user_data;
2593 #ifndef TIZEN_FEATURE_BLUEZ_MODIFY
2594 struct mgmt_cp_start_service_discovery *sd_cp;
2600 adapter->discovery_idle_timeout = 0;
2602 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
2603 new_type = SCAN_TYPE_BREDR;
2605 if (adapter->discovery_enable == 0x01) {
2607 * If there is an already running discovery and it has the
2608 * same type, then just keep it.
2610 if ((adapter->discovery_type & new_type) == SCAN_TYPE_BREDR) {
2611 if (adapter->discovering)
2614 adapter->discovering = true;
2615 g_dbus_emit_property_changed(dbus_conn, adapter->path,
2616 ADAPTER_INTERFACE, "Discovering");
2622 struct mgmt_cp_start_discovery cp;
2624 mgmt_send(adapter->mgmt, MGMT_OP_START_DISCOVERY,
2625 adapter->dev_id, sizeof(cp), &cp,
2626 start_discovery_complete, adapter,
2631 /* If we're doing filtered discovery, it must be quickly restarted */
2632 adapter->no_scan_restart_delay = !!adapter->current_discovery_filter;
2634 DBG("adapter->current_discovery_filter == %d",
2635 !!adapter->current_discovery_filter);
2637 new_type = get_scan_type(adapter);
2639 if (adapter->discovery_enable == 0x01) {
2640 struct mgmt_cp_stop_discovery cp;
2643 * If we're asked to start regular discovery, and there is an
2644 * already running regular discovery and it has the same type,
2645 * then just keep it.
2647 if (!adapter->current_discovery_filter &&
2648 !adapter->filtered_discovery &&
2649 adapter->discovery_type == new_type) {
2650 if (adapter->discovering)
2653 adapter->discovering = true;
2654 g_dbus_emit_property_changed(dbus_conn, adapter->path,
2655 ADAPTER_INTERFACE, "Discovering");
2660 * Otherwise the current discovery must be stopped. So
2661 * queue up a stop discovery command.
2663 * This can happen if a passive scanning for Low Energy
2664 * devices is ongoing, or scan type is changed between
2665 * regular and filtered, or filter was updated.
2667 cp.type = adapter->discovery_type;
2668 mgmt_send(adapter->mgmt, MGMT_OP_STOP_DISCOVERY,
2669 adapter->dev_id, sizeof(cp), &cp,
2672 /* Don't even bother to try to quickly start discovery
2673 * just after stopping it, it would fail with status
2674 * MGMT_BUSY. Instead discovering_callback will take
2681 /* Regular discovery is required */
2682 if (!adapter->current_discovery_filter) {
2683 struct mgmt_cp_start_discovery cp;
2686 mgmt_send(adapter->mgmt, MGMT_OP_START_DISCOVERY,
2687 adapter->dev_id, sizeof(cp), &cp,
2688 start_discovery_complete, adapter,
2694 /* Filtered discovery is required */
2695 sd_cp = adapter->current_discovery_filter;
2697 DBG("sending MGMT_OP_START_SERVICE_DISCOVERY %d, %d, %d",
2698 sd_cp->rssi, sd_cp->type,
2699 btohs(sd_cp->uuid_count));
2701 mgmt_send(adapter->mgmt, MGMT_OP_START_SERVICE_DISCOVERY,
2702 adapter->dev_id, sizeof(*sd_cp) +
2703 btohs(sd_cp->uuid_count) * 16,
2704 sd_cp, start_discovery_complete, adapter, NULL);
2711 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
2712 static void trigger_start_le_discovery(struct btd_adapter *adapter, guint delay)
2717 cancel_passive_scanning(adapter);
2719 if (adapter->le_discovery_idle_timeout > 0) {
2720 g_source_remove(adapter->le_discovery_idle_timeout);
2721 adapter->le_discovery_idle_timeout = 0;
2725 * If the controller got powered down in between, then ensure
2726 * that we do not keep trying to restart discovery.
2728 * This is safe-guard and should actually never trigger.
2730 if (!(adapter->current_settings & MGMT_SETTING_POWERED))
2733 adapter->le_discovery_idle_timeout = timeout_add_seconds(delay,
2734 start_le_discovery_timeout, adapter, NULL);
2738 static void trigger_start_discovery(struct btd_adapter *adapter, guint delay)
2743 cancel_passive_scanning(adapter);
2745 if (adapter->discovery_idle_timeout > 0) {
2746 timeout_remove(adapter->discovery_idle_timeout);
2747 adapter->discovery_idle_timeout = 0;
2751 * If the controller got powered down in between, then ensure
2752 * that we do not keep trying to restart discovery.
2754 * This is safe-guard and should actually never trigger.
2756 if (!btd_adapter_get_powered(adapter))
2759 adapter->discovery_idle_timeout = timeout_add_seconds(delay,
2760 start_discovery_timeout, adapter, NULL);
2763 #ifndef TIZEN_FEATURE_BLUEZ_MODIFY
2764 static void suspend_discovery_complete(uint8_t status, uint16_t length,
2765 const void *param, void *user_data)
2767 struct btd_adapter *adapter = user_data;
2769 DBG("status 0x%02x", status);
2771 if (status == MGMT_STATUS_SUCCESS) {
2772 adapter->discovery_type = 0x00;
2773 adapter->discovery_enable = 0x00;
2778 static void suspend_discovery(struct btd_adapter *adapter)
2780 struct mgmt_cp_stop_discovery cp;
2784 adapter->discovery_suspended = true;
2787 * If there are no clients discovering right now, then there is
2788 * also nothing to suspend.
2790 if (!adapter->discovery_list)
2794 * In case of being inside the idle phase, make sure to remove
2795 * the timeout to not trigger a restart.
2797 * The restart will be triggered when the discovery is resumed.
2799 if (adapter->discovery_idle_timeout > 0) {
2800 timeout_remove(adapter->discovery_idle_timeout);
2801 adapter->discovery_idle_timeout = 0;
2804 if (adapter->discovery_enable == 0x00)
2807 cp.type = adapter->discovery_type;
2809 mgmt_send(adapter->mgmt, MGMT_OP_STOP_DISCOVERY,
2810 adapter->dev_id, sizeof(cp), &cp,
2811 suspend_discovery_complete, adapter, NULL);
2814 static void resume_discovery(struct btd_adapter *adapter)
2818 adapter->discovery_suspended = false;
2821 * If there are no clients discovering right now, then there is
2822 * also nothing to resume.
2824 if (!adapter->discovery_list)
2828 * Treat a suspended discovery session the same as extra long
2829 * idle time for a normal discovery. So just trigger the default
2830 * restart procedure.
2832 trigger_start_discovery(adapter, IDLE_DISCOV_TIMEOUT);
2836 static void discovering_callback(uint16_t index, uint16_t length,
2837 const void *param, void *user_data)
2839 const struct mgmt_ev_discovering *ev = param;
2840 struct btd_adapter *adapter = user_data;
2842 if (length < sizeof(*ev)) {
2843 btd_error(adapter->dev_id, "Too small discovering event");
2847 DBG("hci%u type %u discovering %u method %d", adapter->dev_id, ev->type,
2848 ev->discovering, adapter->filtered_discovery);
2850 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
2851 DBG("info discov_type %d", adapter->discovery_type);
2852 if (ev->type == SCAN_TYPE_BREDR) {
2853 if (ev->discovering == FALSE) {
2854 hci_clear_bit(BDADDR_BREDR, &adapter->discovery_type);
2855 adapter->discovering = false;
2857 hci_set_bit(BDADDR_BREDR, &adapter->discovery_type);
2858 adapter->discovering = true;
2860 g_dbus_emit_property_changed(dbus_conn, adapter->path,
2861 ADAPTER_INTERFACE, "Discovering");
2863 } else if (ev->type == SCAN_TYPE_LE) {
2864 if (ev->discovering == FALSE) {
2865 hci_clear_bit(BDADDR_LE_PUBLIC, &adapter->discovery_type);
2866 hci_clear_bit(BDADDR_LE_RANDOM, &adapter->discovery_type);
2868 if (adapter->le_discovering == true) {
2869 if (adapter->le_discovery_list) {
2870 struct discovery_client *client;
2872 client = adapter->le_discovery_list->data;
2873 g_dbus_remove_watch(dbus_conn, client->watch);
2876 adapter->le_discovering = false;
2879 hci_set_bit(BDADDR_LE_PUBLIC, &adapter->discovery_type);
2880 hci_set_bit(BDADDR_LE_RANDOM, &adapter->discovery_type);
2881 adapter->le_discovering = true;
2884 g_dbus_emit_property_changed(dbus_conn, adapter->path,
2885 ADAPTER_INTERFACE, "LEDiscovering");
2888 if (adapter->discovery_enable == ev->discovering)
2891 adapter->discovery_type = ev->type;
2892 adapter->discovery_enable = ev->discovering;
2896 * Check for existing discoveries triggered by client applications
2897 * and ignore all others.
2899 * If there are no clients, then it is good idea to trigger a
2900 * passive scanning attempt.
2902 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
2903 if (adapter->discovery_list == NULL && adapter->le_discovery_list == NULL) {
2904 if (!adapter->connect_le)
2905 trigger_passive_scanning(adapter);
2909 if (!adapter->discovery_list) {
2910 if (!adapter->connect_le)
2911 trigger_passive_scanning(adapter);
2916 if (adapter->discovery_suspended)
2919 switch (adapter->discovery_enable) {
2921 if (adapter->no_scan_restart_delay)
2922 trigger_start_discovery(adapter, 0);
2924 trigger_start_discovery(adapter, IDLE_DISCOV_TIMEOUT);
2928 if (adapter->discovery_idle_timeout > 0) {
2929 timeout_remove(adapter->discovery_idle_timeout);
2930 adapter->discovery_idle_timeout = 0;
2937 static bool set_discovery_discoverable(struct btd_adapter *adapter, bool enable)
2939 if (adapter->discovery_discoverable == enable)
2942 /* Reset discoverable filter if already set */
2943 if (enable && (adapter->current_settings & MGMT_SETTING_DISCOVERABLE))
2946 adapter->discovery_discoverable = enable;
2948 return set_discoverable(adapter, enable, 0);
2951 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
2952 static void stop_discovery_complete(uint8_t status, uint16_t length,
2953 const void *param, void *user_data)
2955 struct discovery_client *client = user_data;
2956 struct btd_adapter *adapter = client->adapter;
2959 DBG("status 0x%02x", status);
2961 if (status != MGMT_STATUS_SUCCESS) {
2963 reply = btd_error_busy(client->msg);
2964 g_dbus_send_message(dbus_conn, reply);
2971 reply = g_dbus_create_reply(client->msg, DBUS_TYPE_INVALID);
2972 g_dbus_send_message(dbus_conn, reply);
2975 adapter->discovery_type &= (~0x01);
2976 DBG("Discovery Type 0x%02x", adapter->discovery_type);
2978 adapter->filtered_discovery = false;
2979 adapter->no_scan_restart_delay = false;
2980 adapter->discovering = false;
2981 g_dbus_emit_property_changed(dbus_conn, adapter->path,
2982 ADAPTER_INTERFACE, "Discovering");
2984 if (adapter->discovery_list == NULL && adapter->le_discovery_list == NULL) {
2985 adapter->discovery_enable = 0x00;
2986 trigger_passive_scanning(adapter);
2990 discovery_remove(client, false);
2993 static void stop_le_discovery_complete(uint8_t status, uint16_t length,
2994 const void *param, void *user_data)
2996 struct btd_adapter *adapter = user_data;
2997 struct discovery_client *client;
3000 DBG("status 0x%02x", status);
3002 /* Is there are no clients the discovery must have been stopped while
3003 * discovery command was pending.
3005 if (!adapter->le_discovery_list)
3008 client = adapter->le_discovery_list->data;
3010 if (status != MGMT_STATUS_SUCCESS) {
3012 reply = btd_error_busy(client->msg);
3013 g_dbus_send_message(dbus_conn, reply);
3020 reply = g_dbus_create_reply(client->msg, DBUS_TYPE_INVALID);
3021 g_dbus_send_message(dbus_conn, reply);
3024 adapter->discovery_type &= (~0x06);
3025 DBG("Discovery Type 0x%02x", adapter->discovery_type);
3027 adapter->filtered_discovery = false;
3028 adapter->no_scan_restart_delay = false;
3029 adapter->le_discovering = false;
3030 g_dbus_emit_property_changed(dbus_conn, adapter->path,
3031 ADAPTER_INTERFACE, "LEDiscovering");
3033 if (adapter->discovery_list == NULL && adapter->le_discovery_list == NULL) {
3034 adapter->discovery_enable = 0x00;
3035 trigger_passive_scanning(adapter);
3040 * The destroy function will cleanup the client information and
3041 * also remove it from the list of discovery clients.
3043 g_dbus_remove_watch(dbus_conn, client->watch);
3047 static void stop_discovery_complete(uint8_t status, uint16_t length,
3048 const void *param, void *user_data)
3050 struct btd_adapter *adapter = user_data;
3051 struct discovery_client *client;
3053 DBG("status 0x%02x", status);
3055 client = discovery_complete(adapter, status);
3057 discovery_remove(client);
3059 if (status != MGMT_STATUS_SUCCESS)
3062 adapter->discovery_type = 0x00;
3063 adapter->discovery_enable = 0x00;
3064 adapter->filtered_discovery = false;
3065 adapter->no_scan_restart_delay = false;
3066 adapter->discovering = false;
3067 g_dbus_emit_property_changed(dbus_conn, adapter->path,
3068 ADAPTER_INTERFACE, "Discovering");
3070 trigger_passive_scanning(adapter);
3074 static int compare_sender(gconstpointer a, gconstpointer b)
3076 const struct discovery_client *client = a;
3077 const char *sender = b;
3079 return g_strcmp0(client->owner, sender);
3082 static gint g_strcmp(gconstpointer a, gconstpointer b)
3084 return strcmp(a, b);
3087 static void extract_unique_uuids(gpointer data, gpointer user_data)
3089 char *uuid_str = data;
3090 GSList **uuids = user_data;
3092 if (!g_slist_find_custom(*uuids, uuid_str, g_strcmp))
3093 *uuids = g_slist_insert_sorted(*uuids, uuid_str, g_strcmp);
3097 * This method merges all adapter filters into rssi, transport and uuids.
3098 * Returns 1 if there was no filtered scan, 0 otherwise.
3100 static int merge_discovery_filters(struct btd_adapter *adapter, int *rssi,
3101 uint8_t *transport, GSList **uuids)
3104 bool empty_uuid = false;
3105 bool has_regular_discovery = false;
3106 bool has_filtered_discovery = false;
3107 uint8_t adapter_scan_type = get_scan_type(adapter);
3109 for (l = adapter->discovery_list; l != NULL; l = g_slist_next(l)) {
3110 struct discovery_client *client = l->data;
3111 struct discovery_filter *item = client->discovery_filter;
3114 has_regular_discovery = true;
3119 * Detect empty filter with only discoverable
3120 * (which does not require a kernel filter) set.
3122 if (item->uuids == NULL &&
3123 item->pathloss == DISTANCE_VAL_INVALID &&
3124 item->rssi == DISTANCE_VAL_INVALID &&
3125 item->type == adapter_scan_type &&
3126 item->duplicate == false &&
3127 item->pattern == NULL) {
3128 has_regular_discovery = true;
3132 has_filtered_discovery = true;
3134 *transport |= item->type;
3137 * Rule for merging rssi and pathloss into rssi field of kernel
3138 * filter is as follow:
3139 * - if there's any client without proximity filter, then do no
3140 * proximity filtering,
3141 * - if all clients specified RSSI, then use lowest value,
3142 * - if any client specified pathloss, then kernel filter should
3143 * do no proximity, as kernel can't compute pathloss. We'll do
3144 * filtering on our own.
3146 if (item->rssi == DISTANCE_VAL_INVALID)
3147 *rssi = HCI_RSSI_INVALID;
3148 else if (*rssi != HCI_RSSI_INVALID && *rssi >= item->rssi)
3150 else if (item->pathloss != DISTANCE_VAL_INVALID)
3151 *rssi = HCI_RSSI_INVALID;
3153 if (!g_slist_length(item->uuids))
3156 g_slist_foreach(item->uuids, extract_unique_uuids, uuids);
3159 /* If no proximity filtering is set, disable it */
3160 if (*rssi == DISTANCE_VAL_INVALID)
3161 *rssi = HCI_RSSI_INVALID;
3164 * Empty_uuid variable determines wether there was any filter with no
3165 * uuids. In this case someone might be looking for all devices in
3166 * certain proximity, and we need to have empty uuids in kernel filter.
3169 g_slist_free(*uuids);
3173 if (has_regular_discovery) {
3174 if (!has_filtered_discovery)
3178 * It there is both regular and filtered scan running, then
3179 * clear whole fitler to report all devices.
3181 *transport = adapter_scan_type;
3182 *rssi = HCI_RSSI_INVALID;
3183 g_slist_free(*uuids);
3190 static void populate_mgmt_filter_uuids(uint8_t (*mgmt_uuids)[16], GSList *uuids)
3194 for (l = uuids; l != NULL; l = g_slist_next(l)) {
3195 bt_uuid_t uuid, u128;
3198 bt_string_to_uuid(&uuid, l->data);
3199 bt_uuid_to_uuid128(&uuid, &u128);
3201 ntoh128((uint128_t *) u128.value.u128.data, &uint128);
3202 htob128(&uint128, (uint128_t *) mgmt_uuids);
3209 * This method merges all adapter filters into one that will be send to kernel.
3210 * cp_ptr is set to null when regular non-filtered discovery is needed,
3211 * otherwise it's pointing to filter. Returns 0 on succes, -1 on error
3213 static int discovery_filter_to_mgmt_cp(struct btd_adapter *adapter,
3214 struct mgmt_cp_start_service_discovery **cp_ptr)
3216 GSList *uuids = NULL;
3217 struct mgmt_cp_start_service_discovery *cp;
3218 int rssi = DISTANCE_VAL_INVALID;
3220 uint8_t discovery_type = 0;
3224 if (merge_discovery_filters(adapter, &rssi, &discovery_type, &uuids)) {
3225 /* There are only regular scans, run just regular scan. */
3230 uuid_count = g_slist_length(uuids);
3232 cp = g_try_malloc(sizeof(*cp) + 16*uuid_count);
3235 g_slist_free(uuids);
3239 cp->type = discovery_type;
3241 cp->uuid_count = htobs(uuid_count);
3242 populate_mgmt_filter_uuids(cp->uuids, uuids);
3244 g_slist_free(uuids);
3248 static bool filters_equal(struct mgmt_cp_start_service_discovery *a,
3249 struct mgmt_cp_start_service_discovery *b) {
3253 if ((!a && b) || (a && !b))
3256 if (a->type != b->type)
3259 if (a->rssi != b->rssi)
3263 * When we create mgmt_cp_start_service_discovery structure inside
3264 * discovery_filter_to_mgmt_cp, we always keep uuids sorted, and
3265 * unique, so we're safe to compare uuid_count, and uuids like that.
3267 if (a->uuid_count != b->uuid_count)
3270 if (memcmp(a->uuids, b->uuids, 16 * a->uuid_count) != 0)
3276 static int update_discovery_filter(struct btd_adapter *adapter)
3278 struct mgmt_cp_start_service_discovery *sd_cp;
3282 if (discovery_filter_to_mgmt_cp(adapter, &sd_cp)) {
3283 btd_error(adapter->dev_id,
3284 "discovery_filter_to_mgmt_cp returned error");
3288 /* Only attempt to overwrite current discoverable setting when not
3291 if (!(adapter->current_settings & MGMT_SETTING_DISCOVERABLE)) {
3294 for (l = adapter->discovery_list; l; l = g_slist_next(l)) {
3295 struct discovery_client *client = l->data;
3297 if (!client->discovery_filter)
3300 if (client->discovery_filter->discoverable) {
3301 set_discovery_discoverable(adapter, true);
3308 * If filters are equal, then don't update scan, except for when
3309 * starting discovery.
3311 if (filters_equal(adapter->current_discovery_filter, sd_cp) &&
3312 adapter->discovering != 0) {
3313 DBG("filters were equal, deciding to not restart the scan.");
3318 g_free(adapter->current_discovery_filter);
3319 adapter->current_discovery_filter = sd_cp;
3321 trigger_start_discovery(adapter, 0);
3323 return -EINPROGRESS;
3326 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
3327 static int discovery_stop(struct discovery_client *client, bool exit)
3329 static int discovery_stop(struct discovery_client *client)
3332 struct btd_adapter *adapter = client->adapter;
3333 struct mgmt_cp_stop_discovery cp;
3335 /* Check if there are more client discovering */
3336 if (g_slist_next(adapter->discovery_list)) {
3337 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
3338 discovery_remove(client, exit);
3340 discovery_remove(client);
3342 update_discovery_filter(adapter);
3346 set_discovery_discoverable(adapter, false);
3349 * In the idle phase of a discovery, there is no need to stop it
3350 * and so it is enough to send out the signal and just return.
3352 if (adapter->discovery_enable == 0x00) {
3353 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
3354 discovery_remove(client, exit);
3356 discovery_remove(client);
3358 adapter->discovering = false;
3359 g_dbus_emit_property_changed(dbus_conn, adapter->path,
3360 ADAPTER_INTERFACE, "Discovering");
3362 trigger_passive_scanning(adapter);
3366 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
3367 adapter->disc_type = BT_DISC_TYPE_BREDR_ONLY;
3369 cp.type = adapter->discovery_type;
3370 #ifndef TIZEN_FEATURE_BLUEZ_MODIFY
3371 adapter->client = client;
3373 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
3376 mgmt_send(adapter->mgmt, MGMT_OP_STOP_DISCOVERY,
3377 adapter->dev_id, sizeof(cp), &cp,
3378 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
3379 stop_discovery_complete, client, NULL);
3381 stop_discovery_complete, adapter, NULL);
3384 return -EINPROGRESS;
3387 static void discovery_destroy(void *user_data)
3389 struct discovery_client *client = user_data;
3390 struct btd_adapter *adapter = client->adapter;
3392 DBG("owner %s", client->owner);
3394 adapter->set_filter_list = g_slist_remove(adapter->set_filter_list,
3397 adapter->discovery_list = g_slist_remove(adapter->discovery_list,
3400 if (client->discovery_filter) {
3401 free_discovery_filter(client->discovery_filter);
3402 client->discovery_filter = NULL;
3405 g_free(client->owner);
3409 * If there are other client discoveries in progress, then leave
3410 * it active. If not, then make sure to stop the restart timeout.
3412 if (adapter->discovery_list)
3415 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
3416 hci_clear_bit(BDADDR_BREDR, &adapter->discovery_type);
3418 adapter->discovery_type = 0x00;
3421 discovery_cleanup(adapter, 0);
3425 static void discovery_disconnect(DBusConnection *conn, void *user_data)
3427 struct discovery_client *client = user_data;
3429 DBG("owner %s", client->owner);
3430 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
3431 discovery_stop(client, true);
3435 discovery_stop(client);
3440 * Returns true if client was already discovering, false otherwise. *client
3441 * will point to discovering client, or client that have pre-set his filter.
3443 static bool get_discovery_client(struct btd_adapter *adapter,
3445 struct discovery_client **client)
3447 GSList *list = g_slist_find_custom(adapter->discovery_list, owner,
3450 *client = list->data;
3454 list = g_slist_find_custom(adapter->set_filter_list, owner,
3457 *client = list->data;
3465 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
3466 static void le_discovery_destroy(void *user_data)
3468 struct discovery_client *client = user_data;
3469 struct btd_adapter *adapter = client->adapter;
3471 DBG("owner %s", client->owner);
3473 adapter->le_discovery_list = g_slist_remove(adapter->le_discovery_list,
3476 g_free(client->owner);
3480 * If there are other client discoveries in progress, then leave
3481 * it active. If not, then make sure to stop the restart timeout.
3483 DBG("adapter->discovery_list[%p] adapter->le_discovery_list[%p]",
3484 adapter->discovery_list, adapter->le_discovery_list);
3485 if (adapter->discovery_list || adapter->le_discovery_list)
3488 hci_clear_bit(BDADDR_LE_PUBLIC, &adapter->discovery_type);
3489 hci_clear_bit(BDADDR_LE_RANDOM, &adapter->discovery_type);
3491 DBG("Restart Timer... adapter->discovery_type[%d]", adapter->discovery_type);
3492 if (adapter->discovery_idle_timeout > 0) {
3493 g_source_remove(adapter->discovery_idle_timeout);
3494 adapter->discovery_idle_timeout = 0;
3497 discovery_cleanup(adapter, 0);
3500 static void le_discovery_disconnect(DBusConnection *conn, void *user_data)
3502 struct discovery_client *client = user_data;
3503 struct btd_adapter *adapter = client->adapter;
3504 struct mgmt_cp_stop_le_discovery cp;
3506 DBG("owner %s", client->owner);
3508 adapter->le_discovery_list = g_slist_remove(adapter->le_discovery_list,
3512 * There is no need for extra cleanup of the client since that
3513 * will be done by the destroy callback.
3515 * However in case this is the last client, the discovery in
3516 * the kernel needs to be disabled.
3518 if (adapter->le_discovery_list)
3522 * In the idle phase of a discovery, there is no need to stop it
3523 * and so it is enough to send out the signal and just return.
3525 if (adapter->discovery_enable == 0x00) {
3526 adapter->le_discovering = false;
3527 g_dbus_emit_property_changed(dbus_conn, adapter->path,
3528 ADAPTER_INTERFACE, "LEDiscovering");
3530 if (adapter->discovering == false && adapter->le_discovering == false) {
3531 trigger_passive_scanning(adapter);
3538 mgmt_send(adapter->mgmt, MGMT_OP_STOP_LE_DISCOVERY,
3539 adapter->dev_id, sizeof(cp), &cp,
3540 stop_le_discovery_complete, adapter, NULL);
3543 #ifdef TIZEN_FEATURE_PLATFROM_SCAN_FILTER
3544 static void addr_filter_params_free(gpointer data)
3546 adapter_le_address_filter_params_t *params = data;
3551 static void uuid_filter_params_free(gpointer data)
3553 adapter_le_uuid_params_t *params = data;
3555 g_free((char *)params->uuid);
3556 g_free((char *)params->uuid_mask);
3560 static void manufacturer_filter_params_free(gpointer data)
3562 adapter_le_manf_data_params_t *params = data;
3564 g_free((char *)params->man_data);
3565 g_free((char *)params->man_data_mask);
3569 static void local_name_filter_params_free(gpointer data)
3571 adapter_le_local_name_params_t *params = data;
3573 g_free((char *)params->local_name);
3577 static void service_data_filter_params_free(gpointer data)
3579 adapter_le_service_data_params_t *params = data;
3581 g_free((char *)params->service_data);
3582 g_free((char *)params->service_data_mask);
3586 static void scan_filter_params_free(gpointer data)
3588 adapter_le_scan_filter_param_t *params = data;
3592 int adapter_le_address_cmp(gconstpointer a, gconstpointer b)
3594 const adapter_le_address_filter_params_t *params = a;
3595 const char *address = b;
3598 ba2str(¶ms->broadcaster_addr, addr);
3599 return strcasecmp(addr, address);
3602 int adapter_le_uuid_cmp(gconstpointer a, gconstpointer b)
3604 const adapter_le_uuid_params_t *params = a;
3605 const char *uuid = b;
3607 return strcasecmp((const char *)params->uuid, uuid);
3610 int adapter_le_manufacturer_data_cmp(gconstpointer a, gconstpointer b)
3612 const adapter_le_manf_data_params_t *params = a;
3613 const struct eir_msd *msd = b;
3615 if (msd->company == params->company_id) {
3616 /* if the advertisiement packet is an iBeacon */
3617 if (msd->company == COMPANY_ID_APPLE)
3619 return strncasecmp((const char *)params->man_data,
3620 (const char *)msd->data,
3621 params->man_data_len);
3627 int adapter_le_local_name_cmp(gconstpointer a, gconstpointer b)
3629 const adapter_le_local_name_params_t *params = a;
3630 const char *name = b;
3632 return strcasecmp(params->local_name, name);
3635 int adapter_le_service_data_cmp(gconstpointer a, gconstpointer b)
3637 const adapter_le_service_data_params_t *params = a;
3638 const struct eir_sd *sd = b;
3639 /* Todo, the service data format for 16 bit, 32bit and
3640 * 128 bit uuids needs to addressed */
3641 return strncasecmp((const char *)(params->service_data),
3642 (const char *)sd->data,
3646 int adapter_le_address_filter_index_cmp(gconstpointer a, gconstpointer b)
3648 const adapter_le_address_filter_params_t *params = a;
3649 uint16_t filter_inex = GPOINTER_TO_UINT(b);
3651 return params->filter_index - filter_inex;
3654 int adapter_le_uuid_filter_index_cmp(gconstpointer a, gconstpointer b)
3656 const adapter_le_uuid_params_t *params = a;
3657 uint16_t filter_inex = GPOINTER_TO_UINT(b);
3659 return params->filter_index - filter_inex;
3662 int adapter_le_manufacturer_data_filter_index_cmp(gconstpointer a, gconstpointer b)
3664 const adapter_le_manf_data_params_t *params = a;
3665 uint16_t filter_inex = GPOINTER_TO_UINT(b);
3667 return params->filter_index - filter_inex;
3670 int adapter_le_local_name_filter_index_cmp(gconstpointer a, gconstpointer b)
3672 const adapter_le_local_name_params_t *params = a;
3673 uint16_t filter_inex = GPOINTER_TO_UINT(b);
3675 return params->filter_index - filter_inex;
3678 int adapter_le_service_data_filter_index_cmp(gconstpointer a, gconstpointer b)
3680 const adapter_le_service_data_params_t *params = a;
3681 uint16_t filter_inex = GPOINTER_TO_UINT(b);
3683 return params->filter_index - filter_inex;
3686 int adapter_le_scan_params_filter_index_cmp(gconstpointer a, gconstpointer b)
3688 const adapter_le_scan_filter_param_t *params = a;
3689 uint16_t filter_inex = GPOINTER_TO_UINT(b);
3691 return params->index - filter_inex;
3694 static gboolean adapter_le_clear_platform_scan_filter_data(
3695 struct btd_adapter *adapter, int filter_index)
3702 list = g_slist_find_custom(adapter->addr_filters,
3703 GINT_TO_POINTER(filter_index), adapter_le_address_filter_index_cmp);
3704 if (list && list->data) {
3705 /* Delete info from the struct to list */
3706 adapter->addr_filters = g_slist_delete_link(adapter->addr_filters, list);
3708 list = g_slist_find_custom(adapter->service_data_changed_filters,
3709 GINT_TO_POINTER(filter_index), adapter_le_service_data_filter_index_cmp);
3710 if (list && list->data) {
3711 /* Delete info from the struct to list */
3712 adapter->service_data_changed_filters = g_slist_delete_link(adapter->service_data_changed_filters, list);
3715 list = g_slist_find_custom(adapter->service_uuid_filters,
3716 GINT_TO_POINTER(filter_index), adapter_le_uuid_filter_index_cmp);
3717 if (list && list->data) {
3718 /* Delete info from the struct to list */
3719 adapter->service_uuid_filters = g_slist_delete_link(adapter->service_uuid_filters, list);
3722 list = g_slist_find_custom(adapter->solicit_data_filters,
3723 GINT_TO_POINTER(filter_index), adapter_le_uuid_filter_index_cmp);
3724 if (list && list->data) {
3725 /* Delete info from the struct to list */
3726 adapter->solicit_data_filters = g_slist_delete_link(adapter->solicit_data_filters, list);
3729 list = g_slist_find_custom(adapter->local_name_filters,
3730 GINT_TO_POINTER(filter_index), adapter_le_local_name_filter_index_cmp);
3731 if (list && list->data) {
3732 /* Delete info from the struct to list */
3733 adapter->local_name_filters = g_slist_delete_link(adapter->local_name_filters, list);
3736 list = g_slist_find_custom(adapter->manufaturer_data_filters,
3737 GINT_TO_POINTER(filter_index), adapter_le_manufacturer_data_filter_index_cmp);
3738 if (list && list->data) {
3739 /* Delete info from the struct to list */
3740 adapter->manufaturer_data_filters = g_slist_delete_link(adapter->manufaturer_data_filters, list);
3743 list = g_slist_find_custom(adapter->service_data_filters,
3744 GINT_TO_POINTER(filter_index), adapter_le_service_data_filter_index_cmp);
3745 if (list && list->data) {
3746 /* Delete info from the struct to list */
3747 adapter->service_data_filters = g_slist_delete_link(adapter->service_data_filters, list);
3750 list = g_slist_find_custom(adapter->scan_params,
3751 GINT_TO_POINTER(filter_index), adapter_le_scan_params_filter_index_cmp);
3752 if (list && list->data) {
3753 /* Delete info from the struct to list */
3754 adapter->scan_params = g_slist_delete_link(adapter->scan_params, list);
3760 static gboolean adapter_le_enable_platform_scan_filtering(
3761 struct btd_adapter *adapter, gboolean enable)
3766 DBG("Platform scan filtering enable[%d]", enable);
3768 adapter->scan_filter_support = enable;
3774 static gboolean adapter_le_service_add_addr_scan_filter_data(struct btd_adapter *adapter,
3775 int filter_index, gchar *string, int addr_type)
3777 /* TYPE_DEVICE_ADDRESS */
3778 adapter_le_address_filter_params_t *params;
3782 params = g_new0(adapter_le_address_filter_params_t, 1);
3786 params->filter_index = filter_index;
3787 str2ba(string, ¶ms->broadcaster_addr);
3788 params->bdaddr_type = addr_type;
3790 /* Store the struct to list */
3791 adapter->addr_filters = g_slist_append(adapter->addr_filters, params);
3795 static const char *adapter_le_service_find_addr_scan_filter_data(
3796 struct btd_adapter *adapter, gchar *string)
3801 list = g_slist_find_custom(adapter->addr_filters, string, adapter_le_address_cmp);
3810 static gboolean adapter_le_service_delete_addr_scan_filter_data(struct btd_adapter *adapter,
3811 int filter_index, gchar *string, int addr_type)
3816 list = g_slist_find_custom(adapter->addr_filters, string, adapter_le_address_cmp);
3820 /* Delete info from the struct to list */
3821 adapter->addr_filters = g_slist_delete_link(adapter->addr_filters, list);
3826 static gboolean adapter_le_service_clear_addr_scan_filter_data(struct btd_adapter *adapter)
3830 g_slist_free_full(adapter->addr_filters, addr_filter_params_free);
3831 adapter->addr_filters = NULL;
3836 static gboolean adapter_le_service_add_uuid_scan_filter_data(struct btd_adapter *adapter,
3837 int filter_index, gboolean is_solicited, uint8_t *p_uuid,
3838 uint8_t *p_uuid_mask, int uuid_mask_len)
3841 adapter_le_uuid_params_t *params;
3846 params = g_new0(adapter_le_uuid_params_t, 1);
3850 if (uuid_mask_len == UUID_16_LEN) {
3851 uint16_t *uuid16 = (void *)p_uuid;
3852 sdp_uuid16_create((uuid_t *)&uuid, get_be16(uuid16));
3853 } else if (uuid_mask_len == UUID_32_LEN) {
3854 uint32_t *uuid32 = (void *)p_uuid;
3855 sdp_uuid32_create((uuid_t *)&uuid, get_be32(uuid32));
3857 sdp_uuid128_create((uuid_t *)&uuid, p_uuid);
3859 params->filter_index = filter_index;
3860 params->uuid = (uint8_t *)bt_uuid2string((uuid_t *)&uuid);
3861 params->uuid_mask = g_new0(uint8_t, uuid_mask_len);
3862 memcpy(params->uuid_mask, p_uuid_mask, uuid_mask_len);
3863 params->uuid_len = uuid_mask_len;
3865 /* Store the struct to list */
3866 adapter->solicit_data_filters = g_slist_append(adapter->solicit_data_filters, params);
3871 static adapter_le_uuid_params_t *adapter_le_service_find_uuid_scan_filter_data(struct btd_adapter *adapter,
3877 list = g_slist_find_custom(adapter->solicit_data_filters, p_uuid, adapter_le_uuid_cmp);
3881 /* Delete info from the struct to list */
3887 static gboolean adapter_le_service_delete_uuid_scan_filter_data(struct btd_adapter *adapter,
3888 int filter_index, gboolean is_solicited, uint8_t *p_uuid,
3889 uint8_t *p_uuid_mask, int uuid_mask_len)
3894 list = g_slist_find_custom(adapter->solicit_data_filters, GINT_TO_POINTER(filter_index), adapter_le_uuid_filter_index_cmp);
3898 adapter_le_uuid_params_t *params = list->data;
3899 /* Delete info from the struct to list */
3900 if (params && strcasecmp((const char *)params->uuid, (const char *)p_uuid)) {
3901 adapter->solicit_data_filters = g_slist_delete_link(adapter->solicit_data_filters, list);
3908 static gboolean adapter_le_service_clear_uuid_scan_filter_data(struct btd_adapter *adapter)
3912 g_slist_free_full(adapter->solicit_data_filters, uuid_filter_params_free);
3913 adapter->solicit_data_filters = NULL;
3918 static gboolean adapter_le_service_add_manufacturer_scan_filter_data(struct btd_adapter *adapter,
3919 int filter_index, int company_id, int company_id_mask,
3920 uint8_t *p_data, uint8_t *p_mask, int data_len)
3923 adapter_le_manf_data_params_t *params;
3927 params = g_new0(adapter_le_manf_data_params_t, 1);
3931 params->filter_index = filter_index;
3932 params->company_id = company_id;
3933 params->company_id_mask = company_id_mask;
3934 params->man_data = g_new0(uint8_t, data_len);
3935 memcpy(params->man_data, p_data, data_len);
3936 params->man_data_mask = g_new0(uint8_t, data_len);
3937 memcpy(params->man_data_mask, p_mask, data_len);
3938 params->man_data_len = data_len;
3940 /* Store the struct to list */
3941 adapter->manufaturer_data_filters = g_slist_append(adapter->manufaturer_data_filters, params);
3946 static adapter_le_manf_data_params_t *adapter_le_service_find_manufacturer_scan_filter_data(struct btd_adapter *adapter,
3947 struct eir_msd *msd)
3951 list = g_slist_find_custom(adapter->manufaturer_data_filters, msd, adapter_le_manufacturer_data_cmp);
3960 static gboolean adapter_le_service_delete_manufacturer_scan_filter_data(struct btd_adapter *adapter,
3961 int filter_index, int company_id, int company_id_mask,
3962 uint8_t *p_data, uint8_t *p_mask, int data_len)
3966 list = g_slist_find_custom(adapter->manufaturer_data_filters, GINT_TO_POINTER(filter_index), adapter_le_manufacturer_data_filter_index_cmp);
3970 adapter_le_manf_data_params_t *params = list->data;
3971 /* Delete info from the struct to list */
3972 if (params && strcasecmp((const char *)params->man_data, (const char *)p_data)) {
3973 adapter->manufaturer_data_filters = g_slist_delete_link(adapter->manufaturer_data_filters, list);
3980 static gboolean adapter_le_service_clear_manufacturer_scan_filter_data(struct btd_adapter *adapter)
3984 g_slist_free_full(adapter->manufaturer_data_filters, manufacturer_filter_params_free);
3985 adapter->manufaturer_data_filters = NULL;
3990 static gboolean adapter_le_service_add_local_name_scan_filter_data(struct btd_adapter *adapter,
3991 int filter_index, gchar *name)
3994 adapter_le_local_name_params_t *params;
3998 params = g_new0(adapter_le_local_name_params_t, 1);
4002 params->filter_index = filter_index;
4003 params->local_name = g_strdup(name);
4004 params->name_len = strlen(name);
4006 /* Store the struct to list */
4007 adapter->local_name_filters = g_slist_append(adapter->local_name_filters, params);
4012 static adapter_le_local_name_params_t *adapter_le_service_find_local_name_scan_filter_data(
4013 struct btd_adapter *adapter,
4018 list = g_slist_find_custom(adapter->local_name_filters, name, adapter_le_local_name_cmp);
4027 static gboolean adapter_le_service_delete_local_name_scan_filter_data(struct btd_adapter *adapter,
4028 int filter_index, gchar *name)
4032 list = g_slist_find_custom(adapter->local_name_filters, GINT_TO_POINTER(filter_index), adapter_le_local_name_filter_index_cmp);
4036 adapter_le_local_name_params_t *params = list->data;
4037 /* Delete info from the struct to list */
4038 if (params && strcasecmp((const char *)params->local_name, (const char *)name)) {
4039 adapter->local_name_filters = g_slist_delete_link(adapter->local_name_filters, list);
4046 static gboolean adapter_le_service_clear_local_name_scan_filter_data(struct btd_adapter *adapter)
4050 g_slist_free_full(adapter->local_name_filters, local_name_filter_params_free);
4051 adapter->local_name_filters = NULL;
4056 static gboolean adapter_le_service_add_service_scan_filter_data(struct btd_adapter *adapter,
4057 int filter_index, uint8_t *p_data, uint8_t *p_mask, int data_len)
4059 adapter_le_service_data_params_t *params;
4063 params = g_new0(adapter_le_service_data_params_t, 1);
4067 params->filter_index = filter_index;
4068 params->service_data = g_new0(uint8_t, data_len);
4069 memcpy(params->service_data, p_data, data_len);
4070 params->service_data_mask = g_new0(uint8_t, data_len);
4071 memcpy(params->service_data_mask, p_mask, data_len);
4072 params->service_data_len = data_len;
4074 /* Store the struct to list */
4075 adapter->service_data_filters = g_slist_append(adapter->service_data_filters, params);
4080 static adapter_le_service_data_params_t* adapter_le_service_find_service_scan_filter_data(
4081 struct btd_adapter *adapter, struct eir_sd *sd)
4086 list = g_slist_find_custom(adapter->service_data_filters, sd, adapter_le_service_data_cmp);
4095 static gboolean adapter_le_service_delete_service_scan_filter_data(struct btd_adapter *adapter,
4096 int filter_index, uint8_t *p_data, uint8_t *p_mask, int data_len)
4101 list = g_slist_find_custom(adapter->service_data_filters, GINT_TO_POINTER(filter_index), adapter_le_service_data_filter_index_cmp);
4105 adapter_le_service_data_params_t *params = list->data;
4106 /* Delete info from the struct to list */
4107 if (params && strcasecmp((const char *)params->service_data, (const char *)p_data)) {
4108 adapter->service_data_filters = g_slist_delete_link(adapter->service_data_filters, list);
4114 static gboolean adapter_le_service_clear_service_scan_filter_data(struct btd_adapter *adapter)
4118 g_slist_free_full(adapter->service_data_filters, service_data_filter_params_free);
4119 adapter->service_data_filters = NULL;
4124 static gboolean adapter_le_service_add_scan_filter_params(struct btd_adapter *adapter,
4125 adapter_le_scan_filter_param_t *params)
4127 adapter_le_scan_filter_param_t *l_params;
4131 l_params = g_new0(adapter_le_scan_filter_param_t, 1);
4135 l_params->action = params->action;
4136 l_params->delivery_mode = params->delivery_mode;
4137 l_params->feature = params->feature;
4138 l_params->filter_logic_type = params->filter_logic_type;
4139 l_params->index = params->index;
4140 l_params->list_logic_type = params->list_logic_type;
4141 l_params->onfound_timeout = params->onfound_timeout;
4142 l_params->onfound_timeout_cnt = params->onfound_timeout_cnt;
4143 l_params->rssi_high_threshold = params->rssi_high_threshold;
4144 l_params->rssi_low_threshold = params->rssi_low_threshold;
4146 /* Store the struct to list */
4147 adapter->scan_params = g_slist_append(adapter->scan_params, l_params);
4152 static adapter_le_scan_filter_param_t *adapter_le_service_find_scan_filter_params(
4153 struct btd_adapter *adapter, int filter_index)
4158 list = g_slist_find_custom(adapter->scan_params, GINT_TO_POINTER(filter_index), adapter_le_scan_params_filter_index_cmp);
4167 static gboolean adapter_le_service_delete_scan_filter_params(struct btd_adapter *adapter,
4168 adapter_le_scan_filter_param_t *params)
4173 list = g_slist_find_custom(adapter->scan_params, GINT_TO_POINTER(params->index), adapter_le_scan_params_filter_index_cmp);
4177 adapter->scan_params = g_slist_remove(adapter->scan_params, list);
4182 static gboolean adapter_le_service_clear_scan_filter_params(struct btd_adapter *adapter)
4186 g_slist_free_full(adapter->scan_params, scan_filter_params_free);
4187 adapter->scan_params = NULL;
4192 int adapter_byte_arr_cmp_with_mask(const char *data1, const char *data2,
4193 const char *mask, int data_len)
4197 if (data1 == NULL || data2 == NULL || mask == NULL)
4199 for (i = 0; i < data_len; i++) {
4200 a = data1[i] & mask[i];
4201 b = data2[i] & mask[i];
4203 return (int)(a - b);
4208 static uint8_t validate_for_filter_policy(struct btd_adapter *adapter,
4209 const struct eir_data *eir, gchar *addr)
4211 uint8_t allow_report = NONE_REPORT;
4213 if (adapter->scan_filter_support == FALSE)
4214 allow_report = SCAN_REPORT;
4216 if (adapter_le_service_find_addr_scan_filter_data(adapter, addr))
4217 allow_report = SCAN_REPORT;
4219 if(adapter_le_service_find_local_name_scan_filter_data(adapter, eir->name))
4220 allow_report = SCAN_REPORT;
4223 GSList *list = NULL;
4224 for (list = eir->sd_list; list != NULL; list = g_slist_next(list)) {
4225 struct eir_sd *sd = list->data;
4227 static adapter_le_uuid_params_t *uuid_data = NULL;
4228 static adapter_le_service_data_params_t *service_data = NULL;
4229 static adapter_le_scan_filter_param_t *scan_param_data = NULL;
4230 uuid_data = adapter_le_service_find_uuid_scan_filter_data(adapter, (uint8_t *)sd->uuid);
4231 service_data = adapter_le_service_find_service_scan_filter_data(adapter, sd);
4232 if (service_data != NULL) {
4233 if (!adapter_byte_arr_cmp_with_mask((const char *)service_data->service_data,
4234 (const char *)sd->data, (const char *)service_data->service_data_mask,
4235 service_data->service_data_len)) {
4236 scan_param_data = adapter_le_service_find_scan_filter_params(adapter,
4237 service_data->filter_index);
4238 if (scan_param_data && scan_param_data->rssi_high_threshold > eir->tx_power &&
4239 scan_param_data->rssi_low_threshold < eir->tx_power)
4240 allow_report = SCAN_REPORT;
4243 if (uuid_data != NULL) {
4244 if (!adapter_byte_arr_cmp_with_mask((const char *)uuid_data->uuid,
4245 (const char *)sd->uuid, (const char *)uuid_data->uuid_mask,
4246 uuid_data->uuid_len)) {
4247 scan_param_data = adapter_le_service_find_scan_filter_params(adapter,
4248 uuid_data->filter_index);
4249 if (scan_param_data && scan_param_data->rssi_high_threshold > eir->tx_power &&
4250 scan_param_data->rssi_low_threshold < eir->tx_power)
4251 allow_report = SCAN_REPORT;
4259 if (eir->msd_list) {
4260 GSList *list = NULL;
4261 for (list = eir->msd_list; list != NULL; list = g_slist_next(list)) {
4262 struct eir_msd *msd = list->data;
4264 static adapter_le_manf_data_params_t *manuf_data;
4265 static adapter_le_scan_filter_param_t *scan_param_data = NULL;
4266 manuf_data = adapter_le_service_find_manufacturer_scan_filter_data(adapter,
4268 if (manuf_data != NULL) {
4269 if (!adapter_byte_arr_cmp_with_mask((const char *)msd->data,
4270 (const char *)manuf_data->man_data, (const char *)manuf_data->man_data_mask,
4271 manuf_data->man_data_len)) {
4272 scan_param_data = adapter_le_service_find_scan_filter_params(adapter,
4273 manuf_data->filter_index);
4274 if (scan_param_data && scan_param_data->rssi_high_threshold > eir->tx_power &&
4275 scan_param_data->rssi_low_threshold < eir->tx_power)
4276 allow_report = SCAN_REPORT;
4278 if (msd->company == COMPANY_ID_APPLE)
4279 allow_report = IBEACON_REPORT;
4285 return allow_report;
4288 gboolean adapter_le_set_platform_scan_filter_params(struct btd_adapter *adapter,
4289 adapter_le_scan_filter_param_t *params)
4291 gboolean ret = TRUE;
4292 DBG("adapter_le_scan_filter_param_t [%d]", params->index);
4293 adapter_le_scan_filter_action_type action_type = params->action;
4295 if (action_type == ADD) {
4296 ret = adapter_le_service_add_scan_filter_params(adapter, params);
4297 } else if (action_type == DELETE) {
4298 ret = adapter_le_service_delete_scan_filter_params(adapter, params);
4299 } else if (action_type == CLEAR) {
4300 ret = adapter_le_service_clear_scan_filter_params(adapter);
4302 DBG("filter_action error");
4306 DBG("Scan Filter VSC :: Action [%x]",
4311 gboolean adapter_le_set_platform_scan_filter_data(struct btd_adapter *adapter,
4312 int client_if, int action,
4313 int filt_type, int filter_index,
4315 int company_id_mask,
4316 int uuid_len, uint8_t *p_uuid,
4317 int uuid_mask_len, uint8_t *p_uuid_mask,
4318 gchar *string, int addr_type,
4319 int data_len, uint8_t *p_data,
4320 int mask_len, uint8_t *p_mask)
4322 gboolean ret = TRUE;
4326 switch (filt_type) {
4327 case TYPE_DEVICE_ADDRESS: {
4328 /* TYPE_DEVICE_ADDRESS */
4329 adapter_le_scan_filter_action_type action_type = action;
4331 if (action_type == ADD) {
4332 ret = adapter_le_service_add_addr_scan_filter_data(adapter,
4333 filter_index, string, addr_type);
4334 } else if (action_type == DELETE) {
4335 ret = adapter_le_service_delete_addr_scan_filter_data(adapter,
4336 filter_index, string, addr_type);
4337 } else if (action_type == CLEAR) {
4338 ret = adapter_le_service_clear_addr_scan_filter_data(adapter);
4340 DBG("filter_action error");
4347 case TYPE_SERVICE_UUID:
4348 case TYPE_SOLICIT_UUID: {
4349 adapter_le_scan_filter_action_type action_type = action;
4351 gboolean is_solicited = (filt_type == TYPE_SOLICIT_UUID) ? TRUE : FALSE;
4353 if (uuid_len != UUID_16_LEN && uuid_len != UUID_32_LEN
4354 && uuid_len != UUID_128_LEN) {
4355 DBG("UUID length error");
4359 if (uuid_len != uuid_mask_len) {
4360 DBG("Both UUID and UUID_MASK length shoule be samed");
4364 if (action_type == ADD) {
4365 ret = adapter_le_service_add_uuid_scan_filter_data(adapter,
4366 filter_index, is_solicited, p_uuid,
4367 p_uuid_mask, uuid_len);
4368 } else if (action_type == DELETE) {
4369 ret = adapter_le_service_delete_uuid_scan_filter_data(adapter,
4370 filter_index, is_solicited, p_uuid,
4371 p_uuid_mask, uuid_len);
4372 } else if (action_type == CLEAR) {
4373 ret = adapter_le_service_clear_uuid_scan_filter_data(adapter);
4375 DBG("filter_action error");
4382 case TYPE_LOCAL_NAME: {
4383 adapter_le_scan_filter_action_type action_type = action;
4385 if (action_type == ADD) {
4386 ret = adapter_le_service_add_local_name_scan_filter_data(adapter,
4387 filter_index, (gchar*)string);
4388 } else if (action_type == DELETE) {
4389 ret = adapter_le_service_delete_local_name_scan_filter_data(adapter,
4390 filter_index, (gchar*)string);
4391 } else if (action_type == CLEAR) {
4392 ret = adapter_le_service_clear_local_name_scan_filter_data(adapter);
4394 DBG("filter_action error");
4401 case TYPE_MANUFACTURER_DATA: {
4402 adapter_le_scan_filter_action_type action_type = action;
4404 if (data_len == 0 || (data_len != mask_len)) {
4405 DBG("parameter length error");
4409 if (action_type == ADD) {
4410 ret = adapter_le_service_add_manufacturer_scan_filter_data(adapter,
4411 filter_index,company_id, company_id_mask, p_data, p_mask, data_len);
4412 } else if (action_type == DELETE) {
4413 ret = adapter_le_service_delete_manufacturer_scan_filter_data(adapter,
4414 filter_index, company_id, company_id_mask, p_data, p_mask, data_len);
4415 } else if (action_type == CLEAR) {
4416 ret = adapter_le_service_clear_manufacturer_scan_filter_data(adapter);
4418 DBG("filter_action error");
4425 case TYPE_SERVICE_DATA: {
4426 adapter_le_scan_filter_action_type action_type = action;
4428 if (data_len == 0 || (data_len != mask_len)) {
4429 DBG("parameter length error");
4433 if (action_type == ADD) {
4434 ret = adapter_le_service_add_service_scan_filter_data(adapter,
4435 filter_index, p_data, p_mask, data_len);
4436 } else if (action_type == DELETE) {
4437 ret = adapter_le_service_delete_service_scan_filter_data(adapter,
4438 filter_index, p_data, p_mask, data_len);
4439 } else if (action_type == CLEAR) {
4440 ret = adapter_le_service_clear_service_scan_filter_data(adapter);
4442 DBG("filter_action error");
4450 DBG("filter_type error");
4458 static bool is_set_adv_data_flag(uint8_t *data, int data_len)
4461 for (int i = 0; i < data_len; i++) {
4462 adv_type = data[i + 1];
4463 if (adv_type == EIR_FLAGS)
4471 static int set_adv_data_flag(uint8_t *adv_data, uint8_t *data, int data_len, void *user_data)
4473 struct btd_adapter *adapter = user_data;
4475 if (is_set_adv_data_flag(data, data_len))
4479 adv_data[1] = EIR_FLAGS;
4481 if (adapter->le_static_addr.b[5] != 0)
4482 adv_data[2] = EIR_GEN_DISC | EIR_CONTROLLER |
4483 EIR_SIM_HOST | EIR_BREDR_UNSUP;
4485 if (TIZEN_FEATURE_BLUEZ_DA) {
4486 DBG("Disable LE General Discoverable Mode");
4487 adv_data[2] = EIR_CONTROLLER | EIR_SIM_HOST;
4489 adv_data[2] = EIR_GEN_DISC | EIR_CONTROLLER | EIR_SIM_HOST;
4492 memcpy(adv_data + 3, data, data_len);
4493 return data_len + 3;
4496 static int set_adv_data_device_name(uint8_t *adv_data, int adv_len, char *name)
4502 uint8_t *data = NULL;
4507 data = g_memdup(adv_data, adv_len);
4511 name_len = strlen(name);
4513 for (i = 0; i <adv_len ; i++) {
4515 ad_type = data[i + 1];
4517 if (ad_type == EIR_NAME_COMPLETE && ad_len == 1) {
4518 /* Move to last position and update local name */
4519 for (j = i; j < adv_len - 2; j++)
4520 adv_data[j] = data[j + 2];
4522 adv_data[j] = name_len + 1;
4523 if (name_len > ADV_DATA_MAX_LENGTH - adv_len) {
4524 adv_data[j] = ADV_DATA_MAX_LENGTH - adv_len + 1;
4525 adv_data[j + 1] = EIR_NAME_SHORT;
4526 memcpy(adv_data + j + 2, name, ADV_DATA_MAX_LENGTH - adv_len);
4528 return ADV_DATA_MAX_LENGTH;
4530 adv_data[j + 1] = EIR_NAME_COMPLETE;
4531 memcpy(adv_data + j + 2, name, name_len);
4533 return adv_len + name_len;
4537 memcpy(adv_data + i, &data[i], ad_len + 1);
4546 static int set_adv_data_tx_power(uint8_t *adv_data, int adv_len, int8_t tx_power)
4551 uint8_t *data = NULL;
4553 data = g_memdup(adv_data, adv_len);
4557 for (i = 0; i <adv_len ; i++) {
4559 ad_type = data[i + 1];
4561 if (ad_type == EIR_TX_POWER) {
4563 adv_data[i + 1] = EIR_TX_POWER;
4564 adv_data[i + 2] = tx_power;
4566 for(j = i + 2; j < adv_len; j++)
4567 adv_data[j + 1] = data[j];
4572 memcpy(adv_data + i, &data[i], ad_len + 1);
4582 static int adapter_le_set_missed_adv_data(uint8_t *p_data, uint8_t data_len,
4583 gboolean is_scan_rsp, char *adapter_name, int8_t tx_power, uint8_t **adv_data, int *adv_len,
4589 data = g_malloc0(ADV_DATA_MAX_LENGTH);
4590 memcpy(data, p_data, data_len);
4593 /* In case multi advertising, need to update the below AD type
4594 since it handled into kernel */
4596 len = set_adv_data_flag(data, p_data, data_len, user_data);
4599 len = set_adv_data_tx_power(data, len, tx_power);
4601 len = set_adv_data_device_name(data, len, adapter_name);
4608 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
4609 static DBusMessage *adapter_get_psm_l2cap_le(DBusConnection *conn,
4610 DBusMessage *msg, void *user_data)
4612 return get_psm_l2cap_le(conn, msg);
4615 static DBusMessage *adapter_listen_l2cap_le_socket(DBusConnection *conn,
4616 DBusMessage *msg, void *user_data)
4618 return listen_l2cap_le_socket(conn, msg, user_data);
4621 static DBusMessage *adapter_remove_l2cap_le_socket(DBusConnection *conn,
4622 DBusMessage *msg, void *user_data)
4624 return remove_l2cap_le_socket(conn, msg);
4629 static DBusMessage *adapter_start_custom_discovery(DBusConnection *conn,
4630 DBusMessage *msg, void *user_data)
4632 struct btd_adapter *adapter = user_data;
4633 const char *sender = dbus_message_get_sender(msg);
4634 struct discovery_client *client;
4636 const gchar *disc_type;
4638 DBG("sender %s", sender);
4640 if (!(adapter->current_settings & MGMT_SETTING_POWERED))
4641 return btd_error_not_ready(msg);
4643 if (!dbus_message_get_args(msg, NULL, DBUS_TYPE_STRING, &disc_type,
4644 DBUS_TYPE_INVALID)) {
4645 return btd_error_invalid_args(msg);
4648 DBG("discovery type = %s", disc_type);
4650 /*Valid strings: "BREDR", "LE", "LE_BREDR" */
4651 if (g_strcmp0(disc_type, "BREDR") == 0)
4652 adapter->disc_type = BT_DISC_TYPE_BREDR_ONLY;
4653 else if (g_strcmp0(disc_type, "LE") == 0)
4654 adapter->disc_type = BT_DISC_TYPE_LE_ONLY;
4655 else if (g_strcmp0(disc_type, "LE_BREDR") == 0)
4656 adapter->disc_type = BT_DISC_TYPE_LE_BREDR;
4658 return btd_error_invalid_args(msg);
4661 * Every client can only start one discovery, if the client
4662 * already started a discovery then return an error.
4664 list = g_slist_find_custom(adapter->discovery_list, sender,
4667 return btd_error_busy(msg);
4669 client = g_new0(struct discovery_client, 1);
4671 client->adapter = adapter;
4672 client->owner = g_strdup(sender);
4673 client->watch = g_dbus_add_disconnect_watch(dbus_conn, sender,
4674 discovery_disconnect, client,
4677 adapter->discovery_list = g_slist_prepend(adapter->discovery_list,
4681 * Just trigger the discovery here. In case an already running
4682 * discovery in idle phase exists, it will be restarted right
4685 trigger_start_discovery(adapter, 0);
4687 return dbus_message_new_method_return(msg);
4690 static DBusMessage *adapter_start_le_discovery(DBusConnection *conn,
4691 DBusMessage *msg, void *user_data)
4693 struct btd_adapter *adapter = user_data;
4694 const char *sender = dbus_message_get_sender(msg);
4695 struct discovery_client *client;
4698 DBG("sender %s", sender);
4700 if (!(adapter->current_settings & MGMT_SETTING_POWERED))
4701 return btd_error_not_ready(msg);
4704 * Every client can only start one discovery, if the client
4705 * already started a discovery then return an error.
4708 adapter->disc_type = BT_DISC_TYPE_LE_ONLY;
4709 DBG("adapter->disc_type[%d]", adapter->disc_type);
4710 DBG("adapter->discovery_type [%d]", adapter->discovery_type);
4712 list = g_slist_find_custom(adapter->le_discovery_list, sender,
4715 return btd_error_busy(msg);
4717 client = g_new0(struct discovery_client, 1);
4719 client->adapter = adapter;
4720 client->owner = g_strdup(sender);
4721 client->watch = g_dbus_add_disconnect_watch(dbus_conn, sender,
4722 le_discovery_disconnect, client,
4723 le_discovery_destroy);
4725 adapter->le_discovery_list = g_slist_prepend(adapter->le_discovery_list,
4729 * Just trigger the discovery here. In case an already running
4730 * discovery in idle phase exists, it will be restarted right
4733 trigger_start_le_discovery(adapter, 0);
4735 return dbus_message_new_method_return(msg);
4738 static DBusMessage *adapter_stop_le_discovery(DBusConnection *conn,
4739 DBusMessage *msg, void *user_data)
4741 struct btd_adapter *adapter = user_data;
4742 const char *sender = dbus_message_get_sender(msg);
4743 struct mgmt_cp_stop_le_discovery cp;
4744 struct discovery_client *client;
4747 DBG("sender %s", sender);
4749 if (adapter->le_discovery_idle_timeout > 0) {
4750 DBG("Remove LE scan trigger");
4751 g_source_remove(adapter->le_discovery_idle_timeout);
4752 adapter->le_discovery_idle_timeout = 0;
4755 if (!(adapter->current_settings & MGMT_SETTING_POWERED))
4756 return btd_error_not_ready(msg);
4758 list = g_slist_find_custom(adapter->le_discovery_list, sender,
4761 return btd_error_failed(msg, "No discovery started");
4763 client = list->data;
4765 adapter->disc_type = BT_DISC_TYPE_LE_ONLY;
4766 DBG("adapter->disc_type[%d]", adapter->disc_type);
4767 DBG("adapter->discovery_type [%d]", adapter->discovery_type);
4769 cp.type = adapter->discovery_type;
4770 DBG("cp.type %d", cp.type);
4773 * As long as other discovery clients are still active, just
4774 * clenup client info and return success.
4776 DBG("adapter->le_discovery_list %p", adapter->le_discovery_list);
4777 if (g_slist_next(adapter->le_discovery_list)) {
4779 * The destroy function will cleanup the client information and
4780 * also remove it from the list of discovery clients.
4782 g_dbus_remove_watch(dbus_conn, client->watch);
4783 return dbus_message_new_method_return(msg);
4787 * In the idle phase of a discovery, there is no need to stop it
4788 * and so it is enough to send out the signal and just return.
4790 DBG("cp.type %d", cp.type);
4791 DBG("adapter->discovery_enable %d", adapter->discovery_enable);
4792 if (adapter->discovery_enable == 0x00) {
4793 adapter->le_discovering = false;
4794 g_dbus_remove_watch(dbus_conn, client->watch);
4795 g_dbus_emit_property_changed(dbus_conn, adapter->path,
4796 ADAPTER_INTERFACE, "LEDiscovering");
4798 trigger_passive_scanning(adapter);
4799 return dbus_message_new_method_return(msg);
4802 DBG("adapter->discovery_type %d", adapter->discovery_type);
4804 DBG("cp.type %d", cp.type);
4805 mgmt_send(adapter->mgmt, MGMT_OP_STOP_LE_DISCOVERY,
4806 adapter->dev_id, sizeof(cp), &cp,
4807 stop_le_discovery_complete, adapter, NULL);
4809 client->msg = dbus_message_ref(msg);
4813 static DBusMessage *adapter_set_advertising(DBusConnection *conn,
4814 DBusMessage *msg, void *data)
4816 struct btd_adapter *adapter = data;
4818 dbus_bool_t enable = FALSE;
4819 dbus_int32_t slot_id;
4821 if (!(adapter->current_settings & MGMT_SETTING_POWERED))
4822 return btd_error_not_ready(msg);
4824 if (!dbus_message_get_args(msg, NULL, DBUS_TYPE_BOOLEAN, &enable,
4825 DBUS_TYPE_INT32, &slot_id,
4827 return btd_error_invalid_args(msg);
4829 if (adapter->adv_restart_timeout && adapter->adv_restart_instance == slot_id) {
4830 DBG("restart advertising slot_id %d restart is in progress", slot_id);
4831 return btd_error_in_progress(msg);
4834 DBG("%s advertising slot_id %d", enable ? "Enable" : "Disable", slot_id);
4836 if (adapter_le_is_supported_multi_advertising() && slot_id > 0)
4837 err = adapter_le_enable_multi_adv(adapter, enable, slot_id);
4839 err = set_mode(adapter, MGMT_OP_SET_ADVERTISING, enable);
4842 return btd_error_failed(msg, "Set Advertising failed");
4845 create_advertiser(adapter, slot_id);
4847 if (err && slot_id > 0)
4848 advertising_state_changed(adapter, slot_id, enable);
4850 return dbus_message_new_method_return(msg);
4853 static DBusMessage *adapter_set_advertising_params(DBusConnection *conn,
4854 DBusMessage *msg, void *data)
4856 struct btd_adapter *adapter = data;
4857 struct mgmt_cp_set_advertising_params cp;
4858 dbus_uint32_t interval_min;
4859 dbus_uint32_t interval_max;
4860 dbus_uint32_t filter_policy;
4862 dbus_int32_t tx_power_level;
4863 dbus_int32_t slot_id;
4866 DBG("Set customised advertising parameters");
4868 if (!(adapter->current_settings & MGMT_SETTING_POWERED))
4869 return btd_error_not_ready(msg);
4871 if (!dbus_message_get_args(msg, NULL,
4872 DBUS_TYPE_UINT32, &interval_min,
4873 DBUS_TYPE_UINT32, &interval_max,
4874 DBUS_TYPE_UINT32, &filter_policy,
4875 DBUS_TYPE_UINT32, &type,
4876 DBUS_TYPE_INT32, &tx_power_level,
4877 DBUS_TYPE_INT32, &slot_id,
4879 return btd_error_invalid_args(msg);
4881 memset(&cp, 0, sizeof(cp));
4883 DBG("advertising interval min %x, max %x, filter %x type %x, tx power %d",
4884 interval_min, interval_max, filter_policy, type, tx_power_level);
4886 if (filter_policy > 0x03)
4887 return btd_error_invalid_args(msg);
4890 return btd_error_invalid_args(msg);
4892 if (adapter_le_is_supported_multi_advertising() && slot_id > 0) {
4893 adapter_le_adv_inst_info_t *p_inst;
4894 adapter_le_adv_param_t *p_params;
4896 p_inst = g_malloc0(sizeof(adapter_le_adv_inst_info_t));
4897 p_params = g_malloc0(sizeof(adapter_le_adv_param_t));
4898 p_inst->inst_id = slot_id;
4899 p_params->adv_int_min = interval_min;
4900 p_params->adv_int_max = interval_max;
4901 p_params->adv_type = type;
4902 p_params->channel_map = 0x07; /* fixed channel :: will be used all */
4903 p_params->adv_filter_policy = filter_policy;
4904 p_params->tx_power = tx_power_level;
4906 if (adapter->current_settings & MGMT_SETTING_PRIVACY) {
4907 p_inst->bdaddr_type = 0x01;
4908 bacpy(&p_inst->bdaddr, &adapter->rpa);
4909 } else if (adapter->le_static_addr.b[5] != 0) {
4910 p_inst->bdaddr_type = 0x01;
4911 bacpy(&p_inst->bdaddr, &adapter->le_static_addr);
4913 p_inst->bdaddr_type = 0x00;
4914 bacpy(&p_inst->bdaddr, &adapter->bdaddr);
4917 ret = adapter_le_set_multi_adv_params(p_inst, p_params);
4923 return dbus_message_new_method_return(msg);
4925 return btd_error_failed(msg, "set advertising param failed");
4927 cp.interval_max = interval_max;
4928 cp.interval_min = interval_min;
4929 cp.filter_policy = filter_policy;
4932 if (mgmt_send(adapter->mgmt, MGMT_OP_SET_ADVERTISING_PARAMS,
4933 adapter->dev_id, sizeof(cp), &cp,
4934 NULL, NULL, NULL) > 0)
4935 return dbus_message_new_method_return(msg);
4937 return btd_error_failed(msg, "set advertising param failed");
4941 static DBusMessage *adapter_set_advertising_data(DBusConnection *conn,
4942 DBusMessage *msg, void *data)
4944 struct btd_adapter *adapter = data;
4945 struct mgmt_cp_set_advertising_data cp;
4948 dbus_int32_t slot_id;
4949 uint8_t *adv_data = NULL;
4951 char *adapter_name = adapter->name;
4952 char le_name[MAX_NAME_LENGTH + 1] = { 0 };
4954 DBG("Set advertising data");
4956 if (!(adapter->current_settings & MGMT_SETTING_POWERED))
4957 return btd_error_not_ready(msg);
4959 if (!dbus_message_get_args(msg, NULL,
4960 DBUS_TYPE_ARRAY, DBUS_TYPE_BYTE, &value, &len,
4961 DBUS_TYPE_INT32, &slot_id,
4963 return btd_error_invalid_args(msg);
4965 if (is_set_adv_data_flag(value, len)) {
4966 if (len > ADV_DATA_MAX_LENGTH)
4967 return btd_error_invalid_args(msg);
4969 if (len > ADV_DATA_MAX_LENGTH - 3)
4970 return btd_error_invalid_args(msg);
4973 if (adapter->le_static_addr.b[5] != 0) {
4976 g_strlcpy(le_name, adapter_name,
4977 sizeof(le_name) - LE_BEARER_POSTFIX_LEN);
4978 if (!g_utf8_validate(le_name, -1, (const char **)&ptr))
4981 g_strlcat(le_name, LE_BEARER_POSTFIX, sizeof(le_name));
4982 adapter_name = le_name;
4985 adapter_le_set_missed_adv_data(value, len, FALSE,
4986 adapter_name, adapter->adv_tx_power, &adv_data, &adv_len, adapter);
4988 if (adapter_le_is_supported_multi_advertising() && slot_id > 0) {
4989 if (adapter_le_set_multi_adv_data(slot_id, FALSE, adv_len, adv_data)) {
4991 return dbus_message_new_method_return(msg);
4994 return btd_error_failed(msg, "set advertising data failed");
4997 memcpy(&cp, adv_data, adv_len);
4999 if (mgmt_send(adapter->mgmt, MGMT_OP_SET_ADVERTISING_DATA,
5000 adapter->dev_id, adv_len,
5001 &cp, NULL, NULL, NULL) > 0) {
5003 return dbus_message_new_method_return(msg);
5007 return btd_error_failed(msg, "set advertising data failed");
5011 static DBusMessage *adapter_le_scan_filter_param_setup(DBusConnection *conn,
5012 DBusMessage *msg, void *data)
5014 struct btd_adapter *adapter = data;
5015 #ifdef TIZEN_FEATURE_PLATFROM_SCAN_FILTER
5016 dbus_bool_t ctlr_filter_support = TRUE;
5018 dbus_int32_t client_if, action, filt_index;
5019 dbus_int32_t feat_seln, list_logic_type, filt_logic_type;
5020 dbus_int32_t rssi_high_thres, rssi_low_thres, dely_mode;
5021 dbus_int32_t found_timeout, lost_timeout, found_timeout_cnt;
5022 adapter_le_scan_filter_param_t params;
5025 DBG("adapter_le_scan_filter_param_setup");
5027 if (!(adapter->current_settings & MGMT_SETTING_POWERED))
5028 return btd_error_not_ready(msg);
5030 if (adapter_le_get_scan_filter_size() == 0)
5031 #ifndef TIZEN_FEATURE_PLATFROM_SCAN_FILTER
5032 return btd_error_not_supported(msg);
5034 ctlr_filter_support = FALSE;
5037 if (!dbus_message_get_args(msg, NULL, DBUS_TYPE_INT32, &client_if,
5038 DBUS_TYPE_INT32, &action,
5039 DBUS_TYPE_INT32, &filt_index,
5040 DBUS_TYPE_INT32, &feat_seln,
5041 DBUS_TYPE_INT32, &list_logic_type,
5042 DBUS_TYPE_INT32, &filt_logic_type,
5043 DBUS_TYPE_INT32, &rssi_high_thres,
5044 DBUS_TYPE_INT32, &rssi_low_thres,
5045 DBUS_TYPE_INT32, &dely_mode,
5046 DBUS_TYPE_INT32, &found_timeout,
5047 DBUS_TYPE_INT32, &lost_timeout,
5048 DBUS_TYPE_INT32, &found_timeout_cnt,
5050 return btd_error_invalid_args(msg);
5052 memset(¶ms, 0, sizeof(params));
5054 params.action = action;
5055 params.index = filt_index;
5056 params.feature = feat_seln;
5057 params.filter_logic_type = filt_logic_type;
5058 params.list_logic_type = list_logic_type;
5059 params.delivery_mode = dely_mode;
5060 params.rssi_high_threshold = rssi_high_thres;
5062 if (params.delivery_mode == ON_FOUND) {
5063 params.rssi_low_threshold = rssi_low_thres;
5064 params.onfound_timeout = found_timeout;
5065 params.onfound_timeout_cnt = found_timeout_cnt;
5066 params.onlost_timeout = lost_timeout;
5069 #ifdef TIZEN_FEATURE_PLATFROM_SCAN_FILTER
5070 if (ctlr_filter_support)
5072 err = adapter_le_set_scan_filter_params(¶ms);
5073 #ifdef TIZEN_FEATURE_PLATFROM_SCAN_FILTER
5075 err = adapter_le_set_platform_scan_filter_params(adapter, ¶ms);
5079 return btd_error_failed(msg, "Failed to scan filter param setup");
5081 return dbus_message_new_method_return(msg);
5084 static DBusMessage *adapter_le_scan_filter_add_remove(DBusConnection *conn,
5085 DBusMessage *msg, void *data)
5087 struct btd_adapter *adapter = data;
5088 struct btd_device *dev = NULL;
5089 dbus_int32_t client_if, action, filt_type, filt_index;
5090 dbus_int32_t company_id, company_id_mask;
5092 dbus_uint32_t address_type = 0;
5093 uint8_t addr_type = 0;
5096 uint8_t *p_uuid, *p_uuid_mask, *p_data, *p_mask;
5097 int32_t uuid_len = 0, uuid_mask_len = 0, data_len = 0, mask_len = 0;
5099 #ifdef TIZEN_FEATURE_PLATFROM_SCAN_FILTER
5100 dbus_bool_t ctlr_filter_support = TRUE;
5103 DBG("adapter_le_scan_filter_add_remove");
5105 if (!(adapter->current_settings & MGMT_SETTING_POWERED))
5106 return btd_error_not_ready(msg);
5108 /* if controller does not support vendor specific scan filtering feature
5109 * then add the filter into platform supported scan filters.
5111 if (adapter_le_get_scan_filter_size() == 0) {
5112 #ifndef TIZEN_FEATURE_PLATFROM_SCAN_FILTER
5113 return btd_error_not_supported(msg);
5115 ctlr_filter_support = FALSE;
5119 if (!dbus_message_get_args(msg, NULL, DBUS_TYPE_INT32, &client_if,
5120 DBUS_TYPE_INT32, &action,
5121 DBUS_TYPE_INT32, &filt_type,
5122 DBUS_TYPE_INT32, &filt_index,
5123 DBUS_TYPE_INT32, &company_id,
5124 DBUS_TYPE_INT32, &company_id_mask,
5125 DBUS_TYPE_ARRAY, DBUS_TYPE_BYTE, &p_uuid, &uuid_len,
5126 DBUS_TYPE_ARRAY, DBUS_TYPE_BYTE, &p_uuid_mask, &uuid_mask_len,
5127 DBUS_TYPE_STRING, &str,
5128 DBUS_TYPE_UINT32, &address_type,
5129 DBUS_TYPE_ARRAY, DBUS_TYPE_BYTE, &p_data, &data_len,
5130 DBUS_TYPE_ARRAY, DBUS_TYPE_BYTE, &p_mask, &mask_len,
5132 return btd_error_invalid_args(msg);
5134 if (filt_type == TYPE_DEVICE_ADDRESS) {
5135 list = g_slist_find_custom(adapter->devices, str, device_rpa_cmp);
5137 list = g_slist_find_custom(adapter->devices, str,
5138 device_address_cmp);
5141 if (dev && device_get_rpa_exist(dev) == true) {
5142 ba2str(device_get_address(dev), string);
5143 if (btd_device_get_bdaddr_type(dev) == BDADDR_LE_PUBLIC)
5148 strncpy(string, str, sizeof(string) - 1);
5152 DBG("addr %s, type %d", string, addr_type);
5154 strncpy(string, str, sizeof(string) - 1 );
5157 #ifdef TIZEN_FEATURE_PLATFROM_SCAN_FILTER
5158 if (ctlr_filter_support)
5160 err = adapter_le_set_scan_filter_data(client_if, action, filt_type,
5161 filt_index, company_id, company_id_mask,
5162 uuid_len, p_uuid, uuid_mask_len, p_uuid_mask,
5163 string, addr_type, data_len, p_data, mask_len, p_mask);
5164 #ifdef TIZEN_FEATURE_PLATFROM_SCAN_FILTER
5166 err = adapter_le_set_platform_scan_filter_data(adapter, client_if, action, filt_type,
5167 filt_index, company_id, company_id_mask,
5168 uuid_len, p_uuid, uuid_mask_len, p_uuid_mask,
5169 string, addr_type, data_len, p_data, mask_len, p_mask);
5172 return btd_error_failed(msg, "Failed to add/remove filter");
5174 return dbus_message_new_method_return(msg);
5177 static DBusMessage *adapter_le_scan_filter_clear(DBusConnection *conn,
5178 DBusMessage *msg, void *data)
5180 struct btd_adapter *adapter = data;
5181 dbus_int32_t client_if = 0;
5182 dbus_int32_t filt_index = 0;
5184 #ifdef TIZEN_FEATURE_PLATFROM_SCAN_FILTER
5185 dbus_bool_t ctlr_filter_support = TRUE;
5188 DBG("adapter_le_scan_filter_clear");
5190 if (!(adapter->current_settings & MGMT_SETTING_POWERED))
5191 return btd_error_not_ready(msg);
5193 if (adapter_le_get_scan_filter_size() == 0)
5194 #ifndef TIZEN_FEATURE_PLATFROM_SCAN_FILTER
5195 return btd_error_not_supported(msg);
5197 ctlr_filter_support = FALSE;
5200 if (!dbus_message_get_args(msg, NULL, DBUS_TYPE_INT32, &client_if,
5201 DBUS_TYPE_INT32, &filt_index,
5203 return btd_error_invalid_args(msg);
5205 #ifdef TIZEN_FEATURE_PLATFROM_SCAN_FILTER
5206 if (ctlr_filter_support)
5208 err = adapter_le_clear_scan_filter_data(client_if, filt_index);
5209 #ifdef TIZEN_FEATURE_PLATFROM_SCAN_FILTER
5211 err = adapter_le_clear_platform_scan_filter_data(adapter, filt_index);
5215 return btd_error_failed(msg, "Failed to clear filter");
5217 return dbus_message_new_method_return(msg);
5221 static DBusMessage *adapter_le_scan_filter_enable(DBusConnection *conn,
5222 DBusMessage *msg, void *data)
5224 struct btd_adapter *adapter = data;
5225 dbus_bool_t enable = FALSE;
5226 dbus_int32_t client_if = 0;
5228 #ifdef TIZEN_FEATURE_PLATFROM_SCAN_FILTER
5229 dbus_bool_t ctlr_filter_support = TRUE;
5232 DBG("adapter_le_scan_filter_enable");
5234 if (!(adapter->current_settings & MGMT_SETTING_POWERED))
5235 return btd_error_not_ready(msg);
5237 #ifdef TIZEN_FEATURE_PLATFROM_SCAN_FILTER
5238 /* if controller does not support vendor specific scan filtering feature
5239 * then enable platform supported scan filtering functionalites.
5242 if (adapter_le_get_scan_filter_size() == 0)
5243 #ifndef TIZEN_FEATURE_PLATFROM_SCAN_FILTER
5244 return btd_error_not_supported(msg);
5246 ctlr_filter_support = FALSE;
5249 if (!dbus_message_get_args(msg, NULL, DBUS_TYPE_INT32, &client_if,
5250 DBUS_TYPE_BOOLEAN, &enable,
5252 return btd_error_invalid_args(msg);
5254 #ifdef TIZEN_FEATURE_PLATFROM_SCAN_FILTER
5255 if (ctlr_filter_support)
5257 err = adapter_le_enable_scan_filtering(enable);
5258 #ifdef TIZEN_FEATURE_PLATFROM_SCAN_FILTER
5260 err = adapter_le_enable_platform_scan_filtering(adapter, enable);
5264 return btd_error_failed(msg, "Failed to enable scan filtering");
5266 return dbus_message_new_method_return(msg);
5269 static DBusMessage *adapter_le_set_scan_params(DBusConnection *conn,
5270 DBusMessage *msg, void *data)
5272 struct btd_adapter *adapter = data;
5273 struct mgmt_cp_le_set_scan_params cp;
5278 DBG("Set scan parameters");
5280 if (!(adapter->current_settings & MGMT_SETTING_POWERED))
5281 return btd_error_not_ready(msg);
5283 if (!dbus_message_get_args(msg, NULL,
5284 DBUS_TYPE_UINT32, &type,
5285 DBUS_TYPE_UINT32, &interval,
5286 DBUS_TYPE_UINT32, &window,
5288 return btd_error_invalid_args(msg);
5290 DBG("scan type %x, interval %x, window %x",
5291 type, interval, window);
5292 memset(&cp, 0, sizeof(cp));
5295 cp.interval = interval;
5297 #ifdef TIZEN_FEATURE_PLATFROM_SCAN_FILTER
5298 adapter->scan_type = type;
5301 if (mgmt_send(adapter->mgmt, MGMT_OP_LE_SET_SCAN_PARAMS,
5302 adapter->dev_id, sizeof(cp), &cp,
5303 NULL, NULL, NULL) > 0)
5304 return dbus_message_new_method_return(msg);
5306 return btd_error_failed(msg, "set scan parameters failed");
5309 static DBusMessage *adapter_set_scan_rsp_data(DBusConnection *conn,
5310 DBusMessage *msg, void *data)
5312 struct btd_adapter *adapter = data;
5313 struct mgmt_cp_set_scan_rsp_data cp;
5316 dbus_int32_t slot_id;
5317 uint8_t *adv_data = NULL;
5320 char *adapter_name = adapter->name;
5321 char le_name[MAX_NAME_LENGTH + 1] = { 0 };
5323 DBG("Set scan response data");
5325 if (!(adapter->current_settings & MGMT_SETTING_POWERED))
5326 return btd_error_not_ready(msg);
5328 if (!dbus_message_get_args(msg, NULL,
5329 DBUS_TYPE_ARRAY, DBUS_TYPE_BYTE, &value, &len,
5330 DBUS_TYPE_INT32, &slot_id,
5332 return btd_error_invalid_args(msg);
5334 if (len > SCAN_RESPONSE_DATA_LENGTH_MAX)
5335 return btd_error_invalid_args(msg);
5337 if (adapter->le_static_addr.b[5] != 0) {
5340 g_strlcpy(le_name, adapter_name,
5341 sizeof(le_name) - LE_BEARER_POSTFIX_LEN);
5342 if (!g_utf8_validate(le_name, -1, (const char **)&ptr))
5345 g_strlcat(le_name, LE_BEARER_POSTFIX, sizeof(le_name));
5346 adapter_name = le_name;
5349 adapter_le_set_missed_adv_data(value, len, TRUE,
5350 adapter_name, adapter->adv_tx_power, &adv_data, &adv_len, adapter);
5352 if (adapter_le_is_supported_multi_advertising() && slot_id > 0) {
5353 if (adapter_le_set_multi_adv_data(slot_id, TRUE, adv_len, (uint8_t *)adv_data)) {
5355 return dbus_message_new_method_return(msg);
5358 return btd_error_failed(msg, "set advertising data failed");
5361 memcpy(&cp, adv_data, adv_len);
5363 if (mgmt_send(adapter->mgmt, MGMT_OP_SET_SCAN_RSP_DATA,
5364 adapter->dev_id, adv_len, &cp,
5365 NULL, NULL, NULL) > 0) {
5367 return dbus_message_new_method_return(msg);
5371 return btd_error_failed(msg, "set scan reponse data failed");
5375 static DBusMessage *adapter_add_device_white_list(DBusConnection *conn,
5376 DBusMessage *msg, void *data)
5378 struct btd_adapter *adapter = data;
5379 struct mgmt_cp_add_dev_white_list cp;
5380 const gchar *address;
5382 dbus_uint32_t address_type;
5383 struct btd_device *dev;
5385 DBG("Add device whie list");
5386 if (dbus_message_get_args(msg, NULL,
5387 DBUS_TYPE_STRING, &address,
5388 DBUS_TYPE_UINT32, &address_type,
5389 DBUS_TYPE_INVALID) == FALSE)
5390 return btd_error_invalid_args(msg);
5392 if (bachk(address) < 0)
5393 return btd_error_invalid_args(msg);
5395 if (!(adapter->current_settings & MGMT_SETTING_POWERED))
5396 return btd_error_not_ready(msg);
5398 DBG("addr %s, type %d", address, address_type);
5399 str2ba(address, &bdaddr);
5401 dev = btd_adapter_find_device(adapter, &bdaddr,
5402 address_type ? BDADDR_LE_RANDOM : BDADDR_LE_PUBLIC);
5403 if (dev && device_get_rpa_exist(dev) == true) {
5404 if (adapter_le_is_supported_offloading() == FALSE) {
5405 error("Spec based command is not supported yet");
5406 return btd_error_not_supported(msg);
5409 /* Add IRK value to list */
5410 if (adapter_le_add_irk_to_list(device_get_irk_value(dev),
5411 device_get_address(dev),
5412 btd_device_get_bdaddr_type(dev))) {
5413 return dbus_message_new_method_return(msg);
5415 return btd_error_failed(msg, "Add LE IRK to list failed");
5419 memset(&cp, 0, sizeof(cp));
5421 cp.bdaddr_type = address_type;
5422 memcpy(&cp.bdaddr, &bdaddr, sizeof(bdaddr_t));
5424 if (mgmt_send(adapter->mgmt, MGMT_OP_ADD_DEV_WHITE_LIST,
5425 adapter->dev_id, sizeof(cp), &cp,
5426 NULL, NULL, NULL) > 0)
5427 return dbus_message_new_method_return(msg);
5429 return btd_error_failed(msg, "add device white list failed");
5432 static DBusMessage *adapter_remove_device_white_list(DBusConnection *conn,
5433 DBusMessage *msg, void *data)
5435 struct btd_adapter *adapter = data;
5436 struct mgmt_cp_remove_dev_white_list cp;
5437 const gchar *address;
5439 dbus_uint32_t address_type;
5440 struct btd_device *dev;
5442 DBG("Remove device whie list");
5444 if (!(adapter->current_settings & MGMT_SETTING_POWERED))
5445 return btd_error_not_ready(msg);
5447 if (dbus_message_get_args(msg, NULL,
5448 DBUS_TYPE_STRING, &address,
5449 DBUS_TYPE_UINT32, &address_type,
5450 DBUS_TYPE_INVALID) == FALSE)
5451 return btd_error_invalid_args(msg);
5453 if (bachk(address) < 0)
5454 return btd_error_invalid_args(msg);
5456 DBG("addr %s, type %d", address, address_type);
5457 str2ba(address, &bdaddr);
5459 dev = btd_adapter_find_device(adapter, &bdaddr,
5460 address_type ? BDADDR_LE_RANDOM : BDADDR_LE_PUBLIC);
5461 if (dev && device_get_rpa_exist(dev) == true) {
5462 if (adapter_le_is_supported_offloading() == FALSE) {
5463 error("Spec based command is not supported yet");
5464 return btd_error_not_supported(msg);
5467 /* Remove IRK value to list */
5468 if (adapter_le_remove_irk_to_list(device_get_address(dev),
5469 btd_device_get_bdaddr_type(dev))) {
5470 return dbus_message_new_method_return(msg);
5472 return btd_error_failed(msg, "Remove IRK is failed");
5476 memset(&cp, 0, sizeof(cp));
5478 cp.bdaddr_type = address_type;
5479 memcpy(&cp.bdaddr, &bdaddr, sizeof(bdaddr_t));
5481 if (mgmt_send(adapter->mgmt, MGMT_OP_REMOVE_DEV_FROM_WHITE_LIST,
5482 adapter->dev_id, sizeof(cp), &cp,
5483 NULL, NULL, NULL) > 0)
5484 return dbus_message_new_method_return(msg);
5486 return btd_error_failed(msg, "remove device white list failed");
5489 static DBusMessage *adapter_clear_device_white_list(DBusConnection *conn,
5490 DBusMessage *msg, void *data)
5492 struct btd_adapter *adapter = data;
5494 DBG("Clear device whie list");
5496 if (!(adapter->current_settings & MGMT_SETTING_POWERED))
5497 return btd_error_not_ready(msg);
5499 if (mgmt_send(adapter->mgmt, MGMT_OP_CLEAR_DEV_WHITE_LIST,
5500 adapter->dev_id, 0, NULL,
5501 NULL, NULL, NULL) > 0)
5502 return dbus_message_new_method_return(msg);
5504 return btd_error_failed(msg, "clear white list failed");
5507 static DBusMessage *adapter_set_le_privacy(DBusConnection *conn,
5508 DBusMessage *msg, void *data)
5510 struct btd_adapter *adapter = data;
5512 dbus_bool_t enable_privacy = FALSE;
5514 if (!(adapter->supported_settings & MGMT_SETTING_PRIVACY))
5515 return btd_error_not_supported(msg);
5517 if (!dbus_message_get_args(msg, NULL, DBUS_TYPE_BOOLEAN,
5518 &enable_privacy, DBUS_TYPE_INVALID))
5519 return btd_error_invalid_args(msg);
5521 if (enable_privacy) {
5522 if (adapter->current_settings & MGMT_SETTING_PRIVACY)
5523 return btd_error_already_exists(msg);
5525 if (!(adapter->current_settings & MGMT_SETTING_PRIVACY))
5526 return btd_error_already_exists(msg);
5529 err = set_privacy(adapter, enable_privacy);
5532 return btd_error_failed(msg, "Set Le Privacy failed");
5535 adapter->current_settings = adapter->current_settings | MGMT_SETTING_PRIVACY;
5537 adapter->current_settings = adapter->current_settings & ~(SETTING_PRIVACY_MASK);
5540 return dbus_message_new_method_return(msg);
5543 static void init_le_static_address(struct btd_adapter *adapter)
5548 char dirname[PATH_MAX];
5550 bdaddr_t le_static_addr;
5552 le_static_addr.b[5] = adapter->bdaddr.b[5] | 0xc0;
5553 for (i = 0; i < 5; i++) {
5554 le_static_addr.b[i] =
5555 (adapter->bdaddr.b[i] & 0x7f) << 1 |
5556 (adapter->bdaddr.b[i] & 0x80) >> 7;
5560 * < How to get Public address from above static address >
5562 * for (i = 0; i < 5; i++) {
5564 * (adapter->le_static_addr.b[i] & 0xfe) >> 1 |
5565 * (adapter->le_static_addr.b[i] & 0x01) << 7;
5567 * bredr_addr.b[5] = {the value from advertising data}
5570 snprintf(dirname, PATH_MAX, STORAGEDIR "/%s", "le_static_addr");
5571 fd = open(dirname, O_WRONLY | O_CREAT, 0644);
5574 ba2str(&le_static_addr, address);
5575 DBG("LE static random : %s", address);
5576 ret = write(fd, address, strlen(address));
5578 error("Cannot save LE address : %s",
5582 ret = fdatasync(fd);
5584 error("sync failed : %s", strerror(errno));
5588 error("Cannot save LE address");
5592 static void set_le_static_address(struct btd_adapter *adapter)
5597 char dirname[PATH_MAX];
5599 snprintf(dirname, PATH_MAX, STORAGEDIR "/%s", "le_static_addr");
5600 if (access(dirname, F_OK) < 0)
5601 init_le_static_address(adapter);
5603 fd = open(dirname, O_RDONLY);
5605 ret = read(fd, address, sizeof(address));
5607 /* xx:xx:xx:xx:xx:xx */
5609 DBG("LE static random : %s", address);
5610 str2ba(address, &adapter->le_static_addr);
5611 adapter->le_static_addr.b[5] |= 0xc0;
5613 error("Invalid LE address");
5616 error("Cannot get LE address");
5622 static void set_le_static_address_complete(uint8_t status, uint16_t length,
5623 const void *param, void *user_data)
5625 struct btd_adapter *adapter = user_data;
5627 DBG("index %u status 0x%02x", adapter->dev_id, status);
5629 if (status != MGMT_STATUS_SUCCESS) {
5630 error("Failed to set static address for index %u: %s (0x%02x)",
5631 adapter->dev_id, mgmt_errstr(status), status);
5632 if (adapter->le_static_addr.b[5] != 0)
5633 bacpy(&adapter->le_static_addr, BDADDR_ANY);
5635 set_le_static_address(adapter);
5642 static DBusMessage *adapter_set_le_static_address(DBusConnection *conn,
5643 DBusMessage *msg, void *data)
5645 struct btd_adapter *adapter = data;
5646 dbus_bool_t is_enable = FALSE;
5647 struct mgmt_cp_set_static_address cp;
5649 if (!(adapter->supported_settings & MGMT_OP_SET_STATIC_ADDRESS)) {
5650 error("LE static address is not supported");
5651 return btd_error_not_supported(msg);
5654 if (!dbus_message_get_args(msg, NULL, DBUS_TYPE_BOOLEAN, &is_enable,
5655 DBUS_TYPE_INVALID)) {
5656 error("Invalid arguments");
5657 return btd_error_invalid_args(msg);
5660 memset(&cp, 0x00, sizeof(cp));
5662 if (adapter->le_static_addr.b[5] != 0) {
5663 DBG("LE static address is already configured");
5664 return dbus_message_new_method_return(msg);
5666 set_le_static_address(adapter);
5667 bacpy(&cp.bdaddr, &adapter->le_static_addr);
5669 if (adapter->le_static_addr.b[5] == 0) {
5670 DBG("LE static address is not configured");
5671 return dbus_message_new_method_return(msg);
5673 bacpy(&adapter->le_static_addr, BDADDR_ANY);
5675 DBG("Set static random address : %d", is_enable);
5677 if (mgmt_send(mgmt_primary, MGMT_OP_SET_STATIC_ADDRESS, adapter->dev_id,
5679 set_le_static_address_complete, adapter, NULL) <= 0) {
5680 error("Failed to set static address : %d", is_enable);
5682 bacpy(&adapter->le_static_addr, BDADDR_ANY);
5684 set_le_static_address(adapter);
5685 return btd_error_failed(msg, "Unable to set static address");
5688 return dbus_message_new_method_return(msg);
5691 static DBusMessage *adapter_enable_rssi(DBusConnection *conn,
5692 DBusMessage *msg, void *data)
5694 struct btd_adapter *adapter = data;
5695 struct mgmt_cp_set_enable_rssi cp;
5696 struct mgmt_cp_disable_rssi cp_dis;
5697 bdaddr_t bt_addr = { { 0, } };
5698 const gchar *address = NULL;
5700 const char *sender = dbus_message_get_sender(msg);
5701 dbus_int32_t link_type;
5702 dbus_int32_t low_threshold;
5703 dbus_int32_t in_range_threshold;
5704 dbus_int32_t high_threshold;
5706 DBG("Enable RSSI called");
5707 DBG("sender %s", sender);
5708 if (!(adapter->current_settings & MGMT_SETTING_POWERED))
5709 return btd_error_not_ready(msg);
5711 if (!dbus_message_get_args(msg, NULL,
5712 DBUS_TYPE_STRING, &address,
5713 DBUS_TYPE_INT32, &link_type,
5714 DBUS_TYPE_INT32, &low_threshold,
5715 DBUS_TYPE_INT32, &in_range_threshold,
5716 DBUS_TYPE_INT32, &high_threshold,
5718 return btd_error_invalid_args(msg);
5720 DBG("Enable RSSI: [%s %d %d %d %d]", address, link_type,
5721 low_threshold, in_range_threshold, high_threshold);
5723 DBG("BT address [%s]", address);
5724 memset(&bt_addr, 0, sizeof(bdaddr_t));
5725 str2ba(address, &bt_addr);
5726 memset(&cp, 0, sizeof(struct mgmt_cp_set_enable_rssi));
5727 memset(&cp_dis, 0, sizeof(struct mgmt_cp_disable_rssi));
5729 if (bachk(address) < 0)
5730 return btd_error_invalid_args(msg);
5732 // if (!btd_adapter_find_device(adapter, address))
5733 // return btd_error_not_found(msg);
5735 if (low_threshold == 0 && in_range_threshold == 0 && high_threshold == 0) {
5736 cp_dis.bdaddr = bt_addr;
5737 cp_dis.link_type = link_type;
5738 DBG("Disable Request");
5739 if (mgmt_send(adapter->mgmt, MGMT_OP_SET_RSSI_DISABLE,
5740 adapter->dev_id, sizeof(cp_dis), &cp_dis,
5741 NULL, NULL, NULL) > 0)
5742 return dbus_message_new_method_return(msg);
5744 cp.low_th = low_threshold;
5745 cp.in_range_th = in_range_threshold;
5746 cp.high_th = high_threshold;
5747 cp.bdaddr = bt_addr;
5748 cp.link_type = link_type;
5749 DBG("Enable Request");
5750 if (mgmt_send(adapter->mgmt, MGMT_OP_SET_RSSI_ENABLE,
5751 adapter->dev_id, sizeof(cp), &cp,
5752 NULL, NULL, NULL) > 0)
5753 return dbus_message_new_method_return(msg);
5755 return btd_error_failed(msg, "Enable/Disable RSSI Failed");
5758 static DBusMessage *adapter_get_rssi(DBusConnection *conn,
5759 DBusMessage *msg, void *data)
5761 struct btd_adapter *adapter = data;
5762 struct mgmt_cp_get_raw_rssi cp;
5764 const gchar *address = NULL;
5765 dbus_int32_t link_type;
5766 const char *sender = dbus_message_get_sender(msg);
5768 DBG("Get RSSI called");
5769 DBG("sender %s", sender);
5770 if (!(adapter->current_settings & MGMT_SETTING_POWERED))
5771 return btd_error_not_ready(msg);
5773 if (!dbus_message_get_args(msg, NULL,
5774 DBUS_TYPE_STRING, &address,
5775 DBUS_TYPE_INT32, &link_type,
5777 return btd_error_invalid_args(msg);
5779 DBG("BT address [%s] link type [%d]", address, link_type);
5780 memset(&bt_addr, 0, sizeof(bdaddr_t));
5781 str2ba(address, &bt_addr);
5782 memset(&cp, 0, sizeof(struct mgmt_cp_get_raw_rssi));
5784 if (bachk(address) < 0)
5785 return btd_error_invalid_args(msg);
5787 // if (!btd_adapter_find_device(adapter, address))
5788 // return btd_error_not_found(msg);
5790 memcpy(&(cp.bt_address), &bt_addr, sizeof(bdaddr_t));
5791 cp.link_type = link_type;
5792 DBG("RAW RSSI Request");
5793 if (mgmt_send(adapter->mgmt, MGMT_OP_GET_RAW_RSSI,
5794 adapter->dev_id, sizeof(cp), &cp,
5795 NULL, NULL, NULL) > 0)
5796 return dbus_message_new_method_return(msg);
5798 return btd_error_failed(msg, "Get Raw RSSI Failed");
5801 static DBusMessage *get_irk(DBusMessage *msg, uint8_t *irk_info,
5805 DBusMessageIter iter, array;
5806 reply = g_dbus_create_reply(msg, DBUS_TYPE_INVALID);
5808 dbus_message_iter_init_append(reply, &iter);
5809 dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY, "y", &array);
5810 dbus_message_iter_append_fixed_array(&array, DBUS_TYPE_BYTE,
5811 &irk_info, irk_size);
5812 dbus_message_iter_close_container(&iter, &array);
5818 static DBusMessage *adapter_get_local_irk(DBusConnection *conn,
5819 DBusMessage *msg, void *data)
5821 struct btd_adapter *adapter = data;
5822 if (!adapter->local_irk) {
5823 if (!load_local_irk(adapter))
5824 return g_dbus_create_error(msg, DBUS_ERROR_NO_MEMORY, "No Memory");
5826 return get_irk(msg, adapter->local_irk, MGMT_IRK_SIZE);
5829 #if !defined(__SPRD_PATCH__)
5830 static void get_adv_tx_power_complete(uint8_t status, uint16_t length,
5831 const void *param, void *user_data)
5833 struct btd_adapter *adapter = user_data;
5834 const struct mgmt_rp_get_adv_tx_power *rp = param;
5837 error("Error ocurred in Getting adv tx power, rp is NULL");
5841 if (status != MGMT_STATUS_SUCCESS) {
5842 error("Failed to get adv tx power: %s (0x%02x)",
5843 mgmt_errstr(status), status);
5847 if (length < sizeof(*rp)) {
5848 error("Wrong size of get adv tx power");
5852 adapter->adv_tx_power = rp->adv_tx_power;
5856 static void adapter_get_adv_tx_power(void *data)
5858 struct btd_adapter *adapter = data;
5860 mgmt_send(adapter->mgmt, MGMT_OP_GET_ADV_TX_POWER,
5861 adapter->dev_id, 0, NULL,
5862 get_adv_tx_power_complete, adapter, NULL);
5867 static DBusMessage *set_wbs_parameters(DBusConnection *conn,
5868 DBusMessage *msg, void *data)
5870 struct btd_adapter *adapter = data;
5871 const gchar *role = NULL;
5872 const gchar *address = NULL;
5873 struct mgmt_cp_set_voice_setting cp;
5874 bdaddr_t bt_addr = { { 0, } };
5878 if (!dbus_message_get_args(msg, NULL,
5879 DBUS_TYPE_STRING, &role,
5880 DBUS_TYPE_STRING, &address,
5881 DBUS_TYPE_INVALID)) {
5882 return btd_error_invalid_args(msg);
5885 DBG("Role = %s", role);
5886 DBG("Address = %s", address);
5888 memset(&cp, 0, sizeof(cp));
5890 cp.voice_setting = BT_VOICE_TRANSPARENT | BT_VOICE_CVSD_16BIT;
5892 if (g_strcmp0(role, "Handsfree") == 0)
5893 cp.sco_role = MGMT_SCO_ROLE_HANDSFREE;
5894 else if (g_strcmp0(role, "Gateway") == 0)
5895 cp.sco_role = MGMT_SCO_ROLE_AUDIO_GATEWAY;
5897 str2ba(address, &bt_addr);
5898 memcpy(&(cp.bdaddr), &bt_addr, sizeof(bdaddr_t));
5900 if (mgmt_send(adapter->mgmt, MGMT_OP_SET_VOICE_SETTING,
5901 adapter->dev_id, sizeof(cp), &cp,
5902 NULL, NULL, NULL) == 0)
5903 error("mgmt_send failed for voice setting");
5906 return dbus_message_new_method_return(msg);
5909 static DBusMessage *set_nb_parameters(DBusConnection *conn,
5910 DBusMessage *msg, void *data)
5912 struct btd_adapter *adapter = data;
5914 const gchar *address = NULL;
5915 struct mgmt_cp_set_voice_setting cp;
5916 bdaddr_t bt_addr = { { 0, } };
5920 if (!dbus_message_get_args(msg, NULL,
5921 DBUS_TYPE_STRING, &role,
5922 DBUS_TYPE_STRING, &address,
5923 DBUS_TYPE_INVALID)) {
5924 return btd_error_invalid_args(msg);
5927 DBG("Role = %s", role);
5928 DBG("Address = %s", address);
5930 memset(&cp, 0, sizeof(cp));
5932 cp.voice_setting = BT_VOICE_CVSD_16BIT;
5934 if (g_strcmp0(role, "Handsfree") == 0)
5935 cp.sco_role = MGMT_SCO_ROLE_HANDSFREE;
5936 else if (g_strcmp0(role, "Gateway") == 0)
5937 cp.sco_role = MGMT_SCO_ROLE_AUDIO_GATEWAY;
5939 str2ba(address, &bt_addr);
5940 memcpy(&(cp.bdaddr), &bt_addr, sizeof(bdaddr_t));
5942 if (mgmt_send(adapter->mgmt, MGMT_OP_SET_VOICE_SETTING,
5943 adapter->dev_id, sizeof(cp), &cp,
5944 NULL, NULL, NULL) == 0)
5945 error("mgmt_send failed for voice setting");
5949 return dbus_message_new_method_return(msg);
5952 void btd_adapter_set_read_le_data_length_handler(
5953 struct btd_adapter *adapter,
5954 struct le_data_length_read_handler *handler)
5956 adapter->read_handler = handler;
5959 static void le_read_maximum_data_length_return_param_complete(
5960 uint8_t status, uint16_t length,
5961 const void *param, void *user_data)
5963 struct btd_adapter *adapter = user_data;
5964 const struct mgmt_rp_le_read_maximum_data_length *rp = param;
5965 uint16_t max_tx_octects = 0;
5966 uint16_t max_tx_time = 0;
5967 uint16_t max_rx_octects = 0;
5968 uint16_t max_rx_time = 0;
5972 error("Error ocurred in Reading maximum data length, rp is NULL");
5977 if (status != MGMT_STATUS_SUCCESS) {
5978 error("le read maximum data length failed: %s (0x%02x)",
5979 mgmt_errstr(status), status);
5984 if (length < sizeof(*rp)) {
5985 error("Too small le read maximum data length response");
5989 max_tx_octects = rp->max_tx_octets;
5990 max_tx_time =rp->max_tx_time;
5991 max_rx_octects = rp->max_rx_octets;
5992 max_rx_time = rp->max_rx_time;
5996 if (!adapter->read_handler ||
5997 !adapter->read_handler->read_callback) {
5998 g_free(adapter->read_handler);
6002 adapter->read_handler->read_callback(adapter, err,
6003 max_tx_octects, max_tx_time,
6004 max_rx_octects, max_rx_time,
6005 adapter->read_handler->user_data);
6007 g_free(adapter->read_handler);
6008 adapter->read_handler = NULL;
6011 int btd_adapter_le_read_maximum_data_length(
6012 struct btd_adapter *adapter)
6014 if (mgmt_send(adapter->mgmt,
6015 MGMT_OP_LE_READ_MAXIMUM_DATA_LENGTH,
6016 adapter->dev_id, 0, NULL,
6017 le_read_maximum_data_length_return_param_complete,
6024 static gint read_request_cmp(gconstpointer a, gconstpointer b)
6026 const struct le_data_length_read_request *data = a;
6027 const struct btd_adapter *adapter = b;
6029 return data->adapter != adapter;
6032 static struct le_data_length_read_request *find_read_le_data_length_request(
6033 struct btd_adapter *adapter)
6037 match = g_slist_find_custom(read_requests, adapter, read_request_cmp);
6045 static void le_read_data_length_complete(
6046 struct btd_adapter *adapter,
6048 uint16_t max_tx_octects, uint16_t max_tx_time,
6049 uint16_t max_rx_octects, uint16_t max_rx_time,
6053 struct le_data_length_read_request *read_request;
6055 read_request = find_read_le_data_length_request(adapter);
6061 DBG("Failed to read max data length. errno[%d]", err);
6062 reply = btd_error_failed(read_request->msg,
6063 "Failed to read max data length");
6065 reply = g_dbus_create_reply(read_request->msg,
6066 DBUS_TYPE_UINT16, &max_tx_octects,
6067 DBUS_TYPE_UINT16, &max_tx_time,
6068 DBUS_TYPE_UINT16, &max_rx_octects,
6069 DBUS_TYPE_UINT16, &max_rx_time,
6073 reply = btd_error_failed(read_request->msg,
6074 "Failed to create reply.");
6078 read_requests = g_slist_remove(read_requests, read_request);
6079 dbus_message_unref(read_request->msg);
6080 g_free(read_request);
6082 if (!g_dbus_send_message(dbus_conn, reply))
6083 error("D-Bus send failed");
6086 static DBusMessage *le_read_maximum_data_length(
6087 DBusConnection *conn, DBusMessage *msg,
6090 struct btd_adapter *adapter = user_data;
6091 struct le_data_length_read_request *read_request;
6092 struct le_data_length_read_handler *handler;
6094 if (find_read_le_data_length_request(adapter))
6095 return btd_error_in_progress(msg);
6097 if (btd_adapter_le_read_maximum_data_length(adapter))
6098 return btd_error_failed(msg, "Unable to read maximum le data length");
6100 read_request = g_new(struct le_data_length_read_request, 1);
6102 read_request->msg = dbus_message_ref(msg);
6103 read_request->adapter = adapter;
6105 read_requests = g_slist_append(read_requests, read_request);
6107 handler = g_new0(struct le_data_length_read_handler, 1);
6109 handler->read_callback =
6110 (read_max_data_length_cb_t)le_read_data_length_complete;
6112 btd_adapter_set_read_le_data_length_handler(
6113 read_request->adapter, handler);
6119 void le_write_host_suggested_data_length_return_param_complete(
6120 uint8_t status, uint16_t length,
6121 const void *param, void *user_data)
6123 if (status != MGMT_STATUS_SUCCESS) {
6124 error("le write host suggested data length failed: %s (0x%02x)",
6125 mgmt_errstr(status), status);
6131 static DBusMessage *le_write_host_suggested_default_data_length(
6132 DBusConnection *conn, DBusMessage *msg,
6135 struct btd_adapter *adapter = user_data;
6136 struct mgmt_cp_le_write_host_suggested_data_length cp;
6137 dbus_uint16_t def_tx_Octets;
6138 dbus_uint16_t def_tx_time;
6140 if (!(adapter->current_settings & MGMT_SETTING_POWERED))
6141 return btd_error_not_ready(msg);
6143 if (!dbus_message_get_args(msg, NULL,
6144 DBUS_TYPE_UINT16, &def_tx_Octets,
6145 DBUS_TYPE_UINT16, &def_tx_time,
6147 return btd_error_invalid_args(msg);
6149 memset(&cp, 0, sizeof(cp));
6150 cp.def_tx_octets = def_tx_Octets;
6151 cp.def_tx_time = def_tx_time;
6153 if (mgmt_send(adapter->mgmt,
6154 MGMT_OP_LE_WRITE_HOST_SUGGESTED_DATA_LENGTH,
6155 adapter->dev_id, sizeof(cp), &cp,
6156 le_write_host_suggested_data_length_return_param_complete,
6158 return dbus_message_new_method_return(msg);
6160 return btd_error_failed(msg, "Unable to write host suggested le data length values");
6163 static void le_read_suggested_default_data_length_return_param_complete(
6164 uint8_t status, uint16_t length,
6165 const void *param, void *user_data)
6167 struct btd_adapter *adapter = user_data;
6168 const struct mgmt_rp_le_read_host_suggested_data_length *rp = param;
6169 uint16_t def_tx_octects, def_tx_time;
6172 error("Error ocurred in Reading suggested data length, rp is NULL");
6173 if (adapter->def_read_handler)
6174 g_free(adapter->def_read_handler->user_data);
6176 g_free(adapter->def_read_handler);
6180 if (status != MGMT_STATUS_SUCCESS) {
6181 error("Read host suggested def le data length values failed: %s (0x%02x)",
6182 mgmt_errstr(status), status);
6186 if (adapter->def_read_handler)
6187 g_free(adapter->def_read_handler->user_data);
6189 g_free(adapter->def_read_handler);
6193 if (length < sizeof(*rp)) {
6196 def_tx_octects = rp->def_tx_octets;
6197 def_tx_time =rp->def_tx_time;
6198 DBG("retrieving host suggested data length values %d %d", def_tx_octects, def_tx_time);
6201 if (!adapter->def_read_handler)
6204 if(!adapter->def_read_handler->read_callback) {
6208 adapter->def_read_handler->read_callback(adapter,
6209 def_tx_octects, def_tx_time,
6210 adapter->def_read_handler->user_data);
6212 if (adapter->def_read_handler)
6213 g_free(adapter->def_read_handler->user_data);
6215 g_free(adapter->def_read_handler);
6216 adapter->def_read_handler = NULL;
6219 int btd_adapter_le_read_suggested_default_data_length(
6220 struct btd_adapter *adapter)
6222 if (mgmt_send(adapter->mgmt,
6223 MGMT_OP_LE_READ_HOST_SUGGESTED_DATA_LENGTH,
6224 adapter->dev_id, 0, NULL,
6225 le_read_suggested_default_data_length_return_param_complete,
6226 adapter, NULL) > 0) {
6233 static void le_read_host_suggested_default_length_complete(
6234 struct btd_adapter *adapter,
6235 uint16_t def_tx_octects, uint16_t def_tx_time,
6239 struct le_data_length_read_request *read_request;
6241 read_request = find_read_le_data_length_request(adapter);
6245 reply = g_dbus_create_reply(read_request->msg,
6246 DBUS_TYPE_UINT16, &def_tx_octects,
6247 DBUS_TYPE_UINT16, &def_tx_time,
6251 btd_error_failed(read_request->msg,
6252 "Failed to read host suggested def data length values");
6256 read_requests = g_slist_remove(read_requests, read_request);
6257 dbus_message_unref(read_request->msg);
6258 g_free(read_request);
6260 if (!g_dbus_send_message(dbus_conn, reply))
6261 error("D-Bus send failed");
6264 static DBusMessage *le_read_host_suggested_default_data_length(
6265 DBusConnection *conn, DBusMessage *msg,
6268 struct btd_adapter *adapter = user_data;
6269 struct le_data_length_read_request *read_request;
6270 struct le_data_length_read_default_data_length_handler *handler;
6272 if (find_read_le_data_length_request(adapter))
6273 return btd_error_in_progress(msg);
6275 if (btd_adapter_le_read_suggested_default_data_length(adapter))
6276 return btd_error_failed(msg, "Unable to read host suggested def data length");
6278 read_request = g_new(struct le_data_length_read_request, 1);
6280 read_request->msg = dbus_message_ref(msg);
6281 read_request->adapter = adapter;
6283 read_requests = g_slist_append(read_requests, read_request);
6285 handler = g_new0(struct le_data_length_read_default_data_length_handler, 1);
6287 handler->read_callback =
6288 (read_host_suggested_default_data_length_cb_t)le_read_host_suggested_default_length_complete;
6290 read_request->adapter->def_read_handler = handler;
6295 static void get_le_batching_available_pkts_complete(
6296 uint8_t status, uint16_t length,
6297 const void *param, void *user_data)
6299 const struct mgmt_rp_get_le_batching_buffer *rp = param;
6300 struct le_batching_request *request =
6301 (struct le_batching_request*)user_data;
6304 if (status != MGMT_STATUS_SUCCESS) {
6305 error("mgmt fail: %s (0x%02x)", mgmt_errstr(status), status);
6306 if (status == MGMT_STATUS_UNKNOWN_COMMAND)
6307 reply = btd_error_not_supported(request->msg);
6309 reply = btd_error_failed(request->msg, mgmt_errstr(status));
6313 if (length < sizeof(*rp)) {
6314 reply = btd_error_failed(request->msg,
6315 "Wrong size of get le batching buffer");
6319 DBG("LE Batching buffer: [%u]", rp->buffer);
6320 request->adapter->le_batching_available_pkts = rp->buffer;
6321 reply = g_dbus_create_reply(request->msg,
6322 DBUS_TYPE_UINT32, &rp->buffer,
6325 reply = btd_error_failed(request->msg,
6326 "Failed to create reply.");
6329 if (!g_dbus_send_message(dbus_conn, reply))
6330 error("D-Bus send failed");
6332 dbus_message_unref(request->msg);
6336 static DBusMessage *adapter_get_le_batching_available_pkts(DBusConnection *conn,
6337 DBusMessage *msg, void *data)
6339 struct btd_adapter *adapter = data;
6340 struct le_batching_request *request;
6344 if (!(adapter->current_settings & MGMT_SETTING_POWERED))
6345 return btd_error_not_ready(msg);
6347 if (adapter->le_batching_available_pkts < 0)
6348 return btd_error_not_supported(msg);
6350 if (adapter->le_batching_available_pkts > 0) {
6351 reply = dbus_message_new_method_return(msg);
6355 val = adapter->le_batching_available_pkts;
6356 dbus_message_append_args(reply, DBUS_TYPE_UINT32, &val,
6358 DBG("LE Batching buffer: [%u]", val);
6362 request = g_new(struct le_batching_request, 1);
6364 request->msg = dbus_message_ref(msg);
6365 request->adapter = adapter;
6367 if (mgmt_send(adapter->mgmt, MGMT_OP_GET_LE_BATCHING_BUFFER,
6368 adapter->dev_id, 0, NULL,
6369 get_le_batching_available_pkts_complete, request, NULL) == 0) {
6370 dbus_message_unref(request->msg);
6372 return btd_error_failed(msg, "Unable to get le batching buffer");
6378 static void set_le_batching_enable_complete(
6379 uint8_t status, uint16_t length,
6380 const void *param, void *user_data)
6382 const struct mgmt_rp_set_le_batching_enable *rp = param;
6383 struct le_batching_request *request =
6384 (struct le_batching_request*)user_data;
6388 if (status != MGMT_STATUS_SUCCESS) {
6389 error("mgmt fail: %s (0x%02x)", mgmt_errstr(status), status);
6390 if (status == MGMT_STATUS_UNKNOWN_COMMAND)
6391 reply = btd_error_not_supported(request->msg);
6393 reply = btd_error_failed(request->msg, mgmt_errstr(status));
6397 if (length < sizeof(*rp)) {
6398 reply = btd_error_failed(request->msg,
6399 "Wrong size of set le batching enable");
6403 reply = g_dbus_create_reply(request->msg,
6406 reply = btd_error_failed(request->msg,
6407 "Failed to create reply.");
6410 if (!g_dbus_send_message(dbus_conn, reply))
6411 error("D-Bus send failed");
6413 dbus_message_unref(request->msg);
6417 static void set_le_batching_param_complete(
6418 uint8_t status, uint16_t length,
6419 const void *param, void *user_data)
6421 const struct mgmt_rp_set_le_batching_param *rp = param;
6422 struct mgmt_cp_set_le_batching_enable cp;
6423 struct le_batching_set_param_request *request =
6424 (struct le_batching_set_param_request*)user_data;
6427 if (status != MGMT_STATUS_SUCCESS) {
6428 error("mgmt fail: %s (0x%02x)", mgmt_errstr(status), status);
6429 if (status == MGMT_STATUS_UNKNOWN_COMMAND)
6430 reply = btd_error_not_supported(request->msg);
6432 reply = btd_error_failed(request->msg, mgmt_errstr(status));
6436 if (length < sizeof(*rp)) {
6437 reply = btd_error_failed(request->msg,
6438 "Wrong size of set le batching param");
6442 memset(&cp, 0, sizeof(struct mgmt_cp_set_le_batching_enable));
6443 cp.bdaddr = request->bdaddr;
6445 if (mgmt_send(request->adapter->mgmt, MGMT_OP_SET_LE_BATCHING_ENABLE,
6446 request->adapter->dev_id, sizeof(cp), &cp,
6447 set_le_batching_enable_complete, request, NULL) == 0) {
6448 reply = btd_error_failed(request->msg, "Unable to set le batching enable");
6454 if (!g_dbus_send_message(dbus_conn, reply))
6455 error("D-Bus send failed");
6457 dbus_message_unref(request->msg);
6461 static DBusMessage *adapter_enable_le_batching(DBusConnection *conn,
6462 DBusMessage *msg, void *data)
6464 struct btd_adapter *adapter = data;
6465 struct mgmt_cp_set_le_batching_param cp;
6466 struct le_batching_set_param_request *request;
6467 bdaddr_t bt_addr = { { 0, } };
6468 const gchar *address = NULL;
6469 dbus_int32_t packet_threshold;
6470 dbus_int32_t timeout;
6472 if (!(adapter->current_settings & MGMT_SETTING_POWERED))
6473 return btd_error_not_ready(msg);
6475 if (!dbus_message_get_args(msg, NULL,
6476 DBUS_TYPE_STRING, &address,
6477 DBUS_TYPE_INT32, &packet_threshold,
6478 DBUS_TYPE_INT32, &timeout,
6480 return btd_error_invalid_args(msg);
6482 if (packet_threshold < 0 || packet_threshold > 0x7fff ||
6483 timeout < 0 || timeout > 0x7fff)
6484 return btd_error_invalid_args(msg);
6486 DBG("Set LE batching param: [%s %d %d]", address,
6487 packet_threshold, timeout);
6489 memset(&bt_addr, 0, sizeof(bdaddr_t));
6490 str2ba(address, &bt_addr);
6491 memset(&cp, 0, sizeof(struct mgmt_cp_set_le_batching_param));
6493 if (bachk(address) < 0)
6494 return btd_error_invalid_args(msg);
6496 cp.bdaddr = bt_addr;
6497 cp.pkt_th = packet_threshold;
6499 cp.timeout = timeout * 100;
6501 request = g_new(struct le_batching_set_param_request, 1);
6502 request->msg = dbus_message_ref(msg);
6503 request->adapter = adapter;
6504 request->bdaddr = bt_addr;
6505 if (mgmt_send(adapter->mgmt, MGMT_OP_SET_LE_BATCHING_PARAM,
6506 adapter->dev_id, sizeof(cp), &cp,
6507 set_le_batching_param_complete, request, NULL) == 0) {
6508 dbus_message_unref(request->msg);
6510 return btd_error_failed(msg, "Unable to set le batching param");
6516 static DBusMessage *adapter_disable_le_batching(DBusConnection *conn,
6517 DBusMessage *msg, void *data)
6519 struct btd_adapter *adapter = data;
6520 struct le_batching_request *request;
6521 struct mgmt_cp_set_le_batching_enable cp;
6522 bdaddr_t bt_addr = { { 0, } };
6523 const gchar *address = NULL;
6525 if (!(adapter->current_settings & MGMT_SETTING_POWERED))
6526 return btd_error_not_ready(msg);
6528 if (!dbus_message_get_args(msg, NULL,
6529 DBUS_TYPE_STRING, &address,
6531 return btd_error_invalid_args(msg);
6533 DBG("Disable LE Batching: [%s]", address);
6535 memset(&bt_addr, 0, sizeof(bdaddr_t));
6536 str2ba(address, &bt_addr);
6537 memset(&cp, 0, sizeof(struct mgmt_cp_set_le_batching_enable));
6539 if (bachk(address) < 0)
6540 return btd_error_invalid_args(msg);
6542 cp.bdaddr = bt_addr;
6545 request = g_new(struct le_batching_request, 1);
6546 request->msg = dbus_message_ref(msg);
6547 request->adapter = adapter;
6548 if (mgmt_send(adapter->mgmt, MGMT_OP_SET_LE_BATCHING_ENABLE,
6549 adapter->dev_id, sizeof(cp), &cp,
6550 set_le_batching_enable_complete, request, NULL) == 0) {
6551 dbus_message_unref(request->msg);
6553 return btd_error_failed(msg, "Unable to set le batching enable");
6559 void le_set_data_length_return_param_complete(
6560 uint8_t status, uint16_t length,
6561 const void *param, void *user_data)
6563 if (status != MGMT_STATUS_SUCCESS) {
6564 error("le_set_data_length failed: %s (0x%02x)",
6565 mgmt_errstr(status), status);
6571 int btd_adapter_le_set_data_length(struct btd_adapter *adapter, bdaddr_t *bdaddr,
6572 uint16_t max_tx_octets, uint16_t max_tx_time)
6574 struct mgmt_cp_le_set_data_length cp;
6576 memset(&cp, 0, sizeof(cp));
6578 bacpy(&cp.bdaddr, bdaddr);
6580 cp.max_tx_octets = max_tx_octets;
6581 cp.max_tx_time = max_tx_time;
6583 if (mgmt_send(adapter->mgmt, MGMT_OP_LE_SET_DATA_LENGTH,
6584 adapter->dev_id, sizeof(cp), &cp,
6585 le_set_data_length_return_param_complete,
6592 static DBusMessage *adapter_set_manufacturer_data(DBusConnection *conn,
6593 DBusMessage *msg, void *data)
6595 struct btd_adapter *adapter = data;
6596 struct mgmt_cp_set_manufacturer_data cp;
6600 DBG("Set manufacturer data");
6602 if (!(adapter->current_settings & MGMT_SETTING_POWERED))
6603 return btd_error_not_ready(msg);
6605 if (!dbus_message_get_args(msg, NULL,
6606 DBUS_TYPE_ARRAY, DBUS_TYPE_BYTE, &value, &len,
6608 return btd_error_invalid_args(msg);
6610 if (len > EIR_MANUFACTURER_DATA_LENGTH_MAX)
6611 return btd_error_invalid_args(msg);
6613 memcpy(&cp, value, len);
6615 if (mgmt_send(adapter->mgmt, MGMT_OP_SET_MANUFACTURER_DATA,
6616 adapter->dev_id, EIR_MANUFACTURER_DATA_LENGTH_MAX,
6617 &cp, NULL, NULL, NULL) > 0)
6618 return dbus_message_new_method_return(msg);
6620 return btd_error_failed(msg, "Set manufacturer data failed");
6623 static DBusMessage *adapter_get_energy_info(DBusConnection *conn,
6624 DBusMessage *msg, void *user_data)
6627 uint32_t tx_time = 0;
6628 uint32_t rx_time = 0;
6629 uint32_t idle_time = 0;
6630 uint32_t energy_used = 0;
6632 if (adapter_le_get_energy_info(&tx_time, &rx_time,
6633 &idle_time, &energy_used) == FALSE) {
6634 error("Fail to send vcs for getting energy info");
6635 reply = btd_error_not_supported(msg);
6639 reply = g_dbus_create_reply(msg,
6640 DBUS_TYPE_UINT32, &tx_time,
6641 DBUS_TYPE_UINT32, &rx_time,
6642 DBUS_TYPE_UINT32, &idle_time,
6643 DBUS_TYPE_UINT32, &energy_used,
6647 reply = btd_error_failed(msg,
6648 "Failed to create reply.");
6655 #endif /* TIZEN_FEATURE_BLUEZ_MODIFY */
6657 static DBusMessage *start_discovery(DBusConnection *conn,
6658 DBusMessage *msg, void *user_data)
6660 struct btd_adapter *adapter = user_data;
6661 const char *sender = dbus_message_get_sender(msg);
6662 struct discovery_client *client;
6663 bool is_discovering;
6666 DBG("sender %s", sender);
6668 if (!btd_adapter_get_powered(adapter))
6669 return btd_error_not_ready(msg);
6671 is_discovering = get_discovery_client(adapter, sender, &client);
6674 * Every client can only start one discovery, if the client
6675 * already started a discovery then return an error.
6678 return btd_error_busy(msg);
6681 * If there was pre-set filter, just reconnect it to discovery_list,
6686 return btd_error_busy(msg);
6688 adapter->set_filter_list = g_slist_remove(
6689 adapter->set_filter_list, client);
6690 adapter->discovery_list = g_slist_prepend(
6691 adapter->discovery_list, client);
6696 client = g_new0(struct discovery_client, 1);
6698 client->adapter = adapter;
6699 client->owner = g_strdup(sender);
6700 client->discovery_filter = NULL;
6701 client->watch = g_dbus_add_disconnect_watch(dbus_conn, sender,
6702 discovery_disconnect, client,
6704 adapter->discovery_list = g_slist_prepend(adapter->discovery_list,
6709 * Just trigger the discovery here. In case an already running
6710 * discovery in idle phase exists, it will be restarted right
6713 err = update_discovery_filter(adapter);
6715 return dbus_message_new_method_return(msg);
6717 /* If the discovery has to be started wait it complete to reply */
6718 if (err == -EINPROGRESS) {
6719 client->msg = dbus_message_ref(msg);
6720 #ifndef TIZEN_FEATURE_BLUEZ_MODIFY
6721 adapter->client = client;
6727 return btd_error_failed(msg, strerror(-err));
6730 static bool parse_uuids(DBusMessageIter *value, struct discovery_filter *filter)
6732 DBusMessageIter arriter;
6734 if (dbus_message_iter_get_arg_type(value) != DBUS_TYPE_ARRAY)
6737 dbus_message_iter_recurse(value, &arriter);
6738 while (dbus_message_iter_get_arg_type(&arriter) != DBUS_TYPE_INVALID) {
6739 bt_uuid_t uuid, u128;
6740 char uuidstr[MAX_LEN_UUID_STR + 1];
6743 if (dbus_message_iter_get_arg_type(&arriter) !=
6747 dbus_message_iter_get_basic(&arriter, &uuid_param);
6749 if (bt_string_to_uuid(&uuid, uuid_param))
6752 bt_uuid_to_uuid128(&uuid, &u128);
6753 bt_uuid_to_string(&u128, uuidstr, sizeof(uuidstr));
6755 filter->uuids = g_slist_prepend(filter->uuids, g_strdup(uuidstr));
6757 dbus_message_iter_next(&arriter);
6763 static bool parse_rssi(DBusMessageIter *value, struct discovery_filter *filter)
6765 if (dbus_message_iter_get_arg_type(value) != DBUS_TYPE_INT16)
6768 dbus_message_iter_get_basic(value, &filter->rssi);
6769 /* -127 <= RSSI <= +20 (spec V4.2 [Vol 2, Part E] 7.7.65.2) */
6770 if (filter->rssi > 20 || filter->rssi < -127)
6776 static bool parse_pathloss(DBusMessageIter *value,
6777 struct discovery_filter *filter)
6779 if (dbus_message_iter_get_arg_type(value) != DBUS_TYPE_UINT16)
6782 dbus_message_iter_get_basic(value, &filter->pathloss);
6783 /* pathloss filter must be smaller that PATHLOSS_MAX */
6784 if (filter->pathloss > PATHLOSS_MAX)
6790 static bool parse_transport(DBusMessageIter *value,
6791 struct discovery_filter *filter)
6793 char *transport_str;
6795 if (dbus_message_iter_get_arg_type(value) != DBUS_TYPE_STRING)
6798 dbus_message_iter_get_basic(value, &transport_str);
6800 if (!strcmp(transport_str, "bredr"))
6801 filter->type = SCAN_TYPE_BREDR;
6802 else if (!strcmp(transport_str, "le"))
6803 filter->type = SCAN_TYPE_LE;
6804 else if (strcmp(transport_str, "auto"))
6810 static bool parse_duplicate_data(DBusMessageIter *value,
6811 struct discovery_filter *filter)
6813 if (dbus_message_iter_get_arg_type(value) != DBUS_TYPE_BOOLEAN)
6816 dbus_message_iter_get_basic(value, &filter->duplicate);
6821 static bool parse_discoverable(DBusMessageIter *value,
6822 struct discovery_filter *filter)
6824 if (dbus_message_iter_get_arg_type(value) != DBUS_TYPE_BOOLEAN)
6827 dbus_message_iter_get_basic(value, &filter->discoverable);
6832 static bool parse_pattern(DBusMessageIter *value,
6833 struct discovery_filter *filter)
6835 const char *pattern;
6837 if (dbus_message_iter_get_arg_type(value) != DBUS_TYPE_STRING)
6840 dbus_message_iter_get_basic(value, &pattern);
6842 free(filter->pattern);
6843 filter->pattern = strdup(pattern);
6848 struct filter_parser {
6850 bool (*func)(DBusMessageIter *iter, struct discovery_filter *filter);
6852 { "UUIDs", parse_uuids },
6853 { "RSSI", parse_rssi },
6854 { "Pathloss", parse_pathloss },
6855 { "Transport", parse_transport },
6856 { "DuplicateData", parse_duplicate_data },
6857 { "Discoverable", parse_discoverable },
6858 { "Pattern", parse_pattern },
6862 static bool parse_discovery_filter_entry(char *key, DBusMessageIter *value,
6863 struct discovery_filter *filter)
6865 struct filter_parser *parser;
6867 for (parser = parsers; parser && parser->name; parser++) {
6868 if (!strcmp(parser->name, key))
6869 return parser->func(value, filter);
6872 DBG("Unknown key parameter: %s!\n", key);
6877 * This method is responsible for parsing parameters to SetDiscoveryFilter. If
6878 * filter in msg was empty, sets *filter to NULL. If whole parsing was
6879 * successful, sets *filter to proper value.
6880 * Returns false on any error, and true on success.
6882 static bool parse_discovery_filter_dict(struct btd_adapter *adapter,
6883 struct discovery_filter **filter,
6886 DBusMessageIter iter, subiter, dictiter, variantiter;
6887 bool is_empty = true;
6889 *filter = g_try_malloc(sizeof(**filter));
6893 (*filter)->uuids = NULL;
6894 (*filter)->pathloss = DISTANCE_VAL_INVALID;
6895 (*filter)->rssi = DISTANCE_VAL_INVALID;
6896 (*filter)->type = get_scan_type(adapter);
6897 (*filter)->duplicate = false;
6898 (*filter)->discoverable = false;
6899 (*filter)->pattern = NULL;
6901 dbus_message_iter_init(msg, &iter);
6902 if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_ARRAY ||
6903 dbus_message_iter_get_element_type(&iter) != DBUS_TYPE_DICT_ENTRY)
6906 dbus_message_iter_recurse(&iter, &subiter);
6908 int type = dbus_message_iter_get_arg_type(&subiter);
6911 if (type == DBUS_TYPE_INVALID)
6915 dbus_message_iter_recurse(&subiter, &dictiter);
6917 dbus_message_iter_get_basic(&dictiter, &key);
6918 if (!dbus_message_iter_next(&dictiter))
6921 if (dbus_message_iter_get_arg_type(&dictiter) !=
6925 dbus_message_iter_recurse(&dictiter, &variantiter);
6927 if (!parse_discovery_filter_entry(key, &variantiter, *filter))
6930 dbus_message_iter_next(&subiter);
6939 /* only pathlos or rssi can be set, never both */
6940 if ((*filter)->pathloss != DISTANCE_VAL_INVALID &&
6941 (*filter)->rssi != DISTANCE_VAL_INVALID)
6944 DBG("filtered discovery params: transport: %d rssi: %d pathloss: %d "
6945 " duplicate data: %s discoverable %s pattern %s",
6946 (*filter)->type, (*filter)->rssi, (*filter)->pathloss,
6947 (*filter)->duplicate ? "true" : "false",
6948 (*filter)->discoverable ? "true" : "false",
6949 (*filter)->pattern);
6954 g_slist_free_full((*filter)->uuids, g_free);
6960 static DBusMessage *set_discovery_filter(DBusConnection *conn,
6961 DBusMessage *msg, void *user_data)
6963 struct btd_adapter *adapter = user_data;
6964 struct discovery_client *client;
6965 struct discovery_filter *discovery_filter;
6966 const char *sender = dbus_message_get_sender(msg);
6967 bool is_discovering;
6969 DBG("sender %s", sender);
6971 if (!btd_adapter_get_powered(adapter))
6972 return btd_error_not_ready(msg);
6974 if (MGMT_VERSION(mgmt_version, mgmt_revision) < MGMT_VERSION(1, 8))
6975 return btd_error_not_supported(msg);
6977 /* parse parameters */
6978 if (!parse_discovery_filter_dict(adapter, &discovery_filter, msg))
6979 return btd_error_invalid_args(msg);
6981 is_discovering = get_discovery_client(adapter, sender, &client);
6984 free_discovery_filter(client->discovery_filter);
6985 client->discovery_filter = discovery_filter;
6988 update_discovery_filter(adapter);
6990 if (discovery_filter || is_discovering)
6991 return dbus_message_new_method_return(msg);
6993 /* Removing pre-set filter */
6994 adapter->set_filter_list = g_slist_remove(
6995 adapter->set_filter_list,
6997 discovery_free(client);
6998 DBG("successfully cleared pre-set filter");
6999 } else if (discovery_filter) {
7000 /* Client pre-setting his filter for first time */
7001 client = g_new0(struct discovery_client, 1);
7002 client->adapter = adapter;
7003 client->owner = g_strdup(sender);
7004 client->discovery_filter = discovery_filter;
7005 client->watch = g_dbus_add_disconnect_watch(dbus_conn, sender,
7006 discovery_disconnect, client,
7008 adapter->set_filter_list = g_slist_prepend(
7009 adapter->set_filter_list, client);
7011 DBG("successfully pre-set filter");
7014 return dbus_message_new_method_return(msg);
7017 static DBusMessage *stop_discovery(DBusConnection *conn,
7018 DBusMessage *msg, void *user_data)
7020 struct btd_adapter *adapter = user_data;
7021 const char *sender = dbus_message_get_sender(msg);
7022 struct discovery_client *client;
7026 DBG("sender %s", sender);
7028 if (!btd_adapter_get_powered(adapter))
7029 return btd_error_not_ready(msg);
7031 list = g_slist_find_custom(adapter->discovery_list, sender,
7034 return btd_error_failed(msg, "No discovery started");
7036 client = list->data;
7039 return btd_error_busy(msg);
7041 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
7042 err = discovery_stop(client, false);
7044 err = discovery_stop(client);
7048 return dbus_message_new_method_return(msg);
7050 client->msg = dbus_message_ref(msg);
7051 #ifndef TIZEN_FEATURE_BLUEZ_MODIFY
7052 adapter->client = client;
7056 return btd_error_failed(msg, strerror(-err));
7060 static gboolean property_get_address(const GDBusPropertyTable *property,
7061 DBusMessageIter *iter, void *user_data)
7063 struct btd_adapter *adapter = user_data;
7065 const char *str = addr;
7067 ba2str(&adapter->bdaddr, addr);
7069 dbus_message_iter_append_basic(iter, DBUS_TYPE_STRING, &str);
7074 static gboolean property_get_address_type(const GDBusPropertyTable *property,
7075 DBusMessageIter *iter, void *user_data)
7077 struct btd_adapter *adapter = user_data;
7080 if ((adapter->current_settings & MGMT_SETTING_LE) &&
7081 (adapter->bdaddr_type == BDADDR_LE_RANDOM))
7086 dbus_message_iter_append_basic(iter, DBUS_TYPE_STRING, &str);
7091 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
7092 static gboolean property_get_le_address(const GDBusPropertyTable *property,
7093 DBusMessageIter *iter, void *user_data)
7095 struct btd_adapter *adapter = user_data;
7096 DBusMessageIter entry;
7098 const char *str = addr;
7101 dbus_message_iter_open_container(iter, DBUS_TYPE_ARRAY,
7102 DBUS_TYPE_STRING_AS_STRING, &entry);
7104 if (adapter->le_static_addr.b[5] != 0) {
7105 ba2str(&adapter->le_static_addr, addr);
7106 type = g_strdup_printf("%d", BDADDR_LE_RANDOM);
7108 ba2str(&adapter->bdaddr, addr);
7109 type = g_strdup_printf("%d", BDADDR_LE_PUBLIC);
7112 dbus_message_iter_append_basic(&entry, DBUS_TYPE_STRING, &type);
7113 g_free((void *)type);
7115 dbus_message_iter_append_basic(&entry, DBUS_TYPE_STRING, &str);
7117 dbus_message_iter_close_container(iter, &entry);
7123 static gboolean property_get_name(const GDBusPropertyTable *property,
7124 DBusMessageIter *iter, void *user_data)
7126 struct btd_adapter *adapter = user_data;
7127 const char *str = adapter->system_name ? : "";
7129 dbus_message_iter_append_basic(iter, DBUS_TYPE_STRING, &str);
7134 static gboolean property_get_alias(const GDBusPropertyTable *property,
7135 DBusMessageIter *iter, void *user_data)
7137 struct btd_adapter *adapter = user_data;
7140 if (adapter->current_alias)
7141 str = adapter->current_alias;
7142 else if (adapter->stored_alias)
7143 str = adapter->stored_alias;
7145 str = adapter->system_name ? : "";
7147 dbus_message_iter_append_basic(iter, DBUS_TYPE_STRING, &str);
7152 static void property_set_alias(const GDBusPropertyTable *property,
7153 DBusMessageIter *iter,
7154 GDBusPendingPropertySet id, void *user_data)
7156 struct btd_adapter *adapter = user_data;
7160 dbus_message_iter_get_basic(iter, &name);
7162 if (g_str_equal(name, "") == TRUE) {
7163 if (adapter->stored_alias == NULL) {
7164 /* no alias set, nothing to restore */
7165 g_dbus_pending_property_success(id);
7169 /* restore to system name */
7170 ret = set_name(adapter, adapter->system_name);
7172 if (g_strcmp0(adapter->stored_alias, name) == 0) {
7173 /* alias already set, nothing to do */
7174 g_dbus_pending_property_success(id);
7179 ret = set_name(adapter, name);
7183 g_free(adapter->stored_alias);
7185 if (g_str_equal(name, "") == TRUE)
7186 adapter->stored_alias = NULL;
7188 adapter->stored_alias = g_strdup(name);
7190 store_adapter_info(adapter);
7192 g_dbus_pending_property_success(id);
7197 g_dbus_pending_property_error(id,
7198 ERROR_INTERFACE ".InvalidArguments",
7199 "Invalid arguments in method call");
7201 g_dbus_pending_property_error(id, ERROR_INTERFACE ".Failed",
7205 static gboolean property_get_class(const GDBusPropertyTable *property,
7206 DBusMessageIter *iter, void *user_data)
7208 struct btd_adapter *adapter = user_data;
7209 dbus_uint32_t val = adapter->dev_class;
7211 dbus_message_iter_append_basic(iter, DBUS_TYPE_UINT32, &val);
7216 static gboolean property_get_a2dp_role(const GDBusPropertyTable *property,
7217 DBusMessageIter *iter, void *user_data)
7219 struct btd_adapter *adapter = user_data;
7220 dbus_uint32_t val = adapter->a2dp_role;
7222 dbus_message_iter_append_basic(iter, DBUS_TYPE_UINT32, &val);
7227 static gboolean property_get_mode(struct btd_adapter *adapter,
7228 uint32_t setting, DBusMessageIter *iter)
7232 enable = (adapter->current_settings & setting) ? TRUE : FALSE;
7234 dbus_message_iter_append_basic(iter, DBUS_TYPE_BOOLEAN, &enable);
7239 struct property_set_data {
7240 struct btd_adapter *adapter;
7242 GDBusPendingPropertySet id;
7246 static void property_set_mode_complete(uint8_t status, uint16_t length,
7247 const void *param, void *user_data)
7249 struct property_set_data *data = user_data;
7250 struct btd_adapter *adapter = data->adapter;
7252 DBG("%s (0x%02x)", mgmt_errstr(status), status);
7254 if (status != MGMT_STATUS_SUCCESS) {
7255 const char *dbus_err;
7257 btd_error(adapter->dev_id, "Failed to set mode: %s (0x%02x)",
7258 mgmt_errstr(status), status);
7260 if (status == MGMT_STATUS_RFKILLED) {
7261 dbus_err = ERROR_INTERFACE ".Blocked";
7262 adapter_set_power_state(adapter,
7263 ADAPTER_POWER_STATE_OFF_BLOCKED);
7265 dbus_err = ERROR_INTERFACE ".Failed";
7268 g_dbus_pending_property_error(data->id, dbus_err,
7269 mgmt_errstr(status));
7271 adapter->pending_settings &= ~data->setting;
7272 if (status != MGMT_STATUS_RFKILLED &&
7273 data->setting & MGMT_SETTING_POWERED)
7274 reset_power_state_target(adapter, data->value);
7278 g_dbus_pending_property_success(data->id);
7281 * The parameters are identical and also the task that is
7282 * required in both cases. So it is safe to just call the
7283 * event handling functions here.
7285 new_settings_callback(adapter->dev_id, length, param, adapter);
7288 static void clear_discoverable(struct btd_adapter *adapter)
7290 if (!btd_has_kernel_features(KERNEL_CONN_CONTROL))
7293 if (!(adapter->current_settings & MGMT_SETTING_DISCOVERABLE))
7296 /* If no timeout is set do nothing as both connectable and discoverable
7297 * flags are persistent on power toggle.
7299 if (!adapter->discoverable_timeout)
7302 /* If timeout was set kernel clears discoverable on its own when
7303 * powering off controller. This would leave connectable flag set
7306 * With kernel control clearing connectable clear also discoverable
7307 * flag so we need to clear connectable.
7309 set_mode(adapter, MGMT_OP_SET_CONNECTABLE, 0x00);
7312 static void property_set_mode(struct btd_adapter *adapter, uint32_t setting,
7313 DBusMessageIter *value,
7314 GDBusPendingPropertySet id)
7316 struct property_set_data *data;
7317 struct mgmt_cp_set_discoverable cp;
7319 dbus_bool_t enable, current_enable;
7320 uint16_t opcode, len;
7323 dbus_message_iter_get_basic(value, &enable);
7325 if (adapter->pending_settings & setting) {
7326 g_dbus_pending_property_error(id, ERROR_INTERFACE ".Busy",
7331 if (adapter->current_settings & setting)
7332 current_enable = TRUE;
7334 current_enable = FALSE;
7336 if (enable == current_enable) {
7337 g_dbus_pending_property_success(id);
7341 mode = (enable == TRUE) ? 0x01 : 0x00;
7344 case MGMT_SETTING_POWERED:
7345 opcode = MGMT_OP_SET_POWERED;
7350 btd_adv_monitor_power_down(
7351 adapter->adv_monitor_manager);
7352 clear_discoverable(adapter);
7353 remove_temporary_devices(adapter);
7357 case MGMT_SETTING_DISCOVERABLE:
7358 #ifndef TIZEN_FEATURE_BLUEZ_MODIFY
7359 if (btd_has_kernel_features(KERNEL_CONN_CONTROL)) {
7361 set_mode(adapter, MGMT_OP_SET_CONNECTABLE,
7364 opcode = MGMT_OP_SET_CONNECTABLE;
7372 memset(&cp, 0, sizeof(cp));
7375 cp.timeout = htobs(adapter->discoverable_timeout);
7377 opcode = MGMT_OP_SET_DISCOVERABLE;
7381 case MGMT_SETTING_BONDABLE:
7382 opcode = MGMT_OP_SET_BONDABLE;
7386 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
7387 case MGMT_SETTING_CONNECTABLE:
7388 opcode = MGMT_OP_SET_CONNECTABLE;
7397 DBG("sending %s command for index %u", mgmt_opstr(opcode),
7400 data = g_try_new0(struct property_set_data, 1);
7404 data->adapter = adapter;
7405 data->setting = setting;
7407 data->setting = setting;
7410 if (setting == MGMT_SETTING_POWERED &&
7411 adapter->power_state != ADAPTER_POWER_STATE_OFF_BLOCKED) {
7412 adapter_set_power_state(adapter, mode ?
7413 ADAPTER_POWER_STATE_OFF_ENABLING :
7414 ADAPTER_POWER_STATE_ON_DISABLING);
7417 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
7419 * Use mgmt_send_nowait to avoid dbus timeout in a state of bonding.
7421 if (mgmt_send_nowait(adapter->mgmt, opcode, adapter->dev_id, len, param,
7422 property_set_mode_complete, data, g_free) > 0)
7425 if (mgmt_send(adapter->mgmt, opcode, adapter->dev_id, len, param,
7426 propertyi_set_mode_complete, data, g_free) > 0){
7427 adapter->pending_settings |= setting;
7433 if (setting == MGMT_SETTING_POWERED) {
7434 /* cancel the earlier setting */
7435 adapter_set_power_state(adapter, mode ?
7436 ADAPTER_POWER_STATE_OFF :
7437 ADAPTER_POWER_STATE_ON);
7441 btd_error(adapter->dev_id, "Failed to set mode for index %u",
7444 g_dbus_pending_property_error(id, ERROR_INTERFACE ".Failed", NULL);
7447 static gboolean property_get_powered(const GDBusPropertyTable *property,
7448 DBusMessageIter *iter, void *user_data)
7450 struct btd_adapter *adapter = user_data;
7452 return property_get_mode(adapter, MGMT_SETTING_POWERED, iter);
7455 static void property_set_powered(const GDBusPropertyTable *property,
7456 DBusMessageIter *iter,
7457 GDBusPendingPropertySet id, void *user_data)
7459 struct btd_adapter *adapter = user_data;
7461 if (powering_down) {
7462 g_dbus_pending_property_error(id, ERROR_INTERFACE ".Failed",
7467 property_set_mode(adapter, MGMT_SETTING_POWERED, iter, id);
7470 static gboolean property_get_power_state(const GDBusPropertyTable *property,
7471 DBusMessageIter *iter, void *user_data)
7473 struct btd_adapter *adapter = user_data;
7476 str = adapter_power_state_str(adapter->power_state);
7477 dbus_message_iter_append_basic(iter, DBUS_TYPE_STRING, &str);
7482 static gboolean property_get_discoverable(const GDBusPropertyTable *property,
7483 DBusMessageIter *iter, void *user_data)
7485 struct btd_adapter *adapter = user_data;
7487 return property_get_mode(adapter, MGMT_SETTING_DISCOVERABLE, iter);
7490 static void property_set_discoverable(const GDBusPropertyTable *property,
7491 DBusMessageIter *iter,
7492 GDBusPendingPropertySet id, void *user_data)
7494 struct btd_adapter *adapter = user_data;
7496 if (adapter->discoverable_timeout > 0 &&
7497 !btd_adapter_get_powered(adapter)) {
7498 g_dbus_pending_property_error(id, ERROR_INTERFACE ".Failed",
7503 /* Reset discovery_discoverable as Discoverable takes precedence */
7504 adapter->discovery_discoverable = false;
7506 property_set_mode(adapter, MGMT_SETTING_DISCOVERABLE, iter, id);
7509 static gboolean property_get_discoverable_timeout(
7510 const GDBusPropertyTable *property,
7511 DBusMessageIter *iter, void *user_data)
7513 struct btd_adapter *adapter = user_data;
7514 dbus_uint32_t value = adapter->discoverable_timeout;
7516 dbus_message_iter_append_basic(iter, DBUS_TYPE_UINT32, &value);
7521 static void property_set_discoverable_timeout(
7522 const GDBusPropertyTable *property,
7523 DBusMessageIter *iter,
7524 GDBusPendingPropertySet id, void *user_data)
7526 struct btd_adapter *adapter = user_data;
7528 dbus_uint32_t value;
7530 dbus_message_iter_get_basic(iter, &value);
7532 adapter->discoverable_timeout = value;
7534 g_dbus_pending_property_success(id);
7536 store_adapter_info(adapter);
7538 g_dbus_emit_property_changed(dbus_conn, adapter->path,
7539 ADAPTER_INTERFACE, "DiscoverableTimeout");
7541 if (adapter->pending_settings & MGMT_SETTING_DISCOVERABLE) {
7542 if (adapter->current_settings & MGMT_SETTING_DISCOVERABLE)
7547 if (adapter->current_settings & MGMT_SETTING_DISCOVERABLE)
7554 set_discoverable(adapter, 0x01, adapter->discoverable_timeout);
7557 static gboolean property_get_pairable(const GDBusPropertyTable *property,
7558 DBusMessageIter *iter, void *user_data)
7560 struct btd_adapter *adapter = user_data;
7562 return property_get_mode(adapter, MGMT_SETTING_BONDABLE, iter);
7565 static void property_set_pairable(const GDBusPropertyTable *property,
7566 DBusMessageIter *iter,
7567 GDBusPendingPropertySet id, void *user_data)
7569 struct btd_adapter *adapter = user_data;
7571 property_set_mode(adapter, MGMT_SETTING_BONDABLE, iter, id);
7574 static gboolean property_get_pairable_timeout(
7575 const GDBusPropertyTable *property,
7576 DBusMessageIter *iter, void *user_data)
7578 struct btd_adapter *adapter = user_data;
7579 dbus_uint32_t value = adapter->pairable_timeout;
7581 dbus_message_iter_append_basic(iter, DBUS_TYPE_UINT32, &value);
7586 static void property_set_pairable_timeout(const GDBusPropertyTable *property,
7587 DBusMessageIter *iter,
7588 GDBusPendingPropertySet id, void *user_data)
7590 struct btd_adapter *adapter = user_data;
7591 dbus_uint32_t value;
7593 dbus_message_iter_get_basic(iter, &value);
7595 adapter->pairable_timeout = value;
7597 g_dbus_pending_property_success(id);
7599 store_adapter_info(adapter);
7601 g_dbus_emit_property_changed(dbus_conn, adapter->path,
7602 ADAPTER_INTERFACE, "PairableTimeout");
7604 trigger_pairable_timeout(adapter);
7607 static gboolean property_get_discovering(const GDBusPropertyTable *property,
7608 DBusMessageIter *iter, void *user_data)
7610 struct btd_adapter *adapter = user_data;
7611 dbus_bool_t discovering = adapter->discovering;
7613 dbus_message_iter_append_basic(iter, DBUS_TYPE_BOOLEAN, &discovering);
7618 static void add_gatt_uuid(struct gatt_db_attribute *attrib, void *user_data)
7620 GHashTable *uuids = user_data;
7621 bt_uuid_t uuid, u128;
7622 char uuidstr[MAX_LEN_UUID_STR + 1];
7624 if (!gatt_db_service_get_active(attrib))
7627 if (!gatt_db_attribute_get_service_uuid(attrib, &uuid))
7630 bt_uuid_to_uuid128(&uuid, &u128);
7631 bt_uuid_to_string(&u128, uuidstr, sizeof(uuidstr));
7633 g_hash_table_add(uuids, strdup(uuidstr));
7636 static void iter_append_uuid(gpointer key, gpointer value, gpointer user_data)
7638 DBusMessageIter *iter = user_data;
7639 const char *uuid = key;
7641 dbus_message_iter_append_basic(iter, DBUS_TYPE_STRING, &uuid);
7644 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
7645 static gboolean property_get_le_discovering(const GDBusPropertyTable *property,
7646 DBusMessageIter *iter, void *user_data)
7648 struct btd_adapter *adapter = user_data;
7649 dbus_bool_t discovering = adapter->le_discovering;
7651 dbus_message_iter_append_basic(iter, DBUS_TYPE_BOOLEAN, &discovering);
7656 static gboolean property_get_connectable(const GDBusPropertyTable *property,
7657 DBusMessageIter *iter, void *user_data)
7659 struct btd_adapter *adapter = user_data;
7661 return property_get_mode(adapter, MGMT_SETTING_CONNECTABLE, iter);
7664 static void property_set_connectable(const GDBusPropertyTable *property,
7665 DBusMessageIter *iter,
7666 GDBusPendingPropertySet id, void *user_data)
7668 struct btd_adapter *adapter = user_data;
7670 property_set_mode(adapter, MGMT_SETTING_CONNECTABLE, iter, id);
7673 static gboolean property_get_version(const GDBusPropertyTable *property,
7674 DBusMessageIter *iter, void *user_data)
7676 struct btd_adapter *adapter = user_data;
7677 const char *str = adapter->version ? : "";
7679 dbus_message_iter_append_basic(iter, DBUS_TYPE_STRING, &str);
7684 static gboolean property_get_supported_le_features(
7685 const GDBusPropertyTable *property,
7686 DBusMessageIter *iter, void *user_data)
7688 const char *str, *val;
7690 DBusMessageIter entry;
7691 struct btd_adapter *adapter = user_data;
7693 dbus_message_iter_open_container(iter, DBUS_TYPE_ARRAY,
7694 DBUS_TYPE_STRING_AS_STRING, &entry);
7696 value = adapter_le_get_max_adv_instance();
7698 str = g_strdup("adv_inst_max");
7699 dbus_message_iter_append_basic(&entry, DBUS_TYPE_STRING, &str);
7701 val = g_strdup_printf("%d", value);
7702 dbus_message_iter_append_basic(&entry, DBUS_TYPE_STRING, &val);
7704 g_free((void *)str);
7705 g_free((void *)val);
7708 value = adapter_le_is_supported_offloading();
7710 str = g_strdup("rpa_offloading");
7711 dbus_message_iter_append_basic(&entry, DBUS_TYPE_STRING, &str);
7713 val = g_strdup_printf("%d", value);
7714 dbus_message_iter_append_basic(&entry, DBUS_TYPE_STRING, &val);
7716 g_free((void *)str);
7717 g_free((void *)val);
7720 value = adapter_le_get_scan_filter_size();
7721 #ifdef TIZEN_FEATURE_PLATFROM_SCAN_FILTER
7723 value = SCAN_FILTER_SLOTS_MAX;
7726 str = g_strdup("max_filter");
7727 dbus_message_iter_append_basic(&entry, DBUS_TYPE_STRING, &str);
7729 val = g_strdup_printf("%d", value);
7730 dbus_message_iter_append_basic(&entry, DBUS_TYPE_STRING, &val);
7732 g_free((void *)str);
7733 g_free((void *)val);
7736 if (adapter->supported_settings & MGMT_SETTING_PHY_CONFIGURATION) {
7737 /* 2M PHY Support */
7738 str = g_strdup("2m_phy");
7739 dbus_message_iter_append_basic(&entry, DBUS_TYPE_STRING, &str);
7741 if (adapter->le_2m_phy_supported)
7742 val = g_strdup("true");
7744 val = g_strdup("false");
7746 dbus_message_iter_append_basic(&entry, DBUS_TYPE_STRING, &val);
7748 g_free((void *)str);
7749 g_free((void *)val);
7751 /* CODED PHY Support */
7752 str = g_strdup("coded_phy");
7753 dbus_message_iter_append_basic(&entry, DBUS_TYPE_STRING, &str);
7755 if (adapter->le_coded_phy_supported)
7756 val = g_strdup("true");
7758 val = g_strdup("false");
7760 dbus_message_iter_append_basic(&entry, DBUS_TYPE_STRING, &val);
7762 g_free((void *)str);
7763 g_free((void *)val);
7766 dbus_message_iter_close_container(iter, &entry);
7771 static gboolean property_get_ipsp_init_state(
7772 const GDBusPropertyTable *property,
7773 DBusMessageIter *iter, void *data)
7775 struct btd_adapter *adapter = data;
7776 dbus_bool_t ipsp_initialized;
7778 if (adapter->ipsp_intialized)
7779 ipsp_initialized = TRUE;
7781 ipsp_initialized = FALSE;
7783 dbus_message_iter_append_basic(iter, DBUS_TYPE_BOOLEAN,
7790 static gboolean property_get_uuids(const GDBusPropertyTable *property,
7791 DBusMessageIter *iter, void *user_data)
7793 struct btd_adapter *adapter = user_data;
7794 DBusMessageIter entry;
7799 uuids = g_hash_table_new_full(g_str_hash, g_str_equal, free, NULL);
7804 for (l = adapter->services; l != NULL; l = l->next) {
7805 sdp_record_t *rec = l->data;
7808 uuid = bt_uuid2string(&rec->svclass);
7812 g_hash_table_add(uuids, uuid);
7816 db = btd_gatt_database_get_db(adapter->database);
7818 gatt_db_foreach_service(db, NULL, add_gatt_uuid, uuids);
7820 dbus_message_iter_open_container(iter, DBUS_TYPE_ARRAY,
7821 DBUS_TYPE_STRING_AS_STRING, &entry);
7822 g_hash_table_foreach(uuids, iter_append_uuid, &entry);
7823 dbus_message_iter_close_container(iter, &entry);
7825 g_hash_table_destroy(uuids);
7830 static gboolean property_exists_modalias(const GDBusPropertyTable *property,
7833 struct btd_adapter *adapter = user_data;
7835 return adapter->modalias ? TRUE : FALSE;
7838 static gboolean property_get_modalias(const GDBusPropertyTable *property,
7839 DBusMessageIter *iter, void *user_data)
7841 struct btd_adapter *adapter = user_data;
7842 const char *str = adapter->modalias ? : "";
7844 dbus_message_iter_append_basic(iter, DBUS_TYPE_STRING, &str);
7849 static gboolean property_get_roles(const GDBusPropertyTable *property,
7850 DBusMessageIter *iter, void *user_data)
7852 struct btd_adapter *adapter = user_data;
7853 DBusMessageIter entry;
7855 dbus_message_iter_open_container(iter, DBUS_TYPE_ARRAY,
7856 DBUS_TYPE_STRING_AS_STRING, &entry);
7858 if (adapter->supported_settings & MGMT_SETTING_LE) {
7859 const char *str = "central";
7860 dbus_message_iter_append_basic(&entry, DBUS_TYPE_STRING, &str);
7863 if (adapter->supported_settings & MGMT_SETTING_ADVERTISING) {
7864 const char *str = "peripheral";
7865 dbus_message_iter_append_basic(&entry, DBUS_TYPE_STRING, &str);
7868 if (queue_find(adapter->exps, NULL,
7869 le_simult_central_peripheral_uuid.val)) {
7870 const char *str = "central-peripheral";
7871 dbus_message_iter_append_basic(&entry, DBUS_TYPE_STRING, &str);
7874 dbus_message_iter_close_container(iter, &entry);
7879 static void property_append_experimental(void *data, void *user_data)
7881 uint8_t *feature = data;
7882 DBusMessageIter *iter = user_data;
7885 char str[MAX_LEN_UUID_STR + 1];
7888 bswap_128(feature, &value);
7889 bt_uuid128_create(&uuid, value);
7890 bt_uuid_to_string(&uuid, str, sizeof(str));
7894 dbus_message_iter_append_basic(iter, DBUS_TYPE_STRING, &ptr);
7897 static gboolean property_get_experimental(const GDBusPropertyTable *property,
7898 DBusMessageIter *iter, void *user_data)
7900 struct btd_adapter *adapter = user_data;
7901 DBusMessageIter entry;
7903 dbus_message_iter_open_container(iter, DBUS_TYPE_ARRAY,
7904 DBUS_TYPE_STRING_AS_STRING, &entry);
7906 queue_foreach(adapter->exps, property_append_experimental, &entry);
7908 dbus_message_iter_close_container(iter, &entry);
7913 static gboolean property_experimental_exists(const GDBusPropertyTable *property,
7916 struct btd_adapter *adapter = data;
7918 return !queue_isempty(adapter->exps);
7921 static DBusMessage *remove_device(DBusConnection *conn,
7922 DBusMessage *msg, void *user_data)
7924 struct btd_adapter *adapter = user_data;
7925 struct btd_device *device;
7929 if (dbus_message_get_args(msg, NULL, DBUS_TYPE_OBJECT_PATH, &path,
7930 DBUS_TYPE_INVALID) == FALSE)
7931 return btd_error_invalid_args(msg);
7933 list = g_slist_find_custom(adapter->devices, path, device_path_cmp);
7935 return btd_error_does_not_exist(msg);
7937 if (!btd_adapter_get_powered(adapter))
7938 return btd_error_not_ready(msg);
7940 device = list->data;
7942 btd_device_set_temporary(device, true);
7944 if (!btd_device_is_connected(device)) {
7945 btd_adapter_remove_device(adapter, device);
7946 return dbus_message_new_method_return(msg);
7949 device_request_disconnect(device, msg);
7954 static DBusMessage *get_discovery_filters(DBusConnection *conn,
7955 DBusMessage *msg, void *user_data)
7958 DBusMessageIter iter, array;
7959 struct filter_parser *parser;
7961 reply = dbus_message_new_method_return(msg);
7963 dbus_message_iter_init_append(reply, &iter);
7965 dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY,
7966 DBUS_TYPE_STRING_AS_STRING, &array);
7968 for (parser = parsers; parser && parser->name; parser++) {
7969 dbus_message_iter_append_basic(&array, DBUS_TYPE_STRING,
7973 dbus_message_iter_close_container(&iter, &array);
7978 struct device_connect_data {
7979 struct btd_adapter *adapter;
7985 static void device_browse_cb(struct btd_device *dev, int err, void *user_data)
7987 DBG("err %d (%s)", err, strerror(-err));
7990 btd_device_connect_services(dev, NULL);
7993 static void device_connect_cb(GIOChannel *io, GError *gerr, gpointer user_data)
7995 struct device_connect_data *data = user_data;
7996 struct btd_adapter *adapter = data->adapter;
7997 struct btd_device *device;
8000 DBG("%s", gerr ? gerr->message : "");
8005 /* object might already exist due to mgmt socket event */
8006 device = btd_adapter_get_device(adapter, &data->dst, data->dst_type);
8010 path = device_get_path(device);
8012 g_dbus_send_reply(dbus_conn, data->msg, DBUS_TYPE_OBJECT_PATH, &path,
8015 /* continue with service discovery and connection */
8016 btd_device_set_temporary(device, false);
8017 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
8018 device_update_last_seen(device, data->dst_type);
8020 device_update_last_seen(device, data->dst_type, true);
8023 if (data->dst_type != BDADDR_BREDR){
8024 g_io_channel_set_close_on_unref(io, FALSE);
8025 device_attach_att(device, io);
8028 device_discover_services(device);
8029 device_wait_for_svc_complete(device, device_browse_cb, NULL);
8031 g_io_channel_unref(io);
8032 dbus_message_unref(data->msg);
8037 g_dbus_send_error(dbus_conn, data->msg, "org.bluez.Failed", NULL);
8038 g_io_channel_unref(io);
8039 dbus_message_unref(data->msg);
8043 static void device_connect(struct btd_adapter *adapter, const bdaddr_t *dst,
8044 uint8_t dst_type, DBusMessage *msg)
8046 struct device_connect_data *data;
8049 data = new0(struct device_connect_data, 1);
8050 data->adapter = adapter;
8051 bacpy(&data->dst, dst);
8052 data->dst_type = dst_type;
8053 data->msg = dbus_message_ref(msg);
8055 if (dst_type == BDADDR_BREDR)
8056 io = bt_io_connect(device_connect_cb, data, NULL, NULL,
8057 BT_IO_OPT_SOURCE_BDADDR, &adapter->bdaddr,
8058 BT_IO_OPT_SOURCE_TYPE, BDADDR_BREDR,
8059 BT_IO_OPT_DEST_BDADDR, dst,
8060 BT_IO_OPT_DEST_TYPE, BDADDR_BREDR,
8061 BT_IO_OPT_PSM, SDP_PSM,
8062 BT_IO_OPT_SEC_LEVEL, BT_IO_SEC_LOW,
8065 io = bt_io_connect(device_connect_cb, data, NULL, NULL,
8066 BT_IO_OPT_SOURCE_BDADDR, &adapter->bdaddr,
8067 BT_IO_OPT_SOURCE_TYPE, adapter->bdaddr_type,
8068 BT_IO_OPT_DEST_BDADDR, dst,
8069 BT_IO_OPT_DEST_TYPE, dst_type,
8070 BT_IO_OPT_CID, ATT_CID,
8071 BT_IO_OPT_SEC_LEVEL, BT_IO_SEC_LOW,
8075 g_dbus_send_message(dbus_conn,
8076 btd_error_failed(msg, "Connect failed"));
8077 dbus_message_unref(data->msg);
8082 static DBusMessage *connect_device(DBusConnection *conn,
8083 DBusMessage *msg, void *user_data)
8085 struct btd_adapter *adapter = user_data;
8086 DBusMessageIter iter, subiter, dictiter, value;
8087 uint8_t addr_type = BDADDR_BREDR;
8088 bdaddr_t addr = *BDADDR_ANY;
8090 DBG("sender %s", dbus_message_get_sender(msg));
8092 if (!btd_adapter_get_powered(adapter))
8093 return btd_error_not_ready(msg);
8095 dbus_message_iter_init(msg, &iter);
8096 if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_ARRAY ||
8097 dbus_message_iter_get_element_type(&iter) != DBUS_TYPE_DICT_ENTRY)
8098 return btd_error_invalid_args(msg);
8100 dbus_message_iter_recurse(&iter, &subiter);
8102 int type = dbus_message_iter_get_arg_type(&subiter);
8106 if (type == DBUS_TYPE_INVALID)
8109 dbus_message_iter_recurse(&subiter, &dictiter);
8111 dbus_message_iter_get_basic(&dictiter, &key);
8112 if (!dbus_message_iter_next(&dictiter))
8113 return btd_error_invalid_args(msg);
8115 if (dbus_message_iter_get_arg_type(&dictiter) !=
8117 return btd_error_invalid_args(msg);
8119 dbus_message_iter_recurse(&dictiter, &value);
8121 if (!strcmp(key, "Address")) {
8122 if (dbus_message_iter_get_arg_type(&value) !=
8124 return btd_error_invalid_args(msg);
8126 dbus_message_iter_get_basic(&value, &str);
8128 if (str2ba(str, &addr) < 0 )
8129 return btd_error_invalid_args(msg);
8130 } else if (!strcmp(key, "AddressType")) {
8131 if (dbus_message_iter_get_arg_type(&value) !=
8133 return btd_error_invalid_args(msg);
8135 dbus_message_iter_get_basic(&value, &str);
8138 if (!strcmp(str, "public"))
8139 addr_type = BDADDR_LE_PUBLIC;
8140 else if (!strcmp(str, "random"))
8141 addr_type = BDADDR_LE_RANDOM;
8143 return btd_error_invalid_args(msg);
8145 return btd_error_invalid_args(msg);
8148 dbus_message_iter_next(&subiter);
8151 if (!bacmp(&addr, BDADDR_ANY))
8152 return btd_error_invalid_args(msg);
8154 device_connect(adapter, &addr, addr_type, msg);
8158 static void update_device_allowed_services(void *data, void *user_data)
8160 struct btd_device *device = data;
8162 btd_device_update_allowed_services(device);
8165 static void add_uuid_to_uuid_set(void *data, void *user_data)
8167 bt_uuid_t *uuid = data;
8168 GHashTable *uuid_set = user_data;
8171 error("Found NULL in UUID allowed list");
8175 g_hash_table_add(uuid_set, uuid);
8178 static guint bt_uuid_hash(gconstpointer key)
8180 const bt_uuid_t *uuid = key;
8181 uint64_t uuid_128[2];
8186 bt_uuid_to_uuid128(uuid, (bt_uuid_t *)uuid_128);
8188 return g_int64_hash(uuid_128) ^ g_int64_hash(uuid_128+1);
8191 static gboolean bt_uuid_equal(gconstpointer v1, gconstpointer v2)
8193 const bt_uuid_t *uuid1 = v1;
8194 const bt_uuid_t *uuid2 = v2;
8196 if (!uuid1 || !uuid2)
8197 return !uuid1 && !uuid2;
8199 return bt_uuid_cmp(uuid1, uuid2) == 0;
8202 bool btd_adapter_set_allowed_uuids(struct btd_adapter *adapter,
8203 struct queue *uuids)
8208 if (adapter->allowed_uuid_set)
8209 g_hash_table_destroy(adapter->allowed_uuid_set);
8211 adapter->allowed_uuid_set = g_hash_table_new(bt_uuid_hash,
8213 if (!adapter->allowed_uuid_set) {
8214 btd_error(adapter->dev_id,
8215 "Failed to allocate allowed_uuid_set");
8219 queue_foreach(uuids, add_uuid_to_uuid_set, adapter->allowed_uuid_set);
8220 g_slist_foreach(adapter->devices, update_device_allowed_services, NULL);
8225 bool btd_adapter_is_uuid_allowed(struct btd_adapter *adapter,
8226 const char *uuid_str)
8230 if (!adapter || !adapter->allowed_uuid_set)
8233 if (bt_string_to_uuid(&uuid, uuid_str)) {
8234 btd_error(adapter->dev_id,
8235 "Failed to parse UUID string '%s'", uuid_str);
8239 return !g_hash_table_size(adapter->allowed_uuid_set) ||
8240 g_hash_table_contains(adapter->allowed_uuid_set, &uuid);
8243 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
8244 static DBusMessage *adapter_unpair_device(DBusConnection *conn,
8245 DBusMessage *msg, void *user_data)
8248 struct btd_adapter *adapter = user_data;
8249 struct btd_device *device;
8253 if (dbus_message_get_args(msg, NULL, DBUS_TYPE_OBJECT_PATH, &path,
8254 DBUS_TYPE_INVALID) == FALSE)
8255 return btd_error_invalid_args(msg);
8257 list = g_slist_find_custom(adapter->devices, path, device_path_cmp);
8259 return btd_error_does_not_exist(msg);
8261 if (!(adapter->current_settings & MGMT_SETTING_POWERED))
8262 return btd_error_not_ready(msg);
8264 device = list->data;
8266 btd_device_set_temporary(device, TRUE);
8268 if (!btd_device_is_connected(device)) {
8269 btd_adapter_unpair_device(adapter, device);
8270 return dbus_message_new_method_return(msg);
8273 device_request_disconnect(device, msg);
8279 static DBusMessage *create_device(DBusConnection *conn,
8280 DBusMessage *msg, void *data)
8282 struct btd_adapter *adapter = data;
8283 const gchar *address;
8287 if (dbus_message_get_args(msg, NULL, DBUS_TYPE_STRING, &address,
8288 DBUS_TYPE_INVALID) == FALSE)
8289 return btd_error_invalid_args(msg);
8291 if (bachk(address) < 0)
8292 return btd_error_invalid_args(msg);
8296 str2ba(address, &addr);
8297 btd_adapter_get_device(adapter, &addr, BDADDR_BREDR);
8300 return dbus_message_new_method_return(msg);
8303 static DBusMessage *find_device(DBusConnection *conn, DBusMessage *msg,
8306 struct btd_adapter *adapter = data;
8307 struct btd_device *device;
8309 const gchar *address;
8311 const gchar *dev_path;
8313 if (!dbus_message_get_args(msg, NULL, DBUS_TYPE_STRING, &address,
8315 return btd_error_invalid_args(msg);
8317 l = g_slist_find_custom(adapter->devices, address, device_rpa_cmp);
8319 l = g_slist_find_custom(adapter->devices, address,
8320 device_address_cmp);
8322 return btd_error_does_not_exist(msg);
8326 reply = dbus_message_new_method_return(msg);
8330 dev_path = device_get_path(device);
8332 dbus_message_append_args(reply,
8333 DBUS_TYPE_OBJECT_PATH, &dev_path,
8339 static gboolean adapter_ipsp_connected(struct btd_adapter *adapter)
8343 DBG("%s", adapter->path);
8345 for (l = adapter->connections; l != NULL; l = next) {
8346 struct btd_device *dev = l->data;
8348 next = g_slist_next(l);
8350 if (device_is_ipsp_connected(dev))
8357 static void adapter_set_ipsp_init_state(struct btd_adapter *adapter, gboolean initialized)
8359 if (adapter->ipsp_intialized == initialized)
8362 adapter->ipsp_intialized = initialized;
8364 g_dbus_emit_property_changed(dbus_conn, adapter->path,
8365 ADAPTER_INTERFACE, "IpspInitStateChanged");
8368 static void deinitialize_6lowpan_complete(uint8_t status, uint16_t length,
8369 const void *param, void *user_data)
8371 struct btd_adapter *adapter = user_data;
8372 bool initialized = FALSE;
8374 if (status != MGMT_STATUS_SUCCESS)
8375 error("De-Initialize BT 6lowpan failed for hci%u: %s (0x%02x)",
8376 adapter->dev_id, mgmt_errstr(status), status);
8378 adapter_set_ipsp_init_state(adapter, initialized);
8379 DBG("De-Initialize BT 6lowpan successfully for hci%u",
8384 static bool deinitialize_6lowpan(struct btd_adapter *adapter)
8386 struct mgmt_cp_enable_6lowpan cp;
8388 memset(&cp, 0, sizeof(cp));
8390 cp.enable_6lowpan = DEINIT_6LOWPAN;
8391 if (mgmt_send(adapter->mgmt, MGMT_OP_ENABLE_6LOWPAN,
8392 adapter->dev_id, sizeof(cp), &cp,
8393 deinitialize_6lowpan_complete, adapter, NULL) > 0)
8396 error("Failed to de-initialize BT 6Lowpan for index %u",
8401 static void initialize_6lowpan_complete(uint8_t status, uint16_t length,
8402 const void *param, void *user_data)
8404 struct btd_adapter *adapter = user_data;
8405 bool initialized = TRUE;
8407 if (status != MGMT_STATUS_SUCCESS)
8408 error("Initialize BT 6lowpan failed for hci%u: %s (0x%02x)",
8409 adapter->dev_id, mgmt_errstr(status), status);
8411 adapter_set_ipsp_init_state(adapter, initialized);
8412 DBG("Initialize BT 6lowpan successfully for hci%u",
8417 static bool initialize_6lowpan(struct btd_adapter *adapter)
8419 struct mgmt_cp_enable_6lowpan cp;
8421 memset(&cp, 0, sizeof(cp));
8423 cp.enable_6lowpan = INIT_6LOWPAN;
8424 if (mgmt_send(adapter->mgmt, MGMT_OP_ENABLE_6LOWPAN,
8425 adapter->dev_id, sizeof(cp), &cp,
8426 initialize_6lowpan_complete, adapter, NULL) > 0)
8429 error("Failed to initialize BT 6Lowpan for index %u",
8434 static DBusMessage *adapter_initialize_ipsp(DBusConnection *conn,
8435 DBusMessage *msg, void *data)
8437 struct btd_adapter *adapter = data;
8440 DBG("Initialize IPSP");
8442 if (!(adapter->current_settings & MGMT_SETTING_POWERED))
8443 return btd_error_not_ready(msg);
8445 if (adapter->ipsp_intialized)
8446 return btd_error_already_exists(msg);
8448 /* Enable BT 6lowpan in kernel */
8449 err = initialize_6lowpan(adapter);
8452 return btd_error_failed(msg, "Failed to initialize BT 6lowpan");
8454 return dbus_message_new_method_return(msg);
8457 static DBusMessage *adapter_deinitialize_ipsp(DBusConnection *conn,
8458 DBusMessage *msg, void *data)
8460 struct btd_adapter *adapter = data;
8463 DBG("De-initialize IPSP");
8465 if (!(adapter->current_settings & MGMT_SETTING_POWERED))
8466 return btd_error_not_ready(msg);
8468 if (!adapter->ipsp_intialized)
8469 return btd_error_not_permitted(msg, "IPSP not initialized");
8471 if (adapter_ipsp_connected(adapter))
8472 return btd_error_not_permitted(msg, "IPSP Client device found connected");
8474 /* Disable BT 6lowpan in kernel */
8475 err = deinitialize_6lowpan(adapter);
8478 return btd_error_failed(msg, "Failed to deinitialize BT 6lowpan");
8480 return dbus_message_new_method_return(msg);
8484 static const GDBusMethodTable adapter_methods[] = {
8485 { GDBUS_ASYNC_METHOD("StartDiscovery", NULL, NULL, start_discovery) },
8486 { GDBUS_METHOD("SetDiscoveryFilter",
8487 GDBUS_ARGS({ "properties", "a{sv}" }), NULL,
8488 set_discovery_filter) },
8489 { GDBUS_ASYNC_METHOD("StopDiscovery", NULL, NULL, stop_discovery) },
8490 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
8491 { GDBUS_METHOD("GetPSML2capLE",
8492 GDBUS_ARGS({ "path", "o"}),
8493 GDBUS_ARGS({ "psm", "i" }),
8494 adapter_get_psm_l2cap_le) },
8495 { GDBUS_METHOD("ListenL2capLESocket",
8496 GDBUS_ARGS({ "path", "o"}, { "psm", "i" }, { "options", "a{sv}" }),
8497 NULL, adapter_listen_l2cap_le_socket) },
8498 { GDBUS_METHOD("RemoveL2capLESocket", GDBUS_ARGS({ "path", "o" }),
8499 NULL, adapter_remove_l2cap_le_socket) },
8500 { GDBUS_METHOD("StartCustomDiscovery",
8501 GDBUS_ARGS({ "type", "s" }), NULL,
8502 adapter_start_custom_discovery) },
8503 { GDBUS_METHOD("StartLEDiscovery", NULL, NULL,
8504 adapter_start_le_discovery) },
8505 { GDBUS_ASYNC_METHOD("StopLEDiscovery", NULL, NULL,
8506 adapter_stop_le_discovery) },
8507 { GDBUS_METHOD("SetAdvertising",
8508 GDBUS_ARGS({ "enable", "b" },
8509 { "slot_id", "i" }), NULL,
8510 adapter_set_advertising) },
8511 { GDBUS_METHOD("SetAdvertisingParameters",
8512 GDBUS_ARGS({ "interval_min", "u" },
8513 { "interval_max", "u" },
8514 { "filter_policy", "u" },
8516 { "tx_power_level", "i" },
8517 { "slot_id", "i" }), NULL,
8518 adapter_set_advertising_params) },
8519 { GDBUS_METHOD("SetAdvertisingData",
8520 GDBUS_ARGS({ "value", "ay" },
8521 { "slot_id", "i" }), NULL,
8522 adapter_set_advertising_data) },
8523 { GDBUS_METHOD("SetScanParameters",
8524 GDBUS_ARGS({ "type", "u" },
8525 { "interval", "u" },
8526 { "window", "u" }), NULL,
8527 adapter_le_set_scan_params) },
8528 { GDBUS_METHOD("GetLocalIrk",
8530 GDBUS_ARGS({ "value", "ay" }),
8531 adapter_get_local_irk) },
8532 { GDBUS_ASYNC_METHOD("scan_filter_param_setup",
8533 GDBUS_ARGS({ "client_if", "i" }, { "action", "i" },
8534 { "filt_index", "i" }, { "feat_seln", "i"},
8535 { "list_logic_type", "i" }, { "filt_logic_type", "i"},
8536 { "rssi_high_thres", "i" }, { "rssi_low_thres", "i"},
8537 { "dely_mode", "i" }, { "found_timeout", "i"},
8538 { "lost_timeout", "i" }, { "found_timeout_cnt", "i"}), NULL,
8539 adapter_le_scan_filter_param_setup) },
8540 { GDBUS_ASYNC_METHOD("scan_filter_add_remove",
8541 GDBUS_ARGS({ "client_if", "i" }, { "action", "i" },
8542 { "filt_type", "i" }, { "filt_index", "i"},
8543 { "company_id", "i" }, { "company_id_mask", "i"},
8544 { "p_uuid", "ay" }, { "p_uuid_mask", "ay" },
8545 { "string", "s" }, { "address_type", "u" },
8546 /*{ "data_len", "i" },*/ { "p_data", "ay" },
8547 /*{ "mask_len", "i" },*/ { "p_mask", "ay" }), NULL,
8548 adapter_le_scan_filter_add_remove) },
8549 { GDBUS_ASYNC_METHOD("scan_filter_clear",
8550 GDBUS_ARGS({ "client_if", "i" }, { "filt_index", "i" }), NULL,
8551 adapter_le_scan_filter_clear) },
8552 { GDBUS_ASYNC_METHOD("scan_filter_enable",
8553 GDBUS_ARGS({ "client_if", "i" }, { "enable", "b" }), NULL,
8554 adapter_le_scan_filter_enable) },
8555 { GDBUS_METHOD("InitializeIpsp",
8557 adapter_initialize_ipsp) },
8558 { GDBUS_METHOD("DeinitializeIpsp",
8560 adapter_deinitialize_ipsp) },
8561 { GDBUS_METHOD("SetScanRespData",
8562 GDBUS_ARGS({ "value", "ay" },
8563 { "slot_id", "i" }), NULL,
8564 adapter_set_scan_rsp_data) },
8565 { GDBUS_METHOD("AddDeviceWhiteList",
8566 GDBUS_ARGS({ "address", "s" },
8567 { "address_type", "u" }), NULL,
8568 adapter_add_device_white_list) },
8569 { GDBUS_METHOD("RemoveDeviceWhiteList",
8570 GDBUS_ARGS({ "address", "s" },
8571 { "address_type", "u" }), NULL,
8572 adapter_remove_device_white_list) },
8573 { GDBUS_METHOD("ClearDeviceWhiteList",
8575 adapter_clear_device_white_list) },
8576 { GDBUS_METHOD("SetLePrivacy",
8577 GDBUS_ARGS({ "enable", "b" }), NULL,
8578 adapter_set_le_privacy) },
8579 { GDBUS_METHOD("SetLeStaticRandomAddress",
8580 GDBUS_ARGS({ "enable", "b" }), NULL,
8581 adapter_set_le_static_address) },
8582 { GDBUS_ASYNC_METHOD("EnableRssi",
8583 GDBUS_ARGS({ "bt_address", "s" },
8584 { "link_type", "i" },
8586 { "in_range_th", "i" },
8589 adapter_enable_rssi) },
8590 { GDBUS_ASYNC_METHOD("GetRssiStrength",
8591 GDBUS_ARGS({ "bt_address", "s" }, { "link_type", "i" }),
8593 adapter_get_rssi) },
8594 { GDBUS_ASYNC_METHOD("UnpairDevice",
8595 GDBUS_ARGS({ "device", "o" }), NULL, adapter_unpair_device) },
8596 { GDBUS_METHOD("FindDevice",
8597 GDBUS_ARGS({ "address", "s" }),
8598 GDBUS_ARGS({ "device", "o" }),
8600 { GDBUS_METHOD("SetWbsParameters",
8601 GDBUS_ARGS({ "role", "s" }, { "bt_address", "s" }),
8603 set_wbs_parameters) },
8604 { GDBUS_METHOD("SetNbParameters",
8605 GDBUS_ARGS({ "role", "s" }, { "bt_address", "s" }),
8607 set_nb_parameters) },
8608 { GDBUS_METHOD("SetManufacturerData",
8609 GDBUS_ARGS({ "value", "ay" }), NULL,
8610 adapter_set_manufacturer_data) },
8611 { GDBUS_ASYNC_METHOD("CreateDevice",
8612 GDBUS_ARGS({ "address", "s" }), NULL,
8614 { GDBUS_METHOD("GetEnergyInfo",
8616 GDBUS_ARGS({ "tx_time", "u" },
8618 { "idle_time", "u" },
8619 { "energy_used", "u" }),
8620 adapter_get_energy_info) },
8622 { GDBUS_ASYNC_METHOD("RemoveDevice",
8623 GDBUS_ARGS({ "device", "o" }), NULL, remove_device) },
8624 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
8625 { GDBUS_ASYNC_METHOD("LEReadMaximumDataLength", NULL,
8626 GDBUS_ARGS({"maxTxOctets", "q" }, { "maxTxTime", "q" },
8627 {"maxRxOctets", "q" }, { "maxRxTime", "q" }),
8628 le_read_maximum_data_length)},
8629 { GDBUS_ASYNC_METHOD("LEWriteHostSuggestedDataLength",
8630 GDBUS_ARGS({"def_tx_octets", "q" }, { "def_tx_time", "q" }), NULL,
8631 le_write_host_suggested_default_data_length)},
8632 { GDBUS_ASYNC_METHOD("LEReadHostSuggestedDataLength", NULL,
8633 GDBUS_ARGS({"def_tx_octets", "q" }, { "def_tx_time", "q" }),
8634 le_read_host_suggested_default_data_length)},
8635 { GDBUS_ASYNC_METHOD("GetLeBatchingAvailablePkts",
8637 GDBUS_ARGS({ "AvailablePkts", "u" }),
8638 adapter_get_le_batching_available_pkts) },
8639 { GDBUS_ASYNC_METHOD("EnableLeBatching",
8640 GDBUS_ARGS({ "bt_address", "s" },
8641 { "packet_threshold", "i" },
8644 adapter_enable_le_batching) },
8645 { GDBUS_ASYNC_METHOD("DisableLeBatching",
8646 GDBUS_ARGS({ "bt_address", "s" }),
8648 adapter_disable_le_batching) },
8650 { GDBUS_METHOD("GetDiscoveryFilters", NULL,
8651 GDBUS_ARGS({ "filters", "as" }),
8652 get_discovery_filters) },
8653 { GDBUS_EXPERIMENTAL_ASYNC_METHOD("ConnectDevice",
8654 GDBUS_ARGS({ "properties", "a{sv}" }), NULL,
8659 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
8660 static const GDBusSignalTable adapter_signals[] = {
8661 { GDBUS_SIGNAL("AdvertisingEnabled",
8662 GDBUS_ARGS({ "slot_id", "i" },
8663 { "enabled", "b"})) },
8664 { GDBUS_SIGNAL("RssiEnabled",
8665 GDBUS_ARGS({"address","s"},
8666 { "link_type", "i" },
8667 { "enabled", "b"})) },
8668 { GDBUS_SIGNAL("RssiAlert",
8669 GDBUS_ARGS({"address","s"},
8670 { "link_type", "i" },
8671 { "alert_type", "i" },
8672 { "rssi_dbm", "i"})) },
8673 { GDBUS_SIGNAL("RawRssi",
8674 GDBUS_ARGS({"address","s"},
8675 { "link_type", "i" },
8676 { "rssi_dbm", "i"})) },
8677 { GDBUS_SIGNAL("HardwareError", NULL) },
8678 { GDBUS_SIGNAL("TxTimeoutError", NULL) },
8683 static const GDBusPropertyTable adapter_properties[] = {
8684 { "Address", "s", property_get_address },
8685 { "AddressType", "s", property_get_address_type },
8686 { "Name", "s", property_get_name },
8687 { "Alias", "s", property_get_alias, property_set_alias },
8688 { "Class", "u", property_get_class },
8689 { "Powered", "b", property_get_powered, property_set_powered },
8690 { "PowerState", "s", property_get_power_state, NULL, NULL,
8691 G_DBUS_PROPERTY_FLAG_EXPERIMENTAL },
8692 { "Discoverable", "b", property_get_discoverable,
8693 property_set_discoverable },
8694 { "DiscoverableTimeout", "u", property_get_discoverable_timeout,
8695 property_set_discoverable_timeout },
8696 { "Pairable", "b", property_get_pairable, property_set_pairable },
8697 { "PairableTimeout", "u", property_get_pairable_timeout,
8698 property_set_pairable_timeout },
8699 { "Discovering", "b", property_get_discovering },
8700 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
8701 { "LEDiscovering", "b", property_get_le_discovering },
8703 { "UUIDs", "as", property_get_uuids },
8704 { "Modalias", "s", property_get_modalias, NULL,
8705 property_exists_modalias },
8706 { "Roles", "as", property_get_roles },
8707 { "ExperimentalFeatures", "as", property_get_experimental, NULL,
8708 property_experimental_exists },
8709 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
8710 { "Connectable", "b", property_get_connectable,
8711 property_set_connectable },
8712 { "Version", "s", property_get_version },
8713 { "SupportedLEFeatures", "as", property_get_supported_le_features},
8714 { "IpspInitStateChanged", "b", property_get_ipsp_init_state},
8715 { "LEAddress", "as", property_get_le_address },
8716 { "A2dpRole", "u", property_get_a2dp_role },
8722 static int str2buf(const char *str, uint8_t *buf, size_t blen)
8729 memset(buf, 0, blen);
8731 dlen = MIN((strlen(str) / 2), blen);
8733 for (i = 0; i < dlen; i++)
8734 sscanf(str + (i * 2), "%02hhX", &buf[i]);
8739 static bool is_blocked_key(uint8_t key_type, uint8_t *key_value)
8743 for (i = 0; i < ARRAY_SIZE(blocked_keys); ++i) {
8744 if (key_type == blocked_keys[i].type &&
8745 !memcmp(blocked_keys[i].val, key_value,
8746 sizeof(blocked_keys[i].val)))
8753 static struct link_key_info *get_key_info(GKeyFile *key_file, const char *peer)
8755 struct link_key_info *info = NULL;
8758 str = g_key_file_get_string(key_file, "LinkKey", "Key", NULL);
8759 if (!str || strlen(str) < 32)
8762 info = g_new0(struct link_key_info, 1);
8764 str2ba(peer, &info->bdaddr);
8766 if (!strncmp(str, "0x", 2))
8767 str2buf(&str[2], info->key, sizeof(info->key));
8769 str2buf(&str[0], info->key, sizeof(info->key));
8771 info->type = g_key_file_get_integer(key_file, "LinkKey", "Type", NULL);
8772 info->pin_len = g_key_file_get_integer(key_file, "LinkKey", "PINLength",
8775 info->is_blocked = is_blocked_key(HCI_BLOCKED_KEY_TYPE_LINKKEY,
8784 static struct smp_ltk_info *get_ltk(GKeyFile *key_file, const char *peer,
8785 uint8_t peer_type, const char *group)
8787 struct smp_ltk_info *ltk = NULL;
8791 key = g_key_file_get_string(key_file, group, "Key", NULL);
8792 if (!key || strlen(key) < 32)
8795 rand = g_key_file_get_string(key_file, group, "Rand", NULL);
8799 ltk = g_new0(struct smp_ltk_info, 1);
8801 /* Default to assuming a central key */
8802 ltk->central = true;
8804 str2ba(peer, <k->bdaddr);
8805 ltk->bdaddr_type = peer_type;
8808 * Long term keys should respond to an identity address which can
8809 * either be a public address or a random static address. Keys
8810 * stored for resolvable random and unresolvable random addresses
8813 * This is an extra sanity check for older kernel versions or older
8814 * daemons that might have been instructed to store long term keys
8815 * for these temporary addresses.
8817 if (ltk->bdaddr_type == BDADDR_LE_RANDOM &&
8818 (ltk->bdaddr.b[5] & 0xc0) != 0xc0) {
8824 if (!strncmp(key, "0x", 2))
8825 str2buf(&key[2], ltk->val, sizeof(ltk->val));
8827 str2buf(&key[0], ltk->val, sizeof(ltk->val));
8829 if (!strncmp(rand, "0x", 2)) {
8831 str2buf(&rand[2], (uint8_t *) &rand_le, sizeof(rand_le));
8832 ltk->rand = le64_to_cpu(rand_le);
8834 sscanf(rand, "%" PRIu64, <k->rand);
8837 ltk->authenticated = g_key_file_get_integer(key_file, group,
8838 "Authenticated", NULL);
8839 ltk->enc_size = g_key_file_get_integer(key_file, group, "EncSize",
8841 ltk->ediv = g_key_file_get_integer(key_file, group, "EDiv", NULL);
8843 ltk->is_blocked = is_blocked_key(HCI_BLOCKED_KEY_TYPE_LTK,
8853 static struct smp_ltk_info *get_ltk_info(GKeyFile *key_file, const char *peer,
8854 uint8_t bdaddr_type)
8858 return get_ltk(key_file, peer, bdaddr_type, "LongTermKey");
8861 static struct smp_ltk_info *get_peripheral_ltk_info(GKeyFile *key_file,
8863 uint8_t bdaddr_type)
8865 struct smp_ltk_info *ltk;
8869 /* Peripheral* is the proper term, but for now read both entries
8870 * so it won't break when user up/downgrades. Remove the other
8871 * term after a few releases.
8873 ltk = get_ltk(key_file, peer, bdaddr_type, "PeripheralLongTermKey");
8875 ltk = get_ltk(key_file, peer, bdaddr_type, "SlaveLongTermKey");
8878 ltk->central = false;
8883 static struct irk_info *get_irk_info(GKeyFile *key_file, const char *peer,
8884 uint8_t bdaddr_type)
8886 struct irk_info *irk = NULL;
8889 str = g_key_file_get_string(key_file, "IdentityResolvingKey", "Key", NULL);
8890 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
8893 if (strlen(str) < 32) {
8898 if (!str || strlen(str) < 32)
8902 irk = g_new0(struct irk_info, 1);
8904 str2ba(peer, &irk->bdaddr);
8905 irk->bdaddr_type = bdaddr_type;
8907 if (!strncmp(str, "0x", 2))
8908 str2buf(&str[2], irk->val, sizeof(irk->val));
8910 str2buf(&str[0], irk->val, sizeof(irk->val));
8912 irk->is_blocked = is_blocked_key(HCI_BLOCKED_KEY_TYPE_LINKKEY,
8915 #ifndef TIZEN_FEATURE_BLUEZ_MODIFY
8923 static struct conn_param *get_conn_param(GKeyFile *key_file, const char *peer,
8924 uint8_t bdaddr_type)
8926 struct conn_param *param;
8928 if (!g_key_file_has_group(key_file, "ConnectionParameters"))
8931 param = g_new0(struct conn_param, 1);
8933 param->min_interval = g_key_file_get_integer(key_file,
8934 "ConnectionParameters",
8935 "MinInterval", NULL);
8936 param->max_interval = g_key_file_get_integer(key_file,
8937 "ConnectionParameters",
8938 "MaxInterval", NULL);
8939 param->latency = g_key_file_get_integer(key_file,
8940 "ConnectionParameters",
8942 param->timeout = g_key_file_get_integer(key_file,
8943 "ConnectionParameters",
8945 str2ba(peer, ¶m->bdaddr);
8946 param->bdaddr_type = bdaddr_type;
8952 static int generate_and_write_irk(uint8_t *irk, GKeyFile *key_file,
8953 const char *filename)
8955 struct bt_crypto *crypto;
8956 char str_irk_out[33];
8958 GError *gerr = NULL;
8962 crypto = bt_crypto_new();
8964 error("Failed to open crypto");
8968 if (!bt_crypto_random_bytes(crypto, irk, 16)) {
8969 error("Failed to generate IRK");
8970 bt_crypto_unref(crypto);
8974 bt_crypto_unref(crypto);
8976 for (i = 0; i < 16; i++)
8977 sprintf(str_irk_out + (i * 2), "%02x", irk[i]);
8979 str_irk_out[32] = '\0';
8980 info("Generated IRK successfully");
8982 g_key_file_set_string(key_file, "General", "IdentityResolvingKey",
8984 create_file(filename, S_IRUSR | S_IWUSR);
8985 str = g_key_file_to_data(key_file, &length, NULL);
8986 if (!g_file_set_contents(filename, str, length, &gerr)) {
8987 error("Unable set contents for %s: (%s)", filename,
8992 DBG("Generated IRK written to file");
8996 static int load_irk(struct btd_adapter *adapter, uint8_t *irk)
8998 char filename[PATH_MAX];
9000 GError *gerr = NULL;
9004 create_filename(filename, PATH_MAX, "/%s/identity",
9005 btd_adapter_get_storage_dir(adapter));
9007 key_file = g_key_file_new();
9008 if (!g_key_file_load_from_file(key_file, filename, 0, &gerr)) {
9009 error("Unable to load key file from %s: (%s)", filename,
9014 str_irk = g_key_file_get_string(key_file, "General",
9015 "IdentityResolvingKey", NULL);
9017 info("No IRK stored");
9018 ret = generate_and_write_irk(irk, key_file, filename);
9019 g_key_file_free(key_file);
9023 g_key_file_free(key_file);
9025 if (strlen(str_irk) != 32 || str2buf(str_irk, irk, 16)) {
9026 /* TODO re-create new IRK here? */
9027 error("Invalid IRK format, disabling privacy");
9033 DBG("Successfully read IRK from file");
9037 static void set_privacy_complete(uint8_t status, uint16_t length,
9038 const void *param, void *user_data)
9040 struct btd_adapter *adapter = user_data;
9042 if (status != MGMT_STATUS_SUCCESS) {
9043 btd_error(adapter->dev_id, "Failed to set privacy: %s (0x%02x)",
9044 mgmt_errstr(status), status);
9048 DBG("Successfuly set privacy for index %u", adapter->dev_id);
9051 static int set_privacy(struct btd_adapter *adapter, uint8_t privacy)
9053 struct mgmt_cp_set_privacy cp;
9055 memset(&cp, 0, sizeof(cp));
9060 if (load_irk(adapter, irk) == 0) {
9061 cp.privacy = privacy;
9062 memcpy(cp.irk, irk, 16);
9066 DBG("sending set privacy command for index %u", adapter->dev_id);
9067 DBG("setting privacy mode 0x%02x for index %u", cp.privacy,
9070 if (mgmt_send(adapter->mgmt, MGMT_OP_SET_PRIVACY,
9071 adapter->dev_id, sizeof(cp), &cp,
9072 set_privacy_complete, adapter, NULL) > 0)
9075 btd_error(adapter->dev_id, "Failed to set privacy for index %u",
9082 static void load_link_keys_complete(uint8_t status, uint16_t length,
9083 const void *param, void *user_data)
9085 struct btd_adapter *adapter = user_data;
9087 if (status != MGMT_STATUS_SUCCESS) {
9088 btd_error(adapter->dev_id,
9089 "Failed to load link keys for hci%u: %s (0x%02x)",
9090 adapter->dev_id, mgmt_errstr(status), status);
9094 DBG("link keys loaded for hci%u", adapter->dev_id);
9097 static void load_link_keys(struct btd_adapter *adapter, GSList *keys,
9100 struct mgmt_cp_load_link_keys *cp;
9101 struct mgmt_link_key_info *key;
9102 size_t key_count, cp_size;
9107 * If the controller does not support BR/EDR operation,
9108 * there is no point in trying to load the link keys into
9111 * This is an optimization for Low Energy only controllers.
9113 if (!(adapter->supported_settings & MGMT_SETTING_BREDR))
9116 key_count = g_slist_length(keys);
9118 DBG("hci%u keys %zu debug_keys %d", adapter->dev_id, key_count,
9121 cp_size = sizeof(*cp) + (key_count * sizeof(*key));
9123 cp = g_try_malloc0(cp_size);
9125 btd_error(adapter->dev_id, "No memory for link keys for hci%u",
9131 * Even if the list of stored keys is empty, it is important to
9132 * load an empty list into the kernel. That way it is ensured
9133 * that no old keys from a previous daemon are present.
9135 * In addition it is also the only way to toggle the different
9136 * behavior for debug keys.
9138 cp->debug_keys = debug_keys;
9139 cp->key_count = htobs(key_count);
9141 for (l = keys, key = cp->keys; l != NULL; l = g_slist_next(l), key++) {
9142 struct link_key_info *info = l->data;
9144 bacpy(&key->addr.bdaddr, &info->bdaddr);
9145 key->addr.type = BDADDR_BREDR;
9146 key->type = info->type;
9147 memcpy(key->val, info->key, 16);
9148 key->pin_len = info->pin_len;
9151 id = mgmt_send(adapter->mgmt, MGMT_OP_LOAD_LINK_KEYS,
9152 adapter->dev_id, cp_size, cp,
9153 load_link_keys_complete, adapter, NULL);
9158 btd_error(adapter->dev_id, "Failed to load link keys for hci%u",
9162 static void load_ltks_complete(uint8_t status, uint16_t length,
9163 const void *param, void *user_data)
9165 struct btd_adapter *adapter = user_data;
9167 if (status != MGMT_STATUS_SUCCESS) {
9168 btd_error(adapter->dev_id,
9169 "Failed to load LTKs for hci%u: %s (0x%02x)",
9170 adapter->dev_id, mgmt_errstr(status), status);
9173 DBG("LTKs loaded for hci%u", adapter->dev_id);
9176 static void load_ltks(struct btd_adapter *adapter, GSList *keys)
9178 struct mgmt_cp_load_long_term_keys *cp;
9179 struct mgmt_ltk_info *key;
9180 size_t key_count, max_key_count, cp_size;
9185 * If the controller does not support Low Energy operation,
9186 * there is no point in trying to load the long term keys
9189 * While there is no harm in loading keys into the kernel,
9190 * this is an optimization to avoid a confusing warning
9191 * message when the loading of the keys timed out due to
9192 * a kernel bug (see comment below).
9194 if (!(adapter->supported_settings & MGMT_SETTING_LE))
9197 key_count = g_slist_length(keys);
9198 mtu = mgmt_get_mtu(adapter->mgmt);
9199 max_key_count = (mtu - sizeof(*cp)) / sizeof(*key);
9200 key_count = MIN(max_key_count, key_count);
9202 DBG("hci%u keys %zu", adapter->dev_id, key_count);
9204 cp_size = sizeof(*cp) + (key_count * sizeof(*key));
9206 cp = g_try_malloc0(cp_size);
9208 btd_error(adapter->dev_id, "No memory for LTKs for hci%u",
9214 * Even if the list of stored keys is empty, it is important to
9215 * load an empty list into the kernel. That way it is ensured
9216 * that no old keys from a previous daemon are present.
9218 cp->key_count = htobs(key_count);
9220 for (l = keys, key = cp->keys; l && key_count;
9221 l = g_slist_next(l), key++, key_count--) {
9222 struct smp_ltk_info *info = l->data;
9223 struct btd_device *dev;
9225 bacpy(&key->addr.bdaddr, &info->bdaddr);
9226 key->addr.type = info->bdaddr_type;
9227 memcpy(key->val, info->val, sizeof(info->val));
9228 key->rand = cpu_to_le64(info->rand);
9229 key->ediv = cpu_to_le16(info->ediv);
9230 key->type = info->authenticated;
9231 key->central = info->central;
9232 key->enc_size = info->enc_size;
9234 /* Mark device as paired as their LTKs can be loaded. */
9235 dev = btd_adapter_find_device(adapter, &info->bdaddr,
9238 device_set_paired(dev, info->bdaddr_type);
9239 device_set_bonded(dev, info->bdaddr_type);
9240 device_set_ltk(dev, info->val, info->central,
9246 * This timeout handling is needed since the kernel is stupid
9247 * and forgets to send a command complete response. However in
9248 * case of failures it does send a command status.
9250 if (!mgmt_send_timeout(adapter->mgmt, MGMT_OP_LOAD_LONG_TERM_KEYS,
9251 adapter->dev_id, cp_size, cp, load_ltks_complete,
9253 btd_error(adapter->dev_id, "Failed to load LTKs for hci%u",
9259 static void load_irks_complete(uint8_t status, uint16_t length,
9260 const void *param, void *user_data)
9262 struct btd_adapter *adapter = user_data;
9264 if (status == MGMT_STATUS_UNKNOWN_COMMAND) {
9265 btd_info(adapter->dev_id,
9266 "Load IRKs failed: Kernel doesn't support LE Privacy");
9270 if (status != MGMT_STATUS_SUCCESS) {
9271 btd_error(adapter->dev_id,
9272 "Failed to load IRKs for hci%u: %s (0x%02x)",
9273 adapter->dev_id, mgmt_errstr(status), status);
9277 DBG("IRKs loaded for hci%u", adapter->dev_id);
9280 static void load_irks(struct btd_adapter *adapter, GSList *irks)
9282 struct mgmt_cp_load_irks *cp;
9283 struct mgmt_irk_info *irk;
9284 size_t irk_count, cp_size;
9289 * If the controller does not support LE Privacy operation,
9290 * there is no support for loading identity resolving keys
9293 if (!(adapter->supported_settings & MGMT_SETTING_PRIVACY))
9296 irk_count = g_slist_length(irks);
9298 DBG("hci%u irks %zu", adapter->dev_id, irk_count);
9300 cp_size = sizeof(*cp) + (irk_count * sizeof(*irk));
9302 cp = g_try_malloc0(cp_size);
9304 btd_error(adapter->dev_id, "No memory for IRKs for hci%u",
9310 * Even if the list of stored keys is empty, it is important to
9311 * load an empty list into the kernel. That way we tell the
9312 * kernel that we are able to handle New IRK events.
9314 cp->irk_count = htobs(irk_count);
9316 for (l = irks, irk = cp->irks; l != NULL; l = g_slist_next(l), irk++) {
9317 struct irk_info *info = l->data;
9319 bacpy(&irk->addr.bdaddr, &info->bdaddr);
9320 irk->addr.type = info->bdaddr_type;
9321 memcpy(irk->val, info->val, sizeof(irk->val));
9324 id = mgmt_send(adapter->mgmt, MGMT_OP_LOAD_IRKS, adapter->dev_id,
9325 cp_size, cp, load_irks_complete, adapter, NULL);
9330 btd_error(adapter->dev_id, "Failed to IRKs for hci%u",
9334 static void load_conn_params_complete(uint8_t status, uint16_t length,
9335 const void *param, void *user_data)
9337 struct btd_adapter *adapter = user_data;
9339 if (status != MGMT_STATUS_SUCCESS) {
9340 btd_error(adapter->dev_id,
9341 "hci%u Load Connection Parameters failed: %s (0x%02x)",
9342 adapter->dev_id, mgmt_errstr(status), status);
9346 DBG("Connection Parameters loaded for hci%u", adapter->dev_id);
9349 static void load_conn_params(struct btd_adapter *adapter, GSList *params)
9351 struct mgmt_cp_load_conn_param *cp;
9352 struct mgmt_conn_param *param;
9353 size_t param_count, cp_size;
9358 * If the controller does not support Low Energy operation,
9359 * there is no point in trying to load the connection
9360 * parameters into the kernel.
9362 if (!(adapter->supported_settings & MGMT_SETTING_LE))
9365 param_count = g_slist_length(params);
9367 DBG("hci%u conn params %zu", adapter->dev_id, param_count);
9369 cp_size = sizeof(*cp) + (param_count * sizeof(*param));
9371 cp = g_try_malloc0(cp_size);
9373 btd_error(adapter->dev_id,
9374 "Failed to allocate memory for connection parameters");
9378 cp->param_count = htobs(param_count);
9380 for (l = params, param = cp->params; l; l = g_slist_next(l), param++) {
9381 struct conn_param *info = l->data;
9383 bacpy(¶m->addr.bdaddr, &info->bdaddr);
9384 param->addr.type = info->bdaddr_type;
9385 param->min_interval = htobs(info->min_interval);
9386 param->max_interval = htobs(info->max_interval);
9387 param->latency = htobs(info->latency);
9388 param->timeout = htobs(info->timeout);
9391 id = mgmt_send(adapter->mgmt, MGMT_OP_LOAD_CONN_PARAM, adapter->dev_id,
9392 cp_size, cp, load_conn_params_complete, adapter, NULL);
9397 btd_error(adapter->dev_id, "Load connection parameters failed");
9400 static uint8_t get_le_addr_type(GKeyFile *keyfile)
9405 type = g_key_file_get_string(keyfile, "General", "AddressType", NULL);
9407 return BDADDR_LE_PUBLIC;
9409 if (g_str_equal(type, "public"))
9410 addr_type = BDADDR_LE_PUBLIC;
9411 else if (g_str_equal(type, "static"))
9412 addr_type = BDADDR_LE_RANDOM;
9414 addr_type = BDADDR_LE_PUBLIC;
9421 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
9422 static uint8_t get_addr_type(GKeyFile *keyfile)
9426 uint8_t bdaddr_type = BDADDR_BREDR;
9429 /* Load device technology */
9430 techno = g_key_file_get_string_list(keyfile, "General",
9431 "SupportedTechnologies", NULL, NULL);
9435 for (t = techno; *t; t++) {
9436 if (g_str_equal(*t, "LE"))
9441 bdaddr_type = BDADDR_BREDR;
9443 str = g_key_file_get_string(keyfile, "General",
9444 "AddressType", NULL);
9446 if (str && g_str_equal(str, "public"))
9447 bdaddr_type = BDADDR_LE_PUBLIC;
9448 else if (str && g_str_equal(str, "static"))
9449 bdaddr_type = BDADDR_LE_RANDOM;
9451 error("Unknown LE device technology");
9462 static void probe_devices(void *user_data)
9464 struct btd_device *device = user_data;
9466 device_probe_profiles(device, btd_device_get_uuids(device));
9467 device_resolved_drivers(device_get_adapter(device), device);
9470 static bool load_bredr_defaults(struct btd_adapter *adapter,
9471 struct mgmt_tlv_list *list,
9472 struct btd_br_defaults *defaults)
9474 if (btd_opts.mode == BT_MODE_LE)
9477 if (defaults->page_scan_type != 0xFFFF) {
9478 if (!mgmt_tlv_add_fixed(list, 0x0000,
9479 &defaults->page_scan_type))
9483 if (defaults->page_scan_interval) {
9484 if (!mgmt_tlv_add_fixed(list, 0x0001,
9485 &defaults->page_scan_interval))
9489 if (defaults->page_scan_win) {
9490 if (!mgmt_tlv_add_fixed(list, 0x0002,
9491 &defaults->page_scan_win))
9495 if (defaults->scan_type != 0xFFFF) {
9496 if (!mgmt_tlv_add_fixed(list, 0x0003,
9497 &defaults->scan_type))
9501 if (defaults->scan_interval) {
9502 if (!mgmt_tlv_add_fixed(list, 0x0004,
9503 &defaults->scan_interval))
9507 if (defaults->scan_win) {
9508 if (!mgmt_tlv_add_fixed(list, 0x0005,
9509 &defaults->scan_win))
9513 if (defaults->link_supervision_timeout) {
9514 if (!mgmt_tlv_add_fixed(list, 0x0006,
9515 &defaults->link_supervision_timeout))
9519 if (defaults->page_timeout) {
9520 if (!mgmt_tlv_add_fixed(list, 0x0007,
9521 &defaults->page_timeout))
9525 if (defaults->min_sniff_interval) {
9526 if (!mgmt_tlv_add_fixed(list, 0x0008,
9527 &defaults->min_sniff_interval))
9531 if (defaults->max_sniff_interval) {
9532 if (!mgmt_tlv_add_fixed(list, 0x0009,
9533 &defaults->max_sniff_interval))
9540 static bool load_le_defaults(struct btd_adapter *adapter,
9541 struct mgmt_tlv_list *list,
9542 struct btd_le_defaults *defaults)
9544 if (btd_opts.mode == BT_MODE_BREDR)
9547 if (defaults->min_adv_interval) {
9548 if (!mgmt_tlv_add_fixed(list, 0x000a,
9549 &defaults->min_adv_interval))
9553 if (defaults->max_adv_interval) {
9554 if (!mgmt_tlv_add_fixed(list, 0x000b,
9555 &defaults->max_adv_interval))
9559 if (defaults->adv_rotation_interval) {
9560 if (!mgmt_tlv_add_fixed(list, 0x000c,
9561 &defaults->adv_rotation_interval))
9565 if (defaults->scan_interval_autoconnect) {
9566 if (!mgmt_tlv_add_fixed(list, 0x000d,
9567 &defaults->scan_interval_autoconnect))
9571 if (defaults->scan_win_autoconnect) {
9572 if (!mgmt_tlv_add_fixed(list, 0x000e,
9573 &defaults->scan_win_autoconnect))
9577 if (defaults->scan_interval_suspend) {
9578 if (!mgmt_tlv_add_fixed(list, 0x000f,
9579 &defaults->scan_interval_suspend))
9583 if (defaults->scan_win_suspend) {
9584 if (!mgmt_tlv_add_fixed(list, 0x0010,
9585 &defaults->scan_win_suspend))
9589 if (defaults->scan_interval_discovery) {
9590 if (!mgmt_tlv_add_fixed(list, 0x0011,
9591 &defaults->scan_interval_discovery))
9595 if (defaults->scan_win_discovery) {
9596 if (!mgmt_tlv_add_fixed(list, 0x0012,
9597 &defaults->scan_win_discovery))
9601 if (defaults->scan_interval_adv_monitor) {
9602 if (!mgmt_tlv_add_fixed(list, 0x0013,
9603 &defaults->scan_interval_adv_monitor))
9607 if (defaults->scan_win_adv_monitor) {
9608 if (!mgmt_tlv_add_fixed(list, 0x0014,
9609 &defaults->scan_win_adv_monitor))
9613 if (defaults->scan_interval_connect) {
9614 if (!mgmt_tlv_add_fixed(list, 0x0015,
9615 &defaults->scan_interval_connect))
9619 if (defaults->scan_win_connect) {
9620 if (!mgmt_tlv_add_fixed(list, 0x0016,
9621 &defaults->scan_win_connect))
9625 if (defaults->min_conn_interval) {
9626 if (!mgmt_tlv_add_fixed(list, 0x0017,
9627 &defaults->min_conn_interval))
9631 if (defaults->max_conn_interval) {
9632 if (!mgmt_tlv_add_fixed(list, 0x0018,
9633 &defaults->max_conn_interval))
9637 if (defaults->conn_latency) {
9638 if (!mgmt_tlv_add_fixed(list, 0x0019,
9639 &defaults->conn_latency))
9643 if (defaults->conn_lsto) {
9644 if (!mgmt_tlv_add_fixed(list, 0x001a,
9645 &defaults->conn_lsto))
9649 if (defaults->autoconnect_timeout) {
9650 if (!mgmt_tlv_add_fixed(list, 0x001b,
9651 &defaults->autoconnect_timeout))
9655 if (defaults->advmon_allowlist_scan_duration) {
9656 if (!mgmt_tlv_add_fixed(list, 0x001d,
9657 &defaults->advmon_allowlist_scan_duration))
9661 if (defaults->advmon_no_filter_scan_duration) {
9662 if (!mgmt_tlv_add_fixed(list, 0x001e,
9663 &defaults->advmon_no_filter_scan_duration))
9667 if (defaults->enable_advmon_interleave_scan != 0xFF) {
9668 if (!mgmt_tlv_add_fixed(list, 0x001f,
9669 &defaults->enable_advmon_interleave_scan))
9676 static void load_defaults(struct btd_adapter *adapter)
9678 struct mgmt_tlv_list *list;
9679 unsigned int err = 0;
9681 if (!btd_opts.defaults.num_entries ||
9682 !btd_has_kernel_features(KERNEL_SET_SYSTEM_CONFIG))
9685 list = mgmt_tlv_list_new();
9687 if (!load_bredr_defaults(adapter, list, &btd_opts.defaults.br))
9690 if (!load_le_defaults(adapter, list, &btd_opts.defaults.le))
9693 err = mgmt_send_tlv(adapter->mgmt, MGMT_OP_SET_DEF_SYSTEM_CONFIG,
9694 adapter->dev_id, list, NULL, NULL, NULL);
9698 btd_error(adapter->dev_id,
9699 "Failed to set default system config for hci%u",
9702 mgmt_tlv_list_free(list);
9705 static void load_devices(struct btd_adapter *adapter)
9707 char dirname[PATH_MAX];
9708 GSList *keys = NULL;
9709 GSList *ltks = NULL;
9710 GSList *irks = NULL;
9711 GSList *params = NULL;
9712 GSList *added_devices = NULL;
9713 GError *gerr = NULL;
9715 struct dirent *entry;
9717 create_filename(dirname, PATH_MAX, "/%s",
9718 btd_adapter_get_storage_dir(adapter));
9720 dir = opendir(dirname);
9722 btd_error(adapter->dev_id,
9723 "Unable to open adapter storage directory: %s",
9728 while ((entry = readdir(dir)) != NULL) {
9729 struct btd_device *device;
9730 char filename[PATH_MAX];
9732 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
9733 struct link_key_info *key_info = NULL;
9734 struct smp_ltk_info *ltk_info = NULL;
9735 struct smp_ltk_info *peripheral_ltk_info;
9736 GSList *list = NULL;
9737 struct device_addr_type addr;
9739 struct link_key_info *key_info;
9740 struct smp_ltk_info *ltk_info;
9741 struct smp_ltk_info *peripheral_ltk_info;
9744 struct irk_info *irk_info;
9745 struct conn_param *param;
9746 uint8_t bdaddr_type;
9748 if (entry->d_type == DT_UNKNOWN)
9749 entry->d_type = util_get_dt(dirname, entry->d_name);
9751 if (entry->d_type != DT_DIR || bachk(entry->d_name) < 0)
9754 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
9758 str2ba(entry->d_name, &bdaddr);
9760 if (!bacmp(&bdaddr, BDADDR_ANY)) {
9761 error("No Bluetooth address");
9766 create_filename(filename, PATH_MAX, "/%s/%s/info",
9767 btd_adapter_get_storage_dir(adapter),
9770 key_file = g_key_file_new();
9771 if (!g_key_file_load_from_file(key_file, filename, 0, &gerr)) {
9772 error("Unable to load key file from %s: (%s)", filename,
9774 g_clear_error(&gerr);
9777 key_info = get_key_info(key_file, entry->d_name);
9779 bdaddr_type = get_le_addr_type(key_file);
9781 ltk_info = get_ltk_info(key_file, entry->d_name, bdaddr_type);
9783 peripheral_ltk_info = get_peripheral_ltk_info(key_file,
9784 entry->d_name, bdaddr_type);
9786 irk_info = get_irk_info(key_file, entry->d_name, bdaddr_type);
9788 // If any key for the device is blocked, we discard all.
9789 if ((key_info && key_info->is_blocked) ||
9790 (ltk_info && ltk_info->is_blocked) ||
9791 (peripheral_ltk_info &&
9792 peripheral_ltk_info->is_blocked) ||
9793 (irk_info && irk_info->is_blocked)) {
9805 if (peripheral_ltk_info) {
9806 g_free(peripheral_ltk_info);
9807 peripheral_ltk_info = NULL;
9819 keys = g_slist_append(keys, key_info);
9822 ltks = g_slist_append(ltks, ltk_info);
9824 if (peripheral_ltk_info)
9825 ltks = g_slist_append(ltks, peripheral_ltk_info);
9828 irks = g_slist_append(irks, irk_info);
9830 param = get_conn_param(key_file, entry->d_name, bdaddr_type);
9832 params = g_slist_append(params, param);
9834 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
9835 str2ba(entry->d_name, &addr.bdaddr);
9836 addr.bdaddr_type = get_addr_type(key_file);
9837 if (addr.bdaddr_type == 0xff) {
9838 error("No SupportedTechnologies. Skipping");
9842 list = g_slist_find_custom(adapter->devices, &addr,
9843 device_addr_type_strict_cmp);
9845 list = g_slist_find_custom(adapter->devices, entry->d_name,
9846 device_address_cmp);
9849 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
9850 DBG("Skip already loaded device [%s] [%d]",
9851 entry->d_name, addr.bdaddr_type);
9853 device = list->data;
9857 device = device_create_from_storage(adapter, entry->d_name,
9862 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
9867 * After loading IRK information from file,
9868 * store it into device->bdaddr.
9869 * RPA is stored in device->rpa_addr
9871 ba2str(device_get_address(device), idaddr);
9873 DBG("irk address: %s, rpa_exist %d",
9874 idaddr, device_get_rpa_exist(device));
9876 if (device_get_rpa_exist(device) == true) {
9878 str2ba(idaddr, &key_info->bdaddr);
9881 ltks = g_slist_remove(ltks, ltk_info);
9882 ltk_info = get_ltk_info(key_file,
9883 idaddr, bdaddr_type);
9885 ltks = g_slist_append(ltks, ltk_info);
9888 if (peripheral_ltk_info) {
9889 ltks = g_slist_remove(ltks, peripheral_ltk_info);
9890 peripheral_ltk_info = get_peripheral_ltk_info(key_file,
9891 idaddr, bdaddr_type);
9892 if (peripheral_ltk_info)
9893 ltks = g_slist_append(ltks, peripheral_ltk_info);
9897 str2ba(idaddr, &irk_info->bdaddr);
9898 device_set_irk_value(device, irk_info->val);
9902 str2ba(idaddr, ¶m->bdaddr);
9907 device_set_rpa(device, true);
9909 btd_device_set_temporary(device, false);
9910 adapter_add_device(adapter, device);
9912 /* TODO: register services from pre-loaded list of primaries */
9914 added_devices = g_slist_append(added_devices, device);
9918 device_set_paired(device, BDADDR_BREDR);
9919 device_set_bonded(device, BDADDR_BREDR);
9923 g_key_file_free(key_file);
9928 load_link_keys(adapter, keys, btd_opts.debug_keys);
9929 g_slist_free_full(keys, g_free);
9931 load_ltks(adapter, ltks);
9932 g_slist_free_full(ltks, g_free);
9933 load_irks(adapter, irks);
9934 g_slist_free_full(irks, g_free);
9935 load_conn_params(adapter, params);
9936 g_slist_free_full(params, g_free);
9938 g_slist_free_full(added_devices, probe_devices);
9941 int btd_adapter_block_address(struct btd_adapter *adapter,
9942 const bdaddr_t *bdaddr, uint8_t bdaddr_type)
9944 struct mgmt_cp_block_device cp;
9947 ba2str(bdaddr, addr);
9948 DBG("hci%u %s", adapter->dev_id, addr);
9950 memset(&cp, 0, sizeof(cp));
9951 bacpy(&cp.addr.bdaddr, bdaddr);
9952 cp.addr.type = bdaddr_type;
9954 if (mgmt_send(adapter->mgmt, MGMT_OP_BLOCK_DEVICE,
9955 adapter->dev_id, sizeof(cp), &cp,
9956 NULL, NULL, NULL) > 0)
9962 int btd_adapter_unblock_address(struct btd_adapter *adapter,
9963 const bdaddr_t *bdaddr, uint8_t bdaddr_type)
9965 struct mgmt_cp_unblock_device cp;
9968 ba2str(bdaddr, addr);
9969 DBG("hci%u %s", adapter->dev_id, addr);
9971 memset(&cp, 0, sizeof(cp));
9972 bacpy(&cp.addr.bdaddr, bdaddr);
9973 cp.addr.type = bdaddr_type;
9975 if (mgmt_send(adapter->mgmt, MGMT_OP_UNBLOCK_DEVICE,
9976 adapter->dev_id, sizeof(cp), &cp,
9977 NULL, NULL, NULL) > 0)
9983 static int clear_blocked(struct btd_adapter *adapter)
9985 return btd_adapter_unblock_address(adapter, BDADDR_ANY, 0);
9988 static void probe_driver(struct btd_adapter *adapter, gpointer user_data)
9990 struct btd_adapter_driver *driver = user_data;
9993 if (driver->probe == NULL)
9996 err = driver->probe(adapter);
9998 btd_error(adapter->dev_id, "%s: %s (%d)", driver->name,
9999 strerror(-err), -err);
10003 adapter->drivers = g_slist_prepend(adapter->drivers, driver);
10006 static void load_drivers(struct btd_adapter *adapter)
10010 for (l = adapter_drivers; l; l = l->next)
10011 probe_driver(adapter, l->data);
10014 static void probe_profile(struct btd_profile *profile, void *data)
10016 struct btd_adapter *adapter = data;
10019 if (profile->adapter_probe == NULL)
10022 err = profile->adapter_probe(profile, adapter);
10024 btd_error(adapter->dev_id, "%s: %s (%d)", profile->name,
10025 strerror(-err), -err);
10029 adapter->profiles = g_slist_prepend(adapter->profiles, profile);
10032 void adapter_add_profile(struct btd_adapter *adapter, gpointer p)
10034 struct btd_profile *profile = p;
10036 if (!adapter->initialized)
10039 probe_profile(profile, adapter);
10041 g_slist_foreach(adapter->devices, device_probe_profile, profile);
10044 void adapter_remove_profile(struct btd_adapter *adapter, gpointer p)
10046 struct btd_profile *profile = p;
10048 if (!adapter->initialized)
10051 if (profile->device_remove)
10052 g_slist_foreach(adapter->devices, device_remove_profile, p);
10054 adapter->profiles = g_slist_remove(adapter->profiles, profile);
10056 if (profile->adapter_remove)
10057 profile->adapter_remove(profile, adapter);
10060 static void device_added_drivers(struct btd_adapter *adapter,
10061 struct btd_device *device)
10063 struct btd_adapter_driver *driver;
10066 for (l = adapter_drivers; l; l = l->next) {
10069 if (driver->device_added)
10070 driver->device_added(adapter, device);
10074 static void device_removed_drivers(struct btd_adapter *adapter,
10075 struct btd_device *device)
10077 struct btd_adapter_driver *driver;
10080 for (l = adapter_drivers; l; l = l->next) {
10083 if (driver->device_removed)
10084 driver->device_removed(adapter, device);
10088 void device_resolved_drivers(struct btd_adapter *adapter,
10089 struct btd_device *device)
10091 struct btd_adapter_driver *driver;
10094 for (l = adapter_drivers; l; l = l->next) {
10097 if (driver->device_resolved)
10098 driver->device_resolved(adapter, device);
10102 static void adapter_add_device(struct btd_adapter *adapter,
10103 struct btd_device *device)
10105 adapter->devices = g_slist_append(adapter->devices, device);
10106 device_added_drivers(adapter, device);
10109 static void adapter_remove_device(struct btd_adapter *adapter,
10110 struct btd_device *device)
10112 adapter->devices = g_slist_remove(adapter->devices, device);
10113 device_removed_drivers(adapter, device);
10116 static void adapter_add_connection(struct btd_adapter *adapter,
10117 struct btd_device *device,
10118 uint8_t bdaddr_type,
10121 device_add_connection(device, bdaddr_type, flags);
10123 if (g_slist_find(adapter->connections, device)) {
10124 btd_error(adapter->dev_id,
10125 "Device is already marked as connected");
10129 adapter->connections = g_slist_append(adapter->connections, device);
10132 static void get_connections_complete(uint8_t status, uint16_t length,
10133 const void *param, void *user_data)
10135 struct btd_adapter *adapter = user_data;
10136 const struct mgmt_rp_get_connections *rp = param;
10137 uint16_t i, conn_count;
10139 if (status != MGMT_STATUS_SUCCESS) {
10140 btd_error(adapter->dev_id,
10141 "Failed to get connections: %s (0x%02x)",
10142 mgmt_errstr(status), status);
10146 if (length < sizeof(*rp)) {
10147 btd_error(adapter->dev_id,
10148 "Wrong size of get connections response");
10152 conn_count = btohs(rp->conn_count);
10154 DBG("Connection count: %d", conn_count);
10156 if (conn_count * sizeof(struct mgmt_addr_info) +
10157 sizeof(*rp) != length) {
10158 btd_error(adapter->dev_id,
10159 "Incorrect packet size for get connections response");
10163 for (i = 0; i < conn_count; i++) {
10164 const struct mgmt_addr_info *addr = &rp->addr[i];
10165 struct btd_device *device;
10168 ba2str(&addr->bdaddr, address);
10169 DBG("Adding existing connection to %s", address);
10171 device = btd_adapter_get_device(adapter, &addr->bdaddr,
10174 adapter_add_connection(adapter, device, addr->type, 0);
10178 static void load_connections(struct btd_adapter *adapter)
10180 DBG("sending get connections command for index %u", adapter->dev_id);
10182 if (mgmt_send(adapter->mgmt, MGMT_OP_GET_CONNECTIONS,
10183 adapter->dev_id, 0, NULL,
10184 get_connections_complete, adapter, NULL) > 0)
10187 btd_error(adapter->dev_id, "Failed to get connections for index %u",
10191 bool btd_adapter_get_pairable(struct btd_adapter *adapter)
10193 if (adapter->current_settings & MGMT_SETTING_BONDABLE)
10199 bool btd_adapter_get_powered(struct btd_adapter *adapter)
10201 if ((adapter->current_settings & MGMT_SETTING_POWERED) &&
10202 !(adapter->pending_settings & MGMT_SETTING_POWERED))
10208 bool btd_adapter_get_connectable(struct btd_adapter *adapter)
10210 if (adapter->current_settings & MGMT_SETTING_CONNECTABLE)
10216 bool btd_adapter_get_discoverable(struct btd_adapter *adapter)
10218 if (adapter->current_settings & MGMT_SETTING_DISCOVERABLE)
10224 bool btd_adapter_get_bredr(struct btd_adapter *adapter)
10226 if (adapter->current_settings & MGMT_SETTING_BREDR)
10232 struct btd_gatt_database *btd_adapter_get_database(struct btd_adapter *adapter)
10237 return adapter->database;
10240 uint32_t btd_adapter_get_class(struct btd_adapter *adapter)
10242 return adapter->dev_class;
10245 const char *btd_adapter_get_name(struct btd_adapter *adapter)
10247 if (adapter->stored_alias)
10248 return adapter->stored_alias;
10250 if (adapter->system_name)
10251 return adapter->system_name;
10256 int adapter_connect_list_add(struct btd_adapter *adapter,
10257 struct btd_device *device)
10260 * If the adapter->connect_le device is getting added back to
10261 * the connect list it probably means that the connect attempt
10262 * failed and hence we should clear this pointer
10264 if (device == adapter->connect_le)
10265 adapter->connect_le = NULL;
10268 * If kernel background scanning is supported then the
10269 * adapter_auto_connect_add() function is used to maintain what to
10272 if (btd_has_kernel_features(KERNEL_CONN_CONTROL))
10275 if (g_slist_find(adapter->connect_list, device)) {
10276 DBG("ignoring already added device %s",
10277 device_get_path(device));
10281 if (!(adapter->supported_settings & MGMT_SETTING_LE)) {
10282 btd_error(adapter->dev_id,
10283 "Can't add %s to non-LE capable adapter connect list",
10284 device_get_path(device));
10288 adapter->connect_list = g_slist_append(adapter->connect_list, device);
10289 DBG("%s added to %s's connect_list", device_get_path(device),
10290 adapter->system_name);
10293 if (!btd_adapter_get_powered(adapter))
10296 trigger_passive_scanning(adapter);
10301 void adapter_connect_list_remove(struct btd_adapter *adapter,
10302 struct btd_device *device)
10305 * If the adapter->connect_le device is being removed from the
10306 * connect list it means the connection was successful and hence
10307 * the pointer should be cleared
10309 if (device == adapter->connect_le)
10310 adapter->connect_le = NULL;
10312 if (btd_has_kernel_features(KERNEL_CONN_CONTROL))
10315 if (!g_slist_find(adapter->connect_list, device)) {
10316 DBG("device %s is not on the list, ignoring",
10317 device_get_path(device));
10321 adapter->connect_list = g_slist_remove(adapter->connect_list, device);
10322 DBG("%s removed from %s's connect_list", device_get_path(device),
10323 adapter->system_name);
10325 if (!adapter->connect_list) {
10326 stop_passive_scanning(adapter);
10330 if (!btd_adapter_get_powered(adapter))
10333 trigger_passive_scanning(adapter);
10336 static void add_accept_list_complete(uint8_t status, uint16_t length,
10337 const void *param, void *user_data)
10339 const struct mgmt_rp_add_device *rp = param;
10340 struct btd_adapter *adapter = user_data;
10341 struct btd_device *dev;
10344 if (length < sizeof(*rp)) {
10345 btd_error(adapter->dev_id,
10346 "Too small Add Device complete event");
10350 ba2str(&rp->addr.bdaddr, addr);
10352 dev = btd_adapter_find_device(adapter, &rp->addr.bdaddr,
10355 btd_error(adapter->dev_id,
10356 "Add Device complete for unknown device %s", addr);
10360 if (status != MGMT_STATUS_SUCCESS) {
10361 btd_error(adapter->dev_id,
10362 "Failed to add device %s: %s (0x%02x)",
10363 addr, mgmt_errstr(status), status);
10367 DBG("%s added to kernel accept list", addr);
10370 void adapter_accept_list_add(struct btd_adapter *adapter,
10371 struct btd_device *dev)
10373 struct mgmt_cp_add_device cp;
10375 if (!btd_has_kernel_features(KERNEL_CONN_CONTROL))
10378 memset(&cp, 0, sizeof(cp));
10379 bacpy(&cp.addr.bdaddr, device_get_address(dev));
10380 cp.addr.type = BDADDR_BREDR;
10383 mgmt_send(adapter->mgmt, MGMT_OP_ADD_DEVICE,
10384 adapter->dev_id, sizeof(cp), &cp,
10385 add_accept_list_complete, adapter, NULL);
10388 static void remove_accept_list_complete(uint8_t status, uint16_t length,
10389 const void *param, void *user_data)
10391 const struct mgmt_rp_remove_device *rp = param;
10394 if (length < sizeof(*rp)) {
10395 error("Too small Remove Device complete event");
10399 ba2str(&rp->addr.bdaddr, addr);
10401 if (status != MGMT_STATUS_SUCCESS) {
10402 error("Failed to remove device %s: %s (0x%02x)",
10403 addr, mgmt_errstr(status), status);
10407 DBG("%s removed from kernel accept list", addr);
10410 void adapter_accept_list_remove(struct btd_adapter *adapter,
10411 struct btd_device *dev)
10413 struct mgmt_cp_remove_device cp;
10415 if (!btd_has_kernel_features(KERNEL_CONN_CONTROL))
10418 memset(&cp, 0, sizeof(cp));
10419 bacpy(&cp.addr.bdaddr, device_get_address(dev));
10420 cp.addr.type = BDADDR_BREDR;
10422 mgmt_send(adapter->mgmt, MGMT_OP_REMOVE_DEVICE,
10423 adapter->dev_id, sizeof(cp), &cp,
10424 remove_accept_list_complete, adapter, NULL);
10427 static void set_device_privacy_complete(uint8_t status, uint16_t length,
10428 const void *param, void *user_data)
10430 const struct mgmt_rp_set_device_flags *rp = param;
10432 if (status != MGMT_STATUS_SUCCESS) {
10433 error("Set device flags return status: %s",
10434 mgmt_errstr(status));
10438 if (length < sizeof(*rp)) {
10439 error("Too small Set Device Flags complete event: %d", length);
10444 static void add_device_complete(uint8_t status, uint16_t length,
10445 const void *param, void *user_data)
10447 const struct mgmt_rp_add_device *rp = param;
10448 struct btd_adapter *adapter = user_data;
10449 struct btd_device *dev;
10452 if (length < sizeof(*rp)) {
10453 btd_error(adapter->dev_id,
10454 "Too small Add Device complete event");
10458 ba2str(&rp->addr.bdaddr, addr);
10460 dev = btd_adapter_find_device(adapter, &rp->addr.bdaddr,
10463 btd_error(adapter->dev_id,
10464 "Add Device complete for unknown device %s", addr);
10468 if (status != MGMT_STATUS_SUCCESS) {
10469 btd_error(adapter->dev_id,
10470 "Failed to add device %s (%u): %s (0x%02x)",
10471 addr, rp->addr.type, mgmt_errstr(status), status);
10472 adapter->connect_list = g_slist_remove(adapter->connect_list,
10477 DBG("%s (%u) added to kernel connect list", addr, rp->addr.type);
10479 if (btd_opts.device_privacy) {
10480 uint32_t flags = btd_device_get_current_flags(dev);
10482 /* Set Device Privacy Mode has not set the flag yet. */
10483 if (!(flags & DEVICE_FLAG_DEVICE_PRIVACY)) {
10484 adapter_set_device_flags(adapter, dev, flags |
10485 DEVICE_FLAG_DEVICE_PRIVACY,
10486 set_device_privacy_complete,
10492 void adapter_auto_connect_add(struct btd_adapter *adapter,
10493 struct btd_device *device)
10495 struct mgmt_cp_add_device cp;
10496 const bdaddr_t *bdaddr;
10497 uint8_t bdaddr_type;
10500 if (!btd_has_kernel_features(KERNEL_CONN_CONTROL))
10503 if (g_slist_find(adapter->connect_list, device)) {
10504 DBG("ignoring already added device %s",
10505 device_get_path(device));
10509 bdaddr = device_get_address(device);
10510 bdaddr_type = btd_device_get_bdaddr_type(device);
10512 if (bdaddr_type == BDADDR_BREDR) {
10513 DBG("auto-connection feature is not avaiable for BR/EDR");
10517 memset(&cp, 0, sizeof(cp));
10518 bacpy(&cp.addr.bdaddr, bdaddr);
10519 cp.addr.type = bdaddr_type;
10522 id = mgmt_send(adapter->mgmt, MGMT_OP_ADD_DEVICE,
10523 adapter->dev_id, sizeof(cp), &cp, add_device_complete,
10528 adapter->connect_list = g_slist_append(adapter->connect_list, device);
10531 void adapter_set_device_flags(struct btd_adapter *adapter,
10532 struct btd_device *device, uint32_t flags,
10533 mgmt_request_func_t func, void *user_data)
10535 struct mgmt_cp_set_device_flags cp;
10536 uint32_t supported = btd_device_get_supported_flags(device);
10537 const bdaddr_t *bdaddr;
10538 uint8_t bdaddr_type;
10540 if (!btd_has_kernel_features(KERNEL_CONN_CONTROL) ||
10541 (supported | flags) != supported)
10544 bdaddr = device_get_address(device);
10545 bdaddr_type = btd_device_get_bdaddr_type(device);
10547 memset(&cp, 0, sizeof(cp));
10548 bacpy(&cp.addr.bdaddr, bdaddr);
10549 cp.addr.type = bdaddr_type;
10550 cp.current_flags = cpu_to_le32(flags);
10552 mgmt_send(adapter->mgmt, MGMT_OP_SET_DEVICE_FLAGS, adapter->dev_id,
10553 sizeof(cp), &cp, func, user_data, NULL);
10556 static void device_flags_changed_callback(uint16_t index, uint16_t length,
10557 const void *param, void *user_data)
10559 const struct mgmt_ev_device_flags_changed *ev = param;
10560 struct btd_adapter *adapter = user_data;
10561 struct btd_device *dev;
10564 if (length < sizeof(*ev)) {
10565 btd_error(adapter->dev_id,
10566 "Too small Device Flags Changed event: %d",
10571 ba2str(&ev->addr.bdaddr, addr);
10573 dev = btd_adapter_find_device(adapter, &ev->addr.bdaddr, ev->addr.type);
10575 btd_error(adapter->dev_id,
10576 "Device Flags Changed for unknown device %s", addr);
10580 btd_device_flags_changed(dev, ev->supported_flags, ev->current_flags);
10584 static void remove_device_complete(uint8_t status, uint16_t length,
10585 const void *param, void *user_data)
10587 const struct mgmt_rp_remove_device *rp = param;
10590 if (length < sizeof(*rp)) {
10591 error("Too small Remove Device complete event");
10595 ba2str(&rp->addr.bdaddr, addr);
10597 if (status != MGMT_STATUS_SUCCESS) {
10598 error("Failed to remove device %s (%u): %s (0x%02x)",
10599 addr, rp->addr.type, mgmt_errstr(status), status);
10603 DBG("%s (%u) removed from kernel connect list", addr, rp->addr.type);
10606 void adapter_auto_connect_remove(struct btd_adapter *adapter,
10607 struct btd_device *device)
10609 struct mgmt_cp_remove_device cp;
10610 const bdaddr_t *bdaddr;
10611 uint8_t bdaddr_type;
10614 if (!btd_has_kernel_features(KERNEL_CONN_CONTROL))
10617 if (!g_slist_find(adapter->connect_list, device)) {
10618 DBG("ignoring not added device %s", device_get_path(device));
10622 bdaddr = device_get_address(device);
10623 bdaddr_type = btd_device_get_bdaddr_type(device);
10625 if (bdaddr_type == BDADDR_BREDR) {
10626 DBG("auto-connection feature is not avaiable for BR/EDR");
10630 memset(&cp, 0, sizeof(cp));
10631 bacpy(&cp.addr.bdaddr, bdaddr);
10632 cp.addr.type = bdaddr_type;
10634 id = mgmt_send(adapter->mgmt, MGMT_OP_REMOVE_DEVICE,
10635 adapter->dev_id, sizeof(cp), &cp,
10636 remove_device_complete, adapter, NULL);
10640 adapter->connect_list = g_slist_remove(adapter->connect_list, device);
10643 #if defined (TIZEN_FEATURE_BLUEZ_MODIFY)
10644 static void get_phy_configuration_resp(uint8_t status, uint16_t len, const void *param,
10647 uint32_t supported_phys;
10648 uint32_t configurable_phys;
10649 uint32_t selected_phys;
10651 const struct mgmt_rp_get_phy_confguration *rp = param;
10652 struct btd_adapter *adapter = user_data;
10654 if (status != MGMT_STATUS_SUCCESS) {
10655 error("Get PHY Configuration failed with status 0x%02x (%s)",
10656 status, mgmt_errstr(status));
10660 if (len < sizeof(*rp)) {
10661 error("Too small get-phy reply (%u bytes)", len);
10665 supported_phys = get_le32(&rp->supported_phys);
10666 configurable_phys = get_le32(&rp-> configurable_phys);
10667 selected_phys = get_le16(&rp->selected_phys);
10669 DBG("Supported phys: [0x%x]", supported_phys);
10670 DBG("Configurable phys: [0x%x]", configurable_phys);
10671 DBG("Selected phys: [0x%x]", selected_phys);
10673 if (adapter->supported_settings & MGMT_SETTING_LE) {
10674 if ((supported_phys & MGMT_PHY_LE_2M_TX) &&
10675 (supported_phys & MGMT_PHY_LE_2M_RX)) {
10676 DBG("Adapter supports LE 2M PHY");
10677 adapter->le_2m_phy_supported = TRUE;
10679 DBG("Adapter does not support LE 2M PHY");
10681 if ((supported_phys & MGMT_PHY_LE_CODED_TX) &&
10682 (supported_phys & MGMT_PHY_LE_CODED_RX)) {
10683 adapter->le_coded_phy_supported = TRUE;
10684 DBG("Adapter supports LE CODED PHY");
10686 DBG("Adapter does not support LE CODED PHY");
10689 /* Emit Property Changed Signal */
10690 g_dbus_emit_property_changed(dbus_conn, adapter->path,
10691 ADAPTER_INTERFACE, "SupportedLEFeatures");
10696 static void adapter_start(struct btd_adapter *adapter)
10699 #if defined(TIZEN_FEATURE_BLUEZ_MODIFY) && !defined(__SPRD_PATCH__)
10700 if (adapter_le_read_ble_feature_info())
10701 g_dbus_emit_property_changed(dbus_conn, adapter->path,
10702 ADAPTER_INTERFACE, "SupportedLEFeatures");
10703 #ifdef TIZEN_FEATURE_PLATFROM_SCAN_FILTER
10705 g_dbus_emit_property_changed(dbus_conn, adapter->path,
10706 ADAPTER_INTERFACE, "SupportedLEFeatures");
10709 adapter_get_adv_tx_power(adapter);
10711 /* By default enable offloading for testing, this should be modified */
10712 if (!TIZEN_FEATURE_BLUEZ_DA)
10713 if (adapter_le_is_supported_offloading())
10714 adapter_le_enable_offloading(TRUE);
10717 #ifndef TIZEN_FEATURE_BLUEZ_MODIFY
10718 g_dbus_emit_property_changed(dbus_conn, adapter->path,
10719 ADAPTER_INTERFACE, "Powered");
10721 g_dbus_emit_property_changed_full(dbus_conn, adapter->path,
10722 ADAPTER_INTERFACE, "Powered", 1);
10724 adapter_set_power_state(adapter, ADAPTER_POWER_STATE_ON);
10726 DBG("adapter %s has been enabled", adapter->path);
10728 trigger_passive_scanning(adapter);
10731 static void reply_pending_requests(struct btd_adapter *adapter)
10738 /* pending bonding */
10739 for (l = adapter->devices; l; l = l->next) {
10740 struct btd_device *device = l->data;
10742 if (device_is_bonding(device, NULL))
10743 device_bonding_failed(device,
10744 HCI_OE_USER_ENDED_CONNECTION);
10748 static void remove_driver(gpointer data, gpointer user_data)
10750 struct btd_adapter_driver *driver = data;
10751 struct btd_adapter *adapter = user_data;
10753 if (driver->remove)
10754 driver->remove(adapter);
10757 static void remove_profile(gpointer data, gpointer user_data)
10759 struct btd_profile *profile = data;
10760 struct btd_adapter *adapter = user_data;
10762 if (profile->adapter_remove)
10763 profile->adapter_remove(profile, adapter);
10766 static void unload_drivers(struct btd_adapter *adapter)
10768 g_slist_foreach(adapter->drivers, remove_driver, adapter);
10769 g_slist_free(adapter->drivers);
10770 adapter->drivers = NULL;
10772 g_slist_foreach(adapter->profiles, remove_profile, adapter);
10773 g_slist_free(adapter->profiles);
10774 adapter->profiles = NULL;
10777 static void free_service_auth(gpointer data, gpointer user_data)
10779 struct service_auth *auth = data;
10784 static void remove_discovery_list(struct btd_adapter *adapter)
10786 g_slist_free_full(adapter->set_filter_list, discovery_free);
10787 adapter->set_filter_list = NULL;
10789 g_slist_free_full(adapter->discovery_list, discovery_free);
10790 adapter->discovery_list = NULL;
10793 static void cancel_exp_pending(void *data)
10795 struct exp_pending *pending = data;
10796 struct btd_adapter *adapter = pending->adapter;
10798 pending->adapter = NULL;
10799 mgmt_cancel(adapter->mgmt, pending->id);
10803 static void adapter_free(gpointer user_data)
10805 struct btd_adapter *adapter = user_data;
10807 DBG("%p", adapter);
10809 /* Make sure the adapter's discovery list is cleaned up before freeing
10812 remove_discovery_list(adapter);
10814 if (adapter->pairable_timeout_id > 0) {
10815 timeout_remove(adapter->pairable_timeout_id);
10816 adapter->pairable_timeout_id = 0;
10819 if (adapter->passive_scan_timeout > 0) {
10820 timeout_remove(adapter->passive_scan_timeout);
10821 adapter->passive_scan_timeout = 0;
10824 if (adapter->auth_idle_id)
10825 timeout_remove(adapter->auth_idle_id);
10827 g_queue_foreach(adapter->auths, free_service_auth, NULL);
10828 g_queue_free(adapter->auths);
10829 queue_destroy(adapter->exps, NULL);
10831 queue_destroy(adapter->exp_pending, cancel_exp_pending);
10834 * Unregister all handlers for this specific index since
10835 * the adapter bound to them is no longer valid.
10837 * This also avoids having multiple instances of the same
10838 * handler in case indexes got removed and re-added.
10840 mgmt_unregister_index(adapter->mgmt, adapter->dev_id);
10843 * Cancel all pending commands for this specific index
10844 * since the adapter bound to them is no longer valid.
10846 mgmt_cancel_index(adapter->mgmt, adapter->dev_id);
10848 mgmt_unref(adapter->mgmt);
10850 sdp_list_free(adapter->services, NULL);
10852 g_slist_free(adapter->connections);
10854 g_free(adapter->path);
10855 g_free(adapter->name);
10856 g_free(adapter->short_name);
10857 g_free(adapter->system_name);
10858 g_free(adapter->stored_alias);
10859 g_free(adapter->current_alias);
10860 free(adapter->modalias);
10862 if (adapter->allowed_uuid_set)
10863 g_hash_table_destroy(adapter->allowed_uuid_set);
10868 struct btd_adapter *btd_adapter_ref(struct btd_adapter *adapter)
10870 __sync_fetch_and_add(&adapter->ref_count, 1);
10875 void btd_adapter_unref(struct btd_adapter *adapter)
10877 if (__sync_sub_and_fetch(&adapter->ref_count, 1))
10880 if (!adapter->path) {
10881 DBG("Freeing adapter %u", adapter->dev_id);
10883 adapter_free(adapter);
10887 DBG("Freeing adapter %s", adapter->path);
10889 g_dbus_unregister_interface(dbus_conn, adapter->path,
10890 ADAPTER_INTERFACE);
10893 static void convert_names_entry(char *key, char *value, void *user_data)
10895 char *address = user_data;
10897 char filename[PATH_MAX];
10898 GKeyFile *key_file;
10899 GError *gerr = NULL;
10903 if (strchr(key, '#'))
10906 if (bachk(str) != 0)
10909 create_filename(filename, PATH_MAX, "/%s/cache/%s", address, str);
10910 create_file(filename, 0600);
10912 key_file = g_key_file_new();
10913 if (!g_key_file_load_from_file(key_file, filename, 0, &gerr)) {
10914 error("Unable to load key file from %s: (%s)", filename,
10916 g_clear_error(&gerr);
10918 g_key_file_set_string(key_file, "General", "Name", value);
10920 data = g_key_file_to_data(key_file, &length, NULL);
10921 if (!g_file_set_contents(filename, data, length, &gerr)) {
10922 error("Unable set contents for %s: (%s)", filename,
10924 g_error_free(gerr);
10928 g_key_file_free(key_file);
10931 struct device_converter {
10933 void (*cb)(GKeyFile *key_file, void *value);
10937 static void set_device_type(GKeyFile *key_file, char type)
10940 char *addr_type = NULL;
10947 case BDADDR_LE_PUBLIC:
10949 addr_type = "public";
10951 case BDADDR_LE_RANDOM:
10953 addr_type = "static";
10959 str = g_key_file_get_string(key_file, "General",
10960 "SupportedTechnologies", NULL);
10962 g_key_file_set_string(key_file, "General",
10963 "SupportedTechnologies", techno);
10964 else if (!strstr(str, techno))
10965 g_key_file_set_string(key_file, "General",
10966 "SupportedTechnologies", "BR/EDR;LE");
10971 g_key_file_set_string(key_file, "General", "AddressType",
10975 static void convert_aliases_entry(GKeyFile *key_file, void *value)
10977 g_key_file_set_string(key_file, "General", "Alias", value);
10980 static void convert_trusts_entry(GKeyFile *key_file, void *value)
10982 g_key_file_set_boolean(key_file, "General", "Trusted", TRUE);
10985 static void convert_classes_entry(GKeyFile *key_file, void *value)
10987 g_key_file_set_string(key_file, "General", "Class", value);
10990 static void convert_blocked_entry(GKeyFile *key_file, void *value)
10992 g_key_file_set_boolean(key_file, "General", "Blocked", TRUE);
10995 static void convert_did_entry(GKeyFile *key_file, void *value)
10997 char *vendor_str, *product_str, *version_str;
11000 vendor_str = strchr(value, ' ');
11004 *(vendor_str++) = 0;
11006 if (g_str_equal(value, "FFFF"))
11009 product_str = strchr(vendor_str, ' ');
11013 *(product_str++) = 0;
11015 version_str = strchr(product_str, ' ');
11019 *(version_str++) = 0;
11021 val = (uint16_t) strtol(value, NULL, 16);
11022 g_key_file_set_integer(key_file, "DeviceID", "Source", val);
11024 val = (uint16_t) strtol(vendor_str, NULL, 16);
11025 g_key_file_set_integer(key_file, "DeviceID", "Vendor", val);
11027 val = (uint16_t) strtol(product_str, NULL, 16);
11028 g_key_file_set_integer(key_file, "DeviceID", "Product", val);
11030 val = (uint16_t) strtol(version_str, NULL, 16);
11031 g_key_file_set_integer(key_file, "DeviceID", "Version", val);
11034 static void convert_linkkey_entry(GKeyFile *key_file, void *value)
11036 char *type_str, *length_str, *str;
11039 type_str = strchr(value, ' ');
11045 length_str = strchr(type_str, ' ');
11049 *(length_str++) = 0;
11051 str = g_strconcat("0x", value, NULL);
11052 g_key_file_set_string(key_file, "LinkKey", "Key", str);
11055 val = strtol(type_str, NULL, 16);
11056 g_key_file_set_integer(key_file, "LinkKey", "Type", val);
11058 val = strtol(length_str, NULL, 16);
11059 g_key_file_set_integer(key_file, "LinkKey", "PINLength", val);
11062 static void convert_ltk_entry(GKeyFile *key_file, void *value)
11064 char *auth_str, *rand_str, *str;
11066 unsigned char auth, central, enc_size;
11067 unsigned short ediv;
11069 auth_str = strchr(value, ' ');
11075 for (i = 0, rand_str = auth_str; i < 4; i++) {
11076 rand_str = strchr(rand_str, ' ');
11077 if (!rand_str || rand_str[1] == '\0')
11083 ret = sscanf(auth_str, " %hhd %hhd %hhd %hd", &auth, ¢ral,
11088 str = g_strconcat("0x", value, NULL);
11089 g_key_file_set_string(key_file, "LongTermKey", "Key", str);
11092 g_key_file_set_integer(key_file, "LongTermKey", "Authenticated", auth);
11093 g_key_file_set_integer(key_file, "LongTermKey", "EncSize", enc_size);
11094 g_key_file_set_integer(key_file, "LongTermKey", "EDiv", ediv);
11096 str = g_strconcat("0x", rand_str, NULL);
11097 g_key_file_set_string(key_file, "LongTermKey", "Rand", str);
11101 static void convert_profiles_entry(GKeyFile *key_file, void *value)
11103 g_strdelimit(value, " ", ';');
11104 g_key_file_set_string(key_file, "General", "Services", value);
11107 static void convert_appearances_entry(GKeyFile *key_file, void *value)
11109 g_key_file_set_string(key_file, "General", "Appearance", value);
11112 static void convert_entry(char *key, char *value, void *user_data)
11114 struct device_converter *converter = user_data;
11115 char type = BDADDR_BREDR;
11116 char filename[PATH_MAX];
11117 GKeyFile *key_file;
11118 GError *gerr = NULL;
11122 if (strchr(key, '#')) {
11124 type = key[18] - '0';
11127 if (bachk(key) != 0)
11130 if (converter->force == FALSE) {
11134 create_filename(filename, PATH_MAX, "/%s/%s",
11135 converter->address, key);
11137 err = stat(filename, &st);
11138 if (err || !S_ISDIR(st.st_mode))
11142 create_filename(filename, PATH_MAX, "/%s/%s/info",
11143 converter->address, key);
11145 key_file = g_key_file_new();
11146 if (!g_key_file_load_from_file(key_file, filename, 0, &gerr)) {
11147 error("Unable to load key file from %s: (%s)", filename,
11149 g_clear_error(&gerr);
11152 set_device_type(key_file, type);
11154 converter->cb(key_file, value);
11156 data = g_key_file_to_data(key_file, &length, NULL);
11158 create_file(filename, 0600);
11159 if (!g_file_set_contents(filename, data, length, &gerr)) {
11160 error("Unable set contents for %s: (%s)", filename,
11162 g_error_free(gerr);
11168 g_key_file_free(key_file);
11171 static void convert_file(char *file, char *address,
11172 void (*cb)(GKeyFile *key_file, void *value),
11175 char filename[PATH_MAX];
11176 struct device_converter converter;
11178 create_filename(filename, PATH_MAX, "/%s/%s", address, file);
11180 converter.address = address;
11182 converter.force = force;
11184 textfile_foreach(filename, convert_entry, &converter);
11187 static gboolean record_has_uuid(const sdp_record_t *rec,
11188 const char *profile_uuid)
11192 for (pat = rec->pattern; pat != NULL; pat = pat->next) {
11196 uuid = bt_uuid2string(pat->data);
11200 ret = strcasecmp(uuid, profile_uuid);
11211 static void store_attribute_uuid(GKeyFile *key_file, uint16_t start,
11212 uint16_t end, char *att_uuid,
11215 char handle[6], uuid_str[33];
11218 switch (uuid.type) {
11220 sprintf(uuid_str, "%4.4X", uuid.value.uuid16);
11223 sprintf(uuid_str, "%8.8X", uuid.value.uuid32);
11226 for (i = 0; i < 16; i++)
11227 sprintf(uuid_str + (i * 2), "%2.2X",
11228 uuid.value.uuid128.data[i]);
11231 uuid_str[0] = '\0';
11234 sprintf(handle, "%hu", start);
11235 g_key_file_set_string(key_file, handle, "UUID", att_uuid);
11236 g_key_file_set_string(key_file, handle, "Value", uuid_str);
11237 g_key_file_set_integer(key_file, handle, "EndGroupHandle", end);
11240 static void store_sdp_record(char *local, char *peer, int handle, char *value)
11242 char filename[PATH_MAX];
11243 GKeyFile *key_file;
11244 GError *gerr = NULL;
11245 char handle_str[11];
11249 create_filename(filename, PATH_MAX, "/%s/cache/%s", local, peer);
11251 key_file = g_key_file_new();
11252 if (!g_key_file_load_from_file(key_file, filename, 0, &gerr)) {
11253 error("Unable to load key file from %s: (%s)", filename,
11255 g_clear_error(&gerr);
11258 sprintf(handle_str, "0x%8.8X", handle);
11259 g_key_file_set_string(key_file, "ServiceRecords", handle_str, value);
11261 data = g_key_file_to_data(key_file, &length, NULL);
11263 create_file(filename, 0600);
11264 if (!g_file_set_contents(filename, data, length, &gerr)) {
11265 error("Unable set contents for %s: (%s)", filename,
11267 g_error_free(gerr);
11273 g_key_file_free(key_file);
11276 static void convert_sdp_entry(char *key, char *value, void *user_data)
11278 char *src_addr = user_data;
11280 char type = BDADDR_BREDR;
11282 char filename[PATH_MAX];
11283 GKeyFile *key_file;
11284 GError *gerr = NULL;
11288 char *att_uuid, *prim_uuid;
11289 uint16_t start = 0, end = 0, psm = 0;
11294 ret = sscanf(key, "%17s#%hhu#%08X", dst_addr, &type, &handle);
11296 ret = sscanf(key, "%17s#%08X", dst_addr, &handle);
11301 if (bachk(dst_addr) != 0)
11304 /* Check if the device directory has been created as records should
11305 * only be converted for known devices */
11306 create_filename(filename, PATH_MAX, "/%s/%s", src_addr, dst_addr);
11308 err = stat(filename, &st);
11309 if (err || !S_ISDIR(st.st_mode))
11312 /* store device records in cache */
11313 store_sdp_record(src_addr, dst_addr, handle, value);
11315 /* Retrieve device record and check if there is an
11316 * attribute entry in it */
11317 sdp_uuid16_create(&uuid, ATT_UUID);
11318 att_uuid = bt_uuid2string(&uuid);
11320 sdp_uuid16_create(&uuid, GATT_PRIM_SVC_UUID);
11321 prim_uuid = bt_uuid2string(&uuid);
11323 rec = record_from_string(value);
11325 if (record_has_uuid(rec, att_uuid))
11328 /* TODO: Do this through btd_gatt_database */
11329 if (!gatt_parse_record(rec, &uuid, &psm, &start, &end))
11332 create_filename(filename, PATH_MAX, "/%s/%s/attributes", src_addr,
11335 key_file = g_key_file_new();
11336 if (!g_key_file_load_from_file(key_file, filename, 0, &gerr)) {
11337 error("Unable to load key file from %s: (%s)", filename,
11339 g_clear_error(&gerr);
11342 store_attribute_uuid(key_file, start, end, prim_uuid, uuid);
11344 data = g_key_file_to_data(key_file, &length, NULL);
11346 create_file(filename, 0600);
11347 if (!g_file_set_contents(filename, data, length, &gerr)) {
11348 error("Unable set contents for %s: (%s)", filename,
11350 g_error_free(gerr);
11355 g_key_file_free(key_file);
11358 sdp_record_free(rec);
11363 static void convert_primaries_entry(char *key, char *value, void *user_data)
11365 char *address = user_data;
11366 int device_type = -1;
11368 char **services, **service, *prim_uuid;
11369 char filename[PATH_MAX];
11370 GKeyFile *key_file;
11371 GError *gerr = NULL;
11373 uint16_t start, end;
11374 char uuid_str[MAX_LEN_UUID_STR + 1];
11378 if (strchr(key, '#')) {
11380 device_type = key[18] - '0';
11383 if (bachk(key) != 0)
11386 services = g_strsplit(value, " ", 0);
11387 if (services == NULL)
11390 sdp_uuid16_create(&uuid, GATT_PRIM_SVC_UUID);
11391 prim_uuid = bt_uuid2string(&uuid);
11393 create_filename(filename, PATH_MAX, "/%s/%s/attributes", address, key);
11395 key_file = g_key_file_new();
11396 if (!g_key_file_load_from_file(key_file, filename, 0, &gerr)) {
11397 error("Unable to load key file from %s: (%s)", filename,
11399 g_clear_error(&gerr);
11402 for (service = services; *service; service++) {
11403 ret = sscanf(*service, "%04hX#%04hX#%s", &start, &end,
11408 bt_string2uuid(&uuid, uuid_str);
11409 sdp_uuid128_to_uuid(&uuid);
11411 store_attribute_uuid(key_file, start, end, prim_uuid, uuid);
11414 g_strfreev(services);
11416 data = g_key_file_to_data(key_file, &length, NULL);
11420 create_file(filename, 0600);
11421 if (!g_file_set_contents(filename, data, length, &gerr)) {
11422 error("Unable set contents for %s: (%s)", filename,
11424 g_clear_error(&gerr);
11427 if (device_type < 0)
11431 g_key_file_free(key_file);
11433 create_filename(filename, PATH_MAX, "/%s/%s/info", address, key);
11435 key_file = g_key_file_new();
11436 if (!g_key_file_load_from_file(key_file, filename, 0, &gerr)) {
11437 error("Unable to load key file from %s: (%s)", filename,
11439 g_clear_error(&gerr);
11441 set_device_type(key_file, device_type);
11443 data = g_key_file_to_data(key_file, &length, NULL);
11445 create_file(filename, 0600);
11446 if (!g_file_set_contents(filename, data, length, &gerr)) {
11447 error("Unable set contents for %s: (%s)", filename,
11449 g_error_free(gerr);
11456 g_key_file_free(key_file);
11459 static void convert_ccc_entry(char *key, char *value, void *user_data)
11461 char *src_addr = user_data;
11463 char type = BDADDR_BREDR;
11466 char filename[PATH_MAX];
11467 GKeyFile *key_file;
11468 GError *gerr = NULL;
11474 ret = sscanf(key, "%17s#%hhu#%04hX", dst_addr, &type, &handle);
11478 if (bachk(dst_addr) != 0)
11481 /* Check if the device directory has been created as records should
11482 * only be converted for known devices */
11483 create_filename(filename, PATH_MAX, "/%s/%s", src_addr, dst_addr);
11485 err = stat(filename, &st);
11486 if (err || !S_ISDIR(st.st_mode))
11489 create_filename(filename, PATH_MAX, "/%s/%s/ccc", src_addr, dst_addr);
11491 key_file = g_key_file_new();
11492 if (!g_key_file_load_from_file(key_file, filename, 0, &gerr)) {
11493 error("Unable to load key file from %s: (%s)", filename,
11495 g_clear_error(&gerr);
11498 sprintf(group, "%hu", handle);
11499 g_key_file_set_string(key_file, group, "Value", value);
11501 data = g_key_file_to_data(key_file, &length, NULL);
11503 create_file(filename, 0600);
11504 if (!g_file_set_contents(filename, data, length, &gerr)) {
11505 error("Unable set contents for %s: (%s)", filename,
11507 g_error_free(gerr);
11512 g_key_file_free(key_file);
11515 static void convert_gatt_entry(char *key, char *value, void *user_data)
11517 char *src_addr = user_data;
11519 char type = BDADDR_BREDR;
11522 char filename[PATH_MAX];
11523 GKeyFile *key_file;
11524 GError *gerr = NULL;
11530 ret = sscanf(key, "%17s#%hhu#%04hX", dst_addr, &type, &handle);
11534 if (bachk(dst_addr) != 0)
11537 /* Check if the device directory has been created as records should
11538 * only be converted for known devices */
11539 create_filename(filename, PATH_MAX, "/%s/%s", src_addr, dst_addr);
11541 err = stat(filename, &st);
11542 if (err || !S_ISDIR(st.st_mode))
11545 create_filename(filename, PATH_MAX, "/%s/%s/gatt", src_addr, dst_addr);
11547 key_file = g_key_file_new();
11548 if (!g_key_file_load_from_file(key_file, filename, 0, &gerr)) {
11549 error("Unable to load key file from %s: (%s)", filename,
11551 g_clear_error(&gerr);
11554 sprintf(group, "%hu", handle);
11555 g_key_file_set_string(key_file, group, "Value", value);
11557 data = g_key_file_to_data(key_file, &length, NULL);
11559 create_file(filename, 0600);
11560 if (!g_file_set_contents(filename, data, length, &gerr)) {
11561 error("Unable set contents for %s: (%s)", filename,
11563 g_error_free(gerr);
11568 g_key_file_free(key_file);
11571 static void convert_proximity_entry(char *key, char *value, void *user_data)
11573 char *src_addr = user_data;
11575 char filename[PATH_MAX];
11576 GKeyFile *key_file;
11577 GError *gerr = NULL;
11583 if (!strchr(key, '#'))
11589 if (bachk(key) != 0)
11592 /* Check if the device directory has been created as records should
11593 * only be converted for known devices */
11594 create_filename(filename, PATH_MAX, "/%s/%s", src_addr, key);
11596 err = stat(filename, &st);
11597 if (err || !S_ISDIR(st.st_mode))
11600 create_filename(filename, PATH_MAX, "/%s/%s/proximity", src_addr, key);
11602 key_file = g_key_file_new();
11603 if (!g_key_file_load_from_file(key_file, filename, 0, &gerr)) {
11604 error("Unable to load key file from %s: (%s)", filename,
11606 g_clear_error(&gerr);
11609 g_key_file_set_string(key_file, alert, "Level", value);
11611 data = g_key_file_to_data(key_file, &length, NULL);
11613 create_file(filename, 0600);
11614 if (!g_file_set_contents(filename, data, length, &gerr)) {
11615 error("Unable set contents for %s: (%s)", filename,
11617 g_error_free(gerr);
11622 g_key_file_free(key_file);
11625 static void convert_device_storage(struct btd_adapter *adapter)
11627 char filename[PATH_MAX];
11630 ba2str(&adapter->bdaddr, address);
11632 /* Convert device's name cache */
11633 create_filename(filename, PATH_MAX, "/%s/names", address);
11634 textfile_foreach(filename, convert_names_entry, address);
11636 /* Convert aliases */
11637 convert_file("aliases", address, convert_aliases_entry, TRUE);
11639 /* Convert trusts */
11640 convert_file("trusts", address, convert_trusts_entry, TRUE);
11642 /* Convert blocked */
11643 convert_file("blocked", address, convert_blocked_entry, TRUE);
11645 /* Convert profiles */
11646 convert_file("profiles", address, convert_profiles_entry, TRUE);
11648 /* Convert primaries */
11649 create_filename(filename, PATH_MAX, "/%s/primaries", address);
11650 textfile_foreach(filename, convert_primaries_entry, address);
11652 /* Convert linkkeys */
11653 convert_file("linkkeys", address, convert_linkkey_entry, TRUE);
11655 /* Convert longtermkeys */
11656 convert_file("longtermkeys", address, convert_ltk_entry, TRUE);
11658 /* Convert classes */
11659 convert_file("classes", address, convert_classes_entry, FALSE);
11661 /* Convert device ids */
11662 convert_file("did", address, convert_did_entry, FALSE);
11665 create_filename(filename, PATH_MAX, "/%s/sdp", address);
11666 textfile_foreach(filename, convert_sdp_entry, address);
11669 create_filename(filename, PATH_MAX, "/%s/ccc", address);
11670 textfile_foreach(filename, convert_ccc_entry, address);
11672 /* Convert appearances */
11673 convert_file("appearances", address, convert_appearances_entry, FALSE);
11676 create_filename(filename, PATH_MAX, "/%s/gatt", address);
11677 textfile_foreach(filename, convert_gatt_entry, address);
11679 /* Convert proximity */
11680 create_filename(filename, PATH_MAX, "/%s/proximity", address);
11681 textfile_foreach(filename, convert_proximity_entry, address);
11684 static void convert_config(struct btd_adapter *adapter, const char *filename,
11685 GKeyFile *key_file)
11688 char str[MAX_NAME_LENGTH + 1];
11689 char config_path[PATH_MAX];
11694 GError *gerr = NULL;
11696 ba2str(&adapter->bdaddr, address);
11697 create_filename(config_path, PATH_MAX, "/%s/config", address);
11699 if (read_pairable_timeout(address, &timeout) == 0)
11700 g_key_file_set_integer(key_file, "General",
11701 "PairableTimeout", timeout);
11703 if (read_discoverable_timeout(address, &timeout) == 0)
11704 g_key_file_set_integer(key_file, "General",
11705 "DiscoverableTimeout", timeout);
11707 if (read_on_mode(address, str, sizeof(str)) == 0) {
11708 mode = get_mode(str);
11709 g_key_file_set_boolean(key_file, "General", "Discoverable",
11710 mode == MODE_DISCOVERABLE);
11713 if (read_local_name(&adapter->bdaddr, str) == 0)
11714 g_key_file_set_string(key_file, "General", "Alias", str);
11716 create_file(filename, 0600);
11718 data = g_key_file_to_data(key_file, &length, NULL);
11719 if (!g_file_set_contents(filename, data, length, &gerr)) {
11720 error("Unable set contents for %s: (%s)", filename,
11722 g_error_free(gerr);
11727 static void fix_storage(struct btd_adapter *adapter)
11729 char filename[PATH_MAX];
11733 ba2str(&adapter->bdaddr, address);
11735 create_filename(filename, PATH_MAX, "/%s/config", address);
11737 converted = textfile_get(filename, "converted");
11743 textfile_del(filename, "converted");
11745 create_filename(filename, PATH_MAX, "/%s/names", address);
11746 textfile_del(filename, "converted");
11748 create_filename(filename, PATH_MAX, "/%s/aliases", address);
11749 textfile_del(filename, "converted");
11751 create_filename(filename, PATH_MAX, "/%s/trusts", address);
11752 textfile_del(filename, "converted");
11754 create_filename(filename, PATH_MAX, "/%s/blocked", address);
11755 textfile_del(filename, "converted");
11757 create_filename(filename, PATH_MAX, "/%s/profiles", address);
11758 textfile_del(filename, "converted");
11760 create_filename(filename, PATH_MAX, "/%s/primaries", address);
11761 textfile_del(filename, "converted");
11763 create_filename(filename, PATH_MAX, "/%s/linkkeys", address);
11764 textfile_del(filename, "converted");
11766 create_filename(filename, PATH_MAX, "/%s/longtermkeys", address);
11767 textfile_del(filename, "converted");
11769 create_filename(filename, PATH_MAX, "/%s/classes", address);
11770 textfile_del(filename, "converted");
11772 create_filename(filename, PATH_MAX, "/%s/did", address);
11773 textfile_del(filename, "converted");
11775 create_filename(filename, PATH_MAX, "/%s/sdp", address);
11776 textfile_del(filename, "converted");
11778 create_filename(filename, PATH_MAX, "/%s/ccc", address);
11779 textfile_del(filename, "converted");
11781 create_filename(filename, PATH_MAX, "/%s/appearances", address);
11782 textfile_del(filename, "converted");
11784 create_filename(filename, PATH_MAX, "/%s/gatt", address);
11785 textfile_del(filename, "converted");
11787 create_filename(filename, PATH_MAX, "/%s/proximity", address);
11788 textfile_del(filename, "converted");
11791 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
11792 static bool is_tempfile(const char *filename)
11797 /* tempfile has ^[A-Z0-9]{6}$ suffix (e.g. "settings.1LS4BZ") */
11798 p = strrchr(filename, '.');
11802 if (strlen(++p) != 6)
11805 for (i = 0; i < 6; i++) {
11806 if (isdigit(p[i]) || isupper(p[i]))
11814 static void delete_tempfiles(const char *dirname)
11817 struct dirent *entry;
11818 char filename[PATH_MAX];
11820 dir = opendir(dirname);
11824 while ((entry = readdir(dir)) != NULL) {
11825 if (g_str_equal(entry->d_name, ".") || g_str_equal(entry->d_name, ".."))
11828 if (entry->d_type == DT_UNKNOWN)
11829 entry->d_type = util_get_dt(dirname, entry->d_name);
11831 snprintf(filename, PATH_MAX, "%s/%s", dirname, entry->d_name);
11833 if (entry->d_type == DT_DIR) {
11834 delete_tempfiles(filename);
11835 } else if (entry->d_type == DT_REG && is_tempfile(entry->d_name)) {
11843 static void load_config(struct btd_adapter *adapter)
11845 GKeyFile *key_file;
11846 char filename[PATH_MAX];
11848 GError *gerr = NULL;
11849 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
11853 key_file = g_key_file_new();
11855 create_filename(filename, PATH_MAX, "/%s/settings",
11856 btd_adapter_get_storage_dir(adapter));
11858 if (stat(filename, &st) < 0) {
11859 convert_config(adapter, filename, key_file);
11860 convert_device_storage(adapter);
11863 if (!g_key_file_load_from_file(key_file, filename, 0, &gerr)) {
11864 error("Unable to load key file from %s: (%s)", filename,
11866 g_clear_error(&gerr);
11870 adapter->stored_alias = g_key_file_get_string(key_file, "General",
11872 if (!adapter->stored_alias) {
11874 adapter->stored_alias = g_key_file_get_string(key_file,
11875 "General", "Name", NULL);
11878 /* Get pairable timeout */
11879 adapter->pairable_timeout = g_key_file_get_integer(key_file, "General",
11880 "PairableTimeout", &gerr);
11882 adapter->pairable_timeout = btd_opts.pairto;
11883 g_error_free(gerr);
11887 /* Get discoverable mode */
11888 adapter->stored_discoverable = g_key_file_get_boolean(key_file,
11889 "General", "Discoverable", &gerr);
11891 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
11892 if (TIZEN_FEATURE_BLUEZ_FHUB) {
11893 DBG("Default Discoverable mode is TRUE");
11894 adapter->stored_discoverable = true;
11897 adapter->stored_discoverable = false;
11898 g_error_free(gerr);
11902 /* Get discoverable timeout */
11903 adapter->discoverable_timeout = g_key_file_get_integer(key_file,
11904 "General", "DiscoverableTimeout", &gerr);
11906 adapter->discoverable_timeout = btd_opts.discovto;
11907 g_error_free(gerr);
11911 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
11912 /* Get A2DP Role */
11913 str = g_key_file_get_string(key_file, "General", "DefaultA2DPRole", &gerr);
11914 if (gerr || !str) {
11915 if (btd_opts.default_a2dp_role) {
11916 DBG("Default A2DP role is %s", btd_opts.default_a2dp_role);
11917 if (g_strcmp0(btd_opts.default_a2dp_role, "sink") == 0) {
11918 adapter->a2dp_role = BLUETOOTH_A2DP_SINK_ROLE;
11919 } else if (g_strcmp0(btd_opts.default_a2dp_role, "both") == 0) {
11920 adapter->a2dp_role = BLUETOOTH_A2DP_BOTH_ROLE;
11921 } else { /* source */
11922 adapter->a2dp_role = BLUETOOTH_A2DP_SOURCE_ROLE;
11925 adapter->a2dp_role = BLUETOOTH_A2DP_SOURCE_ROLE;
11927 g_error_free(gerr);
11930 if (g_strcmp0(str, "sink") == 0)
11931 adapter->a2dp_role = BLUETOOTH_A2DP_SINK_ROLE;
11932 else if (g_strcmp0(str, "both") == 0)
11933 adapter->a2dp_role = BLUETOOTH_A2DP_BOTH_ROLE;
11935 adapter->a2dp_role = BLUETOOTH_A2DP_SOURCE_ROLE;
11940 g_key_file_free(key_file);
11943 static struct btd_adapter *btd_adapter_new(uint16_t index)
11945 struct btd_adapter *adapter;
11948 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
11949 #ifdef TIZEN_FEATURE_BLUEZ_BATTERY_WATCH
11950 DBusConnection *conn = btd_get_dbus_connection();
11951 DBusMessage *msg = NULL;
11952 DBusMessage *reply = NULL;
11953 int charging_state = 0;
11954 #endif /* TIZEN_FEATURE_BLUEZ_BATTERY_WATCH */
11957 adapter = g_try_new0(struct btd_adapter, 1);
11961 adapter->dev_id = index;
11962 adapter->mgmt = mgmt_ref(mgmt_primary);
11963 adapter->pincode_requested = false;
11964 blocked = rfkill_get_blocked(index);
11966 adapter->power_state = ADAPTER_POWER_STATE_OFF_BLOCKED;
11969 * Setup default configuration values. These are either adapter
11970 * defaults or from a system wide configuration file.
11972 * Some value might be overwritten later on by adapter specific
11973 * configuration. This is to make sure that sane defaults are
11976 adapter->system_name = g_strdup(btd_opts.name);
11977 adapter->major_class = (btd_opts.class & 0x001f00) >> 8;
11978 adapter->minor_class = (btd_opts.class & 0x0000fc) >> 2;
11979 adapter->modalias = bt_modalias(btd_opts.did_source,
11980 btd_opts.did_vendor,
11981 btd_opts.did_product,
11982 btd_opts.did_version);
11983 adapter->discoverable_timeout = btd_opts.discovto;
11984 adapter->pairable_timeout = btd_opts.pairto;
11985 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
11986 adapter->advertising = FALSE;
11989 DBG("System name: %s", adapter->system_name);
11990 DBG("Major class: %u", adapter->major_class);
11991 DBG("Minor class: %u", adapter->minor_class);
11992 DBG("Modalias: %s", adapter->modalias);
11993 DBG("Discoverable timeout: %u seconds", adapter->discoverable_timeout);
11994 DBG("Pairable timeout: %u seconds", adapter->pairable_timeout);
11996 DBG("Power state: %s",
11997 adapter_power_state_str(adapter->power_state));
11999 adapter->auths = g_queue_new();
12000 adapter->exps = queue_new();
12001 adapter->exp_pending = queue_new();
12003 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
12004 #ifdef TIZEN_FEATURE_BLUEZ_BATTERY_WATCH
12005 adapter->charging_watch = g_dbus_add_signal_watch(conn, DEVICED_DEST,
12006 DEVICED_BATT_OBJECT_PATH,
12007 DEVICED_BATT_INTERFACE, "ChargerType",
12008 charging_state_changed, adapter, NULL);
12009 if (adapter->charging_watch == 0)
12010 error("Cannot add signal watch for ChargerType");
12012 msg = dbus_message_new_method_call(DEVICED_DEST,
12013 DEVICED_BATT_OBJECT_PATH,
12014 DEVICED_BATT_INTERFACE, "ChargerType");
12016 reply = dbus_connection_send_with_reply_and_block(conn,
12019 if (dbus_message_get_args(reply, NULL,
12020 DBUS_TYPE_INT32, &charging_state,
12021 DBUS_TYPE_INVALID) == TRUE) {
12022 set_charging_state(adapter, charging_state);
12024 dbus_message_unref(reply);
12026 error("Reply is NULL");
12028 dbus_message_unref(msg);
12030 error("Unable to create dbus message for charging state");
12032 #endif /* TIZEN_FEATURE_BLUEZ_BATTERY_WATCH */
12035 return btd_adapter_ref(adapter);
12038 static void adapter_remove(struct btd_adapter *adapter)
12041 #ifndef TIZEN_FEATURE_BLUEZ_MODIFY
12042 struct gatt_db *db;
12045 DBG("Removing adapter %s", adapter->path);
12047 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
12048 #ifdef TIZEN_FEATURE_BLUEZ_BATTERY_WATCH
12049 if (adapter->charging_watch > 0) {
12050 g_dbus_remove_watch(btd_get_dbus_connection(),
12051 adapter->charging_watch);
12052 adapter->charging_watch = 0;
12055 if (adapter->charging_timeout) {
12056 g_source_remove(adapter->charging_timeout);
12057 adapter->charging_timeout = 0;
12059 #endif /* TIZEN_FEATURE_BLUEZ_BATTERY_WATCH */
12062 if (adapter->discovery_idle_timeout > 0) {
12063 g_source_remove(adapter->discovery_idle_timeout);
12064 adapter->discovery_idle_timeout = 0;
12067 discovery_cleanup(adapter, 0);
12069 g_slist_free(adapter->connect_list);
12070 adapter->connect_list = NULL;
12072 for (l = adapter->devices; l; l = l->next) {
12073 device_removed_drivers(adapter, l->data);
12074 device_remove(l->data, FALSE);
12077 g_slist_free(adapter->devices);
12078 adapter->devices = NULL;
12080 discovery_cleanup(adapter, 0);
12082 unload_drivers(adapter);
12084 #ifndef TIZEN_FEATURE_BLUEZ_MODIFY
12085 db = btd_gatt_database_get_db(adapter->database);
12086 gatt_db_unregister(db, adapter->db_id);
12087 adapter->db_id = 0;
12089 btd_gatt_database_destroy(adapter->database);
12090 adapter->database = NULL;
12092 btd_adapter_gatt_server_stop(adapter);
12094 btd_adv_manager_destroy(adapter->adv_manager);
12095 adapter->adv_manager = NULL;
12097 btd_adv_monitor_manager_destroy(adapter->adv_monitor_manager);
12098 adapter->adv_monitor_manager = NULL;
12100 btd_battery_provider_manager_destroy(adapter->battery_provider_manager);
12101 adapter->battery_provider_manager = NULL;
12103 g_slist_free(adapter->pin_callbacks);
12104 adapter->pin_callbacks = NULL;
12106 g_slist_free(adapter->msd_callbacks);
12107 adapter->msd_callbacks = NULL;
12109 queue_remove_all(adapter->exp_pending, NULL, NULL, cancel_exp_pending);
12112 const char *adapter_get_path(struct btd_adapter *adapter)
12117 return adapter->path;
12120 const bdaddr_t *btd_adapter_get_address(struct btd_adapter *adapter)
12122 return &adapter->bdaddr;
12125 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
12126 const bdaddr_t *btd_adapter_get_le_address(struct btd_adapter *adapter)
12128 if (adapter->current_settings & MGMT_SETTING_PRIVACY)
12129 return &adapter->rpa;
12130 else if (adapter->le_static_addr.b[5] != 0)
12131 return &adapter->le_static_addr;
12133 return &adapter->bdaddr;
12136 uint8_t btd_adapter_get_le_address_type(struct btd_adapter * adapter)
12138 if (adapter->current_settings & MGMT_SETTING_PRIVACY ||
12139 adapter->le_static_addr.b[5] != 0)
12140 return BDADDR_LE_RANDOM;
12142 return BDADDR_LE_PUBLIC;
12146 static void confirm_name_complete(uint8_t status, uint16_t length,
12147 const void *param, void *user_data)
12149 struct btd_adapter *adapter = user_data;
12151 if (status != MGMT_STATUS_SUCCESS) {
12152 btd_error(adapter->dev_id,
12153 "Failed to confirm name for hci%u: %s (0x%02x)",
12154 adapter->dev_id, mgmt_errstr(status), status);
12158 DBG("Confirm name complete for hci%u", adapter->dev_id);
12161 static void confirm_name(struct btd_adapter *adapter, const bdaddr_t *bdaddr,
12162 uint8_t bdaddr_type, bool name_known)
12164 struct mgmt_cp_confirm_name cp;
12167 ba2str(bdaddr, addr);
12168 DBG("hci%d bdaddr %s name_known %u", adapter->dev_id, addr,
12171 memset(&cp, 0, sizeof(cp));
12172 bacpy(&cp.addr.bdaddr, bdaddr);
12173 cp.addr.type = bdaddr_type;
12174 cp.name_known = name_known;
12177 * This timeout handling is needed since the kernel is stupid
12178 * and forgets to send a command complete response. However in
12179 * case of failures it does send a command status.
12181 if (!mgmt_reply_timeout(adapter->mgmt, MGMT_OP_CONFIRM_NAME,
12182 adapter->dev_id, sizeof(cp), &cp,
12183 confirm_name_complete, adapter, NULL, 2))
12184 btd_error(adapter->dev_id, "Failed to confirm name for hci%u",
12188 static void adapter_msd_notify(struct btd_adapter *adapter,
12189 struct btd_device *dev,
12192 GSList *cb_l, *cb_next;
12193 GSList *msd_l, *msd_next;
12195 for (cb_l = adapter->msd_callbacks; cb_l != NULL; cb_l = cb_next) {
12196 btd_msd_cb_t cb = cb_l->data;
12198 cb_next = g_slist_next(cb_l);
12200 for (msd_l = msd_list; msd_l != NULL; msd_l = msd_next) {
12201 const struct eir_msd *msd = msd_l->data;
12203 msd_next = g_slist_next(msd_l);
12205 cb(adapter, dev, msd->company, msd->data,
12211 static bool is_filter_match(GSList *discovery_filter, struct eir_data *eir_data,
12215 bool got_match = false;
12217 for (l = discovery_filter; l != NULL && got_match != true;
12218 l = g_slist_next(l)) {
12219 struct discovery_client *client = l->data;
12220 struct discovery_filter *item = client->discovery_filter;
12223 * If one of currently running scans is regular scan, then
12224 * return all devices as matches
12231 /* if someone started discovery with empty uuids, he wants all
12232 * devices in given proximity.
12237 for (m = item->uuids; m != NULL && got_match != true;
12238 m = g_slist_next(m)) {
12239 /* m->data contains string representation of
12242 if (g_slist_find_custom(eir_data->services,
12250 /* we have service match, check proximity */
12251 if (item->rssi == DISTANCE_VAL_INVALID ||
12252 item->rssi <= rssi ||
12253 item->pathloss == DISTANCE_VAL_INVALID ||
12254 (eir_data->tx_power != 127 &&
12255 eir_data->tx_power - rssi <= item->pathloss))
12265 static void filter_duplicate_data(void *data, void *user_data)
12267 struct discovery_client *client = data;
12268 bool *duplicate = user_data;
12270 if (*duplicate || !client->discovery_filter)
12273 *duplicate = client->discovery_filter->duplicate;
12276 #ifndef TIZEN_FEATURE_BLUEZ_MODIFY
12277 static bool device_is_discoverable(struct btd_adapter *adapter,
12278 struct eir_data *eir, const char *addr,
12279 uint8_t bdaddr_type)
12284 if (bdaddr_type == BDADDR_BREDR || adapter->filtered_discovery)
12285 discoverable = true;
12287 discoverable = eir->flags & (EIR_LIM_DISC | EIR_GEN_DISC);
12290 * Mark as not discoverable if no client has requested discovery and
12291 * report has not set any discoverable flags.
12293 if (!adapter->discovery_list && !discoverable)
12296 /* Do a prefix match for both address and name if pattern is set */
12297 for (l = adapter->discovery_list; l; l = g_slist_next(l)) {
12298 struct dicovery_client *client = l->data;
12299 struct discovery_filter *filter = client->discovery_filter;
12300 size_t pattern_len;
12302 if (!filter || !filter->pattern)
12305 /* Reset discoverable if a client has a pattern filter */
12306 discoverable = false;
12308 pattern_len = strlen(filter->pattern);
12312 if (!strncmp(filter->pattern, addr, pattern_len))
12315 if (eir->name && !strncmp(filter->pattern, eir->name,
12320 return discoverable;
12324 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
12325 void btd_adapter_device_found(struct btd_adapter *adapter,
12326 const bdaddr_t *bdaddr,
12327 uint8_t bdaddr_type, int8_t rssi,
12328 uint8_t adv_type, uint32_t flags,
12329 const uint8_t *data, uint8_t data_len,
12332 void btd_adapter_device_found(struct btd_adapter *adapter,
12333 const bdaddr_t *bdaddr,
12334 uint8_t bdaddr_type, int8_t rssi,
12335 uint8_t adv_type, uint32_t flags,
12336 const uint8_t *data, uint8_t data_len,
12340 struct btd_device *dev;
12341 #ifndef TIZEN_FEATURE_BLUEZ_MODIFY
12342 struct bt_ad *ad = NULL;
12344 struct eir_data eir_data;
12345 #ifndef TIZEN_FEATURE_BLUEZ_MODIFY
12346 bool name_known, discoverable;
12347 bool not_connectable;
12351 #ifdef TIZEN_FEATURE_PLATFROM_SCAN_FILTER
12352 uint8_t allow_report;
12357 // bool not_connectable;
12358 bool name_resolve_failed;
12360 bool duplicate = false;
12362 confirm = (flags & MGMT_DEV_FOUND_CONFIRM_NAME);
12363 legacy = (flags & MGMT_DEV_FOUND_LEGACY_PAIRING);
12364 #ifndef TIZEN_FEATURE_BLUEZ_MODIFY
12365 not_connectable = (flags & MGMT_DEV_FOUND_NOT_CONNECTABLE);
12367 name_resolve_failed = (flags & MGMT_DEV_FOUND_NAME_REQUEST_FAILED);
12368 scan_rsp = (flags & MGMT_DEV_FOUND_SCAN_RSP);
12370 #ifndef TIZEN_FEATURE_BLUEZ_MODIFY
12371 struct queue *matched_monitors = NULL;
12373 if (!btd_adv_monitor_offload_enabled(adapter->adv_monitor_manager) ||
12374 (MGMT_VERSION(mgmt_version, mgmt_revision) <
12375 MGMT_VERSION(1, 22))) {
12376 if (bdaddr_type != BDADDR_BREDR)
12377 ad = bt_ad_new_with_data(data_len, data);
12379 /* During the background scanning, update the device only when
12380 * the data match at least one Adv monitor
12383 matched_monitors = btd_adv_monitor_content_filter(
12384 adapter->adv_monitor_manager,
12388 monitoring = matched_monitors ? true : false;
12392 if (!adapter->discovering && !monitoring)
12395 memset(&eir_data, 0, sizeof(eir_data));
12396 eir_parse(&eir_data, data, data_len);
12397 ba2str(bdaddr, addr);
12398 #ifndef TIZEN_FEATURE_BLUEZ_MODIFY
12399 discoverable = device_is_discoverable(adapter, &eir_data, addr,
12404 #ifdef TIZEN_FEATURE_PLATFROM_SCAN_FILTER
12405 /* Check if the any filter policy */
12406 allow_report = validate_for_filter_policy(adapter, &eir_data, addr);
12407 if (allow_report == NONE_REPORT &&
12408 ((adapter->scan_type == LE_ACTIVE_SCAN && adv_type == ADV_TYPE_SCAN_RESPONSE) ||
12409 adapter->scan_type == LE_PASSIVE_SCAN)) {
12410 eir_data_free(&eir_data);
12414 dev = btd_adapter_find_device(adapter, bdaddr, bdaddr_type);
12417 * If no client has requested discovery or the device is
12418 * not marked as discoverable, then do not create new
12422 /* In case of being just a scan response don't attempt to create
12426 eir_data_free(&eir_data);
12430 /* Monitor Devices advertising Broadcast Announcements if the
12431 * adapter is capable of synchronizing to it.
12433 if (eir_get_service_data(&eir_data, BCAA_SERVICE_UUID) &&
12434 btd_adapter_has_settings(adapter,
12435 MGMT_SETTING_ISO_SYNC_RECEIVER))
12437 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
12438 /*DBG("List BREDR:%p LE:%p Discoverable:%d", adapter->discovery_list,
12439 adapter->le_discovery_list, discoverable);*/
12440 if ((adapter->discovery_list == NULL &&
12441 adapter->le_discovery_list == NULL)) {
12442 DBG("discovery list is NULL");
12443 eir_data_free(&eir_data);
12447 if (!adapter->discovery_list || !discoverable &&
12448 !matched_monitors && !eir_data.rsi) {
12449 eir_data_free(&eir_data);
12454 dev = adapter_create_device(adapter, bdaddr, bdaddr_type);
12458 btd_error(adapter->dev_id,
12459 "Unable to create object for found device %s", addr);
12460 eir_data_free(&eir_data);
12464 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
12465 if (device_get_rpa_exist(dev) == true)
12466 bdaddr_type = BDADDR_LE_RANDOM;
12468 device_update_last_seen(dev, bdaddr_type);
12470 device_update_last_seen(dev, bdaddr_type, !not_connectable);
12474 * FIXME: We need to check for non-zero flags first because
12475 * older kernels send separate adv_ind and scan_rsp. Newer
12476 * kernels send them merged, so once we know which mgmt version
12477 * supports this we can make the non-zero check conditional.
12479 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
12480 if (bdaddr_type == BDADDR_LE_PUBLIC && eir_data.flags &&
12481 !(eir_data.flags & EIR_BREDR_UNSUP)) {
12482 device_set_bredr_support(dev);
12483 /* Update last seen for BR/EDR in case its flag is set */
12484 device_update_last_seen(dev, BDADDR_BREDR);
12487 if (bdaddr_type != BDADDR_BREDR && eir_data.flags &&
12488 !(eir_data.flags & EIR_BREDR_UNSUP)) {
12489 device_set_bredr_support(dev);
12490 /* Update last seen for BR/EDR in case its flag is set */
12491 device_update_last_seen(dev, BDADDR_BREDR, !not_connectable);
12495 if (eir_data.name != NULL && eir_data.name_complete)
12496 device_store_cached_name(dev, eir_data.name);
12499 * Only skip devices that are not connected, are temporary, and there
12500 * is no active discovery session ongoing and no matched Adv monitors
12502 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
12503 if (device_is_temporary(dev) && adapter->discovery_list == NULL &&
12504 adapter->le_discovery_list == NULL) {
12505 DBG("discovery list is NULL");
12506 eir_data_free(&eir_data);
12510 device_set_last_addr_type(dev, bdaddr_type);
12511 device_set_ipsp_connected(dev, FALSE, NULL);
12513 if (!btd_device_is_connected(dev) &&
12514 (device_is_temporary(dev) && !adapter->discovery_list) &&
12516 eir_data_free(&eir_data);
12521 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
12522 if (bdaddr_type == BDADDR_BREDR) {
12523 if (adapter->filtered_discovery &&
12524 !is_filter_match(adapter->discovery_list, &eir_data, rssi)) {
12526 /* If there is no matched Adv monitors, don't continue if not
12527 * discoverable or if active discovery filter don't match.
12529 if (!eir_data.rsi && !monitoring && (!discoverable ||
12530 (adapter->filtered_discovery && !is_filter_match(
12531 adapter->discovery_list, &eir_data, rssi)))) {
12533 eir_data_free(&eir_data);
12537 device_set_legacy(dev, legacy);
12539 if (name_resolve_failed)
12540 device_name_resolve_fail(dev);
12542 if (adapter->filtered_discovery)
12543 device_set_rssi_with_delta(dev, rssi, 0);
12545 device_set_rssi(dev, rssi);
12547 if (eir_data.tx_power != 127)
12548 device_set_tx_power(dev, eir_data.tx_power);
12549 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
12553 if (eir_data.appearance != 0)
12554 device_set_appearance(dev, eir_data.appearance);
12556 /* Report an unknown name to the kernel even if there is a short name
12557 * known, but still update the name with the known short name. */
12558 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
12559 if (eir_data.name_complete)
12560 name_known = device_name_known(dev);
12562 name_known = false;
12564 name_known = device_name_known(dev);
12567 if (eir_data.name && (eir_data.name_complete || !name_known))
12568 btd_device_device_set_name(dev, eir_data.name);
12570 if (eir_data.class != 0)
12571 device_set_class(dev, eir_data.class);
12573 if (eir_data.did_source || eir_data.did_vendor ||
12574 eir_data.did_product || eir_data.did_version)
12575 btd_device_set_pnpid(dev, eir_data.did_source,
12576 eir_data.did_vendor,
12577 eir_data.did_product,
12578 eir_data.did_version);
12580 device_add_eir_uuids(dev, eir_data.services);
12582 if (adapter->discovery_list)
12583 g_slist_foreach(adapter->discovery_list, filter_duplicate_data,
12585 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
12586 if (eir_data.flags != 0)
12587 device_set_remote_feature_flag(dev, eir_data.flags);
12589 if (bdaddr_type == BDADDR_BREDR)
12590 device_set_manufacturer_info(dev, &eir_data);
12592 /* if the application has registered for iBeacon report,
12593 * then send ibeacon report along with advertisement report */
12594 device_set_adv_report_info(dev, (void*)data, data_len, adv_type, rssi);
12598 if (eir_data.msd_list) {
12599 device_set_manufacturer_data(dev, eir_data.msd_list, duplicate);
12600 adapter_msd_notify(adapter, dev, eir_data.msd_list);
12603 if (eir_data.sd_list)
12604 device_set_service_data(dev, eir_data.sd_list, duplicate);
12606 if (eir_data.data_list)
12607 device_set_data(dev, eir_data.data_list, duplicate);
12609 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
12610 if (bdaddr_type != BDADDR_BREDR && adv_type != ADV_TYPE_SCAN_RESPONSE) {
12611 device_set_flags(dev, eir_data.flags);
12612 device_set_le_connectable(dev, adv_type);
12615 if (bdaddr_type != BDADDR_BREDR)
12616 device_set_flags(dev, eir_data.flags);
12619 eir_data_free(&eir_data);
12621 #ifndef TIZEN_FEATURE_BLUEZ_MODIFY
12622 /* After the device is updated, notify the matched Adv monitors */
12623 if (matched_monitors) {
12624 btd_adv_monitor_notify_monitors(adapter->adv_monitor_manager,
12625 dev, rssi, matched_monitors);
12626 queue_destroy(matched_monitors, NULL);
12627 matched_monitors = NULL;
12631 * Only if at least one client has requested discovery, maintain
12632 * list of found devices and name confirming for legacy devices.
12633 * Otherwise, this is an event from passive discovery and we
12634 * should check if the device needs connecting to.
12636 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
12637 if (!adapter->discovery_list && !adapter->le_discovery_list)
12639 if (!adapter->discovery_list)
12643 if (g_slist_find(adapter->discovery_found, dev))
12646 /* If name is unknown but it's not allowed to resolve, don't send
12647 * MGMT_OP_CONFIRM_NAME.
12649 if (confirm && (name_known || device_is_name_resolve_allowed(dev)))
12650 confirm_name(adapter, bdaddr, bdaddr_type, name_known);
12652 adapter->discovery_found = g_slist_prepend(adapter->discovery_found,
12658 #ifndef TIZEN_FEATURE_BLUEZ_MODIFY
12659 /* Ignore non-connectable events */
12660 if (not_connectable)
12665 * If we're in the process of stopping passive scanning and
12666 * connecting another (or maybe even the same) LE device just
12669 if (adapter->connect_le)
12673 * If kernel background scan is used then the kernel is
12674 * responsible for connecting.
12676 if (btd_has_kernel_features(KERNEL_CONN_CONTROL))
12680 * If this is an LE device that's not connected and part of the
12681 * connect_list stop passive scanning so that a connection
12682 * attempt to it can be made
12684 if (bdaddr_type != BDADDR_BREDR && !btd_device_is_connected(dev) &&
12685 g_slist_find(adapter->connect_list, dev)) {
12686 adapter->connect_le = dev;
12687 stop_passive_scanning(adapter);
12691 static void device_found_callback(uint16_t index, uint16_t length,
12692 const void *param, void *user_data)
12694 const struct mgmt_ev_device_found *ev = param;
12695 struct btd_adapter *adapter = user_data;
12696 const uint8_t *eir;
12700 if (length < sizeof(*ev)) {
12701 btd_error(adapter->dev_id,
12702 "Too short device found event (%u bytes)", length);
12706 eir_len = btohs(ev->eir_len);
12707 if (length != sizeof(*ev) + eir_len) {
12708 btd_error(adapter->dev_id,
12709 "Device found event size mismatch (%u != %zu)",
12710 length, sizeof(*ev) + eir_len);
12719 flags = le32_to_cpu(ev->flags);
12721 ba2str(&ev->addr.bdaddr, addr);
12722 DBG("hci%u addr %s, rssi %d flags 0x%04x eir_len %u",
12723 index, addr, ev->rssi, flags, eir_len);
12725 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
12726 btd_adapter_device_found(adapter, &ev->addr.bdaddr,
12727 ev->addr.type, ev->rssi, 0, flags,
12728 eir, eir_len, false);
12730 btd_adapter_device_found(adapter, &ev->addr.bdaddr,
12731 ev->addr.type, ev->rssi, 0, flags,
12732 eir, eir_len, false);
12736 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
12737 static void le_device_found_callback(uint16_t index, uint16_t length,
12738 const void *param, void *user_data)
12740 const struct mgmt_ev_le_device_found *ev = param;
12741 struct btd_adapter *adapter = user_data;
12742 const uint8_t *eir;
12747 if (length < sizeof(*ev)) {
12748 error("Too short device found event (%u bytes)", length);
12752 eir_len = btohs(ev->eir_len);
12753 if (length != sizeof(*ev) + eir_len) {
12754 error("Device found event size mismatch (%u != %zu)",
12755 length, sizeof(*ev) + eir_len);
12764 flags = btohl(ev->flags);
12766 ba2str(&ev->addr.bdaddr, addr);
12767 /*DBG("hci%u addr %s, rssi %d flags 0x%04x eir_len %u",
12768 index, addr, ev->rssi, flags, eir_len);*/
12770 btd_adapter_device_found(adapter, &ev->addr.bdaddr, ev->addr.type,
12771 ev->rssi, ev->adv_type, flags,
12772 eir, eir_len, false);
12776 struct agent *adapter_get_agent(struct btd_adapter *adapter)
12778 return agent_get(NULL);
12781 static void adapter_remove_connection(struct btd_adapter *adapter,
12782 struct btd_device *device,
12783 uint8_t bdaddr_type)
12785 bool remove_device = false;
12789 if (!g_slist_find(adapter->connections, device)) {
12790 btd_error(adapter->dev_id, "No matching connection for device");
12794 device_remove_connection(device, bdaddr_type, &remove_device);
12796 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
12797 if (device_is_authenticating(device, bdaddr_type))
12799 if (device_is_authenticating(device))
12801 device_cancel_authentication(device, TRUE);
12803 /* If another bearer is still connected */
12804 if (btd_device_is_connected(device))
12807 adapter->connections = g_slist_remove(adapter->connections, device);
12809 if (remove_device) {
12810 const char *path = device_get_path(device);
12812 DBG("Removing temporary device %s", path);
12813 btd_adapter_remove_device(adapter, device);
12816 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
12817 DBG("isPaired %d, isBonded %d", device_is_paired(device, bdaddr_type),
12818 device_is_bonded(device, bdaddr_type));
12819 if ((device_is_temporary(device) && !device_is_retrying(device)) ||
12820 (!device_is_bonded(device, bdaddr_type))) {
12822 const char *path = device_get_path(device);
12824 DBG("Removing temporary device %s", path);
12826 /* device_is_paired is added incase of tempoary bonded
12827 * oop file transfer in that device is not bonded it's paired.
12829 if (!(device_is_bonded(device, bdaddr_type) ||
12830 device_is_paired(device, bdaddr_type))) {
12831 DBG("addr type %d, bonded", bdaddr_type);
12835 btd_adapter_unpair_device(adapter, device);
12840 static void adapter_stop(struct btd_adapter *adapter)
12842 /* check pending requests */
12843 reply_pending_requests(adapter);
12845 cancel_passive_scanning(adapter);
12847 remove_discovery_list(adapter);
12849 discovery_cleanup(adapter, 0);
12851 adapter->filtered_discovery = false;
12852 adapter->no_scan_restart_delay = false;
12853 g_free(adapter->current_discovery_filter);
12854 adapter->current_discovery_filter = NULL;
12856 set_discovery_discoverable(adapter, false);
12857 adapter->discovering = false;
12859 while (adapter->connections) {
12860 struct btd_device *device = adapter->connections->data;
12861 uint8_t addr_type = btd_device_get_bdaddr_type(device);
12863 adapter_remove_connection(adapter, device, BDADDR_BREDR);
12864 if (addr_type != BDADDR_BREDR)
12865 adapter_remove_connection(adapter, device, addr_type);
12868 g_dbus_emit_property_changed(dbus_conn, adapter->path,
12869 ADAPTER_INTERFACE, "Discovering");
12870 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
12871 g_dbus_emit_property_changed(dbus_conn, adapter->path,
12872 ADAPTER_INTERFACE, "LEDiscovering");
12875 if (adapter->dev_class) {
12876 /* the kernel should reset the class of device when powering
12877 * down, but it does not. So force it here ... */
12878 adapter->dev_class = 0;
12879 g_dbus_emit_property_changed(dbus_conn, adapter->path,
12880 ADAPTER_INTERFACE, "Class");
12883 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
12884 advertiser_cleanup(adapter);
12886 g_dbus_emit_property_changed(dbus_conn, adapter->path,
12887 ADAPTER_INTERFACE, "Powered");
12888 g_dbus_emit_property_changed(dbus_conn, adapter->path,
12892 DBG("adapter %s has been disabled", adapter->path);
12895 int btd_register_adapter_driver(struct btd_adapter_driver *driver)
12897 if (driver->experimental && !(g_dbus_get_flags() &
12898 G_DBUS_FLAG_ENABLE_EXPERIMENTAL)) {
12899 DBG("D-Bus experimental not enabled");
12903 adapter_drivers = g_slist_append(adapter_drivers, driver);
12905 if (driver->probe == NULL)
12908 adapter_foreach(probe_driver, driver);
12913 static void unload_driver(struct btd_adapter *adapter, gpointer data)
12915 struct btd_adapter_driver *driver = data;
12917 if (driver->remove)
12918 driver->remove(adapter);
12920 adapter->drivers = g_slist_remove(adapter->drivers, data);
12923 void btd_unregister_adapter_driver(struct btd_adapter_driver *driver)
12925 adapter_drivers = g_slist_remove(adapter_drivers, driver);
12927 adapter_foreach(unload_driver, driver);
12930 static void agent_auth_cb(struct agent *agent, DBusError *derr,
12933 struct btd_adapter *adapter = user_data;
12934 struct service_auth *auth = g_queue_pop_head(adapter->auths);
12937 DBG("No pending authorization");
12941 auth->cb(derr, auth->user_data);
12944 agent_unref(auth->agent);
12948 /* Stop processing if queue is empty */
12949 if (g_queue_is_empty(adapter->auths)) {
12950 if (adapter->auth_idle_id > 0)
12951 g_source_remove(adapter->auth_idle_id);
12955 if (adapter->auth_idle_id > 0)
12958 adapter->auth_idle_id = g_idle_add(process_auth_queue, adapter);
12961 static gboolean process_auth_queue(gpointer user_data)
12963 struct btd_adapter *adapter = user_data;
12966 adapter->auth_idle_id = 0;
12968 dbus_error_init(&err);
12969 dbus_set_error_const(&err, ERROR_INTERFACE ".Rejected", NULL);
12971 while (!g_queue_is_empty(adapter->auths)) {
12972 struct service_auth *auth = adapter->auths->head->data;
12973 struct btd_device *device = auth->device;
12975 /* Wait services to be resolved before asking authorization */
12976 if (auth->svc_id > 0) {
12977 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
12978 DBG("Wait services to be resolved before asking authorization");
12982 if (!btd_adapter_is_uuid_allowed(adapter, auth->uuid)) {
12983 auth->cb(&err, auth->user_data);
12987 #ifndef TIZEN_FEATURE_BLUEZ_MODIFY
12988 if (btd_device_is_trusted(device) == TRUE) {
12990 if (btd_device_is_trusted(device) == TRUE
12991 || device_is_profile_trusted(device, auth->uuid)
12992 || btd_opts.pin_code) {
12993 /* In headless device(pin_code is existing),
12994 no need to request to agent */
12996 auth->cb(NULL, auth->user_data);
13000 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
13001 /* If Profile is Blocked, Simply reject Authorization*/
13002 if (device_is_profile_blocked(device, auth->uuid) == TRUE) {
13003 auth->cb(&err, auth->user_data);
13008 /* If agent is set authorization is already ongoing */
13012 auth->agent = agent_get(NULL);
13013 if (auth->agent == NULL) {
13014 btd_warn(adapter->dev_id,
13015 "Authentication attempt without agent");
13016 auth->cb(&err, auth->user_data);
13020 if (agent_authorize_service(auth->agent, device, auth->uuid,
13021 agent_auth_cb, adapter, NULL) < 0) {
13022 auth->cb(&err, auth->user_data);
13030 agent_unref(auth->agent);
13034 g_queue_pop_head(adapter->auths);
13037 dbus_error_free(&err);
13042 static void svc_complete(struct btd_device *dev, int err, void *user_data)
13044 struct service_auth *auth = user_data;
13045 struct btd_adapter *adapter = auth->adapter;
13049 if (adapter->auth_idle_id != 0)
13052 adapter->auth_idle_id = g_idle_add(process_auth_queue, adapter);
13055 static int adapter_authorize(struct btd_adapter *adapter, const bdaddr_t *dst,
13057 adapter_authorize_type check_for_connection,
13058 service_auth_cb cb, void *user_data)
13060 struct service_auth *auth;
13061 struct btd_device *device;
13062 static guint id = 0;
13064 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
13065 if (!strncmp(uuid, L2CAP_LE_UUID_SUBSTR, strlen(L2CAP_LE_UUID_SUBSTR)))
13066 device = btd_adapter_find_device(adapter, dst, BDADDR_LE_PUBLIC);
13068 device = btd_adapter_find_device(adapter, dst, BDADDR_BREDR);
13070 device = btd_adapter_find_device(adapter, dst, BDADDR_BREDR);
13076 if (device_is_disconnecting(device)) {
13077 DBG("Authorization request while disconnecting");
13081 /* Device connected? */
13082 if (check_for_connection && !g_slist_find(adapter->connections, device))
13083 btd_error(adapter->dev_id,
13084 "Authorization request for non-connected device!?");
13086 auth = g_try_new0(struct service_auth, 1);
13091 auth->user_data = user_data;
13093 auth->device = device;
13094 auth->adapter = adapter;
13096 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
13097 if (check_for_connection &&
13098 strncmp(uuid, L2CAP_LE_UUID_SUBSTR, strlen(L2CAP_LE_UUID_SUBSTR)))
13100 if (check_for_connection)
13102 auth->svc_id = device_wait_for_svc_complete(device, svc_complete, auth);
13104 if (adapter->auth_idle_id == 0)
13105 adapter->auth_idle_id = g_idle_add(process_auth_queue, adapter);
13108 g_queue_push_tail(adapter->auths, auth);
13113 guint btd_request_authorization(const bdaddr_t *src, const bdaddr_t *dst,
13114 const char *uuid, service_auth_cb cb,
13117 struct btd_adapter *adapter;
13120 if (bacmp(src, BDADDR_ANY) != 0) {
13121 adapter = adapter_find(src);
13125 return adapter_authorize(adapter, dst, uuid,
13126 ADAPTER_AUTHORIZE_CHECK_CONNECTED, cb, user_data);
13129 for (l = adapters; l != NULL; l = g_slist_next(l)) {
13134 id = adapter_authorize(adapter, dst, uuid,
13135 ADAPTER_AUTHORIZE_CHECK_CONNECTED, cb, user_data);
13143 guint btd_request_authorization_cable_configured(const bdaddr_t *src, const bdaddr_t *dst,
13144 const char *uuid, service_auth_cb cb,
13147 struct btd_adapter *adapter;
13149 if (bacmp(src, BDADDR_ANY) == 0)
13152 adapter = adapter_find(src);
13156 return adapter_authorize(adapter, dst, uuid,
13157 ADAPTER_AUTHORIZE_DISCONNECTED, cb, user_data);
13160 static struct service_auth *find_authorization(guint id)
13165 for (l = adapters; l != NULL; l = g_slist_next(l)) {
13166 struct btd_adapter *adapter = l->data;
13168 for (l2 = adapter->auths->head; l2 != NULL; l2 = l2->next) {
13169 struct service_auth *auth = l2->data;
13171 if (auth->id == id)
13179 int btd_cancel_authorization(guint id)
13181 struct service_auth *auth;
13183 auth = find_authorization(id);
13187 if (auth->svc_id > 0)
13188 device_remove_svc_complete_callback(auth->device,
13191 g_queue_remove(auth->adapter->auths, auth);
13194 agent_cancel(auth->agent);
13195 agent_unref(auth->agent);
13203 int btd_adapter_restore_powered(struct btd_adapter *adapter)
13207 powered = btd_adapter_get_powered(adapter);
13208 if (adapter->power_state == ADAPTER_POWER_STATE_OFF_BLOCKED &&
13209 rfkill_get_blocked(adapter->dev_id) == 0) {
13210 adapter_set_power_state(adapter,
13212 ADAPTER_POWER_STATE_ON :
13213 ADAPTER_POWER_STATE_OFF);
13219 set_mode(adapter, MGMT_OP_SET_POWERED, 0x01);
13224 int btd_adapter_set_blocked(struct btd_adapter *adapter)
13226 adapter_set_power_state(adapter, ADAPTER_POWER_STATE_OFF_BLOCKED);
13230 void btd_adapter_register_pin_cb(struct btd_adapter *adapter,
13231 btd_adapter_pin_cb_t cb)
13233 adapter->pin_callbacks = g_slist_prepend(adapter->pin_callbacks, cb);
13236 void btd_adapter_unregister_pin_cb(struct btd_adapter *adapter,
13237 btd_adapter_pin_cb_t cb)
13239 adapter->pin_callbacks = g_slist_remove(adapter->pin_callbacks, cb);
13242 void btd_adapter_unregister_msd_cb(struct btd_adapter *adapter,
13245 adapter->msd_callbacks = g_slist_remove(adapter->msd_callbacks, cb);
13248 void btd_adapter_register_msd_cb(struct btd_adapter *adapter,
13251 adapter->msd_callbacks = g_slist_prepend(adapter->msd_callbacks, cb);
13254 int btd_adapter_set_fast_connectable(struct btd_adapter *adapter,
13257 if (!btd_adapter_get_powered(adapter))
13260 set_mode(adapter, MGMT_OP_SET_FAST_CONNECTABLE, enable ? 0x01 : 0x00);
13265 int btd_adapter_read_clock(struct btd_adapter *adapter, const bdaddr_t *bdaddr,
13266 int which, int timeout, uint32_t *clock,
13267 uint16_t *accuracy)
13269 if (!btd_adapter_get_powered(adapter))
13275 int btd_adapter_remove_bonding(struct btd_adapter *adapter,
13276 const bdaddr_t *bdaddr, uint8_t bdaddr_type)
13278 struct mgmt_cp_unpair_device cp;
13280 memset(&cp, 0, sizeof(cp));
13281 bacpy(&cp.addr.bdaddr, bdaddr);
13282 cp.addr.type = bdaddr_type;
13285 if (mgmt_send(adapter->mgmt, MGMT_OP_UNPAIR_DEVICE,
13286 adapter->dev_id, sizeof(cp), &cp,
13287 NULL, NULL, NULL) > 0)
13293 static void pincode_reply_complete(uint8_t status, uint16_t length,
13294 const void *param, void *user_data)
13296 struct btd_device *device = user_data;
13298 /* If the MGMT_OP_PIN_CODE_REPLY command is acknowledged, move the
13299 * starting time to that point. This give a better sense of time
13300 * evaluating the pincode. */
13301 device_bonding_restart_timer(device);
13304 int btd_adapter_pincode_reply(struct btd_adapter *adapter,
13305 const bdaddr_t *bdaddr,
13306 const char *pin, size_t pin_len)
13308 struct btd_device *device;
13312 ba2str(bdaddr, addr);
13313 DBG("hci%u addr %s pinlen %zu", adapter->dev_id, addr, pin_len);
13316 struct mgmt_cp_pin_code_neg_reply cp;
13318 memset(&cp, 0, sizeof(cp));
13319 bacpy(&cp.addr.bdaddr, bdaddr);
13320 cp.addr.type = BDADDR_BREDR;
13322 id = mgmt_reply(adapter->mgmt, MGMT_OP_PIN_CODE_NEG_REPLY,
13323 adapter->dev_id, sizeof(cp), &cp,
13326 struct mgmt_cp_pin_code_reply cp;
13331 memset(&cp, 0, sizeof(cp));
13332 bacpy(&cp.addr.bdaddr, bdaddr);
13333 cp.addr.type = BDADDR_BREDR;
13334 cp.pin_len = pin_len;
13335 memcpy(cp.pin_code, pin, pin_len);
13337 /* Since a pincode was requested, update the starting time to
13338 * the point where the pincode is provided. */
13339 device = btd_adapter_find_device(adapter, bdaddr, BDADDR_BREDR);
13340 device_bonding_restart_timer(device);
13342 id = mgmt_reply(adapter->mgmt, MGMT_OP_PIN_CODE_REPLY,
13343 adapter->dev_id, sizeof(cp), &cp,
13344 pincode_reply_complete, device, NULL);
13353 int btd_adapter_confirm_reply(struct btd_adapter *adapter,
13354 const bdaddr_t *bdaddr, uint8_t bdaddr_type,
13357 struct mgmt_cp_user_confirm_reply cp;
13361 ba2str(bdaddr, addr);
13362 DBG("hci%u addr %s success %d", adapter->dev_id, addr, success);
13365 opcode = MGMT_OP_USER_CONFIRM_REPLY;
13367 opcode = MGMT_OP_USER_CONFIRM_NEG_REPLY;
13369 memset(&cp, 0, sizeof(cp));
13370 bacpy(&cp.addr.bdaddr, bdaddr);
13371 cp.addr.type = bdaddr_type;
13373 if (mgmt_reply(adapter->mgmt, opcode, adapter->dev_id, sizeof(cp), &cp,
13374 NULL, NULL, NULL) > 0)
13380 static void user_confirm_request_callback(uint16_t index, uint16_t length,
13381 const void *param, void *user_data)
13383 const struct mgmt_ev_user_confirm_request *ev = param;
13384 struct btd_adapter *adapter = user_data;
13385 struct btd_device *device;
13389 if (length < sizeof(*ev)) {
13390 btd_error(adapter->dev_id,
13391 "Too small user confirm request event");
13395 ba2str(&ev->addr.bdaddr, addr);
13396 DBG("hci%u %s confirm_hint %u", adapter->dev_id, addr,
13398 device = btd_adapter_get_device(adapter, &ev->addr.bdaddr,
13401 btd_error(adapter->dev_id,
13402 "Unable to get device object for %s", addr);
13406 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
13407 device_set_auth_addr_type(device, ev->addr.type);
13409 err = device_confirm_passkey(device, ev->addr.type, btohl(ev->value),
13412 btd_error(adapter->dev_id,
13413 "device_confirm_passkey: %s", strerror(-err));
13414 btd_adapter_confirm_reply(adapter, &ev->addr.bdaddr,
13415 ev->addr.type, FALSE);
13419 int btd_adapter_passkey_reply(struct btd_adapter *adapter,
13420 const bdaddr_t *bdaddr, uint8_t bdaddr_type,
13426 ba2str(bdaddr, addr);
13427 DBG("hci%u addr %s passkey %06u", adapter->dev_id, addr, passkey);
13429 if (passkey == INVALID_PASSKEY) {
13430 struct mgmt_cp_user_passkey_neg_reply cp;
13432 memset(&cp, 0, sizeof(cp));
13433 bacpy(&cp.addr.bdaddr, bdaddr);
13434 cp.addr.type = bdaddr_type;
13436 id = mgmt_reply(adapter->mgmt, MGMT_OP_USER_PASSKEY_NEG_REPLY,
13437 adapter->dev_id, sizeof(cp), &cp,
13440 struct mgmt_cp_user_passkey_reply cp;
13442 memset(&cp, 0, sizeof(cp));
13443 bacpy(&cp.addr.bdaddr, bdaddr);
13444 cp.addr.type = bdaddr_type;
13445 cp.passkey = htobl(passkey);
13447 id = mgmt_reply(adapter->mgmt, MGMT_OP_USER_PASSKEY_REPLY,
13448 adapter->dev_id, sizeof(cp), &cp,
13458 static void user_passkey_request_callback(uint16_t index, uint16_t length,
13459 const void *param, void *user_data)
13461 const struct mgmt_ev_user_passkey_request *ev = param;
13462 struct btd_adapter *adapter = user_data;
13463 struct btd_device *device;
13467 if (length < sizeof(*ev)) {
13468 btd_error(adapter->dev_id, "Too small passkey request event");
13472 ba2str(&ev->addr.bdaddr, addr);
13473 DBG("hci%u %s", index, addr);
13475 device = btd_adapter_get_device(adapter, &ev->addr.bdaddr,
13478 btd_error(adapter->dev_id,
13479 "Unable to get device object for %s", addr);
13483 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
13484 device_set_auth_addr_type(device, ev->addr.type);
13486 err = device_request_passkey(device, ev->addr.type);
13488 btd_error(adapter->dev_id,
13489 "device_request_passkey: %s", strerror(-err));
13490 btd_adapter_passkey_reply(adapter, &ev->addr.bdaddr,
13491 ev->addr.type, INVALID_PASSKEY);
13495 static void user_passkey_notify_callback(uint16_t index, uint16_t length,
13496 const void *param, void *user_data)
13498 const struct mgmt_ev_passkey_notify *ev = param;
13499 struct btd_adapter *adapter = user_data;
13500 struct btd_device *device;
13505 if (length < sizeof(*ev)) {
13506 btd_error(adapter->dev_id, "Too small passkey notify event");
13510 ba2str(&ev->addr.bdaddr, addr);
13511 DBG("hci%u %s", index, addr);
13513 device = btd_adapter_get_device(adapter, &ev->addr.bdaddr,
13516 btd_error(adapter->dev_id,
13517 "Unable to get device object for %s", addr);
13521 passkey = get_le32(&ev->passkey);
13523 DBG("passkey %06u entered %u", passkey, ev->entered);
13525 err = device_notify_passkey(device, ev->addr.type, passkey,
13528 btd_error(adapter->dev_id,
13529 "device_notify_passkey: %s", strerror(-err));
13532 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
13533 static void rssi_alert_callback(uint16_t index, uint16_t length,
13534 const void *param, void *user_data)
13536 const struct mgmt_ev_vendor_specific_rssi_alert *ev = param;
13537 struct btd_adapter *adapter = user_data;
13539 char *bt_addr = NULL;
13540 int link_type = -1;
13541 int alert_type = -1;
13544 if (length < sizeof(*ev)) {
13545 error("Too small rssi alert event");
13549 ba2str(&ev->bdaddr, addr);
13550 DBG("hci%u %s %d", index, addr, ev->link_type);
13551 DBG("RSSI Alert Params [%d %d]", ev->alert_type, ev->rssi_dbm);
13553 bt_addr = (char *)&addr;
13554 link_type = ev->link_type;
13555 alert_type = ev->alert_type;
13556 rssi_dbm = ev->rssi_dbm;
13557 g_dbus_emit_signal(dbus_conn, adapter->path,
13558 ADAPTER_INTERFACE, "RssiAlert",
13559 DBUS_TYPE_STRING, &bt_addr,
13560 DBUS_TYPE_INT32, &link_type,
13561 DBUS_TYPE_INT32, &alert_type,
13562 DBUS_TYPE_INT32, &rssi_dbm,
13563 DBUS_TYPE_INVALID);
13566 static void get_raw_rssi_callback(uint16_t index, uint16_t length,
13567 const void *param, void *user_data)
13569 const struct mgmt_cc_rp_get_raw_rssi *ev = param;
13570 struct btd_adapter *adapter = user_data;
13572 char *bt_addr = NULL;
13573 int link_type = -1;
13576 if (length < sizeof(*ev)) {
13577 error("Too small raw RSSI event");
13581 ba2str(&ev->bt_address, addr);
13582 DBG("hci%u %s", index, addr);
13583 DBG("Raw RSSI Params [%d %d]", ev->link_type, ev->rssi_dbm);
13585 bt_addr = (char *)&addr;
13586 link_type = ev->link_type;
13587 rssi_dbm = ev->rssi_dbm;
13589 g_dbus_emit_signal(dbus_conn, adapter->path,
13590 ADAPTER_INTERFACE, "RawRssi",
13591 DBUS_TYPE_STRING, &bt_addr,
13592 DBUS_TYPE_INT32, &link_type,
13593 DBUS_TYPE_INT32, &rssi_dbm,
13594 DBUS_TYPE_INVALID);
13597 static void rssi_enabled_callback(uint16_t index, uint16_t length,
13598 const void *param, void *user_data)
13600 const struct mgmt_cc_rsp_enable_rssi *ev = param;
13601 struct btd_adapter *adapter = user_data;
13603 char *bt_addr = NULL;
13604 int enabled = TRUE;
13605 int link_type = -1;
13607 if (length < sizeof(*ev)) {
13608 error("Too small rssi enabled event");
13612 ba2str(&ev->bt_address, addr);
13613 DBG("hci%u %s %d", index, addr, ev->link_type);
13614 DBG("RSSI Enabled [%d %d]", ev->le_ext_opcode, ev->status);
13616 bt_addr = (char *)&addr;
13617 link_type = ev->link_type;
13619 g_dbus_emit_signal(dbus_conn, adapter->path,
13620 ADAPTER_INTERFACE, "RssiEnabled",
13621 DBUS_TYPE_STRING, &bt_addr,
13622 DBUS_TYPE_INT32, &link_type,
13623 DBUS_TYPE_BOOLEAN, &enabled,
13624 DBUS_TYPE_INVALID);
13627 static void rssi_disabled_callback(uint16_t index, uint16_t length,
13628 const void *param, void *user_data)
13630 const struct mgmt_cc_rp_disable_rssi *ev = param;
13631 struct btd_adapter *adapter = user_data;
13633 char *bt_addr = NULL;
13634 int disabled = FALSE;
13635 int link_type = -1;
13637 if (length < sizeof(*ev)) {
13638 error("Too small RSSI disabled event");
13642 ba2str(&ev->bt_address, addr);
13643 DBG("hci%u %s %d", index, addr, ev->link_type);
13644 DBG("RSSI Disabled Params [%d %d]", ev->le_ext_opcode, ev->status);
13646 bt_addr = (char *)&addr;
13647 link_type = ev->link_type;
13649 g_dbus_emit_signal(dbus_conn, adapter->path,
13650 ADAPTER_INTERFACE, "RssiEnabled",
13651 DBUS_TYPE_STRING, &bt_addr,
13652 DBUS_TYPE_INT32, &link_type,
13653 DBUS_TYPE_BOOLEAN, &disabled,
13654 DBUS_TYPE_INVALID);
13657 void adapter_check_version(struct btd_adapter *adapter, uint8_t hci_ver)
13663 ver = "Bluetooth 1.0b";
13666 ver = "Bluetooth 1.1";
13669 ver = "Bluetooth 1.2";
13672 ver = "Bluetooth 2.0 + EDR";
13675 ver = "Bluetooth 2.1 + EDR";
13678 ver = "Bluetooth 3.0 + HS";
13681 ver = "Bluetooth 4.0";
13684 ver = "Bluetooth 4.1";
13691 if (adapter->version)
13692 g_free(adapter->version);
13694 adapter->version = g_strdup(ver);
13697 static void hardware_error_callback(uint16_t index, uint16_t length,
13698 const void *param, void *user_data)
13700 const struct mgmt_ev_hardware_error *ev = param;
13701 struct btd_adapter *adapter = user_data;
13703 if (length < sizeof(*ev)) {
13704 error("Too small Hardware error event");
13708 error("Hardware error occurred : %d", ev->error_code);
13709 g_dbus_emit_signal(dbus_conn, adapter->path,
13710 ADAPTER_INTERFACE, "HardwareError",
13711 DBUS_TYPE_INVALID);
13714 static void tx_timeout_error_callback(uint16_t index, uint16_t length,
13715 const void *param, void *user_data)
13717 struct btd_adapter *adapter = user_data;
13719 error("Tx Timeout error occurred");
13720 g_dbus_emit_signal(dbus_conn, adapter->path,
13721 ADAPTER_INTERFACE, "TxTimeoutError",
13722 DBUS_TYPE_INVALID);
13725 static void device_name_update_callback(uint16_t index, uint16_t length,
13726 const void *param, void *user_data)
13728 const struct mgmt_ev_device_name_update *ev = param;
13729 struct btd_adapter *adapter = user_data;
13730 struct btd_device *device;
13732 const uint8_t *eir_name;
13733 struct eir_data eir_data;
13735 if (length < sizeof(*ev)) {
13736 error("Name update error event");
13740 ba2str(&ev->addr.bdaddr, addr);
13741 DBG("hci%u %s", index, addr);
13743 device = btd_adapter_get_device(adapter, &ev->addr.bdaddr,
13746 error("Unable to get device object for %s", addr);
13750 if (ev->eir_len == 0)
13753 eir_name = ev->eir;
13755 memset(&eir_data, 0, sizeof(eir_data));
13756 eir_parse(&eir_data, eir_name, ev->eir_len);
13759 btd_device_device_set_name(device, eir_data.name);
13761 eir_data_free(&eir_data);
13764 struct multi_adv_data {
13765 struct btd_adapter *adapter;
13769 static gboolean multi_adv_start_timeout_cb(gpointer user_data)
13771 struct multi_adv_data *data = user_data;
13772 struct btd_adapter *adapter = data->adapter;
13775 adapter->adv_restart_timeout = 0;
13777 err = adapter_le_enable_multi_adv(adapter, TRUE, data->slot_id);
13779 advertising_state_changed(adapter, data->slot_id, FALSE);
13785 static void multi_adv_state_change_callback(uint16_t index, uint16_t length,
13786 const void *param, void *user_data)
13788 const struct mgmt_ev_vendor_specific_multi_adv_state_changed *ev = param;
13789 struct btd_adapter *adapter = user_data;
13790 struct multi_adv_data *data;
13791 struct adv_info *adv;
13793 if (length < sizeof(*ev)) {
13794 error("Too small adv state change event");
13798 DBG("adv id %d, state change reason %d, connection_handle %x",
13799 ev->adv_instance, ev->state_change_reason, ev->connection_handle);
13801 adv = find_advertiser(adapter, ev->adv_instance);
13802 DBG("current advertising status %d", adv->status);
13804 if ((ev->adv_instance > 0 && ev->adv_instance < adapter_le_get_max_adv_instance()) &&
13805 ev->state_change_reason == 0 && adv->status) {
13806 /* advertising is stopped by controller, it should be enabled again.
13807 * If fails, state should be changed to FALSE */
13808 data = g_new0(struct multi_adv_data, 1);
13809 data->adapter = adapter;
13810 data->slot_id = ev->adv_instance;
13812 adapter->adv_restart_instance = ev->adv_instance;
13813 adapter->adv_restart_timeout =
13814 g_timeout_add(300, multi_adv_start_timeout_cb, data);
13818 static void le_conn_update_completed_callback(uint16_t index, uint16_t length,
13819 const void *param, void *user_data)
13821 const struct mgmt_ev_conn_updated *ev = param;
13822 struct btd_adapter *adapter = user_data;
13823 struct btd_device *device;
13825 GSList *list = NULL;
13827 if (length < sizeof(*ev)) {
13828 error("Too small le conn update completed event");
13832 ba2str(&ev->addr.bdaddr, addr);
13833 if (ev->addr.type == BDADDR_LE_PUBLIC) {
13834 /* Private Random Address */
13835 list = g_slist_find_custom(adapter->devices, addr,
13836 device_rpa_ida_cmp);
13839 list = g_slist_find_custom(adapter->devices, addr,
13840 device_address_cmp);
13841 } else if (ev->addr.type == BDADDR_LE_RANDOM) {
13842 /* LE Static Random address */
13843 list = g_slist_find_custom(adapter->devices, addr,
13844 device_address_cmp);
13848 device = list->data;
13849 device_print_addr(device);
13851 if (device_get_conn_update_state(device))
13852 device_set_conn_update_state(device, false);
13856 static void bt_6lowpan_conn_state_change_callback(uint16_t index, uint16_t length,
13857 const void *param, void *user_data)
13859 const struct mgmt_ev_6lowpan_conn_state_changed *ev = param;
13860 struct btd_adapter *adapter = user_data;
13861 struct btd_device *device;
13863 gboolean connected = 0;
13865 if (length < sizeof(*ev)) {
13866 btd_error(adapter->dev_id,
13867 "Too small device connected event");
13871 ba2str(&ev->addr.bdaddr, addr);
13873 DBG("hci%u device %s", index, addr);
13875 device = btd_adapter_find_device(adapter, &ev->addr.bdaddr,
13878 btd_error(adapter->dev_id,
13879 "Unable to get device object for %s", addr);
13888 device_set_ipsp_connected(device, connected, ev->ifname);
13891 static void bt_le_data_length_changed_callback(uint16_t index, uint16_t length,
13892 const void *param, void *user_data)
13894 const struct mgmt_ev_le_data_length_changed *ev = param;
13895 struct btd_adapter *adapter = user_data;
13896 struct btd_device *device;
13899 if (length < sizeof(*ev)) {
13900 btd_error(adapter->dev_id,
13901 "Too small data length changed event");
13905 ba2str(&ev->addr.bdaddr, addr);
13907 DBG("hci%u device %s", index, addr);
13909 device = btd_adapter_find_device(adapter, &ev->addr.bdaddr,
13912 btd_error(adapter->dev_id,
13913 "Unable to get device object for %s", addr);
13917 device_le_data_length_changed(device, ev->max_tx_octets, ev->max_tx_time,
13918 ev->max_rx_octets, ev->max_rx_time);
13923 struct btd_adapter_pin_cb_iter *btd_adapter_pin_cb_iter_new(
13924 struct btd_adapter *adapter)
13926 struct btd_adapter_pin_cb_iter *iter =
13927 g_new0(struct btd_adapter_pin_cb_iter, 1);
13929 iter->it = adapter->pin_callbacks;
13935 void btd_adapter_pin_cb_iter_free(struct btd_adapter_pin_cb_iter *iter)
13940 bool btd_adapter_pin_cb_iter_end(struct btd_adapter_pin_cb_iter *iter)
13942 return iter->it == NULL && iter->attempt == 0;
13945 static ssize_t btd_adapter_pin_cb_iter_next(
13946 struct btd_adapter_pin_cb_iter *iter,
13947 struct btd_adapter *adapter,
13948 struct btd_device *device,
13949 char *pin_buf, bool *display)
13951 btd_adapter_pin_cb_t cb;
13954 while (iter->it != NULL) {
13955 cb = iter->it->data;
13956 ret = cb(adapter, device, pin_buf, display, iter->attempt);
13961 iter->it = g_slist_next(iter->it);
13968 static void pin_code_request_callback(uint16_t index, uint16_t length,
13969 const void *param, void *user_data)
13971 const struct mgmt_ev_pin_code_request *ev = param;
13972 struct btd_adapter *adapter = user_data;
13973 struct btd_device *device;
13974 bool display = false;
13979 struct btd_adapter_pin_cb_iter *iter;
13981 if (length < sizeof(*ev)) {
13982 btd_error(adapter->dev_id, "Too small PIN code request event");
13986 ba2str(&ev->addr.bdaddr, addr);
13988 DBG("hci%u %s", adapter->dev_id, addr);
13990 device = btd_adapter_get_device(adapter, &ev->addr.bdaddr,
13993 btd_error(adapter->dev_id,
13994 "Unable to get device object for %s", addr);
13998 /* Flag the request of a pincode to allow a bonding retry. */
13999 adapter->pincode_requested = true;
14000 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
14001 btd_device_set_legacy_pairing(device, true);
14004 memset(pin, 0, sizeof(pin));
14006 iter = device_bonding_iter(device);
14010 pinlen = btd_adapter_pin_cb_iter_next(iter, adapter, device,
14013 if (pinlen > 0 && (!ev->secure || pinlen == 16)) {
14014 if (display && device_is_bonding(device, NULL)) {
14015 err = device_notify_pincode(device, ev->secure, pin);
14017 btd_error(adapter->dev_id,
14018 "device_notify_pin: %s",
14020 btd_adapter_pincode_reply(adapter,
14025 btd_adapter_pincode_reply(adapter, &ev->addr.bdaddr,
14031 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
14032 if (btd_opts.pin_code) {
14033 /* Because we can't receive user input on headless device,
14034 no need to request pincode. Use the 'PinCode' in headless conf file */
14035 DBG("Use configured PinCode in headless device");
14036 btd_adapter_pincode_reply(adapter, &ev->addr.bdaddr,
14037 btd_opts.pin_code, strlen(btd_opts.pin_code));
14042 err = device_request_pincode(device, ev->secure);
14044 btd_error(adapter->dev_id, "device_request_pin: %s",
14046 btd_adapter_pincode_reply(adapter, &ev->addr.bdaddr, NULL, 0);
14050 int adapter_cancel_bonding(struct btd_adapter *adapter, const bdaddr_t *bdaddr,
14053 struct mgmt_addr_info cp;
14056 ba2str(bdaddr, addr);
14057 DBG("hci%u bdaddr %s type %u", adapter->dev_id, addr, addr_type);
14059 memset(&cp, 0, sizeof(cp));
14060 bacpy(&cp.bdaddr, bdaddr);
14061 cp.type = addr_type;
14063 if (mgmt_reply(adapter->mgmt, MGMT_OP_CANCEL_PAIR_DEVICE,
14064 adapter->dev_id, sizeof(cp), &cp,
14065 NULL, NULL, NULL) > 0)
14071 static void check_oob_bonding_complete(struct btd_adapter *adapter,
14072 const bdaddr_t *bdaddr, uint8_t status)
14074 if (!adapter->oob_handler || !adapter->oob_handler->bonding_cb)
14077 if (bacmp(bdaddr, &adapter->oob_handler->remote_addr) != 0)
14080 adapter->oob_handler->bonding_cb(adapter, bdaddr, status,
14081 adapter->oob_handler->user_data);
14083 g_free(adapter->oob_handler);
14084 adapter->oob_handler = NULL;
14087 static void bonding_complete(struct btd_adapter *adapter,
14088 const bdaddr_t *bdaddr,
14089 uint8_t addr_type, uint8_t status)
14091 struct btd_device *device;
14094 device = btd_adapter_get_device(adapter, bdaddr, addr_type);
14096 device = btd_adapter_find_device(adapter, bdaddr, addr_type);
14098 if (device != NULL)
14099 device_bonding_complete(device, addr_type, status);
14101 #ifndef TIZEN_FEATURE_BLUEZ_MODIFY
14102 resume_discovery(adapter);
14104 check_oob_bonding_complete(adapter, bdaddr, status);
14107 /* bonding_attempt_complete() handles the end of a "bonding attempt" checking if
14108 * it should begin a new attempt or complete the bonding.
14110 static void bonding_attempt_complete(struct btd_adapter *adapter,
14111 const bdaddr_t *bdaddr,
14112 uint8_t addr_type, uint8_t status)
14114 struct btd_device *device;
14117 ba2str(bdaddr, addr);
14118 DBG("hci%u bdaddr %s type %u status 0x%x", adapter->dev_id, addr,
14119 addr_type, status);
14122 device = btd_adapter_get_device(adapter, bdaddr, addr_type);
14124 device = btd_adapter_find_device(adapter, bdaddr, addr_type);
14126 if (status == MGMT_STATUS_AUTH_FAILED && adapter->pincode_requested) {
14127 /* On faliure, issue a bonding_retry if possible. */
14128 if (device != NULL) {
14129 if (device_bonding_attempt_retry(device) == 0)
14134 /* Ignore disconnects during retry. */
14135 if (status == MGMT_STATUS_DISCONNECTED &&
14136 device && device_is_retrying(device))
14139 /* In any other case, finish the bonding. */
14140 bonding_complete(adapter, bdaddr, addr_type, status);
14143 struct pair_device_data {
14144 struct btd_adapter *adapter;
14149 static void free_pair_device_data(void *user_data)
14151 struct pair_device_data *data = user_data;
14156 static void pair_device_complete(uint8_t status, uint16_t length,
14157 const void *param, void *user_data)
14159 const struct mgmt_rp_pair_device *rp = param;
14160 struct pair_device_data *data = user_data;
14161 struct btd_adapter *adapter = data->adapter;
14163 DBG("%s (0x%02x)", mgmt_errstr(status), status);
14165 /* Workaround for a kernel bug
14167 * Broken kernels may reply to device pairing command with command
14168 * status instead of command complete event e.g. if adapter was not
14171 if (status != MGMT_STATUS_SUCCESS && length < sizeof(*rp)) {
14172 btd_error(adapter->dev_id, "Pair device failed: %s (0x%02x)",
14173 mgmt_errstr(status), status);
14175 bonding_attempt_complete(adapter, &data->bdaddr,
14176 data->addr_type, status);
14180 if (length < sizeof(*rp)) {
14181 btd_error(adapter->dev_id, "Too small pair device response");
14185 bonding_attempt_complete(adapter, &rp->addr.bdaddr, rp->addr.type,
14189 int adapter_create_bonding(struct btd_adapter *adapter, const bdaddr_t *bdaddr,
14190 uint8_t addr_type, uint8_t io_cap)
14192 #ifndef TIZEN_FEATURE_BLUEZ_MODIFY
14193 suspend_discovery(adapter);
14195 return adapter_bonding_attempt(adapter, bdaddr, addr_type, io_cap);
14198 /* Starts a new bonding attempt in a fresh new bonding_req or a retried one. */
14199 int adapter_bonding_attempt(struct btd_adapter *adapter, const bdaddr_t *bdaddr,
14200 uint8_t addr_type, uint8_t io_cap)
14202 struct mgmt_cp_pair_device cp;
14204 struct pair_device_data *data;
14207 ba2str(bdaddr, addr);
14208 DBG("hci%u bdaddr %s type %d io_cap 0x%02x",
14209 adapter->dev_id, addr, addr_type, io_cap);
14211 /* Reset the pincode_requested flag for a new bonding attempt. */
14212 adapter->pincode_requested = false;
14214 memset(&cp, 0, sizeof(cp));
14215 bacpy(&cp.addr.bdaddr, bdaddr);
14216 cp.addr.type = addr_type;
14217 cp.io_cap = io_cap;
14219 data = g_new0(struct pair_device_data, 1);
14220 data->adapter = adapter;
14221 bacpy(&data->bdaddr, bdaddr);
14222 data->addr_type = addr_type;
14224 /* Due to a bug in the kernel it is possible that a LE pairing
14225 * request never times out. Therefore, add a timer to clean up
14226 * if no response arrives
14228 id = mgmt_send_timeout(adapter->mgmt, MGMT_OP_PAIR_DEVICE,
14229 adapter->dev_id, sizeof(cp), &cp,
14230 pair_device_complete, data,
14231 free_pair_device_data, BONDING_TIMEOUT);
14233 btd_error(adapter->dev_id, "Failed to pair %s for hci%u",
14234 addr, adapter->dev_id);
14235 free_pair_device_data(data);
14242 static void disconnect_notify(struct btd_device *dev, uint8_t reason)
14246 for (l = disconnect_list; l; l = g_slist_next(l)) {
14247 btd_disconnect_cb disconnect_cb = l->data;
14248 disconnect_cb(dev, reason);
14252 static void dev_disconnected(struct btd_adapter *adapter,
14253 const struct mgmt_addr_info *addr,
14256 struct btd_device *device;
14258 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
14259 struct device_addr_type t_addr;
14262 ba2str(&addr->bdaddr, dst);
14264 DBG("Device %s disconnected, reason %u", dst, reason);
14266 device = btd_adapter_find_device(adapter, &addr->bdaddr, addr->type);
14268 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
14270 device_get_tizen_addr(device, addr->type, &t_addr);
14272 device_set_disconnect_reason(device, reason);
14273 adapter_remove_connection(adapter, device, t_addr.bdaddr_type);
14274 disconnect_notify(device, reason);
14275 if (device_is_bonded(device, t_addr.bdaddr_type)) {
14276 DBG("addr type %d, bonded", t_addr.bdaddr_type);
14280 bonding_attempt_complete(adapter, &t_addr.bdaddr,
14281 t_addr.bdaddr_type, MGMT_STATUS_DISCONNECTED);
14286 adapter_remove_connection(adapter, device, addr->type);
14287 disconnect_notify(device, reason);
14291 bonding_attempt_complete(adapter, &addr->bdaddr, addr->type,
14292 MGMT_STATUS_DISCONNECTED);
14295 void btd_add_disconnect_cb(btd_disconnect_cb func)
14297 disconnect_list = g_slist_append(disconnect_list, func);
14300 void btd_remove_disconnect_cb(btd_disconnect_cb func)
14302 disconnect_list = g_slist_remove(disconnect_list, func);
14305 static void disconnect_complete(uint8_t status, uint16_t length,
14306 const void *param, void *user_data)
14308 const struct mgmt_rp_disconnect *rp = param;
14309 struct btd_adapter *adapter = user_data;
14311 if (status == MGMT_STATUS_NOT_CONNECTED) {
14312 btd_warn(adapter->dev_id,
14313 "Disconnecting failed: already disconnected");
14314 } else if (status != MGMT_STATUS_SUCCESS) {
14315 btd_error(adapter->dev_id,
14316 "Failed to disconnect device: %s (0x%02x)",
14317 mgmt_errstr(status), status);
14321 if (length < sizeof(*rp)) {
14322 btd_error(adapter->dev_id,
14323 "Too small device disconnect response");
14327 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
14328 /* Use HCI error code instead of MGMT disconnection reason */
14329 dev_disconnected(adapter, &rp->addr, 0x16);
14331 dev_disconnected(adapter, &rp->addr, MGMT_DEV_DISCONN_LOCAL_HOST);
14335 int btd_adapter_disconnect_device(struct btd_adapter *adapter,
14336 const bdaddr_t *bdaddr,
14337 uint8_t bdaddr_type)
14340 struct mgmt_cp_disconnect cp;
14342 memset(&cp, 0, sizeof(cp));
14343 bacpy(&cp.addr.bdaddr, bdaddr);
14344 cp.addr.type = bdaddr_type;
14346 if (mgmt_send(adapter->mgmt, MGMT_OP_DISCONNECT,
14347 adapter->dev_id, sizeof(cp), &cp,
14348 disconnect_complete, adapter, NULL) > 0)
14354 static void auth_failed_callback(uint16_t index, uint16_t length,
14355 const void *param, void *user_data)
14357 const struct mgmt_ev_auth_failed *ev = param;
14358 struct btd_adapter *adapter = user_data;
14360 if (length < sizeof(*ev)) {
14361 btd_error(adapter->dev_id, "Too small auth failed mgmt event");
14365 bonding_attempt_complete(adapter, &ev->addr.bdaddr, ev->addr.type,
14369 static void store_link_key(struct btd_adapter *adapter,
14370 struct btd_device *device, const uint8_t *key,
14371 uint8_t type, uint8_t pin_length)
14373 char device_addr[18];
14374 char filename[PATH_MAX];
14375 GKeyFile *key_file;
14376 GError *gerr = NULL;
14382 ba2str(device_get_address(device), device_addr);
14384 create_filename(filename, PATH_MAX, "/%s/%s/info",
14385 btd_adapter_get_storage_dir(adapter), device_addr);
14386 create_file(filename, 0600);
14388 key_file = g_key_file_new();
14389 if (!g_key_file_load_from_file(key_file, filename, 0, &gerr)) {
14390 error("Unable to load key file from %s: (%s)", filename,
14392 g_error_free(gerr);
14393 g_key_file_free(key_file);
14397 for (i = 0; i < 16; i++)
14398 sprintf(key_str + (i * 2), "%2.2X", key[i]);
14400 g_key_file_set_string(key_file, "LinkKey", "Key", key_str);
14402 g_key_file_set_integer(key_file, "LinkKey", "Type", type);
14403 g_key_file_set_integer(key_file, "LinkKey", "PINLength", pin_length);
14405 str = g_key_file_to_data(key_file, &length, NULL);
14406 if (!g_file_set_contents(filename, str, length, &gerr)) {
14407 error("Unable set contents for %s: (%s)", filename,
14409 g_error_free(gerr);
14413 g_key_file_free(key_file);
14416 static void new_link_key_callback(uint16_t index, uint16_t length,
14417 const void *param, void *user_data)
14419 const struct mgmt_ev_new_link_key *ev = param;
14420 const struct mgmt_addr_info *addr = &ev->key.addr;
14421 struct btd_adapter *adapter = user_data;
14422 struct btd_device *device;
14425 if (length < sizeof(*ev)) {
14426 btd_error(adapter->dev_id, "Too small new link key event");
14430 ba2str(&addr->bdaddr, dst);
14432 DBG("hci%u new key for %s type %u pin_len %u store_hint %u",
14433 adapter->dev_id, dst, ev->key.type, ev->key.pin_len,
14436 if (ev->key.pin_len > 16) {
14437 btd_error(adapter->dev_id,
14438 "Invalid PIN length (%u) in new_key event",
14443 device = btd_adapter_get_device(adapter, &addr->bdaddr, addr->type);
14445 btd_error(adapter->dev_id,
14446 "Unable to get device object for %s", dst);
14450 if (ev->store_hint) {
14451 const struct mgmt_link_key_info *key = &ev->key;
14453 store_link_key(adapter, device, key->val, key->type,
14456 device_set_bonded(device, BDADDR_BREDR);
14457 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
14459 if (btd_adapter_get_a2dp_role(adapter) & BLUETOOTH_A2DP_SINK_ROLE) {
14460 DBG("store_hint %d", ev->store_hint);
14461 btd_device_set_temporary(device, false);
14466 bonding_complete(adapter, &addr->bdaddr, addr->type, 0);
14469 static void store_ltk_group(struct btd_adapter *adapter, const bdaddr_t *peer,
14470 uint8_t bdaddr_type, const unsigned char *key,
14471 const char *group, uint8_t authenticated,
14472 uint8_t enc_size, uint16_t ediv,
14475 char device_addr[18];
14476 char filename[PATH_MAX];
14477 GKeyFile *key_file;
14478 GError *gerr = NULL;
14484 ba2str(peer, device_addr);
14486 create_filename(filename, PATH_MAX, "/%s/%s/info",
14487 btd_adapter_get_storage_dir(adapter), device_addr);
14488 create_file(filename, 0600);
14490 key_file = g_key_file_new();
14491 if (!g_key_file_load_from_file(key_file, filename, 0, &gerr)) {
14492 error("Unable to load key file from %s: (%s)", filename,
14494 g_error_free(gerr);
14495 g_key_file_free(key_file);
14499 for (i = 0; i < 16; i++)
14500 sprintf(key_str + (i * 2), "%2.2X", key[i]);
14502 g_key_file_set_string(key_file, group, "Key", key_str);
14504 g_key_file_set_integer(key_file, group, "Authenticated",
14506 g_key_file_set_integer(key_file, group, "EncSize", enc_size);
14508 g_key_file_set_integer(key_file, group, "EDiv", ediv);
14509 g_key_file_set_uint64(key_file, group, "Rand", rand);
14511 create_file(filename, 0600);
14513 str = g_key_file_to_data(key_file, &length, NULL);
14514 if (!g_file_set_contents(filename, str, length, &gerr)) {
14515 error("Unable set contents for %s: (%s)", filename,
14517 g_error_free(gerr);
14521 g_key_file_free(key_file);
14524 static void store_longtermkey(struct btd_adapter *adapter, const bdaddr_t *peer,
14525 uint8_t bdaddr_type, const unsigned char *key,
14526 uint8_t central, uint8_t authenticated,
14527 uint8_t enc_size, uint16_t ediv,
14530 if (central != 0x00 && central != 0x01) {
14531 error("Unsupported LTK type %u", central);
14536 store_ltk_group(adapter, peer, bdaddr_type, key, "LongTermKey",
14537 authenticated, enc_size, ediv, rand);
14539 /* Peripheral* is the proper term, but for now keep duplicates
14540 * so it won't break when user up/downgrades. Remove the other
14541 * term after a few releases.
14543 store_ltk_group(adapter, peer, bdaddr_type, key,
14544 "PeripheralLongTermKey", authenticated,
14545 enc_size, ediv, rand);
14546 store_ltk_group(adapter, peer, bdaddr_type, key,
14547 "SlaveLongTermKey", authenticated,
14548 enc_size, ediv, rand);
14552 static void new_long_term_key_callback(uint16_t index, uint16_t length,
14553 const void *param, void *user_data)
14555 const struct mgmt_ev_new_long_term_key *ev = param;
14556 const struct mgmt_addr_info *addr = &ev->key.addr;
14557 struct btd_adapter *adapter = user_data;
14558 struct btd_device *device;
14561 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
14562 struct device_addr_type t_addr;
14565 if (length < sizeof(*ev)) {
14566 btd_error(adapter->dev_id, "Too small long term key event");
14570 ba2str(&addr->bdaddr, dst);
14572 DBG("hci%u new LTK for %s type %u enc_size %u",
14573 adapter->dev_id, dst, ev->key.type, ev->key.enc_size);
14575 device = btd_adapter_get_device(adapter, &addr->bdaddr, addr->type);
14577 btd_error(adapter->dev_id,
14578 "Unable to get device object for %s", dst);
14583 * Some older kernel versions set store_hint for long term keys
14584 * from resolvable and unresolvable random addresses, but there
14585 * is no point in storing these. Next time around the device
14586 * address will be invalid.
14588 * So only for identity addresses (public and static random) use
14589 * the store_hint as an indication if the long term key should
14590 * be persistently stored.
14593 if (addr->type == BDADDR_LE_RANDOM &&
14594 (addr->bdaddr.b[5] & 0xc0) != 0xc0)
14595 persistent = false;
14597 persistent = !!ev->store_hint;
14600 const struct mgmt_ltk_info *key = &ev->key;
14604 ediv = le16_to_cpu(key->ediv);
14605 rand = le64_to_cpu(key->rand);
14607 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
14608 device_get_tizen_addr(device, addr->type, &t_addr);
14609 store_longtermkey(adapter, &t_addr.bdaddr, t_addr.bdaddr_type,
14610 key->val, key->central, key->type,
14611 key->enc_size, ediv, rand);
14613 store_longtermkey(adapter, &key->addr.bdaddr,
14614 key->addr.type, key->val, key->central,
14615 key->type, key->enc_size, ediv, rand);
14618 device_set_bonded(device, addr->type);
14621 device_set_ltk(device, ev->key.val, ev->key.central, ev->key.enc_size);
14623 bonding_complete(adapter, &addr->bdaddr, addr->type, 0);
14626 static void store_csrk(struct btd_adapter *adapter, const bdaddr_t *peer,
14627 uint8_t bdaddr_type, const unsigned char *key,
14628 uint32_t counter, uint8_t type)
14631 char device_addr[18];
14632 char filename[PATH_MAX];
14633 GKeyFile *key_file;
14634 GError *gerr = NULL;
14643 group = "LocalSignatureKey";
14647 group = "RemoteSignatureKey";
14651 group = "LocalSignatureKey";
14655 group = "RemoteSignatureKey";
14659 warn("Unsupported CSRK type %u", type);
14663 ba2str(peer, device_addr);
14665 create_filename(filename, PATH_MAX, "/%s/%s/info",
14666 btd_adapter_get_storage_dir(adapter), device_addr);
14668 key_file = g_key_file_new();
14669 if (!g_key_file_load_from_file(key_file, filename, 0, &gerr)) {
14670 error("Unable to load key file from %s: (%s)", filename,
14672 g_clear_error(&gerr);
14675 for (i = 0; i < 16; i++)
14676 sprintf(key_str + (i * 2), "%2.2X", key[i]);
14678 g_key_file_set_string(key_file, group, "Key", key_str);
14679 g_key_file_set_integer(key_file, group, "Counter", counter);
14680 g_key_file_set_boolean(key_file, group, "Authenticated", auth);
14682 create_file(filename, 0600);
14684 str = g_key_file_to_data(key_file, &length, NULL);
14685 if (!g_file_set_contents(filename, str, length, &gerr)) {
14686 error("Unable set contents for %s: (%s)", filename,
14688 g_error_free(gerr);
14692 g_key_file_free(key_file);
14695 static void new_csrk_callback(uint16_t index, uint16_t length,
14696 const void *param, void *user_data)
14698 const struct mgmt_ev_new_csrk *ev = param;
14699 const struct mgmt_addr_info *addr = &ev->key.addr;
14700 const struct mgmt_csrk_info *key = &ev->key;
14701 struct btd_adapter *adapter = user_data;
14702 struct btd_device *device;
14704 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
14705 struct device_addr_type t_addr;
14708 if (length < sizeof(*ev)) {
14709 btd_error(adapter->dev_id, "Too small CSRK event");
14713 ba2str(&addr->bdaddr, dst);
14715 DBG("hci%u new CSRK for %s type %u", adapter->dev_id, dst,
14718 device = btd_adapter_get_device(adapter, &addr->bdaddr, addr->type);
14720 btd_error(adapter->dev_id,
14721 "Unable to get device object for %s", dst);
14725 if (!ev->store_hint)
14728 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
14729 device_get_tizen_addr(device, addr->type, &t_addr);
14730 store_csrk(adapter, &t_addr.bdaddr, t_addr.bdaddr_type, key->val, 0,
14733 store_csrk(adapter, &key->addr.bdaddr, key->addr.type, key->val, 0,
14737 btd_device_set_temporary(device, false);
14740 static void store_irk(struct btd_adapter *adapter, const bdaddr_t *peer,
14741 uint8_t bdaddr_type, const unsigned char *key)
14743 char device_addr[18];
14744 char filename[PATH_MAX];
14745 GKeyFile *key_file;
14746 GError *gerr = NULL;
14752 ba2str(peer, device_addr);
14754 create_filename(filename, PATH_MAX, "/%s/%s/info",
14755 btd_adapter_get_storage_dir(adapter), device_addr);
14756 key_file = g_key_file_new();
14757 if (!g_key_file_load_from_file(key_file, filename, 0, &gerr)) {
14758 error("Unable to load key file from %s: (%s)", filename,
14760 g_clear_error(&gerr);
14763 for (i = 0; i < 16; i++)
14764 sprintf(str + (i * 2), "%2.2X", key[i]);
14766 g_key_file_set_string(key_file, "IdentityResolvingKey", "Key", str);
14768 store_data = g_key_file_to_data(key_file, &length, NULL);
14769 if (!g_file_set_contents(filename, store_data, length, &gerr)) {
14770 error("Unable set contents for %s: (%s)", filename,
14772 g_error_free(gerr);
14774 g_free(store_data);
14776 g_key_file_free(key_file);
14779 static void new_irk_callback(uint16_t index, uint16_t length,
14780 const void *param, void *user_data)
14782 const struct mgmt_ev_new_irk *ev = param;
14783 const struct mgmt_addr_info *addr = &ev->key.addr;
14784 const struct mgmt_irk_info *irk = &ev->key;
14785 struct btd_adapter *adapter = user_data;
14786 struct btd_device *device, *duplicate;
14788 char dst[18], rpa[18];
14789 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
14790 struct device_addr_type t_addr;
14793 if (length < sizeof(*ev)) {
14794 btd_error(adapter->dev_id, "Too small New IRK event");
14798 ba2str(&addr->bdaddr, dst);
14799 ba2str(&ev->rpa, rpa);
14801 DBG("hci%u new IRK for %s RPA %s", adapter->dev_id, dst, rpa);
14803 if (bacmp(&ev->rpa, BDADDR_ANY)) {
14804 device = btd_adapter_get_device(adapter, &ev->rpa,
14806 #ifndef TIZEN_FEATURE_BLUEZ_MODIFY
14807 device = btd_adapter_get_device(adapter, &ev->rpa,
14809 duplicate = btd_adapter_find_device(adapter, &addr->bdaddr,
14811 if (duplicate == device)
14814 device_set_rpa_addr(device, &ev->rpa);
14818 device = btd_adapter_get_device(adapter, &addr->bdaddr,
14824 btd_error(adapter->dev_id,
14825 "Unable to get device object for %s", dst);
14829 device_update_addr(device, &addr->bdaddr, addr->type);
14832 device_merge_duplicate(device, duplicate);
14834 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
14835 device_set_irk_value(device, irk->val);
14838 persistent = !!ev->store_hint;
14842 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
14843 device_get_tizen_addr(device, addr->type, &t_addr);
14844 store_irk(adapter, &t_addr.bdaddr, t_addr.bdaddr_type, irk->val);
14846 store_irk(adapter, &addr->bdaddr, addr->type, irk->val);
14849 btd_device_set_temporary(device, false);
14852 static void store_conn_param(struct btd_adapter *adapter, const bdaddr_t *peer,
14853 uint8_t bdaddr_type, uint16_t min_interval,
14854 uint16_t max_interval, uint16_t latency,
14857 char device_addr[18];
14858 char filename[PATH_MAX];
14859 GKeyFile *key_file;
14860 GError *gerr = NULL;
14864 ba2str(peer, device_addr);
14868 create_filename(filename, PATH_MAX, "/%s/%s/info",
14869 btd_adapter_get_storage_dir(adapter), device_addr);
14870 key_file = g_key_file_new();
14871 if (!g_key_file_load_from_file(key_file, filename, 0, &gerr)) {
14872 error("Unable to load key file from %s: (%s)", filename,
14874 g_clear_error(&gerr);
14877 g_key_file_set_integer(key_file, "ConnectionParameters",
14878 "MinInterval", min_interval);
14879 g_key_file_set_integer(key_file, "ConnectionParameters",
14880 "MaxInterval", max_interval);
14881 g_key_file_set_integer(key_file, "ConnectionParameters",
14882 "Latency", latency);
14883 g_key_file_set_integer(key_file, "ConnectionParameters",
14884 "Timeout", timeout);
14886 create_file(filename, 0600);
14888 store_data = g_key_file_to_data(key_file, &length, NULL);
14889 if (!g_file_set_contents(filename, store_data, length, &gerr)) {
14890 error("Unable set contents for %s: (%s)", filename,
14892 g_error_free(gerr);
14894 g_free(store_data);
14896 g_key_file_free(key_file);
14899 static void new_conn_param(uint16_t index, uint16_t length,
14900 const void *param, void *user_data)
14902 const struct mgmt_ev_new_conn_param *ev = param;
14903 struct btd_adapter *adapter = user_data;
14904 uint16_t min, max, latency, timeout;
14905 struct btd_device *dev;
14907 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
14908 struct device_addr_type t_addr;
14911 if (length < sizeof(*ev)) {
14912 btd_error(adapter->dev_id,
14913 "Too small New Connection Parameter event");
14917 ba2str(&ev->addr.bdaddr, dst);
14919 min = btohs(ev->min_interval);
14920 max = btohs(ev->max_interval);
14921 latency = btohs(ev->latency);
14922 timeout = btohs(ev->timeout);
14924 DBG("hci%u %s (%u) min 0x%04x max 0x%04x latency 0x%04x timeout 0x%04x",
14925 adapter->dev_id, dst, ev->addr.type, min, max, latency, timeout);
14927 dev = btd_adapter_get_device(adapter, &ev->addr.bdaddr, ev->addr.type);
14929 btd_error(adapter->dev_id,
14930 "Unable to get device object for %s", dst);
14934 if (!ev->store_hint)
14937 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
14938 device_get_tizen_addr(dev, ev->addr.type, &t_addr);
14939 store_conn_param(adapter, &t_addr.bdaddr, t_addr.bdaddr_type,
14940 ev->min_interval, ev->max_interval,
14941 ev->latency, ev->timeout);
14943 store_conn_param(adapter, &ev->addr.bdaddr, ev->addr.type,
14944 ev->min_interval, ev->max_interval,
14945 ev->latency, ev->timeout);
14949 int adapter_set_io_capability(struct btd_adapter *adapter, uint8_t io_cap)
14951 struct mgmt_cp_set_io_capability cp;
14953 if (!btd_opts.pairable) {
14954 if (io_cap == IO_CAPABILITY_INVALID) {
14955 if (adapter->current_settings & MGMT_SETTING_BONDABLE)
14956 set_mode(adapter, MGMT_OP_SET_BONDABLE, 0x00);
14961 if (!(adapter->current_settings & MGMT_SETTING_BONDABLE))
14962 set_mode(adapter, MGMT_OP_SET_BONDABLE, 0x01);
14963 } else if (io_cap == IO_CAPABILITY_INVALID)
14964 io_cap = IO_CAPABILITY_NOINPUTNOOUTPUT;
14966 memset(&cp, 0, sizeof(cp));
14967 cp.io_capability = io_cap;
14969 if (mgmt_send(adapter->mgmt, MGMT_OP_SET_IO_CAPABILITY,
14970 adapter->dev_id, sizeof(cp), &cp,
14971 NULL, NULL, NULL) > 0)
14977 int btd_adapter_add_remote_oob_data(struct btd_adapter *adapter,
14978 const bdaddr_t *bdaddr,
14979 uint8_t *hash, uint8_t *randomizer)
14981 struct mgmt_cp_add_remote_oob_data cp;
14984 ba2str(bdaddr, addr);
14985 DBG("hci%d bdaddr %s", adapter->dev_id, addr);
14987 memset(&cp, 0, sizeof(cp));
14988 bacpy(&cp.addr.bdaddr, bdaddr);
14989 memcpy(cp.hash192, hash, 16);
14992 memcpy(cp.rand192, randomizer, 16);
14994 if (mgmt_send(adapter->mgmt, MGMT_OP_ADD_REMOTE_OOB_DATA,
14995 adapter->dev_id, sizeof(cp), &cp,
14996 NULL, NULL, NULL) > 0)
15002 int btd_adapter_remove_remote_oob_data(struct btd_adapter *adapter,
15003 const bdaddr_t *bdaddr)
15005 struct mgmt_cp_remove_remote_oob_data cp;
15008 ba2str(bdaddr, addr);
15009 DBG("hci%d bdaddr %s", adapter->dev_id, addr);
15011 memset(&cp, 0, sizeof(cp));
15012 bacpy(&cp.addr.bdaddr, bdaddr);
15014 if (mgmt_send(adapter->mgmt, MGMT_OP_REMOVE_REMOTE_OOB_DATA,
15015 adapter->dev_id, sizeof(cp), &cp,
15016 NULL, NULL, NULL) > 0)
15022 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
15023 int btd_adapter_add_remote_oob_ext_data(struct btd_adapter *adapter,
15024 const bdaddr_t *bdaddr, uint8_t bdaddr_type,
15025 uint8_t *hash192, uint8_t *randomizer192,
15026 uint8_t *hash256, uint8_t *randomizer256)
15028 struct mgmt_cp_add_remote_oob_data cp;
15031 ba2str(bdaddr, addr);
15032 DBG("hci%d bdaddr %s type %d", adapter->dev_id, addr, bdaddr_type);
15034 memset(&cp, 0, sizeof(cp));
15035 bacpy(&cp.addr.bdaddr, bdaddr);
15036 cp.addr.type = bdaddr_type;
15038 if (hash192 && randomizer192) {
15039 memcpy(cp.hash192, hash192, 16);
15040 memcpy(cp.rand192, randomizer192, 16);
15043 if (hash256 && randomizer256) {
15044 memcpy(cp.hash256, hash256, 16);
15045 memcpy(cp.rand256, randomizer256, 16);
15048 if (mgmt_send(adapter->mgmt, MGMT_OP_ADD_REMOTE_OOB_DATA,
15049 adapter->dev_id, sizeof(cp), &cp,
15050 NULL, NULL, NULL) > 0)
15056 int btd_adapter_remove_remote_oob_ext_data(struct btd_adapter *adapter,
15057 const bdaddr_t *bdaddr, uint8_t bdaddr_type)
15059 struct mgmt_cp_remove_remote_oob_data cp;
15062 ba2str(bdaddr, addr);
15063 DBG("hci%d bdaddr %s type %d", adapter->dev_id, addr, bdaddr_type);
15065 memset(&cp, 0, sizeof(cp));
15066 bacpy(&cp.addr.bdaddr, bdaddr);
15067 cp.addr.type = bdaddr_type;
15069 if (mgmt_send(adapter->mgmt, MGMT_OP_REMOVE_REMOTE_OOB_DATA,
15070 adapter->dev_id, sizeof(cp), &cp,
15071 NULL, NULL, NULL) > 0)
15078 bool btd_adapter_ssp_enabled(struct btd_adapter *adapter)
15080 if (adapter->current_settings & MGMT_SETTING_SSP)
15086 void btd_adapter_set_oob_handler(struct btd_adapter *adapter,
15087 struct oob_handler *handler)
15089 adapter->oob_handler = handler;
15092 gboolean btd_adapter_check_oob_handler(struct btd_adapter *adapter)
15094 return adapter->oob_handler != NULL;
15097 static void read_local_oob_data_complete(uint8_t status, uint16_t length,
15098 const void *param, void *user_data)
15100 const struct mgmt_rp_read_local_oob_data *rp = param;
15101 struct btd_adapter *adapter = user_data;
15102 const uint8_t *hash, *randomizer;
15103 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
15104 const uint8_t *hash256 = NULL;
15105 const uint8_t *randomizer256 = NULL;
15108 if (status != MGMT_STATUS_SUCCESS) {
15109 btd_error(adapter->dev_id,
15110 "Read local OOB data failed: %s (0x%02x)",
15111 mgmt_errstr(status), status);
15114 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
15115 } else if (length < 32) {
15117 } else if (length < sizeof(*rp)) {
15119 btd_error(adapter->dev_id,
15120 "Too small read local OOB data response");
15123 hash = rp->hash192;
15124 randomizer = rp->rand192;
15125 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
15127 hash256 = rp->hash256;
15128 randomizer256 = rp->rand256;
15133 if (!adapter->oob_handler || !adapter->oob_handler->read_local_cb)
15136 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
15137 adapter->oob_handler->read_local_cb(adapter, hash, randomizer,
15138 hash256, randomizer256,
15139 adapter->oob_handler->user_data);
15141 adapter->oob_handler->read_local_cb(adapter, hash, randomizer,
15142 adapter->oob_handler->user_data);
15145 g_free(adapter->oob_handler);
15146 adapter->oob_handler = NULL;
15149 int btd_adapter_read_local_oob_data(struct btd_adapter *adapter)
15151 DBG("hci%u", adapter->dev_id);
15153 if (mgmt_send(adapter->mgmt, MGMT_OP_READ_LOCAL_OOB_DATA,
15154 adapter->dev_id, 0, NULL, read_local_oob_data_complete,
15155 adapter, NULL) > 0)
15161 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
15162 static void le_read_local_oob_data_complete(uint8_t status, uint16_t length,
15163 const void *param, void *user_data)
15165 const struct mgmt_rp_read_local_oob_ext_data *rp = param;
15166 struct btd_adapter *adapter = user_data;
15168 if (status != MGMT_STATUS_SUCCESS) {
15169 btd_error(adapter->dev_id, "LE Read local OOB data failed: %s (0x%02x)",
15170 mgmt_errstr(status), status);
15171 } else if (length < sizeof(struct mgmt_rp_read_local_oob_ext_data)) {
15172 btd_error(adapter->dev_id,
15173 "Too small read local OOB ext data response");
15177 if (!adapter->oob_handler || !adapter->oob_handler->le_read_local_cb) {
15178 btd_error(adapter->dev_id, "oob_handler is not valid : %p",
15179 adapter->oob_handler);
15183 adapter->oob_handler->le_read_local_cb(adapter, rp->eir_len, rp->eir,
15184 adapter->oob_handler->user_data);
15186 g_free(adapter->oob_handler);
15187 adapter->oob_handler = NULL;
15190 int btd_adapter_le_read_local_oob_data(struct btd_adapter *adapter)
15192 struct mgmt_cp_read_local_oob_ext_data cp;
15194 DBG("hci%u", adapter->dev_id);
15196 memset(&cp, 0, sizeof(cp));
15197 cp.type = (1 << BDADDR_LE_PUBLIC) | (1 << BDADDR_LE_RANDOM);
15199 if (mgmt_send(adapter->mgmt, MGMT_OP_READ_LOCAL_OOB_EXT_DATA,
15200 adapter->dev_id, sizeof(cp), &cp, le_read_local_oob_data_complete,
15201 adapter, NULL) > 0)
15208 void btd_adapter_for_each_device(struct btd_adapter *adapter,
15209 void (*cb)(struct btd_device *device, void *data),
15212 g_slist_foreach(adapter->devices, (GFunc) cb, data);
15215 static int adapter_cmp(gconstpointer a, gconstpointer b)
15217 struct btd_adapter *adapter = (struct btd_adapter *) a;
15218 const bdaddr_t *bdaddr = b;
15220 return bacmp(&adapter->bdaddr, bdaddr);
15223 static int adapter_id_cmp(gconstpointer a, gconstpointer b)
15225 struct btd_adapter *adapter = (struct btd_adapter *) a;
15226 uint16_t id = GPOINTER_TO_UINT(b);
15228 return adapter->dev_id == id ? 0 : -1;
15231 struct btd_adapter *adapter_find(const bdaddr_t *sba)
15235 match = g_slist_find_custom(adapters, sba, adapter_cmp);
15239 return match->data;
15242 struct btd_adapter *adapter_find_by_id(int id)
15246 match = g_slist_find_custom(adapters, GINT_TO_POINTER(id),
15251 return match->data;
15254 void adapter_foreach(adapter_cb func, gpointer user_data)
15256 g_slist_foreach(adapters, (GFunc) func, user_data);
15259 static int set_did(struct btd_adapter *adapter, uint16_t vendor,
15260 uint16_t product, uint16_t version, uint16_t source)
15262 struct mgmt_cp_set_device_id cp;
15264 DBG("hci%u source %x vendor %x product %x version %x",
15265 adapter->dev_id, source, vendor, product, version);
15267 memset(&cp, 0, sizeof(cp));
15269 cp.source = htobs(source);
15270 cp.vendor = htobs(vendor);
15271 cp.product = htobs(product);
15272 cp.version = htobs(version);
15274 if (mgmt_send(adapter->mgmt, MGMT_OP_SET_DEVICE_ID,
15275 adapter->dev_id, sizeof(cp), &cp,
15276 NULL, NULL, NULL) > 0)
15282 static void services_modified(struct gatt_db_attribute *attrib, void *user_data)
15284 struct btd_adapter *adapter = user_data;
15286 g_dbus_emit_property_changed(dbus_conn, adapter->path,
15287 ADAPTER_INTERFACE, "UUIDs");
15290 static int adapter_register(struct btd_adapter *adapter)
15292 struct agent *agent;
15293 struct gatt_db *db;
15294 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
15295 char address[18] = { 0 };
15296 char filename[PATH_MAX] = { 0 };
15302 adapter->path = g_strdup_printf("/org/bluez/hci%d", adapter->dev_id);
15304 if (!g_dbus_register_interface(dbus_conn,
15305 adapter->path, ADAPTER_INTERFACE,
15306 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
15307 adapter_methods, adapter_signals,
15309 adapter_methods, NULL,
15311 adapter_properties, adapter,
15313 btd_error(adapter->dev_id,
15314 "Adapter interface init failed on path %s",
15316 g_free(adapter->path);
15317 adapter->path = NULL;
15321 if (adapters == NULL)
15322 adapter->is_default = true;
15324 adapters = g_slist_append(adapters, adapter);
15326 agent = agent_get(NULL);
15328 uint8_t io_cap = agent_get_io_capability(agent);
15329 adapter_set_io_capability(adapter, io_cap);
15330 agent_unref(agent);
15333 if (g_dbus_get_flags() & G_DBUS_FLAG_ENABLE_EXPERIMENTAL) {
15334 adapter->battery_provider_manager =
15335 btd_battery_provider_manager_create(adapter);
15338 /* Don't start GATT database and advertising managers on
15339 * non-LE controllers.
15341 if (!(adapter->supported_settings & MGMT_SETTING_LE) ||
15342 btd_opts.mode == BT_MODE_BREDR)
15345 adapter->database = btd_gatt_database_new(adapter);
15346 if (!adapter->database) {
15347 btd_error(adapter->dev_id,
15348 "Failed to create GATT database for adapter");
15349 adapters = g_slist_remove(adapters, adapter);
15353 adapter->adv_manager = btd_adv_manager_new(adapter, adapter->mgmt);
15355 if (g_dbus_get_flags() & G_DBUS_FLAG_ENABLE_EXPERIMENTAL) {
15356 if (adapter->supported_settings & MGMT_SETTING_LE) {
15357 adapter->adv_monitor_manager =
15358 btd_adv_monitor_manager_create(adapter,
15360 if (!adapter->adv_monitor_manager) {
15361 btd_error(adapter->dev_id,
15362 "Failed to create Adv Monitor "
15363 "Manager for adapter");
15367 btd_info(adapter->dev_id, "Adv Monitor Manager "
15368 "skipped, LE unavailable");
15372 db = btd_gatt_database_get_db(adapter->database);
15373 adapter->db_id = gatt_db_register(db, services_modified,
15377 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
15378 ba2str(&adapter->bdaddr, address);
15379 snprintf(filename, PATH_MAX, STORAGEDIR "/%s", address);
15380 delete_tempfiles(filename);
15383 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
15384 adapter_print_devices(adapter);
15386 if (load_local_irk(adapter)) {
15387 if (!(adapter->supported_settings & MGMT_SETTING_PRIVACY))
15388 btd_opts.le_privacy = false;
15391 * Some Android devices don't consider the device as LE one,
15392 * if the device doesn't distribute IRK when pairing.
15393 * Because of this compatibility issue, set IRK
15394 * even though privacy feature is disabled.
15396 set_local_irk(adapter);
15398 if (btd_opts.le_privacy) {
15399 DBG("Enable LE Privacy feature");
15400 set_privacy(adapter, true);
15402 DBG("Disable LE Privacy feature");
15408 mgmt_register(adapter->mgmt, MGMT_EV_DEVICE_FLAGS_CHANGED,
15410 device_flags_changed_callback,
15413 load_config(adapter);
15414 fix_storage(adapter);
15415 load_drivers(adapter);
15416 btd_profile_foreach(probe_profile, adapter);
15417 clear_blocked(adapter);
15418 load_defaults(adapter);
15419 load_devices(adapter);
15421 /* restore Service Changed CCC value for bonded devices */
15422 btd_gatt_database_restore_svc_chng_ccc(adapter->database);
15424 /* retrieve the active connections: address the scenario where
15425 * the are active connections before the daemon've started */
15426 if (btd_adapter_get_powered(adapter))
15427 load_connections(adapter);
15429 adapter->initialized = TRUE;
15431 if (btd_opts.did_source) {
15432 /* DeviceID record is added by sdpd-server before any other
15433 * record is registered. */
15434 adapter_service_insert(adapter, sdp_record_find(0x10000));
15435 set_did(adapter, btd_opts.did_vendor, btd_opts.did_product,
15436 btd_opts.did_version, btd_opts.did_source);
15439 DBG("Adapter %s registered", adapter->path);
15444 static int adapter_unregister(struct btd_adapter *adapter)
15446 DBG("Unregister path: %s", adapter->path);
15448 adapters = g_slist_remove(adapters, adapter);
15450 if (adapter->is_default && adapters != NULL) {
15451 struct btd_adapter *new_default;
15453 new_default = adapter_find_by_id(hci_get_route(NULL));
15454 if (new_default == NULL)
15455 new_default = adapters->data;
15457 new_default->is_default = true;
15460 adapter_list = g_list_remove(adapter_list, adapter);
15462 adapter_remove(adapter);
15463 btd_adapter_unref(adapter);
15468 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
15469 /* ---- HCI Error Codes ---- */
15470 #define HCI_ERROR_AUTH_FAILURE 0x05
15471 #define HCI_ERROR_PIN_OR_KEY_MISSING 0x06
15472 #define HCI_ERROR_MEMORY_EXCEEDED 0x07
15473 #define HCI_ERROR_CONNECTION_TIMEOUT 0x08
15474 #define HCI_ERROR_REJ_LIMITED_RESOURCES 0x0d
15475 #define HCI_ERROR_REJ_BAD_ADDR 0x0f
15476 #define HCI_ERROR_REMOTE_USER_TERM 0x13
15477 #define HCI_ERROR_REMOTE_LOW_RESOURCES 0x14
15478 #define HCI_ERROR_REMOTE_POWER_OFF 0x15
15479 #define HCI_ERROR_LOCAL_HOST_TERM 0x16
15480 #define HCI_ERROR_PAIRING_NOT_ALLOWED 0x18
15481 #define HCI_ERROR_INVALID_LL_PARAMS 0x1e
15482 #define HCI_ERROR_UNSPECIFIED 0x1f
15483 #define HCI_ERROR_ADVERTISING_TIMEOUT 0x3c
15485 static uint8_t mgmt_to_hci_reason(uint8_t err)
15488 case MGMT_DEV_DISCONN_TIMEOUT:
15489 return HCI_ERROR_CONNECTION_TIMEOUT;
15490 case MGMT_DEV_DISCONN_REMOTE:
15491 return HCI_ERROR_REMOTE_USER_TERM;
15492 case MGMT_DEV_DISCONN_LOCAL_HOST:
15493 return HCI_ERROR_LOCAL_HOST_TERM;
15495 error("No match MGMT error");
15501 static void disconnected_callback(uint16_t index, uint16_t length,
15502 const void *param, void *user_data)
15504 const struct mgmt_ev_device_disconnected *ev = param;
15505 struct btd_adapter *adapter = user_data;
15508 if (length < sizeof(struct mgmt_addr_info)) {
15509 btd_error(adapter->dev_id,
15510 "Too small device disconnected event");
15514 if (length < sizeof(*ev))
15515 reason = MGMT_DEV_DISCONN_UNKNOWN;
15517 reason = ev->reason;
15519 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
15520 /* Use HCI error code instead of MGMT disconnection reason */
15521 dev_disconnected(adapter, &ev->addr, mgmt_to_hci_reason(reason));
15523 dev_disconnected(adapter, &ev->addr, reason);
15527 static void connected_callback(uint16_t index, uint16_t length,
15528 const void *param, void *user_data)
15530 const struct mgmt_ev_device_connected *ev = param;
15531 struct btd_adapter *adapter = user_data;
15532 struct btd_device *device;
15533 struct eir_data eir_data;
15538 if (length < sizeof(*ev)) {
15539 btd_error(adapter->dev_id, "Too small device connected event");
15543 eir_len = btohs(ev->eir_len);
15544 if (length < sizeof(*ev) + eir_len) {
15545 btd_error(adapter->dev_id, "Too small device connected event");
15549 ba2str(&ev->addr.bdaddr, addr);
15551 DBG("hci%u device %s connected eir_len %u", index, addr, eir_len);
15553 device = btd_adapter_get_device(adapter, &ev->addr.bdaddr,
15556 btd_error(adapter->dev_id,
15557 "Unable to get device object for %s", addr);
15561 memset(&eir_data, 0, sizeof(eir_data));
15563 eir_parse(&eir_data, ev->eir, eir_len);
15565 if (eir_data.class != 0)
15566 device_set_class(device, eir_data.class);
15568 adapter_add_connection(adapter, device, ev->addr.type,
15569 le32_to_cpu(ev->flags));
15571 name_known = device_name_known(device);
15573 if (eir_data.name && (eir_data.name_complete || !name_known)) {
15574 device_store_cached_name(device, eir_data.name);
15575 btd_device_device_set_name(device, eir_data.name);
15578 if (eir_data.msd_list)
15579 adapter_msd_notify(adapter, device, eir_data.msd_list);
15581 eir_data_free(&eir_data);
15584 static void controller_resume_notify(struct btd_adapter *adapter)
15588 for (l = adapter->drivers; l; l = g_slist_next(l)) {
15589 struct btd_adapter_driver *driver = l->data;
15590 if (driver->resume)
15591 driver->resume(adapter);
15595 static void controller_resume_callback(uint16_t index, uint16_t length,
15596 const void *param, void *user_data)
15598 const struct mgmt_ev_controller_resume *ev = param;
15599 struct btd_adapter *adapter = user_data;
15601 if (length < sizeof(*ev)) {
15602 btd_error(adapter->dev_id, "Too small device resume event");
15606 info("Controller resume with wake event 0x%x", ev->wake_reason);
15608 controller_resume_notify(adapter);
15611 static void device_blocked_callback(uint16_t index, uint16_t length,
15612 const void *param, void *user_data)
15614 const struct mgmt_ev_device_blocked *ev = param;
15615 struct btd_adapter *adapter = user_data;
15616 struct btd_device *device;
15619 if (length < sizeof(*ev)) {
15620 btd_error(adapter->dev_id, "Too small device blocked event");
15624 ba2str(&ev->addr.bdaddr, addr);
15625 DBG("hci%u %s blocked", index, addr);
15627 device = btd_adapter_find_device(adapter, &ev->addr.bdaddr,
15630 device_block(device, TRUE);
15633 static void device_unblocked_callback(uint16_t index, uint16_t length,
15634 const void *param, void *user_data)
15636 const struct mgmt_ev_device_unblocked *ev = param;
15637 struct btd_adapter *adapter = user_data;
15638 struct btd_device *device;
15641 if (length < sizeof(*ev)) {
15642 btd_error(adapter->dev_id, "Too small device unblocked event");
15646 ba2str(&ev->addr.bdaddr, addr);
15647 DBG("hci%u %s unblocked", index, addr);
15649 device = btd_adapter_find_device(adapter, &ev->addr.bdaddr,
15652 device_unblock(device, FALSE, TRUE);
15655 static void conn_fail_notify(struct btd_device *dev, uint8_t status)
15659 for (l = conn_fail_list; l; l = g_slist_next(l)) {
15660 btd_conn_fail_cb conn_fail_cb = l->data;
15661 conn_fail_cb(dev, status);
15665 void btd_add_conn_fail_cb(btd_conn_fail_cb func)
15667 conn_fail_list = g_slist_append(conn_fail_list, func);
15670 void btd_remove_conn_fail_cb(btd_conn_fail_cb func)
15672 conn_fail_list = g_slist_remove(conn_fail_list, func);
15675 static void connect_failed_callback(uint16_t index, uint16_t length,
15676 const void *param, void *user_data)
15678 const struct mgmt_ev_connect_failed *ev = param;
15679 struct btd_adapter *adapter = user_data;
15680 struct btd_device *device;
15683 if (length < sizeof(*ev)) {
15684 btd_error(adapter->dev_id, "Too small connect failed event");
15688 ba2str(&ev->addr.bdaddr, addr);
15690 DBG("hci%u %s status %u", index, addr, ev->status);
15692 device = btd_adapter_find_device(adapter, &ev->addr.bdaddr,
15695 conn_fail_notify(device, ev->status);
15697 /* If the device is in a bonding process cancel any auth request
15698 * sent to the agent before proceeding, but keep the bonding
15699 * request structure. */
15700 if (device_is_bonding(device, NULL))
15701 device_cancel_authentication(device, FALSE);
15704 /* In the case of security mode 3 devices */
15705 bonding_attempt_complete(adapter, &ev->addr.bdaddr, ev->addr.type,
15708 /* If the device is scheduled to retry the bonding wait until the retry
15709 * happens. In other case, proceed with cancel the bondig.
15711 if (device && device_is_bonding(device, NULL)
15712 && !device_is_retrying(device)) {
15713 device_cancel_authentication(device, TRUE);
15714 device_bonding_failed(device, ev->status);
15717 #ifndef TIZEN_FEATURE_BLUEZ_MODIFY
15718 /* In the case the bonding was canceled or did exists, remove the device
15719 * when it is temporary. */
15720 if (device && !device_is_bonding(device, NULL)
15721 && device_is_temporary(device))
15722 btd_adapter_remove_device(adapter, device);
15726 static void remove_keys(struct btd_adapter *adapter,
15727 struct btd_device *device, uint8_t type)
15729 char device_addr[18];
15730 char filename[PATH_MAX];
15731 GKeyFile *key_file;
15732 GError *gerr = NULL;
15736 ba2str(device_get_address(device), device_addr);
15738 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
15739 if (device_get_rpa_exist(device) == true)
15740 ba2str(device_get_rpa(device), device_addr);
15743 create_filename(filename, PATH_MAX, "/%s/%s/info",
15744 btd_adapter_get_storage_dir(adapter), device_addr);
15746 key_file = g_key_file_new();
15747 if (!g_key_file_load_from_file(key_file, filename, 0, &gerr)) {
15748 error("Unable to load key file from %s: (%s)", filename,
15750 g_clear_error(&gerr);
15753 if (type == BDADDR_BREDR) {
15754 g_key_file_remove_group(key_file, "LinkKey", NULL);
15756 g_key_file_remove_group(key_file, "LongTermKey", NULL);
15757 g_key_file_remove_group(key_file, "LocalSignatureKey", NULL);
15758 g_key_file_remove_group(key_file, "RemoteSignatureKey", NULL);
15759 g_key_file_remove_group(key_file, "IdentityResolvingKey", NULL);
15762 str = g_key_file_to_data(key_file, &length, NULL);
15763 if (!g_file_set_contents(filename, str, length, &gerr)) {
15764 error("Unable set contents for %s: (%s)", filename,
15766 g_error_free(gerr);
15770 g_key_file_free(key_file);
15773 static void unpaired_callback(uint16_t index, uint16_t length,
15774 const void *param, void *user_data)
15776 const struct mgmt_ev_device_unpaired *ev = param;
15777 struct btd_adapter *adapter = user_data;
15778 struct btd_device *device;
15781 if (length < sizeof(*ev)) {
15782 btd_error(adapter->dev_id, "Too small device unpaired event");
15786 ba2str(&ev->addr.bdaddr, addr);
15788 DBG("hci%u addr %s", index, addr);
15790 device = btd_adapter_find_device(adapter, &ev->addr.bdaddr,
15793 btd_warn(adapter->dev_id,
15794 "No device object for unpaired device %s", addr);
15798 remove_keys(adapter, device, ev->addr.type);
15799 device_set_unpaired(device, ev->addr.type);
15802 static void clear_devices_complete(uint8_t status, uint16_t length,
15803 const void *param, void *user_data)
15805 if (status != MGMT_STATUS_SUCCESS) {
15806 error("Failed to clear devices: %s (0x%02x)",
15807 mgmt_errstr(status), status);
15812 static int clear_devices(struct btd_adapter *adapter)
15814 struct mgmt_cp_remove_device cp;
15816 if (!btd_has_kernel_features(KERNEL_CONN_CONTROL))
15819 memset(&cp, 0, sizeof(cp));
15821 DBG("sending clear devices command for index %u", adapter->dev_id);
15823 if (mgmt_send(adapter->mgmt, MGMT_OP_REMOVE_DEVICE,
15824 adapter->dev_id, sizeof(cp), &cp,
15825 clear_devices_complete, adapter, NULL) > 0)
15828 btd_error(adapter->dev_id, "Failed to clear devices for index %u",
15834 static bool get_static_addr(struct btd_adapter *adapter)
15836 struct bt_crypto *crypto;
15838 GError *gerr = NULL;
15839 char filename[PATH_MAX];
15846 snprintf(mfg, sizeof(mfg), "0x%04x", adapter->manufacturer);
15848 create_filename(filename, PATH_MAX, "/addresses");
15850 file = g_key_file_new();
15851 if (!g_key_file_load_from_file(file, filename, 0, &gerr)) {
15852 error("Unable to load key file from %s: (%s)",
15853 filename, gerr->message);
15854 g_clear_error(&gerr);
15856 addrs = g_key_file_get_string_list(file, "Static", mfg, &len, NULL);
15858 for (i = 0; i < len; i++) {
15861 str2ba(addrs[i], &addr);
15862 if (adapter_find(&addr))
15865 /* Usable address found in list */
15866 bacpy(&adapter->bdaddr, &addr);
15867 adapter->bdaddr_type = BDADDR_LE_RANDOM;
15873 addrs = g_renew(char *, addrs, len + 1);
15876 addrs = g_new(char *, len + 1);
15879 /* Initialize slot for new address */
15880 addrs[len - 1] = g_malloc(18);
15883 crypto = bt_crypto_new();
15885 error("Failed to open crypto");
15890 ret = bt_crypto_random_bytes(crypto, &adapter->bdaddr,
15891 sizeof(adapter->bdaddr));
15893 error("Failed to generate static address");
15894 bt_crypto_unref(crypto);
15898 bt_crypto_unref(crypto);
15900 adapter->bdaddr.b[5] |= 0xc0;
15901 adapter->bdaddr_type = BDADDR_LE_RANDOM;
15903 ba2str(&adapter->bdaddr, addrs[len - 1]);
15905 g_key_file_set_string_list(file, "Static", mfg,
15906 (const char **)addrs, len);
15908 str = g_key_file_to_data(file, &len, NULL);
15909 if (!g_file_set_contents(filename, str, len, &gerr)) {
15910 error("Unable set contents for %s: (%s)",
15911 filename, gerr->message);
15912 g_error_free(gerr);
15919 g_key_file_free(file);
15925 static bool set_static_addr(struct btd_adapter *adapter)
15927 struct mgmt_cp_set_static_address cp;
15929 /* dual-mode adapters must have a public address */
15930 if (adapter->supported_settings & MGMT_SETTING_BREDR)
15933 if (!(adapter->supported_settings & MGMT_SETTING_LE))
15936 DBG("Setting static address");
15938 if (!get_static_addr(adapter))
15941 bacpy(&cp.bdaddr, &adapter->bdaddr);
15942 if (mgmt_send(adapter->mgmt, MGMT_OP_SET_STATIC_ADDRESS,
15943 adapter->dev_id, sizeof(cp), &cp,
15944 NULL, NULL, NULL) > 0) {
15951 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
15952 static uint8_t *generate_irk(void)
15957 DBG("Generate IRK");
15959 fd = open("/dev/urandom", O_RDONLY);
15963 irk = g_malloc0(MGMT_IRK_SIZE);
15964 if (read(fd, irk, MGMT_IRK_SIZE) != MGMT_IRK_SIZE) {
15965 error("Cannot read random bytes");
15975 #define LOCAL_IRK_DIRNAME "/csa/bluetooth"
15976 #define LOCAL_IRK_FILENAME ".local_irk"
15978 static bool store_local_irk(struct btd_adapter *adapter)
15983 if (adapter->local_irk == NULL) {
15984 error("Local IRK is not proper");
15988 if (access(LOCAL_IRK_DIRNAME, F_OK) < 0) {
15989 if (mkdir(LOCAL_IRK_DIRNAME, 0755) < 0) {
15990 error("Cannot create a directory for local IRK : %s",
15996 fd = open(LOCAL_IRK_DIRNAME"/"LOCAL_IRK_FILENAME,
15997 O_WRONLY | O_CREAT | O_TRUNC, 0644);
15999 error("Cannot open a file for local IRK : %s", strerror(errno));
16003 ret = write(fd, adapter->local_irk, MGMT_IRK_SIZE);
16004 if (ret != MGMT_IRK_SIZE) {
16005 error("Cannot write local IRK [%d] : %s", ret, strerror(errno));
16008 unlink(LOCAL_IRK_DIRNAME"/"LOCAL_IRK_FILENAME);
16012 ret = fdatasync(fd);
16014 error("sync failed : %s", strerror(errno));
16020 static bool load_local_irk(struct btd_adapter *adapter)
16025 if (access(LOCAL_IRK_DIRNAME"/"LOCAL_IRK_FILENAME, F_OK) < 0) {
16026 adapter->local_irk = generate_irk();
16027 if (store_local_irk(adapter) == false) {
16028 error("Cannot store Local IRK");
16029 g_free(adapter->local_irk);
16036 if (adapter->local_irk) {
16037 DBG("Local IRK is already loaded");
16041 fd = open(LOCAL_IRK_DIRNAME"/"LOCAL_IRK_FILENAME, O_RDONLY);
16043 error("Cannot open local IRK file : %s", strerror(errno));
16047 adapter->local_irk = g_malloc0(MGMT_IRK_SIZE);
16049 ret = read(fd, adapter->local_irk, MGMT_IRK_SIZE);
16050 if (ret != MGMT_IRK_SIZE) {
16051 error("Cannot read local IRK [%d] : %s", ret, strerror(errno));
16052 g_free(adapter->local_irk);
16061 static void set_privacy_complete(uint8_t status, uint16_t length,
16062 const void *param, void *user_data)
16064 struct btd_adapter *adapter = user_data;
16066 if (status != MGMT_STATUS_SUCCESS)
16067 error("Setting privacy failed for hci%u: %s (0x%02x)",
16068 adapter->dev_id, mgmt_errstr(status), status);
16070 DBG("Privacy feature is set/unset successfully for hci%u",
16074 static bool set_privacy(struct btd_adapter *adapter, bool privacy)
16076 struct mgmt_cp_set_privacy cp;
16078 if (!adapter->local_irk) {
16079 error("Local IRK is not available");
16083 memset(&cp, 0, sizeof(cp));
16084 memcpy(cp.irk, adapter->local_irk, MGMT_IRK_SIZE);
16089 if (mgmt_send(adapter->mgmt, MGMT_OP_SET_PRIVACY,
16090 adapter->dev_id, sizeof(cp), &cp,
16091 set_privacy_complete, adapter, NULL) > 0)
16094 error("Failed to set privacy and load local irk for index %u",
16099 static void set_irk_complete(uint8_t status, uint16_t length,
16100 const void *param, void *user_data)
16102 struct btd_adapter *adapter = user_data;
16104 if (status != MGMT_STATUS_SUCCESS)
16105 error("Setting IRK is failed for hci%u: %s (0x%02x)",
16106 adapter->dev_id, mgmt_errstr(status), status);
16108 DBG("Setting IRK is succeed for hci%u", adapter->dev_id);
16111 static bool set_local_irk(struct btd_adapter *adapter)
16113 struct mgmt_cp_set_irk cp;
16115 if (!adapter->local_irk) {
16116 error("Local IRK is not available");
16120 memcpy(cp.irk, adapter->local_irk, MGMT_IRK_SIZE);
16122 if (mgmt_send(adapter->mgmt, MGMT_OP_SET_IRK,
16123 adapter->dev_id, sizeof(cp), &cp,
16124 set_irk_complete, adapter, NULL) > 0)
16127 error("Failed to set irk %u", adapter->dev_id);
16131 int btd_adapter_connect_ipsp(struct btd_adapter *adapter,
16132 const bdaddr_t *bdaddr,
16133 uint8_t bdaddr_type)
16136 struct mgmt_cp_connect_6lowpan cp;
16138 memset(&cp, 0, sizeof(cp));
16139 bacpy(&cp.addr.bdaddr, bdaddr);
16140 cp.addr.type = bdaddr_type;
16142 if (mgmt_send(adapter->mgmt, MGMT_OP_CONNECT_6LOWPAN,
16143 adapter->dev_id, sizeof(cp), &cp,
16144 NULL, NULL, NULL) > 0)
16150 int btd_adapter_disconnect_ipsp(struct btd_adapter *adapter,
16151 const bdaddr_t *bdaddr,
16152 uint8_t bdaddr_type)
16155 struct mgmt_cp_disconnect_6lowpan cp;
16157 memset(&cp, 0, sizeof(cp));
16158 bacpy(&cp.addr.bdaddr, bdaddr);
16159 cp.addr.type = bdaddr_type;
16161 if (mgmt_send(adapter->mgmt, MGMT_OP_DISCONNECT_6LOWPAN,
16162 adapter->dev_id, sizeof(cp), &cp,
16163 NULL, NULL, NULL) > 0)
16169 uint8_t btd_adapter_get_rpa_res_support_value(
16170 struct btd_adapter *adapter)
16172 return adapter->central_rpa_res_support;
16175 static void set_dev_rpa_res_support_complete(uint8_t status,
16176 uint16_t length, const void *param,
16179 if (status != MGMT_STATUS_SUCCESS)
16180 error("Failed to set RPA resolution support of device : %s (0x%02x)",
16181 mgmt_errstr(status), status);
16183 DBG("Set RPA resolution support successful");
16186 int btd_adapter_set_dev_rpa_res_support(struct btd_adapter *adapter,
16187 struct btd_device *device)
16190 struct mgmt_cp_set_dev_rpa_res_support cp;
16192 DBG("btd_adapter_set_dev_rpa_res_support called");
16194 memset(&cp, 0, sizeof(cp));
16196 bacpy(&cp.addr.bdaddr, device_get_address(device));
16197 cp.addr.type = btd_device_get_bdaddr_type(device);
16198 cp.res_support = device_get_rpa_res_char_value(device);
16200 if (mgmt_send(adapter->mgmt, MGMT_OP_SET_DEV_RPA_RES_SUPPORT,
16201 adapter->dev_id, sizeof(cp), &cp,
16202 set_dev_rpa_res_support_complete, NULL, NULL) > 0)
16209 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
16210 static gboolean adapter_start_idle_cb(gpointer user_data)
16212 struct btd_adapter *adapter = (struct btd_adapter*)user_data;
16214 adapter_start(adapter);
16220 static void set_blocked_keys_complete(uint8_t status, uint16_t length,
16221 const void *param, void *user_data)
16223 struct btd_adapter *adapter = user_data;
16225 if (status != MGMT_STATUS_SUCCESS) {
16226 btd_error(adapter->dev_id,
16227 "Failed to set blocked keys: %s (0x%02x)",
16228 mgmt_errstr(status), status);
16232 DBG("Successfully set blocked keys for index %u", adapter->dev_id);
16235 static bool set_blocked_keys(struct btd_adapter *adapter)
16237 uint8_t buffer[sizeof(struct mgmt_cp_set_blocked_keys) +
16238 sizeof(blocked_keys)] = { 0 };
16239 struct mgmt_cp_set_blocked_keys *cp =
16240 (struct mgmt_cp_set_blocked_keys *)buffer;
16243 cp->key_count = ARRAY_SIZE(blocked_keys);
16244 for (i = 0; i < cp->key_count; ++i) {
16245 cp->keys[i].type = blocked_keys[i].type;
16246 memcpy(cp->keys[i].val, blocked_keys[i].val,
16247 sizeof(cp->keys[i].val));
16250 return mgmt_send(mgmt_primary, MGMT_OP_SET_BLOCKED_KEYS,
16252 sizeof(buffer), buffer,
16253 set_blocked_keys_complete,
16257 #define EXP_FEAT(_flag, _uuid, _func) \
16264 static void exp_complete(void *user_data);
16266 static bool exp_mgmt_send(struct btd_adapter *adapter, uint16_t opcode,
16267 uint16_t index, uint16_t length, const void *param,
16268 mgmt_request_func_t callback)
16270 struct exp_pending *pending;
16272 pending = g_new0(struct exp_pending, 1);
16273 pending->adapter = adapter;
16275 if (!queue_push_tail(adapter->exp_pending, pending)) {
16280 pending->id = mgmt_send(adapter->mgmt, opcode, index, length, param,
16281 callback, pending, exp_complete);
16282 if (!pending->id) {
16283 queue_remove(adapter->exp_pending, pending);
16291 static void set_exp_debug_complete(uint8_t status, uint16_t len,
16292 const void *param, void *user_data)
16294 struct exp_pending *pending = user_data;
16295 struct btd_adapter *adapter = pending->adapter;
16299 error("Set Experimental Debug failed with status 0x%02x (%s)",
16300 status, mgmt_errstr(status));
16304 action = btd_kernel_experimental_enabled(debug_uuid.str);
16306 DBG("Experimental Debug successfully %s", action ? "set" : "reset");
16309 queue_push_tail(adapter->exps, (void *)debug_uuid.val);
16312 static void exp_debug_func(struct btd_adapter *adapter, uint8_t action)
16314 struct mgmt_cp_set_exp_feature cp;
16316 memset(&cp, 0, sizeof(cp));
16317 memcpy(cp.uuid, debug_uuid.val, 16);
16318 cp.action = action;
16320 if (exp_mgmt_send(adapter, MGMT_OP_SET_EXP_FEATURE,
16321 adapter->dev_id, sizeof(cp), &cp,
16322 set_exp_debug_complete))
16325 btd_error(adapter->dev_id, "Failed to set exp debug");
16328 static void le_simult_central_peripheral_func(struct btd_adapter *adapter,
16332 queue_push_tail(adapter->exps,
16333 (void *)le_simult_central_peripheral_uuid.val);
16336 static void quality_report_func(struct btd_adapter *adapter, uint8_t action)
16339 queue_push_tail(adapter->exps, (void *)quality_report_uuid.val);
16342 static void set_rpa_resolution_complete(uint8_t status, uint16_t len,
16343 const void *param, void *user_data)
16345 struct exp_pending *pending = user_data;
16346 struct btd_adapter *adapter = pending->adapter;
16350 error("Set RPA Resolution failed with status 0x%02x (%s)",
16351 status, mgmt_errstr(status));
16355 action = btd_kernel_experimental_enabled(rpa_resolution_uuid.str);
16357 DBG("RPA Resolution successfully %s", action ? "set" : "reset");
16360 queue_push_tail(adapter->exps, (void *)rpa_resolution_uuid.val);
16363 static void rpa_resolution_func(struct btd_adapter *adapter, uint8_t action)
16365 struct mgmt_cp_set_exp_feature cp;
16367 memset(&cp, 0, sizeof(cp));
16368 memcpy(cp.uuid, rpa_resolution_uuid.val, 16);
16369 cp.action = action;
16371 if (exp_mgmt_send(adapter, MGMT_OP_SET_EXP_FEATURE,
16372 adapter->dev_id, sizeof(cp), &cp,
16373 set_rpa_resolution_complete))
16376 btd_error(adapter->dev_id, "Failed to set RPA Resolution");
16379 static void codec_offload_complete(uint8_t status, uint16_t len,
16380 const void *param, void *user_data)
16382 struct exp_pending *pending = user_data;
16383 struct btd_adapter *adapter = pending->adapter;
16387 error("Set Codec Offload failed with status 0x%02x (%s)",
16388 status, mgmt_errstr(status));
16392 action = btd_kernel_experimental_enabled(codec_offload_uuid.str);
16394 DBG("Codec Offload successfully %s", action ? "set" : "reset");
16397 queue_push_tail(adapter->exps, (void *)codec_offload_uuid.val);
16400 static void codec_offload_func(struct btd_adapter *adapter, uint8_t action)
16402 struct mgmt_cp_set_exp_feature cp;
16404 memset(&cp, 0, sizeof(cp));
16405 memcpy(cp.uuid, codec_offload_uuid.val, 16);
16406 cp.action = action;
16408 if (exp_mgmt_send(adapter, MGMT_OP_SET_EXP_FEATURE,
16409 adapter->dev_id, sizeof(cp), &cp,
16410 codec_offload_complete))
16413 btd_error(adapter->dev_id, "Failed to set Codec Offload");
16416 static void iso_socket_complete(uint8_t status, uint16_t len,
16417 const void *param, void *user_data)
16419 struct exp_pending *pending = user_data;
16420 struct btd_adapter *adapter = pending->adapter;
16424 error("Set ISO Socket failed with status 0x%02x (%s)",
16425 status, mgmt_errstr(status));
16429 action = btd_kernel_experimental_enabled(iso_socket_uuid.str);
16431 DBG("ISO Socket successfully %s", action ? "set" : "reset");
16434 queue_push_tail(adapter->exps, (void *)iso_socket_uuid.val);
16437 static void iso_socket_func(struct btd_adapter *adapter, uint8_t action)
16439 struct mgmt_cp_set_exp_feature cp;
16441 memset(&cp, 0, sizeof(cp));
16442 memcpy(cp.uuid, iso_socket_uuid.val, 16);
16443 cp.action = action;
16445 if (exp_mgmt_send(adapter, MGMT_OP_SET_EXP_FEATURE,
16446 MGMT_INDEX_NONE, sizeof(cp), &cp,
16447 iso_socket_complete))
16450 btd_error(adapter->dev_id, "Failed to set ISO Socket");
16453 static const struct exp_feat {
16455 const struct mgmt_exp_uuid *uuid;
16456 void (*func)(struct btd_adapter *adapter, uint8_t action);
16458 EXP_FEAT(EXP_FEAT_DEBUG, &debug_uuid, exp_debug_func),
16459 EXP_FEAT(EXP_FEAT_LE_SIMULT_ROLES, &le_simult_central_peripheral_uuid,
16460 le_simult_central_peripheral_func),
16461 EXP_FEAT(EXP_FEAT_BQR, &quality_report_uuid, quality_report_func),
16462 EXP_FEAT(EXP_FEAT_RPA_RESOLUTION, &rpa_resolution_uuid,
16463 rpa_resolution_func),
16464 EXP_FEAT(EXP_FEAT_CODEC_OFFLOAD, &codec_offload_uuid,
16465 codec_offload_func),
16466 EXP_FEAT(EXP_FEAT_ISO_SOCKET, &iso_socket_uuid, iso_socket_func),
16469 static void read_exp_features_complete(uint8_t status, uint16_t length,
16470 const void *param, void *user_data)
16472 struct exp_pending *pending = user_data;
16473 struct btd_adapter *adapter = pending->adapter;
16474 const struct mgmt_rp_read_exp_features_info *rp = param;
16475 size_t feature_count = 0;
16478 DBG("index %u status 0x%02x", adapter->dev_id, status);
16480 if (status != MGMT_STATUS_SUCCESS) {
16481 btd_error(adapter->dev_id,
16482 "Failed to read exp features info: %s (0x%02x)",
16483 mgmt_errstr(status), status);
16487 if (length < sizeof(*rp)) {
16488 btd_error(adapter->dev_id, "Response too small");
16492 feature_count = le16_to_cpu(rp->feature_count);
16494 if (length < sizeof(*rp) + (sizeof(*rp->features) * feature_count)) {
16495 btd_error(adapter->dev_id, "Response too small");
16499 for (i = 0; i < feature_count; ++i) {
16501 for (j = 0; j < ARRAY_SIZE(exp_table); j++) {
16502 const struct exp_feat *feat = &exp_table[j];
16506 if (memcmp(rp->features[i].uuid, feat->uuid->val,
16507 sizeof(rp->features[i].uuid)))
16510 str = feat->uuid->str;
16511 action = btd_kernel_experimental_enabled(str);
16513 DBG("%s flags %u action %u", str,
16514 rp->features[i].flags, action);
16516 /* If already set don't attempt to set it again */
16517 if (action == (rp->features[i].flags & BIT(0))) {
16518 if (action & BIT(0))
16519 queue_push_tail(adapter->exps,
16520 (void *)feat->uuid->val);
16525 feat->func(adapter, action);
16530 static void read_exp_features(struct btd_adapter *adapter)
16532 if (exp_mgmt_send(adapter, MGMT_OP_READ_EXP_FEATURES_INFO,
16533 adapter->dev_id, 0, NULL, read_exp_features_complete))
16536 btd_error(adapter->dev_id, "Failed to read exp features info");
16539 static void read_info_complete(uint8_t status, uint16_t length,
16540 const void *param, void *user_data)
16542 struct btd_adapter *adapter = user_data;
16543 const struct mgmt_rp_read_info *rp = param;
16544 uint32_t missing_settings;
16547 DBG("index %u status 0x%02x", adapter->dev_id, status);
16549 if (status != MGMT_STATUS_SUCCESS) {
16550 btd_error(adapter->dev_id,
16551 "Failed to read info for index %u: %s (0x%02x)",
16552 adapter->dev_id, mgmt_errstr(status), status);
16556 if (length < sizeof(*rp)) {
16557 btd_error(adapter->dev_id,
16558 "Too small read info complete response");
16563 * Store controller information for class of device, device
16564 * name, short name and settings.
16566 * During the lifetime of the controller these will be updated by
16567 * events and the information is required to keep the current
16568 * state of the controller.
16570 adapter->dev_class = rp->dev_class[0] | (rp->dev_class[1] << 8) |
16571 (rp->dev_class[2] << 16);
16572 adapter->name = g_strdup((const char *) rp->name);
16573 adapter->short_name = g_strdup((const char *) rp->short_name);
16575 adapter->manufacturer = btohs(rp->manufacturer);
16577 adapter->supported_settings = btohl(rp->supported_settings);
16578 adapter->current_settings = btohl(rp->current_settings);
16580 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
16581 adapter_check_version(adapter, rp->version);
16583 clear_uuids(adapter);
16584 clear_devices(adapter);
16586 if (bacmp(&rp->bdaddr, BDADDR_ANY) == 0) {
16587 if (!set_static_addr(adapter)) {
16588 btd_error(adapter->dev_id,
16589 "No Bluetooth address for index %u",
16594 struct btd_adapter *tmp;
16596 tmp = adapter_find(&rp->bdaddr);
16598 btd_error(adapter->dev_id,
16599 "Bluetooth address for index %u match index %u",
16600 adapter->dev_id, tmp->dev_id);
16604 bacpy(&adapter->bdaddr, &rp->bdaddr);
16605 if (!(adapter->supported_settings & MGMT_SETTING_LE))
16606 adapter->bdaddr_type = BDADDR_BREDR;
16608 adapter->bdaddr_type = BDADDR_LE_PUBLIC;
16611 missing_settings = adapter->current_settings ^
16612 adapter->supported_settings;
16614 /* If adapter supports PHY CONFIGURATION SETTING, then read PHY configuration and save them */
16615 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
16616 if (adapter->supported_settings & MGMT_SETTING_PHY_CONFIGURATION) {
16617 if (mgmt_send(adapter->mgmt, MGMT_OP_GET_PHY_CONFIGURATION, adapter->dev_id, 0, NULL,
16618 get_phy_configuration_resp, adapter, NULL) == 0)
16619 error("Unable to send %s cmd",
16620 mgmt_opstr(MGMT_OP_GET_PHY_CONFIGURATION));
16623 switch (btd_opts.mode) {
16625 if (missing_settings & MGMT_SETTING_SSP) {
16626 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
16627 if (btd_opts.pin_code || (btd_opts.class & 0x1f00) >> 8 == 0x05)
16628 set_mode(adapter, MGMT_OP_SET_SSP, 0x00);
16631 set_mode(adapter, MGMT_OP_SET_SSP, 0x01);
16633 if (missing_settings & MGMT_SETTING_LE)
16634 set_mode(adapter, MGMT_OP_SET_LE, 0x01);
16635 if (missing_settings & MGMT_SETTING_BREDR)
16636 set_mode(adapter, MGMT_OP_SET_BREDR, 0x01);
16638 case BT_MODE_BREDR:
16639 if (!(adapter->supported_settings & MGMT_SETTING_BREDR)) {
16640 btd_error(adapter->dev_id,
16641 "Ignoring adapter withouth BR/EDR support");
16645 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
16646 if (btd_opts.pin_code || (btd_opts.class & 0x1f00) >> 8 == 0x05)
16647 set_mode(adapter, MGMT_OP_SET_SSP, 0x00);
16649 set_mode(adapter, MGMT_OP_SET_SSP, 0x01);
16651 if (missing_settings & MGMT_SETTING_SSP)
16652 set_mode(adapter, MGMT_OP_SET_SSP, 0x01);
16654 if (missing_settings & MGMT_SETTING_BREDR)
16655 set_mode(adapter, MGMT_OP_SET_BREDR, 0x01);
16656 if (adapter->current_settings & MGMT_SETTING_LE)
16657 set_mode(adapter, MGMT_OP_SET_LE, 0x00);
16660 if (!(adapter->supported_settings & MGMT_SETTING_LE)) {
16661 btd_error(adapter->dev_id,
16662 "Ignoring adapter withouth LE support");
16666 if (missing_settings & MGMT_SETTING_LE)
16667 set_mode(adapter, MGMT_OP_SET_LE, 0x01);
16668 if (adapter->current_settings & MGMT_SETTING_BREDR)
16669 set_mode(adapter, MGMT_OP_SET_BREDR, 0x00);
16673 if (missing_settings & MGMT_SETTING_SECURE_CONN)
16674 set_mode(adapter, MGMT_OP_SET_SECURE_CONN,
16675 btd_opts.secure_conn);
16677 if (adapter->supported_settings & MGMT_SETTING_PRIVACY)
16678 set_privacy(adapter, btd_opts.privacy);
16680 if (btd_opts.fast_conn &&
16681 (missing_settings & MGMT_SETTING_FAST_CONNECTABLE))
16682 set_mode(adapter, MGMT_OP_SET_FAST_CONNECTABLE, 0x01);
16684 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
16685 /* Set the RPA resolution value to '1' if privacy is supported */
16686 if (btd_opts.le_privacy &&
16687 adapter->supported_settings & MGMT_SETTING_PRIVACY)
16688 adapter->central_rpa_res_support = 0x01;
16691 err = adapter_register(adapter);
16693 btd_error(adapter->dev_id, "Unable to register new adapter");
16698 * Register all event notification handlers for controller.
16700 * The handlers are registered after a succcesful read of the
16701 * controller info. From now on they can track updates and
16704 mgmt_register(adapter->mgmt, MGMT_EV_NEW_SETTINGS, adapter->dev_id,
16705 new_settings_callback, adapter, NULL);
16707 mgmt_register(adapter->mgmt, MGMT_EV_CLASS_OF_DEV_CHANGED,
16709 dev_class_changed_callback,
16711 mgmt_register(adapter->mgmt, MGMT_EV_LOCAL_NAME_CHANGED,
16713 local_name_changed_callback,
16716 mgmt_register(adapter->mgmt, MGMT_EV_DISCOVERING,
16718 discovering_callback,
16721 mgmt_register(adapter->mgmt, MGMT_EV_DEVICE_FOUND,
16723 device_found_callback,
16726 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
16727 mgmt_register(adapter->mgmt, MGMT_EV_LE_DEVICE_FOUND,
16729 le_device_found_callback,
16733 mgmt_register(adapter->mgmt, MGMT_EV_DEVICE_DISCONNECTED,
16735 disconnected_callback,
16738 mgmt_register(adapter->mgmt, MGMT_EV_DEVICE_CONNECTED,
16740 connected_callback,
16743 mgmt_register(adapter->mgmt, MGMT_EV_CONNECT_FAILED,
16745 connect_failed_callback,
16748 mgmt_register(adapter->mgmt, MGMT_EV_DEVICE_UNPAIRED,
16753 mgmt_register(adapter->mgmt, MGMT_EV_AUTH_FAILED,
16755 auth_failed_callback,
16758 mgmt_register(adapter->mgmt, MGMT_EV_NEW_LINK_KEY,
16760 new_link_key_callback,
16763 mgmt_register(adapter->mgmt, MGMT_EV_NEW_LONG_TERM_KEY,
16765 new_long_term_key_callback,
16768 mgmt_register(adapter->mgmt, MGMT_EV_NEW_CSRK,
16773 mgmt_register(adapter->mgmt, MGMT_EV_NEW_IRK,
16778 mgmt_register(adapter->mgmt, MGMT_EV_NEW_CONN_PARAM,
16783 mgmt_register(adapter->mgmt, MGMT_EV_DEVICE_BLOCKED,
16785 device_blocked_callback,
16787 mgmt_register(adapter->mgmt, MGMT_EV_DEVICE_UNBLOCKED,
16789 device_unblocked_callback,
16792 mgmt_register(adapter->mgmt, MGMT_EV_PIN_CODE_REQUEST,
16794 pin_code_request_callback,
16797 mgmt_register(adapter->mgmt, MGMT_EV_USER_CONFIRM_REQUEST,
16799 user_confirm_request_callback,
16802 mgmt_register(adapter->mgmt, MGMT_EV_USER_PASSKEY_REQUEST,
16804 user_passkey_request_callback,
16807 mgmt_register(adapter->mgmt, MGMT_EV_PASSKEY_NOTIFY,
16809 user_passkey_notify_callback,
16812 mgmt_register(adapter->mgmt, MGMT_EV_CONTROLLER_RESUME,
16814 controller_resume_callback,
16817 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
16818 mgmt_register(adapter->mgmt, MGMT_EV_RSSI_ALERT,
16820 rssi_alert_callback,
16823 mgmt_register(adapter->mgmt, MGMT_EV_RAW_RSSI,
16825 get_raw_rssi_callback,
16828 mgmt_register(adapter->mgmt, MGMT_EV_RSSI_ENABLED,
16830 rssi_enabled_callback,
16833 mgmt_register(adapter->mgmt, MGMT_EV_RSSI_DISABLED,
16835 rssi_disabled_callback,
16838 mgmt_register(adapter->mgmt, MGMT_EV_HARDWARE_ERROR,
16840 hardware_error_callback,
16843 mgmt_register(adapter->mgmt, MGMT_EV_TX_TIMEOUT_ERROR,
16845 tx_timeout_error_callback,
16848 mgmt_register(adapter->mgmt, MGMT_EV_DEVICE_NAME_UPDATE,
16850 device_name_update_callback,
16853 mgmt_register(adapter->mgmt, MGMT_EV_MULTI_ADV_STATE_CHANGED,
16855 multi_adv_state_change_callback,
16858 mgmt_register(adapter->mgmt, MGMT_EV_6LOWPAN_CONN_STATE_CHANGED,
16860 bt_6lowpan_conn_state_change_callback,
16863 mgmt_register(adapter->mgmt, MGMT_EV_LE_DATA_LENGTH_CHANGED,
16865 bt_le_data_length_changed_callback,
16868 mgmt_register(adapter->mgmt, MGMT_EV_CONN_UPDATED,
16870 le_conn_update_completed_callback,
16873 mgmt_register(adapter->mgmt, MGMT_EV_RPA_CHANGED,
16875 rpa_changed_callback,
16879 set_dev_class(adapter);
16881 set_name(adapter, btd_adapter_get_name(adapter));
16883 if (btd_has_kernel_features(KERNEL_BLOCKED_KEYS_SUPPORTED) &&
16884 !set_blocked_keys(adapter)) {
16885 btd_error(adapter->dev_id,
16886 "Failed to set blocked keys for index %u",
16891 if (btd_opts.pairable &&
16892 !(adapter->current_settings & MGMT_SETTING_BONDABLE))
16893 set_mode(adapter, MGMT_OP_SET_BONDABLE, 0x01);
16895 if (!btd_has_kernel_features(KERNEL_CONN_CONTROL))
16896 set_mode(adapter, MGMT_OP_SET_CONNECTABLE, 0x01);
16897 else if (adapter->current_settings & MGMT_SETTING_CONNECTABLE)
16898 set_mode(adapter, MGMT_OP_SET_CONNECTABLE, 0x00);
16900 if (adapter->stored_discoverable && !adapter->discoverable_timeout)
16901 set_discoverable(adapter, 0x01, 0);
16903 if (btd_adapter_get_powered(adapter))
16904 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
16905 g_idle_add(adapter_start_idle_cb, adapter);
16907 adapter_start(adapter);
16909 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
16911 set_mode(adapter, MGMT_OP_SET_POWERED, 0x01);
16914 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
16915 init_le_static_address(adapter);
16922 * Remove adapter from list in case of a failure.
16924 * Leaving an adapter structure around for a controller that can
16925 * not be initilized makes no sense at the moment.
16927 * This is a simplification to avoid constant checks if the
16928 * adapter is ready to do anything.
16930 adapter_list = g_list_remove(adapter_list, adapter);
16932 btd_adapter_unref(adapter);
16935 static void reset_adv_monitors_complete(uint8_t status, uint16_t length,
16936 const void *param, void *user_data)
16938 const struct mgmt_rp_remove_adv_monitor *rp = param;
16940 if (status != MGMT_STATUS_SUCCESS) {
16941 error("Failed to reset Adv Monitors: %s (0x%02x)",
16942 mgmt_errstr(status), status);
16946 if (length < sizeof(*rp)) {
16947 error("Wrong size of remove Adv Monitor response for reset "
16948 "all Adv Monitors");
16952 DBG("Removed all Adv Monitors");
16955 static void reset_adv_monitors(uint16_t index)
16957 struct mgmt_cp_remove_adv_monitor cp;
16959 DBG("sending remove Adv Monitor command with handle 0");
16961 /* Handle 0 indicates to remove all */
16962 cp.monitor_handle = 0;
16963 if (mgmt_send(mgmt_primary, MGMT_OP_REMOVE_ADV_MONITOR, index,
16964 sizeof(cp), &cp, reset_adv_monitors_complete, NULL,
16969 error("Failed to reset Adv Monitors");
16972 static void read_info(struct btd_adapter *adapter)
16974 DBG("sending read info command for index %u", adapter->dev_id);
16976 if (mgmt_send(mgmt_primary, MGMT_OP_READ_INFO, adapter->dev_id, 0, NULL,
16977 read_info_complete, adapter, NULL) > 0)
16980 btd_error(adapter->dev_id,
16981 "Failed to read controller info for index %u",
16984 adapter_list = g_list_remove(adapter_list, adapter);
16986 btd_adapter_unref(adapter);
16989 static void exp_complete(void *user_data)
16991 struct exp_pending *pending = user_data;
16992 struct btd_adapter *adapter = pending->adapter;
16995 return; /* canceled */
16997 queue_remove(adapter->exp_pending, pending);
17000 if (queue_isempty(adapter->exp_pending)) {
17001 read_info(adapter);
17005 DBG("index %u has %u pending MGMT EXP requests", adapter->dev_id,
17006 queue_length(adapter->exp_pending));
17009 static void index_added(uint16_t index, uint16_t length, const void *param,
17012 struct btd_adapter *adapter;
17014 DBG("index %u", index);
17016 adapter = btd_adapter_lookup(index);
17018 btd_warn(adapter->dev_id,
17019 "Ignoring index added for an already existing adapter");
17023 /* Check if at maximum adapters allowed in the system then ignore the
17026 if (btd_opts.max_adapters &&
17027 btd_opts.max_adapters == g_slist_length(adapters))
17030 reset_adv_monitors(index);
17032 adapter = btd_adapter_new(index);
17035 "Unable to create new adapter for index %u", index);
17039 if (btd_has_kernel_features(KERNEL_EXP_FEATURES))
17040 read_exp_features(adapter);
17043 * Protect against potential two executions of read controller info.
17045 * In case the start of the daemon and the action of adding a new
17046 * controller coincide this function might be called twice.
17048 * To avoid the double execution of reading the controller info,
17049 * add the adapter already to the list. If an adapter is already
17050 * present, the second notification will cause a warning. If the
17051 * command fails the adapter is removed from the list again.
17053 adapter_list = g_list_append(adapter_list, adapter);
17055 if (queue_isempty(adapter->exp_pending))
17056 read_info(adapter);
17059 static void index_removed(uint16_t index, uint16_t length, const void *param,
17062 struct btd_adapter *adapter;
17064 DBG("index %u", index);
17066 adapter = btd_adapter_lookup(index);
17068 warn("Ignoring index removal for a non-existent adapter");
17072 adapter_unregister(adapter);
17075 static void read_index_list_complete(uint8_t status, uint16_t length,
17076 const void *param, void *user_data)
17078 const struct mgmt_rp_read_index_list *rp = param;
17082 if (status != MGMT_STATUS_SUCCESS) {
17083 error("Failed to read index list: %s (0x%02x)",
17084 mgmt_errstr(status), status);
17088 if (length < sizeof(*rp)) {
17089 error("Wrong size of read index list response");
17093 num = btohs(rp->num_controllers);
17095 DBG("Number of controllers: %d", num);
17097 if (num * sizeof(uint16_t) + sizeof(*rp) != length) {
17098 error("Incorrect packet size for index list response");
17102 for (i = 0; i < num; i++) {
17105 index = btohs(rp->index[i]);
17107 DBG("Found index %u", index);
17110 * Pretend to be index added event notification.
17112 * It is safe to just trigger the procedure for index
17113 * added notification. It does check against itself.
17115 index_added(index, 0, NULL, NULL);
17119 static void read_commands_complete(uint8_t status, uint16_t length,
17120 const void *param, void *user_data)
17122 const struct mgmt_rp_read_commands *rp = param;
17123 uint16_t num_commands, num_events;
17124 size_t expected_len;
17127 if (status != MGMT_STATUS_SUCCESS) {
17128 error("Failed to read supported commands: %s (0x%02x)",
17129 mgmt_errstr(status), status);
17133 if (length < sizeof(*rp)) {
17134 error("Wrong size of read commands response");
17138 num_commands = btohs(rp->num_commands);
17139 num_events = btohs(rp->num_events);
17141 DBG("Number of commands: %d", num_commands);
17142 DBG("Number of events: %d", num_events);
17144 expected_len = sizeof(*rp) + num_commands * sizeof(uint16_t) +
17145 num_events * sizeof(uint16_t);
17147 if (length < expected_len) {
17148 error("Too small reply for supported commands: (%u != %zu)",
17149 length, expected_len);
17153 for (i = 0; i < num_commands; i++) {
17154 uint16_t op = get_le16(rp->opcodes + i);
17157 case MGMT_OP_ADD_DEVICE:
17158 DBG("enabling kernel-side connection control");
17159 kernel_features |= KERNEL_CONN_CONTROL;
17161 case MGMT_OP_SET_BLOCKED_KEYS:
17162 DBG("kernel supports the set_blocked_keys op");
17163 kernel_features |= KERNEL_BLOCKED_KEYS_SUPPORTED;
17165 case MGMT_OP_SET_DEF_SYSTEM_CONFIG:
17166 DBG("kernel supports set system confic");
17167 kernel_features |= KERNEL_SET_SYSTEM_CONFIG;
17169 case MGMT_OP_READ_EXP_FEATURES_INFO:
17170 DBG("kernel supports exp features");
17171 kernel_features |= KERNEL_EXP_FEATURES;
17173 case MGMT_OP_ADD_EXT_ADV_PARAMS:
17174 DBG("kernel supports ext adv commands");
17175 kernel_features |= KERNEL_HAS_EXT_ADV_ADD_CMDS;
17177 case MGMT_OP_READ_CONTROLLER_CAP:
17178 DBG("kernel supports controller cap command");
17179 kernel_features |= KERNEL_HAS_CONTROLLER_CAP_CMD;
17186 for (i = 0; i < num_events; i++) {
17187 uint16_t ev = get_le16(rp->opcodes + num_commands + i);
17190 case MGMT_EV_CONTROLLER_RESUME:
17191 DBG("kernel supports suspend/resume events");
17192 kernel_features |= KERNEL_HAS_RESUME_EVT;
17198 static void read_version_complete(uint8_t status, uint16_t length,
17199 const void *param, void *user_data)
17201 const struct mgmt_rp_read_version *rp = param;
17203 if (status != MGMT_STATUS_SUCCESS) {
17204 error("Failed to read version information: %s (0x%02x)",
17205 mgmt_errstr(status), status);
17209 if (length < sizeof(*rp)) {
17210 error("Wrong size of read version response");
17214 mgmt_version = rp->version;
17215 mgmt_revision = btohs(rp->revision);
17217 info("Bluetooth management interface %u.%u initialized",
17218 mgmt_version, mgmt_revision);
17220 if (mgmt_version < 1) {
17221 error("Version 1.0 or later of management interface required");
17225 DBG("sending read supported commands command");
17228 * It is irrelevant if this command succeeds or fails. In case of
17229 * failure safe settings are assumed.
17231 mgmt_send(mgmt_primary, MGMT_OP_READ_COMMANDS,
17232 MGMT_INDEX_NONE, 0, NULL,
17233 read_commands_complete, NULL, NULL);
17235 mgmt_register(mgmt_primary, MGMT_EV_INDEX_ADDED, MGMT_INDEX_NONE,
17236 index_added, NULL, NULL);
17237 mgmt_register(mgmt_primary, MGMT_EV_INDEX_REMOVED, MGMT_INDEX_NONE,
17238 index_removed, NULL, NULL);
17240 DBG("sending read index list command");
17242 if (mgmt_send(mgmt_primary, MGMT_OP_READ_INDEX_LIST,
17243 MGMT_INDEX_NONE, 0, NULL,
17244 read_index_list_complete, NULL, NULL) > 0)
17247 error("Failed to read controller index list");
17250 static void mgmt_debug(const char *str, void *user_data)
17252 DBG_IDX(0xffff, "%s", str);
17255 int adapter_init(void)
17257 dbus_conn = btd_get_dbus_connection();
17259 mgmt_primary = mgmt_new_default();
17260 if (!mgmt_primary) {
17261 error("Failed to access management interface");
17265 mgmt_set_debug(mgmt_primary, mgmt_debug, NULL, NULL);
17267 DBG("sending read version command");
17269 if (mgmt_send(mgmt_primary, MGMT_OP_READ_VERSION,
17270 MGMT_INDEX_NONE, 0, NULL,
17271 read_version_complete, NULL, NULL) > 0)
17274 error("Failed to read management version information");
17279 void adapter_cleanup(void)
17281 g_list_free(adapter_list);
17284 struct btd_adapter *adapter = adapters->data;
17286 adapter_remove(adapter);
17287 adapters = g_slist_remove(adapters, adapter);
17288 btd_adapter_unref(adapter);
17292 * In case there is another reference active, clear out
17293 * registered handlers for index added and index removed.
17295 * This is just an extra precaution to be safe, and in
17296 * reality should not make a difference.
17298 mgmt_unregister_index(mgmt_primary, MGMT_INDEX_NONE);
17301 * In case there is another reference active, cancel
17302 * all pending global commands.
17304 * This is just an extra precaution to avoid callbacks
17305 * that potentially then could leak memory or access
17306 * an invalid structure.
17308 mgmt_cancel_index(mgmt_primary, MGMT_INDEX_NONE);
17310 mgmt_unref(mgmt_primary);
17311 mgmt_primary = NULL;
17316 void adapter_shutdown(void)
17322 powering_down = true;
17324 for (list = g_list_first(adapter_list); list;
17325 list = g_list_next(list)) {
17326 struct btd_adapter *adapter = list->data;
17328 if (!(adapter->current_settings & MGMT_SETTING_POWERED))
17331 clear_discoverable(adapter);
17332 remove_temporary_devices(adapter);
17333 set_mode(adapter, MGMT_OP_SET_POWERED, 0x00);
17335 adapter_remaining++;
17338 if (!adapter_remaining)
17343 * Check if workaround for broken ATT server socket behavior is needed
17344 * where we need to connect an ATT client socket before pairing to get
17345 * early access to the ATT channel.
17347 bool btd_le_connect_before_pairing(void)
17349 if (MGMT_VERSION(mgmt_version, mgmt_revision) < MGMT_VERSION(1, 4))
17355 bool btd_adapter_has_settings(struct btd_adapter *adapter, uint32_t settings)
17360 return (adapter->current_settings & settings) ? true : false;
17363 bool btd_has_kernel_features(uint32_t features)
17365 return !!(kernel_features & features);
17368 bool btd_adapter_has_exp_feature(struct btd_adapter *adapter, uint32_t feature)
17372 for (i = 0; i < ARRAY_SIZE(exp_table); i++) {
17373 const struct exp_feat *feat = &exp_table[i];
17375 if ((feat->flag & feature) && queue_find(adapter->exps, NULL,
17383 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
17384 int btd_adapter_set_streaming_mode(struct btd_adapter *adapter,
17385 const bdaddr_t *bdaddr, gboolean enable)
17387 struct mgmt_cp_set_streaming_mode cp;
17390 ba2str(bdaddr, addr);
17391 DBG("hci%u device %s", adapter->dev_id, addr);
17393 memset(&cp, 0, sizeof(cp));
17395 cp.streaming_mode = enable ? 1 : 0;
17396 bacpy(&cp.bdaddr, bdaddr);
17398 if (mgmt_send(adapter->mgmt, MGMT_OP_SET_STREAMING_MODE,
17399 adapter->dev_id, sizeof(cp), &cp,
17400 NULL, NULL, NULL) > 0)
17406 void adapter_send_event(const char *event)
17408 struct btd_adapter *adapter = btd_adapter_get_default();
17409 if (adapter == NULL) {
17410 error("adapter is NULL");
17414 g_dbus_emit_signal(dbus_conn, adapter->path,
17415 ADAPTER_INTERFACE, event,
17416 DBUS_TYPE_INVALID);